From 53426e4c5a89a9beb9d4c4142044f908436df222 Mon Sep 17 00:00:00 2001 From: Shuyou Date: Tue, 14 Jan 2025 16:57:03 +0800 Subject: [PATCH] feat: add languages --- .../v2.5.x/site/ar/about/comparison.json | 1 + .../v2.5.x/site/ar/about/comparison.md | 159 ++ .../v2.5.x/site/ar/about/limitations.json | 1 + .../v2.5.x/site/ar/about/limitations.md | 260 ++ .../v2.5.x/site/ar/about/milvus_adopters.json | 1 + .../v2.5.x/site/ar/about/milvus_adopters.md | 27 + .../v2.5.x/site/ar/about/overview.json | 1 + localization/v2.5.x/site/ar/about/overview.md | 178 ++ .../v2.5.x/site/ar/about/roadmap.json | 1 + localization/v2.5.x/site/ar/about/roadmap.md | 109 + .../v2.5.x/site/ar/adminGuide/allocate.json | 1 + .../v2.5.x/site/ar/adminGuide/allocate.md | 141 ++ .../site/ar/adminGuide/authenticate.json | 1 + .../v2.5.x/site/ar/adminGuide/authenticate.md | 277 +++ .../site/ar/adminGuide/chunk_cache.json | 1 + .../v2.5.x/site/ar/adminGuide/chunk_cache.md | 77 + .../site/ar/adminGuide/clouds/aws/aws.json | 1 + .../site/ar/adminGuide/clouds/aws/aws.md | 494 ++++ .../ar/adminGuide/clouds/aws/aws_layer7.json | 1 + .../ar/adminGuide/clouds/aws/aws_layer7.md | 109 + .../site/ar/adminGuide/clouds/aws/eks.json | 1 + .../site/ar/adminGuide/clouds/aws/eks.md | 518 ++++ .../site/ar/adminGuide/clouds/aws/s3.json | 1 + .../site/ar/adminGuide/clouds/aws/s3.md | 341 +++ .../site/ar/adminGuide/clouds/azure/abs.json | 1 + .../site/ar/adminGuide/clouds/azure/abs.md | 149 ++ .../ar/adminGuide/clouds/azure/azure.json | 1 + .../site/ar/adminGuide/clouds/azure/azure.md | 299 +++ .../ar/adminGuide/clouds/azure/ingress.json | 1 + .../ar/adminGuide/clouds/azure/ingress.md | 235 ++ .../site/ar/adminGuide/clouds/gcp/gcp.json | 1 + .../site/ar/adminGuide/clouds/gcp/gcp.md | 287 +++ .../ar/adminGuide/clouds/gcp/gcp_layer7.json | 1 + .../ar/adminGuide/clouds/gcp/gcp_layer7.md | 215 ++ .../site/ar/adminGuide/clouds/gcp/gcs.json | 1 + .../site/ar/adminGuide/clouds/gcp/gcs.md | 151 ++ .../clouds/openshift/openshift.json | 1 + .../adminGuide/clouds/openshift/openshift.md | 183 ++ .../ar/adminGuide/config_jaeger_tracing.json | 1 + .../ar/adminGuide/config_jaeger_tracing.md | 146 ++ .../site/ar/adminGuide/configure-docker.json | 1 + .../site/ar/adminGuide/configure-docker.md | 296 +++ .../site/ar/adminGuide/configure-helm.json | 1 + .../site/ar/adminGuide/configure-helm.md | 250 ++ .../configure-querynode-localdisk.json | 1 + .../configure-querynode-localdisk.md | 282 +++ .../ar/adminGuide/configure_access_logs.json | 1 + .../ar/adminGuide/configure_access_logs.md | 175 ++ .../ar/adminGuide/configure_operator.json | 1 + .../site/ar/adminGuide/configure_operator.md | 336 +++ .../site/ar/adminGuide/connect_kafka_ssl.json | 1 + .../site/ar/adminGuide/connect_kafka_ssl.md | 619 +++++ .../site/ar/adminGuide/deploy_etcd.json | 1 + .../v2.5.x/site/ar/adminGuide/deploy_etcd.md | 136 + .../site/ar/adminGuide/deploy_pulsar.json | 1 + .../site/ar/adminGuide/deploy_pulsar.md | 240 ++ .../v2.5.x/site/ar/adminGuide/deploy_s3.json | 1 + .../v2.5.x/site/ar/adminGuide/deploy_s3.md | 132 + .../site/ar/adminGuide/drop_users_roles.json | 1 + .../site/ar/adminGuide/drop_users_roles.md | 204 ++ .../site/ar/adminGuide/dynamic_config.json | 1 + .../site/ar/adminGuide/dynamic_config.md | 208 ++ .../site/ar/adminGuide/grant_privileges.json | 1 + .../site/ar/adminGuide/grant_privileges.md | 542 ++++ .../site/ar/adminGuide/grant_roles.json | 1 + .../v2.5.x/site/ar/adminGuide/grant_roles.md | 203 ++ .../adminGuide/limit_collection_counts.json | 1 + .../ar/adminGuide/limit_collection_counts.md | 72 + .../adminGuide/message_storage_operator.json | 1 + .../ar/adminGuide/message_storage_operator.md | 348 +++ .../ar/adminGuide/meta_storage_operator.json | 1 + .../ar/adminGuide/meta_storage_operator.md | 117 + .../site/ar/adminGuide/monitor/alert.json | 1 + .../site/ar/adminGuide/monitor/alert.md | 132 + .../monitor/configure_grafana_loki.json | 1 + .../monitor/configure_grafana_loki.md | 174 ++ .../adminGuide/monitor/metrics_dashboard.json | 1 + .../adminGuide/monitor/metrics_dashboard.md | 196 ++ .../site/ar/adminGuide/monitor/monitor.json | 1 + .../site/ar/adminGuide/monitor/monitor.md | 136 + .../adminGuide/monitor/monitor_overview.json | 1 + .../ar/adminGuide/monitor/monitor_overview.md | 113 + .../site/ar/adminGuide/monitor/visualize.json | 1 + .../site/ar/adminGuide/monitor/visualize.md | 100 + .../adminGuide/object_storage_operator.json | 1 + .../ar/adminGuide/object_storage_operator.md | 230 ++ .../site/ar/adminGuide/privilege_group.json | 1 + .../site/ar/adminGuide/privilege_group.md | 489 ++++ .../v2.5.x/site/ar/adminGuide/rbac.json | 1 + .../v2.5.x/site/ar/adminGuide/rbac.md | 78 + .../site/ar/adminGuide/resource_group.json | 1 + .../site/ar/adminGuide/resource_group.md | 353 +++ .../ar/adminGuide/scale-dependencies.json | 1 + .../site/ar/adminGuide/scale-dependencies.md | 252 ++ .../v2.5.x/site/ar/adminGuide/scaleout.json | 1 + .../v2.5.x/site/ar/adminGuide/scaleout.md | 183 ++ .../v2.5.x/site/ar/adminGuide/tls.json | 1 + localization/v2.5.x/site/ar/adminGuide/tls.md | 449 ++++ .../site/ar/adminGuide/upgrade-pulsar-v3.json | 1 + .../site/ar/adminGuide/upgrade-pulsar-v3.md | 427 ++++ .../upgrade_milvus_cluster-docker.json | 1 + .../upgrade_milvus_cluster-docker.md | 154 ++ .../upgrade_milvus_cluster-helm.json | 1 + .../adminGuide/upgrade_milvus_cluster-helm.md | 281 +++ .../upgrade_milvus_cluster-operator.json | 1 + .../upgrade_milvus_cluster-operator.md | 179 ++ .../upgrade_milvus_standalone-docker.json | 1 + .../upgrade_milvus_standalone-docker.md | 132 + .../upgrade_milvus_standalone-helm.json | 1 + .../upgrade_milvus_standalone-helm.md | 259 ++ .../upgrade_milvus_standalone-operator.json | 1 + .../upgrade_milvus_standalone-operator.md | 181 ++ .../site/ar/adminGuide/use-pulsar-v2.json | 1 + .../site/ar/adminGuide/use-pulsar-v2.md | 139 ++ .../site/ar/adminGuide/users_and_roles.json | 1 + .../site/ar/adminGuide/users_and_roles.md | 260 ++ .../site/ar/embeddings/embed-with-bgm-m3.json | 1 + .../site/ar/embeddings/embed-with-bgm-m3.md | 91 + .../site/ar/embeddings/embed-with-bm25.json | 1 + .../site/ar/embeddings/embed-with-bm25.md | 112 + .../site/ar/embeddings/embed-with-cohere.json | 1 + .../site/ar/embeddings/embed-with-cohere.md | 106 + .../ar/embeddings/embed-with-instructor.json | 1 + .../ar/embeddings/embed-with-instructor.md | 92 + .../site/ar/embeddings/embed-with-jina.json | 1 + .../site/ar/embeddings/embed-with-jina.md | 130 + .../site/ar/embeddings/embed-with-mgte.json | 1 + .../site/ar/embeddings/embed-with-mgte.md | 90 + .../ar/embeddings/embed-with-mistral-ai.json | 1 + .../ar/embeddings/embed-with-mistral-ai.md | 80 + .../site/ar/embeddings/embed-with-nomic.json | 1 + .../site/ar/embeddings/embed-with-nomic.md | 89 + .../site/ar/embeddings/embed-with-openai.json | 1 + .../site/ar/embeddings/embed-with-openai.md | 89 + .../embed-with-sentence-transform.json | 1 + .../embed-with-sentence-transform.md | 88 + .../site/ar/embeddings/embed-with-splade.json | 1 + .../site/ar/embeddings/embed-with-splade.md | 89 + .../site/ar/embeddings/embed-with-voyage.json | 1 + .../site/ar/embeddings/embed-with-voyage.md | 77 + .../v2.5.x/site/ar/embeddings/embeddings.json | 1 + .../v2.5.x/site/ar/embeddings/embeddings.md | 143 ++ .../v2.5.x/site/ar/faq/operational_faq.json | 1 + .../v2.5.x/site/ar/faq/operational_faq.md | 107 + .../v2.5.x/site/ar/faq/performance_faq.json | 1 + .../v2.5.x/site/ar/faq/performance_faq.md | 51 + .../v2.5.x/site/ar/faq/product_faq.json | 1 + .../v2.5.x/site/ar/faq/product_faq.md | 102 + .../v2.5.x/site/ar/faq/troubleshooting.json | 1 + .../v2.5.x/site/ar/faq/troubleshooting.md | 112 + .../site/ar/getstarted/install-overview.json | 1 + .../site/ar/getstarted/install-overview.md | 139 ++ .../getstarted/install_SDKs/install-go.json | 1 + .../ar/getstarted/install_SDKs/install-go.md | 83 + .../getstarted/install_SDKs/install-java.json | 1 + .../getstarted/install_SDKs/install-java.md | 100 + .../getstarted/install_SDKs/install-node.json | 1 + .../getstarted/install_SDKs/install-node.md | 118 + .../install_SDKs/install-pymilvus.json | 1 + .../install_SDKs/install-pymilvus.md | 109 + .../site/ar/getstarted/milvus_lite.json | 1 + .../v2.5.x/site/ar/getstarted/milvus_lite.md | 412 ++++ .../v2.5.x/site/ar/getstarted/quickstart.json | 1 + .../v2.5.x/site/ar/getstarted/quickstart.md | 408 +++ .../install_standalone-docker-compose.json | 1 + .../install_standalone-docker-compose.md | 155 ++ .../install_standalone-docker.json | 1 + .../install_standalone-docker.md | 142 ++ .../install_standalone-windows.json | 1 + .../install_standalone-windows.md | 301 +++ .../prerequisite-docker.json | 1 + .../run-milvus-docker/prerequisite-docker.md | 111 + .../install_cluster-helm-gpu.json | 1 + .../install_cluster-helm-gpu.md | 378 +++ ...install_standalone-docker-compose-gpu.json | 1 + .../install_standalone-docker-compose-gpu.md | 224 ++ .../run-milvus-gpu/prerequisite-gpu.json | 1 + .../run-milvus-gpu/prerequisite-gpu.md | 149 ++ .../run-milvus-k8s/install_cluster-helm.json | 1 + .../run-milvus-k8s/install_cluster-helm.md | 335 +++ .../install_cluster-milvusoperator.json | 1 + .../install_cluster-milvusoperator.md | 392 +++ .../run-milvus-k8s/prerequisite-helm.json | 1 + .../run-milvus-k8s/prerequisite-helm.md | 148 ++ localization/v2.5.x/site/ar/home/home.json | 1 + localization/v2.5.x/site/ar/home/home.md | 122 + .../integrations/RAG_with_pii_and_milvus.json | 1 + .../integrations/RAG_with_pii_and_milvus.md | 242 ++ .../ar/integrations/apify_milvus_rag.json | 1 + .../site/ar/integrations/apify_milvus_rag.md | 267 ++ .../build_RAG_with_milvus_and_cognee.json | 1 + .../build_RAG_with_milvus_and_cognee.md | 159 ++ .../build_RAG_with_milvus_and_deepseek.json | 1 + .../build_RAG_with_milvus_and_deepseek.md | 247 ++ .../build_RAG_with_milvus_and_fireworks.json | 1 + .../build_RAG_with_milvus_and_fireworks.md | 248 ++ .../build_RAG_with_milvus_and_gemini.json | 1 + .../build_RAG_with_milvus_and_gemini.md | 246 ++ .../build_RAG_with_milvus_and_lepton.json | 1 + .../build_RAG_with_milvus_and_lepton.md | 243 ++ .../build_RAG_with_milvus_and_ollama.json | 1 + .../build_RAG_with_milvus_and_ollama.md | 281 +++ ...build_RAG_with_milvus_and_siliconflow.json | 1 + .../build_RAG_with_milvus_and_siliconflow.md | 244 ++ .../ar/integrations/build_rag_on_arm.json | 1 + .../site/ar/integrations/build_rag_on_arm.md | 302 +++ .../ar/integrations/dify_with_milvus.json | 1 + .../site/ar/integrations/dify_with_milvus.md | 111 + .../evaluation_with_deepeval.json | 1 + .../integrations/evaluation_with_deepeval.md | 434 ++++ .../integrations/evaluation_with_phoenix.json | 1 + .../integrations/evaluation_with_phoenix.md | 474 ++++ .../integrations/integrate_with_airbyte.json | 1 + .../ar/integrations/integrate_with_airbyte.md | 247 ++ .../integrations/integrate_with_bentoml.json | 1 + .../ar/integrations/integrate_with_bentoml.md | 351 +++ .../ar/integrations/integrate_with_camel.json | 1 + .../ar/integrations/integrate_with_camel.md | 474 ++++ .../integrations/integrate_with_cohere.json | 1 + .../ar/integrations/integrate_with_cohere.md | 319 +++ .../ar/integrations/integrate_with_dspy.json | 1 + .../ar/integrations/integrate_with_dspy.md | 278 +++ .../integrations/integrate_with_fastgpt.json | 1 + .../ar/integrations/integrate_with_fastgpt.md | 145 ++ .../integrations/integrate_with_haystack.json | 1 + .../integrations/integrate_with_haystack.md | 256 ++ .../integrate_with_hugging-face.json | 1 + .../integrate_with_hugging-face.md | 245 ++ .../ar/integrations/integrate_with_jina.json | 1 + .../ar/integrations/integrate_with_jina.md | 307 +++ .../integrations/integrate_with_langfuse.json | 1 + .../integrations/integrate_with_langfuse.md | 179 ++ .../integrate_with_llamaindex.json | 1 + .../integrations/integrate_with_llamaindex.md | 203 ++ .../integrations/integrate_with_memgpt.json | 1 + .../ar/integrations/integrate_with_memgpt.md | 144 ++ .../integrations/integrate_with_openai.json | 1 + .../ar/integrations/integrate_with_openai.md | 157 ++ .../integrations/integrate_with_pytorch.json | 1 + .../ar/integrations/integrate_with_pytorch.md | 297 +++ .../ar/integrations/integrate_with_ragas.json | 1 + .../ar/integrations/integrate_with_ragas.md | 359 +++ .../integrate_with_sentencetransformers.json | 1 + .../integrate_with_sentencetransformers.md | 224 ++ .../integrations/integrate_with_snowpark.json | 1 + .../integrations/integrate_with_snowpark.md | 320 +++ .../ar/integrations/integrate_with_spark.json | 1 + .../ar/integrations/integrate_with_spark.md | 505 ++++ .../ar/integrations/integrate_with_vanna.json | 1 + .../ar/integrations/integrate_with_vanna.md | 369 +++ .../integrations/integrate_with_voxel51.json | 1 + .../ar/integrations/integrate_with_voxel51.md | 337 +++ .../integrations/integrate_with_voyageai.json | 1 + .../integrations/integrate_with_voyageai.md | 136 + .../integrations/integrate_with_whyhow.json | 1 + .../ar/integrations/integrate_with_whyhow.md | 218 ++ .../integrations/integrations_overview.json | 1 + .../ar/integrations/integrations_overview.md | 80 + .../ar/integrations/kafka-connect-milvus.json | 1 + .../ar/integrations/kafka-connect-milvus.md | 181 ++ .../knowledge_table_with_milvus.json | 1 + .../knowledge_table_with_milvus.md | 145 ++ .../ar/integrations/kotaemon_with_milvus.json | 1 + .../ar/integrations/kotaemon_with_milvus.md | 99 + .../langchain/basic_usage_langchain.json | 1 + .../langchain/basic_usage_langchain.md | 319 +++ .../langchain/integrate_with_langchain.json | 1 + .../langchain/integrate_with_langchain.md | 283 +++ .../milvus_hybrid_search_retriever.json | 1 + .../milvus_hybrid_search_retriever.md | 308 +++ .../integrations/llama_agents_metadata.json | 1 + .../ar/integrations/llama_agents_metadata.md | 783 ++++++ .../integrations/milvus_rag_with_dynamiq.json | 1 + .../integrations/milvus_rag_with_dynamiq.md | 338 +++ .../ar/integrations/milvus_rag_with_vllm.json | 1 + .../ar/integrations/milvus_rag_with_vllm.md | 385 +++ .../quickstart_mem0_with_milvus.json | 1 + .../quickstart_mem0_with_milvus.md | 217 ++ .../ar/integrations/rag_with_langflow.json | 1 + .../site/ar/integrations/rag_with_langflow.md | 84 + .../rag_with_milvus_and_unstructured.json | 1 + .../rag_with_milvus_and_unstructured.md | 289 +++ .../integrations/use_milvus_in_docsgpt.json | 1 + .../ar/integrations/use_milvus_in_docsgpt.md | 142 ++ .../use_milvus_in_private_gpt.json | 1 + .../integrations/use_milvus_in_private_gpt.md | 170 ++ .../use_milvus_with_sambanova.json | 1 + .../integrations/use_milvus_with_sambanova.md | 135 + ...deo_search_with_twelvelabs_and_milvus.json | 1 + ...video_search_with_twelvelabs_and_milvus.md | 462 ++++ .../v2.5.x/site/ar/menuStructure/ar.json | 2196 +++++++++++++++++ localization/v2.5.x/site/ar/migrate/es2m.json | 1 + localization/v2.5.x/site/ar/migrate/es2m.md | 267 ++ localization/v2.5.x/site/ar/migrate/f2m.json | 1 + localization/v2.5.x/site/ar/migrate/f2m.md | 209 ++ .../v2.5.x/site/ar/migrate/from-m2x.json | 1 + .../v2.5.x/site/ar/migrate/from-m2x.md | 220 ++ localization/v2.5.x/site/ar/migrate/m2m.json | 1 + localization/v2.5.x/site/ar/migrate/m2m.md | 242 ++ .../site/ar/migrate/migrate_overview.json | 1 + .../site/ar/migrate/migrate_overview.md | 120 + .../site/ar/migrate/milvusdm_install.json | 1 + .../site/ar/migrate/milvusdm_install.md | 91 + .../architecture/architecture_overview.json | 1 + .../architecture/architecture_overview.md | 54 + .../architecture/data_processing.json | 1 + .../reference/architecture/data_processing.md | 124 + .../reference/architecture/four_layers.json | 1 + .../ar/reference/architecture/four_layers.md | 123 + .../architecture/main_components.json | 1 + .../reference/architecture/main_components.md | 98 + .../v2.5.x/site/ar/reference/benchmark.json | 1 + .../v2.5.x/site/ar/reference/benchmark.md | 279 +++ .../v2.5.x/site/ar/reference/bitset.json | 1 + .../v2.5.x/site/ar/reference/bitset.md | 130 + .../site/ar/reference/coordinator_ha.json | 1 + .../site/ar/reference/coordinator_ha.md | 193 ++ .../v2.5.x/site/ar/reference/disk_index.json | 1 + .../v2.5.x/site/ar/reference/disk_index.md | 159 ++ .../v2.5.x/site/ar/reference/glossary.json | 1 + .../v2.5.x/site/ar/reference/glossary.md | 806 ++++++ .../v2.5.x/site/ar/reference/gpu_index.json | 1 + .../v2.5.x/site/ar/reference/gpu_index.md | 239 ++ .../v2.5.x/site/ar/reference/index.json | 1 + .../v2.5.x/site/ar/reference/index.md | 679 +++++ .../v2.5.x/site/ar/reference/knowhere.json | 1 + .../v2.5.x/site/ar/reference/knowhere.md | 179 ++ .../site/ar/reference/multi_tenancy.json | 1 + .../v2.5.x/site/ar/reference/multi_tenancy.md | 106 + .../v2.5.x/site/ar/reference/replica.json | 1 + .../v2.5.x/site/ar/reference/replica.md | 91 + .../site/ar/reference/scalar_index.json | 1 + .../v2.5.x/site/ar/reference/scalar_index.md | 165 ++ .../v2.5.x/site/ar/reference/schema.json | 1 + .../v2.5.x/site/ar/reference/schema.md | 252 ++ .../sys_config/configure_common.json | 1 + .../reference/sys_config/configure_common.md | 812 ++++++ .../sys_config/configure_datacoord.json | 1 + .../sys_config/configure_datacoord.md | 2009 +++++++++++++++ .../sys_config/configure_datanode.json | 1 + .../sys_config/configure_datanode.md | 1015 ++++++++ .../reference/sys_config/configure_etcd.json | 1 + .../ar/reference/sys_config/configure_etcd.md | 538 ++++ .../reference/sys_config/configure_gpu.json | 1 + .../ar/reference/sys_config/configure_gpu.md | 87 + .../reference/sys_config/configure_grpc.json | 1 + .../ar/reference/sys_config/configure_grpc.md | 50 + .../sys_config/configure_indexcoord.json | 1 + .../sys_config/configure_indexcoord.md | 50 + .../sys_config/configure_indexnode.json | 1 + .../sys_config/configure_indexnode.md | 224 ++ .../sys_config/configure_localstorage.json | 1 + .../sys_config/configure_localstorage.md | 53 + .../reference/sys_config/configure_log.json | 1 + .../ar/reference/sys_config/configure_log.md | 231 ++ .../sys_config/configure_metastore.json | 1 + .../sys_config/configure_metastore.md | 50 + .../reference/sys_config/configure_minio.json | 1 + .../reference/sys_config/configure_minio.md | 528 ++++ .../ar/reference/sys_config/configure_mq.json | 1 + .../ar/reference/sys_config/configure_mq.md | 262 ++ .../sys_config/configure_msgchannel.json | 1 + .../sys_config/configure_msgchannel.md | 316 +++ .../sys_config/configure_natsmq.json | 1 + .../reference/sys_config/configure_natsmq.md | 429 ++++ .../reference/sys_config/configure_proxy.json | 1 + .../reference/sys_config/configure_proxy.md | 1155 +++++++++ .../sys_config/configure_pulsar.json | 1 + .../reference/sys_config/configure_pulsar.md | 264 ++ .../sys_config/configure_querycoord.json | 1 + .../sys_config/configure_querycoord.md | 1300 ++++++++++ .../sys_config/configure_querynode.json | 1 + .../sys_config/configure_querynode.md | 1261 ++++++++++ .../sys_config/configure_quotaandlimits.json | 1 + .../sys_config/configure_quotaandlimits.md | 2137 ++++++++++++++++ .../sys_config/configure_rocksmq.json | 1 + .../reference/sys_config/configure_rocksmq.md | 247 ++ .../sys_config/configure_rootcoord.json | 1 + .../sys_config/configure_rootcoord.md | 375 +++ .../reference/sys_config/configure_tikv.json | 1 + .../ar/reference/sys_config/configure_tikv.md | 314 +++ .../reference/sys_config/configure_tls.json | 1 + .../ar/reference/sys_config/configure_tls.md | 22 + .../reference/sys_config/configure_trace.json | 1 + .../reference/sys_config/configure_trace.md | 200 ++ .../sys_config/system_configuration.json | 1 + .../sys_config/system_configuration.md | 129 + .../v2.5.x/site/ar/reference/time_sync.json | 1 + .../v2.5.x/site/ar/reference/time_sync.md | 161 ++ .../v2.5.x/site/ar/reference/timestamp.json | 1 + .../v2.5.x/site/ar/reference/timestamp.md | 109 + .../v2.5.x/site/ar/release_notes.json | 1 + localization/v2.5.x/site/ar/release_notes.md | 210 ++ .../site/ar/rerankers/rerankers-bge.json | 1 + .../v2.5.x/site/ar/rerankers/rerankers-bge.md | 78 + .../site/ar/rerankers/rerankers-cohere.json | 1 + .../site/ar/rerankers/rerankers-cohere.md | 78 + .../ar/rerankers/rerankers-cross-encoder.json | 1 + .../ar/rerankers/rerankers-cross-encoder.md | 79 + .../site/ar/rerankers/rerankers-jina.json | 1 + .../site/ar/rerankers/rerankers-jina.md | 77 + .../site/ar/rerankers/rerankers-overview.json | 1 + .../site/ar/rerankers/rerankers-overview.md | 210 ++ .../site/ar/rerankers/rerankers-voyage.json | 1 + .../site/ar/rerankers/rerankers-voyage.md | 78 + .../ar/tutorials/audio_similarity_search.json | 1 + .../ar/tutorials/audio_similarity_search.md | 36 + .../ar/tutorials/build-rag-with-milvus.json | 1 + .../ar/tutorials/build-rag-with-milvus.md | 250 ++ .../contextual_retrieval_with_milvus.json | 1 + .../contextual_retrieval_with_milvus.md | 619 +++++ .../dna_sequence_classification.json | 1 + .../tutorials/dna_sequence_classification.md | 36 + .../full_text_search_with_milvus.json | 1 + .../tutorials/full_text_search_with_milvus.md | 371 +++ .../funnel_search_with_matryoshka.json | 1 + .../funnel_search_with_matryoshka.md | 569 +++++ .../ar/tutorials/graph_rag_with_milvus.json | 1 + .../ar/tutorials/graph_rag_with_milvus.md | 509 ++++ .../hdbscan_clustering_with_milvus.json | 1 + .../hdbscan_clustering_with_milvus.md | 275 +++ .../ar/tutorials/how_to_enhance_your_rag.json | 1 + .../ar/tutorials/how_to_enhance_your_rag.md | 295 +++ .../tutorials/hybrid_search_with_milvus.json | 1 + .../ar/tutorials/hybrid_search_with_milvus.md | 313 +++ .../tutorials/image_deduplication_system.json | 1 + .../tutorials/image_deduplication_system.md | 35 + .../ar/tutorials/image_similarity_search.json | 1 + .../ar/tutorials/image_similarity_search.md | 263 ++ .../movie_recommendation_with_milvus.json | 1 + .../movie_recommendation_with_milvus.md | 298 +++ .../tutorials/multimodal_rag_with_milvus.json | 1 + .../tutorials/multimodal_rag_with_milvus.md | 424 ++++ .../tutorials/question_answering_system.json | 1 + .../ar/tutorials/question_answering_system.md | 44 + .../ar/tutorials/quickstart_with_attu.json | 1 + .../site/ar/tutorials/quickstart_with_attu.md | 241 ++ .../ar/tutorials/recommendation_system.json | 1 + .../ar/tutorials/recommendation_system.md | 36 + .../site/ar/tutorials/text_image_search.json | 1 + .../site/ar/tutorials/text_image_search.md | 39 + .../site/ar/tutorials/text_search_engine.json | 1 + .../site/ar/tutorials/text_search_engine.md | 39 + .../site/ar/tutorials/tutorials-overview.json | 1 + .../site/ar/tutorials/tutorials-overview.md | 52 + .../use-async-milvus-client-with-asyncio.json | 1 + .../use-async-milvus-client-with-asyncio.md | 416 ++++ .../ar/tutorials/use_ColPali_with_milvus.json | 1 + .../ar/tutorials/use_ColPali_with_milvus.md | 334 +++ .../ar/tutorials/vector_visualization.json | 1 + .../site/ar/tutorials/vector_visualization.md | 434 ++++ .../ar/tutorials/video_similarity_search.json | 1 + .../ar/tutorials/video_similarity_search.md | 40 + .../create-collection-instantly.json | 1 + .../create-collection-instantly.md | 341 +++ .../collections/create-collection.json | 1 + .../collections/create-collection.md | 760 ++++++ .../collections/drop-collection.json | 1 + .../userGuide/collections/drop-collection.md | 138 ++ .../collections/load-and-release.json | 1 + .../userGuide/collections/load-and-release.md | 411 +++ .../userGuide/collections/manage-aliases.json | 1 + .../userGuide/collections/manage-aliases.md | 542 ++++ .../collections/manage-collections.json | 1 + .../collections/manage-collections.md | 272 ++ .../collections/manage-partitions.json | 1 + .../collections/manage-partitions.md | 764 ++++++ .../collections/modify-collection.json | 1 + .../collections/modify-collection.md | 213 ++ .../collections/view-collections.json | 1 + .../userGuide/collections/view-collections.md | 202 ++ .../ar/userGuide/data-import/import-data.json | 1 + .../ar/userGuide/data-import/import-data.md | 401 +++ .../data-import/prepare-source-data.json | 1 + .../data-import/prepare-source-data.md | 633 +++++ .../insert-and-delete/delete-entities.json | 1 + .../insert-and-delete/delete-entities.md | 257 ++ .../insert-update-delete.json | 1 + .../insert-and-delete/insert-update-delete.md | 365 +++ .../insert-and-delete/upsert-entities.json | 1 + .../insert-and-delete/upsert-entities.md | 360 +++ .../ar/userGuide/manage-indexes/bitmap.json | 1 + .../ar/userGuide/manage-indexes/bitmap.md | 124 + .../manage-indexes/index-scalar-fields.json | 1 + .../manage-indexes/index-scalar-fields.md | 326 +++ .../manage-indexes/index-vector-fields.json | 1 + .../manage-indexes/index-vector-fields.md | 593 +++++ .../manage-indexes/index-with-gpu.json | 1 + .../manage-indexes/index-with-gpu.md | 231 ++ .../site/ar/userGuide/manage_databases.json | 1 + .../site/ar/userGuide/manage_databases.md | 597 +++++ .../schema/analyzer/analyzer-overview.json | 1 + .../schema/analyzer/analyzer-overview.md | 584 +++++ .../analyzer/analyzer/chinese-analyzer.json | 1 + .../analyzer/analyzer/chinese-analyzer.md | 50 + .../analyzer/analyzer/english-analyzer.json | 1 + .../analyzer/analyzer/english-analyzer.md | 74 + .../analyzer/analyzer/standard-analyzer.json | 1 + .../analyzer/analyzer/standard-analyzer.md | 106 + .../analyzer/filter/alphanumonly-filter.json | 1 + .../analyzer/filter/alphanumonly-filter.md | 70 + .../analyzer/filter/ascii-folding-filter.json | 1 + .../analyzer/filter/ascii-folding-filter.md | 68 + .../filter/cnalphanumonly-filter.json | 1 + .../analyzer/filter/cnalphanumonly-filter.md | 69 + .../analyzer/filter/cncharonly-filter.json | 1 + .../analyzer/filter/cncharonly-filter.md | 68 + .../analyzer/filter/decompounder-filter.json | 1 + .../analyzer/filter/decompounder-filter.md | 78 + .../schema/analyzer/filter/length-filter.json | 1 + .../schema/analyzer/filter/length-filter.md | 77 + .../analyzer/filter/lowercase-filter.json | 1 + .../analyzer/filter/lowercase-filter.md | 68 + .../analyzer/filter/stemmer-filter.json | 1 + .../schema/analyzer/filter/stemmer-filter.md | 77 + .../schema/analyzer/filter/stop-filter.json | 1 + .../schema/analyzer/filter/stop-filter.md | 78 + .../analyzer/tokenizer/jieba-tokenizer.json | 1 + .../analyzer/tokenizer/jieba-tokenizer.md | 64 + .../tokenizer/standard-tokenizer.json | 1 + .../analyzer/tokenizer/standard-tokenizer.md | 77 + .../tokenizer/whitespace-tokenizer.json | 1 + .../tokenizer/whitespace-tokenizer.md | 72 + .../ar/userGuide/schema/array_data_type.json | 1 + .../ar/userGuide/schema/array_data_type.md | 630 +++++ .../ar/userGuide/schema/binary-vector.json | 1 + .../site/ar/userGuide/schema/binary-vector.md | 444 ++++ .../ar/userGuide/schema/dense-vector.json | 1 + .../site/ar/userGuide/schema/dense-vector.md | 432 ++++ .../schema/enable-dynamic-field.json | 1 + .../userGuide/schema/enable-dynamic-field.md | 381 +++ .../schema/nullable-and-default.json | 1 + .../userGuide/schema/nullable-and-default.md | 877 +++++++ .../site/ar/userGuide/schema/number.json | 1 + .../v2.5.x/site/ar/userGuide/schema/number.md | 567 +++++ .../ar/userGuide/schema/primary-field.json | 1 + .../site/ar/userGuide/schema/primary-field.md | 195 ++ .../ar/userGuide/schema/schema-hands-on.json | 1 + .../ar/userGuide/schema/schema-hands-on.md | 270 ++ .../site/ar/userGuide/schema/schema.json | 1 + .../v2.5.x/site/ar/userGuide/schema/schema.md | 452 ++++ .../ar/userGuide/schema/sparse_vector.json | 1 + .../site/ar/userGuide/schema/sparse_vector.md | 536 ++++ .../site/ar/userGuide/schema/string.json | 1 + .../v2.5.x/site/ar/userGuide/schema/string.md | 559 +++++ .../ar/userGuide/schema/use-json-fields.json | 1 + .../ar/userGuide/schema/use-json-fields.md | 523 ++++ .../boolean/array-operators.json | 1 + .../boolean/array-operators.md | 136 + .../boolean/basic-operators.json | 1 + .../boolean/basic-operators.md | 236 ++ .../search-query-get/boolean/boolean.json | 1 + .../search-query-get/boolean/boolean.md | 145 ++ .../boolean/filtering-templating.json | 1 + .../boolean/filtering-templating.md | 154 ++ .../boolean/json-operators.json | 1 + .../boolean/json-operators.md | 120 + .../clustering-compaction.json | 1 + .../search-query-get/clustering-compaction.md | 272 ++ .../search-query-get/consistency.json | 1 + .../userGuide/search-query-get/consistency.md | 211 ++ .../search-query-get/filtered-search.json | 1 + .../search-query-get/filtered-search.md | 257 ++ .../search-query-get/full-text-search.json | 1 + .../search-query-get/full-text-search.md | 501 ++++ .../get-and-scalar-query.json | 1 + .../search-query-get/get-and-scalar-query.md | 587 +++++ .../search-query-get/grouping-search.json | 1 + .../search-query-get/grouping-search.md | 365 +++ .../search-query-get/keyword-match.json | 1 + .../search-query-get/keyword-match.md | 430 ++++ .../ar/userGuide/search-query-get/metric.json | 1 + .../ar/userGuide/search-query-get/metric.md | 251 ++ .../ar/userGuide/search-query-get/mmap.json | 1 + .../ar/userGuide/search-query-get/mmap.md | 190 ++ .../search-query-get/multi-vector-search.json | 1 + .../search-query-get/multi-vector-search.md | 681 +++++ .../search-query-get/range-search.json | 1 + .../search-query-get/range-search.md | 213 ++ .../userGuide/search-query-get/reranking.json | 1 + .../userGuide/search-query-get/reranking.md | 122 + .../single-vector-search.json | 1 + .../search-query-get/single-vector-search.md | 919 +++++++ .../search-query-get/use-partition-key.json | 1 + .../search-query-get/use-partition-key.md | 245 ++ .../search-query-get/with-iterators.json | 1 + .../search-query-get/with-iterators.md | 161 ++ .../tools/birdwatcher_install_guides.json | 1 + .../tools/birdwatcher_install_guides.md | 118 + .../userGuide/tools/birdwatcher_overview.json | 1 + .../userGuide/tools/birdwatcher_overview.md | 77 + .../tools/birdwatcher_usage_guides.json | 1 + .../tools/birdwatcher_usage_guides.md | 406 +++ .../site/ar/userGuide/tools/cli_commands.json | 1 + .../site/ar/userGuide/tools/cli_commands.md | 1530 ++++++++++++ .../site/ar/userGuide/tools/cli_overview.json | 1 + .../site/ar/userGuide/tools/cli_overview.md | 78 + .../site/ar/userGuide/tools/install_cli.json | 1 + .../site/ar/userGuide/tools/install_cli.md | 100 + .../cross-bucket-backup-and-restore.json | 1 + .../cross-bucket-backup-and-restore.md | 203 ++ .../multi-storage-backup-and-restore.json | 1 + .../multi-storage-backup-and-restore.md | 246 ++ .../shared-bucket-backup-and-restore.json | 1 + .../shared-bucket-backup-and-restore.md | 198 ++ .../single-instance-backup-and-restore.json | 1 + .../single-instance-backup-and-restore.md | 142 ++ .../milvus-backup/milvus_backup_api.json | 1 + .../tools/milvus-backup/milvus_backup_api.md | 230 ++ .../milvus-backup/milvus_backup_cli.json | 1 + .../tools/milvus-backup/milvus_backup_cli.md | 180 ++ .../milvus-backup/milvus_backup_overview.json | 1 + .../milvus-backup/milvus_backup_overview.md | 81 + .../tools/milvus-cdc/cdc-monitoring.json | 1 + .../tools/milvus-cdc/cdc-monitoring.md | 42 + .../tools/milvus-cdc/deploy-cdc-server.json | 1 + .../tools/milvus-cdc/deploy-cdc-server.md | 154 ++ .../tools/milvus-cdc/manage-cdc-tasks.json | 1 + .../tools/milvus-cdc/manage-cdc-tasks.md | 275 +++ .../tools/milvus-cdc/milvus-cdc-overview.json | 1 + .../tools/milvus-cdc/milvus-cdc-overview.md | 125 + .../site/ar/userGuide/tools/milvus-webui.json | 1 + .../site/ar/userGuide/tools/milvus-webui.md | 289 +++ .../v2.5.x/site/id/about/comparison.json | 1 + .../v2.5.x/site/id/about/comparison.md | 159 ++ .../v2.5.x/site/id/about/limitations.json | 1 + .../v2.5.x/site/id/about/limitations.md | 260 ++ .../v2.5.x/site/id/about/milvus_adopters.json | 1 + .../v2.5.x/site/id/about/milvus_adopters.md | 29 + .../v2.5.x/site/id/about/overview.json | 1 + localization/v2.5.x/site/id/about/overview.md | 179 ++ .../v2.5.x/site/id/about/roadmap.json | 1 + localization/v2.5.x/site/id/about/roadmap.md | 110 + .../v2.5.x/site/id/adminGuide/allocate.json | 1 + .../v2.5.x/site/id/adminGuide/allocate.md | 141 ++ .../site/id/adminGuide/authenticate.json | 1 + .../v2.5.x/site/id/adminGuide/authenticate.md | 277 +++ .../site/id/adminGuide/chunk_cache.json | 1 + .../v2.5.x/site/id/adminGuide/chunk_cache.md | 77 + .../site/id/adminGuide/clouds/aws/aws.json | 1 + .../site/id/adminGuide/clouds/aws/aws.md | 494 ++++ .../id/adminGuide/clouds/aws/aws_layer7.json | 1 + .../id/adminGuide/clouds/aws/aws_layer7.md | 109 + .../site/id/adminGuide/clouds/aws/eks.json | 1 + .../site/id/adminGuide/clouds/aws/eks.md | 518 ++++ .../site/id/adminGuide/clouds/aws/s3.json | 1 + .../site/id/adminGuide/clouds/aws/s3.md | 341 +++ .../site/id/adminGuide/clouds/azure/abs.json | 1 + .../site/id/adminGuide/clouds/azure/abs.md | 149 ++ .../id/adminGuide/clouds/azure/azure.json | 1 + .../site/id/adminGuide/clouds/azure/azure.md | 299 +++ .../id/adminGuide/clouds/azure/ingress.json | 1 + .../id/adminGuide/clouds/azure/ingress.md | 235 ++ .../site/id/adminGuide/clouds/gcp/gcp.json | 1 + .../site/id/adminGuide/clouds/gcp/gcp.md | 287 +++ .../id/adminGuide/clouds/gcp/gcp_layer7.json | 1 + .../id/adminGuide/clouds/gcp/gcp_layer7.md | 215 ++ .../site/id/adminGuide/clouds/gcp/gcs.json | 1 + .../site/id/adminGuide/clouds/gcp/gcs.md | 151 ++ .../clouds/openshift/openshift.json | 1 + .../adminGuide/clouds/openshift/openshift.md | 183 ++ .../id/adminGuide/config_jaeger_tracing.json | 1 + .../id/adminGuide/config_jaeger_tracing.md | 148 ++ .../site/id/adminGuide/configure-docker.json | 1 + .../site/id/adminGuide/configure-docker.md | 296 +++ .../site/id/adminGuide/configure-helm.json | 1 + .../site/id/adminGuide/configure-helm.md | 250 ++ .../configure-querynode-localdisk.json | 1 + .../configure-querynode-localdisk.md | 282 +++ .../id/adminGuide/configure_access_logs.json | 1 + .../id/adminGuide/configure_access_logs.md | 175 ++ .../id/adminGuide/configure_operator.json | 1 + .../site/id/adminGuide/configure_operator.md | 336 +++ .../site/id/adminGuide/connect_kafka_ssl.json | 1 + .../site/id/adminGuide/connect_kafka_ssl.md | 620 +++++ .../site/id/adminGuide/deploy_etcd.json | 1 + .../v2.5.x/site/id/adminGuide/deploy_etcd.md | 138 ++ .../site/id/adminGuide/deploy_pulsar.json | 1 + .../site/id/adminGuide/deploy_pulsar.md | 242 ++ .../v2.5.x/site/id/adminGuide/deploy_s3.json | 1 + .../v2.5.x/site/id/adminGuide/deploy_s3.md | 134 + .../site/id/adminGuide/drop_users_roles.json | 1 + .../site/id/adminGuide/drop_users_roles.md | 205 ++ .../site/id/adminGuide/dynamic_config.json | 1 + .../site/id/adminGuide/dynamic_config.md | 208 ++ .../site/id/adminGuide/grant_privileges.json | 1 + .../site/id/adminGuide/grant_privileges.md | 543 ++++ .../site/id/adminGuide/grant_roles.json | 1 + .../v2.5.x/site/id/adminGuide/grant_roles.md | 205 ++ .../adminGuide/limit_collection_counts.json | 1 + .../id/adminGuide/limit_collection_counts.md | 72 + .../adminGuide/message_storage_operator.json | 1 + .../id/adminGuide/message_storage_operator.md | 348 +++ .../id/adminGuide/meta_storage_operator.json | 1 + .../id/adminGuide/meta_storage_operator.md | 117 + .../site/id/adminGuide/monitor/alert.json | 1 + .../site/id/adminGuide/monitor/alert.md | 132 + .../monitor/configure_grafana_loki.json | 1 + .../monitor/configure_grafana_loki.md | 174 ++ .../adminGuide/monitor/metrics_dashboard.json | 1 + .../adminGuide/monitor/metrics_dashboard.md | 196 ++ .../site/id/adminGuide/monitor/monitor.json | 1 + .../site/id/adminGuide/monitor/monitor.md | 136 + .../adminGuide/monitor/monitor_overview.json | 1 + .../id/adminGuide/monitor/monitor_overview.md | 113 + .../site/id/adminGuide/monitor/visualize.json | 1 + .../site/id/adminGuide/monitor/visualize.md | 100 + .../adminGuide/object_storage_operator.json | 1 + .../id/adminGuide/object_storage_operator.md | 230 ++ .../site/id/adminGuide/privilege_group.json | 1 + .../site/id/adminGuide/privilege_group.md | 491 ++++ .../v2.5.x/site/id/adminGuide/rbac.json | 1 + .../v2.5.x/site/id/adminGuide/rbac.md | 78 + .../site/id/adminGuide/resource_group.json | 1 + .../site/id/adminGuide/resource_group.md | 353 +++ .../id/adminGuide/scale-dependencies.json | 1 + .../site/id/adminGuide/scale-dependencies.md | 252 ++ .../v2.5.x/site/id/adminGuide/scaleout.json | 1 + .../v2.5.x/site/id/adminGuide/scaleout.md | 183 ++ .../v2.5.x/site/id/adminGuide/tls.json | 1 + localization/v2.5.x/site/id/adminGuide/tls.md | 449 ++++ .../site/id/adminGuide/upgrade-pulsar-v3.json | 1 + .../site/id/adminGuide/upgrade-pulsar-v3.md | 427 ++++ .../upgrade_milvus_cluster-docker.json | 1 + .../upgrade_milvus_cluster-docker.md | 154 ++ .../upgrade_milvus_cluster-helm.json | 1 + .../adminGuide/upgrade_milvus_cluster-helm.md | 281 +++ .../upgrade_milvus_cluster-operator.json | 1 + .../upgrade_milvus_cluster-operator.md | 179 ++ .../upgrade_milvus_standalone-docker.json | 1 + .../upgrade_milvus_standalone-docker.md | 132 + .../upgrade_milvus_standalone-helm.json | 1 + .../upgrade_milvus_standalone-helm.md | 259 ++ .../upgrade_milvus_standalone-operator.json | 1 + .../upgrade_milvus_standalone-operator.md | 181 ++ .../site/id/adminGuide/use-pulsar-v2.json | 1 + .../site/id/adminGuide/use-pulsar-v2.md | 140 ++ .../site/id/adminGuide/users_and_roles.json | 1 + .../site/id/adminGuide/users_and_roles.md | 260 ++ .../site/id/embeddings/embed-with-bgm-m3.json | 1 + .../site/id/embeddings/embed-with-bgm-m3.md | 93 + .../site/id/embeddings/embed-with-bm25.json | 1 + .../site/id/embeddings/embed-with-bm25.md | 112 + .../site/id/embeddings/embed-with-cohere.json | 1 + .../site/id/embeddings/embed-with-cohere.md | 106 + .../id/embeddings/embed-with-instructor.json | 1 + .../id/embeddings/embed-with-instructor.md | 92 + .../site/id/embeddings/embed-with-jina.json | 1 + .../site/id/embeddings/embed-with-jina.md | 130 + .../site/id/embeddings/embed-with-mgte.json | 1 + .../site/id/embeddings/embed-with-mgte.md | 90 + .../id/embeddings/embed-with-mistral-ai.json | 1 + .../id/embeddings/embed-with-mistral-ai.md | 80 + .../site/id/embeddings/embed-with-nomic.json | 1 + .../site/id/embeddings/embed-with-nomic.md | 89 + .../site/id/embeddings/embed-with-openai.json | 1 + .../site/id/embeddings/embed-with-openai.md | 91 + .../embed-with-sentence-transform.json | 1 + .../embed-with-sentence-transform.md | 88 + .../site/id/embeddings/embed-with-splade.json | 1 + .../site/id/embeddings/embed-with-splade.md | 89 + .../site/id/embeddings/embed-with-voyage.json | 1 + .../site/id/embeddings/embed-with-voyage.md | 77 + .../v2.5.x/site/id/embeddings/embeddings.json | 1 + .../v2.5.x/site/id/embeddings/embeddings.md | 143 ++ .../v2.5.x/site/id/faq/operational_faq.json | 1 + .../v2.5.x/site/id/faq/operational_faq.md | 109 + .../v2.5.x/site/id/faq/performance_faq.json | 1 + .../v2.5.x/site/id/faq/performance_faq.md | 51 + .../v2.5.x/site/id/faq/product_faq.json | 1 + .../v2.5.x/site/id/faq/product_faq.md | 102 + .../v2.5.x/site/id/faq/troubleshooting.json | 1 + .../v2.5.x/site/id/faq/troubleshooting.md | 114 + .../site/id/getstarted/install-overview.json | 1 + .../site/id/getstarted/install-overview.md | 139 ++ .../getstarted/install_SDKs/install-go.json | 1 + .../id/getstarted/install_SDKs/install-go.md | 83 + .../getstarted/install_SDKs/install-java.json | 1 + .../getstarted/install_SDKs/install-java.md | 100 + .../getstarted/install_SDKs/install-node.json | 1 + .../getstarted/install_SDKs/install-node.md | 118 + .../install_SDKs/install-pymilvus.json | 1 + .../install_SDKs/install-pymilvus.md | 109 + .../site/id/getstarted/milvus_lite.json | 1 + .../v2.5.x/site/id/getstarted/milvus_lite.md | 412 ++++ .../v2.5.x/site/id/getstarted/quickstart.json | 1 + .../v2.5.x/site/id/getstarted/quickstart.md | 408 +++ .../install_standalone-docker-compose.json | 1 + .../install_standalone-docker-compose.md | 155 ++ .../install_standalone-docker.json | 1 + .../install_standalone-docker.md | 142 ++ .../install_standalone-windows.json | 1 + .../install_standalone-windows.md | 301 +++ .../prerequisite-docker.json | 1 + .../run-milvus-docker/prerequisite-docker.md | 113 + .../install_cluster-helm-gpu.json | 1 + .../install_cluster-helm-gpu.md | 378 +++ ...install_standalone-docker-compose-gpu.json | 1 + .../install_standalone-docker-compose-gpu.md | 224 ++ .../run-milvus-gpu/prerequisite-gpu.json | 1 + .../run-milvus-gpu/prerequisite-gpu.md | 149 ++ .../run-milvus-k8s/install_cluster-helm.json | 1 + .../run-milvus-k8s/install_cluster-helm.md | 335 +++ .../install_cluster-milvusoperator.json | 1 + .../install_cluster-milvusoperator.md | 394 +++ .../run-milvus-k8s/prerequisite-helm.json | 1 + .../run-milvus-k8s/prerequisite-helm.md | 148 ++ localization/v2.5.x/site/id/home/home.json | 1 + localization/v2.5.x/site/id/home/home.md | 122 + .../integrations/RAG_with_pii_and_milvus.json | 1 + .../integrations/RAG_with_pii_and_milvus.md | 242 ++ .../id/integrations/apify_milvus_rag.json | 1 + .../site/id/integrations/apify_milvus_rag.md | 267 ++ .../build_RAG_with_milvus_and_cognee.json | 1 + .../build_RAG_with_milvus_and_cognee.md | 159 ++ .../build_RAG_with_milvus_and_deepseek.json | 1 + .../build_RAG_with_milvus_and_deepseek.md | 247 ++ .../build_RAG_with_milvus_and_fireworks.json | 1 + .../build_RAG_with_milvus_and_fireworks.md | 248 ++ .../build_RAG_with_milvus_and_gemini.json | 1 + .../build_RAG_with_milvus_and_gemini.md | 247 ++ .../build_RAG_with_milvus_and_lepton.json | 1 + .../build_RAG_with_milvus_and_lepton.md | 243 ++ .../build_RAG_with_milvus_and_ollama.json | 1 + .../build_RAG_with_milvus_and_ollama.md | 282 +++ ...build_RAG_with_milvus_and_siliconflow.json | 1 + .../build_RAG_with_milvus_and_siliconflow.md | 244 ++ .../id/integrations/build_rag_on_arm.json | 1 + .../site/id/integrations/build_rag_on_arm.md | 302 +++ .../id/integrations/dify_with_milvus.json | 1 + .../site/id/integrations/dify_with_milvus.md | 111 + .../evaluation_with_deepeval.json | 1 + .../integrations/evaluation_with_deepeval.md | 434 ++++ .../integrations/evaluation_with_phoenix.json | 1 + .../integrations/evaluation_with_phoenix.md | 475 ++++ .../integrations/integrate_with_airbyte.json | 1 + .../id/integrations/integrate_with_airbyte.md | 248 ++ .../integrations/integrate_with_bentoml.json | 1 + .../id/integrations/integrate_with_bentoml.md | 351 +++ .../id/integrations/integrate_with_camel.json | 1 + .../id/integrations/integrate_with_camel.md | 474 ++++ .../integrations/integrate_with_cohere.json | 1 + .../id/integrations/integrate_with_cohere.md | 319 +++ .../id/integrations/integrate_with_dspy.json | 1 + .../id/integrations/integrate_with_dspy.md | 278 +++ .../integrations/integrate_with_fastgpt.json | 1 + .../id/integrations/integrate_with_fastgpt.md | 145 ++ .../integrations/integrate_with_haystack.json | 1 + .../integrations/integrate_with_haystack.md | 256 ++ .../integrate_with_hugging-face.json | 1 + .../integrate_with_hugging-face.md | 245 ++ .../id/integrations/integrate_with_jina.json | 1 + .../id/integrations/integrate_with_jina.md | 307 +++ .../integrations/integrate_with_langfuse.json | 1 + .../integrations/integrate_with_langfuse.md | 180 ++ .../integrate_with_llamaindex.json | 1 + .../integrations/integrate_with_llamaindex.md | 203 ++ .../integrations/integrate_with_memgpt.json | 1 + .../id/integrations/integrate_with_memgpt.md | 145 ++ .../integrations/integrate_with_openai.json | 1 + .../id/integrations/integrate_with_openai.md | 155 ++ .../integrations/integrate_with_pytorch.json | 1 + .../id/integrations/integrate_with_pytorch.md | 299 +++ .../id/integrations/integrate_with_ragas.json | 1 + .../id/integrations/integrate_with_ragas.md | 359 +++ .../integrate_with_sentencetransformers.json | 1 + .../integrate_with_sentencetransformers.md | 224 ++ .../integrations/integrate_with_snowpark.json | 1 + .../integrations/integrate_with_snowpark.md | 322 +++ .../id/integrations/integrate_with_spark.json | 1 + .../id/integrations/integrate_with_spark.md | 505 ++++ .../id/integrations/integrate_with_vanna.json | 1 + .../id/integrations/integrate_with_vanna.md | 369 +++ .../integrations/integrate_with_voxel51.json | 1 + .../id/integrations/integrate_with_voxel51.md | 337 +++ .../integrations/integrate_with_voyageai.json | 1 + .../integrations/integrate_with_voyageai.md | 136 + .../integrations/integrate_with_whyhow.json | 1 + .../id/integrations/integrate_with_whyhow.md | 218 ++ .../integrations/integrations_overview.json | 1 + .../id/integrations/integrations_overview.md | 80 + .../id/integrations/kafka-connect-milvus.json | 1 + .../id/integrations/kafka-connect-milvus.md | 181 ++ .../knowledge_table_with_milvus.json | 1 + .../knowledge_table_with_milvus.md | 146 ++ .../id/integrations/kotaemon_with_milvus.json | 1 + .../id/integrations/kotaemon_with_milvus.md | 99 + .../langchain/basic_usage_langchain.json | 1 + .../langchain/basic_usage_langchain.md | 321 +++ .../langchain/integrate_with_langchain.json | 1 + .../langchain/integrate_with_langchain.md | 283 +++ .../milvus_hybrid_search_retriever.json | 1 + .../milvus_hybrid_search_retriever.md | 310 +++ .../integrations/llama_agents_metadata.json | 1 + .../id/integrations/llama_agents_metadata.md | 784 ++++++ .../integrations/milvus_rag_with_dynamiq.json | 1 + .../integrations/milvus_rag_with_dynamiq.md | 339 +++ .../id/integrations/milvus_rag_with_vllm.json | 1 + .../id/integrations/milvus_rag_with_vllm.md | 387 +++ .../quickstart_mem0_with_milvus.json | 1 + .../quickstart_mem0_with_milvus.md | 217 ++ .../id/integrations/rag_with_langflow.json | 1 + .../site/id/integrations/rag_with_langflow.md | 84 + .../rag_with_milvus_and_unstructured.json | 1 + .../rag_with_milvus_and_unstructured.md | 289 +++ .../integrations/use_milvus_in_docsgpt.json | 1 + .../id/integrations/use_milvus_in_docsgpt.md | 142 ++ .../use_milvus_in_private_gpt.json | 1 + .../integrations/use_milvus_in_private_gpt.md | 170 ++ .../use_milvus_with_sambanova.json | 1 + .../integrations/use_milvus_with_sambanova.md | 135 + ...deo_search_with_twelvelabs_and_milvus.json | 1 + ...video_search_with_twelvelabs_and_milvus.md | 464 ++++ .../v2.5.x/site/id/menuStructure/id.json | 2196 +++++++++++++++++ localization/v2.5.x/site/id/migrate/es2m.json | 1 + localization/v2.5.x/site/id/migrate/es2m.md | 267 ++ localization/v2.5.x/site/id/migrate/f2m.json | 1 + localization/v2.5.x/site/id/migrate/f2m.md | 209 ++ .../v2.5.x/site/id/migrate/from-m2x.json | 1 + .../v2.5.x/site/id/migrate/from-m2x.md | 220 ++ localization/v2.5.x/site/id/migrate/m2m.json | 1 + localization/v2.5.x/site/id/migrate/m2m.md | 243 ++ .../site/id/migrate/migrate_overview.json | 1 + .../site/id/migrate/migrate_overview.md | 120 + .../site/id/migrate/milvusdm_install.json | 1 + .../site/id/migrate/milvusdm_install.md | 91 + .../architecture/architecture_overview.json | 1 + .../architecture/architecture_overview.md | 54 + .../architecture/data_processing.json | 1 + .../reference/architecture/data_processing.md | 124 + .../reference/architecture/four_layers.json | 1 + .../id/reference/architecture/four_layers.md | 123 + .../architecture/main_components.json | 1 + .../reference/architecture/main_components.md | 98 + .../v2.5.x/site/id/reference/benchmark.json | 1 + .../v2.5.x/site/id/reference/benchmark.md | 279 +++ .../v2.5.x/site/id/reference/bitset.json | 1 + .../v2.5.x/site/id/reference/bitset.md | 130 + .../site/id/reference/coordinator_ha.json | 1 + .../site/id/reference/coordinator_ha.md | 195 ++ .../v2.5.x/site/id/reference/disk_index.json | 1 + .../v2.5.x/site/id/reference/disk_index.md | 159 ++ .../v2.5.x/site/id/reference/glossary.json | 1 + .../v2.5.x/site/id/reference/glossary.md | 806 ++++++ .../v2.5.x/site/id/reference/gpu_index.json | 1 + .../v2.5.x/site/id/reference/gpu_index.md | 239 ++ .../v2.5.x/site/id/reference/index.json | 1 + .../v2.5.x/site/id/reference/index.md | 679 +++++ .../v2.5.x/site/id/reference/knowhere.json | 1 + .../v2.5.x/site/id/reference/knowhere.md | 179 ++ .../site/id/reference/multi_tenancy.json | 1 + .../v2.5.x/site/id/reference/multi_tenancy.md | 106 + .../v2.5.x/site/id/reference/replica.json | 1 + .../v2.5.x/site/id/reference/replica.md | 91 + .../site/id/reference/scalar_index.json | 1 + .../v2.5.x/site/id/reference/scalar_index.md | 165 ++ .../v2.5.x/site/id/reference/schema.json | 1 + .../v2.5.x/site/id/reference/schema.md | 252 ++ .../sys_config/configure_common.json | 1 + .../reference/sys_config/configure_common.md | 812 ++++++ .../sys_config/configure_datacoord.json | 1 + .../sys_config/configure_datacoord.md | 2009 +++++++++++++++ .../sys_config/configure_datanode.json | 1 + .../sys_config/configure_datanode.md | 1015 ++++++++ .../reference/sys_config/configure_etcd.json | 1 + .../id/reference/sys_config/configure_etcd.md | 538 ++++ .../reference/sys_config/configure_gpu.json | 1 + .../id/reference/sys_config/configure_gpu.md | 85 + .../reference/sys_config/configure_grpc.json | 1 + .../id/reference/sys_config/configure_grpc.md | 50 + .../sys_config/configure_indexcoord.json | 1 + .../sys_config/configure_indexcoord.md | 50 + .../sys_config/configure_indexnode.json | 1 + .../sys_config/configure_indexnode.md | 224 ++ .../sys_config/configure_localstorage.json | 1 + .../sys_config/configure_localstorage.md | 53 + .../reference/sys_config/configure_log.json | 1 + .../id/reference/sys_config/configure_log.md | 231 ++ .../sys_config/configure_metastore.json | 1 + .../sys_config/configure_metastore.md | 50 + .../reference/sys_config/configure_minio.json | 1 + .../reference/sys_config/configure_minio.md | 528 ++++ .../id/reference/sys_config/configure_mq.json | 1 + .../id/reference/sys_config/configure_mq.md | 262 ++ .../sys_config/configure_msgchannel.json | 1 + .../sys_config/configure_msgchannel.md | 316 +++ .../sys_config/configure_natsmq.json | 1 + .../reference/sys_config/configure_natsmq.md | 429 ++++ .../reference/sys_config/configure_proxy.json | 1 + .../reference/sys_config/configure_proxy.md | 1155 +++++++++ .../sys_config/configure_pulsar.json | 1 + .../reference/sys_config/configure_pulsar.md | 264 ++ .../sys_config/configure_querycoord.json | 1 + .../sys_config/configure_querycoord.md | 1300 ++++++++++ .../sys_config/configure_querynode.json | 1 + .../sys_config/configure_querynode.md | 1261 ++++++++++ .../sys_config/configure_quotaandlimits.json | 1 + .../sys_config/configure_quotaandlimits.md | 2137 ++++++++++++++++ .../sys_config/configure_rocksmq.json | 1 + .../reference/sys_config/configure_rocksmq.md | 247 ++ .../sys_config/configure_rootcoord.json | 1 + .../sys_config/configure_rootcoord.md | 375 +++ .../reference/sys_config/configure_tikv.json | 1 + .../id/reference/sys_config/configure_tikv.md | 314 +++ .../reference/sys_config/configure_tls.json | 1 + .../id/reference/sys_config/configure_tls.md | 22 + .../reference/sys_config/configure_trace.json | 1 + .../reference/sys_config/configure_trace.md | 200 ++ .../sys_config/system_configuration.json | 1 + .../sys_config/system_configuration.md | 129 + .../v2.5.x/site/id/reference/time_sync.json | 1 + .../v2.5.x/site/id/reference/time_sync.md | 161 ++ .../v2.5.x/site/id/reference/timestamp.json | 1 + .../v2.5.x/site/id/reference/timestamp.md | 109 + .../v2.5.x/site/id/release_notes.json | 1 + localization/v2.5.x/site/id/release_notes.md | 210 ++ .../site/id/rerankers/rerankers-bge.json | 1 + .../v2.5.x/site/id/rerankers/rerankers-bge.md | 79 + .../site/id/rerankers/rerankers-cohere.json | 1 + .../site/id/rerankers/rerankers-cohere.md | 79 + .../id/rerankers/rerankers-cross-encoder.json | 1 + .../id/rerankers/rerankers-cross-encoder.md | 79 + .../site/id/rerankers/rerankers-jina.json | 1 + .../site/id/rerankers/rerankers-jina.md | 78 + .../site/id/rerankers/rerankers-overview.json | 1 + .../site/id/rerankers/rerankers-overview.md | 210 ++ .../site/id/rerankers/rerankers-voyage.json | 1 + .../site/id/rerankers/rerankers-voyage.md | 79 + .../id/tutorials/audio_similarity_search.json | 1 + .../id/tutorials/audio_similarity_search.md | 36 + .../id/tutorials/build-rag-with-milvus.json | 1 + .../id/tutorials/build-rag-with-milvus.md | 250 ++ .../contextual_retrieval_with_milvus.json | 1 + .../contextual_retrieval_with_milvus.md | 621 +++++ .../dna_sequence_classification.json | 1 + .../tutorials/dna_sequence_classification.md | 36 + .../full_text_search_with_milvus.json | 1 + .../tutorials/full_text_search_with_milvus.md | 372 +++ .../funnel_search_with_matryoshka.json | 1 + .../funnel_search_with_matryoshka.md | 571 +++++ .../id/tutorials/graph_rag_with_milvus.json | 1 + .../id/tutorials/graph_rag_with_milvus.md | 509 ++++ .../hdbscan_clustering_with_milvus.json | 1 + .../hdbscan_clustering_with_milvus.md | 277 +++ .../id/tutorials/how_to_enhance_your_rag.json | 1 + .../id/tutorials/how_to_enhance_your_rag.md | 296 +++ .../tutorials/hybrid_search_with_milvus.json | 1 + .../id/tutorials/hybrid_search_with_milvus.md | 313 +++ .../tutorials/image_deduplication_system.json | 1 + .../tutorials/image_deduplication_system.md | 35 + .../id/tutorials/image_similarity_search.json | 1 + .../id/tutorials/image_similarity_search.md | 263 ++ .../movie_recommendation_with_milvus.json | 1 + .../movie_recommendation_with_milvus.md | 299 +++ .../tutorials/multimodal_rag_with_milvus.json | 1 + .../tutorials/multimodal_rag_with_milvus.md | 424 ++++ .../tutorials/question_answering_system.json | 1 + .../id/tutorials/question_answering_system.md | 44 + .../id/tutorials/quickstart_with_attu.json | 1 + .../site/id/tutorials/quickstart_with_attu.md | 242 ++ .../id/tutorials/recommendation_system.json | 1 + .../id/tutorials/recommendation_system.md | 36 + .../site/id/tutorials/text_image_search.json | 1 + .../site/id/tutorials/text_image_search.md | 39 + .../site/id/tutorials/text_search_engine.json | 1 + .../site/id/tutorials/text_search_engine.md | 39 + .../site/id/tutorials/tutorials-overview.json | 1 + .../site/id/tutorials/tutorials-overview.md | 54 + .../use-async-milvus-client-with-asyncio.json | 1 + .../use-async-milvus-client-with-asyncio.md | 416 ++++ .../id/tutorials/use_ColPali_with_milvus.json | 1 + .../id/tutorials/use_ColPali_with_milvus.md | 336 +++ .../id/tutorials/vector_visualization.json | 1 + .../site/id/tutorials/vector_visualization.md | 434 ++++ .../id/tutorials/video_similarity_search.json | 1 + .../id/tutorials/video_similarity_search.md | 40 + .../create-collection-instantly.json | 1 + .../create-collection-instantly.md | 341 +++ .../collections/create-collection.json | 1 + .../collections/create-collection.md | 760 ++++++ .../collections/drop-collection.json | 1 + .../userGuide/collections/drop-collection.md | 138 ++ .../collections/load-and-release.json | 1 + .../userGuide/collections/load-and-release.md | 411 +++ .../userGuide/collections/manage-aliases.json | 1 + .../userGuide/collections/manage-aliases.md | 542 ++++ .../collections/manage-collections.json | 1 + .../collections/manage-collections.md | 272 ++ .../collections/manage-partitions.json | 1 + .../collections/manage-partitions.md | 764 ++++++ .../collections/modify-collection.json | 1 + .../collections/modify-collection.md | 213 ++ .../collections/view-collections.json | 1 + .../userGuide/collections/view-collections.md | 202 ++ .../id/userGuide/data-import/import-data.json | 1 + .../id/userGuide/data-import/import-data.md | 401 +++ .../data-import/prepare-source-data.json | 1 + .../data-import/prepare-source-data.md | 633 +++++ .../insert-and-delete/delete-entities.json | 1 + .../insert-and-delete/delete-entities.md | 257 ++ .../insert-update-delete.json | 1 + .../insert-and-delete/insert-update-delete.md | 365 +++ .../insert-and-delete/upsert-entities.json | 1 + .../insert-and-delete/upsert-entities.md | 360 +++ .../id/userGuide/manage-indexes/bitmap.json | 1 + .../id/userGuide/manage-indexes/bitmap.md | 125 + .../manage-indexes/index-scalar-fields.json | 1 + .../manage-indexes/index-scalar-fields.md | 326 +++ .../manage-indexes/index-vector-fields.json | 1 + .../manage-indexes/index-vector-fields.md | 593 +++++ .../manage-indexes/index-with-gpu.json | 1 + .../manage-indexes/index-with-gpu.md | 233 ++ .../site/id/userGuide/manage_databases.json | 1 + .../site/id/userGuide/manage_databases.md | 597 +++++ .../schema/analyzer/analyzer-overview.json | 1 + .../schema/analyzer/analyzer-overview.md | 585 +++++ .../analyzer/analyzer/chinese-analyzer.json | 1 + .../analyzer/analyzer/chinese-analyzer.md | 50 + .../analyzer/analyzer/english-analyzer.json | 1 + .../analyzer/analyzer/english-analyzer.md | 74 + .../analyzer/analyzer/standard-analyzer.json | 1 + .../analyzer/analyzer/standard-analyzer.md | 107 + .../analyzer/filter/alphanumonly-filter.json | 1 + .../analyzer/filter/alphanumonly-filter.md | 70 + .../analyzer/filter/ascii-folding-filter.json | 1 + .../analyzer/filter/ascii-folding-filter.md | 68 + .../filter/cnalphanumonly-filter.json | 1 + .../analyzer/filter/cnalphanumonly-filter.md | 69 + .../analyzer/filter/cncharonly-filter.json | 1 + .../analyzer/filter/cncharonly-filter.md | 68 + .../analyzer/filter/decompounder-filter.json | 1 + .../analyzer/filter/decompounder-filter.md | 79 + .../schema/analyzer/filter/length-filter.json | 1 + .../schema/analyzer/filter/length-filter.md | 78 + .../analyzer/filter/lowercase-filter.json | 1 + .../analyzer/filter/lowercase-filter.md | 68 + .../analyzer/filter/stemmer-filter.json | 1 + .../schema/analyzer/filter/stemmer-filter.md | 78 + .../schema/analyzer/filter/stop-filter.json | 1 + .../schema/analyzer/filter/stop-filter.md | 78 + .../analyzer/tokenizer/jieba-tokenizer.json | 1 + .../analyzer/tokenizer/jieba-tokenizer.md | 66 + .../tokenizer/standard-tokenizer.json | 1 + .../analyzer/tokenizer/standard-tokenizer.md | 77 + .../tokenizer/whitespace-tokenizer.json | 1 + .../tokenizer/whitespace-tokenizer.md | 72 + .../id/userGuide/schema/array_data_type.json | 1 + .../id/userGuide/schema/array_data_type.md | 631 +++++ .../id/userGuide/schema/binary-vector.json | 1 + .../site/id/userGuide/schema/binary-vector.md | 474 ++++ .../id/userGuide/schema/dense-vector.json | 1 + .../site/id/userGuide/schema/dense-vector.md | 434 ++++ .../schema/enable-dynamic-field.json | 1 + .../userGuide/schema/enable-dynamic-field.md | 382 +++ .../schema/nullable-and-default.json | 1 + .../userGuide/schema/nullable-and-default.md | 878 +++++++ .../site/id/userGuide/schema/number.json | 1 + .../v2.5.x/site/id/userGuide/schema/number.md | 568 +++++ .../id/userGuide/schema/primary-field.json | 1 + .../site/id/userGuide/schema/primary-field.md | 196 ++ .../id/userGuide/schema/schema-hands-on.json | 1 + .../id/userGuide/schema/schema-hands-on.md | 271 ++ .../site/id/userGuide/schema/schema.json | 1 + .../v2.5.x/site/id/userGuide/schema/schema.md | 453 ++++ .../id/userGuide/schema/sparse_vector.json | 1 + .../site/id/userGuide/schema/sparse_vector.md | 537 ++++ .../site/id/userGuide/schema/string.json | 1 + .../v2.5.x/site/id/userGuide/schema/string.md | 561 +++++ .../id/userGuide/schema/use-json-fields.json | 1 + .../id/userGuide/schema/use-json-fields.md | 525 ++++ .../boolean/array-operators.json | 1 + .../boolean/array-operators.md | 137 + .../boolean/basic-operators.json | 1 + .../boolean/basic-operators.md | 237 ++ .../search-query-get/boolean/boolean.json | 1 + .../search-query-get/boolean/boolean.md | 148 ++ .../boolean/filtering-templating.json | 1 + .../boolean/filtering-templating.md | 155 ++ .../boolean/json-operators.json | 1 + .../boolean/json-operators.md | 122 + .../clustering-compaction.json | 1 + .../search-query-get/clustering-compaction.md | 273 ++ .../search-query-get/consistency.json | 1 + .../userGuide/search-query-get/consistency.md | 211 ++ .../search-query-get/filtered-search.json | 1 + .../search-query-get/filtered-search.md | 258 ++ .../search-query-get/full-text-search.json | 1 + .../search-query-get/full-text-search.md | 501 ++++ .../get-and-scalar-query.json | 1 + .../search-query-get/get-and-scalar-query.md | 587 +++++ .../search-query-get/grouping-search.json | 1 + .../search-query-get/grouping-search.md | 367 +++ .../search-query-get/keyword-match.json | 1 + .../search-query-get/keyword-match.md | 431 ++++ .../id/userGuide/search-query-get/metric.json | 1 + .../id/userGuide/search-query-get/metric.md | 252 ++ .../id/userGuide/search-query-get/mmap.json | 1 + .../id/userGuide/search-query-get/mmap.md | 190 ++ .../search-query-get/multi-vector-search.json | 1 + .../search-query-get/multi-vector-search.md | 683 +++++ .../search-query-get/range-search.json | 1 + .../search-query-get/range-search.md | 214 ++ .../userGuide/search-query-get/reranking.json | 1 + .../userGuide/search-query-get/reranking.md | 122 + .../single-vector-search.json | 1 + .../search-query-get/single-vector-search.md | 919 +++++++ .../search-query-get/use-partition-key.json | 1 + .../search-query-get/use-partition-key.md | 245 ++ .../search-query-get/with-iterators.json | 1 + .../search-query-get/with-iterators.md | 163 ++ .../tools/birdwatcher_install_guides.json | 1 + .../tools/birdwatcher_install_guides.md | 118 + .../userGuide/tools/birdwatcher_overview.json | 1 + .../userGuide/tools/birdwatcher_overview.md | 77 + .../tools/birdwatcher_usage_guides.json | 1 + .../tools/birdwatcher_usage_guides.md | 406 +++ .../site/id/userGuide/tools/cli_commands.json | 1 + .../site/id/userGuide/tools/cli_commands.md | 1530 ++++++++++++ .../site/id/userGuide/tools/cli_overview.json | 1 + .../site/id/userGuide/tools/cli_overview.md | 78 + .../site/id/userGuide/tools/install_cli.json | 1 + .../site/id/userGuide/tools/install_cli.md | 100 + .../cross-bucket-backup-and-restore.json | 1 + .../cross-bucket-backup-and-restore.md | 203 ++ .../multi-storage-backup-and-restore.json | 1 + .../multi-storage-backup-and-restore.md | 246 ++ .../shared-bucket-backup-and-restore.json | 1 + .../shared-bucket-backup-and-restore.md | 199 ++ .../single-instance-backup-and-restore.json | 1 + .../single-instance-backup-and-restore.md | 142 ++ .../milvus-backup/milvus_backup_api.json | 1 + .../tools/milvus-backup/milvus_backup_api.md | 230 ++ .../milvus-backup/milvus_backup_cli.json | 1 + .../tools/milvus-backup/milvus_backup_cli.md | 180 ++ .../milvus-backup/milvus_backup_overview.json | 1 + .../milvus-backup/milvus_backup_overview.md | 83 + .../tools/milvus-cdc/cdc-monitoring.json | 1 + .../tools/milvus-cdc/cdc-monitoring.md | 44 + .../tools/milvus-cdc/deploy-cdc-server.json | 1 + .../tools/milvus-cdc/deploy-cdc-server.md | 156 ++ .../tools/milvus-cdc/manage-cdc-tasks.json | 1 + .../tools/milvus-cdc/manage-cdc-tasks.md | 275 +++ .../tools/milvus-cdc/milvus-cdc-overview.json | 1 + .../tools/milvus-cdc/milvus-cdc-overview.md | 125 + .../site/id/userGuide/tools/milvus-webui.json | 1 + .../site/id/userGuide/tools/milvus-webui.md | 290 +++ .../v2.5.x/site/ru/about/comparison.json | 1 + .../v2.5.x/site/ru/about/comparison.md | 161 ++ .../v2.5.x/site/ru/about/limitations.json | 1 + .../v2.5.x/site/ru/about/limitations.md | 260 ++ .../v2.5.x/site/ru/about/milvus_adopters.json | 1 + .../v2.5.x/site/ru/about/milvus_adopters.md | 27 + .../v2.5.x/site/ru/about/overview.json | 1 + localization/v2.5.x/site/ru/about/overview.md | 179 ++ .../v2.5.x/site/ru/about/roadmap.json | 1 + localization/v2.5.x/site/ru/about/roadmap.md | 110 + .../v2.5.x/site/ru/adminGuide/allocate.json | 1 + .../v2.5.x/site/ru/adminGuide/allocate.md | 141 ++ .../site/ru/adminGuide/authenticate.json | 1 + .../v2.5.x/site/ru/adminGuide/authenticate.md | 277 +++ .../site/ru/adminGuide/chunk_cache.json | 1 + .../v2.5.x/site/ru/adminGuide/chunk_cache.md | 77 + .../site/ru/adminGuide/clouds/aws/aws.json | 1 + .../site/ru/adminGuide/clouds/aws/aws.md | 494 ++++ .../ru/adminGuide/clouds/aws/aws_layer7.json | 1 + .../ru/adminGuide/clouds/aws/aws_layer7.md | 109 + .../site/ru/adminGuide/clouds/aws/eks.json | 1 + .../site/ru/adminGuide/clouds/aws/eks.md | 518 ++++ .../site/ru/adminGuide/clouds/aws/s3.json | 1 + .../site/ru/adminGuide/clouds/aws/s3.md | 341 +++ .../site/ru/adminGuide/clouds/azure/abs.json | 1 + .../site/ru/adminGuide/clouds/azure/abs.md | 149 ++ .../ru/adminGuide/clouds/azure/azure.json | 1 + .../site/ru/adminGuide/clouds/azure/azure.md | 299 +++ .../ru/adminGuide/clouds/azure/ingress.json | 1 + .../ru/adminGuide/clouds/azure/ingress.md | 235 ++ .../site/ru/adminGuide/clouds/gcp/gcp.json | 1 + .../site/ru/adminGuide/clouds/gcp/gcp.md | 287 +++ .../ru/adminGuide/clouds/gcp/gcp_layer7.json | 1 + .../ru/adminGuide/clouds/gcp/gcp_layer7.md | 215 ++ .../site/ru/adminGuide/clouds/gcp/gcs.json | 1 + .../site/ru/adminGuide/clouds/gcp/gcs.md | 151 ++ .../clouds/openshift/openshift.json | 1 + .../adminGuide/clouds/openshift/openshift.md | 183 ++ .../ru/adminGuide/config_jaeger_tracing.json | 1 + .../ru/adminGuide/config_jaeger_tracing.md | 148 ++ .../site/ru/adminGuide/configure-docker.json | 1 + .../site/ru/adminGuide/configure-docker.md | 296 +++ .../site/ru/adminGuide/configure-helm.json | 1 + .../site/ru/adminGuide/configure-helm.md | 250 ++ .../configure-querynode-localdisk.json | 1 + .../configure-querynode-localdisk.md | 282 +++ .../ru/adminGuide/configure_access_logs.json | 1 + .../ru/adminGuide/configure_access_logs.md | 175 ++ .../ru/adminGuide/configure_operator.json | 1 + .../site/ru/adminGuide/configure_operator.md | 336 +++ .../site/ru/adminGuide/connect_kafka_ssl.json | 1 + .../site/ru/adminGuide/connect_kafka_ssl.md | 619 +++++ .../site/ru/adminGuide/deploy_etcd.json | 1 + .../v2.5.x/site/ru/adminGuide/deploy_etcd.md | 136 + .../site/ru/adminGuide/deploy_pulsar.json | 1 + .../site/ru/adminGuide/deploy_pulsar.md | 240 ++ .../v2.5.x/site/ru/adminGuide/deploy_s3.json | 1 + .../v2.5.x/site/ru/adminGuide/deploy_s3.md | 134 + .../site/ru/adminGuide/drop_users_roles.json | 1 + .../site/ru/adminGuide/drop_users_roles.md | 205 ++ .../site/ru/adminGuide/dynamic_config.json | 1 + .../site/ru/adminGuide/dynamic_config.md | 208 ++ .../site/ru/adminGuide/grant_privileges.json | 1 + .../site/ru/adminGuide/grant_privileges.md | 542 ++++ .../site/ru/adminGuide/grant_roles.json | 1 + .../v2.5.x/site/ru/adminGuide/grant_roles.md | 204 ++ .../adminGuide/limit_collection_counts.json | 1 + .../ru/adminGuide/limit_collection_counts.md | 72 + .../adminGuide/message_storage_operator.json | 1 + .../ru/adminGuide/message_storage_operator.md | 348 +++ .../ru/adminGuide/meta_storage_operator.json | 1 + .../ru/adminGuide/meta_storage_operator.md | 117 + .../site/ru/adminGuide/monitor/alert.json | 1 + .../site/ru/adminGuide/monitor/alert.md | 132 + .../monitor/configure_grafana_loki.json | 1 + .../monitor/configure_grafana_loki.md | 174 ++ .../adminGuide/monitor/metrics_dashboard.json | 1 + .../adminGuide/monitor/metrics_dashboard.md | 198 ++ .../site/ru/adminGuide/monitor/monitor.json | 1 + .../site/ru/adminGuide/monitor/monitor.md | 136 + .../adminGuide/monitor/monitor_overview.json | 1 + .../ru/adminGuide/monitor/monitor_overview.md | 113 + .../site/ru/adminGuide/monitor/visualize.json | 1 + .../site/ru/adminGuide/monitor/visualize.md | 100 + .../adminGuide/object_storage_operator.json | 1 + .../ru/adminGuide/object_storage_operator.md | 230 ++ .../site/ru/adminGuide/privilege_group.json | 1 + .../site/ru/adminGuide/privilege_group.md | 491 ++++ .../v2.5.x/site/ru/adminGuide/rbac.json | 1 + .../v2.5.x/site/ru/adminGuide/rbac.md | 78 + .../site/ru/adminGuide/resource_group.json | 1 + .../site/ru/adminGuide/resource_group.md | 353 +++ .../ru/adminGuide/scale-dependencies.json | 1 + .../site/ru/adminGuide/scale-dependencies.md | 252 ++ .../v2.5.x/site/ru/adminGuide/scaleout.json | 1 + .../v2.5.x/site/ru/adminGuide/scaleout.md | 183 ++ .../v2.5.x/site/ru/adminGuide/tls.json | 1 + localization/v2.5.x/site/ru/adminGuide/tls.md | 449 ++++ .../site/ru/adminGuide/upgrade-pulsar-v3.json | 1 + .../site/ru/adminGuide/upgrade-pulsar-v3.md | 427 ++++ .../upgrade_milvus_cluster-docker.json | 1 + .../upgrade_milvus_cluster-docker.md | 154 ++ .../upgrade_milvus_cluster-helm.json | 1 + .../adminGuide/upgrade_milvus_cluster-helm.md | 281 +++ .../upgrade_milvus_cluster-operator.json | 1 + .../upgrade_milvus_cluster-operator.md | 179 ++ .../upgrade_milvus_standalone-docker.json | 1 + .../upgrade_milvus_standalone-docker.md | 132 + .../upgrade_milvus_standalone-helm.json | 1 + .../upgrade_milvus_standalone-helm.md | 259 ++ .../upgrade_milvus_standalone-operator.json | 1 + .../upgrade_milvus_standalone-operator.md | 181 ++ .../site/ru/adminGuide/use-pulsar-v2.json | 1 + .../site/ru/adminGuide/use-pulsar-v2.md | 139 ++ .../site/ru/adminGuide/users_and_roles.json | 1 + .../site/ru/adminGuide/users_and_roles.md | 261 ++ .../site/ru/embeddings/embed-with-bgm-m3.json | 1 + .../site/ru/embeddings/embed-with-bgm-m3.md | 93 + .../site/ru/embeddings/embed-with-bm25.json | 1 + .../site/ru/embeddings/embed-with-bm25.md | 112 + .../site/ru/embeddings/embed-with-cohere.json | 1 + .../site/ru/embeddings/embed-with-cohere.md | 106 + .../ru/embeddings/embed-with-instructor.json | 1 + .../ru/embeddings/embed-with-instructor.md | 93 + .../site/ru/embeddings/embed-with-jina.json | 1 + .../site/ru/embeddings/embed-with-jina.md | 130 + .../site/ru/embeddings/embed-with-mgte.json | 1 + .../site/ru/embeddings/embed-with-mgte.md | 90 + .../ru/embeddings/embed-with-mistral-ai.json | 1 + .../ru/embeddings/embed-with-mistral-ai.md | 80 + .../site/ru/embeddings/embed-with-nomic.json | 1 + .../site/ru/embeddings/embed-with-nomic.md | 89 + .../site/ru/embeddings/embed-with-openai.json | 1 + .../site/ru/embeddings/embed-with-openai.md | 89 + .../embed-with-sentence-transform.json | 1 + .../embed-with-sentence-transform.md | 88 + .../site/ru/embeddings/embed-with-splade.json | 1 + .../site/ru/embeddings/embed-with-splade.md | 89 + .../site/ru/embeddings/embed-with-voyage.json | 1 + .../site/ru/embeddings/embed-with-voyage.md | 77 + .../v2.5.x/site/ru/embeddings/embeddings.json | 1 + .../v2.5.x/site/ru/embeddings/embeddings.md | 143 ++ .../v2.5.x/site/ru/faq/operational_faq.json | 1 + .../v2.5.x/site/ru/faq/operational_faq.md | 107 + .../v2.5.x/site/ru/faq/performance_faq.json | 1 + .../v2.5.x/site/ru/faq/performance_faq.md | 52 + .../v2.5.x/site/ru/faq/product_faq.json | 1 + .../v2.5.x/site/ru/faq/product_faq.md | 102 + .../v2.5.x/site/ru/faq/troubleshooting.json | 1 + .../v2.5.x/site/ru/faq/troubleshooting.md | 114 + .../site/ru/getstarted/install-overview.json | 1 + .../site/ru/getstarted/install-overview.md | 140 ++ .../getstarted/install_SDKs/install-go.json | 1 + .../ru/getstarted/install_SDKs/install-go.md | 83 + .../getstarted/install_SDKs/install-java.json | 1 + .../getstarted/install_SDKs/install-java.md | 100 + .../getstarted/install_SDKs/install-node.json | 1 + .../getstarted/install_SDKs/install-node.md | 118 + .../install_SDKs/install-pymilvus.json | 1 + .../install_SDKs/install-pymilvus.md | 109 + .../site/ru/getstarted/milvus_lite.json | 1 + .../v2.5.x/site/ru/getstarted/milvus_lite.md | 412 ++++ .../v2.5.x/site/ru/getstarted/quickstart.json | 1 + .../v2.5.x/site/ru/getstarted/quickstart.md | 408 +++ .../install_standalone-docker-compose.json | 1 + .../install_standalone-docker-compose.md | 155 ++ .../install_standalone-docker.json | 1 + .../install_standalone-docker.md | 142 ++ .../install_standalone-windows.json | 1 + .../install_standalone-windows.md | 303 +++ .../prerequisite-docker.json | 1 + .../run-milvus-docker/prerequisite-docker.md | 113 + .../install_cluster-helm-gpu.json | 1 + .../install_cluster-helm-gpu.md | 378 +++ ...install_standalone-docker-compose-gpu.json | 1 + .../install_standalone-docker-compose-gpu.md | 224 ++ .../run-milvus-gpu/prerequisite-gpu.json | 1 + .../run-milvus-gpu/prerequisite-gpu.md | 149 ++ .../run-milvus-k8s/install_cluster-helm.json | 1 + .../run-milvus-k8s/install_cluster-helm.md | 335 +++ .../install_cluster-milvusoperator.json | 1 + .../install_cluster-milvusoperator.md | 392 +++ .../run-milvus-k8s/prerequisite-helm.json | 1 + .../run-milvus-k8s/prerequisite-helm.md | 150 ++ localization/v2.5.x/site/ru/home/home.json | 1 + localization/v2.5.x/site/ru/home/home.md | 122 + .../integrations/RAG_with_pii_and_milvus.json | 1 + .../integrations/RAG_with_pii_and_milvus.md | 242 ++ .../ru/integrations/apify_milvus_rag.json | 1 + .../site/ru/integrations/apify_milvus_rag.md | 267 ++ .../build_RAG_with_milvus_and_cognee.json | 1 + .../build_RAG_with_milvus_and_cognee.md | 159 ++ .../build_RAG_with_milvus_and_deepseek.json | 1 + .../build_RAG_with_milvus_and_deepseek.md | 247 ++ .../build_RAG_with_milvus_and_fireworks.json | 1 + .../build_RAG_with_milvus_and_fireworks.md | 248 ++ .../build_RAG_with_milvus_and_gemini.json | 1 + .../build_RAG_with_milvus_and_gemini.md | 246 ++ .../build_RAG_with_milvus_and_lepton.json | 1 + .../build_RAG_with_milvus_and_lepton.md | 243 ++ .../build_RAG_with_milvus_and_ollama.json | 1 + .../build_RAG_with_milvus_and_ollama.md | 282 +++ ...build_RAG_with_milvus_and_siliconflow.json | 1 + .../build_RAG_with_milvus_and_siliconflow.md | 244 ++ .../ru/integrations/build_rag_on_arm.json | 1 + .../site/ru/integrations/build_rag_on_arm.md | 302 +++ .../ru/integrations/dify_with_milvus.json | 1 + .../site/ru/integrations/dify_with_milvus.md | 111 + .../evaluation_with_deepeval.json | 1 + .../integrations/evaluation_with_deepeval.md | 434 ++++ .../integrations/evaluation_with_phoenix.json | 1 + .../integrations/evaluation_with_phoenix.md | 474 ++++ .../integrations/integrate_with_airbyte.json | 1 + .../ru/integrations/integrate_with_airbyte.md | 248 ++ .../integrations/integrate_with_bentoml.json | 1 + .../ru/integrations/integrate_with_bentoml.md | 351 +++ .../ru/integrations/integrate_with_camel.json | 1 + .../ru/integrations/integrate_with_camel.md | 474 ++++ .../integrations/integrate_with_cohere.json | 1 + .../ru/integrations/integrate_with_cohere.md | 320 +++ .../ru/integrations/integrate_with_dspy.json | 1 + .../ru/integrations/integrate_with_dspy.md | 278 +++ .../integrations/integrate_with_fastgpt.json | 1 + .../ru/integrations/integrate_with_fastgpt.md | 145 ++ .../integrations/integrate_with_haystack.json | 1 + .../integrations/integrate_with_haystack.md | 256 ++ .../integrate_with_hugging-face.json | 1 + .../integrate_with_hugging-face.md | 246 ++ .../ru/integrations/integrate_with_jina.json | 1 + .../ru/integrations/integrate_with_jina.md | 307 +++ .../integrations/integrate_with_langfuse.json | 1 + .../integrations/integrate_with_langfuse.md | 180 ++ .../integrate_with_llamaindex.json | 1 + .../integrations/integrate_with_llamaindex.md | 203 ++ .../integrations/integrate_with_memgpt.json | 1 + .../ru/integrations/integrate_with_memgpt.md | 145 ++ .../integrations/integrate_with_openai.json | 1 + .../ru/integrations/integrate_with_openai.md | 157 ++ .../integrations/integrate_with_pytorch.json | 1 + .../ru/integrations/integrate_with_pytorch.md | 299 +++ .../ru/integrations/integrate_with_ragas.json | 1 + .../ru/integrations/integrate_with_ragas.md | 359 +++ .../integrate_with_sentencetransformers.json | 1 + .../integrate_with_sentencetransformers.md | 224 ++ .../integrations/integrate_with_snowpark.json | 1 + .../integrations/integrate_with_snowpark.md | 322 +++ .../ru/integrations/integrate_with_spark.json | 1 + .../ru/integrations/integrate_with_spark.md | 505 ++++ .../ru/integrations/integrate_with_vanna.json | 1 + .../ru/integrations/integrate_with_vanna.md | 369 +++ .../integrations/integrate_with_voxel51.json | 1 + .../ru/integrations/integrate_with_voxel51.md | 337 +++ .../integrations/integrate_with_voyageai.json | 1 + .../integrations/integrate_with_voyageai.md | 136 + .../integrations/integrate_with_whyhow.json | 1 + .../ru/integrations/integrate_with_whyhow.md | 218 ++ .../integrations/integrations_overview.json | 1 + .../ru/integrations/integrations_overview.md | 80 + .../ru/integrations/kafka-connect-milvus.json | 1 + .../ru/integrations/kafka-connect-milvus.md | 181 ++ .../knowledge_table_with_milvus.json | 1 + .../knowledge_table_with_milvus.md | 145 ++ .../ru/integrations/kotaemon_with_milvus.json | 1 + .../ru/integrations/kotaemon_with_milvus.md | 99 + .../langchain/basic_usage_langchain.json | 1 + .../langchain/basic_usage_langchain.md | 321 +++ .../langchain/integrate_with_langchain.json | 1 + .../langchain/integrate_with_langchain.md | 283 +++ .../milvus_hybrid_search_retriever.json | 1 + .../milvus_hybrid_search_retriever.md | 310 +++ .../integrations/llama_agents_metadata.json | 1 + .../ru/integrations/llama_agents_metadata.md | 784 ++++++ .../integrations/milvus_rag_with_dynamiq.json | 1 + .../integrations/milvus_rag_with_dynamiq.md | 340 +++ .../ru/integrations/milvus_rag_with_vllm.json | 1 + .../ru/integrations/milvus_rag_with_vllm.md | 386 +++ .../quickstart_mem0_with_milvus.json | 1 + .../quickstart_mem0_with_milvus.md | 218 ++ .../ru/integrations/rag_with_langflow.json | 1 + .../site/ru/integrations/rag_with_langflow.md | 84 + .../rag_with_milvus_and_unstructured.json | 1 + .../rag_with_milvus_and_unstructured.md | 289 +++ .../integrations/use_milvus_in_docsgpt.json | 1 + .../ru/integrations/use_milvus_in_docsgpt.md | 142 ++ .../use_milvus_in_private_gpt.json | 1 + .../integrations/use_milvus_in_private_gpt.md | 170 ++ .../use_milvus_with_sambanova.json | 1 + .../integrations/use_milvus_with_sambanova.md | 135 + ...deo_search_with_twelvelabs_and_milvus.json | 1 + ...video_search_with_twelvelabs_and_milvus.md | 463 ++++ .../v2.5.x/site/ru/menuStructure/ru.json | 2196 +++++++++++++++++ localization/v2.5.x/site/ru/migrate/es2m.json | 1 + localization/v2.5.x/site/ru/migrate/es2m.md | 267 ++ localization/v2.5.x/site/ru/migrate/f2m.json | 1 + localization/v2.5.x/site/ru/migrate/f2m.md | 209 ++ .../v2.5.x/site/ru/migrate/from-m2x.json | 1 + .../v2.5.x/site/ru/migrate/from-m2x.md | 220 ++ localization/v2.5.x/site/ru/migrate/m2m.json | 1 + localization/v2.5.x/site/ru/migrate/m2m.md | 242 ++ .../site/ru/migrate/migrate_overview.json | 1 + .../site/ru/migrate/migrate_overview.md | 120 + .../site/ru/migrate/milvusdm_install.json | 1 + .../site/ru/migrate/milvusdm_install.md | 91 + .../architecture/architecture_overview.json | 1 + .../architecture/architecture_overview.md | 54 + .../architecture/data_processing.json | 1 + .../reference/architecture/data_processing.md | 124 + .../reference/architecture/four_layers.json | 1 + .../ru/reference/architecture/four_layers.md | 123 + .../architecture/main_components.json | 1 + .../reference/architecture/main_components.md | 98 + .../v2.5.x/site/ru/reference/benchmark.json | 1 + .../v2.5.x/site/ru/reference/benchmark.md | 279 +++ .../v2.5.x/site/ru/reference/bitset.json | 1 + .../v2.5.x/site/ru/reference/bitset.md | 130 + .../site/ru/reference/coordinator_ha.json | 1 + .../site/ru/reference/coordinator_ha.md | 195 ++ .../v2.5.x/site/ru/reference/disk_index.json | 1 + .../v2.5.x/site/ru/reference/disk_index.md | 159 ++ .../v2.5.x/site/ru/reference/glossary.json | 1 + .../v2.5.x/site/ru/reference/glossary.md | 806 ++++++ .../v2.5.x/site/ru/reference/gpu_index.json | 1 + .../v2.5.x/site/ru/reference/gpu_index.md | 239 ++ .../v2.5.x/site/ru/reference/index.json | 1 + .../v2.5.x/site/ru/reference/index.md | 679 +++++ .../v2.5.x/site/ru/reference/knowhere.json | 1 + .../v2.5.x/site/ru/reference/knowhere.md | 179 ++ .../site/ru/reference/multi_tenancy.json | 1 + .../v2.5.x/site/ru/reference/multi_tenancy.md | 106 + .../v2.5.x/site/ru/reference/replica.json | 1 + .../v2.5.x/site/ru/reference/replica.md | 91 + .../site/ru/reference/scalar_index.json | 1 + .../v2.5.x/site/ru/reference/scalar_index.md | 165 ++ .../v2.5.x/site/ru/reference/schema.json | 1 + .../v2.5.x/site/ru/reference/schema.md | 252 ++ .../sys_config/configure_common.json | 1 + .../reference/sys_config/configure_common.md | 812 ++++++ .../sys_config/configure_datacoord.json | 1 + .../sys_config/configure_datacoord.md | 2009 +++++++++++++++ .../sys_config/configure_datanode.json | 1 + .../sys_config/configure_datanode.md | 1015 ++++++++ .../reference/sys_config/configure_etcd.json | 1 + .../ru/reference/sys_config/configure_etcd.md | 538 ++++ .../reference/sys_config/configure_gpu.json | 1 + .../ru/reference/sys_config/configure_gpu.md | 85 + .../reference/sys_config/configure_grpc.json | 1 + .../ru/reference/sys_config/configure_grpc.md | 50 + .../sys_config/configure_indexcoord.json | 1 + .../sys_config/configure_indexcoord.md | 50 + .../sys_config/configure_indexnode.json | 1 + .../sys_config/configure_indexnode.md | 224 ++ .../sys_config/configure_localstorage.json | 1 + .../sys_config/configure_localstorage.md | 53 + .../reference/sys_config/configure_log.json | 1 + .../ru/reference/sys_config/configure_log.md | 231 ++ .../sys_config/configure_metastore.json | 1 + .../sys_config/configure_metastore.md | 50 + .../reference/sys_config/configure_minio.json | 1 + .../reference/sys_config/configure_minio.md | 528 ++++ .../ru/reference/sys_config/configure_mq.json | 1 + .../ru/reference/sys_config/configure_mq.md | 262 ++ .../sys_config/configure_msgchannel.json | 1 + .../sys_config/configure_msgchannel.md | 316 +++ .../sys_config/configure_natsmq.json | 1 + .../reference/sys_config/configure_natsmq.md | 429 ++++ .../reference/sys_config/configure_proxy.json | 1 + .../reference/sys_config/configure_proxy.md | 1155 +++++++++ .../sys_config/configure_pulsar.json | 1 + .../reference/sys_config/configure_pulsar.md | 264 ++ .../sys_config/configure_querycoord.json | 1 + .../sys_config/configure_querycoord.md | 1300 ++++++++++ .../sys_config/configure_querynode.json | 1 + .../sys_config/configure_querynode.md | 1261 ++++++++++ .../sys_config/configure_quotaandlimits.json | 1 + .../sys_config/configure_quotaandlimits.md | 2137 ++++++++++++++++ .../sys_config/configure_rocksmq.json | 1 + .../reference/sys_config/configure_rocksmq.md | 247 ++ .../sys_config/configure_rootcoord.json | 1 + .../sys_config/configure_rootcoord.md | 375 +++ .../reference/sys_config/configure_tikv.json | 1 + .../ru/reference/sys_config/configure_tikv.md | 314 +++ .../reference/sys_config/configure_tls.json | 1 + .../ru/reference/sys_config/configure_tls.md | 22 + .../reference/sys_config/configure_trace.json | 1 + .../reference/sys_config/configure_trace.md | 200 ++ .../sys_config/system_configuration.json | 1 + .../sys_config/system_configuration.md | 129 + .../v2.5.x/site/ru/reference/time_sync.json | 1 + .../v2.5.x/site/ru/reference/time_sync.md | 161 ++ .../v2.5.x/site/ru/reference/timestamp.json | 1 + .../v2.5.x/site/ru/reference/timestamp.md | 109 + .../v2.5.x/site/ru/release_notes.json | 1 + localization/v2.5.x/site/ru/release_notes.md | 210 ++ .../site/ru/rerankers/rerankers-bge.json | 1 + .../v2.5.x/site/ru/rerankers/rerankers-bge.md | 78 + .../site/ru/rerankers/rerankers-cohere.json | 1 + .../site/ru/rerankers/rerankers-cohere.md | 79 + .../ru/rerankers/rerankers-cross-encoder.json | 1 + .../ru/rerankers/rerankers-cross-encoder.md | 79 + .../site/ru/rerankers/rerankers-jina.json | 1 + .../site/ru/rerankers/rerankers-jina.md | 78 + .../site/ru/rerankers/rerankers-overview.json | 1 + .../site/ru/rerankers/rerankers-overview.md | 210 ++ .../site/ru/rerankers/rerankers-voyage.json | 1 + .../site/ru/rerankers/rerankers-voyage.md | 79 + .../ru/tutorials/audio_similarity_search.json | 1 + .../ru/tutorials/audio_similarity_search.md | 36 + .../ru/tutorials/build-rag-with-milvus.json | 1 + .../ru/tutorials/build-rag-with-milvus.md | 250 ++ .../contextual_retrieval_with_milvus.json | 1 + .../contextual_retrieval_with_milvus.md | 621 +++++ .../dna_sequence_classification.json | 1 + .../tutorials/dna_sequence_classification.md | 36 + .../full_text_search_with_milvus.json | 1 + .../tutorials/full_text_search_with_milvus.md | 372 +++ .../funnel_search_with_matryoshka.json | 1 + .../funnel_search_with_matryoshka.md | 570 +++++ .../ru/tutorials/graph_rag_with_milvus.json | 1 + .../ru/tutorials/graph_rag_with_milvus.md | 509 ++++ .../hdbscan_clustering_with_milvus.json | 1 + .../hdbscan_clustering_with_milvus.md | 276 +++ .../ru/tutorials/how_to_enhance_your_rag.json | 1 + .../ru/tutorials/how_to_enhance_your_rag.md | 296 +++ .../tutorials/hybrid_search_with_milvus.json | 1 + .../ru/tutorials/hybrid_search_with_milvus.md | 313 +++ .../tutorials/image_deduplication_system.json | 1 + .../tutorials/image_deduplication_system.md | 35 + .../ru/tutorials/image_similarity_search.json | 1 + .../ru/tutorials/image_similarity_search.md | 263 ++ .../movie_recommendation_with_milvus.json | 1 + .../movie_recommendation_with_milvus.md | 299 +++ .../tutorials/multimodal_rag_with_milvus.json | 1 + .../tutorials/multimodal_rag_with_milvus.md | 424 ++++ .../tutorials/question_answering_system.json | 1 + .../ru/tutorials/question_answering_system.md | 44 + .../ru/tutorials/quickstart_with_attu.json | 1 + .../site/ru/tutorials/quickstart_with_attu.md | 242 ++ .../ru/tutorials/recommendation_system.json | 1 + .../ru/tutorials/recommendation_system.md | 36 + .../site/ru/tutorials/text_image_search.json | 1 + .../site/ru/tutorials/text_image_search.md | 39 + .../site/ru/tutorials/text_search_engine.json | 1 + .../site/ru/tutorials/text_search_engine.md | 39 + .../site/ru/tutorials/tutorials-overview.json | 1 + .../site/ru/tutorials/tutorials-overview.md | 52 + .../use-async-milvus-client-with-asyncio.json | 1 + .../use-async-milvus-client-with-asyncio.md | 416 ++++ .../ru/tutorials/use_ColPali_with_milvus.json | 1 + .../ru/tutorials/use_ColPali_with_milvus.md | 335 +++ .../ru/tutorials/vector_visualization.json | 1 + .../site/ru/tutorials/vector_visualization.md | 434 ++++ .../ru/tutorials/video_similarity_search.json | 1 + .../ru/tutorials/video_similarity_search.md | 40 + .../create-collection-instantly.json | 1 + .../create-collection-instantly.md | 341 +++ .../collections/create-collection.json | 1 + .../collections/create-collection.md | 760 ++++++ .../collections/drop-collection.json | 1 + .../userGuide/collections/drop-collection.md | 138 ++ .../collections/load-and-release.json | 1 + .../userGuide/collections/load-and-release.md | 411 +++ .../userGuide/collections/manage-aliases.json | 1 + .../userGuide/collections/manage-aliases.md | 542 ++++ .../collections/manage-collections.json | 1 + .../collections/manage-collections.md | 272 ++ .../collections/manage-partitions.json | 1 + .../collections/manage-partitions.md | 764 ++++++ .../collections/modify-collection.json | 1 + .../collections/modify-collection.md | 213 ++ .../collections/view-collections.json | 1 + .../userGuide/collections/view-collections.md | 202 ++ .../ru/userGuide/data-import/import-data.json | 1 + .../ru/userGuide/data-import/import-data.md | 401 +++ .../data-import/prepare-source-data.json | 1 + .../data-import/prepare-source-data.md | 633 +++++ .../insert-and-delete/delete-entities.json | 1 + .../insert-and-delete/delete-entities.md | 257 ++ .../insert-update-delete.json | 1 + .../insert-and-delete/insert-update-delete.md | 365 +++ .../insert-and-delete/upsert-entities.json | 1 + .../insert-and-delete/upsert-entities.md | 360 +++ .../ru/userGuide/manage-indexes/bitmap.json | 1 + .../ru/userGuide/manage-indexes/bitmap.md | 125 + .../manage-indexes/index-scalar-fields.json | 1 + .../manage-indexes/index-scalar-fields.md | 326 +++ .../manage-indexes/index-vector-fields.json | 1 + .../manage-indexes/index-vector-fields.md | 593 +++++ .../manage-indexes/index-with-gpu.json | 1 + .../manage-indexes/index-with-gpu.md | 233 ++ .../site/ru/userGuide/manage_databases.json | 1 + .../site/ru/userGuide/manage_databases.md | 597 +++++ .../schema/analyzer/analyzer-overview.json | 1 + .../schema/analyzer/analyzer-overview.md | 585 +++++ .../analyzer/analyzer/chinese-analyzer.json | 1 + .../analyzer/analyzer/chinese-analyzer.md | 50 + .../analyzer/analyzer/english-analyzer.json | 1 + .../analyzer/analyzer/english-analyzer.md | 74 + .../analyzer/analyzer/standard-analyzer.json | 1 + .../analyzer/analyzer/standard-analyzer.md | 107 + .../analyzer/filter/alphanumonly-filter.json | 1 + .../analyzer/filter/alphanumonly-filter.md | 70 + .../analyzer/filter/ascii-folding-filter.json | 1 + .../analyzer/filter/ascii-folding-filter.md | 68 + .../filter/cnalphanumonly-filter.json | 1 + .../analyzer/filter/cnalphanumonly-filter.md | 69 + .../analyzer/filter/cncharonly-filter.json | 1 + .../analyzer/filter/cncharonly-filter.md | 68 + .../analyzer/filter/decompounder-filter.json | 1 + .../analyzer/filter/decompounder-filter.md | 79 + .../schema/analyzer/filter/length-filter.json | 1 + .../schema/analyzer/filter/length-filter.md | 78 + .../analyzer/filter/lowercase-filter.json | 1 + .../analyzer/filter/lowercase-filter.md | 68 + .../analyzer/filter/stemmer-filter.json | 1 + .../schema/analyzer/filter/stemmer-filter.md | 78 + .../schema/analyzer/filter/stop-filter.json | 1 + .../schema/analyzer/filter/stop-filter.md | 78 + .../analyzer/tokenizer/jieba-tokenizer.json | 1 + .../analyzer/tokenizer/jieba-tokenizer.md | 66 + .../tokenizer/standard-tokenizer.json | 1 + .../analyzer/tokenizer/standard-tokenizer.md | 77 + .../tokenizer/whitespace-tokenizer.json | 1 + .../tokenizer/whitespace-tokenizer.md | 72 + .../ru/userGuide/schema/array_data_type.json | 1 + .../ru/userGuide/schema/array_data_type.md | 631 +++++ .../ru/userGuide/schema/binary-vector.json | 1 + .../site/ru/userGuide/schema/binary-vector.md | 445 ++++ .../ru/userGuide/schema/dense-vector.json | 1 + .../site/ru/userGuide/schema/dense-vector.md | 434 ++++ .../schema/enable-dynamic-field.json | 1 + .../userGuide/schema/enable-dynamic-field.md | 382 +++ .../schema/nullable-and-default.json | 1 + .../userGuide/schema/nullable-and-default.md | 878 +++++++ .../site/ru/userGuide/schema/number.json | 1 + .../v2.5.x/site/ru/userGuide/schema/number.md | 568 +++++ .../ru/userGuide/schema/primary-field.json | 1 + .../site/ru/userGuide/schema/primary-field.md | 195 ++ .../ru/userGuide/schema/schema-hands-on.json | 1 + .../ru/userGuide/schema/schema-hands-on.md | 271 ++ .../site/ru/userGuide/schema/schema.json | 1 + .../v2.5.x/site/ru/userGuide/schema/schema.md | 453 ++++ .../ru/userGuide/schema/sparse_vector.json | 1 + .../site/ru/userGuide/schema/sparse_vector.md | 537 ++++ .../site/ru/userGuide/schema/string.json | 1 + .../v2.5.x/site/ru/userGuide/schema/string.md | 560 +++++ .../ru/userGuide/schema/use-json-fields.json | 1 + .../ru/userGuide/schema/use-json-fields.md | 524 ++++ .../boolean/array-operators.json | 1 + .../boolean/array-operators.md | 136 + .../boolean/basic-operators.json | 1 + .../boolean/basic-operators.md | 236 ++ .../search-query-get/boolean/boolean.json | 1 + .../search-query-get/boolean/boolean.md | 148 ++ .../boolean/filtering-templating.json | 1 + .../boolean/filtering-templating.md | 155 ++ .../boolean/json-operators.json | 1 + .../boolean/json-operators.md | 122 + .../clustering-compaction.json | 1 + .../search-query-get/clustering-compaction.md | 273 ++ .../search-query-get/consistency.json | 1 + .../userGuide/search-query-get/consistency.md | 211 ++ .../search-query-get/filtered-search.json | 1 + .../search-query-get/filtered-search.md | 257 ++ .../search-query-get/full-text-search.json | 1 + .../search-query-get/full-text-search.md | 501 ++++ .../get-and-scalar-query.json | 1 + .../search-query-get/get-and-scalar-query.md | 587 +++++ .../search-query-get/grouping-search.json | 1 + .../search-query-get/grouping-search.md | 366 +++ .../search-query-get/keyword-match.json | 1 + .../search-query-get/keyword-match.md | 431 ++++ .../ru/userGuide/search-query-get/metric.json | 1 + .../ru/userGuide/search-query-get/metric.md | 252 ++ .../ru/userGuide/search-query-get/mmap.json | 1 + .../ru/userGuide/search-query-get/mmap.md | 190 ++ .../search-query-get/multi-vector-search.json | 1 + .../search-query-get/multi-vector-search.md | 683 +++++ .../search-query-get/range-search.json | 1 + .../search-query-get/range-search.md | 214 ++ .../userGuide/search-query-get/reranking.json | 1 + .../userGuide/search-query-get/reranking.md | 122 + .../single-vector-search.json | 1 + .../search-query-get/single-vector-search.md | 919 +++++++ .../search-query-get/use-partition-key.json | 1 + .../search-query-get/use-partition-key.md | 245 ++ .../search-query-get/with-iterators.json | 1 + .../search-query-get/with-iterators.md | 163 ++ .../tools/birdwatcher_install_guides.json | 1 + .../tools/birdwatcher_install_guides.md | 118 + .../userGuide/tools/birdwatcher_overview.json | 1 + .../userGuide/tools/birdwatcher_overview.md | 77 + .../tools/birdwatcher_usage_guides.json | 1 + .../tools/birdwatcher_usage_guides.md | 406 +++ .../site/ru/userGuide/tools/cli_commands.json | 1 + .../site/ru/userGuide/tools/cli_commands.md | 1530 ++++++++++++ .../site/ru/userGuide/tools/cli_overview.json | 1 + .../site/ru/userGuide/tools/cli_overview.md | 79 + .../site/ru/userGuide/tools/install_cli.json | 1 + .../site/ru/userGuide/tools/install_cli.md | 100 + .../cross-bucket-backup-and-restore.json | 1 + .../cross-bucket-backup-and-restore.md | 203 ++ .../multi-storage-backup-and-restore.json | 1 + .../multi-storage-backup-and-restore.md | 246 ++ .../shared-bucket-backup-and-restore.json | 1 + .../shared-bucket-backup-and-restore.md | 199 ++ .../single-instance-backup-and-restore.json | 1 + .../single-instance-backup-and-restore.md | 142 ++ .../milvus-backup/milvus_backup_api.json | 1 + .../tools/milvus-backup/milvus_backup_api.md | 230 ++ .../milvus-backup/milvus_backup_cli.json | 1 + .../tools/milvus-backup/milvus_backup_cli.md | 180 ++ .../milvus-backup/milvus_backup_overview.json | 1 + .../milvus-backup/milvus_backup_overview.md | 83 + .../tools/milvus-cdc/cdc-monitoring.json | 1 + .../tools/milvus-cdc/cdc-monitoring.md | 44 + .../tools/milvus-cdc/deploy-cdc-server.json | 1 + .../tools/milvus-cdc/deploy-cdc-server.md | 156 ++ .../tools/milvus-cdc/manage-cdc-tasks.json | 1 + .../tools/milvus-cdc/manage-cdc-tasks.md | 275 +++ .../tools/milvus-cdc/milvus-cdc-overview.json | 1 + .../tools/milvus-cdc/milvus-cdc-overview.md | 125 + .../site/ru/userGuide/tools/milvus-webui.json | 1 + .../site/ru/userGuide/tools/milvus-webui.md | 290 +++ .../v2.5.x/site/zh-hant/about/comparison.json | 1 + .../v2.5.x/site/zh-hant/about/comparison.md | 159 ++ .../site/zh-hant/about/limitations.json | 1 + .../v2.5.x/site/zh-hant/about/limitations.md | 260 ++ .../site/zh-hant/about/milvus_adopters.json | 1 + .../site/zh-hant/about/milvus_adopters.md | 27 + .../v2.5.x/site/zh-hant/about/overview.json | 1 + .../v2.5.x/site/zh-hant/about/overview.md | 177 ++ .../v2.5.x/site/zh-hant/about/roadmap.json | 1 + .../v2.5.x/site/zh-hant/about/roadmap.md | 107 + .../site/zh-hant/adminGuide/allocate.json | 1 + .../site/zh-hant/adminGuide/allocate.md | 141 ++ .../site/zh-hant/adminGuide/authenticate.json | 1 + .../site/zh-hant/adminGuide/authenticate.md | 277 +++ .../site/zh-hant/adminGuide/chunk_cache.json | 1 + .../site/zh-hant/adminGuide/chunk_cache.md | 77 + .../zh-hant/adminGuide/clouds/aws/aws.json | 1 + .../site/zh-hant/adminGuide/clouds/aws/aws.md | 494 ++++ .../adminGuide/clouds/aws/aws_layer7.json | 1 + .../adminGuide/clouds/aws/aws_layer7.md | 107 + .../zh-hant/adminGuide/clouds/aws/eks.json | 1 + .../site/zh-hant/adminGuide/clouds/aws/eks.md | 518 ++++ .../zh-hant/adminGuide/clouds/aws/s3.json | 1 + .../site/zh-hant/adminGuide/clouds/aws/s3.md | 341 +++ .../zh-hant/adminGuide/clouds/azure/abs.json | 1 + .../zh-hant/adminGuide/clouds/azure/abs.md | 149 ++ .../adminGuide/clouds/azure/azure.json | 1 + .../zh-hant/adminGuide/clouds/azure/azure.md | 299 +++ .../adminGuide/clouds/azure/ingress.json | 1 + .../adminGuide/clouds/azure/ingress.md | 235 ++ .../zh-hant/adminGuide/clouds/gcp/gcp.json | 1 + .../site/zh-hant/adminGuide/clouds/gcp/gcp.md | 287 +++ .../adminGuide/clouds/gcp/gcp_layer7.json | 1 + .../adminGuide/clouds/gcp/gcp_layer7.md | 213 ++ .../zh-hant/adminGuide/clouds/gcp/gcs.json | 1 + .../site/zh-hant/adminGuide/clouds/gcp/gcs.md | 151 ++ .../clouds/openshift/openshift.json | 1 + .../adminGuide/clouds/openshift/openshift.md | 183 ++ .../adminGuide/config_jaeger_tracing.json | 1 + .../adminGuide/config_jaeger_tracing.md | 146 ++ .../zh-hant/adminGuide/configure-docker.json | 1 + .../zh-hant/adminGuide/configure-docker.md | 296 +++ .../zh-hant/adminGuide/configure-helm.json | 1 + .../site/zh-hant/adminGuide/configure-helm.md | 250 ++ .../configure-querynode-localdisk.json | 1 + .../configure-querynode-localdisk.md | 282 +++ .../adminGuide/configure_access_logs.json | 1 + .../adminGuide/configure_access_logs.md | 175 ++ .../adminGuide/configure_operator.json | 1 + .../zh-hant/adminGuide/configure_operator.md | 336 +++ .../zh-hant/adminGuide/connect_kafka_ssl.json | 1 + .../zh-hant/adminGuide/connect_kafka_ssl.md | 617 +++++ .../site/zh-hant/adminGuide/deploy_etcd.json | 1 + .../site/zh-hant/adminGuide/deploy_etcd.md | 136 + .../zh-hant/adminGuide/deploy_pulsar.json | 1 + .../site/zh-hant/adminGuide/deploy_pulsar.md | 240 ++ .../site/zh-hant/adminGuide/deploy_s3.json | 1 + .../site/zh-hant/adminGuide/deploy_s3.md | 132 + .../zh-hant/adminGuide/drop_users_roles.json | 1 + .../zh-hant/adminGuide/drop_users_roles.md | 202 ++ .../zh-hant/adminGuide/dynamic_config.json | 1 + .../site/zh-hant/adminGuide/dynamic_config.md | 208 ++ .../zh-hant/adminGuide/grant_privileges.json | 1 + .../zh-hant/adminGuide/grant_privileges.md | 540 ++++ .../site/zh-hant/adminGuide/grant_roles.json | 1 + .../site/zh-hant/adminGuide/grant_roles.md | 201 ++ .../adminGuide/limit_collection_counts.json | 1 + .../adminGuide/limit_collection_counts.md | 72 + .../adminGuide/message_storage_operator.json | 1 + .../adminGuide/message_storage_operator.md | 348 +++ .../adminGuide/meta_storage_operator.json | 1 + .../adminGuide/meta_storage_operator.md | 117 + .../zh-hant/adminGuide/monitor/alert.json | 1 + .../site/zh-hant/adminGuide/monitor/alert.md | 132 + .../monitor/configure_grafana_loki.json | 1 + .../monitor/configure_grafana_loki.md | 172 ++ .../adminGuide/monitor/metrics_dashboard.json | 1 + .../adminGuide/monitor/metrics_dashboard.md | 196 ++ .../zh-hant/adminGuide/monitor/monitor.json | 1 + .../zh-hant/adminGuide/monitor/monitor.md | 134 + .../adminGuide/monitor/monitor_overview.json | 1 + .../adminGuide/monitor/monitor_overview.md | 111 + .../zh-hant/adminGuide/monitor/visualize.json | 1 + .../zh-hant/adminGuide/monitor/visualize.md | 100 + .../adminGuide/object_storage_operator.json | 1 + .../adminGuide/object_storage_operator.md | 230 ++ .../zh-hant/adminGuide/privilege_group.json | 1 + .../zh-hant/adminGuide/privilege_group.md | 489 ++++ .../v2.5.x/site/zh-hant/adminGuide/rbac.json | 1 + .../v2.5.x/site/zh-hant/adminGuide/rbac.md | 76 + .../zh-hant/adminGuide/resource_group.json | 1 + .../site/zh-hant/adminGuide/resource_group.md | 353 +++ .../adminGuide/scale-dependencies.json | 1 + .../zh-hant/adminGuide/scale-dependencies.md | 252 ++ .../site/zh-hant/adminGuide/scaleout.json | 1 + .../site/zh-hant/adminGuide/scaleout.md | 181 ++ .../v2.5.x/site/zh-hant/adminGuide/tls.json | 1 + .../v2.5.x/site/zh-hant/adminGuide/tls.md | 449 ++++ .../zh-hant/adminGuide/upgrade-pulsar-v3.json | 1 + .../zh-hant/adminGuide/upgrade-pulsar-v3.md | 425 ++++ .../upgrade_milvus_cluster-docker.json | 1 + .../upgrade_milvus_cluster-docker.md | 154 ++ .../upgrade_milvus_cluster-helm.json | 1 + .../adminGuide/upgrade_milvus_cluster-helm.md | 281 +++ .../upgrade_milvus_cluster-operator.json | 1 + .../upgrade_milvus_cluster-operator.md | 179 ++ .../upgrade_milvus_standalone-docker.json | 1 + .../upgrade_milvus_standalone-docker.md | 132 + .../upgrade_milvus_standalone-helm.json | 1 + .../upgrade_milvus_standalone-helm.md | 259 ++ .../upgrade_milvus_standalone-operator.json | 1 + .../upgrade_milvus_standalone-operator.md | 181 ++ .../zh-hant/adminGuide/use-pulsar-v2.json | 1 + .../site/zh-hant/adminGuide/use-pulsar-v2.md | 138 ++ .../zh-hant/adminGuide/users_and_roles.json | 1 + .../zh-hant/adminGuide/users_and_roles.md | 258 ++ .../zh-hant/embeddings/embed-with-bgm-m3.json | 1 + .../zh-hant/embeddings/embed-with-bgm-m3.md | 91 + .../zh-hant/embeddings/embed-with-bm25.json | 1 + .../zh-hant/embeddings/embed-with-bm25.md | 110 + .../zh-hant/embeddings/embed-with-cohere.json | 1 + .../zh-hant/embeddings/embed-with-cohere.md | 104 + .../embeddings/embed-with-instructor.json | 1 + .../embeddings/embed-with-instructor.md | 90 + .../zh-hant/embeddings/embed-with-jina.json | 1 + .../zh-hant/embeddings/embed-with-jina.md | 128 + .../zh-hant/embeddings/embed-with-mgte.json | 1 + .../zh-hant/embeddings/embed-with-mgte.md | 88 + .../embeddings/embed-with-mistral-ai.json | 1 + .../embeddings/embed-with-mistral-ai.md | 78 + .../zh-hant/embeddings/embed-with-nomic.json | 1 + .../zh-hant/embeddings/embed-with-nomic.md | 87 + .../zh-hant/embeddings/embed-with-openai.json | 1 + .../zh-hant/embeddings/embed-with-openai.md | 89 + .../embed-with-sentence-transform.json | 1 + .../embed-with-sentence-transform.md | 86 + .../zh-hant/embeddings/embed-with-splade.json | 1 + .../zh-hant/embeddings/embed-with-splade.md | 87 + .../zh-hant/embeddings/embed-with-voyage.json | 1 + .../zh-hant/embeddings/embed-with-voyage.md | 75 + .../site/zh-hant/embeddings/embeddings.json | 1 + .../site/zh-hant/embeddings/embeddings.md | 143 ++ .../site/zh-hant/faq/operational_faq.json | 1 + .../site/zh-hant/faq/operational_faq.md | 107 + .../site/zh-hant/faq/performance_faq.json | 1 + .../site/zh-hant/faq/performance_faq.md | 49 + .../v2.5.x/site/zh-hant/faq/product_faq.json | 1 + .../v2.5.x/site/zh-hant/faq/product_faq.md | 100 + .../site/zh-hant/faq/troubleshooting.json | 1 + .../site/zh-hant/faq/troubleshooting.md | 112 + .../zh-hant/getstarted/install-overview.json | 1 + .../zh-hant/getstarted/install-overview.md | 137 + .../getstarted/install_SDKs/install-go.json | 1 + .../getstarted/install_SDKs/install-go.md | 83 + .../getstarted/install_SDKs/install-java.json | 1 + .../getstarted/install_SDKs/install-java.md | 100 + .../getstarted/install_SDKs/install-node.json | 1 + .../getstarted/install_SDKs/install-node.md | 118 + .../install_SDKs/install-pymilvus.json | 1 + .../install_SDKs/install-pymilvus.md | 109 + .../site/zh-hant/getstarted/milvus_lite.json | 1 + .../site/zh-hant/getstarted/milvus_lite.md | 412 ++++ .../site/zh-hant/getstarted/quickstart.json | 1 + .../site/zh-hant/getstarted/quickstart.md | 408 +++ .../install_standalone-docker-compose.json | 1 + .../install_standalone-docker-compose.md | 155 ++ .../install_standalone-docker.json | 1 + .../install_standalone-docker.md | 142 ++ .../install_standalone-windows.json | 1 + .../install_standalone-windows.md | 301 +++ .../prerequisite-docker.json | 1 + .../run-milvus-docker/prerequisite-docker.md | 111 + .../install_cluster-helm-gpu.json | 1 + .../install_cluster-helm-gpu.md | 378 +++ ...install_standalone-docker-compose-gpu.json | 1 + .../install_standalone-docker-compose-gpu.md | 224 ++ .../run-milvus-gpu/prerequisite-gpu.json | 1 + .../run-milvus-gpu/prerequisite-gpu.md | 149 ++ .../run-milvus-k8s/install_cluster-helm.json | 1 + .../run-milvus-k8s/install_cluster-helm.md | 335 +++ .../install_cluster-milvusoperator.json | 1 + .../install_cluster-milvusoperator.md | 392 +++ .../run-milvus-k8s/prerequisite-helm.json | 1 + .../run-milvus-k8s/prerequisite-helm.md | 148 ++ .../v2.5.x/site/zh-hant/home/home.json | 1 + localization/v2.5.x/site/zh-hant/home/home.md | 122 + .../integrations/RAG_with_pii_and_milvus.json | 1 + .../integrations/RAG_with_pii_and_milvus.md | 240 ++ .../integrations/apify_milvus_rag.json | 1 + .../zh-hant/integrations/apify_milvus_rag.md | 262 ++ .../build_RAG_with_milvus_and_cognee.json | 1 + .../build_RAG_with_milvus_and_cognee.md | 157 ++ .../build_RAG_with_milvus_and_deepseek.json | 1 + .../build_RAG_with_milvus_and_deepseek.md | 247 ++ .../build_RAG_with_milvus_and_fireworks.json | 1 + .../build_RAG_with_milvus_and_fireworks.md | 248 ++ .../build_RAG_with_milvus_and_gemini.json | 1 + .../build_RAG_with_milvus_and_gemini.md | 244 ++ .../build_RAG_with_milvus_and_lepton.json | 1 + .../build_RAG_with_milvus_and_lepton.md | 241 ++ .../build_RAG_with_milvus_and_ollama.json | 1 + .../build_RAG_with_milvus_and_ollama.md | 281 +++ ...build_RAG_with_milvus_and_siliconflow.json | 1 + .../build_RAG_with_milvus_and_siliconflow.md | 244 ++ .../integrations/build_rag_on_arm.json | 1 + .../zh-hant/integrations/build_rag_on_arm.md | 299 +++ .../integrations/dify_with_milvus.json | 1 + .../zh-hant/integrations/dify_with_milvus.md | 109 + .../evaluation_with_deepeval.json | 1 + .../integrations/evaluation_with_deepeval.md | 432 ++++ .../integrations/evaluation_with_phoenix.json | 1 + .../integrations/evaluation_with_phoenix.md | 472 ++++ .../integrations/integrate_with_airbyte.json | 1 + .../integrations/integrate_with_airbyte.md | 244 ++ .../integrations/integrate_with_bentoml.json | 1 + .../integrations/integrate_with_bentoml.md | 348 +++ .../integrations/integrate_with_camel.json | 1 + .../integrations/integrate_with_camel.md | 472 ++++ .../integrations/integrate_with_cohere.json | 1 + .../integrations/integrate_with_cohere.md | 317 +++ .../integrations/integrate_with_dspy.json | 1 + .../integrations/integrate_with_dspy.md | 276 +++ .../integrations/integrate_with_fastgpt.json | 1 + .../integrations/integrate_with_fastgpt.md | 143 ++ .../integrations/integrate_with_haystack.json | 1 + .../integrations/integrate_with_haystack.md | 254 ++ .../integrate_with_hugging-face.json | 1 + .../integrate_with_hugging-face.md | 242 ++ .../integrations/integrate_with_jina.json | 1 + .../integrations/integrate_with_jina.md | 305 +++ .../integrations/integrate_with_langfuse.json | 1 + .../integrations/integrate_with_langfuse.md | 177 ++ .../integrate_with_llamaindex.json | 1 + .../integrations/integrate_with_llamaindex.md | 201 ++ .../integrations/integrate_with_memgpt.json | 1 + .../integrations/integrate_with_memgpt.md | 142 ++ .../integrations/integrate_with_openai.json | 1 + .../integrations/integrate_with_openai.md | 155 ++ .../integrations/integrate_with_pytorch.json | 1 + .../integrations/integrate_with_pytorch.md | 297 +++ .../integrations/integrate_with_ragas.json | 1 + .../integrations/integrate_with_ragas.md | 357 +++ .../integrate_with_sentencetransformers.json | 1 + .../integrate_with_sentencetransformers.md | 224 ++ .../integrations/integrate_with_snowpark.json | 1 + .../integrations/integrate_with_snowpark.md | 320 +++ .../integrations/integrate_with_spark.json | 1 + .../integrations/integrate_with_spark.md | 505 ++++ .../integrations/integrate_with_vanna.json | 1 + .../integrations/integrate_with_vanna.md | 367 +++ .../integrations/integrate_with_voxel51.json | 1 + .../integrations/integrate_with_voxel51.md | 337 +++ .../integrations/integrate_with_voyageai.json | 1 + .../integrations/integrate_with_voyageai.md | 134 + .../integrations/integrate_with_whyhow.json | 1 + .../integrations/integrate_with_whyhow.md | 216 ++ .../integrations/integrations_overview.json | 1 + .../integrations/integrations_overview.md | 78 + .../integrations/kafka-connect-milvus.json | 1 + .../integrations/kafka-connect-milvus.md | 179 ++ .../knowledge_table_with_milvus.json | 1 + .../knowledge_table_with_milvus.md | 144 ++ .../integrations/kotaemon_with_milvus.json | 1 + .../integrations/kotaemon_with_milvus.md | 97 + .../langchain/basic_usage_langchain.json | 1 + .../langchain/basic_usage_langchain.md | 319 +++ .../langchain/integrate_with_langchain.json | 1 + .../langchain/integrate_with_langchain.md | 281 +++ .../milvus_hybrid_search_retriever.json | 1 + .../milvus_hybrid_search_retriever.md | 308 +++ .../integrations/llama_agents_metadata.json | 1 + .../integrations/llama_agents_metadata.md | 782 ++++++ .../integrations/milvus_rag_with_dynamiq.json | 1 + .../integrations/milvus_rag_with_dynamiq.md | 336 +++ .../integrations/milvus_rag_with_vllm.json | 1 + .../integrations/milvus_rag_with_vllm.md | 383 +++ .../quickstart_mem0_with_milvus.json | 1 + .../quickstart_mem0_with_milvus.md | 214 ++ .../integrations/rag_with_langflow.json | 1 + .../zh-hant/integrations/rag_with_langflow.md | 82 + .../rag_with_milvus_and_unstructured.json | 1 + .../rag_with_milvus_and_unstructured.md | 287 +++ .../integrations/use_milvus_in_docsgpt.json | 1 + .../integrations/use_milvus_in_docsgpt.md | 140 ++ .../use_milvus_in_private_gpt.json | 1 + .../integrations/use_milvus_in_private_gpt.md | 168 ++ .../use_milvus_with_sambanova.json | 1 + .../integrations/use_milvus_with_sambanova.md | 133 + ...deo_search_with_twelvelabs_and_milvus.json | 1 + ...video_search_with_twelvelabs_and_milvus.md | 457 ++++ .../site/zh-hant/menuStructure/zh-hant.json | 2196 +++++++++++++++++ .../v2.5.x/site/zh-hant/migrate/es2m.json | 1 + .../v2.5.x/site/zh-hant/migrate/es2m.md | 265 ++ .../v2.5.x/site/zh-hant/migrate/f2m.json | 1 + .../v2.5.x/site/zh-hant/migrate/f2m.md | 209 ++ .../v2.5.x/site/zh-hant/migrate/from-m2x.json | 1 + .../v2.5.x/site/zh-hant/migrate/from-m2x.md | 218 ++ .../v2.5.x/site/zh-hant/migrate/m2m.json | 1 + .../v2.5.x/site/zh-hant/migrate/m2m.md | 240 ++ .../zh-hant/migrate/migrate_overview.json | 1 + .../site/zh-hant/migrate/migrate_overview.md | 118 + .../zh-hant/migrate/milvusdm_install.json | 1 + .../site/zh-hant/migrate/milvusdm_install.md | 91 + .../architecture/architecture_overview.json | 1 + .../architecture/architecture_overview.md | 52 + .../architecture/data_processing.json | 1 + .../reference/architecture/data_processing.md | 124 + .../reference/architecture/four_layers.json | 1 + .../reference/architecture/four_layers.md | 123 + .../architecture/main_components.json | 1 + .../reference/architecture/main_components.md | 98 + .../site/zh-hant/reference/benchmark.json | 1 + .../site/zh-hant/reference/benchmark.md | 279 +++ .../v2.5.x/site/zh-hant/reference/bitset.json | 1 + .../v2.5.x/site/zh-hant/reference/bitset.md | 130 + .../zh-hant/reference/coordinator_ha.json | 1 + .../site/zh-hant/reference/coordinator_ha.md | 193 ++ .../site/zh-hant/reference/disk_index.json | 1 + .../site/zh-hant/reference/disk_index.md | 159 ++ .../site/zh-hant/reference/glossary.json | 1 + .../v2.5.x/site/zh-hant/reference/glossary.md | 806 ++++++ .../site/zh-hant/reference/gpu_index.json | 1 + .../site/zh-hant/reference/gpu_index.md | 239 ++ .../v2.5.x/site/zh-hant/reference/index.json | 1 + .../v2.5.x/site/zh-hant/reference/index.md | 679 +++++ .../site/zh-hant/reference/knowhere.json | 1 + .../v2.5.x/site/zh-hant/reference/knowhere.md | 179 ++ .../site/zh-hant/reference/multi_tenancy.json | 1 + .../site/zh-hant/reference/multi_tenancy.md | 106 + .../site/zh-hant/reference/replica.json | 1 + .../v2.5.x/site/zh-hant/reference/replica.md | 91 + .../site/zh-hant/reference/scalar_index.json | 1 + .../site/zh-hant/reference/scalar_index.md | 165 ++ .../v2.5.x/site/zh-hant/reference/schema.json | 1 + .../v2.5.x/site/zh-hant/reference/schema.md | 252 ++ .../sys_config/configure_common.json | 1 + .../reference/sys_config/configure_common.md | 812 ++++++ .../sys_config/configure_datacoord.json | 1 + .../sys_config/configure_datacoord.md | 2009 +++++++++++++++ .../sys_config/configure_datanode.json | 1 + .../sys_config/configure_datanode.md | 1015 ++++++++ .../reference/sys_config/configure_etcd.json | 1 + .../reference/sys_config/configure_etcd.md | 538 ++++ .../reference/sys_config/configure_gpu.json | 1 + .../reference/sys_config/configure_gpu.md | 85 + .../reference/sys_config/configure_grpc.json | 1 + .../reference/sys_config/configure_grpc.md | 50 + .../sys_config/configure_indexcoord.json | 1 + .../sys_config/configure_indexcoord.md | 50 + .../sys_config/configure_indexnode.json | 1 + .../sys_config/configure_indexnode.md | 224 ++ .../sys_config/configure_localstorage.json | 1 + .../sys_config/configure_localstorage.md | 53 + .../reference/sys_config/configure_log.json | 1 + .../reference/sys_config/configure_log.md | 231 ++ .../sys_config/configure_metastore.json | 1 + .../sys_config/configure_metastore.md | 50 + .../reference/sys_config/configure_minio.json | 1 + .../reference/sys_config/configure_minio.md | 528 ++++ .../reference/sys_config/configure_mq.json | 1 + .../reference/sys_config/configure_mq.md | 262 ++ .../sys_config/configure_msgchannel.json | 1 + .../sys_config/configure_msgchannel.md | 316 +++ .../sys_config/configure_natsmq.json | 1 + .../reference/sys_config/configure_natsmq.md | 429 ++++ .../reference/sys_config/configure_proxy.json | 1 + .../reference/sys_config/configure_proxy.md | 1155 +++++++++ .../sys_config/configure_pulsar.json | 1 + .../reference/sys_config/configure_pulsar.md | 264 ++ .../sys_config/configure_querycoord.json | 1 + .../sys_config/configure_querycoord.md | 1300 ++++++++++ .../sys_config/configure_querynode.json | 1 + .../sys_config/configure_querynode.md | 1261 ++++++++++ .../sys_config/configure_quotaandlimits.json | 1 + .../sys_config/configure_quotaandlimits.md | 2137 ++++++++++++++++ .../sys_config/configure_rocksmq.json | 1 + .../reference/sys_config/configure_rocksmq.md | 247 ++ .../sys_config/configure_rootcoord.json | 1 + .../sys_config/configure_rootcoord.md | 375 +++ .../reference/sys_config/configure_tikv.json | 1 + .../reference/sys_config/configure_tikv.md | 314 +++ .../reference/sys_config/configure_tls.json | 1 + .../reference/sys_config/configure_tls.md | 22 + .../reference/sys_config/configure_trace.json | 1 + .../reference/sys_config/configure_trace.md | 200 ++ .../sys_config/system_configuration.json | 1 + .../sys_config/system_configuration.md | 129 + .../site/zh-hant/reference/time_sync.json | 1 + .../site/zh-hant/reference/time_sync.md | 161 ++ .../site/zh-hant/reference/timestamp.json | 1 + .../site/zh-hant/reference/timestamp.md | 107 + .../v2.5.x/site/zh-hant/release_notes.json | 1 + .../v2.5.x/site/zh-hant/release_notes.md | 210 ++ .../site/zh-hant/rerankers/rerankers-bge.json | 1 + .../site/zh-hant/rerankers/rerankers-bge.md | 76 + .../zh-hant/rerankers/rerankers-cohere.json | 1 + .../zh-hant/rerankers/rerankers-cohere.md | 78 + .../rerankers/rerankers-cross-encoder.json | 1 + .../rerankers/rerankers-cross-encoder.md | 78 + .../zh-hant/rerankers/rerankers-jina.json | 1 + .../site/zh-hant/rerankers/rerankers-jina.md | 75 + .../zh-hant/rerankers/rerankers-overview.json | 1 + .../zh-hant/rerankers/rerankers-overview.md | 208 ++ .../zh-hant/rerankers/rerankers-voyage.json | 1 + .../zh-hant/rerankers/rerankers-voyage.md | 78 + .../tutorials/audio_similarity_search.json | 1 + .../tutorials/audio_similarity_search.md | 36 + .../tutorials/build-rag-with-milvus.json | 1 + .../tutorials/build-rag-with-milvus.md | 250 ++ .../contextual_retrieval_with_milvus.json | 1 + .../contextual_retrieval_with_milvus.md | 617 +++++ .../dna_sequence_classification.json | 1 + .../tutorials/dna_sequence_classification.md | 36 + .../full_text_search_with_milvus.json | 1 + .../tutorials/full_text_search_with_milvus.md | 368 +++ .../funnel_search_with_matryoshka.json | 1 + .../funnel_search_with_matryoshka.md | 568 +++++ .../tutorials/graph_rag_with_milvus.json | 1 + .../tutorials/graph_rag_with_milvus.md | 509 ++++ .../hdbscan_clustering_with_milvus.json | 1 + .../hdbscan_clustering_with_milvus.md | 273 ++ .../tutorials/how_to_enhance_your_rag.json | 1 + .../tutorials/how_to_enhance_your_rag.md | 293 +++ .../tutorials/hybrid_search_with_milvus.json | 1 + .../tutorials/hybrid_search_with_milvus.md | 313 +++ .../tutorials/image_deduplication_system.json | 1 + .../tutorials/image_deduplication_system.md | 35 + .../tutorials/image_similarity_search.json | 1 + .../tutorials/image_similarity_search.md | 263 ++ .../movie_recommendation_with_milvus.json | 1 + .../movie_recommendation_with_milvus.md | 295 +++ .../tutorials/multimodal_rag_with_milvus.json | 1 + .../tutorials/multimodal_rag_with_milvus.md | 424 ++++ .../tutorials/question_answering_system.json | 1 + .../tutorials/question_answering_system.md | 44 + .../tutorials/quickstart_with_attu.json | 1 + .../zh-hant/tutorials/quickstart_with_attu.md | 239 ++ .../tutorials/recommendation_system.json | 1 + .../tutorials/recommendation_system.md | 36 + .../zh-hant/tutorials/text_image_search.json | 1 + .../zh-hant/tutorials/text_image_search.md | 39 + .../zh-hant/tutorials/text_search_engine.json | 1 + .../zh-hant/tutorials/text_search_engine.md | 39 + .../zh-hant/tutorials/tutorials-overview.json | 1 + .../zh-hant/tutorials/tutorials-overview.md | 52 + .../use-async-milvus-client-with-asyncio.json | 1 + .../use-async-milvus-client-with-asyncio.md | 414 ++++ .../tutorials/use_ColPali_with_milvus.json | 1 + .../tutorials/use_ColPali_with_milvus.md | 332 +++ .../tutorials/vector_visualization.json | 1 + .../zh-hant/tutorials/vector_visualization.md | 432 ++++ .../tutorials/video_similarity_search.json | 1 + .../tutorials/video_similarity_search.md | 40 + .../create-collection-instantly.json | 1 + .../create-collection-instantly.md | 341 +++ .../collections/create-collection.json | 1 + .../collections/create-collection.md | 760 ++++++ .../collections/drop-collection.json | 1 + .../userGuide/collections/drop-collection.md | 138 ++ .../collections/load-and-release.json | 1 + .../userGuide/collections/load-and-release.md | 411 +++ .../userGuide/collections/manage-aliases.json | 1 + .../userGuide/collections/manage-aliases.md | 542 ++++ .../collections/manage-collections.json | 1 + .../collections/manage-collections.md | 272 ++ .../collections/manage-partitions.json | 1 + .../collections/manage-partitions.md | 764 ++++++ .../collections/modify-collection.json | 1 + .../collections/modify-collection.md | 213 ++ .../collections/view-collections.json | 1 + .../userGuide/collections/view-collections.md | 202 ++ .../userGuide/data-import/import-data.json | 1 + .../userGuide/data-import/import-data.md | 401 +++ .../data-import/prepare-source-data.json | 1 + .../data-import/prepare-source-data.md | 631 +++++ .../insert-and-delete/delete-entities.json | 1 + .../insert-and-delete/delete-entities.md | 257 ++ .../insert-update-delete.json | 1 + .../insert-and-delete/insert-update-delete.md | 362 +++ .../insert-and-delete/upsert-entities.json | 1 + .../insert-and-delete/upsert-entities.md | 360 +++ .../userGuide/manage-indexes/bitmap.json | 1 + .../userGuide/manage-indexes/bitmap.md | 122 + .../manage-indexes/index-scalar-fields.json | 1 + .../manage-indexes/index-scalar-fields.md | 324 +++ .../manage-indexes/index-vector-fields.json | 1 + .../manage-indexes/index-vector-fields.md | 591 +++++ .../manage-indexes/index-with-gpu.json | 1 + .../manage-indexes/index-with-gpu.md | 231 ++ .../zh-hant/userGuide/manage_databases.json | 1 + .../zh-hant/userGuide/manage_databases.md | 597 +++++ .../schema/analyzer/analyzer-overview.json | 1 + .../schema/analyzer/analyzer-overview.md | 581 +++++ .../analyzer/analyzer/chinese-analyzer.json | 1 + .../analyzer/analyzer/chinese-analyzer.md | 48 + .../analyzer/analyzer/english-analyzer.json | 1 + .../analyzer/analyzer/english-analyzer.md | 72 + .../analyzer/analyzer/standard-analyzer.json | 1 + .../analyzer/analyzer/standard-analyzer.md | 103 + .../analyzer/filter/alphanumonly-filter.json | 1 + .../analyzer/filter/alphanumonly-filter.md | 68 + .../analyzer/filter/ascii-folding-filter.json | 1 + .../analyzer/filter/ascii-folding-filter.md | 68 + .../filter/cnalphanumonly-filter.json | 1 + .../analyzer/filter/cnalphanumonly-filter.md | 67 + .../analyzer/filter/cncharonly-filter.json | 1 + .../analyzer/filter/cncharonly-filter.md | 66 + .../analyzer/filter/decompounder-filter.json | 1 + .../analyzer/filter/decompounder-filter.md | 76 + .../schema/analyzer/filter/length-filter.json | 1 + .../schema/analyzer/filter/length-filter.md | 75 + .../analyzer/filter/lowercase-filter.json | 1 + .../analyzer/filter/lowercase-filter.md | 66 + .../analyzer/filter/stemmer-filter.json | 1 + .../schema/analyzer/filter/stemmer-filter.md | 75 + .../schema/analyzer/filter/stop-filter.json | 1 + .../schema/analyzer/filter/stop-filter.md | 75 + .../analyzer/tokenizer/jieba-tokenizer.json | 1 + .../analyzer/tokenizer/jieba-tokenizer.md | 64 + .../tokenizer/standard-tokenizer.json | 1 + .../analyzer/tokenizer/standard-tokenizer.md | 75 + .../tokenizer/whitespace-tokenizer.json | 1 + .../tokenizer/whitespace-tokenizer.md | 70 + .../userGuide/schema/array_data_type.json | 1 + .../userGuide/schema/array_data_type.md | 627 +++++ .../userGuide/schema/binary-vector.json | 1 + .../zh-hant/userGuide/schema/binary-vector.md | 440 ++++ .../userGuide/schema/dense-vector.json | 1 + .../zh-hant/userGuide/schema/dense-vector.md | 425 ++++ .../schema/enable-dynamic-field.json | 1 + .../userGuide/schema/enable-dynamic-field.md | 378 +++ .../schema/nullable-and-default.json | 1 + .../userGuide/schema/nullable-and-default.md | 875 +++++++ .../site/zh-hant/userGuide/schema/number.json | 1 + .../site/zh-hant/userGuide/schema/number.md | 565 +++++ .../userGuide/schema/primary-field.json | 1 + .../zh-hant/userGuide/schema/primary-field.md | 192 ++ .../userGuide/schema/schema-hands-on.json | 1 + .../userGuide/schema/schema-hands-on.md | 268 ++ .../site/zh-hant/userGuide/schema/schema.json | 1 + .../site/zh-hant/userGuide/schema/schema.md | 450 ++++ .../userGuide/schema/sparse_vector.json | 1 + .../zh-hant/userGuide/schema/sparse_vector.md | 533 ++++ .../site/zh-hant/userGuide/schema/string.json | 1 + .../site/zh-hant/userGuide/schema/string.md | 556 +++++ .../userGuide/schema/use-json-fields.json | 1 + .../userGuide/schema/use-json-fields.md | 521 ++++ .../boolean/array-operators.json | 1 + .../boolean/array-operators.md | 134 + .../boolean/basic-operators.json | 1 + .../boolean/basic-operators.md | 233 ++ .../search-query-get/boolean/boolean.json | 1 + .../search-query-get/boolean/boolean.md | 143 ++ .../boolean/filtering-templating.json | 1 + .../boolean/filtering-templating.md | 151 ++ .../boolean/json-operators.json | 1 + .../boolean/json-operators.md | 117 + .../clustering-compaction.json | 1 + .../search-query-get/clustering-compaction.md | 269 ++ .../search-query-get/consistency.json | 1 + .../userGuide/search-query-get/consistency.md | 211 ++ .../search-query-get/filtered-search.json | 1 + .../search-query-get/filtered-search.md | 254 ++ .../search-query-get/full-text-search.json | 1 + .../search-query-get/full-text-search.md | 498 ++++ .../get-and-scalar-query.json | 1 + .../search-query-get/get-and-scalar-query.md | 584 +++++ .../search-query-get/grouping-search.json | 1 + .../search-query-get/grouping-search.md | 361 +++ .../search-query-get/keyword-match.json | 1 + .../search-query-get/keyword-match.md | 428 ++++ .../userGuide/search-query-get/metric.json | 1 + .../userGuide/search-query-get/metric.md | 249 ++ .../userGuide/search-query-get/mmap.json | 1 + .../userGuide/search-query-get/mmap.md | 190 ++ .../search-query-get/multi-vector-search.json | 1 + .../search-query-get/multi-vector-search.md | 681 +++++ .../search-query-get/range-search.json | 1 + .../search-query-get/range-search.md | 210 ++ .../userGuide/search-query-get/reranking.json | 1 + .../userGuide/search-query-get/reranking.md | 120 + .../single-vector-search.json | 1 + .../search-query-get/single-vector-search.md | 917 +++++++ .../search-query-get/use-partition-key.json | 1 + .../search-query-get/use-partition-key.md | 245 ++ .../search-query-get/with-iterators.json | 1 + .../search-query-get/with-iterators.md | 161 ++ .../tools/birdwatcher_install_guides.json | 1 + .../tools/birdwatcher_install_guides.md | 118 + .../userGuide/tools/birdwatcher_overview.json | 1 + .../userGuide/tools/birdwatcher_overview.md | 75 + .../tools/birdwatcher_usage_guides.json | 1 + .../tools/birdwatcher_usage_guides.md | 406 +++ .../zh-hant/userGuide/tools/cli_commands.json | 1 + .../zh-hant/userGuide/tools/cli_commands.md | 1530 ++++++++++++ .../zh-hant/userGuide/tools/cli_overview.json | 1 + .../zh-hant/userGuide/tools/cli_overview.md | 76 + .../zh-hant/userGuide/tools/install_cli.json | 1 + .../zh-hant/userGuide/tools/install_cli.md | 100 + .../cross-bucket-backup-and-restore.json | 1 + .../cross-bucket-backup-and-restore.md | 201 ++ .../multi-storage-backup-and-restore.json | 1 + .../multi-storage-backup-and-restore.md | 244 ++ .../shared-bucket-backup-and-restore.json | 1 + .../shared-bucket-backup-and-restore.md | 196 ++ .../single-instance-backup-and-restore.json | 1 + .../single-instance-backup-and-restore.md | 140 ++ .../milvus-backup/milvus_backup_api.json | 1 + .../tools/milvus-backup/milvus_backup_api.md | 230 ++ .../milvus-backup/milvus_backup_cli.json | 1 + .../tools/milvus-backup/milvus_backup_cli.md | 180 ++ .../milvus-backup/milvus_backup_overview.json | 1 + .../milvus-backup/milvus_backup_overview.md | 81 + .../tools/milvus-cdc/cdc-monitoring.json | 1 + .../tools/milvus-cdc/cdc-monitoring.md | 42 + .../tools/milvus-cdc/deploy-cdc-server.json | 1 + .../tools/milvus-cdc/deploy-cdc-server.md | 154 ++ .../tools/milvus-cdc/manage-cdc-tasks.json | 1 + .../tools/milvus-cdc/manage-cdc-tasks.md | 273 ++ .../tools/milvus-cdc/milvus-cdc-overview.json | 1 + .../tools/milvus-cdc/milvus-cdc-overview.md | 123 + .../zh-hant/userGuide/tools/milvus-webui.json | 1 + .../zh-hant/userGuide/tools/milvus-webui.md | 287 +++ tools/cache.json | 629 +++-- tools/translate.js | 390 +-- tools/utils.js | 5 +- 2495 files changed, 348688 insertions(+), 504 deletions(-) create mode 100644 localization/v2.5.x/site/ar/about/comparison.json create mode 100644 localization/v2.5.x/site/ar/about/comparison.md create mode 100644 localization/v2.5.x/site/ar/about/limitations.json create mode 100644 localization/v2.5.x/site/ar/about/limitations.md create mode 100644 localization/v2.5.x/site/ar/about/milvus_adopters.json create mode 100644 localization/v2.5.x/site/ar/about/milvus_adopters.md create mode 100644 localization/v2.5.x/site/ar/about/overview.json create mode 100644 localization/v2.5.x/site/ar/about/overview.md create mode 100644 localization/v2.5.x/site/ar/about/roadmap.json create mode 100644 localization/v2.5.x/site/ar/about/roadmap.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/allocate.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/allocate.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/authenticate.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/authenticate.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/chunk_cache.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/chunk_cache.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/abs.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/abs.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-docker.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-docker.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-helm.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-helm.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure_access_logs.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure_access_logs.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure_operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/configure_operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_etcd.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_etcd.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_s3.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/deploy_s3.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/drop_users_roles.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/drop_users_roles.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/dynamic_config.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/dynamic_config.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/grant_privileges.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/grant_privileges.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/grant_roles.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/grant_roles.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/message_storage_operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/message_storage_operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/alert.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/alert.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/monitor.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/monitor.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/visualize.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/monitor/visualize.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/object_storage_operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/object_storage_operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/privilege_group.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/privilege_group.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/rbac.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/rbac.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/resource_group.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/resource_group.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/scale-dependencies.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/scale-dependencies.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/scaleout.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/scaleout.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/tls.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/tls.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.md create mode 100644 localization/v2.5.x/site/ar/adminGuide/users_and_roles.json create mode 100644 localization/v2.5.x/site/ar/adminGuide/users_and_roles.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-bm25.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-bm25.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-cohere.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-cohere.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-instructor.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-instructor.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-jina.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-jina.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-mgte.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-mgte.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-nomic.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-nomic.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-openai.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-openai.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-splade.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-splade.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-voyage.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embed-with-voyage.md create mode 100644 localization/v2.5.x/site/ar/embeddings/embeddings.json create mode 100644 localization/v2.5.x/site/ar/embeddings/embeddings.md create mode 100644 localization/v2.5.x/site/ar/faq/operational_faq.json create mode 100644 localization/v2.5.x/site/ar/faq/operational_faq.md create mode 100644 localization/v2.5.x/site/ar/faq/performance_faq.json create mode 100644 localization/v2.5.x/site/ar/faq/performance_faq.md create mode 100644 localization/v2.5.x/site/ar/faq/product_faq.json create mode 100644 localization/v2.5.x/site/ar/faq/product_faq.md create mode 100644 localization/v2.5.x/site/ar/faq/troubleshooting.json create mode 100644 localization/v2.5.x/site/ar/faq/troubleshooting.md create mode 100644 localization/v2.5.x/site/ar/getstarted/install-overview.json create mode 100644 localization/v2.5.x/site/ar/getstarted/install-overview.md create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.json create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.md create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.json create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.md create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.json create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.md create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.json create mode 100644 localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.md create mode 100644 localization/v2.5.x/site/ar/getstarted/milvus_lite.json create mode 100644 localization/v2.5.x/site/ar/getstarted/milvus_lite.md create mode 100644 localization/v2.5.x/site/ar/getstarted/quickstart.json create mode 100644 localization/v2.5.x/site/ar/getstarted/quickstart.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.json create mode 100644 localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.md create mode 100644 localization/v2.5.x/site/ar/home/home.json create mode 100644 localization/v2.5.x/site/ar/home/home.md create mode 100644 localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/apify_milvus_rag.json create mode 100644 localization/v2.5.x/site/ar/integrations/apify_milvus_rag.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.md create mode 100644 localization/v2.5.x/site/ar/integrations/build_rag_on_arm.json create mode 100644 localization/v2.5.x/site/ar/integrations/build_rag_on_arm.md create mode 100644 localization/v2.5.x/site/ar/integrations/dify_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/dify_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.json create mode 100644 localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.md create mode 100644 localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.json create mode 100644 localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_camel.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_camel.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_cohere.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_cohere.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_dspy.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_dspy.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_haystack.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_haystack.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_jina.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_jina.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_openai.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_openai.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_ragas.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_ragas.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_spark.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_spark.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_vanna.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_vanna.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.md create mode 100644 localization/v2.5.x/site/ar/integrations/integrations_overview.json create mode 100644 localization/v2.5.x/site/ar/integrations/integrations_overview.md create mode 100644 localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.json create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.md create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.json create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.md create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.json create mode 100644 localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.md create mode 100644 localization/v2.5.x/site/ar/integrations/llama_agents_metadata.json create mode 100644 localization/v2.5.x/site/ar/integrations/llama_agents_metadata.md create mode 100644 localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.json create mode 100644 localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.md create mode 100644 localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.json create mode 100644 localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.md create mode 100644 localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/integrations/rag_with_langflow.json create mode 100644 localization/v2.5.x/site/ar/integrations/rag_with_langflow.md create mode 100644 localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.json create mode 100644 localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.md create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.json create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.md create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.json create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.md create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.json create mode 100644 localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.md create mode 100644 localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.json create mode 100644 localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.md create mode 100644 localization/v2.5.x/site/ar/menuStructure/ar.json create mode 100644 localization/v2.5.x/site/ar/migrate/es2m.json create mode 100644 localization/v2.5.x/site/ar/migrate/es2m.md create mode 100644 localization/v2.5.x/site/ar/migrate/f2m.json create mode 100644 localization/v2.5.x/site/ar/migrate/f2m.md create mode 100644 localization/v2.5.x/site/ar/migrate/from-m2x.json create mode 100644 localization/v2.5.x/site/ar/migrate/from-m2x.md create mode 100644 localization/v2.5.x/site/ar/migrate/m2m.json create mode 100644 localization/v2.5.x/site/ar/migrate/m2m.md create mode 100644 localization/v2.5.x/site/ar/migrate/migrate_overview.json create mode 100644 localization/v2.5.x/site/ar/migrate/migrate_overview.md create mode 100644 localization/v2.5.x/site/ar/migrate/milvusdm_install.json create mode 100644 localization/v2.5.x/site/ar/migrate/milvusdm_install.md create mode 100644 localization/v2.5.x/site/ar/reference/architecture/architecture_overview.json create mode 100644 localization/v2.5.x/site/ar/reference/architecture/architecture_overview.md create mode 100644 localization/v2.5.x/site/ar/reference/architecture/data_processing.json create mode 100644 localization/v2.5.x/site/ar/reference/architecture/data_processing.md create mode 100644 localization/v2.5.x/site/ar/reference/architecture/four_layers.json create mode 100644 localization/v2.5.x/site/ar/reference/architecture/four_layers.md create mode 100644 localization/v2.5.x/site/ar/reference/architecture/main_components.json create mode 100644 localization/v2.5.x/site/ar/reference/architecture/main_components.md create mode 100644 localization/v2.5.x/site/ar/reference/benchmark.json create mode 100644 localization/v2.5.x/site/ar/reference/benchmark.md create mode 100644 localization/v2.5.x/site/ar/reference/bitset.json create mode 100644 localization/v2.5.x/site/ar/reference/bitset.md create mode 100644 localization/v2.5.x/site/ar/reference/coordinator_ha.json create mode 100644 localization/v2.5.x/site/ar/reference/coordinator_ha.md create mode 100644 localization/v2.5.x/site/ar/reference/disk_index.json create mode 100644 localization/v2.5.x/site/ar/reference/disk_index.md create mode 100644 localization/v2.5.x/site/ar/reference/glossary.json create mode 100644 localization/v2.5.x/site/ar/reference/glossary.md create mode 100644 localization/v2.5.x/site/ar/reference/gpu_index.json create mode 100644 localization/v2.5.x/site/ar/reference/gpu_index.md create mode 100644 localization/v2.5.x/site/ar/reference/index.json create mode 100644 localization/v2.5.x/site/ar/reference/index.md create mode 100644 localization/v2.5.x/site/ar/reference/knowhere.json create mode 100644 localization/v2.5.x/site/ar/reference/knowhere.md create mode 100644 localization/v2.5.x/site/ar/reference/multi_tenancy.json create mode 100644 localization/v2.5.x/site/ar/reference/multi_tenancy.md create mode 100644 localization/v2.5.x/site/ar/reference/replica.json create mode 100644 localization/v2.5.x/site/ar/reference/replica.md create mode 100644 localization/v2.5.x/site/ar/reference/scalar_index.json create mode 100644 localization/v2.5.x/site/ar/reference/scalar_index.md create mode 100644 localization/v2.5.x/site/ar/reference/schema.json create mode 100644 localization/v2.5.x/site/ar/reference/schema.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_common.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_common.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_log.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_log.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_minio.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_minio.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_mq.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_mq.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_tls.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_tls.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_trace.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/configure_trace.md create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/system_configuration.json create mode 100644 localization/v2.5.x/site/ar/reference/sys_config/system_configuration.md create mode 100644 localization/v2.5.x/site/ar/reference/time_sync.json create mode 100644 localization/v2.5.x/site/ar/reference/time_sync.md create mode 100644 localization/v2.5.x/site/ar/reference/timestamp.json create mode 100644 localization/v2.5.x/site/ar/reference/timestamp.md create mode 100644 localization/v2.5.x/site/ar/release_notes.json create mode 100644 localization/v2.5.x/site/ar/release_notes.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-bge.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-bge.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-cohere.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-cohere.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-jina.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-jina.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-overview.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-overview.md create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-voyage.json create mode 100644 localization/v2.5.x/site/ar/rerankers/rerankers-voyage.md create mode 100644 localization/v2.5.x/site/ar/tutorials/audio_similarity_search.json create mode 100644 localization/v2.5.x/site/ar/tutorials/audio_similarity_search.md create mode 100644 localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.json create mode 100644 localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.md create mode 100644 localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.json create mode 100644 localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.md create mode 100644 localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.json create mode 100644 localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.md create mode 100644 localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/image_deduplication_system.json create mode 100644 localization/v2.5.x/site/ar/tutorials/image_deduplication_system.md create mode 100644 localization/v2.5.x/site/ar/tutorials/image_similarity_search.json create mode 100644 localization/v2.5.x/site/ar/tutorials/image_similarity_search.md create mode 100644 localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/question_answering_system.json create mode 100644 localization/v2.5.x/site/ar/tutorials/question_answering_system.md create mode 100644 localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.json create mode 100644 localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.md create mode 100644 localization/v2.5.x/site/ar/tutorials/recommendation_system.json create mode 100644 localization/v2.5.x/site/ar/tutorials/recommendation_system.md create mode 100644 localization/v2.5.x/site/ar/tutorials/text_image_search.json create mode 100644 localization/v2.5.x/site/ar/tutorials/text_image_search.md create mode 100644 localization/v2.5.x/site/ar/tutorials/text_search_engine.json create mode 100644 localization/v2.5.x/site/ar/tutorials/text_search_engine.md create mode 100644 localization/v2.5.x/site/ar/tutorials/tutorials-overview.json create mode 100644 localization/v2.5.x/site/ar/tutorials/tutorials-overview.md create mode 100644 localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.json create mode 100644 localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.md create mode 100644 localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.json create mode 100644 localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.md create mode 100644 localization/v2.5.x/site/ar/tutorials/vector_visualization.json create mode 100644 localization/v2.5.x/site/ar/tutorials/vector_visualization.md create mode 100644 localization/v2.5.x/site/ar/tutorials/video_similarity_search.json create mode 100644 localization/v2.5.x/site/ar/tutorials/video_similarity_search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/create-collection.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/create-collection.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/drop-collection.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/drop-collection.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/load-and-release.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/load-and-release.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-collections.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-collections.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/modify-collection.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/modify-collection.md create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/view-collections.json create mode 100644 localization/v2.5.x/site/ar/userGuide/collections/view-collections.md create mode 100644 localization/v2.5.x/site/ar/userGuide/data-import/import-data.json create mode 100644 localization/v2.5.x/site/ar/userGuide/data-import/import-data.md create mode 100644 localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.json create mode 100644 localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.md create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.json create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.md create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.json create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.md create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.json create mode 100644 localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.md create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.json create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.md create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.json create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.md create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.json create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.md create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.json create mode 100644 localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.md create mode 100644 localization/v2.5.x/site/ar/userGuide/manage_databases.json create mode 100644 localization/v2.5.x/site/ar/userGuide/manage_databases.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/array_data_type.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/array_data_type.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/binary-vector.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/binary-vector.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/dense-vector.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/dense-vector.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/number.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/number.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/primary-field.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/primary-field.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/schema.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/schema.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/string.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/string.md create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.json create mode 100644 localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/metric.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/metric.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.md create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.json create mode 100644 localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/cli_commands.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/cli_commands.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/cli_overview.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/cli_overview.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/install_cli.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/install_cli.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.md create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.json create mode 100644 localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.md create mode 100644 localization/v2.5.x/site/id/about/comparison.json create mode 100644 localization/v2.5.x/site/id/about/comparison.md create mode 100644 localization/v2.5.x/site/id/about/limitations.json create mode 100644 localization/v2.5.x/site/id/about/limitations.md create mode 100644 localization/v2.5.x/site/id/about/milvus_adopters.json create mode 100644 localization/v2.5.x/site/id/about/milvus_adopters.md create mode 100644 localization/v2.5.x/site/id/about/overview.json create mode 100644 localization/v2.5.x/site/id/about/overview.md create mode 100644 localization/v2.5.x/site/id/about/roadmap.json create mode 100644 localization/v2.5.x/site/id/about/roadmap.md create mode 100644 localization/v2.5.x/site/id/adminGuide/allocate.json create mode 100644 localization/v2.5.x/site/id/adminGuide/allocate.md create mode 100644 localization/v2.5.x/site/id/adminGuide/authenticate.json create mode 100644 localization/v2.5.x/site/id/adminGuide/authenticate.md create mode 100644 localization/v2.5.x/site/id/adminGuide/chunk_cache.json create mode 100644 localization/v2.5.x/site/id/adminGuide/chunk_cache.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/abs.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/abs.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.md create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.json create mode 100644 localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.md create mode 100644 localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.json create mode 100644 localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.md create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-docker.json create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-docker.md create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-helm.json create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-helm.md create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.json create mode 100644 localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.md create mode 100644 localization/v2.5.x/site/id/adminGuide/configure_access_logs.json create mode 100644 localization/v2.5.x/site/id/adminGuide/configure_access_logs.md create mode 100644 localization/v2.5.x/site/id/adminGuide/configure_operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/configure_operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.json create mode 100644 localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.md create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_etcd.json create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_etcd.md create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_pulsar.json create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_pulsar.md create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_s3.json create mode 100644 localization/v2.5.x/site/id/adminGuide/deploy_s3.md create mode 100644 localization/v2.5.x/site/id/adminGuide/drop_users_roles.json create mode 100644 localization/v2.5.x/site/id/adminGuide/drop_users_roles.md create mode 100644 localization/v2.5.x/site/id/adminGuide/dynamic_config.json create mode 100644 localization/v2.5.x/site/id/adminGuide/dynamic_config.md create mode 100644 localization/v2.5.x/site/id/adminGuide/grant_privileges.json create mode 100644 localization/v2.5.x/site/id/adminGuide/grant_privileges.md create mode 100644 localization/v2.5.x/site/id/adminGuide/grant_roles.json create mode 100644 localization/v2.5.x/site/id/adminGuide/grant_roles.md create mode 100644 localization/v2.5.x/site/id/adminGuide/limit_collection_counts.json create mode 100644 localization/v2.5.x/site/id/adminGuide/limit_collection_counts.md create mode 100644 localization/v2.5.x/site/id/adminGuide/message_storage_operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/message_storage_operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/meta_storage_operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/meta_storage_operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/alert.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/alert.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/monitor.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/monitor.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.md create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/visualize.json create mode 100644 localization/v2.5.x/site/id/adminGuide/monitor/visualize.md create mode 100644 localization/v2.5.x/site/id/adminGuide/object_storage_operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/object_storage_operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/privilege_group.json create mode 100644 localization/v2.5.x/site/id/adminGuide/privilege_group.md create mode 100644 localization/v2.5.x/site/id/adminGuide/rbac.json create mode 100644 localization/v2.5.x/site/id/adminGuide/rbac.md create mode 100644 localization/v2.5.x/site/id/adminGuide/resource_group.json create mode 100644 localization/v2.5.x/site/id/adminGuide/resource_group.md create mode 100644 localization/v2.5.x/site/id/adminGuide/scale-dependencies.json create mode 100644 localization/v2.5.x/site/id/adminGuide/scale-dependencies.md create mode 100644 localization/v2.5.x/site/id/adminGuide/scaleout.json create mode 100644 localization/v2.5.x/site/id/adminGuide/scaleout.md create mode 100644 localization/v2.5.x/site/id/adminGuide/tls.json create mode 100644 localization/v2.5.x/site/id/adminGuide/tls.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.md create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.json create mode 100644 localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.md create mode 100644 localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.json create mode 100644 localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.md create mode 100644 localization/v2.5.x/site/id/adminGuide/users_and_roles.json create mode 100644 localization/v2.5.x/site/id/adminGuide/users_and_roles.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-bm25.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-bm25.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-cohere.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-cohere.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-instructor.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-instructor.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-jina.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-jina.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-mgte.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-mgte.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-nomic.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-nomic.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-openai.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-openai.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-splade.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-splade.md create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-voyage.json create mode 100644 localization/v2.5.x/site/id/embeddings/embed-with-voyage.md create mode 100644 localization/v2.5.x/site/id/embeddings/embeddings.json create mode 100644 localization/v2.5.x/site/id/embeddings/embeddings.md create mode 100644 localization/v2.5.x/site/id/faq/operational_faq.json create mode 100644 localization/v2.5.x/site/id/faq/operational_faq.md create mode 100644 localization/v2.5.x/site/id/faq/performance_faq.json create mode 100644 localization/v2.5.x/site/id/faq/performance_faq.md create mode 100644 localization/v2.5.x/site/id/faq/product_faq.json create mode 100644 localization/v2.5.x/site/id/faq/product_faq.md create mode 100644 localization/v2.5.x/site/id/faq/troubleshooting.json create mode 100644 localization/v2.5.x/site/id/faq/troubleshooting.md create mode 100644 localization/v2.5.x/site/id/getstarted/install-overview.json create mode 100644 localization/v2.5.x/site/id/getstarted/install-overview.md create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.json create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.md create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.json create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.md create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.json create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.md create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.json create mode 100644 localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.md create mode 100644 localization/v2.5.x/site/id/getstarted/milvus_lite.json create mode 100644 localization/v2.5.x/site/id/getstarted/milvus_lite.md create mode 100644 localization/v2.5.x/site/id/getstarted/quickstart.json create mode 100644 localization/v2.5.x/site/id/getstarted/quickstart.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.json create mode 100644 localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.md create mode 100644 localization/v2.5.x/site/id/home/home.json create mode 100644 localization/v2.5.x/site/id/home/home.md create mode 100644 localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/apify_milvus_rag.json create mode 100644 localization/v2.5.x/site/id/integrations/apify_milvus_rag.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.md create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.json create mode 100644 localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.md create mode 100644 localization/v2.5.x/site/id/integrations/build_rag_on_arm.json create mode 100644 localization/v2.5.x/site/id/integrations/build_rag_on_arm.md create mode 100644 localization/v2.5.x/site/id/integrations/dify_with_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/dify_with_milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.json create mode 100644 localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.md create mode 100644 localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.json create mode 100644 localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_airbyte.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_airbyte.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_bentoml.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_bentoml.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_camel.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_camel.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_cohere.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_cohere.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_dspy.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_dspy.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_haystack.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_haystack.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_jina.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_jina.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_langfuse.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_langfuse.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_memgpt.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_memgpt.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_openai.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_openai.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_pytorch.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_pytorch.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_ragas.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_ragas.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_snowpark.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_snowpark.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_spark.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_spark.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_vanna.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_vanna.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_voxel51.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_voxel51.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_voyageai.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_voyageai.md create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_whyhow.json create mode 100644 localization/v2.5.x/site/id/integrations/integrate_with_whyhow.md create mode 100644 localization/v2.5.x/site/id/integrations/integrations_overview.json create mode 100644 localization/v2.5.x/site/id/integrations/integrations_overview.md create mode 100644 localization/v2.5.x/site/id/integrations/kafka-connect-milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/kafka-connect-milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.json create mode 100644 localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.md create mode 100644 localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.json create mode 100644 localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.md create mode 100644 localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.json create mode 100644 localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.md create mode 100644 localization/v2.5.x/site/id/integrations/llama_agents_metadata.json create mode 100644 localization/v2.5.x/site/id/integrations/llama_agents_metadata.md create mode 100644 localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.json create mode 100644 localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.md create mode 100644 localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.json create mode 100644 localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.md create mode 100644 localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.md create mode 100644 localization/v2.5.x/site/id/integrations/rag_with_langflow.json create mode 100644 localization/v2.5.x/site/id/integrations/rag_with_langflow.md create mode 100644 localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.json create mode 100644 localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.md create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.json create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.md create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.json create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.md create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.json create mode 100644 localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.md create mode 100644 localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.json create mode 100644 localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.md create mode 100644 localization/v2.5.x/site/id/menuStructure/id.json create mode 100644 localization/v2.5.x/site/id/migrate/es2m.json create mode 100644 localization/v2.5.x/site/id/migrate/es2m.md create mode 100644 localization/v2.5.x/site/id/migrate/f2m.json create mode 100644 localization/v2.5.x/site/id/migrate/f2m.md create mode 100644 localization/v2.5.x/site/id/migrate/from-m2x.json create mode 100644 localization/v2.5.x/site/id/migrate/from-m2x.md create mode 100644 localization/v2.5.x/site/id/migrate/m2m.json create mode 100644 localization/v2.5.x/site/id/migrate/m2m.md create mode 100644 localization/v2.5.x/site/id/migrate/migrate_overview.json create mode 100644 localization/v2.5.x/site/id/migrate/migrate_overview.md create mode 100644 localization/v2.5.x/site/id/migrate/milvusdm_install.json create mode 100644 localization/v2.5.x/site/id/migrate/milvusdm_install.md create mode 100644 localization/v2.5.x/site/id/reference/architecture/architecture_overview.json create mode 100644 localization/v2.5.x/site/id/reference/architecture/architecture_overview.md create mode 100644 localization/v2.5.x/site/id/reference/architecture/data_processing.json create mode 100644 localization/v2.5.x/site/id/reference/architecture/data_processing.md create mode 100644 localization/v2.5.x/site/id/reference/architecture/four_layers.json create mode 100644 localization/v2.5.x/site/id/reference/architecture/four_layers.md create mode 100644 localization/v2.5.x/site/id/reference/architecture/main_components.json create mode 100644 localization/v2.5.x/site/id/reference/architecture/main_components.md create mode 100644 localization/v2.5.x/site/id/reference/benchmark.json create mode 100644 localization/v2.5.x/site/id/reference/benchmark.md create mode 100644 localization/v2.5.x/site/id/reference/bitset.json create mode 100644 localization/v2.5.x/site/id/reference/bitset.md create mode 100644 localization/v2.5.x/site/id/reference/coordinator_ha.json create mode 100644 localization/v2.5.x/site/id/reference/coordinator_ha.md create mode 100644 localization/v2.5.x/site/id/reference/disk_index.json create mode 100644 localization/v2.5.x/site/id/reference/disk_index.md create mode 100644 localization/v2.5.x/site/id/reference/glossary.json create mode 100644 localization/v2.5.x/site/id/reference/glossary.md create mode 100644 localization/v2.5.x/site/id/reference/gpu_index.json create mode 100644 localization/v2.5.x/site/id/reference/gpu_index.md create mode 100644 localization/v2.5.x/site/id/reference/index.json create mode 100644 localization/v2.5.x/site/id/reference/index.md create mode 100644 localization/v2.5.x/site/id/reference/knowhere.json create mode 100644 localization/v2.5.x/site/id/reference/knowhere.md create mode 100644 localization/v2.5.x/site/id/reference/multi_tenancy.json create mode 100644 localization/v2.5.x/site/id/reference/multi_tenancy.md create mode 100644 localization/v2.5.x/site/id/reference/replica.json create mode 100644 localization/v2.5.x/site/id/reference/replica.md create mode 100644 localization/v2.5.x/site/id/reference/scalar_index.json create mode 100644 localization/v2.5.x/site/id/reference/scalar_index.md create mode 100644 localization/v2.5.x/site/id/reference/schema.json create mode 100644 localization/v2.5.x/site/id/reference/schema.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_common.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_common.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_datanode.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_datanode.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_etcd.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_etcd.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_gpu.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_gpu.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_grpc.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_grpc.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_log.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_log.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_metastore.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_metastore.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_minio.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_minio.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_mq.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_mq.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_proxy.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_proxy.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_querynode.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_querynode.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_tikv.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_tikv.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_tls.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_tls.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_trace.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/configure_trace.md create mode 100644 localization/v2.5.x/site/id/reference/sys_config/system_configuration.json create mode 100644 localization/v2.5.x/site/id/reference/sys_config/system_configuration.md create mode 100644 localization/v2.5.x/site/id/reference/time_sync.json create mode 100644 localization/v2.5.x/site/id/reference/time_sync.md create mode 100644 localization/v2.5.x/site/id/reference/timestamp.json create mode 100644 localization/v2.5.x/site/id/reference/timestamp.md create mode 100644 localization/v2.5.x/site/id/release_notes.json create mode 100644 localization/v2.5.x/site/id/release_notes.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-bge.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-bge.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-cohere.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-cohere.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-jina.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-jina.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-overview.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-overview.md create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-voyage.json create mode 100644 localization/v2.5.x/site/id/rerankers/rerankers-voyage.md create mode 100644 localization/v2.5.x/site/id/tutorials/audio_similarity_search.json create mode 100644 localization/v2.5.x/site/id/tutorials/audio_similarity_search.md create mode 100644 localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/dna_sequence_classification.json create mode 100644 localization/v2.5.x/site/id/tutorials/dna_sequence_classification.md create mode 100644 localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.json create mode 100644 localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.md create mode 100644 localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.json create mode 100644 localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.md create mode 100644 localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/image_deduplication_system.json create mode 100644 localization/v2.5.x/site/id/tutorials/image_deduplication_system.md create mode 100644 localization/v2.5.x/site/id/tutorials/image_similarity_search.json create mode 100644 localization/v2.5.x/site/id/tutorials/image_similarity_search.md create mode 100644 localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/question_answering_system.json create mode 100644 localization/v2.5.x/site/id/tutorials/question_answering_system.md create mode 100644 localization/v2.5.x/site/id/tutorials/quickstart_with_attu.json create mode 100644 localization/v2.5.x/site/id/tutorials/quickstart_with_attu.md create mode 100644 localization/v2.5.x/site/id/tutorials/recommendation_system.json create mode 100644 localization/v2.5.x/site/id/tutorials/recommendation_system.md create mode 100644 localization/v2.5.x/site/id/tutorials/text_image_search.json create mode 100644 localization/v2.5.x/site/id/tutorials/text_image_search.md create mode 100644 localization/v2.5.x/site/id/tutorials/text_search_engine.json create mode 100644 localization/v2.5.x/site/id/tutorials/text_search_engine.md create mode 100644 localization/v2.5.x/site/id/tutorials/tutorials-overview.json create mode 100644 localization/v2.5.x/site/id/tutorials/tutorials-overview.md create mode 100644 localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.json create mode 100644 localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.md create mode 100644 localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.json create mode 100644 localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.md create mode 100644 localization/v2.5.x/site/id/tutorials/vector_visualization.json create mode 100644 localization/v2.5.x/site/id/tutorials/vector_visualization.md create mode 100644 localization/v2.5.x/site/id/tutorials/video_similarity_search.json create mode 100644 localization/v2.5.x/site/id/tutorials/video_similarity_search.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/create-collection.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/create-collection.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/drop-collection.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/drop-collection.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/load-and-release.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/load-and-release.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-aliases.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-aliases.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-collections.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-collections.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-partitions.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/manage-partitions.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/modify-collection.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/modify-collection.md create mode 100644 localization/v2.5.x/site/id/userGuide/collections/view-collections.json create mode 100644 localization/v2.5.x/site/id/userGuide/collections/view-collections.md create mode 100644 localization/v2.5.x/site/id/userGuide/data-import/import-data.json create mode 100644 localization/v2.5.x/site/id/userGuide/data-import/import-data.md create mode 100644 localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.json create mode 100644 localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.md create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.json create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.md create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.json create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.md create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.json create mode 100644 localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.md create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.json create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.md create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.json create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.md create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.json create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.md create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.json create mode 100644 localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.md create mode 100644 localization/v2.5.x/site/id/userGuide/manage_databases.json create mode 100644 localization/v2.5.x/site/id/userGuide/manage_databases.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/array_data_type.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/array_data_type.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/binary-vector.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/binary-vector.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/dense-vector.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/dense-vector.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/number.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/number.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/primary-field.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/primary-field.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/schema.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/schema.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/sparse_vector.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/sparse_vector.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/string.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/string.md create mode 100644 localization/v2.5.x/site/id/userGuide/schema/use-json-fields.json create mode 100644 localization/v2.5.x/site/id/userGuide/schema/use-json-fields.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/consistency.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/consistency.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/metric.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/metric.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/mmap.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/mmap.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/range-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/range-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/reranking.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/reranking.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.md create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.json create mode 100644 localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/cli_commands.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/cli_commands.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/cli_overview.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/cli_overview.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/install_cli.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/install_cli.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.md create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-webui.json create mode 100644 localization/v2.5.x/site/id/userGuide/tools/milvus-webui.md create mode 100644 localization/v2.5.x/site/ru/about/comparison.json create mode 100644 localization/v2.5.x/site/ru/about/comparison.md create mode 100644 localization/v2.5.x/site/ru/about/limitations.json create mode 100644 localization/v2.5.x/site/ru/about/limitations.md create mode 100644 localization/v2.5.x/site/ru/about/milvus_adopters.json create mode 100644 localization/v2.5.x/site/ru/about/milvus_adopters.md create mode 100644 localization/v2.5.x/site/ru/about/overview.json create mode 100644 localization/v2.5.x/site/ru/about/overview.md create mode 100644 localization/v2.5.x/site/ru/about/roadmap.json create mode 100644 localization/v2.5.x/site/ru/about/roadmap.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/allocate.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/allocate.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/authenticate.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/authenticate.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/chunk_cache.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/chunk_cache.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/abs.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/abs.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-docker.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-docker.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-helm.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-helm.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure_access_logs.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure_access_logs.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure_operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/configure_operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_etcd.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_etcd.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_s3.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/deploy_s3.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/drop_users_roles.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/drop_users_roles.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/dynamic_config.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/dynamic_config.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/grant_privileges.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/grant_privileges.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/grant_roles.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/grant_roles.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/message_storage_operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/message_storage_operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/alert.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/alert.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/monitor.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/monitor.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/visualize.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/monitor/visualize.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/object_storage_operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/object_storage_operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/privilege_group.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/privilege_group.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/rbac.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/rbac.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/resource_group.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/resource_group.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/scale-dependencies.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/scale-dependencies.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/scaleout.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/scaleout.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/tls.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/tls.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.md create mode 100644 localization/v2.5.x/site/ru/adminGuide/users_and_roles.json create mode 100644 localization/v2.5.x/site/ru/adminGuide/users_and_roles.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-bm25.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-bm25.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-cohere.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-cohere.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-instructor.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-instructor.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-jina.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-jina.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-mgte.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-mgte.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-nomic.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-nomic.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-openai.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-openai.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-splade.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-splade.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-voyage.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embed-with-voyage.md create mode 100644 localization/v2.5.x/site/ru/embeddings/embeddings.json create mode 100644 localization/v2.5.x/site/ru/embeddings/embeddings.md create mode 100644 localization/v2.5.x/site/ru/faq/operational_faq.json create mode 100644 localization/v2.5.x/site/ru/faq/operational_faq.md create mode 100644 localization/v2.5.x/site/ru/faq/performance_faq.json create mode 100644 localization/v2.5.x/site/ru/faq/performance_faq.md create mode 100644 localization/v2.5.x/site/ru/faq/product_faq.json create mode 100644 localization/v2.5.x/site/ru/faq/product_faq.md create mode 100644 localization/v2.5.x/site/ru/faq/troubleshooting.json create mode 100644 localization/v2.5.x/site/ru/faq/troubleshooting.md create mode 100644 localization/v2.5.x/site/ru/getstarted/install-overview.json create mode 100644 localization/v2.5.x/site/ru/getstarted/install-overview.md create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.json create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.md create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.json create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.md create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.json create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.md create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.json create mode 100644 localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.md create mode 100644 localization/v2.5.x/site/ru/getstarted/milvus_lite.json create mode 100644 localization/v2.5.x/site/ru/getstarted/milvus_lite.md create mode 100644 localization/v2.5.x/site/ru/getstarted/quickstart.json create mode 100644 localization/v2.5.x/site/ru/getstarted/quickstart.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.json create mode 100644 localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.md create mode 100644 localization/v2.5.x/site/ru/home/home.json create mode 100644 localization/v2.5.x/site/ru/home/home.md create mode 100644 localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/apify_milvus_rag.json create mode 100644 localization/v2.5.x/site/ru/integrations/apify_milvus_rag.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.md create mode 100644 localization/v2.5.x/site/ru/integrations/build_rag_on_arm.json create mode 100644 localization/v2.5.x/site/ru/integrations/build_rag_on_arm.md create mode 100644 localization/v2.5.x/site/ru/integrations/dify_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/dify_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.json create mode 100644 localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.md create mode 100644 localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.json create mode 100644 localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_camel.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_camel.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_cohere.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_cohere.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_dspy.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_dspy.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_haystack.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_haystack.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_jina.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_jina.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_openai.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_openai.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_ragas.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_ragas.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_spark.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_spark.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_vanna.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_vanna.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.md create mode 100644 localization/v2.5.x/site/ru/integrations/integrations_overview.json create mode 100644 localization/v2.5.x/site/ru/integrations/integrations_overview.md create mode 100644 localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.json create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.md create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.json create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.md create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.json create mode 100644 localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.md create mode 100644 localization/v2.5.x/site/ru/integrations/llama_agents_metadata.json create mode 100644 localization/v2.5.x/site/ru/integrations/llama_agents_metadata.md create mode 100644 localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.json create mode 100644 localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.md create mode 100644 localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.json create mode 100644 localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.md create mode 100644 localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/integrations/rag_with_langflow.json create mode 100644 localization/v2.5.x/site/ru/integrations/rag_with_langflow.md create mode 100644 localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.json create mode 100644 localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.md create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.json create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.md create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.json create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.md create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.json create mode 100644 localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.md create mode 100644 localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.json create mode 100644 localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.md create mode 100644 localization/v2.5.x/site/ru/menuStructure/ru.json create mode 100644 localization/v2.5.x/site/ru/migrate/es2m.json create mode 100644 localization/v2.5.x/site/ru/migrate/es2m.md create mode 100644 localization/v2.5.x/site/ru/migrate/f2m.json create mode 100644 localization/v2.5.x/site/ru/migrate/f2m.md create mode 100644 localization/v2.5.x/site/ru/migrate/from-m2x.json create mode 100644 localization/v2.5.x/site/ru/migrate/from-m2x.md create mode 100644 localization/v2.5.x/site/ru/migrate/m2m.json create mode 100644 localization/v2.5.x/site/ru/migrate/m2m.md create mode 100644 localization/v2.5.x/site/ru/migrate/migrate_overview.json create mode 100644 localization/v2.5.x/site/ru/migrate/migrate_overview.md create mode 100644 localization/v2.5.x/site/ru/migrate/milvusdm_install.json create mode 100644 localization/v2.5.x/site/ru/migrate/milvusdm_install.md create mode 100644 localization/v2.5.x/site/ru/reference/architecture/architecture_overview.json create mode 100644 localization/v2.5.x/site/ru/reference/architecture/architecture_overview.md create mode 100644 localization/v2.5.x/site/ru/reference/architecture/data_processing.json create mode 100644 localization/v2.5.x/site/ru/reference/architecture/data_processing.md create mode 100644 localization/v2.5.x/site/ru/reference/architecture/four_layers.json create mode 100644 localization/v2.5.x/site/ru/reference/architecture/four_layers.md create mode 100644 localization/v2.5.x/site/ru/reference/architecture/main_components.json create mode 100644 localization/v2.5.x/site/ru/reference/architecture/main_components.md create mode 100644 localization/v2.5.x/site/ru/reference/benchmark.json create mode 100644 localization/v2.5.x/site/ru/reference/benchmark.md create mode 100644 localization/v2.5.x/site/ru/reference/bitset.json create mode 100644 localization/v2.5.x/site/ru/reference/bitset.md create mode 100644 localization/v2.5.x/site/ru/reference/coordinator_ha.json create mode 100644 localization/v2.5.x/site/ru/reference/coordinator_ha.md create mode 100644 localization/v2.5.x/site/ru/reference/disk_index.json create mode 100644 localization/v2.5.x/site/ru/reference/disk_index.md create mode 100644 localization/v2.5.x/site/ru/reference/glossary.json create mode 100644 localization/v2.5.x/site/ru/reference/glossary.md create mode 100644 localization/v2.5.x/site/ru/reference/gpu_index.json create mode 100644 localization/v2.5.x/site/ru/reference/gpu_index.md create mode 100644 localization/v2.5.x/site/ru/reference/index.json create mode 100644 localization/v2.5.x/site/ru/reference/index.md create mode 100644 localization/v2.5.x/site/ru/reference/knowhere.json create mode 100644 localization/v2.5.x/site/ru/reference/knowhere.md create mode 100644 localization/v2.5.x/site/ru/reference/multi_tenancy.json create mode 100644 localization/v2.5.x/site/ru/reference/multi_tenancy.md create mode 100644 localization/v2.5.x/site/ru/reference/replica.json create mode 100644 localization/v2.5.x/site/ru/reference/replica.md create mode 100644 localization/v2.5.x/site/ru/reference/scalar_index.json create mode 100644 localization/v2.5.x/site/ru/reference/scalar_index.md create mode 100644 localization/v2.5.x/site/ru/reference/schema.json create mode 100644 localization/v2.5.x/site/ru/reference/schema.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_common.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_common.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_log.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_log.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_minio.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_minio.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_mq.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_mq.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_tls.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_tls.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_trace.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/configure_trace.md create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/system_configuration.json create mode 100644 localization/v2.5.x/site/ru/reference/sys_config/system_configuration.md create mode 100644 localization/v2.5.x/site/ru/reference/time_sync.json create mode 100644 localization/v2.5.x/site/ru/reference/time_sync.md create mode 100644 localization/v2.5.x/site/ru/reference/timestamp.json create mode 100644 localization/v2.5.x/site/ru/reference/timestamp.md create mode 100644 localization/v2.5.x/site/ru/release_notes.json create mode 100644 localization/v2.5.x/site/ru/release_notes.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-bge.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-bge.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-cohere.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-cohere.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-jina.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-jina.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-overview.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-overview.md create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-voyage.json create mode 100644 localization/v2.5.x/site/ru/rerankers/rerankers-voyage.md create mode 100644 localization/v2.5.x/site/ru/tutorials/audio_similarity_search.json create mode 100644 localization/v2.5.x/site/ru/tutorials/audio_similarity_search.md create mode 100644 localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.json create mode 100644 localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.md create mode 100644 localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.json create mode 100644 localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.md create mode 100644 localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.json create mode 100644 localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.md create mode 100644 localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/image_deduplication_system.json create mode 100644 localization/v2.5.x/site/ru/tutorials/image_deduplication_system.md create mode 100644 localization/v2.5.x/site/ru/tutorials/image_similarity_search.json create mode 100644 localization/v2.5.x/site/ru/tutorials/image_similarity_search.md create mode 100644 localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/question_answering_system.json create mode 100644 localization/v2.5.x/site/ru/tutorials/question_answering_system.md create mode 100644 localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.json create mode 100644 localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.md create mode 100644 localization/v2.5.x/site/ru/tutorials/recommendation_system.json create mode 100644 localization/v2.5.x/site/ru/tutorials/recommendation_system.md create mode 100644 localization/v2.5.x/site/ru/tutorials/text_image_search.json create mode 100644 localization/v2.5.x/site/ru/tutorials/text_image_search.md create mode 100644 localization/v2.5.x/site/ru/tutorials/text_search_engine.json create mode 100644 localization/v2.5.x/site/ru/tutorials/text_search_engine.md create mode 100644 localization/v2.5.x/site/ru/tutorials/tutorials-overview.json create mode 100644 localization/v2.5.x/site/ru/tutorials/tutorials-overview.md create mode 100644 localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.json create mode 100644 localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.md create mode 100644 localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.json create mode 100644 localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.md create mode 100644 localization/v2.5.x/site/ru/tutorials/vector_visualization.json create mode 100644 localization/v2.5.x/site/ru/tutorials/vector_visualization.md create mode 100644 localization/v2.5.x/site/ru/tutorials/video_similarity_search.json create mode 100644 localization/v2.5.x/site/ru/tutorials/video_similarity_search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/create-collection.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/create-collection.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/drop-collection.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/drop-collection.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/load-and-release.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/load-and-release.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-collections.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-collections.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/modify-collection.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/modify-collection.md create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/view-collections.json create mode 100644 localization/v2.5.x/site/ru/userGuide/collections/view-collections.md create mode 100644 localization/v2.5.x/site/ru/userGuide/data-import/import-data.json create mode 100644 localization/v2.5.x/site/ru/userGuide/data-import/import-data.md create mode 100644 localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.json create mode 100644 localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.md create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.json create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.md create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.json create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.md create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.json create mode 100644 localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.md create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.json create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.md create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.json create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.md create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.json create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.md create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.json create mode 100644 localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.md create mode 100644 localization/v2.5.x/site/ru/userGuide/manage_databases.json create mode 100644 localization/v2.5.x/site/ru/userGuide/manage_databases.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/array_data_type.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/array_data_type.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/binary-vector.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/binary-vector.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/dense-vector.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/dense-vector.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/number.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/number.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/primary-field.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/primary-field.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/schema.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/schema.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/string.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/string.md create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.json create mode 100644 localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/metric.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/metric.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.md create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.json create mode 100644 localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/cli_commands.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/cli_commands.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/cli_overview.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/cli_overview.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/install_cli.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/install_cli.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.md create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.json create mode 100644 localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.md create mode 100644 localization/v2.5.x/site/zh-hant/about/comparison.json create mode 100644 localization/v2.5.x/site/zh-hant/about/comparison.md create mode 100644 localization/v2.5.x/site/zh-hant/about/limitations.json create mode 100644 localization/v2.5.x/site/zh-hant/about/limitations.md create mode 100644 localization/v2.5.x/site/zh-hant/about/milvus_adopters.json create mode 100644 localization/v2.5.x/site/zh-hant/about/milvus_adopters.md create mode 100644 localization/v2.5.x/site/zh-hant/about/overview.json create mode 100644 localization/v2.5.x/site/zh-hant/about/overview.md create mode 100644 localization/v2.5.x/site/zh-hant/about/roadmap.json create mode 100644 localization/v2.5.x/site/zh-hant/about/roadmap.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/allocate.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/allocate.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/authenticate.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/authenticate.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/abs.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/abs.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/rbac.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/rbac.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/resource_group.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/resource_group.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/scaleout.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/scaleout.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/tls.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/tls.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.md create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.json create mode 100644 localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.md create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embeddings.json create mode 100644 localization/v2.5.x/site/zh-hant/embeddings/embeddings.md create mode 100644 localization/v2.5.x/site/zh-hant/faq/operational_faq.json create mode 100644 localization/v2.5.x/site/zh-hant/faq/operational_faq.md create mode 100644 localization/v2.5.x/site/zh-hant/faq/performance_faq.json create mode 100644 localization/v2.5.x/site/zh-hant/faq/performance_faq.md create mode 100644 localization/v2.5.x/site/zh-hant/faq/product_faq.json create mode 100644 localization/v2.5.x/site/zh-hant/faq/product_faq.md create mode 100644 localization/v2.5.x/site/zh-hant/faq/troubleshooting.json create mode 100644 localization/v2.5.x/site/zh-hant/faq/troubleshooting.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install-overview.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install-overview.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/quickstart.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/quickstart.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.json create mode 100644 localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.md create mode 100644 localization/v2.5.x/site/zh-hant/home/home.json create mode 100644 localization/v2.5.x/site/zh-hant/home/home.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrations_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/integrations_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.md create mode 100644 localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/menuStructure/zh-hant.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/es2m.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/es2m.md create mode 100644 localization/v2.5.x/site/zh-hant/migrate/f2m.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/f2m.md create mode 100644 localization/v2.5.x/site/zh-hant/migrate/from-m2x.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/from-m2x.md create mode 100644 localization/v2.5.x/site/zh-hant/migrate/m2m.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/m2m.md create mode 100644 localization/v2.5.x/site/zh-hant/migrate/migrate_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/migrate_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.json create mode 100644 localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/main_components.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/architecture/main_components.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/benchmark.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/benchmark.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/bitset.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/bitset.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/coordinator_ha.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/coordinator_ha.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/disk_index.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/disk_index.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/glossary.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/glossary.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/gpu_index.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/gpu_index.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/index.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/index.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/knowhere.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/knowhere.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/multi_tenancy.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/multi_tenancy.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/replica.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/replica.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/scalar_index.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/scalar_index.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/schema.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/schema.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/time_sync.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/time_sync.md create mode 100644 localization/v2.5.x/site/zh-hant/reference/timestamp.json create mode 100644 localization/v2.5.x/site/zh-hant/reference/timestamp.md create mode 100644 localization/v2.5.x/site/zh-hant/release_notes.json create mode 100644 localization/v2.5.x/site/zh-hant/release_notes.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.md create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.json create mode 100644 localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/text_image_search.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/text_image_search.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.md create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.json create mode 100644 localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage_databases.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/manage_databases.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/number.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/number.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/schema.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/schema.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/string.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/string.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.md create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.json create mode 100644 localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.md diff --git a/localization/v2.5.x/site/ar/about/comparison.json b/localization/v2.5.x/site/ar/about/comparison.json new file mode 100644 index 000000000..931be8f12 --- /dev/null +++ b/localization/v2.5.x/site/ar/about/comparison.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Comparing Milvus with Alternatives","anchorList":[{"label":"مقارنة ميلفوس مع البدائل","href":"Comparing-Milvus-with-Alternatives","type":1,"isActive":false},{"label":"أبرز مزايا ميلفوس","href":"Milvus-highlights","type":2,"isActive":false},{"label":"مقارنة شاملة","href":"Overall-comparison","type":2,"isActive":false},{"label":"مقارنة المصطلحات","href":"Terminology-comparison","type":2,"isActive":false},{"label":"مقارنة القدرات","href":"Capability-comparison","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/about/comparison.md b/localization/v2.5.x/site/ar/about/comparison.md new file mode 100644 index 000000000..b33d3e64d --- /dev/null +++ b/localization/v2.5.x/site/ar/about/comparison.md @@ -0,0 +1,159 @@ +--- +id: comparison.md +title: المقارنة +summary: تقارن هذه المقالة بين Milvus وحلول البحث المتجه الأخرى. +--- +

مقارنة ميلفوس مع البدائل

عند استكشاف خيارات قواعد البيانات المتجهة المختلفة، سيساعدك هذا الدليل الشامل على فهم ميزات Milvus الفريدة، مما يضمن لك اختيار قاعدة البيانات التي تناسب احتياجاتك الخاصة. وتجدر الإشارة إلى أن Milvus هي قاعدة بيانات متجهات رائدة مفتوحة المصدر، وتقدم Zilliz Cloud خدمة Milvus المُدارة بالكامل. لتقييم Milvus بموضوعية مقارنةً بمنافسيها، فكّر في استخدام أدوات معيارية لتحليل مقاييس الأداء.

+

أبرز مزايا ميلفوس

+

مقارنة شاملة

للمقارنة بين Milvus و Pinecone، وهما حلان لقاعدة بيانات المتجهات، تم تنظيم الجدول التالي لتسليط الضوء على الاختلافات عبر الميزات المختلفة.

+ + + + + + + + + + + + + +
الميزةبينكونميلفوسالملاحظات
أوضاع النشرSaaS فقطMilvus Lite، وMilvus Lite، وUn-premalone Standalone & Cluster، وZilliz Cloud Saas & BYOCيوفر Milvus مرونة أكبر في أوضاع النشر.
حزم SDK المدعومةبايثون وجافا سكريبت/تايب سكريبتPython, Java, NodeJS, NodeJS, Go, Restful API, C#, Rustيدعم ميلفوس مجموعة أكبر من لغات البرمجة.
حالة المصدر المفتوحمغلقمفتوح المصدرميلفوس هي قاعدة بيانات متجهة مفتوحة المصدر شائعة ومفتوحة المصدر.
قابلية التوسعالتوسع لأعلى/لأسفل فقطقابلية التوسع لأعلى/لأعلى ولأسفل فقطيتميز ميلفوس ببنية موزعة لتعزيز قابلية التوسع.
التوفربنية قائمة على الكبسولة داخل المناطق المتاحةتجاوز فشل المنطقة المتاحة و HA عبر المناطق المتاحةيتيح نظام Milvus CDC (التقاط بيانات التغيير) أوضاعًا أساسية/احتياطية لتوافر أعلى.
تكلفة الأداء (دولار لكل مليون استعلام)تبدأ من 0.178 دولار أمريكي لمجموعة بيانات متوسطة، و1.222 دولار أمريكي لمجموعة بيانات كبيرةيبدأ سعر Zilliz Cloud من 0.148 دولار أمريكي لمجموعة بيانات متوسطة، و0.635 دولار أمريكي لمجموعة بيانات كبيرة؛ يتوفر إصدار مجانيراجع تقرير تصنيف التكلفة.
تسريع GPUغير مدعومدعم وحدة معالجة الرسومات NVIDIA GPUيعمل تسريع وحدة معالجة الرسومات على تحسين الأداء بشكل كبير، وغالبًا ما يكون ذلك بأضعاف.
+

مقارنة المصطلحات

على الرغم من أن كلاهما يخدمان وظائف متشابهة كقواعد بيانات متجهة، إلا أن المصطلحات الخاصة بالمجال بين Milvus و Pinecone تظهر اختلافات طفيفة. فيما يلي مقارنة مفصلة للمصطلحات.

+ + + + + + + + + + + + +
بينكونميلفوسالملاحظات
الفهرسالمجموعةفي Pinecone، يعمل الفهرس كوحدة تنظيمية لتخزين وإدارة المتجهات ذات الحجم المتماثل، ويتكامل هذا الفهرس بشكل وثيق مع الأجهزة، المعروفة باسم القرون. في المقابل، تخدم مجموعات Milvus غرضًا مشابهًا ولكنها تتيح التعامل مع مجموعات متعددة ضمن مثيل واحد.
المجموعاتالنسخ الاحتياطيفي Pinecone، تعتبر المجموعة في الأساس لقطة ثابتة لفهرس ما، وتستخدم بشكل أساسي لأغراض النسخ الاحتياطي ولا يمكن الاستعلام عنها. في Milvus، الميزة المكافئة لإنشاء النسخ الاحتياطية أكثر شفافية ومباشرة.
مساحة الاسممفتاح التقسيمتسمح مساحات الأسماء بتقسيم المتجهات في الفهرس إلى مجموعات فرعية. يوفر Milvus طرقًا متعددة مثل مفتاح التقسيم أو مفتاح التقسيم لضمان عزل البيانات بكفاءة داخل مجموعة.
البيانات الوصفيةالحقل العددييعتمد التعامل مع البيانات الوصفية في Pinecone على أزواج المفاتيح والقيمة، بينما يسمح Milvus بالحقول العددية المعقدة، بما في ذلك أنواع البيانات القياسية وحقول JSON الديناميكية.
الاستعلامبحثاسم الطريقة المستخدمة للعثور على أقرب الجيران لمتجه معين، ربما مع بعض المرشحات الإضافية المطبقة في الأعلى.
غير متاحالمتكرريفتقر Pinecone إلى ميزة التكرار عبر جميع المتجهات في الفهرس. يقدّم ميلفوس طريقتا "بحث مكرر" و"استعلام مكرر"، مما يعزز قدرات استرجاع البيانات عبر مجموعات البيانات.
+

مقارنة القدرات

+ + + + + + + + + + + + +
القدرةبينيكونميلفوس
أوضاع النشرSaaS فقطميلفوس لايت، المستقل في مكان العمل والمجموعة، وزيليز كلاود ساس و BYOC
تضمين الوظائفغير متوفرةالدعم مع نموذج [نموذج] pymilvus [نموذج]
أنواع البياناتسلسلة، رقم، رقم، بول، قائمة سلسلةسلسلة، متغيرChar، عدد (Int، فلوات، مزدوج)، Bool، مصفوفة، JSON، متجه عائم، متجه ثنائي، BFloat16، Float16، متجه متناثر
أنواع المقاييس والفهارسجوس، نقطة، إقليدي
عائلة P، عائلة S، عائلة S
cosine، IP (نقطة)، L2 (إقليدي)، L2 (إقليدي)، Hamming، Jaccard
FLAT، IVF_FLAT، IVF_SQ8، IVF_SQ8، IVF_PQ، HNSW، SCANN، فهارس GPU
تصميم المخططالوضع المرنالوضع المرن، الوضع الصارم
الحقول المتجهة المتعددةغير متاحبحث متعدد المتجهات والهجين
الأدواتمجموعات البيانات، الأدوات المساعدة النصية، موصل سباركAttu و Birdwatcher و Backup و CLI و CDC و Spark و Kafka الموصلات
+

الرؤى الرئيسية

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/about/limitations.json b/localization/v2.5.x/site/ar/about/limitations.json new file mode 100644 index 000000000..f365e7c1e --- /dev/null +++ b/localization/v2.5.x/site/ar/about/limitations.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Limits","anchorList":[{"label":"حدود ميلفوس","href":"Milvus-Limits","type":1,"isActive":false},{"label":"طول اسم المورد","href":"Length-of-a-resource-name","type":2,"isActive":false},{"label":"قواعد التسمية","href":"Naming-rules","type":2,"isActive":false},{"label":"عدد الموارد","href":"Number-of-resources","type":2,"isActive":false},{"label":"عدد الموارد في المجموعة","href":"Number-of-resources-in-a-collection","type":2,"isActive":false},{"label":"طول السلسلة","href":"Length-of-a-string","type":2,"isActive":false},{"label":"أبعاد المتجه","href":"Dimensions-of-a-vector","type":2,"isActive":false},{"label":"المدخلات والمخرجات لكل RPC","href":"Input-and-Output-per-RPC","type":2,"isActive":false},{"label":"حدود التحميل","href":"Load-limits","type":2,"isActive":false},{"label":"حدود البحث","href":"Search-limits","type":2,"isActive":false},{"label":"حدود الفهرس على أنواع البحث المختلفة","href":"Index-limits-on-different-search-types","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/about/limitations.md b/localization/v2.5.x/site/ar/about/limitations.md new file mode 100644 index 000000000..dabf3339f --- /dev/null +++ b/localization/v2.5.x/site/ar/about/limitations.md @@ -0,0 +1,260 @@ +--- +id: limitations.md +title: حدود ميلفوس +related_key: Limitations +summary: تعرف على الحدود أثناء استخدام ميلفوس. +--- +

حدود ميلفوس

تلتزم شركة Milvus بتوفير أفضل قواعد بيانات المتجهات لتشغيل تطبيقات الذكاء الاصطناعي والبحث عن تشابه المتجهات. ومع ذلك، يعمل الفريق باستمرار لجلب المزيد من الميزات وأفضل الأدوات المساعدة لتحسين تجربة المستخدم. تسرد هذه الصفحة بعض القيود المعروفة التي قد يواجهها المستخدمون عند استخدام Milvus.

+

طول اسم المورد

+ + + + + + + + + +
الموردالحد
المجموعة255 حرفاً
الحقل255 حرفاً
الفهرس255 حرفاً
التقسيم255 حرفاً
+

قواعد التسمية

يمكن أن يحتوي اسم المورد على أرقام وحروف وشرطة سفلية (_). يجب أن يبدأ اسم المورد بحرف أو شرطة سفلية (_).

+

عدد الموارد

+ + + + + + + +
الموردالحد
المجموعة65,536
الاتصال/الوكيل65,536
+

عدد الموارد في المجموعة

+ + + + + + + + + + +
المواردالحد
التقسيم1,024
الجزء16
الحقل64
الفهرس1
الكيانغير محدود
+

طول السلسلة

+ + + + + + +
نوع البياناتالحد
VARCHAR65,535
+

أبعاد المتجه

+ + + + + + +
الخاصيةالحد
البُعد32,768
+

المدخلات والمخرجات لكل RPC

+ + + + + + + + +
العمليةالحد
الإدخال64 ميغابايت
بحث64 ميغابايت
استعلام64 ميغابايت
+

حدود التحميل

في الإصدار الحالي، يجب أن تكون البيانات المراد تحميلها أقل من 90% من إجمالي موارد الذاكرة لجميع عقد الاستعلام لحجز موارد الذاكرة لمحرك التنفيذ.

+

حدود البحث

+ + + + + + + +
المتجهاتالحد
topk (عدد النتائج الأكثر تشابهاً للإرجاع)16,384
nq (عدد طلبات البحث)16,384
+

حدود الفهرس على أنواع البحث المختلفة

يقدم الجدول التالي نظرة عامة على دعم سلوكيات البحث المختلفة عبر أنواع الفهارس المختلفة.

+ + + + + + + + + + + + + + + + + +
HNSWالقرصمسطحIVF_FLATIVF_SQ8IVF_PQSCANNGPU_IFV_FLATGPU_IVF_PQGPU_CAGRAGPU_brute_brute_forcesparse_inverted_indexSPARSE_WANDBIN_FLATBIN_IVF_FLAT
بحث أساسينعمنعمنعمنعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
بحث التقسيمنعمنعمنعمنعمنعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
البحث الأساسي مع البيانات الأولية المسترجعةنعمنعمنعمنعم نعمنعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
بحث أساسي مع ترقيم الصفحاتنعمنعم نعمنعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
بحث مصفىنعمنعم نعمنعم نعمنعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
البحث عن النطاقنعمنعمنعم نعمنعمنعم نعم نعمنعم نعم نعملالا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلانعم
تجميع البحث في مجموعاتنعملانعم نعملالا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجد
البحث باستخدام أداة التكرارنعمنعملا يوجدنعمنعمنعم نعم نعملالا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجدلا يوجد
بحث هجينبحث هجينبحث هجينلا يوجدنعم نعمبحث هجيننعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعمنعم(فقط RRFRFRanker)نعم(فقط RRFRFRanker)نعمنعم
الاستعلام/الإحضارنعمنعمنعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم نعم نعمنعم
استعلام مع مكررنعمنعمنعم نعمنعمنعمنعم نعم نعملالا يوجدلا يوجدلا يوجدلالالالانعم نعم
diff --git a/localization/v2.5.x/site/ar/about/milvus_adopters.json b/localization/v2.5.x/site/ar/about/milvus_adopters.json new file mode 100644 index 000000000..c5a234c4e --- /dev/null +++ b/localization/v2.5.x/site/ar/about/milvus_adopters.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Adopters","anchorList":[{"label":"مستخدمو ميلفوس","href":"Milvus-Adopters","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/about/milvus_adopters.md b/localization/v2.5.x/site/ar/about/milvus_adopters.md new file mode 100644 index 000000000..b6d35f09f --- /dev/null +++ b/localization/v2.5.x/site/ar/about/milvus_adopters.md @@ -0,0 +1,27 @@ +--- +id: milvus_adopters.md +title: مستخدمو ميلفوس +related_key: Milvus adopters +summary: تعرف على الشركات التي اعتمدت Milvus في تطبيقات الإنتاج. +--- +

مستخدمو ميلفوس

تُعدّ Milvus قاعدة البيانات المتجهة الرائدة بين مستخدمي المؤسسات، حيث تحظى بتأييد شركات بارزة مثل Nvidia وRoblox وAT&T وغيرها. فيما يلي قائمة بالشركات التي نجحت في دمج Milvus في تطبيقاتها.

+

+ + Milvus Adopters + متبنو ميلفوس

+

قم بزيارة صفحة حالة استخدام Milvus لاكتشاف كيفية استفادة رواد الصناعة من Milvus لتعزيز تطبيقات الذكاء الاصطناعي الخاصة بهم وتسريع نمو أعمالهم.

diff --git a/localization/v2.5.x/site/ar/about/overview.json b/localization/v2.5.x/site/ar/about/overview.json new file mode 100644 index 000000000..a126a4216 --- /dev/null +++ b/localization/v2.5.x/site/ar/about/overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"What is Milvus?","anchorList":[{"label":"ما هو ميلفوس؟","href":"What-is-Milvus","type":1,"isActive":false},{"label":"البيانات غير المهيكلة والتضمينات وميلفوس","href":"Unstructured-Data-Embeddings-and-Milvus","type":2,"isActive":false},{"label":"ما الذي يجعل ميلفوس سريعًا جدًا?","href":"What-Makes-Milvus-so-Fast","type":2,"isActive":false},{"label":"ما الذي يجعل Milvus قابلاً للتطوير","href":"What-Makes-Milvus-so-Scalable","type":2,"isActive":false},{"label":"أنواع عمليات البحث التي تدعمها ميلفوس","href":"Types-of-Searches-Supported-by-Milvus","type":2,"isActive":false},{"label":"مجموعة الميزات الشاملة","href":"Comprehensive-Feature-Set","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/about/overview.md b/localization/v2.5.x/site/ar/about/overview.md new file mode 100644 index 000000000..9d321023a --- /dev/null +++ b/localization/v2.5.x/site/ar/about/overview.md @@ -0,0 +1,178 @@ +--- +id: overview.md +title: ما هو ميلفوس +related_key: Milvus Overview +summary: >- + Milvus عبارة عن قاعدة بيانات متجهة عالية الأداء وقابلة للتطوير بشكل كبير تعمل + بكفاءة عبر مجموعة واسعة من البيئات، بدءًا من الكمبيوتر المحمول وحتى الأنظمة + الموزعة على نطاق واسع. وهي متاحة كبرنامج مفتوح المصدر وخدمة سحابية. +--- +

ما هو ميلفوس؟

Milvus هي قاعدة بيانات متجهة عالية الأداء وقابلة للتطوير بشكل كبير تعمل بكفاءة عبر مجموعة واسعة من البيئات، من الكمبيوتر المحمول إلى الأنظمة الموزعة على نطاق واسع. وهي متاحة كبرنامج مفتوح المصدر وخدمة سحابية.

+

ميلفوس هو مشروع مفتوح المصدر تحت إشراف مؤسسة LF AI & Data Foundation موزعة بموجب ترخيص Apache 2.0. معظم المساهمين هم خبراء من مجتمع الحوسبة عالية الأداء (HPC)، متخصصون في بناء أنظمة واسعة النطاق وتحسين التعليمات البرمجية المدركة للأجهزة. من بين المساهمين الأساسيين متخصصون من Zilliz و ARM و NVIDIA و AMD و Intel و Meta و IBM و Salesforce و Alibaba و Microsoft.

+

البيانات غير المهيكلة والتضمينات وميلفوس

تتنوع البيانات غير المهيكلة، مثل النصوص والصور والصوت، من حيث التنسيق وتحمل دلالات أساسية غنية، مما يجعل تحليلها صعبًا. لإدارة هذا التعقيد، تُستخدم التضمينات لتحويل البيانات غير المهيكلة إلى متجهات رقمية تلتقط خصائصها الأساسية. ثم يتم تخزين هذه المتجهات في قاعدة بيانات متجهة، مما يتيح إجراء عمليات بحث وتحليلات سريعة وقابلة للتطوير.

+

يوفر Milvus إمكانات قوية لنمذجة البيانات، مما يتيح لك تنظيم بياناتك غير المنظمة أو متعددة الوسائط في مجموعات منظمة. وهو يدعم مجموعة واسعة من أنواع البيانات لنمذجة السمات المختلفة، بما في ذلك الأنواع العددية والحرفية الشائعة، وأنواع المتجهات المختلفة، والمصفوفات، والمجموعات، وJSON، مما يوفر عليك جهد الحفاظ على أنظمة قواعد بيانات متعددة.

+

+ + Untructured data, embeddings, and Milvus + البيانات غير المهيكلة، والتضمينات، و Milvus

+

يوفر Milvus ثلاثة أوضاع للنشر، تغطي مجموعة واسعة من مقاييس البيانات - من النماذج الأولية المحلية في دفاتر Jupyter Notebooks إلى مجموعات Kubernetes الضخمة التي تدير عشرات المليارات من المتجهات:

+ +

ما الذي يجعل ميلفوس سريعًا جدًا?

تم تصميم Milvus منذ اليوم الأول ليكون نظام قاعدة بيانات متجه عالي الكفاءة. في معظم الحالات، يتفوق Milvus على قواعد البيانات المتجهة الأخرى بمعدل 2-5 أضعاف (راجع نتائج VectorDBBench). هذا الأداء العالي هو نتيجة للعديد من قرارات التصميم الرئيسية:

+

التحسين المدرك للأجهزة: لاستيعاب Milvus في بيئات الأجهزة المختلفة، قمنا بتحسين أدائه خصيصًا للعديد من بنيات الأجهزة والمنصات، بما في ذلك AVX512 وSIMD ووحدات معالجة الرسومات وNVMe SSD.

+

خوارزميات بحث متقدمة: يدعم Milvus مجموعة واسعة من خوارزميات الفهرسة/البحث في الذاكرة وعلى القرص، بما في ذلك خوارزميات الفهرسة/البحث في الذاكرة وعلى القرص، بما في ذلك IVF وHNSW وDiskANN وغيرها، والتي تم تحسينها جميعًا بشكل كبير. ومقارنةً بالتطبيقات الشائعة مثل FAISS وHNSWLib، يقدم Milvus أداءً أفضل بنسبة 30%-70%.

+

محرك البحث في C++: يتم تحديد أكثر من 80% من أداء قاعدة البيانات المتجهة من خلال محرك البحث الخاص بها. Milvus uses C++ for this critical component due to the language’s high performance, low-level optimization, and efficient resource management. والأهم من ذلك أن Milvus يدمج العديد من التحسينات البرمجية المدركة للأجهزة، بدءًا من التحسينات على مستوى التجميع إلى التوازي والجدولة متعددة الخيوط للاستفادة الكاملة من قدرات الأجهزة.

+

موجهنحو العمود: Milvus هو نظام قاعدة بيانات متجه موجه نحو الأعمدة. تأتي المزايا الأساسية من أنماط الوصول إلى البيانات. عند إجراء الاستعلامات، تقرأ قاعدة البيانات الموجهة نحو الأعمدة فقط الحقول المحددة المتضمنة في الاستعلام، بدلاً من الصفوف بأكملها، مما يقلل بشكل كبير من كمية البيانات التي يتم الوصول إليها. بالإضافة إلى ذلك، يمكن تحويل العمليات على البيانات المستندة إلى الأعمدة بسهولة، مما يسمح بتطبيق العمليات على الأعمدة بأكملها في وقت واحد، مما يعزز الأداء بشكل أكبر.

+

ما الذي يجعل Milvus قابلاً للتطوير

في عام 2022، دعمت Milvus المتجهات على نطاق مليار متجه، وفي عام 2023، توسعت إلى عشرات المليارات مع ثبات ثابت، مما أدى إلى تشغيل سيناريوهات واسعة النطاق لأكثر من 300 شركة كبرى، بما في ذلك Salesforce وPayPal وShopee وAirbnb وEbnb وEbay وNVIDIA وIBM وAT&T وLINE وRobLOX وInflection وغيرها.

+

تضمن بنية نظام ميلفوس السحابية الأصلية والمنفصلة للغاية أن النظام يمكن أن يتوسع باستمرار مع نمو البيانات:

+

+ + Highly decoupled system architecture of Milvus + بنية النظام المنفصلة للغاية في ميلفوس

+

إن Milvus نفسه عديم الحالة بالكامل، لذا يمكن توسيع نطاقه بسهولة بمساعدة Kubernetes أو السحابة العامة. بالإضافة إلى ذلك، تم فصل مكونات Milvus بشكل جيد، حيث تم تصميم المهام الثلاث الأكثر أهمية - البحث، وإدخال البيانات، والفهرسة/التجميع - كعمليات متوازية بسهولة، مع فصل المنطق المعقد. يضمن ذلك إمكانية توسيع نطاق عقدة الاستعلام وعقدة البيانات وعقدة الفهرس المقابلة لها بشكل مستقل، مما يحسّن الأداء وكفاءة التكلفة.

+

أنواع عمليات البحث التي تدعمها ميلفوس

يدعم Milvus أنواعًا مختلفة من وظائف البحث لتلبية متطلبات حالات الاستخدام المختلفة:

+ +

مجموعة الميزات الشاملة

بالإضافة إلى ميزات البحث الرئيسية المذكورة أعلاه، يوفر Milvus أيضًا مجموعة من الميزات المنفذة حول عمليات بحث الشبكة الوطنية للبحث بحيث يمكنك الاستفادة الكاملة من إمكانياته.

+

واجهة برمجة التطبيقات و SDK

+

أنواع البيانات المتقدمة

بالإضافة إلى أنواع البيانات البدائية، تدعم ميلفوس أنواع بيانات متقدمة مختلفة ومقاييس المسافة المطبقة الخاصة بها.

+ +

التسريع

+

الأمان والتخويل

+

تكاملات الذكاء الاصطناعي

+

الأدوات والمنظومة

diff --git a/localization/v2.5.x/site/ar/about/roadmap.json b/localization/v2.5.x/site/ar/about/roadmap.json new file mode 100644 index 000000000..6cc594685 --- /dev/null +++ b/localization/v2.5.x/site/ar/about/roadmap.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Roadmap","anchorList":[{"label":"خارطة طريق ميلفوس","href":"Milvus-Roadmap","type":1,"isActive":false},{"label":"خارطة الطريق","href":"Roadmap","type":2,"isActive":false},{"label":"كيفية المساهمة","href":"How-to-contribute","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/about/roadmap.md b/localization/v2.5.x/site/ar/about/roadmap.md new file mode 100644 index 000000000..084e75a9a --- /dev/null +++ b/localization/v2.5.x/site/ar/about/roadmap.md @@ -0,0 +1,109 @@ +--- +id: roadmap.md +title: خارطة طريق ميلفوس +related_key: Milvus roadmap +summary: >- + Milvus هي قاعدة بيانات متجهة مفتوحة المصدر مصممة لتشغيل تطبيقات الذكاء + الاصطناعي. إليك خارطة طريقنا لتوجيه تطويرنا. +--- +

خارطة طريق ميلفوس

مرحبًا بك في خارطة طريق ميلفوس! انضم إلينا في رحلتنا المستمرة لتعزيز وتطوير ميلفوس. يسعدنا مشاركة إنجازاتنا، وخططنا المستقبلية، ورؤيتنا لما ينتظرنا في المستقبل. خارطة طريقنا هي أكثر من مجرد قائمة بالميزات القادمة - فهي تعكس التزامنا بالابتكار وتفانينا في العمل مع المجتمع. ندعوك للتعمق في خارطة الطريق الخاصة بنا وتقديم ملاحظاتك والمساعدة في تشكيل مستقبل ميلفوس!

+

خارطة الطريق

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الفئةميلفوس 2.5.0 (تم تحقيقه في الإصدارات الأخيرة)الإصدار التالي (منتصف العام الميلادي 25)خارطة الطريق المستقبلية (خلال عام واحد)
معالجة البيانات غير المهيكلة المستندة إلى الذكاء الاصطناعي
تعزيز القدرة على معالجة البيانات غير المهيكلة وتحليلها باستخدام نماذج الذكاء الاصطناعي والتقنيات المتقدمة.
البحث في النص الكامل
دعم البحث في النص الكامل باستخدام Sparse-BM25. تقبل واجهة برمجة التطبيقات الجديدة النص كمدخلات وتقوم تلقائيًا بإنشاء متجه متناثر داخل Milvus

متجه متناثر (GA)
دعم طريقة التخزين والفهرسة الفعالة للمتجه المتناثر
إدخال البيانات وإخراج البيانات
دعم خدمات النماذج الرئيسية لاستيعاب البيانات الأصلية

أداة إعادة التصنيف المتقدمة
دعم أدوات إعادة التصنيف المستندة إلى النموذج ووظيفة تسجيل النقاط المحددة من قبل المستخدم

تحسين JSON
فهرسة JSONوتحليلها لتسريع المعالجة
مدخل البيانات الأصلية ومخرج البيانات
دعم البيانات الأصلية دعم blob ومرجع URL لمعالجة البيانات الأصلية

دعم المزيد من أنواع البيانات
مثل التاريخ والوقت والخريطة ونظام المعلومات الجغرافية

دعم الموتر
دعم قائمة المتجهات دعم قائمة المتجهات، الاستخدام النموذجي مثل كولبيرت وكوبالي إلخ.
جودة وأداء البحث
تقديم نتائج دقيقة وذات صلة وسريعة من خلال تحسين البنية والخوارزميات وواجهات برمجة التطبيقات
وظيفة مطابقة النص
تصفية الكلمات المفتاحية/الرموز بسرعة في النص/المتغير

تحسين البحث في المجموعات
تقديم حجم_المجموعة وإضافة دعم المجموعة حسب في البحث المختلط

فهرس الصور النقطية والفهرس المقلوب
تسريع التصفية على العلامات
المطابقة المتقدمة
مثل مطابقة العبارة، والمطابقة الضبابية، والمزيد من الرموز

التجميعات
تجميعات الحقول العددية، مثل الحد الأدنى، والحد الأقصى، والعد، والمتميز.
التحديث الجزئي
دعم التحديثات لقيمة حقل معين

إمكانية الفرز
الفرز حسب الحقول العددية أثناء التنفيذ

دعم تجميع البيانات
تجميع البيانات تجميع البيانات المشتركة
الوظائف الغنية والإدارة
ميزات إدارة البيانات القوية والصديقة للمطورين
دعم ملفات CSV في استيراد البيانات
بولكنسيرت يدعم تنسيق CSV

دعم القيمة الفارغة والافتراضية
الأنواع الفارغةوالافتراضية تجعل استيراد البيانات من أنظمة إدارة قواعد البيانات الأخرى أسهل

واجهة مستخدم ميلفوس ويبUI (بيتا)
أدوات الإدارة المرئية لمديري إدارة البيانات
إلغاء ازدواجية المفتاح الأساسي
باستخدام فهرس pk العام

تغيير المخطط عبر الإنترنت
مثل إضافة/حذف حقل، تعديل طول متغير

إصدار البيانات واستعادتها
دعم إصدار البيانات عن طريق اللقطة
الصدأ و ++C SDK
دعم المزيد منالعملاء

دعم UDF
الدالة المعرفة من قبل المستخدم
كفاءة التكلفةوالفعالية من حيث التكلفة
أحدث الأنظمة، مع إعطاء الأولوية للاستقرار والفعالية من حيث التكلفة وقابلية التوسع
التحميل حسب الحقل
اختيار جزء من المجموعة للتحميل

تحسين الذاكرةتحسين الذاكرة
تقليل التشغيل خارج الخدمة وتحسين التحميل

عقدة التدفق (بيتا)
توفير الاتساق العالمي وحل عنق الزجاجة في الأداء على المنسق الجذر

تنسيق التخزين V2 (بيتا)
تصميم التنسيقات العالمية وأساس الوصول إلى البيانات المستندة إلى القرص

تجميع الضغط
إعادة توزيع البيانات بناءً على التكوين لتسريع أداء القراءة
التحميل البطيء
يمكن بدء التحميل من خلال عملية القراءة الأولى دون استدعاء التحميل ()بشكل صريح

التخزين المتدرج التخزين المتدرج
دعم التخزين الساخن والبارد لتحسين التكلفة

الإصدار حسب المجال
إصدار جزء من المجموعة لتقليل استخدام الذاكرة

عقدة التدفق (GA)
معالجة البيانات المتدفقة وتبسيط البنية
إزالة التبعيات
تقليل أو إزالة التبعيات على المكونات الخارجية مثل pulsar، إلخ

دمج منطق التنسيق في MixCoord
تبسيط البنية
+ +

كيفية المساهمة

كمشروع مفتوح المصدر، يزدهر ميلفوس بمساهمات المجتمع. إليك كيف يمكنك أن تكون جزءًا من رحلتنا.

+

مشاركة الملاحظات

+

مساهمات الكود

+

انشر الكلمة

diff --git a/localization/v2.5.x/site/ar/adminGuide/allocate.json b/localization/v2.5.x/site/ar/adminGuide/allocate.json new file mode 100644 index 000000000..6a57e504d --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/allocate.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi\n","helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi\n","dataNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\nqueryNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\n","helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml\n"],"headingContent":"Allocate Resources on Kubernetes","anchorList":[{"label":"تخصيص الموارد على Kubernetes","href":"Allocate-Resources-on-Kubernetes","type":1,"isActive":false},{"label":"1. عرض الموارد المتاحة","href":"1-View-available-resources","type":2,"isActive":false},{"label":"2. تخصيص الموارد","href":"2-Allocate-resources","type":2,"isActive":false},{"label":"3. تطبيق التكوينات","href":"3-Apply-configurations","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/allocate.md b/localization/v2.5.x/site/ar/adminGuide/allocate.md new file mode 100644 index 000000000..e16e650bf --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/allocate.md @@ -0,0 +1,141 @@ +--- +id: allocate.md +title: تخصيص الموارد لميلفوس على Kubernetes +summary: تعرف على كيفية تخصيص الموارد لـ Milvus على Kubernetes. +--- +

تخصيص الموارد على Kubernetes

يصف هذا الموضوع كيفية تخصيص الموارد لمجموعة Milvus على Kubernetes.

+

بشكل عام، يجب أن تكون الموارد التي تخصصها لمجموعة Milvus في الإنتاج متناسبة مع عبء عمل الجهاز. يجب عليك أيضًا مراعاة نوع الجهاز عند تخصيص الموارد. على الرغم من أنه يمكنك تحديث التكوينات عند تشغيل المجموعة، إلا أننا نوصي بتعيين القيم قبل نشر المجموعة.

+
+

للحصول على معلومات حول كيفية تخصيص الموارد باستخدام مشغل Milvus، راجع تخصيص الموارد باستخدام مشغل Milvus.

+
+

1. عرض الموارد المتاحة

قم بتشغيل kubectl describe nodes لعرض الموارد المتاحة في المثيلات التي قمت بتزويدها.

+

2. تخصيص الموارد

استخدم Helm لتخصيص موارد وحدة المعالجة المركزية وموارد الذاكرة لمكونات Milvus.

+
+سيؤدي استخدام Helm لترقية الموارد إلى إجراء تحديث متجدد للقرون قيد التشغيل.
+

هناك طريقتان لتخصيص الموارد:

+ +

تخصيص الموارد باستخدام الأوامر

تحتاج إلى تعيين متغيرات الموارد لكل مكون من مكونات Milvus إذا كنت تستخدم --set لتحديث تكوينات الموارد.

+
+ عنقودميلفوس المستقل ميلفوس العنقودي
+
+
helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi
+
+
+
+
helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi
+
+
+

تخصيص الموارد عن طريق تعيين ملف التكوين

يمكنك أيضًا تخصيص موارد وحدة المعالجة المركزية وموارد الذاكرة عن طريق تحديد المعلمات resources.requests و resources.limits في الملف resources.yaml.

+
dataNode:
+  resources:
+    limits:
+      cpu: "4"
+      memory: "16Gi"
+    requests:
+      cpu: "1"
+      memory: "4Gi"
+queryNode:
+  resources:
+    limits:
+      cpu: "4"
+      memory: "16Gi"
+    requests:
+      cpu: "1"
+      memory: "4Gi"
+
+

3. تطبيق التكوينات

قم بتشغيل الأمر التالي لتطبيق التكوينات الجديدة على مجموعة ميلفوس العنقودية الخاصة بك.

+
helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml
+
+
+إذا لم يتم تحديد resources.limits ، ستستهلك الكبسولات جميع موارد وحدة المعالجة المركزية والذاكرة المتاحة. لذلك، تأكد من تحديد resources.requests و resources.limits لتجنب التخصيص الكلي للموارد عندما تتطلب المهام الأخرى قيد التشغيل على نفس المثيل استهلاك المزيد من الذاكرة.
+

راجع وثائق Kubernetes لمزيد من المعلومات حول إدارة الموارد.

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/authenticate.json b/localization/v2.5.x/site/ar/adminGuide/authenticate.json new file mode 100644 index 000000000..e475deca8 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/authenticate.json @@ -0,0 +1 @@ +{"codeList":["...\ncommon:\n...\n security:\n authorizationEnabled: true\n...\n","...\nextraConfigFiles:\n user.yaml: |+\n common:\n security:\n authorizationEnabled: true\n...\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n common:\n security:\n authorizationEnabled: true\n","# use default `root` user to connect to Milvus\n\nfrom pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri='http://localhost:19530', # replace with your own Milvus server address\n token=\"root:Milvus\"\n) \n","# create a user\nclient.create_user(\n user_name=\"user_1\",\n password=\"P@ssw0rd\",\n)\n\n# verify the user has been created\n\nclient.describe_user(\"user_1\")\n\n# output\n# {'user_name': 'user_1', 'roles': ()}\n","# connect to milvus with the newly created user\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"user_1:P@ssw0rd\"\n)\n","# update password\n\nclient.update_password(\n user_name=\"user_1\",\n old_password=\"P@ssw0rd\",\n new_password=\"P@ssw0rd123\"\n)\n","common:\n security:\n superUsers: root, foo\n","client.drop_user(user_name=\"user_1\")\n","# list all users\n\nclient.list_users()\n"],"headingContent":"Authenticate User Access","anchorList":[{"label":"مصادقة وصول المستخدم","href":"Authenticate-User-Access","type":1,"isActive":false},{"label":"تمكين مصادقة المستخدم","href":"Enable-user-authentication","type":2,"isActive":false},{"label":"الاتصال بـ Milvus مع المصادقة","href":"Connect-to-Milvus-with-authentication","type":2,"isActive":false},{"label":"إنشاء مستخدم جديد","href":"Create-a-new-user","type":2,"isActive":false},{"label":"الاتصال بـ Milvus باستخدام مستخدم جديد","href":"Connect-to-Milvus-with-a-new-user","type":2,"isActive":false},{"label":"تحديث كلمة مرور المستخدم","href":"Update-user-password","type":2,"isActive":false},{"label":"إسقاط مستخدم","href":"Drop-a-user","type":2,"isActive":false},{"label":"سرد جميع المستخدمين","href":"List-all-users","type":2,"isActive":false},{"label":"القيود","href":"Limitations","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/authenticate.md b/localization/v2.5.x/site/ar/adminGuide/authenticate.md new file mode 100644 index 000000000..3833b4416 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/authenticate.md @@ -0,0 +1,277 @@ +--- +id: authenticate.md +summary: تعرف على كيفية إدارة مصادقة المستخدم في Milvus. +title: مصادقة وصول المستخدم +--- +

مصادقة وصول المستخدم

يشرح هذا الدليل كيفية إدارة مصادقة المستخدم في Milvus، بما في ذلك تمكين المصادقة والاتصال كمستخدم وتعديل بيانات اعتماد المستخدم.

+
+ +
+

تمكين مصادقة المستخدم

+ مُشغّل Docker Compose Helm Milvus Helm
+
+

لتمكين مصادقة المستخدم لخادم Milvus الخاص بك، قم بتعيين common.security.authorizationEnabled إلى صواب في ملف تكوين Milvus milvus.yaml. لمزيد من المعلومات حول التكوينات، راجع تكوين Milvus مع Docker Compose.

+
...
+common:
+...
+  security:
+    authorizationEnabled: true
+...
+
+
+
+

لتمكين مصادقة المستخدم لخادم Milvus الخاص بك، قم بتعيين authorizationEnabled إلى صواب في ملف تكوين Milvus values.yaml. لمزيد من المعلومات حول التكوينات، راجع تكوين ملف Milvus مع مخططات Helm.

+
...
+extraConfigFiles:
+  user.yaml: |+
+    common:
+      security:
+        authorizationEnabled: true
+...
+
+
+
+

لتمكين المصادقة، قم بتعيين spec.common.security.authorizationEnabled إلى true في ملف Milvus CRD. للمزيد من المعلومات حول قرص مالفوس CRD، راجع تكوين ملف Milvus مع مشغل Milvus.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  # Omit other fields ...
+  config:
+    common:
+      security:
+        authorizationEnabled: true
+
+
+

الاتصال بـ Milvus مع المصادقة

بعد تمكين المصادقة، تحتاج إلى الاتصال بـ Milvus باستخدام اسم مستخدم وكلمة مرور. بشكل افتراضي، يتم إنشاء المستخدم root باستخدام كلمة المرور Milvus عند بدء تشغيل ملفوس. فيما يلي مثال على كيفية الاتصال بـ Milvus مع تمكين المصادقة باستخدام المستخدم الافتراضي root:

+
# use default `root` user to connect to Milvus
+
+from pymilvus import MilvusClient
+
+client = MilvusClient(
+    uri='http://localhost:19530', # replace with your own Milvus server address
+    token="root:Milvus"
+) 
+
+
+إذا فشلت في توفير رمز مميز صالح عند الاتصال بـ Milvus مع تمكين المصادقة، ستتلقى خطأ gRPC.
+

إنشاء مستخدم جديد

بمجرد الاتصال كمستخدم root الافتراضي، يمكنك إنشاء مستخدم جديد والمصادقة عليه كما يلي:

+
# create a user
+client.create_user(
+    user_name="user_1",
+    password="P@ssw0rd",
+)
+
+# verify the user has been created
+
+client.describe_user("user_1")
+
+# output
+# {'user_name': 'user_1', 'roles': ()}
+
+

للمزيد من المعلومات حول إنشاء مستخدمين، راجع create_user().

+

الاتصال بـ Milvus باستخدام مستخدم جديد

اتصل باستخدام بيانات اعتماد المستخدم الذي تم إنشاؤه حديثاً:

+
# connect to milvus with the newly created user
+
+client = MilvusClient(
+    uri="http://localhost:19530",
+    token="user_1:P@ssw0rd"
+)
+
+

تحديث كلمة مرور المستخدم

قم بتغيير كلمة المرور لمستخدم موجود باستخدام الرمز التالي:

+
# update password
+
+client.update_password(
+    user_name="user_1",
+    old_password="P@ssw0rd",
+    new_password="P@ssw0rd123"
+)
+
+

لمزيد من المعلومات حول تحديث كلمات مرور المستخدم، راجع update_password().

+

إذا نسيت كلمة المرور القديمة، يوفر ميلفوس عنصر تهيئة يسمح لك بتعيين مستخدمين معينين كمستخدمين خارقين. هذا يلغي الحاجة إلى كلمة المرور القديمة عند إعادة تعيين كلمة المرور.

+

بشكل افتراضي، يكون الحقل common.security.superUsers في ملف تكوين ملف Milvus فارغًا، مما يعني أنه يجب على جميع المستخدمين تقديم كلمة المرور القديمة عند إعادة تعيين كلمة المرور الخاصة بهم. ومع ذلك، يمكنك تعيين مستخدمين محددين كمستخدمين متميزين لا يحتاجون إلى تقديم كلمة المرور القديمة. في المقتطف أدناه، تم تعيين root و foo كمستخدمين متميزين.

+

يجب عليك إضافة عنصر التكوين أدناه في ملف تكوين ميلفوس الذي يحكم تشغيل مثيل ميلفوس الخاص بك.

+
common:
+    security:
+        superUsers: root, foo
+
+

إسقاط مستخدم

لإسقاط مستخدم، استخدم طريقة drop_user().

+
client.drop_user(user_name="user_1")
+
+
+لإسقاط مستخدم، لا يمكن أن تكون المستخدم الذي يتم إسقاطه. وإلا فسيظهر خطأ.
+

سرد جميع المستخدمين

سرد جميع المستخدمين.

+
# list all users
+
+client.list_users()
+
+

القيود

    +
  1. يجب ألا يكون اسم المستخدم فارغًا، ويجب ألا يتجاوز طوله 32 حرفًا. يجب أن يبدأ بحرف، وأن يحتوي فقط على أحرف سفلية أو أحرف أو أرقام.
  2. +
  3. يجب أن تحتوي كلمة المرور على 6 أحرف على الأقل ويجب ألا يتجاوز طولها 256 حرفاً.
  4. +
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/chunk_cache.json b/localization/v2.5.x/site/ar/adminGuide/chunk_cache.json new file mode 100644 index 000000000..a69986112 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/chunk_cache.json @@ -0,0 +1 @@ +{"codeList":["queryNode:\n cache:\n warmup: async\n"],"headingContent":"Configure Chunk Cache","anchorList":[{"label":"تكوين ذاكرة التخزين المؤقت للقطع","href":"Configure-Chunk-Cache","type":1,"isActive":false},{"label":"الخلفية","href":"Background","type":2,"isActive":false},{"label":"تكوين ذاكرة التخزين المؤقت للقطع","href":"Configure-Chunk-Cache","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/chunk_cache.md b/localization/v2.5.x/site/ar/adminGuide/chunk_cache.md new file mode 100644 index 000000000..bda465d23 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/chunk_cache.md @@ -0,0 +1,77 @@ +--- +id: chunk_cache.md +title: تكوين ذاكرة التخزين المؤقت للقطع +--- +

تكوين ذاكرة التخزين المؤقت للقطع

تتيح آلية التخزين المؤقت للقطع لـ Milvus تحميل البيانات مسبقًا في ذاكرة التخزين المؤقت على القرص الصلب المحلي لعقد الاستعلام قبل الحاجة إليها. تعمل هذه الآلية على تحسين أداء استرجاع المتجهات بشكل كبير من خلال تقليل الوقت الذي يستغرقه تحميل البيانات من القرص إلى الذاكرة.

+

الخلفية

قبل إجراء الاستعلامات لاسترداد المتجهات، يحتاج برنامج Milvus إلى تحميل البيانات من تخزين الكائنات إلى ذاكرة التخزين المؤقت على القرص الصلب المحلي لعقد الاستعلام. هذه عملية تستغرق وقتاً طويلاً. قبل أن يتم تحميل جميع البيانات، قد يستجيب ميلفوس لبعض طلبات استرجاع المتجهات مع تأخير.

+

ولتحسين أداء الاستعلام، يوفر Milvus آلية ذاكرة تخزين مؤقتة للقطع لتحميل البيانات مسبقاً من تخزين الكائنات في ذاكرة التخزين المؤقت على القرص الصلب المحلي قبل الحاجة إليها. عندما يتم استلام طلب استعلام، يتحقق Segcore أولاً مما إذا كانت البيانات موجودة في ذاكرة التخزين المؤقت، بدلاً من تخزين الكائنات. إذا كانت البيانات موجودة في ذاكرة التخزين المؤقت، يمكن لـ Segcore استرجاعها بسرعة من ذاكرة التخزين المؤقت وإرجاع النتيجة إلى العميل.

+

تكوين ذاكرة التخزين المؤقت للقطع

يوفر هذا الدليل إرشادات حول كيفية تكوين آلية ذاكرة التخزين المؤقت للقطع لمثيل Milvus. يختلف التكوين باختلاف طريقة تثبيت مثيل Milvus.

+ +

خيارات التكوين

queryNode:
+    cache:
+        warmup: async
+
+

تحدد المعلمة warmup ما إذا كان Milvus يقوم بتحميل البيانات مسبقًا من مخزن الكائنات في ذاكرة التخزين المؤقت على القرص الثابت المحلي لعقد الاستعلام قبل الحاجة إليها. يتم تعيين هذه المعلمة افتراضيًا على disable. الخيارات الممكنة هي كما يلي:

+ +

لاحظ أن إعدادات ذاكرة التخزين المؤقت للقطع تنطبق أيضًا عند إدراج بيانات جديدة في المجموعات أو عند إعادة بناء فهارس المجموعة.

+

الأسئلة الشائعة

diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.json b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.json new file mode 100644 index 000000000..ad7823fae --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.json @@ -0,0 +1 @@ +{"codeList":["variable \"index_count\" {\n description = \"Amount of index instances to run\"\n type = number\n default = 5\n}\n","variable \"index_ec2_type\" {\n description = \"Which server type\"\n type = string\n default = \"c5.2xlarge\"\n}\n","variable \"key_name\" {\n description = \"Which aws key to use for access into instances, needs to be uploaded already\"\n type = string\n default = \"\"\n}\n\nvariable \"my_ip\" {\n description = \"my_ip for security group. used so that ansible and terraform can ssh in\"\n type = string\n default = \"x.x.x.x/32\"\n}\n","provider \"aws\" {\n profile = \"default\"\n region = \"us-east-2\"\n}\n","resource \"aws_security_group\" \"cluster_sg\" {\n name = \"cluster_sg\"\n description = \"Allows only me to access\"\n vpc_id = aws_vpc.cluster_vpc.id\n\n ingress {\n description = \"All ports from my IP\"\n from_port = 0\n to_port = 65535\n protocol = \"tcp\"\n cidr_blocks = [var.my_ip]\n }\n\n ingress {\n description = \"Full subnet communication\"\n from_port = 0\n to_port = 65535\n protocol = \"all\"\n self = true\n }\n\n egress {\n from_port = 0\n to_port = 0\n protocol = \"-1\"\n cidr_blocks = [\"0.0.0.0/0\"]\n ipv6_cidr_blocks = [\"::/0\"]\n }\n\n tags = {\n Name = \"cluster_sg\"\n }\n}\n","resource \"aws_vpc\" \"cluster_vpc\" {\n cidr_block = \"10.0.0.0/24\"\n tags = {\n Name = \"cluster_vpc\"\n }\n}\n\nresource \"aws_internet_gateway\" \"cluster_gateway\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n tags = {\n Name = \"cluster_gateway\"\n }\n}\n","resource \"aws_subnet\" \"cluster_subnet\" {\n vpc_id = aws_vpc.cluster_vpc.id\n cidr_block = \"10.0.0.0/24\"\n map_public_ip_on_launch = true\n\n tags = {\n Name = \"cluster_subnet\"\n }\n}\n\nresource \"aws_route_table\" \"cluster_subnet_gateway_route\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n route {\n cidr_block = \"0.0.0.0/0\"\n gateway_id = aws_internet_gateway.cluster_gateway.id\n }\n\n tags = {\n Name = \"cluster_subnet_gateway_route\"\n }\n}\n\nresource \"aws_route_table_association\" \"cluster_subnet_add_gateway\" {\n subnet_id = aws_subnet.cluster_subnet.id\n route_table_id = aws_route_table.cluster_subnet_gateway_route.id\n}\n\n","resource \"aws_instance\" \"minio_node\" {\n count = var.minio_count\n ami = \"ami-0d8d212151031f51c\"\n instance_type = var.minio_ec2_type\n key_name = var.key_name\n subnet_id = aws_subnet.cluster_subnet.id \n vpc_security_group_ids = [aws_security_group.cluster_sg.id]\n\n root_block_device {\n volume_type = \"gp2\"\n volume_size = 1000\n }\n \n tags = {\n Name = \"minio-${count.index + 1}\"\n }\n}\n","git clone https://github.com/milvus-io/milvus.git\n","$ cd ./milvus/deployments/docker/cluster-distributed-deployment\n","[dockernodes] #Add docker host names.\ndockernode01\ndockernode02\ndockernode03\n\n[admin] #Add Ansible controller name.\nansible-controller\n\n[coords] #Add the host names of Milvus coordinators.\n; Take note the IP of this host VM, and replace 10.170.0.17 with it.\ndockernode01\n\n[nodes] #Add the host names of Milvus nodes.\ndockernode02\n\n[dependencies] #Add the host names of Milvus dependencies.\n; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. \n; Take note the IP of this host VM, and replace 10.170.0.19 with it.\ndockernode03\n\n[docker:children]\ndockernodes\ncoords\nnodes\ndependencies\n\n[docker:vars]\nansible_python_interpreter= /usr/bin/python3\nStrictHostKeyChecking= no\n\n; Setup variables to control what type of network to use when creating containers.\ndependencies_network= host\nnodes_network= host\n\n; Setup varibale to control what version of Milvus image to use.\nimage= milvusdb/milvus-dev:master-20220412-4781db8a\n\n; Setup static IP addresses of the docker hosts as variable for container environment variable config.\n; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM\n; on which the etcd, minio, pulsar, coordinators will be hosted.\netcd_ip= 10.170.0.19\nminio_ip= 10.170.0.19\npulsar_ip= 10.170.0.19\ncoords_ip= 10.170.0.17\n\n; Setup container environment which later will be used in container creation.\nETCD_ENDPOINTS= {{etcd_ip}}:2379 \nMINIO_ADDRESS= {{minio_ip}}:9000\nPULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650\nQUERY_COORD_ADDRESS= {{coords_ip}}:19531\nDATA_COORD_ADDRESS= {{coords_ip}}:13333\nROOT_COORD_ADDRESS= {{coords_ip}}:53100\nINDEX_COORD_ADDRESS= {{coords_ip}}:31000\n","[defaults]\nhost_key_checking = False\ninventory = inventory.ini # Specify the Inventory file\nprivate_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host\n","---\n- name: setup pre-requisites # Install prerequisite\n hosts: all\n become: yes\n become_user: root\n roles:\n - install-modules\n - configure-hosts-file\n\n- name: install docker\n become: yes\n become_user: root\n hosts: dockernodes\n roles:\n - docker-installation\n","$ ansible all -m ping\n","dockernode01 | SUCCESS => {\n\"changed\": false,\n\"ping\": \"pong\"\n}\nansible-controller | SUCCESS => {\n \"ansible_facts\": {\n \"discovered_interpreter_python\": \"/usr/bin/python3\"\n },\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode03 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode02 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\n","$ ansible-playbook deploy-docker.yml --syntax-check\n","playbook: deploy-docker.yml\n","$ ansible-playbook deploy-docker.yml\n","TASK [docker-installation : Install Docker-CE] *******************************************************************\nok: [dockernode01]\nok: [dockernode03]\nok: [dockernode02]\n\nTASK [docker-installation : Install python3-docker] **************************************************************\nok: [dockernode01]\nok: [dockernode02]\nok: [dockernode03]\n\nTASK [docker-installation : Install docker-compose python3 library] **********************************************\nchanged: [dockernode01]\nchanged: [dockernode03]\nchanged: [dockernode02]\n\nPLAY RECAP *******************************************************************************************************\nansible-controller : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n","$ docker -v\n","$ sudo docker -v\n","Docker version 20.10.14, build a224086\n","$ docker ps\n","$ ansible-playbook deploy-milvus.yml --syntax-check\n","playbook: deploy-milvus.yml\n","$ ansible-playbook deploy-milvus.yml\n","PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode03]\n\nTASK [etcd] *******************************************************************************************************\nchanged: [dockernode03]\n\nTASK [pulsar] *****************************************************************************************************\nchanged: [dockernode03]\n\nTASK [minio] ******************************************************************************************************\nchanged: [dockernode03]\n\nPLAY [Create milvus nodes] ****************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode02]\n\nTASK [querynode] **************************************************************************************************\nchanged: [dockernode02]\n\nTASK [datanode] ***************************************************************************************************\nchanged: [dockernode02]\n\nTASK [indexnode] **************************************************************************************************\nchanged: [dockernode02]\n\nPLAY [Create milvus coords] ***************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode01]\n\nTASK [rootcoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [datacoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [querycoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [indexcoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [proxy] ******************************************************************************************************\nchanged: [dockernode01]\n\nPLAY RECAP ********************************************************************************************************\ndockernode01 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n"],"headingContent":"(Deprecated) Deploy a Milvus Cluster on EC2","anchorList":[{"label":"(مهملة) نشر مجموعة Milvus على EC2","href":"Deprecated-Deploy-a-Milvus-Cluster-on-EC2","type":1,"isActive":false},{"label":"توفير مجموعة Milvus العنقودية","href":"Provision-a-Milvus-cluster","type":2,"isActive":false},{"label":"بدء تشغيل مجموعة ميلفوس","href":"Start-the-Milvus-cluster","type":2,"isActive":false},{"label":"إيقاف العقد","href":"Stop-nodes","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.md b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.md new file mode 100644 index 000000000..6b51026de --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws.md @@ -0,0 +1,494 @@ +--- +id: aws.md +title: نشر مجموعة Milvus العنقودية على EC2 +related_key: cluster +summary: تعرّف على كيفية نشر مجموعة Milvus العنقودية على AWS EC2. +--- +

(مهملة) نشر مجموعة Milvus على EC2

يصف هذا الموضوع كيفية نشر مجموعة Milvus على Amazon EC2 باستخدام Terraform و Ansible.

+
+

هذا الموضوع قديم وستتم إزالته قريبًا. يُنصح بالرجوع إلى نشر مجموعة Milvus العنقودية على EKS بدلاً من ذلك.

+
+

توفير مجموعة Milvus العنقودية

يصف هذا القسم كيفية استخدام تيرافورم Terraform لتوفير مجموعة Milvus العنقودية.

+

تيرافورم هي أداة برمجية للبنية التحتية كرمز (IaC). باستخدام تيرافورم، يمكنك توفير البنية التحتية باستخدام ملفات التكوين التوضيحية.

+

المتطلبات الأساسية

+

إعداد التكوين

يمكنك تنزيل ملفات تكوين القالب من Google Drive.

+ +

إعداد المتغيرات.tf

يصف هذا القسم التكوين الذي يحتوي عليه ملف variables.tf الذي يحتوي على.

+ +

إعداد main.tf

يصف هذا القسم التكوينات التي يحتوي عليها ملف main.tf الذي يحتوي على.

+ +

تطبيق التكوين

    +
  1. افتح محطة طرفية وانتقل إلى المجلد الذي يخزن main.tf.

  2. +
  3. لتهيئة التهيئة، قم بتشغيل terraform init.

  4. +
  5. لتطبيق التهيئة، قم بتشغيل terraform apply وأدخل yes عندما يُطلب منك ذلك.

  6. +
+

لقد قمت الآن بتزويد مجموعة Milvus مع تيرافورم.

+

بدء تشغيل مجموعة ميلفوس

يصف هذا القسم كيفية استخدام Ansible لبدء تشغيل مجموعة Milvus التي قمت بتزويدها.

+

Ansible هي أداة لإدارة التكوين تُستخدم لأتمتة توفير السحابة وإدارة التكوين.

+

المتطلبات الأساسية

+

تنزيل دليل تشغيل نشر عقدة Milvus Ansible Milvus

قم باستنساخ مستودع Milvus من GitHub لتنزيل دليل تشغيل نشر عقدة Ansible Milvus.

+
git clone https://github.com/milvus-io/milvus.git
+
+

تكوين ملفات التثبيت

يتم استخدام الملفين inventory.ini و ansible.cfg للتحكم في متغيرات البيئة وطرق التحقق من تسجيل الدخول في كتاب تشغيل Ansible. في الملف inventory.ini ، يحدد القسم dockernodes جميع خوادم محركات دوكر. يحدد قسم ansible.cfg جميع خوادم منسقي ميلفوس. يحدد قسم node جميع خوادم عقد ميلفوس.

+

أدخل المسار المحلي لدليل التشغيل وقم بتكوين ملفات التثبيت.

+
$ cd ./milvus/deployments/docker/cluster-distributed-deployment
+
+

inventory.ini

قم بتكوين inventory.ini لتقسيم المضيفين في مجموعات وفقاً لأدوارهم في نظام ميلفوس.

+

أضف أسماء المضيفين، وحدد docker المجموعة و vars.

+
[dockernodes] #Add docker host names.
+dockernode01
+dockernode02
+dockernode03
+
+[admin] #Add Ansible controller name.
+ansible-controller
+
+[coords] #Add the host names of Milvus coordinators.
+; Take note the IP of this host VM, and replace 10.170.0.17 with it.
+dockernode01
+
+[nodes] #Add the host names of Milvus nodes.
+dockernode02
+
+[dependencies] #Add the host names of Milvus dependencies.
+; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. 
+; Take note the IP of this host VM, and replace 10.170.0.19 with it.
+dockernode03
+
+[docker:children]
+dockernodes
+coords
+nodes
+dependencies
+
+[docker:vars]
+ansible_python_interpreter= /usr/bin/python3
+StrictHostKeyChecking= no
+
+; Setup variables to control what type of network to use when creating containers.
+dependencies_network= host
+nodes_network= host
+
+; Setup varibale to control what version of Milvus image to use.
+image= milvusdb/milvus-dev:master-20220412-4781db8a
+
+; Setup static IP addresses of the docker hosts as variable for container environment variable config.
+; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
+; on which the etcd, minio, pulsar, coordinators will be hosted.
+etcd_ip= 10.170.0.19
+minio_ip= 10.170.0.19
+pulsar_ip= 10.170.0.19
+coords_ip= 10.170.0.17
+
+; Setup container environment which later will be used in container creation.
+ETCD_ENDPOINTS= {{etcd_ip}}:2379 
+MINIO_ADDRESS= {{minio_ip}}:9000
+PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
+QUERY_COORD_ADDRESS= {{coords_ip}}:19531
+DATA_COORD_ADDRESS= {{coords_ip}}:13333
+ROOT_COORD_ADDRESS= {{coords_ip}}:53100
+INDEX_COORD_ADDRESS= {{coords_ip}}:31000
+
+

ansible.cfg

ansible.cfg التحكم في عمل كتاب التشغيل، على سبيل المثال، مفتاح SSH، إلخ. لا تقم بإعداد عبارة المرور عبر مفتاح SSH على مضيفي docker. وإلا سيفشل اتصال Ansible SSH. نوصي بإعداد نفس اسم المستخدم ومفتاح SSH على المضيفين الثلاثة وإعداد حساب المستخدم الجديد لتنفيذ sudo بدون كلمة مرور. خلاف ذلك، ستتلقى أخطاءً تفيد بأن اسم المستخدم لا يتطابق مع كلمة المرور أو أنك لم تُمنح امتيازات مرتفعة عند تشغيل كتاب تشغيل Ansible playbook.

+
[defaults]
+host_key_checking = False
+inventory = inventory.ini # Specify the Inventory file
+private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host
+
+

deploy-docker.yml

deploy-docker.yml يحدد المهام أثناء تثبيت Docker. راجع التعليقات البرمجية في الملف للحصول على التفاصيل.

+
---
+- name: setup pre-requisites # Install prerequisite
+  hosts: all
+  become: yes
+  become_user: root
+  roles:
+    - install-modules
+    - configure-hosts-file
+
+- name: install docker
+  become: yes
+  become_user: root
+  hosts: dockernodes
+  roles:
+    - docker-installation
+
+

اختبار الاتصال بـ Ansible

اختبر الاتصال بـ Ansible.

+
$ ansible all -m ping
+
+

أضف -i في الأمر لتحديد المسار إلى ملف المخزون إذا لم تحدده في ansible.cfg ، وإلا يستخدم Ansible /etc/ansible/hosts.

+

تعود المحطة الطرفية على النحو التالي:

+
dockernode01 | SUCCESS => {
+"changed": false,
+"ping": "pong"
+}
+ansible-controller | SUCCESS => {
+    "ansible_facts": {
+        "discovered_interpreter_python": "/usr/bin/python3"
+    },
+    "changed": false,
+    "ping": "pong"
+}
+dockernode03 | SUCCESS => {
+    "changed": false,
+    "ping": "pong"
+}
+dockernode02 | SUCCESS => {
+    "changed": false,
+    "ping": "pong"
+}
+
+

تحقق من بناء جملة دفتر التشغيل

تحقق من بناء جملة دفتر التشغيل.

+
$ ansible-playbook deploy-docker.yml --syntax-check
+
+

عادةً ما ترجع المحطة الطرفية على النحو التالي:

+
playbook: deploy-docker.yml
+
+

تثبيت Docker

قم بتثبيت Docker باستخدام Playbook.

+
$ ansible-playbook deploy-docker.yml
+
+

إذا تم تثبيت Docker بنجاح على المضيفين الثلاثة، ستُظهر المحطة الطرفية ما يلي:

+
TASK [docker-installation : Install Docker-CE] *******************************************************************
+ok: [dockernode01]
+ok: [dockernode03]
+ok: [dockernode02]
+
+TASK [docker-installation : Install python3-docker] **************************************************************
+ok: [dockernode01]
+ok: [dockernode02]
+ok: [dockernode03]
+
+TASK [docker-installation : Install docker-compose python3 library] **********************************************
+changed: [dockernode01]
+changed: [dockernode03]
+changed: [dockernode02]
+
+PLAY RECAP *******************************************************************************************************
+ansible-controller         : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+dockernode01               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+dockernode02               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+dockernode03               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+
+

التحقق من التثبيت

قم بتسجيل الدخول إلى المضيفين الثلاثة باستخدام مفتاح SSH، وتحقق من التثبيت على المضيفين.

+ +
$ docker -v
+
+ +
$ sudo docker -v
+
+

عادة، تعود المحطة الطرفية على النحو التالي:

+
Docker version 20.10.14, build a224086
+
+

تحقق من حالة تشغيل الحاويات.

+
$ docker ps
+
+

تحقق من بناء الجملة

تحقق من بناء الجملة deploy-milvus.yml.

+
$ ansible-playbook deploy-milvus.yml --syntax-check
+
+

عادة، تعود المحطة الطرفية على النحو التالي:

+
playbook: deploy-milvus.yml
+
+

إنشاء حاوية ميلفوس

يتم تعريف مهام إنشاء حاوية ميلفوس في deploy-milvus.yml.

+
$ ansible-playbook deploy-milvus.yml
+
+

تعود المحطة الطرفية على النحو التالي:

+
PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************
+
+TASK [Gathering Facts] ********************************************************************************************
+ok: [dockernode03]
+
+TASK [etcd] *******************************************************************************************************
+changed: [dockernode03]
+
+TASK [pulsar] *****************************************************************************************************
+changed: [dockernode03]
+
+TASK [minio] ******************************************************************************************************
+changed: [dockernode03]
+
+PLAY [Create milvus nodes] ****************************************************************************************
+
+TASK [Gathering Facts] ********************************************************************************************
+ok: [dockernode02]
+
+TASK [querynode] **************************************************************************************************
+changed: [dockernode02]
+
+TASK [datanode] ***************************************************************************************************
+changed: [dockernode02]
+
+TASK [indexnode] **************************************************************************************************
+changed: [dockernode02]
+
+PLAY [Create milvus coords] ***************************************************************************************
+
+TASK [Gathering Facts] ********************************************************************************************
+ok: [dockernode01]
+
+TASK [rootcoord] **************************************************************************************************
+changed: [dockernode01]
+
+TASK [datacoord] **************************************************************************************************
+changed: [dockernode01]
+
+TASK [querycoord] *************************************************************************************************
+changed: [dockernode01]
+
+TASK [indexcoord] *************************************************************************************************
+changed: [dockernode01]
+
+TASK [proxy] ******************************************************************************************************
+changed: [dockernode01]
+
+PLAY RECAP ********************************************************************************************************
+dockernode01               : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+dockernode02               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+dockernode03               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
+
+

الآن تم نشر Milvus على المضيفين الثلاثة.

+

إيقاف العقد

يمكنك إيقاف جميع العقد بعد أن لم تعد بحاجة إلى مجموعة Milvus بعد الآن.

+
تأكد من توفر ثنائي terraform على موقعك PATH.
+
    +
  1. قم بتشغيل terraform destroy وأدخل yes عندما يُطلب منك ذلك.

  2. +
  3. إذا نجحت، يتم إيقاف جميع مثيلات العقد.

  4. +
+

ما التالي

إذا كنت ترغب في معرفة كيفية نشر Milvus على السحب الأخرى:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.json b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.json new file mode 100644 index 000000000..0e544319f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP\n","# If the import-certificate command is successful, it returns the arn of the imported certificate.\naws acm import-certificate --certificate fileb://Certificate.pem \\\n --certificate-chain fileb://CertificateChain.pem \\\n --private-key fileb://PrivateKey.pem \n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n namespace: milvus\n name: milvus-demo\n annotations:\n alb.ingress.kubernetes.io/scheme: internet-facing\n alb.ingress.kubernetes.io/backend-protocol-version: GRPC\n alb.ingress.kubernetes.io/target-type: ip\n alb.ingress.kubernetes.io/listen-ports: '[{\"HTTPS\":443}]'\n alb.ingress.kubernetes.io/certificate-arn: \"arn:aws:acm:region:account-id:certificate/certificate-id\"\n\nspec:\n ingressClassName: alb\n rules:\n - host: milvus-demo.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: milvus-demo\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmilvus-demo alb milvus-demo.milvus.io k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com 80 10m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\nconnections.connect(\"default\", host=\"k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com\", port=\"443\", secure=True, server_name=\"milvus-demo.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on AWS","anchorList":[{"label":"إعداد موازن تحميل من الطبقة 7 لميلفوس على AWS","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-AWS","type":1,"isActive":false},{"label":"تحقق من الاتصال من خلال موازن التحميل Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.md b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.md new file mode 100644 index 000000000..5b744135e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/aws_layer7.md @@ -0,0 +1,109 @@ +--- +id: aws_layer7.md +title: إعداد موازن تحميل من الطبقة 7 لميلفوس على AWS +related_key: cluster +summary: >- + تعرف على كيفية نشر مجموعة Milvus العنقودية خلف موازن تحميل من الطبقة السابعة + على AWS. +--- +

إعداد موازن تحميل من الطبقة 7 لميلفوس على AWS

عند مقارنته بموازن تحميل الطبقة 4، يوفر موازن التحميل من الطبقة 7 إمكانات ذكية لموازنة التحميل والتخزين المؤقت، وهو خيار رائع للخدمات السحابية الأصلية.

+

يرشدك هذا الدليل إلى كيفية إعداد موازن تحميل من الطبقة 7 لمجموعة Milvus التي تعمل بالفعل خلف موازن تحميل من الطبقة 4.

+

قبل البدء

+

تعديل تكوينات Milvus

يفترض هذا الدليل أنك قمت بالفعل بنشر مجموعة Milvus خلف موازن تحميل من الطبقة 4 على AWS.

+

قبل إعداد موازن تحميل من الطبقة السابعة لمجموعة Milvus العنقودية هذه، قم بتشغيل الأمر التالي لإزالة موازن تحميل الطبقة الرابعة.

+
helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP
+
+

إعداد شهادات TLS

يتطلب TLS شهادات للعمل. نحن نستخدم ACM لإدارة الشهادات ونحتاج إلى استيراد شهادة موجودة إلى ACM. ارجع إلى استيراد شهادة. وفيما يلي مثال على ذلك.

+
# If the import-certificate command is successful, it returns the arn of the imported certificate.
+aws acm import-certificate --certificate fileb://Certificate.pem \
+      --certificate-chain fileb://CertificateChain.pem \
+      --private-key fileb://PrivateKey.pem  
+
+

قم بإنشاء مدخل لإنشاء موازن تحميل من الطبقة السابعة

قم بإعداد ملف الدخول على النحو التالي وقم بتسميته ingress.yaml. قم باستبدال الشهادة arn والمضيف بالشهادة الخاصة بك.

+
apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  namespace: milvus
+  name: milvus-demo
+  annotations:
+    alb.ingress.kubernetes.io/scheme: internet-facing
+    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
+    alb.ingress.kubernetes.io/target-type: ip
+    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
+    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:region:account-id:certificate/certificate-id"
+
+spec:
+  ingressClassName: alb
+  rules:
+    - host: milvus-demo.milvus.io
+      http:
+        paths:
+        - path: /
+          pathType: Prefix
+          backend:
+            service:
+              name: milvus-demo
+              port:
+                number: 19530
+
+

ثم يمكنك إنشاء الدخول عن طريق تطبيق الملف على مجموعة EKS الخاصة بك.

+
kubectl apply -f ingress.yaml
+
+

الآن، انتظر حتى تقوم AWS بإعداد موازن تحميل الطبقة 7. يمكنك التحقق من التقدم عن طريق تشغيل

+
kubectl -f ingress.yaml get -w
+
+

يجب أن يكون الناتج مشابهًا لما يلي:

+
NAME          CLASS   HOSTS                   ADDRESS                                                                PORTS   AGE
+milvus-demo   alb     milvus-demo.milvus.io   k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com   80      10m
+
+

بمجرد عرض العنوان في حقل ADDRESS، يكون موازن تحميل Layer-7 جاهزًا للاستخدام.

+

تحقق من الاتصال من خلال موازن التحميل Layer-7

يستخدم هذا الدليل PyMilvus للتحقق من الاتصال بخدمة Milvus خلف موازن تحميل Layer-7 الذي أنشأناه للتو. للاطلاع على الخطوات التفصيلية، اقرأ هذا.

+
from pymilvus import (
+    connections,
+    utility,
+    FieldSchema,
+    CollectionSchema,
+    DataType,
+    Collection,
+)
+
+connections.connect("default", host="k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com", port="443", secure=True, server_name="milvus-demo.milvus.io")
+
+
+ +
diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.json b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.json new file mode 100644 index 000000000..38764d934 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.json @@ -0,0 +1 @@ +{"codeList":["{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"S3BucketManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:CreateBucket\",\n \"s3:PutBucketAcl\",\n \"s3:PutBucketOwnershipControls\",\n \"s3:DeleteBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::milvus-bucket-*\"\n ]\n }\n ]\n}\n","{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"IAMPolicyManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iam:CreatePolicy\",\n \"iam:DeletePolicy\"\n ],\n \"Resource\": \"arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite\"\n }\n ]\n} \n","milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","aws iam attach-user-policy --user-name --policy-arn \"arn:aws:iam:::policy/MilvusS3ReadWrite\"\n","apiVersion: eksctl.io/v1alpha5\nkind: ClusterConfig\n\nmetadata:\n name: 'milvus-eks-cluster'\n region: 'us-east-2'\n version: \"1.27\"\n\niam:\n withOIDC: true\n\n serviceAccounts:\n - metadata:\n name: aws-load-balancer-controller\n namespace: kube-system\n wellKnownPolicies:\n awsLoadBalancerController: true\n\nmanagedNodeGroups:\n - name: milvus-node-group\n labels: { role: milvus }\n instanceType: m6i.4xlarge\n desiredCapacity: 3\n privateNetworking: true\n \naddons:\n- name: vpc-cni\n version: latest\n attachPolicyARNs:\n - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy\n- name: coredns\n version: latest\n- name: kube-proxy\n version: latest\n- name: aws-ebs-csi-driver\n version: latest\n wellKnownPolicies:\n ebsCSIController: true\n","eksctl create cluster -f eks_cluster.yaml\n","aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'\n","kubectl cluster-info\n\nkubectl get nodes -A -o wide\n","cat <\"\n useIAM: false\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n accessKey: \"\"\n secretKey: \"\"\n region: \"us-east-2\"\n\n# HA Configurations\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n","kubectl get pods -n milvus\n","kubectl get svc -n milvus\n","wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py\n","python3 hello_milvus.py\n","=== start connecting to Milvus ===\n\nDoes collection hello_milvus exist in Milvus: False\n\n=== Create collection `hello_milvus` ===\n\n\n=== Start inserting entities ===\n\nNumber of entities in Milvus: 3000\n\n=== Start Creating index IVF_FLAT ===\n\n\n=== Start loading ===\n\n\n=== Start searching based on vector similarity ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561\nhit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304\nhit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482\nhit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nsearch latency = 0.4693s\n\n=== Start querying with `random > 0.5` ===\n\nquery result:\n-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}\nsearch latency = 0.9407s\nquery pagination(limit=4):\n [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\nquery pagination(offset=1, limit=3):\n [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\n\n=== Start hybrid searching with `random > 0.5` ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661\nhit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nhit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499\nhit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955\nsearch latency = 0.4652s\n\n=== Start deleting with expr `pk in [\"0\" , \"1\"]` ===\n\nquery before delete by expr=`pk in [\"0\" , \"1\"]` -> result:\n-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}\n-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}\n\nquery after delete by expr=`pk in [\"0\" , \"1\"]` -> result: []\n\n\n=== Drop collection `hello_milvus` ===\n","helm uninstall milvus-demo -n milvus\n","eksctl delete cluster --name milvus-eks-cluster --region us-east-2\n","aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive\n\naws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2\n\naws iam detach-user-policy --user-name --policy-arn \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\"\n\naws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\n"],"headingContent":"Deploy a Milvus Cluster on EKS","anchorList":[{"label":"نشر مجموعة Milvus العنقودية على EKS","href":"Deploy-a-Milvus-Cluster-on-EKS","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد موارد AWS","href":"Set-up-AWS-Resources","type":2,"isActive":false},{"label":"قم بإنشاء فئة تخزين","href":"Create-a-StorageClass","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"تحقق من التثبيت","href":"Verify-the-installation","type":2,"isActive":false},{"label":"أعمال التنظيف","href":"Clean-up-works","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.md b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.md new file mode 100644 index 000000000..0bcd5388b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/eks.md @@ -0,0 +1,518 @@ +--- +id: eks.md +title: نشر مجموعة Milvus العنقودية على EKS +related_key: cluster +summary: تعرف على كيفية نشر مجموعة Milvus العنقودية على EKS +--- +

نشر مجموعة Milvus العنقودية على EKS

يصف هذا الموضوع كيفية نشر مجموعة Milvus على Amazon EKS.

+

المتطلبات الأساسية

    +
  • أن يكون لديك AWS CLI مثبتًا على حاسوبك المحلي أو على Amazon EC2، والذي سيكون بمثابة نقطة النهاية للقيام بالعمليات التي يغطيها هذا المستند. بالنسبة لأمازون لينكس 2 أو أمازون لينكس 2023، فإن أدوات AWS CLI مثبتة بالفعل. لتثبيت AWS CLi على حاسوبك المحلي. راجع كيفية تثبيت AWS CLI.
  • +
  • لقد قمت بتثبيت Kubernetes وأدوات EKS المثبتة على جهاز نقطة النهاية المفضل، بما في ذلك:
  • +
  • تم منح أذونات AWS IAM بشكل صحيح. يجب أن يكون لدى مدير أمان IAM الذي تستخدمه إذن لاستخدام أدوار Amazon EKS IAM والأدوار المتعلقة بالخدمة وAWS CloudFormation وVPCs والموارد الأخرى ذات الصلة. يمكنك اتباع أي من الطريقتين التاليتين لمنح مديرك الأذونات المناسبة.
      +
    • (غير مستحسن) ما عليك سوى تعيين سياسة الارتباط للمستخدم/الدور الذي استخدمته لسياسة AWS المدارة AdministratorAccess.
    • +
    • (موصى به بشدة) لتطبيق مبدأ الامتيازات الأقل، قم بما يلي:
        +
      • لإعداد الإذن لـ eksctl ، راجع الحد الأدنى من الإذن لـ eksctl.

      • +
      • لإعداد إذن لإنشاء/حذف دلاء AWS S3، راجع إعدادات الأذونات التالية:

        +
        {
        +  "Version": "2012-10-17",
        +  "Statement": [
        +    {
        +      "Sid": "S3BucketManagement",
        +      "Effect": "Allow",
        +      "Action": [
        +        "s3:CreateBucket",
        +        "s3:PutBucketAcl",
        +        "s3:PutBucketOwnershipControls",
        +        "s3:DeleteBucket"
        +      ],
        +      "Resource": [
        +        "arn:aws:s3:::milvus-bucket-*"
        +      ]
        +    }
        +  ]
        +}
        +
      • +
      • لإعداد أذونات لإنشاء/حذف نُهج IAM، راجع إعدادات الأذونات التالية. قم باستبدال YOUR_ACCOUNT_ID بالإذن الخاص بك.

        +
        {
        +  "Version": "2012-10-17",
        +  "Statement": [
        +    {
        +      "Sid": "IAMPolicyManagement",
        +      "Effect": "Allow",
        +      "Action": [
        +        "iam:CreatePolicy",
        +        "iam:DeletePolicy"
        +      ],
        +      "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite"
        +    }
        +  ]
        +}    
        +
      • +
    • +
  • +
+

إعداد موارد AWS

يمكنك إعداد موارد AWS المطلوبة، بما في ذلك دلو AWS S3 ومجموعة EKS، باستخدام إما وحدة تحكم إدارة AWS أو AWS CLI أو أدوات IaC، مثل Terraform. في هذا المستند، يُفضل استخدام واجهة مستخدم AWS CLI لتوضيح كيفية إعداد موارد AWS.

+

إنشاء دلو أمازون S3

    +
  • قم بإنشاء دلو AWS S3.

    +

    اقرأ قواعد تسمية الدلو والتزم بقواعد التسمية عند تسمية دلو AWS S3 الخاص بك.

    +
    milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
    +
    +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
    +
    +
    +# Output
    +#
    +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
    +
  • +
  • قم بإنشاء سياسة IAM لقراءة وكتابة الكائنات داخل الدلو الذي تم إنشاؤه أعلاه. استبدل اسم الدلو باسم الدلو الخاص بك.

    +
    echo '{
    +  "Version": "2012-10-17",
    +  "Statement": [
    +    {
    +      "Effect": "Allow",
    +      "Action": [
    +        "s3:GetObject",
    +        "s3:PutObject",
    +        "s3:ListBucket",
    +        "s3:DeleteObject"
    +      ],
    +      "Resource": [
    +        "arn:aws:s3:::<bucket-name>",
    +        "arn:aws:s3:::<bucket-name>/*"
    +      ]
    +    }
    +  ]
    +}' > milvus-s3-policy.json
    +
    +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
    +
    +
    +# Get the ARN from the command output as follows:
    +# {
    +#     "Policy": {
    +#         "PolicyName": "MilvusS3ReadWrite",
    +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
    +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
    +#         "Path": "/",
    +#         "DefaultVersionId": "v1",
    +#         "AttachmentCount": 0,
    +#         "PermissionsBoundaryUsageCount": 0,
    +#         "IsAttachable": true,
    +#         "CreateDate": "2023-11-16T06:00:01+00:00",
    +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
    +#     }
    +# }    
    +
  • +
  • قم بإرفاق السياسة بمستخدم AWS الخاص بك.

    +
    aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
    +
  • +
+

إنشاء مجموعة أمازون EKS العنقودية

    +
  • قم بإعداد ملف تكوين الكتلة على النحو التالي وقم بتسميته eks_cluster.yaml.

    +
    apiVersion: eksctl.io/v1alpha5
    +kind: ClusterConfig
    +
    +metadata:
    +  name: 'milvus-eks-cluster'
    +  region: 'us-east-2'
    +  version: "1.27"
    +
    +iam:
    +  withOIDC: true
    +
    +  serviceAccounts:
    +  - metadata:
    +      name: aws-load-balancer-controller
    +      namespace: kube-system
    +    wellKnownPolicies:
    +      awsLoadBalancerController: true
    +
    +managedNodeGroups:
    +  - name: milvus-node-group
    +    labels: { role: milvus }
    +    instanceType: m6i.4xlarge
    +    desiredCapacity: 3
    +    privateNetworking: true
    +    
    +addons:
    +- name: vpc-cni
    +  version: latest
    +  attachPolicyARNs:
    +    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
    +- name: coredns
    +  version: latest
    +- name: kube-proxy
    +  version: latest
    +- name: aws-ebs-csi-driver
    +  version: latest
    +  wellKnownPolicies:
    +    ebsCSIController: true
    +
  • +
  • قم بتشغيل الأمر التالي لإنشاء مجموعة EKS.

    +
    eksctl create cluster -f eks_cluster.yaml
    +
  • +
  • احصل على ملف kubeconfig.

    +
    aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
    +
  • +
  • تحقق من مجموعة EKS العنقودية.

    +
    kubectl cluster-info
    +
    +kubectl get nodes -A -o wide
    +
  • +
+

قم بإنشاء فئة تخزين

يستخدم Milvus etcd كتخزين تعريفي ويحتاج إلى الاعتماد على gp3 StorageClass لإنشاء وإدارة PVC.

+
cat <<EOF | kubectl apply -f -
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: ebs-gp3-sc
+  annotations:
+    storageclass.kubernetes.io/is-default-class: "true"
+provisioner: ebs.csi.aws.com
+volumeBindingMode: WaitForFirstConsumer
+parameters:
+  type: gp3
+EOF
+
+

قم بتعيين gp2 StorageClass الأصلي إلى غير افتراضي.

+
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
+
+

قم بتثبيت وحدة تحكم AWS LoadBalancer

    +
  • أضف الريبو الخاص بـ Helm chars.

    +
    helm repo add eks https://aws.github.io/eks-charts
    +helm repo update
    +
  • +
  • قم بتثبيت وحدة تحكم موازن تحميل AWS.

    +
    helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    +  -n kube-system \
    +  --set clusterName='milvus-eks-cluster' \
    +  --set serviceAccount.create=false \
    +  --set serviceAccount.name=aws-load-balancer-controller 
    +
  • +
  • تحقق من التثبيت

    +
    kubectl get deployment -n kube-system aws-load-balancer-controller
    +
  • +
+

نشر ميلفوس

في هذا الدليل، سنستخدم مخططات Milvus Helm لنشر مجموعة Milvus. يمكنك العثور على المخططات هنا.

+
    +
  • أضف ريبو Milvus Helm Chart.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +
  • +
  • قم بإعداد ملف تهيئة Milvus milvus.yaml ، واستبدل <bucket-name> <s3-access-key> <s3-secret-key> بملفك الخاص.

    +

    +
      +
    • لتكوين HA لـ Milvus الخاص بك، راجع هذه الحاسبة لمزيد من المعلومات. يمكنك تنزيل التكوينات ذات الصلة مباشرة من الآلة الحاسبة، ويجب عليك إزالة التكوينات المتعلقة بـ MinIO.
    • +
    • لتنفيذ عمليات النشر متعددة النسخ للمنسقين، قم بتعيين xxCoordinator.activeStandby.enabled إلى true.
    • +
    +

    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +  port: 19530
    +  annotations: 
    +    service.beta.kubernetes.io/aws-load-balancer-type: external
    +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
    +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: "s3.us-east-2.amazonaws.com"
    +  port: "443"
    +  useSSL: true
    +  bucketName: "<bucket-name>"
    +  useIAM: false
    +  cloudProvider: "aws"
    +  iamEndpoint: ""
    +  accessKey: "<s3-access-key>"
    +  secretKey: "<s3-secret-key>"
    +  region: "us-east-2"
    +
    +# HA Configurations
    +rootCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi
    +
    +indexCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +queryCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +dataCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +proxy:
    +  replicas: 2
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi  
    +
  • +
  • قم بتثبيت ميلفوس.

    +
    helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
    +
  • +
  • انتظر حتى تصبح جميع الكبسولات Running.

    +
    kubectl get pods -n milvus
    +
    +

    +

    لا يدعم Helm جدولة ترتيب إنشاء الخدمة. من الطبيعي أن يتم إعادة تشغيل كبسولات الأعمال لمرة أو مرتين قبل etcd و pulsar في المرحلة المبكرة.

    +

  • +
  • احصل على عنوان خدمة ميلفوس.

    +
    kubectl get svc -n milvus
    +
  • +
+

تحقق من التثبيت

يمكنك اتباع الدليل البسيط أدناه للتحقق من التثبيت. لمزيد من التفاصيل، راجع هذا المثال.

+
    +
  • قم بتنزيل المثال البرمجي.

    +
    wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
    +
  • +
  • قم بتغيير الوسيطة host في مثال التعليمات البرمجية إلى عنوان خدمة Milvus أعلاه.

  • +
+
```python
+...
+connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
+...
+```
+
+
    +
  • قم بتشغيل كود المثال.

    +
    python3 hello_milvus.py
    +
    +

    يجب أن تكون المخرجات مشابهة لما يلي:

    +
    === start connecting to Milvus     ===
    +
    +Does collection hello_milvus exist in Milvus: False
    +
    +=== Create collection `hello_milvus` ===
    +
    +
    +=== Start inserting entities       ===
    +
    +Number of entities in Milvus: 3000
    +
    +=== Start Creating index IVF_FLAT  ===
    +
    +
    +=== Start loading                  ===
    +
    +
    +=== Start searching based on vector similarity ===
    +
    +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
    +hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561
    +hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304
    +hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
    +hit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062
    +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
    +search latency = 0.4693s
    +
    +=== Start querying with `random > 0.5` ===
    +
    +query result:
    +-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}
    +search latency = 0.9407s
    +query pagination(limit=4):
    +        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
    +query pagination(offset=1, limit=3):
    +        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
    +
    +=== Start hybrid searching with `random > 0.5` ===
    +
    +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
    +hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661
    +hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507
    +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
    +hit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499
    +hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955
    +search latency = 0.4652s
    +
    +=== Start deleting with expr `pk in ["0" , "1"]` ===
    +
    +query before delete by expr=`pk in ["0" , "1"]` -> result:
    +-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}
    +-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}
    +
    +query after delete by expr=`pk in ["0" , "1"]` -> result: []
    +
    +
    +=== Drop collection `hello_milvus` ===
    +
  • +
+

أعمال التنظيف

في حال كنت بحاجة إلى استعادة البيئة عن طريق إلغاء تثبيت Milvus، وتدمير مجموعة EKS، وحذف دلاء AWS S3 ونُهج IAM ذات الصلة.

+
    +
  • قم بإلغاء تثبيت Milvus.

    +
    helm uninstall milvus-demo -n milvus
    +
  • +
  • تدمير مجموعة EKS.

    +
    eksctl delete cluster --name milvus-eks-cluster --region us-east-2
    +
  • +
  • احذف دلو AWS S3 ونُهج IAM ذات الصلة.

    +

    يجب عليك استبدال اسم الدلو والنهج ARN باسمك.

    +
    aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive
    +
    +aws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2
    +
    +aws iam detach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite"
    +
    +aws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
    +
  • +
+

الخطوة التالية

إذا كنت تريد معرفة كيفية نشر Milvus على السحب الأخرى:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.json b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.json new file mode 100644 index 000000000..60d14a87b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.json @@ -0,0 +1 @@ +{"codeList":["milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:PutObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \\\n --attach-policy-arn arn:aws:iam:::policy/MilvusS3ReadWrite --approve\n","aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument\n# An example output is as follows\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Federated\": \"arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE\"\n },\n \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n \"Condition\": {\n \"StringEquals\": {\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub\": \"system:serviceaccount:default:my-service-account\",\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud\": \"sts.amazonaws.com\"\n }\n }\n }\n ]\n}\n","aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text\n# An example output is as follows\narn:aws:iam::12345678901:policy/MilvusS3ReadWrite\n","export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\naws iam get-policy --policy-arn $policy_arn\n# An example output is as follows\n{\n \"Policy\": {\n \"PolicyName\": \"MilvusS3ReadWrite\",\n \"PolicyId\": \"EXAMPLEBIOWGLDEXAMPLE\",\n \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n \"Path\": \"/\",\n \"DefaultVersionId\": \"v2\",\n [...]\n }\n}\n","aws iam get-policy-version --policy-arn $policy_arn --version-id v2\n# An example output is as follows\n{\n \"PolicyVersion\": {\n \"Document\": {\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n },\n [...]\n }\n}\n","kubectl describe serviceaccount milvus-s3-access-sa -n milvus\n# An example output is as follows\nName: milvus-s3-access-sa\nNamespace: milvus\nLabels: app.kubernetes.io/managed-by=eksctl\nAnnotations: eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa\n[...]\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n port: 19530\n annotations: \n service.beta.kubernetes.io/aws-load-balancer-type: external\n service.beta.kubernetes.io/aws-load-balancer-name: milvus-service\n service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing\n service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip\n\nserviceAccount:\n create: false\n name: milvus-s3-access-sa\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: \"s3.us-east-2.amazonaws.com\"\n port: \"443\"\n useSSL: true\n bucketName: \"\"\n useIAM: true\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n"],"headingContent":"Configure S3 Access by IAM Role","anchorList":[{"label":"تكوين وصول S3 حسب دور IAM","href":"Configure-S3-Access-by-IAM-Role","type":1,"isActive":false},{"label":"قبل البدء","href":"Before-you-start","type":2,"isActive":false},{"label":"إقران دور IAM بحساب خدمة Kubernetes","href":"Associate-an-IAM-role-with-a-Kubernetes-service-account","type":2,"isActive":false},{"label":"تحقق من إعداد الدور وحساب الخدمة","href":"Verify-the-role-and-service-account-setup","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"تحقق من التثبيت","href":"Verify-the-installation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.md b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.md new file mode 100644 index 000000000..ffb9f18ad --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/aws/s3.md @@ -0,0 +1,341 @@ +--- +id: s3.md +title: تكوين وصول S3 حسب دور IAM +related_key: 's3, storage, iam' +summary: تعرف على كيفية تكوين s3 مع دور IAM. +--- +

تكوين وصول S3 حسب دور IAM

يقدم هذا الموضوع كيفية تكوين الوصول إلى S3 حسب دور IAM عند تثبيت Milvus مع Helm. لمزيد من التفاصيل، راجع أدوار IAM.

+

قبل البدء

+

إقران دور IAM بحساب خدمة Kubernetes

    +
  • قم بإنشاء دلو AWS S3.

    +

    اقرأ قواعد تسمية الدلو وراقب قواعد التسمية عند تسمية دلو AWS S3 الخاص بك.

    +
    milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
    +
    +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
    +
    +
    +# Output
    +#
    +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
    +
  • +
  • قم بإنشاء نهج IAM لقراءة وكتابة الكائنات داخل الدلو الذي تم إنشاؤه أعلاه. استبدل اسم الدلو باسم الدلو الخاص بك.

    +
    echo '{
    +  "Version": "2012-10-17",
    +  "Statement": [
    +    {
    +      "Effect": "Allow",
    +      "Action": [
    +        "s3:ListBucket"
    +      ],
    +      "Resource": [
    +        "arn:aws:s3:::<bucket-name>"
    +      ]
    +    },
    +    {
    +      "Effect": "Allow",
    +      "Action": [
    +        "s3:DeleteObject",
    +        "s3:GetObject",
    +        "s3:PutObject"
    +      ],
    +      "Resource": [
    +        "arn:aws:s3:::<bucket-name>/*"
    +      ]
    +    }
    +  ]
    +}' > milvus-s3-policy.json
    +
    +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
    +
    +
    +# Get the ARN from the command output as follows:
    +# {
    +#     "Policy": {
    +#         "PolicyName": "MilvusS3ReadWrite",
    +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
    +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
    +#         "Path": "/",
    +#         "DefaultVersionId": "v1",
    +#         "AttachmentCount": 0,
    +#         "PermissionsBoundaryUsageCount": 0,
    +#         "IsAttachable": true,
    +#         "CreateDate": "2023-11-16T06:00:01+00:00",
    +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
    +#     }
    +# }    
    +
  • +
  • أنشئ دور IAM واربطه بحساب خدمة Kubernetes. استبدل your-account-id بمعرف حسابك.

  • +
+
eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \
+    --attach-policy-arn arn:aws:iam::<your-account-id>:policy/MilvusS3ReadWrite --approve
+
+

تحقق من إعداد الدور وحساب الخدمة

يرجى الرجوع إلى أدوار IAM.

+
    +
  • تأكد من تكوين سياسة الثقة الخاصة بدور IAM بشكل صحيح.
  • +
+
aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument
+# An example output is as follows
+{
+    "Version": "2012-10-17",
+    "Statement": [
+        {
+            "Effect": "Allow",
+            "Principal": {
+                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
+            },
+            "Action": "sts:AssumeRoleWithWebIdentity",
+            "Condition": {
+                "StringEquals": {
+                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
+                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
+                }
+            }
+        }
+    ]
+}
+
+
    +
  • تأكد من إرفاق النهج الذي أرفقته بالدور في الخطوة السابقة بالدور.
  • +
+
aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text
+# An example output is as follows
+arn:aws:iam::12345678901:policy/MilvusS3ReadWrite
+
+
    +
  • اعرض الإصدار الافتراضي للنهج.
  • +
+
export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
+aws iam get-policy --policy-arn $policy_arn
+# An example output is as follows
+{
+    "Policy": {
+        "PolicyName": "MilvusS3ReadWrite",
+        "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
+        "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
+        "Path": "/",
+        "DefaultVersionId": "v2",
+        [...]
+    }
+}
+
+
    +
  • اعرض محتويات النهج للتأكد من أن النهج يتضمن جميع الأذونات التي يحتاجها Pod الخاص بك. إذا لزم الأمر، استبدل 1 في الأمر التالي بالإصدار الذي تم إرجاعه في الإخراج السابق.
  • +
+
aws iam get-policy-version --policy-arn $policy_arn --version-id v2
+# An example output is as follows
+{
+    "PolicyVersion": {
+        "Document": {
+            "Version": "2012-10-17",
+            "Statement": [
+                {
+                    "Effect": "Allow",
+                    "Action": [
+                        "s3:GetObject",
+                        "s3:PutObject",
+                        "s3:ListBucket",
+                        "s3:DeleteObject"
+                    ],
+                    "Resource": [
+                        "arn:aws:s3:::<bucket-name>",
+                        "arn:aws:s3:::<bucket-name>/*"
+                    ]
+                }
+            ]
+        },
+        [...]
+    }
+}
+
+
    +
  • تأكّد من أن حساب خدمة Kubernetes مُرفق بالدور.
  • +
+
kubectl describe serviceaccount milvus-s3-access-sa -n milvus
+# An example output is as follows
+Name:                milvus-s3-access-sa
+Namespace:           milvus
+Labels:              app.kubernetes.io/managed-by=eksctl
+Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa
+[...]
+
+

نشر ميلفوس

في هذا الدليل، سنستخدم مخططات Milvus Helm لنشر مجموعة Milvus. يمكنك العثور على المخططات هنا.

+
    +
  • أضف ريبو Milvus Helm Chart.
  • +
+
helm repo add milvus https://zilliztech.github.io/milvus-helm/
+helm repo update
+
+
    +
  • قم بإعداد ملف تكوين Milvus milvus.yaml ، واستبدل <bucket-name> باسم الدلو الذي تم إنشاؤه أعلاه.
  • +
+
cluster:
+  enabled: true
+
+service:
+  type: LoadBalancer
+  port: 19530
+  annotations: 
+    service.beta.kubernetes.io/aws-load-balancer-type: external
+    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
+    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
+    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
+
+serviceAccount:
+  create: false
+  name: milvus-s3-access-sa
+
+minio:
+  enabled: false
+
+externalS3:
+  enabled: true
+  host: "s3.us-east-2.amazonaws.com"
+  port: "443"
+  useSSL: true
+  bucketName: "<bucket-name>"
+  useIAM: true
+  cloudProvider: "aws"
+  iamEndpoint: ""
+
+rootCoordinator:
+  replicas: 2
+  activeStandby:
+    enabled: true
+  resources: 
+    limits:
+      cpu: 1
+      memory: 2Gi
+
+indexCoordinator:
+  replicas: 2
+  activeStandby:
+    enabled: true
+  resources: 
+    limits:
+      cpu: "0.5"
+      memory: 0.5Gi
+
+queryCoordinator:
+  replicas: 2
+  activeStandby:
+    enabled: true
+  resources: 
+    limits:
+      cpu: "0.5"
+      memory: 0.5Gi
+
+dataCoordinator:
+  replicas: 2
+  activeStandby:
+    enabled: true
+  resources: 
+    limits:
+      cpu: "0.5"
+      memory: 0.5Gi
+
+proxy:
+  replicas: 2
+  resources: 
+    limits:
+      cpu: 1
+      memory: 2Gi  
+
+
    +
  • قم بتثبيت ملف Milvus.
  • +
+
helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml
+
+

تحقق من التثبيت

يرجى الرجوع إلى التحقق من التثبيت.

diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/azure/abs.json b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/abs.json new file mode 100644 index 000000000..27857d83d --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/abs.json @@ -0,0 +1 @@ +{"codeList":["export RESOURCE_GROUP=\"\"\nexport AKS_CLUSTER=\"\" \nexport SUB_ID=\"\"\nexport USER_ASSIGNED_IDENTITY_NAME=\"workload-identity\"\nexport SERVICE_ACCOUNT_NAME=\"milvus-abs-access-sa\"\nexport STORAGE_ACCOUNT_NAME=\"milvustesting1\"\nexport CONTAINER_NAME=\"testmilvus\"\nexport LOCATION=\"\"\nexport SERVICE_ACCOUNT_NAMESPACE=\"default\"\n","az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity\n","export SERVICE_ACCOUNT_ISSUER=\"$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)\"\n","az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}\n\n","az identity create --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\"\nexport USER_ASSIGNED_IDENTITY_CLIENT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'clientId' -otsv)\"\nexport USER_ASSIGNED_IDENTITY_OBJECT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'principalId' -otsv)\"\naz role assignment create --role \"Storage Blob Data Contributor\" --assignee \"${USER_ASSIGNED_IDENTITY_OBJECT_ID}\" --scope \"/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}\"\n\n","cat <تكوين الوصول إلى تخزين Blob Storage حسب هوية حمل العمل

يقدم هذا الموضوع كيفية تكوين الوصول إلى Azure Blob Storage حسب هوية حمل العمل عند تثبيت Milvus مع Helm. لمزيد من التفاصيل، راجع هوية حمل العمل.

+

تكوين التطبيقات لاستخدام هوية حمل العمل

    +
  • تعيين env.
  • +
+
export RESOURCE_GROUP="<your resource group>"
+export AKS_CLUSTER="<your aks cluster name>" 
+export SUB_ID="<your Subscription ID>"
+export USER_ASSIGNED_IDENTITY_NAME="workload-identity"
+export SERVICE_ACCOUNT_NAME="milvus-abs-access-sa"
+export STORAGE_ACCOUNT_NAME="milvustesting1"
+export CONTAINER_NAME="testmilvus"
+export LOCATION="<your location>"
+export SERVICE_ACCOUNT_NAMESPACE="default"
+
+
    +
  • قم بتحديث مجموعة AKS مع مُصدر OIDC وهوية حمل العمل.
  • +
+
az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity
+
+
    +
  • احصل على عنوان URL لمصدر OIDC.
  • +
+
export SERVICE_ACCOUNT_ISSUER="$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)"
+
+
    +
  • إنشاء حساب تخزين وحاوية.
  • +
+
az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2
+az storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}
+
+
+
    +
  • إنشاء هوية مُدارة معيّنة من قبل المستخدم وتعيين الدور.
  • +
+
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"
+export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'clientId' -otsv)"
+export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'principalId' -otsv)"
+az role assignment create --role "Storage Blob Data Contributor" --assignee "${USER_ASSIGNED_IDENTITY_OBJECT_ID}" --scope "/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}"
+
+
+
    +
  • إنشاء حساب خدمة.
  • +
+
cat <<EOF | kubectl apply -f -
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+  annotations:
+    azure.workload.identity/client-id: ${USER_ASSIGNED_IDENTITY_CLIENT_ID}
+  name: ${SERVICE_ACCOUNT_NAME}
+EOF
+
+
    +
  • إنشاء بيانات اعتماد الهوية الموحدة بين الهوية ومُصدر حساب الخدمة والموضوع.
  • +
+
az identity federated-credential create \
+  --name "kubernetes-federated-credential" \
+  --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
+  --resource-group "${RESOURCE_GROUP}" \
+  --issuer "${SERVICE_ACCOUNT_ISSUER}" \
+  --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
+
+

نشر ميلفوس

helm install -f values.yaml my-release milvus/milvus
+
+

محتويات القيم.yaml:

+
cluster:
+  enabled: true
+
+service:
+  type: LoadBalancer
+
+extraConfigFiles:
+  user.yaml: |+
+    common:
+      storageType: remote
+
+minio:
+  enabled: false
+
+labels:
+  azure.workload.identity/use: "true"
+
+serviceAccount:
+  create: false
+  name: milvus-abs-access-sa # SERVICE_ACCOUNT_NAME
+
+externalS3:
+  enabled: true
+  host: core.windows.net
+  port: 443
+  rootPath: my-release
+  bucketName: testmilvus # CONTAINER_NAME
+  cloudProvider: azure
+  useSSL: true
+  useIAM: true
+  accessKey: "milvustesting1" # STORAGE_ACCOUNT_NAME
+  secretKey: ""
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.json b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.json new file mode 100644 index 000000000..b4eb27b37 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.json @@ -0,0 +1 @@ +{"codeList":["az account set --subscription EXAMPLE-SUBSCRIPTION-ID\n","az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME\n","az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n testmilvus --account-name milvustesting1\n","az storage account keys list --account-name milvustesting2\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nextraConfigFiles:\n user.yaml: |+\n common:\n storageType: remote\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: core.windows.net\n port: 443\n rootPath: my-release\n bucketName: testmilvus # the storage account container name\n cloudProvider: azure\n useSSL: true\n accessKey: \"milvustesting1\" # the storage account name\n secretKey: \"\" \n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy Milvus on Azure with AKS","anchorList":[{"label":"نشر ميلفوس على Azure باستخدام AKS","href":"Deploy-Milvus-on-Azure-with-AKS","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"متطلبات البرنامج","href":"Software-requirements","type":2,"isActive":false},{"label":"توفير مجموعة Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"الاتصال بالمجموعة","href":"Connect-to-the-cluster","type":2,"isActive":false},{"label":"تعيين اشتراك وبيانات اعتماد","href":"Set-a-subscription-and-credentials","type":2,"isActive":false},{"label":"استخدام Azure Blob Storage كمخزن كائنات خارجي","href":"Using-Azure-Blob-Storage-as-external-object-storage","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"تحقق من النشر","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"مرحباً ميلفوس","href":"Hello-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.md b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.md new file mode 100644 index 000000000..f0b1e4438 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/azure.md @@ -0,0 +1,299 @@ +--- +id: azure.md +title: نشر Milvus على Microsoft Azure باستخدام Kubernetes +related_key: cluster +summary: تعرف على كيفية نشر مجموعة Milvus العنقودية على Azure. +--- +

نشر ميلفوس على Azure باستخدام AKS

يصف هذا الموضوع كيفية توفير مجموعة وإنشاء مجموعة باستخدام خدمة Azure Kubernetes (AKS) وبوابة Azure.

+

المتطلبات الأساسية

تأكد من إعداد مشروع Azure الخاص بك بشكل صحيح وأن لديك حق الوصول إلى الموارد التي تريد استخدامها. اتصل بالمسؤولين لديك إذا لم تكن متأكدًا من إذن الوصول الخاص بك.

+

متطلبات البرنامج

+

بدلاً من ذلك، يمكنك استخدام Cloud Shell التي تحتوي على Azure CLI و kubectl و Helm المثبتة مسبقاً.

+
بعد تثبيت Azure CLI، تأكد من مصادقتك بشكل صحيح.
+

توفير مجموعة Kubernetes

    +
  1. قم بتسجيل الدخول إلى بوابة Azure.
  2. +
  3. في قائمة بوابة Azure أو من الصفحة الرئيسية، حدد إنشاء مورد.
  4. +
  5. حدد حاويات > خدمة Kubernetes.
  6. +
  7. في صفحة الأساسيات، قم بتكوين الخيارات التالية:
  8. +
+
    +
  • تفاصيل المشروع:

    +
      +
    • الاشتراك: اتصل بمسؤول Azure الخاص بمؤسستك لتحديد الاشتراك الذي يجب عليك استخدامه.

      +
        +
      • مجموعة الموارد: اتصل بمسؤول Azure الخاص بمؤسستك لتحديد مجموعة الموارد التي يجب عليك استخدامها.
      • +
    • +
  • +
  • تفاصيل المجموعة:

    +
      +
    • اسم مجموعة Kubernetes: أدخل اسم المجموعة.

    • +
    • المنطقة: حدد منطقة.

    • +
    • مناطق التوفر: حدد مناطق التوفر حسب حاجتك. بالنسبة لمجموعات الإنتاج، نوصي بتحديد مناطق توافر متعددة.

    • +
  • +
  • تجمع العُقد الأساسي:

    +
      +
    • حجم العقدة: نوصي باختيار أجهزة افتراضية ذات ذاكرة وصول عشوائي لا تقل سعتها عن 16 جيجابايت من ذاكرة الوصول العشوائي، ولكن يمكنك تحديد أحجام الأجهزة الافتراضية حسب حاجتك.

    • +
    • طريقة القياس: اختر طريقة القياس.

    • +
    • نطاق عدد العُقد: حدد نطاقًا لعدد العقد.

    • +
  • +
  • تجمعات العقد:

    +
      +
    • تمكين العقد الافتراضية: حدد خانة الاختيار لتمكين العقد الافتراضية.

    • +
    • تمكين مجموعات نطاق الأجهزة الافتراضية: نوصي باختيار enabled.

    • +
  • +
  • الشبكات:

    +
      +
    • تكوين الشبكة: نوصي باختيار Kubenet.

    • +
    • بادئة اسم DNS: أدخل بادئة اسم DNS.

    • +
    • توجيه حركة المرور:

      +
        +
      • موازن التحميل: Standard.

      • +
      • توجيه تطبيق HTTP: غير مطلوب.

      • +
    • +
  • +
+
    +
  1. بعد تكوين الخيارات، انقر فوق مراجعة + إنشاء ثم إنشاء عند اكتمال التحقق من الصحة. يستغرق إنشاء الكتلة بضع دقائق.
  2. +
+

الاتصال بالمجموعة

    +
  1. انتقل إلى المجموعة التي قمت بإنشائها في خدمات Kubernetes وانقر عليها.
  2. +
  3. في جزء التنقل على الجانب الأيمن، انقر Overview.
  4. +
  5. في صفحة النظرة العامة التي تظهر، انقر فوق اتصال لعرض مجموعة الموارد والاشتراك.
  6. +
+

تعيين اشتراك وبيانات اعتماد

يمكنك استخدام Azure Cloud Shell لتنفيذ الإجراءات التالية.
+
    +
  1. قم بتشغيل الأمر التالي لتعيين اشتراكك.
  2. +
+
az account set --subscription EXAMPLE-SUBSCRIPTION-ID
+
+
    +
  1. قم بتشغيل الأمر التالي لتنزيل بيانات الاعتماد وتهيئة Kubernetes CLI لاستخدامها.
  2. +
+
az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME
+
+
+استخدم نفس الصدفة للإجراءات التالية. إذا قمت بالتبديل إلى غلاف آخر، فقم بتشغيل الأوامر السابقة مرة أخرى.
+

استخدام Azure Blob Storage كمخزن كائنات خارجي

تخزين Azure Blob Storage هو إصدار Azure من خدمة التخزين البسيط من AWS (S3).

+
    +
  • إنشاء حساب تخزين وحاوية
  • +
+
az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2
+az storage container create -n testmilvus --account-name milvustesting1
+
+
    +
  • الحصول على المفتاح السري، استخدم القيمة الأولى
  • +
+
az storage account keys list --account-name milvustesting2
+
+
    +
  • إضافة القيم.yaml
  • +
+
cluster:
+  enabled: true
+
+service:
+  type: LoadBalancer
+
+extraConfigFiles:
+  user.yaml: |+
+    common:
+      storageType: remote
+
+minio:
+  enabled: false
+
+externalS3:
+  enabled: true
+  host: core.windows.net
+  port: 443
+  rootPath: my-release
+  bucketName: testmilvus # the storage account container name
+  cloudProvider: azure
+  useSSL: true
+  accessKey: "milvustesting1" # the storage account name
+  secretKey: "<secret-key>" 
+
+

نشر ميلفوس

الآن مجموعة Kubernetes جاهزة. لننشر ميلفوس الآن.

+
helm repo add milvus https://zilliztech.github.io/milvus-helm/
+helm repo update
+helm install -f values.yaml my-release milvus/milvus
+
+

في الأوامر السابقة، نضيف الريبو الخاص بمخططات Milvus Helm محليًا ونقوم بتحديث الريبو لجلب أحدث المخططات. ثم نقوم بتثبيت مثيل Milvus ونسميه الإصدار الخاص بي.

+

لاحظ قيمة التهيئة service.type ، والتي تشير إلى أننا نرغب في تعريض مثيل Milvus من خلال موازن تحميل من الطبقة الرابعة.

+

تحقق من النشر

بمجرد تشغيل جميع البودات، قم بتشغيل الأمر التالي للحصول على عنوان IP الخارجي.

+
kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
+
+

مرحباً ميلفوس

يُرجى الرجوع إلى Hello Milvus، وتغيير قيمة المضيف إلى عنوان IP الخارجي، ثم تشغيل الكود.

+

ما التالي

إذا كنت تريد معرفة كيفية نشر ميلفوس على السحب الأخرى:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.json b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.json new file mode 100644 index 000000000..dca219da6 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.json @@ -0,0 +1 @@ +{"codeList":["export DNS_LABEL=\"milvustest\" # Your DNS label must be unique within its Azure location.\nexport NAMESPACE=\"ingress-basic\"\n","helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\nhelm repo update\nhelm install ingress-nginx ingress-nginx/ingress-nginx \\\n --create-namespace \\\n --namespace $NAMESPACE \\\n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-dns-label-name\"=$DNS_LABEL \\ \n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path\"=/healthz\n","kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller\n","# Public IP address of your ingress controller\nIP=\"MY_EXTERNAL_IP\"\n\n# Get the resource-id of the public IP\nPUBLICIPID=$(az network public-ip list --query \"[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]\" --output tsv)\n\n# Update public IP address with DNS name\naz network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL\n\n# Display the FQDN\naz network public-ip show --ids $PUBLICIPID --query \"[dnsSettings.fqdn]\" --output tsv\n# sample output: milvustest.eastus2.cloudapp.azure.com\n","helm repo add jetstack https://charts.jetstack.io\nhelm repo update\nhelm install cert-manager jetstack/cert-manager \\\n --namespace $NAMESPACE \\\n --set installCRDs=true\n","apiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt\nspec:\n acme:\n server: https://acme-v02.api.letsencrypt.org/directory\n email: MY_EMAIL_ADDRESS\n privateKeySecretRef:\n name: letsencrypt\n solvers:\n - http01:\n ingress:\n class: nginx\n","kubectl apply -f cluster-issuer.yaml\n","kubectl apply -f ingress.yaml\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n annotations:\n cert-manager.io/cluster-issuer: letsencrypt\n nginx.ingress.kubernetes.io/backend-protocol: GRPC\n nginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n nginx.ingress.kubernetes.io/proxy-body-size: 2048m\nspec:\n ingressClassName: nginx\n tls:\n - hosts:\n - milvustest.eastus2.cloudapp.azure.com # the FQDN\n secretName: tls-secret\n rules:\n - host: milvustest.eastus2.cloudapp.azure.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl get certificate \nNAME READY SECRET AGE\ntls-secret True tls-secret 8m7s\nkubectl get ingress\nNAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus nginx milvustest.eastus2.cloudapp.azure.com EXTERNAL-IP 80, 443 8m15s\n","connections.connect(\"default\",uri=\"https://milvustest.eastus2.cloudapp.azure.com:443\") \n"],"headingContent":"Configure ingress nginx with Milvus","anchorList":[{"label":"تكوين مدخل nginx مع ميلفوس","href":"Configure-ingress-nginx-with-Milvus","type":1,"isActive":false},{"label":"تكوين دخول nginx","href":"Configure-ingress-nginx","type":2,"isActive":false},{"label":"تثبيت مدير الشهادات","href":"Install-cert-manager","type":2,"isActive":false},{"label":"إنشاء مُصدر مجموعة CA","href":"Create-a-CA-cluster-issuer","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"إنشاء مسار دخول ميلفوس","href":"Create-Milvus-ingress-route","type":2,"isActive":false},{"label":"تحقق من","href":"Verify","type":2,"isActive":false},{"label":"مرحبًا ميلفوس","href":"Hello-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.md b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.md new file mode 100644 index 000000000..b7dfa96ce --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/azure/ingress.md @@ -0,0 +1,235 @@ +--- +id: ingress.md +title: تكوين مدخل nginx مع ميلفوس +related_key: ingress nginx +summary: تعرّف على كيفية تهيئة دخول nginx مع ميلفوس. +--- +

تكوين مدخل nginx مع ميلفوس

يقدم هذا الموضوع كيفية تكوين دخول nginx مع Milvus. لمزيد من التفاصيل، راجع Ingress-nginx.

+

تكوين دخول nginx

    +
  • تعيين البيئة.
  • +
+
export DNS_LABEL="milvustest" # Your DNS label must be unique within its Azure location.
+export NAMESPACE="ingress-basic"
+
+
    +
  • تثبيت دخول nginx
  • +
+
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
+helm repo update
+helm install ingress-nginx ingress-nginx/ingress-nginx \
+    --create-namespace \
+    --namespace $NAMESPACE \
+    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \  
+    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
+
+
    +
  • احصل على عنوان IP خارجي.
  • +
+
kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller
+
+
    +
  • قم بتكوين FQDN لوحدة تحكم الدخول.
  • +
+
# Public IP address of your ingress controller
+IP="MY_EXTERNAL_IP"
+
+# Get the resource-id of the public IP
+PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
+
+# Update public IP address with DNS name
+az network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL
+
+# Display the FQDN
+az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
+# sample output: milvustest.eastus2.cloudapp.azure.com
+
+

تثبيت مدير الشهادات

helm repo add jetstack https://charts.jetstack.io
+helm repo update
+helm install cert-manager jetstack/cert-manager \
+    --namespace $NAMESPACE \
+    --set installCRDs=true
+
+

إنشاء مُصدر مجموعة CA

    +
  • قم بإنشاء مُصدِر مجموعة كتلة، مثل cluster-issuer.yaml، باستخدام مثال البيان التالي. استبدل MY_EMAIL_ADDRESS بعنوان صالح من مؤسستك.
  • +
+
apiVersion: cert-manager.io/v1
+kind: ClusterIssuer
+metadata:
+  name: letsencrypt
+spec:
+  acme:
+    server: https://acme-v02.api.letsencrypt.org/directory
+    email: MY_EMAIL_ADDRESS
+    privateKeySecretRef:
+      name: letsencrypt
+    solvers:
+    - http01:
+        ingress:
+          class: nginx
+
+
    +
  • قم بتطبيق المُصدر باستخدام الأمر kubectl apply.
  • +
+
kubectl apply -f cluster-issuer.yaml
+
+

نشر ميلفوس

ارجع إلى أزور، لاحظ قيمة التكوين service.type ، تحتاج إلى التغيير إلى ClusterIP.

+

إنشاء مسار دخول ميلفوس

kubectl apply -f ingress.yaml
+
+

محتويات ingress.yaml:

+
apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: my-release-milvus
+  annotations:
+    cert-manager.io/cluster-issuer: letsencrypt
+    nginx.ingress.kubernetes.io/backend-protocol: GRPC
+    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
+    nginx.ingress.kubernetes.io/proxy-body-size: 2048m
+spec:
+  ingressClassName: nginx
+  tls:
+  - hosts:
+    - milvustest.eastus2.cloudapp.azure.com # the FQDN
+    secretName: tls-secret
+  rules:
+    - host: milvustest.eastus2.cloudapp.azure.com
+      http:
+        paths:
+          - path: /
+            pathType: Prefix
+            backend:
+              service:
+                name: my-release-milvus
+                port:
+                  number: 19530
+
+

تحقق من

kubectl get certificate 
+NAME         READY   SECRET       AGE
+tls-secret   True    tls-secret   8m7s
+kubectl get ingress
+NAME                CLASS   HOSTS                                   ADDRESS        PORTS     AGE
+my-release-milvus   nginx   milvustest.eastus2.cloudapp.azure.com   EXTERNAL-IP   80, 443   8m15s
+
+

مرحبًا ميلفوس

يرجى الرجوع إلى مرحبًا ميلفوس، قم بتغيير وسيطات uri، ثم قم بتشغيل الكود.

+
connections.connect("default",uri="https://milvustest.eastus2.cloudapp.azure.com:443") 
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.json b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.json new file mode 100644 index 000000000..714cbbb5c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.json @@ -0,0 +1 @@ +{"codeList":["gcloud compute networks create milvus-network \\\n --project=milvus-testing-nonprod \\\n --subnet-mode=auto \\\n --mtu=1460 \\\n --bgp-routing-mode=regional\n","gcloud compute firewall-rules create milvus-network-allow-icmp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows ICMP connections from any source to any instance on the network.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=icmp\n\ngcloud compute firewall-rules create milvus-network-allow-internal \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows connections from any source in the network IP range to any instance on the network using all protocols.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=10.128.0.0/9 \\\n --action=ALLOW --rules=all\n\ngcloud compute firewall-rules create milvus-network-allow-rdp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows RDP connections from any source to any instance on the network using port 3389.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:3389\n\ngcloud compute firewall-rules create milvus-network-allow-ssh \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows TCP connections from any source to any instance on the network using port 22.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:22\n","gcloud compute firewall-rules create allow-milvus-in \\\n --project=milvus-testing-nonprod \\\n --description=\"Allow ingress traffic for Milvus on port 19530\" \\\n --direction=INGRESS \\\n --priority=1000 \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --action=ALLOW \\\n --rules=tcp:19530 \\\n --source-ranges=0.0.0.0/0\n","gcloud container clusters create \"milvus-cluster-1\" \\\n --project \"milvus-testing-nonprod\" \\\n --zone \"us-west1-a\" \\\n --workload-pool \"milvus-testing-nonprod.svc.id.goog\" \\\n --no-enable-basic-auth \\\n --cluster-version \"1.28.10-gke.1075001\" \\\n --release-channel \"regular\" \\\n --machine-type \"c2-standard-4\" \\\n --image-type \"COS_CONTAINERD\" \\\n --disk-type \"pd-standard\" \\\n --disk-size \"100\" \\\n --max-pods-per-node \"110\" \\\n --num-nodes \"3\" \\\n --enable-ip-alias \\\n --network \"projects/milvus-testing-nonprod/global/networks/milvus-network\" \\\n --subnetwork \"projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network\"\n","gcloud container clusters get-credentials milvus-cluster-1 --zone \"us-west1-a\"\n","gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n accessKey: \"\"\n secretKey: \"\"\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy a Milvus Cluster on GKE","anchorList":[{"label":"نشر مجموعة Milvus العنقودية على GKE","href":"Deploy-a-Milvus-Cluster-on-GKE","type":1,"isActive":false},{"label":"قبل البدء","href":"Before-you-start","type":2,"isActive":false},{"label":"قم بإعداد الشبكة","href":"Set-up-the-network","type":2,"isActive":false},{"label":"توفير مجموعة Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"استخدم Google Cloud Storage (GCS) كمخزن كائنات خارجي","href":"Use-Google-Cloud-Storage-GCS-as-external-object-storage","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"تحقق من النشر","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"مرحباً ميلفوس","href":"Hello-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.md b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.md new file mode 100644 index 000000000..62496de63 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp.md @@ -0,0 +1,287 @@ +--- +id: gcp.md +title: نشر مجموعة Milvus العنقودية على GKE +related_key: cluster +summary: تعرف على كيفية نشر مجموعة Milvus العنقودية على GKE. +--- +

نشر مجموعة Milvus العنقودية على GKE

Milvus هي قاعدة بيانات متجهة سحابية أصلية ويمكن نشرها على بيئات سحابية مختلفة. يرشدك هذا الدليل إلى كل التفاصيل حول إعداد Milvus على منصة Google Cloud Platform (GCP).

+

+ + Deploy a Milvus cluster on GCP + نشر مجموعة Milvus العنقودية على GCP

+

قبل البدء

لنشر Milvus على GCP، تأكد من أن

+
    +
  • وجود مشروع موجود بالفعل في حساب GCP الخاص بك.

    +

    لإنشاء مشروع، راجع إنشاء المشاريع وإدارتها. اسم المشروع المستخدم في هذا الدليل هو milvus-testing-nonprod.

  • +
  • لقد قمتَ بتثبيت gcloud CLI و kubectl و Helm محليًا أو قررت استخدام Cloud Shell المستند إلى المتصفح بدلاً من ذلك.

  • +
  • لقد قمت بتهيئة gcloud CLI باستخدام بيانات اعتماد حساب GCP الخاص بك.

  • +
+

قم بإعداد الشبكة

لضمان أمان Milvus، تحتاج إلى إنشاء شبكة افتراضية معزولة منطقيًا في مشروع GCP الخاص بك. يقوم الأمر التالي بإنشاء VPC.

+
gcloud compute networks create milvus-network \
+    --project=milvus-testing-nonprod \
+    --subnet-mode=auto \
+    --mtu=1460 \
+    --bgp-routing-mode=regional
+
+

لتسهيل عملك، تحتاج أيضًا إلى إعداد العديد من قواعد جدار الحماية للسماح بحركة المرور الخارجية عبر ICMP و RDP و SSH بالإضافة إلى حركة المرور داخل VPC.

+
gcloud compute firewall-rules create milvus-network-allow-icmp \
+    --project=milvus-testing-nonprod \
+    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
+    --description="Allows ICMP connections from any source to any instance on the network." \
+    --direction=INGRESS \
+    --priority=65534 \
+    --source-ranges=0.0.0.0/0 \
+    --action=ALLOW \
+    --rules=icmp
+
+gcloud compute firewall-rules create milvus-network-allow-internal \
+    --project=milvus-testing-nonprod \
+    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
+    --description="Allows connections from any source in the network IP range to any instance on the network using all protocols." \
+    --direction=INGRESS \
+    --priority=65534 \
+    --source-ranges=10.128.0.0/9 \
+    --action=ALLOW --rules=all
+
+gcloud compute firewall-rules create milvus-network-allow-rdp \
+    --project=milvus-testing-nonprod \
+    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
+    --description="Allows RDP connections from any source to any instance on the network using port 3389." \
+    --direction=INGRESS \
+    --priority=65534 \
+    --source-ranges=0.0.0.0/0 \
+    --action=ALLOW \
+    --rules=tcp:3389
+
+gcloud compute firewall-rules create milvus-network-allow-ssh \
+    --project=milvus-testing-nonprod \
+    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
+    --description="Allows TCP connections from any source to any instance on the network using port 22." \
+    --direction=INGRESS \
+    --priority=65534 \
+    --source-ranges=0.0.0.0/0 \
+    --action=ALLOW \
+    --rules=tcp:22
+
+

أخيرًا، تحتاج إلى السماح بحركة المرور الواردة إلى مثيل Milvus الذي سننشئه لاحقًا على المنفذ 19530.

+
gcloud compute firewall-rules create allow-milvus-in \
+    --project=milvus-testing-nonprod  \
+    --description="Allow ingress traffic for Milvus on port 19530" \
+    --direction=INGRESS \
+    --priority=1000 \
+    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
+    --action=ALLOW \
+    --rules=tcp:19530 \
+    --source-ranges=0.0.0.0/0
+
+

توفير مجموعة Kubernetes

في هذا الدليل، سنستخدم خدمة محرك Google Kubernetes Engine (GKE) لتوفير مجموعة Kubernetes مع عقدتين في المنطقة us-west1-a. كل عقدة عبارة عن جهاز ظاهري e2-standard-4 Compute Engine يقوم بتشغيل صورة COS_CONTAINERD.

+
+

يُنصح باستخدام أنواع الأجهزة التي توفر ذاكرة لا تقل عن 16 جيجابايت لضمان استقرار الخدمة.

+
+
gcloud container clusters create "milvus-cluster-1" \
+    --project "milvus-testing-nonprod" \
+    --zone "us-west1-a" \
+    --workload-pool "milvus-testing-nonprod.svc.id.goog" \
+    --no-enable-basic-auth \
+    --cluster-version "1.28.10-gke.1075001" \
+    --release-channel "regular" \
+    --machine-type "c2-standard-4" \
+    --image-type "COS_CONTAINERD" \
+    --disk-type "pd-standard" \
+    --disk-size "100" \
+    --max-pods-per-node "110" \
+    --num-nodes "3" \
+    --enable-ip-alias \
+    --network "projects/milvus-testing-nonprod/global/networks/milvus-network" \
+    --subnetwork "projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network"
+
+

سيستغرق الأمر بضع دقائق حتى يتم تشغيل مجموعة Kubernetes العنقودية. بمجرد أن تصبح المجموعة جاهزة، استخدم الأمر التالي لجلب بيانات الاعتماد الخاصة بها حتى تتمكن من تشغيل الأوامر kubectl في جهازك الطرفي للتواصل مع المجموعة عن بُعد.

+
gcloud container clusters get-credentials milvus-cluster-1 --zone "us-west1-a"
+
+

استخدم Google Cloud Storage (GCS) كمخزن كائنات خارجي

    +
  • إنشاء دلو.
  • +
+
gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
+
+
    +
  • قم بإنشاء مفتاح وصول المستخدم والمفتاح السري، يجب عليك الانتقال إلى صفحة تخزين مشروعك. في الشريط الجانبي الأيسر من لوحة التحكم، انقر على Google Cloud Storage ثم الإعدادات. حدد علامة التبويب قابلية التشغيل البيني. إذا لم تكن قد قمت بتمكينه بالفعل، فانقر على الوصول القابل للتشغيل البيني. ثم انقر على زر إنشاء مفتاح لإنشاء.
  • +
+

+ + GCP Access keys for your user account + مفاتيح وصول GCP لحساب المستخدم الخاص بك

+
    +
  • أضف القيم.yaml
  • +
+
cluster:
+    enabled: true
+
+service:
+    type: LoadBalancer
+
+minio:
+    enabled: false
+
+externalS3:
+    enabled: true
+    host: storage.googleapis.com
+    port: 443
+    rootPath: milvus/my-release
+    bucketName: milvus-testing-nonprod
+    cloudProvider: gcp
+    useSSL: true
+    accessKey: "<access-key>"
+    secretKey: "<secret-key>"
+
+

نشر ميلفوس

الآن مجموعة Kubernetes جاهزة. لننشر ميلفوس الآن.

+
helm repo add milvus https://zilliztech.github.io/milvus-helm/
+helm repo update
+helm install -f values.yaml my-release milvus/milvus
+
+

في الأوامر السابقة، نضيف الريبو الخاص بمخططات Milvus Helm محليًا ونقوم بتحديث الريبو لجلب أحدث المخططات. ثم نقوم بتثبيت مثيل Milvus ونسميه الإصدار الخاص بي.

+

لاحظ قيمة التهيئة service.type ، والتي تشير إلى أننا نرغب في تعريض مثيل Milvus من خلال موازن تحميل من الطبقة الرابعة.

+

إذا كنت ترغب في تعريض مثيل Milvus الخاص بك من خلال موازن تحميل من الطبقة السابعة، اقرأ هذا.

+

تحقق من النشر

بمجرد تشغيل جميع البودات، قم بتشغيل الأمر التالي للحصول على عنوان IP الخارجي.

+
kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
+
+

مرحباً ميلفوس

يُرجى الرجوع إلى Hello Milvus، قم بتغيير قيمة المضيف إلى عنوان IP الخارجي، ثم قم بتشغيل الكود.

+

ما التالي

إذا كنت تريد معرفة كيفية نشر ميلفوس على السحب الأخرى:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.json b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.json new file mode 100644 index 000000000..fe7bfa4ae --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --set service.type=ClusterIP\n","helm upgrade my-release milvus/milvus -f tls.yaml\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n tlsMode: 1\n","apiVersion: cloud.google.com/v1\nkind: BackendConfig\nmetadata:\n name: my-release-backendconfig\n namespace: default\nspec:\n healthCheck:\n port: 9091\n requestPath: /healthz\n type: HTTP\n","kubectl apply -f backendconfig.yaml\n","kubectl annotate service my-release-milvus \\\n cloud.google.com/app-protocols='{\"milvus\":\"HTTP2\"}' \\\n cloud.google.com/backend-config='{\"default\": \"my-release-backendconfig\"}' \\\n cloud.google.com/neg='{\"ingress\": true}' --overwrite\n","# Generates a tls.key.\nopenssl genrsa -out tls.key 2048\n\n# Creates a certificate and signs it with the preceding key.\nopenssl req -new -key tls.key -out tls.csr \\\n -subj \"/CN=my-release.milvus.io\"\n\nopenssl x509 -req -days 99999 -in tls.csr -signkey tls.key \\\n -out tls.crt\n","kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key\n","apiVersion: networking.gke.io/v1\nkind: ManagedCertificate\nmetadata:\n name: my-release-milvus-tls\nspec:\n domains:\n - my-release.milvus.io\n","kubectl apply -f ./managed-crt.yaml\n","kubectl get -f ./managed-crt.yaml -o yaml -w\n","status:\n certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e\n certificateStatus: Provisioning\n domainStatus:\n - domain: my-release.milvus.io\n status: Provisioning\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\nspec:\n tls:\n - hosts:\n - my-release.milvus.io\n secretName: my-release-milvus-tls\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\n annotations:\n networking.gke.io/managed-certificates: \"my-release-milvus-tls\"\nspec:\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ./config/samples/ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus my-release.milvus.io 80 4s\nmy-release-milvus my-release.milvus.io 34.111.144.65 80, 443 41m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", server_pem_path=\"tls.crt\", secure=True, server_name=\"my-release.milvus.io\")\n\n# For Google-managed certificates, there is not need to do so.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", secure=True, server_name=\"my-release.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on GCP","anchorList":[{"label":"إعداد موازن تحميل من الطبقة 7 لميلفوس على GCP","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-GCP","type":1,"isActive":false},{"label":"تحقق من الاتصال من خلال موازن التحميل Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.md b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.md new file mode 100644 index 000000000..463ac19eb --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcp_layer7.md @@ -0,0 +1,215 @@ +--- +id: gcp_layer7.md +title: إعداد موازن تحميل من الطبقة 7 لميلفوس على GCP +related_key: cluster +summary: >- + تعرف على كيفية نشر مجموعة Milvus العنقودية خلف موازن تحميل من الطبقة السابعة + على GCP. +--- +

إعداد موازن تحميل من الطبقة 7 لميلفوس على GCP

عند مقارنته بموازن التحميل من الطبقة 4، فإن موازن التحميل من الطبقة 7 يوفر موازنة تحميل ذكية وإمكانيات تخزين مؤقت، وهو خيار رائع للخدمات السحابية الأصلية.

+

يرشدك هذا الدليل إلى كيفية إعداد موازن تحميل من الطبقة 7 لمجموعة Milvus التي تعمل بالفعل خلف موازن تحميل من الطبقة 4.

+

قبل البدء

+

تعديل تكوينات Milvus

يفترض هذا الدليل أنك قمت بالفعل بنشر مجموعة Milvus خلف موازن تحميل من الطبقة 4 على GCP.

+

قبل إعداد موازن تحميل من الطبقة السابعة لمجموعة Milvus العنقودية هذه، قم بتشغيل الأمر التالي لإزالة موازن تحميل الطبقة الرابعة.

+
helm upgrade my-release milvus/milvus --set service.type=ClusterIP
+
+

كخدمة خلفية لموازن تحميل الطبقة 7، يجب على Milvus تلبية متطلبات تشفير معينة حتى يتمكن من فهم طلبات HTTP/2 من موازن التحميل. لذلك، تحتاج إلى تمكين TLS على مجموعة Milvus الخاصة بك على النحو التالي.

+
helm upgrade my-release milvus/milvus -f tls.yaml
+
+

محتوى tls.yaml

+
extraConfigFiles:
+  user.yaml: |+
+    common:
+      security:
+        tlsMode: 1
+
+

إعداد نقطة نهاية التحقق من الصحة

لضمان توافر الخدمة، تتطلب موازنة التحميل من الطبقة السابعة على GCP فحص الظروف الصحية للخدمة الخلفية. لذلك، نحن بحاجة إلى إعداد BackendConfig لتغليف نقطة نهاية التحقق من الصحة وربط BackendConfig بخدمة Milvus من خلال التعليقات التوضيحية.

+

المقتطف التالي هو إعدادات BackendConfig. احفظه بصيغة backendconfig.yaml لاستخدامه لاحقًا.

+
apiVersion: cloud.google.com/v1
+kind: BackendConfig
+metadata:
+  name: my-release-backendconfig
+  namespace: default
+spec:
+  healthCheck:
+    port: 9091
+    requestPath: /healthz
+    type: HTTP
+
+

ثم قم بتشغيل الأمر التالي لإنشاء نقطة نهاية التحقق من الصحة.

+
kubectl apply -f backendconfig.yaml
+
+

أخيرًا، قم بتحديث التعليقات التوضيحية لخدمة Milvus لتطلب من موازن تحميل الطبقة السابعة الذي سننشئه لاحقًا إجراء فحوصات الصحة باستخدام نقطة النهاية التي تم إنشاؤها للتو.

+
kubectl annotate service my-release-milvus \
+    cloud.google.com/app-protocols='{"milvus":"HTTP2"}' \
+    cloud.google.com/backend-config='{"default": "my-release-backendconfig"}' \
+    cloud.google.com/neg='{"ingress": true}' --overwrite
+
+
+
    +
  • بالنسبة للتعليق التوضيحي الأول,

    +

    فإن Milvus أصلي ل gRPC، وهو مبني على HTTP/2. لذلك، يمكننا استخدام HTTP/2 كبروتوكول اتصال بين موازن تحميل الطبقة السابعة وميلفوس.

  • +
  • أما بالنسبة للتعليق التوضيحي الثاني,

    +

    يقدم Milvus نقطة نهاية التحقق من الصحة فقط عبر gRPC و HTTP/1. نحتاج إلى إعداد BackendConfig لتغليف نقطة نهاية التحقق من الصحة وربطها بخدمة Milvus بحيث يقوم موازن تحميل الطبقة السابعة باستكشاف نقطة النهاية هذه لمعرفة الحالة الصحية ل Milvus.

  • +
  • أما بالنسبة للتعليق التوضيحي الثالث,

    +

    فهو يطلب إنشاء مجموعة نقطة نهاية الشبكة (NEG) بعد إنشاء نقطة نهاية الشبكة (Ingress). عند استخدام NEGs مع GKE Ingress، تسهل وحدة التحكم في الدخول إنشاء جميع جوانب موازن التحميل. يتضمن ذلك إنشاء عنوان IP الافتراضي، وقواعد إعادة التوجيه، والتحقق من الصحة، وقواعد جدار الحماية، والمزيد. لمزيد من التفاصيل، راجع مستندات Google Cloud.

  • +
+
+

إعداد شهادات TLS

يتطلب TLS شهادات للعمل. هناك طريقتان لإنشاء الشهادات، وهما المدارة ذاتيًا والمدارة من Google.

+

يستخدم هذا الدليل my-release.milvus.io كاسم مجال للوصول إلى خدمة Milvus.

+

إنشاء شهادات مُدارة ذاتيًا

قم بتشغيل الأوامر التالية لإنشاء شهادة.

+
# Generates a tls.key.
+openssl genrsa -out tls.key 2048
+
+# Creates a certificate and signs it with the preceding key.
+openssl req -new -key tls.key -out tls.csr \
+    -subj "/CN=my-release.milvus.io"
+
+openssl x509 -req -days 99999 -in tls.csr -signkey tls.key \
+    -out tls.crt
+
+

ثم قم بإنشاء سر في مجموعة GKE الخاصة بك مع هذه الملفات لاستخدامها لاحقًا.

+
kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
+
+

إنشاء شهادات مُدارة من Google

المقتطف التالي هو إعداد شهادة مُدارة. احفظه بصيغة managed-crt.yaml لاستخدامه لاحقاً.

+
apiVersion: networking.gke.io/v1
+kind: ManagedCertificate
+metadata:
+  name: my-release-milvus-tls
+spec:
+  domains:
+    - my-release.milvus.io
+
+

قم بإنشاء شهادة مُدارة من خلال تطبيق الإعداد على مجموعة GKE العنقودية الخاصة بك على النحو التالي:

+
kubectl apply -f ./managed-crt.yaml
+
+

قد يستمر هذا لفترة من الوقت. يمكنك التحقق من التقدم عن طريق تشغيل

+
kubectl get -f ./managed-crt.yaml -o yaml -w
+
+

يجب أن تكون المخرجات مشابهة لما يلي:

+
status:
+  certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
+  certificateStatus: Provisioning
+  domainStatus:
+  - domain: my-release.milvus.io
+    status: Provisioning
+
+

بمجرد تحول certificateStatus إلى نشط، تكون جاهزًا لإعداد موازن التحميل.

+

قم بإنشاء مدخل لإنشاء موازن تحميل من الطبقة السابعة

قم بإنشاء ملف YAML بأحد المقتطفات التالية.

+
    +
  • استخدام الشهادات المُدارة ذاتيًا

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  name: my-release-milvus
    +  namespace: default
    +spec:
    +  tls:
    +  - hosts:
    +    - my-release.milvus.io
    +    secretName: my-release-milvus-tls
    +  rules:
    +  - host: my-release.milvus.io
    +    http:
    +      paths:
    +      - path: /
    +        pathType: Prefix
    +        backend:
    +          service:
    +            name: my-release-milvus
    +            port:
    +              number: 19530
    +
  • +
  • باستخدام الشهادات المُدارة ذاتيًا

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  name: my-release-milvus
    +  namespace: default
    +  annotations:
    +    networking.gke.io/managed-certificates: "my-release-milvus-tls"
    +spec:
    +  rules:
    +  - host: my-release.milvus.io
    +    http:
    +      paths:
    +      - path: /
    +        pathType: Prefix
    +        backend:
    +          service:
    +            name: my-release-milvus
    +            port:
    +              number: 19530
    +
  • +
+

ثم يمكنك إنشاء Ingress من خلال تطبيق الملف على مجموعة GKE الخاصة بك.

+
kubectl apply -f ingress.yaml
+
+

الآن، انتظر حتى تقوم جوجل بإعداد موازن تحميل الطبقة السابعة. يمكنك التحقق من التقدم عن طريق تشغيل

+
kubectl  -f ./config/samples/ingress.yaml get -w
+
+

يجب أن يكون الناتج مشابهًا لما يلي:

+
NAME                CLASS    HOSTS                  ADDRESS   PORTS   AGE
+my-release-milvus   <none>   my-release.milvus.io             80      4s
+my-release-milvus   <none>   my-release.milvus.io   34.111.144.65   80, 443   41m
+
+

بمجرد عرض عنوان IP في حقل ADDRESS، يكون موازن تحميل Layer-7 جاهزًا للاستخدام. يتم عرض كل من المنفذ 80 والمنفذ 443 في الإخراج أعلاه. تذكر أنه يجب عليك دائمًا استخدام المنفذ 443 لمصلحتك.

+

تحقق من الاتصال من خلال موازن التحميل Layer-7

يستخدم هذا الدليل PyMilvus للتحقق من الاتصال بخدمة Milvus خلف موازن تحميل Layer-7 الذي أنشأناه للتو. للاطلاع على الخطوات التفصيلية، اقرأ هذا.

+

لاحظ أن معلمات الاتصال تختلف بالطريقة التي تختارها لإدارة الشهادات في إعداد شهادات TLS.

+
from pymilvus import (
+    connections,
+    utility,
+    FieldSchema,
+    CollectionSchema,
+    DataType,
+    Collection,
+)
+
+# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.
+connections.connect("default", host="34.111.144.65", port="443", server_pem_path="tls.crt", secure=True, server_name="my-release.milvus.io")
+
+# For Google-managed certificates, there is not need to do so.
+connections.connect("default", host="34.111.144.65", port="443", secure=True, server_name="my-release.milvus.io")
+
+
+
    +
  • يجب أن يتطابق عنوان IP ورقم المنفذ في المضيف والمنفذ مع تلك المدرجة في نهاية إنشاء مدخل لإنشاء موازن تحميل من الطبقة السابعة.
  • +
  • إذا كنت قد قمت بإعداد سجل DNS لتعيين اسم المجال إلى عنوان IP المضيف، استبدل عنوان IP في المضيف باسم المجال واحذف اسم_المخدم.
  • +
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.json b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.json new file mode 100644 index 000000000..aef41394f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.json @@ -0,0 +1 @@ +{"codeList":["gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","kubectl create serviceaccount milvus-gcs-access-sa\n","gcloud iam service-accounts create milvus-gcs-access-sa \\\n --project=milvus-testing-nonprod\n","gcloud projects add-iam-policy-binding milvus-testing-nonprod \\\n --member \"serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\" \\\n --role \"roles/storage.admin\" \\\n --condition='title=milvus-testing-nonprod,expression=resource.service == \"storage.googleapis.com\" && resource.name.startsWith(\"projects/_/buckets/milvus-testing-nonprod\")'\n","gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \\\n --role \"roles/iam.workloadIdentityUser\" \\\n --member \"serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]\"\n","kubectl annotate serviceaccount milvus-gcs-access-sa \\\n --namespace default \\\n iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\n","curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email\n","helm install -f values.yaml my-release milvus/milvus\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nserviceAccount:\n create: false\n name: milvus-gcs-access-sa\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n useIAM: true\n"],"headingContent":"Configure GCS Access by Workload Identity","anchorList":[{"label":"تكوين وصول GCS حسب هوية حمل العمل","href":"Configure-GCS-Access-by-Workload-Identity","type":1,"isActive":false},{"label":"قبل البدء","href":"Before-you-start","type":2,"isActive":false},{"label":"تكوين التطبيقات لاستخدام هوية حمل العمل","href":"Configure-applications-to-use-Workload-Identity","type":2,"isActive":false},{"label":"التحقق من إعداد هوية عبء العمل","href":"Verify-the-Workload-Identity-setup","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.md b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.md new file mode 100644 index 000000000..5076a1a4e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/gcp/gcs.md @@ -0,0 +1,151 @@ +--- +id: gcs.md +title: تكوين وصول GCS حسب هوية حمل العمل +related_key: 'gcs, storage, workload identity, iam' +summary: تعرف على كيفية تكوين gcs مع هوية عبء العمل. +--- +

تكوين وصول GCS حسب هوية حمل العمل

يقدم هذا الموضوع كيفية تكوين الوصول إلى GCS حسب هوية عبء العمل عند تثبيت Milvus مع Helm. لمزيد من التفاصيل، راجع هوية عبء العمل.

+

قبل البدء

يرجى تمكين هوية حمل العمل على المجموعات وتجمعات العُقد باستخدام Google Cloud CLI أو وحدة تحكم Google Cloud. يجب تمكين هوية حمل العمل على مستوى المجموعة قبل أن تتمكن من تمكين هوية حمل العمل على تجمعات العُقد.

+

تكوين التطبيقات لاستخدام هوية حمل العمل

    +
  • إنشاء دلو.
  • +
+
gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
+
+
    +
  • قم بإنشاء حساب خدمة Kubernetes لتطبيقك لاستخدامه.
  • +
+
kubectl create serviceaccount milvus-gcs-access-sa
+
+
    +
  • إنشاء حساب خدمة IAM لتطبيقك أو استخدام حساب خدمة IAM موجود بدلاً من ذلك. يمكنك استخدام أي حساب خدمة IAM في أي مشروع في مؤسستك.
  • +
+
gcloud iam service-accounts create milvus-gcs-access-sa \
+    --project=milvus-testing-nonprod
+
+
    +
  • تأكد من أن حساب خدمة IAM الخاص بك يحتوي على الأدوار التي تحتاجها. يمكنك منح أدوار إضافية باستخدام الأمر التالي:
  • +
+
gcloud projects add-iam-policy-binding milvus-testing-nonprod \
+    --member "serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com" \
+    --role "roles/storage.admin" \
+    --condition='title=milvus-testing-nonprod,expression=resource.service == "storage.googleapis.com" && resource.name.startsWith("projects/_/buckets/milvus-testing-nonprod")'
+
+
    +
  • اسمح لحساب خدمة Kubernetes بانتحال شخصية حساب خدمة IAM عن طريق إضافة ارتباط نهج IAM بين حسابي الخدمة. يسمح هذا الربط لحساب خدمة Kubernetes بالعمل كحساب خدمة IAM.
  • +
+
gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \
+    --role "roles/iam.workloadIdentityUser" \
+    --member "serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]"
+
+
    +
  • قم بتعليق حساب خدمة Kubernetes بعنوان البريد الإلكتروني لحساب خدمة IAM.
  • +
+
kubectl annotate serviceaccount milvus-gcs-access-sa \
+    --namespace default \
+    iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com
+
+

التحقق من إعداد هوية عبء العمل

يرجى الرجوع إلى هوية حمل العمل. قم بتشغيل الأمر التالي داخل Pod:

+
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
+
+

إذا كانت النتيجة milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com ، فلا بأس.

+

نشر ميلفوس

helm install -f values.yaml my-release milvus/milvus
+
+

محتويات القيم.yaml

+
cluster:
+    enabled: true
+
+service:
+    type: LoadBalancer
+
+minio:
+    enabled: false
+
+serviceAccount:
+    create: false
+    name: milvus-gcs-access-sa
+
+externalS3:
+    enabled: true
+    host: storage.googleapis.com
+    port: 443
+    rootPath: milvus/my-release
+    bucketName: milvus-testing-nonprod
+    cloudProvider: gcp
+    useSSL: true
+    useIAM: true
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.json b/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.json new file mode 100644 index 000000000..43fdc8f6f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.json @@ -0,0 +1 @@ +{"codeList":["# milvus-operator-certificate.yaml\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n name: milvus-operator-serving-cert\n namespace: milvus-operator\nspec:\n dnsNames:\n - milvus-operator-webhook-service.milvus-operator.svc\n - milvus-operator-webhook-service.milvus-operator.svc.cluster.local\n issuerRef:\n kind: Issuer\n name: milvus-operator-selfsigned-issuer\n secretName: milvus-operator-webhook-cert\n---\napiVersion: cert-manager.io/v1\nkind: Issuer\nmetadata:\n name: milvus-operator-selfsigned-issuer\n namespace: milvus-operator\nspec:\n selfSigned: {}\n","kubectl apply -f milvus-operator-certificate.yaml\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update milvus-operator\n","helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator\n"],"headingContent":"Deploy a Milvus Cluster on OpenShift","anchorList":[{"label":"نشر مجموعة Milvus على OpenShift","href":"Deploy-a-Milvus-Cluster-on-OpenShift","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"الخطوة 1: تثبيت Cert Manager","href":"Step-1-Install-Cert-Manager","type":2,"isActive":false},{"label":"الخطوة 2: إصدار شهادة موقعة ذاتيًا لمشغل Milvus","href":"Step-2-Issue-a-Self-Signed-Certificate-for-Milvus-Operator","type":2,"isActive":false},{"label":"الخطوة 3: تثبيت مشغل ميلفوس","href":"Step-3-Install-Milvus-Operator","type":2,"isActive":false},{"label":"الخطوة 4: نشر ميلفوس","href":"Step-4-Deploy-Milvus","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-Next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.md b/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.md new file mode 100644 index 000000000..b116635ca --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/clouds/openshift/openshift.md @@ -0,0 +1,183 @@ +--- +id: openshift.md +title: نشر مجموعة Milvus على OpenShift +related_key: cluster +summary: تعرف على كيفية نشر مجموعة Milvus على OpenShift. +--- +

نشر مجموعة Milvus على OpenShift

يقدم هذا الموضوع دليلاً مفصلاً خطوة بخطوة حول كيفية نشر Milvus على OpenShift.

+

المتطلبات الأساسية

قبل البدء بعملية النشر، تأكد من أن لديك:

+
    +
  • مجموعة OpenShift قيد التشغيل.
  • +
  • الوصول إلى مجموعة OpenShift مع امتيازات كافية (دورcluster-admin أو ما يعادله).
  • +
  • الوصول إلى وحدة تحكم الويب لمنصة حاويات OpenShift Container Platform.
  • +
+

الخطوة 1: تثبيت Cert Manager

مدير Cert Manager مطلوب لإدارة شهادات TLS لمشغل Milvus.

+
    +
  1. ابحث عن إصدار مدير الشهادات المناسب لإصدار OpenShift الخاص بك: إصدارات Cert Manager.

  2. +
  3. قم بتثبيت Cert Manager باتباع الدليل الرسمي: تثبيت مدير Cert Manager.

  4. +
  5. تحقق من أن مدير الشهادات الخاص بك يعمل:

    +
      +
    1. في وحدة تحكم Openhift الخاصة بك، انتقل إلى أحمال العمل > الكبسولات. حدد مشروع مدير الشهادات.

      +

      + + cert-manager-1 + cert-manager-1

    2. +
    3. تأكد من أن جميع البودات جاهزة. على سبيل المثال، تشير الصورة أدناه إلى أن البودات لا تزال في طور البدء. انتظر حتى تصبح جميع هذه الكبسولات جاهزة.

      +

      + + cert-manager-2 + cert-manager-2

    4. +
  6. +
+

الخطوة 2: إصدار شهادة موقعة ذاتيًا لمشغل Milvus

تأكد من تسجيل الدخول باسم kubeadmin أو لديك امتيازات مكافئة.

+
    +
  1. قم بإنشاء ملف البيان التالي المسمى milvus-operator-certificate.yaml:

    +
    # milvus-operator-certificate.yaml
    +apiVersion: cert-manager.io/v1
    +kind: Certificate
    +metadata:
    +  name: milvus-operator-serving-cert
    +  namespace: milvus-operator
    +spec:
    +  dnsNames:
    +  - milvus-operator-webhook-service.milvus-operator.svc
    +  - milvus-operator-webhook-service.milvus-operator.svc.cluster.local
    +  issuerRef:
    +    kind: Issuer
    +    name: milvus-operator-selfsigned-issuer
    +  secretName: milvus-operator-webhook-cert
    +---
    +apiVersion: cert-manager.io/v1
    +kind: Issuer
    +metadata:
    +  name: milvus-operator-selfsigned-issuer
    +  namespace: milvus-operator
    +spec:
    +  selfSigned: {}
    +
  2. +
  3. قم بتطبيق الملف:

    +
    kubectl apply -f milvus-operator-certificate.yaml
    +
  4. +
+

الخطوة 3: تثبيت مشغل ميلفوس

يمكنك الآن البدء في تثبيت مشغل ميلفوس. يوصى باستخدام Helm لتثبيت مشغل Milvus لتبسيط عملية التهيئة.

+
    +
  1. أضف مستودع Milvus Operator Milvus Helm:

    +
    helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update milvus-operator
    +
  2. +
  3. تثبيت مشغل ميلفوس:

    +
    helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator
    +
  4. +
+

الخطوة 4: نشر ميلفوس

اتبع بقية الدليل على موقع توثيق Milvus: نشر ميلفوس.

+

الخطوة التالية

إذا كنت تريد معرفة كيفية نشر ميلفوس على السحب الأخرى:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.json b/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.json new file mode 100644 index 000000000..96ca1e41e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl create namespace observability\n$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability\n","$ kubectl get deployment jaeger-operator -n observability\n\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\njaeger-operator 1 1 1 1 48s\n","apiVersion: jaegertracing.io/v1\nkind: Jaeger\nmetadata:\n name: jaeger\n","$ kubectl apply -f simplest.yaml\n","$ kubectl get jaegers\n\nNAME STATUS VERSION STRATEGY STORAGE AGE\njaeger Running 1.62.0 allinone memory 13s\n","extraConfigFiles:\n user.yaml: |+\n trace:\n exporter: jaeger\n sampleFraction: 1\n jaeger:\n url: \"http://jaeger-collector:14268/api/traces\"\n","$ helm repo add zilliztech https://zilliztech.github.io/milvus-helm\n$ helm repo update\n$ helm upgrade --install -f values.yaml my-release milvus/milvus\n","$ helm upgrade my-release -f values.yaml milvus/milvus\n","$ kubectl get ingress\n\nNAME CLASS HOSTS ADDRESS PORTS AGE\njaeger-query * 192.168.122.34 80 14m\n"],"headingContent":"Configure Trace","anchorList":[{"label":"تكوين التتبع","href":"Configure-Trace","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"ديبلي جايجر","href":"Deply-Jaeger","type":2,"isActive":false},{"label":"تثبيت ميلفوس مع مخطط هيلم","href":"Install-Milvus-with-Helm-Chart","type":2,"isActive":false},{"label":"عرض التتبعات","href":"View-Traces","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.md b/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.md new file mode 100644 index 000000000..0d15dc4cb --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/config_jaeger_tracing.md @@ -0,0 +1,146 @@ +--- +id: config_jaeger_tracing.md +title: تكوين التتبع +related_key: 'Jaeger, Milvus, Trace' +summary: يوفر هذا الدليل إرشادات حول كيفية تكوين Jaeger لتجميع الآثار لـ Milvus. +--- +

تكوين التتبع

يوفر هذا الدليل إرشادات حول كيفية تكوين Jaeger لتجميع التتبع لـ Milvus.

+

المتطلبات الأساسية

    +
  • أن تكون قد قمت بتثبيت الأدوات الضرورية، بما في ذلك Helm و Kubectl.
  • +
  • يجب تثبيت الإصدار 1.6.1 أو أعلى من Cert-manager. يمكن العثور على دليل التثبيت هنا.
  • +
+

ديبلي جايجر

جايجر هي منصة تتبع موزعة تم إصدارها كمصدر مفتوح من قبل أوبر تكنولوجيز.

+

1. تثبيت مشغل Jaeger على Kubernetes

لتثبيت المشغل، قم بتشغيل:

+
$ kubectl create namespace observability
+$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability
+
+

في هذه المرحلة، يجب أن يكون هناك نشر jaeger-operator متاحًا. يمكنك عرضه عن طريق تشغيل الأمر التالي:

+
$ kubectl get deployment jaeger-operator -n observability
+
+NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
+jaeger-operator   1         1         1            1           48s
+
+

2. نشر جايجر

أبسط طريقة ممكنة لإنشاء مثيل Jaeger هي إنشاء ملف YAML مثل المثال التالي. سيؤدي هذا إلى تثبيت إستراتيجية AllInOne الافتراضية التي تنشر صورة الكل في واحد (تجمع بين Jaeger-Aagent وJaeger- Collector وJaeger- Collector وJaeger-query وJaeger UI) في جراب واحد، باستخدام التخزين في الذاكرة افتراضيًا.

+

إذا كنت ترغب في تخزين الآثار لفترة طويلة، يرجى الرجوع إلى استراتيجية الإنتاج.

+
apiVersion: jaegertracing.io/v1
+kind: Jaeger
+metadata:
+  name: jaeger
+
+

يمكن بعد ذلك استخدام ملف YAML مع kubectl:

+
$ kubectl apply -f simplest.yaml
+
+

في غضون ثوانٍ قليلة، سيتوفر مثيل جديد في الذاكرة من Jaeger، وهو مناسب للعروض التوضيحية السريعة وأغراض التطوير. للتحقق من المثيلات التي تم إنشاؤها، قم بإدراج كائنات Jaeger:

+
$ kubectl get jaegers
+
+NAME     STATUS    VERSION   STRATEGY   STORAGE   AGE
+jaeger   Running   1.62.0    allinone   memory    13s
+
+

تثبيت ميلفوس مع مخطط هيلم

يمكنك تثبيت Milvus مع مخطط Helm أو ترقيته باستخدام الإعدادات التالية:

+
extraConfigFiles:
+  user.yaml: |+
+    trace:
+      exporter: jaeger
+      sampleFraction: 1
+      jaeger:
+        url: "http://jaeger-collector:14268/api/traces"
+
+

لتطبيق الإعدادات المذكورة أعلاه على نشر Milvus جديد، يمكنك تشغيل الأمر التالي:

+
$ helm repo add zilliztech https://zilliztech.github.io/milvus-helm
+$ helm repo update
+$ helm upgrade --install -f values.yaml my-release milvus/milvus
+
+

لتطبيق الإعدادات المذكورة أعلاه على عملية نشر Milvus موجودة، يمكنك تشغيل الأمر التالي:

+
$ helm upgrade my-release -f values.yaml milvus/milvus
+
+

عرض التتبعات

بمجرد أن تقوم بنشر جايجر وميلفوس مع مخطط هيلم، يتم تمكين الدخول بواسطة dfault. يمكنك عرض الدخول عن طريق تشغيل الأمر التالي:

+
$ kubectl get ingress
+
+NAME           CLASS    HOSTS   ADDRESS         PORTS   AGE
+jaeger-query   <none>   *       192.168.122.34  80      14m
+
+

بمجرد توفر الدخول، يمكنك الوصول إلى واجهة مستخدم Jaeger من خلال الانتقال إلى http://${ADDRESS}. استبدل ${ADDRESS} بعنوان IP الفعلي للمدخل.

+

تُظهر لقطة الشاشة التالية واجهة المستخدم Jaeger UI مع آثار ميلفوس أثناء عملية بحث وعملية تجميع تحميل:

+

+ + Trace Search Request + طلب بحث التتبع

+

+ + Trace Load Collection Request + تتبع طلب تجميع التحميل

diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-docker.json b/localization/v2.5.x/site/ar/adminGuide/configure-docker.json new file mode 100644 index 000000000..daf947fe3 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-docker.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml\n","# For Milvus standalone\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n","...\n standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.2.13\n command: [\"milvus\", \"run\", \"standalone\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml # Map the local path to the container path\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n...\n","$ sudo docker compose up -d\n"],"headingContent":"Configure Milvus with Docker Compose","anchorList":[{"label":"تكوين Milvus باستخدام Docker Compose","href":"Configure-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"تنزيل ملف التكوين","href":"Download-a-configuration-file","type":2,"isActive":false},{"label":"تعديل ملف التكوين","href":"Modify-the-configuration-file","type":2,"isActive":false},{"label":"تنزيل ملف التثبيت","href":"Download-an-installation-file","type":2,"isActive":false},{"label":"تعديل ملف التثبيت","href":"Modify-the-installation-file","type":2,"isActive":false},{"label":"بدء تشغيل ميلفوس","href":"Start-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-docker.md b/localization/v2.5.x/site/ar/adminGuide/configure-docker.md new file mode 100644 index 000000000..25322ed65 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-docker.md @@ -0,0 +1,296 @@ +--- +id: configure-docker.md +label: Docker Compose +related_key: configure +summary: تكوين Milvus مع Docker Compose. +title: تكوين Milvus باستخدام Docker Compose +--- +

تكوين Milvus باستخدام Docker Compose

يصف هذا الموضوع كيفية تهيئة مكونات Milvus وتوابعها الخارجية باستخدام Docker Compose.

+
+في الإصدار الحالي، تسري جميع المعلمات فقط بعد إعادة تشغيل Milvus.
+

تنزيل ملف التكوين

قم بتنزيل milvus.yaml مباشرة أو باستخدام الأمر التالي.

+
$ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml
+
+

تعديل ملف التكوين

قم بتهيئة مثيل Milvus الخاص بك ليناسب سيناريوهات تطبيقك من خلال تعديل المعلمات المقابلة في milvus.yaml.

+

راجع الروابط التالية لمزيد من المعلومات حول كل معلمة.

+

مرتبة حسب:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
الغرضالمعلمات
ضبط الأداء + +
البيانات والتعريف + +
الإدارة + +
الحصة والحدود + +
+
+

تنزيل ملف التثبيت

قم بتنزيل ملف التثبيت الخاص بـ Milvus المستقل، واحفظه بصيغة docker-compose.yml.

+

يمكنك أيضاً ببساطة تشغيل الأمر التالي.

+
# For Milvus standalone
+$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
+
+

تعديل ملف التثبيت

في docker-compose.yml ، أضف قسم volumes تحت كل milvus-standalone.

+

قم بتعيين المسار المحلي لملف milvus.yaml الخاص بك على مسارات حاوية دوكر المقابلة لملفات التكوين /milvus/configs/milvus.yaml تحت كل volumes الأقسام.

+
...
+  standalone:
+    container_name: milvus-standalone
+    image: milvusdb/milvus:v2.2.13
+    command: ["milvus", "run", "standalone"]
+    environment:
+      ETCD_ENDPOINTS: etcd:2379
+      MINIO_ADDRESS: minio:9000
+    volumes:
+      - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml   # Map the local path to the container path
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+    ports:
+      - "19530:19530"
+      - "9091:9091"
+    depends_on:
+      - "etcd"
+      - "minio"
+...
+
+
+يتم تخزين البيانات في المجلد /volumes وفقًا للتكوين الافتراضي في docker-compose.yml. لتغيير المجلد لتخزين البيانات، قم بتحرير docker-compose.yml أو قم بتشغيل $ export DOCKER_VOLUME_DIRECTORY=.
+

بدء تشغيل ميلفوس

بعد الانتهاء من تعديل ملف التهيئة وملف التثبيت، يمكنك بعد ذلك بدء تشغيل ميلفوس.

+
$ sudo docker compose up -d
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-helm.json b/localization/v2.5.x/site/ar/adminGuide/configure-helm.json new file mode 100644 index 000000000..3ded42d1c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-helm.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml\n","# Extra configs for milvus.yaml\n# If set, this config will merge into milvus.yaml\n# Please follow the config structure in the milvus.yaml\n# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml\n# Note: this config will be the top priority which will override the config\n# in the image and helm chart.\nextraConfigFiles:\n user.yaml: |+\n # For example to set the graceful time for query nodes\n # queryNodes:\n # gracefulTime: 10\n","$ helm upgrade my-release milvus/milvus -f values.yaml\n","$ helm show values milvus/milvus\n","# For instance, upgrade the Milvus cluster with compaction disabled\n$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false\n"],"headingContent":"Configure Milvus with Helm Charts","anchorList":[{"label":"تكوين Milvus مع مخططات Helm Charts","href":"Configure-Milvus-with-Helm-Charts","type":1,"isActive":false},{"label":"تكوين Milvus عبر ملف التكوين","href":"Configure-Milvus-via-configuration-file","type":2,"isActive":false},{"label":"تكوين ميلفوس عبر سطر الأوامر","href":"Configure-Milvus-via-command-line","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-helm.md b/localization/v2.5.x/site/ar/adminGuide/configure-helm.md new file mode 100644 index 000000000..45fec28b5 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-helm.md @@ -0,0 +1,250 @@ +--- +id: configure-helm.md +label: Helm +related_key: configure +summary: تكوين ميلفوس مع مخططات هيلم. +title: تكوين Milvus مع مخططات Helm Charts +--- +

تكوين Milvus مع مخططات Helm Charts

يصف هذا الموضوع كيفية تكوين مكونات Milvus وتوابعها التابعة لجهة خارجية مع مخططات Helm.

+
+في الإصدار الحالي، تسري جميع المعلمات فقط بعد إعادة تشغيل Milvus.
+

تكوين Milvus عبر ملف التكوين

يمكنك تكوين Milvus باستخدام ملف تكوين values.yaml.

+

تنزيل ملف التكوين

قم بتنزيل values.yaml مباشرة أو باستخدام الأمر التالي.

+
$ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml
+
+

تعديل ملف التكوين

قم بتهيئة مثيل ميلفوس الخاص بك ليناسب سيناريوهات تطبيقك من خلال تعديل المعلمات المقابلة في values.yaml.

+

على وجه التحديد، ابحث عن extraConfigFiles في values.yaml وضع التكوينات الخاصة بك في هذا القسم على النحو التالي:

+
# Extra configs for milvus.yaml
+# If set, this config will merge into milvus.yaml
+# Please follow the config structure in the milvus.yaml
+# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml
+# Note: this config will be the top priority which will override the config
+# in the image and helm chart.
+extraConfigFiles:
+  user.yaml: |+
+    #    For example to set the graceful time for query nodes
+    #    queryNodes:
+    #      gracefulTime: 10
+
+

راجع الروابط التالية لمزيد من المعلومات حول كل معلمة.

+

مرتبة حسب:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
الغرضالمعلمات
ضبط الأداء + +
البيانات والتعريف + +
الإدارة + +
الحصة والحدود + +
+
+

للاطلاع على معلمات أخرى خاصة بتثبيت Kubernetes، راجع تكوين مخطط Milvus Helm البياني.

+

بدء تشغيل ميلفوس

بعد الانتهاء من تعديل ملف التكوين، يمكنك بعد ذلك بدء تشغيل ملف Milvus بالملف.

+
$ helm upgrade my-release milvus/milvus -f values.yaml
+
+

تكوين ميلفوس عبر سطر الأوامر

بدلاً من ذلك، يمكنك ترقية تكوينات ميلفوس مباشرةً باستخدام أمر Helm.

+

تحقق من المعلمات القابلة للتكوين

قبل الترقية، يمكنك التحقق من المعلمات القابلة للتكوين باستخدام مخططات Helm.

+
$ helm show values milvus/milvus
+
+

بدء تشغيل ميلفوس

قم بتكوين وبدء تشغيل Milvus عن طريق إضافة --values أو --set في الأمر الخاص بالترقية.

+
# For instance, upgrade the Milvus cluster with compaction disabled
+$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.json b/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.json new file mode 100644 index 000000000..a7a5cd210 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.json @@ -0,0 +1 @@ +{"codeList":["$ lsblk | grep nvme\nnvme0n1 259:0 0 250.0G 0 disk \nnvme1n1 259:1 0 250.0G 0 disk \n","MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"==MYBOUNDARY==\"\n\n--==MYBOUNDARY==\nContent-Type: text/x-shellscript; charset=\"us-ascii\"\n\n#!/bin/bash\necho \"Running custom user data script\"\nif ( lsblk | fgrep -q nvme1n1 ); then\n mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker\n mkfs.xfs /dev/nvme1n1\n mount /dev/nvme1n1 /mnt/data\n chmod 0755 /mnt/data\n mv /var/lib/kubelet /mnt/data/\n mv /var/lib/docker /mnt/data/\n ln -sf /mnt/data/kubelet /var/lib/kubelet\n ln -sf /mnt/data/docker /var/lib/docker\n UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')\n echo \"UUID=$UUID /mnt/data xfs defaults,noatime 1 1\" >> /etc/fstab\nfi\necho 10485760 > /proc/sys/fs/aio-max-nr\n\n--==MYBOUNDARY==--\n","gcloud container node-pools create ${POOL_NAME} \\\n --cluster=${CLUSTER_NAME} \\\n --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \\\n --machine-type=${MACHINE_TYPE}\n","mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1\nmdadm -Ds > /etc/mdadm/mdadm.conf \nupdate-initramfs -u\n\nmkfs.xfs /dev/md0\nmkdir -p /var/lib/kubelet\necho '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab\nmount -a\n","#!/bin/bash\necho \"nvme init start...\"\nmkfs.xfs /dev/nvme0n1\nmkdir -p /mnt/data\necho '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab\nmount -a\n\nmkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods\nmkdir -p /var/lib/kubelet /var/lib/containerd /var/log/pods\n\necho '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab\nmount -a\n\necho \"nvme init end...\"\n","sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state\nsudo vim /etc/containerd/config.toml\n","[plugins.\"io.containerd.grpc.v1.cri\".containerd]\nsnapshotter = \"overlayfs\"\nroot = \"/mnt/nvme/containerd\"\nstate = \"/mnt/nvme/containerd/state\"\n","sudo systemctl restart containerd\n","kubectl create -f ubuntu.yaml\n","apiVersion: v1\nkind: Pod\nmetadata:\nname: ubuntu\nspec:\ncontainers:\n- name: ubuntu\n image: ubuntu:latest\n command: [\"sleep\", \"86400\"]\n volumeMounts:\n - name: data-volume\n mountPath: /data\nvolumes:\n - name: data-volume\n emptyDir: {}\n","# enter the container\nkubectl exec pod/ubuntu -it bash\n\n# in container\napt-get update\napt-get install fio -y\n\n# change to the mounted dir\ncd /data\n\n# write 10GB\nfio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test\n\n# verify the read speed\n# compare with the disk performance indicators provided by various cloud providers.\nfio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly\n","Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]\niops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024\nread: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)\n slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96\n clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13\n lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74\n clat percentiles (usec):\n | 1.00th=[ 69], 5.00th=[ 79], 10.00th=[ 85], 20.00th=[ 95],\n | 30.00th=[ 106], 40.00th=[ 123], 50.00th=[ 149], 60.00th=[ 11469],\n | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],\n | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],\n | 99.99th=[767558]\nbw ( MiB/s): min= 236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591\niops : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591\nlat (usec) : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%\nlat (usec) : 1000=0.08%\nlat (msec) : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%\nlat (msec) : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%\nlat (msec) : 2000=0.01%\ncpu : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665\nIO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%\n submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%\n complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%\n issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0\n latency : target=0, window=0, percentile=100.00%, depth=64\n","...\nspec:\n components:\n queryNode:\n volumeMounts:\n - mountPath: /var/lib/milvus/data\n name: data\n volumes:\n - emptyDir:\n name: data\n"],"headingContent":"Configure Milvus QueryNode with Local Disk","anchorList":[{"label":"تكوين Milvus QueryNode مع القرص المحلي","href":"Configure-Milvus-QueryNode-with-Local-Disk","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"تكوين Kubernetes لاستخدام القرص المحلي","href":"Configure-Kubernetes-to-use-local-disk","type":2,"isActive":false},{"label":"التحقق من أداء القرص","href":"Verify-disk-performance","type":2,"isActive":false},{"label":"نشر ميلفوس الموزع","href":"Deploy-Milvus-Distributed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.md b/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.md new file mode 100644 index 000000000..ec236d07c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure-querynode-localdisk.md @@ -0,0 +1,282 @@ +--- +id: configure-querynode-localdisk.md +title: تكوين Milvus QueryNode مع القرص المحلي +related_key: 'querynode, query node, local disk' +summary: تعرف على كيفية تهيئة Milvus QueryNode لاستخدام القرص المحلي. +--- +

تكوين Milvus QueryNode مع القرص المحلي

توضح هذه المقالة كيفية تكوين Milvus QueryNode Milvus QueryNode لاستخدام تخزين القرص المحلي.

+

نظرة عامة

Milvus هي قاعدة بيانات متجهة تركز على الذكاء الاصطناعي مصممة خصيصًا لتخزين واسترجاع كميات هائلة من البيانات المتجهة بكفاءة. وهي مثالية لمهام مثل تحليل الصور والفيديو ومعالجة اللغة الطبيعية وأنظمة التوصيات. لضمان الأداء الأمثل، من الضروري تقليل زمن انتقال القراءة على القرص إلى الحد الأدنى. يوصى بشدة باستخدام محركات أقراص NVMe SSD المحلية لمنع التأخير والحفاظ على استقرار النظام.

+

تتضمن الميزات الرئيسية التي يتم فيها تشغيل تخزين القرص المحلي ما يلي:

+
    +
  • ذاكرة التخزين المؤقت للقطع: التحميل المسبق للبيانات في ذاكرة التخزين المؤقت للقرص المحلي للبحث بشكل أسرع.
  • +
  • MMap: تعيين محتويات الملف مباشرة في الذاكرة لتحسين كفاءة الذاكرة.
  • +
  • فهرس DiskANN: يتطلب تخزين القرص لإدارة الفهرس بكفاءة.
  • +
+

في هذه المقالة، سنركز على نشر Milvus Distributed على المنصات السحابية، وكيفية تكوين QueryNode لاستخدام تخزين القرص NVMe. يسرد الجدول التالي أنواع الأجهزة الموصى بها لمختلف موفري السحابة.

+ + + + + + + + + + + +
مزود السحابةنوع الجهاز
AWSسلسلة R6id
GCPسلسلة N2
أزورسلسلة Lsv3
علي بابا كلاودسلسلة i3
سحابة تينسنتسلسلة IT5
+

توفر أنواع الأجهزة هذه تخزين قرص NVMe. يمكنك استخدام الأمر lsblk في مثيلات هذه الأنواع من الأجهزة للتحقق مما إذا كانت تحتوي على وحدة تخزين قرص NVMe. إذا كان لديهم ذلك، يمكنك المتابعة إلى الخطوة التالية.

+
$ lsblk | grep nvme
+nvme0n1     259:0    0 250.0G  0 disk 
+nvme1n1     259:1    0 250.0G  0 disk 
+
+

تكوين Kubernetes لاستخدام القرص المحلي

لتهيئة QueryNode من Milvus Distributed لاستخدام تخزين قرص NVMe، تحتاج إلى تكوين العقد العاملة لمجموعات Kubernetes المستهدفة لتخزين الحاويات والصور على قرص NVMe. يختلف الإجراء الخاص بذلك اعتمادًا على موفري السحابة.

+

AWS

عند استخدام Amazon EKS، يمكنك تخصيص العُقد المُدارة باستخدام قوالب التشغيل، حيث يمكنك تحديد إعدادات التكوين لمجموعات العقد الخاصة بك. فيما يلي مثال على كيفية تركيب قرص NVMe على العقد العاملة في مجموعة Amazon EKS الخاصة بك:

+
MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
+
+--==MYBOUNDARY==
+Content-Type: text/x-shellscript; charset="us-ascii"
+
+#!/bin/bash
+echo "Running custom user data script"
+if ( lsblk | fgrep -q nvme1n1 ); then
+    mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker
+    mkfs.xfs /dev/nvme1n1
+    mount /dev/nvme1n1 /mnt/data
+    chmod 0755 /mnt/data
+    mv /var/lib/kubelet /mnt/data/
+    mv /var/lib/docker /mnt/data/
+    ln -sf /mnt/data/kubelet /var/lib/kubelet
+    ln -sf /mnt/data/docker /var/lib/docker
+    UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')
+    echo "UUID=$UUID     /mnt/data   xfs    defaults,noatime  1   1" >> /etc/fstab
+fi
+echo 10485760 > /proc/sys/fs/aio-max-nr
+
+--==MYBOUNDARY==--
+
+
+

في المثال أعلاه، نفترض أن قرص NVMe هو /dev/nvme1n1. تحتاج إلى تعديل البرنامج النصي ليتوافق مع التكوين الخاص بك.

+
+

للحصول على التفاصيل، راجع تخصيص العقد المدارة باستخدام قوالب التشغيل.

+

GCP

لتوفير تخزين محلي SSD على مجموعات محرك Google Kubernetes Engine (GKE)، وتكوين أحمال العمل لاستهلاك البيانات من التخزين المؤقت المدعوم بـ SSD المحلي المدعوم بـ SSD والمتصل بالعقد في مجموعتك، قم بتشغيل الأمر التالي:

+
gcloud container node-pools create ${POOL_NAME} \
+    --cluster=${CLUSTER_NAME} \
+    --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \
+    --machine-type=${MACHINE_TYPE}
+
+

لمزيد من التفاصيل، راجع توفير تخزين SSD محلي على GKE.

+

أزور

لإنشاء مجموعة مقياس آلة افتراضية (VMSS) مع وحدة تخزين أقراص NVMe محلية، تحتاج إلى تمرير بيانات مخصصة إلى مثيلات الآلة الافتراضية. فيما يلي مثال على كيفية إرفاق قرص NVMe بمثيلات الآلة الافتراضية في VMSS:

+
mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1
+mdadm -Ds > /etc/mdadm/mdadm.conf 
+update-initramfs -u
+
+mkfs.xfs /dev/md0
+mkdir -p /var/lib/kubelet
+echo '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab
+mount -a
+
+
+

في المثال أعلاه، نفترض أن أقراص NVMe هي /dev/nvme0n1 و /dev/nvme1n1. تحتاج إلى تعديل البرنامج النصي لمطابقة التكوين الخاص بك.

+
+

علي بابا كلاود وتيسنت كلاود

لإنشاء تجمع عقدة يستخدم وحدات تخزين SSD محلية، نحتاج إلى تمرير بيانات مخصصة. فيما يلي مثال على البيانات المخصصة.

+
#!/bin/bash
+echo "nvme init start..."
+mkfs.xfs /dev/nvme0n1
+mkdir -p /mnt/data
+echo '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab
+mount -a
+
+mkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods
+mkdir -p  /var/lib/kubelet /var/lib/containerd /var/log/pods
+
+echo '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab
+echo '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab
+echo '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab
+mount -a
+
+echo "nvme init end..."
+
+
+

في المثال أعلاه، نفترض أن قرص NVMe هو /dev/nvme0n1. تحتاج إلى تعديل البرنامج النصي لمطابقة التكوين الخاص بك.

+
+

IDC الخاص بك

إذا كنت تقوم بتشغيل IDC الخاص بك وتريد تكوين الحاويات الخاصة بك لاستخدام نظام الملفات على قرص NVMe المثبت حديثًا بشكل افتراضي في الحاوية (Contirond)، فاتبع الخطوات التالية:

+
    +
  • قم بتركيب أقراص NVMe.

    +

    تأكد من تركيب قرص NVMe بشكل صحيح على جهازك المضيف. يمكنك تحميله إلى دليل من اختيارك. على سبيل المثال، إذا قمت بتحميله على /mnt/nvme ، فتأكد من إعداده بشكل صحيح ويمكنك رؤية القرص متاحًا على /mnt/nvme عن طريق تشغيل lsblk أو df -h.

  • +
  • تحديث تكوين الحاويةd.

    +

    قم بتعديل تكوين containerd لاستخدام التثبيت الجديد كدليل جذر لتخزين الحاوية.

    +
    sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state
    +sudo vim /etc/containerd/config.toml
    +
    +

    حدد موقع القسم [plugins."io.containerd.grpc.v1.cri".containerd] ، وقم بتعديل الإعدادات snapshotter و root على النحو التالي :

    +
    [plugins."io.containerd.grpc.v1.cri".containerd]
    +snapshotter = "overlayfs"
    +root = "/mnt/nvme/containerd"
    +state = "/mnt/nvme/containerd/state"
    +
  • +
  • أعد تشغيل الحاوية.

    +

    أعد تشغيل خدمة containerd لتطبيق التغييرات.

    +
    sudo systemctl restart containerd
    +
  • +
+

التحقق من أداء القرص

يُنصح بالتحقق من أداء القرص باستخدام Fio، وهي أداة شائعة لقياس أداء القرص. فيما يلي مثال على كيفية تشغيل Fio لاختبار أداء القرص.

+
    +
  • انشر جراب الاختبار على العقدة مع قرص NVMe.

    +
    kubectl create -f ubuntu.yaml
    +
    +

    الملف ubuntu.yaml على النحو التالي:

    +
    apiVersion: v1
    +kind: Pod
    +metadata:
    +name: ubuntu
    +spec:
    +containers:
    +- name: ubuntu
    +    image: ubuntu:latest
    +    command: ["sleep", "86400"]
    +    volumeMounts:
    +    - name: data-volume
    +        mountPath: /data
    +volumes:
    +    - name: data-volume
    +    emptyDir: {}
    +
  • +
  • قم بتشغيل Fio لاختبار أداء القرص.

    +
    # enter the container
    +kubectl exec pod/ubuntu -it bash
    +
    +# in container
    +apt-get update
    +apt-get install fio -y
    +
    +# change to the mounted dir
    +cd /data
    +
    +# write 10GB
    +fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test
    +
    +# verify the read speed
    +# compare with the disk performance indicators provided by various cloud providers.
    +fio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1  --readonly
    +
    +

    ويجب أن يبدو الإخراج هكذا:

    +
    Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]
    +iops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024
    +read: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)
    +    slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96
    +    clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13
    +    lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74
    +    clat percentiles (usec):
    +    |  1.00th=[    69],  5.00th=[    79], 10.00th=[    85], 20.00th=[    95],
    +    | 30.00th=[   106], 40.00th=[   123], 50.00th=[   149], 60.00th=[ 11469],
    +    | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],
    +    | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],
    +    | 99.99th=[767558]
    +bw (  MiB/s): min=  236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591
    +iops        : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591
    +lat (usec)   : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%
    +lat (usec)   : 1000=0.08%
    +lat (msec)   : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%
    +lat (msec)   : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%
    +lat (msec)   : 2000=0.01%
    +cpu          : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665
    +IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
    +    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
    +    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
    +    issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0
    +    latency   : target=0, window=0, percentile=100.00%, depth=64
    +
  • +
+

نشر ميلفوس الموزع

بمجرد أن تكون نتائج التحقق مرضية، يمكنك نشر Milvus Distributed بالخطوات التالية:

+

نصائح لنشر Milvus Distributed باستخدام Helm

تستخدم كبسولة QueryNode أقراص NVMe كوحدات تخزين EmptyDir بشكل افتراضي. يُنصح بتحميل أقراص NVMe على /var/lib/milvus/data داخل كبسولات QueryNode لضمان الأداء الأمثل.

+

للحصول على تفاصيل حول كيفية نشر Milvus Distributed باستخدام Helm، راجع تشغيل Milvus في Kubernetes باستخدام Helm.

+

نصائح لنشر ميلفوس الموزع باستخدام مشغل ميلفوس

يقوم مشغل Milvus تلقائيًا بتكوين جراب QueryNode تلقائيًا لاستخدام أقراص NVMe كوحدات تخزين EmptyDir. يُنصح بإضافة التكوينات التالية إلى المورد المخصص MilvusCluster:

+
...
+spec:
+  components:
+    queryNode:
+      volumeMounts:
+      - mountPath: /var/lib/milvus/data
+        name: data
+      volumes:
+      - emptyDir:
+        name: data
+
+

سيضمن ذلك أن تستخدم جراب QueryNode قرص NVMe كوحدة تخزين بيانات. للحصول على تفاصيل حول كيفية نشر ميلفوس الموزعة باستخدام مشغل ميلفوس، راجع تشغيل ميلفوس في Kubernetes باستخدام مشغل ميلفوس.

diff --git a/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.json b/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.json new file mode 100644 index 000000000..e1c1a3399 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.json @@ -0,0 +1 @@ +{"codeList":["proxy:\n accessLog:\n enable: true\n # If `filename` is emtpy, logs will be printed to stdout.\n filename: \"\"\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\" # Name of the access log file\n localPath: \"/var/logs/milvus\" # Local file path where the access log file is stored\n maxSize: 500 # Max size for each single access log file. Unit: MB\n rotatedTime: 24 # Time interval for log rotation. Unit: seconds\n maxBackups: 7 # Max number of sealed access log files that can be retained\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n maxSize: 500\n rotatedTime: 24 \n maxBackups: 7\n minioEnable: true\n remotePath: \"/milvus/logs/access_logs\"\n remoteMaxTime: 0\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n # Define custom formatters for access logs with format and applicable methods\n formatters:\n # The `base` formatter applies to all methods by default\n # The `base` formatter does not require specific method association\n base: \n # Format string; an empty string means no log output\n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]\"\n # Custom formatter for specific methods (e.g., Query, Search)\n query: \n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]\"\n # Specify the methods to which this custom formatter applies\n methods: [\"Query\", \"Search\"]\n"],"headingContent":"Configure Access Logs","anchorList":[{"label":"تكوين سجلات الوصول","href":"Configure-Access-Logs","type":1,"isActive":false},{"label":"خيارات التكوين","href":"Configuration-options","type":2,"isActive":false},{"label":"تكوين المنسق","href":"Formatter-config","type":2,"isActive":false},{"label":"مرجع: المقاييس المدعومة","href":"Reference-Supported-metrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.md b/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.md new file mode 100644 index 000000000..a96d3672c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure_access_logs.md @@ -0,0 +1,175 @@ +--- +id: configure_access_logs.md +title: تكوين سجلات الوصول +--- +

تكوين سجلات الوصول

تسمح ميزة سجلات الوصول في Milvus لمديري الخوادم بتسجيل وتحليل سلوك وصول المستخدم، مما يساعد في فهم جوانب مثل معدلات نجاح الاستعلام وأسباب الفشل.

+

يوفر هذا الدليل إرشادات مفصلة حول تكوين سجلات الوصول في ملفوس.

+

يعتمد تكوين سجلات الوصول على طريقة تثبيت ميلفوس:

+ +

خيارات التكوين

اختر من بين ثلاثة خيارات تكوين بناءً على احتياجاتك:

+
    +
  • التكوين الأساسي: للأغراض العامة.
  • +
  • التكوين لملفات سجلات الوصول المحلية: لتخزين السجلات محلياً.
  • +
  • تكوين لتحميل سجلات الوصول المحلية إلى MinIO: للتخزين السحابي والنسخ الاحتياطي.
  • +
+

التكوين الأساسي

يتضمن التكوين الأساسي تمكين سجلات الوصول وتحديد اسم ملف السجل أو استخدام stdout.

+
proxy:
+  accessLog:
+    enable: true
+    # If `filename` is emtpy, logs will be printed to stdout.
+    filename: ""
+    # Additional formatter configurations...
+
+
    +
  • proxy.accessLog.enable: ما إذا كنت تريد تمكين ميزة سجل الوصول. الإعداد الافتراضي إلى خطأ.
  • +
  • proxy.accessLog.filename: اسم ملف سجل الوصول. إذا تركت هذه المعلمة فارغة، ستتم طباعة سجلات الوصول إلى stdout.
  • +
+

تكوين ملفات سجلات الوصول المحلية

تكوين التخزين المحلي لملفات سجلات الوصول مع معلمات تتضمن مسار الملف المحلي، وحجم الملف، والفاصل الزمني للتناوب:

+
proxy:
+  accessLog:
+    enable: true
+    filename: "access_log.txt" # Name of the access log file
+    localPath: "/var/logs/milvus" # Local file path where the access log file is stored
+    maxSize: 500 # Max size for each single access log file. Unit: MB
+    rotatedTime: 24 # Time interval for log rotation. Unit: seconds
+    maxBackups: 7 # Max number of sealed access log files that can be retained
+    # Additional formatter configurations...
+
+

يتم تحديد هذه المعلمات عندما يكون filename غير فارغ.

+
    +
  • proxy.accessLog.localPath: مسار الملف المحلي حيث يتم تخزين ملف سجل الوصول.
  • +
  • proxy.accessLog.maxSize: الحجم الأقصى بالميغابايت المسموح به لملف سجل وصول واحد. إذا وصل حجم ملف السجل إلى هذا الحد، سيتم تشغيل عملية تدوير. تقوم هذه العملية بإغلاق ملف سجل الوصول الحالي وإنشاء ملف سجل جديد ومسح محتويات ملف السجل الأصلي.
  • +
  • proxy.accessLog.rotatedTime: الحد الأقصى للفاصل الزمني بالثواني المسموح به لتدوير ملف سجل وصول واحد. عند الوصول إلى الفاصل الزمني المحدد، يتم تشغيل عملية تدوير، مما يؤدي إلى إنشاء ملف سجل وصول جديد وإغلاق الملف السابق.
  • +
  • proxy.accessLog.maxBackups: الحد الأقصى لعدد ملفات سجلات الوصول المختومة التي يمكن الاحتفاظ بها. إذا تجاوز عدد ملفات سجلات الوصول المختومة هذا الحد، فسيتم حذف أقدمها.
  • +
+

تكوين لتحميل ملفات سجل الوصول المحلي إلى MinIO

قم بتمكين الإعدادات وتكوينها لتحميل ملفات سجل الوصول المحلي إلى MinIO:

+
proxy:
+  accessLog:
+    enable: true
+    filename: "access_log.txt"
+    localPath: "/var/logs/milvus"
+    maxSize: 500
+    rotatedTime: 24 
+    maxBackups: 7
+    minioEnable: true
+    remotePath: "/milvus/logs/access_logs"
+    remoteMaxTime: 0
+    # Additional formatter configurations...
+
+

عند تكوين معلمات MinIO، تأكد من تعيين إما maxSize أو rotatedTime. قد يؤدي عدم القيام بذلك إلى عدم نجاح تحميل ملفات سجلات الوصول المحلية إلى MinIO.

+
    +
  • proxy.accessLog.minioEnable: ما إذا كان سيتم تحميل ملفات سجلات الوصول المحلية إلى MinIO. الإعداد الافتراضي إلى خطأ.
  • +
  • proxy.accessLog.remotePath: مسار تخزين الكائن لتحميل ملفات سجلات الوصول.
  • +
  • proxy.accessLog.remoteMaxTime: الفاصل الزمني المسموح به لتحميل ملفات سجل الوصول. إذا تجاوز وقت تحميل ملف السجل هذا الفاصل الزمني، فسيتم حذف الملف. يؤدي تعيين القيمة إلى 0 إلى تعطيل هذه الميزة.
  • +
+

تكوين المنسق

تنسيق السجل الافتراضي المستخدم لجميع الأساليب هو التنسيق base ، والذي لا يتطلب اقترانات محددة للأسلوب. ومع ذلك، إذا كنت ترغب في تخصيص إخراج السجل لطرق محددة، يمكنك تحديد تنسيق سجل مخصص وتطبيقه على الطرق المرتبطة.

+
proxy:
+  accessLog:
+    enable: true
+    filename: "access_log.txt"
+    localPath: "/var/logs/milvus"
+    # Define custom formatters for access logs with format and applicable methods
+    formatters:
+      # The `base` formatter applies to all methods by default
+      # The `base` formatter does not require specific method association
+      base: 
+        # Format string; an empty string means no log output
+        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]"
+      # Custom formatter for specific methods (e.g., Query, Search)
+      query: 
+        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]"
+        # Specify the methods to which this custom formatter applies
+        methods: ["Query", "Search"]
+
+
    +
  • proxy.accessLog.<formatter_name>.format: يحدد تنسيق السجل بمقاييس ديناميكية. لمزيد من المعلومات، راجع المقاييس المدعومة.
  • +
  • proxy.accessLog.<formatter_name>.methods: يسرد عمليات Milvus باستخدام هذا التنسيق. للحصول على أسماء الأساليب، راجع MilvusService في أساليب Milvus.
  • +
+

مرجع: المقاييس المدعومة

+ + + + + + + + + + + + + + + + + + + + + + +
اسم المقياسالوصف
$method_nameاسم الأسلوب
$method_statusحالة الوصول موافق أو فشل
$method_exprالتعبير المستخدم في عمليات الاستعلام أو البحث أو الحذف
$trace_idمعرّف التتبع المرتبط بالوصول
$user_addrعنوان IP الخاص بالمستخدم
$user_nameاسم المستخدم
$response_sizeحجم بيانات الاستجابة
$error_codeرمز الخطأ الخاص بميلفوس
$error_msgرسالة الخطأ التفصيلية
$database_nameاسم قاعدة بيانات ملفوس المستهدفة
$collection_nameاسم مجموعة ملفوس المستهدفة
$partition_nameاسم أو أسماء قسم (أقسام) ملفوس المستهدفة
$time_costالوقت المستغرق لإكمال الوصول
$time_nowالوقت الذي تتم فيه طباعة سجل الوصول (عادةً ما يعادل $time_end)
$time_startالوقت الذي يبدأ فيه الوصول
$time_endالوقت الذي ينتهي فيه الوصول
$sdk_versionإصدار مجموعة أدوات تطوير البرمجيات Milvus SDK التي يستخدمها المستخدم
diff --git a/localization/v2.5.x/site/ar/adminGuide/configure_operator.json b/localization/v2.5.x/site/ar/adminGuide/configure_operator.json new file mode 100644 index 000000000..d1ee7221b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n nodeSelector: {}\n tolerations: {}\n env: {}\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n","kubectl apply -f milvuscluster_resource.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n rootCoord: \n replicas: 1\n port: 8080\n resources:\n limits:\n cpu: '6'\n memory: '10Gi'\n dataCoord: {}\n queryCoord: {}\n indexCoord: {}\n dataNode: {}\n indexNode: {}\n queryNode: {}\n proxy:\n replicas: 1\n serviceType: ClusterIP\n resources:\n limits:\n cpu: '2'\n memory: 4Gi\n requests:\n cpu: 100m\n memory: 128Mi\n config: {}\n dependencies: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Milvus with Milvus Operator","anchorList":[{"label":"تكوين Milvus باستخدام مشغل Milvus","href":"Configure-Milvus-with-Milvus-Operator","type":1,"isActive":false},{"label":"تكوين الموارد العامة","href":"Configure-global-resources","type":2,"isActive":false},{"label":"تكوين الموارد الخاصة","href":"Configure-private-resources","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/configure_operator.md b/localization/v2.5.x/site/ar/adminGuide/configure_operator.md new file mode 100644 index 000000000..7bd110662 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/configure_operator.md @@ -0,0 +1,336 @@ +--- +id: configure_operator.md +label: Milvus Operator +related_key: Milvus Operator +summary: تعرف على كيفية تكوين Milvus باستخدام مشغل Milvus. +title: تكوين Milvus باستخدام مشغل Milvus +--- +

تكوين Milvus باستخدام مشغل Milvus

في بيئة الإنتاج، تحتاج إلى تخصيص الموارد لمجموعة Milvus العنقودية استناداً إلى نوع الجهاز وعبء العمل. يمكنك التهيئة أثناء النشر أو تحديث التكوينات أثناء تشغيل المجموعة.

+

يقدم هذا الموضوع كيفية تكوين مجموعة Milvus العنقودية عند تثبيتها باستخدام مشغل Milvus.

+

يفترض هذا الموضوع أنك قمت بنشر مشغل Milvus. راجع نشر مشغل Milvus لمزيد من المعلومات.

+

يتضمن تكوين مجموعة Milvus مع مشغل Milvus ما يلي:

+
    +
  • تكوينات الموارد العامة
  • +
  • تكوينات الموارد الخاصة
  • +
+
+ستحل تكوينات الموارد الخاصة محل تكوينات الموارد العامة. إذا قمت بتهيئة الموارد بشكل عام وتحديد المورد الخاص لمكون معين في نفس الوقت، فسيقوم المكون بإعطاء الأولوية للتكوينات الخاصة والاستجابة لها أولاً.
+

تكوين الموارد العامة

عند استخدام مشغّل Milvus لبدء تشغيل مجموعة Milvus، تحتاج إلى تحديد ملف تكوين. يستخدم المثال هنا ملف التكوين الافتراضي.

+
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
+
+

تفاصيل ملف التكوين كما يلي:

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  mode: cluster
+  dependencies: {}
+  components: {}
+  config: {}
+
+

يتضمن الحقل spec.components كلاً من تكوين الموارد العامة والخاصة لجميع مكونات Milvus. فيما يلي أربعة حقول شائعة الاستخدام لتكوين المورد العام.

+
    +
  • image: صورة Milvus docker المستخدمة.
  • +
  • resources: موارد الحوسبة المخصصة لكل مكون.
  • +
  • tolerations و nodeSelector: قواعد الجدولة لكل مكون Milvus في مجموعة K8s. انظر التحمل و nodeSelector لمزيد من المعلومات.
  • +
  • env: متغيرات البيئة.
  • +
+

إذا كنت تريد تكوين المزيد من الحقول، راجع الوثائق هنا.

+

لتكوين مورد عام لمجموعة ميلفوس، قم بإنشاء ملف milvuscluster_resource.yaml.

+

مثال

يقوم المثال التالي بتهيئة المورد العام لمجموعة ميلفوس العنقودية.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  mode: cluster
+  components:
+    nodeSelector: {}
+    tolerations: {}
+    env: {}
+    resources:
+      limits:
+        cpu: '4'
+        memory: 8Gi
+      requests:
+        cpu: 200m
+        memory: 512Mi
+
+

قم بتشغيل الأمر التالي لتطبيق التكوينات الجديدة:

+
kubectl apply -f milvuscluster_resource.yaml
+
+
+سيتم تحديث موارد المجموعة وفقًا لملف التكوين إذا كان هناك مجموعة Milvus باسم my-release في مجموعة K8s. خلاف ذلك، سيتم إنشاء مجموعة Milvus جديدة.
+

تكوين الموارد الخاصة

في الأصل في Milvus 2.0، تتضمن مجموعة Milvus العنقودية في الأصل سبعة مكونات: الوكيل، وتنسيق الجذر، وتنسيق البيانات، وتنسيق البيانات، وتنسيق الاستعلام، وعقدة الفهرس، وعقدة البيانات، وعقدة الاستعلام. ومع ذلك، تم إصدار مكون جديد، وهو تنسيق المزيج، مع Milvus 2.1.0. يتضمن تنسيق المزيج جميع مكونات المنسق. ولذلك، يعني بدء تشغيل تنسيق المزيج أنك لست بحاجة إلى تثبيت وبدء تشغيل منسقين آخرين بما في ذلك منسق الجذر، ومنسق البيانات، ومنسق الاستعلام.

+

تتضمن الحقول الشائعة المستخدمة لتكوين كل مكون ما يلي:

+
    +
  • replica: عدد النسخ المتماثلة لكل مكون.
  • +
  • port: رقم منفذ الاستماع لكل مكون.
  • +
  • الحقول الأربعة شائعة الاستخدام في تكوين الموارد العامة: image ، env ، nodeSelector ، ، tolerations ، resources (انظر أعلاه). لمزيد من الحقول القابلة للتكوين، انقر على كل مكون في هذه الوثائق.
  • +
+
+بالإضافة إلى ذلك، عند تكوين الوكيل، هناك حقل إضافي يسمى "نوع الخدمة". يحدد هذا الحقل نوع الخدمة التي يوفرها ميلفوس في مجموعة K8s.
+

لتكوين موارد لمكون معين، أضف اسم المكون في الحقل تحت spec.componets أولاً ثم قم بتكوين موارده الخاصة.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
الغرضالمعلمات
ضبط الأداء + +
البيانات والتعريف + +
الإدارة + +
الحصة والحدود + +
+
+

مثال

يقوم المثال أدناه بتكوين النسخ المتماثلة وموارد الحوسبة للنسخة المتماثلة وموارد الحوسبة للوكيل وعقدة البيانات في الملف milvuscluster.yaml.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  mode: cluster
+  components:
+    resources:
+      limits:
+        cpu: '4'
+        memory: 8Gi
+      requests:
+        cpu: 200m
+        memory: 512Mi
+    rootCoord: 
+      replicas: 1
+      port: 8080
+      resources:
+        limits:
+          cpu: '6'
+          memory: '10Gi'
+    dataCoord: {}
+    queryCoord: {}
+    indexCoord: {}
+    dataNode: {}
+    indexNode: {}
+    queryNode: {}
+    proxy:
+      replicas: 1
+      serviceType: ClusterIP
+      resources:
+        limits:
+          cpu: '2'
+          memory: 4Gi
+        requests:
+          cpu: 100m
+          memory: 128Mi
+  config: {}
+  dependencies: {}
+
+
+لا يقوم هذا المثال بتكوين ليس فقط الموارد العامة ولكن أيضًا موارد الحوسبة الخاصة للنسخة المتماثلة الجذرية والوكيل. عند استخدام ملف التكوين هذا لبدء تشغيل مجموعة Milvus، سيتم تطبيق تكوينات الموارد الخاصة على التنسيق الجذر والوكيل، بينما ستتبع بقية المكونات تكوين الموارد العامة.
+

قم بتشغيل الأمر التالي لتطبيق التكوينات الجديدة:

+
kubectl apply -f milvuscluster.yaml
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.json b/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.json new file mode 100644 index 000000000..4ac6f5b64 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.json @@ -0,0 +1 @@ +{"codeList":["version: '3'\nservices:\n zookeeper:\n image: wurstmeister/zookeeper:latest\n container_name: zookeeper\n ports:\n - 2181:2181\n restart: always\n\n kafka:\n image: wurstmeister/kafka:latest\n container_name: kafka\n ports:\n - 9092:9092\n environment:\n - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\n - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092\n - KAFKA_LISTENERS=PLAINTEXT://:9092\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n restart: always\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9092\"\n saslUsername:\n saslPassword:\n saslMechanisms:\n securityProtocol:\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: \n tlsKey:\n tlsCACert:\n tlsKeyPassword:\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n ports:\n - 2181:2181\n\n kafka:\n image: confluentinc/cp-kafka:latest\n container_name: kafka\n depends_on:\n - zookeeper\n ports:\n - 9092:9092\n - 9093:9093\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","KafkaServer {\n org.apache.kafka.common.security.plain.PlainLoginModule required\n username=\"kafka\"\n password=\"pass123\"\n user_kafka=\"pass123\";\n};\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_PLAINTEXT\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: # path to client's public key\n tlsKey: # path to client's private key\n tlsCACert: # file or directory path to CA certificate\n tlsKeyPassword: # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","#!/bin/bash\n#\n#\n# This scripts generates:\n# - root CA certificate\n# - server certificate and keystore\n# - client keys\n#\n# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka\n#\n\n\nif [[ \"$1\" == \"-k\" ]]; then\n USE_KEYTOOL=1\n shift\nelse\n USE_KEYTOOL=0\nfi\n\nOP=\"$1\"\nCA_CERT=\"$2\"\nPFX=\"$3\"\nHOST=\"$4\"\n\nC=NN\nST=NN\nL=NN\nO=NN\nOU=NN\nCN=\"kafka-ssl\"\n \n\n# Password\nPASS=\"abcdefgh\"\n\n# Cert validity, in days\nVALIDITY=365\n\nset -e\n\nexport LC_ALL=C\n\nif [[ $OP == \"ca\" && ! -z \"$CA_CERT\" && ! -z \"$3\" ]]; then\n CN=\"$3\"\n openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin \"pass:$PASS\" -passout \"pass:$PASS\" < \"\n echo \" $0 [-k] server|client \"\n echo \"\"\n echo \" -k = Use keytool/Java Keystore, else standard SSL keys\"\n exit 1\nfi\n","$ ./gen-ssl-certs.sh ca ca-cert kafka-ssl\n","$ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl\n","$ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client\n","$ ls -l my_secrets\ntotal 12\n-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert\n-rw------- 1 1.9K Feb 26 11:53 ca-cert.key\n-rw-rw-r-- 1 41 Feb 26 11:54 ca-cert.srl\n-rw-rw-r-- 1 9 Feb 26 12:08 cert_creds\n-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed\n-rw------- 1 1.8K Feb 26 11:54 kafka_client.key\n-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem\n-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req\n-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: \n saslPassword: \n saslMechanisms: \n securityProtocol: SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SASL_SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n"],"headingContent":"Connecting to Kafka with SASL/SSL","anchorList":[{"label":"الاتصال بكافكا باستخدام SASL/SSL","href":"Connecting-to-Kafka-with-SASLSSL","type":1,"isActive":false},{"label":"وصل ميلفوس بكافكا بدون SASL/SSL","href":"Connect-Milvus-to-Kafka-Without-SASLSSL","type":2,"isActive":false},{"label":"قم بتوصيل ميلفوس بكافكا باستخدام SASL/PLAIN وحده","href":"Connect-Milus-to-Kafka-with-SASLPLAIN-Alone","type":2,"isActive":false},{"label":"ربط ميلفوس بكافكا باستخدام SSL وحده","href":"Connect-Milvus-to-Kafka-with-SSL-Alone","type":2,"isActive":false},{"label":"ربط ميلفوس بكافكا باستخدام SASL/PLAIN و SSL","href":"Connect-Milvus-to-Kafka-with-SASLPLAIN-and-SSL","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.md b/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.md new file mode 100644 index 000000000..b3f336135 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/connect_kafka_ssl.md @@ -0,0 +1,619 @@ +--- +id: connect_kafka_ssl.md +title: الاتصال بكافكا باستخدام SASL/SSL +related_key: 'kafka, sasl, tls' +summary: >- + يسرد هذا الدليل عدة طرق لتوصيل ميلفوس بكافكا، من أبسطها بدون SASL/SSL إلى + الطريقة المؤمنة بالكامل مع SASL/SSL. +--- +

الاتصال بكافكا باستخدام SASL/SSL

يسرد هذا الدليل عدة طرق لتوصيل ميلفوس بكافكا، من أبسط الطرق بدون SASL/SSL إلى الطريقة المؤمنة بالكامل باستخدام SASL/SSL.

+

وصل ميلفوس بكافكا بدون SASL/SSL

لبدء تشغيل ميلفوس وكافكا بدون SASL/SSL، يمكنك تعطيل المصادقة والتشفير لكل من كافكا وميلفوس. استخدمها فقط في بيئة موثوقة.

+

1. ابدأ خدمة كافكا بدون SASL/SSL

يمكنك استخدام ملف docker-compose.yaml التالي لبدء خدمة كافكا بدون SASL/SSL:

+
version: '3'
+services:
+  zookeeper:
+    image: wurstmeister/zookeeper:latest
+    container_name: zookeeper
+    ports:
+      - 2181:2181
+    restart: always
+
+  kafka:
+    image: wurstmeister/kafka:latest
+    container_name: kafka
+    ports:
+      - 9092:9092
+    environment:
+      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
+      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
+      - KAFKA_LISTENERS=PLAINTEXT://:9092
+    volumes:
+      - /var/run/docker.sock:/var/run/docker.sock
+    restart: always
+
+

ثم يمكنك بدء خدمة كافكا باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

2. بدء تشغيل ميلفوس والاتصال بكافكا

بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml لبدء تشغيل ميلفوس والاتصال بكافكا بدون SASL/SSL:

+
version: '3.5'
+
+services:
+  etcd:
+    ......
+    
+  minio:
+    ......
+      
+  standalone:
+    container_name: milvus-standalone
+    ......
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
+
+

استخدم الأمر التالي لتنزيل قالب ملف تهيئة ميلفوس:

+
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
+
+

وقم بتعيين المعلمات التالية:

+
mq:
+  type: kafka
+
+kafka:
+  brokerList: "127.0.0.1:9092"
+  saslUsername:
+  saslPassword:
+  saslMechanisms:
+  securityProtocol:
+  readTimeout: 10 # read message timeout in seconds
+  ssl:
+    enabled: false # Whether to support kafka secure connection mode
+    tlsCert: 
+    tlsKey:
+    tlsCACert:
+    tlsKeyPassword:
+
+

ثم يمكنك بدء تشغيل ميلفوس باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

قم بتوصيل ميلفوس بكافكا باستخدام SASL/PLAIN وحده

لبدء تشغيل كافكا بمصادقة SASL/PLAIN، تحتاج إلى إضافة ملف kafka_server_jass.conf بالإعدادات المناسبة.

+

1. ابدأ خدمة كافكا باستخدام SASL/PLAIN

ضع الملف التالي docker-compose.yaml والملف kafka_server_jaas.conf في نفس الدليل.

+
version: '3'
+services:
+  zookeeper:
+    image: confluentinc/cp-zookeeper:latest
+    container_name: zookeeper
+    environment:
+      ZOOKEEPER_CLIENT_PORT: 2181
+      ZOOKEEPER_TICK_TIME: 2000
+    ports:
+      - 2181:2181
+
+  kafka:
+    image: confluentinc/cp-kafka:latest
+    container_name: kafka
+    depends_on:
+      - zookeeper
+    ports:
+      - 9092:9092
+      - 9093:9093
+    environment:
+      KAFKA_BROKER_ID: 1
+      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
+      ZOOKEEPER_SASL_ENABLED: "false"
+      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093
+      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT
+      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
+      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
+      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
+      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
+      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
+      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
+      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
+
+

في الملف kafka_server_jass.conf ، قم بتعيين المعلمات التالية:

+
KafkaServer {
+    org.apache.kafka.common.security.plain.PlainLoginModule required
+    username="kafka"
+    password="pass123"
+    user_kafka="pass123";
+};
+
+

ثم يمكنك بدء تشغيل خدمة كافكا باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

2. بدء تشغيل ميلفوس والاتصال بكافكا

بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml لبدء تشغيل ميلفوس والاتصال بكافكا باستخدام SASL/PLAIN:

+
version: '3.5'
+
+services:
+  etcd:
+    ......
+    
+  minio:
+    ......
+      
+  standalone:
+    container_name: milvus-standalone
+    ......
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
+
+

استخدم الأمر التالي لتنزيل قالب ملف تهيئة ميلفوس:

+
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
+
+

وقم بتعيين المعلمات التالية:

+
mq:
+  type: kafka
+
+kafka:
+  brokerList: "127.0.0.1:9093"
+  saslUsername: kafka
+  saslPassword: pass123
+  saslMechanisms: PLAIN
+  securityProtocol: SASL_PLAINTEXT
+  readTimeout: 10 # read message timeout in seconds
+  ssl:
+    enabled: false # Whether to support kafka secure connection mode
+    tlsCert: # path to client's public key
+    tlsKey: # path to client's private key
+    tlsCACert: # file or directory path to CA certificate
+    tlsKeyPassword: # private key passphrase for use with private key, if any
+
+

ثم يمكنك بدء تشغيل ميلفوس باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

ربط ميلفوس بكافكا باستخدام SSL وحده

لبدء تشغيل كافكا بمصادقة SSL، تحتاج إلى الحصول على بعض ملفات الشهادات أو إنشاء شهادات موقعة ذاتيًا. في هذا المثال، نستخدم الشهادات الموقعة ذاتيًا.

+

1. إنشاء شهادات موقعة ذاتيًا

أنشئ مجلدًا باسم my_secrets ، وأضف برنامج نصي باش باسم gen-ssl-certs.sh فيه، والصق المحتوى التالي فيه:

+
#!/bin/bash
+#
+#
+# This scripts generates:
+#  - root CA certificate
+#  - server certificate and keystore
+#  - client keys
+#
+# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka
+#
+
+
+if [[ "$1" == "-k" ]]; then
+    USE_KEYTOOL=1
+    shift
+else
+    USE_KEYTOOL=0
+fi
+
+OP="$1"
+CA_CERT="$2"
+PFX="$3"
+HOST="$4"
+
+C=NN
+ST=NN
+L=NN
+O=NN
+OU=NN
+CN="kafka-ssl"
+ 
+
+# Password
+PASS="abcdefgh"
+
+# Cert validity, in days
+VALIDITY=365
+
+set -e
+
+export LC_ALL=C
+
+if [[ $OP == "ca" && ! -z "$CA_CERT" && ! -z "$3" ]]; then
+    CN="$3"
+    openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin "pass:$PASS" -passout "pass:$PASS" <<EOF
+${C}
+${ST}
+${L}
+${O}
+${OU}
+${CN}
+$USER@${CN}
+.
+.
+EOF
+
+
+
+elif [[ $OP == "server" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
+
+    #Step 1
+    echo "############ Generating key"
+    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
+$CN
+$OU
+$O
+$L
+$ST
+$C
+yes
+yes
+EOF
+        
+    #Step 2
+    echo "############ Adding CA"
+    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
+yes
+EOF
+    
+    #Step 3
+    echo "############ Export certificate"
+    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
+
+    echo "############ Sign certificate"
+    openssl x509 -req -CA $CA_CERT -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin "pass:$PASS"
+    
+    
+    echo "############ Import CA"
+    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias CARoot -import -file $CA_CERT <<EOF
+yes
+EOF
+    
+    echo "############ Import signed CA"
+    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -import -file ${PFX}cert-signed    
+
+    
+elif [[ $OP == "client" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
+
+    if [[ $USE_KEYTOOL == 1 ]]; then
+        echo "############ Creating client truststore"
+
+        [[ -f ${PFX}client.truststore.jks ]] || keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
+yes
+EOF
+
+        echo "############ Generating key"
+        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
+$CN
+$OU
+$O
+$L
+$ST
+$C
+yes
+yes
+EOF
+        echo "########### Export certificate"
+        keytool -storepass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
+
+        echo "########### Sign certificate"
+        openssl x509 -req -CA ${CA_CERT} -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASS        
+
+        echo "########### Import CA"
+        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias CARoot -import -file ${CA_CERT} <<EOF
+yes
+EOF
+
+        echo "########### Import signed CA"
+        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -import -file ${PFX}cert-signed
+
+    else
+        # Standard OpenSSL keys
+        echo "############ Generating key"
+        openssl genrsa -des3 -passout "pass:$PASS" -out ${PFX}client.key 2048 
+        
+        echo "############ Generating request"
+        openssl req -passin "pass:$PASS" -passout "pass:$PASS" -key ${PFX}client.key -new -out ${PFX}client.req \
+                <<EOF
+$C
+$ST
+$L
+$O
+$OU
+$CN
+.
+$PASS
+.
+EOF
+
+        echo "########### Signing key"
+        openssl x509 -req -passin "pass:$PASS" -in ${PFX}client.req -CA $CA_CERT -CAkey ${CA_CERT}.key -CAcreateserial -out ${PFX}client.pem -days $VALIDITY
+
+    fi
+
+    
+    
+
+else
+    echo "Usage: $0 ca <ca-cert-file> <CN>"
+    echo "       $0 [-k] server|client <ca-cert-file> <file_prefix> <hostname>"
+    echo ""
+    echo "       -k = Use keytool/Java Keystore, else standard SSL keys"
+    exit 1
+fi
+
+

في البرنامج النصي أعلاه، يتم تطبيق كلمة المرور الافتراضية abcdefgh. لتغيير كلمة المرور، قم بإنشاء ملف نصي باسم cert_creds وأدخل كلمة المرور في السطر الأول.

+

ثم قم بتشغيل الأمر التالي لإنشاء الشهادات:

+
    +
  • إنشاء شهادة CA:

    +

    يفترض ما يلي أن ملف شهادة المرجع المصدق (CA) يحمل الاسم ca-cert واسم المضيف للوسيط هو kafka-ssl:

    +
    $ ./gen-ssl-certs.sh ca ca-cert kafka-ssl
    +
  • +
  • إنشاء شهادة الخادم ومخزن المفاتيح:

    +

    يفترض ما يلي أن ملف شهادة CA هو المسمى ca-cert ، وأن البادئة لجميع ملفات الإخراج هي kafka_ ، وأن اسم المضيف للوسيط هو kafka-ssl:

    +
    $ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl
    +
  • +
  • إنشاء مفاتيح العميل:

    +

    يفترض ما يلي أن ملف شهادة CA هو المسمى ca-cert ، والبادئة لجميع ملفات الإخراج هي kafka_ ، واسم العميل هو kafka-client:

    +
    $ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client
    +
  • +
+

بمجرد إنشاء جميع الشهادات اللازمة، يمكنك رؤية الملفات التالية في المجلد my_secrets:

+
$ ls -l my_secrets
+total 12
+-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert
+-rw------- 1 1.9K Feb 26 11:53 ca-cert.key
+-rw-rw-r-- 1   41 Feb 26 11:54 ca-cert.srl
+-rw-rw-r-- 1    9 Feb 26 12:08 cert_creds
+-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh
+-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file
+-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed
+-rw------- 1 1.8K Feb 26 11:54 kafka_client.key
+-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem
+-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req
+-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks
+-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks
+
+

2. بدء خدمة كافكا مع SSL

استخدم الملف التالي docker-compose.yaml لبدء خدمة كافكا باستخدام SSL:

+
version: '3'
+services:
+  zookeeper:
+    image: confluentinc/cp-zookeeper:latest
+    container_name: zookeeper
+    hostname: zookeeper
+    ports:
+      - 2181:2181
+    environment:
+      ZOOKEEPER_SERVER_ID: 1
+      ZOOKEEPER_CLIENT_PORT: 2181
+
+  kafka-ssl:
+    image: confluentinc/cp-kafka:latest
+    container_name: kafka-ssl
+    hostname: kafka-ssl
+    ports:
+      - 9093:9093
+    depends_on:
+      - zookeeper
+    environment:
+      KAFKA_BROKER_ID: 1
+      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
+      ZOOKEEPER_SASL_ENABLED: "false"
+      KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093
+      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
+      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
+      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
+      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
+      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
+      KAFKA_SSL_CLIENT_AUTH: 'required'
+      KAFKA_SECURITY_PROTOCOL: SSL
+      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL
+      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
+
+

ثم ابدأ تشغيل خدمة كافكا باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

3. بدء تشغيل ميلفوس والاتصال بكافكا باستخدام SSL

بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml لبدء تشغيل ميلفوس والاتصال بكافكا باستخدام SSL:

+
version: '3.5'
+
+services:
+  etcd:
+    ......
+    
+  minio:
+    ......
+      
+  standalone:
+    container_name: milvus-standalone
+    ......
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
+
+

استخدم الأمر التالي لتنزيل قالب ملف تكوين ملف Milvus:

+
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
+
+

وقم بتعيين المعلمات التالية:

+
mq:
+  type: kafka
+
+kafka:
+  brokerList: "127.0.0.1:9093"
+  saslUsername: 
+  saslPassword: 
+  saslMechanisms: 
+  securityProtocol: SSL
+  readTimeout: 10 # read message timeout in seconds
+  ssl:
+    enabled: true # Whether to support kafka secure connection mode
+    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
+    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
+    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
+    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
+
+

ثم ابدأ تشغيل ميلفوس باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

ربط ميلفوس بكافكا باستخدام SASL/PLAIN و SSL

لتوصيل ميلفوس بكافكا باستخدام SASL/PLAIN و SSL، تحتاج إلى تكرار الخطوات في توصيل ميلفوس بكافكا باستخدام SASL/PLAIN وحده وتوصيل ميلفوس بكافكا باستخدام SSL وحده.

+

1. ابدأ خدمة كافكا باستخدام SASL/PLAIN و SSL

استخدم الملف kafka_server_jass.conf المذكور في Connect Milus إلى كافكا مع SASL/PLAIN Alone والمجلد my_secrets الذي تم إنشاؤه في Connect Milus إلى كافكا مع SSL Alone لبدء خدمة كافكا مع SASL/PLAIN و SSL.

+

يمكن استخدام الملف التالي docker-compose.yaml لبدء خدمة كافكا مع SASL/PLAIN و SSL:

+
version: '3'
+services:
+  zookeeper:
+    image: confluentinc/cp-zookeeper:latest
+    container_name: zookeeper
+    hostname: zookeeper
+    ports:
+      - 2181:2181
+    environment:
+      ZOOKEEPER_SERVER_ID: 1
+      ZOOKEEPER_CLIENT_PORT: 2181
+      ZOOKEEPER_TICK_TIME: 2000
+
+
+  kafka-ssl:
+    image: confluentinc/cp-kafka:latest
+    container_name: kafka-ssl
+    hostname: kafka-ssl
+    ports:
+      - 9093:9093
+    depends_on:
+      - zookeeper
+    environment:
+      KAFKA_BROKER_ID: 1
+      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
+      ZOOKEEPER_SASL_ENABLED: "false"
+      KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093
+      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
+      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
+      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
+      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
+      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
+      KAFKA_SSL_CLIENT_AUTH: 'required'
+      KAFKA_SECURITY_PROTOCOL: SASL_SSL
+      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
+
+      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL
+      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL
+      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
+      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
+      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
+      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
+      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
+      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
+
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
+
+

ثم ابدأ تشغيل خدمة كافكا باستخدام الأمر التالي:

+
$ docker compose up -d
+
+

2. بدء تشغيل ميلفوس والاتصال بخدمة كافكا باستخدام SASL/PLAIN و SSL

بمجرد بدء تشغيل خدمة كافكا، يمكنك بدء تشغيل ميلفوس والاتصال بها. استخدم الملف التالي docker-compose.yaml لبدء تشغيل Milvus والاتصال بكافكا باستخدام SASL/PLAIN و SSL:

+
version: '3.5'
+
+services:
+  etcd:
+    ......
+    
+  minio:
+    ......
+    
+  standalone:
+    container_name: milvus-standalone
+    ......
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
+
+

استخدم الأمر التالي لتنزيل قالب ملف تكوين ملف Milvus:

+
$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
+
+

وقم بتعيين المعلمات التالية:

+
mq:
+  type: kafka
+
+kafka:
+  brokerList: "127.0.0.1:9093"
+  saslUsername: kafka
+  saslPassword: pass123
+  saslMechanisms: PLAIN
+  securityProtocol: SASL_SSL
+  readTimeout: 10 # read message timeout in seconds
+  ssl:
+    enabled: true # Whether to support kafka secure connection mode
+    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
+    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
+    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
+    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.json b/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.json new file mode 100644 index 000000000..43da3dd3a --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.json @@ -0,0 +1 @@ +{"codeList":["etcd:\n endpoints:\n - localhost:2379\n rootPath: by-dev # The root path where data are stored in etcd\n metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath\n kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath\n log:\n # path is one of:\n # - \"default\" as os.Stderr,\n # - \"stderr\" as os.Stderr,\n # - \"stdout\" as os.Stdout,\n # - file path to append server logs to.\n # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log\n path: stdout\n level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.\n use:\n # please adjust in embedded Milvus: true\n embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).\n data:\n # Embedded Etcd only.\n # please adjust in embedded Milvus: /tmp/milvus/etcdData/\n dir: default.etcd\n","docker compose up\n","etcd:\n enabled: false\n","externalEtcd:\n enabled: true\n ## the endpoints of the external etcd\n endpoints:\n - :2379\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={:2379}\n"],"headingContent":"Configure Meta Storage with Docker Compose or Helm","anchorList":[{"label":"تكوين التخزين التعريفي باستخدام Docker Compose أو Helm","href":"Configure-Meta-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"تكوين إلخ د مع Docker Compose","href":"Configure-etcd-with-Docker-Compose","type":2,"isActive":false},{"label":"تكوين إلخd على K8s","href":"Configure-etcd-on-K8s","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.md b/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.md new file mode 100644 index 000000000..bbe9df7b8 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_etcd.md @@ -0,0 +1,136 @@ +--- +id: deploy_etcd.md +title: تكوين التخزين التعريفي باستخدام Docker Compose أو Helm +related_key: 'S3, storage' +summary: تعرف على كيفية تكوين التخزين التعريفي لـ Milvus باستخدام Docker Compose/Helm. +--- +

تكوين التخزين التعريفي باستخدام Docker Compose أو Helm

يستخدم ميلفوس إلخd لتخزين البيانات الوصفية. يقدم هذا الموضوع كيفية تكوين إلخd مع Docker Compose أو Helm.

+

تكوين إلخ د مع Docker Compose

1. تكوين إلخd

لتكوين etcd مع Docker Compose، قم بتوفير القيم الخاصة بك لقسم etcd في الملف milvus.yaml في مسار milvus/configs.

+
etcd:
+  endpoints:
+    - localhost:2379
+  rootPath: by-dev # The root path where data are stored in etcd
+  metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
+  kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
+  log:
+    # path is one of:
+    #  - "default" as os.Stderr,
+    #  - "stderr" as os.Stderr,
+    #  - "stdout" as os.Stdout,
+    #  - file path to append server logs to.
+    # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
+    path: stdout
+    level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
+  use:
+    # please adjust in embedded Milvus: true
+    embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).
+  data:
+    # Embedded Etcd only.
+    # please adjust in embedded Milvus: /tmp/milvus/etcdData/
+    dir: default.etcd
+
+

انظر التكوينات المتعلقة بـ etcd لمزيد من المعلومات.

+

2. تشغيل ميلفوس

قم بتشغيل الأمر التالي لبدء تشغيل Milvus الذي يستخدم تكوينات إلخd.

+
docker compose up
+
+
تسري التكوينات فقط بعد بدء تشغيل ميلفوس. انظر بدء تشغيل Milvus لمزيد من المعلومات.
+

تكوين إلخd على K8s

بالنسبة لمجموعات ميلفوس على K8s، يمكنك تكوين إلخd في نفس الأمر الذي يبدأ تشغيل ميلفوس. أو بدلاً من ذلك، يمكنك تكوين إلخd باستخدام الملف values.yml على المسار /charts/milvus في مستودع milvus-helm قبل بدء تشغيل Milvus.

+

يسرد الجدول التالي مفاتيح تكوين إلخd في ملف YAML.

+ + + + + + + + + +
المفتاحالوصفالقيمة
etcd.enabledتمكين أو تعطيل إلخd.true/false
externalEtcd.enabledتمكين أو تعطيل إلخd الخارجي أو تعطيله.true/false
externalEtcd.endpointsنقطة النهاية للوصول إلى إلخd.
+

استخدام ملف YAML

    +
  1. تكوين القسم etcd باستخدام قيمك في الملف values.yaml.
  2. +
+
etcd:
+  enabled: false
+
+
    +
  1. تكوين قسم externaletcd باستخدام قيمك في الملف values.yaml.
  2. +
+
externalEtcd:
+  enabled: true
+  ## the endpoints of the external etcd
+  endpoints:
+    - <your_etcd_IP>:2379
+
+
    +
  1. بعد تهيئة الأقسام السابقة وحفظ الملف values.yaml ، قم بتشغيل الأمر التالي لتثبيت ملف ميلفوس الذي يستخدم تكوينات إلخd.
  2. +
+
helm install <your_release_name> milvus/milvus -f values.yaml
+
+

استخدام الأمر

لتثبيت ملف Milvus وتكوين etcd، قم بتشغيل الأمر التالي باستخدام قيمك.

+
helm install <your_release_name> milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={<your_etcd_IP>:2379}
+
+

ما التالي

تعلم كيفية تكوين تبعيات Milvus الأخرى باستخدام Docker Compose أو Helm:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.json b/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.json new file mode 100644 index 000000000..11e5f622e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.json @@ -0,0 +1 @@ +{"codeList":["pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of pulsar\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n","docker compose up\n","extraConfigFiles:\n user.yaml: |+\n pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of Pulsar\n webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n tenant: public\n namespace: default \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n kafka:\n brokerList:\n - :\n saslUsername:\n saslPassword:\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n rocksmq:\n # The path where the message is stored in rocksmq\n # please adjust in embedded Milvus: /tmp/milvus/rdb_data\n path: /var/lib/milvus/rdb_data\n lrucacheratio: 0.06 # rocksdb cache memory ratio\n rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq\n retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.\n retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.\n compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data\n # compaction compression type, only support use 0,7.\n # 0 means not compress, 7 will use zstd\n # len of types means num of rocksdb level.\n compressionTypes: [0, 0, 7, 7, 7] \n","extraConfigFiles:\n user.yaml: |+\n mq:\n type: natsmq\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n"],"headingContent":"Configure Message Storage with Docker Compose or Helm","anchorList":[{"label":"تكوين تخزين الرسائل باستخدام Docker Compose أو Helm","href":"Configure-Message-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"تكوين بولسار باستخدام Docker Compose","href":"Configure-Pulsar-with-Docker-Compose","type":2,"isActive":false},{"label":"تكوين Pulsar مع Helm","href":"Configure-Pulsar-with-Helm","type":2,"isActive":false},{"label":"تكوين كافكا مع هيلم","href":"Configure-Kafka-with-Helm","type":2,"isActive":false},{"label":"تكوين RocksMQ مع Helm","href":"Configure-RocksMQ-with-Helm","type":2,"isActive":false},{"label":"تكوين NATS مع Helm","href":"Configure-NATS-with-Helm","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.md b/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.md new file mode 100644 index 000000000..c27677a86 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_pulsar.md @@ -0,0 +1,240 @@ +--- +id: deploy_pulsar.md +title: تكوين تخزين الرسائل باستخدام Docker Compose أو Helm +related_key: 'Pulsar, storage' +summary: تعرّف على كيفية تكوين تخزين الرسائل باستخدام Docker Compose أو Helm. +--- +

تكوين تخزين الرسائل باستخدام Docker Compose أو Helm

يستخدم Milvus نظام Pulsar أو Kafka لإدارة سجلات التغييرات الأخيرة، وإخراج سجلات الدفق، وتوفير اشتراكات السجلات. Pulsar هو نظام تخزين الرسائل الافتراضي. يقدم هذا الموضوع كيفية تكوين تخزين الرسائل باستخدام Docker Compose أو Helm.

+

يمكنك تكوين Pulsar مع Docker Comp ose أو على K8s وتكوين Kafka على K8s.

+

تكوين بولسار باستخدام Docker Compose

1. تكوين بولسار

لتهيئة Pulsar مع Docker Compose، قم بتوفير القيم الخاصة بك للقسم pulsar في الملف milvus.yaml على مسار milvus/configs.

+
pulsar:
+  address: localhost # Address of pulsar
+  port: 6650 # Port of pulsar
+  maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
+
+

راجع التكوينات المتعلقة بـ Pulsar لمزيد من المعلومات.

+

2. تشغيل ميلفوس

قم بتشغيل الأمر التالي لبدء تشغيل Milvus الذي يستخدم تكوينات Pulsar.

+
docker compose up
+
+
لا تدخل التكوينات حيز التنفيذ إلا بعد بدء تشغيل ميلفوس. انظر بدء تشغيل Milvus لمزيد من المعلومات.
+

تكوين Pulsar مع Helm

بالنسبة لمجموعات Milvus على K8s، يمكنك تكوين Pulsar في نفس الأمر الذي يبدأ تشغيل Milvus. وبدلاً من ذلك، يمكنك تكوين Pulsar باستخدام الملف values.yml على المسار /charts/milvus في مستودع milvus-helm قبل بدء تشغيل Milvus.

+

للحصول على تفاصيل حول كيفية تكوين ملف Milvus باستخدام Helm، راجع تكوين Milvus باستخدام مخططات Helm. للحصول على تفاصيل حول عناصر التكوين المتعلقة بـ Pulsar، راجع التكوينات المتعلقة بـ Pulsar. |

+

استخدام ملف YAML

    +
  1. قم بتكوين القسم externalConfigFiles في الملف values.yaml.
  2. +
+
extraConfigFiles:
+  user.yaml: |+
+    pulsar:
+      address: localhost # Address of pulsar
+      port: 6650 # Port of Pulsar
+      webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080
+      maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
+      tenant: public
+      namespace: default    
+
+
    +
  1. بعد تهيئة الأقسام السابقة وحفظ الملف values.yaml ، قم بتشغيل الأمر التالي لتثبيت ملف Milvus الذي يستخدم تكوينات بولسار.
  2. +
+
helm install <your_release_name> milvus/milvus -f values.yaml
+
+

تكوين كافكا مع هيلم

بالنسبة لمجموعات Milvus على K8s، يمكنك تكوين Kafka في نفس الأمر الذي يبدأ تشغيل Milvus. وبدلاً من ذلك، يمكنك تكوين كافكا باستخدام الملف values.yml على مسار /charts/milvus في مستودع milvus-helm قبل بدء تشغيل Milvus.

+

للحصول على تفاصيل حول كيفية تكوين ملف Milvus باستخدام Helm، راجع تكوين ملف Milvus باستخدام مخططات Helm. للحصول على تفاصيل حول عناصر التكوين المتعلقة بـ Pulsar، راجع التكوينات المتعلقة بـ Pulsar.

+

استخدام ملف YAML

    +
  1. قم بتكوين القسم externalConfigFiles في الملف values.yaml إذا كنت تريد استخدام كافكا كنظام تخزين الرسائل.
  2. +
+
extraConfigFiles:
+  user.yaml: |+
+    kafka:
+      brokerList:
+        -  <your_kafka_address>:<your_kafka_port>
+      saslUsername:
+      saslPassword:
+      saslMechanisms: PLAIN
+      securityProtocol: SASL_SSL    
+
+
    +
  1. بعد تكوين الأقسام السابقة وحفظ الملف values.yaml ، قم بتشغيل الأمر التالي لتثبيت ملف Milvus الذي يستخدم تكوينات كافكا.
  2. +
+
helm install <your_release_name> milvus/milvus -f values.yaml
+
+

تكوين RocksMQ مع Helm

يستخدم ملف Milvus المستقل RocksMQ كمخزن افتراضي للرسائل. للحصول على خطوات مفصلة حول كيفية تكوين Milvus مع Helm، راجع تكوين Milvus مع مخططات Helm. للحصول على تفاصيل حول عناصر التكوين المتعلقة بـ RocksMQ، راجع التكوينات المتعلقة بـ RocksMQ.

+
    +
  • إذا قمت ببدء تشغيل Milvus مع RocksMQ وأردت تغيير إعداداته، يمكنك تشغيل helm upgrade -f بالإعدادات التي تم تغييرها في ملف YAML التالي.

  • +
  • إذا كنت قد قمت بتثبيت Milvus مستقل باستخدام Helm مع مخزن رسائل غير RocksMQ وتريد تغييره مرة أخرى إلى RocksMQ، فقم بتشغيل helm upgrade -f مع ملف YAML التالي بعد مسح جميع المجموعات وإيقاف Milvus.

  • +
+
extraConfigFiles:
+  user.yaml: |+
+    rocksmq:
+      # The path where the message is stored in rocksmq
+      # please adjust in embedded Milvus: /tmp/milvus/rdb_data
+      path: /var/lib/milvus/rdb_data
+      lrucacheratio: 0.06 # rocksdb cache memory ratio
+      rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq
+      retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.
+      retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.
+      compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data
+      # compaction compression type, only support use 0,7.
+      # 0 means not compress, 7 will use zstd
+      # len of types means num of rocksdb level.
+      compressionTypes: [0, 0, 7, 7, 7]    
+
+
+

لا ينصح بتغيير مخزن الرسائل. إذا كنت ترغب في القيام بذلك، أوقف جميع عمليات DDL، ثم قم باستدعاء FlushAll API لمسح جميع المجموعات، وأخيراً أوقف Milvus في النهاية قبل أن تقوم بتغيير مخزن الرسائل فعلياً.

+
+

تكوين NATS مع Helm

NATS هو مخزن رسائل تجريبي بديل لـ RocksMQ. للحصول على خطوات مفصلة حول كيفية تكوين ميلفوس مع Helm، راجع تكوين ميلفوس مع مخططات Helm. للحصول على تفاصيل حول عناصر التكوين المتعلقة بـ RocksMQ، راجع التكوينات المتعلقة بـ NATS.

+
    +
  • إذا قمت ببدء تشغيل ملف Milvus مع NATS وأردت تغيير إعداداته، يمكنك تشغيل helm upgrade -f بالإعدادات التي تم تغييرها في ملف YAML التالي.

  • +
  • إذا كنت قد قمت بتثبيت Milvus مستقل مع مخزن رسائل غير NATS وتريد تغييره إلى NATS، قم بتشغيل helm upgrade -f مع ملف YAML التالي بعد مسح جميع المجموعات وإيقاف Milvus.

  • +
+
extraConfigFiles:
+  user.yaml: |+
+    mq:
+      type: natsmq
+    natsmq:
+      # server side configuration for natsmq.
+      server: 
+        # 4222 by default, Port for nats server listening.
+        port: 4222 
+        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
+        storeDir: /var/lib/milvus/nats 
+        # (B) 16GB by default, Maximum size of the 'file' storage.
+        maxFileStore: 17179869184 
+        # (B) 8MB by default, Maximum number of bytes in a message payload.
+        maxPayload: 8388608 
+        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
+        maxPending: 67108864 
+        # (√ms) 4s by default, waiting for initialization of natsmq finished.
+        initializeTimeout: 4000 
+        monitor:
+          # false by default, If true enable debug log messages.
+          debug: false 
+          # true by default, If set to false, log without timestamps.
+          logTime: true 
+          # no log file by default, Log file path relative to.. .
+          logFile: 
+          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
+          logSizeLimit: 0 
+        retention:
+          # (min) 3 days by default, Maximum age of any message in the P-channel.
+          maxAge: 4320 
+          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
+          maxBytes:
+          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
+          maxMsgs: 
+
+
+

الاختيار بين RocksMQ و NATS؟

+

يستخدم RocksMQ CGO للتفاعل مع RocksDB ويدير الذاكرة بنفسه، بينما يقوم NATS المدمج في تثبيت Milvus بتفويض إدارة الذاكرة إلى جامع القمامة (GC) الخاص بـ Go.

+

في السيناريو الذي تكون فيه حزمة البيانات أصغر من 64 كيلوبايت، يتفوق RocksDB من حيث استخدام الذاكرة واستخدام وحدة المعالجة المركزية ووقت الاستجابة. من ناحية أخرى، إذا كانت حزمة البيانات أكبر من 64 كيلوبايت، يتفوق NATS من حيث وقت الاستجابة مع وجود ذاكرة كافية وجدولة GC مثالية.

+

في الوقت الحالي، يُنصح باستخدام NATS للتجارب فقط.

+
+

ما التالي

تعرف على كيفية تكوين تبعيات Milvus الأخرى باستخدام Docker Compose أو Helm:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_s3.json b/localization/v2.5.x/site/ar/adminGuide/deploy_s3.json new file mode 100644 index 000000000..87be2bf9a --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_s3.json @@ -0,0 +1 @@ +{"codeList":["minio:\n address: \n port: \n accessKeyID: \n secretAccessKey: \n useSSL: \n bucketName: \"\"\n","docker compose up\n","minio:\n enabled: false\n","externalS3:\n enabled: true\n host: \"\"\n port: \"\"\n accessKey: \"\"\n secretKey: \"\"\n useSSL: \n bucketName: \"\"\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host= --set externalS3.port= --set externalS3.accessKey= --set externalS3.secretKey= --set externalS3.bucketName=\n"],"headingContent":"Configure Object Storage with Docker Compose or Helm","anchorList":[{"label":"تكوين تخزين الكائنات باستخدام Docker Compose أو Helm","href":"Configure-Object-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"تكوين S3 باستخدام Docker Compose","href":"Configure-S3-with-Docker-Compose","type":2,"isActive":false},{"label":"تكوين S3 على K8s","href":"Configure-S3-on-K8s","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/deploy_s3.md b/localization/v2.5.x/site/ar/adminGuide/deploy_s3.md new file mode 100644 index 000000000..c8897f20d --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/deploy_s3.md @@ -0,0 +1,132 @@ +--- +id: deploy_s3.md +title: تكوين تخزين الكائنات باستخدام Docker Compose أو Helm +related_key: 'S3, storage' +summary: تعرف على كيفية إعداد تخزين S3 لميلفوس باستخدام Docker Compose أو Helm. +--- +

تكوين تخزين الكائنات باستخدام Docker Compose أو Helm

يستخدم ميلفوس MinIO لتخزين الكائنات بشكل افتراضي، ولكنه يدعم أيضًا استخدام خدمة التخزين البسيط من أمازون (S3) كتخزين كائنات دائم لملفات السجل والفهرس. يصف هذا الموضوع كيفية تكوين S3 لميلفوس. يمكنك تخطي هذا الموضوع إذا كنت راضيًا عن MinIO.

+

يمكنك تكوين S3 باستخدام Docker Compose أو على K8s.

+

تكوين S3 باستخدام Docker Compose

1. تكوين S3

MinIO متوافق مع S3. لتهيئة S3 مع Docker Compose، قم بتوفير القيم الخاصة بك للقسم minio في الملف milvus.yaml على مسار ميلفوس/كونفيغس.

+
minio:
+  address: <your_s3_endpoint>
+  port: <your_s3_port>
+  accessKeyID: <your_s3_access_key_id>
+  secretAccessKey: <your_s3_secret_access_key>
+  useSSL: <true/false>
+  bucketName: "<your_bucket_name>"
+
+

راجع تكوينات MinIO/S3 لمزيد من المعلومات.

+

2. صقل docker-compose.yaml

يمكنك أيضًا إزالة متغير البيئة MINIO_ADDRESS لخدمة milvus في docker-compose.yaml. بشكل افتراضي سيستخدم ميلفوس المينيو المحلي بدلاً من S3 الخارجي.

+

3. قم بتشغيل ميلفوس

قم بتشغيل الأمر التالي لبدء تشغيل Milvus الذي يستخدم تكوينات S3.

+
docker compose up
+
+
لا تدخل التكوينات حيز التنفيذ إلا بعد بدء تشغيل Milvus. انظر بدء تشغيل Milvus لمزيد من المعلومات.
+

تكوين S3 على K8s

بالنسبة لمجموعات Milvus على K8s، يمكنك تكوين S3 في نفس الأمر الذي يبدأ تشغيل Milvus. وبدلاً من ذلك، يمكنك تكوين S3 باستخدام الملف values.yml على المسار /charts/milvus في مستودع milvus-helm قبل بدء تشغيل Milvus.

+

يسرد الجدول التالي مفاتيح تكوين S3 في ملف YAML.

+ + + + + + + + + + + + + + + +
المفتاحالوصفالقيمة
minio.enabledتمكين أو تعطيل MinIO.true/false
externalS3.enabledتمكين S3 أو تعطيله.true/false
externalS3.hostنقطة النهاية للوصول إلى S3.
externalS3.portمنفذ الوصول إلى S3.
externalS3.rootPathالمسار الجذر للتخزين S3.سلسلة emtpy افتراضيًا.
externalS3.accessKeyمعرّف مفتاح الوصول لـ S3.
externalS3.secretKeyمفتاح الوصول السري لـ S3.
externalS3.bucketNameاسم دلو S3.
externalS3.useSSLما إذا كان يجب استخدام SSL عند الاتصالالقيم الافتراضية لـ false
+

استخدام ملف YAML

    +
  1. تكوين القسم minio في الملف values.yaml.
  2. +
+
minio:
+  enabled: false
+
+
    +
  1. تكوين قسم externalS3 باستخدام قيمك في الملف values.yaml.
  2. +
+
externalS3:
+  enabled: true
+  host: "<your_s3_endpoint>"
+  port: "<your_s3_port>"
+  accessKey: "<your_s3_access_key_id>"
+  secretKey: "<your_s3_secret_key>"
+  useSSL: <true/false>
+  bucketName: "<your_bucket_name>"
+
+
    +
  1. بعد تكوين الأقسام السابقة وحفظ الملف values.yaml ، قم بتشغيل الأمر التالي لتثبيت ملف Milvus الذي يستخدم تكوينات S3.
  2. +
+
helm install <your_release_name> milvus/milvus -f values.yaml
+
+

استخدام الأمر

لتثبيت ملف Milvus وتكوين S3، قم بتشغيل الأمر التالي باستخدام قيمك.

+
helm install <your_release_name> milvus/milvus --set cluster.enabled=true  --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host=<your_s3_endpoint> --set externalS3.port=<your_s3_port> --set externalS3.accessKey=<your_s3_access_key_id> --set externalS3.secretKey=<your_s3_secret_key> --set externalS3.bucketName=<your_bucket_name>
+
+

ما التالي

تعلم كيفية تكوين تبعيات Milvus الأخرى باستخدام Docker Compose أو Helm:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.json b/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.json new file mode 100644 index 000000000..82cb884fd --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create a user​\nclient.drop_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.client.ConnectConfig​\nimport io.milvus.v2.client.MilvusClientV2​\nimport io.milvus.v2.service.rbac.request.DropUserReq​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropUserReq dropUserReq = DropUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nclient.dropUser(dropUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.deleteUser({​\n username: 'user_1'​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","import io.milvus.v2.service.rbac.request.listUsersReq​\n​\nList resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listUsers()​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root']​\n\n","from pymilvus import MilvusClient​\n​\nclient.drop_role(role_name=\"role_a\")​\n\n","import io.milvus.v2.service.rbac.request.DropRoleReq​\n​\nDropRoleReq dropRoleReq = DropRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\nclient.dropRole(dropRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.dropRole({​\n roleName: 'role_a',​\n })​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List resp = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listRoles(​\n includeUserInfo: True​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin']​\n\n"],"headingContent":"Drop Users & Roles​","anchorList":[{"label":"إسقاط المستخدمين والأدوار","href":"Drop-Users--Roles​","type":1,"isActive":false},{"label":"إسقاط مستخدم","href":"Drop-a-user​","type":2,"isActive":false},{"label":"إسقاط دور","href":"Drop-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.md b/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.md new file mode 100644 index 000000000..390497f04 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/drop_users_roles.md @@ -0,0 +1,204 @@ +--- +id: drop_users_roles.md +related_key: enable RBAC +summary: >- + لضمان أمان البيانات، يوصى بإسقاط المستخدمين والأدوار التي لم تعد قيد + الاستخدام. يقدم هذا الدليل كيفية إسقاط المستخدمين والأدوار. +title: إسقاط المستخدمين والأدوار +--- +

إسقاط المستخدمين والأدوار

لضمان أمان البيانات، يوصى بإسقاط المستخدمين والأدوار التي لم تعد قيد الاستخدام. يقدم هذا الدليل كيفية إسقاط المستخدمين والأدوار.

+

إسقاط مستخدم

يوضح المثال التالي كيفية إسقاط المستخدم user_1.

+
+

لا يمكن إسقاط المستخدم root.

+
+ +
from pymilvus import MilvusClient​
+​
+client = MilvusClient(​
+    uri="http://localhost:19530",​
+    token="root:Milvus"​
+)​
+​
+# create a user​
+client.drop_user(user_name="user_1")​
+
+
+
import io.milvus.v2.client.ConnectConfig​
+import io.milvus.v2.client.MilvusClientV2​
+import io.milvus.v2.service.rbac.request.DropUserReq​
+​
+ConnectConfig connectConfig = ConnectConfig.builder()​
+        .uri("http://localhost:19530")​
+        .token("root:Milvus")​
+        .build();​
+        ​
+MilvusClientV2 client = new MilvusClientV2(connectConfig);​
+​
+DropUserReq dropUserReq = DropUserReq.builder()​
+        .userName("user_1")​
+        .build();​
+client.dropUser(dropUserReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+const address = "http://localhost:19530";​
+const token = "root:Milvus";​
+const client = new MilvusClient({address, token});​
+​
+milvusClient.deleteUser({​
+    username: 'user_1'​
+})​
+
+
+
export CLUSTER_ENDPOINT="http://localhost:19530"​
+export TOKEN="root:Milvus"​
+​
+curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/drop" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "userName": "user_1"​
+}'​
+
+
+

بمجرد إسقاط المستخدم، يمكنك سرد جميع المستخدمين الحاليين للتحقق مما إذا كانت عملية الإسقاط ناجحة.

+ +
from pymilvus import MilvusClient​
+​
+client.list_users()​
+
+
+
import io.milvus.v2.service.rbac.request.listUsersReq​
+​
+List<String> resp = client.listUsers();​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+milvusClient.listUsers()​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{}'​
+
+
+

فيما يلي مثال على الإخراج. لا يوجد user_1 في القائمة. عملية الإسقاط ناجحة.

+
['root']​
+
+
+

إسقاط دور

يوضح المثال التالي كيفية إسقاط الدور role_a.

+
+

لا يمكن إسقاط الدور المدمج admin. لا يمكن إسقاط الدور المدمج .

+
+ +
from pymilvus import MilvusClient​
+​
+client.drop_role(role_name="role_a")​
+
+
+
import io.milvus.v2.service.rbac.request.DropRoleReq​
+​
+DropRoleReq dropRoleReq = DropRoleReq.builder()​
+        .roleName("role_a")​
+        .build();​
+client.dropRole(dropRoleReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+milvusClient.dropRole({​
+   roleName: 'role_a',​
+ })​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "roleName": "role_a"​
+}'​
+
+
+

بمجرد إسقاط الدور، يمكنك سرد جميع الأدوار الموجودة للتحقق مما إذا كانت عملية الإسقاط ناجحة.

+ +
from pymilvus import MilvusClient​
+​
+client.list_roles()​
+
+
+
List<String> resp = client.listRoles();​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+milvusClient.listRoles(​
+    includeUserInfo: True​
+)​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{}'​
+
+
+

فيما يلي مثال على الإخراج. لا يوجد role_a في القائمة. عملية الإسقاط ناجحة.

+
['admin']​
+
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/dynamic_config.json b/localization/v2.5.x/site/ar/adminGuide/dynamic_config.json new file mode 100644 index 000000000..73dd8696f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/dynamic_config.json @@ -0,0 +1 @@ +{"codeList":["$ etcdctl put by-dev/config/proxy/minPasswordLength 8\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl del by-dev/config/proxy/minPasswordLength \n# or \n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl get --prefix by-dev/config\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd\"\n","Offline > connect --etcd ip:port \nMilvus(by-dev) > show session # List all nodes with their server ID\nMilvus(by-dev) > visit querycoord 1 # Visit a node by server ID\nQueryCoord-1(ip:port) > configuration # List the configuration of the node\n"],"headingContent":"Configure Milvus on the Fly","anchorList":[{"label":"تكوين ميلفوس أثناء التنقل","href":"Configure-Milvus-on-the-Fly","type":1,"isActive":false},{"label":"قبل البدء","href":"Before-you-start","type":2,"isActive":false},{"label":"تغيير التكوينات","href":"Change-configurations","type":2,"isActive":false},{"label":"استرجاع التكوينات","href":"Roll-back-configurations","type":2,"isActive":false},{"label":"عرض التكوينات","href":"View-configurations","type":2,"isActive":false},{"label":"عناصر التكوين القابلة للتطبيق","href":"Applicable-configuration-items","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/dynamic_config.md b/localization/v2.5.x/site/ar/adminGuide/dynamic_config.md new file mode 100644 index 000000000..4f5b5c297 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/dynamic_config.md @@ -0,0 +1,208 @@ +--- +id: dynamic_config.md +related_key: configure +summary: تعرف على التكوين الديناميكي لميلفوس. +title: تكوين ميلفوس أثناء التنقل +--- +

تكوين ميلفوس أثناء التنقل

يسمح لك Milvus بتغيير بعض تكويناته أثناء التنقل.

+

قبل البدء

تحتاج إلى التأكد من أن: :

+
    +
  • لديك برنامج Birdwatcher مثبتاً. لمزيد من التفاصيل، راجع تثبيت Birdwatcher,
  • +
  • لديك برنامج إلخdctl مثبت لديك. لمزيد من التفاصيل، راجع التفاعل مع إلخd، أو
  • +
  • إذا كان لديك عملاء آخرين لـ etcd، مثل عميل Python، مثبتين.
  • +
+
+
    +
  • تقوم الأمثلة في هذا الدليل بتغيير قيمة proxy.minPasswordLength إلى 8. يمكنك استبدال المفتاح بالمفاتيح القابلة للتطبيق المدرجة في عناصر التكوين القابلة للتطبيق.
  • +
  • تفترض الأمثلة في هذا الدليل أن المسار الجذر لـ Milvus الخاص بك هو by-dev. جميع التكوينات مدرجة تحت المسار by-dev/config. يختلف مسار جذر Milvus باختلاف طريقة تثبيته. بالنسبة للمثيلات المثبتة باستخدام مخططات Helm، يتم تعيين المسار الجذر افتراضيًا إلى by-dev. إذا كنت لا تعرف المسار الجذر، فارجع إلى الاتصال بـ etcd.
  • +
+
+

تغيير التكوينات

في ميلفوس، يتم تعيين proxy.minPasswordLength على 6 افتراضيًا. لتغيير هذه القيمة، يمكنك القيام بما يلي:

+
$ etcdctl put by-dev/config/proxy/minPasswordLength 8
+# or
+$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8"
+
+

ثم يمكنك التحقق من التكوينات على النحو التالي:

+
$ etcdctl get by-dev/config/proxy/minPasswordLength
+
+

استرجاع التكوينات

يسمح لك Milvus أيضاً باستعادة التكوينات الخاصة بك في حال لم تعد القيمة التي تم تغييرها سارية.

+
$ etcdctl del by-dev/config/proxy/minPasswordLength 
+# or 
+$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength"
+
+

ثم يمكنك التحقق من التكوينات على النحو التالي:

+
$ etcdctl get by-dev/config/proxy/minPasswordLength
+
+

عرض التكوينات

بدلاً من عرض قيمة عنصر تكوين معين، يمكنك أيضاً سرد جميع التكوينات.

+
$ etcdctl get --prefix by-dev/config
+# or
+$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd"
+
+

لعرض تكوينات عقدة محددة:

+
Offline > connect --etcd ip:port 
+Milvus(by-dev) > show session          # List all nodes with their server ID
+Milvus(by-dev) > visit querycoord 1    # Visit a node by server ID
+QueryCoord-1(ip:port) > configuration  # List the configuration of the node
+
+

عناصر التكوين القابلة للتطبيق

في الوقت الحالي، يمكنك تغيير عناصر التكوين التالية بشكل سريع.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
عنصر التكوينالقيمة الافتراضية
pulsar.maxMessageSize5242880
شائع.مدة الاحتفاظ86400
شائع.entityExpiration-1
الوقت الشائع.gracefulTime5000
شائع.gracefulStopTimeTimeout30
quotaAndLimits.ddl.enabledFALSE
تم تمكين quotaAndLimits.indexRate.enabledFALSE
تم تمكين quotaAndLimits.flushRate.enabledFALSE
تم تمكين quotaAndLimits.compactionRate.enabledFALSE
تم تمكين quotaAndLimits.dml.enabledFALSE
تم تمكين quotaAndLimits.dql.enabledFALSE
quotaAndLimits.limits.collection.maxNum64
quotaAndLimits.limitWriting.forceDeny.forceDenyFALSE
quotaAndLimits.limitWriting.ttProtection.enabledFALSE
quotaAndLimits.limitWriting.ttProtection.maxTimeTickTickDelay9223372036854775807
quotaAndLimits.limitWriting.memProtection.enabledTRUE
quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel0.85
quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel0.95
quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel0.85
quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel0.95
quotaAndLimits.limitWriting.diskProtection.enabledTRUE
quotaAndLimits.limitWriting.diskProtection.diskQuota+INF
quotaAndLimits.limitReading.forceDeny.forceDenyFALSE
quotaAndLimits.limitReading.queueProtection.enabledFALSE
quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold9223372036854775807
quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold+INF
quotaAndLimits.limitReading.resultProtection.enabledFALSE
quotaAndLimits.limitReading.resultProtection.maxReadResultRate+INF
quotaAndLimits.limitReading.coolOffSpeed0.9
تمكين الفهرس التلقائيFALSE
بناء الفهرس التلقائي""
autoIndex.params.extra""
بحث.بارامز.بارامز.بحث""
proxy.maxNameLength255
proxy.maxUsernameLength.maxUsernameLength32
الحد الأدنى لطول كلمة المرور6
الحد الأقصى لطول كلمة المرور256
proxy.maxFieldNum64
proxy.maxShardNum256
proxy.maxDimension32768
proxy.maxUserNum100
proxy.maxRoleNum10
queryNode.enableDiskTRUE
dataCoord.segment.diskSegmentMaxSize2048
dataCoord.compaction.enableAutoCompactionصحيح
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/grant_privileges.json b/localization/v2.5.x/site/ar/adminGuide/grant_privileges.json new file mode 100644 index 000000000..b5318518d --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/grant_privileges.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"privilege_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\n\nawait milvusClient.grantPrivilege({\n roleName: 'role_a',\n object: 'Collection', \n objectName: 'collection_01',\n privilegeName: 'Search'\n });\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"privilege_group_1\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n","from pymilvus import MilvusClient\n\nclient.describe_role(role_name=\"role_a\")\n","import io.milvus.v2.service.rbac.response.DescribeRoleResp;\nimport io.milvus.v2.service.rbac.request.DescribeRoleReq\n\nDescribeRoleReq describeRoleReq = DescribeRoleReq.builder()\n .roleName(\"role_a\")\n .build();\nDescribeRoleResp resp = client.describeRole(describeRoleReq);\nList infos = resp.getGrantInfos();\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.ListRoles(context.Background())\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nawait milvusClient.describeRole({roleName: 'role_a'});\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\"\n}'\n","{\n \"role\": \"role_a\",\n \"privileges\": [\n {\n \"collection_name\": \"collection_01\",\n \"db_name\": \"default\",\n \"role_name\": \"role_a\",\n \"privilege\": \"Search\",\n \"grantor_name\": \"root\"\n },\n \"privilege_group_1\"\n ]\n}\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"privielge_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n"],"headingContent":"Grant Privilege or Privilege Group to Roles​","anchorList":[{"label":"منح امتياز أو مجموعة امتيازات للأدوار","href":"Grant-Privilege-or-Privilege-Group-to-Roles​","type":1,"isActive":false},{"label":"منح امتياز أو مجموعة امتيازات لدور ما","href":"Grant-a-privilege-or-a-privilege-group-to-a-role​","type":2,"isActive":false},{"label":"وصف الدور","href":"Describe-a-role","type":2,"isActive":false},{"label":"إبطال امتياز أو مجموعة امتيازات من دور ما","href":"Revoke-a-privilege-or-a-privilege-group-from-a-role","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/grant_privileges.md b/localization/v2.5.x/site/ar/adminGuide/grant_privileges.md new file mode 100644 index 000000000..3be2ebb5b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/grant_privileges.md @@ -0,0 +1,542 @@ +--- +id: grant_privileges.md +related_key: enable RBAC +summary: >- + بمجرد إنشاء الدور، يمكنك منح امتيازات للدور. يقدم هذا الدليل كيفية منح + امتيازات أو مجموعات امتيازات لدور ما. +title: منح امتياز أو مجموعة امتيازات للأدوار +--- +

منح امتياز أو مجموعة امتيازات للأدوار

بمجرد إنشاء الدور، يمكنك منح امتيازات للدور. يقدم هذا الدليل كيفية منح امتيازات أو مجموعات امتيازات إلى دور.

+

منح امتياز أو مجموعة امتيازات لدور ما

يقدم الإصدار Milvus 2.5 إصدارًا جديدًا من واجهة برمجة التطبيقات (API) التي تبسط عملية المنح. لم تعد بحاجة إلى البحث عن نوع الكائن عند منح امتياز إلى دور. فيما يلي المعلمات والتفسيرات المقابلة.

+
    +
  • اسم الدور: اسم الدور المستهدف الذي يجب منحه الامتياز (الأدوار) أو مجموعة (مجموعات) الامتيازات.

  • +
  • المورد: المورد المستهدف للامتياز، والذي يمكن أن يكون مثيلًا أو قاعدة بيانات أو مجموعة محددة. يشرح الجدول التالي كيفية تحديد المورد في الأسلوب client.grantV2().

  • +
+

المستوى

+

المورد

+

طريقة المنح

+

ملاحظات

+

التحصيل

+

+

مجموعة محددة

+

+

client.grant_privilege_v2(role_name="roleA"، امتياز="CollectionAdmin"، collection_name="col1"، db_name="db1")

+

أدخل اسم المجموعة المستهدفة واسم قاعدة البيانات التي تنتمي إليها المجموعة المستهدفة.

+

+

جميع المجموعات ضمن قاعدة بيانات محددة

+

client.grant_privilege_v2(role_name="roleA"، امتياز="CollectionAdmin"، collection_name="*"، db_name="db1")

+

أدخل اسم قاعدة البيانات المستهدفة وحرف البدل `*` كاسم المجموعة.

+

**قاعدة البيانات**

+

قاعدة بيانات محددة

+

client.grant_privilege_v2(role_name="roleA"، امتياز="DatabaseAdmin"، collection_name="*"، db_name="db1")

+

أدخل اسم قاعدة البيانات المستهدفة وحرف البدل `*` كاسم المجموعة.

+

+

جميع قواعد البيانات ضمن المثيل الحالي

+

client.grant_privilege_v2(role_name="roleA"، امتياز="DatabaseAdmin"، collection_name="*"، db_name="*")

+

أدخل `*` كاسم قاعدة البيانات و `*` كاسم المجموعة.

+

**المثيل**

+

المثيل الحالي

+

client.grant_privilege_v2(role_name="roleA"، امتياز="ClusterAdmin"، collection_name="*"، db_name="*")

+

أدخل `*` كاسم قاعدة البيانات و `*` كاسم المجموعة.

+
+
    +
  • الامتياز: الامتياز أو مجموعة الامتيازات المحددة التي تحتاج إلى منحها للدور. يوفر ملفوس حالياً 56 نوعاً من الامتيازات التي يمكنك منحها. يسرد الجدول أدناه الامتيازات في ملفوس.

    +

    +

    عمود النوع في الجدول أدناه مستخدم لتسهيل البحث السريع عن الامتيازات ويستخدم لأغراض التصنيف فقط. عند منح الامتيازات، لا تحتاج إلى فهم الأنواع. تحتاج فقط إلى إدخال الامتيازات المقابلة.

    +

  • +
+

**النوع **

+

**امتياز**

+

**الوصف**

+

**وصف واجهة برمجة التطبيقات ذات الصلة من جانب العميل**

+

امتيازات قاعدة البيانات

+

سرد قواعد البيانات

+

عرض جميع قواعد البيانات في المثيل الحالي

+

[ListDatabases](https://milvus.io/docs/manage_databases.md)

+

وصف قاعدة البيانات

+

عرض تفاصيل قاعدة البيانات

+

[وصف قاعدة البيانات](https://milvus.io/docs/manage_databases.md)

+

إنشاء قاعدة بيانات

+

إنشاء قاعدة بيانات

+

[إنشاء قاعدة بيانات](https://milvus.io/docs/manage_databases.md)

+

إسقاط قاعدة بيانات

+

إسقاط قاعدة بيانات

+

[DropDatabase](https://milvus.io/docs/manage_databases.md)

+

تغيير قاعدة البيانات

+

تعديل خصائص قاعدة البيانات

+

[AlterDatabase](https://milvus.io/docs/manage_databases.md)

+

امتيازات المجموعة

+

+

الحصول على حالة التدفق

+

التحقق من حالة عملية تدفق المجموعة

+

[GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

+

الحصول على حالة التحميل

+

التحقق من حالة تحميل مجموعة

+

[GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

+

GetLoadingProgress

+

تحقق من تقدم التحميل لمجموعة ما

+

[GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)

+

إظهار المجموعات

+

عرض جميع المجموعات مع امتيازات المجموعة

+

[ShowCollections](https://milvus.io/docs/view-collections.md)

+

سرد الأسماء المستعارة

+

عرض كافة الأسماء المستعارة للمجموعة

+

[ListAliases](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/list_aliases.md)

+

وصف المجموعة

+

عرض تفاصيل مجموعة ما

+

[وصف المجموعة](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_collection.md)

+

وصف الأسماء المستعارة

+

عرض تفاصيل اسم مستعار

+

[وصف الاسم المستعار](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_alias.md)

+

الحصول على إحصائيات

+

الحصول على إحصائيات مجموعة (مثل: عدد الكيانات في مجموعة)

+

[GetCollectionStatistics](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/get_collection_stats.md)

+

إنشاء مجموعة

+

إنشاء مجموعة

+

[إنشاء مجموعة](https://milvus.io/docs/create-collection.md)

+

إسقاط مجموعة

+

إسقاط مجموعة

+

[DropCollection](https://milvus.io/docs/drop-collection.md)

+

تحميل

+

تحميل مجموعة

+

[LoadCollection](https://milvus.io/docs/load-and-release.md)/[GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)/[GetLoadingProgress](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20LoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)/[GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Loading%20State.md)

+

الإصدار

+

إصدار مجموعة

+

[ReleaseCollection](https://milvus.io/docs/load-and-release.md)

+

مسح

+

+

نقل جميع الكيانات في مجموعة إلى مقطع مغلق. سيتم تخزين أي كيان يتم إدراجه بعد عملية التدفق في مقطع جديد.

+

[تدفق](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)/[GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

+

الضغط

+

تشغيل الضغط يدويًا

+

[ضغط](https://milvus.io/docs/v2.0.x/compact_data.md)

+

إعادة تسمية مجموعة

+

إعادة تسمية مجموعة

+

[إعادة تسمية مجموعة](https://milvus.io/docs/modify-collection.md)

+

إنشاء اسم مستعار

+

إنشاء اسم مستعار لمجموعة

+

[CreateAlias](https://milvus.io/docs/manage-aliases.md)

+

إسقاط اسم مستعار

+

إسقاط الاسم المستعار لمجموعة ما

+

[DropAlias](https://milvus.io/docs/manage-aliases.md)

+

مسح الكل

+

مسح كافة المجموعات في قاعدة البيانات

+

[FlushAll](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/flush_all.md)

+

امتيازات التقسيم

+

لديه قسم

+

التحقق من وجود قسم من عدمه

+

[HasPartition](https://milvus.io/docs/manage-partitions.md)

+

إظهار الأقسام

+

عرض كافة الأقسام في مجموعة

+

[ShowPartitions](https://milvus.io/docs/manage-partitions.md)

+

إنشاء قسم

+

إنشاء قسم

+

[CreatePartition](https://milvus.io/docs/manage-partitions.md)

+

إسقاط قسم

+

إسقاط قسم

+

[DropPartition](https://milvus.io/docs/manage-partitions.md)

+

امتيازات الفهرس

+

تفاصيل الفهرس

+

عرض تفاصيل الفهرس

+

+

[وصف الفهرس/حصول على الفهرس/حصول على الفهرس/حصول على إنشاء الفهرس](https://milvus.io/docs/index-vector-fields.md?tab=floating)

+

إنشاء فهرس

+

إنشاء فهرس

+

[إنشاء فهرس](https://milvus.io/docs/index-vector-fields.md?tab=floating)

+

إسقاط فهرس

+

إسقاط فهرس

+

[DropIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

+

امتيازات إدارة الموارد

+

+

موازنة التحميل

+

تحقيق توازن التحميل

+

[LoadBalance](https://milvus.io/docs/resource_group.md)

+

إنشاء مجموعة موارد

+

إنشاء مجموعة موارد

+

[CreateResResourceGroup](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/create_resource_group.md)

+

إسقاط مجموعة موارد

+

إسقاط مجموعة موارد

+

[DropResResourceGroup](https://milvus.io/docs/resource_group.md)

+

تحديثResourceResourceGroups

+

تحديث مجموعة موارد

+

[UpdateResResourceGroups](https://milvus.io/docs/resource_group.md)

+

وصف مجموعة موارد

+

عرض تفاصيل مجموعة موارد

+

[DescribeRescribeResourceGroup](https://milvus.io/docs/resource_group.md)

+

سرد مجموعات الموارد

+

عرض كافة مجموعات الموارد للمثيل الحالي

+

[ListResResourceGroups](https://milvus.io/docs/resource_group.md)

+

نقل العقدة

+

نقل العقد بين مجموعات الموارد

+

[TransferNode](https://milvus.io/docs/resource_group.md)

+

نقل النسخ المتماثلة

+

نقل النسخ المتماثلة بين مجموعات الموارد

+

[TransferReplica](https://milvus.io/docs/resource_group.md)

+

النسخ الاحتياطي RBAC

+

إنشاء نسخة احتياطية لجميع العمليات المتعلقة ب RBAC في المثيل الحالي

+

BackupRBAC

+

استعادةRBAC

+

استعادة نسخة احتياطية لجميع العمليات المتعلقة ب RBAC في المثيل الحالي

+

استعادةRBAC

+

امتيازات الكيان

+

+

استعلام

+

إجراء استعلام

+

[استعلام] (https://milvus.io/docs/get-and-scalar-query.md)

+

بحث

+

إجراء بحث

+

[بحث](https://milvus.io/docs/single-vector-search.md)

+

إدراج

+

إدراج كيانات

+

[إدراج](https://milvus.io/docs/insert-update-delete.md)

+

حذف

+

حذف الكيانات

+

[حذف](https://milvus.io/docs/delete-entities.md)

+

Upsert

+

إدراج الكيانات

+

[Upsert](https://milvus.io/docs/upsert-entities.md)

+

استيراد

+

إدراج الكيانات أو استيرادها بالجملة

+

[الإدراج/الاستيراد بالجملة](https://milvus.io/docs/import-data.md)

+

امتيازات RBAC

+

إنشاء ملكية

+

إنشاء مستخدم أو دور

+

[إنشاء مستخدم/إنشاء دور](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

+

تحديث مستخدم

+

تحديث كلمة مرور مستخدم

+

[UpdateCredential](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

+

إسقاط الملكية

+

إسقاط كلمة مرور مستخدم أو دور

+

[DeleteCredential/DropRole](https://zilliverse.feishu.cn/wiki/OqZnwJHrJilLPukfvp5cSgnmnTh)

+

تحديدالملكية

+

عرض جميع المستخدمين الذين تم منحهم دورًا معينًا

+

[SelectRole/SelectGrant](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

+

إدارة الملكية

+

قم بإدارة مستخدم أو دور أو منح دور لمستخدم

+

[OperateUserRole/OperatePrivilege/OperatePrivilegeV2](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

+

تحديد مستخدم

+

عرض جميع الأدوار الممنوحة للمستخدم

+

[SelectUser](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

+

إنشاء مجموعة امتيازات

+

إنشاء مجموعة امتيازات

+

[CreatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

+

إسقاط مجموعة امتيازات

+

إسقاط مجموعة امتيازات

+

[DropPrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

+

سرد مجموعات الامتيازات

+

عرض جميع مجموعات الامتيازات في المثيل الحالي

+

[ListPrivilegeGroups](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

+

تشغيلPrivilegeGroup

+

إضافة امتيازات إلى مجموعة امتيازات أو إزالتها منها

+

[OperatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

+
+

يوضح المثال التالي كيفية منح الامتياز PrivilegeSearch على collection_01 ضمن قاعدة البيانات الافتراضية بالإضافة إلى مجموعة امتيازات باسم privilege_group_1 إلى الدور role_a.

+ +
from pymilvus import MilvusClient
+
+client = MilvusClient(
+    uri="http://localhost:19530",
+    token="root:Milvus"
+)
+
+client.grant_privilege_v2(
+    role_name="role_a",
+    privilege="Search"
+    collection_name='collection_01'
+    db_name='default',
+)
+    
+client.grant_privilege_v2(
+    role_name="role_a",
+    privilege="privilege_group_1"
+    collection_name='collection_01'
+    db_name='default',
+)
+
+client.grant_privilege_v2(
+    role_name="role_a",
+    privilege="ClusterReadOnly"
+    collection_name='*'
+    db_name='*',
+)
+
+
import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
+
+client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("Search")
+        .collectionName("collection_01")
+        .dbName("default")
+        .build());
+
+client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("privilege_group_1")
+        .collectionName("collection_01")
+        .dbName("default")
+        .build());
+
+client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("ClusterReadOnly")
+        .collectionName("*")
+        .dbName("*")
+        .build());
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"
+
+client.GrantV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
+
+client.GrantV2(context.Background(), "role_a", "collection_01", "privilege_group_1", entity.WithOperatePrivilegeDatabase("default"))
+
+client.GrantV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
+
+const address = "http://localhost:19530";
+const token = "root:Milvus";
+const client = new MilvusClient({address, token});
+
+await milvusClient.grantPrivilege({
+   roleName: 'role_a',
+   object: 'Collection', 
+   objectName: 'collection_01',
+   privilegeName: 'Search'
+ });
+
+
curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "Search",
+    "collectionName": "collection_01",
+    "dbName":"default"
+}'
+
+curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "privilege_group_1",
+    "collectionName": "collection_01",
+    "dbName":"default"
+}'
+
+curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "ClusterReadOnly",
+    "collectionName": "*",
+    "dbName":"*"
+}'
+
+

وصف الدور

يوضح المثال التالي كيفية عرض الامتيازات الممنوحة للدور role_a باستخدام طريقة وصف_الدور.

+ +
from pymilvus import MilvusClient
+
+client.describe_role(role_name="role_a")
+
+
import io.milvus.v2.service.rbac.response.DescribeRoleResp;
+import io.milvus.v2.service.rbac.request.DescribeRoleReq
+
+DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
+        .roleName("role_a")
+        .build();
+DescribeRoleResp resp = client.describeRole(describeRoleReq);
+List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"
+
+client.ListRoles(context.Background())
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
+
+await milvusClient.describeRole({roleName: 'role_a'});
+
+
curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a"
+}'
+
+

فيما يلي مثال على الإخراج.

+
{
+     "role": "role_a",
+     "privileges": [
+         {
+             "collection_name": "collection_01",
+             "db_name": "default",
+             "role_name": "role_a",
+             "privilege": "Search",
+             "grantor_name": "root"
+         },
+         "privilege_group_1"
+     ]
+}
+
+

إبطال امتياز أو مجموعة امتيازات من دور ما

يوضح المثال التالي كيفية إبطال الامتياز PrivilegeSearch على collection_01 ضمن قاعدة البيانات الافتراضية بالإضافة إلى مجموعة الامتيازات privilege_group_1 التي تم منحها للدور role_a.

+ +
from pymilvus import MilvusClient
+
+client = MilvusClient(
+    uri="http://localhost:19530",
+    token="root:Milvus"
+)
+
+client.revoke_privilege_v2(
+    role_name="role_a",
+    privilege="Search"
+    collection_name='collection_01'
+    db_name='default',
+)
+    
+client.revoke_privilege_v2(
+    role_name="role_a",
+    privilege="privilege_group_1"
+    collection_name='collection_01'
+    db_name='default',
+)
+
+client.revoke_privilege_v2(
+    role_name="role_a",
+    privilege="ClusterReadOnly"
+    collection_name='*'
+    db_name='*',
+)
+
+
import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
+
+client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("Search")
+        .collectionName("collection_01")
+        .dbName("default")
+        .build());
+
+client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("privilege_group_1")
+        .collectionName("collection_01")
+        .dbName("default")
+        .build());
+
+client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
+        .roleName("role_a")
+        .privilege("ClusterReadOnly")
+        .collectionName("*")
+        .dbName("*")
+        .build());
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"
+
+client.RevokeV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
+
+client.RevokeV2(context.Background(), "role_a", "collection_01", "privielge_group_1", entity.WithOperatePrivilegeDatabase("default"))
+
+client.RevokeV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
+
+
curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "Search",
+    "collectionName": "collection_01",
+    "dbName":"default"
+}'
+
+curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "Search",
+    "collectionName": "collection_01",
+    "dbName":"default"
+}'
+
+curl --request POST \
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
+--header "Authorization: Bearer ${TOKEN}" \
+--header "Content-Type: application/json" \
+-d '{
+    "roleName": "role_a",
+    "privilege": "ClusterReadOnly",
+    "collectionName": "*",
+    "dbName":"*"
+}'
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/grant_roles.json b/localization/v2.5.x/site/ar/adminGuide/grant_roles.json new file mode 100644 index 000000000..75bce2e9c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/grant_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.grant_role(user_name=\"user_1\", role_name=\"role_a\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.GrantRoleReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nGrantRoleReq grantRoleReq = GrantRoleReq.builder()​\n .roleName(\"role_a\")​\n .userName(\"user_1\")​\n .build();​\nclient.grantRole(grantRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.grantRole({​\n username: 'user_1',​\n roleName: 'role_a'​\n })​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\",​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.describe_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.service.rbac.request.DescribeUserReq;​\nimport io.milvus.v2.service.rbac.response.DescribeUserResp;​\n​\nDescribeUserReq describeUserReq = DescribeUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nDescribeUserResp describeUserResp = client.describeUser(describeUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.describeUser({username: 'user_1'})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","{'user_name': 'user_1', 'roles': 'role_a'}​\n\n","from pymilvus import MilvusClient​\n​\nclient.revoke_role(​\n user_name='user_1',​\n role_name='role_a'​\n)​\n\n","import io.milvus.v2.service.rbac.request.RevokeRoleReq;​\n​\nclient.revokeRole(RevokeRoleReq.builder()​\n .userName(\"user_1\")​\n .roleName(\"role_a\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"roleName\": \"role_a\"​\n}'​\n\n"],"headingContent":"Grant Roles to Users​","anchorList":[{"label":"منح الأدوار للمستخدمين","href":"Grant-Roles-to-Users​","type":1,"isActive":false},{"label":"منح دور لمستخدم","href":"Grant-a-role-to-a-user​","type":2,"isActive":false},{"label":"وصف المستخدم","href":"Describe-user​","type":2,"isActive":false},{"label":"إبطال دور","href":"Revoke-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/grant_roles.md b/localization/v2.5.x/site/ar/adminGuide/grant_roles.md new file mode 100644 index 000000000..cae277fd5 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/grant_roles.md @@ -0,0 +1,203 @@ +--- +id: grant_roles.md +related_key: enable RBAC +summary: >- + بعد إنشاء دور ومنح امتيازات للدور، يمكنك منح الدور للمستخدمين حتى يتمكن + المستخدمون من الوصول إلى الموارد وتنفيذ الإجراءات التي تم تحديدها من قبل + الدور. يمكنك منح أدوار متعددة لمستخدم أو منح دور لعدة مستخدمين. يقدم هذا + الدليل كيفية منح الأدوار للمستخدمين. +title: منح الأدوار للمستخدمين +--- +

منح الأدوار للمستخدمين

بعد إنشاء دور ومنح امتيازات للدور، يمكنك منح الدور للمستخدمين حتى يتمكن المستخدمون من الوصول إلى الموارد وتنفيذ الإجراءات التي تم تحديدها من قبل الدور. يمكنك منح أدوار متعددة لمستخدم أو منح دور لعدة مستخدمين. يقدم هذا الدليل كيفية منح الأدوار للمستخدمين.

+

تم بالفعل منح المستخدم المدمج root في ميلفوس الدور admin الذي يتمتع بجميع الامتيازات. لا تحتاج إلى تعيين أي أدوار أخرى له.

+

منح دور لمستخدم

يوضح المثال التالي كيفية منح الدور role_a للمستخدم user_1.

+ +
from pymilvus import MilvusClient​
+​
+client = MilvusClient(​
+    uri="http://localhost:19530",​
+    token="root:Milvus"​
+)​
+​
+client.grant_role(user_name="user_1", role_name="role_a")​
+
+
+
import io.milvus.v2.client.ConnectConfig;​
+import io.milvus.v2.client.MilvusClientV2;​
+import io.milvus.v2.service.rbac.request.GrantRoleReq;​
+​
+String CLUSTER_ENDPOINT = "http://localhost:19530";​
+String TOKEN = "root:Milvus";​
+​
+​
+ConnectConfig connectConfig = ConnectConfig.builder()​
+    .uri(CLUSTER_ENDPOINT)​
+    .token(TOKEN)​
+    .build();​
+    ​
+MilvusClientV2 client = new MilvusClientV2(connectConfig);​
+​
+GrantRoleReq grantRoleReq = GrantRoleReq.builder()​
+        .roleName("role_a")​
+        .userName("user_1")​
+        .build();​
+client.grantRole(grantRoleReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+const address = "http://localhost:19530";​
+const token = "root:Milvus";​
+const client = new MilvusClient({address, token});​
+​
+milvusClient.grantRole({​
+   username: 'user_1',​
+   roleName: 'role_a'​
+ })​
+
+
+
export CLUSTER_ENDPOINT="http://localhost:19530"​
+export TOKEN="root:Milvus"​
+​
+curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "roleName": "role_a",​
+    "userName": "user_1"​
+}'​
+
+
+

وصف المستخدم

بمجرد أن تمنح دورًا لمستخدم، يمكنك التحقق مما إذا كانت عملية المنح ناجحة عبر الطريقة describe_user().

+

يوضح المثال التالي كيفية التحقق من دور (أدوار) المستخدم user_1.

+ +
from pymilvus import MilvusClient​
+​
+client.describe_user(user_name="user_1")​
+
+
+
import io.milvus.v2.service.rbac.request.DescribeUserReq;​
+import io.milvus.v2.service.rbac.response.DescribeUserResp;​
+​
+DescribeUserReq describeUserReq = DescribeUserReq.builder()​
+        .userName("user_1")​
+        .build();​
+DescribeUserResp describeUserResp = client.describeUser(describeUserReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+milvusClient.describeUser({username: 'user_1'})​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/describe" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "userName": "user_1"​
+}'​
+
+
+

فيما يلي مثال على الإخراج.

+
{'user_name': 'user_1', 'roles': 'role_a'}​
+
+
+

إبطال دور

يمكنك أيضًا إبطال دور تم تعيينه لمستخدم.

+

يوضح المثال التالي كيفية إبطال الدور role_a المخصص للمستخدم user_1.

+ +
from pymilvus import MilvusClient​
+​
+client.revoke_role(​
+    user_name='user_1',​
+    role_name='role_a'​
+)​
+
+
+
import io.milvus.v2.service.rbac.request.RevokeRoleReq;​
+​
+client.revokeRole(RevokeRoleReq.builder()​
+        .userName("user_1")​
+        .roleName("role_a")​
+        .build());​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "userName": "user_1",​
+    "roleName": "role_a"​
+}'​
+
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.json b/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.json new file mode 100644 index 000000000..b61897548 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.json @@ -0,0 +1 @@ +{"codeList":["rootCoord:\n maxGeneralCapacity: 65536\n","60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960\n","failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:\n"],"headingContent":"Limit Collection Counts","anchorList":[{"label":"الحد من عدد المجموعات","href":"Limit-Collection-Counts","type":1,"isActive":false},{"label":"خيارات التكوين","href":"Configuration-options","type":2,"isActive":false},{"label":"حساب عدد المجموعات","href":"Calculating-the-number-of-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.md b/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.md new file mode 100644 index 000000000..dfc78f51e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/limit_collection_counts.md @@ -0,0 +1,72 @@ +--- +id: limit_collection_counts.md +title: وضع حدود على عدد التحصيل +--- +

الحد من عدد المجموعات

يسمح مثيل Milvus بحد أقصى 65,536 مجموعة. ومع ذلك، قد يؤدي وجود عدد كبير جدًا من المجموعات إلى حدوث مشكلات في الأداء. لذلك، يوصى بالحد من عدد المجموعات التي تم إنشاؤها في مثيل Milvus.

+

يوفر هذا الدليل إرشادات حول كيفية تعيين حدود لعدد المجموعات في مثيل Milvus.

+

يختلف التكوين باختلاف طريقة تثبيت مثيل Milvus.

+
    +
  • لمثيلات Milvus المثبتة باستخدام مخططات Helm

    +

    أضف التكوين إلى الملف values.yaml ضمن القسم config. للحصول على التفاصيل، راجع تكوين Milvus باستخدام مخططات Helm Charts.

  • +
  • لمثيلات Milvus المثبتة باستخدام Docker Compose

    +

    أضف التكوين إلى الملف milvus.yaml الذي استخدمته لبدء تشغيل مثيل Milvus. للحصول على التفاصيل، راجع تكوين Milvus باستخدام Docker Compose.

  • +
  • لمثيلات Milvus المثبتة باستخدام المشغل

    +

    أضف التكوين إلى قسم spec.components في المورد المخصص Milvus. للحصول على التفاصيل، راجع تكوين Milvus مع المشغل.

  • +
+

خيارات التكوين

rootCoord:
+    maxGeneralCapacity: 65536
+
+

تقوم المعلمة maxGeneralCapacity بتعيين الحد الأقصى لعدد المجموعات التي يمكن لمثيل Milvus الحالي الاحتفاظ بها. القيمة الافتراضية هي 65536.

+

حساب عدد المجموعات

في المجموعة، يمكنك إعداد أجزاء وأقسام متعددة. الأجزاء هي وحدات منطقية تستخدم لتوزيع عمليات كتابة البيانات بين عقد بيانات متعددة. أما الأقسام فهي وحدات منطقية تستخدم لتحسين كفاءة استرجاع البيانات عن طريق تحميل مجموعة فرعية فقط من بيانات المجموعة. عند حساب عدد المجموعات في مثيل Milvus الحالي، تحتاج أيضًا إلى حساب الأجزاء والأقسام.

+

على سبيل المثال، لنفترض أنك قمت بالفعل بإنشاء 100 مجموعة، مع وجود جزأين و4 أقسام في 60 منها وجزء واحد و12 قسمًا في الـ40 مجموعة المتبقية. يمكن تحديد العدد الإجمالي لوحدات التجميع (محسوبًا على shards × partitions) على النحو التالي:

+
60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960
+
+

في هذا المثال، يمثل المجموع المحسوب البالغ 960 وحدة تجميع يمثل الاستخدام الحالي. يحدد maxGeneralCapacity الحد الأقصى لعدد وحدات التجميع التي يمكن أن يدعمها المثيل، والذي يتم تعيينه على 65536 افتراضيًا. وهذا يعني أن المثيل يمكنه استيعاب ما يصل إلى 65,536 وحدة تجميع. إذا تجاوز العدد الإجمالي هذا الحد، سيعرض النظام رسالة الخطأ التالية:

+
failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:
+
+

لتجنب هذا الخطأ، يمكنك إما تقليل عدد الأجزاء أو الأقسام في المجموعات الحالية أو الجديدة أو حذف بعض المجموعات أو زيادة القيمة maxGeneralCapacity.

diff --git a/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.json b/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.json new file mode 100644 index 000000000..f918e27a1 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: \n msgStreamType: 'natsmq'\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n pulsar: # Optional\n # Whether (=true) to use an existed external pulsar as specified in the field endpoints or \n # (=false) create a new pulsar inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external pulsar endpoints if external=true\n endpoints:\n - 192.168.1.1:6650\n components: {}\n config: {} \n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n pulsar:\n inCluster:\n values:\n components:\n autorecovery: false\n zookeeper:\n replicaCount: 1\n bookkeeper:\n replicaCount: 1\n resoureces:\n limit:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n broker:\n replicaCount: 1\n configData:\n ## Enable `autoSkipNonRecoverableData` since bookkeeper is running\n ## without persistence\n autoSkipNonRecoverableData: \"true\"\n managedLedgerDefaultEnsembleSize: \"1\"\n managedLedgerDefaultWriteQuorum: \"1\"\n managedLedgerDefaultAckQuorum: \"1\"\n proxy:\n replicaCount: 1\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n config:\n kafka:\n # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL \n securityProtocol: PLAINTEXT\n # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512\n saslMechanisms: PLAIN\n saslUsername: \"\"\n saslPassword: \"\"\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n msgStreamType: \"kafka\"\n kafka:\n external: true\n brokerList: \n - \"kafkaBrokerAddr1:9092\"\n - \"kafkaBrokerAddr2:9092\"\n # ...\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec: \n dependencies:\n msgStreamType: \"kafka\"\n kafka:\n inCluster: \n values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka\n components: {}\n config: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Message Storage with Milvus Operator","anchorList":[{"label":"تكوين تخزين الرسائل مع مشغل Milvus","href":"Configure-Message-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":2,"isActive":false},{"label":"تكوين RocksMQ","href":"Configure-RocksMQ","type":2,"isActive":false},{"label":"تكوين NATS","href":"Configure-NATS","type":2,"isActive":false},{"label":"تكوين بولسار","href":"Configure-Pulsar","type":2,"isActive":false},{"label":"تكوين كافكا","href":"Configure-Kafka","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.md b/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.md new file mode 100644 index 000000000..3dffb7135 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/message_storage_operator.md @@ -0,0 +1,348 @@ +--- +id: message_storage_operator.md +title: تكوين تخزين الرسائل مع مشغل Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: تعرف على كيفية تكوين تخزين الرسائل باستخدام مشغل Milvus. +--- +

تكوين تخزين الرسائل مع مشغل Milvus

يستخدم Milvus RocksMQ أو Pulsar أو Kafka لإدارة سجلات التغييرات الأخيرة، وإخراج سجلات الدفق، وتوفير اشتراكات السجل. يقدم هذا الموضوع كيفية تكوين تبعيات تخزين الرسائل عند تثبيت Milvus مع مشغل Milvus. لمزيد من التفاصيل، راجع تكوين تخزين الرسائل مع مشغل Milvus في مستودع مشغل Milvus.

+

يفترض هذا الموضوع أنك قمت بنشر مشغل Milvus.

+
راجع نشر مشغل Milvus لمزيد من المعلومات.
+

تحتاج إلى تحديد ملف تكوين لاستخدام مشغل Milvus لبدء تشغيل مجموعة Milvus.

+
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
+
+

تحتاج فقط إلى تحرير قالب التعليمات البرمجية في milvus_cluster_default.yaml لتكوين تبعيات الطرف الثالث. تقدم الأقسام التالية كيفية تكوين تخزين الكائنات و etcd وPulsar على التوالي.

+

قبل أن تبدأ

يوضح الجدول أدناه ما إذا كانت RocksMQ و NATS و Pulsar و Kafka مدعومة في وضع Milvus المستقل ووضع المجموعة.

+ + + + + + + + +
RocksMQناتسبولساركافكا
الوضع المستقل✔️✔️✔️✔️
الوضع العنقودي✖️✖️✔️✔️
+

هناك أيضًا قيود أخرى لتحديد تخزين الرسائل:

+
    +
  • يتم دعم مخزن رسائل واحد فقط لمثيل Milvus واحد. ومع ذلك لا يزال لدينا توافق مع الإصدارات السابقة مع تعيين مخازن رسائل متعددة لمثيل واحد. الأولوية كما يلي:
      +
    • الوضع المستقل: RocksMQ (افتراضي)> بولسار > كافكا
    • +
    • الوضع العنقودي: بولسار (افتراضي)> كافكا > كافكا
    • +
    • لا تشارك النتات المقدمة في 2.3 في قواعد الأولوية هذه للتوافق مع الإصدارات السابقة.
    • +
  • +
  • لا يمكن تغيير تخزين الرسائل أثناء تشغيل نظام ميلفوس.
  • +
  • يتم دعم إصدار كافكا 2.x أو 3.x فقط.
  • +
+

تكوين RocksMQ

RocksMQ هو مخزن الرسائل الافتراضي في نظام Milvus المستقل.

+
+

في الوقت الحالي، يمكنك فقط تكوين RocksMQ كمخزن للرسائل في نظام Milvus المستقل باستخدام مشغل Milvus.

+
+

مثال

يقوم المثال التالي بتكوين خدمة RocksMQ.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: milvus
+spec:
+  dependencies: {}
+  components: {}
+  config: {}
+
+

تكوين NATS

NATS هو مخزن رسائل بديل ل NATS.

+

مثال

يقوم المثال التالي بتكوين خدمة NATS.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: milvus
+spec:
+  dependencies: 
+    msgStreamType: 'natsmq'
+    natsmq:
+      # server side configuration for natsmq.
+      server: 
+        # 4222 by default, Port for nats server listening.
+        port: 4222 
+        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
+        storeDir: /var/lib/milvus/nats 
+        # (B) 16GB by default, Maximum size of the 'file' storage.
+        maxFileStore: 17179869184 
+        # (B) 8MB by default, Maximum number of bytes in a message payload.
+        maxPayload: 8388608 
+        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
+        maxPending: 67108864 
+        # (√ms) 4s by default, waiting for initialization of natsmq finished.
+        initializeTimeout: 4000 
+        monitor:
+          # false by default, If true enable debug log messages.
+          debug: false 
+          # true by default, If set to false, log without timestamps.
+          logTime: true 
+          # no log file by default, Log file path relative to.. .
+          logFile: 
+          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
+          logSizeLimit: 0 
+        retention:
+          # (min) 3 days by default, Maximum age of any message in the P-channel.
+          maxAge: 4320 
+          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
+          maxBytes:
+          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
+          maxMsgs: 
+  components: {}
+  config: {}
+
+

لترحيل تخزين الرسائل من RocksMQ إلى NATS، قم بما يلي:

+
    +
  1. أوقف جميع عمليات DDL.

  2. +
  3. قم باستدعاء واجهة برمجة التطبيقات FlushAll ثم أوقف Milvus بمجرد انتهاء تنفيذ استدعاء واجهة برمجة التطبيقات.

  4. +
  5. تغيير msgStreamType إلى natsmq وإجراء التغييرات اللازمة على إعدادات NATS في spec.dependencies.natsmq.

  6. +
  7. ابدأ تشغيل ميلفوس مرة أخرى وتحقق مما إذا كان:

    +
      +
    • إدخال سجل يقرأ mqType=natsmq موجود في السجلات.
    • +
    • يوجد دليل باسم jetstream في الدليل المحدد في spec.dependencies.natsmq.server.storeDir.
    • +
  8. +
  9. (اختياري) قم بالنسخ الاحتياطي وتنظيف ملفات البيانات في دليل تخزين RocksMQ.

  10. +
+
+

الاختيار بين RocksMQ و NATS؟

+

يستخدم RocksMQ CGO للتفاعل مع RocksDB ويدير الذاكرة بنفسه، بينما يقوم NATS المدمج في تثبيت Milvus بتفويض إدارة الذاكرة إلى جامع القمامة الخاص بـ Go (GC).

+

في السيناريو الذي تكون فيه حزمة البيانات أصغر من 64 كيلوبايت، يتفوق RocksDB من حيث استخدام الذاكرة واستخدام وحدة المعالجة المركزية ووقت الاستجابة. من ناحية أخرى، إذا كانت حزمة البيانات أكبر من 64 كيلوبايت، يتفوق NATS من حيث وقت الاستجابة مع وجود ذاكرة كافية وجدولة GC مثالية.

+

في الوقت الحالي، يُنصح باستخدام NATS للتجارب فقط.

+
+

تكوين بولسار

يدير Pulsar سجلات التغييرات الأخيرة، ويخرج سجلات الدفق، ويوفر اشتراكات السجل. يتم دعم تكوين Pulsar لتخزين الرسائل في كل من Milvus المستقل و Milvus cluster. ومع ذلك، مع مشغل Milvus، يمكنك فقط تكوين Pulsar كمخزن للرسائل لمجموعة Milvus العنقودية. أضف الحقول المطلوبة ضمن spec.dependencies.pulsar لتكوين Pulsar.

+

pulsar يدعم external و inCluster.

+

بولسار خارجي

external يشير إلى استخدام خدمة بولسار خارجية. تتضمن الحقول المستخدمة لتكوين خدمة بولسار خارجية ما يلي:

+
    +
  • external: تشير القيمة true إلى أن ميلفوس يستخدم خدمة بولسار خارجية.
  • +
  • endpoints: نقاط نهاية بولسار.
  • +
+

مثال

يقوم المثال التالي بتكوين خدمة بولسار خارجية.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  dependencies: # Optional
+    pulsar: # Optional
+      # Whether (=true) to use an existed external pulsar as specified in the field endpoints or 
+      # (=false) create a new pulsar inside the same kubernetes cluster for milvus.
+      external: true # Optional default=false
+      # The external pulsar endpoints if external=true
+      endpoints:
+      - 192.168.1.1:6650
+  components: {}
+  config: {}           
+
+

بولسار داخلي

inCluster يشير إلى أنه عند بدء تشغيل مجموعة Milvus، تبدأ خدمة Pulsar تلقائياً في المجموعة.

+

مثال

يقوم المثال التالي بتكوين خدمة Pulsar داخلية.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  dependencies:
+    pulsar:
+      inCluster:
+        values:
+          components:
+            autorecovery: false
+          zookeeper:
+            replicaCount: 1
+          bookkeeper:
+            replicaCount: 1
+            resoureces:
+              limit:
+                cpu: '4'
+              memory: 8Gi
+            requests:
+              cpu: 200m
+              memory: 512Mi
+          broker:
+            replicaCount: 1
+            configData:
+              ## Enable `autoSkipNonRecoverableData` since bookkeeper is running
+              ## without persistence
+              autoSkipNonRecoverableData: "true"
+              managedLedgerDefaultEnsembleSize: "1"
+              managedLedgerDefaultWriteQuorum: "1"
+              managedLedgerDefaultAckQuorum: "1"
+          proxy:
+            replicaCount: 1
+  components: {}
+  config: {}            
+
+
يحدد هذا المثال أعداد النسخ المتماثلة لكل مكون من مكونات Pulsar، وموارد الحوسبة الخاصة ب Pulsar BookKeeper، وتكوينات أخرى.
+
ابحث عن عناصر التكوين الكاملة لتكوين خدمة Pulsar الداخلية في القيم.yaml. أضف عناصر التكوين حسب الحاجة ضمن pulsar.inCluster.values كما هو موضح في المثال السابق.
+

بافتراض أن ملف التكوين اسمه milvuscluster.yaml ، قم بتشغيل الأمر التالي لتطبيق التكوين.

+
kubectl apply -f milvuscluster.yaml
+
+

تكوين كافكا

Pulsar هو مخزن الرسائل الافتراضي في مجموعة Milvus. إذا كنت تريد استخدام كافكا، أضف الحقل الاختياري msgStreamType لتكوين كافكا.

+

kafka يدعم external و inCluster.

+

كافكا الخارجية

external يشير إلى استخدام خدمة كافكا خارجية.

+

تتضمن الحقول المستخدمة لتكوين خدمة كافكا خارجية ما يلي:

+
    +
  • external: تشير القيمة true إلى أن ميلفوس يستخدم خدمة كافكا خارجية.
  • +
  • brokerList: قائمة الوسطاء لإرسال الرسائل إليهم.
  • +
+

مثال

يقوم المثال التالي بتكوين خدمة كافكا خارجية.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  config:
+    kafka:
+      # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL 
+      securityProtocol: PLAINTEXT
+      # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512
+      saslMechanisms: PLAIN
+      saslUsername: ""
+      saslPassword: ""
+  # Omit other fields ...
+  dependencies:
+    # Omit other fields ...
+    msgStreamType: "kafka"
+    kafka:
+      external: true
+      brokerList: 
+        - "kafkaBrokerAddr1:9092"
+        - "kafkaBrokerAddr2:9092"
+        # ...
+
+
+

يتم دعم تكوينات SASL في المشغل الإصدار 0.8.5 أو إصدار أعلى.

+
+

كافكا الداخلية

inCluster يشير إلى أنه عند بدء تشغيل مجموعة Milvus، تبدأ خدمة كافكا تلقائيًا في المجموعة.

+

مثال

يقوم المثال التالي بتكوين خدمة كافكا داخلية.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec: 
+  dependencies:
+    msgStreamType: "kafka"
+    kafka:
+      inCluster: 
+        values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka
+  components: {}
+  config: {}
+
+

ابحث عن عناصر التكوين الكاملة لتكوين خدمة كافكا الداخلية هنا. أضف عناصر التكوين حسب الحاجة ضمن kafka.inCluster.values.

+

على افتراض أن ملف التكوين اسمه milvuscluster.yaml ، قم بتشغيل الأمر التالي لتطبيق التكوين.

+
kubectl apply -f milvuscluster.yaml
+
+

ما التالي

تعرف على كيفية تكوين تبعيات Milvus الأخرى باستخدام مشغل Milvus:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.json b/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.json new file mode 100644 index 000000000..84bf4d99a --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","kind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n etcd: # Optional\n # Whether (=true) to use an existed external etcd as specified in the field endpoints or \n # (=false) create a new etcd inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external etcd endpoints if external=true\n endpoints:\n - 192.168.1.1:2379\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n etcd:\n inCluster:\n values:\n replicaCount: 5\n resources:\n limits: \n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Meta Storage with Milvus Operator","anchorList":[{"label":"تكوين التخزين التعريفي مع مشغل Milvus","href":"Configure-Meta-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"تكوين إلخd","href":"Configure-etcd","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.md b/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.md new file mode 100644 index 000000000..ae32c69da --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/meta_storage_operator.md @@ -0,0 +1,117 @@ +--- +id: meta_storage_operator.md +title: تكوين التخزين التعريفي مع مشغل Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: تعرف على كيفية تكوين التخزين التعريفي باستخدام مشغل Milvus. +--- +

تكوين التخزين التعريفي مع مشغل Milvus

يستخدم Milvus موقع etcd لتخزين البيانات الوصفية. يقدم هذا الموضوع كيفية تكوين تبعية تخزين التعريف عند تثبيت Milvus مع مشغل Milvus. لمزيد من التفاصيل، راجع تكوين التخزين الوصفي مع مشغل Milvus في مستودع مشغل Milvus.

+

يفترض هذا الموضوع أنك قمت بنشر مشغل Milvus.

+
راجع نشر مشغل Milvus لمزيد من المعلومات.
+

تحتاج إلى تحديد ملف تكوين لاستخدام مشغل Milvus لبدء تشغيل مجموعة Milvus.

+
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
+
+

تحتاج فقط إلى تحرير قالب التعليمات البرمجية في milvus_cluster_default.yaml لتكوين تبعيات الطرف الثالث. تقدم الأقسام التالية كيفية تكوين تخزين الكائنات و etcd وPulsar على التوالي.

+

تكوين إلخd

أضف الحقول المطلوبة ضمن spec.dependencies.etcd لتكوين etcd.

+

etcd يدعم external و inCluster.

+

تتضمن الحقول المستخدمة لتكوين خدمة إلخd الخارجية ما يلي:

+
    +
  • external: تشير القيمة true إلى أن ميلفوس يستخدم خدمة إلخd خارجية.
  • +
  • endpoints: نقاط نهاية خدمة إلخd.
  • +
+

إلخd الخارجية

مثال

يقوم المثال التالي بتكوين خدمة إلخd خارجية.

+
kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  dependencies: # Optional
+    etcd: # Optional
+      # Whether (=true) to use an existed external etcd as specified in the field endpoints or 
+      # (=false) create a new etcd inside the same kubernetes cluster for milvus.
+      external: true # Optional default=false
+      # The external etcd endpoints if external=true
+      endpoints:
+      - 192.168.1.1:2379
+  components: {}
+  config: {}
+
+

داخلية إلخd

inCluster يشير إلى أنه عند بدء تشغيل مجموعة Milvus، تبدأ خدمة إلخd تلقائيًا في المجموعة.

+

مثال

يقوم المثال التالي بتهيئة خدمة إلخd داخلية.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  dependencies:
+    etcd:
+      inCluster:
+        values:
+          replicaCount: 5
+          resources:
+            limits: 
+              cpu: '4'
+              memory: 8Gi
+            requests:
+              cpu: 200m
+              memory: 512Mi
+  components: {}
+  config: {}              
+
+
يحدد المثال السابق عدد النسخ المتماثلة على أنه 5 ويحدد موارد الحوسبة لخدمة إلخd.
+
ابحث عن عناصر التكوين الكاملة لتهيئة خدمة etcd داخلية في values.yaml. أضف عناصر التكوين حسب الحاجة ضمن etcd.inCluster.values كما هو موضح في المثال السابق.
+

بافتراض أن ملف التكوين اسمه milvuscluster.yaml ، قم بتشغيل الأمر التالي لتطبيق التكوين.

+
kubectl apply -f milvuscluster.yaml
+
+

ما التالي

تعرف على كيفية تكوين تبعيات Milvus الأخرى باستخدام مشغل Milvus:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/alert.json b/localization/v2.5.x/site/ar/adminGuide/monitor/alert.json new file mode 100644 index 000000000..8c74bebf3 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/alert.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Create an Alert for Milvus Services","anchorList":[{"label":"إنشاء تنبيه لخدمات ملفوس","href":"Create-an-Alert-for-Milvus-Services","type":1,"isActive":false},{"label":"سيناريوهات إنشاء التنبيهات","href":"Scenarios-for-creating-alerts","type":2,"isActive":false},{"label":"إعداد التنبيهات","href":"Set-up-alerts","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/alert.md b/localization/v2.5.x/site/ar/adminGuide/monitor/alert.md new file mode 100644 index 000000000..ea2dc4455 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/alert.md @@ -0,0 +1,132 @@ +--- +id: alert.md +title: إنشاء تنبيه +related_key: monitor and alert. +summary: تعرف على كيفية إنشاء تنبيه لخدمات Milvus في Grafana. +--- +

إنشاء تنبيه لخدمات ملفوس

يقدم هذا الموضوع آلية التنبيه لخدمات ملفوس ويشرح لماذا ومتى وكيف يمكن إنشاء تنبيهات في ملفوس.

+

من خلال إنشاء التنبيهات، يمكنك تلقي تنبيهات عندما تتجاوز قيمة مقياس معين الحد الذي قمت بتحديده مسبقاً.

+

على سبيل المثال، يمكنك إنشاء تنبيه وتعيين 80 ميغابايت كقيمة قصوى لاستخدام الذاكرة من قبل مكونات Milvus. إذا تجاوز الاستخدام الفعلي الرقم المحدد مسبقًا، ستتلقى تنبيهات لتذكيرك بأن استخدام الذاكرة بواسطة مكون Milvus يتجاوز 80 ميغابايت. وبناءً على التنبيه، يمكنك بعد ذلك تعديل تخصيص الموارد وفقاً لذلك وفي الوقت المناسب لضمان توفر الخدمة.

+

سيناريوهات إنشاء التنبيهات

فيما يلي بعض السيناريوهات الشائعة التي تحتاج فيها إلى إنشاء تنبيه لـ

+
    +
  • استخدام وحدة المعالجة المركزية أو الذاكرة من قبل مكونات Milvus مرتفع جداً.
  • +
  • انخفاض مساحة القرص في كبسولات مكونات Milvus.
  • +
  • إعادة تشغيل كبسولات مكونات Milvus بشكل متكرر جداً.
  • +
+

تتوفر المقاييس التالية لتكوين التنبيهات:

+ + + + + + + + + + + +
القياسالوصفوحدة القياس
استخدام وحدة المعالجة المركزيةاستخدام وحدة المعالجة المركزية بواسطة مكونات Milvus التي يشار إليها بوقت تشغيل وحدة المعالجة المركزية.الثانية
الذاكرةموارد الذاكرة التي تستهلكها مكونات Milvus.ميغابايت
جوروتيناتالأنشطة المنفذة المتزامنة في لغة GO./
خيوط نظام التشغيلخيوط، أو عمليات خفيفة الوزن في نظام التشغيل./
العمليات المفتوحة Fdsالعدد الحالي لواصفات الملفات المستخدمة./
+

إعداد التنبيهات

يأخذ هذا الدليل مثالاً لإنشاء تنبيه لاستخدام ذاكرة مكونات Milvus. لإنشاء أنواع أخرى من التنبيهات، يرجى تعديل الأوامر وفقاً لذلك. إذا واجهتك أي مشاكل أثناء العملية، لا تتردد في طرحها في منتدى ميلفوس أو بدء مناقشة على سلاك.

+

المتطلبات الأساسية

يفترض هذا البرنامج التعليمي أنك قمت بتثبيت وتهيئة غرافانا. إذا لم يكن كذلك، نوصي بقراءة دليل المراقبة.

+

1. إضافة استعلام جديد

لإضافة تنبيه لاستخدام الذاكرة لمكونات ميلفوس، قم بتحرير لوحة الذاكرة. ثم، أضف استعلامًا جديدًا بالمقياس: process_resident_memory_bytes{app_kubernetes_io_name="milvus", app_kubernetes_io_instance=~"my-release", namespace="default"}

+

+ + Alert_metric + تنبيه_مقياس

+

2. احفظ لوحة التحكم

احفظ لوحة التحكم، وانتظر بضع دقائق لرؤية التنبيه.

+

+ + Alert_dashboard + لوحة_التنبيه

+

لا يدعم استعلام تنبيه Grafana متغيرات القالب. لذلك، يجب إضافة استعلام ثانٍ بدون أي متغيرات قالب في التسميات. يتم تسمية الاستعلام الثاني باسم "A" افتراضيًا. يمكنك إعادة تسميته بالنقر على القائمة المنسدلة.

+

+ + Alert_query + تنبيه_استعلام

+

3. إضافة إشعارات التنبيه

لتلقي إشعارات التنبيه، أضف "قناة تنبيه". ثم، حدد القناة في الحقل "إرسال إلى".

+

+ + Alert_notification + تنبيه_التنبيه

+

إذا تم إنشاء التنبيه وتشغيله بنجاح، ستتلقى الإشعار كما هو موضح في لقطة الشاشة أدناه.

+

+ + Notification_message + رسالة_التنبيه

+

لحذف تنبيه، انتقل إلى لوحة "تنبيه" وانقر على زر الحذف.

+

+ + Delete_alert + حذف_تنبيه

+

الخطوة التالية

diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.json b/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.json new file mode 100644 index 000000000..bd1c23adf --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.json @@ -0,0 +1 @@ +{"codeList":["helm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n\nminio:\n enabled: true\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n storage:\n bucketNames:\n chunks: loki-chunks\n ruler: loki-ruler\n admin: loki-admin\n type: 's3'\n s3:\n endpoint: s3.us-west-2.amazonaws.com\n region: us-west-2\n secretAccessKey: \n accessKeyId: \n","kubectl create ns loki\nhelm install --values loki.yaml loki grafana/loki -n loki\n","config:\n clients:\n - url: http://loki-gateway/loki/api/v1/push\n","helm install --values promtail.yaml promtail grafana/promtail -n loki\n","kubectl create ns monitoring\nhelm install my-grafana grafana/grafana --namespace monitoring\n","kubectl get secret --namespace monitoring my-grafana -o jsonpath=\"{.data.admin-password}\" | base64 --decode ; echo\n","export POD_NAME=$(kubectl get pods --namespace monitoring -l \"app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana\" -o jsonpath=\"{.items[0].metadata.name}\")\nkubectl --namespace monitoring port-forward $POD_NAME 3000\n"],"headingContent":"Configure Grafana Loki","anchorList":[{"label":"تكوين Grafana Loki","href":"Configure-Grafana-Loki","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"نشر لوكي","href":"Deploy-Loki","type":2,"isActive":false},{"label":"نشر برومتيل","href":"Deploy-Promtail","type":2,"isActive":false},{"label":"الاستعلام عن السجلات باستخدام غرافانا","href":"Query-Logs-with-Grafana","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.md b/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.md new file mode 100644 index 000000000..1a0990fea --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/configure_grafana_loki.md @@ -0,0 +1,174 @@ +--- +id: configure_grafana_loki.md +title: تكوين Grafana Loki +summary: >- + يصف هذا الموضوع كيفية جمع السجلات باستخدام Loki وسجلات الاستعلام لمجموعة + Milvus باستخدام Grafana. +--- +

تكوين Grafana Loki

يوفر هذا الدليل إرشادات حول كيفية تكوين Loki لتجميع السجلات و Grafana للاستعلام عن السجلات وعرضها لمجموعة Milvus.

+

في هذا الدليل، سوف تتعلم كيفية:

+
    +
  • نشر Loki و Promtail على مجموعة Milvus باستخدام Helm.
  • +
  • تكوين تخزين الكائنات ل Loki.
  • +
  • الاستعلام عن السجلات باستخدام غرافانا.
  • +
+

المتطلبات الأساسية

+

نشر لوكي

لوكي هو نظام تجميع سجلات مستوحى من بروميثيوس. انشر Loki باستخدام Helm لجمع السجلات من مجموعة ميلفوس العنقودية.

+

1. إضافة مستودع المخططات البيانية لـ Grafana's Helm

أضف مستودع مخططات Grafana إلى Helm وقم بتحديثه:

+
helm repo add grafana https://grafana.github.io/helm-charts
+helm repo update
+
+

2. تكوين تخزين الكائنات لـ Loki

اختر أحد خيارات التخزين التالية وأنشئ ملف تكوين loki.yaml:

+
    +
  • الخيار 1: استخدام MinIO للتخزين

    +
    loki:
    +  commonConfig:
    +    replication_factor: 1
    +  auth_enabled: false
    +
    +minio:
    +  enabled: true
    +
  • +
  • الخيار 2: استخدام AWS S3 للتخزين

    +

    في المثال التالي، استبدل <accessKey> و <keyId> بمفتاح ومعرف الوصول إلى S3 الخاص بك، و s3.endpoint بنقطة نهاية S3، و s3.region بمنطقة S3.

    +
    loki:
    +  commonConfig:
    +    replication_factor: 1
    +  auth_enabled: false
    +  storage:
    +    bucketNames:
    +      chunks: loki-chunks
    +      ruler: loki-ruler
    +      admin: loki-admin
    +    type: 's3'
    +    s3:
    +      endpoint: s3.us-west-2.amazonaws.com
    +      region: us-west-2
    +      secretAccessKey: <accessKey>
    +      accessKeyId: <keyId>
    +
  • +
+

3. تثبيت Loki

قم بتشغيل الأوامر التالية لتثبيت Loki:

+
kubectl create ns loki
+helm install --values loki.yaml loki grafana/loki -n loki
+
+

نشر برومتيل

Promtail هو وكيل جمع السجلات لـ Loki. يقرأ السجلات من قرون ميلفوس ويرسلها إلى Loki.

+

1. إنشاء تكوين برومتيل

قم بإنشاء ملف تكوين promtail.yaml:

+
config:
+  clients:
+    - url: http://loki-gateway/loki/api/v1/push
+
+

2. تثبيت برومتيل

تثبيت Promtail باستخدام Helm:

+
helm install  --values promtail.yaml promtail grafana/promtail -n loki
+
+

الاستعلام عن السجلات باستخدام غرافانا

انشر Grafana وقم بتكوينه للاتصال بـ Loki للاستعلام عن السجلات.

+

1. نشر غرافانا

قم بتثبيت غرافانا باستخدام الأوامر التالية:

+
kubectl create ns monitoring
+helm install my-grafana grafana/grafana --namespace monitoring
+
+

قبل أن تتمكن من الوصول إلى جرافانا، تحتاج إلى استرداد كلمة المرور admin:

+
kubectl get secret --namespace monitoring my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
+
+

ثم، قم بإعادة توجيه منفذ Grafana إلى جهازك المحلي:

+
export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana" -o jsonpath="{.items[0].metadata.name}")
+kubectl --namespace monitoring port-forward $POD_NAME 3000
+
+

2. إضافة لوكي كمصدر بيانات في جرافانا

بمجرد تشغيل Grafana، تحتاج إلى إضافة Loki كمصدر بيانات للاستعلام عن السجلات.

+
    +
  1. افتح متصفح ويب وانتقل إلى 127.0.0.1:3000. قم بتسجيل الدخول باستخدام اسم المستخدم admin وكلمة المرور التي تم الحصول عليها مسبقًا.
  2. +
  3. في القائمة اليمنى، اختر اتصالات > إضافة اتصال جديد.
  4. +
  5. في الصفحة التي تظهر، اختر Loki كنوع مصدر البيانات. يمكنك إدخال لوكي في شريط البحث للعثور على مصدر البيانات.
  6. +
  7. في إعدادات مصدر بيانات Loki، حدد الاسم وعنوان URL، ثم انقر فوق حفظ واختبار.
  8. +
+

+ + DataSource + مصدر البيانات

+

3. الاستعلام عن سجلات ميلفوس

بعد إضافة Loki كمصدر للبيانات، استعلم عن سجلات ميلفوس في غرافانا:

+
    +
  1. في قائمة الجانب الأيسر، انقر فوق استكشاف.
  2. +
  3. في الزاوية العلوية اليسرى من الصفحة، اختر مصدر بيانات لوكي.
  4. +
  5. استخدم متصفح التسمية لتحديد التسميات والاستعلام عن السجلات.
  6. +
+

+ + Query + استعلام

diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.json b/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.json new file mode 100644 index 000000000..e2f87c777 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Metrics Dashboard","anchorList":[{"label":"لوحة معلومات مقاييس ميلفوس","href":"Milvus-Metrics-Dashboard","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.md b/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.md new file mode 100644 index 000000000..7a6aa50f5 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/metrics_dashboard.md @@ -0,0 +1,196 @@ +--- +id: metrics_dashboard.md +title: لوحة معلومات مقاييس ميلفوس +summary: يقدم هذا الموضوع مقاييس المراقبة المعروضة في لوحة معلومات Milvus Dashboard. +--- +

لوحة معلومات مقاييس ميلفوس

يُخرج Milvus قائمة بمقاييس مفصلة متسلسلة زمنيًا أثناء وقت التشغيل. يمكنك استخدام Prometheus و Grafana لتصور المقاييس. يقدم هذا الموضوع مقاييس المراقبة المعروضة في لوحة عدادات Grafana Milvus Dashboard.

+

وحدة الوقت في هذا الموضوع هي المللي ثانية. وتشير "النسبة المئوية 99 في المائة" في هذا الموضوع إلى حقيقة أن 99 في المائة من إحصائيات الوقت يتم التحكم فيها ضمن قيمة معينة.

+

نوصي بقراءة نظرة عامة على إطار عمل مراقبة Milvus لفهم مقاييس Prometheus أولاً.

+

الوكيل

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
معدل عدد ناقلات البحثمتوسط عدد المتجهات التي تم الاستعلام عنها في الثانية من قبل كل وكيل خلال الدقيقتين الماضيتين.sum(increase(milvus_proxy_search_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_search_vectors_countالعدد المتراكم للمتجهات التي تم الاستعلام عنها.
معدل عدد ناقلات الإدراجمتوسط عدد النواقل التي تم إدراجها في الثانية الواحدة بواسطة كل وكيل خلال الدقيقتين الماضيتين.sum(increase(milvus_proxy_insert_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_insert_vectors_countالعدد المتراكم للناقلات التي تم إدراجها.
زمن انتقال البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 من زمن الاستجابة لتلقي طلبات البحث والاستعلام من قبل كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_proxy_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
milvus_proxy_sq_latencyزمن انتقال طلبات البحث والاستعلام.
زمن انتقال بحث المجموعةمتوسط زمن الاستجابة والنسبة المئوية الـ 99 لزمن الاستجابة لتلقي طلبات البحث والاستعلام إلى مجموعة محددة بواسطة كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
avg:
sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
milvus_proxy_collection_sq_latency_sumزمن الوصول لطلبات البحث والاستعلام إلى مجموعة محددة من قبل كل وكيل
زمن الانتقالمتوسط زمن الكمون والنسبة المئوية الـ 99 لزمن الاستجابة لطلبات الطفرات من قبل كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_proxy_mutation_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
milvus_proxy_mutation_latency_sumزمن انتقال طلبات الطفرات.
زمن انتقال مجموعة الطفراتمتوسط زمن الاستجابة والنسبة المئوية الـ 99 لزمن الاستجابة لتلقي طلبات الطفرات إلى مجموعة محددة من قبل كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
متوسط:
sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
milvus_proxy_collection_sq_latency_sumزمن انتقال طلبات الطفرات إلى مجموعة محددة
زمن انتظار نتائج البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 لزمن الاستجابة بين إرسال طلبات البحث والاستعلام وتلقي النتائج بواسطة الوكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_wait_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_proxy_sq_wait_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_wait_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
milvus_proxy_sq_wait_result_latencyزمن الاستجابة بين إرسال طلبات البحث والاستعلام واستلام النتائج.
تقليل زمن انتقال نتائج البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 لزمن الاستجابة لتجميع نتائج البحث والاستعلام عن طريق الوكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_reduce_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_sq_reduce_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_reduce_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
milvus_proxy_sq_reduce_result_latencyزمن انتقال تجميع نتائج البحث والاستعلام التي تم إرجاعها بواسطة كل عقدة استعلام.
زمن انتقال نتائج البحث عن طريق فك التشفيرمتوسط زمن الاستجابة والنسبة المئوية الـ 99 لزمن الاستجابة لفك تشفير نتائج البحث والاستعلام حسب الوكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_decode_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_sq_decode_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_decode_resultlatency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
milvus_proxy_sq_decode_result_latencyزمن الانتقال لفك تشفير كل نتيجة بحث واستعلام.
عدد كائنات دفق الرسائلمتوسط عدد كائنات دفق الرسائل والحد الأقصى والأدنى لعدد كائنات دفق الرسائل التي تم إنشاؤها بواسطة كل وكيل على الموضوع الفعلي المقابل له خلال الدقيقتين الماضيتين.avg(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_msgstream_obj_numعدد كائنات دفق الرسائل التي تم إنشاؤها على كل موضوع فعلي.
زمن انتقال إرسال الطفراتمتوسط زمن الكمون والنسبة المئوية الـ 99 لزمن انتقال إرسال طلبات الإدراج أو الحذف من قبل كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_send_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_mutation_send_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_send_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
milvus_proxy_mutation_send_latencyزمن الاستجابة لإرسال طلبات الإدراج أو الحذف.
معدل إصابة ذاكرة التخزين المؤقتمتوسط معدل إصابة ذاكرة التخزين المؤقت للعمليات بما في ذلك GeCollectionID و GetCollectionInfo و GetCollectionSchema في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", cache_state="hit"}[2m])/120) by(cache_name, pod, node_id) / sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(cache_name, pod, node_id)milvus_proxy_cache_hit_countإحصائيات معدل الإصابة والفشل لكل عملية قراءة في ذاكرة التخزين المؤقت.
زمن انتقال تحديث ذاكرة التخزين المؤقتمتوسط زمن الاستجابة والنسبة المئوية الـ 99 من زمن استجابة تحديث ذاكرة التخزين المؤقت حسب الوكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_cache_update_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_cache_update_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_cache_update_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
milvus_proxy_cache_update_latencyزمن انتقال تحديث ذاكرة التخزين المؤقت في كل مرة.
وقت المزامنةمتوسط عدد مرات المزامنة والحد الأقصى والأدنى لوقت الحقبة الزمنية التي تمت مزامنتها بواسطة كل وكيل في القناة الفعلية المقابلة له.avg(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_sync_epoch_timeوقت الحقبة الزمنية لكل قناة فعلية (توقيت يونيكس، أي الميلي ثانية التي مرت منذ 1 يناير 1970).
يوجد ChannelName افتراضي بصرف النظر عن القنوات الفعلية.
تطبيق كمون PK الكمونمتوسط زمن الكمون والنسبة المئوية الـ 99 من زمن انتقال تطبيق المفتاح الأساسي لكل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_pk_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_proxy_apply_pk_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_pk_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
milvus_proxy_apply_pk_latencyزمن انتقال تطبيق المفتاح الأساسي.
زمن انتقال تطبيق الطابع الزمنيمتوسط زمن الانتقال والنسبة المئوية 99 لزمن انتقال تطبيق الطابع الزمني بواسطة كل وكيل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_timestamp_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_apply_timestamp_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_timestamp_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
milvus_proxy_apply_timestamp_latencyزمن انتقال تطبيق الطابع الزمني.
معدل نجاح الطلباتعدد الطلبات الناجحة التي يتلقاها كل وكيل في الثانية، مع تفصيل مفصل لكل نوع طلب. أنواع الطلبات المحتملة هي DescribeCollection، وDescribeIndex، وDiscribeIndex، وGetCollectionStatistics، وHasCollection، وHasCollection، وSearch، وSquery، وEhowPartitions، وIntrert، وما إلى ذلك.
sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="success"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countعدد جميع أنواع الطلبات المستلمة
معدل الطلبات الفاشلةعدد الطلبات الفاشلة التي يتلقاها كل وكيل في الثانية، مع تفصيل مفصل لكل نوع طلب. أنواع الطلبات المحتملة هي DescribeCollection، وDescribeIndex، وDiscribeIndex، وGetCollectionStatistics، وHasCollection، وSearch، وSquery، وEhowPartitions، وIntert، وما إلى ذلك.
sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="fail"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countعدد جميع أنواع الطلبات المستلمة
زمن انتقال الطلبمتوسط زمن الاستجابة والنسبة المئوية الـ 99 من زمن الاستجابة لجميع أنواع طلبات الاستقبال من قبل كل وكيلp99:
histogram_quantile(0.99, sum by (le, pod, node_id, function_name) (rate(milvus_proxy_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_proxy_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name) / sum(increase(milvus_proxy_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name)
milvus_proxy_req_latencyزمن الاستجابة لجميع أنواع طلبات الاستقبال
معدل بايتات طلبات الإدراج/الحذفعدد البايتات من طلبات الإدراج والحذف المستلمة في الثانية الواحدة بواسطة الوكيل خلال الدقيقتين الماضيتين.sum(increase(milvus_proxy_receive_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_receive_bytes_countعدد طلبات الإدراج والحذف.
معدل البايت المرسلةعدد وحدات البايت في الثانية المرسلة إلى العميل أثناء استجابة كل وكيل لطلبات البحث والاستعلام خلال الدقيقتين الماضيتين.sum(increase(milvus_proxy_send_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_send_bytes_countعدد وحدات البايت المرسلة مرة أخرى إلى العميل أثناء استجابة كل وكيل لطلبات البحث والاستعلام.
+

+

المنسق الجذر

+ + + + + + + + + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
عدد عقدة الوكيلعدد الوكلاء الذين تم إنشاؤهم.sum(milvus_rootcoord_proxy_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_proxy_numعدد الوكلاء.
وقت المزامنةمتوسط، والحد الأقصى، والحد الأدنى لوقت الحقبة الزمنية التي تمت مزامنتها من قبل كل منسق جذر في كل قناة فعلية (قناة PC).avg(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_sync_epoch_timeزمن الحقبة الزمنية لكل قناة فعلية (توقيت يونيكس، الميلي ثانية التي مرت منذ 1 يناير 1970).
معدل طلبات DDLحالة وعدد طلبات DDL في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_rootcoord_ddl_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, function_name)milvus_rootcoord_ddl_req_countالعدد الإجمالي لطلبات DDL بما في ذلك CreateCollection و DescribeCollection و و DescribeSegments و HasCollection و ShowCollections و ShowPartitions و ShowSegments.
كمون طلب DDLمتوسط زمن الاستجابة والنسبة المئوية الـ 99 من زمن استجابة طلبات DDL خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, function_name) (rate(milvus_rootcoord_ddl_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_rootcoord_ddl_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name) / sum(increase(milvus_rootcoord_ddl_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name)
milvus_rootcoord_ddl_req_latencyزمن انتقال جميع أنواع طلبات DDL.
زمن الانتقال الزمني للمزامنةمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي استخدمه جذر التنسيق لمزامنة جميع الطوابع الزمنية مع قناة PChannel خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le) (rate(milvus_rootcoord_sync_timetick_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_rootcoord_sync_timetick_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_rootcoord_sync_timetick_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
milvus_rootcoord_sync_timetick_latencyالوقت الذي استخدمه جذر التنسيق لمزامنة جميع الطوابع الزمنية إلى قناة pchannel.
معدل تخصيص المعرفاتعدد المعرفات المعينة بواسطة جذر التنسيق في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_rootcoord_id_alloc_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120)milvus_rootcoord_id_alloc_countالعدد المتراكم للمعرفات المعينة بواسطة جذر التنسيق.
الطابع الزمنيالطابع الزمني الأخير لنسق الجذر.milvus_rootcoord_timestamp{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestampالطابع الزمني الأخير لنسق الجذر.
الطابع الزمني المحفوظالطوابع الزمنية المعينة مسبقاً التي يحفظها جذر التنسيق في مخزن التعريف.milvus_rootcoord_timestamp_saved{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestamp_savedالطوابع الزمنية المعينة مسبقاً التي يحفظها جذر التنسيق في مخزن التعريف.
يتم تعيين الطوابع الزمنية المعينة مسبقاً قبل 3 ثوانٍ. ويتم تحديث الطابع الزمني وحفظه في مخزن التعريف كل 50 مللي ثانية.
عدد المجموعاتالعدد الإجمالي للمجموعات.sum(milvus_rootcoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_collection_numإجمالي عدد المجموعات الموجودة في Milvus حالياً.
عدد الأقسامالعدد الإجمالي للأقسام.sum(milvus_rootcoord_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_partition_numإجمالي عدد الأقسام الموجودة في Milvus حالياً.
عدد قنوات DMLإجمالي عدد قنوات DML.sum(milvus_rootcoord_dml_channel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_dml_channel_numإجمالي عدد قنوات DML الموجودة في Milvus حالياً.
عدد قنوات msgstreamإجمالي عدد قنوات msgstreams.sum(milvus_rootcoord_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_msgstream_obj_numإجمالي عدد تدفقات الرسائل الموجودة في Milvus حالياً.
عدد بيانات الاعتمادإجمالي عدد بيانات الاعتماد.sum(milvus_rootcoord_credential_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_credential_numإجمالي عدد بيانات الاعتماد في Milvus حالياً.
تأخير تيك الوقتمجموع الحد الأقصى لتأخير التجزئة الزمنية القصوى للرسوم البيانية للتدفق على جميع عقد البيانات وعقد الاستعلام.sum(milvus_rootcoord_time_tick_delay{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_time_tick_delayالحد الأقصى لتأخير التجزئة الزمنية القصوى للرسوم البيانية للتدفق على كل DataNode وCueryNode.
+

+

منسق الاستعلام

+ + + + + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
عدد المجموعات التي تم تحميلهاعدد المجموعات التي يتم تحميلها حالياً في الذاكرة.sum(milvus_querycoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_collection_numعدد المجموعات التي يتم تحميلها حالياً بواسطة Milvus.
عدد الكيانات التي تم تحميلها حالياًعدد الكيانات التي يتم تحميلها حالياً في الذاكرة.sum(milvus_querycoord_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_entitiy_numعدد الكيانات التي يتم تحميلها حالياً بواسطة Milvus.
معدل طلبات التحميلعدد طلبات التحميل في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_querycoord_load_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])120) by (status)milvus_querycoord_load_req_countالعدد المتراكم لطلبات التحميل.
معدل طلبات الإصدارعدد طلبات الإصدار لكل ثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_querycoord_release_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_querycoord_release_req_countعدد طلبات الإصدار المتراكمة.
زمن انتقال طلب التحميلمتوسط زمن الاستجابة والنسبة المئوية 99 من زمن استجابة طلبات التحميل خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_load_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querycoord_load_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_load_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
milvus_querycoord_load_latencyالوقت المستخدم لإكمال طلب التحميل.
زمن انتقال طلب الإصدارمتوسط زمن الاستجابة والنسبة المئوية الـ 99 من زمن استجابة طلب الإصدار خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_release_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querycoord_release_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_release_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
milvus_querycoord_release_latencyالوقت المستخدم لإكمال طلب الإصدار.
مهمة التحميل الفرعيعدد مهام التحميل الفرعي.sum(milvus_querycoord_child_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_child_task_numعدد مهام التحميل الفرعية.
يقسم تنسيق الاستعلام طلب التحميل إلى مهام تحميل فرعية متعددة.
مهمة التحميل الأصليةعدد مهام التحميل الأصلية.sum(milvus_querycoord_parent_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_parent_task_numعدد مهام التحميل الفرعية.
يتوافق كل طلب تحميل مع مهمة أصل في قائمة انتظار المهام.
زمن انتقال مهام التحميل الفرعيةمتوسط زمن الانتقال والنسبة المئوية 99 من زمن انتقال مهمة تحميل فرعية خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_child_task_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querycoord_child_task_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_child_task_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) namespace"}[2m])))
milvus_querycoord_child_task_latencyزمن الاستجابة لإكمال مهمة تحميل فرعي.
عدد عُقد الاستعلامعدد عقد الاستعلام التي يديرها منسق الاستعلام.sum(milvus_querycoord_querynode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_querynode_numعدد عقد الاستعلام التي يديرها منسق الاستعلام.
+

+

عقدة الاستعلام

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
عدد المجموعات التي تم تحميلهاعدد المجموعات التي تم تحميلها في الذاكرة بواسطة كل عقدة استعلام.sum(milvus_querynode_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_collection_numعدد المجموعات التي تم تحميلها بواسطة كل عقدة استعلام.
عدد الأقسام المحملة في الذاكرةعدد الأقسام التي تم تحميلها في الذاكرة بواسطة كل عقدة استعلام.sum(milvus_querynode_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_partition_numعدد الأقسام التي تم تحميلها بواسطة كل عقدة استعلام.
عدد الأجزاء المحملة في الذاكرةعدد المقاطع التي تم تحميلها في الذاكرة بواسطة كل عقدة استعلام.sum(milvus_querynode_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_segment_numعدد المقاطع التي تم تحميلها بواسطة كل عقدة استعلام.
عدد الكيانات القابلة للاستعلام والبحثعدد الكيانات القابلة للاستعلام والبحث عنها في كل عقدة استعلام.sum(milvus_querynode_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_entity_numعدد الكيانات القابلة للاستعلام والبحث عنها في كل عقدة استعلام.
قناة DML الافتراضيةعدد قنوات DML الافتراضية التي تتم مشاهدتها بواسطة كل عقدة استعلام.sum(milvus_querynode_dml_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_dml_vchannel_numعدد قنوات DML الافتراضية التي تشاهدها كل عقدة استعلام.
قناة دلتا الافتراضيةعدد قنوات دلتا التي تشاهدها كل عقدة استعلام.sum(milvus_querynode_delta_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_delta_vchannel_numعدد قنوات دلتا التي تشاهدها كل عقدة استعلام.
عدد المستهلكينعدد المستهلكين في كل عقدة استعلام.sum(milvus_querynode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_consumer_numعدد المستهلكين في كل عقدة استعلام.
معدل طلبات البحثإجمالي عدد طلبات البحث والاستعلام التي تتلقاها كل عقدة استعلام في الثانية وعدد طلبات البحث والاستعلام الناجحة خلال الدقيقتين الماضيتين.sum(increase(milvus_querynode_sq_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (query_type, status, pod, node_id)milvus_querynode_sq_req_countالعدد المتراكم لطلبات البحث والاستعلام.
زمن انتقال طلب البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت المستخدم في طلبات البحث والاستعلام من قبل كل عقدة استعلام خلال الدقيقتين الماضيتين.
تعرض هذه اللوحة زمن انتقال طلبات البحث والاستعلام التي تكون حالتها "نجاح" أو "إجمالي".
p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_sq_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_sq_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
milvus_querynode_sq_req_latencyزمن انتقال طلب البحث لعقدة الاستعلام.
زمن انتقال البحث في قائمة الانتظارمتوسط زمن الكمون والنسبة المئوية الـ 99 لزمن انتقال طلبات البحث والاستعلام في قائمة الانتظار خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_queue_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_sq_queue_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_queue_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
milvus_querynode_sq_queue_latencyزمن انتقال طلبات البحث والاستعلام المستلمة بواسطة عقدة الاستعلام.
زمن انتقال جزء البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي تستغرقه كل عقدة استعلام للبحث والاستعلام عن مقطع خلال الدقيقتين الماضيتين.
يمكن أن تكون حالة المقطع مختومة أو متزايدة.
p99:
histogram_quantile(0.99, sum by (le, query_type, segment_state, pod, node_id) (rate(milvus_querynode_sq_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querynode_sq_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state) / sum(increase(milvus_querynode_sq_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state)
milvus_querynode_sq_segment_latencyالوقت الذي تستغرقه كل عقدة استعلام للبحث والاستعلام عن كل مقطع.
زمن انتقال طلب سيجكورمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي تستغرقه كل عقدة استعلام للبحث والاستعلام في segcore خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_querynode_sq_core_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_sq_core_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_core_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
milvus_querynode_sq_core_latencyالوقت الذي تستغرقه كل عقدة استعلام للبحث والاستعلام في segcore.
زمن انتقال تقليل البحثمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي تستغرقه كل عقدة استعلام خلال مرحلة تقليل البحث أو الاستعلام خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_reduce_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_sq_reduce_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_reduce_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
milvus_querynode_sq_reduce_latencyالوقت الذي يقضيه كل استعلام خلال مرحلة الاختزال.
زمن انتقال جزء التحميلمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي تستغرقه كل عقدة استعلام لتحميل مقطع خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_load_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_load_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_load_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_load_segment_latency_bucketالوقت الذي تستغرقه كل عقدة استعلام لتحميل مقطع.
عدد مخططات التدفقعدد مخططات التدفق في كل عقدة استعلام.sum(milvus_querynode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_flowgraph_numعدد مخططات التدفق في كل عقدة استعلام.
طول مهمة القراءة غير المحلولةطول قائمة انتظار طلبات القراءة التي لم يتم حلها في كل عقدة استعلام.sum(milvus_querynode_read_task_unsolved_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_unsolved_lenطول قائمة انتظار طلبات القراءة التي لم يتم حلها.
طول مهمة القراءة الجاهزةطول قائمة انتظار طلبات القراءة التي سيتم تنفيذها في كل عقدة استعلام.sum(milvus_querynode_read_task_ready_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_ready_lenطول قائمة انتظار طلبات القراءة المطلوب تنفيذها.
عدد مهام القراءة المتوازيةعدد طلبات القراءة المتزامنة المنفذة حالياً في كل عقدة استعلام.sum(milvus_querynode_read_task_concurrency{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_concurrencyعدد طلبات القراءة المتزامنة المنفذة حالياً.
تقدير استخدام وحدة المعالجة المركزيةاستخدام وحدة المعالجة المركزية (CPU) من قبل كل عقدة استعلام مقدرة من قبل المجدول.sum(milvus_querynode_estimate_cpu_usage{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_estimate_cpu_usageاستخدام وحدة المعالجة المركزية من قبل كل عقدة استعلام مقدرة من قبل المجدول.
عندما تكون القيمة 100، فهذا يعني استخدام وحدة معالجة مركزية افتراضية كاملة (vCPU).
حجم مجموعة البحثمتوسط العدد والنسبة المئوية 99 لحجم مجموعة البحث (أي العدد الإجمالي لطلبات البحث الأصلية في طلبات البحث المجمعة التي تم تنفيذها بواسطة كل عقدة استعلام) خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_load_segment_latency_bucketعدد مهام البحث الأصلية من بين مهام البحث المجمعة من مجموعات مختلفة (أي حجم مجموعة البحث).
البحث NQمتوسط العدد والنسبة المئوية الـ 99 لعدد الاستعلامات (NQ) التي تم إجراؤها أثناء تنفيذ كل عقدة استعلام لطلبات البحث خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_querynode_seload_segment_latency_bucketعدد الاستعلامات (NQ) لطلبات البحث.
مجموعة البحث NQمتوسط العدد والنسبة المئوية الـ 99 لـ NQ لطلبات البحث مجتمعة والمنفذة بواسطة كل عقدة استعلام خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_nq_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_querynode_search_group_nq_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_nq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_load_segment_latency_bucketNQ لطلبات البحث مجتمعة من مجموعات مختلفة.
البحث الأعلى_كمتوسط العدد والنسبة المئوية الـ 99 من Top_K لطلبات البحث المنفذة بواسطة كل عقدة استعلام خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querynode_search_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_load_segment_latency_bucketTop_K لطلبات البحث
مجموعة البحث Top_Kمتوسط العدد والنسبة المئوية الـ 99 من Top_K من طلبات البحث مجتمعة والمنفذة بواسطة كل عقدة استعلام خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
avg:
sum(increase(milvus_querynode_search_group_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_querynode_load_segment_latency_bucketTop_K من طلبات البحث مجتمعة من مجموعات مختلفة .
معدل طلبات القراءة التي تم إخلاؤهاعدد طلبات القراءة التي تم إخلاؤها في الثانية الواحدة بواسطة كل عقدة استعلام خلال الدقيقتين الماضيتين.sum(increase(milvus_querynode_read_evicted_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_querynode_sq_req_countالعدد المتراكم لطلبات القراءة التي تم إخلاؤها بواسطة عقدة الاستعلام بسبب تقييد حركة المرور.
+

+

منسق البيانات

+ + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
عدد عقد البياناتعدد عقد البيانات التي يديرها منسق البيانات.sum(milvus_datacoord_datanode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_datanode_numعدد عقد البيانات التي يديرها منسق البيانات.
عدد المقاطععدد جميع أنواع المقاطع المسجلة في البيانات الوصفية بواسطة منسق البيانات.sum(milvus_datacoord_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (segment_state)milvus_datacoord_segment_numعدد جميع أنواع المقاطع المسجلة في البيانات الوصفية بواسطة منسق البيانات.
تتضمن أنواع المقاطع ما يلي: تم إسقاطها، ومسحها، ومسحها، وتناميها، وإغلاقها.
عدد المجموعاتعدد المجموعات المسجلة في البيانات الوصفية حسب تنسيق البيانات.sum(milvus_datacoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_collection_numعدد المجموعات المسجلة في البيانات الوصفية حسب تنسيق البيانات.
الصفوف المخزنةالعدد المتراكم لصفوف البيانات الصالحة والمسحوبة في تنسيق البيانات.sum(milvus_datacoord_stored_rows_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_rows_numالعدد المتراكم لصفوف البيانات الصالحة والمسحوبة في تنسيق البيانات.
معدل الصفوف المخزنةمتوسط عدد الصفوف التي تم مسحها في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_datacoord_stored_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_datacoord_stored_rows_countالعدد المتراكم للصفوف التي تم مسحها بواسطة تنسيق البيانات.
وقت المزامنةمتوسط، والحد الأقصى، والحد الأدنى لعدد زمن الحقبة الزمنية التي تمت مزامنتها بواسطة تنسيق البيانات في كل قناة فعلية.avg(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_sync_epoch_timeزمن الحقبة الزمنية لكل قناة فعلية (توقيت يونيكس، الميلي ثانية التي مرت منذ 1 يناير 1970).
حجم مدونة البيانات المخزنةالحجم الإجمالي لـ Binlog المخزنة.sum(milvus_datacoord_stored_binlog_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_binlog_sizeالحجم الكلي لـ Binlog المخزنة في ميلفوس.
+

+

عقدة البيانات

+ + + + + + + + + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ملفوس المستخدمةوصف مقاييس ميلفوس
رقم مخطط التدفقعدد كائنات مخطط التدفق التي تتوافق مع كل عقدة بيانات.sum(milvus_datanode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_flowgraph_numعدد كائنات مخطط التدفق.
كل جزء في المجموعة يتوافق مع كائن مخطط انسيابي.
معدل استهلاك صفوف الرسائلعدد صفوف رسائل التدفق المستهلكة لكل ثانية بواسطة كل عقدة بيانات خلال الدقيقتين الماضيتين.sum(increase(milvus_datanode_msg_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_msg_rows_countعدد صفوف رسائل التدفق المستهلكة.
حالياً، رسائل التدفق التي يتم حسابها بواسطة عقدة البيانات تتضمن فقط رسائل الإدراج والحذف.
معدل حجم البيانات المتدفقةحجم كل رسالة متدفقة يتم تسجيلها في الثانية من قبل كل عقدة بيانات خلال الدقيقتين الماضيتين.sum(increase(milvus_datanode_flushed_data_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_flushed_data_sizeحجم كل رسالة متدفقة.
في الوقت الحالي، تتضمن رسائل التدفق المحسوبة بواسطة عقدة البيانات رسائل الإدراج والحذف فقط.
عدد المستهلكينعدد المستهلكين الذين تم إنشاؤهم على كل عقدة بيانات.sum(milvus_datanode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_consumer_numعدد المستهلكين الذين تم إنشاؤهم على كل عقدة بيانات.
يتوافق كل مخطط تدفق مع مستهلك.
عدد المنتجينعدد المنتجين الذين تم إنشاؤهم على كل عقدة بيانات.sum(milvus_datanode_producer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_producer_numعدد المستهلكين الذين تم إنشاؤهم على كل عقدة بيانات.
كل جزء في المجموعة يتوافق مع منتج قناة دلتا ومنتج قناة زمنية.
وقت المزامنةالعدد المتوسط والحد الأقصى والأدنى لوقت الحقبة الزمنية التي تمت مزامنتها من قبل كل عقدة بيانات في جميع المواضيع الفعلية.avg(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_sync_epoch_timeوقت الحقبة الزمنية (وقت يونيكس، أي الميلي ثانية التي مرت منذ 1 يناير 1970.) لكل موضوع فعلي في عقدة البيانات.
عدد المقاطع غير الممسوحةعدد المقاطع غير الممسوحة التي لم يتم مسحها على كل عقدة بيانات.sum(milvus_datanode_unflushed_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_unflushed_segment_numعدد المقاطع غير الممسوحة التي لم يتم مسحها على كل عقدة بيانات.
زمن انتقال المخزن المؤقت للتشفيرمتوسط زمن الاستجابة والنسبة المئوية ال 99 للوقت المستخدم لتشفير المخزن المؤقت بواسطة كل عقدة بيانات خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_encode_buffer_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_datanode_encode_buffer_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_encode_buffer_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_datanode_encode_buffer_latencyالوقت الذي تستغرقه كل عقدة بيانات لتشفير مخزن مؤقت.
حفظ كمون البياناتمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت المستخدم لكتابة مخزن مؤقت في طبقة التخزين بواسطة كل عقدة بيانات خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_save_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_datanode_save_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_save_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_datanode_save_latencyالوقت الذي تستغرقه كل عقدة بيانات لكتابة مخزن مؤقت في طبقة التخزين.
معدل تشغيل التدفقعدد المرات التي تقوم فيها كل عقدة بيانات بمسح مخزن مؤقت في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_datanode_flush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_buffer_op_countعدد المرات المتراكمة التي تقوم فيها عقدة البيانات بمسح مخزن مؤقت.
معدل تشغيل التدفق التلقائيعدد المرات التي تقوم فيها كل عقدة بيانات بمسح المخزن المؤقت تلقائياً لكل ثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_datanode_autoflush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_autoflush_buffer_op_countعدد المرات المتراكمة التي تقوم فيها عقدة بيانات بمسح المخزن المؤقت تلقائياً.
معدل طلب التنظيفعدد المرات التي تتلقى فيها كل عقدة بيانات طلب مسح المخزن المؤقت لكل ثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_datanode_flush_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_req_countالعدد المتراكم للمرات التي تتلقى فيها عقدة بيانات طلب مسح من منسق بيانات.
زمن انتقال الضغطمتوسط زمن الاستجابة و99 النسبة المئوية للوقت الذي تستغرقه كل عقدة بيانات لتنفيذ مهمة ضغط خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_compaction_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_datanode_compaction_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_compaction_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_datanode_compaction_latencyالوقت الذي تستغرقه كل عقدة بيانات لتنفيذ مهمة ضغط.
+

+

منسق الفهرس

+ + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
معدل طلبات الفهرسمتوسط عدد طلبات بناء الفهرس المستلمة في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_indexcoord_indexreq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_indexcoord_indexreq_countعدد طلبات بناء الفهرس المستلمة.
عدد مهام الفهرسعدد جميع مهام الفهرسة المسجلة في البيانات الوصفية للفهرس.sum(milvus_indexcoord_indextask_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (index_task_status)milvus_indexcoord_indextask_countعدد كافة مهام الفهرسة المسجلة في البيانات الوصفية للفهرس.
عدد عقد الفهرسعدد عقد الفهرس المدارة.sum(milvus_indexcoord_indexnode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_indexcoord_indexnode_numعدد عقد الفهرس المدارة.
+

+

عقدة الفهرس

+ + + + + + + + + + + + +
لوحةوصف اللوحةPromQL (لغة استعلام Prometheus)مقاييس ميلفوس المستخدمةوصف مقاييس ميلفوس
معدل مهام الفهرسمتوسط عدد مهام بناء الفهرس المستلمة من قبل كل عقدة فهرس في الثانية خلال الدقيقتين الماضيتين.sum(increase(milvus_indexnode_index_task_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_indexnode_index_task_countعدد مهام بناء الفهرس المستلمة.
زمن انتقال حقل التحميلمتوسط زمن الوصول والنسبة المئوية الـ 99 للوقت الذي تستغرقه كل عقدة فهرس لتحميل بيانات حقل المقطع في كل مرة خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_load_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_indexnode_load_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_load_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_indexnode_load_field_latencyالوقت الذي تستخدمه عقدة الفهرس لتحميل بيانات حقل المقطع.
زمن انتقال حقل فك التشفيرمتوسط زمن الاستجابة والنسبة المئوية الـ 99 للوقت الذي تستخدمه كل عقدة فهرس لتشفير بيانات الحقل في كل مرة خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_decode_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_indexnode_decode_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_decode_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_indexnode_decode_field_latencyالوقت المستخدم لفك تشفير بيانات الحقل.
كمون بناء الفهرسمتوسط زمن الاستجابة والنسبة المئوية 99 للوقت الذي استخدمته كل عقدة فهرس لبناء الفهارس خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_build_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_indexnode_build_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_build_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_indexnode_build_index_latencyالوقت المستخدم لبناء الفهارس.
زمن انتقال فهرس التشفيرمتوسط زمن الاستجابة والنسبة المئوية 99 للوقت الذي استخدمته كل عقدة فهرس لتشفير ملفات الفهرس خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_encode_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط:
sum(increase(milvus_indexnode_encode_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_encode_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_indexnode_encode_index_latencyالوقت المستخدم لتشفير ملفات الفهرس.
حفظ كمون الفهرسمتوسط زمن الاستجابة والنسبة المئوية 99 للوقت المستخدم من قبل كل عقدة فهرس لحفظ ملفات الفهرس خلال الدقيقتين الماضيتين.p99:
histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_save_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
متوسط الوقت:
sum(increase(milvus_indexnode_save_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_save_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
milvus_indexnode_save_index_latencyالوقت المستخدم لحفظ ملفات الفهرس.
+

diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.json b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.json new file mode 100644 index 000000000..4706a933e --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/prometheus-operator/kube-prometheus.git\n$ cd kube-prometheus\n$ kubectl apply --server-side -f manifests/setup\n$ kubectl wait \\\n --for condition=Established \\\n --all CustomResourceDefinition \\\n --namespace=monitoring\n$ kubectl apply -f manifests/\n","kubectl patch clusterrole prometheus-k8s --type=json -p='[{\"op\": \"add\", \"path\": \"/rules/-\", \"value\": {\"apiGroups\": [\"\"], \"resources\": [\"pods\", \"services\", \"endpoints\"], \"verbs\": [\"get\", \"watch\", \"list\"]}}]'\n","$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090\n$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000\n","$ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values\n","$ kubectl get servicemonitor\n","NAME AGE\nmy-release-milvus 54s\n"],"headingContent":"Deploying Monitoring Services on Kubernetes","anchorList":[{"label":"نشر خدمات المراقبة على Kubernetes","href":"Deploying-Monitoring-Services-on-Kubernetes","type":1,"isActive":false},{"label":"مراقبة المقاييس باستخدام Prometheus","href":"Monitor-metrics-with-Prometheus","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"نشر خدمات المراقبة على Kubernetes","href":"Deploy-monitoring-services-on-Kubernetes","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.md b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.md new file mode 100644 index 000000000..1ae1a6090 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor.md @@ -0,0 +1,136 @@ +--- +id: monitor.md +title: نشر خدمات المراقبة +related_key: 'monitor, alert' +summary: >- + تعرف على كيفية نشر خدمات المراقبة لمجموعة Milvus العنقودية باستخدام + Prometheus. +--- +

نشر خدمات المراقبة على Kubernetes

يصف هذا الموضوع كيفية استخدام Prometheus لنشر خدمات المراقبة لمجموعة Milvus على Kubernetes.

+

مراقبة المقاييس باستخدام Prometheus

المقاييس هي مؤشرات توفر معلومات حول حالة تشغيل نظامك. على سبيل المثال، باستخدام المقاييس، يمكنك فهم مقدار موارد الذاكرة أو وحدة المعالجة المركزية التي تستهلكها عقدة البيانات في Milvus. أن تكون على دراية بأداء وحالة المكونات في مجموعة Milvus الخاصة بك يجعلك على دراية جيدة وبالتالي اتخاذ قرارات أفضل وتعديل تخصيص الموارد في الوقت المناسب.

+

بشكل عام، يتم تخزين المقاييس في قاعدة بيانات السلاسل الزمنية (TSDB)، مثل Prometheus، ويتم تسجيل المقاييس بطابع زمني. في حالة مراقبة خدمات Milvus، يمكنك استخدام Prometheus لسحب البيانات من نقاط النهاية التي تم تعيينها بواسطة المصدرين. ثم يقوم Prometheus بتصدير مقاييس كل مكون من مكونات Milvus على http://<component-host>:9091/metrics.

+

ومع ذلك، قد يكون لديك العديد من النسخ المتماثلة لمكون واحد، مما يجعل التكوين اليدوي لـ Prometheus معقدًا للغاية. ولذلك، يمكنك استخدام Prometheus Operator، وهو امتداد لـ Kubernetes، للإدارة الآلية والفعالة لمثيلات مراقبة Prometheus. يوفر لك استخدام Prometheus Operator Prometheus عناء إضافة أهداف القياس وموفري الخدمة يدويًا.

+

يمكّنك تعريف المورد المخصص (CRD) الخاص ب ServiceMonitor من تحديد كيفية مراقبة مجموعة ديناميكية من الخدمات بشكل واضح. كما يسمح أيضًا بتحديد الخدمات التي ستتم مراقبتها مع التكوين المطلوب باستخدام تحديدات التسمية. باستخدام مشغل Prometheus Operator، يمكنك تقديم اصطلاحات تحدد كيفية كشف المقاييس. يمكن اكتشاف الخدمات الجديدة تلقائيًا باتباع الاصطلاحات التي قمت بتعيينها دون الحاجة إلى إعادة التكوين اليدوي.

+

توضح الصورة التالية سير عمل بروميثيوس.

+

+ + Prometheus_architecture + بروميثيوس_أرشيف

+

المتطلبات الأساسية

يستخدم هذا البرنامج التعليمي kube-prometheus ليوفر عليك عناء تثبيت وتهيئة كل مكون من مكونات المراقبة والتنبيه يدويًا.

+

يقوم Kube-prometheus بجمع بيانات Kubernetes، ولوحات معلومات Grafana، وقواعد Prometheus مع الوثائق والبرامج النصية.

+

قبل نشر خدمات المراقبة، تحتاج إلى إنشاء مكدس مراقبة باستخدام التكوين الموجود في دليل بيانات كيوب-بروميثيوس kube-prometheus.

+
$ git clone https://github.com/prometheus-operator/kube-prometheus.git
+$ cd kube-prometheus
+$ kubectl apply --server-side -f manifests/setup
+$ kubectl wait \
+        --for condition=Established \
+        --all CustomResourceDefinition \
+        --namespace=monitoring
+$ kubectl apply -f manifests/
+
+
+لا يمكن لمكدس بروميثيوس-k8s الافتراضي التقاط مقاييس ميلفوس، وتحتاج إلى التصحيح:
+
kubectl patch clusterrole prometheus-k8s --type=json -p='[{"op": "add", "path": "/rules/-", "value": {"apiGroups": [""], "resources": ["pods", "services", "endpoints"], "verbs": ["get", "watch", "list"]}}]'
+
+

لحذف مكدس، قم بتشغيل kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup.

+

نشر خدمات المراقبة على Kubernetes

1. الوصول إلى لوحات المعلومات

قم بإعادة توجيه خدمة Prometheus إلى المنفذ 9090 ، وخدمة Grafana إلى المنفذ 3000.

+
$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090
+$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000
+
+

2. تمكين ServiceMonitor

لا يتم تمكين ServiceMonitor لـ Milvus Helm افتراضيًا. بعد تثبيت مشغل Prometheus في مجموعة Kubernetes، يمكنك تمكينه عن طريق إضافة المعلمة metrics.serviceMonitor.enabled=true.

+
$ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values
+
+

عند اكتمال التثبيت، استخدم kubectl للتحقق من مورد ServiceMonitor.

+
$ kubectl get servicemonitor
+
+
NAME                           AGE
+my-release-milvus              54s
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.json b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.json new file mode 100644 index 000000000..8db6af716 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus monitoring framework overview","anchorList":[{"label":"نظرة عامة على إطار عمل مراقبة ميلفوس","href":"Milvus-monitoring-framework-overview","type":1,"isActive":false},{"label":"بروميثيوس في ميلفوس","href":"Prometheus-in-Milvus","type":2,"isActive":false},{"label":"غرافانا في ميلفوس","href":"Grafana-in-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.md b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.md new file mode 100644 index 000000000..2db5f1153 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/monitor_overview.md @@ -0,0 +1,113 @@ +--- +id: monitor_overview.md +title: نظرة عامة على الشاشة +related_key: 'monitor, alert' +summary: >- + تعرّف على كيفية استخدام Prometheus وGrafana في Milvus لمراقبة خدمات المراقبة + والتنبيه. +--- +

نظرة عامة على إطار عمل مراقبة ميلفوس

يشرح هذا الموضوع كيفية استخدام Milvus لبرنامج Prometheus لمراقبة المقاييس و Grafana لتصور المقاييس وإنشاء التنبيهات.

+

بروميثيوس في ميلفوس

Prometheus هي مجموعة أدوات مراقبة وتنبيهات مفتوحة المصدر لتطبيقات Kubernetes. يجمع المقاييس ويخزنها كبيانات متسلسلة زمنيًا. وهذا يعني أن المقاييس يتم تخزينها مع الطوابع الزمنية عند تسجيلها، إلى جانب أزواج اختيارية من القيمة الرئيسية تسمى التسميات.

+

يستخدم ميلفوس حاليًا المكونات التالية من بروميثيوس:

+
    +
  • نقطة نهاية بروميثيوس لسحب البيانات من نقاط النهاية التي حددها المصدرون.
  • +
  • مشغل بروميثيوس لإدارة مثيلات مراقبة بروميثيوس بفعالية.
  • +
  • Kube-prometheus لتوفير مراقبة مجموعة Kubernetes من طرف إلى طرف سهلة التشغيل.
  • +
+

أسماء المقاييس

يحتوي الاسم المتري الصالح في Prometheus على ثلاثة عناصر: مساحة الاسم، والنظام الفرعي، والاسم. ترتبط هذه العناصر الثلاثة بحرف "_".

+

مساحة اسم مقاييس Milvus التي يراقبها Prometheus هي "milvus". واعتمادًا على الدور الذي ينتمي إليه المقياس، يجب أن يكون النظام الفرعي الخاص به أحد الأدوار الثمانية التالية: "جذر"، "وكيل"، "وكيل"، "استعلام"، "كويرينود"، "فهرس"، "فهرس"، "فهرس عقدة"، "داتاكورد"، "داتا كورد"، "داتانود".

+

على سبيل المثال، مقياس ميلفوس الذي يحسب إجمالي عدد المتجهات التي تم الاستعلام عنها يسمى milvus_proxy_search_vectors_count.

+

أنواع المقاييس

يدعم بروميثيوس أربعة أنواع من المقاييس:

+
    +
  • العداد: نوع من المقاييس التراكمية التي لا يمكن زيادة قيمتها أو إعادة تعيينها إلى الصفر إلا عند إعادة التشغيل.
  • +
  • المقياس: نوع من المقاييس التي يمكن أن ترتفع قيمتها أو تنخفض.
  • +
  • المدرج التكراري: نوع من المقاييس التي يتم حسابها بناءً على دلاء قابلة للتكوين. مثال شائع هو مدة الطلب.
  • +
  • الملخص: نوع من المقاييس المشابهة للمدرج التكراري الذي يحسب الكميات القابلة للتكوين على مدى نافذة زمنية منزلقة.
  • +
+

التسميات المترية

يميز Prometheus بين العينات التي تحمل نفس الاسم القياسي من خلال تسميتها. التسمية هي سمة معينة للمقياس. يجب أن يكون للمقاييس التي تحمل نفس الاسم نفس القيمة للحقل variable_labels. يسرد الجدول التالي أسماء ومعاني التسميات الشائعة لمقاييس ميلفوس.

+ + + + + + + + + + + + + + + + + +
اسم التسميةالتعريفالقيم
"node_id"الهوية الفريدة للدور.معرف فريد عالميًا تم إنشاؤه بواسطة ميلفوس.
"الحالة"حالة العملية أو الطلب الذي تمت معالجته."التخلي" أو "نجاح" أو "فشل".
"نوع_الاستعلام"نوع طلب القراءة."بحث" أو "استعلام".
"msg_type"نوع الرسائل."إدراج" أو "حذف" أو "بحث" أو "استعلام".
"حالة_قطاع"حالة المقطع."مغلق" أو "متزايد" أو "مسح" أو "مسح" أو "مسح" أو "إسقاط" أو "استيراد".
"حالة_حالة_ذاكرة_مخبأة"حالة الكائن المخزن مؤقتًا."إصابة" أو "خطأ".
"اسم_ذاكرة_مخبأة"اسم الكائن المخزن مؤقتًا. تُستخدم هذه التسمية مع تسمية "cache_state".مثل "معرّف المجموعة" أو "المخطط"، إلخ.
"channel_name"المواضيع الفعلية في تخزين الرسائل (بولسار أو كافكا).على سبيل المثال."by-dev-rootcoord-dml_0"، "by-dev-rootcoord-dml_255"، إلخ.
"اسم_الدالة"اسم الدالة التي تعالج طلبات معينة.مثل "CreateCollection"، "CreatePartition"، "CreateIndex"، إلخ.
"اسم_المستخدم"اسم المستخدم المستخدم المستخدم للمصادقة.اسم المستخدم الذي تفضله.
"Index_task_status"حالة مهمة الفهرس في التخزين التعريفي."لم يتم إصدارها" أو "قيد التنفيذ" أو "فاشلة" أو "منتهية" أو "معاد تدويرها".
+

غرافانا في ميلفوس

Grafana عبارة عن مكدس تصور مفتوح المصدر يمكنه الاتصال بجميع مصادر البيانات. من خلال سحب المقاييس، تساعد المستخدمين على فهم وتحليل ومراقبة البيانات الضخمة.

+

يستخدم تطبيق Milvus لوحات معلومات Grafana القابلة للتخصيص لتصور المقاييس.

+

ما التالي

بعد التعرف على سير العمل الأساسي للمراقبة والتنبيه، تعلّم

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.json b/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.json new file mode 100644 index 000000000..4924958e8 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.json @@ -0,0 +1 @@ +{"codeList":["wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json\n"],"headingContent":"Visualize Milvus Metrics in Grafana","anchorList":[{"label":"تصور مقاييس ميلفوس في غرافانا","href":"Visualize-Milvus-Metrics-in-Grafana","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تصور المقاييس باستخدام Grafana","href":"Visualize-metrics-using-Grafana","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.md b/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.md new file mode 100644 index 000000000..d83e801f2 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/monitor/visualize.md @@ -0,0 +1,100 @@ +--- +id: visualize.md +title: تصور المقاييس +related_key: 'monitor, alert' +summary: تعرف على كيفية تصور مقاييس Milvus في Grafana. +--- +

تصور مقاييس ميلفوس في غرافانا

يصف هذا الموضوع كيفية تصور مقاييس ميلفوس باستخدام غرافانا.

+

كما هو موضح في دليل المراقبة، تحتوي المقاييس على معلومات مفيدة مثل مقدار الذاكرة المستخدمة من قبل مكون Milvus محدد. تساعدك مراقبة المقاييس على فهم أداء Milvus وحالة تشغيله بشكل أفضل بحيث يمكنك ضبط تخصيص الموارد في الوقت المناسب.

+

التصور عبارة عن مخطط بياني يوضح التغير في استخدام الموارد عبر الزمن، مما يسهل عليك رؤية وملاحظة التغييرات التي تطرأ على استخدام الموارد بسرعة خاصة عند وقوع حدث ما.

+

يستخدم هذا البرنامج التعليمي Grafana، وهي منصة مفتوحة المصدر لتحليلات السلاسل الزمنية، لتصور مقاييس الأداء المختلفة لمجموعة Milvus المنشورة على Kubernetes (K8s).

+

المتطلبات الأساسية

    +
  • لقد قمت بتثبيت مجموعة Milvus على K8s).
  • +
  • تحتاج إلى تكوين Prometheus لمراقبة وجمع المقاييس قبل استخدام Grafana لتصور المقاييس. إذا نجح الإعداد، يمكنك الوصول إلى Grafana على http://localhost:3000. أو يمكنك أيضًا الوصول إلى Grafana باستخدام Grafana الافتراضي Grafana user:password من admin:admin.
  • +
+

تصور المقاييس باستخدام Grafana

1. تنزيل لوحة المعلومات واستيرادها

قم بتنزيل واستيراد لوحة معلومات Milvus من ملف JSON.

+
wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json
+
+

+ + Download_and_import + تنزيل_واستيراد

+

2. عرض المقاييس

حدد مثيل Milvus الذي تريد مراقبته. ثم يمكنك رؤية لوحة مكونات Milvus.

+

+ + Select_instance + حدد_مثلاً

+

+ + Grafana_panel + Grafana_panel

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.json b/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.json new file mode 100644 index 000000000..e8531ec9d --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n storage:\n inCluster:\n values:\n mode: standalone\n resources:\n requests:\n memory: 100Mi\n deletionPolicy: Delete # Delete | Retain, default: Retain\n pvcDeletion: true # default: false\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-s3-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n # your bucket name\n bucketName: \n # Optional, config the prefix of the bucket milvus will use\n rootPath: milvus/my-release\n useSSL: true\n dependencies:\n storage:\n # enable external object storage\n external: true\n type: S3 # MinIO | S3\n # the endpoint of AWS S3\n endpoint: s3.amazonaws.com:443\n # the secret storing the access key and secret key\n secretRef: \"my-release-s3-secret\"\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n eks.amazonaws.com/role-arn: \n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n # enable AssumeRole\n useIAM: true\n # Omit other fields ...\n dependencies:\n storage:\n # Omit other fields ...\n # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect\n endpoint: s3..amazonaws.com:443\n secretRef: \"\" # we don't need to specify the secret here\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-gcp-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n cloudProvider: gcp\n dependencies:\n storage:\n # Omit other fields ...\n endpoint: storage.googleapis.com:443\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n iam.gke.io/gcp-service-account: \n","labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n cloudProvider: gcp\n # enable AssumeRole\n useIAM: true\n # Omit other fields ... \n"],"headingContent":"Configure Object Storage with Milvus Operator","anchorList":[{"label":"تكوين تخزين الكائنات باستخدام مشغل Milvus","href":"Configure-Object-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"تكوين تخزين الكائنات","href":"Configure-object-storage","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.md b/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.md new file mode 100644 index 000000000..51d8ba5d4 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/object_storage_operator.md @@ -0,0 +1,230 @@ +--- +id: object_storage_operator.md +title: تكوين تخزين الكائنات باستخدام مشغل Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: تعرف على كيفية تكوين تخزين الكائنات باستخدام مشغل Milvus. +--- +

تكوين تخزين الكائنات باستخدام مشغل Milvus

يستخدم Milvus MinIO أو S3 كمخزن كائنات لاستمرار الملفات واسعة النطاق، مثل ملفات الفهرس والسجلات الثنائية. يقدم هذا الموضوع كيفية تكوين تبعيات تخزين الكائنات عند تثبيت Milvus مع مشغل Milvus. لمزيد من التفاصيل، راجع تكوين تخزين الكائنات مع مشغل Milvus في مستودع مشغل Milvus.

+

يفترض هذا الموضوع أنك قمت بنشر مشغل Milvus.

+
راجع نشر مشغل Milvus لمزيد من المعلومات.
+

تحتاج إلى تحديد ملف تكوين لاستخدام مشغل Milvus لبدء تشغيل مجموعة Milvus.

+
kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
+
+

تحتاج فقط إلى تحرير قالب التعليمات البرمجية في milvus_cluster_default.yaml لتكوين تبعيات الطرف الثالث. تقدم الأقسام التالية كيفية تكوين تخزين الكائنات و etcd وPulsar على التوالي.

+

تكوين تخزين الكائنات

تستخدم مجموعة Milvus العنقودية MinIO أو S3 كمخزن كائنات لاستمرار الملفات واسعة النطاق، مثل ملفات الفهرس والسجلات الثنائية. أضف الحقول المطلوبة ضمن spec.dependencies.storage لتكوين تخزين الكائنات، الخيارات الممكنة هي external و inCluster.

+

تخزين الكائنات الداخلية

بشكل افتراضي، يقوم مشغل Milvus بنشر MinIO داخل المجموعة لـ Milvus. فيما يلي مثال على التكوين لتوضيح كيفية استخدام MinIO كمخزن كائنات داخلي.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+  labels:
+    app: milvus
+spec:
+  # Omit other fields ...
+  dependencies:
+    # Omit other fields ...
+    storage:
+      inCluster:
+        values:
+          mode: standalone
+          resources:
+            requests:
+              memory: 100Mi
+        deletionPolicy: Delete # Delete | Retain, default: Retain
+        pvcDeletion: true # default: false
+
+

بعد تطبيق التكوين أعلاه، سيتم تشغيل MinIO داخل الكتلة في الوضع المستقل مع حد ذاكرة يصل إلى 100 ميغابايت. لاحظ أن

+
    +
  • يحدد الحقل deletionPolicy سياسة الحذف الخاصة بـ MinIO داخل الكتلة. يتم تعيينه افتراضيًا على Delete ولديه Retain كخيار بديل.

    +
      +
    • Delete يشير إلى أن تخزين الكائنات داخل الكتلة يتم حذفه عند إيقاف مثيل Milvus الخاص بك.
    • +
    • Retain يشير إلى أنه يتم الاحتفاظ بمخزن الكائنات داخل الكتلة كخدمة تبعية لبدء تشغيل مثيل Milvus الخاص بك في وقت لاحق.
    • +
  • +
  • يحدد الحقل pvcDeletion ما إذا كان سيتم حذف PVC(مطالبة وحدة التخزين الدائمة) عند حذف وحدة تخزين الكائنات داخل الكتلة MinIO.

  • +
+

الحقول الموجودة ضمن inCluster.values هي نفسها الموجودة في مخطط Milvus Helm، ويمكنك العثور عليها هنا.

+

تخزين الكائنات الخارجية

يشير استخدام external في ملف YAML القالب إلى استخدام خدمة تخزين كائنات خارجية. لاستخدام وحدة تخزين كائنات خارجية، تحتاج إلى تعيين الحقول بشكل صحيح ضمن spec.dependencies.storage و spec.config.minio في ملف Milvus CRD.

+

استخدام خدمة الويب Amazon Web Service (AWS) S3 كمخزن كائنات خارجي

    +
  • تكوين الوصول إلى AWS S3 بواسطة AK/SK

    +

    يمكن الوصول إلى دلو S3 عادةً عن طريق زوج من مفتاح وصول ومفتاح سري للوصول. يمكنك إنشاء كائن Secret لتخزينها في Kubernetes الخاص بك على النحو التالي:

    +
    # # change the <parameters> to match your environment
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: my-release-s3-secret
    +type: Opaque
    +stringData:
    +  accesskey: <my-access-key>
    +  secretkey: <my-secret-key>
    +
    +

    ثم يمكنك تكوين دلو AWS S3 كمخزن كائن خارجي:

    +
    # # change the <parameters> to match your environment
    +apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  config:
    +    minio:
    +      # your bucket name
    +      bucketName: <my-bucket>
    +      # Optional, config the prefix of the bucket milvus will use
    +      rootPath: milvus/my-release
    +      useSSL: true
    +  dependencies:
    +    storage:
    +      # enable external object storage
    +      external: true
    +      type: S3 # MinIO | S3
    +      # the endpoint of AWS S3
    +      endpoint: s3.amazonaws.com:443
    +      # the secret storing the access key and secret key
    +      secretRef: "my-release-s3-secret"
    +
  • +
  • تكوين الوصول إلى AWS S3 بواسطة AssumeRole

    +

    وبدلاً من ذلك، يمكنك جعل Milvus يصل إلى دلو AWS S3 الخاص بك باستخدام AssumeRole، بحيث يتم تضمين بيانات الاعتماد المؤقتة فقط بدلاً من AK/SK الفعلي الخاص بك.

    +

    إذا كان هذا هو ما تفضله، فأنت بحاجة إلى إعداد دور على وحدة تحكم AWS الخاصة بك والحصول على ARN الخاص به، والذي عادةً ما يكون على شكل arn:aws:iam::<your account id>:role/<role-name>.

    +

    ثم قم بإنشاء كائن ServiceAccount لتخزينه في Kubernetes الخاص بك على النحو التالي:

    +
    apiVersion: v1
    +kind: ServiceAccount
    +metadata:
    +  name: my-release-sa
    +  annotations:
    +    eks.amazonaws.com/role-arn: <my-role-arn>
    +
    +

    بمجرد تعيين كل شيء، قم بالرجوع إلى ServiceAccount أعلاه في ملف YAML القالب، وقم بتعيين spec.config.minio.useIAM إلى true لتمكين AssumeRole.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  components:
    +    # use the above ServiceAccount
    +    serviceAccountName: my-release-sa
    +  config:
    +    minio:
    +      # enable AssumeRole
    +      useIAM: true
    +      # Omit other fields ...
    +  dependencies:
    +    storage:
    +      # Omit other fields ...
    +      # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect
    +      endpoint: s3.<my-bucket-region>.amazonaws.com:443
    +      secretRef: "" # we don't need to specify the secret here
    +
  • +
+

استخدم Google Cloud Storage (GCS) كمخزن كائنات خارجي

تخزين كائنات AWS S3 ليس الخيار الوحيد. يمكنك أيضًا استخدام خدمة تخزين الكائنات من موفري السحابة العامة الآخرين، مثل Google Cloud.

+
    +
  • تكوين الوصول إلى GCS بواسطة AK/SK

    +

    يشبه التكوين في الغالب تكوين استخدام AWS S3. ما زلت بحاجة إلى إنشاء كائن Secret لتخزين بيانات الاعتماد الخاصة بك في Kubernetes الخاص بك.

    +
    # # change the <parameters> to match your environment
    +apiVersion: v1
    +kind: Secret
    +metadata:
    +  name: my-release-gcp-secret
    +type: Opaque
    +stringData:
    +  accesskey: <my-access-key>
    +  secretkey: <my-secret-key>
    +
    +

    بعد ذلك، ما عليك سوى تغيير endpoint إلى storage.googleapis.com:443 وتعيين spec.config.minio.cloudProvider إلى gcp على النحو التالي:

    +
    # # change the <parameters> to match your environment
    +apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  config:
    +    minio:
    +      cloudProvider: gcp
    +  dependencies:
    +    storage:
    +      # Omit other fields ...
    +      endpoint: storage.googleapis.com:443
    +
  • +
  • تكوين وصول GCS عن طريق AssumeRole

    +

    على غرار AWS S3، يمكنك أيضًا استخدام هوية عبء العمل للوصول إلى GCS ببيانات اعتماد مؤقتة إذا كنت تستخدم GKE كمجموعة Kubernetes الخاصة بك.

    +

    يختلف الشرح التوضيحي لـ ServiceAccount عن ذلك الخاص بـ AWS EKS. تحتاج إلى تحديد اسم حساب خدمة GCP بدلاً من الدور ARN.

    +
    apiVersion: v1
    +kind: ServiceAccount
    +metadata:
    +  name: my-release-sa
    +  annotations:
    +    iam.gke.io/gcp-service-account: <my-gcp-service-account-name>
    +
    +

    بعد ذلك، يمكنك تهيئة مثيل Milvus الخاص بك لاستخدام ServiceAccount أعلاه وتمكين AssumeRole عن طريق تعيين spec.config.minio.useIAM إلى true على النحو التالي:

    +
    labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  components:
    +    # use the above ServiceAccount
    +    serviceAccountName: my-release-sa
    +  config:
    +    minio:
    +      cloudProvider: gcp
    +      # enable AssumeRole
    +      useIAM: true
    +      # Omit other fields ...  
    +
  • +
+

ما التالي

تعرف على كيفية تكوين تبعيات Milvus الأخرى باستخدام مشغل Milvus:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/privilege_group.json b/localization/v2.5.x/site/ar/adminGuide/privilege_group.json new file mode 100644 index 000000000..139c989a6 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/privilege_group.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\nclient.create_privileg_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​\n​\nclient.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.CreatePrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​\n\n","import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​\n​\nclient.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Arrays.asList(\"Query\", \"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.AddPrivilegesToGroup(context.Background(), \"privilege_group_1\", []string{\"Query\", \"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Query\", \"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​\n\n","import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​\n​\nclient.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Collections.singletonList(\"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.RemovePrivilegesFromGroup(context.Background(), \"privilege_group_1\", []string{\"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.list_privilege_groups()​\n\n","import io.milvus.v2.service.rbac.PrivilegeGroup;​\nimport io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​\nimport io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​\n​\nListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​\n .build());​\nList groups = resp.getPrivilegeGroups();​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.ListPrivilegeGroups(context.Background())​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","PrivilegeGroupItem: , ​\n\n","from pymilvus import MilvusClient​\nclient.drop_privilege_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​\n​\nclient.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.DropPrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n"],"headingContent":"Create Privilege Group​","anchorList":[{"label":"إنشاء مجموعة امتيازات","href":"Create-Privilege-Group​","type":1,"isActive":false},{"label":"مجموعة الامتيازات مقابل الامتيازات","href":"Privilege-group-vs-privileges​","type":2,"isActive":false},{"label":"مجموعات امتيازات مدمجة","href":"Built-in-privilege-groups​","type":2,"isActive":false},{"label":"الإجراءات","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/privilege_group.md b/localization/v2.5.x/site/ar/adminGuide/privilege_group.md new file mode 100644 index 000000000..7182f0b0f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/privilege_group.md @@ -0,0 +1,489 @@ +--- +id: privilege_group.md +related_key: enable RBAC +summary: لتبسيط عملية منح الامتيازات، يوصى بدمج امتيازات متعددة في مجموعة امتيازات. +title: إنشاء مجموعة امتيازات +--- +

إنشاء مجموعة امتيازات

لتبسيط عملية منح الامتيازات، يوصى بدمج امتيازات متعددة في مجموعة امتيازات.

+

مجموعة الامتيازات مقابل الامتيازات

تتكون مجموعة الامتيازات من امتيازات متعددة.

+

+ + Privilege group illustrated + توضيح مجموعة الامتيازات

+

كما هو موضح في الشكل أعلاه، لنفترض أنك بحاجة إلى منح ثلاثة امتيازات مختلفة لدور ما.

+
    +
  • إذا كنت لا تستخدم مجموعة امتيازات، فأنت بحاجة إلى منح الامتيازات ثلاث مرات.

  • +
  • أما إذا كنت تستخدم مجموعة امتيازات، فأنت بحاجة فقط إلى إنشاء مجموعة امتيازات وإضافة الامتيازات الثلاثة إلى مجموعة الامتيازات هذه ومنح مجموعة الامتيازات للدور أ.

  • +
+

باستخدام مجموعة امتيازات، يمكنك منح امتيازات متعددة بشكل مجمّع إلى دور ما.

+

مجموعات امتيازات مدمجة

لسهولة الاستخدام، يوفر Milvus ما مجموعه 9 امتيازات مدمجة على مستوى المجموعة وقاعدة البيانات والمثيل: COLL_RO، COLL_RW، COLL_RW، COLL_ADMIN، DB_RO، DB_RW، DB_Admin، Cluster_RO، Cluster_RW، Cluster_RW، Cluster_Admin.

+
+

لا توجد علاقة تعاقبية بين المستويات الثلاثة لمجموعات الامتيازات المضمنة. لا يؤدي تعيين مجموعة امتيازات على مستوى المثيل إلى تعيين الأذونات تلقائيًا لجميع قواعد البيانات والمجموعات ضمن هذا المثيل. يجب تعيين الامتيازات على مستوى قاعدة البيانات والمجموعات يدويًا.

+
+

توضح الجداول التالية الامتيازات المتضمنة في كل مجموعة امتيازات مضمنة.

+

مستوى المجموعة

    +
  • COLL_RO: يتضمن امتيازات لقراءة بيانات المجموعة.

  • +
  • COLL_RW: يتضمن امتيازات لقراءة بيانات المجموعة وكتابتها

  • +
  • COLL_ADMIN: يتضمن امتيازات لقراءة بيانات المجموعة وكتابتها وإدارة المجموعات.

  • +
+

يسرد الجدول أدناه الامتيازات المحددة المضمنة في مجموعات الامتيازات الثلاثة المضمنة على مستوى المجموعة.

+

**امتيازات**

+

**امتياز قراءة المجموعة فقط**

+

**مجموعة القراءة والكتابة للمجموعة**

+

**مدير المجموعة**

+

استعلام

+

✔️

+

✔️

+

✔️

+

بحث

+

✔️

+

✔️

+

✔️

+

فهرسالتفصيل

+

✔️

+

✔️

+

✔️

+

GetFlushState

+

✔️

+

✔️

+

✔️

+

الحصول على حالة التحميل

+

✔️

+

✔️

+

✔️

+

GetLoadingProgress

+

✔️

+

✔️

+

✔️

+

لديه قسم

+

✔️

+

✔️

+

✔️

+

إظهار الأقسام

+

✔️

+

✔️

+

✔️

+

ListAliases

+

✔️

+

✔️

+

✔️

+

وصف المجموعة

+

✔️

+

✔️

+

✔️

+

وصف الخواص

+

✔️

+

✔️

+

✔️

+

الحصول على إحصائيات

+

✔️

+

✔️

+

✔️

+

إنشاء فهرس

+

+

✔️

+

✔️

+

إسقاط الفهرس

+

+

✔️

+

✔️

+

إنشاء قسم

+

+

✔️

+

✔️

+

إسقاط قسم

+

+

✔️

+

✔️

+

تحميل

+

+

✔️

+

✔️

+

الإصدار

+

+

✔️

+

✔️

+

إدراج

+

+

✔️

+

✔️

+

حذف

+

+

✔️

+

✔️

+

حذف

+

+

✔️

+

✔️

+

الاستيراد

+

+

✔️

+

✔️

+

تدفق

+

+

✔️

+

✔️

+

الضغط

+

+

✔️

+

✔️

+

موازنة الأحمال

+

+

✔️

+

✔️

+

إنشاء تعريفا

+

+

+

✔️

+

إسقاط اسم مستعار

+

+

+

✔️

+
+

مستوى قاعدة البيانات

    +
  • DB_RO: يتضمن امتيازات لقراءة بيانات قاعدة البيانات

  • +
  • DB_RW: يتضمن امتيازات لقراءة وكتابة بيانات قاعدة البيانات

  • +
  • DB_Admin: يتضمن امتيازات لقراءة وكتابة بيانات قاعدة البيانات وإدارة قواعد البيانات.

  • +
+

يسرد الجدول أدناه الامتيازات المحددة المضمنة في مجموعات الامتيازات الثلاثة المضمنة على مستوى قاعدة البيانات.

+

**امتياز**

+

**امتياز قراءة قاعدة البيانات فقط**

+

**قواعد البيانات للقراءة والكتابة**

+

**إدارة قاعدة البيانات**

+

إظهار المجموعات

+

✔️

+

✔️

+

✔️

+

وصف قاعدة البيانات

+

✔️

+

✔️

+

✔️

+

إنشاء مجموعة

+

+

+

✔️

+

إسقاط مجموعة

+

+

+

✔️

+

تغيير قاعدة البيانات

+

+

✔️

+

✔️

+
+

مستوى المجموعة

    +
  • Cluster_RO: يتضمن امتيازات لقراءة بيانات المثيل

  • +
  • Cluster_RW: يتضمن امتيازات لقراءة وكتابة بيانات المثيل

  • +
  • Cluster_Admin: يتضمن امتيازات لقراءة وكتابة بيانات المثيل وإدارة المثيلات.

  • +
+

يسرد الجدول أدناه الامتيازات المحددة المضمنة في مجموعات الامتيازات الثلاثة المضمنة على مستوى المثيل.

+

**امتيازات**

+

**مجموعة القراءة فقط**

+

**مجموعة القراءة والكتابة فقط**

+

**إدارة المجموعة**

+

قائمة قواعد البيانات

+

✔️

+

✔️

+

✔️

+

إعادة تسمية المجموعة

+

+

+

✔️

+

إنشاء ملكية

+

+

+

✔️

+

تحديث المستخدم

+

+

+

✔️

+

إسقاط الملكية

+

+

+

✔️

+

حدد الملكية

+

✔️

+

✔️

+

✔️

+

إدارة الملكية

+

+

+

✔️

+

حدد المستخدم

+

✔️

+

✔️

+

✔️

+

BackupRBAC

+

+

+

✔️

+

استرجاعRRBAC

+

+

+

✔️

+

إنشاءResourceGroup

+

+

+

✔️

+

إسقاط مجموعة الموارد

+

+

+

✔️

+

تحديثResourceResourceGroups

+

+

✔️

+

✔️

+

وصفمجموعات الموارد

+

✔️

+

✔️

+

✔️

+

ListResourceGroups

+

✔️

+

✔️

+

✔️

+

TransferNode

+

+

✔️

+

✔️

+

نقل نسخة طبق الأصل

+

+

✔️

+

✔️

+

إنشاء قاعدة بيانات

+

+

+

✔️

+

إسقاط قاعدة البيانات

+

+

+

✔️

+

فلوش الكل

+

+

✔️

+

✔️

+

إنشاء مجموعة الامتيازات

+

+

+

✔️

+

إسقاط مجموعة الامتيازات

+

+

+

✔️

+

ListPrivileGroups

+

+

+

✔️

+

تشغيلPrivilePrivileGroup

+

+

+

✔️

+
+

الإجراءات

يمكنك إنشاء مجموعة امتيازات ثم إضافة امتيازات إلى مجموعة الامتيازات.

+

إنشاء مجموعة امتيازات

يوضح المثال التالي كيفية إنشاء مجموعة امتيازات باسم privilege_group_1.

+ +
from pymilvus import MilvusClient​
+client.create_privileg_group(group_name='privilege_group_1')​
+
+
+
import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​
+​
+client.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​
+        .groupName("privilege_group_1")​
+        .build());​
+
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"​
+​
+client.CreatePrivilegeGroup(context.Background(), "privilege_group_1")​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "privilegeGroupName":"privilege_group_1"​
+}'​
+
+
+

إضافة امتيازات إلى مجموعة امتيازات

يوضح المثال التالي كيفية إضافة الامتيازات PrivilegeBackupRBAC و PrivilegeRestoreRBAC إلى مجموعة الامتيازات privilege_group_1 التي تم إنشاؤها للتو.

+ +
from pymilvus import MilvusClient​
+client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​
+
+
+
import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​
+​
+client.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​
+        .groupName("privilege_group_1")​
+        .privileges(Arrays.asList("Query", "Search"))​
+        .build());​
+
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"​
+​
+client.AddPrivilegesToGroup(context.Background(), "privilege_group_1", []string{"Query", "Search"})​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "privilegeGroupName":"privilege_group_1",​
+    "privileges":["Query", "Search"]​
+}'​
+
+
+

إزالة امتيازات من مجموعة امتيازات

يوضح المثال التالي كيفية إزالة الامتياز PrivilegeRestoreRBAC من مجموعة الامتيازات privilege_group_1.

+ +
from pymilvus import MilvusClient​
+client.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​
+
+
+
import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​
+​
+client.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​
+        .groupName("privilege_group_1")​
+        .privileges(Collections.singletonList("Search"))​
+        .build());​
+
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"​
+​
+client.RemovePrivilegesFromGroup(context.Background(), "privilege_group_1", []string{"Search"})​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "privilegeGroupName":"privilege_group_1",​
+    "privileges":["Search"]​
+}'​
+
+
+

سرد مجموعات الامتيازات

يوضح المثال التالي كيفية سرد كافة مجموعات الامتيازات الموجودة.

+ +
from pymilvus import MilvusClient​
+client.list_privilege_groups()​
+
+
+
import io.milvus.v2.service.rbac.PrivilegeGroup;​
+import io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​
+import io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​
+​
+ListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​
+        .build());​
+List<PrivilegeGroup> groups = resp.getPrivilegeGroups();​
+
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"​
+​
+client.ListPrivilegeGroups(context.Background())​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{}'​
+
+
+

فيما يلي مثال على الإخراج.

+
PrivilegeGroupItem: <privilege_group:privilege_group_1>, <privileges:('Search', 'Query')>​
+
+
+

إسقاط مجموعة امتيازات

يوضح المثال التالي كيفية إسقاط مجموعة الامتيازات privilege_group_1.

+ +
from pymilvus import MilvusClient​
+client.drop_privilege_group(group_name='privilege_group_1')​
+
+
+
import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​
+​
+client.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​
+        .groupName("privilege_group_1")​
+        .build());​
+
+
+
import "github.com/milvus-io/milvus-sdk-go/v2/client"​
+​
+client.DropPrivilegeGroup(context.Background(), "privilege_group_1")​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "privilegeGroupName":"privilege_group_1"​
+}'​
+
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/rbac.json b/localization/v2.5.x/site/ar/adminGuide/rbac.json new file mode 100644 index 000000000..511a64fd0 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/rbac.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"RBAC Explained​","anchorList":[{"label":"شرح RBAC","href":"RBAC-Explained​","type":1,"isActive":false},{"label":"المفاهيم الأساسية لنظام RBAC","href":"RBAC-key-concepts​","type":2,"isActive":false},{"label":"الإجراءات","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/rbac.md b/localization/v2.5.x/site/ar/adminGuide/rbac.md new file mode 100644 index 000000000..36236668b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/rbac.md @@ -0,0 +1,78 @@ +--- +id: rbac.md +related_key: enable RBAC +summary: >- + RBAC (التحكم في الوصول المستند إلى الدور) هي طريقة للتحكم في الوصول تستند إلى + الأدوار. باستخدام RBAC، يمكنك التحكم بدقة في العمليات التي يمكن للمستخدمين + القيام بها على مستويات المجموعة وقاعدة البيانات والمثيلات، مما يعزز أمان + البيانات. +title: شرح نظام التحكم في المخاطر المبنية على النتائج +--- +

شرح RBAC

RBAC (التحكم في الوصول المستند إلى الدور) هو أسلوب للتحكم في الوصول يستند إلى الأدوار. باستخدام RBAC، يمكنك التحكم بدقة في العمليات التي يمكن للمستخدمين القيام بها على مستويات المجموعة وقاعدة البيانات والمثيلات، مما يعزز أمان البيانات.

+

على عكس النماذج التقليدية للتحكم في وصول المستخدم، تقدم RBAC مفهوم الأدوار. في نموذج RBAC، يمكنك منح امتيازات للأدوار ثم منح هذه الأدوار للمستخدمين. ثم يمكن للمستخدمين الحصول على امتيازات.

+

يمكن لنموذج RBAC تحسين كفاءة إدارة التحكم في الوصول. على سبيل المثال، إذا كان هناك عدة مستخدمين يحتاجون إلى نفس مجموعة الامتيازات، فلن تحتاج إلى تعيين الامتيازات يدوياً لكل مستخدم. بدلاً من ذلك، يمكنك إنشاء دور وتعيين الدور للمستخدمين. إذا كنت ترغب في تعديل امتيازات هؤلاء المستخدمين، يمكنك فقط تعديل امتيازات الدور وسيتم تطبيق التعديل على جميع المستخدمين الذين لديهم هذا الدور.

+

المفاهيم الأساسية لنظام RBAC

+ + Users, roles, and privileges + المستخدمون والأدوار والامتيازات

+

هناك أربعة مكونات رئيسية في نموذج RBAC.

+
    +
  • **المورد: **كيان المورد الذي يمكن الوصول إليه. هناك ثلاثة مستويات من الموارد في ميلفوس - المثيل وقاعدة البيانات والمجموعة.

  • +
  • **الامتياز: **الإذن بإجراء عمليات معينة على موارد ملفوس (مثل إنشاء مجموعات، إدراج البيانات، إلخ).

  • +
  • **مجموعة امتيازات: **مجموعة من الامتيازات المتعددة.

  • +
  • **الدور: **يتكون الدور من جزأين - الامتيازات والموارد. تحدد الامتيازات نوع العمليات التي يمكن للدور تنفيذها بينما تحدد الموارد الموارد الموارد المستهدفة التي يمكن تنفيذ العمليات عليها. على سبيل المثال، يمكن لدور مسؤول قاعدة البيانات تنفيذ عمليات القراءة والكتابة والإدارة على قواعد بيانات معينة.

  • +
  • **المستخدم: **المستخدم هو الشخص الذي يستخدم ميلفوس. لكل مستخدم معرف فريد ويتم منحه دور أو عدة أدوار.

  • +
+

الإجراءات

لتحقيق التحكم في الوصول عبر RBAC، عليك اتباع الخطوات التالية.

+
    +
  1. إنشاء مستخدم: بالإضافة إلى المستخدم الافتراضي root في ميلفوس، يمكنك إنشاء مستخدمين جدد وتعيين كلمات مرور لحماية أمن البيانات.

  2. +
  3. إنشاء دور: يمكنك إنشاء أدوار مخصصة بناءً على احتياجاتك. يتم تحديد الإمكانيات المحددة للدور من خلال امتيازاته.

  4. +
  5. إنشاء مجموعة امتيازات: ادمج امتيازات متعددة في مجموعة امتيازات واحدة لتبسيط عملية منح الامتيازات لدور ما.

  6. +
  7. منح امتيازات أو مجموعات امتيازات لدور ما: تحديد إمكانيات الدور من خلال منح امتيازات أو مجموعات امتيازات لهذا الدور.

  8. +
  9. منح الأدوار للمستخدمين: منح أدوار بامتيازات معينة للمستخدمين بحيث يمكن للمستخدمين الحصول على امتيازات الدور. يمكن منح دور واحد لعدة مستخدمين.

  10. +
diff --git a/localization/v2.5.x/site/ar/adminGuide/resource_group.json b/localization/v2.5.x/site/ar/adminGuide/resource_group.json new file mode 100644 index 000000000..5c3d00c41 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/resource_group.json @@ -0,0 +1 @@ +{"codeList":["{\n \"requests\": { \"nodeNum\": 1 },\n \"limits\": { \"nodeNum\": 1 },\n \"transfer_from\": [{ \"resource_group\": \"rg1\" }],\n \"transfer_to\": [{ \"resource_group\": \"rg2\" }]\n}\n","import pymilvus\n\n# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).\nname = \"rg\"\nnode_num = 0\n\n# create a resource group that exactly hold no query node.\ntry:\n utility.create_resource_group(name, config=utility.ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n ), using='default')\n print(f\"Succeeded in creating resource group {name}.\")\nexcept Exception:\n print(\"Failed to create the resource group.\")\n","rgs = utility.list_resource_groups(using='default')\nprint(f\"Resource group list: {rgs}\")\n\n# Resource group list: ['__default_resource_group', 'rg']\n","info = utility.describe_resource_group(name, using=\"default\")\nprint(f\"Resource group description: {info}\")\n\n# Resource group description: \n# , // string, rg name\n# , // int, num_node which has been transfer to this rg\n# , // int, available node_num, some node may shutdown\n# , // map[string]int, from collection_name to loaded replica of each collecion in this rg\n# , // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg \n# . // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg\n","source = '__default_resource_group'\ntarget = 'rg'\nexpected_num_nodes_in_default = 0\nexpected_num_nodes_in_rg = 1\n\ntry:\n utility.update_resource_groups({\n source: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_default},\n limits={\"node_num\": expected_num_nodes_in_default},\n ),\n target: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_rg},\n limits={\"node_num\": expected_num_nodes_in_rg},\n )\n }, using=\"default\")\n print(f\"Succeeded in move 1 node(s) from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving nodes.\")\n\n# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.\n","from pymilvus import Collection\n\ncollection = Collection('demo')\n\n# Milvus loads the collection to the default resource group.\ncollection.load(replica_number=2)\n\n# Or, you can ask Milvus load the collection to the desired resource group.\n# make sure that query nodes num should be greater or equal to replica_number\nresource_groups = ['rg']\ncollection.load(replica_number=2, _resource_groups=resource_groups) \n","collection = Collection(\"Books\")\n\n# Use the load method of a collection to load one of its partition\ncollection.load([\"Novels\"], replica_number=2, _resource_groups=resource_groups)\n\n# Or, you can use the load method of a partition directly\npartition = Partition(collection, \"Novels\")\npartition.load(replica_number=2, _resource_groups=resource_groups)\n","source = '__default_resource_group'\ntarget = 'rg'\ncollection_name = 'c'\nnum_replicas = 1\n\ntry:\n utility.transfer_replica(source, target, collection_name, num_replicas, using=\"default\")\n print(f\"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving replicas.\")\n\n# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.\n","try:\n utility.update_resource_groups({\n \"rg\": utility.ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n ),\n }, using=\"default\")\n utility.drop_resource_group(\"rg\", using=\"default\")\n print(f\"Succeeded in dropping {source}.\")\nexcept Exception:\n print(f\"Something went wrong while dropping {source}.\")\n","from pymilvus import utility\nfrom pymilvus.client.types import ResourceGroupConfig\n\n_PENDING_NODES_RESOURCE_GROUP=\"__pending_nodes\"\n\ndef init_cluster(node_num: int):\n print(f\"Init cluster with {node_num} nodes, all nodes will be put in default resource group\")\n # create a pending resource group, which can used to hold the pending nodes that do not hold any data.\n utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(\n requests={\"node_num\": 0}, # this resource group can hold 0 nodes, no data will be load on it.\n limits={\"node_num\": 10000}, # this resource group can hold at most 10000 nodes \n ))\n\n # update default resource group, which can used to hold the nodes that all initial node in it.\n utility.update_resource_groups({\n \"__default_resource_group\": ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.\n )})\n utility.create_resource_group(name=\"rg1\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n utility.create_resource_group(name=\"rg2\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n\ninit_cluster(1)\n","\ndef scale_to(node_num: int):\n # scale the querynode number in Milvus into node_num.\n pass\n","# scale rg1 into 3 nodes, rg2 into 1 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 3},\n limits={\"node_num\": 3},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n \"rg2\": ResourceGroupConfig(\n requests={\"node_num\": 1},\n limits={\"node_num\": 1},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\nscale_to(5)\n# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.\n","# scale rg1 from 3 nodes into 2 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 2},\n limits={\"node_num\": 2},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\n\n# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.\nscale_to(4)\n# scale the node in __pending_nodes\n"],"headingContent":"Manage Resource Groups","anchorList":[{"label":"إدارة مجموعات الموارد","href":"Manage-Resource-Groups","type":1,"isActive":false},{"label":"ما هي مجموعة الموارد","href":"What-is-a-resource-group","type":2,"isActive":false},{"label":"مفاهيم مجموعة الموارد","href":"Concepts-of-resource-group","type":2,"isActive":false},{"label":"استخدم واجهة برمجة التطبيقات التوضيحية لإدارة مجموعة الموارد","href":"Use-declarative-api-to-manage-resource-group","type":2,"isActive":false},{"label":"ممارسة جيدة لإدارة توسيع نطاق المجموعة","href":"A-good-practice-to-manage-cluster-scaling","type":2,"isActive":false},{"label":"كيف تتفاعل مجموعات الموارد مع النسخ المتماثلة المتعددة","href":"How-resource-groups-interacts-with-multiple-replicas","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/resource_group.md b/localization/v2.5.x/site/ar/adminGuide/resource_group.md new file mode 100644 index 000000000..af0144616 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/resource_group.md @@ -0,0 +1,353 @@ +--- +id: resource_group.md +related_key: Manage Resource Groups +summary: تعلم كيفية إدارة مجموعات الموارد. +title: إدارة مجموعات الموارد +--- +

إدارة مجموعات الموارد

في ميلفوس، يمكنك استخدام مجموعة موارد لعزل بعض عقد الاستعلام فعلياً عن العقد الأخرى. يرشدك هذا الدليل إلى كيفية إنشاء مجموعات موارد مخصصة وإدارتها بالإضافة إلى نقل العقد بينها.

+

ما هي مجموعة الموارد

يمكن أن تحتوي مجموعة الموارد على عدة أو كل عقد الاستعلام في مجموعة Milvus. يمكنك تحديد الطريقة التي تريد بها تخصيص عقد الاستعلام بين مجموعات الموارد بناءً على ما هو الأكثر منطقية بالنسبة لك. على سبيل المثال، في سيناريو متعدد المجموعات، يمكنك تخصيص عدد مناسب من عقد الاستعلام لكل مجموعة موارد وتحميل المجموعات في مجموعة موارد مختلفة، بحيث تكون العمليات داخل كل مجموعة مستقلة فعليًا عن تلك الموجودة في المجموعات الأخرى.

+

لاحظ أن مثيل Milvus يحتفظ بمجموعة موارد افتراضية لاحتواء جميع عقد الاستعلام عند بدء التشغيل ويسميها __default_resource_group.

+

بدءًا من الإصدار 2.4.1، يوفر Milvus واجهة برمجة تطبيقات مجموعة الموارد التوضيحية، بينما تم إهمال واجهة برمجة تطبيقات مجموعة الموارد القديمة. تُمكِّن واجهة برمجة التطبيقات التوضيحية الجديدة المستخدمين من تحقيق الخصوصية في بيئات السحابة الأصلية بشكل أسهل.

+

مفاهيم مجموعة الموارد

يتم وصف مجموعة الموارد من خلال تكوين مجموعة الموارد:

+
{
+    "requests": { "nodeNum": 1 },
+    "limits": { "nodeNum": 1 },
+    "transfer_from": [{ "resource_group": "rg1" }],
+    "transfer_to": [{ "resource_group": "rg2" }]
+}
+
+
    +
  • تحدد سمة الطلبات الشروط التي يجب أن تستوفيها مجموعة الموارد.
  • +
  • تحدد سمة الحدود الحدود الحدود القصوى لمجموعة الموارد.
  • +
  • تصف السمتان Transfer_from و Transfer_to مجموعات الموارد التي يفضل أن تحصل منها مجموعة الموارد على الموارد وإلى أي مجموعات الموارد يجب أن تنقل الموارد، على التوالي.
  • +
+

بمجرد أن يتغير تكوين مجموعة الموارد، يقوم الميلفوس بتعديل موارد عقدة الاستعلام الحالية قدر الإمكان وفقاً للتكوين الجديد، مما يضمن أن جميع مجموعات الموارد تستوفي في النهاية الشرط التالي

+

.requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.

+

باستثناء الحالات التالية:

+
    +
  • عندما يكون عدد عُقَد الاستعلام في مجموعة Milvus غير كافٍ، أي NumOfQueryNode < sum(.requests.nodeNum) ، ستكون هناك دائمًا مجموعات موارد بدون عدد كافٍ من عُقَد الاستعلام.
  • +
  • عندما يكون عدد عُقد الاستعلام في مجموعة Milvus زائدًا، أي NumOfQueryNode > sum(.limits.nodeNum) ، سيتم دائمًا وضع عُقد الاستعلام الزائدة في مجموعة الموارد __المجموعة_الافتراضية_الموارد أولاً.
  • +
+

وبالطبع، إذا تغير عدد عُقد الاستعلام في المجموعة، سيحاول الميلفوس باستمرار تعديلها لتلبية الشروط النهائية. لذلك، يمكنك أولًا تطبيق تغييرات تكوين مجموعة الموارد ثم إجراء تحجيم QueryNode.

+

استخدم واجهة برمجة التطبيقات التوضيحية لإدارة مجموعة الموارد

+

جميع نماذج التعليمات البرمجية في هذه الصفحة موجودة في PyMilvus 2.5.3. قم بترقية تثبيت PyMilvus قبل تشغيلها.

+
+
    +
  1. إنشاء مجموعة موارد.

    +

    لإنشاء مجموعة موارد، قم بتشغيل ما يلي بعد الاتصال بمثيل Milvus. يفترض المقتطف التالي أن default هو الاسم المستعار لاتصالك بـ Milvus.

    +
    import pymilvus
    +
    +# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).
    +name = "rg"
    +node_num = 0
    +
    +# create a resource group that exactly hold no query node.
    +try:
    +    utility.create_resource_group(name, config=utility.ResourceGroupConfig(
    +        requests={"node_num": node_num},
    +        limits={"node_num": node_num},
    +    ), using='default')
    +    print(f"Succeeded in creating resource group {name}.")
    +except Exception:
    +    print("Failed to create the resource group.")
    +
  2. +
  3. سرد مجموعات الموارد.

    +

    بمجرد إنشاء مجموعة موارد، يمكنك رؤيتها في قائمة مجموعات الموارد.

    +

    لعرض قائمة مجموعات الموارد في مثيل ميلفوس، قم بما يلي:

    +
    rgs = utility.list_resource_groups(using='default')
    +print(f"Resource group list: {rgs}")
    +
    +# Resource group list: ['__default_resource_group', 'rg']
    +
  4. +
  5. وصف مجموعة موارد.

    +

    يمكنك جعل ميلفوس يصف مجموعة موارد في قلق على النحو التالي:

    +
    info = utility.describe_resource_group(name, using="default")
    +print(f"Resource group description: {info}")
    +
    +# Resource group description: 
    +#        <name:"rg">,           // string, rg name
    +#        <capacity:1>,            // int, num_node which has been transfer to this rg
    +#        <num_available_node:0>,  // int, available node_num, some node may shutdown
    +#        <num_loaded_replica:{}>, // map[string]int, from collection_name to loaded replica of each collecion in this rg
    +#        <num_outgoing_node:{}>,  // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg 
    +#        <num_incoming_node:{}>.  // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg
    +
  6. +
  7. نقل العقد بين مجموعات الموارد.

    +

    قد تلاحظ أن مجموعة الموارد الموصوفة لا تحتوي على أي عقدة استعلام بعد. انقل بعض العُقد من مجموعة الموارد الافتراضية إلى المجموعة التي تقوم بإنشائها على النحو التالي: بافتراض وجود عقدة استعلام واحدة حاليًا في _مجموعة الموارد _المجموعة_الافتراضية_المجموعة_المجموعة_الموارد، ونريد نقل عقدة واحدة إلى rg المنشأة.update_resource_groups يضمن الذرية لتغييرات التكوين المتعددة، لذلك لن تكون هناك حالات وسيطة مرئية لـ Milvus.

    +
    source = '__default_resource_group'
    +target = 'rg'
    +expected_num_nodes_in_default = 0
    +expected_num_nodes_in_rg = 1
    +
    +try:
    +    utility.update_resource_groups({
    +        source: ResourceGroupConfig(
    +            requests={"node_num": expected_num_nodes_in_default},
    +            limits={"node_num": expected_num_nodes_in_default},
    +        ),
    +        target: ResourceGroupConfig(
    +            requests={"node_num": expected_num_nodes_in_rg},
    +            limits={"node_num": expected_num_nodes_in_rg},
    +        )
    +    }, using="default")
    +    print(f"Succeeded in move 1 node(s) from {source} to {target}.")
    +except Exception:
    +    print("Something went wrong while moving nodes.")
    +
    +# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.
    +
  8. +
  9. تحميل المجموعات والأقسام إلى مجموعة موارد.

    +

    بمجرد وجود عقد الاستعلام في مجموعة موارد، يمكنك تحميل المجموعات إلى مجموعة الموارد هذه. يفترض المقتطف التالي وجود مجموعة باسم demo موجودة بالفعل.

    +
    from pymilvus import Collection
    +
    +collection = Collection('demo')
    +
    +# Milvus loads the collection to the default resource group.
    +collection.load(replica_number=2)
    +
    +# Or, you can ask Milvus load the collection to the desired resource group.
    +# make sure that query nodes num should be greater or equal to replica_number
    +resource_groups = ['rg']
    +collection.load(replica_number=2, _resource_groups=resource_groups) 
    +
    +

    أيضًا، يمكنك فقط تحميل قسم في مجموعة موارد وتوزيع نسخه المتماثلة على عدة مجموعات موارد. يفترض ما يلي أن المجموعة المسماة Books موجودة بالفعل ولديها قسم اسمه Novels.

    +
    collection = Collection("Books")
    +
    +# Use the load method of a collection to load one of its partition
    +collection.load(["Novels"], replica_number=2, _resource_groups=resource_groups)
    +
    +# Or, you can use the load method of a partition directly
    +partition = Partition(collection, "Novels")
    +partition.load(replica_number=2, _resource_groups=resource_groups)
    +
    +

    لاحظ أن _resource_groups هو معلمة اختيارية، وتركه غير محدد يجعل ميلفوس يقوم بتحميل النسخ المتماثلة على عقد الاستعلام في مجموعة الموارد الافتراضية.

    +

    لجعل ميلفوس يقوم بتحميل كل نسخة متماثلة من المجموعة في مجموعة موارد منفصلة، تأكد من أن عدد مجموعات الموارد يساوي عدد النسخ المتماثلة.

  10. +
  11. نقل النسخ المتماثلة بين مجموعات الموارد.

    +

    يستخدم ميلفوس النسخ المتماثلة لتحقيق موازنة التحميل بين المجموعات الموزعة عبر عدة عقد استعلام. يمكنك نقل نسخ متماثلة معينة من مجموعة ما من مجموعة موارد إلى أخرى على النحو التالي:

    +
    source = '__default_resource_group'
    +target = 'rg'
    +collection_name = 'c'
    +num_replicas = 1
    +
    +try:
    +    utility.transfer_replica(source, target, collection_name, num_replicas, using="default")
    +    print(f"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.")
    +except Exception:
    +    print("Something went wrong while moving replicas.")
    +
    +# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.
    +
  12. +
  13. إسقاط مجموعة موارد.

    +

    يمكنك إسقاط مجموعة موارد لا تحتوي على عقدة استعلام (limits.node_num = 0) في أي وقت. في هذا الدليل، تحتوي مجموعة الموارد rg الآن على عقدة استعلام واحدة. تحتاج إلى تغيير التكوين limits.node_num لمجموعة الموارد إلى صفر أولاً.

    +
    try:
    +    utility.update_resource_groups({
    +        "rg": utility.ResourceGroupConfig(
    +            requests={"node_num": 0},
    +            limits={"node_num": 0},
    +        ),
    +    }, using="default")
    +    utility.drop_resource_group("rg", using="default")
    +    print(f"Succeeded in dropping {source}.")
    +except Exception:
    +    print(f"Something went wrong while dropping {source}.")
    +
  14. +
+

لمزيد من التفاصيل، يُرجى الرجوع إلى الأمثلة ذات الصلة في pymilvus

+

ممارسة جيدة لإدارة توسيع نطاق المجموعة

في الوقت الحالي، لا يمكن لـ Milvus التوسع بشكل مستقل في البيئات السحابية الأصلية. ومع ذلك، باستخدام واجهة برمجة تطبيقات مجموعة الموارد التوضيحية بالاقتران مع تنسيق الحاويات، يمكن لـ Milvus تحقيق عزل الموارد وإدارتها بسهولة لـ QueryNodes. فيما يلي ممارسة جيدة لإدارة QueryNodes في بيئة سحابية:

+
    +
  1. بشكل افتراضي، ينشئ Milvus مجموعة_موارد_افتراضية. لا يمكن حذف مجموعة الموارد هذه وتعمل أيضًا كمجموعة موارد التحميل الافتراضية لجميع المجموعات ويتم دائمًا تعيين QueryNodes الزائدة عن الحاجة إليها. لذلك، يمكننا إنشاء مجموعة موارد معلقة للاحتفاظ بموارد QueryNode غير المستخدمة، مما يمنع موارد QueryNode من أن تشغلها _مجموعة_الموارد_الافتراضية_المجموعة.

    +

    بالإضافة إلى ذلك، إذا فرضنا القيد بصرامة sum(.requests.nodeNum) <= queryNodeNum ، يمكننا التحكم بدقة في تخصيص QueryNode في المجموعة. لنفترض أنه يوجد حاليًا عقدة استعلام واحدة فقط في المجموعة ونقوم بتهيئة المجموعة. إليك مثال على الإعداد:

    +
    from pymilvus import utility
    +from pymilvus.client.types import ResourceGroupConfig
    +
    +_PENDING_NODES_RESOURCE_GROUP="__pending_nodes"
    +
    +def init_cluster(node_num: int):
    +    print(f"Init cluster with {node_num} nodes, all nodes will be put in default resource group")
    +    # create a pending resource group, which can used to hold the pending nodes that do not hold any data.
    +    utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(
    +        requests={"node_num": 0}, # this resource group can hold 0 nodes, no data will be load on it.
    +        limits={"node_num": 10000}, # this resource group can hold at most 10000 nodes 
    +    ))
    +
    +    # update default resource group, which can used to hold the nodes that all initial node in it.
    +    utility.update_resource_groups({
    +        "__default_resource_group": ResourceGroupConfig(
    +            requests={"node_num": node_num},
    +            limits={"node_num": node_num},
    +            transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.
    +            transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.
    +        )})
    +    utility.create_resource_group(name="rg1", config=ResourceGroupConfig(
    +        requests={"node_num": 0},
    +        limits={"node_num": 0},
    +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
    +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +    ))
    +    utility.create_resource_group(name="rg2", config=ResourceGroupConfig(
    +        requests={"node_num": 0},
    +        limits={"node_num": 0},
    +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
    +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +    ))
    +
    +init_cluster(1)
    +
    +

    باستخدام كود المثال أعلاه، ننشئ مجموعة موارد باسم __عُقد_معلقة_للاحتفاظ بعُقد استعلام إضافية. نقوم أيضًا بإنشاء مجموعتي موارد خاصة بالمستخدم باسم rg1 و rg2. بالإضافة إلى ذلك، نتأكد من أن مجموعة الموارد الأخرى تعطي الأولوية لاستعادة عقد الاستعلام المفقودة أو الزائدة عن الحاجة من __عقد_انتظار_نود.

  2. +
  3. توسيع نطاق المجموعة

    +

    بافتراض أن لدينا وظيفة القياس التالية:

    +
    
    +def scale_to(node_num: int):
    +    # scale the querynode number in Milvus into node_num.
    +    pass
    +
    +

    يمكننا استخدام واجهة برمجة التطبيقات لتوسيع نطاق مجموعة موارد محددة إلى عدد معين من عُقد الاستعلام دون التأثير على أي مجموعات موارد أخرى.

    +
    # scale rg1 into 3 nodes, rg2 into 1 nodes
    +utility.update_resource_groups({
    +    "rg1": ResourceGroupConfig(
    +        requests={"node_num": 3},
    +        limits={"node_num": 3},
    +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +    ),
    +    "rg2": ResourceGroupConfig(
    +        requests={"node_num": 1},
    +        limits={"node_num": 1},
    +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +    ),
    +})
    +scale_to(5)
    +# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.
    +
  4. +
  5. توسيع نطاق المجموعة إلى الداخل

    +

    وبالمثل، يمكننا إنشاء قواعد توسيع نطاق في التي تعطي الأولوية لاختيار QueryNodes من مجموعة الموارد _pending_nodes. يمكن الحصول على هذه المعلومات من خلال واجهة برمجة التطبيقات describe_resource_group. تحقيق هدف التوسع في مجموعة الموارد المحددة.

    +
    # scale rg1 from 3 nodes into 2 nodes
    +utility.update_resource_groups({
    +    "rg1": ResourceGroupConfig(
    +        requests={"node_num": 2},
    +        limits={"node_num": 2},
    +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
    +    ),
    +})
    +
    +# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.
    +scale_to(4)
    +# scale the node in __pending_nodes
    +
  6. +
+

كيف تتفاعل مجموعات الموارد مع النسخ المتماثلة المتعددة

    +
  • تمتلك النسخ المتماثلة لمجموعة واحدة ومجموعات الموارد علاقة N إلى N.
  • +
  • عندما يتم تحميل نسخ متماثلة متعددة من مجموعة واحدة في مجموعة موارد واحدة، يتم توزيع QueryNodes من مجموعة الموارد تلك بالتساوي بين النسخ المتماثلة، مما يضمن ألا يتجاوز الفرق في عدد QueryNodes لكل نسخة متماثلة 1.
  • +
+

ما التالي

لنشر مثيل Milvus متعدد المستأجرين، اقرأ ما يلي:

+ diff --git a/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.json b/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.json new file mode 100644 index 000000000..c91880f23 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.json @@ -0,0 +1 @@ +{"codeList":["# new-values.yaml\nminio:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yam;\nminio:\n zones: 2\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n resources:\n limits:\n cpu: 2\n memory: 12Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n replicaCount: 4\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n broker:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","pulsar:\n bookkeeper:\n volumes:\n journal:\n size: 20Gi\n storageClassName: gp3\n","# new-values.yaml\npulsar:\n broker:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n replicaCount: 5\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n"],"headingContent":"Scale Milvus Dependencies","anchorList":[{"label":"تبعيات مقياس ميلفوس","href":"Scale-Milvus-Dependencies","type":1,"isActive":false},{"label":"توسيع نطاق MinIO","href":"Scale-MinIO","type":2,"isActive":false},{"label":"كافكا","href":"Kafka","type":2,"isActive":false},{"label":"إضافة تجمع وسيط كافكا إضافي (يُنصح بذلك)","href":"Add-an-extra-Kafka-broker-pool-Recommended","type":2,"isActive":false},{"label":"بولسار","href":"Pulsar","type":2,"isActive":false},{"label":"زيادة الموارد في كل جراب وسيط بولسار","href":"Increase-resources-per-Pulsar-broker-pod","type":2,"isActive":false},{"label":"زيادة الموارد لكل جراب وكيل مراهنات بولسار","href":"Increase-resources-per-Pulsar-bookie-pod","type":2,"isActive":false},{"label":"إلخd","href":"etcd","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.md b/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.md new file mode 100644 index 000000000..3208e0ba5 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/scale-dependencies.md @@ -0,0 +1,252 @@ +--- +id: scale-dependencies.md +title: تبعيات المقياس +--- +

تبعيات مقياس ميلفوس

يعتمد ميلفوس على العديد من التبعيات مثل MinIO وKafka وPulsar و إلخ. يمكن أن يؤدي توسيع نطاق هذه المكونات إلى تعزيز قدرة ميلفوس على التكيف مع المتطلبات المختلفة.

+ +

توسيع نطاق MinIO

زيادة الموارد لكل جراب MinIO

يمكن زيادة موارد MinIO، وهو نظام تخزين الكائنات الذي يستخدمه Milvus، لوحدة المعالجة المركزية وموارد الذاكرة الخاصة به لكل جراب.

+
# new-values.yaml
+minio:
+  resources:
+     limits:
+       cpu: 2
+       memory: 8Gi
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

يمكنك أيضًا زيادة سعة القرص لمجموعة MioIO عن طريق تغيير قيمة spec.resources.requests.storage يدويًا لكل مطالبة وحدة تخزين ثابتة من MioIO (PVC). لاحظ أن فئة التخزين الافتراضية يجب أن تسمح بتوسيع وحدة التخزين.

+

يُنصح بإضافة تجمع خوادم MioIO إضافي لمثيل Milvus الخاص بك.

+
# new-values.yam;
+minio:
+  zones: 2
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

يؤدي هذا إلى إضافة تجمع خوادم إضافي إلى مجموعة خوادم MinIO الخاصة بك، مما يسمح لـ Milvus بالكتابة إلى تجمع خوادم MinIO استناداً إلى سعة القرص الحرة لكل تجمع خوادم. على سبيل المثال، إذا كان لدى مجموعة مكونة من ثلاثة تجمعات مساحة حرة إجمالية قدرها 10 تيرابايت موزعة على التجمعات على النحو التالي:

+ + + + + + + + + +
المساحة الخاليةإمكانية الكتابة
المجمع أ3 تيرابايت30% (3/10)
المجمع ب2 TiB20% (2/10)
المجموعة C5 TiB50% (5/10)
+
+

لا يقوم MinIO بإعادة توازن الكائنات تلقائيًا عبر تجمعات الخوادم الجديدة. يمكنك بدء إجراء إعادة التوازن يدويًا باستخدام mc admin rebalance إذا لزم الأمر.

+
+

كافكا

زيادة الموارد لكل جراب وسيط كافكا

قم بزيادة سعة وسيط كافكا عن طريق تعديل موارد وحدة المعالجة المركزية والذاكرة لكل جراب وسيط.

+
# new-values.yaml
+kafka:
+  resources:
+     limits:
+        cpu: 2
+        memory: 12Gi
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

يمكنك أيضًا زيادة سعة الأقراص لمجموعة كافكا عن طريق تغيير قيمة spec.resources.requests.storage يدويًا لكل مطالبة وحدة تخزين ثابتة لكافكا (PVC). تأكد من أن فئة التخزين الافتراضية تسمح بتوسيع وحدة التخزين.

+

يُنصح بإضافة تجمّع خوادم كافكا إضافي لمثيل ميلفوس الخاص بك.

+
# new-values.yaml
+kafka:
+  replicaCount: 4
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

سيؤدي هذا إلى إضافة وسيط إضافي إلى مجموعة كافكا الخاصة بك.

+
+

لا يقوم كافكا بإعادة موازنة المواضيع تلقائيًا عبر جميع الوسطاء. قم بإعادة موازنة المواضيع/الأقسام يدويًا عبر جميع وسطاء كافكا باستخدام bin/kafka-reassign-partitions.sh بعد تسجيل الدخول إلى كل جراب وسيط كافكا إذا لزم الأمر.

+
+

بولسار

يفصل بولسار بين الحوسبة والتخزين. يمكنك بشكل مستقل زيادة سعة وسطاء بولسار (الحوسبة) ووسطاء بولسار (التخزين).

+

زيادة الموارد في كل جراب وسيط بولسار

# new-values.yaml
+pulsar:
+  broker:
+    resources:
+       limits:
+         cpu: 4
+         memory: 16Gi
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

زيادة الموارد لكل جراب وكيل مراهنات بولسار

# new-values.yaml
+pulsar:
+  bookkeeper:
+    resources:
+       limits:
+         cpu: 4
+         memory: 16Gi
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

يمكنك أيضًا زيادة سعة القرص لمجموعة Pulsar من خلال تغيير قيمة spec.resources.requests.storage يدويًا لكل مطالبة وحدة تخزين ثابتة لكل وكيل مراهنات Pulsar (PVC). لاحظ أن فئة التخزين الافتراضية يجب أن تسمح بتوسيع وحدة التخزين.

+

تحتوي جراب وكيل مراهنات Pulsar على نوعين من التخزين: journal و legers. بالنسبة لنوع التخزين journal ، فكر في استخدام ssd أو gp3 كفئة تخزين. فيما يلي مثال لتحديد فئة التخزين لمجلة بولسار.

+
pulsar:
+  bookkeeper:
+    volumes:
+      journal:
+        size: 20Gi
+        storageClassName: gp3
+
+

إضافة جراب وسيط نابض إضافي

# new-values.yaml
+pulsar:
+  broker:
+    replicaCount: 3
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+
# new-values.yaml
+pulsar:
+  bookkeeper:
+    replicaCount: 3
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

إلخd

# new-values.yaml
+etcd:
+  resources:
+     limits:
+       cpu: 2
+       memory: 8Gi
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
+

إضافة كبسولات إلخd إضافية

يجب أن يكون العدد الإجمالي لحجرات إلخd بأعداد فردية.

+
# new-values.yaml
+etcd:
+  replicaCount: 5
+
+

بعد حفظ الملف، قم بتطبيق التغييرات باستخدام الأمر التالي:

+
helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/scaleout.json b/localization/v2.5.x/site/ar/adminGuide/scaleout.json new file mode 100644 index 000000000..261591f98 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/scaleout.json @@ -0,0 +1 @@ +{"codeList":["NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 1m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 1m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 1m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 1m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 1m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 1m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 1m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 1m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 1m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 1m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 1m \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-czq9f 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-jcdcn 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n"],"headingContent":"Scale a Milvus Cluster","anchorList":[{"label":"توسيع نطاق مجموعة ميلفوس العنقودية","href":"Scale-a-Milvus-Cluster","type":1,"isActive":false},{"label":"ما هو القياس الأفقي؟","href":"What-is-horizontal-scaling","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"توسيع نطاق مجموعة Milvus","href":"Scale-a-Milvus-cluster","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/scaleout.md b/localization/v2.5.x/site/ar/adminGuide/scaleout.md new file mode 100644 index 000000000..e2b2d5eae --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/scaleout.md @@ -0,0 +1,183 @@ +--- +id: scaleout.md +related_key: scale Milvus cluster +summary: >- + تعرف على كيفية توسيع النطاق يدويًا أو تلقائيًا وتوسيع نطاقه في مجموعة Milvus + العنقودية. +title: توسيع نطاق مجموعة ميلفوس العنقودية +--- +

توسيع نطاق مجموعة ميلفوس العنقودية

يدعم Milvus التوسع الأفقي لمكوناته. هذا يعني أنه يمكنك إما زيادة أو تقليل عدد العُقد العاملة من كل نوع وفقًا لحاجتك الخاصة.

+

يصف هذا الموضوع كيفية توسيع نطاق مجموعة Milvus وتوسيع نطاقها. نفترض أنك قد قمت بالفعل بتثبيت مجموعة Milvus قبل التوسع. نوصي أيضًا بالتعرف على بنية Milvus قبل البدء.

+

يأخذ هذا البرنامج التعليمي توسيع نطاق ثلاث عقد استعلام كمثال. لتوسيع نطاق أنواع أخرى من العُقد، استبدل queryNode بنوع العقدة المطابق في سطر الأوامر.

+
+

للحصول على معلومات حول كيفية توسيع نطاق مجموعة باستخدام مشغل Milvus، راجع توسيع نطاق مجموعة باستخدام مشغل Milvus.

+
+

ما هو القياس الأفقي؟

يتضمن التوسع الأفقي التوسع للخارج والتوسع للداخل.

+

التوسع للخارج

يشير توسيع النطاق إلى زيادة عدد العقد في المجموعة. على عكس التوسع، لا يتطلب توسيع النطاق إلى الخارج تخصيص المزيد من الموارد لعقدة واحدة في المجموعة. بدلاً من ذلك، يعمل توسيع النطاق على توسيع الكتلة أفقياً عن طريق إضافة المزيد من العقد.

+

+ + Scaleout + توسيع النطاق

+

+ + Scaleup + توسيع النطاق

+

وفقًا لبنية Milvus، تتضمن العقد العاملة عديمة الحالة عقدة الاستعلام وعقدة البيانات وعقدة الفهرس والوكيل. لذلك، يمكنك توسيع نطاق هذه الأنواع من العقد لتناسب احتياجات عملك وسيناريوهات التطبيق. يمكنك إما توسيع نطاق مجموعة Milvus يدويًا أو تلقائيًا.

+

بشكل عام، ستحتاج بشكل عام إلى توسيع نطاق مجموعة Milvus التي قمت بإنشائها إذا تم استخدامها بشكل مفرط. فيما يلي بعض المواقف النموذجية التي قد تحتاج فيها إلى توسيع نطاق مجموعة Milvus:

+
    +
  • ارتفاع استخدام وحدة المعالجة المركزية والذاكرة لفترة من الزمن.
  • +
  • يصبح إنتاجية الاستعلام أعلى.
  • +
  • مطلوب سرعة أعلى للفهرسة.
  • +
  • الحاجة إلى معالجة كميات هائلة من مجموعات البيانات الكبيرة.
  • +
  • يجب ضمان التوافر العالي لخدمة Milvus.
  • +
+

التوسع في

يشير التوسع في إلى تقليل عدد العقد في المجموعة. بشكل عام، ستحتاج إلى التوسع في مجموعة ميلفوس التي قمت بإنشائها إذا كانت غير مستغلة بشكل كافٍ. فيما يلي بعض المواقف النموذجية التي تحتاج فيها إلى التوسع في مجموعة Milvus العنقودية:

+
    +
  • انخفاض استخدام وحدة المعالجة المركزية والذاكرة لفترة من الزمن.
  • +
  • يصبح إنتاجية الاستعلام أقل.
  • +
  • سرعة أعلى للفهرسة غير مطلوبة.
  • +
  • حجم مجموعة البيانات المراد معالجتها صغير.
  • +
+
+لا نوصي بتقليل عدد عقد العمال بشكل كبير. على سبيل المثال، إذا كان هناك خمس عقد بيانات في المجموعة، نوصي بتقليل عقدة بيانات واحدة في كل مرة لضمان توافر الخدمة. إذا كانت الخدمة متوفرة بعد المحاولة الأولى للتوسع، يمكنك الاستمرار في تقليل عدد عقدة البيانات بشكل أكبر.
+

المتطلبات الأساسية

قم بتشغيل kubectl get pods للحصول على قائمة بالمكونات وحالة عملها في مجموعة Milvus التي قمت بإنشائها.

+
NAME                                            READY   STATUS       RESTARTS   AGE
+my-release-etcd-0                               1/1     Running      0          1m
+my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running      0          1m
+my-release-milvus-datanode-665d4586b9-525pm     1/1     Running      0          1m
+my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running      0          1m
+my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running      0          1m
+my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running      0          1m
+my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running      0          1m
+my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running      0          1m
+my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running      0          1m
+my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running      0          1m
+my-release-minio-5564fbbddc-9sbgv               1/1     Running      0          1m 
+
+
+يدعم Milvus إضافة العقد العاملة فقط ولا يدعم إضافة مكونات المنسق.
+

توسيع نطاق مجموعة Milvus

يمكنك توسيع نطاق مجموعة Milvus إما يدويًا أو تلقائيًا. إذا تم تمكين التوسيع التلقائي، فإن مجموعة Milvus ستتقلص أو تتوسع تلقائيًا عندما يصل استهلاك موارد وحدة المعالجة المركزية والذاكرة إلى القيمة التي قمت بتعيينها.

+

في الوقت الحالي، يدعم Milvus 2.1.0 حاليًا التوسيع يدويًا فقط.

+

توسيع النطاق

قم بتشغيل helm upgrade my-release milvus/milvus --set queryNode.replicas=3 --reuse-values لتوسيع نطاق عقدة الاستعلام يدويًا.

+

إذا نجحت، تتم إضافة ثلاث كبسولات قيد التشغيل على عقدة الاستعلام كما هو موضح في المثال التالي.

+
NAME                                            READY   STATUS    RESTARTS   AGE
+my-release-etcd-0                               1/1     Running   0          2m
+my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
+my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
+my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
+my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
+my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
+my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
+my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
+my-release-milvus-querynode-7c7779c6f8-czq9f    1/1     Running   0          5s
+my-release-milvus-querynode-7c7779c6f8-jcdcn    1/1     Running   0          5s
+my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
+my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
+my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
+
+

توسيع النطاق

قم بتشغيل helm upgrade my-release milvus/milvus --set queryNode.replicas=1 --reuse-values لتوسيع نطاق عقدة الاستعلام.

+

إذا نجحت، يتم تقليل ثلاث كبسولات قيد التشغيل على عقدة الاستعلام إلى واحدة كما هو موضح في المثال التالي.

+
NAME                                            READY   STATUS    RESTARTS   AGE
+my-release-etcd-0                               1/1     Running   0          2m
+my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
+my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
+my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
+my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
+my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
+my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
+my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
+my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
+my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
+my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/tls.json b/localization/v2.5.x/site/ar/adminGuide/tls.json new file mode 100644 index 000000000..69e9dbdc2 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/tls.json @@ -0,0 +1 @@ +{"codeList":["openssl version\n","sudo apt install openssl\n","mkdir cert && cd cert\ntouch gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out ca.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# create a new ca certificate\nopenssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n","chmod +x gen.sh\n./gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n","chmod +x renew.sh\n./renew.sh\n","proxy:\n http:\n # for now milvus do not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \ntls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n tlsMode: 1\n","internaltls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n internaltlsEnabled: true \n","├── docker-compose.yml\n├── milvus.yaml\n└── tls\n ├── server.pem\n ├── server.key\n └── ca.pem\n"," standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:latest\n command: [\"milvus\", \"run\", \"standalone\"]\n security_opt:\n - seccomp:unconfined\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","sudo docker compose up -d\n","├── milvus.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost # the CommonName in your certificates\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","kubectl create -f milvus.yaml\n","├── values.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","extraConfigFiles:\n user.yaml: |+\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS\n # Configure tls certificates path for external service\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update milvus\nhelm install my-release milvus/milvus -f values.yaml\n","[...date time...] [INFO] [utils/util.go:56] [\"Internal TLS Enabled\"] [value=true]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n server_pem_path=\"path_to/server.pem\",\n server_name=\"localhost\"\n)\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n client_pem_path=\"path_to/client.pem\",\n client_key_path=\"path_to/client.key\",\n ca_pem_path=\"path_to/ca.pem\",\n server_name=\"localhost\"\n)\n","curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n","curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n"],"headingContent":"Encryption in Transit","anchorList":[{"label":"التشفير أثناء النقل","href":"Encryption-in-Transit","type":1,"isActive":false},{"label":"إنشاء الشهادة الخاصة بك","href":"Create-your-own-certificate","type":2,"isActive":false},{"label":"إعداد خادم Milvus مع TLS","href":"Set-up-a-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"التحقق من تمكين TLS الداخلي","href":"Verify-Internal-TLS-enabled","type":2,"isActive":false},{"label":"الاتصال بخادم Milvus باستخدام TLS","href":"Connect-to-the-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"الاتصال بخادم Milvus RESTful مع TLS","href":"Connect-to-the-Milvus-RESTful-server-with-TLS","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/tls.md b/localization/v2.5.x/site/ar/adminGuide/tls.md new file mode 100644 index 000000000..5ff3d56c9 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/tls.md @@ -0,0 +1,449 @@ +--- +id: tls.md +title: التشفير أثناء النقل +summary: تعرف على كيفية تمكين بروكسي TLS في Milvus. +--- +

التشفير أثناء النقل

TLS (أمان طبقة النقل) هو بروتوكول تشفير لضمان أمان الاتصال. يستخدم وكيل Milvus بروكسي Milvus مصادقة TLS أحادية الاتجاه وثنائية الاتجاه.

+

يصف هذا الموضوع كيفية تمكين TLS في وكيل Milvus لكل من gRPC وRESTful عمليات النقل.

+
+

TLS ومصادقة المستخدم هما نهجان مختلفان للأمان. إذا قمت بتمكين كل من مصادقة المستخدم ومصادقة TLS في نظام Milvus الخاص بك، فستحتاج إلى توفير اسم مستخدم وكلمة مرور ومسارات ملفات الشهادات. للحصول على معلومات حول كيفية تمكين مصادقة المستخدم، راجع مصادقة وصول المستخدم.

+
+

إنشاء الشهادة الخاصة بك

المتطلبات الأساسية

تأكد من تثبيت OpenSSL. إذا لم تقم بتثبيته، قم بإنشاء OpenSSL وتثبيته أولاً.

+
openssl version
+
+

إذا لم يكن OpenSSL غير مثبت. يمكن تثبيته باستخدام الأمر التالي في Ubuntu.

+
sudo apt install openssl
+
+

إنشاء الملفات

    +
  1. قم بإنشاء الملف gen.sh.
  2. +
+
mkdir cert && cd cert
+touch gen.sh
+
+
    +
  1. انسخ البرنامج النصي التالي إلى gen.sh.
  2. +
+

من الضروري تكوين CommonName في الملف gen.sh. يشير CommonName إلى اسم الخادم الذي يجب أن يحدده العميل أثناء الاتصال.

+

gen.sh

+
#!/usr/bin/env sh
+# your variables
+Country="US"
+State="CA"
+Location="Redwood City"
+Organization="zilliz"
+OrganizationUnit="devops"
+CommonName="localhost"
+ExpireDays=3650 # 10 years
+
+# generate private key for ca, server and client
+openssl genpkey -quiet -algorithm rsa:2048 -out ca.key
+openssl genpkey -quiet -algorithm rsa:2048 -out server.key
+openssl genpkey -quiet -algorithm rsa:2048 -out client.key
+
+# create a new ca certificate
+openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \
+  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"
+
+# prepare extension config for signing certificates
+echo '[v3_req]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = serverAuth
+subjectAltName = @alt_names
+[alt_names]
+DNS = '$CommonName > openssl.cnf
+
+# sign server certificate with ca
+openssl req -new -key server.key\
+  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
+  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
+    -extfile ./openssl.cnf -extensions v3_req
+
+# sign client certificate with ca
+openssl req -new -key client.key\
+  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
+  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
+    -extfile ./openssl.cnf -extensions v3_req
+
+
+

+

تعتبر المتغيرات في الملف gen.sh ضرورية لعملية إنشاء ملف طلب توقيع الشهادة. المتغيرات الخمسة الأولى هي معلومات التوقيع الأساسية، بما في ذلك البلد والولاية والموقع والمنظمة ووحدة التنظيم. يجب توخي الحذر عند تكوين CommonName حيث سيتم التحقق منها أثناء الاتصال بين العميل والخادم.

+

تشغيل gen.sh لإنشاء شهادة

قم بتشغيل الملف gen.sh لإنشاء الشهادة.

+
chmod +x gen.sh
+./gen.sh
+
+

سيتم إنشاء الملفات السبعة التالية: ca.key ، ca.pem ، ca.srl ، ، server.key ، server.pem ، client.key ، client.pem.

+

تأكد من الاحتفاظ بالملفات ca.key ، ca.pem ، ، ca.srl آمنة من أجل تجديد شهاداتك لاحقًا. يتم استخدام الملفين server.key و server.pem من قبل الخادم، ويتم استخدام الملفين client.key و client.pem من قبل العميل.

+

تجديد الشهادات (اختياري)

إذا كنت ترغب في تجديد الشهادات في بعض الحالات، على سبيل المثال إذا كانت ستنتهي صلاحيتها قريباً، يمكنك استخدام البرنامج النصي التالي.

+

تحتاج إلى ca.key و ca.pem و ca.srl في دليل العمل الخاص بك.

+

renew.sh

+
#!/usr/bin/env sh
+# your variables
+Country="US"
+State="CA"
+Location="Redwood City"
+Organization="zilliz"
+OrganizationUnit="devops"
+CommonName="localhost"
+ExpireDays=3650 # 10 years
+
+# generate private key for ca, server and client
+openssl genpkey -quiet -algorithm rsa:2048 -out server.key
+openssl genpkey -quiet -algorithm rsa:2048 -out client.key
+
+# prepare extension config for signing certificates
+echo '[v3_req]
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+extendedKeyUsage = serverAuth
+subjectAltName = @alt_names
+[alt_names]
+DNS = '$CommonName > openssl.cnf
+
+# sign server certificate with ca
+openssl req -new -key server.key\
+  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
+  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
+    -extfile ./openssl.cnf -extensions v3_req
+
+# sign client certificate with ca
+openssl req -new -key client.key\
+  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
+  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
+    -extfile ./openssl.cnf -extensions v3_req
+
+

+

قم بتشغيل الملف renew.sh لإنشاء الشهادة.

+
chmod +x renew.sh
+./renew.sh
+
+

إعداد خادم Milvus مع TLS

يوضح هذا القسم خطوات تكوين خادم Milvus مع تشفير TLS.

+

الإعداد لـ Docker Compose

1. تعديل تكوين خادم Milvus

لتمكين TLS الخارجي، أضف التكوينات التالية في ملف milvus.yaml:

+
proxy:
+  http:
+    # for now milvus do not support config restful on same port with grpc
+    # so we set to 8080, grpc will still use 19530
+    port: 8080 
+tls:
+  serverPemPath: /milvus/tls/server.pem
+  serverKeyPath: /milvus/tls/server.key
+  caPemPath: /milvus/tls/ca.pem
+
+common:
+  security:
+    tlsMode: 1
+
+

المعلمات:

+
    +
  • serverPemPath: المسار إلى ملف شهادة الخادم.
  • +
  • serverKeyPath: المسار إلى ملف مفتاح الخادم.
  • +
  • caPemPath: المسار إلى ملف شهادة CA.
  • +
  • tlsMode: وضع TLS للخدمة الخارجية. قيم صالحة:
      +
    • 1: مصادقة أحادية الاتجاه، حيث يتطلب الخادم فقط شهادة ويقوم العميل بالتحقق منها. يتطلب هذا الوضع server.pem و server.key من جانب الخادم، و server.pem من جانب العميل.
    • +
    • 2: المصادقة ثنائية الاتجاه، حيث يتطلب كل من الخادم والعميل شهادات لإنشاء اتصال آمن. يتطلب هذا الوضع server.pem و server.key و ca.pem من جانب الخادم، و client.pem و client.key و ca.pem من جانب العميل.
    • +
  • +
+

لتمكين TLS الداخلي، أضف التكوينات التالية في الملف milvus.yaml:

+
internaltls:
+  serverPemPath: /milvus/tls/server.pem
+  serverKeyPath: /milvus/tls/server.key
+  caPemPath: /milvus/tls/ca.pem
+
+common:
+  security:
+    internaltlsEnabled: true 
+
+

المعلمات:

+
    +
  • serverPemPath: المسار إلى ملف شهادة الخادم.
  • +
  • serverKeyPath: المسار إلى ملف مفتاح الخادم.
  • +
  • caPemPath: المسار إلى ملف شهادة CA.
  • +
  • internaltlsEnabled: ما إذا كان سيتم تمكين TLS الداخلي. في الوقت الحالي يتم دعم TLS أحادي الاتجاه فقط.
  • +
+

2. تعيين ملفات الشهادات إلى الحاوية

إعداد ملفات الشهادات

قم بإنشاء مجلد جديد باسم tls في نفس دليل docker-compose.yaml. انسخ server.pem و server.key و ca.pem إلى المجلد tls. ضعهم في بنية دليل على النحو التالي:

+
├── docker-compose.yml
+├── milvus.yaml
+└── tls
+     ├── server.pem
+     ├── server.key
+     └── ca.pem
+
+

قم بتحديث تكوين Docker Compose

قم بتحرير الملف docker-compose.yaml لتعيين مسارات ملفات الشهادات داخل الحاوية كما هو موضح أدناه:

+
  standalone:
+    container_name: milvus-standalone
+    image: milvusdb/milvus:latest
+    command: ["milvus", "run", "standalone"]
+    security_opt:
+    - seccomp:unconfined
+    environment:
+      ETCD_ENDPOINTS: etcd:2379
+      MINIO_ADDRESS: minio:9000
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
+
+
نشر ميلفوس باستخدام Docker Compose

قم بتنفيذ الأمر التالي لنشر ميلفوس:

+
sudo docker compose up -d
+
+

إعداد مشغل Milvus

ضع ملفات الشهادة في دليل العمل الخاص بك. يجب أن تبدو بنية الدليل هكذا:

+
├── milvus.yaml (to be created later)
+├── server.pem
+├── server.key
+└── ca.pem
+
+

قم بإنشاء سر مع ملفات الشهادة:

+
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
+
+

لتمكين TLS الخارجي، أضف التكوينات التالية في الملف milvus.yaml:

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  config:
+    proxy:
+      http:
+        # for now not support config restful on same port with grpc
+        # so we set to 8080, grpc will still use 19530
+        port: 8080 
+    common:
+      security:
+        tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable
+    tls:
+      serverPemPath: /certs/server.pem
+      serverKeyPath: /certs/server.key
+      caPemPath: /certs/ca.pem
+  components:
+    # mount the certs secret to the milvus container
+    volumes:
+      - name: certs
+        secret:
+          secretName: certs
+    volumeMounts:
+      - name: certs
+        mountPath: /certs
+        readOnly: true
+
+

لتمكين TLS الداخلي، أضف التكوينات التالية في الملف milvus.yaml:

+

تذكر استبدال الحقل internaltls.sni بالاسم الشائع في شهاداتك.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  config:
+    proxy:
+      http:
+        # for now not support config restful on same port with grpc
+        # so we set to 8080, grpc will still use 19530
+        port: 8080 
+    common:
+      security:
+        internaltlsEnabled: true # whether to enable internal tls
+    # Configure tls certificates path for internal service
+    internaltls:
+      serverPemPath: /certs/server.pem
+      serverKeyPath: /certs/server.key
+      caPemPath: /certs/ca.pem
+      sni: localhost # the CommonName in your certificates
+  components:
+    # mount the certs secret to the milvus container
+    volumes:
+      - name: certs
+        secret:
+          secretName: certs
+    volumeMounts:
+      - name: certs
+        mountPath: /certs
+        readOnly: true
+
+

إنشاء ملف Milvus CR:

+
kubectl create -f milvus.yaml
+
+

الإعداد لـ Milvus Helm

ضع ملفات الشهادة في دليل العمل الخاص بك. يجب أن تبدو بنية الدليل هكذا:

+
├── values.yaml (to be created later)
+├── server.pem
+├── server.key
+└── ca.pem
+
+

إنشاء سر مع ملفات الشهادة:

+
kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
+
+

لتمكين TLS الخارجي، أضف التكوينات التالية في الملف values.yaml:

+
extraConfigFiles:
+  user.yaml: |+
+    proxy:
+      http:
+        # for now not support config restful on same port with grpc
+        # so we set to 8080, grpc will still use 19530
+        port: 8080 
+    common:
+      security:
+        tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS
+    # Configure tls certificates path for external service
+    tls:
+      serverPemPath: /certs/server.pem
+      serverKeyPath: /certs/server.key
+      caPemPath: /certs/ca.pem
+# mount the certs secret to the milvus container
+volumes:
+  - name: certs
+    secret:
+      secretName: certs
+volumeMounts:
+  - name: certs
+    mountPath: /certs
+    readOnly: true
+
+

لتمكين TLS الداخلي، أضف التكوينات التالية في الملف values.yaml:

+

تذكر استبدال الحقل internaltls.sni بالاسم الشائع في شهاداتك.

+
extraConfigFiles:
+  user.yaml: |+
+    common:
+      security:
+        internaltlsEnabled: true # whether to enable internal tls
+    # Configure tls certificates path for internal service
+    internaltls:
+      serverPemPath: /certs/server.pem
+      serverKeyPath: /certs/server.key
+      caPemPath: /certs/ca.pem
+      sni: localhost
+# mount the certs secret to the milvus container
+volumes:
+  - name: certs
+    secret:
+      secretName: certs
+volumeMounts:
+  - name: certs
+    mountPath: /certs
+    readOnly: true
+
+

قم بإنشاء إصدار ميلفوس:

+
helm repo add milvus https://zilliztech.github.io/milvus-helm/
+helm repo update milvus
+helm install my-release milvus/milvus -f values.yaml
+
+

التحقق من تمكين TLS الداخلي

من الصعب التحقق من TLS الداخلي مباشرة. يمكنك التحقق من سجل Milvus لمعرفة ما إذا كان TLS الداخلي ممكّنًا.

+

في سجل Milvus، يجب أن ترى الرسالة التالية إذا تم تمكين TLS الداخلي:

+
[...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
+
+

الاتصال بخادم Milvus باستخدام TLS

بالنسبة لتفاعلات SDK، استخدم الإعدادات التالية اعتماداً على وضع TLS.

+

اتصال TLS أحادي الاتجاه

قم بتوفير المسار إلى server.pem وتأكد من تطابق server_name مع CommonName الذي تم تكوينه في الشهادة.

+
from pymilvus import MilvusClient
+
+client = MilvusClient(
+    uri="https://localhost:19530",
+    secure=True,
+    server_pem_path="path_to/server.pem",
+    server_name="localhost"
+)
+
+

اتصال TLS ثنائي الاتجاه

قم بتوفير المسارات إلى client.pem و client.key و ca.pem وتأكد من أن server_name يطابق CommonName المكوّن في الشهادة.

+
from pymilvus import MilvusClient
+
+client = MilvusClient(
+    uri="https://localhost:19530",
+    secure=True,
+    client_pem_path="path_to/client.pem",
+    client_key_path="path_to/client.key",
+    ca_pem_path="path_to/ca.pem",
+    server_name="localhost"
+)
+
+

انظر example_tls1.py و example_tls2.py لمزيد من المعلومات.

+

الاتصال بخادم Milvus RESTful مع TLS

بالنسبة لواجهات برمجة تطبيقات RESTful، يمكنك التحقق من TLS باستخدام الأمر curl.

+

اتصال TLS أحادي الاتجاه

curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
+
+

اتصال TLS ثنائي الاتجاه

curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
+
diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.json b/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.json new file mode 100644 index 000000000..63a3de7a9 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.json @@ -0,0 +1 @@ +{"codeList":["kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​\n","[1] 8116​\nForwarding from 127.0.0.1:9091 -> 9091​\n\n","pid=8116​\n\n","curl 127.0.0.1:9091/api/v1/collections \\​\n|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\\​\n|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \\​\n> flushing_segments.json​\ncat flushing_segments.json​\n\n","{​\n \"segmentIDs\": [​\n 454097953998181000,​\n 454097953999383600,​\n 454097953998180800​\n ]​\n}​\n\n","cat flushing_segments.json| curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​\n\n","{\"status\":{},\"flushed\":true}​\n\n","kill $pid​\n\n","[1] + 8116 terminated kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 ​\n\n","helm -n default get values my-release -o yaml > values.yaml​\ncat values.yaml​\n\n","helm -n default uninstall my-release​\n\n","These resources were kept due to the resource policy:​\n[PersistentVolumeClaim] my-release-minio​\n​\nrelease \"my-release\" uninstalled​\n\n","kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​\nkubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​\necho \"Volume Claims:\"​\ncat pulsar-pvcs.txt​\necho \"Volumes:\"​\ncat pulsar-pvs.txt​\n\n","Volume Claims:​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​\nmy-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​\nVolumes:​\npvc-f590a4de-df31-4ca8-a424-007eac3c619a​\npvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​\npvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​\npvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​\npvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​\n\n","cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","persistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0\" deleted​\n\n","cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","Error from server (NotFound): persistentvolumeclaims \"pvc-f590a4de-df31-4ca8-a424-007eac3c619a\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a\" not found​\n\n","kubectl -n default get milvus my-release -o yaml > milvus.yaml​\nhead milvus.yaml -n 20​\n\n","apiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations:​\n milvus.io/dependency-values-merged: \"true\"​\n milvus.io/pod-service-label-added: \"true\"​\n milvus.io/querynode-current-group-id: \"0\"​\n creationTimestamp: \"2024-11-22T08:06:59Z\"​\n finalizers:​\n - milvus.milvus.io/finalizer​\n generation: 3​\n labels:​\n app: milvus​\n milvus.io/operator-version: 1.1.2​\nname: my-release​\nnamespace: default​\nresourceVersion: \"692217324\"​\nuid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​\nspec:​\n components:​\n\n","# a patch to retain etcd & storage data and delete pulsar data while delete milvus​\nspec:​\n dependencies:​\n etcd:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n storage:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n pulsar:​\n inCluster:​\n deletionPolicy: Delete​\n pvcDeletion: true​\n\n","kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​\n\n","milvus.milvus.io/my-release patched​\n\n","kubectl -n default delete milvus my-release --wait=false​\nkubectl -n default get milvus my-release​\nkubectl -n default delete milvus my-release --wait=true​\n\n","milvus.milvus.io \"my-release\" deleted​\nNAME MODE STATUS UPDATED AGE​\nmy-release cluster Deleting True 41m​\nmilvus.milvus.io \"my-release\" deleted​\n\n","kubectl -n default get milvus my-release​\n\n","No resources found in default namespace.​\n\n","# change the following:​\npulsar:​\n enabled: false # set to false​\n # you may also clean up rest fields under pulsar field​\n # it's ok to keep them though.​\npulsarv3:​\n enabled: true​\n # append other values for pulsar v3 chart if needs​\n\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm​\nhelm repo update zilliztech​\n\n","\"zilliztech\" already exists with the same configuration, skipping​\nHang tight while we grab the latest from your chart repositories...​\n...Successfully got an update from the \"zilliztech\" chart repository​\nUpdate Complete. ⎈Happy Helming!⎈​\n\n","helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​\n\n","NAME: my-release​\nLAST DEPLOYED: Fri Nov 22 15:31:27 2024​\nNAMESPACE: default​\nSTATUS: deployed​\nREVISION: 1​\nTEST SUITE: None​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 4m3s​\nmy-release-milvus-datanode-56487bc4bc-s6mbd 1/1 Running 0 4m5s​\nmy-release-milvus-indexnode-6476894d6-rv85d 1/1 Running 0 4m5s​\nmy-release-milvus-mixcoord-6d8875cb9c-67fcq 1/1 Running 0 4m4s​\nmy-release-milvus-proxy-7bc45d57c5-2qf8m 1/1 Running 0 4m4s​\nmy-release-milvus-querynode-77465747b-kt7f4 1/1 Running 0 4m4s​\nmy-release-minio-684ff4f5df-pnc97 1/1 Running 0 4m5s​\nmy-release-pulsarv3-bookie-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-1 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-2 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-init-6z4tk 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-broker-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-broker-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-pulsar-init-wvqpc 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-recovery-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-zookeeper-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-2 1/1 Running 0 4m2s​\n\n","# change the followings fields:​\napiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations: null # this field should be removed or set to null​\n resourceVersion: null # this field should be removed or set to null​\n uid: null # this field should be removed or set to null​\nspec:​\n dependencies:​\n pulsar:​\n inCluster:​\n chartVersion: pulsar-v3​\n # delete all previous values for pulsar v2 and set it to null.​\n # you may add additional values here for pulsar v3 if you're sure about it.​\n values: null​\n\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​\nhelm repo update milvus-operator​\nhelm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​\n\n","kubectl create -f milvus.yaml​\n\n","milvus.milvus.io/my-release created​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 65m​\nmy-release-milvus-datanode-57fd59ff58-5mdrk 1/1 Running 0 93s​\nmy-release-milvus-indexnode-67867c6b9b-4wsbw 1/1 Running 0 93s​\nmy-release-milvus-mixcoord-797849f9bb-sf8z5 1/1 Running 0 93s​\nmy-release-milvus-proxy-5d5bf98445-c55m6 1/1 Running 0 93s​\nmy-release-milvus-querynode-0-64797f5c9-lw4rh 1/1 Running 0 92s​\nmy-release-minio-79476ccb49-zvt2h 1/1 Running 0 65m​\nmy-release-pulsar-bookie-0 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-1 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-2 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-init-v8fdj 0/1 Completed 0 5m11s​\nmy-release-pulsar-broker-0 1/1 Running 0 5m11s​\nmy-release-pulsar-broker-1 1/1 Running 0 5m10s​\nmy-release-pulsar-proxy-0 1/1 Running 0 5m11s​\nmy-release-pulsar-proxy-1 1/1 Running 0 5m10s​\nmy-release-pulsar-pulsar-init-5lhx7 0/1 Completed 0 5m11s​\nmy-release-pulsar-recovery-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-1 1/1 Running 0 5m10s​\nmy-release-pulsar-zookeeper-2 1/1 Running 0 5m10s​\n\n"],"headingContent":"Upgrading Pulsar ​","anchorList":[{"label":"ترقية بولسار","href":"Upgrading-Pulsar-​","type":1,"isActive":false},{"label":"خارطة الطريق","href":"Roadmap","type":2,"isActive":false},{"label":"الإجراءات","href":"Procedures","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.md b/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.md new file mode 100644 index 000000000..b1b19369a --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade-pulsar-v3.md @@ -0,0 +1,427 @@ +--- +id: upgrade-pulsar-v3.md +related_key: upgrade pulsar v3 +summary: >- + تعرّف على كيفية ترقية Pulsar من V2 إلى V3 في Milvus بحيث يمكنك استخدام أحدث + إصدار من Milvus v2.5.x. +title: قم بترقية بولسار في ميلفوس من V2 إلى V3 +--- +

ترقية بولسار

توضح هذه المقالة عملية ترقية مكون Pulsar من V2 إلى V3 إذا كان لديك بالفعل نشر Milvus يعمل مع Pulsar V2.

+

منذ الإصدار 2.5 من Milvus، سيستخدم Milvus-helm و milvus-oper Pulsar V3 افتراضيًا لإصلاح بعض الأخطاء والثغرات الأمنية. بينما يتوافق Milvus 2.5 مع Pulsar 2.x، فإن الترقية إلى Pulsar V3 اختيارية. لتحسين الثبات والأداء، نوصي بالترقية إلى Pulsar V3.

+

إذا كنت تفضل استخدام Pulsar V2 مع Milvus v2.5.x، اقرأ استخدام Pulsar V2 مع Milvus v2.5.x.

+
+
    +
  1. تتطلب عملية الترقية انقطاعًا قصيرًا للخدمة (عادةً ما يستغرق الأمر من بضع دقائق إلى أكثر من عشر دقائق، اعتمادًا على كمية البيانات).

  2. +
  3. قبل العملية، تحتاج إلى إيقاف جميع العملاء قيد التشغيل من كتابة البيانات إلى ميلفوس. وإلا فقد تُفقد البيانات المكتوبة.

  4. +
  5. تفترض هذه المقالة أن Milvus مثبت في مساحة الاسم default واسمه my-release. يرجى تغيير المعلمات إلى مساحة الاسم واسم الإصدار الخاص بك أثناء تنفيذ الأوامر المنسوخة من هذه الصفحة.

  6. +
  7. تأكد من أن بيئة العمل الخاصة بك لديها أذونات ضمن مساحة الاسم المذكورة أعلاه في مجموعة Kubernetes وتم تثبيت الأوامر التالية.

    +

    أ. kubectl >= 1.20

    +

    ب. helm >= 3.14.0

    +

    c. cat ، grep ، awk لعمليات معالجة السلسلة لعمليات معالجة السلسلة

    +

    د. curl أو أتو v2.4+ للتفاعل مع واجهة برمجة تطبيقات إدارة ميلفوس

  8. +
+
+

خارطة الطريق

تتضمن عملية الترقية الخطوات التالية:

+
    +
  1. استمرار البيانات غير المستهلكة في بولسار.

  2. +
  3. إيقاف ميلفوس وحذف بولسار V2.

  4. +
  5. بدء تشغيل بولسار V3 وميلفوس.

  6. +
+

الإجراءات

يقدم هذا القسم الإجراءات التفصيلية لترقية بولسار من V2 إلى V3 في ميلفوس.

+

استمرار البيانات غير المستهلكة في بولسار

في هذه الخطوة، تحتاج في هذه الخطوة إلى التأكد من استمرار البيانات الموجودة في بولسار إلى خدمة تخزين الكائنات. هناك طريقتان متاحتان، ويمكنك اختيار الطريقة التي تناسب احتياجاتك.

+

النهج 1: استخدام أتو

إذا لم يكن لديك سوى عدد قليل من المجموعات في عملية نشر Milvus العاملة الخاصة بك مع عدم وجود العديد من الشرائح، يمكنك استخدام Attu لاستمرار البيانات إلى خدمة تخزين الكائنات.

+
    +
  1. حدد كل مجموعة في جميع قواعد البيانات الخاصة بك، وادخل إلى لوحة Segments ، وانقر فوق الزر Flush

    +

    + + Segment panel of a collection + لوحة شريحة من مجموعة

  2. +
  3. ثم عند النافذة المنبثقة، انقر فوق Flush مرة أخرى.

    +

    + + Data flush prompt in Attu + مطالبة تدفق البيانات في أتو

  4. +
  5. ثم انتظر حتى تصبح جميع حالات الشرائح الثابتة للمجموعات Flushed.

    +

    + + View data flush status in Attu + عرض حالة تدفق البيانات في أتو

  6. +
+

النهج 2: استخدام واجهة برمجة تطبيقات الإدارة

    +
  1. وكيل المنفذ 9091 من وكيل Milvus إلى المضيف المحلي للعمليات اللاحقة.

    +
    kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​
    +
    +

    الإخراج.

    +
    [1] 8116​
    +Forwarding from 127.0.0.1:9091 -> 9091​
    +
    +
  2. +
  3. حفظ Pid للتنظيف اللاحق.

    +
    pid=8116​
    +
    +
  4. +
  5. قم بتشغيل إجراء استمرار جميع البيانات المدرجة من بولسار إلى مخزن أوجبيكت.

    +
    curl 127.0.0.1:9091/api/v1/collections \​
    +|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\​
    +|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \​
    +> flushing_segments.json​
    +cat flushing_segments.json​
    +
    +
    +

    الإخراج.

    +
    {​
    +  "segmentIDs": [​
    +    454097953998181000,​
    +    454097953999383600,​
    +    454097953998180800​
    +  ]​
    +}​
    +
    +
  6. +
  7. تحقق من مسح جميع المقاطع.

    +
    cat flushing_segments.json|  curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​
    +
    +
    +

    عند الانتهاء، يجب أن ترى المخرجات التالية

    +
    {"status":{},"flushed":true}​
    +
    +
  8. +
  9. إيقاف العملية الخلفية kubectl port-forward

    +
    kill $pid​
    +
    +
    +

    الإخراج.

    +
    [1]  + 8116 terminated  kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091                      ​
    +
    +
  10. +
+

أوقف Milvus واحذف Pulsar V2

في هذه الخطوة، تحتاج إلى إيقاف جراب Milvus وحذف نشر Pulsar V2. هناك قسمان منفصلان متاحان:

+
    +
  • لمستخدمي Milvus Helm

    +

    إذا كنت قد قمت بتثبيت Milvus باستخدام مخطط Milvus Helm، انتقل إلى حذف Pulsar v2 باستخدام Helm.

  • +
  • لمستخدمي مشغل Milvus Helm

    +

    إذا كنت قد قمت بتثبيت Milvus باستخدام مشغل Milvus، انتقل إلى حذف Pulsar v2 باستخدام مشغل Milvus.

  • +
+

حذف Pulsar V2 باستخدام Helm

إذا كنت قد قمت بتثبيت Milvus باستخدام مخطط Milvus Helm، اتبع الخطوات التالية لإيقاف جراب Milvus وحذف نشر Pulsar V2.

+
    +
  1. احفظ قيم إصدار Milvus الحالية في values.yaml لاستعادتها لاحقًا.

    +
    helm -n default get values my-release -o yaml > values.yaml​
    +cat values.yaml​
    +
    +
  2. +
  3. استخدم الأمر لإيقاف ميلفوس وجميع التبعيات. لا تقلق بشأن وحدات تخزين البيانات، فسيتم الاحتفاظ بها بشكل افتراضي.

    +
    helm -n default uninstall my-release​
    +
    +
    +

    الإخراج

    +
    These resources were kept due to the resource policy:​
    +[PersistentVolumeClaim] my-release-minio​
    +​
    +release "my-release" uninstalled​
    +
    +
  4. +
  5. يجب مسح قائمة PVCs و PVs النابضة (مطالبات وحدة التخزين الثابتة ووحدات التخزين الثابتة)

    +
    kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​
    +kubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​
    +echo "Volume Claims:"​
    +cat pulsar-pvcs.txt​
    +echo "Volumes:"​
    +cat pulsar-pvs.txt​
    +
    +
    +

    الإخراج

    +
    Volume Claims:​
    +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​
    +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​
    +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​
    +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​
    +my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​
    +Volumes:​
    +pvc-f590a4de-df31-4ca8-a424-007eac3c619a​
    +pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​
    +pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​
    +pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​
    +pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​
    +
    +
  6. +
  7. تحقق مما إذا كانت قائمة PVCs pulsar-pvcs.txt كلها لـ Pulsar. بمجرد التأكد من عدم وجود خطأ، احذف PVCs.

    +
    cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
    +
    +
    +

    الإخراج.

    +
    persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0" deleted​
    +persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1" deleted​
    +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0" deleted​
    +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1" deleted​
    +persistentvolumeclaim "my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0" deleted​
    +
    +
  8. +
  9. (اختياري) اعتمادًا على فئة التخزين التي توفر PVC، قد تحتاج أيضًا إلى إزالة PVC يدويًا.

    +
    cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
    +
    +
    +

    لا بأس إذا أخرجت أخطاء NotFound. تم حذفه بالفعل بواسطة وحدات تحكم kubernetes.

    +
    Error from server (NotFound): persistentvolumeclaims "pvc-f590a4de-df31-4ca8-a424-007eac3c619a" not found​
    +Error from server (NotFound): persistentvolumeclaims "pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3" not found​
    +Error from server (NotFound): persistentvolumeclaims "pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b" not found​
    +Error from server (NotFound): persistentvolumeclaims "pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf" not found​
    +Error from server (NotFound): persistentvolumeclaims "pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a" not found​
    +
    +
  10. +
+

حذف Pulsar V2 باستخدام مشغل Milvus

إذا كنت قد قمت بتثبيت Milvus باستخدام مشغل Milvus، اتبع الخطوات أدناه لإيقاف جراب Milvus وحذف نشر Pulsar V2.

+
    +
  1. احفظ بيان Milvus الحالي في milvus.yaml لاستخدامه لاحقًا.

    +
    kubectl -n default get milvus my-release -o yaml > milvus.yaml​
    +head milvus.yaml -n 20​
    +
    +
    +

    الإخراج.

    +
    apiVersion: milvus.io/v1beta1​
    +kind: Milvus​
    +metadata:​
    +  annotations:​
    +    milvus.io/dependency-values-merged: "true"​
    +    milvus.io/pod-service-label-added: "true"​
    +    milvus.io/querynode-current-group-id: "0"​
    +  creationTimestamp: "2024-11-22T08:06:59Z"​
    +  finalizers:​
    +  - milvus.milvus.io/finalizer​
    +  generation: 3​
    +  labels:​
    +    app: milvus​
    +    milvus.io/operator-version: 1.1.2​
    +name: my-release​
    +namespace: default​
    +resourceVersion: "692217324"​
    +uid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​
    +spec:​
    +  components:​
    +
    +
  2. +
  3. إنشاء ملف patch.yaml بالمحتوى التالي.

    +
    # a patch to retain etcd & storage data and delete pulsar data while delete milvus​
    +spec:​
    +  dependencies:​
    +    etcd:​
    +      inCluster:​
    +        deletionPolicy: Retain​
    +        pvcDeletion: false​
    +    storage:​
    +      inCluster:​
    +        deletionPolicy: Retain​
    +        pvcDeletion: false​
    +    pulsar:​
    +      inCluster:​
    +        deletionPolicy: Delete​
    +        pvcDeletion: true​
    +
    +
  4. +
  5. استخدم kubectl patch للاحتفاظ ببيانات إلخd وبيانات التخزين وحذف بيانات بولسار أثناء حذف ميلفوس.

    +
    kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​
    +
    +
    +

    الإخراج.

    +
    milvus.milvus.io/my-release patched​
    +
    +
  6. +
  7. إيقاف ميلفوس وحذف بولسار V2. لا تقلق بشأن وحدات تخزين بيانات إلخd وبيانات تخزين الكائنات، سيتم الاحتفاظ بها افتراضيًا.

    +
    kubectl -n default delete milvus my-release --wait=false​
    +kubectl -n default get milvus my-release​
    +kubectl -n default delete milvus my-release --wait=true​
    +
    +
    +

    الإخراج: لاحظ أنه قد يستغرق الأمر بضع دقائق حتى يتوقف ميلفوس برشاقة وحتى يقوم المشغل بحذف وحدات تخزين بولسار.

    +
    milvus.milvus.io "my-release" deleted​
    +NAME         MODE      STATUS     UPDATED   AGE​
    +my-release   cluster   Deleting   True      41m​
    +milvus.milvus.io "my-release" deleted​
    +
    +
    +

    انتظر حتى انتهاء الأمر.

  8. +
  9. تحقق مرة أخرى لترى أن مورد ميلفوس قد اختفى

    +
    kubectl -n default get milvus my-release​
    +
    +
    +

    يجب أن يكون الإخراج مثل.

    +
    No resources found in default namespace.​
    +
    +
  10. +
+

بدء تشغيل بولسار V3 وميلفوس

في هذه الخطوة، تحتاج في هذه الخطوة إلى بدء تشغيل مجلدات Pulsar V3 و Milvus. هناك قسمان منفصلان متاحان:

+
    +
  • لمستخدم Helm

    +

    إذا كنت قد قمت بتثبيت Milvus باستخدام مخطط Milvus Helm، انتقل إلى لمستخدمي Milvus Helm.

  • +
  • لمستخدمي مشغل ميلفوس

    +

    إذا كنت قد قمت بتثبيت Milvus باستخدام مشغل Milvus، انتقل إلى لمستخدم مشغل Milvus.

  • +
+

بدء تشغيل Pulsar V3 واستخدام Helm

    +
  1. قم بتحرير values.yaml المحفوظ في الخطوة السابقة.

    +
    # change the following:​
    +pulsar:​
    +  enabled: false # set to false​
    +  # you may also clean up rest fields under pulsar field​
    +  # it's ok to keep them though.​
    +pulsarv3:​
    +  enabled: true​
    +  # append other values for pulsar v3 chart if needs​
    +
    +
  2. +
  3. قم بتحديث ريبو الدفة المحلي الخاص بك

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm​
    +helm repo update zilliztech​
    +
    +
    +

    الإخراج

    +
    "zilliztech" already exists with the same configuration, skipping​
    +Hang tight while we grab the latest from your chart repositories...​
    +...Successfully got an update from the "zilliztech" chart repository​
    +Update Complete. ⎈Happy Helming!⎈​
    +
    +
  4. +
  5. قم بتثبيت إصدار ميلفوس الخاص بك بأحدث إصدار من مخطط الدفة باستخدام الإصدار المحرر values.yaml

    +
    helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​
    +
    +
    +

    الإخراج

    +
    NAME: my-release​
    +LAST DEPLOYED: Fri Nov 22 15:31:27 2024​
    +NAMESPACE: default​
    +STATUS: deployed​
    +REVISION: 1​
    +TEST SUITE: None​
    +
    +
  6. +
  7. تحقق من البودات لمعرفة ما إذا كانت جميعها مجدولة وتعمل مع kubectl -n default get pods.

    +

    قد يستغرق الأمر بضع دقائق حتى تبدأ جميع الكبسولات في العمل

    +

    الإخراج مثل.

    +
    NAME                                          READY   STATUS      RESTARTS   AGE​
    +my-release-etcd-0                             1/1     Running     0          4m3s​
    +my-release-milvus-datanode-56487bc4bc-s6mbd   1/1     Running     0          4m5s​
    +my-release-milvus-indexnode-6476894d6-rv85d   1/1     Running     0          4m5s​
    +my-release-milvus-mixcoord-6d8875cb9c-67fcq   1/1     Running     0          4m4s​
    +my-release-milvus-proxy-7bc45d57c5-2qf8m      1/1     Running     0          4m4s​
    +my-release-milvus-querynode-77465747b-kt7f4   1/1     Running     0          4m4s​
    +my-release-minio-684ff4f5df-pnc97             1/1     Running     0          4m5s​
    +my-release-pulsarv3-bookie-0                  1/1     Running     0          4m3s​
    +my-release-pulsarv3-bookie-1                  1/1     Running     0          4m3s​
    +my-release-pulsarv3-bookie-2                  1/1     Running     0          4m3s​
    +my-release-pulsarv3-bookie-init-6z4tk         0/1     Completed   0          4m1s​
    +my-release-pulsarv3-broker-0                  1/1     Running     0          4m2s​
    +my-release-pulsarv3-broker-1                  1/1     Running     0          4m2s​
    +my-release-pulsarv3-proxy-0                   1/1     Running     0          4m2s​
    +my-release-pulsarv3-proxy-1                   1/1     Running     0          4m2s​
    +my-release-pulsarv3-pulsar-init-wvqpc         0/1     Completed   0          4m1s​
    +my-release-pulsarv3-recovery-0                1/1     Running     0          4m3s​
    +my-release-pulsarv3-zookeeper-0               1/1     Running     0          4m2s​
    +my-release-pulsarv3-zookeeper-1               1/1     Running     0          4m2s​
    +my-release-pulsarv3-zookeeper-2               1/1     Running     0          4m2s​
    +
    +
  8. +
+

بدء تشغيل Pulsar V3 واستخدام مشغل Milvus

    +
  1. قم بتحرير milvus.yaml المحفوظة في الخطوة السابقة.

    +
    # change the followings fields:​
    +apiVersion: milvus.io/v1beta1​
    +kind: Milvus​
    +metadata:​
    +  annotations: null # this field should be removed or set to null​
    +  resourceVersion: null # this field should be removed or set to null​
    +  uid: null # this field should be removed or set to null​
    +spec:​
    +  dependencies:​
    +    pulsar:​
    +      inCluster:​
    +        chartVersion: pulsar-v3​
    +        # delete all previous values for pulsar v2 and set it to null.​
    +        # you may add additional values here for pulsar v3 if you're sure about it.​
    +        values: null​
    +
    +
  2. +
  3. تأكد من ترقية مشغل Milvus إلى الإصدار v1.1.2 أو إصدار أحدث

    +
    helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​
    +helm repo update milvus-operator​
    +helm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​
    +
    +
    +

    استخدم الأمر لبدء تشغيل ميلفوس باستخدام Pulsar v3

    +
    kubectl create -f milvus.yaml​
    +
    +
    +

    الإخراج

    +
    milvus.milvus.io/my-release created​
    +
    +
  4. +
  5. تحقق من القرون لمعرفة ما إذا كانت جميعها مجدولة وتعمل مع kubectl -n default get pods.

    +

    قد يستغرق الأمر بضع دقائق لبدء تشغيل جميع الكبسولات.

    +

    الإخراج مثل.

    +
    NAME                                            READY   STATUS      RESTARTS   AGE​
    +my-release-etcd-0                               1/1     Running     0          65m​
    +my-release-milvus-datanode-57fd59ff58-5mdrk     1/1     Running     0          93s​
    +my-release-milvus-indexnode-67867c6b9b-4wsbw    1/1     Running     0          93s​
    +my-release-milvus-mixcoord-797849f9bb-sf8z5     1/1     Running     0          93s​
    +my-release-milvus-proxy-5d5bf98445-c55m6        1/1     Running     0          93s​
    +my-release-milvus-querynode-0-64797f5c9-lw4rh   1/1     Running     0          92s​
    +my-release-minio-79476ccb49-zvt2h               1/1     Running     0          65m​
    +my-release-pulsar-bookie-0                      1/1     Running     0          5m10s​
    +my-release-pulsar-bookie-1                      1/1     Running     0          5m10s​
    +my-release-pulsar-bookie-2                      1/1     Running     0          5m10s​
    +my-release-pulsar-bookie-init-v8fdj             0/1     Completed   0          5m11s​
    +my-release-pulsar-broker-0                      1/1     Running     0          5m11s​
    +my-release-pulsar-broker-1                      1/1     Running     0          5m10s​
    +my-release-pulsar-proxy-0                       1/1     Running     0          5m11s​
    +my-release-pulsar-proxy-1                       1/1     Running     0          5m10s​
    +my-release-pulsar-pulsar-init-5lhx7             0/1     Completed   0          5m11s​
    +my-release-pulsar-recovery-0                    1/1     Running     0          5m11s​
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          5m11s​
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          5m10s​
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          5m10s​
    +
    +
  6. +
+

diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.json new file mode 100644 index 000000000..a6ae49203 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nrootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.5.3\n...\nproxy:\n container_name: milvus-proxy\n image: milvusdb/milvus:v2.5.3\n...\nquerycoord:\n container_name: milvus-querycoord\n image: milvusdb/milvus:v2.5.3 \n...\nquerynode:\n container_name: milvus-querynode\n image: milvusdb/milvus:v2.5.3\n...\nindexcoord:\n container_name: milvus-indexcoord\n image: milvusdb/milvus:v2.5.3\n...\nindexnode:\n container_name: milvus-indexnode\n image: milvusdb/milvus:v2.5.3 \n...\ndatacoord:\n container_name: milvus-datacoord\n image: milvusdb/milvus:v2.5.3 \n...\ndatanode:\n container_name: milvus-datanode\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","Update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Cluster with Docker Compose","anchorList":[{"label":"ترقية مجموعة Milvus العنقودية باستخدام Docker Compose","href":"Upgrade-Milvus-Cluster-with-Docker-Compose","type":1,"isActive":false},{"label":"ترقية Milvus عن طريق تغيير صورته","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.md new file mode 100644 index 000000000..bdebfe3c9 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-docker.md @@ -0,0 +1,154 @@ +--- +id: upgrade_milvus_cluster-docker.md +summary: تعرف على كيفية ترقية مجموعة Milvus العنقودية باستخدام Docker Compose. +title: ترقية مجموعة Milvus العنقودية باستخدام Docker Compose +--- + +

ترقية مجموعة Milvus العنقودية باستخدام Docker Compose

يصف هذا الموضوع كيفية ترقية Milvus الخاص بك باستخدام Docker Compose.

+

في الحالات العادية، يمكنك ترقية Milvus عن طريق تغيير صورته. ومع ذلك، تحتاج إلى ترحيل البيانات الوصفية قبل أي ترقية من الإصدار 2.1.x إلى الإصدار 2.5.3.

+

ترقية Milvus عن طريق تغيير صورته

في الحالات العادية، يمكنك ترقية Milvus على النحو التالي:

+
    +
  1. تغيير علامات صورة Milvus في docker-compose.yaml.

    +

    لاحظ أنك تحتاج إلى تغيير علامات الصور الخاصة بالوكيل، وجميع المنسقين، وجميع العقد العاملة.

    +
    ...
    +rootcoord:
    +  container_name: milvus-rootcoord
    +  image: milvusdb/milvus:v2.5.3
    +...
    +proxy:
    +  container_name: milvus-proxy
    +  image: milvusdb/milvus:v2.5.3
    +...
    +querycoord:
    +  container_name: milvus-querycoord
    +  image: milvusdb/milvus:v2.5.3  
    +...
    +querynode:
    +  container_name: milvus-querynode
    +  image: milvusdb/milvus:v2.5.3
    +...
    +indexcoord:
    +  container_name: milvus-indexcoord
    +  image: milvusdb/milvus:v2.5.3
    +...
    +indexnode:
    +  container_name: milvus-indexnode
    +  image: milvusdb/milvus:v2.5.3 
    +...
    +datacoord:
    +  container_name: milvus-datacoord
    +  image: milvusdb/milvus:v2.5.3   
    +...
    +datanode:
    +  container_name: milvus-datanode
    +  image: milvusdb/milvus:v2.5.3
    +
  2. +
  3. قم بتشغيل الأوامر التالية لتنفيذ الترقية.

    +
    docker compose down
    +docker compose up -d
    +
  4. +
+

ترحيل البيانات الوصفية

    +
  1. أوقف جميع مكونات ميلفوس.

    +
    docker stop <milvus-component-docker-container-name>
    +
  2. +
  3. قم بإعداد ملف التكوين migrate.yaml لترحيل البيانات الوصفية.

    +
    # migration.yaml
    +cmd:
    +  # Option: run/backup/rollback
    +  type: run
    +  runWithBackup: true
    +config:
    +  sourceVersion: 2.1.4   # Specify your milvus version
    +  targetVersion: 2.5.3
    +  backupFilePath: /tmp/migration.bak
    +metastore:
    +  type: etcd
    +etcd:
    +  endpoints:
    +    - milvus-etcd:2379  # Use the etcd container name
    +  rootPath: by-dev # The root path where data is stored in etcd
    +  metaSubPath: meta
    +  kvSubPath: kv
    +
  4. +
  5. قم بتشغيل حاوية الترحيل.

    +
    # Suppose your docker-compose run with the default milvus network,
    +# and you put migration.yaml in the same directory with docker-compose.yaml.
    +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
    +
  6. +
  7. ابدأ تشغيل مكونات Milvus مرة أخرى باستخدام صورة Milvus الجديدة.

    +
    Update the milvus image tag in the docker-compose.yaml
    +docker compose down
    +docker compose up -d
    +
  8. +
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.json new file mode 100644 index 000000000..a74d7eb88 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update zilliztech\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update zilliztech\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nnew-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4 \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 21m\nmy-release-etcd-1 1/1 Running 0 21m\nmy-release-etcd-2 1/1 Running 0 21m\nmy-release-milvus-datacoord-664c58798d-fl75s 1/1 Running 0 21m\nmy-release-milvus-datanode-5f75686c55-xfg2r 1/1 Running 0 21m\nmy-release-milvus-indexcoord-5f98b97589-2l48r 1/1 Running 0 21m\nmy-release-milvus-indexnode-857b4ddf98-vmd75 1/1 Running 0 21m\nmy-release-milvus-proxy-6c548f787f-scspp 1/1 Running 0 21m\nmy-release-milvus-querycoord-c454f44cd-dwmwq 1/1 Running 0 21m\nmy-release-milvus-querynode-76bb4946d-lbrz6 1/1 Running 0 21m\nmy-release-milvus-rootcoord-7764c5b686-62msm 1/1 Running 0 21m\nmy-release-minio-0 1/1 Running 0 21m\nmy-release-minio-1 1/1 Running 0 21m\nmy-release-minio-2 1/1 Running 0 21m\nmy-release-minio-3 1/1 Running 0 21m\nmy-release-pulsar-bookie-0 1/1 Running 0 21m\nmy-release-pulsar-bookie-1 1/1 Running 0 21m\nmy-release-pulsar-bookie-2 1/1 Running 0 21m\nmy-release-pulsar-bookie-init-tjxpj 0/1 Completed 0 21m\nmy-release-pulsar-broker-0 1/1 Running 0 21m\nmy-release-pulsar-proxy-0 1/1 Running 0 21m\nmy-release-pulsar-pulsar-init-c8vvc 0/1 Completed 0 21m\nmy-release-pulsar-recovery-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 20m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 20m\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0\n"],"headingContent":"Upgrade Milvus Cluster with Helm Chart","anchorList":[{"label":"ترقية مجموعة Milvus العنقودية باستخدام مخطط Helm","href":"Upgrade-Milvus-Cluster-with-Helm-Chart","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تحقق من مخطط ميلفوس هيلم","href":"Check-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"إجراء ترقية متجددة","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"ترقية ميلفوس باستخدام هيلم","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.md new file mode 100644 index 000000000..40c7facfe --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-helm.md @@ -0,0 +1,281 @@ +--- +id: upgrade_milvus_cluster-helm.md +label: Helm +order: 1 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: تعرف على كيفية ترقية مجموعة ميلفوس العنقودية باستخدام مخطط هيلم. +title: ترقية مجموعة Milvus العنقودية باستخدام مخطط Helm +--- + +

ترقية مجموعة Milvus العنقودية باستخدام مخطط Helm

يصف هذا الدليل كيفية ترقية مجموعة Milvus الخاصة بك باستخدام مخططات Milvus Helm.

+

المتطلبات الأساسية

    +
  • إصدار Helm >= 3.14.0
  • +
  • إصدار Kubernetes >= 1.20.0
  • +
+
+

منذ الإصدار 4.2.21 من مخطط Milvus-Helm، قدمنا مخطط pulsar-v3.x كإصدار تبعي. للتوافق مع الإصدارات السابقة، يُرجى ترقية دفة القيادة إلى الإصدار 3.14 أو إصدار أحدث، وتأكد من إضافة الخيار --reset-then-reuse-values كلما استخدمت helm upgrade.

+
+

تحقق من مخطط ميلفوس هيلم

قم بتشغيل الأوامر التالية للتحقق من إصدارات Milvus الجديدة.

+
$ helm repo update zilliztech
+$ helm search repo zilliztech/milvus --versions
+
+
+

تمت أرشفة ريبو Milvus Helm Charts على https://milvus-io.github.io/milvus-helm/ ويمكنك الحصول على تحديثات أخرى من https://zilliztech.github.io/milvus-helm/ على النحو التالي:

+
helm repo add zilliztech https://zilliztech.github.io/milvus-helm
+helm repo update
+# upgrade existing helm release
+helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
+
+

لا يزال الريبو المؤرشف متاحًا للمخططات حتى الإصدار 4.0.31. بالنسبة للإصدارات الأحدث، استخدم الريبو الجديد بدلاً من ذلك.

+
+
NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
+zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
+zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
+zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
+
+

يمكنك اختيار مسار الترقية لميلفوس الخاص بك على النحو التالي:

+
- [إجراء ترقية متجددة] (#إجراء ترقية متجددة) من الإصدار 2.2.3 والإصدارات الأحدث إلى الإصدار 2.5.3.
+ +
+

إجراء ترقية متجددة

منذ الإصدار Milvus 2.2.3، يمكنك تكوين منسقي Milvus للعمل في وضع الاستعداد النشط وتمكين ميزة الترقية المتجددة لهم، بحيث يمكن لـ Milvus الاستجابة للطلبات الواردة أثناء ترقيات المنسق. في الإصدارات السابقة، يجب إزالة المنسقين ثم إنشاؤهم أثناء الترقية، مما قد يؤدي إلى تعطل معين للخدمة.

+

تتطلب الترقيات المتجددة أن يعمل المنسقون في وضع الاستعداد النشط. يمكنك استخدام البرنامج النصي الذي نوفره لتهيئة المنسقين للعمل في وضع الاستعداد النشط وبدء الترقية المتجددة.

+

استنادًا إلى إمكانيات التحديث المتجدد التي توفرها Kubernetes، يفرض البرنامج النصي أعلاه تحديثًا مرتبًا لعمليات النشر وفقًا لتبعياتها. بالإضافة إلى ذلك، تطبق Milvus آلية لضمان بقاء مكوناتها متوافقة مع تلك التي تعتمد عليها أثناء الترقية، مما يقلل بشكل كبير من وقت تعطل الخدمة المحتمل.

+

ينطبق البرنامج النصي فقط على ترقية Milvus المثبتة مع Helm. يسرد الجدول التالي علامات الأوامر المتوفرة في البرامج النصية.

+ + + + + + + + + + + +
المعلماتالوصفالقيمة الافتراضيةمطلوبة
iاسم مثيل ميلفوسNoneصحيح
nمساحة الاسم الذي تم تثبيت Milvus فيهdefaultخطأ
tإصدار ميلفوس المستهدفNoneصحيح
wعلامة صورة ميلفوس الجديدةmilvusdb/milvus:v2.2.3صحيح
oالتشغيلupdateخطأ
+

بمجرد التأكد من أن جميع عمليات النشر في مثيل Milvus الخاص بك في حالتها الطبيعية. يمكنك تشغيل الأمر التالي لترقية مثيل Milvus إلى 2.5.3.

+
sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
+
+
+
    +
  1. يقوم البرنامج النصي بترميز ترتيب ترقية عمليات النشر بشكل ثابت ولا يمكن تغييره.
  2. +
  3. يستخدم البرنامج النصي kubectl patch لتحديث عمليات النشر و kubectl rollout status لمراقبة حالتها.
  4. +
  5. يستخدم البرنامج النصي kubectl patch لتحديث التسمية app.kubernetes.io/version لعمليات النشر إلى التسمية المحددة بعد العلامة -t في الأمر.
  6. +
+
+
+

ترقية ميلفوس باستخدام هيلم

لترقية ميلفوس من إصدار ثانوي قبل الإصدار 2.2.3 إلى الأحدث، قم بتشغيل الأوامر التالية:

+
helm repo update zilliztech
+helm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
+
+

استخدم إصدار مخطط Helm في الأمر السابق. للحصول على تفاصيل حول كيفية الحصول على إصدار مخطط Helm، راجع التحقق من إصدار Milvus.

+

ترحيل البيانات الوصفية

منذ الإصدار Milvus 2.2.0، أصبحت البيانات الوصفية غير متوافقة مع تلك الموجودة في الإصدارات السابقة. تفترض مقتطفات الأمثلة التالية ترقية من Milvus 2.1.4 إلى Milvus 2.2.0.

+

1. تحقق من إصدار ملفوس

قم بتشغيل $ helm list للتحقق من إصدار تطبيق Milvus الخاص بك. يمكنك أن ترى أن APP VERSION هو 2.1.4.

+
NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION    
+new-release         default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4 
+
+

2. تحقق من القرون قيد التشغيل

قم بتشغيل $ kubectl get pods للتحقق من القرون قيد التشغيل. يمكنك رؤية الإخراج التالي.

+
NAME                                             READY   STATUS      RESTARTS   AGE
+my-release-etcd-0                               1/1     Running     0          21m
+my-release-etcd-1                               1/1     Running     0          21m
+my-release-etcd-2                               1/1     Running     0          21m
+my-release-milvus-datacoord-664c58798d-fl75s    1/1     Running     0          21m
+my-release-milvus-datanode-5f75686c55-xfg2r     1/1     Running     0          21m
+my-release-milvus-indexcoord-5f98b97589-2l48r   1/1     Running     0          21m
+my-release-milvus-indexnode-857b4ddf98-vmd75    1/1     Running     0          21m
+my-release-milvus-proxy-6c548f787f-scspp        1/1     Running     0          21m
+my-release-milvus-querycoord-c454f44cd-dwmwq    1/1     Running     0          21m
+my-release-milvus-querynode-76bb4946d-lbrz6     1/1     Running     0          21m
+my-release-milvus-rootcoord-7764c5b686-62msm    1/1     Running     0          21m
+my-release-minio-0                              1/1     Running     0          21m
+my-release-minio-1                              1/1     Running     0          21m
+my-release-minio-2                              1/1     Running     0          21m
+my-release-minio-3                              1/1     Running     0          21m
+my-release-pulsar-bookie-0                      1/1     Running     0          21m
+my-release-pulsar-bookie-1                      1/1     Running     0          21m
+my-release-pulsar-bookie-2                      1/1     Running     0          21m
+my-release-pulsar-bookie-init-tjxpj             0/1     Completed   0          21m
+my-release-pulsar-broker-0                      1/1     Running     0          21m
+my-release-pulsar-proxy-0                       1/1     Running     0          21m
+my-release-pulsar-pulsar-init-c8vvc             0/1     Completed   0          21m
+my-release-pulsar-recovery-0                    1/1     Running     0          21m
+my-release-pulsar-zookeeper-0                   1/1     Running     0          21m
+my-release-pulsar-zookeeper-1                   1/1     Running     0          20m
+my-release-pulsar-zookeeper-2                   1/1     Running     0          20m
+
+

3. تحقق من علامة الصورة

تحقق من علامة الصورة للبود my-release-milvus-proxy-6c548f787f-scspp. يمكنك رؤية إصدار مجموعة ميلفوس الخاص بك هو الإصدار 2.1.4.

+
$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
+# milvusdb/milvus:v2.1.4
+
+

4. ترحيل البيانات الوصفية

من التغييرات الرئيسية في Milvus 2.2 هو بنية البيانات الوصفية لفهارس المقاطع. لذلك ، تحتاج إلى استخدام Helm لترحيل البيانات الوصفية أثناء ترقية Milvus من الإصدار 2.1.x إلى الإصدار 2.2.0. إليك برنامج نصي لترحيل البيانات الوصفية بأمان.

+

ينطبق هذا البرنامج النصي فقط على Milvus المثبت على مجموعة K8s. قم بالرجوع إلى الإصدار السابق باستخدام عملية التراجع أولاً في حالة حدوث خطأ أثناء العملية.

+

يسرد الجدول التالي العمليات التي يمكنك القيام بها لترحيل البيانات الوصفية.

+ + + + + + + + + + + + + + + + + +
المعلماتالوصفالقيمة الافتراضيةمطلوبة
iاسم مثيل Milvus.Noneصحيح
nمساحة الاسم التي تم تثبيت Milvus فيها.defaultخطأ
sإصدار Milvus المصدر.Noneصحيح
tإصدار ميلفوس الهدف.Noneصحيح
rالمسار الجذر لـ Milvus meta.by-devخطأ
wعلامة صورة ملفوس الجديدة.milvusdb/milvus:v2.2.0خطأ
mعلامة صورة الترحيل الوصفية للصور الوصفية.milvusdb/meta-migration:v2.2.0خطأ
oعملية الترحيل الوصفية.migrateخطأ
dما إذا كان سيتم حذف جراب الترحيل بعد اكتمال الترحيل.falseخطأ
cفئة التخزين لـ pvc الترحيل الوصفية.default storage classخطأ
eنقطة إن بوينت إلخd المستخدمة من قبل ميلفوس.etcd svc installed with milvusخطأ
+

1. ترحيل البيانات الوصفية

    +
  1. تحميل البرنامج النصي للترحيل.
  2. +
  3. إيقاف مكونات Milvus. يمكن أن تتسبب أي جلسة عمل مباشرة في Milvus etcd في فشل الترحيل.
  4. +
  5. إنشاء نسخة احتياطية للبيانات الوصفية ل Milvus.
  6. +
  7. ترحيل البيانات الوصفية ل Milvus.
  8. +
  9. ابدأ تشغيل مكونات Milvus بصورة جديدة.
  10. +
+

2. ترقية ملفوس من الإصدار 2.1.x إلى 2.2.0

تفترض الأوامر التالية أنك قمت بترقية ملفوس من الإصدار 2.1.4 إلى 2.2.0. قم بتغييرها إلى الإصدارات التي تناسب احتياجاتك.

+
    +
  1. حدد اسم مثيل Milvus وإصدار Milvus المصدر وإصدار Milvus الهدف.

    +
    ./migrate.sh -i my-release -s 2.1.4 -t 2.2.0
    +
  2. +
  3. حدد مساحة الاسم مع -n إذا لم يكن Milvus الخاص بك مثبتًا في مساحة اسم K8s الافتراضية.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0
    +
  4. +
  5. حدد مسار الجذر مع -r إذا كان Milvus الخاص بك مثبتًا مع المخصص rootpath.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev
    +
  6. +
  7. حدد علامة الصورة مع -w إذا كان Milvus الخاص بك مثبتًا مع مخصص image.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0
    +
  8. +
  9. قم بتعيين -d true إذا كنت تريد إزالة جراب الترحيل تلقائيًا بعد اكتمال الترحيل.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true
    +
  10. +
  11. التراجع والترحيل مرة أخرى إذا فشلت عملية الترحيل.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4
    +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0
    +
  12. +
diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.json new file mode 100644 index 000000000..55f3cf10b --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Cluster with Milvus Operator","anchorList":[{"label":"ترقية مجموعة ميلفوس العنقودية باستخدام مشغل ميلفوس","href":"Upgrade-Milvus-Cluster-with-Milvus-Operator","type":1,"isActive":false},{"label":"ترقية مشغل ميلفوس الخاص بك","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"إجراء ترقية متجددة","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"قم بترقية Milvus عن طريق تغيير صورته","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.md new file mode 100644 index 000000000..a2e09e9b0 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_cluster-operator.md @@ -0,0 +1,179 @@ +--- +id: upgrade_milvus_cluster-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: تعرف على كيفية ترقية مجموعة ميلفوس العنقودية باستخدام مشغل ميلفوس. +title: ترقية مجموعة ميلفوس العنقودية باستخدام مشغل ميلفوس +--- + +

ترقية مجموعة ميلفوس العنقودية باستخدام مشغل ميلفوس

يصف هذا الدليل كيفية ترقية مجموعة Milvus العنقودية الخاصة بك مع مشغل Milvus.

+

ترقية مشغل ميلفوس الخاص بك

قم بتشغيل الأمر التالي لترقية إصدار مشغل Milvus الخاص بك إلى الإصدار v1.0.1.

+
helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
+helm repo update zilliztech-milvus-operator
+helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
+
+

بمجرد أن تقوم بترقية مشغل ميلفوس الخاص بك إلى أحدث إصدار، يكون لديك الخيارات التالية:

+ +

إجراء ترقية متجددة

منذ الإصدار Milvus 2.2.3، يمكنك تكوين منسقي Milvus للعمل في وضع الاستعداد النشط وتمكين ميزة الترقية المتجددة لهم، بحيث يمكن لـ Milvus الاستجابة للطلبات الواردة أثناء ترقية المنسق. في الإصدارات السابقة، يجب إزالة المنسقين ثم إنشاؤهم أثناء الترقية، مما قد يؤدي إلى تعطل معين للخدمة.

+

استنادًا إلى إمكانيات التحديث المتجدد التي توفرها Kubernetes، يفرض مشغل Milvus تحديثًا مرتبًا لعمليات النشر وفقًا لتبعياتها. بالإضافة إلى ذلك، تطبق Milvus آلية لضمان بقاء مكوناتها متوافقة مع تلك التي تعتمد عليها أثناء الترقية، مما يقلل بشكل كبير من وقت تعطل الخدمة المحتمل.

+

يتم تعطيل ميزة الترقية المتجددة بشكل افتراضي. تحتاج إلى تمكينها بشكل صريح من خلال ملف تهيئة.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: rollingUpgrade # Default value, can be omitted
+    image: milvusdb/milvus:v2.5.3
+
+

في ملف التكوين أعلاه، اضبط spec.components.enableRollingUpdate على true واضبط spec.components.image على إصدار Milvus المطلوب.

+

بشكل افتراضي، يقوم Milvus بإجراء ترقية متجددة للمنسقين بطريقة مرتبة، حيث يقوم باستبدال صور حجرة المنسق واحدة تلو الأخرى. لتقليل وقت الترقية، ضع في اعتبارك تعيين spec.components.imageUpdateMode إلى all بحيث يستبدل ميلفوس جميع صور الكبسولات في نفس الوقت.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: all
+    image: milvusdb/milvus:v2.5.3
+
+

يمكنك تعيين spec.components.imageUpdateMode إلى rollingDowngrade لجعل Milvus يستبدل صور جراب المنسق بإصدار أقل.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: rollingDowngrade
+    image: milvusdb/milvus:<some-old-version>
+
+

ثم احفظ التكوين الخاص بك كملف YAML (على سبيل المثال، milvusupgrade.yml) وقم بتصحيح ملف التكوين هذا إلى مثيل Milvus الخاص بك على النحو التالي:

+
kubectl patch -f milvusupgrade.yml
+
+

قم بترقية Milvus عن طريق تغيير صورته

في الحالات العادية، يمكنك ببساطة تحديث Milvus الخاص بك إلى الأحدث عن طريق تغيير صورته. ومع ذلك، لاحظ أنه سيكون هناك وقت تعطل معين عند ترقية ميلفوس بهذه الطريقة.

+

قم بتكوين ملف تهيئة على النحو التالي واحفظه باسم milvusupgrade.yaml:

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  # Omit other fields ...
+  components:
+   image: milvusdb/milvus:v2.5.3
+
+

ثم قم بتشغيل ما يلي لتنفيذ الترقية:

+
kubectl patch -f milvusupgrade.yaml
+
+

ترحيل البيانات الوصفية

منذ الإصدار Milvus 2.2.0، أصبحت البيانات الوصفية غير متوافقة مع تلك الموجودة في الإصدارات السابقة. تفترض مقتطفات الأمثلة التالية ترقية من Milvus 2.1.4 إلى Milvus 2.5.3.

+

1. إنشاء ملف .yaml لترحيل البيانات الوصفية

قم بإنشاء ملف ترحيل البيانات الوصفية. وفيما يلي مثال على ذلك. تحتاج إلى تحديد name و sourceVersion و targetVersion في ملف التكوين. يقوم المثال التالي بتعيين name إلى my-release-upgrade و sourceVersion إلى v2.1.4 و targetVersion إلى v2.5.3. هذا يعني أنه ستتم ترقية مجموعة Milvus من الإصدار 2.1.4 إلى الإصدار 2.5.3.

+
apiVersion: milvus.io/v1beta1
+kind: MilvusUpgrade
+metadata:
+  name: my-release-upgrade
+spec:
+  milvus:
+    namespace: default
+    name: my-release
+  sourceVersion: "v2.1.4"
+  targetVersion: "v2.5.3"
+  # below are some omit default values:
+  # targetImage: "milvusdb/milvus:v2.5.3"
+  # toolImage: "milvusdb/meta-migration:v2.2.0"
+  # operation: upgrade
+  # rollbackIfFailed: true
+  # backupPVC: ""
+  # maxRetry: 3
+
+

2. تطبيق التكوين الجديد

قم بتشغيل الأمر التالي لإنشاء التكوين الجديد.

+
$ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml
+
+

3. تحقق من حالة ترحيل البيانات الوصفية

قم بتشغيل الأمر التالي للتحقق من حالة ترحيل بيانات التعريف.

+
kubectl describe milvus release-name
+
+

تعني الحالة ready في الإخراج أن حالة في الإخراج أن عملية ترحيل البيانات الوصفية ناجحة.

+

أو يمكنك أيضًا تشغيل kubectl get pod للتحقق من جميع الكبسولات. إذا كانت جميع القرون ready ، فإن ترحيل البيانات الوصفية ناجح.

+

4. حذف my-release-upgrade

عند نجاح الترقية، احذف my-release-upgrade في ملف YAML.

diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.json new file mode 100644 index 000000000..8b88a19b6 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nstandalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","// Run the following only after update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Standalone with Docker Compose","anchorList":[{"label":"ترقية Milvus Standalone باستخدام Docker Compose","href":"Upgrade-Milvus-Standalone-with-Docker-Compose","type":1,"isActive":false},{"label":"ترقية Milvus عن طريق تغيير صورته","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.md new file mode 100644 index 000000000..eaf507ed4 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-docker.md @@ -0,0 +1,132 @@ +--- +id: upgrade_milvus_standalone-docker.md +label: Docker Compose +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: تعرف على كيفية ترقية Milvus مستقل مع Docker Compose. +title: ترقية Milvus Standalone باستخدام Docker Compose +--- + +

ترقية Milvus Standalone باستخدام Docker Compose

يصف هذا الموضوع كيفية ترقية Milvus الخاص بك باستخدام Docker Compose.

+

في الحالات العادية، يمكنك ترقية Milvus عن طريق تغيير صورته. ومع ذلك، تحتاج إلى ترحيل البيانات الوصفية قبل أي ترقية من الإصدار 2.1.x إلى الإصدار 2.5.3.

+
+

نظرًا لمخاوف أمنية، يقوم Milvus بترقية MinIO الخاص به إلى RELEASE.2023-03-20T20-16-18Z مع إصدار الإصدار 2.2.5. قبل إجراء أي ترقيات من إصدارات Milvus Standalone السابقة المثبتة باستخدام Docker Compose، يجب عليك إنشاء نشر MinIO أحادي العقدة أحادي القيادة وترحيل إعدادات MinIO الحالية والمحتوى إلى النشر الجديد. لمزيد من التفاصيل، راجع هذا الدليل.

+
+

ترقية Milvus عن طريق تغيير صورته

في الحالات العادية، يمكنك ترقية Milvus على النحو التالي:

+
    +
  1. تغيير علامة صورة Milvus في docker-compose.yaml.

    +
    ...
    +standalone:
    +  container_name: milvus-standalone
    +  image: milvusdb/milvus:v2.5.3
    +
  2. +
  3. قم بتشغيل الأوامر التالية لتنفيذ الترقية.

    +
    docker compose down
    +docker compose up -d
    +
  4. +
+

ترحيل البيانات الوصفية

    +
  1. أوقف جميع مكونات ميلفوس.

    +
    docker stop <milvus-component-docker-container-name>
    +
  2. +
  3. قم بإعداد ملف التكوين migration.yaml لترحيل البيانات الوصفية.

    +
    # migration.yaml
    +cmd:
    +  # Option: run/backup/rollback
    +  type: run
    +  runWithBackup: true
    +config:
    +  sourceVersion: 2.1.4   # Specify your milvus version
    +  targetVersion: 2.5.3
    +  backupFilePath: /tmp/migration.bak
    +metastore:
    +  type: etcd
    +etcd:
    +  endpoints:
    +    - milvus-etcd:2379  # Use the etcd container name
    +  rootPath: by-dev # The root path where data is stored in etcd
    +  metaSubPath: meta
    +  kvSubPath: kv
    +
  4. +
  5. قم بتشغيل حاوية الترحيل.

    +
    # Suppose your docker-compose run with the default milvus network,
    +# and you put migration.yaml in the same directory with docker-compose.yaml.
    +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
    +
  6. +
  7. ابدأ تشغيل مكونات Milvus مرة أخرى باستخدام صورة Milvus الجديدة.

    +
    // Run the following only after update the milvus image tag in the docker-compose.yaml
    +docker compose down
    +docker compose up -d
    +
  8. +
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.json new file mode 100644 index 000000000..445c16a6f --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update zilliztech\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update\nhelm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nmy-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 84s\nmy-release-milvus-standalone-75c599fffc-6rwlj 1/1 Running 0 84s\nmy-release-minio-744dd9586f-qngzv 1/1 Running 0 84s\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3\n"],"headingContent":"Upgrade Milvus Standalone with Helm Chart","anchorList":[{"label":"ترقية Milvus Standalone مع مخطط Milvus Helm","href":"Upgrade-Milvus-Standalone-with-Helm-Chart","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تحقق من إصدار ميلفوس","href":"Check-the-Milvus-version","type":2,"isActive":false},{"label":"إجراء ترقية متجددة","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"ترقية ميلفوس باستخدام هيلم","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.md new file mode 100644 index 000000000..ccd7e6cf5 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-helm.md @@ -0,0 +1,259 @@ +--- +id: upgrade_milvus_standalone-helm.md +label: Helm +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: تعرف على كيفية ترقية ميلفوس المستقل مع مخطط هيلم. +title: ترقية Milvus Standalone مع مخطط Milvus Helm +--- + +

ترقية Milvus Standalone مع مخطط Milvus Helm

يصف هذا الدليل كيفية ترقية برنامج Milvus المستقل مع مخططات Milvus Helm.

+

المتطلبات الأساسية

    +
  • إصدار Helm >= 3.14.0
  • +
  • إصدار Kubernetes >= 1.20.0
  • +
+
+

منذ الإصدار 4.2.21 من مخطط Milvus-Helm، قدمنا مخطط pulsar-v3.x كإصدار تبعي. للتوافق مع الإصدارات السابقة، يرجى ترقية الدفة إلى الإصدار 3.14 أو إصدار أحدث، وتأكد من إضافة الخيار --reset-then-reuse-values كلما استخدمت helm upgrade.

+
+

تحقق من إصدار ميلفوس

قم بتشغيل الأوامر التالية للتحقق من إصدارات Milvus الجديدة.

+
$ helm repo update
+$ helm search repo zilliztech/milvus --versions
+
+
+

تم أرشفة الريبو الخاص بـ Milvus Helm Charts على https://milvus-io.github.io/milvus-helm/ ويمكنك الحصول على تحديثات أخرى من https://zilliztech.github.io/milvus-helm/ على النحو التالي:

+
helm repo add zilliztech https://zilliztech.github.io/milvus-helm
+helm repo update zilliztech
+# upgrade existing helm release
+helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
+
+

لا يزال الريبو المؤرشف متاحًا للمخططات حتى الإصدار 4.0.31. بالنسبة للإصدارات الأحدث، استخدم الريبو الجديد بدلاً من ذلك.

+
+
NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
+zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
+zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
+zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
+zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
+
+

يمكنك اختيار مسار الترقية لميلفوس الخاص بك على النحو التالي:

+
- [إجراء ترقية متجددة] (#إجراء ترقية متجددة) من الإصدار 2.2.3 والإصدارات الأحدث إلى الإصدار 2.5.3.
+ +
+

إجراء ترقية متجددة

منذ الإصدار Milvus 2.2.3، يمكنك تكوين منسقي Milvus للعمل في وضع الاستعداد النشط وتمكين ميزة الترقية المتجددة لهم، بحيث يمكن لـ Milvus الاستجابة للطلبات الواردة أثناء ترقيات المنسق. في الإصدارات السابقة، يجب إزالة المنسقين ثم إنشاؤهم أثناء الترقية، مما قد يؤدي إلى تعطل معين للخدمة.

+

تتطلب الترقيات المتجددة أن يعمل المنسقون في وضع الاستعداد النشط. يمكنك استخدام البرنامج النصي الذي نوفره لتهيئة المنسقين للعمل في وضع الاستعداد النشط وبدء الترقية المتجددة.

+

استنادًا إلى إمكانيات التحديث المتجدد التي توفرها Kubernetes، يفرض البرنامج النصي أعلاه تحديثًا مرتبًا لعمليات النشر وفقًا لتبعياتها. بالإضافة إلى ذلك، تطبق Milvus آلية لضمان بقاء مكوناتها متوافقة مع تلك التي تعتمد عليها أثناء الترقية، مما يقلل بشكل كبير من وقت تعطل الخدمة المحتمل.

+

ينطبق البرنامج النصي فقط على ترقية Milvus المثبتة مع Helm. يسرد الجدول التالي علامات الأوامر المتوفرة في البرامج النصية.

+ + + + + + + + + + + +
المعلماتالوصفالقيمة الافتراضيةمطلوبة
iاسم مثيل ميلفوسNoneصحيح
nمساحة الاسم الذي تم تثبيت Milvus فيهdefaultخطأ
tإصدار ميلفوس المستهدفNoneصحيح
wعلامة صورة ميلفوس الجديدةmilvusdb/milvus:v2.2.3صحيح
oالتشغيلupdateخطأ
+

بمجرد التأكد من أن جميع عمليات النشر في مثيل Milvus الخاص بك في حالتها الطبيعية. يمكنك تشغيل الأمر التالي لترقية مثيل Milvus إلى 2.5.3.

+
sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
+
+
+
    +
  1. لا ينطبق البرنامج النصي على مثيل Milvus المثبت مع RocksMQ.
  2. +
  3. يقوم البرنامج النصي بترميز ترتيب ترقية عمليات النشر بشكل ثابت ولا يمكن تغييره.
  4. +
  5. يستخدم البرنامج النصي kubectl patch لتحديث عمليات النشر و kubectl rollout status لمراقبة حالتها.
  6. +
  7. يستخدم البرنامج النصي kubectl patch لتحديث التسمية app.kubernetes.io/version لعمليات النشر إلى التسمية المحددة بعد العلامة -t في الأمر.
  8. +
+
+
+

ترقية ميلفوس باستخدام هيلم

لترقية ميلفوس من إصدار ثانوي قبل الإصدار 2.2.3 إلى الأحدث، قم بتشغيل الأوامر التالية:

+
helm repo update
+helm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
+
+

استخدم إصدار مخطط Helm في الأمر السابق. للحصول على تفاصيل حول كيفية الحصول على إصدار مخطط Helm، راجع التحقق من إصدار Milvus.

+

ترحيل البيانات الوصفية

منذ الإصدار Milvus 2.2.0، أصبحت البيانات الوصفية غير متوافقة مع تلك الموجودة في الإصدارات السابقة. تفترض مقتطفات الأمثلة التالية ترقية من Milvus 2.1.4 إلى Milvus 2.2.0.

+

1. تحقق من إصدار ملفوس

قم بتشغيل $ helm list للتحقق من إصدار تطبيق Milvus الخاص بك. يمكنك أن ترى أن APP VERSION هو 2.1.4.

+
NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION     
+my-release          default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4
+
+

2. تحقق من القرون قيد التشغيل

قم بتشغيل $ kubectl get pods للتحقق من القرون قيد التشغيل. يمكنك رؤية الإخراج التالي.

+
NAME                                            READY   STATUS    RESTARTS   AGE
+my-release-etcd-0                               1/1     Running   0          84s
+my-release-milvus-standalone-75c599fffc-6rwlj   1/1     Running   0          84s
+my-release-minio-744dd9586f-qngzv               1/1     Running   0          84s
+
+

3. تحقق من علامة الصورة

تحقق من علامة الصورة للبود my-release-milvus-proxy-6c548f787f-scspp. يمكنك رؤية إصدار مجموعة ميلفوس الخاص بك هو الإصدار 2.1.4.

+
$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
+# milvusdb/milvus:v2.1.4
+
+

4. ترحيل البيانات الوصفية

من التغييرات الرئيسية في Milvus 2.2 هو بنية البيانات الوصفية لفهارس المقاطع. لذلك ، تحتاج إلى استخدام Helm لترحيل البيانات الوصفية أثناء ترقية Milvus من الإصدار 2.1.x إلى الإصدار 2.2.0. إليك برنامج نصي لترحيل البيانات الوصفية بأمان.

+

ينطبق هذا البرنامج النصي فقط على Milvus المثبت على مجموعة K8s. قم بالرجوع إلى الإصدار السابق باستخدام عملية التراجع أولاً في حالة حدوث خطأ أثناء العملية.

+

يسرد الجدول التالي العمليات التي يمكنك القيام بها لترحيل البيانات الوصفية.

+ + + + + + + + + + + + + + + + + +
المعلماتالوصفالقيمة الافتراضيةمطلوبة
iاسم مثيل Milvus.Noneصحيح
nمساحة الاسم التي تم تثبيت Milvus فيها.defaultخطأ
sإصدار Milvus المصدر.Noneصحيح
tإصدار ميلفوس الهدف.Noneصحيح
rالمسار الجذر لـ Milvus meta.by-devخطأ
wعلامة صورة ملفوس الجديدة.milvusdb/milvus:v2.2.0خطأ
mعلامة صورة الترحيل الوصفية للصور الوصفية.milvusdb/meta-migration:v2.2.0خطأ
oعملية الترحيل الوصفية.migrateخطأ
dما إذا كان سيتم حذف جراب الترحيل بعد اكتمال الترحيل.falseخطأ
cفئة التخزين لـ pvc الترحيل الوصفية.default storage classخطأ
eنقطة إن بوينت إلخd المستخدمة من قبل ميلفوس.etcd svc installed with milvusخطأ
+

1. ترحيل البيانات الوصفية

    +
  1. تحميل البرنامج النصي للترحيل.
  2. +
  3. إيقاف مكونات Milvus. يمكن أن تتسبب أي جلسة عمل مباشرة في Milvus etcd في فشل الترحيل.
  4. +
  5. إنشاء نسخة احتياطية للبيانات الوصفية ل Milvus.
  6. +
  7. ترحيل البيانات الوصفية ل Milvus.
  8. +
  9. ابدأ تشغيل مكونات Milvus بصورة جديدة.
  10. +
+

2. ترقية ميلفوس من الإصدار 2.1.x إلى 2.5.3

تفترض الأوامر التالية أنك قمت بترقية ملفوس من الإصدار 2.1.4 إلى 2.5.3. قم بتغييرها إلى الإصدارات التي تناسب احتياجاتك.

+
    +
  1. حدد اسم مثيل Milvus وإصدار Milvus المصدر وإصدار Milvus الهدف.

    +
    ./migrate.sh -i my-release -s 2.1.4 -t 2.5.3
    +
  2. +
  3. حدد مساحة الاسم مع -n إذا لم يكن Milvus الخاص بك مثبتًا في مساحة اسم K8s الافتراضية.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3
    +
  4. +
  5. حدد مسار الجذر مع -r إذا كان Milvus الخاص بك مثبتًا مع المخصص rootpath.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev
    +
  6. +
  7. حدد علامة الصورة مع -w إذا كان Milvus الخاص بك مثبتًا مع مخصص image.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3
    +
  8. +
  9. قم بتعيين -d true إذا كنت تريد إزالة جراب الترحيل تلقائيًا بعد اكتمال الترحيل.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true
    +
  10. +
  11. التراجع والترحيل مرة أخرى إذا فشلت عملية الترحيل.

    +
    ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1
    +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3
    +
  12. +
diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.json b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.json new file mode 100644 index 000000000..dce4e514c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nlabels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Standalone with Milvus Operator","anchorList":[{"label":"ترقية Milvus Standalone مع مشغل Milvus","href":"Upgrade-Milvus-Standalone-with-Milvus-Operator","type":1,"isActive":false},{"label":"ترقية مشغل ميلفوس الخاص بك","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"إجراء ترقية متجددة","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"قم بترقية Milvus عن طريق تغيير صورته","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"ترحيل البيانات الوصفية","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.md b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.md new file mode 100644 index 000000000..a956e35fc --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/upgrade_milvus_standalone-operator.md @@ -0,0 +1,181 @@ +--- +id: upgrade_milvus_standalone-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: تعرف على كيفية ترقية ميلفوس المستقل مع مشغل ميلفوس. +title: ترقية Milvus Standalone مع مشغل Milvus +--- + +

ترقية Milvus Standalone مع مشغل Milvus

يصف هذا الدليل كيفية ترقية Milvus المستقل الخاص بك مع مشغل Milvus.

+

ترقية مشغل ميلفوس الخاص بك

قم بتشغيل الأمر التالي لترقية إصدار مشغل Milvus الخاص بك إلى الإصدار v1.0.1.

+
helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
+helm repo update zilliztech-milvus-operator
+helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
+
+

بمجرد أن تقوم بترقية مشغل ميلفوس الخاص بك إلى أحدث إصدار، يكون لديك الخيارات التالية:

+ +

إجراء ترقية متجددة

منذ الإصدار Milvus 2.2.3، يمكنك تكوين منسقي Milvus للعمل في وضع الاستعداد النشط وتمكين ميزة الترقية المتجددة لهم، بحيث يمكن لـ Milvus الاستجابة للطلبات الواردة أثناء ترقيات المنسق. في الإصدارات السابقة، يجب إزالة المنسقين ثم إنشاؤهم أثناء الترقية، مما قد يؤدي إلى تعطل معين للخدمة.

+

استنادًا إلى إمكانيات التحديث المتداول التي توفرها Kubernetes، يفرض مشغل Milvus تحديثًا مرتبًا لعمليات النشر وفقًا لتبعياتها. بالإضافة إلى ذلك، تطبق Milvus آلية لضمان بقاء مكوناتها متوافقة مع تلك التي تعتمد عليها أثناء الترقية، مما يقلل بشكل كبير من وقت تعطل الخدمة المحتمل.

+

يتم تعطيل ميزة الترقية المتجددة بشكل افتراضي. تحتاج إلى تمكينها بشكل صريح من خلال ملف تهيئة.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: rollingUpgrade # Default value, can be omitted
+    image: milvusdb/milvus:v2.5.3
+
+

في ملف التكوين أعلاه، اضبط spec.components.enableRollingUpdate على true واضبط spec.components.image على إصدار Milvus المطلوب.

+

بشكل افتراضي، يقوم ملف Milvus بإجراء ترقية متجددة للمنسقين بطريقة مرتبة، حيث يقوم باستبدال صور حجرة المنسق واحدة تلو الأخرى. لتقليل وقت الترقية، ضع في اعتبارك تعيين spec.components.imageUpdateMode إلى all بحيث يستبدل ميلفوس جميع صور الكبسولات في نفس الوقت.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: all
+    image: milvusdb/milvus:v2.5.3
+
+

يمكنك تعيين spec.components.imageUpdateMode إلى rollingDowngrade لجعل Milvus يستبدل صور جراب المنسق بإصدار أقل.

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+  name: my-release
+spec:
+  components:
+    enableRollingUpdate: true
+    imageUpdateMode: rollingDowngrade
+    image: milvusdb/milvus:<some-older-version>
+
+

ثم احفظ التكوين الخاص بك كملف YAML (على سبيل المثال، milvusupgrade.yml) وقم بتصحيح ملف التكوين هذا إلى مثيل Milvus الخاص بك على النحو التالي:

+
kubectl patch -f milvusupgrade.yml
+
+

قم بترقية Milvus عن طريق تغيير صورته

في الحالات العادية، يمكنك ببساطة تحديث Milvus الخاص بك إلى الأحدث عن طريق تغيير صورته. ومع ذلك، لاحظ أنه سيكون هناك وقت تعطل معين عند ترقية ميلفوس بهذه الطريقة.

+

قم بتكوين ملف تهيئة على النحو التالي واحفظه باسم milvusupgrade.yaml:

+
apiVersion: milvus.io/v1beta1
+kind: Milvus
+metadata:
+    name: my-release
+labels:
+    app: milvus
+spec:
+  # Omit other fields ...
+  components:
+   image: milvusdb/milvus:v2.5.3
+
+

ثم قم بتشغيل ما يلي لتنفيذ الترقية:

+
kubectl patch -f milvusupgrade.yaml
+
+

ترحيل البيانات الوصفية

منذ الإصدار Milvus 2.2.0، أصبحت البيانات الوصفية غير متوافقة مع تلك الموجودة في الإصدارات السابقة. تفترض مقتطفات الأمثلة التالية ترقية من Milvus 2.1.4 إلى Milvus v2.5.3.

+

1. إنشاء ملف .yaml لترحيل البيانات الوصفية

قم بإنشاء ملف ترحيل البيانات الوصفية. وفيما يلي مثال على ذلك. تحتاج إلى تحديد name و sourceVersion و targetVersion في ملف التكوين. المثال التالي يحدد name إلى my-release-upgrade و sourceVersion إلى v2.1.4 و targetVersion إلى v2.5.3. هذا يعني أنه سيتم ترقية مثيل Milvus الخاص بك من الإصدار 2.1.4 إلى الإصدار 2.5.3.

+
apiVersion: milvus.io/v1beta1
+kind: MilvusUpgrade
+metadata:
+  name: my-release-upgrade
+spec:
+  milvus:
+    namespace: default
+    name: my-release
+  sourceVersion: "v2.1.4"
+  targetVersion: "v2.5.3"
+  # below are some omit default values:
+  # targetImage: "milvusdb/milvus:v2.5.3"
+  # toolImage: "milvusdb/meta-migration:v2.2.0"
+  # operation: upgrade
+  # rollbackIfFailed: true
+  # backupPVC: ""
+  # maxRetry: 3
+
+

2. تطبيق التكوين الجديد

قم بتشغيل الأمر التالي لتطبيق التكوين الجديد.

+
$ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml
+
+

3. التحقق من حالة ترحيل البيانات الوصفية

قم بتشغيل الأمر التالي للتحقق من حالة ترحيل بيانات التعريف.

+
kubectl describe milvus release-name
+
+

تعني الحالة ready في الإخراج أن حالة في الإخراج أن عملية ترحيل البيانات الوصفية ناجحة.

+

أو يمكنك أيضًا تشغيل kubectl get pod للتحقق من جميع الكبسولات. إذا كانت جميع القرون ready ، فإن ترحيل البيانات الوصفية ناجح.

+

4. حذف my-release-upgrade

عند نجاح الترقية، احذف my-release-upgrade في ملف YAML.

diff --git a/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.json b/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.json new file mode 100644 index 000000000..589a3f426 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.json @@ -0,0 +1 @@ +{"codeList":["namespace=default\nrelease=my-release\nhelm -n ${namespace} get values ${release} -o yaml > values.yaml\ncat values.yaml\n","# ... omit existing values\npulsar:\n enabled: true\npulsarv3:\n enabled: false\nimage:\n all:\n repository: milvusdb/milvus\n tag: v2.5.0-beta \n","helm repo add milvus https://zilliztech.github.io/milvus-helm\nhelm repo update milvus\n","helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml\n","wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n namespace: default\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies:\n pulsar:\n inCluster:\n chartVersion: pulsar-v2\n","kubectl apply -f milvus_cluster_default.yaml\n","helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false\n","pulsar:\n enabled: true\npulsarv3:\n enabled: false\n","helm install my-release milvus/milvus -f values.yaml\n"],"headingContent":"Use Pulsar v2 with Milvus v2.5.x","anchorList":[{"label":"استخدام Pulsar v2 مع Milvus v2.5.x","href":"Use-Pulsar-v2-with-Milvus-v25x","type":1,"isActive":false},{"label":"الاستمرار في استخدام Pulsar v2 أثناء ترقية Milvus v2.5.x","href":"Continue-using-Pulsar-v2-while-upgrading-Milvus-v25x","type":2,"isActive":false},{"label":"إنشاء مثيل جديد لـ Milvus باستخدام Pulsar v2","href":"Creating-a-new-Milvus-instance-with-Pulsar-v2","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.md b/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.md new file mode 100644 index 000000000..7bd3b6807 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/use-pulsar-v2.md @@ -0,0 +1,139 @@ +--- +id: use-pulsar-v2.md +related_key: use pulsar v2 with milvus v2.5.x +summary: >- + توصيك شركة Milvus بترقية Pulsar إلى الإصدار 3 لـ Milvus v2.5.x. ومع ذلك، إذا + كنت تفضل استخدام Pulsar v2، فإن هذه المقالة سترشدك إلى خطوات متابعة استخدام + Pulsar v2 مع Milvus v2.5.x. +title: استخدام Pulsar v2 مع Milvus v2.5.x +--- +

استخدام Pulsar v2 مع Milvus v2.5.x

تنصحك Milvus بترقية Pulsar إلى الإصدار 3 لتشغيل Milvus v2.5.x. لمزيد من التفاصيل، راجع ترقية Pulsar. ومع ذلك، إذا كنت تفضل استخدام Pulsar v2 مع Milvus v2.5.x، فإن هذه المقالة سترشدك خلال إجراء تشغيل Milvus v2.5.x مع Pulsar v2.

+

إذا كان لديك مثيل Milvus قيد التشغيل بالفعل وترغب في ترقيته إلى الإصدار 2.5.x ولكنك تواصل استخدام Pulsar v2، يمكنك اتباع الخطوات الواردة في هذه الصفحة.

+

الاستمرار في استخدام Pulsar v2 أثناء ترقية Milvus v2.5.x

سيرشدك هذا القسم إلى الخطوات اللازمة لمواصلة استخدام Pulsar v2 أثناء ترقية مثيل Milvus قيد التشغيل إلى الإصدار Milvus v2.5.x.

+

لمستخدمي مشغل Milvus

يتوافق Milvus Operator مع ترقيات Pulsar v2 بشكل افتراضي. يمكنك ترقية مثيل Milvus الخاص بك إلى الإصدار 2.5.x بالرجوع إلى ترقية مجموعة Milvus العنقودية مع مشغل Milvus.

+

بمجرد اكتمال الترقية، يمكنك متابعة استخدام Pulsar v2 مع مثيل Milvus الخاص بك.

+

لمستخدمي Helm

قبل الترقية، تأكد من أن

+
    +
  • إصدار Helm الخاص بك أعلى من الإصدار 3.12، ويوصى باستخدام أحدث إصدار.

    +

    لمزيد من المعلومات، راجع تثبيت Helm.

  • +
  • إصدار Kubernetes veresion الخاص بك أعلى من الإصدار v1.20.

  • +
+

العمليات في هذه المقالة تفترض أن:

+
    +
  • تم تثبيت Milvus في مساحة الأسماء default.

  • +
  • اسم إصدار Milvus هو my-release.

  • +
+

تحتاج إلى تغيير الملف values.yaml لتحديد إصدار Pulsar كإصدار v2 قبل ترقية Milvus. الخطوات كالتالي:

+
    +
  1. احصل على ملف values.yaml الحالي لمثيل Milvus الخاص بك.

    +
    namespace=default
    +release=my-release
    +helm -n ${namespace} get values ${release} -o yaml > values.yaml
    +cat values.yaml
    +
  2. +
  3. قم بتحرير الملف values.yaml لتحديد إصدار Pulsar كإصدار v2.

    +
    # ... omit existing values
    +pulsar:
    +  enabled: true
    +pulsarv3:
    +  enabled: false
    +image:
    +  all:
    +    repository: milvusdb/milvus
    +    tag: v2.5.0-beta 
    +
    +

    بالنسبة إلى image ، قم بتغيير tag إلى إصدار ميلفوس المطلوب (على سبيل المثال v2.5.0-beta).

  4. +
  5. تحديث مخطط Milvus Helm.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm
    +helm repo update milvus
    +
  6. +
  7. ترقية مثيل Milvus.

    +
    helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml
    +
  8. +
+

إنشاء مثيل جديد لـ Milvus باستخدام Pulsar v2

سيرشدك هذا القسم إلى خطوات إنشاء مثيل Milvus جديد باستخدام Pulsar v2.

+

لمستخدمي مشغل Milvus

قبل أن تقوم بنشر Milvus v2.5.x، تحتاج إلى تنزيل ملف تعريف موارد العميل (CRD) الخاص ب Milvus وتحريره. للحصول على تفاصيل حول كيفية تثبيت Milvus باستخدام مشغل Milvus، راجع تثبيت مجموعة Milvus العنقودية باستخدام مشغل Milvus.

+
    +
  1. قم بتنزيل ملف CRD.

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
  2. +
  3. قم بتحرير الملف milvus_cluster_default.yaml لتحديد إصدار Pulsar كإصدار v2.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  namespace: default
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  dependencies:
    +    pulsar:
    +      inCluster:
    +        chartVersion: pulsar-v2
    +
    +

    بالنسبة إلى dependencies ، قم بتغيير pulsar.inCluster.chartVersion إلى pulsar-v2.

  4. +
  5. تابع الخطوات الواردة في تثبيت مجموعة Milvus العنقودية مع مشغل Milvus لنشر Milvus v2.5.x مع Pulsar v2 باستخدام ملف CRD الذي تم تحريره.

    +
    kubectl apply -f milvus_cluster_default.yaml
    +
  6. +
+

لمستخدمي Helm

قبل أن تقوم بنشر Milvus v2.5.x، يمكنك إما إعداد ملف values.yaml أو استخدام المعلمات المضمنة لتحديد إصدار Pulsar. للحصول على تفاصيل حول كيفية تثبيت Milvus باستخدام Helm، راجع تثبيت مجموعة Milvus العنقودية باستخدام Helm.

+
    +
  • استخدم المعلمات المضمنة لتحديد إصدار Pulsar كإصدار v2.

    +
    helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false
    +
  • +
  • استخدم ملف values.yaml لتحديد إصدار Pulsar كإصدار v2.

    +
    pulsar:
    +  enabled: true
    +pulsarv3:
    +  enabled: false
    +
    +

    بعد ذلك، قم بنشر Milvus v2.5.x مع Pulsar v2 باستخدام الملف values.yaml.

    +
    helm install my-release milvus/milvus -f values.yaml
    +
  • +
diff --git a/localization/v2.5.x/site/ar/adminGuide/users_and_roles.json b/localization/v2.5.x/site/ar/adminGuide/users_and_roles.json new file mode 100644 index 000000000..7d1fc991c --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/users_and_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.create_user(user_name=\"user_1\", password=\"P@ssw0rd\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.CreateUserReq;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nCreateUserReq createUserReq = CreateUserReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .build();​\n ​\nclient.createUser(createUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nawait milvusClient.createUser({​\n username: 'user_1',​\n password: 'P@ssw0rd',​\n });​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.update_password(​\n user_name=\"user_1\",​\n old_password=\"P@ssw0rd\",​\n new_password=\"NewP@ssw0rd\"​\n)​\n\n","import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​\n​\nUpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .newPassword(\"NewP@ssw0rd\")​\n .build();​\nclient.updatePassword(updatePasswordReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.updateUser({​\n username: 'user_1',​\n newPassword: 'P@ssw0rd',​\n oldPassword: 'NewP@ssw0rd',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"newPassword\": \"P@ssw0rd!\",​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","List resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listUsers();​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root', 'user_1']​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_role(role_name=\"role_a\")​\nimport io.milvus.v2.service.rbac.request.CreateRoleReq;​\n\n","CreateRoleReq createRoleReq = CreateRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\n ​\n\n","client.createRole(createRoleReq);​\nconst { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.createRole({​\n roleName: 'role_a',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List roles = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listRoles(​\n includeUserInfo: True​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin', 'role_a']​\n\n"],"headingContent":"Create Users & Roles​","anchorList":[{"label":"إنشاء المستخدمين والأدوار","href":"Create-Users--Roles​","type":1,"isActive":false},{"label":"المستخدم","href":"User​","type":2,"isActive":false},{"label":"الدور","href":"Role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/adminGuide/users_and_roles.md b/localization/v2.5.x/site/ar/adminGuide/users_and_roles.md new file mode 100644 index 000000000..fe4571502 --- /dev/null +++ b/localization/v2.5.x/site/ar/adminGuide/users_and_roles.md @@ -0,0 +1,260 @@ +--- +id: users_and_roles.md +related_key: 'users, roles' +summary: >- + يحقق Milvus التحكم الدقيق في الوصول من خلال التحكم في الوصول من خلال RBAC. + يمكنك البدء بإنشاء مستخدمين وأدوار، ثم تعيين امتيازات أو مجموعات امتيازات + للأدوار، وأخيراً إدارة التحكم في الوصول من خلال منح الأدوار للمستخدمين. تضمن + هذه الطريقة كفاءة وأمان إدارة الوصول. تقدم هذه الصفحة كيفية إنشاء المستخدمين + والأدوار في Milvus. +title: إنشاء المستخدمين والأدوار +--- +

إنشاء المستخدمين والأدوار

يحقق Milvus التحكم الدقيق في الوصول من خلال التحكم في الوصول من خلال RBAC. يمكنك البدء بإنشاء مستخدمين وأدوار، ثم تعيين امتيازات أو مجموعات امتيازات للأدوار، وأخيراً إدارة التحكم في الوصول من خلال منح الأدوار للمستخدمين. تضمن هذه الطريقة كفاءة وأمان إدارة الوصول. تقدم هذه الصفحة كيفية إنشاء المستخدمين والأدوار في Milvus.

+

المستخدم

بعد تهيئة مثيل Milvus، يتم إنشاء مستخدم جذر تلقائياً للمصادقة عند الاتصال ب Milvus للمرة الأولى. اسم المستخدم للمستخدم الجذر هو root وكلمة المرور هي Milvus. الدور الافتراضي للمستخدم الجذر هو admin ، والذي لديه حق الوصول إلى جميع الموارد. لضمان أمن البيانات، يرجى الحفاظ على بيانات اعتماد المستخدم الجذر آمنة لمنع الوصول غير المصرح به.

+

للعمليات اليومية، نوصي بإنشاء مستخدمين بدلاً من استخدام المستخدم الجذر.

+

إنشاء مستخدم

يوضح المثال التالي كيفية إنشاء مستخدم باسم المستخدم user_1 وكلمة المرور P@ssw0rd. يجب أن يتبع اسم المستخدم وكلمة المرور للمستخدم القواعد التالية.

+
    +
  • اسم المستخدم: يجب أن يبدأ بحرف ويمكن أن يتضمن فقط أحرفًا كبيرة أو صغيرة وأرقامًا وشروطًا سفلية.

  • +
  • كلمة المرور: يجب أن يتراوح طولها بين 8 و64 حرفًا ويجب أن تتضمن ثلاثة مما يلي: أحرف كبيرة وأحرف صغيرة وأرقام وأحرف خاصة.

  • +
+ +
from pymilvus import MilvusClient​
+​
+client = MilvusClient(​
+    uri="http://localhost:19530",​
+    token="root:Milvus"​
+)​
+​
+client.create_user(user_name="user_1", password="P@ssw0rd")​
+
+
+
import io.milvus.v2.client.ConnectConfig;​
+import io.milvus.v2.client.MilvusClientV2;​
+import io.milvus.v2.service.rbac.request.CreateUserReq;​
+​
+ConnectConfig connectConfig = ConnectConfig.builder()​
+        .uri("http://localhost:19530")​
+        .token("root:Milvus")​
+        .build();​
+        ​
+MilvusClientV2 client = new MilvusClientV2(connectConfig);​
+​
+CreateUserReq createUserReq = CreateUserReq.builder()​
+        .userName("user_1")​
+        .password("P@ssw0rd")​
+        .build();​
+        ​
+client.createUser(createUserReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+const address = "http://localhost:19530";​
+const token = "root:Milvus";​
+const client = new MilvusClient({address, token});​
+​
+await milvusClient.createUser({​
+   username: 'user_1',​
+   password: 'P@ssw0rd',​
+ });​
+
+
+
export CLUSTER_ENDPOINT="http://localhost:19530"​
+export TOKEN="root:Milvus"​
+​
+curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/create" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "userName": "user_1",​
+    "password": "P@ssw0rd"​
+}'​
+
+
+

تحديث كلمة المرور

بعد إنشاء مستخدم، يمكنك تحديث كلمة المرور إذا نسيت.

+

يجب أن تتبع كلمة المرور الجديدة القاعدة التالية.

+
    +
  • يجب أن تتكون من 8-64 حرفًا وأن تتضمن ثلاثة مما يلي: أحرف كبيرة وأحرف صغيرة وأرقام وأحرف خاصة.
  • +
+

يوضح المثال التالي كيفية تحديث كلمة المرور للمستخدم user_1 إلى NewP@ssw0rd.

+ +
from pymilvus import MilvusClient​
+​
+client.update_password(​
+    user_name="user_1",​
+    old_password="P@ssw0rd",​
+    new_password="NewP@ssw0rd"​
+)​
+
+
+
import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​
+​
+UpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​
+        .userName("user_1")​
+        .password("P@ssw0rd")​
+        .newPassword("NewP@ssw0rd")​
+        .build();​
+client.updatePassword(updatePasswordReq);​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+await milvusClient.updateUser({​
+   username: 'user_1',​
+   newPassword: 'P@ssw0rd',​
+   oldPassword: 'NewP@ssw0rd',​
+});​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "newPassword": "P@ssw0rd!",​
+    "userName": "user_1",​
+    "password": "P@ssw0rd"​
+}'​
+
+
+

سرد المستخدمين

بعد إنشاء عدة مستخدمين، يمكنك سرد وعرض جميع المستخدمين الحاليين.

+ +
from pymilvus import MilvusClient​
+​
+client.list_users()​
+
+
+
List<String> resp = client.listUsers();​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+await milvusClient.listUsers();​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{}'​
+
+
+

فيما يلي مثال على الإخراج. root هو المستخدم الافتراضي الذي تم إنشاؤه تلقائيًا في Milvus. user_1 هو المستخدم الجديد الذي تم إنشاؤه للتو.

+
['root', 'user_1']​
+
+
+

الدور

يوفر Milvus دورًا مدمجًا يسمى admin ، وهو دور مسؤول يمكنه الوصول إلى الموارد ضمن جميع المثيلات ولديه امتيازات لجميع العمليات. للحصول على إدارة وصول أكثر دقة وأمان محسّن للبيانات، يوصى بإنشاء أدوار مخصصة بناءً على احتياجاتك.

+

إنشاء دور

يوضح المثال التالي كيفية إنشاء دور باسم role_a.

+

يجب أن يتبع اسم الدور القاعدة التالية.

+
    +
  • يجب أن يبدأ بحرف ويمكن أن يتضمن فقط أحرفًا كبيرة أو صغيرة وأرقامًا وشرطات سفلية."
  • +
+ +
from pymilvus import MilvusClient​
+​
+client.create_role(role_name="role_a")​
+import io.milvus.v2.service.rbac.request.CreateRoleReq;​
+
+
+
CreateRoleReq createRoleReq = CreateRoleReq.builder()​
+        .roleName("role_a")​
+        .build();​
+       ​
+
+
+
client.createRole(createRoleReq);​
+const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+await milvusClient.createRole({​
+   roleName: 'role_a',​
+});​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/create" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{​
+    "roleName": "role_a"​
+}'​
+
+
+

سرد الأدوار

بعد إنشاء عدة أدوار، يمكنك سرد جميع الأدوار الموجودة وعرضها.

+ +
from pymilvus import MilvusClient​
+​
+client.list_roles()​
+
+
+
List<String> roles = client.listRoles();​
+
+
+
const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
+​
+await milvusClient.listRoles(​
+    includeUserInfo: True​
+);​
+
+
+
curl --request POST \​
+--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
+--header "Authorization: Bearer ${TOKEN}" \​
+--header "Content-Type: application/json" \​
+-d '{}'​
+
+
+

فيما يلي مثال على الإخراج. admin هو الدور الافتراضي في ميلفوس. role_a هو الدور الجديد الذي تم إنشاؤه للتو.

+
['admin', 'role_a']​
+
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.json b/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.json new file mode 100644 index 000000000..c8761f540 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\nbge_m3_ef = BGEM3EmbeddingFunction(\n model_name='BAAI/bge-m3', # Specify the model name\n device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = bge_m3_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense document dim:\", bge_m3_ef.dim[\"dense\"], docs_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse document dim:\", bge_m3_ef.dim[\"sparse\"], list(docs_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02505937, -0.00142193, 0.04015467, ..., -0.02094924,\n 0.02623661, 0.00324098], dtype=float32), array([ 0.00118463, 0.00649292, -0.00735763, ..., -0.01446293,\n 0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 , 0.0009811 , ..., -0.02559666,\n 0.08084674, 0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type ''\n with 43 stored elements in Compressed Sparse Row format>}\nDense document dim: 1024 (1024,)\nSparse document dim: 250002 (1, 250002)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bge_m3_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense query dim:\", bge_m3_ef.dim[\"dense\"], query_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse query dim:\", bge_m3_ef.dim[\"sparse\"], list(query_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02024024, -0.01514386, 0.02380808, ..., 0.00234648,\n -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,\n 0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type ''\n with 14 stored elements in Compressed Sparse Row format>}\nDense query dim: 1024 (1024,)\nSparse query dim: 250002 (1, 250002)\n"],"headingContent":"BGE M3","anchorList":[{"label":"BGE M3","href":"BGE-M3","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.md b/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.md new file mode 100644 index 000000000..b8fd53515 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-bgm-m3.md @@ -0,0 +1,91 @@ +--- +id: embed-with-bgm-m3.md +order: 4 +summary: سُمي BGE-M3 نظرًا لقدراته في تعدد اللغات وتعدد الوظائف وتعدد الحبيبات. +title: BGE M3 +--- +

BGE M3

سُميBGE-M3 نظرًا لقدراته في تعدد اللغات وتعدد الوظائف وتعدد الحبيبات. وبفضل قدرته على دعم أكثر من 100 لغة، يضع BGE-M3 معايير جديدة في مهام الاسترجاع متعدد اللغات واللغات. إن قدرتها الفريدة على إجراء الاسترجاع الكثيف والاسترجاع متعدد النواقل والاسترجاع المتناثر في إطار واحد يجعلها خيارًا مثاليًا لمجموعة واسعة من تطبيقات استرجاع المعلومات (IR).

+

يتكامل ميلفوس مع نموذج BGE M3 باستخدام فئة BGEM3EmbeddingFunction. تتعامل هذه الفئة مع حساب التضمينات وتعيدها بتنسيق متوافق مع Milvus للفهرسة والبحث. لاستخدام هذه الميزة، يجب تثبيت FlagEmbedding.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء دالة BGEM3EmbeddingFunction:

+
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
+
+bge_m3_ef = BGEM3EmbeddingFunction(
+    model_name='BAAI/bge-m3', # Specify the model name
+    device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'
+    use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.
+)
+
+

المعلمات:

+
    +
  • اسم_النموذج(سلسلة)

    +

    اسم النموذج المراد استخدامه للترميز. القيمة الافتراضية إلى BAAI/bge-m3.

  • +
  • الجهاز(سلسلة)

    +

    الجهاز المراد استخدامه، مع استخدام cpu لوحدة المعالجة المركزية و cuda:n لجهاز وحدة معالجة الرسومات رقم n.

  • +
  • use_fp16(bool)

    +

    ما إذا كان يجب استخدام دقة الفاصلة العائمة 16 بت (fp16). حدد خطأ عندما يكون الجهاز هو وحدة المعالجة المركزية.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الأسلوب encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = bge_m3_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension of dense embeddings
+print("Dense document dim:", bge_m3_ef.dim["dense"], docs_embeddings["dense"][0].shape)
+# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse document dim:", bge_m3_ef.dim["sparse"], list(docs_embeddings["sparse"])[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: {'dense': [array([-0.02505937, -0.00142193,  0.04015467, ..., -0.02094924,
+        0.02623661,  0.00324098], dtype=float32), array([ 0.00118463,  0.00649292, -0.00735763, ..., -0.01446293,
+        0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 ,  0.0009811 , ..., -0.02559666,
+        0.08084674,  0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type '<class 'numpy.float32'>'
+        with 43 stored elements in Compressed Sparse Row format>}
+Dense document dim: 1024 (1024,)
+Sparse document dim: 250002 (1, 250002)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = bge_m3_ef.encode_queries(queries)
+
+# Print embeddings
+print("Embeddings:", query_embeddings)
+# Print dimension of dense embeddings
+print("Dense query dim:", bge_m3_ef.dim["dense"], query_embeddings["dense"][0].shape)
+# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse query dim:", bge_m3_ef.dim["sparse"], list(query_embeddings["sparse"])[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: {'dense': [array([-0.02024024, -0.01514386,  0.02380808, ...,  0.00234648,
+       -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,
+        0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type '<class 'numpy.float32'>'
+        with 14 stored elements in Compressed Sparse Row format>}
+Dense query dim: 1024 (1024,)
+Sparse query dim: 250002 (1, 250002)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.json b/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.json new file mode 100644 index 000000000..04ac93b04 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer\nfrom pymilvus.model.sparse import BM25EmbeddingFunction\n\n# there are some built-in analyzers for several languages, now we use 'en' for English.\nanalyzer = build_default_analyzer(language=\"en\")\n\ncorpus = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\n# analyzer can tokenize the text into tokens\ntokens = analyzer(corpus[0])\nprint(\"tokens:\", tokens)\n","tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']\n","# Use the analyzer to instantiate the BM25EmbeddingFunction\nbm25_ef = BM25EmbeddingFunction(analyzer)\n\n# Fit the model on the corpus to get the statstics of the corpus\nbm25_ef.fit(corpus)\n","docs = [\n \"The field of artificial intelligence was established as an academic subject in 1956.\",\n \"Alan Turing was the pioneer in conducting significant research in artificial intelligence.\",\n \"Originating in Maida Vale, London, Turing grew up in the southern regions of England.\",\n \"In 1956, artificial intelligence emerged as a scholarly field.\",\n \"Turing, originally from Maida Vale, London, was brought up in the south of England.\"\n]\n\n# Create embeddings for the documents\ndocs_embeddings = bm25_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 0) 1.0208816705336425\n (0, 1) 1.0208816705336425\n (0, 3) 1.0208816705336425\n...\n (4, 16) 0.9606986899563318\n (4, 17) 0.9606986899563318\n (4, 20) 0.9606986899563318\nSparse dim: 21 (1, 21)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bm25_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 0) 0.5108256237659907\n (0, 1) 0.5108256237659907\n (0, 2) 0.5108256237659907\n (1, 6) 0.5108256237659907\n (1, 7) 0.11554389108992644\n (1, 14) 0.5108256237659907\nSparse dim: 21 (1, 21)\n"],"headingContent":"BM25","anchorList":[{"label":"BM25","href":"BM25","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.md b/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.md new file mode 100644 index 000000000..3f13003eb --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-bm25.md @@ -0,0 +1,112 @@ +--- +id: embed-with-bm25.md +order: 5 +summary: >- + BM25 هي دالة ترتيب تُستخدم في استرجاع المعلومات لتقدير مدى صلة المستندات + باستعلام بحث معين. +title: BM25 +--- +

BM25

BM25 هي دالة ترتيب تُستخدم في استرجاع المعلومات لتقدير مدى صلة المستندات باستعلام بحث معين. تعمل هذه الدالة على تحسين نهج تردد المصطلح الأساسي من خلال دمج تطبيع طول المستند وإشباع تردد المصطلح. يمكن ل BM25 إنشاء تضمينات متفرقة من خلال تمثيل المستندات كمتجهات لدرجات أهمية المصطلحات، مما يسمح باسترجاع وترتيب فعال في مساحات متجهات متفرقة.

+

يتكامل ميلفوس مع نموذج BM25 باستخدام فئة BM25EmbeddingFunction. تتعامل هذه الفئة مع حساب التضمينات وتعيدها بتنسيق متوافق مع Milvus للفهرسة والبحث. من الضروري لهذه العملية بناء محلل للتضمين الرمزي.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

لإنشاء مُحلل ترميز بسهولة، تقدم Milvus محللاً افتراضياً لا يتطلب سوى تحديد لغة النص.

+

مثال:

+
from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
+from pymilvus.model.sparse import BM25EmbeddingFunction
+
+# there are some built-in analyzers for several languages, now we use 'en' for English.
+analyzer = build_default_analyzer(language="en")
+
+corpus = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+# analyzer can tokenize the text into tokens
+tokens = analyzer(corpus[0])
+print("tokens:", tokens)
+
+

المعلمات:

+
    +
  • اللغة(سلسلة)

    +

    لغة النص المراد ترميزه. الخيارات الصالحة هي en (الإنجليزية)، de (الألمانية)، fr (الفرنسية)، ru (الروسية)، sp (الإسبانية)، it (الإيطالية)، pt (البرتغالية)، zh (الصينية)، jp (اليابانية)، kr (الكورية).

  • +
+

الناتج المتوقع مشابه لما يلي:

+
tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
+
+

تقوم خوارزمية BM25 بمعالجة النص عن طريق تقسيمه أولاً إلى رموز باستخدام محلل مدمج، كما هو موضح مع رموز اللغة الإنجليزية مثل "artifici" و "intellig" و "academ". ثم تقوم بجمع إحصائيات حول هذه الرموز، وتقييم تواترها وتوزيعها عبر المستندات. يقوم جوهر BM25 بحساب درجة أهمية كل رمز بناءً على أهميته، حيث تحصل الرموز النادرة على درجات أعلى. تتيح هذه العملية الموجزة ترتيبًا فعالاً للمستندات حسب أهميتها بالنسبة للاستعلام.

+

لجمع إحصائيات عن مجموعة المستندات، استخدم طريقة fit():

+
# Use the analyzer to instantiate the BM25EmbeddingFunction
+bm25_ef = BM25EmbeddingFunction(analyzer)
+
+# Fit the model on the corpus to get the statstics of the corpus
+bm25_ef.fit(corpus)
+
+

ثم استخدم تشفير_المستندات() لإنشاء تضمينات للمستندات:

+
docs = [
+    "The field of artificial intelligence was established as an academic subject in 1956.",
+    "Alan Turing was the pioneer in conducting significant research in artificial intelligence.",
+    "Originating in Maida Vale, London, Turing grew up in the southern regions of England.",
+    "In 1956, artificial intelligence emerged as a scholarly field.",
+    "Turing, originally from Maida Vale, London, was brought up in the south of England."
+]
+
+# Create embeddings for the documents
+docs_embeddings = bm25_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse dim:", bm25_ef.dim, list(docs_embeddings)[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings:   (0, 0)        1.0208816705336425
+  (0, 1)        1.0208816705336425
+  (0, 3)        1.0208816705336425
+...
+  (4, 16)        0.9606986899563318
+  (4, 17)        0.9606986899563318
+  (4, 20)        0.9606986899563318
+Sparse dim: 21 (1, 21)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = bm25_ef.encode_queries(queries)
+
+# Print embeddings
+print("Embeddings:", query_embeddings)
+# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse dim:", bm25_ef.dim, list(query_embeddings)[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings:   (0, 0)        0.5108256237659907
+  (0, 1)        0.5108256237659907
+  (0, 2)        0.5108256237659907
+  (1, 6)        0.5108256237659907
+  (1, 7)        0.11554389108992644
+  (1, 14)        0.5108256237659907
+Sparse dim: 21 (1, 21)
+
+

ملاحظات:

+

عند استخدام دالة التضمين BM25EmbeddingFunction، لاحظ أنه لا يمكن تبادل عمليات ترميز_الاستعلامات( ) وترميز المستندات() رياضيًا. لذلك، لا يتوفر bm25_ef(النصوص) المنفذة.

diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.json b/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.json new file mode 100644 index 000000000..53a187d61 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import CohereEmbeddingFunction\n\ncohere_ef = CohereEmbeddingFunction(\n model_name=\"embed-english-light-v3.0\",\n api_key=\"YOUR_COHERE_API_KEY\",\n input_type=\"search_document\",\n embedding_types=[\"float\"]\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = cohere_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", cohere_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 3.43322754e-02, 1.16252899e-03, -5.25207520e-02, 1.32846832e-03,\n -6.80541992e-02, 6.10961914e-02, -7.06176758e-02, 1.48925781e-01,\n 1.54174805e-01, 1.98516846e-02, 2.43835449e-02, 3.55224609e-02,\n 1.82952881e-02, 7.57446289e-02, -2.40783691e-02, 4.40063477e-02,\n...\n 0.06359863, -0.01971436, -0.02253723, 0.00354195, 0.00222015,\n 0.00184727, 0.03408813, -0.00777817, 0.04919434, 0.01519775,\n -0.02862549, 0.04760742, -0.07891846, 0.0124054 ], dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = cohere_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", cohere_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-1.33361816e-02, 9.79423523e-04, -7.28759766e-02, -1.93786621e-02,\n -9.71679688e-02, 4.34875488e-02, -9.81445312e-02, 1.16882324e-01,\n 5.89904785e-02, -4.19921875e-02, 4.95910645e-02, 5.83496094e-02,\n 3.47595215e-02, -5.87463379e-03, -7.30514526e-03, 2.92816162e-02,\n...\n 0.00749969, -0.01192474, 0.02719116, 0.03347778, 0.07696533,\n 0.01409149, 0.00964355, -0.01681519, -0.0073204 , 0.00043154,\n -0.04577637, 0.03591919, -0.02807617, -0.04812622], dtype=float32)]\nDim 384 (384,)\n"],"headingContent":"Cohere","anchorList":[{"label":"كوهير","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.md b/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.md new file mode 100644 index 000000000..145c0e69b --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-cohere.md @@ -0,0 +1,106 @@ +--- +id: embed-with-cohere.md +order: 9 +summary: >- + توضح هذه المقالة كيفية استخدام دالة التضمين CohereEmbeddingFunction لترميز + المستندات والاستعلامات باستخدام نموذج تضمين Cohere. +title: تضمين كوهير +--- +

كوهير

تُستخدم نماذج التضمين في Cohere لتوليد تضمينات النص، وهي قوائم من الأرقام ذات الفاصلة العائمة التي تلتقط المعلومات الدلالية حول النص. يمكن استخدام هذه التضمينات في مهام مثل تصنيف النصوص والبحث الدلالي.

+

يتكامل ميلفوس مع نماذج التضمين الخاصة ب Cohere باستخدام فئة CohereEmbeddingFunction. يتعامل هذا الفصل مع حساب التضمينات ويعيدها بتنسيق متوافق مع Milvus للفهرسة والبحث.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء CohereEmbeddingFunction:

+
from pymilvus.model.dense import CohereEmbeddingFunction
+
+cohere_ef = CohereEmbeddingFunction(
+    model_name="embed-english-light-v3.0",
+    api_key="YOUR_COHERE_API_KEY",
+    input_type="search_document",
+    embedding_types=["float"]
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج التضمين Cohere المراد استخدامه للترميز. يمكنك تحديد أي من أسماء نماذج تضمين Cohere المتاحة، على سبيل المثال، embed-english-v3.0 ، embed-multilingual-v3.0 ، إلخ. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام embed-english-light-v3.0. للاطلاع على قائمة النماذج المتاحة، راجع تضمين.

  • +
  • api_key (سلسلة)

    +

    مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات Cohere.

  • +
  • input_type (سلسلة)

    +

    نوع المدخلات التي تم تمريرها إلى النموذج. مطلوب لتضمين النماذج v3 والإصدارات الأحدث.

    +
      +
    • "search_document": يُستخدم للتضمينات المخزنة في قاعدة بيانات متجهة لحالات استخدام البحث.
    • +
    • "search_query": يُستخدم لتضمين استعلامات البحث التي يتم تشغيلها مقابل قاعدة بيانات متجهة للعثور على المستندات ذات الصلة.
    • +
    • "classification": تُستخدم للتضمينات التي يتم تمريرها من خلال مصنف نصي.
    • +
    • "clustering": يُستخدم للتضمينات التي يتم تشغيلها من خلال خوارزمية تجميع.
    • +
  • +
  • embedding_types (قائمة[ش])

    +

    نوع التضمينات التي تريد استرجاعها. غير مطلوب والافتراضي هو بلا، والذي يُرجع نوع استجابة تضمين العوامات. حاليًا، يمكنك تحديد قيمة واحدة فقط لهذه المعلمة. القيم الممكنة:

    +
      +
    • "float": استخدم هذا عندما تريد استعادة التضمينات العائمة الافتراضية. صالحة لجميع النماذج.
    • +
    • "binary": استخدم هذا عندما تريد استعادة التضمينات الثنائية الموقعة. صالح لنماذج v3 فقط.
    • +
    • "ubinary": استخدم هذا عندما تريد استرجاع تضمينات ثنائية غير موقعة. صالح لنماذج v3 فقط.
    • +
  • +
+

لإنشاء تضمينات للمستندات، استخدم الأسلوب encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = cohere_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", cohere_ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([ 3.43322754e-02,  1.16252899e-03, -5.25207520e-02,  1.32846832e-03,
+       -6.80541992e-02,  6.10961914e-02, -7.06176758e-02,  1.48925781e-01,
+        1.54174805e-01,  1.98516846e-02,  2.43835449e-02,  3.55224609e-02,
+        1.82952881e-02,  7.57446289e-02, -2.40783691e-02,  4.40063477e-02,
+...
+        0.06359863, -0.01971436, -0.02253723,  0.00354195,  0.00222015,
+        0.00184727,  0.03408813, -0.00777817,  0.04919434,  0.01519775,
+       -0.02862549,  0.04760742, -0.07891846,  0.0124054 ], dtype=float32)]
+Dim: 384 (384,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الطريقة encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = cohere_ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", cohere_ef.dim, query_embeddings[0].shape)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: [array([-1.33361816e-02,  9.79423523e-04, -7.28759766e-02, -1.93786621e-02,
+       -9.71679688e-02,  4.34875488e-02, -9.81445312e-02,  1.16882324e-01,
+        5.89904785e-02, -4.19921875e-02,  4.95910645e-02,  5.83496094e-02,
+        3.47595215e-02, -5.87463379e-03, -7.30514526e-03,  2.92816162e-02,
+...
+        0.00749969, -0.01192474,  0.02719116,  0.03347778,  0.07696533,
+        0.01409149,  0.00964355, -0.01681519, -0.0073204 ,  0.00043154,
+       -0.04577637,  0.03591919, -0.02807617, -0.04812622], dtype=float32)]
+Dim 384 (384,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.json b/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.json new file mode 100644 index 000000000..fcadfd469 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import InstructorEmbeddingFunction\n\nef = InstructorEmbeddingFunction(\n model_name=\"hkunlp/instructor-xl\", # Defaults to `hkunlp/instructor-xl`\n query_instruction=\"Represent the question for retrieval:\",\n doc_instruction=\"Represent the document for retrieval:\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,\n -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,\n -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,\n -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,\n ...\n -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,\n 6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],\n dtype=float32)]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,\n -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,\n -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,\n -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,\n ...\n 7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,\n 1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],\n dtype=float32)]\nDim 768 (768,)\n"],"headingContent":"Instructor","anchorList":[{"label":"المدرس","href":"Instructor","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.md b/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.md new file mode 100644 index 000000000..84b9f7f77 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-instructor.md @@ -0,0 +1,92 @@ +--- +id: embed-with-instructor.md +order: 10 +summary: >- + تشرح هذه المقالة كيفية استخدام دالة InstructorEmbeddingFunction لترميز + المستندات والاستعلامات باستخدام نموذج تضمين المدرس. +title: المدرس +--- +

المدرس

إنInstructor هو نموذج تضمين نصي مضبوط بالتعليمات يمكنه إنشاء تضمينات نصية مصممة خصيصًا لأي مهمة (مثل التصنيف، والاسترجاع، والتجميع، وتقييم النصوص، وما إلى ذلك) والمجالات (مثل العلوم، والتمويل، وما إلى ذلك) بمجرد توفير تعليمات المهمة، دون أي ضبط دقيق.

+

تتكامل Milvus مع نماذج التضمين الخاصة بـ Instructor's InstructorEmbeddingFunction عبر فئة InstructorEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج تضمين Instructor وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء دالة InstructorEmbeddingFunction:

+
from pymilvus.model.dense import InstructorEmbeddingFunction
+
+ef = InstructorEmbeddingFunction(
+    model_name="hkunlp/instructor-xl", # Defaults to `hkunlp/instructor-xl`
+    query_instruction="Represent the question for retrieval:",
+    doc_instruction="Represent the document for retrieval:"
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج تضمين Mistral AI المراد استخدامه للترميز. القيمة الافتراضية إلى hkunlp/instructor-xl. لمزيد من المعلومات، راجع قائمة النماذج.

  • +
  • query_instruction (سلسلة)

    +

    التعليمات الخاصة بالمهمة التي توجه النموذج حول كيفية إنشاء تضمين لاستعلام أو سؤال.

  • +
  • doc_instruction (سلسلة)

    +

    تعليمات خاصة بالمهمة توجه النموذج لإنشاء تضمين لمستند.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الطريقة encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", ef.dim, docs_embeddings[0].shape)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,
+       -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,
+       -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,
+       -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,
+       ...
+       -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,
+        6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],
+      dtype=float32)]
+Dim: 768 (768,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded",
+           "Where was Alan Turing born?"]
+
+query_embeddings = ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", ef.dim, query_embeddings[0].shape)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,
+       -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,
+       -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,
+       -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,
+       ...
+        7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,
+        1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],
+      dtype=float32)]
+Dim 768 (768,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-jina.json b/localization/v2.5.x/site/ar/embeddings/embed-with-jina.json new file mode 100644 index 000000000..11196d435 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINAAI_API_KEY, # Provide your Jina AI API key\n task=\"retrieval.passage\", # Specify the task\n dimensions=1024, # Defaults to 1024\n)\n","\n```python\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = jina_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", jina_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([9.80641991e-02, -8.51697400e-02, 7.36531913e-02, 1.42558888e-02,\n -2.23589484e-02, 1.68494112e-03, -3.50753777e-02, -3.11530549e-02,\n -3.26012149e-02, 5.04568312e-03, 3.69836427e-02, 3.48948985e-02,\n 8.19722563e-03, 5.88679723e-02, -6.71099266e-03, -1.82369724e-02,\n...\n 2.48654783e-02, 3.43279652e-02, -1.66154150e-02, -9.90478322e-03,\n -2.96043139e-03, -8.57473817e-03, -7.39028037e-04, 6.25024503e-03,\n -1.08831357e-02, -4.00776342e-02, 3.25369164e-02, -1.42691191e-03])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = jina_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", jina_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([8.79201014e-03, 1.47551354e-02, 4.02722731e-02, -2.52991207e-02,\n 1.12719582e-02, 3.75947170e-02, 3.97946090e-02, -7.36681819e-02,\n -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,\n 5.26071340e-02, 6.75181448e-02, 3.92445624e-02, -1.40817231e-02,\n...\n 8.81703943e-03, 4.24629413e-02, -2.32944116e-02, -2.05193572e-02,\n -3.22035812e-02, 2.81896023e-03, 3.85326855e-02, 3.64372656e-02,\n -1.65050142e-02, -4.26847413e-02, 2.02664156e-02, -1.72684863e-02])]\nDim 1024 (1024,)\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINA_API_KEY, # Provide your Jina AI API key\n task=\"text-matching\",\n dimensions=1024, # Defaults to 1024\n)\n\ntexts = [\n \"Follow the white rabbit.\", # English\n \"Sigue al conejo blanco.\", # Spanish\n \"Suis le lapin blanc.\", # French\n \"跟着白兔走。\", # Chinese\n \"اتبع الأرنب الأبيض.\", # Arabic\n \"Folge dem weißen Kaninchen.\", # German\n]\n\nembeddings = jina_ef(texts)\n\n# Compute similarities\nprint(embeddings[0] @ embeddings[1].T)\n"],"headingContent":"Jina AI","anchorList":[{"label":"جينا للذكاء الاصطناعي","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-jina.md b/localization/v2.5.x/site/ar/embeddings/embed-with-jina.md new file mode 100644 index 000000000..bd72df8d8 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-jina.md @@ -0,0 +1,130 @@ +--- +id: embed-with-jina.md +order: 8 +summary: >- + توضح هذه المقالة كيفية استخدام دالة JinaEmbeddingFunction لترميز المستندات + والاستعلامات باستخدام نموذج تضمين الذكاء الاصطناعي Jina AI. +title: جينا للذكاء الاصطناعي - تضمين +--- +

جينا للذكاء الاصطناعي

نماذج التضمين من جينا للذكاء الاصطناعي هي نماذج تضمين نصية عالية الأداء يمكنها ترجمة المدخلات النصية إلى تمثيلات رقمية، والتقاط دلالات النص. تتفوق هذه النماذج في تطبيقات مثل الاسترجاع الكثيف، والتشابه النصي الدلالي، والفهم متعدد اللغات.

+

يتكامل ميلفوس مع نماذج التضمين في جينا للذكاء الاصطناعي عبر فئة JinaEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج التضمين من Jina AI وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus. للاستفادة من هذه الوظيفة، احصل على مفتاح API من Jina AI.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء JinaEmbeddingFunction:

+
from pymilvus.model.dense import JinaEmbeddingFunction
+
+jina_ef = JinaEmbeddingFunction(
+    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
+    api_key=JINAAI_API_KEY, # Provide your Jina AI API key
+    task="retrieval.passage", # Specify the task
+    dimensions=1024, # Defaults to 1024
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج تضمين Jina AI المراد استخدامه للترميز. يمكنك تحديد أي من أسماء نماذج تضمين جينا للذكاء الاصطناعي المتاحة، على سبيل المثال، jina-embeddings-v3 ، jina-embeddings-v2-base-en ، إلخ. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام jina-embeddings-v3. للاطلاع على قائمة النماذج المتاحة، راجع تضمينات جينا.

  • +
  • api_key (سلسلة)

    +

    مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات Jina AI.

  • +
  • task (سلسلة)

    +

    نوع المدخلات التي تم تمريرها إلى النموذج. مطلوب لتضمين النماذج v3 والإصدارات الأحدث.

    +
      +
    • "retrieval.passage": يُستخدم لترميز المستندات الكبيرة في مهام الاسترجاع في وقت الفهرسة.
    • +
    • "retrieval.query": يستخدم لترميز استفسارات المستخدم أو الأسئلة في مهام الاسترجاع.
    • +
    • "classification": تستخدم لترميز النصوص لمهام تصنيف النصوص.
    • +
    • "text-matching": تستخدم لترميز النص لمطابقة التشابه، مثل قياس التشابه بين جملتين.
    • +
    • "clustering": يُستخدم لتجميع أو إعادة ترتيب المهام.
    • +
  • +
  • dimensions (int)

    +

    عدد الأبعاد التي يجب أن تحتويها مخرجات التضمينات الناتجة. الافتراضي إلى 1024. مدعوم فقط لنماذج التضمين v3 والإصدارات الأحدث.

  • +
  • late_chunking (bool)

    +

    تتحكم هذه المعلمة في ما إذا كان سيتم استخدام طريقة التقطيع الجديدة التي قدمتها جينا للذكاء الاصطناعي الشهر الماضي لترميز مجموعة من الجمل. الإعداد الافتراضي هو False. عند ضبطه على True ، ستقوم واجهة برمجة تطبيقات Jina AI API بتجميع كل الجمل في حقل الإدخال وتغذيتها كسلسلة واحدة للنموذج. داخليًا، يقوم النموذج بتضمين هذه السلسلة الطويلة المتسلسلة ثم يقوم بإجراء التقطيع المتأخر، ويعيد قائمة من التضمينات التي تطابق حجم قائمة الإدخال.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الطريقة encode_documents(). هذه الطريقة مصممة لتضمين المستندات في مهام الاسترجاع غير المتماثلة، مثل فهرسة المستندات لمهام البحث أو التوصية. تستخدم هذه الطريقة retrieval.passage كمهمة.

+

+```python
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = jina_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", jina_ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([9.80641991e-02, -8.51697400e-02,  7.36531913e-02,  1.42558888e-02,
+       -2.23589484e-02,  1.68494112e-03, -3.50753777e-02, -3.11530549e-02,
+       -3.26012149e-02,  5.04568312e-03,  3.69836427e-02,  3.48948985e-02,
+        8.19722563e-03,  5.88679723e-02, -6.71099266e-03, -1.82369724e-02,
+...
+        2.48654783e-02,  3.43279652e-02, -1.66154150e-02, -9.90478322e-03,
+       -2.96043139e-03, -8.57473817e-03, -7.39028037e-04,  6.25024503e-03,
+       -1.08831357e-02, -4.00776342e-02,  3.25369164e-02, -1.42691191e-03])]
+Dim: 1024 (1024,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الطريقة encode_queries(). تم تصميم هذه الطريقة لتضمينات الاستعلام في مهام الاسترجاع غير المتماثلة، مثل استعلامات البحث أو الأسئلة. تستخدم هذه الطريقة retrieval.query كمهمة.

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = jina_ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", jina_ef.dim, query_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([8.79201014e-03,  1.47551354e-02,  4.02722731e-02, -2.52991207e-02,
+        1.12719582e-02,  3.75947170e-02,  3.97946090e-02, -7.36681819e-02,
+       -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,
+        5.26071340e-02,  6.75181448e-02,  3.92445624e-02, -1.40817231e-02,
+...
+        8.81703943e-03,  4.24629413e-02, -2.32944116e-02, -2.05193572e-02,
+       -3.22035812e-02,  2.81896023e-03,  3.85326855e-02,  3.64372656e-02,
+       -1.65050142e-02, -4.26847413e-02,  2.02664156e-02, -1.72684863e-02])]
+Dim 1024 (1024,)
+
+

لإنشاء عمليات تضمين المدخلات لمطابقة التشابه (مثل مهام الاسترجاع المتماثل أو مهام الاسترجاع المتماثل)، أو تصنيف النصوص، أو التجميع، أو مهام إعادة الترتيب، استخدم قيمة المعلمة المناسبة task عند إنشاء الفئة JinaEmbeddingFunction.

+
from pymilvus.model.dense import JinaEmbeddingFunction
+
+jina_ef = JinaEmbeddingFunction(
+    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
+    api_key=JINA_API_KEY, # Provide your Jina AI API key
+    task="text-matching",
+    dimensions=1024, # Defaults to 1024
+)
+
+texts = [
+    "Follow the white rabbit.",  # English
+    "Sigue al conejo blanco.",  # Spanish
+    "Suis le lapin blanc.",  # French
+    "跟着白兔走。",  # Chinese
+    "اتبع الأرنب الأبيض.",  # Arabic
+    "Folge dem weißen Kaninchen.",  # German
+]
+
+embeddings = jina_ef(texts)
+
+# Compute similarities
+print(embeddings[0] @ embeddings[1].T)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.json b/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.json new file mode 100644 index 000000000..c951e2997 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import MGTEEmbeddingFunction\n\nef = MGTEEmbeddingFunction(\n model_name=\"Alibaba-NLP/gte-multilingual-base\", # Defaults to `Alibaba-NLP/gte-multilingual-base`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of embeddings\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,\n 1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,\n 2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,\n 6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,\n ...\n 2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,\n 6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,\n 1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,\n -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,\n 8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,\n ...\n 3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,\n 7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n"],"headingContent":"mGTE","anchorList":[{"label":"mGTE","href":"mGTE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.md b/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.md new file mode 100644 index 000000000..902abf81e --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-mgte.md @@ -0,0 +1,90 @@ +--- +id: embed-with-mgte.md +order: 13 +summary: >- + توضح هذه المقالة كيفية استخدام دالة التضمين MGTEEmbeddingFunction لترميز + المستندات والاستعلامات باستخدام نموذج تضمين mGTE. +title: mGTE +--- +

mGTE

mGTE هو نموذج تمثيل نصي متعدد اللغات ونموذج إعادة ترتيب لمهام استرجاع النصوص.

+

يتكامل Milvus مع نموذج التضمين mGTE عبر فئة MGTEEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نموذج التضمين mGTE وإرجاع التضمينات كمتجهات كثيفة ومتناثرة متوافقة مع فهرسة Milvus.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء الدالة MGTEEmbeddingFunction:

+
from pymilvus.model.hybrid import MGTEEmbeddingFunction
+
+ef = MGTEEmbeddingFunction(
+    model_name="Alibaba-NLP/gte-multilingual-base", # Defaults to `Alibaba-NLP/gte-multilingual-base`
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج تضمين mGTE المراد استخدامه للترميز. القيمة الافتراضية إلى Alibaba-NLP/gte-multilingual-base.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الأسلوب encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension of embeddings
+print(ef.dim)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,
+        1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,
+        2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,
+        6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,
+        ...
+        2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,
+        6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], 
+ 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
+ with 41 stored elements and shape (3, 250002)>}
+
+{'dense': 768, 'sparse': 250002}
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded",
+           "Where was Alan Turing born?"]
+
+query_embeddings = ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print(ef.dim)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,
+        1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,
+       -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,
+        8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,
+        ...
+        3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,
+        7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], 
+ 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
+ with 13 stored elements and shape (2, 250002)>}
+
+{'dense': 768, 'sparse': 250002}
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.json b/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.json new file mode 100644 index 000000000..290e1b385 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import MistralAIEmbeddingFunction\n\nef = MistralAIEmbeddingFunction(\n model_name=\"mistral-embed\", # Defaults to `mistral-embed`\n api_key=\"MISTRAL_API_KEY\" # Provide your Mistral AI API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,\n 0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,\n 0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,\n 0.03634644, -0.01802063])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,\n 0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,\n 0.03582764, 0.00366592])]\nDim 1024 (1024,)\n"],"headingContent":"Mistral AI","anchorList":[{"label":"ميسترال للذكاء الاصطناعي","href":"Mistral-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.md b/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.md new file mode 100644 index 000000000..1500ed12e --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-mistral-ai.md @@ -0,0 +1,80 @@ +--- +id: embed-with-mistral-ai.md +order: 11 +summary: >- + توضح هذه المقالة كيفية استخدام دالة التضمين MistralAIEmbeddingFunction لترميز + المستندات والاستعلامات باستخدام نموذج تضمين الذكاء الاصطناعي Mistral AI. +title: ميسترال للذكاء الاصطناعي +--- +

ميسترال للذكاء الاصطناعي

نماذج التضمين منميسترال للذكاء الاصطناعي هي نماذج تضمين نصية مصممة لتحويل المدخلات النصية إلى متجهات رقمية كثيفة، مما يؤدي إلى التقاط المعنى الأساسي للنص بشكل فعال. وقد تم تحسين هذه النماذج بدرجة كبيرة لمهام مثل البحث الدلالي وفهم اللغة الطبيعية والتطبيقات المدركة للسياق، مما يجعلها مناسبة لمجموعة واسعة من الحلول التي تعمل بالذكاء الاصطناعي.

+

تتكامل Milvus مع نماذج التضمين الخاصة ب Mistral AI عبر فئة MistralAIEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج تضمين Mistral AI وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus. للاستفادة من هذه الوظيفة، احصل على مفتاح API من Mistral AI.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء وظيفة MistralAIEmbeddingFunction:

+
from pymilvus.model.dense import MistralAIEmbeddingFunction
+
+ef = MistralAIEmbeddingFunction(
+    model_name="mistral-embed", # Defaults to `mistral-embed`
+    api_key="MISTRAL_API_KEY" # Provide your Mistral AI API key
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج تضمين Mistral AI المراد استخدامه للترميز. القيمة الافتراضية إلى mistral-embed. لمزيد من المعلومات، راجع تضمينات.

  • +
  • api_key (سلسلة)

    +

    مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات Mistral AI.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الأسلوب encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,
+       0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,
+       0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,
+       0.03634644, -0.01802063])]
+Dim: 1024 (1024,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded",
+           "Where was Alan Turing born?"]
+
+query_embeddings = ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", ef.dim, query_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,
+       0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,
+       0.03582764, 0.00366592])]
+Dim 1024 (1024,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.json b/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.json new file mode 100644 index 000000000..cc09bcb43 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","# Before accessing the Nomic Atlas API, configure your Nomic API token\nimport nomic\nnomic.login('YOUR_NOMIC_API_KEY')\n\n# Import Nomic embedding function\nfrom pymilvus.model.dense import NomicEmbeddingFunction\n\nef = NomicEmbeddingFunction(\n model_name=\"nomic-embed-text-v1.5\", # Defaults to `mistral-embed`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,\n 6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,\n 3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,\n ...\n -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,\n -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,\n -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,\n 7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,\n -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,\n ...\n 7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,\n -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,\n -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]\nDim 768 (768,)\n"],"headingContent":"Nomic","anchorList":[{"label":"Nomic","href":"Nomic","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.md b/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.md new file mode 100644 index 000000000..88564c610 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-nomic.md @@ -0,0 +1,89 @@ +--- +id: embed-with-nomic.md +order: 12 +summary: >- + توضح هذه المقالة كيفية استخدام دالة NomicEmbeddingFunction لترميز المستندات + والاستعلامات باستخدام نموذج التضمين النومي. +title: Nomic +--- +

Nomic

نماذجNomic هي سلسلة من حلول تضمين النصوص والصور المتقدمة التي طورتها Nomic AI، وهي مصممة لتحويل أشكال مختلفة من البيانات إلى متجهات رقمية كثيفة تلتقط معانيها الدلالية.

+

يتكامل ميلفوس مع نماذج التضمين الخاصة بنوميك من خلال فئة NomicEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج التضمين Nomic وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus. للاستفادة من هذه الوظيفة، احصل على مفتاح API من Nomic Atlas.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء وظيفة NomicEmbeddingFunction:

+
# Before accessing the Nomic Atlas API, configure your Nomic API token
+import nomic
+nomic.login('YOUR_NOMIC_API_KEY')
+
+# Import Nomic embedding function
+from pymilvus.model.dense import NomicEmbeddingFunction
+
+ef = NomicEmbeddingFunction(
+    model_name="nomic-embed-text-v1.5", # Defaults to `mistral-embed`
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة)

    +

    اسم نموذج التضمين Nomic المراد استخدامه للترميز. القيمة الافتراضية إلى nomic-embed-text-v1.5. لمزيد من المعلومات، راجع الوثائق الرسمية لـ Nomic.

  • +
+

لإنشاء تضمينات للمستندات، استخدم الأسلوب encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,
+        6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,
+        3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,
+        ...
+       -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,
+       -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,
+       -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]
+Dim: 768 (768,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الطريقة encode_queries():

+
queries = ["When was artificial intelligence founded",
+           "Where was Alan Turing born?"]
+
+query_embeddings = ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", ef.dim, query_embeddings[0].shape)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,
+        7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,
+       -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,
+        ...
+        7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,
+       -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,
+       -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]
+Dim 768 (768,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-openai.json b/localization/v2.5.x/site/ar/embeddings/embed-with-openai.json new file mode 100644 index 000000000..abcf3721e --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nopenai_ef = model.dense.OpenAIEmbeddingFunction(\n model_name='text-embedding-3-large', # Specify the model name\n api_key='YOUR_API_KEY', # Provide your OpenAI API key\n dimensions=512 # Set the embedding dimensionality\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = openai_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", openai_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,\n 4.23139781e-02, -6.64533582e-03, 4.21088142e-03, 1.04644023e-01,\n 5.10009527e-02, 5.32827862e-02, -3.26061808e-02, -3.66494283e-02,\n...\n -8.93232748e-02, 6.68255147e-03, 3.55093405e-02, -5.09071983e-02,\n 3.74144339e-03, 4.72541340e-02, 2.11916920e-02, 1.00753829e-02,\n -5.76633997e-02, 9.68257990e-03, 4.62721288e-02, -4.33261096e-02])]\nDim: 512 (512,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = openai_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim\", openai_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033, 0.01635982,\n -0.03169853, -0.0033602 , 0.09047844, 0.00030747, 0.11853652,\n -0.02870182, -0.01526102, 0.05505067, 0.00993909, -0.07165466,\n...\n -9.78106782e-02, -2.22669560e-02, 1.21873049e-02, -4.83198799e-02,\n 5.32377362e-02, -1.90469325e-02, 5.62430918e-02, 1.02650477e-02,\n -6.21757433e-02, 7.88027793e-02, 4.91846527e-04, -1.51633881e-02])]\nDim 512 (512,)\n"],"headingContent":"OpenAI","anchorList":[{"label":"OpenAI","href":"OpenAI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-openai.md b/localization/v2.5.x/site/ar/embeddings/embed-with-openai.md new file mode 100644 index 000000000..af056e377 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-openai.md @@ -0,0 +1,89 @@ +--- +id: embed-with-openai.md +order: 2 +summary: يتكامل Milvus مع نماذج OpenAI عبر فئة OpenAIEmbeddingFunction. +title: OpenAI +--- +

OpenAI

يتكامل ميلفوس مع نماذج OpenAI عبر فئة OpenAIEmbeddingFunction. توفّر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج OpenAI المُدرّبة مسبقًا وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus. للاستفادة من هذه الوظيفة، احصل على مفتاح API من OpenAI من خلال إنشاء حساب على منصتهم.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء OpenAIEmbeddingFunction:

+
from pymilvus import model
+
+openai_ef = model.dense.OpenAIEmbeddingFunction(
+    model_name='text-embedding-3-large', # Specify the model name
+    api_key='YOUR_API_KEY', # Provide your OpenAI API key
+    dimensions=512 # Set the embedding dimensionality
+)
+
+

المعلمات:

+
    +
  • اسم_النموذج(سلسلة)

    +

    اسم نموذج OpenAI المراد استخدامه للترميز. الخيارات الصالحة هي text-تضمين النص-3-small، و text-تضمين النص-3-large، و text-تضمين النص-AD-002 (افتراضي).

  • +
  • مفتاح_API(سلسلة)

    +

    مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات OpenAI.

  • +
  • الأبعاد(int)

    +

    عدد الأبعاد التي يجب أن تحتوي عليها التضمينات الناتجة. مدعوم فقط في تضمين النص-3 والنماذج الأحدث.

  • +
+

لإنشاء تضمينات للمستندات، استخدم طريقة تشفير_المستندات():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = openai_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", openai_ef.dim, docs_embeddings[0].shape)
+
+

يكون الناتج المتوقع مشابهًا لما يلي:

+
Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,
+        4.23139781e-02, -6.64533582e-03,  4.21088142e-03,  1.04644023e-01,
+        5.10009527e-02,  5.32827862e-02, -3.26061808e-02, -3.66494283e-02,
+...
+       -8.93232748e-02,  6.68255147e-03,  3.55093405e-02, -5.09071983e-02,
+        3.74144339e-03,  4.72541340e-02,  2.11916920e-02,  1.00753829e-02,
+       -5.76633997e-02,  9.68257990e-03,  4.62721288e-02, -4.33261096e-02])]
+Dim: 512 (512,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = openai_ef.encode_queries(queries)
+
+# Print embeddings
+print("Embeddings:", query_embeddings)
+# Print dimension and shape of embeddings
+print("Dim", openai_ef.dim, query_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033,  0.01635982,
+       -0.03169853, -0.0033602 ,  0.09047844,  0.00030747,  0.11853652,
+       -0.02870182, -0.01526102,  0.05505067,  0.00993909, -0.07165466,
+...
+       -9.78106782e-02, -2.22669560e-02,  1.21873049e-02, -4.83198799e-02,
+        5.32377362e-02, -1.90469325e-02,  5.62430918e-02,  1.02650477e-02,
+       -6.21757433e-02,  7.88027793e-02,  4.91846527e-04, -1.51633881e-02])]
+Dim 512 (512,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.json b/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.json new file mode 100644 index 000000000..397503ff6 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(\n model_name='all-MiniLM-L6-v2', # Specify the model name\n device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = sentence_transformer_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = sentence_transformer_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-2.52114702e-02, -5.29330298e-02, 1.14570223e-02, 1.95571519e-02,\n -2.46500354e-02, -2.66519729e-02, -8.48201662e-03, 2.82961670e-02,\n -3.65092754e-02, 7.50745758e-02, 4.28900979e-02, 7.18822703e-02,\n...\n -6.76431581e-02, -6.45996556e-02, -4.67132553e-02, 4.78532910e-02,\n -2.31596199e-03, 4.13446948e-02, 1.06935494e-01, -1.08258888e-01],\n dtype=float32)]\nDim: 384 (384,)\n"],"headingContent":"Sentence Transformers","anchorList":[{"label":"محولات الجمل","href":"Sentence-Transformers","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.md b/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.md new file mode 100644 index 000000000..e92c77747 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-sentence-transform.md @@ -0,0 +1,88 @@ +--- +id: embed-with-sentence-transform.md +order: 3 +summary: >- + توضح هذه المقالة كيفية استخدام محولات الجمل في ميلفوس لترميز المستندات + والاستعلامات إلى متجهات كثيفة. +title: محولات الجمل +--- +

محولات الجمل

يتكامل ميلفوس مع نماذج محولات الجمل المدربة مسبقًا عبر فئة SentenceTransformerEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج محولات الجمل المدربة مسبقًا وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

بعد ذلك، قم بإنشاء دالة SentenceTransformerEmbeddingFunction:

+
from pymilvus import model
+
+sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
+    model_name='all-MiniLM-L6-v2', # Specify the model name
+    device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'
+)
+
+

المعلمات:

+
    +
  • اسم_النموذج(سلسلة)

    +

    اسم نموذج محول الجملة المراد استخدامه للترميز. يتم تعيين القيمة افتراضيًا إلى All-MiniLM-L6-v2. يمكنك استخدام أي من نماذج محولات الجملة المدربة مسبقًا. للاطلاع على قائمة النماذج المتاحة، راجع النماذج المدربة مسبقًا.

  • +
  • الجهاز(سلسلة)

    +

    الجهاز المراد استخدامه، مع cpu لوحدة المعالجة المركزية و cuda:n لجهاز وحدة معالجة الرسومات رقم n.

  • +
+

لإنشاء تضمينات للمستندات، استخدم طريقة encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = sentence_transformer_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", sentence_transformer_ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
+       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
+        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
+...
+       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
+       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
+      dtype=float32)]
+Dim: 384 (384,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = sentence_transformer_ef.encode_queries(queries)
+
+# Print embeddings
+print("Embeddings:", query_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", sentence_transformer_ef.dim, query_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([-2.52114702e-02, -5.29330298e-02,  1.14570223e-02,  1.95571519e-02,
+       -2.46500354e-02, -2.66519729e-02, -8.48201662e-03,  2.82961670e-02,
+       -3.65092754e-02,  7.50745758e-02,  4.28900979e-02,  7.18822703e-02,
+...
+       -6.76431581e-02, -6.45996556e-02, -4.67132553e-02,  4.78532910e-02,
+       -2.31596199e-03,  4.13446948e-02,  1.06935494e-01, -1.08258888e-01],
+      dtype=float32)]
+Dim: 384 (384,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-splade.json b/localization/v2.5.x/site/ar/embeddings/embed-with-splade.json new file mode 100644 index 000000000..06db0bdf6 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-splade.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsplade_ef = model.sparse.SpladeEmbeddingFunction(\n model_name=\"naver/splade-cocondenser-selfdistil\", \n device=\"cpu\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = splade_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6392706036567688\n (0, 2034) 0.024093208834528923\n (0, 2082) 0.3230178654193878\n...\n (2, 23602) 0.5671860575675964\n (2, 26757) 0.5770265460014343\n (2, 28639) 3.1990697383880615\nSparse dim: 30522 (1, 30522)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = splade_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6353746056556702\n (0, 2194) 0.015553371049463749\n (0, 2301) 0.2756537199020386\n...\n (1, 18522) 0.1282549500465393\n (1, 23602) 0.13133203983306885\n (1, 28639) 2.8150033950805664\nSparse dim: 30522 (1, 30522)\n"],"headingContent":"SPLADE","anchorList":[{"label":"SPLADE","href":"SPLADE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-splade.md b/localization/v2.5.x/site/ar/embeddings/embed-with-splade.md new file mode 100644 index 000000000..4a2a9514c --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-splade.md @@ -0,0 +1,89 @@ +--- +id: embed-with-splade.md +order: 6 +summary: >- + توضح هذه المقالة كيفية استخدام SpladeEmbeddingFunction لترميز المستندات + والاستعلامات باستخدام نموذج SPLADE. +title: SPLADE +--- +

SPLADE

تضمينSPLADE هو نموذج يوفر تمثيلات متناثرة للغاية للمستندات والاستعلامات، ويرث الخصائص المرغوبة من نماذج كيس الكلمات (BOW) مثل المطابقة الدقيقة للمصطلحات والكفاءة.

+

يتكامل ميلفوس مع نموذج SPLADE عبر فئة SpladeEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات وإرجاع التضمينات كمتجهات متفرقة متوافقة مع فهرسة Milvus.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

لتهيئة SpladeEmbeddingFunction، استخدم الأمر:

+
from pymilvus import model
+
+splade_ef = model.sparse.SpladeEmbeddingFunction(
+    model_name="naver/splade-cocondenser-selfdistil", 
+    device="cpu"
+)
+
+

المعلمات:

+
    +
  • اسم_النموذج(سلسلة)

    +

    اسم نموذج SPLADE المراد استخدامه للترميز. الخيارات الصالحة هي naver/splade-coplade-المكثف-المكثف-المجمع (افتراضي)، و naver/splade_v2_max، و naver/splade_v2_distil، و naver/splade_v2_distil، و naver/splade_v2_selfdistil. لمزيد من المعلومات، راجع اللعب بالنماذج.

  • +
  • الجهاز(سلسلة)

    +

    الجهاز المراد استخدامه، مع cpu لوحدة المعالجة المركزية و cuda:n لجهاز وحدة معالجة الرسومات رقم n.

  • +
+

لإنشاء تضمينات للمستندات، استخدم طريقة encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = splade_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse dim:", splade_ef.dim, list(docs_embeddings)[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings:   (0, 2001) 0.6392706036567688
+  (0, 2034) 0.024093208834528923
+  (0, 2082) 0.3230178654193878
+...
+  (2, 23602)    0.5671860575675964
+  (2, 26757)    0.5770265460014343
+  (2, 28639)    3.1990697383880615
+Sparse dim: 30522 (1, 30522)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = splade_ef.encode_queries(queries)
+
+# Print embeddings
+print("Embeddings:", query_embeddings)
+# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
+print("Sparse dim:", splade_ef.dim, list(query_embeddings)[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings:   (0, 2001)        0.6353746056556702
+  (0, 2194)        0.015553371049463749
+  (0, 2301)        0.2756537199020386
+...
+  (1, 18522)        0.1282549500465393
+  (1, 23602)        0.13133203983306885
+  (1, 28639)        2.8150033950805664
+Sparse dim: 30522 (1, 30522)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.json b/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.json new file mode 100644 index 000000000..2184bccd4 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import VoyageEmbeddingFunction\n\nvoyage_ef = VoyageEmbeddingFunction(\n model_name=\"voyage-3\", # Defaults to `voyage-3`\n api_key=VOYAGE_API_KEY # Provide your Voyage API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = voyage_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", voyage_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,\n 0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,\n 0.03349845, 0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,\n 0.07658645, 0.03064499])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = voyage_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", voyage_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,\n 0.04493361, 0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,\n 0.05706626, 0.0263358 ])]\nDim 1024 (1024,)\n"],"headingContent":"Voyage","anchorList":[{"label":"فوياج","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.md b/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.md new file mode 100644 index 000000000..3c9dbd39b --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embed-with-voyage.md @@ -0,0 +1,77 @@ +--- +id: embed-with-voyage.md +order: 7 +summary: >- + توضح هذه المقالة كيفية استخدام VoyageEmbeddingFunction لترميز المستندات + والاستعلامات باستخدام نموذج Voyage. +title: تضمين الرحلة +--- +

فوياج

تتكامل Milvus مع نماذج Voyage عبر فئة VoyageEmbeddingFunction. توفر هذه الفئة طرقًا لترميز المستندات والاستعلامات باستخدام نماذج Voyage وإرجاع التضمينات كمتجهات كثيفة متوافقة مع فهرسة Milvus. للاستفادة من هذه الوظيفة، احصل على مفتاح API من Voyage من خلال إنشاء حساب على منصتهم.

+

لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

+
pip install --upgrade pymilvus
+pip install "pymilvus[model]"
+
+

ثم، قم بإنشاء VoyageEmbeddingFunction:

+
from pymilvus.model.dense import VoyageEmbeddingFunction
+
+voyage_ef = VoyageEmbeddingFunction(
+    model_name="voyage-3", # Defaults to `voyage-3`
+    api_key=VOYAGE_API_KEY # Provide your Voyage API key
+)
+
+

المعلمات:

+
    +
  • model_name (سلسلة) اسم نموذج Voyage المراد استخدامه للترميز. يمكنك تحديد أي من أسماء نماذج Voyage المتاحة، على سبيل المثال، voyage-3-lite ، voyage-finance-2 ، إلخ. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام voyage-3. للحصول على قائمة النماذج المتاحة، راجع وثائق Voyage الرسمية.
  • +
  • api_key (سلسلة) مفتاح API للوصول إلى واجهة برمجة التطبيقات Voyage API. للحصول على معلومات حول كيفية إنشاء مفتاح واجهة برمجة التطبيقات، راجع مفتاح واجهة برمجة التطبيقات وعميل بايثون.
  • +
+

لإنشاء تضمينات للمستندات، استخدم الطريقة encode_documents():

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+docs_embeddings = voyage_ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", docs_embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", voyage_ef.dim, docs_embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,
+        0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,
+        0.03349845,  0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,
+        0.07658645,  0.03064499])]
+Dim: 1024 (1024,)
+
+

لإنشاء تضمينات للاستعلامات، استخدم الأسلوب encode_queries():

+
queries = ["When was artificial intelligence founded", 
+           "Where was Alan Turing born?"]
+
+query_embeddings = voyage_ef.encode_queries(queries)
+
+print("Embeddings:", query_embeddings)
+print("Dim", voyage_ef.dim, query_embeddings[0].shape)
+
+

المخرجات المتوقعة مشابهة لما يلي:

+
Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,
+        0.04493361,  0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,
+        0.05706626,  0.0263358 ])]
+Dim 1024 (1024,)
+
diff --git a/localization/v2.5.x/site/ar/embeddings/embeddings.json b/localization/v2.5.x/site/ar/embeddings/embeddings.json new file mode 100644 index 000000000..eb7af8006 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embeddings.json @@ -0,0 +1 @@ +{"codeList":["pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# This will download \"all-MiniLM-L6-v2\", a light weight model.\nef = model.DefaultEmbeddingFunction()\n\n# Data from which embeddings are to be generated \ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nembeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import (\n utility,\n FieldSchema, CollectionSchema, DataType,\n Collection, AnnSearchRequest, RRFRanker, connections,\n)\n","# 1. prepare a small corpus to search\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\nquery = \"Who started AI research?\"\n\n# BGE-M3 model can embed texts as dense and sparse vectors.\n# It is included in the optional `model` module in pymilvus, to install it,\n# simply run \"pip install pymilvus[model]\".\n\nbge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\n\ndocs_embeddings = bge_m3_ef(docs)\nquery_embeddings = bge_m3_ef([query])\n"],"headingContent":"Embedding Overview","anchorList":[{"label":"نظرة عامة على التضمين","href":"Embedding-Overview","type":1,"isActive":false},{"label":"مثال 1: استخدام دالة التضمين الافتراضية لتوليد متجهات كثيفة","href":"Example-1-Use-default-embedding-function-to-generate-dense-vectors","type":2,"isActive":false},{"label":"مثال 2: توليد متجهات كثيفة ومتناثرة في مكالمة واحدة باستخدام نموذج BGE M3","href":"Example-2-Generate-dense-and-sparse-vectors-in-one-call-with-BGE-M3-model","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/embeddings/embeddings.md b/localization/v2.5.x/site/ar/embeddings/embeddings.md new file mode 100644 index 000000000..ce61c4150 --- /dev/null +++ b/localization/v2.5.x/site/ar/embeddings/embeddings.md @@ -0,0 +1,143 @@ +--- +id: embeddings.md +order: 1 +summary: تعرف على كيفية إنشاء تضمينات لبياناتك. +title: نظرة عامة على التضمين +--- +

نظرة عامة على التضمين

التضمين هو مفهوم للتعلم الآلي لتعيين البيانات في فضاء عالي الأبعاد، حيث يتم وضع البيانات ذات الدلالات المتشابهة بالقرب من بعضها البعض. وعادةً ما تكون شبكة عصبية عميقة من BERT أو غيرها من عائلات المحولات، يمكن لنموذج التضمين أن يمثل دلالات النصوص والصور وأنواع البيانات الأخرى بشكل فعال بسلسلة من الأرقام المعروفة باسم المتجهات. الميزة الرئيسية لهذه النماذج هي أن المسافة الرياضية بين المتجهات في الفضاء عالي الأبعاد يمكن أن تشير إلى تشابه دلالات النصوص أو الصور الأصلية. وتفتح هذه الخاصية العديد من تطبيقات استرجاع المعلومات، مثل محركات البحث على الويب مثل Google وBing، والبحث عن المنتجات والتوصيات على مواقع التجارة الإلكترونية، ونموذج التوليد المعزز للاسترجاع (RAG) الذي شاع مؤخرًا في الذكاء الاصطناعي التوليدي.

+

هناك فئتان رئيسيتان من التضمينات، تنتج كل منهما نوعًا مختلفًا من المتجهات:

+
    +
  • التضمين الكثيف: تمثل معظم نماذج التضمين المعلومات كمتجه ذي نقطة عائمة من مئات إلى آلاف الأبعاد. ويسمى الناتج متجهات "كثيفة" لأن معظم الأبعاد لها قيم غير صفرية. على سبيل المثال، يُخرج نموذج التضمين مفتوح المصدر الشهير BAAI/bge-base-en-v1.5 متجهات مكونة من 768 رقم فاصلة عائمة (متجه عائم ذو 768 بُعدًا).

  • +
  • التضمين المتناثر: في المقابل، تحتوي متجهات مخرجات التضمينات المتفرقة على معظم أبعادها صفر، أي المتجهات "المتفرقة". هذه المتجهات غالبًا ما يكون لها أبعاد أعلى بكثير (عشرات الآلاف أو أكثر) والتي يتم تحديدها حسب حجم المفردات الرمزية. يمكن توليد المتجهات المتفرقة بواسطة الشبكات العصبية العميقة أو التحليل الإحصائي للنصوص. ونظرًا لقابليتها للتفسير وقدرات التعميم الأفضل خارج النطاق، يتم اعتماد التضمينات المتفرقة بشكل متزايد من قبل المطورين كمكمل للتضمينات الكثيفة.

  • +
+

Milvus هي قاعدة بيانات متجهة مصممة لإدارة البيانات المتجهة وتخزينها واسترجاعها. من خلال دمج نماذج التضمين وإعادة التصنيف السائدة، يمكنك بسهولة تحويل النص الأصلي إلى متجهات قابلة للبحث أو إعادة تصنيف النتائج باستخدام نماذج قوية لتحقيق نتائج أكثر دقة لـ RAG. يعمل هذا التكامل على تبسيط عملية تحويل النص وإلغاء الحاجة إلى مكونات تضمين أو إعادة ترتيب إضافية، وبالتالي تبسيط عملية تطوير RAG والتحقق من صحة النتائج.

+

لإنشاء تضمينات أثناء العمل، راجع استخدام نموذج PyMilvus لتوليد تضمينات نصية.

+ + + + + + + + + + + + + + + + + +
وظيفة التضمينالنوعواجهة برمجة التطبيقات أو مفتوحة المصدر
Openaiكثيفةواجهة برمجة التطبيقات
محول الجملةكثيفمفتوح المصدر
سبليدمتناثرمفتوح المصدر
بجي-م3هجينمفتوح المصدر
فوياجايكثيفواجهة برمجة التطبيقات
جيناكثيفةواجهة برمجة التطبيقات
التماسككثيفواجهة برمجة التطبيقات
مدربكثيفمفتوح المصدر
ميسترال للذكاء الاصطناعيكثيفواجهة برمجة التطبيقات
نوميكسكثيفواجهة برمجة التطبيقات
mGTEهجينمفتوح المصدر
+

مثال 1: استخدام دالة التضمين الافتراضية لتوليد متجهات كثيفة

لاستخدام دالات التضمين مع Milvus، قم أولاً بتثبيت مكتبة عميل PyMilvus مع الحزمة الفرعية model التي تغلف جميع الأدوات المساعدة لتوليد التضمين.

+
pip install "pymilvus[model]"
+
+

تدعم الحزمة الفرعية model نماذج التضمين المختلفة، من OpenAI، ومحولات الجملة، و BGE M3، إلى نماذج SPLADE المدربة مسبقًا. وللتبسيط، يستخدم هذا المثال DefaultEmbeddingFunction وهو نموذج محولات الجمل من طراز MiniLM-L6-v2 بالكامل، ويبلغ حجم النموذج حوالي 70 ميغابايت وسيتم تنزيله أثناء الاستخدام الأول:

+
from pymilvus import model
+
+# This will download "all-MiniLM-L6-v2", a light weight model.
+ef = model.DefaultEmbeddingFunction()
+
+# Data from which embeddings are to be generated 
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+embeddings = ef.encode_documents(docs)
+
+# Print embeddings
+print("Embeddings:", embeddings)
+# Print dimension and shape of embeddings
+print("Dim:", ef.dim, embeddings[0].shape)
+
+

الناتج المتوقع مشابه لما يلي:

+
Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
+       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
+        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
+...
+       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
+       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
+      dtype=float32)]
+Dim: 384 (384,)
+
+

مثال 2: توليد متجهات كثيفة ومتناثرة في مكالمة واحدة باستخدام نموذج BGE M3

في هذا المثال، نستخدم في هذا المثال نموذج BGE M3 الهجين لتضمين النص في كل من المتجهات الكثيفة والمتناثرة واستخدامها لاسترداد المستندات ذات الصلة. الخطوات الإجمالية هي كما يلي:

+
    +
  1. تضمين النص كمتجهات كثيفة ومتناثرة باستخدام نموذج BGE-M3;

  2. +
  3. إعداد مجموعة Milvus لتخزين المتجهات الكثيفة والمتناثرة;

  4. +
  5. إدراج البيانات في ملفوس;

  6. +
  7. البحث وفحص النتيجة.

  8. +
+

أولاً، نحتاج إلى تثبيت التبعيات اللازمة.

+
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
+from pymilvus import (
+    utility,
+    FieldSchema, CollectionSchema, DataType,
+    Collection, AnnSearchRequest, RRFRanker, connections,
+)
+
+

استخدم BGE M3 لترميز المستندات والاستعلامات لتضمين الاسترجاع.

+
# 1. prepare a small corpus to search
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+query = "Who started AI research?"
+
+# BGE-M3 model can embed texts as dense and sparse vectors.
+# It is included in the optional `model` module in pymilvus, to install it,
+# simply run "pip install pymilvus[model]".
+
+bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
+
+docs_embeddings = bge_m3_ef(docs)
+query_embeddings = bge_m3_ef([query])
+
diff --git a/localization/v2.5.x/site/ar/faq/operational_faq.json b/localization/v2.5.x/site/ar/faq/operational_faq.json new file mode 100644 index 000000000..5ed4dc9c7 --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/operational_faq.json @@ -0,0 +1 @@ +{"codeList":["{\n \"registry-mirrors\": [\"https://registry.docker-cn.com\"]\n}\n","$ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512\n","pip install pymilvus>=2.4.2\n","# Python Example: result of len() str cannot be used as \"max-length\" in Milvus \n>>> s = \"你好,世界!\"\n>>> len(s) # Number of characters of s.\n6\n>>> len(bytes(s, \"utf-8\")) # Size in bytes of s, max-length in Milvus.\n18\n","pip install pymilvus>=2.4.2\n"],"headingContent":"Operational FAQ","anchorList":[{"label":"الأسئلة الشائعة التشغيلية","href":"Operational-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/faq/operational_faq.md b/localization/v2.5.x/site/ar/faq/operational_faq.md new file mode 100644 index 000000000..713790aca --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/operational_faq.md @@ -0,0 +1,107 @@ +--- +id: operational_faq.md +summary: اعثر على إجابات للأسئلة الشائعة حول العمليات في ميلفوس. +title: الأسئلة الشائعة التشغيلية +--- +

الأسئلة الشائعة التشغيلية

ماذا لو فشلت في سحب صورة Milvus Docker من Docker Hub؟

في حال فشلت في سحب صورة Milvus Docker من Docker Hub، حاول إضافة مرايا سجل أخرى.

+

يمكن للمستخدمين من البر الرئيسي للصين إضافة عنوان URL "https://registry.docker-cn.com" إلى مصفوفة مرايا السجل في /etc.docker/daemon.json.

+
{
+  "registry-mirrors": ["https://registry.docker-cn.com"]
+}
+
+

هل Docker هو الطريقة الوحيدة لتثبيت وتشغيل Milvus؟

Docker هي طريقة فعالة لنشر Milvus، ولكنها ليست الطريقة الوحيدة. يمكنك أيضاً نشر ميلفوس من التعليمات البرمجية المصدرية. يتطلب ذلك Ubuntu (18.04 أو أعلى) أو CentOS (7 أو أعلى). انظر بناء ميلفوس من التعليمات البرمجية المصدرية لمزيد من المعلومات.

+

ما هي العوامل الرئيسية التي تؤثر على الاستدعاء؟

يتأثر الاستدعاء بشكل رئيسي بنوع الفهرس ومعلمات البحث.

+

بالنسبة للفهرس المسطح، يأخذ Milvus مسحًا شاملًا داخل المجموعة، مع إرجاع 100%.

+

بالنسبة لفهارس IVF، تحدد معلمة nprobe نطاق البحث داخل المجموعة. تؤدي زيادة nprobe إلى زيادة نسبة المتجهات التي يتم البحث عنها واسترجاعها، ولكنها تقلل من أداء الاستعلام.

+

بالنسبة لفهرس HNSW، تحدد المعلمة ef نطاق البحث في الرسم البياني. تؤدي زيادة ef إلى زيادة عدد النقاط التي يتم البحث عنها في الرسم البياني والاستدعاء، ولكنها تقلل من أداء الاستعلام.

+

لمزيد من المعلومات، راجع فهرسة المتجهات.

+

لماذا لم تدخل التغييرات التي أجريتها على ملفات التكوين حيز التنفيذ؟

لا يدعم Milvus التعديل على ملفات التكوين أثناء وقت التشغيل. يجب إعادة تشغيل Milvus Docker حتى تدخل تغييرات ملفات التكوين حيز التنفيذ.

+

كيف أعرف ما إذا كان Milvus قد بدأ بنجاح؟

إذا تم بدء تشغيل Milvus باستخدام Docker Compose، قم بتشغيل docker ps لمراقبة عدد حاويات Docker قيد التشغيل والتحقق مما إذا كانت خدمات Milvus قد بدأت بشكل صحيح.

+

بالنسبة لـ Milvus المستقلة، يجب أن تكون قادرًا على مراقبة ثلاث حاويات Docker قيد التشغيل على الأقل، إحداها خدمة Milvus والاثنتان الأخريان هما خدمة إدارة وتخزين إلخd. لمزيد من المعلومات، راجع تثبيت ميلفوس Standalone.

+

لماذا يختلف الوقت في ملفات السجل عن وقت النظام؟

يرجع اختلاف الوقت عادةً إلى حقيقة أن الجهاز المضيف لا يستخدم التوقيت العالمي المنسق (UTC).

+

تستخدم ملفات السجل داخل صورة Docker التوقيت العالمي المنسق (UTC) بشكل افتراضي. إذا كان جهازك المضيف لا يستخدم التوقيت العالمي المنسق، فقد تحدث هذه المشكلة.

+

كيف أعرف ما إذا كانت وحدة المعالجة المركزية الخاصة بي تدعم Milvus؟

تعتمد عمليات الحوسبة الخاصة ب Milvus على دعم وحدة المعالجة المركزية لمجموعة تعليمات تمديد SIMD (تعليمات أحادية التعليمات ومتعددة البيانات). يعد دعم وحدة المعالجة المركزية الخاصة بك لمجموعة تعليمات تمديد SIMD أمرًا بالغ الأهمية لبناء الفهرس والبحث عن تشابه المتجهات داخل Milvus. تأكد من أن وحدة المعالجة المركزية لديك تدعم واحدة على الأقل من مجموعات تعليمات SIMD التالية:

+
    +
  • SSE4.2
  • +
  • AVX
  • +
  • AVX2
  • +
  • AVX512
  • +
+

قم بتشغيل الأمر lscpu للتحقق مما إذا كانت وحدة المعالجة المركزية لديك تدعم مجموعات تعليمات SIMD المذكورة أعلاه:

+
$ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512
+
+

لماذا يقوم Milvus بإرجاع illegal instruction أثناء بدء التشغيل؟

يتطلب Milvus أن تدعم وحدة المعالجة المركزية الخاصة بك مجموعة تعليمات SIMD: SSE4.2، أو AVX، أو AVX2، أو AVX512. يجب أن تدعم وحدة المعالجة المركزية واحدة منها على الأقل لضمان عمل Milvus بشكل طبيعي. يشير الخطأ illegal instruction الذي تم إرجاعه أثناء بدء التشغيل إلى أن وحدة المعالجة المركزية لديك لا تدعم أياً من مجموعات التعليمات الأربع المذكورة أعلاه.

+

راجع دعم وحدة المعالجة المركزية لمجموعة تعليمات SIMD.

+

هل يمكنني تثبيت Milvus على نظام ويندوز؟

نعم، يمكنك تثبيت Milvus على نظام ويندوز إما عن طريق التحويل البرمجي من التعليمات البرمجية المصدرية أو من حزمة ثنائية.

+

راجع تشغيل Milvus على ويندوز لمعرفة كيفية تثبيت Milvus على ويندوز.

+

حصلت على خطأ عند تثبيت pymilvus على ويندوز. ماذا أفعل؟

لا يوصى بتثبيت PyMilvus على ويندوز. ولكن إذا كان عليك تثبيت PyMilvus على نظام ويندوز ولكن حدث خطأ، حاول تثبيته في بيئة كوندا. راجع تثبيت Milvus SDK للمزيد من المعلومات حول كيفية تثبيت PyMilvus في بيئة كوندا.

+

هل يمكنني نشر ميلفوس عند قطع الاتصال بالإنترنت؟

نعم، يمكنك تثبيت ميلفوس في بيئة غير متصلة بالإنترنت. انظر تثبيت ميلفوس دون اتصال لمزيد من المعلومات.

+

أين يمكنني العثور على السجلات التي تم إنشاؤها بواسطة ميلفوس؟

تتم طباعة سجل ميلفوس إلى ستاوت (الإخراج القياسي) وستدرر (الخطأ القياسي) بشكل افتراضي، ولكننا نوصي بشدة بإعادة توجيه السجل إلى وحدة تخزين ثابتة في الإنتاج. للقيام بذلك، قم بتحديث log.file.rootPath في milvus.yaml. وإذا قمت بنشر Milvus مع مخطط milvus-helm ، فإنك تحتاج أيضًا إلى تمكين ثبات السجل أولاً عبر --set log.persistence.enabled=true.

+

إذا لم تقم بتغيير التهيئة، يمكن أن يساعدك استخدام سجلات kubectl logs <pod-name> أو سجلات docker logs CONTAINER أيضًا في العثور على السجل.

+

هل يمكنني إنشاء فهرس لمقطع قبل إدراج البيانات فيه؟

نعم، يمكنك ذلك. ولكننا نوصي بإدراج البيانات على دفعات، على ألا يتجاوز حجم كل منها 256 ميجابايت، قبل فهرسة كل مقطع.

+

هل يمكنني مشاركة مثيل إلخd بين عدة مثيلات ميلفوس؟

نعم، يمكنك مشاركة مثيل إلخd بين عدة مثيلات Milvus. للقيام بذلك، تحتاج إلى تغيير etcd.rootPath إلى قيمة منفصلة لكل مثيل من مثيلات Milvus في ملفات التكوين لكل منها قبل بدء تشغيلها.

+

هل يمكنني مشاركة مثيل Pulsar بين مثيلات Milvus متعددة؟

نعم، يمكنك مشاركة مثيل Pulsar بين مثيلات Milvus متعددة. للقيام بذلك، يمكنك

+
    +
  • إذا تم تمكين الإيجارات المتعددة على مثيل Pulsar الخاص بك، ففكر في تخصيص مستأجر منفصل أو مساحة اسم منفصلة لكل مثيل Milvus. وللقيام بذلك، تحتاج إلى تغيير pulsar.tenant أو pulsar.namespace في ملفات التكوين الخاصة بمثيلات Milvus الخاصة بك إلى قيمة فريدة لكل منها قبل بدء تشغيلها.
  • +
  • إذا كنت لا تخطط لتمكين الإيجار المتعدد على مثيل Pulsar الخاص بك، ففكر في تغيير msgChannel.chanNamePrefix.cluster في ملفات التكوين الخاصة بمثيلات Milvus إلى قيمة فريدة لكل منها قبل بدء تشغيلها.
  • +
+

هل يمكنني مشاركة مثيل MinIO بين مثيلات Milvus متعددة؟

نعم، يمكنك مشاركة مثيل MinIO بين مثيلات Milvus متعددة. للقيام بذلك، تحتاج إلى تغيير minio.rootPath إلى قيمة فريدة لكل مثيل من مثيلات Milvus في ملفات التكوين لكل منها قبل بدء تشغيلها.

+

كيف يمكنني التعامل مع رسالة الخطأ pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')> ؟

تشير رسالة الخطأ Illegal uri [example.db] إلى أنك تحاول الاتصال بـ Milvus Lite باستخدام إصدار سابق من PyMilvus لا يدعم هذا النوع من الاتصال. لحل هذه المشكلة، قم بترقية تثبيت PyMilvus إلى الإصدار 2.4.2 على الأقل، والذي يتضمن دعم الاتصال بـ Milvus Lite.

+

يمكنك ترقية PyMilvus باستخدام الأمر التالي:

+
pip install pymilvus>=2.4.2
+
+

لماذا أحصل على نتائج أقل من limit التي قمت بتعيينها في البحث/الاستعلام الخاص بي؟

هناك عدة أسباب قد تجعلك تتلقى نتائج أقل من limit الذي حددته:

+
    +
  • بيانات محدودة: قد لا تحتوي المجموعة على كيانات كافية لاستيفاء الحد الذي طلبته. إذا كان العدد الإجمالي للكيانات في المجموعة أقل من الحد، فستتلقى بطبيعة الحال نتائج أقل.

  • +
  • تكرار المفاتيح الأساسية: يعطي ميلفوس الأولوية لكيانات محددة عند مواجهة مفاتيح أساسية مكررة أثناء البحث. يختلف هذا السلوك بناءً على نوع البحث:

  • +
  • استعلام (مطابقة تامة): يقوم Milvus بتحديد أحدث كيان بمفتاح PK المطابق. البحث عن المفاتيح الأساسية: يقوم Milvus بتحديد الكيان الذي يتمتع بأعلى درجة تشابه، حتى إذا كانت الكيانات تشترك في نفس PK. يمكن أن يؤدي هذا التحديد للأولويات إلى نتائج فريدة أقل من الحد الأقصى إذا كانت مجموعتك تحتوي على العديد من المفاتيح الأساسية المكررة.

  • +
  • عدم كفاية التطابقات: قد تكون تعبيرات تصفية البحث الخاصة بك صارمة للغاية، مما يؤدي إلى عدد أقل من الكيانات التي تستوفي حد التشابه. إذا كانت الشروط التي تم تعيينها للبحث مقيدة للغاية، فلن يتطابق عدد كافٍ من الكيانات، مما يؤدي إلى نتائج أقل من المتوقع.

  • +
+

MilvusClient("milvus_demo.db") gives an error: ModuleNotFoundError: No module named 'milvus_lite'. ما سبب هذا الخطأ وكيف يمكن حله؟

يحدث هذا الخطأ عند محاولة استخدام برنامج Milvus Lite على نظام أساسي يعمل بنظام ويندوز. تم تصميم Milvus Lite بشكل أساسي لبيئات Linux وقد لا يكون لديه دعم أصلي لنظام Windows.

+

الحل هو استخدام بيئة Linux:

+
    +
  • استخدم نظام تشغيل يستند إلى لينكس أو جهاز افتراضي لتشغيل ميلفوس لايت.
  • +
  • سيضمن هذا النهج التوافق مع تبعيات المكتبة ووظائفها.
  • +
+

ما هي أخطاء "الطول يتجاوز الحد الأقصى للطول" في Milvus، وكيف يمكن فهمها ومعالجتها؟

تحدث أخطاء "الطول يتجاوز الحد الأقصى للطول" في Milvus عندما يتجاوز حجم عنصر البيانات الحد الأقصى للحجم المسموح به للمجموعة أو الحقل. فيما يلي بعض الأمثلة والتفسيرات:

+
    +
  • خطأ في حقل JSON: <MilvusException: (code=1100, message=the length (398324) of json field (metadata) exceeds max length (65536): expected=valid length json string, actual=length exceeds max length: invalid parameter)>

  • +
  • خطأ في طول السلسلة: <ParamError: (code=1, message=invalid input, length of string exceeds max length. length: 74238, max length: 60535)>

  • +
  • خطأ في حقل VarChar: <MilvusException: (code=1100, message=the length (60540) of 0th VarChar paragraph exceeds max length (0)%!(EXTRA int64=60535): invalid parameter)>

  • +
+

لفهم هذه الأخطاء ومعالجتها:

+
    +
  • افهم أن len(str) في بايثون يمثل عدد الأحرف، وليس الحجم بالبايت.
  • +
  • بالنسبة لأنواع البيانات المستندة إلى سلسلة مثل VARCHAR و JSON، استخدم len(bytes(str, encoding='utf-8')) لتحديد الحجم الفعلي بالبايت، وهو ما يستخدمه Milvus لـ "الطول الأقصى".
  • +
+

مثال في بايثون

+
# Python Example: result of len() str cannot be used as "max-length" in Milvus 
+>>> s = "你好,世界!"
+>>> len(s) # Number of characters of s.
+6
+>>> len(bytes(s, "utf-8")) # Size in bytes of s, max-length in Milvus.
+18
+
+

pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>. ما سبب هذا الخطأ وكيف يمكن حله؟

يشير هذا الخطأ إلى أنك تحاول الاتصال بـ Milvus Lite باستخدام إصدار سابق من pymilvus لا يدعمه. لحل هذه المشكلة، قم بترقية تثبيت pymilvus إلى الإصدار 2.4.2 على الأقل. يدعم هذا الإصدار الاتصال بـ Milvus Lite. للترقية، استخدم الأمر التالي:

+
pip install pymilvus>=2.4.2
+
+

هل لا تزال لديك أسئلة؟

يمكنك ذلك:

+
    +
  • الاطلاع على Milvus على GitHub. لا تتردد في طرح الأسئلة ومشاركة الأفكار ومساعدة الآخرين.
  • +
  • انضم إلى منتدى Milvus أو قناة Slack للحصول على الدعم والتفاعل مع مجتمعنا مفتوح المصدر.
  • +
diff --git a/localization/v2.5.x/site/ar/faq/performance_faq.json b/localization/v2.5.x/site/ar/faq/performance_faq.json new file mode 100644 index 000000000..b241359aa --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/performance_faq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Performance FAQ","anchorList":[{"label":"الأسئلة الشائعة حول الأداء","href":"Performance-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/faq/performance_faq.md b/localization/v2.5.x/site/ar/faq/performance_faq.md new file mode 100644 index 000000000..2ba95510a --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/performance_faq.md @@ -0,0 +1,51 @@ +--- +id: performance_faq.md +summary: >- + اعثر على إجابات للأسئلة المتداولة حول أداء البحث، وتحسينات الأداء، وغيرها من + المشكلات المتعلقة بالأداء. +title: الأسئلة الشائعة حول الأداء +--- +

الأسئلة الشائعة حول الأداء

كيف يتم تعيين nlist و nprobe لفهارس IVF؟

الإعداد nlist خاص بالسيناريو. وكقاعدة عامة، فإن القيمة الموصى بها nlist هي 4 × sqrt(n) ، حيث n هو إجمالي عدد الكيانات في المقطع.

+

يتم تحديد حجم كل مقطع بواسطة المعلمة datacoord.segment.maxSize ، والتي يتم تعيينها إلى 512 ميجابايت افتراضيًا. يمكن تقدير العدد الإجمالي للكيانات في المقطع n بقسمة datacoord.segment.maxSize على حجم كل كيان.

+

إن تحديد nprobe خاص بمجموعة البيانات والسيناريو، ويتضمن مفاضلة بين الدقة وأداء الاستعلام. نوصي بإيجاد القيمة المثالية من خلال التجريب المتكرر.

+

الرسوم البيانية التالية هي نتائج اختبار تم إجراؤه على مجموعة بيانات sift50m وفهرس IVF_SQ8، والذي يقارن بين الاستدعاء وأداء الاستعلام لأزواج مختلفة nlist/nprobe.

+

+ + Accuracy test + اختبار الدقة Performance testاختبار الأداء اختبار الأداء

+

لماذا تستغرق الاستعلامات أحيانًا وقتًا أطول على مجموعات البيانات الأصغر؟

تُجرى عمليات الاستعلام على شرائح. تقلل الفهارس من الوقت الذي يستغرقه الاستعلام عن مقطع ما. إذا لم تتم فهرسة مقطع ما، يلجأ برنامج Milvus إلى البحث بالقوة الغاشمة على البيانات الخام - مما يزيد من وقت الاستعلام بشكل كبير.

+

لذلك، عادةً ما يستغرق الاستعلام عن مجموعة بيانات صغيرة (مجموعة) وقتًا أطول لأنه لم يتم إنشاء فهرس لها. ويرجع ذلك إلى عدم وصول أحجام شرائحه إلى عتبة بناء الفهرس التي حددها rootCoord.minSegmentSizeToEnableindex. اتصل بـ create_index() لإجبار ميلفوس على فهرسة المقاطع التي وصلت إلى العتبة ولكن لم تتم فهرستها تلقائيًا بعد، مما يحسن أداء الاستعلام بشكل كبير.

+

ما هي العوامل التي تؤثر على استخدام وحدة المعالجة المركزية؟

يزداد استخدام وحدة المعالجة المركزية عندما يقوم ميلفوس ببناء الفهارس أو تشغيل الاستعلامات. بشكل عام، يكون إنشاء الفهرس مكثفًا لوحدة المعالجة المركزية إلا عند استخدام Annoy، الذي يعمل على مؤشر ترابط واحد.

+

عند تشغيل الاستعلامات، يتأثر استخدام وحدة المعالجة المركزية nq و nprobe. عندما يكون nq و nprobe صغيرًا، يكون التزامن منخفضًا ويظل استخدام وحدة المعالجة المركزية منخفضًا.

+

هل يؤثر إدراج البيانات والبحث في نفس الوقت على أداء الاستعلام؟

عمليات الإدراج ليست كثيفة الاستخدام لوحدة المعالجة المركزية. ومع ذلك، نظرًا لأن المقاطع الجديدة قد لا تصل إلى الحد الأدنى لبناء الفهرس، يلجأ ميلفوس إلى البحث بالقوة الغاشمة - مما يؤثر بشكل كبير على أداء الاستعلام.

+

تحدد المعلمة rootcoord.minSegmentSizeToEnableIndex عتبة بناء الفهرس للمقطع، ويتم تعيينها إلى 1024 صفًا افتراضيًا. راجع تكوين النظام لمزيد من المعلومات.

+

هل يمكن أن تؤدي فهرسة حقل VARCHAR إلى تحسين سرعة الحذف؟

يمكن أن تؤدي فهرسة حقل VARCHAR إلى تسريع عمليات "الحذف حسب التعبير"، ولكن في ظل ظروف معينة فقط:

+
    +
  • الفهرس المقلوب: يساعد هذا الفهرس في فهرسة IN أو == التعبيرات على حقول VARCHAR غير الأساسية.
  • +
  • الفهرس الثلاثي: يساعد هذا الفهرس في استعلامات البادئة (على سبيل المثال، LIKE prefix%) على حقول VARCHAR غير أساسية.
  • +
+

ومع ذلك، لا تؤدي فهرسة حقل VARCHAR إلى تسريع عملية الفهرسة:

+
    +
  • الحذف حسب المعرفات: عندما يكون حقل VARCHAR هو المفتاح الأساسي.
  • +
  • التعبيرات غير المرتبطة: عندما لا يكون حقل VARCHAR جزءًا من تعبير الحذف.
  • +
+

هل لا تزال لديك أسئلة؟

يمكنك ذلك:

+
    +
  • الاطلاع على Milvus على GitHub. لا تتردد في طرح الأسئلة ومشاركة الأفكار ومساعدة الآخرين.
  • +
  • انضم إلى قناة Slack الخاصة بنا للحصول على الدعم والتفاعل مع مجتمعنا مفتوح المصدر.
  • +
diff --git a/localization/v2.5.x/site/ar/faq/product_faq.json b/localization/v2.5.x/site/ar/faq/product_faq.json new file mode 100644 index 000000000..bd09b15b1 --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/product_faq.json @@ -0,0 +1 @@ +{"codeList":["60 * 2 * 4 + 40 * 1 * 12 = 960\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n"],"headingContent":"Product FAQ","anchorList":[{"label":"الأسئلة الشائعة حول المنتج","href":"Product-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/faq/product_faq.md b/localization/v2.5.x/site/ar/faq/product_faq.md new file mode 100644 index 000000000..d5c98c150 --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/product_faq.md @@ -0,0 +1,102 @@ +--- +id: product_faq.md +summary: >- + اعثر على إجابات للأسئلة المتداولة حول قاعدة بيانات المتجهات الأكثر تقدماً في + العالم. +title: الأسئلة الشائعة حول المنتج +--- +

الأسئلة الشائعة حول المنتج

كم تبلغ تكلفة ميلفوس؟

ميلفوس هو مشروع مجاني مفتوح المصدر 100%.

+

يُرجى الالتزام برخصة أباتشي 2.0 عند استخدام ميلفوس لأغراض الإنتاج أو التوزيع.

+

كما تقدم شركة Zilliz، الشركة التي تقف وراء Milvus، نسخة سحابية مُدارة بالكامل من المنصة لأولئك الذين لا يرغبون في بناء وصيانة مثيلهم الموزع الخاص بهم. تحافظ Zilliz Cloud تلقائيًا على موثوقية البيانات وتسمح للمستخدمين بالدفع مقابل ما يستخدمونه فقط.

+

هل يدعم ميلفوس البنى غير x86؟

لا يمكن تثبيت Milvus أو تشغيله على منصات غير x86.

+

يجب أن تدعم وحدة المعالجة المركزية الخاصة بك إحدى مجموعات التعليمات التالية لتشغيل Milvus: SSE4.2، AVX، AVX2، AVX512. هذه كلها مجموعات تعليمات SIMD مخصصة ل x86.

+

أين يخزن ميلفوس البيانات؟

يتعامل Milvus مع نوعين من البيانات، البيانات المدرجة والبيانات الوصفية.

+

يتم تخزين البيانات المدرجة، بما في ذلك البيانات المتجهة، والبيانات القياسية، والمخطط الخاص بالمجموعة، في وحدة تخزين ثابتة كسجل تزايدي. يدعم Milvus العديد من خلفيات تخزين الكائنات، بما في ذلك MinIO وAWS S3 وGoogle Cloud Storage (GCS) وAzure Blob Storage وAlibaba Cloud OSS وTencent Cloud Object Storage (COS).

+

يتم إنشاء البيانات الوصفية داخل Milvus. تحتوي كل وحدة من وحدات Milvus على البيانات الوصفية الخاصة بها والتي يتم تخزينها في إلخd.

+

لماذا لا توجد بيانات متجهة في إلخd؟

يخزن إلخd البيانات الوصفية لوحدات Milvus النمطية؛ بينما يخزن MinIO الكيانات.

+

هل يدعم ميلفوس إدراج البيانات والبحث عنها في نفس الوقت؟

نعم. يتم التعامل مع عمليات الإدراج وعمليات الاستعلام بواسطة وحدتين منفصلتين مستقلتين عن بعضهما البعض. من وجهة نظر العميل، تكتمل عملية الإدراج عندما تدخل البيانات المدرجة في قائمة انتظار الرسائل. ومع ذلك، تكون البيانات المدرجة غير قابلة للبحث حتى يتم تحميلها إلى عقدة الاستعلام. إذا لم يصل حجم المقطع إلى عتبة بناء الفهرس (512 ميغابايت افتراضيًا)، يلجأ ميلفوس إلى البحث بالقوة الغاشمة وقد يتضاءل أداء الاستعلام.

+

هل يمكن إدراج المتجهات ذات المفاتيح الأساسية المكررة في ملفوس؟

نعم. لا يتحقق ميلفوس مما إذا كانت المفاتيح الأساسية للمتجهات مكررة.

+

عندما يتم إدراج متجهات بمفاتيح أساسية مكررة، هل يعاملها ميلفوس كعملية تحديث؟

لا. لا يدعم Milvus حالياً عمليات التحديث ولا يتحقق مما إذا كانت المفاتيح الأساسية للكيان مكررة. أنت مسؤول عن التأكد من أن المفاتيح الأساسية للكيان فريدة من نوعها، وإذا لم تكن كذلك فقد يحتوي Milvus على كيانات متعددة بمفاتيح أساسية مكررة.

+

في حالة حدوث ذلك، تظل نسخة البيانات التي سيتم إرجاعها عند الاستعلام عنها سلوكًا غير معروف. سيتم إصلاح هذا القيد في الإصدارات المستقبلية.

+

ما هو الحد الأقصى لطول المفاتيح الأساسية للكيانات المعرفة ذاتياً؟

يجب أن تكون المفاتيح الأساسية للكيان أعداداً صحيحة غير سالبة 64 بت.

+

ما هو الحد الأقصى لكمية البيانات التي يمكن إضافتها لكل عملية إدراج؟

يجب ألا يتجاوز حجم عملية الإدراج 1,024 ميغابايت. هذا حد مفروض من قبل gRPC.

+

هل يؤثر حجم المجموعة على أداء الاستعلام عند البحث في قسم معين؟

لا، إذا تم تحديد أقسام للبحث، يبحث Milvus في الأقسام المحددة فقط.

+

يعتمد ذلك على البيانات المطلوبة للبحث. يجب تحميل جميع الأقسام التي يحتمل أن تظهر في نتيجة البحث قبل البحث.

+
    +
  • على سبيل المثال، إذا كنت تريد فقط البحث في قسم (أقسام) محددة، فلن تحتاج إلى تحميل الكل. اتصل على load_partition() لتحميل القسم (الأقسام) المقصودة ثم حدد القسم (الأقسام) في استدعاء الأسلوب search().
  • +
  • إذا كنت ترغب في البحث في جميع الأقسام، اتصل على load_collection() لتحميل المجموعة بأكملها بما في ذلك جميع الأقسام.
  • +
  • إذا فشلت في تحميل المجموعة أو قسم (أقسام) محددة قبل البحث، فسيقوم ميلفوس بإرجاع خطأ.
  • +
+

هل يمكن إنشاء فهارس بعد إدراج المتجهات؟

نعم، إذا تم إنشاء فهرس للمجموعة من خلال create_index() من قبل، سيقوم Milvus تلقائيًا بإنشاء فهرس للمتجهات التي تم إدراجها لاحقًا. ومع ذلك، لا ينشئ Milvus فهرسًا حتى تملأ المتجهات المدرجة حديثًا مقطعًا كاملًا ويكون ملف الفهرس الذي تم إنشاؤه حديثًا منفصلًا عن الملف السابق.

+

كيف يختلف الفهرسان FLAT و IVF_FLAT؟

يقسم فهرس IVF_FLAT مساحة المتجهات إلى مجموعات قوائم. في قيمة القائمة الافتراضية 16,384 قائمة، يقارن Milvus المسافات بين المتجه الهدف ومراكز جميع المجموعات الـ 16,384 لإرجاع أقرب مجموعات مسبار. ثم يقارن Milvus المسافات بين المتجه الهدف والمتجهات في المجموعات المحددة للحصول على أقرب المتجهات. على عكس IVF_FLAT، يقارن FLAT مباشرةً المسافات بين المتجه الهدف وكل متجه آخر.

+

عندما يكون العدد الإجمالي للمتجهات يساوي تقريبًا nlist، تكون المسافة بين IVF_FLAT و FLAT قليلة من حيث متطلبات الحساب وأداء البحث. ومع ذلك، عندما يتجاوز عدد المتجهات nlist بمعامل اثنين أو أكثر، يبدأ IVF_FLAT في إظهار مزايا الأداء.

+

انظر فهرس المتجهات لمزيد من المعلومات.

+

كيف يقوم ميلفوس بمسح البيانات؟

يُرجع Milvus النجاح عندما يتم إدخال البيانات المدرجة في قائمة انتظار الرسائل. ومع ذلك، لا يتم مسح البيانات بعد إلى القرص. ثم تقوم عقدة بيانات Milvus بكتابة البيانات الموجودة في قائمة انتظار الرسائل إلى التخزين الدائم كسجلات تزايديّة. إذا تم استدعاء flush() ، يتم إجبار عقدة البيانات على كتابة جميع البيانات في قائمة انتظار الرسائل إلى التخزين الدائم على الفور.

+

ما هو التطبيع؟ لماذا التطبيع مطلوب؟

يشير التطبيع إلى عملية تحويل المتجه بحيث يساوي معياره 1. إذا تم استخدام حاصل الضرب الداخلي لحساب تشابه المتجهات، فيجب تطبيع المتجهات. بعد التطبيع، يساوي حاصل الضرب الداخلي تشابه جيب التمام.

+

راجع ويكيبيديا لمزيد من المعلومات.

+

لماذا تعطي المسافة الإقليدية (L2) والضرب الداخلي (IP) نتائج مختلفة؟

بالنسبة للمتجهات المطبعة، تكون المسافة الإقليدية (L2) مكافئة رياضيًا للضرب الداخلي (IP). إذا كانت مقاييس التشابه هذه تعطي نتائج مختلفة، فتحقق مما إذا كانت المتجهات لديك طبيعية

+

هل هناك حد للعدد الإجمالي للمجموعات والأقسام في Milvus؟

نعم، يمكنك إنشاء ما يصل إلى 65,535 مجموعة في مثيل Milvus. عند حساب عدد المجموعات الموجودة، تحسب Milvus جميع المجموعات التي تحتوي على أجزاء وأقسام فيها.

+

على سبيل المثال، لنفترض أنك قمت بالفعل بإنشاء 100 مجموعة، مع وجود جزأين و4 أقسام في 60 منها وجزء واحد و12 قسمًا في المجموعات ال 40 المتبقية. يمكن حساب العدد الحالي للمجموعات على النحو التالي:

+
60 * 2 * 4 + 40 * 1 * 12 = 960
+
+

لماذا أحصل على أقل من k ناقلات عند البحث عن topk ناقلات؟

من بين الفهارس التي يدعمها Milvus، يقوم IVF_FLAT و IVF_SQ8 بتنفيذ طريقة التجميع k-means. يتم تقسيم مساحة البيانات إلى nlist مجموعات ويتم توزيع المتجهات المدرجة على هذه المجموعات. ثم تختار Milvus بعد ذلك أقرب nprobe من المجموعات وتقارن المسافات بين المتجه الهدف وجميع المتجهات في المجموعات المختارة لإرجاع النتائج النهائية.

+

إذا كانت nlist و topk كبيرة و nprobe صغيرة، فقد يكون عدد المتجهات في مجموعات nprobe أقل من k. لذلك، عند البحث عن topk أقرب المتجهات ، يكون عدد المتجهات التي تم إرجاعها أقل من k.

+

لتجنب ذلك، حاول ضبط nprobe أكبر و nlist و k أصغر.

+

راجع فهرس المتجهات لمزيد من المعلومات.

+

ما هو الحد الأقصى للبعد المتجه المدعوم في ملفوس؟

يمكن لـ Milvus إدارة متجهات ذات أبعاد تصل إلى 32,768 بُعداً افتراضياً. يمكنك زيادة قيمة Proxy.maxDimension للسماح بمتجهات ذات أبعاد أكبر.

+

هل يدعم Milvus وحدة المعالجة المركزية Apple M1؟

لا يدعم الإصدار الحالي من Milvus وحدة المعالجة المركزية Apple M1 مباشرة. بعد الإصدار Milvus 2.3، يوفر Milvus صور Docker لبنية ARM64.

+

ما هي أنواع البيانات التي يدعمها Milvus في حقل المفتاح الأساسي؟

في الإصدار الحالي، يدعم Milvus كلاً من INT64 والسلسلة.

+

هل Milvus قابل للتطوير؟

نعم، يمكنك نشر مجموعة Milvus مع عقد متعددة عبر مخطط Helm على Kubernetes. راجع دليل التوسع لمزيد من التعليمات.

+

ما هو الجزء المتزايد والجزء المختوم؟

عندما يأتي طلب بحث، يبحث ميلفوس في كل من البيانات التزايدية والبيانات التاريخية. البيانات التزايدية هي تحديثات حديثة، يتم تخزينها في المقاطع المتزايدة، والتي يتم تخزينها في الذاكرة قبل أن تصل إلى الحد الأدنى ليتم تثبيتها في تخزين الكائنات ويتم إنشاء فهرس أكثر كفاءة لها، بينما البيانات التاريخية هي تحديثات منذ فترة. وهي في المقاطع المختومة التي تم تخزينها باستمرار في مخزن الكائنات. تشكل البيانات التزايدية والبيانات التاريخية معًا مجموعة البيانات الكاملة للبحث. هذا التصميم يجعل أي بيانات يتم إدخالها إلى ميلفوس قابلة للبحث على الفور. بالنسبة لـ Milvus Distributed، هناك عوامل أكثر تعقيدًا تحدد متى يمكن أن يظهر سجل تم تناوله للتو في نتيجة البحث. تعرف على المزيد من الفروق الدقيقة حول ذلك في مستويات الاتساق.

+

نعم. بالنسبة للاستعلامات على نفس المجموعة، يبحث Milvus بشكل متزامن في البيانات الإضافية والتاريخية. ومع ذلك، يتم إجراء الاستعلامات على مجموعات مختلفة في سلسلة. في حين أن البيانات التاريخية يمكن أن تكون مجموعة بيانات ضخمة للغاية، فإن عمليات البحث على البيانات التاريخية تستغرق وقتًا أطول نسبيًا ويتم إجراؤها بشكل أساسي في سلسلة.

+

لماذا تبقى البيانات في MinIO بعد إسقاط المجموعة المقابلة؟

صُممت البيانات في MinIO لتبقى لفترة زمنية معينة لتسهيل عملية استرجاع البيانات.

+

هل يدعم ميلفوس محركات رسائل أخرى غير بولسار؟

نعم. كافكا مدعوم في ميلفوس 2.1.0.

+

ما الفرق بين البحث والاستعلام؟

في Milvus، يسترجع البحث عن تشابه المتجهات في Milvus المتجهات بناءً على حساب التشابه وتسريع فهرس المتجهات. على عكس البحث عن التشابه المتجه، يسترجع الاستعلام عن المتجهات المتجهات عبر التصفية القياسية بناءً على تعبير منطقي. يقوم التعبير المنطقي بالتصفية على الحقول القياسية أو حقل المفتاح الأساسي، ويسترجع جميع النتائج التي تطابق المرشحات. في الاستعلام، لا يتم تضمين مقاييس التشابه أو فهرس المتجهات.

+

لماذا تبلغ دقة قيمة المتجه العائم 7 أرقام عشرية في ملفوس؟

يدعم Milvus تخزين المتجهات كمصفوفات Float32. قيمة Float32 لها دقة 7 أرقام عشرية. حتى مع قيمة Float64، مثل 1.3476964684980388، يخزنها Milvus على أنها 1.347696. ولذلك، عند استرداد مثل هذا المتجه من Milvus، تفقد دقة قيمة Float64.

+

كيف يتعامل Milvus مع أنواع بيانات المتجهات ودقتها؟

يدعم Milvus أنواع المتجهات الثنائية و Float32 و Float16 و BFloat16.

+
    +
  • المتجهات الثنائية: تخزين البيانات الثنائية كتسلسلات من 0 و1، وتستخدم في معالجة الصور واسترجاع المعلومات.
  • +
  • متجهات Float32: تخزين افتراضي بدقة تبلغ حوالي 7 أرقام عشرية. حتى قيم Float64 يتم تخزينها بدقة Float32، مما يؤدي إلى فقدان محتمل للدقة عند الاسترجاع.
  • +
  • متجهات Float16 و BFloat16: توفر دقة واستخدام أقل للذاكرة. يعد Float16 مناسبًا للتطبيقات ذات النطاق الترددي والتخزين المحدود، بينما يوازن BFloat16 بين النطاق والكفاءة، ويُستخدم عادةً في التعلم العميق لتقليل المتطلبات الحسابية دون التأثير بشكل كبير على الدقة.
  • +
+

هل يدعم Milvus تحديد القيم الافتراضية للحقول القياسية أو المتجهة؟

لا يدعم Milvus 2.4.x حاليًا تحديد القيم الافتراضية للحقول القياسية أو المتجهة. هذه الميزة مخططة للإصدارات المستقبلية.

+

هل يتم تحرير مساحة التخزين مباشرة بعد حذف البيانات في ملفوس؟

لا، لن يتم تحرير مساحة التخزين على الفور عند حذف البيانات في Milvus. على الرغم من أن حذف البيانات يضع علامة على الكيانات على أنها "محذوفة منطقيًا"، إلا أنه قد لا يتم تحرير المساحة الفعلية على الفور. إليك السبب:

+
    +
  • الضغط: يقوم ميلفوس تلقائيًا بضغط البيانات في الخلفية. تدمج هذه العملية أجزاء البيانات الأصغر في أجزاء أكبر وتزيل البيانات المحذوفة منطقيًا (الكيانات التي تم وضع علامة الحذف عليها) أو البيانات التي تجاوزت وقت تشغيلها (TTL). ومع ذلك، ينشئ الضغط مقاطع جديدة بينما يضع علامة "محذوفة" على المقاطع القديمة.
  • +
  • تجميع القمامة: تقوم عملية منفصلة تسمى تجميع القمامة (GC) بشكل دوري بإزالة هذه المقاطع "المسقطة"، مما يؤدي إلى تحرير مساحة التخزين التي كانت تشغلها. وهذا يضمن الاستخدام الفعال للتخزين ولكن يمكن أن يؤدي إلى تأخير طفيف بين الحذف واستصلاح المساحة.
  • +
+

هل يمكنني رؤية البيانات التي تم إدراجها أو حذفها أو إعادة إدراجها مباشرةً بعد العملية دون انتظار التدفق؟

نعم، في Milvus، لا ترتبط رؤية البيانات في Milvus مباشرةً بعمليات التدفق بسبب بنية الفصل بين التخزين والحساب. يمكنك إدارة إمكانية قراءة البيانات باستخدام مستويات الاتساق.

+

عند اختيار مستوى الاتساق، ضع في اعتبارك المفاضلة بين الاتساق والأداء. بالنسبة للعمليات التي تتطلب رؤية فورية، استخدم مستوى اتساق "قوي". لعمليات الكتابة الأسرع، قم بإعطاء الأولوية للاتساق الأضعف (قد لا تكون البيانات مرئية على الفور). لمزيد من المعلومات، راجع الاتساق.

+

بعد تمكين ميزة مفتاح التقسيم، ما هي القيمة الافتراضية لـ num_partitions في ميلفوس، ولماذا؟

عندما يتم تمكين ميزة مفتاح التقسيم، يتم تعيين القيمة الافتراضية لـ num_partitions في ملفوس على 16. يتم اختيار هذا الافتراضي لأسباب تتعلق بالاستقرار والأداء. يمكنك ضبط القيمة num_partitions حسب الحاجة من خلال تحديدها في الدالة create_collection.

+

هل هناك حد أقصى لطول تعبيرات التصفية القياسية؟

نعم، الحد الأقصى لطول تعبيرات التصفية العددية مقيد بحد نقل RPC، والذي يتم تعريفه في ملف التكوين milvus.yaml. على وجه التحديد، يتم تعيين الحد بواسطة المعلمة serverMaxRecvSize ضمن قسم الوكيل:

+
proxy:
+  grpc:
+    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
+
+

بشكل افتراضي، يكون الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) 64 ميغابايت. لذلك، يجب أن يكون طول تعبير التصفية أقل من هذا الحد لضمان نجاح المعالجة.

+

عند إجراء بحث مجمّع عن المتجهات، كم عدد المتجهات التي يمكن تحديدها مرة واحدة؟ هل هناك حد؟

نعم، إن عدد المتجهات التي يمكن تحديدها في البحث عن المتجهات المجمعة محدود بحجم نقل RPC، كما هو محدد في ملف التكوين milvus.yaml. يتم تحديد هذا الحد بواسطة المعلمة serverMaxRecvSize ضمن قسم الوكيل:

+
proxy:
+  grpc:
+    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
+
+

بشكل افتراضي، يبلغ الحد الأقصى لحجم كل طلب RPC 64 ميغابايت. لذلك، يجب أن يكون الحجم الإجمالي لمتجهات الإدخال، بما في ذلك بيانات الأبعاد والبيانات الوصفية الخاصة بها، أقل من هذا الحد لضمان التنفيذ الناجح.

+

هل لا تزال لديك أسئلة؟

يمكنك ذلك:

+
    +
  • تحقق من Milvus على GitHub. نرحب بك لطرح الأسئلة ومشاركة الأفكار ومساعدة الآخرين.
  • +
  • انضم إلى مجتمع Slack الخاص بنا للحصول على الدعم والتفاعل مع مجتمعنا مفتوح المصدر.
  • +
diff --git a/localization/v2.5.x/site/ar/faq/troubleshooting.json b/localization/v2.5.x/site/ar/faq/troubleshooting.json new file mode 100644 index 000000000..e69ea210e --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/troubleshooting.json @@ -0,0 +1 @@ +{"codeList":["$ docker logs \n","kubectl scale sts --replicas=1\n# delete the pvc for etcd-1 and etcd-2\nkubectl scale sts --replicas=3\n","kubectl kubectl scale sts --replicas=0\n# delete the pvc for etcd-0, etcd-1, etcd-2\nkubectl kubectl scale sts --replicas=1\n# restore the backup data\n"],"headingContent":"Troubleshooting","anchorList":[{"label":"استكشاف الأخطاء وإصلاحها","href":"Troubleshooting","type":1,"isActive":false},{"label":"مشكلات التمهيد","href":"Boot-issues","type":2,"isActive":false},{"label":"مشكلات وقت التشغيل","href":"Runtime-issues","type":2,"isActive":false},{"label":"مشكلات واجهة برمجة التطبيقات","href":"API-issues","type":2,"isActive":false},{"label":"مشاكل تعطل إلخd","href":"etcd-crash-issues","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/faq/troubleshooting.md b/localization/v2.5.x/site/ar/faq/troubleshooting.md new file mode 100644 index 000000000..44327e7a9 --- /dev/null +++ b/localization/v2.5.x/site/ar/faq/troubleshooting.md @@ -0,0 +1,112 @@ +--- +id: troubleshooting.md +summary: تعرف على المشكلات الشائعة التي قد تواجهها مع ميلفوس وكيفية التغلب عليها. +title: استكشاف الأخطاء وإصلاحها +--- +

استكشاف الأخطاء وإصلاحها

تسرد هذه الصفحة المشكلات الشائعة التي قد تحدث عند تشغيل Milvus، بالإضافة إلى النصائح الممكنة لاستكشاف الأخطاء وإصلاحها. تنقسم المشاكل في هذه الصفحة إلى الفئات التالية:

+ +

مشكلات التمهيد

عادةً ما تكون أخطاء التمهيد قاتلة. قم بتشغيل الأمر التالي لعرض تفاصيل الخطأ:

+
$ docker logs <your milvus container id>
+
+

مشكلات وقت التشغيل

قد تتسبب الأخطاء التي تحدث أثناء وقت التشغيل في تعطل الخدمة. لاستكشاف هذه المشكلة وإصلاحها، تحقق من التوافق بين الخادم والعميل قبل المضي قدماً.

+

مشكلات واجهة برمجة التطبيقات

تحدث هذه المشكلات أثناء استدعاءات أسلوب واجهة برمجة التطبيقات بين خادم Milvus وعميلك. سيتم إرجاعها إلى العميل بشكل متزامن أو غير متزامن.

+

مشاكل تعطل إلخd

1. جراب جراب إلخd معلق

تستخدم مجموعة etcd pvc بشكل افتراضي. يجب تهيئة StorageClass مسبقًا لمجموعة Kubernetes.

+

2. تعطل جراب إلخd

عند تعطل جراب إلخd مع Error: bad member ID arg (strconv.ParseUint: parsing "": invalid syntax), expecting ID in Hex ، يمكنك تسجيل الدخول إلى هذا الجراب وحذف الملف /bitnami/etcd/data/member_id.

+

3. تستمر القرون المتعددة في التعطل أثناء استمرار تشغيل etcd-0

يمكنك تشغيل الكود التالي إذا استمر تعطل عدة كبسولات أثناء استمرار تشغيل etcd-0.

+
kubectl scale sts <etcd-sts> --replicas=1
+# delete the pvc for etcd-1 and etcd-2
+kubectl scale sts <etcd-sts> --replicas=3
+
+

4. تعطل جميع الكبسولات

عندما تتعطل جميع الكبسولات، حاول نسخ الملف /bitnami/etcd/data/member/snap/db. استخدم https://github.com/etcd-io/bbolt لتعديل بيانات قاعدة البيانات.

+

يتم الاحتفاظ بجميع بيانات Milvus الوصفية في دلو key. قم بعمل نسخة احتياطية من البيانات في هذه الدلو وقم بتشغيل الأوامر التالية. لاحظ أن بيانات البادئة في الملف by-dev/meta/session لا تتطلب نسخة احتياطية.

+
kubectl kubectl scale sts <etcd-sts> --replicas=0
+# delete the pvc for etcd-0, etcd-1, etcd-2
+kubectl kubectl scale sts <etcd-sts> --replicas=1
+# restore the backup data
+
+


+

إذا كنت بحاجة إلى مساعدة في حل مشكلة، فلا تتردد في ذلك:

+
    +
  • انضم إلى قناة Slack الخاصة بنا وتواصل للحصول على الدعم من فريق ميلفوس.
  • +
  • قم بتقديم مشكلة على GitHub تتضمن تفاصيل حول مشكلتك.
  • +
diff --git a/localization/v2.5.x/site/ar/getstarted/install-overview.json b/localization/v2.5.x/site/ar/getstarted/install-overview.json new file mode 100644 index 000000000..79556ecd6 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview of Milvus Deployment Options","anchorList":[{"label":"نظرة عامة على خيارات نشر ميلفوس","href":"Overview-of-Milvus-Deployment-Options","type":1,"isActive":false},{"label":"ميلفوس لايت","href":"Milvus-Lite","type":2,"isActive":false},{"label":"ميلفوس مستقل","href":"Milvus-Standalone","type":2,"isActive":false},{"label":"ميلفوس الموزعة","href":"Milvus-Distributed","type":2,"isActive":false},{"label":"اختيار النشر المناسب لحالة الاستخدام الخاصة بك","href":"Choose-the-Right-Deployment-for-Your-Use-Case","type":2,"isActive":false},{"label":"مقارنة بين الوظائف","href":"Comparison-on-functionalities","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/install-overview.md b/localization/v2.5.x/site/ar/getstarted/install-overview.md new file mode 100644 index 000000000..dec309e24 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install-overview.md @@ -0,0 +1,139 @@ +--- +id: install-overview.md +summary: >- + Milvus هي قاعدة بيانات متجهات عالية الأداء وقابلة للتطوير. وهي تدعم حالات + استخدام ذات نطاق واسع من الأحجام، بدءًا من العروض التوضيحية التي تعمل محليًا + في دفاتر Jupyter Notebooks إلى مجموعات Kubernetes واسعة النطاق التي تتعامل مع + عشرات المليارات من المتجهات. يوجد حاليًا ثلاثة خيارات لنشر Milvus_ Milvus Lite + و Milvus Standalone و Milvus Distributed. +title: نظرة عامة على خيارات نشر ميلفوس +--- +

نظرة عامة على خيارات نشر ميلفوس

ميلفوس هي قاعدة بيانات متجهة عالية الأداء وقابلة للتطوير. وهي تدعم حالات استخدام ذات نطاق واسع من الأحجام، بدءًا من العروض التوضيحية التي تعمل محليًا في دفاتر Jupyter Notebooks إلى مجموعات Kubernetes واسعة النطاق التي تتعامل مع عشرات المليارات من المتجهات. يوجد حاليًا ثلاثة خيارات لنشر Milvus: Milvus Lite و Milvus Standalone و Milvus Distributed.

+

ميلفوس لايت

ميلفوس لايت هي مكتبة بايثون يمكن استيرادها إلى تطبيقاتك. وباعتبارها نسخة خفيفة الوزن من Milvus، فهي مثالية للنماذج الأولية السريعة في دفاتر Jupyter Notebooks أو التشغيل على الأجهزة الذكية ذات الموارد المحدودة. يدعم Milvus Lite نفس واجهات برمجة التطبيقات التي تدعمها تطبيقات Milvus الأخرى. يمكن أيضًا أن تعمل التعليمات البرمجية من جانب العميل التي تتفاعل مع Milvus Lite مع مثيلات Milvus في أوضاع النشر الأخرى.

+

لدمج Milvus Lite في تطبيقاتك، قم بتشغيل pip install pymilvus لتثبيته واستخدم البيان MilvusClient("./demo.db") لإنشاء قاعدة بيانات متجهة مع ملف محلي يستمر في جميع بياناتك. لمزيد من التفاصيل، راجع تشغيل Milvus Lite.

+

ميلفوس مستقل

Milvus Standalone هو نشر خادم أحادي الجهاز. يتم تعبئة جميع مكونات Milvus Standalone في صورة Docker واحدة، مما يجعل النشر مريحاً. إذا كان لديك عبء عمل إنتاجي ولكنك تفضل عدم استخدام Kubernetes، فإن تشغيل Milvus Standalone على جهاز واحد بذاكرة كافية يعد خيارًا جيدًا. بالإضافة إلى ذلك، يدعم Milvus Standalone التوافر العالي من خلال النسخ المتماثل بين السيد والعبد.

+

ميلفوس الموزعة

يمكن نشر Milvus Distributed على مجموعات Kubernetes. يتميز هذا النشر ببنية سحابية أصلية، حيث يتم التعامل مع حمل الاستيعاب واستعلامات البحث بشكل منفصل بواسطة عقد معزولة، مما يسمح بالتكرار للمكونات الهامة. يوفر أعلى قابلية للتوسع والتوافر، بالإضافة إلى المرونة في تخصيص الموارد المخصصة في كل مكون. ميلفوس الموزعة هو الخيار الأفضل لمستخدمي المؤسسات الذين يقومون بتشغيل أنظمة بحث متجهية واسعة النطاق في الإنتاج.

+

اختيار النشر المناسب لحالة الاستخدام الخاصة بك

يعتمد اختيار وضع النشر عادةً على مرحلة تطوير تطبيقك:

+
    +
  • للنماذج الأولية السريعة

    +

    إذا كنت ترغب في إنشاء شيء ما بسرعة كنموذج أولي أو لأغراض التعلم، مثل العروض التوضيحية للجيل المعزز للاسترجاع (RAG)، أو روبوتات الدردشة الآلية، أو البحث متعدد الوسائط، فإن Milvus Lite نفسه أو مزيج من Milvus Lite و Milvus Standalone مناسب. يمكنك استخدام Milvus Lite في دفاتر الملاحظات للنماذج الأولية السريعة واستكشاف أساليب مختلفة مثل استراتيجيات التقطيع المختلفة في RAG. قد ترغب في نشر التطبيق الذي تم إنشاؤه باستخدام Milvus Lite في إنتاج صغير النطاق لخدمة مستخدمين حقيقيين، أو التحقق من صحة الفكرة على مجموعات بيانات أكبر، لنقل أكثر من بضعة ملايين من المتجهات. يعد تطبيق Milvus Standalone مناسبًا. لا يزال من الممكن مشاركة منطق التطبيق الخاص بـ Milvus Lite حيث أن جميع عمليات نشر Milvus لها نفس واجهة برمجة التطبيقات من جانب العميل. يمكن أيضًا نقل البيانات المخزنة في Milvus Lite إلى Milvus Standalone باستخدام أداة سطر الأوامر.

  • +
  • نشر الإنتاج على نطاق صغير

    +

    بالنسبة للإنتاج في المراحل المبكرة من الإنتاج، عندما يكون المشروع لا يزال يبحث عن ملاءمة المنتج للسوق وتكون السرعة أكثر أهمية من قابلية التوسع، فإن Milvus Standalone هو الخيار الأفضل. لا يزال بإمكانه توسيع نطاقه ليصل إلى 100 مليون ناقل في حال توفر موارد كافية من الآلات، بينما يتطلب عمليات تطوير أقل بكثير من الحفاظ على مجموعة K8s.

  • +
  • نشر الإنتاج على نطاق واسع

    +

    نظرًا لأن عملك ينمو بسرعة ويتجاوز حجم البيانات سعة خادم واحد، فقد حان الوقت للتفكير في Milvus Distributed. يمكنك الاستمرار في استخدام Milvus Standalone لبيئة التطوير أو بيئة التدريج لراحتها، وتشغيل مجموعة K8s التي تدير Milvus Distributed. يمكن لهذا أن يدعمك نحو عشرات المليارات من المتجهات، بالإضافة إلى توفير المرونة في تخصيص حجم العقدة لحجم عملك الخاص، مثل حالات القراءة العالية والكتابة النادرة أو حالات الكتابة العالية والقراءة المنخفضة.

  • +
  • البحث المحلي على أجهزة الحافة

    +

    للبحث من خلال خاص أو حساس على الأجهزة المتطورة، يمكنك نشر Milvus Lite على الجهاز دون الاعتماد على خدمة مستندة إلى السحابة لإجراء بحث نصي أو بحث عن الصور. وهذا مناسب لحالات مثل البحث في المستندات الخاصة، أو اكتشاف الكائنات على الجهاز.

  • +
+

يعتمد اختيار وضع نشر Milvus على مرحلة مشروعك وحجمه. يوفر Milvus حلاً مرنًا وقويًا لمختلف الاحتياجات، بدءًا من النماذج الأولية السريعة إلى النشر على نطاق واسع في المؤسسة.

+
    +
  • يوصى باستخدامMilvus Lite لمجموعات البيانات الأصغر حجمًا، حتى بضعة ملايين من المتجهات.
  • +
  • يعدMilvus Standalone مناسبًا لمجموعات البيانات متوسطة الحجم، حيث يصل حجمها إلى 100 مليون متجه.
  • +
  • تم تصميمMilvus Distributed لعمليات النشر على نطاق واسع، وهو قادر على التعامل مع مجموعات البيانات من 100 مليون إلى عشرات المليارات من المتجهات.
  • +
+

+ + Select deployment option for your use case + حدد خيار النشر لحالة الاستخدام الخاصة بك

+

مقارنة بين الوظائف

+ + + + + + + + + + + +
الميزةميلفوس لايتميلفوس مستقلميلفوس الموزع
SDK / العميل ليريبايثون
gRPC
Python
Go
Java Java
Node.js
C#
RESTful
Python
Java
Java Go
Node.js
C#
RESTful
أنواع البياناتمتجه كثيف
متجه متناثر
متجه ثنائي متجه ثنائي
منطقية
عدد صحيح
نقطة عائمة
متغير شار
صفيف
JSON
متجه كثيف
متجه متناثر
متجه ثنائي متجه ثنائي
منطقي
عدد صحيح
نقطة عائمة
متغير شار
صفيف
JSON
متجه كثيف
متجه متناثر
متجه ثنائي متجه ثنائي
منطقية
عدد صحيح
نقطة عائمة
متغير شار
صفيف
JSON
إمكانيات البحثالبحث في المتجهات (بحث المتجهات (بحث ANN)
تصفية البيانات الوصفية
البحث في النطاق البحث في النطاق
الاستعلام العددي
الحصول على الكيانات حسب المفتاح الأساسي
البحث الهجين
البحث في المتجهات (بحث المتجهات (بحث ANN)
تصفية البيانات الوصفية
البحث في النطاق
الاستعلام العددي
الحصول على الكيانات حسب المفتاح الأساسي
البحث الهجين
البحث في المتجهات (بحث متجه (بحث الشبكة النانوية)
تصفية البيانات الوصفية
البحث في النطاق
الاستعلام العددي
الحصول على الكيانات حسب المفتاح الأساسي
البحث الهجين
عمليات CRUD✔️✔️✔️
إدارة البيانات المتقدمةغير متاحالتحكم في الوصول
التقسيم
مفتاح التقسيم مفتاح التقسيم
التحكم في الوصول
التقسيم
مفتاح التقسيم مفتاح التقسيم
تجميع الموارد المادية
مستويات الاتساققويقوي
الثبات المحدود
جلسة جلسة
في نهاية المطاف
قوي
الثبات المحدود
جلسة جلسة
الحدثية الحدثية
diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.json b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.json new file mode 100644 index 000000000..bfd7887c3 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.json @@ -0,0 +1 @@ +{"codeList":["$ go get -u github.com/milvus-io/milvus-sdk-go/v2\n"],"headingContent":"Install Milvus Go SDK","anchorList":[{"label":"تثبيت Milvus Go SDK","href":"Install-Milvus-Go-SDK","type":1,"isActive":false},{"label":"المتطلبات","href":"Requirement","type":2,"isActive":false},{"label":"تثبيت Milvus GO SDK","href":"Install-Milvus-GO-SDK","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.md b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.md new file mode 100644 index 000000000..aa77447c1 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-go.md @@ -0,0 +1,83 @@ +--- +id: install-go.md +label: Install GO SDK +related_key: SDK +summary: تعرف على كيفية تثبيت GO SDK الخاص بـ Milvus. +title: تثبيت Milvus Go SDK +--- +

تثبيت Milvus Go SDK

يصف هذا الموضوع كيفية تثبيت Milvus Go SDK لـ Milvus.

+

يدعم الإصدار الحالي من Milvus حزم SDK في Python و Node.js و GO و Java.

+

المتطلبات

مطلوب GO (1.17 أو أحدث).

+

تثبيت Milvus GO SDK

قم بتثبيت Milvus GO SDK والتبعيات عبر go get.

+
$ go get -u github.com/milvus-io/milvus-sdk-go/v2
+
+

الخطوة التالية

بعد تثبيت Milvus GO SDK، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.json b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.json new file mode 100644 index 000000000..3651475a2 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.json @@ -0,0 +1 @@ +{"codeList":["\n io.milvus\n milvus-sdk-java\n 2.5.4\n\n","implementation 'io.milvus:milvus-sdk-java:2.5.4'\n"],"headingContent":"Install Milvus Java SDK","anchorList":[{"label":"تثبيت Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":1,"isActive":false},{"label":"المتطلبات","href":"Requirement","type":2,"isActive":false},{"label":"تثبيت Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.md b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.md new file mode 100644 index 000000000..8d7750290 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-java.md @@ -0,0 +1,100 @@ +--- +id: install-java.md +label: Install Java SDK +related_key: SDK +summary: تعرف على كيفية تثبيت مجموعة أدوات تطوير البرمجيات Java SDK الخاصة بـ Milvus. +title: تثبيت Milvus Java SDK +--- +

تثبيت Milvus Java SDK

يصف هذا الموضوع كيفية تثبيت Milvus Java SDK لـ Milvus.

+

يدعم الإصدار الحالي من Milvus حزم SDK في Python و Node.js و GO و Java.

+

المتطلبات

    +
  • جافا (8 أو أحدث)
  • +
  • أباتشي مافن أو غرادل/غريلز
  • +
+

تثبيت Milvus Java SDK

قم بتشغيل الأمر التالي لتثبيت Milvus Java SDK.

+
    +
  • أباتشي مافن
  • +
+
<dependency>
+    <groupId>io.milvus</groupId>
+    <artifactId>milvus-sdk-java</artifactId>
+    <version>2.5.4</version>
+</dependency>
+
+
    +
  • غرادل/غريلز
  • +
+
implementation 'io.milvus:milvus-sdk-java:2.5.4'
+
+

ما التالي

بعد تثبيت Milvus Java SDK، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.json b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.json new file mode 100644 index 000000000..c236285c3 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.json @@ -0,0 +1 @@ +{"codeList":["npm install @zilliz/milvus2-sdk-node\n# or ...\nyarn add @zilliz/milvus2-sdk-node\n"],"headingContent":"Install Milvus Nodejs SDK","anchorList":[{"label":"تثبيت Milvus Nodejs SDK لميلفوس","href":"Install-Milvus-Nodejs-SDK","type":1,"isActive":false},{"label":"التوافق","href":"Compatibility","type":2,"isActive":false},{"label":"المتطلبات","href":"Requirement","type":2,"isActive":false},{"label":"التثبيت","href":"Installation","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.md b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.md new file mode 100644 index 000000000..465503832 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-node.md @@ -0,0 +1,118 @@ +--- +id: install-node.md +label: Install Node.js SDK +related_key: SDK +summary: تعرّف على كيفية تثبيت Node.js SDK لـ Milvus. +title: تثبيت Milvus Nodejs SDK لميلفوس +--- +

تثبيت Milvus Nodejs SDK لميلفوس

يصف هذا الموضوع كيفية تثبيت Milvus Node.js SDK لـ Milvus.

+

التوافق

تُظهر المجموعة التالية إصدارات Milvus والإصدارات الموصى بها من Milvus/ ميلفوس2-sdk-node:

+ + + + + + + + + + + + + +
إصدار ميلفوسإصدار @zilliz/milvus2-sdk-node الموصى به
2.5.xالأحدث
2.4.x2.4.10
2.3.x2.3.5
2.2.x2.2.x
2.1.x2.1.x
2.0.12.0.0, 2.0.1
2.0.02.0.0
+

المتطلبات

Node.js v18+

+

التثبيت

الطريقة الموصى بها لبدء استخدام عميل Milvus node.js هي استخدام npm (مدير حزم العقدة) لتثبيت التبعية في مشروعك.

+
npm install @zilliz/milvus2-sdk-node
+# or ...
+yarn add @zilliz/milvus2-sdk-node
+
+

سيؤدي ذلك إلى تنزيل Milvus node.jsdk وإضافة إدخال تبعية في ملف package.json الخاص بك.

+

الخطوة التالية

بعد تثبيت Milvus Node.js SDK، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.json b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.json new file mode 100644 index 000000000..df6d6d1ad --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.json @@ -0,0 +1 @@ +{"codeList":["$ python3 -m pip install pymilvus==2.5.3\n","$ python3 -c \"from pymilvus import Collection\"\n"],"headingContent":"Install Milvus Python SDK","anchorList":[{"label":"تثبيت Milvus Python SDK","href":"Install-Milvus-Python-SDK","type":1,"isActive":false},{"label":"المتطلبات","href":"Requirements","type":2,"isActive":false},{"label":"قم بتثبيت PyMilvus عبر النقطة","href":"Install-PyMilvus-via-pip","type":2,"isActive":false},{"label":"تحقق من التثبيت","href":"Verify-installation","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.md b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.md new file mode 100644 index 000000000..b9f430406 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/install_SDKs/install-pymilvus.md @@ -0,0 +1,109 @@ +--- +id: install-pymilvus.md +label: Install PyMilvus +related_key: SDK +summary: تعرّف على كيفية تثبيت Python SDK لـ Milvus. +title: تثبيت Milvus Python SDK +--- +

تثبيت Milvus Python SDK

يصف هذا الموضوع كيفية تثبيت Milvus Python SDK pymilvus لـ Milvus.

+

يدعم الإصدار الحالي من Milvus حزم SDK في Python و Node.js و GO و Java.

+

المتطلبات

    +
  • مطلوب بايثون 3.7 أو أحدث.
  • +
  • تثبيت بروتوبوف جوجل. يمكنك تثبيته باستخدام الأمر pip3 install protobuf==3.20.0.
  • +
  • تم تثبيت grpcio-tools. يمكنك تثبيته باستخدام الأمر pip3 install grpcio-tools.
  • +
+

قم بتثبيت PyMilvus عبر النقطة

يتوفر PyMilvus في فهرس حزمة Python.

+
+يوصى بتثبيت إصدار PyMilvus الذي يطابق إصدار خادم Milvus الذي قمت بتثبيته. لمزيد من المعلومات، راجع ملاحظات الإصدار.
+
$ python3 -m pip install pymilvus==2.5.3
+
+

تحقق من التثبيت

إذا تم تثبيت PyMilvus بشكل صحيح، فلن يتم رفع أي استثناء عند تشغيل الأمر التالي.

+
$ python3 -c "from pymilvus import Collection"
+
+

ما التالي

بعد تثبيت PyMilvus، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/milvus_lite.json b/localization/v2.5.x/site/ar/getstarted/milvus_lite.json new file mode 100644 index 000000000..cdc9c76f6 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/milvus_lite.json @@ -0,0 +1 @@ +{"codeList":["pip install -U pymilvus\n","from pymilvus import MilvusClient\nclient = MilvusClient(\"./milvus_demo.db\")\n","from pymilvus import MilvusClient\nimport numpy as np\n\nclient = MilvusClient(\"./milvus_demo.db\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=384 # The vectors we will use in this demo has 384 dimensions\n)\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# For illustration, here we use fake vectors with random numbers (384 dimension).\n\nvectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]\ndata = [ {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"} for i in range(len(vectors)) ]\nres = client.insert(\n collection_name=\"demo_collection\",\n data=data\n)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=[vectors[0]],\n filter=\"subject == 'history'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# a query that retrieves all entities matching filter expressions.\nres = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# delete\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n)\nprint(res)\n","# Install\npip install -U \"pymilvus[bulk_writer]\"\n\nmilvus-lite dump -h\n\nusage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]\n\noptional arguments:\n -h, --help show this help message and exit\n -d DB_FILE, --db-file DB_FILE\n milvus lite db file\n -c COLLECTION, --collection COLLECTION\n collection that need to be dumped\n -p PATH, --path PATH dump file storage dir\n","milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir\n# ./milvus_demo.db: milvus lite db file\n# demo_collection: collection that need to be dumped\n#./data_dir : dump file storage dir\n"],"headingContent":"Run Milvus Lite Locally","anchorList":[{"label":"تشغيل ميلفوس لايت محلياً","href":"Run-Milvus-Lite-Locally","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد ميلفوس لايت","href":"Set-up-Milvus-Lite","type":2,"isActive":false},{"label":"الاتصال بميلفوس لايت","href":"Connect-to-Milvus-Lite","type":2,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"ترحيل البيانات من ميلفوس لايت","href":"Migrating-data-from-Milvus-Lite","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/milvus_lite.md b/localization/v2.5.x/site/ar/getstarted/milvus_lite.md new file mode 100644 index 000000000..20a21773c --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/milvus_lite.md @@ -0,0 +1,412 @@ +--- +id: milvus_lite.md +summary: ابدأ مع ميلفوس لايت +title: تشغيل ميلفوس لايت محلياً +--- +

تشغيل ميلفوس لايت محلياً

توضح هذه الصفحة كيفية تشغيل Milvus محلياً باستخدام Milvus Lite. Milvus Lite هو نسخة خفيفة الوزن من Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر تعمل على تشغيل تطبيقات الذكاء الاصطناعي مع تضمينات المتجهات والبحث عن التشابه.

+

نظرة عامة

يمكن استيراد Milvus Lite إلى تطبيق Python الخاص بك، مما يوفر وظيفة البحث المتجه الأساسية في Milvus. تم تضمين Milvus Lite بالفعل في مجموعة أدوات تطوير البرمجيات الخاصة بـ Python SDK الخاصة بـ Milvus. يمكن نشره ببساطة باستخدام pip install pymilvus.

+

باستخدام Milvus Lite، يمكنك البدء في إنشاء تطبيق ذكاء اصطناعي مع البحث عن التشابه المتجه في غضون دقائق! ميلفوس لايت جيد للتشغيل في البيئة التالية:

+
    +
  • Jupyter Notebook / Google Colab
  • +
  • أجهزة الكمبيوتر المحمولة
  • +
  • أجهزة الحافة
  • +
+

يشترك Milvus Lite في نفس واجهة برمجة التطبيقات مع Milvus Standalone و Distributed، ويغطي معظم الميزات مثل ثبات البيانات المتجهة وإدارتها، وعمليات CRUD المتجهة، والبحث المتجه المتناثر والكثيف عن المتجهات، وتصفية البيانات الوصفية، والمتجهات المتعددة والبحث الهجين. يوفران معًا تجربة متسقة عبر أنواع مختلفة من البيئات، بدءًا من الأجهزة المتطورة إلى المجموعات في السحابة، بما يتناسب مع حالات الاستخدام ذات الأحجام المختلفة. باستخدام نفس الكود من جانب العميل، يمكنك تشغيل تطبيقات GenAI باستخدام Milvus Lite على كمبيوتر محمول أو دفتر Jupyter Notebook، أو Milvus Standalone على حاوية Docker، أو Milvus Distributed على مجموعة Kubernetes ضخمة الحجم تخدم مليارات المتجهات في الإنتاج.

+

المتطلبات الأساسية

يدعم ميلفوس لايت حاليًا البيئات التالية:

+
    +
  • Ubuntu >= 20.04 (x86_64 و arm64)
  • +
  • MacOS >= 11.0 (Apple Silicon M1/M2 و x86_64)
  • +
+

يُرجى ملاحظة أن Milvus Lite مناسب فقط لحالات استخدام البحث المتجه على نطاق صغير. لحالات الاستخدام على نطاق واسع، نوصي باستخدام Milvus Standalone أو Milvus Distributed. يمكنك أيضًا التفكير في استخدام Milvus المُدار بالكامل على Zilliz Cloud.

+

إعداد ميلفوس لايت

pip install -U pymilvus
+
+

نوصي باستخدام pymilvus. نظرًا لأن milvus-lite مضمن في pymilvus الإصدار 2.4.2 أو أعلى، يمكنك pip install مع -U لفرض التحديث إلى أحدث إصدار ويتم تثبيت milvus-lite تلقائيًا.

+

إذا كنت ترغب في تثبيت الحزمة milvus-lite بشكل صريح، أو كنت قد قمت بتثبيت إصدار أقدم من milvus-lite وترغب في تحديثه، يمكنك القيام بذلك pip install -U milvus-lite.

+

الاتصال بميلفوس لايت

في pymilvus ، حدد اسم ملف محلي كمعلمة uri لـ MilvusClient سيستخدم Milvus Lite.

+
from pymilvus import MilvusClient
+client = MilvusClient("./milvus_demo.db")
+
+

بعد تشغيل مقتطف الشفرة أعلاه، سيتم إنشاء ملف قاعدة بيانات باسم milvus_demo.db في المجلد الحالي.

+
+

ملحوظة: لاحظ أن نفس واجهة برمجة التطبيقات تنطبق أيضًا على Milvus Standalone و Milvus Distributed و Zilliz Cloud، والفرق الوحيد هو استبدال اسم الملف المحلي بنقطة نهاية الخادم البعيد وبيانات الاعتماد، على سبيل المثالclient = MilvusClient(uri="http://localhost:19530", token="username:password").

+
+

أمثلة

فيما يلي عرض توضيحي بسيط يوضح كيفية استخدام Milvus Lite للبحث عن النص. هناك أمثلة أكثر شمولاً لاستخدام Milvus Lite لبناء تطبيقات مثل RAG، والبحث عن الصور، واستخدام Milvus Lite في إطار عمل RAG الشهير مثل LangChain و LlamaIndex!

+
from pymilvus import MilvusClient
+import numpy as np
+
+client = MilvusClient("./milvus_demo.db")
+client.create_collection(
+    collection_name="demo_collection",
+    dimension=384  # The vectors we will use in this demo has 384 dimensions
+)
+
+# Text strings to search from.
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+# For illustration, here we use fake vectors with random numbers (384 dimension).
+
+vectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]
+data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ]
+res = client.insert(
+    collection_name="demo_collection",
+    data=data
+)
+
+# This will exclude any text in "history" subject despite close to the query vector.
+res = client.search(
+    collection_name="demo_collection",
+    data=[vectors[0]],
+    filter="subject == 'history'",
+    limit=2,
+    output_fields=["text", "subject"],
+)
+print(res)
+
+# a query that retrieves all entities matching filter expressions.
+res = client.query(
+    collection_name="demo_collection",
+    filter="subject == 'history'",
+    output_fields=["text", "subject"],
+)
+print(res)
+
+# delete
+res = client.delete(
+    collection_name="demo_collection",
+    filter="subject == 'history'",
+)
+print(res)
+
+

الحدود

عند تشغيل Milvus Lite، لاحظ أن بعض الميزات غير مدعومة. تلخص الجداول التالية حدود الاستخدام على Milvus Lite.

+

المجموعة

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الطريقة / المعلمةمدعومة في ميلفوس لايت
إنشاء_مجموعة()الدعم بمعلمات محدودة
collection_nameY
dimensionY
primary_field_nameY
id_typeY
vector_field_nameY
metric_typeY
auto_idY
schemaY
index_paramsY
enable_dynamic_fieldY
num_shardsN
partition_key_fieldN
num_partitionsN
consistency_levelN (يدعم فقط Strong ؛ سيتم التعامل مع أي تكوين على أنه Strong).
get_collection_stats()يدعم الحصول على إحصائيات المجموعة.
collection_nameY
timeoutY
وصف_التجميع()num_shardsو consistency_level و collection_id في الاستجابة غير صالحة.
timeoutY
لديها_مجموعة()يدعم التحقق مما إذا كانت المجموعة موجودة.
collection_nameY
timeoutY
سرد_المجموعات()يدعم سرد كل المجموعات.
إسقاط_مجموعة()يدعم إسقاط مجموعة.
collection_nameY
timeoutY
إعادة تسمية_مجموعة()إعادة تسمية مجموعة غير مدعومة.
+

الحقل والمخطط

+ + + + + + + + + + + + + + + + + + + +
الطريقة / المعلمةمدعوم في ميلفوس لايت
إنشاء_مخطط()الدعم بمعلمات محدودة
auto_idY
enable_dynamic_fieldY
primary_fieldY
partition_key_fieldN
إضافة_حقل()الدعم بمعلمات محدودة
field_nameY
datatypeY
is_primaryY
max_lengthY
element_typeY
max_capacityY
dimY
is_partition_keyN
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الطريقة / المعلمةمدعوم في ميلفوس لايت
بحث()الدعم بمعلمات محدودة
collection_nameY
dataY
filterY
limitY
output_fieldsY
search_paramsY
timeoutY
partition_namesN
anns_fieldY
استعلام()الدعم بمعلمات محدودة
collection_nameY
filterY
output_fieldsY
timeoutY
idsY
partition_namesN
الحصول على ()الدعم بمعلمات محدودة
collection_nameY
idsY
output_fieldsY
timeoutY
partition_namesN
حذف()الدعم بمعلمات محدودة
collection_nameY
idsY
timeoutY
filterY
partition_nameN
إدراج ()الدعم بمعلمات محدودة
collection_nameY
dataY
timeoutY
partition_nameN
إدراج ()الدعم بمعلمات محدودة
collection_nameY
dataY
timeoutY
partition_nameN
+

التحميل والإصدار

+ + + + + + + + + + + + + + +
الطريقة / المعلمةمدعوم في ميلفوس لايت
تحميل_مجموعة()Y
collection_nameY
timeoutY
إصدار_مجموعة()Y
collection_nameY
timeoutY
الحصول على_حالة_التحميل()الحصول على حالة التحميل غير مدعوم.
تحديث_التحميل()تحميل البيانات التي تم إلغاء تحميلها من مجموعة محملة غير معتمد.
إغلاق()Y
+

فهرس

+ + + + + + + + + + + + + + + + + + + +
الطريقة / المعلمةمدعوم في ميلفوس لايت
list_indexes()سرد الفهارس مدعوم.
collection_nameY
field_nameY
إنشاء_الفهرس()يدعم فقط نوع الفهرس FLAT.
index_paramsY
timeoutY
إسقاط_الفهرس()إسقاط الفهارس مدعوم.
collection_nameY
index_nameY
timeoutY
وصف_الفهرس()وصف الفهارس معتمد.
collection_nameY
index_nameY
timeoutY
+

أنواع الفهرس المتجه

يدعم Milvus Lite نوع الفهرس المسطح فقط. يستخدم نوع FLAT بغض النظر عن نوع الفهرس المحدد في المجموعة.

+

ميزات البحث

يدعم Milvus Lite المتجهات المتفرقة والمتجهات المتعددة والبحث الهجين.

+

التقسيم

لا يدعم Milvus Lite الأقسام والطرق المتعلقة بالتقسيم.

+

المستخدمون والأدوار

لا يدعم Milvus Lite المستخدمين والأدوار والأساليب ذات الصلة.

+

الأسماء المستعارة

لا يدعم Milvus Lite الأسماء المستعارة والأساليب المتعلقة بالأسماء المستعارة.

+

ترحيل البيانات من ميلفوس لايت

يمكن تصدير جميع البيانات المخزنة في Milvus Lite بسهولة وتحميلها إلى أنواع أخرى من نشر Milvus، مثل Milvus Standalone على Docker، أو Milvus Distributed على K8s، أو Milvus المدارة بالكامل على Zilliz Cloud.

+

يوفّر Milvus Lite أداة سطر أوامر يمكنها تفريغ البيانات في ملف json، والذي يمكن استيراده إلى milvus وZilliz Cloud(الخدمة السحابية المدارة بالكامل لـ Milvus). سيتم تثبيت أمر ميلفوس لايت مع حزمة ميلفوس لايت بايثون

+
# Install
+pip install -U "pymilvus[bulk_writer]"
+
+milvus-lite dump -h
+
+usage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -d DB_FILE, --db-file DB_FILE
+                        milvus lite db file
+  -c COLLECTION, --collection COLLECTION
+                        collection that need to be dumped
+  -p PATH, --path PATH  dump file storage dir
+
+

يقوم المثال التالي بتفريغ جميع البيانات من مجموعة demo_collection المخزنة في ./milvus_demo.db (ملف قاعدة بيانات Milvus Lite)

+

لتصدير البيانات:

+
milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
+# ./milvus_demo.db: milvus lite db file
+# demo_collection: collection that need to be dumped
+#./data_dir : dump file storage dir
+
+

باستخدام ملف التفريغ، يمكنك تحميل البيانات إلى زيليز كلاود عبر استيراد البيانات، أو تحميل البيانات إلى خوادم ميلفوس عبر الإدراج بالجملة.

+

الخطوة التالية

بعد الاتصال بـ Milvus Lite، يمكنك

+ diff --git a/localization/v2.5.x/site/ar/getstarted/quickstart.json b/localization/v2.5.x/site/ar/getstarted/quickstart.json new file mode 100644 index 000000000..cbbf0e5e2 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/quickstart.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","if client.has_collection(collection_name=\"demo_collection\"):\n client.drop_collection(collection_name=\"demo_collection\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=768, # The vectors we will use in this demo has 768 dimensions\n)\n","$ pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# If connection to https://huggingface.co/ failed, uncomment the following path\n# import os\n# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n\n# This will download a small embedding model \"paraphrase-albert-small-v2\" (~50MB).\nembedding_fn = model.DefaultEmbeddingFunction()\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = embedding_fn.encode_documents(docs)\n# The output vector has 768 dimensions, matching the collection that we just created.\nprint(\"Dim:\", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)\n\n# Each entity has id, vector representation, raw text, and a subject label that we use\n# to demo metadata filtering later.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Dim: 768 (768,)\nData has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","import random\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# Use fake representation with random vectors (768 dimension).\nvectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","res = client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res)\n","{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}\n","query_vectors = embedding_fn.encode_queries([\"Who is Alan Turing?\"])\n# If you don't have the embedding function you can use a fake vector to finish the demo:\n# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]\n\nres = client.search(\n collection_name=\"demo_collection\", # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nprint(res)\n","data: [\"[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]\"] , extra_info: {'cost': 0}\n","# Insert more docs in another subject.\ndocs = [\n \"Machine learning has been used for drug design.\",\n \"Computational synthesis with AI algorithms predicts molecular properties.\",\n \"DDR1 is involved in cancers and fibrosis.\",\n]\nvectors = embedding_fn.encode_documents(docs)\ndata = [\n {\"id\": 3 + i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"biology\"}\n for i in range(len(vectors))\n]\n\nclient.insert(collection_name=\"demo_collection\", data=data)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=embedding_fn.encode_queries([\"tell me AI related information\"]),\n filter=\"subject == 'biology'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\n\nprint(res)\n","data: [\"[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]\"] , extra_info: {'cost': 0}\n","res = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\n","res = client.query(\n collection_name=\"demo_collection\",\n ids=[0, 2],\n output_fields=[\"vector\", \"text\", \"subject\"],\n)\n","# Delete entities by primary key\nres = client.delete(collection_name=\"demo_collection\", ids=[0, 2])\n\nprint(res)\n\n# Delete entities by a filter expression\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'biology'\",\n)\n\nprint(res)\n","[0, 2]\n[3, 4, 5]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","# Drop collection\nclient.drop_collection(collection_name=\"demo_collection\")\n","client = MilvusClient(uri=\"http://localhost:19530\", token=\"root:Milvus\")\n"],"headingContent":"Quickstart with Milvus Lite","anchorList":[{"label":"بداية سريعة مع ميلفوس لايت","href":"Quickstart-with-Milvus-Lite","type":1,"isActive":false},{"label":"تثبيت ميلفوس","href":"Install-Milvus","type":2,"isActive":false},{"label":"إعداد قاعدة بيانات المتجهات","href":"Set-Up-Vector-Database","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-a-Collection","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-Data","type":2,"isActive":false},{"label":"تمثيل النص باستخدام المتجهات","href":"Represent-text-with-vectors","type":2,"isActive":false},{"label":"[بديل] استخدام تمثيل وهمي مع متجهات عشوائية","href":"Alternatively-Use-fake-representation-with-random-vectors","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-Data","type":2,"isActive":false},{"label":"البحث الدلالي","href":"Semantic-Search","type":2,"isActive":false},{"label":"البحث المتجه مع تصفية البيانات الوصفية","href":"Vector-Search-with-Metadata-Filtering","type":2,"isActive":false},{"label":"حذف الكيانات","href":"Delete-Entities","type":2,"isActive":false},{"label":"تحميل البيانات الموجودة","href":"Load-Existing-Data","type":2,"isActive":false},{"label":"حذف المجموعة","href":"Drop-the-collection","type":2,"isActive":false},{"label":"معرفة المزيد","href":"Learn-More","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/quickstart.md b/localization/v2.5.x/site/ar/getstarted/quickstart.md new file mode 100644 index 000000000..43fca4b3d --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/quickstart.md @@ -0,0 +1,408 @@ +--- +id: quickstart.md +summary: ابدأ مع ميلفوس +title: البداية سريعة +--- +

بداية سريعة مع ميلفوس لايت

Open In Colab +GitHub Repository

+

يمكن للمتجهات، وهي تنسيق بيانات المخرجات لنماذج الشبكات العصبية، ترميز المعلومات بفعالية وتؤدي دورًا محوريًا في تطبيقات الذكاء الاصطناعي مثل قاعدة المعرفة والبحث الدلالي والتوليد المعزز للاسترجاع (RAG) وغيرها.

+

Milvus هي قاعدة بيانات متجهة مفتوحة المصدر تناسب تطبيقات الذكاء الاصطناعي من كل الأحجام بدءًا من تشغيل روبوت دردشة تجريبي في دفتر ملاحظات Jupyter إلى بناء بحث على نطاق الويب يخدم مليارات المستخدمين. في هذا الدليل، سنرشدك في هذا الدليل إلى كيفية إعداد Milvus محليًا في غضون دقائق واستخدام مكتبة عميل Python لإنشاء المتجهات وتخزينها والبحث فيها.

+

تثبيت ميلفوس

في هذا الدليل نستخدم Milvus Lite، وهي مكتبة بايثون مضمنة في pymilvus والتي يمكن تضمينها في تطبيق العميل. يدعم Milvus أيضًا النشر على Docker و Kubernetes لحالات استخدام الإنتاج.

+

قبل البدء، تأكد من توفر Python 3.8+ في البيئة المحلية. قم بتثبيت pymilvus الذي يحتوي على مكتبة عميل بايثون وميلفوس لايت:

+
$ pip install -U pymilvus
+
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+
+

إعداد قاعدة بيانات المتجهات

لإنشاء قاعدة بيانات Milvus vector محلية، ما عليك سوى إنشاء MilvusClient عن طريق تحديد اسم ملف لتخزين جميع البيانات، مثل "milvus_demo.db".

+
from pymilvus import MilvusClient
+
+client = MilvusClient("milvus_demo.db")
+
+

إنشاء مجموعة

في ميلفوس، نحتاج إلى مجموعة لتخزين المتجهات والبيانات الوصفية المرتبطة بها. يمكنك التفكير بها كجدول في قواعد بيانات SQL التقليدية. عند إنشاء مجموعة، يمكنك تحديد بارامترات المخطط والفهرس لتكوين مواصفات المتجهات مثل الأبعاد وأنواع الفهرس والمقاييس البعيدة. هناك أيضًا مفاهيم معقدة لتحسين الفهرس لأداء البحث المتجه. في الوقت الحالي، دعنا نركز فقط على الأساسيات واستخدام الافتراضي لكل شيء ممكن. كحد أدنى، ما عليك سوى تعيين اسم المجموعة وبُعد الحقل المتجه للمجموعة.

+
if client.has_collection(collection_name="demo_collection"):
+    client.drop_collection(collection_name="demo_collection")
+client.create_collection(
+    collection_name="demo_collection",
+    dimension=768,  # The vectors we will use in this demo has 768 dimensions
+)
+
+

في الإعداد أعلاه,

+
    +
  • يستخدم حقلا المفتاح الأساسي والمتجه اسميهما الافتراضيين ("معرف" و"متجه").
  • +
  • يتم تعيين نوع القياس (تعريف مسافة المتجه) إلى قيمته الافتراضية(COSINE).
  • +
  • يقبل حقل المفتاح الأساسي الأعداد الصحيحة ولا يزيد تلقائيًا (أي لا يستخدم ميزة المعرف التلقائي) بدلاً من ذلك، يمكنك تحديد مخطط المجموعة رسميًا باتباع هذه التعليمات.
  • +
+

إعداد البيانات

في هذا الدليل، نستخدم المتجهات لإجراء بحث دلالي على النص. نحتاج إلى إنشاء متجهات للنص عن طريق تنزيل نماذج التضمين. يمكن القيام بذلك بسهولة باستخدام الدوال المساعدة من مكتبة pymilvus[model].

+

تمثيل النص باستخدام المتجهات

أولاً، قم بتثبيت مكتبة النماذج. تتضمن هذه الحزمة أدوات التعلم الآلي الأساسية مثل PyTorch. قد يستغرق تنزيل الحزمة بعض الوقت إذا لم يسبق لبيئتك المحلية تثبيت PyTorch.

+
$ pip install "pymilvus[model]"
+
+

توليد تضمينات المتجهات مع النموذج الافتراضي. يتوقع ميلفوس أن يتم إدراج البيانات منظمة كقائمة من القواميس، حيث يمثل كل قاموس سجل بيانات، ويطلق عليه اسم كيان.

+
from pymilvus import model
+
+# If connection to https://huggingface.co/ failed, uncomment the following path
+# import os
+# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
+
+# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
+embedding_fn = model.DefaultEmbeddingFunction()
+
+# Text strings to search from.
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+vectors = embedding_fn.encode_documents(docs)
+# The output vector has 768 dimensions, matching the collection that we just created.
+print("Dim:", embedding_fn.dim, vectors[0].shape)  # Dim: 768 (768,)
+
+# Each entity has id, vector representation, raw text, and a subject label that we use
+# to demo metadata filtering later.
+data = [
+    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
+    for i in range(len(vectors))
+]
+
+print("Data has", len(data), "entities, each with fields: ", data[0].keys())
+print("Vector dim:", len(data[0]["vector"]))
+
+
Dim: 768 (768,)
+Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
+Vector dim: 768
+
+

[بديل] استخدام تمثيل وهمي مع متجهات عشوائية

إذا لم تتمكن من تنزيل النموذج بسبب مشاكل في الشبكة، كحل بديل، يمكنك استخدام متجهات عشوائية لتمثيل النص مع الاستمرار في إنهاء المثال. فقط لاحظ أن نتيجة البحث لن تعكس التشابه الدلالي لأن المتجهات مزيفة.

+
import random
+
+# Text strings to search from.
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+# Use fake representation with random vectors (768 dimension).
+vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
+data = [
+    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
+    for i in range(len(vectors))
+]
+
+print("Data has", len(data), "entities, each with fields: ", data[0].keys())
+print("Vector dim:", len(data[0]["vector"]))
+
+
Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
+Vector dim: 768
+
+

إدراج البيانات

دعنا ندرج البيانات في المجموعة:

+
res = client.insert(collection_name="demo_collection", data=data)
+
+print(res)
+
+
{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
+
+

يمكننا الآن إجراء عمليات بحث دلالية من خلال تمثيل نص استعلام البحث كمتجه، وإجراء بحث تشابه المتجهات على ميلفوس.

+

يقبل Milvus طلب بحث متجه واحد أو عدة طلبات بحث متجه في نفس الوقت. قيمة متغير query_vectors هي قائمة من المتجهات، حيث يكون كل متجه عبارة عن مصفوفة من الأرقام العائمة.

+
query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
+# If you don't have the embedding function you can use a fake vector to finish the demo:
+# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
+
+res = client.search(
+    collection_name="demo_collection",  # target collection
+    data=query_vectors,  # query vectors
+    limit=2,  # number of returned entities
+    output_fields=["text", "subject"],  # specifies fields to be returned
+)
+
+print(res)
+
+
data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
+
+

ويكون الناتج عبارة عن قائمة من النتائج، كل منها مخصص لاستعلام بحث متجه. يحتوي كل استعلام على قائمة بالنتائج، حيث تحتوي كل نتيجة على المفتاح الأساسي للكيان، والمسافة إلى متجه الاستعلام، وتفاصيل الكيان مع output_fields.

+

البحث المتجه مع تصفية البيانات الوصفية

يمكنك أيضًا إجراء بحث متجه مع الأخذ في الاعتبار قيم البيانات الوصفية (تسمى حقول "قياسية" في ميلفوس، حيث تشير البيانات القياسية إلى بيانات غير متجهة). يتم ذلك باستخدام تعبير مرشح يحدد معايير معينة. لنرى كيفية البحث والتصفية باستخدام الحقل subject في المثال التالي.

+
# Insert more docs in another subject.
+docs = [
+    "Machine learning has been used for drug design.",
+    "Computational synthesis with AI algorithms predicts molecular properties.",
+    "DDR1 is involved in cancers and fibrosis.",
+]
+vectors = embedding_fn.encode_documents(docs)
+data = [
+    {"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
+    for i in range(len(vectors))
+]
+
+client.insert(collection_name="demo_collection", data=data)
+
+# This will exclude any text in "history" subject despite close to the query vector.
+res = client.search(
+    collection_name="demo_collection",
+    data=embedding_fn.encode_queries(["tell me AI related information"]),
+    filter="subject == 'biology'",
+    limit=2,
+    output_fields=["text", "subject"],
+)
+
+print(res)
+
+
data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
+
+

بشكل افتراضي، لا تتم فهرسة الحقول العددية. إذا كنت بحاجة إلى إجراء بحث مفهرس للبيانات الوصفية في مجموعة بيانات كبيرة، يمكنك التفكير في استخدام مخطط ثابت وتشغيل الفهرس أيضًا لتحسين أداء البحث.

+

بالإضافة إلى البحث المتجه، يمكنك أيضًا إجراء أنواع أخرى من عمليات البحث:

+

الاستعلام

الاستعلام() هو عملية تسترجع جميع الكيانات المطابقة لمعيار ما، مثل تعبير مرشح أو مطابقة بعض المعرفات.

+

على سبيل المثال، استرداد جميع الكيانات التي يحتوي حقلها القياسي على قيمة معينة:

+
res = client.query(
+    collection_name="demo_collection",
+    filter="subject == 'history'",
+    output_fields=["text", "subject"],
+)
+
+

استرداد الكيانات مباشرةً حسب المفتاح الأساسي:

+
res = client.query(
+    collection_name="demo_collection",
+    ids=[0, 2],
+    output_fields=["vector", "text", "subject"],
+)
+
+

حذف الكيانات

إذا كنت ترغب في حذف البيانات، يمكنك حذف الكيانات التي تحدد المفتاح الأساسي أو حذف جميع الكيانات المطابقة لتعبير مرشح معين.

+
# Delete entities by primary key
+res = client.delete(collection_name="demo_collection", ids=[0, 2])
+
+print(res)
+
+# Delete entities by a filter expression
+res = client.delete(
+    collection_name="demo_collection",
+    filter="subject == 'biology'",
+)
+
+print(res)
+
+
[0, 2]
+[3, 4, 5]
+
+

تحميل البيانات الموجودة

نظرًا لأن جميع بيانات Milvus Lite يتم تخزينها في ملف محلي، يمكنك تحميل جميع البيانات في الذاكرة حتى بعد انتهاء البرنامج، وذلك عن طريق إنشاء MilvusClient بالملف الموجود. على سبيل المثال، سيؤدي ذلك إلى استرداد المجموعات من ملف "milvus_demo.db" ومتابعة كتابة البيانات فيه.

+
from pymilvus import MilvusClient
+
+client = MilvusClient("milvus_demo.db")
+
+

حذف المجموعة

إذا كنت ترغب في حذف جميع البيانات الموجودة في مجموعة، يمكنك إسقاط المجموعة باستخدام

+
# Drop collection
+client.drop_collection(collection_name="demo_collection")
+
+

معرفة المزيد

يعتبر Milvus Lite رائعًا لبدء استخدام برنامج بايثون محلي. إذا كانت لديك بيانات على نطاق واسع أو ترغب في استخدام Milvus في الإنتاج، يمكنك التعرف على نشر Milvus على Docker و Kubernetes. تشترك جميع أنماط النشر في ميلفوس في نفس واجهة برمجة التطبيقات، لذلك لا تحتاج شيفرة جانب العميل إلى تغيير الكثير في حال الانتقال إلى وضع نشر آخر. ما عليك سوى تحديد URI والرمز المميز لخادم Milvus المنشور في أي مكان:

+
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
+
+

يوفر Milvus واجهة برمجة تطبيقات REST و gRPC، مع مكتبات العميل بلغات مثل Python و Java و Go و C# و Node.js.

diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.json new file mode 100644 index 000000000..6bbbdc506 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.json @@ -0,0 +1 @@ +{"codeList":["# Download the configuration file\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n\n# Start Milvus\n$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker-compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n"],"headingContent":"Run Milvus with Docker Compose (Linux)","anchorList":[{"label":"تشغيل Milvus باستخدام Docker Compose (لينكس)","href":"Run-Milvus-with-Docker-Compose-Linux","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت ميلفوس","href":"Install-Milvus","type":2,"isActive":false},{"label":"إيقاف وحذف ميلفوس","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.md new file mode 100644 index 000000000..c292b0e51 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker-compose.md @@ -0,0 +1,155 @@ +--- +id: install_standalone-docker-compose.md +label: Docker Compose +related_key: Docker Compose +summary: تعرف على كيفية تثبيت Milvus مستقل مع Docker Compose. +title: تشغيل Milvus باستخدام Docker Compose (لينكس) +--- +

تشغيل Milvus باستخدام Docker Compose (لينكس)

توضح هذه الصفحة كيفية تشغيل مثيل Milvus في Docker باستخدام Docker Compose.

+

المتطلبات الأساسية

+

تثبيت ميلفوس

يوفر Milvus ملف تكوين Docker Compose في مستودع Milvus. لتثبيت Milvus باستخدام Docker Compose، قم فقط بتشغيل

+
# Download the configuration file
+$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
+
+# Start Milvus
+$ sudo docker compose up -d
+
+Creating milvus-etcd  ... done
+Creating milvus-minio ... done
+Creating milvus-standalone ... done
+
+
+
    +
  • إذا فشلت في تشغيل الأمر أعلاه، يرجى التحقق مما إذا كان نظامك يحتوي على Docker Compose V1 مثبتاً على Docker Compose V1. إذا كانت هذه هي الحالة، ننصحك بالترحيل إلى Docker Compose V2 بسبب الملاحظات الموجودة في هذه الصفحة.

  • +
  • إذا واجهت أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل حول المشكلة، وسنقدم لك الدعم اللازم.

  • +
+
+

بعد بدء تشغيل Milvus,

+
    +
  • تم تشغيل الحاويات المسماة milvus-standalone و milvus-minio و milvus-etcd.
      +
    • لا تعرض حاوية milvus-etcd أي منافذ للمضيف وتقوم بتعيين بياناتها إلى وحدات التخزين/etcd في المجلد الحالي.
    • +
    • تخدم حاوية milvus-minio المنفذين 9090 و9091 محلياً باستخدام بيانات اعتماد المصادقة الافتراضية وتعيّن بياناتها إلى وحدات التخزين/minio في المجلد الحالي.
    • +
    • تخدم الحاوية المستقلة milvus-standalone المنافذ 19530 محلياً بالإعدادات الافتراضية وتعيّن بياناتها إلى وحدات التخزين/ميلفوس في المجلد الحالي.
    • +
  • +
+

يمكنك التحقق مما إذا كانت الحاويات قيد التشغيل باستخدام الأمر التالي:

+
$ sudo docker-compose ps
+
+      Name                     Command                  State                            Ports
+--------------------------------------------------------------------------------------------------------------------
+milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
+milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
+milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
+
+

يمكنك أيضًا الوصول إلى Milvus WebUI على http://127.0.0.1:9091/webui/ لمعرفة المزيد عن مثيل Milvus الخاص بك. للحصول على التفاصيل، راجع Milvus WebUI.

+

إيقاف وحذف ميلفوس

يمكنك إيقاف وحذف هذه الحاوية كما يلي

+
# Stop Milvus
+$ sudo docker compose down
+
+# Delete service data
+$ sudo rm -rf volumes
+
+

الخطوة التالية

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.json new file mode 100644 index 000000000..3dcfba87c --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["# Download the installation script\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh\n\n# Start the Docker container\n$ bash standalone_embed.sh start\n","# Stop Milvus\n$ bash standalone_embed.sh stop\n\n# Delete Milvus data\n$ bash standalone_embed.sh delete\n","# upgrade Milvus\n$ bash standalone_embed.sh upgrade\n"],"headingContent":"Run Milvus in Docker (Linux)","anchorList":[{"label":"تشغيل Milvus في Docker (لينكس)","href":"Run-Milvus-in-Docker-Linux","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت Milvus في Docker","href":"Install-Milvus-in-Docker","type":2,"isActive":false},{"label":"إيقاف وحذف ميلفوس","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.md new file mode 100644 index 000000000..aaabd762f --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-docker.md @@ -0,0 +1,142 @@ +--- +id: install_standalone-docker.md +label: Docker +related_key: Docker +summary: تعرف على كيفية تثبيت Milvus مستقل مع Docker. +title: تشغيل Milvus في Docker (لينكس) +--- +

تشغيل Milvus في Docker (لينكس)

توضح هذه الصفحة كيفية تشغيل مثيل Milvus في Docker.

+

المتطلبات الأساسية

+

تثبيت Milvus في Docker

يوفر Milvus نصاً برمجياً للتثبيت لتثبيته كحاوية دوكر. يتوفر البرنامج النصي في مستودع ميلفوس. لتثبيت Milvus في Docker، ما عليك سوى تشغيل

+
# Download the installation script
+$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
+
+# Start the Docker container
+$ bash standalone_embed.sh start
+
+
+

إذا واجهت أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل عن المشكلة، وسنقدم لك الدعم اللازم.

+
+

بعد تشغيل البرنامج النصي للتثبيت:

+
    +
  • تم تشغيل حاوية دوكر باسم milvus على المنفذ 19530.
  • +
  • تم تثبيت برنامج تضمين إلخd مع ميلفوس في نفس الحاوية ويعمل على المنفذ 2379. يتم تعيين ملف التكوين الخاص به إلى embedEtcd.yaml في المجلد الحالي.
  • +
  • لتغيير تكوين Milvus الافتراضي، أضف إعداداتك إلى ملف user.yaml في المجلد الحالي ثم أعد تشغيل الخدمة.
  • +
  • يتم تعيين وحدة تخزين بيانات Milvus إلى وحدات التخزين/ملف Milvus في المجلد الحالي.
  • +
+

يمكنك الوصول إلى Milvus WebUI على http://127.0.0.1:9091/webui/ لمعرفة المزيد عن مثيل Milvus الخاص بك. للحصول على التفاصيل، ارجع إلى Milvus WebUI.

+

إيقاف وحذف ميلفوس

يمكنك إيقاف وحذف هذه الحاوية كما يلي

+
# Stop Milvus
+$ bash standalone_embed.sh stop
+
+# Delete Milvus data
+$ bash standalone_embed.sh delete
+
+

يمكنك ترقية أحدث إصدار من Milvus على النحو التالي

+
# upgrade Milvus
+$ bash standalone_embed.sh upgrade
+
+

ما التالي

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.json new file mode 100644 index 000000000..066c2fdd1 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.json @@ -0,0 +1 @@ +{"codeList":["C:\\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​\n\n","C:\\>standalone.bat start​\nWait for Milvus starting...​\nStart successfully.​\nTo change the default Milvus configuration, edit user.yaml and restart the service.​\n\n","# Stop Milvus​\nC:\\>standalone.bat stop​\nStop successfully.​\n​\n# Delete Milvus container​\nC:\\>standalone.bat delete​\nDelete Milvus container successfully. # Container has been removed.​\nDelete successfully. # Data has been removed.​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","# Download the installation script​\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​\n​\n# Start the Docker container​\n$ bash standalone_embed.sh start​\n\n","$ bash standalone_embed.sh start​\nWait for Milvus Starting...​\nStart successfully.​\nTo change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​\n\n","# Stop Milvus​\n$ bash standalone_embed.sh stop​\nStop successfully.​\n​\n# Delete Milvus data​\n$ bash standalone_embed.sh stop​\nDelete Milvus container successfully.​\nDelete successfully.​\n\n","# Download the configuration file and rename it as docker-compose.yml​\nC:\\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​\n​\n# Start Milvus​\nC:\\>docker compose up -d​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","$ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​\n\n","$ sudo docker compose up -d​\n​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>net start com.docker.service​\nThe Docker for Windows Service service is starting.​\nThe Docker for Windows Service service was started successfully.​\n\n","C:\\>wsl --update​\nChecking for updates.​\nThe most recent version of Windows Subsystem for Linux is already installed.​\n\n","C:\\>cd \"C:\\Program Files\\Docker\\Docker\"​\nC:\\Program Files\\Docker\\Docker>.\\DockerCli.exe -SwitchDaemon​\nSwitching to windows engine: Post \"http://ipc/engine/switch\": open \\\\.\\pipe\\dockerBackendApiServer: The system cannot find the file specified.​\n\n"],"headingContent":"Run Milvus in Docker (Windows)","anchorList":[{"label":"تشغيل Milvus في Docker (ويندوز)","href":"Run-Milvus-in-Docker-Windows","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites​","type":2,"isActive":false},{"label":"تشغيل Milvus في Docker","href":"Run-Milvus-in-Docker​","type":2,"isActive":false},{"label":"قم بتشغيل ميلفوس مع Docker Compose","href":"Run-Milvus-with-Docker-Compose​","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQs​","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.md new file mode 100644 index 000000000..07f772225 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/install_standalone-windows.md @@ -0,0 +1,301 @@ +--- +id: install_standalone-windows.md +label: Docker +related_key: Docker +summary: تعرف على كيفية تثبيت Milvus مستقل مع Docker Desktop لنظام ويندوز. +title: تشغيل Milvus في Docker (لينكس) +--- +

تشغيل Milvus في Docker (ويندوز)

توضح هذه الصفحة كيفية تشغيل Milvus على نظام ويندوز باستخدام Docker Desktop لنظام ويندوز.

+

المتطلبات الأساسية

+

تشغيل Milvus في Docker

يوفر Milvus برنامج نصي للتثبيت لتثبيته كحاوية Docker. بمجرد تثبيت Docker Desktop على Microsoft Windows، يمكنك الوصول إلى Docker CLI من PowerShell أو موجه أوامر Windows في وضع المسؤول ومن WSL 2.

+

من PowerShell أو موجه أوامر ويندوز

إذا كنت على دراية أكثر بـ PowerShell أو موجه أوامر Windows، فإن موجه الأوامر يكون على النحو التالي.

+
    +
  1. افتح Docker Desktop في وضع المسؤول عن طريق النقر بزر الماوس الأيمن واختيار تشغيل كمسؤول.

  2. +
  3. قم بتنزيل البرنامج النصي للتثبيت واحفظه باسم standalone.bat.

    +
    C:\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​
    +
    +
  4. +
  5. قم بتشغيل البرنامج النصي الذي تم تنزيله لبدء تشغيل ميلفوس كحاوية Docker.

    +
    C:\>standalone.bat start​
    +Wait for Milvus starting...​
    +Start successfully.​
    +To change the default Milvus configuration, edit user.yaml and restart the service.​
    +
    +
    +

    بعد تشغيل البرنامج النصي للتثبيت.

    +
      +
    • تم بدء تشغيل حاوية docker باسم milvus-standalone على المنفذ 19530.

    • +
    • يتم تثبيت أداة تضمين إلخd مع ميلفوس في نفس الحاوية وتعمل على المنفذ 2379. يتم تعيين ملف التكوين الخاص به إلى embedEtcd.yaml في المجلد الحالي.

    • +
    • يتم تعيين وحدة تخزين بيانات Milvus إلى volumes/milvus في المجلد الحالي.

    • +
    +

    يمكنك استخدام الأوامر التالية لإدارة حاوية Milvus والبيانات المخزنة.

    +
    # Stop Milvus​
    +C:\>standalone.bat stop​
    +Stop successfully.​
    +​
    +# Delete Milvus container​
    +C:\>standalone.bat delete​
    +Delete Milvus container successfully. # Container has been removed.​
    +Delete successfully. # Data has been removed.​
    +
    +
  6. +
+

من WSL 2

إذا كنت تفضل بدء تشغيل ميلفوس باستخدام أوامر لينكس والبرامج النصية على ويندوز، تأكد من أنك قمت بالفعل بتثبيت الأمر WSL 2. للحصول على تفاصيل حول كيفية تثبيت الأمر WSL 2، يمكنك الرجوع إلى مقالة مايكروسوفت هذه.

+
    +
  1. ابدأ تشغيل WSL 2.

    +
    C:\>wsl --install​
    +Ubuntu already installed.​
    +Starting Ubuntu...​
    +
    +
  2. +
  3. قم بتنزيل البرنامج النصي للتثبيت

    +
    # Download the installation script​
    +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​
    +​
    +# Start the Docker container​
    +$ bash standalone_embed.sh start​
    +
    +
  4. +
  5. ابدأ تشغيل ميلفوس كحاوية إرساء.

    +
    $ bash standalone_embed.sh start​
    +Wait for Milvus Starting...​
    +Start successfully.​
    +To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​
    +
    +
    +

    يمكنك استخدام الأوامر التالية لإدارة حاوية ميلفوس والبيانات المخزنة.

    +
    # Stop Milvus​
    +$ bash standalone_embed.sh stop​
    +Stop successfully.​
    +​
    +# Delete Milvus data​
    +$ bash standalone_embed.sh stop​
    +Delete Milvus container successfully.​
    +Delete successfully.​
    +
    +
  6. +
+

قم بتشغيل ميلفوس مع Docker Compose

بمجرد تثبيت Docker Desktop على Microsoft Windows، يمكنك الوصول إلى Docker CLI من PowerShell أو موجه أوامر Windows في وضع المسؤول. يمكنك تشغيل Docker Compose إما في PowerShell أو موجه أوامر Windows أو موجه أوامر Windows أو WSL 2 لبدء تشغيل Milvus.

+

من PowerShell أو موجه أوامر Windows

    +
  1. افتح Docker Desktop في وضع المسؤول عن طريق النقر بزر الماوس الأيمن وتحديد تشغيل كمسؤول.

  2. +
  3. قم بتشغيل الأوامر التالية في PowerShell أو موجه أوامر Windows لتنزيل ملف تكوين Docker Compose لـ Milvus Standalone وبدء تشغيل Milvus.

    +
    # Download the configuration file and rename it as docker-compose.yml​
    +C:\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​
    +​
    +# Start Milvus​
    +C:\>docker compose up -d​
    +Creating milvus-etcd  ... done​
    +Creating milvus-minio ... done​
    +Creating milvus-standalone ... done​
    +
    +
    +

    اعتمادًا على اتصال الشبكة لديك، قد يستغرق تنزيل الصور لتثبيت Milvus بعض الوقت. بمجرد أن تصبح الحاويات المسماة milvus-standalone و milvus-minio و milvus-etcd جاهزة يمكنك مشاهدة ما يلي

    +
      +
    • لا تعرض حاوية milvus-etcd أي منافذ للمضيف وتقوم بتعيين بياناتها إلى وحدات التخزين/etcd في المجلد الحالي.

    • +
    • تخدم حاوية milvus-minio المنفذين 9090 و9091 محليًا باستخدام بيانات اعتماد المصادقة الافتراضية وتعيّن بياناتها إلى وحدات التخزين/minio في المجلد الحالي.

    • +
    • تخدم الحاوية المستقلة milvus-standalone المنافذ 19530 محليًا بالإعدادات الافتراضية وتعيّن بياناتها إلى وحدات التخزين/ميلفوس في المجلد الحالي.

    • +
  4. +
+

يمكنك أيضًا استدعاء إصدار لينكس من أوامر Docker Compose إذا كان لديك WSL 2 مثبتًا.

+

من WSL 2

الإجراء مشابه لاستخدام Docker Compose لتثبيت Milvus في أنظمة لينكس.

+
    +
  1. ابدأ WSL 2.

    +
    C:\>wsl --install​
    +Ubuntu already installed.​
    +Starting Ubuntu...​
    +
    +
  2. +
  3. قم بتنزيل ملف تهيئة ميلفوس.

    +
    $ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​
    +
    +
  4. +
  5. ابدأ تشغيل ميلفوس.

    +
    $ sudo docker compose up -d​
    +​
    +Creating milvus-etcd  ... done​
    +Creating milvus-minio ... done​
    +Creating milvus-standalone ... done​
    +
    +
  6. +
+

الأسئلة الشائعة

كيف يمكنني التعامل مع الخطأ Docker Engine stopped ؟

بمجرد تثبيت Docker Desktop في Windows، قد تواجه الخطأ Docker Engine stopped إذا لم يتم تكوين جهاز الكمبيوتر الخاص بك بشكل صحيح. في هذه الحالة، قد تحتاج إلى إجراء الفحوصات التالية.

+
    +
  1. تحقق مما إذا تم تمكين المحاكاة الافتراضية.

    +

    يمكنك التحقق مما إذا كانت المحاكاة الافتراضية ممكّنة من خلال النظر إلى علامة التبويب الأداء في إدارة المهام.

    +

    + + Virtualization in Task Manager + المحاكاة الافتراضية في إدارة المهام

    +

    إذا كانت المحاكاة الافتراضية معطلة، فقد تحتاج إلى التحقق من إعدادات BIOS في البرنامج الثابت للوحة الأم. تختلف طريقة تمكين المحاكاة الافتراضية في إعدادات BIOS باختلاف بائعي اللوحة الأم. بالنسبة للوحة الأم ASUS، على سبيل المثال، يمكنك الرجوع إلى هذه المقالة حول تمكين المحاكاة الافتراضية.

    +

    بعد ذلك، تحتاج إلى إعادة تشغيل الكمبيوتر وتمكين Hyper-V. للحصول على التفاصيل، راجع مقالة Microsoft هذه.

  2. +
  3. تحقق من بدء تشغيل خدمة Docker Desktop Service.

    +

    يمكنك تشغيل الأمر التالي لبدء تشغيل خدمة Docker Desktop Service.

    +
    C:\>net start com.docker.service​
    +The Docker for Windows Service service is starting.​
    +The Docker for Windows Service service was started successfully.​
    +
    +
  4. +
  5. تحقق مما إذا كان قد تم تثبيت WSL بشكل صحيح.

    +

    يمكنك تشغيل الأمر التالي لتثبيت الأمر WSL 2 أو تحديثه.

    +
    C:\>wsl --update​
    +Checking for updates.​
    +The most recent version of Windows Subsystem for Linux is already installed.​
    +
    +
  6. +
  7. تحقق مما إذا كان قد تم بدء تشغيل Docker Daemon.

    +

    تحتاج إلى الانتقال إلى دليل تثبيت Docker Desktop وتشغيل .\DockerCli.exe -SwitchDaemon لبدء تشغيل Docker Daemon.

    +
    C:\>cd "C:\Program Files\Docker\Docker"​
    +C:\Program Files\Docker\Docker>.\DockerCli.exe -SwitchDaemon​
    +Switching to windows engine: Post "http://ipc/engine/switch": open \\.\pipe\dockerBackendApiServer: The system cannot find the file specified.​
    +
    +
  8. +
  9. تحقق مما إذا كنت قد بدأت تشغيل Docker Desktop في وضع المسؤول.

    +

    تأكد من بدء تشغيل Docker Desktop في وضع المسؤول. للقيام بذلك، انقر بزر الماوس الأيمن على Docker Desktop واختر تشغيل كمسؤول.

    +

    + + Start Docker Desktop as Administrator + ابدأ تشغيل Docker Desktop كمسؤول

  10. +
+

إذا واجهتَ مشاكل متعلقة بـ WSL أثناء تشغيل Milvus من WSL 2، فقد تحتاج إلى التحقق مما إذا كنت قد قمت بتكوين Docker Desktop لاستخدام المحرك المستند إلى WSL 2 على النحو التالي.

+
    +
  1. تأكد من تحديد "استخدام المحرك المستند إلى WSL 2" في الإعدادات > عام.

    +

    + + Use the WSL 2 based engine in Docker Desktop Settings + استخدام المحرك المستند إلى WSL 2 في إعدادات Docker Desktop

  2. +
  3. اختر من بين توزيعات WSL 2 المثبتة التي تريد تمكين تكامل Docker عليها بالانتقال إلى: الإعدادات > الموارد > تكامل WSL.

    +

    + + Select WSL 2 distributions in Docker Desktop Settings + حدد توزيعات WSL 2 في إعدادات سطح المكتب Docker Desktop

  4. +
+

+ + Read config failed error prompt in Milvus startup + فشل قراءة موجه خطأ في قراءة التكوين أثناء بدء تشغيل Milvus

+

للتعامل مع الخطأ الذي يُطلب منك أثناء بدء تشغيل Milvus الذي يقرأ "فشل قراءة التهيئة"، عليك التحقق مما إذا كان وحدة التخزين المثبتة في حاوية Milvus صحيحة. إذا كان وحدة التخزين مثبتة بشكل صحيح في الحاوية، يمكنك استخدام الأمر docker exec للدخول إلى الحاوية وإدراج مجلد /milvus/configs على النحو التالي.

+

+ + List Milvus config files + سرد ملفات تكوين ميلفوس

+

+

ما التالي

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.json new file mode 100644 index 000000000..f25479137 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n"],"headingContent":"Requirements for Installing Milvus with Docker Compose","anchorList":[{"label":"متطلبات تثبيت Milvus باستخدام Docker Compose","href":"Requirements-for-Installing-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"متطلبات الأجهزة","href":"Hardware-requirements","type":2,"isActive":false},{"label":"متطلبات البرامج","href":"Software-requirements","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.md new file mode 100644 index 000000000..a38955eca --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-docker/prerequisite-docker.md @@ -0,0 +1,111 @@ +--- +id: prerequisite-docker.md +label: Docker requirements +related_key: Docker +summary: تعرف على الاستعدادات اللازمة قبل تثبيت Milvus مع Docker Compose. +title: متطلبات تثبيت Milvus باستخدام Docker Compose +--- +

متطلبات تثبيت Milvus باستخدام Docker Compose

قبل تثبيت مثيل Milvus، تحقق من أجهزتك وبرامجك لمعرفة ما إذا كانت تفي بالمتطلبات.

+

متطلبات الأجهزة

+ + + + + + + + + +
المكوّنالمتطلباتالتوصيةملاحظة
وحدة المعالجة المركزية
  • وحدة معالجة مركزية Intel من الجيل الثاني أو أعلى
  • أبل سيليكون
  • مستقل: 4 نواة أو أكثر
  • عنقودي: 8 نواة أو أكثر
مجموعة تعليمات وحدة المعالجة المركزية
  • SSE4.2
  • AVX
  • AVX2
  • AVX-512
  • SSE4.2
  • AVX
  • AVX2
  • AVX-512
يتطلب البحث عن تشابه المتجهات وبناء الفهرس داخل Milvus دعم وحدة المعالجة المركزية لمجموعات امتدادات التعليمات الأحادية والبيانات المتعددة (SIMD). تأكد من أن وحدة المعالجة المركزية تدعم واحدة على الأقل من امتدادات SIMD المدرجة. راجع وحدات المعالجة المركزية مع AVX لمزيد من المعلومات.
ذاكرة الوصول العشوائي
  • مستقل: 8G
  • المجموعة العنقودية: 32G
  • مستقل: 16G
  • الكتلة: 128G
يعتمد حجم ذاكرة الوصول العشوائي على حجم البيانات.
القرص الصلبSATA 3.0 SSD أو أعلىNVMe SSD أو أعلىيعتمد حجم القرص الصلب على حجم البيانات.
+

متطلبات البرامج

+ + + + + + + + +
نظام التشغيلالبرمجياتملاحظة
macOS 10.14 أو أحدثسطح مكتب Dockerاضبط جهاز Docker الظاهري (VM) على استخدام وحدتي معالجة مركزية افتراضية (vCPUs) وذاكرة أولية بسعة 8 جيجابايت على الأقل. وإلا فقد يفشل التثبيت.
راجع تثبيت Docker Desktop على نظام Mac لمزيد من المعلومات.
منصات لينكس
  • Docker 19.03 أو أحدث
  • Docker Compose 1.25.1 أو أحدث
راجع تثبيت محرك Docker Engine وتثبيت Docker Compose لمزيد من المعلومات.
ويندوز مع تمكين WSL 2سطح مكتب Dockerنوصيك بتخزين التعليمات البرمجية المصدرية والبيانات الأخرى المثبتة في حاويات لينكس في نظام ملفات لينكس بدلاً من نظام ملفات ويندوز.
راجع تثبيت Docker Desktop على ويندوز مع الواجهة الخلفية WSL 2 لمزيد من المعلومات.
+

سيتم الحصول على التبعيات التالية وتهيئتها تلقائيًا عند تثبيت Milvus Standalone باستخدام البرنامج النصي Docker، أو تكوين Docker Compose:

+ + + + + + + + + +
البرنامجالإصدارملاحظة
إلخd3.5.0انظر متطلبات القرص الإضافية.
مينيوRELEASE.2023-03-20T20-16-18Z
بولسار2.8.2
+

متطلبات القرص الإضافية

أداء القرص أمر بالغ الأهمية لـ etcd. يوصى بشدة باستخدام أقراص NVMe SSD المحلية. قد تتسبب الاستجابة الأبطأ للقرص في إجراء انتخابات متكررة للمجموعة والتي ستؤدي في النهاية إلى تدهور خدمة إلخd.

+

لاختبار ما إذا كان قرصك مؤهلاً، استخدم fio.

+
mkdir test-data
+fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
+
+

من الناحية المثالية، يجب أن يصل القرص الخاص بك إلى أكثر من 500 IOPS وأقل من 10 مللي ثانية لنسبة 99% من زمن انتقال المزامنة. اقرأ مستندات etcd لمزيد من المتطلبات التفصيلية.

+

ما التالي

إذا كانت أجهزتك وبرامجك تستوفي المتطلبات المذكورة أعلاه، يمكنك

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json new file mode 100644 index 000000000..cf9e18781 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nstandalone:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datacoord-6fd4bd885c-gkzwx 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexcoord-5bfcf6bdd8-nmh5l 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querycoord-579cd79455-xht5n 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-milvus-rootcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 30s\nmy-release-milvus-standalone-54c4f88cb9-f84pf 1/1 Running 0 30s\nmy-release-minio-5564fbbddc-mz7f5 1/1 Running 0 30s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus with GPU Support Using Helm Chart","anchorList":[{"label":"تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام مخطط Helm","href":"Run-Milvus-with-GPU-Support-Using-Helm-Chart","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت مخطط Helm لـ Milvus","href":"Install-Helm-Chart-for-Milvus","type":2,"isActive":false},{"label":"ابدأ تشغيل ميلفوس","href":"Start-Milvus","type":2,"isActive":false},{"label":"الوصول إلى Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"إلغاء تثبيت ميلفوس","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md new file mode 100644 index 000000000..1f1a2a8e6 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md @@ -0,0 +1,378 @@ +--- +id: install_cluster-helm-gpu.md +label: Cluster (Helm) +related_key: Kubernetes +summary: تعرف على كيفية تثبيت مجموعة Milvus العنقودية على Kubernetes. +title: تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام مخطط Helm +--- +

تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام مخطط Helm

توضح هذه الصفحة كيفية بدء تشغيل مثيل Milvus مع دعم وحدة معالجة الرسومات باستخدام مخطط Helm.

+

نظرة عامة

يستخدم Helm تنسيق تغليف يسمى المخططات. المخطط هو مجموعة من الملفات التي تصف مجموعة ذات صلة من موارد Kubernetes. يوفر Milvus مجموعة من المخططات لمساعدتك في نشر تبعيات ومكونات Milvus. إن مخطط Milvus Helm Chart هو حل يقوم بتمهيد نشر Milvus على مجموعة Kubernetes (K8s) باستخدام مدير الحزم Helm.

+

المتطلبات الأساسية

+
+

إذا واجهتك أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل عن المشكلة، وسنقدم لك الدعم اللازم.

+
+

تثبيت مخطط Helm لـ Milvus

Helm هو مدير حزم K8s الذي يمكن أن يساعدك في نشر Milvus بسرعة.

+
    +
  1. إضافة مستودع Milvus Helm.
  2. +
+
$ helm repo add milvus https://zilliztech.github.io/milvus-helm/
+
+
+

تمت أرشفة الريبو الخاص بـ Milvus Helm Charts على https://milvus-io.github.io/milvus-helm/ ويمكنك الحصول على المزيد من التحديثات من https://zilliztech.github.io/milvus-helm/ على النحو التالي:

+
helm repo add zilliztech https://zilliztech.github.io/milvus-helm
+helm repo update
+# upgrade existing helm release
+helm upgrade my-release zilliztech/milvus
+
+

لا يزال الريبو المؤرشف متاحًا للمخططات حتى الإصدار 4.0.31. للإصدارات الأحدث، استخدم الريبو الجديد بدلاً من ذلك.

+
+
    +
  1. تحديث الرسوم البيانية محليًا.
  2. +
+
$ helm repo update
+
+

ابدأ تشغيل ميلفوس

بمجرد تثبيت مخطط Helm، يمكنك بدء تشغيل Milvus على Kubernetes. في هذا القسم، سنرشدك في هذا القسم إلى خطوات بدء تشغيل Milvus مع دعم وحدة معالجة الرسومات.

+

يجب عليك بدء تشغيل Milvus مع Helm من خلال تحديد اسم الإصدار والمخطط والمعلمات التي تتوقع تغييرها. في هذا الدليل، نستخدم my-release كاسم الإصدار. لاستخدام اسم إصدار مختلف، استبدل my-release في الأوامر التالية بالاسم الذي تستخدمه.

+

يسمح لك Milvus بتعيين جهاز واحد أو أكثر من أجهزة وحدة معالجة الرسومات إلى Milvus.

+

1. تعيين جهاز وحدة معالجة رسومات واحد

يسمح لك Milvus مع دعم وحدة معالجة الرسومات بتعيين جهاز واحد أو أكثر من أجهزة وحدة معالجة الرسومات.

+
    +
  • مجموعة Milvus العنقودية

    +
    cat <<EOF > custom-values.yaml
    +indexNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +queryNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +EOF
    +
    +
    $ helm install my-release milvus/milvus -f custom-values.yaml
    +
  • +
  • ميلفوس مستقل

    +
    cat <<EOF > custom-values.yaml
    +standalone:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +EOF
    +
    +
    $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
    +
  • +
+

2. تعيين أجهزة GPU متعددة لوحدة معالجة الرسومات

بالإضافة إلى جهاز GPU واحد، يمكنك أيضاً تعيين أجهزة GPU متعددة إلى Milvus.

+
    +
  • مجموعة ميلفوس العنقودية

    +
    cat <<EOF > custom-values.yaml
    +indexNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "2"
    +    limits:
    +      nvidia.com/gpu: "2"
    +queryNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "2"
    +    limits:
    +      nvidia.com/gpu: "2"
    +EOF
    +
    +

    في التهيئة أعلاه، تشترك عقدة الفهرس وعقدة الاستعلام في وحدتي معالجة رسومات. لتعيين وحدتي GPU مختلفتين لوحدتي GPU إلى عقدة الفهرس وعقدة الاستعلام، يمكنك تعديل التكوين وفقًا لذلك من خلال تعيين extraEnv في ملف التكوين على النحو التالي:

    +
    cat <<EOF > custom-values.yaml
    +indexNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +  extraEnv:
    +    - name: CUDA_VISIBLE_DEVICES
    +      value: "0"
    +queryNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +  extraEnv:
    +    - name: CUDA_VISIBLE_DEVICES
    +      value: "1"
    +EOF
    +
    +
    $ helm install my-release milvus/milvus -f custom-values.yaml
    +
    +
    +
      +
    • يجب أن يحتوي اسم الإصدار على أحرف وأرقام وشرطات فقط. غير مسموح بالنقاط في اسم الإصدار.
    • +
    • يقوم سطر الأوامر الافتراضي بتثبيت الإصدار العنقودي من Milvus أثناء تثبيت Milvus مع Helm. هناك حاجة إلى مزيد من الإعدادات أثناء تثبيت Milvus مستقل.
    • +
    • وفقًا لدليل ترحيل واجهة برمجة التطبيقات المهملة من Kuberenetes، لم يعد يتم تقديم إصدار واجهة برمجة التطبيقات Policy/v1beta1 من PodDisruptionBudget اعتبارًا من الإصدار v1.25. يُقترح عليك ترحيل القوائم وعملاء واجهة برمجة التطبيقات لاستخدام إصدار السياسة/ الإصدار الأول من واجهة برمجة التطبيقات بدلاً من ذلك.
      كحل بديل للمستخدمين الذين لا يزالون يستخدمون إصدار Policy/v1beta1 API من PodDisruptionBudget على Kuberenetes v1.25 والإصدارات الأحدث، يمكنك بدلاً من ذلك تشغيل الأمر التالي لتثبيت Milvus:
      helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
    • +
    • انظر مخطط Milvus Helm و Helm لمزيد من المعلومات.
    • +
    +
    +
  • +
  • ميلفوس مستقل

    +
    cat <<EOF > custom-values.yaml
    +indexNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "2"
    +    limits:
    +      nvidia.com/gpu: "2"
    +queryNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "2"
    +    limits:
    +      nvidia.com/gpu: "2"
    +EOF
    +
    +

    في التهيئة أعلاه، تشترك عقدة الفهرس وعقدة الاستعلام في وحدتي معالجة رسومات. لتعيين وحدات معالجة رسومات مختلفة إلى عقدة الفهرس وعقدة الاستعلام، يمكنك تعديل التكوين وفقًا لذلك عن طريق تعيين extraEnv في ملف التكوين على النحو التالي:

    +
    cat <<EOF > custom-values.yaml
    +indexNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +  extraEnv:
    +    - name: CUDA_VISIBLE_DEVICES
    +      value: "0"
    +queryNode:
    +  resources:
    +    requests:
    +      nvidia.com/gpu: "1"
    +    limits:
    +      nvidia.com/gpu: "1"
    +  extraEnv:
    +    - name: CUDA_VISIBLE_DEVICES
    +      value: "1"
    +EOF
    +
    +
    $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
    +
  • +
+

2. تحقق من حالة ميلفوس

قم بتشغيل الأمر التالي للتحقق من حالة Milvus:

+
$ kubectl get pods
+
+

بعد بدء تشغيل Milvus، يعرض العمود READY 1/1 لجميع الكبسولات.

+
    +
  • مجموعة ميلفوس العنقودية

    +
    NAME                                             READY  STATUS   RESTARTS  AGE
    +my-release-etcd-0                                1/1    Running   0        3m23s
    +my-release-etcd-1                                1/1    Running   0        3m23s
    +my-release-etcd-2                                1/1    Running   0        3m23s
    +my-release-milvus-datacoord-6fd4bd885c-gkzwx     1/1    Running   0        3m23s
    +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
    +my-release-milvus-indexcoord-5bfcf6bdd8-nmh5l    1/1    Running   0        3m23s
    +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
    +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
    +my-release-milvus-querycoord-579cd79455-xht5n    1/1    Running   0        3m24s
    +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
    +my-release-milvus-rootcoord-7fb9488465-dmbbj     1/1    Running   0        3m23s
    +my-release-minio-0                               1/1    Running   0        3m23s
    +my-release-minio-1                               1/1    Running   0        3m23s
    +my-release-minio-2                               1/1    Running   0        3m23s
    +my-release-minio-3                               1/1    Running   0        3m23s
    +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
    +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
    +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
    +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
    +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
    +
  • +
  • ميلفوس مستقل

    +
    NAME                                               READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                                  1/1     Running     0          30s
    +my-release-milvus-standalone-54c4f88cb9-f84pf      1/1     Running     0          30s
    +my-release-minio-5564fbbddc-mz7f5                  1/1     Running     0          30s
    +
  • +
+

3. إعادة توجيه منفذ محلي إلى ميلفوس

تحقق من المنفذ المحلي الذي يستمع إليه خادم Milvus. استبدل اسم الكبسولة باسمك.

+
$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
+='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
+19530
+
+

بعد ذلك، قم بتشغيل الأمر التالي لإعادة توجيه منفذ محلي إلى المنفذ الذي يعمل عليه Milvus.

+
$ kubectl port-forward service/my-release-milvus 27017:19530
+Forwarding from 127.0.0.1:27017 -> 19530
+
+

اختياريًا، يمكنك استخدام :19530 بدلًا من 27017:19530 في الأمر أعلاه للسماح لـ kubectl بتخصيص منفذ محلي لك حتى لا تضطر إلى إدارة تعارضات المنافذ.

+

بشكل افتراضي، يستمع منفذ إعادة توجيه المنفذ الخاص بـ kubectl بشكل افتراضي فقط على localhost. استخدم العلامة address إذا كنت تريد أن يستمع ميلفوس على عناوين IP المحددة أو جميع عناوين IP. الأمر التالي يجعل الأمر التالي المنفذ إلى الأمام يستمع على جميع عناوين IP على الجهاز المضيف.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
+Forwarding from 0.0.0.0:27017 -> 19530
+
+

الآن، يمكنك الاتصال ب Milvus باستخدام المنفذ المعاد توجيهه.

+

الوصول إلى Milvus WebUI

يأتي Milvus مزودًا بأداة واجهة مستخدم رسومية مدمجة تسمى Milvus WebUI والتي يمكنك الوصول إليها من خلال متصفحك. تعزز واجهة مستخدم Milvus WebUI إمكانية مراقبة النظام بواجهة بسيطة وبديهية. يمكنك استخدام واجهة مستخدم الويب Milvus Web UI لمراقبة الإحصائيات والمقاييس الخاصة بمكونات وتبعيات Milvus، والتحقق من تفاصيل قاعدة البيانات والتجميع، وسرد تكوينات Milvus المفصلة. للحصول على تفاصيل حول واجهة مستخدم ميلفوس ويب، راجع واجهة مستخدم ميلفوس ويب

+

لتمكين الوصول إلى واجهة مستخدم ويب Milvus Web UI، تحتاج إلى إعادة توجيه منفذ إلى منفذ محلي.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
+Forwarding from 0.0.0.0:27018 -> 9091
+
+

الآن، يمكنك الوصول إلى واجهة مستخدم ويب Milvus Web UI على http://localhost:27018.

+

إلغاء تثبيت ميلفوس

قم بتشغيل الأمر التالي لإلغاء تثبيت ميلفوس.

+
$ helm uninstall my-release
+
+

ما التالي

بعد تثبيت ميلفوس، يمكنك

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json new file mode 100644 index 000000000..622d6a360 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: [\"0\"]\n...\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: ['0', '1']\n...\n","$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","$ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone\n","$ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n","docker cp :/milvus/configs/milvus.yaml milvus.yaml\n","vim milvus.yaml\n","...\ngpu:\n initMemSize: 0\n maxMemSize: 0\n...\n","docker cp milvus.yaml :/milvus/configs/milvus.yaml\n","docker stop \ndocker start \n"],"headingContent":"Run Milvus with GPU Support Using Docker Compose","anchorList":[{"label":"تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام Docker Compose","href":"Run-Milvus-with-GPU-Support-Using-Docker-Compose","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"تكوين تجمع الذاكرة","href":"Configure-memory-pool","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md new file mode 100644 index 000000000..ea8e37f6a --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md @@ -0,0 +1,224 @@ +--- +id: install_standalone-docker-compose-gpu.md +label: Standalone (Docker Compose) +related_key: Kubernetes +summary: تعرف على كيفية تثبيت مجموعة Milvus العنقودية على Kubernetes. +title: تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام Docker Compose +--- +

تشغيل Milvus مع دعم وحدة معالجة الرسومات باستخدام Docker Compose

توضح هذه الصفحة كيفية بدء تشغيل مثيل Milvus مع دعم وحدة معالجة الرسومات باستخدام Docker Compose.

+

المتطلبات الأساسية

+
+

إذا واجهت أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل عن المشكلة، وسنقدم لك الدعم اللازم.

+
+

تثبيت Milvus

لتثبيت Milvus مع دعم GPU باستخدام Docker Compose، اتبع الخطوات التالية.

+

1. تنزيل ملف YAML وتكوينه

تنزيل milvus-standalone-docker-compose-gpu.yml واحفظه بصيغة docker-compose.yml يدويًا، أو باستخدام الأمر التالي.

+
$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml
+
+

تحتاج إلى إجراء بعض التغييرات على متغيرات البيئة الخاصة بالخدمة المستقلة في ملف YAML على النحو التالي:

+
    +
  • لتعيين جهاز GPU معين لوحدة معالجة الرسومات في ملف Milvus، حدد موقع الحقل deploy.resources.reservations.devices[0].devices_ids في تعريف الخدمة standalone واستبدل قيمته بمعرف وحدة معالجة الرسومات المطلوبة. يمكنك استخدام الأداة nvidia-smi ، المضمنة مع برامج تشغيل عرض NVIDIA GPU، لتحديد معرف جهاز وحدة معالجة الرسومات. يدعم Milvus أجهزة GPU متعددة لوحدة معالجة الرسومات.
  • +
+

قم بتعيين جهاز GPU واحد إلى Milvus:

+
...
+standalone:
+  ...
+  deploy:
+    resources:
+      reservations:
+        devices:
+          - driver: nvidia
+            capabilities: ["gpu"]
+            device_ids: ["0"]
+...
+
+

تعيين أجهزة GPU متعددة لوحدة معالجة الرسومات إلى Milvus:

+
...
+standalone:
+  ...
+  deploy:
+    resources:
+      reservations:
+        devices:
+          - driver: nvidia
+            capabilities: ["gpu"]
+            device_ids: ['0', '1']
+...
+
+

2. ابدأ تشغيل Milvus

في الدليل الذي يحتوي على docker-compose.yml، ابدأ تشغيل Milvus عن طريق التشغيل:

+
$ sudo docker compose up -d
+
+Creating milvus-etcd  ... done
+Creating milvus-minio ... done
+Creating milvus-standalone ... done
+
+
+

إذا فشلت في تشغيل الأمر أعلاه، تحقق مما إذا كان نظامك يحتوي على Docker Compose V1 مثبتًا على نظام Docker Compose V1. إذا كانت هذه هي الحالة، ننصحك بالترحيل إلى Docker Compose V2 نظرًا للملاحظات الواردة في هذه الصفحة.

+
+

بعد بدء تشغيل Milvus,

+
    +
  • يتم تشغيل الحاويات المسماة milvus-standalone و milvus-minio و milvus-etcd.
      +
    • لا تعرض حاوية milvus-etcd أي منافذ للمضيف وتقوم بتعيين بياناتها إلى وحدات التخزين/etcd في المجلد الحالي.
    • +
    • تخدم حاوية milvus-minio المنفذين 9090 و9091 محلياً باستخدام بيانات اعتماد المصادقة الافتراضية وتعيّن بياناتها إلى وحدات التخزين/minio في المجلد الحالي.
    • +
    • تخدم الحاوية المستقلة milvus-standalone المنافذ 19530 محلياً بالإعدادات الافتراضية وتعيّن بياناتها إلى وحدات التخزين/ميلفوس في المجلد الحالي.
    • +
  • +
+

يمكنك التحقق مما إذا كانت الحاويات قيد التشغيل باستخدام الأمر التالي:

+
$ sudo docker compose ps
+
+      Name                     Command                  State                            Ports
+--------------------------------------------------------------------------------------------------------------------
+milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
+milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
+milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
+
+

يمكنك أيضًا الوصول إلى Milvus WebUI على http://127.0.0.1:9091/webui/ لمعرفة المزيد عن مثيل Milvus الخاص بك. للحصول على التفاصيل، راجع Milvus WebUI.

+

إذا قمت بتعيين أجهزة GPU متعددة إلى Milvus في docker-compose.yml، يمكنك تحديد جهاز GPU المرئي أو المتاح للاستخدام.

+

اجعل جهاز GPU 0 مرئيًا لـ Milvus:

+
$ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone
+
+

اجعل أجهزة GPU 0 و 1 مرئية لـ Milvus:

+
$ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone
+
+

يمكنك إيقاف وحذف هذه الحاوية على النحو التالي.

+
# Stop Milvus
+$ sudo docker compose down
+
+# Delete service data
+$ sudo rm -rf volumes
+
+

تكوين تجمع الذاكرة

بعد تشغيل Milvus، يمكنك تخصيص تجمع الذاكرة عن طريق تعديل الإعدادات initMemSize و maxMemSize في الملف milvus.yaml.

+
+

يقع الملف milvus.yaml في الدليل /milvus/configs/ داخل حاوية ميلفوس.

+
+

لضبط تجمع الذاكرة، قم بتعديل الإعدادات initMemSize و maxMemSize في الملف milvus.yaml على النحو التالي.

+
    +
  1. استخدم الأمر التالي لنسخ milvus.yaml من حاوية ميلفوس إلى جهازك المحلي. استبدل <milvus_container_id> بمعرف حاوية ميلفوس الفعلي الخاص بك.

    +
    docker cp <milvus_container_id>:/milvus/configs/milvus.yaml milvus.yaml
    +
  2. +
  3. افتح الملف المنسوخ milvus.yaml باستخدام محرر النصوص المفضل لديك. على سبيل المثال، باستخدام vim:

    +
    vim milvus.yaml
    +
  4. +
  5. قم بتحرير الإعدادات initMemSize و maxMemSize حسب الحاجة واحفظ التغييرات:

    +
    ...
    +gpu:
    +  initMemSize: 0
    +  maxMemSize: 0
    +...
    +
    +
      +
    • initMemSize: الحجم الأولي لتجمع الذاكرة. الافتراضي إلى 1024.
    • +
    • maxMemSize: الحجم الأقصى لتجمع الذاكرة. افتراضي إلى 2048.
    • +
  6. +
  7. استخدم الأمر التالي لنسخ الملف milvus.yaml المعدل إلى حاوية Milvus. استبدل <milvus_container_id> بمعرف حاوية Milvus الفعلي الخاص بك.

    +
    docker cp milvus.yaml <milvus_container_id>:/milvus/configs/milvus.yaml
    +
  8. +
  9. أعد تشغيل حاوية Milvus لتطبيق التغييرات:

    +
    docker stop <milvus_container_id>
    +docker start <milvus_container_id>
    +
  10. +
+

الخطوة التالية

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.json new file mode 100644 index 000000000..6f1981de1 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545\n","$ modinfo nvidia | grep \"^version\"\nversion: 545.29.06\n","$ minikube start\n","$ kubectl cluster-info\n"," $ kubectl describe node \n\n Capacity:\n ...\n nvidia.com/gpu: 4\n ...\n Allocatable:\n ...\n nvidia.com/gpu: 4\n ...\n ``` \n"],"headingContent":"Requirements for Installing Milvus with GPU","anchorList":[{"label":"متطلبات تثبيت Milvus مع وحدة معالجة الرسومات","href":"Requirements-for-Installing-Milvus-with-GPU","type":1,"isActive":false},{"label":"قدرة الحوسبة","href":"Compute-capability","type":2,"isActive":false},{"label":"برنامج تشغيل NVIDIA","href":"NVIDIA-driver","type":2,"isActive":false},{"label":"متطلبات البرنامج","href":"Software-requirements","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.md new file mode 100644 index 000000000..d96e383a4 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-gpu/prerequisite-gpu.md @@ -0,0 +1,149 @@ +--- +id: prerequisite-gpu.md +label: GPU requirements +related_key: GPU +summary: تعرف على الاستعدادات اللازمة قبل تثبيت Milvus مع وحدة معالجة الرسومات. +title: متطلبات تثبيت Milvus مع وحدة معالجة الرسومات +--- +

متطلبات تثبيت Milvus مع وحدة معالجة الرسومات

تسرد هذه الصفحة متطلبات الأجهزة والبرامج لإعداد Milvus مع دعم وحدة معالجة الرسومات.

+

قدرة الحوسبة

يجب أن تكون قدرة الحوسبة لجهاز وحدة معالجة الرسومات الخاصة بك واحدة مما يلي: 6.0, 7.0, 7.5, 8.0, 8.6, 9.0.

+

للتحقق مما إذا كان جهاز وحدة معالجة الرسومات الخاص بك يفي بالمتطلبات، تحقق من قدرة الحوسبة لوحدة معالجة الرسومات الخاصة بك على موقع مطور NVIDIA.

+

برنامج تشغيل NVIDIA

يجب أن يكون برنامج تشغيل NVIDIA لجهاز وحدة معالجة الرسومات الخاص بك على أحد توزيعات Linux المدعومة، وأن تكون مجموعة أدوات NVIDIA Container Toolkit مثبتة باتباع هذا الدليل.

+

بالنسبة لمستخدمي Ubuntu 22.04، يمكنك تثبيت برنامج التشغيل ومجموعة أدوات الحاوية باستخدام الأوامر التالية:

+
$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545
+
+

لمستخدمي أنظمة التشغيل الأخرى، راجع دليل التثبيت الرسمي.

+

يمكنك التحقق من تثبيت برنامج التشغيل بشكل صحيح من خلال تشغيل الأمر التالي:

+
$ modinfo nvidia | grep "^version"
+version:        545.29.06
+
+

يوصى باستخدام برامج التشغيل من الإصدار 545 وما فوق.

+

متطلبات البرنامج

يوصى بتشغيل مجموعة Kubernetes على منصات Linux.

+
    +
  • kubectl هي أداة سطر الأوامر لـ Kubernetes. استخدم إصدار kubectl الذي يقع ضمن فرق إصدار ثانوي واحد من مجموعتك. يساعد استخدام أحدث إصدار من kubectl على تجنب المشاكل غير المتوقعة.
  • +
  • يلزم استخدام minikube عند تشغيل مجموعة Kubernetes محليًا. يتطلب minikube Docker كتابع. تأكد من تثبيت Docker قبل تثبيت Milvus باستخدام Helm. راجع الحصول على Docker لمزيد من المعلومات.
  • +
+ + + + + + + +
نظام التشغيلالبرمجياتملاحظة
منصات لينكس
  • Kubernetes 1.16 أو أحدث
  • كوبكتل
  • هيلم 3.0.0 أو أحدث
  • مينيكيوب صغير (لميلفوس مستقل)
  • Docker 19.03 أو أحدث (لميلفوس مستقل)
راجع مستندات Helm لمزيد من المعلومات.
+

الأسئلة الشائعة

كيف يمكنني بدء تشغيل مجموعة K8s محليًا لأغراض الاختبار؟

يمكنك استخدام أدوات مثل minikube و kind و Kubeadm لإعداد مجموعة Kubernetes محليًا بسرعة. يستخدم الإجراء التالي minikube كمثال.

+
    +
  1. تنزيل الميني كيوب
  2. +
+

انتقل إلى صفحة البدء، وتحقق مما إذا كنت قد استوفيت الشروط المدرجة في قسم ما ستحتاجه، وانقر على الأزرار التي تصف منصتك المستهدفة، وانسخ الأوامر لتنزيل وتثبيت البرنامج الثنائي.

+
    +
  1. ابدأ تشغيل مجموعة K8s باستخدام minikube
  2. +
+
$ minikube start
+
+
    +
  1. تحقق من حالة مجموعة K8s العنقودية
  2. +
+

يمكنك التحقق من حالة مجموعة K8s المثبتة باستخدام الأمر التالي.

+
$ kubectl cluster-info
+
+
+

تأكد من أنه يمكنك الوصول إلى مجموعة K8s العنقودية عبر kubectl. إذا لم تكن قد قمت بتثبيت kubectl محليًا، راجع استخدام kubectl داخل minikube.

+
+

كيف يمكنني بدء تشغيل مجموعة K8s مع عقد عامل GPU؟

إذا كنت تفضل استخدام العقد العاملة الممكّنة لوحدة معالجة الرسومات، يمكنك اتباع الخطوات أدناه لإنشاء مجموعة K8s مع عقد عاملة بوحدة معالجة الرسومات. نوصي بتثبيت Milvus على مجموعة K8s مع عقد عامل GPU واستخدام فئة التخزين الافتراضية الموفرة.

+
    +
  1. إعداد العقد العاملة بوحدة معالجة الرسومات
  2. +
+

لاستخدام العُقد العاملة الممكّنة لوحدة معالجة الرسومات GPU، اتبع الخطوات في إعداد عُقد وحدة معالجة الرسومات.

+
    +
  1. تمكين دعم GPU على K8s
  2. +
+

نشر البرنامج المساعد nvidia-devidia-device-plugin مع Helm باتباع الخطوات التالية.

+

بعد الإعداد، اعرض موارد وحدة معالجة الرسومات باستخدام الأمر التالي. استبدل <gpu-worker-node> باسم العقدة الفعلية.

+
  $ kubectl describe node <gpu-worker-node>
+
+  Capacity:
+  ...
+  nvidia.com/gpu:     4
+  ...
+  Allocatable:
+  ...
+  nvidia.com/gpu:     4
+  ...
+  ```  
+
diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.json new file mode 100644 index 000000000..26d65bb41 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm/\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","$ helm install my-release milvus/milvus\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-mixcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm template my-release milvus/milvus > milvus_manifest.yaml\n","$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt\n$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py\n","$ pip3 install -r requirements.txt\n$ python3 save_image.py --manifest milvus_manifest.yaml\n","$ for image in $(find . -type f -name \"*.tar.gz\") ; do gunzip -c $image | docker load; done\n","$ kubectl apply -f milvus_manifest.yaml\n","$ helm repo update\n$ helm upgrade my-release zilliztech/milvus\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus in Kubernetes with Helm","anchorList":[{"label":"تشغيل Milvus في Kubernetes باستخدام Helm","href":"Run-Milvus-in-Kubernetes-with-Helm","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت مخطط ميلفوس هيلم","href":"Install-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"التثبيت عبر الإنترنت","href":"Online-install","type":2,"isActive":false},{"label":"الوصول إلى Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"الوصول إلى Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"التثبيت دون اتصال","href":"Offline-install","type":2,"isActive":false},{"label":"ترقية مجموعة ميلفوس قيد التشغيل","href":"Upgrade-running-Milvus-cluster","type":2,"isActive":false},{"label":"إلغاء تثبيت ميلفوس","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.md new file mode 100644 index 000000000..4d0ecaf43 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-helm.md @@ -0,0 +1,335 @@ +--- +id: install_cluster-helm.md +label: Helm +related_key: Kubernetes +summary: تعرف على كيفية تثبيت مجموعة Milvus العنقودية على Kubernetes. +title: تثبيت مجموعة ميلفوس العنقودية مع هيلم +--- +

تشغيل Milvus في Kubernetes باستخدام Helm

توضح هذه الصفحة كيفية بدء تشغيل مثيل Milvus في Kubernetes باستخدام مخططات Milvus Helm.

+

نظرة عامة

يستخدم Helm تنسيق تغليف يسمى المخططات. المخطط عبارة عن مجموعة من الملفات التي تصف مجموعة ذات صلة من موارد Kubernetes. يوفر Milvus مجموعة من المخططات لمساعدتك في نشر تبعيات ومكونات Milvus.

+

المتطلبات الأساسية

    +
  • تثبيت Helm CLI.

  • +
  • إنشاء مجموعة K8s.

  • +
  • تثبيت StorageClass. يمكنك التحقق من StorageClass المثبت على النحو التالي.

    +
    $ kubectl get sc
    +
    +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
    +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
    +
  • +
  • تحقق من متطلبات الأجهزة والبرامج قبل التثبيت.

  • +
  • قبل تثبيت Milvus، يوصى باستخدام أداة تحجيم Milvus لتقدير متطلبات الأجهزة بناءً على حجم بياناتك. يساعد ذلك على ضمان الأداء الأمثل وتخصيص الموارد لتثبيت Milvus الخاص بك.

  • +
+
+

إذا واجهتك أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل المشكلة، وسنقدم لك الدعم اللازم.

+
+

تثبيت مخطط ميلفوس هيلم

قبل تثبيت مخططات Milvus Helm Charts، تحتاج إلى إضافة مستودع Milvus Helm.

+
$ helm repo add milvus https://zilliztech.github.io/milvus-helm/
+
+
+

تمت أرشفة ريبو Milvus Helm Charts على https://github.com/milvus-io/milvus-helm ويمكنك الحصول على المزيد من التحديثات من https://github.com/zilliztech/milvus-helm على النحو التالي:

+
helm repo add zilliztech https://zilliztech.github.io/milvus-helm/
+helm repo update
+# upgrade existing helm release
+helm upgrade my-release zilliztech/milvus
+
+

لا يزال الريبو المؤرشف متاحًا للمخططات حتى الإصدار 4.0.31. للإصدارات الأحدث، استخدم الريبو الجديد بدلاً من ذلك.

+
+

ثم قم بجلب مخططات Milvus من المستودع على النحو التالي:

+
$ helm repo update
+
+

يمكنك دائمًا تشغيل هذا الأمر لجلب أحدث مخططات Milvus Helm.

+

التثبيت عبر الإنترنت

1. نشر مجموعة Milvus

بمجرد تثبيت مخطط Helm، يمكنك بدء تشغيل Milvus على Kubernetes. سيرشدك هذا القسم إلى خطوات بدء تشغيل Milvus.

+
$ helm install my-release milvus/milvus
+
+

في الأمر أعلاه، my-release هو اسم الإصدار، و milvus/milvus هو مستودع المخطط المثبت محليًا. لاستخدام اسم مختلف، استبدل my-release بالاسم الذي تراه مناسبًا.

+

ينشر الأمر أعلاه مجموعة Milvus مع مكوناتها وتوابعها باستخدام التكوينات الافتراضية. لتخصيص هذه الإعدادات، نوصيك باستخدام أداة Milvus Sizing Tool لضبط التكوينات بناءً على حجم بياناتك الفعلي ثم تنزيل ملف YAML المقابل. لمعرفة المزيد حول معلمات التكوين، راجع قائمة مراجعة تكوينات نظام Milvus.

+
+
    +
  • يجب أن يحتوي اسم الإصدار على أحرف وأرقام وشرطات فقط. النقاط غير مسموح بها في اسم الإصدار.
  • +
  • يقوم سطر الأوامر الافتراضي بتثبيت الإصدار العنقودي من Milvus أثناء تثبيت Milvus مع Helm. هناك حاجة إلى مزيد من الإعدادات أثناء تثبيت Milvus مستقل.
  • +
  • وفقًا لدليل ترحيل واجهة برمجة التطبيقات المهملة لـ Kubernetes، لم يعد يتم تقديم إصدار واجهة برمجة التطبيقات السياسة/إصدار v1beta1 من PodDisruptionBudget اعتبارًا من الإصدار v1.25. يُقترح عليك ترحيل البيانات وعملاء واجهة برمجة التطبيقات لاستخدام إصدار واجهة برمجة تطبيقات السياسة/الإصدار الأول بدلاً من ذلك.
    كحل بديل للمستخدمين الذين لا يزالون يستخدمون إصدار السياسة/ الإصدار الأول من واجهة برمجة التطبيقات من PodDisruptionBudget على Kubernetes v1.25 والإصدارات الأحدث، يمكنك بدلاً من ذلك تشغيل الأمر التالي لتثبيت Milvus:
    helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
  • +
  • انظر مخطط Milvus Helm و Helm لمزيد من المعلومات.
  • +
+
+

2. تحقق من حالة مجموعة ميلفوس

قم بتشغيل الأمر التالي للتحقق من حالة جميع الكبسولات في مجموعة ميلفوس الخاصة بك.

+
$ kubectl get pods
+
+

بمجرد تشغيل جميع الكبسولات، يجب أن تكون مخرجات الأمر أعلاه مشابهة لما يلي:

+
NAME                                             READY  STATUS   RESTARTS  AGE
+my-release-etcd-0                                1/1    Running   0        3m23s
+my-release-etcd-1                                1/1    Running   0        3m23s
+my-release-etcd-2                                1/1    Running   0        3m23s
+my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
+my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
+my-release-milvus-mixcoord-7fb9488465-dmbbj      1/1    Running   0        3m23s
+my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
+my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
+my-release-minio-0                               1/1    Running   0        3m23s
+my-release-minio-1                               1/1    Running   0        3m23s
+my-release-minio-2                               1/1    Running   0        3m23s
+my-release-minio-3                               1/1    Running   0        3m23s
+my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
+my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
+my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
+my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
+my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
+my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
+my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
+
+

يمكنك أيضًا الوصول إلى Milvus WebUI على http://127.0.0.1:9091/webui/ لمعرفة المزيد عن مثيل Milvus الخاص بك. للحصول على التفاصيل، ارجع إلى Milvus WebUI.

+

3. إعادة توجيه منفذ محلي إلى ميلفوس

قم بتشغيل الأمر التالي للحصول على المنفذ الذي تخدم فيه مجموعة ميلفوس الخاصة بك.

+
$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
+='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
+19530
+
+

يظهر الإخراج أن مثيل Milvus يعمل على المنفذ الافتراضي 19530.

+
+

إذا كنت قد قمت بنشر Milvus في الوضع المستقل، قم بتغيير اسم الكبسولة من my-release-milvus-proxy-xxxxxxxxxx-xxxxx إلى my-release-milvus-xxxxxxxxxx-xxxxx.

+
+

ثم، قم بتشغيل الأمر التالي لإعادة توجيه منفذ محلي إلى المنفذ الذي يخدم فيه ميلفوس.

+
$ kubectl port-forward service/my-release-milvus 27017:19530
+Forwarding from 127.0.0.1:27017 -> 19530
+
+

اختياريًا، يمكنك استخدام :19530 بدلًا من 27017:19530 في الأمر أعلاه للسماح لـ kubectl بتخصيص منفذ محلي لك حتى لا تضطر إلى إدارة تعارضات المنافذ.

+

بشكل افتراضي، يستمع منفذ إعادة توجيه المنفذ الخاص بـ kubectl بشكل افتراضي فقط على localhost. استخدم العلامة address إذا كنت تريد أن يستمع ميلفوس على عناوين IP المحددة أو جميع عناوين IP. الأمر التالي يجعل الأمر التالي المنفذ إلى الأمام يستمع على جميع عناوين IP على الجهاز المضيف.

+

الآن، يمكنك الاتصال ب Milvus باستخدام المنفذ المعاد توجيهه.

+

الوصول إلى Milvus WebUI

يأتي Milvus مزودًا بأداة واجهة مستخدم رسومية مدمجة تسمى Milvus WebUI والتي يمكنك الوصول إليها من خلال متصفحك. تعزز واجهة مستخدم Milvus WebUI إمكانية مراقبة النظام بواجهة بسيطة وبديهية. يمكنك استخدام واجهة مستخدم ويب Milvus Web UI لمراقبة الإحصائيات والمقاييس الخاصة بمكونات وتبعيات Milvus، والتحقق من تفاصيل قاعدة البيانات والتجميع، وسرد تكوينات Milvus المفصلة. للحصول على تفاصيل حول واجهة مستخدم ميلفوس ويب، راجع واجهة مستخدم ميلفوس ويب

+

لتمكين الوصول إلى واجهة مستخدم ويب Milvus Web UI، تحتاج إلى إعادة توجيه منفذ إلى منفذ محلي.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
+Forwarding from 0.0.0.0:27018 -> 9091
+
+

الآن، يمكنك الوصول إلى واجهة مستخدم ويب Milvus Web UI على http://localhost:27018.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
+Forwarding from 0.0.0.0:27017 -> 19530
+
+

الآن، يمكنك الاتصال بـ Milvus باستخدام المنفذ المعاد توجيهه.

+

الوصول إلى واجهة مستخدم ويب ميلفوس

يأتي Milvus مزودًا بأداة مدمجة لواجهة المستخدم الرسومية تسمى Milvus WebUI والتي يمكنك الوصول إليها من خلال متصفحك. تعمل واجهة مستخدم ويب Milvus WebUI على تحسين إمكانية مراقبة النظام من خلال واجهة بسيطة وبديهية. يمكنك استخدام واجهة مستخدم ويب Milvus Web UI لمراقبة الإحصائيات والمقاييس الخاصة بمكونات وتبعيات Milvus، والتحقق من تفاصيل قاعدة البيانات والتجميع، وسرد تكوينات Milvus المفصلة. للحصول على تفاصيل حول واجهة مستخدم ميلفوس ويب، راجع واجهة مستخدم ميلفوس ويب

+

لتمكين الوصول إلى واجهة مستخدم ويب Milvus Web UI، تحتاج إلى إعادة توجيه منفذ إلى منفذ محلي.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
+Forwarding from 0.0.0.0:27018 -> 9091
+
+

الآن، يمكنك الوصول إلى واجهة مستخدم ويب Milvus Web UI على http://localhost:27018.

+

التثبيت دون اتصال

إذا كنت في بيئة مقيدة بالشبكة، اتبع الإجراء الوارد في هذا القسم لبدء مجموعة Milvus.

+

1. احصل على بيان ميلفوس

قم بتشغيل الأمر التالي للحصول على بيان Milvus.

+
$ helm template my-release milvus/milvus > milvus_manifest.yaml
+
+

يقوم الأمر أعلاه بعرض قوالب المخططات لمجموعة Milvus ويحفظ المخرجات في ملف بيان باسم milvus_manifest.yaml. باستخدام هذا البيان، يمكنك تثبيت مجموعة Milvus مع مكوناتها وتوابعها في كبسولات منفصلة.

+
+
    +
  • لتثبيت مثيل Milvus في الوضع المستقل حيث يتم احتواء جميع مكونات Milvus في كبسولة واحدة، يجب عليك تشغيل helm template my-release --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false milvus/milvus > milvus_manifest.yaml بدلاً من ذلك لعرض قوالب البيان لمثيل Milvus في الوضع المستقل.
  • +
  • لتغيير تكوينات Milvus، قم بتحميل قالب value.yaml القالب، ضع الإعدادات التي تريدها فيه، واستخدم helm template -f values.yaml my-release milvus/milvus > milvus_manifest.yaml لعرض البيان وفقًا لذلك.
  • +
+
+

2. تنزيل البرنامج النصي لسحب الصور

تم تطوير البرنامج النصي لسحب الصور بلغة Python. يجب عليك تنزيل البرنامج النصي مع تبعياته في ملف requirement.txt.

+
$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt
+$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py
+
+

3. سحب الصور وحفظها

قم بتشغيل الأمر التالي لسحب الصور المطلوبة وحفظها.

+
$ pip3 install -r requirements.txt
+$ python3 save_image.py --manifest milvus_manifest.yaml
+
+

يتم سحب الصور في مجلد فرعي باسم images في الدليل الحالي.

+

4. تحميل الصور

يمكنك الآن تحميل الصور إلى المضيفين في البيئة المقيدة بالشبكة على النحو التالي:

+
$ for image in $(find . -type f -name "*.tar.gz") ; do gunzip -c $image | docker load; done
+
+

5. نشر ميلفوس

$ kubectl apply -f milvus_manifest.yaml
+
+

حتى الآن، يمكنك اتباع الخطوتين 2 و3 من التثبيت عبر الإنترنت للتحقق من حالة المجموعة وإعادة توجيه منفذ محلي إلى Milvus.

+

ترقية مجموعة ميلفوس قيد التشغيل

قم بتشغيل الأمر التالي لترقية مجموعة Milvus قيد التشغيل إلى أحدث إصدار:

+
$ helm repo update
+$ helm upgrade my-release zilliztech/milvus
+
+

إلغاء تثبيت ميلفوس

قم بتشغيل الأمر التالي لإلغاء تثبيت Milvus.

+
$ helm uninstall my-release
+
+

ما التالي

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json new file mode 100644 index 000000000..fc3529909 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml\n","customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created\nnamespace/cert-manager created\nserviceaccount/cert-manager-cainjector created\n...\nservice/cert-manager created\nservice/cert-manager-webhook created\ndeployment.apps/cert-manager-cainjector created\ndeployment.apps/cert-manager created\ndeployment.apps/cert-manager-webhook created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\n","$ kubectl get pods -n cert-manager\n\nNAME READY STATUS RESTARTS AGE\ncert-manager-848f547974-gccz8 1/1 Running 0 70s\ncert-manager-cainjector-54f4cc6b5-dpj84 1/1 Running 0 70s\ncert-manager-webhook-7c9588c76-tqncn 1/1 Running 0 70s\n","$ helm install milvus-operator \\\n -n milvus-operator --create-namespace \\\n --wait --wait-for-jobs \\\n https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz\n","NAME: milvus-operator\nLAST DEPLOYED: Thu Jul 7 13:18:40 2022\nNAMESPACE: milvus-operator\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nMilvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed\nIf Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`\nFull Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md\nQuick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`\nMore samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples\nCRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml\n","namespace/milvus-operator created\ncustomresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created\nserviceaccount/milvus-operator-controller-manager created\nrole.rbac.authorization.k8s.io/milvus-operator-leader-election-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created\nrolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created\nconfigmap/milvus-operator-manager-config created\nservice/milvus-operator-controller-manager-metrics-service created\nservice/milvus-operator-webhook-service created\ndeployment.apps/milvus-operator-controller-manager created\ncertificate.cert-manager.io/milvus-operator-serving-cert created\nissuer.cert-manager.io/milvus-operator-selfsigned-issuer created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created\n","$ kubectl get pods -n milvus-operator\n\nNAME READY STATUS RESTARTS AGE\nmilvus-operator-5fd77b87dc-msrk4 1/1 Running 0 46s\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","$ kubectl get milvus my-release -o yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n...\nstatus:\n conditions:\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n reason: StorageReady\n status: \"True\"\n type: StorageReady\n - lastTransitionTime: \"2021-11-02T06:06:23Z\"\n message: Pulsar is ready\n reason: PulsarReady\n status: \"True\"\n type: PulsarReady\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n message: Etcd endpoints is healthy\n reason: EtcdReady\n status: \"True\"\n type: EtcdReady\n - lastTransitionTime: \"2021-11-02T06:12:36Z\"\n message: All Milvus components are healthy\n reason: MilvusClusterHealthy\n status: \"True\"\n type: MilvusReady\n endpoint: my-release-milvus.default:19530\n status: Healthy\n","$ kubectl get pods\n\nNAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 14m\nmy-release-etcd-1 1/1 Running 0 14m\nmy-release-etcd-2 1/1 Running 0 14m\nmy-release-milvus-datanode-5c686bd65-wxtmf 1/1 Running 0 6m\nmy-release-milvus-indexnode-5b9787b54-xclbx 1/1 Running 0 6m\nmy-release-milvus-proxy-84f67cdb7f-pg6wf 1/1 Running 0 6m\nmy-release-milvus-querynode-5bcb59f6-nhqqw 1/1 Running 0 6m\nmy-release-milvus-mixcoord-fdcccfc84-9964g 1/1 Running 0 6m\nmy-release-minio-0 1/1 Running 0 14m\nmy-release-minio-1 1/1 Running 0 14m\nmy-release-minio-2 1/1 Running 0 14m\nmy-release-minio-3 1/1 Running 0 14m\nmy-release-pulsar-bookie-0 1/1 Running 0 14m\nmy-release-pulsar-bookie-1 1/1 Running 0 14m\nmy-release-pulsar-bookie-init-h6tfz 0/1 Completed 0 14m\nmy-release-pulsar-broker-0 1/1 Running 0 14m\nmy-release-pulsar-broker-1 1/1 Running 0 14m\nmy-release-pulsar-proxy-0 1/1 Running 0 14m\nmy-release-pulsar-proxy-1 1/1 Running 0 14m\nmy-release-pulsar-pulsar-init-d2t56 0/1 Completed 0 14m\nmy-release-pulsar-recovery-0 1/1 Running 0 14m\nmy-release-pulsar-toolset-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 13m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 13m\n","$ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl delete milvus my-release\n","$ helm -n milvus-operator uninstall milvus-operator\n","$ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml\n"],"headingContent":"Run Milvus in Kubernetes with Milvus Operator","anchorList":[{"label":"تشغيل Milvus في Kubernetes باستخدام مشغل Milvus","href":"Run-Milvus-in-Kubernetes-with-Milvus-Operator","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تثبيت مشغل Milvus","href":"Install-Milvus-Operator","type":2,"isActive":false},{"label":"نشر ميلفوس","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"الوصول إلى Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"إلغاء تثبيت ميلفوس","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"إلغاء تثبيت مشغل ميلفوس","href":"Uninstall-Milvus-Operator","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md new file mode 100644 index 000000000..ca3119158 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md @@ -0,0 +1,392 @@ +--- +id: install_cluster-milvusoperator.md +label: Milvus Operator +related_key: Kubernetes +summary: تعلم كيفية تثبيت مجموعة Milvus العنقودية على Kubernetes باستخدام مشغل Milvus +title: تثبيت مجموعة ميلفوس العنقودية مع مشغل ميلفوس +--- +

تشغيل Milvus في Kubernetes باستخدام مشغل Milvus

توضح هذه الصفحة كيفية بدء تشغيل مثيل Milvus في Kubernetes باستخدام مشغل Milvus.

+

نظرة عامة

مشغّل Milvus هو حل يساعدك على نشر وإدارة مكدس خدمة Milvus كامل لمجموعات Kubernetes (K8s) المستهدفة. تتضمن الحزمة جميع مكونات Milvus والتبعيات ذات الصلة مثل etcd وPulsar وMinIO.

+

المتطلبات الأساسية

    +
  • إنشاء مجموعة K8s.

  • +
  • تثبيت StorageClass. يمكنك التحقق من StorageClass المثبت على النحو التالي.

    +
    $ kubectl get sc
    +
    +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
    +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
    +
  • +
  • تحقق من متطلبات الأجهزة والبرامج قبل التثبيت.

  • +
  • قبل تثبيت Milvus، يوصى باستخدام أداة تحجيم Milvus لتقدير متطلبات الأجهزة بناءً على حجم بياناتك. يساعد ذلك على ضمان الأداء الأمثل وتخصيص الموارد لتثبيت Milvus الخاص بك.

  • +
+
+

إذا واجهتك أي مشاكل في سحب الصورة، اتصل بنا على community@zilliz.com مع تفاصيل المشكلة، وسنقدم لك الدعم اللازم.

+
+

تثبيت مشغل Milvus

يقوم مشغل Milvus بتعريف الموارد المخصصة لمجموعة Milvus على رأس موارد Kubernetes المخصصة. عندما يتم تعريف الموارد المخصصة، يمكنك استخدام واجهات برمجة تطبيقات K8s بطريقة توضيحية وإدارة مكدس نشر Milvus لضمان قابليته للتوسع والتوافر العالي.

+

1. تثبيت مدير الشهادات

يستخدم مشغل Milvus مدير الشهادات لتوفير شهادة لخادم خطاف الويب.

+
+ +
+

قم بتشغيل الأمر التالي لتثبيت cert-manager.

+
$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
+
+

سترى إخراجاً مشابهاً لما يلي بعد انتهاء عملية التثبيت.

+
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
+customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
+customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
+customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
+customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
+customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
+namespace/cert-manager created
+serviceaccount/cert-manager-cainjector created
+...
+service/cert-manager created
+service/cert-manager-webhook created
+deployment.apps/cert-manager-cainjector created
+deployment.apps/cert-manager created
+deployment.apps/cert-manager-webhook created
+mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
+validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
+
+

يمكنك التحقق مما إذا كانت كبسولات cert-manager قيد التشغيل على النحو التالي:

+
$ kubectl get pods -n cert-manager
+
+NAME                                      READY   STATUS    RESTARTS   AGE
+cert-manager-848f547974-gccz8             1/1     Running   0          70s
+cert-manager-cainjector-54f4cc6b5-dpj84   1/1     Running   0          70s
+cert-manager-webhook-7c9588c76-tqncn      1/1     Running   0          70s
+
+

2. تثبيت مشغل ميلفوس

يمكنك تثبيت مشغل ميلفوس بأي من الطريقتين التاليتين:

+ +

التثبيت باستخدام Helm

قم بتشغيل الأمر التالي لتثبيت مشغل ميلفوس باستخدام Helm.

+
$ helm install milvus-operator \
+  -n milvus-operator --create-namespace \
+  --wait --wait-for-jobs \
+  https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz
+
+

سترى مخرجات مشابهة لما يلي بعد انتهاء عملية التثبيت.

+
NAME: milvus-operator
+LAST DEPLOYED: Thu Jul  7 13:18:40 2022
+NAMESPACE: milvus-operator
+STATUS: deployed
+REVISION: 1
+TEST SUITE: None
+NOTES:
+Milvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed
+If Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`
+Full Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md
+Quick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`
+More samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples
+CRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD
+
+

التثبيت باستخدام kubectl

قم بتشغيل الأمر التالي لتثبيت مشغل Milvus مع kubectl.

+
$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
+
+

سترى الإخراج المشابه لما يلي بعد انتهاء عملية التثبيت.

+
namespace/milvus-operator created
+customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
+serviceaccount/milvus-operator-controller-manager created
+role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
+clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
+clusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created
+clusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created
+rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
+clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
+clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created
+configmap/milvus-operator-manager-config created
+service/milvus-operator-controller-manager-metrics-service created
+service/milvus-operator-webhook-service created
+deployment.apps/milvus-operator-controller-manager created
+certificate.cert-manager.io/milvus-operator-serving-cert created
+issuer.cert-manager.io/milvus-operator-selfsigned-issuer created
+mutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created
+validatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created
+
+

يمكنك التحقق من تشغيل جراب مشغل ميلفوس على النحو التالي:

+
$ kubectl get pods -n milvus-operator
+
+NAME                               READY   STATUS    RESTARTS   AGE
+milvus-operator-5fd77b87dc-msrk4   1/1     Running   0          46s
+
+

نشر ميلفوس

1. نشر مجموعة ميلفوس

بمجرد تشغيل جراب مشغل Milvus، يمكنك نشر مجموعة Milvus على النحو التالي.

+
$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
+
+

يقوم الأمر أعلاه بنشر مجموعة Milvus مع مكوناتها وتوابعها في كبسولات منفصلة باستخدام التكوينات الافتراضية. لتخصيص هذه الإعدادات، نوصيك باستخدام أداة تحجيم Milvus لضبط التكوينات بناءً على حجم بياناتك الفعلي ثم تنزيل ملف YAML المقابل. لمعرفة المزيد حول معلمات التكوين، راجع قائمة مراجعة تكوينات نظام Milvus.

+
+
    +
  • يجب أن يحتوي اسم الإصدار على أحرف وأرقام وشرطات فقط. النقاط غير مسموح بها في اسم الإصدار.
  • +
  • يمكنك أيضًا نشر مثيل Milvus في الوضع المستقل، حيث يتم تضمين جميع مكوناته داخل حجرة واحدة. للقيام بذلك، قم بتغيير عنوان URL لملف التكوين في الأمر أعلاه إلى https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_default.yaml
  • +
+
+

2. تحقق من حالة مجموعة ميلفوس

قم بتشغيل الأمر التالي للتحقق من حالة مجموعة ميلفوس العنقودية

+
$ kubectl get milvus my-release -o yaml
+
+

بمجرد أن تصبح مجموعة Milvus جاهزة، يجب أن تكون مخرجات الأمر أعلاه مشابهة لما يلي. إذا بقي الحقل status.status Unhealthy ، فإن مجموعة ميلفوس الخاصة بك لا تزال قيد الإنشاء.

+
apiVersion: milvus.io/v1alpha1
+kind: Milvus
+metadata:
+...
+status:
+  conditions:
+  - lastTransitionTime: "2021-11-02T05:59:41Z"
+    reason: StorageReady
+    status: "True"
+    type: StorageReady
+  - lastTransitionTime: "2021-11-02T06:06:23Z"
+    message: Pulsar is ready
+    reason: PulsarReady
+    status: "True"
+    type: PulsarReady
+  - lastTransitionTime: "2021-11-02T05:59:41Z"
+    message: Etcd endpoints is healthy
+    reason: EtcdReady
+    status: "True"
+    type: EtcdReady
+  - lastTransitionTime: "2021-11-02T06:12:36Z"
+    message: All Milvus components are healthy
+    reason: MilvusClusterHealthy
+    status: "True"
+    type: MilvusReady
+  endpoint: my-release-milvus.default:19530
+  status: Healthy
+
+

ينشئ مشغل Milvus تبعيات Milvus، مثل etcd وPulsar وMinIO، ثم مكونات Milvus، مثل الوكيل والمنسقين والعقد.

+

بمجرد أن تصبح مجموعة Milvus جاهزة، يجب أن تكون حالة جميع الكبسولات في مجموعة Milvus مشابهة لما يلي.

+
$ kubectl get pods
+
+NAME                                            READY   STATUS      RESTARTS   AGE
+my-release-etcd-0                               1/1     Running     0          14m
+my-release-etcd-1                               1/1     Running     0          14m
+my-release-etcd-2                               1/1     Running     0          14m
+my-release-milvus-datanode-5c686bd65-wxtmf      1/1     Running     0          6m
+my-release-milvus-indexnode-5b9787b54-xclbx     1/1     Running     0          6m
+my-release-milvus-proxy-84f67cdb7f-pg6wf        1/1     Running     0          6m
+my-release-milvus-querynode-5bcb59f6-nhqqw      1/1     Running     0          6m
+my-release-milvus-mixcoord-fdcccfc84-9964g      1/1     Running     0          6m
+my-release-minio-0                              1/1     Running     0          14m
+my-release-minio-1                              1/1     Running     0          14m
+my-release-minio-2                              1/1     Running     0          14m
+my-release-minio-3                              1/1     Running     0          14m
+my-release-pulsar-bookie-0                      1/1     Running     0          14m
+my-release-pulsar-bookie-1                      1/1     Running     0          14m
+my-release-pulsar-bookie-init-h6tfz             0/1     Completed   0          14m
+my-release-pulsar-broker-0                      1/1     Running     0          14m
+my-release-pulsar-broker-1                      1/1     Running     0          14m
+my-release-pulsar-proxy-0                       1/1     Running     0          14m
+my-release-pulsar-proxy-1                       1/1     Running     0          14m
+my-release-pulsar-pulsar-init-d2t56             0/1     Completed   0          14m
+my-release-pulsar-recovery-0                    1/1     Running     0          14m
+my-release-pulsar-toolset-0                     1/1     Running     0          14m
+my-release-pulsar-zookeeper-0                   1/1     Running     0          14m
+my-release-pulsar-zookeeper-1                   1/1     Running     0          13m
+my-release-pulsar-zookeeper-2                   1/1     Running     0          13m
+
+

3. إعادة توجيه منفذ محلي إلى ميلفوس

قم بتشغيل الأمر التالي للحصول على المنفذ الذي تعمل عليه مجموعة Milvus العنقودية الخاصة بك.

+
$ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template
+='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
+19530
+
+

يُظهر الإخراج أن مثيل Milvus يعمل على المنفذ الافتراضي 19530.

+
+

إذا كنت قد قمت بنشر Milvus في الوضع المستقل، قم بتغيير اسم الكبسولة من my-release-milvus-proxy-xxxxxxxxxx-xxxxx إلى my-release-milvus-xxxxxxxxxx-xxxxx.

+
+

ثم، قم بتشغيل الأمر التالي لإعادة توجيه منفذ محلي إلى المنفذ الذي يخدم فيه ميلفوس.

+
$ kubectl port-forward service/my-release-milvus 27017:19530
+Forwarding from 127.0.0.1:27017 -> 19530
+
+

اختياريًا، يمكنك استخدام :19530 بدلًا من 27017:19530 في الأمر أعلاه للسماح لـ kubectl بتخصيص منفذ محلي لك حتى لا تضطر إلى إدارة تعارضات المنافذ.

+

بشكل افتراضي، يستمع منفذ إعادة توجيه المنفذ الخاص بـ kubectl بشكل افتراضي فقط على localhost. استخدم العلامة address إذا كنت تريد أن يستمع ميلفوس على عناوين IP المحددة أو جميع عناوين IP. الأمر التالي يجعل الأمر التالي المنفذ إلى الأمام يستمع على جميع عناوين IP على الجهاز المضيف.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
+Forwarding from 0.0.0.0:27017 -> 19530
+
+

الآن، يمكنك الاتصال ب Milvus باستخدام المنفذ المعاد توجيهه.

+

الوصول إلى Milvus WebUI

يأتي Milvus مزودًا بأداة واجهة مستخدم رسومية مدمجة تسمى Milvus WebUI والتي يمكنك الوصول إليها من خلال متصفحك. تعزز واجهة مستخدم Milvus WebUI إمكانية مراقبة النظام بواجهة بسيطة وبديهية. يمكنك استخدام واجهة مستخدم ويب Milvus Web UI لمراقبة الإحصائيات والمقاييس الخاصة بمكونات وتبعيات Milvus، والتحقق من تفاصيل قاعدة البيانات والتجميع، وسرد تكوينات Milvus المفصلة. للحصول على تفاصيل حول واجهة مستخدم ميلفوس ويب، راجع واجهة مستخدم ميلفوس ويب

+

لتمكين الوصول إلى واجهة مستخدم ويب Milvus Web UI، تحتاج إلى إعادة توجيه منفذ إلى منفذ محلي.

+
$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
+Forwarding from 0.0.0.0:27018 -> 9091
+
+

الآن، يمكنك الوصول إلى واجهة مستخدم ويب Milvus Web UI على http://localhost:27018.

+

إلغاء تثبيت ميلفوس

قم بتشغيل الأمر التالي لإلغاء تثبيت مجموعة Milvus.

+
$ kubectl delete milvus my-release
+
+
+
    +
  • عندما تقوم بحذف مجموعة Milvus باستخدام التكوين الافتراضي، لا يتم حذف التبعيات مثل etcd وPulsar وMinIO. لذلك، في المرة القادمة عندما تقوم بتثبيت نفس مثيل مجموعة Milvus، سيتم استخدام هذه التبعيات مرة أخرى.
  • +
  • لحذف التبعيات والسحب الافتراضية الخاصة (PVCs) مع مجموعة Milvus العنقودية، راجع ملف التكوين.
  • +
+
+

إلغاء تثبيت مشغل ميلفوس

هناك أيضًا طريقتان لإلغاء تثبيت مشغل Milvus.

+ +

إلغاء التثبيت باستخدام Helm

$ helm -n milvus-operator uninstall milvus-operator
+
+

إلغاء التثبيت باستخدام kubectl

$ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml
+
+

ما التالي

بعد تثبيت Milvus في Docker، يمكنك:

+ diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.json b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.json new file mode 100644 index 000000000..6e82658d9 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n","$ minikube start\n","$ kubectl cluster-info\n"],"headingContent":"Requirements for running Milvus on Kubernetes","anchorList":[{"label":"متطلبات تشغيل Milvus على Kubernetes","href":"Requirements-for-running-Milvus-on-Kubernetes","type":1,"isActive":false},{"label":"متطلبات الأجهزة","href":"Hardware-requirements","type":2,"isActive":false},{"label":"متطلبات البرنامج","href":"Software-requirements","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQs","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.md b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.md new file mode 100644 index 000000000..f3d20e7a4 --- /dev/null +++ b/localization/v2.5.x/site/ar/getstarted/run-milvus-k8s/prerequisite-helm.md @@ -0,0 +1,148 @@ +--- +id: prerequisite-helm.md +label: Install on Kubernetes +related_key: Kubernetes +summary: تعرف على الاستعدادات اللازمة قبل تثبيت Milvus مع Helm. +title: متطلبات تشغيل Milvus على Kubernetes +--- +

متطلبات تشغيل Milvus على Kubernetes

تسرد هذه الصفحة متطلبات الأجهزة والبرمجيات لتشغيل ميلفوس وتشغيله.

+

متطلبات الأجهزة

+ + + + + + + + + +
المكوناتالمتطلباتالتوصيةملاحظة
وحدة المعالجة المركزية
  • وحدة معالجة مركزية Intel من الجيل الثاني أو أعلى
  • أبل سيليكون
  • مستقل: 4 نواة أو أكثر
  • عنقودي: 8 نواة أو أكثر
مجموعة تعليمات وحدة المعالجة المركزية
  • SSE4.2
  • AVX
  • AVX2
  • AVX-512
  • SSE4.2
  • AVX
  • AVX2
  • AVX-512
يتطلب البحث عن تشابه المتجهات وإنشاء الفهرس داخل Milvus دعم وحدة المعالجة المركزية لمجموعات امتدادات التعليمات الأحادية والبيانات المتعددة (SIMD). تأكد من أن وحدة المعالجة المركزية تدعم واحدة على الأقل من امتدادات SIMD المدرجة. راجع وحدات المعالجة المركزية مع AVX لمزيد من المعلومات.
ذاكرة الوصول العشوائي
  • مستقل: 8G
  • المجموعة العنقودية: 32G
  • مستقل: 16G
  • الكتلة: 128G
يعتمد حجم ذاكرة الوصول العشوائي على حجم البيانات.
القرص الصلبمحرك SATA 3.0 SSD أو CloudStorageNVMe SSD أو أعلىيعتمد حجم القرص الصلب على حجم البيانات.
+

متطلبات البرنامج

يوصى بتشغيل مجموعة Kubernetes على منصات Linux.

+

kubectl هي أداة سطر الأوامر لـ Kubernetes. استخدم إصدار kubectl الذي يقع ضمن فرق إصدار ثانوي واحد من مجموعتك. يساعد استخدام أحدث إصدار من kubectl على تجنب المشاكل غير المتوقعة.

+

يلزم استخدام minikube عند تشغيل مجموعة Kubernetes محليًا. يتطلب minikube Docker كتابع. تأكد من تثبيت Docker قبل تثبيت Milvus باستخدام Helm. راجع الحصول على Docker لمزيد من المعلومات.

+ + + + + + + +
نظام التشغيلالبرمجياتملاحظة
منصات لينكس
  • Kubernetes 1.16 أو أحدث
  • كوبكتل
  • هيلم 3.0.0 أو أحدث
  • مينيكيوب صغير (لميلفوس مستقل)
  • Docker 19.03 أو أحدث (لميلفوس مستقل)
انظر مستندات Helm لمزيد من المعلومات.
+ + + + + + + + + +
البرمجياتالإصدارملاحظة
إلخd3.5.0انظر متطلبات القرص الإضافية.
مينيوRELEASE.2023-03-20T20-16-18Z
بولسار2.8.2
+

متطلبات القرص الإضافية

أداء القرص أمر بالغ الأهمية لـ etcd. يوصى بشدة باستخدام أقراص NVMe SSD المحلية. قد تتسبب استجابة القرص الأبطأ في إجراء انتخابات متكررة للمجموعة مما سيؤدي في النهاية إلى تدهور خدمة إلخd.

+

لاختبار ما إذا كان قرصك مؤهلاً، استخدم fio.

+
mkdir test-data
+fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
+
+

من الناحية المثالية، يجب أن يصل القرص الخاص بك إلى أكثر من 500 IOPS وأقل من 10 مللي ثانية لنسبة 99% من زمن انتقال المزامنة. اقرأ مستندات etcd لمزيد من المتطلبات التفصيلية.

+

الأسئلة الشائعة

كيف يمكنني بدء تشغيل مجموعة K8s محليًا لأغراض الاختبار؟

يمكنك استخدام أدوات مثل minikube و kind و Kubeadm لإعداد مجموعة Kubernetes محليًا بسرعة. يستخدم الإجراء التالي minikube كمثال.

+
    +
  1. تنزيل الميني كيوب
  2. +
+

انتقل إلى صفحة البدء، وتحقق مما إذا كنت قد استوفيت الشروط المدرجة في قسم ما ستحتاجه، وانقر على الأزرار التي تصف منصتك المستهدفة، وانسخ الأوامر لتنزيل وتثبيت البرنامج الثنائي.

+
    +
  1. ابدأ تشغيل مجموعة K8s باستخدام minikube
  2. +
+
$ minikube start
+
+
    +
  1. تحقق من حالة مجموعة K8s العنقودية
  2. +
+

يمكنك التحقق من حالة مجموعة K8s المثبتة باستخدام الأمر التالي.

+
$ kubectl cluster-info
+
+
+

تأكد من أنه يمكنك الوصول إلى مجموعة K8s العنقودية عبر kubectl. إذا لم تكن قد قمت بتثبيت kubectl محليًا، راجع استخدام kubectl داخل minikube.

+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/home/home.json b/localization/v2.5.x/site/ar/home/home.json new file mode 100644 index 000000000..9b8b6edc8 --- /dev/null +++ b/localization/v2.5.x/site/ar/home/home.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"","anchorList":[{"label":"ابدأ الآن","href":"Get-Started","type":2,"isActive":false},{"label":"مقالات موصى بها","href":"Recommended-articles","type":2,"isActive":false},{"label":"الجديد في المستندات","href":"Whats-new-in-docs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/home/home.md b/localization/v2.5.x/site/ar/home/home.md new file mode 100644 index 000000000..95610dc51 --- /dev/null +++ b/localization/v2.5.x/site/ar/home/home.md @@ -0,0 +1,122 @@ +--- +id: home.md +--- +
+

+مرحبًا بك في مستندات ميلفوس!

+

+ستتعرف هنا على ماهية Milvus، وكيفية تثبيت Milvus واستخدامه ونشره لإنشاء تطبيق وفقًا لاحتياجات عملك.

+
+
+
+

جرّب ميلفوس المُدار مجاناً!

+

زيليز كلاود Zilliz Cloud خالية من المتاعب، مدعومة من ميلفوس وأسرع 10 مرات.

+
+ +
+

ابدأ الآن

+
+ + icon +

تعرف على كيفية تثبيت Milvus باستخدام Docker Compose أو على Kubernetes.

+
+
+ + icon +

تعرف على كيفية تشغيل Milvus بسرعة باستخدام نموذج التعليمات البرمجية.

+
+
+ + icon +

+ تعلم كيفية إنشاء تطبيقات البحث عن التشابه المتجه باستخدام Milvus.

+
+
+ +
+

الجديد في المستندات

2024 نوفمبر 2024 - إصدار ميلفوس 2.5.0

+ +
diff --git a/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.json b/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.json new file mode 100644 index 000000000..a3627c102 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/HydroXai/pii-masker-v1.git\n$ cd pii-masker-v1/pii-masker\n","$ pip install --upgrade pymilvus openai requests tqdm dataset\n","$ export OPENAI_API_KEY=sk-***********\n","text_lines = [\n \"Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16\",\n \"Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.\",\n \"In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.\",\n \"Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.\",\n]\n","from model import PIIMasker\n\nmasker = PIIMasker()\n","masked_results = []\nfor full_text in text_lines:\n masked_text, _ = masker.mask_pii(full_text)\n masked_results.append(masked_text)\n\nfor res in masked_results:\n print(res + \"\\n\")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(masked_results, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"What was the office address of Hiroshi's partner from Munich?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=1, # Return top 1 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say \"I don't know\".\nAI:\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus + PII Masker","anchorList":[{"label":"بناء RAG مع برنامج Milvus + PII Masker","href":"Build-RAG-with-Milvus-+-PII-Masker","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.md b/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.md new file mode 100644 index 000000000..88db97478 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/RAG_with_pii_and_milvus.md @@ -0,0 +1,242 @@ +--- +id: RAG_with_pii_and_milvus.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (استرجاع-توليد معزز) باستخدام Milvus و PII Masker. +title: بناء RAG مع برنامج Milvus + PII Masker +--- +

بناء RAG مع برنامج Milvus + PII Masker

PII (معلومات التعريف الشخصية) هي نوع من البيانات الحساسة التي يمكن استخدامها لتحديد هوية الأفراد.

+

إن أداةPII Masker، التي طورتها شركة HydroX AI، هي أداة متقدمة مفتوحة المصدر مصممة لحماية بياناتك الحساسة من خلال الاستفادة من نماذج الذكاء الاصطناعي المتطورة. وسواء كنت تتعامل مع بيانات العملاء، أو تقوم بتحليل البيانات، أو تضمن الامتثال للوائح الخصوصية، فإن PII Masker يوفر لك حلاً قويًا وقابلًا للتطوير للحفاظ على أمان معلوماتك.

+

في هذا البرنامج التعليمي، سوف نعرض كيفية استخدام PII Masker مع Milvus لحماية البيانات الخاصة في تطبيقات RAG (الاسترجاع-التوليد المعزز). من خلال الجمع بين نقاط القوة في برنامج PII Masker لإخفاء البيانات مع استرجاع البيانات الفعال من Milvus، يمكنك إنشاء خطوط أنابيب آمنة ومتوافقة مع الخصوصية للتعامل مع المعلومات الحساسة بثقة. يضمن هذا النهج أن تطبيقاتك مجهزة لتلبية معايير الخصوصية وحماية بيانات المستخدم بفعالية.

+

الإعداد

ابدأ باستخدام PII Masker

اتبع دليل تثبيت PII Masker لتثبيت التبعيات المطلوبة وتنزيل النموذج. إليك دليل بسيط:

+
$ git clone https://github.com/HydroXai/pii-masker-v1.git
+$ cd pii-masker-v1/pii-masker
+
+

قم بتنزيل النموذج منhttps://huggingface.co/hydroxai/pii_model_weight ، واستبدله بالملفات في: pii-masker/output_model/deberta3base_1024/

+

التبعيات والبيئة

$ pip install --upgrade pymilvus openai requests tqdm dataset
+
+

سنستخدم OpenAI كنموذج LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
$ export OPENAI_API_KEY=sk-***********
+
+

ثم يمكنك إنشاء دفتر ملاحظات python أو jupyter لتشغيل الكود التالي.

+

إعداد البيانات

لنقم بإنشاء بعض الأسطر المزيفة التي تحتوي على معلومات PII لأغراض الاختبار أو العرض التوضيحي.

+
text_lines = [
+    "Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16",
+    "Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.",
+    "In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.",
+    "Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.",
+]
+
+

قم بإخفاء البيانات باستخدام PIIMasker

لنقم بتهيئة كائن PIIMasker وتحميل النموذج.

+
from model import PIIMasker
+
+masker = PIIMasker()
+
+

ثم نقوم بإخفاء PII من قائمة من الأسطر النصية ونطبع النتائج المقنعة.

+
masked_results = []
+for full_text in text_lines:
+    masked_text, _ = masker.mask_pii(full_text)
+    masked_results.append(masked_text)
+
+for res in masked_results:
+    print(res + "\n")
+
+
Alice [B-NAME] , a resident of Dublin Ireland attended flower festival at Hyde Park on May 15 2023 [B-PHONE_NUM] She entered the park noon using her digital passport number 23 [B-ID_NUM] [B-NAME] afternoon admiring various flowers and plants attending gardening workshop having light snack one food stalls While there she met another visitor Mr Thompson who was visiting from London They exchanged tips shared contact information : ' s address 492 [I-STREET_ADDRESS] his cell phone + [B-PHONE_NUM] [B-NAME] details home Ranch [B-STREET_ADDRESS]
+
+Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]
+
+In an online forum discussion about culinary exchanges around the world [I-STREET_ADDRESS] several participants shared their experiences [I-STREET_ADDRESS] One user Male with email 2022 [B-EMAIL] his insights He mentioned ID code 1 [B-ID_NUM] [I-PHONE_NUM] reference number L [B-ID_NUM] residing in Italy but originally from Australia provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 456 [I-STREET_ADDRESS]
+
+Another user joined the conversation on topic of international volunteering opportunities . Identified as Female , she used email 2023 [B-EMAIL] share her story She noted 98 [B-ID_NUM] [I-PHONE_NUM] M [B-ID_NUM] residing in Germany but originally from Brazil provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 789 [I-STREET_ADDRESS] DE 10 178
+
+

إعداد نموذج التضمين

نقوم بتهيئة عميل OpenAI لإعداد نموذج التضمين.

+
from openai import OpenAI
+
+openai_client = OpenAI()
+
+

نحدد دالة لإنشاء تضمينات نصية باستخدام عميل OpenAI. نستخدم نموذج text-embedding-3-small كمثال.

+
def emb_text(text):
+    return (
+        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
+        .data[0]
+        .embedding
+    )
+
+

توليد تضمين اختباري وطباعة أبعاده والعناصر القليلة الأولى.

+
test_embedding = emb_text("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
1536
+[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+
+

بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين ميزة المصادقة على Milvus، فاستخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
collection_name = "my_rag_collection"
+
+if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بالتكرار من خلال الأسطر النصية المقنعة، وأنشئ التضمينات، ثم أدخل البيانات في ملفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+for i, line in enumerate(tqdm(masked_results, desc="Creating embeddings")):
+    data.append({"id": i, "vector": emb_text(line), "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 4/4 [00:01<00:00,  2.60it/s]
+
+
+
+
+
+{'insert_count': 4, 'ids': [0, 1, 2, 3], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

دعنا نحدد سؤالاً عن المستندات.

+
question = "What was the office address of Hiroshi's partner from Munich?"
+
+

ابحث عن السؤال في المجموعة واسترجع أعلى تطابق دلالي من الدرجة الأولى.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[
+        emb_text(question)
+    ],  # Use the `emb_text` function to convert the question to an embedding vector
+    limit=1,  # Return top 1 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

لنلقِ نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        "Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]",
+        0.6544462442398071
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج.

+

ملاحظة: نخبر LLM إذا لم تكن هناك معلومات مفيدة في المقتطفات، فقط قل "لا أعرف".

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say "I don't know".
+AI:
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم OpenAI ChatGPT لإنشاء استجابة بناءً على المطالبات.

+
response = openai_client.chat.completions.create(
+    model="gpt-4o-mini",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
I don't know.
+
+

هنا يمكننا أن نرى، بما أننا استبدلنا معلومات تحديد الهوية الشخصية بأقنعة، لا يمكن لـ LLM الحصول على معلومات تحديد الهوية الشخصية في السياق. لذلك يجيب: "لا أعرف". من خلال هذه الطريقة، يمكننا حماية خصوصية المستخدمين بشكل فعال.

diff --git a/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.json b/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.json new file mode 100644 index 000000000..aa1af2a69 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0\n","import os\nfrom getpass import getpass\n\nos.environ[\"APIFY_API_TOKEN\"] = getpass(\"Enter YOUR APIFY_API_TOKEN\")\nos.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter YOUR OPENAI_API_KEY\")\n","os.environ[\"MILVUS_URI\"] = getpass(\"Enter YOUR MILVUS_URI\")\nos.environ[\"MILVUS_TOKEN\"] = getpass(\"Enter YOUR MILVUS_TOKEN\")\n\nMILVUS_COLLECTION_NAME = \"apify\"\n","from apify_client import ApifyClient\n\nclient = ApifyClient(os.getenv(\"APIFY_API_TOKEN\"))\n\nactor_id = \"apify/website-content-crawler\"\nrun_input = {\n \"crawlerType\": \"cheerio\",\n \"maxCrawlPages\": 10,\n \"startUrls\": [{\"url\": \"https://milvus.io/\"}, {\"url\": \"https://zilliz.com/\"}],\n}\n\nactor_call = client.actor(actor_id).call(run_input=run_input)\n","dataset_id = actor_call[\"defaultDatasetId\"]\ndataset_id\n","item = client.dataset(dataset_id).list_items(limit=1).items\nitem[0].get(\"text\")\n","milvus_integration_inputs = {\n \"milvusUri\": os.getenv(\"MILVUS_URI\"),\n \"milvusToken\": os.getenv(\"MILVUS_TOKEN\"),\n \"milvusCollectionName\": MILVUS_COLLECTION_NAME,\n \"datasetFields\": [\"text\", \"metadata.title\"],\n \"datasetId\": actor_call[\"defaultDatasetId\"],\n \"performChunking\": True,\n \"embeddingsApiKey\": os.getenv(\"OPENAI_API_KEY\"),\n \"embeddingsProvider\": \"OpenAI\",\n}\n","actor_call = client.actor(\"apify/milvus-integration\").call(\n run_input=milvus_integration_inputs\n)\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.vectorstores import Milvus\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n\nvectorstore = Milvus(\n connection_args={\n \"uri\": os.getenv(\"MILVUS_URI\"),\n \"token\": os.getenv(\"MILVUS_TOKEN\"),\n },\n embedding_function=embeddings,\n collection_name=MILVUS_COLLECTION_NAME,\n)\n\nprompt = PromptTemplate(\n input_variables=[\"context\", \"question\"],\n template=\"Use the following pieces of retrieved context to answer the question. If you don't know the answer, \"\n \"just say that you don't know. \\nQuestion: {question} \\nContext: {context} \\nAnswer:\",\n)\n\n\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n\n\nrag_chain = (\n {\n \"context\": vectorstore.as_retriever() | format_docs,\n \"question\": RunnablePassthrough(),\n }\n | prompt\n | ChatOpenAI(model=\"gpt-4o-mini\")\n | StrOutputParser()\n)\n","question = \"What is Milvus database?\"\n\nrag_chain.invoke(question)\n"],"headingContent":"Retrieval-Augmented Generation: Crawling Websites with Apify and Saving Data to Milvus for Question Answering","anchorList":[{"label":"التوليد المعزز للاسترجاع: الزحف إلى مواقع الويب باستخدام Apify وحفظ البيانات في ملفوس للإجابة على الأسئلة","href":"Retrieval-Augmented-Generation-Crawling-Websites-with-Apify-and-Saving-Data-to-Milvus-for-Question-Answering","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":1,"isActive":false},{"label":"تثبيت التبعيات","href":"Install-dependencies","type":2,"isActive":false},{"label":"إعداد مفاتيح Apify وOPENAI_API","href":"Set-up-Apify-and-Open-API-keys","type":2,"isActive":false},{"label":"إعداد URI ورمز URI لقاعدة بيانات ميلفوس/زيلز والرمز المميز واسم المجموعة","href":"Set-up-MilvusZilliz-URI-token-and-collection-name","type":2,"isActive":false},{"label":"استخدام زاحف محتوى الموقع الإلكتروني لكشط المحتوى النصي من Milvus.io","href":"Using-the-Website-Content-Crawler-to-scrape-text-content-from-Milvusio","type":2,"isActive":false},{"label":"الاسترجاع وخط أنابيب توليد LLM","href":"Retrieval-and-LLM-generative-pipeline","type":1,"isActive":false},{"label":"الخاتمة","href":"Conclusion","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.md b/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.md new file mode 100644 index 000000000..bd6973e98 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/apify_milvus_rag.md @@ -0,0 +1,267 @@ +--- +id: apify_milvus_rag.md +summary: >- + يشرح هذا البرنامج التعليمي كيفية الزحف إلى مواقع الويب باستخدام أداة زحف محتوى + الموقع الإلكتروني من Apify وحفظ البيانات في قاعدة بيانات Milvus/Zilliz المتجهة + لاستخدامها لاحقًا في الإجابة عن الأسئلة. +title: >- + التوليد المعزز للاسترجاع: الزحف إلى مواقع الويب باستخدام Apify وحفظ البيانات + في ملفوس للإجابة على الأسئلة +--- +

التوليد المعزز للاسترجاع: الزحف إلى مواقع الويب باستخدام Apify وحفظ البيانات في ملفوس للإجابة على الأسئلة

Open In Colab

+

يشرح هذا البرنامج التعليمي كيفية الزحف إلى مواقع الويب باستخدام برنامج Apify لزحف محتوى مواقع الويب وحفظ البيانات في قاعدة بيانات Milvus/Zilliz المتجهة لاستخدامها لاحقًا للإجابة عن الأسئلة.

+

Apify عبارة عن منصة تجريف واستخراج البيانات من الويب تقدم سوقًا للتطبيقات مع أكثر من ألفي أداة سحابية جاهزة، تُعرف باسم Actors. هذه الأدوات مثالية لحالات الاستخدام مثل استخراج البيانات المهيكلة من مواقع التجارة الإلكترونية، ووسائل التواصل الاجتماعي، ومحركات البحث، والخرائط على الإنترنت، وغيرها.

+

على سبيل المثال، يمكن لـ "ممثل زاحف محتوى الموقع الإلكتروني " الزحف بعمق إلى مواقع الويب، وتنظيف HTML الخاص بها عن طريق إزالة ملفات تعريف الارتباط أو التذييل أو التنقل، ثم تحويل HTML إلى Markdown.

+

يسهّل تكامل Apify لـ Milvus/Zilliz تحميل البيانات من الويب إلى قاعدة بيانات المتجهات.

+

قبل أن تبدأ

قبل تشغيل هذا الدفتر، تأكد من أن لديك ما يلي:

+
    +
  • حساب Apify و APIFY_API_TOKEN.

  • +
  • حساب OpenAI وحساب OPENAI_API_API_KEY

  • +
  • حساب Zilliz Cloud (خدمة سحابية مُدارة بالكامل لـ Milvus).

  • +
  • URI قاعدة بيانات Zilliz URI والرمز المميز

  • +
+

تثبيت التبعيات

$ pip install --upgrade --quiet  apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
+
+

إعداد مفاتيح Apify وOPENAI_API

import os
+from getpass import getpass
+
+os.environ["APIFY_API_TOKEN"] = getpass("Enter YOUR APIFY_API_TOKEN")
+os.environ["OPENAI_API_KEY"] = getpass("Enter YOUR OPENAI_API_KEY")
+
+
Enter YOUR APIFY_API_TOKEN··········
+Enter YOUR OPENAI_API_KEY··········
+
+

إعداد URI ورمز URI لقاعدة بيانات ميلفوس/زيلز والرمز المميز واسم المجموعة

تحتاج إلى URI والرمز المميز لـ Milvus/Zilliz لإعداد العميل.

+
    +
  • إذا كان لديك خادم Milvus منشور ذاتيًا على Docker أو Kubernetes، استخدم عنوان الخادم والمنفذ كـ URI الخاص بك، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين ميزة المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فاترك الرمز المميز كسلسلة فارغة.
  • +
  • إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
  • +
+

لاحظ أن المجموعة لا تحتاج إلى أن تكون موجودة مسبقًا. سيتم إنشاؤها تلقائيًا عند تحميل البيانات إلى قاعدة البيانات.

+
os.environ["MILVUS_URI"] = getpass("Enter YOUR MILVUS_URI")
+os.environ["MILVUS_TOKEN"] = getpass("Enter YOUR MILVUS_TOKEN")
+
+MILVUS_COLLECTION_NAME = "apify"
+
+
Enter YOUR MILVUS_URI··········
+Enter YOUR MILVUS_TOKEN··········
+
+

استخدام زاحف محتوى الموقع الإلكتروني لكشط المحتوى النصي من Milvus.io

بعد ذلك، سنستخدم زاحف محتوى الموقع الإلكتروني مع Apify Python SDK. سنبدأ بتعريف actor_id و run_input، ثم نحدد المعلومات التي سيتم حفظها في قاعدة بيانات المتجهات.

+

actor_id="apify/website-content-crawler" هو معرّف زاحف محتوى الموقع الإلكتروني. يمكن التحكم بسلوك الزاحف بشكل كامل من خلال معلمات run_input (انظر صفحة الإدخال لمزيد من التفاصيل). في هذا المثال، سنقوم في هذا المثال بالزحف إلى وثائق ميلفوس، والتي لا تتطلب عرض جافا سكريبت. لذلك، نقوم بتعيين crawlerType=cheerio ، وتحديد startUrls ، والحد من عدد الصفحات التي يتم الزحف إليها عن طريق تعيين maxCrawlPages=10.

+
from apify_client import ApifyClient
+
+client = ApifyClient(os.getenv("APIFY_API_TOKEN"))
+
+actor_id = "apify/website-content-crawler"
+run_input = {
+    "crawlerType": "cheerio",
+    "maxCrawlPages": 10,
+    "startUrls": [{"url": "https://milvus.io/"}, {"url": "https://zilliz.com/"}],
+}
+
+actor_call = client.actor(actor_id).call(run_input=run_input)
+
+

سيقوم زاحف محتوى الموقع الإلكتروني بالزحف إلى الموقع بشكل كامل حتى يصل إلى الحد المحدد مسبقًا الذي تم تعيينه بواسطة maxCrawlPages. سيتم تخزين البيانات التي تم كشطها في Dataset على منصة Apify. للوصول إلى هذه البيانات وتحليلها، يمكنك استخدام defaultDatasetId

+
dataset_id = actor_call["defaultDatasetId"]
+dataset_id
+
+
'P9dLFfeJAljlePWnz'
+
+

يقوم الكود التالي بجلب البيانات التي تم كشطها من Apify Dataset ويعرض أول موقع تم كشطه

+
item = client.dataset(dataset_id).list_items(limit=1).items
+item[0].get("text")
+
+
'The High-Performance Vector Database Built for Scale\nStart running Milvus in seconds\nfrom pymilvus import MilvusClient client = MilvusClient("milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=5 )\nDeployment Options to Match Your Unique Journey\nMilvus Lite\nLightweight, easy to start\nVectorDB-as-a-library runs in notebooks/ laptops with a pip install\nBest for learning and prototyping\nMilvus Standalone\nRobust, single-machine deployment\nComplete vector database for production or testing\nIdeal for datasets with up to millions of vectors\nMilvus Distributed\nScalable, enterprise-grade solution\nHighly reliable and distributed vector database with comprehensive toolkit\nScale horizontally to handle billions of vectors\nZilliz Cloud\nFully managed with minimal operations\nAvailable in both serverless and dedicated cluster\nSaaS and BYOC options for different security and compliance requirements\nTry Free\nLearn more about different Milvus deployment models\nLoved by GenAI developers\nBased on our research, Milvus was selected as the vector database of choice (over Chroma and Pinecone). Milvus is an open-source vector database designed specifically for similarity search on massive datasets of high-dimensional vectors.\nWith its focus on efficient vector similarity search, Milvus empowers you to build robust and scalable image retrieval systems. Whether you’re managing a personal photo library or developing a commercial image search application, Milvus offers a powerful foundation for unlocking the hidden potential within your image collections.\nBhargav Mankad\nSenior Solution Architect\nMilvus is a powerful vector database tailored for processing and searching extensive vector data. It stands out for its high performance and scalability, rendering it perfect for machine learning, deep learning, similarity search tasks, and recommendation systems.\nIgor Gorbenko\nBig Data Architect\nStart building your GenAI app now\nGuided with notebooks developed by us and our community\nRAG\nTry Now\nImage Search\nTry Now\nMultimodal Search\nTry Now\nUnstructured Data Meetups\nJoin a Community of Passionate Developers and Engineers Dedicated to Gen AI.\nRSVP now\nWhy Developers Prefer Milvus for Vector Databases\nScale as needed\nElastic scaling to tens of billions of vectors with distributed architecture.\nBlazing fast\nRetrieve data quickly and accurately with Global Index, regardless of scale.\nReusable Code\nWrite once, and deploy with one line of code into the production environment.\nFeature-rich\nMetadata filtering, hybrid search, multi-vector and more.\nWant to learn more about Milvus? View our documentation\nJoin the community of developers building GenAI apps with Milvus, now with over 25 million downloads\nGet Milvus Updates\nSubscribe to get updates on the latest Milvus releases, tutorials and training from Zilliz, the creator and key maintainer of Milvus.'
+
+

لتحميل البيانات إلى قاعدة بيانات Milvus، نستخدم تكامل Apify Milvus. أولاً، نحتاج إلى إعداد المعلمة لقاعدة بيانات Milvus. بعد ذلك، نختار الحقول (datasetFields) التي نريد تخزينها في قاعدة البيانات. في المثال أدناه، نقوم بحفظ الحقل text و metadata.title.

+
milvus_integration_inputs = {
+    "milvusUri": os.getenv("MILVUS_URI"),
+    "milvusToken": os.getenv("MILVUS_TOKEN"),
+    "milvusCollectionName": MILVUS_COLLECTION_NAME,
+    "datasetFields": ["text", "metadata.title"],
+    "datasetId": actor_call["defaultDatasetId"],
+    "performChunking": True,
+    "embeddingsApiKey": os.getenv("OPENAI_API_KEY"),
+    "embeddingsProvider": "OpenAI",
+}
+
+

الآن، سنستدعي apify/milvus-integration لتخزين البيانات

+
actor_call = client.actor("apify/milvus-integration").call(
+    run_input=milvus_integration_inputs
+)
+
+

يتم الآن تخزين جميع البيانات التي تم كشطها في قاعدة بيانات ميلفوس وهي جاهزة للاسترجاع والإجابة عن الأسئلة

+

الاسترجاع وخط أنابيب توليد LLM

بعد ذلك، سنقوم بتعريف خط أنابيب الاسترجاع المعزز باستخدام لانجشين. يعمل خط الأنابيب على مرحلتين:

+
    +
  • مخزن المتجهات (ميلفوس): تسترجع Langchain المستندات ذات الصلة من Milvus من خلال مطابقة تضمينات الاستعلام مع تضمينات المستندات المخزنة.
  • +
  • استجابة LLM: توفر المستندات المسترجعة سياقًا لـ LLM (على سبيل المثال، GPT-4) لتوليد إجابة مستنيرة.
  • +
+

للمزيد من التفاصيل حول سلسلة RAG، يُرجى الرجوع إلى وثائق لانغشين.

+
from langchain_core.output_parsers import StrOutputParser
+from langchain_core.prompts import PromptTemplate
+from langchain_core.runnables import RunnablePassthrough
+from langchain_milvus.vectorstores import Milvus
+from langchain_openai import ChatOpenAI, OpenAIEmbeddings
+
+embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
+
+vectorstore = Milvus(
+    connection_args={
+        "uri": os.getenv("MILVUS_URI"),
+        "token": os.getenv("MILVUS_TOKEN"),
+    },
+    embedding_function=embeddings,
+    collection_name=MILVUS_COLLECTION_NAME,
+)
+
+prompt = PromptTemplate(
+    input_variables=["context", "question"],
+    template="Use the following pieces of retrieved context to answer the question. If you don't know the answer, "
+    "just say that you don't know. \nQuestion: {question} \nContext: {context} \nAnswer:",
+)
+
+
+def format_docs(docs):
+    return "\n\n".join(doc.page_content for doc in docs)
+
+
+rag_chain = (
+    {
+        "context": vectorstore.as_retriever() | format_docs,
+        "question": RunnablePassthrough(),
+    }
+    | prompt
+    | ChatOpenAI(model="gpt-4o-mini")
+    | StrOutputParser()
+)
+
+

بمجرد حصولنا على البيانات في قاعدة البيانات، يمكننا البدء في طرح الأسئلة

+
+
question = "What is Milvus database?"
+
+rag_chain.invoke(question)
+
+
'Milvus is an open-source vector database specifically designed for billion-scale vector similarity search. It facilitates efficient management and querying of vector data, which is essential for applications involving unstructured data, such as AI and machine learning. Milvus allows users to perform operations like CRUD (Create, Read, Update, Delete) and vector searches, making it a powerful tool for handling large datasets.'
+
+

الخاتمة

أوضحنا في هذا البرنامج التعليمي كيفية الزحف إلى محتوى موقع الويب باستخدام Apify، وتخزين البيانات في قاعدة بيانات Milvus vector، واستخدام خط أنابيب معزز للاسترجاع لأداء مهام الإجابة عن الأسئلة. من خلال الجمع بين إمكانات Apify في كشط الويب مع Milvus/Zilliz لتخزين المتجهات وLangchain لنماذج اللغة، يمكنك بناء أنظمة استرجاع معلومات فعالة للغاية.

+

ولتحسين جمع البيانات وتحديثها في قاعدة البيانات، يوفر تكامل Apify تحديثات تدريجية، والتي تقوم بتحديث البيانات الجديدة أو المعدلة فقط بناءً على المجموع الاختباري. بالإضافة إلى ذلك، يمكنه إزالة البيانات القديمة التي لم يتم الزحف إليها خلال فترة زمنية محددة تلقائيًا. تساعد هذه الميزات في الحفاظ على تحسين قاعدة بياناتك المتجهة وضمان بقاء خط أنابيب الاسترجاع المعزز فعالاً ومحدثاً بأقل جهد يدوي ممكن.

+

للمزيد من التفاصيل حول تكامل Apify-Milvus، يُرجى الرجوع إلى وثائق Apify Milvus وملف README للتكامل.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.json new file mode 100644 index 000000000..e52c7200d --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus git+https://github.com/topoteretes/cognee.git\n","import os\n\nimport cognee\n\ncognee.config.set_llm_api_key(\"YOUR_OPENAI_API_KEY\")\n\n\nos.environ[\"VECTOR_DB_PROVIDER\"] = \"milvus\"\nos.environ[\"VECTOR_DB_URL\"] = \"./milvus.db\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","await cognee.add(data=text_lines, dataset_name=\"milvus_faq\")\nawait cognee.cognify()\n\n# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\\n\\nYes. When ...\n# ...\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)\n\nprint(search_results[0])\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)\n","def format_and_print(data):\n print(\"ID:\", data[\"id\"])\n print(\"\\nText:\\n\")\n paragraphs = data[\"text\"].split(\"\\n\\n\")\n for paragraph in paragraphs:\n print(paragraph.strip())\n print()\n\n\nformat_and_print(search_results[0])\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","# We only use one line of text as the dataset, which simplifies the output later\ntext = \"\"\"\n Natural language processing (NLP) is an interdisciplinary\n subfield of computer science and information retrieval.\n \"\"\"\n\nawait cognee.add(text)\nawait cognee.cognify()\n","query_text = \"Tell me about NLP\"\nsearch_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)\n\nfor result_text in search_results:\n print(result_text)\n\n# Example output:\n# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})\n# (...)\n#\n# It represents nodes and relationships in the knowledge graph:\n# - The first element is the source node (e.g., 'natural language processing').\n# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').\n# - The third element is the target node (e.g., 'computer science').\n"],"headingContent":"","anchorList":[{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.md new file mode 100644 index 000000000..cd91a2a93 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_cognee.md @@ -0,0 +1,159 @@ +--- +id: build_RAG_with_milvus_and_cognee.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (التوليد المعزز للاسترجاع) باستخدام Milvus و Cognee. +title: بناء RAG مع ميلفوس وكوجنيي +--- +

+Open In Colab + + +GitHub Repository +

+

بناء RAG مع Milvus و Cognee

Cognee هي عبارة عن منصة للمطورين أولاً تعمل على تبسيط عملية تطوير تطبيقات الذكاء الاصطناعي من خلال خطوط أنابيب ECL (استخلاص، تعرف، تحميل) قابلة للتطوير والتركيب. من خلال التكامل بسلاسة مع Milvus، تتيح Cognee إمكانية الاتصال واسترجاع المحادثات والمستندات والنسخ بكفاءة، مما يقلل من الهلوسة ويحسّن التكاليف التشغيلية.

+

وبفضل الدعم القوي لمخازن المتجهات مثل Milvus وقواعد بيانات الرسوم البيانية وLLMs، توفر Cognee إطار عمل مرن وقابل للتخصيص لبناء أنظمة توليد الاسترجاع المعزز (RAG). تضمن بنيتها الجاهزة للإنتاج تحسين الدقة والكفاءة للتطبيقات التي تعمل بالذكاء الاصطناعي.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية بناء خط أنابيب (RAG) للتوليد المعزز للاسترجاع باستخدام Milvus وCognee.

+
$ pip install pymilvus git+https://github.com/topoteretes/cognee.git
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

بشكل افتراضي، يستخدم OpenAI كـ LLM في هذا المثال. يجب إعداد مفتاح واجهة برمجة التطبيقات، وتعيينه في وظيفة التكوين set_llm_api_key().

+

لتهيئة Milvus كقاعدة بيانات المتجهات، قم بتعيين VECTOR_DB_PROVIDER إلى milvus وحدد VECTOR_DB_URL و VECTOR_DB_KEY. نظرًا لأننا نستخدم Milvus Lite لتخزين البيانات في هذا العرض التوضيحي، يجب توفير VECTOR_DB_URL فقط.

+
import os
+
+import cognee
+
+cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
+
+
+os.environ["VECTOR_DB_PROVIDER"] = "milvus"
+os.environ["VECTOR_DB_URL"] = "./milvus.db"
+
+
+

أما بالنسبة لمتغيرات البيئة VECTOR_DB_URL و VECTOR_DB_KEY:

+
    +
  • يعد تعيين VECTOR_DB_URL كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ VECTOR_DB_URL.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط VECTOR_DB_URL و VECTOR_DB_KEY ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+

+

إعداد البيانات

نستخدم صفحات الأسئلة الشائعة من وثائق ميلفوس 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

بناء RAG

إعادة تعيين بيانات كوجني

await cognee.prune.prune_data()
+await cognee.prune.prune_system(metadata=True)
+
+

مع وجود قائمة نظيفة جاهزة، يمكننا الآن إضافة مجموعة البيانات الخاصة بنا ومعالجتها في رسم بياني معرفي.

+

إضافة البيانات والتعرف على

await cognee.add(data=text_lines, dataset_name="milvus_faq")
+await cognee.cognify()
+
+# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
+# ...
+
+

تقوم الطريقة add بتحميل مجموعة البيانات (الأسئلة الشائعة في ملف Milvus) إلى Cognee وتقوم الطريقة cognify بمعالجة البيانات لاستخراج الكيانات والعلاقات والملخصات، وبناء رسم بياني معرفي.

+

الاستعلام عن الملخصات

الآن بعد أن تمت معالجة البيانات، دعونا نستعلم عن الرسم البياني المعرفي.

+
from cognee.api.v1.search import SearchType
+
+query_text = "How is data stored in milvus?"
+search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
+
+print(search_results[0])
+
+
{'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
+
+

يقوم هذا الاستعلام بالبحث في الرسم البياني المعرفي عن ملخص مرتبط بنص الاستعلام، ويتم طباعة المرشح الأكثر ارتباطًا.

+

الاستعلام عن الأجزاء

توفر الملخصات رؤى عالية المستوى، ولكن للحصول على تفاصيل أكثر دقة، يمكننا الاستعلام عن أجزاء محددة من البيانات مباشرةً من مجموعة البيانات المعالجة. يتم اشتقاق هذه الأجزاء من البيانات الأصلية التي تمت إضافتها وتحليلها أثناء إنشاء الرسم البياني المعرفي.

+
from cognee.api.v1.search import SearchType
+
+query_text = "How is data stored in milvus?"
+search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
+
+

لنقم بتنسيقها وعرضها لسهولة القراءة بشكل أفضل!

+
def format_and_print(data):
+    print("ID:", data["id"])
+    print("\nText:\n")
+    paragraphs = data["text"].split("\n\n")
+    for paragraph in paragraphs:
+        print(paragraph.strip())
+        print()
+
+
+format_and_print(search_results[0])
+
+
ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
+
+Text:
+
+Where does Milvus store data?
+
+Milvus deals with two types of data, inserted data and metadata.
+
+Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
+
+Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
+
+###
+
+

في خطواتنا السابقة، استعلمنا عن مجموعة بيانات الأسئلة الشائعة في ميلفوس عن كل من الملخصات وأجزاء محددة من البيانات. على الرغم من أن ذلك وفّر رؤى مفصّلة ومعلومات دقيقة، إلا أن مجموعة البيانات كانت كبيرة، مما جعل من الصعب تصور التبعيات بوضوح داخل الرسم البياني المعرفي.

+

لمعالجة ذلك، سنقوم بإعادة ضبط بيئة Cognee والعمل مع مجموعة بيانات أصغر وأكثر تركيزًا. سيسمح لنا ذلك بإظهار العلاقات والتبعيات المستخرجة أثناء عملية Cognify بشكل أفضل. من خلال تبسيط البيانات، يمكننا أن نرى بوضوح كيف تقوم Cognee بتنظيم وهيكلة المعلومات في الرسم البياني المعرفي.

+

إعادة تعيين Cognee

await cognee.prune.prune_data()
+await cognee.prune.prune_system(metadata=True)
+
+

إضافة مجموعة البيانات المركزة

هنا، تتم إضافة مجموعة بيانات أصغر تحتوي على سطر واحد فقط من النص ومعالجتها لضمان الحصول على رسم بياني معرفي مركّز وسهل التفسير.

+
# We only use one line of text as the dataset, which simplifies the output later
+text = """
+    Natural language processing (NLP) is an interdisciplinary
+    subfield of computer science and information retrieval.
+    """
+
+await cognee.add(text)
+await cognee.cognify()
+
+

الاستعلام عن الرؤى

من خلال التركيز على مجموعة البيانات الأصغر هذه، يمكننا الآن تحليل العلاقات والبنية داخل الرسم البياني المعرفي بوضوح.

+
query_text = "Tell me about NLP"
+search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
+
+for result_text in search_results:
+    print(result_text)
+
+# Example output:
+# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
+# (...)
+#
+# It represents nodes and relationships in the knowledge graph:
+# - The first element is the source node (e.g., 'natural language processing').
+# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
+# - The third element is the target node (e.g., 'computer science').
+
+

يمثل هذا الناتج نتائج استعلام الرسم البياني المعرفي، ويعرض الكيانات (العُقد) وعلاقاتها (الحواف) كما تم استخراجها من مجموعة البيانات المعالجة. تتضمن كل عقدة كيان مصدر ونوع العلاقة والكيان المستهدف، بالإضافة إلى البيانات الوصفية مثل المعرفات الفريدة والأوصاف والطوابع الزمنية. يسلط الرسم البياني الضوء على المفاهيم الأساسية وروابطها الدلالية، مما يوفر فهمًا منظمًا لمجموعة البيانات.

+

تهانينا، لقد تعلمت الاستخدام الأساسي لـ cognee مع ميلفوس. إذا كنت ترغب في معرفة المزيد من الاستخدامات المتقدمة لـ cognee، يرجى الرجوع إلى صفحته الرسمية .

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.json new file mode 100644 index 000000000..959231329 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"DEEPSEEK_API_KEY\"] = \"***********\"\n","! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\ndeepseek_client = OpenAI(\n api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n base_url=\"https://api.deepseek.com\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = deepseek_client.chat.completions.create(\n model=\"deepseek-chat\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and DeepSeek","anchorList":[{"label":"بناء RAG مع Milvus و DeepSeek","href":"Build-RAG-with-Milvus-and-DeepSeek","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.md new file mode 100644 index 000000000..9fb43e5a3 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_deepseek.md @@ -0,0 +1,247 @@ +--- +id: build_RAG_with_milvus_and_deepseek.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب استرجاع-مُعزَّز (RAG) باستخدام Milvus و DeepSeek. +title: بناء RAG مع Milvus و DeepSeek +--- +

بناء RAG مع Milvus و DeepSeek

Open In Colab +GitHub Repository

+

يتيحDeepSeek للمطورين إنشاء تطبيقات الذكاء الاصطناعي وتوسيع نطاقها باستخدام نماذج لغوية عالية الأداء. وهو يوفر استدلالاً فعالاً وواجهات برمجة تطبيقات مرنة وبنى متقدمة لمزيج الخبراء (MoE) لمهام الاستدلال والاسترجاع القوية.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب الاسترجاع المعزز (RAG) باستخدام Milvus و DeepSeek.

+

التحضير

التبعيات والبيئة

! pip install --upgrade pymilvus[model] openai requests tqdm
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يقوم DeepSeek بتمكين واجهة برمجة التطبيقات على غرار OpenAI. يمكنك تسجيل الدخول إلى موقعه الرسمي وإعداد مفتاح واجهة برمجة التطبيقات DEEPSEEK_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["DEEPSEEK_API_KEY"] = "***********"
+
+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد LLM ونموذج التضمين

يُمكِّن DeepSeek واجهة برمجة التطبيقات على غرار OpenAI، ويمكنك استخدام واجهة برمجة التطبيقات نفسها مع تعديلات طفيفة لاستدعاء LLM.

+
from openai import OpenAI
+
+deepseek_client = OpenAI(
+    api_key=os.environ["DEEPSEEK_API_KEY"],
+    base_url="https://api.deepseek.com",
+)
+
+

حدد نموذج تضمين لتوليد تضمينات نصية باستخدام milvus_model. نستخدم نموذج DefaultEmbeddingFunction كمثال، وهو نموذج تضمين خفيف الوزن ومدرب مسبقًا.

+
from pymilvus import model as milvus_model
+
+embedding_model = milvus_model.DefaultEmbeddingFunction()
+
+

توليد تضمين اختباري وطباعة أبعاده والعناصر القليلة الأولى.

+
test_embedding = embedding_model.encode_queries(["This is a test"])[0]
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
768
+[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
+ -0.03041712 -0.02269499 -0.02317863 -0.00426028]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة لحجة MilvusClient:

+
    +
  • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+doc_embeddings = embedding_model.encode_documents(text_lines)
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings:   0%|          | 0/72 [00:00<?, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
+To disable this warning, you can either:
+    - Avoid using `tokenizers` before the fork if possible
+    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
+Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 246522.36it/s]
+
+
+
+
+
+{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=embedding_model.encode_queries(
+        [question]
+    ),  # Convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.6572665572166443
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        0.6312146186828613
+    ],
+    [
+        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
+        0.6115777492523193
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ميلفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم النموذج deepseek-chat المقدم من DeepSeek لإنشاء استجابة بناءً على المطالبات.

+
response = deepseek_client.chat.completions.create(
+    model="deepseek-chat",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
In Milvus, data is stored in two main categories: inserted data and metadata.
+
+1. **Inserted Data**: This includes vector data, scalar data, and collection-specific schema. The inserted data is stored in persistent storage as incremental logs. Milvus supports various object storage backends for this purpose, such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
+
+2. **Metadata**: Metadata is generated within Milvus and is specific to each Milvus module. This metadata is stored in etcd, a distributed key-value store.
+
+Additionally, when data is inserted, it is first loaded into a message queue, and Milvus returns success at this stage. The data is then written to persistent storage as incremental logs by the data node. If the `flush()` function is called, the data node is forced to write all data in the message queue to persistent storage immediately.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus و DeepSeek.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.json new file mode 100644 index 000000000..b52979d15 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"FIREWORKS_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nfireworks_client = OpenAI(\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n base_url=\"https://api.fireworks.ai/inference/v1\",\n)\n","def emb_text(text):\n return (\n fireworks_client.embeddings.create(\n input=text, model=\"nomic-ai/nomic-embed-text-v1.5\"\n )\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = fireworks_client.chat.completions.create(\n model=\"accounts/fireworks/models/llama-v3p1-405b-instruct\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Fireworks AI","anchorList":[{"label":"بناء RAG مع Milvus و Fireworks AI","href":"Build-RAG-with-Milvus-and-Fireworks-AI","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.md new file mode 100644 index 000000000..2368b57b1 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_fireworks.md @@ -0,0 +1,248 @@ +--- +id: build_RAG_with_milvus_and_fireworks.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (التوليد المعزز للاسترجاع) باستخدام Milvus و Fireworks AI. +title: بناء RAG مع Milvus و Fireworks AI +--- +

بناء RAG مع Milvus و Fireworks AI

+Open In Colab + + +GitHub Repository +

+

FireworksAI عبارة عن منصة استدلالية توليدية للذكاء الاصطناعي توفر سرعة رائدة في المجال وجاهزية إنتاجية لتشغيل النماذج وتخصيصها. توفر Fireworks AI مجموعة متنوعة من خدمات الذكاء الاصطناعي التوليدي، بما في ذلك النماذج بدون خادم، وعمليات النشر عند الطلب، وقدرات الضبط الدقيق. وهي توفر بيئة شاملة لنشر نماذج الذكاء الاصطناعي المختلفة، بما في ذلك النماذج اللغوية الكبيرة (LLMs) ونماذج التضمين. تقوم Fireworks AI بتجميع العديد من النماذج، مما يتيح للمستخدمين الوصول إلى هذه الموارد والاستفادة منها بسهولة دون الحاجة إلى إعداد بنية تحتية واسعة النطاق.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب RAG (التوليد المعزز للاسترجاع) باستخدام Milvus و Fireworks AI.

+

الإعداد

التبعيات والبيئة

$ pip install --upgrade pymilvus openai requests tqdm
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يتيح Fireworks AI واجهة برمجة تطبيقات على غرار OpenAI. يمكنك تسجيل الدخول إلى موقعه الرسمي على الويب وإعداد مفتاح API FIREWORKS_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["FIREWORKS_API_KEY"] = "***********"
+
+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد LLM ونموذج التضمين

نقوم بتهيئة العميل لإعداد LLM ونموذج التضمين. يُمكِّن Fireworks AI واجهة برمجة التطبيقات على غرار OpenAI، ويمكنك استخدام واجهة برمجة التطبيقات نفسها مع تعديلات طفيفة لاستدعاء نموذج التضمين ونموذج LLM.

+
from openai import OpenAI
+
+fireworks_client = OpenAI(
+    api_key=os.environ["FIREWORKS_API_KEY"],
+    base_url="https://api.fireworks.ai/inference/v1",
+)
+
+

حدد دالة لإنشاء تضمينات نصية باستخدام العميل. نستخدم نموذج nomic-ai/nomic-embed-text-v1.5 كمثال.

+
def emb_text(text):
+    return (
+        fireworks_client.embeddings.create(
+            input=text, model="nomic-ai/nomic-embed-text-v1.5"
+        )
+        .data[0]
+        .embedding
+    )
+
+

إنشاء تضمين اختباري وطباعة بُعده والعناصر القليلة الأولى.

+
test_embedding = emb_text("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
768
+[0.04815673828125, 0.0261993408203125, -0.1749267578125, -0.03131103515625, 0.068115234375, -0.00621795654296875, 0.03955078125, -0.0210723876953125, 0.039703369140625, -0.0286102294921875]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة للوسيطة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": emb_text(line), "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 72/72 [00:28<00:00,  2.51it/s]
+
+
+
+
+
+{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[
+        emb_text(question)
+    ],  # Use the `emb_text` function to convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.8334928750991821
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        0.746377170085907
+    ],
+    [
+        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
+        0.7328270673751831
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ميلفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم النموذج llama-v3p1-405b-instruct المقدم من Fireworks لإنشاء استجابة بناءً على المطالبات.

+
response = fireworks_client.chat.completions.create(
+    model="accounts/fireworks/models/llama-v3p1-405b-instruct",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
According to the provided context, Milvus stores data in two ways:
+
+1. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. This can be done using multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
+2. Metadata, which are generated within Milvus, are stored in etcd, with each Milvus module having its own metadata.
+
+Additionally, when data is inserted, it is first loaded into a message queue, and then written to persistent storage as incremental logs by the data node. The `flush()` function can be used to force the data node to write all data in the message queue to persistent storage immediately.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus و Fireworks AI.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.json new file mode 100644 index 000000000..551e49754 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus google-generativeai requests tqdm\n","import os\n\nos.environ[\"GEMINI_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","import google.generativeai as genai\n\ngenai.configure(api_key=os.environ[\"GEMINI_API_KEY\"])\n\ngemini_model = genai.GenerativeModel(\"gemini-1.5-flash\")\n\nresponse = gemini_model.generate_content(\"who are you\")\nprint(response.text)\n","test_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=[\"This is a test1\", \"This is a test2\"]\n)[\"embedding\"]\n\nembedding_dim = len(test_embeddings[0])\nprint(embedding_dim)\nprint(test_embeddings[0][:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=text_lines\n)[\"embedding\"]\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","question_embedding = genai.embed_content(\n model=\"models/text-embedding-004\", content=question\n)[\"embedding\"]\n\nsearch_res = milvus_client.search(\n collection_name=collection_name,\n data=[question_embedding],\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","gemini_model = genai.GenerativeModel(\n \"gemini-1.5-flash\", system_instruction=SYSTEM_PROMPT\n)\nresponse = gemini_model.generate_content(USER_PROMPT)\nprint(response.text)\n"],"headingContent":"Build RAG with Milvus and Gemini","anchorList":[{"label":"بناء RAG مع Milvus وGemini","href":"Build-RAG-with-Milvus-and-Gemini","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.md new file mode 100644 index 000000000..7dfe17780 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_gemini.md @@ -0,0 +1,246 @@ +--- +id: build_RAG_with_milvus_and_gemini.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (استرجاع-توليد معزز) باستخدام Milvus و Gemini. سنستخدم نموذج Gemini + لإنشاء نص بناءً على استعلام معين. سنستخدم أيضًا Milvus لتخزين واسترجاع النص + الذي تم إنشاؤه. +title: بناء RAG مع Milvus وGemini +--- +

+Open In Colab + + +GitHub Repository +

+

بناء RAG مع Milvus وGemini

تساعدك واجهة برمجة تطبيقات Gemini و Gemini API وGoogle AI Studio على بدء العمل مع أحدث نماذج Google وتحويل أفكارك إلى تطبيقات قابلة للتطوير. يوفر Gemini إمكانية الوصول إلى نماذج لغوية قوية مثل Gemini-1.5-Flash و Gemini-1.5-Flash-8B و Gemini-1.5-Pro لمهام مثل توليد النصوص ومعالجة المستندات والرؤية وتحليل الصوت والمزيد. تسمح لك واجهة برمجة التطبيقات بإدخال سياق طويل بملايين الرموز، وضبط النماذج لمهام محددة، وإنشاء مخرجات منظمة مثل JSON، والاستفادة من إمكانيات مثل الاسترجاع الدلالي وتنفيذ التعليمات البرمجية.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب RAG (استرجاع-جيل معزز) باستخدام Milvus و Gemini. سنستخدم نموذج Gemini لإنشاء نص بناءً على استعلام معين. سنستخدم أيضًا Milvus لتخزين واسترجاع النص الذي تم إنشاؤه.

+

التحضير

التبعيات والبيئة

$ pip install --upgrade pymilvus google-generativeai requests tqdm
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يجب عليك أولاً تسجيل الدخول إلى منصة Google AI Studio وإعداد مفتاح api GEMINI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["GEMINI_API_KEY"] = "***********"
+
+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد LLM ونموذج التضمين

نستخدم gemini-1.5-flash كنموذج LLM، و text-embedding-004 كنموذج تضمين.

+

لنحاول توليد استجابة اختبارية من LLM:

+
import google.generativeai as genai
+
+genai.configure(api_key=os.environ["GEMINI_API_KEY"])
+
+gemini_model = genai.GenerativeModel("gemini-1.5-flash")
+
+response = gemini_model.generate_content("who are you")
+print(response.text)
+
+
I am a large language model, trained by Google.  I am an AI and don't have a personal identity or consciousness.  My purpose is to process information and respond to a wide range of prompts and questions in a helpful and informative way.
+
+

توليد تضمين اختباري وطباعة بُعده والعناصر القليلة الأولى.

+
test_embeddings = genai.embed_content(
+    model="models/text-embedding-004", content=["This is a test1", "This is a test2"]
+)["embedding"]
+
+embedding_dim = len(test_embeddings[0])
+print(embedding_dim)
+print(test_embeddings[0][:10])
+
+
768
+[0.013588584, -0.004361838, -0.08481652, -0.039724775, 0.04723794, -0.0051557426, 0.026071774, 0.045514572, -0.016867816, 0.039378334]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة للوسيطة MilvusClient:

+
    +
  • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+doc_embeddings = genai.embed_content(
+    model="models/text-embedding-004", content=text_lines
+)["embedding"]
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 468201.38it/s]
+
+
+
+
+
+{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
question_embedding = genai.embed_content(
+    model="models/text-embedding-004", content=question
+)["embedding"]
+
+search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[question_embedding],
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.8048275113105774
+    ],
+    [
+        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
+        0.7574886679649353
+    ],
+    [
+        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
+        0.7453608512878418
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ميلفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم الجوزاء لإنشاء استجابة بناءً على المطالبات.

+
gemini_model = genai.GenerativeModel(
+    "gemini-1.5-flash", system_instruction=SYSTEM_PROMPT
+)
+response = gemini_model.generate_content(USER_PROMPT)
+print(response.text)
+
+
Milvus stores data in two ways:  Inserted data (vector data, scalar data, and collection-specific schema) is stored as an incremental log in persistent storage using object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.  Metadata, generated by each Milvus module, is stored in etcd.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus و Gemini.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.json new file mode 100644 index 000000000..d74498d22 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"LEPTONAI_TOKEN\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nlepton_client = OpenAI(\n api_key=os.environ[\"LEPTONAI_TOKEN\"],\n base_url=\"https://mistral-7b.lepton.run/api/v1/\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = lepton_client.chat.completions.create(\n model=\"mistral-7b\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Lepton AI","anchorList":[{"label":"بناء RAG مع Milvus و Lepton AI","href":"Build-RAG-with-Milvus-and-Lepton-AI","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.md new file mode 100644 index 000000000..57892385b --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_lepton.md @@ -0,0 +1,243 @@ +--- +id: build_RAG_with_milvus_and_lepton.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (جيل الاسترجاع المعزز) باستخدام Milvus و Lepton AI. +title: بناء RAG مع Milvus و Lepton AI +--- +

بناء RAG مع Milvus و Lepton AI

+Open In Colab + + +GitHub Repository +

+

يمكّنليبتون للذكاء الاصطناعي المطورين والمؤسسات من تشغيل تطبيقات الذكاء الاصطناعي بكفاءة في دقائق، وعلى نطاق جاهز للإنتاج. يتيح لك ليبتون للذكاء الاصطناعي بناء النماذج بطريقة بايثون الأصلية، وتصحيح واختبار النماذج محلياً، ونشرها على السحابة بأمر واحد، واستهلاك النماذج في أي تطبيق باستخدام واجهة برمجة تطبيقات بسيطة ومرنة. يوفر بيئة شاملة لنشر نماذج الذكاء الاصطناعي المختلفة، بما في ذلك النماذج اللغوية الكبيرة (LLMs) ونماذج الانتشار، دون الحاجة إلى إعداد بنية تحتية واسعة النطاق.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب RAG (التوليد المعزز للاسترجاع) باستخدام Milvus و Lepton AI.

+

الإعداد

التبعيات والبيئة

$ pip install --upgrade pymilvus[model] openai requests tqdm
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يُمكّن Lepton واجهة برمجة التطبيقات على غرار OpenAI. يمكنك تسجيل الدخول إلى موقعه الرسمي وإعداد مفتاح واجهة برمجة التطبيقات LEPTONAI_TOKEN كمتغير بيئة.

+
import os
+
+os.environ["LEPTONAI_TOKEN"] = "***********"
+
+

إعداد البيانات

نستخدم صفحات الأسئلة الشائعة من وثائق ميلفوس 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد LLM ونموذج التضمين

يمكّن Lepton واجهة برمجة التطبيقات على غرار OpenAI، ويمكنك استخدام واجهة برمجة التطبيقات نفسها مع تعديلات طفيفة لاستدعاء LLM.

+
from openai import OpenAI
+
+lepton_client = OpenAI(
+    api_key=os.environ["LEPTONAI_TOKEN"],
+    base_url="https://mistral-7b.lepton.run/api/v1/",
+)
+
+

حدد نموذج تضمين لتوليد تضمينات نصية باستخدام milvus_model. نستخدم نموذج DefaultEmbeddingFunction كمثال، وهو نموذج تضمين خفيف الوزن ومدرب مسبقًا.

+
from pymilvus import model as milvus_model
+
+embedding_model = milvus_model.DefaultEmbeddingFunction()
+
+

توليد تضمين اختباري وطباعة أبعاده والعناصر القليلة الأولى.

+
test_embedding = embedding_model.encode_queries(["This is a test"])[0]
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
768
+[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
+ -0.03041712 -0.02269499 -0.02317863 -0.00426028]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة لحجة MilvusClient:

+
    +
  • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+doc_embeddings = embedding_model.encode_documents(text_lines)
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 1090216.20it/s]
+
+
+
+
+
+{'insert_count': 72,
+ 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
+ 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=embedding_model.encode_queries(
+        [question]
+    ),  # Convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.6572665572166443
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        0.6312146186828613
+    ],
+    [
+        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
+        0.6115777492523193
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ملفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم نموذج mistral-7b المقدم من ليبتون للذكاء الاصطناعي لإنشاء استجابة بناءً على المطالبات.

+
response = lepton_client.chat.completions.create(
+    model="mistral-7b",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
Inserted data in Milvus, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and stored in etcd.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus و Lepton AI.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.json new file mode 100644 index 000000000..ebc433a05 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus ollama\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","! ollama pull mxbai-embed-large\n","! ollama pull llama3.2\n","import ollama\n\n\ndef emb_text(text):\n response = ollama.embeddings(model=\"mxbai-embed-large\", prompt=text)\n return response[\"embedding\"]\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","from ollama import chat\nfrom ollama import ChatResponse\n\nresponse: ChatResponse = chat(\n model=\"llama3.2\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response[\"message\"][\"content\"])\n"],"headingContent":"Build RAG with Milvus and Ollama","anchorList":[{"label":"بناء RAG مع Milvus و Ollama","href":"Build-RAG-with-Milvus-and-Ollama","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.md new file mode 100644 index 000000000..de8791165 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_ollama.md @@ -0,0 +1,281 @@ +--- +id: build_RAG_with_milvus_and_ollama.md +summary: >- + سنوضح لك في هذا الدليل كيفية الاستفادة من Ollama وMilvus لبناء خط أنابيب RAG + (الجيل المعزز للاسترجاع) بكفاءة وأمان. +title: بناء RAG مع Milvus و Ollama +--- +

+Open In Colab + + +GitHub Repository +

+

بناء RAG مع Milvus و Ollama

Ollama هي منصة مفتوحة المصدر تعمل على تبسيط تشغيل وتخصيص النماذج اللغوية الكبيرة (LLMs) محليًا. وهي توفر تجربة سهلة الاستخدام وخالية من السحابة، مما يتيح تنزيل النماذج وتثبيتها والتفاعل معها دون الحاجة إلى مهارات تقنية متقدمة. وبفضل مكتبة متنامية من نماذج LLMs المدربة مسبقًا - بدءًا من النماذج اللغوية ذات الأغراض العامة إلى النماذج الخاصة بمجال معين - يسهل نظام أولاما إدارة النماذج وتخصيصها لمختلف التطبيقات. ويضمن خصوصية البيانات ومرونتها، مما يمكّن المستخدمين من ضبط الحلول القائمة على الذكاء الاصطناعي وتحسينها ونشرها بالكامل على أجهزتهم.

+

في هذا الدليل، سنوضح لك في هذا الدليل كيفية الاستفادة من أولاما وميلفوس لبناء خط أنابيب RAG (الجيل المعزز للاسترجاع) بكفاءة وأمان.

+

الإعداد

التبعيات والبيئة

$ pip install pymilvus ollama
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+
--2024-11-26 21:47:19--  https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+Resolving github.com (github.com)... 140.82.112.4
+Connecting to github.com (github.com)|140.82.112.4|:443... connected.
+HTTP request sent, awaiting response... 302 Found
+Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream [following]
+--2024-11-26 21:47:20--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream
+Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ...
+Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 613094 (599K) [application/octet-stream]
+Saving to: ‘milvus_docs_2.4.x_en.zip’
+
+milvus_docs_2.4.x_e 100%[===================>] 598.72K  1.20MB/s    in 0.5s    
+
+2024-11-26 21:47:20 (1.20 MB/s) - ‘milvus_docs_2.4.x_en.zip’ saved [613094/613094]
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد نموذج LLM ونموذج التضمين

يدعم أولاما نماذج متعددة لكل من المهام القائمة على LLM وتوليد التضمينات، مما يسهل تطوير تطبيقات التوليد المعزز للاسترجاع (RAG). لهذا الإعداد:

+
    +
  • سنستخدم LLAMA 3.2 (3B) كنموذج LLM لمهام توليد النصوص.
  • +
  • بالنسبة لتوليد التضمينات، سنستخدم mxbai-embed-large، وهو نموذج معلمة 334M مُحسَّن للتشابه الدلالي.
  • +
+

قبل البدء، تأكد من سحب كلا النموذجين محليًا:

+
! ollama pull mxbai-embed-large
+
+
[?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
+pulling 819c2adf5ce6... 100% ▕████████████████▏ 669 MB                         
+pulling c71d239df917... 100% ▕████████████████▏  11 KB                         
+pulling b837481ff855... 100% ▕████████████████▏   16 B                         
+pulling 38badd946f91... 100% ▕████████████████▏  408 B                         
+verifying sha256 digest 
+writing manifest 
+success [?25h
+
+
! ollama pull llama3.2
+
+
[?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
+pulling dde5aa3fc5ff... 100% ▕████████████████▏ 2.0 GB                         
+pulling 966de95ca8a6... 100% ▕████████████████▏ 1.4 KB                         
+pulling fcc5a6bec9da... 100% ▕████████████████▏ 7.7 KB                         
+pulling a70ff7e570d9... 100% ▕████████████████▏ 6.0 KB                         
+pulling 56bb8bd477a5... 100% ▕████████████████▏   96 B                         
+pulling 34bb5ab01051... 100% ▕████████████████▏  561 B                         
+verifying sha256 digest 
+writing manifest 
+success [?25h
+
+

بعد أن تكون هذه النماذج جاهزة، يمكننا المضي قدمًا في تنفيذ عمليات التوليد القائمة على LLM وسير عمل الاسترجاع القائم على التضمين.

+
import ollama
+
+
+def emb_text(text):
+    response = ollama.embeddings(model="mxbai-embed-large", prompt=text)
+    return response["embedding"]
+
+

توليد تضمين اختباري وطباعة أبعاده وعناصره القليلة الأولى.

+
test_embedding = emb_text("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
1024
+[0.23276396095752716, 0.4257211685180664, 0.19724100828170776, 0.46120673418045044, -0.46039995551109314, -0.1413791924715042, -0.18261606991291046, -0.07602324336767197, 0.39991313219070435, 0.8337644338607788]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": emb_text(line), "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 72/72 [00:03<00:00, 22.56it/s]
+
+
+
+
+
+{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[
+        emb_text(question)
+    ],  # Use the `emb_text` function to convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        231.9398193359375
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        226.48316955566406
+    ],
+    [
+        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
+        210.60745239257812
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ملفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم النموذج llama3.2 المقدم من أولاما لإنشاء استجابة بناءً على المطالبات.

+
from ollama import chat
+from ollama import ChatResponse
+
+response: ChatResponse = chat(
+    model="llama3.2",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response["message"]["content"])
+
+
According to the provided context, data in Milvus is stored in two types:
+
+1. **Inserted data**: Storing data in persistent storage as incremental log. It supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
+
+2. **Metadata**: Generated within Milvus and stored in etcd.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع ميلفوس وأولاما.

diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.json b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.json new file mode 100644 index 000000000..070128314 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"SILICON_FLOW_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nsiliconflow_client = OpenAI(\n api_key=os.environ[\"SILICON_FLOW_API_KEY\"], base_url=\"https://api.siliconflow.cn/v1\"\n)\n","def emb_text(text):\n return (\n siliconflow_client.embeddings.create(input=text, model=\"BAAI/bge-large-en-v1.5\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = siliconflow_client.chat.completions.create(\n model=\"deepseek-ai/DeepSeek-V2.5\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and SiliconFlow","anchorList":[{"label":"بناء RAG مع Milvus و SiliconFlow","href":"Build-RAG-with-Milvus-and-SiliconFlow","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.md b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.md new file mode 100644 index 000000000..cab6bfb96 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_RAG_with_milvus_and_siliconflow.md @@ -0,0 +1,244 @@ +--- +id: build_RAG_with_milvus_and_siliconflow.md +summary: >- + في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط + أنابيب RAG (استرجاع-جيل معزز) باستخدام Milvus و SiliconFlow. +title: بناء RAG مع Milvus و SiliconFlow +--- +

بناء RAG مع Milvus و SiliconFlow

+Open In Colab + + +GitHub Repository +

+

تلتزم شركةSiliconFlow ببناء منصة ذكاء اصطناعي قابلة للتطوير وموحدة وعالية الأداء للذكاء الاصطناعي. SiliconCloud هي إحدى العروض الرئيسية من SiliconFlow، والتي توصف بأنها منصة نموذج كخدمة (MaaS). وهي توفر بيئة شاملة لنشر نماذج الذكاء الاصطناعي المختلفة، بما في ذلك النماذج اللغوية الكبيرة ونماذج التضمين. تجمع سيليكون كلاود العديد من النماذج مفتوحة المصدر، مما يتيح للمستخدمين الوصول إلى هذه الموارد والاستفادة منها بسهولة دون الحاجة إلى إعداد بنية تحتية واسعة النطاق.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية إنشاء خط أنابيب RAG (استرجاع-توليد معزز) باستخدام Milvus و SiliconFlow.

+

الإعداد

التبعيات والبيئة

$ pip install --upgrade pymilvus openai requests tqdm
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يقوم SiliconFlow بتمكين واجهة برمجة التطبيقات على غرار OpenAI. يمكنك تسجيل الدخول إلى موقعه الرسمي وإعداد مفتاح واجهة برمجة التطبيقات SILICON_FLOW_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["SILICON_FLOW_API_KEY"] = "***********"
+
+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إعداد نموذج التضمين

نقوم بتهيئة العميل لإعداد نموذج التضمين. يُمكِّن SiliconFlow واجهة برمجة التطبيقات على غرار OpenAI، ويمكنك استخدام واجهة برمجة التطبيقات نفسها مع تعديلات طفيفة لاستدعاء نموذج التضمين و LLM.

+
from openai import OpenAI
+
+siliconflow_client = OpenAI(
+    api_key=os.environ["SILICON_FLOW_API_KEY"], base_url="https://api.siliconflow.cn/v1"
+)
+
+

حدد دالة لإنشاء تضمينات نصية باستخدام العميل. نستخدم نموذج BAAI/bge-large-en-v1.5 كمثال.

+
def emb_text(text):
+    return (
+        siliconflow_client.embeddings.create(input=text, model="BAAI/bge-large-en-v1.5")
+        .data[0]
+        .embedding
+    )
+
+

إنشاء تضمين اختباري وطباعة بُعده والعناصر القليلة الأولى.

+
test_embedding = emb_text("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
1024
+[0.011475468054413795, 0.02982141077518463, 0.0038535362109541893, 0.035921916365623474, -0.0159175843000412, -0.014918108470737934, -0.018094222992658615, -0.002937349723652005, 0.030917132273316383, 0.03390815854072571]
+
+

تحميل البيانات في ميلفوس

إنشاء المجموعة

from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+collection_name = "my_rag_collection"
+
+
+

بالنسبة للوسيطة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=embedding_dim,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

إدراج البيانات

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
+    data.append({"id": i, "vector": emb_text(line), "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|██████████| 72/72 [00:04<00:00, 16.97it/s]
+
+
+
+
+
+{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
+
+

بناء RAG

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[
+        emb_text(question)
+    ],  # Use the `emb_text` function to convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

دعونا نلقي نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.833885133266449
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        0.812842607498169
+    ],
+    [
+        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
+        0.7714196443557739
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+

تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ميلفوس.

+
SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم النموذج deepseek-ai/DeepSeek-V2.5 المقدم من سيليكون كلاود لإنشاء استجابة بناءً على المطالبات.

+
response = siliconflow_client.chat.completions.create(
+    model="deepseek-ai/DeepSeek-V2.5",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
In Milvus, data is stored in two main categories: inserted data and metadata.
+
+- **Inserted Data**: This includes vector data, scalar data, and collection-specific schema, which are stored in persistent storage as incremental logs. Milvus supports various object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
+
+- **Metadata**: This is generated within Milvus, with each module having its own metadata stored in etcd, a distributed key-value store.
+
+

عظيم! لقد نجحنا في بناء خط أنابيب RAG مع Milvus وSiliconFlow.

diff --git a/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.json b/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.json new file mode 100644 index 000000000..6e8f8d36a --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt update\n$ sudo apt install python-is-python3 python3-pip python3-venv -y\n","$ python -m venv venv\n$ source venv/bin/activate\n","$ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(\n uri=\"\", token=\"\"\n)\n\ncollection_name = \"my_rag_collection\"\n\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=384,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from langchain_huggingface import HuggingFaceEmbeddings\n\nembedding_model = HuggingFaceEmbeddings(model_name=\"all-MiniLM-L6-v2\")\n","from tqdm import tqdm\n\ndata = []\n\ntext_embeddings = embedding_model.embed_documents(text_lines)\n\nfor i, (line, embedding) in enumerate(\n tqdm(zip(text_lines, text_embeddings), desc=\"Creating embeddings\")\n):\n data.append({\"id\": i, \"vector\": embedding, \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","$ sudo apt install make cmake -y\n$ sudo apt install gcc g++ -y\n$ sudo apt install build-essential -y\n","$ git clone https://github.com/ggerganov/llama.cpp\n","$ cd llama.cpp\n$ make GGML_NO_LLAMAFILE=1 -j$(nproc)\n","$ ./llama-cli -h\n","$ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False\n","$ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8\n","$ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536 --port 8080\n","from openai import OpenAI\n\nllm_client = OpenAI(base_url=\"http://localhost:8080/v1\", api_key=\"no-key\")\n","test_embedding = embedding_model.embed_query(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n embedding_model.embed_query(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","response = llm_client.chat.completions.create(\n model=\"not-used\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n\n"],"headingContent":"Build RAG on Arm Architecture","anchorList":[{"label":"بناء RAG على بنية Arm","href":"Build-RAG-on-Arm-Architecture","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisite","type":2,"isActive":false},{"label":"تحميل البيانات دون اتصال","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"إطلاق خدمة LLM على الذراع","href":"Launch-LLM-Service-on-Arm","type":2,"isActive":false},{"label":"RAG عبر الإنترنت","href":"Online-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.md b/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.md new file mode 100644 index 000000000..f47bf1e9d --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/build_rag_on_arm.md @@ -0,0 +1,302 @@ +--- +id: build_rag_on_arm.md +summary: >- + في هذا البرنامج التعليمي، ستتعلم في هذا البرنامج التعليمي كيفية إنشاء تطبيق + الجيل المعزز للاسترجاع (RAG) على البنى التحتية القائمة على الذراع. بالنسبة + لتخزين المتجهات، نستخدم Zilliz Cloud، قاعدة بيانات Milvus vector المدارة + بالكامل. تتوفر Zilliz Cloud على السحابة الرئيسية مثل AWS وGCP وAzure. في هذا + العرض التوضيحي نستخدم Zilliz Cloud المنشورة على AWS مع أجهزة Arm. بالنسبة إلى + LLM، نستخدم نموذج Llama-3.1-8B على وحدة المعالجة المركزية للخوادم القائمة على + AWS Arm باستخدام llama.cpp. +title: بناء RAG على بنية Arm +--- +

بناء RAG على بنية Arm

يتم استخدام وحدات المعالجة المركزيةArm على نطاق واسع عبر مجموعة واسعة من التطبيقات، بما في ذلك حالات استخدام التعلم الآلي (ML) والذكاء الاصطناعي (AI) التقليدية.

+

في هذا البرنامج التعليمي، ستتعلم في هذا البرنامج التعليمي كيفية إنشاء تطبيق استرجاع-مُعزَّز (RAG) على البنى التحتية القائمة على الذراع. لتخزين المتجهات، نستخدم Zilliz Cloud، وهي قاعدة بيانات Milvus vector المدارة بالكامل. تتوفر Zilliz Cloud على السحابة الرئيسية مثل AWS وGCP وAzure. في هذا العرض التوضيحي نستخدم Zilliz Cloud المنشورة على AWS مع أجهزة Arm. بالنسبة إلى LLM، نستخدم نموذج Llama-3.1-8B على وحدة المعالجة المركزية للخوادم القائمة على الذراع على AWS باستخدام llama.cpp.

+

المتطلبات الأساسية

لتشغيل هذا المثال، نوصيك باستخدام AWS Graviton، الذي يوفر طريقة فعالة من حيث التكلفة لتشغيل أعباء عمل التعلم الآلي على الخوادم القائمة على الذراع. تم اختبار هذا الكمبيوتر الدفتري على مثيل AWS Graviton3 c7g.2xlarge مع نظام Ubuntu 22.04 LTS.

+

تحتاج إلى أربعة أنوية على الأقل وذاكرة وصول عشوائي بسعة 8 جيجابايت لتشغيل هذا المثال. قم بتكوين تخزين القرص حتى 32 جيجابايت على الأقل. نوصي باستخدام مثيل بنفس المواصفات أو أفضل.

+

بعد تشغيل المثيل، قم بالاتصال به وتشغيل الأوامر التالية لإعداد البيئة.

+

تثبيت بايثون على الخادم:

+
$ sudo apt update
+$ sudo apt install python-is-python3 python3-pip python3-venv -y
+
+

إنشاء بيئة افتراضية وتفعيلها:

+
$ python -m venv venv
+$ source venv/bin/activate
+
+

تثبيت تبعيات بايثون المطلوبة:

+
$ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm
+
+

تحميل البيانات دون اتصال

إنشاء المجموعة

نحن نستخدم Zilliz Cloud المنتشر على AWS مع الأجهزة القائمة على الذراع لتخزين واسترجاع البيانات المتجهة. للبدء سريعًا، ما عليك سوى تسجيل حساب على Zilliz Cloud مجانًا.

+
+

وبالإضافة إلى Zilliz Cloud، فإن Milvus المستضاف ذاتيًا هو أيضًا خيار (أكثر تعقيدًا في الإعداد). يمكننا أيضًا نشر Milvus Standalone و Kubernetes على الأجهزة المستندة إلى ARM. لمزيد من المعلومات حول تثبيت Milvus، يرجى الرجوع إلى وثائق التثبيت.

+
+

نقوم بتعيين uri و token كنقطة نهاية عامة ومفتاح Api في Zilliz Cloud.

+
from pymilvus import MilvusClient
+
+milvus_client = MilvusClient(
+    uri="<your_zilliz_public_endpoint>", token="<your_zilliz_api_key>"
+)
+
+collection_name = "my_rag_collection"
+
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإنشاء مجموعة جديدة بمعلمات محددة.

+

إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل الهيكلية وقيمها.

+
milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=384,
+    metric_type="IP",  # Inner product distance
+    consistency_level="Strong",  # Strong consistency level
+)
+
+

نستخدم مسافة الضرب الداخلي كنوع القياس الافتراضي. لمزيد من المعلومات حول أنواع المسافات، يمكنك الرجوع إلى صفحة مقاييس التشابه

+

إعداد البيانات

نحن نستخدم صفحات الأسئلة الشائعة من وثائق ميلفوس 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

+
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
+$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
+
+

نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

+
from glob import glob
+
+text_lines = []
+
+for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
+    with open(file_path, "r") as file:
+        file_text = file.read()
+
+    text_lines += file_text.split("# ")
+
+

إدراج البيانات

نقوم بإعداد نموذج تضمين بسيط وفعّال في الوقت نفسه كل -MiniLM-L6-v2 يمكنه تحويل النص إلى متجهات تضمين.

+
from langchain_huggingface import HuggingFaceEmbeddings
+
+embedding_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
+
+

قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم قم بإدراج البيانات في ملف Milvus.

+

هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

+
from tqdm import tqdm
+
+data = []
+
+text_embeddings = embedding_model.embed_documents(text_lines)
+
+for i, (line, embedding) in enumerate(
+    tqdm(zip(text_lines, text_embeddings), desc="Creating embeddings")
+):
+    data.append({"id": i, "vector": embedding, "text": line})
+
+milvus_client.insert(collection_name=collection_name, data=data)
+
+
Creating embeddings: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 72/72 [00:18<00:00,  3.91it/s]
+
+

إطلاق خدمة LLM على الذراع

في هذا القسم، سنقوم ببناء وتشغيل خدمة llama.cpp على وحدة المعالجة المركزية القائمة على الذراع.

+

نموذج Llama 3.1 و llama.cpp

ينتمي نموذج Llama-3.1-8B من Meta إلى عائلة نماذج Llama 3.1 وهو مجاني للاستخدام لأغراض بحثية وتجارية. قبل استخدام النموذج، قم بزيارة موقع Llama على الويب واملأ النموذج لطلب الوصول.

+

llama.cpp هو مشروع C/C++ المفتوح المصدر الذي يتيح الاستدلال الفعال لنموذج LLM على مجموعة متنوعة من الأجهزة - سواءً محليًا أو في السحابة. يمكنك استضافة نموذج Llama 3.1 بسهولة باستخدام llama.cpp.

+

قم بتنزيل وبناء llama.cpp

قم بتشغيل الأوامر التالية لتثبيت الأوامر make و cmake و gcc و g++ وغيرها من الأدوات الأساسية المطلوبة لبناء llama.cpp من المصدر:

+
$ sudo apt install make cmake -y
+$ sudo apt install gcc g++ -y
+$ sudo apt install build-essential -y
+
+

أنت الآن جاهز لبدء البناء llama.cpp.

+

استنسخ المستودع المصدر ل llama.cpp:

+
$ git clone https://github.com/ggerganov/llama.cpp
+
+

بشكل افتراضي، يتم إنشاء llama.cpp لوحدة المعالجة المركزية فقط على نظامي لينكس وويندوز. لا تحتاج إلى توفير أي مفاتيح إضافية لإنشائه لوحدة المعالجة المركزية Arm التي تقوم بتشغيله عليها.

+

قم بتشغيل make لبنائه:

+
$ cd llama.cpp
+$ make GGML_NO_LLAMAFILE=1 -j$(nproc)
+
+

تحقق من أن llama.cpp قد تم بناؤه بشكل صحيح عن طريق تشغيل أمر المساعدة:

+
$ ./llama-cli -h
+
+

إذا تم بناء llama.cpp بشكل صحيح، فسترى خيار المساعدة معروضًا. يبدو مقتطف الإخراج هكذا:

+
example usage:
+
+    text generation:     ./llama-cli -m your_model.gguf -p "I believe the meaning of life is" -n 128
+
+    chat (conversation): ./llama-cli -m your_model.gguf -p "You are a helpful assistant" -cnv
+
+

يمكنك الآن تنزيل النموذج باستخدام huggingface cli:

+
$ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False
+
+

يستخدم تنسيق نموذج GGUF، الذي قدمه فريق llama.cpp، الضغط والتكميم لتقليل دقة الوزن إلى أعداد صحيحة 4 بت، مما يقلل بشكل كبير من المتطلبات الحسابية والذاكرة ويجعل وحدات المعالجة المركزية Arm فعالة في الاستدلال على LLM.

+

إعادة تكميم أوزان النموذج

لإعادة التكنيز، قم بتشغيل

+
$ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8
+
+

سيؤدي هذا إلى إخراج ملف جديد، dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf ، والذي يحتوي على أوزان معاد تكوينها تسمح llama-cli باستخدام SVE 256 ودعم MATMUL_INT8.

+
+

إعادة التهيئة هذه هي الأمثل خصيصًا لـ Graviton3. بالنسبة إلى Graviton2، يجب إجراء إعادة التهيئة المثلى بتنسيق Q4_0_4_4 ، وبالنسبة إلى Graviton4، فإن تنسيق Q4_0_4_8 هو الأنسب لإعادة التهيئة.

+
+

بدء تشغيل خدمة LLM

يمكنك استخدام برنامج خادم llama.cpp وإرسال الطلبات عبر واجهة برمجة تطبيقات متوافقة مع OpenAI. يسمح لك هذا بتطوير تطبيقات تتفاعل مع LLM عدة مرات دون الحاجة إلى بدء تشغيله وإيقافه بشكل متكرر. بالإضافة إلى ذلك، يمكنك الوصول إلى الخادم من جهاز آخر حيث يتم استضافة LLM عبر الشبكة.

+

قم ببدء تشغيل الخادم من سطر الأوامر، ويستمع على المنفذ 8080:

+
$ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536  --port 8080
+
+
'main: server is listening on 127.0.0.1:8080 - starting the main loop
+
+

يمكنك أيضًا ضبط معلمات LLM الذي تم تشغيله لتكييفه مع أجهزة الخادم لديك للحصول على أداء مثالي. لمزيد من المعلومات عن المعلمات، راجع الأمر llama-server --help.

+

إذا كنت تواجه صعوبة في تنفيذ هذه الخطوة، يمكنك الرجوع إلى المستندات الرسمية لمزيد من المعلومات.

+

لقد قمت ببدء تشغيل خدمة LLM على وحدة المعالجة المركزية القائمة على الذراع. بعد ذلك، نتفاعل مباشرةً مع الخدمة باستخدام OpenAI SDK.

+

RAG عبر الإنترنت

عميل LLM ونموذج التضمين

نقوم بتهيئة عميل LLM وإعداد نموذج التضمين.

+

بالنسبة لـ LLM، نستخدم OpenAI SDK لطلب خدمة Llama التي تم إطلاقها من قبل. لا نحتاج إلى استخدام أي مفتاح API لأنه في الواقع خدمة llama.cpp المحلية الخاصة بنا.

+
from openai import OpenAI
+
+llm_client = OpenAI(base_url="http://localhost:8080/v1", api_key="no-key")
+
+

توليد تضمين اختبار وطباعة بُعده والعناصر القليلة الأولى.

+
test_embedding = embedding_model.embed_query("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
384
+[0.03061249852180481, 0.013831384479999542, -0.02084377221763134, 0.016327863559126854, -0.010231520049273968, -0.0479842908680439, -0.017313342541456223, 0.03728749603033066, 0.04588735103607178, 0.034405000507831573]
+
+

استرجاع البيانات لاستعلام

لنحدد سؤالًا متكررًا عن ميلفوس.

+
question = "How is data stored in milvus?"
+
+

ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

+
search_res = milvus_client.search(
+    collection_name=collection_name,
+    data=[
+        embedding_model.embed_query(question)
+    ],  # Use the `emb_text` function to convert the question to an embedding vector
+    limit=3,  # Return top 3 results
+    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+    output_fields=["text"],  # Return the text field
+)
+
+

لنلقِ نظرة على نتائج البحث عن الاستعلام

+
import json
+
+retrieved_lines_with_distances = [
+    (res["entity"]["text"], res["distance"]) for res in search_res[0]
+]
+print(json.dumps(retrieved_lines_with_distances, indent=4))
+
+
[
+    [
+        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
+        0.6488019824028015
+    ],
+    [
+        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
+        0.5974207520484924
+    ],
+    [
+        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
+        0.5833579301834106
+    ]
+]
+
+

استخدم LLM للحصول على استجابة RAG

تحويل المستندات المسترجعة إلى تنسيق سلسلة.

+
context = "\n".join(
+    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
+)
+
+
Define system and user prompts for the Language Model. This prompt is assembled with the retrieved documents from Milvus.
+
+SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+USER_PROMPT = f"""
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+

استخدم LLM لإنشاء استجابة بناءً على المطالبات. قمنا بتعيين المعلمة model إلى not-used نظرًا لأنها معلمة زائدة عن الحاجة لخدمة llama.cpp.

+
response = llm_client.chat.completions.create(
+    model="not-used",
+    messages=[
+        {"role": "system", "content": SYSTEM_PROMPT},
+        {"role": "user", "content": USER_PROMPT},
+    ],
+)
+print(response.choices[0].message.content)
+
+
+
Milvus stores data in two types: inserted data and metadata. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and each Milvus module has its own metadata that are stored in etcd.
+
+

تهانينا! لقد قمت ببناء تطبيق RAG فوق البنى التحتية القائمة على الذراع.

diff --git a/localization/v2.5.x/site/ar/integrations/dify_with_milvus.json b/localization/v2.5.x/site/ar/integrations/dify_with_milvus.json new file mode 100644 index 000000000..72df7be74 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/dify_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/langgenius/dify.git\n","cd dify/docker\n","cp .env.example .env\n","VECTOR_STORE=milvus\n","MILVUS_URI=xxx\nMILVUS_TOKEN=xxx\n","docker compose up -d\n","docker compose up -d\n"],"headingContent":"Deploying Dify with Milvus","anchorList":[{"label":"نشر Dify مع ميلفوس","href":"Deploying-Dify-with-Milvus","type":1,"isActive":false},{"label":"استنساخ المستودع","href":"Clone-the-Repository","type":2,"isActive":false},{"label":"تعيين متغيرات البيئة","href":"Set-the-Environment-Variables","type":2,"isActive":false},{"label":"ابدأ تشغيل حاويات Docker","href":"Start-the-Docker-Containers","type":2,"isActive":false},{"label":"سجّل الدخول إلى Dify","href":"Log-in-to-Dify","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/dify_with_milvus.md b/localization/v2.5.x/site/ar/integrations/dify_with_milvus.md new file mode 100644 index 000000000..d1045d5c9 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/dify_with_milvus.md @@ -0,0 +1,111 @@ +--- +id: dify_with_milvus.md +summary: >- + سنوضح لك في هذا البرنامج التعليمي كيفية نشر Dify مع Milvus، لتمكين الاسترجاع + الفعال ومحرك RAG. +title: نشر Dify مع ميلفوس +--- +

نشر Dify مع ميلفوس

Dify هي عبارة عن منصة مفتوحة المصدر مصممة لتبسيط بناء تطبيقات الذكاء الاصطناعي من خلال الجمع بين النسخ الاحتياطي كخدمة مع LLMOps. تدعم المنصة تطبيقات LLMs السائدة، وتوفر واجهة تنسيق فورية سهلة الاستخدام، ومحركات RAG عالية الجودة، وإطار عمل مرن لوكلاء الذكاء الاصطناعي. وبفضل تدفقات العمل منخفضة التعليمات البرمجية والواجهات سهلة الاستخدام وواجهات برمجة التطبيقات، يُمكّن Dify كلاً من المطورين والمستخدمين غير التقنيين من التركيز على إنشاء حلول ذكاء اصطناعي مبتكرة وواقعية دون التعامل مع التعقيدات.

+

سنوضح لك في هذا البرنامج التعليمي كيفية نشر Dify مع Milvus، لتمكين الاسترجاع الفعال ومحرك RAG.

+

استنساخ المستودع

استنسخ الشيفرة المصدرية لـ Dify إلى جهازك المحلي:

+
git clone https://github.com/langgenius/dify.git
+
+

تعيين متغيرات البيئة

انتقل إلى دليل Docker في الشيفرة المصدرية لـ Dify

+
cd dify/docker
+
+

انسخ ملف تكوين البيئة

+
cp .env.example .env
+
+

قم بتغيير القيمة VECTOR_STORE في الملف .env

+
VECTOR_STORE=milvus
+
+

قم بتغيير تكوين ميلفوس في الملف .env

+
MILVUS_URI=xxx
+MILVUS_TOKEN=xxx
+
+

في هذا الإعداد، يرجى استخدام URI الخارجي للخادم، على سبيل المثالhttp://172.16.16.16:19530 ، كـ MILVUS_URI.

+

بالنسبة إلى MILVUS_TOKEN ، إذا لم تقم بتعيين رمز مميز لخادم ميلفوس الخاص بك، يمكنك تعيينه إلى سلسلة فارغة مثل MILVUS_TOKEN= ، وإلا فإنك تحتاج إلى تعيينه إلى رمز ميلفوس الخاص بك. لمزيد من المعلومات حول كيفية تعيين الرمز المميز في Milvus، يمكنك الرجوع إلى صفحة المصادقة.

+

ابدأ تشغيل حاويات Docker

اختر الأمر المناسب لبدء تشغيل الحاويات بناءً على إصدار Docker Compose على نظامك. يمكنك استخدام الأمر $ docker compose version للتحقق من الإصدار، والرجوع إلى وثائق Docker لمزيد من المعلومات:

+

إذا كان لديك Docker Compose V2، استخدم الأمر التالي:

+
docker compose up -d
+
+

إذا كان لديك Docker Compose V1، استخدم الأمر التالي:

+
docker compose up -d
+
+

سجّل الدخول إلى Dify

افتح المتصفح الخاص بك وانتقل إلى صفحة تثبيت Dify، ويمكنك تعيين حساب المسؤول الخاص بك هنا:http://localhost/install ، ثم قم بتسجيل الدخول إلى صفحة Dify الرئيسية لمزيد من الاستخدام.

+

لمزيد من الاستخدام والإرشادات، يرجى الرجوع إلى وثائق Dify.

diff --git a/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.json b/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.json new file mode 100644 index 000000000..2b7dd32e0 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas deepeval\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from deepeval.metrics import (\n ContextualPrecisionMetric,\n ContextualRecallMetric,\n ContextualRelevancyMetric,\n)\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\ncontextual_precision = ContextualPrecisionMetric()\ncontextual_recall = ContextualRecallMetric()\ncontextual_relevancy = ContextualRelevancyMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[contextual_precision, contextual_recall, contextual_relevancy],\n print_results=False, # Change to True to see detailed metric results\n)\n","from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\nanswer_relevancy = AnswerRelevancyMetric()\nfaithfulness = FaithfulnessMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[answer_relevancy, faithfulness],\n print_results=False, # Change to True to see detailed metric results\n)\n"],"headingContent":"Evaluation with DeepEval","anchorList":[{"label":"التقييم باستخدام DeepEval","href":"Evaluation-with-DeepEval","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تعريف خط أنابيب RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"تشغيل خط أنابيب RAG والحصول على النتائج","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"تقييم المسترد","href":"Evaluating-Retriever","type":2,"isActive":false},{"label":"تقييم التوليد","href":"Evaluating-Generation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.md b/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.md new file mode 100644 index 000000000..3e38dc2e3 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/evaluation_with_deepeval.md @@ -0,0 +1,434 @@ +--- +id: evaluation_with_deepeval.md +summary: >- + يوضّح هذا الدليل كيفية استخدام DeepEval لتقييم خط أنابيب الاسترجاع-التوليد + المعزز (RAG) المبني على Milvus. +title: التقييم باستخدام DeepEval +--- +

التقييم باستخدام DeepEval

Open In Colab +GitHub Repository

+

يوضّح هذا الدليل كيفية استخدام DeepEval لتقييم خط أنابيب التوليد المعزز للاسترجاع (RAG) المبني على نظام Milvus.

+

يجمع نظام RAG بين نظام الاسترجاع والتوليد المعزز (RAG) بين نظام استرجاع ونموذج توليد لإنشاء نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليدًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

DeepEval هو إطار عمل يساعدك على تقييم خطوط أنابيب RAG الخاصة بك. هناك أدوات وأطر عمل حالية تساعدك على بناء خطوط الأنابيب هذه، لكن تقييمها وقياس أداء خط الأنابيب الخاص بك قد يكون صعبًا. وهنا يأتي دور DeepEval.

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
$ pip install --upgrade pymilvus openai requests tqdm pandas deepeval
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-*****************"
+
+

تعريف خط أنابيب RAG

سنقوم بتعريف فئة RAG التي تستخدم Milvus كمخزن متجه، و OpenAI كـ LLM. تحتوي الفئة على طريقة load ، التي تقوم بتحميل البيانات النصية إلى Milvus، وطريقة retrieve ، التي تسترجع البيانات النصية الأكثر تشابهًا مع السؤال المعطى، وطريقة answer ، التي تجيب على السؤال المعطى باستخدام المعرفة المسترجعة.

+
from typing import List
+from tqdm import tqdm
+from openai import OpenAI
+from pymilvus import MilvusClient
+
+
+class RAG:
+    """
+    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
+    """
+
+    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
+        self._prepare_openai(openai_client)
+        self._prepare_milvus(milvus_client)
+
+    def _emb_text(self, text: str) -> List[float]:
+        return (
+            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
+            .data[0]
+            .embedding
+        )
+
+    def _prepare_openai(
+        self,
+        openai_client: OpenAI,
+        embedding_model: str = "text-embedding-3-small",
+        llm_model: str = "gpt-4o-mini",
+    ):
+        self.openai_client = openai_client
+        self.embedding_model = embedding_model
+        self.llm_model = llm_model
+        self.SYSTEM_PROMPT = """
+            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+        """
+        self.USER_PROMPT = """
+            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+            <context>
+            {context}
+            </context>
+            <question>
+            {question}
+            </question>
+        """
+
+    def _prepare_milvus(
+        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
+    ):
+        self.milvus_client = milvus_client
+        self.collection_name = collection_name
+        if self.milvus_client.has_collection(self.collection_name):
+            self.milvus_client.drop_collection(self.collection_name)
+        embedding_dim = len(self._emb_text("demo"))
+        self.milvus_client.create_collection(
+            collection_name=self.collection_name,
+            dimension=embedding_dim,
+            metric_type="IP",
+            consistency_level="Strong",
+        )
+
+    def load(self, texts: List[str]):
+        """
+        Load the text data into Milvus.
+        """
+        data = []
+        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
+            data.append({"id": i, "vector": self._emb_text(line), "text": line})
+        self.milvus_client.insert(collection_name=self.collection_name, data=data)
+
+    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
+        """
+        Retrieve the most similar text data to the given question.
+        """
+        search_res = self.milvus_client.search(
+            collection_name=self.collection_name,
+            data=[self._emb_text(question)],
+            limit=top_k,
+            search_params={"metric_type": "IP", "params": {}},  # inner product distance
+            output_fields=["text"],  # Return the text field
+        )
+        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
+        return retrieved_texts[:top_k]
+
+    def answer(
+        self,
+        question: str,
+        retrieval_top_k: int = 3,
+        return_retrieved_text: bool = False,
+    ):
+        """
+        Answer the given question with the retrieved knowledge.
+        """
+        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
+        user_prompt = self.USER_PROMPT.format(
+            context="\n".join(retrieved_texts), question=question
+        )
+        response = self.openai_client.chat.completions.create(
+            model=self.llm_model,
+            messages=[
+                {"role": "system", "content": self.SYSTEM_PROMPT},
+                {"role": "user", "content": user_prompt},
+            ],
+        )
+        if not return_retrieved_text:
+            return response.choices[0].message.content
+        else:
+            return response.choices[0].message.content, retrieved_texts
+
+

لنقم بتهيئة فئة RAG مع عملاء OpenAI و Milvus.

+
openai_client = OpenAI()
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • إن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تشغيل خط أنابيب RAG والحصول على النتائج

نحن نستخدم دليل تطوير Milvus ليكون بمثابة المعرفة الخاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيله وتحميله في خط أنابيب RAG.

+
import urllib.request
+import os
+
+url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
+file_path = "./Milvus_DEVELOPMENT.md"
+
+if not os.path.exists(file_path):
+    urllib.request.urlretrieve(url, file_path)
+with open(file_path, "r") as file:
+    file_text = file.read()
+
+text_lines = file_text.split("# ")
+my_rag.load(text_lines)
+
+
Creating embeddings: 100%|██████████| 47/47 [00:20<00:00,  2.26it/s]
+
+

دعونا نحدد سؤال استعلام عن محتوى وثائق دليل التطوير. ثم استخدم الطريقة answer للحصول على الإجابة ونصوص السياق المسترجعة.

+
question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
+my_rag.answer(question, return_retrieved_text=True)
+
+
('The hardware requirements specification to build and run Milvus from source code is as follows:\n\n- 8GB of RAM\n- 50GB of free disk space',
+ ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
+  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
+  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
+
+

الآن دعونا نعد بعض الأسئلة مع إجابات الحقيقة الأساسية المقابلة لها. نحصل على الإجابات والسياقات من خط أنابيب RAG الخاص بنا.

+
from datasets import Dataset
+import pandas as pd
+
+question_list = [
+    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
+    "What is the programming language used to write Knowhere?",
+    "What should be ensured before running code coverage?",
+]
+ground_truth_list = [
+    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
+    "The programming language used to write Knowhere is C++.",
+    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
+]
+contexts_list = []
+answer_list = []
+for question in tqdm(question_list, desc="Answering questions"):
+    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
+    contexts_list.append(contexts)
+    answer_list.append(answer)
+
+df = pd.DataFrame(
+    {
+        "question": question_list,
+        "contexts": contexts_list,
+        "answer": answer_list,
+        "ground_truth": ground_truth_list,
+    }
+)
+rag_results = Dataset.from_pandas(df)
+df
+
+
/Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
+  from .autonotebook import tqdm as notebook_tqdm
+Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.06s/it]
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
السؤالالسياقاتإجابةالحقيقة_الأرضية
0ما هي مواصفات متطلبات الأجهزة التالية؟[مواصفات متطلبات الأجهزة \n\nالمواصفات التالية...ما هي مواصفات متطلبات الأجهزة اللازمة لبناء....إذا كنت ترغب في إنشاء برنامج Milvus وتشغيله من المصدر...
1ما هي لغة البرمجة المستخدمة في كتابة...[CMake & Conan \n\nمكتبة خوارزمية ميلفوسما هي لغة البرمجة المستخدمة لكتابة خوارزمية...ما هي لغة البرمجة المستخدمة في كتابة نوير؟
2ما الذي يجب التأكد منه قبل تشغيل الرمز البرمجي....[تغطية الشيفرة البرمجية \nقبل إرسال عملية السحب....قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد من...قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد ...
+
+

تقييم المسترد

عند تقييم المسترد في أنظمة النماذج اللغوية الكبيرة (LLM)، من المهم تقييم ما يلي:

+
    +
  1. ملاءمة الترتيب: مدى فعالية المسترجع في إعطاء الأولوية للمعلومات ذات الصلة على البيانات غير ذات الصلة.

  2. +
  3. الاسترجاع السياقي: القدرة على التقاط المعلومات ذات الصلة بالسياق واسترجاعها بناءً على المدخلات.

  4. +
  5. التوازن: مدى جودة إدارة المُسترجِع لحجم جزء النص ونطاق الاسترجاع لتقليل المعلومات غير ذات الصلة.

  6. +
+

توفر هذه العوامل مجتمعةً فهماً شاملاً لكيفية قيام المسترجع بتحديد أولويات المعلومات الأكثر فائدة والتقاطها وتقديمها.

+
from deepeval.metrics import (
+    ContextualPrecisionMetric,
+    ContextualRecallMetric,
+    ContextualRelevancyMetric,
+)
+from deepeval.test_case import LLMTestCase
+from deepeval import evaluate
+
+contextual_precision = ContextualPrecisionMetric()
+contextual_recall = ContextualRecallMetric()
+contextual_relevancy = ContextualRelevancyMetric()
+
+test_cases = []
+
+for index, row in df.iterrows():
+    test_case = LLMTestCase(
+        input=row["question"],
+        actual_output=row["answer"],
+        expected_output=row["ground_truth"],
+        retrieval_context=row["contexts"],
+    )
+    test_cases.append(test_case)
+
+# test_cases
+result = evaluate(
+    test_cases=test_cases,
+    metrics=[contextual_precision, contextual_recall, contextual_relevancy],
+    print_results=False,  # Change to True to see detailed metric results
+)
+
+
/Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/deepeval/__init__.py:49: UserWarning: You are using deepeval version 1.1.6, however version 1.2.2 is available. You should consider upgrading via the "pip install --upgrade deepeval" command.
+  warnings.warn(
+
+
✨ أنت تقوم بتشغيل أحدث مقاييس الدقة السياقية من DeepEval! (باستخدام gpt-4o،  صارم=خطأ، الوضعالمتزامن=صحيح)...
+
✨ أنت تقوم بتشغيل أحدث مقياس استرجاع سياقي ل DeepEval! (باستخدام gpt-4o, strict=False, async_mode=True)...
+
✨ أنت تقوم بتشغيل أحدث مقياس للملاءمة السياقية من DeepEval! (باستخدام gpt-4o, strict=False, async_mode=True)...
+
Event loop is already running. Applying nest_asyncio patch to allow async execution...
+
+
+Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.91s/test case]
+
+
 تم الانتهاء من الاختبارات 🎉! قم بتشغيل "deepeval تسجيل الدخول" لعرض نتائج التقييم على الذكاء الاصطناعي الواثق. 
+‼️ ملاحظة: يمكنك أيضًا تشغيل التقييمات على جميع مقاييس deepeval مباشرةً على الذكاء الاصطناعي الواثق بدلاً من ذلك.
+

تقييم التوليد

لتقييم جودة المخرجات التي تم إنشاؤها في النماذج اللغوية الكبيرة (LLMs)، من المهم التركيز على جانبين رئيسيين

+
    +
  1. الملاءمة: تقييم ما إذا كانت المطالبة توجّه بفعالية نموذج اللغة الكبير لتوليد استجابات مفيدة ومناسبة للسياق.

  2. +
  3. الإخلاص: قياس دقة المخرجات، والتأكد من أن النموذج ينتج معلومات صحيحة من الناحية الواقعية وخالية من الهلوسة أو التناقضات. يجب أن يتوافق المحتوى الذي تم إنشاؤه مع المعلومات الواقعية المقدمة في سياق الاسترجاع.

  4. +
+

تضمن هذه العوامل مجتمعةً أن تكون المخرجات ذات صلة وموثوقة على حد سواء.

+
from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
+from deepeval.test_case import LLMTestCase
+from deepeval import evaluate
+
+answer_relevancy = AnswerRelevancyMetric()
+faithfulness = FaithfulnessMetric()
+
+test_cases = []
+
+for index, row in df.iterrows():
+    test_case = LLMTestCase(
+        input=row["question"],
+        actual_output=row["answer"],
+        expected_output=row["ground_truth"],
+        retrieval_context=row["contexts"],
+    )
+    test_cases.append(test_case)
+
+# test_cases
+result = evaluate(
+    test_cases=test_cases,
+    metrics=[answer_relevancy, faithfulness],
+    print_results=False,  # Change to True to see detailed metric results
+)
+
+
✨ أنت تقوم بتشغيل أحدث مقياس لمدى ملاءمة الإجابة في DeepEval! (باستخدام gpt-4o, strict=False, async_mode=True)...
+
✨ أنت تقوم بتشغيل أحدث مقياس لمدى ملاءمة الإجابة! (باستخدام gpt-4o, strict=False, async_mode=True)...
+
Event loop is already running. Applying nest_asyncio patch to allow async execution...
+
+
+Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.97s/test case]
+
+
 تم الانتهاء من الاختبارات 🎉! قم بتشغيل "deepeval تسجيل الدخول" لعرض نتائج التقييم على الذكاء الاصطناعي الواثق. 
+‼️ ملاحظة: يمكنك أيضًا تشغيل التقييمات على جميع مقاييس deepeval مباشرةً على الذكاء الاصطناعي الواثق بدلاً من ذلك.
diff --git a/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.json b/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.json new file mode 100644 index 000000000..a76db8c3e --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas \"arize-phoenix>=4.29.0\" nest_asyncio\n","import os\n\n# os.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","import phoenix as px\nfrom phoenix.trace.openai import OpenAIInstrumentor\n\n# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:\nsession = px.launch_app()\n\n# Initialize OpenAI auto-instrumentation\nOpenAIInstrumentor().instrument()\n","import nest_asyncio\n\nfrom phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals\n\nnest_asyncio.apply() # This is needed for concurrency in notebook environments\n\n# Set your OpenAI API key\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Define your evaluators\nhallucination_evaluator = HallucinationEvaluator(eval_model)\nqa_evaluator = QAEvaluator(eval_model)\n\n# We have to make some minor changes to our dataframe to use the column names expected by our evaluators\n# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'\n# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'\ndf[\"context\"] = df[\"contexts\"]\ndf[\"reference\"] = df[\"contexts\"]\ndf.rename(columns={\"question\": \"input\", \"answer\": \"output\"}, inplace=True)\nassert all(\n column in df.columns for column in [\"output\", \"input\", \"context\", \"reference\"]\n)\n\n# Run the evaluators, each evaluator will return a dataframe with evaluation results\n# We upload the evaluation results to Phoenix in the next step\nhallucination_eval_df, qa_eval_df = run_evals(\n dataframe=df,\n evaluators=[hallucination_evaluator, qa_evaluator],\n provide_explanation=True,\n)\n","results_df = df.copy()\nresults_df[\"hallucination_eval\"] = hallucination_eval_df[\"label\"]\nresults_df[\"hallucination_explanation\"] = hallucination_eval_df[\"explanation\"]\nresults_df[\"qa_eval\"] = qa_eval_df[\"label\"]\nresults_df[\"qa_explanation\"] = qa_eval_df[\"explanation\"]\nresults_df.head()\n"],"headingContent":"Evaluation with Arize Pheonix","anchorList":[{"label":"التقييم باستخدام Arize Pheonix","href":"Evaluation-with-Arize-Pheonix","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تعريف خط أنابيب RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"تشغيل خط أنابيب RAG والحصول على النتائج","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"التقييم باستخدام أريز فينيكس","href":"Evaluation-with-Arize-Phoenix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.md b/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.md new file mode 100644 index 000000000..494c784c2 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/evaluation_with_phoenix.md @@ -0,0 +1,474 @@ +--- +id: evaluation_with_phoenix.md +summary: >- + يوضّح هذا الدليل كيفية استخدام Arize Pheonix لتقييم خط أنابيب الاسترجاع المعزز + (RAG) المبني على Milvus. +title: التقييم باستخدام Arize Pheonix +--- +

التقييم باستخدام Arize Pheonix

Open In Colab +GitHub Repository

+

يوضّح هذا الدليل كيفية استخدام Arize Pheonix لتقييم خط أنابيب الاسترجاع والتوليد المعزز (RAG) المبني على Milvus.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليدًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

Arize Pheonix هو إطار عمل يساعدك على تقييم خطوط أنابيب RAG الخاصة بك. هناك أدوات وأطر عمل حالية تساعدك على بناء خطوط الأنابيب هذه، ولكن قد يكون من الصعب تقييمها وتحديد أداء خط الأنابيب الخاص بك. وهنا يأتي دور Arize Pheonix.

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
$ pip install --upgrade pymilvus openai requests tqdm pandas "arize-phoenix>=4.29.0" nest_asyncio
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+# os.environ["OPENAI_API_KEY"] = "sk-*****************"
+
+

تعريف خط أنابيب RAG

سنقوم بتعريف فئة RAG التي تستخدم Milvus كمخزن متجه، و OpenAI كـ LLM. تحتوي الفئة على طريقة load ، التي تقوم بتحميل البيانات النصية إلى Milvus، وطريقة retrieve ، التي تسترجع البيانات النصية الأكثر تشابهًا مع السؤال المعطى، وطريقة answer ، التي تجيب على السؤال المعطى باستخدام المعرفة المسترجعة.

+
from typing import List
+from tqdm import tqdm
+from openai import OpenAI
+from pymilvus import MilvusClient
+
+
+class RAG:
+    """
+    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
+    """
+
+    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
+        self._prepare_openai(openai_client)
+        self._prepare_milvus(milvus_client)
+
+    def _emb_text(self, text: str) -> List[float]:
+        return (
+            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
+            .data[0]
+            .embedding
+        )
+
+    def _prepare_openai(
+        self,
+        openai_client: OpenAI,
+        embedding_model: str = "text-embedding-3-small",
+        llm_model: str = "gpt-4o-mini",
+    ):
+        self.openai_client = openai_client
+        self.embedding_model = embedding_model
+        self.llm_model = llm_model
+        self.SYSTEM_PROMPT = """
+            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+        """
+        self.USER_PROMPT = """
+            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+            <context>
+            {context}
+            </context>
+            <question>
+            {question}
+            </question>
+        """
+
+    def _prepare_milvus(
+        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
+    ):
+        self.milvus_client = milvus_client
+        self.collection_name = collection_name
+        if self.milvus_client.has_collection(self.collection_name):
+            self.milvus_client.drop_collection(self.collection_name)
+        embedding_dim = len(self._emb_text("demo"))
+        self.milvus_client.create_collection(
+            collection_name=self.collection_name,
+            dimension=embedding_dim,
+            metric_type="IP",
+            consistency_level="Strong",
+        )
+
+    def load(self, texts: List[str]):
+        """
+        Load the text data into Milvus.
+        """
+        data = []
+        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
+            data.append({"id": i, "vector": self._emb_text(line), "text": line})
+        self.milvus_client.insert(collection_name=self.collection_name, data=data)
+
+    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
+        """
+        Retrieve the most similar text data to the given question.
+        """
+        search_res = self.milvus_client.search(
+            collection_name=self.collection_name,
+            data=[self._emb_text(question)],
+            limit=top_k,
+            search_params={"metric_type": "IP", "params": {}},  # inner product distance
+            output_fields=["text"],  # Return the text field
+        )
+        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
+        return retrieved_texts[:top_k]
+
+    def answer(
+        self,
+        question: str,
+        retrieval_top_k: int = 3,
+        return_retrieved_text: bool = False,
+    ):
+        """
+        Answer the given question with the retrieved knowledge.
+        """
+        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
+        user_prompt = self.USER_PROMPT.format(
+            context="\n".join(retrieved_texts), question=question
+        )
+        response = self.openai_client.chat.completions.create(
+            model=self.llm_model,
+            messages=[
+                {"role": "system", "content": self.SYSTEM_PROMPT},
+                {"role": "user", "content": user_prompt},
+            ],
+        )
+        if not return_retrieved_text:
+            return response.choices[0].message.content
+        else:
+            return response.choices[0].message.content, retrieved_texts
+
+

لنقم بتهيئة فئة RAG مع عملاء OpenAI و Milvus.

+
openai_client = OpenAI()
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • إن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تشغيل خط أنابيب RAG والحصول على النتائج

نحن نستخدم دليل تطوير Milvus ليكون بمثابة المعرفة الخاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيله وتحميله في خط أنابيب RAG.

+
import urllib.request
+import os
+
+url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
+file_path = "./Milvus_DEVELOPMENT.md"
+
+if not os.path.exists(file_path):
+    urllib.request.urlretrieve(url, file_path)
+with open(file_path, "r") as file:
+    file_text = file.read()
+
+text_lines = file_text.split("# ")
+my_rag.load(text_lines)
+
+
Creating embeddings: 100%|██████████| 47/47 [00:12<00:00,  3.84it/s]
+
+

دعونا نحدد سؤال استعلام عن محتوى وثائق دليل التطوير. ثم استخدم الطريقة answer للحصول على الإجابة ونصوص السياق المسترجعة.

+
question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
+my_rag.answer(question, return_retrieved_text=True)
+
+
('The hardware requirements specification to build and run Milvus from source code are:\n\n- 8GB of RAM\n- 50GB of free disk space',
+ ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
+  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
+  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
+
+

الآن دعونا نعد بعض الأسئلة مع إجابات الحقيقة الأساسية المقابلة لها. نحصل على الإجابات والسياقات من خط أنابيب RAG الخاص بنا.

+
from datasets import Dataset
+import pandas as pd
+
+question_list = [
+    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
+    "What is the programming language used to write Knowhere?",
+    "What should be ensured before running code coverage?",
+]
+ground_truth_list = [
+    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
+    "The programming language used to write Knowhere is C++.",
+    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
+]
+contexts_list = []
+answer_list = []
+for question in tqdm(question_list, desc="Answering questions"):
+    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
+    contexts_list.append(contexts)
+    answer_list.append(answer)
+
+df = pd.DataFrame(
+    {
+        "question": question_list,
+        "contexts": contexts_list,
+        "answer": answer_list,
+        "ground_truth": ground_truth_list,
+    }
+)
+rag_results = Dataset.from_pandas(df)
+df
+
+
/Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
+  from .autonotebook import tqdm as notebook_tqdm
+Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.04s/it]
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
السؤالالسياقاتإجابةالحقيقة_الأرضية
0ما هي مواصفات متطلبات الأجهزة التالية؟[مواصفات متطلبات الأجهزة \n\nالمواصفات التالية...ما هي مواصفات متطلبات الأجهزة اللازمة لبناء....إذا كنت ترغب في إنشاء برنامج Milvus وتشغيله من المصدر...
1ما هي لغة البرمجة المستخدمة في كتابة...[CMake & Conan \n\nمكتبة خوارزمية ميلفوسما هي لغة البرمجة المستخدمة لكتابة خوارزمية...ما هي لغة البرمجة المستخدمة في كتابة نوير؟
2ما الذي يجب التأكد منه قبل تشغيل الرمز البرمجي....[تغطية الشيفرة البرمجية \nقبل إرسال عملية السحب....قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد من...قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد ...
+
+

التقييم باستخدام أريز فينيكس

نستخدم Arize Phoenix لتقييم خط أنابيب التوليد المعزز للاسترجاع (RAG) الخاص بنا، مع التركيز على مقياسين رئيسيين:

+
    +
  • تقييم الهلوسة: يُحدد ما إذا كان المحتوى واقعيًا أم هلوسة (معلومات لا تستند إلى سياق)، مما يضمن سلامة البيانات.

    +
      +
    • شرح الهلوسة: يوضح سبب كون الإجابة واقعية أم لا.
    • +
  • +
  • تقييم ضمان الجودة: تقييم دقة إجابات النموذج على استفسارات الإدخال.

    +
      +
    • شرح ضمان الجودة: تفاصيل سبب كون الإجابة صحيحة أو غير صحيحة.
    • +
  • +
+

نظرة عامة على تتبع فينيكس

يوفر Phoenix تتبعًا متوافقًا مع OTEL لتطبيقات LLM، مع تكامل أطر عمل مثل Langchain وLlamaIndex وحزم SDK مثل OpenAI وMistral. يلتقط التتبع تدفق الطلبات بالكامل، ويقدم رؤى حول:

+
    +
  • كمون التطبيق: تحديد وتحسين بطء استدعاءات LLM وأداء المكونات.
  • +
  • استخدام الرمز المميز: تقسيم استهلاك الرمز المميز لتحسين التكلفة.
  • +
  • استثناءات وقت التشغيل: التقاط المشكلات الحرجة مثل تحديد المعدل.
  • +
  • المستندات المسترجعة: تحليل استرجاع المستندات والنتيجة والترتيب.
  • +
+

من خلال استخدام تتبع فينيكس، يمكنك تحديد الاختناقات وتحسين الموارد وضمان موثوقية النظام عبر مختلف الأطر واللغات.

+
import phoenix as px
+from phoenix.trace.openai import OpenAIInstrumentor
+
+# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:
+session = px.launch_app()
+
+# Initialize OpenAI auto-instrumentation
+OpenAIInstrumentor().instrument()
+
+
🌍 To view the Phoenix app in your browser, visit http://localhost:6006/
+📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix
+
+

+ + Alt Text + نص بديل

+
import nest_asyncio
+
+from phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals
+
+nest_asyncio.apply()  # This is needed for concurrency in notebook environments
+
+# Set your OpenAI API key
+eval_model = OpenAIModel(model="gpt-4o")
+
+# Define your evaluators
+hallucination_evaluator = HallucinationEvaluator(eval_model)
+qa_evaluator = QAEvaluator(eval_model)
+
+# We have to make some minor changes to our dataframe to use the column names expected by our evaluators
+# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'
+# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'
+df["context"] = df["contexts"]
+df["reference"] = df["contexts"]
+df.rename(columns={"question": "input", "answer": "output"}, inplace=True)
+assert all(
+    column in df.columns for column in ["output", "input", "context", "reference"]
+)
+
+# Run the evaluators, each evaluator will return a dataframe with evaluation results
+# We upload the evaluation results to Phoenix in the next step
+hallucination_eval_df, qa_eval_df = run_evals(
+    dataframe=df,
+    evaluators=[hallucination_evaluator, qa_evaluator],
+    provide_explanation=True,
+)
+
+
run_evals |██████████| 6/6 (100.0%) | ⏳ 00:03<00:00 |  1.64it/s
+
+
results_df = df.copy()
+results_df["hallucination_eval"] = hallucination_eval_df["label"]
+results_df["hallucination_explanation"] = hallucination_eval_df["explanation"]
+results_df["qa_eval"] = qa_eval_df["label"]
+results_df["qa_explanation"] = qa_eval_df["explanation"]
+results_df.head()
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الإدخالالسياقاتالإخراجالحقيقة_الأرضيةالسياقالمرجعهلوسة_حقيقةهلوسة_تفسير_الهلوسةqa_evalتفسير_الهلوسة
0ما هي مواصفات متطلبات الأجهزة التالية؟[متطلبات الأجهزة \n\nما هي مواصفات متطلبات الأجهزة التالية...ما هي مواصفات متطلبات الأجهزة اللازمة لبناء نظام.....إذا كنت ترغب في إنشاء برنامج Milvus وتشغيله من المصدر...[متطلبات الأجهزة \\nالمواصفات التالية لبناء...[متطلبات الأجهزة \n\nالمواصفات التالية...واقعيةلتحديد ما إذا كانت الإجابة واقعية أم هالو...صحيحةلتحديد ما إذا كانت الإجابة صحيحة، نحتاج إلى...
1ما هي لغة البرمجة المستخدمة في كتابة...[CMake & Conan \n\nمكتبة خوارزمية من لغة البرمجة...ما هي لغة البرمجة المستخدمة لكتابة خوارزمية....ما هي لغة البرمجة المستخدمة في كتابة...[CMake & Conan \n\nمكتبة الخوارزميات الخاصة ب...[CMake & Conan \n\nمكتبة الخوارزميات الخاصة بـ Mil...واقعيةلتحديد ما إذا كانت الإجابة واقعية أو هالو...صحيحةلتحديد ما إذا كانت الإجابة صحيحة، نحتاج إلى...
2ما الذي يجب التأكد منه قبل تشغيل كود التغطية البرمجية؟[تغطية الشيفرة البرمجية \nقبل إرسال عملية السحب...قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد من...قبل تشغيل تغطية التعليمات البرمجية، يجب التأكد ...[تغطية التعليمات البرمجية \n\nقبل إرسال عملية السحب ...[تغطية التعليمات البرمجية \n\nقبل إرسال السحب الخاص بك ...واقعيينص النص المرجعي على أنه قبل تشغيل التغطية البرمجية...صحيحلتحديد ما إذا كانت الإجابة صحيحة، نحتاج إلى...
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.json b/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.json new file mode 100644 index 000000000..3c2f3a379 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.json @@ -0,0 +1 @@ +{"codeList":["pip install streamlit pymilvus openai\n","import streamlit as st\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n # TODO check for related support cases and articles\n st.write(\"Submitted!\")\n","streamlit run basic_support_form.py\n","import streamlit as st\nimport os\nimport pymilvus\nimport openai\n\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem?\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n import os\n import pymilvus\n import openai\n\n org_id = 360033549136 # TODO Load from customer login data\n\n pymilvus.connections.connect(uri=os.environ[\"MILVUS_URL\"], token=os.environ[\"MILVUS_TOKEN\"])\n collection = pymilvus.Collection(\"zendesk\")\n\n embedding = openai.Embedding.create(input=text_val, model=\"text-embedding-ada-002\")['data'][0]['embedding']\n\n results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=2, output_fields=[\"_id\", \"subject\", \"description\"], expr=f'status == \"new\" and organization_id == {org_id}')\n\n st.write(results[0])\n if len(results[0]) > 0 and results[0].distances[0] < 0.35:\n matching_ticket = results[0][0].entity\n st.write(f\"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before\")\n else:\n st.write(\"Submitted!\")\n \n","export MILVUS_TOKEN=...\nexport MILVUS_URL=https://...\nexport OPENAI_API_KEY=sk-...\n\nstreamlit run app.py\n"," ......\n \n else:\n # TODO Actually send out the ticket\n st.write(\"Submitted!\")\n article_results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=5, output_fields=[\"title\", \"html_url\"], expr=f'_ab_stream == \"articles\"')\n st.write(article_results[0])\n if len(article_results[0]) > 0:\n st.write(\"We also found some articles that might help you:\")\n for hit in article_results[0]:\n if hit.distance < 0.362:\n st.write(f\"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})\")\n\n"],"headingContent":"Airbyte: Open-Source Data Movement Infrastructure","anchorList":[{"label":"Airbyte: بنية تحتية مفتوحة المصدر لنقل البيانات","href":"Airbyte-Open-Source-Data-Movement-Infrastructure","type":1,"isActive":false},{"label":"المكونات الرئيسية ل Airbyte","href":"Major-Components-of-Airbyte","type":2,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-You-Begin","type":2,"isActive":false},{"label":"إعداد مجموعة ميلفوس العنقودية","href":"Set-Up-Milvus-Cluster","type":2,"isActive":false},{"label":"إعداد الاتصال في Airbyte","href":"Set-Up-Connection-in-Airbyte","type":2,"isActive":false},{"label":"إنشاء تطبيق Streamlit للاستعلام عن المجموعة","href":"Build-Streamlit-app-querying-the-collection","type":2,"isActive":false},{"label":"الخلاصة","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.md b/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.md new file mode 100644 index 000000000..10f412809 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_airbyte.md @@ -0,0 +1,247 @@ +--- +id: integrate_with_airbyte.md +summary: >- + Airbyte هي بنية تحتية مفتوحة المصدر لحركة البيانات لبناء خطوط أنابيب استخراج + وتحميل البيانات (EL). وهي مصممة لتعدد الاستخدامات، وقابلية التوسع، وسهولة + الاستخدام. يأتي كتالوج موصل Airbyte "جاهزًا" مع أكثر من 350 موصلًا مدمجًا + مسبقًا. يمكن استخدام هذه الموصلات لبدء نسخ البيانات من مصدر إلى وجهة في بضع + دقائق فقط. +title: 'Airbyte: بنية تحتية مفتوحة المصدر لنقل البيانات' +--- +

Airbyte: بنية تحتية مفتوحة المصدر لنقل البيانات

Airbyte هي بنية تحتية مفتوحة المصدر لنقل البيانات لبناء خطوط أنابيب استخراج وتحميل البيانات (EL). وهي مصممة لتعدد الاستخدامات، وقابلية التوسع، وسهولة الاستخدام. يأتي كتالوج موصل Airbyte "جاهزًا" مع أكثر من 350 موصلًا مدمجًا مسبقًا. يمكن استخدام هذه الموصلات لبدء نسخ البيانات من مصدر إلى وجهة في بضع دقائق فقط.

+

المكونات الرئيسية ل Airbyte

1. كتالوج الموصلات

    +
  • أكثر من 350 موصل مدمج مسبقاً: يأتي كتالوج موصل Airbyte "جاهزاً" مع أكثر من 350 موصل مدمج مسبقاً. يمكن استخدام هذه الموصلات لبدء نسخ البيانات من مصدر إلى وجهة في بضع دقائق فقط.
  • +
  • منشئ موصل بدون كود: يمكنك بسهولة توسيع وظائف Airbyte لدعم حالات الاستخدام المخصصة الخاصة بك من خلال أدوات مثل أداة إنشاء الموصلات بدون كود.
  • +
+

2. المنصة

توفر منصة Airbyte جميع الخدمات الأفقية المطلوبة لتهيئة عمليات نقل البيانات وتوسيع نطاقها، وهي متاحة كخدمة مُدارة سحابياً أو مُدارة ذاتياً.

+

3. واجهة المستخدم

تتميز Airbyte بواجهة مستخدم، وPyAirbyte (مكتبة Python)، وواجهة برمجة التطبيقات، ومزود Terraform للتكامل مع الأدوات والنهج المفضل لديك لإدارة البنية التحتية.

+

مع قدرة Airbyte، يمكن للمستخدمين دمج مصادر البيانات في مجموعة Milvus للبحث عن التشابه.

+

قبل أن تبدأ

ستحتاج إلى

+
    +
  • حساب Zendesk (أو مصدر بيانات آخر تريد مزامنة البيانات منه)
  • +
  • حساب Airbyte أو مثيل محلي
  • +
  • مفتاح OpenAI API
  • +
  • مجموعة ميلفوس العنقودية
  • +
  • بايثون 3.10 مثبت محلياً
  • +
+

إعداد مجموعة ميلفوس العنقودية

إذا كنت قد قمت بالفعل بنشر مجموعة K8s للإنتاج، يمكنك تخطي هذه الخطوة والمتابعة مباشرةً لنشر Milvus Operator. إذا لم يكن الأمر كذلك، يمكنك اتباع الخطوات لنشر مجموعة ميلفوس العنقودية مع مشغل ميلفوس.

+

يتم تخزين الكيانات الفردية (في حالتنا، تذاكر الدعم ومقالات القاعدة المعرفية) في "مجموعة" - بعد إعداد مجموعتك، تحتاج إلى إنشاء مجموعة. اختر اسمًا مناسبًا واضبط البُعد على 1536 لمطابقة البُعد المتجه الذي تم إنشاؤه بواسطة خدمة تضمينات OpenAI.

+

بعد الإنشاء، قم بتسجيل نقطة النهاية ومعلومات المصادقة.

+

إعداد الاتصال في Airbyte

قاعدة بياناتنا جاهزة، دعنا ننقل بعض البيانات! للقيام بذلك، نحتاج إلى تكوين اتصال في Airbyte. إما أن تقوم بالتسجيل للحصول على حساب Airbyte السحابي على cloud.airbyte.com أو قم بتشغيل مثيل محلي كما هو موضح في الوثائق.

+

إعداد المصدر

بمجرد تشغيل المثيل الخاص بك، نحتاج إلى إعداد الاتصال - انقر فوق "اتصال جديد" واختر موصل "دعم Zendesk" كمصدر. بعد النقر فوق الزر "اختبار وحفظ"، ستتحقق Airbyte من إمكانية إنشاء الاتصال.

+

على سحابة Airbyte، يمكنك المصادقة بسهولة عن طريق النقر على زر "مصادقة". عند استخدام مثيل Airbyte محلي، اتبع الإرشادات الموضحة في صفحة التوثيق.

+

إعداد الوجهة

إذا كان كل شيء يعمل بشكل صحيح، فإن الخطوة التالية هي إعداد الوجهة لنقل البيانات إليها. هنا، اختر موصل "Milvus".

+

يقوم موصل "ميلفوس" بثلاثة أشياء:

+
    +
  • التقطيع والتنسيق - تقسيم سجلات Zendesk إلى نص وبيانات وصفية. إذا كان النص أكبر من حجم القطعة المحدد، يتم تقسيم السجلات إلى أجزاء متعددة يتم تحميلها في المجموعة بشكل فردي. يمكن أن يحدث تقسيم النص (أو التقطيع)، على سبيل المثال، في حالة تذاكر الدعم الكبيرة أو المقالات المعرفية. من خلال تقسيم النص، يمكنك التأكد من أن عمليات البحث تؤدي دائمًا إلى نتائج مفيدة.
  • +
+

دعنا نختار حجم قطعة بحجم 1000 رمز وحقول نصية من النص الأساسي والعنوان والوصف والموضوع، حيث ستكون هذه موجودة في البيانات التي سنتلقاها من Zendesk.

+
    +
  • التضمين - يؤدي استخدام نماذج التعلّم الآلي إلى تحويل الأجزاء النصية التي ينتجها جزء المعالجة إلى تضمينات متجهة يمكنك بعد ذلك البحث عن التشابه الدلالي. لإنشاء التضمينات، يجب عليك توفير مفتاح OpenAI API. ستقوم Airbyte بإرسال كل جزء إلى OpenAI وإضافة المتجه الناتج إلى الكيانات التي تم تحميلها في مجموعة Milvus الخاصة بك.
  • +
  • الفهرسة - بمجرد الانتهاء من فهرسة القطع، يمكنك تحميلها في قاعدة البيانات. للقيام بذلك، أدخل المعلومات التي حصلت عليها عند إعداد مجموعتك ومجموعتك في مجموعة Milvus العنقودية.
    سيؤدي النقر فوق "اختبار وحفظ" إلى التحقق مما إذا كان كل شيء مصطفًا بشكل صحيح (بيانات اعتماد صالحة، المجموعة موجودة ولها نفس الأبعاد المتجهة مثل التضمين الذي تم تكوينه، وما إلى ذلك).
  • +
+

إعداد تدفق مزامنة الدفق

الخطوة الأخيرة قبل أن تصبح البيانات جاهزة للتدفق هي تحديد "التدفقات" المراد مزامنتها. الدفق هو مجموعة من السجلات في المصدر. نظرًا لأن Zendesk يدعم عددًا كبيرًا من التدفقات غير ذات الصلة بحالة الاستخدام الخاصة بنا، دعنا نختار فقط "التذاكر" و "المقالات" ونعطل جميع التدفقات الأخرى لتوفير النطاق الترددي والتأكد من أن المعلومات ذات الصلة فقط ستظهر في عمليات البحث:

يمكنك تحديد الحقول المراد استخراجها من المصدر بالنقر على اسم الدفق. يعني وضع المزامنة "تزايدي |إلحاق + مستخرج" أن عمليات تشغيل الاتصال اللاحقة تحافظ على مزامنة Zendesk و Milvus أثناء نقل الحد الأدنى من البيانات (فقط المقالات والتذاكر التي تغيرت منذ آخر تشغيل).

+

بمجرد إعداد الاتصال، سيبدأ Airbyte في مزامنة البيانات. قد يستغرق الأمر بضع دقائق لتظهر في مجموعة ميلفوس الخاصة بك.

+

إذا قمت بتحديد تكرار النسخ المتماثل، فسيتم تشغيل Airbyte بانتظام للحفاظ على تحديث مجموعة Milvus الخاصة بك بالتغييرات التي تطرأ على مقالات Zendesk والمشكلات التي تم إنشاؤها حديثًا.

+

التحقق من التدفق

يمكنك التحقق في واجهة مستخدم مجموعة Milvus من واجهة مستخدم Milvus من كيفية تنظيم البيانات في المجموعة من خلال الانتقال إلى الملعب وتنفيذ استعلام "استعلام البيانات" مع تعيين عامل تصفية إلى "_ab_stream == \"تذاكر\"".

كما ترى في طريقة عرض النتيجة، يتم تخزين كل سجل قادم من Zendesk ككيانات منفصلة في Milvus مع جميع البيانات الوصفية المحددة. يظهر الجزء النصي الذي يستند إليه التضمين كخاصية "نص" - هذا هو النص الذي تم تضمينه باستخدام OpenAI وسيكون ما سنبحث عنه.

+

إنشاء تطبيق Streamlit للاستعلام عن المجموعة

بياناتنا جاهزة - نحتاج الآن إلى بناء التطبيق لاستخدامها. في هذه الحالة، سيكون التطبيق عبارة عن نموذج دعم بسيط للمستخدمين لإرسال حالات الدعم. عندما يضغط المستخدم على إرسال سنقوم بأمرين:

+
    +
  • البحث عن التذاكر المماثلة التي أرسلها مستخدمون من نفس المؤسسة
  • +
  • البحث عن المقالات القائمة على المعرفة التي قد تكون ذات صلة بالمستخدم
  • +
+

في كلتا الحالتين، سنستفيد من البحث الدلالي باستخدام تضمينات OpenAI. للقيام بذلك، يتم أيضًا تضمين وصف المشكلة التي أدخلها المستخدم واستخدامه لاسترداد الكيانات المماثلة من مجموعة Milvus. إذا كانت هناك نتائج ذات صلة، يتم عرضها أسفل النموذج.

+

إعداد بيئة واجهة المستخدم

ستحتاج إلى تثبيت بايثون محلي لأننا سنستخدم Streamlit لتنفيذ التطبيق.

+

أولًا، قم بتثبيت Streamlit ومكتبة عميل Milvus ومكتبة عميل OpenAI محليًا:

+
pip install streamlit pymilvus openai
+
+

لتقديم نموذج دعم أساسي، قم بإنشاء ملف بايثون basic_support_form.py:

+
import streamlit as st
+
+with st.form("my_form"):
+    st.write("Submit a support case")
+    text_val = st.text_area("Describe your problem")
+
+    submitted = st.form_submit_button("Submit")
+    if submitted:
+        # TODO check for related support cases and articles
+        st.write("Submitted!")
+
+

لتشغيل تطبيقك، استخدم Streamlit run:

+
streamlit run basic_support_form.py
+
+

سيؤدي ذلك إلى تصيير نموذج أساسي:

يمكن أيضًا العثور على الكود الخاص بهذا المثال على GitHub.

+

إعداد خدمة استعلام الواجهة الخلفية

بعد ذلك، دعنا نتحقق من التذاكر المفتوحة الحالية التي قد تكون ذات صلة. للقيام بذلك، قمنا بتضمين النص الذي أدخله المستخدم باستخدام OpenAI، ثم أجرينا بحثًا عن التشابه في مجموعتنا، مع تصفية التذاكر التي لا تزال مفتوحة. إذا كانت هناك تذكرة ذات مسافة منخفضة جدًا بين التذكرة المقدمة والتذكرة الحالية، فأعلم المستخدم ولا ترسل:

+
import streamlit as st
+import os
+import pymilvus
+import openai
+
+
+with st.form("my_form"):
+    st.write("Submit a support case")
+    text_val = st.text_area("Describe your problem?")
+
+    submitted = st.form_submit_button("Submit")
+    if submitted:
+        import os
+        import pymilvus
+        import openai
+
+        org_id = 360033549136 # TODO Load from customer login data
+
+        pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
+        collection = pymilvus.Collection("zendesk")
+
+        embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
+
+        results = collection.search(data=[embedding], anns_field="vector", param={}, limit=2, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
+
+        st.write(results[0])
+        if len(results[0]) > 0 and results[0].distances[0] < 0.35:
+            matching_ticket = results[0][0].entity
+            st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
+        else:
+            st.write("Submitted!")
+            
+
+

تحدث عدة أشياء هنا

+
    +
  • يتم إعداد الاتصال بمجموعة ميلفوس العنقودية.
  • +
  • يتم استخدام خدمة OpenAI لإنشاء تضمين للوصف الذي أدخله المستخدم.
  • +
  • يتم إجراء بحث عن التشابه، وتصفية النتائج حسب حالة التذكرة ومعرف المؤسسة (حيث أن التذاكر المفتوحة لنفس المؤسسة هي فقط ذات الصلة).
  • +
  • إذا كانت هناك نتائج وكانت المسافة بين متجهات التضمين للتذكرة الحالية والنص الذي تم إدخاله حديثًا أقل من حد معين، يتم استدعاء هذه الحقيقة.
  • +
+

لتشغيل التطبيق الجديد، تحتاج إلى تعيين متغيرات البيئة لـ OpenAI و Milvus أولاً:

+
export MILVUS_TOKEN=...
+export MILVUS_URL=https://...
+export OPENAI_API_KEY=sk-...
+
+streamlit run app.py
+
+

عند محاولة إرسال تذكرة موجودة بالفعل، هكذا ستبدو النتيجة:

يمكن أيضًا العثور على الكود الخاص بهذا المثال على GitHub.

+

إظهار المزيد من المعلومات ذات الصلة

كما ترى في إخراج التصحيح الأخضر المخفي في النسخة النهائية، هناك تذكرتان مطابقتان لبحثنا (في الحالة جديدة، من المنظمة الحالية، وقريبة من ناقل التضمين). ومع ذلك، احتلت الأولى (ذات صلة) مرتبة أعلى من الثانية (غير ذات صلة في هذه الحالة)، وهو ما ينعكس في قيمة المسافة الأقل. يتم التقاط هذه العلاقة في متجهات التضمين دون مطابقة الكلمات بشكل مباشر، كما هو الحال في البحث العادي عن النص الكامل.

+

في الختام، دعنا نعرض معلومات مفيدة بعد إرسال التذكرة لإعطاء المستخدم أكبر قدر ممكن من المعلومات ذات الصلة مقدمًا.

+

للقيام بذلك، سنقوم بإجراء بحثٍ ثانٍ بعد إرسال التذكرة لجلب مقالات قاعدة المعرفة الأكثر مطابقة:

+
   ......
+   
+        else:
+            # TODO Actually send out the ticket
+            st.write("Submitted!")
+            article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
+            st.write(article_results[0])
+            if len(article_results[0]) > 0:
+                st.write("We also found some articles that might help you:")
+                for hit in article_results[0]:
+                    if hit.distance < 0.362:
+                        st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
+
+
+

إذا لم يكن هناك تذكرة دعم مفتوحة مع درجة تشابه عالية، يتم إرسال التذكرة الجديدة وتظهر المقالات المعرفية ذات الصلة أدناه:

يمكن أيضًا العثور على الكود الخاص بهذا المثال على Github.

+

الخلاصة

على الرغم من أن واجهة المستخدم المعروضة هنا ليست نموذج دعم فعلي، بل هي مثال لتوضيح حالة الاستخدام، إلا أن الجمع بين Airbyte و Milvus قوي للغاية - فهو يجعل من السهل تحميل النص من مجموعة متنوعة من المصادر (من قواعد البيانات مثل Postgres عبر واجهات برمجة التطبيقات مثل Zendesk أو GitHub إلى مصادر مخصصة تمامًا تم إنشاؤها باستخدام مجموعة أدوات تطوير البرمجيات SDK الخاصة بـ Airbyte أو أداة إنشاء الموصلات المرئية) وفهرستها في شكل مضمن في Milvus، وهو محرك بحث متجه قوي قادر على التوسع إلى كميات هائلة من البيانات.

+

Airbyte و Milvus مفتوحا المصدر ومجانيان تمامًا للاستخدام على بنيتك التحتية، مع عروض سحابية لإلغاء تحميل العمليات إذا رغبت في ذلك.

+

بالإضافة إلى حالة الاستخدام الكلاسيكية للبحث الدلالي الموضحة في هذه المقالة، يمكن أيضًا استخدام الإعداد العام لبناء روبوت دردشة للإجابة عن الأسئلة باستخدام طريقة RAG (الجيل المعزز للاسترجاع)، أو أنظمة التوصية، أو المساعدة في جعل الإعلانات أكثر ملاءمة وفعالية.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.json b/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.json new file mode 100644 index 000000000..c2a684f44 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus bentoml\n","import bentoml\n\nBENTO_EMBEDDING_MODEL_END_POINT = \"BENTO_EMBEDDING_MODEL_END_POINT\"\nBENTO_API_TOKEN = \"BENTO_API_TOKEN\"\n\nembedding_client = bentoml.SyncHTTPClient(\n BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN\n)\n","# naively chunk on newlines\ndef chunk_text(filename: str) -> list:\n with open(filename, \"r\") as f:\n text = f.read()\n sentences = text.split(\"\\n\")\n return sentences\n","import os\nimport requests\nimport urllib.request\n\n# set up the data source\nrepo = \"ytang07/bento_octo_milvus_RAG\"\ndirectory = \"data\"\nsave_dir = \"./city_data\"\napi_url = f\"https://api.github.com/repos/{repo}/contents/{directory}\"\n\n\nresponse = requests.get(api_url)\ndata = response.json()\n\nif not os.path.exists(save_dir):\n os.makedirs(save_dir)\n\nfor item in data:\n if item[\"type\"] == \"file\":\n file_url = item[\"download_url\"]\n file_path = os.path.join(save_dir, item[\"name\"])\n urllib.request.urlretrieve(file_url, file_path)\n","# please upload your data directory under this file's folder\ncities = os.listdir(\"city_data\")\n# store chunked text for each of the cities in a list of dicts\ncity_chunks = []\nfor city in cities:\n chunked = chunk_text(f\"city_data/{city}\")\n cleaned = []\n for chunk in chunked:\n if len(chunk) > 7:\n cleaned.append(chunk)\n mapped = {\"city_name\": city.split(\".\")[0], \"chunks\": cleaned}\n city_chunks.append(mapped)\n","def get_embeddings(texts: list) -> list:\n if len(texts) > 25:\n splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]\n embeddings = []\n for split in splits:\n embedding_split = embedding_client.encode(sentences=split)\n embeddings += embedding_split\n return embeddings\n return embedding_client.encode(\n sentences=texts,\n )\n","entries = []\nfor city_dict in city_chunks:\n # No need for the embeddings list if get_embeddings already returns a list of lists\n embedding_list = get_embeddings(city_dict[\"chunks\"]) # returns a list of lists\n # Now match texts with embeddings and city name\n for i, embedding in enumerate(embedding_list):\n entry = {\n \"embedding\": embedding,\n \"sentence\": city_dict[\"chunks\"][\n i\n ], # Assume \"chunks\" has the corresponding texts for the embeddings\n \"city\": city_dict[\"city_name\"],\n }\n entries.append(entry)\n print(entries)\n","from pymilvus import MilvusClient\n\nCOLLECTION_NAME = \"Bento_Milvus_RAG\" # random name for your collection\nDIMENSION = 384\n\n# Initialize a Milvus Lite client\nmilvus_client = MilvusClient(\"milvus_demo.db\")\n","from pymilvus import connections\n\nconnections.connect(uri=\"milvus_demo.db\")\n","from pymilvus import MilvusClient, DataType, Collection\n\n# Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n)\n\n# 3.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# prepare index parameters\nindex_params = milvus_client.prepare_index_params()\n\n# add index\nindex_params.add_index(\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n\n# create collection\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME, schema=schema, index_params=index_params\n)\n\n# Outside the loop, now you upsert all the entries at once\nmilvus_client.insert(collection_name=COLLECTION_NAME, data=entries)\n","BENTO_LLM_END_POINT = \"BENTO_LLM_END_POINT\"\n\nllm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)\n","def dorag(question: str, context: str):\n\n prompt = (\n f\"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \\n\"\n f\"The user question is {question}\"\n )\n\n results = llm_client.generate(\n max_tokens=1024,\n prompt=prompt,\n )\n\n res = \"\"\n for result in results:\n res += result\n\n return res\n","question = \"What state is Cambridge in?\"\n\n\ndef ask_a_question(question):\n embeddings = get_embeddings([question])\n res = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=embeddings, # search for the one (1) embedding returned as a list of lists\n anns_field=\"embedding\", # Search across embeddings\n limit=5, # get me the top 5 results\n output_fields=[\"sentence\"], # get the sentence/chunk and city\n )\n\n sentences = []\n for hits in res:\n for hit in hits:\n print(hit)\n sentences.append(hit[\"entity\"][\"sentence\"])\n context = \". \".join(sentences)\n return context\n\n\ncontext = ask_a_question(question=question)\nprint(context)\n","print(dorag(question=question, context=context))\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and BentoML","anchorList":[{"label":"التوليد المعزز للاسترجاع (RAG) مع Milvus و BentoML","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-BentoML","type":1,"isActive":false},{"label":"مقدمة","href":"Introduction","type":2,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":2,"isActive":false},{"label":"خدمة التضمينات باستخدام BentoML/BentoCloud","href":"Serving-Embeddings-with-BentoMLBentoCloud","type":2,"isActive":false},{"label":"إدراج البيانات في قاعدة بيانات المتجهات لاسترجاعها","href":"Inserting-Data-into-a-Vector-Database-for-Retrieval","type":2,"isActive":false},{"label":"إنشاء مجموعة ميلفوس لايت الخاصة بك","href":"Creating-Your-Milvus-Lite-Collection","type":2,"isActive":false},{"label":"إعداد LLM الخاص بك لـ RAG","href":"Set-up-Your-LLM-for-RAG","type":2,"isActive":false},{"label":"تعليمات LLM","href":"LLM-Instructions","type":2,"isActive":false},{"label":"مثال RAG","href":"A-RAG-Example","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.md b/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.md new file mode 100644 index 000000000..eb94e0aa3 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_bentoml.md @@ -0,0 +1,351 @@ +--- +id: integrate_with_bentoml.md +summary: >- + يوضّح هذا الدليل كيفية استخدام نموذج التضمين مفتوح المصدر ونموذج اللغة الكبيرة + على BentoCloud مع قاعدة بيانات Milvus المتجهة لبناء تطبيق الجيل المعزز + للاسترجاع (RAG). +title: التوليد المعزز للاسترجاع (RAG) مع Milvus و BentoML +--- +

التوليد المعزز للاسترجاع (RAG) مع Milvus و BentoML

Open In Colab +GitHub Repository

+

مقدمة

يوضح هذا الدليل كيفية استخدام نموذج التضمين مفتوح المصدر ونموذج اللغة الكبيرة على BentoCloud مع قاعدة بيانات Milvus المتجهة لبناء تطبيق RAG (التوليد المعزز للاسترجاع). BentoCloud هي منصة استدلالية للذكاء الاصطناعي لفرق الذكاء الاصطناعي سريعة الحركة، حيث تقدم بنية تحتية مُدارة بالكامل مصممة خصيصًا للاستدلال على النماذج. وهي تعمل جنباً إلى جنب مع BentoML، وهو إطار عمل مفتوح المصدر لخدمة النماذج، لتسهيل إنشاء ونشر خدمات النماذج عالية الأداء بسهولة. في هذا العرض التوضيحي، نستخدم Milvus Lite كقاعدة بيانات متجهة، وهي نسخة خفيفة الوزن من Milvus التي يمكن تضمينها في تطبيق Python الخاص بك.

+

قبل أن تبدأ

يتوفر Milvus Lite على PyPI. يمكنك تثبيته عبر pip لبايثون 3.8+:

+
$ pip install -U pymilvus bentoml
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

بعد تسجيل الدخول إلى بينتوكلاود، يمكننا التفاعل مع خدمات بينتوكلاود التي تم نشرها في عمليات النشر، وتوجد النهاية_POINT وواجهة برمجة التطبيقات المقابلة في ساحة اللعب -> بايثون. يمكنك تنزيل بيانات المدينة هنا.

+

خدمة التضمينات باستخدام BentoML/BentoCloud

لاستخدام نقطة النهاية هذه، قم باستيراد bentoml وقم بإعداد عميل HTTP باستخدام SyncHTTPClient من خلال تحديد نقطة النهاية واختيارياً الرمز المميز (إذا قمت بتشغيل Endpoint Authorization على BentoCloud). بدلاً من ذلك، يمكنك استخدام نفس النموذج الذي يتم تقديمه من خلال BentoML باستخدام مستودع تضمينات محولات الجمل.

+
import bentoml
+
+BENTO_EMBEDDING_MODEL_END_POINT = "BENTO_EMBEDDING_MODEL_END_POINT"
+BENTO_API_TOKEN = "BENTO_API_TOKEN"
+
+embedding_client = bentoml.SyncHTTPClient(
+    BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN
+)
+
+

بمجرد أن نتصل بعميل_التضمين_التضمين، نحتاج إلى معالجة بياناتنا. لقد وفرنا عدة وظائف لإجراء تقسيم البيانات والتضمين.

+

قراءة الملفات ومعالجة النص مسبقًا إلى قائمة من السلاسل.

+
# naively chunk on newlines
+def chunk_text(filename: str) -> list:
+    with open(filename, "r") as f:
+        text = f.read()
+    sentences = text.split("\n")
+    return sentences
+
+

نحتاج أولاً إلى تنزيل بيانات المدينة.

+
import os
+import requests
+import urllib.request
+
+# set up the data source
+repo = "ytang07/bento_octo_milvus_RAG"
+directory = "data"
+save_dir = "./city_data"
+api_url = f"https://api.github.com/repos/{repo}/contents/{directory}"
+
+
+response = requests.get(api_url)
+data = response.json()
+
+if not os.path.exists(save_dir):
+    os.makedirs(save_dir)
+
+for item in data:
+    if item["type"] == "file":
+        file_url = item["download_url"]
+        file_path = os.path.join(save_dir, item["name"])
+        urllib.request.urlretrieve(file_url, file_path)
+
+

بعد ذلك، نقوم بمعالجة كل ملف من الملفات التي لدينا.

+
# please upload your data directory under this file's folder
+cities = os.listdir("city_data")
+# store chunked text for each of the cities in a list of dicts
+city_chunks = []
+for city in cities:
+    chunked = chunk_text(f"city_data/{city}")
+    cleaned = []
+    for chunk in chunked:
+        if len(chunk) > 7:
+            cleaned.append(chunk)
+    mapped = {"city_name": city.split(".")[0], "chunks": cleaned}
+    city_chunks.append(mapped)
+
+

نقسّم قائمة من السلاسل إلى قائمة من التضمينات، كل منها مجمّع 25 سلسلة نصية.

+
def get_embeddings(texts: list) -> list:
+    if len(texts) > 25:
+        splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]
+        embeddings = []
+        for split in splits:
+            embedding_split = embedding_client.encode(sentences=split)
+            embeddings += embedding_split
+        return embeddings
+    return embedding_client.encode(
+        sentences=texts,
+    )
+
+

والآن، نحتاج إلى مطابقة التضمينات والسلاسل النصية. نظرًا لأنه يجب أن تتطابق قائمة التضمينات وقائمة الجمل حسب الفهرس، يمكننا enumerate من خلال أي من القائمتين لمطابقتها.

+
entries = []
+for city_dict in city_chunks:
+    # No need for the embeddings list if get_embeddings already returns a list of lists
+    embedding_list = get_embeddings(city_dict["chunks"])  # returns a list of lists
+    # Now match texts with embeddings and city name
+    for i, embedding in enumerate(embedding_list):
+        entry = {
+            "embedding": embedding,
+            "sentence": city_dict["chunks"][
+                i
+            ],  # Assume "chunks" has the corresponding texts for the embeddings
+            "city": city_dict["city_name"],
+        }
+        entries.append(entry)
+    print(entries)
+
+

إدراج البيانات في قاعدة بيانات المتجهات لاسترجاعها

بعد إعداد التضمينات والبيانات الخاصة بنا، يمكننا إدراج المتجهات مع البيانات الوصفية في Milvus Lite للبحث عن المتجهات لاحقًا. الخطوة الأولى في هذا القسم هي بدء تشغيل عميل عن طريق الاتصال بـ Milvus Lite. نقوم ببساطة باستيراد الوحدة النمطية MilvusClient وتهيئة عميل Milvus Lite الذي يتصل بقاعدة بيانات متجهات Milvus Lite. يأتي حجم البعد من حجم نموذج التضمين، على سبيل المثال نموذج محول الجملة all-MiniLM-L6-v2 ينتج متجهات ذات أبعاد 384.

+
from pymilvus import MilvusClient
+
+COLLECTION_NAME = "Bento_Milvus_RAG"  # random name for your collection
+DIMENSION = 384
+
+# Initialize a Milvus Lite client
+milvus_client = MilvusClient("milvus_demo.db")
+
+
+

أما بالنسبة للوسيطة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

أو مع واجهة برمجة التطبيقات القديمة للاتصالات.connect.API (غير مستحسن):

+
from pymilvus import connections
+
+connections.connect(uri="milvus_demo.db")
+
+

إنشاء مجموعة ميلفوس لايت الخاصة بك

يتضمن إنشاء مجموعة باستخدام Milvus Lite خطوتين: أولاً، تحديد المخطط، وثانياً، تحديد الفهرس. في هذا القسم، نحتاج إلى وحدة واحدة: DataType تخبرنا بنوع البيانات التي ستكون في الحقل. نحتاج أيضًا إلى استخدام دالتين لإنشاء مخطط وإضافة حقول. create_schema(): إنشاء مخطط مجموعة، و add_field(): إضافة حقل إلى مخطط المجموعة.

+
from pymilvus import MilvusClient, DataType, Collection
+
+# Create schema
+schema = MilvusClient.create_schema(
+    auto_id=True,
+    enable_dynamic_field=True,
+)
+
+# 3.2. Add fields to schema
+schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
+schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
+
+

الآن بعد أن أنشأنا المخطط وحددنا حقل البيانات بنجاح، نحتاج إلى تحديد الفهرس. فيما يتعلق بالبحث، يحدد "الفهرس" كيف سنقوم بتعيين بياناتنا لاسترجاعها. نستخدم الخيار الافتراضي AUTOINDEX لفهرسة بياناتنا لهذا المشروع.

+

بعد ذلك، ننشئ المجموعة بالاسم والمخطط والفهرس المعطى مسبقًا. أخيرًا، نقوم بإدراج البيانات التي تمت معالجتها مسبقًا.

+
# prepare index parameters
+index_params = milvus_client.prepare_index_params()
+
+# add index
+index_params.add_index(
+    field_name="embedding",
+    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
+    metric_type="COSINE",  # L2, COSINE, or IP
+)
+
+# create collection
+if milvus_client.has_collection(collection_name=COLLECTION_NAME):
+    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
+milvus_client.create_collection(
+    collection_name=COLLECTION_NAME, schema=schema, index_params=index_params
+)
+
+# Outside the loop, now you upsert all the entries at once
+milvus_client.insert(collection_name=COLLECTION_NAME, data=entries)
+
+

إعداد LLM الخاص بك لـ RAG

لإنشاء تطبيق RAG، نحتاج إلى نشر LLM على BentoCloud. دعنا نستخدم أحدث Llama3 LLM. بمجرد تشغيله وتشغيله، ما عليك سوى نسخ نقطة النهاية والرمز المميز لهذه الخدمة النموذجية وإعداد عميل لها.

+
BENTO_LLM_END_POINT = "BENTO_LLM_END_POINT"
+
+llm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)
+
+

تعليمات LLM

والآن، سنقوم بإعداد تعليمات LLM مع المطالبة والسياق والسؤال. هذه هي الدالة التي تتصرف كـ LLM ثم تقوم بإرجاع المخرجات من العميل بتنسيق سلسلة.

+
def dorag(question: str, context: str):
+
+    prompt = (
+        f"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \n"
+        f"The user question is {question}"
+    )
+
+    results = llm_client.generate(
+        max_tokens=1024,
+        prompt=prompt,
+    )
+
+    res = ""
+    for result in results:
+        res += result
+
+    return res
+
+

مثال RAG

نحن الآن جاهزون لطرح سؤال. تأخذ هذه الدالة ببساطة سؤالًا ثم تقوم بعمل RAG لتوليد السياق ذي الصلة من المعلومات الأساسية. ثم نمرر السياق والسؤال إلى dorag() ونحصل على النتيجة.

+
question = "What state is Cambridge in?"
+
+
+def ask_a_question(question):
+    embeddings = get_embeddings([question])
+    res = milvus_client.search(
+        collection_name=COLLECTION_NAME,
+        data=embeddings,  # search for the one (1) embedding returned as a list of lists
+        anns_field="embedding",  # Search across embeddings
+        limit=5,  # get me the top 5 results
+        output_fields=["sentence"],  # get the sentence/chunk and city
+    )
+
+    sentences = []
+    for hits in res:
+        for hit in hits:
+            print(hit)
+            sentences.append(hit["entity"]["sentence"])
+    context = ". ".join(sentences)
+    return context
+
+
+context = ask_a_question(question=question)
+print(context)
+
+

تنفيذ RAG

+
print(dorag(question=question, context=context))
+
+

بالنسبة لمثال السؤال الذي يسأل عن الحالة التي تتواجد فيها كامبريدج، يمكننا طباعة الإجابة كاملةً من BentoML. ومع ذلك، إذا أخذنا الوقت الكافي لتحليله، سيبدو الأمر أجمل، وسيخبرنا أن كامبريدج تقع في ماساتشوستس.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_camel.json b/localization/v2.5.x/site/ar/integrations/integrate_with_camel.json new file mode 100644 index 000000000..ed316bfe7 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_camel.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U \"camel-ai[all]\" pymilvus\n","import os\nimport requests\n\nos.makedirs(\"local_data\", exist_ok=True)\n\nurl = \"https://arxiv.org/pdf/2303.17760.pdf\"\nresponse = requests.get(url)\nwith open(\"local_data/camel paper.pdf\", \"wb\") as file:\n file.write(response.content)\n","os.environ[\"OPENAI_API_KEY\"] = \"Your Key\"\n","from camel.embeddings import OpenAIEmbedding\n\nembedding_instance = OpenAIEmbedding()\n","from camel.storages import MilvusStorage\n\nstorage_instance = MilvusStorage(\n vector_dim=embedding_instance.get_output_dim(),\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n collection_name=\"camel_paper\",\n)\n","from camel.retrievers import VectorRetriever\n\nvector_retriever = VectorRetriever(\n embedding_model=embedding_instance, storage=storage_instance\n)\n","vector_retriever.process(content_input_path=\"local_data/camel paper.pdf\")\n","retrieved_info = vector_retriever.query(query=\"What is CAMEL?\", top_k=1)\nprint(retrieved_info)\n","retrieved_info_irrelevant = vector_retriever.query(\n query=\"Compared with dumpling and rice, which should I take for dinner?\", top_k=1\n)\n\nprint(retrieved_info_irrelevant)\n","from camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\nauto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n)\n\nretrieved_info = auto_retriever.run_vector_retriever(\n query=\"What is CAMEL-AI\",\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n top_k=1,\n return_detailed_info=True,\n)\n\nprint(retrieved_info)\n","from camel.agents import ChatAgent\nfrom camel.messages import BaseMessage\nfrom camel.types import RoleType\nfrom camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\n\ndef single_agent(query: str) -> str:\n # Set agent role\n assistant_sys_msg = BaseMessage(\n role_name=\"Assistant\",\n role_type=RoleType.ASSISTANT,\n meta_dict=None,\n content=\"\"\"You are a helpful assistant to answer question,\n I will give you the Original Query and Retrieved Context,\n answer the Original Query based on the Retrieved Context,\n if you can't answer the question just say I don't know.\"\"\",\n )\n\n # Add auto retriever\n auto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n )\n\n retrieved_info = auto_retriever.run_vector_retriever(\n query=query,\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n # vector_storage_local_path=\"storage_default_run\",\n top_k=1,\n return_detailed_info=True,\n )\n\n # Pass the retrieved infomation to agent\n user_msg = BaseMessage.make_user_message(role_name=\"User\", content=retrieved_info)\n agent = ChatAgent(assistant_sys_msg)\n\n # Get response\n assistant_response = agent.step(user_msg)\n return assistant_response.msg.content\n\n\nprint(single_agent(\"What is CAMEL-AI\"))\n","from typing import List\nfrom colorama import Fore\n\nfrom camel.agents.chat_agent import FunctionCallingRecord\nfrom camel.configs import ChatGPTConfig\nfrom camel.functions import (\n MATH_FUNCS,\n RETRIEVAL_FUNCS,\n)\nfrom camel.societies import RolePlaying\nfrom camel.types import ModelType\nfrom camel.utils import print_text_animated\n\n\ndef role_playing_with_rag(\n task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10\n) -> None:\n task_prompt = task_prompt\n\n user_model_config = ChatGPTConfig(temperature=0.0)\n\n function_list = [\n *MATH_FUNCS,\n *RETRIEVAL_FUNCS,\n ]\n assistant_model_config = ChatGPTConfig(\n tools=function_list,\n temperature=0.0,\n )\n\n role_play_session = RolePlaying(\n assistant_role_name=\"Searcher\",\n user_role_name=\"Professor\",\n assistant_agent_kwargs=dict(\n model_type=model_type,\n model_config=assistant_model_config,\n tools=function_list,\n ),\n user_agent_kwargs=dict(\n model_type=model_type,\n model_config=user_model_config,\n ),\n task_prompt=task_prompt,\n with_task_specify=False,\n )\n\n print(\n Fore.GREEN\n + f\"AI Assistant sys message:\\n{role_play_session.assistant_sys_msg}\\n\"\n )\n print(Fore.BLUE + f\"AI User sys message:\\n{role_play_session.user_sys_msg}\\n\")\n\n print(Fore.YELLOW + f\"Original task prompt:\\n{task_prompt}\\n\")\n print(\n Fore.CYAN\n + f\"Specified task prompt:\\n{role_play_session.specified_task_prompt}\\n\"\n )\n print(Fore.RED + f\"Final task prompt:\\n{role_play_session.task_prompt}\\n\")\n\n n = 0\n input_msg = role_play_session.init_chat()\n while n < chat_turn_limit:\n n += 1\n assistant_response, user_response = role_play_session.step(input_msg)\n\n if assistant_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI Assistant terminated. Reason: \"\n f\"{assistant_response.info['termination_reasons']}.\"\n )\n )\n break\n if user_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI User terminated. \"\n f\"Reason: {user_response.info['termination_reasons']}.\"\n )\n )\n break\n\n # Print output from the user\n print_text_animated(Fore.BLUE + f\"AI User:\\n\\n{user_response.msg.content}\\n\")\n\n # Print output from the assistant, including any function\n # execution information\n print_text_animated(Fore.GREEN + \"AI Assistant:\")\n tool_calls: List[FunctionCallingRecord] = assistant_response.info[\"tool_calls\"]\n for func_record in tool_calls:\n print_text_animated(f\"{func_record}\")\n print_text_animated(f\"{assistant_response.msg.content}\\n\")\n\n if \"CAMEL_TASK_DONE\" in user_response.msg.content:\n break\n\n input_msg = assistant_response.msg\n","role_playing_with_rag(\n task_prompt=\"\"\"What is the main termination reasons for AI Society\n dataset, how many number of messages did camel decided to\n limit, what's the value plus 100? You should refer to the\n content in path camel/local_data/camel paper.pdf\"\"\"\n)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Camel","anchorList":[{"label":"التوليد المعزّز للاسترجاع (RAG) باستخدام ميلفوس وكامل","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Camel","type":1,"isActive":false},{"label":"تحميل البيانات","href":"Load-Data","type":2,"isActive":false},{"label":"1. تخصيص RAG","href":"1-Customized-RAG","type":2,"isActive":false},{"label":"2. RAG التلقائي","href":"2-Auto-RAG","type":2,"isActive":false},{"label":"3. وكيل واحد مع RAG التلقائي","href":"3-Single-Agent-with-Auto-RAG","type":2,"isActive":false},{"label":"4. لعب الأدوار مع RAG التلقائي","href":"4-Role-playing-with-Auto-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_camel.md b/localization/v2.5.x/site/ar/integrations/integrate_with_camel.md new file mode 100644 index 000000000..22457bb9b --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_camel.md @@ -0,0 +1,474 @@ +--- +id: integrate_with_camel.md +summary: >- + يوضح هذا الدليل كيفية بناء نظام التوليد المعزز للاسترجاع (RAG) باستخدام CAMEL + وMilvus. +title: التوليد المعزّز للاسترجاع (RAG) باستخدام ميلفوس وكامل +--- +

التوليد المعزّز للاسترجاع (RAG) باستخدام ميلفوس وكامل

Open In Colab +GitHub Repository

+

يوضح هذا الدليل كيفية إنشاء نظام الاسترجاع-التوليد المعزز (RAG) باستخدام CAMEL وMilvus.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليدًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

CAMEL هو إطار عمل متعدد العوامل. Milvus هي قاعدة بيانات المتجهات الأكثر تقدمًا في العالم مفتوحة المصدر، وهي مصممة لتشغيل تطبيقات البحث عن التشابه المضمنة وتطبيقات الذكاء الاصطناعي.

+

في هذا الدفتر، نعرض استخدام وحدة استرجاع CAMEL بطريقة مخصصة وطريقة تلقائية. كما سنعرض أيضًا كيفية دمج AutoRetriever مع ChatAgent ، ودمج AutoRetriever مع RolePlaying باستخدام Function Calling.

+

4 أجزاء رئيسية متضمنة:

+
    +
  • الاسترجاع التلقائي المخصص
  • +
  • RAG التلقائي
  • +
  • وكيل واحد مع RAG التلقائي
  • +
  • لعب الأدوار مع RAG التلقائي
  • +
+

تحميل البيانات

لنقم أولاً بتحميل ورقة CAMEL من https://arxiv.org/pdf/2303.17760.pdf. سيكون هذا مثالنا المحلي للبيانات.

+
$ pip install -U "camel-ai[all]" pymilvus
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+
import os
+import requests
+
+os.makedirs("local_data", exist_ok=True)
+
+url = "https://arxiv.org/pdf/2303.17760.pdf"
+response = requests.get(url)
+with open("local_data/camel paper.pdf", "wb") as file:
+    file.write(response.content)
+
+

1. تخصيص RAG

سنقوم في هذا القسم بتعيين خط أنابيب RAG المخصص، وسنأخذ VectorRetriever كمثال. سنقوم بتعيين OpenAIEmbedding كنموذج التضمين و MilvusStorage كمخزن له.

+

لتعيين تضمين OpenAI، نحتاج إلى تعيين OPENAI_API_KEY في أدناه.

+
os.environ["OPENAI_API_KEY"] = "Your Key"
+
+

استيراد وتعيين مثيل التضمين:

+
from camel.embeddings import OpenAIEmbedding
+
+embedding_instance = OpenAIEmbedding()
+
+

استيراد وتعيين مثيل التخزين المتجه:

+
from camel.storages import MilvusStorage
+
+storage_instance = MilvusStorage(
+    vector_dim=embedding_instance.get_output_dim(),
+    url_and_api_key=(
+        "./milvus_demo.db",  # Your Milvus connection URI
+        "",  # Your Milvus token
+    ),
+    collection_name="camel_paper",
+)
+
+
+

لـ url_and_api_key:

+
    +
  • يعد استخدام ملف محلي، على سبيل المثال./milvus.db ، حيث أن URI اتصال Milvus هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام uri الخادم، على سبيل المثالhttp://localhost:19530 ، كعنوان url الخاص بك.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المُدارة بالكامل لـ Milvus، فقم بضبط uri الاتصال والرمز المميز، اللذين يتوافقان مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

قم باستيراد وتعيين مثيل المسترد:

+

بشكل افتراضي، يتم تعيين similarity_threshold على 0.75. يمكنك تغييره.

+
from camel.retrievers import VectorRetriever
+
+vector_retriever = VectorRetriever(
+    embedding_model=embedding_instance, storage=storage_instance
+)
+
+

نحن نستخدم Unstructured Module المدمج لتقسيم المحتوى إلى أجزاء صغيرة، سيتم تقسيم المحتوى تلقائيًا باستخدام وظيفة chunk_by_title ، الحد الأقصى لكل جزء هو 500 حرف، وهو طول مناسب لـ OpenAIEmbedding. سيتم تضمين جميع النصوص الموجودة في القطع وتخزينها في مثيل التخزين المتجه، سيستغرق الأمر بعض الوقت، يرجى الانتظار.

+
vector_retriever.process(content_input_path="local_data/camel paper.pdf")
+
+
[nltk_data] Downloading package punkt to /root/nltk_data...
+[nltk_data]   Unzipping tokenizers/punkt.zip.
+[nltk_data] Downloading package averaged_perceptron_tagger to
+[nltk_data]     /root/nltk_data...
+[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
+
+

يمكننا الآن استرداد المعلومات من مخزن المتجهات عن طريق إعطاء استعلام. بشكل افتراضي، سيعيد لك المحتوى النصي من أعلى 1 قطعة ذات أعلى درجة تشابه في جيب التمام (Cosine)، ويجب أن تكون درجة التشابه أعلى من 0.75 لضمان أن المحتوى المسترجع ذو صلة بالاستعلام. يمكنك أيضًا تغيير القيمة top_k.

+

تتضمن قائمة السلسلة التي تم إرجاعها

+
    +
  • درجة التشابه
  • +
  • مسار المحتوى
  • +
  • البيانات الوصفية
  • +
  • النص
  • +
+
retrieved_info = vector_retriever.query(query="What is CAMEL?", top_k=1)
+print(retrieved_info)
+
+
[{'similarity score': '0.8321675658226013', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 45}, 'text': 'CAMEL Data and Code License The intended purpose and licensing of CAMEL is solely for research use. The source code is licensed under Apache 2.0. The datasets are licensed under CC BY NC 4.0, which permits only non-commercial usage. It is advised that any models trained using the dataset should not be utilized for anything other than research purposes.\n\n45'}]
+
+

لنجرب استعلامًا غير ذي صلة:

+
retrieved_info_irrelevant = vector_retriever.query(
+    query="Compared with dumpling and rice, which should I take for dinner?", top_k=1
+)
+
+print(retrieved_info_irrelevant)
+
+
[{'text': 'No suitable information retrieved from local_data/camel paper.pdf                 with similarity_threshold = 0.75.'}]
+
+

2. RAG التلقائي

في هذا القسم سنقوم بتشغيل AutoRetriever بالإعدادات الافتراضية. ويستخدم OpenAIEmbedding كنموذج تضمين افتراضي و Milvus كتخزين متجه افتراضي.

+

ما عليك القيام به هو

+
    +
  • تعيين مسارات إدخال المحتوى، والتي يمكن أن تكون مسارات محلية أو عناوين url بعيدة
  • +
  • تعيين عنوان url البعيد ومفتاح واجهة برمجة التطبيقات لـ Milvus
  • +
  • تقديم استعلام
  • +
+

سيقوم خط أنابيب RAG التلقائي بإنشاء مجموعات لمسارات إدخال محتوى معينة، وسيتم تعيين اسم المجموعة تلقائيًا بناءً على اسم مسار إدخال المحتوى، إذا كانت المجموعة موجودة، فسيتم الاسترداد مباشرة.

+
from camel.retrievers import AutoRetriever
+from camel.types import StorageType
+
+auto_retriever = AutoRetriever(
+    url_and_api_key=(
+        "./milvus_demo.db",  # Your Milvus connection URI
+        "",  # Your Milvus token
+    ),
+    storage_type=StorageType.MILVUS,
+    embedding_model=embedding_instance,
+)
+
+retrieved_info = auto_retriever.run_vector_retriever(
+    query="What is CAMEL-AI",
+    content_input_paths=[
+        "local_data/camel paper.pdf",  # example local path
+        "https://www.camel-ai.org/",  # example remote url
+    ],
+    top_k=1,
+    return_detailed_info=True,
+)
+
+print(retrieved_info)
+
+
Original Query:
+{What is CAMEL-AI}
+Retrieved Context:
+{'similarity score': '0.8252888321876526', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 7}, 'text': ' Section 3.2, to simulate assistant-user cooperation. For our analysis, we set our attention on AI Society setting. We also gathered conversational data, named CAMEL AI Society and CAMEL Code datasets and problem-solution pairs data named CAMEL Math and CAMEL Science and analyzed and evaluated their quality. Moreover, we will discuss potential extensions of our framework and highlight both the risks and opportunities that future AI society might present.'}
+{'similarity score': '0.8378663659095764', 'content path': 'https://www.camel-ai.org/', 'metadata': {'filetype': 'text/html', 'languages': ['eng'], 'page_number': 1, 'url': 'https://www.camel-ai.org/', 'link_urls': ['#h.3f4tphhd9pn8', 'https://join.slack.com/t/camel-ai/shared_invite/zt-2g7xc41gy-_7rcrNNAArIP6sLQqldkqQ', 'https://discord.gg/CNcNpquyDc'], 'link_texts': [None, None, None], 'emphasized_text_contents': ['Mission', 'CAMEL-AI.org', 'is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.', 'Join us via', 'Slack', 'Discord', 'or'], 'emphasized_text_tags': ['span', 'span', 'span', 'span', 'span', 'span', 'span']}, 'text': 'Mission\n\nCAMEL-AI.org is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.\n\nJoin us via\n\nSlack\n\nDiscord\n\nor'}
+
+

3. وكيل واحد مع RAG التلقائي

سنعرض في هذا القسم كيفية دمج AutoRetriever مع واحد ChatAgent.

+

لنقوم بتعيين دالة وكيل، في هذه الدالة يمكننا الحصول على الاستجابة من خلال توفير استعلام لهذا الوكيل.

+
from camel.agents import ChatAgent
+from camel.messages import BaseMessage
+from camel.types import RoleType
+from camel.retrievers import AutoRetriever
+from camel.types import StorageType
+
+
+def single_agent(query: str) -> str:
+    # Set agent role
+    assistant_sys_msg = BaseMessage(
+        role_name="Assistant",
+        role_type=RoleType.ASSISTANT,
+        meta_dict=None,
+        content="""You are a helpful assistant to answer question,
+         I will give you the Original Query and Retrieved Context,
+        answer the Original Query based on the Retrieved Context,
+        if you can't answer the question just say I don't know.""",
+    )
+
+    # Add auto retriever
+    auto_retriever = AutoRetriever(
+        url_and_api_key=(
+            "./milvus_demo.db",  # Your Milvus connection URI
+            "",  # Your Milvus token
+        ),
+        storage_type=StorageType.MILVUS,
+        embedding_model=embedding_instance,
+    )
+
+    retrieved_info = auto_retriever.run_vector_retriever(
+        query=query,
+        content_input_paths=[
+            "local_data/camel paper.pdf",  # example local path
+            "https://www.camel-ai.org/",  # example remote url
+        ],
+        # vector_storage_local_path="storage_default_run",
+        top_k=1,
+        return_detailed_info=True,
+    )
+
+    # Pass the retrieved infomation to agent
+    user_msg = BaseMessage.make_user_message(role_name="User", content=retrieved_info)
+    agent = ChatAgent(assistant_sys_msg)
+
+    # Get response
+    assistant_response = agent.step(user_msg)
+    return assistant_response.msg.content
+
+
+print(single_agent("What is CAMEL-AI"))
+
+
CAMEL-AI is an open-source community dedicated to the study of autonomous and communicative agents. It provides, implements, and supports various types of agents, tasks, prompts, models, datasets, and simulated environments to facilitate research in this field.
+
+

4. لعب الأدوار مع RAG التلقائي

سنوضح في هذا القسم كيفية الجمع بين RETRIEVAL_FUNCS مع RolePlaying من خلال تطبيق Function Calling.

+
from typing import List
+from colorama import Fore
+
+from camel.agents.chat_agent import FunctionCallingRecord
+from camel.configs import ChatGPTConfig
+from camel.functions import (
+    MATH_FUNCS,
+    RETRIEVAL_FUNCS,
+)
+from camel.societies import RolePlaying
+from camel.types import ModelType
+from camel.utils import print_text_animated
+
+
+def role_playing_with_rag(
+    task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10
+) -> None:
+    task_prompt = task_prompt
+
+    user_model_config = ChatGPTConfig(temperature=0.0)
+
+    function_list = [
+        *MATH_FUNCS,
+        *RETRIEVAL_FUNCS,
+    ]
+    assistant_model_config = ChatGPTConfig(
+        tools=function_list,
+        temperature=0.0,
+    )
+
+    role_play_session = RolePlaying(
+        assistant_role_name="Searcher",
+        user_role_name="Professor",
+        assistant_agent_kwargs=dict(
+            model_type=model_type,
+            model_config=assistant_model_config,
+            tools=function_list,
+        ),
+        user_agent_kwargs=dict(
+            model_type=model_type,
+            model_config=user_model_config,
+        ),
+        task_prompt=task_prompt,
+        with_task_specify=False,
+    )
+
+    print(
+        Fore.GREEN
+        + f"AI Assistant sys message:\n{role_play_session.assistant_sys_msg}\n"
+    )
+    print(Fore.BLUE + f"AI User sys message:\n{role_play_session.user_sys_msg}\n")
+
+    print(Fore.YELLOW + f"Original task prompt:\n{task_prompt}\n")
+    print(
+        Fore.CYAN
+        + f"Specified task prompt:\n{role_play_session.specified_task_prompt}\n"
+    )
+    print(Fore.RED + f"Final task prompt:\n{role_play_session.task_prompt}\n")
+
+    n = 0
+    input_msg = role_play_session.init_chat()
+    while n < chat_turn_limit:
+        n += 1
+        assistant_response, user_response = role_play_session.step(input_msg)
+
+        if assistant_response.terminated:
+            print(
+                Fore.GREEN
+                + (
+                    "AI Assistant terminated. Reason: "
+                    f"{assistant_response.info['termination_reasons']}."
+                )
+            )
+            break
+        if user_response.terminated:
+            print(
+                Fore.GREEN
+                + (
+                    "AI User terminated. "
+                    f"Reason: {user_response.info['termination_reasons']}."
+                )
+            )
+            break
+
+        # Print output from the user
+        print_text_animated(Fore.BLUE + f"AI User:\n\n{user_response.msg.content}\n")
+
+        # Print output from the assistant, including any function
+        # execution information
+        print_text_animated(Fore.GREEN + "AI Assistant:")
+        tool_calls: List[FunctionCallingRecord] = assistant_response.info["tool_calls"]
+        for func_record in tool_calls:
+            print_text_animated(f"{func_record}")
+        print_text_animated(f"{assistant_response.msg.content}\n")
+
+        if "CAMEL_TASK_DONE" in user_response.msg.content:
+            break
+
+        input_msg = assistant_response.msg
+
+

قم بتشغيل لعب الأدوار مع دالة المسترد المحددة:

+
role_playing_with_rag(
+    task_prompt="""What is the main termination reasons for AI Society
+                   dataset, how many number of messages did camel decided to
+                   limit, what's the value plus 100? You should refer to the
+                   content in path camel/local_data/camel paper.pdf"""
+)
+
+
AI Assistant sys message:
+BaseMessage(role_name='Searcher', role_type=<RoleType.ASSISTANT: 'assistant'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content="===== RULES OF ASSISTANT =====\nNever forget you are a Searcher and I am a Professor. Never flip roles! Never instruct me!\nWe share a common interest in collaborating to successfully complete a task.\nYou must help me to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?. Never forget our task!\nI must instruct you based on your expertise and my needs to complete the task.\n\nI must give you one instruction at a time.\nYou must write a specific solution that appropriately solves the requested instruction and explain your solutions.\nYou must decline my instruction honestly if you cannot perform the instruction due to physical, moral, legal reasons or your capability and explain the reasons.\nUnless I say the task is completed, you should always start with:\n\nSolution: <YOUR_SOLUTION>\n\n<YOUR_SOLUTION> should be very specific, include detailed explanations and provide preferable detailed implementations and examples and lists for task-solving.\nAlways end <YOUR_SOLUTION> with: Next request.")
+
+AI User sys message:
+BaseMessage(role_name='Professor', role_type=<RoleType.USER: 'user'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content='===== RULES OF USER =====\nNever forget you are a Professor and I am a Searcher. Never flip roles! You will always instruct me.\nWe share a common interest in collaborating to successfully complete a task.\nI must help you to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what\'s the value plus 100?. Never forget our task!\nYou must instruct me based on my expertise and your needs to solve the task ONLY in the following two ways:\n\n1. Instruct with a necessary input:\nInstruction: <YOUR_INSTRUCTION>\nInput: <YOUR_INPUT>\n\n2. Instruct without any input:\nInstruction: <YOUR_INSTRUCTION>\nInput: None\n\nThe "Instruction" describes a task or question. The paired "Input" provides further context or information for the requested "Instruction".\n\nYou must give me one instruction at a time.\nI must write a response that appropriately solves the requested instruction.\nI must decline your instruction honestly if I cannot perform the instruction due to physical, moral, legal reasons or my capability and explain the reasons.\nYou should instruct me not ask me questions.\nNow you must start to instruct me using the two ways described above.\nDo not add anything else other than your instruction and the optional corresponding input!\nKeep giving me instructions and necessary inputs until you think the task is completed.\nWhen the task is completed, you must only reply with a single word <CAMEL_TASK_DONE>.\nNever say <CAMEL_TASK_DONE> unless my responses have solved your task.')
+
+Original task prompt:
+What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
+
+Specified task prompt:
+None
+
+Final task prompt:
+What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
+
+
+
+AI User:
+
+Instruction: Provide a summary of the main termination reasons in the AI Society dataset.
+Input: None
+
+
+AI Assistant:
+
+Function Execution: local_retriever
+    Args: {'query': 'main termination reasons for AI Society dataset'}
+    Result: Original Query:
+{main termination reasons for AI Society dataset}
+Retrieved Context:
+Next we examine the conversation termination reasons for both AI Society and Code datasets. As can be seen in Figure 8, the main termination reasons for AI Society dataset is Assistant Instruct whereas for Code it is Token Limit. The latter is expected as the since responses that contain code tend to be long. It is also interesting to note that in both datasets, the termination due to Maximum Number of Messages is low indicating that the limit of 40 maximum messages is reasonable. Our decision t
+
+Solution: The main termination reason for the AI Society dataset is "Assistant Instruct." This indicates that conversations in the AI Society dataset typically end when the assistant is instructed to terminate the conversation.
+
+Next request.
+
+
+AI User:
+
+Instruction: Identify the number of messages that the camel decided to limit in the context provided.
+Input: None
+
+
+AI Assistant:
+
+Solution: The context provided from the local retriever indicates that the camel decided to limit the number of messages to a maximum of 40 messages. This is mentioned in the retrieved context where it states that the termination due to Maximum Number of Messages is low, indicating that the limit of 40 maximum messages is reasonable.
+
+Next request.
+
+
+AI User:
+
+Instruction: Calculate the value of the message limit plus 100.
+Input: None
+
+
+AI Assistant:
+
+Function Execution: add
+    Args: {'a': 40, 'b': 100}
+    Result: 140
+
+Solution: The value of the message limit plus 100 is 140.
+
+Next request.
+
+
+AI User:
+
+CAMEL_TASK_DONE
+
+
+AI Assistant:
+
+Solution: Understood, the task is completed.
+
+Next request.
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.json b/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.json new file mode 100644 index 000000000..326f27b0a --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus cohere pandas numpy tqdm\n","import cohere\nimport pandas\nimport numpy as np\nfrom tqdm import tqdm\nfrom pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility\n","FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json' # The SQuAD dataset url\nCOLLECTION_NAME = 'question_answering_db' # Collection name\nDIMENSION = 1024 # Embeddings size, cohere embeddings default to 4096 with the large model\nCOUNT = 5000 # How many questions to embed and insert into Milvus\nBATCH_SIZE = 96 # How large of batches to use for embedding and insertion\nMILVUS_HOST = 'localhost' # Milvus server URI\nMILVUS_PORT = '19530'\nCOHERE_API_KEY = 'replace-this-with-the-cohere-api-key' # API key obtained from Cohere\n","# Download the dataset\ndataset = pandas.read_json(FILE)\n\n# Clean up the dataset by grabbing all the question answer pairs\nsimplified_records = []\nfor x in dataset['data']:\n for y in x['paragraphs']:\n for z in y['qas']:\n if len(z['answers']) != 0:\n simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})\n\n# Grab the amount of records based on COUNT\nsimplified_records = pandas.DataFrame.from_records(simplified_records)\nsimplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)\n\n# Check the length of the cleaned dataset matches count\nprint(len(simplified_records))\n","5000\n","# Connect to Milvus Database\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n\n# Remove collection if it already exists\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n\n# Create collection which includes the id, title, and embedding.\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n\n# Create an IVF_FLAT index for collection.\nindex_params = {\n 'metric_type':'IP',\n 'index_type':\"IVF_FLAT\",\n 'params':{\"nlist\": 1024}\n}\ncollection.create_index(field_name=\"original_question_embedding\", index_params=index_params)\ncollection.load()\n","# Set up a co:here client.\ncohere_client = cohere.Client(COHERE_API_KEY)\n\n# Extract embeddings from questions using Cohere\ndef embed(texts, input_type):\n res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)\n return res.embeddings\n\n# Insert each question, answer, and qustion embedding\ntotal = pandas.DataFrame()\nfor batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):\n questions = batch['question'].tolist()\n embeddings = embed(questions, \"search_document\")\n \n data = [\n {\n 'original_question': x,\n 'answer': batch['answer'].tolist()[i],\n 'original_question_embedding': embeddings[i]\n } for i, x in enumerate(questions)\n ]\n\n collection.insert(data=data)\n\ntime.sleep(10)\n","# Search the cluster for an answer to a question text\ndef search(text, top_k = 5):\n\n # AUTOINDEX does not require any search params \n search_params = {}\n\n results = collection.search(\n data = embed([text], \"search_query\"), # Embeded the question\n anns_field='original_question_embedding',\n param=search_params,\n limit = top_k, # Limit to top_k results per search\n output_fields=['original_question', 'answer'] # Include the original question and answer in the result\n )\n\n distances = results[0].distances\n entities = [ x.entity.to_dict()['entity'] for x in results[0] ]\n\n ret = [ {\n \"answer\": x[1][\"answer\"],\n \"distance\": x[0],\n \"original_question\": x[1]['original_question']\n } for x in zip(distances, entities)]\n\n return ret\n\n# Ask these questions\nsearch_questions = ['What kills bacteria?', 'What\\'s the biggest dog?']\n\n# Print out the results in order of [answer, similarity score, original question]\n\nret = [ { \"question\": x, \"candidates\": search(x) } for x in search_questions ]\n","# Output\n#\n# [\n# {\n# \"question\": \"What kills bacteria?\",\n# \"candidates\": [\n# {\n# \"answer\": \"farming\",\n# \"distance\": 0.6261022090911865,\n# \"original_question\": \"What makes bacteria resistant to antibiotic treatment?\"\n# },\n# {\n# \"answer\": \"Phage therapy\",\n# \"distance\": 0.6093736886978149,\n# \"original_question\": \"What has been talked about to treat resistant bacteria?\"\n# },\n# {\n# \"answer\": \"oral contraceptives\",\n# \"distance\": 0.5902313590049744,\n# \"original_question\": \"In therapy, what does the antibacterial interact with?\"\n# },\n# {\n# \"answer\": \"slowing down the multiplication of bacteria or killing the bacteria\",\n# \"distance\": 0.5874154567718506,\n# \"original_question\": \"How do antibiotics work?\"\n# },\n# {\n# \"answer\": \"in intensive farming to promote animal growth\",\n# \"distance\": 0.5667208433151245,\n# \"original_question\": \"Besides in treating human disease where else are antibiotics used?\"\n# }\n# ]\n# },\n# {\n# \"question\": \"What's the biggest dog?\",\n# \"candidates\": [\n# {\n# \"answer\": \"English Mastiff\",\n# \"distance\": 0.7875324487686157,\n# \"original_question\": \"What breed was the largest dog known to have lived?\"\n# },\n# {\n# \"answer\": \"forest elephants\",\n# \"distance\": 0.5886962413787842,\n# \"original_question\": \"What large animals reside in the national park?\"\n# },\n# {\n# \"answer\": \"Rico\",\n# \"distance\": 0.5634892582893372,\n# \"original_question\": \"What is the name of the dog that could ID over 200 things?\"\n# },\n# {\n# \"answer\": \"Iditarod Trail Sled Dog Race\",\n# \"distance\": 0.546872615814209,\n# \"original_question\": \"Which dog-sled race in Alaska is the most famous?\"\n# },\n# {\n# \"answer\": \"part of the family\",\n# \"distance\": 0.5387814044952393,\n# \"original_question\": \"Most people today describe their dogs as what?\"\n# }\n# ]\n# }\n# ]\n\n"],"headingContent":"Question Answering Using Milvus and Cohere","anchorList":[{"label":"الإجابة عن الأسئلة باستخدام ميلفوس وكوهير","href":"Question-Answering-Using-Milvus-and-Cohere","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":2,"isActive":false},{"label":"المعلمات","href":"Parameters","type":2,"isActive":false},{"label":"إعداد مجموعة البيانات","href":"Prepare-the-dataset","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-a-collection","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data","type":2,"isActive":false},{"label":"طرح الأسئلة","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.md b/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.md new file mode 100644 index 000000000..157a186a7 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_cohere.md @@ -0,0 +1,319 @@ +--- +id: integrate_with_cohere.md +summary: >- + تستعرض هذه الصفحة كيفية البحث عن أفضل إجابة للأسئلة باستخدام "ميلفوس" كقاعدة + بيانات المتجهات و"عناق الوجه" كنظام تضمين. +title: الإجابة عن الأسئلة باستخدام ميلفوس وكوهير +--- +

الإجابة عن الأسئلة باستخدام ميلفوس وكوهير

توضّح هذه الصفحة كيفية إنشاء نظام للإجابة على الأسئلة استنادًا إلى مجموعة بيانات SQuAD باستخدام ميلفوس كقاعدة بيانات المتجهات و Cohere كنظام تضمين.

+

قبل أن تبدأ

تتطلب مقتطفات التعليمات البرمجية في هذه الصفحة تثبيت حزم pymilvus و cohere و pandas و numpy و tqdm. من بين هذه الحزم، pymilvus هو عميل لـ Milvus. إذا لم تكن موجودة على نظامك، قم بتشغيل الأوامر التالية لتثبيتها:

+
pip install pymilvus cohere pandas numpy tqdm
+
+

ثم تحتاج إلى تحميل الوحدات النمطية المراد استخدامها في هذا الدليل.

+
import cohere
+import pandas
+import numpy as np
+from tqdm import tqdm
+from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
+
+

المعلمات

هنا يمكننا العثور على المعلمات المستخدمة في المقتطفات التالية. يجب تغيير بعضها لتناسب بيئتك. بجانب كل منها وصف لماهيته.

+
FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json'  # The SQuAD dataset url
+COLLECTION_NAME = 'question_answering_db'  # Collection name
+DIMENSION = 1024  # Embeddings size, cohere embeddings default to 4096 with the large model
+COUNT = 5000  # How many questions to embed and insert into Milvus
+BATCH_SIZE = 96 # How large of batches to use for embedding and insertion
+MILVUS_HOST = 'localhost'  # Milvus server URI
+MILVUS_PORT = '19530'
+COHERE_API_KEY = 'replace-this-with-the-cohere-api-key'  # API key obtained from Cohere
+
+

لمعرفة المزيد عن النموذج ومجموعة البيانات المستخدمة في هذه الصفحة، راجع co:here و SQuAD.

+

إعداد مجموعة البيانات

في هذا المثال، سنستخدم في هذا المثال مجموعة بيانات ستانفورد للإجابة على الأسئلة (SQuAD) كمصدر الحقيقة للإجابة على الأسئلة. تأتي مجموعة البيانات هذه على شكل ملف JSON وسنستخدم بانداس لتحميلها.

+
# Download the dataset
+dataset = pandas.read_json(FILE)
+
+# Clean up the dataset by grabbing all the question answer pairs
+simplified_records = []
+for x in dataset['data']:
+    for y in x['paragraphs']:
+        for z in y['qas']:
+            if len(z['answers']) != 0:
+                simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})
+
+# Grab the amount of records based on COUNT
+simplified_records = pandas.DataFrame.from_records(simplified_records)
+simplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)
+
+# Check the length of the cleaned dataset matches count
+print(len(simplified_records))
+
+

يجب أن يكون الناتج هو عدد السجلات في مجموعة البيانات

+
5000
+
+

إنشاء مجموعة

يتعامل هذا القسم مع ميلفوس وإعداد قاعدة البيانات لحالة الاستخدام هذه. داخل ميلفوس، نحتاج إلى إعداد مجموعة وفهرستها.

+
# Connect to Milvus Database
+connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
+
+# Remove collection if it already exists
+if utility.has_collection(COLLECTION_NAME):
+    utility.drop_collection(COLLECTION_NAME)
+
+# Create collection which includes the id, title, and embedding.
+fields = [
+    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
+    FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),
+    FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),
+    FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
+]
+schema = CollectionSchema(fields=fields)
+collection = Collection(name=COLLECTION_NAME, schema=schema)
+
+# Create an IVF_FLAT index for collection.
+index_params = {
+    'metric_type':'IP',
+    'index_type':"IVF_FLAT",
+    'params':{"nlist": 1024}
+}
+collection.create_index(field_name="original_question_embedding", index_params=index_params)
+collection.load()
+
+

إدراج البيانات

بمجرد إعداد المجموعة نحتاج إلى البدء في إدراج بياناتنا. يتم ذلك في ثلاث خطوات

+
    +
  • قراءة البيانات
  • +
  • تضمين الأسئلة الأصلية، و
  • +
  • وإدراج البيانات في المجموعة التي أنشأناها للتو على ميلفوس.
  • +
+

في هذا المثال، تتضمن البيانات في هذا المثال السؤال الأصلي، وتضمين السؤال الأصلي، وإجابة السؤال الأصلي.

+
# Set up a co:here client.
+cohere_client = cohere.Client(COHERE_API_KEY)
+
+# Extract embeddings from questions using Cohere
+def embed(texts, input_type):
+    res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)
+    return res.embeddings
+
+# Insert each question, answer, and qustion embedding
+total = pandas.DataFrame()
+for batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):
+    questions = batch['question'].tolist()
+    embeddings = embed(questions, "search_document")
+    
+    data = [
+        {
+            'original_question': x,
+            'answer': batch['answer'].tolist()[i],
+            'original_question_embedding': embeddings[i]
+        } for i, x in enumerate(questions)
+    ]
+
+    collection.insert(data=data)
+
+time.sleep(10)
+
+

طرح الأسئلة

بمجرد إدراج جميع البيانات في مجموعة ميلفوس، يمكننا طرح أسئلة على النظام من خلال أخذ عبارة السؤال وتضمينها مع كوهير والبحث باستخدام المجموعة.

+
+

قد تكون عمليات البحث التي يتم إجراؤها على البيانات بعد الإدراج مباشرةً أبطأ قليلاً لأن البحث في البيانات غير المفهرسة يتم بطريقة القوة الغاشمة. بمجرد فهرسة البيانات الجديدة تلقائيًا، ستزداد سرعة عمليات البحث.

+
+
# Search the cluster for an answer to a question text
+def search(text, top_k = 5):
+
+    # AUTOINDEX does not require any search params 
+    search_params = {}
+
+    results = collection.search(
+        data = embed([text], "search_query"),  # Embeded the question
+        anns_field='original_question_embedding',
+        param=search_params,
+        limit = top_k,  # Limit to top_k results per search
+        output_fields=['original_question', 'answer']  # Include the original question and answer in the result
+    )
+
+    distances = results[0].distances
+    entities = [ x.entity.to_dict()['entity'] for x in results[0] ]
+
+    ret = [ {
+        "answer": x[1]["answer"],
+        "distance": x[0],
+        "original_question": x[1]['original_question']
+    } for x in zip(distances, entities)]
+
+    return ret
+
+# Ask these questions
+search_questions = ['What kills bacteria?', 'What\'s the biggest dog?']
+
+# Print out the results in order of [answer, similarity score, original question]
+
+ret = [ { "question": x, "candidates": search(x) } for x in search_questions ]
+
+

يجب أن تكون المخرجات مشابهة لما يلي:

+
# Output
+#
+# [
+#     {
+#         "question": "What kills bacteria?",
+#         "candidates": [
+#             {
+#                 "answer": "farming",
+#                 "distance": 0.6261022090911865,
+#                 "original_question": "What makes bacteria resistant to antibiotic treatment?"
+#             },
+#             {
+#                 "answer": "Phage therapy",
+#                 "distance": 0.6093736886978149,
+#                 "original_question": "What has been talked about to treat resistant bacteria?"
+#             },
+#             {
+#                 "answer": "oral contraceptives",
+#                 "distance": 0.5902313590049744,
+#                 "original_question": "In therapy, what does the antibacterial interact with?"
+#             },
+#             {
+#                 "answer": "slowing down the multiplication of bacteria or killing the bacteria",
+#                 "distance": 0.5874154567718506,
+#                 "original_question": "How do antibiotics work?"
+#             },
+#             {
+#                 "answer": "in intensive farming to promote animal growth",
+#                 "distance": 0.5667208433151245,
+#                 "original_question": "Besides in treating human disease where else are antibiotics used?"
+#             }
+#         ]
+#     },
+#     {
+#         "question": "What's the biggest dog?",
+#         "candidates": [
+#             {
+#                 "answer": "English Mastiff",
+#                 "distance": 0.7875324487686157,
+#                 "original_question": "What breed was the largest dog known to have lived?"
+#             },
+#             {
+#                 "answer": "forest elephants",
+#                 "distance": 0.5886962413787842,
+#                 "original_question": "What large animals reside in the national park?"
+#             },
+#             {
+#                 "answer": "Rico",
+#                 "distance": 0.5634892582893372,
+#                 "original_question": "What is the name of the dog that could ID over 200 things?"
+#             },
+#             {
+#                 "answer": "Iditarod Trail Sled Dog Race",
+#                 "distance": 0.546872615814209,
+#                 "original_question": "Which dog-sled race in Alaska is the most famous?"
+#             },
+#             {
+#                 "answer": "part of the family",
+#                 "distance": 0.5387814044952393,
+#                 "original_question": "Most people today describe their dogs as what?"
+#             }
+#         ]
+#     }
+# ]
+
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.json b/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.json new file mode 100644 index 000000000..d7c95cc64 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"dspy-ai[milvus]\"\n$ pip install -U pymilvus\n","from dspy.datasets import HotPotQA\n\n# Load the dataset.\ndataset = HotPotQA(\n train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0\n)\n\n# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.\ntrainset = [x.with_inputs(\"question\") for x in dataset.train]\ndevset = [x.with_inputs(\"question\") for x in dataset.dev]\n","import requests\nimport os\n\nos.environ[\"OPENAI_API_KEY\"] = \"\"\nMILVUS_URI = \"example.db\"\nMILVUS_TOKEN = \"\"\n\nfrom pymilvus import MilvusClient, DataType, Collection\nfrom dspy.retrieve.milvus_rm import openai_embedding_function\n\nclient = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)\n\nif \"dspy_example\" not in client.list_collections():\n client.create_collection(\n collection_name=\"dspy_example\",\n overwrite=True,\n dimension=1536,\n primary_field_name=\"id\",\n vector_field_name=\"embedding\",\n id_type=\"int\",\n metric_type=\"IP\",\n max_length=65535,\n enable_dynamic=True,\n )\ntext = requests.get(\n \"https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt\"\n).text\n\nfor idx, passage in enumerate(text.split(\"\\n\")):\n if len(passage) == 0:\n continue\n client.insert(\n collection_name=\"dspy_example\",\n data=[\n {\n \"id\": idx,\n \"embedding\": openai_embedding_function(passage)[0],\n \"text\": passage,\n }\n ],\n )\n","from dspy.retrieve.milvus_rm import MilvusRM\nimport dspy\n\nretriever_model = MilvusRM(\n collection_name=\"dspy_example\",\n uri=MILVUS_URI,\n token=MILVUS_TOKEN, # ignore this if no token is required for Milvus connection\n embedding_function=openai_embedding_function,\n)\nturbo = dspy.OpenAI(model=\"gpt-3.5-turbo\")\ndspy.settings.configure(lm=turbo)\n","class GenerateAnswer(dspy.Signature):\n \"\"\"Answer questions with short factoid answers.\"\"\"\n\n context = dspy.InputField(desc=\"may contain relevant facts\")\n question = dspy.InputField()\n answer = dspy.OutputField(desc=\"often between 1 and 5 words\")\n","class RAG(dspy.Module):\n def __init__(self, rm):\n super().__init__()\n self.retrieve = rm\n\n # This signature indicates the task imposed on the COT module.\n self.generate_answer = dspy.ChainOfThought(GenerateAnswer)\n\n def forward(self, question):\n # Use milvus_rm to retrieve context for the question.\n context = self.retrieve(question).passages\n # COT module takes \"context, query\" and output \"answer\".\n prediction = self.generate_answer(context=context, question=question)\n return dspy.Prediction(\n context=[item.long_text for item in context], answer=prediction.answer\n )\n","rag = RAG(retriever_model)\nprint(rag(\"who write At My Window\").answer)\n","from dspy.evaluate.evaluate import Evaluate\nfrom dspy.datasets import HotPotQA\n\nevaluate_on_hotpotqa = Evaluate(\n devset=devset, num_threads=1, display_progress=False, display_table=5\n)\n\nmetric = dspy.evaluate.answer_exact_match\nscore = evaluate_on_hotpotqa(rag, metric=metric)\nprint(\"rag:\", score)\n","from dspy.teleprompt import BootstrapFewShot\n\n# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.\n\n\ndef validate_context_and_answer(example, pred, trace=None):\n answer_EM = dspy.evaluate.answer_exact_match(example, pred)\n answer_PM = dspy.evaluate.answer_passage_match(example, pred)\n return answer_EM and answer_PM\n\n\n# Set up a basic teleprompter, which will compile our RAG program.\nteleprompter = BootstrapFewShot(metric=validate_context_and_answer)\n\n# Compile!\ncompiled_rag = teleprompter.compile(rag, trainset=trainset)\n\n# Now compiled_rag is optimized and ready to answer your new question!\n# Now, let’s evaluate the compiled RAG program.\nscore = evaluate_on_hotpotqa(compiled_rag, metric=metric)\nprint(score)\nprint(\"compile_rag:\", score)\n"],"headingContent":"Integrate Milvus with DSPy","anchorList":[{"label":"دمج ميلفوس مع DSPy","href":"Integrate-Milvus-with-DSPy","type":1,"isActive":false},{"label":"ما هو DSPy","href":"What-is-DSPy","type":2,"isActive":false},{"label":"فوائد استخدام DSPy","href":"Benefits-of-using-DSPy","type":2,"isActive":false},{"label":"الوحدات النمطية","href":"Modules","type":2,"isActive":false},{"label":"لماذا ميلفوس في DSPy","href":"Why-Milvus-in-DSPy","type":2,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false},{"label":"ملخص","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.md b/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.md new file mode 100644 index 000000000..3f9d4d127 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_dspy.md @@ -0,0 +1,278 @@ +--- +id: integrate_with_dspy.md +summary: >- + يوضّح هذا الدليل كيفية استخدام MilvusRM، وهي إحدى وحدات مسترجع DSPy، لتحسين + برامج RAG. +title: دمج ميلفوس مع DSPy +--- +

دمج ميلفوس مع DSPy

Open In Colab +GitHub Repository

+

ما هو DSPy

يُعدّ DSPy، الذي قدمته مجموعة ستانفورد للبرمجة اللغوية العصبية (NLP)، إطار عمل برمجي رائد مصمم لتحسين المطالبات والأوزان داخل النماذج اللغوية، وهو ذو قيمة خاصة في السيناريوهات التي يتم فيها دمج نماذج لغوية كبيرة (LLMs) عبر مراحل متعددة من خط الأنابيب. على عكس تقنيات هندسة المطالبة التقليدية التي تعتمد على الصياغة اليدوية والتعديل، تتبنى DSPy نهجًا قائمًا على التعلم. ومن خلال استيعاب أمثلة الأسئلة والأجوبة، يقوم DSPy بإنشاء مطالبات محسّنة ديناميكيًا ومصممة خصيصًا لمهام محددة. تتيح هذه المنهجية المبتكرة إعادة التجميع السلس لخطوط الأنابيب بأكملها، مما يلغي الحاجة إلى إجراء تعديلات يدوية مستمرة على المطالبات. يوفر بناء الجملة البيثوني في DSPy العديد من الوحدات القابلة للتركيب والتعريف، مما يبسط من تعليمات LLMs.

+

فوائد استخدام DSPy

    +
  • نهج البرمجة: يوفر DSPy نهج برمجة منهجي لتطوير خطوط أنابيب LLM من خلال تجريد خطوط الأنابيب كرسوم بيانية لتحويل النصوص بدلاً من مجرد المطالبة فقط بآليات LLM. تتيح وحداته التوضيحية تصميمًا منظمًا وتحسينًا منظمًا، لتحل محل طريقة التجربة والخطأ في قوالب المطالبة التقليدية.
  • +
  • تحسين الأداء: يُظهر DSPy مكاسب كبيرة في الأداء مقارنةً بالطرق الحالية. ومن خلال دراسات الحالة، يتفوق على نماذج المطالبة القياسية والعروض التوضيحية التي أنشأها الخبراء، مما يُظهر تعدد استخداماته وفعاليته حتى عند تجميعها في نماذج LM أصغر.
  • +
  • التجريد المعياري: يُلخص DSPy بفعالية الجوانب المعقدة لتطوير خط أنابيب LM، مثل التحلل والضبط الدقيق واختيار النموذج. وباستخدام DSPy، يمكن ترجمة برنامج موجز بسلاسة إلى تعليمات لنماذج مختلفة، مثل GPT-4 أو Llama2-13b أو T5-base، مما يسهل عملية التطوير ويعزز الأداء.
  • +
+

الوحدات النمطية

هناك العديد من المكونات التي تساهم في بناء خط أنابيب LLM. سنقوم هنا بوصف بعض المكونات الرئيسية لتوفير فهم عالي المستوى لكيفية عمل DSPy.

+

+ + DSPy Modules + وحدات DSPy

+

التوقيع: تعمل التواقيع في DSPy كمواصفات تعريفية، تحدد سلوك المدخلات/المخرجات للوحدات النمطية، وتوجه نموذج اللغة في تنفيذ المهام. الوحدة النمطية: تعمل وحدات DSPy كمكونات أساسية للبرامج التي تستفيد من نماذج اللغة (LMs). فهي تستخلص تقنيات التوجيه المختلفة، مثل سلسلة الأفكار أو ReAct، وهي قابلة للتكيف للتعامل مع أي توقيع DSPy. وبفضل المعلمات القابلة للتعلم والقدرة على معالجة المدخلات وإنتاج المخرجات، يمكن دمج هذه الوحدات لتشكيل برامج أكبر، مستوحاة من وحدات الشبكة العصبية في PyTorch ولكنها مصممة خصيصًا لتطبيقات LM. المُحسِّن: تعمل المحسّنات في DSPy على ضبط معلمات برامج DSPy، مثل المطالبات وأوزان LLM، لزيادة المقاييس المحددة مثل الدقة إلى أقصى حد، مما يعزز كفاءة البرنامج.

+

لماذا ميلفوس في DSPy

DSPy هو إطار برمجة قوي يعزز تطبيقات RAG. يحتاج مثل هذا التطبيق إلى استرداد معلومات مفيدة لتحسين جودة الإجابة، وهو ما يحتاج إلى قاعدة بيانات متجهة. Milvus هي قاعدة بيانات متجهية معروفة مفتوحة المصدر لتحسين الأداء وقابلية التوسع. مع MilvusRM، وهي وحدة استرجاع في DSPy، يصبح دمج Milvus سلسًا. والآن، يمكن للمطورين تحديد برامج RAG وتحسينها بسهولة باستخدام DSPy، مستفيدين من قدرات البحث المتجهية القوية التي تتمتع بها Milvus. هذا التعاون يجعل تطبيقات RAG أكثر كفاءة وقابلية للتطوير، حيث يجمع بين قدرات البرمجة في DSPy وميزات البحث في Milvus.

+

أمثلة

والآن، لنستعرض مثالاً سريعًا لتوضيح كيفية الاستفادة من Milvus في DSPy لتحسين تطبيق RAG.

+

المتطلبات الأساسية

قبل إنشاء تطبيق RAG، قم بتثبيت DSPy و PyMilvus.

+
$ pip install "dspy-ai[milvus]"
+$ pip install -U pymilvus
+
+
+إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى **إعادة تشغيل وقت التشغيل** (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
+

تحميل مجموعة البيانات

في هذا المثال، نستخدم HotPotQA، وهي مجموعة من أزواج الأسئلة والأجوبة المعقدة، كمجموعة بيانات التدريب الخاصة بنا. يمكننا تحميلها من خلال فئة HotPotQA.

+
from dspy.datasets import HotPotQA
+
+# Load the dataset.
+dataset = HotPotQA(
+    train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0
+)
+
+# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
+trainset = [x.with_inputs("question") for x in dataset.train]
+devset = [x.with_inputs("question") for x in dataset.dev]
+
+

إدخال البيانات في قاعدة بيانات ميلفوس المتجهة

أدخل معلومات السياق في مجموعة Milvus لاسترجاع المتجهات. يجب أن تحتوي هذه المجموعة على حقل embedding وحقل text. نستخدم نموذج OpenAI text-embedding-3-small الخاص بـ OpenAI كوظيفة تضمين الاستعلام الافتراضية في هذه الحالة.

+
import requests
+import os
+
+os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"
+MILVUS_URI = "example.db"
+MILVUS_TOKEN = ""
+
+from pymilvus import MilvusClient, DataType, Collection
+from dspy.retrieve.milvus_rm import openai_embedding_function
+
+client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)
+
+if "dspy_example" not in client.list_collections():
+    client.create_collection(
+        collection_name="dspy_example",
+        overwrite=True,
+        dimension=1536,
+        primary_field_name="id",
+        vector_field_name="embedding",
+        id_type="int",
+        metric_type="IP",
+        max_length=65535,
+        enable_dynamic=True,
+    )
+text = requests.get(
+    "https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt"
+).text
+
+for idx, passage in enumerate(text.split("\n")):
+    if len(passage) == 0:
+        continue
+    client.insert(
+        collection_name="dspy_example",
+        data=[
+            {
+                "id": idx,
+                "embedding": openai_embedding_function(passage)[0],
+                "text": passage,
+            }
+        ],
+    )
+
+

تعريف MilvusRM.

الآن، تحتاج إلى تعريف MilvusRM.

+
from dspy.retrieve.milvus_rm import MilvusRM
+import dspy
+
+retriever_model = MilvusRM(
+    collection_name="dspy_example",
+    uri=MILVUS_URI,
+    token=MILVUS_TOKEN,  # ignore this if no token is required for Milvus connection
+    embedding_function=openai_embedding_function,
+)
+turbo = dspy.OpenAI(model="gpt-3.5-turbo")
+dspy.settings.configure(lm=turbo)
+
+

بناء التواقيع

الآن بعد أن قمنا بتحميل البيانات، دعنا نبدأ في تحديد التواقيع للمهام الفرعية لخط الأنابيب الخاص بنا. يمكننا تحديد المدخلات البسيطة question والمخرجات answer ، ولكن بما أننا نبني خط أنابيب RAG، سنقوم باسترداد المعلومات السياقية من Milvus. لذلك دعونا نحدد توقيعنا على أنه context, question --> answer.

+
class GenerateAnswer(dspy.Signature):
+    """Answer questions with short factoid answers."""
+
+    context = dspy.InputField(desc="may contain relevant facts")
+    question = dspy.InputField()
+    answer = dspy.OutputField(desc="often between 1 and 5 words")
+
+

نقوم بتضمين أوصاف قصيرة للحقول context و answer لتحديد إرشادات أوضح حول ما سيتلقاه النموذج وما يجب أن يولده.

+

بناء خط الأنابيب

الآن، دعونا نحدد خط أنابيب RAG.

+
class RAG(dspy.Module):
+    def __init__(self, rm):
+        super().__init__()
+        self.retrieve = rm
+
+        # This signature indicates the task imposed on the COT module.
+        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
+
+    def forward(self, question):
+        # Use milvus_rm to retrieve context for the question.
+        context = self.retrieve(question).passages
+        # COT module takes "context, query" and output "answer".
+        prediction = self.generate_answer(context=context, question=question)
+        return dspy.Prediction(
+            context=[item.long_text for item in context], answer=prediction.answer
+        )
+
+

تنفيذ خط الأنابيب والحصول على النتائج

الآن، قمنا ببناء خط أنابيب RAG. لنجربه ونحصل على النتائج.

+
rag = RAG(retriever_model)
+print(rag("who write At My Window").answer)
+
+
Townes Van Zandt
+
+

يمكننا تقييم النتائج الكمية على مجموعة البيانات.

+
from dspy.evaluate.evaluate import Evaluate
+from dspy.datasets import HotPotQA
+
+evaluate_on_hotpotqa = Evaluate(
+    devset=devset, num_threads=1, display_progress=False, display_table=5
+)
+
+metric = dspy.evaluate.answer_exact_match
+score = evaluate_on_hotpotqa(rag, metric=metric)
+print("rag:", score)
+
+

تحسين خط الأنابيب

بعد تحديد هذا البرنامج، الخطوة التالية هي التجميع. تقوم هذه العملية بتحديث المعلمات داخل كل وحدة نمطية لتحسين الأداء. تعتمد عملية التجميع على ثلاثة عوامل حاسمة:

+
    +
  • مجموعة التدريب: سنستخدم أمثلة الأسئلة والأجوبة الـ 20 من مجموعة بيانات التدريب لهذا العرض التوضيحي.
  • +
  • مقياس التحقق من الصحة: سنقوم بإنشاء مقياس validate_context_and_answer بسيط. يتحقق هذا المقياس من دقة الإجابة المتوقعة ويضمن أن السياق المسترجع يتضمن الإجابة.
  • +
  • المحسِّن المحدد (المحسِّن عن بُعد): يشتمل المحول البرمجي في DSPy على العديد من المحسنات عن بُعد المصممة لتحسين برامجك بفعالية.
  • +
+
from dspy.teleprompt import BootstrapFewShot
+
+# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.
+
+
+def validate_context_and_answer(example, pred, trace=None):
+    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
+    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
+    return answer_EM and answer_PM
+
+
+# Set up a basic teleprompter, which will compile our RAG program.
+teleprompter = BootstrapFewShot(metric=validate_context_and_answer)
+
+# Compile!
+compiled_rag = teleprompter.compile(rag, trainset=trainset)
+
+# Now compiled_rag is optimized and ready to answer your new question!
+# Now, let’s evaluate the compiled RAG program.
+score = evaluate_on_hotpotqa(compiled_rag, metric=metric)
+print(score)
+print("compile_rag:", score)
+
+

وقد زادت درجة Ragas من قيمتها السابقة 50.0 إلى 52.0، مما يشير إلى تحسن في جودة الإجابة.

+

ملخص

يمثل DSPy قفزة في تفاعلات النموذج اللغوي من خلال واجهته القابلة للبرمجة، والتي تسهل التحسين الخوارزمي والآلي لمطالبات النموذج وأوزانه. ومن خلال الاستفادة من DSPy لتنفيذ RAG، تصبح القدرة على التكيف مع نماذج اللغة أو مجموعات البيانات المختلفة أمرًا سهلاً، مما يقلل بشكل كبير من الحاجة إلى التدخلات اليدوية المملة.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.json b/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.json new file mode 100644 index 000000000..53e25aab9 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.json @@ -0,0 +1 @@ +{"codeList":["$ mkdir fastgpt\n$ cd fastgpt\n$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json\n\n# milvus version\n$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml\n# zilliz version\n# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml\n","# Launch the container\n$ docker compose up -d\n# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql\n$ sleep 10\n# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)\n$ docker restart oneapi\n","$ docker compose down\n"],"headingContent":"Deploying FastGPT with Milvus","anchorList":[{"label":"نشر FastGPT مع Milvus","href":"Deploying-FastGPT-with-Milvus","type":1,"isActive":false},{"label":"قم بتنزيل docker-compose.yml","href":"Download-docker-composeyml","type":2,"isActive":false},{"label":"قم بتشغيل الحاوية","href":"Launch-the-Container","type":2,"isActive":false},{"label":"الوصول إلى OneAPI لإضافة نماذج","href":"Access-OneAPI-to-Add-Models","type":2,"isActive":false},{"label":"إعداد الرموز","href":"Setting-Tokens","type":2,"isActive":false},{"label":"الوصول إلى FastGPT","href":"Accessing-FastGPT","type":2,"isActive":false},{"label":"إيقاف الحاوية","href":"Stop-the-Container","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.md b/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.md new file mode 100644 index 000000000..5d43a02db --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_fastgpt.md @@ -0,0 +1,145 @@ +--- +id: integrate_with_fastgpt.md +summary: >- + سيرشدك هذا البرنامج التعليمي إلى كيفية نشر تطبيق FastGPT الحصري الخاص بك بسرعة + باستخدام [Milvus] (https://milvus.io/). +title: نشر FastGPT مع Milvus +--- +

نشر FastGPT مع Milvus

FastGPT هو نظام أسئلة وأجوبة قائم على المعرفة مبني على نموذج اللغة الكبيرة LLM، ويوفر إمكانات جاهزة للاستخدام لمعالجة البيانات واستدعاء النموذج. وعلاوةً على ذلك، فهو يتيح تنسيق سير العمل من خلال تصوّر التدفق، مما يسهّل سيناريوهات الأسئلة والأجوبة المعقدة. سيرشدك هذا البرنامج التعليمي إلى كيفية نشر تطبيق FastGPT الحصري الخاص بك بسرعة باستخدام Milvus.

+

قم بتنزيل docker-compose.yml

تأكد من أنك قمت بتثبيت Docker Compose بالفعل.
+نفّذ الأمر أدناه لتنزيل ملف docker-compose.yml.

+
$ mkdir fastgpt
+$ cd fastgpt
+$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
+
+# milvus version
+$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
+# zilliz version
+# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
+
+
+

إذا كنت تستخدم إصدار Zilliz، فقم بتعديل معلمات الرابط MILVUS_ADDRESS و MILVUS_TOKEN في ملف docker-compose.yml، والذي يتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.

+
+

قم بتشغيل الحاوية

قم بالتشغيل في نفس دليل docker-compose.yml. تأكد من أن إصدار docker-compose أعلى من الإصدار 2.17 بشكل مثالي، حيث أن بعض أوامر الأتمتة قد لا تعمل بخلاف ذلك.

+
# Launch the container
+$ docker compose up -d
+# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql
+$ sleep 10
+# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)
+$ docker restart oneapi
+
+

الوصول إلى OneAPI لإضافة نماذج

يمكن الوصول إلى OneAPI على ip:3001. اسم المستخدم الافتراضي هو الجذر، وكلمة المرور هي 123456. يمكنك تغيير كلمة المرور بعد تسجيل الدخول.
+باستخدام نموذج OpenAI كمثال، انقر على علامة التبويب "القناة"، وحدد نموذج الدردشة ونموذج التضمين ضمن "النماذج".
+أدخل مفتاح OpenAI API الخاص بك في قسم "الأسرار".
+لاستخدام النماذج خارج OpenAI، ولمزيد من المعلومات، يُرجى الرجوع إلى One API.

+

إعداد الرموز

انقر على علامة التبويب "الرموز". بشكل افتراضي، يوجد رمز مميز Initial Root Token. يمكنك أيضًا إنشاء رمز مميز جديد وتعيين حصة خاصة بك.
+انقر فوق "نسخ" على الرمز المميز الخاص بك، مع التأكد من أن قيمة هذا الرمز المميز تتطابق مع قيمة CHAT_API_KEY المحددة في ملف docker-compose.yml.

+

الوصول إلى FastGPT

في الوقت الحالي، يمكن الوصول إلى FastGPT مباشرةً على ip:3000 (يرجى الانتباه إلى جدار الحماية). اسم المستخدم لتسجيل الدخول هو الجذر، مع تعيين كلمة المرور إلى DEFAULT_ROOT_PSW ضمن متغير البيئة docker-compose.yml. إذا كنت بحاجة إلى الوصول إلى اسم المجال، فستحتاج إلى تثبيت Nginx وتهيئته بنفسك.

+

إيقاف الحاوية

قم بتشغيل الأمر التالي لإيقاف الحاوية.

+
$ docker compose down
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.json b/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.json new file mode 100644 index 000000000..91ff7e287 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import os\nimport urllib.request\n\nurl = \"https://www.gutenberg.org/cache/epub/7785/pg7785.txt\"\nfile_path = \"./davinci.txt\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\n","from haystack import Pipeline\nfrom haystack.components.converters import MarkdownToDocument\nfrom haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder\nfrom haystack.components.preprocessors import DocumentSplitter\nfrom haystack.components.writers import DocumentWriter\nfrom haystack.utils import Secret\n\nfrom milvus_haystack import MilvusDocumentStore\nfrom milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever\n\n\ndocument_store = MilvusDocumentStore(\n connection_args={\"uri\": \"./milvus.db\"},\n # connection_args={\"uri\": \"http://localhost:19530\"},\n # connection_args={\"uri\": YOUR_ZILLIZ_CLOUD_URI, \"token\": Secret.from_env_var(\"ZILLIZ_CLOUD_API_KEY\")},\n drop_old=True,\n)\n","indexing_pipeline = Pipeline()\nindexing_pipeline.add_component(\"converter\", MarkdownToDocument())\nindexing_pipeline.add_component(\n \"splitter\", DocumentSplitter(split_by=\"sentence\", split_length=2)\n)\nindexing_pipeline.add_component(\"embedder\", OpenAIDocumentEmbedder())\nindexing_pipeline.add_component(\"writer\", DocumentWriter(document_store))\nindexing_pipeline.connect(\"converter\", \"splitter\")\nindexing_pipeline.connect(\"splitter\", \"embedder\")\nindexing_pipeline.connect(\"embedder\", \"writer\")\nindexing_pipeline.run({\"converter\": {\"sources\": [file_path]}})\n\nprint(\"Number of documents:\", document_store.count_documents())\n","question = 'Where is the painting \"Warrior\" currently stored?'\n\nretrieval_pipeline = Pipeline()\nretrieval_pipeline.add_component(\"embedder\", OpenAITextEmbedder())\nretrieval_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nretrieval_pipeline.connect(\"embedder\", \"retriever\")\n\nretrieval_results = retrieval_pipeline.run({\"embedder\": {\"text\": question}})\n\nfor doc in retrieval_results[\"retriever\"][\"documents\"]:\n print(doc.content)\n print(\"-\" * 10)\n","from haystack.utils import Secret\nfrom haystack.components.builders import PromptBuilder\nfrom haystack.components.generators import OpenAIGenerator\n\nprompt_template = \"\"\"Answer the following query based on the provided context. If the context does\n not include an answer, reply with 'I don't know'.\\n\n Query: {{query}}\n Documents:\n {% for doc in documents %}\n {{ doc.content }}\n {% endfor %}\n Answer:\n \"\"\"\n\nrag_pipeline = Pipeline()\nrag_pipeline.add_component(\"text_embedder\", OpenAITextEmbedder())\nrag_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nrag_pipeline.add_component(\"prompt_builder\", PromptBuilder(template=prompt_template))\nrag_pipeline.add_component(\n \"generator\",\n OpenAIGenerator(\n api_key=Secret.from_token(os.getenv(\"OPENAI_API_KEY\")),\n generation_kwargs={\"temperature\": 0},\n ),\n)\nrag_pipeline.connect(\"text_embedder.embedding\", \"retriever.query_embedding\")\nrag_pipeline.connect(\"retriever.documents\", \"prompt_builder.documents\")\nrag_pipeline.connect(\"prompt_builder\", \"generator\")\n\nresults = rag_pipeline.run(\n {\n \"text_embedder\": {\"text\": question},\n \"prompt_builder\": {\"query\": question},\n }\n)\nprint(\"RAG answer:\", results[\"generator\"][\"replies\"][0])\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Haystack","anchorList":[{"label":"التوليد المعزز للاسترجاع (RAG) باستخدام ميلفوس وهايستاك","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Haystack","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-the-data","type":2,"isActive":false},{"label":"إنشاء خط أنابيب الفهرسة","href":"Create-the-indexing-Pipeline","type":2,"isActive":false},{"label":"إنشاء خط أنابيب الاسترجاع","href":"Create-the-retrieval-pipeline","type":2,"isActive":false},{"label":"إنشاء خط أنابيب RAG","href":"Create-the-RAG-pipeline","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.md b/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.md new file mode 100644 index 000000000..ce598c9af --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_haystack.md @@ -0,0 +1,256 @@ +--- +id: integrate_with_haystack.md +summary: >- + يوضح هذا الدليل كيفية بناء نظام التوليد المعزز للاسترجاع (RAG) باستخدام + Haystack و Milvus. +title: التوليد المعزز للاسترجاع (RAG) باستخدام ميلفوس وهايستاك +--- +

التوليد المعزز للاسترجاع (RAG) باستخدام ميلفوس وهايستاك

Open In Colab +GitHub Repository

+

يوضح هذا الدليل كيفية بناء نظام الاسترجاع-التوليد المعزز (RAG) باستخدام Haystack وMilvus.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليديًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

هايستاك هو إطار عمل بايثون مفتوح المصدر من شركة ديبست لبناء تطبيقات مخصصة مع نماذج لغوية كبيرة (LLMs). Milvus هي قاعدة البيانات المتجهة مفتوحة المصدر الأكثر تقدمًا في العالم، وهي مصممة لتشغيل تطبيقات البحث عن التشابه المضمنة وتطبيقات الذكاء الاصطناعي.

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

سنستخدم النماذج من OpenAI. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

إعداد البيانات

نحن نستخدم محتوى على الإنترنت عن ليوناردو دافنشي كمخزن للمعرفة الخاصة لخط أنابيب RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيله وحفظه كملف نصي محلي.

+
import os
+import urllib.request
+
+url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
+file_path = "./davinci.txt"
+
+if not os.path.exists(file_path):
+    urllib.request.urlretrieve(url, file_path)
+
+

إنشاء خط أنابيب الفهرسة

قم بإنشاء خط أنابيب فهرسة يقوم بتحويل النص إلى مستندات، وتقسيمها إلى جمل، وتضمينها. ثم يتم كتابة المستندات إلى مخزن مستندات Milvus.

+
from haystack import Pipeline
+from haystack.components.converters import MarkdownToDocument
+from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
+from haystack.components.preprocessors import DocumentSplitter
+from haystack.components.writers import DocumentWriter
+from haystack.utils import Secret
+
+from milvus_haystack import MilvusDocumentStore
+from milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever
+
+
+document_store = MilvusDocumentStore(
+    connection_args={"uri": "./milvus.db"},
+    # connection_args={"uri": "http://localhost:19530"},
+    # connection_args={"uri": YOUR_ZILLIZ_CLOUD_URI, "token": Secret.from_env_var("ZILLIZ_CLOUD_API_KEY")},
+    drop_old=True,
+)
+
+
+

من أجل الاتصال_args:

+
    +
  • إن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+
indexing_pipeline = Pipeline()
+indexing_pipeline.add_component("converter", MarkdownToDocument())
+indexing_pipeline.add_component(
+    "splitter", DocumentSplitter(split_by="sentence", split_length=2)
+)
+indexing_pipeline.add_component("embedder", OpenAIDocumentEmbedder())
+indexing_pipeline.add_component("writer", DocumentWriter(document_store))
+indexing_pipeline.connect("converter", "splitter")
+indexing_pipeline.connect("splitter", "embedder")
+indexing_pipeline.connect("embedder", "writer")
+indexing_pipeline.run({"converter": {"sources": [file_path]}})
+
+print("Number of documents:", document_store.count_documents())
+
+
Converting markdown files to Documents: 100%|█| 1/
+Calculating embeddings: 100%|█| 9/9 [00:05<00:00, 
+E20240516 10:40:32.945937 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
+E20240516 10:40:32.946677 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
+E20240516 10:40:32.946704 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
+E20240516 10:40:32.946725 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
+
+
+Number of documents: 277
+
+

إنشاء خط أنابيب الاسترجاع

قم بإنشاء خط أنابيب الاسترجاع الذي يسترجع المستندات من مخزن مستندات Milvus باستخدام محرك بحث التشابه المتجه.

+
question = 'Where is the painting "Warrior" currently stored?'
+
+retrieval_pipeline = Pipeline()
+retrieval_pipeline.add_component("embedder", OpenAITextEmbedder())
+retrieval_pipeline.add_component(
+    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
+)
+retrieval_pipeline.connect("embedder", "retriever")
+
+retrieval_results = retrieval_pipeline.run({"embedder": {"text": question}})
+
+for doc in retrieval_results["retriever"]["documents"]:
+    print(doc.content)
+    print("-" * 10)
+
+
). The
+composition of this oil-painting seems to have been built up on the
+second cartoon, which he had made some eight years earlier, and which
+was apparently taken to France in 1516 and ultimately lost.
+----------
+
+This "Baptism of Christ," which is now in the Accademia in Florence
+and is in a bad state of preservation, appears to have been a
+comparatively early work by Verrocchio, and to have been painted
+in 1480-1482, when Leonardo would be about thirty years of age.
+
+To about this period belongs the superb drawing of the "Warrior," now
+in the Malcolm Collection in the British Museum.
+----------
+" Although he
+completed the cartoon, the only part of the composition which he
+eventually executed in colour was an incident in the foreground
+which dealt with the "Battle of the Standard." One of the many
+supposed copies of a study of this mural painting now hangs on the
+south-east staircase in the Victoria and Albert Museum.
+----------
+
+

إنشاء خط أنابيب RAG

قم بإنشاء خط أنابيب RAG الذي يجمع بين MilvusEmbeddingRetriever و OpenAIGenerator للإجابة عن السؤال باستخدام المستندات المسترجعة.

+
from haystack.utils import Secret
+from haystack.components.builders import PromptBuilder
+from haystack.components.generators import OpenAIGenerator
+
+prompt_template = """Answer the following query based on the provided context. If the context does
+                     not include an answer, reply with 'I don't know'.\n
+                     Query: {{query}}
+                     Documents:
+                     {% for doc in documents %}
+                        {{ doc.content }}
+                     {% endfor %}
+                     Answer:
+                  """
+
+rag_pipeline = Pipeline()
+rag_pipeline.add_component("text_embedder", OpenAITextEmbedder())
+rag_pipeline.add_component(
+    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
+)
+rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
+rag_pipeline.add_component(
+    "generator",
+    OpenAIGenerator(
+        api_key=Secret.from_token(os.getenv("OPENAI_API_KEY")),
+        generation_kwargs={"temperature": 0},
+    ),
+)
+rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
+rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
+rag_pipeline.connect("prompt_builder", "generator")
+
+results = rag_pipeline.run(
+    {
+        "text_embedder": {"text": question},
+        "prompt_builder": {"query": question},
+    }
+)
+print("RAG answer:", results["generator"]["replies"][0])
+
+
RAG answer: The painting "Warrior" is currently stored in the Malcolm Collection in the British Museum.
+
+

للمزيد من المعلومات حول كيفية استخدام ميلفوس-هاستاك يُرجى الرجوع إلى الدليل التمهيدي لميلفوس-هاستاك.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.json b/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.json new file mode 100644 index 000000000..8d8d09814 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus transformers datasets torch\n","from datasets import load_dataset\n\n\nDATASET = \"squad\" # Name of dataset from HuggingFace Datasets\nINSERT_RATIO = 0.001 # Ratio of example dataset to be inserted\n\ndata = load_dataset(DATASET, split=\"validation\")\n# Generates a fixed subset. To generate a random subset, remove the seed.\ndata = data.train_test_split(test_size=INSERT_RATIO, seed=42)[\"test\"]\n# Clean up the data structure in the dataset.\ndata = data.map(\n lambda val: {\"answer\": val[\"answers\"][\"text\"][0]},\n remove_columns=[\"id\", \"answers\", \"context\"],\n)\n\n# View summary of example data\nprint(data)\n","from transformers import AutoTokenizer, AutoModel\nimport torch\n\nMODEL = (\n \"sentence-transformers/all-MiniLM-L6-v2\" # Name of model from HuggingFace Models\n)\nINFERENCE_BATCH_SIZE = 64 # Batch size of model inference\n\n# Load tokenizer & model from HuggingFace Hub\ntokenizer = AutoTokenizer.from_pretrained(MODEL)\nmodel = AutoModel.from_pretrained(MODEL)\n\n\ndef encode_text(batch):\n # Tokenize sentences\n encoded_input = tokenizer(\n batch[\"question\"], padding=True, truncation=True, return_tensors=\"pt\"\n )\n\n # Compute token embeddings\n with torch.no_grad():\n model_output = model(**encoded_input)\n\n # Perform pooling\n token_embeddings = model_output[0]\n attention_mask = encoded_input[\"attention_mask\"]\n input_mask_expanded = (\n attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n )\n sentence_embeddings = torch.sum(\n token_embeddings * input_mask_expanded, 1\n ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)\n\n # Normalize embeddings\n batch[\"question_embedding\"] = torch.nn.functional.normalize(\n sentence_embeddings, p=2, dim=1\n )\n return batch\n\n\ndata = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)\ndata_list = data.to_list()\n","from pymilvus import MilvusClient\n\n\nMILVUS_URI = \"./huggingface_milvus_test.db\" # Connection URI\nCOLLECTION_NAME = \"huggingface_test\" # Collection name\nDIMENSION = 384 # Embedding dimension depending on model\n\nmilvus_client = MilvusClient(MILVUS_URI)\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n dimension=DIMENSION,\n auto_id=True, # Enable auto id\n enable_dynamic_field=True, # Enable dynamic fields\n vector_field_name=\"question_embedding\", # Map vector field name and embedding column in dataset\n consistency_level=\"Strong\", # To enable search with latest data\n)\n","milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)\n","questions = {\n \"question\": [\n \"What is LGM?\",\n \"When did Massachusetts first mandate that children be educated in schools?\",\n ]\n}\n\n# Generate question embeddings\nquestion_embeddings = [v.tolist() for v in encode_text(questions)[\"question_embedding\"]]\n\n# Search across Milvus\nsearch_results = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=question_embeddings,\n limit=3, # How many search results to output\n output_fields=[\"answer\", \"question\"], # Include these fields in search results\n)\n\n# Print out results\nfor q, res in zip(questions[\"question\"], search_results):\n print(\"Question:\", q)\n for r in res:\n print(\n {\n \"answer\": r[\"entity\"][\"answer\"],\n \"score\": r[\"distance\"],\n \"original question\": r[\"entity\"][\"question\"],\n }\n )\n print(\"\\n\")\n"],"headingContent":"Question Answering Using Milvus and Hugging Face","anchorList":[{"label":"الإجابة عن الأسئلة باستخدام ميلفوس ومعانقة الوجه","href":"Question-Answering-Using-Milvus-and-Hugging-Face","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-data","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data","type":2,"isActive":false},{"label":"طرح الأسئلة","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.md b/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.md new file mode 100644 index 000000000..dfee41eeb --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_hugging-face.md @@ -0,0 +1,245 @@ +--- +id: integrate_with_hugging-face.md +summary: >- + يوضح هذا البرنامج التعليمي كيفية بناء نظام للإجابة على الأسئلة باستخدام + Hugging Face كمحمّل بيانات ومولد تضمين لمعالجة البيانات وMilvus كقاعدة بيانات + متجهة للبحث الدلالي. +title: الإجابة عن الأسئلة باستخدام ميلفوس ومعانقة الوجه +--- +

الإجابة عن الأسئلة باستخدام ميلفوس ومعانقة الوجه

Open In Colab +GitHub Repository

+

يعمل نظام الإجابة عن الأسئلة المستند إلى البحث الدلالي من خلال إيجاد السؤال الأكثر تشابهًا من مجموعة بيانات لأزواج الأسئلة والأجوبة لسؤال استعلام معين. وبمجرد تحديد السؤال الأكثر تشابهًا، يتم اعتبار الإجابة المقابلة من مجموعة البيانات كإجابة للاستعلام. يعتمد هذا النهج على مقاييس التشابه الدلالي لتحديد التشابه بين الأسئلة واسترجاع الإجابات ذات الصلة.

+

يوضح هذا البرنامج التعليمي كيفية إنشاء نظام للإجابة على الأسئلة باستخدام Hugging Face كمحمّل بيانات ومولد تضمين لمعالجة البيانات وMilvus كقاعدة بيانات متجهة للبحث الدلالي.

+

قبل أن تبدأ

تحتاج إلى التأكد من تثبيت جميع التبعيات المطلوبة:

+
    +
  • pymilvus: حزمة بايثون تعمل مع خدمة قاعدة بيانات المتجهات التي تعمل بواسطة ميلفوس أو زيليز كلاود.
  • +
  • datasets transformers: حزم عناق الوجه تدير البيانات وتستخدم النماذج.
  • +
  • torch: مكتبة قوية توفر حساب الموتر الفعال وأدوات التعلم العميق.
  • +
+
$ pip install --upgrade pymilvus transformers datasets torch
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

إعداد البيانات

في هذا القسم، سنقوم بتحميل أمثلة على أزواج الأسئلة والأجوبة من مجموعات بيانات عناق الوجه. كعرض توضيحي، نأخذ بيانات جزئية فقط من تقسيم التحقق من صحة SQuAD.

+
from datasets import load_dataset
+
+
+DATASET = "squad"  # Name of dataset from HuggingFace Datasets
+INSERT_RATIO = 0.001  # Ratio of example dataset to be inserted
+
+data = load_dataset(DATASET, split="validation")
+# Generates a fixed subset. To generate a random subset, remove the seed.
+data = data.train_test_split(test_size=INSERT_RATIO, seed=42)["test"]
+# Clean up the data structure in the dataset.
+data = data.map(
+    lambda val: {"answer": val["answers"]["text"][0]},
+    remove_columns=["id", "answers", "context"],
+)
+
+# View summary of example data
+print(data)
+
+
Dataset({
+    features: ['title', 'question', 'answer'],
+    num_rows: 11
+})
+
+

لتوليد تضمينات للأسئلة، يمكنك تحديد نموذج تضمين نصي من نماذج تعانق الوجوه. في هذا البرنامج التعليمي، سوف نستخدم نموذج تضمين جمل صغير كل -MiniLM-L6-v2 كمثال.

+
from transformers import AutoTokenizer, AutoModel
+import torch
+
+MODEL = (
+    "sentence-transformers/all-MiniLM-L6-v2"  # Name of model from HuggingFace Models
+)
+INFERENCE_BATCH_SIZE = 64  # Batch size of model inference
+
+# Load tokenizer & model from HuggingFace Hub
+tokenizer = AutoTokenizer.from_pretrained(MODEL)
+model = AutoModel.from_pretrained(MODEL)
+
+
+def encode_text(batch):
+    # Tokenize sentences
+    encoded_input = tokenizer(
+        batch["question"], padding=True, truncation=True, return_tensors="pt"
+    )
+
+    # Compute token embeddings
+    with torch.no_grad():
+        model_output = model(**encoded_input)
+
+    # Perform pooling
+    token_embeddings = model_output[0]
+    attention_mask = encoded_input["attention_mask"]
+    input_mask_expanded = (
+        attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
+    )
+    sentence_embeddings = torch.sum(
+        token_embeddings * input_mask_expanded, 1
+    ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
+
+    # Normalize embeddings
+    batch["question_embedding"] = torch.nn.functional.normalize(
+        sentence_embeddings, p=2, dim=1
+    )
+    return batch
+
+
+data = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)
+data_list = data.to_list()
+
+

إدراج البيانات

الآن لدينا أزواج الأسئلة والأجوبة جاهزة مع تضمينات الأسئلة. الخطوة التالية هي إدراجها في قاعدة بيانات المتجهات.

+

سنحتاج أولاً إلى الاتصال بخدمة ميلفوس وإنشاء مجموعة ميلفوس.

+
from pymilvus import MilvusClient
+
+
+MILVUS_URI = "./huggingface_milvus_test.db"  # Connection URI
+COLLECTION_NAME = "huggingface_test"  # Collection name
+DIMENSION = 384  # Embedding dimension depending on model
+
+milvus_client = MilvusClient(MILVUS_URI)
+if milvus_client.has_collection(collection_name=COLLECTION_NAME):
+    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
+milvus_client.create_collection(
+    collection_name=COLLECTION_NAME,
+    dimension=DIMENSION,
+    auto_id=True,  # Enable auto id
+    enable_dynamic_field=True,  # Enable dynamic fields
+    vector_field_name="question_embedding",  # Map vector field name and embedding column in dataset
+    consistency_level="Strong",  # To enable search with latest data
+)
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

أدخل جميع البيانات في المجموعة:

+
milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)
+
+
{'insert_count': 11,
+ 'ids': [450072488481390592, 450072488481390593, 450072488481390594, 450072488481390595, 450072488481390596, 450072488481390597, 450072488481390598, 450072488481390599, 450072488481390600, 450072488481390601, 450072488481390602],
+ 'cost': 0}
+
+

طرح الأسئلة

بمجرد إدراج جميع البيانات في ميلفوس، يمكننا طرح الأسئلة ومعرفة أقرب الإجابات.

+
questions = {
+    "question": [
+        "What is LGM?",
+        "When did Massachusetts first mandate that children be educated in schools?",
+    ]
+}
+
+# Generate question embeddings
+question_embeddings = [v.tolist() for v in encode_text(questions)["question_embedding"]]
+
+# Search across Milvus
+search_results = milvus_client.search(
+    collection_name=COLLECTION_NAME,
+    data=question_embeddings,
+    limit=3,  # How many search results to output
+    output_fields=["answer", "question"],  # Include these fields in search results
+)
+
+# Print out results
+for q, res in zip(questions["question"], search_results):
+    print("Question:", q)
+    for r in res:
+        print(
+            {
+                "answer": r["entity"]["answer"],
+                "score": r["distance"],
+                "original question": r["entity"]["question"],
+            }
+        )
+    print("\n")
+
+
Question: What is LGM?
+{'answer': 'Last Glacial Maximum', 'score': 0.956273078918457, 'original question': 'What does LGM stands for?'}
+{'answer': 'coordinate the response to the embargo', 'score': 0.2120140939950943, 'original question': 'Why was this short termed organization created?'}
+{'answer': '"Reducibility Among Combinatorial Problems"', 'score': 0.1945795714855194, 'original question': 'What is the paper written by Richard Karp in 1972 that ushered in a new era of understanding between intractability and NP-complete problems?'}
+
+
+Question: When did Massachusetts first mandate that children be educated in schools?
+{'answer': '1852', 'score': 0.9709997177124023, 'original question': 'In what year did Massachusetts first require children to be educated in schools?'}
+{'answer': 'several regional colleges and universities', 'score': 0.34164726734161377, 'original question': 'In 1890, who did the university decide to team up with?'}
+{'answer': '1962', 'score': 0.1931006908416748, 'original question': 'When were stromules discovered?'}
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_jina.json b/localization/v2.5.x/site/ar/integrations/integrate_with_jina.json new file mode 100644 index 000000000..031c53fc7 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_jina.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n$ pip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=1024\n)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information retrieval is the process of finding relevant information from a large collection of data or documents.\"\n\nqvecs = ef.encode_queries([query]) # This method uses `retrieval.query` as the task\ndvecs = ef.encode_documents([doc]) # This method uses `retrieval.passage` as the task\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-de\", jina_api_key)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden.\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-code\", jina_api_key)\n\n# Case1: Enhanced Code Navigation\n# query: text description of the functionality\n# document: relevant code snippet\n\nquery = \"function to calculate average in Python.\"\ndoc = \"\"\"\ndef calculate_average(numbers):\n total = sum(numbers)\n count = len(numbers)\n return total / count\n\"\"\"\n\n# Case2: Streamlined Code Review\n# query: text description of the programming concept\n# document: relevante code snippet or PR\n\nquery = \"pull quest related to Collection\"\ndoc = \"fix:[restful v2] parameters of create collection ...\"\n\n# Case3: Automatic Documentation Assistance\n# query: code snippet you need explanation\n# document: relevante document or DocsString\n\nquery = \"What is Collection in Milvus\"\ndoc = \"\"\"\nIn Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.\nMilvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.\n\"\"\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\nfrom pymilvus import MilvusClient\n\njina_api_key = \"\"\nDIMENSION = 1024 # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. \nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=DIMENSION,\n)\n\n\ndoc = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\ndvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task\n\ndata = [\n {\"id\": i, \"vector\": dvecs[i], \"text\": doc[i], \"subject\": \"history\"}\n for i in range(len(dvecs))\n]\n\nmilvus_client = MilvusClient(\"./milvus_jina_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\nres = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)\n\nprint(res[\"insert_count\"])\n","queries = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\nqvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=[qvecs[0]], # query vectors\n limit=3, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)[0]\n\nfor result in res:\n print(result)\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_api_key = \"\"\n\nrf = JinaRerankFunction(\"jina-reranker-v1-base-en\", jina_api_key)\n\nquery = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\nrf(query, documents)\n"],"headingContent":"Integrate Milvus with Jina AI","anchorList":[{"label":"دمج ميلفوس مع جينا للذكاء الاصطناعي","href":"Integrate-Milvus-with-Jina-AI","type":1,"isActive":false},{"label":"من هي جينا للذكاء الاصطناعي","href":"Who-is-Jina-AI","type":2,"isActive":false},{"label":"تضمين ميلفوس وجينا للذكاء الاصطناعي","href":"Milvus-and-Jina-AIs-Embedding","type":2,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false},{"label":"التضمين للأغراض العامة","href":"General-Purpose-Embedding","type":2,"isActive":false},{"label":"التضمينات ثنائية اللغة","href":"Bilingual-Embeddings","type":2,"isActive":false},{"label":"تضمين الرموز","href":"Code-Embeddings","type":2,"isActive":false},{"label":"البحث الدلالي مع جينا وميلفوس","href":"Semantic-Search-with-Jina--Milvus","type":2,"isActive":false},{"label":"إعادة تصنيف جينا","href":"Jina-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_jina.md b/localization/v2.5.x/site/ar/integrations/integrate_with_jina.md new file mode 100644 index 000000000..6e132cc7a --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_jina.md @@ -0,0 +1,307 @@ +--- +id: integrate_with_jina.md +summary: >- + يوضّح هذا الدليل كيفية استخدام تضمينات جينا وميلفوس لإجراء مهام البحث عن + التشابه واسترجاعه. +title: دمج ميلفوس مع جينا +--- +

دمج ميلفوس مع جينا للذكاء الاصطناعي

Open In Colab +GitHub Repository

+

يوضح هذا الدليل كيفية استخدام تضمينات جينا للذكاء الاصطناعي وميلفوس لإجراء مهام البحث عن التشابه واسترجاعه.

+

من هي جينا للذكاء الاصطناعي

جينا للذكاء الاصطناعي، التي تأسست في عام 2020 في برلين، هي شركة رائدة في مجال الذكاء الاصطناعي تركز على إحداث ثورة في مستقبل الذكاء الاصطناعي من خلال مؤسسة البحث الخاصة بها. تهدف شركة Jina AI، المتخصصة في الذكاء الاصطناعي متعدد الوسائط، إلى تمكين الشركات والمطورين من تسخير قوة البيانات متعددة الوسائط لخلق القيمة وتوفير التكاليف من خلال مجموعة متكاملة من المكونات، بما في ذلك التضمينات، وإعادة التضمين، والعمليات الفورية، والبنية التحتية الأساسية. تتميز تضمينات Jina AI المتطورة بأداء من الدرجة الأولى، وتتميز بنموذج بطول 8192 رمزًا رمزيًا مثاليًا لتمثيل البيانات الشاملة. ومن خلال تقديم الدعم متعدد اللغات والتكامل السلس مع منصات رائدة مثل OpenAI، تسهل هذه التضمينات التطبيقات متعددة اللغات.

+

تضمين ميلفوس وجينا للذكاء الاصطناعي

من أجل تخزين هذه التضمينات والبحث فيها بكفاءة من أجل السرعة والتوسع، يلزم وجود بنية تحتية محددة مصممة لهذا الغرض. Milvus عبارة عن قاعدة بيانات متجهية متقدمة مفتوحة المصدر معروفة على نطاق واسع وقادرة على التعامل مع البيانات المتجهة واسعة النطاق. تتيح Milvus إمكانية البحث السريع والدقيق عن المتجهات (التضمينات) وفقًا للكثير من المقاييس. تسمح قابليته للتوسع بالتعامل السلس مع أحجام هائلة من بيانات الصور، مما يضمن عمليات بحث عالية الأداء حتى مع نمو مجموعات البيانات.

+

أمثلة

تم دمج تضمينات جينا في مكتبة نماذج PyMilvus. والآن، سنقوم بعرض أمثلة برمجية لتوضيح كيفية استخدام تضمينات جينا في العمل.

+

قبل أن نبدأ، نحتاج إلى تثبيت مكتبة النماذج لـ PyMilvus.

+
$ pip install -U pymilvus
+$ pip install "pymilvus[model]"
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

التضمين للأغراض العامة

يتفوق نموذج التضمين الأساسي في Jina AI في فهم النص التفصيلي، مما يجعله مثاليًا للبحث الدلالي، وبالتالي تصنيف المحتوى، وبالتالي يدعم تحليل المشاعر المتقدم، وتلخيص النصوص، وأنظمة التوصيات المخصصة.

+
from pymilvus.model.dense import JinaEmbeddingFunction
+
+jina_api_key = "<YOUR_JINA_API_KEY>"
+ef = JinaEmbeddingFunction(
+    "jina-embeddings-v3", 
+    jina_api_key,
+    task="retrieval.passage",
+    dimensions=1024
+)
+
+query = "what is information retrieval?"
+doc = "Information retrieval is the process of finding relevant information from a large collection of data or documents."
+
+qvecs = ef.encode_queries([query])  # This method uses `retrieval.query` as the task
+dvecs = ef.encode_documents([doc])  # This method uses `retrieval.passage` as the task
+
+

التضمينات ثنائية اللغة

تعمل نماذج Jina AI ثنائية اللغة على تعزيز المنصات متعددة اللغات والدعم العالمي واكتشاف المحتوى متعدد اللغات. وهي مصممة للترجمة بين الألمانية-الإنجليزية والصينية-الإنجليزية، وتعزز التفاهم بين المجموعات اللغوية المتنوعة، مما يسهل التفاعلات بين اللغات.

+
from pymilvus.model.dense import JinaEmbeddingFunction
+
+jina_api_key = "<YOUR_JINA_API_KEY>"
+ef = JinaEmbeddingFunction("jina-embeddings-v2-base-de", jina_api_key)
+
+query = "what is information retrieval?"
+doc = "Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden."
+
+qvecs = ef.encode_queries([query])
+dvecs = ef.encode_documents([doc])
+
+

تضمين الرموز

يوفر نموذج تضمين الكود الخاص بـ Jina AI إمكانية البحث من خلال الكود والوثائق. وهو يدعم اللغة الإنجليزية و30 لغة برمجة شائعة يمكن استخدامها لتحسين التنقل في التعليمات البرمجية ومراجعة التعليمات البرمجية بشكل مبسط والمساعدة الآلية في التوثيق.

+
from pymilvus.model.dense import JinaEmbeddingFunction
+
+jina_api_key = "<YOUR_JINA_API_KEY>"
+ef = JinaEmbeddingFunction("jina-embeddings-v2-base-code", jina_api_key)
+
+# Case1: Enhanced Code Navigation
+# query: text description of the functionality
+# document: relevant code snippet
+
+query = "function to calculate average in Python."
+doc = """
+def calculate_average(numbers):
+    total = sum(numbers)
+    count = len(numbers)
+    return total / count
+"""
+
+# Case2: Streamlined Code Review
+# query: text description of the programming concept
+# document: relevante code snippet or PR
+
+query = "pull quest related to Collection"
+doc = "fix:[restful v2] parameters of create collection ..."
+
+# Case3: Automatic Documentation Assistance
+# query: code snippet you need explanation
+# document: relevante document or DocsString
+
+query = "What is Collection in Milvus"
+doc = """
+In Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.
+Milvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.
+"""
+
+qvecs = ef.encode_queries([query])
+dvecs = ef.encode_documents([doc])
+
+

البحث الدلالي مع جينا وميلفوس

مع وظيفة التضمين المتجه القوية، يمكننا الجمع بين التضمينات المسترجعة باستخدام نماذج Jina AI مع قاعدة بيانات Milvus Lite المتجهة لإجراء بحث دلالي.

+
from pymilvus.model.dense import JinaEmbeddingFunction
+from pymilvus import MilvusClient
+
+jina_api_key = "<YOUR_JINA_API_KEY>"
+DIMENSION = 1024  # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. 
+ef = JinaEmbeddingFunction(
+    "jina-embeddings-v3", 
+    jina_api_key,
+    task="retrieval.passage",
+    dimensions=DIMENSION,
+)
+
+
+doc = [
+    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
+    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
+    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
+    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
+]
+
+dvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task
+
+data = [
+    {"id": i, "vector": dvecs[i], "text": doc[i], "subject": "history"}
+    for i in range(len(dvecs))
+]
+
+milvus_client = MilvusClient("./milvus_jina_demo.db")
+COLLECTION_NAME = "demo_collection"  # Milvus collection name
+if milvus_client.has_collection(collection_name=COLLECTION_NAME):
+    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
+milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
+
+res = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)
+
+print(res["insert_count"])
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

مع وجود جميع البيانات في قاعدة بيانات Milvus vector، يمكننا الآن إجراء بحث دلالي من خلال إنشاء تضمين متجه للاستعلام وإجراء بحث متجه.

+
queries = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
+qvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task
+
+res = milvus_client.search(
+    collection_name=COLLECTION_NAME,  # target collection
+    data=[qvecs[0]],  # query vectors
+    limit=3,  # number of returned entities
+    output_fields=["text", "subject"],  # specifies fields to be returned
+)[0]
+
+for result in res:
+    print(result)
+
+
{'id': 1, 'distance': 0.8802614808082581, 'entity': {'text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", 'subject': 'history'}}
+
+

إعادة تصنيف جينا

يوفر Jina Ai أيضًا أداة إعادة التصنيف لتعزيز جودة الاسترجاع بعد البحث باستخدام التضمينات.

+
from pymilvus.model.reranker import JinaRerankFunction
+
+jina_api_key = "<YOUR_JINA_API_KEY>"
+
+rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)
+
+query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
+
+documents = [
+    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
+    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
+    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
+    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
+]
+
+rf(query, documents)
+
+
[RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9370958209037781, index=1),
+ RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.35420963168144226, index=3),
+ RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.3498658835887909, index=0),
+ RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.2728956639766693, index=2)]
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.json b/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.json new file mode 100644 index 000000000..439235791 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade\n","import os\n\n# Get keys for your project from the project settings page\n# https://cloud.langfuse.com\nos.environ[\"LANGFUSE_PUBLIC_KEY\"] = \"\"\nos.environ[\"LANGFUSE_SECRET_KEY\"] = \"\"\nos.environ[\"LANGFUSE_HOST\"] = \"https://cloud.langfuse.com\" # 🇪🇺 EU region\n# os.environ[\"LANGFUSE_HOST\"] = \"https://us.cloud.langfuse.com\" # 🇺🇸 US region\n\n# Your openai key\nos.environ[\"OPENAI_API_KEY\"] = \"\"\n","from llama_index.core import Settings\nfrom llama_index.core.callbacks import CallbackManager\nfrom langfuse.llama_index import LlamaIndexCallbackHandler\n \nlangfuse_callback_handler = LlamaIndexCallbackHandler()\nSettings.callback_manager = CallbackManager([langfuse_callback_handler])\n","from llama_index.core import Document\n\ndoc1 = Document(text=\"\"\"\nMaxwell \"Max\" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.\n\"\"\")\ndoc2 = Document(text=\"\"\"\nThroughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are \"Fleeting Echoes,\" \"Halcyon Dusk,\" and the Academy Award-winning sci-fi epic, \"Event Horizon's Brink.\" His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.\n\"\"\")\n","# Example index construction + LLM query\n\nfrom llama_index.core import VectorStoreIndex\nfrom llama_index.core import StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(\n uri=\"tmp/milvus_demo.db\", dim=1536, overwrite=False\n)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\nindex = VectorStoreIndex.from_documents(\n [doc1,doc2], storage_context=storage_context\n)\n","# Query\nresponse = index.as_query_engine().query(\"What did he do growing up?\")\nprint(response)\n","# Chat\nresponse = index.as_chat_engine().chat(\"What did he do growing up?\")\nprint(response)\n","# As we want to immediately see result in Langfuse, we need to flush the callback handler\nlangfuse_callback_handler.flush()\n"],"headingContent":"Using Langfuse to Trace Queries in RAG","anchorList":[{"label":"استخدام Langfuse لتتبع الاستعلامات في RAG","href":"Using-Langfuse-to-Trace-Queries-in-RAG","type":1,"isActive":false},{"label":"الإعداد","href":"Setup","type":2,"isActive":false},{"label":"الفهرس باستخدام ميلفوس لايت","href":"Index-using-Milvus-Lite","type":2,"isActive":false},{"label":"استعلام","href":"Query","type":2,"isActive":false},{"label":"استكشاف الآثار في لانجفوس","href":"Explore-traces-in-Langfuse","type":2,"isActive":false},{"label":"هل أنت مهتم بالمزيد من الميزات المتقدمة؟","href":"Interested-in-more-advanced-features","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.md b/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.md new file mode 100644 index 000000000..4b4b52887 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_langfuse.md @@ -0,0 +1,179 @@ +--- +id: integrate_with_langfuse.md +summary: >- + هذا كتاب طبخ بسيط يوضح كيفية استخدام تكامل LlamaIndex Langfuse. يستخدم ميلفوس + لايت لتخزين المستندات والاستعلام. +title: استخدام Langfuse لتقييم جودة RAG +--- +

استخدام Langfuse لتتبع الاستعلامات في RAG

+Open In Colab +

+

هذا كتاب طهي بسيط يوضح كيفية استخدام Langfuse لتتبع استعلاماتك في RAG. يتم تنفيذ خط أنابيب RAG باستخدام LlamaIndex وMilvus Lite لتخزين واسترجاع المستندات.

+

في هذه البداية السريعة، سنوضح لك كيفية إعداد تطبيق LlamaIndex باستخدام Milvus Lite كمخزن متجه. كما سنوضح لك أيضًا كيفية استخدام تكامل Langfuse LlamaIndex لتتبع تطبيقك.

+

Langfuse عبارة عن منصة هندسة LLM مفتوحة المصدر تساعد الفرق على تصحيح أخطاء تطبيقات LLM وتحليلها وتكرارها بشكل تعاوني. جميع ميزات المنصة مدمجة أصلاً لتسريع سير عمل التطوير.

+

Milvus Lite هي نسخة خفيفة الوزن من Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر تدعم تطبيقات الذكاء الاصطناعي مع تضمينات المتجهات والبحث عن التشابه.

+

الإعداد

تأكد من تثبيت كل من llama-index و langfuse.

+
$ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade
+
+

قم بتهيئة التكامل. احصل على مفاتيح واجهة برمجة التطبيقات من إعدادات مشروع Langfuse، واستبدل المفتاح العام_المفتاح السري_المفتاح بقيم مفاتيحك. يستخدم هذا المثال OpenAI للتضمينات وإكمال الدردشة، لذلك تحتاج أيضًا إلى تحديد مفتاح OpenAI الخاص بك في متغير البيئة.

+
import os
+
+# Get keys for your project from the project settings page
+# https://cloud.langfuse.com
+os.environ["LANGFUSE_PUBLIC_KEY"] = ""
+os.environ["LANGFUSE_SECRET_KEY"] = ""
+os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # 🇪🇺 EU region
+# os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # 🇺🇸 US region
+
+# Your openai key
+os.environ["OPENAI_API_KEY"] = ""
+
+
from llama_index.core import Settings
+from llama_index.core.callbacks import CallbackManager
+from langfuse.llama_index import LlamaIndexCallbackHandler
+ 
+langfuse_callback_handler = LlamaIndexCallbackHandler()
+Settings.callback_manager = CallbackManager([langfuse_callback_handler])
+
+

الفهرس باستخدام ميلفوس لايت

from llama_index.core import Document
+
+doc1 = Document(text="""
+Maxwell "Max" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.
+""")
+doc2 = Document(text="""
+Throughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are "Fleeting Echoes," "Halcyon Dusk," and the Academy Award-winning sci-fi epic, "Event Horizon's Brink." His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.
+""")
+
+
# Example index construction + LLM query
+
+from llama_index.core import VectorStoreIndex
+from llama_index.core import StorageContext
+from llama_index.vector_stores.milvus import MilvusVectorStore
+
+
+vector_store = MilvusVectorStore(
+    uri="tmp/milvus_demo.db", dim=1536, overwrite=False
+)
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+
+index = VectorStoreIndex.from_documents(
+    [doc1,doc2], storage_context=storage_context
+)
+
+

استعلام

# Query
+response = index.as_query_engine().query("What did he do growing up?")
+print(response)
+
+
# Chat
+response = index.as_chat_engine().chat("What did he do growing up?")
+print(response)
+
+

استكشاف الآثار في لانجفوس

# As we want to immediately see result in Langfuse, we need to flush the callback handler
+langfuse_callback_handler.flush()
+
+

تم! ✨ سترى آثار فهرسك واستعلامك في مشروع لانجفيوز الخاص بك.

+

أمثلة على الآثار (روابط عامة):

+
    +
  1. استعلام
  2. +
  3. استعلام (دردشة)
  4. +
+

تتبع في لانجفيوز

+

+ + Langfuse Traces + آثار لانجفوس

+

هل أنت مهتم بالمزيد من الميزات المتقدمة؟

راجع مستندات التكامل الكاملة لمعرفة المزيد حول الميزات المتقدمة وكيفية استخدامها:

+
    +
  • قابلية التشغيل البيني مع مجموعة أدوات تطوير البرمجة SDK الخاصة بـ Langfuse Python والتكاملات الأخرى
  • +
  • إضافة بيانات وصفية وسمات مخصصة إلى التتبعات
  • +
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.json b/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.json new file mode 100644 index 000000000..f748399ee --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus>=2.4.2\n","$ pip install llama-index-vector-stores-milvus\n","$ pip install llama-index\n","import openai\n\nopenai.api_key = \"sk-***********\"\n","! mkdir -p 'data/'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'\n","from llama_index.core import SimpleDirectoryReader\n\n# load documents\ndocuments = SimpleDirectoryReader(\n input_files=[\"./data/paul_graham_essay.txt\"]\n).load_data()\n\nprint(\"Document ID:\", documents[0].doc_id)\n","# Create an index over the documents\nfrom llama_index.core import VectorStoreIndex, StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\n","query_engine = index.as_query_engine()\nres = query_engine.query(\"What did the author learn?\")\nprint(res)\n","res = query_engine.query(\"What challenges did the disease pose for the author?\")\nprint(res)\n","from llama_index.core import Document\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(\n [Document(text=\"The number that is being searched for is ten.\")],\n storage_context,\n)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"Who is the author?\")\nprint(res)\n","del index, vector_store, storage_context, query_engine\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", overwrite=False)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"What is the number?\")\nprint(res)\n","res = query_engine.query(\"Who is the author?\")\nprint(res)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Load all the two documents loaded before\ndocuments_all = SimpleDirectoryReader(\"./data/\").load_data()\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents_all, storage_context)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"uber_2021.pdf\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"paul_graham_essay.txt\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LlamaIndex","anchorList":[{"label":"التوليد المعزّز للاسترجاع (RAG) باستخدام Milvus و LlamaIndex","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LlamaIndex","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-begin","type":2,"isActive":false},{"label":"البدء","href":"Getting-Started","type":2,"isActive":false},{"label":"تصفية البيانات الوصفية","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.md b/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.md new file mode 100644 index 000000000..01859fd93 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_llamaindex.md @@ -0,0 +1,203 @@ +--- +id: integrate_with_llamaindex.md +summary: >- + يوضح هذا الدليل كيفية بناء نظام التوليد المعزز للاسترجاع (RAG) باستخدام + LlamaIndex و Milvus. +title: التوليد المعزّز للاسترجاع (RAG) باستخدام Milvus و LlamaIndex +--- +

التوليد المعزّز للاسترجاع (RAG) باستخدام Milvus و LlamaIndex

Open In Colab +GitHub Repository

+

يوضح هذا الدليل كيفية بناء نظام التوليد المعزز للاسترجاع (RAG) باستخدام LlamaIndex و Milvus.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليديًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

LlamaIndex هو إطار عمل بسيط ومرن للبيانات لربط مصادر البيانات المخصصة بنماذج لغوية كبيرة (LLMs). Milvus هي قاعدة بيانات المتجهات الأكثر تقدمًا في العالم مفتوحة المصدر، وهي مصممة لتشغيل تطبيقات البحث عن التشابه المضمنة وتطبيقات الذكاء الاصطناعي.

+

سنعرض في هذا الدفتر عرضًا توضيحيًا سريعًا لاستخدام MilvusVectorStore.

+

قبل أن تبدأ

تثبيت التبعيات

تتطلب مقتطفات التعليمات البرمجية في هذه الصفحة تبعيات pymilvus و llamaindex. يمكنك تثبيتها باستخدام الأوامر التالية:

+
$ pip install pymilvus>=2.4.2
+
+
$ pip install llama-index-vector-stores-milvus
+
+
$ pip install llama-index
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

إعداد OpenAI

لنبدأ أولاً بإضافة مفتاح Openai api. سيسمح لنا ذلك بالوصول إلى chatgpt.

+
import openai
+
+openai.api_key = "sk-***********"
+
+

إعداد البيانات

يمكنك تنزيل عينة من البيانات باستخدام الأوامر التالية:

+
! mkdir -p 'data/'
+! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'
+! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'
+
+

البدء

توليد بياناتنا

كمثال أول، لنقم بإنشاء مستند من الملف paul_graham_essay.txt. إنه مقال واحد من بول غراهام بعنوان What I Worked On. لتوليد المستندات سنستخدم SimpleDirectoryReader.

+
from llama_index.core import SimpleDirectoryReader
+
+# load documents
+documents = SimpleDirectoryReader(
+    input_files=["./data/paul_graham_essay.txt"]
+).load_data()
+
+print("Document ID:", documents[0].doc_id)
+
+
Document ID: 95f25e4d-f270-4650-87ce-006d69d82033
+
+

إنشاء فهرس عبر البيانات

الآن بعد أن أصبح لدينا مستند، يمكننا إنشاء فهرس وإدراج المستند.

+
+

يرجى ملاحظة أن ميلفوس لايت يتطلب pymilvus>=2.4.2.

+
+
# Create an index over the documents
+from llama_index.core import VectorStoreIndex, StorageContext
+from llama_index.vector_stores.milvus import MilvusVectorStore
+
+
+vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
+
+
+

لمعلمات MilvusVectorStore:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

الاستعلام عن البيانات

الآن بعد أن أصبح لدينا مستندنا المخزن في الفهرس، يمكننا طرح أسئلة على الفهرس. سيستخدم الفهرس البيانات المخزنة في نفسه كقاعدة معرفية للدردشة.

+
query_engine = index.as_query_engine()
+res = query_engine.query("What did the author learn?")
+print(res)
+
+
The author learned that philosophy courses in college were boring to him, leading him to switch his focus to studying AI.
+
+
res = query_engine.query("What challenges did the disease pose for the author?")
+print(res)
+
+
The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in her losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
+
+

يُظهر الاختبار التالي أن الكتابة فوقها تزيل البيانات السابقة.

+
from llama_index.core import Document
+
+
+vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+index = VectorStoreIndex.from_documents(
+    [Document(text="The number that is being searched for is ten.")],
+    storage_context,
+)
+query_engine = index.as_query_engine()
+res = query_engine.query("Who is the author?")
+print(res)
+
+
The author is the individual who created the context information.
+
+

يُظهر الاختبار التالي إضافة بيانات إضافية إلى فهرس موجود بالفعل.

+
del index, vector_store, storage_context, query_engine
+
+vector_store = MilvusVectorStore(uri="./milvus_demo.db", overwrite=False)
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
+query_engine = index.as_query_engine()
+res = query_engine.query("What is the number?")
+print(res)
+
+
The number is ten.
+
+
res = query_engine.query("Who is the author?")
+print(res)
+
+
Paul Graham
+
+

تصفية البيانات الوصفية

يمكننا توليد نتائج عن طريق تصفية مصادر محددة. يوضح المثال التالي تحميل جميع المستندات من الدليل ثم تصفيتها لاحقًا بناءً على البيانات الوصفية.

+
from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
+
+# Load all the two documents loaded before
+documents_all = SimpleDirectoryReader("./data/").load_data()
+
+vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+index = VectorStoreIndex.from_documents(documents_all, storage_context)
+
+

نريد فقط استرداد المستندات من الملف uber_2021.pdf.

+
filters = MetadataFilters(
+    filters=[ExactMatchFilter(key="file_name", value="uber_2021.pdf")]
+)
+query_engine = index.as_query_engine(filters=filters)
+res = query_engine.query("What challenges did the disease pose for the author?")
+
+print(res)
+
+
The disease posed challenges related to the adverse impact on the business and operations, including reduced demand for Mobility offerings globally, affecting travel behavior and demand. Additionally, the pandemic led to driver supply constraints, impacted by concerns regarding COVID-19, with uncertainties about when supply levels would return to normal. The rise of the Omicron variant further affected travel, resulting in advisories and restrictions that could adversely impact both driver supply and consumer demand for Mobility offerings.
+
+

نحصل على نتيجة مختلفة هذه المرة عند الاسترداد من الملف paul_graham_essay.txt.

+
filters = MetadataFilters(
+    filters=[ExactMatchFilter(key="file_name", value="paul_graham_essay.txt")]
+)
+query_engine = index.as_query_engine(filters=filters)
+res = query_engine.query("What challenges did the disease pose for the author?")
+
+print(res)
+
+
The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in his mother losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.json b/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.json new file mode 100644 index 000000000..2f954979d --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.json @@ -0,0 +1 @@ +{"codeList":["$ pip install 'pymemgpt[milvus]'\n","$ memgpt configure\n","...\n? Select storage backend for archival data: milvus\n? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db\n","# we're saving the file as \"memgpt_research_paper.pdf\"\n$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf\n","$ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf\n","Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00, 3.94file/s]\nLoaded 74 passages and 13 documents from memgpt_research_paper\n","# reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona\n$ memgpt run --persona memgpt_doc\n","? Would you like to select an existing agent? No\n\n🧬 Creating new agent...\n-> 🤖 Using persona profile: 'sam_pov'\n-> 🧑 Using human profile: 'basic'\n🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)\n\nHit enter to begin (will request first MemGPT message)\n\n💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.\n🤖 Greetings Chad! I'm MemGPT. How may I assist you today?\n\n> Enter your message: /attach\n? Select data source memgpt_research_paper\n100%|███████████████████████████████████| 1/1 [00:00<00:00, 4.81it/s]\n","> Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?\n\n💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive\nunderstanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.\n⚡🧠 [function] searching memory with archival_memory_search\n💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within\nthe LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.\n🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern \nLarge Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision \nof extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context \nbaselines in deep memory retrieval and it's able to analyze large documents with precision.\n\n"],"headingContent":"MemGPT with Milvus Integration","anchorList":[{"label":"MemGPT مع تكامل Milvus","href":"MemGPT-with-Milvus-Integration","type":1,"isActive":false},{"label":"التكوين","href":"Configuration","type":2,"isActive":false},{"label":"إنشاء مصدر بيانات خارجي","href":"Creating-an-external-data-source","type":2,"isActive":false},{"label":"إرفاق مصدر البيانات بعامل MemGPT","href":"Attaching-the-data-source-to-a-MemGPT-agent","type":2,"isActive":false},{"label":"اختبار روبوت الدردشة الآلي الجديد","href":"Testing-out-our-new-chatbot","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.md b/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.md new file mode 100644 index 000000000..52a0fbeee --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_memgpt.md @@ -0,0 +1,144 @@ +--- +id: integrate_with_memgpt.md +summary: >- + تجعل MemGPT من السهل بناء ونشر وكلاء LLM ذوي الحالة. مع تكامل Milvus، يمكنك + إنشاء وكلاء مع اتصالات بمصادر بيانات خارجية (RAG). +title: MemGPT مع تكامل Milvus +--- +

MemGPT مع تكامل Milvus

تجعلMemGPT من السهل بناء ونشر وكلاء LLM ذوي الحالة. مع تكامل Milvus، يمكنك إنشاء وكلاء مع اتصالات بمصادر بيانات خارجية (RAG).

+

في هذا المثال، سنستخدم في هذا المثال MemGPT للدردشة مع مصدر بيانات مخصص مخزّن في Milvus.

+

التكوين

لتشغيل MemGPT، يجب التأكد من أن إصدار Python >= 3.10.

+

لتمكين الواجهة الخلفية لـ Milvus، تأكد من تثبيت التبعيات المطلوبة مع:

+
$ pip install 'pymemgpt[milvus]'
+
+

يمكنك تكوين اتصال ميلفوس عبر الأمر

+
$ memgpt configure
+
+
...
+? Select storage backend for archival data: milvus
+? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db
+
+

ما عليك سوى تعيين URI إلى مسار الملف المحلي، على سبيل المثال ~/.memgpt/milvus.db ، والذي سيقوم تلقائيًا باستدعاء مثيل خدمة Milvus المحلي من خلال Milvus Lite.

+

إذا كان لديك نطاق كبير من البيانات مثل أكثر من مليون مستند، نوصي بإعداد خادم Milvus أكثر أداءً على docker أو kubenetes. وفي هذه الحالة، يجب أن يكون URI الخاص بك هو URI الخادم، على سبيل المثال http://localhost:19530.

+

إنشاء مصدر بيانات خارجي

لتغذية البيانات الخارجية في روبوت الدردشة MemGPT، نحتاج أولاً إلى إنشاء مصدر بيانات.

+

لتنزيل ورقة بحث MemGPT سنستخدم curl (يمكنك أيضًا تنزيل ملف PDF من متصفحك):

+
# we're saving the file as "memgpt_research_paper.pdf"
+$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf
+
+

الآن بعد أن قمنا بتنزيل الورقة، يمكننا إنشاء مصدر بيانات MemGPT باستخدام memgpt load:

+
$ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf
+
+
Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  3.94file/s]
+Loaded 74 passages and 13 documents from memgpt_research_paper
+
+

إرفاق مصدر البيانات بعامل MemGPT

الآن بعد أن أنشأنا مصدر البيانات هذا، يمكننا إرفاقه بروبوت دردشة MemGPT في أي وقت.

+

لنقم بإنشاء روبوت دردشة آلي جديد باستخدام الشخصية memgpt_doc (ولكن يمكنك استخدام أي شخصية تريدها):

+
# reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona
+$ memgpt run --persona memgpt_doc
+
+

بمجرد أن ندردش مع الوكيل، يمكننا "إرفاق" مصدر البيانات بذاكرة الوكيل الأرشيفية:

+
? Would you like to select an existing agent? No
+
+🧬 Creating new agent...
+->  🤖 Using persona profile: 'sam_pov'
+->  🧑 Using human profile: 'basic'
+🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)
+
+Hit enter to begin (will request first MemGPT message)
+
+💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.
+🤖 Greetings Chad! I'm MemGPT. How may I assist you today?
+
+> Enter your message: /attach
+? Select data source memgpt_research_paper
+100%|███████████████████████████████████| 1/1 [00:00<00:00,  4.81it/s]
+
+

اختبار روبوت الدردشة الآلي الجديد

الآن بعد أن تم تحميل البيانات في ذاكرة روبوت الدردشة الآلية، يمكننا البدء في طرح الأسئلة حولها:

+
> Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?
+
+💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive
+understanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.
+⚡🧠 [function] searching memory with archival_memory_search
+💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within
+the LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.
+🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern 
+Large Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision 
+of extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context 
+baselines in deep memory retrieval and it's able to analyze large documents with precision.
+
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_openai.json b/localization/v2.5.x/site/ar/integrations/integrate_with_openai.json new file mode 100644 index 000000000..c57dc0403 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade openai pymilvus\n","from openai import OpenAI\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"text-embedding-3-small\" # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models\nDIMENSION = 1536 # Dimension of vector embedding\n\n# Connect to OpenAI with API Key.\nopenai_client = OpenAI(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data\n]\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_openai_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_openai_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data\n]\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n","[\n {\n \"id\": 0,\n \"distance\": -0.772376537322998,\n \"entity\": {\n \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"subject\": \"history\",\n },\n },\n {\n \"id\": 1,\n \"distance\": -0.58596271276474,\n \"entity\": {\n \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"subject\": \"history\",\n },\n },\n]\n"],"headingContent":"Semantic Search with Milvus and OpenAI","anchorList":[{"label":"البحث الدلالي باستخدام Milvus و OpenAI","href":"Semantic-Search-with-Milvus-and-OpenAI","type":1,"isActive":false},{"label":"البدء","href":"Getting-started","type":2,"isActive":false},{"label":"البحث في عناوين الكتب باستخدام OpenAI & Milvus","href":"Searching-book-titles-with-OpenAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_openai.md b/localization/v2.5.x/site/ar/integrations/integrate_with_openai.md new file mode 100644 index 000000000..a14ec4418 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_openai.md @@ -0,0 +1,157 @@ +--- +id: integrate_with_openai.md +title: البحث الدلالي باستخدام Milvus و OpenAI +summary: >- + تناقش هذه الصفحة تكامل قاعدة بيانات المتجهات مع واجهة برمجة تطبيقات التضمين + الخاصة ب OpenAI. +--- +

البحث الدلالي باستخدام Milvus و OpenAI

Open In Colab +GitHub Repository

+

يعرض هذا الدليل كيف يمكن استخدام واجهة برمجة تطبيقات التضمين OpenAI مع قاعدة بيانات Milvus المتجهة لإجراء بحث دلالي على النص.

+

البدء

قبل أن تبدأ، تأكد من أن لديك مفتاح OpenAI API جاهزًا، أو يمكنك الحصول على واحد من موقع OpenAI.

+

البيانات المستخدمة في هذا المثال هي عناوين الكتب. يمكنك تنزيل مجموعة البيانات من هنا ووضعها في نفس الدليل حيث تقوم بتشغيل الشيفرة التالية.

+

أولاً، قم بتثبيت الحزمة الخاصة بـ Milvus و OpenAI:

+
pip install --upgrade openai pymilvus
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

بهذا، نكون جاهزين لإنشاء التضمينات واستخدام قاعدة بيانات المتجهات لإجراء بحث دلالي.

+

البحث في عناوين الكتب باستخدام OpenAI & Milvus

في المثال التالي، نقوم بتحميل بيانات عناوين الكتب من ملف CSV الذي تم تنزيله، ونستخدم نموذج تضمين OpenAI لتوليد تمثيلات متجهة، ونخزنها في قاعدة بيانات Milvus المتجهة للبحث الدلالي.

+
from openai import OpenAI
+from pymilvus import MilvusClient
+
+MODEL_NAME = "text-embedding-3-small"  # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models
+DIMENSION = 1536  # Dimension of vector embedding
+
+# Connect to OpenAI with API Key.
+openai_client = OpenAI(api_key="<YOUR_OPENAI_API_KEY>")
+
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+vectors = [
+    vec.embedding
+    for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data
+]
+
+# Prepare data to be stored in Milvus vector database.
+# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
+data = [
+    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
+    for i in range(len(docs))
+]
+
+
+# Connect to Milvus, all data is stored in a local file named "milvus_openai_demo.db"
+# in current directory. You can also connect to a remote Milvus server following this
+# instruction: https://milvus.io/docs/install_standalone-docker.md.
+milvus_client = MilvusClient(uri="milvus_openai_demo.db")
+COLLECTION_NAME = "demo_collection"  # Milvus collection name
+# Create a collection to store the vectors and text.
+if milvus_client.has_collection(collection_name=COLLECTION_NAME):
+    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
+milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
+
+# Insert all data into Milvus vector database.
+res = milvus_client.insert(collection_name="demo_collection", data=data)
+
+print(res["insert_count"])
+
+
+

بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

مع وجود جميع البيانات في قاعدة بيانات Milvus vector، يمكننا الآن إجراء بحث دلالي من خلال إنشاء تضمين متجه للاستعلام وإجراء بحث متجه.

+
queries = ["When was artificial intelligence founded?"]
+
+query_vectors = [
+    vec.embedding
+    for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data
+]
+
+res = milvus_client.search(
+    collection_name=COLLECTION_NAME,  # target collection
+    data=query_vectors,  # query vectors
+    limit=2,  # number of returned entities
+    output_fields=["text", "subject"],  # specifies fields to be returned
+)
+
+for q in queries:
+    print("Query:", q)
+    for result in res:
+        print(result)
+    print("\n")
+
+

يجب أن ترى ما يلي كمخرجات:

+
[
+    {
+        "id": 0,
+        "distance": -0.772376537322998,
+        "entity": {
+            "text": "Artificial intelligence was founded as an academic discipline in 1956.",
+            "subject": "history",
+        },
+    },
+    {
+        "id": 1,
+        "distance": -0.58596271276474,
+        "entity": {
+            "text": "Alan Turing was the first person to conduct substantial research in AI.",
+            "subject": "history",
+        },
+    },
+]
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.json b/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.json new file mode 100644 index 000000000..0c9dc7dcd --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus torch gdown torchvision tqdm\n","import gdown\nimport zipfile\n\nurl = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'\noutput = './paintings.zip'\ngdown.download(url, output)\n\nwith zipfile.ZipFile(\"./paintings.zip\",\"r\") as zip_ref:\n zip_ref.extractall(\"./paintings\")\n","# Milvus Setup Arguments\nCOLLECTION_NAME = 'image_search' # Collection name\nDIMENSION = 2048 # Embedding vector size in this example\nMILVUS_HOST = \"localhost\"\nMILVUS_PORT = \"19530\"\n\n# Inference Arguments\nBATCH_SIZE = 128\nTOP_K = 3\n","from pymilvus import connections\n\n# Connect to the instance\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n","from pymilvus import utility\n\n# Remove any previous collections with the same name\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n","from pymilvus import FieldSchema, CollectionSchema, DataType, Collection\n\n# Create collection which includes the id, filepath of the image, and image embedding\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200), # VARCHARS need a maximum length, so for this example they are set to 200 characters\n FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n","# Create an AutoIndex index for collection\nindex_params = {\n'metric_type':'L2',\n'index_type':\"IVF_FLAT\",\n'params':{'nlist': 16384}\n}\ncollection.create_index(field_name=\"image_embedding\", index_params=index_params)\ncollection.load()\n","import glob\n\n# Get the filepaths of the images\npaths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)\nlen(paths)\n","import torch\n\n# Load the embedding model with the last layer removed\nmodel = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\nmodel = torch.nn.Sequential(*(list(model.children())[:-1]))\nmodel.eval()\n","from torchvision import transforms\n\n# Preprocessing for images\npreprocess = transforms.Compose([\n transforms.Resize(256),\n transforms.CenterCrop(224),\n transforms.ToTensor(),\n transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n","from PIL import Image\nfrom tqdm import tqdm\n\n# Embed function that embeds the batch and inserts it\ndef embed(data):\n with torch.no_grad():\n output = model(torch.stack(data[0])).squeeze()\n collection.insert([data[1], output.tolist()])\n\ndata_batch = [[],[]]\n\n# Read the images into batches for embedding and insertion\nfor path in tqdm(paths):\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n if len(data_batch[0]) % BATCH_SIZE == 0:\n embed(data_batch)\n data_batch = [[],[]]\n\n# Embed and insert the remainder\nif len(data_batch[0]) != 0:\n embed(data_batch)\n\n# Call a flush to index any unsealed segments.\ncollection.flush()\n","import glob\n\n# Get the filepaths of the search images\nsearch_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)\nlen(search_paths)\n","import time\nfrom matplotlib import pyplot as plt\n\n# Embed the search images\ndef embed(data):\n with torch.no_grad():\n ret = model(torch.stack(data))\n # If more than one image, use squeeze\n if len(ret) > 1:\n return ret.squeeze().tolist()\n # Squeeze would remove batch for single image, so using flatten\n else:\n return torch.flatten(ret, start_dim=1).tolist()\n\ndata_batch = [[],[]]\n\nfor path in search_paths:\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n\nembeds = embed(data_batch[0])\nstart = time.time()\nres = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])\nfinish = time.time()\n","# Show the image results\nf, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)\n\nfor hits_i, hits in enumerate(res):\n axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))\n axarr[hits_i][0].set_axis_off()\n axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))\n for hit_i, hit in enumerate(hits):\n axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))\n axarr[hits_i][hit_i + 1].set_axis_off()\n axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))\n\n# Save the search result in a separate image file alongside your script.\nplt.savefig('search_result.png')\n"],"headingContent":"Image Search with PyTorch and Milvus","anchorList":[{"label":"البحث عن الصور باستخدام PyTorch و Milvus","href":"Image-Search-with-PyTorch-and-Milvus","type":1,"isActive":false},{"label":"تثبيت المتطلبات","href":"Installing-the-requirements","type":2,"isActive":false},{"label":"الحصول على البيانات","href":"Grabbing-the-data","type":2,"isActive":false},{"label":"الوسيطات العامة","href":"Global-Arguments","type":2,"isActive":false},{"label":"إعداد ميلفوس","href":"Setting-up-Milvus","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Inserting-the-data","type":2,"isActive":false},{"label":"إجراء البحث","href":"Performing-the-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.md b/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.md new file mode 100644 index 000000000..39087969c --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_pytorch.md @@ -0,0 +1,297 @@ +--- +id: integrate_with_pytorch.md +summary: توضح هذه الصفحة كيفية إنشاء بحث عن الصور باستخدام PyTorch و Milvus +title: البحث عن الصور باستخدام PyTorch و Milvus +--- +

البحث عن الصور باستخدام PyTorch و Milvus

يقدّم هذا الدليل مثالاً على دمج PyTorch وMilvus لإجراء بحث عن الصور باستخدام التضمينات. PyTorch هو إطار عمل قوي مفتوح المصدر للتعلم العميق يستخدم على نطاق واسع لبناء ونشر نماذج التعلم الآلي. في هذا المثال، سنستفيد في هذا المثال من مكتبة Torchvision ونموذج ResNet50 المدرّب مسبقًا لتوليد متجهات (تضمينات) الميّزات التي تمثّل محتوى الصورة. سيتم تخزين هذه التضمينات في قاعدة بيانات Milvus، وهي قاعدة بيانات متجهات عالية الأداء، لتمكين البحث الفعال عن التشابه. مجموعة البيانات المستخدمة هي مجموعة بيانات مصنف الانطباعيين من Kaggle. من خلال الجمع بين إمكانات التعلّم العميق في PyTorch ووظيفة البحث القابلة للتطوير في Milvus، يوضح هذا المثال كيفية بناء نظام استرجاع صور قوي وفعال.

+

لنبدأ!

+

تثبيت المتطلبات

في هذا المثال، سنستخدم في هذا المثال pymilvus للاتصال لاستخدام Milvus، و torch لتشغيل نموذج التضمين، و torchvision للنموذج الفعلي والمعالجة المسبقة، و gdown لتنزيل مجموعة بيانات المثال و tqdm لتحميل الأشرطة.

+
pip install pymilvus torch gdown torchvision tqdm
+
+

الحصول على البيانات

سنستخدم gdown للاستيلاء على الملف المضغوط من Google Drive ثم فك ضغطه باستخدام مكتبة zipfile المدمجة.

+
import gdown
+import zipfile
+
+url = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'
+output = './paintings.zip'
+gdown.download(url, output)
+
+with zipfile.ZipFile("./paintings.zip","r") as zip_ref:
+    zip_ref.extractall("./paintings")
+
+
+

يبلغ حجم مجموعة البيانات 2.35 جيجابايت، ويعتمد الوقت المستغرق في تنزيلها على حالة الشبكة لديك.

+
+

الوسيطات العامة

هذه بعض الوسيطات العالمية الرئيسية التي سنستخدمها لتسهيل التتبع والتحديث.

+
# Milvus Setup Arguments
+COLLECTION_NAME = 'image_search'  # Collection name
+DIMENSION = 2048  # Embedding vector size in this example
+MILVUS_HOST = "localhost"
+MILVUS_PORT = "19530"
+
+# Inference Arguments
+BATCH_SIZE = 128
+TOP_K = 3
+
+

إعداد ميلفوس

في هذه المرحلة، سنبدأ في إعداد ميلفوس. الخطوات كالتالي:

+
    +
  1. اتصل بمثيل ميلفوس باستخدام URI المقدم.

    +
    from pymilvus import connections
    +
    +# Connect to the instance
    +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
    +
  2. +
  3. إذا كانت المجموعة موجودة بالفعل، فقم بإسقاطها.

    +
    from pymilvus import utility
    +
    +# Remove any previous collections with the same name
    +if utility.has_collection(COLLECTION_NAME):
    +    utility.drop_collection(COLLECTION_NAME)
    +
  4. +
  5. قم بإنشاء المجموعة التي تحتوي على المعرف، ومسار ملف الصورة، والتضمين الخاص بها.

    +
    from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
    +
    +# Create collection which includes the id, filepath of the image, and image embedding
    +fields = [
    +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200),  # VARCHARS need a maximum length, so for this example they are set to 200 characters
    +    FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +]
    +schema = CollectionSchema(fields=fields)
    +collection = Collection(name=COLLECTION_NAME, schema=schema)
    +
  6. +
  7. إنشاء فهرس على المجموعة التي تم إنشاؤها حديثًا وتحميلها في الذاكرة.

    +
    # Create an AutoIndex index for collection
    +index_params = {
    +'metric_type':'L2',
    +'index_type':"IVF_FLAT",
    +'params':{'nlist': 16384}
    +}
    +collection.create_index(field_name="image_embedding", index_params=index_params)
    +collection.load()
    +
  8. +
+

بمجرد الانتهاء من هذه الخطوات، تصبح المجموعة جاهزة للإدراج والبحث فيها. ستتم فهرسة أي بيانات مضافة تلقائيًا وستكون متاحة للبحث فيها على الفور. إذا كانت البيانات حديثة جدًا، فقد يكون البحث أبطأ حيث سيتم استخدام البحث بالقوة الغاشمة على البيانات التي لا تزال قيد الفهرسة.

+

إدراج البيانات

في هذا المثال، سنستخدم في هذا المثال نموذج ResNet50 المقدم من torch ومحور النموذج الخاص به. وللحصول على التضمينات، سنقوم بإزالة طبقة التصنيف النهائية، مما يؤدي إلى أن يعطينا النموذج تضمينات ذات 2048 بُعدًا. تستخدم جميع نماذج الرؤية الموجودة على torch نفس المعالجة المسبقة التي قمنا بتضمينها هنا.

+

في هذه الخطوات القليلة التالية سنقوم بـ

+
    +
  1. تحميل البيانات.

    +
    import glob
    +
    +# Get the filepaths of the images
    +paths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)
    +len(paths)
    +
  2. +
  3. المعالجة المسبقة للبيانات على دفعات.

    +
    import torch
    +
    +# Load the embedding model with the last layer removed
    +model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
    +model = torch.nn.Sequential(*(list(model.children())[:-1]))
    +model.eval()
    +
  4. +
  5. تضمين البيانات.

    +
    from torchvision import transforms
    +
    +# Preprocessing for images
    +preprocess = transforms.Compose([
    +    transforms.Resize(256),
    +    transforms.CenterCrop(224),
    +    transforms.ToTensor(),
    +    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    +])
    +
  6. +
  7. إدراج البيانات.

    +
    from PIL import Image
    +from tqdm import tqdm
    +
    +# Embed function that embeds the batch and inserts it
    +def embed(data):
    +    with torch.no_grad():
    +        output = model(torch.stack(data[0])).squeeze()
    +        collection.insert([data[1], output.tolist()])
    +
    +data_batch = [[],[]]
    +
    +# Read the images into batches for embedding and insertion
    +for path in tqdm(paths):
    +    im = Image.open(path).convert('RGB')
    +    data_batch[0].append(preprocess(im))
    +    data_batch[1].append(path)
    +    if len(data_batch[0]) % BATCH_SIZE == 0:
    +        embed(data_batch)
    +        data_batch = [[],[]]
    +
    +# Embed and insert the remainder
    +if len(data_batch[0]) != 0:
    +    embed(data_batch)
    +
    +# Call a flush to index any unsealed segments.
    +collection.flush()
    +
    +
    +
      +
    • تستغرق هذه الخطوة وقتاً طويلاً نسبياً لأن التضمين يستغرق وقتاً طويلاً. خذ رشفة من القهوة واسترخِ.
    • +
    • قد لا يعمل PyTorch بشكل جيد مع Python 3.9 والإصدارات السابقة. ضع في اعتبارك استخدام Python 3.10 والإصدارات الأحدث بدلاً من ذلك.
    • +
    +
    +
  8. +
+

مع إدراج جميع البيانات في ميلفوس، يمكننا البدء في إجراء عمليات البحث. في هذا المثال، سنقوم بالبحث عن مثالين من الصور. نظرًا لأننا نجري بحثًا دفعيًا، يتم تقاسم وقت البحث عبر صور الدُفعة.

+
import glob
+
+# Get the filepaths of the search images
+search_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)
+len(search_paths)
+
+
import time
+from matplotlib import pyplot as plt
+
+# Embed the search images
+def embed(data):
+    with torch.no_grad():
+        ret = model(torch.stack(data))
+        # If more than one image, use squeeze
+        if len(ret) > 1:
+            return ret.squeeze().tolist()
+        # Squeeze would remove batch for single image, so using flatten
+        else:
+            return torch.flatten(ret, start_dim=1).tolist()
+
+data_batch = [[],[]]
+
+for path in search_paths:
+    im = Image.open(path).convert('RGB')
+    data_batch[0].append(preprocess(im))
+    data_batch[1].append(path)
+
+embeds = embed(data_batch[0])
+start = time.time()
+res = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])
+finish = time.time()
+
+
# Show the image results
+f, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)
+
+for hits_i, hits in enumerate(res):
+    axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))
+    axarr[hits_i][0].set_axis_off()
+    axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))
+    for hit_i, hit in enumerate(hits):
+        axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))
+        axarr[hits_i][hit_i + 1].set_axis_off()
+        axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))
+
+# Save the search result in a separate image file alongside your script.
+plt.savefig('search_result.png')
+
+

يجب أن تكون صورة نتيجة البحث مشابهة لما يلي:

+

+ + Image search output + مخرجات البحث عن الصور

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.json b/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.json new file mode 100644 index 000000000..7c66453a3 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas ragas\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-3.5-turbo\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\n self.USER_PROMPT = \"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"foo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import os\nimport urllib.request\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\n# We simply use \"# \" to separate the content in the file, which can roughly separate the content of each main part of the markdown file.\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines) # Load the text data into RAG pipeline\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from ragas import evaluate\nfrom ragas.metrics import (\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n)\n\nresult = evaluate(\n rag_results,\n metrics=[\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n ],\n)\n\nresult\n"],"headingContent":"Evaluation with Ragas","anchorList":[{"label":"التقييم باستخدام راغاس","href":"Evaluation-with-Ragas","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تعريف خط أنابيب RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"تشغيل خط أنابيب RAG والحصول على النتائج","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"التقييم باستخدام راغاس","href":"Evaluation-with-Ragas","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.md b/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.md new file mode 100644 index 000000000..bc8f9f485 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_ragas.md @@ -0,0 +1,359 @@ +--- +id: integrate_with_ragas.md +summary: >- + يوضّح هذا الدليل كيفية استخدام راجاس لتقييم خط أنابيب توليد الاسترجاع المعزز + (RAG) المبني على ميلفوس. +title: التقييم باستخدام راغاس +--- +

التقييم باستخدام راغاس

Open In Colab +GitHub Repository

+

يوضّح هذا الدليل كيفية استخدام راغاس لتقييم خط أنابيب التوليد المعزز للاسترجاع (RAG) المبني على نظام ميلفوس.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليدًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

Ragas هو إطار عمل يساعدك على تقييم خطوط أنابيب RAG الخاصة بك. هناك أدوات وأطر عمل حالية تساعدك على بناء خطوط الأنابيب هذه، لكن تقييمها وقياس أداء خط الأنابيب الخاص بك قد يكون صعبًا. وهنا يأتي دور Ragas (تقييم RAG).

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
$ pip install --upgrade pymilvus openai requests tqdm pandas ragas
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

تعريف خط أنابيب RAG

سنقوم بتعريف فئة RAG التي تستخدم Milvus كمخزن متجه، و OpenAI كـ LLM. تحتوي الفئة على طريقة load ، التي تقوم بتحميل البيانات النصية إلى Milvus، وطريقة retrieve ، التي تسترجع البيانات النصية الأكثر تشابهًا مع السؤال المعطى، وطريقة answer ، التي تجيب على السؤال المعطى باستخدام المعرفة المسترجعة.

+
from typing import List
+from tqdm import tqdm
+from openai import OpenAI
+from pymilvus import MilvusClient
+
+
+class RAG:
+    """
+    RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
+    """
+
+    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
+        self._prepare_openai(openai_client)
+        self._prepare_milvus(milvus_client)
+
+    def _emb_text(self, text: str) -> List[float]:
+        return (
+            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
+            .data[0]
+            .embedding
+        )
+
+    def _prepare_openai(
+        self,
+        openai_client: OpenAI,
+        embedding_model: str = "text-embedding-3-small",
+        llm_model: str = "gpt-3.5-turbo",
+    ):
+        self.openai_client = openai_client
+        self.embedding_model = embedding_model
+        self.llm_model = llm_model
+        self.SYSTEM_PROMPT = """
+Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
+"""
+        self.USER_PROMPT = """
+Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
+<context>
+{context}
+</context>
+<question>
+{question}
+</question>
+"""
+
+    def _prepare_milvus(
+        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
+    ):
+        self.milvus_client = milvus_client
+        self.collection_name = collection_name
+        if self.milvus_client.has_collection(self.collection_name):
+            self.milvus_client.drop_collection(self.collection_name)
+        embedding_dim = len(self._emb_text("foo"))
+        self.milvus_client.create_collection(
+            collection_name=self.collection_name,
+            dimension=embedding_dim,
+            metric_type="IP",  # Inner product distance
+            consistency_level="Strong",  # Strong consistency level
+        )
+
+    def load(self, texts: List[str]):
+        """
+        Load the text data into Milvus.
+        """
+        data = []
+        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
+            data.append({"id": i, "vector": self._emb_text(line), "text": line})
+
+        self.milvus_client.insert(collection_name=self.collection_name, data=data)
+
+    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
+        """
+        Retrieve the most similar text data to the given question.
+        """
+        search_res = self.milvus_client.search(
+            collection_name=self.collection_name,
+            data=[self._emb_text(question)],
+            limit=top_k,
+            search_params={"metric_type": "IP", "params": {}},  # Inner product distance
+            output_fields=["text"],  # Return the text field
+        )
+        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
+        return retrieved_texts[:top_k]
+
+    def answer(
+        self,
+        question: str,
+        retrieval_top_k: int = 3,
+        return_retrieved_text: bool = False,
+    ):
+        """
+        Answer the given question with the retrieved knowledge.
+        """
+        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
+        user_prompt = self.USER_PROMPT.format(
+            context="\n".join(retrieved_texts), question=question
+        )
+        response = self.openai_client.chat.completions.create(
+            model=self.llm_model,
+            messages=[
+                {"role": "system", "content": self.SYSTEM_PROMPT},
+                {"role": "user", "content": user_prompt},
+            ],
+        )
+        if not return_retrieved_text:
+            return response.choices[0].message.content
+        else:
+            return response.choices[0].message.content, retrieved_texts
+
+

لنقم بتهيئة فئة RAG مع عملاء OpenAI و Milvus.

+
openai_client = OpenAI()
+milvus_client = MilvusClient(uri="./milvus_demo.db")
+
+my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • إن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تشغيل خط أنابيب RAG والحصول على النتائج

نحن نستخدم دليل تطوير Milvus ليكون بمثابة المعرفة الخاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

+

قم بتنزيله وتحميله في خط أنابيب RAG.

+
import os
+import urllib.request
+
+url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
+file_path = "./Milvus_DEVELOPMENT.md"
+
+if not os.path.exists(file_path):
+    urllib.request.urlretrieve(url, file_path)
+with open(file_path, "r") as file:
+    file_text = file.read()
+
+# We simply use "# " to separate the content in the file, which can roughly separate the content of each main part of the markdown file.
+text_lines = file_text.split("# ")
+my_rag.load(text_lines)  # Load the text data into RAG pipeline
+
+
Creating embeddings: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 47/47 [00:16<00:00,  2.80it/s]
+
+

دعونا نحدد سؤال استعلام عن محتوى وثائق دليل التطوير. ثم استخدم الطريقة answer للحصول على الإجابة ونصوص السياق المسترجعة.

+
question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
+my_rag.answer(question, return_retrieved_text=True)
+
+
('The hardware requirements specification to build and run Milvus from source code is 8GB of RAM and 50GB of free disk space.',
+ ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
+  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
+  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
+
+

الآن دعونا نعد بعض الأسئلة مع إجابات الحقيقة الأساسية المقابلة لها. نحصل على الإجابات والسياقات من خط أنابيب RAG الخاص بنا.

+
from datasets import Dataset
+import pandas as pd
+
+question_list = [
+    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
+    "What is the programming language used to write Knowhere?",
+    "What should be ensured before running code coverage?",
+]
+ground_truth_list = [
+    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
+    "The programming language used to write Knowhere is C++.",
+    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
+]
+contexts_list = []
+answer_list = []
+for question in tqdm(question_list, desc="Answering questions"):
+    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
+    contexts_list.append(contexts)
+    answer_list.append(answer)
+
+df = pd.DataFrame(
+    {
+        "question": question_list,
+        "contexts": contexts_list,
+        "answer": answer_list,
+        "ground_truth": ground_truth_list,
+    }
+)
+rag_results = Dataset.from_pandas(df)
+df
+
+
Answering questions: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.29s/it]
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
السؤالالسياقاتإجابةالحقيقة_الأرضية
0ما هي مواصفات متطلبات الأجهزة التالية؟[مواصفات متطلبات الأجهزة \n\nالمواصفات التالية...ما هي مواصفات متطلبات الأجهزة الخاصة ببناء أجهزة....إذا كنت ترغب في إنشاء برنامج Milvus وتشغيله من المصدر...
1ما هي لغة البرمجة المستخدمة في كتابة...[CMake & Conan\n\n\nمكتبة خوارزمية لغة البرمجة المستخدمة في...ما هي لغة البرمجة المستخدمة لكتابة خوارزمية ن...ما هي لغة البرمجة المستخدمة لكتابة خوارزمية كنو؟
2ما الذي يجب التأكد منه قبل تشغيل التعليمات البرمجية....[تغطية التعليمات البرمجية \nقبل إرسال الكود البرمجي....قبل تشغيل تغطية التعليمات البرمجية، يجب عليك التأكد...قبل تشغيل تغطية التعليمات البرمجية، يجب عليك التأكد ...
+
+

التقييم باستخدام راجاس

نستخدم Ragas لتقييم أداء نتائج خط أنابيب RAG الخاص بنا.

+

يوفر Ragas مجموعة من المقاييس سهلة الاستخدام. نأخذ Answer relevancy و Faithfulness و Context recall و Context precision كمقاييس لتقييم خط أنابيب RAG الخاص بنا. لمزيد من المعلومات حول المقاييس، يُرجى الرجوع إلى مقاييس Ragas Metrics.

+
from ragas import evaluate
+from ragas.metrics import (
+    answer_relevancy,
+    faithfulness,
+    context_recall,
+    context_precision,
+)
+
+result = evaluate(
+    rag_results,
+    metrics=[
+        answer_relevancy,
+        faithfulness,
+        context_recall,
+        context_precision,
+    ],
+)
+
+result
+
+
Evaluating:   0%|          | 0/12 [00:00<?, ?it/s]
+
+
+
+
+
+{'answer_relevancy': 0.9445, 'faithfulness': 1.0000, 'context_recall': 1.0000, 'context_precision': 1.0000}
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.json b/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.json new file mode 100644 index 000000000..38a6c2a8a --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus sentence-transformers datasets tqdm\n","from datasets import load_dataset\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nfrom tqdm import tqdm\n","embedding_dim = 384\ncollection_name = \"movie_embeddings\"\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","client = MilvusClient(uri=\"./sentence_transformers_example.db\")\n","fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n FieldSchema(name=\"year\", dtype=DataType.INT64),\n FieldSchema(name=\"origin\", dtype=DataType.VARCHAR, max_length=64),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"IP\")\nclient.create_index(collection_name, index_params)\n","model = SentenceTransformer(\"all-MiniLM-L12-v2\")\n","for batch in tqdm(ds.batch(batch_size=512)):\n embeddings = model.encode(batch[\"PlotSummary\"])\n data = [\n {\"title\": title, \"embedding\": embedding, \"year\": year, \"origin\": origin}\n for title, embedding, year, origin in zip(\n batch[\"Title\"], embeddings, batch[\"Release Year\"], batch[\"Origin/Ethnicity\"]\n )\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n 'A shark terrorizes an LA beach.',\n 'An archaeologist searches for ancient artifacts while fighting Nazis.',\n 'Teenagers in detention learn about themselves.',\n 'A teenager fakes illness to get off school and have adventures with two friends.',\n 'A young couple with a kid look after a hotel during winter and the husband goes insane.',\n 'Four turtles fight bad guys.'\n ]\n\n# Search the database based on input text\ndef embed_query(data):\n vectors = model.encode(data)\n return [x for x in vectors]\n\n\nquery_vectors = embed_query(queries)\n\nres = client.search(\n collection_name=collection_name,\n data=query_vectors,\n filter='origin == \"American\" and year > 1945 and year < 2000',\n anns_field=\"embedding\",\n limit=3,\n output_fields=[\"title\"],\n)\n\nfor idx, hits in enumerate(res):\n print(\"Query:\", queries[idx])\n print(\"Results:\")\n for hit in hits:\n print(hit[\"entity\"].get(\"title\"), \"(\", round(hit[\"distance\"], 2), \")\")\n print()\n","Query: An archaeologist searches for ancient artifacts while fighting Nazis.\nResults:\nLove Slaves of the Amazons ( 0.4 )\nA Time to Love and a Time to Die ( 0.39 )\nThe Fifth Element ( 0.39 )\n\nQuery: Teenagers in detention learn about themselves.\nResults:\nThe Breakfast Club ( 0.54 )\nUp the Academy ( 0.46 )\nFame ( 0.43 )\n\nQuery: A teenager fakes illness to get off school and have adventures with two friends.\nResults:\nFerris Bueller's Day Off ( 0.48 )\nFever Lake ( 0.47 )\nLosin' It ( 0.39 )\n\nQuery: A young couple with a kid look after a hotel during winter and the husband goes insane.\nResults:\nThe Shining ( 0.48 )\nThe Four Seasons ( 0.42 )\nHighball ( 0.41 )\n\nQuery: Four turtles fight bad guys.\nResults:\nTeenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )\nDevil May Hare ( 0.43 )\nAttack of the Giant Leeches ( 0.42 )\n"],"headingContent":"Movie Search Using Milvus and SentenceTransformers","anchorList":[{"label":"البحث عن الأفلام باستخدام Milvus و SentenceTransformers","href":"Movie-Search-Using-Milvus-and-SentenceTransformers","type":1,"isActive":false},{"label":"المكتبات المطلوبة","href":"Required-Libraries","type":2,"isActive":false},{"label":"تنزيل مجموعة البيانات وفتحها","href":"Downloading-and-Opening-the-Dataset","type":2,"isActive":false},{"label":"الاتصال بقاعدة البيانات","href":"Connecting-to-the-Database","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Inserting-the-Data","type":2,"isActive":false},{"label":"إجراء البحث","href":"Performing-the-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.md b/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.md new file mode 100644 index 000000000..1db705824 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_sentencetransformers.md @@ -0,0 +1,224 @@ +--- +id: integrate_with_sentencetransformers.md +summary: تناقش هذه الصفحة البحث عن الأفلام باستخدام ميلفوس +title: البحث عن الأفلام باستخدام Milvus و SentenceTransformers +--- +

البحث عن الأفلام باستخدام Milvus و SentenceTransformers

في هذا المثال، سنبحث في هذا المثال عن ملخصات حبكة الفيلم باستخدام Milvus ومكتبة SentenceTransformers. مجموعة البيانات التي سنستخدمها هي مؤامرات أفلام ويكيبيديا مع ملخصات مستضافة على HuggingFace.

+

لنبدأ!

+

المكتبات المطلوبة

في هذا المثال، سنستخدم في هذا المثال pymilvus للاتصال لاستخدام ميلفوس، و sentence-transformers لتوليد تضمينات المتجهات، و datasets لتنزيل مجموعة بيانات المثال.

+
pip install pymilvus sentence-transformers datasets tqdm
+
+
from datasets import load_dataset
+from pymilvus import MilvusClient
+from pymilvus import FieldSchema, CollectionSchema, DataType
+from sentence_transformers import SentenceTransformer
+from tqdm import tqdm
+
+

سنحدد بعض المعلمات العامة,

+
embedding_dim = 384
+collection_name = "movie_embeddings"
+
+

تنزيل مجموعة البيانات وفتحها

في سطر واحد، يتيح لنا datasets تنزيل مجموعة بيانات وفتحها. ستقوم المكتبة بتخزين مجموعة البيانات مؤقتًا محليًا واستخدام تلك النسخة في المرة التالية التي يتم تشغيلها فيها. يحتوي كل صف على تفاصيل فيلم يحتوي على مقالة ويكيبيديا مصاحبة له. نستفيد من الأعمدة Title و PlotSummary و Release Year و Origin/Ethnicity.

+
ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
+print(ds)
+
+

الاتصال بقاعدة البيانات

في هذه المرحلة، سنبدأ في إعداد ميلفوس. الخطوات كالتالي:

+
    +
  1. إنشاء قاعدة بيانات ميلفوس لايت في ملف محلي. (استبدل عنوان URI هذا بعنوان الخادم الخاص بـ Milvus Standalone و Milvus Distributed).
  2. +
+
client = MilvusClient(uri="./sentence_transformers_example.db")
+
+
    +
  1. إنشاء مخطط البيانات. هذا يحدد الحقول التي تشكل العنصر بما في ذلك بُعد تضمين المتجه.
  2. +
+
fields = [
+    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
+    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
+    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
+    FieldSchema(name="year", dtype=DataType.INT64),
+    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
+]
+
+schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
+client.create_collection(collection_name=collection_name, schema=schema)
+
+
    +
  1. تحديد خوارزمية فهرسة البحث المتجه. يدعم Milvus Lite نوع الفهرس المسطح، في حين أن Milvus Standalone وMilvus Distributed ينفذان مجموعة متنوعة من الأساليب مثل IVF وHNSW وDiskANN. بالنسبة للنطاق الصغير للبيانات في هذا العرض التوضيحي، يكفي أي نوع فهرس بحث، لذا نستخدم أبسط نوع FLAT هنا.
  2. +
+
index_params = client.prepare_index_params()
+index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
+client.create_index(collection_name, index_params)
+
+

بمجرد الانتهاء من هذه الخطوات، نكون جاهزين لإدراج البيانات في المجموعة وإجراء بحث. ستتم فهرسة أي بيانات مضافة تلقائيًا وستكون متاحة للبحث على الفور. إذا كانت البيانات حديثة جدًا، فقد يكون البحث أبطأ حيث سيتم استخدام البحث بالقوة الغاشمة على البيانات التي لا تزال قيد الفهرسة.

+

إدراج البيانات

في هذا المثال، سنستخدم في هذا المثال نموذج SentenceTransformers miniLM لإنشاء تضمينات لنص المؤامرة. يُرجع هذا النموذج تضمينات ذات 384 بُعدًا.

+
model = SentenceTransformer("all-MiniLM-L12-v2")
+
+

نقوم بتكرار صفوف البيانات، ونقوم بتضمين حقل ملخص الرسم البياني، وإدراج الكيانات في قاعدة بيانات المتجهات. بشكل عام، يجب عليك تنفيذ هذه الخطوة على دفعات من عناصر البيانات لزيادة إنتاجية وحدة المعالجة المركزية أو وحدة معالجة الرسومات لنموذج التضمين، كما نفعل هنا.

+
for batch in tqdm(ds.batch(batch_size=512)):
+    embeddings = model.encode(batch["PlotSummary"])
+    data = [
+        {"title": title, "embedding": embedding, "year": year, "origin": origin}
+        for title, embedding, year, origin in zip(
+            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
+        )
+    ]
+    res = client.insert(collection_name=collection_name, data=data)
+
+
+

تستغرق العملية المذكورة أعلاه وقتًا طويلًا نسبيًا لأن التضمين يستغرق وقتًا. تستغرق هذه الخطوة حوالي دقيقتين باستخدام وحدة المعالجة المركزية على جهاز MacBook Pro 2023 وستكون أسرع بكثير مع وحدات معالجة الرسومات المخصصة. خذ استراحة واستمتع بفنجان قهوة!

+
+

مع إدخال جميع البيانات في Milvus، يمكننا البدء في إجراء عمليات البحث. في هذا المثال، سنقوم بالبحث عن الأفلام بناءً على ملخصات الحبكة من ويكيبيديا. نظرًا لأننا نجري بحثًا دفعيًا، يتم تقاسم وقت البحث عبر عمليات البحث عن الأفلام. (هل يمكنك تخمين الفيلم الذي كنت أفكر في استرجاعه بناءً على نص وصف الاستعلام؟)

+
queries = [
+    'A shark terrorizes an LA beach.',
+    'An archaeologist searches for ancient artifacts while fighting Nazis.',
+    'Teenagers in detention learn about themselves.',
+    'A teenager fakes illness to get off school and have adventures with two friends.',
+    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
+    'Four turtles fight bad guys.'
+    ]
+
+# Search the database based on input text
+def embed_query(data):
+    vectors = model.encode(data)
+    return [x for x in vectors]
+
+
+query_vectors = embed_query(queries)
+
+res = client.search(
+    collection_name=collection_name,
+    data=query_vectors,
+    filter='origin == "American" and year > 1945 and year < 2000',
+    anns_field="embedding",
+    limit=3,
+    output_fields=["title"],
+)
+
+for idx, hits in enumerate(res):
+    print("Query:", queries[idx])
+    print("Results:")
+    for hit in hits:
+        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
+    print()
+
+

النتائج هي

+
Query: An archaeologist searches for ancient artifacts while fighting Nazis.
+Results:
+Love Slaves of the Amazons ( 0.4 )
+A Time to Love and a Time to Die ( 0.39 )
+The Fifth Element ( 0.39 )
+
+Query: Teenagers in detention learn about themselves.
+Results:
+The Breakfast Club ( 0.54 )
+Up the Academy ( 0.46 )
+Fame ( 0.43 )
+
+Query: A teenager fakes illness to get off school and have adventures with two friends.
+Results:
+Ferris Bueller's Day Off ( 0.48 )
+Fever Lake ( 0.47 )
+Losin' It ( 0.39 )
+
+Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
+Results:
+The Shining ( 0.48 )
+The Four Seasons ( 0.42 )
+Highball ( 0.41 )
+
+Query: Four turtles fight bad guys.
+Results:
+Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
+Devil May Hare ( 0.43 )
+Attack of the Giant Leeches ( 0.42 )
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.json b/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.json new file mode 100644 index 000000000..e47a9ccb1 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.json @@ -0,0 +1 @@ +{"codeList":["snowsql -a ${instance_name} -u ${user_name}\n","USE ROLE ACCOUNTADMIN;\nCREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH\n TYPE=oauth\n OAUTH_CLIENT=snowservices_ingress\n ENABLED=true;\n \nUSE ROLE ACCOUNTADMIN;\nGRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;\n","USE ROLE SECURITYADMIN;\nCREATE ROLE MILVUS_ROLE;\n\nUSE ROLE USERADMIN;\nCREATE USER milvus_user\n PASSWORD='milvususerok'\n DEFAULT_ROLE = MILVUS_ROLE\n DEFAULT_SECONDARY_ROLES = ('ALL')\n MUST_CHANGE_PASSWORD = FALSE;\n \nUSE ROLE SECURITYADMIN;\nGRANT ROLE MILVUS_ROLE TO USER milvus_user;\n","USE ROLE SYSADMIN;\nCREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH\nWAREHOUSE_SIZE='X-SMALL'\nAUTO_SUSPEND = 180\nAUTO_RESUME = true\nINITIALLY_SUSPENDED=false;\n\nUSE ROLE SYSADMIN;\nCREATE DATABASE IF NOT EXISTS MILVUS_DEMO;\nUSE DATABASE MILVUS_DEMO;\nCREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nCREATE OR REPLACE STAGE YAML_STAGE;\nCREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\nCREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n","USE ROLE SECURITYADMIN;\nGRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;\n","USE ROLE ACCOUNTADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\nCREATE NETWORK RULE allow_all_rule\nTYPE = 'HOST_PORT'\nMODE= 'EGRESS'\nVALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');\n\nCREATE EXTERNAL ACCESS INTEGRATION allow_all_eai\nALLOWED_NETWORK_RULES=(allow_all_rule)\nENABLED=TRUE;\n\nGRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;\n","cd ${repo_git_root_path}\ndocker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus\ndocker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter\n","docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}\n","docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","docker images | grep milvus\n\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus latest 3721bbb8f62b 2 days ago 2.95GB\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter latest 20633f5bcadf 2 days ago 2GB\n","docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","USE ROLE SYSADMIN;\nCREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\nCREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\n","DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;\nDESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;\n","PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;\nPUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;\n","USE ROLE SYSADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\n\nCREATE SERVICE MILVUS\n IN COMPUTE POOL MILVUS_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='milvus.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n\nCREATE SERVICE JUPYTER\n IN COMPUTE POOL JUPYTER_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='jupyter.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n","SHOW SERVICES;\n\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| name | database_name | schema_name | owner | compute_pool | dns_name | ......\n|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| JUPYTER | MILVUS_DEMO | PUBLIC | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... \n| MILVUS | MILVUS_DEMO | PUBLIC | SYSADMIN | MILVUS_COMPUTE_POOL | milvus.public.milvus-demo.snowflakecomputing.internal | ......\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n","USE ROLE SECURITYADMIN;\nGRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;\n","USE ROLE SYSADMIN;\nSHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n","USE ROLE ACCOUNTADMIN;\nDROP USER milvus_user;\n\nUSE ROLE SYSADMIN;\nDROP SERVICE MILVUS;\nDROP SERVICE JUPYTER;\n\nDROP COMPUTE POOL MILVUS_COMPUTE_POOL;\nDROP COMPUTE POOL JUPYTER_COMPUTE_POOL;\n\nDROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nDROP DATABASE MILVUS_DEMO;\nDROP WAREHOUSE MILVUS_WAREHOUSE;\n\nUSE ROLE ACCOUNTADMIN;\nDROP ROLE MILVUS_ROLE;\nDROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;\n"],"headingContent":"Milvus on Snowpark Container Services","anchorList":[{"label":"ميلفوس على خدمات حاويات Snowpark","href":"Milvus-on-Snowpark-Container-Services","type":1,"isActive":false},{"label":"حول Snowpark Container Services","href":"About-Snowpark-Container-Services","type":2,"isActive":false},{"label":"تكوين عرض ميلفوس التجريبي","href":"Configure-Milvus-demo","type":2,"isActive":false},{"label":"استخدام دفتر الملاحظات","href":"Use-Notebook","type":2,"isActive":false},{"label":"7. التنظيف","href":"7-Clean-up","type":2,"isActive":false},{"label":"حول ملفوس","href":"About-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.md b/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.md new file mode 100644 index 000000000..42c882d4a --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_snowpark.md @@ -0,0 +1,320 @@ +--- +id: integrate_with_snowpark.md +summary: يوضح هذا الدليل كيفية بدء عرض Milvus التجريبي على خدمات حاوية Snowpark. +title: ميلفوس على خدمات حاويات Snowpark +--- +

ميلفوس على خدمات حاويات Snowpark

يوضح هذا الدليل كيفية بدء عرض Milvus التجريبي على خدمات حاويات Snowpark.

+

حول Snowpark Container Services

خدمات حاويات Snowpark Container Services عبارة عن عرض حاويات مُدار بالكامل مصمم لتسهيل نشر التطبيقات المعبأة في حاويات وإدارتها وتوسيع نطاقها داخل نظام Snowflake البيئي. تمكّن هذه الخدمة المستخدمين من تشغيل أعباء العمل في حاويات مباشرةً داخل Snowflake، مما يضمن عدم الحاجة إلى نقل البيانات خارج بيئة Snowflake للمعالجة. لمزيد من المعلومات، يرجى الرجوع إلى المقدمة الرسمية: خدمات Snowpark Container Services.

+

تكوين عرض ميلفوس التجريبي

سيتيح ما يلي للمستخدمين فهم إمكانيات Milvus وكيفية استخدام Milvus في SPCS من خلال التكوين والتعليمات البرمجية.

+

1. الحصول على معلومات الحساب

قم بتنزيل عميل SPCS: SnowSQL، ثم قم بتسجيل الدخول إلى حسابك.

+
snowsql -a ${instance_name} -u ${user_name}
+
+

قاعدة ${instance_name} هي ${org_name}-${acct_name}. يمكن الحصول على المعلومات ذات الصلة عن طريق تسجيل الدخول إلى app.snowflake.com والتحقق من معلومات الحساب الشخصي.

+

+ + Snowflake account information + معلومات حساب Snowflake

+

2. تكوين الدور والامتيازات

تكوين تكامل OAUTH.

+
USE ROLE ACCOUNTADMIN;
+CREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH
+  TYPE=oauth
+  OAUTH_CLIENT=snowservices_ingress
+  ENABLED=true;
+  
+USE ROLE ACCOUNTADMIN;
+GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;
+
+

قم بإنشاء دور للخدمة، لاحظ أن الجزء ${PASSWORD} هنا يجب استبداله من قبل المستخدم عندما يكون العرض التوضيحي

+
USE ROLE SECURITYADMIN;
+CREATE ROLE MILVUS_ROLE;
+
+USE ROLE USERADMIN;
+CREATE USER milvus_user
+  PASSWORD='milvususerok'
+  DEFAULT_ROLE = MILVUS_ROLE
+  DEFAULT_SECONDARY_ROLES = ('ALL')
+  MUST_CHANGE_PASSWORD = FALSE;
+  
+USE ROLE SECURITYADMIN;
+GRANT ROLE MILVUS_ROLE TO USER milvus_user;
+
+

3. إنشاء تكوين تخزين البيانات

    +
  • إنشاء مستودع وقاعدة بيانات

    +
    USE ROLE SYSADMIN;
    +CREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH
    +WAREHOUSE_SIZE='X-SMALL'
    +AUTO_SUSPEND = 180
    +AUTO_RESUME = true
    +INITIALLY_SUSPENDED=false;
    +
    +USE ROLE SYSADMIN;
    +CREATE DATABASE IF NOT EXISTS MILVUS_DEMO;
    +USE DATABASE MILVUS_DEMO;
    +CREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
    +CREATE OR REPLACE STAGE YAML_STAGE;
    +CREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
    +CREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
    +
  • +
  • منح امتيازات الدور

    +
    USE ROLE SECURITYADMIN;
    +GRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;
    +GRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;
    +GRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;
    +GRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;
    +
  • +
  • تكوين ACL

    +
    USE ROLE ACCOUNTADMIN;
    +USE DATABASE MILVUS_DEMO;
    +USE SCHEMA PUBLIC;
    +CREATE NETWORK RULE allow_all_rule
    +TYPE = 'HOST_PORT'
    +MODE= 'EGRESS'
    +VALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');
    +
    +CREATE EXTERNAL ACCESS INTEGRATION allow_all_eai
    +ALLOWED_NETWORK_RULES=(allow_all_rule)
    +ENABLED=TRUE;
    +
    +GRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;
    +
  • +
+

4. إنشاء الصور

يجب إنشاء الصورة المستخدمة من قبل Milvus محليًا ثم تحميلها من قبل المستخدم. للحصول على التكوين المناسب للصورة، يرجى الرجوع إلى هذا الريبو. بعد استنساخ الشيفرة، انتقل إلى الدليل الجذر للمشروع واستعد لبناء الصورة.

+
    +
  • بناء الصور محليًا

    +

    افتح الصدفة المحلية وابدأ في بناء الصور.

    +
    cd ${repo_git_root_path}
    +docker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus
    +docker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter
    +
    +

    هناك صورتان هنا، الأولى تقوم بتشغيل قاعدة بيانات Milvus، والثانية هي دفتر الملاحظات المستخدم للعرض.

    +

    بعد بناء الصور المحلية، استعد لتمييزها وتحميلها.

  • +
  • وسم الصور المبنية

    +

    قم بتسجيل الدخول إلى محور docker لـ SPCS.

    +
    docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}
    +
    +

    ويمكنك وضع علامة على الصور لـ spcs الآن.

    +
    docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
    +docker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
    +
    +

    ثم استخدم docker images | grep milvus في الغلاف المحلي للتحقق مما إذا كانت الصورة قد تم تجميعها ووسمها بنجاح.

    +
    docker images | grep milvus
    +
    +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus    latest        3721bbb8f62b   2 days ago    2.95GB
    +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter   latest        20633f5bcadf   2 days ago    2GB
    +
  • +
  • ادفع الصور إلى SPCS

    +
    docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
    +docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
    +
  • +
+

5. إنشاء الخدمات وبدء تشغيلها

دعنا نعود إلى قذيفة SnowSQL.

+
    +
  • إنشاء تجمعات الحوسبة
  • +
+
USE ROLE SYSADMIN;
+CREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL
+  MIN_NODES = 1
+  MAX_NODES = 1
+  INSTANCE_FAMILY = CPU_X64_S
+  AUTO_RESUME = true;
+CREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL
+  MIN_NODES = 1
+  MAX_NODES = 1
+  INSTANCE_FAMILY = CPU_X64_S
+  AUTO_RESUME = true;
+
+

تحقق من تجمعات الحوسبة من خلال DESCRIBE حتى الحالة ACTIVE أو IDLE.

+
DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;
+DESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;
+
+

+ + Compute pool status + حالة تجمعات الحوسبة

+
    +
  • تحميل ملفات المواصفات
  • +
+

بعد إنشاء تجمع الحوسبة، ابدأ في إعداد ملف spce للخدمة. الملفات موجودة أيضًا في هذا الريبو. يرجى الرجوع إلى دليل المواصفات.

+

افتح ملفات المواصفات الخاصة بهاتين الخدمتين، وابحث عن ${org_name}-${acct_name} في ملف المواصفات، واستبدلها بـ ${instance_name} لحسابك الخاص. بعد التعديل، استخدم SnowSQL لإكمال التحميل.

+
PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;
+PUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;
+
+
    +
  • إنشاء الخدمة
  • +
+

عند اكتمال التحميل، تكون جاهزًا لإنشاء الخدمة، تابع لإكمال عملية إنشاء الخدمة.

+
USE ROLE SYSADMIN;
+USE DATABASE MILVUS_DEMO;
+USE SCHEMA PUBLIC;
+
+CREATE SERVICE MILVUS
+  IN COMPUTE POOL MILVUS_COMPUTE_POOL 
+  FROM @YAML_STAGE
+  SPEC='milvus.yaml'
+  MIN_INSTANCES=1
+  MAX_INSTANCES=1;
+
+CREATE SERVICE JUPYTER
+  IN COMPUTE POOL JUPYTER_COMPUTE_POOL 
+  FROM @YAML_STAGE
+  SPEC='jupyter.yaml'
+  MIN_INSTANCES=1
+  MAX_INSTANCES=1;
+
+

يمكن أيضًا عرض الخدمات من خلال SHOW SERVICES;.

+
SHOW SERVICES;
+
++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
+| name    | database_name | schema_name | owner    | compute_pool         | dns_name                                               | ......
+|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
+| JUPYTER | MILVUS_DEMO   | PUBLIC      | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... 
+| MILVUS  | MILVUS_DEMO   | PUBLIC      | SYSADMIN | MILVUS_COMPUTE_POOL  | milvus.public.milvus-demo.snowflakecomputing.internal  | ......
++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
+
+

إذا واجهتك مشاكل في بدء الخدمة، يمكنك عرض معلومات الخدمة من خلال CALL SYSTEM$GET_SERVICE_STATUS('milvus');.

+

+ + Service status + حالة الخدمة

+

يمكن الحصول على مزيد من المعلومات من خلال CALL SYSTEM$GET_SERVICE_LOGS('milvus', '0', 'milvus', 10);.

+

استخدام دفتر الملاحظات

استخدم SnowSQL لمنح الأذونات.

+
USE ROLE SECURITYADMIN;
+GRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;
+
+

ثم قم بعرض وتسجيل نقطة نهاية دفتر ملاحظات جوبيتر.

+
USE ROLE SYSADMIN;
+SHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;
+
+

سجّل الجزء ingress_url من المعلومات، ثم افتح المتصفح وأدخل ingress_url ، استخدم حساب milvus_user لتسجيل الدخول إلى الموقع الإلكتروني.

+

+ + Obtain the ingress URL + الحصول على عنوان URL للدخول

+

افتح دفتر الملاحظات من خلال ingress_url ، انقر نقرًا مزدوجًا على ملف TestMilvus.ipynb على الصفحة لتجربة ميلفوس. حدد الجزء الأول من كتلة التعليمات البرمجية، وانقر فوق الزر تشغيل لبدء إنشاء الاتصال وتهيئة وظيفة التضمين.

+

+ + Run TestMilvus.ipynb in the notebook + قم بتشغيل TestMilvus.ipynb في دفتر الملاحظات

+

بعد إنشاء الاتصال، تابع النقر على تشغيل. سيقوم الرمز بتحويل جزء من النص إلى بيانات متجهة بعد معالجة التضمين، ثم إدراجه في ملفوس.

+
docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+

ثم استخدم نصًا كاستعلام: "من بدأ أبحاث الذكاء الاصطناعي؟"، وقم بإجراء الاستعلام بعد تضمين المعالجة، وأخيرًا الحصول على النتائج الأكثر صلة وعرضها.

+

+ + Obtain and display the most relevant results + الحصول على النتائج الأكثر صلة وعرضها

+

لمزيد من المعلومات حول استخدام عميل ميلفوس، يمكنك الرجوع إلى قسم مستند ميلفوس.

+

7. التنظيف

بعد التحقق، يمكنك استخدام SnowSQL لتنظيف الخدمات والأدوار وموارد البيانات.

+
USE ROLE ACCOUNTADMIN;
+DROP USER milvus_user;
+
+USE ROLE SYSADMIN;
+DROP SERVICE MILVUS;
+DROP SERVICE JUPYTER;
+
+DROP COMPUTE POOL MILVUS_COMPUTE_POOL;
+DROP COMPUTE POOL JUPYTER_COMPUTE_POOL;
+
+DROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
+DROP DATABASE MILVUS_DEMO;
+DROP WAREHOUSE MILVUS_WAREHOUSE;
+
+USE ROLE ACCOUNTADMIN;
+DROP ROLE MILVUS_ROLE;
+DROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;
+
+

حول ملفوس

لمزيد من المعلومات حول ميلفوس، يمكنك البدء بمقدمة ميلفوس والبداية السريعة. وبالطبع، هناك مقدمة أكثر تفصيلاً عن واجهة برمجة التطبيقات، وارجع إلى إصدارات Python و Java، وهناك أيضًا معلومات حول التضمينات والتكاملات للرجوع إليها.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_spark.json b/localization/v2.5.x/site/ar/integrations/integrate_with_spark.json new file mode 100644 index 000000000..6211bbaf1 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_spark.json @@ -0,0 +1 @@ +{"codeList":["wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","from pyspark.sql import SparkSession\n\ncolumns = [\"id\", \"text\", \"vec\"]\ndata = [(1, \"a\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (2, \"b\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (3, \"c\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (4, \"d\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]\nsample_df = spark.sparkContext.parallelize(data).toDF(columns)\nsample_df.write \\\n .mode(\"append\") \\\n .option(\"milvus.host\", \"localhost\") \\\n .option(\"milvus.port\", \"19530\") \\\n .option(\"milvus.collection.name\", \"hello_spark_milvus\") \\\n .option(\"milvus.collection.vectorField\", \"vec\") \\\n .option(\"milvus.collection.vectorDim\", \"8\") \\\n .option(\"milvus.collection.primaryKeyField\", \"id\") \\\n .format(\"milvus\") \\\n .save()\n","import org.apache.spark.sql.{SaveMode, SparkSession}\n\nobject Hello extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"HelloSparkMilvus\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"a\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (2, \"b\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (3, \"c\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (4, \"d\", Seq(1.0,2.0,3.0,4.0,5.0))\n ).toDF(\"id\", \"text\", \"vec\")\n\n // set milvus options\n val milvusOptions = Map(\n \"milvus.host\" -> \"localhost\" -> uri,\n \"milvus.port\" -> \"19530\",\n \"milvus.collection.name\" -> \"hello_spark_milvus\",\n \"milvus.collection.vectorField\" -> \"vec\",\n \"milvus.collection.vectorDim\" -> \"5\",\n \"milvus.collection.primaryKeyField\", \"id\"\n )\n \n sampleDF.write.format(\"milvus\")\n .options(milvusOptions)\n .mode(SaveMode.Append)\n .save()\n}\n","val df = spark.read\n .format(\"milvusbinlog\")\n .load(path)\n .withColumnRenamed(\"val\", \"embedding\")\n","{\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]}\n{\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]}\n{\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]}\n{\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]}\n{\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n","{\n \"rows\":[\n {\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]},\n {\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]},\n {\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]},\n {\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]},\n {\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n ]\n}\n","val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n","df.write.format(\"parquet\").save(outputPath)\nMilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, \"parquet\")\n","spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar\n","import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.{SaveMode, SparkSession}\nimport zilliztech.spark.milvus.MilvusOptions._\n\nimport org.apache.spark.ml.linalg.Vector\n\nobject Mysql2MilvusDemo extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"Mysql2MilvusDemo\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models.\"),\n (2, \"As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. \"),\n (3, \"Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data.\"),\n (4, \"As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.\")\n ).toDF(\"id\", \"text\")\n\n // Write to MySQL Table\n sampleDF.write\n .mode(SaveMode.Append)\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .save()\n\n // Read from MySQL Table\n val dfMysql = spark.read\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .load()\n\n val tokenizer = new Tokenizer().setInputCol(\"text\").setOutputCol(\"tokens\")\n val tokenizedDf = tokenizer.transform(dfMysql)\n\n // Learn a mapping from words to Vectors.\n val word2Vec = new Word2Vec()\n .setInputCol(\"tokens\")\n .setOutputCol(\"vectors\")\n .setVectorSize(128)\n .setMinCount(0)\n val model = word2Vec.fit(tokenizedDf)\n\n val result = model.transform(tokenizedDf)\n\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // Apply the UDF to the DataFrame\n val resultDF = result.withColumn(\"embedding\", vectorToArrayUDF($\"vectors\"))\n val milvusDf = resultDF.drop(\"tokens\").drop(\"vectors\")\n\n milvusDf.write.format(\"milvus\")\n .option(MILVUS_HOST, \"localhost\")\n .option(MILVUS_PORT, \"19530\")\n .option(MILVUS_COLLECTION_NAME, \"text_embedding\")\n .option(MILVUS_COLLECTION_VECTOR_FIELD, \"embedding\")\n .option(MILVUS_COLLECTION_VECTOR_DIM, \"128\")\n .option(MILVUS_COLLECTION_PRIMARY_KEY, \"id\")\n .mode(SaveMode.Append)\n .save()\n}\n","import org.apache.spark.ml.feature.PCA\nimport org.apache.spark.ml.linalg.{Vector, Vectors}\nimport org.apache.spark.SparkConf\nimport org.apache.spark.sql.SparkSession\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.util.CaseInsensitiveStringMap\nimport zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}\n\nimport scala.collection.JavaConverters._\n\nobject TransformDemo extends App {\n val sparkConf = new SparkConf().setMaster(\"local\")\n val spark = SparkSession.builder().config(sparkConf).getOrCreate()\n\n import spark.implicits._\n\n val host = \"localhost\"\n val port = 19530\n val user = \"root\"\n val password = \"Milvus\"\n val fs = \"s3a://\"\n val bucketName = \"a-bucket\"\n val rootPath = \"files\"\n val minioAK = \"minioadmin\"\n val minioSK = \"minioadmin\"\n val minioEndpoint = \"localhost:9000\"\n val collectionName = \"hello_spark_milvus1\"\n val targetCollectionName = \"hello_spark_milvus2\"\n\n val properties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n\n // 1, configurations\n val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))\n\n // 2, batch read milvus collection data to dataframe\n // Schema: dim of `embeddings` is 8\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=8 |\n // +-+------------+------------+------------------+\n val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))\n val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n .withColumn(\"embeddings_vec\", arrayToVectorUDF($\"embeddings\"))\n .drop(\"embeddings\")\n \n // 3. Use PCA to reduce dim of vector\n val dim = 4\n val pca = new PCA()\n .setInputCol(\"embeddings_vec\")\n .setOutputCol(\"pca_vec\")\n .setK(dim)\n .fit(collectionDF)\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // embeddings dim number reduce to 4\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=4 |\n // +-+------------+------------+------------------+\n val pcaDf = pca.transform(collectionDF)\n .withColumn(\"embeddings\", vectorToArrayUDF($\"pca_vec\"))\n .select(\"pk\", \"random\", \"embeddings\")\n\n // 4. Write PCAed data to S3\n val outputPath = \"s3a://a-bucket/result\"\n pcaDf.write\n .mode(\"overwrite\")\n .format(\"parquet\")\n .save(outputPath)\n\n // 5. Config MilvusOptions of target table \n val targetProperties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n // 6. Bulkinsert Spark output files into milvus\n MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"parquet\")\n}\n","// Write the data in batch into the Milvus bucket storage.\nval outputPath = \"s3://my-temp-bucket/result\"\ndf.write\n .mode(\"overwrite\")\n .format(\"mjson\")\n .save(outputPath)\n// Specify Milvus options.\nval targetProperties = Map(\n MilvusOptions.MILVUS_URI -> zilliz_uri,\n MilvusOptions.MILVUS_TOKEN -> zilliz_token,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n)\nval targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n// Bulk insert Spark output files into Milvus\nMilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"mjson\")\n"],"headingContent":"Spark-Milvus Connector User Guide","anchorList":[{"label":"دليل مستخدم موصل Spark-Milvus Connector","href":"Spark-Milvus-Connector-User-Guide","type":1,"isActive":false},{"label":"البدء السريع","href":"Quick-start","type":2,"isActive":false},{"label":"الميزات والمفاهيم","href":"Features--concepts","type":2,"isActive":false},{"label":"تنسيق بيانات Milvus","href":"Milvus-data-format","type":2,"isActive":false},{"label":"MilvusUtils","href":"MilvusUtils","type":2,"isActive":false},{"label":"الاستخدام المتقدم","href":"Advanced-Usage","type":2,"isActive":false},{"label":"التدريب العملي","href":"Hands-on","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_spark.md b/localization/v2.5.x/site/ar/integrations/integrate_with_spark.md new file mode 100644 index 000000000..10e1b2090 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_spark.md @@ -0,0 +1,505 @@ +--- +id: integrate_with_spark.md +summary: تناقش هذه الصفحة موصل Spark-Milvus. +title: دليل مستخدم موصل Spark-Milvus Connector +--- +

دليل مستخدم موصل Spark-Milvus Connector

يوفر موصل Spark-Milvus Connector (https://github.com/zilliztech/spark-milvus) تكاملاً سلسًا بين Apache Spark و Milvus، حيث يجمع بين ميزات معالجة البيانات وتعلم الآلة في Apache Spark مع قدرات تخزين البيانات المتجهة وإمكانيات البحث في Milvus. يتيح هذا التكامل العديد من التطبيقات المثيرة للاهتمام، بما في ذلك:

+
    +
  • تحميل البيانات المتجهة بكفاءة في Milvus على دفعات كبيرة,
  • +
  • نقل البيانات بين Milvus وأنظمة التخزين أو قواعد البيانات الأخرى,
  • +
  • تحليل البيانات في Milvus من خلال الاستفادة من Spark MLlib وأدوات الذكاء الاصطناعي الأخرى.
  • +
+

البدء السريع

التحضير

يدعم موصل Spark-Milvus Connector لغتي البرمجة Scala و Python. يمكن للمستخدمين استخدامه مع Pyspark أو Spark-shell. لتشغيل هذا العرض التوضيحي، قم بإعداد بيئة Spark التي تحتوي على تبعية Spark-Milvus Connector في الخطوات التالية:

+
    +
  1. تثبيت أباتشي سبارك (الإصدار >= 3.3.0)

    +

    يمكنك تثبيت Apache Spark بالرجوع إلى الوثائق الرسمية.

  2. +
  3. قم بتنزيل ملف جرة شرارة ميلفوس.

    +
    wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar
    +
  4. +
  5. ابدأ وقت تشغيل Spark مع جرة شرارة ميلفوس كأحد التبعيات.

    +

    لبدء وقت تشغيل Spark مع Spark-Milvus Connector، أضف الشرارة-ميلفوس التي تم تنزيلها كأحد التبعيات إلى الأمر.

    +
      +
    • بيسبارك

      +
      ./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar
      +
    • +
    • شرارة قذيفة

      +
      ./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar
      +
    • +
  6. +
+

عرض توضيحي

في هذا العرض التوضيحي، نقوم بإنشاء نموذج Spark DataFrame مع بيانات متجهة ونكتبها إلى Milvus من خلال Spark-Milvus Connector. سيتم إنشاء مجموعة في Milvus تلقائيًا استنادًا إلى المخطط والخيارات المحددة.

+ +
from pyspark.sql import SparkSession
+
+columns = ["id", "text", "vec"]
+data = [(1, "a", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
+    (2, "b", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
+    (3, "c", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
+    (4, "d", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]
+sample_df = spark.sparkContext.parallelize(data).toDF(columns)
+sample_df.write \
+    .mode("append") \
+    .option("milvus.host", "localhost") \
+    .option("milvus.port", "19530") \
+    .option("milvus.collection.name", "hello_spark_milvus") \
+    .option("milvus.collection.vectorField", "vec") \
+    .option("milvus.collection.vectorDim", "8") \
+    .option("milvus.collection.primaryKeyField", "id") \
+    .format("milvus") \
+    .save()
+
+
import org.apache.spark.sql.{SaveMode, SparkSession}
+
+object Hello extends App {
+
+  val spark = SparkSession.builder().master("local[*]")
+    .appName("HelloSparkMilvus")
+    .getOrCreate()
+
+  import spark.implicits._
+
+  // Create DataFrame
+  val sampleDF = Seq(
+    (1, "a", Seq(1.0,2.0,3.0,4.0,5.0)),
+    (2, "b", Seq(1.0,2.0,3.0,4.0,5.0)),
+    (3, "c", Seq(1.0,2.0,3.0,4.0,5.0)),
+    (4, "d", Seq(1.0,2.0,3.0,4.0,5.0))
+  ).toDF("id", "text", "vec")
+
+  // set milvus options
+  val milvusOptions = Map(
+      "milvus.host" -> "localhost" -> uri,
+      "milvus.port" -> "19530",
+      "milvus.collection.name" -> "hello_spark_milvus",
+      "milvus.collection.vectorField" -> "vec",
+      "milvus.collection.vectorDim" -> "5",
+      "milvus.collection.primaryKeyField", "id"
+    )
+    
+  sampleDF.write.format("milvus")
+    .options(milvusOptions)
+    .mode(SaveMode.Append)
+    .save()
+}
+
+

بعد تنفيذ الكود أعلاه، يمكنك عرض البيانات المدرجة في Milvus باستخدام SDK أو Attu (لوحة معلومات Milvus). يمكنك العثور على مجموعة باسم hello_spark_milvus تم إنشاؤها مع 4 كيانات تم إدراجها بالفعل فيها.

+

الميزات والمفاهيم

خيارات ملفوس

في قسم البداية السريعة، عرضنا خيارات الإعداد أثناء العمليات مع ميلفوس. يتم تجريد هذه الخيارات كخيارات Milvus. يتم استخدامها لإنشاء اتصالات مع ميلفوس والتحكم في سلوكيات ميلفوس الأخرى. ليست كل الخيارات إلزامية.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
مفتاح الخيارالقيمة الافتراضيةالوصف
milvus.hostlocalhostمضيف خادم ملفوس. راجع إدارة اتصالات Milvus للحصول على التفاصيل.
milvus.port19530منفذ خادم ميلفوس. راجع إدارة اتصالات Milvus للحصول على التفاصيل.
milvus.usernamerootاسم المستخدم لخادم ميلفوس. انظر إدارة اتصالات Milvus للحصول على التفاصيل.
milvus.passwordMilvusكلمة المرور لخادم ميلفوس. راجع إدارة اتصالات Milvus للحصول على التفاصيل.
milvus.uri--URI لخادم Milvus URI. راجع إدارة اتصالات ملفوس للحصول على التفاصيل.
milvus.token--الرمز المميز لخادم ميلفوس. راجع إدارة اتصالات ملفوس للحصول على التفاصيل.
milvus.database.namedefaultاسم قاعدة بيانات ملفوس للقراءة أو الكتابة.
milvus.collection.namehello_milvusاسم مجموعة Milvus المراد قراءتها أو كتابتها.
milvus.collection.primaryKeyFieldNoneاسم حقل المفتاح الأساسي في المجموعة. مطلوب في حالة عدم وجود المجموعة.
milvus.collection.vectorFieldNoneاسم الحقل المتجه في المجموعة. مطلوب إذا كانت المجموعة غير موجودة.
milvus.collection.vectorDimNoneبُعد الحقل المتجه في المجموعة. مطلوب إذا كانت المجموعة غير موجودة.
milvus.collection.autoIDfalseإذا لم تكن المجموعة غير موجودة، يحدد هذا الخيار ما إذا كان سيتم إنشاء معرفات للكيانات تلقائيًا. لمزيد من المعلومات، راجع إنشاء_مجموعة
milvus.bucketa-bucketاسم المجموعة في مخزن ميلفوس. يجب أن يكون هذا هو نفسه minio.bucketName في milvus.yaml.
milvus.rootpathfilesالمسار الجذر لتخزين Milvus. يجب أن يكون هذا هو نفسه minio.rootpath في milvus.yaml.
milvus.fss3a://نظام ملفات وحدة تخزين Milvus. تنطبق القيمة s3a:// على Spark مفتوح المصدر. استخدم s3:// لـ Databricks.
milvus.storage.endpointlocalhost:9000نقطة النهاية لتخزين Milvus. يجب أن يكون هذا هو نفسه minio.address:minio.port في milvus.yaml.
milvus.storage.userminioadminمستخدم وحدة تخزين Milvus. يجب أن يكون هذا هو نفسه minio.accessKeyID في milvus.yaml.
milvus.storage.passwordminioadminكلمة مرور مخزن ميلفوس. يجب أن تكون هي نفسها minio.secretAccessKey في milvus.yaml.
milvus.storage.useSSLfalseما إذا كان يجب استخدام SSL لتخزين Milvus. يجب أن يكون هذا هو نفسه minio.useSSL في milvus.yaml.
+

تنسيق بيانات Milvus

يدعم موصل Spark-Milvus Connector قراءة وكتابة البيانات بتنسيقات بيانات Milvus التالية:

+
    +
  • milvus: تنسيق بيانات Milvus للتحويل السلس من Spark DataFrame إلى كيانات Milvus.
  • +
  • milvusbinlog: تنسيق بيانات Milvus لقراءة بيانات مدونة Milvus المدمجة.
  • +
  • mjson: تنسيق Milvus JSON لإدخال البيانات المجمعة في Milvus.
  • +
+

ميلفوس

في البداية السريعة، نستخدم تنسيق milvus لكتابة بيانات نموذجية في مجموعة Milvus. تنسيق milvus هو تنسيق بيانات جديد يدعم كتابة بيانات Spark DataFrame بسلاسة في مجموعات Milvus. يتم تحقيق ذلك من خلال استدعاءات دفعية إلى واجهة برمجة التطبيقات Insert API الخاصة بـ Milvus SDK. في حالة عدم وجود مجموعة في Milvus، سيتم إنشاء مجموعة جديدة بناءً على مخطط إطار البيانات. ومع ذلك، قد لا تدعم المجموعة التي تم إنشاؤها تلقائيًا جميع ميزات مخطط المجموعة. لذلك، يوصى بإنشاء مجموعة عبر SDK أولاً ثم استخدام شرارة ميلفوس للكتابة. لمزيد من المعلومات، يرجى الرجوع إلى العرض التوضيحي.

+

ميلفوسبينوغ

تنسيق البيانات الجديد milvusbinlog مخصص لقراءة بيانات Milvus binlog المدمجة في Milvus. Binlog هو تنسيق تخزين البيانات الداخلية لـ Milvus استناداً إلى الباركيه. لسوء الحظ، لا يمكن قراءتها من قبل مكتبة باركيه عادية، لذلك قمنا بتنفيذ تنسيق البيانات الجديد هذا لمساعدة وظيفة Spark على قراءتها. لا يوصى باستخدام تنسيق milvusbinlog مباشرةً إلا إذا كنت على دراية بتفاصيل التخزين الداخلي لـ Milvus. نقترح استخدام دالة MilvusUtils التي سيتم تقديمها في القسم التالي.

+
val df = spark.read
+  .format("milvusbinlog")
+  .load(path)
+  .withColumnRenamed("val", "embedding")
+
+

مجسون

يوفر ميلفوس وظيفة بولكنسيرت لتحسين أداء الكتابة عند العمل مع مجموعات البيانات الكبيرة. ومع ذلك، فإن تنسيق JSON المستخدم من قبل Milvus يختلف قليلاً عن تنسيق إخراج JSON الافتراضي الخاص بـ Spark. لحل هذه المشكلة، نقدم تنسيق بيانات mjson لتوليد بيانات تلبي متطلبات Milvus. فيما يلي مثال يوضح الفرق بين JSON-lines و mjson:

+
    +
  • JSON-lines:

    +
    {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]}
    +{"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]}
    +{"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]}
    +{"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]}
    +{"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
    +
  • +
  • mjson (مطلوب لـ Milvus Bulkinsert):

    +
    {
    +    "rows":[
    +        {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]},
    +        {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]},
    +        {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]},
    +        {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]},
    +        {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
    +    ]
    +}
    +
  • +
+

سيتم تحسين هذا في المستقبل. نوصي باستخدام تنسيق الباركيه في تكامل شرارة ميلفوس إذا كان إصدار ميلفوس الخاص بك هو الإصدار 2.3.7+ الذي يدعم بولكنسيرت بتنسيق الباركيه. انظر العرض التوضيحي على Github.

+

MilvusUtils

يحتوي MilvusUtils على العديد من دوال الاستخدام المفيدة. وهي مدعومة حاليًا في سكالا فقط. المزيد من أمثلة الاستخدام في قسم الاستخدام المتقدم.

+

MilvusUtils.readMilvusCollection

MilvusUtils.readMilvusCollection هي واجهة بسيطة لتحميل مجموعة Milvus كاملة في إطار بيانات Spark. وهي تغلف العديد من العمليات، بما في ذلك استدعاء Milvus SDK، وقراءة milvusbinlog وعمليات الاتحاد/الربط الشائعة.

+
val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
+
+

MilvusUtils.bulkInsertFromSpark

يوفر MilvusUtils.bulkInsertFertFromSpark طريقة ملائمة لاستيراد ملفات إخراج Spark إلى Milvus دفعة واحدة. وهي تلتف على واجهة برمجة تطبيقات Bullkinsert الخاصة بحزمة تطوير البرمجيات Milvus SDK.

+
df.write.format("parquet").save(outputPath)
+MilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, "parquet")
+
+

الاستخدام المتقدم

في هذا القسم، ستجد في هذا القسم أمثلة استخدام متقدمة لموصل Spark-Milvus لتحليل البيانات وترحيلها. لمزيد من العروض التوضيحية، انظر الأمثلة.

+

MySQL -> التضمين -> ميلفوس

في هذا العرض التوضيحي، سنقوم بما يلي

+
    +
  1. قراءة البيانات من MySQL من خلال موصل Spark-MySQL,
  2. +
  3. توليد التضمين (باستخدام Word2Vec كمثال)، و
  4. +
  5. كتابة البيانات المضمنة في ملفوس.
  6. +
+

لتمكين موصل Spark-MySQL، تحتاج إلى إضافة التبعية التالية إلى بيئة Spark الخاصة بك:

+
spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar
+
+
import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}
+import org.apache.spark.sql.functions.udf
+import org.apache.spark.sql.{SaveMode, SparkSession}
+import zilliztech.spark.milvus.MilvusOptions._
+
+import org.apache.spark.ml.linalg.Vector
+
+object Mysql2MilvusDemo  extends App {
+
+  val spark = SparkSession.builder().master("local[*]")
+    .appName("Mysql2MilvusDemo")
+    .getOrCreate()
+
+  import spark.implicits._
+
+  // Create DataFrame
+  val sampleDF = Seq(
+    (1, "Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models."),
+    (2, "As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. "),
+    (3, "Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data."),
+    (4, "As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.")
+  ).toDF("id", "text")
+
+  // Write to MySQL Table
+  sampleDF.write
+    .mode(SaveMode.Append)
+    .format("jdbc")
+    .option("driver","com.mysql.cj.jdbc.Driver")
+    .option("url", "jdbc:mysql://localhost:3306/test")
+    .option("dbtable", "demo")
+    .option("user", "root")
+    .option("password", "123456")
+    .save()
+
+  // Read from MySQL Table
+  val dfMysql = spark.read
+    .format("jdbc")
+    .option("driver","com.mysql.cj.jdbc.Driver")
+    .option("url", "jdbc:mysql://localhost:3306/test")
+    .option("dbtable", "demo")
+    .option("user", "root")
+    .option("password", "123456")
+    .load()
+
+  val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("tokens")
+  val tokenizedDf = tokenizer.transform(dfMysql)
+
+  // Learn a mapping from words to Vectors.
+  val word2Vec = new Word2Vec()
+    .setInputCol("tokens")
+    .setOutputCol("vectors")
+    .setVectorSize(128)
+    .setMinCount(0)
+  val model = word2Vec.fit(tokenizedDf)
+
+  val result = model.transform(tokenizedDf)
+
+  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
+  // Apply the UDF to the DataFrame
+  val resultDF = result.withColumn("embedding", vectorToArrayUDF($"vectors"))
+  val milvusDf = resultDF.drop("tokens").drop("vectors")
+
+  milvusDf.write.format("milvus")
+    .option(MILVUS_HOST, "localhost")
+    .option(MILVUS_PORT, "19530")
+    .option(MILVUS_COLLECTION_NAME, "text_embedding")
+    .option(MILVUS_COLLECTION_VECTOR_FIELD, "embedding")
+    .option(MILVUS_COLLECTION_VECTOR_DIM, "128")
+    .option(MILVUS_COLLECTION_PRIMARY_KEY, "id")
+    .mode(SaveMode.Append)
+    .save()
+}
+
+

ميلفوس -> تحويل -> ميلفوس

في هذا العرض التوضيحي، سنقوم بما يلي

+
    +
  1. قراءة البيانات من مجموعة Milvus,
  2. +
  3. تطبيق تحويل (باستخدام PCA كمثال)، و
  4. +
  5. كتابة البيانات المحولة إلى ملفوس آخر عبر واجهة برمجة تطبيقات بولكنسيرت.
  6. +
+
+

نموذج PCA هو نموذج تحويل يقلل من أبعاد متجهات التضمين، وهي عملية شائعة في التعلم الآلي. يمكنك إضافة أي عمليات معالجة أخرى، مثل التصفية أو الضم أو التطبيع، إلى خطوة التحويل.

+
+
import org.apache.spark.ml.feature.PCA
+import org.apache.spark.ml.linalg.{Vector, Vectors}
+import org.apache.spark.SparkConf
+import org.apache.spark.sql.SparkSession
+import org.apache.spark.sql.functions.udf
+import org.apache.spark.sql.util.CaseInsensitiveStringMap
+import zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}
+
+import scala.collection.JavaConverters._
+
+object TransformDemo extends App {
+  val sparkConf = new SparkConf().setMaster("local")
+  val spark = SparkSession.builder().config(sparkConf).getOrCreate()
+
+  import spark.implicits._
+
+  val host = "localhost"
+  val port = 19530
+  val user = "root"
+  val password = "Milvus"
+  val fs = "s3a://"
+  val bucketName = "a-bucket"
+  val rootPath = "files"
+  val minioAK = "minioadmin"
+  val minioSK = "minioadmin"
+  val minioEndpoint = "localhost:9000"
+  val collectionName = "hello_spark_milvus1"
+  val targetCollectionName = "hello_spark_milvus2"
+
+  val properties = Map(
+    MilvusOptions.MILVUS_HOST -> host,
+    MilvusOptions.MILVUS_PORT -> port.toString,
+    MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,
+    MilvusOptions.MILVUS_BUCKET -> bucketName,
+    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
+    MilvusOptions.MILVUS_FS -> fs,
+    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
+    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
+    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
+  )
+
+  // 1, configurations
+  val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))
+
+  // 2, batch read milvus collection data to dataframe
+  //  Schema: dim of `embeddings` is 8
+  // +-+------------+------------+------------------+
+  // | | field name | field type | other attributes |
+  // +-+------------+------------+------------------+
+  // |1|    "pk"    |    Int64   |  is_primary=True |
+  // | |            |            |   auto_id=False  |
+  // +-+------------+------------+------------------+
+  // |2|  "random"  |    Double  |                  |
+  // +-+------------+------------+------------------+
+  // |3|"embeddings"| FloatVector|     dim=8        |
+  // +-+------------+------------+------------------+
+  val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))
+  val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
+    .withColumn("embeddings_vec", arrayToVectorUDF($"embeddings"))
+    .drop("embeddings")
+  
+  // 3. Use PCA to reduce dim of vector
+  val dim = 4
+  val pca = new PCA()
+    .setInputCol("embeddings_vec")
+    .setOutputCol("pca_vec")
+    .setK(dim)
+    .fit(collectionDF)
+  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
+  // embeddings dim number reduce to 4
+  // +-+------------+------------+------------------+
+  // | | field name | field type | other attributes |
+  // +-+------------+------------+------------------+
+  // |1|    "pk"    |    Int64   |  is_primary=True |
+  // | |            |            |   auto_id=False  |
+  // +-+------------+------------+------------------+
+  // |2|  "random"  |    Double  |                  |
+  // +-+------------+------------+------------------+
+  // |3|"embeddings"| FloatVector|     dim=4        |
+  // +-+------------+------------+------------------+
+  val pcaDf = pca.transform(collectionDF)
+    .withColumn("embeddings", vectorToArrayUDF($"pca_vec"))
+    .select("pk", "random", "embeddings")
+
+  // 4. Write PCAed data to S3
+  val outputPath = "s3a://a-bucket/result"
+  pcaDf.write
+    .mode("overwrite")
+    .format("parquet")
+    .save(outputPath)
+
+  // 5. Config MilvusOptions of target table  
+  val targetProperties = Map(
+    MilvusOptions.MILVUS_HOST -> host,
+    MilvusOptions.MILVUS_PORT -> port.toString,
+    MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
+    MilvusOptions.MILVUS_BUCKET -> bucketName,
+    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
+    MilvusOptions.MILVUS_FS -> fs,
+    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
+    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
+    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
+  )
+  val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
+  
+  // 6. Bulkinsert Spark output files into milvus
+  MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
+}
+
+

داتابريكس -> زيليز كلاود

إذا كنت تستخدم Zilliz Cloud (خدمة Milvus المُدارة)، يمكنك الاستفادة من واجهة برمجة تطبيقات استيراد البيانات الملائمة. توفر Zilliz Cloud أدوات ووثائق شاملة لمساعدتك على نقل بياناتك بكفاءة من مصادر بيانات مختلفة، بما في ذلك Spark وDatabricks. ما عليك سوى إعداد دلو S3 كوسيط وفتح وصوله إلى حساب Zilliz Cloud الخاص بك. ستقوم واجهة برمجة تطبيقات استيراد البيانات في زيليز كلاود بتحميل دفعة كاملة من البيانات تلقائيًا من دلو S3 إلى مجموعة زيليز كلاود الخاصة بك.

+

التحضيرات

+
    +
  1. قم بتحميل وقت تشغيل Spark عن طريق إضافة ملف جرة إلى مجموعة Databricks Cluster الخاصة بك.

    +

    يمكنك تثبيت مكتبة بطرق مختلفة. تُظهر لقطة الشاشة هذه تحميل جرة من المحلية إلى الكتلة. لمزيد من المعلومات، راجع مكتبات الكتلة في وثائق Databricks.

    +

    + + Install Databricks Library + تثبيت مكتبة داتابريكس

  2. +
  3. قم بإنشاء دلو S3 وقم بتكوينه كموقع تخزين خارجي لمجموعة مكتبات Databricks الخاصة بك.

    +

    يتطلب بولكنسيرت تخزين البيانات المطلوبة في دلو مؤقت بحيث يمكن لزيليز كلاود استيراد البيانات دفعة واحدة. يمكنك إنشاء دلو S3 وتهيئته كموقع خارجي لـ داتابريكس. يرجى الرجوع إلى المواقع الخارجية للحصول على التفاصيل.

  4. +
  5. قم بتأمين بيانات اعتماد Databricks الخاصة بك.

    +

    لمزيد من التفاصيل، ارجع إلى الإرشادات الموجودة في المدونة إدارة بيانات الاعتماد بشكل آمن في داتابريكس.

  6. +
+

عرض توضيحي

+

إليك مقتطف رمز يعرض عملية ترحيل البيانات المجمعة. على غرار مثال ميلفوس أعلاه، تحتاج فقط إلى استبدال بيانات الاعتماد وعنوان دلو S3.

+
// Write the data in batch into the Milvus bucket storage.
+val outputPath = "s3://my-temp-bucket/result"
+df.write
+  .mode("overwrite")
+  .format("mjson")
+  .save(outputPath)
+// Specify Milvus options.
+val targetProperties = Map(
+  MilvusOptions.MILVUS_URI -> zilliz_uri,
+  MilvusOptions.MILVUS_TOKEN -> zilliz_token,
+  MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
+  MilvusOptions.MILVUS_BUCKET -> bucketName,
+  MilvusOptions.MILVUS_ROOTPATH -> rootPath,
+  MilvusOptions.MILVUS_FS -> fs,
+  MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
+  MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
+  MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
+)
+val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
+  
+// Bulk insert Spark output files into Milvus
+MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "mjson")
+
+

التدريب العملي

لمساعدتك على البدء سريعًا في استخدام موصل Spark-Milvus Connector، أعددنا لك دفتر ملاحظات يرشدك خلال عمليتي نقل البيانات المتدفقة والدُفعات باستخدام Milvus و Zilliz Cloud.

+ diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.json b/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.json new file mode 100644 index 000000000..08ce57eab --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"vanna[milvus,openai]\"\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from pymilvus import MilvusClient, model\nfrom vanna.milvus import Milvus_VectorStore\nfrom vanna.openai import OpenAI_Chat\n\n\nclass VannaMilvus(Milvus_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n Milvus_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n","milvus_uri = \"./milvus_vanna.db\"\n\nmilvus_client = MilvusClient(uri=milvus_uri)\n\nvn_milvus = VannaMilvus(\n config={\n \"api_key\": os.getenv(\"OPENAI_API_KEY\"),\n \"model\": \"gpt-3.5-turbo\",\n \"milvus_client\": milvus_client,\n \"embedding_function\": model.DefaultEmbeddingFunction(),\n \"n_results\": 2, # The number of results to return from Milvus semantic search.\n }\n)\n","import sqlite3\n\nsqlite_path = \"./my-database.sqlite\"\nsql_connect = sqlite3.connect(sqlite_path)\nc = sql_connect.cursor()\n\ninit_sqls = \"\"\"\nCREATE TABLE IF NOT EXISTS Customer (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Company TEXT NOT NULL,\n City TEXT NOT NULL,\n Phone TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS Company (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Industry TEXT NOT NULL,\n Location TEXT NOT NULL,\n EmployeeCount INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS User (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Username TEXT NOT NULL UNIQUE,\n Email TEXT NOT NULL UNIQUE\n);\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');\n\nINSERT INTO Company (Name, Industry, Location, EmployeeCount)\nVALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);\n\nINSERT INTO User (Username, Email)\nVALUES ('johndoe123', 'johndoe123@example.com');\n\"\"\"\n\nfor sql in init_sqls.split(\";\"):\n c.execute(sql)\n\nsql_connect.commit()\n\n# Connect to the SQLite database\nvn_milvus.connect_to_sqlite(sqlite_path)\n","# If there exists training data, we should remove it before training.\nexisting_training_data = vn_milvus.get_training_data()\nif len(existing_training_data) > 0:\n for _, training_data in existing_training_data.iterrows():\n vn_milvus.remove_training_data(training_data[\"id\"])\n\n# Get the DDL of the SQLite database\ndf_ddl = vn_milvus.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\n# Train the model on the DDL data\nfor ddl in df_ddl[\"sql\"].to_list():\n vn_milvus.train(ddl=ddl)\n","# Add documentation about your business terminology or definitions.\nvn_milvus.train(\n documentation=\"ABC Corp specializes in cutting-edge technology solutions and innovation.\"\n)\nvn_milvus.train(\n documentation=\"XYZ Inc is a global leader in manufacturing and supply chain management.\"\n)\n\n# You can also add SQL queries to your training data.\nvn_milvus.train(sql=\"SELECT * FROM Customer WHERE Name = 'John Doe'\")\n","training_data = vn_milvus.get_training_data()\ntraining_data\n","sql = vn_milvus.generate_sql(\"what is the phone number of John Doe?\")\nvn_milvus.run_sql(sql)\n","sql = vn_milvus.generate_sql(\"which customer works for a manufacturing corporation?\")\nvn_milvus.run_sql(sql)\n","sql_connect.close()\nmilvus_client.close()\n\nos.remove(sqlite_path)\nif os.path.exists(milvus_uri):\n os.remove(milvus_uri)\n"],"headingContent":"Write SQL with Vanna and Milvus","anchorList":[{"label":"كتابة SQL باستخدام Vanna و Milvus","href":"Write-SQL-with-Vanna-and-Milvus","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Data-preparation","type":2,"isActive":false},{"label":"تدريب مع البيانات","href":"Train-with-data","type":2,"isActive":false},{"label":"إنشاء SQLs وتنفيذها","href":"Generate-SQLs-and-execute-them","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.md b/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.md new file mode 100644 index 000000000..2ab739048 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_vanna.md @@ -0,0 +1,369 @@ +--- +id: integrate_with_vanna.md +summary: >- + يوضح هذا الدليل كيفية استخدام Vanna لإنشاء استعلامات SQL وتنفيذها استنادًا إلى + بياناتك المخزنة في قاعدة بيانات. +title: كتابة SQL باستخدام Vanna و Milvus +--- +

كتابة SQL باستخدام Vanna و Milvus

Open In Colab +GitHub Repository

+

Vanna هو إطار عمل مفتوح المصدر من Python RAG (التوليد المعزز للاسترجاع) لتوليد SQL والوظائف ذات الصلة. Milvus هي قاعدة البيانات المتجهة مفتوحة المصدر الأكثر تقدمًا في العالم، وهي مصممة لتشغيل تطبيقات البحث عن التشابه المضمنة وتطبيقات الذكاء الاصطناعي.

+

يعمل Vanna في خطوتين سهلتين - تدريب "نموذج" RAG على بياناتك، ثم طرح الأسئلة التي ستُعيد استعلامات SQL التي يمكن إعدادها للتشغيل على قاعدة بياناتك. يوضح هذا الدليل كيفية استخدام Vanna لإنشاء استعلامات SQL وتنفيذها استنادًا إلى بياناتك المخزنة في قاعدة البيانات.

+

المتطلبات الأساسية

قبل تشغيل هذا الدليل، تأكد من تثبيت التبعيات التالية:

+
$ pip install "vanna[milvus,openai]"
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

وتحتاج إلى تعيين OPENAI_API_KEY في متغيرات البيئة الخاصة بك. يمكنك الحصول على مفتاح API من OpenAI.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

إعداد البيانات

أولاً، نحن بحاجة إلى أن نرث من فئتي Milvus_VectorStore و OpenAI_Chat من فانا وتعريف فئة جديدة VannaMilvus تجمع بين القدرات من كليهما.

+
from pymilvus import MilvusClient, model
+from vanna.milvus import Milvus_VectorStore
+from vanna.openai import OpenAI_Chat
+
+
+class VannaMilvus(Milvus_VectorStore, OpenAI_Chat):
+    def __init__(self, config=None):
+        Milvus_VectorStore.__init__(self, config=config)
+        OpenAI_Chat.__init__(self, config=config)
+
+

نقوم بتهيئة فئة VannaMilvus بمعلمات التكوين اللازمة. نستخدم مثيل milvus_client لتخزين التضمينات و model.DefaultEmbeddingFunction() التي تمت تهيئتها من نموذج ميلفوس لتوليد التضمينات.C

+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+
milvus_uri = "./milvus_vanna.db"
+
+milvus_client = MilvusClient(uri=milvus_uri)
+
+vn_milvus = VannaMilvus(
+    config={
+        "api_key": os.getenv("OPENAI_API_KEY"),
+        "model": "gpt-3.5-turbo",
+        "milvus_client": milvus_client,
+        "embedding_function": model.DefaultEmbeddingFunction(),
+        "n_results": 2,  # The number of results to return from Milvus semantic search.
+    }
+)
+
+

هذا مثال بسيط مع عينة قليلة فقط من البيانات، لذلك قمنا بتعيين n_results إلى 2 للتأكد من أننا نبحث عن أعلى نتيجتين متشابهتين. من الناحية العملية، يجب عليك تعيين n_results إلى قيمة أعلى عند التعامل مع مجموعة بيانات تدريبية أكبر.

+

سنستخدم عينة من قاعدة بيانات SQLite مع عدد قليل من الجداول التي تحتوي على بعض البيانات النموذجية.

+
import sqlite3
+
+sqlite_path = "./my-database.sqlite"
+sql_connect = sqlite3.connect(sqlite_path)
+c = sql_connect.cursor()
+
+init_sqls = """
+CREATE TABLE IF NOT EXISTS Customer (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Name TEXT NOT NULL,
+    Company TEXT NOT NULL,
+    City TEXT NOT NULL,
+    Phone TEXT NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS Company (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Name TEXT NOT NULL,
+    Industry TEXT NOT NULL,
+    Location TEXT NOT NULL,
+    EmployeeCount INTEGER NOT NULL
+);
+
+CREATE TABLE IF NOT EXISTS User (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Username TEXT NOT NULL UNIQUE,
+    Email TEXT NOT NULL UNIQUE
+);
+
+INSERT INTO Customer (Name, Company, City, Phone) 
+VALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');
+
+INSERT INTO Customer (Name, Company, City, Phone) 
+VALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');
+
+INSERT INTO Company (Name, Industry, Location, EmployeeCount)
+VALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);
+
+INSERT INTO User (Username, Email)
+VALUES ('johndoe123', 'johndoe123@example.com');
+"""
+
+for sql in init_sqls.split(";"):
+    c.execute(sql)
+
+sql_connect.commit()
+
+# Connect to the SQLite database
+vn_milvus.connect_to_sqlite(sqlite_path)
+
+

تدريب مع البيانات

يمكننا تدريب النموذج على بيانات DDL لقاعدة بيانات SQLite. نحصل على بيانات الـ DDL ونغذي بها الدالة train.

+
# If there exists training data, we should remove it before training.
+existing_training_data = vn_milvus.get_training_data()
+if len(existing_training_data) > 0:
+    for _, training_data in existing_training_data.iterrows():
+        vn_milvus.remove_training_data(training_data["id"])
+
+# Get the DDL of the SQLite database
+df_ddl = vn_milvus.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
+
+# Train the model on the DDL data
+for ddl in df_ddl["sql"].to_list():
+    vn_milvus.train(ddl=ddl)
+
+
Adding ddl: CREATE TABLE Customer (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Name TEXT NOT NULL,
+    Company TEXT NOT NULL,
+    City TEXT NOT NULL,
+    Phone TEXT NOT NULL
+)
+Adding ddl: CREATE TABLE sqlite_sequence(name,seq)
+Adding ddl: CREATE TABLE Company (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Name TEXT NOT NULL,
+    Industry TEXT NOT NULL,
+    Location TEXT NOT NULL,
+    EmployeeCount INTEGER NOT NULL
+)
+Adding ddl: CREATE TABLE User (
+    ID INTEGER PRIMARY KEY AUTOINCREMENT,
+    Username TEXT NOT NULL UNIQUE,
+    Email TEXT NOT NULL UNIQUE
+)
+
+

إلى جانب التدريب على بيانات DDL، يمكننا أيضًا التدريب على الوثائق واستعلامات SQL لقاعدة البيانات.

+
# Add documentation about your business terminology or definitions.
+vn_milvus.train(
+    documentation="ABC Corp specializes in cutting-edge technology solutions and innovation."
+)
+vn_milvus.train(
+    documentation="XYZ Inc is a global leader in manufacturing and supply chain management."
+)
+
+# You can also add SQL queries to your training data.
+vn_milvus.train(sql="SELECT * FROM Customer WHERE Name = 'John Doe'")
+
+
Adding documentation....
+Adding documentation....
+Using model gpt-3.5-turbo for 65.0 tokens (approx)
+Question generated with sql: What are the details of the customer named John Doe? 
+Adding SQL...
+
+
+
+
+
+'595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sql'
+
+

دعونا نلقي نظرة على بيانات التدريب.

+
training_data = vn_milvus.get_training_data()
+training_data
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#المعرفالسؤالالمحتوى
0595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sqlما هي تفاصيل العميل المسمى Joh....حدد * من العميل حيث الاسم = "مجهول الهوية
025f4956c-e370-4097-994f-996f22d145fa-ddlلا يوجدإنشاء جدول إنشاء جدول الشركة (\nالمعرف INTEGER PRIMARY...
1b95ecc66-f65b-49dc-a9f1-c1842ad230ff-ddlلا يوجدإنشاء جدول إنشاء جدول العميل (المعرف INTEGER PRIMAR...
2fcc73d15-30a5-4421-9d73-b8c3b0ed5305-ddlلا يوجدإنشاء جدول sqlite_sequence (الاسم، تسلسل)
3feae618c-5910-4f6f-8b4b-6cc3e03aec06-ddlلا يوجدإنشاء جدول إنشاء مستخدم (\nالمعرف INTEGER PRIMARY KE....
079a48db1-ba1f-4fd5-be99-74f2ca2eaeeb-docلا يوجدشركة XYZ Inc هي شركة رائدة عالميًا في مجال التصنيع...
19f9df1b8-ae62-4823-ad28-d7e0f2d1f4c0-docلا يوجدتتخصص شركة ABC Corp في مجال التكنولوجيا المتطورة...
+
+

إنشاء SQLs وتنفيذها

كما تدربنا على بيانات DDL، أصبحت بنية الجدول متاحة الآن لإنشاء استعلامات SQL.

+

لنجرب سؤالًا بسيطًا.

+
sql = vn_milvus.generate_sql("what is the phone number of John Doe?")
+vn_milvus.run_sql(sql)
+
+
SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\nCREATE TABLE User (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Username TEXT NOT NULL UNIQUE,\n    Email TEXT NOT NULL UNIQUE\n)\n\n\n===Additional Context \n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'what is the phone number of John Doe?'}]
+Using model gpt-3.5-turbo for 367.25 tokens (approx)
+LLM Response: SELECT Phone FROM Customer WHERE Name = 'John Doe'
+
+
+ + + + + + + + + + + + + +
#الهاتف
0123-456-7890
+
+

هنا سؤال أكثر تعقيداً. معلومات اسم شركة التصنيع موجودة في بيانات المستند، وهي معلومات أساسية. سيقوم استعلام SQL الذي تم إنشاؤه باسترداد معلومات العميل بناءً على اسم شركة التصنيع المحددة.

+
sql = vn_milvus.generate_sql("which customer works for a manufacturing corporation?")
+vn_milvus.run_sql(sql)
+
+
SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Company (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Industry TEXT NOT NULL,\n    Location TEXT NOT NULL,\n    EmployeeCount INTEGER NOT NULL\n)\n\nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\n\n===Additional Context \n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'which customer works for a manufacturing corporation?'}]
+Using model gpt-3.5-turbo for 384.25 tokens (approx)
+LLM Response: SELECT * 
+FROM Customer 
+WHERE Company = 'XYZ Inc'
+
+
+ + + + + + + + + + + + + + + + + + + + + +
#المعرفالاسمالشركةالمدينةرقم الهاتف
02جين سميثشركة XYZلوس أنجلوس098-765-4321
+
+

افصل عن SQLite و Milvus وقم بإزالتها لتحرير الموارد.

+
sql_connect.close()
+milvus_client.close()
+
+os.remove(sqlite_path)
+if os.path.exists(milvus_uri):
+    os.remove(milvus_uri)
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.json b/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.json new file mode 100644 index 000000000..a4d216036 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.json @@ -0,0 +1 @@ +{"codeList":["python3 -m pip install pymilvus fiftyone torch torchvision\n","import fiftyone as fo\nimport fiftyone.brain as fob\nimport fiftyone.zoo as foz\n\n# Step 1: Load your data into FiftyOne\ndataset = foz.load_zoo_dataset(\"quickstart\")\n\n# Steps 2 and 3: Compute embeddings and create a similarity index\nmilvus_index = fob.compute_similarity(\n dataset,\n brain_key=\"milvus_index\",\n backend=\"milvus\",\n)\n","# Step 4: Query your data\nquery = dataset.first().id # query by sample ID\nview = dataset.sort_by_similarity(\n query,\n brain_key=\"milvus_index\",\n k=10, # limit to 10 most similar samples\n)\n\n# Step 5 (optional): Cleanup\n\n# Delete the Milvus collection\nmilvus_index.cleanup()\n\n# Delete run record from FiftyOne\ndataset.delete_brain_run(\"milvus_index\")\n","# Step 5: Delete the index\nmilvus_index.delete()\n","import fiftyone.brain as fob\n\nfob.compute_similarity(..., backend=\"milvus\", ...)\n","export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus\n","{\n \"default_similarity_backend\": \"milvus\"\n}\n","export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX\n\n# also available if necessary\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"uri\": \"XXXXXX\",\n \"user\": \"XXXXXX\",\n \"password\": \"XXXXXX\",\n\n # also available if necessary\n \"secure\": true,\n \"token\": \"XXXXXX\",\n \"db_name\": \"XXXXXX\",\n \"client_key_path\": \"XXXXXX\",\n \"client_pem_path\": \"XXXXXX\",\n \"ca_pem_path\": \"XXXXXX\",\n \"server_pem_path\": \"XXXXXX\",\n \"server_name\": \"XXXXXX\"\n }\n }\n}\n","import fiftyone.brain as fob\n\nmilvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","milvus_index = dataset.load_brain_results(\n \"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"collection_name\": \"your_collection\",\n \"metric\": \"dotproduct\",\n \"consistency_level\": \"Strong\"\n }\n }\n}\n","milvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n collection_name=\"your_collection\",\n metric=\"dotproduct\",\n consistency_level=\"Strong\",\n)\n","import fiftyone.brain as fob\n\n# List all brain runs\ndataset.list_brain_runs()\n\n# Only list similarity runs\ndataset.list_brain_runs(type=fob.Similarity)\n\n# Only list specific similarity runs\ndataset.list_brain_runs(\n type=fob.Similarity,\n patches_field=\"ground_truth\",\n supports_prompts=True,\n)\n","info = dataset.get_brain_info(brain_key)\nprint(info)\n","dataset.rename_brain_run(brain_key, new_brain_key)\n","dataset.delete_brain_run(brain_key)\n","# Delete the Milvus collection\nmilvus_index = dataset.load_brain_results(brain_key)\nmilvus_index.cleanup()\n"],"headingContent":"Conduct Vision Searches with Milvus and FiftyOne","anchorList":[{"label":"إجراء عمليات بحث في الرؤية باستخدام Milvus و FiftyOne","href":"Conduct-Vision-Searches-with-Milvus-and-FiftyOne","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"متطلبات التثبيت","href":"Installing-Requirements","type":2,"isActive":false},{"label":"الوصفة الأساسية","href":"Basic-recipe","type":2,"isActive":false},{"label":"الإجراءات","href":"Procedures","type":2,"isActive":false},{"label":"استخدام الواجهة الخلفية لميلفوس","href":"Use-the-Milvus-backend","type":2,"isActive":false},{"label":"المصادقة","href":"Authentication","type":2,"isActive":false},{"label":"إدارة عمليات تشغيل الدماغ","href":"Manage-brain-runs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.md b/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.md new file mode 100644 index 000000000..fa9a4351c --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_voxel51.md @@ -0,0 +1,337 @@ +--- +id: integrate_with_voxel51.md +summary: تناقش هذه الصفحة التكامل مع voxel51 +title: إجراء عمليات بحث في الرؤية باستخدام Milvus و FiftyOne +--- +

إجراء عمليات بحث في الرؤية باستخدام Milvus و FiftyOne

FiftyOne هي أداة مفتوحة المصدر لبناء مجموعات بيانات ونماذج رؤية حاسوبية عالية الجودة. يساعدك هذا الدليل على دمج إمكانيات البحث عن التشابه الخاصة ب Milvus في FiftyOne، مما يتيح لك إجراء عمليات بحث عن الرؤية على مجموعات البيانات الخاصة بك.

+

يوفر FiftyOne واجهة برمجة تطبيقات لإنشاء مجموعات Milvus، وتحميل المتجهات، وتشغيل استعلامات التشابه، سواءً برمجيًا في Python أو عبر التأشير والنقر في التطبيق. يركز العرض التوضيحي في هذه الصفحة على التكامل البرمجي.

+

المتطلبات الأساسية

قبل البدء، تأكد من أن لديك ما يلي:

+ +

متطلبات التثبيت

في هذا المثال، سنستخدم في هذا المثال pymilvus و fiftyone. يمكنك تثبيتها عن طريق تشغيل الأوامر التالية:

+
python3 -m pip install pymilvus fiftyone torch torchvision
+
+

الوصفة الأساسية

سير العمل الأساسي لاستخدام ميلفوس لإنشاء فهرس تشابه على مجموعات بيانات فيفتي ون واستخدامه للاستعلام عن بياناتك هو كالتالي

+
    +
  1. تحميل مجموعة بيانات إلى FiftyOne
  2. +
  3. احسب التضمينات المتجهة للعينات أو البقع في مجموعة البيانات الخاصة بك، أو حدد نموذجًا لاستخدامه في إنشاء التضمينات.
  4. +
  5. استخدم compute_similarity() الطريقة لإنشاء فهرس تشابه ميلفوس للعينات أو رقع الكائنات في مجموعة البيانات عن طريق تعيين المعلمة backend="milvus" وتحديد brain_key من اختيارك.
  6. +
  7. استخدم فهرس تشابه ميلفوس هذا للاستعلام عن بياناتك باستخدام sort_by_similarity().
  8. +
  9. إذا رغبت في ذلك، احذف الفهرس.
  10. +
+

الإجراءات

يوضح المثال أدناه سير العمل أعلاه.

+

1. تحميل مجموعة بيانات إلى FiftyOne وحساب التضمينات للعينات

تستخدم الشيفرة التالية مجموعة الصور النموذجية التي يوفرها FiftyOne لتوضيح التكامل. يمكنك إعداد مجموعة الصور الخاصة بك بالرجوع إلى هذه المقالة.

+
import fiftyone as fo
+import fiftyone.brain as fob
+import fiftyone.zoo as foz
+
+# Step 1: Load your data into FiftyOne
+dataset = foz.load_zoo_dataset("quickstart")
+
+# Steps 2 and 3: Compute embeddings and create a similarity index
+milvus_index = fob.compute_similarity(
+    dataset,
+    brain_key="milvus_index",
+    backend="milvus",
+)
+
+

2. إجراء عمليات البحث عن تشابه الرؤية

يمكنك الآن استخدام فهرس التشابه Milvus لإجراء عمليات بحث عن تشابه الرؤية على مجموعة البيانات الخاصة بك.

+
# Step 4: Query your data
+query = dataset.first().id  # query by sample ID
+view = dataset.sort_by_similarity(
+    query,
+    brain_key="milvus_index",
+    k=10,  # limit to 10 most similar samples
+)
+
+# Step 5 (optional): Cleanup
+
+# Delete the Milvus collection
+milvus_index.cleanup()
+
+# Delete run record from FiftyOne
+dataset.delete_brain_run("milvus_index")
+
+

3. حذف الفهرس

إذا لم تعد بحاجة إلى فهرس تشابه ميلفوس فيمكنك حذفه باستخدام الكود التالي:

+
# Step 5: Delete the index
+milvus_index.delete()
+
+

استخدام الواجهة الخلفية لميلفوس

بشكل افتراضي، استدعاء compute_similarity() أو sort_by_similarity() سيستخدم الواجهة الخلفية ل sklearn.

+

لاستخدام الواجهة الخلفية لـ Milvus، ما عليك سوى تعيين معلمة الواجهة الخلفية الاختيارية compute_similarity() إلى "milvus":

+
import fiftyone.brain as fob
+
+fob.compute_similarity(..., backend="milvus", ...)
+
+

بدلاً من ذلك، يمكنك تهيئة FiftyOne بشكل دائم لاستخدام الواجهة الخلفية لـ Milvus من خلال تعيين متغير البيئة التالي

+
export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
+
+

أو عن طريق تعيين المعلمة default_similarity_backend من تكوين الدماغ الموجود في ~/.fiftyone/brain_config.json:

+
{
+    "default_similarity_backend": "milvus"
+}
+
+

المصادقة

إذا كنت تستخدم خادم Milvus مخصص، يمكنك توفير بيانات الاعتماد الخاصة بك بعدة طرق.

+

الطريقة الموصى بها لتهيئة بيانات اعتماد ميلفوس الخاصة بك هي تخزينها في متغيرات البيئة الموضحة أدناه، والتي يتم الوصول إليها تلقائيًا بواسطة فيفتي ون كلما تم إجراء اتصال بميلفوس.

+
export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
+
+# also available if necessary
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
+export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
+
+

تهيئة دماغ فيفتي ون

يمكنك أيضًا تخزين بيانات الاعتماد الخاصة بك في تكوين الدماغ الموجود في ~/.fiftyone/brain_config.json:

+
{
+    "similarity_backends": {
+        "milvus": {
+            "uri": "XXXXXX",
+            "user": "XXXXXX",
+            "password": "XXXXXX",
+
+            # also available if necessary
+            "secure": true,
+            "token": "XXXXXX",
+            "db_name": "XXXXXX",
+            "client_key_path": "XXXXXX",
+            "client_pem_path": "XXXXXX",
+            "ca_pem_path": "XXXXXX",
+            "server_pem_path": "XXXXXX",
+            "server_name": "XXXXXX"
+        }
+    }
+}
+
+

لاحظ أن هذا الملف لن يكون موجوداً حتى تقوم بإنشائه.

+

وسيطات الكلمات الرئيسية

يمكنك تقديم بيانات اعتماد ميلفوس يدويًا كوسيطات كلمات رئيسية في كل مرة تستدعي فيها طرقًا مثل compute_similarity() التي تتطلب الاتصال بـ Milvus:

+
import fiftyone.brain as fob
+
+milvus_index = fob.compute_similarity(
+    ...
+    backend="milvus",
+    brain_key="milvus_index",
+    uri="XXXXXX",
+    user="XXXXXX",
+    password="XXXXXX",
+
+    # also available if necessary
+    secure=True,
+    token="XXXXXX",
+    db_name="XXXXXX",
+    client_key_path="XXXXXX",
+    client_pem_path="XXXXXX",
+    ca_pem_path="XXXXXX",
+    server_pem_path="XXXXXX",
+    server_name="XXXXXX",
+)
+
+

لاحظ أنه عند استخدام هذه الاستراتيجية، يجب عليك توفير بيانات الاعتماد يدويًا عند تحميل فهرس لاحقًا عبر load_brain_results():

+
milvus_index = dataset.load_brain_results(
+    "milvus_index",
+    uri="XXXXXX",
+    user="XXXXXX",
+    password="XXXXXX",
+
+    # also available if necessary
+    secure=True,
+    token="XXXXXX",
+    db_name="XXXXXX",
+    client_key_path="XXXXXX",
+    client_pem_path="XXXXXX",
+    ca_pem_path="XXXXXX",
+    server_pem_path="XXXXXX",
+    server_name="XXXXXX",
+)
+
+

معلمات تكوين ميلفوس

تدعم الواجهة الخلفية لـ Milvus مجموعة متنوعة من معلمات الاستعلام التي يمكن استخدامها لتخصيص استعلامات التشابه الخاصة بك. تتضمن هذه المعلمات ما يلي:

+
    +
  • اسم_المجموعة(بلا): اسم مجموعة Milvus المراد استخدامها أو إنشاؤها. إذا لم يتم توفير أي منها، سيتم إنشاء مجموعة جديدة

  • +
  • المقياس ("dotproduct"): مقياس مسافة التضمين المراد استخدامه عند إنشاء فهرس جديد. القيم المدعومة هي ("dotproduct" ، "euclidean")

  • +
  • مستوى_الاتساق ("الجلسة"): مستوى الاتساق المطلوب استخدامه. القيم المدعومة هي ("Strong" ، "Session" ، ، "Bounded" ، "Eventually")

  • +
+

للحصول على معلومات مفصلة حول هذه المعلمات، راجع وثائق مصادقة Milvus ووثائق مستويات الاتساق في Milvus.

+

يمكنك تحديد هذه المعلمات عبر أي من الاستراتيجيات الموضحة في القسم السابق. فيما يلي مثال على تكوين الدماغ الذي يتضمن جميع المعلمات المتاحة:

+
{
+    "similarity_backends": {
+        "milvus": {
+            "collection_name": "your_collection",
+            "metric": "dotproduct",
+            "consistency_level": "Strong"
+        }
+    }
+}
+
+

ومع ذلك، عادةً ما يتم تمرير هذه المعلمات مباشرةً إلى compute_similarity() لتكوين فهرس جديد محدد:

+
milvus_index = fob.compute_similarity(
+    ...
+    backend="milvus",
+    brain_key="milvus_index",
+    collection_name="your_collection",
+    metric="dotproduct",
+    consistency_level="Strong",
+)
+
+

إدارة عمليات تشغيل الدماغ

يوفر FiftyOne مجموعة متنوعة من الطرق التي يمكنك استخدامها لإدارة عمليات تشغيل الدماغ.

+

على سبيل المثال، يمكنك استدعاء list_brain_runs() لرؤية مفاتيح الدماغ المتوفرة في مجموعة بيانات:

+
import fiftyone.brain as fob
+
+# List all brain runs
+dataset.list_brain_runs()
+
+# Only list similarity runs
+dataset.list_brain_runs(type=fob.Similarity)
+
+# Only list specific similarity runs
+dataset.list_brain_runs(
+    type=fob.Similarity,
+    patches_field="ground_truth",
+    supports_prompts=True,
+)
+
+

أو يمكنك استخدام get_brain_info() لاسترجاع معلومات حول تكوين تشغيل دماغ:

+
info = dataset.get_brain_info(brain_key)
+print(info)
+
+

استخدم load_brain_results() لتحميل SimilarityIndex مثيل لتشغيل دماغ.

+

يمكنك استخدام rename_brain_run() لإعادة تسمية مفتاح الدماغ المرتبط بتشغيل نتائج تشابه موجودة:

+
dataset.rename_brain_run(brain_key, new_brain_key)
+
+

وأخيراً، يمكنك استخدام delete_brain_run() لحذف تشغيل دماغ:

+
dataset.delete_brain_run(brain_key)
+
+
+

استدعاء delete_brain_run() يحذف فقط سجل التشغيل الدماغي من مجموعة بيانات FiftyOne، ولن يحذف أي مجموعة Milvus مرتبطة بها، وهو ما يمكنك القيام به على النحو التالي:

+
# Delete the Milvus collection
+milvus_index = dataset.load_brain_results(brain_key)
+milvus_index.cleanup()
+
+
+

للاطلاع على سير عمل البحث المتجه الشائع على مجموعة بيانات FiftyOne باستخدام الواجهة الخلفية لـ Milvus، انظر الأمثلة هنا.

diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.json b/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.json new file mode 100644 index 000000000..7d1650eb6 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade voyageai pymilvus\n","import voyageai\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"voyage-law-2\" # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models\nDIMENSION = 1024 # Dimension of vector embedding\n\n# Connect to VoyageAI with API Key.\nvoyage_client = voyageai.Client(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_voyage_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_voyage_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = voyage_client.embed(\n texts=queries, model=MODEL_NAME, truncation=False\n).embeddings\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n"],"headingContent":"Semantic Search with Milvus and VoyageAI","anchorList":[{"label":"البحث الدلالي باستخدام Milvus وVoyageAI","href":"Semantic-Search-with-Milvus-and-VoyageAI","type":1,"isActive":false},{"label":"الشروع في العمل","href":"Getting-started","type":2,"isActive":false},{"label":"البحث في عناوين الكتب باستخدام VoyageAI & Milvus","href":"Searching-book-titles-with-VoyageAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.md b/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.md new file mode 100644 index 000000000..bd6e406aa --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_voyageai.md @@ -0,0 +1,136 @@ +--- +id: integrate_with_voyageai.md +title: البحث الدلالي باستخدام Milvus وVoyageAI +summary: >- + تناقش هذه الصفحة تكامل قاعدة بيانات المتجهات مع واجهة برمجة تطبيقات التضمين + الخاصة ب VoyageAI. +--- +

البحث الدلالي باستخدام Milvus وVoyageAI

Open In Colab +GitHub Repository

+

يستعرض هذا الدليل كيف يمكن استخدام واجهة برمجة تطبيقات التضمين من VoyageAI مع قاعدة بيانات Milvus المتجهة لإجراء بحث دلالي على النص.

+

الشروع في العمل

قبل أن تبدأ، تأكد من أن لديك مفتاح Voyage API جاهزًا، أو يمكنك الحصول عليه من موقع VoyageAI.

+

البيانات المستخدمة في هذا المثال هي عناوين الكتب. يمكنك تنزيل مجموعة البيانات من هنا ووضعها في نفس الدليل حيث تقوم بتشغيل الشيفرة التالية.

+

أولاً، قم بتثبيت الحزمة الخاصة بـ Milvus و Voyage AI:

+
$ pip install --upgrade voyageai pymilvus
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

بهذا، نكون جاهزين لإنشاء التضمينات واستخدام قاعدة بيانات المتجهات لإجراء بحث دلالي.

+

البحث في عناوين الكتب باستخدام VoyageAI & Milvus

في المثال التالي، نقوم بتحميل بيانات عناوين الكتب من ملف CSV الذي تم تنزيله، ونستخدم نموذج التضمين Voyage AI لتوليد تمثيلات متجهة، ونخزنها في قاعدة بيانات Milvus المتجهة للبحث الدلالي.

+
import voyageai
+from pymilvus import MilvusClient
+
+MODEL_NAME = "voyage-law-2"  # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models
+DIMENSION = 1024  # Dimension of vector embedding
+
+# Connect to VoyageAI with API Key.
+voyage_client = voyageai.Client(api_key="<YOUR_VOYAGEAI_API_KEY>")
+
+docs = [
+    "Artificial intelligence was founded as an academic discipline in 1956.",
+    "Alan Turing was the first person to conduct substantial research in AI.",
+    "Born in Maida Vale, London, Turing was raised in southern England.",
+]
+
+vectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings
+
+# Prepare data to be stored in Milvus vector database.
+# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
+data = [
+    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
+    for i in range(len(docs))
+]
+
+
+# Connect to Milvus, all data is stored in a local file named "milvus_voyage_demo.db"
+# in current directory. You can also connect to a remote Milvus server following this
+# instruction: https://milvus.io/docs/install_standalone-docker.md.
+milvus_client = MilvusClient(uri="milvus_voyage_demo.db")
+COLLECTION_NAME = "demo_collection"  # Milvus collection name
+# Create a collection to store the vectors and text.
+if milvus_client.has_collection(collection_name=COLLECTION_NAME):
+    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
+milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
+
+# Insert all data into Milvus vector database.
+res = milvus_client.insert(collection_name="demo_collection", data=data)
+
+print(res["insert_count"])
+
+
+

أما بالنسبة لحجة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

مع وجود جميع البيانات في قاعدة بيانات Milvus vector، يمكننا الآن إجراء بحث دلالي عن طريق إنشاء تضمين متجه للاستعلام وإجراء بحث متجه.

+
queries = ["When was artificial intelligence founded?"]
+
+query_vectors = voyage_client.embed(
+    texts=queries, model=MODEL_NAME, truncation=False
+).embeddings
+
+res = milvus_client.search(
+    collection_name=COLLECTION_NAME,  # target collection
+    data=query_vectors,  # query vectors
+    limit=2,  # number of returned entities
+    output_fields=["text", "subject"],  # specifies fields to be returned
+)
+
+for q in queries:
+    print("Query:", q)
+    for result in res:
+        print(result)
+    print("\n")
+
+
Query: When was artificial intelligence founded?
+[{'id': 0, 'distance': 0.7196218371391296, 'entity': {'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}}, {'id': 1, 'distance': 0.6297335028648376, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.json b/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.json new file mode 100644 index 000000000..f8c896e08 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus, whyhow_rbr\n","from pymilvus import MilvusClient\n\n# Milvus Lite local path\npath=\"./milvus_demo.db\" # random name for local milvus lite db path\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(path)\n","from pymilvus import MilvusClient\n\n# Milvus Cloud credentials\nYOUR_MILVUS_CLOUD_END_POINT = \"YOUR_MILVUS_CLOUD_END_POINT\"\nYOUR_MILVUS_CLOUD_TOKEN = \"YOUR_MILVUS_CLOUD_TOKEN\"\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(\n milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, \n milvus_token=YOUR_MILVUS_CLOUD_TOKEN,\n)\n","# Define collection name\nCOLLECTION_NAME=\"YOUR_COLLECTION_NAME\" # take your own collection name\n\n# Define vector dimension size\nDIMENSION=1536 # decide by the model you use\n","schema = milvus_client.create_schema(auto_id=True) # Enable id matching\n\nschema = milvus_client.add_field(schema=schema, field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema = milvus_client.add_field(schema=schema, field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# Start to indexing data field\nindex_params = milvus_client.prepare_index_params()\nindex_params = milvus_client.add_index(\n index_params=index_params, # pass in index_params object\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n","# Create Collection\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n schema=schema,\n index_params=index_params\n)\n","# get pdfs\npdfs = [\"harry-potter.pdf\", \"game-of-thrones.pdf\"] # replace to your pdfs path\n\n# Uploading the PDF document\nmilvus_client.upload_documents(\n collection_name=COLLECTION_NAME,\n documents=pdfs\n)\n","# Search data and implement RAG!\nres = milvus_client.search(\n question='What food does Harry Potter like to eat?',\n collection_name=COLLECTION_NAME,\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# RULES(search on book harry-potter on page 8):\nPARTITION_NAME='harry-potter' # search on books\npage_number='page_number == 8'\n\n# first create a partitions to store the book and later search on this specific partition:\nmilvus_client.crate_partition(\n collection_name=COLLECTION_NAME,\n partition_name=PARTITION_NAME # separate base on your pdfs type\n)\n\n# search with rules\nres = milvus_client.search(\n question='Tell me about the greedy method',\n collection_name=COLLECTION_NAME,\n partition_names=PARTITION_NAME,\n filter=page_number, # append any rules follow the Boolean Expression Rule\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# Clean up\nmilvus_client.drop_collection(\n collection_name=COLLECTION_NAME\n)\n"],"headingContent":"Integrate Milvus with WhyHow","anchorList":[{"label":"دمج Milvus مع WhyHow","href":"Integrate-Milvus-with-WhyHow","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"التثبيت","href":"Installation","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-Collection","type":2,"isActive":false},{"label":"تحميل المستندات","href":"Upload-documents","type":2,"isActive":false},{"label":"الإجابة عن الأسئلة","href":"Question-answering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.md b/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.md new file mode 100644 index 000000000..d3d491536 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrate_with_whyhow.md @@ -0,0 +1,218 @@ +--- +id: integrate_with_whyhow.md +summary: >- + يوضّح هذا الدليل كيفية استخدام Whyhow.ai وMilvus Lite لإجراء الاسترجاع المستند + إلى القواعد. +title: دمج Milvus مع WhyHow +--- +

دمج Milvus مع WhyHow

يوضّح هذا الدليل كيفية استخدام Whyhow.ai وMilvus Lite لإجراء الاسترجاع القائم على القواعد.

+

نظرة عامة

WhyHow عبارة عن منصة توفر للمطورين اللبنات الأساسية التي يحتاجونها لتنظيم البيانات غير المهيكلة ووضعها في سياقها واسترجاعها بشكل موثوق لإجراء الاسترجاع القائم على القواعد المعقدة. حزمة الاسترجاع المستند إلى القواعد هي حزمة Python تم تطويرها بواسطة WhyHow والتي تمكّن الأشخاص من إنشاء وإدارة تطبيقات الاسترجاع المعزز (RAG) مع إمكانات تصفية متقدمة.

+

التثبيت

قبل البدء، يرجى تثبيت جميع حزم بايثون الضرورية لاستخدامها لاحقًا.

+
pip install --upgrade pymilvus, whyhow_rbr
+
+

بعد ذلك، نحتاج إلى تهيئة عميل Milvus لتنفيذ الاسترجاع القائم على القواعد باستخدام Milvus Lite.

+
from pymilvus import MilvusClient
+
+# Milvus Lite local path
+path="./milvus_demo.db" # random name for local milvus lite db path
+
+# Initialize the ClientMilvus
+milvus_client = ClientMilvus(path)
+
+

يمكنك أيضًا تهيئة عميل Milvus من خلال Milvus Cloud

+
from pymilvus import MilvusClient
+
+# Milvus Cloud credentials
+YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
+YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
+
+# Initialize the ClientMilvus
+milvus_client = ClientMilvus(
+        milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, 
+        milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
+)
+
+

إنشاء مجموعة

تحديد المتغيرات الضرورية

# Define collection name
+COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
+
+# Define vector dimension size
+DIMENSION=1536 # decide by the model you use
+
+

إضافة مخطط

قبل إدراج أي بيانات في قاعدة بيانات Milvus Lite، نحتاج أولاً إلى تحديد حقل البيانات، والذي يسمى المخطط هنا. من خلال إنشاء كائن CollectionSchema وإضافة حقل بيانات من خلال add_field() ، يمكننا التحكم في نوع البيانات وخصائصها. هذه الخطوة إلزامية قبل إدراج أي بيانات في ميلفوس.

+
schema = milvus_client.create_schema(auto_id=True) # Enable id matching
+
+schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
+schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
+
+

إنشاء فهرس

لكل مخطط، من الأفضل أن يكون لدينا فهرس حتى يكون الاستعلام أكثر كفاءة. لإنشاء فهرس، نحتاج أولاً إلى index_params ثم نضيف لاحقًا المزيد من بيانات الفهرس على هذا الكائن IndexParams.

+
# Start to indexing data field
+index_params = milvus_client.prepare_index_params()
+index_params = milvus_client.add_index(
+    index_params=index_params,  # pass in index_params object
+    field_name="embedding",
+    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
+    metric_type="COSINE",  # L2, COSINE, or IP
+)
+
+

هذه الطريقة عبارة عن غلاف رفيع حول تطبيق Milvus الرسمي(المستندات الرسمية).

+

إنشاء مجموعة

بعد تحديد جميع حقول البيانات وفهرستها، نحتاج الآن إلى إنشاء مجموعة قاعدة البيانات الخاصة بنا حتى نتمكن من الوصول إلى بياناتنا بسرعة ودقة. ما يجب ذكره هو أننا قمنا بتهيئة enable_dynamic_field ليكون صحيحًا حتى تتمكن من تحميل أي بيانات بحرية. التكلفة هي أن الاستعلام عن البيانات قد يكون غير فعال.

+
# Create Collection
+milvus_client.create_collection(
+    collection_name=COLLECTION_NAME,
+    schema=schema,
+    index_params=index_params
+)
+
+

تحميل المستندات

بعد إنشاء مجموعة، نكون مستعدين لتعبئتها بالمستندات. في whyhow_rbr يتم ذلك باستخدام طريقة upload_documents من MilvusClient. يقوم بتنفيذ الخطوات التالية تحت الغطاء:

+
    +
  • المعالجة المسبقة: قراءة ملفات PDF المتوفرة وتقسيمها إلى أجزاء
  • +
  • التضمين: تضمين جميع الأجزاء باستخدام نموذج OpenAI
  • +
  • التضمين: تحميل كل من التضمينات والبيانات الوصفية إلى Milvus Lite
  • +
+
# get pdfs
+pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
+
+# Uploading the PDF document
+milvus_client.upload_documents(
+    collection_name=COLLECTION_NAME,
+    documents=pdfs
+)
+
+

الإجابة عن الأسئلة

يمكننا الآن الانتقال أخيرًا إلى التوليد المعزز للاسترجاع.

+
# Search data and implement RAG!
+res = milvus_client.search(
+    question='What food does Harry Potter like to eat?',
+    collection_name=COLLECTION_NAME,
+    anns_field='embedding',
+    output_fields='text'
+)
+print(res['answer'])
+print(res['matches'])
+
+

القواعد

في المثال السابق، تم النظر في كل مستند في فهرسنا. ومع ذلك، قد يكون من المفيد أحيانًا استرداد المستندات التي تستوفي بعض الشروط المحددة مسبقًا فقط (على سبيل المثال filename=harry-potter.pdf). في whyhow_rbr من خلال ميلفوس لايت، يمكن القيام بذلك من خلال ضبط معلمات البحث.

+

يمكن أن تتحكم القاعدة في سمات البيانات الوصفية التالية

+
    +
  • filename اسم الملف
  • +
  • page_numbers قائمة الأعداد الصحيحة المقابلة لأرقام الصفحات (فهرسة 0)
  • +
  • id المعرف الفريد للقطعة (هذا هو المرشح الأكثر "تطرفًا")
  • +
  • قواعد أخرى تستند إلى تعبيرات منطقية
  • +
+
# RULES(search on book harry-potter on page 8):
+PARTITION_NAME='harry-potter' # search on books
+page_number='page_number == 8'
+
+# first create a partitions to store the book and later search on this specific partition:
+milvus_client.crate_partition(
+    collection_name=COLLECTION_NAME,
+    partition_name=PARTITION_NAME # separate base on your pdfs type
+)
+
+# search with rules
+res = milvus_client.search(
+    question='Tell me about the greedy method',
+    collection_name=COLLECTION_NAME,
+    partition_names=PARTITION_NAME,
+    filter=page_number, # append any rules follow the Boolean Expression Rule
+    anns_field='embedding',
+    output_fields='text'
+)
+print(res['answer'])
+print(res['matches'])
+
+

في هذا المثال، نقوم أولاً بإنشاء قسم لتخزين ملفات PDF ذات الصلة بـ harry-potter، ومن خلال البحث داخل هذا القسم، يمكننا الحصول على المعلومات الأكثر مباشرة. أيضًا، نطبّق أرقام الصفحات كمرشح لتحديد الصفحة التي نرغب في البحث عنها بالضبط. تذكّر، يجب أن تتبع معلمة عامل التصفية القاعدة المنطقية.

+

التنظيف

أخيرًا، بعد تنفيذ جميع التعليمات، يمكنك تنظيف قاعدة البيانات عن طريق الاتصال بـ drop_collection().

+
# Clean up
+milvus_client.drop_collection(
+    collection_name=COLLECTION_NAME
+)
+
diff --git a/localization/v2.5.x/site/ar/integrations/integrations_overview.json b/localization/v2.5.x/site/ar/integrations/integrations_overview.json new file mode 100644 index 000000000..46d772a59 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrations_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Integrations Overview","anchorList":[{"label":"نظرة عامة على عمليات التكامل","href":"Integrations-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/integrations_overview.md b/localization/v2.5.x/site/ar/integrations/integrations_overview.md new file mode 100644 index 000000000..13e057d04 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/integrations_overview.md @@ -0,0 +1,80 @@ +--- +id: integrations_overview.md +summary: >- + توفر لك هذه الصفحة قائمة من البرامج التعليمية للتفاعل مع Milvus وأدوات الطرف + الثالث. +title: نظرة عامة على عمليات التكامل +--- +

نظرة عامة على عمليات التكامل

توفر لك هذه الصفحة قائمة من البرامج التعليمية للتفاعل مع Milvus وأدوات الطرف الثالث.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
البرنامج التعليميحالة الاستخدامالشركاء أو المكدسات
RAG مع ميلفوس وLlamaIndexRAGميلفوس، لاما إندكس
RAG مع Milvus وLangChainRAGميلفوس، لانغشين
مسترجع البحث الهجين ميلفوس في مسترجع البحث الهجين في لانجتشينالبحث الهجينميلفوس، لانجتشين
البحث الدلالي باستخدام Milvus و OpenAIالبحث الدلاليميلفوس، OpenAI
الإجابة عن الأسئلة باستخدام ميلفوس و Cohereالبحث الدلاليميلفوس، كوهير
الإجابة عن الأسئلة باستخدام Milvus وHuggingFaceالإجابة عن الأسئلةميلفوس، عناق الوجه
البحث عن الصور باستخدام ميلفوس وبيتورشالبحث الدلاليميلفوس، بيتورش
البحث في الأفلام باستخدام Milvus و SentenceTransfromersالبحث الدلاليميلفوس، محولات الجمل
استخدام ميلفوس كمخزن متجه في لانج تشينالبحث الدلاليميلفوس، لانجتشين
RAG مع ميلفوس وهايستاكRAGميلفوس، هايستاك
إجراء عمليات بحث دلالي باستخدام ميلفوس و FiftyOneالبحث الدلاليميلفوس، فيفتي وان
البحث الدلالي باستخدام Milvus وVoyageAIالبحث الدلاليميلفوس، فوياج إيه آي
البحث الدلالي باستخدام Milvus و BentoMLRAGميلفوس و BentoML
RAG مع Milvus و DSPyRAGميلفوس، DSPy
البحث الدلالي مع ميلفوس وجيناالبحث الدلاليميلفوس، جينا
ميلفوس على خدمات حاويات سنوباركاتصال البياناتميلفوس، سنوبارك
الاسترجاع المستند إلى القواعد مع ميلفوس و لماذا كيفالإجابة على الأسئلةميلفوس، لماذا كيف
ميلفوس في لانجفوسقابلية الملاحظةميلفوس، لانجفوس
تقييم RAG مع راجاس وميلفوسالتقييمميلفوس، راغاس
وكيل الدردشة الآلية مع ميلفوس وMemGPTالوكيلميلفوس وMemGPT
كيفية نشر FastGPT مع Milvusراغاسميلفوس، FastGPT
كتابة SQL مع فانا وميلفوسRAGميلفوس وفانا
RAG مع ميلفوس وجملRAGميلفوس، كاميل
Airbyte & Milvus: بنية تحتية مفتوحة المصدر لنقل البياناتاتصال البياناتميلفوس، إيربايت
بحث الفيديو المتقدم: الاستفادة من مختبرات Twelve Labs و Milvus للاسترجاع الدلاليالبحث الدلاليميلفوس، مختبرات تويلفوس
بناء RAG باستخدام Milvus وvLLLM وLama 3.1RAGميلفوس، vLLLM، لاما إندكس
أنظمة متعددة الوكلاء مع ميسترال للذكاء الاصطناعي وميلفوس و Llama-agentsالوكيلميلفوس, ميسترال للذكاء الاصطناعي, لاما إندكس
ربط كافكا مع ميلفوسمصادر البياناتميلفوس، كافكا
كوتايمون RAG مع ميلفوسRAGميلفوس، كوتيمون
التوليد المعزز للاسترجاع: الزحف إلى المواقع الإلكترونية باستخدام Apify وحفظ البيانات في ميلفوس للإجابة عن الأسئلةمصادر البياناتميلفوس، أبيفاي
التقييم باستخدام DeepEvalالتقييم والملاحظةميلفوس، ديب إيفال
التقييم باستخدام Arize Pheonixالتقييم والملاحظةميلفوس وأريز فيونيكس
نشر ديفي مع ميلفوسالتقييم والملاحظةميلفوس، ديفاي
بناء نظام RAG باستخدام لانجفلو مع ميلفوسأوتشستراتشنميلفوس، لانجفلو
بناء RAG على بنية الذراعRAGميلفوس، ذراع
بناء RAG باستخدام Milvus وFireworks AIذراعميلفوس، فايرووركس للذكاء الاصطناعي
بناء RAG مع ميلفوس وذكاء اصطناعي ليبتونLLMsميلفوس، ليبتون للذكاء الاصطناعي
بناء RAG مع ميلفوس وسيليكون فلوأجهزة LLMsميلفوس، سيليكون فلو
بناء RAG باستخدام Milvus وMilvus وLeptonمصادر البياناتميلفوس، غير المهيكلة
بناء RAG باستخدام Milvus + قناع PII Maskerمصادر البياناتميلفوس، ماسك معلومات تحديد الهوية الشخصية
استخدام Milvus في PrivateGPTالتنسيقالبحث المتجه
البدء باستخدام ميم0 وميلفوسالوكلاءميم0، ميلفوس
جدول المعرفة مع ميلفوسهندسة المعرفةجدول المعرفة، ميلفوس
استخدام Milvus في DocsGPTالتنسيقدوكس جي بي تي، ميلفوس
استخدام Milvus مع SambaNovaالتنسيقميلفوس، سامبا نوفا
بناء RAG مع Milvus وCogneeهندسة المعرفةميلفوس، كوجني
بناء RAG مع ميلفوس وجيمينيLLMsميلفوس، جيميني
بناء RAG مع ميلفوس وأولامال.ل.مميلفوس، أولاما
بدء الاستخدام مع Dynamiq وMilvusالتنسيقميلفوس، ديناميك
بناء RAG مع ميلفوس وDeepSeekل.ل.مميلفوس، ديبسيك
diff --git a/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.json b/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.json new file mode 100644 index 000000000..7dfcf6103 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ tar -xzf kafka_2.13-3.6.1.tgz\n$ cd kafka_2.13-3.6.1\n","$ bin/zookeeper-server-start.sh config/zookeeper.properties\n","$ bin/kafka-server-start.sh config/server.properties\n","$ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092\n","key.converter.schemas.enable=false\nvalue.converter.schemas.enable=false\nplugin.path=libs/zilliz-kafka-connect-milvus-xxx\n","name=zilliz-kafka-connect-milvus\nconnector.class=com.milvus.io.kafka.MilvusSinkConnector\npublic.endpoint=https://:port\ntoken=*****************************************\ncollection.name=topic_0\ntopics=topic_0\n","$ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties\n","bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092 \n>{\"id\": 0, \"title\": \"The Reported Mortality Rate of Coronavirus Is Not Important\", \"title_vector\": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], \"link\": \"https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912\"}\n"],"headingContent":"Connect Kafka with Milvus","anchorList":[{"label":"ربط كافكا مع ميلفوس","href":"Connect-Kafka-with-Milvus","type":1,"isActive":false},{"label":"الخطوة 1: تنزيل المكون الإضافي kafka-connect-milvus","href":"Step-1-Download-the-kafka-connect-milvus-plugin","type":2,"isActive":false},{"label":"الخطوة 2: تنزيل كافكا","href":"Step-2-Download-Kafka","type":2,"isActive":false},{"label":"الخطوة 3: ابدأ تشغيل بيئة كافكا","href":"STEP-3-Start-the-Kafka-Environment","type":2,"isActive":false},{"label":"الخطوة 4: تكوين كافكا وزيليز كلاود","href":"Step-4-Configure-Kafka-and-Zilliz-Cloud","type":2,"isActive":false},{"label":"الخطوة 5: تحميل المكون الإضافي kafka-connect-milvus إلى مثيل كافكا","href":"Step-5-Load-the-kafka-connect-milvus-plugin-to-Kafka-Instance","type":2,"isActive":false},{"label":"الخطوة 6: تشغيل الموصل","href":"Step-6-Launch-the-connector","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.md b/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.md new file mode 100644 index 000000000..efa24fba4 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/kafka-connect-milvus.md @@ -0,0 +1,181 @@ +--- +id: kafka-connect-milvus.md +summary: >- + نعرض في دليل البدء السريع هذا كيفية إعداد كافكا مفتوحة المصدر وزيليز كلاود + لاستيعاب البيانات المتجهة. +title: دمج Milvus مع WhyHow +--- +

ربط كافكا مع ميلفوس

نوضح في دليل البدء السريع هذا كيفية إعداد كافكا مفتوحة المصدر وزيليز كلاود لاستيعاب البيانات المتجهة.

+

الخطوة 1: تنزيل المكون الإضافي kafka-connect-milvus

أكمل الخطوات التالية لتنزيل الإضافة kafka-connect-milvus.

+
    +
  1. قم بتنزيل أحدث ملف مضغوط للمكوّن الإضافي zilliz-kafka-connect-milvus-xxx.zip من هنا.
  2. +
+

الخطوة 2: تنزيل كافكا

    +
  1. قم بتنزيل أحدث ملف كافكا من هنا.
  2. +
  3. قم بفك ضغط الملف الذي تم تنزيله وانتقل إلى دليل كافكا.
  4. +
+
$ tar -xzf kafka_2.13-3.6.1.tgz
+$ cd kafka_2.13-3.6.1
+
+

الخطوة 3: ابدأ تشغيل بيئة كافكا

+

ملاحظة: يجب أن تكون بيئتك المحلية مثبت بها Java 8+.

+
+

قم بتشغيل الأوامر التالية لبدء تشغيل جميع الخدمات بالترتيب الصحيح:

+
    +
  1. ابدأ تشغيل خدمة ZooKeeper

    +
    $ bin/zookeeper-server-start.sh config/zookeeper.properties
    +
  2. +
  3. ابدأ تشغيل خدمة وسيط كافكا

    +

    افتح جلسة طرفية أخرى وقم بتشغيلها:

    +
    $ bin/kafka-server-start.sh config/server.properties
    +
  4. +
+

بمجرد تشغيل جميع الخدمات بنجاح، سيكون لديك بيئة كافكا الأساسية قيد التشغيل وجاهزة للاستخدام.

+
    +
  • راجع دليل البدء السريع الرسمي من كافكا للحصول على التفاصيل: https://kafka.apache.org/quickstart
  • +
+

الخطوة 4: تكوين كافكا وزيليز كلاود

تأكد من إعداد وتهيئة كافكا وزيليز كلاود بشكل صحيح.

+
    +
  1. إذا لم يكن لديك موضوع بالفعل في كافكا، قم بإنشاء موضوع (على سبيل المثال topic_0) في كافكا.

    +
    $ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092
    +
  2. +
  3. إذا لم يكن لديك بالفعل مجموعة في زيليز كلاود، فأنشئ مجموعة مع حقل متجه (في هذا المثال المتجه dimension=8). يمكنك استخدام مثال المخطط التالي على زيليز كلاود:

    +

    +

    +

    ملاحظة: تأكد من تطابق المخطط على كلا الجانبين. في المخطط، يوجد حقل متجه واحد فقط. أسماء كل حقل على كلا الجانبين هي نفسها تمامًا.

    +

  4. +
+

الخطوة 5: تحميل المكون الإضافي kafka-connect-milvus إلى مثيل كافكا

    +
  1. فك ضغط الملف zilliz-kafka-connect-milvus-xxx.zip الذي قمت بتحميله في الخطوة 1.

  2. +
  3. انسخ الدلائل zilliz-kafka-connect-milvus إلى الدليل libs من تثبيت كافكا الخاص بك.

  4. +
  5. قم بتعديل الملف connect-standalone.properties في الدليل config الخاص بتثبيت كافكا الخاص بك.

    +
    key.converter.schemas.enable=false
    +value.converter.schemas.enable=false
    +plugin.path=libs/zilliz-kafka-connect-milvus-xxx
    +
  6. +
  7. قم بإنشاء وتكوين ملف milvus-sink-connector.properties في الدليل config الخاص بتثبيت كافكا الخاص بك.

    +
    name=zilliz-kafka-connect-milvus
    +connector.class=com.milvus.io.kafka.MilvusSinkConnector
    +public.endpoint=https://<public.endpoint>:port
    +token=*****************************************
    +collection.name=topic_0
    +topics=topic_0
    +
  8. +
+

الخطوة 6: تشغيل الموصل

    +
  1. ابدأ تشغيل الموصل بملف التكوين السابق

    +
    $ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties
    +
  2. +
  3. جرّب إنتاج رسالة إلى موضوع كافكا الذي قمت بإنشائه للتو في كافكا

    +
    bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092                        
    +>{"id": 0, "title": "The Reported Mortality Rate of Coronavirus Is Not Important", "title_vector": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], "link": "https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912"}
    +
  4. +
  5. تحقق مما إذا تم إدراج الكيان في المجموعة في زيليز كلاود. هذا ما يبدو عليه الأمر في زيليز كلاود إذا نجح الإدراج:

    +

  6. +
+

الدعم

إذا كنت بحاجة إلى أي مساعدة أو كانت لديك أسئلة بخصوص موصل Kafka Connect Milvus Connector، فلا تتردد في التواصل مع فريق الدعم لدينا: البريد الإلكتروني: support@zilliz.com

diff --git a/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.json b/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.json new file mode 100644 index 000000000..84ba44a74 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/whyhow-ai/knowledge-table.git\n","$ docker compose up -d --build\n","$ docker compose down\n"],"headingContent":"Knowledge Table with Milvus","anchorList":[{"label":"جدول المعرفة مع ميلفوس","href":"Knowledge-Table-with-Milvus","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"استنساخ المشروع","href":"Cloning-the-project","type":2,"isActive":false},{"label":"إعداد البيئة","href":"Set-up-the-environment","type":2,"isActive":false},{"label":"بدء تشغيل التطبيق","href":"Starting-the-app","type":2,"isActive":false},{"label":"إيقاف التطبيق","href":"Stopping-the-app","type":2,"isActive":false},{"label":"الوصول إلى المشروع","href":"Accessing-the-project","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.md b/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.md new file mode 100644 index 000000000..115a33aea --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/knowledge_table_with_milvus.md @@ -0,0 +1,145 @@ +--- +id: knowledge_table_with_milvus.md +summary: >- + بشكل افتراضي، يستخدم جدول المعرفة قاعدة بيانات Milvus لتخزين البيانات + المستخرجة واسترجاعها. يسمح ذلك للمستخدمين بالبحث عن البيانات وتصفيتها وتحليلها + بسهولة باستخدام الميزات القوية لـ Milvus. سنعرض في هذا البرنامج التعليمي كيفية + البدء باستخدام جدول المعرفة و Milvus. +title: جدول المعرفة مع ميلفوس +--- +

جدول المعرفة مع ميلفوس

جدول المعرفة، الذي طورته شركة WhyHow AI، هو حزمة مفتوحة المصدر مصممة لتسهيل استخراج واستكشاف البيانات المنظمة من المستندات غير المنظمة. توفر للمستخدمين واجهة شبيهة بجداول البيانات وتتيح إنشاء تمثيلات معرفية، مثل الجداول والرسوم البيانية، من خلال واجهة استعلام بلغة طبيعية. تتضمن الحزمة قواعد استخراج قابلة للتخصيص، وخيارات تنسيق، وإمكانية تتبع البيانات من خلال المصدر، مما يجعلها قابلة للتكيف مع تطبيقات متنوعة. وهي تدعم الاندماج السلس في تدفقات عمل RAG، مما يلبي احتياجات كل من مستخدمي الأعمال الذين يحتاجون إلى واجهة سهلة الاستخدام والمطورين الذين يحتاجون إلى واجهة خلفية مرنة لمعالجة المستندات بكفاءة.

+

يستخدم جدول المعرفة افتراضيًا قاعدة بيانات Milvus لتخزين البيانات المستخرجة واسترجاعها. يسمح ذلك للمستخدمين بالبحث عن البيانات وتصفيتها وتحليلها بسهولة باستخدام الميزات القوية لـ Milvus. سنعرض في هذا البرنامج التعليمي كيفية البدء باستخدام جدول المعرفة و Milvus.

+

المتطلبات الأساسية

    +
  • الإرساء
  • +
  • إرساء Docker Compose
  • +
+

استنساخ المشروع

$ git clone https://github.com/whyhow-ai/knowledge-table.git
+
+

إعداد البيئة

ستجد الملف .env.example في الدليل الجذر للمشروع. انسخ هذا الملف إلى .env واملأ متغيرات البيئة المطلوبة.

+

بالنسبة لميلفوس، يجب عليك تعيين متغيرات البيئة MILVUS_DB_URI و MILVUS_DB_TOKEN. إليك بعض النصائح

+
+
    +
  • إن تعيين MILVUS_DB_URI كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين ميزة المصادقة على Milvus، فاستخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط MILVUS_DB_URI و MILVUS_DB_TOKEN ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

إلى جانب ميلفوس، يجب عليك أيضًا تعيين بيئات أخرى، على سبيل المثال OPENAI_API_KEY. يمكنك الحصول على كل منها من المواقع الإلكترونية المعنية.

+

بدء تشغيل التطبيق

$ docker compose up -d --build
+
+

إيقاف التطبيق

$ docker compose down
+
+

الوصول إلى المشروع

يمكن الوصول إلى الواجهة الأمامية على http://localhost:3000 ، ويمكن الوصول إلى الواجهة الخلفية على http://localhost:8000.

+

+ + + + +

+

يمكنك التلاعب بواجهة المستخدم وتجربتها باستخدام مستنداتك الخاصة.

+

لمزيد من الاستخدام التجريبي، يمكنك الرجوع إلى وثائق جدول المعرفة الرسمية.

diff --git a/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.json b/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.json new file mode 100644 index 000000000..8102afe73 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["# optional (setup env)\nconda create -n kotaemon python=3.10\nconda activate kotaemon\n\ngit clone https://github.com/Cinnamon/kotaemon\ncd kotaemon\n\npip install -e \"libs/kotaemon[all]\"\npip install -e \"libs/ktem\"\n","\"__type__\": \"kotaemon.storages.MilvusVectorStore\"\n","python app.py\n"],"headingContent":"Kotaemon RAG with Milvus","anchorList":[{"label":"Kotaemon RAG مع ميلفوس","href":"Kotaemon-RAG-with-Milvus","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"بدء تشغيل RAG باستخدام كوتايمون","href":"Start-RAG-with-kotaemon","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.md b/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.md new file mode 100644 index 000000000..4dc4f931e --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/kotaemon_with_milvus.md @@ -0,0 +1,99 @@ +--- +id: kotaemon_with_milvus.md +summary: >- + سيرشدك هذا البرنامج التعليمي إلى كيفية تخصيص تطبيق kotaemon الخاص بك باستخدام + Milvus. +title: Kotaemon RAG مع ميلفوس +--- +

Kotaemon RAG مع ميلفوس

Kotaemon عبارة عن واجهة مستخدم RAG نظيفة ومفتوحة المصدر وقابلة للتخصيص للدردشة مع مستنداتك. تم تصميمه مع وضع كل من المستخدمين النهائيين والمطورين في الاعتبار.

+

يوفر Kotaemon واجهة مستخدم ويب لضمان جودة المستندات قابلة للتخصيص ومتعددة المستخدمين تدعم واجهة مستخدم ويب قابلة للتخصيص تدعم LLMs المحلية والمستندة إلى واجهة برمجة التطبيقات. وهو يوفر خط أنابيب RAG هجين مع استرجاع النص الكامل والمتجهات، وضمان جودة متعدد الوسائط للمستندات ذات الأشكال والجداول، واستشهادات متقدمة مع معاينات المستندات. وهو يدعم أساليب الاستدلال المعقدة مثل ReAct و ReWOO، ويوفر إعدادات قابلة للتكوين للاسترجاع والتوليد.

+

سيرشدك هذا البرنامج التعليمي إلى كيفية تخصيص تطبيق كوتايمون الخاص بك باستخدام ميلفوس.

+

المتطلبات الأساسية

التثبيت

نوصي بتثبيت كوتايمون بهذه الطريقة:

+
# optional (setup env)
+conda create -n kotaemon python=3.10
+conda activate kotaemon
+
+git clone https://github.com/Cinnamon/kotaemon
+cd kotaemon
+
+pip install -e "libs/kotaemon[all]"
+pip install -e "libs/ktem"
+
+

إلى جانب هذه الطريقة، هناك بعض الطرق الأخرى لتثبيت كوتايمون. يمكنك الرجوع إلى الوثائق الرسمية لمزيد من التفاصيل.

+

تعيين ميلفوس كمخزن المتجهات الافتراضي

لتغيير وحدة تخزين المتجهات الافتراضية إلى ميلفوس، عليك تعديل الملف flowsettings.py بالتبديل KH_VECTORSTORE إلى:

+
"__type__": "kotaemon.storages.MilvusVectorStore"
+
+

تعيين متغيرات البيئة

يمكنك تهيئة النماذج عبر الملف .env بالمعلومات اللازمة للاتصال بنماذج LLMs ونماذج التضمين. مثل OpenAI و Azure و Ollama وغيرها.

+

تشغيل كوتيمون

بعد إعداد متغيرات البيئة وتغيير وحدة تخزين المتجهات، يمكنك تشغيل كوتايمون عن طريق تشغيل الأمر التالي:

+
python app.py
+
+

اسم المستخدم / كلمة المرور الافتراضية هي: admin / admin

+

بدء تشغيل RAG باستخدام كوتايمون

1. أضف نماذج الذكاء الاصطناعي الخاصة بك

+ + + + +

+

في علامة التبويب Resources ، يمكنك إضافة وتعيين نماذج LLM ونماذج التضمين الخاصة بك. يمكنك إضافة نماذج متعددة وتعيينها كنماذج نشطة أو غير نشطة. ما عليك سوى توفير واحد على الأقل. يمكنك أيضًا توفير نماذج متعددة للسماح بالتبديل بينها.

+

2. قم بتحميل مستنداتك

+ + + + +

+

من أجل القيام بضمان الجودة على مستنداتك، تحتاج إلى تحميلها إلى التطبيق أولاً. انتقل إلى علامة التبويب File Index ، ويمكنك تحميل وإدارة مستنداتك المخصصة.

+

بشكل افتراضي، يتم تخزين جميع بيانات التطبيق في المجلد ./ktem_app_data. يتم تخزين بيانات قاعدة بيانات Milvus في ./ktem_app_data/user_data/vectorstore. يمكنك نسخ هذا المجلد احتياطيًا أو نسخ هذا المجلد لنقل التثبيت إلى جهاز جديد.

+

3. الدردشة مع مستنداتك

+ + + + +

+

انتقل الآن إلى علامة التبويب Chat. تتكون علامة تبويب الدردشة من 3 مناطق: لوحة إعدادات المحادثة، حيث يمكنك إدارة المحادثات ومراجع الملفات؛ ولوحة الدردشة للتفاعل مع روبوت الدردشة؛ ولوحة المعلومات، التي تعرض الأدلة الداعمة ودرجات الثقة وتقييمات الملاءمة للإجابات.

+

يمكنك تحديد مستنداتك في لوحة إعدادات المحادثة. ثم ابدأ تشغيل RAG مع مستنداتك عن طريق كتابة رسالة في مربع الإدخال وإرسالها إلى روبوت المحادثة.

+

إذا كنت ترغب في التعمق في كيفية استخدام كوتيمون، يمكنك الحصول على إرشادات كاملة من الوثائق الرسمية.

diff --git a/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.json b/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.json new file mode 100644 index 000000000..89a1e8fd6 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.json @@ -0,0 +1 @@ +{"codeList":["%pip install -qU langchain_milvus\n","import EmbeddingTabs from \"@theme/EmbeddingTabs\";\n\n\n","# | output: false\n# | echo: false\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-large\")\n","from langchain_milvus import Milvus\n\n# The easiest way is to use Milvus Lite where everything is stored in a local file.\n# If you have a Milvus server you can use the server URI such as \"http://localhost:19530\".\nURI = \"./milvus_example.db\"\n\nvector_store = Milvus(\n embedding_function=embeddings,\n connection_args={\"uri\": URI},\n)\n","from langchain_core.documents import Document\n\nvector_store_saved = Milvus.from_documents(\n [Document(page_content=\"foo!\")],\n embeddings,\n collection_name=\"langchain_example\",\n connection_args={\"uri\": URI},\n)\n","vector_store_loaded = Milvus(\n embeddings,\n connection_args={\"uri\": URI},\n collection_name=\"langchain_example\",\n)\n","from uuid import uuid4\n\nfrom langchain_core.documents import Document\n\ndocument_1 = Document(\n page_content=\"I had chocalate chip pancakes and scrambled eggs for breakfast this morning.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_2 = Document(\n page_content=\"The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_3 = Document(\n page_content=\"Building an exciting new project with LangChain - come check it out!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_4 = Document(\n page_content=\"Robbers broke into the city bank and stole $1 million in cash.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_5 = Document(\n page_content=\"Wow! That was an amazing movie. I can't wait to see it again.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_6 = Document(\n page_content=\"Is the new iPhone worth the price? Read this review to find out.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_7 = Document(\n page_content=\"The top 10 soccer players in the world right now.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_8 = Document(\n page_content=\"LangGraph is the best framework for building stateful, agentic applications!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_9 = Document(\n page_content=\"The stock market is down 500 points today due to fears of a recession.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_10 = Document(\n page_content=\"I have a bad feeling I am going to get deleted :(\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocuments = [\n document_1,\n document_2,\n document_3,\n document_4,\n document_5,\n document_6,\n document_7,\n document_8,\n document_9,\n document_10,\n]\nuuids = [str(uuid4()) for _ in range(len(documents))]\n\nvector_store.add_documents(documents=documents, ids=uuids)\n","vector_store.delete(ids=[uuids[-1]])\n","results = vector_store.similarity_search(\n \"LangChain provides abstractions to make working with LLMs easy\",\n k=2,\n filter={\"source\": \"tweet\"},\n)\nfor res in results:\n print(f\"* {res.page_content} [{res.metadata}]\")\n","results = vector_store.similarity_search_with_score(\n \"Will it be hot tomorrow?\", k=1, filter={\"source\": \"news\"}\n)\nfor res, score in results:\n print(f\"* [SIM={score:3f}] {res.page_content} [{res.metadata}]\")\n","retriever = vector_store.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1})\nretriever.invoke(\"Stealing from the bank is a crime\", filter={\"source\": \"news\"})\n","from langchain_core.documents import Document\n\ndocs = [\n Document(page_content=\"i worked at kensho\", metadata={\"namespace\": \"harrison\"}),\n Document(page_content=\"i worked at facebook\", metadata={\"namespace\": \"ankush\"}),\n]\nvectorstore = Milvus.from_documents(\n docs,\n embeddings,\n connection_args={\"uri\": URI},\n drop_old=True,\n partition_key_field=\"namespace\", # Use the \"namespace\" field as the partition key\n)\n","# This will only get documents for Ankush\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"ankush\"'}).invoke(\n \"where did i work?\"\n)\n","# This will only get documents for Harrison\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"harrison\"'}).invoke(\n \"where did i work?\"\n)\n"],"headingContent":"Use Milvus as a Vector Store","anchorList":[{"label":"استخدام Milvus كمخزن للمتجهات","href":"Use-Milvus-as-a-Vector-Store","type":1,"isActive":false},{"label":"الإعداد","href":"Setup","type":2,"isActive":false},{"label":"التهيئة","href":"Initialization","type":2,"isActive":false},{"label":"إدارة مخزن المتجهات","href":"Manage-vector-store","type":2,"isActive":false},{"label":"الاستعلام عن مخزن المتجهات","href":"Query-vector-store","type":2,"isActive":false},{"label":"الاستخدام لتوليد المسترجع المعزز للاسترجاع","href":"Usage-for-retrieval-augmented-generation","type":2,"isActive":false},{"label":"مرجع واجهة برمجة التطبيقات","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.md b/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.md new file mode 100644 index 000000000..68d875ec5 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/basic_usage_langchain.md @@ -0,0 +1,319 @@ +--- +id: basic_usage_langchain.md +summary: يوضح هذا الدفتر كيفية استخدام الوظائف المتعلقة بقاعدة بيانات متجهات ميلفوس. +title: استخدام Milvus كمخزن للمتجهات +--- +

استخدام Milvus كمخزن للمتجهات

+

Milvus هي قاعدة بيانات تقوم بتخزين وفهرسة وإدارة متجهات التضمين الضخمة التي تم إنشاؤها بواسطة الشبكات العصبية العميقة ونماذج التعلم الآلي الأخرى.

+
+

يوضح هذا الدفتر كيفية استخدام الوظائف المتعلقة بقاعدة بيانات Milvus المتجهة.

+

الإعداد

ستحتاج إلى تثبيت langchain-milvus مع pip install -qU langchain-milvus لاستخدام هذا التكامل.

+
%pip install -qU  langchain_milvus
+
+

يأتي الإصدار الأخير من pymilvus مع قاعدة بيانات متجهية محلية Milvus Lite، وهي جيدة للنماذج الأولية. إذا كان لديك حجم كبير من البيانات مثل أكثر من مليون مستند، نوصي بإعداد خادم Milvus أكثر أداءً على docker أو kubernetes.

+

بيانات الاعتماد

لا حاجة إلى بيانات اعتماد لاستخدام مخزن المتجهات Milvus.

+

التهيئة

import EmbeddingTabs from "@theme/EmbeddingTabs";
+
+<EmbeddingTabs/>
+
+
# | output: false
+# | echo: false
+from langchain_openai import OpenAIEmbeddings
+
+embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
+
+
from langchain_milvus import Milvus
+
+# The easiest way is to use Milvus Lite where everything is stored in a local file.
+# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
+URI = "./milvus_example.db"
+
+vector_store = Milvus(
+    embedding_function=embeddings,
+    connection_args={"uri": URI},
+)
+
+

تجزئة البيانات باستخدام مجموعات ميلفوس

يمكنك تخزين مستندات مختلفة غير مرتبطة في مجموعات مختلفة داخل نفس مثيل Milvus للحفاظ على السياق

+

إليك كيف يمكنك إنشاء مجموعة جديدة

+
from langchain_core.documents import Document
+
+vector_store_saved = Milvus.from_documents(
+    [Document(page_content="foo!")],
+    embeddings,
+    collection_name="langchain_example",
+    connection_args={"uri": URI},
+)
+
+

وإليك كيفية استرداد تلك المجموعة المخزنة

+
vector_store_loaded = Milvus(
+    embeddings,
+    connection_args={"uri": URI},
+    collection_name="langchain_example",
+)
+
+

إدارة مخزن المتجهات

بمجرد إنشاء مخزن المتجهات الخاص بك، يمكننا التفاعل معه عن طريق إضافة عناصر مختلفة وحذفها.

+

إضافة عناصر إلى مخزن المتجهات

يمكننا إضافة عناصر إلى مخزن المتجهات باستخدام الدالة add_documents.

+
from uuid import uuid4
+
+from langchain_core.documents import Document
+
+document_1 = Document(
+    page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
+    metadata={"source": "tweet"},
+)
+
+document_2 = Document(
+    page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
+    metadata={"source": "news"},
+)
+
+document_3 = Document(
+    page_content="Building an exciting new project with LangChain - come check it out!",
+    metadata={"source": "tweet"},
+)
+
+document_4 = Document(
+    page_content="Robbers broke into the city bank and stole $1 million in cash.",
+    metadata={"source": "news"},
+)
+
+document_5 = Document(
+    page_content="Wow! That was an amazing movie. I can't wait to see it again.",
+    metadata={"source": "tweet"},
+)
+
+document_6 = Document(
+    page_content="Is the new iPhone worth the price? Read this review to find out.",
+    metadata={"source": "website"},
+)
+
+document_7 = Document(
+    page_content="The top 10 soccer players in the world right now.",
+    metadata={"source": "website"},
+)
+
+document_8 = Document(
+    page_content="LangGraph is the best framework for building stateful, agentic applications!",
+    metadata={"source": "tweet"},
+)
+
+document_9 = Document(
+    page_content="The stock market is down 500 points today due to fears of a recession.",
+    metadata={"source": "news"},
+)
+
+document_10 = Document(
+    page_content="I have a bad feeling I am going to get deleted :(",
+    metadata={"source": "tweet"},
+)
+
+documents = [
+    document_1,
+    document_2,
+    document_3,
+    document_4,
+    document_5,
+    document_6,
+    document_7,
+    document_8,
+    document_9,
+    document_10,
+]
+uuids = [str(uuid4()) for _ in range(len(documents))]
+
+vector_store.add_documents(documents=documents, ids=uuids)
+
+
['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
+ 'fa642726-5329-4495-a072-187e948dd71f',
+ '9905001c-a4a3-455e-ab94-72d0ed11b476',
+ 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
+ '7508f7ff-c0c9-49ea-8189-634f8a0244d8',
+ '2e179609-3ff7-4c6a-9e05-08978903fe26',
+ 'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
+ '1206d237-ee3a-484f-baf2-b5ac38eeb314',
+ 'd43cbf9a-a772-4c40-993b-9439065fec01',
+ '25e667bb-6f09-4574-a368-661069301906']
+
+

حذف عناصر من مخزن المتجهات

vector_store.delete(ids=[uuids[-1]])
+
+
(insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
+
+

الاستعلام عن مخزن المتجهات

بمجرد إنشاء مخزن المتجهات الخاص بك وإضافة المستندات ذات الصلة سترغب على الأرجح في الاستعلام عنه أثناء تشغيل السلسلة أو الوكيل.

+

الاستعلام مباشرة

يمكن إجراء بحث تشابه بسيط مع تصفية البيانات الوصفية على النحو التالي:

+
results = vector_store.similarity_search(
+    "LangChain provides abstractions to make working with LLMs easy",
+    k=2,
+    filter={"source": "tweet"},
+)
+for res in results:
+    print(f"* {res.page_content} [{res.metadata}]")
+
+
* Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
+* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
+
+

البحث عن التشابه مع الدرجة

يمكنك أيضًا البحث بالنتيجة:

+
results = vector_store.similarity_search_with_score(
+    "Will it be hot tomorrow?", k=1, filter={"source": "news"}
+)
+for res, score in results:
+    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
+
+
* [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
+
+

للاطلاع على قائمة كاملة بجميع خيارات البحث المتاحة عند استخدام مخزن المتجهات Milvus ، يمكنك زيارة مرجع واجهة برمجة التطبيقات.

+

الاستعلام عن طريق التحويل إلى مسترجع

يمكنك أيضًا تحويل مخزن المتجهات إلى مسترجع لسهولة الاستخدام في سلاسل البحث الخاصة بك.

+
retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
+retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
+
+
[Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
+
+

الاستخدام لتوليد المسترجع المعزز للاسترجاع

للحصول على إرشادات حول كيفية استخدام مخزن المتجهات هذا للتوليد المعزز بالاسترجاع (RAG)، راجع الأقسام التالية:

+ +

استرجاع لكل مستخدم

عند إنشاء تطبيق استرجاع، غالبًا ما يتعين عليك إنشاؤه مع وضع العديد من المستخدمين في الاعتبار. هذا يعني أنك قد تقوم بتخزين البيانات ليس لمستخدم واحد فقط، ولكن للعديد من المستخدمين المختلفين، ويجب ألا يتمكنوا من رؤية بيانات بعضهم البعض.

+

يوصي ميلفوس باستخدام partition_key لتنفيذ الإيجار المتعدد، وإليك مثال على ذلك.

+
+

خاصية مفتاح التقسيم غير متوفرة الآن في Milvus Lite، إذا كنت ترغب في استخدامها، فأنت بحاجة إلى بدء تشغيل خادم Milvus من docker أو kubernetes.

+
+
from langchain_core.documents import Document
+
+docs = [
+    Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
+    Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
+]
+vectorstore = Milvus.from_documents(
+    docs,
+    embeddings,
+    connection_args={"uri": URI},
+    drop_old=True,
+    partition_key_field="namespace",  # Use the "namespace" field as the partition key
+)
+
+

لإجراء بحث باستخدام مفتاح التقسيم، يجب عليك تضمين أي مما يلي في التعبير المنطقي لطلب البحث

+

search_kwargs={"expr": '<partition_key> == "xxxx"'}

+

search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

+

قم باستبدال <partition_key> باسم الحقل الذي تم تعيينه كمفتاح القسم.

+

يتغير Milvus إلى قسم بناءً على مفتاح القسم المحدد، ويقوم بتصفية الكيانات وفقًا لمفتاح القسم، ويبحث بين الكيانات التي تمت تصفيتها.

+
# This will only get documents for Ankush
+vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
+    "where did i work?"
+)
+
+
[Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
+
+
# This will only get documents for Harrison
+vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
+    "where did i work?"
+)
+
+
[Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
+
+

مرجع واجهة برمجة التطبيقات

للحصول على توثيق مفصل لجميع ميزات وتكوينات __ModuleName___VectorStore توجه إلى مرجع واجهة برمجة التطبيقات: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html

diff --git a/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.json b/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.json new file mode 100644 index 000000000..271179be7 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import bs4\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\n\n# Create a WebBaseLoader instance to load documents from web sources\nloader = WebBaseLoader(\n web_paths=(\n \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n \"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/\",\n ),\n bs_kwargs=dict(\n parse_only=bs4.SoupStrainer(\n class_=(\"post-content\", \"post-title\", \"post-header\")\n )\n ),\n)\n# Load documents from web sources using the loader\ndocuments = loader.load()\n# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks\ntext_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)\n\n# Split the documents into chunks using the text_splitter\ndocs = text_splitter.split_documents(documents)\n\n# Let's take a look at the first document\ndocs[1]\n","from langchain_milvus import Milvus, Zilliz\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings()\n\nvectorstore = Milvus.from_documents( # or Zilliz.from_documents\n documents=docs,\n embedding=embeddings,\n connection_args={\n \"uri\": \"./milvus_demo.db\",\n },\n drop_old=True, # Drop the old Milvus collection if it exists\n)\n","query = \"What is self-reflection of an AI Agent?\"\nvectorstore.similarity_search(query, k=1)\n","from langchain_core.runnables import RunnablePassthrough\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_openai import ChatOpenAI\n\n# Initialize the OpenAI language model for response generation\nllm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n\n# Define the prompt template for generating AI responses\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n\n{context}\n\n\n\n{question}\n\n\nThe response should be specific and use statistics or numbers when possible.\n\nAssistant:\"\"\"\n\n# Create a PromptTemplate instance with the defined template and input variables\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n# Convert the vector store to a retriever\nretriever = vectorstore.as_retriever()\n\n\n# Define a function to format the retrieved documents\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","# Define the RAG (Retrieval-Augmented Generation) chain for AI response generation\nrag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n\n# rag_chain.get_graph().print_ascii()\n\n# Invoke the RAG chain with a specific question and retrieve the response\nres = rag_chain.invoke(query)\nres\n","vectorstore.similarity_search(\n \"What is CoT?\",\n k=1,\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n)\n\n# The same as:\n# vectorstore.as_retriever(search_kwargs=dict(\n# k=1,\n# expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n# )).invoke(\"What is CoT?\")\n","from langchain_core.runnables import ConfigurableField\n\n# Define a new retriever with a configurable field for search_kwargs\nretriever2 = vectorstore.as_retriever().configurable_fields(\n search_kwargs=ConfigurableField(\n id=\"retriever_search_kwargs\",\n )\n)\n\n# Invoke the retriever with a specific search_kwargs which filter the documents by source\nretriever2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n k=1,\n )\n }\n).invoke(query)\n","# Define a new RAG chain with this dynamically configurable retriever\nrag_chain2 = (\n {\"context\": retriever2 | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","# Invoke this RAG chain with a specific question and config\nrag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n )\n }\n).invoke(query)\n","rag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'\",\n )\n }\n).invoke(query)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LangChain","anchorList":[{"label":"التوليد المعزز الاسترجاعي (RAG) باستخدام ميلفوس ولانغتشين","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LangChain","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-the-data","type":2,"isActive":false},{"label":"بناء سلسلة RAG مع متجر Milvus Vector Store","href":"Build-RAG-chain-with-Milvus-Vector-Store","type":2,"isActive":false},{"label":"تصفية البيانات الوصفية","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.md b/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.md new file mode 100644 index 000000000..269fcb613 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/integrate_with_langchain.md @@ -0,0 +1,283 @@ +--- +id: integrate_with_langchain.md +summary: >- + يوضح هذا الدليل كيفية بناء نظام التوليد المعزّز للاسترجاع (RAG) باستخدام + LangChain و Milvus. +title: التوليد المعزز الاسترجاعي (RAG) باستخدام ميلفوس ولانغتشين +--- +

التوليد المعزز الاسترجاعي (RAG) باستخدام ميلفوس ولانغتشين

Open In Colab +GitHub Repository

+

يوضّح هذا الدليل كيفية إنشاء نظام توليد الاسترجاع المعزز (RAG) باستخدام LangChain وMilvus.

+

يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليدًا لتوليد نص جديد بناءً على المستندات المسترجعة.

+

LangChain هو إطار عمل لتطوير تطبيقات مدعومة بنماذج لغوية كبيرة (LLMs). Milvus هي قاعدة بيانات المتجهات الأكثر تقدمًا في العالم مفتوحة المصدر، وهي مصممة لتشغيل تطبيقات البحث عن التشابه المضمنة وتطبيقات الذكاء الاصطناعي.

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
$ pip install --upgrade --quiet  langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

سنستخدم النماذج من OpenAI. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

إعداد البيانات

نستخدم Langchain WebBaseLoader لتحميل المستندات من مصادر الويب وتقسيمها إلى أجزاء باستخدام RecursiveCharacterTextSplitter.

+
import bs4
+from langchain_community.document_loaders import WebBaseLoader
+from langchain_text_splitters import RecursiveCharacterTextSplitter
+
+# Create a WebBaseLoader instance to load documents from web sources
+loader = WebBaseLoader(
+    web_paths=(
+        "https://lilianweng.github.io/posts/2023-06-23-agent/",
+        "https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
+    ),
+    bs_kwargs=dict(
+        parse_only=bs4.SoupStrainer(
+            class_=("post-content", "post-title", "post-header")
+        )
+    ),
+)
+# Load documents from web sources using the loader
+documents = loader.load()
+# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks
+text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
+
+# Split the documents into chunks using the text_splitter
+docs = text_splitter.split_documents(documents)
+
+# Let's take a look at the first document
+docs[1]
+
+
Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/'})
+
+

كما نرى، تم تقسيم المستند بالفعل إلى أجزاء. ومحتوى البيانات حول عامل الذكاء الاصطناعي.

+

بناء سلسلة RAG مع متجر Milvus Vector Store

سنقوم بتهيئة مخزن متجهات Milvus مع المستندات، والتي تقوم بتحميل المستندات في مخزن متجهات Milvus وبناء فهرس تحت الغطاء.

+
from langchain_milvus import Milvus, Zilliz
+from langchain_openai import OpenAIEmbeddings
+
+embeddings = OpenAIEmbeddings()
+
+vectorstore = Milvus.from_documents(  # or Zilliz.from_documents
+    documents=docs,
+    embedding=embeddings,
+    connection_args={
+        "uri": "./milvus_demo.db",
+    },
+    drop_old=True,  # Drop the old Milvus collection if it exists
+)
+
+
+

لـ connection_args:

+
    +
  • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا ملف Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، استبدل Milvus.from_documents بـ Zilliz.from_documents ، واضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

ابحث في المستندات الموجودة في مخزن متجه ميلفوس باستخدام سؤال استعلام اختباري. دعنا نلقي نظرة على أعلى 1 مستند.

+
query = "What is self-reflection of an AI Agent?"
+vectorstore.similarity_search(query, k=1)
+
+
[Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
+
+
from langchain_core.runnables import RunnablePassthrough
+from langchain_core.prompts import PromptTemplate
+from langchain_core.output_parsers import StrOutputParser
+from langchain_openai import ChatOpenAI
+
+# Initialize the OpenAI language model for response generation
+llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
+
+# Define the prompt template for generating AI responses
+PROMPT_TEMPLATE = """
+Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
+Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
+If you don't know the answer, just say that you don't know, don't try to make up an answer.
+<context>
+{context}
+</context>
+
+<question>
+{question}
+</question>
+
+The response should be specific and use statistics or numbers when possible.
+
+Assistant:"""
+
+# Create a PromptTemplate instance with the defined template and input variables
+prompt = PromptTemplate(
+    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
+)
+# Convert the vector store to a retriever
+retriever = vectorstore.as_retriever()
+
+
+# Define a function to format the retrieved documents
+def format_docs(docs):
+    return "\n\n".join(doc.page_content for doc in docs)
+
+

استخدم LCEL (لغة تعبير سلسلة اللغات) لبناء سلسلة RAG.

+
# Define the RAG (Retrieval-Augmented Generation) chain for AI response generation
+rag_chain = (
+    {"context": retriever | format_docs, "question": RunnablePassthrough()}
+    | prompt
+    | llm
+    | StrOutputParser()
+)
+
+# rag_chain.get_graph().print_ascii()
+
+# Invoke the RAG chain with a specific question and retrieve the response
+res = rag_chain.invoke(query)
+res
+
+
"Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
+
+

تهانينا! لقد أنشأت سلسلة RAG أساسية مدعومة من قبل Milvus وLangChain.

+

تصفية البيانات الوصفية

يمكننا استخدام قواعد تصفية Milvus Scalarar Filtering Rules لتصفية المستندات بناءً على البيانات الوصفية. لقد قمنا بتحميل المستندات من مصدرين مختلفين، ويمكننا تصفية المستندات حسب البيانات الوصفية source.

+
vectorstore.similarity_search(
+    "What is CoT?",
+    k=1,
+    expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
+)
+
+# The same as:
+# vectorstore.as_retriever(search_kwargs=dict(
+#     k=1,
+#     expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
+# )).invoke("What is CoT?")
+
+
[Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555858})]
+
+

إذا أردنا تغيير معلمات البحث ديناميكيًا دون إعادة بناء السلسلة، يمكننا تكوين الأجزاء الداخلية لسلسلة وقت التشغيل. دعونا نحدد مسترجعًا جديدًا بهذا التكوين الديناميكي ونستخدمه لبناء سلسلة RAG جديدة.

+
from langchain_core.runnables import ConfigurableField
+
+# Define a new retriever with a configurable field for search_kwargs
+retriever2 = vectorstore.as_retriever().configurable_fields(
+    search_kwargs=ConfigurableField(
+        id="retriever_search_kwargs",
+    )
+)
+
+# Invoke the retriever with a specific search_kwargs which filter the documents by source
+retriever2.with_config(
+    configurable={
+        "retriever_search_kwargs": dict(
+            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
+            k=1,
+        )
+    }
+).invoke(query)
+
+
[Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
+
+
# Define a new RAG chain with this dynamically configurable retriever
+rag_chain2 = (
+    {"context": retriever2 | format_docs, "question": RunnablePassthrough()}
+    | prompt
+    | llm
+    | StrOutputParser()
+)
+
+

لنجرب سلسلة RAG القابلة للتكوين ديناميكيًا مع شروط تصفية مختلفة.

+
# Invoke this RAG chain with a specific question and config
+rag_chain2.with_config(
+    configurable={
+        "retriever_search_kwargs": dict(
+            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
+        )
+    }
+).invoke(query)
+
+
"Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
+
+

عندما نغير شرط البحث لتصفية المستندات حسب المصدر الثاني، حيث أن محتوى مصدر المدونة هذا لا علاقة له بسؤال الاستعلام، نحصل على إجابة لا تحتوي على معلومات ذات صلة.

+
rag_chain2.with_config(
+    configurable={
+        "retriever_search_kwargs": dict(
+            expr="source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'",
+        )
+    }
+).invoke(query)
+
+
"I'm sorry, but based on the provided context, there is no specific information or statistical data available regarding the self-reflection of an AI agent."
+
+
+

يركّز هذا البرنامج التعليمي على الاستخدام الأساسي لتكامل Milvus LangChain ونهج RAG البسيط. لمزيد من تقنيات RAG المتقدمة، يُرجى الرجوع إلى معسكر تدريب RAG المتقدم.

diff --git a/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.json b/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.json new file mode 100644 index 000000000..7f6aca6e9 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.json @@ -0,0 +1 @@ +{"codeList":["# os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass(\"Enter your LangSmith API key: \")\n# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n","%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever\nfrom langchain_milvus.utils.sparse import BM25SparseEmbedding\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom pymilvus import (\n Collection,\n CollectionSchema,\n DataType,\n FieldSchema,\n WeightedRanker,\n connections,\n)\n","CONNECTION_URI = \"http://localhost:19530\"\n","export OPENAI_API_KEY=\n","texts = [\n \"In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.\",\n \"In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.\",\n \"In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.\",\n \"In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.\",\n \"In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.\",\n \"In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.\",\n \"In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.\",\n \"In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.\",\n \"In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.\",\n \"In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.\",\n]\n","dense_embedding_func = OpenAIEmbeddings()\ndense_dim = len(dense_embedding_func.embed_query(texts[1]))\ndense_dim\n","sparse_embedding_func = BM25SparseEmbedding(corpus=texts)\nsparse_embedding_func.embed_query(texts[1])\n","connections.connect(uri=CONNECTION_URI)\n","pk_field = \"doc_id\"\ndense_field = \"dense_vector\"\nsparse_field = \"sparse_vector\"\ntext_field = \"text\"\nfields = [\n FieldSchema(\n name=pk_field,\n dtype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n ),\n FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),\n]\n","schema = CollectionSchema(fields=fields, enable_dynamic_field=False)\ncollection = Collection(\n name=\"IntroductionToTheNovels\", schema=schema, consistency_level=\"Strong\"\n)\n","dense_index = {\"index_type\": \"FLAT\", \"metric_type\": \"IP\"}\ncollection.create_index(\"dense_vector\", dense_index)\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncollection.create_index(\"sparse_vector\", sparse_index)\ncollection.flush()\n","entities = []\nfor text in texts:\n entity = {\n dense_field: dense_embedding_func.embed_documents([text])[0],\n sparse_field: sparse_embedding_func.embed_documents([text])[0],\n text_field: text,\n }\n entities.append(entity)\ncollection.insert(entities)\ncollection.load()\n","sparse_search_params = {\"metric_type\": \"IP\"}\ndense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\nretriever = MilvusCollectionHybridSearchRetriever(\n collection=collection,\n rerank=WeightedRanker(0.5, 0.5),\n anns_fields=[dense_field, sparse_field],\n field_embeddings=[dense_embedding_func, sparse_embedding_func],\n field_search_params=[dense_search_params, sparse_search_params],\n top_k=3,\n text_field=text_field,\n)\n","retriever.invoke(\"What are the story about ventures?\")\n","llm = ChatOpenAI()\n\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\n\n\n{context}\n\n\n\n{question}\n\n\nAssistant:\"\"\"\n\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n","def format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","rag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","rag_chain.invoke(\"What novels has Lila written and what are their contents?\")\n","collection.drop()\n"],"headingContent":"Milvus Hybrid Search Retriever","anchorList":[{"label":"مسترد البحث الهجين ميلفوس الهجين","href":"Milvus-Hybrid-Search-Retriever","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"الإعداد","href":"Setup","type":2,"isActive":false},{"label":"التثبيت","href":"Instantiation","type":2,"isActive":false},{"label":"الاستخدام","href":"Usage","type":2,"isActive":false},{"label":"الاستخدام ضمن سلسلة","href":"Use-within-a-chain","type":2,"isActive":false},{"label":"مرجع واجهة برمجة التطبيقات","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.md b/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.md new file mode 100644 index 000000000..4fd99cc35 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/langchain/milvus_hybrid_search_retriever.md @@ -0,0 +1,308 @@ +--- +id: milvus_hybrid_search_retriever.md +summary: يوضح هذا الدفتر كيفية استخدام الوظائف المتعلقة بقاعدة بيانات متجهات ميلفوس. +title: مسترد البحث الهجين ميلفوس الهجين +--- +

مسترد البحث الهجين ميلفوس الهجين

نظرة عامة

+

Milvus عبارة عن قاعدة بيانات متجهة مفتوحة المصدر مصممة لتشغيل تطبيقات البحث عن التشابه المدمج والذكاء الاصطناعي. يجعل Milvus البحث عن البيانات غير المهيكلة أكثر سهولة، ويوفر تجربة مستخدم متسقة بغض النظر عن بيئة النشر.

+
+

سيساعدك هذا على بدء استخدام مسترجع البحث الهجين Milvus Hybrid Search، الذي يجمع بين نقاط القوة في كل من البحث المتجه الكثيف والمتفرق. للحصول على وثائق مفصلة لجميع ميزات وتكوينات MilvusCollectionHybridSearchRetriever توجه إلى مرجع واجهة برمجة التطبيقات.

+

راجع أيضًا مستندات البحث متعدد المتجهات في ميلفوس.

+

تفاصيل التكامل

+ + + + + + +
المستردالاستضافة الذاتيةالعرض السحابيالحزمة
MilvusCollectionHybridSearchRetrieverlangchain_milvus
+

الإعداد

إذا كنت ترغب في الحصول على التتبع الآلي من الاستعلامات الفردية، يمكنك أيضًا تعيين مفتاح واجهة برمجة تطبيقات لانجسميث من خلال عدم وضع علامة أدناه:

+
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
+# os.environ["LANGSMITH_TRACING"] = "true"
+
+

التثبيت

يعيش هذا المسترد في الحزمة langchain-milvus. يتطلب هذا الدليل التبعيات التالية:

+
%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
+
+
from langchain_core.output_parsers import StrOutputParser
+from langchain_core.prompts import PromptTemplate
+from langchain_core.runnables import RunnablePassthrough
+from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
+from langchain_milvus.utils.sparse import BM25SparseEmbedding
+from langchain_openai import ChatOpenAI, OpenAIEmbeddings
+from pymilvus import (
+    Collection,
+    CollectionSchema,
+    DataType,
+    FieldSchema,
+    WeightedRanker,
+    connections,
+)
+
+

بدء تشغيل خدمة ميلفوس

يرجى الرجوع إلى وثائق Milvus لبدء تشغيل خدمة Milvus.

+

بعد بدء تشغيل خدمة Milvus، تحتاج إلى تحديد URI اتصال Milvus الخاص بك.

+
CONNECTION_URI = "http://localhost:19530"
+
+

إعداد مفتاح OpenAI API Key

يرجى الرجوع إلى وثائق OpenAI للحصول على مفتاح OpenAI API الخاص بك، وتعيينه كمتغير بيئة.

+
export OPENAI_API_KEY=<your_api_key>
+
+

إعداد دوال التضمين الكثيفة والمتناثرة

دعنا نتخيل 10 أوصاف وهمية للروايات. في الإنتاج الفعلي، قد تكون كمية كبيرة من البيانات النصية.

+
texts = [
+    "In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.",
+    "In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.",
+    "In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.",
+    "In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.",
+    "In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.",
+    "In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.",
+    "In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.",
+    "In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.",
+    "In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.",
+    "In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.",
+]
+
+

سوف نستخدم دالة التضمين OpenAI Embedding لتوليد متجهات كثيفة، وخوارزمية BM25 لتوليد متجهات متفرقة.

+

تهيئة دالة التضمين الكثيف والحصول على البُعد

+
dense_embedding_func = OpenAIEmbeddings()
+dense_dim = len(dense_embedding_func.embed_query(texts[1]))
+dense_dim
+
+
1536
+
+

تهيئة دالة التضمين المتناثر.

+

لاحظ أن ناتج التضمين المتناثر هو مجموعة من المتجهات المتناثرة، والتي تمثل فهرس ووزن الكلمات الرئيسية للنص المُدخَل.

+
sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
+sparse_embedding_func.embed_query(texts[1])
+
+
{0: 0.4270424944042204,
+ 21: 1.845826690498331,
+ 22: 1.845826690498331,
+ 23: 1.845826690498331,
+ 24: 1.845826690498331,
+ 25: 1.845826690498331,
+ 26: 1.845826690498331,
+ 27: 1.2237754316221157,
+ 28: 1.845826690498331,
+ 29: 1.845826690498331,
+ 30: 1.845826690498331,
+ 31: 1.845826690498331,
+ 32: 1.845826690498331,
+ 33: 1.845826690498331,
+ 34: 1.845826690498331,
+ 35: 1.845826690498331,
+ 36: 1.845826690498331,
+ 37: 1.845826690498331,
+ 38: 1.845826690498331,
+ 39: 1.845826690498331}
+
+

إنشاء مجموعة ميلفوس وتحميل البيانات

تهيئة URI للاتصال وإنشاء اتصال

+
connections.connect(uri=CONNECTION_URI)
+
+

تحديد أسماء الحقول وأنواع بياناتها

+
pk_field = "doc_id"
+dense_field = "dense_vector"
+sparse_field = "sparse_vector"
+text_field = "text"
+fields = [
+    FieldSchema(
+        name=pk_field,
+        dtype=DataType.VARCHAR,
+        is_primary=True,
+        auto_id=True,
+        max_length=100,
+    ),
+    FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
+    FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
+    FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),
+]
+
+

إنشاء مجموعة مع المخطط المحدد

+
schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
+collection = Collection(
+    name="IntroductionToTheNovels", schema=schema, consistency_level="Strong"
+)
+
+

تحديد فهرس للمتجهات الكثيفة والمتناثرة

+
dense_index = {"index_type": "FLAT", "metric_type": "IP"}
+collection.create_index("dense_vector", dense_index)
+sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
+collection.create_index("sparse_vector", sparse_index)
+collection.flush()
+
+

إدراج الكيانات في المجموعة وتحميل المجموعة

+
entities = []
+for text in texts:
+    entity = {
+        dense_field: dense_embedding_func.embed_documents([text])[0],
+        sparse_field: sparse_embedding_func.embed_documents([text])[0],
+        text_field: text,
+    }
+    entities.append(entity)
+collection.insert(entities)
+collection.load()
+
+

التثبيت

يمكننا الآن إنشاء المسترجع الخاص بنا، وتحديد معلمات البحث للحقول المتفرقة والكثيفة:

+
sparse_search_params = {"metric_type": "IP"}
+dense_search_params = {"metric_type": "IP", "params": {}}
+retriever = MilvusCollectionHybridSearchRetriever(
+    collection=collection,
+    rerank=WeightedRanker(0.5, 0.5),
+    anns_fields=[dense_field, sparse_field],
+    field_embeddings=[dense_embedding_func, sparse_embedding_func],
+    field_search_params=[dense_search_params, sparse_search_params],
+    top_k=3,
+    text_field=text_field,
+)
+
+

في معلمات الإدخال لهذا المسترد، نستخدم تضمينًا كثيفًا وتضمينًا متناثرًا لإجراء بحث هجين على حقلي هذه المجموعة، ونستخدم أداة الترجيح لإعادة الترتيب. وأخيرًا، سيتم إرجاع 3 مستندات من أعلى K.

+

الاستخدام

retriever.invoke("What are the story about ventures?")
+
+
[Document(page_content="In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.", metadata={'doc_id': '449281835035545843'}),
+ Document(page_content="In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.", metadata={'doc_id': '449281835035545845'}),
+ Document(page_content="In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.", metadata={'doc_id': '449281835035545846'})]
+
+

الاستخدام ضمن سلسلة

تهيئة ChatOpenAI وتعريف قالب مطالبة

+
llm = ChatOpenAI()
+
+PROMPT_TEMPLATE = """
+Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
+Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
+
+<context>
+{context}
+</context>
+
+<question>
+{question}
+</question>
+
+Assistant:"""
+
+prompt = PromptTemplate(
+    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
+)
+
+

تحديد دالة لتنسيق المستندات

+
def format_docs(docs):
+    return "\n\n".join(doc.page_content for doc in docs)
+
+

تحديد سلسلة باستخدام المسترد والمكونات الأخرى

+
rag_chain = (
+    {"context": retriever | format_docs, "question": RunnablePassthrough()}
+    | prompt
+    | llm
+    | StrOutputParser()
+)
+
+

إجراء استعلام باستخدام السلسلة المحددة

+
rag_chain.invoke("What novels has Lila written and what are their contents?")
+
+
"Lila Rose has written 'The Memory Thief,' which follows a charismatic thief with the ability to steal and manipulate memories as they navigate a daring heist and a web of deceit and betrayal."
+
+

إسقاط المجموعة

+
collection.drop()
+
+

مرجع واجهة برمجة التطبيقات

للحصول على وثائق مفصلة لجميع ميزات وتكوينات MilvusCollectionHybridSearchRetriever توجه إلى مرجع واجهة برمجة التطبيقات.

diff --git a/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.json b/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.json new file mode 100644 index 000000000..58314a104 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-agents pymilvus openai python-dotenv\n","$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai\n","# NOTE: This is ONLY necessary in jupyter notebook.\n# Details: Jupyter runs an event-loop behind the scenes.\n# This results in nested event-loops when we start an event-loop to make async queries.\n# This is normally not allowed, we use nest_asyncio to allow it for convenience.\nimport nest_asyncio\n\nnest_asyncio.apply()\n","\"\"\"\nload_dotenv reads key-value pairs from a .env file and can set them as environment variables.\nThis is useful to avoid leaking your API key for example :D\n\"\"\"\n\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n","$ mkdir -p 'data/10k/'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'\n","from llama_index.core import Settings\nfrom llama_index.embeddings.mistralai import MistralAIEmbedding\n\n# Define the default Embedding model used in this Notebook.\n# We are using Mistral Models, so we are also using Mistral Embeddings\n\nSettings.embed_model = MistralAIEmbedding(model_name=\"mistral-embed\")\n","from llama_index.llms.ollama import Ollama\n\nSettings.llm = Ollama(\"mistral-nemo\")\n","from llama_index.vector_stores.milvus import MilvusVectorStore\nfrom llama_index.core import (\n SimpleDirectoryReader,\n VectorStoreIndex,\n StorageContext,\n load_index_from_storage,\n)\nfrom llama_index.core.tools import QueryEngineTool, ToolMetadata\n\ninput_files = [\"./data/10k/lyft_2021.pdf\", \"./data/10k/uber_2021.pdf\"]\n\n# Create a single Milvus vector store\nvector_store = MilvusVectorStore(\n uri=\"./milvus_demo.db\", dim=1024, overwrite=False, collection_name=\"companies_docs\"\n)\n\n# Create a storage context with the Milvus vector store\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\n# Load data\ndocs = SimpleDirectoryReader(input_files=input_files).load_data()\n\n# Build index\nindex = VectorStoreIndex.from_documents(docs, storage_context=storage_context)\n\n# Define the query engine\ncompany_engine = index.as_query_engine(similarity_top_k=3)\n","# Define the different tools that can be used by our Agent.\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"lyft_10k\",\n description=(\n \"Provides information about Lyft financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"uber_10k\",\n description=(\n \"Provides information about Uber financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","from llama_index.llms.ollama import Ollama\nfrom llama_index.llms.mistralai import MistralAI\n\n# Set up the agent\nllm = Ollama(model=\"mistral-nemo\")\n\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"Could you please provide a comparison between Lyft and Uber's total revenues in 2021?\",\n allow_parallel_tool_calls=True,\n)\n\n# Example usage without metadata filtering\nprint(\"Response without metadata filtering:\")\nprint(response)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Example usage with metadata filtering\nfilters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"lyft_2021.pdf\")]\n)\n\nprint(f\"filters: {filters}\")\nfiltered_query_engine = index.as_query_engine(filters=filters)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Use this tool to retrieve specific data points about a company. \"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","# Set up the LLM we will use for Function Calling\n\nllm = Ollama(model=\"mistral-nemo\")\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"How many employees does Uber have?\",\n allow_parallel_tool_calls=True,\n)\nprint(response)\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"What are the risk factors for Lyft?\",\n allow_parallel_tool_calls=True,\n)\n\nprint(response)\n","> Question: What are the risk factors for Uber?\n\n> Response without metadata filtering:\nBased on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:\n\n- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.\n- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.\n- Risks related to attracting and retaining qualified drivers and riders.\n","from llama_index.core.prompts.base import PromptTemplate\n\n\n# Function to create a filtered query engine\ndef create_query_engine(question):\n # Extract metadata filters from question using a language model\n prompt_template = PromptTemplate(\n \"Given the following question, extract relevant metadata filters.\\n\"\n \"Consider company names, years, and any other relevant attributes.\\n\"\n \"Don't write any other text, just the MetadataFilters object\"\n \"Format it by creating a MetadataFilters like shown in the following\\n\"\n \"MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\\n\"\n \"If no specific filters are mentioned, returns an empty MetadataFilters()\\n\"\n \"Question: {question}\\n\"\n \"Metadata Filters:\\n\"\n )\n\n prompt = prompt_template.format(question=question)\n llm = Ollama(model=\"mistral-nemo\")\n response = llm.complete(prompt)\n\n metadata_filters_str = response.text.strip()\n if metadata_filters_str:\n metadata_filters = eval(metadata_filters_str)\n print(f\"eval: {metadata_filters}\")\n return index.as_query_engine(filters=metadata_filters)\n return index.as_query_engine()\n","response = create_query_engine(\n \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\n)\n","## Example usage with metadata filtering\nquestion = \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\nfiltered_query_engine = create_query_engine(question)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs_filtering\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n ),\n ),\n ),\n]\n# Set up the agent with the updated query engine tools\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=question,\n allow_parallel_tool_calls=True,\n)\n\nprint(\"Response with metadata filtering:\")\nprint(response)\n","from llama_agents import (\n AgentService,\n ToolService,\n LocalLauncher,\n MetaServiceTool,\n ControlPlaneServer,\n SimpleMessageQueue,\n AgentOrchestrator,\n)\n\nfrom llama_index.core.agent import FunctionCallingAgentWorker\nfrom llama_index.llms.mistralai import MistralAI\n\n# create our multi-agent framework components\nmessage_queue = SimpleMessageQueue()\ncontrol_plane = ControlPlaneServer(\n message_queue=message_queue,\n orchestrator=AgentOrchestrator(llm=MistralAI(\"mistral-large-latest\")),\n)\n\n# define Tool Service\ntool_service = ToolService(\n message_queue=message_queue,\n tools=query_engine_tools,\n running=True,\n step_interval=0.5,\n)\n\n# define meta-tools here\nmeta_tools = [\n await MetaServiceTool.from_tool_service(\n t.metadata.name,\n message_queue=message_queue,\n tool_service=tool_service,\n )\n for t in query_engine_tools\n]\n\n# define Agent and agent service\nworker1 = FunctionCallingAgentWorker.from_tools(\n meta_tools, llm=MistralAI(\"mistral-large-latest\")\n)\n\nagent1 = worker1.as_agent()\nagent_server_1 = AgentService(\n agent=agent1,\n message_queue=message_queue,\n description=\"Used to answer questions over differnet companies for their Financial results\",\n service_name=\"Companies_analyst_agent\",\n)\n","import logging\n\n# change logging level to enable or disable more verbose logging\nlogging.getLogger(\"llama_agents\").setLevel(logging.INFO)\n","## Define Launcher\nlauncher = LocalLauncher(\n [agent_server_1, tool_service],\n control_plane,\n message_queue,\n)\n","query_str = \"What are the risk factors for Uber?\"\nresult = launcher.launch_single(query_str)\n","print(result)\n"],"headingContent":"Multi-agent Systems with Mistral AI, Milvus and Llama-agents","anchorList":[{"label":"أنظمة متعددة الوكلاء مع ميسترال للذكاء الاصطناعي وميلفوس و Llama-agents","href":"Multi-agent-Systems-with-Mistral-AI-Milvus-and-Llama-agents","type":1,"isActive":false},{"label":"الهدف من هذا الدفتر","href":"Goal-of-this-Notebook","type":2,"isActive":false},{"label":"ميلفوس","href":"Milvus","type":2,"isActive":false},{"label":"لاما-وكلاء","href":"llama-agents","type":2,"isActive":false},{"label":"لاما إندكس","href":"llama-index","type":2,"isActive":false},{"label":"ميسترال للذكاء الاصطناعي","href":"Mistral-AI","type":2,"isActive":false},{"label":"تثبيت التبعيات","href":"Install-Dependencies","type":2,"isActive":false},{"label":"احصل على مفتاح واجهة برمجة التطبيقات لـ Mistral","href":"Get-your-API-Key-for-Mistral","type":2,"isActive":false},{"label":"تنزيل البيانات","href":"Download-data","type":2,"isActive":false},{"label":"إعداد نموذج التضمين","href":"Prepare-Embedding-Model","type":1,"isActive":false},{"label":"تعريف نموذج LLM","href":"Define-the-LLM-Model","type":2,"isActive":false},{"label":"تثبيت ميلفوس وتحميل البيانات","href":"Instanciate-Milvus-and-Load-Data","type":2,"isActive":false},{"label":"تحديد الأدوات","href":"Define-Tools","type":2,"isActive":false},{"label":"تصفية البيانات الوصفية","href":"Metadata-Filtering","type":2,"isActive":false},{"label":"حالات استخدام تصفية البيانات الوصفية للبيانات الوصفية","href":"Use-Cases-for-Metadata-Filtering","type":2,"isActive":false},{"label":"مثال على الاستخدام","href":"Example-usage","type":2,"isActive":false},{"label":"استدعاء الوظائف","href":"Function-Calling","type":2,"isActive":false},{"label":"التفاعل مع الوكيل","href":"Interact-with-the-Agent","type":2,"isActive":false},{"label":"مثال على الارتباك بدون تصفية البيانات الوصفية","href":"Example-of-Confusion-Without-Metadata-Filtering","type":2,"isActive":false},{"label":"استخدام وكيل لاستخراج مرشحات البيانات الوصفية","href":"Using-an-Agent-to-Extract-Metadata-Filters","type":2,"isActive":false},{"label":"مثال على الكود","href":"Code-Example","type":2,"isActive":false},{"label":"تنسيق الخدمات المختلفة باستخدام ميسترال لارج","href":"Orchestrating-the-different-services-with-Mistral-Large","type":2,"isActive":false},{"label":"الخاتمة","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.md b/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.md new file mode 100644 index 000000000..4d4d3b7f1 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/llama_agents_metadata.md @@ -0,0 +1,783 @@ +--- +id: llama_agents_metadata.md +summary: >- + سنستكشف في هذا الدفتر أفكارًا مختلفة: تخزين البيانات في ميلفوس، واستخدام فهرس + لاما مع نماذج ميسترال لاستعلامات البيانات، وإنشاء وكلاء بحث وقراءة البيانات + آليًا، وتطوير وكلاء لتصفية البيانات الوصفية بناءً على استعلامات المستخدم. +title: أنظمة متعددة الوكلاء مع ميسترال للذكاء الاصطناعي وميلفوس و Llama-agents +--- +

أنظمة متعددة الوكلاء مع ميسترال للذكاء الاصطناعي وميلفوس و Llama-agents

الهدف من هذا الدفتر

سنستكشف في هذا الدفتر أفكارًا مختلفة:

+
    +
  • 1️⃣ تخزين البيانات في ميلفوس: تعلم كيفية تخزين البيانات في ميلفوس، وهي قاعدة بيانات متجهة فعالة مصممة لعمليات البحث عن التشابه عالية السرعة وتطبيقات الذكاء الاصطناعي.

  • +
  • 2️⃣ استخدام فهرس اللاما مع نماذج ميسترال للاستعلام عن البيانات: اكتشف كيفية استخدام فهرس اللاما مع نماذج ميسترال للاستعلام عن البيانات المخزنة في ملفوس.

  • +
  • 3️⃣ إنشاء وكلاء بحث وقراءة مؤتمتة للبيانات: إنشاء وكلاء يمكنهم البحث عن البيانات وقراءتها تلقائيًا بناءً على استعلامات المستخدم. ستعمل هذه الوكلاء المؤتمتة على تحسين تجربة المستخدم من خلال تقديم استجابات سريعة ودقيقة، مما يقلل من جهد البحث اليدوي.

  • +
  • 4️⃣ تطوير وكلاء لتصفية البيانات الوصفية استنادًا إلى استفسارات المستخدم: تنفيذ وكلاء يمكنهم إنشاء عوامل تصفية البيانات الوصفية تلقائيًا من استفسارات المستخدم، مما يؤدي إلى تنقيح نتائج البحث ووضعها في سياقها، وتجنب الالتباس وتعزيز دقة المعلومات المسترجعة، حتى بالنسبة للاستفسارات المعقدة.

  • +
  • 🔍 ملخص بنهاية هذا الدفتر، سيكون لديك فهم شامل لاستخدام Milvus، وlama-index مع وكلاء llama، ونماذج Mistral لبناء نظام استرجاع بيانات قوي وفعال.

  • +
+

ميلفوس

Milvus عبارة عن قاعدة بيانات متجهة مفتوحة المصدر تعمل على تشغيل تطبيقات الذكاء الاصطناعي مع تضمينات المتجهات والبحث عن التشابه.

+

في هذا الدفتر، نستخدم Milvus Lite، وهو نسخة خفيفة الوزن من Milvus.

+

باستخدام Milvus Lite، يمكنك البدء في إنشاء تطبيق ذكاء اصطناعي مع البحث عن التشابه المتجه في غضون دقائق! ميلفوس لايت جيد للتشغيل في البيئة التالية:

+
    +
  • Jupyter Notebook / Google Colab
  • +
  • أجهزة الكمبيوتر المحمولة
  • +
  • أجهزة الحافة
  • +
+

+ + image.png + image.png

+

لاما-وكلاء

llama-agents يجعل من الممكن تشغيل الوكلاء كخدمات مصغرة. وهذا يجعل من الممكن توسيع نطاق الخدمات لأعلى ولأسفل.

+

لاما إندكس

LlamaIndex هو إطار عمل بيانات لتطبيق LLM الخاص بك. يوفر أدوات مثل:

+
    +
  • موصلات البيانات تستوعب بياناتك الحالية من مصدرها وتنسيقها الأصلي.
  • +
  • تقوم فهارس البيانات بهيكلة بياناتك في تمثيلات وسيطة يسهل على LLMs استهلاكها وأداءها.
  • +
  • توفر المحركات وصولاً لغوياً طبيعياً إلى بياناتك.
  • +
  • الوكلاء هم عاملون معرفيون مدعومون بأدوات مدعومة من LLM، بدءًا من الوظائف المساعدة البسيطة إلى تكامل واجهة برمجة التطبيقات والمزيد.
  • +
+

+ + image.png + image.png

+

ميسترال للذكاء الاصطناعي

Mistral AI هو مختبر أبحاث يقوم ببناء نماذج LLM ونماذج التضمينات، وقد أصدروا مؤخرًا إصدارات جديدة من نماذجهم، Mistral Nemo و Mistral Large التي أظهرت أنها جيدة بشكل خاص في RAG واستدعاء الدوال. ولهذا السبب، سنستخدمهما في هذه المذكرة

+

تثبيت التبعيات

$ pip install llama-agents pymilvus openai python-dotenv
+
+
$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai
+
+
# NOTE: This is ONLY necessary in jupyter notebook.
+# Details: Jupyter runs an event-loop behind the scenes.
+#          This results in nested event-loops when we start an event-loop to make async queries.
+#          This is normally not allowed, we use nest_asyncio to allow it for convenience.
+import nest_asyncio
+
+nest_asyncio.apply()
+
+

احصل على مفتاح واجهة برمجة التطبيقات لـ Mistral

يمكنك الحصول على مفتاح Mistral API من وحدة التحكم السحابية لـ Mistral Cloud Console.

+
"""
+load_dotenv reads key-value pairs from a .env file and can set them as environment variables.
+This is useful to avoid leaking your API key for example :D
+"""
+
+from dotenv import load_dotenv
+import os
+
+load_dotenv()
+
+
True
+
+

تنزيل البيانات

$ mkdir -p 'data/10k/'
+$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
+$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
+
+

إعداد نموذج التضمين

نحدد نموذج التضمين الذي سيتم استخدامه في هذا الدفتر. نحن نستخدم mistral-embed ، وهو نموذج تضمين تم تطويره من قبل Mistral، وقد تم تدريبه مع وضع عمليات الاسترجاع في الاعتبار، مما يجعله نموذجًا جيدًا جدًا لنظام RAG العميل الخاص بنا. للحصول على التفاصيل، يُرجى الرجوع إلى صفحة التضمين على وثائق ميسترال.

+
from llama_index.core import Settings
+from llama_index.embeddings.mistralai import MistralAIEmbedding
+
+# Define the default Embedding model used in this Notebook.
+# We are using Mistral Models, so we are also using Mistral Embeddings
+
+Settings.embed_model = MistralAIEmbedding(model_name="mistral-embed")
+
+

تعريف نموذج LLM

يستخدم فهرس Llama Index نماذج LLM للرد على المطالبات والاستعلامات، وهو مسؤول عن كتابة استجابات اللغة الطبيعية. نعرّف Mistral Nemo على أنه النموذج الافتراضي. يوفر Nemo نافذة سياق كبيرة تصل إلى 128 ألف رمز. ويُعد استدلاله ومعرفته بالعالم ودقة ترميزه من أحدث ما توصلت إليه التكنولوجيا في فئته من حيث الحجم.

+
from llama_index.llms.ollama import Ollama
+
+Settings.llm = Ollama("mistral-nemo")
+
+

تثبيت ميلفوس وتحميل البيانات

Milvus عبارة عن قاعدة بيانات متجهية مفتوحة المصدر شائعة وشائعة الاستخدام، تعمل على تشغيل تطبيقات الذكاء الاصطناعي من خلال بحث تشابه المتجهات عالي الأداء وقابل للتطوير.

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون متجه، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام uri الخادم، على سبيل المثالhttp://localhost:19530 ، كـ uri الخاص بك.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، قم بتعديل uri والرمز المميز، اللذين يتوافقان مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
  • +
+
from llama_index.vector_stores.milvus import MilvusVectorStore
+from llama_index.core import (
+    SimpleDirectoryReader,
+    VectorStoreIndex,
+    StorageContext,
+    load_index_from_storage,
+)
+from llama_index.core.tools import QueryEngineTool, ToolMetadata
+
+input_files = ["./data/10k/lyft_2021.pdf", "./data/10k/uber_2021.pdf"]
+
+# Create a single Milvus vector store
+vector_store = MilvusVectorStore(
+    uri="./milvus_demo.db", dim=1024, overwrite=False, collection_name="companies_docs"
+)
+
+# Create a storage context with the Milvus vector store
+storage_context = StorageContext.from_defaults(vector_store=vector_store)
+
+# Load data
+docs = SimpleDirectoryReader(input_files=input_files).load_data()
+
+# Build index
+index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
+
+# Define the query engine
+company_engine = index.as_query_engine(similarity_top_k=3)
+
+

تحديد الأدوات

إحدى الخطوات الرئيسية في بناء وكيل فعّال هي تحديد الأدوات التي يمكنه استخدامها لأداء مهامه. هذه الأدوات هي في الأساس وظائف أو خدمات يمكن للوكيل أن يستدعيها لاسترداد المعلومات أو تنفيذ الإجراءات.

+

فيما يلي، سنحدد أدناه أداتين يمكن لوكيلنا استخدامهما للاستعلام عن المعلومات المالية حول ليفت وأوبر من عام 2021. سيتم دمج هذه الأدوات في وكيلنا، مما يسمح له بالرد على استعلامات اللغة الطبيعية بمعلومات دقيقة وذات صلة.

+

إذا نظرت إلى الرسم البياني الذي لدينا في الأعلى، فهذا هو "خدمة الوكيل".

+
# Define the different tools that can be used by our Agent.
+query_engine_tools = [
+    QueryEngineTool(
+        query_engine=company_engine,
+        metadata=ToolMetadata(
+            name="lyft_10k",
+            description=(
+                "Provides information about Lyft financials for year 2021. "
+                "Use a detailed plain text question as input to the tool."
+                "Do not attempt to interpret or summarize the data."
+            ),
+        ),
+    ),
+    QueryEngineTool(
+        query_engine=company_engine,
+        metadata=ToolMetadata(
+            name="uber_10k",
+            description=(
+                "Provides information about Uber financials for year 2021. "
+                "Use a detailed plain text question as input to the tool."
+                "Do not attempt to interpret or summarize the data."
+            ),
+        ),
+    ),
+]
+
+
from llama_index.llms.ollama import Ollama
+from llama_index.llms.mistralai import MistralAI
+
+# Set up the agent
+llm = Ollama(model="mistral-nemo")
+
+response = llm.predict_and_call(
+    query_engine_tools,
+    user_msg="Could you please provide a comparison between Lyft and Uber's total revenues in 2021?",
+    allow_parallel_tool_calls=True,
+)
+
+# Example usage without metadata filtering
+print("Response without metadata filtering:")
+print(response)
+
+
Response without metadata filtering:
+The revenue for Lyft in 2021 was $3.84 billion.
+
+Uber's total revenue for the year ended December 31, 2021 was $17,455 million.
+
+

تصفية البيانات الوصفية

يدعمMilvus تصفية البيانات الوصفية، وهي تقنية تتيح لك تنقيح نتائج البحث وتضييق نطاقها بناءً على سمات أو علامات محددة مرتبطة ببياناتك. يعد هذا مفيدًا بشكل خاص في السيناريوهات التي يكون لديك فيها الكثير من البيانات وتحتاج إلى استرداد المجموعة الفرعية ذات الصلة فقط من البيانات التي تطابق معايير معينة.

+

حالات استخدام تصفية البيانات الوصفية للبيانات الوصفية

    +
  • الدقة في نتائج البحث: من خلال تطبيق فلاتر البيانات الوصفية يمكنك التأكد من أن نتائج البحث وثيقة الصلة باستعلام المستخدم. على سبيل المثال، إذا كان لديك مجموعة من المستندات المالية، يمكنك تصفيتها بناءً على اسم الشركة أو السنة أو أي بيانات وصفية أخرى ذات صلة.

  • +
  • الكفاءة: تساعد تصفية البيانات الوصفية في تقليل كمية البيانات التي يجب معالجتها، مما يجعل عمليات البحث أكثر كفاءة. وهذا مفيد بشكل خاص عند التعامل مع مجموعات البيانات الكبيرة.

  • +
  • التخصيص: قد يكون للمستخدمين أو التطبيقات المختلفة متطلبات مختلفة. تسمح لك تصفية البيانات الوصفية بتخصيص نتائج البحث لتلبية احتياجات محددة، مثل استرداد المستندات من سنة أو شركة معينة.

  • +
+

مثال على الاستخدام

في كتلة التعليمات البرمجية أدناه، يتم استخدام تصفية البيانات الوصفية أدناه لإنشاء محرك استعلام تمت تصفيته يسترجع المستندات بناءً على زوج محدد من البيانات الوصفية ذات القيمة الرئيسية: file_name: lyft_2021.pdf

+

QueryEngineTool المحدد أدناه هو أكثر عمومية من المحدد أعلاه، في المحدد أعلاه، كان لدينا أداة لكل شركة (أوبر وليفت)، أما في هذا المحرك فهو أكثر عمومية. نحن نعلم فقط أن لدينا مستندات مالية عن الشركات ولكن هذا كل شيء. بإضافة تصفية البيانات الوصفية (Metadata Filtering)، يمكننا بعد ذلك التصفية للحصول على البيانات من مستند معين فقط.

+
from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
+
+# Example usage with metadata filtering
+filters = MetadataFilters(
+    filters=[ExactMatchFilter(key="file_name", value="lyft_2021.pdf")]
+)
+
+print(f"filters: {filters}")
+filtered_query_engine = index.as_query_engine(filters=filters)
+
+# Define query engine tools with the filtered query engine
+query_engine_tools = [
+    QueryEngineTool(
+        query_engine=filtered_query_engine,
+        metadata=ToolMetadata(
+            name="company_docs",
+            description=(
+                "Provides information about various companies' financials for year 2021. "
+                "Use a detailed plain text question as input to the tool."
+                "Use this tool to retrieve specific data points about a company. "
+                "Do not attempt to interpret or summarize the data."
+            ),
+        ),
+    ),
+]
+
+
filters: filters=[MetadataFilter(key='file_name', value='lyft_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
+
+

استدعاء الوظائف

يدعم ميسترال نيمو وكبير استدعاء الدالة الأصلية. هناك تكامل سلس مع أدوات LlamaIndex، من خلال الدالة predict_and_call على الدالة LLM. يتيح ذلك للمستخدم إرفاق أي أدوات والسماح لـ LLM بتحديد الأدوات التي يجب استدعاؤها (إن وجدت).

+

يمكنك معرفة المزيد عن الوكلاء على موقع llama-index الإلكتروني.

+
# Set up the LLM we will use for Function Calling
+
+llm = Ollama(model="mistral-nemo")
+
+

التفاعل مع الوكيل

الآن يمكننا الآن تصفية البيانات الوصفية أثناء العمل:

+
    +
  1. في الأولى، يجب ألا يتمكن الوكيل من العثور على أي شيء لاستعلام المستخدم لأنه يتعلق بأوبر ونقوم بتصفية المستندات المتعلقة بـ Lyft فقط.
  2. +
  3. في الثانية، يجب أن يكون الوكيل قادرًا على العثور على معلومات حول Lyft لأننا سنبحث فقط في المستندات التي تتعلق بـ Lyft.
  4. +
+
response = llm.predict_and_call(
+    query_engine_tools,
+    user_msg="How many employees does Uber have?",
+    allow_parallel_tool_calls=True,
+)
+print(response)
+
+
I'm unable to provide information about Uber's employee count as it's outside the given Lyft context.
+
+
response = llm.predict_and_call(
+    query_engine_tools,
+    user_msg="What are the risk factors for Lyft?",
+    allow_parallel_tool_calls=True,
+)
+
+print(response)
+
+
Investing in Lyft carries significant risks. These include general economic factors like impacts from pandemics or crises, operational factors such as competition, pricing changes, and driver/ride growth unpredictability, insurance coverage issues, autonomous vehicle technology uncertainties, reputational concerns, potential security breaches, reliance on third-party services, and challenges in expanding platform offerings. Lyft's business operations are subject to numerous other risks not explicitly mentioned here, which could also harm its financial condition and prospects.
+
+

مثال على الارتباك بدون تصفية البيانات الوصفية

> Question: What are the risk factors for Uber?
+
+> Response without metadata filtering:
+Based on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:
+
+- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.
+- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.
+- Risks related to attracting and retaining qualified drivers and riders.
+
+

في هذا المثال، يقدم النظام بشكل غير صحيح معلومات عن Lyft بدلاً من Uber، مما يؤدي إلى استجابة مضللة. يبدأ النظام بالقول إنه لا يملك المعلومات ولكن بعد ذلك يستمر في البحث أكثر فأكثر.

+

استخدام وكيل لاستخراج مرشحات البيانات الوصفية

لمعالجة هذه المشكلة، يمكننا استخدام وكيل لاستخراج مرشحات البيانات الوصفية تلقائيًا من سؤال المستخدم وتطبيقها أثناء عملية الإجابة على السؤال. وهذا يضمن استرجاع النظام للمعلومات الصحيحة وذات الصلة.

+

مثال على الكود

فيما يلي مثال برمجي يوضّح كيفية إنشاء محرك استعلام تمت تصفيته باستخدام وكيل لاستخراج مرشحات البيانات الوصفية من سؤال المستخدم:

+

الشرح

    +
  • قالب موجه: تُستخدم فئة PromptTemplate لتعريف قالب لاستخراج مرشحات البيانات الوصفية من سؤال المستخدم. يوجه القالب نموذج اللغة للنظر في أسماء الشركات والسنوات والسمات الأخرى ذات الصلة.

  • +
  • LLM: يُستخدم نموذجاللغة لاستخراج مرشحات البيانات الوصفية بناءً على سؤال المستخدم. تتم مطالبة النموذج بالسؤال والقالب لاستخراج المرشحات ذات الصلة.

  • +
  • مرشحات البيانات الوصفية: يتم تحليل الاستجابة من LLM لإنشاء كائن MetadataFilters. إذا لم يتم ذكر أي مرشحات محددة، يتم إرجاع كائن MetadataFilters فارغ.

  • +
  • محرك الاستعلام المصفى: يقوم الأسلوب index.as_query_engine(filters=metadata_filters) بإنشاء محرك استعلام يطبق مرشحات البيانات الوصفية المستخرجة على الفهرس. وهذا يضمن استرجاع المستندات المطابقة لمعايير التصفية فقط.

  • +
+
from llama_index.core.prompts.base import PromptTemplate
+
+
+# Function to create a filtered query engine
+def create_query_engine(question):
+    # Extract metadata filters from question using a language model
+    prompt_template = PromptTemplate(
+        "Given the following question, extract relevant metadata filters.\n"
+        "Consider company names, years, and any other relevant attributes.\n"
+        "Don't write any other text, just the MetadataFilters object"
+        "Format it by creating a MetadataFilters like shown in the following\n"
+        "MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\n"
+        "If no specific filters are mentioned, returns an empty MetadataFilters()\n"
+        "Question: {question}\n"
+        "Metadata Filters:\n"
+    )
+
+    prompt = prompt_template.format(question=question)
+    llm = Ollama(model="mistral-nemo")
+    response = llm.complete(prompt)
+
+    metadata_filters_str = response.text.strip()
+    if metadata_filters_str:
+        metadata_filters = eval(metadata_filters_str)
+        print(f"eval: {metadata_filters}")
+        return index.as_query_engine(filters=metadata_filters)
+    return index.as_query_engine()
+
+
response = create_query_engine(
+    "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
+)
+
+
eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
+
+
## Example usage with metadata filtering
+question = "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
+filtered_query_engine = create_query_engine(question)
+
+# Define query engine tools with the filtered query engine
+query_engine_tools = [
+    QueryEngineTool(
+        query_engine=filtered_query_engine,
+        metadata=ToolMetadata(
+            name="company_docs_filtering",
+            description=(
+                "Provides information about various companies' financials for year 2021. "
+                "Use a detailed plain text question as input to the tool."
+            ),
+        ),
+    ),
+]
+# Set up the agent with the updated query engine tools
+response = llm.predict_and_call(
+    query_engine_tools,
+    user_msg=question,
+    allow_parallel_tool_calls=True,
+)
+
+print("Response with metadata filtering:")
+print(response)
+
+
eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
+Response with metadata filtering:
+Uber's total revenue for the year ended December 31, 2021, is $17.455 billion.
+
+

تنسيق الخدمات المختلفة باستخدام ميسترال لارج

Mistral Large هو النموذج الرئيسي لـ Mistral مع قدرات تفكير ومعرفة وترميز جيدة جدًا. وهو مثالي للمهام المعقدة التي تتطلب قدرات استدلالية كبيرة أو عالية التخصص. لديه قدرات استدعاء دالة متقدمة، وهو بالضبط ما نحتاجه لتنسيق وكلائنا المختلفين.

+

لماذا نحتاج إلى نموذج أكثر ذكاءً؟

السؤال الذي تتم الإجابة عليه أدناه يمثل تحديًا خاصًا لأنه يتطلب تنسيق خدمات ووكلاء متعددين لتوفير استجابة متماسكة ودقيقة. يتضمن ذلك تنسيق أدوات ووكلاء مختلفين لاسترجاع ومعالجة المعلومات من مصادر مختلفة، مثل البيانات المالية من شركات مختلفة.

+

ما الصعوبة في ذلك؟

    +
  • التعقيد: يتضمن السؤال وكلاء وخدمات متعددة، لكل منها وظائفها ومصادر البيانات الخاصة بها. يعد تنسيق هذه الوكلاء للعمل معًا بسلاسة مهمة معقدة.
  • +
+
    +
  • تكامل البيانات: يتطلب السؤال دمج البيانات من مصادر مختلفة، الأمر الذي قد يكون صعبًا بسبب الاختلافات في تنسيقات البيانات وهياكلها وبياناتها الوصفية.

  • +
  • الفهم السياقي: قد يتطلب السؤال فهم السياق والعلاقات بين أجزاء مختلفة من المعلومات، وهي مهمة صعبة من الناحية المعرفية.

  • +
+

لماذا قد يساعد ميسترال لارج في هذه الحالة؟

يعتبر Mistral Large مناسبًا تمامًا لهذه المهمة نظرًا لقدراته المتقدمة في الاستدلال واستدعاء الوظائف. إليك كيف يساعدك:

+
    +
  • الاستدلال المتقدم: يمكن لميسترال لارج التعامل مع مهام الاستدلال المعقدة، مما يجعله مثاليًا لتنسيق العديد من الوكلاء والخدمات. يمكنه فهم العلاقات بين أجزاء المعلومات المختلفة واتخاذ قرارات مستنيرة.

  • +
  • قدرات استدعاء الوظائف: تتمتع Mistral Large بقدرات متقدمة لاستدعاء الوظائف، وهي ضرورية لتنسيق إجراءات الوكلاء المختلفين. وهذا يسمح بالتكامل والتنسيق السلس بين الخدمات المختلفة.

  • +
  • المعرفة المتخصصة: تم تصميم Mistral Large للمهام المتخصصة للغاية، مما يجعله مناسبًا تمامًا للتعامل مع الاستعلامات المعقدة التي تتطلب معرفة عميقة بالمجال.

  • +
+

لكل هذه الأسباب، قررت أن استخدام Mistral Large بدلاً من Mistral Nemo هو الأنسب هنا.

+
from llama_agents import (
+    AgentService,
+    ToolService,
+    LocalLauncher,
+    MetaServiceTool,
+    ControlPlaneServer,
+    SimpleMessageQueue,
+    AgentOrchestrator,
+)
+
+from llama_index.core.agent import FunctionCallingAgentWorker
+from llama_index.llms.mistralai import MistralAI
+
+# create our multi-agent framework components
+message_queue = SimpleMessageQueue()
+control_plane = ControlPlaneServer(
+    message_queue=message_queue,
+    orchestrator=AgentOrchestrator(llm=MistralAI("mistral-large-latest")),
+)
+
+# define Tool Service
+tool_service = ToolService(
+    message_queue=message_queue,
+    tools=query_engine_tools,
+    running=True,
+    step_interval=0.5,
+)
+
+# define meta-tools here
+meta_tools = [
+    await MetaServiceTool.from_tool_service(
+        t.metadata.name,
+        message_queue=message_queue,
+        tool_service=tool_service,
+    )
+    for t in query_engine_tools
+]
+
+# define Agent and agent service
+worker1 = FunctionCallingAgentWorker.from_tools(
+    meta_tools, llm=MistralAI("mistral-large-latest")
+)
+
+agent1 = worker1.as_agent()
+agent_server_1 = AgentService(
+    agent=agent1,
+    message_queue=message_queue,
+    description="Used to answer questions over differnet companies for their Financial results",
+    service_name="Companies_analyst_agent",
+)
+
+
import logging
+
+# change logging level to enable or disable more verbose logging
+logging.getLogger("llama_agents").setLevel(logging.INFO)
+
+
## Define Launcher
+launcher = LocalLauncher(
+    [agent_server_1, tool_service],
+    control_plane,
+    message_queue,
+)
+
+
query_str = "What are the risk factors for Uber?"
+result = launcher.launch_single(query_str)
+
+
INFO:llama_agents.message_queues.simple - Consumer AgentService-27cde4ed-5163-4005-90fc-13c158eda7e3: Companies_analyst_agent has been registered.
+INFO:llama_agents.message_queues.simple - Consumer ToolService-b73c500a-5fbe-4f57-95c7-db74e173bd1b: default_tool_service has been registered.
+INFO:llama_agents.message_queues.simple - Consumer 62465ab8-32ff-436e-95fa-74e828745150: human has been registered.
+INFO:llama_agents.message_queues.simple - Consumer ControlPlaneServer-f4c27d43-5474-43ca-93ca-a9aeed4534d7: control_plane has been registered.
+INFO:llama_agents.services.agent - Companies_analyst_agent launch_local
+INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.NEW_TASK'
+INFO:llama_agents.message_queues.simple - Launching message queue locally
+INFO:llama_agents.services.agent - Processing initiated.
+INFO:llama_agents.services.tool - Processing initiated.
+INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
+INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
+INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
+INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
+INFO:llama_agents.message_queues.simple - Consumer MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41: MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41 has been registered.
+INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
+INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
+INFO:llama_agents.services.tool - Processing tool call id f4c270a4-bc47-4bbf-92fe-e2cc80757943 with company_docs
+INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
+INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
+INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
+INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
+INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
+INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
+INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
+INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
+INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
+INFO:llama_agents.services.tool - Processing tool call id f888f9a8-e716-4505-bfe2-577452e9b6e6 with company_docs
+INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
+INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
+INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
+INFO:llama_agents.message_queues.base - Publishing message to 'human' with action 'ActionTypes.COMPLETED_TASK'
+INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
+INFO:llama_agents.message_queues.simple - Successfully published message 'human' to consumer.
+
+
print(result)
+
+
[{"name": "finalize", "arguments": {"input": "Uber faces several risk factors, including general economic impacts such as pandemics or downturns, operational challenges like competition, market growth uncertainty, attracting and retaining drivers and riders, insurance adequacy, autonomous vehicle technology development, maintaining its reputation and brand, and managing growth. Additionally, reliance on third-party providers for various services can introduce further risks to its operations."}}]
+
+

الخاتمة

في هذا الدفتر، رأيت كيف يمكنك استخدام عوامل اللاما لتنفيذ إجراءات مختلفة عن طريق استدعاء الأدوات المناسبة. من خلال استخدام ميسترال لارج مع ميسترال نيمو، أوضحنا كيفية تنظيم أنظمة ذكية وفعالة من حيث الموارد بشكل فعال من خلال الاستفادة من نقاط القوة في مختلف أدوات لاما. رأينا أن الوكيل يمكنه اختيار المجموعة التي تحتوي على البيانات التي يطلبها المستخدم.

diff --git a/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.json b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.json new file mode 100644 index 000000000..c236af4d7 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.json @@ -0,0 +1 @@ +{"codeList":["$ pip install dynamiq pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Importing necessary libraries for the workflow\nfrom io import BytesIO\nfrom dynamiq import Workflow\nfrom dynamiq.nodes import InputTransformer\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.converters import PyPDFConverter\nfrom dynamiq.nodes.splitters.document import DocumentSplitter\nfrom dynamiq.nodes.embedders import OpenAIDocumentEmbedder\nfrom dynamiq.nodes.writers import MilvusDocumentWriter\n\n# Initialize the workflow\nrag_wf = Workflow()\n","converter = PyPDFConverter(document_creation_mode=\"one-doc-per-page\")\nconverter_added = rag_wf.flow.add_nodes(\n converter\n) # Add node to the DAG (Directed Acyclic Graph)\n","document_splitter = DocumentSplitter(\n split_by=\"sentence\", # Splits documents into sentences\n split_length=10,\n split_overlap=1,\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[converter.id]}.output.documents\",\n },\n ),\n).depends_on(\n converter\n) # Set dependency on the PDF converter\nsplitter_added = rag_wf.flow.add_nodes(document_splitter) # Add to the DAG\n","embedder = OpenAIDocumentEmbedder(\n connection=OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"]),\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[document_splitter.id]}.output.documents\",\n },\n ),\n).depends_on(\n document_splitter\n) # Set dependency on the splitter\ndocument_embedder_added = rag_wf.flow.add_nodes(embedder) # Add to the DAG\n","vector_store = (\n MilvusDocumentWriter(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n create_if_not_exist=True,\n metric_type=\"COSINE\",\n )\n .inputs(documents=embedder.outputs.documents) # Connect to embedder output\n .depends_on(embedder) # Set dependency on the embedder\n)\nmilvus_writer_added = rag_wf.flow.add_nodes(vector_store) # Add to the DAG\n","file_paths = [\"./pdf_files/WhatisMilvus.pdf\"]\ninput_data = {\n \"files\": [BytesIO(open(path, \"rb\").read()) for path in file_paths],\n \"metadata\": [{\"filename\": path} for path in file_paths],\n}\n\n# Run the workflow with the prepared input data\ninserted_data = rag_wf.run(input_data=input_data)\n","from dynamiq import Workflow\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.embedders import OpenAITextEmbedder\nfrom dynamiq.nodes.retrievers import MilvusDocumentRetriever\nfrom dynamiq.nodes.llms import OpenAI\nfrom dynamiq.prompts import Message, Prompt\n\n# Initialize the workflow\nretrieval_wf = Workflow()\n","# Establish OpenAI connection\nopenai_connection = OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"])\n\n# Define the text embedder node\nembedder = OpenAITextEmbedder(\n connection=openai_connection,\n model=\"text-embedding-3-small\",\n)\n\n# Add the embedder node to the workflow\nembedder_added = retrieval_wf.flow.add_nodes(embedder)\n","document_retriever = (\n MilvusDocumentRetriever(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n top_k=5,\n )\n .inputs(embedding=embedder.outputs.embedding) # Connect to embedder output\n .depends_on(embedder) # Dependency on the embedder node\n)\n\n# Add the retriever node to the workflow\nmilvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)\n","# Define the prompt template for the LLM\nprompt_template = \"\"\"\nPlease answer the question based on the provided context.\n\nQuestion: {{ query }}\n\nContext:\n{% for document in documents %}\n- {{ document.content }}\n{% endfor %}\n\"\"\"\n\n# Create the prompt object\nprompt = Prompt(messages=[Message(content=prompt_template, role=\"user\")])\n","answer_generator = (\n OpenAI(\n connection=openai_connection,\n model=\"gpt-4o\",\n prompt=prompt,\n )\n .inputs(\n documents=document_retriever.outputs.documents,\n query=embedder.outputs.query,\n )\n .depends_on(\n [document_retriever, embedder]\n ) # Dependencies on retriever and embedder\n)\n\n# Add the answer generator node to the workflow\nanswer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)\n","# Run the workflow with a sample query\nsample_query = \"What is the Advanced Search Algorithms in Milvus?\"\n\nresult = retrieval_wf.run(input_data={\"query\": sample_query})\n\nanswer = result.output.get(answer_generator.id).get(\"output\", {}).get(\"content\")\nprint(answer)\n"],"headingContent":"Getting Started with Dynamiq and Milvus","anchorList":[{"label":"الشروع في العمل مع Dynamiq وMilvus","href":"Getting-Started-with-Dynamiq-and-Milvus","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"RAG - تدفق فهرسة المستندات","href":"RAG---Document-Indexing-Flow","type":2,"isActive":false},{"label":"تدفق استرجاع مستندات RAG","href":"RAG-Document-Retrieval-Flow","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.md b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.md new file mode 100644 index 000000000..395d6b585 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_dynamiq.md @@ -0,0 +1,338 @@ +--- +id: milvus_rag_with_dynamiq.md +summary: >- + في هذا البرنامج التعليمي، سنستكشف كيفية استخدام Dynamiq بسلاسة مع Milvus، + قاعدة البيانات المتجهة عالية الأداء المصممة خصيصًا لسير عمل RAG. يتفوق Milvus + في تخزين وفهرسة واسترجاع التضمينات المتجهة بكفاءة، مما يجعله مكونًا لا غنى عنه + لأنظمة الذكاء الاصطناعي التي تتطلب وصولًا سريعًا ودقيقًا للبيانات السياقية. +title: الشروع في العمل مع Dynamiq وMilvus +--- +

+Open In Colab + + +GitHub Repository +

+

الشروع في العمل مع Dynamiq وMilvus

Dynamiq هو إطار عمل قوي للذكاء الاصطناعي العام يعمل على تبسيط عملية تطوير التطبيقات المدعومة بالذكاء الاصطناعي. وبفضل الدعم القوي للجيل المعزز للاسترجاع (RAG) وعوامل النموذج اللغوي الكبير (LLM)، يمكّن Dynamiq المطورين من إنشاء أنظمة ذكية وديناميكية بسهولة وكفاءة.

+

في هذا البرنامج التعليمي، سنستكشف كيفية استخدام Dynamiq بسلاسة مع Milvus، قاعدة البيانات المتجهة عالية الأداء المصممة خصيصًا لسير عمل RAG. يتفوق Milvus في تخزين وفهرسة واسترجاع التضمينات المتجهة بكفاءة، مما يجعله مكونًا لا غنى عنه لأنظمة الذكاء الاصطناعي التي تتطلب وصولًا سريعًا ودقيقًا للبيانات السياقية.

+

سيغطي هذا الدليل المفصّل خطوة بخطوة مسارين أساسيين لسير عمل RAG:

+
    +
  • تدفق فهرسة المستندات: تعرف على كيفية معالجة ملفات الإدخال (مثل ملفات PDF)، وتحويل محتواها إلى تضمينات متجهة، وتخزينها في Milvus. تضمن الاستفادة من قدرات الفهرسة عالية الأداء في Milvus أن تكون بياناتك جاهزة للاسترجاع السريع.

  • +
  • تدفق استرجاع المستندات: اكتشف كيفية الاستعلام عن تضمينات مستندات Milvus ذات الصلة واستخدامها لإنشاء استجابات ثاقبة مدركة للسياق مع وكلاء LLM من Dynamiq، مما يخلق تجربة مستخدم سلسة مدعومة بالذكاء الاصطناعي.

  • +
+

بنهاية هذا البرنامج التعليمي، ستكتسب فهمًا قويًا لكيفية عمل Milvus وDynamiq معًا لبناء أنظمة ذكاء اصطناعي قابلة للتطوير ومدركة للسياق ومصممة خصيصًا لتلبية احتياجاتك.

+

التحضير

قم بتنزيل المكتبات المطلوبة

$ pip install dynamiq pymilvus
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

تكوين وكيل LLM

سنستخدم OpenAI كعامل LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

RAG - تدفق فهرسة المستندات

يوضّح هذا البرنامج التعليمي سير عمل استرجاع - توليد معزز (RAG) لفهرسة المستندات باستخدام Milvus كقاعدة بيانات المتجهات. يأخذ سير العمل ملفات PDF المدخلة، ويعالجها إلى أجزاء أصغر، ويُنشئ تضمينات متجهة باستخدام نموذج تضمين OpenAI، ويخزن التضمينات في مجموعة Milvus لاسترجاعها بكفاءة.

+

بحلول نهاية سير العمل هذا، سيكون لديك نظام فهرسة مستندات قابل للتطوير وفعال يدعم مهام RAG المستقبلية مثل البحث الدلالي والإجابة عن الأسئلة.

+

استيراد المكتبات المطلوبة وتهيئة سير العمل

# Importing necessary libraries for the workflow
+from io import BytesIO
+from dynamiq import Workflow
+from dynamiq.nodes import InputTransformer
+from dynamiq.connections import (
+    OpenAI as OpenAIConnection,
+    Milvus as MilvusConnection,
+    MilvusDeploymentType,
+)
+from dynamiq.nodes.converters import PyPDFConverter
+from dynamiq.nodes.splitters.document import DocumentSplitter
+from dynamiq.nodes.embedders import OpenAIDocumentEmbedder
+from dynamiq.nodes.writers import MilvusDocumentWriter
+
+# Initialize the workflow
+rag_wf = Workflow()
+
+

تعريف عقدة محول PDF

converter = PyPDFConverter(document_creation_mode="one-doc-per-page")
+converter_added = rag_wf.flow.add_nodes(
+    converter
+)  # Add node to the DAG (Directed Acyclic Graph)
+
+

تعريف عقدة تقسيم المستند

document_splitter = DocumentSplitter(
+    split_by="sentence",  # Splits documents into sentences
+    split_length=10,
+    split_overlap=1,
+    input_transformer=InputTransformer(
+        selector={
+            "documents": f"${[converter.id]}.output.documents",
+        },
+    ),
+).depends_on(
+    converter
+)  # Set dependency on the PDF converter
+splitter_added = rag_wf.flow.add_nodes(document_splitter)  # Add to the DAG
+
+

تعريف عقدة التضمين

embedder = OpenAIDocumentEmbedder(
+    connection=OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]),
+    input_transformer=InputTransformer(
+        selector={
+            "documents": f"${[document_splitter.id]}.output.documents",
+        },
+    ),
+).depends_on(
+    document_splitter
+)  # Set dependency on the splitter
+document_embedder_added = rag_wf.flow.add_nodes(embedder)  # Add to the DAG
+
+

تعريف عقدة مخزن متجه ميلفوس الناقل

vector_store = (
+    MilvusDocumentWriter(
+        connection=MilvusConnection(
+            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
+        ),
+        index_name="my_milvus_collection",
+        dimension=1536,
+        create_if_not_exist=True,
+        metric_type="COSINE",
+    )
+    .inputs(documents=embedder.outputs.documents)  # Connect to embedder output
+    .depends_on(embedder)  # Set dependency on the embedder
+)
+milvus_writer_added = rag_wf.flow.add_nodes(vector_store)  # Add to the DAG
+
+
2024-11-19 22:14:03 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
+2024-11-19 22:14:03 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
+2024-11-19 22:14:04 - DEBUG - Created new connection using: 0bef2849fdb1458a85df8bb9dd27f51d
+2024-11-19 22:14:04 - INFO - Collection my_milvus_collection does not exist. Creating a new collection.
+2024-11-19 22:14:04 - DEBUG - Successfully created collection: my_milvus_collection
+2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
+2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
+
+
+

يقدم Milvus نوعين من النشر، يلبيان حالات استخدام مختلفة:

+
    +
  1. نوع النشر MilvusDeploymentType.FILE
  2. +
+
    +
  • مثالي للنماذج الأولية المحلية أو تخزين البيانات على نطاق صغير.
  • +
  • قم بتعيين uri إلى مسار ملف محلي (على سبيل المثال، ./milvus.db) للاستفادة من Milvus Lite، والذي يقوم تلقائيًا بتخزين جميع البيانات في الملف المحدد.
  • +
  • هذا خيار مناسب للإعداد والتجريب السريع.
  • +
+
    +
  1. MilvusDeploymentType.HOST
  2. +
+
    +
  • مصمم لسيناريوهات البيانات واسعة النطاق، مثل إدارة أكثر من مليون ناقل.

    +

    خادم مستضاف ذاتياً

    +
      +
    • نشر خادم Milvus عالي الأداء باستخدام Docker أو Kubernetes.
    • +
    • قم بتكوين عنوان الخادم والمنفذ كعنوان uri (على سبيل المثال، http://localhost:19530).
    • +
    • إذا تم تمكين المصادقة:
    • +
    • قم بتوفير <your_username>:<your_password> كـ token.
    • +
    • إذا تم تعطيل المصادقة:
    • +
    • اترك token غير مضبوط.
    • +
    +

    زيليز كلاود (خدمة مُدارة)

    +
  • +
+
+

تحديد بيانات الإدخال وتشغيل سير العمل

file_paths = ["./pdf_files/WhatisMilvus.pdf"]
+input_data = {
+    "files": [BytesIO(open(path, "rb").read()) for path in file_paths],
+    "metadata": [{"filename": path} for path in file_paths],
+}
+
+# Run the workflow with the prepared input data
+inserted_data = rag_wf.run(input_data=input_data)
+
+
/var/folders/09/d0hx80nj35sb5hxb5cpc1q180000gn/T/ipykernel_31319/3145804345.py:4: ResourceWarning: unclosed file <_io.BufferedReader name='./pdf_files/WhatisMilvus.pdf'>
+  BytesIO(open(path, "rb").read()) for path in file_paths
+ResourceWarning: Enable tracemalloc to get the object allocation traceback
+2024-11-19 22:14:09 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution started.
+2024-11-19 22:14:09 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
+2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution started.
+2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution succeeded in 58ms.
+2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution started.
+/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/websockets/legacy/__init__.py:6: DeprecationWarning: websockets.legacy is deprecated; see https://websockets.readthedocs.io/en/stable/howto/upgrade.html for upgrade instructions
+  warnings.warn(  # deprecated in 14.0 - 2024-11-09
+/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/pydantic/fields.py:804: PydanticDeprecatedSince20: Using extra keyword arguments on `Field` is deprecated and will be removed. Use `json_schema_extra` instead. (Extra keys: 'is_accessible_to_agent'). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/
+  warn(
+2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution succeeded in 104ms.
+2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution started.
+2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution started.
+2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
+2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution succeeded in 724ms.
+2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution started.
+2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
+2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution succeeded in 66ms.
+2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution succeeded in 961ms.
+2024-11-19 22:14:10 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 1.3s.
+2024-11-19 22:14:10 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution succeeded in 1.3s.
+
+

من خلال سير العمل هذا، قمنا بنجاح بتنفيذ خط أنابيب لفهرسة المستندات باستخدام Milvus كقاعدة بيانات المتجهات ونموذج التضمين OpenAI للتمثيل الدلالي. يتيح هذا الإعداد استرجاعًا سريعًا ودقيقًا قائمًا على المتجهات، مما يشكل الأساس لسير عمل RAG مثل البحث الدلالي واسترجاع المستندات والتفاعلات السياقية القائمة على الذكاء الاصطناعي.

+

بفضل إمكانات التخزين القابلة للتطوير في Milvus وتنسيق Dynamiq، أصبح هذا الحل جاهزًا لكل من النماذج الأولية وعمليات النشر على نطاق واسع. يمكنك الآن توسيع خط الأنابيب هذا ليشمل مهام إضافية مثل الإجابة عن الأسئلة المستندة إلى الاسترجاع أو إنشاء محتوى يعتمد على الذكاء الاصطناعي.

+

تدفق استرجاع مستندات RAG

في هذا البرنامج التعليمي، ننفذ في هذا البرنامج التعليمي سير عمل استرجاع المستندات المعزز للاسترجاع (RAG). يأخذ سير العمل هذا استعلام المستخدم، ويُنشئ تضمينًا متجهًا له، ويسترجع المستندات الأكثر صلة من قاعدة بيانات Milvus vector، ويستخدم نموذجًا لغويًا كبيرًا (LLM) لإنشاء إجابة مفصلة ومدركة للسياق استنادًا إلى المستندات المسترجعة.

+

من خلال اتباع سير العمل هذا، ستنشئ حلاً متكاملاً للبحث الدلالي والإجابة عن الأسئلة، يجمع بين قوة استرجاع المستندات المستند إلى المتجهات وإمكانيات نماذج اللغة الكبيرة (LLM) المتقدمة من OpenAI. يتيح هذا النهج استجابات فعالة وذكية لاستعلامات المستخدم من خلال الاستفادة من المعرفة المخزنة في قاعدة بيانات المستندات.

+

استيراد المكتبات المطلوبة وتهيئة سير العمل

from dynamiq import Workflow
+from dynamiq.connections import (
+    OpenAI as OpenAIConnection,
+    Milvus as MilvusConnection,
+    MilvusDeploymentType,
+)
+from dynamiq.nodes.embedders import OpenAITextEmbedder
+from dynamiq.nodes.retrievers import MilvusDocumentRetriever
+from dynamiq.nodes.llms import OpenAI
+from dynamiq.prompts import Message, Prompt
+
+# Initialize the workflow
+retrieval_wf = Workflow()
+
+

تعريف اتصال OpenAI وتضمين النص

# Establish OpenAI connection
+openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"])
+
+# Define the text embedder node
+embedder = OpenAITextEmbedder(
+    connection=openai_connection,
+    model="text-embedding-3-small",
+)
+
+# Add the embedder node to the workflow
+embedder_added = retrieval_wf.flow.add_nodes(embedder)
+
+

تعريف مسترجع مستندات Milvus

document_retriever = (
+    MilvusDocumentRetriever(
+        connection=MilvusConnection(
+            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
+        ),
+        index_name="my_milvus_collection",
+        dimension=1536,
+        top_k=5,
+    )
+    .inputs(embedding=embedder.outputs.embedding)  # Connect to embedder output
+    .depends_on(embedder)  # Dependency on the embedder node
+)
+
+# Add the retriever node to the workflow
+milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)
+
+
2024-11-19 22:14:19 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
+2024-11-19 22:14:19 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
+2024-11-19 22:14:19 - DEBUG - Created new connection using: 98d1132773af4298a894ad5925845fd2
+2024-11-19 22:14:19 - INFO - Collection my_milvus_collection already exists. Skipping creation.
+
+

تعريف قالب الموجه

# Define the prompt template for the LLM
+prompt_template = """
+Please answer the question based on the provided context.
+
+Question: {{ query }}
+
+Context:
+{% for document in documents %}
+- {{ document.content }}
+{% endfor %}
+"""
+
+# Create the prompt object
+prompt = Prompt(messages=[Message(content=prompt_template, role="user")])
+
+

تعريف مولد الإجابة

answer_generator = (
+    OpenAI(
+        connection=openai_connection,
+        model="gpt-4o",
+        prompt=prompt,
+    )
+    .inputs(
+        documents=document_retriever.outputs.documents,
+        query=embedder.outputs.query,
+    )
+    .depends_on(
+        [document_retriever, embedder]
+    )  # Dependencies on retriever and embedder
+)
+
+# Add the answer generator node to the workflow
+answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)
+
+

تشغيل سير العمل

# Run the workflow with a sample query
+sample_query = "What is the Advanced Search Algorithms in Milvus?"
+
+result = retrieval_wf.run(input_data={"query": sample_query})
+
+answer = result.output.get(answer_generator.id).get("output", {}).get("content")
+print(answer)
+
+
2024-11-19 22:14:22 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution started.
+2024-11-19 22:14:22 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
+2024-11-19 22:14:22 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution started.
+2024-11-19 22:14:23 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
+2024-11-19 22:14:23 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution succeeded in 474ms.
+2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution started.
+2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution succeeded in 23ms.
+2024-11-19 22:14:23 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution started.
+2024-11-19 22:14:24 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
+2024-11-19 22:14:24 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution succeeded in 1.8s.
+2024-11-19 22:14:25 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 2.4s.
+2024-11-19 22:14:25 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution succeeded in 2.4s.
+
+
+The advanced search algorithms in Milvus include a variety of in-memory and on-disk indexing/search algorithms such as IVF (Inverted File), HNSW (Hierarchical Navigable Small World), and DiskANN. These algorithms have been deeply optimized to enhance performance, delivering 30%-70% better performance compared to popular implementations like FAISS and HNSWLib. These optimizations are part of Milvus's design to ensure high efficiency and scalability in handling vector data.
+
diff --git a/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.json b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.json new file mode 100644 index 000000000..2bcea96ef --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.json @@ -0,0 +1 @@ +{"codeList":["from langchain.document_loaders import DirectoryLoader\n# Load HTML files already saved in a local directory\npath = \"../../RAG/rtdocs_new/\"\nglobal_pattern = '*.html'\nloader = DirectoryLoader(path=path, glob=global_pattern)\ndocs = loader.load()\n\n\n# Print num documents and a preview.\nprint(f\"loaded {len(docs)} documents\")\nprint(docs[0].page_content)\npprint.pprint(docs[0].metadata)\n","loaded 22 documents\nWhy Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...\n{'source': 'https://milvus.io/docs/quickstart.md'}\n","import torch\nfrom sentence_transformers import SentenceTransformer\n\n\n# Initialize torch settings for device-agnostic code.\nN_GPU = torch.cuda.device_count()\nDEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')\n\n\n# Download the model from huggingface model hub.\nmodel_name = \"BAAI/bge-large-en-v1.5\"\nencoder = SentenceTransformer(model_name, device=DEVICE)\n\n\n# Get the model parameters and save for later.\nEMBEDDING_DIM = encoder.get_sentence_embedding_dimension()\nMAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()\n\n\n# Inspect model parameters.\nprint(f\"model_name: {model_name}\")\nprint(f\"EMBEDDING_DIM: {EMBEDDING_DIM}\")\nprint(f\"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}\")\n","model_name: BAAI/bge-large-en-v1.5\nEMBEDDING_DIM: 1024\nMAX_SEQ_LENGTH: 512\n","from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n\nCHUNK_SIZE = 512\nchunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)\nprint(f\"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}\")\n\n\n# Define the splitter.\nchild_splitter = RecursiveCharacterTextSplitter(\n chunk_size=CHUNK_SIZE,\n chunk_overlap=chunk_overlap)\n\n\n# Chunk the docs.\nchunks = child_splitter.split_documents(docs)\nprint(f\"{len(docs)} docs split into {len(chunks)} child documents.\")\n\n\n# Encoder input is doc.page_content as strings.\nlist_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]\n\n\n# Embedding inference using HuggingFace encoder.\nembeddings = torch.tensor(encoder.encode(list_of_strings))\n\n\n# Normalize the embeddings.\nembeddings = np.array(embeddings / np.linalg.norm(embeddings))\n\n\n# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.\nconverted_values = list(map(np.float32, embeddings))\n\n\n# Create dict_list for Milvus insertion.\ndict_list = []\nfor chunk, vector in zip(chunks, converted_values):\n # Assemble embedding vector, original text chunk, metadata.\n chunk_dict = {\n 'chunk': chunk.page_content,\n 'source': chunk.metadata.get('source', \"\"),\n 'vector': vector,\n }\n dict_list.append(chunk_dict)\n","chunk_size: 512, chunk_overlap: 51.0\n22 docs split into 355 child documents.\n","# Connect a client to the Milvus Lite server.\nfrom pymilvus import MilvusClient\nmc = MilvusClient(\"milvus_demo.db\")\n\n\n# Create a collection with flexible schema and AUTOINDEX.\nCOLLECTION_NAME = \"MilvusDocs\"\nmc.create_collection(COLLECTION_NAME,\n EMBEDDING_DIM,\n consistency_level=\"Eventually\",\n auto_id=True, \n overwrite=True)\n\n\n# Insert data into the Milvus collection.\nprint(\"Start inserting entities\")\nstart_time = time.time()\nmc.insert(\n COLLECTION_NAME,\n data=dict_list,\n progress_bar=True)\n\n\nend_time = time.time()\nprint(f\"Milvus insert time for {len(dict_list)} vectors: \", end=\"\")\nprint(f\"{round(end_time - start_time, 2)} seconds\")\n","Start inserting entities\nMilvus insert time for 355 vectors: 0.2 seconds\n","SAMPLE_QUESTION = \"What do the parameters for HNSW mean?\"\n\n\n# Embed the question using the same encoder.\nquery_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))\n# Normalize embeddings to unit length.\nquery_embeddings = F.normalize(query_embeddings, p=2, dim=1)\n# Convert the embeddings to list of list of np.float32.\nquery_embeddings = list(map(np.float32, query_embeddings))\n\n\n# Define metadata fields you can filter on.\nOUTPUT_FIELDS = list(dict_list[0].keys())\nOUTPUT_FIELDS.remove('vector')\n\n\n# Define how many top-k results you want to retrieve.\nTOP_K = 2\n\n\n# Run semantic vector search using your query and the vector database.\nresults = mc.search(\n COLLECTION_NAME,\n data=query_embeddings,\n output_fields=OUTPUT_FIELDS,\n limit=TOP_K,\n consistency_level=\"Eventually\")\n","Retrieved result #1\ndistance = 0.7001987099647522\n('Chunk text: layer, finds the node closest to the target in this layer, and'\n...\n'outgoing')\nsource: https://milvus.io/docs/index.md\n\nRetrieved result #2\ndistance = 0.6953287124633789\n('Chunk text: this value can improve recall rate at the cost of increased'\n...\n'to the target')\nsource: https://milvus.io/docs/index.md\n","# (Recommended) Create a new conda environment.\nconda create -n myenv python=3.11 -y\nconda activate myenv\n\n\n# Install vLLM with CUDA 12.1.\npip install -U vllm transformers torch\n\n\nimport vllm, torch\nfrom vllm import LLM, SamplingParams\n\n\n# Clear the GPU memory cache.\ntorch.cuda.empty_cache()\n\n\n# Check the GPU.\n!nvidia-smi\n","# Login to HuggingFace using your new token.\nfrom huggingface_hub import login\nfrom google.colab import userdata\nhf_token = userdata.get('HF_TOKEN')\nlogin(token = hf_token, add_to_git_credential=True)\n","# 1. Choose a model\nMODELTORUN = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n\n\n# 2. Clear the GPU memory cache, you're going to need it all!\ntorch.cuda.empty_cache()\n\n\n# 3. Instantiate a vLLM model instance.\nllm = LLM(model=MODELTORUN,\n enforce_eager=True,\n dtype=torch.bfloat16,\n gpu_memory_utilization=0.5,\n max_model_len=1000,\n seed=415,\n max_num_batched_tokens=3000)\n","# Separate all the context together by space.\ncontexts_combined = ' '.join(contexts)\n# Lance Martin, LangChain, says put the best contexts at the end.\ncontexts_combined = ' '.join(reversed(contexts))\n\n\n# Separate all the unique sources together by comma.\nsource_combined = ' '.join(reversed(list(dict.fromkeys(sources))))\n\n\nSYSTEM_PROMPT = f\"\"\"First, check if the provided Context is relevant to\nthe user's question. Second, only if the provided Context is strongly relevant, answer the question using the Context. Otherwise, if the Context is not strongly relevant, answer the question without using the Context. \nBe clear, concise, relevant. Answer clearly, in fewer than 2 sentences.\nGrounding sources: {source_combined}\nContext: {contexts_combined}\nUser's question: {SAMPLE_QUESTION}\n\"\"\"\n\n\nprompts = [SYSTEM_PROMPT]\n","# Sampling parameters\nsampling_params = SamplingParams(temperature=0.2, top_p=0.95)\n\n\n# Invoke the vLLM model.\noutputs = llm.generate(prompts, sampling_params)\n\n\n# Print the outputs.\nfor output in outputs:\n prompt = output.prompt\n generated_text = output.outputs[0].text\n # !r calls repr(), which prints a string inside quotes.\n print()\n print(f\"Question: {SAMPLE_QUESTION!r}\")\n pprint.pprint(f\"Generated text: {generated_text!r}\")\n","Question: 'What do the parameters for HNSW MEAN!?'\nGenerated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '\n'* M: The maximum degree of nodes on each layer oof the graph, which can improve '\n'recall rate at the cost of increased search time. * efConstruction and ef: ' \n'These parameters specify a search range when building or searching an index.'\n"],"headingContent":"Building RAG with Milvus, vLLM, and Llama 3.1","anchorList":[{"label":"بناء RAG مع Milvus و vLLLM و Llama 3.1","href":"Building-RAG-with-Milvus-vLLM-and-Llama-31","type":1,"isActive":false},{"label":"مقدمة إلى Milvus، وvLLLM، وLlama 3.1 Meta's Llama 3.1","href":"Introduction-to-Milvus-vLLM-and-Meta’s-Llama-31","type":2,"isActive":false},{"label":"بناء وإجراء عملية استرجاع RAG-Retrieval باستخدام Milvus","href":"Build-and-Perform-the-RAG-Retrieval-with-Milvus","type":2,"isActive":false},{"label":"بناء وإجراء توليد RAG مع vLLM و Llama 3.1-8B","href":"Build-and-Perform-the-RAG-Generation-with-vLLM-and-Llama-31-8B","type":2,"isActive":false},{"label":"المراجع","href":"References","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.md b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.md new file mode 100644 index 000000000..47c14baaa --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/milvus_rag_with_vllm.md @@ -0,0 +1,385 @@ +--- +id: milvus_rag_with_vllm.md +summary: >- + ستوضح لك هذه المدونة كيفية إنشاء وتشغيل RAG باستخدام Milvus و vLLM و Llama + 3.1. وبشكل أكثر تحديدًا، سأوضح لك كيفية تضمين المعلومات النصية وتخزينها + كتضمينات متجهة في Milvus واستخدام هذا المخزن المتجه كقاعدة معرفية لاسترداد + أجزاء النص ذات الصلة بأسئلة المستخدم بكفاءة. +title: بناء RAG مع Milvus و vLLLM و Llama 3.1 +--- +

بناء RAG مع Milvus و vLLLM و Llama 3.1

تبرعت جامعة كاليفورنيا - بيركلي بـ vLLM، وهي مكتبة سريعة وسهلة الاستخدام لاستدلال وخدمة LLM، إلى مؤسسة LF AI & Data Foundation كمشروع في مرحلة الاحتضان في يوليو 2024. بصفتنا مشروعًا عضوًا زميلًا، نود أن نرحب بانضمام vLLM إلى عائلة LF AI & Data! 🎉

+

عادةً ما يتم إقران نماذج اللغة الكبيرة(LLMs) وقواعد البيانات المتجهة لبناء الجيل المعزز للاسترجاع(RAG)، وهي بنية تطبيق ذكاء اصطناعي شائعة لمعالجة هلوسات الذكاء الاصطناعي. ستوضح لك هذه المدونة كيفية بناء وتشغيل RAG باستخدام Milvus و vLLM و Llama 3.1. وبشكل أكثر تحديدًا، سأوضح لك كيفية تضمين المعلومات النصية وتخزينها كتضمينات متجهة في Milvus واستخدام مخزن المتجهات هذا كقاعدة معرفية لاسترداد أجزاء النص ذات الصلة بأسئلة المستخدم بكفاءة. أخيرًا، سنستفيد من vLLLM لخدمة نموذج Llama 3.1-8B الخاص بـ Meta لتوليد إجابات معززة بالنص المسترجع. دعونا نتعمق!

+

مقدمة إلى Milvus، وvLLLM، وLlama 3.1 Meta's Llama 3.1

قاعدة بيانات ميلفوس المتجهة

Milvus عبارة عن قاعدة بيانات متجهات مفتوحة المصدر ومفتوحة المصدر وموزعة ومصممة لهذا الغرض لتخزين المتجهات وفهرستها والبحث فيها لأعباء عمل الذكاء الاصطناعي التوليدي (GenAI). إن قدرتها على إجراء البحث الهجين، وتصفية البيانات الوصفية، وإعادة ترتيبها، والتعامل بكفاءة مع تريليونات المتجهات تجعل من Milvus خيارًا مفضلاً لأعباء عمل الذكاء الاصطناعي والتعلم الآلي. يمكن تشغيل Milvus محليًا أو على مجموعة أو استضافته في سحابة Zilliz المدارة بالكامل.

+

vLLM

vLLLM هو مشروع مفتوح المصدر بدأ في جامعة كاليفورنيا في بيركلي SkyLab يركز على تحسين أداء خدمة LLM. وهو يستخدم إدارة فعالة للذاكرة باستخدام PagedAttention، والتجميع المستمر، ونواة CUDA المحسّنة. مقارنةً بالطرق التقليدية، تعمل vLLM على تحسين أداء العرض بما يصل إلى 24 ضعفًا مع تقليل استخدام ذاكرة وحدة معالجة الرسومات إلى النصف.

+

ووفقًا للورقة البحثية "الإدارة الفعالة للذاكرة لخدمة نماذج اللغات الكبيرة باستخدام PagedAttention"، تستخدم ذاكرة التخزين المؤقت KV حوالي 30% من ذاكرة وحدة معالجة الرسومات، مما يؤدي إلى مشاكل محتملة في الذاكرة. يتم تخزين ذاكرة التخزين المؤقت KV في ذاكرة متجاورة، ولكن يمكن أن يؤدي تغيير الحجم إلى تجزئة الذاكرة، وهو أمر غير فعال للحساب.

+

+ + + + +

+

الصورة 1. إدارة ذاكرة التخزين المؤقت لذاكرة KV في الأنظمة الحالية ( ورقة الانتباه المرحلي 2023)

+

من خلال استخدام الذاكرة الافتراضية لذاكرة التخزين المؤقت KV، يخصص vLLM ذاكرة وحدة معالجة الرسومات الفعلية فقط حسب الحاجة، مما يؤدي إلى التخلص من تجزئة الذاكرة وتجنب التخصيص المسبق. في الاختبارات، تفوّق أداء vLLM على محولات HuggingFace Transformers (HF) وTGI للاستدلال على توليد النصوص (TGI)، محققًا إنتاجية أعلى بما يصل إلى 24 ضعفًا من HF و3.5 أضعاف من TGI على وحدات معالجة الرسومات NVIDIA A10G وA100.

+

+ + + + +

+

الصورة 2. خدمة الإنتاجية عندما يطلب كل طلب إكمال ثلاثة مخرجات متوازية. تحقق vLLM إنتاجية أعلى من HF بمعدل 8.5 أضعاف إلى 15 ضعفًا من HF وإنتاجية أعلى من TGI بمعدل 3.3 أضعاف إلى 3.5 أضعاف ( مدونة 2023 vLLM).

+

لاما ميتا لاما 3.1

تم الإعلان عنلاما 3.1 من Meta's Llama 3.1 في 23 يوليو 2024. يقدم النموذج 405 مليار معلمة أداءً متطورًا على العديد من المعايير العامة ولديه نافذة سياق مكونة من 128,000 رمز إدخال مع السماح باستخدامات تجارية مختلفة. إلى جانب نموذج 405 مليار معلمة أصدرت Meta نسخة محدثة من Llama3 70B (70 مليار معلمة) و8B (8 مليار معلمة). أوزان النموذج متاحة للتنزيل على موقع Meta الإلكتروني.

+

كانت إحدى الرؤى الرئيسية هي أن الضبط الدقيق للبيانات التي تم إنشاؤها يمكن أن يعزز الأداء، لكن الأمثلة ذات الجودة الرديئة يمكن أن تقلل من أدائه. عمل فريق Llama بشكل مكثف على تحديد هذه الأمثلة السيئة وإزالتها باستخدام النموذج نفسه والنماذج المساعدة وأدوات أخرى.

+

بناء وإجراء عملية استرجاع RAG-Retrieval باستخدام Milvus

قم بإعداد مجموعة البيانات الخاصة بك.

استخدمت وثائق Milvus الرسمية كمجموعة البيانات الخاصة بي لهذا العرض التوضيحي، والتي قمت بتنزيلها وحفظها محليًا.

+
from langchain.document_loaders import DirectoryLoader
+# Load HTML files already saved in a local directory
+path = "../../RAG/rtdocs_new/"
+global_pattern = '*.html'
+loader = DirectoryLoader(path=path, glob=global_pattern)
+docs = loader.load()
+
+
+# Print num documents and a preview.
+print(f"loaded {len(docs)} documents")
+print(docs[0].page_content)
+pprint.pprint(docs[0].metadata)
+
+
loaded 22 documents
+Why Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...
+{'source': 'https://milvus.io/docs/quickstart.md'}
+
+

قم بتنزيل نموذج التضمين.

بعد ذلك، قم بتنزيل نموذج تضمين مجاني مفتوح المصدر من HuggingFace.

+
import torch
+from sentence_transformers import SentenceTransformer
+
+
+# Initialize torch settings for device-agnostic code.
+N_GPU = torch.cuda.device_count()
+DEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')
+
+
+# Download the model from huggingface model hub.
+model_name = "BAAI/bge-large-en-v1.5"
+encoder = SentenceTransformer(model_name, device=DEVICE)
+
+
+# Get the model parameters and save for later.
+EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
+MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
+
+
+# Inspect model parameters.
+print(f"model_name: {model_name}")
+print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
+print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
+
+
model_name: BAAI/bge-large-en-v1.5
+EMBEDDING_DIM: 1024
+MAX_SEQ_LENGTH: 512
+
+

قم بتقطيع وترميز بياناتك المخصصة كمتجهات.

سأستخدم طولًا ثابتًا يبلغ 512 حرفًا مع تداخل بنسبة 10%.

+
from langchain.text_splitter import RecursiveCharacterTextSplitter
+
+
+CHUNK_SIZE = 512
+chunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)
+print(f"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}")
+
+
+# Define the splitter.
+child_splitter = RecursiveCharacterTextSplitter(
+   chunk_size=CHUNK_SIZE,
+   chunk_overlap=chunk_overlap)
+
+
+# Chunk the docs.
+chunks = child_splitter.split_documents(docs)
+print(f"{len(docs)} docs split into {len(chunks)} child documents.")
+
+
+# Encoder input is doc.page_content as strings.
+list_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]
+
+
+# Embedding inference using HuggingFace encoder.
+embeddings = torch.tensor(encoder.encode(list_of_strings))
+
+
+# Normalize the embeddings.
+embeddings = np.array(embeddings / np.linalg.norm(embeddings))
+
+
+# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.
+converted_values = list(map(np.float32, embeddings))
+
+
+# Create dict_list for Milvus insertion.
+dict_list = []
+for chunk, vector in zip(chunks, converted_values):
+   # Assemble embedding vector, original text chunk, metadata.
+   chunk_dict = {
+       'chunk': chunk.page_content,
+       'source': chunk.metadata.get('source', ""),
+       'vector': vector,
+   }
+   dict_list.append(chunk_dict)
+
+
chunk_size: 512, chunk_overlap: 51.0
+22 docs split into 355 child documents.
+
+

احفظ المتجهات في ميلفوس.

أدخل تضمين المتجهات المشفرة في قاعدة بيانات متجهات Milvus.

+
# Connect a client to the Milvus Lite server.
+from pymilvus import MilvusClient
+mc = MilvusClient("milvus_demo.db")
+
+
+# Create a collection with flexible schema and AUTOINDEX.
+COLLECTION_NAME = "MilvusDocs"
+mc.create_collection(COLLECTION_NAME,
+       EMBEDDING_DIM,
+       consistency_level="Eventually",
+       auto_id=True, 
+       overwrite=True)
+
+
+# Insert data into the Milvus collection.
+print("Start inserting entities")
+start_time = time.time()
+mc.insert(
+   COLLECTION_NAME,
+   data=dict_list,
+   progress_bar=True)
+
+
+end_time = time.time()
+print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
+print(f"{round(end_time - start_time, 2)} seconds")
+
+
Start inserting entities
+Milvus insert time for 355 vectors: 0.2 seconds
+
+

اطرح سؤالاً وابحث عن أقرب الأجزاء المجاورة من قاعدة معارفك في Milvus.

+
SAMPLE_QUESTION = "What do the parameters for HNSW mean?"
+
+
+# Embed the question using the same encoder.
+query_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))
+# Normalize embeddings to unit length.
+query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
+# Convert the embeddings to list of list of np.float32.
+query_embeddings = list(map(np.float32, query_embeddings))
+
+
+# Define metadata fields you can filter on.
+OUTPUT_FIELDS = list(dict_list[0].keys())
+OUTPUT_FIELDS.remove('vector')
+
+
+# Define how many top-k results you want to retrieve.
+TOP_K = 2
+
+
+# Run semantic vector search using your query and the vector database.
+results = mc.search(
+    COLLECTION_NAME,
+    data=query_embeddings,
+    output_fields=OUTPUT_FIELDS,
+    limit=TOP_K,
+    consistency_level="Eventually")
+
+

النتيجة المسترجعة كما هو موضح أدناه.

+
Retrieved result #1
+distance = 0.7001987099647522
+('Chunk text: layer, finds the node closest to the target in this layer, and'
+...
+'outgoing')
+source: https://milvus.io/docs/index.md
+
+Retrieved result #2
+distance = 0.6953287124633789
+('Chunk text: this value can improve recall rate at the cost of increased'
+...
+'to the target')
+source: https://milvus.io/docs/index.md
+
+

بناء وإجراء توليد RAG مع vLLM و Llama 3.1-8B

تثبيت vLLLM ونماذج من HuggingFace

يقوم vLLLM بتنزيل نماذج اللغة الكبيرة من HuggingFace افتراضيًا. بشكل عام، في أي وقت تريد فيه استخدام نموذج جديد تمامًا على HuggingFace، يجب عليك القيام بتثبيت pip install --upgrade أو -U. أيضًا، ستحتاج أيضًا إلى وحدة معالجة رسومية لتشغيل الاستدلال على نماذج Meta's Llama 3.1 باستخدام vLLM.

+

للحصول على قائمة كاملة بجميع النماذج المدعومة من vLLM، راجع صفحة التوثيق هذه.

+
# (Recommended) Create a new conda environment.
+conda create -n myenv python=3.11 -y
+conda activate myenv
+
+
+# Install vLLM with CUDA 12.1.
+pip install -U vllm transformers torch
+
+
+import vllm, torch
+from vllm import LLM, SamplingParams
+
+
+# Clear the GPU memory cache.
+torch.cuda.empty_cache()
+
+
+# Check the GPU.
+!nvidia-smi
+
+

لمعرفة المزيد حول كيفية تثبيت vLLM، راجع صفحة التثبيت الخاصة به.

+

احصل على رمز HuggingFace.

تتطلب بعض النماذج على HuggingFace، مثل Meta Llama 3.1، أن يقبل المستخدم ترخيصها قبل أن يتمكن من تنزيل الأوزان. لذلك، يجب عليك إنشاء حساب HuggingFace، وقبول ترخيص النموذج، وإنشاء رمز مميز.

+

عند زيارة صفحة Llama3.1 على HuggingFace، ستصلك رسالة تطلب منك الموافقة على الشروط. انقر على "قبول الترخيص" لقبول شروط التعريف قبل تنزيل أوزان النموذج. تستغرق الموافقة عادةً أقل من يوم واحد.

+

بعد حصولك على الموافقة، يجب عليك إنشاء رمز HuggingFace جديد. لن تعمل رموزك القديمة مع الأذونات الجديدة.

+

قبل تثبيت vLLLM، قم بتسجيل الدخول إلى HuggingFace باستخدام رمزك المميز الجديد. أدناه، استخدمت أسرار كولاب لتخزين الرمز المميز.

+
# Login to HuggingFace using your new token.
+from huggingface_hub import login
+from google.colab import userdata
+hf_token = userdata.get('HF_TOKEN')
+login(token = hf_token, add_to_git_credential=True)
+
+

قم بتشغيل RAG-Generation

في العرض التوضيحي، قمنا بتشغيل نموذج Llama-3.1-8B ، والذي يتطلب وحدة معالجة رسومات وذاكرة كبيرة للدوران. تم تشغيل المثال التالي على Google Colab Pro (10 دولارات شهريًا) باستخدام وحدة معالجة رسومات A100. لمعرفة المزيد حول كيفية تشغيل vLLM، يمكنك الاطلاع على وثائق Quickstart.

+
# 1. Choose a model
+MODELTORUN = "meta-llama/Meta-Llama-3.1-8B-Instruct"
+
+
+# 2. Clear the GPU memory cache, you're going to need it all!
+torch.cuda.empty_cache()
+
+
+# 3. Instantiate a vLLM model instance.
+llm = LLM(model=MODELTORUN,
+         enforce_eager=True,
+         dtype=torch.bfloat16,
+         gpu_memory_utilization=0.5,
+         max_model_len=1000,
+         seed=415,
+         max_num_batched_tokens=3000)
+
+

اكتب مطالبة باستخدام السياقات والمصادر المسترجعة من ميلفوس.

+
# Separate all the context together by space.
+contexts_combined = ' '.join(contexts)
+# Lance Martin, LangChain, says put the best contexts at the end.
+contexts_combined = ' '.join(reversed(contexts))
+
+
+# Separate all the unique sources together by comma.
+source_combined = ' '.join(reversed(list(dict.fromkeys(sources))))
+
+
+SYSTEM_PROMPT = f"""First, check if the provided Context is relevant to
+the user's question.  Second, only if the provided Context is strongly relevant, answer the question using the Context.  Otherwise, if the Context is not strongly relevant, answer the question without using the Context. 
+Be clear, concise, relevant.  Answer clearly, in fewer than 2 sentences.
+Grounding sources: {source_combined}
+Context: {contexts_combined}
+User's question: {SAMPLE_QUESTION}
+"""
+
+
+prompts = [SYSTEM_PROMPT]
+
+

الآن، قم بإنشاء إجابة باستخدام الأجزاء المسترجعة والسؤال الأصلي المحشو في المطالبة.

+
# Sampling parameters
+sampling_params = SamplingParams(temperature=0.2, top_p=0.95)
+
+
+# Invoke the vLLM model.
+outputs = llm.generate(prompts, sampling_params)
+
+
+# Print the outputs.
+for output in outputs:
+   prompt = output.prompt
+   generated_text = output.outputs[0].text
+   # !r calls repr(), which prints a string inside quotes.
+   print()
+   print(f"Question: {SAMPLE_QUESTION!r}")
+   pprint.pprint(f"Generated text: {generated_text!r}")
+
+
Question: 'What do the parameters for HNSW MEAN!?'
+Generated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '
+'* M: The maximum degree of nodes on each layer oof the graph, which can improve '
+'recall rate at the cost of increased search time. * efConstruction and ef: ' 
+'These parameters specify a search range when building or searching an index.'
+
+

تبدو الإجابة أعلاه مثالية بالنسبة لي!

+

إذا كنت مهتمًا بهذا العرض التوضيحي، فلا تتردد في تجربته بنفسك وإخبارنا بأفكارك. نرحب بك أيضًا للانضمام إلى مجتمع Milvus على Discord لإجراء محادثات مع جميع مطوري GenAI مباشرةً.

+

المراجع

diff --git a/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.json b/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.json new file mode 100644 index 000000000..8dfe6d212 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install mem0ai pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Define Config\nfrom mem0 import Memory\n\nconfig = {\n \"vector_store\": {\n \"provider\": \"milvus\",\n \"config\": {\n \"collection_name\": \"quickstart_mem0_with_milvus\",\n \"embedding_model_dims\": \"1536\",\n \"url\": \"./milvus.db\", # Use local vector database for demo purpose\n },\n },\n \"version\": \"v1.1\",\n}\n\nm = Memory.from_config(config)\n","# Add a memory to user: Working on improving tennis skills\nres = m.add(\n messages=\"I am working on improving my tennis skills.\",\n user_id=\"alice\",\n metadata={\"category\": \"hobbies\"},\n)\n\nres\n","# Get memory_id\nmemory_id = res[\"results\"][0][\"id\"]\n\n# Update this memory with new information: Likes to play tennis on weekends\nm.update(memory_id=memory_id, data=\"Likes to play tennis on weekends\")\n","# Get all memory for the user Alice\nm.get_all(user_id=\"alice\")\n","m.history(memory_id=memory_id)\n","new_mem = m.add(\n \"I have a linear algebra midterm exam on November 20\",\n user_id=\"alice\",\n metadata={\"category\": \"task\"},\n)\n","m.get_all(user_id=\"alice\")\n","m.search(query=\"What are Alice's hobbies\", user_id=\"alice\")\n","m.delete(memory_id=memory_id)\n\nm.get_all(\"alice\")\n"],"headingContent":"Getting Started with Mem0 and Milvus","anchorList":[{"label":"الشروع في العمل مع Mem0 وMilvus","href":"Getting-Started-with-Mem0-and-Milvus","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"إدارة ذكريات المستخدم مع Mem0 و Milvus","href":"Managing-User-Memories-with-Mem0-and-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.md b/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.md new file mode 100644 index 000000000..a4d086695 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/quickstart_mem0_with_milvus.md @@ -0,0 +1,217 @@ +--- +id: quickstart_mem0_with_milvus.md +summary: >- + في هذا البرنامج التعليمي، سنغطي في هذا البرنامج التعليمي العمليات الأساسية + لإدارة ذاكرة Mem0 - إضافة واسترجاع وتحديث والبحث والحذف وتتبع سجل الذاكرة - + باستخدام Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر عالية الأداء ومفتوحة + المصدر تعمل على تشغيل التخزين والاسترجاع الفعال. ستوجهك هذه المقدمة العملية + خلال عمليات الذاكرة التأسيسية لمساعدتك في بناء تفاعلات ذكاء اصطناعي مخصصة مع + Mem0 و Milvus. +title: الشروع في العمل مع Mem0 وMilvus +--- +

الشروع في العمل مع Mem0 وMilvus

+Open In Colab + + +GitHub Repository +

+

Mem0 عبارة عن طبقة ذاكرة ذكية لتطبيقات الذكاء الاصطناعي، مصممة لتقديم تفاعلات مخصصة وفعالة من خلال الاحتفاظ بتفضيلات المستخدم والتكيف المستمر بمرور الوقت. تُعد Mem0 مثالية لروبوتات الدردشة الآلية والأدوات التي تعتمد على الذكاء الاصطناعي، فهي تُنشئ تجارب سلسة مدركة للسياق.

+

في هذا البرنامج التعليمي، سنغطي في هذا البرنامج التعليمي العمليات الأساسية لإدارة ذاكرة Mem0 - إضافة واسترجاع وتحديث والبحث والحذف وتتبع سجل الذاكرة - باستخدام Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر عالية الأداء ومفتوحة المصدر تعمل على تشغيل التخزين والاسترجاع الفعال. ستوجهك هذه المقدمة العملية خلال عمليات الذاكرة التأسيسية لمساعدتك في بناء تفاعلات ذكاء اصطناعي مخصصة مع Mem0 وMilvus.

+

التحضير

تنزيل المكتبات المطلوبة

$ pip install mem0ai pymilvus
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

تكوين Mem0 مع ميلفوس

سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+os.environ["OPENAI_API_KEY"] = "sk-***********"
+
+

والآن، يمكننا تهيئة Mem0 لاستخدام Milvus كمخزن للمتجهات

+
# Define Config
+from mem0 import Memory
+
+config = {
+    "vector_store": {
+        "provider": "milvus",
+        "config": {
+            "collection_name": "quickstart_mem0_with_milvus",
+            "embedding_model_dims": "1536",
+            "url": "./milvus.db",  # Use local vector database for demo purpose
+        },
+    },
+    "version": "v1.1",
+}
+
+m = Memory.from_config(config)
+
+
+
+
    +
  • إذا كنت تحتاج فقط إلى قاعدة بيانات متجهات محلية للبيانات الصغيرة الحجم أو النماذج الأولية، فإن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين خاصية المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
  • +
  • إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
  • +
+
+
+

إدارة ذكريات المستخدم مع Mem0 و Milvus

إضافة ذاكرة

تقوم الدالة add بتخزين نص غير منظم في ميلفوس كذاكرة، وربطه بمستخدم معين وبيانات وصفية اختيارية.

+

هنا، نقوم بإضافة ذاكرة أليس، "أعمل على تحسين مهاراتي في التنس"، إلى جانب البيانات الوصفية ذات الصلة بالسياق إلى ملفوس.

+
# Add a memory to user: Working on improving tennis skills
+res = m.add(
+    messages="I am working on improving my tennis skills.",
+    user_id="alice",
+    metadata={"category": "hobbies"},
+)
+
+res
+
+
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+   'memory': 'Working on improving tennis skills',
+   'event': 'ADD'}],
+ 'relations': []}
+
+

تحديث الذاكرة

يمكننا استخدام قيمة إرجاع الدالة add لاسترداد معرّف الذاكرة، مما يسمح لنا بتحديث هذه الذاكرة بمعلومات جديدة عبر update.

+
# Get memory_id
+memory_id = res["results"][0]["id"]
+
+# Update this memory with new information: Likes to play tennis on weekends
+m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
+
+
{'message': 'Memory updated successfully!'}
+
+

الحصول على كل الذاكرة لمستخدم

يمكننا استخدام الدالة get_all لعرض جميع الذكريات المدرجة أو التصفية حسب user_id في ميلفوس.

+

لاحظ أنه يمكننا أن نرى أن الذاكرة قد تغيرت الآن من "العمل على تطوير مهارات التنس" إلى "يحب لعب التنس في عطلات نهاية الأسبوع".

+
# Get all memory for the user Alice
+m.get_all(user_id="alice")
+
+
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+   'memory': 'Likes to play tennis on weekends',
+   'hash': '4c3bc9f87b78418f19df6407bc86e006',
+   'metadata': None,
+   'created_at': '2024-11-01T19:33:44.116920-07:00',
+   'updated_at': '2024-11-01T19:33:47.619857-07:00',
+   'user_id': 'alice'}]}
+
+

عرض سجل تحديث الذاكرة

يمكننا أيضًا عرض سجل تحديث الذاكرة من خلال تحديد الذاكرة_المعرف التي نهتم بها عبر الدالة history.

+
m.history(memory_id=memory_id)
+
+
[{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
+  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+  'old_memory': None,
+  'new_memory': 'Working on improving tennis skills',
+  'event': 'ADD',
+  'created_at': '2024-11-01T19:33:44.116920-07:00',
+  'updated_at': None},
+ {'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
+  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+  'old_memory': 'Working on improving tennis skills',
+  'new_memory': 'Likes to play tennis on weekends',
+  'event': 'UPDATE',
+  'created_at': '2024-11-01T19:33:44.116920-07:00',
+  'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
+
+

البحث في الذاكرة

يمكننا استخدام الدالة search للبحث عن الذاكرة الأكثر ارتباطًا بالمستخدم.

+

لنبدأ بإضافة ذاكرة أخرى لـ أليس.

+
new_mem = m.add(
+    "I have a linear algebra midterm exam on November 20",
+    user_id="alice",
+    metadata={"category": "task"},
+)
+
+

والآن، نتصل بـ get_all مع تحديد user_id للتحقق من أن لدينا بالفعل إدخالات ذاكرة 2 للمستخدم أليس.

+
m.get_all(user_id="alice")
+
+
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+   'memory': 'Likes to play tennis on weekends',
+   'hash': '4c3bc9f87b78418f19df6407bc86e006',
+   'metadata': None,
+   'created_at': '2024-11-01T19:33:44.116920-07:00',
+   'updated_at': '2024-11-01T19:33:47.619857-07:00',
+   'user_id': 'alice'},
+  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
+   'memory': 'Has a linear algebra midterm exam on November 20',
+   'hash': '575182f46965111ca0a8279c44920ea2',
+   'metadata': {'category': 'task'},
+   'created_at': '2024-11-01T19:33:57.271657-07:00',
+   'updated_at': None,
+   'user_id': 'alice'}]}
+
+

يمكننا إجراء search الآن من خلال توفير query و user_id. لاحظ أننا نستخدم افتراضيًا مقياس L2 للبحث عن التشابه، لذا فإن أصغر score يعني تشابهًا أكبر.

+
m.search(query="What are Alice's hobbies", user_id="alice")
+
+
{'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
+   'memory': 'Likes to play tennis on weekends',
+   'hash': '4c3bc9f87b78418f19df6407bc86e006',
+   'metadata': None,
+   'score': 1.2807445526123047,
+   'created_at': '2024-11-01T19:33:44.116920-07:00',
+   'updated_at': '2024-11-01T19:33:47.619857-07:00',
+   'user_id': 'alice'},
+  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
+   'memory': 'Has a linear algebra midterm exam on November 20',
+   'hash': '575182f46965111ca0a8279c44920ea2',
+   'metadata': {'category': 'task'},
+   'score': 1.728922724723816,
+   'created_at': '2024-11-01T19:33:57.271657-07:00',
+   'updated_at': None,
+   'user_id': 'alice'}]}
+
+

حذف الذاكرة

يمكننا أيضًا delete ذاكرة من خلال توفير الذاكرة المقابلة memory_id.

+

سنقوم بحذف الذاكرة "يحب لعب التنس في عطلات نهاية الأسبوع" حيث تم استرجاع memory_id الخاص بها بالفعل، واستدعاء get_all للتحقق من نجاح عملية الحذف.

+
m.delete(memory_id=memory_id)
+
+m.get_all("alice")
+
+
{'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
+   'memory': 'Has a linear algebra midterm exam on November 20',
+   'hash': '575182f46965111ca0a8279c44920ea2',
+   'metadata': {'category': 'task'},
+   'created_at': '2024-11-01T19:33:57.271657-07:00',
+   'updated_at': None,
+   'user_id': 'alice'}]}
+
diff --git a/localization/v2.5.x/site/ar/integrations/rag_with_langflow.json b/localization/v2.5.x/site/ar/integrations/rag_with_langflow.json new file mode 100644 index 000000000..1f531c470 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/rag_with_langflow.json @@ -0,0 +1 @@ +{"codeList":["$ python -m pip install langflow -U\n","$ python -m langflow run\n"],"headingContent":"Building a RAG System Using Langflow with Milvus","anchorList":[{"label":"بناء نظام RAG باستخدام Langflow مع Milvus","href":"Building-a-RAG-System-Using-Langflow-with-Milvus","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"البرنامج التعليمي","href":"Tutorial","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/rag_with_langflow.md b/localization/v2.5.x/site/ar/integrations/rag_with_langflow.md new file mode 100644 index 000000000..e1cb9c7e0 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/rag_with_langflow.md @@ -0,0 +1,84 @@ +--- +id: rag_with_langflow.md +summary: >- + يوضّح هذا الدليل كيفية استخدام Langflow لإنشاء خط أنابيب توليد معزز للاسترجاع + (RAG) باستخدام Milvus. +title: بناء نظام RAG باستخدام Langflow مع Milvus +--- +

بناء نظام RAG باستخدام Langflow مع Milvus

يوضّح هذا الدليل كيفية استخدام لانجفلو لبناء نظام توليد معزز للاسترجاع (RAG) مع ميلفوس.

+

يعمل نظام RAG على تعزيز توليد النصوص من خلال استرجاع المستندات ذات الصلة من قاعدة معرفية أولاً ثم توليد استجابات جديدة بناءً على هذا السياق. يُستخدم نظام Milvus لتخزين واسترجاع تضمينات النصوص، بينما يسهّل نظام Langflow دمج الاسترجاع والتوليد في سير عمل مرئي.

+

يمكّن لانجفلو من إنشاء خطوط أنابيب RAG بسهولة، حيث يتم تضمين أجزاء من النص وتخزينها في Milvus واسترجاعها عند إجراء الاستعلامات ذات الصلة. يتيح ذلك لنموذج اللغة توليد استجابات مستنيرة حسب السياق.

+

يعمل Milvus كقاعدة بيانات متجهة قابلة للتطوير تعثر بسرعة على نص متشابه دلاليًا، بينما يتيح لك برنامج Langflow إدارة كيفية تعامل خط الأنابيب مع استرجاع النص وتوليد الاستجابة. يوفران معًا طريقة فعالة لبناء خط أنابيب RAG قوي للتطبيقات المحسّنة القائمة على النصوص.

+

المتطلبات الأساسية

قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

+
$ python -m pip install langflow -U
+
+

البرنامج التعليمي

بمجرد تثبيت جميع التبعيات، ابدأ تشغيل لوحة معلومات Langflow عن طريق كتابة الأمر التالي:

+
$ python -m langflow run
+
+

ثم ستظهر لوحة تحكم منبثقة كما هو موضح أدناه: langflowlangflow

+

نريد إنشاء مشروع Vector Store، لذا علينا أولاً النقر على زر مشروع جديد. ستظهر لوحة منبثقة، ونختار خيار Vector Store RAG: panelلوحة

+

بمجرد أن يتم إنشاء مشروع Vector Store Rag بنجاح، فإن مخزن المتجهات الافتراضي هو AstraDB، بينما نريد استخدام Milvus. لذلك نحن بحاجة إلى استبدال هذه الوحدة النمطية astraDB بـ Milvus من أجل استخدام Milvus كمخزن متجهات. astraDBastraDB

+

خطوات استبدال astraDB بـ Milvus:

    +
  1. إزالة البطاقات الموجودة من مخزن المتجهات. انقر على بطاقتين من بطاقات AstraDB المميزة باللون الأحمر في الصورة أعلاه، واضغط على مسافة للخلف لحذفها.
  2. +
  3. انقر على خيار Vector Store في الشريط الجانبي، واختر Milvus واسحبه إلى اللوحة. افعل ذلك مرتين لأننا نحتاج إلى بطاقتي ميلفوس، واحدة لتخزين سير عمل معالجة الملفات والأخرى لسير عمل البحث.
  4. +
  5. اربط وحدات Milvus Modules ببقية المكونات. انظر الصورة أدناه للرجوع إليها.
  6. +
  7. قم بتكوين بيانات اعتماد Milvus لكلا وحدتي Milvus. إن أبسط طريقة هي استخدام Milvus Lite عن طريق تعيين URI اتصال إلى milvus_demo.db. إذا كان لديك خادم Milvus منشور ذاتيًا أو على Zilliz Cloud، فقم بتعيين URI الاتصال إلى نقطة نهاية الخادم وكلمة مرور الاتصال إلى الرمز المميز (بالنسبة لـ Milvus يكون ذلك متسلسلًا ":"، أما بالنسبة لـ Zilliz Cloud فهو مفتاح API). انظر الصورة أدناه كمرجع:
  8. +
+

+ + Milvus Structure demo + عرض توضيحي لهيكل ميلفوس

+

تضمين المعرفة في نظام RAG

    +
  1. قم بتحميل ملف كقاعدة معرفية لـ LLM من خلال وحدة الملف في أسفل اليسار. قمنا هنا بتحميل ملف يحتوي على مقدمة موجزة عن ميلفوس
  2. +
  3. قم بتشغيل سير عمل الإدراج بالضغط على زر التشغيل في الوحدة النمطية Milvus في أسفل اليمين. سيؤدي ذلك إلى إدراج المعرفة في مخزن ملف ميلفوس المتجه
  4. +
  5. اختبر ما إذا كانت المعرفة في الذاكرة افتح الملعب واطلب أي شيء يتعلق بالملف الذي قمت بتحميله.
  6. +
+

+ + why milvus + لماذا ميلفوس

diff --git a/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.json b/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.json new file mode 100644 index 000000000..cb4b661ba --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -qU \"unstructured-ingest[pdf]\" unstructured pymilvus openai\n","import os\n\n\nos.environ[\"UNSTRUCTURED_API_KEY\"] = \"***********\"\nos.environ[\"UNSTRUCTURED_URL\"] = \"***********\"\n\nos.environ[\"OPENAI_API_KEY\"] = \"***********\"\n","from pymilvus import MilvusClient, DataType\n\n# Initialize Milvus client\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\") # TODO\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n\n\ndef emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","# Create schema\nschema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)\n# Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=65535)\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)\nindex_params = MilvusClient.prepare_index_params()\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"AUTOINDEX\",\n)\nmilvus_client.create_collection(\n collection_name=collection_name,\n schema=schema,\n index_params=index_params,\n consistency_level=\"Strong\",\n)\n\nmilvus_client.load_collection(collection_name=collection_name)\n","from unstructured_ingest.v2.pipeline.pipeline import Pipeline\nfrom unstructured_ingest.v2.interfaces import ProcessorConfig\nfrom unstructured_ingest.v2.processes.connectors.local import (\n LocalIndexerConfig,\n LocalDownloaderConfig,\n LocalConnectionConfig,\n LocalUploaderConfig,\n)\nfrom unstructured_ingest.v2.processes.partitioner import PartitionerConfig\n\ndirectory_with_pdfs = \"./pdf_files\"\ndirectory_with_results = \"./pdf_processed_outputs\"\n\nPipeline.from_configs(\n context=ProcessorConfig(),\n indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),\n downloader_config=LocalDownloaderConfig(),\n source_connection_config=LocalConnectionConfig(),\n partitioner_config=PartitionerConfig(\n partition_by_api=True,\n api_key=os.getenv(\"UNSTRUCTURED_API_KEY\"),\n partition_endpoint=os.getenv(\"UNSTRUCTURED_API_URL\"),\n strategy=\"hi_res\",\n additional_partition_args={\n \"split_pdf_page\": True,\n \"split_pdf_concurrency_level\": 15,\n },\n ),\n uploader_config=LocalUploaderConfig(output_dir=directory_with_results),\n).run()\n\n\nfrom unstructured.staging.base import elements_from_json\n\n\ndef load_processed_files(directory_path):\n elements = []\n for filename in os.listdir(directory_path):\n if filename.endswith(\".json\"):\n file_path = os.path.join(directory_path, filename)\n try:\n elements.extend(elements_from_json(filename=file_path))\n except IOError:\n print(f\"Error: Could not read file {filename}.\")\n\n return elements\n\n\nelements = load_processed_files(directory_with_results)\n","data = []\nfor i, element in enumerate(elements):\n data.append(\n {\n \"id\": i,\n \"vector\": emb_text(element.text),\n \"text\": element.text,\n \"metadata\": element.metadata.to_dict(),\n }\n )\nmilvus_client.insert(collection_name=collection_name, data=data)\n","def retrieve_documents(question, top_k=3):\n search_res = milvus_client.search(\n collection_name=collection_name,\n data=[emb_text(question)],\n limit=top_k,\n # search_params={\"metric_type\": \"IP\", \"params\": {}},\n output_fields=[\"text\"],\n )\n return [(res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]]\n","def generate_rag_response(question):\n retrieved_docs = retrieve_documents(question)\n context = \"\\n\".join([f\"Text: {doc[0]}\\n\" for doc in retrieved_docs])\n system_prompt = (\n \"You are an AI assistant. Provide answers based on the given context.\"\n )\n user_prompt = f\"\"\"\n Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.\n \n Context:\n {context}\n \n Question: {question}\n \"\"\"\n response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": system_prompt},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n return response.choices[0].message.content\n","question = \"What is the Advanced Search Algorithms in Milvus?\"\nanswer = generate_rag_response(question)\nprint(f\"Question: {question}\")\nprint(f\"Answer: {answer}\")\n"],"headingContent":"Build a RAG with Milvus and Unstructured","anchorList":[{"label":"بناء RAG مع Milvus و Unstructured","href":"Build-a-RAG-with-Milvus-and-Unstructured","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"إنشاء مجموعة ميلفوس","href":"Create-Milvus-Collection","type":2,"isActive":false},{"label":"تحميل البيانات من Unstructured","href":"Load-data-from-Unstructured","type":2,"isActive":false},{"label":"استرجاع وتوليد الاستجابة","href":"Retrieve-and-Generate-Response","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.md b/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.md new file mode 100644 index 000000000..d3278fb3b --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/rag_with_milvus_and_unstructured.md @@ -0,0 +1,289 @@ +--- +id: rag_with_milvus_and_unstructured.md +summary: >- + في هذا البرنامج التعليمي، سوف نستخدم Unstructured لاستيعاب مستندات PDF ثم + نستخدم Milvus لإنشاء خط أنابيب RAG. +title: بناء RAG مع Milvus و Unstructured +--- +

بناء RAG مع Milvus و Unstructured

+Open In Colab + + +GitHub Repository +

+

توفرUnstructured منصة وأدوات لاستيعاب ومعالجة المستندات غير المهيكلة من أجل توليد الاسترجاع المعزز (RAG) وضبط النماذج. يوفر كلاً من منصة واجهة مستخدم بدون تعليمات برمجية وخدمات واجهة برمجة التطبيقات بدون خادم، مما يسمح للمستخدمين بمعالجة البيانات على موارد الحوسبة المستضافة من Unstructured.

+

في هذا البرنامج التعليمي، سوف نستخدم Unstructured لاستيعاب مستندات PDF ثم نستخدم Milvus لإنشاء خط أنابيب RAG.

+

التحضير

التبعيات والبيئة

$ pip install -qU "unstructured-ingest[pdf]" unstructured pymilvus openai
+
+
+

إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

+
+

يمكنك الحصول على متغيرات البيئة UNSTRUCTURED_API_KEY و UNSTRUCTURED_URL من هنا.

+

سنستخدم OpenAI كـ LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

+
import os
+
+
+os.environ["UNSTRUCTURED_API_KEY"] = "***********"
+os.environ["UNSTRUCTURED_URL"] = "***********"
+
+os.environ["OPENAI_API_KEY"] = "***********"
+
+

إعداد عملاء Milvus و OpenAI

يمكنك استخدام عميل Milvus لإنشاء مجموعة Milvus وإدراج البيانات فيها.

+
from pymilvus import MilvusClient, DataType
+
+# Initialize Milvus client
+milvus_client = MilvusClient(uri="./milvus_demo.db")  # TODO
+
+
+

أما بالنسبة للوسيطة MilvusClient:

+
    +
  • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
  • +
  • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين ميزة المصادقة على Milvus، فاستخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
  • +
  • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
  • +
+
+

تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

+
collection_name = "my_rag_collection"
+
+if milvus_client.has_collection(collection_name):
+    milvus_client.drop_collection(collection_name)
+
+

قم بإعداد عميل OpenAI لإنشاء تضمينات وإنشاء استجابات.

+
from openai import OpenAI
+
+openai_client = OpenAI()
+
+
+def emb_text(text):
+    return (
+        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
+        .data[0]
+        .embedding
+    )
+
+

إنشاء تضمين اختباري وطباعة بُعده والعناصر القليلة الأولى.

+
test_embedding = emb_text("This is a test")
+embedding_dim = len(test_embedding)
+print(embedding_dim)
+print(test_embedding[:10])
+
+
1536
+[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
+
+

إنشاء مجموعة ميلفوس

سننشئ مجموعة بالمخطط التالي:

+
    +
  • id: المفتاح الأساسي، وهو معرّف فريد لكل مستند.
  • +
  • vector: تضمين المستند.
  • +
  • text: المحتوى النصي للمستند.
  • +
  • metadata: البيانات الوصفية للمستند.
  • +
+

ثم نقوم ببناء فهرس AUTOINDEX على الحقل vector. ثم ننشئ المجموعة.

+
# Create schema
+schema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)
+# Add fields to schema
+schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
+schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)
+schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)
+schema.add_field(field_name="metadata", datatype=DataType.JSON)
+index_params = MilvusClient.prepare_index_params()
+index_params.add_index(
+    field_name="vector",
+    metric_type="COSINE",
+    index_type="AUTOINDEX",
+)
+milvus_client.create_collection(
+    collection_name=collection_name,
+    schema=schema,
+    index_params=index_params,
+    consistency_level="Strong",
+)
+
+milvus_client.load_collection(collection_name=collection_name)
+
+

تحميل البيانات من Unstructured

يوفر Unstructured خط أنابيب استيعاب مرن وقوي لمعالجة أنواع مختلفة من الملفات، بما في ذلك PDF و HTML وغيرها. سنستخدم وظيفة الاستيعاب لتقسيم ملفات PDF في دليل محلي. ومن ثم تحميل البيانات في Milvus.

+
from unstructured_ingest.v2.pipeline.pipeline import Pipeline
+from unstructured_ingest.v2.interfaces import ProcessorConfig
+from unstructured_ingest.v2.processes.connectors.local import (
+    LocalIndexerConfig,
+    LocalDownloaderConfig,
+    LocalConnectionConfig,
+    LocalUploaderConfig,
+)
+from unstructured_ingest.v2.processes.partitioner import PartitionerConfig
+
+directory_with_pdfs = "./pdf_files"
+directory_with_results = "./pdf_processed_outputs"
+
+Pipeline.from_configs(
+    context=ProcessorConfig(),
+    indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),
+    downloader_config=LocalDownloaderConfig(),
+    source_connection_config=LocalConnectionConfig(),
+    partitioner_config=PartitionerConfig(
+        partition_by_api=True,
+        api_key=os.getenv("UNSTRUCTURED_API_KEY"),
+        partition_endpoint=os.getenv("UNSTRUCTURED_API_URL"),
+        strategy="hi_res",
+        additional_partition_args={
+            "split_pdf_page": True,
+            "split_pdf_concurrency_level": 15,
+        },
+    ),
+    uploader_config=LocalUploaderConfig(output_dir=directory_with_results),
+).run()
+
+
+from unstructured.staging.base import elements_from_json
+
+
+def load_processed_files(directory_path):
+    elements = []
+    for filename in os.listdir(directory_path):
+        if filename.endswith(".json"):
+            file_path = os.path.join(directory_path, filename)
+            try:
+                elements.extend(elements_from_json(filename=file_path))
+            except IOError:
+                print(f"Error: Could not read file {filename}.")
+
+    return elements
+
+
+elements = load_processed_files(directory_with_results)
+
+

إدراج البيانات في Milvus.

+
data = []
+for i, element in enumerate(elements):
+    data.append(
+        {
+            "id": i,
+            "vector": emb_text(element.text),
+            "text": element.text,
+            "metadata": element.metadata.to_dict(),
+        }
+    )
+milvus_client.insert(collection_name=collection_name, data=data)
+
+

استرجاع وتوليد الاستجابة

تحديد دالة لاسترداد المستندات ذات الصلة من ملفوس.

+
def retrieve_documents(question, top_k=3):
+    search_res = milvus_client.search(
+        collection_name=collection_name,
+        data=[emb_text(question)],
+        limit=top_k,
+        # search_params={"metric_type": "IP", "params": {}},
+        output_fields=["text"],
+    )
+    return [(res["entity"]["text"], res["distance"]) for res in search_res[0]]
+
+

تحديد دالة لإنشاء استجابة باستخدام المستندات المسترجعة في خط أنابيب RAG.

+
def generate_rag_response(question):
+    retrieved_docs = retrieve_documents(question)
+    context = "\n".join([f"Text: {doc[0]}\n" for doc in retrieved_docs])
+    system_prompt = (
+        "You are an AI assistant. Provide answers based on the given context."
+    )
+    user_prompt = f"""
+    Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.
+    
+    Context:
+    {context}
+    
+    Question: {question}
+    """
+    response = openai_client.chat.completions.create(
+        model="gpt-4o-mini",
+        messages=[
+            {"role": "system", "content": system_prompt},
+            {"role": "user", "content": user_prompt},
+        ],
+    )
+    return response.choices[0].message.content
+
+

لنختبر خط أنابيب RAG باستخدام نموذج سؤال.

+
question = "What is the Advanced Search Algorithms in Milvus?"
+answer = generate_rag_response(question)
+print(f"Question: {question}")
+print(f"Answer: {answer}")
+
+
INFO: HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
+INFO: HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
+
+
+Question: What is the Advanced Search Algorithms in Milvus?
+Answer: The Advanced Search Algorithms in Milvus refer to a wide range of in-memory and on-disk indexing/search algorithms it supports, including IVF, HNSW, DiskANN, and more. These algorithms have been deeply optimized, and Milvus delivers 30%-70% better performance compared to popular implementations like FAISS and HNSWLib.
+
diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.json b/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.json new file mode 100644 index 000000000..8ea958f04 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/arc53/DocsGPT.git\n$ cd DocsGPT\n","$ echo \"\\nlangchain-milvus==0.1.6\" >> ./application/requirements.txt\n"," backend:\n build: ./application\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n"," worker:\n build: ./application\n command: celery -A application.app.celery worker -l INFO -B\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n","$ docker compose down\n"],"headingContent":"Use Milvus in DocsGPT","anchorList":[{"label":"استخدام Milvus في DocsGPT","href":"Use-Milvus-in-DocsGPT","type":1,"isActive":false},{"label":"المتطلبات","href":"Requirements","type":2,"isActive":false},{"label":"استنساخ المستودع","href":"Clone-the-repository","type":2,"isActive":false},{"label":"إضافة تبعية","href":"Add-dependency","type":2,"isActive":false},{"label":"تعيين متغيرات البيئة","href":"Set-environment-variables","type":2,"isActive":false},{"label":"ابدأ تشغيل الخدمات","href":"Start-the-services","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.md b/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.md new file mode 100644 index 000000000..1060f9a3d --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_in_docsgpt.md @@ -0,0 +1,142 @@ +--- +id: use_milvus_in_docsgpt.md +summary: >- + سنوضح لك في هذا البرنامج التعليمي كيفية استخدام Milvus كقاعدة بيانات متجهات + خلفية ل DocsGPT. +title: استخدام Milvus في DocsGPT +--- +

استخدام Milvus في DocsGPT

DocsGPT هو حل متقدم مفتوح المصدر يسهّل العثور على المعلومات في وثائق المشروع من خلال دمج نماذج GPT القوية. فهو يُمكّن المطورين من الحصول على إجابات دقيقة لأسئلتهم حول المشروع بسهولة، مما يُغنيهم عن عمليات البحث اليدوية التي تستغرق وقتًا طويلًا.

+

في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية استخدام Milvus كقاعدة بيانات متجهة خلفية لـ DocsGPT.

+
+

يُشار في هذا البرنامج التعليمي بشكل أساسي إلى دليل التثبيت الرسمي لـ DocsGPT. إذا وجدت أن هذا البرنامج التعليمي يحتوي على أجزاء قديمة، يمكنك إعطاء الأولوية لاتباع الدليل الرسمي وإنشاء مشكلة لنا.

+
+

المتطلبات

تأكد من تثبيت Docker لديك

+

استنساخ المستودع

استنسخ المستودع وانتقل إليه:

+
$ git clone https://github.com/arc53/DocsGPT.git
+$ cd DocsGPT
+
+

إضافة تبعية

ألحق التبعية langchain-milvus بملف requirements.txt ضمن المجلد application:

+
$ echo "\nlangchain-milvus==0.1.6" >> ./application/requirements.txt
+
+

تعيين متغيرات البيئة

أضف VECTOR_STORE=milvus و MILVUS_URI=... و و MILVUS_TOKEN=... إلى متغيرات البيئة لكل من خدمتي backend و worker في الملف docker-compose.yaml ، هكذا

+
  backend:
+    build: ./application
+    environment:
+      - VECTOR_STORE=milvus
+      - MILVUS_URI=...
+      - MILVUS_TOKEN=...
+
+
  worker:
+    build: ./application
+    command: celery -A application.app.celery worker -l INFO -B
+    environment:
+      - VECTOR_STORE=milvus
+      - MILVUS_URI=...
+      - MILVUS_TOKEN=...
+
+

بالنسبة إلى MILVUS_URI و MILVUS_TOKEN ، يمكنك إما استخدام خدمة زيليز كلاود المدارة بالكامل (موصى به) أو خدمة ميلفوس التي يتم تشغيلها يدويًا.

+
    +
  • لخدمة Zilliz Cloud المدارة بالكامل: نوصي باستخدام خدمة Zilliz Cloud. يمكنك التسجيل للحصول على حساب تجريبي مجاني على Zilliz Cloud. بعد ذلك، ستحصل على MILVUS_URI و MILVUS_TOKEN ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات.

  • +
  • لبدء خدمة Milvus يدويًا: إذا كنت ترغب في إعداد خدمة Milvus، يمكنك اتباع وثائق Milvus الرسمية لإعداد خادم Milvus، ثم الحصول على MILVUS_URI و MILVUS_TOKEN من الخادم. يجب أن يكون MILVUS_URI و MILVUS_TOKEN بصيغة http://<your_server_ip>:19530 و <your_username>:<your_password> على التوالي.

  • +
+

ابدأ تشغيل الخدمات

قم بتشغيل: ./setup.sh

+

ثم انتقل إلى http://localhost:5173/.

+

يمكنك التلاعب بواجهة المستخدم وطرح أسئلة حول المستندات الخاصة بك.

+

+ + alt text + النص البديل

+

إذا كنت تريد إيقاف الخدمات، قم بتشغيل:

+
$ docker compose down
+
+

لمزيد من التفاصيل والإعدادات الأكثر تقدمًا، يُرجى الرجوع إلى الوثائق الرسمية لـ DocsGPT.

diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.json b/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.json new file mode 100644 index 000000000..b11dbd7ad --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/zylon-ai/private-gpt\n$ cd private-gpt\n","$ brew install make\n","$ choco install make\n","$ poetry install --extras \"llms-ollama embeddings-ollama vector-stores-milvus ui\"\n","$ ollama serve\n","$ ollama pull llama3.1\n$ ollama pull nomic-embed-text\n","vectorstore:\n database: milvus\n","milvus:\n uri: http://localhost:19530\n collection_name: my_collection\n","PGPT_PROFILES=ollama make run\n"],"headingContent":"Use Milvus in PrivateGPT","anchorList":[{"label":"استخدام Milvus في PrivateGPT","href":"Use-Milvus-in-PrivateGPT","type":1,"isActive":false},{"label":"المتطلبات الأساسية لتشغيل PrivateGPT","href":"Base-requirements-to-run-PrivateGPT","type":2,"isActive":false},{"label":"تثبيت الوحدات المتاحة","href":"Install-Available-Modules","type":2,"isActive":false},{"label":"ابدأ تشغيل خدمة أولاما","href":"Start-Ollama-service","type":2,"isActive":false},{"label":"تغيير إعدادات ميلفوس","href":"Change-Milvus-Settings","type":2,"isActive":false},{"label":"بدء تشغيل PrivateGPT","href":"Start-PrivateGPT","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.md b/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.md new file mode 100644 index 000000000..5ec1e49b5 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_in_private_gpt.md @@ -0,0 +1,170 @@ +--- +id: use_milvus_in_private_gpt.md +summary: >- + سنوضح لك في هذا البرنامج التعليمي كيفية استخدام Milvus كقاعدة بيانات متجهات + خلفية ل PrivateGPT. +title: استخدام Milvus في PrivateGPT +--- +

استخدام Milvus في PrivateGPT

برايفتGPT هو مشروع ذكاء اصطناعي جاهز للإنتاج يُمكِّن المستخدمين من طرح أسئلة حول مستنداتهم باستخدام نماذج لغوية كبيرة دون الحاجة للاتصال بالإنترنت مع ضمان الخصوصية بنسبة 100%. يقدم PrivateGPT واجهة برمجة تطبيقات مقسمة إلى كتل عالية المستوى وأخرى منخفضة المستوى. كما يوفر أيضاً عميل واجهة مستخدم Gradio UI وأدوات مفيدة مثل البرامج النصية لتنزيل النماذج المجمّعة والبرامج النصية للاستيعاب. من الناحية النظرية، يغلّف PrivateGPT خط أنابيب RAG ويكشف عن أولياته، بحيث يكون جاهزًا للاستخدام ويوفر تنفيذًا كاملًا لواجهة برمجة التطبيقات وخط أنابيب RAG.

+

سنوضح لك في هذا البرنامج التعليمي كيفية استخدام Milvus كقاعدة بيانات متجهية خلفية لـ PrivateGPT.

+
+

يُشار في هذا البرنامج التعليمي بشكل أساسي إلى دليل التثبيت الرسمي لـ PrivateGPT. إذا وجدت أن هذا البرنامج التعليمي يحتوي على أجزاء قديمة، يمكنك إعطاء الأولوية لاتباع الدليل الرسمي وإنشاء مشكلة لنا.

+
+

المتطلبات الأساسية لتشغيل PrivateGPT

1. استنساخ مستودع PrivateGPT

استنسخ المستودع وانتقل إليه:

+
$ git clone https://github.com/zylon-ai/private-gpt
+$ cd private-gpt
+
+

2. تثبيت Poetry

قم بتثبيت Poetry لإدارة التبعية: اتبع التعليمات الموجودة على موقع Poetry الرسمي لتثبيته.

+

3. 3. (اختياري) تثبيت Make

لتشغيل العديد من البرامج النصية المختلفة، تحتاج إلى تثبيت Make.

+

macOS (باستخدام Homebrew):

+
$ brew install make
+
+

ويندوز (باستخدام Chocolatey):

+
$ choco install make
+
+

تثبيت الوحدات المتاحة

يسمح PrivateGPT بتخصيص الإعداد لبعض الوحدات، مثل LLM، والتضمينات، ومخازن المتجهات، وواجهة المستخدم.

+

في هذا البرنامج التعليمي، سنستخدم الوحدات التالية:

+
    +
  • LLM: أولاما
  • +
  • التضمينات: أولاما
  • +
  • مخازن المتجهات: ميلفوس
  • +
  • واجهة المستخدم: غراديو
  • +
+

قم بتشغيل الأمر التالي لاستخدام الشعر لتثبيت تبعيات الوحدة النمطية المطلوبة:

+
$ poetry install --extras "llms-ollama embeddings-ollama vector-stores-milvus ui"
+
+

ابدأ تشغيل خدمة أولاما

انتقل إلى ollama.ai واتبع التعليمات لتثبيت Ollama على جهازك.

+

بعد التثبيت، تأكد من إغلاق تطبيق Ollama لسطح المكتب.

+

الآن، ابدأ تشغيل خدمة أولاما (سيبدأ تشغيل خادم استدلال محلي يخدم كلاً من LLM و Embeddings):

+
$ ollama serve
+
+

قم بتثبيت النماذج التي سيتم استخدامها، يتم تكوين الافتراضي settings-ollama.yaml للمستخدم llama3.1 8b LLM (حوالي 4 جيجابايت) و nomic-embed-text Embeddings (حوالي 275 ميغابايت)

+

بشكل افتراضي، ستقوم PrivateGPT بسحب النماذج تلقائيًا حسب الحاجة. يمكن تغيير هذا السلوك بتعديل الخاصية ollama.autopull_models.

+

على أي حال، إذا أردت سحب النماذج يدويًا، قم بتشغيل الأوامر التالية:

+
$ ollama pull llama3.1
+$ ollama pull nomic-embed-text
+
+

يمكنك اختياريًا التغيير إلى نماذجك المفضلة في الملف settings-ollama.yaml وسحبها يدويًا.

+

تغيير إعدادات ميلفوس

في الملف settings-ollama.yaml ، اضبط متجه المتجر على ميلفوس:

+
vectorstore:
+  database: milvus
+
+

يمكنك أيضاً إضافة بعض تكوينات ملف ميلفوس لتحديد الإعدادات الخاصة بك مثل هذا:

+
milvus:
+  uri: http://localhost:19530
+  collection_name: my_collection
+
+

خيارات التكوين المتاحة هي:

+ + + + + + + + + + +
خيار الحقلالوصف
يورييتم تعيين الإعداد الافتراضي على "local_data/private_gpt/milvus/milvus_local.db" كملف محلي؛ يمكنك أيضًا إعداد خادم Milvus أكثر أداءً على docker أو k8s على سبيل المثال http://localhost:19530، كـ uri الخاص بك؛ لاستخدام Zilliz Cloud، اضبط uri والرمز المميز على نقطة النهاية العامة ومفتاح API في Zilliz Cloud.
الرمز المميزإقران مع خادم Milvus على docker أو k8s أو مفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
اسم_المجموعةاسم المجموعة، مضبوط على "milvus_db" الافتراضي.
الكتابة فوقالكتابة فوق البيانات الموجودة في المجموعة إذا كانت موجودة، مضبوطة على الوضع الافتراضي True.
+

بدء تشغيل PrivateGPT

بمجرد الانتهاء من جميع الإعدادات، يمكنك تشغيل PrivateGPT باستخدام واجهة مستخدم Gradio.

+
PGPT_PROFILES=ollama make run
+
+

ستكون واجهة المستخدم متاحة على http://0.0.0.0:8001.

+

+ + + + +

+

يمكنك التلاعب بواجهة المستخدم وطرح الأسئلة حول مستنداتك.

+

لمزيد من التفاصيل، يُرجى الرجوع إلى الوثائق الرسمية لـ PrivateGPT.

diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.json b/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.json new file mode 100644 index 000000000..22614d19c --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/sambanova/ai-starter-kit.git\n$ d ai-starter-kit/enterprise_knowledge_retriever\n","...\nvectorstore = self.vectordb.create_vector_store(\n ..., db_type='milvus'\n)\n...\nvectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)\n","python3 -m venv enterprise_knowledge_env\nsource enterprise_knowledge_env/bin/activate\npip install -r requirements.txt\n","$ streamlit run streamlit/app.py --browser.gatherUsageStats false \n"],"headingContent":"Use Milvus with SambaNova","anchorList":[{"label":"استخدم Milvus مع SambaNova","href":"Use-Milvus-with-SambaNova","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"استنساخ المستودع","href":"Clone-the-repository","type":2,"isActive":false},{"label":"تغيير نوع مخزن المتجهات","href":"Change-the-vector-store-type","type":2,"isActive":false},{"label":"تثبيت التبعيات","href":"Install-dependencies","type":2,"isActive":false},{"label":"بدء تشغيل التطبيق","href":"Start-the-application","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.md b/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.md new file mode 100644 index 000000000..fc4ffa5ee --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/use_milvus_with_sambanova.md @@ -0,0 +1,135 @@ +--- +id: use_milvus_with_sambanova.md +summary: >- + يستفيد هذا البرنامج التعليمي من تكامل Milvus في مجموعات SambaNova للذكاء + الاصطناعي للمبتدئين لبناء نظام استرجاع المعرفة المؤسسية على غرار RAG + (الاسترجاع المعزز) لاسترجاع المعلومات والإجابة عليها استنادًا إلى المستندات + الخاصة بالمؤسسة. +title: استخدم Milvus مع SambaNova +--- +

استخدم Milvus مع SambaNova

SambaNova هي منصة تكنولوجيا ذكاء اصطناعي مبتكرة تعمل على تسريع نشر قدرات الذكاء الاصطناعي المتقدمة والتعلم العميق. وهي مصممة للاستخدام في المؤسسات، وهي تمكّن المؤسسات من الاستفادة من الذكاء الاصطناعي التوليدي لتحسين الأداء والكفاءة. ومن خلال توفير حلول متطورة مثل حزمة SambaNova Suite وDataScale، تمكّن المنصة الشركات من استخلاص رؤى قيمة من بياناتها، مما يؤدي إلى تحسينات تشغيلية وتعزيز فرص جديدة في مجال الذكاء الاصطناعي.

+

مجموعات أدوات SambaNova للذكاء الاصطناعي هي مجموعة من الموارد مفتوحة المصدر المصممة لمساعدة المطورين والشركات في نشر التطبيقات القائمة على الذكاء الاصطناعي باستخدام SambaNova. توفر هذه المجموعات أمثلة وأدلة عملية تسهل تنفيذ حالات استخدام الذكاء الاصطناعي المختلفة، مما يسهل على المستخدمين الاستفادة من تقنية SambaNova المتقدمة.

+

يستفيد هذا البرنامج التعليمي من تكامل Milvus في مجموعات أدوات SambaNova للذكاء الاصطناعي للمبتدئين لبناء نظام استرجاع المعرفة المؤسسية على غرار RAG (الاسترجاع المعزز)، لاسترجاع المعلومات والإجابة عليها استنادًا إلى المستندات الخاصة بالمؤسسة.

+
+

يُشار في هذا البرنامج التعليمي بشكل أساسي إلى الدليل الرسمي لـ SambaNova AI Starter Kits. إذا وجدت أن هذا البرنامج التعليمي يحتوي على أجزاء قديمة، يمكنك إعطاء الأولوية لاتباع الدليل الرسمي وإنشاء مشكلة لنا.

+
+

المتطلبات الأساسية

نوصي باستخدام Python >= 3.10 و <3.12.

+

قم بزيارة SambaNova Cloud للحصول على مفتاح SambaNova API.

+

استنساخ المستودع

$ git clone https://github.com/sambanova/ai-starter-kit.git
+$ d ai-starter-kit/enterprise_knowledge_retriever
+
+

تغيير نوع مخزن المتجهات

قم بتغيير مخزن المتجهات عن طريق تعيين db_type='milvus' في الدالتين create_vector_store() و load_vdb() في src/document_retrieval.py.

+
...
+vectorstore = self.vectordb.create_vector_store(
+    ..., db_type='milvus'
+)
+...
+vectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)
+
+

تثبيت التبعيات

قم بتثبيت التبعيات المطلوبة عن طريق تشغيل الأمر التالي:

+
python3 -m venv enterprise_knowledge_env
+source enterprise_knowledge_env/bin/activate
+pip install -r requirements.txt
+
+

بدء تشغيل التطبيق

استخدم الأمر التالي لبدء تشغيل التطبيق:

+
$ streamlit run streamlit/app.py --browser.gatherUsageStats false 
+
+

بعد ذلك، سترى واجهة المستخدم في متصفحك:http://localhost:8501/

+

+ + + + +

+

بعد تعيين مفتاح SambaNova API الخاص بك في واجهة المستخدم، يمكنك التلاعب بواجهة المستخدم وطرح أسئلة حول مستنداتك.

+

للمزيد من التفاصيل، يُرجى الرجوع إلى الوثائق الرسمية لاسترجاع المعرفة المؤسسية لمجموعات SambaNova AI Starter Kits.

diff --git a/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.json b/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.json new file mode 100644 index 000000000..64c5a2db6 --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["mkdir video-search-tutorial\ncd video-search-tutorial\n","python -m venv venv\nsource venv/bin/activate # On Windows, use `venv\\Scripts\\activate`\n","pip install twelvelabs pymilvus\n","touch video_search.py\n","export TWELVE_LABS_API_KEY='your_api_key_here'\n","from pymilvus import MilvusClient\n\n# Initialize the Milvus client\nmilvus_client = MilvusClient(\"milvus_twelvelabs_demo.db\")\n\nprint(\"Successfully connected to Milvus\")\n","# Initialize the collection name\ncollection_name = \"twelvelabs_demo_collection\"\n\n# Check if the collection already exists and drop it if it does\nif milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n\n# Create the collection\nmilvus_client.create_collection(\n collection_name=collection_name,\n dimension=1024 # The dimension of the Twelve Labs embeddings\n)\n\nprint(f\"Collection '{collection_name}' created successfully\")\n","from twelvelabs import TwelveLabs\nfrom twelvelabs.models.embed import EmbeddingsTask\nimport os\n\n# Retrieve the API key from environment variables\nTWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')\n","twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)\n","def generate_embedding(video_url):\n \"\"\"\n Generate embeddings for a given video URL using the Twelve Labs API.\n\n This function creates an embedding task for the specified video URL using\n the Marengo-retrieval-2.6 engine. It monitors the task progress and waits\n for completion. Once done, it retrieves the task result and extracts the\n embeddings along with their associated metadata.\n\n Args:\n video_url (str): The URL of the video to generate embeddings for.\n\n Returns:\n tuple: A tuple containing two elements:\n 1. list: A list of dictionaries, where each dictionary contains:\n - 'embedding': The embedding vector as a list of floats.\n - 'start_offset_sec': The start time of the segment in seconds.\n - 'end_offset_sec': The end time of the segment in seconds.\n - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').\n 2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.\n\n Raises:\n Any exceptions raised by the Twelve Labs API during task creation,\n execution, or retrieval.\n \"\"\"\n\n # Create an embedding task\n task = twelvelabs_client.embed.task.create(\n engine_name=\"Marengo-retrieval-2.6\",\n video_url=video_url\n )\n print(f\"Created task: id={task.id} engine_name={task.engine_name} status={task.status}\")\n\n # Define a callback function to monitor task progress\n def on_task_update(task: EmbeddingsTask):\n print(f\" Status={task.status}\")\n\n # Wait for the task to complete\n status = task.wait_for_done(\n sleep_interval=2,\n callback=on_task_update\n )\n print(f\"Embedding done: {status}\")\n\n # Retrieve the task result\n task_result = twelvelabs_client.embed.task.retrieve(task.id)\n\n # Extract and return the embeddings\n embeddings = []\n for v in task_result.video_embeddings:\n embeddings.append({\n 'embedding': v.embedding.float,\n 'start_offset_sec': v.start_offset_sec,\n 'end_offset_sec': v.end_offset_sec,\n 'embedding_scope': v.embedding_scope\n })\n \n return embeddings, task_result\n","# Example usage\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Generate embeddings for the video\nembeddings, task_result = generate_embedding(video_url)\n\nprint(f\"Generated {len(embeddings)} embeddings for the video\")\nfor i, emb in enumerate(embeddings):\n print(f\"Embedding {i+1}:\")\n print(f\" Scope: {emb['embedding_scope']}\")\n print(f\" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds\")\n print(f\" Embedding vector (first 5 values): {emb['embedding'][:5]}\")\n print()\n","def insert_embeddings(milvus_client, collection_name, task_result, video_url):\n \"\"\"\n Insert embeddings into the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to insert into.\n task_result (EmbeddingsTaskResult): The task result containing video embeddings.\n video_url (str): The URL of the video associated with the embeddings.\n\n Returns:\n MutationResult: The result of the insert operation.\n\n This function takes the video embeddings from the task result and inserts them\n into the specified Milvus collection. Each embedding is stored with additional\n metadata including its scope, start and end times, and the associated video URL.\n \"\"\"\n data = []\n\n for i, v in enumerate(task_result.video_embeddings):\n data.append({\n \"id\": i,\n \"vector\": v.embedding.float,\n \"embedding_scope\": v.embedding_scope,\n \"start_offset_sec\": v.start_offset_sec,\n \"end_offset_sec\": v.end_offset_sec,\n \"video_url\": video_url\n })\n\n insert_result = milvus_client.insert(collection_name=collection_name, data=data)\n print(f\"Inserted {len(data)} embeddings into Milvus\")\n return insert_result\n\n# Usage example\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Assuming this function exists from previous step\nembeddings, task_result = generate_embedding(video_url)\n\n# Insert embeddings into the Milvus collection\ninsert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)\nprint(insert_result)\n","def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):\n \"\"\"\n Perform a similarity search on the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to search in.\n query_vector (list): The query vector to search for similar embeddings.\n limit (int, optional): The maximum number of results to return. Defaults to 5.\n\n Returns:\n list: A list of search results, where each result is a dictionary containing\n the matched entity's metadata and similarity score.\n\n This function searches the specified Milvus collection for embeddings similar to\n the given query vector. It returns the top matching results, including metadata\n such as the embedding scope, time range, and associated video URL for each match.\n \"\"\"\n search_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vector],\n limit=limit,\n output_fields=[\"embedding_scope\", \"start_offset_sec\", \"end_offset_sec\", \"video_url\"]\n )\n\n return search_results\n \n# define the query vector\n# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.\nquery_vector = task_result.video_embeddings[0].embedding.float\n\n# Perform a similarity search on the Milvus collection\nsearch_results = perform_similarity_search(milvus_client, collection_name, query_vector)\n\nprint(\"Search Results:\")\nfor i, result in enumerate(search_results[0]):\n print(f\"Result {i+1}:\")\n print(f\" Video URL: {result['entity']['video_url']}\")\n print(f\" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds\")\n print(f\" Similarity Score: {result['distance']}\")\n print()\n"],"headingContent":"Advanced Video Search: Leveraging Twelve Labs and Milvus for Semantic Retrieval","anchorList":[{"label":"بحث الفيديو المتقدم: الاستفادة من مختبرات Twelve Labs و Milvus للاسترجاع الدلالي","href":"Advanced-Video-Search-Leveraging-Twelve-Labs-and-Milvus-for-Semantic-Retrieval","type":1,"isActive":false},{"label":"مقدمة","href":"Introduction","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"إعداد بيئة التطوير","href":"Setting-Up-the-Development-Environment","type":2,"isActive":false},{"label":"الاتصال بـ Milvus","href":"Connecting-to-Milvus","type":2,"isActive":false},{"label":"إنشاء مجموعة ميلفوس لتضمين الفيديو","href":"Creating-a-Milvus-Collection-for-Video-Embeddings","type":2,"isActive":false},{"label":"توليد التضمينات باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API","href":"Generating-Embeddings-with-Twelve-Labs-Embed-API","type":2,"isActive":false},{"label":"قم بتهيئة عميل Twelve Labs:","href":"Initialize-the-Twelve-Labs-client","type":2,"isActive":false},{"label":"إدراج التضمينات في ميلفوس","href":"Inserting-Embeddings-into-Milvus","type":2,"isActive":false},{"label":"إجراء بحث التشابه","href":"Performing-Similarity-Search","type":2,"isActive":false},{"label":"تحسين الأداء","href":"Optimizing-Performance","type":2,"isActive":false},{"label":"الميزات المتقدمة","href":"Advanced-Features","type":2,"isActive":false},{"label":"معالجة الأخطاء وتسجيلها","href":"Error-Handling-and-Logging","type":2,"isActive":false},{"label":"الخاتمة","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.md b/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.md new file mode 100644 index 000000000..6bdb17faa --- /dev/null +++ b/localization/v2.5.x/site/ar/integrations/video_search_with_twelvelabs_and_milvus.md @@ -0,0 +1,462 @@ +--- +id: video_search_with_twelvelabs_and_milvus.md +summary: >- + تعرّف على كيفية إنشاء تطبيق بحث دلالي للفيديو من خلال دمج واجهة برمجة تطبيقات + Twelve Labs Embed API لتوليد تضمينات متعددة الوسائط مع Milvus. وهو يغطي + العملية بأكملها بدءًا من إعداد بيئة التطوير إلى تنفيذ الميزات المتقدمة مثل + البحث الهجين والتحليل الزمني للفيديو، مما يوفر أساسًا شاملاً لبناء أنظمة تحليل + واسترجاع محتوى الفيديو المتطورة. +title: >- + بحث الفيديو المتقدم: الاستفادة من مختبرات Twelve Labs و Milvus للاسترجاع + الدلالي +--- +

بحث الفيديو المتقدم: الاستفادة من مختبرات Twelve Labs و Milvus للاسترجاع الدلالي

مقدمة

مرحبًا بكم في هذا البرنامج التعليمي الشامل حول تنفيذ البحث الدلالي عن الفيديو باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API و Milvus. في هذا الدليل، سنستكشف في هذا الدليل كيفية تسخير قوة التضمينات متعددة الوسائط المتقدمة من Twelve Labs وقاعدة بيانات Milvus الفعالة المتجهة لإنشاء حل بحث فيديو قوي. من خلال دمج هذه التقنيات، يمكن للمطورين فتح إمكانيات جديدة في تحليل محتوى الفيديو، مما يتيح تطبيقات مثل استرجاع الفيديو القائم على المحتوى، وأنظمة التوصيات، ومحركات البحث المتطورة التي تفهم الفروق الدقيقة في بيانات الفيديو.

+

سيرشدك هذا البرنامج التعليمي خلال العملية بأكملها، بدءًا من إعداد بيئة التطوير الخاصة بك إلى تنفيذ تطبيق بحث دلالي وظيفي للفيديو. سنغطي المفاهيم الأساسية مثل توليد تضمينات متعددة الوسائط من مقاطع الفيديو، وتخزينها بكفاءة في ميلفوس، وإجراء عمليات البحث عن التشابه لاسترداد المحتوى ذي الصلة. سواء كنت تقوم ببناء منصة لتحليلات الفيديو، أو أداة لاكتشاف المحتوى، أو تحسين تطبيقاتك الحالية بقدرات البحث عن الفيديو، سيزودك هذا الدليل بالمعرفة والخطوات العملية للاستفادة من نقاط القوة المشتركة ل Twelve Labs و Milvus في مشاريعك.

+

المتطلبات الأساسية

قبل أن نبدأ، تأكد من حصولك على ما يلي:

+

مفتاح Twelve Labs API (قم بالتسجيل في https://api.twelvelabs.io إذا لم يكن لديك واحد) بايثون 3.7 أو أحدث مثبت على نظامك

+

إعداد بيئة التطوير

قم بإنشاء دليل جديد لمشروعك وانتقل إليه:

+
mkdir video-search-tutorial
+cd video-search-tutorial
+
+

قم بإعداد بيئة افتراضية (اختياري ولكن يوصى به):

+
python -m venv venv
+source venv/bin/activate  # On Windows, use `venv\Scripts\activate`
+
+

تثبيت مكتبات بايثون المطلوبة:

+
pip install twelvelabs pymilvus
+
+

قم بإنشاء ملف بايثون جديد لمشروعك:

+
touch video_search.py
+
+

سيكون ملف video_search.py هذا هو البرنامج النصي الرئيسي الذي نستخدمه في البرنامج التعليمي. بعد ذلك، قم بإعداد مفتاح Twelve Labs API الخاص بك كمتغير بيئة للأمان:

+
export TWELVE_LABS_API_KEY='your_api_key_here'
+
+

الاتصال بـ Milvus

لإنشاء اتصال مع Milvus، سنستخدم فئة MilvusClient. يبسط هذا النهج عملية الاتصال ويسمح لنا بالعمل مع مثيل Milvus محلي قائم على ملف محلي، وهو مثالي لبرنامجنا التعليمي.

+
from pymilvus import MilvusClient
+
+# Initialize the Milvus client
+milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
+
+print("Successfully connected to Milvus")
+
+

يقوم هذا الرمز بإنشاء مثيل عميل Milvus جديد يقوم بتخزين جميع البيانات في ملف باسم milvus_twelvelvelabs_demo.db. هذا النهج القائم على الملفات مثالي لأغراض التطوير والاختبار.

+

إنشاء مجموعة ميلفوس لتضمين الفيديو

الآن بعد أن أصبحنا متصلين ب Milvus، دعونا ننشئ مجموعة لتخزين تضمينات الفيديو والبيانات الوصفية المرتبطة بها. سنقوم بتعريف مخطط المجموعة وإنشاء المجموعة إذا لم تكن موجودة بالفعل.

+
# Initialize the collection name
+collection_name = "twelvelabs_demo_collection"
+
+# Check if the collection already exists and drop it if it does
+if milvus_client.has_collection(collection_name=collection_name):
+    milvus_client.drop_collection(collection_name=collection_name)
+
+# Create the collection
+milvus_client.create_collection(
+    collection_name=collection_name,
+    dimension=1024  # The dimension of the Twelve Labs embeddings
+)
+
+print(f"Collection '{collection_name}' created successfully")
+
+

في هذه الشيفرة، نتحقق أولًا مما إذا كانت المجموعة موجودة بالفعل ونحذفها إذا كانت موجودة بالفعل. هذا يضمن أن نبدأ بسجل نظيف. ننشئ المجموعة ببُعد 1024، وهو ما يطابق بُعد الإخراج لتضمينات Twelve Labs.

+

توليد التضمينات باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API

لتوليد تضمينات لمقاطع الفيديو الخاصة بنا باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API، سنستخدم مجموعة أدوات تطوير البرمجيات الخاصة ب Twelve Labs Python SDK. تتضمن هذه العملية إنشاء مهمة تضمين، وانتظار اكتمالها، واسترداد النتائج. إليك كيفية تنفيذ ذلك:

+

أولاً، تأكد أولاً من تثبيت Twelve Labs SDK واستيراد الوحدات النمطية اللازمة:

+
from twelvelabs import TwelveLabs
+from twelvelabs.models.embed import EmbeddingsTask
+import os
+
+# Retrieve the API key from environment variables
+TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
+
+

قم بتهيئة عميل Twelve Labs:

twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
+
+

إنشاء دالة لإنشاء تضمينات لعنوان URL فيديو معين:

+
def generate_embedding(video_url):
+    """
+    Generate embeddings for a given video URL using the Twelve Labs API.
+
+    This function creates an embedding task for the specified video URL using
+    the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
+    for completion. Once done, it retrieves the task result and extracts the
+    embeddings along with their associated metadata.
+
+    Args:
+        video_url (str): The URL of the video to generate embeddings for.
+
+    Returns:
+        tuple: A tuple containing two elements:
+            1. list: A list of dictionaries, where each dictionary contains:
+                - 'embedding': The embedding vector as a list of floats.
+                - 'start_offset_sec': The start time of the segment in seconds.
+                - 'end_offset_sec': The end time of the segment in seconds.
+                - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
+            2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
+
+    Raises:
+        Any exceptions raised by the Twelve Labs API during task creation,
+        execution, or retrieval.
+    """
+
+    # Create an embedding task
+    task = twelvelabs_client.embed.task.create(
+        engine_name="Marengo-retrieval-2.6",
+        video_url=video_url
+    )
+    print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
+
+    # Define a callback function to monitor task progress
+    def on_task_update(task: EmbeddingsTask):
+        print(f"  Status={task.status}")
+
+    # Wait for the task to complete
+    status = task.wait_for_done(
+        sleep_interval=2,
+        callback=on_task_update
+    )
+    print(f"Embedding done: {status}")
+
+    # Retrieve the task result
+    task_result = twelvelabs_client.embed.task.retrieve(task.id)
+
+    # Extract and return the embeddings
+    embeddings = []
+    for v in task_result.video_embeddings:
+        embeddings.append({
+            'embedding': v.embedding.float,
+            'start_offset_sec': v.start_offset_sec,
+            'end_offset_sec': v.end_offset_sec,
+            'embedding_scope': v.embedding_scope
+        })
+    
+    return embeddings, task_result
+
+

استخدم الدالة لإنشاء تضمينات لمقاطع الفيديو الخاصة بك:

+
# Example usage
+video_url = "https://example.com/your-video.mp4"
+
+# Generate embeddings for the video
+embeddings, task_result = generate_embedding(video_url)
+
+print(f"Generated {len(embeddings)} embeddings for the video")
+for i, emb in enumerate(embeddings):
+    print(f"Embedding {i+1}:")
+    print(f"  Scope: {emb['embedding_scope']}")
+    print(f"  Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
+    print(f"  Embedding vector (first 5 values): {emb['embedding'][:5]}")
+    print()
+
+

يسمح لك هذا التطبيق بإنشاء تضمينات لأي عنوان URL للفيديو باستخدام واجهة برمجة تطبيقات Twelve Labs Embeding API. تعالج الدالة gener_embedding العملية بأكملها، بدءًا من إنشاء المهمة إلى استرداد النتائج. تقوم بإرجاع قائمة من القواميس، يحتوي كل منها على متجه التضمين مع بياناته الوصفية (النطاق الزمني والنطاق).تذكر أن تتعامل مع الأخطاء المحتملة، مثل مشاكل الشبكة أو حدود واجهة برمجة التطبيقات، في بيئة الإنتاج. قد ترغب أيضًا في تنفيذ عمليات إعادة المحاولة أو معالجة أخطاء أكثر قوة بناءً على حالة الاستخدام الخاصة بك.

+

إدراج التضمينات في ميلفوس

بعد إنشاء التضمينات باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API، فإن الخطوة التالية هي إدراج هذه التضمينات مع بياناتها الوصفية في مجموعة Milvus الخاصة بنا. تسمح لنا هذه العملية بتخزين وفهرسة تضمينات الفيديو الخاصة بنا للبحث الفعال عن التشابه لاحقًا.

+

إليك كيفية إدراج التضمينات في Milvus:

+
def insert_embeddings(milvus_client, collection_name, task_result, video_url):
+    """
+    Insert embeddings into the Milvus collection.
+
+    Args:
+        milvus_client: The Milvus client instance.
+        collection_name (str): The name of the Milvus collection to insert into.
+        task_result (EmbeddingsTaskResult): The task result containing video embeddings.
+        video_url (str): The URL of the video associated with the embeddings.
+
+    Returns:
+        MutationResult: The result of the insert operation.
+
+    This function takes the video embeddings from the task result and inserts them
+    into the specified Milvus collection. Each embedding is stored with additional
+    metadata including its scope, start and end times, and the associated video URL.
+    """
+    data = []
+
+    for i, v in enumerate(task_result.video_embeddings):
+        data.append({
+            "id": i,
+            "vector": v.embedding.float,
+            "embedding_scope": v.embedding_scope,
+            "start_offset_sec": v.start_offset_sec,
+            "end_offset_sec": v.end_offset_sec,
+            "video_url": video_url
+        })
+
+    insert_result = milvus_client.insert(collection_name=collection_name, data=data)
+    print(f"Inserted {len(data)} embeddings into Milvus")
+    return insert_result
+
+# Usage example
+video_url = "https://example.com/your-video.mp4"
+
+# Assuming this function exists from previous step
+embeddings, task_result = generate_embedding(video_url)
+
+# Insert embeddings into the Milvus collection
+insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
+print(insert_result)
+
+

تقوم هذه الدالة بإعداد البيانات للإدراج، بما في ذلك جميع البيانات الوصفية ذات الصلة مثل متجه التضمين والنطاق الزمني وعنوان URL لمصدر الفيديو. ثم يستخدم عميل Milvus لإدراج هذه البيانات في المجموعة المحددة.

+

بمجرد أن نحصل على التضمينات المخزنة في Milvus، يمكننا إجراء عمليات بحث عن التشابه للعثور على مقاطع الفيديو الأكثر صلة بناءً على متجه الاستعلام. إليك كيفية تنفيذ هذه الوظيفة:

+
def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
+    """
+    Perform a similarity search on the Milvus collection.
+
+    Args:
+        milvus_client: The Milvus client instance.
+        collection_name (str): The name of the Milvus collection to search in.
+        query_vector (list): The query vector to search for similar embeddings.
+        limit (int, optional): The maximum number of results to return. Defaults to 5.
+
+    Returns:
+        list: A list of search results, where each result is a dictionary containing
+              the matched entity's metadata and similarity score.
+
+    This function searches the specified Milvus collection for embeddings similar to
+    the given query vector. It returns the top matching results, including metadata
+    such as the embedding scope, time range, and associated video URL for each match.
+    """
+    search_results = milvus_client.search(
+        collection_name=collection_name,
+        data=[query_vector],
+        limit=limit,
+        output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
+    )
+
+    return search_results
+    
+# define the query vector
+# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
+query_vector = task_result.video_embeddings[0].embedding.float
+
+# Perform a similarity search on the Milvus collection
+search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
+
+print("Search Results:")
+for i, result in enumerate(search_results[0]):
+    print(f"Result {i+1}:")
+    print(f"  Video URL: {result['entity']['video_url']}")
+    print(f"  Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
+    print(f"  Similarity Score: {result['distance']}")
+    print()
+
+

يقوم هذا التنفيذ بما يلي:

+
    +
  1. يُعرّف الدالة perform_similarity_search التي تأخذ متجه استعلام وتبحث عن تضمينات مشابهة في مجموعة Milvus.
  2. +
  3. يستخدم طريقة بحث عميل Milvus للعثور على المتجهات الأكثر تشابهًا.
  4. +
  5. يحدد حقول الإخراج التي نريد استردادها، بما في ذلك البيانات الوصفية حول مقاطع الفيديو المطابقة.
  6. +
  7. يقدم مثالاً على كيفية استخدام هذه الدالة مع فيديو استعلام، حيث يتم أولاً إنشاء تضمينها ثم استخدامها للبحث.
  8. +
  9. يطبع نتائج البحث، بما في ذلك البيانات الوصفية ذات الصلة ودرجات التشابه.
  10. +
+

من خلال تنفيذ هذه الدوال، تكون قد أنشأت سير عمل كامل لتخزين تضمينات الفيديو في ملفوس وإجراء عمليات البحث عن التشابه. يسمح هذا الإعداد باسترجاع فعال لمحتوى الفيديو المتشابه بناءً على التضمينات متعددة الوسائط التي تم إنشاؤها بواسطة واجهة برمجة تطبيقات التضمين في Twelve Labs.

+

تحسين الأداء

حسنًا، لننتقل بهذا التطبيق إلى المستوى التالي! عند التعامل مع مجموعات الفيديو واسعة النطاق، فإن الأداء هو المفتاح. ولتحسين الأداء، يجب علينا تنفيذ المعالجة المجمعة لتوليد التضمين والإدراج في Milvus. بهذه الطريقة، يمكننا التعامل مع العديد من مقاطع الفيديو في وقت واحد، مما يقلل بشكل كبير من وقت المعالجة الإجمالي. بالإضافة إلى ذلك، يمكننا الاستفادة من ميزة التقسيم في ميلفوس لتنظيم بياناتنا بشكل أكثر كفاءة، ربما حسب فئات الفيديو أو الفترات الزمنية. سيؤدي ذلك إلى تسريع الاستعلامات من خلال السماح لنا بالبحث في الأقسام ذات الصلة فقط.

+

هناك حيلة تحسين أخرى تتمثل في استخدام آليات التخزين المؤقت للتضمينات أو نتائج البحث التي يتم الوصول إليها بشكل متكرر. يمكن أن يؤدي ذلك إلى تحسين أوقات الاستجابة للاستعلامات الشائعة بشكل كبير. لا تنسَ أن تضبط معلمات فهرس ميلفوس بدقة بناءً على مجموعة بياناتك وأنماط الاستعلام الخاصة بك - يمكن أن يؤدي القليل من التعديل هنا إلى قطع شوط طويل في تعزيز أداء البحث.

+

الميزات المتقدمة

والآن، دعونا نضيف بعض الميزات الرائعة لجعل تطبيقنا مميزاً! يمكننا تنفيذ بحث هجين يجمع بين الاستعلامات النصية والفيديو. في واقع الأمر، يمكن لـ Twelve Labs Embed API أيضًا إنشاء تضمينات نصية لاستعلاماتك النصية. تخيّل السماح للمستخدمين بإدخال وصف نصي ونموذج لمقطع فيديو - سنقوم بإنشاء تضمينات لكليهما وإجراء بحث مرجح في ميلفوس. سيعطينا هذا نتائج فائقة الدقة.

+

إضافة رائعة أخرى ستكون البحث الزمني داخل مقاطع الفيديو. يمكننا تقسيم مقاطع الفيديو الطويلة إلى مقاطع أصغر، لكل منها تضمين خاص به. بهذه الطريقة، يمكن للمستخدمين العثور على لحظات محددة داخل مقاطع الفيديو، وليس فقط مقاطع كاملة. ولمَ لا نضيف بعض تحليلات الفيديو الأساسية؟ يمكننا استخدام التضمينات لتجميع مقاطع الفيديو المتشابهة، أو اكتشاف الاتجاهات، أو حتى تحديد القيم المتطرفة في مجموعات الفيديو الكبيرة.

+

معالجة الأخطاء وتسجيلها

دعونا نواجه الأمر، يمكن أن تسوء الأمور، وعندما تسوء، يجب أن نكون مستعدين. تنفيذ معالجة قوية للأخطاء أمر بالغ الأهمية. يجب أن نغلف مكالمات واجهة برمجة التطبيقات وعمليات قاعدة البيانات في كتل "حاول إلا"، مع توفير رسائل خطأ مفيدة للمستخدمين عند فشل شيء ما. بالنسبة للمشكلات المتعلقة بالشبكة، يمكن أن يساعد تنفيذ عمليات إعادة المحاولة مع إعادة التشغيل الأسية في التعامل مع مواطن الخلل المؤقتة بأمان.

+

أما بالنسبة للتسجيل، فهو أفضل صديق لنا لتصحيح الأخطاء والمراقبة. يجب أن نستخدم وحدة تسجيل Python لتتبع الأحداث المهمة والأخطاء ومقاييس الأداء في تطبيقنا. لنقم بإعداد مستويات سجلات مختلفة - DEBUG للتطوير، و INFO للتشغيل العام، و ERROR للمشاكل الحرجة. ولا تنسَ تنفيذ تدوير السجل لإدارة أحجام الملفات. مع وجود السجل المناسب، سنتمكن من تحديد المشكلات وحلها بسرعة، مما يضمن تشغيل تطبيق البحث عن الفيديو بسلاسة حتى مع زيادة حجمه.

+

الخاتمة

تهانينا! لقد أنشأت الآن تطبيقًا قويًا للبحث عن الفيديو الدلالي باستخدام واجهة برمجة تطبيقات Twelve Labs Embed API و Milvus. يتيح لك هذا التكامل معالجة محتوى الفيديو وتخزينه واسترجاعه بدقة وكفاءة غير مسبوقة. وبالاستفادة من التضمينات متعددة الوسائط، تكون قد أنشأت نظامًا يفهم الفروق الدقيقة في بيانات الفيديو، مما يفتح لك إمكانيات مثيرة لاكتشاف المحتوى وأنظمة التوصيات وتحليلات الفيديو المتقدمة.

+

بينما تستمر في تطوير تطبيقك وتحسينه، تذكّر أن الجمع بين توليد التضمين المتقدم من Twelve Labs والتخزين المتجه القابل للتطوير من Milvus يوفر أساسًا قويًا لمعالجة تحديات فهم الفيديو الأكثر تعقيدًا. نحن نشجعك على تجربة الميزات المتقدمة التي تمت مناقشتها وتخطي حدود الممكن في البحث عن الفيديو وتحليله.

diff --git a/localization/v2.5.x/site/ar/menuStructure/ar.json b/localization/v2.5.x/site/ar/menuStructure/ar.json new file mode 100644 index 000000000..38a70d8c1 --- /dev/null +++ b/localization/v2.5.x/site/ar/menuStructure/ar.json @@ -0,0 +1,2196 @@ +[ + { + "label": "نبذة عن ميلفوس", + "id": "about", + "isMenu": true, + "order": 0, + "children": [ + { + "label": "ما هو ميلفوس", + "id": "overview.md", + "order": 0, + "children": [] + }, + { + "label": "متبنو ميلفوس", + "id": "milvus_adopters.md", + "order": 1, + "children": [] + }, + { + "label": "خريطة طريق ميلفوس", + "id": "roadmap.md", + "order": 2, + "children": [] + }, + { + "label": "الإصدارات", + "id": "release_notes.md", + "order": 3, + "children": [] + }, + { + "label": "المعايير", + "id": "benchmark.md", + "order": 4, + "children": [] + }, + { + "label": "المقارنة", + "id": "comparison.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "ابدأ الآن", + "id": "getstarted", + "isMenu": true, + "order": 1, + "children": [ + { + "label": "البداية سريعة", + "id": "quickstart.md", + "order": 0, + "children": [] + }, + { + "label": "تثبيت ميلفوس", + "id": "install_milvus", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "install-overview.md", + "order": 0, + "children": [] + }, + { + "label": "تشغيل ميلفوس لايت", + "id": "milvus_lite.md", + "order": 1, + "children": [] + }, + { + "label": "تشغيل ميلفوس ستاندالون", + "id": "run_milvus_docker", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "المتطلبات", + "id": "prerequisite-docker.md", + "order": 0, + "children": [] + }, + { + "label": "دوكر (لينكس)", + "id": "install_standalone-docker.md", + "order": 1, + "children": [] + }, + { + "label": "تكوين Docker Compose (لينكس)", + "id": "install_standalone-docker-compose.md", + "order": 2, + "children": [] + }, + { + "label": "سطح المكتب Docker Desktop (ويندوز)", + "id": "install_standalone-windows.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "تشغيل ميلفوس الموزعة", + "id": "run_milvus_k8s", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "المتطلبات", + "id": "prerequisite-helm.md", + "order": 0, + "children": [] + }, + { + "label": "مشغل ميلفوس", + "id": "install_cluster-milvusoperator.md", + "order": 1, + "children": [] + }, + { + "label": "مخطط الدفة", + "id": "install_cluster-helm.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "تشغيل Milvus مع وحدة معالجة الرسومات", + "id": "run_milvus_gpu", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "المتطلبات", + "id": "prerequisite-gpu.md", + "order": 0, + "children": [] + }, + { + "label": "مخطط الدفة", + "id": "install_cluster-helm-gpu.md", + "order": 1, + "children": [] + }, + { + "label": "تركيب Docker Compose", + "id": "install_standalone-docker-compose-gpu.md", + "order": 2, + "children": [] + } + ] + } + ] + }, + { + "label": "تثبيت SDKs", + "id": "install_sdks", + "order": 2, + "children": [ + { + "label": "باي ميلفوس", + "id": "install-pymilvus.md", + "order": 0, + "children": [] + }, + { + "label": "جافا SDK", + "id": "install-java.md", + "order": 1, + "children": [] + }, + { + "label": "اذهب إلى SDK", + "id": "install-go.md", + "order": 2, + "children": [] + }, + { + "label": "مجموعة تطوير البرمجيات SDK لـ Node.js", + "id": "install-node.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "المفاهيم", + "id": "concepts", + "isMenu": true, + "order": 2, + "children": [ + { + "label": "الهندسة المعمارية", + "id": "architecture", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "architecture_overview.md", + "order": 0, + "children": [] + }, + { + "label": "التخزين/الحوسبة", + "id": "four_layers.md", + "order": 1, + "children": [] + }, + { + "label": "المكونات الرئيسية", + "id": "main_components.md", + "order": 2, + "children": [] + }, + { + "label": "معالجة البيانات", + "id": "data_processing.md", + "order": 3, + "children": [] + }, + { + "label": "تعرف في أي مكان", + "id": "knowhere.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "بيتسيت", + "id": "bitset.md", + "order": 1, + "children": [] + }, + { + "label": "الإيجارات المتعددة", + "id": "multi_tenancy.md", + "order": 3, + "children": [] + }, + { + "label": "الطابع الزمني", + "id": "timestamp.md", + "order": 4, + "children": [] + }, + { + "label": "مزامنة الوقت", + "id": "time_sync.md", + "order": 6, + "children": [] + }, + { + "label": "مؤشر المتجهات", + "id": "vector_index", + "order": 7, + "isMenu": true, + "children": [ + { + "label": "الفهرس داخل الذاكرة", + "id": "index.md", + "order": 0, + "children": [] + }, + { + "label": "الفهرس على القرص", + "id": "disk_index.md", + "order": 1, + "children": [] + }, + { + "label": "فهرس وحدة معالجة الرسومات", + "id": "gpu_index.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "المؤشر القياسي", + "id": "scalar_index.md", + "order": 8, + "children": [] + }, + { + "label": "الأنواع المترية", + "id": "metric.md", + "order": 9, + "children": [] + }, + { + "label": "مستوى الاتساق", + "id": "consistency.md", + "order": 10, + "children": [] + }, + { + "label": "النسخ المتماثل داخل الذاكرة", + "id": "replica.md", + "order": 11, + "children": [] + }, + { + "label": "المصطلحات", + "id": "glossary.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "دليل المستخدم", + "id": "userguide", + "isMenu": true, + "order": 3, + "children": [ + { + "label": "قاعدة البيانات", + "id": "manage_databases.md", + "order": 0, + "children": [] + }, + { + "label": "المجموعات", + "id": "collections", + "order": 1, + "children": [ + { + "label": "شرح المجموعة", + "id": "manage-collections.md", + "order": 0, + "children": [] + }, + { + "label": "إنشاء مجموعة", + "id": "create-collection.md", + "order": 1, + "children": [] + }, + { + "label": "إنشاء المجموعة على الفور", + "id": "create-collection-instantly.md", + "order": 2, + "children": [] + }, + { + "label": "عرض المجموعات", + "id": "view-collections.md", + "order": 3, + "children": [] + }, + { + "label": "تعديل المجموعة", + "id": "modify-collection.md", + "order": 4, + "children": [] + }, + { + "label": "التحميل والتحرير", + "id": "load-and-release.md", + "order": 5, + "children": [] + }, + { + "label": "إدارة الأقسام", + "id": "manage-partitions.md", + "order": 6, + "children": [] + }, + { + "label": "إدارة الأسماء المستعارة", + "id": "manage-aliases.md", + "order": 7, + "children": [] + }, + { + "label": "مجموعة القطرات", + "id": "drop-collection.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "المخطط وحقول البيانات", + "id": "schema", + "order": 2, + "children": [ + { + "label": "شرح المخطط", + "id": "schema.md", + "order": 0, + "children": [] + }, + { + "label": "الحقل الأساسي والمعرف التلقائي", + "id": "primary-field.md", + "order": 1, + "children": [] + }, + { + "label": "متجه كثيف", + "id": "dense-vector.md", + "order": 2, + "children": [] + }, + { + "label": "متجه ثنائي", + "id": "binary-vector.md", + "order": 3, + "children": [] + }, + { + "label": "متجه متناثر", + "id": "sparse_vector.md", + "order": 4, + "children": [] + }, + { + "label": "حقل الأوتار", + "id": "string.md", + "order": 5, + "children": [] + }, + { + "label": "حقل الأرقام", + "id": "number.md", + "order": 6, + "children": [] + }, + { + "label": "حقل JSON", + "id": "use-json-fields.md", + "order": 7, + "children": [] + }, + { + "label": "حقل المصفوفة", + "id": "array_data_type.md", + "order": 8, + "children": [] + }, + { + "label": "المجال الديناميكي", + "id": "enable-dynamic-field.md", + "order": 9, + "children": [] + }, + { + "label": "قابل للإلغاء والافتراضي", + "id": "nullable-and-default.md", + "order": 10, + "children": [] + }, + { + "label": "المحلل", + "id": "analyzer", + "order": 11, + "children": [ + { + "label": "نظرة عامة على المحلل", + "id": "analyzer-overview.md", + "order": 0, + "children": [] + }, + { + "label": "أجهزة تحليل مدمجة", + "id": "built-in-analyzers", + "order": 1, + "children": [ + { + "label": "قياسي", + "id": "standard-analyzer.md", + "order": 0, + "children": [] + }, + { + "label": "اللغة الإنجليزية", + "id": "english-analyzer.md", + "order": 1, + "children": [] + }, + { + "label": "صيني", + "id": "chinese-analyzer.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "التوكنات", + "id": "tokenizers", + "order": 2, + "children": [ + { + "label": "قياسي", + "id": "standard-tokenizer.md", + "order": 0, + "children": [] + }, + { + "label": "وايت سبيس", + "id": "whitespace-tokenizer.md", + "order": 1, + "children": [] + }, + { + "label": "جيبا", + "id": "jieba-tokenizer.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "الفلاتر", + "id": "filters", + "order": 3, + "children": [ + { + "label": "الأحرف الصغيرة", + "id": "lowercase-filter.md", + "order": 0, + "children": [] + }, + { + "label": "طي ASCII", + "id": "ascii-folding-filter.md", + "order": 1, + "children": [] + }, + { + "label": "ألفانوم فقط", + "id": "alphanumonly-filter.md", + "order": 2, + "children": [] + }, + { + "label": "جنالفانوم فقط", + "id": "cnalphanumonly-filter.md", + "order": 3, + "children": [] + }, + { + "label": "سنشارونلي", + "id": "cncharonly-filter.md", + "order": 4, + "children": [] + }, + { + "label": "الطول", + "id": "length-filter.md", + "order": 5, + "children": [] + }, + { + "label": "توقف", + "id": "stop-filter.md", + "order": 6, + "children": [] + }, + { + "label": "مُفكِّك العظام", + "id": "decompounder-filter.md", + "order": 7, + "children": [] + }, + { + "label": "ستيمير", + "id": "stemmer-filter.md", + "order": 8, + "children": [] + } + ] + } + ] + }, + { + "label": "التدريب العملي", + "id": "schema-hands-on.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "إدراج وحذف", + "id": "insert-and-delete", + "order": 3, + "children": [ + { + "label": "إدراج الكيانات", + "id": "insert-update-delete.md", + "order": 0, + "children": [] + }, + { + "label": "كيانات Upsert", + "id": "upsert-entities.md", + "order": 1, + "children": [] + }, + { + "label": "حذف الكيانات", + "id": "delete-entities.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "الفهارس", + "id": "manage_indexes", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "فهارس المتجهات", + "id": "index-vector-fields.md", + "order": 0, + "children": [] + }, + { + "label": "الفهارس العددية", + "id": "scalar-index", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "فهرس الحقول العددية", + "id": "index-scalar-fields.md", + "order": 1, + "children": [] + }, + { + "label": "فهرس الصور النقطية", + "id": "bitmap.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "الفهارس الممكّنة لوحدة معالجة الرسومات", + "id": "index-with-gpu.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "البحث وإعادة التصنيف", + "id": "search-rerank", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "بحث ANN الأساسي", + "id": "single-vector-search.md", + "order": 0, + "children": [] + }, + { + "label": "بحث مصفى", + "id": "filtered-search.md", + "order": 1, + "children": [] + }, + { + "label": "البحث عن النطاق", + "id": "range-search.md", + "order": 2, + "children": [] + }, + { + "label": "تجميع البحث عن المجموعات", + "id": "grouping-search.md", + "order": 3, + "children": [] + }, + { + "label": "البحث الهجين", + "id": "multi-vector-search.md", + "order": 4, + "children": [] + }, + { + "label": "استعلام", + "id": "get-and-scalar-query.md", + "order": 5, + "children": [] + }, + { + "label": "التصفية", + "id": "filtering", + "order": 6, + "children": [ + { + "label": "شرح التصفية", + "id": "boolean.md", + "order": 0, + "children": [] + }, + { + "label": "المشغلون الأساسيون", + "id": "basic-operators.md", + "order": 1, + "children": [] + }, + { + "label": "تصفية القوالب النمذجة", + "id": "filtering-templating.md", + "order": 2, + "children": [] + }, + { + "label": "مشغلات JSON", + "id": "json-operators.md", + "order": 3, + "children": [] + }, + { + "label": "مشغلات المصفوفات", + "id": "array-operators.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "البحث في النص الكامل", + "id": "full-text-search.md", + "order": 7, + "children": [] + }, + { + "label": "تطابق النص", + "id": "keyword-match.md", + "order": 8, + "children": [] + }, + { + "label": "مكرر البحث", + "id": "with-iterators.md", + "order": 9, + "children": [] + }, + { + "label": "استخدام مفتاح التقسيم", + "id": "use-partition-key.md", + "order": 9, + "children": [] + }, + { + "label": "إعادة التصنيف", + "id": "reranking.md", + "order": 10, + "children": [] + } + ] + } + ] + }, + { + "label": "النماذج", + "id": "models", + "isMenu": true, + "order": 4, + "children": [ + { + "label": "التضمينات", + "id": "embeddings", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "embeddings.md", + "order": 0, + "children": [] + }, + { + "label": "OpenAI", + "id": "embed-with-openai.md", + "order": 1, + "children": [] + }, + { + "label": "محولات الجمل", + "id": "embed-with-sentence-transform.md", + "order": 2, + "children": [] + }, + { + "label": "BGE M3", + "id": "embed-with-bgm-m3.md", + "order": 3, + "children": [] + }, + { + "label": "SPLADE", + "id": "embed-with-splade.md", + "order": 5, + "children": [] + }, + { + "label": "رحلة", + "id": "embed-with-voyage.md", + "order": 6, + "children": [] + }, + { + "label": "جينا للذكاء الاصطناعي", + "id": "embed-with-jina.md", + "order": 7, + "children": [] + }, + { + "label": "كوهير", + "id": "embed-with-cohere.md", + "order": 8, + "children": [] + }, + { + "label": "مدرس", + "id": "embed-with-instructor.md", + "order": 9, + "children": [] + }, + { + "label": "ميسترال للذكاء الاصطناعي", + "id": "embed-with-mistral-ai.md", + "order": 10, + "children": [] + }, + { + "label": "نوميكس", + "id": "embed-with-nomic.md", + "order": 11, + "children": [] + }, + { + "label": "mGTE", + "id": "embed-with-mgte.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "معيدو التصنيف", + "id": "rerankers", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "rerankers-overview.md", + "order": 0, + "children": [] + }, + { + "label": "BGE", + "id": "rerankers-bge.md", + "order": 1, + "children": [] + }, + { + "label": "كوهير", + "id": "rerankers-cohere.md", + "order": 2, + "children": [] + }, + { + "label": "التشفير المتقاطع", + "id": "rerankers-cross-encoder.md", + "order": 3, + "children": [] + }, + { + "label": "رحلة", + "id": "rerankers-voyage.md", + "order": 4, + "children": [] + }, + { + "label": "جينا للذكاء الاصطناعي", + "id": "rerankers-jina.md", + "order": 5, + "children": [] + } + ] + } + ] + }, + { + "label": "استيراد البيانات", + "id": "data_import", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "إعداد بيانات المصدر", + "id": "prepare-source-data.md", + "order": 0, + "children": [] + }, + { + "label": "استيراد البيانات", + "id": "import-data.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "هجرة ميلفوس", + "id": "milvus_migration", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "لمحة عامة", + "id": "migrate_overview.md", + "order": 0, + "children": [] + }, + { + "label": "تثبيت أداة الترحيل", + "id": "milvusdm_install.md", + "order": 1, + "children": [] + }, + { + "label": "من Elasticsearch", + "id": "es2m.md", + "order": 2, + "children": [] + }, + { + "label": "من فايس", + "id": "f2m.md", + "order": 3, + "children": [] + }, + { + "label": "من ميلفوس 1.x", + "id": "m2m.md", + "order": 4, + "children": [] + }, + { + "label": "من Milvus 2.3.x", + "id": "from-m2x.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "دليل الإدارة", + "id": "admin_guide", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "النشر", + "id": "deployment", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "في أماكن العمل", + "id": "on_premises", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "مع Docker", + "id": "configure-docker.md", + "order": 0, + "children": [] + }, + { + "label": "مع هيلم", + "id": "configure-helm.md", + "order": 1, + "children": [] + }, + { + "label": "مع مشغل ميلفوس", + "id": "configure_operator.md", + "order": 2, + "children": [] + }, + { + "label": "تخصيص الموارد", + "id": "allocate.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "على السحب", + "id": "on_cloud", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "النشر على AWS", + "id": "eks.md", + "order": 1, + "children": [] + }, + { + "label": "النشر على GCP", + "id": "gcp.md", + "order": 2, + "children": [] + }, + { + "label": "النشر على Azure", + "id": "azure.md", + "order": 3, + "children": [] + }, + { + "label": "النشر على OpenShift", + "id": "openshift.md", + "order": 4, + "children": [] + }, + { + "label": "موازنة التحميل من الطبقة 7", + "id": "layer-7-lb", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "aws_layer7.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcp_layer7.md", + "order": 2, + "children": [] + }, + { + "label": "أزور", + "id": "ingress.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "التخزين السحابي", + "id": "cloud-storage", + "order": 6, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "s3.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcs.md", + "order": 2, + "children": [] + }, + { + "label": "أزور", + "id": "abs.md", + "order": 3, + "children": [] + } + ] + } + ] + } + ] + }, + { + "label": "التكوين", + "id": "configuration", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "تكوينات النظام", + "id": "system_configuration.md", + "order": 0, + "children": [] + }, + { + "label": "على الطاير", + "id": "dynamic_config.md", + "order": 1, + "children": [] + }, + { + "label": "الحد من عدد مرات التحصيل", + "id": "limit_collection_counts.md", + "order": 2, + "children": [] + }, + { + "label": "تكوين ذاكرة التخزين المؤقت للقطع المقطوعة", + "id": "chunk_cache.md", + "order": 3, + "children": [] + }, + { + "label": "المنسق هـ أ", + "id": "coordinator_ha.md", + "order": 4, + "children": [] + }, + { + "label": "عقدة الاستعلام باستخدام القرص المحلي", + "id": "configure-querynode-localdisk.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "إدارة التبعيات", + "id": "manage_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "مع Docker أو Helm", + "id": "docker_helm_dependencies", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "تخزين الكائنات", + "id": "deploy_s3.md", + "order": 0, + "children": [] + }, + { + "label": "تخزين ميتا", + "id": "deploy_etcd.md", + "order": 1, + "children": [] + }, + { + "label": "تخزين الرسائل", + "id": "deploy_pulsar.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "مع مشغل ميلفوس", + "id": "milvus_operator_dependencies", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "تخزين الكائنات", + "id": "object_storage_operator.md", + "order": 0, + "children": [] + }, + { + "label": "تخزين ميتا", + "id": "meta_storage_operator.md", + "order": 1, + "children": [] + }, + { + "label": "تخزين الرسائل", + "id": "message_storage_operator.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "استخدم بولسّا مع ميلفوس", + "id": "pulsar_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "الترقية إلى Pulsar v3", + "id": "upgrade-pulsar-v3.md", + "order": 0, + "children": [] + }, + { + "label": "متابعة استخدام Pulsar v2", + "id": "use-pulsar-v2.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "التحجيم", + "id": "scaling", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "مجموعة المقاييس", + "id": "scaleout.md", + "order": 0, + "children": [] + }, + { + "label": "تبعيات المقياس", + "id": "scale-dependencies.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "الترقية", + "id": "upgrade_milvus", + "order": 7, + "children": [ + { + "label": "ترقية مجموعة ميلفوس العنقودية", + "id": "upgrade_milvus_cluster-operator.md", + "order": 0, + "children": [] + }, + { + "label": "ترقية ميلفوس ستاندالون", + "id": "upgrade_milvus_standalone-operator.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "المراقبة والتنبيهات والسجلات", + "id": "monitor_alert_log", + "order": 8, + "isMenu": true, + "children": [ + { + "label": "الرصد", + "id": "monitoring", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "الهندسة المعمارية", + "id": "monitor_overview.md", + "order": 0, + "children": [] + }, + { + "label": "نشر خدمات المراقبة", + "id": "monitor.md", + "order": 1, + "children": [] + }, + { + "label": "تصور المقاييس", + "id": "visualize.md", + "order": 2, + "children": [] + }, + { + "label": "لوحة قياس ميلفوس ميتركس", + "id": "metrics_dashboard.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "تنبيهات", + "id": "alerts", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "إنشاء تنبيه", + "id": "alert.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "السجلات", + "id": "logs", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "تكوين جرافانا لوكي", + "id": "configure_grafana_loki.md", + "order": 0, + "children": [] + }, + { + "label": "تكوين سجلات الوصول", + "id": "configure_access_logs.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "التتبع", + "id": "trace", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "تتبع جايجر", + "id": "config_jaeger_tracing.md", + "order": 0, + "children": [] + } + ] + } + ] + }, + { + "label": "مجموعات الموارد", + "id": "resource_groups", + "order": 9, + "children": [ + { + "label": "إدارة مجموعات الموارد", + "id": "resource_group.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "تحسين التخزين", + "id": "storage_optimization", + "order": 10, + "isMenu": true, + "children": [ + { + "label": "استخدام mmap", + "id": "mmap.md", + "order": 0, + "children": [] + }, + { + "label": "ضغط التكتلات", + "id": "clustering-compaction.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "الأمن", + "id": "security", + "order": 11, + "isMenu": true, + "children": [ + { + "label": "تمكين المصادقة", + "id": "authenticate.md", + "order": 0, + "children": [] + }, + { + "label": "المستخدمون والامتيازات والأدوار", + "id": "users_and_roles.md", + "order": 10, + "children": [] + }, + { + "label": "تمكين RBAC", + "id": "rbac.md", + "order": 1, + "isMenu": true, + "children": [] + }, + { + "label": "التشفير أثناء النقل", + "id": "tls.md", + "order": 2, + "children": [] + }, + { + "label": "الاتصال بكافكا باستخدام SASL/SSL", + "id": "connect_kafka_ssl.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "ميلفوس ويب يويو (Milvus WebUI)", + "id": "milvus-webui.md", + "order": "12", + "children": [] + } + ] + }, + { + "label": "الأدوات", + "id": "tools", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "أتو (واجهة المستخدم الرسومية لميلفوس)", + "id": "milvus_attu", + "order": 0, + "externalLink": "https://github.com/zilliztech/attu", + "children": [] + }, + { + "label": "النسخ الاحتياطي ميلفوس", + "id": "milvus_backup", + "order": 1, + "children": [ + { + "label": "لمحة عامة", + "id": "milvus_backup_overview.md", + "order": 0, + "children": [] + }, + { + "label": "الأوامر", + "id": "milvus_backup_cli.md", + "order": 1, + "children": [] + }, + { + "label": "واجهة برمجة تطبيقات RESTful API", + "id": "milvus_backup_api.md", + "order": 2, + "children": [] + }, + { + "label": "الحالات الشائعة", + "id": "common-cases", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "الترحيل بين المثيلات في دلو واحد", + "id": "shared-bucket-backup-and-restore.md", + "order": 0, + "children": [] + }, + { + "label": "الترحيل بين المثيلات عبر الدلاء", + "id": "cross-bucket-backup-and-restore.md", + "order": 1, + "children": [] + }, + { + "label": "الترحيل بين المثيلات عبر بيئات S3", + "id": "multi-storage-backup-and-restore.md", + "order": 2, + "children": [] + }, + { + "label": "النسخ الاحتياطي والاستعادة في مثيل واحد", + "id": "single-instance-backup-and-restore.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "مراقب الطيور", + "id": "birdwatcher", + "order": 2, + "children": [ + { + "label": "لمحة عامة", + "id": "birdwatcher_overview.md", + "order": 0, + "children": [] + }, + { + "label": "أدلة التثبيت", + "id": "birdwatcher_install_guides.md", + "order": 1, + "children": [] + }, + { + "label": "أدلة الاستخدام", + "id": "birdwatcher_usage_guides.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "ميلفوس CDC", + "id": "milvus_cdc", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "milvus-cdc-overview.md", + "order": 0, + "children": [] + }, + { + "label": "نشر خادم CDC", + "id": "deploy-cdc-server.md", + "order": 1, + "children": [] + }, + { + "label": "إدارة مهام مركز مكافحة الأمراض والوقاية منها", + "id": "manage-cdc-tasks.md", + "order": 2, + "children": [] + }, + { + "label": "الرصد", + "id": "cdc-monitoring.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "ميلفوس CLI", + "id": "cli", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "لمحة عامة", + "id": "cli_overview.md", + "order": 0, + "children": [] + }, + { + "label": "التركيب", + "id": "install_cli.md", + "order": 1, + "children": [] + }, + { + "label": "الأوامر", + "id": "cli_commands.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "موصلات ميلفوس", + "id": "milvus_connectors", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "سبارك", + "id": "integrate_with_spark.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "أداة التحجيم ميلفوس", + "id": "sizing", + "order": 6, + "externalLink": "https://milvus.io/tools/sizing/", + "children": [] + }, + { + "label": "عميل باورشيل ميلفوس", + "id": "milvus_powershell", + "order": 8, + "externalLink": "https://github.com/rrg92/ps-milvus/blob/main/docs/integrate_powershell.md", + "children": [] + } + ] + }, + { + "label": "عمليات الدمج", + "id": "integrations", + "isMenu": true, + "order": 8, + "children": [ + { + "label": "لمحة عامة", + "id": "integrations_overview.md", + "order": 0, + "children": [] + }, + { + "label": "تضمين النماذج", + "id": "integrate-embeddings-models", + "order": 1, + "children": [ + { + "label": "OpenAI", + "id": "integrate_with_openai.md", + "order": 0, + "children": [] + }, + { + "label": "كوهير", + "id": "integrate_with_cohere.md", + "order": 1, + "children": [] + }, + { + "label": "عناق الوجه", + "id": "integrate_with_hugging-face.md", + "order": 2, + "children": [] + }, + { + "label": "باي تورتش", + "id": "integrate_with_pytorch.md", + "order": 3, + "children": [] + }, + { + "label": "محولات الجمل", + "id": "integrate_with_sentencetransformers.md", + "order": 4, + "children": [] + }, + { + "label": "VoyageAI", + "id": "integrate_with_voyageai.md", + "order": 8, + "children": [] + }, + { + "label": "جينا للذكاء الاصطناعي", + "id": "integrate_with_jina.md", + "order": 11, + "children": [] + }, + { + "label": "اثنا عشر مختبراً", + "id": "video_search_with_twelvelabs_and_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "بينتو مل", + "id": "integrate_with_bentoml.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "الماجستير في القانون", + "id": "integrate-llms", + "order": 2, + "children": [ + { + "label": "vLLM", + "id": "milvus_rag_with_vllm.md", + "order": 0, + "children": [] + }, + { + "label": "ميسترال للذكاء الاصطناعي", + "id": "llama_agents_metadata.md", + "order": 1, + "children": [] + }, + { + "label": "الألعاب النارية", + "id": "build_RAG_with_milvus_and_fireworks.md", + "order": 2, + "children": [] + }, + { + "label": "ليبتون", + "id": "build_RAG_with_milvus_and_lepton.md", + "order": 3, + "children": [] + }, + { + "label": "سيليكون فلو", + "id": "build_RAG_with_milvus_and_siliconflow.md", + "order": 4, + "children": [] + }, + { + "label": "سامبا نوفا", + "id": "use_milvus_with_sambanova.md", + "order": 5, + "children": [] + }, + { + "label": "الجوزاء", + "id": "build_RAG_with_milvus_and_gemini.md", + "order": 6, + "children": [] + }, + { + "label": "أولاما", + "id": "build_RAG_with_milvus_and_ollama.md", + "order": 7, + "children": [] + }, + { + "label": "ديبسيك", + "id": "build_RAG_with_milvus_and_deepseek.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "التنسيق", + "id": "orchestrate-with-milvus", + "order": 3, + "children": [ + { + "label": "لانجتشين", + "id": "langchain", + "order": 0, + "children": [ + { + "label": "الاستخدام الأساسي", + "id": "basic_usage_langchain.md", + "order": 1, + "children": [] + }, + { + "label": "RAG", + "id": "integrate_with_langchain.md", + "order": 2, + "children": [] + }, + { + "label": "البحث الهجين", + "id": "milvus_hybrid_search_retriever.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "لاما إندكس", + "id": "llamaindex", + "order": 1, + "children": [ + { + "label": "RAG", + "id": "integrate_with_llamaindex.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "DSPy", + "id": "integrate_with_dspy.md", + "order": 2, + "children": [] + }, + { + "label": "FastGPT", + "id": "integrate_with_fastgpt.md", + "order": 3, + "children": [] + }, + { + "label": "هاي ستاك", + "id": "integrate_with_haystack.md", + "order": 4, + "children": [] + }, + { + "label": "كوتيمون", + "id": "kotaemon_with_milvus.md", + "order": 5, + "children": [] + }, + { + "label": "ديفي", + "id": "dify_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "لانجفلو", + "id": "rag_with_langflow.md", + "order": 7, + "children": [] + }, + { + "label": "DocsGPT", + "id": "use_milvus_in_docsgpt.md", + "order": 9, + "children": [] + }, + { + "label": "برايفتGPT", + "id": "use_milvus_in_private_gpt.md", + "order": 10, + "children": [] + }, + { + "label": "ديناميك", + "id": "milvus_rag_with_dynamiq.md", + "order": 11, + "children": [] + } + ] + }, + { + "label": "الوكلاء", + "id": "integrate-agents", + "order": 4, + "children": [ + { + "label": "ميمغبت", + "id": "integrate_with_memgpt.md", + "order": 0, + "children": [] + }, + { + "label": "الجمل", + "id": "integrate_with_camel.md", + "order": 1, + "children": [] + }, + { + "label": "ميم0", + "id": "quickstart_mem0_with_milvus.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "هندسة المعرفة", + "id": "knowledge-engineering", + "order": 5, + "children": [ + { + "label": "لماذا كيف", + "id": "integrate_with_whyhow.md", + "order": 0, + "children": [] + }, + { + "label": "فانا", + "id": "integrate_with_vanna.md", + "order": 1, + "children": [] + }, + { + "label": "جدول المعرفة", + "id": "knowledge_table_with_milvus.md", + "order": 2, + "children": [] + }, + { + "label": "كوجني", + "id": "build_RAG_with_milvus_and_cognee.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "التقييم والملاحظة", + "id": "evaluation-observability", + "order": 6, + "children": [ + { + "label": "راجاس", + "id": "integrate_with_ragas.md", + "order": 0, + "children": [] + }, + { + "label": "لانجفيوز", + "id": "integrate_with_langfuse.md", + "order": 1, + "children": [] + }, + { + "label": "واحد وخمسون", + "id": "integrate_with_voxel51.md", + "order": 2, + "children": [] + }, + { + "label": "أريز فيونيكس", + "id": "evaluation_with_phoenix.md", + "order": 3, + "children": [] + }, + { + "label": "ديب إيفال", + "id": "evaluation_with_deepeval.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "مصادر البيانات", + "id": "data-sources", + "order": 7, + "children": [ + { + "label": "أيربايت", + "id": "integrate_with_airbyte.md", + "order": 0, + "children": [] + }, + { + "label": "كافكا", + "id": "kafka-connect-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "أبيفي", + "id": "apify_milvus_rag.md", + "order": 2, + "children": [] + }, + { + "label": "غير منظم", + "id": "rag_with_milvus_and_unstructured.md", + "order": 3, + "children": [] + }, + { + "label": "قناع PII Masker", + "id": "RAG_with_pii_and_milvus.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "أخرى", + "id": "other-integrations", + "order": 8, + "children": [ + { + "label": "ندفة الثلج", + "id": "integrate_with_snowpark.md", + "order": 0, + "children": [] + }, + { + "label": "الذراع", + "id": "build_rag_on_arm.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "البرامج التعليمية", + "id": "tutorials", + "isMenu": true, + "order": 7, + "children": [ + { + "label": "لمحة عامة", + "id": "tutorials-overview.md", + "order": 0, + "children": [] + }, + { + "label": "بناء RAG مع ميلفوس", + "id": "build-rag-with-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "RAG المتقدم", + "id": "how_to_enhance_your_rag.md", + "order": 2, + "children": [] + }, + { + "label": "البحث عن النص الكامل مع ميلفوس", + "id": "full_text_search_with_milvus.md", + "order": 3, + "children": [] + }, + { + "label": "البحث الهجين مع ميلفوس", + "id": "hybrid_search_with_milvus.md", + "order": 4, + "children": [] + }, + { + "label": "البحث عن الصور مع ميلفوس", + "id": "image_similarity_search.md", + "order": 5, + "children": [] + }, + { + "label": "الوسائط المتعددة RAG", + "id": "multimodal_rag_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "الرسم البياني RAG مع ميلفوس", + "id": "graph_rag_with_milvus.md", + "order": 7, + "children": [] + }, + { + "label": "الاسترجاع السياقي", + "id": "contextual_retrieval_with_milvus.md", + "order": 8, + "children": [] + }, + { + "label": "تجميع HDBSCAN", + "id": "hdbscan_clustering_with_milvus.md", + "order": 9, + "children": [] + }, + { + "label": "استخدام كولبالي للاسترجاع متعدد الوسائط", + "id": "use_ColPali_with_milvus.md", + "order": 10, + "children": [] + }, + { + "label": "التصور المتجهي", + "id": "vector_visualization.md", + "order": 11, + "children": [] + }, + { + "label": "توصية فيلم", + "id": "movie_recommendation_with_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "البحث القمعي باستخدام تضمينات ماتريوشكا", + "id": "funnel_search_with_matryoshka.md", + "order": 13, + "children": [] + }, + { + "label": "البدء السريع مع أتو", + "id": "quickstart_with_attu.md", + "order": 14, + "children": [] + }, + { + "label": "استخدام AsyncMilvusClient مع asyncio", + "id": "use-async-milvus-client-with-asyncio.md", + "order": 15, + "children": [] + }, + { + "label": "اكتشف المزيد", + "id": "explore-more", + "order": 99, + "children": [ + { + "label": "نظام الإجابة على الأسئلة", + "id": "question_answering_system.md", + "order": 5, + "children": [] + }, + { + "label": "نظام التوصية", + "id": "recommendation_system.md", + "order": 6, + "children": [] + }, + { + "label": "البحث عن تشابه الفيديو", + "id": "video_similarity_search.md", + "order": 7, + "children": [] + }, + { + "label": "البحث عن تشابه الصوت", + "id": "audio_similarity_search.md", + "order": 8, + "children": [] + }, + { + "label": "تصنيف تسلسل الحمض النووي", + "id": "dna_sequence_classification.md", + "order": 9, + "children": [] + }, + { + "label": "محرك البحث عن النص", + "id": "text_search_engine.md", + "order": 10, + "children": [] + }, + { + "label": "محرك البحث عن النص إلى صورة", + "id": "text_image_search.md", + "order": 11, + "children": [] + }, + { + "label": "نظام إلغاء تكرار الصور", + "id": "image_deduplication_system.md", + "order": 12, + "children": [] + } + ] + } + ] + }, + { + "label": "الأسئلة الشائعة", + "id": "faq", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "الأسئلة الشائعة حول الأداء", + "id": "performance_faq.md", + "order": 0, + "children": [] + }, + { + "label": "الأسئلة الشائعة حول المنتج", + "id": "product_faq.md", + "order": 1, + "children": [] + }, + { + "label": "الأسئلة الشائعة التشغيلية", + "id": "operational_faq.md", + "order": 2, + "children": [] + }, + { + "label": "حدود ميلفوس", + "id": "limitations.md", + "order": 3, + "children": [] + }, + { + "label": "استكشاف الأخطاء وإصلاحها", + "id": "troubleshooting.md", + "order": 4, + "children": [] + } + ] + } +] \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/es2m.json b/localization/v2.5.x/site/ar/migrate/es2m.json new file mode 100644 index 000000000..14c67290f --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/es2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n workMode: \"elasticsearch\" # operational mode of the migration job.\n reader:\n bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.\nmeta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.\n mode: \"config\" # specifies the source for meta configs. currently, onlly `config` is supported.\n version: \"8.9.1\"\n index: \"qatest_index\" # identifies the Elasticsearch index to migrate data from.\n fields: # fields within the Elasticsearch index to be migrated.\n - name: \"my_vector\" # name of the Elasticsearch field.\n type: \"dense_vector\" # data type of the Elasticsearch field.\n dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.\n - name: \"id\"\n pk: true # specifies if the field serves as a primary key.\n type: \"long\"\n - name: \"num\"\n type: \"integer\"\n - name: \"double1\"\n type: \"double\"\n - name: \"text1\"\n maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.\n type: \"text\"\n - name: \"bl1\"\n type: \"boolean\"\n - name: \"float1\"\n type: \"float\"\n milvus: # configs specific to creating the collection in Milvus 2.x\n collection: \"Collection_01\" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.\n closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.\n shardNum: 2 # number of shards to be created in the collection.\n consistencyLevel: Strong # consistency level for Milvus collection.\nsource: # connection configs for the source Elasticsearch server\n es:\n urls:\n - \"http://10.15.1.***:9200\" # address of the source Elasticsearch server.\n username: \"\" # username for the Elasticsearch server.\n password: \"\" # password for the Elasticsearch server.\ntarget:\n mode: \"remote\" # storage location for dumped files. valid values: `remote` and `local`.\n remote: # configs for remote storage\n outputDir: \"migration/milvus/test\" # output directory path in the cloud storage bucket.\n cloud: \"aws\" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.\n region: \"us-west-2\" # region of the cloud storage; can be any value if using local Minio.\n bucket: \"zilliz-aws-us-****-*-********\" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.\n useIAM: true # whether to use an IAM Role for connection.\n checkBucket: false # checks if the specified bucket exists in the storage.\n milvus2x: # connection configs for the target Milvus 2.x server\n endpoint: \"http://10.102.*.**:19530\" # address of the target Milvus server.\n username: \"****\" # username for the Milvus 2.x server.\n password: \"******\" # password for the Milvus 2.x server.\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[task/load_base_task.go:94] [\"[LoadTasker] Dec Task Processing-------------->\"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[task/load_base_task.go:76] [\"[LoadTasker] Progress Task --------------->\"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[dbclient/cus_field_milvus2x.go:86] [\"[Milvus2x] begin to ShowCollectionRows\"]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static: \"] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static Total\"] [\"Total Collections\"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]\n[migration/es_starter.go:25] [\"[Starter] migration ES to Milvus finish!!!\"] [Cost=80.009174459]\n[starter/starter.go:106] [\"[Starter] Migration Success!\"] [Cost=80.00928425]\n[cleaner/remote_cleaner.go:27] [\"[Remote Cleaner] Begin to clean files\"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]\n[cmd/start.go:32] [\"[Cleaner] clean file success!\"]\n"],"headingContent":"From Elasticsearch","anchorList":[{"label":"من Elasticsearch","href":"From-Elasticsearch","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تكوين ملف الترحيل","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"بدء مهمة الترحيل","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"تحقق من النتيجة","href":"Verify-the-result","type":2,"isActive":false},{"label":"مرجع تعيين الحقل","href":"Field-mapping-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/es2m.md b/localization/v2.5.x/site/ar/migrate/es2m.md new file mode 100644 index 000000000..20deaa6e2 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/es2m.md @@ -0,0 +1,267 @@ +--- +id: es2m.md +summary: >- + يوفر هذا الدليل عملية شاملة وخطوة بخطوة لترحيل البيانات من Elasticsearch إلى + Milvus 2.x. +title: من Elasticsearch +--- +

من Elasticsearch

يوفر هذا الدليل عملية شاملة وخطوة بخطوة لترحيل البيانات من Elasticsearch إلى Milvus 2.x. باتباع هذا الدليل، ستتمكن من نقل بياناتك بكفاءة، والاستفادة من ميزات Milvus 2.x المتقدمة والأداء المحسّن.

+

المتطلبات الأساسية

+

تكوين ملف الترحيل

احفظ مثال ملف تهيئة الترحيل بصيغة migration.yaml وقم بتعديل التكوينات بناءً على ظروفك الفعلية. لك مطلق الحرية في وضع ملف التكوين في أي دليل محلي.

+
dumper: # configs for the migration job.
+  worker:
+    workMode: "elasticsearch" # operational mode of the migration job.
+    reader:
+      bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.
+meta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.
+  mode: "config" # specifies the source for meta configs. currently, onlly `config` is supported.
+  version: "8.9.1"
+  index: "qatest_index" # identifies the Elasticsearch index to migrate data from.
+  fields: # fields within the Elasticsearch index to be migrated.
+  - name: "my_vector" # name of the Elasticsearch field.
+    type: "dense_vector" # data type of the Elasticsearch field.
+    dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.
+  - name: "id"
+    pk: true # specifies if the field serves as a primary key.
+    type: "long"
+  - name: "num"
+    type: "integer"
+  - name: "double1"
+    type: "double"
+  - name: "text1"
+    maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.
+    type: "text"
+  - name: "bl1"
+    type: "boolean"
+  - name: "float1"
+    type: "float"
+  milvus: # configs specific to creating the collection in Milvus 2.x
+    collection: "Collection_01" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.
+    closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.
+    shardNum: 2 # number of shards to be created in the collection.
+    consistencyLevel: Strong # consistency level for Milvus collection.
+source: # connection configs for the source Elasticsearch server
+  es:
+    urls:
+    - "http://10.15.1.***:9200" # address of the source Elasticsearch server.
+    username: "" # username for the Elasticsearch server.
+    password: "" # password for the Elasticsearch server.
+target:
+  mode: "remote" # storage location for dumped files. valid values: `remote` and `local`.
+  remote: # configs for remote storage
+    outputDir: "migration/milvus/test" # output directory path in the cloud storage bucket.
+    cloud: "aws" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.
+    region: "us-west-2" # region of the cloud storage; can be any value if using local Minio.
+    bucket: "zilliz-aws-us-****-*-********" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.
+    useIAM: true # whether to use an IAM Role for connection.
+    checkBucket: false # checks if the specified bucket exists in the storage.
+  milvus2x: # connection configs for the target Milvus 2.x server
+    endpoint: "http://10.102.*.**:19530" # address of the target Milvus server.
+    username: "****" # username for the Milvus 2.x server.
+    password: "******" # password for the Milvus 2.x server.
+
+

يصف الجدول التالي المعلمات في ملف التكوين النموذجي. للحصول على قائمة كاملة من التكوينات، ارجع إلى Milvus Migration: Elasticsearch إلى Milvus 2.x.

+
    +
  • dumper

    + + + + + + + + +
    المعلمةالوصف
    dumper.worker.workModeالوضع التشغيلي لمهمة الترحيل. اضبط على elasticsearch عند الترحيل من فهارس Elasticsearch.
    dumper.worker.reader.bufferSizeحجم المخزن المؤقت للقراءة من Elasticsearch في كل دفعة. الوحدة: كيلوبايت.
    +
  • +
  • meta

    + + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    meta.modeيحدد مصدر التكوينات الوصفية. حالياً، يتم دعم config فقط.
    meta.indexيحدد فهرس Elasticsearch لترحيل البيانات منه.
    meta.fieldsالحقول داخل فهرس Elasticsearch المراد ترحيلها.
    meta.fields.nameاسم حقل Elasticsearch.
    meta.fields.maxLenالحد الأقصى لطول الحقل. هذه المعلمة مطلوبة فقط عندما يكون meta.fields.type هو keyword أو text.
    meta.fields.pkتحديد ما إذا كان الحقل يعمل كمفتاح أساسي.
    meta.fields.typeنوع بيانات حقل Elasticsearch. في الوقت الحالي، يتم دعم أنواع البيانات التالية في Elasticsearch: dasticsearch: متجه_كثيف، كلمة رئيسية، نص، طويل، عدد صحيح، عدد صحيح، عدد مزدوج، عدد عائم، عدد منطقي، كائن.
    meta.fields.dimsبُعد الحقل المتجه. هذه المعلمة مطلوبة فقط عندما يكون meta.fields.type هو dense_vector.
    meta.milvusالتكوينات الخاصة بإنشاء المجموعة في Milvus 2.x.
    meta.milvus.collectionاسم مجموعة Milvus. افتراضي إلى اسم فهرس Elasticsearch إذا لم يتم تحديده.
    meta.milvus.closeDynamicFieldيحدد ما إذا كان سيتم تعطيل الحقل الديناميكي في المجموعة. افتراضي إلى false. لمزيد من المعلومات حول الحقول الديناميكية، راجع تمكين الحقل الديناميكي.
    meta.milvus.shardNumعدد الأجزاء المراد إنشاؤها في المجموعة. لمزيد من المعلومات حول الأجزاء، راجع المصطلحات.
    meta.milvus.consistencyLevelمستوى الاتساق للمجموعة في Milvus. لمزيد من المعلومات، راجع الاتساق.
    +
  • +
  • source

    + + + + + + + + + + +
    المعلمةالوصف
    source.esتكوينات الاتصال لخادم Elasticsearch المصدر.
    source.es.urlsعنوان خادم Elasticsearch المصدر.
    source.es.usernameاسم المستخدم لخادم Elasticsearch.
    source.es.passwordكلمة المرور لخادم Elasticsearch.
    +
  • +
  • target

    + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    target.modeموقع تخزين الملفات التي تم تفريغها. القيم الصالحة:
    - local: تخزين الملفات التي تم تفريغها على الأقراص المحلية.
    - remote: تخزين الملفات التي تم تفريغها على وحدة تخزين الكائنات.
    target.remote.outputDirمسار دليل الإخراج في دلو التخزين السحابي.
    target.remote.cloudموفر خدمة التخزين السحابي. مثال على القيم: aws ، gcp ، azure.
    target.remote.regionمنطقة التخزين السحابي. يمكن أن تكون أي قيمة إذا كنت تستخدم MinIO المحلي.
    target.remote.bucketاسم الدلو لتخزين البيانات. يجب أن تكون القيمة هي نفس قيمة التكوين في Milvus 2.x. لمزيد من المعلومات، راجع تكوينات النظام.
    target.remote.useIAMما إذا كنت تريد استخدام دور IAM للاتصال.
    target.remote.checkBucketما إذا كان سيتم التحقق من وجود الدلو المحدد في تخزين الكائنات.
    target.milvus2xتكوينات الاتصال لخادم Milvus 2.x الهدف.
    target.milvus2x.endpointعنوان خادم Milvus الهدف.
    target.milvus2x.usernameاسم المستخدم لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    target.milvus2x.passwordكلمة المرور لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    +
  • +
+

بدء مهمة الترحيل

ابدأ مهمة الترحيل باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التكوين migration.yaml.

+
./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
+
+

فيما يلي مثال على إخراج سجل الترحيل الناجح:

+
[task/load_base_task.go:94] ["[LoadTasker] Dec Task Processing-------------->"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
+[task/load_base_task.go:76] ["[LoadTasker] Progress Task --------------->"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
+[dbclient/cus_field_milvus2x.go:86] ["[Milvus2x] begin to ShowCollectionRows"]
+[loader/cus_milvus2x_loader.go:66] ["[Loader] Static: "] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]
+[loader/cus_milvus2x_loader.go:66] ["[Loader] Static Total"] ["Total Collections"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]
+[migration/es_starter.go:25] ["[Starter] migration ES to Milvus finish!!!"] [Cost=80.009174459]
+[starter/starter.go:106] ["[Starter] Migration Success!"] [Cost=80.00928425]
+[cleaner/remote_cleaner.go:27] ["[Remote Cleaner] Begin to clean files"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]
+[cmd/start.go:32] ["[Cleaner] clean file success!"]
+
+

تحقق من النتيجة

بمجرد تنفيذ مهمة الترحيل، يمكنك إجراء مكالمات واجهة برمجة التطبيقات أو استخدام Attu لعرض عدد الكيانات التي تم ترحيلها. لمزيد من المعلومات، راجع Attu و get_collection_stats().

+

مرجع تعيين الحقل

راجع الجدول أدناه لفهم كيفية تعيين أنواع الحقول في فهارس Elasticsearch إلى أنواع الحقول في مجموعات Milvus.

+

لمزيد من المعلومات حول أنواع البيانات المدعومة في Milvus، راجع أنواع البيانات المدعومة.

+ + + + + + + + + + + + + + + +
نوع حقل Elasticsearchنوع حقل ملفوسالوصف
متجه_كثيفالمتجه العائمتظل أبعاد المتجه دون تغيير أثناء الترحيل.
كلمة رئيسيةفارشارتعيين الحد الأقصى للطول (من 1 إلى 65,535 65,535). يمكن أن تؤدي السلاسل التي تتجاوز الحد الأقصى إلى حدوث أخطاء في الترحيل.
نصفارشارتعيين الحد الأقصى للطول (من 1 إلى 65,535 65,535). يمكن أن تؤدي السلاسل التي تتجاوز الحد إلى حدوث أخطاء في الترحيل.
طويلInt64-
عدد صحيحInt32-
مزدوجمضاعف-
عائمعائم-
منطقيةبولي-
كائنJSON-
diff --git a/localization/v2.5.x/site/ar/migrate/f2m.json b/localization/v2.5.x/site/ar/migrate/f2m.json new file mode 100644 index 000000000..2589aa2c3 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/f2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n limit: 2\n workMode: faiss # operational mode of the migration job.\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 2\nsource: # configs for the source Faiss index.\n mode: local\n local:\n faissFile: ./testfiles/faiss/faiss_ivf_flat.index\n\ntarget: # configs for the target Milvus collection.\n create:\n collection:\n name: test1w\n shardsNums: 2\n dim: 256\n metricType: L2\n\n mode: remote\n remote:\n outputDir: testfiles/output/\n cloud: aws\n endpoint: 0.0.0.0:9000\n region: ap-southeast-1\n bucket: a-bucket\n ak: minioadmin\n sk: minioadmin\n useIAM: false\n useSSL: false\n checkBucket: true\n milvus2x:\n endpoint: localhost:19530\n username: xxxxx\n password: xxxxx\n\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Faiss","anchorList":[{"label":"من فايس","href":"From-Faiss","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تكوين الترحيل","href":"Configure-the-migration","type":2,"isActive":false},{"label":"بدء مهمة الترحيل","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"تحقق من النتيجة","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/f2m.md b/localization/v2.5.x/site/ar/migrate/f2m.md new file mode 100644 index 000000000..eb750a319 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/f2m.md @@ -0,0 +1,209 @@ +--- +id: f2m.md +title: من فايس +related_key: 'Faiss, migrate, import' +summary: تعرف على كيفية ترحيل بيانات فايس إلى ميلفوس. +--- +

من فايس

يوفر هذا الدليل عملية شاملة وخطوة بخطوة لترحيل البيانات من فايس إلى ميلفوس 2.x. باتباع هذا الدليل، ستتمكن من نقل بياناتك بكفاءة والاستفادة من ميزات ميلفوس 2.x المتقدمة والأداء المحسّن.

+

المتطلبات الأساسية

+

تكوين الترحيل

احفظ مثال ملف تهيئة الترحيل بصيغة migration.yaml وقم بتعديل التكوينات بناءً على ظروفك الفعلية. لك الحرية في وضع ملف التكوين في أي دليل محلي.

+
dumper: # configs for the migration job.
+  worker:
+    limit: 2
+    workMode: faiss    # operational mode of the migration job.
+    reader:
+      bufferSize: 1024
+    writer:
+      bufferSize: 1024
+loader:
+  worker:
+    limit: 2
+source: # configs for the source Faiss index.
+  mode: local
+  local:
+    faissFile: ./testfiles/faiss/faiss_ivf_flat.index
+
+target: # configs for the target Milvus collection.
+  create:
+    collection:
+      name: test1w
+      shardsNums: 2
+      dim: 256
+      metricType: L2
+
+  mode: remote
+  remote:
+    outputDir: testfiles/output/
+    cloud: aws
+    endpoint: 0.0.0.0:9000
+    region: ap-southeast-1
+    bucket: a-bucket
+    ak: minioadmin
+    sk: minioadmin
+    useIAM: false
+    useSSL: false
+    checkBucket: true
+  milvus2x:
+    endpoint: localhost:19530
+    username: xxxxx
+    password: xxxxx
+
+
+

يصف الجدول التالي المعلمات في ملف التكوين النموذجي. للحصول على قائمة كاملة بالتكوينات، ارجع إلى Milvus Migration: فايس إلى ميلفوس 2.x.

+
    +
  • dumper

    + + + + + + + + + + +
    المعلمةالوصف
    dumper.worker.limitتزامن خيوط الترحيل.
    dumper.worker.workModeالوضع التشغيلي لمهمة الترحيل. تعيين إلى فايس عند الترحيل من فهارس فايس.
    dumper.worker.reader.bufferSizeحجم المخزن المؤقت للقراءة من فايس في كل دفعة. الوحدة: كيلوبايت.
    dumper.worker.writer.bufferSizeحجم المخزن المؤقت للكتابة إلى ميلفيس في كل دفعة. الوحدة: كيلوبايت: كيلوبايت.
    +
  • +
  • loader

    + + + + + + + +
    المعلمةالوصف
    loader.worker.limitتزامن خيوط المحمل.
    +
  • +
  • source

    + + + + + + + + +
    المعلمةالوصف
    source.modeيحدد مكان قراءة الملفات المصدر من. القيم الصالحة:
    - local: يقرأ الملفات من قرص محلي.
    - remote: يقرأ الملفات من وحدة تخزين بعيدة.
    source.local.faissFileمسار الدليل حيث توجد الملفات المصدر. على سبيل المثال، /db/faiss.index.
    +
  • +
  • target

    + + + + + + + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    target.create.collection.nameاسم مجموعة ميلفوس.
    target.create.collection.shardsNumsعدد الأجزاء المراد إنشاؤها في المجموعة. لمزيد من المعلومات عن القطع، راجع المصطلحات.
    target.create.collection.dimبُعد الحقل المتجه.
    target.create.collection.metricTypeالنوع المتري المستخدم لقياس أوجه التشابه بين المتجهات. لمزيد من المعلومات، راجع المصطلحات.
    target.modeموقع تخزين الملفات الملقاة. القيم الصالحة:
    - local: تخزين الملفات التي تم تفريغها على الأقراص المحلية.
    - remote: تخزين الملفات التي تم تفريغها على وحدة تخزين الكائنات.
    target.remote.outputDirمسار دليل الإخراج في دلو التخزين السحابي.
    target.remote.cloudموفر خدمة التخزين السحابي. مثال على القيم: aws ، gcp ، azure.
    target.remote.endpointنقطة نهاية تخزين Milvus 2.x.
    target.remote.regionمنطقة التخزين السحابي. يمكن أن تكون أي قيمة إذا كنت تستخدم MinIO المحلي.
    target.remote.bucketاسم الدلو لتخزين البيانات. يجب أن تكون القيمة هي نفس قيمة التكوين في Milvus 2.x. لمزيد من المعلومات، راجع تكوينات النظام.
    target.remote.akمفتاح الوصول لمخزن Milvus 2.x.
    target.remote.skمفتاح سري لتخزين Milvus 2.x.
    target.remote.useIAMما إذا كان سيتم استخدام دور IAM للاتصال.
    target.remote.useSSLما إذا كان سيتم تمكين SSL عند الاتصال بـ Milvus 2.x. لمزيد من المعلومات، راجع التشفير في النقل.
    target.remote.checkBucketما إذا كان سيتم التحقق مما إذا كانت الحافظة المحددة موجودة في تخزين الكائنات.
    target.milvus2x.endpointعنوان خادم Milvus الهدف.
    target.milvus2x.usernameاسم المستخدم لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    target.milvus2x.passwordكلمة المرور لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    +
  • +
+

بدء مهمة الترحيل

    +
  1. ابدأ مهمة الترحيل باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التكوين migration.yaml.

    +
    ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    يقوم الأمر أعلاه بتحويل بيانات فهرس Faiss إلى ملفات NumPy، ثم يستخدم عملية الإدراج الجماعي لكتابة البيانات إلى الدلو الهدف.

  2. +
  3. بمجرد إنشاء ملفات NumPy، قم باستيراد هذه الملفات إلى Milvus 2.x باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التكوين migration.yaml.

    +
    ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
    +
  4. +
+

تحقق من النتيجة

بمجرد تنفيذ مهمة الترحيل، يمكنك إجراء مكالمات واجهة برمجة التطبيقات أو استخدام Attu لعرض عدد الكيانات التي تم ترحيلها. لمزيد من المعلومات، راجع Attu و get_collection_stats().

diff --git a/localization/v2.5.x/site/ar/migrate/from-m2x.json b/localization/v2.5.x/site/ar/migrate/from-m2x.json new file mode 100644 index 000000000..a9ba629cd --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/from-m2x.json @@ -0,0 +1 @@ +{"codeList":["dumper:\n worker:\n workMode: milvus2x\n reader:\n bufferSize: 500\n\nmeta:\n mode: config\n version: 2.3.0\n collection: src_table_name\n\nsource:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n\ntarget:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[INFO] [migration/milvus2x_starter.go:79] [\"=================>JobProcess!\"] [Percent=100]\n[INFO] [migration/milvus2x_starter.go:27] [\"[Starter] migration Milvus2x to Milvus2x finish!!!\"] [Cost=94.877717375]\n[INFO] [starter/starter.go:109] [\"[Starter] Migration Success!\"] [Cost=94.878243583]\n","./milvus-migration server run -p 8080\n","curl -XPOST http://localhost:8080/api/v1/start\n","meta:\n fields:\n - name: id\n - name: title_vector\n - name: reading_time\n","meta:\n milvus:\n collection: target_collection_name\n shardNum: 2\n closeDynamicField: false\n consistencyLevel: Customized\n"],"headingContent":"From Milvus 2.3.x","anchorList":[{"label":"من Milvus 2.3.x","href":"From-Milvus-23x","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تكوين ملف الترحيل","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"بدء مهمة الترحيل","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"تحقق من النتيجة","href":"Verify-the-result","type":2,"isActive":false},{"label":"خيارات التكوين الإضافية","href":"Additional-configuration-options","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/from-m2x.md b/localization/v2.5.x/site/ar/migrate/from-m2x.md new file mode 100644 index 000000000..ec884ae7a --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/from-m2x.md @@ -0,0 +1,220 @@ +--- +id: from-m2x.md +summary: >- + يوفر هذا الدليل عملية شاملة ومفصلة خطوة بخطوة لترحيل البيانات من Milvus 2.3.x + إلى Milvus 2.3.x أو أعلى. +title: من Milvus 2.3.x +--- +

من Milvus 2.3.x

يوفر هذا الدليل عملية شاملة ومفصلة خطوة بخطوة لترحيل البيانات من Milvus 2.3.x إلى Milvus 2.3.x أو أعلى.

+

المتطلبات الأساسية

    +
  • إصدارات البرنامج:
      +
    • المصدر Milvus المصدر: 2.3.0+ (تستخدم الأداة أداة التحويل لجلب بيانات المجموعة المصدرية، مما يتطلب أن يكون الإصدار 2.3.0 أو أعلى من الإصدار 2.3.0).
    • +
    • ميلفوس الهدف: 2.3.0+
    • +
  • +
  • الأدوات المطلوبة:
  • +
  • إعداد البيانات:
      +
    • تأكد من تحميل مجموعة Milvus المصدر وجاهزة لتصدير البيانات.
    • +
    • إذا كان الميلفوس الهدف لا يحتوي على مجموعة مطابقة للمجموعة المصدر، ستقوم أداة الترحيل Milvus-migration بإنشائها تلقائيًا. لاحظ أنه بعد الترحيل، لن تتم فهرسة المجموعة الهدف، ويجب عليك فهرسة المجموعة يدويًا بعد ذلك.
    • +
  • +
+

تكوين ملف الترحيل

احفظ مثال ملف تهيئة الترحيل بصيغة migration.yaml وقم بتعديل التكوينات بناءً على ظروفك الفعلية. لك الحرية في وضع ملف التكوين في أي دليل محلي.

+
dumper:
+  worker:
+    workMode: milvus2x
+    reader:
+      bufferSize: 500
+
+meta:
+  mode: config
+  version: 2.3.0
+  collection: src_table_name
+
+source:
+  milvus2x:
+    endpoint: {milvus2x_domain}:{milvus2x_port}
+    username: xxxx
+    password: xxxxx
+
+target:
+  milvus2x:
+    endpoint: {milvus2x_domain}:{milvus2x_port}
+    username: xxxx
+    password: xxxxx
+
+

يصف الجدول التالي المعلمات في ملف التكوين النموذجي. لمزيد من المعلومات، ارجع إلى Milvus Migration: Milvus2.x إلى Milvus2.x.

+
    +
  • dumper

    + + + + + + + + +
    المعلمةالوصف
    dumper.worker.workModeالوضع التشغيلي لمهمة الترحيل. تعيين إلى milvus2x عند الترحيل من Milvus 2.x.
    dumper.worker.reader.bufferSizeحجم المخزن المؤقت للقراءة من Milvus 2.x في كل دفعة.
    +
  • +
  • meta

    + + + + + + + + + +
    المعلمةالوصف
    meta.modeتحديد مكان قراءة ملف التعريف. تعيين إلى تكوين، للإشارة إلى إمكانية الحصول على تكوين التعريف من ملف migration.yaml هذا.
    meta.versionمصدر إصدار ملف Milvus. تعيين إلى 2.3.0 أو أعلى.
    meta.collectionاسم مجموعة المصدر.
    +
  • +
  • source

    + + + + + + + + + +
    المعلمةالوصف
    source.milvus2x.endpointعنوان مصدر خادم ملفوس المصدر.
    source.milvus2x.usernameاسم المستخدم لخادم Milvus المصدر. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    source.milvus2x.passwordكلمة المرور لخادم Milvus المصدر. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    +
  • +
  • target

    + + + + + + + + + +
    المعلمةالوصف
    target.milvus2x.endpointعنوان خادم Milvus الهدف.
    target.milvus2x.usernameاسم المستخدم لخادم Milvus الهدف. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    target.milvus2x.passwordكلمة المرور لخادم Milvus الهدف. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    +
  • +
+

بدء مهمة الترحيل

لديك خياران لبدء مهمة الترحيل - باستخدام CLI أو تقديم طلبات واجهة برمجة التطبيقات. اختر الخيار الذي يناسب احتياجاتك.

+

الخيار 1: استخدام CLI

ابدأ مهمة الترحيل باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التهيئة migration.yaml.

+
./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
+
+

راقب السجلات للحصول على تحديثات التقدم. يجب أن تتضمن سجلات الترحيل الناجحة إدخالات مثل:

+
[INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
+[INFO] [migration/milvus2x_starter.go:27] ["[Starter] migration Milvus2x to Milvus2x finish!!!"] [Cost=94.877717375]
+[INFO] [starter/starter.go:109] ["[Starter] Migration Success!"] [Cost=94.878243583]
+
+

الخيار 2: إجراء طلبات واجهة برمجة التطبيقات

يمكنك أيضًا استخدام واجهة برمجة التطبيقات (Restful API) لتنفيذ الترحيل. ابدأ تشغيل خادم واجهة برمجة التطبيقات باستخدام:

+
./milvus-migration server run -p 8080
+
+

بمجرد بدء تشغيل الخادم بنجاح، ضع الملف migration.yaml في الدليل configs/ للمشروع وابدأ الترحيل باستخدام:

+
curl -XPOST http://localhost:8080/api/v1/start
+
+

تحقق من النتيجة

بعد اكتمال مهمة الترحيل، استخدم Attu لعرض عدد الكيانات التي تم ترحيلها. بالإضافة إلى ذلك، يمكنك إنشاء فهارس وتحميل المجموعات في Attu. لمزيد من المعلومات، راجع Attu و get_collection_stats().

+

خيارات التكوين الإضافية

بالإضافة إلى التكوينات الأساسية المذكورة أعلاه، يمكنك أيضًا إضافة إعدادات إضافية بناءً على متطلباتك الخاصة.

+
    +
  • ترحيل الحقل الانتقائي: إذا كنت بحاجة إلى ترحيل حقول محددة فقط في مجموعة ما بدلاً من جميع الحقول، فحدد الحقول المراد ترحيلها في القسم meta من الملف migration.yaml.

    +
    meta:
    +  fields:
    +    - name: id
    +    - name: title_vector
    +    - name: reading_time
    +
  • +
  • المجموعة المستهدفة المخصصة: لتخصيص خصائص المجموعة الهدف، أضف التكوينات ذات الصلة في القسم meta من الملف migration.yaml.

    +
    meta:
    +  milvus:
    +    collection: target_collection_name
    +    shardNum: 2
    +    closeDynamicField: false
    +    consistencyLevel: Customized
    +
  • +
+

للحصول على معلومات مفصلة، راجع ترحيل Milvus: Milvus2.x إلى Milvus2.x.

diff --git a/localization/v2.5.x/site/ar/migrate/m2m.json b/localization/v2.5.x/site/ar/migrate/m2m.json new file mode 100644 index 000000000..4b36eb122 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/m2m.json @@ -0,0 +1 @@ +{"codeList":["./milvus-migration export -m \"user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local\" -o outputDir\n","./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir\n","migration_data\n├── meta.json\n└── tables\n","dumper:\n worker:\n limit: 2\n workMode: milvus1x\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 16\nmeta:\n mode: local\n localFile: /outputDir/test/meta.json\nsource:\n mode: local\n local:\n tablesDir: /db/tables/\ntarget:\n mode: remote\n remote:\n outputDir: \"migration/test/xx\"\n ak: xxxx\n sk: xxxx\n cloud: aws\n region: us-west-2\n bucket: xxxxx\n useIAM: true\n checkBucket: false\n milvus2x:\n endpoint: \"{yourMilvus2_xServerAddress}:{port}\"\n username: xxxx\n password: xxxx\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Milvus 1.x","anchorList":[{"label":"من ميلفوس 1.x","href":"From-Milvus-1x","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تصدير البيانات الوصفية الخاصة بتثبيت Milvus المصدر","href":"Export-metadata-of-the-source-Milvus-installation","type":2,"isActive":false},{"label":"تكوين ملف الترحيل","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"بدء مهمة الترحيل","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"تحقق من النتيجة","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/m2m.md b/localization/v2.5.x/site/ar/migrate/m2m.md new file mode 100644 index 000000000..af2e61866 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/m2m.md @@ -0,0 +1,242 @@ +--- +id: m2m.md +summary: >- + يوفر هذا الدليل عملية شاملة وخطوة بخطوة لترحيل البيانات من Milvus 1.x (بما في + ذلك 0.9.x وما فوق) إلى Milvus 2.x. +title: من ميلفوس 1.x +--- +

من ميلفوس 1.x

يوفر هذا الدليل عملية شاملة وخطوة بخطوة لترحيل البيانات من Milvus 1.x (بما في ذلك 0.9.x وما فوق) إلى Milvus 2.x. باتباع هذا الدليل، ستتمكن من نقل بياناتك بكفاءة، والاستفادة من ميزات Milvus 2.x المتقدمة والأداء المحسّن.

+

المتطلبات الأساسية

+

تصدير البيانات الوصفية الخاصة بتثبيت Milvus المصدر

لإعداد بيانات الترحيل لـ Milvus 0.9.x حتى 1.x، قم بإيقاف Milvus المصدر أو على الأقل إيقاف تنفيذ أي عمليات DML فيه.

+
    +
  1. تصدير البيانات الوصفية لتثبيت المصدر Milvus المصدر إلى meta.json.

    +
      +
    • بالنسبة لتلك التثبيتات التي تستخدم MySQL كواجهة خلفية، قم بتشغيل
    • +
    +
    ./milvus-migration export -m "user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local" -o outputDir
    +
    +
      +
    • بالنسبة لتلك التثبيتات التي تستخدم SQLite كواجهة خلفية، قم بتشغيل
    • +
    +
    ./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir
    +
  2. +
  3. انسخ المجلد tables من تثبيت Milvus الخاص بك، ثم انقل المجلد meta.json والمجلد tables إلى مجلد فارغ.

    +

    بمجرد الانتهاء من هذه الخطوة، يجب أن تبدو بنية المجلد الفارغ بهذا الشكل:

    +
    migration_data
    +├── meta.json
    +└── tables
    +
  4. +
  5. قم بتحميل المجلد الذي تم إعداده في الخطوة السابقة إلى دلو تخزين كتلة S3 أو استخدم هذا المجلد المحلي مباشرة في القسم التالي.

  6. +
+

تكوين ملف الترحيل

احفظ مثال ملف تهيئة الترحيل بصيغة migration.yaml وقم بتعديل التكوينات بناءً على ظروفك الفعلية. لك الحرية في وضع ملف التكوين في أي دليل محلي.

+
dumper:
+  worker:
+    limit: 2
+    workMode: milvus1x
+    reader:
+      bufferSize: 1024
+    writer:
+      bufferSize: 1024
+loader:
+  worker:
+    limit: 16
+meta:
+  mode: local
+  localFile: /outputDir/test/meta.json
+source:
+  mode: local
+  local:
+    tablesDir: /db/tables/
+target:
+  mode: remote
+  remote:
+    outputDir: "migration/test/xx"
+    ak: xxxx
+    sk: xxxx
+    cloud: aws
+    region: us-west-2
+    bucket: xxxxx
+    useIAM: true
+    checkBucket: false
+  milvus2x:
+    endpoint: "{yourMilvus2_xServerAddress}:{port}"
+    username: xxxx
+    password: xxxx
+
+

يصف الجدول التالي المعلمات في ملف التكوين النموذجي. للحصول على قائمة كاملة بالتكوينات، ارجع إلى Milvus Migration: Milvus1.x إلى Milvus 2.x.

+
    +
  • dumper

    + + + + + + + + + + +
    المعلمةالوصف
    dumper.worker.limitتزامن خيوط الترحيل.
    dumper.worker.workModeالوضع التشغيلي لمهمة الترحيل. تعيين إلى milvus1x عند الترحيل من Milvus 1.x.
    dumper.worker.reader.bufferSizeحجم المخزن المؤقت للقراءة من Milvus 1.x في كل دفعة. الوحدة: كيلوبايت.
    dumper.worker.writer.bufferSizeحجم المخزن المؤقت للكتابة إلى Milvus 2.x في كل دفعة. الوحدة: كيلوبايت: كيلوبايت.
    +
  • +
  • loader

    + + + + + + + +
    المعلمةالوصف
    loader.worker.limitتزامن خيوط المحمل.
    +
  • +
  • meta

    + + + + + + + + +
    المعلمةالوصف
    meta.modeتحديد مكان قراءة ملف التعريف meta.json. قيم صالحة: local ، remote ، mysql ، ، sqlite.
    meta.localFileمسار الدليل المحلي حيث يوجد الملف meta.json. يتم استخدام هذا التكوين فقط عندما يتم تعيين meta.mode على local. للحصول على تكوينات التعريف الأخرى، راجع README_1X.
    +
  • +
  • source

    + + + + + + + + +
    المعلمةالوصف
    source.modeيحدد مكان قراءة الملفات المصدر من. القيم الصالحة:
    - local: يقرأ الملفات من قرص محلي.
    - remote: يقرأ الملفات من وحدة تخزين بعيدة.
    source.local.tablesDirمسار الدليل حيث توجد الملفات المصدر. على سبيل المثال، /db/tables/.
    +
  • +
  • target

    + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    target.modeموقع التخزين للملفات الملقاة. القيم الصالحة:
    - local: تخزين الملفات الملقاة على الأقراص المحلية.
    - remote: تخزين الملفات الملقاة على وحدة تخزين الكائنات.
    target.remote.outputDirمسار دليل الإخراج في دلو التخزين السحابي.
    target.remote.akمفتاح الوصول للتخزين Milvus 2.x.
    target.remote.skالمفتاح السري للتخزين Milvus 2.x.
    target.remote.cloudمزود خدمة التخزين السحابي. مثال على القيم: aws ، gcp ، azure.
    target.remote.regionمنطقة التخزين السحابي. يمكن أن تكون أي قيمة إذا كنت تستخدم MinIO المحلي.
    target.remote.bucketاسم الدلو لتخزين البيانات. يجب أن تكون القيمة هي نفس قيمة التكوين في Milvus 2.x. لمزيد من المعلومات، راجع تكوينات النظام.
    target.remote.useIAMما إذا كنت تريد استخدام دور IAM للاتصال.
    target.remote.checkBucketما إذا كان سيتم التحقق من وجود الدلو المحدد في تخزين الكائنات.
    target.milvus2x.endpointعنوان خادم Milvus الهدف.
    target.milvus2x.usernameاسم المستخدم لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    target.milvus2x.passwordكلمة المرور لخادم Milvus 2.x. هذه المعلمة مطلوبة إذا تم تمكين مصادقة المستخدم لخادم Milvus الخاص بك. لمزيد من المعلومات، راجع تمكين المصادقة.
    +
  • +
+

بدء مهمة الترحيل

    +
  1. ابدأ مهمة الترحيل باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التكوين migration.yaml.

    +
    ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    يقوم الأمر أعلاه بتحويل بيانات المصدر في Milvus 1.x إلى ملفات NumPy، ثم يستخدم عملية الإدراج الجماعي لكتابة البيانات إلى الحزمة المستهدفة.

  2. +
  3. بمجرد إنشاء ملفات NumPy، قم باستيراد هذه الملفات إلى Milvus 2.x باستخدام الأمر التالي. استبدل {YourConfigFilePath} بالدليل المحلي حيث يوجد ملف التكوين migration.yaml.

    +
    ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
    +
  4. +
+

تحقق من النتيجة

بمجرد تنفيذ مهمة الترحيل، يمكنك إجراء مكالمات واجهة برمجة التطبيقات أو استخدام Attu لعرض عدد الكيانات التي تم ترحيلها. لمزيد من المعلومات، راجع Attu و get_collection_stats().

diff --git a/localization/v2.5.x/site/ar/migrate/migrate_overview.json b/localization/v2.5.x/site/ar/migrate/migrate_overview.json new file mode 100644 index 000000000..8d5334b58 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/migrate_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Migration Overview","anchorList":[{"label":"نظرة عامة على ترحيل ميلفوس","href":"Milvus-Migration-Overview","type":1,"isActive":false},{"label":"عمليات الترحيل المدعومة","href":"Supported-migrations","type":2,"isActive":false},{"label":"الميزات","href":"Features","type":2,"isActive":false},{"label":"البنية","href":"Architecture","type":2,"isActive":false},{"label":"الخطط المستقبلية","href":"Future-plans","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/migrate_overview.md b/localization/v2.5.x/site/ar/migrate/migrate_overview.md new file mode 100644 index 000000000..c68475448 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/migrate_overview.md @@ -0,0 +1,120 @@ +--- +id: migrate_overview.md +summary: >- + تقدم هذه المقالة نظرة عامة على أداة Milvus-migration، بما في ذلك عمليات + الترحيل المدعومة والميزات والبنية. +title: نظرة عامة على ترحيل ميلفوس +--- +

نظرة عامة على ترحيل ميلفوس

إدراكًا للاحتياجات المتنوعة لقاعدة المستخدمين، قامت ميلفوس بتوسيع أدوات الترحيل الخاصة بها ليس فقط لتسهيل الترقيات من إصدارات ميلفوس 1.x السابقة ولكن أيضًا لتمكين التكامل السلس للبيانات من أنظمة أخرى مثل Elasticsearch وFaiss. تم تصميم مشروع Milvus-migration لسد الفجوة بين بيئات البيانات المتنوعة هذه وأحدث التطورات في تقنية Milvus، مما يضمن لك الاستفادة من الميزات المحسنة والأداء المحسن بسلاسة.

+

عمليات الترحيل المدعومة

تدعم أداة Milvus-migration مجموعة متنوعة من مسارات الترحيل لاستيعاب احتياجات المستخدمين المختلفة:

+
    +
  • Elasticsearch إلى Milvus 2.x: تمكين المستخدمين من ترحيل البيانات من بيئات Elasticsearch للاستفادة من إمكانيات البحث المتجه المحسّنة في Milvus.
  • +
  • فايس إلى ميلفوس 2.x: توفير دعم تجريبي لنقل البيانات من Faiss، وهي مكتبة شائعة للبحث الفعال عن التشابه.
  • +
  • Milvus 1.x إلى Milvus 2.x: ضمان نقل البيانات من الإصدارات السابقة بسلاسة إلى الإطار الأحدث.
  • +
  • Milvus 2.3.x إلى Milvus 2.3.x أو أعلى: توفير مسار ترحيل لمرة واحدة للمستخدمين الذين قاموا بالترحيل بالفعل إلى 2.3.x.
  • +
+

الميزات

تم تصميم Milvus-migration بميزات قوية للتعامل مع سيناريوهات الترحيل المتنوعة:

+
    +
  • طرق تفاعل متعددة: يمكنك إجراء عمليات الترحيل عبر واجهة سطر الأوامر أو من خلال واجهة برمجة التطبيقات المريحة، مع مرونة في كيفية تنفيذ عمليات الترحيل.
  • +
  • دعم مختلف تنسيقات الملفات والتخزين السحابي: يمكن لأداة الترحيل Milvus-migration التعامل مع البيانات المخزنة في الملفات المحلية وكذلك في حلول التخزين السحابية مثل S3 و OSS و GCP، مما يضمن توافقًا واسعًا.
  • +
  • معالجة نوع البيانات: أداة Milvus-migration قادرة على التعامل مع كل من البيانات المتجهة والحقول القياسية، مما يجعلها خيارًا متعدد الاستخدامات لتلبية احتياجات ترحيل البيانات المختلفة.
  • +
+

البنية

صُممت بنية برنامج Milvus-migration بشكل استراتيجي لتسهيل عمليات تدفق البيانات وتحليلها وكتابتها بكفاءة، مما يتيح قدرات ترحيل قوية عبر مصادر البيانات المختلفة.

+

+ + Milvus-migration architecture + بنية Milvus-migration

+

في الشكل السابق:

+
    +
  • مصدر البيانات: يدعم ترحيل Milvus-migration مصادر بيانات متعددة بما في ذلك Elasticsearch عبر واجهة برمجة تطبيقات التمرير وملفات بيانات التخزين المحلي أو السحابي وقواعد بيانات Milvus 1.x. يتم الوصول إليها وقراءتها بطريقة مبسطة لبدء عملية الترحيل.
  • +
  • خط أنابيب التدفق:
      +
    • عملية التحليل: يتم تحليل البيانات من المصادر وفقًا لتنسيقها. على سبيل المثال، بالنسبة لمصدر البيانات من Elasticsearch، يتم استخدام محلل تنسيق Elasticsearch، بينما تستخدم التنسيقات الأخرى محللون معنيون. هذه الخطوة ضرورية لتحويل البيانات الأولية إلى تنسيق منظم يمكن معالجته بشكل أكبر.
    • +
    • عملية التحويل: بعد التحليل، تخضع البيانات لعملية تحويل حيث تتم تصفية الحقول، وتحويل أنواع البيانات، وتعديل أسماء الجداول وفقًا لمخطط Milvus 2.x المستهدف. هذا يضمن توافق البيانات مع البنية والأنواع المتوقعة في ملفوس.
    • +
  • +
  • كتابة البيانات وتحميلها:
      +
    • كتابة البيانات: تتم كتابة البيانات المعالجة في ملفات JSON أو NumPy الوسيطة، وتكون جاهزة للتحميل في Milvus 2.x.
    • +
    • تحميل البيانات: يتم تحميل البيانات أخيرًا إلى Milvus 2.x باستخدام عملية BulkInsert، والتي تكتب بكفاءة كميات كبيرة من البيانات في أنظمة تخزين Milvus، سواءً كانت سحابية أو مخزن ملفات.
    • +
  • +
+

الخطط المستقبلية

يلتزم فريق التطوير بتعزيز ترحيل Milvus بميزات مثل:

+
    +
  • دعم المزيد من مصادر البيانات: خطط لتوسيع الدعم ليشمل قواعد بيانات وأنظمة ملفات إضافية، مثل Pinecone و Chroma و Qdrant. إذا كنت بحاجة إلى دعم مصدر بيانات معين، يرجى إرسال طلبك من خلال رابط مشكلة GitHub هذا.
  • +
  • تبسيط الأوامر: جهود لتبسيط عملية الأوامر لتسهيل التنفيذ.
  • +
  • محلل / تحويلSPI: من المتوقع أن تتضمن البنية أدوات واجهة مزود الخدمة (SPI) لكل من التحليل والتحويل. تسمح هذه الأدوات بالتطبيقات المخصصة التي يمكن للمستخدمين توصيلها في عملية الترحيل للتعامل مع تنسيقات بيانات أو قواعد تحويل محددة.
  • +
  • استئناف نقطة التدقيق: تمكين عمليات الترحيل من استئناف الترحيل من آخر نقطة تدقيق لتعزيز الموثوقية والكفاءة في حالة الانقطاعات. سيتم إنشاء نقاط حفظ لضمان تكامل البيانات وتخزينها في قواعد بيانات مثل SQLite أو MySQL لتتبع تقدم عملية الترحيل.
  • +
diff --git a/localization/v2.5.x/site/ar/migrate/milvusdm_install.json b/localization/v2.5.x/site/ar/migrate/milvusdm_install.json new file mode 100644 index 000000000..f3d13f829 --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/milvusdm_install.json @@ -0,0 +1 @@ +{"codeList":["# clone the source project\ngit clone https://github.com/zilliztech/milvus-migration.git\n","cd milvus-migration\n","# compile the project to obtain an executable file\ngo get & go build\n"],"headingContent":"Install Migration Tool","anchorList":[{"label":"تثبيت أداة الترحيل","href":"Install-Migration-Tool","type":1,"isActive":false},{"label":"تنزيل الملف الثنائي القابل للتنفيذ","href":"Download-the-executable-binary","type":2,"isActive":false},{"label":"التحويل البرمجي من المصدر","href":"Compile-from-source","type":2,"isActive":false},{"label":"الخطوة التالية","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/migrate/milvusdm_install.md b/localization/v2.5.x/site/ar/migrate/milvusdm_install.md new file mode 100644 index 000000000..2176df43a --- /dev/null +++ b/localization/v2.5.x/site/ar/migrate/milvusdm_install.md @@ -0,0 +1,91 @@ +--- +id: milvusdm_install.md +summary: تعرف على كيفية تثبيت Milvus-Migration لترحيل بياناتك. +title: تثبيت أداة الترحيل +--- +

تثبيت أداة الترحيل

نحن ندعم تنزيل الملف الثنائي القابل للتنفيذ أو تجميع أداة Milvus-migration من المصدر.

+

تنزيل الملف الثنائي القابل للتنفيذ

    +
  1. قم بتنزيل أحدث إصدار من مستودع Milvus-Migration GitHub.
  2. +
  3. استخرج الملف الذي تم تنزيله للحصول على الملف الثنائي القابل للتنفيذ milvus-migration.
  4. +
+

التحويل البرمجي من المصدر

بدلاً من ذلك، قم بتنزيل وتجميع المصدر للحصول على ملف ثنائي قابل للتنفيذ.

+
    +
  1. استنساخ مستودع Milvus-Migration:

    +
    # clone the source project
    +git clone https://github.com/zilliztech/milvus-migration.git
    +
  2. +
  3. انتقل إلى دليل المشروع:

    +
    cd milvus-migration
    +
  4. +
  5. قم بتجميع المشروع للحصول على الملف القابل للتنفيذ:

    +
    # compile the project to obtain an executable file
    +go get & go build
    +
    +

    سيؤدي ذلك إلى إنشاء الملف القابل للتنفيذ milvus-migration في دليل المشروع.

  6. +
+

الخطوة التالية

بعد تثبيت أداة Milvus-migration، يمكنك ترحيل البيانات من مصادر مختلفة:

+ diff --git a/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.json b/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.json new file mode 100644 index 000000000..e0dce4b81 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Architecture Overview","anchorList":[{"label":"نظرة عامة على بنية ميلفوس","href":"Milvus-Architecture-Overview","type":1,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.md b/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.md new file mode 100644 index 000000000..e6352ebd8 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/architecture_overview.md @@ -0,0 +1,54 @@ +--- +id: architecture_overview.md +summary: >- + يوفر Milvus قاعدة بيانات متجهات سريعة وموثوقة ومستقرة مصممة خصيصًا للبحث عن + التشابه والذكاء الاصطناعي. +title: نظرة عامة على بنية ميلفوس +--- +

نظرة عامة على بنية ميلفوس

تم تصميم Milvus على رأس مكتبات البحث عن المتجهات الشائعة بما في ذلك Faiss و HNSW و DiskANN و SCANN وغيرها، وقد صُمم Milvus للبحث عن التشابه في مجموعات بيانات المتجهات الكثيفة التي تحتوي على ملايين أو مليارات أو حتى تريليونات المتجهات. قبل المتابعة، تعرف على المبادئ الأساسية لاسترجاع التضمين.

+

يدعم Milvus أيضًا تجزئة البيانات، واستيعاب البيانات المتدفقة، والمخطط الديناميكي، والبحث الذي يجمع بين البيانات المتجهة والقياسية، والبحث متعدد المتجهات والهجين، والمتجهات المتفرقة والعديد من الوظائف المتقدمة الأخرى. توفر المنصة أداءً حسب الطلب ويمكن تحسينها لتناسب أي سيناريو استرجاع مضمن. نوصي بنشر Milvus باستخدام Kubernetes لتحقيق التوافر والمرونة المثلى.

+

تتبنى Milvus بنية تخزين مشتركة تتميز بتجزئة التخزين والحوسبة وقابلية التوسع الأفقي لعقد الحوسبة الخاصة بها. واتباعًا لمبدأ الفصل بين مستوى البيانات ومستوى التحكم، تتألف Milvus من أربع طبقات: طبقة الوصول، وخدمة المنسق، والعقدة العاملة، والتخزين. هذه الطبقات مستقلة بشكل متبادل عندما يتعلق الأمر بالتوسع أو التعافي من الكوارث.

+

+ + Architecture_diagram + مخطط_معماري

+

وفقًا للشكل، يمكن تصنيف الواجهات إلى الفئات التالية:

+
    +
  • DDL / DCL: createCollection / createPartition / dropCollection / dropPartition / hasCollection / hasPartition
  • +
  • DML/إنتاج: إدراج/حذف/إدراج
  • +
  • DQL: بحث / استعلام
  • +
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/architecture/data_processing.json b/localization/v2.5.x/site/ar/reference/architecture/data_processing.json new file mode 100644 index 000000000..d98863478 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/data_processing.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Data Processing","anchorList":[{"label":"معالجة البيانات","href":"Data-Processing","type":1,"isActive":false},{"label":"إدراج البيانات","href":"Data-insertion","type":2,"isActive":false},{"label":"بناء الفهرس","href":"Index-building","type":2,"isActive":false},{"label":"استعلام البيانات","href":"Data-query","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/architecture/data_processing.md b/localization/v2.5.x/site/ar/reference/architecture/data_processing.md new file mode 100644 index 000000000..99b146d2f --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/data_processing.md @@ -0,0 +1,124 @@ +--- +id: data_processing.md +summary: تعرف على إجراءات معالجة البيانات في ميلفوس. +title: معالجة البيانات +--- +

معالجة البيانات

تقدم هذه المقالة وصفًا تفصيليًا لتنفيذ عملية إدخال البيانات وبناء الفهرس والاستعلام عن البيانات في ميلفوس.

+

إدراج البيانات

يمكنك تحديد عدد من الأجزاء لكل مجموعة في ملفوس، كل جزء يتوافق مع قناة افتراضية(vchannel). كما يوضح الشكل التالي، يعيّن ميلفوس لكل قناة افتراضية في وسيط السجل قناة فعلية(pchannel). يتم توجيه أي طلب إدراج/حذف وارد إلى أجزاء بناءً على قيمة تجزئة المفتاح الأساسي.

+

يتم نقل التحقق من صحة طلبات DML إلى الوكيل لأن ميلفوس ليس لديه معاملات معقدة. سيطلب الوكيل طابعًا زمنيًا لكل طلب إدراج/حذف من TSO (أوراكل الطابع الزمني)، وهي وحدة التوقيت التي تتشارك مع المنسق الجذر. يتم استخدام الطوابع الزمنية لتحديد تسلسل طلبات البيانات التي تتم معالجتها مع استبدال الطابع الزمني الأقدم بالأحدث. يقوم الوكيل باسترداد المعلومات على دفعات من منسق البيانات بما في ذلك قطاعات الكيانات والمفاتيح الأساسية لزيادة الإنتاجية الإجمالية وتجنب إثقال كاهل العقدة المركزية.

+

+ + Channels 1 + القنوات 1

+

تتم كتابة كل من عمليات DML (لغة معالجة البيانات) وعمليات DDL (لغة تعريف البيانات) في تسلسل السجل، ولكن يتم تعيين قناة واحدة فقط لعمليات DDL بسبب انخفاض تكرار حدوثها.

+

+ + Channels 2 + القنوات 2

+

يتم الاحتفاظ بقنواتVchannels في عقد وسيط السجل الأساسية. كل قناة غير قابلة للتجزئة فعليًا ومتاحة لأي عقدة واحدة فقط. عندما يصل معدل استيعاب البيانات إلى عنق الزجاجة، ضع في اعتبارك أمرين: ما إذا كانت عقدة وسيط السجل محملة فوق طاقتها وتحتاج إلى توسيع نطاقها، وما إذا كانت هناك أجزاء كافية لضمان توازن الحمل لكل عقدة.

+

+ + Write log sequence + تسلسل كتابة السجل

+

يغلف الرسم البياني أعلاه أربعة مكونات متضمنة في عملية كتابة تسلسل السجل: الوكيل، وسيط السجل، عقدة البيانات، وعقدة البيانات، وتخزين الكائنات. تنطوي العملية على أربع مهام: التحقق من صحة طلبات DML، ونشر-اشتراك تسلسل السجل، والتحويل من سجل التدفق إلى لقطات السجل، واستمرار لقطات السجل. يتم فصل المهام الأربع عن بعضها البعض للتأكد من أن كل مهمة يتم التعامل معها من قبل نوع العقدة المقابلة لها. يتم جعل العقد من نفس النوع متساوية ويمكن تحجيمها بشكل مرن ومستقل لاستيعاب أحمال البيانات المختلفة، والبيانات المتدفقة الضخمة والمتقلبة للغاية على وجه الخصوص.

+

بناء الفهرس

يتم بناء الفهرس بواسطة عقدة الفهرس. لتجنب بناء الفهرس بشكل متكرر لتحديثات البيانات، يتم تقسيم المجموعة في Milvus إلى أجزاء أخرى، لكل منها فهرسها الخاص.

+

+ + Index building + بناء الفهرس

+

يدعم Milvus بناء الفهرس لكل حقل متجه وحقل قياسي وحقل أساسي. يتفاعل كل من مدخلات ومخرجات بناء الفهرس مع تخزين الكائنات: تقوم عقدة الفهرس بتحميل لقطات السجل للفهرسة من مقطع (موجود في وحدة تخزين الكائنات) إلى الذاكرة، ثم تقوم بإلغاء تسلسل البيانات والبيانات الوصفية المقابلة لبناء الفهرس، ثم تقوم بتسلسل الفهرس عند اكتمال بناء الفهرس، ثم تقوم بكتابته مرة أخرى إلى وحدة تخزين الكائنات.

+

يتضمن بناء الفهرس بشكل أساسي عمليات متجهة ومصفوفة، وبالتالي فهو يتطلب عمليات حسابية وذاكرة مكثفة. لا يمكن فهرسة المتجهات بكفاءة باستخدام الفهارس التقليدية القائمة على الأشجار بسبب طبيعتها عالية الأبعاد، ولكن يمكن فهرستها بتقنيات أكثر نضجًا في هذا الموضوع، مثل الفهارس القائمة على المجموعات أو الرسم البياني. وبغض النظر عن نوعها، يتضمن بناء الفهرس عمليات حسابية تكرارية ضخمة للمتجهات واسعة النطاق، مثل Kmeans أو اجتياز الرسم البياني.

+

على عكس الفهرسة للبيانات القياسية، يجب أن يستفيد بناء فهرس المتجهات استفادة كاملة من تسريع SIMD (تعليمات واحدة، بيانات متعددة). لدى Milvus دعم فطري لمجموعات تعليمات SIMD، على سبيل المثال، SSE وAVX2 وAVX512. ونظراً لطبيعة "الزوبعة" وطبيعة بناء الفهرس المتجه التي تستهلك الكثير من الموارد، تصبح المرونة مهمة بشكل حاسم لميلفوس من الناحية الاقتصادية. ستعمل إصدارات Milvus المستقبلية على إجراء المزيد من الاستكشافات في الحوسبة غير المتجانسة والحوسبة بدون خادم لخفض التكاليف ذات الصلة.

+

إلى جانب ذلك، يدعم Milvus أيضًا التصفية العددية والاستعلام عن الحقل الأساسي. يحتوي على فهارس مدمجة لتحسين كفاءة الاستعلام، على سبيل المثال، فهارس مرشح بلوم، وفهارس التجزئة، والفهارس القائمة على الشجرة، والفهارس المقلوبة، ويخطط لتقديم المزيد من الفهارس الخارجية، مثل فهارس الصور النقطية والفهارس التقريبية.

+

استعلام البيانات

يشير الاستعلام عن البيانات إلى عملية البحث في مجموعة محددة عن عدد k من المتجهات الأقرب إلى متجه مستهدف أو عن جميع المتجهات ضمن نطاق مسافة محددة إلى المتجه. يتم إرجاع المتجهات مع المفتاح الأساسي والحقول المقابلة لها.

+

+ + Data query + استعلام البيانات

+

تنقسم المجموعة في ميلفوس إلى عدة قطاعات، وتقوم عقد الاستعلام بتحميل الفهارس حسب القطاع. عند وصول طلب بحث، يتم بثه إلى جميع عقد الاستعلام لإجراء بحث متزامن. ثم تقوم كل عقدة بعد ذلك بتشذيب المقاطع المحلية والبحث عن المتجهات التي تفي بالمعايير، ثم تقلل نتائج البحث وتعيدها.

+

تكون عقد الاستعلام مستقلة عن بعضها البعض في استعلام البيانات. كل عقدة مسؤولة عن مهمتين فقط: تحميل أو تحرير المقاطع باتباع التعليمات من منسق الاستعلام؛ وإجراء بحث داخل المقاطع المحلية. والوكيل مسؤول عن تقليل نتائج البحث من كل عقدة استعلام وإرجاع النتائج النهائية إلى العميل.

+

+ + Handoff + المناولة

+

هناك نوعان من المقاطع، المقاطع المتزايدة (للبيانات الإضافية)، والمقاطع المغلقة (للبيانات التاريخية). تشترك عُقد الاستعلام في قناة vchannel لتلقي التحديثات الأخيرة (البيانات التزايدية) كمقاطع متزايدة. عندما يصل المقطع المتنامي إلى عتبة محددة مسبقًا، يقوم منسق البيانات بإغلاقه ويبدأ بناء الفهرس. ثم تقوم عملية تسليم تبدأ من قبل منسق الاستعلام بتحويل البيانات المتزايدة إلى بيانات تاريخية. سيقوم منسق الاستعلام بتوزيع المقاطع المختومة بالتساوي بين جميع عقد الاستعلام وفقًا لاستخدام الذاكرة والنفقات الزائدة لوحدة المعالجة المركزية وعدد المقاطع.

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/architecture/four_layers.json b/localization/v2.5.x/site/ar/reference/architecture/four_layers.json new file mode 100644 index 000000000..d34412530 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/four_layers.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Storage/Computing Disaggregation","anchorList":[{"label":"فصل التخزين/الحوسبة","href":"StorageComputing-Disaggregation","type":1,"isActive":false},{"label":"طبقة الوصول","href":"Access-layer","type":2,"isActive":false},{"label":"خدمة المنسق","href":"Coordinator-service","type":2,"isActive":false},{"label":"عقد العمال","href":"Worker-nodes","type":2,"isActive":false},{"label":"التخزين","href":"Storage","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/architecture/four_layers.md b/localization/v2.5.x/site/ar/reference/architecture/four_layers.md new file mode 100644 index 000000000..f74a9f61e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/four_layers.md @@ -0,0 +1,123 @@ +--- +id: four_layers.md +summary: هيكل التخزين/التخزين/الحوسبة التفصيلي في ميلفوس. +title: فصل التخزين/الحوسبة +--- +

فصل التخزين/الحوسبة

باتباع مبدأ الفصل بين مستوى البيانات ومستوى التحكم، تتألف Milvus من أربع طبقات مستقلة عن بعضها البعض من حيث قابلية التوسع والتعافي من الكوارث.

+

طبقة الوصول

تتألف طبقة الوصول من مجموعة من الوكلاء عديمي الحالة، وهي الطبقة الأمامية للنظام ونقطة النهاية للمستخدمين. تتحقق من صحة طلبات العميل وتقلل من النتائج التي يتم إرجاعها:

+
    +
  • الوكيل في حد ذاته عديم الحالة. يوفر عنوان خدمة موحد باستخدام مكونات موازنة التحميل مثل Nginx و Kubernetes Ingress و NodePort و LVS.
  • +
  • نظرًا لأن Milvus يستخدم بنية معالجة متوازية على نطاق واسع (MPP)، يقوم الوكيل بتجميع النتائج الوسيطة ومعالجتها لاحقًا قبل إعادة النتائج النهائية إلى العميل.
  • +
+

خدمة المنسق

تقوم خدمة المنسق بتعيين المهام إلى العقد العاملة وتعمل كعقل النظام. وتشمل المهام التي تتولاها إدارة طوبولوجيا المجموعة، وموازنة التحميل، وتوليد الطابع الزمني، وإعلان البيانات، وإدارة البيانات.

+

هناك ثلاثة أنواع من المنسقين: منسق الجذر (منسق الجذر)، ومنسق البيانات (منسق البيانات)، ومنسق الاستعلام (منسق الاستعلام).

+

منسق الجذر (منسق الجذر)

يعالج منسق الجذر طلبات لغة تعريف البيانات (DDL) ولغة التحكم في البيانات (DCL)، مثل إنشاء مجموعات أو أقسام أو فهارس أو حذفها، بالإضافة إلى إدارة TSO (الطابع الزمني أوراكل) وإصدار شريط الوقت.

+

منسق الاستعلام (منسق الاستعلام)

يقوم منسق الاستعلام بإدارة الطوبولوجيا وموازنة التحميل لعقد الاستعلام، والتسليم من الأجزاء المتنامية إلى الأجزاء المغلقة.

+

منسق البيانات (منسق البيانات)

يدير منسق البيانات طوبولوجيا عقد البيانات وعقد الفهرس، ويحافظ على البيانات الوصفية ويحفز عمليات التدفق والضغط وبناء الفهرس وغيرها من عمليات البيانات في الخلفية.

+

عقد العمال

الأذرع والأرجل العقد العاملة هي عبارة عن منفّذات غبية تتبع التعليمات من خدمة المنسق وتنفذ أوامر لغة معالجة البيانات (DML) من الوكيل. العقد العاملة عديمة الحالة بفضل الفصل بين التخزين والحوسبة، ويمكنها تسهيل توسيع نطاق النظام واستعادة القدرة على العمل بعد الكوارث عند نشرها على Kubernetes. هناك ثلاثة أنواع من العقد العاملة:

+

عقدة الاستعلام

تسترجع عقدة الاستعلام بيانات السجل المتزايدة وتحولها إلى مقاطع متزايدة من خلال الاشتراك في وسيط السجل، وتحميل البيانات التاريخية من مخزن الكائنات، وتشغيل البحث الهجين بين البيانات المتجهة والقياسية.

+

عقدة البيانات

تسترجع عقدة البيانات بيانات السجل المتزايدة من خلال الاشتراك في وسيط السجل، وتعالج طلبات الطفرة، وتجمع بيانات السجل في لقطات السجل وتخزنها في مخزن الكائنات.

+

عقدة الفهرس

تقوم عقدة الفهرس ببناء الفهارس. لا تحتاج عقد الفهرس إلى أن تكون مقيمة في الذاكرة، ويمكن تنفيذها باستخدام إطار عمل بدون خادم.

+

التخزين

التخزين هو عظمة النظام، وهو المسؤول عن ثبات البيانات. ويتألف من التخزين التعريفي ووسيط السجل وتخزين الكائنات.

+

التخزين التعريفي

يخزّن التخزين التعريفي لقطات من البيانات الوصفية مثل مخطط المجموعة ونقاط التحقق من استهلاك الرسائل. يتطلب تخزين البيانات الوصفية توافرًا عاليًا للغاية واتساقًا قويًا ودعمًا للمعاملات، لذلك اختار Milvus موقع etcd للتخزين التعريفي. كما تستخدم ميلفوس أيضًا مخزن إلخd لتسجيل الخدمة والتحقق من صحتها.

+

تخزين الكائنات

يخزن تخزين الكائنات ملفات لقطات من السجلات، وملفات الفهرس للبيانات القياسية والمتجهة، ونتائج الاستعلام الوسيطة. يستخدم Milvus MinIO كتخزين كائنات ويمكن نشره بسهولة على AWS S3 و Azure Blob، وهما من أكثر خدمات التخزين شيوعًا وفعالية من حيث التكلفة في العالم. ومع ذلك، يتميز تخزين الكائنات بزمن وصول عالٍ ويتقاضى رسومًا حسب عدد الاستعلامات. ولتحسين أدائها وخفض التكاليف، تخطط ميلفوس لتنفيذ فصل البيانات الباردة عن الساخنة على ذاكرة أو تجمع ذاكرة تخزين مؤقت قائم على SSD.

+

وسيط السجل

وسيط السجل هو نظام فرعي يدعم التشغيل. وهو مسؤول عن استمرار تدفق البيانات والإخطار بالأحداث. كما يضمن سلامة البيانات الإضافية عند تعافي العقد العاملة من تعطل النظام. تستخدم مجموعة Milvus العنقودية نظام Pulsar كوسيط سجلات؛ بينما يستخدم نظام Milvus المستقل نظام RocksDB كوسيط سجلات. إلى جانب ذلك، يمكن استبدال وسيط السجل بسهولة بمنصات تخزين البيانات المتدفقة مثل Kafka.

+

تم بناء Milvus حول وسيط السجل ويتبع مبدأ "السجل كبيانات"، لذلك لا يحتفظ Milvus بجدول فعلي ولكنه يضمن موثوقية البيانات من خلال استمرار السجل وسجلات اللقطات.

+

+ + Log_mechanism + آلية_السجل

+

وسيط السجل هو العمود الفقري لميلفوس. وهو مسؤول عن ثبات البيانات وتجزئة القراءة والكتابة، وذلك بفضل آلية pub-sub الفطرية. يُظهر الرسم التوضيحي أعلاه تصويرًا مبسطًا للآلية، حيث ينقسم النظام إلى دورين، وسيط السجل (للحفاظ على تسلسل السجل) ومشترك السجل. يقوم الأول بتسجيل جميع العمليات التي تغير حالات التجميع؛ ويشترك الثاني في تسلسل السجل لتحديث البيانات المحلية ويقدم خدمات على شكل نسخ للقراءة فقط. تتيح آلية pub-sub أيضًا إمكانية توسيع النظام من حيث التقاط بيانات التغيير (CDC) والنشر الموزع عالميًا.

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/architecture/main_components.json b/localization/v2.5.x/site/ar/reference/architecture/main_components.json new file mode 100644 index 000000000..dc1a035fd --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/main_components.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Main Components","anchorList":[{"label":"المكونات الرئيسية","href":"Main-Components","type":1,"isActive":false},{"label":"ميلفوس مستقل","href":"Milvus-standalone","type":2,"isActive":false},{"label":"مجموعة ميلفوس العنقودية","href":"Milvus-cluster","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/architecture/main_components.md b/localization/v2.5.x/site/ar/reference/architecture/main_components.md new file mode 100644 index 000000000..6de9557b5 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/architecture/main_components.md @@ -0,0 +1,98 @@ +--- +id: main_components.md +summary: تعرف على المكونات الرئيسية في Milvus المستقلة والمجموعة العنقودية. +title: المكونات الرئيسية +--- +

المكونات الرئيسية

هناك وضعان لتشغيل Milvus: الوضع المستقل والوضع العنقودي. يشترك هذان الوضعان في نفس الميزات. يمكنك اختيار الوضع الذي يناسب حجم مجموعة بياناتك وبيانات حركة المرور وغير ذلك. في الوقت الراهن، لا يمكن ترقية ميلفوس المستقل "عبر الإنترنت" إلى مجموعة ميلفوس العنقودية.

+

ميلفوس مستقل

يتضمن ميلفوس المستقل ثلاثة مكونات:

+
    +
  • ميلفوس: المكون الوظيفي الأساسي.

  • +
  • مخزن التعريف: محرك البيانات الوصفية الذي يقوم بالوصول إلى البيانات الوصفية لمكونات Milvus الداخلية وتخزينها، بما في ذلك الوكلاء وعقد الفهرس وغيرها.

  • +
  • تخزين الكائنات: محرك التخزين، وهو المسؤول عن ثبات البيانات في ملفوس.

  • +
+

+ + Standalone_architecture + البنية_المستقلة

+

مجموعة ميلفوس العنقودية

تتضمنمجموعة Milvus سبعة مكونات للخدمات المصغرة وثلاثة تبعيات لجهات خارجية. يمكن نشر جميع الخدمات المصغرة على Kubernetes، بشكل مستقل عن بعضها البعض.

+

مكونات الخدمات المصغرة

    +
  • التنسيق الجذري
  • +
  • الوكيل
  • +
  • تنسيق الاستعلام
  • +
  • عقدة الاستعلام
  • +
  • تنسيق البيانات
  • +
  • عقدة الفهرس
  • +
  • عقدة البيانات
  • +
+

تبعيات الطرف الثالث

    +
  • مخزن التعريف: يخزن البيانات الوصفية للمكونات المختلفة في المجموعة، على سبيل المثال.
  • +
  • تخزين الكائنات: مسؤول عن ثبات البيانات للملفات الكبيرة في المجموعة، مثل الفهرس وملفات السجل الثنائي، مثل S3
  • +
  • وسيط السجلات: يدير سجلات عمليات الطفرات الحديثة، ويخرج سجل التدفق، ويوفر خدمات نشر السجل والاشتراك في السجل، مثل Pulsar.
  • +
+

+ + Distributed_architecture + البنية_الموزعة

+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/benchmark.json b/localization/v2.5.x/site/ar/reference/benchmark.json new file mode 100644 index 000000000..948ec7020 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/benchmark.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus 2.2 Benchmark Test Report","anchorList":[{"label":"تقرير اختبار Milvus 2.2.2 المعياري","href":"Milvus-22-Benchmark-Test-Report","type":1,"isActive":false},{"label":"الملخص","href":"Summary","type":2,"isActive":false},{"label":"المصطلحات","href":"Terminology","type":2,"isActive":false},{"label":"بيئة الاختبار","href":"Test-environment","type":2,"isActive":false},{"label":"خط أنابيب الاختبار","href":"Test-pipeline","type":2,"isActive":false},{"label":"نتائج الاختبار","href":"Test-results","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/benchmark.md b/localization/v2.5.x/site/ar/reference/benchmark.md new file mode 100644 index 000000000..697100bba --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/benchmark.md @@ -0,0 +1,279 @@ +--- +id: benchmark.md +summary: تعرف على النتيجة القياسية لميلفوس. +title: تقرير اختبار Milvus 2.2.2 المعياري +--- +

تقرير اختبار Milvus 2.2.2 المعياري

يعرض هذا التقرير نتائج الاختبار الرئيسية لـ Milvus 2.2.0. ويهدف إلى تقديم صورة عن أداء البحث في Milvus 2.2.0، خاصةً في القدرة على التوسيع والتوسع.

+
+
+
+ Milvus Performance Evaluation 2023 +
+
+
+

لقد أجرينا مؤخرًا معيارًا قياسيًا مقابل Milvus 2.2.3 وتوصلنا إلى النتائج الرئيسية التالية:

+
    +
  • انخفاض بمقدار 2.5 أضعاف في زمن انتقال البحث
  • +
  • زيادة بمقدار 4.5 أضعاف في QPS
  • +
  • بحث التشابه على نطاق المليار مع انخفاض طفيف في الأداء
  • +
  • قابلية التوسع الخطي عند استخدام نسخ متماثلة متعددة
  • +
+

للحصول على التفاصيل، يرجى الرجوع إلى هذه الورقة البيضاء ورمز الاختبار القياسي ذي الصلة.

+
+
+

الملخص

    +
  • بالمقارنة مع Milvus 2.1، تزيد QPS في Milvus 2.2.0 من Milvus 2.2.0 بأكثر من 48% في وضع التجميع وأكثر من 75% في الوضع المستقل.
  • +
  • يتمتع Milvus 2.2.0 بقدرة مذهلة على التوسع والتوسع:
      +
    • تزداد QPS خطيًا عند توسيع نوى وحدة المعالجة المركزية من 8 إلى 32 نواة.
    • +
    • تزداد QPS خطيًا عند توسيع نسخ Querynode المتماثلة من 1 إلى 8.
    • +
  • +
+

المصطلحات

+انقر للاطلاع على تفاصيل المصطلحات المستخدمة في الاختبار + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
المصطلحالوصف
ن كيو كيوعدد المتجهات المراد البحث عنها في طلب بحث واحد
توبكعدد أقرب المتجهات المطلوب استرجاعها لكل متجه (في nq) في طلب البحث
هفمعلمة بحث خاصة بفهرس HNSW
RTزمن الاستجابة من إرسال الطلب إلى استلام الاستجابة
كيو بي إسعدد طلبات البحث التي تتم معالجتها بنجاح في الثانية الواحدة
+

+

بيئة الاختبار

يتم إجراء جميع الاختبارات في البيئات التالية.

+

بيئة الأجهزة

+ + + + + + + + +
الأجهزةالمواصفات
وحدة المعالجة المركزيةوحدة المعالجة المركزية Intel® Xeon® Gold 6226R @ 2.90 جيجاهرتز
الذاكرة16*\32 جيجابايت RDIMM، 3200 طن متري/ثانية
قرص SSDSATA 6 جيجابت في الثانية
+

بيئة البرامج

+ + + + + + + +
البرمجياتالإصدار
ميلفوسv2.2.0
مجموعة تطوير البرمجيات Milvus GO SDKv2.2.0
+

مخطط النشر

    +
  • يتم نشر مثيلات Milvus (مستقلة أو عنقودية) عبر Helm على مجموعة Kubernetes على مجموعة Kubernetes استنادًا إلى أجهزة فعلية أو افتراضية.
  • +
  • تختلف الاختبارات المختلفة فقط في عدد نوى وحدة المعالجة المركزية وحجم الذاكرة وعدد النسخ المتماثلة (العقد العاملة)، والتي تنطبق فقط على مجموعات Milvus.
  • +
  • تتطابق التكوينات غير المحددة مع التكوينات الافتراضية.
  • +
  • تخزّن تبعيات Milvus (MinIO وPulsar وEtcd) البيانات على SSD المحلي في كل عقدة.
  • +
  • يتم إرسال طلبات البحث إلى مثيلات Milvus عبر Milvus GO SDK.
  • +
+

مجموعات البيانات

يستخدم الاختبار مجموعة البيانات مفتوحة المصدر SIFT (128 بُعدًا) من ANN-Benchmarks.

+

خط أنابيب الاختبار

    +
  1. قم ببدء تشغيل مثيل Milvus بواسطة Helm مع تكوينات الخادم المعنية كما هو مدرج في كل اختبار.
  2. +
  3. اتصل بنظير Milvus عبر Milvus GO SDK واحصل على نتائج الاختبار المقابلة.
  4. +
  5. إنشاء مجموعة.
  6. +
  7. أدخل مليون ناقل SIFT. أنشئ فهرس HNSW وقم بتكوين معلمات الفهرس عن طريق تعيين M إلى 8 و efConstruction إلى 200.
  8. +
  9. تحميل المجموعة.
  10. +
  11. ابحث بأرقام متزامنة مختلفة مع معلمات البحث nq=1, topk=1, ef=64 ، مدة كل تزامن ساعة واحدة على الأقل.
  12. +
+

نتائج الاختبار

Milvus 2.2.0 v.s. Milvus 2.1.0

الكتلة

+تكوينات الخادم (الكتلة)yaml queryNode: replicas: 1 resources: limits: cpu: "12.0" memory: 8Gi requests: cpu: "12.0" memory: 8Gi

+

أداء البحث

+ + + + + + + + +
ميلفوسQPSمعدل نقل البيانات (TP99) / مللي ثانيةRT(TP50) / مللي ثانيةفشل / ثانية
2.1.0690459280
2.2.01024863240
+

+ + Cluster search performance + أداء البحث العنقودي

+

مستقل

+تكوينات الخادم (مستقل)yaml standalone: replicas: 1 resources: limits: cpu: "12.0" memory: 16Gi requests: cpu: "12.0" memory: 16Gi

+

أداء البحث

+ + + + + + + + +
ميلفوسQPSRT(TP99) / مللي ثانيةRT(TP50) / مللي ثانيةفشل / ثانية
2.1.04287104760
2.2.07522127790
+

+ + Standalone search performance + أداء البحث المستقل

+

توسيع نطاق Milvus 2.2.0 Milvus 2.2.0

قم بتوسيع نوى وحدة المعالجة المركزية في Querynode واحد للتحقق من القدرة على التوسع.

+

+تكوينات الخادم (الكتلة)yaml queryNode: replicas: 1 resources: limits: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi requests: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi

+

أداء البحث

+ + + + + + + + + + +
أنوية وحدة المعالجة المركزيةالعدد المتزامنكيو بي إسمعدل نقل البيانات (TP99) / مللي ثانيةRT(TP50) / مللي ثانيةفشل/ث
85007153127830
123001024863240
166001413585420
326002028163280
+

+ + Search performance by Querynode CPU cores + أداء البحث حسب أنوية وحدة المعالجة المركزية Querynode

+

ميلفوس 2.2.0 توسيع النطاق

قم بتوسيع المزيد من النسخ المتماثلة مع المزيد من Querynodes للتحقق من القدرة على التوسع.

+
+

ملاحظة: عدد Querynodes يساوي replica_number عند تحميل المجموعة.

+
+

+تكوينات الخادم (المجموعة)yaml queryNode: replicas: 1 / 2 / 4 / 8 resources: limits: cpu: "8.0" memory: 8Gi requests: cpu: "8.0" memory: 8Gi

+ + + + + + + + + + +
النسخ المتماثلةالعدد المتزامنكيو بي إسRT(TP99) / مللي ثانيةRT(TP50) / مللي ثانيةفشل/ث
15007153127830
250015903105270
480019281109400
812003065593380
+

+ + Search performance by Querynode replicas + أداء البحث حسب النسخ المتماثلة ل Querynode

+

ما التالي

    +
  • جرّب إجراء اختبارات Milvus 2.2.0 المعيارية بنفسك بالرجوع إلى هذا الدليل، إلا أنه يجب عليك بدلاً من ذلك استخدام Milvus 2.2 و Pymilvus 2.2 في هذا الدليل.
  • +
diff --git a/localization/v2.5.x/site/ar/reference/bitset.json b/localization/v2.5.x/site/ar/reference/bitset.json new file mode 100644 index 000000000..20e1ab564 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/bitset.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Bitset","anchorList":[{"label":"مجموعة البتات","href":"Bitset","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"التنفيذ","href":"Implementation","type":2,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/bitset.md b/localization/v2.5.x/site/ar/reference/bitset.md new file mode 100644 index 000000000..b7ec09687 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/bitset.md @@ -0,0 +1,130 @@ +--- +id: bitset.md +summary: تعرف على مجموعات البتات في ميلفوس. +title: مجموعة البتات +--- +

مجموعة البتات

يقدم هذا الموضوع آلية مجموعة البتات التي تساعد على تمكين الوظائف الرئيسية مثل تصفية السمات وعمليات الحذف في ميلفوس.

+

نظرة عامة

مجموعة البتات هي مجموعة من البتات. البتات هي عناصر ذات قيمتين محتملتين فقط، عادةً 0 و 1 ، أو قيم منطقية true و false. في ميلفوس، مجموعات البتات هي صفائف من أرقام البتات 0 و 1 التي يمكن استخدامها لتمثيل بيانات معينة بشكل مضغوط وفعال على عكس الإنتس أو العوامة أو الأحرف. رقم البت هو 0 بشكل افتراضي ولا يتم تعيينه إلى 1 إلا إذا كان يفي بمتطلبات معينة.

+

تُجرى العمليات على مجموعات البت باستخدام المنطق المنطقي، والتي بموجبها تكون قيمة الخرج إما صالحة أو غير صالحة، ويُشار إليها أيضًا بـ 1 و 0 على التوالي. على سبيل المثال، يمكن استخدام المشغل المنطقي AND للمقارنة بين مجموعتي بتات استنادًا إلى عنصرين في نفس مواضع الفهرس وإنتاج مجموعة بتات جديدة بالنتائج. إذا كان عنصران في موضع ما متماثلين، فسيتم كتابة مجموعة البتات الجديدة 1 في ذلك الموضع؛ 0 إذا كانا مختلفين.

+

التنفيذ

Bitset هي آلية بسيطة لكنها قوية تساعد ميلفوس على تنفيذ تصفية السمات وحذف البيانات والاستعلام مع السفر عبر الزمن.

+

تصفية السمات

بما أن مجموعات البت تحتوي على قيمتين محتملتين فقط، فهي مثالية لتخزين نتائج تصفية السمات. يتم تمييز البيانات التي تفي بمتطلبات مرشح سمة معينة بـ 1.

+

حذف البيانات

تعمل مجموعات البتات كطريقة مضغوطة لتخزين المعلومات حول ما إذا كان صف في مقطع ما قد تم حذفه. يتم وضع علامة على الكيانات المحذوفة بـ 1 في مجموعة البتات المقابلة، والتي لن يتم حسابها أثناء البحث أو الاستعلام.

+

أمثلة

نقدم هنا ثلاثة أمثلة توضح كيفية استخدام مجموعات البتات في ميلفوس، مع إشارات إلى جميع التطبيقات الرئيسية الثلاثة لمجموعات البتات التي تمت مناقشتها أعلاه. في جميع الحالات الثلاث، يوجد مقطع يحتوي على 8 كيانات ثم يتم تنفيذ سلسلة من أحداث لغة معالجة البيانات (DML) بالترتيب الموضح أدناه.

+
    +
  • يتم إدراج أربعة من الكيانات، التي تكون primary_keys [1، 2، 3، 4] على التوالي، عندما يساوي الطابع الزمني ts 100.
  • +
  • يتم إدراج الكيانات الأربعة الباقية، التي primary_keys هي [5، 6، 7، 8]، عندما يساوي الطابع الزمني ts 200.
  • +
  • يتم حذف الكيانات التي primary_keys هي [7، 8] عندما يساوي الطابع الزمني ts 300.
  • +
  • الكيانات التي تكون primary_keys [1، 3، 5، 7] هي فقط الكيانات التي تكون s [1، 3، 5، 7] التي تستوفي شروط تصفية السمات.
  • +
+

+ + Order of DML events + ترتيب أحداث DML

+

الحالة الأولى

في هذه الحالة، يقوم المستخدم بتعيين time_travel على أنه 150، مما يعني أن المستخدم يجري استعلامًا عن البيانات التي تفي ts = 150. يوضح الشكل 1 عملية توليد مجموعة البتات.

+

أثناء مرحلة التصفية الأولية، يجب أن يكون filter_bitset [1, 0, 1, 0, 1, 0, 1, 0] ، حيث يتم تمييز الكيانات [1، 3، 5، 7] على أنها 1 لأنها نتائج تصفية صالحة.

+

ومع ذلك، لم يتم إدراج الكيانات [4، 5، 6، 7] في قاعدة بيانات المتجهات عندما ts يساوي 150. لذلك، يجب تمييز هذه الكيانات الأربعة على أنها 0 بغض النظر عن شرط التصفية. الآن يجب أن تكون نتيجة مجموعة البتات [1, 0, 1, 0, 0, 0, 0, 0].

+

كما تمت مناقشته في حذف البيانات، يتم تجاهل الكيانات التي تم تمييزها بـ 1 أثناء البحث أو الاستعلام. يجب الآن قلب نتيجة مجموعة البتات لكي يتم دمجها مع الصورة النقطية للحذف، مما يعطينا [0, 1, 0, 1, 1, 1, 1, 1].

+

أما بالنسبة لمجموعة بتات الحذف del_bitset ، فيجب أن تكون القيمة الأولية [0, 0, 0, 0, 0, 0, 1, 1]. ومع ذلك، لا يتم حذف الكيانين 7 و 8 حتى ts هو 300. لذلك، عندما يكون ts هو 150، فإن الكيانين 7 و 8 لا يزالان صالحين. ونتيجة لذلك، فإن القيمة del_bitset بعد السفر عبر الزمن هي [0, 0, 0, 0, 0, 0, 0, 0].

+

لدينا الآن مجموعتا بت بعد السفر عبر الزمن وتصفية السمة: filter_bitset [0, 1, 0, 1, 1, 1, 1, 1] و del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . اجمع بين مجموعتي البت هاتين مع عامل المنطق الثنائي OR. القيمة النهائية لـ result_bitset هي [0, 1, 0, 1, 1, 1, 1, 1] ، مما يعني أنه سيتم حساب الكيانين 1 و 3 فقط في مرحلة البحث أو الاستعلام التالية.

+

+ + Figure 1. Search with Time Travel = 150. + الشكل 1. البحث مع السفر عبر الزمن = 150.

+

الحالة الثانية

في هذه الحالة، يضبط المستخدم time_travel على 250. يوضح الشكل 2 عملية توليد مجموعة البتات.

+

كما في الحالة الأولى، تكون مجموعة البتات الأولية filter_bitset هي [1, 0, 1, 0, 1, 0, 1, 0].

+

تكون جميع الكيانات في قاعدة بيانات المتجهات عندما يكون ts = 250. ولذلك، يبقى filter_bitset كما هو عندما نحلل الطابع الزمني. مرة أخرى، نحتاج إلى قلب النتيجة والحصول على [0, 1, 0, 1, 0, 1, 0, 1].

+

أما بالنسبة لمجموعة البتات المحذوفة del_bitset ، فإن القيمة الأولية هي [0, 0, 0, 0, 0, 0, 1, 1]. ومع ذلك، لم يتم حذف الكيانين 7 و 8 حتى ts هو 300. لذلك، عندما يكون ts هو 250، فإن الكيانين 7 و 8 لا يزالان صالحين. ونتيجة لذلك، فإن del_bitset بعد السفر عبر الزمن هو [0, 0, 0, 0, 0, 0, 0, 0].

+

الآن لدينا مجموعتا بت بعد السفر عبر الزمن وتصفية السمة: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] و del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . اجمع بين مجموعتي البت هاتين مع عامل المنطق الثنائي OR. مجموعة_البتات الناتجة هي [0, 1, 0, 1, 0, 1, 0, 1]. وهذا يعني أنه لن يتم احتساب سوى العناصر [1، 3، 5، 7] في مرحلة البحث أو الاستعلام التالية.

+

+ + Figure 2. Search with Time Travel = 250. + الشكل 2. البحث مع السفر عبر الزمن = 250.

+

الحالة الثالثة

في هذه الحالة، يضبط المستخدم time_travel على 350. يوضح الشكل 3 عملية توليد مجموعة البتات.

+

كما هو الحال مع الحالات السابقة، تكون مجموعة البتات الأولية filter_bitset هي [0, 1, 0, 1, 0, 1, 0, 1].

+

تكون جميع الكيانات في قاعدة بيانات المتجهات عندما يكون ts= 350. وبالتالي، فإن مجموعة البتات النهائية المقلوبة filter_bitset هي [0, 1, 0, 1, 0, 1, 0, 1] ، كما في الحالة الثانية.

+

أما بالنسبة إلى مجموعة البتات المحذوفة del_bitset ، نظرًا لأن الكيانين 7 و 8 قد تم حذفهما بالفعل عند ts = 350 ، وبالتالي، فإن نتيجة del_bitset هي [0, 0, 0, 0, 0, 0, 1, 1].

+

الآن لدينا مجموعتا بت بعد السفر عبر الزمن وتصفية السمات: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] و del_bitset [0, 0, 0, 0, 0, 0, 1, 1] . اجمع بين مجموعتي البت هاتين مع عامل المنطق الثنائي OR. النهائي result_bitset هو [0, 1, 0, 1, 0, 1, 1, 1]. وهذا يعني أنه سيتم حساب الكيانات [1، 3، 5] فقط في مرحلة البحث أو الاستعلام التالية.

+

+ + Figure 3. Search with Time Travel = 350. + الشكل 3. البحث مع السفر عبر الزمن = 350.

+

ما التالي

الآن بعد أن عرفت كيف تعمل مجموعات البتات في ميلفوس، قد ترغب أيضًا بـ

+ diff --git a/localization/v2.5.x/site/ar/reference/coordinator_ha.json b/localization/v2.5.x/site/ar/reference/coordinator_ha.json new file mode 100644 index 000000000..069d7b89e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/coordinator_ha.json @@ -0,0 +1 @@ +{"codeList":["rootCoordinator:\n enabled: true\n # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.\n replicas: 2 # Otherwise, remove this configuration item.\n resources: {}\n nodeSelector: {}\n affinity: {}\n tolerations: []\n extraEnv: []\n heaptrack:\n enabled: false\n profiling:\n enabled: false # Enable live profiling\n activeStandby:\n enabled: true # Set this to true to have RootCoordinators work in active-standby mode.\n"," rootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.2.3\n command: [\"milvus\", \"run\", \"rootcoord\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n PULSAR_ADDRESS: pulsar://pulsar:6650\n ROOT_COORD_ADDRESS: rootcoord:53100\n # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n depends_on:\n - \"etcd\"\n - \"pulsar\"\n - \"minio\"\n\n# add the following to have RootCoords work in active-standby mode\n# rootcoord-1:\n# container_name: milvus-rootcoord-1\n# image: milvusdb/milvus:v2.2.3\n# command: [\"milvus\", \"run\", \"rootcoord\"]\n# environment:\n# ETCD_ENDPOINTS: etcd:2379\n# MINIO_ADDRESS: minio:9000\n# PULSAR_ADDRESS: pulsar://pulsar:6650\n# ROOT_COORD_ADDRESS: rootcoord-1:53100\n# # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n# depends_on:\n# - \"etcd\"\n# - \"pulsar\"\n# - \"minio\"\n","sudo ./scripts/start_cluster.sh\n","rootCoord:\n address: localhost\n port: 53100 # change to 53001\n","sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &\n","ps aux|grep milvus\n","> ps aux|grep milvus\nroot 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord\nroot 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy\nroot 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord\n...\n","[INFO] [sessionutil/session_util.go:649] [\"serverName: rootcoord is in STANDBY ...\"]\n","[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord-15\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] [\"stop watching ACTIVE key\"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] [\"start retrying to register as ACTIVE service...\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] [\"register ACTIVE service successfully\"] [ServerID=19]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] [\"quit STANDBY mode, this node will become ACTIVE\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] [\"rootcoord switch from standby to active, activating\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] [\"RootCoord Register Finished\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] [\"RootCoord start done ...\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] [\"RootCoord successfully started\"]\n"],"headingContent":"Coordinator HA","anchorList":[{"label":"المنسق HA","href":"Coordinator-HA","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"تمكين المنسق HA","href":"Enable-coordinator-HA","type":2,"isActive":false},{"label":"عناصر التكوين ذات الصلة","href":"Related-configuration-items","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/coordinator_ha.md b/localization/v2.5.x/site/ar/reference/coordinator_ha.md new file mode 100644 index 000000000..fee2e5340 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/coordinator_ha.md @@ -0,0 +1,193 @@ +--- +id: coordinator_ha.md +summary: تعرف على دوافع وإجراءات عمل منسقي ميلفوس في وضع الاستعداد النشط. +title: المنسق HA +--- +

المنسق HA

كما هو موضح في بنية Milvus، تتكون Milvus من العديد من المكونات وتعمل بطريقة موزعة. من بين جميع المكونات، يضمن Milvus التوافر العالي للعاملين من خلال زيادة وتوسيع نطاق العقد، مما يجعل المنسقين الحلقة الضعيفة الوحيدة في السلسلة.

+

نظرة عامة

في الإصدار 2.2.3، يطبّق Milvus التوافر العالي للمنسقين لجعلهم يعملون في وضع الاستعداد النشط، مما يخفف من نقاط الفشل الأحادية المحتملة (SPoFs) التي يمكن أن تؤدي إلى عدم توفر الخدمة.

+

+ + Coordinator HA + المنسق HA

+

يوضح الشكل أعلاه كيفية عمل المنسقين في وضع الاستعداد النشط. عند بدء تشغيل زوج من المنسقين، يقومون بالتسجيل في etcd باستخدام معرف الخادم الخاص بهم ويتنافسون على الدور النشط. المنسق الذي ينجح في استئجار الدور النشط من الخادم سيبدأ في الخدمة، وسيبقى المنسق الآخر في الزوج في وضع الاستعداد، يراقب الدور النشط ويكون جاهزًا للخدمة في حالة وفاة المنسق النشط.

+

تمكين المنسق HA

مع Helm

لبدء تشغيل منسقين متعددين وجعلهم يعملون في وضع الاستعداد النشط، يجب عليك إجراء التغييرات التالية على ملف values.yaml.

+
    +
  • قم بتعيين xxxCoordinator.replicas إلى 2.
  • +
  • قم بتعيين xxxCoordinator.activeStandby.enabled إلى true.
  • +
+

يستخدم مقتطف التعليمات البرمجية التالي RootCoord كمثال. يمكنك فعل الشيء نفسه مع المنسقين من الأنواع الأخرى.

+
rootCoordinator:
+  enabled: true
+  # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.
+  replicas: 2  # Otherwise, remove this configuration item.
+  resources: {}
+  nodeSelector: {}
+  affinity: {}
+  tolerations: []
+  extraEnv: []
+  heaptrack:
+    enabled: false
+  profiling:
+    enabled: false  # Enable live profiling
+  activeStandby:
+    enabled: true  # Set this to true to have RootCoordinators work in active-standby mode.
+
+

باستخدام Docker

لبدء تشغيل منسقين متعددين وجعلهم يعملون في وضع الاستعداد النشط، يمكنك إضافة بعض التعريفات إلى ملف docker-compose الذي تستخدمه لبدء تشغيل مجموعة ميلفوس الخاصة بك.

+

يستخدم مقتطف الشيفرة التالي RootCoord كمثال. يمكنك فعل الشيء نفسه مع المنسقين من الأنواع الأخرى.

+
  rootcoord:
+    container_name: milvus-rootcoord
+    image: milvusdb/milvus:v2.2.3
+    command: ["milvus", "run", "rootcoord"]
+    environment:
+      ETCD_ENDPOINTS: etcd:2379
+      MINIO_ADDRESS: minio:9000
+      PULSAR_ADDRESS: pulsar://pulsar:6650
+      ROOT_COORD_ADDRESS: rootcoord:53100
+      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
+      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
+    depends_on:
+      - "etcd"
+      - "pulsar"
+      - "minio"
+
+#   add the following to have RootCoords work in active-standby mode
+#   rootcoord-1:
+#    container_name: milvus-rootcoord-1
+#    image: milvusdb/milvus:v2.2.3
+#    command: ["milvus", "run", "rootcoord"]
+#    environment:
+#      ETCD_ENDPOINTS: etcd:2379
+#      MINIO_ADDRESS: minio:9000
+#      PULSAR_ADDRESS: pulsar://pulsar:6650
+#      ROOT_COORD_ADDRESS: rootcoord-1:53100
+#      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
+#      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
+#    depends_on:
+#      - "etcd"
+#      - "pulsar"
+#      - "minio"
+
+

مع قذيفة ماك/لينكس

لبدء تشغيل عدة منسقين وجعلهم يعملون في وضع الاستعداد النشط، يمكنك

+
    +
  1. تحميل التعليمات البرمجية المصدرية لـ Milvus على محرك الأقراص المحلي، وبدء تشغيل مجموعة Milvus من التعليمات البرمجية المصدرية كما يلي:

    +
    sudo ./scripts/start_cluster.sh
    +
    +

    يعمل Milvus بمنسق واحد فقط من كل نوع في نهاية هذه الخطوة.

  2. +
  3. قم بتحديث milvus.yaml لتغيير رقم منفذ المنسق من كل نوع. يستخدم ما يلي rootCoord كمثال.

    +
    rootCoord:
    +  address: localhost
    +  port: 53100 # change to 53001
    +
  4. +
  5. ابدأ تشغيل المنسق الاحتياطي.

    +
    sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
    +
    +

    في نهاية هذه الخطوة، قم بتشغيل الأمر التالي للتحقق من وجود عمليتي منسقين.

    +
    ps aux|grep milvus
    +
    +

    يجب أن تكون المخرجات مشابهة لـ

    +
    > ps aux|grep milvus
    +root        12813   0.7 0.2 410709648   82432   ??  S   5:18PM  0:33.28 ./bin/milvus run rootcoord
    +root        12816   0.5 0.2 409487968   62352   ??  S   5:18PM  0:22.69 ./bin/milvus run proxy
    +root        17739   0.1 0.3 410289872   91792 s003  SN  6:01PM  0:00.30 ./bin/milvus run rootcoord
    +...
    +
    +

    ويقوم المنسق الاحتياطي بإخراج إدخال سجل كل عشر ثوانٍ على النحو التالي:

    +
    [INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
    +
  6. +
  7. أوقف المنسق النشط في زوج وراقب سلوك المنسق الاحتياطي.

    +

    يمكنك أن تجد أن الأمر يستغرق 60 ثانية حتى يتولى المنسق الاحتياطي الدور النشط.

    +
    [2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "]
    +[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "]
    +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"]
    +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."]
    +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19]
    +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"]
    +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"]
    +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"]
    +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."]
    +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
    +
  8. +
+

يتم تعطيل المنسق HA افتراضيًا. ويمكنك تمكين هذه الميزة يدويًا عن طريق تغيير العناصر التالية في ملف تكوين Milvus.

+ +

الحدود

لا يوجد حالياً ضمان تناسق قوي بين الخدمة النشطة والخدمة الاحتياطية. لذلك، يحتاج المنسق الاحتياطي إلى إعادة تحميل البيانات الوصفية أثناء تولي الدور النشط.

+

لا يقوم Etcd بإصدار عقد إيجار إلا بعد انتهاء مهلة جلسة العمل الحالية. يتم تحديد المهلة الافتراضية لجلسة العمل بـ 60 ثانية. ولذلك، توجد فجوة مدتها 60 ثانية بين وقت وفاة المنسق النشط ووقت تولي المنسق الاحتياطي للدور النشط.

diff --git a/localization/v2.5.x/site/ar/reference/disk_index.json b/localization/v2.5.x/site/ar/reference/disk_index.json new file mode 100644 index 000000000..a8395c079 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/disk_index.json @@ -0,0 +1 @@ +{"codeList":["...\nDiskIndex:\n MaxDegree: 56\n SearchListSize: 100\n PQCodeBugetGBRatio: 0.125\n SearchCacheBudgetGBRatio: 0.125\n BeamWidthRatio: 4.0\n...\n"],"headingContent":"On-disk Index","anchorList":[{"label":"الفهرسة على القرص","href":"On-disk-Index","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"إعدادات الفهرس والبحث","href":"Index-and-search-settings","type":2,"isActive":false},{"label":"تكوينات ميلفوس ذات الصلة بـ DiskANN","href":"DiskANN-related-Milvus-configurations","type":2,"isActive":false},{"label":"استكشاف الأخطاء وإصلاحها","href":"Troubleshooting","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/disk_index.md b/localization/v2.5.x/site/ar/reference/disk_index.md new file mode 100644 index 000000000..2dadfbbf3 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/disk_index.md @@ -0,0 +1,159 @@ +--- +id: disk_index.md +related_key: disk_index +summary: آلية فهرس الأقراص في ميلفوس. +title: الفهرسة على القرص +--- +

الفهرسة على القرص

تقدم هذه المقالة خوارزمية فهرسة على القرص باسم DiskANN. استنادًا إلى الرسوم البيانية Vamana، تعمل DiskANN على تشغيل عمليات بحث فعالة ضمن مجموعات البيانات الكبيرة.

+

لتحسين أداء الاستعلام، يمكنك تحديد نوع فهرس لكل حقل متجه.

+
+يدعم الحقل المتجه حاليًا نوع فهرس واحد فقط. يقوم ميلفوس تلقائيًا بحذف الفهرس القديم عند تبديل نوع الفهرس.
+

المتطلبات الأساسية

لاستخدام DiskANN، لاحظ أن

+
    +
  • يتم تعطيل DiskANN افتراضيًا. إذا كنت تفضل الفهرس داخل الذاكرة على الفهرس على القرص، يُنصح بتعطيل هذه الميزة للحصول على أداء أفضل.
      +
    • لتعطيلها، يمكنك تغيير queryNode.enableDisk إلى false في ملف تكوين ميلفوس الخاص بك.
    • +
    • لتمكينها مرة أخرى، يمكنك تعيين queryNode.enableDisk إلى true.
    • +
  • +
  • يعمل مثيل Milvus على Ubuntu 18.04.6 أو إصدار أحدث.
  • +
  • يجب تثبيت مسار بيانات Milvus على محرك أقراص NVMe SSD للحصول على أداء كامل:
      +
    • بالنسبة لمثيل Milvus Standalone، يجب أن يكون مسار البيانات هو /var/lib/milvus/data في الحاوية التي يعمل فيها المثيل.
    • +
    • بالنسبة إلى مثيل Milvus Cluster، يجب أن يكون مسار البيانات /var/lib/milvus/data في الحاويات التي يتم فيها تشغيل QueryNodes و IndexNodes.
    • +
  • +
+

الحدود

لاستخدام DiskANN، تأكد من أنك

+
    +
  • استخدم فقط المتجهات العائمة ذات الأبعاد 1 على الأقل في بياناتك.
  • +
  • استخدم فقط المسافة الإقليدية (L2) أو الضرب الداخلي (IP) أو COSINE لقياس المسافة بين المتجهات.
  • +
+

إعدادات الفهرس والبحث

    +
  • معلمات بناء الفهرس

    +

    عند إنشاء فهرس DiskANN، استخدم DISKANN كنوع الفهرس. لا توجد معلمات فهرس ضرورية.

  • +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    search_listحجم القائمة المرشحة، الحجم الأكبر يوفر معدل استرجاع أعلى مع أداء متدهور.[topk, int32_max]16
    +
  • +
+

DiskANN قابل للضبط. يمكنك تعديل المعلمات المتعلقة بـ DiskANN في ${MILVUS_ROOT_PATH}/configs/milvus.yaml لتحسين أدائه.

+
...
+DiskIndex:
+  MaxDegree: 56
+  SearchListSize: 100
+  PQCodeBugetGBRatio: 0.125
+  SearchCacheBudgetGBRatio: 0.125
+  BeamWidthRatio: 4.0
+...
+
+ + + + + + + + + + + +
المعلمةالوصفنطاق القيمةالقيمة الافتراضية
MaxDegreeالدرجة القصوى للرسم البياني لفامانا.
توفر القيمة الأكبر معدل استرجاع أعلى ولكنها تزيد من حجم الفهرس والوقت اللازم لبناء الفهرس.
[1, 512]56
SearchListSizeحجم القائمة المرشحة.
تزيد القيمة الأكبر من الوقت المستغرق في بناء الفهرس ولكنها توفر معدل استدعاء أعلى.
اضبطه على قيمة أصغر من MaxDegree إلا إذا كنت بحاجة إلى تقليل وقت بناء الفهرس.
[1, int32_max]100
PQCodeBugetGBRatioالحد الأقصى لحجم رمز PQ.
توفر القيمة الأكبر معدل استدعاء أعلى ولكنها تزيد من استخدام الذاكرة.
(0.0, 0.25]0.125
SearchCacheBudgetGBRatioنسبة أرقام العقد المخزنة مؤقتاً إلى البيانات الأولية.
تؤدي القيمة الأكبر إلى تحسين أداء بناء الفهرس مع زيادة استخدام الذاكرة.
[0.0, 0.3)0.10
BeamWidthRatioالنسبة بين الحد الأقصى لعدد طلبات الإدخال والإخراج لكل تكرار بحث ورقم وحدة المعالجة المركزية.[1، الحد الأقصى (128 / رقم وحدة المعالجة المركزية، 16)]4.0
+

استكشاف الأخطاء وإصلاحها

    +
  • كيفية التعامل مع الخطأ io_setup() failed; returned -11, errno=11:Resource temporarily unavailable ؟

    +

    يوفر Linux kernel ميزة الإدخال/الإخراج غير المتزامن غير المحظور (AIO) التي تسمح للعملية ببدء عمليات إدخال/إخراج متعددة في وقت واحد دون الحاجة إلى انتظار اكتمال أي منها. يساعد ذلك في تعزيز الأداء للتطبيقات التي يمكن أن تتداخل فيها المعالجة مع الإدخال/الإخراج.

    +

    يمكن ضبط الأداء باستخدام الملف الظاهري /proc/sys/fs/aio-max-nr في نظام الملفات proc. تحدد المعلمة aio-max-nr الحد الأقصى لعدد الطلبات المتزامنة المسموح بها.

    +

    يتم تعيين aio-max-nr افتراضيًا على 65535 ، ويمكنك ضبطه حتى 10485760.

  • +
diff --git a/localization/v2.5.x/site/ar/reference/glossary.json b/localization/v2.5.x/site/ar/reference/glossary.json new file mode 100644 index 000000000..d1d3d0b8b --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/glossary.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Terminology","anchorList":[{"label":"المصطلحات","href":"Terminology","type":1,"isActive":false},{"label":"المعرف التلقائي","href":"AutoID","type":2,"isActive":false},{"label":"الفهرس التلقائي","href":"Auto-Index","type":2,"isActive":false},{"label":"أتو","href":"Attu","type":2,"isActive":false},{"label":"بيردواتشر","href":"Birdwatcher","type":2,"isActive":false},{"label":"الكاتب بالجملة","href":"Bulk-Writer","type":2,"isActive":false},{"label":"الإدراج بالجملة","href":"Bulk-Insert","type":2,"isActive":false},{"label":"الكاردينال","href":"Cardinal","type":2,"isActive":false},{"label":"القناة","href":"Channel","type":2,"isActive":false},{"label":"المجموعة","href":"Collection","type":2,"isActive":false},{"label":"التبعية","href":"Dependency","type":2,"isActive":false},{"label":"المخطط الديناميكي","href":"Dynamic-schema","type":2,"isActive":false},{"label":"التضمينات","href":"Embeddings","type":2,"isActive":false},{"label":"الكيان","href":"Entity","type":2,"isActive":false},{"label":"الحقل","href":"Field","type":2,"isActive":false},{"label":"التصفية","href":"Filter","type":2,"isActive":false},{"label":"البحث المصفى","href":"Filtered-search","type":2,"isActive":false},{"label":"البحث المختلط","href":"Hybrid-search","type":2,"isActive":false},{"label":"الفهرس","href":"Index","type":2,"isActive":false},{"label":"موصل كافكا- ميلفوس","href":"Kafka-Milvus-Connector","type":2,"isActive":false},{"label":"نوير","href":"Knowhere","type":2,"isActive":false},{"label":"وسيط السجل","href":"Log-broker","type":2,"isActive":false},{"label":"لقطة السجل","href":"Log-snapshot","type":2,"isActive":false},{"label":"مشتركو السجل","href":"Log-subscriber","type":2,"isActive":false},{"label":"تخزين الرسائل","href":"Message-storage","type":2,"isActive":false},{"label":"نوع القياس","href":"Metric-type","type":2,"isActive":false},{"label":"Mmap","href":"Mmap","type":2,"isActive":false},{"label":"ميلفوس النسخ الاحتياطي","href":"Milvus-Backup","type":2,"isActive":false},{"label":"ميلفوس CDC","href":"Milvus-CDC","type":2,"isActive":false},{"label":"واجهة أوامر Milvus CLI","href":"Milvus-CLI","type":2,"isActive":false},{"label":"Milvus Migration","href":"Milvus-Migration","type":2,"isActive":false},{"label":"مجموعة ميلفوس العنقودية","href":"Milvus-cluster","type":2,"isActive":false},{"label":"ميلفوس مستقل","href":"Milvus-standalone","type":2,"isActive":false},{"label":"متعدد المتجهات","href":"Multi-Vector","type":2,"isActive":false},{"label":"التقسيم","href":"Partition","type":2,"isActive":false},{"label":"مفتاح التقسيم","href":"Partition-key","type":2,"isActive":false},{"label":"قناة PChannel","href":"PChannel","type":2,"isActive":false},{"label":"PyMilvus","href":"PyMilvus","type":2,"isActive":false},{"label":"الاستعلام","href":"Query","type":2,"isActive":false},{"label":"بحث النطاق","href":"Range-search","type":2,"isActive":false},{"label":"المخطط","href":"Schema","type":2,"isActive":false},{"label":"بحث","href":"Search","type":2,"isActive":false},{"label":"المقطع","href":"Segment","type":2,"isActive":false},{"label":"موصل Spark-Milvus Connector","href":"Spark-Milvus-Connector","type":2,"isActive":false},{"label":"شارد","href":"Shard","type":2,"isActive":false},{"label":"المتجهات المتفرقة","href":"Sparse-vector","type":2,"isActive":false},{"label":"البيانات غير المهيكلة","href":"Unstructured-data","type":2,"isActive":false},{"label":"القناة المنطقية","href":"VChannel","type":2,"isActive":false},{"label":"المتجه","href":"Vector","type":2,"isActive":false},{"label":"سحابة زيليز","href":"Zilliz-Cloud","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/glossary.md b/localization/v2.5.x/site/ar/reference/glossary.md new file mode 100644 index 000000000..65594fbe7 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/glossary.md @@ -0,0 +1,806 @@ +--- +id: glossary.md +title: المصطلحات +--- +

المصطلحات

المعرف التلقائي

المعرف التلقائي هو سمة من سمات الحقل الأساسي التي تحدد ما إذا كان سيتم تمكين التعيين التلقائي للحقل الأساسي. يتم تحديد قيمة المعرف التلقائي بناءً على الطابع الزمني. لمزيد من المعلومات، ارجع إلى create_schema.

+

الفهرس التلقائي

يقرر Milvus تلقائيًا نوع الفهرس الأنسب والبارامترات لحقل معين بناءً على البيانات التجريبية. يعد هذا الأمر مثاليًا للحالات التي لا تحتاج فيها إلى التحكم في بارامترات الفهرس المحددة. لمزيد من المعلومات، راجع إضافة_فهرس.

+

أتو

Attu هي أداة إدارة شاملة لـ Milvus تقلل بشكل كبير من تعقيد وتكلفة إدارة النظام.

+

بيردواتشر

Birdwatcher هي أداة لتصحيح الأخطاء لـ Milvus تتصل بـ etcd، مما يسمح لك بمراقبة حالة خادم Milvus وإجراء التعديلات في الوقت الفعلي. كما أنها تدعم النسخ الاحتياطية لملفات إلخd، مما يساعد المطورين في استكشاف الأخطاء وإصلاحها.

+

الكاتب بالجملة

الكاتب بالجملة هي أداة معالجة البيانات التي توفرها حزم تطوير البرمجيات Milvus SDKs (مثل PyMilvus وJava SDK)، وهي مصممة لتحويل مجموعات البيانات الأولية إلى تنسيق متوافق مع Milvus لاستيرادها بكفاءة.

+

الإدراج بالجملة

الإدراج المجمّع هو واجهة برمجة تطبيقات تعمل على تحسين أداء الكتابة من خلال السماح باستيراد ملفات متعددة في طلب واحد، مما يحسّن العمليات مع مجموعات البيانات الكبيرة.

+

الكاردينال

الكاردينال، الذي طورته Zilliz Cloud، هو خوارزمية بحث متجهية متطورة توفر جودة بحث وأداء لا مثيل لهما. وبفضل تصميمها المبتكر والتحسينات الشاملة التي أدخلت عليها، تتفوق Cardinal على Knowhere بعدة أضعاف إلى عدة مرات إلى حد كبير مع التعامل التكيفي مع سيناريوهات الإنتاج المتنوعة، مثل أحجام K المتفاوتة، والتصفية العالية، وتوزيعات البيانات المختلفة، وما إلى ذلك.

+

القناة

يستخدم Milvus نوعين من القنوات، قناة PC وقناة V. تتوافق كل قناة PChannel مع موضوع لتخزين السجل، بينما تتوافق كل قناة VChannel مع جزء في مجموعة.

+

المجموعة

في ميلفوس، تكافئ المجموعة جدولاً في نظام إدارة قواعد البيانات العلائقية (RDBMS). المجموعات هي كائنات منطقية رئيسية تستخدم لتخزين الكيانات وإدارتها. لمزيد من المعلومات، راجع إدارة المجموعات.

+

التبعية

التبعية هي برنامج يعتمد عليه برنامج آخر للعمل. وتتضمن تبعيات ميلفوس etcd (تخزين البيانات الوصفية) وMinIO أو S3 (تخزين الكائنات) وPulsar (إدارة سجلات اللقطات). لمزيد من المعلومات، راجع إدارة التبعيات.

+

المخطط الديناميكي

يسمح لك المخطط الديناميكي بإدراج كيانات بحقول جديدة في مجموعة دون تعديل المخطط الحالي. وهذا يعني أنه يمكنك إدراج البيانات دون معرفة المخطط الكامل للمجموعة ويمكنك تضمين الحقول التي لم يتم تعريفها بعد. يمكنك تمكين هذه الإمكانية الخالية من المخطط عن طريق تمكين الحقل الديناميكي عند إنشاء مجموعة. لمزيد من المعلومات، راجع تمكين الحقل الديناميكي.

+

التضمينات

يوفر Milvus وظائف تضمين مضمنة تعمل مع موفري التضمين المشهورين. قبل إنشاء مجموعة في Milvus، يمكنك استخدام هذه الدوال لإنشاء تضمينات لمجموعات البيانات الخاصة بك، مما يسهل عملية إعداد البيانات وعمليات البحث المتجهة. لإنشاء تضمينات أثناء العمل، راجع استخدام نموذج PyMilvus لتوليد تضمينات نصية.

+

الكيان

يتكون الكيان من مجموعة من الحقول التي تمثل كائنات العالم الحقيقي. يتم تمثيل كل كيان في ميلفوس بمفتاح أساسي فريد.

+

يمكنك تخصيص المفاتيح الأساسية. إذا لم تقم بالتكوين يدويًا، يقوم Milvus تلقائيًا بتعيين المفتاح الأساسي للكيانات. إذا اخترت تخصيص المفتاح الأساسي، لاحظ أن Milvus لا يدعم إلغاء تكرار المفتاح الأساسي في الوقت الحالي. لذلك، يمكن أن تكون هناك مفاتيح أساسية مكررة في نفس المجموعة. لمزيد من المعلومات، راجع إدراج الكيانات.

+

الحقل

يكافئ الحقل في مجموعة Milvus عمود جدول في نظام إدارة المحتوى الرقمي RDBMS. يمكن أن تكون الحقول إما حقولًا قياسية للبيانات المهيكلة (مثل الأرقام والسلاسل)، أو حقولًا متجهة لتضمين المتجهات.

+

التصفية

يدعم Milvus التصفية العددية من خلال البحث باستخدام المسندات، مما يسمح لك بتحديد شروط التصفية ضمن الاستعلامات وعمليات البحث لتحسين النتائج.

+

يطبق البحث المصفى عوامل التصفية القياسية على عمليات البحث بالمتجهات، مما يسمح لك بتنقيح نتائج البحث بناءً على معايير محددة. لمزيد من المعلومات، راجع البحث المصفى.

+

البحث الهجين عبارة عن واجهة برمجة تطبيقات للبحث المختلط منذ الإصدار 2.4.0 من ميلفوس. يمكنك البحث في حقول متجهات متعددة ودمجها. بالنسبة للبحث المتجه المدمج مع تصفية الحقول القياسية، يشار إليه باسم "البحث المصفى". لمزيد من المعلومات، راجع البحث الهجين.

+

الفهرس

فهرس المتجهات هو بنية بيانات معاد تنظيمها مشتقة من البيانات الأولية التي يمكنها تسريع عملية البحث عن تشابه المتجهات بشكل كبير. يدعم ميلفوس مجموعة واسعة من أنواع الفهارس لكل من الحقول المتجهة والحقول القياسية. لمزيد من المعلومات، راجع أنواع فهرس المتجهات.

+

موصل كافكا- ميلفوس

يشير موصلKafka-Milvus Connect or إلى موصل بالوعة Kafka لميلفوس. يسمح لك بدفق البيانات المتجهة من كافكا إلى ميلفوس.

+

نوير

نوهير هو محرك التنفيذ المتجه الأساسي ل Milvus والذي يتضمن العديد من مكتبات البحث عن التشابه المتجه بما في ذلك Faiss و Hnswlib و Annoy. تم تصميم Knowhere أيضًا لدعم الحوسبة غير المتجانسة. فهو يتحكم في الأجهزة (وحدة المعالجة المركزية أو وحدة معالجة الرسومات) لتنفيذ طلبات بناء الفهرس والبحث. هكذا حصل نوير على اسمه - معرفة مكان تنفيذ العمليات.

+

وسيط السجل

وسيط السجل هو نظام نشر-اشتراك يدعم التشغيل. وهو مسؤول عن استمرارية البيانات المتدفقة، وتنفيذ الاستعلامات غير المتزامنة الموثوقة، والإخطار بالأحداث، وإرجاع نتائج الاستعلام. كما يضمن سلامة البيانات الإضافية عند تعافي العقد العاملة من تعطل النظام.

+

لقطة السجل

لقطة السجل هي عبارة عن سجل ثنائي، وهو عبارة عن وحدة أصغر في المقطع الذي يسجل ويعالج التحديثات والتغييرات التي تم إجراؤها على البيانات في ميلفوس. يتم الاحتفاظ بالبيانات من مقطع في سجلات ثنائية متعددة. هناك ثلاثة أنواع من السجلات الثنائية في ميلفوس: إدراج سجلات ثنائية وحذف سجلات ثنائية وحذف سجلات ثنائية. لمزيد من المعلومات، راجع تخزين التعريف.

+

مشتركو السجل

يشترك مشتركو السجل في تسلسل السجل لتحديث البيانات المحلية وتوفير الخدمات في شكل نسخ للقراءة فقط.

+

تخزين الرسائل

تخزين الرسائل هو محرك تخزين السجل في ملفوس. يدعم Milvus Kafka أو Pulsa كمخزن للرسائل. لمزيد من المعلومات، راجع تكوين تخزين الرسائل.

+

نوع القياس

تُستخدم أنواع مقاييس التشابه لقياس أوجه التشابه بين المتجهات. يدعم ميلفوس حاليًا المسافة الإقليدية (L2)، والمنتج الداخلي (IP)، والتشابه في جيب التمام (COSINE)، وأنواع المقاييس الثنائية. يمكنك اختيار نوع المقياس الأنسب بناءً على السيناريو الخاص بك. لمزيد من المعلومات، راجع مقاييس التشابه.

+

Mmap

تعمل الملفات المعينة بالذاكرة على تمكين معالجة البيانات بكفاءة من خلال تعيين محتويات الملف مباشرةً في الذاكرة. وهذا مفيد بشكل خاص عندما تكون الذاكرة محدودة ويكون تحميل جميع البيانات غير ممكن. يمكن لهذه التقنية تعزيز سعة البيانات والحفاظ على الأداء إلى حد ما. ومع ذلك، إذا تجاوزت البيانات سعة الذاكرة بشكل كبير، فقد تنخفض سرعات البحث والاستعلام بشكل كبير. لمزيد من المعلومات، ارجع إلى تخزين البيانات الممكّنة لـ MM-ap.

+

ميلفوس النسخ الاحتياطي

Milvus Backup هو أداة لإنشاء نسخ من البيانات، والتي يمكن استخدامها لاستعادة النسخة الأصلية بعد حدث فقدان البيانات.

+

ميلفوس CDC

أداة MilvusCDC (التقاط بيانات التغيير) هي أداة سهلة الاستخدام يمكنها التقاط ومزامنة البيانات الإضافية في مثيلات Milvus. وهي تضمن موثوقية بيانات الأعمال من خلال نقلها بسلاسة بين مثيلات المصدر والهدف، مما يسمح بسهولة النسخ الاحتياطي التزايدي واستعادة البيانات بعد الكوارث.

+

واجهة أوامر Milvus CLI

واجهة سطر الأوامر Milvus (CLI) هي أداة سطر أوامر تدعم الاتصال بقاعدة البيانات وعمليات البيانات واستيراد البيانات وتصديرها. استنادًا إلى Milvus Python SDK، فهي تسمح بتنفيذ الأوامر من خلال محطة طرفية باستخدام مطالبات سطر الأوامر التفاعلية.

+

Milvus Migration

MilvusMigration هي أداة مفتوحة المصدر مصممة لتسهيل ترحيل البيانات بسهولة من مصادر بيانات مختلفة إلى Milvus 2.x.

+

مجموعة ميلفوس العنقودية

في النشر العنقودي ل Milvus، يتم توفير الخدمات من قبل مجموعة من العقد لتحقيق التوافر العالي وقابلية التوسع بسهولة.

+

ميلفوس مستقل

في النشر المستقل ل Milvus، يتم إكمال جميع العمليات بما في ذلك إدراج البيانات، وبناء الفهرس، والبحث عن تشابه المتجهات في عملية واحدة.

+

متعدد المتجهات

يدعم Milvus حقول متجهات متعددة في مجموعة واحدة منذ الإصدار 2.4.0. لمزيد من المعلومات، راجع البحث المختلط.

+

التقسيم

التقسيم هو تقسيم مجموعة. يدعم Milvus تقسيم بيانات المجموعة إلى أجزاء متعددة على وحدة تخزين فعلية. وتسمى هذه العملية بالتقسيم، ويمكن أن يحتوي كل قسم على أجزاء متعددة. لمزيد من المعلومات، راجع إدارة الأقسام.

+

مفتاح التقسيم

تتيح سمة مفتاح التقسيم لحقل ما فصل الكيانات إلى أقسام متميزة بناءً على قيم مفتاح التقسيم الخاصة بها. يضمن هذا التجميع أن يتم تخزين الكيانات التي تتشارك نفس قيمة المفتاح معًا، مما يمكن أن يسرع من عمليات البحث من خلال السماح للنظام بتجاوز الأقسام غير ذات الصلة أثناء الاستعلامات التي تمت تصفيتها بواسطة حقل مفتاح التقسيم. لمزيد من المعلومات، راجع استخدام مفتاح التقسيم.

+

قناة PChannel

يرمز PChannel إلى القناة الفعلية. تتوافق كل قناة PChannel مع موضوع لتخزين السجل. بشكل افتراضي، سيتم تعيين مجموعة مكونة من 16 قناة PChannels لتخزين السجلات التي تسجل إدراج البيانات وحذفها وتحديثها عند بدء تشغيل مجموعة Milvus. لمزيد من المعلومات، راجع التكوينات المتعلقة بقناة الرسائل.

+

PyMilvus

PyMilvus هي مجموعة أدوات تطوير البرمجيات Python SDK لـ Milvus. شفرة المصدر الخاصة به مفتوحة المصدر ومستضافة على GitHub. لديك المرونة في اختيار MilvusClient (الإصدار الجديد من Python SDK) أو وحدة ORM الأصلية للتحدث مع Milvus.

+

الاستعلام

الاستعلام هو واجهة برمجة تطبيقات تجري تصفية عددية بتعبير منطقي محدد كمرشح. لمزيد من المعلومات، ارجع إلى الحصول على استعلام استعلام عددي.

+

يسمح لك بحث النطاق بالعثور على المتجهات التي تقع ضمن مسافة محددة من متجه البحث. لمزيد من المعلومات، راجع بحث النطاق.

+

المخطط

المخطط هو المعلومات الوصفية التي تحدد نوع البيانات وخصائص البيانات. تحتوي كل مجموعة على مخطط المجموعة الخاص بها والذي يحدد جميع حقول المجموعة، وتمكين التخصيص التلقائي للمعرف (المفتاح الأساسي)، ووصف المجموعة. يتم أيضًا تضمين مخططات الحقول في مخططات المجموعة، والتي تحدد الاسم ونوع البيانات والخصائص الأخرى للحقل. لمزيد من المعلومات، راجع إدارة المخطط.

+

البحث عبارة عن واجهة برمجة تطبيقات تقوم بإجراء عملية لإجراء بحث عن تشابه متجه، وتتطلب بيانات متجهية لتنفيذها. لمزيد من المعلومات، راجع بحث متجه واحد.

+

المقطع

المقطع عبارة عن ملف بيانات يتم إنشاؤه تلقائيًا ويخزن البيانات المدرجة. قد تحتوي المجموعة على عدة مقاطع، ويمكن أن يحتوي كل مقطع على العديد من الكيانات. أثناء البحث عن التشابه المتجه، يفحص ميلفوس كل مقطع لتجميع نتائج البحث.

+

هناك نوعان من المقاطع: المقاطع المتنامية والمختومة. يستمر المقطع المتنامي في جمع بيانات جديدة حتى يصل إلى حد معين أو حد زمني محدد، وبعد ذلك يصبح مغلقًا. بمجرد إغلاقه، لا يقبل المقطع بعد ذلك بيانات جديدة ويتم نقله إلى مخزن الكائنات. في هذه الأثناء، يتم توجيه البيانات الواردة إلى مقطع متزايد جديد. يتم تشغيل الانتقال من شريحة متنامية إلى شريحة مختومة إما عن طريق الوصول إلى حد الكيان المحدد مسبقًا أو عن طريق تجاوز الحد الأقصى للمدة المسموح بها في حالة النمو. لمزيد من المعلومات، راجع تفاصيل التصميم.

+

موصل Spark-Milvus Connector

يوفرموصل Spark-Milvus Connector تكاملاً سلساً بين Apache Spark و Milvus، حيث يجمع بين ميزات معالجة البيانات والتعلم الآلي (ML) في Apache Spark مع قدرات تخزين البيانات المتجهة وإمكانيات البحث في Milvus.

+

شارد

يعمل Milvus على تحسين أداء كتابة البيانات من خلال توزيع عمليات الكتابة عبر عقد متعددة باستخدام أجزاء يتم تنظيمها بناءً على تجزئة المفاتيح الأساسية. يستفيد هذا من قدرات الحوسبة المتوازية للمجموعة.

+

يعمل التقسيم على تقليل حمل القراءة عن طريق تحديد اسم القسم، بينما يعمل التجزئة على توزيع حمل الكتابة بين خوادم متعددة.

+

المتجهات المتفرقة

تمثل المتجهات المتفرقة الكلمات أو العبارات باستخدام تضمينات المتجهات حيث تكون معظم العناصر صفرية، مع وجود عنصر واحد فقط غير صفري يشير إلى وجود كلمة معينة. تتفوق نماذج المتجهات المتناثرة، مثل SPLADEv2، على النماذج الكثيفة في البحث عن المعرفة خارج النطاق، والوعي بالكلمات الرئيسية، وقابلية التفسير. لمزيد من المعلومات، راجع المتجهات المتفرقة.

+

البيانات غير المهيكلة

البيانات غير المهيكلة، بما في ذلك الصور والفيديو والصوت واللغة الطبيعية، هي معلومات لا تتبع نموذجًا أو طريقة تنظيم محددة مسبقًا. يمثل هذا النوع من البيانات حوالي 80% من البيانات في العالم، ويمكن تحويلها إلى متجهات باستخدام نماذج الذكاء الاصطناعي والتعلم الآلي المختلفة.

+

القناة المنطقية

يرمزVChannel إلى القناة المنطقية. تمثل كل قناة VChannel جزءًا في مجموعة. سيتم تعيين مجموعة من قنوات VChannel لكل مجموعة لتسجيل إدراج البيانات وحذفها وتحديثها. قنوات VChannel منفصلة منطقيًا ولكنها تشترك فعليًا في الموارد.

+

المتجه

متجه التضمين هو تجريد ميزة للبيانات غير المهيكلة، مثل رسائل البريد الإلكتروني، وبيانات مستشعر إنترنت الأشياء، وصور إنستغرام، وبنى البروتين، وغيرها. من الناحية الرياضية، متجه التضمين هو عبارة عن مصفوفة من الأرقام ذات الفاصلة العائمة أو الثنائيات. تُستخدم تقنيات التضمين الحديثة لتحويل البيانات غير المنظمة إلى متجهات تضمين. يدعم ميلفوس كلاً من المتجهات الكثيفة والمتناثرة منذ الإصدار 2.4.0.

+

سحابة زيليز

Milvus مُدار بالكامل على Zilliz Cloud، مع المزيد من الميزات المؤسسية والأداء المحسّن للغاية.

diff --git a/localization/v2.5.x/site/ar/reference/gpu_index.json b/localization/v2.5.x/site/ar/reference/gpu_index.json new file mode 100644 index 000000000..b24dfb913 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/gpu_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"GPU Index","anchorList":[{"label":"فهرس وحدة معالجة الرسومات","href":"GPU-Index","type":1,"isActive":false},{"label":"GPU_CAGRA","href":"GPUCAGRA","type":2,"isActive":false},{"label":"GPU_IVF_FLAT","href":"GPUIVFFLAT","type":2,"isActive":false},{"label":"GPU_IVF_PQ","href":"GPUIVFPQ","type":2,"isActive":false},{"label":"gpu_brute_FORCE","href":"GPUBRUTEFORCE","type":2,"isActive":false},{"label":"الخلاصة","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/gpu_index.md b/localization/v2.5.x/site/ar/reference/gpu_index.md new file mode 100644 index 000000000..12c7593a2 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/gpu_index.md @@ -0,0 +1,239 @@ +--- +id: gpu_index.md +related_key: gpu_index +summary: آلية مؤشر GPU في ميلفوس. +title: فهرس وحدة معالجة الرسومات +--- +

فهرس وحدة معالجة الرسومات

يدعم Milvus أنواع فهرس GPU المختلفة لتسريع أداء البحث وكفاءته، خاصةً في سيناريوهات الإنتاجية العالية والاستدعاء العالي. يقدم هذا الموضوع نظرة عامة على أنواع فهارس GPU التي تدعمها Milvus، وحالات الاستخدام المناسبة لها، وخصائص الأداء. للحصول على معلومات حول إنشاء الفهارس باستخدام وحدة معالجة الرسومات، راجع الفهرسة باستخدام وحدة معالجة الرسومات.

+

من المهم ملاحظة أن استخدام فهرس GPU قد لا يقلل بالضرورة من زمن الاستجابة مقارنة باستخدام فهرس وحدة المعالجة المركزية. إذا كنت ترغب في زيادة الإنتاجية إلى أقصى حد، فستحتاج إلى ضغط طلب مرتفع للغاية أو عدد كبير من ناقلات الاستعلام.

+

+ + performance + الأداء

+

يساهم فريق Nvidia RAPIDS في دعم وحدة معالجة الرسومات في ميلفوس. فيما يلي أنواع فهرس GPU المدعومة حاليًا من قبل Milvus.

+

GPU_CAGRA

GPU_CAGRA هو فهرس قائم على الرسم البياني مُحسَّن لوحدات معالجة الرسوم البيانية، ويمكن أن يكون استخدام وحدات معالجة الرسومات الاستدلالية لتشغيل إصدار Milvus GPU أكثر فعالية من حيث التكلفة مقارنةً باستخدام وحدات معالجة الرسومات باهظة الثمن من فئة التدريب.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + + + +
    المعلمةالوصفالقيمة الافتراضية
    intermediate_graph_degreeتؤثر على الاستدعاء ووقت الإنشاء من خلال تحديد درجة الرسم البياني قبل التقليم. القيم الموصى بها هي 32 أو 64.128
    graph_degreeتؤثر على أداء البحث والاستدعاء من خلال تحديد درجة الرسم البياني بعد التقليم. ينتج عن الفرق الأكبر بين هاتين الدرجتين وقت بناء أطول. يجب أن تكون قيمته أصغر من قيمة intermediate_graph_degree.64
    build_algoيحدد خوارزمية إنشاء الرسم البياني قبل التقليم. القيم الممكنة:
    IVF_PQ: توفر جودة أعلى ولكن وقت بناء أبطأ.
    NN_DESCENT: يوفر إنشاء أسرع مع احتمال استرجاع أقل.
    IVF_PQ
    cache_dataset_on_deviceيقرر ما إذا كان سيتم تخزين مجموعة البيانات الأصلية مؤقتًا في ذاكرة وحدة معالجة الرسومات. القيم الممكنة:
    “true”: تخزين مجموعة البيانات الأصلية مؤقتًا لتحسين الاستدعاء من خلال تحسين نتائج البحث.
    “false”: عدم تخزين مجموعة البيانات الأصلية مؤقتًا لحفظ ذاكرة وحدة معالجة الرسومات.
    “false”
    adapt_for_cpuيقرر ما إذا كان سيتم استخدام وحدة معالجة الرسومات لإنشاء الفهرس ووحدة المعالجة المركزية للبحث.
    يتطلب ضبط هذه المعلمة على true وجود المعلمة ef في طلبات البحث.
    “false”
    +
  • +
  • معلمات البحث

    + + + + + + + + + + + +
    المعلمةالوصفالقيمة الافتراضية
    itopk_sizeتحدد حجم النتائج الوسيطة التي يتم الاحتفاظ بها أثناء البحث. قد تؤدي القيمة الأكبر إلى تحسين الاستدعاء على حساب أداء البحث. يجب أن تكون مساوية على الأقل للقيمة النهائية لأعلى k (الحد الأعلى) وعادةً ما تكون قوة 2 (على سبيل المثال، 16، 32، 64، 128).فارغة
    search_widthيحدد عدد نقاط الدخول إلى الرسم البياني CAGRA أثناء البحث. يمكن أن تؤدي زيادة هذه القيمة إلى تحسين الاستدعاء ولكنها قد تؤثر على أداء البحث (على سبيل المثال 1، 2، 4، 8، 16، 32).فارغة
    min_iterations / max_iterationsيتحكم في عملية تكرار البحث. بشكل افتراضي، يتم ضبطها على 0 ، وتحدد CAGRA تلقائيًا عدد التكرارات بناءً على itopk_size و search_width. يمكن أن يساعد ضبط هذه القيم يدويًا في تحقيق التوازن بين الأداء والدقة.0
    team_sizeيحدد عدد خيوط CUDA المستخدمة لحساب المسافة المترية على وحدة معالجة الرسومات. القيم الشائعة هي قوة 2 حتى 32 (على سبيل المثال 2، 4، 8، 16، 32). لها تأثير طفيف على أداء البحث. القيمة الافتراضية هي 0 ، حيث يقوم Milvus تلقائيًا بتحديد team_size بناءً على بُعد المتجه.0
    efيحدد مفاضلة وقت/دقة الاستعلام. تؤدي القيمة الأعلى ef إلى بحث أكثر دقة ولكن أبطأ.
    هذه المعلمة إلزامية إذا قمت بتعيين adapt_for_cpu على true عند إنشاء الفهرس.
    [top_k, int_max]
    +
  • +
+
    +
  • حدود البحث

    + + + + + + + + +
    المعلمةالنطاق
    limit (أعلى-ك)<= 1024
    limit (أعلى-ك)<=ماكس((itopk_size + 31)// 32، search_width) * 32
    +
  • +
+

GPU_IVF_FLAT

على غرار IVF_FLAT، يقسم GPU_IVF_FLAT أيضًا بيانات المتجه إلى nlist وحدة عنقودية، ثم يقارن المسافات بين متجه الإدخال الهدف ومركز كل مجموعة. اعتمادًا على عدد المجموعات التي تم تعيين النظام للاستعلام عنها (nprobe)، يتم إرجاع نتائج بحث التشابه بناءً على المقارنات بين المدخلات المستهدفة والمتجهات في المجموعة (المجموعات) الأكثر تشابهًا فقط - مما يقلل وقت الاستعلام بشكل كبير.

+

من خلال ضبط nprobe ، يمكن إيجاد توازن مثالي بين الدقة والسرعة لسيناريو معين. توضح نتائج اختبار أداء IVF_FLAT أن وقت الاستعلام يزداد بشكل حاد مع زيادة عدد متجهات الإدخال المستهدفة (nq)، وعدد المجموعات المطلوب البحث عنها (nprobe).

+

يعد GPU_IVF_FLAT هو فهرس IVF الأساسي، وتكون البيانات المشفرة المخزنة في كل وحدة متسقة مع البيانات الأصلية.

+

عند إجراء عمليات البحث، لاحظ أنه يمكنك تعيين أعلى K حتى 256 لأي بحث مقابل مجموعة مفهرسة GPU_IVF_FLAT.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    nlistعدد وحدات المجموعة[1, 65536]128
    cache_dataset_on_deviceيقرر ما إذا كان سيتم تخزين مجموعة البيانات الأصلية مؤقتًا في ذاكرة وحدة معالجة الرسومات. القيم الممكنة:
    “true”: تخزين مجموعة البيانات الأصلية مؤقتًا لتحسين الاستدعاء من خلال تحسين نتائج البحث.
    “false”: عدم تخزين مجموعة البيانات الأصلية مؤقتًا لحفظ ذاكرة وحدة معالجة الرسومات.
    "true" "flase""false"
    +
  • +
  • معلمات البحث

    +
      +
    • بحث شائع

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
  • +
  • حدود البحث

    + + + + + + + +
    المعلمةالنطاق
    limit (أعلى-ك)<= 2048
    +
  • +
+

GPU_IVF_PQ

PQ (التكميم الكمي للمنتج) تحلل بشكل موحد الفضاء المتجه الأصلي عالي الأبعاد إلى نواتج ديكارتية من m مساحات متجهة منخفضة الأبعاد، ثم تقوم بتكميم المساحات المتجهة منخفضة الأبعاد المتحللة. وبدلاً من حساب المسافات بين المتجه الهدف ومركز جميع الوحدات، يتيح التكميم الكمي للمنتج حساب المسافات بين المتجه الهدف ومركز التجميع لكل فضاء منخفض الأبعاد ويقلل بشكل كبير من تعقيد الوقت وتعقيد المساحة للخوارزمية.

+

يقوم IVF_PQ بإجراء تجميع فهرس IVF قبل تكميم حاصل ضرب المتجهات. ملف الفهرس الخاص به أصغر من IVF_SQ8، لكنه يتسبب أيضًا في فقدان الدقة أثناء البحث عن المتجهات.

+
+

تختلف معلمات بناء الفهرس ومعلمات البحث باختلاف توزيع Milvus. حدد توزيع ميلفوس الخاص بك أولاً.

+

عند إجراء عمليات البحث، لاحظ أنه يمكنك تعيين أعلى K حتى 8192 لأي بحث مقابل مجموعة مفهرسة GPU_IVF_FLAT.

+
+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    nlistعدد وحدات المجموعة[1, 65536]128
    mعدد عوامل تكميم المنتج,dim mod m or = 00
    nbits[اختياري] عدد البتات التي يتم تخزين كل متجه منخفض الأبعاد فيها.[1, 16]8
    cache_dataset_on_deviceيقرر ما إذا كان سيتم تخزين مجموعة البيانات الأصلية مؤقتًا في ذاكرة وحدة معالجة الرسومات. القيم الممكنة:
    “true”: تخزين مجموعة البيانات الأصلية مؤقتًا لتحسين الاستدعاء من خلال تحسين نتائج البحث.
    “false”: عدم تخزين مجموعة البيانات الأصلية مؤقتًا لحفظ ذاكرة وحدة معالجة الرسومات.
    "true" "false""false"
    +
  • +
  • معلمات البحث

    +
      +
    • بحث شائع

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
  • +
  • حدود البحث

    + + + + + + + +
    المعلمةالنطاق
    limit (أعلى-ك)<= 1024
    +
  • +
+

gpu_brute_FORCE

تم تصميم GPU_BRUTE_FORCE للحالات التي يكون فيها الاستدعاء العالي للغاية أمرًا بالغ الأهمية، مما يضمن استدعاء 1 من خلال مقارنة كل استعلام مع جميع المتجهات في مجموعة البيانات. يتطلب فقط نوع المقياس (metric_type) و top-k (limit) كمعلمات بناء الفهرس والبحث.

+

بالنسبة إلى GPU_BRUTE_FORCE، لا يلزم إضافة معلمات بناء الفهرس أو معلمات البحث.

+

الخلاصة

في الوقت الحالي، يقوم Milvus بتحميل جميع الفهارس في ذاكرة وحدة معالجة الرسومات لعمليات بحث فعالة. يعتمد مقدار البيانات التي يمكن تحميلها على حجم ذاكرة وحدة معالجة الرسومات:

+
    +
  • GPU_CAGRA: يبلغ استخدام الذاكرة حوالي 1.8 ضعف استخدام البيانات المتجهة الأصلية.
  • +
  • GPU_IVF_FLAT و GPU_BRUTE_FORCE: يتطلب ذاكرة مساوية لحجم البيانات الأصلية.
  • +
  • GPU_IVF_PQ: يستخدم بصمة ذاكرة أصغر، والتي تعتمد على إعدادات معلمة الضغط.
  • +
diff --git a/localization/v2.5.x/site/ar/reference/index.json b/localization/v2.5.x/site/ar/reference/index.json new file mode 100644 index 000000000..f2a52afba --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-memory Index","anchorList":[{"label":"الفهرس داخل الذاكرة","href":"In-memory-Index","type":1,"isActive":false},{"label":"فهارس المتجهات ANNS","href":"ANNS-vector-indexes","type":2,"isActive":false},{"label":"الفهارس المدعومة في ميلفوس","href":"Indexes-supported-in-Milvus","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQ","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/index.md b/localization/v2.5.x/site/ar/reference/index.md new file mode 100644 index 000000000..7eedf299a --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/index.md @@ -0,0 +1,679 @@ +--- +id: index.md +related_key: index +summary: آلية الفهرس في ميلفوس. +title: الفهرس داخل الذاكرة +--- +

الفهرس داخل الذاكرة

يسرد هذا الموضوع أنواع مختلفة من الفهارس داخل الذاكرة التي يدعمها ملفوس، والسيناريوهات التي تناسب كل منها، والمعلمات التي يمكن للمستخدمين تكوينها لتحقيق أداء بحث أفضل. بالنسبة للفهارس على القرص، راجع الفهرسة على القرص.

+

الفهرسة هي عملية تنظيم البيانات بكفاءة، وتلعب دورًا رئيسيًا في جعل البحث عن التشابه مفيدًا من خلال تسريع الاستعلامات التي تستغرق وقتًا طويلاً على مجموعات البيانات الكبيرة بشكل كبير.

+

لتحسين أداء الاستعلام، يمكنك تحديد نوع فهرس لكل حقل متجه.

+
+يدعم حقل المتجه حاليًا نوع فهرس واحد فقط. يقوم ميلفوس تلقائيًا بحذف الفهرس القديم عند تبديل نوع الفهرس.
+

فهارس المتجهات ANNS

تستخدم معظم أنواع الفهارس المتجهة التي يدعمها Milvus خوارزميات البحث التقريبي الأقرب للجيران (ANNS). وبالمقارنة مع الاسترجاع الدقيق، الذي عادةً ما يستغرق وقتًا طويلاً، فإن الفكرة الأساسية لـ ANNS لم تعد تقتصر على إرجاع النتيجة الأكثر دقة، بل البحث عن جيران الهدف فقط. تعمل ANNS على تحسين كفاءة الاسترجاع من خلال التضحية بالدقة ضمن نطاق مقبول.

+

وفقًا لطرق التنفيذ، يمكن تصنيف فهرس متجه ANNS إلى أربعة أنواع: قائم على الشجرة وقائم على الرسم البياني وقائم على التجزئة وقائم على التجزئة الكمية.

+

الفهارس المدعومة في ميلفوس

تدعم Milvus أنواعًا مختلفة من الفهارس، والتي يتم تصنيفها حسب نوع التضمينات المتجهة التي تتعامل معها: تضمينات الف اصلة العائمة (المعروفة أيضًا باسم متجهات النقطة العائمة أو المتجهات الكثيفة)، والتضمينات الثنائية (المعروفة أيضًا باسم المتجهات الثنائية)، والتضمينات المتفرقة (المعروفة أيضًا باسم المتجهات المتفرقة).

+ +
+

فهارس لتضمينات الفاصلة العائمة

بالنسبة للتضمينات ذات الفاصلة العائمة ذات 128 بُعدًا (المتجهات)، فإن مساحة التخزين التي تشغلها هي 128 * حجم العوامة = 512 بايت. ومقاييس المسافة المستخدمة لتضمينات الفاصلة العائمة هي المسافة الإقليدية (L2) والمنتج الداخلي (IP).

+

وتتضمن هذه الأنواع من الفهارس FLAT و IVF_FLAT و و IVF_PQ و IVF_SQ8 و HNSW و HNSW_SQ و HNSW_PQ و HNSW_PRQ و SCANN لعمليات البحث في الشبكة العنكبوتية القائمة على وحدة المعالجة المركزية.

+
+
+

فهارس التضمينات الثنائية

بالنسبة للتضمينات الثنائية ذات 128 بُعدًا، تبلغ مساحة التخزين التي تشغلها 128 / 8 = 16 بايت. ومقاييس المسافة المستخدمة للتضمينات الثنائية هي JACCARD و HAMMING.

+

يتضمن هذا النوع من الفهارس BIN_FLAT و BIN_IVF_FLAT.

+
+
+

فهارس التضمينات المتفرقة

تدعم فهارس التضمينات المتفرقة مقاييس IP و BM25 (للبحث في النص الكامل) فقط.

+

تشمل أنواع الفهارس SPARSE_INVERTED_INDEX و SPARSE_WAND.

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الفهرس المدعومالتصنيفالسيناريو
مسطحغير متاح +
    +
  • مجموعة بيانات صغيرة نسبيًا
  • +
  • يتطلب معدل استرجاع 100%
  • +
+
IVF_FLATغير متاح +
    +
  • استعلام عالي السرعة
  • +
  • يتطلب معدل استرجاع عالٍ قدر الإمكان
  • +
+
IVF_SQ8الفهرس القائم على التكميم +
    +
  • استعلام عالي السرعة للغاية
  • +
  • موارد ذاكرة محدودة
  • +
  • يقبل مساومة طفيفة في معدل الاستدعاء
  • +
+
IVF_PQالفهرس المستند إلى التقدير الكمي +
    +
  • استعلام عالي السرعة
  • +
  • موارد ذاكرة محدودة
  • +
  • يقبل تنازلات طفيفة في معدل الاسترجاع
  • +
+
HNSWفهرس قائم على الرسم البياني +
    +
  • استعلام عالي السرعة للغاية
  • +
  • يتطلب معدل استرجاع عالٍ قدر الإمكان
  • +
  • موارد ذاكرة كبيرة
  • +
+
HNSW_SQفهرس قائم على القياس الكمي +
    +
  • استعلام عالي السرعة للغاية
  • +
  • موارد ذاكرة محدودة
  • +
  • يقبل تنازلاً بسيطاً في معدل الاسترجاع
  • +
+
HNSW_PQالفهرس المستند إلى القياس الكمي +
    +
  • استعلام متوسط السرعة
  • +
  • موارد ذاكرة محدودة للغاية
  • +
  • يقبل تنازلات طفيفة في معدل الاسترجاع
  • +
+
HNSW_PRQالفهرس المستند إلى القياس الكمي +
    +
  • استعلام متوسط السرعة
  • +
  • موارد ذاكرة محدودة للغاية
  • +
  • يقبل تنازلات طفيفة في معدل الاسترجاع
  • +
+
SCANNفهرس قائم على تحديد الكميات +
    +
  • استعلام عالي السرعة للغاية
  • +
  • يتطلب معدل استرجاع عالٍ قدر الإمكان
  • +
  • موارد ذاكرة كبيرة
  • +
+
+
+
+ + + + + + + + + + + + + + + + + + + + +
الفهرس المدعومالتصنيفالسيناريو
BIN_FLATفهرس قائم على التحويل الكمي
    +
  • يعتمد على مجموعات بيانات صغيرة نسبياً.
  • +
  • يتطلب دقة مثالية.
  • +
  • لا ينطبق أي ضغط.
  • +
  • يضمن نتائج بحث دقيقة.
  • +
BIN_IVF_FLATفهرس قائم على التكميم
    +
  • استعلام عالي السرعة
  • +
  • يتطلب معدل استرجاع عالٍ قدر الإمكان
  • +
+
+
+ + + + + + + + + + + + + + + + + + + + +
الفهرس المدعومالتصنيفالسيناريو
الفهرس_المقلوب_المتفرقفهرس مقلوب
    +
  • يعتمد على مجموعات بيانات صغيرة نسبيًا.
  • +
  • يتطلب معدل استرجاع 100%.
  • +
SPARSE_WANDفهرس مقلوب
    +
  • خوارزميةضعيفة مع تسريع الخوارزمية
  • +
  • يمكن الحصول على تحسين كبير في السرعة مع التضحية بقدر ضئيل من الاسترجاع فقط.
  • +
+
+
+

مسطح

بالنسبة لتطبيقات البحث عن تشابه المتجهات التي تتطلب دقة مثالية وتعتمد على مجموعات بيانات صغيرة نسبيًا (بمقياس مليون)، يُعد الفهرس المسطح خيارًا جيدًا. لا يقوم FLAT بضغط المتجهات، وهو الفهرس الوحيد الذي يمكن أن يضمن نتائج بحث دقيقة. يمكن أيضًا استخدام النتائج من FLAT كنقطة مقارنة للنتائج التي تنتجها الفهارس الأخرى التي لديها أقل من 100٪ استدعاء.

+

يتميز فهرس FLAT بالدقة لأنه يتبع نهجًا شاملًا للبحث، مما يعني أنه لكل استعلام تتم مقارنة المدخلات المستهدفة بكل مجموعة من المتجهات في مجموعة البيانات. وهذا يجعل FLAT أبطأ فهرس في قائمتنا، وهو غير مناسب للاستعلام عن بيانات المتجهات الضخمة. لا توجد معلمات مطلوبة لفهرس FLAT في Milvus، ولا يحتاج استخدامه إلى تدريب على البيانات.

+
    +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاق
    metric_type[اختياري] مقياس المسافة المختار.انظر المقاييس المدعومة.
    +
  • +
+

IVF_FLAT

يقسم IVF_FLAT بيانات المتجهات إلى nlist وحدات عنقودية، ثم يقارن المسافات بين متجه الإدخال الهدف ومركز كل مجموعة. اعتمادًا على عدد المجموعات التي تم تعيين النظام للاستعلام عنها (nprobe)، يتم إرجاع نتائج بحث التشابه بناءً على المقارنات بين المدخلات المستهدفة والمتجهات في المجموعة (المجموعات) الأكثر تشابهًا فقط - مما يقلل وقت الاستعلام بشكل كبير.

+

من خلال ضبط nprobe ، يمكن إيجاد توازن مثالي بين الدقة والسرعة لسيناريو معين. توضح النتائج من اختبار أداء IVF_FLAT أن وقت الاستعلام يزداد بشكل حاد مع زيادة عدد متجهات المدخلات المستهدفة (nq)، وعدد المجموعات المطلوب البحث عنها (nprobe).

+

إن IVF_FLAT هو فهرس IVF_FLAT الأساسي، والبيانات المشفرة المخزنة في كل وحدة متسقة مع البيانات الأصلية.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    nlistعدد وحدات المجموعة[1, 65536]128
    +
  • +
  • معلمات البحث

    +
      +
    • بحث مشترك

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
    • بحث النطاق

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      max_empty_result_bucketsالحد الأقصى لعدد الدلاء التي لا ترجع أي نتائج بحث.
      هذه معلمة بحث نطاق وتنهي عملية البحث عندما يصل عدد الدلاء الفارغة المتتالية إلى القيمة المحددة.
      يمكن أن تؤدي زيادة هذه القيمة إلى تحسين معدل الاستدعاء على حساب زيادة وقت البحث.
      [1, 65535]2
      +
    • +
  • +
+

IVF_SQ8

لا يقوم IVF_FFLAT بإجراء أي ضغط، لذا فإن ملفات الفهرس التي ينتجها تكون تقريبًا بنفس حجم بيانات المتجه الأصلية غير المفهرسة. على سبيل المثال، إذا كان حجم مجموعة بيانات SIFT 1B الأصلية 476 جيجابايت، فإن ملفات فهرس IVF_SQ8_FLAT الخاصة بها ستكون أصغر قليلاً (حوالي 470 جيجابايت). سيؤدي تحميل جميع ملفات الفهرس في الذاكرة إلى استهلاك 470 جيجابايت من مساحة التخزين.

+

عندما تكون موارد ذاكرة القرص أو وحدة المعالجة المركزية أو وحدة معالجة الرسومات محدودة، فإن IVF_SQ8 هو خيار أفضل من IVF_FLAT. يمكن لنوع الفهرس هذا تحويل كل FLOAT (4 بايت) إلى UINT8 (1 بايت) عن طريق إجراء التكميم الكمي Scalar Quantization (SQ). يقلل هذا من استهلاك القرص ووحدة المعالجة المركزية وذاكرة وحدة معالجة الرسومات بنسبة 70-75%. بالنسبة لمجموعة بيانات SIFT 1B، تتطلب ملفات فهرس IVF_SQ8 مساحة تخزين 140 جيجابايت فقط.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + +
    المعلمةالوصفالنطاق
    nlistعدد وحدات التجميع[1, 65536]
    +
  • +
  • معلمات البحث

    +
      +
    • بحث مشترك

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
    • بحث النطاق

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      max_empty_result_bucketsالحد الأقصى لعدد الدلاء التي لا ترجع أي نتائج بحث.
      هذه معلمة بحث نطاق وتنهي عملية البحث عندما يصل عدد الدلاء الفارغة المتتالية إلى القيمة المحددة.
      يمكن أن تؤدي زيادة هذه القيمة إلى تحسين معدل الاستدعاء على حساب زيادة وقت البحث.
      [1, 65535]2
      +
    • +
  • +
+

IVF_PQ

PQ (التكميم الكمي للمنتج) يحلل بشكل موحد الفضاء المتجه الأصلي عالي الأبعاد إلى نواتج ديكارتية من m مساحات متجهة منخفضة الأبعاد، ثم يقوم بتكميم المساحات المتجهة منخفضة الأبعاد المتحللة. وبدلاً من حساب المسافات بين المتجه الهدف ومركز جميع الوحدات، يتيح التكميم الكمي للمنتج حساب المسافات بين المتجه الهدف ومركز التجميع لكل فضاء منخفض الأبعاد ويقلل بشكل كبير من تعقيد الوقت وتعقيد المساحة للخوارزمية.

+

يقوم IVF_PQ بإجراء تجميع فهرس IVF قبل تكميم حاصل ضرب المتجهات. ملف الفهرس الخاص به أصغر من IVF_SQ8، لكنه يتسبب أيضًا في فقدان الدقة أثناء البحث عن المتجهات.

+
+

تختلف معلمات بناء الفهرس ومعلمات البحث باختلاف توزيع Milvus. حدد توزيع Milvus الخاص بك أولاً.

+
+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + +
    المعلمةالوصفالنطاق
    nlistعدد وحدات الكتلة[1, 65536]
    mعدد عوامل تكميم المنتجdim mod m == 0
    nbits[اختياري] عدد البتات التي يتم تخزين كل متجه منخفض الأبعاد فيها.[1، 64] (8 افتراضيًا)
    +
  • +
  • معلمات البحث

    +
      +
    • بحث مشترك

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
    • بحث النطاق

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      max_empty_result_bucketsالحد الأقصى لعدد الدلاء التي لا ترجع أي نتائج بحث.
      هذه معلمة بحث نطاق وتنهي عملية البحث عندما يصل عدد الدلاء الفارغة المتتالية إلى القيمة المحددة.
      يمكن أن تؤدي زيادة هذه القيمة إلى تحسين معدل الاستدعاء على حساب زيادة وقت البحث.
      [1, 65535]2
      +
    • +
  • +
+

SCANN

يشبه ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (ScaNN (Scalable Nearest Neighbours) يشبه IVF_PQ من حيث تجميع المتجهات وتكميم المنتج. ما يجعلها مختلفة يكمن في تفاصيل تنفيذ تكميم المنتج واستخدام SIMD (أحادي التعليمات / متعدد البيانات) للحساب الفعال.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + +
    المعلمةالوصفالنطاق
    nlistعدد وحدات الكتلة[1, 65536]
    with_raw_dataما إذا كان سيتم تضمين البيانات الأولية في الفهرسTrue أو False. الافتراضي إلى True.
    +
    +

    على عكس IVF_PQ، تنطبق القيم الافتراضية على m و nbits لتحسين الأداء.

    +
    +
  • +
  • معلمات البحث

    +
      +
    • البحث الشائع

      + + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، nlist]
      reorder_kعدد الوحدات المرشحة للاستعلام عنها[top_k ، ∞]top_k
      +
    • +
    • نطاق البحث

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      max_empty_result_bucketsالحد الأقصى لعدد الدلاء التي لا ترجع أي نتائج بحث.
      هذه معلمة بحث نطاق وتنهي عملية البحث عندما يصل عدد الدلاء الفارغة المتتالية إلى القيمة المحددة.
      يمكن أن تؤدي زيادة هذه القيمة إلى تحسين معدل الاستدعاء على حساب زيادة وقت البحث.
      [1, 65535]2
      +
    • +
  • +
+

HNSW

HNSW (الرسم البياني الهرمي للعالم الصغير القابل للملاحة) هي خوارزمية فهرسة قائمة على الرسم البياني. وهي تبني بنية تنقل متعددة الطبقات للصورة وفقًا لقواعد معينة. في هذه البنية، تكون الطبقات العليا أكثر تناثرًا والمسافات بين العقد أبعد؛ أما الطبقات السفلى فهي أكثر كثافة والمسافات بين العقد أقرب. يبدأ البحث من الطبقة العليا، ويعثر على العقدة الأقرب إلى الهدف في هذه الطبقة، ثم يدخل إلى الطبقة التالية لبدء بحث آخر. بعد عدة تكرارات، يمكن أن يقترب بسرعة من الموضع المستهدف.

+

من أجل تحسين الأداء، يحدّ HNSW من الحد الأقصى لدرجة العقد في كل طبقة من الرسم البياني إلى M. بالإضافة إلى ذلك، يمكنك استخدام efConstruction (عند بناء الفهرس) أو ef (عند البحث عن الأهداف) لتحديد نطاق بحث.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    MM تحدد الحد الأقصى لعدد الاتصالات الصادرة في الرسم البياني. يؤدي ارتفاع M إلى دقة أعلى/وقت تشغيل أعلى عند بناء ef/efConstruction ثابت.[2, 2048]لا يوجد
    efConstructionيتحكم ef_construction في سرعة البحث عن الفهرس/سرعة البناء. قد تؤدي زيادة معلمة efConstruction إلى تحسين جودة الفهرس، ولكنها تميل أيضًا إلى إطالة وقت الفهرسة.[1، int_max]لا يوجد
    +
  • +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    efمعلمة تتحكم في مفاضلة وقت/دقة البحث. يؤدي ارتفاع ef إلى بحث أكثر دقة ولكن أبطأ.[top_k ، int_max]لا يوجد
    +
  • +
+

HNSW_SQ

التكمية الكمية العددية (SQ) هي تقنية تُستخدم لتجزئة بيانات الفاصلة العائمة إلى مجموعة محدودة من القيم بناءً على مقدارها. على سبيل المثال، يمثل SQ6 التكميم الكمي إلى (2^6 = 64) قيم منفصلة، حيث يتم ترميز كل رقم عائم باستخدام 6 بت. وبالمثل، يقوم SQ8 بتكميم البيانات إلى (2 ^ 8 = 256) قيم منفصلة، حيث يتم تمثيل كل رقم عائم ب 8 بتات. يقلل هذا التكميم من بصمة الذاكرة مع الحفاظ على البنية الأساسية للبيانات من أجل معالجة فعالة.

+

وبالاقتران مع SQ، يوفر HNSW_SQ مفاضلة يمكن التحكم فيها بين حجم الفهرس والدقة، مع الحفاظ على أداء استعلام عالٍ في الثانية (QPS). وبالمقارنة مع HNSW القياسي، فإنه يؤدي إلى زيادة متواضعة في وقت بناء الفهرس.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    MM تحدد الحد الأقصى لعدد الاتصالات الصادرة في الرسم البياني. يؤدي ارتفاع M إلى دقة أعلى/وقت تشغيل أعلى عند بناء ef/efConstruction ثابت.[2, 2048]لا يوجد
    efConstructionيتحكم ef_construction في سرعة البحث عن الفهرس/سرعة البناء. قد تؤدي زيادة معلمة efConstruction إلى تحسين جودة الفهرس، ولكنها تميل أيضًا إلى إطالة وقت الفهرسة.[1، int_max]لا شيء
    sq_typeنوع الكميات العددية.SQ6،SQ8 ، BF16, FP16SQ8
    refineما إذا كان يتم حجز البيانات المكررة أثناء إنشاء الفهرس.true, falsefalse
    refine_typeنوع بيانات الفهرس المنقح.SQ6, SQ8, BF16, FP16, FP32لا يوجد
    +
  • +
  • معلمات البحث

    + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    efمعلمة تتحكم في مفاضلة وقت/دقة البحث. يؤدي ارتفاع ef إلى بحث أكثر دقة ولكن أبطأ.[top_k ، int_max]لا يوجد
    refine_kعامل التكبير للتكرير مقارنة بـ k.[ 1, float_max]1
    +
  • +
+

HNSW_PQ

تتمثل الفكرة الأساسية لـ PQ في تقسيم المتجه إلى m متجهات فرعية، كل منها سيجد 2^{nbits} مركزيات على أساس kmeans، وسيختار كل متجه فرعي أقرب متجه فرعي كمتجه فرعي تقريبي له. ثم نقوم بتسجيل جميع المئويات، بحيث يمكن ترميز كل متجه فرعي على أنه nbits ، ويمكن ترميز متجه عائم طوله dim على أنه م ⋅ nbits بت.

+

وبالاقتران مع PQ، يوفر HNSW_PQ مفاضلة يمكن التحكم فيها بين حجم الفهرس والدقة، ولكن لديه قيمة QPS أقل ومعدل استرجاع أعلى من HNSW_SQ لنفس معدل الضغط. بالمقارنة مع HNSW_SQ، يستغرق بناء الفهرس وقتًا أطول.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    MM تحدد الحد الأقصى لعدد الاتصالات الصادرة في الرسم البياني. يؤدي ارتفاع M إلى دقة أعلى/وقت تشغيل أعلى عند بناء ef/efConstruction ثابت.[2, 2048]لا يوجد
    efConstructionيتحكم ef_construction في سرعة البحث عن الفهرس/سرعة البناء. قد تؤدي زيادة معلمة efConstruction إلى تحسين جودة الفهرس، ولكنها تميل أيضًا إلى إطالة وقت الفهرسة.[1، int_max]لا يوجد
    mعدد مجموعات المتجهات الفرعية المراد تقسيم المتجه إليها.[1, 65536]32
    nbitsعدد البتات التي يتم تقسيم كل مجموعة من المتجهات الفرعية إليها.[1, 24]8
    refineما إذا كان يتم حجز البيانات المكررة أثناء بناء الفهرس.true, falsefalse
    refine_typeنوع بيانات الفهرس المنقح.SQ6، SQ8 ، BF16 ، ، FP16, FP32لا يوجد
    +
  • +
  • معلمات البحث

    + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    efمعلمة تتحكم في مفاضلة وقت/دقة البحث. يؤدي ارتفاع ef إلى بحث أكثر دقة ولكن أبطأ.[top_k ، int_max]لا يوجد
    refine_kعامل التكبير للتكرير مقارنة بـ k.[ 1, float_max]1
    +
  • +
+

HNSW_PRQ

PRQ مشابه لـ PQ، ويقسم المتجه أيضًا إلى m مجموعات. سيتم ترميز كل متجه فرعي على أنه nbits. بعد إكمال تكميم pq، سيحسب المتجه المتبقي بين المتجه والمتجه المكمم pq، ويطبق تكميم pq على المتجه المتبقي. سيتم إجراء ما مجموعه nrq عملية تكميم pq كاملة، لذا سيتم ترميز متجه عائم طوله dim على هيئة m ⋅ nbits ⋅ nrq bits.

+

يوفر HNSW_PRQ، بالاقتران مع مُكوِّن الكمية المتبقية من المنتج (PRQ)، مفاضلة أعلى يمكن التحكم فيها بين حجم المؤشر والدقة. لديه قيمة QPS مكافئة تقريبًا ومعدل استرجاع أعلى من HNSW_PQ لنفس معدل الضغط. بالمقارنة مع HNSW_PQ، قد يزيد وقت بناء الفهرس عدة مرات.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    MM تحدد الحد الأقصى لعدد الاتصالات الصادرة في الرسم البياني. يؤدي ارتفاع M إلى دقة أعلى/وقت تشغيل أعلى عند بناء ef/efConstruction ثابت.[2, 2048]لا يوجد
    efConstructionيتحكم ef_construction في سرعة البحث عن الفهرس/سرعة البناء. قد تؤدي زيادة معلمة efConstruction إلى تحسين جودة الفهرس، ولكنها تميل أيضًا إلى إطالة وقت الفهرسة.[1، int_max]لا يوجد
    mعدد مجموعات المتجهات الفرعية المراد تقسيم المتجه إليها.[1, 65536]32
    nbitsعدد البتات التي يتم تقسيم كل مجموعة من المتجهات الفرعية إليها.[1, 24]8
    nrqعدد المتجهات الفرعية المتبقية.[1, 16]2
    refineما إذا كانت البيانات المكررة محجوزة أثناء بناء الفهرس.true, falsefalse
    refine_typeنوع بيانات الفهرس المنقح.SQ6، SQ8 ، BF16 ، ، FP16, FP32لا يوجد
    +
  • +
  • معلمات البحث

    + + + + + + + + +
    المعلمةالوصفالنطاقالقيمة الافتراضية
    efمعلمة تتحكم في مفاضلة وقت/دقة البحث. يؤدي ارتفاع ef إلى بحث أكثر دقة ولكن أبطأ.[top_k ، int_max]لا يوجد
    refine_kعامل التكبير للتكرير مقارنة بـ k.[ 1, float_max]1
    +
  • +
+
+
+

BIN_FLAT

هذا المؤشر هو نفسه تمامًا مثل FLAT باستثناء أنه يمكن استخدامه فقط للتضمينات الثنائية.

+

بالنسبة لتطبيقات البحث عن التشابه المتجهي التي تتطلب دقة مثالية وتعتمد على مجموعات بيانات صغيرة نسبيًا (بمقياس مليون)، يعتبر الفهرس BIN_FLAT خيارًا جيدًا. لا يقوم الفهرس BIN_FLAT بضغط المتجهات، وهو الفهرس الوحيد الذي يمكن أن يضمن نتائج بحث دقيقة. يمكن أيضًا استخدام نتائج الفهرس BIN_FLAT كنقطة مقارنة للنتائج التي تنتجها الفهارس الأخرى التي تقل نسبة استرجاعها عن 100%.

+

يتسم BIN_FLAT بالدقة لأنه يتبع نهجًا شاملًا في البحث، وهو ما يعني أنه تتم مقارنة المدخلات المستهدفة لكل استعلام مع المتجهات في مجموعة البيانات. هذا يجعل من BIN_FLAT أبطأ فهرس في قائمتنا، وهو غير مناسب للاستعلام عن بيانات المتجهات الضخمة. لا توجد معلمات لفهرس BIN_FLAT في Milvus، ولا يتطلب استخدامه تدريبًا على البيانات أو تخزينًا إضافيًا.

+
    +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاق
    metric_type[اختياري] مقياس المسافة المختار.انظر المقاييس المدعومة.
    +
  • +
+

BIN_IVF_FLAT

هذا المؤشر مماثل تمامًا لـ IVF_FLAT باستثناء أنه لا يمكن استخدامه إلا للتضمينات الثنائية.

+

يقسم BIN_IVF_FLAT بيانات المتجه إلى nlist وحدة عنقودية، ثم يقارن المسافات بين متجه الإدخال الهدف ومركز كل مجموعة. واعتمادًا على عدد المجموعات التي تم تعيين النظام للاستعلام عنها (nprobe)، يتم إرجاع نتائج البحث عن التشابه بناءً على المقارنات بين المدخلات المستهدفة والمتجهات في المجموعة (المجموعات) الأكثر تشابهًا فقط - مما يقلل وقت الاستعلام بشكل كبير.

+

من خلال ضبط nprobe ، يمكن إيجاد توازن مثالي بين الدقة والسرعة لسيناريو معين. يزداد وقت الاستعلام بشكل حاد مع زيادة عدد متجهات المدخلات المستهدفة (nq)، وعدد المجموعات المطلوب البحث عنها (nprobe).

+

BIN_IVF_FLAT هو فهرس BIN_IVF الأساسي، وتكون البيانات المشفرة المخزنة في كل وحدة متسقة مع البيانات الأصلية.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + +
    المعلمةالوصفالنطاق
    nlistعدد وحدات المجموعة[1, 65536]
    +
  • +
  • معلمات البحث

    +
      +
    • بحث مشترك

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      nprobeعدد الوحدات المطلوب الاستعلام عنها[1، ن ليست]8
      +
    • +
    • بحث النطاق

      + + + + + + + +
      المعلمةالوصفالنطاقالقيمة الافتراضية
      max_empty_result_bucketsالحد الأقصى لعدد الدلاء التي لا ترجع أي نتائج بحث.
      هذه معلمة بحث نطاق وتنهي عملية البحث عندما يصل عدد الدلاء الفارغة المتتالية إلى القيمة المحددة.
      يمكن أن تؤدي زيادة هذه القيمة إلى تحسين معدل الاستدعاء على حساب زيادة وقت البحث.
      [1, 65535]2
      +
    • +
  • +
+
+
+

متناثر_مقلوب_الفهرس

يحتفظ كل بُعد بقائمة من المتجهات التي لها قيمة غير صفرية في هذا البُعد. أثناء البحث، يقوم Milvus بالتكرار خلال كل بُعد من أبعاد متجه الاستعلام ويحسب الدرجات للمتجهات التي لها قيم غير صفرية في تلك الأبعاد.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + +
    المعلمةالوصفالنطاق
    drop_ratio_buildنسبة قيم المتجهات الصغيرة التي يتم استبعادها أثناء عملية الفهرسة. يسمح هذا الخيار بضبط عملية الفهرسة بشكل دقيق، مما يؤدي إلى المفاضلة بين الكفاءة والدقة من خلال تجاهل القيم الصغيرة عند بناء الفهرس.[0, 1]
    +
  • +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاق
    drop_ratio_searchنسبة قيم المتجهات الصغيرة التي يتم استبعادها أثناء عملية البحث. يسمح هذا الخيار بضبط عملية البحث بشكل دقيق من خلال تحديد نسبة أصغر القيم في متجه الاستعلام التي يجب تجاهلها. يساعد في تحقيق التوازن بين دقة البحث والأداء. كلما قلت القيمة المحددة ل drop_ratio_search ، قلت مساهمة هذه القيم الصغيرة في النتيجة النهائية. من خلال تجاهل بعض القيم الصغيرة، يمكن تحسين أداء البحث بأقل تأثير على الدقة.[0, 1]
    +
  • +
+

SPARSE_WAND

يشترك هذا الفهرس في أوجه التشابه مع SPARSE_INVERTED_INDEX ، بينما يستخدم خوارزمية Weak-AND لتقليل عدد تقييمات مسافة IP الكاملة أثناء عملية البحث.

+

بناءً على الاختبارات التي أجريناها، يتفوق SPARSE_WAND بشكل عام على الطرق الأخرى من حيث السرعة. ومع ذلك، يمكن أن يتدهور أداؤها بسرعة مع زيادة كثافة المتجهات. ولمعالجة هذه المشكلة، يمكن أن يؤدي إدخال drop_ratio_search غير صفري إلى تحسين الأداء بشكل كبير مع تكبد الحد الأدنى من فقدان الدقة فقط. لمزيد من المعلومات، راجع المتجهات المتفرقة.

+
    +
  • معلمات بناء الفهرس

    + + + + + + + +
    المعلمةالوصفالنطاق
    drop_ratio_buildنسبة قيم المتجهات الصغيرة التي يتم استبعادها أثناء عملية الفهرسة. يسمح هذا الخيار بضبط عملية الفهرسة بشكل دقيق، مما يؤدي إلى المفاضلة بين الكفاءة والدقة من خلال تجاهل القيم الصغيرة عند بناء الفهرس.[0, 1]
    +
  • +
  • معلمات البحث

    + + + + + + + +
    المعلمةالوصفالنطاق
    drop_ratio_searchنسبة قيم المتجهات الصغيرة التي يتم استبعادها أثناء عملية البحث. يسمح هذا الخيار بضبط عملية البحث بشكل دقيق من خلال تحديد نسبة أصغر القيم في متجه الاستعلام التي يجب تجاهلها. يساعد في تحقيق التوازن بين دقة البحث والأداء. كلما قلت القيمة المحددة ل drop_ratio_search ، قلت مساهمة هذه القيم الصغيرة في النتيجة النهائية. من خلال تجاهل بعض القيم الصغيرة، يمكن تحسين أداء البحث بأقل تأثير على الدقة.[0, 1]
    +
  • +
+
+

الأسئلة الشائعة

+ما الفرق بين مؤشر FLAT ومؤشر IVF_FLAT؟

+

يقسّم الفهرس IVF_FLAT مساحة المتجه إلى nlist مجموعة. إذا احتفظت بالقيمة الافتراضية nlist كـ 16384، يقارن Milvus المسافات بين المتجه الهدف ومراكز جميع المجموعات الـ 16384 للحصول على nprobe أقرب مجموعات. ثم يقارن Milvus المسافات بين المتجه الهدف والمتجهات في المجموعات المحددة للحصول على أقرب المتجهات. على عكس IVF_FLAT، يقارن FLAT مباشرةً المسافات بين المتجه الهدف وكل متجه.

+

+لذلك، عندما يكون العدد الإجمالي للمتجهات يساوي تقريبًا nlist ، فإن IVF_FLAT و FLAT لا يوجد فرق كبير في طريقة الحساب المطلوبة وأداء البحث. ولكن مع زيادة عدد المتجهات إلى ضعفين أو ثلاثة أضعاف أو ن ضعف nlist ، يبدأ فهرس IVF_FLAT في إظهار مزايا أكبر بشكل متزايد.

+

+راجع كيفية اختيار فهرس في ميلفوس لمزيد من المعلومات.

+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/knowhere.json b/localization/v2.5.x/site/ar/reference/knowhere.json new file mode 100644 index 000000000..86ec5c263 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/knowhere.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Knowhere","anchorList":[{"label":"نوير","href":"Knowhere","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"نوير في بنية ميلفوس","href":"Knowhere-in-the-Milvus-architecture","type":2,"isActive":false},{"label":"مزايا نوير","href":"Knowhere-advantages","type":2,"isActive":false},{"label":"بنية كود نوير","href":"Knowhere-code-structure","type":2,"isActive":false},{"label":"إضافة مؤشرات إلى \"نوير","href":"Adding-indices-to-Knowhere","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/knowhere.md b/localization/v2.5.x/site/ar/reference/knowhere.md new file mode 100644 index 000000000..d5931a728 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/knowhere.md @@ -0,0 +1,179 @@ +--- +id: knowhere.md +summary: تعرّف على "نولوجي" في ميلفوس. +title: نوير +--- +

نوير

يقدم هذا الموضوع "نوير"، المحرك الأساسي لتنفيذ المتجهات في ميلفوس.

+

نظرة عامة

نوير هو محرك التنفيذ المتجه الأساسي لميلفوس، والذي يتضمن العديد من مكتبات البحث عن التشابه المتجه بما في ذلك Faiss و Hnswlib و Annoy. تم تصميم Knowhere أيضًا لدعم الحوسبة غير المتجانسة. فهو يتحكم في الأجهزة (وحدة المعالجة المركزية أو وحدة معالجة الرسومات) لتنفيذ طلبات بناء الفهرس والبحث. هكذا حصل Knowhere على اسمه - معرفة مكان تنفيذ العمليات. سيتم دعم المزيد من أنواع الأجهزة بما في ذلك DPU و TPU في الإصدارات المستقبلية.

+

نوير في بنية ميلفوس

يوضح الشكل أدناه موقع نوير في بنية ميلفوس.

+

+ + Knowhere + نوير

+

الطبقة السفلى هي أجهزة النظام. وفوقها مكتبات الفهرس التابعة لجهة خارجية. في الطبقة العليا، يتفاعل Knowhere مع عقدة الفهرس وعقدة الاستعلام عبر CGO، مما يسمح لحزم Go باستدعاء كود C.

+

مزايا نوير

فيما يلي مزايا نوير على فايس.

+

دعم BitsetView

يقدم ميلفوس آلية مجموعة البتات لتحقيق "الحذف الناعم". لا يزال المتجه المحذوف حذفًا ناعمًا موجودًا في قاعدة البيانات ولكن لن يتم حسابه أثناء البحث أو الاستعلام عن تشابه المتجهات.

+

يتوافق كل بت في مجموعة البتات مع متجه مفهرس. إذا تم وضع علامة "1" على أحد المتجهات في مجموعة البتات، فهذا يعني أن هذا المتجه محذوف بشكل ناعم ولن يتم تضمينه أثناء البحث عن المتجهات. يتم تطبيق معلمة مجموعة البتات على جميع واجهات برمجة تطبيقات استعلام فهرس فايس المكشوفة في نوير، بما في ذلك فهارس وحدة المعالجة المركزية ووحدة معالجة الرسومات.

+

لمزيد من المعلومات حول آلية مجموعة البتات، راجع مجموعة البتات.

+

دعم مقاييس تشابه متعددة لفهرسة المتجهات الثنائية

يدعم Knowhere مقاييس هامينج وجاكارد وتانيموتو والبنية الفوقية والبنية الفرعية. يمكن استخدام Jaccard وTanimoto لقياس التشابه بين مجموعتي عينات بينما يمكن استخدام البنية الفائقة والبنية الفرعية لقياس تشابه البنى الكيميائية.

+

دعم مجموعة تعليمات AVX512

بصرف النظر عن AArch64 وSSE4.2 وAVX2، وهي مجموعات التعليمات المدعومة بالفعل من قبل Faiss، يدعم Knowhere أيضًا AVX512، والذي يمكنه تحسين أداء بناء الفهرس والاستعلام بنسبة 20% إلى 30% مقارنةً ب AVX2.

+

التحديد التلقائي لتعليمات SIMD

يدعم برنامج Knowhere استدعاء تعليمات SIMD المناسبة تلقائياً (على سبيل المثال، SIMD SSE وAVX وAVX2 وAVX512) على أي معالج وحدة معالجة مركزية (سواءً في الموقع أو على المنصات السحابية)، بحيث لا يحتاج المستخدمون إلى تحديد علامة SIMD يدوياً (على سبيل المثال، "-msse4") أثناء التجميع.

+

تم بناء Knowhere من خلال إعادة هيكلة قاعدة كود Faiss. يتم تحليل الدوال الشائعة (على سبيل المثال، حوسبة التشابه) التي تعتمد على تسريع SIMD. ثم يتم تنفيذ أربعة إصدارات لكل دالة (أي SSE، AVX، AVX2، AVX512) ويتم وضع كل منها في ملف مصدر منفصل. ثم يتم تجميع الملفات المصدرية بشكل فردي مع علامة SIMD المقابلة. لذلك، في وقت التشغيل، يمكن ل Knowhere اختيار تعليمات SIMD الأنسب تلقائيًا في وقت التشغيل بناءً على علامات وحدة المعالجة المركزية الحالية ثم ربط مؤشرات الدالة الصحيحة باستخدام التثبيت.

+

تحسينات أخرى للأداء

اقرأ ميلفوس: نظام إدارة بيانات المتجهات المصمم لغرض معين لمعرفة المزيد عن تحسين أداء نوير.

+

بنية كود نوير

تتضمن العمليات الحسابية في Milvus بشكل أساسي العمليات المتجهة والقياسية. يتعامل Knowhere مع العمليات على فهرسة المتجهات فقط.

+

الفهرس هو بنية بيانات مستقلة عن البيانات المتجهة الأصلية. وعمومًا، تتطلب الفهرسة أربع خطوات: إنشاء فهرس، وتدريب البيانات، وإدراج البيانات، وبناء فهرس. في بعض تطبيقات الذكاء الاصطناعي، يتم فصل تدريب مجموعة البيانات عن البحث عن المتجهات. يتم تدريب البيانات من مجموعات البيانات أولاً ثم إدراجها في قاعدة بيانات متجهة مثل Milvus للبحث عن التشابه. على سبيل المثال، تفرق مجموعات البيانات المفتوحة sift1M و sift1B بين البيانات للتدريب والبيانات للاختبار.

+

ومع ذلك، في نوير، البيانات للتدريب والبحث هي نفسها في نوير. يقوم برنامج Knowhere بتدريب جميع البيانات في مقطع ما ثم يقوم بإدراج جميع البيانات المدربة وإنشاء فهرس لها.

+

DataObj: الفئة الأساسية

DataObj هي الفئة الأساسية لجميع هياكل البيانات في نوير. Size() هي الطريقة الافتراضية الوحيدة في DataObj. ترث فئة الفهرس من DataObj مع حقل يسمى "size_". تحتوي فئة الفهرس أيضًا على طريقتين افتراضيتين - Serialize() و Load(). فئة VecIndex المشتقة من Index هي الفئة الأساسية الافتراضية لجميع الفهارس المتجهة. VecIndex توفر طرقًا تتضمن Train() و Query() و GetStatistics() و ClearStatistics().

+

+ + base class + الفئة الأساسية

+

بعض أنواع الفهارس الأخرى مدرجة على اليمين في الشكل أعلاه.

+
    +
  • يحتوي فهرس فايس على فئتين أساسيتين: FaissBaseIndex لجميع الفهارس على متجهات النقطة العائمة، و FaissBaseBinaryIndex لجميع الفهارس على المتجهات الثنائية.

  • +
  • GPUIndex هي الفئة الأساسية لجميع فهارس فايس GPU.

  • +
  • OffsetBaseIndex هي الفئة الأساسية لجميع الفهارس المطورة ذاتيًا. بالنظر إلى أنه يتم تخزين معرّفات المتجهات فقط في ملف الفهرس، يمكن تقليل حجم الملف للمتجهات ذات الـ 128 بُعدًا بمقدار رتبتين من حيث الحجم.

  • +
+

+ + IDMAP + IDMAP

+

من الناحية الفنية، IDMAP ليس فهرسًا، بل يُستخدم للبحث بالقوة الغاشمة. عندما يتم إدراج المتجهات في قاعدة البيانات، لا يلزم تدريب البيانات ولا بناء الفهرس. سيتم إجراء عمليات البحث مباشرة على بيانات المتجهات المدرجة.

+

ومع ذلك، من أجل اتساق الكود، يرث IDMAP أيضًا من فئة VecIndex بجميع واجهاتها الافتراضية. استخدام IDMAP هو نفسه استخدام المؤشرات الأخرى.

+

مؤشرات IVF

+ + IVF + IVF

+

مؤشرات IVF (الملف المقلوب) هي الأكثر استخدامًا. فالفئة IVF مشتقة من VecIndex و FaissBaseIndex ، وتمتد كذلك إلى IVFSQ و IVFPQ. GPUIVF مشتق من GPUIndex و IVF. ثم GPUIVF يمتد كذلك إلى GPUIVFSQ و GPUIVFPQ.

+

IVFSQHybrid هو مؤشر هجين مطور ذاتيًا. يتم تنفيذ مقياس كمي خشن على وحدة معالجة الرسومات بينما يتم البحث في الدلو على وحدة المعالجة المركزية. هذا النوع من الفهرس يمكن أن يقلل من حدوث نسخ الذاكرة بين وحدة المعالجة المركزية ووحدة معالجة الرسومات من خلال الاستفادة من قوة الحوسبة لوحدة معالجة الرسومات. IVFSQHybrid لديه نفس معدل الاستدعاء GPUIVFSQ ولكنه يأتي بأداء أفضل.

+

بنية الفئة الأساسية للمؤشرات الثنائية أبسط نسبيًا. BinaryIDMAP و BinaryIVF مشتقة من FaissBaseBinaryIndex و VecIndex.

+

مؤشرات الطرف الثالث

+ + third-party indices + مؤشرات الطرف الثالث

+

حاليًا، هناك نوعان فقط من مؤشرات الطرف الثالث مدعومان بصرف النظر عن مؤشر فايس: الفهرس القائم على الشجرة Annoy ، والفهرس القائم على الرسم البياني HNSW. هذان المؤشران الشائعان والمستخدمان بشكل متكرر من طرف ثالث كلاهما مشتق من VecIndex.

+

إضافة مؤشرات إلى "نوير

إذا كنت ترغب في إضافة مؤشرات جديدة إلى نوير، يمكنك أولاً الرجوع إلى المؤشرات الموجودة:

+
    +
  • لإضافة مؤشرات قائمة على الكمية، ارجع إلى IVF_FLAT.

  • +
  • لإضافة مؤشرات قائمة على الرسم البياني، راجع HNSW.

  • +
  • لإضافة مؤشرات قائمة على الشجرة، ارجع إلى Annoy.

  • +
+

بعد الإحالة إلى الفهرس الموجود، يمكنك اتباع الخطوات التالية لإضافة فهرس جديد إلى "نوير".

+
    +
  1. أضف اسم الفهرس الجديد في IndexEnum. نوع البيانات هو سلسلة.

  2. +
  3. أضف فحص التحقق من صحة البيانات على الفهرس الجديد في الملف ConfAdapter.cpp. التحقق من الصحة هو بشكل أساسي للتحقق من صحة المعلمات لتدريب البيانات والاستعلام.

  4. +
  5. قم بإنشاء ملف جديد للفهرس الجديد. يجب أن تتضمن الفئة الأساسية للفهرس الجديد VecIndex ، والواجهة الافتراضية اللازمة VecIndex.

  6. +
  7. أضف منطق بناء الفهرس للفهرس الجديد في VecIndexFactory::CreateVecIndex().

  8. +
  9. أضف اختبار الوحدة ضمن الدليل unittest.

  10. +
+

ما التالي

بعد التعرف على كيفية عمل Knowhere في ميلفوس، قد ترغب أيضًا في:

+ diff --git a/localization/v2.5.x/site/ar/reference/multi_tenancy.json b/localization/v2.5.x/site/ar/reference/multi_tenancy.json new file mode 100644 index 000000000..850011f7e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/multi_tenancy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Multi-tenancy strategies","anchorList":[{"label":"استراتيجيات الإيجار المتعدد","href":"Multi-tenancy-strategies","type":1,"isActive":false},{"label":"الإيجار المتعدد الموجه لقاعدة البيانات","href":"Database-oriented-multi-tenancy","type":2,"isActive":false},{"label":"الإيجار المتعدد الموجه نحو التجميع","href":"Collection-oriented-multi-tenancy","type":2,"isActive":false},{"label":"الإيجار المتعدد الموجه نحو التقسيم","href":"Partition-oriented-multi-tenancy","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/multi_tenancy.md b/localization/v2.5.x/site/ar/reference/multi_tenancy.md new file mode 100644 index 000000000..b6c3654e1 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/multi_tenancy.md @@ -0,0 +1,106 @@ +--- +id: multi_tenancy.md +related_key: multi-tenancy +summary: الإيجارات المتعددة في ميلفوس. +title: استراتيجيات الإيجار المتعدد +--- +

استراتيجيات الإيجار المتعدد

في العديد من حالات الاستخدام، يرغب المطورون في تشغيل مجموعة Milvus واحدة وخدمة مستأجرين متعددين، مثل فريقين من فرق المنتجات، أو ملايين المستخدمين النهائيين. يشرح هذا الدليل بعض الاستراتيجيات المختلفة لتحقيق الإيجار المتعدد على ميلفوس.

+

تم تصميم Milvus لدعم الإيجار المتعدد على مستويات قاعدة البيانات أو المجموعة أو القسم. الهدف من الإيجار المتعدد هو فصل البيانات والموارد عن بعضها البعض. يمكن أن يؤدي تنفيذ الإيجار المتعدد على مستويات مختلفة إلى تحقيق مدى مختلف من العزل ولكنه ينطوي أيضًا على نفقات عامة مختلفة. نوضح هنا المفاضلة بينهما.

+

الإيجار المتعدد الموجه لقاعدة البيانات

منذ الإصدار 2.2.9 من Milvus، يمكنك إنشاء قواعد بيانات متعددة في مجموعة Milvus واحدة. تجعل هذه الميزة من الممكن تحقيق الإيجار المتعدد الموجه لقاعدة البيانات من خلال تخصيص قاعدة بيانات لكل مستأجر، بحيث يمكنهم إنشاء مجموعاتهم الخاصة. يوفر هذا النهج أفضل عزل للبيانات والموارد للمستأجرين، ولكنه يقتصر على 64 قاعدة بيانات في مجموعة واحدة على الأكثر.

+

الإيجار المتعدد الموجه نحو التجميع

هناك طريقتان ممكنتان لتحقيق الإيجار المتعدد الموجه نحو التجميع.

+

مجموعة واحدة لجميع المستأجرين

يعد استخدام مجموعة واحدة لتنفيذ الإيجار المتعدد عن طريق إضافة حقل مستأجر للتمييز بين المستأجرين خيارًا بسيطًا. عند إجراء عمليات بحث ANN لمستأجر معين، أضف تعبير تصفية لتصفية جميع الكيانات التي تنتمي إلى مستأجرين آخرين. هذه هي أبسط طريقة لتحقيق تعدد المستأجرين. ومع ذلك، انتبه إلى أن أداء عامل التصفية قد يصبح عنق الزجاجة في عمليات بحث الشبكة النانوية ANN. ولتحسين أداء البحث، يمكنك تحسينه باستخدام الإيجار المتعدد الموجه للتقسيم أدناه.

+

مجموعة واحدة لكل مستأجر

هناك طريقة أخرى تتمثل في إنشاء مجموعة لكل مستأجر لتخزين بياناته الخاصة، بدلاً من تخزين بيانات جميع المستأجرين في مجموعة واحدة. يوفر هذا عزلًا أفضل للبيانات وأداءً أفضل للاستعلام. ومع ذلك، ضع في اعتبارك أن هذا النهج يتطلب المزيد من الموارد في الجدولة ويقتصر على 10,000 مجموعة في مجموعة على الأكثر.

+

الإيجار المتعدد الموجه نحو التقسيم

هناك طريقتان لتحقيق الإيجار المتعدد الموجه نحو التقسيم:

+

قسم واحد لكل مستأجر

إدارة مجموعة واحدة أسهل بكثير من إدارة مجموعات متعددة. بدلاً من إنشاء مجموعات متعددة، فكر في تخصيص قسم لكل مستأجر لتحقيق عزل مرن للبيانات وإدارة مرنة للذاكرة. أداء البحث في الإيجار المتعدد الموجه نحو الأقسام أفضل بكثير من الإيجار المتعدد الموجه نحو المجموعات. ومع ذلك، لاحظ أن عدد المستأجرين في المجموعة يجب ألا يتجاوز الحد الأقصى لعدد الأقسام التي يمكن أن تحتويها المجموعة.

+

الإيجار المتعدد القائم على مفتاح التقسيم

يقدم ميلفوس 2.2.9 ميزة جديدة تسمى مفتاح التقسيم. عند إنشاء مجموعة، قم بترشيح حقل مستأجر واجعله حقل مفتاح التقسيم. سيقوم Milvus بتخزين الكيانات في قسم وفقًا لقيمة تجزئة حقل مفتاح التقسيم. عند إجراء عمليات بحث ANN، يبحث Milvus فقط في القسم الذي يحتوي على مفتاح القسم. سيؤدي ذلك إلى تقليل نطاق البحث إلى حد كبير وبالتالي تحقيق أداء أفضل من دون مفتاح التقسيم.

+
+

ترفع هذه الاستراتيجية الحد الأقصى لعدد المستأجرين الذي يمكن أن تدعمه مجموعة Milvus وتبسط إدارة الموارد إلى حد كبير لأن Milvus يدير الأقسام تلقائيًا نيابةً عنك.

+

للتلخيص، يمكنك استخدام أي من استراتيجيات الإيجارات المتعددة المذكورة أعلاه أو بعضها لتشكيل الحل الخاص بك. يقوم الجدول التالي بإجراء مقارنات بين هذه الاستراتيجيات من حيث عزل البيانات وأداء البحث والحد الأقصى لعدد المستأجرين.

+ + + + + + + + + + + +
عزل البياناتأداء البحثالحد الأقصى لعدد المستأجرينالسيناريوهات الموصى بها
موجه نحو قاعدة البياناتقويقوي64بالنسبة لأولئك الذين يحتاجون إلى مجموعات تختلف باختلاف المشاريع، ومناسبة بشكل خاص لعزل البيانات بين الأقسام في مؤسستك.
مجموعة واحدة للجميعضعيفمتوسطغير متاحلأولئك الذين لديهم موارد محدودة ولا يهتمون بعزل البيانات.
مجموعة واحدة لكل مستأجرقويقويأقل من 10,000لأولئك الذين لديهم أقل من 10,000 مستأجر لكل مجموعة.
قسم واحد لكل مستأجرمتوسطقوي4,096لأولئك الذين لديهم أقل من 4,096 مستأجر لكل مجموعة.
قائم على مفتاح التقسيممتوسطقوي10,000,000+لأولئك الذين يتوقعون زيادة سريعة في عدد المستأجرين إلى الملايين.
+

ما التالي

إدارةمخططقواعد البيانات

diff --git a/localization/v2.5.x/site/ar/reference/replica.json b/localization/v2.5.x/site/ar/reference/replica.json new file mode 100644 index 000000000..7528ea7b7 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/replica.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-Memory Replica","anchorList":[{"label":"النسخ المتماثل داخل الذاكرة","href":"In-Memory-Replica","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المفاهيم الرئيسية","href":"Key-Concepts","type":2,"isActive":false},{"label":"تفاصيل التصميم","href":"Design-Details","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/replica.md b/localization/v2.5.x/site/ar/reference/replica.md new file mode 100644 index 000000000..a72a2f2bf --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/replica.md @@ -0,0 +1,91 @@ +--- +id: replica.md +summary: تعرف على النسخ المتماثل في الذاكرة في ميلفوس. +title: النسخ المتماثل داخل الذاكرة +--- +

النسخ المتماثل داخل الذاكرة

يقدم هذا الموضوع آلية النسخ المتماثل داخل الذاكرة (النسخ المتماثل) في ميلفوس التي تتيح نسخ متماثلة متعددة المقاطع في الذاكرة العاملة لتحسين الأداء والتوافر.

+

للحصول على معلومات حول كيفية تكوين النسخ المتماثلة في الذاكرة، راجع التكوينات المتعلقة بالعقدة الاستعلامية.

+

نظرة عامة

+ + Replica_Availiability + إمكانية_النسخ المتماثل

+

باستخدام النسخ المتماثلة داخل الذاكرة، يمكن لـ Milvus تحميل نفس المقطع على عقد استعلام متعددة. في حالة فشل عقدة استعلام واحدة أو انشغالها بطلب بحث حالي عند وصول عقدة استعلام أخرى، يمكن للنظام إرسال طلبات جديدة إلى عقدة استعلام خاملة لديها نسخة متماثلة لنفس المقطع.

+

الأداء

تسمح لك النسخ المتماثلة في الذاكرة بالاستفادة من موارد وحدة المعالجة المركزية والذاكرة الإضافية. وهي مفيدة جدًا إذا كانت لديك مجموعة بيانات صغيرة نسبيًا ولكنك ترغب في زيادة إنتاجية القراءة باستخدام موارد إضافية من الأجهزة. يمكن تحسين QPS (الاستعلام في الثانية) والإنتاجية بشكل كبير.

+

التوافر

تساعد النسخ المتماثلة في الذاكرة Milvus على التعافي بشكل أسرع في حالة تعطل عقدة الاستعلام. عندما تفشل عقدة استعلام، لا يلزم إعادة تحميل المقطع على عقدة استعلام أخرى. بدلاً من ذلك، يمكن إعادة إرسال طلب البحث إلى عقدة استعلام جديدة على الفور دون الحاجة إلى إعادة تحميل البيانات مرة أخرى. مع الاحتفاظ بنسخ متماثلة متعددة للمقاطع في وقت واحد، يكون النظام أكثر مرونة في مواجهة الفشل.

+

المفاهيم الرئيسية

يتم تنظيم النسخ المتماثلة في الذاكرة كمجموعات نسخ متماثلة. تحتوي كل مجموعة نسخ متماثلة على نسخ متماثلة للجزء. تحتوي كل نسخة متماثلة للجزء على نسخة متماثلة متدفقة ونسخة متماثلة تاريخية تتوافق مع الأجزاء المتنامية والمغلقة في الجزء (أي قناة DML).

+

+ + An illustration of how in-memory replica works + رسم توضيحي لكيفية عمل النسخ المتماثلة داخل الذاكرة

+

مجموعة النسخ المتماثلة

تتكون مجموعة النسخ المتماثلة من عقد استعلام متعددة مسؤولة عن التعامل مع البيانات التاريخية والنسخ المتماثلة.

+

النسخة المتماثلة للجزء المتماثل

تتألف النسخة المتماثلة للجزء من نسخة متماثلة متدفقة ونسخة متماثلة تاريخية، وكلاهما ينتميان إلى نفس الجزء. يتم تحديد عدد النسخ المتماثلة للجزء في مجموعة النسخ المتماثلة من خلال عدد الأجزاء في مجموعة محددة.

+

النسخة المتماثلة المتدفقة

تحتوي النسخة المتماثلة المتدفقة على جميع الأجزاء المتزايدة من نفس قناة DML. من الناحية الفنية، يجب تقديم نسخة متماثلة متدفقة بواسطة عقدة استعلام واحدة فقط في نسخة متماثلة واحدة.

+

النسخة المتماثلة التاريخية

تحتوي النسخة المتماثلة التاريخية على جميع المقاطع المختومة من نفس قناة DML. يمكن توزيع المقاطع المختومة لنسخة متماثلة تاريخية واحدة على عدة عقد استعلام داخل نفس مجموعة النسخ المتماثلة.

+

قائد الجزء

قائد الجزء هو عقدة الاستعلام التي تخدم النسخة المتماثلة المتدفقة في نسخة متماثلة للجزء.

+

تفاصيل التصميم

التوازن

سيتم تخصيص مقطع جديد يحتاج إلى تحميله إلى عدة عقد استعلام مختلفة. يمكن معالجة طلب البحث بمجرد تحميل نسخة متماثلة واحدة على الأقل بنجاح.

+

ذاكرة التخزين المؤقت

يحتفظ الوكيل بذاكرة تخزين مؤقت تقوم بتعيين المقاطع إلى عقد الاستعلام وتحديثها بشكل دوري. عندما يتلقى الوكيل طلبًا، يحصل ميلفوس على جميع المقاطع المختومة التي تحتاج إلى البحث من ذاكرة التخزين المؤقت ويحاول تعيينها إلى عقد الاستعلام بالتساوي.

+

بالنسبة للقطاعات المتزايدة، يحتفظ الوكيل أيضاً بذاكرة تخزين مؤقتة من قناة إلى عقدة استعلام ويرسل الطلبات إلى عقد الاستعلام المقابلة.

+

تجاوز الفشل

لا تكون ذاكرات التخزين المؤقت على الوكيل محدثة دائماً. قد تكون بعض المقاطع أو القنوات قد تم نقلها إلى عقد استعلام أخرى عند ورود طلب. في هذه الحالة، سيتلقى الوكيل رداً بالخطأ، وسيقوم بتحديث ذاكرة التخزين المؤقت ومحاولة تعيينها إلى عقدة استعلام أخرى.

+

سيتم تجاهل المقطع إذا تعذر على الوكيل العثور عليه بعد تحديث ذاكرة التخزين المؤقت. قد يحدث هذا إذا تم ضغط المقطع.

+

إذا كانت ذاكرة التخزين المؤقت غير دقيقة، فقد يفوت الوكيل بعض المقاطع. تقوم عقد الاستعلام مع قنوات DML (المقاطع المتزايدة) بإرجاع استجابات البحث مع قائمة بالمقاطع الموثوقة التي يمكن للوكيل مقارنتها وتحديث ذاكرة التخزين المؤقت بها.

+

التحسين

لا يمكن للوكيل تخصيص طلبات البحث لعقد الاستعلام بشكل متساوٍ تمامًا وقد يكون لعقد الاستعلام موارد مختلفة لخدمة طلبات البحث. لتجنب التوزيع طويل الذيل للموارد، سيقوم الوكيل بتعيين مقاطع نشطة على عقد استعلام أخرى إلى عقدة استعلام خاملة لديها هذه المقاطع أيضاً.

diff --git a/localization/v2.5.x/site/ar/reference/scalar_index.json b/localization/v2.5.x/site/ar/reference/scalar_index.json new file mode 100644 index 000000000..c9f26fff7 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/scalar_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Scalar Index","anchorList":[{"label":"الفهرس القياسي","href":"Scalar-Index","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"خوارزميات فهرسة الحقول العددية","href":"Scalar-field-indexing-algorithms","type":2,"isActive":false},{"label":"توصيات الأداء","href":"Performance-recommandations","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/scalar_index.md b/localization/v2.5.x/site/ar/reference/scalar_index.md new file mode 100644 index 000000000..877b5320d --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/scalar_index.md @@ -0,0 +1,165 @@ +--- +id: scalar_index.md +related_key: scalar_index +summary: المؤشر القياسي في ميلفوس. +title: الفهرس القياسي +--- +

الفهرس القياسي

يدعم Milvus عمليات البحث المفهرسة التي تجمع بين الحقول القياسية والمتجهة. ولتعزيز كفاءة عمليات البحث التي تتضمن حقولاً قياسية، قدم ميلفوس فهرسة الحقول القياسية بدءاً من الإصدار 2.1.0. تقدم هذه المقالة لمحة عامة عن فهرسة الحقول القياسية في ملفوس، مما يساعدك على فهم أهميتها وتنفيذها.

+

نظرة عامة

بمجرد إجراء عمليات البحث عن تشابه المتجهات في Milvus، يمكنك استخدام العوامل المنطقية لتنظيم الحقول القياسية في تعبيرات منطقية.

+

عندما يتلقى Milvus طلب بحث بتعبير منطقي كهذا، فإنه يقوم بتحليل التعبير المنطقي إلى شجرة بناء الجملة المجردة (AST) لإنشاء خطة فعلية لتصفية السمات. ثم يطبق Milvus الخطة الفيزيائية في كل جزء لتوليد مجموعة بتات كنتيجة للتصفية ويتضمن النتيجة كمعامل بحث متجه لتضييق نطاق البحث. في هذه الحالة، تعتمد سرعة عمليات البحث المتجه بشكل كبير على سرعة تصفية السمة.

+

+ + Attribute filtering in a segment + تصفية السمة في مقطع

+

تعد فهرسة الحقول العددية طريقة لضمان سرعة تصفية السمات من خلال فرز قيم الحقول العددية بطريقة معينة لتسريع استرجاع المعلومات.

+

خوارزميات فهرسة الحقول العددية

يهدف ميلفوس إلى تحقيق استخدام منخفض للذاكرة، وكفاءة تصفية عالية، ووقت تحميل قصير من خلال خوارزميات فهرسة الحقول العددية. تصنف هذه الخوارزميات إلى نوعين رئيسيين: الفهرسة التلقائية والفهرسة المقلوبة.

+

الفهرسة التلقائية

يوفر ميلفوس الخيار AUTOINDEX لتحريرك من الاضطرار إلى اختيار نوع الفهرسة يدويًا. عند استدعاء طريقة create_index ، إذا لم يتم تحديد index_type ، يقوم ميلفوس تلقائيًا باختيار نوع الفهرسة الأنسب بناءً على نوع البيانات.

+

يسرد الجدول التالي أنواع البيانات التي يدعمها Milvus وخوارزميات الفهرسة التلقائية المقابلة لها.

+ + + + + + + + + + + + + +
نوع البياناتخوارزمية الفهرسة التلقائية
فهرس مقلوبفهرس مقلوب
INT8فهرس مقلوب
INT16فهرس مقلوب
INT32فهرس مقلوب
INT64فهرس مقلوب
فهرس مسطحفهرس مقلوب
مزدوجفهرس مقلوب
+

الفهرسة المقلوبة

توفر الفهرسة المقلوبة طريقة مرنة لإنشاء فهرس لحقل قياسي عن طريق تحديد معلمات الفهرس يدويًا. تعمل هذه الطريقة بشكل جيد مع سيناريوهات مختلفة، بما في ذلك الاستعلامات النقطية، واستعلامات مطابقة الأنماط، وعمليات البحث عن النص الكامل، وعمليات البحث عن JSON، وعمليات البحث المنطقي، وحتى استعلامات مطابقة البادئة.

+

يتم تشغيل الفهارس المقلوبة التي تم تنفيذها في Milvus بواسطة Tantivy، وهي مكتبة محرك بحث النص الكامل. تضمن Tantivy أن تكون الفهرسة المقلوبة في Milvus فعالة وسريعة.

+

يحتوي الفهرس المقلوب على عنصرين رئيسيين: قاموس المصطلح والقائمة المقلوبة. يتضمن قاموس المصطلحات جميع الكلمات الرمزية مرتبة أبجديًا، بينما تحتوي القائمة المقلوبة على قائمة المستندات التي تظهر فيها كل كلمة. هذا الإعداد يجعل الاستعلامات النقطية واستعلامات النطاق أسرع بكثير وأكثر كفاءة من عمليات البحث الغاشمة.

+

+ + Inverted index diagram + مخطط الفهرس المقلوب

+

تتضح مزايا استخدام الفهرس المقلوب بشكل خاص في العمليات التالية:

+
    +
  • الاستعلام النقطي: على سبيل المثال، عند البحث عن المستندات التي تحتوي على كلمة Milvus، تبدأ العملية بالتحقق مما إذا كانت كلمة Milvus موجودة في قاموس المصطلح. إذا لم يتم العثور عليها، فلا توجد مستندات تحتوي على الكلمة. ومع ذلك، إذا تم العثور عليها، يتم استرجاع القائمة المقلوبة المرتبطة بكلمة Milvus، مع الإشارة إلى المستندات التي تحتوي على الكلمة. تعد هذه الطريقة أكثر كفاءة بكثير من البحث بالقوة الغاشمة من خلال مليون مستند، حيث يقلل قاموس المصطلحات المصنفة بشكل كبير من تعقيدات الوقت اللازم للعثور على كلمة Milvus.
  • +
  • استعلام النطاق: يتم أيضًا تعزيز كفاءة استعلامات النطاق، مثل العثور على المستندات التي تحتوي على كلمات أكبر من جدا أبجديًا، من خلال قاموس المصطلحات المصنفة. يعد هذا النهج أكثر كفاءة من البحث الفوري، مما يوفر نتائج أسرع وأكثر دقة.
  • +
+

نتائج الاختبار

لتوضيح التحسينات في الأداء التي توفرها الفهارس القياسية في ميلفوس، تم إجراء تجربة تقارن أداء العديد من التعبيرات باستخدام الفهرسة المقلوبة والبحث بالقوة الغاشمة على البيانات الأولية.

+

تضمنت التجربة اختبار تعبيرات مختلفة في ظل شرطين: باستخدام فهرس مقلوب وبحث بالقوة الغاشمة. لضمان العدالة، تم الحفاظ على نفس توزيع البيانات عبر الاختبارات، باستخدام نفس المجموعة في كل مرة. قبل كل اختبار، تم تحرير المجموعة، وتم إسقاط الفهرس وإعادة بنائه. بالإضافة إلى ذلك، تم إجراء استعلام دافئ قبل كل اختبار لتقليل تأثير البيانات الباردة والساخنة، وتم تنفيذ كل استعلام عدة مرات لضمان الدقة.

+

بالنسبة لمجموعة بيانات مكونة من مليون سجل، يمكن أن يوفر استخدام فهرس مقلوب ما يصل إلى 30 ضعفًا من الأداء للاستعلامات النقطية. يمكن أن تكون مكاسب الأداء أكثر أهمية بالنسبة لمجموعات البيانات الأكبر حجمًا.

+

توصيات الأداء

للاستفادة الكاملة من قدرة Milvus في فهرسة الحقول القياسية وإطلاق العنان لقوته في عمليات البحث عن التشابه المتجه، قد تحتاج إلى نموذج لتقدير حجم الذاكرة المطلوبة بناءً على البيانات التي لديك.

+

تسرد الجداول التالية وظائف التقدير لجميع أنواع البيانات التي يدعمها ملفوس.

+
    +
  • الحقول العددية

    + + + + + + + + + + + + +
    نوع البياناتدالة تقدير الذاكرة (ميغابايت)
    INT8numOfRows * 12 / 1024 / 1024
    INT16عدد الصفوف * 12/1024 / 1024 / 1024
    INT32عدد الصفوف * 12 / 1024 / 1024 / 1024
    INT64numOfRows * 24 / 1024 / 1024 / 1024
    FLOAT32عدد الصفوف * 12 / 1024 / 1024 / 1024
    مزدوجعدد الصفوف * 24 / 1024 / 1024 / 1024
    +
  • +
  • حقول السلسلة

    + + + + + + + + + + + + +
    طول السلسلةدالة تقدير الذاكرة (ميغابايت)
    (0, 8]numOfRows * 128 / 1024 / 1024
    (8, 16]عدد الصفوف * 144 / 1024 / 1024 / 1024
    (16, 32]عدد الصفوف * 160 / 1024 / 1024 / 1024
    (32, 64]عدد الصفوف * 192 / 1024 / 1024 / 1024
    (64, 128]عدد الصفوف * 256 / 1024 / 1024 / 1024
    (128, 65535]numOfRows * strLen * 1.5 / 1024 / 1024
    +
  • +
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/schema.json b/localization/v2.5.x/site/ar/reference/schema.json new file mode 100644 index 000000000..f53a37103 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import DataType, FieldSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# The following creates a field and use it as the partition key\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n","from pymilvus import DataType, FieldSchema\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n # configure default value `25` for field `age`\n FieldSchema(name=\"age\", dtype=DataType.INT64, default_value=25, description=\"age\"),\n embedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n]\n","from pymilvus import DataType, FieldSchema, CollectionSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n\n# Set enable_dynamic_field to True if you need to use dynamic fields. \nschema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description=\"desc of a collection\")\n","from pymilvus import Collection, connections\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\ncollection_name1 = \"tutorial_1\"\ncollection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)\n","from pymilvus import Collection\nimport pandas as pd\ndf = pd.DataFrame({\n \"id\": [i for i in range(nb)],\n \"age\": [random.randint(20, 40) for i in range(nb)],\n \"embedding\": [[random.random() for _ in range(dim)] for _ in range(nb)],\n \"position\": \"test_pos\"\n})\n\ncollection, ins_res = Collection.construct_from_dataframe(\n 'my_collection',\n df,\n primary_field='id',\n auto_id=False\n )\n"],"headingContent":"Manage Schema","anchorList":[{"label":"إدارة المخطط","href":"Manage-Schema","type":1,"isActive":false},{"label":"مخطط الحقل","href":"Field-schema","type":2,"isActive":false},{"label":"مخطط المجموعة","href":"Collection-schema","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/schema.md b/localization/v2.5.x/site/ar/reference/schema.md new file mode 100644 index 000000000..95dff83e2 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/schema.md @@ -0,0 +1,252 @@ +--- +id: schema.md +summary: تعلم كيفية تعريف مخطط في ميلفوس. +title: إدارة المخطط +--- +

إدارة المخطط

يقدم هذا الموضوع المخطط في ملفوس. يُستخدم المخطط لتحديد خصائص المجموعة والحقول الموجودة بداخلها.

+

مخطط الحقل

مخطط الحقل هو التعريف المنطقي للحقل. وهو أول ما تحتاج إلى تعريفه قبل تحديد مخطط المجموعة وإدارة المجموعات.

+

يدعم Milvus حقل مفتاح أساسي واحد فقط في المجموعة.

+

خصائص مخطط الحقل

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الخصائصالوصفملاحظة
nameاسم الحقل في المجموعة المراد إنشاؤهانوع البيانات: سلسلة.
إلزامي
dtypeنوع بيانات الحقلإلزامي
descriptionوصف الحقلنوع البيانات: سلسلة.
اختياري
is_primaryما إذا كان سيتم تعيين الحقل كحقل مفتاح أساسي أم لانوع البيانات: منطقية (true أو false).
إلزامي لحقل المفتاح الأساسي
auto_id (إلزامي لحقل المفتاح الأساسي)التبديل لتمكين أو تعطيل التخصيص التلقائي للمعرف (المفتاح الأساسي).True أو False
max_length (إلزامي لحقل VARCHAR)الحد الأقصى لطول البايت للسلاسل المسموح بإدراجها. لاحظ أن الأحرف متعددة البايتات (على سبيل المثال، أحرف Unicode) قد تشغل أكثر من بايت واحد لكل منها، لذا تأكد من أن طول البايت للسلاسل المدرجة لا يتجاوز الحد المحدد.[1, 65,535]
dimبُعد المتجهنوع البيانات: عدد صحيح ∈ [1، 32768].
إلزامي لحقل متجه كثيف. حذف لحقل متجه متناثر.
is_partition_keyما إذا كان هذا الحقل هو حقل مفتاح التقسيم.نوع البيانات: منطقية (true أو false).
+

إنشاء مخطط حقل

لتقليل التعقيد في إدخالات البيانات، يسمح لك Milvus بتحديد قيمة افتراضية لكل حقل متجه أثناء إنشاء مخطط الحقل، باستثناء حقل المفتاح الأساسي. يشير هذا إلى أنه إذا تركت حقلاً فارغًا عند إدراج البيانات، يتم تطبيق القيمة الافتراضية التي حددتها لهذا الحقل.

+

إنشاء مخطط حقل عادي:

+
from pymilvus import DataType, FieldSchema
+id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
+age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
+embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
+
+# The following creates a field and use it as the partition key
+position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
+
+

إنشاء مخطط حقل بقيم الحقول الافتراضية:

+
from pymilvus import DataType, FieldSchema
+
+fields = [
+  FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
+  # configure default value `25` for field `age`
+  FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
+  embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
+]
+
+

أنواع البيانات المدعومة

DataType يحدد نوع البيانات التي يحتوي عليها الحقل. تدعم الحقول المختلفة أنواع بيانات مختلفة.

+
    +
  • يدعم حقل المفتاح الأساسي:

    +
      +
    • INT64: numpy.int64
    • +
    • varchar: varchar
    • +
  • +
  • يدعم الحقل العددي:

    +
      +
    • BOOL: منطقية (true أو false)
    • +
    • INT8: numpy.int8
    • +
    • INT16: numpy.int16
    • +
    • INT32: numpy.int32
    • +
    • INT64: numpy.int64
    • +
    • FLOAT: numpy.float32
    • +
    • مزدوج: numpy.double.numpy.double
    • +
    • varchar: varchar
    • +
    • JSON: JSON
    • +
    • صفيف: مصفوفة
    • +
    +

    يتوفر JSON كنوع بيانات مركب. يتألف حقل JSON من أزواج مفاتيح وقيمة. كل مفتاح عبارة عن سلسلة، ويمكن أن تكون القيمة رقمًا أو سلسلة أو قيمة منطقية أو مصفوفة أو قائمة. لمزيد من التفاصيل، راجع JSON: نوع بيانات جديد.

  • +
  • يدعم حقل المتجه:

    +
      +
    • BINARY_VECTOR: يخزّن البيانات الثنائية كسلسلة من 0 و1، ويستخدم لتمثيل الميزات المدمجة في معالجة الصور واسترجاع المعلومات.
    • +
    • FLOAT_VECTOR: يخزن الأرقام ذات الفاصلة العائمة 32 بت، وتستخدم عادةً في الحوسبة العلمية والتعلم الآلي لتمثيل الأرقام الحقيقية.
    • +
    • FLOAT16_VECTOR: يخزّن الأرقام ذات الفاصلة العائمة نصف الدقيقة ذات 16 بت، وتستخدم في التعلم العميق وحسابات وحدة معالجة الرسومات من أجل كفاءة الذاكرة وعرض النطاق الترددي.
    • +
    • BFLOAT16_VECTOR: يخزّن الأرقام ذات الفاصلة العائمة 16 بت بدقة منخفضة ولكن بنفس نطاق الأس مثل Float32، وهي شائعة في التعلّم العميق لتقليل متطلبات الذاكرة والحسابات دون التأثير على الدقة بشكل كبير.
    • +
    • SPARSE_FLOAT_VECTOR: يخزن قائمة بالعناصر غير الصفرية والمؤشرات المقابلة لها، وتستخدم لتمثيل المتجهات المتفرقة. لمزيد من المعلومات، راجع المتجهات المتفرقة.
    • +
    +

    يدعم ميلفوس حقول متجهات متعددة في مجموعة. لمزيد من المعلومات، راجع البحث المختلط.

  • +
+

مخطط المجموعة

مخطط المجموعة هو التعريف المنطقي للمجموعة. وعادةً ما تحتاج إلى تعريف مخطط الحقل قبل تعريف مخطط المجموعة وإدارة المجموعات.

+

خصائص مخطط المجموعة

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الخصائصالوصفملاحظة
fieldالحقول في المجموعة المراد إنشاؤهاإلزامي
descriptionوصف المجموعةنوع البيانات: سلسلة.
اختياري
partition_key_fieldاسم الحقل الذي تم تصميمه ليكون بمثابة مفتاح التقسيم.نوع البيانات: سلسلة.
اختياري.
enable_dynamic_fieldما إذا كان سيتم تمكين المخطط الديناميكي أم لانوع البيانات: منطقية (true أو false).
اختياري، الإعداد الافتراضي False.
للحصول على تفاصيل حول المخطط الديناميكي، راجع المخطط الديناميكي وأدلة المستخدم لإدارة المجموعات.
+

إنشاء مخطط مجموعة

+ حدد مخططات الحقول قبل تحديد مخطط مجموعة.
+
from pymilvus import DataType, FieldSchema, CollectionSchema
+id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
+age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
+embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
+
+# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
+position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
+
+# Set enable_dynamic_field to True if you need to use dynamic fields. 
+schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")
+
+

قم بإنشاء مجموعة بالمخطط المحدد:

+
from pymilvus import Collection, connections
+conn = connections.connect(host="127.0.0.1", port=19530)
+collection_name1 = "tutorial_1"
+collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
+
+
+
    +
  • يمكنك تعريف رقم الجزء مع shards_num.
  • +
  • يمكنك تحديد خادم ميلفوس الذي ترغب في إنشاء مجموعة عليه من خلال تحديد الاسم المستعار في using.
  • +
  • يمكنك تمكين ميزة مفتاح التقسيم على أحد الحقول عن طريق تعيين is_partition_key إلى True على الحقل إذا كنت بحاجة إلى تنفيذ التآخي المتعدد المستند إلى مفتاح التقسيم.
  • +
  • يمكنك تمكين المخطط الديناميكي عن طريق تعيين enable_dynamic_field إلى True في مخطط المجموعة إذا كنت بحاجة إلى تمكين الحقل الديناميكي.
  • +
+
+


+يمكنك أيضًا إنشاء مجموعة باستخدام Collection.construct_from_dataframe ، والتي تقوم تلقائيًا بإنشاء مخطط مجموعة من DataFrame وإنشاء مجموعة.

+
from pymilvus import Collection
+import pandas as pd
+df = pd.DataFrame({
+    "id": [i for i in range(nb)],
+    "age": [random.randint(20, 40) for i in range(nb)],
+    "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
+    "position": "test_pos"
+})
+
+collection, ins_res = Collection.construct_from_dataframe(
+    'my_collection',
+    df,
+    primary_field='id',
+    auto_id=False
+    )
+
+

ما التالي

diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_common.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_common.json new file mode 100644 index 000000000..dff381106 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_common.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"common-related Configurations","anchorList":[{"label":"التكوينات المشتركة ذات الصلة","href":"common-related-Configurations","type":1,"isActive":false},{"label":"common.defaultPartitionName","href":"commondefaultPartitionName","type":2,"isActive":false},{"label":"common.defaultIndexName","href":"commondefaultIndexName","type":2,"isActive":false},{"label":"common.entityExpiration","href":"commonentityExpiration","type":2,"isActive":false},{"label":"common.indexSliceSize","href":"commonindexSliceSize","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.highPriority","href":"commonthreadCoreCoefficienthighPriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.middlePriority","href":"commonthreadCoreCoefficientmiddlePriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.lowPriority","href":"commonthreadCoreCoefficientlowPriority","type":2,"isActive":false},{"label":"common.gracefulTime","href":"commongracefulTime","type":2,"isActive":false},{"label":"common.gracefulStopTimeout","href":"commongracefulStopTimeout","type":2,"isActive":false},{"label":"common.storageType","href":"commonstorageType","type":2,"isActive":false},{"label":"common.simdType","href":"commonsimdType","type":2,"isActive":false},{"label":"common.security.superUsers","href":"commonsecuritysuperUsers","type":2,"isActive":false},{"label":"common.security.defaultRootPassword","href":"commonsecuritydefaultRootPassword","type":2,"isActive":false},{"label":"common.session.ttl","href":"commonsessionttl","type":2,"isActive":false},{"label":"common.session.retryTimes","href":"commonsessionretryTimes","type":2,"isActive":false},{"label":"common.locks.metrics.enable","href":"commonlocksmetricsenable","type":2,"isActive":false},{"label":"common.locks.threshold.info","href":"commonlocksthresholdinfo","type":2,"isActive":false},{"label":"common.locks.threshold.warn","href":"commonlocksthresholdwarn","type":2,"isActive":false},{"label":"common.ttMsgEnabled","href":"commonttMsgEnabled","type":2,"isActive":false},{"label":"common.traceLogMode","href":"commontraceLogMode","type":2,"isActive":false},{"label":"common.bloomFilterSize","href":"commonbloomFilterSize","type":2,"isActive":false},{"label":"common.maxBloomFalsePositive","href":"commonmaxBloomFalsePositive","type":2,"isActive":false},{"label":"common.bloomFilterType","href":"commonbloomFilterType","type":2,"isActive":false},{"label":"common.bloomFilterApplyBatchSize","href":"commonbloomFilterApplyBatchSize","type":2,"isActive":false},{"label":"common.usePartitionKeyAsClusteringKey","href":"commonusePartitionKeyAsClusteringKey","type":2,"isActive":false},{"label":"common.useVectorAsClusteringKey","href":"commonuseVectorAsClusteringKey","type":2,"isActive":false},{"label":"common.enableVectorClusteringKey","href":"commonenableVectorClusteringKey","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_common.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_common.md new file mode 100644 index 000000000..9b53f1645 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_common.md @@ -0,0 +1,812 @@ +--- +id: configure_common.md +related_key: configure +group: system_configuration.md +summary: تعلم كيفية تهيئة المشترك لميلفوس. +--- +

التكوينات المشتركة ذات الصلة

common.defaultPartitionName

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
اسم القسم الافتراضي عند إنشاء مجموعة ما _افتراضي
+

common.defaultIndexName

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
اسم الفهرس عندما يتم إنشاؤه باسم غير محدد _default_idx
+

common.entityExpiration

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
انتهاء صلاحية الكيان بالثواني، تنبيه -1 يعني عدم انتهاء الصلاحية أبدًا -1
+

common.indexSliceSize

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
حجم شريحة الفهرس بالميجابايت 16
+

common.threadCoreCoefficient.highPriority

+ + + + + + + + + + + + +
القيمة الافتراضيةالقيمة الافتراضية
تحدد هذه المعلمة عدد مرات عدد الخيوط التي تمثل عدد النوى في تجمع الأولوية العالية 10
+

common.threadCoreCoefficient.middlePriority

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
تحدد هذه المعلمة عدد المرات التي يكون فيها عدد الخيوط هو عدد النوى في تجمع الأولوية المتوسطة 5
+

common.threadCoreCoefficient.lowPriority

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
تحدد هذه المعلمة عدد المرات التي يكون فيها عدد مؤشرات الترابط هو عدد النوى في تجمع الأولوية المنخفضة 1
+

common.gracefulTime

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
بالمللي ثانية. تمثل الفاصل الزمني (بالمللي ثانية) الذي يجب طرح وقت وصول الطلب في حالة الاتساق المحدود. 5000
+

common.gracefulStopTimeout

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
ثانية. سيؤدي ذلك إلى فرض إنهاء الخادم إذا لم تكتمل عملية الإيقاف الآمن خلال هذا الوقت. 1800
+

common.storageType

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
يرجى الضبط في ميلفوس المضمنة: محلي، القيم المتوفرة هي [محلي، بعيد، أوبندال]، القيمة مينيو مهملة، استخدم بعيد بدلاً منها بعيد
+

common.simdType

+ + + + + + + + + + + + +
الوصفالقيمة الافتراضية
+
  • القيمة الافتراضية: تلقائي
  • +
  • القيم الصالحة: [تلقائي، avx512، avx2، avx2، avx، sse4_2]
  • +
  • يتم استخدام هذا التكوين فقط من قبل querynode و indexnode، فهو يحدد مجموعة تعليمات وحدة المعالجة المركزية للبحث وبناء الفهرس.
  • تلقائي
    +

    common.security.superUsers

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • سيتجاهل المستخدمون الفائقون بعض عمليات التحقق من النظام,
  • +
  • مثل التحقق من كلمة المرور القديمة عند تحديث بيانات الاعتماد
  • +

    common.security.defaultRootPassword

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    كلمة المرور الافتراضية للمستخدم الجذر ميلفوس
    +

    common.session.ttl

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    قيمة ttl عند منح جلسة العمل عقد إيجار لتسجيل الخدمة 30
    +

    common.session.retryTimes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أوقات إعادة المحاولة عند إرسال جلسة العمل لطلبات إلخd 30
    +

    common.locks.metrics.enable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان جمع الإحصائيات لأقفال المقاييس خطأ
    +

    common.locks.threshold.info

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى بالمللي ثانية لطباعة المدد الزمنية في مستوى المعلومات 500
    +

    common.locks.threshold.warn

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى بالمللي ثانية لمدد الطباعة في مستوى التحذير 1000
    +

    common.ttMsgEnabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • ما إذا كان سيتم تعطيل آلية المراسلة الزمنية الداخلية للنظام.
  • +
  • في حالة تعطيلها (تعيينها إلى خطأ)، لن يسمح النظام بعمليات DML، بما في ذلك الإدراج والحذف والاستعلامات وعمليات البحث.
  • +
  • يساعد هذا الأمر Milvus-CDC على مزامنة البيانات الإضافية
  • صحيح
    +

    common.traceLogMode

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تتبع معلومات الطلب 0
    +

    common.bloomFilterSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحجم الأولي لمرشح التفتح 100000
    +

    common.maxBloomFalsePositive

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أقصى معدل إيجابي كاذب لمرشح التفتح 0.001
    +

    common.bloomFilterType

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    نوع فلتر التفتح، دعم BasicBloomFilter و BlockedBloomFilter الفلتر الأساسيBloomFilter
    +

    common.bloomFilterApplyBatchSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم الدُفعة عند تطبيق pk على مرشح التفتح 1000
    +

    common.usePartitionKeyAsClusteringKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كان صوابًا، قم بإجراء ضغط التجميع وتشذيب المقطع على حقل مفتاح التقسيم خطأ
    +

    common.useVectorAsClusteringKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كان صواباً، القيام بضغط التجميع وتقليم المقاطع على حقل المتجه خطأ
    +

    common.enableVectorClusteringKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كانت صواب، تمكين مفتاح تجميع المتجهات وضغط تجميع المتجهات خطأ
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.json new file mode 100644 index 000000000..e528cda1e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataCoord-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالبيانات","href":"dataCoord-related-Configurations","type":1,"isActive":false},{"label":"dataCoord.channel.watchTimeoutInterval","href":"dataCoordchannelwatchTimeoutInterval","type":2,"isActive":false},{"label":"dataCoord.channel.balanceWithRpc","href":"dataCoordchannelbalanceWithRpc","type":2,"isActive":false},{"label":"dataCoord.channel.legacyVersionWithoutRPCWatch","href":"dataCoordchannellegacyVersionWithoutRPCWatch","type":2,"isActive":false},{"label":"dataCoord.channel.balanceSilentDuration","href":"dataCoordchannelbalanceSilentDuration","type":2,"isActive":false},{"label":"dataCoord.channel.balanceInterval","href":"dataCoordchannelbalanceInterval","type":2,"isActive":false},{"label":"dataCoord.channel.checkInterval","href":"dataCoordchannelcheckInterval","type":2,"isActive":false},{"label":"dataCoord.channel.notifyChannelOperationTimeout","href":"dataCoordchannelnotifyChannelOperationTimeout","type":2,"isActive":false},{"label":"dataCoord.segment.maxSize","href":"dataCoordsegmentmaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.diskSegmentMaxSize","href":"dataCoordsegmentdiskSegmentMaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.sealProportion","href":"dataCoordsegmentsealProportion","type":2,"isActive":false},{"label":"dataCoord.segment.assignmentExpiration","href":"dataCoordsegmentassignmentExpiration","type":2,"isActive":false},{"label":"dataCoord.segment.allocLatestExpireAttempt","href":"dataCoordsegmentallocLatestExpireAttempt","type":2,"isActive":false},{"label":"dataCoord.segment.maxLife","href":"dataCoordsegmentmaxLife","type":2,"isActive":false},{"label":"dataCoord.segment.maxIdleTime","href":"dataCoordsegmentmaxIdleTime","type":2,"isActive":false},{"label":"dataCoord.segment.minSizeFromIdleToSealed","href":"dataCoordsegmentminSizeFromIdleToSealed","type":2,"isActive":false},{"label":"dataCoord.segment.maxBinlogFileNumber","href":"dataCoordsegmentmaxBinlogFileNumber","type":2,"isActive":false},{"label":"dataCoord.segment.smallProportion","href":"dataCoordsegmentsmallProportion","type":2,"isActive":false},{"label":"dataCoord.segment.compactableProportion","href":"dataCoordsegmentcompactableProportion","type":2,"isActive":false},{"label":"dataCoord.segment.expansionRate","href":"dataCoordsegmentexpansionRate","type":2,"isActive":false},{"label":"dataCoord.sealPolicy.channel.growingSegmentsMemSize","href":"dataCoordsealPolicychannelgrowingSegmentsMemSize","type":2,"isActive":false},{"label":"dataCoord.autoUpgradeSegmentIndex","href":"dataCoordautoUpgradeSegmentIndex","type":2,"isActive":false},{"label":"dataCoord.segmentFlushInterval","href":"dataCoordsegmentFlushInterval","type":2,"isActive":false},{"label":"dataCoord.enableCompaction","href":"dataCoordenableCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.enableAutoCompaction","href":"dataCoordcompactionenableAutoCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.enable","href":"dataCoordcompactionclusteringenable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.autoEnable","href":"dataCoordcompactionclusteringautoEnable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.triggerInterval","href":"dataCoordcompactionclusteringtriggerInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minInterval","href":"dataCoordcompactionclusteringminInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxInterval","href":"dataCoordcompactionclusteringmaxInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.newDataSizeThreshold","href":"dataCoordcompactionclusteringnewDataSizeThreshold","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxTrainSizeRatio","href":"dataCoordcompactionclusteringmaxTrainSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxCentroidsNum","href":"dataCoordcompactionclusteringmaxCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minCentroidsNum","href":"dataCoordcompactionclusteringminCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minClusterSizeRatio","href":"dataCoordcompactionclusteringminClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSizeRatio","href":"dataCoordcompactionclusteringmaxClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSize","href":"dataCoordcompactionclusteringmaxClusterSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.minSize","href":"dataCoordcompactionlevelzeroforceTriggerminSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.maxSize","href":"dataCoordcompactionlevelzeroforceTriggermaxSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMinNum","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMaxNum","type":2,"isActive":false},{"label":"dataCoord.syncSegmentsInterval","href":"dataCoordsyncSegmentsInterval","type":2,"isActive":false},{"label":"dataCoord.enableGarbageCollection","href":"dataCoordenableGarbageCollection","type":2,"isActive":false},{"label":"dataCoord.gc.interval","href":"dataCoordgcinterval","type":2,"isActive":false},{"label":"dataCoord.gc.missingTolerance","href":"dataCoordgcmissingTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.dropTolerance","href":"dataCoordgcdropTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.removeConcurrent","href":"dataCoordgcremoveConcurrent","type":2,"isActive":false},{"label":"dataCoord.gc.scanInterval","href":"dataCoordgcscanInterval","type":2,"isActive":false},{"label":"dataCoord.brokerTimeout","href":"dataCoordbrokerTimeout","type":2,"isActive":false},{"label":"dataCoord.autoBalance","href":"dataCoordautoBalance","type":2,"isActive":false},{"label":"dataCoord.checkAutoBalanceConfigInterval","href":"dataCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"dataCoord.import.filesPerPreImportTask","href":"dataCoordimportfilesPerPreImportTask","type":2,"isActive":false},{"label":"dataCoord.import.taskRetention","href":"dataCoordimporttaskRetention","type":2,"isActive":false},{"label":"dataCoord.import.maxSizeInMBPerImportTask","href":"dataCoordimportmaxSizeInMBPerImportTask","type":2,"isActive":false},{"label":"dataCoord.import.scheduleInterval","href":"dataCoordimportscheduleInterval","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalHigh","href":"dataCoordimportcheckIntervalHigh","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalLow","href":"dataCoordimportcheckIntervalLow","type":2,"isActive":false},{"label":"dataCoord.import.maxImportFileNumPerReq","href":"dataCoordimportmaxImportFileNumPerReq","type":2,"isActive":false},{"label":"dataCoord.import.waitForIndex","href":"dataCoordimportwaitForIndex","type":2,"isActive":false},{"label":"dataCoord.gracefulStopTimeout","href":"dataCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"dataCoord.slot.clusteringCompactionUsage","href":"dataCoordslotclusteringCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.mixCompactionUsage","href":"dataCoordslotmixCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.l0DeleteCompactionUsage","href":"dataCoordslotl0DeleteCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.ip","href":"dataCoordip","type":2,"isActive":false},{"label":"dataCoord.port","href":"dataCoordport","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxSendSize","href":"dataCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxRecvSize","href":"dataCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxSendSize","href":"dataCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxRecvSize","href":"dataCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.md new file mode 100644 index 000000000..50c8adfbd --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_datacoord.md @@ -0,0 +1,2009 @@ +--- +id: configure_datacoord.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين dataCoord لـ Milvus. +--- +

    التكوينات المتعلقة بالبيانات

    dataCoord.channel.watchTimeoutInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة مشاهدة القنوات (بالثواني). سيؤدي تقدم مشاهدة تحديث داتا داتا داتا كورد إلى إعادة ضبط مؤقت المهلة. 300
    +

    dataCoord.channel.balanceWithRpc

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء لتمكين الرصيد مع RPC، الافتراضي لاستخدام ساعة إلخd صواب
    +

    dataCoord.channel.legacyVersionWithoutRPCWatch

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تُعتبر عقد البيانات <= هذا الإصدار بمثابة عقد قديمة، والتي لا تحتوي على مشاهدة تستند إلى rpc(). يُستخدم هذا فقط أثناء الترقية المتجددة حيث لن تحصل العقد القديمة على قنوات جديدة 2.4.1
    +

    dataCoord.channel.balanceSilentDuration

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المدة التي يبدأ بعدها مدير القناة في موازنة القنوات في الخلفية 300
    +

    dataCoord.channel.balanceInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني الذي يتحقق فيه مدير القناة من حالة توازن القنوات dml 360
    +

    dataCoord.channel.checkInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني بالثواني الذي يقوم به مدير القناة بتقديم حالات القناة 1
    +

    dataCoord.channel.notifyChannelOperationTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة إخطار عمليات القناة (بالثواني). 5
    +

    dataCoord.segment.maxSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم المقطع، الوحدة: ميغابايت. يحدد datacoord.segment.segment.maxSize و datacoord.segment.sealProportion معًا ما إذا كان يمكن إغلاق المقطع. 1024
    +

    dataCoord.segment.diskSegmentMaxSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم المقطع بالميغابايت للمجموعة التي تحتوي على فهرس قرص 2048
    +

    dataCoord.segment.sealProportion

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى للنسبة إلى datacoord.segment.segment.maxSize لإغلاق مقطع. يحدد datacoord.segment.maxSize و datacoord.segment.sealProportion معاً ما إذا كان يمكن إغلاق مقطع ما. 0.12
    +

    dataCoord.segment.assignmentExpiration

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وقت انتهاء صلاحية تعيين المقطع، الوحدة: مللي ثانية 2000
    +

    dataCoord.segment.allocLatestExpireAttempt

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وقت محاولة تخصيص آخر وقت انتهاء صلاحية من rootCoord بعد إعادة التشغيل 200
    +

    dataCoord.segment.maxLife

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعمر المقطع بالثواني، 24*60*60 86400
    +

    dataCoord.segment.maxIdleTime

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • إذا لم يقبل المقطع سجلات dml في maxIdleTime وكان حجم المقطع أكبر من
  • +
  • minSizeFromIdleToSealed، فسيقوم ميلفوس بإغلاقه تلقائيًا.
  • +
  • الحد الأقصى لوقت الخمول للمقطع بالثواني، 10*60.
  • 600
    +

    dataCoord.segment.minSizeFromIdleToSealed

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى للحجم بالميغابايت للمقطع الذي يمكن أن يكون خاملاً من الإغلاق. 16
    +

    dataCoord.segment.maxBinlogFileNumber

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • العدد الأقصى لملف مدونة البيانات للمقطع الواحد، سيتم إغلاق المقطع إذا
  • +
  • إذا وصل عدد ملفات مدونة الثنائيات إلى القيمة القصوى.
  • 32
    +

    dataCoord.segment.smallProportion

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    يعتبر المقطع "مقطعاً صغيراً" عندما يكون عدد صفوفه أصغر من 0.5
    +

    dataCoord.segment.compactableProportion

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • (smallProportion * الحد الأقصى لعدد الصفوف في المقطع).
  • +
  • سيحدث الضغط على المقاطع الصغيرة إذا كانت القطعة بعد الضغط ستحتوي على
  • 0.85
    +

    dataCoord.segment.expansionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • أكثر من (compactableProportion * الحد الأقصى لعدد الصفوف في المقطع) الصفوف.
  • +
  • يجب أن تكون أكبر من أو تساوي !!!!
  • +
  • أثناء الضغط، يمكن أن يتجاوز حجم المقطع # من الصفوف الحد الأقصى لعدد الصفوف في المقطع (معدل التوسيع-1) * 100%.
  • 1.25
    +

    dataCoord.sealPolicy.channel.growingSegmentsMemSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • عتبة الحجم بالميغابايت، إذا كان الحجم الإجمالي للمقاطع المتنامية لكل جزء
  • +
  • يتجاوز هذا الحد، فسيتم إغلاق أكبر شريحة متنامية.
  • 4096
    +

    dataCoord.autoUpgradeSegmentIndex

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كانت ترقية فهرس المقطع تلقائيًا إلى إصدار محرك الفهرس خطأ
    +

    dataCoord.segmentFlushInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لمدة الفاصل الزمني (الوحدة: ثوانٍ) بين عملية التدفق على نفس المقطع 2
    +

    dataCoord.enableCompaction

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تبديل القيمة للتحكم فيما إذا كان سيتم تمكين ضغط المقطع.
  • +
  • يدمج الدمج المقاطع الصغيرة الحجم في مقطع كبير، ويمسح الكيانات المحذوفة بعد مدة الاحتفاظ بالفاصل الزمني.
  • صحيح
    +

    dataCoord.compaction.enableAutoCompaction

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تبديل القيمة للتحكم فيما إذا كان سيتم تمكين الضغط التلقائي للمقطع الذي يقوم خلاله منسق البيانات بتحديد موقع المقاطع القابلة للضغط ودمجها في الخلفية.
  • +
  • يسري هذا التكوين فقط عندما يتم تعيين dataCoord.enableCompaction على أنه صواب.
  • صحيح
    +

    dataCoord.compaction.clustering.enable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين ضغط التجميع صواب
    +

    dataCoord.compaction.clustering.autoEnable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين ضغط التجميع التلقائي خطأ
    +

    dataCoord.compaction.clustering.triggerInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    فترة تشغيل ضغط التجميع التجميع بالثواني 600
    +

    dataCoord.compaction.clustering.minInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى للفاصل الزمني بين عمليات تنفيذ ضغط التجميع لمجموعة واحدة، لتجنب الضغط الزائد عن الحاجة 3600
    +

    dataCoord.compaction.clustering.maxInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا لم يتم ضغط مجموعة لم يتم تجميعها لفترة أطول من الحد الأقصى للفاصل الزمني maxInterval، يتم فرض الضغط 259200
    +

    dataCoord.compaction.clustering.newDataSizeThreshold

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كان حجم البيانات الجديدة أكبر من NewDataSizeThreshold، قم بتنفيذ ضغط التجميع 512m
    +

    dataCoord.compaction.clustering.maxTrainSizeRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لنسبة حجم البيانات في تدريب Kmeans، إذا كان أكبر من ذلك، فسيتم تقليل أخذ العينات لتلبية هذا الحد 0.8
    +

    dataCoord.compaction.clustering.maxCentroidsNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المراكز في قطار Kmeans 10240
    +

    dataCoord.compaction.clustering.minCentroidsNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لعدد الأوساط المركزية في قطار Kmeans 16
    +

    dataCoord.compaction.clustering.minClusterSizeRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لحجم الكتلة / متوسط حجم الكتلة في قطار Kmeans 0.01
    +

    dataCoord.compaction.clustering.maxClusterSizeRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم الكتلة / متوسط حجم الكتلة في قطار Kmeans 10
    +

    dataCoord.compaction.clustering.maxClusterSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم الكتلة في قطار Kmeans 5g
    +

    dataCoord.compaction.levelzero.forceTrigger.minSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى للحجم بالبايت لفرض تشغيل ضغط المستوى صفر، القيمة الافتراضية 8 ميغابايت 8388608
    +

    dataCoord.compaction.levelzero.forceTrigger.maxSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى للحجم بالبايت لفرض تشغيل ضغط LevelZero، الافتراضي 64 ميغابايت 67108864
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لعدد ملفات دلتالوج لفرض تشغيل ضغط LevelZero Compact 10
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    العدد الأقصى لملفات الدلتالوج لفرض تشغيل ضغط LevelZero، الافتراضي هو 30 30
    +

    dataCoord.syncSegmentsInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لمزامنة المقاطع بانتظام 300
    +

    dataCoord.enableGarbageCollection

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تبديل القيمة للتحكم في ما إذا كان سيتم تمكين تجميع البيانات المهملة لمسح البيانات المهملة في خدمة MinIO أو S3. صحيح
    +

    dataCoord.gc.interval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني الذي يقوم فيه تنسيق البيانات بجمع القمامة، الوحدة: ثانية. 3600
    +

    dataCoord.gc.missingTolerance

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مدة الاحتفاظ بملفات السجل الثنائي (b binlog) غير المسجلة. يؤدي تعيين قيمة كبيرة بشكل معقول لهذه المعلمة إلى تجنب الحذف الخاطئ لملفات السجل الثنائي التي تم إنشاؤها حديثاً والتي تفتقر إلى البيانات الوصفية. الوحدة: ثانية. 86400
    +

    dataCoord.gc.dropTolerance

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مدة الاحتفاظ بملفات مدونة المقاطع المحذوفة قبل أن يتم مسحها، الوحدة: ثانية. 10800
    +

    dataCoord.gc.removeConcurrent

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد الجوروتينات المتزامنة لإزالة كائنات s3 المحذوفة 32
    +

    dataCoord.gc.scanInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ملف يتيم (ملف على نظام التشغيل oss ولكن لم يتم تسجيله على التعريف) على الفاصل الزمني لمسح جمع القمامة لتخزين الكائنات بالساعات 168
    +

    dataCoord.brokerTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    5000 مللي ثانية، مهلة وسيط البيانات وسيط rpc 5000
    +

    dataCoord.autoBalance

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين التوازن التلقائي صواب
    +

    dataCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني للتحقق من تكوين الرصيد التلقائي 10
    +

    dataCoord.import.filesPerPreImportTask

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد الملفات المسموح به لكل مهمة ما قبل الاستيراد. 2
    +

    dataCoord.import.taskRetention

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    فترة الاحتفاظ بالثواني للمهام في الحالة مكتملة أو فاشلة. 10800
    +

    dataCoord.import.maxSizeInMBPerImportTask

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    لمنع توليد شرائح صغيرة، سنقوم بإعادة تجميع الملفات المستوردة. تمثل هذه المعلمة مجموع أحجام الملفات في كل مجموعة (كل مهمة استيراد). 6144
    +

    dataCoord.import.scheduleInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لجدولة الاستيراد، ويقاس بالثواني. 2
    +

    dataCoord.import.checkIntervalHigh

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    يتم تعيين الفاصل الزمني للتحقق من الاستيراد، مقاساً بالثواني، على تردد عالٍ لمدقق الاستيراد. 2
    +

    dataCoord.import.checkIntervalLow

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    يتم ضبط الفاصل الزمني للتحقق من الاستيراد، مقاساً بالثواني، على تردد منخفض لمدقق الاستيراد. 120
    +

    dataCoord.import.maxImportFileNumPerReq

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد الملفات المسموح به لكل طلب استيراد واحد. 1024
    +

    dataCoord.import.waitForIndex

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تشير إلى ما إذا كانت عملية الاستيراد تنتظر اكتمال بناء الفهرس. صواب
    +

    dataCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ثانية. فرض إيقاف العقدة بدون توقف رشيق 5
    +

    dataCoord.slot.clusteringCompactionUsage

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    استخدام الفتحة لمهمة ضغط التجميع. 16
    +

    dataCoord.slot.mixCompactionUsage

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    استخدام الفتحة لمهمة ضغط التجميع. 8
    +

    dataCoord.slot.l0DeleteCompactionUsage

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    استخدام الفتحة لمهمة ضغط المزيج l0. 8
    +

    dataCoord.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP الخاص بـ dataCoord. إذا لم يتم تحديده، استخدم أول عنوان غير قابل للإرسال
    +

    dataCoord.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP الخاص ب dataCoord 13333
    +

    dataCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء إجراء طلب تقديم الخدمات الذي يمكن أن يرسله dataCoord، الوحدة: بايت 536870912
    +

    dataCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء طلب الداتا الذي يمكن أن يتلقاه داتا كورد، الوحدة: بايت 268435456
    +

    dataCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن للعملاء على dataCoord إرساله، الوحدة: بايت 268435456
    +

    dataCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن للعملاء على dataCoord تلقيه، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.json new file mode 100644 index 000000000..c54cd33c4 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataNode-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بعقدة البيانات","href":"dataNode-related-Configurations","type":1,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxQueueLength","href":"dataNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxParallelism","href":"dataNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"dataNode.dataSync.maxParallelSyncMgrTasks","href":"dataNodedataSyncmaxParallelSyncMgrTasks","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.enable","href":"dataNodedataSyncskipModeenable","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.skipNum","href":"dataNodedataSyncskipModeskipNum","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.coldTime","href":"dataNodedataSyncskipModecoldTime","type":2,"isActive":false},{"label":"dataNode.segment.insertBufSize","href":"dataNodesegmentinsertBufSize","type":2,"isActive":false},{"label":"dataNode.segment.deleteBufBytes","href":"dataNodesegmentdeleteBufBytes","type":2,"isActive":false},{"label":"dataNode.segment.syncPeriod","href":"dataNodesegmentsyncPeriod","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncEnable","href":"dataNodememoryforceSyncEnable","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncSegmentNum","href":"dataNodememoryforceSyncSegmentNum","type":2,"isActive":false},{"label":"dataNode.memory.checkInterval","href":"dataNodememorycheckInterval","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncWatermark","href":"dataNodememoryforceSyncWatermark","type":2,"isActive":false},{"label":"dataNode.channel.workPoolSize","href":"dataNodechannelworkPoolSize","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointMaxParallel","href":"dataNodechannelupdateChannelCheckpointMaxParallel","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointInterval","href":"dataNodechannelupdateChannelCheckpointInterval","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointRPCTimeout","href":"dataNodechannelupdateChannelCheckpointRPCTimeout","type":2,"isActive":false},{"label":"dataNode.channel.maxChannelCheckpointsPerPRC","href":"dataNodechannelmaxChannelCheckpointsPerPRC","type":2,"isActive":false},{"label":"dataNode.channel.channelCheckpointUpdateTickInSeconds","href":"dataNodechannelchannelCheckpointUpdateTickInSeconds","type":2,"isActive":false},{"label":"dataNode.import.maxConcurrentTaskNum","href":"dataNodeimportmaxConcurrentTaskNum","type":2,"isActive":false},{"label":"dataNode.import.maxImportFileSizeInGB","href":"dataNodeimportmaxImportFileSizeInGB","type":2,"isActive":false},{"label":"dataNode.import.readBufferSizeInMB","href":"dataNodeimportreadBufferSizeInMB","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroBatchMemoryRatio","href":"dataNodecompactionlevelZeroBatchMemoryRatio","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroMaxBatchSize","href":"dataNodecompactionlevelZeroMaxBatchSize","type":2,"isActive":false},{"label":"dataNode.gracefulStopTimeout","href":"dataNodegracefulStopTimeout","type":2,"isActive":false},{"label":"dataNode.slot.slotCap","href":"dataNodeslotslotCap","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.memoryBufferRatio","href":"dataNodeclusteringCompactionmemoryBufferRatio","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.workPoolSize","href":"dataNodeclusteringCompactionworkPoolSize","type":2,"isActive":false},{"label":"dataNode.ip","href":"dataNodeip","type":2,"isActive":false},{"label":"dataNode.port","href":"dataNodeport","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxSendSize","href":"dataNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxRecvSize","href":"dataNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxSendSize","href":"dataNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxRecvSize","href":"dataNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.md new file mode 100644 index 000000000..10d74e9e1 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_datanode.md @@ -0,0 +1,1015 @@ +--- +id: configure_datanode.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين DataNode لـ Milvus. +--- +

    التكوينات المتعلقة بعقدة البيانات

    dataNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الطول الأقصى لقائمة انتظار المهام في مخطط التدفق 16
    +

    dataNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المهام المنفذة بالتوازي في مخطط التدفق 1024
    +

    dataNode.dataSync.maxParallelSyncMgrTasks

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد مهام المزامنة المتزامنة لمزامنة عقدة البيانات على مستوى العالم 256
    +

    dataNode.dataSync.skipMode.enable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    دعم تخطي بعض الرسائل الزمنية لتقليل استخدام وحدة المعالجة المركزية صحيح
    +

    dataNode.dataSync.skipMode.skipNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    استهلاك واحد لكل n من السجلات التي تم تخطيها 4
    +

    dataNode.dataSync.skipMode.coldTime

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    قم بتشغيل وضع التخطي بعد وجود رسائل موقوتة فقط لمدة x ثانية 60
    +

    dataNode.segment.insertBufSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لحجم كل ملف من ملفات Binlog في مقطع مخزن في الذاكرة. يتم بعد ذلك مسح ملفات Binlog التي يتجاوز حجمها هذه القيمة إلى خدمة MinIO أو S3.
  • +
  • الوحدة: بايت
  • +
  • يؤدي تعيين هذه المعلمة صغيرة جداً إلى قيام النظام بتخزين كمية صغيرة جداً من البيانات بشكل متكرر. يؤدي تعيينها كبيرة جداً إلى زيادة طلب النظام على الذاكرة.
  • 16777216
    +

    dataNode.segment.deleteBufBytes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم المخزن المؤقت بالبايت لمسح ديل لقناة واحدة، القيمة الافتراضية 16 ميغابايت 16777216
    +

    dataNode.segment.syncPeriod

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    فترة مزامنة المقاطع إذا لم يكن المخزن المؤقت فارغاً. 600
    +

    dataNode.memory.forceSyncEnable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تعيين صواب لفرض المزامنة إذا كان استخدام الذاكرة مرتفعًا جدًا صحيح
    +

    dataNode.memory.forceSyncSegmentNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد المقاطع التي ستتم مزامنتها، ستتم مزامنة المقاطع ذات المخزن المؤقت الأكبر. 1
    +

    dataNode.memory.checkInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني للتحقق من استخدام ذاكرة عقدة البيانات، بالمللي ثانية 3000
    +

    dataNode.memory.forceSyncWatermark

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    العلامة المائية للذاكرة المستقلة، عند الوصول إلى هذه العلامة المائية، ستتم مزامنة المقاطع. 0.5
    +

    dataNode.channel.workPoolSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تحديد حجم مجموعة العمل العامة لجميع القنوات
  • +
  • إذا كانت هذه المعلمة <= 0، فسيتم تعيينها كحد أقصى لعدد وحدات المعالجة المركزية التي يمكن تنفيذها
  • +
  • يقترح تعيينه أكبر على أعداد التجميع الكبيرة لتجنب الحجب
  • -1
    +

    dataNode.channel.updateChannelCheckpointMaxParallel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تحديد حجم تجمع العمل العام لتحديث نقطة تفتيش القناة
  • +
  • إذا كانت هذه المعلمة <= 0، سيتم تعيينها على أنها 10
  • 10
    +

    dataNode.channel.updateChannelCheckpointInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مدة الفاصل الزمني (بالثواني) لعقدة البيانات لتحديث نقطة تدقيق القناة لكل قناة 60
    +

    dataNode.channel.updateChannelCheckpointRPCTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المهلة بالثواني لاستدعاء UpdateChannelCheckpoint RPC لتحديث نقطة تدقيق القناة 20
    +

    dataNode.channel.maxChannelCheckpointsPerPRC

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد نقاط تفتيش القناة لكل استدعاء UpdateChannelCheckpoint RPC. 128
    +

    dataNode.channel.channelCheckpointUpdateTickInSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    التردد، بالثواني، الذي يقوم فيه محدث نقطة تدقيق القناة بتنفيذ التحديثات. 10
    +

    dataNode.import.maxConcurrentTaskNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد مهام الاستيراد/ما قبل الاستيراد المسموح بتشغيلها بشكل متزامن على عقدة بيانات. 16
    +

    dataNode.import.maxImportFileSizeInGB

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم الملف (بالجيجابايت) لملف الاستيراد، حيث يشير ملف الاستيراد إما إلى ملف يستند إلى الصفوف أو مجموعة من الملفات المستندة إلى الأعمدة. 16
    +

    dataNode.import.readBufferSizeInMB

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم كتلة البيانات (بالميغابايت) الذي تتم قراءته من مدير القطع بواسطة عقدة البيانات أثناء الاستيراد. 16
    +

    dataNode.compaction.levelZeroBatchMemoryRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لنسبة الذاكرة الخالية للمستوى صفر من الذاكرة الحرة للضغط من المستوى صفر الذي يتم تنفيذه في الوضع الدفعي 0.05
    +

    dataNode.compaction.levelZeroMaxBatchSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    يشير الحد الأقصى لحجم الدُفعة إلى الحد الأقصى لعدد المقاطع L1/L2 في الدُفعة عند تنفيذ ضغط المستوى L0. افتراضي إلى -1 ، أي قيمة أقل من 1 تعني عدم وجود حد. نطاق صالح: >= 1. -1
    +

    dataNode.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ثانية. فرض إيقاف العقدة بدون توقف رشيق 1800
    +

    dataNode.slot.slotCap

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المهام (مثل الضغط والاستيراد) المسموح بتشغيلها بشكل متزامن على عقدة البيانات 16
    +

    dataNode.clusteringCompaction.memoryBufferRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    نسبة المخزن المؤقت لذاكرة ضغط التجميع. سيتم مسح البيانات الأكبر من العتبة إلى التخزين. 0.1
    +

    dataNode.clusteringCompaction.workPoolSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم تجمع العاملين لمهمة ضغط تجميع واحدة. 8
    +

    dataNode.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP لعقدة البيانات. إذا لم يتم تحديده، استخدم أول عنوان أحادي الإرسال
    +

    dataNode.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP لعقدة البيانات 21124
    +

    dataNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن أن ترسله DataNode، الوحدة: بايت 536870912
    +

    dataNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أمر توجيه طلب (RPC) يمكن لعقدة البيانات تلقيه، الوحدة: بايت 268435456
    +

    dataNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن للعملاء على dataNode إرساله، الوحدة: بايت 268435456
    +

    dataNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن للعملاء على dataNode تلقيه، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.json new file mode 100644 index 000000000..539095296 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"etcd-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ etcd","href":"etcd-related-Configurations","type":1,"isActive":false},{"label":"etcd.endpoints","href":"etcdendpoints","type":2,"isActive":false},{"label":"etcd.rootPath","href":"etcdrootPath","type":2,"isActive":false},{"label":"etcd.metaSubPath","href":"etcdmetaSubPath","type":2,"isActive":false},{"label":"etcd.kvSubPath","href":"etcdkvSubPath","type":2,"isActive":false},{"label":"etcd.log.level","href":"etcdloglevel","type":2,"isActive":false},{"label":"etcd.log.path","href":"etcdlogpath","type":2,"isActive":false},{"label":"etcd.ssl.enabled","href":"etcdsslenabled","type":2,"isActive":false},{"label":"etcd.ssl.tlsCert","href":"etcdssltlsCert","type":2,"isActive":false},{"label":"etcd.ssl.tlsKey","href":"etcdssltlsKey","type":2,"isActive":false},{"label":"etcd.ssl.tlsCACert","href":"etcdssltlsCACert","type":2,"isActive":false},{"label":"etcd.ssl.tlsMinVersion","href":"etcdssltlsMinVersion","type":2,"isActive":false},{"label":"etcd.requestTimeout","href":"etcdrequestTimeout","type":2,"isActive":false},{"label":"etcd.use.embed","href":"etcduseembed","type":2,"isActive":false},{"label":"etcd.data.dir","href":"etcddatadir","type":2,"isActive":false},{"label":"etcd.auth.enabled","href":"etcdauthenabled","type":2,"isActive":false},{"label":"etcd.auth.userName","href":"etcdauthuserName","type":2,"isActive":false},{"label":"etcd.auth.password","href":"etcdauthpassword","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.md new file mode 100644 index 000000000..5e0e4c7c4 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_etcd.md @@ -0,0 +1,538 @@ +--- +id: configure_etcd.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة etcd لـ Milvus. +--- +

    التكوينات المتعلقة بـ etcd

    التهيئة ذات الصلة بـ etcd، والمستخدمة لتخزين البيانات الوصفية لـ Milvus واكتشاف الخدمة.

    +

    etcd.endpoints

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • نقاط النهاية المستخدمة للوصول إلى خدمة إلخd. يمكنك تغيير هذه المعلمة كنقاط النهاية الخاصة بمجموعة إلخd الخاصة بك.
  • +
  • متغير البيئة: ETCD_ENDPOINTS
  • +
  • يكتسب إلخd بشكل تفضيلي عنوانًا صالحًا من متغير البيئة ETCD_ENDPOINTS عند بدء تشغيل Milvus.
  • المضيف المحلي:2379
    +

    etcd.rootPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • البادئة الجذرية للمفتاح حيث يخزن Milvus البيانات في إلخd.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • +
  • لمشاركة مثيل إلخd بين مثيلات Milvus متعددة، ضع في اعتبارك تغيير هذه القيمة إلى قيمة مختلفة لكل مثيل من مثيلات Milvus قبل بدء تشغيلها.
  • +
  • قم بتعيين مسار جذر يسهل تحديده لـ Milvus إذا كانت خدمة إلخd موجودة بالفعل.
  • +
  • قد يؤدي تغيير هذا لمثيل Milvus قيد التشغيل بالفعل إلى فشل قراءة البيانات القديمة.
  • بواسطة-مطور
    +

    etcd.metaSubPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • البادئة الفرعية للمفتاح إلى المكان الذي يخزن فيه Milvus المعلومات المتعلقة بالبيانات الوصفية في إلخd.
  • +
  • تحذير: سيؤثر تغيير هذه المعلمة بعد استخدام ملفوس لفترة من الزمن على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ملفوس للمرة الأولى.
  • ميتا
    +

    etcd.kvSubPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • البادئة الفرعية للمفتاح حيث يخزن ميلفوس الطوابع الزمنية في إلخد.
  • +
  • تنبيه: تغيير هذه المعلمة بعد استخدام ملفوس لفترة من الزمن سيؤثر على وصولك إلى البيانات القديمة.
  • +
  • يوصى بعدم تغيير هذه المعلمة إذا لم يكن هناك سبب محدد.
  • kv
    +

    etcd.log.level

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تدعم فقط التصحيح، أو المعلومات، أو التحذير، أو الخطأ، أو الذعر، أو القاتلة. افتراضي 'معلومات'. معلومات
    +

    etcd.log.path

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • المسار هو واحد من:
  • +
  • - "افتراضي" كـ os.Stderr,
  • +
  • - "stderr" ك os.Stderr,
  • +
  • - "stdout" ك os.Stdout,
  • +
  • - مسار ملف لإلحاق سجلات الخادم به.
  • +
  • يُرجى التعديل في ملف Milvus المضمن: /tmp/milvus/logs/etcd.log
  • ستدوت
    +

    etcd.ssl.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان يجب دعم وضع الاتصال الآمن ETCD خطأ
    +

    etcd.ssl.tlsCert

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف الشهادة /path/to/etcd-client.pem
    +

    etcd.ssl.tlsKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف المفتاح الخاص بك /path/to/etcd-client-key.pem
    +

    etcd.ssl.tlsCACert

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف CACert الخاص بك /path/to/ca.pem
    +

    etcd.ssl.tlsMinVersion

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الإصدار الأدنى من TLS
  • +
  • القيم الاختيارية: 1.0, 1.1, 1.2, 1.3。
  • +
  • نوصي باستخدام الإصدار 1.2 وما فوق.
  • 1.3
    +

    etcd.requestTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة عملية Etcd بالمللي ثانية 10000
    +

    etcd.use.embed

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان سيتم تمكين Etcd المضمّن (خادم EtcdServer داخل العملية). خطأ
    +

    etcd.data.dir

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    Etcd المضمنة فقط. يرجى الضبط في Milvus المضمنة: /tmp/milvus/etcdData/ افتراضي.إلخd
    +

    etcd.auth.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء لتمكين المصادقة خطأ
    +

    etcd.auth.userName

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    اسم المستخدم لمصادقة إلخd
    +

    etcd.auth.password

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    كلمة المرور لمصادقة إلخd
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.json new file mode 100644 index 000000000..44751b3bb --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"gpu-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بوحدة معالجة الرسومات","href":"gpu-related-Configurations","type":1,"isActive":false},{"label":"gpu.initMemSize","href":"gpuinitMemSize","type":2,"isActive":false},{"label":"gpu.maxMemSize","href":"gpumaxMemSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.md new file mode 100644 index 000000000..079b8d1fe --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_gpu.md @@ -0,0 +1,87 @@ +--- +id: configure_gpu.md +related_key: configure +group: system_configuration.md +summary: >- + تعلّم كيفية تهيئة وحدة المعالجة المركزية لوحدة المعالجة المركزية لوحدة + المعالجة المركزية (gpu) لـ Milvus +--- +

    التكوينات المتعلقة بوحدة معالجة الرسومات

    #عند استخدام فهرسة وحدة معالجة الرسومات، سيستخدم Milvus مخزن ذاكرة لتجنب التخصيص المتكرر للذاكرة وإلغاء التخصيص.

    +

    #هنا، يمكنك تعيين حجم الذاكرة التي يشغلها تجمع الذاكرة، على أن تكون الوحدة ميغابايت.

    +

    # لاحظ أن هناك احتمال تعطل Milvus عندما يتجاوز الطلب الفعلي على الذاكرة القيمة التي تم تعيينها بواسطة maxMemSize.

    +

    #إذا تم تعيين كل من initMemSize و MaxMemSize على صفر,

    +

    سيقوم #milvus تلقائيًا بتهيئة نصف ذاكرة وحدة معالجة الرسومات المتاحة,

    +

    سيستخدم #maxMemSemSize ذاكرة وحدة معالجة الرسومات المتوفرة بالكامل.

    +

    gpu.initMemSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم بدء تجمع ذاكرة وحدة معالجة الرسومات
    +

    gpu.maxMemSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحجم الأقصى لتجمع ذاكرة وحدة معالجة الرسومات
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.json new file mode 100644 index 000000000..510c9895c --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"grpc-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ grpc","href":"grpc-related-Configurations","type":1,"isActive":false},{"label":"grpc.gracefulStopTimeout","href":"grpcgracefulStopTimeout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.md new file mode 100644 index 000000000..3616d20b7 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_grpc.md @@ -0,0 +1,50 @@ +--- +id: configure_grpc.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة grpc لـ Milvus. +--- +

    التكوينات المتعلقة بـ grpc

    grpc.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ثانية، وقت انتظار انتهاء التوقف الرشيق 10
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.json new file mode 100644 index 000000000..6920c4ad0 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexCoord-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالفهرسالتكوينات المتعلقة بالفهرس","href":"indexCoord-related-Configurations","type":1,"isActive":false},{"label":"indexCoord.segment.minSegmentNumRowsToEnableIndex","href":"indexCoordsegmentminSegmentNumRowsToEnableIndex","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.md new file mode 100644 index 000000000..55d8914bf --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexcoord.md @@ -0,0 +1,50 @@ +--- +id: configure_indexcoord.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين IndexCoord لـ Milvus. +--- +

    التكوينات المتعلقة بالفهرسالتكوينات المتعلقة بالفهرس

    indexCoord.segment.minSegmentNumRowsToEnableIndex

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    هي عتبة. عندما يكون عدد صفوف المقطع أقل من هذه القيمة، لن تتم فهرسة المقطع 1024
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.json new file mode 100644 index 000000000..4820fdc2e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexNode-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالعقدة الفهرس","href":"indexNode-related-Configurations","type":1,"isActive":false},{"label":"indexNode.enableDisk","href":"indexNodeenableDisk","type":2,"isActive":false},{"label":"indexNode.ip","href":"indexNodeip","type":2,"isActive":false},{"label":"indexNode.port","href":"indexNodeport","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxSendSize","href":"indexNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxRecvSize","href":"indexNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxSendSize","href":"indexNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxRecvSize","href":"indexNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.md new file mode 100644 index 000000000..c143dfe20 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_indexnode.md @@ -0,0 +1,224 @@ +--- +id: configure_indexnode.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين IndexNode لـ Milvus. +--- +

    التكوينات المتعلقة بالعقدة الفهرس

    indexNode.enableDisk

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين فهرس بناء عقدة الفهرس فهرس متجه القرص صواب
    +

    indexNode.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP لعقدة الفهرس. إذا لم يتم تحديده، استخدم أول عنوان أحادي الإرسال
    +

    indexNode.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP لعقدة الفهرس 21121
    +

    indexNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن أن ترسله عقدة الفهرس، الوحدة: بايت 536870912
    +

    indexNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن أن تستقبله عقدة الفهرس، الوحدة: بايت 268435456
    +

    indexNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC يمكن للعملاء على عقدة الفهرس إرساله، الوحدة: بايت 268435456
    +

    indexNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن للعملاء على عقدة الفهرس تلقيه، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.json new file mode 100644 index 000000000..ebc3e3003 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"localStorage-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالتخزين المحلي","href":"localStorage-related-Configurations","type":1,"isActive":false},{"label":"localStorage.path","href":"localStoragepath","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.md new file mode 100644 index 000000000..e83845926 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_localstorage.md @@ -0,0 +1,53 @@ +--- +id: configure_localstorage.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين LocalStorage لـ Milvus. +--- +

    التكوينات المتعلقة بالتخزين المحلي

    localStorage.path

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • المسار المحلي لمكان تخزين البيانات المتجهة أثناء البحث أو الاستعلام لتجنب الوصول المتكرر إلى خدمة MinIO أو S3.
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • /var/lib/milvus/data/
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_log.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_log.json new file mode 100644 index 000000000..25f294443 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_log.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"log-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالسجل","href":"log-related-Configurations","type":1,"isActive":false},{"label":"log.level","href":"loglevel","type":2,"isActive":false},{"label":"log.file.rootPath","href":"logfilerootPath","type":2,"isActive":false},{"label":"log.file.maxSize","href":"logfilemaxSize","type":2,"isActive":false},{"label":"log.file.maxAge","href":"logfilemaxAge","type":2,"isActive":false},{"label":"log.file.maxBackups","href":"logfilemaxBackups","type":2,"isActive":false},{"label":"log.format","href":"logformat","type":2,"isActive":false},{"label":"log.stdout","href":"logstdout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_log.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_log.md new file mode 100644 index 000000000..88754ccf4 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_log.md @@ -0,0 +1,231 @@ +--- +id: configure_log.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين السجل لـ Milvus. +--- +

    التكوينات المتعلقة بالسجل

    تكوين إخراج سجل النظام.

    +

    log.level

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • مستوى سجل ميلفوس. الخيار: تصحيح، ومعلومات، وتحذير، وخطأ، وذعر، وقاتل.
  • +
  • يوصى باستخدام مستوى التصحيح في بيئات الاختبار والتطوير، ومستوى المعلومات في بيئة الإنتاج.
  • معلومات
    +

    log.file.rootPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • المسار الجذر لملفات السجل.
  • +
  • يتم تعيين القيمة الافتراضية فارغة، مما يشير إلى إخراج ملفات السجل إلى الإخراج القياسي (stdout) والخطأ القياسي (stderr).
  • +
  • إذا تم تعيين هذه المعلمة على مسار محلي صالح، يقوم ميلفوس بكتابة ملفات السجل وتخزينها في هذا المسار.
  • +
  • قم بتعيين هذه المعلمة على المسار الذي لديك الإذن بكتابته.
  • +

    log.file.maxSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم ملف السجل، الوحدة: ميغابايت. 300
    +

    log.file.maxAge

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لوقت الاحتفاظ قبل مسح ملف السجل تلقائياً، الوحدة: يوم. القيمة الدنيا هي 1. 10
    +

    log.file.maxBackups

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد ملفات السجل المطلوب نسخها احتياطياً، الوحدة: يوم. القيمة الدنيا هي 1. 20
    +

    log.format

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تنسيق سجل ميلفوس. الخيار: نص و JSON نص
    +

    log.stdout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين Stdout أم لا صواب
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.json new file mode 100644 index 000000000..247c00b7e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"metastore-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالمتجر الفوقي","href":"metastore-related-Configurations","type":1,"isActive":false},{"label":"metastore.type","href":"metastoretype","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.md new file mode 100644 index 000000000..345133a87 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_metastore.md @@ -0,0 +1,50 @@ +--- +id: configure_metastore.md +related_key: configure +group: system_configuration.md +summary: تعرّف على كيفية تهيئة ميتاستور لـ Milvus. +--- +

    التكوينات المتعلقة بالمتجر الفوقي

    metastore.type

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    القيمة الافتراضية: etcd، قيم صالحة: [إلخd، تيكف] إلخd
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.json new file mode 100644 index 000000000..9c3e63afb --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"minio-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ Minio","href":"minio-related-Configurations","type":1,"isActive":false},{"label":"minio.address","href":"minioaddress","type":2,"isActive":false},{"label":"minio.port","href":"minioport","type":2,"isActive":false},{"label":"minio.accessKeyID","href":"minioaccessKeyID","type":2,"isActive":false},{"label":"minio.secretAccessKey","href":"miniosecretAccessKey","type":2,"isActive":false},{"label":"minio.useSSL","href":"miniouseSSL","type":2,"isActive":false},{"label":"minio.ssl.tlsCACert","href":"miniossltlsCACert","type":2,"isActive":false},{"label":"minio.bucketName","href":"miniobucketName","type":2,"isActive":false},{"label":"minio.rootPath","href":"miniorootPath","type":2,"isActive":false},{"label":"minio.useIAM","href":"miniouseIAM","type":2,"isActive":false},{"label":"minio.cloudProvider","href":"miniocloudProvider","type":2,"isActive":false},{"label":"minio.iamEndpoint","href":"minioiamEndpoint","type":2,"isActive":false},{"label":"minio.logLevel","href":"miniologLevel","type":2,"isActive":false},{"label":"minio.region","href":"minioregion","type":2,"isActive":false},{"label":"minio.useVirtualHost","href":"miniouseVirtualHost","type":2,"isActive":false},{"label":"minio.requestTimeoutMs","href":"miniorequestTimeoutMs","type":2,"isActive":false},{"label":"minio.listObjectsMaxKeys","href":"miniolistObjectsMaxKeys","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.md new file mode 100644 index 000000000..057eb22ad --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_minio.md @@ -0,0 +1,528 @@ +--- +id: configure_minio.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة المينيو لميلفوس. +--- +

    التكوينات المتعلقة بـ Minio

    التكوين المرتبط بـ MinIO/S3/GCS أو أي خدمة أخرى تدعم واجهة برمجة تطبيقات S3، وهي المسؤولة عن ثبات البيانات لـ Milvus.

    +

    نشير إلى خدمة التخزين باسم MinIO/S3 في الوصف التالي للتبسيط.

    +

    minio.address

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • عنوان IP لخدمة MinIO أو S3.
  • +
  • متغير البيئة: MINIO_ADDRESS
  • +
  • ينشئ عنوان minio.address و minio.port معاً الوصول الصالح لخدمة MinIO أو S3.
  • +
  • يقوم MinIO بشكل تفضيلي بالحصول على عنوان IP الصالح من متغير البيئة MINIO_ADDRESS عند بدء تشغيل Milvus.
  • +
  • يتم تطبيق القيمة الافتراضية عند تشغيل MinIO أو S3 على نفس الشبكة مع Milvus.
  • المضيف المحلي
    +

    minio.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ خدمة MinIO أو S3. 9000
    +

    minio.accessKeyID

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • معرف مفتاح الوصول الذي تصدره MinIO أو S3 للمستخدم للوصول المصرح به.
  • +
  • متغير البيئة: MINIO_ACCESS_KEY_ID أو minio.accessKeyKeyID
  • +
  • يتم استخدام minio.accessKeyKeyID وminio.secretAccessKey معًا لمصادقة الهوية للوصول إلى خدمة MinIO أو S3.
  • +
  • يجب تعيين هذا التكوين مطابقًا لمتغير البيئة MINIO_ACCESS_KEY_KYID، وهو أمر ضروري لبدء تشغيل MinIO أو S3.
  • +
  • تنطبق القيمة الافتراضية على خدمة MinIO أو S3 التي بدأت باستخدام ملف docker-compose.yml الافتراضي.
  • Minioadmin
    +

    minio.secretAccessKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • المفتاح السري المستخدم لتشفير سلسلة التوقيع والتحقق من سلسلة التوقيع على الخادم. يجب أن يبقى سرياً للغاية ويمكن الوصول إليه فقط لخادم MinIO أو S3 والمستخدمين.
  • +
  • متغير البيئة: MINIO_SECRET_CACESS_KEY أو minio.secretAccessKey
  • +
  • يتم استخدام minio.accessKeyKeyID وminio.secretAccessKey معًا لمصادقة الهوية للوصول إلى خدمة MinIO أو S3.
  • +
  • يجب تعيين هذا التكوين مطابقًا لمتغير البيئة MINIO_SECRET_CACESS_KEY، وهو أمر ضروري لبدء تشغيل MinIO أو S3.
  • +
  • تنطبق القيمة الافتراضية على خدمة MinIO أو S3 التي بدأت باستخدام ملف docker-compose.yml الافتراضي.
  • Minioadmin
    +

    minio.useSSL

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تبديل القيمة للتحكم في إمكانية الوصول إلى خدمة MinIO أو S3 من خلال SSL. خطأ
    +

    minio.ssl.tlsCACert

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف CACert الخاص بك /path/to/public.crt
    +

    minio.bucketName

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • اسم الدلو الذي يخزن فيه Milvus البيانات في MinIO أو S3.
  • +
  • لا يدعم Milvus 2.0.0 تخزين البيانات في دلاء متعددة.
  • +
  • سيتم إنشاء دلو بهذا الاسم إذا لم يكن موجوداً. إذا كانت الدلو موجودة بالفعل ويمكن الوصول إليها، فسيتم استخدامها مباشرة. خلاف ذلك، سيكون هناك خطأ.
  • +
  • لمشاركة مثيل MinIO بين مثيلات Milvus متعددة، ضع في اعتبارك تغيير هذه القيمة إلى قيمة مختلفة لكل مثيل من مثيلات Milvus قبل بدء تشغيلها. لمزيد من التفاصيل، راجع الأسئلة الشائعة حول العملية.
  • +
  • سيتم تخزين البيانات في Docker المحلي إذا تم استخدام Docker لبدء تشغيل خدمة MinIO محليًا. تأكد من وجود مساحة تخزين كافية.
  • +
  • اسم الدلو فريد عالميًا في مثيل MinIO أو S3 واحد.
  • دلو
    +

    minio.rootPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • البادئة الجذرية للمفتاح حيث يخزن Milvus البيانات في MinIO أو S3.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • +
  • لمشاركة مثيل MinIO بين مثيلات Milvus متعددة، ضع في اعتبارك تغيير هذه القيمة إلى قيمة مختلفة لكل مثيل من مثيلات Milvus قبل بدء تشغيلها. لمزيد من التفاصيل، راجع الأسئلة الشائعة حول التشغيل.
  • +
  • قم بتعيين بادئة مفتاح جذر يسهل تحديدها لـ Milvus إذا كانت خدمة إلخd موجودة بالفعل.
  • +
  • قد يؤدي تغيير هذا لمثيل Milvus قيد التشغيل بالفعل إلى فشل قراءة البيانات القديمة.
  • الملفات
    +

    minio.useIAM

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • ما إذا كان سيتم استخدام دور IAM للوصول إلى S3/GCS بدلاً من مفاتيح الوصول/السرية
  • +
  • لمزيد من المعلومات، راجع
  • +
  • aws: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
  • +
  • gcp: https://cloud.google.com/storage/docs/access-control/iam
  • +
  • عليون (ack): https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-rrsa-to-enforce-access-control
  • +
  • عليون (ecs): https://www.alibabacloud.com/help/en/elastic-compute-service/latest/attach-an-instance-ram-role
  • خطأ
    +

    minio.cloudProvider

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • موفر سحابة S3. يدعم: "aws"، "gcp"، "aliyun".
  • +
  • يمكنك استخدام "aws" لمزود سحابة آخر يدعم واجهة برمجة تطبيقات S3 بتوقيع الإصدار 4، على سبيل المثال: minio
  • +
  • يمكنك استخدام "gcp" لموفر سحابة آخر يدعم واجهة برمجة تطبيقات S3 بتوقيع v2
  • +
  • يمكنك استخدام "aliyun" لمزود السحابة الآخر الذي يستخدم دلو نمط المضيف الظاهري
  • +
  • عند تمكين استخدام IAM، يتم دعم "aws" و"gcp" و"aliyun" فقط في الوقت الحالي
  • aws
    +

    minio.iamEndpoint

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • نقطة نهاية مخصصة لجلب بيانات اعتماد دور IAM. عندما يكون استخدام IAM صحيحًا و CloudProvider هو "aws".
  • +
  • اتركها فارغة إذا كنت تريد استخدام نقطة نهاية AWS الافتراضية
  • +

    minio.logLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مستوى السجل لسجل aws sdk. المستوى المدعوم: إيقاف التشغيل، قاتل، خطأ، خطأ، تحذير، معلومات، تصحيح، تتبع قاتل
    +

    minio.region

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تحديد منطقة موقع نظام تخزين minio
    +

    minio.useVirtualHost

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان استخدام وضع المضيف الظاهري للحاوية خطأ
    +

    minio.requestTimeoutMs

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة الحد الأدنى لوقت الطلب بالمللي ثانية 10000
    +

    minio.listObjectsMaxKeys

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد الكائنات المطلوبة لكل دفعة في minio ListObjects rpc,
  • +
  • 0 يعني استخدام عميل oss بشكل افتراضي، قم بتقليل هذه التكوينات إذا كانت مهلة ListObjects
  • 0
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.json new file mode 100644 index 000000000..a007d1e08 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"mq-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ mq","href":"mq-related-Configurations","type":1,"isActive":false},{"label":"mq.type","href":"mqtype","type":2,"isActive":false},{"label":"mq.enablePursuitMode","href":"mqenablePursuitMode","type":2,"isActive":false},{"label":"mq.pursuitLag","href":"mqpursuitLag","type":2,"isActive":false},{"label":"mq.pursuitBufferSize","href":"mqpursuitBufferSize","type":2,"isActive":false},{"label":"mq.mqBufSize","href":"mqmqBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.mergeCheckInterval","href":"mqdispatchermergeCheckInterval","type":2,"isActive":false},{"label":"mq.dispatcher.targetBufSize","href":"mqdispatchertargetBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.maxTolerantLag","href":"mqdispatchermaxTolerantLag","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.md new file mode 100644 index 000000000..d672c205a --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_mq.md @@ -0,0 +1,262 @@ +--- +id: configure_mq.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة mq لـ Milvus. +--- +

    التكوينات المتعلقة بـ mq

    يدعم Milvus أربعة MQ: rocksmq (استنادًا إلى RockDB)، و natsmq (خادم nats-server المدمج)، وPulsar وKafka.

    +

    يمكنك تغيير mq الخاص بك عن طريق تعيين حقل mq.type.

    +

    إذا لم تقم بتعيين الحقل mq.type كإعداد افتراضي، فهناك ملاحظة حول تمكين الأولوية إذا قمنا بتكوين عدة mq في هذا الملف.

    +
      +
    1. الوضع المستقل (المحلي): وضع مستقل (محلي): rocksmq (افتراضي) > natsmq > بولسار > كافكا

    2. +
    3. الوضع العنقودي: بولسار (افتراضي) > كافكا (روكسمك و ناتسمك غير مدعوم في وضع المجموعة)

    4. +
    +

    mq.type

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • القيمة الافتراضية: "افتراضي"
  • +
  • قيم صالحة: [افتراضي، نابلس، كافكا، روكسمك، ناتسمك]
  • افتراضي
    +

    mq.enablePursuitMode

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    القيمة الافتراضية: "صحيح" صواب
    +

    mq.pursuitLag

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حد التأخر الزمني للدخول في وضع المطاردة، بالثواني 10
    +

    mq.pursuitBufferSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم المخزن المؤقت لوضع المطاردة بالبايت 8388608
    +

    mq.mqBufSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    طول المخزن المؤقت لمستهلك عميل MQ 16
    +

    mq.dispatcher.mergeCheckInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الوقت الفاصل الزمني (بالثواني) للمرسل للتحقق من الدمج من عدمه 1
    +

    mq.dispatcher.targetBufSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    طول المخزن المؤقت للقناة من أجل الترجيع 16
    +

    mq.dispatcher.maxTolerantLag

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    القيمة الافتراضية "3"، المهلة (بالثواني) التي يرسلها الهدف msgPack 3
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.json new file mode 100644 index 000000000..d677a867f --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"msgChannel-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بقناة الرسائل","href":"msgChannel-related-Configurations","type":1,"isActive":false},{"label":"msgChannel.chanNamePrefix.cluster","href":"msgChannelchanNamePrefixcluster","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordTimeTick","href":"msgChannelchanNamePrefixrootCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordStatistics","href":"msgChannelchanNamePrefixrootCoordStatistics","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordDml","href":"msgChannelchanNamePrefixrootCoordDml","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.queryTimeTick","href":"msgChannelchanNamePrefixqueryTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordTimeTick","href":"msgChannelchanNamePrefixdataCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordSegmentInfo","href":"msgChannelchanNamePrefixdataCoordSegmentInfo","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataCoordSubNamePrefix","href":"msgChannelsubNamePrefixdataCoordSubNamePrefix","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataNodeSubNamePrefix","href":"msgChannelsubNamePrefixdataNodeSubNamePrefix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.md new file mode 100644 index 000000000..98514cb11 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_msgchannel.md @@ -0,0 +1,316 @@ +--- +id: configure_msgchannel.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين msgChannel لـ Milvus. +--- +

    التكوينات المتعلقة بقناة الرسائل

    يقدم هذا الموضوع التكوينات المتعلقة بقناة الرسائل الخاصة ب Milvus.

    +

    msgChannel.chanNamePrefix.cluster

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الجذر للقناة عند إنشاء قناة رسائل.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • +
  • لمشاركة مثيل Pulsar بين عدة مثيلات Milvus، ضع في اعتبارك تغيير هذا الاسم إلى اسم بدلاً من الاسم الافتراضي لكل مثيل Milvus قبل بدء تشغيلها.
  • بواسطة-مطور
    +

    msgChannel.chanNamePrefix.rootCoordTimeTick

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل التي ينشر فيها منسق الجذر رسائل التجزئة الزمنية.
  • +
  • بادئة اسم القناة الكامل هو ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.rootCoordTimeTick}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • جذر-جذر-تيمتيك
    +

    msgChannel.chanNamePrefix.rootCoordStatistics

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل حيث ينشر جذر الإحداثي رسائل الإحصائيات الخاصة به.
  • +
  • بادئة اسم القناة الكاملة هي ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.rootCoordStatistics}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • جذرالكورد-الإحصائيات
    +

    msgChannel.chanNamePrefix.rootCoordDml

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل حيث ينشر جذر التنسيق رسائل لغة التلاعب بالبيانات (DML).
  • +
  • تكون بادئة اسم القناة الكاملة هي ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.rootCoordDml}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • rootcoord-dml
    +

    msgChannel.chanNamePrefix.queryTimeTick

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل حيث تقوم عقدة الاستعلام بنشر رسائل التجزئة الزمنية.
  • +
  • بادئة اسم القناة الكاملة هي ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.queryTimeTick}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • queryTimeTick
    +

    msgChannel.chanNamePrefix.dataCoordTimeTick

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل التي ينشر فيها منسق البيانات رسائل التجزئة الزمنية.
  • +
  • بادئة اسم القناة الكامل هو ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.dataCoordTimeTick}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • قناة datacoord-timetick-channel
    +

    msgChannel.chanNamePrefix.dataCoordSegmentInfo

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة الاسم الفرعي لقناة الرسائل حيث ينشر منسق البيانات رسائل معلومات المقطع.
  • +
  • تكون بادئة اسم القناة الكاملة هي ${msgChannel.chanNamePrefix.cluster.cluster}-${msgChannel.chanNamePrefix.dataCoordSegmentInfo}
  • +
  • تنبيه: سيؤثر تغيير هذه المعلمة بعد استخدام Milvus لفترة من الوقت على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • مقطع-إنفو-قناة المعلومات
    +

    msgChannel.subNamePrefix.dataCoordSubNamePrefix

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة اسم الاشتراك لنسق البيانات.
  • +
  • تنبيه: تغيير هذه المعلمة بعد استخدام ملفوس لفترة من الزمن سيؤثر على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ملفوس للمرة الأولى.
  • إحداثيات البيانات
    +

    msgChannel.subNamePrefix.dataNodeSubNamePrefix

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة اسم الاشتراك لعقدة البيانات.
  • +
  • تنبيه: تغيير هذه المعلمة بعد استخدام ملفوس لفترة من الزمن سيؤثر على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل ميلفوس للمرة الأولى.
  • dataNode
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.json new file mode 100644 index 000000000..ce7d034df --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"natsmq-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ natsmq","href":"natsmq-related-Configurations","type":1,"isActive":false},{"label":"natsmq.server.port","href":"natsmqserverport","type":2,"isActive":false},{"label":"natsmq.server.storeDir","href":"natsmqserverstoreDir","type":2,"isActive":false},{"label":"natsmq.server.maxFileStore","href":"natsmqservermaxFileStore","type":2,"isActive":false},{"label":"natsmq.server.maxPayload","href":"natsmqservermaxPayload","type":2,"isActive":false},{"label":"natsmq.server.maxPending","href":"natsmqservermaxPending","type":2,"isActive":false},{"label":"natsmq.server.initializeTimeout","href":"natsmqserverinitializeTimeout","type":2,"isActive":false},{"label":"natsmq.server.monitor.trace","href":"natsmqservermonitortrace","type":2,"isActive":false},{"label":"natsmq.server.monitor.debug","href":"natsmqservermonitordebug","type":2,"isActive":false},{"label":"natsmq.server.monitor.logTime","href":"natsmqservermonitorlogTime","type":2,"isActive":false},{"label":"natsmq.server.monitor.logFile","href":"natsmqservermonitorlogFile","type":2,"isActive":false},{"label":"natsmq.server.monitor.logSizeLimit","href":"natsmqservermonitorlogSizeLimit","type":2,"isActive":false},{"label":"natsmq.server.retention.maxAge","href":"natsmqserverretentionmaxAge","type":2,"isActive":false},{"label":"natsmq.server.retention.maxBytes","href":"natsmqserverretentionmaxBytes","type":2,"isActive":false},{"label":"natsmq.server.retention.maxMsgs","href":"natsmqserverretentionmaxMsgs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.md new file mode 100644 index 000000000..701ba9a01 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_natsmq.md @@ -0,0 +1,429 @@ +--- +id: configure_natsmq.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة natsmq لميلفوس. +--- +

    التكوينات المتعلقة بـ natsmq

    تكوين natsmq.

    +

    مزيد من التفاصيل: https://docs.nats.io/running-a-nats-service/configuration

    +

    natsmq.server.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ الاستماع لخادم NATS. 4222
    +

    natsmq.server.storeDir

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الدليل المراد استخدامه لتخزين JetStream لـ NATS /var/lib/milvus/nats
    +

    natsmq.server.maxFileStore

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم تخزين "الملف 17179869184
    +

    natsmq.server.maxPayload

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد البايتات في حمولة الرسالة 8388608
    +

    natsmq.server.maxPending

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد البايتات المخزنة مؤقتاً للاتصال ينطبق على اتصالات العميل 67108864
    +

    natsmq.server.initializeTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    في انتظار انتهاء تهيئة natsmq 4000
    +

    natsmq.server.monitor.trace

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كان صواب تمكين رسائل سجل تتبع البروتوكول خطأ
    +

    natsmq.server.monitor.debug

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا كان صواب تمكين رسائل سجل التصحيح خطأ
    +

    natsmq.server.monitor.logTime

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا تم ضبطها على خطأ، سجل بدون طوابع زمنية. صواب
    +

    natsmq.server.monitor.logFile

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مسار ملف السجل بالنسبة إلى .. من ملف ميلفوس الثنائي في حالة استخدام المسار النسبي /tmp/milvus/logs/nats.log
    +

    natsmq.server.monitor.logSizeLimit

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحجم بالبايت بعد ترحيل ملف السجل إلى ملف جديد 536870912
    +

    natsmq.server.retention.maxAge

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعمر أي رسالة في القناة P 4320
    +

    natsmq.server.retention.maxBytes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد وحدات البايت التي قد تحتويها القناة P المفردة. إزالة الرسائل الأقدم إذا تجاوزت القناة P هذا الحجم
    +

    natsmq.server.retention.maxMsgs

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد الرسائل التي قد تحتويها القناة P المفردة. إزالة الرسائل الأقدم إذا تجاوزت القناة P هذا الحد
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.json new file mode 100644 index 000000000..6e7a721a3 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"proxy-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالوكيل","href":"proxy-related-Configurations","type":1,"isActive":false},{"label":"proxy.timeTickInterval","href":"proxytimeTickInterval","type":2,"isActive":false},{"label":"proxy.healthCheckTimeout","href":"proxyhealthCheckTimeout","type":2,"isActive":false},{"label":"proxy.msgStream.timeTick.bufSize","href":"proxymsgStreamtimeTickbufSize","type":2,"isActive":false},{"label":"proxy.maxNameLength","href":"proxymaxNameLength","type":2,"isActive":false},{"label":"proxy.maxFieldNum","href":"proxymaxFieldNum","type":2,"isActive":false},{"label":"proxy.maxVectorFieldNum","href":"proxymaxVectorFieldNum","type":2,"isActive":false},{"label":"proxy.maxShardNum","href":"proxymaxShardNum","type":2,"isActive":false},{"label":"proxy.maxDimension","href":"proxymaxDimension","type":2,"isActive":false},{"label":"proxy.ginLogging","href":"proxyginLogging","type":2,"isActive":false},{"label":"proxy.ginLogSkipPaths","href":"proxyginLogSkipPaths","type":2,"isActive":false},{"label":"proxy.maxTaskNum","href":"proxymaxTaskNum","type":2,"isActive":false},{"label":"proxy.mustUsePartitionKey","href":"proxymustUsePartitionKey","type":2,"isActive":false},{"label":"proxy.accessLog.enable","href":"proxyaccessLogenable","type":2,"isActive":false},{"label":"proxy.accessLog.minioEnable","href":"proxyaccessLogminioEnable","type":2,"isActive":false},{"label":"proxy.accessLog.localPath","href":"proxyaccessLoglocalPath","type":2,"isActive":false},{"label":"proxy.accessLog.filename","href":"proxyaccessLogfilename","type":2,"isActive":false},{"label":"proxy.accessLog.maxSize","href":"proxyaccessLogmaxSize","type":2,"isActive":false},{"label":"proxy.accessLog.rotatedTime","href":"proxyaccessLogrotatedTime","type":2,"isActive":false},{"label":"proxy.accessLog.remotePath","href":"proxyaccessLogremotePath","type":2,"isActive":false},{"label":"proxy.accessLog.remoteMaxTime","href":"proxyaccessLogremoteMaxTime","type":2,"isActive":false},{"label":"proxy.accessLog.cacheSize","href":"proxyaccessLogcacheSize","type":2,"isActive":false},{"label":"proxy.accessLog.cacheFlushInterval","href":"proxyaccessLogcacheFlushInterval","type":2,"isActive":false},{"label":"proxy.connectionCheckIntervalSeconds","href":"proxyconnectionCheckIntervalSeconds","type":2,"isActive":false},{"label":"proxy.connectionClientInfoTTLSeconds","href":"proxyconnectionClientInfoTTLSeconds","type":2,"isActive":false},{"label":"proxy.maxConnectionNum","href":"proxymaxConnectionNum","type":2,"isActive":false},{"label":"proxy.gracefulStopTimeout","href":"proxygracefulStopTimeout","type":2,"isActive":false},{"label":"proxy.slowQuerySpanInSeconds","href":"proxyslowQuerySpanInSeconds","type":2,"isActive":false},{"label":"proxy.queryNodePooling.size","href":"proxyqueryNodePoolingsize","type":2,"isActive":false},{"label":"proxy.http.enabled","href":"proxyhttpenabled","type":2,"isActive":false},{"label":"proxy.http.debug_mode","href":"proxyhttpdebugmode","type":2,"isActive":false},{"label":"proxy.http.port","href":"proxyhttpport","type":2,"isActive":false},{"label":"proxy.http.acceptTypeAllowInt64","href":"proxyhttpacceptTypeAllowInt64","type":2,"isActive":false},{"label":"proxy.http.enablePprof","href":"proxyhttpenablePprof","type":2,"isActive":false},{"label":"proxy.ip","href":"proxyip","type":2,"isActive":false},{"label":"proxy.port","href":"proxyport","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxSendSize","href":"proxygrpcserverMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxRecvSize","href":"proxygrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxSendSize","href":"proxygrpcclientMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxRecvSize","href":"proxygrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.md new file mode 100644 index 000000000..4f75599f6 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_proxy.md @@ -0,0 +1,1155 @@ +--- +id: configure_proxy.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين الوكيل لـ Milvus. +--- +

    التكوينات المتعلقة بالوكيل

    تكوين متعلق بالوكيل، يُستخدم للتحقق من صحة طلبات العميل وتقليل النتائج التي يتم إرجاعها.

    +

    proxy.timeTickInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني الذي يقوم فيه الوكيل بمزامنة علامة الوقت، الوحدة: مللي ثانية. 200
    +

    proxy.healthCheckTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مللي ثانية، الفاصل الزمني الذي يتم فيه التحقق من صحة المكون 3000
    +

    proxy.msgStream.timeTick.bufSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد الرسائل التي يمكن تخزينها مؤقتاً في دفق رسائل timeTick للوكيل عند إنتاج الرسائل. 512
    +

    proxy.maxNameLength

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لطول الاسم أو الاسم المستعار الذي يمكن إنشاؤه في Milvus، بما في ذلك اسم المجموعة والاسم المستعار للمجموعة واسم القسم واسم الحقل. 255
    +

    proxy.maxFieldNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد الحقول التي يمكن إنشاؤها عند الإنشاء في مجموعة. يُنصح بشدة بتعيين maxFieldNum >= 64. 64
    +

    proxy.maxVectorFieldNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد الحقول المتجهة التي يمكن تحديدها في مجموعة. نطاق القيمة: [1, 10]. 4
    +

    proxy.maxShardNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد القطع التي يمكن إنشاؤها عند الإنشاء في مجموعة. 16
    +

    proxy.maxDimension

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد أبعاد المتجه الذي يمكن أن يكون عند الإنشاء في مجموعة. 32768
    +

    proxy.ginLogging

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • سواء لإنتاج سجلات الجن.
  • +
  • يرجى الضبط في ميلفوس المضمنة: خطأ
  • صواب
    +

    proxy.ginLogSkipPaths

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تخطي مسار url لسجل الجن /
    +

    proxy.maxTaskNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المهام في قائمة انتظار المهام الخاصة بالوكيل. 1024
    +

    proxy.mustUsePartitionKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مفتاح تبديل لما إذا كان يجب على الوكيل استخدام مفتاح التقسيم للمجموعة خطأ
    +

    proxy.accessLog.enable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان يجب تمكين ميزة سجل الوصول. خطأ
    +

    proxy.accessLog.minioEnable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان سيتم تحميل ملفات سجل الوصول المحلي إلى MinIO. يمكن تحديد هذه المعلمة عندما يكون proxy.accessLog.filename غير فارغ. خطأ
    +

    proxy.accessLog.localPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مسار المجلد المحلي حيث يتم تخزين ملف سجل الوصول. يمكن تحديد هذه المعلمة عندما يكون proxy.accessLog.filename غير فارغ. /tmp/milvus_access
    +

    proxy.accessLog.filename

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    اسم ملف سجل الوصول. إذا تركت هذه المعلمة فارغة، ستتم طباعة سجلات الوصول إلى stdout.
    +

    proxy.accessLog.maxSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى للحجم المسموح به لملف سجل وصول واحد. إذا وصل حجم ملف السجل إلى هذا الحد، سيتم تشغيل عملية تدوير. تقوم هذه العملية بإغلاق ملف سجل الوصول الحالي وإنشاء ملف سجل جديد ومسح محتويات ملف السجل الأصلي. الوحدة: ميغابايت. 64
    +

    proxy.accessLog.rotatedTime

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى للفاصل الزمني المسموح به لتدوير ملف سجل وصول واحد. عند الوصول إلى الفاصل الزمني المحدد، يتم تشغيل عملية تدوير، مما يؤدي إلى إنشاء ملف سجل وصول جديد وإغلاق الملف السابق. الوحدة: ثانية 0
    +

    proxy.accessLog.remotePath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مسار تخزين الكائن لتحميل ملفات سجل الوصول. Access_log/
    +

    proxy.accessLog.remoteMaxTime

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني المسموح به لتحميل ملفات سجل الوصول. إذا تجاوز وقت تحميل ملف السجل هذا الفاصل الزمني، فسيتم حذف الملف. يؤدي تعيين القيمة إلى 0 إلى تعطيل هذه الميزة. 0
    +

    proxy.accessLog.cacheSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم سجل ذاكرة التخزين المؤقت للكتابة، بالبايت. (إغلاق ذاكرة التخزين المؤقت للكتابة إذا كان الحجم 0) 0
    +

    proxy.accessLog.cacheFlushInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لذاكرة التخزين المؤقت للكتابة ذات التدفق التلقائي، بالثواني. (إغلاق التدفق التلقائي إذا كان الفاصل الزمني 0) 3
    +

    proxy.connectionCheckIntervalSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الوقت الفاصل الزمني (بالثواني) لمدير الاتصال لمسح معلومات العميل غير النشطة 120
    +

    proxy.connectionClientInfoTTLSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مدة الفاصل الزمني لمعلومات العميل غير النشط، بالثواني 86400
    +

    proxy.maxConnectionNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لأرقام معلومات العميل التي يجب أن يديرها الوكيل، وتجنب الكثير من معلومات العميل 10000
    +

    proxy.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ثانية. فرض إيقاف العقدة بدون توقف رشيق 30
    +

    proxy.slowQuerySpanInSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    يمكن اعتبار الاستعلام الذي يتجاوز زمن تنفيذه 'slowQuerySpanInSeconds' بطيئاً، بالثواني. 5
    +

    proxy.queryNodePooling.size

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم تجمع عملاء shardleader(querynode) 10
    +

    proxy.http.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء لتمكين خادم http صواب
    +

    proxy.http.debug_mode

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان سيتم تمكين وضع تصحيح أخطاء خادم http خطأ
    +

    proxy.http.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    واجهة برمجة تطبيقات مرنة عالية المستوى
    +

    proxy.http.acceptTypeAllowInt64

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    واجهة برمجة تطبيقات مرنة عالية المستوى، ما إذا كان بإمكان عميل http التعامل مع int64 صحيح
    +

    proxy.http.enablePprof

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان تمكين البرنامج الوسيط pprof على منفذ المقاييس صواب
    +

    proxy.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP للوكيل. إذا لم يتم تحديده، استخدم أول عنوان أحادي الإرسال
    +

    proxy.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP للوكيل 19530
    +

    proxy.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب بروتوكول معالجة طلبات الشراء (RPC) الذي يمكن للوكيل إرساله، الوحدة: بايت 268435456
    +

    proxy.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب استدعاء أوامر الشراء عن بُعد الذي يمكن للوكيل استقباله، الوحدة: بايت 67108864
    +

    proxy.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء عن بُعد الذي يمكن للعملاء على الوكيل إرساله، الوحدة: بايت 268435456
    +

    proxy.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء عن بُعد (RPC) الذي يمكن للعملاء على الوكيل تلقيه، الوحدة: بايت 67108864
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.json new file mode 100644 index 000000000..119b8d05b --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"pulsar-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ pulsar","href":"pulsar-related-Configurations","type":1,"isActive":false},{"label":"pulsar.address","href":"pulsaraddress","type":2,"isActive":false},{"label":"pulsar.port","href":"pulsarport","type":2,"isActive":false},{"label":"pulsar.webport","href":"pulsarwebport","type":2,"isActive":false},{"label":"pulsar.maxMessageSize","href":"pulsarmaxMessageSize","type":2,"isActive":false},{"label":"pulsar.tenant","href":"pulsartenant","type":2,"isActive":false},{"label":"pulsar.namespace","href":"pulsarnamespace","type":2,"isActive":false},{"label":"pulsar.requestTimeout","href":"pulsarrequestTimeout","type":2,"isActive":false},{"label":"pulsar.enableClientMetrics","href":"pulsarenableClientMetrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.md new file mode 100644 index 000000000..8a5890b7c --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_pulsar.md @@ -0,0 +1,264 @@ +--- +id: configure_pulsar.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة بولسار لميلفوس. +--- +

    التكوينات المتعلقة بـ pulsar

    تكوين متعلق بـ pulsar، يُستخدم لإدارة سجلات Milvus لعمليات الطفرة الأخيرة، وسجل تدفق الإخراج، وتوفير خدمات نشر السجل والاشتراك في السجل.

    +

    pulsar.address

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • عنوان IP لخدمة بولسار.
  • +
  • متغير البيئة: PULSAR_ADDRESS
  • +
  • يولد عنوان pulsar.address و pulsar.port معًا الوصول الصحيح إلى Pulsar.
  • +
  • يكتسب Pulsar بشكل تفضيلي عنوان IP الصالح من متغير البيئة PULSAR_ADDRESS عند بدء تشغيل Milvus.
  • +
  • تنطبق القيمة الافتراضية عند تشغيل Pulsar على نفس الشبكة مع Milvus.
  • المضيف المحلي
    +

    pulsar.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ خدمة Pulsar. 6650
    +

    pulsar.webport

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ الويب لخدمة بولسار. إذا كنت تتصل مباشرة دون وكيل، يجب استخدام 8080. 80
    +

    pulsar.maxMessageSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لحجم كل رسالة في بولسار. الوحدة: بايت.
  • +
  • بشكل افتراضي، يمكن لـ Pulsar نقل 5 ميغابايت على الأكثر من البيانات في رسالة واحدة. عندما يكون حجم البيانات المدرجة أكبر من هذه القيمة، يقوم الوكيل بتجزئة البيانات إلى رسائل متعددة لضمان إمكانية نقلها بشكل صحيح.
  • +
  • إذا ظلت المعلمة المقابلة في Pulsar دون تغيير، فإن زيادة هذا التكوين سيؤدي إلى فشل Milvus، ولا ينتج عن تقليلها أي ميزة.
  • 5242880
    +

    pulsar.tenant

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • يمكن توفير Pulsar لمستأجرين محددين مع تخصيص سعة مناسبة للمستأجر.
  • +
  • لمشاركة مثيل Pulsar بين عدة مثيلات Milvus، يمكنك تغيير هذا إلى مستأجر Pulsar بدلاً من المستأجر الافتراضي لكل مثيل Milvus قبل بدء تشغيلها. ومع ذلك، إذا كنت لا ترغب في الإيجار المتعدد لـ Pulsar، يُنصح بتغيير msgChannel.chanNamePrefix.cluster إلى قيمة مختلفة.
  • عام
    +

    pulsar.namespace

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مساحة اسم Pulsar هي تسمية الوحدة الإدارية داخل المستأجر. افتراضي
    +

    pulsar.requestTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة الطلب العام لعميل بولسار بالثواني 60
    +

    pulsar.enableClientMetrics

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان سيتم تسجيل مقاييس عميل بولسار في مسار مقاييس ميلفوس. خطأ
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.json new file mode 100644 index 000000000..56ec66aca --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryCoord-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالاستعلام","href":"queryCoord-related-Configurations","type":1,"isActive":false},{"label":"queryCoord.autoHandoff","href":"queryCoordautoHandoff","type":2,"isActive":false},{"label":"queryCoord.autoBalance","href":"queryCoordautoBalance","type":2,"isActive":false},{"label":"queryCoord.autoBalanceChannel","href":"queryCoordautoBalanceChannel","type":2,"isActive":false},{"label":"queryCoord.balancer","href":"queryCoordbalancer","type":2,"isActive":false},{"label":"queryCoord.globalRowCountFactor","href":"queryCoordglobalRowCountFactor","type":2,"isActive":false},{"label":"queryCoord.scoreUnbalanceTolerationFactor","href":"queryCoordscoreUnbalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.reverseUnBalanceTolerationFactor","href":"queryCoordreverseUnBalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.overloadedMemoryThresholdPercentage","href":"queryCoordoverloadedMemoryThresholdPercentage","type":2,"isActive":false},{"label":"queryCoord.balanceIntervalSeconds","href":"queryCoordbalanceIntervalSeconds","type":2,"isActive":false},{"label":"queryCoord.memoryUsageMaxDifferencePercentage","href":"queryCoordmemoryUsageMaxDifferencePercentage","type":2,"isActive":false},{"label":"queryCoord.rowCountFactor","href":"queryCoordrowCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountFactor","href":"queryCoordsegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.globalSegmentCountFactor","href":"queryCoordglobalSegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountMaxSteps","href":"queryCoordsegmentCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.rowCountMaxSteps","href":"queryCoordrowCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.randomMaxSteps","href":"queryCoordrandomMaxSteps","type":2,"isActive":false},{"label":"queryCoord.growingRowCountWeight","href":"queryCoordgrowingRowCountWeight","type":2,"isActive":false},{"label":"queryCoord.delegatorMemoryOverloadFactor","href":"queryCoorddelegatorMemoryOverloadFactor","type":2,"isActive":false},{"label":"queryCoord.balanceCostThreshold","href":"queryCoordbalanceCostThreshold","type":2,"isActive":false},{"label":"queryCoord.channelTaskTimeout","href":"queryCoordchannelTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.segmentTaskTimeout","href":"queryCoordsegmentTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.heartbeatAvailableInterval","href":"queryCoordheartbeatAvailableInterval","type":2,"isActive":false},{"label":"queryCoord.distRequestTimeout","href":"queryCoorddistRequestTimeout","type":2,"isActive":false},{"label":"queryCoord.heatbeatWarningLag","href":"queryCoordheatbeatWarningLag","type":2,"isActive":false},{"label":"queryCoord.checkHealthInterval","href":"queryCoordcheckHealthInterval","type":2,"isActive":false},{"label":"queryCoord.checkHealthRPCTimeout","href":"queryCoordcheckHealthRPCTimeout","type":2,"isActive":false},{"label":"queryCoord.brokerTimeout","href":"queryCoordbrokerTimeout","type":2,"isActive":false},{"label":"queryCoord.collectionRecoverTimes","href":"queryCoordcollectionRecoverTimes","type":2,"isActive":false},{"label":"queryCoord.observerTaskParallel","href":"queryCoordobserverTaskParallel","type":2,"isActive":false},{"label":"queryCoord.checkAutoBalanceConfigInterval","href":"queryCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"queryCoord.checkNodeSessionInterval","href":"queryCoordcheckNodeSessionInterval","type":2,"isActive":false},{"label":"queryCoord.gracefulStopTimeout","href":"queryCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"queryCoord.enableStoppingBalance","href":"queryCoordenableStoppingBalance","type":2,"isActive":false},{"label":"queryCoord.channelExclusiveNodeFactor","href":"queryCoordchannelExclusiveNodeFactor","type":2,"isActive":false},{"label":"queryCoord.collectionObserverInterval","href":"queryCoordcollectionObserverInterval","type":2,"isActive":false},{"label":"queryCoord.checkExecutedFlagInterval","href":"queryCoordcheckExecutedFlagInterval","type":2,"isActive":false},{"label":"queryCoord.updateCollectionLoadStatusInterval","href":"queryCoordupdateCollectionLoadStatusInterval","type":2,"isActive":false},{"label":"queryCoord.cleanExcludeSegmentInterval","href":"queryCoordcleanExcludeSegmentInterval","type":2,"isActive":false},{"label":"queryCoord.ip","href":"queryCoordip","type":2,"isActive":false},{"label":"queryCoord.port","href":"queryCoordport","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxSendSize","href":"queryCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxRecvSize","href":"queryCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxSendSize","href":"queryCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxRecvSize","href":"queryCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.md new file mode 100644 index 000000000..c3adf8776 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_querycoord.md @@ -0,0 +1,1300 @@ +--- +id: configure_querycoord.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة الاستعلام عن الاستعلامات لـ Milvus. +--- +

    التكوينات المتعلقة بالاستعلام

    تكوين متعلق بالاستعلامCoord، يُستخدم لإدارة الطوبولوجيا وموازنة التحميل لعقد الاستعلام، والتسليم من المقاطع المتنامية إلى المقاطع المغلقة.

    +

    queryCoord.autoHandoff

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تبديل القيمة للتحكم في ما إذا كان سيتم استبدال المقطع المتنامي تلقائياً بالمقطع المغلق المفهرس المقابل عندما يصل المقطع المتنامي إلى حد الإغلاق.
  • +
  • إذا تم تعيين هذه المعلمة خطأ، يبحث ميلفوس ببساطة في المقاطع المتنامية بالقوة الغاشمة.
  • صواب
    +

    queryCoord.autoBalance

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تبديل القيمة للتحكم في ما إذا كان سيتم موازنة استخدام الذاكرة تلقائياً بين عقد الاستعلام عن طريق توزيع عمليات تحميل المقطع وتحريره بالتساوي. صواب
    +

    queryCoord.autoBalanceChannel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين قناة التوازن التلقائي صواب
    +

    queryCoord.balancer

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الموازن التلقائي المستخدم للشرائح على عقد الاستعلامات الموازن المستند إلى النقاط
    +

    queryCoord.globalRowCountFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الوزن المستخدم عند موازنة المقاطع بين عُقد الاستعلامات 0.1
    +

    queryCoord.scoreUnbalanceTolerationFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أقل قيمة للمدى غير المتوازن بين العقد من وإلى عند إجراء الموازنة 0.05
    +

    queryCoord.reverseUnBalanceTolerationFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أكبر قيمة للمدى غير المتوازن بين العقد من وإلى العقد بعد إجراء التوازن 1.3
    +

    queryCoord.overloadedMemoryThresholdPercentage

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عتبة استخدام الذاكرة (بالنسبة المئوية) في عقدة الاستعلام لتشغيل موازنة المقطع المختوم. 90
    +

    queryCoord.balanceIntervalSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفترة الزمنية التي يوازن عندها تنسيق الاستعلام استخدام الذاكرة بين عقد الاستعلام. 60
    +

    queryCoord.memoryUsageMaxDifferencePercentage

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأدنى لفرق استخدام الذاكرة (بالنسبة المئوية) بين أي عقدتي استعلام لتشغيل موازنة المقطع المختوم. 30
    +

    queryCoord.rowCountFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وزن عدد الصفوف المستخدم عند موازنة المقاطع بين عقد الاستعلامات 0.4
    +

    queryCoord.segmentCountFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وزن عدد المقاطع المستخدم عند موازنة المقاطع بين عقد الاستعلام 0.4
    +

    queryCoord.globalSegmentCountFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وزن عدد المقاطع المستخدم عند موازنة المقاطع بين عُقد الاستعلام 0.1
    +

    queryCoord.segmentCountMaxSteps

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الخطوات القصوى لمولد الخطة المستندة إلى عدد المقاطع 50
    +

    queryCoord.rowCountMaxSteps

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لخطوات مولد الخطة المستند إلى عدد المقاطع 50
    +

    queryCoord.randomMaxSteps

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لخطوات مولد الخطة المستند إلى عدد المقاطع 10
    +

    queryCoord.growingRowCountWeight

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    وزن الذاكرة لعدد صفوف المقطع المتزايد 4
    +

    queryCoord.delegatorMemoryOverloadFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عامل الذاكرة الزائدة للمفوض 0.1
    +

    queryCoord.balanceCostThreshold

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عتبة تكلفة التوازن، إذا كان فرق تكلفة المجموعة بعد تنفيذ خطة التوازن أقل من هذه القيمة، فلن يتم تنفيذ الخطة 0.001
    +

    queryCoord.channelTaskTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    1 دقيقة 60000
    +

    queryCoord.segmentTaskTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    2 دقيقة 120000
    +

    queryCoord.heartbeatAvailableInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    10 ثوانٍ، تتوفر فقط عُقد الاستعلام التي جلبت نبضات القلب خلال المدة 10000
    +

    queryCoord.distRequestTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة الطلب لتوزيع بيانات الاستعلامات التي تجلب نبضات القلب من عقد الاستعلام، بالمللي ثانية 5000
    +

    queryCoord.heatbeatWarningLag

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    قيمة التأخر لتحذير تقرير الاستعلام عن الكواريكورد عندما تكون آخر نبضة حرارة قديمة جداً، بالمللي ثانية 5000
    +

    queryCoord.checkHealthInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    3 ثوانٍ، الفاصل الزمني عند محاولة تنسيق الاستعلام التحقق من صحة عقدة الاستعلام 3000
    +

    queryCoord.checkHealthRPCTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    100 مللي ثانية، المهلة الزمنية للتحقق من صحة rpc لعقدة الاستعلام 2000
    +

    queryCoord.brokerTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    5000 مللي ثانية، مهلة وسيط الاستعلام rpc إلى عقدة الاستعلام 5000
    +

    queryCoord.collectionRecoverTimes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إذا وصلت أزمنة استرداد المجموعة إلى الحد الأقصى أثناء حالة التحميل، فقم بتحريرها 3
    +

    queryCoord.observerTaskParallel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    رقم مهمة مرسل المراقب الموازي 16
    +

    queryCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لتكوين الرصيد التلقائي للتحقق من التوازن التلقائي 10
    +

    queryCoord.checkNodeSessionInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني (بالثواني) لجلسة التحقق من مجموعة الاستعلامات 60
    +

    queryCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ثانية. فرض إيقاف العقدة بدون توقف رشيق 5
    +

    queryCoord.enableStoppingBalance

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان تمكين إيقاف التوازن صواب
    +

    queryCoord.channelExclusiveNodeFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أدنى رقم عقدة لتمكين الوضع الحصري للقناة 4
    +

    queryCoord.collectionObserverInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لمراقب التجميع 200
    +

    queryCoord.checkExecutedFlagInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لعلامة التحقق المنفذة لإجبار سحب الهاء 100
    +

    queryCoord.updateCollectionLoadStatusInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    5 م، الحد الأقصى للفاصل الزمني لتحديث حالة المجموعة المحملة 5
    +

    queryCoord.cleanExcludeSegmentInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المدة الزمنية لمقطع استبعاد خط الأنابيب النظيف المستخدم لتصفية البيانات غير الصالحة، بالثواني 60
    +

    queryCoord.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP الخاص بالاستعلام. إذا لم يتم تحديده، استخدم أول عنوان غير قابل للإرسال
    +

    queryCoord.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP الخاص بالاستعلام 19531
    +

    queryCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن أن يرسله الاستعلام، الوحدة: بايت 536870912
    +

    queryCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء طلب تنفيذ أمر الشراء الذي يمكن أن يتلقاه الاستعلام، الوحدة: بايت 268435456
    +

    queryCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن للعملاء في الاستعلام عن طلب الشراء عن طريق النقر فوق النقر أن يرسلوه، الوحدة: بايت 268435456
    +

    queryCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن للعملاء على الاستعلام، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.json new file mode 100644 index 000000000..e707aa29d --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryNode-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بعقدة الاستعلام","href":"queryNode-related-Configurations","type":1,"isActive":false},{"label":"queryNode.stats.publishInterval","href":"queryNodestatspublishInterval","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereThreadPoolNumRatio","href":"queryNodesegcoreknowhereThreadPoolNumRatio","type":2,"isActive":false},{"label":"queryNode.segcore.chunkRows","href":"queryNodesegcorechunkRows","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.enableIndex","href":"queryNodesegcoreinterimIndexenableIndex","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nlist","href":"queryNodesegcoreinterimIndexnlist","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nprobe","href":"queryNodesegcoreinterimIndexnprobe","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.memExpansionRate","href":"queryNodesegcoreinterimIndexmemExpansionRate","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.buildParallelRate","href":"queryNodesegcoreinterimIndexbuildParallelRate","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereScoreConsistency","href":"queryNodesegcoreknowhereScoreConsistency","type":2,"isActive":false},{"label":"queryNode.loadMemoryUsageFactor","href":"queryNodeloadMemoryUsageFactor","type":2,"isActive":false},{"label":"queryNode.enableDisk","href":"queryNodeenableDisk","type":2,"isActive":false},{"label":"queryNode.cache.memoryLimit","href":"queryNodecachememoryLimit","type":2,"isActive":false},{"label":"queryNode.cache.readAheadPolicy","href":"queryNodecachereadAheadPolicy","type":2,"isActive":false},{"label":"queryNode.cache.warmup","href":"queryNodecachewarmup","type":2,"isActive":false},{"label":"queryNode.mmap.mmapEnabled","href":"queryNodemmapmmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.growingMmapEnabled","href":"queryNodemmapgrowingMmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.fixedFileSizeForMmapAlloc","href":"queryNodemmapfixedFileSizeForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.mmap.maxDiskUsagePercentageForMmapAlloc","href":"queryNodemmapmaxDiskUsagePercentageForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.lazyload.enabled","href":"queryNodelazyloadenabled","type":2,"isActive":false},{"label":"queryNode.lazyload.waitTimeout","href":"queryNodelazyloadwaitTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceTimeout","href":"queryNodelazyloadrequestResourceTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceRetryInterval","href":"queryNodelazyloadrequestResourceRetryInterval","type":2,"isActive":false},{"label":"queryNode.lazyload.maxRetryTimes","href":"queryNodelazyloadmaxRetryTimes","type":2,"isActive":false},{"label":"queryNode.lazyload.maxEvictPerRetry","href":"queryNodelazyloadmaxEvictPerRetry","type":2,"isActive":false},{"label":"queryNode.scheduler.maxReadConcurrentRatio","href":"queryNodeschedulermaxReadConcurrentRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.cpuRatio","href":"queryNodeschedulercpuRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.name","href":"queryNodeschedulerscheduleReadPolicyname","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.taskQueueExpire","href":"queryNodeschedulerscheduleReadPolicytaskQueueExpire","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping","href":"queryNodeschedulerscheduleReadPolicyenableCrossUserGrouping","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser","href":"queryNodeschedulerscheduleReadPolicymaxPendingTaskPerUser","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxQueueLength","href":"queryNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxParallelism","href":"queryNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"queryNode.enableSegmentPrune","href":"queryNodeenableSegmentPrune","type":2,"isActive":false},{"label":"queryNode.bloomFilterApplyParallelFactor","href":"queryNodebloomFilterApplyParallelFactor","type":2,"isActive":false},{"label":"queryNode.queryStreamBatchSize","href":"queryNodequeryStreamBatchSize","type":2,"isActive":false},{"label":"queryNode.workerPooling.size","href":"queryNodeworkerPoolingsize","type":2,"isActive":false},{"label":"queryNode.ip","href":"queryNodeip","type":2,"isActive":false},{"label":"queryNode.port","href":"queryNodeport","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxSendSize","href":"queryNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxRecvSize","href":"queryNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxSendSize","href":"queryNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxRecvSize","href":"queryNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.md new file mode 100644 index 000000000..6776682e3 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_querynode.md @@ -0,0 +1,1261 @@ +--- +id: configure_querynode.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين الاستعلام عن العقدة لـ Milvus. +--- +

    التكوينات المتعلقة بعقدة الاستعلام

    تكوين متعلق بعقدة الاستعلام، يُستخدم لتشغيل البحث الهجين بين البيانات المتجهة والقياسية.

    +

    queryNode.stats.publishInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني الذي تقوم فيه عقدة الاستعلام بنشر معلومات إحصائيات العقدة، بما في ذلك حالة المقطع، واستخدام وحدة المعالجة المركزية، واستخدام الذاكرة، وحالة الحالة الصحية، إلخ. الوحدة: مللي ثانية. 1000
    +

    queryNode.segcore.knowhereThreadPoolNumRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد مؤشرات الترابط في تجمع مؤشرات ترابط knowhere. إذا تم تمكين القرص، سيتضاعف حجم المخزن مع knowhereThreadPoolNumRatio([1، 32]). 4
    +

    queryNode.segcore.chunkRows

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد الصفوف التي يقسم بها Segcore المقطع إلى أجزاء. 128
    +

    queryNode.segcore.interimIndex.enableIndex

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • ما إذا كان سيتم إنشاء فهرس مؤقت للمقاطع المتزايدة والمقاطع المغلقة التي لم تتم فهرستها بعد، مما يحسن أداء البحث.
  • +
  • سيقوم ميلفوس في النهاية بإغلاق وفهرسة جميع المقاطع في نهاية المطاف، ولكن تمكين هذا الأمر يحسن أداء البحث للاستعلامات الفورية بعد إدراج البيانات.
  • +
  • يتم تعيين هذا افتراضيًا إلى صواب، مما يشير إلى أن Milvus ينشئ فهرسًا مؤقتًا للمقاطع المتزايدة والمقاطع المغلقة التي لم تتم فهرستها عند البحث.
  • صواب
    +

    queryNode.segcore.interimIndex.nlist

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    قائمة الفهرس المؤقت nlist، يوصى بتعيين sqrt(chunkRows)، يجب أن يكون أصغر من chunkRows/8 128
    +

    queryNode.segcore.interimIndex.nprobe

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    nprobe للبحث عن فهرس صغير، بناءً على متطلبات الدقة الخاصة بك، يجب أن يكون أصغر من nlist 16
    +

    queryNode.segcore.interimIndex.memExpansionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الذاكرة الإضافية اللازمة لبناء فهرس مؤقت 1.15
    +

    queryNode.segcore.interimIndex.buildParallelRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    نسبة بناء الفهرس المؤقت المتوازي للفهرس المؤقت المتطابق مع رقم وحدة المعالجة المركزية 0.5
    +

    queryNode.segcore.knowhereScoreConsistency

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين منطق حساب درجة الاتساق القوي في مكان المعرفة خطأ
    +

    queryNode.loadMemoryUsageFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    العامل المضاعف لحساب استخدام الذاكرة أثناء تحميل المقاطع 1
    +

    queryNode.enableDisk

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين كويرينود تحميل فهرس القرص والبحث على فهرس القرص خطأ
    +

    queryNode.cache.memoryLimit

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    2 جيجا بايت، 2 * 1024 * 1024 * 1024 * 1024 2147483648
    +

    queryNode.cache.readAheadPolicy

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سياسة القراءة المسبقة لذاكرة التخزين المؤقت للقطع، الخيارات: 'عادي، عشوائي، عشوائي، متسلسل، محتاج، غير محتاج' سوف تحتاج
    +

    queryNode.cache.warmup

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الخيارات: غير متزامن، مزامنة، تعطيل.
  • +
  • يحدد ضرورة إحماء ذاكرة التخزين المؤقت للقطع.
  • +
  • 1. إذا تم التعيين على "مزامنة" أو "غير متزامن" سيتم تحميل بيانات المتجه الأصلية بشكل متزامن/غير متزامن في
  • +
  • ذاكرة التخزين المؤقت للقطع أثناء عملية التحميل. هذا النهج لديه القدرة على تقليل وقت استجابة الاستعلام/البحث بشكل كبير
  • +
  • لمدة محددة بعد التحميل، وإن كان ذلك مصحوبًا بزيادة متزامنة في استخدام القرص;
  • +
  • 2. إذا تم تعيينه على "تعطيل" سيتم تحميل بيانات المتجه الأصلية في ذاكرة التخزين المؤقت للقطع فقط أثناء البحث/الاستعلام.
  • تعطيل
    +

    queryNode.mmap.mmapEnabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين mmap لتحميل البيانات خطأ
    +

    queryNode.mmap.growingMmapEnabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين mmap للاستخدام في تزايد البيانات الخام خطأ
    +

    queryNode.mmap.fixedFileSizeForMmapAlloc

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم ملف tmp لمدير القطع mmap mmap 1
    +

    queryNode.mmap.maxDiskUsagePercentageForMmapAlloc

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    النسبة المئوية للقرص المستخدم في مدير القطع mmap 50
    +

    queryNode.lazyload.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين التحميل البطيء لتحميل البيانات خطأ
    +

    queryNode.lazyload.waitTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لمدة مهلة الانتظار بالمللي ثانية قبل البدء في إجراء بحث واسترجاع التحميل البطيء 30000
    +

    queryNode.lazyload.requestResourceTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المهلة القصوى بالمللي ثانية لانتظار مورد الطلب للتحميل البطيء، 5 ثوانٍ افتراضيًا 5000
    +

    queryNode.lazyload.requestResourceRetryInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لإعادة المحاولة بالمللي ثانية لمورد طلب الانتظار للتحميل البطيء، 2 ثانية افتراضيًا 2000
    +

    queryNode.lazyload.maxRetryTimes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لأوقات إعادة المحاولة للتحميل البطيء، 1 افتراضيًا 1
    +

    queryNode.lazyload.maxEvictPerRetry

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد مرات الإخلاء للتحميل البطيء، 1 افتراضيًا 1
    +

    queryNode.scheduler.maxReadConcurrentRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • maxReadConcurrentRatio هي نسبة التزامن لمهمة القراءة (مهمة البحث ومهمة الاستعلام).
  • +
  • سيكون الحد الأقصى لتزامن القراءة هو قيمة hardware.GetCPUNum * maxReadConcurrentRatio.
  • +
  • يتم تعيينه افتراضيًا إلى 2.0، مما يعني أن الحد الأقصى لتزامن القراءة سيكون قيمة hardware.GetCPUNum * 2.
  • +
  • يجب أن يكون الحد الأقصى لتزامن القراءة أكبر من أو يساوي 1، وأقل من أو يساوي hardware.GetCPUNum * 100.
  • +
  • (0, 100]
  • 1
    +

    queryNode.scheduler.cpuRatio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    النسبة المستخدمة لتقدير استخدام وحدة المعالجة المركزية لمهمة القراءة. 10
    +

    queryNode.scheduler.scheduleReadPolicy.name

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • فيفو قائمة انتظار FIFO تدعم الجدول الزمني.
  • +
  • مستخدم-مهمة-استطلاع المستخدم:
  • +
  • سيتم استطلاع مهام المستخدم واحدة تلو الأخرى وجدولتها.
  • +
  • الجدولة عادلة على دقة المهام.
  • +
  • تعتمد السياسة على اسم المستخدم للمصادقة.
  • +
  • ويعتبر اسم المستخدم الفارغ هو نفس المستخدم.
  • +
  • في حالة عدم وجود مستخدمين متعددين، تتحلل السياسة إلى FIFO"
  • فيفو
    +

    queryNode.scheduler.scheduleReadPolicy.taskQueueExpire

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    التحكم في المدة (عدد الثواني) التي تحتفظ بها قائمة الانتظار منذ أن تكون قائمة الانتظار فارغة 60
    +

    queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    تمكين التجميع المتقاطع للمستخدمين عند استخدام نهج متابعة مهام المستخدم. (قم بتعطيله إذا كانت مهمة المستخدم لا يمكن دمجها مع بعضها البعض) خطأ
    +

    queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى للمهمة المعلقة لكل مستخدم في المجدول 1024
    +

    queryNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم ذاكرة التخزين المؤقت لقائمة انتظار المهام في الرسم البياني للتدفق في عقدة الاستعلام. 16
    +

    queryNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المهام المنفذة بالتوازي في الرسم البياني للتدفق 1024
    +

    queryNode.enableSegmentPrune

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    استخدام إحصائيات التقسيم لتشذيب البيانات في البحث/الاستعلام على مفوض الجزء خطأ
    +

    queryNode.bloomFilterApplyParallelFactor

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    العامل المتوازي عند تطبيق pk على عامل التصفية المتضخم، افتراضي إلى 4*CPU_CORE_NUM 4
    +

    queryNode.queryStreamBatchSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    إرجاع حجم الدفعة لاستعلام الدفق 4194304
    +

    queryNode.workerPooling.size

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم تجمع عملاء عقدة الاستعلام العامل 10
    +

    queryNode.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP لعقدة الاستعلام. إذا لم يتم تحديده، استخدم أول عنوان أحادي الإرسال
    +

    queryNode.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP لعقدة الاستعلام 21123
    +

    queryNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC يمكن أن ترسله عقدة الاستعلام، الوحدة: بايت 536870912
    +

    queryNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أمر طلب الإجراء الذي يمكن أن تستقبله عقدة الاستعلام، الوحدة: بايت 268435456
    +

    queryNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن للعملاء على عقدة الاستعلام إرساله، الوحدة: بايت 268435456
    +

    queryNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أوامر الشراء (RPC) الذي يمكن للعملاء على عقدة الاستعلام، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.json new file mode 100644 index 000000000..6d93c0545 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"quotaAndLimits-related Configurations","anchorList":[{"label":"تكوينات متعلقة بالحصص والحدود","href":"quotaAndLimits-related-Configurations","type":1,"isActive":false},{"label":"quotaAndLimits.enabled","href":"quotaAndLimitsenabled","type":2,"isActive":false},{"label":"quotaAndLimits.quotaCenterCollectInterval","href":"quotaAndLimitsquotaCenterCollectInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocRetryTimes","href":"quotaAndLimitslimitsallocRetryTimes","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocWaitInterval","href":"quotaAndLimitslimitsallocWaitInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.complexDeleteLimitEnable","href":"quotaAndLimitslimitscomplexDeleteLimitEnable","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxCollectionNumPerDB","href":"quotaAndLimitslimitsmaxCollectionNumPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxInsertSize","href":"quotaAndLimitslimitsmaxInsertSize","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxResourceGroupNumOfQueryNode","href":"quotaAndLimitslimitsmaxResourceGroupNumOfQueryNode","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.enabled","href":"quotaAndLimitsddlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.collectionRate","href":"quotaAndLimitsddlcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.partitionRate","href":"quotaAndLimitsddlpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.collectionRate","href":"quotaAndLimitsddldbcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.partitionRate","href":"quotaAndLimitsddldbpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.enabled","href":"quotaAndLimitsindexRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.max","href":"quotaAndLimitsindexRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.db.max","href":"quotaAndLimitsindexRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.enabled","href":"quotaAndLimitsflushRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.max","href":"quotaAndLimitsflushRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.collection.max","href":"quotaAndLimitsflushRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.db.max","href":"quotaAndLimitsflushRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.enabled","href":"quotaAndLimitscompactionRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.max","href":"quotaAndLimitscompactionRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.db.max","href":"quotaAndLimitscompactionRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.enabled","href":"quotaAndLimitsdmlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.max","href":"quotaAndLimitsdmlinsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.db.max","href":"quotaAndLimitsdmlinsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.collection.max","href":"quotaAndLimitsdmlinsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.partition.max","href":"quotaAndLimitsdmlinsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.max","href":"quotaAndLimitsdmlupsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.db.max","href":"quotaAndLimitsdmlupsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.collection.max","href":"quotaAndLimitsdmlupsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.partition.max","href":"quotaAndLimitsdmlupsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.max","href":"quotaAndLimitsdmldeleteRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.db.max","href":"quotaAndLimitsdmldeleteRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.collection.max","href":"quotaAndLimitsdmldeleteRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.partition.max","href":"quotaAndLimitsdmldeleteRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.max","href":"quotaAndLimitsdmlbulkLoadRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.db.max","href":"quotaAndLimitsdmlbulkLoadRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.collection.max","href":"quotaAndLimitsdmlbulkLoadRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.partition.max","href":"quotaAndLimitsdmlbulkLoadRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.enabled","href":"quotaAndLimitsdqlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.max","href":"quotaAndLimitsdqlsearchRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.db.max","href":"quotaAndLimitsdqlsearchRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.collection.max","href":"quotaAndLimitsdqlsearchRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.partition.max","href":"quotaAndLimitsdqlsearchRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.max","href":"quotaAndLimitsdqlqueryRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.db.max","href":"quotaAndLimitsdqlqueryRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.collection.max","href":"quotaAndLimitsdqlqueryRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.partition.max","href":"quotaAndLimitsdqlqueryRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.forceDeny","href":"quotaAndLimitslimitWritingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay","href":"quotaAndLimitslimitWritingttProtectionmaxTimeTickDelay","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.enabled","href":"quotaAndLimitslimitWritingmemProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled","href":"quotaAndLimitslimitWritinggrowingSegmentsSizeProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.enabled","href":"quotaAndLimitslimitWritingdiskProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuota","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuota","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerCollection","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerPartition","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionlowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionhighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.forceDeny","href":"quotaAndLimitslimitReadingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold","href":"quotaAndLimitslimitReadingqueueProtectionnqInQueueThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold","href":"quotaAndLimitslimitReadingqueueProtectionqueueLatencyThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.resultProtection.maxReadResultRate","href":"quotaAndLimitslimitReadingresultProtectionmaxReadResultRate","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.coolOffSpeed","href":"quotaAndLimitslimitReadingcoolOffSpeed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.md new file mode 100644 index 000000000..377ff9d1d --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_quotaandlimits.md @@ -0,0 +1,2137 @@ +--- +id: configure_quotaandlimits.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين quotaAndLimits لـ Milvus. +--- +

    تكوينات متعلقة بالحصص والحدود

    QuotaConfig، تكوينات الحصة والحدود الخاصة بـ Milvus.

    +

    بشكل افتراضي، نقوم بتمكين

    +
      +
    1. حماية TT;

    2. +
    3. حماية الذاكرة.

    4. +
    5. حماية الحصة النسبية للقرص.

    6. +
    +

    يمكنك تمكين:

    +
      +
    1. الحد من إنتاجية DML;

    2. +
    3. حدود DDL و DQL qps/ثانية DQL;

    4. +
    5. حماية طول/زمن انتظار DQL;

    6. +
    7. حماية معدل نتائج DQL;

    8. +
    +

    إذا لزم الأمر، يمكنك أيضًا فرض رفض طلبات RW يدويًا.

    +

    quotaAndLimits.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    'صواب' لتمكين الحصة والحدود، 'خطأ' لتعطيلها. صواب
    +

    quotaAndLimits.quotaCenterCollectInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • quotaCollectCollectInterval هي الفاصل الزمني الذي يقوم فيه quotaCenter
  • +
  • يجمع المقاييس من الوكلاء ومجموعة الاستعلامات ومجموعة البيانات.
  • +
  • ثانية، (0 ~ 65536)
  • 3
    +

    quotaAndLimits.limits.allocRetryTimes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أوقات إعادة المحاولة عند فشل حذف بيانات إعادة توجيه التخصيص من حد المعدل 15
    +

    quotaAndLimits.limits.allocWaitInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مدة انتظار إعادة المحاولة عند فشل حذف معدل بيانات إعادة توجيه التخصيص من المعدل، بالمللي ثانية 1000
    +

    quotaAndLimits.limits.complexDeleteLimitEnable

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان الحذف المعقد التحقق من بيانات إعادة توجيه الحذف بواسطة المحدد خطأ
    +

    quotaAndLimits.limits.maxCollectionNumPerDB

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لعدد المجموعات لكل قاعدة بيانات. 65536
    +

    quotaAndLimits.limits.maxInsertSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم طلب إدراج واحد، بالبايت، -1 تعني عدم وجود حد -1
    +

    quotaAndLimits.limits.maxResourceGroupNumOfQueryNode

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    أقصى عدد لمجموعات موارد عقد الاستعلام 1024
    +

    quotaAndLimits.ddl.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان يتم تمكين اختناق طلب DDL. خطأ
    +

    quotaAndLimits.ddl.collectionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد طلبات DDL المتعلقة بالتجميع في الثانية الواحدة.
  • +
  • يشير تعيين هذا العنصر إلى 10 إلى أن Milvus لا يقوم بمعالجة أكثر من 10 طلبات DDL متعلقة بالمجموعة في الثانية، بما في ذلك طلبات إنشاء المجموعة وطلبات إسقاط المجموعة وطلبات تحميل المجموعة وطلبات تحرير المجموعة.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.ddl.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.ddl.partitionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد طلبات DDL المتعلقة بالتقسيم في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 10 إلى أن Milvus لا يعالج أكثر من 10 طلبات متعلقة بالقسم في الثانية، بما في ذلك طلبات إنشاء القسم وطلبات إسقاط القسم وطلبات تحميل القسم وطلبات تحرير القسم.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.ddl.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.ddl.db.collectionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps لمستوى db، لا يوجد حد افتراضي، معدل لطلبات إنشاء مجموعة وإسقاط مجموعة وتحميل مجموعة وتحرير مجموعة -1
    +

    quotaAndLimits.ddl.db.partitionRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps لمستوى db، افتراضي بلا حد، المعدل ل CreatePartition, DropPartition, LoadPartition, ReleasePartition -1
    +

    quotaAndLimits.indexRate.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا تم تمكين اختناق الطلبات المتعلقة بالفهرس. خطأ
    +

    quotaAndLimits.indexRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد الطلبات المتعلقة بالفهرس في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 10 إلى أن Milvus لا يعالج أكثر من 10 طلبات متعلقة بالقسم في الثانية، بما في ذلك طلبات إنشاء الفهرس وطلبات إسقاط الفهرس.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.indexRate.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.indexRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps لمستوى db، لا يوجد حد افتراضي، معدل إنشاء الفهرس وإسقاط الفهرس -1
    +

    quotaAndLimits.flushRate.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء تم تمكين اختناق طلب التدفق أم لا. صواب
    +

    quotaAndLimits.flushRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد طلبات التدفق في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 10 إلى أن Milvus لا يعالج أكثر من 10 طلبات تدفق في الثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.flushRate.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.flushRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps، لا يوجد حد افتراضي لمعدل التدفق على مستوى التجميع. 0.1
    +

    quotaAndLimits.flushRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps من مستوى db، افتراضي بلا حد، معدل التدفق على مستوى التجميع -1
    +

    quotaAndLimits.compactionRate.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا تم تمكين اختناق طلب الضغط اليدوي أم لا. خطأ
    +

    quotaAndLimits.compactionRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد طلبات الضغط اليدوي في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 10 إلى أن Milvus لا يعالج أكثر من 10 طلبات ضغط يدوي في الثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.compaction.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.compactionRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps لمستوى db، لا يوجد حد افتراضي، معدل الضغط اليدوي -1
    +

    quotaAndLimits.dml.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء تم تمكين اختناق طلب DML أم لا. خطأ
    +

    quotaAndLimits.dml.insertRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • أعلى معدل إدخال بيانات في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 5 إلى أن Milvus يسمح فقط بإدخال البيانات بمعدل 5 ميجابايت/ثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dml.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.dml.insertRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.insertRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • أعلى معدل إدخال بيانات لكل مجموعة في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 5 إلى أن Milvus يسمح فقط بإدراج البيانات في أي مجموعة بمعدل 5 ميجابايت/ثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dml.enabled إلى true في نفس الوقت.
  • -1
    +

    quotaAndLimits.dml.insertRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.upsertRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.upsertRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.upsertRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.upsertRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.deleteRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • أعلى معدل حذف للبيانات في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 0.1 إلى أن Milvus يسمح فقط بحذف البيانات بمعدل 0.1 ميجابايت/ثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dml.enabled إلى true في نفس الوقت.
  • -1
    +

    quotaAndLimits.dml.deleteRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.deleteRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • أعلى معدل حذف للبيانات في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 0.1 إلى أن Milvus يسمح فقط بحذف البيانات من أي مجموعة بمعدل 0.1 ميجابايت/ثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dml.enabled إلى true في نفس الوقت.
  • -1
    +

    quotaAndLimits.dml.deleteRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dml.bulkLoadRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، افتراضي بلا حد، غير مدعوم بعد. الهدف: الحد من معدل التحميل المجمع -1
    +

    quotaAndLimits.dml.bulkLoadRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، افتراضي بلا حد، غير مدعوم بعد. TODO: الحد من معدل التحميل المجمع لقاعدة البيانات -1
    +

    quotaAndLimits.dml.bulkLoadRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، افتراضي بلا حد، غير مدعوم بعد. TODO: الحد من معدل التحميل المجمع للمجموعة -1
    +

    quotaAndLimits.dml.bulkLoadRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت/ثانية، افتراضي بلا حد، غير مدعوم بعد. TODO: الحد من معدل التحميل المجمع للقسم -1
    +

    quotaAndLimits.dql.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ما إذا كان يتم تمكين اختناق طلب DQL. خاطئة
    +

    quotaAndLimits.dql.searchRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد المتجهات للبحث في الثانية الواحدة.
  • +
  • يشير تعيين هذا العنصر إلى 100 إلى أن Milvus يسمح فقط بالبحث في 100 متجه في الثانية بغض النظر عما إذا كانت هذه المتجهات المائة كلها في بحث واحد أو مبعثرة عبر عمليات بحث متعددة.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dql.dql.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.dql.searchRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    vps (ناقلات في الثانية)، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dql.searchRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد المتجهات للبحث في كل مجموعة في الثانية الواحدة.
  • +
  • يشير تعيين هذا العنصر إلى 100 إلى أن Milvus يسمح فقط بالبحث في 100 متجه في الثانية لكل مجموعة بغض النظر عما إذا كانت هذه المتجهات المائة كلها في بحث واحد أو مبعثرة عبر عمليات بحث متعددة.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dql.dql.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.dql.searchRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    vps (المتجهات في الثانية)، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dql.queryRate.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد الاستعلامات في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 100 إلى أن ميلفوس يسمح فقط بـ 100 استعلام في الثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dql.dql.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.dql.queryRate.db.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.dql.queryRate.collection.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد الاستعلامات لكل مجموعة في الثانية.
  • +
  • يشير تعيين هذا العنصر إلى 100 إلى أن Milvus يسمح فقط بـ 100 استعلام لكل مجموعة في الثانية.
  • +
  • لاستخدام هذا الإعداد، قم بتعيين quotaAndLimits.dql.dql.enabled إلى صواب في نفس الوقت.
  • -1
    +

    quotaAndLimits.dql.queryRate.partition.max

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    qps، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.limitWriting.forceDeny

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • forceDeny false تعني السماح بطلبات dml (باستثناء بعض
  • +
  • شروط محددة، مثل ذاكرة العقد لعلامة الماء)، صحيح يعني رفض جميع طلبات dml دائمًا.
  • خاطئة
    +

    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • يشير maxTimeTickTickDelay إلى الضغط الخلفي لعمليات DML.
  • +
  • سيتم تخفيض معدلات DML وفقًا لنسبة تأخير التجزئة الزمنية إلى maxTimeTickTickDelay,
  • +
  • إذا كان تأخير التجزئة الزمنية أكبر من maxTimeTickTickDelay، سيتم رفض جميع طلبات DML.
  • +
  • ثانية
  • 300
    +

    quotaAndLimits.limitWriting.memProtection.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • عند استخدام الذاكرة> MemoryHighWaterLevel، سيتم رفض جميع طلبات DML;
  • +
  • عندما يكون استخدام الذاكرة <مستوى الذاكرة المنخفضة <مستوى الذاكرة المرتفع، يتم تقليل معدل dml;
  • +
  • عند استخدام الذاكرة <مستوى الذاكرة <مستوى الذاكرة المنخفضة للماء، لن يتم اتخاذ أي إجراء.
  • صحيح
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    (0، 1]، MemoryLowWaterLevel في عقد البيانات 0.85
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    (0، 1]، مستوى الماء المرتفع للذاكرة في عقد البيانات 0.95
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    (0, 1]، مستوى الماء المنخفض للذاكرة في عقد الاستعلام 0.85
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    (0، 1]، مستوى الماء المرتفع للذاكرة في عقد الاستعلام 0.95
    +

    quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • لن يتم اتخاذ أي إجراء إذا كان حجم المقاطع المتنامية أقل من العلامة المائية المنخفضة.
  • +
  • عندما يتجاوز حجم المقاطع المتنامية حجم العلامة المائية المنخفضة، سيتم تخفيض معدل dml,
  • +
  • ولكن لن يكون المعدل أقل من الحد الأدنى لنسبة المعدل * dmlRateRate.
  • خطأ
    +

    quotaAndLimits.limitWriting.diskProtection.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عندما يكون حجم الملف الإجمالي لتخزين الكائن أكبر من 'diskQuota'، سيتم رفض جميع طلبات dml; صواب
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuota

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت، (0، +inf)، لا يوجد حد افتراضي -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت، (0، +inf)، افتراضي بدون حد -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت، (0، +inf)، افتراضي بدون حد -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    ميغابايت، (0، +inf)، افتراضي بدون حد -1
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    التبديل لتمكين حصة عدد صفوف المقطع l0 خطأ
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حصة عدد صفوف المقطع l0، مستوى الماء المنخفض 32768
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حصة عدد صفوف المقطع l0، انخفاض مستوى الماء 65536
    +

    quotaAndLimits.limitReading.forceDeny

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • forceDeny false تعني أن طلبات dql مسموح بها (باستثناء بعض
  • +
  • شروط محددة، مثل إسقاط المجموعة)، صحيح يعني رفض جميع طلبات dql دائمًا.
  • خطأ
    +

    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • nqInQInQueueThueThreshold تشير إلى أن النظام كان تحت ضغط خلفي لمسار البحث/الاستعلام.
  • +
  • إذا كان NQ في قائمة انتظار أي عقدة استعلام أكبر من nqInQueThueThreshold، فإن معدلات البحث والاستعلام ستهدأ تدريجيًا
  • +
  • حتى لا يتجاوز NQ في قائمة الانتظار nqInQueThueThreshold. نفكر في NQ لطلب الاستعلام على أنه 1.
  • +
  • int، لا يوجد حد افتراضي
  • -1
    +

    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • تشير QueueLatencyThreshold إلى أن النظام كان تحت ضغط عكسي لمسار البحث/الاستعلام.
  • +
  • إذا كان زمن كمون dql من قائمة الانتظار أكبر من queueLatencyThreshold، فإن معدلات البحث والاستعلام سوف تهدأ تدريجياً
  • +
  • حتى لا يعود كمون قائمة الانتظار يتجاوز عتبة قائمة الانتظار.
  • +
  • يشير الكمون هنا إلى متوسط الكمون على مدار فترة زمنية.
  • +
  • مللي ثانية، لا يوجد حد افتراضي
  • -1
    +

    quotaAndLimits.limitReading.resultProtection.maxReadResultRate

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • يشير maxReadResultResultRate إلى أن النظام كان تحت ضغط عكسي لمسار البحث/الاستعلام.
  • +
  • إذا كان معدل نتائج dql أكبر من maxReadResultRultRate، فإن معدلات البحث والاستعلام سوف تهدأ تدريجياً
  • +
  • حتى لا يتجاوز معدل نتائج القراءة الحد الأقصى لمعدل نتائج القراءة maxReadResultRultRate.
  • +
  • ميغابايت/ثانية، لا يوجد حد افتراضي
  • -1
    +

    quotaAndLimits.limitReading.coolOffSpeed

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • colOffSpeed هي سرعة تهدئة معدلات البحث والاستعلام.
  • +
  • (0, 1]
  • 0.9
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.json new file mode 100644 index 000000000..af0a45426 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rocksmq-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ روكسمك","href":"rocksmq-related-Configurations","type":1,"isActive":false},{"label":"rocksmq.path","href":"rocksmqpath","type":2,"isActive":false},{"label":"rocksmq.lrucacheratio","href":"rocksmqlrucacheratio","type":2,"isActive":false},{"label":"rocksmq.rocksmqPageSize","href":"rocksmqrocksmqPageSize","type":2,"isActive":false},{"label":"rocksmq.retentionTimeInMinutes","href":"rocksmqretentionTimeInMinutes","type":2,"isActive":false},{"label":"rocksmq.retentionSizeInMB","href":"rocksmqretentionSizeInMB","type":2,"isActive":false},{"label":"rocksmq.compactionInterval","href":"rocksmqcompactionInterval","type":2,"isActive":false},{"label":"rocksmq.compressionTypes","href":"rocksmqcompressionTypes","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.md new file mode 100644 index 000000000..63385e219 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_rocksmq.md @@ -0,0 +1,247 @@ +--- +id: configure_rocksmq.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة rocksmq لـ Milvus. +--- +

    التكوينات المتعلقة بـ روكسمك

    إذا كنت ترغب في تمكين كافكا، تحتاج إلى التعليق على تكوينات بولسار

    +

    كافكا

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    بروتوكول الأمان:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeTimeout: 10

    +

    rocksmq.path

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • بادئة المفتاح إلى حيث يخزن ميلفوس البيانات في RocksMQ.
  • +
  • تنبيه: تغيير هذه المعلمة بعد استخدام ملفوس لفترة من الزمن سيؤثر على وصولك إلى البيانات القديمة.
  • +
  • يوصى بتغيير هذه المعلمة قبل بدء تشغيل Milvus للمرة الأولى.
  • +
  • قم بتعيين بادئة مفتاح جذر يسهل تحديدها لـ Milvus إذا كانت خدمة إلخd موجودة بالفعل.
  • /var/lib/milvus/rdb_data
    +

    rocksmq.lrucacheratio

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    نسبة ذاكرة التخزين المؤقت للصخور 0.06
    +

    rocksmq.rocksmqPageSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم الرسائل في كل صفحة في RocksMQ. يتم فحص الرسائل في RocksMQ ومسحها (عند انتهاء صلاحيتها) دفعة واحدة بناءً على هذه المعلمة. الوحدة: بايت. 67108864
    +

    rocksmq.retentionTimeInMinutes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لوقت الاحتفاظ بالرسائل التي تم التحقق منها في RocksMQ. يتم الاحتفاظ بالرسائل التي تم التحقق منها في RocksMQ للفترة الزمنية المحددة ثم يتم مسحها. الوحدة: دقيقة. 4320
    +

    rocksmq.retentionSizeInMB

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم الاحتفاظ بالرسائل التي تم التحقق منها لكل موضوع في RocksMQ. يتم مسح الرسائل التي تم التحقق منها في كل موضوع إذا تجاوز حجمها هذه المعلمة. الوحدة: ميغابايت. 8192
    +

    rocksmq.compactionInterval

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الفاصل الزمني لتشغيل ضغط rocksdb لإزالة البيانات المحذوفة. الوحدة: الثانية 86400
    +

    rocksmq.compressionTypes

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    نوع الضغط، تدعم فقط استخدام 0،7. 0 تعني عدم الضغط، 7 ستستخدم zstd. طول الأنواع يعني رقم مستوى الصخور. 0,0,7,7,7
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.json new file mode 100644 index 000000000..004a0a890 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rootCoord-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ rootCoord","href":"rootCoord-related-Configurations","type":1,"isActive":false},{"label":"rootCoord.dmlChannelNum","href":"rootCoorddmlChannelNum","type":2,"isActive":false},{"label":"rootCoord.maxPartitionNum","href":"rootCoordmaxPartitionNum","type":2,"isActive":false},{"label":"rootCoord.minSegmentSizeToEnableIndex","href":"rootCoordminSegmentSizeToEnableIndex","type":2,"isActive":false},{"label":"rootCoord.maxDatabaseNum","href":"rootCoordmaxDatabaseNum","type":2,"isActive":false},{"label":"rootCoord.maxGeneralCapacity","href":"rootCoordmaxGeneralCapacity","type":2,"isActive":false},{"label":"rootCoord.gracefulStopTimeout","href":"rootCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"rootCoord.ip","href":"rootCoordip","type":2,"isActive":false},{"label":"rootCoord.port","href":"rootCoordport","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxSendSize","href":"rootCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxRecvSize","href":"rootCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxSendSize","href":"rootCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxRecvSize","href":"rootCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.md new file mode 100644 index 000000000..0ddf1f349 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_rootcoord.md @@ -0,0 +1,375 @@ +--- +id: configure_rootcoord.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين rootCoord لـ Milvus. +--- +

    التكوينات المتعلقة بـ rootCoord

    التكوين المرتبط بـ rootCoord، المستخدم للتعامل مع طلبات لغة تعريف البيانات (DDL) ولغة التحكم في البيانات (DCL)

    +

    rootCoord.dmlChannelNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عدد قنوات DML-Channels المطلوب إنشاؤها عند بدء تشغيل جذر التنسيق. 16
    +

    rootCoord.maxPartitionNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأقصى لعدد الأقسام في كل مجموعة.
  • +
  • لا يمكن إنشاء أقسام جديدة إذا تم تعيين هذه المعلمة على 0 أو 1.
  • +
  • المدى: [0، INT64MAX]
  • 1024
    +

    rootCoord.minSegmentSizeToEnableIndex

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • الحد الأدنى لعدد صفوف المقطع المطلوب لإنشاء فهرس.
  • +
  • لن تتم فهرسة المقاطع ذات الحجم الأصغر من هذه المعلمة، وسيتم البحث عنها بالقوة الغاشمة.
  • 1024
    +

    rootCoord.maxDatabaseNum

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    العدد الأقصى لقاعدة البيانات 64
    +

    rootCoord.maxGeneralCapacity

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأعلى لمجموع حاصل ضرب حاصل ضرب رقم القسم ورقم الجزء 65536
    +

    rootCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    فرض إيقاف العقدة بدون توقف رشيق 5
    +

    rootCoord.ip

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عنوان TCP/IP للعقدة الجذرية. إذا لم يتم تحديده، استخدم أول عنوان أحادي الإرسال
    +

    rootCoord.port

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    منفذ TCP ل TCP ل rootCoord 53100
    +

    rootCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن أن يرسله rootCoord، الوحدة: بايت 536870912
    +

    rootCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن أن يتلقاه الجذر، الوحدة: بايت 268435456
    +

    rootCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب RPC الذي يمكن للعملاء على rootCoord إرساله، الوحدة: بايت 268435456
    +

    rootCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    الحد الأقصى لحجم كل طلب طلب استدعاء أمر الشراء (RPC) الذي يمكن للعملاء على rootCoord تلقيه، الوحدة: بايت 536870912
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.json new file mode 100644 index 000000000..5f621830c --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tikv-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ tikv","href":"tikv-related-Configurations","type":1,"isActive":false},{"label":"tikv.endpoints","href":"tikvendpoints","type":2,"isActive":false},{"label":"tikv.rootPath","href":"tikvrootPath","type":2,"isActive":false},{"label":"tikv.metaSubPath","href":"tikvmetaSubPath","type":2,"isActive":false},{"label":"tikv.kvSubPath","href":"tikvkvSubPath","type":2,"isActive":false},{"label":"tikv.requestTimeout","href":"tikvrequestTimeout","type":2,"isActive":false},{"label":"tikv.snapshotScanSize","href":"tikvsnapshotScanSize","type":2,"isActive":false},{"label":"tikv.ssl.enabled","href":"tikvsslenabled","type":2,"isActive":false},{"label":"tikv.ssl.tlsCert","href":"tikvssltlsCert","type":2,"isActive":false},{"label":"tikv.ssl.tlsKey","href":"tikvssltlsKey","type":2,"isActive":false},{"label":"tikv.ssl.tlsCACert","href":"tikvssltlsCACert","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.md new file mode 100644 index 000000000..7581aa102 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_tikv.md @@ -0,0 +1,314 @@ +--- +id: configure_tikv.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة tikv لميلفوس. +--- +

    التكوينات المتعلقة بـ tikv

    التكوين المرتبط بـ tikv، المستخدم لتخزين البيانات الوصفية لـ Milvus.

    +

    لاحظ أنه عندما يتم تمكين TiKV لتخزين البيانات الوصفية ، لا تزال بحاجة إلى وجود etcd لاكتشاف الخدمة.

    +

    يعد TiKV خيارًا جيدًا عندما يتطلب حجم البيانات الوصفية قابلية توسع أفقي أفضل.

    +

    tikv.endpoints

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    لاحظ أن منفذ pd الافتراضي لـ tikv هو 2379، وهو ما يتعارض مع منفذ etcd. 127.0.0.1:2389
    +

    tikv.rootPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار الجذر حيث يتم تخزين البيانات في tikv بواسطة-ديف
    +

    tikv.metaSubPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مسار الجذر التعريفي = مسار الجذر + '/' + مسار فرعي ميتا ميتا
    +

    tikv.kvSubPath

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مسار الجذر kvRootPath = مسار الجذر + '/' + مسار فرعي kvSubPath kv
    +

    tikv.requestTimeout

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مللي ثانية، مهلة طلب tikv 10000
    +

    tikv.snapshotScanSize

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    حجم دفعة فحص لقطة TIKV 256
    +

    tikv.ssl.enabled

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    سواء لدعم وضع الاتصال الآمن TiKV أم لا خطأ
    +

    tikv.ssl.tlsCert

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف الشهادة
    +

    tikv.ssl.tlsKey

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف المفتاح الخاص بك
    +

    tikv.ssl.tlsCACert

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    المسار إلى ملف CACert الخاص بك
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.json new file mode 100644 index 000000000..06a4a8d0e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tls-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بـ tls","href":"tls-related-Configurations","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.md new file mode 100644 index 000000000..d9ef13583 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_tls.md @@ -0,0 +1,22 @@ +--- +id: configure_tls.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تهيئة tls لـ Milvus. +--- +

    التكوينات المتعلقة بـ tls

    تكوين تمكين tls الوكيل tls.

    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.json b/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.json new file mode 100644 index 000000000..d5be4e0b7 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"trace-related Configurations","anchorList":[{"label":"التكوينات المتعلقة بالتتبع","href":"trace-related-Configurations","type":1,"isActive":false},{"label":"trace.exporter","href":"traceexporter","type":2,"isActive":false},{"label":"trace.sampleFraction","href":"tracesampleFraction","type":2,"isActive":false},{"label":"trace.jaeger.url","href":"tracejaegerurl","type":2,"isActive":false},{"label":"trace.otlp.endpoint","href":"traceotlpendpoint","type":2,"isActive":false},{"label":"trace.otlp.method","href":"traceotlpmethod","type":2,"isActive":false},{"label":"trace.initTimeoutSeconds","href":"traceinitTimeoutSeconds","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.md b/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.md new file mode 100644 index 000000000..19ac229ba --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/configure_trace.md @@ -0,0 +1,200 @@ +--- +id: configure_trace.md +related_key: configure +group: system_configuration.md +summary: تعرف على كيفية تكوين التتبع لـ Milvus. +--- +

    التكوينات المتعلقة بالتتبع

    trace.exporter

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • نوع مصدر التتبع، الافتراضي هو stdout,
  • +
  • قيم اختيارية: ['noop'، 'stdout'، 'stdout'، 'jaeger'، 'otlp']
  • نوب
    +

    trace.sampleFraction

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    +
  • جزء من أداة أخذ العينات المستندة إلى معرف التتبع,
  • +
  • قيم اختيارية: [0, 1]
  • +
  • الكسور >= 1 سيتم أخذ عينات دائمًا. يتم التعامل مع الكسور <0 على أنها صفر.
  • 0
    +

    trace.jaeger.url

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    عندما يكون المصدر هو jaeger يجب تعيين عنوان URL الخاص بـ jaeger
    +

    trace.otlp.endpoint

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مثال "127.0.0.0.1:4317" لـ grpc، "127.0.0.0.1:4318" لـ http
    +

    trace.otlp.method

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    طريقة تصدير otlp، القيم المقبولة: ["grpc"، "http"]، باستخدام "grpc" افتراضيًا
    +

    trace.initTimeoutSeconds

    + + + + + + + + + + + + +
    الوصفالقيمة الافتراضية
    مهلة تهيئة segcore بالثواني، مما يمنع توقف otlp grpc إلى الأبد 10
    diff --git a/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.json b/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.json new file mode 100644 index 000000000..06828cc4e --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus System Configurations Checklist","anchorList":[{"label":"قائمة مراجعة تكوينات نظام ميلفوس","href":"Milvus-System-Configurations-Checklist","type":1,"isActive":false},{"label":"الأقسام","href":"Sections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.md b/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.md new file mode 100644 index 000000000..f360999fa --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/sys_config/system_configuration.md @@ -0,0 +1,129 @@ +--- +id: system_configuration.md +related_key: configure +group: system_configuration.md +summary: تعرف على تكوين نظام ميلفوس. +--- +

    قائمة مراجعة تكوينات نظام ميلفوس

    يقدم هذا الموضوع الأقسام العامة لتكوينات النظام في ملفوس.

    +

    يحتفظ ميلفوس بعدد كبير من المعلمات التي تقوم بتكوين النظام. لكل تكوين قيمة افتراضية يمكن استخدامها مباشرة. يمكنك تعديل هذه المعلمات بمرونة حتى يتمكن ملفوس من خدمة تطبيقك بشكل أفضل. راجع تكوين Milvus لمزيد من المعلومات.

    +
    +في الإصدار الحالي، لا تدخل جميع المعلمات حيز التنفيذ إلا بعد تهيئتها عند بدء تشغيل ملفوس.
    +

    الأقسام

    لتسهيل عملية الصيانة، يصنف Milvus تكويناته إلى أقسام %s استناداً إلى مكوناته وتوابعه واستخدامه العام.

    +

    etcd

    التكوينات ذات الصلة بـ etcd، وتستخدم لتخزين البيانات الوصفية لـ Milvus واكتشاف الخدمة.

    +

    راجع التكوينات المتعلقة بـ etcd للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    metastore

    راجع التكوينات المتعلقة بـ metastore للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    tikv

    التكوين المتعلق بـ tikv، المستخدم لتخزين البيانات الوصفية لـ Milvus.

    +

    لاحظ أنه عند تمكين TiKV لـ metastore، لا تزال بحاجة إلى وجود إلخd لاكتشاف الخدمة.

    +

    يعد TiKV خيارًا جيدًا عندما يتطلب حجم البيانات الوصفية قابلية توسع أفقي أفضل.

    +

    راجع التكوينات المتعلقة بـ tikv للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    localStorage

    راجع التكوينات المتعلقة بالتخزين المحلي للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    minio

    التكوينات ذات الصلة بـ MinIO/S3/GCS أو أي خدمة أخرى تدعم واجهة برمجة تطبيقات S3، وهي المسؤولة عن ثبات البيانات لـ Milvus.

    +

    نشير إلى خدمة التخزين باسم MinIO/S3 في الوصف التالي للتبسيط.

    +

    انظر التكوينات المتعلقة بـ Minio للحصول على وصف تفصيلي لكل معلمة تحت هذا القسم.

    +

    mq

    يدعم Milvus أربعة من MQ: rocksmq (استنادًا إلى RockDB)، و natsmq (خادم nats-server المدمج)، وPulsar وKafka.

    +

    يمكنك تغيير mq الخاص بك عن طريق تعيين حقل mq.type.

    +

    إذا لم تقم بتعيين الحقل mq.type كإعداد افتراضي، فهناك ملاحظة حول تمكين الأولوية إذا قمنا بتكوين عدة mq في هذا الملف.

    +
      +
    1. الوضع المستقل (المحلي): وضع مستقل (محلي): rocksmq (افتراضي) > natsmq > بولسار > كافكا

    2. +
    3. الوضع العنقودي: بولسار(افتراضي) > كافكا (روكسمك و ناتسمك غير مدعوم في وضع المجموعة)

    4. +
    +

    انظر التكوينات المتعلقة بـ mq للحصول على وصف تفصيلي لكل معلمة تحت هذا القسم.

    +

    pulsar

    التكوينات ذات الصلة بـ pulsar، وتستخدم لإدارة سجلات ميلفوس لعمليات الطفرات الأخيرة، وسجل تدفق الإخراج، وتوفير خدمات نشر-اشتراك السجل.

    +

    انظر التكوينات المتعلقة بـ pulsar للحصول على وصف مفصل لكل معلمة تحت هذا القسم.

    +

    rocksmq

    إذا كنت ترغب في تمكين كافكا، تحتاج إلى التعليق على تكوينات النابض

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    بروتوكول الأمان:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeTimeout: 10

    +

    انظر التكوينات المتعلقة بـ rocksmq للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    natsmq

    تكوين natsmq.

    +

    مزيد من التفاصيل: https://docs.nats.io/running-a-nats-service/configuration

    +

    انظر التكوينات المتعلقة بـ natsmq للحصول على وصف تفصيلي لكل معلمة تحت هذا القسم.

    +

    rootCoord

    التكوينات ذات الصلة بـ rootCoord، المستخدمة للتعامل مع طلبات لغة تعريف البيانات (DDL) ولغة التحكم في البيانات (DCL)

    +

    راجع التكوينات المتعلقة بـ rootCoord للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    proxy

    التكوينات ذات الصلة بالوكيل، وتستخدم للتحقق من صحة طلبات العميل وتقليل النتائج التي تم إرجاعها.

    +

    راجع التكوينات المتعلقة بالوكيل للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    queryCoord

    التكوين المرتبط بـ queryCoord، المستخدم لإدارة الطوبولوجيا وموازنة التحميل لعقد الاستعلام، والتسليم من المقاطع المتنامية إلى المقاطع المغلقة.

    +

    راجع التكوينات المتعلقة بالاستعلام ذات الصلة للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    queryNode

    التكوينات ذات الصلة بـ queryNode، وتستخدم لتشغيل البحث المختلط بين البيانات المتجهة والقياسية.

    +

    راجع التكوينات المتعلقة بالاستعلامNode للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    indexCoord

    راجع التكوينات المرتبطة بالفهرس للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    indexNode

    راجع التكوينات المتعلقة بعقدة الفهرس للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    dataCoord

    راجع التكوينات المتعلقة بعقدة البيانات للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    dataNode

    راجع التكوينات المتعلقة بعقدة البيانات للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    msgChannel

    يقدم هذا الموضوع التكوينات المتعلقة بقناة الرسائل في Milvus.

    +

    راجع التكوينات المتعلقة بقناة الرسائل للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    log

    تكوين إخراج سجل النظام.

    +

    راجع التكوينات المتعلقة بالسجل للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    grpc

    راجع التكوينات المتعلقة بـ grpc للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    tls

    تكوين تمكين tls الوكيل tls.

    +

    راجع التكوينات المتعلقة بـ tls للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    common

    راجع التكوينات المتعلقة بـ common-related Configurations للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    quotaAndLimits

    QuotaConfig، تكوينات حصة ميلفوس وحدودها.

    +

    بشكل افتراضي، نقوم بتمكين:

    +
      +
    1. حماية TT;

    2. +
    3. حماية الذاكرة.

    4. +
    5. حماية الحصة النسبية للقرص.

    6. +
    +

    يمكنك تمكين:

    +
      +
    1. الحد من إنتاجية DML;

    2. +
    3. حدود DDL و DQL qps/ثانية DQL;

    4. +
    5. حماية طول/زمن انتظار DQL;

    6. +
    7. حماية معدل نتائج DQL;

    8. +
    +

    إذا لزم الأمر، يمكنك أيضًا فرض رفض طلبات RW يدويًا.

    +

    راجع التكوينات المتعلقة بالحصص والحدود للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    +

    trace

    راجع التكوينات المتعلقة بالتتبع للحصول على وصف تفصيلي لكل معلمة تحت هذا القسم.

    +

    gpu

    #عند استخدام فهرسة وحدة معالجة الرسومات، ستستخدم Milvus مخزن ذاكرة لتجنب التخصيص المتكرر للذاكرة وإلغاء التخصيص.

    +

    #هنا، يمكنك تعيين حجم الذاكرة التي يشغلها تجمع الذاكرة، على أن تكون الوحدة ميغابايت.

    +

    # لاحظ أن هناك احتمال تعطل Milvus عندما يتجاوز الطلب الفعلي على الذاكرة القيمة التي تم تعيينها بواسطة maxMemSize.

    +

    #إذا تم تعيين كل من initMemSize و MaxMemSize على صفر,

    +

    سيقوم #milvus تلقائيًا بتهيئة نصف ذاكرة وحدة معالجة الرسومات المتاحة,

    +

    سيقوم #maxMemSemSize بتهيئة كامل ذاكرة وحدة معالجة الرسومات المتوفرة.

    +

    انظر التكوينات المتعلقة بوحدة معالجة الرسومات للحصول على وصف تفصيلي لكل معلمة ضمن هذا القسم.

    diff --git a/localization/v2.5.x/site/ar/reference/time_sync.json b/localization/v2.5.x/site/ar/reference/time_sync.json new file mode 100644 index 000000000..5822f14f4 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/time_sync.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Time Synchronization","anchorList":[{"label":"مزامنة الوقت","href":"Time-Synchronization","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"أوراكل الطابع الزمني (TSO)","href":"Timestamp-oracle-TSO","type":2,"isActive":false},{"label":"نظام مزامنة الوقت (timetick)","href":"Time-synchronization-system-timetick","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/time_sync.md b/localization/v2.5.x/site/ar/reference/time_sync.md new file mode 100644 index 000000000..92eed07ab --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/time_sync.md @@ -0,0 +1,161 @@ +--- +id: time_sync.md +title: مزامنة الوقت +summary: تعرف على نظام مزامنة الوقت في ميلفوس. +--- +

    مزامنة الوقت

    يقدم هذا الموضوع آلية مزامنة الوقت في ميلفوس.

    +

    نظرة عامة

    يمكن تصنيف الأحداث في ميلفوس بشكل عام إلى نوعين:

    +
      +
    • أحداث لغة تعريف البيانات (DDL): إنشاء/إسقاط مجموعة، إنشاء/إسقاط قسم، إلخ.

    • +
    • أحداث لغة معالجة البيانات (DML): إدراج، بحث، إلخ.

    • +
    +

    يتم تمييز أي حدث، بغض النظر عن كونه حدث لغة تعريف البيانات (DDL) أو حدث لغة معالجة البيانات (DML)، بطابع زمني يمكن أن يشير إلى وقت وقوع هذا الحدث.

    +

    لنفترض أن هناك مستخدمين اثنين يقومان ببدء سلسلة من أحداث لغة معالجة البيانات (DML) و DDL في ميلفوس بالترتيب الزمني الموضح في الجدول التالي.

    + + + + + + + + + + + + + + +
    الطابع الزمنيالمستخدم 1المستخدم 2
    t0أنشأ مجموعة باسم C0./
    t2/إجراء بحث على المجموعة C0.
    t5تم إدراج البيانات A1 في المجموعة C0./
    t7/إجراء بحث في المجموعة C0.
    t10تم إدراج البيانات A2 في المجموعة C0./
    t12/إجراء بحث في المجموعة C0
    t15تم حذف البيانات A1 من المجموعة C0./
    t17/إجراء بحث في المجموعة C0
    +

    من الناحية المثالية، يجب أن يكون المستخدم 2 قادرًا على رؤية

    +
      +
    • مجموعة فارغة C0 في t2.

    • +
    • البيانات A1 في t7.

    • +
    • كل من البيانات A1 و A2 على t12.

    • +
    • البيانات فقط A2 في t17 (حيث تم حذف البيانات A1 من المجموعة قبل هذه النقطة).

    • +
    +

    يمكن تحقيق هذا السيناريو المثالي بسهولة عندما تكون هناك عقدة واحدة فقط. ومع ذلك، فإن ميلفوس عبارة عن قاعدة بيانات متجهة موزعة، ولضمان الحفاظ على جميع عمليات DML وDDL في العقد المختلفة بالترتيب، يحتاج ميلفوس إلى معالجة المشكلتين التاليتين

    +
      +
    1. تختلف الساعة الزمنية للمستخدمين الاثنين في المثال أعلاه إذا كانا على عقد مختلفة. على سبيل المثال، إذا كان المستخدم 2 متأخرًا بـ 24 ساعة عن المستخدم 1، فإن جميع العمليات التي يقوم بها المستخدم 1 لا تكون مرئية للمستخدم 2 حتى اليوم التالي.

    2. +
    3. يمكن أن يكون هناك تأخير في الشبكة. إذا أجرى المستخدم 2 بحثًا على المجموعة C0 على t17 ، يجب أن يكون ميلفوس قادرًا على ضمان معالجة جميع العمليات قبل t17 وإتمامها بنجاح. إذا تأخرت عملية الحذف على الموقع t15 بسبب زمن انتقال الشبكة، فمن المحتمل جدًا أن يظل بإمكان المستخدم 2 رؤية البيانات المفترض حذفها A1 عند إجراء بحث على t17.

    4. +
    +

    لذلك، يتبنى ميلفوس نظام مزامنة الوقت (timetick) لحل المشكلة.

    +

    أوراكل الطابع الزمني (TSO)

    لحل المشكلة الأولى المذكورة في القسم السابق، يوفر ميلفوس، مثل الأنظمة الموزعة الأخرى، خدمة أوراكل الطابع الزمني (TSO). هذا يعني أنه يجب تخصيص جميع الأحداث في Milvus بطابع زمني من TSO بدلاً من الساعة المحلية.

    +

    يتم توفير خدمة TSO من قبل المنسق الجذر في Milvus. يمكن للعملاء تخصيص طابع زمني واحد أو أكثر في طلب تخصيص طابع زمني واحد.

    +

    الطابع الزمني TSO هو نوع من القيمة uint64 التي تتكون من جزء مادي وجزء منطقي. يوضح الشكل أدناه تنسيق الطابع الزمني.

    +

    + + TSO_Timestamp + TSO_Timestamp.

    +

    كما هو موضح، فإن ال 46 بت في البداية هي الجزء المادي، أي التوقيت العالمي المنسق بالمللي ثانية. آخر 18 بت هو الجزء المنطقي.

    +

    نظام مزامنة الوقت (timetick)

    يستخدم هذا القسم مثالاً لعملية إدخال بيانات لشرح آلية مزامنة الوقت في ميلفوس.

    +

    عندما يتلقى الوكيل طلب إدراج بيانات من SDK، فإنه يقسم رسائل الإدراج إلى تدفقات رسائل مختلفة (MsgStream) وفقًا لقيمة تجزئة المفاتيح الأساسية.

    +

    يتم تعيين طابع زمني لكل رسالة إدراج (InsertMsg) قبل إرسالها إلى MsgStream.

    +
    + MsgStream هو عبارة عن غلاف لقائمة انتظار الرسائل، وهو Pulsar افتراضيًا في Milvus 2.0.
    +

    + + timesync_proxy_insert_msg + timesync_proxy_insert_msg

    +

    أحد المبادئ العامة هو أنه في MsgStream ، يجب أن تكون الطوابع الزمنية لـInsertMsgs من نفس الوكيل متزايدة. ومع ذلك، لا توجد مثل هذه القاعدة لتلك الخاصة بـ InsertMsgs من وكلاء مختلفين.

    +

    الشكل التالي هو مثال على InsertMsgs في MsgStream. يحتوي المقتطف على خمسة InsertMsgs ، ثلاثة منها من Proxy1 والباقي من Proxy2.

    +

    + + msgstream + msgstream

    +

    إن الطوابع الزمنية للثلاثة InsertMsgs من Proxy1 هي طوابع زمنية متزايدة، وكذلك الأمر بالنسبة للاثنين InsertMsgs من Proxy2. ومع ذلك، لا يوجد ترتيب معين بين Proxy1 و Proxy2 InsertMsgs .

    +

    يتمثل أحد السيناريوهات المحتملة في أنه عند قراءة رسالة ذات طابع زمني 110 من Proxy2 ، يجد ميلفوس أن الرسالة ذات الطابع الزمني 80 من Proxy1 لا تزال في MsgStream. لذلك، يقدم ميلفوس نظام مزامنة الوقت، timetick، لضمان أنه عند قراءة رسالة من MsgStream ، يجب استهلاك جميع الرسائل ذات قيم الطابع الزمني الأصغر.

    +

    + + time_synchronization + مزامنة_الوقت

    +

    كما هو موضح في الشكل أعلاه,

    +
      +
    • يقوم كل وكيل بشكل دوري (كل 200 مللي ثانية بشكل افتراضي) بالإبلاغ عن أكبر قيمة طابع زمني لأحدث InsertMsg في MsgStreamإلى التنسيق الجذر.

    • +
    • يحدد التنسيق الجذر الحد الأدنى لقيمة الطابع الزمني الأدنى على هذا Msgstream ، بغض النظر عن الوكيل الذي ينتمي إليه InsertMsgs. ثم يقوم جذر التنسيق بإدراج هذا الحد الأدنى للطابع الزمني في Msgstream. يسمى هذا الطابع الزمني أيضًا بالعلامة الزمنية.

    • +
    • عندما تقرأ المكونات المستهلكة الطابع الزمني الذي أدرجه جذر التنسيق، فإنها تفهم أن جميع رسائل الإدراج ذات قيم الطابع الزمني الأصغر قد استهلكت. لذلك، يمكن تنفيذ الطلبات ذات الصلة بأمان دون مقاطعة الترتيب.

    • +
    +

    الشكل التالي هو مثال على Msgstream مع إدراج طابع زمني.

    +

    + + timetick + timetick

    +

    MsgStream بمعالجة الرسائل على دفعات وفقًا للعلامة الزمنية للتأكد من أن الرسائل الناتجة تفي بمتطلبات الطابع الزمني. في المثال أعلاه، سوف يستهلك جميع السجلات باستثناء InsertMsgs من Proxy2 على Timestamp: 120 لأنه بعد آخر علامة زمنية.

    +

    ما التالي

    diff --git a/localization/v2.5.x/site/ar/reference/timestamp.json b/localization/v2.5.x/site/ar/reference/timestamp.json new file mode 100644 index 000000000..a2d06db40 --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/timestamp.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Timestamp","anchorList":[{"label":"الطابع الزمني","href":"Timestamp","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"معلمات الطابع الزمني","href":"Timestamp-parameters","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/reference/timestamp.md b/localization/v2.5.x/site/ar/reference/timestamp.md new file mode 100644 index 000000000..4672ab39a --- /dev/null +++ b/localization/v2.5.x/site/ar/reference/timestamp.md @@ -0,0 +1,109 @@ +--- +id: timestamp.md +title: الطابع الزمني في ميلفوس +summary: >- + تعرّف على مفهوم الطابع الزمني والمعلمات الأربعة الرئيسية المتعلقة بالطابع + الزمني في قاعدة بيانات متجه ميلفوس. +--- +

    الطابع الزمني

    يشرح هذا الموضوع مفهوم الطابع الزمني ويقدم المعلمات الأربعة الرئيسية المتعلقة بالطابع الزمني في قاعدة بيانات متجه ميلفوس.

    +

    نظرة عامة

    Milvus هي قاعدة بيانات متجهة يمكنها البحث والاستعلام عن المتجهات المحولة من بيانات غير منظمة. عند إجراء عملية بلغة معالجة البيانات (DML)، بما في ذلك إدراج البيانات وحذفها، تقوم Milvus بتعيين طوابع زمنية للكيانات المشاركة في العملية. لذلك، تحتوي جميع الكيانات في Milvus على سمة الطابع الزمني. وتشترك مجموعات الكيانات في نفس عملية DML في نفس قيمة الطابع الزمني.

    +

    معلمات الطابع الزمني

    يتم تضمين العديد من المعلمات المتعلقة بالطابع الزمني عند إجراء بحث أو استعلام تشابه متجه في Milvus.

    +
      +
    • Guarantee_timestamp

    • +
    • Service_timestamp

    • +
    • Graceful_time

    • +
    • Travel_timestamp

    • +
    +

    Guarantee_timestamp

    Guarantee_timestamp هي نوع من الطوابع الزمنية المستخدمة للتأكد من أن جميع تحديثات البيانات بواسطة عمليات DML قبل Guarantee_timestamp تكون مرئية عند إجراء بحث أو استعلام تشابه متجه. على سبيل المثال، إذا قمت بإدراج دفعة من البيانات في الساعة 3 مساءً، ودفعة أخرى في الساعة 5 مساءً، وتم تعيين قيمة Guarantee_timestamp على أنها 6 مساءً أثناء إجراء بحث تشابه المتجهات. هذا يعني أن دفعتي البيانات التي تم إدراجها في الساعة 3 مساءً و5 مساءً على التوالي يجب أن تكونا متضمنتين في البحث.

    +

    إذا لم يتم تكوين Guarantee_timestamp ، فإن ميلفوس يأخذ تلقائيًا النقطة الزمنية التي يتم فيها طلب البحث. لذلك، يتم إجراء البحث على طريقة عرض البيانات مع جميع تحديثات البيانات بواسطة عمليات DML قبل البحث.

    +

    لتوفير عناء فهم TSO داخل Milvus، لا يتعين عليك كمستخدم تكوين معلمة Guarantee_timestamp مباشرةً. تحتاج فقط إلى اختيار مستوى الاتساق، ويتعامل Milvus تلقائيًا مع المعلمة Guarantee_timestamp نيابةً عنك. يتوافق كل مستوى تناسق مع قيمة Guarantee_timestamp معينة.

    +

    + + Guarantee_Timestamp + Guarantee_Timestamp.

    +

    مثال

    كما هو موضح في الرسم التوضيحي أعلاه، يتم تعيين قيمة Guarantee_timestamp على أنها 2021-08-26T18:15:00 (للتبسيط، يتم تمثيل الطابع الزمني في هذا المثال بالوقت الفعلي). عند إجراء بحث أو استعلام، يتم البحث أو الاستعلام عن جميع البيانات قبل 2021-08-26T18:15:00.

    +

    Service_timestamp

    Service_timestamp هو نوع من الطوابع الزمنية التي يتم إنشاؤها وإدارتها تلقائيًا بواسطة عقد الاستعلام في Milvus. يتم استخدامه للإشارة إلى عمليات DML التي يتم تنفيذها بواسطة عقد الاستعلام.

    +

    يمكن تصنيف البيانات التي تديرها عقد الاستعلام إلى نوعين:

    +
      +
    • البيانات التاريخية (أو تسمى أيضًا البيانات الدفعية)

    • +
    • البيانات التزايدية (أو تسمى أيضاً البيانات المتدفقة).

    • +
    +

    في ميلفوس، تحتاج إلى تحميل البيانات قبل إجراء بحث أو استعلام. لذلك، يتم تحميل البيانات الدفعية في المجموعة بواسطة عقدة الاستعلام قبل إجراء بحث أو طلب استعلام. ومع ذلك، يتم إدراج البيانات المتدفقة في Milvus أو حذفها منه بشكل سريع، الأمر الذي يتطلب من عقدة الاستعلام الاحتفاظ بجدول زمني لعمليات DML وطلبات البحث أو الاستعلام. ونتيجةً لذلك، تستخدم عقد الاستعلام Service_timestamp للاحتفاظ بمثل هذا الجدول الزمني. Service_timestamp يمكن اعتباره النقطة الزمنية التي تكون فيها بيانات معينة مرئية حيث يمكن لعقد الاستعلام التأكد من اكتمال جميع عمليات DML قبل Service_timestamp.

    +

    عند وجود طلب بحث أو استعلام وارد، تقوم عقدة الاستعلام بمقارنة قيم Service_timestamp و Guarantee_timestamp. هناك سيناريوهان أساسيان.

    +

    + + Service_Timestamp + Service_Timestamp.

    +

    السيناريو 1: Service_timestamp >= Guarantee_timestamp

    كما هو موضح في الشكل 1، يتم تعيين قيمة Guarantee_timestamp على أنها 2021-08-26T18:15:00. عندما يتم زيادة قيمة Service_timestamp إلى 2021-08-26T18:15:01 ، فهذا يعني أن جميع عمليات DML قبل هذه النقطة الزمنية يتم تنفيذها وإكمالها بواسطة عقدة الاستعلام، بما في ذلك عمليات DML قبل الوقت المشار إليه Guarantee_timestamp. ونتيجة لذلك، يمكن تنفيذ طلب البحث أو الاستعلام على الفور.

    +

    السيناريو 2: Service_timestamp < Guarantee_timestamp

    كما هو موضح في الشكل 2، يتم تعيين قيمة Guarantee_timestamp على أنها 2021-08-26T18:15:00 ، والقيمة الحالية لـ Service_timestamp هي فقط 2021-08-26T18:14:55. هذا يعني أن عمليات DML فقط قبل 2021-08-26T18:14:55 يتم تنفيذها وإكمالها، تاركًا جزءًا من عمليات DML بعد هذه النقطة الزمنية ولكن قبل Guarantee_timestamp غير مكتملة. إذا تم تنفيذ البحث أو الاستعلام عند هذه النقطة، فإن بعض البيانات المطلوبة تكون غير مرئية وغير متوفرة بعد، مما يؤثر بشكل خطير على دقة نتائج البحث أو الاستعلام. لذلك، تحتاج عقدة الاستعلام إلى تأجيل طلب البحث أو الاستعلام حتى تكتمل عمليات DML قبل guarantee_timestamp (أي عندما Service_timestamp >= Guarantee_timestamp).

    +

    Graceful_time

    من الناحية الفنية، Graceful_time ليس طابعًا زمنيًا، بل هو فترة زمنية (على سبيل المثال 100 مللي ثانية). ومع ذلك، فإن Graceful_time جدير بالذكر لأنه يرتبط ارتباطًا وثيقًا بـ Guarantee_timestamp و Service_timestamp. Graceful_time هو معلمة قابلة للتكوين في ملف تكوين ميلفوس. يتم استخدامه للإشارة إلى الفترة الزمنية التي يمكن تحملها قبل أن تصبح بيانات معينة مرئية. باختصار، يمكن التسامح مع عمليات DML غير المكتملة أثناء Graceful_time.

    +

    عندما يكون هناك طلب بحث أو استعلام وارد، يمكن أن يكون هناك سيناريوهان.

    +

    + + Graceful_Time + وقت_المهلة.

    +

    السيناريو 1: Service_timestamp + Graceful_time >= Guarantee_timestamp

    كما هو موضح في الشكل 1، يتم تعيين قيمة Guarantee_timestamp على أنها 2021-08-26T18:15:01 ، و Graceful_time على أنها 2s. يتم زيادة قيمة Service_timestamp إلى 2021-08-26T18:15:00. على الرغم من أن قيمة Service_timestamp لا تزال أصغر من قيمة Guarantee_timestamp ولا تكتمل جميع عمليات DML قبل 2021-08-26T18:15:01 ، يتم التسامح مع فترة ثانيتين من عدم رؤية البيانات كما هو موضح في قيمة Graceful_time. لذلك، يمكن تنفيذ طلب البحث أو الاستعلام الوارد على الفور.

    +

    السيناريو 2: Service_timestamp + Graceful_time < Guarantee_timestamp

    كما هو موضح في الشكل 2، يتم تعيين قيمة Guarantee_timestamp على أنها 2021-08-26T18:15:01 ، و Graceful_time على أنها 2s. القيمة الحالية لـ Service_timestamp هي 2021-08-26T18:14:54 فقط، وهذا يعني أن عمليات DML المتوقعة لم تكتمل بعد وحتى مع إعطاء ثانيتين من الوقت المريح، لا يزال إخفاء البيانات غير محتمل. لذلك، تحتاج عقدة الاستعلام إلى تأجيل البحث أو طلب الاستعلام حتى تكتمل طلبات DML معينة (أي عندما Service_timestamp + Graceful_time >= Guarantee_timestamp).

    +

    ما التالي

    diff --git a/localization/v2.5.x/site/ar/release_notes.json b/localization/v2.5.x/site/ar/release_notes.json new file mode 100644 index 000000000..fe14e5030 --- /dev/null +++ b/localization/v2.5.x/site/ar/release_notes.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Release Notes","anchorList":[{"label":"ملاحظات الإصدار","href":"Release-Notes","type":1,"isActive":false},{"label":"v2.5.3","href":"v253","type":2,"isActive":false},{"label":"v2.5.2","href":"v252","type":2,"isActive":false},{"label":"v2.5.1","href":"v251","type":2,"isActive":false},{"label":"v2.5.0","href":"v250","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/release_notes.md b/localization/v2.5.x/site/ar/release_notes.md new file mode 100644 index 000000000..d63913482 --- /dev/null +++ b/localization/v2.5.x/site/ar/release_notes.md @@ -0,0 +1,210 @@ +--- +id: release_notes.md +summary: ملاحظات الإصدار ميلفوس +title: ملاحظات الإصدار +--- +

    ملاحظات الإصدار

    اكتشف الجديد في Milvus! تلخص هذه الصفحة الميزات الجديدة والتحسينات والمشاكل المعروفة وإصلاحات الأخطاء في كل إصدار. يمكنك العثور على ملاحظات الإصدار لكل إصدار تم إصداره بعد الإصدار 2.5.0 في هذا القسم. نقترح عليك زيارة هذه الصفحة بانتظام للتعرف على التحديثات.

    +

    v2.5.3

    تاريخ الإصدار: 13 يناير 2025

    + + + + + + + +
    إصدار ميلفوسإصدار Python SDKإصدار Node.js SDKإصدار Java SDK
    2.5.32.5.32.5.32.5.4
    +

    يقدم الإصدار 2.5.3 من Milvus 2.5.3 إصلاحات مهمة للأخطاء وتحسينات في الأداء لتحسين الاستقرار والموثوقية وسهولة الاستخدام بشكل عام. يعمل هذا الإصدار على تحسين معالجة التزامن، وتعزيز فهرسة البيانات واسترجاعها، وتحديث العديد من المكونات الرئيسية للحصول على تجربة مستخدم أكثر قوة.

    +

    إصلاحات الأخطاء

      +
    • تم إصلاح مشكلة حيث يمكن أن يؤدي استخدام عامل تصفية IN على مفتاح أساسي VARCHAR إلى إرجاع نتائج فارغة.(#39108)
    • +
    • إصلاح مشكلة التزامن بين عمليات الاستعلام والحذف التي قد تؤدي إلى نتائج غير صحيحة.(#39054)
    • +
    • تم إصلاح الفشل الناجم عن التصفية التكرارية عندما يكون expr فارغاً في طلب استعلام.(#39034)
    • +
    • تم إصلاح مشكلة حيث أدى خطأ في القرص أثناء تحديثات التكوين إلى استخدام إعدادات التكوين الافتراضية.(#39072)
    • +
    • تم إصلاح الفقدان المحتمل للبيانات المحذوفة بسبب ضغط التجميع.(#39133)
    • +
    • إصلاح استعلام مطابقة النص المقطوع في قطاعات البيانات المتزايدة.(#39113)
    • +
    • إصلاح حالات فشل الاسترجاع الناجمة عن عدم احتواء الفهرس على البيانات الأصلية للمتجهات المتفرقة.(#39146)
    • +
    • إصلاح حالة سباق حقول الأعمدة المحتملة الناجمة عن الاستعلام المتزامن وتحميل البيانات.(#39152)
    • +
    • تم إصلاح حالات فشل الإدراج المجمّع عندما لا يتم تضمين الحقول القابلة للإلغاء أو الافتراضية_القيمة في البيانات.(#39111)
    • +
    +

    تحسينات

      +
    • إضافة واجهة برمجة تطبيقات مجموعة الموارد لواجهة RESTful.(#39092)
    • +
    • تحسين أداء الاسترداد من خلال الاستفادة من أساليب مجموعة البتات SIMD.(#39041)
    • +
    • استخدام الطابع الزمني ل MVCC كطابع زمني للضمان عند تحديده.(#39019)
    • +
    • تمت إضافة مقاييس الحذف المفقودة.(#38747)
    • +
    • تم تحديث Etcd إلى الإصدار 3.5.16.(#38969)
    • +
    • تم إنشاء حزمة Go جديدة لإدارة البروتو.(#39128).
    • +
    +

    v2.5.2

    تاريخ الإصدار: 3 يناير 2025

    + + + + + + + +
    إصدار ميلفوسإصدار Python SDKإصدار Node.js SDKإصدار Java SDK
    2.5.22.5.32.5.32.5.3
    +

    يدعم الإصدار Milvus 2.5.2 تعديل الحد الأقصى لطول أعمدة VARCHAR ويحل العديد من المشكلات الحرجة المتعلقة بالتزامن، وانخفاضات الأقسام، ومعالجة إحصائيات BM25 أثناء الاستيراد. نوصي بشدة بالترقية إلى هذا الإصدار لتحسين الاستقرار والأداء.

    +

    التحسينات

      +
    • إنشاء سجلات استخدام القرص فقط في حالة عدم وجود المسار المحدد.(#38822)
    • +
    • تمت إضافة معلمة لضبط الحد الأقصى لطول VARCHAR واستعادة الحد الأقصى إلى 65,535.(#38883)
    • +
    • دعم تحويل نوع المعلمة للتعبيرات.(#38782)
    • +
    +

    إصلاحات الأخطاء

      +
    • إصلاح حالات الجمود المحتملة في سيناريوهات التزامن.(#38863)
    • +
    • تم إنشاء ملف index_null_offset للحقول التي تدعم القيم الفارغة فقط.(#38834)
    • +
    • تم إصلاح استخدام خطة الاسترداد بعد التحرير في مرحلة الاختزال.(#38841)
    • +
    • تم التعرف على التعبيرات ذات الأحرف الكبيرة AND و OR.(#38928)
    • +
    • السماح بإسقاط الأقسام بنجاح حتى في حالة فشل التحميل.(#38874)
    • +
    • تم إصلاح مشاكل تسجيل ملف إحصائيات BM25 أثناء الاستيراد.(#38881)
    • +
    +

    v2.5.1

    تاريخ الإصدار: 26 ديسمبر 2024

    + + + + + + + +
    إصدار ميلفوسإصدار Python SDKإصدار Node.js SDKإصدار Java SDK
    2.5.12.5.22.5.22.5.2
    +

    يركز الإصدار Milvus 2.5.1 على سلسلة من إصلاحات الأخطاء التي تعالج تحميل الذاكرة، وقوائم RBAC، وموازنة عقدة الاستعلام، وفهرسة المقاطع المختومة، مع تحسين واجهة مستخدم الويب والمعترضات. نوصي بشدة بالترقية إلى الإصدار 2.5.1 لتحسين الاستقرار والموثوقية.

    +

    التحسينات

      +
    • تحديث مجموعة واجهة مستخدم الويب وصفحات الاستعلام.(#38701)
    • +
    +

    إصلاحات الأخطاء

      +
    • إصلاح مشكلات OOM بإضافة عامل ذاكرة إلى تقديرات التحميل.(#38722)
    • +
    • إصلاح توسيع مجموعة الامتيازات عند إدراج النُهج في RootCoord.(#38760)
    • +
    • إصلاح المشاكل المتعلقة بإدراج مجموعات الامتيازات والمجموعات.(#38738)
    • +
    • إصلاح الموازن لتجنب التحميل الزائد المتكرر على نفس عقدة الاستعلام.(#38724)
    • +
    • إصلاح مهام التوازن غير المتوقعة التي تم تشغيلها بعد إعادة تشغيل QueryCoord.(#38725)
    • +
    • إصلاح تحديثات تكوين التحميل التي لا تنطبق على تحميل المجموعات.(#38737)
    • +
    • إصلاح عدد القراءات الصفرية أثناء استيراد البيانات.(#38695)
    • +
    • إصلاح فك ترميز Unicode لمفاتيح JSON في التعبيرات.(#38653)
    • +
    • تم إصلاح اسم قاعدة البيانات المعترضة لـ alterCollectionField في 2.5. (#38663)
    • +
    • تم إصلاح معلمات الفهرس الفارغة للقطاعات المختومة عند استخدام البحث بالقوة الغاشمة BM25.(#38752)
    • +
    +

    v2.5.0

    تاريخ الإصدار: 23 ديسمبر 2024

    + + + + + + + +
    إصدار ميلفوسإصدار Python SDKإصدار Node.js SDKإصدار Java SDK
    2.5.02.5.12.5.22.5.2
    +

    يجلب الإصدار 2.5.0 من Milvus 2.5.0 تطورات كبيرة لتعزيز قابلية الاستخدام وقابلية التوسع والأداء للمستخدمين الذين يتعاملون مع البحث المتجه وإدارة البيانات على نطاق واسع. من خلال هذا الإصدار، يدمج Milvus ميزات جديدة قوية مثل البحث القائم على المصطلحات، وضغط التجميع للاستعلامات المحسّنة، والدعم متعدد الاستخدامات لطرق البحث المتجه المتفرقة والكثيفة. تقدم التحسينات في إدارة المجموعات والفهرسة ومعالجة البيانات مستويات جديدة من المرونة وسهولة الاستخدام، مما يجعل من Milvus قاعدة بيانات متجهات أكثر قوة وسهولة في الاستخدام.

    +

    الميزات الرئيسية

    يدعم الإصدار Milvus 2.5 البحث في النص الكامل المنفذ باستخدام Sparse-BM25! تعد هذه الميزة مكملًا مهمًا لقدرات البحث الدلالي القوية في ميلفوس خاصةً في السيناريوهات التي تتضمن كلمات نادرة أو مصطلحات تقنية. في الإصدارات السابقة، دعمت Milvus المتجهات المتفرقة للمساعدة في سيناريوهات البحث بالكلمات الرئيسية. تم إنشاء هذه المتجهات المتفرقة خارج Milvus بواسطة نماذج عصبية مثل SPLADEv2/BGE-M3 أو نماذج إحصائية مثل خوارزمية BM25.

    +

    يحتوي Milvus 2.5، المدعوم من Tantivy، على محلل مدمج واستخراج متجهات متناثرة، مما يوسع واجهة برمجة التطبيقات من تلقي المتجهات فقط كمدخلات إلى قبول النص مباشرةً. يتم تحديث المعلومات الإحصائية BM25 في الوقت الحقيقي عند إدخال البيانات، مما يعزز قابلية الاستخدام والدقة. بالإضافة إلى ذلك، توفر المتجهات المتفرقة المستندة إلى خوارزميات أقرب جار تقريبي (ANN) أداءً أقوى من أنظمة البحث القياسية للكلمات الرئيسية.

    +

    للحصول على التفاصيل، راجع نظرة عامة على المحلل والبحث في النص الكامل.

    +

    واجهة ويب لإدارة المجموعات (بيتا)

    لدعم البيانات الضخمة والميزات الغنية بشكل أفضل، يتضمن تصميم Milvus المتطور العديد من التبعيات والعديد من أدوار العقد، وهياكل البيانات المعقدة، وغير ذلك. يمكن أن تشكل هذه الجوانب تحديات للاستخدام والصيانة.

    +

    يقدّم الإصدار 2.5 من ميلفوس 2.5 واجهة ويب مدمجة لإدارة المجموعات (Cluster Management WebUI)، مما يقلل من صعوبة صيانة النظام من خلال عرض معلومات بيئة وقت تشغيل ميلفوس المعقدة. ويتضمن ذلك تفاصيل قواعد البيانات والمجموعات والمقاطع والقنوات والتبعيات وحالة صحة العقدة ومعلومات المهام والاستعلامات البطيئة والمزيد.

    +

    لمزيد من التفاصيل، راجع Milvus WebUI.

    +

    مطابقة النص

    تستفيد Milvus 2.5 من أدوات التحليل والفهرسة من Tantivy للمعالجة المسبقة للنص وبناء الفهرس، مما يدعم مطابقة اللغة الطبيعية الدقيقة للبيانات النصية استنادًا إلى مصطلحات محددة. تُستخدم هذه الميزة في المقام الأول للبحث المصفى لاستيفاء شروط محددة ويمكنها دمج التصفية القياسية لتحسين نتائج الاستعلام، مما يسمح بالبحث عن التشابه داخل المتجهات التي تستوفي المعايير القياسية.

    +

    للحصول على التفاصيل، راجع نظرة عامة على المحلل ومطابقة النص.

    +

    فهرس الصور النقطية

    تمت إضافة فهرس بيانات قياسي جديد إلى عائلة ميلفوس. ويستخدم فهرس الخريطة النقطية مصفوفة من البتات، مساوية في الطول لعدد الصفوف، لتمثيل وجود القيم وتسريع عمليات البحث.

    +

    عادةً ما تكون فهارس الخريطة النقطية فعالة للحقول منخفضة البطاقات، والتي تحتوي على عدد متواضع من القيم المميزة - على سبيل المثال، عمود يحتوي على معلومات عن الجنس مع قيمتين محتملتين فقط: ذكر وأنثى.

    +

    لمزيد من التفاصيل، راجع فهرس الصور النقطية.

    +

    القيمة اللاغية والافتراضية

    يدعم Milvus الآن تعيين الخصائص القابلة للإلغاء والقيم الافتراضية للحقول القياسية بخلاف حقل المفتاح الأساسي. بالنسبة للحقول القياسية التي تم وضع علامة nullable=True ، يمكن للمستخدمين حذف الحقل عند إدراج البيانات؛ وسيتعامل النظام مع الحقل كقيمة لاغية أو قيمة افتراضية (إذا تم تعيينها) دون طرح خطأ.

    +

    توفر القيم الافتراضية والخصائص القابلة للإلغاء مرونة أكبر لـ Milvus. يمكن للمستخدمين الاستفادة من هذه الميزة للحقول ذات القيم غير المؤكدة عند إنشاء المجموعات. كما أنها تبسط أيضًا ترحيل البيانات من أنظمة قواعد البيانات الأخرى إلى ميلفوس، مما يسمح بالتعامل مع مجموعات البيانات التي تحتوي على قيم فارغة مع الحفاظ على إعدادات القيمة الافتراضية الأصلية.

    +

    للحصول على التفاصيل، راجع القيمة الفارغة والقيم الافتراضية.

    +

    HNSW SQ/PQ/PRQ/PRQ المستندة إلى فايس

    من خلال التعاون الوثيق مع مجتمع Faiss، شهدت خوارزمية HNSW في Faiss تحسينات كبيرة في كل من الوظائف والأداء. ولاعتبارات تتعلق بالاستقرار وقابلية الصيانة، قام ميلفوس 2.5 بترحيل دعمه لخوارزمية HNSW رسميًا من hnswlib إلى Faiss.

    +

    استنادًا إلى Faiss، يدعم Milvus 2.5 طرق تكميم متعددة على HNSW لتلبية احتياجات السيناريوهات المختلفة: SQ (الكميات العددية)، و PQ (الكمي المنتج)، و PRQ (الكمي المنتج المتبقي). يعد SQ و PQ أكثر شيوعًا؛ حيث يوفر SQ أداءً جيدًا للاستعلام وسرعة بناء، بينما يوفر PQ استرجاعًا أفضل بنفس نسبة الضغط. تستخدم العديد من قواعد البيانات المتجهة عادةً التكميم الثنائي، وهو شكل بسيط من أشكال التكميم الكمي SQ.

    +

    PRQ هو اندماج بين PQ و AQ (الكمي المضاف). بالمقارنة مع PQ، فإنه يتطلب أوقات بناء أطول لتقديم استرجاع أفضل، خاصةً عند معدلات الضغط العالية، قائلاً الضغط الثنائي.

    +

    ضغط التجميع (بيتا)

    يقدم الإصدار Milvus 2.5 ضغط التجميع لتسريع عمليات البحث وتقليل التكاليف في المجموعات الكبيرة. من خلال تحديد حقل قياسي كمفتاح تجميع، يتم إعادة توزيع البيانات حسب النطاق لتحسين التخزين والاسترجاع. تعمل هذه الميزة مثل الفهرس العام، وتتيح هذه الميزة لـ Milvus إمكانية تقليم البيانات بكفاءة أثناء الاستعلامات استنادًا إلى البيانات الوصفية للتجميع، مما يعزز أداء البحث عند تطبيق عوامل التصفية القياسية.

    +

    لمزيد من التفاصيل، راجع ضغط التجميع.

    +

    ميزات أخرى

    عقدة التدفق (بيتا)

    يقدم الإصدار Milvus 2.5 مكونًا جديدًا يسمى عقدة التدفق، والذي يوفر خدمات تسجيل الكتابة الأمامية (WAL). وهذا يمكّن ميلفوس من تحقيق الإجماع قبل وبعد قنوات القراءة والكتابة، مما يتيح ميزات ووظائف وتحسينات جديدة. هذه الميزة معطلة افتراضيًا في الإصدار 2.5 من Milvus 2.5 وستكون متاحة رسميًا في الإصدار 3.0.

    +

    دعم IPv6

    يدعم Milvus الآن IPv6، مما يسمح بتوسيع نطاق الاتصال بالشبكة والتوافق.

    +

    استيراد CSV بالجملة

    بالإضافة إلى تنسيقات JSON و Parquet، يدعم Milvus الآن الاستيراد المباشر للبيانات بتنسيق CSV.

    +

    قوالب التعبيرات لتسريع الاستعلامات

    يدعم Milvus الآن قوالب التعبيرات، مما يحسن من كفاءة تحليل التعبيرات، خاصةً في السيناريوهات ذات التعبيرات المعقدة.

    +

    للحصول على التفاصيل، راجع تصفية القوالب.

    +

    تحسينات GroupBy

      +
    • حجم المجموعة القابل للتخصيص: إضافة دعم لتحديد عدد الإدخالات التي يتم إرجاعها لكل مجموعة.
    • +
    • بحث هجين بنظرية التجميع المختلط: يدعم البحث الهجين في GroupBy استنادًا إلى أعمدة متجهات متعددة.
    • +
    +

    تحسينات المُكرر

      +
    • دعم MVCC: يمكن للمستخدمين الآن استخدام المكررات دون التأثر بالتغييرات اللاحقة للبيانات مثل عمليات الإدراج والحذف، وذلك بفضل التحكم في التزامن متعدد الإصدارات (MVCC).
    • +
    • المؤشر الدائم: يدعم Milvus الآن مؤشراً مستمراً ل QueryIterator، مما يتيح للمستخدمين استئناف التكرار من الموضع الأخير بعد إعادة تشغيل Milvus دون الحاجة إلى إعادة تشغيل عملية التكرار بأكملها.
    • +
    +

    التحسينات

    تحسين الحذف

    تحسين السرعة وتقليل استخدام الذاكرة لعمليات الحذف واسعة النطاق من خلال تحسين استخدام القفل وإدارة الذاكرة.

    +

    ترقية التبعيات

    تمت الترقية إلى ETCD 3.5.16 وPulsar 3.0.7 LTS، وإصلاح نقاط الضعف الحالية وتعزيز الأمان. ملاحظة: الترقية إلى Pulsar 3.x غير متوافقة مع الإصدارات السابقة 2.x.

    +

    بالنسبة للمستخدمين الذين لديهم بالفعل نشر Milvus يعمل بالفعل، تحتاج إلى ترقية مكونات ETCD وPulsar قبل أن تتمكن من استخدام الميزات والوظائف الجديدة. للحصول على التفاصيل، راجع ترقية بولسار من 2.x إلى 3.x

    +

    التخزين المحلي V2

    تم تقديم تنسيق ملف محلي جديد في Milvus 2.5، مما أدى إلى تحسين كفاءة التحميل والاستعلام للبيانات القياسية، وتقليل الحمل الزائد للذاكرة، ووضع الأساس للتحسينات المستقبلية.

    +

    تحسين تحليل التعبيرات

    تحسين تحليل التعبيرات من خلال تنفيذ التخزين المؤقت للتعبيرات المتكررة، وترقية ANTLR، وتحسين أداء NOT IN البنود.

    +

    تحسين أداء التزامن في DDL

    تحسين أداء التزامن لعمليات لغة تعريف البيانات (DDL).

    +

    مواءمة ميزات RESTful API

    مواءمة وظائف واجهة برمجة تطبيقات RESTful API مع حزم SDK الأخرى لتحقيق الاتساق.

    +

    تحديثات الأمان والتهيئة

    دعم TLS لتأمين الاتصال بين العقد في البيئات الأكثر تعقيدًا أو بيئات المؤسسات. لمزيد من التفاصيل، راجع تكوين الأمان.

    +

    تحسينات أداء الضغط

    تمت إزالة القيود القصوى للمقاطع في الضغط المختلط، والآن تعطي الأولوية للمقاطع الأصغر أولاً، مما يحسن الكفاءة ويسرّع الاستعلامات على مجموعات البيانات الكبيرة أو المجزأة.

    +

    موازنة القنوات المستندة إلى النقاط

    تقديم نهج يوازن الأحمال ديناميكيًا عبر القنوات، مما يعزز استخدام الموارد والاستقرار العام في عمليات النشر واسعة النطاق.

    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-bge.json b/localization/v2.5.x/site/ar/rerankers/rerankers-bge.json new file mode 100644 index 000000000..2b0b4680b --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-bge.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import BGERerankFunction\n\n# Define the rerank function\nbge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = bge_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.991162\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: 0.032697\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: 0.006515\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"BGE","anchorList":[{"label":"BGE","href":"BGE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-bge.md b/localization/v2.5.x/site/ar/rerankers/rerankers-bge.md new file mode 100644 index 000000000..955c46928 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-bge.md @@ -0,0 +1,78 @@ +--- +id: rerankers-bge.md +order: 2 +summary: >- + يدعم Milvus نماذج أداة إعادة تصنيف BGE من خلال فئة "BGERerankFunction". تسمح + لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام والمستندات بشكل فعال. +title: BGE +--- +

    BGE

    يدعم Milvus نماذج إعادة ترتيب BGE من خلال فئة BGERerankFunction. تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال.

    +

    لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    ثم، قم بإنشاء BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +# Define the rerank function
    +bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    المعلمات

    +
      +
    • model_name (سلسلة)

      +

      اسم النموذج المراد استخدامه. يمكنك تحديد أي من أسماء نماذج إعادة ترتيب BGE المتاحة، على سبيل المثال، BAAI/bge-reranker-base ، BAAI/bge-reranker-large ، إلخ. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام BAAI/bge-reranker-v2-m3. للاطلاع على قائمة النماذج المتاحة، راجع قائمة النماذج.

    • +
    • device (سلسلة)

      +

      اختياري. الجهاز المراد استخدامه لتشغيل النموذج. إذا لم يتم تحديده، سيتم تشغيل النموذج على وحدة المعالجة المركزية. يمكنك تحديد cpu لوحدة المعالجة المركزية و cuda:n لجهاز وحدة معالجة الرسومات التاسع.

    • +
    +

    بعد ذلك، استخدم الكود التالي لإعادة ترتيب المستندات بناءً على الاستعلام:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = bge_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    Index: 1
    +Score: 0.991162
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: 0.032697
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: 0.006515
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.json b/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.json new file mode 100644 index 000000000..7103b5d3e --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CohereRerankFunction\n\n# Define the rerank function\ncohere_rf = CohereRerankFunction(\n model_name=\"rerank-english-v3.0\", # Specify the model name. Defaults to `rerank-english-v2.0`.\n api_key=COHERE_API_KEY # Replace with your Cohere API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = cohere_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.99691266\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.8578872\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.3589146\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Cohere","anchorList":[{"label":"كوهير","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.md b/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.md new file mode 100644 index 000000000..17ec0347c --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-cohere.md @@ -0,0 +1,78 @@ +--- +id: rerankers-cohere.md +order: 3 +summary: >- + تدعم Milvus نماذج إعادة ترتيب Cohere من خلال فئة "CohereRerRerankFunction". + تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال. +title: إعادة التصنيفات تتماسك +--- +

    كوهير

    يدعم ميلفوس نماذج إعادة ترتيب Cohere من خلال فئة CohereRerankFunction. تسمح لك هذه الخاصية بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال.

    +

    لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    ثم، قم بإنشاء CohereRerankFunction:

    +
    from pymilvus.model.reranker import CohereRerankFunction
    +
    +# Define the rerank function
    +cohere_rf = CohereRerankFunction(
    +    model_name="rerank-english-v3.0",  # Specify the model name. Defaults to `rerank-english-v2.0`.
    +    api_key=COHERE_API_KEY # Replace with your Cohere API key
    +)
    +
    +

    المعلمات

    +
      +
    • model_name (سلسلة)

      +

      اسم النموذج المراد استخدامه. يمكنك تحديد أي من أسماء نماذج كوهير المتاحة لإعادة ترتيب النماذج، على سبيل المثال، rerank-english-v3.0 ، rerank-multilingual-v3.0 ، إلخ. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام rerank-english-v2.0. للحصول على قائمة النماذج المتاحة، راجع Rerank.

    • +
    • api_key (سلسلة)

      +

      مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات Cohere. للحصول على معلومات حول كيفية إنشاء مفتاح واجهة برمجة التطبيقات، راجع لوحة معلومات Cohere.

    • +
    +

    بعد ذلك، استخدم الكود التالي لإعادة تصنيف المستندات بناءً على الاستعلام:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = cohere_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    Index: 1
    +Score: 0.99691266
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.8578872
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.3589146
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.json b/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.json new file mode 100644 index 000000000..21f0251c7 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CrossEncoderRerankFunction\n\n# Define the rerank function\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = ce_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 6.250533\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: -2.954602\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: -4.771512\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Cross Encoder","anchorList":[{"label":"التشفير المتقاطع","href":"Cross-Encoder","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.md b/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.md new file mode 100644 index 000000000..286aeaa27 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-cross-encoder.md @@ -0,0 +1,79 @@ +--- +id: rerankers-cross-encoder.md +order: 4 +summary: >- + يدعم Milvus نماذج إعادة التشفير المتقاطع من خلال فئة + "CrossEncoderRerRerankFunction". تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج + الاستعلام-المستندات بشكل فعال. +title: التشفير المتقاطع +--- +

    التشفير المتقاطع

    تدعم Milvus أدوات التشفير المتقاطع من خلال فئة CrossEncoderRerankFunction. تسمح لك هذه الخاصية بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال.

    +

    لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    ثم، قم بإنشاء CrossEncoderRerankFunction:

    +
    from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +# Define the rerank function
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    المعلمات:

    +
      +
    • model_name (سلسلة)

      +

      اسم النموذج المراد استخدامه. يمكنك تحديد أي اسم من أسماء النماذج المتاحة عبر برنامج التشفير المتقاطع، على سبيل المثال، cross-encoder/ms-marco-TinyBERT-L-2-v2 ، cross-encoder/ms-marco-MiniLM-L-2-v2 ، إلخ. إذا تركت هذه المعلمة غير محددة، سيتم استخدام سلسلة فارغة. للاطلاع على قائمة النماذج المتاحة، راجع المشفرات التبادلية المُدربة مسبقًا.

    • +
    • device (سلسلة)

      +

      الجهاز المراد استخدامه لتشغيل النموذج. يمكنك تحديد cpu لوحدة المعالجة المركزية و cuda:n لجهاز وحدة معالجة الرسومات التاسع.

    • +
    +

    بعد ذلك، استخدم الكود التالي لإعادة ترتيب المستندات بناءً على الاستعلام:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = ce_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    Index: 1
    +Score: 6.250533
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: -2.954602
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: -4.771512
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-jina.json b/localization/v2.5.x/site/ar/rerankers/rerankers-jina.json new file mode 100644 index 000000000..c3a939c64 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_rf = JinaRerankFunction(\n model_name=\"jina-reranker-v2-base-multilingual\", # Defaults to `jina-reranker-v2-base-multilingual`\n api_key=JINAAI_API_KEY\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = jina_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.937096\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.354210\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.349866\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Jina AI","anchorList":[{"label":"جينا للذكاء الاصطناعي","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-jina.md b/localization/v2.5.x/site/ar/rerankers/rerankers-jina.md new file mode 100644 index 000000000..dca1b4aee --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-jina.md @@ -0,0 +1,77 @@ +--- +id: rerankers-jina.md +order: 6 +summary: >- + يدعم ميلفوس نموذج إعادة تصنيف جينا من خلال فئة "JinaRerankFunction". تسمح لك + هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال. +title: جينا للذكاء الاصطناعي - معيدو التصنيف +--- +

    جينا للذكاء الاصطناعي

    يدعم Milvus نماذج إعادة ترتيب Jina AI من خلال فئة JinaRerankFunction. تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال.

    +

    لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    ثم، قم بإنشاء JinaRerankFunction:

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_rf = JinaRerankFunction(
    +    model_name="jina-reranker-v2-base-multilingual", # Defaults to `jina-reranker-v2-base-multilingual`
    +    api_key=JINAAI_API_KEY
    +)
    +
    +

    المعلمات:

    +
      +
    • model_name (سلسلة)

      +

      اسم نموذج إعادة ترتيب الذكاء الاصطناعي Jina AI reranker المراد استخدامه للترميز. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام jina-reranker-v2-base-multilingual. للاطلاع على قائمة النماذج المتاحة، راجع Jina AI Rerankers.

    • +
    • api_key (سلسلة)

      +

      مفتاح واجهة برمجة التطبيقات للوصول إلى واجهة برمجة تطبيقات جينا للذكاء الاصطناعي.

    • +
    +

    بعد ذلك، استخدم الكود التالي لإعادة تصنيف المستندات بناءً على الاستعلام:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = jina_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    Index: 1
    +Score: 0.937096
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.354210
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.349866
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-overview.json b/localization/v2.5.x/site/ar/rerankers/rerankers-overview.json new file mode 100644 index 000000000..5efc72f68 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-overview.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus[model]\n# or pip install \"pymilvus[model]\" for zsh.\n","from pymilvus.model.reranker import BGERerankFunction\n","bge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nbge_rf(query, documents)\n","[RerankResult(text=\"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\", score=0.9911615761470803, index=1),\n RerankResult(text=\"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\", score=0.0326971950177779, index=0),\n RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),\n RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]\n","entities = [\n {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\"}, \n {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\"}, \n {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, \n {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}\n]\n","from pymilvus import MilvusClient, DataType\n\nclient = MilvusClient(\n uri=\"http://10.102.6.214:19530\" # replace with your own Milvus server address\n)\n\nclient.drop_collection('test_collection')\n\n# define schema\n\nschema = client.create_schema(auto_id=False, enabel_dynamic_field=True)\n\nschema.add_field(field_name=\"doc_id\", datatype=DataType.INT64, is_primary=True, description=\"document id\")\nschema.add_field(field_name=\"doc_vector\", datatype=DataType.FLOAT_VECTOR, dim=384, description=\"document vector\")\nschema.add_field(field_name=\"doc_text\", datatype=DataType.VARCHAR, max_length=65535, description=\"document text\")\n\n# define index params\n\nindex_params = client.prepare_index_params()\n\nindex_params.add_index(field_name=\"doc_vector\", index_type=\"IVF_FLAT\", metric_type=\"IP\", params={\"nlist\": 128})\n\n# create collection\n\nclient.create_collection(collection_name=\"test_collection\", schema=schema, index_params=index_params)\n\n# insert data into collection\n\nclient.insert(collection_name=\"test_collection\", data=entities)\n\n# Output:\n# {'insert_count': 4, 'ids': [0, 1, 2, 3]}\n","# search results based on our query\n\nres = client.search(\n collection_name=\"test_collection\",\n data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector\n limit=3,\n output_fields=[\"doc_id\", \"doc_text\"]\n)\n\nfor i in res[0]:\n print(f'distance: {i[\"distance\"]}')\n print(f'doc_text: {i[\"entity\"][\"doc_text\"]}')\n","distance: 0.7235960960388184\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\ndistance: 0.6269873976707458\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\ndistance: 0.5340118408203125\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n","# use reranker to rerank search results\n\nfrom pymilvus.model.reranker import CrossEncoderRerankFunction\n\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n\nreranked_results = ce_rf(\n query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',\n documents=[\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n ],\n top_k=3\n)\n\n# print the reranked results\nfor result in reranked_results:\n print(f'score: {result.score}')\n print(f'doc_text: {result.text}')\n","score: 6.250532627105713\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\nscore: -2.9546022415161133\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\nscore: -4.771512031555176\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Rerankers Overview","anchorList":[{"label":"نظرة عامة على أدوات إعادة الترتيب","href":"Rerankers-Overview","type":1,"isActive":false},{"label":"مثال 1: استخدم دالة إعادة تصنيف BGE لإعادة تصنيف المستندات وفقًا لاستعلام","href":"Example-1-Use-BGE-rerank-function-to-rerank-documents-according-to-a-query","type":2,"isActive":false},{"label":"مثال 2: استخدم أداة إعادة الترتيب لتحسين ملاءمة نتائج البحث","href":"Example-2-Use-a-reranker-to-enhance-relevance-of-search-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-overview.md b/localization/v2.5.x/site/ar/rerankers/rerankers-overview.md new file mode 100644 index 000000000..f66f001b2 --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-overview.md @@ -0,0 +1,210 @@ +--- +id: rerankers-overview.md +order: 1 +summary: >- + تدمج مكتبة PyMilvus النموذجية وظائف إعادة الترتيب لتحسين ترتيب النتائج التي + يتم إرجاعها من عمليات البحث الأولية. +title: نظرة عامة على أدوات إعادة الترتيب +--- +

    نظرة عامة على أدوات إعادة الترتيب

    في مجال استرجاع المعلومات والذكاء الاصطناعي التوليدي، تُعد أداة إعادة التصنيف أداة أساسية تعمل على تحسين ترتيب النتائج من عمليات البحث الأولية. تختلف أدوات إعادة التصنيف عن نماذج التضمين التقليدية من خلال أخذ استعلام ومستند كمدخلات وإرجاع درجة تشابه مباشرةً بدلاً من التضمينات. تشير هذه الدرجة إلى الصلة بين الاستعلام المدخل والمستند.

    +

    وغالبًا ما يتم استخدام أدوات إعادة التصنيف بعد المرحلة الأولى من الاسترجاع، وعادةً ما يتم ذلك من خلال تقنيات الجار القريب المتجه (ANN). في حين أن عمليات البحث باستخدام ANN فعّالة في جلب مجموعة واسعة من النتائج المحتملة ذات الصلة، إلا أنها قد لا تعطي دائمًا الأولوية للنتائج من حيث القرب الدلالي الفعلي من الاستعلام. وهنا، تُستخدم أدوات إعادة الترتيب لتحسين ترتيب النتائج باستخدام تحليلات سياقية أعمق، وغالبًا ما تستفيد من نماذج التعلم الآلي المتقدمة مثل BERT أو النماذج الأخرى القائمة على المحولات. من خلال القيام بذلك، يمكن لـ rerankers تحسين دقة وملاءمة النتائج النهائية المقدمة للمستخدم بشكل كبير.

    +

    تدمج مكتبة نماذج PyMilvus وظائف إعادة الترتيب لتحسين ترتيب النتائج التي يتم إرجاعها من عمليات البحث الأولية. بعد استرداد أقرب التضمينات من Milvus، يمكنك الاستفادة من أدوات إعادة الترتيب هذه لتحسين نتائج البحث لتحسين دقة نتائج البحث.

    + + + + + + + + + + + +
    وظيفة إعادة الترتيبواجهة برمجة التطبيقات أو المصادر المفتوحة
    BGEمفتوحة المصدر
    أداة التشفير المتقاطعمفتوح المصدر
    رحلةواجهة برمجة التطبيقات
    كوهيرواجهة برمجة التطبيقات
    جينا للذكاء الاصطناعيAPI
    +
    +
      +
    • قبل استخدام برامج إعادة الترتيب مفتوحة المصدر، تأكد من تنزيل وتثبيت جميع التبعيات والنماذج المطلوبة.

    • +
    • بالنسبة لأدوات إعادة الترتيب المستندة إلى واجهة برمجة التطبيقات، احصل على مفتاح واجهة برمجة التطبيقات من الموفر وقم بتعيينه في متغيرات البيئة أو الوسيطات المناسبة.

    • +
    +
    +

    مثال 1: استخدم دالة إعادة تصنيف BGE لإعادة تصنيف المستندات وفقًا لاستعلام

    في هذا المثال، نوضح في هذا المثال كيفية إعادة ترتيب نتائج البحث باستخدام أداة إعادة ترتيب BGE استنادًا إلى استعلام محدد.

    +

    لاستخدام أداة إعادة الترتيب مع مكتبة نموذج PyMilvus، ابدأ بتثبيت مكتبة نموذج PyMilvus مع الحزمة الفرعية للنموذج التي تحتوي على جميع أدوات إعادة الترتيب الضرورية:

    +
    pip install pymilvus[model]
    +# or pip install "pymilvus[model]" for zsh.
    +
    +

    لاستخدام أداة إعادة الترتيب BGE، قم أولاً باستيراد فئة BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +

    ثم، قم بإنشاء مثيل BGERerankFunction لإعادة الترتيب:

    +
    bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    لإعادة تصنيف المستندات بناءً على استعلام، استخدم الكود التالي:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +bge_rf(query, documents)
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9911615761470803, index=1),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.0326971950177779, index=0),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]
    +
    +

    مثال 2: استخدم أداة إعادة الترتيب لتحسين ملاءمة نتائج البحث

    في هذا الدليل، سنستكشف كيفية استخدام طريقة search() في PyMilvus لإجراء عمليات البحث عن التشابه، وكيفية تحسين ملاءمة نتائج البحث باستخدام أداة إعادة الترتيب. سيستخدم عرضنا التوضيحي مجموعة البيانات التالية:

    +
    entities = [
    +    {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence."}, 
    +    {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals."}, 
    +    {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, 
    +    {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}
    +]
    +
    +

    مكونات مجموعة البيانات:

    +
      +
    • doc_id: معرّف فريد لكل مستند.
    • +
    • doc_vector: التضمينات المتجهة التي تمثل المستند. للحصول على إرشادات حول إنشاء التضمينات، راجع التضمينات.
    • +
    • doc_text: المحتوى النصي للمستند.
    • +
    +

    التحضيرات

    قبل بدء البحث عن التشابه، تحتاج إلى إنشاء اتصال مع ميلفوس وإنشاء مجموعة وإعداد البيانات وإدراجها في تلك المجموعة. يوضح مقتطف الكود التالي هذه الخطوات التمهيدية.

    +
    from pymilvus import MilvusClient, DataType
    +
    +client = MilvusClient(
    +    uri="http://10.102.6.214:19530" # replace with your own Milvus server address
    +)
    +
    +client.drop_collection('test_collection')
    +
    +# define schema
    +
    +schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
    +
    +schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
    +schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
    +schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
    +
    +# define index params
    +
    +index_params = client.prepare_index_params()
    +
    +index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
    +
    +# create collection
    +
    +client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
    +
    +# insert data into collection
    +
    +client.insert(collection_name="test_collection", data=entities)
    +
    +# Output:
    +# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
    +
    +

    بعد إدراج البيانات، قم بإجراء عمليات البحث عن التشابه باستخدام الطريقة search.

    +
    # search results based on our query
    +
    +res = client.search(
    +    collection_name="test_collection",
    +    data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
    +    limit=3,
    +    output_fields=["doc_id", "doc_text"]
    +)
    +
    +for i in res[0]:
    +    print(f'distance: {i["distance"]}')
    +    print(f'doc_text: {i["entity"]["doc_text"]}')
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    distance: 0.7235960960388184
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +distance: 0.6269873976707458
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +distance: 0.5340118408203125
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +

    استخدم أداة إعادة الترتيب لتحسين نتائج البحث

    بعد ذلك، قم بتحسين ملاءمة نتائج البحث من خلال خطوة إعادة الترتيب. في هذا المثال، نستخدم في هذا المثال CrossEncoderRerankFunction المدمج في PyMilvus لإعادة ترتيب النتائج لتحسين الدقة.

    +
    # use reranker to rerank search results
    +
    +from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +reranked_results = ce_rf(
    +    query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',
    +    documents=[
    +        "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +        "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +        "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +        "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +    ],
    +    top_k=3
    +)
    +
    +# print the reranked results
    +for result in reranked_results:
    +    print(f'score: {result.score}')
    +    print(f'doc_text: {result.text}')
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    score: 6.250532627105713
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +score: -2.9546022415161133
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +score: -4.771512031555176
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.json b/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.json new file mode 100644 index 000000000..5cf42f10a --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import VoyageRerankFunction\n\n# Define the rerank function\nvoyage_rf = VoyageRerankFunction(\n model_name=\"rerank-lite-1\", # Specify the model name. Defaults to `rerank-lite-1`.\n api_key=VOYAGE_API_KEY # Replace with your Voyage API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = voyage_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.898438\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.718750\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.679688\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Voyage","anchorList":[{"label":"فوياج","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.md b/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.md new file mode 100644 index 000000000..82748763c --- /dev/null +++ b/localization/v2.5.x/site/ar/rerankers/rerankers-voyage.md @@ -0,0 +1,78 @@ +--- +id: rerankers-voyage.md +order: 5 +summary: >- + يدعم Milvus نموذج Voyage reranker Voyage من خلال فئة "VoyageRerankFunction". + تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال. +title: رحلة إعادة التصنيف +--- +

    فوياج

    يدعم Milvus نموذج Voyage reranker Voyage من خلال فئة VoyageRerankFunction. تسمح لك هذه الوظيفة بتسجيل مدى ملاءمة أزواج الاستعلام-المستندات بشكل فعال.

    +

    لاستخدام هذه الميزة، قم بتثبيت التبعيات اللازمة:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    ثم، قم بإنشاء VoyageRerankFunction:

    +
    from pymilvus.model.reranker import VoyageRerankFunction
    +
    +# Define the rerank function
    +voyage_rf = VoyageRerankFunction(
    +    model_name="rerank-lite-1",  # Specify the model name. Defaults to `rerank-lite-1`.
    +    api_key=VOYAGE_API_KEY # Replace with your Voyage API key
    +)
    +
    +

    المعلمات:

    +
      +
    • model_name (سلسلة)

      +

      اسم نموذج Voyage المراد استخدامه للترميز. إذا تركت هذه المعلمة غير محددة، فسيتم استخدام rerank-lite-1. للاطلاع على قائمة النماذج المتاحة، ارجع إلى إعادة التصنيف.

    • +
    • api_key (سلسلة)

      +

      مفتاح API للوصول إلى واجهة برمجة التطبيقات Voyage API. للحصول على معلومات حول كيفية إنشاء مفتاح واجهة برمجة التطبيقات، راجع مفتاح واجهة برمجة التطبيقات وعميل بايثون.

    • +
    +

    بعد ذلك، استخدم الكود التالي لإعادة تصنيف المستندات بناءً على الاستعلام:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = voyage_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    الناتج المتوقع مشابه لما يلي:

    +
    Index: 1
    +Score: 0.898438
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.718750
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.679688
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.json b/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.json new file mode 100644 index 000000000..7e962f63f --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Audio Similarity Search","anchorList":[{"label":"بحث تشابه الصوت","href":"Audio-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.md b/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.md new file mode 100644 index 000000000..bfce26bd1 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/audio_similarity_search.md @@ -0,0 +1,36 @@ +--- +id: audio_similarity_search.md +summary: أنشئ نظام بحث عن التشابه الصوتي باستخدام Milvus. +title: بحث تشابه الصوت +--- +

    بحث تشابه الصوت

    يوضح هذا البرنامج التعليمي كيفية استخدام قاعدة البيانات المتجهة مفتوحة المصدر Milvus لبناء نظام بحث عن تشابه الصوت.

    +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    +
      +
    • PANNs (الشبكات العصبية الصوتية المدربة مسبقًا على نطاق واسع)
    • +
    • MySQL
    • +
    • تاهي
    • +
    +


    +

    يتيح البحث عن الكلام والموسيقى والمؤثرات الصوتية وأنواع أخرى من البحث الصوتي إمكانية الاستعلام بسرعة عن كميات هائلة من البيانات الصوتية وإظهار الأصوات المتشابهة. تشمل تطبيقات أنظمة البحث عن التشابه الصوتي تحديد المؤثرات الصوتية المتشابهة، وتقليل انتهاك الملكية الفكرية وغيرها. يمكن استخدام استرجاع الصوت للبحث عن الوسائط عبر الإنترنت ومراقبتها في الوقت الفعلي للقضاء على انتهاك حقوق الملكية الفكرية. كما أنه يضطلع بدور مهم في التصنيف والتحليل الإحصائي للبيانات الصوتية.

    +


    +

    في هذا البرنامج التعليمي، سوف تتعلم كيفية بناء نظام بحث عن تشابه الصوت يمكنه إرجاع مقاطع صوتية متشابهة. يتم تحويل المقاطع الصوتية التي تم تحميلها إلى متجهات باستخدام PANNs. يتم تخزين هذه المتجهات في Milvus الذي يقوم تلقائيًا بإنشاء معرف فريد لكل متجه. بعد ذلك يمكن للمستخدمين إجراء بحث عن تشابه المتجهات في Milvus والاستعلام عن مسار بيانات المقطع الصوتي المطابق لمعرف المتجه الفريد الذي يُرجعه Milvus.

    +


    +

    + + Audio_search + بحث_صوتي Audio_search_demoبحث_صوتي بحث_صوتي_عرضي

    diff --git a/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.json b/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.json new file mode 100644 index 000000000..a35673cb1 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-3.5-turbo\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus","anchorList":[{"label":"بناء RAG مع ميلفوس","href":"Build-RAG-with-Milvus","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"بناء RAG","href":"Build-RAG","type":2,"isActive":false},{"label":"النشر السريع","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.md b/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.md new file mode 100644 index 000000000..429e667cd --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/build-rag-with-milvus.md @@ -0,0 +1,250 @@ +--- +id: build-rag-with-milvus.md +summary: بناء خرقة بناء مع ميلفوس +title: بناء RAG مع ميلفوس +--- +

    بناء RAG مع ميلفوس

    Open In Colab +GitHub Repository

    +

    +

    في هذا البرنامج التعليمي، سنوضح لك في هذا البرنامج التعليمي كيفية بناء خط أنابيب RAG (استرجاع-توليد معزز) باستخدام Milvus.

    +

    يجمع نظام RAG بين نظام الاسترجاع والنموذج التوليدي لتوليد نص جديد بناءً على مطالبة معينة. يقوم النظام أولاً باسترجاع المستندات ذات الصلة من مجموعة مستندات باستخدام Milvus، ثم يستخدم نموذجًا توليديًا لإنشاء نص جديد بناءً على المستندات المسترجعة.

    +

    الإعداد

    التبعيات والبيئة

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، فقد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، واختر "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +
    +

    سنستخدم OpenAI كـ LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    إعداد البيانات

    نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

    +

    قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    إعداد نموذج التضمين

    نقوم بتهيئة عميل OpenAI لإعداد نموذج التضمين.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    نحدد دالة لإنشاء تضمينات نصية باستخدام عميل OpenAI. نستخدم نموذج التضمين النصي 3-نموذج التضمين الصغير كمثال.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    توليد تضمين اختباري وطباعة أبعاده وعناصره القليلة الأولى.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.00988506618887186, -0.005540902726352215, 0.0068014683201909065, -0.03810417652130127, -0.018254263326525688, -0.041231658309698105, -0.007651153020560741, 0.03220026567578316, 0.01892443746328354, 0.00010708322952268645]
    +
    +

    تحميل البيانات في ميلفوس

    إنشاء المجموعة

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    بالنسبة لحجة MilvusClient:

    +
      +
    • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +

    تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    قم بإنشاء مجموعة جديدة بمعلمات محددة.

    +

    إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    إدراج البيانات

    قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

    +

    هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:27<00:00,  2.67it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    بناء RAG

    استرجاع البيانات لاستعلام

    لنحدد سؤالًا متكررًا عن ميلفوس.

    +
    question = "How is data stored in milvus?"
    +
    +

    ابحث عن السؤال في المجموعة واسترجع أفضل 3 مطابقات دلالية.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    دعونا نلقي نظرة على نتائج البحث عن الاستعلام

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7883545756340027
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6757288575172424
    +    ],
    +    [
    +        "How much does Milvus cost?\n\nMilvus is a 100% free open-source project.\n\nPlease adhere to [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) when using Milvus for production or distribution purposes.\n\nZilliz, the company behind Milvus, also offers a fully managed cloud version of the platform for those that don't want to build and maintain their own distributed instance. [Zilliz Cloud](https://zilliz.com/cloud) automatically maintains data reliability and allows users to pay only for what they use.\n\n###",
    +        0.6421123147010803
    +    ]
    +]
    +
    +

    استخدم LLM للحصول على استجابة RAG

    تحويل المستندات المسترجعة إلى تنسيق سلسلة.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    تحديد مطالبات النظام والمستخدم لنموذج لاناج. يتم تجميع هذه المطالبة مع المستندات المسترجعة من ميلفوس.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    استخدم OpenAI ChatGPT لإنشاء استجابة بناءً على المطالبات.

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-3.5-turbo",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Milvus stores data in persistent storage as incremental logs, including inserted data (vector data, scalar data, and collection-specific schema) and metadata. Inserted data is stored in various object storage backends like MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage. Metadata generated within Milvus is stored in etcd.
    +
    +

    النشر السريع

    لمعرفة كيفية بدء عرض توضيحي عبر الإنترنت باستخدام هذا البرنامج التعليمي، يرجى الرجوع إلى مثال التطبيق.

    diff --git a/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.json new file mode 100644 index 000000000..402ada8e3 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install tqdm\n$ pip install anthropic\n","$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","from pymilvus.model.dense import VoyageEmbeddingFunction\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus.model.reranker import CohereRerankFunction\n\nfrom typing import List, Dict, Any\nfrom typing import Callable\nfrom pymilvus import (\n MilvusClient,\n DataType,\n AnnSearchRequest,\n RRFRanker,\n)\nfrom tqdm import tqdm\nimport json\nimport anthropic\n\n\nclass MilvusContextualRetriever:\n def __init__(\n self,\n uri=\"milvus.db\",\n collection_name=\"contexual_bgem3\",\n dense_embedding_function=None,\n use_sparse=False,\n sparse_embedding_function=None,\n use_contextualize_embedding=False,\n anthropic_client=None,\n use_reranker=False,\n rerank_function=None,\n ):\n self.collection_name = collection_name\n\n # For Milvus-lite, uri is a local path like \"./milvus.db\"\n # For Milvus standalone service, uri is like \"http://localhost:19530\"\n # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.\n self.client = MilvusClient(uri)\n\n self.embedding_function = dense_embedding_function\n\n self.use_sparse = use_sparse\n self.sparse_embedding_function = None\n\n self.use_contextualize_embedding = use_contextualize_embedding\n self.anthropic_client = anthropic_client\n\n self.use_reranker = use_reranker\n self.rerank_function = rerank_function\n\n if use_sparse is True and sparse_embedding_function:\n self.sparse_embedding_function = sparse_embedding_function\n elif sparse_embedding_function is False:\n raise ValueError(\n \"Sparse embedding function cannot be None if use_sparse is False\"\n )\n else:\n pass\n\n def build_collection(self):\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"dense_vector\",\n datatype=DataType.FLOAT_VECTOR,\n dim=self.embedding_function.dim,\n )\n if self.use_sparse is True:\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n if self.use_sparse is True:\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"IP\",\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n enable_dynamic_field=True,\n )\n\n def insert_data(self, chunk, metadata):\n dense_vec = self.embedding_function([chunk])[0]\n if self.use_sparse is True:\n sparse_result = self.sparse_embedding_function.encode_documents([chunk])\n if type(sparse_result) == dict:\n sparse_vec = sparse_result[\"sparse\"][[0]]\n else:\n sparse_vec = sparse_result[[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def insert_contextualized_data(self, doc, chunk, metadata):\n contextualized_text, usage = self.situate_context(doc, chunk)\n metadata[\"context\"] = contextualized_text\n text_to_embed = f\"{chunk}\\n\\n{contextualized_text}\"\n dense_vec = self.embedding_function([text_to_embed])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_documents(\n [text_to_embed]\n )[\"sparse\"][[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def situate_context(self, doc: str, chunk: str):\n DOCUMENT_CONTEXT_PROMPT = \"\"\"\n \n {doc_content}\n \n \"\"\"\n\n CHUNK_CONTEXT_PROMPT = \"\"\"\n Here is the chunk we want to situate within the whole document\n \n {chunk_content}\n \n\n Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.\n Answer only with the succinct context and nothing else.\n \"\"\"\n\n response = self.anthropic_client.beta.prompt_caching.messages.create(\n model=\"claude-3-haiku-20240307\",\n max_tokens=1000,\n temperature=0.0,\n messages=[\n {\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),\n \"cache_control\": {\n \"type\": \"ephemeral\"\n }, # we will make use of prompt caching for the full documents\n },\n {\n \"type\": \"text\",\n \"text\": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),\n },\n ],\n },\n ],\n extra_headers={\"anthropic-beta\": \"prompt-caching-2024-07-31\"},\n )\n return response.content[0].text, response.usage\n\n def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:\n dense_vec = self.embedding_function([query])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_queries([query])[\n \"sparse\"\n ][[0]]\n\n req_list = []\n if self.use_reranker:\n k = k * 10\n if self.use_sparse is True:\n req_list = []\n dense_search_param = {\n \"data\": [dense_vec],\n \"anns_field\": \"dense_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n dense_req = AnnSearchRequest(**dense_search_param)\n req_list.append(dense_req)\n\n sparse_search_param = {\n \"data\": [sparse_vec],\n \"anns_field\": \"sparse_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n sparse_req = AnnSearchRequest(**sparse_search_param)\n\n req_list.append(sparse_req)\n\n docs = self.client.hybrid_search(\n self.collection_name,\n req_list,\n RRFRanker(),\n k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n else:\n docs = self.client.search(\n self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n if self.use_reranker and self.use_contextualize_embedding:\n reranked_texts = []\n reranked_docs = []\n for i in range(k):\n if self.use_contextualize_embedding:\n reranked_texts.append(\n f\"{docs[0][i]['entity']['content']}\\n\\n{docs[0][i]['entity']['context']}\"\n )\n else:\n reranked_texts.append(f\"{docs[0][i]['entity']['content']}\")\n results = self.rerank_function(query, reranked_texts)\n for result in results:\n reranked_docs.append(docs[0][result.index])\n docs[0] = reranked_docs\n return docs\n\n\ndef evaluate_retrieval(\n queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20\n) -> Dict[str, float]:\n total_score = 0\n total_queries = len(queries)\n for query_item in tqdm(queries, desc=\"Evaluating retrieval\"):\n query = query_item[\"query\"]\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n # Find all golden chunk contents\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (\n doc\n for doc in query_item[\"golden_documents\"]\n if doc[\"uuid\"] == doc_uuid\n ),\n None,\n )\n if not golden_doc:\n print(f\"Warning: Golden document not found for UUID {doc_uuid}\")\n continue\n\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if not golden_chunk:\n print(\n f\"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}\"\n )\n continue\n\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n if not golden_contents:\n print(f\"Warning: No golden contents found for query: {query}\")\n continue\n\n retrieved_docs = retrieval_function(query, db, k=k)\n\n # Count how many golden chunks are in the top k retrieved documents\n chunks_found = 0\n for golden_content in golden_contents:\n for doc in retrieved_docs[0][:k]:\n retrieved_content = doc[\"entity\"][\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n total_score += query_score\n\n average_score = total_score / total_queries\n pass_at_n = average_score * 100\n return {\n \"pass_at_n\": pass_at_n,\n \"average_score\": average_score,\n \"total_queries\": total_queries,\n }\n\n\ndef retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:\n return db.search(query, k=k)\n\n\ndef load_jsonl(file_path: str) -> List[Dict[str, Any]]:\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndef evaluate_db(db, original_jsonl_path: str, k):\n # Load the original JSONL data for queries and ground truth\n original_data = load_jsonl(original_jsonl_path)\n\n # Evaluate retrieval\n results = evaluate_retrieval(original_data, retrieve_base, db, k)\n print(f\"Pass@{k}: {results['pass_at_n']:.2f}%\")\n print(f\"Total Score: {results['average_score']}\")\n print(f\"Total queries: {results['total_queries']}\")\n","dense_ef = VoyageEmbeddingFunction(api_key=\"your-voyage-api-key\", model_name=\"voyage-2\")\nsparse_ef = BGEM3EmbeddingFunction()\ncohere_rf = CohereRerankFunction(api_key=\"your-cohere-api-key\")\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n","standard_retriever = MilvusContextualRetriever(\n uri=\"standard.db\", collection_name=\"standard\", dense_embedding_function=dense_ef\n)\n\nstandard_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(standard_retriever, \"evaluation_set.jsonl\", 5)\n","hybrid_retriever = MilvusContextualRetriever(\n uri=\"hybrid.db\",\n collection_name=\"hybrid\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n)\n\nhybrid_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n hybrid_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(hybrid_retriever, \"evaluation_set.jsonl\", 5)\n","anthropic_client = anthropic.Anthropic(\n api_key=\"your-anthropic-api-key\",\n)\n","contextual_retriever = MilvusContextualRetriever(\n uri=\"contextual.db\",\n collection_name=\"contextual\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n use_contextualize_embedding=True,\n anthropic_client=anthropic_client,\n)\n\ncontextual_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n contextual_retriever.insert_contextualized_data(\n doc_content, chunk_content, metadata\n )\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n","contextual_retriever.use_reranker = True\ncontextual_retriever.rerank_function = cohere_rf\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n"],"headingContent":"Contextual Retrieval with Milvus","anchorList":[{"label":"الاسترجاع السياقي مع ميلفوس","href":"Contextual-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تنزيل البيانات","href":"Download-Data","type":2,"isActive":false},{"label":"تعريف المسترد","href":"Define-Retriever","type":2,"isActive":false},{"label":"التجربة الأولى: الاسترجاع القياسي","href":"Experiment-I-Standard-Retrieval","type":2,"isActive":false},{"label":"التجربة الثانية: الاسترجاع الهجين","href":"Experiment-II-Hybrid-Retrieval","type":2,"isActive":false},{"label":"التجربة الثالثة: الاسترجاع السياقي","href":"Experiment-III-Contextual-Retrieval","type":2,"isActive":false},{"label":"التجربة الرابعة: الاسترجاع السياقي باستخدام أداة إعادة التصنيف","href":"Experiment-IV-Contextual-Retrieval-with-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.md new file mode 100644 index 000000000..07406cbc2 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/contextual_retrieval_with_milvus.md @@ -0,0 +1,619 @@ +--- +id: contextual_retrieval_with_milvus.md +summary: >- + الاسترجاع السياقي هو طريقة استرجاع متطورة اقترحها أنثروبيك لمعالجة مشكلة العزل + الدلالي للقطع، والتي تنشأ في حلول الاسترجاع المعززة الحالية (RAG). في نموذج + RAG العملي الحالي، يتم تقسيم المستندات في نموذج RAG العملي الحالي إلى عدة + أجزاء، ويتم استخدام قاعدة بيانات متجهة للبحث عن الاستعلام، واسترجاع الأجزاء + الأكثر صلة. ثم يستجيب LLM للاستعلام باستخدام هذه الأجزاء المسترجعة. ومع ذلك، + يمكن أن تؤدي عملية التقطيع هذه إلى فقدان المعلومات السياقية، مما يجعل من الصعب + على المسترجع تحديد مدى الصلة. +title: الاسترجاع السياقي مع ميلفوس +--- +

    الاسترجاع السياقي مع ميلفوس

    Open In Colab +GitHub Repository

    +

    + + image + الاسترجاع السياقي للصور هو أسلوب استرجاع متقدم اقترحته أنثروبيك لمعالجة مشكلة العزل الدلالي للقطع، والتي تنشأ في حلول الاسترجاع المعزز الحالية (RAG). في نموذج RAG العملي الحالي، يتم تقسيم المستندات في نموذج RAG العملي الحالي إلى عدة أجزاء، ويتم استخدام قاعدة بيانات متجهة للبحث عن الاستعلام، واسترجاع الأجزاء الأكثر صلة. ثم يستجيب LLM للاستعلام باستخدام هذه الأجزاء المسترجعة. ومع ذلك، يمكن أن تؤدي عملية التقطيع هذه إلى فقدان المعلومات السياقية، مما يجعل من الصعب على المسترجع تحديد مدى الصلة.

    +

    يعمل الاسترجاع السياقي على تحسين أنظمة الاسترجاع التقليدية من خلال إضافة السياق ذي الصلة إلى كل جزء من أجزاء المستند قبل التضمين أو الفهرسة، مما يعزز الدقة ويقلل من أخطاء الاسترجاع. وبالاقتران مع تقنيات مثل الاسترجاع الهجين وإعادة الترتيب الهجين، فإنه يعزز أنظمة الاسترجاع المعزز (RAG)، خاصةً بالنسبة لقواعد المعرفة الكبيرة. بالإضافة إلى ذلك، فإنه يوفر حلاً فعالاً من حيث التكلفة عند إقرانه بالتخزين المؤقت السريع، مما يقلل بشكل كبير من زمن الاستجابة والتكاليف التشغيلية، حيث تبلغ تكلفة القطع السياقية حوالي 1.02 دولار لكل مليون رمز مستند. وهذا يجعله نهجاً قابلاً للتطوير وفعالاً للتعامل مع قواعد المعرفة الكبيرة. يُظهر حل أنثروبيك جانبين ثاقبين:

    +
      +
    • Document Enhancement: إعادة كتابة الاستعلام هي تقنية حاسمة في استرجاع المعلومات الحديثة، وغالبًا ما تستخدم المعلومات المساعدة لجعل الاستعلام أكثر إفادة. وبالمثل، ولتحقيق أداء أفضل في استرجاع المعلومات من خلال الفهرسة RAG، فإن المعالجة المسبقة للمستندات باستخدام الفهرسة (على سبيل المثال، تنظيف مصدر البيانات، واستكمال المعلومات المفقودة، والتلخيص، وما إلى ذلك) قبل الفهرسة يمكن أن يحسن بشكل كبير من فرص استرجاع المستندات ذات الصلة. وبعبارة أخرى، تساعد خطوة المعالجة المسبقة هذه في تقريب المستندات من الاستعلامات من حيث الصلة بالموضوع.
    • +
    • Low-Cost Processing by Caching Long Context: أحد الشواغل الشائعة عند استخدام الآلات ذات المسؤولية المحدودة لمعالجة المستندات هو التكلفة. تعتبر ذاكرة التخزين المؤقت KVC حلاً شائعًا يسمح بإعادة استخدام النتائج الوسيطة لنفس السياق السابق. في حين أن معظم بائعي LLM المستضافين يجعلون هذه الميزة شفافة للمستخدم، فإن أنثروبيك يمنح المستخدمين التحكم في عملية التخزين المؤقت. عند حدوث ضرب في ذاكرة التخزين المؤقت، يمكن حفظ معظم العمليات الحسابية (وهذا أمر شائع عندما يبقى السياق الطويل كما هو، ولكن التعليمات لكل استعلام تتغير). لمزيد من التفاصيل، انقر هنا.
    • +
    +

    سنوضح في هذا الدفتر كيفية إجراء الاسترجاع السياقي باستخدام Milvus مع LLM، والجمع بين الاسترجاع الهجين الكثيف والمتناثر وإعادة الترتيب لإنشاء نظام استرجاع أكثر قوة بشكل تدريجي. تعتمد البيانات والإعداد التجريبي على الاسترجاع السياقي.

    +

    الإعداد

    تثبيت التبعيات

    $ pip install "pymilvus[model]"
    +$ pip install tqdm
    +$ pip install anthropic
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +
    +

    ستحتاج إلى مفاتيح API من Cohere و Voyage و Anthropic لتشغيل الكود.

    +

    تنزيل البيانات

    سيقوم الأمر التالي بتنزيل مثال البيانات المستخدمة في العرض التوضيحي الأصلي لأنثروبيك.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    تعريف المسترد

    صُممت هذه الفئة لتكون مرنة، مما يسمح لك بالاختيار بين أوضاع الاسترجاع المختلفة بناءً على احتياجاتك. من خلال تحديد الخيارات في طريقة التهيئة، يمكنك تحديد ما إذا كنت تريد استخدام الاسترجاع السياقي، أو البحث الهجين (الجمع بين طرق الاسترجاع الكثيفة والمتناثرة)، أو إعادة ترتيب النتائج المحسنة.

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus.model.reranker import CohereRerankFunction
    +
    +from typing import List, Dict, Any
    +from typing import Callable
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +from tqdm import tqdm
    +import json
    +import anthropic
    +
    +
    +class MilvusContextualRetriever:
    +    def __init__(
    +        self,
    +        uri="milvus.db",
    +        collection_name="contexual_bgem3",
    +        dense_embedding_function=None,
    +        use_sparse=False,
    +        sparse_embedding_function=None,
    +        use_contextualize_embedding=False,
    +        anthropic_client=None,
    +        use_reranker=False,
    +        rerank_function=None,
    +    ):
    +        self.collection_name = collection_name
    +
    +        # For Milvus-lite, uri is a local path like "./milvus.db"
    +        # For Milvus standalone service, uri is like "http://localhost:19530"
    +        # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.
    +        self.client = MilvusClient(uri)
    +
    +        self.embedding_function = dense_embedding_function
    +
    +        self.use_sparse = use_sparse
    +        self.sparse_embedding_function = None
    +
    +        self.use_contextualize_embedding = use_contextualize_embedding
    +        self.anthropic_client = anthropic_client
    +
    +        self.use_reranker = use_reranker
    +        self.rerank_function = rerank_function
    +
    +        if use_sparse is True and sparse_embedding_function:
    +            self.sparse_embedding_function = sparse_embedding_function
    +        elif sparse_embedding_function is False:
    +            raise ValueError(
    +                "Sparse embedding function cannot be None if use_sparse is False"
    +            )
    +        else:
    +            pass
    +
    +    def build_collection(self):
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_field=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="dense_vector",
    +            datatype=DataType.FLOAT_VECTOR,
    +            dim=self.embedding_function.dim,
    +        )
    +        if self.use_sparse is True:
    +            schema.add_field(
    +                field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +            )
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +        if self.use_sparse is True:
    +            index_params.add_index(
    +                field_name="sparse_vector",
    +                index_type="SPARSE_INVERTED_INDEX",
    +                metric_type="IP",
    +            )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +            enable_dynamic_field=True,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        dense_vec = self.embedding_function([chunk])[0]
    +        if self.use_sparse is True:
    +            sparse_result = self.sparse_embedding_function.encode_documents([chunk])
    +            if type(sparse_result) == dict:
    +                sparse_vec = sparse_result["sparse"][[0]]
    +            else:
    +                sparse_vec = sparse_result[[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def insert_contextualized_data(self, doc, chunk, metadata):
    +        contextualized_text, usage = self.situate_context(doc, chunk)
    +        metadata["context"] = contextualized_text
    +        text_to_embed = f"{chunk}\n\n{contextualized_text}"
    +        dense_vec = self.embedding_function([text_to_embed])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_documents(
    +                [text_to_embed]
    +            )["sparse"][[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def situate_context(self, doc: str, chunk: str):
    +        DOCUMENT_CONTEXT_PROMPT = """
    +        <document>
    +        {doc_content}
    +        </document>
    +        """
    +
    +        CHUNK_CONTEXT_PROMPT = """
    +        Here is the chunk we want to situate within the whole document
    +        <chunk>
    +        {chunk_content}
    +        </chunk>
    +
    +        Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.
    +        Answer only with the succinct context and nothing else.
    +        """
    +
    +        response = self.anthropic_client.beta.prompt_caching.messages.create(
    +            model="claude-3-haiku-20240307",
    +            max_tokens=1000,
    +            temperature=0.0,
    +            messages=[
    +                {
    +                    "role": "user",
    +                    "content": [
    +                        {
    +                            "type": "text",
    +                            "text": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),
    +                            "cache_control": {
    +                                "type": "ephemeral"
    +                            },  # we will make use of prompt caching for the full documents
    +                        },
    +                        {
    +                            "type": "text",
    +                            "text": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),
    +                        },
    +                    ],
    +                },
    +            ],
    +            extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"},
    +        )
    +        return response.content[0].text, response.usage
    +
    +    def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:
    +        dense_vec = self.embedding_function([query])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_queries([query])[
    +                "sparse"
    +            ][[0]]
    +
    +        req_list = []
    +        if self.use_reranker:
    +            k = k * 10
    +        if self.use_sparse is True:
    +            req_list = []
    +            dense_search_param = {
    +                "data": [dense_vec],
    +                "anns_field": "dense_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            dense_req = AnnSearchRequest(**dense_search_param)
    +            req_list.append(dense_req)
    +
    +            sparse_search_param = {
    +                "data": [sparse_vec],
    +                "anns_field": "sparse_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            sparse_req = AnnSearchRequest(**sparse_search_param)
    +
    +            req_list.append(sparse_req)
    +
    +            docs = self.client.hybrid_search(
    +                self.collection_name,
    +                req_list,
    +                RRFRanker(),
    +                k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        else:
    +            docs = self.client.search(
    +                self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        if self.use_reranker and self.use_contextualize_embedding:
    +            reranked_texts = []
    +            reranked_docs = []
    +            for i in range(k):
    +                if self.use_contextualize_embedding:
    +                    reranked_texts.append(
    +                        f"{docs[0][i]['entity']['content']}\n\n{docs[0][i]['entity']['context']}"
    +                    )
    +                else:
    +                    reranked_texts.append(f"{docs[0][i]['entity']['content']}")
    +            results = self.rerank_function(query, reranked_texts)
    +            for result in results:
    +                reranked_docs.append(docs[0][result.index])
    +            docs[0] = reranked_docs
    +        return docs
    +
    +
    +def evaluate_retrieval(
    +    queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20
    +) -> Dict[str, float]:
    +    total_score = 0
    +    total_queries = len(queries)
    +    for query_item in tqdm(queries, desc="Evaluating retrieval"):
    +        query = query_item["query"]
    +        golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +        # Find all golden chunk contents
    +        golden_contents = []
    +        for doc_uuid, chunk_index in golden_chunk_uuids:
    +            golden_doc = next(
    +                (
    +                    doc
    +                    for doc in query_item["golden_documents"]
    +                    if doc["uuid"] == doc_uuid
    +                ),
    +                None,
    +            )
    +            if not golden_doc:
    +                print(f"Warning: Golden document not found for UUID {doc_uuid}")
    +                continue
    +
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if not golden_chunk:
    +                print(
    +                    f"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}"
    +                )
    +                continue
    +
    +            golden_contents.append(golden_chunk["content"].strip())
    +
    +        if not golden_contents:
    +            print(f"Warning: No golden contents found for query: {query}")
    +            continue
    +
    +        retrieved_docs = retrieval_function(query, db, k=k)
    +
    +        # Count how many golden chunks are in the top k retrieved documents
    +        chunks_found = 0
    +        for golden_content in golden_contents:
    +            for doc in retrieved_docs[0][:k]:
    +                retrieved_content = doc["entity"]["content"].strip()
    +                if retrieved_content == golden_content:
    +                    chunks_found += 1
    +                    break
    +
    +        query_score = chunks_found / len(golden_contents)
    +        total_score += query_score
    +
    +    average_score = total_score / total_queries
    +    pass_at_n = average_score * 100
    +    return {
    +        "pass_at_n": pass_at_n,
    +        "average_score": average_score,
    +        "total_queries": total_queries,
    +    }
    +
    +
    +def retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:
    +    return db.search(query, k=k)
    +
    +
    +def load_jsonl(file_path: str) -> List[Dict[str, Any]]:
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +def evaluate_db(db, original_jsonl_path: str, k):
    +    # Load the original JSONL data for queries and ground truth
    +    original_data = load_jsonl(original_jsonl_path)
    +
    +    # Evaluate retrieval
    +    results = evaluate_retrieval(original_data, retrieve_base, db, k)
    +    print(f"Pass@{k}: {results['pass_at_n']:.2f}%")
    +    print(f"Total Score: {results['average_score']}")
    +    print(f"Total queries: {results['total_queries']}")
    +
    +

    تحتاج الآن إلى تهيئة هذه النماذج للتجارب التالية. يمكنك التبديل بسهولة إلى نماذج أخرى باستخدام مكتبة نماذج PyMilvus.

    +
    dense_ef = VoyageEmbeddingFunction(api_key="your-voyage-api-key", model_name="voyage-2")
    +sparse_ef = BGEM3EmbeddingFunction()
    +cohere_rf = CohereRerankFunction(api_key="your-cohere-api-key")
    +
    +
    Fetching 30 files:   0%|          | 0/30 [00:00<?, ?it/s]
    +
    +
    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +

    التجربة الأولى: الاسترجاع القياسي

    يستخدم الاسترجاع القياسي التضمينات الكثيفة فقط لاسترجاع المستندات ذات الصلة. في هذه التجربة، سوف نستخدم Pass@5 لإعادة إنتاج النتائج من الريبو الأصلي.

    +
    standard_retriever = MilvusContextualRetriever(
    +    uri="standard.db", collection_name="standard", dense_embedding_function=dense_ef
    +)
    +
    +standard_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(standard_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [01:29<00:00,  2.77it/s]
    +
    +Pass@5: 80.92%
    +Total Score: 0.8091877880184332
    +Total queries: 248
    +
    +

    التجربة الثانية: الاسترجاع الهجين

    والآن بعد أن حصلنا على نتائج واعدة باستخدام تضمين Voyage، سننتقل إلى إجراء الاسترجاع الهجين باستخدام نموذج BGE-M3 الذي يولد تضمينات متناثرة قوية. سيتم دمج النتائج من الاسترجاع الكثيف والاسترجاع المتناثر باستخدام طريقة دمج الرتب المتبادلة (RRF) للحصول على نتيجة هجينة.

    +
    hybrid_retriever = MilvusContextualRetriever(
    +    uri="hybrid.db",
    +    collection_name="hybrid",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +)
    +
    +hybrid_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        hybrid_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(hybrid_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:09<00:00,  1.92it/s]
    +
    +Pass@5: 84.69%
    +Total Score: 0.8469182027649771
    +Total queries: 248
    +
    +

    التجربة الثالثة: الاسترجاع السياقي

    يُظهر الاسترجاع الهجين تحسناً، ولكن يمكن تحسين النتائج بشكل أكبر من خلال تطبيق طريقة الاسترجاع السياقي. ولتحقيق ذلك، سنستخدم نموذج لغة أنثروبيك لإضافة السياق من المستند بأكمله لكل جزء.

    +
    anthropic_client = anthropic.Anthropic(
    +    api_key="your-anthropic-api-key",
    +)
    +
    +
    contextual_retriever = MilvusContextualRetriever(
    +    uri="contextual.db",
    +    collection_name="contextual",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +    use_contextualize_embedding=True,
    +    anthropic_client=anthropic_client,
    +)
    +
    +contextual_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        contextual_retriever.insert_contextualized_data(
    +            doc_content, chunk_content, metadata
    +        )
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
     Evaluating retrieval: 100%|██████████| 248/248 [01:55<00:00,  2.15it/s]
    +Pass@5: 87.14%
    +Total Score: 0.8713517665130568
    +Total queries: 248 
    +
    +

    التجربة الرابعة: الاسترجاع السياقي باستخدام أداة إعادة التصنيف

    يمكن تحسين النتائج بشكل أكبر من خلال إضافة معيد تصنيف Cohere. بدون تهيئة مسترجِع جديد مع أداة إعادة الترتيب بشكل منفصل، يمكننا ببساطة تهيئة المسترجِع الحالي لاستخدام أداة إعادة الترتيب لتحسين الأداء.

    +
    contextual_retriever.use_reranker = True
    +contextual_retriever.rerank_function = cohere_rf
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:02<00:00,  2.00it/s]
    +Pass@5: 90.91%
    +Total Score: 0.9090821812596005
    +Total queries: 248
    +
    +

    لقد أظهرنا عدة طرق لتحسين أداء الاسترجاع. مع المزيد من التصميم المخصص المصمم خصيصًا للسيناريو، يُظهر الاسترجاع السياقي إمكانات كبيرة لمعالجة المستندات مسبقًا بتكلفة منخفضة، مما يؤدي إلى نظام استرجاع أفضل.

    diff --git a/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.json b/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.json new file mode 100644 index 000000000..d745679cd --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"DNA Sequence Classification","anchorList":[{"label":"تصنيف تسلسل الحمض النووي","href":"DNA-Sequence-Classification","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.md b/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.md new file mode 100644 index 000000000..2e14e83d3 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/dna_sequence_classification.md @@ -0,0 +1,36 @@ +--- +id: dna_sequence_classification.md +summary: بناء نظام تصنيف تسلسل الحمض النووي باستخدام ميلفوس. +title: تصنيف تسلسل الحمض النووي +--- +

    تصنيف تسلسل الحمض النووي

    يوضح هذا البرنامج التعليمي كيفية استخدام Milvus، قاعدة بيانات المتجهات مفتوحة المصدر، لبناء نموذج تصنيف تسلسل الحمض النووي.

    +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    + +


    +

    تسلسل الحمض النووي مفهوم شائع في تتبع الجينات، وتحديد الأنواع، وتشخيص الأمراض، والعديد من المجالات الأخرى. في حين أن جميع الصناعات تتوق إلى طريقة بحث أكثر ذكاءً وكفاءةً، فقد اجتذب الذكاء الاصطناعي الكثير من الاهتمام خاصةً في المجالات البيولوجية والطبية. يساهم المزيد والمزيد من العلماء والباحثين في التعلم الآلي والتعلم العميق في مجال المعلوماتية الحيوية. ولجعل النتائج التجريبية أكثر إقناعًا، يتمثل أحد الخيارات الشائعة في زيادة حجم العينة. يجلب التعاون مع البيانات الضخمة في علم الجينوم المزيد من إمكانيات التطبيق في الواقع. ومع ذلك، فإن محاذاة التسلسل التقليدي لها قيود، مما يجعلها غير مناسبة لمجموعات البيانات الكبيرة. من أجل إجراء مفاضلة أقل في الواقع، يعد التحويل خيارًا جيدًا لمجموعة بيانات كبيرة من تسلسلات الحمض النووي.

    +


    +

    ستتعلم في هذا البرنامج التعليمي كيفية بناء نموذج تصنيف تسلسل الحمض النووي. يستخدم هذا البرنامج التعليمي CountVectorizer لاستخراج سمات تسلسلات الحمض النووي وتحويلها إلى متجهات. بعد ذلك، يتم تخزين هذه المتجهات في Milvus ويتم تخزين فئات الحمض النووي المقابلة لها في MySQL. يمكن للمستخدمين إجراء بحث عن تشابه المتجهات في Milvus واستدعاء تصنيف الحمض النووي المقابل من MySQL.

    +


    +

    + + dna + الحمض النووي

    diff --git a/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.json new file mode 100644 index 000000000..7986146ed --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","pip install \"pymilvus[model]\" -U \n","import json\n\nfrom pymilvus import (\n MilvusClient,\n DataType,\n Function,\n FunctionType,\n AnnSearchRequest,\n RRFRanker,\n)\n\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\n\nclass HybridRetriever:\n def __init__(self, uri, collection_name=\"hybrid\", dense_embedding_function=None):\n self.uri = uri\n self.collection_name = collection_name\n self.embedding_function = dense_embedding_function\n self.use_reranker = True\n self.use_sparse = True\n self.client = MilvusClient(uri=uri)\n\n def build_collection(self):\n if isinstance(self.embedding_function.dim, dict):\n dense_dim = self.embedding_function.dim[\"dense\"]\n else:\n dense_dim = self.embedding_function.dim\n\n tokenizer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"length\",\n \"max\": 200,\n },\n {\"type\": \"stemmer\", \"language\": \"english\"},\n {\n \"type\": \"stop\",\n \"stop_words\": [\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"for\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"no\",\n \"not\",\n \"of\",\n \"on\",\n \"or\",\n \"such\",\n \"that\",\n \"the\",\n \"their\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"to\",\n \"was\",\n \"will\",\n \"with\",\n ],\n },\n ],\n }\n\n schema = MilvusClient.create_schema()\n schema.add_field(\n field_name=\"pk\",\n datatype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n )\n schema.add_field(\n field_name=\"content\",\n datatype=DataType.VARCHAR,\n max_length=65535,\n analyzer_params=tokenizer_params,\n enable_match=True,\n enable_analyzer=True,\n )\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n schema.add_field(\n field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=dense_dim\n )\n schema.add_field(\n field_name=\"original_uuid\", datatype=DataType.VARCHAR, max_length=128\n )\n schema.add_field(field_name=\"doc_id\", datatype=DataType.VARCHAR, max_length=64)\n schema.add_field(\n field_name=\"chunk_id\", datatype=DataType.VARCHAR, max_length=64\n ),\n schema.add_field(field_name=\"original_index\", datatype=DataType.INT32)\n\n functions = Function(\n name=\"bm25\",\n function_type=FunctionType.BM25,\n input_field_names=[\"content\"],\n output_field_names=\"sparse_vector\",\n )\n\n schema.add_function(functions)\n\n index_params = MilvusClient.prepare_index_params()\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"BM25\",\n )\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n )\n\n def insert_data(self, chunk, metadata):\n embedding = self.embedding_function([chunk])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n self.client.insert(\n self.collection_name, {\"dense_vector\": dense_vec, **metadata}\n )\n\n def search(self, query: str, k: int = 20, mode=\"hybrid\"):\n\n output_fields = [\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n ]\n if mode in [\"dense\", \"hybrid\"]:\n embedding = self.embedding_function([query])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n\n if mode == \"sparse\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[query],\n anns_field=\"sparse_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"dense\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"hybrid\":\n full_text_search_params = {\"metric_type\": \"BM25\"}\n full_text_search_req = AnnSearchRequest(\n [query], \"sparse_vector\", full_text_search_params, limit=k\n )\n\n dense_search_params = {\"metric_type\": \"IP\"}\n dense_req = AnnSearchRequest(\n [dense_vec], \"dense_vector\", dense_search_params, limit=k\n )\n\n results = self.client.hybrid_search(\n self.collection_name,\n [full_text_search_req, dense_req],\n ranker=RRFRanker(),\n limit=k,\n output_fields=output_fields,\n )\n else:\n raise ValueError(\"Invalid mode\")\n return [\n {\n \"doc_id\": doc[\"entity\"][\"doc_id\"],\n \"chunk_id\": doc[\"entity\"][\"chunk_id\"],\n \"content\": doc[\"entity\"][\"content\"],\n \"score\": doc[\"distance\"],\n }\n for doc in results[0]\n ]\n","dense_ef = BGEM3EmbeddingFunction()\nstandard_retriever = HybridRetriever(\n uri=\"http://localhost:19530\",\n collection_name=\"milvus_hybrid\",\n dense_embedding_function=dense_ef,\n)\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n\nis_insert = True\nif is_insert:\n standard_retriever.build_collection()\n for doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","results = standard_retriever.search(\"create a logger?\", mode=\"sparse\", k=3)\nprint(results)\n","def load_jsonl(file_path: str):\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndataset = load_jsonl(\"evaluation_set.jsonl\")\nk = 5\n\n# mode can be \"dense\", \"sparse\" or \"hybrid\".\nmode = \"hybrid\"\n\ntotal_query_score = 0\nnum_queries = 0\n\nfor query_item in dataset:\n\n query = query_item[\"query\"]\n\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n chunks_found = 0\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (doc for doc in query_item[\"golden_documents\"] if doc[\"uuid\"] == doc_uuid),\n None,\n )\n if golden_doc:\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if golden_chunk:\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n results = standard_retriever.search(query, mode=mode, k=5)\n\n for golden_content in golden_contents:\n for doc in results[:k]:\n retrieved_content = doc[\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n\n total_query_score += query_score\n num_queries += 1\n","print(\"Pass@5: \", total_query_score / num_queries)\n"],"headingContent":"Full Text Search with Milvus","anchorList":[{"label":"البحث عن النص الكامل مع ميلفوس","href":"Full-Text-Search-with-Milvus","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"التقييم","href":"Evaluation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.md new file mode 100644 index 000000000..e1f308a32 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/full_text_search_with_milvus.md @@ -0,0 +1,371 @@ +--- +id: full_text_search_with_milvus.md +summary: >- + مع إصدار الإصدار Milvus 2.5، يتيح البحث عن النص الكامل للمستخدمين البحث بكفاءة + عن النص استنادًا إلى الكلمات الرئيسية أو العبارات، مما يوفر إمكانات قوية + لاسترجاع النص. تعمل هذه الميزة على تحسين دقة البحث ويمكن دمجها بسلاسة مع + الاسترجاع القائم على التضمين للبحث المختلط، مما يسمح بالحصول على نتائج دلالية + وكلمات مفتاحية في استعلام واحد. في هذا الدفتر، سنعرض الاستخدام الأساسي للبحث + عن النص الكامل في ميلفوس. +title: البحث عن النص الكامل مع ميلفوس +--- +

    +Open In Colab + + +GitHub Repository +

    +

    البحث عن النص الكامل مع ميلفوس

    مع إصدار الإصدار Milvus 2.5، يتيح البحث بالنص الكامل للمستخدمين البحث بكفاءة عن النص استنادًا إلى الكلمات الرئيسية أو العبارات، مما يوفر إمكانات قوية لاسترجاع النص. تعمل هذه الميزة على تحسين دقة البحث ويمكن دمجها بسلاسة مع الاسترجاع القائم على التضمين للبحث المختلط، مما يسمح بالحصول على نتائج دلالية وكلمات مفتاحية في استعلام واحد. سنعرض في هذا الدفتر الاستخدام الأساسي للبحث عن النص الكامل في ميلفوس.

    +

    التحضير

    تنزيل مجموعة البيانات

    سيقوم الأمر التالي بتحميل مثال البيانات المستخدمة في العرض التوضيحي الأصلي أنثروبيك.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    تثبيت ميلفوس 2.5

    راجع دليل التثبيت الرسمي لمزيد من التفاصيل.

    +

    تثبيت PyMilvus

    قم بتشغيل الأمر التالي لتثبيت PyMilvus:

    +
    pip install "pymilvus[model]" -U 
    +
    +

    تحديد المسترد

    import json
    +
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    Function,
    +    FunctionType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +
    +class HybridRetriever:
    +    def __init__(self, uri, collection_name="hybrid", dense_embedding_function=None):
    +        self.uri = uri
    +        self.collection_name = collection_name
    +        self.embedding_function = dense_embedding_function
    +        self.use_reranker = True
    +        self.use_sparse = True
    +        self.client = MilvusClient(uri=uri)
    +
    +    def build_collection(self):
    +        if isinstance(self.embedding_function.dim, dict):
    +            dense_dim = self.embedding_function.dim["dense"]
    +        else:
    +            dense_dim = self.embedding_function.dim
    +
    +        tokenizer_params = {
    +            "tokenizer": "standard",
    +            "filter": [
    +                "lowercase",
    +                {
    +                    "type": "length",
    +                    "max": 200,
    +                },
    +                {"type": "stemmer", "language": "english"},
    +                {
    +                    "type": "stop",
    +                    "stop_words": [
    +                        "a",
    +                        "an",
    +                        "and",
    +                        "are",
    +                        "as",
    +                        "at",
    +                        "be",
    +                        "but",
    +                        "by",
    +                        "for",
    +                        "if",
    +                        "in",
    +                        "into",
    +                        "is",
    +                        "it",
    +                        "no",
    +                        "not",
    +                        "of",
    +                        "on",
    +                        "or",
    +                        "such",
    +                        "that",
    +                        "the",
    +                        "their",
    +                        "then",
    +                        "there",
    +                        "these",
    +                        "they",
    +                        "this",
    +                        "to",
    +                        "was",
    +                        "will",
    +                        "with",
    +                    ],
    +                },
    +            ],
    +        }
    +
    +        schema = MilvusClient.create_schema()
    +        schema.add_field(
    +            field_name="pk",
    +            datatype=DataType.VARCHAR,
    +            is_primary=True,
    +            auto_id=True,
    +            max_length=100,
    +        )
    +        schema.add_field(
    +            field_name="content",
    +            datatype=DataType.VARCHAR,
    +            max_length=65535,
    +            analyzer_params=tokenizer_params,
    +            enable_match=True,
    +            enable_analyzer=True,
    +        )
    +        schema.add_field(
    +            field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +        )
    +        schema.add_field(
    +            field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=dense_dim
    +        )
    +        schema.add_field(
    +            field_name="original_uuid", datatype=DataType.VARCHAR, max_length=128
    +        )
    +        schema.add_field(field_name="doc_id", datatype=DataType.VARCHAR, max_length=64)
    +        schema.add_field(
    +            field_name="chunk_id", datatype=DataType.VARCHAR, max_length=64
    +        ),
    +        schema.add_field(field_name="original_index", datatype=DataType.INT32)
    +
    +        functions = Function(
    +            name="bm25",
    +            function_type=FunctionType.BM25,
    +            input_field_names=["content"],
    +            output_field_names="sparse_vector",
    +        )
    +
    +        schema.add_function(functions)
    +
    +        index_params = MilvusClient.prepare_index_params()
    +        index_params.add_index(
    +            field_name="sparse_vector",
    +            index_type="SPARSE_INVERTED_INDEX",
    +            metric_type="BM25",
    +        )
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        embedding = self.embedding_function([chunk])
    +        if isinstance(embedding, dict) and "dense" in embedding:
    +            dense_vec = embedding["dense"][0]
    +        else:
    +            dense_vec = embedding[0]
    +        self.client.insert(
    +            self.collection_name, {"dense_vector": dense_vec, **metadata}
    +        )
    +
    +    def search(self, query: str, k: int = 20, mode="hybrid"):
    +
    +        output_fields = [
    +            "content",
    +            "original_uuid",
    +            "doc_id",
    +            "chunk_id",
    +            "original_index",
    +        ]
    +        if mode in ["dense", "hybrid"]:
    +            embedding = self.embedding_function([query])
    +            if isinstance(embedding, dict) and "dense" in embedding:
    +                dense_vec = embedding["dense"][0]
    +            else:
    +                dense_vec = embedding[0]
    +
    +        if mode == "sparse":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[query],
    +                anns_field="sparse_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "dense":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "hybrid":
    +            full_text_search_params = {"metric_type": "BM25"}
    +            full_text_search_req = AnnSearchRequest(
    +                [query], "sparse_vector", full_text_search_params, limit=k
    +            )
    +
    +            dense_search_params = {"metric_type": "IP"}
    +            dense_req = AnnSearchRequest(
    +                [dense_vec], "dense_vector", dense_search_params, limit=k
    +            )
    +
    +            results = self.client.hybrid_search(
    +                self.collection_name,
    +                [full_text_search_req, dense_req],
    +                ranker=RRFRanker(),
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        else:
    +            raise ValueError("Invalid mode")
    +        return [
    +            {
    +                "doc_id": doc["entity"]["doc_id"],
    +                "chunk_id": doc["entity"]["chunk_id"],
    +                "content": doc["entity"]["content"],
    +                "score": doc["distance"],
    +            }
    +            for doc in results[0]
    +        ]
    +
    +
    dense_ef = BGEM3EmbeddingFunction()
    +standard_retriever = HybridRetriever(
    +    uri="http://localhost:19530",
    +    collection_name="milvus_hybrid",
    +    dense_embedding_function=dense_ef,
    +)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 108848.72it/s]
    +
    +

    أدخل البيانات

    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +is_insert = True
    +if is_insert:
    +    standard_retriever.build_collection()
    +    for doc in dataset:
    +        doc_content = doc["content"]
    +        for chunk in doc["chunks"]:
    +            metadata = {
    +                "doc_id": doc["doc_id"],
    +                "original_uuid": doc["original_uuid"],
    +                "chunk_id": chunk["chunk_id"],
    +                "original_index": chunk["original_index"],
    +                "content": chunk["content"],
    +            }
    +            chunk_content = chunk["content"]
    +            standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    results = standard_retriever.search("create a logger?", mode="sparse", k=3)
    +print(results)
    +
    +
    [{'doc_id': 'doc_10', 'chunk_id': 'doc_10_chunk_0', 'content': 'use {\n    crate::args::LogArgs,\n    anyhow::{anyhow, Result},\n    simplelog::{Config, LevelFilter, WriteLogger},\n    std::fs::File,\n};\n\npub struct Logger;\n\nimpl Logger {\n    pub fn init(args: &impl LogArgs) -> Result<()> {\n        let filter: LevelFilter = args.log_level().into();\n        if filter != LevelFilter::Off {\n            let logfile = File::create(args.log_file())\n                .map_err(|e| anyhow!("Failed to open log file: {e:}"))?;\n            WriteLogger::init(filter, Config::default(), logfile)\n                .map_err(|e| anyhow!("Failed to initalize logger: {e:}"))?;\n        }\n        Ok(())\n    }\n}\n', 'score': 9.12518310546875}, {'doc_id': 'doc_87', 'chunk_id': 'doc_87_chunk_3', 'content': '\t\tLoggerPtr INF = Logger::getLogger(LOG4CXX_TEST_STR("INF"));\n\t\tINF->setLevel(Level::getInfo());\n\n\t\tLoggerPtr INF_ERR = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR"));\n\t\tINF_ERR->setLevel(Level::getError());\n\n\t\tLoggerPtr DEB = Logger::getLogger(LOG4CXX_TEST_STR("DEB"));\n\t\tDEB->setLevel(Level::getDebug());\n\n\t\t// Note: categories with undefined level\n\t\tLoggerPtr INF_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.UNDEF"));\n\t\tLoggerPtr INF_ERR_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR.UNDEF"));\n\t\tLoggerPtr UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("UNDEF"));\n\n', 'score': 7.0077056884765625}, {'doc_id': 'doc_89', 'chunk_id': 'doc_89_chunk_3', 'content': 'using namespace log4cxx;\nusing namespace log4cxx::helpers;\n\nLOGUNIT_CLASS(FMTTestCase)\n{\n\tLOGUNIT_TEST_SUITE(FMTTestCase);\n\tLOGUNIT_TEST(test1);\n\tLOGUNIT_TEST(test1_expanded);\n\tLOGUNIT_TEST(test10);\n//\tLOGUNIT_TEST(test_date);\n\tLOGUNIT_TEST_SUITE_END();\n\n\tLoggerPtr root;\n\tLoggerPtr logger;\n\npublic:\n\tvoid setUp()\n\t{\n\t\troot = Logger::getRootLogger();\n\t\tMDC::clear();\n\t\tlogger = Logger::getLogger(LOG4CXX_TEST_STR("java.org.apache.log4j.PatternLayoutTest"));\n\t}\n\n', 'score': 6.750633716583252}]
    +
    +

    التقييم

    الآن بعد أن أدخلنا مجموعة البيانات في ميلفوس، يمكننا استخدام البحث الكثيف أو المتناثر أو الهجين لاسترداد أفضل 5 نتائج. يمكنك تغيير mode وتقييم كل منها. نقدم مقياس النجاح@5، والذي يتضمن استرجاع أفضل 5 نتائج لكل استعلام وحساب التذكر.

    +
    def load_jsonl(file_path: str):
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +dataset = load_jsonl("evaluation_set.jsonl")
    +k = 5
    +
    +# mode can be "dense", "sparse" or "hybrid".
    +mode = "hybrid"
    +
    +total_query_score = 0
    +num_queries = 0
    +
    +for query_item in dataset:
    +
    +    query = query_item["query"]
    +
    +    golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +    chunks_found = 0
    +    golden_contents = []
    +    for doc_uuid, chunk_index in golden_chunk_uuids:
    +        golden_doc = next(
    +            (doc for doc in query_item["golden_documents"] if doc["uuid"] == doc_uuid),
    +            None,
    +        )
    +        if golden_doc:
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if golden_chunk:
    +                golden_contents.append(golden_chunk["content"].strip())
    +
    +    results = standard_retriever.search(query, mode=mode, k=5)
    +
    +    for golden_content in golden_contents:
    +        for doc in results[:k]:
    +            retrieved_content = doc["content"].strip()
    +            if retrieved_content == golden_content:
    +                chunks_found += 1
    +                break
    +
    +    query_score = chunks_found / len(golden_contents)
    +
    +    total_query_score += query_score
    +    num_queries += 1
    +
    +
    print("Pass@5: ", total_query_score / num_queries)
    +
    +
    Pass@5:  0.7911386328725037
    +
    diff --git a/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.json b/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.json new file mode 100644 index 000000000..eb135ecd8 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.json @@ -0,0 +1 @@ +{"codeList":["import functools\n\nfrom datasets import load_dataset\nimport numpy as np\nimport pandas as pd\nimport pymilvus\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nimport torch\nimport torch.nn.functional as F\nfrom tqdm import tqdm\n","model = SentenceTransformer(\n # Remove 'device='mps' if running on non-Mac device\n \"nomic-ai/nomic-embed-text-v1.5\",\n trust_remote_code=True,\n device=\"mps\",\n)\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","embedding_dim = 768\nsearch_dim = 128\ncollection_name = \"movie_embeddings\"\n\nclient = MilvusClient(uri=\"./wiki-movie-plots-matryoshka.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n # First sixth of unnormalized embedding vector\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n # Entire unnormalized embedding vector\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"COSINE\")\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n # This particular model requires us to prefix 'search_document:' to stored entities\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Output of embedding model is unnormalized\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n \"An archaeologist searches for ancient artifacts while fighting Nazis.\",\n \"A teenager fakes illness to get off school and have adventures with two friends.\",\n \"A young couple with a kid look after a hotel during winter and the husband goes insane.\",\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\n# This particular model requires us to prefix 'search_query:' to queries\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries]\nsearch_data = embed_search(instruct_queries)\n\n# Normalize head embeddings\nhead_search = [x[:search_dim] for x in search_data]\n\n# Perform standard vector search on first sixth of embedding dimensions\nres = client.search(\n collection_name=collection_name,\n data=head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits][:5]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:\n \"\"\"\n Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.\n\n \"\"\"\n rows = [x[\"entity\"] for x in hits]\n rows_dict = [\n {\"title\": x[\"title\"], \"embedding\": torch.tensor(x[\"embedding\"])} for x in rows\n ]\n return pd.DataFrame.from_records(rows_dict)\n\n\ndfs = [hits_to_dataframe(hits) for hits in res]\n","# An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)\ndef calculate_score(row, query_emb=None, dims=768):\n emb = F.normalize(row[\"embedding\"][:dims], dim=-1)\n return (emb @ query_emb).item()\n\n\n# You could also add a top-K parameter as a termination condition\ndef funnel_search(\n df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5\n) -> pd.DataFrame:\n # Loop over increasing prefixes of the embeddings\n for dims in scales:\n # Query vector must be normalized for each new dimensionality\n emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))\n\n # Score\n scores = df.apply(\n functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1\n )\n df[\"scores\"] = scores\n\n # Re-rank\n df = df.sort_values(by=\"scores\", ascending=False)\n\n # Prune (in our case, remove half of candidates at each step)\n df = df.head(int(prune_ratio * len(df)))\n\n return df\n\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, search_data)\n]\n","for d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:5][\"title\"], \"\\n\")\n","# Search on entire embeddings\nres = client.search(\n collection_name=collection_name,\n data=search_data,\n anns_field=\"embedding\",\n limit=5,\n output_fields=[\"title\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","queries2 = [\n \"A teenager fakes illness to get off school and have adventures with two friends.\"\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries2]\nsearch_data2 = embed_search(instruct_queries)\nhead_search2 = [x[:search_dim] for x in search_data2]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=head_search2,\n anns_field=\"head_embedding\",\n limit=256,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", queries2[0])\n for idx, row in enumerate(rows):\n if row[\"title\"].strip() == \"Ferris Bueller's Day Off\":\n print(f\"Row {idx}: Ferris Bueller's Day Off\")\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries2, dfs, search_data2)\n]\n\nfor d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:7][\"title\"].to_string(index=False), \"\\n\")\n","client = MilvusClient(uri=\"./wikiplots-matryoshka-flipped.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n\nindex_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Encode and flip embeddings\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n embeddings = torch.flip(embeddings, dims=[-1])\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","# Normalize head embeddings\n\nflip_search_data = [\n torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data\n]\nflip_head_search = [x[:search_dim] for x in flip_search_data]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=flip_head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, flip_search_data)\n]\n\nfor d in dfs_results:\n print(\n d[\"query\"],\n \"\\n\",\n d[\"results\"][:7][\"title\"].to_string(index=False, header=False),\n \"\\n\",\n )\n"],"headingContent":"Funnel Search with Matryoshka Embeddings","anchorList":[{"label":"البحث القمعي باستخدام تضمينات ماتريوشكا","href":"Funnel-Search-with-Matryoshka-Embeddings","type":1,"isActive":false},{"label":"تحميل نموذج تضمين ماتريوشكا","href":"Load-Matryoshka-Embedding-Model","type":2,"isActive":false},{"label":"تحميل مجموعة البيانات، وتضمين العناصر، وبناء قاعدة بيانات المتجهات","href":"Loading-Dataset-Embedding-Items-and-Building-Vector-Database","type":2,"isActive":false},{"label":"إجراء بحث قمعي","href":"Performing-Funnel-Search","type":2,"isActive":false},{"label":"مقارنة البحث القمعي بالبحث العادي","href":"Comparing-Funnel-Search-to-Regular-Search","type":2,"isActive":false},{"label":"التحقيق في فشل استرجاع البحث القمعي في يوم عطلة فيريس بويلر","href":"Investigating-Funnel-Search-Recall-Failure-for-Ferris-Buellers-Day-Off","type":2,"isActive":false},{"label":"هل الترتيب مهم؟ تضمين البادئة مقابل تضمين اللاحقة.","href":"Does-the-order-matter-Prefix-vs-suffix-embeddings","type":2,"isActive":false},{"label":"ملخص","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.md b/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.md new file mode 100644 index 000000000..8eaf770df --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/funnel_search_with_matryoshka.md @@ -0,0 +1,569 @@ +--- +id: funnel_search_with_matryoshka.md +summary: >- + ندرس في هذا الدفتر كيفية استخدام تضمينات ماتريوشكا مع ميلفوس للبحث الدلالي. + نوضح خوارزمية تسمى "البحث القمعي" التي تسمح لنا بإجراء بحث التشابه على مجموعة + فرعية صغيرة من أبعاد التضمين دون انخفاض كبير في التذكر. +title: البحث القمعي باستخدام تضمينات ماتريوشكا +--- +

    البحث القمعي باستخدام تضمينات ماتريوشكا

    عند إنشاء أنظمة بحث متجهات فعالة، يتمثل أحد التحديات الرئيسية في إدارة تكاليف التخزين مع الحفاظ على زمن استجابة واستدعاء مقبول. تُخرج نماذج التضمين الحديثة متجهات ذات مئات أو آلاف الأبعاد، مما يؤدي إلى إنشاء مساحة تخزين كبيرة ونفقات حسابية كبيرة للمتجه الخام والفهرس.

    +

    وتقليديًا، يتم تقليل متطلبات التخزين من خلال تطبيق طريقة التكميم أو تقليل الأبعاد قبل إنشاء الفهرس مباشرةً. على سبيل المثال، يمكننا توفير مساحة التخزين عن طريق تقليل الدقة باستخدام التكميم الكمي للمنتج (PQ) أو عدد الأبعاد باستخدام تحليل المكونات الرئيسية (PCA). تقوم هذه الطرق بتحليل مجموعة المتجهات بأكملها للعثور على مجموعة أكثر إحكامًا تحافظ على العلاقات الدلالية بين المتجهات.

    +

    رغم فعاليتها، فإن هذه الأساليب القياسية تقلل من الدقة أو الأبعاد مرة واحدة فقط وعلى مقياس واحد. ولكن ماذا لو تمكنا من الحفاظ على طبقات متعددة من التفاصيل في وقت واحد، مثل هرم من التمثيلات المتزايدة الدقة؟

    +

    أدخل تضمينات ماتريوشكا. سُميت على اسم الدمى الروسية المتداخلة (انظر الرسم التوضيحي)، هذه التركيبات الذكية تدمج مقاييس متعددة للتمثيل داخل متجه واحد. على عكس طرق المعالجة اللاحقة التقليدية، تتعلم تضمينات ماتريوشكا هذه البنية متعددة المقاييس أثناء عملية التدريب الأولية. والنتيجة ملحوظة: لا يقتصر الأمر على أن التضمين الكامل لا يلتقط دلالات المدخلات فحسب، بل إن كل بادئة مجموعة فرعية متداخلة (النصف الأول، الربع الأول، إلخ) توفر تمثيلاً متماسكاً، وإن كان أقل تفصيلاً.

    +
    +

    في هذا الدفتر، ندرس كيفية استخدام تضمينات ماتريوشكا مع ميلفوس للبحث الدلالي. نوضح خوارزمية تسمى "البحث القمعي" التي تسمح لنا بإجراء بحث التشابه على مجموعة فرعية صغيرة من أبعاد التضمين دون انخفاض كبير في التذكر.

    +
    import functools
    +
    +from datasets import load_dataset
    +import numpy as np
    +import pandas as pd
    +import pymilvus
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +import torch
    +import torch.nn.functional as F
    +from tqdm import tqdm
    +
    +

    تحميل نموذج تضمين ماتريوشكا

    بدلاً من استخدام نموذج تضمين قياسي مثل sentence-transformers/all-MiniLM-L12-v2، نستخدم نموذجًا من Nomic مدربًا خصيصًا لإنتاج تضمينات ماتريوشكا.

    +
    model = SentenceTransformer(
    +    # Remove 'device='mps' if running on non-Mac device
    +    "nomic-ai/nomic-embed-text-v1.5",
    +    trust_remote_code=True,
    +    device="mps",
    +)
    +
    +
    <All keys matched successfully>
    +
    +

    تحميل مجموعة البيانات، وتضمين العناصر، وبناء قاعدة بيانات المتجهات

    الكود التالي هو تعديل لذلك من صفحة التوثيق "البحث عن الأفلام باستخدام محولات الجمل وميلفوس". أولاً، نقوم بتحميل مجموعة البيانات من HuggingFace. وهي تحتوي على حوالي 35 ألف مدخل، كل منها يتوافق مع فيلم له مقالة في ويكيبيديا. سنستخدم الحقلين Title و PlotSummary في هذا المثال.

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +
    Dataset({
    +    features: ['Release Year', 'Title', 'Origin/Ethnicity', 'Director', 'Cast', 'Genre', 'Wiki Page', 'Plot', 'PlotSummary'],
    +    num_rows: 34886
    +})
    +
    +

    بعد ذلك، نتصل بقاعدة بيانات Milvus Lite، ونحدد مخطط البيانات، وننشئ مجموعة بهذا المخطط. سنقوم بتخزين كل من التضمين غير الطبيعي والسدس الأول من التضمين في حقول منفصلة. والسبب في ذلك هو أننا نحتاج إلى أول 1/6 من تضمين ماتريوشكا لإجراء بحث التشابه، والخمسة أسداس المتبقية من التضمينات لإعادة ترتيب نتائج البحث وتحسينها.

    +
    embedding_dim = 768
    +search_dim = 128
    +collection_name = "movie_embeddings"
    +
    +client = MilvusClient(uri="./wiki-movie-plots-matryoshka.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    # First sixth of unnormalized embedding vector
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    # Entire unnormalized embedding vector
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +

    لا يدعم برنامج Milvus حاليًا البحث على مجموعات فرعية من التضمينات، لذلك نقوم بتقسيم التضمينات إلى جزأين: يمثل الرأس المجموعة الفرعية الأولية من المتجه للفهرسة والبحث، والذيل هو الباقي. تم تدريب النموذج على البحث عن تشابه مسافة جيب التمام، لذلك نقوم بتطبيع تضمينات الرأس. ومع ذلك، من أجل حساب أوجه التشابه لمجموعات فرعية أكبر لاحقًا، نحتاج إلى تخزين معيار تضمين الرأس، حتى نتمكن من عدم تطبيعه قبل الانضمام إلى الذيل.

    +

    لإجراء البحث عن طريق أول 1/6 من التضمين الأول، سنحتاج إلى إنشاء فهرس بحث متجه على الحقل head_embedding. في وقت لاحق، سنقارن نتائج "البحث القمعي" بالبحث المتجه العادي، ومن ثم ننشئ فهرس بحث على التضمين الكامل أيضًا.

    +

    من المهم أن نستخدم COSINE بدلاً من مقياس المسافة IP ، لأنه بخلاف ذلك سنحتاج إلى تتبع معايير التضمين، مما سيعقد التنفيذ (سيكون هذا أكثر منطقية بمجرد وصف خوارزمية البحث القمعي).

    +
    index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="COSINE")
    +client.create_index(collection_name, index_params)
    +
    +

    أخيراً، نقوم بترميز ملخصات الحبكة لجميع الأفلام الـ 35 ألفاً وإدخال التضمينات المقابلة في قاعدة البيانات.

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    # This particular model requires us to prefix 'search_document:' to stored entities
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Output of embedding model is unnormalized
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:57<00:00,  5.18s/it]
    +
    +

    لننفذ الآن "بحثاً قمعياً" باستخدام أول 1/6 من أبعاد تضمين ماتريوشكا. لديّ ثلاثة أفلام في الاعتبار لاسترجاعها وقمت بإنتاج ملخص الرسم البياني الخاص بي للاستعلام عن قاعدة البيانات. نقوم بتضمين الاستعلامات، ثم نجري بحثًا متجهًا على الحقل head_embedding ، ونسترجع 128 نتيجة مرشحة.

    +
    queries = [
    +    "An archaeologist searches for ancient artifacts while fighting Nazis.",
    +    "A teenager fakes illness to get off school and have adventures with two friends.",
    +    "A young couple with a kid look after a hotel during winter and the husband goes insane.",
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +# This particular model requires us to prefix 'search_query:' to queries
    +instruct_queries = ["search_query: " + q.strip() for q in queries]
    +search_data = embed_search(instruct_queries)
    +
    +# Normalize head embeddings
    +head_search = [x[:search_dim] for x in search_data]
    +
    +# Perform standard vector search on first sixth of embedding dimensions
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +

    عند هذه النقطة، نكون قد أجرينا بحثًا على مساحة متجه أصغر بكثير، وبالتالي من المحتمل أن يكون زمن الاستجابة أقل ومتطلبات تخزين أقل للفهرس مقارنة بالبحث على المساحة الكاملة. دعونا نفحص أفضل 5 مطابقات لكل استعلام:

    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits][:5]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +The Passage
    +Counterblast
    +Dominion: Prequel to the Exorcist
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +How to Deal
    +Shorts
    +Blackbird
    +Valentine
    +Unfriended
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +Ghostkeeper
    +Our Vines Have Tender Grapes
    +The Ref
    +Impact
    +The House in Marsh Road
    +
    +

    كما نرى، تأثر التذكر نتيجة لاقتطاع التضمينات أثناء البحث. يعمل البحث القمعي على إصلاح ذلك باستخدام حيلة ذكية: يمكننا استخدام ما تبقى من أبعاد التضمين لإعادة ترتيب قائمة المرشحين وتشذيبها لاستعادة أداء الاسترجاع دون إجراء أي عمليات بحث إضافية مكلفة عن المتجهات.

    +

    لتسهيل شرح خوارزمية البحث القمعي نقوم بتحويل نتائج بحث ميلفوس لكل استعلام إلى إطار بيانات بانداس.

    +
    def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:
    +    """
    +    Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.
    +
    +    """
    +    rows = [x["entity"] for x in hits]
    +    rows_dict = [
    +        {"title": x["title"], "embedding": torch.tensor(x["embedding"])} for x in rows
    +    ]
    +    return pd.DataFrame.from_records(rows_dict)
    +
    +
    +dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +

    والآن، لإجراء البحث القمعي نقوم بالتكرار على مجموعات فرعية أكبر بشكل متزايد من التضمينات. في كل عملية تكرار، نعيد ترتيب المرشحين وفقًا لأوجه التشابه الجديدة ونشذب جزءًا من أقلها مرتبة.

    +

    لتوضيح ذلك، استرجعنا من الخطوة السابقة 128 مرشحًا باستخدام 1/6 من أبعاد التضمين والاستعلام. تتمثل الخطوة الأولى في إجراء البحث القمعي في إعادة حساب أوجه التشابه بين الاستعلامات والمرشحين باستخدام الثلث الأول من الأبعاد. يتم تشذيب ال 64 مرشحًا السفلي. ثم نكرر هذه العملية مع أول 2/3 من الأبعاد، ثم جميع الأبعاد، مع تشذيب 32 و16 مرشحًا على التوالي.

    +
    # An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)
    +def calculate_score(row, query_emb=None, dims=768):
    +    emb = F.normalize(row["embedding"][:dims], dim=-1)
    +    return (emb @ query_emb).item()
    +
    +
    +# You could also add a top-K parameter as a termination condition
    +def funnel_search(
    +    df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5
    +) -> pd.DataFrame:
    +    # Loop over increasing prefixes of the embeddings
    +    for dims in scales:
    +        # Query vector must be normalized for each new dimensionality
    +        emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))
    +
    +        # Score
    +        scores = df.apply(
    +            functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1
    +        )
    +        df["scores"] = scores
    +
    +        # Re-rank
    +        df = df.sort_values(by="scores", ascending=False)
    +
    +        # Prune (in our case, remove half of candidates at each step)
    +        df = df.head(int(prune_ratio * len(df)))
    +
    +    return df
    +
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, search_data)
    +]
    +
    +
    for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:5]["title"], "\n")
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    + 0           "Pimpernel" Smith
    +1               Black Hunters
    +29    Raiders of the Lost Ark
    +34             The Master Key
    +51            My Gun Is Quick
    +Name: title, dtype: object 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    + 21               How I Live Now
    +32     On the Edge of Innocence
    +77             Bratz: The Movie
    +4                    Unfriended
    +108                  Simon Says
    +Name: title, dtype: object 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    + 9         The Shining
    +0         Ghostkeeper
    +11     Fast and Loose
    +7      Killing Ground
    +12         Home Alone
    +Name: title, dtype: object 
    +
    +

    لقد تمكنا من استعادة التذكر دون إجراء أي عمليات بحث إضافية للمتجهات! من الناحية النوعية، يبدو أن هذه النتائج تتمتع باستدعاء أعلى لفيلمي "Raiders of the Lost Ark" و"The Shining" من البحث المتجه القياسي في البرنامج التعليمي، "البحث عن الأفلام باستخدام ميلفوس ومحوّلات الجمل"، والذي يستخدم نموذج تضمين مختلف. ومع ذلك، فإنه غير قادر على العثور على فيلم "Ferris Bueller's Day Off"، والذي سنعود إليه لاحقًا في هذا الدفتر. (راجع بحث "تعلم تمثيل ماتريوشكا " للاطلاع على المزيد من التجارب الكمية والقياس المعياري).

    +

    لنقارن نتائج بحثنا القمعي بالبحث المتجه القياسي على نفس مجموعة البيانات بنفس نموذج التضمين. نجري بحثًا على التضمينات الكاملة.

    +
    # Search on entire embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=search_data,
    +    anns_field="embedding",
    +    limit=5,
    +    output_fields=["title", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +Raiders of the Lost Ark
    +The Master Key
    +My Gun Is Quick
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +A Walk to Remember
    +Ferris Bueller's Day Off
    +How I Live Now
    +On the Edge of Innocence
    +Bratz: The Movie
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining
    +Ghostkeeper
    +Fast and Loose
    +Killing Ground
    +Home Alone
    +
    +

    باستثناء نتائج البحث عن "مراهق يتظاهر بالمرض للتملص من المدرسة..."، فإن النتائج في إطار البحث القمعي مطابقة تقريبًا للبحث الكامل، على الرغم من أن البحث القمعي أُجري على مساحة بحث من 128 بُعدًا مقابل 768 بُعدًا للبحث العادي.

    +

    التحقيق في فشل استرجاع البحث القمعي في يوم عطلة فيريس بويلر

    لماذا لم ينجح البحث القمعي في استرجاع فيلم Ferris Bueller's Day Off؟ دعونا نفحص ما إذا كان موجودًا في قائمة المرشحين الأصلية أم أنه تمت تصفيته عن طريق الخطأ.

    +
    queries2 = [
    +    "A teenager fakes illness to get off school and have adventures with two friends."
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +instruct_queries = ["search_query: " + q.strip() for q in queries2]
    +search_data2 = embed_search(instruct_queries)
    +head_search2 = [x[:search_dim] for x in search_data2]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search2,
    +    anns_field="head_embedding",
    +    limit=256,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", queries2[0])
    +    for idx, row in enumerate(rows):
    +        if row["title"].strip() == "Ferris Bueller's Day Off":
    +            print(f"Row {idx}: Ferris Bueller's Day Off")
    +
    +
    Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Row 228: Ferris Bueller's Day Off
    +
    +

    نرى أن المشكلة تكمن في أن قائمة المرشحين الأولية لم تكن كبيرة بما فيه الكفاية، أو بالأحرى أن النتيجة المطلوبة ليست مشابهة بما فيه الكفاية للاستعلام على أعلى مستوى من التفصيل. يؤدي تغييره من 128 إلى 256 إلى استرجاع ناجح. يجب أن نشكل قاعدة عامة لتعيين عدد المرشحين في مجموعة المرشحين المحتجزة لتقييم المفاضلة بين الاسترجاع وزمن الاستجابة تجريبيًا.

    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries2, dfs, search_data2)
    +]
    +
    +for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:7]["title"].to_string(index=False), "\n")
    +
    +
    A teenager fakes illness to get off school and have adventures with two friends. 
    +       A Walk to Remember
    +Ferris Bueller's Day Off
    +          How I Live Now
    +On the Edge of Innocence
    +        Bratz: The Movie
    +              Unfriended
    +              Simon Says 
    +
    +

    هل الترتيب مهم؟ تضمين البادئة مقابل تضمين اللاحقة.

    لقد تم تدريب النموذج على الأداء الجيد لمطابقة البادئات الأصغر من التضمينات بشكل متكرر. هل ترتيب الأبعاد التي نستخدمها مهم؟ على سبيل المثال، هل يمكننا أيضًا أخذ مجموعات فرعية من التضمينات التي هي عبارة عن لاحقات؟ في هذه التجربة، نقوم بعكس ترتيب الأبعاد في تضمينات ماتريوشكا ونجري بحثًا قمعيًا.

    +
    client = MilvusClient(uri="./wikiplots-matryoshka-flipped.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +client.create_index(collection_name, index_params)
    +
    +
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +
    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Encode and flip embeddings
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    embeddings = torch.flip(embeddings, dims=[-1])
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:50<00:00,  5.08s/it]
    +
    +
    # Normalize head embeddings
    +
    +flip_search_data = [
    +    torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data
    +]
    +flip_head_search = [x[:search_dim] for x in flip_search_data]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=flip_head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, flip_search_data)
    +]
    +
    +for d in dfs_results:
    +    print(
    +        d["query"],
    +        "\n",
    +        d["results"][:7]["title"].to_string(index=False, header=False),
    +        "\n",
    +    )
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    +       "Pimpernel" Smith
    +          Black Hunters
    +Raiders of the Lost Ark
    +         The Master Key
    +        My Gun Is Quick
    +            The Passage
    +        The Mole People 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    +                       A Walk to Remember
    +                          How I Live Now
    +                              Unfriended
    +Cirque du Freak: The Vampire's Assistant
    +                             Last Summer
    +                                 Contest
    +                                 Day One 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    +         Ghostkeeper
    +     Killing Ground
    +Leopard in the Snow
    +              Stone
    +          Afterglow
    +         Unfaithful
    +     Always a Bride 
    +
    +

    يكون التذكر أضعف بكثير من البحث القمعي أو البحث العادي كما هو متوقع (تم تدريب نموذج التضمين عن طريق التعلم التبايني على بادئات أبعاد التضمين وليس اللواحق).

    +

    ملخص

    فيما يلي مقارنة لنتائج بحثنا عبر الطرق:

    +
    +
    +
    +لقد أوضحنا كيفية استخدام تضمينات ماتريوشكا مع ميلفوس لإجراء خوارزمية بحث دلالي أكثر كفاءة تسمى "البحث القمعي". كما استكشفنا أيضًا أهمية خطوات إعادة الترتيب والتشذيب في الخوارزمية، بالإضافة إلى وضع الفشل عندما تكون قائمة المرشحين الأولية صغيرة جدًا. وأخيرًا، ناقشنا مدى أهمية ترتيب الأبعاد عند تكوين التضمينات الفرعية - يجب أن يكون بنفس الطريقة التي تم تدريب النموذج عليها. أو بالأحرى، فقط لأن النموذج قد تم تدريبه بطريقة معينة بحيث تكون البادئات من التضمينات ذات معنى. أنت تعرف الآن كيفية تنفيذ تضمينات ماتريوشكا والبحث القمعي لتقليل تكاليف تخزين البحث الدلالي دون التضحية بالكثير من أداء الاسترجاع! diff --git a/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.json new file mode 100644 index 000000000..5b3af0278 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import numpy as np\n\nfrom collections import defaultdict\nfrom scipy.sparse import csr_matrix\nfrom pymilvus import MilvusClient\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser, JsonOutputParser\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom tqdm import tqdm\n","milvus_client = MilvusClient(uri=\"./milvus.db\")\n\nllm = ChatOpenAI(\n model=\"gpt-4o\",\n temperature=0,\n)\nembedding_model = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n","nano_dataset = [\n {\n \"passage\": \"Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.\",\n \"triplets\": [\n [\"Jakob Bernoulli\", \"made significant contributions to\", \"calculus\"],\n [\n \"Jakob Bernoulli\",\n \"made significant contributions to\",\n \"the theory of probability\",\n ],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli numbers\"],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli theorem\"],\n [\"The Bernoulli theorem\", \"is a precursor to\", \"the law of large numbers\"],\n [\"Jakob Bernoulli\", \"was the older brother of\", \"Johann Bernoulli\"],\n ],\n },\n {\n \"passage\": \"Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.\",\n \"triplets\": [\n [\n \"Johann Bernoulli\",\n \"was a major figure of\",\n \"the development of calculus\",\n ],\n [\"Johann Bernoulli\", \"was\", \"Jakob's younger brother\"],\n [\"Johann Bernoulli\", \"worked on\", \"infinitesimal calculus\"],\n [\"Johann Bernoulli\", \"was instrumental in spreading\", \"Leibniz's ideas\"],\n [\"Johann Bernoulli\", \"contributed to\", \"the calculus of variations\"],\n [\"Johann Bernoulli\", \"was known for\", \"the brachistochrone problem\"],\n ],\n },\n {\n \"passage\": \"Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.\",\n \"triplets\": [\n [\"Daniel Bernoulli\", \"was the son of\", \"Johann Bernoulli\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"fluid dynamics\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"probability\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"statistics\"],\n [\"Daniel Bernoulli\", \"is most famous for\", \"Bernoulli’s principle\"],\n [\n \"Bernoulli’s principle\",\n \"is fundamental to\",\n \"the understanding of aerodynamics\",\n ],\n ],\n },\n {\n \"passage\": \"Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.\",\n \"triplets\": [\n [\n \"Leonhard Euler\",\n \"had a significant relationship with\",\n \"the Bernoulli family\",\n ],\n [\"leonhard Euler\", \"was born in\", \"Basel\"],\n [\"Leonhard Euler\", \"was a student of\", \"Johann Bernoulli\"],\n [\"Johann Bernoulli's influence\", \"was profound on\", \"Euler\"],\n ],\n },\n]\n","entityid_2_relationids = defaultdict(list)\nrelationid_2_passageids = defaultdict(list)\n\nentities = []\nrelations = []\npassages = []\nfor passage_id, dataset_info in enumerate(nano_dataset):\n passage, triplets = dataset_info[\"passage\"], dataset_info[\"triplets\"]\n passages.append(passage)\n for triplet in triplets:\n if triplet[0] not in entities:\n entities.append(triplet[0])\n if triplet[2] not in entities:\n entities.append(triplet[2])\n relation = \" \".join(triplet)\n if relation not in relations:\n relations.append(relation)\n entityid_2_relationids[entities.index(triplet[0])].append(\n len(relations) - 1\n )\n entityid_2_relationids[entities.index(triplet[2])].append(\n len(relations) - 1\n )\n relationid_2_passageids[relations.index(relation)].append(passage_id)\n","embedding_dim = len(embedding_model.embed_query(\"foo\"))\n\n\ndef create_milvus_collection(collection_name: str):\n if milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n consistency_level=\"Strong\",\n )\n\n\nentity_col_name = \"entity_collection\"\nrelation_col_name = \"relation_collection\"\npassage_col_name = \"passage_collection\"\ncreate_milvus_collection(entity_col_name)\ncreate_milvus_collection(relation_col_name)\ncreate_milvus_collection(passage_col_name)\n","def milvus_insert(\n collection_name: str,\n text_list: list[str],\n):\n batch_size = 512\n for row_id in tqdm(range(0, len(text_list), batch_size), desc=\"Inserting\"):\n batch_texts = text_list[row_id : row_id + batch_size]\n batch_embeddings = embedding_model.embed_documents(batch_texts)\n\n batch_ids = [row_id + j for j in range(len(batch_texts))]\n batch_data = [\n {\n \"id\": id_,\n \"text\": text,\n \"vector\": vector,\n }\n for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)\n ]\n milvus_client.insert(\n collection_name=collection_name,\n data=batch_data,\n )\n\n\nmilvus_insert(\n collection_name=relation_col_name,\n text_list=relations,\n)\n\nmilvus_insert(\n collection_name=entity_col_name,\n text_list=entities,\n)\n\nmilvus_insert(\n collection_name=passage_col_name,\n text_list=passages,\n)\n","query = \"What contribution did the son of Euler's teacher make?\"\n\nquery_ner_list = [\"Euler\"]\n# query_ner_list = ner(query) # In practice, replace it with your custom NER approach\n\nquery_ner_embeddings = [\n embedding_model.embed_query(query_ner) for query_ner in query_ner_list\n]\n\ntop_k = 3\n\nentity_search_res = milvus_client.search(\n collection_name=entity_col_name,\n data=query_ner_embeddings,\n limit=top_k,\n output_fields=[\"id\"],\n)\n\nquery_embedding = embedding_model.embed_query(query)\n\nrelation_search_res = milvus_client.search(\n collection_name=relation_col_name,\n data=[query_embedding],\n limit=top_k,\n output_fields=[\"id\"],\n)[0]\n","# Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.\nentity_relation_adj = np.zeros((len(entities), len(relations)))\nfor entity_id, entity in enumerate(entities):\n entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1\n\n# Convert the adjacency matrix to a sparse matrix for efficient computation.\nentity_relation_adj = csr_matrix(entity_relation_adj)\n\n# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.\nentity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T\nrelation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj\n\n# Specify the target degree of the subgraph to be expanded.\n# 1 or 2 is enough for most cases.\ntarget_degree = 1\n\n# Compute the target degree adjacency matrices using matrix multiplication.\nentity_adj_target_degree = entity_adj_1_degree\nfor _ in range(target_degree - 1):\n entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree\nrelation_adj_target_degree = relation_adj_1_degree\nfor _ in range(target_degree - 1):\n relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree\n\nentity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj\n","expanded_relations_from_relation = set()\nexpanded_relations_from_entity = set()\n# You can set the similarity threshold here to guarantee the quality of the retrieved ones.\n# entity_sim_filter_thresh = ...\n# relation_sim_filter_thresh = ...\n\nfiltered_hit_relation_ids = [\n relation_res[\"entity\"][\"id\"]\n for relation_res in relation_search_res\n # if relation_res['distance'] > relation_sim_filter_thresh\n]\nfor hit_relation_id in filtered_hit_relation_ids:\n expanded_relations_from_relation.update(\n relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()\n )\n\nfiltered_hit_entity_ids = [\n one_entity_res[\"entity\"][\"id\"]\n for one_entity_search_res in entity_search_res\n for one_entity_res in one_entity_search_res\n # if one_entity_res['distance'] > entity_sim_filter_thresh\n]\n\nfor filtered_hit_entity_id in filtered_hit_entity_ids:\n expanded_relations_from_entity.update(\n entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()\n )\n\n# Merge the expanded relations from the relation and entity retrieval ways.\nrelation_candidate_ids = list(\n expanded_relations_from_relation | expanded_relations_from_entity\n)\n\nrelation_candidate_texts = [\n relations[relation_id] for relation_id in relation_candidate_ids\n]\n","query_prompt_one_shot_input = \"\"\"I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.\n\nQuestion:\nWhen was the mother of the leader of the Third Crusade born?\n\nRelationship descriptions:\n[1] Eleanor was born in 1122.\n[2] Eleanor married King Louis VII of France.\n[3] Eleanor was the Duchess of Aquitaine.\n[4] Eleanor participated in the Second Crusade.\n[5] Eleanor had eight children.\n[6] Eleanor was married to Henry II of England.\n[7] Eleanor was the mother of Richard the Lionheart.\n[8] Richard the Lionheart was the King of England.\n[9] Henry II was the father of Richard the Lionheart.\n[10] Henry II was the King of England.\n[11] Richard the Lionheart led the Third Crusade.\n\n\"\"\"\nquery_prompt_one_shot_output = \"\"\"{\"thought_process\": \"To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.\", \"useful_relationships\": [\"[11] Richard the Lionheart led the Third Crusade\", \"[7] Eleanor was the mother of Richard the Lionheart\", \"[1] Eleanor was born in 1122\"]}\"\"\"\n\nquery_prompt_template = \"\"\"Question:\n{question}\n\nRelationship descriptions:\n{relation_des_str}\n\n\"\"\"\n\n\ndef rerank_relations(\n query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]\n) -> list[int]:\n relation_des_str = \"\\n\".join(\n map(\n lambda item: f\"[{item[0]}] {item[1]}\",\n zip(relation_candidate_ids, relation_candidate_texts),\n )\n ).strip()\n rerank_prompts = ChatPromptTemplate.from_messages(\n [\n HumanMessage(query_prompt_one_shot_input),\n AIMessage(query_prompt_one_shot_output),\n HumanMessagePromptTemplate.from_template(query_prompt_template),\n ]\n )\n rerank_chain = (\n rerank_prompts\n | llm.bind(response_format={\"type\": \"json_object\"})\n | JsonOutputParser()\n )\n rerank_res = rerank_chain.invoke(\n {\"question\": query, \"relation_des_str\": relation_des_str}\n )\n rerank_relation_ids = []\n rerank_relation_lines = rerank_res[\"useful_relationships\"]\n id_2_lines = {}\n for line in rerank_relation_lines:\n id_ = int(line[line.find(\"[\") + 1 : line.find(\"]\")])\n id_2_lines[id_] = line.strip()\n rerank_relation_ids.append(id_)\n return rerank_relation_ids\n\n\nrerank_relation_ids = rerank_relations(\n query,\n relation_candidate_texts=relation_candidate_texts,\n relation_candidate_ids=relation_candidate_ids,\n)\n","final_top_k = 2\n\nfinal_passages = []\nfinal_passage_ids = []\nfor relation_id in rerank_relation_ids:\n for passage_id in relationid_2_passageids[relation_id]:\n if passage_id not in final_passage_ids:\n final_passage_ids.append(passage_id)\n final_passages.append(passages[passage_id])\npassages_from_our_method = final_passages[:final_top_k]\n","naive_passage_res = milvus_client.search(\n collection_name=passage_col_name,\n data=[query_embedding],\n limit=final_top_k,\n output_fields=[\"text\"],\n)[0]\npassages_from_naive_rag = [res[\"entity\"][\"text\"] for res in naive_passage_res]\n\nprint(\n f\"Passages retrieved from naive RAG: \\n{passages_from_naive_rag}\\n\\n\"\n f\"Passages retrieved from our method: \\n{passages_from_our_method}\\n\\n\"\n)\n\n\nprompt = ChatPromptTemplate.from_messages(\n [\n (\n \"human\",\n \"\"\"Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.\nQuestion: {question}\nContext: {context}\nAnswer:\"\"\",\n )\n ]\n)\n\nrag_chain = prompt | llm | StrOutputParser()\n\nanswer_from_naive_rag = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_naive_rag)}\n)\nanswer_from_our_method = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_our_method)}\n)\n\nprint(\n f\"Answer from naive RAG: {answer_from_naive_rag}\\n\\nAnswer from our method: {answer_from_our_method}\"\n)\n"],"headingContent":"Graph RAG with Milvus","anchorList":[{"label":"الرسم البياني RAG مع ميلفوس","href":"Graph-RAG-with-Milvus","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"تحميل البيانات دون اتصال بالإنترنت","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"الاستعلام عبر الإنترنت","href":"Online-Querying","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.md new file mode 100644 index 000000000..34fac8b85 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/graph_rag_with_milvus.md @@ -0,0 +1,509 @@ +--- +id: graph_rag_with_milvus.md +summary: الرسم البياني RAG مع ميلفوس +title: الرسم البياني RAG مع ميلفوس +--- +

    الرسم البياني RAG مع ميلفوس

    Open In Colab +GitHub Repository

    +

    يُبرز التطبيق الواسع النطاق للنماذج اللغوية الكبيرة أهمية تحسين دقة وملاءمة استجاباتها. يعمل التوليد المعزّز للاسترجاع (RAG) على تعزيز النماذج بقواعد معرفية خارجية، مما يوفر المزيد من المعلومات السياقية ويخفف من مشاكل مثل الهلوسة والمعرفة غير الكافية. ومع ذلك، فإن الاعتماد فقط على نماذج RAG البسيطة له حدوده، خاصةً عند التعامل مع علاقات الكيانات المعقدة والأسئلة متعددة القفزات، حيث غالبًا ما يكافح النموذج لتقديم إجابات دقيقة.

    +

    يوفر إدخال الرسوم البيانية المعرفية (KGs) في نظام RAG حلاً جديدًا. تقدم KGs الكيانات وعلاقاتها بطريقة منظمة، مما يوفر معلومات استرجاع أكثر دقة ويساعد RAG على التعامل بشكل أفضل مع مهام الإجابة عن الأسئلة المعقدة. لا يزال نظام KG-RAG في مراحله المبكرة، ولا يوجد إجماع على كيفية استرجاع الكيانات والعلاقات من KGs بشكل فعال أو كيفية دمج البحث عن التشابه المتجه مع هياكل الرسم البياني.

    +

    في هذا الدفتر، نقدم في هذا الدفتر نهجًا بسيطًا ولكنه قوي لتحسين أداء هذا السيناريو بشكل كبير. وهو عبارة عن نموذج RAG بسيط مع استرجاع متعدد الاتجاهات ثم إعادة ترتيبها، ولكنه يطبق RAG Graph RAG منطقيًا، ويحقق أداءً متطورًا في التعامل مع الأسئلة متعددة القفزات. دعونا نرى كيف يتم تنفيذه.

    +

    + + + + +

    +

    المتطلبات الأساسية

    قبل تشغيل هذا الدفتر، تأكد من تثبيت التبعيات التالية:

    +
    $ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +
    +

    سنستخدم النماذج من OpenAI. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    قم باستيراد المكتبات والتبعيات اللازمة.

    +
    import numpy as np
    +
    +from collections import defaultdict
    +from scipy.sparse import csr_matrix
    +from pymilvus import MilvusClient
    +from langchain_core.messages import AIMessage, HumanMessage
    +from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
    +from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from tqdm import tqdm
    +
    +

    قم بتهيئة مثيل عميل Milvus، وLLM، ونموذج التضمين.

    +
    milvus_client = MilvusClient(uri="./milvus.db")
    +
    +llm = ChatOpenAI(
    +    model="gpt-4o",
    +    temperature=0,
    +)
    +embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +
    +

    بالنسبة للوسيطات في MilvusClient:

    +
      +
    • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث أنها تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +

    تحميل البيانات دون اتصال بالإنترنت

    إعداد البيانات

    سوف نستخدم مجموعة بيانات النانو التي تقدم العلاقة بين عائلة برنولي وأويلر للتوضيح كمثال. تحتوي مجموعة بيانات النانو على 4 مقاطع ومجموعة من الثلاثيات المقابلة، حيث يحتوي كل ثلاثي على موضوع ومسند وكائن. عمليًا، يمكنك استخدام أي نهج لاستخراج الثلاثيات من مجموعة البيانات المخصصة الخاصة بك.

    +
    nano_dataset = [
    +    {
    +        "passage": "Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.",
    +        "triplets": [
    +            ["Jakob Bernoulli", "made significant contributions to", "calculus"],
    +            [
    +                "Jakob Bernoulli",
    +                "made significant contributions to",
    +                "the theory of probability",
    +            ],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli numbers"],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli theorem"],
    +            ["The Bernoulli theorem", "is a precursor to", "the law of large numbers"],
    +            ["Jakob Bernoulli", "was the older brother of", "Johann Bernoulli"],
    +        ],
    +    },
    +    {
    +        "passage": "Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.",
    +        "triplets": [
    +            [
    +                "Johann Bernoulli",
    +                "was a major figure of",
    +                "the development of calculus",
    +            ],
    +            ["Johann Bernoulli", "was", "Jakob's younger brother"],
    +            ["Johann Bernoulli", "worked on", "infinitesimal calculus"],
    +            ["Johann Bernoulli", "was instrumental in spreading", "Leibniz's ideas"],
    +            ["Johann Bernoulli", "contributed to", "the calculus of variations"],
    +            ["Johann Bernoulli", "was known for", "the brachistochrone problem"],
    +        ],
    +    },
    +    {
    +        "passage": "Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.",
    +        "triplets": [
    +            ["Daniel Bernoulli", "was the son of", "Johann Bernoulli"],
    +            ["Daniel Bernoulli", "made major contributions to", "fluid dynamics"],
    +            ["Daniel Bernoulli", "made major contributions to", "probability"],
    +            ["Daniel Bernoulli", "made major contributions to", "statistics"],
    +            ["Daniel Bernoulli", "is most famous for", "Bernoulli’s principle"],
    +            [
    +                "Bernoulli’s principle",
    +                "is fundamental to",
    +                "the understanding of aerodynamics",
    +            ],
    +        ],
    +    },
    +    {
    +        "passage": "Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.",
    +        "triplets": [
    +            [
    +                "Leonhard Euler",
    +                "had a significant relationship with",
    +                "the Bernoulli family",
    +            ],
    +            ["leonhard Euler", "was born in", "Basel"],
    +            ["Leonhard Euler", "was a student of", "Johann Bernoulli"],
    +            ["Johann Bernoulli's influence", "was profound on", "Euler"],
    +        ],
    +    },
    +]
    +
    +

    نقوم ببناء الكيانات والعلاقات على النحو التالي:

    +
      +
    • الكيان هو الفاعل أو المفعول به في الثلاثية، لذلك نستخرجها مباشرةً من الثلاثيات.
    • +
    • نقوم هنا ببناء مفهوم العلاقة من خلال الربط المباشر بين الفاعل والمصدر والمفعول به والمفعول به مع وضع مسافة بينهما.
    • +
    +

    نقوم أيضًا بإعداد إملاء لتحويل معرف الكيان إلى معرف العلاقة، وإملاء آخر لتحويل معرف العلاقة إلى معرف المقطع لاستخدامه لاحقًا.

    +
    entityid_2_relationids = defaultdict(list)
    +relationid_2_passageids = defaultdict(list)
    +
    +entities = []
    +relations = []
    +passages = []
    +for passage_id, dataset_info in enumerate(nano_dataset):
    +    passage, triplets = dataset_info["passage"], dataset_info["triplets"]
    +    passages.append(passage)
    +    for triplet in triplets:
    +        if triplet[0] not in entities:
    +            entities.append(triplet[0])
    +        if triplet[2] not in entities:
    +            entities.append(triplet[2])
    +        relation = " ".join(triplet)
    +        if relation not in relations:
    +            relations.append(relation)
    +            entityid_2_relationids[entities.index(triplet[0])].append(
    +                len(relations) - 1
    +            )
    +            entityid_2_relationids[entities.index(triplet[2])].append(
    +                len(relations) - 1
    +            )
    +        relationid_2_passageids[relations.index(relation)].append(passage_id)
    +
    +

    إدراج البيانات

    إنشاء مجموعات ميلفوس للكيان والعلاقة والممر. يتم استخدام مجموعة الكيانات ومجموعة العلاقات كمجموعات رئيسية لبناء الرسم البياني في طريقتنا، بينما يتم استخدام مجموعة الممرات كمقارنة استرجاع RAG الساذجة أو لغرض مساعد.

    +
    embedding_dim = len(embedding_model.embed_query("foo"))
    +
    +
    +def create_milvus_collection(collection_name: str):
    +    if milvus_client.has_collection(collection_name=collection_name):
    +        milvus_client.drop_collection(collection_name=collection_name)
    +    milvus_client.create_collection(
    +        collection_name=collection_name,
    +        dimension=embedding_dim,
    +        consistency_level="Strong",
    +    )
    +
    +
    +entity_col_name = "entity_collection"
    +relation_col_name = "relation_collection"
    +passage_col_name = "passage_collection"
    +create_milvus_collection(entity_col_name)
    +create_milvus_collection(relation_col_name)
    +create_milvus_collection(passage_col_name)
    +
    +

    إدراج البيانات مع معلومات البيانات الوصفية الخاصة بها في مجموعات Milvus، بما في ذلك مجموعات الكيانات والعلاقات والممرات. تتضمن معلومات البيانات الوصفية معرّف المقطع ومعرّف الكيان أو معرّف العلاقة.

    +
    def milvus_insert(
    +    collection_name: str,
    +    text_list: list[str],
    +):
    +    batch_size = 512
    +    for row_id in tqdm(range(0, len(text_list), batch_size), desc="Inserting"):
    +        batch_texts = text_list[row_id : row_id + batch_size]
    +        batch_embeddings = embedding_model.embed_documents(batch_texts)
    +
    +        batch_ids = [row_id + j for j in range(len(batch_texts))]
    +        batch_data = [
    +            {
    +                "id": id_,
    +                "text": text,
    +                "vector": vector,
    +            }
    +            for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)
    +        ]
    +        milvus_client.insert(
    +            collection_name=collection_name,
    +            data=batch_data,
    +        )
    +
    +
    +milvus_insert(
    +    collection_name=relation_col_name,
    +    text_list=relations,
    +)
    +
    +milvus_insert(
    +    collection_name=entity_col_name,
    +    text_list=entities,
    +)
    +
    +milvus_insert(
    +    collection_name=passage_col_name,
    +    text_list=passages,
    +)
    +
    +
    Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.02it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.39it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  2.28it/s]
    +
    +

    الاستعلام عبر الإنترنت

    استرجاع التشابه

    نقوم باسترجاع أعلى K كيانات وعلاقات متشابهة بناءً على استعلام الإدخال من Milvus.

    +

    عند إجراء عملية استرجاع الكيانات، يجب علينا أولاً استخراج كيانات الاستعلام من نص الاستعلام باستخدام طريقة معينة مثل NER (التعرف على الكيانات المسماة). للتبسيط، نقوم بإعداد نتائج NER هنا. إذا كنت ترغب في تغيير الاستعلام كسؤالك المخصص، فعليك تغيير قائمة NER للاستعلام المقابلة. من الناحية العملية، يمكنك استخدام أي نموذج أو نهج آخر لاستخراج الكيانات من الاستعلام.

    +
    query = "What contribution did the son of Euler's teacher make?"
    +
    +query_ner_list = ["Euler"]
    +# query_ner_list = ner(query) # In practice, replace it with your custom NER approach
    +
    +query_ner_embeddings = [
    +    embedding_model.embed_query(query_ner) for query_ner in query_ner_list
    +]
    +
    +top_k = 3
    +
    +entity_search_res = milvus_client.search(
    +    collection_name=entity_col_name,
    +    data=query_ner_embeddings,
    +    limit=top_k,
    +    output_fields=["id"],
    +)
    +
    +query_embedding = embedding_model.embed_query(query)
    +
    +relation_search_res = milvus_client.search(
    +    collection_name=relation_col_name,
    +    data=[query_embedding],
    +    limit=top_k,
    +    output_fields=["id"],
    +)[0]
    +
    +

    توسيع الرسم البياني الفرعي

    نحن نستخدم الكيانات والعلاقات المسترجعة لتوسيع المخطط الفرعي والحصول على العلاقات المرشحة، ثم دمجها من الطريقتين. فيما يلي مخطط انسيابي لعملية توسيع المخطط الفرعي: + + + +

    +

    نقوم هنا ببناء مصفوفة تجاور ونستخدم عملية ضرب المصفوفات لحساب معلومات تخطيط التجاور في حدود بضع درجات. بهذه الطريقة، يمكننا الحصول بسرعة على معلومات أي درجة من درجات التوسيع.

    +
    # Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.
    +entity_relation_adj = np.zeros((len(entities), len(relations)))
    +for entity_id, entity in enumerate(entities):
    +    entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1
    +
    +# Convert the adjacency matrix to a sparse matrix for efficient computation.
    +entity_relation_adj = csr_matrix(entity_relation_adj)
    +
    +# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.
    +entity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T
    +relation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj
    +
    +# Specify the target degree of the subgraph to be expanded.
    +# 1 or 2 is enough for most cases.
    +target_degree = 1
    +
    +# Compute the target degree adjacency matrices using matrix multiplication.
    +entity_adj_target_degree = entity_adj_1_degree
    +for _ in range(target_degree - 1):
    +    entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree
    +relation_adj_target_degree = relation_adj_1_degree
    +for _ in range(target_degree - 1):
    +    relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree
    +
    +entity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj
    +
    +

    من خلال أخذ القيمة من مصفوفة توسيع الدرجة المستهدفة، يمكننا بسهولة توسيع الدرجة المقابلة من الكيان والعلاقات المسترجعة للحصول على جميع علاقات المخطط الفرعي.

    +
    expanded_relations_from_relation = set()
    +expanded_relations_from_entity = set()
    +# You can set the similarity threshold here to guarantee the quality of the retrieved ones.
    +# entity_sim_filter_thresh = ...
    +# relation_sim_filter_thresh = ...
    +
    +filtered_hit_relation_ids = [
    +    relation_res["entity"]["id"]
    +    for relation_res in relation_search_res
    +    # if relation_res['distance'] > relation_sim_filter_thresh
    +]
    +for hit_relation_id in filtered_hit_relation_ids:
    +    expanded_relations_from_relation.update(
    +        relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()
    +    )
    +
    +filtered_hit_entity_ids = [
    +    one_entity_res["entity"]["id"]
    +    for one_entity_search_res in entity_search_res
    +    for one_entity_res in one_entity_search_res
    +    # if one_entity_res['distance'] > entity_sim_filter_thresh
    +]
    +
    +for filtered_hit_entity_id in filtered_hit_entity_ids:
    +    expanded_relations_from_entity.update(
    +        entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()
    +    )
    +
    +# Merge the expanded relations from the relation and entity retrieval ways.
    +relation_candidate_ids = list(
    +    expanded_relations_from_relation | expanded_relations_from_entity
    +)
    +
    +relation_candidate_texts = [
    +    relations[relation_id] for relation_id in relation_candidate_ids
    +]
    +
    +

    لقد حصلنا على العلاقات المرشحة من خلال توسيع المخطط الفرعي، والتي سيتم إعادة ترتيبها بواسطة LLM في الخطوة التالية.

    +

    إعادة ترتيب LLM

    في هذه المرحلة، نستخدم آلية الانتباه الذاتي القوية ل LLM لتصفية مجموعة العلاقات المرشحة وتنقيحها. نستخدم مطالبة من لقطة واحدة، حيث ندمج الاستعلام ومجموعة العلاقات المرشحة في المطالبة، ونوجه LLM لاختيار العلاقات المحتملة التي يمكن أن تساعد في الإجابة عن الاستعلام. ونظرًا لأن بعض الاستفسارات قد تكون معقدة، فإننا نعتمد نهج تسلسل الأفكار، مما يسمح ل LLM بتوضيح عملية التفكير في إجابته. نشترط أن تكون استجابة LLM بصيغة json من أجل التحليل المريح.

    +
    query_prompt_one_shot_input = """I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.
    +
    +Question:
    +When was the mother of the leader of the Third Crusade born?
    +
    +Relationship descriptions:
    +[1] Eleanor was born in 1122.
    +[2] Eleanor married King Louis VII of France.
    +[3] Eleanor was the Duchess of Aquitaine.
    +[4] Eleanor participated in the Second Crusade.
    +[5] Eleanor had eight children.
    +[6] Eleanor was married to Henry II of England.
    +[7] Eleanor was the mother of Richard the Lionheart.
    +[8] Richard the Lionheart was the King of England.
    +[9] Henry II was the father of Richard the Lionheart.
    +[10] Henry II was the King of England.
    +[11] Richard the Lionheart led the Third Crusade.
    +
    +"""
    +query_prompt_one_shot_output = """{"thought_process": "To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.", "useful_relationships": ["[11] Richard the Lionheart led the Third Crusade", "[7] Eleanor was the mother of Richard the Lionheart", "[1] Eleanor was born in 1122"]}"""
    +
    +query_prompt_template = """Question:
    +{question}
    +
    +Relationship descriptions:
    +{relation_des_str}
    +
    +"""
    +
    +
    +def rerank_relations(
    +    query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]
    +) -> list[int]:
    +    relation_des_str = "\n".join(
    +        map(
    +            lambda item: f"[{item[0]}] {item[1]}",
    +            zip(relation_candidate_ids, relation_candidate_texts),
    +        )
    +    ).strip()
    +    rerank_prompts = ChatPromptTemplate.from_messages(
    +        [
    +            HumanMessage(query_prompt_one_shot_input),
    +            AIMessage(query_prompt_one_shot_output),
    +            HumanMessagePromptTemplate.from_template(query_prompt_template),
    +        ]
    +    )
    +    rerank_chain = (
    +        rerank_prompts
    +        | llm.bind(response_format={"type": "json_object"})
    +        | JsonOutputParser()
    +    )
    +    rerank_res = rerank_chain.invoke(
    +        {"question": query, "relation_des_str": relation_des_str}
    +    )
    +    rerank_relation_ids = []
    +    rerank_relation_lines = rerank_res["useful_relationships"]
    +    id_2_lines = {}
    +    for line in rerank_relation_lines:
    +        id_ = int(line[line.find("[") + 1 : line.find("]")])
    +        id_2_lines[id_] = line.strip()
    +        rerank_relation_ids.append(id_)
    +    return rerank_relation_ids
    +
    +
    +rerank_relation_ids = rerank_relations(
    +    query,
    +    relation_candidate_texts=relation_candidate_texts,
    +    relation_candidate_ids=relation_candidate_ids,
    +)
    +
    +

    الحصول على النتائج النهائية

    يمكننا الحصول على المقاطع النهائية المسترجعة من العلاقات المعاد ترتيبها.

    +
    final_top_k = 2
    +
    +final_passages = []
    +final_passage_ids = []
    +for relation_id in rerank_relation_ids:
    +    for passage_id in relationid_2_passageids[relation_id]:
    +        if passage_id not in final_passage_ids:
    +            final_passage_ids.append(passage_id)
    +            final_passages.append(passages[passage_id])
    +passages_from_our_method = final_passages[:final_top_k]
    +
    +

    يمكننا مقارنة النتائج مع طريقة RAG الساذجة التي تسترجع المقاطع الأعلىK بناءً على تضمين الاستعلام مباشرةً من مجموعة المقاطع.

    +
    naive_passage_res = milvus_client.search(
    +    collection_name=passage_col_name,
    +    data=[query_embedding],
    +    limit=final_top_k,
    +    output_fields=["text"],
    +)[0]
    +passages_from_naive_rag = [res["entity"]["text"] for res in naive_passage_res]
    +
    +print(
    +    f"Passages retrieved from naive RAG: \n{passages_from_naive_rag}\n\n"
    +    f"Passages retrieved from our method: \n{passages_from_our_method}\n\n"
    +)
    +
    +
    +prompt = ChatPromptTemplate.from_messages(
    +    [
    +        (
    +            "human",
    +            """Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.
    +Question: {question}
    +Context: {context}
    +Answer:""",
    +        )
    +    ]
    +)
    +
    +rag_chain = prompt | llm | StrOutputParser()
    +
    +answer_from_naive_rag = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_naive_rag)}
    +)
    +answer_from_our_method = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_our_method)}
    +)
    +
    +print(
    +    f"Answer from naive RAG: {answer_from_naive_rag}\n\nAnswer from our method: {answer_from_our_method}"
    +)
    +
    +
    Passages retrieved from naive RAG: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.']
    +
    +Passages retrieved from our method: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.']
    +
    +
    +Answer from naive RAG: I don't know. The retrieved context does not provide information about the contributions made by the son of Euler's teacher.
    +
    +Answer from our method: The son of Euler's teacher, Daniel Bernoulli, made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.
    +
    +

    كما نرى أن المقاطع التي تم استرجاعها من طريقة RAG الساذجة أخطأت في استرجاع مقطع أساسي صحيح مما أدى إلى إجابة خاطئة. أما المقاطع المسترجعة من طريقتنا فهي صحيحة، وتساعد في الحصول على إجابة دقيقة للسؤال.

    diff --git a/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.json new file mode 100644 index 000000000..1b011fbe1 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install hdbscan\n$ pip install plotly\n$ pip install umap-learn\n","import pandas as pd\nfrom dotenv import load_dotenv\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType\n\nload_dotenv()\n\ndf = pd.read_csv(\"news_data_dedup.csv\")\n\n\ndocs = [\n f\"{title}\\n{description}\" for title, description in zip(df.title, df.description)\n]\nef = BGEM3EmbeddingFunction()\n\nembeddings = ef(docs)[\"dense\"]\n\nconnections.connect(uri=\"milvus.db\")\n","fields = [\n FieldSchema(\n name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True\n ), # Primary ID field\n FieldSchema(\n name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=1024\n ), # Float vector field (embedding)\n FieldSchema(\n name=\"text\", dtype=DataType.VARCHAR, max_length=65535\n ), # Float vector field (embedding)\n]\n\nschema = CollectionSchema(fields=fields, description=\"Embedding collection\")\n\ncollection = Collection(name=\"news_data\", schema=schema)\n\nfor doc, embedding in zip(docs, embeddings):\n collection.insert({\"text\": doc, \"embedding\": embedding})\n print(doc)\n\nindex_params = {\"index_type\": \"FLAT\", \"metric_type\": \"L2\", \"params\": {}}\n\ncollection.create_index(field_name=\"embedding\", index_params=index_params)\n\ncollection.flush()\n","import hdbscan\nimport numpy as np\nimport pandas as pd\nimport plotly.express as px\nfrom umap import UMAP\nfrom pymilvus import Collection\n\ncollection = Collection(name=\"news_data\")\ncollection.load()\n\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"embedding\"]\n)\n\nsearch_params = {\n \"metric_type\": \"L2\",\n \"params\": {\"nprobe\": 10},\n} # L2 is Euclidean distance\n\nids = []\ndist = {}\n\nembeddings = []\n","while True:\n batch = iterator.next()\n batch_ids = [data[\"id\"] for data in batch]\n ids.extend(batch_ids)\n\n query_vectors = [data[\"embedding\"] for data in batch]\n embeddings.extend(query_vectors)\n\n results = collection.search(\n data=query_vectors,\n limit=50,\n anns_field=\"embedding\",\n param=search_params,\n output_fields=[\"id\"],\n )\n for i, batch_id in enumerate(batch_ids):\n dist[batch_id] = []\n for result in results[i]:\n dist[batch_id].append((result.id, result.distance))\n\n if len(batch) == 0:\n break\n\nids2index = {}\n\nfor id in dist:\n ids2index[id] = len(ids2index)\n\ndist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)\n\nfor id in dist:\n for result in dist[id]:\n dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]\n\nh = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric=\"precomputed\")\nhdb = h.fit(dist_metric)\n","import plotly.io as pio\n\npio.renderers.default = \"notebook\"\n\numap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)\n\ndf_umap = (\n pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=[\"x\", \"y\"])\n .assign(cluster=lambda df: hdb.labels_.astype(str))\n .query('cluster != \"-1\"')\n .sort_values(by=\"cluster\")\n)\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"text\"]\n)\n\nids = []\ntexts = []\n\nwhile True:\n batch = iterator.next()\n if len(batch) == 0:\n break\n batch_ids = [data[\"id\"] for data in batch]\n batch_texts = [data[\"text\"] for data in batch]\n ids.extend(batch_ids)\n texts.extend(batch_texts)\n\nshow_texts = [texts[i] for i in df_umap.index]\n\ndf_umap[\"hover_text\"] = show_texts\nfig = px.scatter(\n df_umap, x=\"x\", y=\"y\", color=\"cluster\", hover_data={\"hover_text\": True}\n)\nfig.show()\n"],"headingContent":"HDBSCAN Clustering with Milvus","anchorList":[{"label":"تجميع HDBSCAN مع ميلفوس","href":"HDBSCAN-Clustering-with-Milvus","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"تنزيل البيانات","href":"Download-Data","type":2,"isActive":false},{"label":"استخراج التضمينات إلى ميلفوس","href":"Extract-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"إنشاء مصفوفة المسافة لـ HDBSCAN","href":"Construct-the-Distance-Matrix-for-HDBSCAN","type":2,"isActive":false},{"label":"تصوّر المجموعات باستخدام UMAP","href":"Clusters-Visualization-using-UMAP","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.md new file mode 100644 index 000000000..6e26672bd --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/hdbscan_clustering_with_milvus.md @@ -0,0 +1,275 @@ +--- +id: hdbscan_clustering_with_milvus.md +summary: >- + في هذا الدفتر، سوف نستخدم نموذج التضمين BGE-M3 لاستخراج التضمينات من مجموعة + بيانات عناوين الأخبار، واستخدام Milvus لحساب المسافات بين التضمينات بكفاءة + لمساعدة HDBSCAN في التجميع، ثم تصور النتائج للتحليل باستخدام طريقة UMAP. هذا + الدفتر عبارة عن تعديل لمقال ديلان كاستيلو من Milvus. +title: تجميع HDBSCAN مع ميلفوس +--- +

    تجميع HDBSCAN مع ميلفوس

    +Open In Colab + + +GitHub Repository +

    +

    يمكن تحويل البيانات إلى تجميعات باستخدام نماذج التعلم العميق، والتي تلتقط تمثيلات ذات معنى للبيانات الأصلية. من خلال تطبيق خوارزمية تجميع غير خاضعة للإشراف، يمكننا تجميع نقاط البيانات المتشابهة معًا استنادًا إلى أنماطها المتأصلة. HDBSCAN (التجميع المكاني القائم على الكثافة الهرمي للتطبيقات مع الضوضاء) هي خوارزمية تجميع مستخدمة على نطاق واسع تقوم بتجميع نقاط البيانات بكفاءة من خلال تحليل كثافتها ومسافتها. وهي مفيدة بشكل خاص لاكتشاف التكتلات ذات الأشكال والأحجام المختلفة. في هذا الدفتر، سنستخدم HDBSCAN مع قاعدة بيانات Milvus، وهي قاعدة بيانات متجهة عالية الأداء، لتجميع نقاط البيانات في مجموعات متميزة بناءً على تضميناتها.

    +

    HDBSCAN (التجميع المكاني القائم على الكثافة الهرمية للتطبيقات مع الضوضاء) هي خوارزمية تجميع تعتمد على حساب المسافات بين نقاط البيانات في مساحة التضمين. تمثل هذه التضمينات، التي تم إنشاؤها بواسطة نماذج التعلم العميق، البيانات في شكل عالي الأبعاد. لتجميع نقاط البيانات المتشابهة، تحدد HDBSCAN تقاربها وكثافتها، ولكن قد يكون حساب هذه المسافات بكفاءة، خاصةً بالنسبة لمجموعات البيانات الكبيرة، أمرًا صعبًا.

    +

    تعمل قاعدة بيانات Milvus، وهي قاعدة بيانات متجهات عالية الأداء، على تحسين هذه العملية من خلال تخزين وفهرسة التضمينات، مما يسمح باسترجاع سريع للمتجهات المتشابهة. عند استخدامهما معًا، يتيح كل من HDBSCAN و Milvus تجميع مجموعات البيانات واسعة النطاق بكفاءة في مساحة التضمين.

    +

    في هذا الدفتر، سوف نستخدم نموذج التضمين BGE-M3 لاستخراج التضمينات من مجموعة بيانات عناوين الأخبار، واستخدام Milvus لحساب المسافات بين التضمينات بكفاءة لمساعدة HDBSCAN في التجميع، ثم تصور النتائج للتحليل باستخدام طريقة UMAP. هذا الدفتر عبارة عن تعديل لمقالة ديلان كاستيلو من Milvus.

    +

    التحضير

    تنزيل مجموعة بيانات الأخبار من https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/

    +
    $ pip install "pymilvus[model]"
    +$ pip install hdbscan
    +$ pip install plotly
    +$ pip install umap-learn
    +
    +

    تنزيل البيانات

    تنزيل مجموعة بيانات الأخبار من https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/، واستخراج news_data_dedup.csv ووضعها في الدليل الحالي.

    +

    استخراج التضمينات إلى ميلفوس

    سننشئ مجموعة باستخدام Milvus، ونستخرج تضمينات كثيفة باستخدام نموذج BGE-M3.

    +
    import pandas as pd
    +from dotenv import load_dotenv
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType
    +
    +load_dotenv()
    +
    +df = pd.read_csv("news_data_dedup.csv")
    +
    +
    +docs = [
    +    f"{title}\n{description}" for title, description in zip(df.title, df.description)
    +]
    +ef = BGEM3EmbeddingFunction()
    +
    +embeddings = ef(docs)["dense"]
    +
    +connections.connect(uri="milvus.db")
    +
    +
    +
      +
    • إذا كنت تحتاج فقط إلى قاعدة بيانات متجهية محلية للبيانات الصغيرة الحجم أو النماذج الأولية، فإن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين خاصية المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
    • +
    • إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المُدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
    • +
    +
    +
    fields = [
    +    FieldSchema(
    +        name="id", dtype=DataType.INT64, is_primary=True, auto_id=True
    +    ),  # Primary ID field
    +    FieldSchema(
    +        name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024
    +    ),  # Float vector field (embedding)
    +    FieldSchema(
    +        name="text", dtype=DataType.VARCHAR, max_length=65535
    +    ),  # Float vector field (embedding)
    +]
    +
    +schema = CollectionSchema(fields=fields, description="Embedding collection")
    +
    +collection = Collection(name="news_data", schema=schema)
    +
    +for doc, embedding in zip(docs, embeddings):
    +    collection.insert({"text": doc, "embedding": embedding})
    +    print(doc)
    +
    +index_params = {"index_type": "FLAT", "metric_type": "L2", "params": {}}
    +
    +collection.create_index(field_name="embedding", index_params=index_params)
    +
    +collection.flush()
    +
    +

    إنشاء مصفوفة المسافة لـ HDBSCAN

    يتطلب HDBSCAN حساب المسافات بين النقاط من أجل التجميع، وهو ما يمكن أن يكون مكثفاً من الناحية الحسابية. نظرًا لأن النقاط البعيدة لها تأثير أقل على تعيينات التجميع، يمكننا تحسين الكفاءة من خلال حساب أقرب الجيران الأعلى-ك. في هذا المثال، نستخدم فهرس FLAT، ولكن بالنسبة لمجموعات البيانات واسعة النطاق، يدعم Milvus طرق فهرسة أكثر تقدمًا لتسريع عملية البحث. أولاً، نحتاج أولاً إلى الحصول على مكرر لتكرار مجموعة Milvus التي أنشأناها سابقًا.

    +
    import hdbscan
    +import numpy as np
    +import pandas as pd
    +import plotly.express as px
    +from umap import UMAP
    +from pymilvus import Collection
    +
    +collection = Collection(name="news_data")
    +collection.load()
    +
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "embedding"]
    +)
    +
    +search_params = {
    +    "metric_type": "L2",
    +    "params": {"nprobe": 10},
    +}  # L2 is Euclidean distance
    +
    +ids = []
    +dist = {}
    +
    +embeddings = []
    +
    +

    سنقوم بتكرار جميع التضمينات في مجموعة ميلفوس. لكل تضمين، سنبحث في كل تضمين عن جيرانه الأعلى-ك في نفس المجموعة، ونحصل على معرّفاتهم ومسافاتهم. ثم نحتاج أيضًا إلى إنشاء قاموس لتعيين المعرف الأصلي إلى فهرس متصل في مصفوفة المسافة. عند الانتهاء، نحتاج إلى إنشاء مصفوفة المسافة التي تمت تهيئتها بجميع العناصر على أنها ما لا نهاية وملء العناصر التي بحثنا عنها. بهذه الطريقة، سيتم تجاهل المسافة بين النقاط البعيدة. أخيرًا نستخدم مكتبة HDBSCAN لتجميع النقاط باستخدام مصفوفة المسافة التي أنشأناها. نحتاج إلى ضبط المقياس على "محسوب مسبقاً" للإشارة إلى أن البيانات هي مصفوفة المسافة بدلاً من التضمينات الأصلية.

    +
    while True:
    +    batch = iterator.next()
    +    batch_ids = [data["id"] for data in batch]
    +    ids.extend(batch_ids)
    +
    +    query_vectors = [data["embedding"] for data in batch]
    +    embeddings.extend(query_vectors)
    +
    +    results = collection.search(
    +        data=query_vectors,
    +        limit=50,
    +        anns_field="embedding",
    +        param=search_params,
    +        output_fields=["id"],
    +    )
    +    for i, batch_id in enumerate(batch_ids):
    +        dist[batch_id] = []
    +        for result in results[i]:
    +            dist[batch_id].append((result.id, result.distance))
    +
    +    if len(batch) == 0:
    +        break
    +
    +ids2index = {}
    +
    +for id in dist:
    +    ids2index[id] = len(ids2index)
    +
    +dist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)
    +
    +for id in dist:
    +    for result in dist[id]:
    +        dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]
    +
    +h = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric="precomputed")
    +hdb = h.fit(dist_metric)
    +
    +

    بعد ذلك، ينتهي تجميع HDBSCAN. يمكننا الحصول على بعض البيانات وإظهار مجموعتها. لاحظ أن بعض البيانات لن يتم تعيينها إلى أي مجموعة، مما يعني أنها ضوضاء، لأنها تقع في منطقة متناثرة.

    +

    تصوّر المجموعات باستخدام UMAP

    لقد قمنا بالفعل بتجميع البيانات باستخدام HDBSCAN ويمكننا الحصول على التسميات لكل نقطة بيانات. لكن باستخدام بعض تقنيات التصوّر، يمكننا الحصول على الصورة الكاملة للمجموعات لتحليل حدسي. سنستخدم الآن UMAP لتصور المجموعات. UMAP هي طريقة فعّالة تُستخدم لتقليل الأبعاد، حيث تحافظ على بنية البيانات عالية الأبعاد مع إسقاطها في فضاء منخفض الأبعاد لتصورها أو إجراء مزيد من التحليل. باستخدامه، يمكننا تصور البيانات الأصلية عالية الأبعاد في فضاء ثنائي الأبعاد أو ثلاثي الأبعاد، ورؤية المجموعات بوضوح. هنا مرة أخرى، نقوم بتكرار نقاط البيانات ونحصل على المعرف والنص للبيانات الأصلية، ثم نستخدم التخطيط لرسم نقاط البيانات مع هذه المعلومات الوصفية في شكل، ونستخدم ألوانًا مختلفة لتمثيل المجموعات المختلفة.

    +
    import plotly.io as pio
    +
    +pio.renderers.default = "notebook"
    +
    +umap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)
    +
    +df_umap = (
    +    pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=["x", "y"])
    +    .assign(cluster=lambda df: hdb.labels_.astype(str))
    +    .query('cluster != "-1"')
    +    .sort_values(by="cluster")
    +)
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "text"]
    +)
    +
    +ids = []
    +texts = []
    +
    +while True:
    +    batch = iterator.next()
    +    if len(batch) == 0:
    +        break
    +    batch_ids = [data["id"] for data in batch]
    +    batch_texts = [data["text"] for data in batch]
    +    ids.extend(batch_ids)
    +    texts.extend(batch_texts)
    +
    +show_texts = [texts[i] for i in df_umap.index]
    +
    +df_umap["hover_text"] = show_texts
    +fig = px.scatter(
    +    df_umap, x="x", y="y", color="cluster", hover_data={"hover_text": True}
    +)
    +fig.show()
    +
    +

    + + image + الصورة

    +

    نوضح هنا أن البيانات متجمعة بشكل جيد، ويمكنك التمرير فوق النقاط للتحقق من النص الذي تمثله. من خلال هذا الدفتر، نأمل أن تتعلم كيفية استخدام HDBSCAN لتجميع التضمينات باستخدام Milvus بكفاءة، والتي يمكن تطبيقها أيضًا على أنواع أخرى من البيانات. يسمح هذا النهج، إلى جانب نماذج اللغة الكبيرة، بتحليل أعمق لبياناتك على نطاق واسع.

    diff --git a/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.json b/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.json new file mode 100644 index 000000000..89435cdd6 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"How to Enhance the Performance of Your RAG Pipeline","anchorList":[{"label":"كيفية تحسين أداء خط أنابيب RAG الخاص بك","href":"How-to-Enhance-the-Performance-of-Your-RAG-Pipeline","type":1,"isActive":false},{"label":"خط أنابيب RAG القياسي","href":"A-Standard-RAG-Pipeline","type":2,"isActive":false},{"label":"أنواع مختلفة من تقنيات تحسين RAG","href":"Various-Types-of-RAG-Enhancement-Techniques","type":2,"isActive":false},{"label":"تحسين الاستعلام","href":"Query-Enhancement","type":2,"isActive":false},{"label":"تحسين الفهرسة","href":"Indexing-Enhancement","type":2,"isActive":false},{"label":"تحسين المسترجع","href":"Retriever-Enhancement","type":2,"isActive":false},{"label":"تحسين المولدات","href":"Generator-Enhancement","type":2,"isActive":false},{"label":"تحسين خط أنابيب RAG","href":"RAG-Pipeline-Enhancement","type":2,"isActive":false},{"label":"الملخص","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.md b/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.md new file mode 100644 index 000000000..1cfd150fe --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/how_to_enhance_your_rag.md @@ -0,0 +1,295 @@ +--- +id: how_to_enhance_your_rag.md +summary: >- + مع تزايد شعبية تطبيقات RAG الجيل المعزز للاسترجاع RAG، هناك اهتمام متزايد + بتحسين أدائها. تعرض هذه المقالة جميع الطرق الممكنة لتحسين خطوط أنابيب RAG + وتوفر الرسوم التوضيحية المقابلة لمساعدتك على فهم استراتيجيات تحسين RAG السائدة + بسرعة. +title: كيفية تحسين أداء خط أنابيب RAG الخاص بك +--- +

    كيفية تحسين أداء خط أنابيب RAG الخاص بك

    مع تزايد شعبية تطبيقات التوليد المعزز للاسترجاع(RAG)، هناك اهتمام متزايد بتحسين أدائها. تقدم هذه المقالة جميع الطرق الممكنة لتحسين خطوط أنابيب RAG وتوفر الرسوم التوضيحية المقابلة لمساعدتك على فهم استراتيجيات تحسين RAG السائدة بسرعة.

    +

    من المهم أن نلاحظ أننا سنقدم فقط استكشافًا عالي المستوى لهذه الاستراتيجيات والتقنيات، مع التركيز على كيفية تكاملها في نظام RAG. ومع ذلك، لن نخوض في التفاصيل المعقدة أو نوجهك خلال التنفيذ خطوة بخطوة.

    +

    خط أنابيب RAG القياسي

    يوضح الرسم البياني أدناه خط أنابيب RAG الأكثر بساطة. أولاً، يتم تحميل أجزاء المستند في مخزن متجه (مثل Milvus أو Zilliz cloud). بعد ذلك، يسترجع مخزن المتجهات الأجزاء الأكثر صلة بالاستعلام من أعلى K. ثم يتم حقن هذه الأجزاء ذات الصلة في موجه سياق LLM، وأخيرًا، يقوم LLM بإرجاع الإجابة النهائية.

    +

    + + + + +

    +

    أنواع مختلفة من تقنيات تحسين RAG

    يمكننا تصنيف أساليب تحسين RAG المختلفة استنادًا إلى أدوارها في مراحل خط أنابيب RAG.

    +
      +
    • تحسين الاستعلام: تعديل ومعالجة عملية الاستعلام الخاصة بمدخلات RAG للتعبير عن هدف الاستعلام أو معالجته بشكل أفضل.
    • +
    • تحسين الفهرسة: تحسين إنشاء فهارس التجزئة باستخدام تقنيات مثل الفهرسة متعددة التجزئة أو الفهرسة التدريجية أو الفهرسة متعددة الاتجاهات.
    • +
    • تحسين الاسترجاع: تطبيق تقنيات واستراتيجيات التحسين أثناء عملية الاسترجاع.
    • +
    • تحسين المولد: تعديل المطالبات وتحسينها عند تجميع المطالبات لـ LLM لتوفير استجابات أفضل.
    • +
    • تحسين خط أنابيب RAG: تبديل العمليات ديناميكيًا داخل خط أنابيب RAG بأكمله، بما في ذلك استخدام وكلاء أو أدوات لتحسين الخطوات الرئيسية في خط أنابيب RAG.
    • +
    +

    بعد ذلك، سنقدم طرقًا محددة تحت كل فئة من هذه الفئات.

    +

    تحسين الاستعلام

    دعنا نستكشف أربع طرق فعالة لتحسين تجربة الاستعلام: الأسئلة الافتراضية، وتضمينات المستندات الافتراضية، والاستعلامات الفرعية، والمطالبات المتدرجة.

    +

    إنشاء أسئلة افتراضية

    ينطوي إنشاء أسئلة افتراضية على استخدام LLM لتوليد أسئلة متعددة قد يطرحها المستخدمون حول المحتوى الموجود في كل جزء من المستند. قبل أن يصل استعلام المستخدم الفعلي إلى LLM، يسترجع مخزن المتجهات الأسئلة الافتراضية الأكثر صلة بالاستعلام الحقيقي، إلى جانب أجزاء المستندات المقابلة لها، ويعيد توجيهها إلى LLM.

    +

    + + + + +

    +

    تتجاوز هذه المنهجية مشكلة عدم التماثل بين النطاقات في عملية البحث المتجه من خلال الانخراط مباشرةً في عمليات البحث من استعلام إلى استعلام، مما يخفف العبء على عمليات البحث المتجه. ومع ذلك، فإنها تقدم نفقات إضافية وعدم يقين إضافي في توليد أسئلة افتراضية.

    +

    HyDE (تضمينات المستندات الافتراضية)

    يرمز HyDE إلى تضمينات المستندات الافتراضية. وهي تستفيد من LLM لصياغة "مستندافتراضي" أو إجابة وهمية استجابةً لاستعلام المستخدم الخالي من المعلومات السياقية. يتم بعد ذلك تحويل هذه الإجابة الوهمية إلى تضمينات متجهة واستخدامها للاستعلام عن أجزاء المستند الأكثر صلة داخل قاعدة بيانات متجهة. بعد ذلك، تسترجع قاعدة البيانات المتجهة أجزاء المستندات الأكثر صلة من أعلى K وتنقلها إلى LLM واستعلام المستخدم الأصلي لتوليد الإجابة النهائية.

    +

    + + + + +

    +

    تشبه هذه الطريقة تقنية السؤال الافتراضي في معالجة عدم التماثل بين المجالات في عمليات البحث عن المتجهات. ومع ذلك، فإن لها أيضًا عيوبًا، مثل التكاليف الحسابية الإضافية والشكوك المتعلقة بتوليد إجابات وهمية.

    +

    لمزيد من المعلومات، راجع ورقة HyDE.

    +

    إنشاء استعلامات فرعية

    عندما يكون استعلام المستخدم معقدًا للغاية، يمكننا استخدام LLM لتقسيمه إلى استعلامات فرعية أبسط قبل تمريرها إلى قاعدة بيانات المتجهات و LLM. لنلقِ نظرة على مثال.

    +

    تخيل أن يسأل مستخدم: "ما هي الاختلافات في الميزات بين ميلفوس وزيليز كلاود؟" هذا السؤال معقد للغاية وقد لا يكون له إجابة مباشرة في قاعدة معارفنا. لمعالجة هذه المشكلة، يمكننا تقسيمه إلى استفسارين فرعيين أبسط:

    +
      +
    • الاستعلام الفرعي 1: "ما هي ميزات ميلفوس؟
    • +
    • الاستعلام الفرعي 2: "ما هي ميزات زيليز كلاود؟
    • +
    +

    بمجرد أن نحصل على هذه الاستعلامات الفرعية، نرسلها جميعًا إلى قاعدة بيانات المتجهات بعد تحويلها إلى تضمينات متجهة. ثم تعثر قاعدة بيانات المتجهات على أجزاء المستندات الأكثر صلة بكل استعلام فرعي. أخيرًا، يستخدم LLM هذه المعلومات لتوليد إجابة أفضل.

    +

    + + + + +

    +

    ومن خلال تقسيم استعلام المستخدم إلى استعلامات فرعية، فإننا نسهّل على نظامنا العثور على المعلومات ذات الصلة وتقديم إجابات دقيقة، حتى للأسئلة المعقدة.

    +

    إنشاء موجهات متدرجة

    هناك طريقة أخرى لتبسيط استعلامات المستخدم المعقدة وهي إنشاء مطالبات متدرجة. تتضمن هذه التقنية تجريد استفسارات المستخدم المعقدة إلى "أسئلة متدرجة"** باستخدام LLM. بعد ذلك، تستخدم قاعدة البيانات المتجهة هذه الأسئلة المتدرجة لاسترداد أجزاء المستندات الأكثر صلة. أخيرًا، تقوم LLM بإنشاء إجابة أكثر دقة بناءً على أجزاء المستندات المسترجعة هذه.

    +

    دعونا نوضح هذه التقنية بمثال. لننظر إلى الاستعلام التالي، وهو استعلام معقد للغاية وليس من السهل الإجابة عليه مباشرةً:

    +

    استعلام المستخدم الأصلي: "لديّ مجموعة بيانات تحتوي على 10 مليار سجل وأريد تخزينها في ملفوس للاستعلام. هل هذا ممكن؟

    +

    لتبسيط استعلام المستخدم هذا، يمكننا استخدام LLM لتوليد سؤال تراجعي أكثر وضوحًا:

    +

    سؤال الاسترجاع: "ما هو الحد الأقصى لحجم مجموعة البيانات التي يمكن لـ Milvus التعامل معها؟

    +

    + + + + +

    +

    يمكن أن تساعدنا هذه الطريقة في الحصول على إجابات أفضل وأكثر دقة للاستعلامات المعقدة. فهي تقسم السؤال الأصلي إلى شكل أبسط، مما يسهل على نظامنا العثور على المعلومات ذات الصلة وتقديم إجابات دقيقة.

    +

    تحسين الفهرسة

    يعد تحسين الفهرسة استراتيجية أخرى لتحسين أداء تطبيقات RAG الخاصة بك. دعنا نستكشف ثلاث تقنيات لتحسين الفهرسة.

    +

    دمج أجزاء المستند تلقائيًا

    عند إنشاء فهرس، يمكننا استخدام مستويين من التفصيل: القطع الفرعية والقطع الأصلية المقابلة لها. في البداية، نبحث عن القطع الفرعية على مستوى أدق من التفاصيل. بعد ذلك، نطبق استراتيجية الدمج: إذا كان عدد محدد، من القطع الفرعية من أول k من القطع الفرعية ينتمي إلى نفس القطعة الأصل، فإننا نقدم هذه القطعة الأصل إلى LLM كمعلومات سياقية.

    +

    + + + + +

    +

    تم تنفيذ هذه المنهجية في LlamaIndex.

    +

    إنشاء مؤشرات هرمية

    عند إنشاء فهارس للمستندات، يمكننا إنشاء فهرس من مستويين: فهرس لملخصات المستندات وآخر لقطع المستندات. تتألف عملية البحث المتجه من مرحلتين: في البداية، نقوم بتصفية المستندات ذات الصلة بناءً على الملخص، وبعد ذلك، نسترجع أجزاء المستندات المقابلة حصريًا ضمن هذه المستندات ذات الصلة.

    +

    + + + + +

    +

    ويثبت هذا النهج فائدته في المواقف التي تتضمن أحجامًا كبيرة من البيانات أو الحالات التي تكون فيها البيانات ذات تسلسل هرمي، مثل استرجاع المحتوى داخل مجموعة مكتبات.

    +

    الاسترجاع وإعادة الترتيب الهجين

    تدمج تقنية الاسترجاع وإعادة الترتيب الهجين طريقة أو أكثر من طرق الاسترجاع التكميلية مع استرجاع التشابه المتجه. ثم تقوم أداة إعادة الترتيب بإعادة ترتيب النتائج المسترجعة بناءً على مدى ملاءمتها لاستعلام المستخدم.

    +

    تتضمن خوارزميات الاسترجاع التكميلية الشائعة أساليب قائمة على التردد المعجمي مثل BM25 أو النماذج الكبيرة التي تستخدم التضمينات المتفرقة مثل Splade. وتتضمن خوارزميات إعادة الترتيب خوارزميات إعادة الترتيب RRF أو نماذج أكثر تعقيدًا مثل Cross-Encoder، والتي تشبه البنى الشبيهة بـ BERT.

    +

    + + + + +

    +

    ويستفيد هذا النهج من أساليب الاسترجاع المتنوعة لتحسين جودة الاسترجاع ومعالجة الثغرات المحتملة في استدعاء المتجهات.

    +

    تحسين المسترجع

    يمكن أيضًا أن يؤدي تحسين مكون المسترجع داخل نظام RAG إلى تحسين تطبيقات RAG. دعونا نستكشف بعض الطرق الفعالة لتحسين المسترجع.

    +

    استرجاع نافذة الجملة

    في نظام RAG الأساسي، يكون جزء المستند المُعطى إلى LLM عبارة عن نافذة أكبر تشمل جزء التضمين المسترجع. وهذا يضمن أن تتضمن المعلومات المقدمة إلى آلة استرجاع المستندات LLM نطاقًا أوسع من التفاصيل السياقية، مما يقلل من فقدان المعلومات. تعمل تقنية استرجاع نافذة الجملة على فصل جزء المستند المستخدم في استرجاع التضمين عن الجزء المقدم إلى آلية إدارة التعلم.

    +

    + + + + +

    +

    ومع ذلك، قد يؤدي توسيع حجم النافذة إلى تقديم معلومات متداخلة إضافية. يمكننا تعديل حجم توسيع النافذة بناءً على احتياجات العمل المحددة.

    +

    تصفية البيانات الوصفية

    لضمان الحصول على إجابات أكثر دقة، يمكننا تنقيح المستندات المسترجعة عن طريق تصفية البيانات الوصفية مثل الوقت والفئة قبل تمريرها إلى LLM. على سبيل المثال، إذا تم استرجاع التقارير المالية التي تغطي سنوات متعددة، فإن التصفية بناءً على السنة المطلوبة ستعمل على تنقيح المعلومات لتلبية متطلبات محددة. تثبت هذه الطريقة فعاليتها في الحالات التي تحتوي على بيانات شاملة وبيانات وصفية مفصلة، مثل استرجاع المحتوى في مجموعات المكتبات.

    +

    + + + + +

    +

    تحسين المولدات

    دعونا نستكشف المزيد من تقنيات تحسين RAG من خلال تحسين المولد داخل نظام RAG.

    +

    ضغط موجه LLM

    يمكن أن تؤثر معلومات التشويش داخل أجزاء المستندات المسترجعة بشكل كبير على دقة الإجابة النهائية لـ RAG. كما تمثل نافذة المطالبة المحدودة في LLMs أيضًا عقبة أمام الحصول على إجابات أكثر دقة. ولمعالجة هذا التحدي، يمكننا ضغط التفاصيل غير ذات الصلة، والتأكيد على الفقرات الرئيسية، وتقليل طول السياق الكلي لقطع المستندات المسترجعة.

    +

    + + + + +

    +

    ويشبه هذا النهج طريقة الاسترجاع وإعادة الترتيب الهجين التي تمت مناقشتها سابقًا، حيث يتم استخدام أداة إعادة الترتيب لغربلة أجزاء المستند غير ذات الصلة.

    +

    ضبط ترتيب القطع في المطالبة

    في ورقة "الضياع في المنتصف"، لاحظ الباحثون أن أجهزة استرجاع المستنداتالضائعة في المنتصف غالبًا ما تتجاهل المعلومات الموجودة في منتصف المستندات المعطاة أثناء عملية الاستدلال. وبدلاً من ذلك، يميلون إلى الاعتماد أكثر على المعلومات المقدمة في بداية المستندات ونهايتها.

    +

    استنادًا إلى هذه الملاحظة، يمكننا تعديل ترتيب الأجزاء المسترجعة لتحسين جودة الإجابة: عند استرجاع أجزاء معرفية متعددة، يتم وضع الأجزاء ذات الثقة المنخفضة نسبيًا في الوسط، ويتم وضع الأجزاء ذات الثقة العالية نسبيًا في الطرفين.

    +

    + + + + +

    +

    تحسين خط أنابيب RAG

    يمكننا أيضًا تحسين أداء تطبيقات RAG الخاصة بك عن طريق تحسين خط أنابيب RAG بأكمله.

    +

    الانعكاس الذاتي

    يتضمن هذا النهج مفهوم الانعكاس الذاتي داخل وكلاء الذكاء الاصطناعي. إذن، كيف تعمل هذه التقنية؟

    +

    تكون بعض أجزاء المستند Top-K المسترجعة في البداية غامضة وقد لا تجيب على سؤال المستخدم مباشرةً. في مثل هذه الحالات، يمكننا إجراء جولة ثانية من الانعكاس للتحقق مما إذا كانت هذه الأجزاء يمكن أن تجيب على الاستعلام بشكل حقيقي.

    +

    يمكننا إجراء الانعكاس باستخدام طرق انعكاس فعالة مثل نماذج الاستدلال على اللغة الطبيعية (NLI) أو أدوات إضافية مثل عمليات البحث على الإنترنت للتحقق.

    +

    + + + + +

    +

    وقد تم استكشاف مفهوم الانعكاس الذاتي هذا في العديد من الأوراق البحثية أو المشاريع، بما في ذلك RAG الذاتي، و RAG التصحيحي، و LangGraph، إلخ.

    +

    توجيه الاستعلام مع وكيل

    في بعض الأحيان، لا نضطر إلى استخدام نظام RAG للإجابة على الأسئلة البسيطة لأنه قد يؤدي إلى مزيد من سوء الفهم والاستدلال من المعلومات المضللة. في مثل هذه الحالات، يمكننا استخدام وكيل كموجه في مرحلة الاستعلام. يقوم هذا الوكيل بتقييم ما إذا كان الاستعلام يحتاج إلى المرور عبر خط أنابيب RAG. إذا كان الأمر كذلك، يتم البدء في خط أنابيب RAG اللاحق؛ وإلا فإن LLM يعالج الاستعلام مباشرةً.

    +

    + + + + + + + + + + +

    +

    يمكن أن يتخذ الوكيل أشكالاً مختلفة، بما في ذلك نموذج تصنيف صغير أو نموذج تصنيف صغير أو حتى مجموعة من القواعد.

    +

    من خلال توجيه الاستعلامات بناءً على نية المستخدم، يمكنك إعادة توجيه جزء من الاستعلامات، مما يؤدي إلى زيادة كبيرة في وقت الاستجابة وتقليل ملحوظ في التشويش غير الضروري.

    +

    يمكننا توسيع نطاق تقنية توجيه الاستعلامات لتشمل عمليات أخرى داخل نظام RAG، مثل تحديد وقت استخدام أدوات مثل عمليات البحث على الويب أو إجراء استعلامات فرعية أو البحث عن الصور. ويضمن هذا النهج تحسين كل خطوة في نظام RAG بناءً على المتطلبات المحددة للاستعلام، مما يؤدي إلى استرجاع معلومات أكثر كفاءة ودقة.

    +

    الملخص

    على الرغم من أن خط أنابيب RAG الفانيليا قد يبدو بسيطًا، إلا أن تحقيق الأداء الأمثل للأعمال يتطلب غالبًا تقنيات تحسين أكثر تعقيدًا.

    +

    تلخص هذه المقالة مختلف الأساليب الشائعة لتحسين أداء تطبيقات RAG الخاصة بك. كما قدمنا أيضًا رسومًا توضيحية واضحة لمساعدتك على فهم هذه المفاهيم والتقنيات بسرعة وتسريع تنفيذها وتحسينها.

    +

    يمكنك الحصول على التطبيقات البسيطة للمناهج الرئيسية المدرجة في هذه المقالة على رابط GitHub هذا.

    diff --git a/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.json new file mode 100644 index 000000000..2a5372f84 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus \"pymilvus[model]\"\n","# Run this cell to download the dataset\n$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv\n","import pandas as pd\n\nfile_path = \"quora_duplicate_questions.tsv\"\ndf = pd.read_csv(file_path, sep=\"\\t\")\nquestions = set()\nfor _, row in df.iterrows():\n obj = row.to_dict()\n questions.add(obj[\"question1\"][:512])\n questions.add(obj[\"question2\"][:512])\n if len(questions) > 500: # Skip this if you want to use the full dataset\n break\n\ndocs = list(questions)\n\n# example question\nprint(docs[0])\n","from milvus_model.hybrid import BGEM3EmbeddingFunction\n\nef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\ndense_dim = ef.dim[\"dense\"]\n\n# Generate embeddings using BGE-M3 model\ndocs_embeddings = ef(docs)\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# Connect to Milvus given URI\nconnections.connect(uri=\"./milvus.db\")\n\n# Specify the data schema for the new Collection\nfields = [\n # Use auto generated id as primary key\n FieldSchema(\n name=\"pk\", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100\n ),\n # Store the original text to retrieve based on semantically distance\n FieldSchema(name=\"text\", dtype=DataType.VARCHAR, max_length=512),\n # Milvus now supports both sparse and dense vectors,\n # we can store each in a separate field to conduct hybrid search on both vectors\n FieldSchema(name=\"sparse_vector\", dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=\"dense_vector\", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n]\nschema = CollectionSchema(fields)\n\n# Create collection (drop the old one if exists)\ncol_name = \"hybrid_demo\"\nif utility.has_collection(col_name):\n Collection(col_name).drop()\ncol = Collection(col_name, schema, consistency_level=\"Strong\")\n\n# To make vector search efficient, we need to create indices for the vector fields\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"sparse_vector\", sparse_index)\ndense_index = {\"index_type\": \"AUTOINDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"dense_vector\", dense_index)\ncol.load()\n","# For efficiency, we insert 50 records in each small batch\nfor i in range(0, len(docs), 50):\n batched_entities = [\n docs[i : i + 50],\n docs_embeddings[\"sparse\"][i : i + 50],\n docs_embeddings[\"dense\"][i : i + 50],\n ]\n col.insert(batched_entities)\nprint(\"Number of entities inserted:\", col.num_entities)\n","# Enter your search query\nquery = input(\"Enter your search query: \")\nprint(query)\n\n# Generate embeddings for the query\nquery_embeddings = ef([query])\n# print(query_embeddings)\n","from pymilvus import (\n AnnSearchRequest,\n WeightedRanker,\n)\n\n\ndef dense_search(col, query_dense_embedding, limit=10):\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n res = col.search(\n [query_dense_embedding],\n anns_field=\"dense_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef sparse_search(col, query_sparse_embedding, limit=10):\n search_params = {\n \"metric_type\": \"IP\",\n \"params\": {},\n }\n res = col.search(\n [query_sparse_embedding],\n anns_field=\"sparse_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef hybrid_search(\n col,\n query_dense_embedding,\n query_sparse_embedding,\n sparse_weight=1.0,\n dense_weight=1.0,\n limit=10,\n):\n dense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n dense_req = AnnSearchRequest(\n [query_dense_embedding], \"dense_vector\", dense_search_params, limit=limit\n )\n sparse_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n sparse_req = AnnSearchRequest(\n [query_sparse_embedding], \"sparse_vector\", sparse_search_params, limit=limit\n )\n rerank = WeightedRanker(sparse_weight, dense_weight)\n res = col.hybrid_search(\n [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=[\"text\"]\n )[0]\n return [hit.get(\"text\") for hit in res]\n","dense_results = dense_search(col, query_embeddings[\"dense\"][0])\nsparse_results = sparse_search(col, query_embeddings[\"sparse\"]._getrow(0))\nhybrid_results = hybrid_search(\n col,\n query_embeddings[\"dense\"][0],\n query_embeddings[\"sparse\"]._getrow(0),\n sparse_weight=0.7,\n dense_weight=1.0,\n)\n","def doc_text_formatting(ef, query, docs):\n tokenizer = ef.model.tokenizer\n query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)\n query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)\n formatted_texts = []\n\n for doc in docs:\n ldx = 0\n landmarks = []\n encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)\n tokens = tokenizer.convert_ids_to_tokens(encoding[\"input_ids\"])[1:-1]\n offsets = encoding[\"offset_mapping\"][1:-1]\n for token, (start, end) in zip(tokens, offsets):\n if token in query_tokens:\n if len(landmarks) != 0 and start == landmarks[-1]:\n landmarks[-1] = end\n else:\n landmarks.append(start)\n landmarks.append(end)\n close = False\n formatted_text = \"\"\n for i, c in enumerate(doc):\n if ldx == len(landmarks):\n pass\n elif i == landmarks[ldx]:\n if close:\n formatted_text += \"\"\n else:\n formatted_text += \"\"\n close = not close\n ldx = ldx + 1\n formatted_text += c\n if close is True:\n formatted_text += \"\"\n formatted_texts.append(formatted_text)\n return formatted_texts\n","from IPython.display import Markdown, display\n\n# Dense search results\ndisplay(Markdown(\"**Dense Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, dense_results)\nfor result in dense_results:\n display(Markdown(result))\n\n# Sparse search results\ndisplay(Markdown(\"\\n**Sparse Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, sparse_results)\nfor result in formatted_results:\n display(Markdown(result))\n\n# Hybrid search results\ndisplay(Markdown(\"\\n**Hybrid Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, hybrid_results)\nfor result in formatted_results:\n display(Markdown(result))\n"],"headingContent":"Hybrid Search with Milvus","anchorList":[{"label":"البحث الهجين مع ميلفوس","href":"Hybrid-Search-with-Milvus","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.md new file mode 100644 index 000000000..7950853f3 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/hybrid_search_with_milvus.md @@ -0,0 +1,313 @@ +--- +id: hybrid_search_with_milvus.md +summary: البحث الهجين مع ميلفوس +title: البحث الهجين مع ميلفوس +--- +

    البحث الهجين مع ميلفوس

    Open In Colab +GitHub Repository

    +

    +

    في هذا البرنامج التعليمي، سنشرح في هذا البرنامج التعليمي كيفية إجراء بحث هجين باستخدام Milvus ونموذج BGE-M3. يمكن لنموذج BGE-M3 تحويل النص إلى متجهات كثيفة ومتناثرة. يدعم Milvus تخزين كلا النوعين من المتجهات في مجموعة واحدة، مما يسمح بالبحث الهجين الذي يعزز أهمية النتائج.

    +

    يدعم Milvus طرق الاسترجاع الكثيفة والمتناثرة والهجينة:

    +
      +
    • الاسترجاع الكثيف: يستخدم السياق الدلالي لفهم المعنى الكامن وراء الاستعلامات.
    • +
    • الاسترجاع المتناثر: يركّز على مطابقة النص للعثور على النتائج بناءً على مصطلحات محددة، أي ما يعادل البحث في النص الكامل.
    • +
    • الاسترجاع الهجين: يجمع بين النهجين الكثيف والمتناثر، حيث يلتقط السياق الكامل والكلمات الرئيسية المحددة للحصول على نتائج بحث شاملة.
    • +
    +

    من خلال دمج هذه الأساليب، يوازن البحث الهجين في ميلفوس بين أوجه التشابه الدلالي والمعجمي، مما يحسّن من الملاءمة الإجمالية لنتائج البحث. سيتناول هذا الدفتر عملية إعداد واستخدام استراتيجيات الاسترجاع هذه، مع تسليط الضوء على فعاليتها في سيناريوهات البحث المختلفة.

    +

    التبعيات والبيئة

    $ pip install --upgrade pymilvus "pymilvus[model]"
    +
    +

    تحميل مجموعة البيانات

    لتوضيح البحث، نحتاج إلى مجموعة من المستندات. لنستخدم مجموعة بيانات Quora Duplicate Questions ونضعها في الدليل المحلي.

    +

    مصدر مجموعة البيانات: أول إصدار لمجموعة بيانات Quora: أزواج الأسئلة

    +
    # Run this cell to download the dataset
    +$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv
    +
    +

    تحميل وإعداد البيانات

    سنقوم بتحميل مجموعة البيانات وإعداد مجموعة صغيرة للبحث.

    +
    import pandas as pd
    +
    +file_path = "quora_duplicate_questions.tsv"
    +df = pd.read_csv(file_path, sep="\t")
    +questions = set()
    +for _, row in df.iterrows():
    +    obj = row.to_dict()
    +    questions.add(obj["question1"][:512])
    +    questions.add(obj["question2"][:512])
    +    if len(questions) > 500:  # Skip this if you want to use the full dataset
    +        break
    +
    +docs = list(questions)
    +
    +# example question
    +print(docs[0])
    +
    +
    What is the strongest Kevlar cord?
    +
    +

    استخدام نموذج BGE-M3 للتضمين

    يمكن لنموذج BGE-M3 تضمين النصوص كمتجهات كثيفة ومتناثرة.

    +
    from milvus_model.hybrid import BGEM3EmbeddingFunction
    +
    +ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +dense_dim = ef.dim["dense"]
    +
    +# Generate embeddings using BGE-M3 model
    +docs_embeddings = ef(docs)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 302473.85it/s]
    +Inference Embeddings: 100%|██████████| 32/32 [01:59<00:00,  3.74s/it]
    +
    +

    إعداد مجموعة ميلفوس والفهرس

    سنقوم بإعداد مجموعة Milvus وإنشاء مؤشرات لحقول المتجهات.

    +
    +
      +
    • يعد تعيين الفهرس كملف محلي، على سبيل المثال "./milvus.db"، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام uri الخادم، على سبيل المثال http://localhost:19530، كـ uri الخاص بك.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، قم بتعديل uri والرمز المميز، اللذين يتوافقان مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
    • +
    +
    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# Connect to Milvus given URI
    +connections.connect(uri="./milvus.db")
    +
    +# Specify the data schema for the new Collection
    +fields = [
    +    # Use auto generated id as primary key
    +    FieldSchema(
    +        name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
    +    ),
    +    # Store the original text to retrieve based on semantically distance
    +    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),
    +    # Milvus now supports both sparse and dense vectors,
    +    # we can store each in a separate field to conduct hybrid search on both vectors
    +    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +]
    +schema = CollectionSchema(fields)
    +
    +# Create collection (drop the old one if exists)
    +col_name = "hybrid_demo"
    +if utility.has_collection(col_name):
    +    Collection(col_name).drop()
    +col = Collection(col_name, schema, consistency_level="Strong")
    +
    +# To make vector search efficient, we need to create indices for the vector fields
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +col.create_index("sparse_vector", sparse_index)
    +dense_index = {"index_type": "AUTOINDEX", "metric_type": "IP"}
    +col.create_index("dense_vector", dense_index)
    +col.load()
    +
    +

    إدراج البيانات في مجموعة ميلفوس

    أدرج المستندات وتضميناتها في المجموعة.

    +
    # For efficiency, we insert 50 records in each small batch
    +for i in range(0, len(docs), 50):
    +    batched_entities = [
    +        docs[i : i + 50],
    +        docs_embeddings["sparse"][i : i + 50],
    +        docs_embeddings["dense"][i : i + 50],
    +    ]
    +    col.insert(batched_entities)
    +print("Number of entities inserted:", col.num_entities)
    +
    +
    Number of entities inserted: 502
    +
    +

    أدخل استعلام البحث

    # Enter your search query
    +query = input("Enter your search query: ")
    +print(query)
    +
    +# Generate embeddings for the query
    +query_embeddings = ef([query])
    +# print(query_embeddings)
    +
    +
    How to start learning programming?
    +
    +

    سنقوم أولاً بإعداد بعض الوظائف المفيدة لتشغيل البحث:

    +
      +
    • dense_search: البحث فقط عبر حقل متجه كثيف
    • +
    • sparse_search: البحث عبر حقل متجه متناثر فقط
    • +
    • hybrid_search: البحث عبر كلا الحقلين المتجهين الكثيف والمتجه مع إعادة ترتيب مرجحة
    • +
    +
    from pymilvus import (
    +    AnnSearchRequest,
    +    WeightedRanker,
    +)
    +
    +
    +def dense_search(col, query_dense_embedding, limit=10):
    +    search_params = {"metric_type": "IP", "params": {}}
    +    res = col.search(
    +        [query_dense_embedding],
    +        anns_field="dense_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def sparse_search(col, query_sparse_embedding, limit=10):
    +    search_params = {
    +        "metric_type": "IP",
    +        "params": {},
    +    }
    +    res = col.search(
    +        [query_sparse_embedding],
    +        anns_field="sparse_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def hybrid_search(
    +    col,
    +    query_dense_embedding,
    +    query_sparse_embedding,
    +    sparse_weight=1.0,
    +    dense_weight=1.0,
    +    limit=10,
    +):
    +    dense_search_params = {"metric_type": "IP", "params": {}}
    +    dense_req = AnnSearchRequest(
    +        [query_dense_embedding], "dense_vector", dense_search_params, limit=limit
    +    )
    +    sparse_search_params = {"metric_type": "IP", "params": {}}
    +    sparse_req = AnnSearchRequest(
    +        [query_sparse_embedding], "sparse_vector", sparse_search_params, limit=limit
    +    )
    +    rerank = WeightedRanker(sparse_weight, dense_weight)
    +    res = col.hybrid_search(
    +        [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=["text"]
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +

    دعونا نجري ثلاث عمليات بحث مختلفة بدوال محددة:

    +
    dense_results = dense_search(col, query_embeddings["dense"][0])
    +sparse_results = sparse_search(col, query_embeddings["sparse"]._getrow(0))
    +hybrid_results = hybrid_search(
    +    col,
    +    query_embeddings["dense"][0],
    +    query_embeddings["sparse"]._getrow(0),
    +    sparse_weight=0.7,
    +    dense_weight=1.0,
    +)
    +
    +

    عرض نتائج البحث

    لعرض نتائج عمليات البحث الكثيفة والمتناثرة والهجينة، نحتاج إلى بعض الأدوات المساعدة لتنسيق النتائج.

    +
    def doc_text_formatting(ef, query, docs):
    +    tokenizer = ef.model.tokenizer
    +    query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)
    +    query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)
    +    formatted_texts = []
    +
    +    for doc in docs:
    +        ldx = 0
    +        landmarks = []
    +        encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)
    +        tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])[1:-1]
    +        offsets = encoding["offset_mapping"][1:-1]
    +        for token, (start, end) in zip(tokens, offsets):
    +            if token in query_tokens:
    +                if len(landmarks) != 0 and start == landmarks[-1]:
    +                    landmarks[-1] = end
    +                else:
    +                    landmarks.append(start)
    +                    landmarks.append(end)
    +        close = False
    +        formatted_text = ""
    +        for i, c in enumerate(doc):
    +            if ldx == len(landmarks):
    +                pass
    +            elif i == landmarks[ldx]:
    +                if close:
    +                    formatted_text += "</span>"
    +                else:
    +                    formatted_text += "<span style='color:red'>"
    +                close = not close
    +                ldx = ldx + 1
    +            formatted_text += c
    +        if close is True:
    +            formatted_text += "</span>"
    +        formatted_texts.append(formatted_text)
    +    return formatted_texts
    +
    +

    ثم يمكننا عرض نتائج البحث في نص مع إبرازات:

    +
    from IPython.display import Markdown, display
    +
    +# Dense search results
    +display(Markdown("**Dense Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, dense_results)
    +for result in dense_results:
    +    display(Markdown(result))
    +
    +# Sparse search results
    +display(Markdown("\n**Sparse Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, sparse_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +# Hybrid search results
    +display(Markdown("\n**Hybrid Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, hybrid_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +

    نتائج البحث الكثيف:

    +

    ما هي أفضل طريقة لبدء تعلم الروبوتات؟

    +

    كيف يمكنني تعلم لغة كمبيوتر مثل جافا؟

    +

    كيف يمكنني البدء في تعلم أمن المعلومات؟

    +

    ما هي برمجة جافا؟ كيف أتعلم لغة برمجة جافا؟

    +

    كيف يمكنني تعلم أمن المعلومات؟

    +

    ما هي أفضل طريقة لبدء برمجة الروبوتات؟ ما هي أفضل لوحة تطوير يمكنني البدء في العمل عليها؟

    +

    كيف يمكنني تعلم التحدث باللغة الإنجليزية بطلاقة؟

    +

    ما هي أفضل الطرق لتعلم اللغة الفرنسية؟

    +

    كيف يمكنني تعلم الفيزياء بسهولة؟

    +

    كيف نستعد لامتحان UPSC؟

    +

    نتائج بحث متفرقة:

    +

    ما هي برمجة ج افا؟ كيف تتعلم لغة برمجة جافا؟

    +

    ما هي أفضل طريقة لبدء تعلم الروبوتات؟

    +

    ما هو البديل للتعلم الآلي؟

    +

    كيف أقوم بإنشاء محطة طرفية جديدة وصدفة جديدة في لينكس باستخدام برمجة C؟

    +

    كيف يمكنني إنشاء صدفة جديدة في محطة طرفية جديدة باستخدام البرمجة C (محطة طرفية لينكس)؟

    +

    ما هو العمل الأفضل للبدء في حيدر أباد؟

    +

    ما هو العمل التجاري الأفضل للبدء في حيدر أباد؟

    +

    ما هي أفضل طريقة لبدء الروبوتات؟ ما هي أفضل لوحة تطوير يمكنني البدء في العمل عليها؟

    +

    ما هي الرياضيات التي يحتاجها المبتدئ لفهم خوارزميات برمجة الكمبيوتر؟ ما هي الكتب عن الخوارزميات المناسبة للمبتدئ الكامل؟

    +

    كيف تجعل الحياة تناسبك وتمنع الحياة من الإساءة إليك عقلياً وعاطفياً؟

    +

    نتائج البحث الهجين:

    +

    ما هي أفضل طريقة لبدء برمجة الروبوتات؟ ما هي أفضل لوحة تطوير يمكنني البدء في العمل عليها؟

    +

    ما هي برمجة ج افا؟ كيف أتعلم لغة برمجة جافا؟

    +

    ما هي أفضل طريقة لبدء تعلم الروبوتات؟

    +

    كيف نستعد لامتحان UPSC؟

    +

    كيف تجعل الفيزياء سهلة التعلم؟

    +

    ما هي أفضل الطرق لتعلم اللغة الفرنسية؟

    +

    كيف يمكنني تعلم التحدث باللغة الإنجليزية بطلاقة؟

    +

    كيف يمكنني تعلم أمن الحاسوب؟

    +

    كيف يمكنني البدء في تعلم أمن المعلومات؟

    +

    كيف يمكنني تعلم لغة كمبيوتر مثل جافا؟

    +

    ما هو البديل للتعلم الآلي؟

    +

    كيف يمكنني إنشاء محطة طرفية جديدة وصدفة جديدة في لينكس باستخدام برمجة C؟

    +

    كيف يمكنني إنشاء صدفة جديدة في محطة طرفية جديدة باستخدام البرمجة C (محطة طرفية لينكس)؟

    +

    ما هو العمل الأفضل للبدء في حيدر أباد؟

    +

    ما هو العمل التجاري الأفضل للبدء في حيدر أباد؟

    +

    ما هي الرياضيات التي يحتاجها المبتدئ لفهم خوارزميات برمجة الكمبيوتر؟ ما هي الكتب عن الخوارزميات المناسبة للمبتدئ الكامل؟

    +

    كيف تجعل الحياة تناسبك وتمنع الحياة من الإساءة إليك عقليًا وعاطفيًا؟

    +

    النشر السريع

    لمعرفة كيفية بدء عرض توضيحي عبر الإنترنت باستخدام هذا البرنامج التعليمي، يرجى الرجوع إلى مثال التطبيق.

    diff --git a/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.json b/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.json new file mode 100644 index 000000000..62610dc90 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Image Deduplication","anchorList":[{"label":"إلغاء تكرار الصور","href":"Image-Deduplication","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.md b/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.md new file mode 100644 index 000000000..048533dee --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/image_deduplication_system.md @@ -0,0 +1,35 @@ +--- +id: image_deduplication_system.md +summary: إنشاء نظام إلغاء البيانات المكررة للصور باستخدام Milvus. +title: إلغاء تكرار الصور +--- +

    إلغاء تكرار الصور

    يوضح هذا البرنامج التعليمي كيفية استخدام Milvus، قاعدة البيانات المتجهة مفتوحة المصدر، لبناء نظام إلغاء تكرار الصور.

    + +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    + +

    شهدت السنوات الأخيرة انفجاراً هائلاً في المحتوى الذي ينشئه المستخدمون. يمكن للأشخاص تحميل صورة التقطوها على الفور على إحدى منصات التواصل الاجتماعي. ومع ذلك، مع هذه الوفرة في بيانات الصور، نرى العديد من المحتويات المكررة. ومن أجل تحسين تجربة المستخدم، يجب إزالة هذه الصور المكررة. يوفر علينا نظام إلغاء تكرار الصور من العمل اليدوي لمقارنة الصور في قاعدة البيانات واحدة تلو الأخرى لاستخراج الصور المكررة. انتقاء الصور المتطابقة تمامًا ليست مهمة معقدة على الإطلاق. ومع ذلك، يمكن في بعض الأحيان تكبير الصورة أو اقتصاصها أو تعديل درجة سطوعها أو مقياسها الرمادي. يحتاج نظام إلغاء تكرار الصور إلى تحديد هذه الصور المتشابهة وإزالتها أيضًا.

    +

    في هذا البرنامج التعليمي، ستتعلم في هذا البرنامج التعليمي كيفية إنشاء نظام إلغاء تكرار الصور. يستخدم هذا البرنامج التعليمي نموذج ResNet-50 لاستخراج ميزات الصور وتحويلها إلى متجهات. ثم يتم تخزين متجهات الصور هذه في قاعدة بيانات متجهات Milvus ويتم إجراء بحث عن تشابه المتجهات في Milvus أيضًا.

    +

    + + Image_deduplication_workflow + سير عمل_تكرار_الصور

    diff --git a/localization/v2.5.x/site/ar/tutorials/image_similarity_search.json b/localization/v2.5.x/site/ar/tutorials/image_similarity_search.json new file mode 100644 index 000000000..067a7e39d --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/image_similarity_search.json @@ -0,0 +1 @@ +{"codeList":["!wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip\n!unzip -q -o reverse_image_search.zip\n","$ pip install pymilvus --upgrade\n$ pip install timm\n","import torch\nfrom PIL import Image\nimport timm\nfrom sklearn.preprocessing import normalize\nfrom timm.data import resolve_data_config\nfrom timm.data.transforms_factory import create_transform\n\n\nclass FeatureExtractor:\n def __init__(self, modelname):\n # Load the pre-trained model\n self.model = timm.create_model(\n modelname, pretrained=True, num_classes=0, global_pool=\"avg\"\n )\n self.model.eval()\n\n # Get the input size required by the model\n self.input_size = self.model.default_cfg[\"input_size\"]\n\n config = resolve_data_config({}, model=modelname)\n # Get the preprocessing function provided by TIMM for the model\n self.preprocess = create_transform(**config)\n\n def __call__(self, imagepath):\n # Preprocess the input image\n input_image = Image.open(imagepath).convert(\"RGB\") # Convert to RGB if needed\n input_image = self.preprocess(input_image)\n\n # Convert the image to a PyTorch tensor and add a batch dimension\n input_tensor = input_image.unsqueeze(0)\n\n # Perform inference\n with torch.no_grad():\n output = self.model(input_tensor)\n\n # Extract the feature vector\n feature_vector = output.squeeze().numpy()\n\n return normalize(feature_vector.reshape(1, -1), norm=\"l2\").flatten()\n","from pymilvus import MilvusClient\n\n# Set up a Milvus client\nclient = MilvusClient(uri=\"example.db\")\n# Create a collection in quick setup mode\nif client.has_collection(collection_name=\"image_embeddings\"):\n client.drop_collection(collection_name=\"image_embeddings\")\nclient.create_collection(\n collection_name=\"image_embeddings\",\n vector_field_name=\"vector\",\n dimension=512,\n auto_id=True,\n enable_dynamic_field=True,\n metric_type=\"COSINE\",\n)\n","import os\n\nextractor = FeatureExtractor(\"resnet34\")\n\nroot = \"./train\"\ninsert = True\nif insert is True:\n for dirpath, foldername, filenames in os.walk(root):\n for filename in filenames:\n if filename.endswith(\".JPEG\"):\n filepath = dirpath + \"/\" + filename\n image_embedding = extractor(filepath)\n client.insert(\n \"image_embeddings\",\n {\"vector\": image_embedding, \"filename\": filepath},\n )\n","from IPython.display import display\n\nquery_image = \"./test/Afghan_hound/n02088094_4261.JPEG\"\n\nresults = client.search(\n \"image_embeddings\",\n data=[extractor(query_image)],\n output_fields=[\"filename\"],\n search_params={\"metric_type\": \"COSINE\"},\n)\nimages = []\nfor result in results:\n for hit in result[:10]:\n filename = hit[\"entity\"][\"filename\"]\n img = Image.open(filename)\n img = img.resize((150, 150))\n images.append(img)\n\nwidth = 150 * 5\nheight = 150 * 2\nconcatenated_image = Image.new(\"RGB\", (width, height))\n\nfor idx, img in enumerate(images):\n x = idx % 5\n y = idx // 5\n concatenated_image.paste(img, (x * 150, y * 150))\ndisplay(\"query\")\ndisplay(Image.open(query_image).resize((150, 150)))\ndisplay(\"results\")\ndisplay(concatenated_image)\n"],"headingContent":"Image Search with Milvus","anchorList":[{"label":"البحث عن الصور باستخدام ميلفوس","href":"Image-Search-with-Milvus","type":1,"isActive":false},{"label":"إعداد مجموعة البيانات","href":"Dataset-Preparation","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prequisites","type":2,"isActive":false},{"label":"تعريف مستخرج الميزات","href":"Define-the-Feature-Extractor","type":2,"isActive":false},{"label":"إنشاء مجموعة ميلفوس","href":"Create-a-Milvus-Collection","type":2,"isActive":false},{"label":"إدراج التضمينات في ميلفوس","href":"Insert-the-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"النشر السريع","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/image_similarity_search.md b/localization/v2.5.x/site/ar/tutorials/image_similarity_search.md new file mode 100644 index 000000000..4d88f9d46 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/image_similarity_search.md @@ -0,0 +1,263 @@ +--- +id: image_similarity_search.md +summary: البحث عن الصور مع ميلفوس +title: البحث عن الصور باستخدام ميلفوس +--- +

    البحث عن الصور باستخدام ميلفوس

    Open In Colab +GitHub Repository

    +

    +

    في هذا الدفتر، سنوضح لك كيفية استخدام Milvus للبحث عن صور متشابهة في مجموعة بيانات. سوف نستخدم مجموعة فرعية من مجموعة بيانات ImageNet، ثم نبحث عن صورة كلب صيد أفغاني لتوضيح ذلك.

    +

    إعداد مجموعة البيانات

    أولاً، نحتاج أولاً إلى تحميل مجموعة البيانات وإلغاء استخراجها لمزيد من المعالجة.

    +
    !wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
    +!unzip -q -o reverse_image_search.zip
    +
    +

    المتطلبات الأساسية

    لتشغيل هذا الدفتر، تحتاج إلى تثبيت التبعيات التالية:

    +
      +
    • pymilvus>=2.4.2
    • +
    • تيم
    • +
    • الشعلة
    • +
    • numpy
    • +
    • سكليرن
    • +
    • الوسادة
    • +
    +

    لتشغيل Colab، نقدم الأوامر المفيدة لتثبيت التبعيات اللازمة.

    +
    $ pip install pymilvus --upgrade
    +$ pip install timm
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل. (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +
    +

    تعريف مستخرج الميزات

    بعد ذلك، نحن بحاجة إلى تحديد مستخرج الميزة الذي يستخرج التضمين من صورة باستخدام نموذج "ريسنت-34" الخاص بـ timm.

    +
    import torch
    +from PIL import Image
    +import timm
    +from sklearn.preprocessing import normalize
    +from timm.data import resolve_data_config
    +from timm.data.transforms_factory import create_transform
    +
    +
    +class FeatureExtractor:
    +    def __init__(self, modelname):
    +        # Load the pre-trained model
    +        self.model = timm.create_model(
    +            modelname, pretrained=True, num_classes=0, global_pool="avg"
    +        )
    +        self.model.eval()
    +
    +        # Get the input size required by the model
    +        self.input_size = self.model.default_cfg["input_size"]
    +
    +        config = resolve_data_config({}, model=modelname)
    +        # Get the preprocessing function provided by TIMM for the model
    +        self.preprocess = create_transform(**config)
    +
    +    def __call__(self, imagepath):
    +        # Preprocess the input image
    +        input_image = Image.open(imagepath).convert("RGB")  # Convert to RGB if needed
    +        input_image = self.preprocess(input_image)
    +
    +        # Convert the image to a PyTorch tensor and add a batch dimension
    +        input_tensor = input_image.unsqueeze(0)
    +
    +        # Perform inference
    +        with torch.no_grad():
    +            output = self.model(input_tensor)
    +
    +        # Extract the feature vector
    +        feature_vector = output.squeeze().numpy()
    +
    +        return normalize(feature_vector.reshape(1, -1), norm="l2").flatten()
    +
    +

    إنشاء مجموعة ميلفوس

    ثم نحتاج بعد ذلك إلى إنشاء مجموعة Milvus لتخزين تضمينات الصورة

    +
    from pymilvus import MilvusClient
    +
    +# Set up a Milvus client
    +client = MilvusClient(uri="example.db")
    +# Create a collection in quick setup mode
    +if client.has_collection(collection_name="image_embeddings"):
    +    client.drop_collection(collection_name="image_embeddings")
    +client.create_collection(
    +    collection_name="image_embeddings",
    +    vector_field_name="vector",
    +    dimension=512,
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +    metric_type="COSINE",
    +)
    +
    +
    +

    بالنسبة لحجة MilvusClient:

    +
      +
    • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +

    إدراج التضمينات في ميلفوس

    سنقوم باستخراج تضمينات كل صورة باستخدام نموذج ResNet34 وإدراج الصور من مجموعة التدريب في Milvus.

    +
    import os
    +
    +extractor = FeatureExtractor("resnet34")
    +
    +root = "./train"
    +insert = True
    +if insert is True:
    +    for dirpath, foldername, filenames in os.walk(root):
    +        for filename in filenames:
    +            if filename.endswith(".JPEG"):
    +                filepath = dirpath + "/" + filename
    +                image_embedding = extractor(filepath)
    +                client.insert(
    +                    "image_embeddings",
    +                    {"vector": image_embedding, "filename": filepath},
    +                )
    +
    +
    from IPython.display import display
    +
    +query_image = "./test/Afghan_hound/n02088094_4261.JPEG"
    +
    +results = client.search(
    +    "image_embeddings",
    +    data=[extractor(query_image)],
    +    output_fields=["filename"],
    +    search_params={"metric_type": "COSINE"},
    +)
    +images = []
    +for result in results:
    +    for hit in result[:10]:
    +        filename = hit["entity"]["filename"]
    +        img = Image.open(filename)
    +        img = img.resize((150, 150))
    +        images.append(img)
    +
    +width = 150 * 5
    +height = 150 * 2
    +concatenated_image = Image.new("RGB", (width, height))
    +
    +for idx, img in enumerate(images):
    +    x = idx % 5
    +    y = idx // 5
    +    concatenated_image.paste(img, (x * 150, y * 150))
    +display("query")
    +display(Image.open(query_image).resize((150, 150)))
    +display("results")
    +display(concatenated_image)
    +
    +
    'query'
    +
    +

    + + png + png

    +
    'results'
    +
    +

    + + Results + النتائج

    +

    يمكننا أن نرى أن معظم الصور من نفس فئة صورة البحث، وهي صورة كلب الصيد الأفغاني. هذا يعني أننا وجدنا صوراً مشابهة لصورة البحث.

    +

    النشر السريع

    لمعرفة كيفية بدء عرض توضيحي عبر الإنترنت باستخدام هذا البرنامج التعليمي، يرجى الرجوع إلى مثال التطبيق.

    diff --git a/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.json new file mode 100644 index 000000000..34758584a --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install openai pymilvus datasets tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","COLLECTION_NAME = \"movie_search\"\nDIMENSION = 1536\n\nBATCH_SIZE = 1000\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Database\nclient = MilvusClient(\"./milvus_demo.db\")\n","# Remove collection if it already exists\nif client.has_collection(COLLECTION_NAME):\n client.drop_collection(COLLECTION_NAME)\n","from pymilvus import DataType\n\n# Create collection which includes the id, title, and embedding.\n\n# 1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=False,\n)\n\n# 2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"type\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"release_year\", datatype=DataType.INT64)\nschema.add_field(field_name=\"rating\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"description\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n\n# 3. Create collection with the schema\nclient.create_collection(collection_name=COLLECTION_NAME, schema=schema)\n","# Create the index on the collection and load it.\n\n# 1. Prepare index parameters\nindex_params = client.prepare_index_params()\n\n\n# 2. Add an index on the embedding field\nindex_params.add_index(\n field_name=\"embedding\", metric_type=\"IP\", index_type=\"AUTOINDEX\", params={}\n)\n\n\n# 3. Create index\nclient.create_index(collection_name=COLLECTION_NAME, index_params=index_params)\n\n\n# 4. Load collection\nclient.load_collection(collection_name=COLLECTION_NAME, replica_number=1)\n","from datasets import load_dataset\n\ndataset = load_dataset(\"hugginglearners/netflix-shows\", split=\"train\")\n","def emb_texts(texts):\n res = openai_client.embeddings.create(input=texts, model=\"text-embedding-3-small\")\n return [res_data.embedding for res_data in res.data]\n","from tqdm import tqdm\n\n# batch (data to be inserted) is a list of dictionaries\nbatch = []\n\n# Embed and insert in batches\nfor i in tqdm(range(0, len(dataset))):\n batch.append(\n {\n \"title\": dataset[i][\"title\"] or \"\",\n \"type\": dataset[i][\"type\"] or \"\",\n \"release_year\": dataset[i][\"release_year\"] or -1,\n \"rating\": dataset[i][\"rating\"] or \"\",\n \"description\": dataset[i][\"description\"] or \"\",\n }\n )\n\n if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:\n embeddings = emb_texts([item[\"description\"] for item in batch])\n\n for item, emb in zip(batch, embeddings):\n item[\"embedding\"] = emb\n\n client.insert(collection_name=COLLECTION_NAME, data=batch)\n batch = []\n","import textwrap\n\n\ndef query(query, top_k=5):\n text, expr = query\n\n res = client.search(\n collection_name=COLLECTION_NAME,\n data=emb_texts(text),\n filter=expr,\n limit=top_k,\n output_fields=[\"title\", \"type\", \"release_year\", \"rating\", \"description\"],\n search_params={\n \"metric_type\": \"IP\",\n \"params\": {},\n },\n )\n\n print(\"Description:\", text, \"Expression:\", expr)\n\n for hit_group in res:\n print(\"Results:\")\n for rank, hit in enumerate(hit_group, start=1):\n entity = hit[\"entity\"]\n\n print(\n f\"\\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}\"\n )\n print(\n f\"\\t\\tType: {entity.get('type', '')} \"\n f\"Release Year: {entity.get('release_year', '')} \"\n f\"Rating: {entity.get('rating', '')}\"\n )\n description = entity.get(\"description\", \"\")\n print(textwrap.fill(description, width=88))\n print()\n\n\nmy_query = (\"movie about a fluffly animal\", 'release_year < 2019 and rating like \"PG%\"')\n\nquery(my_query)\n"],"headingContent":"Movie Recommendation with Milvus","anchorList":[{"label":"توصيات الأفلام مع ميلفوس","href":"Movie-Recommendation-with-Milvus","type":1,"isActive":false},{"label":"التبعيات والبيئة","href":"Dependencies-and-Environment","type":2,"isActive":false},{"label":"تهيئة عميل OpenAI و Milvus","href":"Initialize-OpenAI-client-and-Milvus","type":2,"isActive":false},{"label":"مجموعة البيانات","href":"Dataset","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-the-Data","type":2,"isActive":false},{"label":"الاستعلام عن قاعدة البيانات","href":"Query-the-Database","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.md new file mode 100644 index 000000000..b1b4410a5 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/movie_recommendation_with_milvus.md @@ -0,0 +1,298 @@ +--- +id: movie_recommendation_with_milvus.md +summary: >- + سنستكشف في هذا الدفتر كيفية إنشاء تضمينات لأوصاف الأفلام باستخدام OpenAI + والاستفادة من تلك التضمينات داخل Milvus للتوصية بالأفلام التي تتوافق مع + تفضيلاتك. ولتحسين نتائج البحث، سنستخدم التصفية لإجراء عمليات البحث عن البيانات + الوصفية. يتم الحصول على مجموعة البيانات المستخدمة في هذا المثال من مجموعات + بيانات HuggingFace وتحتوي على أكثر من 8000 مدخل فيلم، مما يوفر مجموعة غنية من + الخيارات لتوصيات الأفلام. +title: توصيات الأفلام مع ميلفوس +--- +

    توصيات الأفلام مع ميلفوس

    +Open In Colab + + +GitHub Repository +

    +

    في هذا الدفتر، سنستكشف في هذا الدفتر كيفية إنشاء تضمينات لأوصاف الأفلام باستخدام OpenAI والاستفادة من تلك التضمينات داخل Milvus للتوصية بالأفلام التي تتوافق مع تفضيلاتك. لتحسين نتائج البحث، سنستخدم التصفية لإجراء عمليات البحث عن البيانات الوصفية. يتم الحصول على مجموعة البيانات المستخدمة في هذا المثال من مجموعات بيانات HuggingFace وتحتوي على أكثر من 8000 مدخل فيلم، مما يوفر مجموعة غنية من الخيارات لتوصيات الأفلام.

    +

    التبعيات والبيئة

    يمكنك تثبيت التبعيات عن طريق تشغيل الأمر التالي:

    +
    $ pip install openai pymilvus datasets tqdm
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +

    سنستخدم OpenAI باعتباره LLM في هذا المثال. يجب عليك إعداد مفتاح api OPENAI_API_KEY كمتغير بيئة.

    +
    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    تهيئة عميل OpenAI و Milvus

    قم بتهيئة عميل OpenAI.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    قم بتعيين اسم المجموعة والبعد للتضمينات.

    +
    COLLECTION_NAME = "movie_search"
    +DIMENSION = 1536
    +
    +BATCH_SIZE = 1000
    +
    +

    الاتصال بـ Milvus.

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Database
    +client = MilvusClient("./milvus_demo.db")
    +
    +
    +

    بالنسبة لحجة url و token:

    +
      +
    • يعد تعيين uri كملف محلي، على سبيل المثال./milvus.db ، الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين ميزة المصادقة على Milvus، فاستخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +
    # Remove collection if it already exists
    +if client.has_collection(COLLECTION_NAME):
    +    client.drop_collection(COLLECTION_NAME)
    +
    +

    حدد الحقول الخاصة بالمجموعة، والتي تتضمن المعرف والعنوان والنوع وسنة الإصدار والتصنيف والوصف.

    +
    from pymilvus import DataType
    +
    +# Create collection which includes the id, title, and embedding.
    +
    +# 1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=False,
    +)
    +
    +# 2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="type", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="release_year", datatype=DataType.INT64)
    +schema.add_field(field_name="rating", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +# 3. Create collection with the schema
    +client.create_collection(collection_name=COLLECTION_NAME, schema=schema)
    +
    +

    إنشاء الفهرس على المجموعة وتحميله.

    +
    # Create the index on the collection and load it.
    +
    +# 1. Prepare index parameters
    +index_params = client.prepare_index_params()
    +
    +
    +# 2. Add an index on the embedding field
    +index_params.add_index(
    +    field_name="embedding", metric_type="IP", index_type="AUTOINDEX", params={}
    +)
    +
    +
    +# 3. Create index
    +client.create_index(collection_name=COLLECTION_NAME, index_params=index_params)
    +
    +
    +# 4. Load collection
    +client.load_collection(collection_name=COLLECTION_NAME, replica_number=1)
    +
    +

    مجموعة البيانات

    مع تشغيل Milvus، يمكننا البدء في الحصول على بياناتنا. Hugging Face Datasets هو مركز يحتوي على العديد من مجموعات بيانات المستخدمين المختلفة، وفي هذا المثال نستخدم في هذا المثال مجموعة بيانات netflix-shows الخاصة بـ Netflix-shows. تحتوي مجموعة البيانات هذه على أفلام وأزواج بياناتها الوصفية لأكثر من 8 آلاف فيلم. سنقوم بتضمين كل وصف وتخزينه داخل Milvus مع عنوانه ونوعه وسنة_الإصدار والتقييم.

    +
    from datasets import load_dataset
    +
    +dataset = load_dataset("hugginglearners/netflix-shows", split="train")
    +
    +

    إدراج البيانات

    الآن بعد أن أصبح لدينا بياناتنا على جهازنا يمكننا البدء في تضمينها وإدراجها في Milvus. تأخذ دالة التضمين في النص وتعيد التضمينات بتنسيق قائمة.

    +
    def emb_texts(texts):
    +    res = openai_client.embeddings.create(input=texts, model="text-embedding-3-small")
    +    return [res_data.embedding for res_data in res.data]
    +
    +

    هذه الخطوة التالية تقوم بالإدراج الفعلي. نقوم بتكرار جميع الإدخالات وإنشاء دفعات نقوم بإدراجها بمجرد أن نصل إلى حجم الدفعة المحدد. بعد انتهاء الحلقة نقوم بإدراج آخر دفعة متبقية إذا كانت موجودة.

    +
    from tqdm import tqdm
    +
    +# batch (data to be inserted) is a list of dictionaries
    +batch = []
    +
    +# Embed and insert in batches
    +for i in tqdm(range(0, len(dataset))):
    +    batch.append(
    +        {
    +            "title": dataset[i]["title"] or "",
    +            "type": dataset[i]["type"] or "",
    +            "release_year": dataset[i]["release_year"] or -1,
    +            "rating": dataset[i]["rating"] or "",
    +            "description": dataset[i]["description"] or "",
    +        }
    +    )
    +
    +    if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:
    +        embeddings = emb_texts([item["description"] for item in batch])
    +
    +        for item, emb in zip(batch, embeddings):
    +            item["embedding"] = emb
    +
    +        client.insert(collection_name=COLLECTION_NAME, data=batch)
    +        batch = []
    +
    +

    الاستعلام عن قاعدة البيانات

    بعد إدراج بياناتنا بأمان في ميلفوس، يمكننا الآن إجراء استعلام. يأخذ الاستعلام مجموعة من وصف الفيلم الذي تبحث عنه والمرشح الذي ستستخدمه. يمكن العثور على مزيد من المعلومات حول الفلتر هنا. يطبع البحث أولاً الوصف وتعبير المرشح. بعد ذلك لكل نتيجة نقوم بطباعة النتيجة والعنوان والنوع وسنة الإصدار والتقييم ووصف الأفلام الناتجة.

    +
    import textwrap
    +
    +
    +def query(query, top_k=5):
    +    text, expr = query
    +
    +    res = client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=emb_texts(text),
    +        filter=expr,
    +        limit=top_k,
    +        output_fields=["title", "type", "release_year", "rating", "description"],
    +        search_params={
    +            "metric_type": "IP",
    +            "params": {},
    +        },
    +    )
    +
    +    print("Description:", text, "Expression:", expr)
    +
    +    for hit_group in res:
    +        print("Results:")
    +        for rank, hit in enumerate(hit_group, start=1):
    +            entity = hit["entity"]
    +
    +            print(
    +                f"\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}"
    +            )
    +            print(
    +                f"\t\tType: {entity.get('type', '')} "
    +                f"Release Year: {entity.get('release_year', '')} "
    +                f"Rating: {entity.get('rating', '')}"
    +            )
    +            description = entity.get("description", "")
    +            print(textwrap.fill(description, width=88))
    +            print()
    +
    +
    +my_query = ("movie about a fluffly animal", 'release_year < 2019 and rating like "PG%"')
    +
    +query(my_query)
    +
    +
    Description: movie about a fluffly animal Expression: release_year < 2019 and rating like "PG%"
    +Results:
    +    Rank: 1 Score: 0.42213767766952515 Title: The Adventures of Tintin
    +        Type: Movie Release Year: 2011 Rating: PG
    +This 3-D motion capture adapts Georges Remi's classic comic strip about the adventures
    +of fearless young journalist Tintin and his trusty dog, Snowy.
    +
    +    Rank: 2 Score: 0.4041026830673218 Title: Hedgehogs
    +        Type: Movie Release Year: 2016 Rating: PG
    +When a hedgehog suffering from memory loss forgets his identity, he ends up on a big
    +city journey with a pigeon to save his habitat from a human threat.
    +
    +    Rank: 3 Score: 0.3980264663696289 Title: Osmosis Jones
    +        Type: Movie Release Year: 2001 Rating: PG
    +Peter and Bobby Farrelly outdo themselves with this partially animated tale about an
    +out-of-shape 40-year-old man who's the host to various organisms.
    +
    +    Rank: 4 Score: 0.39479154348373413 Title: The Lamb
    +        Type: Movie Release Year: 2017 Rating: PG
    +A big-dreaming donkey escapes his menial existence and befriends some free-spirited
    +animal pals in this imaginative retelling of the Nativity Story.
    +
    +    Rank: 5 Score: 0.39370301365852356 Title: Open Season 2
    +        Type: Movie Release Year: 2008 Rating: PG
    +Elliot the buck and his forest-dwelling cohorts must rescue their dachshund pal from
    +some spoiled pets bent on returning him to domesticity.
    +
    diff --git a/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.json new file mode 100644 index 000000000..c21bc8b93 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm\n","$ git clone https://github.com/FlagOpen/FlagEmbedding.git\n$ pip install -e FlagEmbedding\n","$ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz\n$ tar -xzf amazon_reviews_2023_subset.tar.gz\n","$ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth\n","import torch\nfrom FlagEmbedding.visual.modeling import Visualized_BGE\n\n\nclass Encoder:\n def __init__(self, model_name: str, model_path: str):\n self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)\n self.model.eval()\n\n def encode_query(self, image_path: str, text: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path, text=text)\n return query_emb.tolist()[0]\n\n def encode_image(self, image_path: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path)\n return query_emb.tolist()[0]\n\n\nmodel_name = \"BAAI/bge-base-en-v1.5\"\nmodel_path = \"./Visualized_base_en_v1.5.pth\" # Change to your own value if using a different model path\nencoder = Encoder(model_name, model_path)\n","import os\nfrom tqdm import tqdm\nfrom glob import glob\n\n\n# Generate embeddings for the image dataset\ndata_dir = (\n \"./images_folder\" # Change to your own value if using a different data directory\n)\nimage_list = glob(\n os.path.join(data_dir, \"images\", \"*.jpg\")\n) # We will only use images ending with \".jpg\"\nimage_dict = {}\nfor image_path in tqdm(image_list, desc=\"Generating image embeddings: \"):\n try:\n image_dict[image_path] = encoder.encode_image(image_path)\n except Exception as e:\n print(f\"Failed to generate embedding for {image_path}. Skipped.\")\n continue\nprint(\"Number of encoded images:\", len(image_dict))\n","from pymilvus import MilvusClient\n\n\ndim = len(list(image_dict.values())[0])\ncollection_name = \"multimodal_rag_demo\"\n\n# Connect to Milvus client given URI\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\n# Create Milvus Collection\n# By default, vector field name is \"vector\"\nmilvus_client.create_collection(\n collection_name=collection_name,\n auto_id=True,\n dimension=dim,\n enable_dynamic_field=True,\n)\n\n# Insert data into collection\nmilvus_client.insert(\n collection_name=collection_name,\n data=[{\"image_path\": k, \"vector\": v} for k, v in image_dict.items()],\n)\n","query_image = os.path.join(\n data_dir, \"leopard.jpg\"\n) # Change to your own query image path\nquery_text = \"phone case with this image theme\"\n\n# Generate query embedding given image and text instructions\nquery_vec = encoder.encode_query(image_path=query_image, text=query_text)\n\nsearch_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vec],\n output_fields=[\"image_path\"],\n limit=9, # Max number of search results to return\n search_params={\"metric_type\": \"COSINE\", \"params\": {}}, # Search parameters\n)[0]\n\nretrieved_images = [hit.get(\"entity\").get(\"image_path\") for hit in search_results]\nprint(retrieved_images)\n","import numpy as np\nimport cv2\n\nimg_height = 300\nimg_width = 300\nrow_count = 3\n\n\ndef create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:\n \"\"\"\n creates a 5x5 panoramic view image from a list of images\n\n args:\n images: list of images to be combined\n\n returns:\n np.ndarray: the panoramic view image\n \"\"\"\n panoramic_width = img_width * row_count\n panoramic_height = img_height * row_count\n panoramic_image = np.full(\n (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8\n )\n\n # create and resize the query image with a blue border\n query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)\n query_image = Image.open(query_image_path).convert(\"RGB\")\n query_array = np.array(query_image)[:, :, ::-1]\n resized_image = cv2.resize(query_array, (img_width, img_height))\n\n border_size = 10\n blue = (255, 0, 0) # blue color in BGR\n bordered_query_image = cv2.copyMakeBorder(\n resized_image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=blue,\n )\n\n query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(\n bordered_query_image, (img_width, img_height)\n )\n\n # add text \"query\" below the query image\n text = \"query\"\n font_scale = 1\n font_thickness = 2\n text_org = (10, img_height * 3 + 30)\n cv2.putText(\n query_image_null,\n text,\n text_org,\n cv2.FONT_HERSHEY_SIMPLEX,\n font_scale,\n blue,\n font_thickness,\n cv2.LINE_AA,\n )\n\n # combine the rest of the images into the panoramic view\n retrieved_imgs = [\n np.array(Image.open(img).convert(\"RGB\"))[:, :, ::-1] for img in retrieved_images\n ]\n for i, image in enumerate(retrieved_imgs):\n image = cv2.resize(image, (img_width - 4, img_height - 4))\n row = i // row_count\n col = i % row_count\n start_row = row * img_height\n start_col = col * img_width\n\n border_size = 2\n bordered_image = cv2.copyMakeBorder(\n image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=(0, 0, 0),\n )\n panoramic_image[\n start_row : start_row + img_height, start_col : start_col + img_width\n ] = bordered_image\n\n # add red index numbers to each image\n text = str(i)\n org = (start_col + 50, start_row + 30)\n (font_width, font_height), baseline = cv2.getTextSize(\n text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2\n )\n\n top_left = (org[0] - 48, start_row + 2)\n bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)\n\n cv2.rectangle(\n panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED\n )\n cv2.putText(\n panoramic_image,\n text,\n (start_col + 10, start_row + 30),\n cv2.FONT_HERSHEY_SIMPLEX,\n 1,\n (0, 0, 255),\n 2,\n cv2.LINE_AA,\n )\n\n # combine the query image with the panoramic view\n panoramic_image = np.hstack([query_image_null, panoramic_image])\n return panoramic_image\n","from PIL import Image\n\ncombined_image_path = os.path.join(data_dir, \"combined_image.jpg\")\npanoramic_image = create_panoramic_view(query_image, retrieved_images)\ncv2.imwrite(combined_image_path, panoramic_image)\n\ncombined_image = Image.open(combined_image_path)\nshow_combined_image = combined_image.resize((300, 300))\nshow_combined_image.show()\n","import requests\nimport base64\n\nopenai_api_key = \"sk-***\" # Change to your OpenAI API Key\n\n\ndef generate_ranking_explanation(\n combined_image_path: str, caption: str, infos: dict = None\n) -> tuple[list[int], str]:\n with open(combined_image_path, \"rb\") as image_file:\n base64_image = base64.b64encode(image_file.read()).decode(\"utf-8\")\n\n information = (\n \"You are responsible for ranking results for a Composed Image Retrieval. \"\n \"The user retrieves an image with an 'instruction' indicating their retrieval intent. \"\n \"For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. \"\n \"Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. \"\n f\"User instruction: {caption} \\n\\n\"\n )\n\n # add additional information for each image\n if infos:\n for i, info in enumerate(infos[\"product\"]):\n information += f\"{i}. {info}\\n\"\n\n information += (\n \"Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. \"\n \"The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent.\"\n )\n\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\",\n }\n\n payload = {\n \"model\": \"gpt-4o\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": information},\n {\n \"type\": \"image_url\",\n \"image_url\": {\"url\": f\"data:image/jpeg;base64,{base64_image}\"},\n },\n ],\n }\n ],\n \"max_tokens\": 300,\n }\n\n response = requests.post(\n \"https://api.openai.com/v1/chat/completions\", headers=headers, json=payload\n )\n result = response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n # parse the ranked indices from the response\n start_idx = result.find(\"[\")\n end_idx = result.find(\"]\")\n ranked_indices_str = result[start_idx + 1 : end_idx].split(\",\")\n ranked_indices = [int(index.strip()) for index in ranked_indices_str]\n\n # extract explanation\n explanation = result[end_idx + 1 :].strip()\n\n return ranked_indices, explanation\n","ranked_indices, explanation = generate_ranking_explanation(\n combined_image_path, query_text\n)\n","print(explanation)\n\nbest_index = ranked_indices[0]\nbest_img = Image.open(retrieved_images[best_index])\nbest_img = best_img.resize((150, 150))\nbest_img.show()\n"],"headingContent":"Multimodal RAG with Milvus","anchorList":[{"label":"RAG متعدد الوسائط مع Milvus","href":"Multimodal-RAG-with-Milvus","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"تحميل البيانات","href":"Load-Data","type":2,"isActive":false},{"label":"البحث متعدد الوسائط مع أداة إعادة التصنيف التوليدية","href":"Multimodal-Search-with-Generative-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.md new file mode 100644 index 000000000..a332a4a22 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/multimodal_rag_with_milvus.md @@ -0,0 +1,424 @@ +--- +id: multimodal_rag_with_milvus.md +summary: RAG متعدد الوسائط مع ميلفوس +title: RAG متعدد الوسائط مع Milvus +--- +

    RAG متعدد الوسائط مع Milvus

    Open In Colab +GitHub Repository

    +

    +

    يعرض هذا البرنامج التعليمي نظام RAG متعدد الوسائط المدعوم من Milvus ونموذج BGE المرئي ونموذج الاسترجاع المركب GPT-4o. باستخدام هذا النظام، يمكن للمستخدمين تحميل صورة وتحرير تعليمات نصية، والتي تتم معالجتها بواسطة نموذج الاسترجاع المركب من BGE للبحث عن الصور المرشحة. ثم يعمل نظام GPT-4o بعد ذلك كمُعيد تنقيح للصور، حيث يقوم باختيار الصورة الأنسب وتقديم الأساس المنطقي وراء الاختيار. يُتيح هذا المزيج القوي تجربة بحث سلسة وبديهية عن الصور، مستفيداً من Milvus للاسترجاع الفعّال، ونموذج BGE لمعالجة الصور ومطابقتها بدقة، وGPT-4o لإعادة الترتيب المتقدم.

    +

    الإعداد

    تثبيت التبعيات

    $ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm
    +
    +
    $ git clone https://github.com/FlagOpen/FlagEmbedding.git
    +$ pip install -e FlagEmbedding
    +
    +
    +

    إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

    +
    +

    تنزيل البيانات

    سيقوم الأمر التالي بتنزيل بيانات المثال واستخراجها إلى مجلد محلي "./images_folder" بما في ذلك:

    +
      +
    • الصور: مجموعة فرعية من مراجعات أمازون 2023 تحتوي على ما يقرب من 900 صورة من فئات "الأجهزة" و"الهواتف_الجوّالة_والإكسسوارات" و"الإلكترونيات".

    • +
    • leopard.jpg: مثال على صورة استعلام.

    • +
    +
    $ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz
    +$ tar -xzf amazon_reviews_2023_subset.tar.gz
    +
    +

    تحميل نموذج التضمين

    سوف نستخدم نموذج BGE المرئي "bge-visualized-bvisualized-base-en-v1.5" لتوليد تضمينات لكل من الصور والنصوص.

    +

    1. تحميل الوزن

    +
    $ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth
    +
    +

    2. بناء المشفر

    +
    import torch
    +from FlagEmbedding.visual.modeling import Visualized_BGE
    +
    +
    +class Encoder:
    +    def __init__(self, model_name: str, model_path: str):
    +        self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)
    +        self.model.eval()
    +
    +    def encode_query(self, image_path: str, text: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path, text=text)
    +        return query_emb.tolist()[0]
    +
    +    def encode_image(self, image_path: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path)
    +        return query_emb.tolist()[0]
    +
    +
    +model_name = "BAAI/bge-base-en-v1.5"
    +model_path = "./Visualized_base_en_v1.5.pth"  # Change to your own value if using a different model path
    +encoder = Encoder(model_name, model_path)
    +
    +

    تحميل البيانات

    سيقوم هذا القسم بتحميل أمثلة على الصور في قاعدة البيانات مع التضمينات المقابلة.

    +

    توليد التضمينات

    قم بتحميل جميع صور jpeg من دليل البيانات وتطبيق المشفر لتحويل الصور إلى تضمينات.

    +
    import os
    +from tqdm import tqdm
    +from glob import glob
    +
    +
    +# Generate embeddings for the image dataset
    +data_dir = (
    +    "./images_folder"  # Change to your own value if using a different data directory
    +)
    +image_list = glob(
    +    os.path.join(data_dir, "images", "*.jpg")
    +)  # We will only use images ending with ".jpg"
    +image_dict = {}
    +for image_path in tqdm(image_list, desc="Generating image embeddings: "):
    +    try:
    +        image_dict[image_path] = encoder.encode_image(image_path)
    +    except Exception as e:
    +        print(f"Failed to generate embedding for {image_path}. Skipped.")
    +        continue
    +print("Number of encoded images:", len(image_dict))
    +
    +
    Generating image embeddings: 100%|██████████| 900/900 [00:20<00:00, 44.08it/s]
    +
    +Number of encoded images: 900
    +
    +

    إدراج في ميلفوس

    إدراج الصور مع المسارات والتضمينات المقابلة في مجموعة Milvus.

    +
    +

    بالنسبة لحجة MilvusClient:

    +
      +
    • يعد تعيين uri كملف محلي، على سبيل المثال ./milvus_demo.db ، هو الطريقة الأكثر ملاءمة، حيث أنه يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +
    from pymilvus import MilvusClient
    +
    +
    +dim = len(list(image_dict.values())[0])
    +collection_name = "multimodal_rag_demo"
    +
    +# Connect to Milvus client given URI
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +# Create Milvus Collection
    +# By default, vector field name is "vector"
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    auto_id=True,
    +    dimension=dim,
    +    enable_dynamic_field=True,
    +)
    +
    +# Insert data into collection
    +milvus_client.insert(
    +    collection_name=collection_name,
    +    data=[{"image_path": k, "vector": v} for k, v in image_dict.items()],
    +)
    +
    +
    {'insert_count': 900,
    + 'ids': [451537887696781312, 451537887696781313, ..., 451537887696782211],
    + 'cost': 0}
    +
    +

    البحث متعدد الوسائط مع أداة إعادة التصنيف التوليدية

    في هذا القسم، سنبحث أولاً عن الصور ذات الصلة من خلال استعلام متعدد الوسائط ثم نستخدم خدمة LLM لإعادة تصنيف النتائج والعثور على أفضلها مع الشرح.

    +

    نحن الآن جاهزون لإجراء البحث المتقدم عن الصور باستخدام بيانات الاستعلام المكونة من تعليمات الصور والنصوص.

    +
    query_image = os.path.join(
    +    data_dir, "leopard.jpg"
    +)  # Change to your own query image path
    +query_text = "phone case with this image theme"
    +
    +# Generate query embedding given image and text instructions
    +query_vec = encoder.encode_query(image_path=query_image, text=query_text)
    +
    +search_results = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[query_vec],
    +    output_fields=["image_path"],
    +    limit=9,  # Max number of search results to return
    +    search_params={"metric_type": "COSINE", "params": {}},  # Search parameters
    +)[0]
    +
    +retrieved_images = [hit.get("entity").get("image_path") for hit in search_results]
    +print(retrieved_images)
    +
    +
    ['./images_folder/images/518Gj1WQ-RL._AC_.jpg', './images_folder/images/41n00AOfWhL._AC_.jpg', './images_folder/images/51Wqge9HySL._AC_.jpg', './images_folder/images/51R2SZiywnL._AC_.jpg', './images_folder/images/516PebbMAcL._AC_.jpg', './images_folder/images/51RrgfYKUfL._AC_.jpg', './images_folder/images/515DzQVKKwL._AC_.jpg', './images_folder/images/51BsgVw6RhL._AC_.jpg', './images_folder/images/51INtcXu9FL._AC_.jpg']
    +
    +

    إعادة الترتيب باستخدام GPT-4o

    سنستخدم خدمة LLM لترتيب الصور وإنشاء شرح لأفضل نتيجة بناءً على استعلام المستخدم والنتائج المسترجعة.

    +

    1. إنشاء عرض بانورامي

    +
    import numpy as np
    +import cv2
    +
    +img_height = 300
    +img_width = 300
    +row_count = 3
    +
    +
    +def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:
    +    """
    +    creates a 5x5 panoramic view image from a list of images
    +
    +    args:
    +        images: list of images to be combined
    +
    +    returns:
    +        np.ndarray: the panoramic view image
    +    """
    +    panoramic_width = img_width * row_count
    +    panoramic_height = img_height * row_count
    +    panoramic_image = np.full(
    +        (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8
    +    )
    +
    +    # create and resize the query image with a blue border
    +    query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)
    +    query_image = Image.open(query_image_path).convert("RGB")
    +    query_array = np.array(query_image)[:, :, ::-1]
    +    resized_image = cv2.resize(query_array, (img_width, img_height))
    +
    +    border_size = 10
    +    blue = (255, 0, 0)  # blue color in BGR
    +    bordered_query_image = cv2.copyMakeBorder(
    +        resized_image,
    +        border_size,
    +        border_size,
    +        border_size,
    +        border_size,
    +        cv2.BORDER_CONSTANT,
    +        value=blue,
    +    )
    +
    +    query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(
    +        bordered_query_image, (img_width, img_height)
    +    )
    +
    +    # add text "query" below the query image
    +    text = "query"
    +    font_scale = 1
    +    font_thickness = 2
    +    text_org = (10, img_height * 3 + 30)
    +    cv2.putText(
    +        query_image_null,
    +        text,
    +        text_org,
    +        cv2.FONT_HERSHEY_SIMPLEX,
    +        font_scale,
    +        blue,
    +        font_thickness,
    +        cv2.LINE_AA,
    +    )
    +
    +    # combine the rest of the images into the panoramic view
    +    retrieved_imgs = [
    +        np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images
    +    ]
    +    for i, image in enumerate(retrieved_imgs):
    +        image = cv2.resize(image, (img_width - 4, img_height - 4))
    +        row = i // row_count
    +        col = i % row_count
    +        start_row = row * img_height
    +        start_col = col * img_width
    +
    +        border_size = 2
    +        bordered_image = cv2.copyMakeBorder(
    +            image,
    +            border_size,
    +            border_size,
    +            border_size,
    +            border_size,
    +            cv2.BORDER_CONSTANT,
    +            value=(0, 0, 0),
    +        )
    +        panoramic_image[
    +            start_row : start_row + img_height, start_col : start_col + img_width
    +        ] = bordered_image
    +
    +        # add red index numbers to each image
    +        text = str(i)
    +        org = (start_col + 50, start_row + 30)
    +        (font_width, font_height), baseline = cv2.getTextSize(
    +            text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2
    +        )
    +
    +        top_left = (org[0] - 48, start_row + 2)
    +        bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)
    +
    +        cv2.rectangle(
    +            panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED
    +        )
    +        cv2.putText(
    +            panoramic_image,
    +            text,
    +            (start_col + 10, start_row + 30),
    +            cv2.FONT_HERSHEY_SIMPLEX,
    +            1,
    +            (0, 0, 255),
    +            2,
    +            cv2.LINE_AA,
    +        )
    +
    +    # combine the query image with the panoramic view
    +    panoramic_image = np.hstack([query_image_null, panoramic_image])
    +    return panoramic_image
    +
    +

    اجمع بين صورة الاستعلام والصور المسترجعة مع المؤشرات في عرض بانورامي.

    +
    from PIL import Image
    +
    +combined_image_path = os.path.join(data_dir, "combined_image.jpg")
    +panoramic_image = create_panoramic_view(query_image, retrieved_images)
    +cv2.imwrite(combined_image_path, panoramic_image)
    +
    +combined_image = Image.open(combined_image_path)
    +show_combined_image = combined_image.resize((300, 300))
    +show_combined_image.show()
    +
    +

    + + Create a panoramic view + إنشاء عرض بانورامي

    +

    2. إعادة التصنيف والشرح

    +

    سنقوم بإرسال الصورة المدمجة إلى خدمة LLM متعددة الوسائط مع المطالبات المناسبة لترتيب النتائج المسترجعة مع الشرح. لتمكين GPT-4o كخدمة LLM، تحتاج إلى إعداد مفتاح OpenAI API الخاص بك.

    +
    import requests
    +import base64
    +
    +openai_api_key = "sk-***"  # Change to your OpenAI API Key
    +
    +
    +def generate_ranking_explanation(
    +    combined_image_path: str, caption: str, infos: dict = None
    +) -> tuple[list[int], str]:
    +    with open(combined_image_path, "rb") as image_file:
    +        base64_image = base64.b64encode(image_file.read()).decode("utf-8")
    +
    +    information = (
    +        "You are responsible for ranking results for a Composed Image Retrieval. "
    +        "The user retrieves an image with an 'instruction' indicating their retrieval intent. "
    +        "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. "
    +        "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. "
    +        f"User instruction: {caption} \n\n"
    +    )
    +
    +    # add additional information for each image
    +    if infos:
    +        for i, info in enumerate(infos["product"]):
    +            information += f"{i}. {info}\n"
    +
    +    information += (
    +        "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. "
    +        "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent."
    +    )
    +
    +    headers = {
    +        "Content-Type": "application/json",
    +        "Authorization": f"Bearer {openai_api_key}",
    +    }
    +
    +    payload = {
    +        "model": "gpt-4o",
    +        "messages": [
    +            {
    +                "role": "user",
    +                "content": [
    +                    {"type": "text", "text": information},
    +                    {
    +                        "type": "image_url",
    +                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
    +                    },
    +                ],
    +            }
    +        ],
    +        "max_tokens": 300,
    +    }
    +
    +    response = requests.post(
    +        "https://api.openai.com/v1/chat/completions", headers=headers, json=payload
    +    )
    +    result = response.json()["choices"][0]["message"]["content"]
    +
    +    # parse the ranked indices from the response
    +    start_idx = result.find("[")
    +    end_idx = result.find("]")
    +    ranked_indices_str = result[start_idx + 1 : end_idx].split(",")
    +    ranked_indices = [int(index.strip()) for index in ranked_indices_str]
    +
    +    # extract explanation
    +    explanation = result[end_idx + 1 :].strip()
    +
    +    return ranked_indices, explanation
    +
    +

    احصل على مؤشرات الصورة بعد الترتيب وسبب أفضل نتيجة:

    +
    ranked_indices, explanation = generate_ranking_explanation(
    +    combined_image_path, query_text
    +)
    +
    +

    3. عرض أفضل نتيجة مع الشرح

    +
    print(explanation)
    +
    +best_index = ranked_indices[0]
    +best_img = Image.open(retrieved_images[best_index])
    +best_img = best_img.resize((150, 150))
    +best_img.show()
    +
    +
    Reasons: The most suitable item for the user's query intent is index 6 because the instruction specifies a phone case with the theme of the image, which is a leopard. The phone case with index 6 has a thematic design resembling the leopard pattern, making it the closest match to the user's request for a phone case with the image theme.
    +
    +

    + + The best result + أفضل نتيجة

    +

    النشر السريع

    لمعرفة كيفية بدء عرض توضيحي عبر الإنترنت باستخدام هذا البرنامج التعليمي، يرجى الرجوع إلى مثال التطبيق.

    diff --git a/localization/v2.5.x/site/ar/tutorials/question_answering_system.json b/localization/v2.5.x/site/ar/tutorials/question_answering_system.json new file mode 100644 index 000000000..d0ae2e719 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/question_answering_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Question Answering System","anchorList":[{"label":"نظام الإجابة على الأسئلة","href":"Question-Answering-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/question_answering_system.md b/localization/v2.5.x/site/ar/tutorials/question_answering_system.md new file mode 100644 index 000000000..c2b08ddc9 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/question_answering_system.md @@ -0,0 +1,44 @@ +--- +id: question_answering_system.md +summary: أنشئ نظاماً للإجابة على الأسئلة باستخدام Milvus. +title: نظام الإجابة على الأسئلة +--- +

    نظام الإجابة على الأسئلة

    يشرح هذا البرنامج التعليمي كيفية استخدام قاعدة البيانات المتجهة مفتوحة المصدر "ميلفوس" لبناء نظام للإجابة عن الأسئلة (QA).

    + +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    + +


    +

    نظام الإجابة على الأسئلة هو تطبيق شائع في العالم الحقيقي ينتمي إلى مجال معالجة اللغة الطبيعية. تتضمن أنظمة ضمان الجودة النموذجية أنظمة خدمة العملاء عبر الإنترنت، وروبوتات الدردشة الآلية لضمان الجودة وغيرها. يمكن تصنيف معظم أنظمة الإجابة على الأسئلة على النحو التالي: أنظمة الإجابة على الأسئلة التوليدية أو الاسترجاعية، أو أنظمة الإجابة على الأسئلة أحادية الجولة أو متعددة الجولات أو مفتوحة المجال أو أنظمة الإجابة على أسئلة محددة.

    +


    +

    في هذا البرنامج التعليمي، سوف تتعلم كيفية بناء نظام ضمان الجودة الذي يمكنه ربط أسئلة المستخدم الجديدة بإجابات ضخمة مخزنة مسبقًا في قاعدة بيانات المتجهات. لبناء روبوت الدردشة الآلي هذا، قم بإعداد مجموعة البيانات الخاصة بك من الأسئلة والإجابات المقابلة. قم بتخزين الأسئلة والأجوبة في MySQL، وهي قاعدة بيانات علائقية. ثم استخدم BERT، وهو نموذج التعلم الآلي (ML) لمعالجة اللغة الطبيعية (NLP) لتحويل الأسئلة إلى متجهات. يتم تخزين ناقلات الأسئلة هذه وفهرستها في Milvus. عندما يُدخل المستخدمون سؤالاً جديدًا، يتم تحويله إلى متجه بواسطة نموذج BERT أيضًا، ويبحث Milvus عن متجه السؤال الأكثر تشابهًا مع هذا المتجه الجديد. يقوم نظام ضمان الجودة بإرجاع الإجابة المقابلة للأسئلة الأكثر تشابهًا.

    +


    +

    + + QA_Chatbot + QA_Chatbot

    +

    + + QA_chatbot_demo + QA_Chatbot_demo

    diff --git a/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.json b/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.json new file mode 100644 index 000000000..ed20e70fb --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.json @@ -0,0 +1 @@ +{"codeList":["attu.app is damaged and cannot be opened.\n","sudo xattr -rd com.apple.quarantine /Applications/attu.app\n","wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\nunzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n text_lines += file_text.split(\"# \")\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n\n# Generate test embedding\ntest_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","768\n[-0.04836066 0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448\n -0.03041712 -0.02269499 -0.02317863 -0.00426028]\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Standalone\nclient = MilvusClient(uri=\"http://localhost:19530\")\n\ncollection_name = \"attu_tutorial\"\n\n# Drop collection if it exists\nif client.has_collection(collection_name):\n client.drop_collection(collection_name)\n\n# Create a new collection\nclient.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\"\n)\n","from tqdm import tqdm\n\ndata = []\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nclient.insert(collection_name=collection_name, data=data)\n"],"headingContent":"Quick Start with Attu Desktop","anchorList":[{"label":"البدء السريع مع Attu Desktop","href":"Quick-Start-with-Attu-Desktop","type":1,"isActive":false},{"label":"1. مقدمة","href":"1-Introduction","type":2,"isActive":false},{"label":"2. تثبيت تطبيق سطح المكتب","href":"2-Install-Desktop-Application","type":2,"isActive":false},{"label":"3. الاتصال بـ Milvus","href":"3-Connect-to-Milvus","type":2,"isActive":false},{"label":"4. إعداد البيانات، وإنشاء المجموعة، وإدراج البيانات","href":"4-Prepare-Data-Create-Collection-and-Insert-Data","type":2,"isActive":false},{"label":"5. تصوّر نتائج البحث والعلاقات","href":"5-Visualizing-Search-Results-and-Relationships","type":2,"isActive":false},{"label":"6. الخاتمة","href":"6-Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.md b/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.md new file mode 100644 index 000000000..3a13bb6f3 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/quickstart_with_attu.md @@ -0,0 +1,241 @@ +--- +id: quickstart_with_attu.md +summary: >- + Attu هي أداة إدارة شاملة ومفتوحة المصدر لـ Milvus. تتميز بواجهة مستخدم رسومية + بديهية (GUI)، مما يتيح لك التفاعل بسهولة مع قواعد بياناتك. ببضع نقرات فقط، + يمكنك تصور حالة مجموعتك وإدارة البيانات الوصفية وإجراء استعلامات البيانات وغير + ذلك الكثير. +title: نظام الإجابة على الأسئلة +--- +

    البدء السريع مع Attu Desktop

    1. مقدمة

    Attu هو أداة إدارة شاملة ومفتوحة المصدر لملفوس. تتميز بواجهة مستخدم رسومية سهلة الاستخدام (GUI)، مما يتيح لك التفاعل بسهولة مع قواعد بياناتك. ببضع نقرات فقط، يمكنك تصور حالة مجموعتك وإدارة البيانات الوصفية وإجراء استعلامات البيانات وغير ذلك الكثير.

    +
    +

    2. تثبيت تطبيق سطح المكتب

    قم بتنزيل إصدار سطح المكتب من Attu من خلال زيارة صفحة إصدارات Attu GitHub. حدد الإصدار المناسب لنظام التشغيل الخاص بك واتبع خطوات التثبيت.

    +

    ملاحظة لنظام macOS (شريحة سلسلة M):

    إذا واجهت الخطأ:

    +
    attu.app is damaged and cannot be opened.
    +
    +

    قم بتشغيل الأمر التالي في المحطة الطرفية لتجاوز هذه المشكلة:

    +
    sudo xattr -rd com.apple.quarantine /Applications/attu.app
    +
    +
    +

    3. الاتصال بـ Milvus

    يدعم Attu الاتصال بكل من Milvus Standalone وZilliz Cloud، مما يوفر مرونة في العمل مع قواعد البيانات المحلية أو المستضافة على السحابة.

    +

    لاستخدام Milvus Standalone محليًا:

    +
      +
    1. ابدأ تشغيل ميلفوس ستاندالون باتباع دليل تثبيت ميلفوس.
    2. +
    3. افتح Attu وأدخل معلومات الاتصال:
        +
      • عنوان ميلفوس: URI خادم Milvus Standalone الخاص بك، على سبيل المثال http://localhost:19530
      • +
      • إعدادات اختيارية أخرى: يمكنك تعيينها بناءً على تكوينات ميلفوس الخاصة بك أو تركها كإعدادات افتراضية.
      • +
    4. +
    5. انقر فوق اتصال للوصول إلى قاعدة البيانات الخاصة بك.
    6. +
    +
    +

    يمكنك أيضًا توصيل ميلفوس المُدار بالكامل على زيليز كلاود. ما عليك سوى تعيين Milvus Address و token إلى نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات لمثيل Zilliz Cloud الخاص بك.

    +
    +
      +
    1. انقر للوصول إلى قاعدة البيانات الخاصة بك.
    2. +
    +

    + Attu Login Page +

    +
    +

    4. إعداد البيانات، وإنشاء المجموعة، وإدراج البيانات

    4.1 إعداد البيانات

    نستخدم صفحات الأسئلة الشائعة من وثائق ميلفوس 2.4.x كمجموعة بيانات لهذا المثال.

    +

    تنزيل البيانات واستخراجها:

    wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    معالجة ملفات تخفيض السعر:

    from glob import glob
    +
    +text_lines = []
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +    text_lines += file_text.split("# ")
    +
    +
    +

    4.2 توليد التضمينات

    حدد نموذج تضمين لتوليد تضمينات نصية باستخدام milvus_model. نستخدم نموذج DefaultEmbeddingFunction كمثال، وهو نموذج تضمين خفيف الوزن ومدرب مسبقًا.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +# Generate test embedding
    +test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +

    الإخراج:

    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +
    +

    4.3 إنشاء مجموعة

    اتصل بميلفوس وأنشئ مجموعة:

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Standalone
    +client = MilvusClient(uri="http://localhost:19530")
    +
    +collection_name = "attu_tutorial"
    +
    +# Drop collection if it exists
    +if client.has_collection(collection_name):
    +    client.drop_collection(collection_name)
    +
    +# Create a new collection
    +client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong"
    +)
    +
    +
    +

    4.4 إدراج البيانات

    قم بتكرار الأسطر النصية وإنشاء تضمينات وإدراج البيانات في ملفوس:

    +
    from tqdm import tqdm
    +
    +data = []
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    4.5 تصور البيانات والمخطط

    يمكننا الآن تصور مخطط البيانات والكيانات المدرجة باستخدام واجهة أتو. يعرض المخطط الحقول المحددة، بما في ذلك حقل id من النوع Int64 وحقل vector من النوع FloatVector(768) مع مقياس Inner Product (IP). يتم تحميل المجموعة بـ 72 كيانًا.

    +

    بالإضافة إلى ذلك، يمكننا عرض البيانات المدرجة، بما في ذلك المعرف، والتضمينات المتجهة، والحقول الديناميكية التي تخزن البيانات الوصفية مثل المحتوى النصي. تدعم الواجهة التصفية والاستعلام بناءً على شروط محددة أو حقول ديناميكية.

    +

    + Schema View + Data View +

    +

    5. تصوّر نتائج البحث والعلاقات

    يوفر Attu واجهة قوية لتصور علاقات البيانات واستكشافها. لفحص نقاط البيانات المدرجة وعلاقات التشابه بينها، اتبع الخطوات التالية:

    +

    انتقل إلى علامة التبويب بحث المتجهات في أتو.

    +
      +
    1. انقر على زر توليد بيانات عشوائية لإنشاء استعلامات اختبارية.
    2. +
    3. انقر فوق بحث لاسترداد النتائج بناءً على البيانات التي تم إنشاؤها.
    4. +
    +

    يتم عرض النتائج في جدول، يعرض المعرفات ودرجات التشابه والحقول الديناميكية لكل كيان مطابق.

    +

    + Search Results Table +

    +
    +

    5.2 استكشاف علاقات البيانات

    انقر فوق الزر استكشاف في لوحة النتائج لتصور العلاقات بين متجه الاستعلام ونتائج البحث في بنية تشبه الرسم البياني المعرفي.

    +
      +
    • تمثل العقدة المركزية متجه البحث.
    • +
    • تمثل العقد المتصلة نتائج البحث، وسيؤدي النقر فوقها إلى عرض المعلومات التفصيلية للعقدة المقابلة.
    • +
    +

    + Knowledge Graph Visualization +

    +
    +

    5.3 توسيع الرسم البياني

    انقر نقرًا مزدوجًا فوق أي عقدة نتيجة لتوسيع اتصالاتها. يكشف هذا الإجراء عن علاقات إضافية بين العقدة المحددة ونقاط البيانات الأخرى في المجموعة، مما يؤدي إلى إنشاء رسم بياني معرفي أكبر ومترابط.

    +

    يتيح هذا العرض الموسّع استكشافًا أعمق لكيفية ارتباط نقاط البيانات ببعضها البعض، استنادًا إلى تشابه المتجهات.

    +

    + Expanded Knowledge Graph +

    +
    +

    6. الخاتمة

    يعمل Attu على تبسيط إدارة وتصور البيانات المتجهة المخزنة في ميلفوس. من إدخال البيانات إلى تنفيذ الاستعلام والاستكشاف التفاعلي، يوفر واجهة سهلة الاستخدام للتعامل مع مهام البحث المتجه المعقدة. وبفضل ميزات مثل دعم المخطط الديناميكي، وتصورات البحث الرسومية، ومرشحات الاستعلام المرنة، يمكّن Attu المستخدمين من تحليل مجموعات البيانات واسعة النطاق بفعالية.

    +

    من خلال الاستفادة من أدوات الاستكشاف المرئي في Attu، يمكن للمستخدمين فهم بياناتهم بشكل أفضل، وتحديد العلاقات الخفية، واتخاذ قرارات قائمة على البيانات. ابدأ في استكشاف مجموعات البيانات الخاصة بك اليوم مع Attu وMilvus!

    +
    diff --git a/localization/v2.5.x/site/ar/tutorials/recommendation_system.json b/localization/v2.5.x/site/ar/tutorials/recommendation_system.json new file mode 100644 index 000000000..9d4597adc --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/recommendation_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Recommender System","anchorList":[{"label":"نظام التوصية","href":"Recommender-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/recommendation_system.md b/localization/v2.5.x/site/ar/tutorials/recommendation_system.md new file mode 100644 index 000000000..57e2900df --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/recommendation_system.md @@ -0,0 +1,36 @@ +--- +id: recommendation_system.md +summary: أنشئ نظام توصية مخصص مع ميلفوس. +title: نظام التوصية +--- +

    نظام التوصية

    يوضح هذا البرنامج التعليمي كيفية استخدام Milvus، قاعدة البيانات المتجهة مفتوحة المصدر، لبناء نظام توصية.

    +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    +
      +
    • PaddlePaddle
    • +
    • ريديس أو MySQL
    • +
    • تاهي
    • +
    +


    +

    نظام التوصية هو مجموعة فرعية من نظام تصفية المعلومات، والذي يمكن استخدامه في سيناريوهات مختلفة بما في ذلك التوصية المخصصة للأفلام والموسيقى والمنتجات وتدفق المعلومات. على عكس محركات البحث، لا تتطلب أنظمة التوصية من المستخدمين وصف احتياجاتهم بدقة، بل تكتشف احتياجات المستخدمين واهتماماتهم من خلال تحليل سلوكيات المستخدم.

    +


    +

    في هذا البرنامج التعليمي، سوف تتعلم كيفية بناء نظام توصية بالأفلام يمكنه اقتراح أفلام تلبي اهتمامات المستخدم. لبناء نظام التوصية هذا، قم أولاً بتنزيل مجموعة بيانات متعلقة بالأفلام. يستخدم هذا البرنامج التعليمي MovieLens 1M. وبدلاً من ذلك، يمكنك إعداد مجموعات البيانات الخاصة بك، والتي يجب أن تتضمن معلومات مثل تقييمات المستخدمين للأفلام، والخصائص الديموغرافية للمستخدمين، ووصف الفيلم. استخدم PaddlePaddle لدمج معرّفات المستخدمين والميزات وتحويلها إلى متجهات ذات 256 بُعدًا. تحويل معرّفات الأفلام وميزاتها إلى متجهات بطريقة مماثلة. تخزين متجهات الأفلام في Milvus واستخدام متجهات المستخدم للبحث عن التشابه. إذا كان متجه المستخدم مشابهًا لمتجه فيلم، فسيقوم Milvus بإرجاع متجه الفيلم ومعرفه كنتيجة توصية. ثم استعلام معلومات الفيلم باستخدام معرف متجه الفيلم المخزن في Redis أو MySQL.

    +


    +

    + + recommender_system + نظام_التوصية

    diff --git a/localization/v2.5.x/site/ar/tutorials/text_image_search.json b/localization/v2.5.x/site/ar/tutorials/text_image_search.json new file mode 100644 index 000000000..df1285094 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/text_image_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text to Image Search Engine","anchorList":[{"label":"محرك بحث النص إلى صورة","href":"Text-to-Image-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/text_image_search.md b/localization/v2.5.x/site/ar/tutorials/text_image_search.md new file mode 100644 index 000000000..555130c1e --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/text_image_search.md @@ -0,0 +1,39 @@ +--- +id: text_image_search.md +summary: أنشئ محرك بحث من نص إلى صورة باستخدام Milvus. +title: محرك بحث النص إلى صورة +--- +

    محرك بحث النص إلى صورة

    يوضح هذا البرنامج التعليمي كيفية استخدام قاعدة البيانات المتجهة مفتوحة المصدر "ميلفوس" لبناء محرك بحث من نص إلى صورة.

    +

    يمكنك بسرعة إنشاء محرك بحث من نص إلى صورة بالحد الأدنى من الصلاحية باتباع البرنامج التعليمي الأساسي. بدلاً من ذلك، يمكنك أيضًا قراءة البرنامج التعليمي المتعمق الذي يغطي كل شيء بدءًا من اختيار النموذج إلى نشر الخدمة. يمكنك إنشاء محرك بحث أكثر تقدماً من نص إلى صورة يلبي احتياجات عملك الخاصة باتباع الإرشادات الواردة في البرنامج التعليمي المتعمق.

    + +

    يتضمن نموذج التعلم الآلي والبرامج الخارجية المستخدمة:

    + +

    في الوقت الحاضر، تفقد محركات البحث النصية التقليدية سحرها مع تزايد عدد الأشخاص الذين يتجهون إلى TikTok كمحرك البحث المفضل لديهم. خلال البحث النصي التقليدي، يقوم الأشخاص بإدخال الكلمات المفتاحية لتظهر لهم جميع النصوص التي تحتوي على الكلمة المفتاحية. ومع ذلك، يشتكي الناس من أنهم لا يستطيعون دائمًا العثور على ما يريدون في بحث كهذا. والأكثر من ذلك، فإن النتائج ليست بديهية بما فيه الكفاية. يقول الناس إنهم يجدون الصور ومقاطع الفيديو أكثر سهولة ومتعة من الاضطرار إلى الزحف عبر سطور النص. ونتيجة لذلك، ظهر محرك البحث من النص إلى الصورة كنتيجة لذلك. مع هذا النوع الجديد من محركات البحث، يمكن للأشخاص العثور على الصور ذات الصلة عن طريق إدخال جزء من نص بعض الكلمات الرئيسية.

    +

    ستتعلم في هذا البرنامج التعليمي كيفية إنشاء محرك بحث من نص إلى صورة. يستخدم هذا البرنامج التعليمي نموذج CLIP لاستخراج ميزات الصور وتحويلها إلى متجهات. ثم يتم تخزين متجهات الصور هذه في قاعدة بيانات متجهات ميلفوس. عندما يقوم المستخدمون بإدخال نصوص الاستعلام، يتم تحويل هذه النصوص أيضًا إلى متجهات تضمين باستخدام نفس نموذج CLIP الخاص بتحويل الصور إلى صور. بعد ذلك، يتم إجراء بحث عن تشابه المتجهات في Milvus لاسترداد متجهات الصور الأكثر تشابهًا مع متجه النص المدخل.

    +

    + + Text_image_search + بحث_الصورة_النصية

    diff --git a/localization/v2.5.x/site/ar/tutorials/text_search_engine.json b/localization/v2.5.x/site/ar/tutorials/text_search_engine.json new file mode 100644 index 000000000..97a1f5617 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/text_search_engine.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text Search Engine","anchorList":[{"label":"محرك بحث نصي","href":"Text-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/text_search_engine.md b/localization/v2.5.x/site/ar/tutorials/text_search_engine.md new file mode 100644 index 000000000..7585acc6a --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/text_search_engine.md @@ -0,0 +1,39 @@ +--- +id: text_search_engine.md +summary: أنشئ محرك بحث نصي باستخدام Milvus. +title: محرك بحث نصي +--- +

    محرك بحث نصي

    في هذا البرنامج التعليمي، سوف تتعلم كيفية استخدام Milvus، قاعدة البيانات المتجهة مفتوحة المصدر، لبناء محرك بحث نصي.

    + +

    يتضمن نموذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    + +


    +

    أحد التطبيقات الرئيسية لميلفوس في مجال معالجة اللغات الطبيعية (NLP) هو محرك البحث عن النصوص. وهو أداة رائعة يمكن أن تساعد المستخدمين في العثور على المعلومات التي يبحثون عنها. ويمكنه حتى إظهار المعلومات التي يصعب العثور عليها. تقارن محركات البحث النصي الكلمات المفتاحية أو الدلالات التي يدخلها المستخدمون بقاعدة بيانات من النصوص، ثم تُعيد النتائج التي تستوفي معايير معينة.

    +


    +

    ستتعلم في هذا البرنامج التعليمي كيفية إنشاء محرك بحث نصي. يستخدم هذا البرنامج التعليمي BERT لتحويل النصوص إلى متجهات ذات طول ثابت. يستخدم ميلفوس كقاعدة بيانات المتجهات للتخزين والبحث عن تشابه المتجهات. ثم استخدم MySQL لتعيين معرفات المتجهات التي تم إنشاؤها بواسطة Milvus إلى بيانات النص.

    +


    +

    + + text_search_engine + text_search_engine text_search_enginetext_search_engine

    diff --git a/localization/v2.5.x/site/ar/tutorials/tutorials-overview.json b/localization/v2.5.x/site/ar/tutorials/tutorials-overview.json new file mode 100644 index 000000000..6759b0ac4 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/tutorials-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Tutorials Overview","anchorList":[{"label":"نظرة عامة على البرامج التعليمية","href":"Tutorials-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/tutorials-overview.md b/localization/v2.5.x/site/ar/tutorials/tutorials-overview.md new file mode 100644 index 000000000..f22e64430 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/tutorials-overview.md @@ -0,0 +1,52 @@ +--- +id: tutorials-overview.md +summary: توفر لك هذه الصفحة قائمة بالدروس التعليمية للتفاعل مع ميلفوس. +title: نظرة عامة على البرامج التعليمية +--- +

    نظرة عامة على البرامج التعليمية

    توفر لك هذه الصفحة قائمة بالدروس التعليمية للتفاعل مع ميلفوس.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    البرامج التعليميةحالة الاستخدامميزات ميلفوس ذات الصلة
    بناء RAG مع ميلفوسRAGبحث المتجهات
    RAG متقدمRAGبحث متجه
    البحث عن النص الكامل مع ميلفوسالبدء السريعالبحث بالنص الكامل
    البحث الهجين مع ميلفوسالبحث الهجينبحث هجين, بحث هجين, متجهات متعددة, تضمين كثيف, تضمين متناثر
    البحث عن الصور باستخدام ميلفوسالبحث الدلاليالبحث المتجه، المجال الديناميكي
    البحث متعدد الوسائط RAG مع ميلفوسRAGبحث متجه، مجال ديناميكي
    بحث متعدد الوسائط باستخدام متجهات متعددةالبحث الدلاليبحث متعدد المتجهات، بحث هجين
    الرسم البياني RAG مع ميلفوسRAGبحث الرسم البياني
    الاسترجاع السياقي مع ميلفوسالبدء السريعالبحث المتجه
    تجميع HDBSCAN مع ميلفوسالبدء السريعالبحث المتجه
    استخدام كولبالي للاسترجاع متعدد الوسائط مع ميلفوسالبدء السريعالبحث المتجه
    تصور المتجهاتالبدء السريعالبحث المتجه
    توصية الفيلم مع ميلفوسنظام التوصيةالبحث المتجه
    البحث القمعي باستخدام تضمينات ماتريوشكاالبدء السريعالبحث المتجه
    نظام الإجابة على الأسئلةالإجابة عن الأسئلةالبحث المتجه
    نظام التوصيةنظام التوصيةالبحث المتجه
    بحث تشابه الفيديوالبحث الدلاليالبحث المتجه
    بحث تشابه الصوتالبحث الدلاليالبحث المتجه
    تصنيف الحمض النوويالتصنيفالبحث المتجه
    محرك البحث النصيالبحث الدلاليالبحث المتجه
    البحث في الصور حسب النصالبحث الدلاليالبحث المتجه
    إلغاء تكرار الصورإلغاء التكرارالبحث المتجه
    البدء السريع مع أتوالبدء السريعالبحث المتجه
    استخدم AsyncMilvusClient مع AsyncioAsyncIOAsyncIO، البحث المتجه
    diff --git a/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.json b/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.json new file mode 100644 index 000000000..23b10f38d --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.json @@ -0,0 +1 @@ +{"codeList":["import asyncio​\nimport numpy as np​\nfrom scipy.sparse import csr_matrix​\nfrom pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​\n​\nloop = asyncio.get_event_loop()​\n\n","# Connect to Milvus server using AsyncMilvusClient​\nasync_client = AsyncMilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n\n","schema = async_client.create_schema(​\n auto_id=False,​\n description=\"This is a sample schema\",​\n)​\n​\nschema.add_field(\"id\", DataType.INT64, is_primary=True)​\nschema.add_field(\"dense_vector\", DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(\"sparse_vector\", DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(\"text\", DataType.VARCHAR, max_length=512)​\n\n","async def create_my_collection(collection_name, schema):​\n if (client.has_collection(collection_name)):​\n await async_client.drop_collection(collection_name)​\n​\n await async_client.create_collection(​\n collection_name=collection_name,​\n schema=schema​\n )​\n​\n if (client.has_collection(collection_name)):​\n print(\"Collection created successfully\")​\n else:​\n print(\"Failed to create collection\")​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_my_collection(\"my_collection\", schema))​\n​\n# Output​\n#​\n# Collection created successfully​\n\n","async def create_indexes(collection_name):​\n index_params = client.prepare_index_params()​\n​\n index_params.add_index(field_name=\"dense_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"sparse_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"text\", index_type=\"AUTOINDEX\")​\n​\n await async_client.create_index(collection_name, index_params)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_indexes(\"my_collection\"))​\n\n","async def load_my_collection(collection_name):​\n await async_client.load_collection(collection_name)​\n print(client.get_load_state(collection_name))​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(load_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# {'state': }​\n\n","async def insert_sample_data(collection_name):​\n # Randomly generated data will be used here​\n rng = np.random.default_rng(42)​\n​\n def generate_random_text(length):​\n seed = \"this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence.\"​\n words = seed.split()​\n return \" \".join(rng.choice(words, length))​\n ​\n data = [{​\n 'id': i, ​\n 'dense_vector': rng.random(5).tolist(), ​\n 'sparse_vector': csr_matrix(rng.random(5)), ​\n 'text': generate_random_text(10)​\n } for i in range(10000)]​\n​\n res = await async_client.insert(collection_name, data)​\n​\n print(res)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(insert_sample_data(\"my_collection\"))​\n​\n# Output​\n#​\n# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​\n\n","async def query_my_collection(collection_name):​\n # Find the number of entities with the `text` fields starting with the word \"random\" in the `my_collection` collection.​\n​\n res = await async_client.query(​\n collection_name=\"my_collection\",​\n filter='text like \"%random%\"',​\n output_fields=[\"count(*)\"]​\n )​\n​\n print(res) ​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(query_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# data: [\"{'count(*)': 6802}\"] ​\n\n","async def conduct_vector_search(collection_name, type, field):​\n # Generate a set of three random query vectors​\n query_vectors = []​\n if type == \"dense\":​\n query_vectors = [ rng.random(5) for _ in range(3) ]​\n ​\n if type == \"sparse\":​\n query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​\n​\n print(query_vectors)​\n​\n res = await async_client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n anns_field=field,​\n output_fields=[\"text\", field]​\n )​\n​\n print(res)​\n ​\n# To search against the dense vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"dense\", \"dense_vector\"))​\n​\n# To search against the sparse vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"sparse\", \"sparse_vector\"))​\n\n","async def conduct_hybrid_search(collection_name):​\n req_dense = AnnSearchRequest(​\n data=[ rng.random(5) for _ in range(3) ],​\n anns_field=\"dense_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n req_sparse = AnnSearchRequest(​\n data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​\n anns_field=\"sparse_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n reqs = [req_dense, req_sparse]​\n​\n ranker = RRFRanker()​\n​\n res = await async_client.hybrid_search(​\n collection_name=\"my_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n output_fields=[\"text\", \"dense_vector\", \"sparse_vector\"]​\n )​\n​\n print(res)​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(conduct_hybrid_search(\"my_collection\"))​\n\n"],"headingContent":"Tutorial: Use AsyncMilvusClient with asyncio​","anchorList":[{"label":"برنامج تعليمي: استخدام AsyncMilvusClient مع asyncio","href":"Tutorial-Use-AsyncMilvusClient-with-asyncio​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء حلقة حدث","href":"Create-an-event-loop​","type":2,"isActive":false},{"label":"الاتصال باستخدام AsyncMilvusClient","href":"Connect-with-AsyncMilvusClient​","type":2,"isActive":false},{"label":"إنشاء مخطط","href":"Create-schema​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-collection​","type":2,"isActive":false},{"label":"إنشاء فهرس","href":"Create-index​","type":2,"isActive":false},{"label":"تحميل مجموعة","href":"Load-collection​","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data​","type":2,"isActive":false},{"label":"الاستعلام","href":"Query​","type":2,"isActive":false},{"label":"البحث","href":"Search​","type":2,"isActive":false},{"label":"البحث الهجين","href":"Hybrid-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.md b/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.md new file mode 100644 index 000000000..e13f41fe9 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/use-async-milvus-client-with-asyncio.md @@ -0,0 +1,416 @@ +--- +id: use-async-milvus-client-with-asyncio.md +summary: >- + AsyncMilvusClient هو عميل MilvusClient غير متزامن يوفر واجهة برمجة تطبيقات + قائمة على كوروتين للوصول غير المتوقف إلى Milvus عبر asyncio. ستتعرف في هذه + المقالة على عملية استدعاء واجهات برمجة التطبيقات التي يوفرها AsyncMilvusClient + والجوانب التي يجب الانتباه إليها. +title: نظام الإجابة على الأسئلة +--- +

    برنامج تعليمي: استخدام AsyncMilvusClient مع asyncio

    AsyncMilvusClient هو عميل MilvusClient غير متزامن يوفر واجهة برمجة تطبيقات قائمة على كوروتين للوصول غير المتوقف إلى Milvus عبر asyncio. ستتعرف في هذه المقالة على عملية استدعاء واجهات برمجة التطبيقات التي يوفرها AsyncMilvusClient والجوانب التي تحتاج إلى الانتباه إليها.

    +

    نظرة عامة

    Asyncio هي مكتبة لكتابة الشيفرة البرمجية المتزامنة باستخدام صيغة مزامنة/انتظار وتعمل كأساس لعميل Milvus غير المتزامن عالي الأداء، والذي سيتناسب مع مكتبة الشيفرة الخاصة بك التي تعمل على رأس Asyncio.

    +

    تحتوي الأساليب التي يوفرها AsyncMilvusClient على مجموعات معلمات وسلوكيات مماثلة لتلك الخاصة بـ MilvusClient. يكمن الاختلاف الوحيد في طريقة استدعائها. يسرد الجدول التالي الطرق المتوفرة في AsyncMilvusClient.

    +

    **العميل**

    +

    `close()`

    +

    +

    +

    **التجميع والتقسيم**

    +

    `create_collection()`

    +

    `drop_collection()`

    +

    `create_partition()`

    +

    `drop_partition()`

    +

    +

    +

    **الفهرس**

    +

    `create_index()`

    +

    `drop_index()`

    +

    `load_collection()`

    +

    `release_collection()`

    +

    `load_partitions()`

    +

    `release_partitions()`

    +

    **متجه**

    +

    `insert()`

    +

    `upsert()`

    +

    `delete()`

    +

    `search()`

    +

    `query()`

    +

    `hybrid_search()`

    +

    `get()`

    +

    +

    +
    +

    إذا كنت لا تزال بحاجة إلى الإصدار غير المتزامن من أي أسلوب MilvusClient آخر، يمكنك إرسال طلب ميزة في مستودع pymilvus repo. نرحب أيضًا بالمساهمة بالرموز.

    +

    إنشاء حلقة حدث

    عادةً ما تستخدم التطبيقات التي تستخدم asyncio حلقة الحدث كمنظم لإدارة المهام غير المتزامنة وعمليات الإدخال/الإخراج. في هذا البرنامج التعليمي، سنحصل في هذا البرنامج التعليمي على حلقة حدث من asyncio ونستخدمها كمنظِّم.

    +
    import asyncio​
    +import numpy as np​
    +from scipy.sparse import csr_matrix​
    +from pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​
    +​
    +loop = asyncio.get_event_loop()​
    +
    +
    +

    الاتصال باستخدام AsyncMilvusClient

    يوضح المثال التالي كيفية توصيل ميلفوس بطريقة غير متزامنة.

    +
    # Connect to Milvus server using AsyncMilvusClient​
    +async_client = AsyncMilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +
    +
    +

    إنشاء مخطط

    حاليًا، create_schema() غير متوفر في AsyncMilvusClient. بدلاً من ذلك، سنستخدم MilvusClient لإنشاء مخطط للمجموعة.

    +
    schema = async_client.create_schema(​
    +    auto_id=False,​
    +    description="This is a sample schema",​
    +)​
    +​
    +schema.add_field("id", DataType.INT64, is_primary=True)​
    +schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field("text", DataType.VARCHAR, max_length=512)​
    +
    +
    +
    +

    يقوم AsyncMilvusClient باستدعاء الأسلوب create_schema() بشكل متزامن؛ وبالتالي، لا تحتاج إلى تنظيم الاستدعاء باستخدام حلقة الحدث.

    +
    +

    إنشاء مجموعة

    سنستخدم الآن المخطط لإنشاء مجموعة. لاحظ أنك تحتاج إلى وضع بادئة للكلمة الأساسية await لأي استدعاء إلى طرق AsyncMilvusClient ووضع الاستدعاء داخل دالة async على النحو التالي.

    +
    async def create_my_collection(collection_name, schema):​
    +    if (client.has_collection(collection_name)):​
    +        await async_client.drop_collection(collection_name)​
    +​
    +    await async_client.create_collection(​
    +        collection_name=collection_name,​
    +        schema=schema​
    +    )​
    +​
    +    if (client.has_collection(collection_name)):​
    +        print("Collection created successfully")​
    +    else:​
    +        print("Failed to create collection")​
    +        ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_my_collection("my_collection", schema))​
    +​
    +# Output​
    +#​
    +# Collection created successfully​
    +
    +
    +

    إنشاء فهرس

    تحتاج أيضًا إلى إنشاء فهارس لجميع الحقول المتجهة والحقول القياسية الاختيارية. وفقًا للمخطط المحدد أعلاه، هناك حقلان متجهان في المجموعة، وستقوم بإنشاء فهارس لهما على النحو التالي.

    +
    async def create_indexes(collection_name):​
    +    index_params = client.prepare_index_params()​
    +​
    +    index_params.add_index(field_name="dense_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="sparse_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="text", index_type="AUTOINDEX")​
    +​
    +    await async_client.create_index(collection_name, index_params)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_indexes("my_collection"))​
    +
    +
    +

    تحميل مجموعة

    يمكن تحميل المجموعة بعد فهرسة الحقول الضرورية. توضح الشيفرة التالية كيفية تحميل المجموعة بشكل غير متزامن.

    +
    async def load_my_collection(collection_name):​
    +    await async_client.load_collection(collection_name)​
    +    print(client.get_load_state(collection_name))​
    +    ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(load_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'state': <LoadState: Loaded>}​
    +
    +
    +

    إدراج البيانات

    يمكنك استخدام نماذج التضمين المتوفرة في pymilvus لإنشاء تضمينات متجهة لنصوصك. للحصول على التفاصيل، راجع نظرة عامة على التضمين. في هذا القسم، سنقوم بإدراج البيانات التي تم إنشاؤها عشوائيًا في المجموعة.

    +
    async def insert_sample_data(collection_name):​
    +    # Randomly generated data will be used here​
    +    rng = np.random.default_rng(42)​
    +​
    +    def generate_random_text(length):​
    +        seed = "this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence."​
    +        words = seed.split()​
    +        return " ".join(rng.choice(words, length))​
    +    ​
    +    data = [{​
    +        'id': i, ​
    +        'dense_vector': rng.random(5).tolist(), ​
    +        'sparse_vector': csr_matrix(rng.random(5)), ​
    +        'text': generate_random_text(10)​
    +    } for i in range(10000)]​
    +​
    +    res = await async_client.insert(collection_name, data)​
    +​
    +    print(res)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(insert_sample_data("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​
    +
    +
    +

    الاستعلام

    بعد تحميل المجموعة وتعبئتها بالبيانات، يمكنك إجراء عمليات البحث والاستعلام فيها. في هذا القسم، ستعثر في هذا القسم على عدد الكيانات في الحقل text بدءًا من الكلمة random في المجموعة المسماة my_collection.

    +
    async def query_my_collection(collection_name):​
    +    # Find the number of entities with the `text` fields starting with the word "random" in the `my_collection` collection.​
    +​
    +    res = await async_client.query(​
    +        collection_name="my_collection",​
    +        filter='text like "%random%"',​
    +        output_fields=["count(*)"]​
    +    )​
    +​
    +    print(res) ​
    +    ​
    +# Call the above function asynchronously   ​
    +loop.run_until_complete(query_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# data: ["{'count(*)': 6802}"] ​
    +
    +
    +

    البحث

    في هذا القسم، ستقوم بإجراء عمليات بحث متجهية على حقول المتجهات الكثيفة والمتناثرة في المجموعة المستهدفة.

    +
    async def conduct_vector_search(collection_name, type, field):​
    +    # Generate a set of three random query vectors​
    +    query_vectors = []​
    +    if type == "dense":​
    +        query_vectors = [ rng.random(5) for _ in range(3) ]​
    +    ​
    +    if type == "sparse":​
    +        query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​
    +​
    +    print(query_vectors)​
    +​
    +    res = await async_client.search(​
    +        collection_name="my_collection",​
    +        data=query_vectors,​
    +        anns_field=field,​
    +        output_fields=["text", field]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# To search against the dense vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "dense", "dense_vector"))​
    +​
    +# To search against the sparse vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "sparse", "sparse_vector"))​
    +
    +
    +

    يجب أن تسرد مخرجات البحث ثلاث مجموعات من النتائج المطابقة لمتجهات الاستعلام المحددة.

    +

    البحث الهجين

    يجمع البحث المختلط بين نتائج عمليات البحث المتعددة ويعيد ترتيبها للحصول على استدعاء أفضل. في هذا القسم، ستقوم بإجراء بحث هجين باستخدام حقول المتجهات الكثيفة والمتناثرة.

    +
    async def conduct_hybrid_search(collection_name):​
    +    req_dense = AnnSearchRequest(​
    +        data=[ rng.random(5) for _ in range(3) ],​
    +        anns_field="dense_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    req_sparse = AnnSearchRequest(​
    +        data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​
    +        anns_field="sparse_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    reqs = [req_dense, req_sparse]​
    +​
    +    ranker = RRFRanker()​
    +​
    +    res = await async_client.hybrid_search(​
    +        collection_name="my_collection",​
    +        reqs=reqs,​
    +        ranker=ranker,​
    +        output_fields=["text", "dense_vector", "sparse_vector"]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# Call the above function asynchronously  ​
    +loop.run_until_complete(conduct_hybrid_search("my_collection"))​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.json b/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.json new file mode 100644 index 000000000..63bcc4ac3 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pdf2image\n$ pip pymilvus\n$ pip install colpali_engine\n$ pip install tqdm\n$ pip instal pillow\n","from pdf2image import convert_from_path\n\npdf_path = \"pdfs/2004.12832v2.pdf\"\nimages = convert_from_path(pdf_path)\n\nfor i, image in enumerate(images):\n image.save(f\"pages/page_{i + 1}.png\", \"PNG\")\n","from pymilvus import MilvusClient, DataType\nimport numpy as np\nimport concurrent.futures\n\nclient = MilvusClient(uri=\"milvus.db\")\n","class MilvusColbertRetriever:\n def __init__(self, milvus_client, collection_name, dim=128):\n # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.\n # If the collection exists, load it.\n self.collection_name = collection_name\n self.client = milvus_client\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.load_collection(collection_name)\n self.dim = dim\n\n def create_collection(self):\n # Create a new collection in Milvus for storing embeddings.\n # Drop the existing collection if it already exists and define the schema for the collection.\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.drop_collection(collection_name=self.collection_name)\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_fields=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=self.dim\n )\n schema.add_field(field_name=\"seq_id\", datatype=DataType.INT16)\n schema.add_field(field_name=\"doc_id\", datatype=DataType.INT64)\n schema.add_field(field_name=\"doc\", datatype=DataType.VARCHAR, max_length=65535)\n\n self.client.create_collection(\n collection_name=self.collection_name, schema=schema\n )\n\n def create_index(self):\n # Create an index on the vector field to enable fast similarity search.\n # Releases and drops any existing index before creating a new one with specified parameters.\n self.client.release_collection(collection_name=self.collection_name)\n self.client.drop_index(\n collection_name=self.collection_name, index_name=\"vector\"\n )\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"vector\",\n index_name=\"vector_index\",\n index_type=\"HNSW\", # or any other index type you want\n metric_type=\"IP\", # or the appropriate metric type\n params={\n \"M\": 16,\n \"efConstruction\": 500,\n }, # adjust these parameters as needed\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def create_scalar_index(self):\n # Create a scalar index for the \"doc_id\" field to enable fast lookups by document ID.\n self.client.release_collection(collection_name=self.collection_name)\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"doc_id\",\n index_name=\"int32_index\",\n index_type=\"INVERTED\", # or any other index type you want\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def search(self, data, topk):\n # Perform a vector search on the collection to find the top-k most similar documents.\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n results = self.client.search(\n self.collection_name,\n data,\n limit=int(50),\n output_fields=[\"vector\", \"seq_id\", \"doc_id\"],\n search_params=search_params,\n )\n doc_ids = set()\n for r_id in range(len(results)):\n for r in range(len(results[r_id])):\n doc_ids.add(results[r_id][r][\"entity\"][\"doc_id\"])\n\n scores = []\n\n def rerank_single_doc(doc_id, data, client, collection_name):\n # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.\n doc_colbert_vecs = client.query(\n collection_name=collection_name,\n filter=f\"doc_id in [{doc_id}]\",\n output_fields=[\"seq_id\", \"vector\", \"doc\"],\n limit=1000,\n )\n doc_vecs = np.vstack(\n [doc_colbert_vecs[i][\"vector\"] for i in range(len(doc_colbert_vecs))]\n )\n score = np.dot(data, doc_vecs.T).max(1).sum()\n return (score, doc_id)\n\n with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:\n futures = {\n executor.submit(\n rerank_single_doc, doc_id, data, client, self.collection_name\n ): doc_id\n for doc_id in doc_ids\n }\n for future in concurrent.futures.as_completed(futures):\n score, doc_id = future.result()\n scores.append((score, doc_id))\n\n scores.sort(key=lambda x: x[0], reverse=True)\n if len(scores) >= topk:\n return scores[:topk]\n else:\n return scores\n\n def insert(self, data):\n # Insert ColBERT embeddings and metadata for a document into the collection.\n colbert_vecs = [vec for vec in data[\"colbert_vecs\"]]\n seq_length = len(colbert_vecs)\n doc_ids = [data[\"doc_id\"] for i in range(seq_length)]\n seq_ids = list(range(seq_length))\n docs = [\"\"] * seq_length\n docs[0] = data[\"filepath\"]\n\n # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.\n self.client.insert(\n self.collection_name,\n [\n {\n \"vector\": colbert_vecs[i],\n \"seq_id\": seq_ids[i],\n \"doc_id\": doc_ids[i],\n \"doc\": docs[i],\n }\n for i in range(seq_length)\n ],\n )\n","from colpali_engine.models import ColPali\nfrom colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor\nfrom colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor\nfrom colpali_engine.utils.torch_utils import ListDataset, get_torch_device\nfrom torch.utils.data import DataLoader\nimport torch\nfrom typing import List, cast\n\ndevice = get_torch_device(\"cpu\")\nmodel_name = \"vidore/colpali-v1.2\"\n\nmodel = ColPali.from_pretrained(\n model_name,\n torch_dtype=torch.bfloat16,\n device_map=device,\n).eval()\n\nqueries = [\n \"How to end-to-end retrieval with ColBert?\",\n \"Where is ColBERT performance table?\",\n]\n\nprocessor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))\n\ndataloader = DataLoader(\n dataset=ListDataset[str](queries),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_queries(x),\n)\n\nqs: List[torch.Tensor] = []\nfor batch_query in dataloader:\n with torch.no_grad():\n batch_query = {k: v.to(model.device) for k, v in batch_query.items()}\n embeddings_query = model(**batch_query)\n qs.extend(list(torch.unbind(embeddings_query.to(\"cpu\"))))\n","from tqdm import tqdm\nfrom PIL import Image\nimport os\n\nimages = [Image.open(\"./pages/\" + name) for name in os.listdir(\"./pages\")]\n\ndataloader = DataLoader(\n dataset=ListDataset[str](images),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_images(x),\n)\n\nds: List[torch.Tensor] = []\nfor batch_doc in tqdm(dataloader):\n with torch.no_grad():\n batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}\n embeddings_doc = model(**batch_doc)\n ds.extend(list(torch.unbind(embeddings_doc.to(\"cpu\"))))\n\nprint(ds[0].shape)\n","retriever = MilvusColbertRetriever(collection_name=\"colpali\", milvus_client=client)\nretriever.create_collection()\nretriever.create_index()\n","filepaths = [\"./pages/\" + name for name in os.listdir(\"./pages\")]\nfor i in range(len(filepaths)):\n data = {\n \"colbert_vecs\": ds[i].float().numpy(),\n \"doc_id\": i,\n \"filepath\": filepaths[i],\n }\n retriever.insert(data)\n","for query in qs:\n query = query.float().numpy()\n result = retriever.search(query, topk=1)\n print(filepaths[result[0][1]])\n"],"headingContent":"Use ColPali for Multi-Modal Retrieval with Milvus","anchorList":[{"label":"استخدام كولبالي للاسترجاع متعدد الوسائط مع ميلفوس","href":"Use-ColPali-for-Multi-Modal-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"التحضير","href":"Preparation","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-the-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.md b/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.md new file mode 100644 index 000000000..56fca12c1 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/use_ColPali_with_milvus.md @@ -0,0 +1,334 @@ +--- +id: use_ColPali_with_milvus.md +summary: >- + في هذا الدفتر، نشير إلى هذا النوع من التمثيل متعدد المتجهات باسم "تضمينات + ColBERT" من أجل التعميم. ومع ذلك، فإن النموذج الفعلي المستخدم هو نموذج + ColPali. سنوضح كيفية استخدام ميلفوس لاسترجاع متعدد المتجهات. بناءً على ذلك، + سنقدم كيفية استخدام ColPali لاسترجاع الصفحات بناءً على استعلام معين. +title: استخدام كولبالي للاسترجاع متعدد الوسائط مع ميلفوس +--- +

    استخدام كولبالي للاسترجاع متعدد الوسائط مع ميلفوس

    +Open In Colab + + +GitHub Repository +

    +

    تستخدم نماذج الاسترجاع الحديثة عادةً تضمينًا واحدًا لتمثيل النص أو الصور. ومع ذلك، فإن ColBERT هو نموذج عصبي يستخدم قائمة من التضمينات لكل مثيل بيانات ويستخدم عملية "MaxSim" لحساب التشابه بين نصين. بالإضافة إلى البيانات النصية، تحتوي الأشكال والجداول والرسوم البيانية أيضًا على معلومات غنية، والتي غالبًا ما يتم تجاهلها في استرجاع المعلومات المستندة إلى النصوص.

    +

    + + + + +

    +

    تقارن دالة MaxSim استعلامًا مع مستند (ما تبحث فيه) من خلال النظر في تضمينات الرموز المميزة الخاصة بهما. لكل كلمة في الاستعلام، تقوم باختيار الكلمة الأكثر تشابهًا من المستند (باستخدام تشابه جيب التمام أو مسافة L2 المربعة) وتجمع أوجه التشابه القصوى هذه عبر جميع الكلمات في الاستعلام

    +

    ColPali هي طريقة تجمع بين تمثيل ColBERT متعدد المتجهات مع PaliGemma (نموذج لغوي كبير متعدد الوسائط) للاستفادة من قدرات الفهم القوية. يتيح هذا النهج تمثيل صفحة تحتوي على كل من النصوص والصور باستخدام تضمين موحد متعدد المتجهات. يمكن للتضمينات داخل هذا التمثيل متعدد النواقل أن تلتقط معلومات مفصلة، مما يحسّن أداء التوليد المعزز للاسترجاع (RAG) للبيانات متعددة الوسائط.

    +

    في هذا الدفتر، نشير في هذا الدفتر إلى هذا النوع من التمثيل متعدد النواقل باسم "تضمينات كولبيرت" من أجل العمومية. ومع ذلك، فإن النموذج الفعلي المستخدم هو نموذج ColPali. سنوضح كيفية استخدام ميلفوس لاسترجاع متعدد المتجهات. بناءً على ذلك، سنقدم كيفية استخدام ColPali لاسترجاع الصفحات بناءً على استعلام معين.

    +

    التحضير

    $ pip install pdf2image
    +$ pip pymilvus
    +$ pip install colpali_engine
    +$ pip install tqdm
    +$ pip instal pillow
    +
    +

    إعداد البيانات

    سنستخدم ملف PDF RAG كمثال لنا. يمكنك تنزيل ورقة ColBERT ووضعها في ./pdf. لا يقوم ColPali بمعالجة النص مباشرةً؛ بدلاً من ذلك، يتم تنقيط الصفحة بأكملها في صورة. يتفوق نموذج ColPali في فهم المعلومات النصية الموجودة في هذه الصور. لذلك، سنقوم بتحويل كل صفحة PDF إلى صورة للمعالجة.

    +
    from pdf2image import convert_from_path
    +
    +pdf_path = "pdfs/2004.12832v2.pdf"
    +images = convert_from_path(pdf_path)
    +
    +for i, image in enumerate(images):
    +    image.save(f"pages/page_{i + 1}.png", "PNG")
    +
    +

    بعد ذلك، سنقوم بتهيئة قاعدة بيانات باستخدام Milvus Lite. يمكنك التبديل بسهولة إلى مثيل Milvus الكامل عن طريق تعيين uri إلى العنوان المناسب حيث تتم استضافة خدمة Milvus الخاصة بك.

    +
    from pymilvus import MilvusClient, DataType
    +import numpy as np
    +import concurrent.futures
    +
    +client = MilvusClient(uri="milvus.db")
    +
    +
    +
      +
    • إذا كنت تحتاج فقط إلى قاعدة بيانات متجهة محلية للبيانات الصغيرة الحجم أو النماذج الأولية، فإن تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هو الطريقة الأكثر ملاءمة، حيث يستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين خاصية المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.
    • +
    • إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المُدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.
    • +
    +
    +

    سنقوم بتعريف فئة MilvusColbertRetriever للالتفاف حول عميل Milvus لاسترجاع البيانات متعددة النواقل. يعمل التطبيق على تسطيح تضمينات ColBERT وإدراجها في مجموعة، حيث يمثل كل صف تضمينًا فرديًا من قائمة تضمين ColBERT. كما يسجل أيضًا doc_id و seq_id لتتبع أصل كل تضمين.

    +

    عند البحث باستخدام قائمة تضمين ColBERT، سيتم إجراء عمليات بحث متعددة - واحدة لكل تضمين ColBERT. سيتم بعد ذلك إلغاء تكرار المستندات_المعرّفات المسترجعة. سيتم إجراء عملية إعادة ترتيب، حيث يتم جلب التضمينات الكاملة لكل doc_id، ويتم حساب درجة MaxSim للحصول على النتائج النهائية المصنفة.

    +
    class MilvusColbertRetriever:
    +    def __init__(self, milvus_client, collection_name, dim=128):
    +        # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.
    +        # If the collection exists, load it.
    +        self.collection_name = collection_name
    +        self.client = milvus_client
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.load_collection(collection_name)
    +        self.dim = dim
    +
    +    def create_collection(self):
    +        # Create a new collection in Milvus for storing embeddings.
    +        # Drop the existing collection if it already exists and define the schema for the collection.
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.drop_collection(collection_name=self.collection_name)
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_fields=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=self.dim
    +        )
    +        schema.add_field(field_name="seq_id", datatype=DataType.INT16)
    +        schema.add_field(field_name="doc_id", datatype=DataType.INT64)
    +        schema.add_field(field_name="doc", datatype=DataType.VARCHAR, max_length=65535)
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name, schema=schema
    +        )
    +
    +    def create_index(self):
    +        # Create an index on the vector field to enable fast similarity search.
    +        # Releases and drops any existing index before creating a new one with specified parameters.
    +        self.client.release_collection(collection_name=self.collection_name)
    +        self.client.drop_index(
    +            collection_name=self.collection_name, index_name="vector"
    +        )
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="vector",
    +            index_name="vector_index",
    +            index_type="HNSW",  # or any other index type you want
    +            metric_type="IP",  # or the appropriate metric type
    +            params={
    +                "M": 16,
    +                "efConstruction": 500,
    +            },  # adjust these parameters as needed
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def create_scalar_index(self):
    +        # Create a scalar index for the "doc_id" field to enable fast lookups by document ID.
    +        self.client.release_collection(collection_name=self.collection_name)
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="doc_id",
    +            index_name="int32_index",
    +            index_type="INVERTED",  # or any other index type you want
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def search(self, data, topk):
    +        # Perform a vector search on the collection to find the top-k most similar documents.
    +        search_params = {"metric_type": "IP", "params": {}}
    +        results = self.client.search(
    +            self.collection_name,
    +            data,
    +            limit=int(50),
    +            output_fields=["vector", "seq_id", "doc_id"],
    +            search_params=search_params,
    +        )
    +        doc_ids = set()
    +        for r_id in range(len(results)):
    +            for r in range(len(results[r_id])):
    +                doc_ids.add(results[r_id][r]["entity"]["doc_id"])
    +
    +        scores = []
    +
    +        def rerank_single_doc(doc_id, data, client, collection_name):
    +            # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.
    +            doc_colbert_vecs = client.query(
    +                collection_name=collection_name,
    +                filter=f"doc_id in [{doc_id}]",
    +                output_fields=["seq_id", "vector", "doc"],
    +                limit=1000,
    +            )
    +            doc_vecs = np.vstack(
    +                [doc_colbert_vecs[i]["vector"] for i in range(len(doc_colbert_vecs))]
    +            )
    +            score = np.dot(data, doc_vecs.T).max(1).sum()
    +            return (score, doc_id)
    +
    +        with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:
    +            futures = {
    +                executor.submit(
    +                    rerank_single_doc, doc_id, data, client, self.collection_name
    +                ): doc_id
    +                for doc_id in doc_ids
    +            }
    +            for future in concurrent.futures.as_completed(futures):
    +                score, doc_id = future.result()
    +                scores.append((score, doc_id))
    +
    +        scores.sort(key=lambda x: x[0], reverse=True)
    +        if len(scores) >= topk:
    +            return scores[:topk]
    +        else:
    +            return scores
    +
    +    def insert(self, data):
    +        # Insert ColBERT embeddings and metadata for a document into the collection.
    +        colbert_vecs = [vec for vec in data["colbert_vecs"]]
    +        seq_length = len(colbert_vecs)
    +        doc_ids = [data["doc_id"] for i in range(seq_length)]
    +        seq_ids = list(range(seq_length))
    +        docs = [""] * seq_length
    +        docs[0] = data["filepath"]
    +
    +        # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.
    +        self.client.insert(
    +            self.collection_name,
    +            [
    +                {
    +                    "vector": colbert_vecs[i],
    +                    "seq_id": seq_ids[i],
    +                    "doc_id": doc_ids[i],
    +                    "doc": docs[i],
    +                }
    +                for i in range(seq_length)
    +            ],
    +        )
    +
    +

    سوف نستخدم محرك colpali_engine لاستخراج قوائم التضمين لاستعلامين واسترداد المعلومات ذات الصلة من صفحات PDF.

    +
    from colpali_engine.models import ColPali
    +from colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor
    +from colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor
    +from colpali_engine.utils.torch_utils import ListDataset, get_torch_device
    +from torch.utils.data import DataLoader
    +import torch
    +from typing import List, cast
    +
    +device = get_torch_device("cpu")
    +model_name = "vidore/colpali-v1.2"
    +
    +model = ColPali.from_pretrained(
    +    model_name,
    +    torch_dtype=torch.bfloat16,
    +    device_map=device,
    +).eval()
    +
    +queries = [
    +    "How to end-to-end retrieval with ColBert?",
    +    "Where is ColBERT performance table?",
    +]
    +
    +processor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](queries),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_queries(x),
    +)
    +
    +qs: List[torch.Tensor] = []
    +for batch_query in dataloader:
    +    with torch.no_grad():
    +        batch_query = {k: v.to(model.device) for k, v in batch_query.items()}
    +        embeddings_query = model(**batch_query)
    +    qs.extend(list(torch.unbind(embeddings_query.to("cpu"))))
    +
    +

    بالإضافة إلى ذلك، سنحتاج إلى استخراج قائمة التضمين لكل صفحة، وسيظهر لنا أن هناك 1030 تضمينًا من 128 بُعدًا لكل صفحة.

    +
    from tqdm import tqdm
    +from PIL import Image
    +import os
    +
    +images = [Image.open("./pages/" + name) for name in os.listdir("./pages")]
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](images),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_images(x),
    +)
    +
    +ds: List[torch.Tensor] = []
    +for batch_doc in tqdm(dataloader):
    +    with torch.no_grad():
    +        batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
    +        embeddings_doc = model(**batch_doc)
    +    ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
    +
    +print(ds[0].shape)
    +
    +
      0%|          | 0/10 [00:00<?, ?it/s]
    +
    +100%|██████████| 10/10 [01:22<00:00,  8.24s/it]
    +
    +torch.Size([1030, 128])
    +
    +

    سننشئ مجموعة تسمى "colpali" باستخدام MilvusColbertRetriever.

    +
    retriever = MilvusColbertRetriever(collection_name="colpali", milvus_client=client)
    +retriever.create_collection()
    +retriever.create_index()
    +
    +

    سنقوم بإدراج قوائم التضمين في قاعدة بيانات ميلفوس.

    +
    filepaths = ["./pages/" + name for name in os.listdir("./pages")]
    +for i in range(len(filepaths)):
    +    data = {
    +        "colbert_vecs": ds[i].float().numpy(),
    +        "doc_id": i,
    +        "filepath": filepaths[i],
    +    }
    +    retriever.insert(data)
    +
    +

    يمكننا الآن البحث عن الصفحة الأكثر صلة باستخدام قائمة تضمين الاستعلام.

    +
    for query in qs:
    +    query = query.float().numpy()
    +    result = retriever.search(query, topk=1)
    +    print(filepaths[result[0][1]])
    +
    +
    ./pages/page_5.png
    +./pages/page_7.png
    +
    +

    أخيرًا، نسترجع اسم الصفحة الأصلية. باستخدام ColPali، يمكننا استرداد المستندات متعددة الوسائط دون الحاجة إلى تقنيات معالجة معقدة لاستخراج النصوص والصور من المستندات. وبالاستفادة من نماذج الرؤية الكبيرة، يمكن تحليل المزيد من المعلومات - مثل الجداول والأشكال - دون فقدان كبير للمعلومات.

    diff --git a/localization/v2.5.x/site/ar/tutorials/vector_visualization.json b/localization/v2.5.x/site/ar/tutorials/vector_visualization.json new file mode 100644 index 000000000..98c6af788 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/vector_visualization.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-large\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","# Modify the question to test it with your own query!\n\nquestion = \"How is data stored in Milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=10, # Return top 10 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","import pandas as pd\nimport numpy as np\nfrom sklearn.manifold import TSNE\n\ndata.append({\"id\": len(data), \"vector\": emb_text(question), \"text\": question})\nembeddings = []\nfor gp in data:\n embeddings.append(gp[\"vector\"])\n\nX = np.array(embeddings, dtype=np.float32)\ntsne = TSNE(random_state=0, max_iter=1000)\ntsne_results = tsne.fit_transform(X)\n\ndf_tsne = pd.DataFrame(tsne_results, columns=[\"TSNE1\", \"TSNE2\"])\ndf_tsne\n","import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Extract similar ids from search results\nsimilar_ids = [gp[\"id\"] for gp in search_res[0]]\n\ndf_norm = df_tsne[:-1]\n\ndf_query = pd.DataFrame(df_tsne.iloc[-1]).T\n\n# Filter points based on similar ids\nsimilar_points = df_tsne[df_tsne.index.isin(similar_ids)]\n\n# Create the plot\nfig, ax = plt.subplots(figsize=(8, 6)) # Set figsize\n\n# Set the style of the plot\nsns.set_style(\"darkgrid\", {\"grid.color\": \".6\", \"grid.linestyle\": \":\"})\n\n# Plot all points in blue\nsns.scatterplot(\n data=df_tsne, x=\"TSNE1\", y=\"TSNE2\", color=\"blue\", label=\"All knowledge\", ax=ax\n)\n\n# Overlay similar points in red\nsns.scatterplot(\n data=similar_points,\n x=\"TSNE1\",\n y=\"TSNE2\",\n color=\"red\",\n label=\"Similar knowledge\",\n ax=ax,\n)\n\nsns.scatterplot(\n data=df_query, x=\"TSNE1\", y=\"TSNE2\", color=\"green\", label=\"Query\", ax=ax\n)\n\n# Set plot titles and labels\nplt.title(\"Scatter plot of knowledge using t-SNE\")\nplt.xlabel(\"TSNE1\")\nplt.ylabel(\"TSNE2\")\n\n# Set axis to be equal\nplt.axis(\"equal\")\n\n# Display the legend\nplt.legend()\n\n# Show the plot\nplt.show()\n"],"headingContent":"Vector Visualization","anchorList":[{"label":"تصوّر المتجهات","href":"Vector-Visualization","type":1,"isActive":false},{"label":"الإعداد","href":"Preparation","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-the-data","type":2,"isActive":false},{"label":"إعداد نموذج التضمين","href":"Prepare-the-Embedding-Model","type":2,"isActive":false},{"label":"تحميل البيانات في ميلفوس","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data","type":2,"isActive":false},{"label":"تصوّر التضمينات في البحث عن المتجهات","href":"Visualizing-Embeddings-in-Vector-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/vector_visualization.md b/localization/v2.5.x/site/ar/tutorials/vector_visualization.md new file mode 100644 index 000000000..7b9e8dd6b --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/vector_visualization.md @@ -0,0 +1,434 @@ +--- +id: vector_visualization.md +summary: >- + في هذا المثال، سنوضح في هذا المثال كيفية تصور التضمينات (المتجهات) في ميلفوس + باستخدام t-SN. +title: تصوّر المتجهات +--- +

    تصوّر المتجهات

    +Open In Colab + + +GitHub Repository +

    +

    في هذا المثال، سنوضح في هذا المثال كيفية تصور التضمينات (المتجهات) في ميلفوس باستخدام t-SNE.

    +

    تقنيات تقليل الأبعاد، مثل t-SNE، لا تقدر بثمن لتصور البيانات المعقدة عالية الأبعاد في فضاء ثنائي الأبعاد أو ثلاثي الأبعاد مع الحفاظ على البنية المحلية. يتيح ذلك التعرف على الأنماط ويعزز فهم العلاقات بين السمات ويسهل تفسير نتائج نموذج التعلم الآلي. بالإضافة إلى ذلك، يساعد في تقييم الخوارزمية من خلال المقارنة البصرية لنتائج التجميع، ويبسط عرض البيانات للجمهور غير المتخصص، ويمكن أن يقلل من التكاليف الحسابية من خلال العمل مع تمثيلات منخفضة الأبعاد. من خلال هذه التطبيقات، لا تساعد t-SNE في اكتساب رؤى أعمق في مجموعات البيانات فحسب، بل تدعم أيضًا عمليات اتخاذ قرارات أكثر استنارة.

    +

    الإعداد

    التبعيات والبيئة

    $ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn
    +
    +

    سنستخدم نموذج تضمين OpenAI في هذا المثال. يجب إعداد مفتاح واجهة برمجة التطبيقات OPENAI_API_KEY كمتغير بيئة.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    إعداد البيانات

    نحن نستخدم صفحات الأسئلة الشائعة من وثائق Milvus Documentation 2.4.x كمعرفة خاصة في RAG الخاص بنا، وهو مصدر بيانات جيد لخط أنابيب RAG بسيط.

    +

    قم بتنزيل الملف المضغوط واستخراج المستندات إلى المجلد milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    نقوم بتحميل جميع ملفات تخفيض السعر من المجلد milvus_docs/en/faq. بالنسبة لكل مستند، نستخدم ببساطة "# " لفصل المحتوى في الملف، وهو ما يمكن أن يفصل تقريبًا محتوى كل جزء رئيسي من ملف تخفيض السعر.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    إعداد نموذج التضمين

    نقوم بتهيئة عميل OpenAI لإعداد نموذج التضمين.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    نحدد دالة لإنشاء تضمينات نصية باستخدام عميل OpenAI. نستخدم نموذج التضمين النصي 3-نموذج التضمين الكبير كمثال.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-large")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    توليد تضمين اختباري وطباعة أبعاده وعناصره القليلة الأولى.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    3072
    +[-0.015370666049420834, 0.00234124343842268, -0.01011690590530634, 0.044725317507982254, -0.017235849052667618, -0.02880779094994068, -0.026678944006562233, 0.06816216558218002, -0.011376636102795601, 0.021659553050994873]
    +
    +

    تحميل البيانات في ميلفوس

    إنشاء المجموعة

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    بالنسبة لحجة MilvusClient:

    +
      +
    • تعيين uri كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا ميلفوس لايت لتخزين جميع البيانات في هذا الملف.
    • +
    • إذا كان لديك حجم كبير من البيانات، يمكنك إعداد خادم Milvus أكثر أداءً على docker أو kubernetes. في هذا الإعداد، يُرجى استخدام الخادم uri، على سبيل المثالhttp://localhost:19530 ، كـ uri.
    • +
    • إذا كنت ترغب في استخدام Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، اضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح Api في Zilliz Cloud.
    • +
    +
    +

    تحقق مما إذا كانت المجموعة موجودة بالفعل وأسقطها إذا كانت موجودة.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    قم بإنشاء مجموعة جديدة بمعلمات محددة.

    +

    إذا لم نحدد أي معلومات عن الحقل، سيقوم ميلفوس تلقائيًا بإنشاء حقل افتراضي id للمفتاح الأساسي، وحقل vector لتخزين بيانات المتجه. يتم استخدام حقل JSON محجوز لتخزين الحقول غير المعرفة من قبل النظام الأساسي وقيمها.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    إدراج البيانات

    قم بتكرار الأسطر النصية وإنشاء التضمينات، ثم أدخل البيانات في ميلفوس.

    +

    هنا حقل جديد text ، وهو حقل غير محدد في مخطط المجموعة. ستتم إضافته تلقائيًا إلى حقل JSON الديناميكي المحجوز، والذي يمكن التعامل معه كحقل عادي على مستوى عالٍ.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:20<00:00,  3.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    في هذا القسم، نقوم في هذا القسم بإجراء بحث ميليفوس ثم نقوم بتصور متجه الاستعلام والمتجه المسترجع معًا في بُعد مختزل.

    +

    استرجاع البيانات لاستعلام

    لنقم بإعداد سؤال للبحث.

    +
    # Modify the question to test it with your own query!
    +
    +question = "How is data stored in Milvus?"
    +
    +

    ابحث عن السؤال في المجموعة واسترجع أفضل 10 مطابقات دلالية.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=10,  # Return top 10 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    دعونا نلقي نظرة على نتائج البحث للاستعلام

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7675539255142212
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6210848689079285
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.585393488407135
    +    ],
    +    [
    +        "Why is there no vector data in etcd?\n\netcd stores Milvus module metadata; MinIO stores entities.\n\n###",
    +        0.579704999923706
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5777501463890076
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5655910968780518
    +    ],
    +    [
    +        "Does Milvus support inserting and searching data simultaneously?\n\nYes. Insert operations and query operations are handled by two separate modules that are mutually independent. From the client\u2019s perspective, an insert operation is complete when the inserted data enters the message queue. However, inserted data are unsearchable until they are loaded to the query node. If the segment size does not reach the index-building threshold (512 MB by default), Milvus resorts to brute-force search and query performance may be diminished.\n\n###",
    +        0.5618637204170227
    +    ],
    +    [
    +        "What data types does Milvus support on the primary key field?\n\nIn current release, Milvus supports both INT64 and string.\n\n###",
    +        0.5561620593070984
    +    ],
    +    [
    +        "Is Milvus available for concurrent search?\n\nYes. For queries on the same collection, Milvus concurrently searches the incremental and historical data. However, queries on different collections are conducted in series. Whereas the historical data can be an extremely huge dataset, searches on the historical data are relatively more time-consuming and essentially performed in series.\n\n###",
    +        0.529681921005249
    +    ],
    +    [
    +        "Can vectors with duplicate primary keys be inserted into Milvus?\n\nYes. Milvus does not check if vector primary keys are duplicates.\n\n###",
    +        0.528809666633606
    +    ]
    +]
    +
    +

    تقليل البُعد إلى 2-د بواسطة t-SNE

    لنختزل أبعاد التضمينات إلى 2-د بواسطة t-SNE. سنستخدم مكتبة sklearn لإجراء تحويل t-SNE.

    +
    import pandas as pd
    +import numpy as np
    +from sklearn.manifold import TSNE
    +
    +data.append({"id": len(data), "vector": emb_text(question), "text": question})
    +embeddings = []
    +for gp in data:
    +    embeddings.append(gp["vector"])
    +
    +X = np.array(embeddings, dtype=np.float32)
    +tsne = TSNE(random_state=0, max_iter=1000)
    +tsne_results = tsne.fit_transform(X)
    +
    +df_tsne = pd.DataFrame(tsne_results, columns=["TSNE1", "TSNE2"])
    +df_tsne
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TSNE1TSNE2
    0-3.8773620.866726
    1-5.9230840.671701
    2-0.6459540.240083
    30.4445821.222875
    46.503896-4.984684
    .........
    696.3540551.264959
    706.0559611.266211
    71-1.5160031.328765
    723.971772-0.681780
    733.971772-0.681780
    +

    74 صفاً × 2 عمود

    +
    +

    تمثيل نتائج بحث ميلفوس على مستوى ثنائي الأبعاد

    سنرسم متجه الاستعلام باللون الأخضر، والمتجهات المسترجعة باللون الأحمر، والمتجهات المتبقية باللون الأزرق.

    +
    import matplotlib.pyplot as plt
    +import seaborn as sns
    +
    +# Extract similar ids from search results
    +similar_ids = [gp["id"] for gp in search_res[0]]
    +
    +df_norm = df_tsne[:-1]
    +
    +df_query = pd.DataFrame(df_tsne.iloc[-1]).T
    +
    +# Filter points based on similar ids
    +similar_points = df_tsne[df_tsne.index.isin(similar_ids)]
    +
    +# Create the plot
    +fig, ax = plt.subplots(figsize=(8, 6))  # Set figsize
    +
    +# Set the style of the plot
    +sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
    +
    +# Plot all points in blue
    +sns.scatterplot(
    +    data=df_tsne, x="TSNE1", y="TSNE2", color="blue", label="All knowledge", ax=ax
    +)
    +
    +# Overlay similar points in red
    +sns.scatterplot(
    +    data=similar_points,
    +    x="TSNE1",
    +    y="TSNE2",
    +    color="red",
    +    label="Similar knowledge",
    +    ax=ax,
    +)
    +
    +sns.scatterplot(
    +    data=df_query, x="TSNE1", y="TSNE2", color="green", label="Query", ax=ax
    +)
    +
    +# Set plot titles and labels
    +plt.title("Scatter plot of knowledge using t-SNE")
    +plt.xlabel("TSNE1")
    +plt.ylabel("TSNE2")
    +
    +# Set axis to be equal
    +plt.axis("equal")
    +
    +# Display the legend
    +plt.legend()
    +
    +# Show the plot
    +plt.show()
    +
    +

    + + png + بنج

    +

    كما نرى، متجه الاستعلام قريب من المتجهات المسترجعة. على الرغم من أن المتجهات المسترجعة ليست ضمن دائرة قياسية ذات نصف قطر ثابت مركزها الاستعلام، يمكننا أن نرى أنها لا تزال قريبة جدًا من متجه الاستعلام على المستوى ثنائي الأبعاد.

    +

    يمكن أن يسهّل استخدام تقنيات تقليل الأبعاد فهم المتجهات واستكشاف الأخطاء وإصلاحها. آمل أن تتمكن من الحصول على فهم أفضل للمتجهات من خلال هذا البرنامج التعليمي.

    diff --git a/localization/v2.5.x/site/ar/tutorials/video_similarity_search.json b/localization/v2.5.x/site/ar/tutorials/video_similarity_search.json new file mode 100644 index 000000000..329184646 --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/video_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Video Similarity Search","anchorList":[{"label":"بحث تشابه الفيديو","href":"Video-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/tutorials/video_similarity_search.md b/localization/v2.5.x/site/ar/tutorials/video_similarity_search.md new file mode 100644 index 000000000..99271227e --- /dev/null +++ b/localization/v2.5.x/site/ar/tutorials/video_similarity_search.md @@ -0,0 +1,40 @@ +--- +id: video_similarity_search.md +summary: أنشئ نظام بحث عن تشابه الفيديو باستخدام Milvus. +title: بحث تشابه الفيديو +--- +

    بحث تشابه الفيديو

    يوضّح هذا البرنامج التعليمي كيفية استخدام قاعدة البيانات المتجهة مفتوحة المصدر "ميلفوس" لبناء نظام بحث عن تشابه الفيديو.

    + +

    تتضمن نماذج التعلم الآلي وبرامج الطرف الثالث المستخدمة:

    +
      +
    • OpenCV
    • +
    • ريسنيت-50
    • +
    • MySQL
    • +
    • توهي
    • +
    +


    +

    في الوقت الحاضر، بعد مشاهدة فيلم أو مقطع فيديو يعجبهم، يمكن للأشخاص بسهولة التقاط لقطات شاشة ومشاركة أفكارهم من خلال النشر على منصات الشبكات الاجتماعية المختلفة. عندما يشاهد المتابعون لقطات الشاشة، قد يكون من الصعب عليهم معرفة اسم الفيلم إذا لم يتم كتابة اسم الفيلم بشكل واضح في المنشور. من أجل معرفة اسم الفيلم، يمكن للأشخاص الاستفادة من نظام البحث عن تشابه الفيديو. باستخدام النظام، يمكن للمستخدمين تحميل صورة والحصول على مقاطع فيديو أو أفلام تحتوي على إطارات رئيسية مشابهة للصورة التي تم تحميلها.

    +


    +

    ستتعلم في هذا البرنامج التعليمي كيفية إنشاء نظام بحث عن تشابه الفيديو. يستخدم هذا البرنامج التعليمي حوالي 100 صورة متحركة متحركة على Tumblr لبناء النظام. ومع ذلك، يمكنك أيضًا إعداد مجموعات بيانات الفيديو الخاصة بك. يستخدم النظام أولًا OpenCV لاستخراج الإطارات الرئيسية في مقاطع الفيديو ثم يحصل على متجهات الميزات لكل إطار رئيسي باستخدام ResNet-50. يتم تخزين جميع المتجهات والبحث عنها في Milvus، والتي ستعيد معرّفات المتجهات المتشابهة. ثم يتم تعيين المعرفات إلى الفيديو المقابل المخزن في MySQL.

    +


    +

    + + video_search + Video_search video_search_demoفيديو_بحث_فيديو_بحث_عرضي

    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.json b/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.json new file mode 100644 index 000000000..36a0d5555 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"quick_setup\",​\n dimension=5​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .dimension(5)​\n .build();​\n​\nclient.createCollection(quickSetupReq);​\n​\nGetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(quickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nimport { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"quick_setup\",​\n dimension: 5,​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"dimension\": 5​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"custom_quick_setup\",​\n dimension=5,​\n primary_field_name=\"my_id\",​\n id_type=\"string\",​\n vector_field_name=\"my_vector\",​\n metric_type=\"L2\",​\n auto_id=True,​\n max_length=512​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .dimension(5)​\n .primaryFieldName(\"my_id\")​\n .idType(DataType.VarChar)​\n .maxLength(512)​\n .vectorFieldName(\"my_vector\")​\n .metricType(\"L2\")​\n .autoID(true)​\n .build();​\n​\nclient.createCollection(customQuickSetupReq);​\n​\nGetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(customQuickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"custom_quick_setup\",​\n dimension: 5,​\n primary_field_name: \"my_id\",​\n id_type: \"Varchar\",​\n max_length: 512,​\n vector_field_name: \"my_vector\",​\n metric_type: \"L2\",​\n auto_id: true​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\",​\n \"dimension\": 5,​\n \"primaryFieldName\": \"my_id\",​\n \"idType\": \"VarChar\",​\n \"vectorFieldName\": \"my_vector\",​\n \"metricType\": \"L2\",​\n \"autoId\": true,​\n \"params\": {​\n \"max_length\": \"512\"​\n }​\n}'​\n\n"],"headingContent":"Create Collection Instantly​","anchorList":[{"label":"إنشاء مجموعة على الفور","href":"Create-Collection-Instantly​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"الإعداد السريع","href":"Quick-Setup​","type":2,"isActive":false},{"label":"إعداد سريع مع الحقول المخصصة","href":"Quick-Setup-with-Custom-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.md b/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.md new file mode 100644 index 000000000..8dde5f6c3 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/create-collection-instantly.md @@ -0,0 +1,341 @@ +--- +id: create-collection-instantly.md +title: إنشاء المجموعة على الفور +--- +

    إنشاء مجموعة على الفور

    يمكنك إنشاء مجموعة على الفور عن طريق تعيين اسمها وأبعاد الحقل المتجه. يقوم ميلفوس تلقائيًا بفهرسة الحقل المتجه وتحميل المجموعة عند الإنشاء. توضح هذه الصفحة كيفية إنشاء مجموعة على الفور بالإعدادات الافتراضية.

    +

    نظرة عامة

    المجموعة عبارة عن جدول ثنائي الأبعاد مع أعمدة ثابتة وصفوف متغيرة. يمثل كل عمود حقلاً، ويمثل كل صف كيانًا. يلزم وجود مخطط لتنفيذ إدارة البيانات الهيكلية هذه. يجب أن يفي كل كيان يتم إدراجه بالقيود المحددة في المخطط.

    +

    عادةً ما تستخدم تطبيقات AIGC قواعد البيانات المتجهة كقاعدة معارف لإدارة البيانات التي تم إنشاؤها أثناء التفاعل بين المستخدمين ونماذج اللغات الكبيرة (LLMs). تتشابه قواعد المعرفة هذه تقريبًا. لتسريع استخدام مجموعات Milvus في مثل هذه السيناريوهات، تتوفر لك طريقة فورية لإنشاء مجموعة بمعلمتين فقط، وهما اسم المجموعة وأبعاد الحقل المتجه.

    +

    عند إنشاء مجموعة على الفور بالإعدادات الافتراضية، يتم تطبيق الإعدادات التالية.

    +
      +
    • تتم إضافة الحقلين الأساسي والمتجه إلى المخطط(المعرف والمتجه).

    • +
    • يقبل الحقل الأساسي الأعداد الصحيحة ويعطل المعرف التلقائي.

    • +
    • يقبل حقل المتجه تضمينات المتجهات العائمة.

    • +
    • يستخدمAUTOINDEX لإنشاء فهرس على الحقل المتجه.

    • +
    • يستخدمCOSINE لقياس أوجه التشابه بين التضمينات المتجهة.

    • +
    • يتم تمكين الحقل الديناميكي الاحتياطي المسمى $meta لحفظ الحقول غير المعرفة من قبل النظام الأساسي وقيمها في أزواج قيمة المفتاح.

    • +
    • يتم تحميل المجموعة تلقائيًا عند الإنشاء.

    • +
    +

    للحصول على تفاصيل حول المصطلحات أعلاه، راجع شرح المجموعة.

    +

    تجدر الإشارة إلى أن إنشاء مجموعة على الفور بالإعدادات الافتراضية لا يناسب جميع السيناريوهات. ننصحك بالتعرف على إجراءات إنشاء المجموعات الشائعة حتى تتمكن من فهم إمكانيات Milvus بشكل أفضل.

    +

    الإعداد السريع

    بهذه الطريقة، يمكنك إنشاء مجموعة على الفور باستخدام اسم المجموعة وأبعاد الحقل المتجه فقط.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="quick_setup",​
    +    dimension=5​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .dimension(5)​
    +        .build();​
    +​
    +client.createCollection(quickSetupReq);​
    +​
    +GetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(quickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "quick_setup",​
    +    dimension: 5,​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "dimension": 5​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    إعداد سريع مع الحقول المخصصة

    إذا كان نوع القياس وأسماء الحقول وأنواع البيانات الافتراضية لا تلبي حاجتك، يمكنك ضبط هذه الإعدادات على النحو التالي.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="custom_quick_setup",​
    +    dimension=5,​
    +    primary_field_name="my_id",​
    +    id_type="string",​
    +    vector_field_name="my_vector",​
    +    metric_type="L2",​
    +    auto_id=True,​
    +    max_length=512​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .dimension(5)​
    +        .primaryFieldName("my_id")​
    +        .idType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .vectorFieldName("my_vector")​
    +        .metricType("L2")​
    +        .autoID(true)​
    +        .build();​
    +​
    +client.createCollection(customQuickSetupReq);​
    +​
    +GetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(customQuickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "custom_quick_setup",​
    +    dimension: 5,​
    +    primary_field_name: "my_id",​
    +    id_type: "Varchar",​
    +    max_length: 512,​
    +    vector_field_name: "my_vector",​
    +    metric_type: "L2",​
    +    auto_id: true​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup",​
    +    "dimension": 5,​
    +    "primaryFieldName": "my_id",​
    +    "idType": "VarChar",​
    +    "vectorFieldName": "my_vector",​
    +    "metricType": "L2",​
    +    "autoId": true,​
    +    "params": {​
    +        "max_length": "512"​
    +    }​
    +}'​
    +
    +
    +

    إذا كانت المجموعات التي تم إنشاؤها باستخدام الطريقتين المذكورتين أعلاه لا تزال غير قادرة على تلبية احتياجاتك، ففكر في اتباع الإجراء في إنشاء مجموعة.

    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/create-collection.json b/localization/v2.5.x/site/ar/userGuide/collections/create-collection.json new file mode 100644 index 000000000..11732c4c4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/create-collection.json @@ -0,0 +1 @@ +{"codeList":["# 3. Create a collection in customized setup mode​\nfrom pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 3.1. Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n​\n# 3.2. Add fields to schema​\nschema.add_field(field_name=\"my_id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"my_vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"my_varchar\", datatype=DataType.VARCHAR, max_length=512)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 3. Create a collection in customized setup mode​\n​\n// 3.1 Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// 3.2 Add fields to schema​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n dim: 5​\n },​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512​\n }​\n]​\n\n","import \"github.com/milvus-io/milvus/client/v2/entity\"​\n​\nschema := entity.NewSchema().WithDynamicFieldEnabled(true).​\n WithField(entity.NewField().WithName(\"my_id\").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​\n WithField(entity.NewField().WithName(\"my_vector\").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​\n WithField(entity.NewField().WithName(\"my_varchar\").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","# 3.3. Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# 3.4. Add indexes​\nindex_params.add_index(​\n field_name=\"my_id\",​\n index_type=\"STL_SORT\"​\n)​\n​\nindex_params.add_index(​\n field_name=\"my_vector\", ​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\n// 3.3 Prepare index parameters​\nIndexParam indexParamForIdField = IndexParam.builder()​\n .fieldName(\"my_id\")​\n .indexType(IndexParam.IndexType.STL_SORT)​\n .build();​\n​\nIndexParam indexParamForVectorField = IndexParam.builder()​\n .fieldName(\"my_vector\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForIdField);​\nindexParams.add(indexParamForVectorField);​\n\n","// 3.2 Prepare index parameters​\nconst index_params = [{​\n field_name: \"my_id\",​\n index_type: \"STL_SORT\"​\n},{​\n field_name: \"my_vector\",​\n index_type: \"AUTOINDEX\",​\n metric_type: \"COSINE\"​\n}]​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n \"github.com/milvus-io/milvus/client/v2/index\"​\n)​\n​\nindexOptions := []client.CreateIndexOption{​\n client.NewCreateIndexOption(collectionName, \"my_vector\", index.NewAutoIndex(entity.COSINE)).WithIndexName(\"my_vector\"),​\n client.NewCreateIndexOption(collectionName, \"my_id\", index.NewSortedIndex()).WithIndexName(\"my_id\"),​\n}​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"my_vector\",​\n \"metricType\": \"COSINE\",​\n \"indexName\": \"my_vector\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"my_id\",​\n \"indexName\": \"my_id\",​\n \"indexType\": \"STL_SORT\"​\n }​\n ]'​\n\n","# 3.5. Create a collection with the index loaded simultaneously​\nclient.create_collection(​\n collection_name=\"customized_setup_1\",​\n schema=schema,​\n index_params=index_params​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n// 3.4 Create a collection with schema and index parameters​\nCreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\n​\nclient.createCollection(customizedSetupReq1);​\n​\n// 3.5 Get load state of the collection​\nGetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq1);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// true​\n\n","// 3.3 Create a collection with fields and index parameters​\nres = await client.createCollection({​\n collection_name: \"customized_setup_1\",​\n fields: fields,​\n index_params: index_params,​\n})​\n​\nconsole.log(res.error_code) ​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_1\", schema).​\n WithIndexOptions(indexOptions...),​\n)​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_1\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# 3.6. Create a collection and index it separately​\nclient.create_collection(​\n collection_name=\"customized_setup_2\",​\n schema=schema,​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 3.6 Create a collection and index it separately​\nCreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .collectionSchema(schema)​\n .build();​\n​\nclient.createCollection(customizedSetupReq2);​\n​\nGetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n ​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq2);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// false​\n\n","// 3.4 Create a collection and index it seperately​\nres = await client.createCollection({​\n collection_name: \"customized_setup_2\",​\n fields: fields,​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_2\", schema))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\",​\n \\\"schema\\\": $schema​\n}\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\"​\n}\"​\n\n","# With shard number​\nclient.create_collection(​\n collection_name=\"customized_setup_3\",​\n schema=schema,​\n # highlight-next-line​\n num_shards=1​\n)​\n\n","// With shard number​\nCreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_3\")​\n .collectionSchema(collectionSchema)​\n // highlight-next-line​\n .numShards(1)​\n .build();​\nclient.createCollection(customizedSetupReq3);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_3\",​\n schema: schema,​\n // highlight-next-line​\n shards_num: 1​\n}​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_3\", schema).WithShardNum(1))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"shardsNum\": 1​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_3\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With mmap​\nclient.create_collection(​\n collection_name=\"customized_setup_4\",​\n schema=schema,​\n # highlight-next-line​\n enable_mmap=False​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With MMap​\nCreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_4\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.MMAP_ENABLED, \"false\")​\n .build();​\nclient.createCollection(customizedSetupReq4);​\n\n","client.create_collection({​\n collection_name: \"customized_setup_4\",​\n schema: schema,​\n properties: {​\n 'mmap.enabled': true,​\n },​\n})​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_4\", schema).WithProperty(common.MmapEnabledKey, true))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","# Currently not available for REST\n\n","# With TTL​\nclient.create_collection(​\n collection_name=\"customized_setup_5\",​\n schema=schema,​\n # highlight-start​\n properties={​\n \"collection.ttl.seconds\": 86400​\n }​\n # highlight-end​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With TTL​\nCreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_5\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.TTL_SECONDS, \"86400\")​\n .build();​\nclient.createCollection(customizedSetupReq5);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_5\",​\n schema: schema,​\n // highlight-start​\n properties: {​\n \"collection.ttl.seconds\": 86400​\n }​\n // highlight-end​\n}​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr = cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_5\", schema).​\n WithProperty(common.CollectionTTLConfigKey, 86400)) // TTL in seconds​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"ttlSeconds\": 86400​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_5\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With consistency level​\nclient.create_collection(​\n collection_name=\"customized_setup_6\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Bounded\",​\n)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\n​\n// With consistency level​\nCreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_6\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nclient.createCollection(customizedSetupReq6);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_6\",​\n schema: schema,​\n // highlight-next​\n consistency_level: \"Bounded\",​\n // highlight-end​\n}​\n​\nclient.createCollection(createCollectionReq);​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_6\", schema).​\n WithConsistencyLevel(entity.ClBounded))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_6\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n"],"headingContent":"Create Collection​","anchorList":[{"label":"إنشاء مجموعة","href":"Create-Collection​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء مخطط","href":"Create-Schema​","type":2,"isActive":false},{"label":"(اختياري) تعيين معلمات الفهرس","href":"Optional-Set-Index-Parameters​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-Collection​","type":2,"isActive":false},{"label":"تعيين خصائص المجموعة","href":"Set-Collection-Properties​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/create-collection.md b/localization/v2.5.x/site/ar/userGuide/collections/create-collection.md new file mode 100644 index 000000000..01bd1639c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/create-collection.md @@ -0,0 +1,760 @@ +--- +id: create-collection.md +title: إنشاء مجموعة +--- +

    إنشاء مجموعة

    يمكنك إنشاء مجموعة من خلال تحديد مخططها ومعلمات الفهرس ونوع القياس وما إذا كان سيتم تحميلها عند الإنشاء. تقدم هذه الصفحة كيفية إنشاء مجموعة من البداية.

    +

    نظرة عامة

    المجموعة عبارة عن جدول ثنائي الأبعاد يحتوي على أعمدة ثابتة وصفوف متغيرة. يمثل كل عمود حقلاً، ويمثل كل صف كيانًا. يلزم وجود مخطط لتنفيذ إدارة البيانات الهيكلية هذه. يجب أن يفي كل كيان يتم إدراجه بالقيود المحددة في المخطط.

    +

    ويمكنك تحديد كل جانب من جوانب المجموعة، بما في ذلك مخططها ومعلمات الفهرس ونوع المقياس، وما إذا كان يجب تحميلها عند الإنشاء لضمان أن المجموعة تلبي متطلباتك بالكامل.

    +

    لإنشاء مجموعة، تحتاج إلى

    + +

    إنشاء مخطط

    يحدد المخطط بنية بيانات المجموعة. عند إنشاء مجموعة، تحتاج إلى تصميم المخطط بناءً على متطلباتك. لمزيد من التفاصيل، راجع شرح المخطط.

    +

    تُنشئ مقتطفات التعليمات البرمجية التالية مخططًا مع الحقل الديناميكي الممكّن وثلاثة حقول إلزامية باسم my_id و my_vector و my_varchar.

    +
    +

    يمكنك تعيين القيم الافتراضية لأي حقل قياسي وجعلها قابلة للإلغاء. لمزيد من التفاصيل، راجع Nullable & Default.

    +
    + +
    # 3. Create a collection in customized setup mode​
    +from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 3.1. Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +​
    +# 3.2. Add fields to schema​
    +schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 3. Create a collection in customized setup mode​
    +​
    +// 3.1 Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// 3.2 Add fields to schema​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "my_vector",​
    +        data_type: DataType.FloatVector,​
    +        dim: 5​
    +    },​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512​
    +    }​
    +]​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2/entity"​
    +​
    +schema := entity.NewSchema().WithDynamicFieldEnabled(true).​
    +        WithField(entity.NewField().WithName("my_id").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​
    +        WithField(entity.NewField().WithName("my_vector").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​
    +        WithField(entity.NewField().WithName("my_varchar").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    (اختياري) تعيين معلمات الفهرس

    يؤدي إنشاء فهرس على حقل معين إلى تسريع البحث في هذا الحقل. يسجل الفهرس ترتيب الكيانات ضمن مجموعة. كما هو موضح في مقتطفات التعليمات البرمجية التالية، يمكنك استخدام metric_type و index_type لتحديد الطرق المناسبة لـ Milvus لفهرسة حقل ما وقياس أوجه التشابه بين تضمينات المتجهات.

    +

    في Milvus، يمكنك استخدام AUTOINDEX كنوع فهرس لجميع الحقول المتجهة، وأحد COSINE و L2 و IP كنوع القياس بناءً على احتياجاتك.

    +

    كما هو موضح في مقتطف الكود أعلاه، تحتاج إلى تعيين كل من نوع الفهرس والنوع المتري لحقول المتجهات ونوع الفهرس فقط للحقول القياسية. تعد الفهارس إلزامية للحقول المتجهة، ويُنصح بإنشاء فهارس للحقول القياسية المستخدمة بشكل متكرر في شروط التصفية.

    +

    لمزيد من التفاصيل، راجع الفهارس.

    + +
    # 3.3. Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# 3.4. Add indexes​
    +index_params.add_index(​
    +    field_name="my_id",​
    +    index_type="STL_SORT"​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="my_vector", ​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +// 3.3 Prepare index parameters​
    +IndexParam indexParamForIdField = IndexParam.builder()​
    +        .fieldName("my_id")​
    +        .indexType(IndexParam.IndexType.STL_SORT)​
    +        .build();​
    +​
    +IndexParam indexParamForVectorField = IndexParam.builder()​
    +        .fieldName("my_vector")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForIdField);​
    +indexParams.add(indexParamForVectorField);​
    +
    +
    +
    // 3.2 Prepare index parameters​
    +const index_params = [{​
    +    field_name: "my_id",​
    +    index_type: "STL_SORT"​
    +},{​
    +    field_name: "my_vector",​
    +    index_type: "AUTOINDEX",​
    +    metric_type: "COSINE"​
    +}]​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +    "github.com/milvus-io/milvus/client/v2/index"​
    +)​
    +​
    +indexOptions := []client.CreateIndexOption{​
    +    client.NewCreateIndexOption(collectionName, "my_vector", index.NewAutoIndex(entity.COSINE)).WithIndexName("my_vector"),​
    +    client.NewCreateIndexOption(collectionName, "my_id", index.NewSortedIndex()).WithIndexName("my_id"),​
    +}​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "my_vector",​
    +            "metricType": "COSINE",​
    +            "indexName": "my_vector",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "my_id",​
    +            "indexName": "my_id",​
    +            "indexType": "STL_SORT"​
    +        }​
    +    ]'​
    +
    +
    +

    إنشاء مجموعة

    إذا قمت بإنشاء مجموعة مع معلمات الفهرس، يقوم ميلفوس تلقائيًا بتحميل المجموعة عند إنشائها. في هذه الحالة، تتم فهرسة جميع الحقول المذكورة في معلمات الفهرس.

    +

    تشرح مقتطفات التعليمات البرمجية التالية كيفية إنشاء المجموعة مع معلمات الفهرس والتحقق من حالة تحميلها.

    + +
    # 3.5. Create a collection with the index loaded simultaneously​
    +client.create_collection(​
    +    collection_name="customized_setup_1",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +// 3.4 Create a collection with schema and index parameters​
    +CreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +​
    +client.createCollection(customizedSetupReq1);​
    +​
    +// 3.5 Get load state of the collection​
    +GetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq1);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 3.3 Create a collection with fields and index parameters​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_1",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +​
    +console.log(res.error_code)  ​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_1", schema).​
    +    WithIndexOptions(indexOptions...),​
    +)​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_1\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    يمكنك أيضًا إنشاء مجموعة بدون أي معلمات فهرس وإضافتها بعد ذلك. في هذه الحالة، لا يقوم ميلفوس بتحميل المجموعة عند إنشائها. للحصول على تفاصيل حول كيفية إنشاء فهارس لمجموعة موجودة، راجع شرح الفهرس.

    +

    يوضح مقتطف الشيفرة التالي كيفية إنشاء مجموعة بدون فهرس، وتبقى حالة تحميل المجموعة غير محملة عند الإنشاء.

    + +
    # 3.6. Create a collection and index it separately​
    +client.create_collection(​
    +    collection_name="customized_setup_2",​
    +    schema=schema,​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    // 3.6 Create a collection and index it separately​
    +CreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .collectionSchema(schema)​
    +    .build();​
    +​
    +client.createCollection(customizedSetupReq2);​
    +​
    +GetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +        ​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq2);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 3.4 Create a collection and index it seperately​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    fields: fields,​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_2", schema))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\",​
    +    \"schema\": $schema​
    +}"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\"​
    +}"​
    +
    +
    +

    يوفر ميلفوس أيضًا طريقة لإنشاء مجموعة على الفور. لمزيد من التفاصيل، راجع إنشاء مجموعة على الفور.

    +

    تعيين خصائص المجموعة

    يمكنك تعيين خصائص للمجموعة المراد إنشاؤها لجعلها ملائمة لخدمتك. الخصائص القابلة للتطبيق هي كما يلي.

    +

    تعيين رقم الشريحة

    الأجزاء هي شرائح أفقية للمجموعة. تتوافق كل شريحة مع قناة إدخال بيانات. تحتوي كل مجموعة على شريحة بشكل افتراضي. يمكنك تعيين العدد المناسب من الشرائح عند إنشاء مجموعة استنادًا إلى الإنتاجية المتوقعة وحجم البيانات المراد إدراجها في المجموعة.

    +

    في الحالات الشائعة، ضع في اعتبارك زيادة عدد الأجزاء بمقدار جزء واحد في كل مرة يزيد فيها الإنتاجية المتوقعة بمقدار 500 ميجابايت/ثانية أو يزيد حجم البيانات المراد إدراجها بمقدار 100 جيجابايت. يستند هذا الاقتراح إلى تجربتنا الخاصة وقد لا يتناسب تمامًا مع سيناريوهات تطبيقك. يمكنك ضبط هذا الرقم ليناسب احتياجاتك الخاصة أو استخدام القيمة الافتراضية فقط.

    +

    يوضح مقتطف الشيفرة التالي كيفية تعيين رقم الجزء عند إنشاء مجموعة.

    + +
    # With shard number​
    +client.create_collection(​
    +    collection_name="customized_setup_3",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_shards=1​
    +)​
    +
    +
    +
    // With shard number​
    +CreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_3")​
    +    .collectionSchema(collectionSchema)​
    +    // highlight-next-line​
    +    .numShards(1)​
    +    .build();​
    +client.createCollection(customizedSetupReq3);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_3",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    shards_num: 1​
    +}​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_3", schema).WithShardNum(1))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "shardsNum": 1​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_3\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    تمكين mmap

    يتيح Milvus تمكين mmap على جميع المجموعات بشكل افتراضي، مما يسمح لـ Milvus بتعيين بيانات الحقل الخام في الذاكرة بدلاً من تحميلها بالكامل. هذا يقلل من آثار أقدام الذاكرة ويزيد من سعة المجموعة. للحصول على تفاصيل حول mmap، راجع استخدام mmap.

    + +
    # With mmap​
    +client.create_collection(​
    +    collection_name="customized_setup_4",​
    +    schema=schema,​
    +    # highlight-next-line​
    +    enable_mmap=False​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With MMap​
    +CreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_4")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.MMAP_ENABLED, "false")​
    +        .build();​
    +client.createCollection(customizedSetupReq4);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "customized_setup_4",​
    +    schema: schema,​
    +     properties: {​
    +        'mmap.enabled': true,​
    +     },​
    +})​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_4", schema).WithProperty(common.MmapEnabledKey, true))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    # Currently not available for REST
    +
    +
    +

    تعيين TTL للمجموعة

    إذا كانت هناك حاجة إلى إسقاط مجموعة ما لفترة محددة، ففكر في تعيين وقت التشغيل بالثواني. بمجرد انتهاء مدة TTL، يقوم ميلفوس بحذف الكيانات في المجموعة وإسقاط المجموعة. يكون الحذف غير متزامن، مما يشير إلى أن عمليات البحث والاستعلامات لا تزال ممكنة قبل اكتمال الحذف.

    +

    يقوم مقتطف الكود التالي بتعيين TTL إلى يوم واحد (86400 ثانية). يُنصح بتعيين TTL إلى يومين كحد أدنى.

    + +
    # With TTL​
    +client.create_collection(​
    +    collection_name="customized_setup_5",​
    +    schema=schema,​
    +    # highlight-start​
    +    properties={​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With TTL​
    +CreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_5")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.TTL_SECONDS, "86400")​
    +        .build();​
    +client.createCollection(customizedSetupReq5);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_5",​
    +    schema: schema,​
    +    // highlight-start​
    +    properties: {​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    // highlight-end​
    +}​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err = cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_5", schema).​
    +        WithProperty(common.CollectionTTLConfigKey, 86400)) //  TTL in seconds​
    +if err != nil {​
    +        // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "ttlSeconds": 86400​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_5\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    تعيين مستوى الاتساق

    عند إنشاء مجموعة، يمكنك تعيين مستوى الاتساق لعمليات البحث والاستعلامات في المجموعة. يمكنك أيضًا تغيير مستوى تناسق المجموعة أثناء بحث أو استعلام معين.

    + +
    # With consistency level​
    +client.create_collection(​
    +    collection_name="customized_setup_6",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Bounded",​
    +)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +​
    +// With consistency level​
    +CreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_6")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +client.createCollection(customizedSetupReq6);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_6",​
    +    schema: schema,​
    +    // highlight-next​
    +    consistency_level: "Bounded",​
    +    // highlight-end​
    +}​
    +​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_6", schema).​
    +    WithConsistencyLevel(entity.ClBounded))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_6\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    لمعرفة المزيد عن مستويات الاتساق، راجع مستوى الاتساق.

    +

    تمكين الحقل الديناميكي

    الحقل الديناميكي في المجموعة هو حقل تدوين كائنات جافا سكريبت (JSON) محجوز باسم $meta. بمجرد تمكين هذا الحقل، يحفظ Milvus جميع الحقول غير المعرفة من قبل الهيكلية التي يحملها كل كيان وقيمها كأزواج قيمة مفتاح في الحقل المحجوز.

    +

    للحصول على تفاصيل حول كيفية استخدام الحقل الديناميكي، راجع الحقل الديناميكي.

    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.json b/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.json new file mode 100644 index 000000000..bb4570446 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.drop_collection(​\n collection_name=\"customized_setup_2\"​\n)​\n\n","import io.milvus.v2.service.collection.request.DropCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nclient.dropCollection(dropQuickSetupParam);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 10. Drop the collection​\nres = await client.dropCollection({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.DropCollection(ctx, client.NewDropCollectionOption(\"customized_setup_2\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Drop Collection​","anchorList":[{"label":"إسقاط مجموعة","href":"Drop-Collection​","type":1,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.md b/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.md new file mode 100644 index 000000000..e19edf80c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/drop-collection.md @@ -0,0 +1,138 @@ +--- +id: drop-collection.md +title: إسقاط مجموعة +--- +

    إسقاط مجموعة

    يمكنك إسقاط مجموعة إذا لم تعد هناك حاجة إليها.

    +

    أمثلة

    تفترض المقتطفات البرمجية التالية أن لديك مجموعة باسم Customized_setup_2.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.drop_collection(​
    +    collection_name="customized_setup_2"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DropCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +client.dropCollection(dropQuickSetupParam);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 10. Drop the collection​
    +res = await client.dropCollection({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.DropCollection(ctx, client.NewDropCollectionOption("customized_setup_2"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.json b/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.json new file mode 100644 index 000000000..e873767cb --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 7. Load the collection​\nclient.load_collection(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.LoadCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Load the collection​\nres = await client.loadCollection({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\ndefer cli.Close(ctx)​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.load_collection(​\n collection_name=\"customized_setup_1\",​\n # highlight-next-line​\n load_fields=[\"my_id\", \"my_vector\"] # Load only the specified fields​\n skip_load_dynamic_field=True # Skip loading the dynamic field​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .loadFields(Arrays.asList(\"my_id\", \"my_vector\"))​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n\n","await client.load_collection({​\n collection_name: \"customized_setup_1\",​\n load_fields: [\"my_id\", \"my_vector\"], // Load only the specified fields​\n skip_load_dynamic_field: true //Skip loading the dynamic field​\n});​\n​\nconst loadState = client.getCollectionLoadState({​\n collection_name: \"customized_setup_1\",​\n})​\n​\nconsole.log(loadState);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\").​\n WithLoadFields(\"my_id\", \"my_vector\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","# REST 缺失​\n\n","# 8. Release the collection​\nclient.release_collection(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​\n​\n​\n// 8. Release the collection​\nReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nclient.releaseCollection(releaseCollectionReq);​\n​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// false​\n\n","// 8. Release the collection​\nres = await client.releaseCollection({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import (​\n \"context\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nerr := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption(\"custom_quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n"],"headingContent":"Load & Release​","anchorList":[{"label":"التحميل والتحرير","href":"Load--Release​","type":1,"isActive":false},{"label":"تحميل مجموعة","href":"Load-Collection​","type":2,"isActive":false},{"label":"تحميل حقول محددة","href":"Load-Specific-Fields​","type":2,"isActive":false},{"label":"تحرير المجموعة","href":"Release-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.md b/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.md new file mode 100644 index 000000000..574ef8a17 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/load-and-release.md @@ -0,0 +1,411 @@ +--- +id: load-and-release.md +title: التحميل والتحرير +--- +

    التحميل والتحرير

    تحميل مجموعة هو الشرط الأساسي لإجراء عمليات البحث عن التشابه والاستعلامات في المجموعات. تركز هذه الصفحة على إجراءات تحميل مجموعة وتحريرها.

    +

    تحميل مجموعة

    عند تحميل مجموعة، يقوم برنامج Milvus بتحميل ملفات الفهرس والبيانات الأولية لجميع الحقول في الذاكرة للاستجابة السريعة لعمليات البحث والاستعلامات. تتم فهرسة الكيانات التي يتم إدراجها بعد تحميل المجموعة وتحميلها تلقائيًا.

    +

    توضح مقتطفات التعليمات البرمجية التالية كيفية تحميل مجموعة.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 7. Load the collection​
    +client.load_collection(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.LoadCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Load the collection​
    +res = await client.loadCollection({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +defer cli.Close(ctx)​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    تحميل حقول محددة

    يمكن ل Milvus تحميل الحقول المتضمنة في عمليات البحث والاستعلامات فقط، مما يقلل من استخدام الذاكرة ويحسن أداء البحث.

    +

    يفترض مقتطف الشيفرة التالي أنك أنشأت مجموعة باسم customized_setup_2 مخصصة، وهناك حقلين باسم my_id و my_vector في المجموعة.

    + +
    client.load_collection(​
    +    collection_name="customized_setup_1",​
    +    # highlight-next-line​
    +    load_fields=["my_id", "my_vector"] # Load only the specified fields​
    +    skip_load_dynamic_field=True # Skip loading the dynamic field​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    // 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .loadFields(Arrays.asList("my_id", "my_vector"))​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +
    +
    +
    await client.load_collection({​
    +  collection_name: "customized_setup_1",​
    +  load_fields: ["my_id", "my_vector"], // Load only the specified fields​
    +  skip_load_dynamic_field: true //Skip loading the dynamic field​
    +});​
    +​
    +const loadState = client.getCollectionLoadState({​
    +    collection_name: "customized_setup_1",​
    +})​
    +​
    +console.log(loadState);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1").​
    +    WithLoadFields("my_id", "my_vector"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # REST 缺失​
    +
    +
    +

    إذا اخترت تحميل حقول محددة، تجدر الإشارة إلى أنه يمكن استخدام الحقول المضمنة في load_fields فقط كمرشحات وحقول إخراج في عمليات البحث والاستعلامات. يجب عليك دائمًا تضمين أسماء الحقول الأساسية وحقل متجه واحد على الأقل في load_fields.

    +

    يمكنك أيضًا استخدام skip_load_dynamic_field لتحديد ما إذا كان سيتم تحميل الحقل الديناميكي أم لا. الحقل الديناميكي عبارة عن حقل JSON محجوز يسمى $meta ويحفظ جميع الحقول غير المعرفة من قبل النظام الأساسي وقيمها في أزواج قيمة المفتاح. عند تحميل الحقل الديناميكي، يتم تحميل جميع المفاتيح في الحقول وإتاحتها للتصفية والإخراج. إذا كانت جميع المفاتيح في الحقل الديناميكي غير متضمنة في تصفية البيانات الوصفية والإخراج، قم بتعيين skip_load_dynamic_field إلى True.

    +

    لتحميل المزيد من الحقول بعد تحميل المجموعة، تحتاج إلى تحرير المجموعة أولاً لتجنب الأخطاء المحتملة التي قد تحدث بسبب تغييرات الفهرس.

    +

    تحرير المجموعة

    عمليات البحث والاستعلامات هي عمليات تستهلك الكثير من الذاكرة. لتوفير التكلفة، يُنصح بتحرير المجموعات غير المستخدمة حاليًا.

    +

    يوضح مقتطف الشيفرة التالي كيفية تحرير مجموعة.

    + +
    # 8. Release the collection​
    +client.release_collection(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​
    +​
    +​
    +// 8. Release the collection​
    +ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +client.releaseCollection(releaseCollectionReq);​
    +​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 8. Release the collection​
    +res = await client.releaseCollection({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +err := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption("custom_quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.json b/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.json new file mode 100644 index 000000000..9a3196bb2 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 9. Manage aliases​\n# 9.1. Create aliases​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"bob\"​\n)​\n​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"alice\"​\n)​\n\n","import io.milvus.v2.service.utility.request.CreateAliasReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 9. Manage aliases​\n​\n// 9.1 Create alias​\nCreateAliasReq createAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"bob\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n​\ncreateAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 9. Manage aliases​\n// 9.1 Create aliases​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","# 9.2. List aliases​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\",​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.ListAliasesReq;​\nimport io.milvus.v2.service.utility.response.ListAliasResp;​\n​\n// 9.2 List alises​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob, alice]​\n\n","// 9.2 List aliases​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob', 'alice' ]​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"bob\",​\n# \"alice\"​\n# ]​\n# }​\n\n","# 9.3. Describe aliases​\nres = client.describe_alias(​\n alias=\"bob\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"alias\": \"bob\",​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.DescribeAliasReq;​\nimport io.milvus.v2.service.utility.response.DescribeAliasResp;​\n​\n// 9.3 Describe alias​\nDescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​\n .alias(\"bob\")​\n .build();​\n​\nDescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​\n​\nSystem.out.println(describeAliasRes);​\n​\n// Output:​\n// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​\n\n","// 9.3 Describe aliases​\nres = await client.describeAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// {​\n// status: {​\n// extra_info: {},​\n// error_code: 'Success',​\n// reason: '',​\n// code: 0,​\n// retriable: false,​\n// detail: ''​\n// },​\n// db_name: 'default',​\n// alias: 'bob',​\n// collection: 'customized_setup_2'​\n// }​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n","# 9.4 Reassign aliases to other collections​\nclient.alter_alias(​\n collection_name=\"customized_setup_1\",​\n alias=\"alice\"​\n)​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_1\",​\n# \"db_name\": \"default\"​\n# }​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.AlterAliasReq;​\n​\n// 9.4 Reassign alias to other collections​\nAlterAliasReq alterAliasReq = AlterAliasReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.alterAlias(alterAliasReq);​\n​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\nlistAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nlistAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob]​\n\n","// 9.4 Reassign aliases to other collections​\nres = await client.alterAlias({​\n collection_name: \"customized_setup_1\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'alice' ]​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob' ]​\n// ​\n​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"alice\",​\n# \"collectionName\": \"customized_setup_1\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n"],"headingContent":"Manage Aliases​","anchorList":[{"label":"إدارة الأسماء المستعارة","href":"Manage-Aliases​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء اسم مستعار","href":"Create-Alias​","type":2,"isActive":false},{"label":"قائمة الأسماء المستعارة","href":"List-Aliases​","type":2,"isActive":false},{"label":"وصف الأسماء المستعارة","href":"Describe-Alias​","type":2,"isActive":false},{"label":"تغيير الاسم المستعار","href":"Alter-Alias​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.md b/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.md new file mode 100644 index 000000000..9fbae74b7 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-aliases.md @@ -0,0 +1,542 @@ +--- +id: manage-aliases.md +title: إدارة الأسماء المستعارة +--- +

    إدارة الأسماء المستعارة

    يوفر Milvus إمكانيات إدارة الأسماء المستعارة. توضح هذه الصفحة إجراءات إنشاء الأسماء المستعارة وإدراجها وتعديلها وإسقاطها.

    +

    نظرة عامة

    يمكنك إنشاء أسماء مستعارة لمجموعاتك. يمكن أن تحتوي المجموعة على عدة أسماء مستعارة، ولكن لا يمكن للمجموعات مشاركة اسم مستعار.

    +

    عند تلقي طلب مقابل مجموعة، يقوم Milvus بتحديد موقع المجموعة استنادًا إلى الاسم المقدم. إذا لم تكن المجموعة بالاسم المقدم غير موجودة، يستمر Milvus في تحديد موقع الاسم المقدم كاسم مستعار. يمكنك استخدام الأسماء المستعارة للمجموعة لتكييف شفرتك مع سيناريوهات مختلفة.

    +

    إنشاء اسم مستعار

    يوضح مقتطف الشيفرة التالي كيفية إنشاء اسم مستعار لمجموعة.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 9. Manage aliases​
    +# 9.1. Create aliases​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="bob"​
    +)​
    +​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="alice"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.utility.request.CreateAliasReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 9. Manage aliases​
    +​
    +// 9.1 Create alias​
    +CreateAliasReq createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("bob")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +​
    +createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 9. Manage aliases​
    +// 9.1 Create aliases​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    قائمة الأسماء المستعارة

    يوضح مقتطف الشيفرة التالي إجراء سرد الأسماء المستعارة المخصصة لمجموعة معينة.

    + +
    # 9.2. List aliases​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob",​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.ListAliasesReq;​
    +import io.milvus.v2.service.utility.response.ListAliasResp;​
    +​
    +// 9.2 List alises​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob, alice]​
    +
    +
    +
    // 9.2 List aliases​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob', 'alice' ]​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "bob",​
    +#         "alice"​
    +#     ]​
    +# }​
    +
    +
    +

    وصف الأسماء المستعارة

    يصف مقتطف الشيفرة التالي اسم مستعار محدد بالتفصيل، بما في ذلك اسم المجموعة التي تم تخصيصها لها.

    + +
    # 9.3. Describe aliases​
    +res = client.describe_alias(​
    +    alias="bob"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "alias": "bob",​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.DescribeAliasReq;​
    +import io.milvus.v2.service.utility.response.DescribeAliasResp;​
    +​
    +// 9.3 Describe alias​
    +DescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​
    +    .alias("bob")​
    +    .build();​
    +​
    +DescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​
    +​
    +System.out.println(describeAliasRes);​
    +​
    +// Output:​
    +// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​
    +
    +
    +
    // 9.3 Describe aliases​
    +res = await client.describeAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// {​
    +//   status: {​
    +//     extra_info: {},​
    +//     error_code: 'Success',​
    +//     reason: '',​
    +//     code: 0,​
    +//     retriable: false,​
    +//     detail: ''​
    +//   },​
    +//   db_name: 'default',​
    +//   alias: 'bob',​
    +//   collection: 'customized_setup_2'​
    +// }​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    +

    تغيير الاسم المستعار

    يمكنك إعادة تخصيص الاسم المستعار المخصص بالفعل لمجموعة معينة إلى مجموعة أخرى.

    + +
    # 9.4 Reassign aliases to other collections​
    +client.alter_alias(​
    +    collection_name="customized_setup_1",​
    +    alias="alice"​
    +)​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_1",​
    +#     "db_name": "default"​
    +# }​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.AlterAliasReq;​
    +​
    +// 9.4 Reassign alias to other collections​
    +AlterAliasReq alterAliasReq = AlterAliasReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.alterAlias(alterAliasReq);​
    +​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob]​
    +
    +
    +
    // 9.4 Reassign aliases to other collections​
    +res = await client.alterAlias({​
    +    collection_name: "customized_setup_1",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'alice' ]​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob' ]​
    +// ​
    +​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "alice",​
    +#         "collectionName": "customized_setup_1",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.json b/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.json new file mode 100644 index 000000000..0bc81a930 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Collection Explained​","anchorList":[{"label":"شرح المجموعات","href":"Collection-Explained​","type":1,"isActive":false},{"label":"المجموعة","href":"Collection​","type":2,"isActive":false},{"label":"المخطط والحقول","href":"Schema-and-Fields​","type":2,"isActive":false},{"label":"المفتاح الأساسي والمعرف التلقائي","href":"Primary-key-and-AutoId​","type":2,"isActive":false},{"label":"الفهرس","href":"Index​","type":2,"isActive":false},{"label":"الكيانات","href":"Entity​","type":2,"isActive":false},{"label":"التحميل والتحرير","href":"Load-and-Release​","type":2,"isActive":false},{"label":"البحث والاستعلام","href":"Search-and-Query​","type":2,"isActive":false},{"label":"التقسيم","href":"Partition​","type":2,"isActive":false},{"label":"الشرائح","href":"Shard​","type":2,"isActive":false},{"label":"الأسماء المستعارة","href":"Alias​","type":2,"isActive":false},{"label":"الدالة","href":"Function​","type":2,"isActive":false},{"label":"مستوى الاتساق","href":"Consistency-Level​","type":2,"isActive":false},{"label":"الحدود","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.md b/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.md new file mode 100644 index 000000000..c4b31e302 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-collections.md @@ -0,0 +1,272 @@ +--- +id: manage-collections.md +title: شرح المجموعات +--- +

    شرح المجموعات

    في ميلفوس، يمكنك إنشاء مجموعات متعددة لإدارة بياناتك، وإدراج بياناتك ككيانات في المجموعات. تتشابه المجموعات والكيانات مع الجداول والسجلات في قواعد البيانات العلائقية. تساعدك هذه الصفحة في التعرف على المجموعة والمفاهيم ذات الصلة.

    +

    المجموعة

    المجموعة عبارة عن جدول ثنائي الأبعاد يحتوي على أعمدة ثابتة وصفوف متغيرة. يمثل كل عمود حقلاً، ويمثل كل صف كيانًا.

    +

    يعرض المخطط التالي مجموعة تحتوي على ثمانية أعمدة وستة كيانات.

    +

    + + Collection explained + شرح المجموعة

    +

    المخطط والحقول

    عند وصف كائن ما، نذكر عادةً سماته، مثل الحجم والوزن والموضع. يمكنك استخدام هذه السمات كحقول في مجموعة. لكل حقل خصائص مقيدة مختلفة، مثل نوع البيانات وأبعاد الحقل المتجه. يمكنك تكوين مخطط مجموعة من خلال إنشاء الحقول وتحديد ترتيبها. لمعرفة أنواع البيانات الممكنة القابلة للتطبيق، راجع شرح المخطط.

    +

    يجب عليك تضمين جميع الحقول المعرفة من قبل المخطط في الكيانات المراد إدراجها. لجعل بعضها اختياري، ضع في اعتبارك

    +
      +
    • جعلها لاغية أو تعيين قيم افتراضية

      +

      للحصول على تفاصيل حول كيفية جعل الحقل قابلاً للإلغاء أو تعيين القيمة الافتراضية، راجع Nullable & Default.

    • +
    • تمكين الحقل الديناميكي

      +

      للحصول على تفاصيل حول كيفية تمكين الحقل الديناميكي واستخدامه، راجع الحقل الديناميكي.

    • +
    +

    المفتاح الأساسي والمعرف التلقائي

    على غرار الحقل الأساسي في قاعدة البيانات العلائقية، تحتوي المجموعة على حقل أساسي لتمييز الكيان عن غيره. كل قيمة في الحقل الأساسي فريدة عالميًا وتتوافق مع كيان واحد محدد.

    +

    كما هو موضح في الرسم البياني أعلاه، يعمل الحقل المسمى بالمعرّف كحقل أساسي، ويتوافق المعرف الأول 0 مع كيان بعنوان معدل وفيات فيروس كورونا غير مهم. لن يكون هناك أي كيان آخر يحتوي على الحقل الأساسي 0.

    +

    يقبل الحقل الأساسي الأعداد الصحيحة أو السلاسل فقط. عند إدراج الكيانات، يجب عليك تضمين قيم الحقل الأساسي افتراضيًا. ومع ذلك، إذا قمت بتمكين المعرف التلقائي عند إنشاء المجموعة، فسوف يقوم Milvus بإنشاء تلك القيم عند إدراج البيانات. في مثل هذه الحالة، استبعد قيم الحقل الأساسي من الكيانات المراد إدراجها.

    +

    لمزيد من المعلومات، يرجى الرجوع إلى الحقل الأساسي والمعرف التلقائي.

    +

    الفهرس

    يؤدي إنشاء فهارس على حقول محددة إلى تحسين كفاءة البحث. يُنصح بإنشاء فهارس لجميع الحقول التي تعتمد عليها خدمتك، ومن بينها الفهارس على حقول المتجهات إلزامية.

    +

    الكيانات

    الكيانات هي سجلات البيانات التي تشترك في نفس مجموعة الحقول في مجموعة. تشكل القيم الموجودة في جميع الحقول في نفس الصف كيانًا.

    +

    يمكنك إدراج أكبر عدد من الكيانات التي تحتاجها في مجموعة. ومع ذلك، كلما زاد عدد الكيانات، يزداد حجم الذاكرة التي تستغرقها أيضًا، مما يؤثر على أداء البحث.

    +

    لمزيد من المعلومات، راجع شرح المخطط.

    +

    التحميل والتحرير

    تحميل مجموعة هو الشرط الأساسي لإجراء عمليات بحث واستعلامات التشابه في المجموعات. عند تحميل مجموعة، يقوم برنامج Milvus بتحميل جميع ملفات الفهرس والبيانات الأولية في كل حقل في الذاكرة للاستجابة السريعة لعمليات البحث والاستعلامات.

    +

    عمليات البحث والاستعلامات هي عمليات تستهلك الكثير من الذاكرة. لتوفير التكلفة، يُنصح بتحرير المجموعات غير المستخدمة حاليًا.

    +

    لمزيد من التفاصيل، راجع التحميل والتحرير.

    +

    البحث والاستعلام

    بمجرد إنشاء الفهارس وتحميل المجموعة، يمكنك بدء البحث عن التشابه من خلال تغذية متجه استعلام واحد أو عدة متجهات استعلام. على سبيل المثال، عند تلقي التمثيل المتجه لاستعلامك المحمول في طلب بحث، يستخدم Milvus نوع المقياس المحدد لقياس التشابه بين متجه الاستعلام وتلك الموجودة في المجموعة المستهدفة قبل إرجاع تلك المتجهات المتشابهة دلاليًا مع الاستعلام.

    +

    يمكنك أيضًا تضمين تصفية البيانات الوصفية ضمن عمليات البحث والاستعلامات لتحسين ملاءمة النتائج. لاحظ أن شروط تصفية بيانات التعريف إلزامية في الاستعلامات ولكنها اختيارية في عمليات البحث.

    +

    للحصول على تفاصيل حول أنواع المقاييس القابلة للتطبيق، راجع أنواع المقاييس.

    +

    للمزيد من المعلومات حول عمليات البحث والاستعلامات، راجع المقالات الموجودة في فصل البحث وإعادة التصنيف، ومن بين الميزات الأساسية.

    + +

    بالإضافة إلى ذلك، يوفر ميلفوس أيضًا تحسينات لتحسين أداء البحث وكفاءته. يتم تعطيلها افتراضيًا، ويمكنك تمكينها واستخدامها وفقًا لمتطلبات الخدمة الخاصة بك. وهي

    + +

    التقسيم

    الأقسام هي مجموعات فرعية من مجموعة، والتي تشترك في نفس مجموعة الحقول مع مجموعتها الأصلية، ويحتوي كل منها على مجموعة فرعية من الكيانات.

    +

    من خلال تخصيص كيانات في أقسام مختلفة، يمكنك إنشاء مجموعات كيانات. يمكنك إجراء عمليات بحث واستعلامات في أقسام محددة لجعل Milvus يتجاهل الكيانات الموجودة في الأقسام الأخرى، وتحسين كفاءة البحث.

    +

    لمزيد من التفاصيل، راجع إدارة الأقسام.

    +

    الشرائح

    الأجزاء هي شرائح أفقية من مجموعة. يتوافق كل جزء مع قناة إدخال بيانات. تحتوي كل مجموعة على شريحة افتراضيًا. يمكنك تعيين العدد المناسب من الشرائح عند إنشاء مجموعة استنادًا إلى الإنتاجية المتوقعة وحجم البيانات المراد إدراجها في المجموعة.

    +

    للحصول على تفاصيل حول كيفية تعيين رقم الجزء، راجع إنشاء مجموعة.

    +

    الأسماء المستعارة

    يمكنك إنشاء أسماء مستعارة لمجموعاتك. يمكن أن تحتوي المجموعة على عدة أسماء مستعارة، ولكن لا يمكن للمجموعات مشاركة اسم مستعار. عند تلقي طلب مقابل مجموعة، يقوم Milvus بتحديد موقع المجموعة استنادًا إلى الاسم المقدم. إذا لم تكن المجموعة بالاسم المقدم غير موجودة، يستمر Milvus في تحديد موقع الاسم المقدم كاسم مستعار. يمكنك استخدام الأسماء المستعارة للمجموعات لتكييف شفرتك مع سيناريوهات مختلفة.

    +

    لمزيد من التفاصيل، راجع إدارة الأسماء المستعارة.

    +

    الدالة

    يمكنك تعيين وظائف لـ Milvus لاشتقاق الحقول عند إنشاء المجموعة. على سبيل المثال، تستخدم دالة البحث عن النص الكامل الدالة المعرفة من قبل المستخدم لاشتقاق حقل متجه متناثر من حقل متغير محدد. لمزيد من المعلومات حول البحث عن النص الكامل، راجع البحث عن النص الكامل.

    +

    مستوى الاتساق

    تستخدم أنظمة قواعد البيانات الموزعة عادةً مستوى الاتساق لتحديد تماثل البيانات عبر عقد البيانات والنسخ المتماثلة. يمكنك تعيين مستويات اتساق منفصلة عند إنشاء مجموعة أو إجراء عمليات بحث عن التشابه داخل المجموعة. مستويات الاتساق القابلة للتطبيق هي: الاتساق القوي، والركود المحدود، والجلسة، والنهائي.

    +

    للحصول على تفاصيل حول مستويات الاتساق هذه، راجع مستوى الاتساق.

    +

    الحدود

    للحصول على الحدود والقيود على المجموعات، راجع الحدود والقيود.

    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.json b/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.json new file mode 100644 index 000000000..9894a8845 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.ListPartitionsReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport java.util.*;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nlet res = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res);​\n​\n// Output​\n// [\"_default\"]​\n\n","import (​\n \"context\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvucclient\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n // handle error​\n}​\n​\ndefer cli.Close(ctx)​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n","client.create_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\", \"partitionA\"]​\n\n","import io.milvus.v2.service.partition.request.CreatePartitionReq;​\n​\nCreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.createPartition(createPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default, partitionA]​\n\n","await client.createPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","import (​\n \"fmt\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nerr = cli.CreatePartition(ctx, client.NewCreatePartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\",​\n# \"partitionA\"​\n# ]​\n# }​\n\n","res = client.has_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# True​\n\n","import io.milvus.v2.service.partition.request.HasPartitionReq;​\n​\nHasPartitionReq hasPartitionReq = HasPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean hasPartitionRes = client.hasPartition(hasPartitionReq);​\nSystem.out.println(hasPartitionRes);​\n​\n// Output:​\n// true​\n\n","res = await client.hasPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.value)​\n​\n// Output​\n// true​\n\n","import (​\n \"fmt\"​\n ​\n \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nresult, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(result)​\n​\n// Output:​\n// true​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"has\": true​\n# }​\n# }​\n\n","client.load_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.LoadPartitionsReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n​\nLoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.loadPartitions(loadPartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// True​\n\n","await client.loadPartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// False​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateNotLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nclient.drop_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.DropPartitionReq;​\nimport io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\nimport io.milvus.v2.service.partition.request.ListPartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nDropPartitionReq dropPartitionReq = DropPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.dropPartition(dropPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nawait client.dropPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\"]​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n"],"headingContent":"Manage Partitions​","anchorList":[{"label":"إدارة الأقسام","href":"Manage-Partitions​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"قائمة الأقسام","href":"List-Partitions​","type":2,"isActive":false},{"label":"إنشاء قسم","href":"Create-Partition​","type":2,"isActive":false},{"label":"التحقق من وجود قسم معين","href":"Check-for-a-Specific-Partition​","type":2,"isActive":false},{"label":"تحميل وتحرير الأقسام","href":"Load-and-Release-Partitions​","type":2,"isActive":false},{"label":"عمليات البيانات داخل الأقسام","href":"Data-Operations-Within-Partitions​","type":2,"isActive":false},{"label":"إسقاط قسم","href":"Drop-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.md b/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.md new file mode 100644 index 000000000..33e93dfc7 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/manage-partitions.md @@ -0,0 +1,764 @@ +--- +id: manage-partitions.md +title: إدارة الأقسام +--- +

    إدارة الأقسام

    القسم هو مجموعة فرعية من مجموعة. يشترك كل قسم في نفس بنية البيانات مع مجموعته الأصلية، ولكنه يحتوي فقط على مجموعة فرعية من البيانات الموجودة في المجموعة. تساعدك هذه الصفحة على فهم كيفية إدارة الأقسام.

    +

    نظرة عامة

    عند إنشاء مجموعة، ينشئ Milvus أيضًا قسمًا باسم _default في المجموعة. إذا كنت لن تقوم بإضافة أي أقسام أخرى، فإن جميع الكيانات التي يتم إدراجها في المجموعة تنتقل إلى القسم الافتراضي، ويتم أيضًا إجراء جميع عمليات البحث والاستعلامات داخل القسم الافتراضي.

    +

    يمكنك إضافة المزيد من الأقسام وإدراج كيانات فيها بناءً على معايير معينة. ثم يمكنك تقييد عمليات البحث والاستعلامات داخل أقسام معينة، مما يحسن أداء البحث.

    +

    يمكن أن تحتوي المجموعة على 1024 قسمًا كحد أقصى.

    +
    +

    ميزة مفتاح التقسيم هي ميزة تحسين البحث استنادًا إلى الأقسام وتسمح لـ Milvus بتوزيع الكيانات إلى أقسام مختلفة استنادًا إلى القيم الموجودة في حقل قياسي معين. تساعد هذه الميزة في تنفيذ التآخي المتعدد الموجه نحو الأقسام وتحسين أداء البحث.

    +

    لن تتم مناقشة هذه الميزة في هذه الصفحة. لمعرفة المزيد، راجع استخدام مفتاح التقسيم.

    +
    +

    قائمة الأقسام

    عند إنشاء مجموعة، ينشئ Milvus أيضًا قسمًا باسم _default في المجموعة. يمكنك سرد الأقسام في مجموعة على النحو التالي.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import java.util.*;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +let res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res);​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    import (​
    +    "context"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvucclient"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    +

    إنشاء قسم

    يمكنك إضافة المزيد من الأقسام إلى المجموعة وإدراج كيانات في هذه الأقسام بناءً على معايير معينة.

    + +
    client.create_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default", "partitionA"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.CreatePartitionReq;​
    +​
    +CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.createPartition(createPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default, partitionA]​
    +
    +
    +
    await client.createPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +err = cli.CreatePartition(ctx, client.NewCreatePartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default",​
    +#         "partitionA"​
    +#     ]​
    +# }​
    +
    +
    +

    التحقق من وجود قسم معين

    توضح مقتطفات التعليمات البرمجية التالية كيفية التحقق من وجود قسم في مجموعة معينة.

    + +
    res = client.has_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# True​
    +
    +
    +
    import io.milvus.v2.service.partition.request.HasPartitionReq;​
    +​
    +HasPartitionReq hasPartitionReq = HasPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean hasPartitionRes = client.hasPartition(hasPartitionReq);​
    +System.out.println(hasPartitionRes);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    res = await client.hasPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.value)​
    +​
    +// Output​
    +// true​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +result, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(result)​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#        "has": true​
    +#     }​
    +# }​
    +
    +
    +

    تحميل وتحرير الأقسام

    يمكنك تحميل أو تحرير قسم واحد أو أقسام معينة بشكل منفصل.

    +

    تحميل الأقسام

    يمكنك تحميل أقسام معينة في مجموعة بشكل منفصل. من الجدير بالذكر أن حالة التحميل للمجموعة تظل غير محملة إذا كان هناك قسم غير محمل في المجموعة.

    + +
    client.load_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.LoadPartitionsReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +​
    +LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.loadPartitions(loadPartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// True​
    +
    +
    +
    await client.loadPartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    تحرير الأقسام

    يمكنك أيضًا تحرير أقسام محددة.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// False​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    عمليات البيانات داخل الأقسام

    إدراج الكيانات وحذفها

    يمكنك إجراء عمليات إدراج وإدراج وحذف في عمليات محددة. لمزيد من التفاصيل، راجع

    +
      +
    • إدراج كيانات في القسم

    • +
    • إدراج كيانات في القسم

    • +
    • حذف كيانات من القسم

    • +
    +

    البحث والاستعلام

    يمكنك إجراء عمليات بحث واستعلامات داخل أقسام محددة. لمزيد من التفاصيل، راجع

    +
      +
    • إجراء عمليات البحث والاستعلام داخل الأقسام

    • +
    • إجراء تصفية بيانات التعريف داخل الأقسام

    • +
    +

    إسقاط قسم

    يمكنك إسقاط الأقسام التي لم تعد هناك حاجة إليها. قبل إسقاط أحد الأقسام، تأكد من أن القسم قد تم تحريره.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +client.drop_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.DropPartitionReq;​
    +import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +DropPartitionReq dropPartitionReq = DropPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.dropPartition(dropPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +await client.dropPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.json b/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.json new file mode 100644 index 000000000..3d78cd45e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.rename_collection(​\n old_name=\"my_collection\",​\n new_name=\"my_new_collection\"​\n)​\n\n","import io.milvus.v2.service.collection.request.RenameCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nRenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .newCollectionName(\"my_new_collection\")​\n .build();​\n​\nclient.renameCollection(renameCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = await client.renameCollection({​\n oldName: \"my_collection\",​\n newName: \"my_new_collection\"​\n});​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.RenameCollection(ctx, client.NewRenameCollectionOption(\"my_collection\", \"my_new_collection\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"newCollectionName\": \"my_new_collection\"​\n}'​\n\n","from pymilvus import MilvusClient\n\nclient.alter_collection_properties(\n collection_name=\"collection_name\",\n properties = {\"collection.ttl.seconds\": 500}\n)\n","import io.milvus.v2.service.collection.request.AlterCollectionReq;​\nimport java.util.HashMap;​\nimport java.util.Map;​\n​\nMap properties = new HashMap<>();​\nproperties.put(\"collection.ttl.seconds\", \"60\");​\n​\nAlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .properties(properties)​\n .build();​\n​\nclient.alterCollection(alterCollectionReq);​\n\n","res = await client.alterCollection({​\n collection_name: \"my_collection\",​\n properties: {​\n \"collection.ttl.seconds\": 60​\n }​\n})​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.AlterCollection(ctx, client.NewAlterCollectionOption(\"my_collection\").WithProperty(common.CollectionTTLConfigKey, 60))​\nif err != nil {​\n // handle error​\n}​\n\n","# Currently not available for REST\n\n"],"headingContent":"Modify Collection​","anchorList":[{"label":"تعديل المجموعة","href":"Modify-Collection​","type":1,"isActive":false},{"label":"إعادة تسمية مجموعة","href":"Rename-Collection​","type":2,"isActive":false},{"label":"تعيين TTL للمجموعة","href":"Set-Collection-TTL​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.md b/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.md new file mode 100644 index 000000000..ee419727c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/modify-collection.md @@ -0,0 +1,213 @@ +--- +id: modify-collection.md +title: تعديل المجموعة +--- +

    تعديل المجموعة

    يمكنك إعادة تسمية مجموعة أو تغيير إعداداتها. تركز هذه الصفحة على كيفية تعديل مجموعة.

    +

    إعادة تسمية مجموعة

    يمكنك إعادة تسمية مجموعة على النحو التالي.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.rename_collection(​
    +    old_name="my_collection",​
    +    new_name="my_new_collection"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.RenameCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +RenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .newCollectionName("my_new_collection")​
    +        .build();​
    +​
    +client.renameCollection(renameCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = await client.renameCollection({​
    +    oldName: "my_collection",​
    +    newName: "my_new_collection"​
    +});​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.RenameCollection(ctx, client.NewRenameCollectionOption("my_collection", "my_new_collection"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "newCollectionName": "my_new_collection"​
    +}'​
    +
    +
    +

    تعيين TTL للمجموعة

    إذا كانت هناك حاجة إلى إسقاط مجموعة ما لفترة محددة، ففكر في تعيين وقت تشغيلها (TTL) بالثواني. بمجرد انتهاء مدة TTL، يحذف ميلفوس الكيانات في المجموعة. يكون الحذف غير متزامن، مما يشير إلى أن عمليات البحث والاستعلامات لا تزال ممكنة قبل اكتمال الحذف.

    +

    يوضِّح مقتطف الشيفرة التالي كيفية تغيير TTL لمجموعة.

    + +
    from pymilvus import MilvusClient
    +
    +client.alter_collection_properties(
    +  collection_name="collection_name",
    +  properties = {"collection.ttl.seconds": 500}
    +)
    +
    +
    import io.milvus.v2.service.collection.request.AlterCollectionReq;​
    +import java.util.HashMap;​
    +import java.util.Map;​
    +​
    +Map<String, String> properties = new HashMap<>();​
    +properties.put("collection.ttl.seconds", "60");​
    +​
    +AlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .properties(properties)​
    +        .build();​
    +​
    +client.alterCollection(alterCollectionReq);​
    +
    +
    +
    res = await client.alterCollection({​
    +    collection_name: "my_collection",​
    +    properties: {​
    +        "collection.ttl.seconds": 60​
    +    }​
    +})​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.AlterCollection(ctx, client.NewAlterCollectionOption("my_collection").WithProperty(common.CollectionTTLConfigKey, 60))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # Currently not available for REST
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/collections/view-collections.json b/localization/v2.5.x/site/ar/userGuide/collections/view-collections.json new file mode 100644 index 000000000..e52c6c3d0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/view-collections.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_collections()​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.response.ListCollectionsResp;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListCollectionsResp resp = client.listCollections();​\nSystem.out.println(resp.getCollectionNames());​\n\n","import { MilvusClient } from '@zilliz/milvus2-sdk-node';​\n​\nconst client = new MilvusClient({​\n address: 'localhost:19530',​\n token: 'root:Milvus'​\n});​\n​\n​\nconst collections = await client.listCollections();​\nconsole.log(collections);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collectionNames)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}​\n}'​\n\n","[\"quick_setup\"]​\n\n","res = client.describe_collection(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.service.collection.request.DescribeCollectionReq;​\nimport io.milvus.v2.service.collection.response.DescribeCollectionResp;​\n​\nDescribeCollectionReq request = DescribeCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\nDescribeCollectionResp resp = client.describeCollection(request);​\nSystem.out.println(resp);​\n\n","const res = await client.describeCollection({​\n collection_name: \"quick_setup\"​\n});​\n​\nconsole.log(res);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collection)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n\n"],"headingContent":"View Collections​","anchorList":[{"label":"عرض المجموعات","href":"View-Collections​","type":1,"isActive":false},{"label":"قائمة المجموعات","href":"List-Collections​","type":2,"isActive":false},{"label":"وصف المجموعة","href":"Describe-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/collections/view-collections.md b/localization/v2.5.x/site/ar/userGuide/collections/view-collections.md new file mode 100644 index 000000000..0de45836c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/collections/view-collections.md @@ -0,0 +1,202 @@ +--- +id: view-collections.md +title: عرض المجموعات +--- +

    عرض المجموعات

    يمكنك الحصول على قائمة أسماء جميع المجموعات في قاعدة البيانات المتصلة حاليًا، والتحقق من تفاصيل مجموعة معينة.

    +

    قائمة المجموعات

    يوضح المثال التالي كيفية الحصول على قائمة أسماء جميع المجموعات في قاعدة البيانات المتصلة حاليًا.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_collections()​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.response.ListCollectionsResp;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListCollectionsResp resp = client.listCollections();​
    +System.out.println(resp.getCollectionNames());​
    +
    +
    +
    import { MilvusClient } from '@zilliz/milvus2-sdk-node';​
    +​
    +const client = new MilvusClient({​
    +    address: 'localhost:19530',​
    +    token: 'root:Milvus'​
    +});​
    +​
    +​
    +const collections = await client.listCollections();​
    +console.log(collections);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collectionNames)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}​
    +}'​
    +
    +
    +

    إذا كنت قد أنشأت بالفعل مجموعة باسم quick_setup ، يجب أن تكون نتيجة المثال أعلاه مشابهة لما يلي.

    +
    ["quick_setup"]​
    +
    +
    +

    وصف المجموعة

    يمكنك أيضًا الحصول على تفاصيل مجموعة معينة. يفترض المثال التالي أنك أنشأت بالفعل مجموعة باسم quick_setup.

    + +
    res = client.describe_collection(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DescribeCollectionReq;​
    +import io.milvus.v2.service.collection.response.DescribeCollectionResp;​
    +​
    +DescribeCollectionReq request = DescribeCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +DescribeCollectionResp resp = client.describeCollection(request);​
    +System.out.println(resp);​
    +
    +
    +
    const res = await client.describeCollection({​
    +    collection_name: "quick_setup"​
    +});​
    +​
    +console.log(res);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collection)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/data-import/import-data.json b/localization/v2.5.x/site/ar/userGuide/data-import/import-data.json new file mode 100644 index 000000000..b92e0ac0f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/data-import/import-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus.bulk_writer import bulk_import\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Bulk-insert data from a set of JSON files already uploaded to the MinIO server\nresp = bulk_import(\n url=url,\n collection_name=\"quick_setup\",\n files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],\n)\n\njob_id = resp.json()['data']['jobId']\nprint(job_id)\n","private static String bulkImport(List> batchFiles) throws InterruptedException {\n MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()\n .collectionName(\"quick_setup\")\n .files(batchFiles)\n .build();\n String bulkImportResult = BulkImport.bulkImport(\"http://localhost:19530\", milvusImportRequest);\n System.out.println(bulkImportResult);\n\n JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);\n String jobId = bulkImportObject.getAsJsonObject(\"data\").get(\"jobId\").getAsString();\n System.out.println(\"Create a bulkInert task, job id: \" + jobId);\n return jobId;\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/create\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"files\": [\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\"\n ],\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\"\n ]\n ],\n \"collectionName\": \"quick_setup\"\n}'\n","[\n \"/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json\"\n],\n","[\n \"/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet\"\n]\n\n","{\n \"code\": 200,\n \"data\": {\n \"jobId\": \"448707763884413158\"\n }\n}\n","import json\nfrom pymilvus.bulk_writer import get_import_progress\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Get bulk-insert job progress\nresp = get_import_progress(\n url=url,\n job_id=\"453265736269038336\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void getImportProgress(String jobId) {\n while (true) {\n System.out.println(\"Wait 5 second to check bulkInsert job state...\");\n try {\n TimeUnit.SECONDS.sleep(5);\n } catch (InterruptedException e) {\n break;\n }\n\n MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()\n .jobId(jobId)\n .build();\n String getImportProgressResult = BulkImport.getImportProgress(\"http://localhost:19530\", request);\n\n JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);\n String state = getImportProgressObject.getAsJsonObject(\"data\").get(\"state\").getAsString();\n String progress = getImportProgressObject.getAsJsonObject(\"data\").get(\"progress\").getAsString();\n if (\"Failed\".equals(state)) {\n String reason = getImportProgressObject.getAsJsonObject(\"data\").get(\"reason\").getAsString();\n System.out.printf(\"The job %s failed, reason: %s%n\", jobId, reason);\n break;\n } else if (\"Completed\".equals(state)) {\n System.out.printf(\"The job %s completed%n\", jobId);\n break;\n } else {\n System.out.printf(\"The job %s is running, state:%s progress:%s%n\", jobId, state, progress);\n }\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n getImportProgress(jobId);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/describe\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"jobId\": \"449839014328146739\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"collectionName\": \"quick_setup\",\n \"completeTime\": \"2024-05-18T02:57:13Z\",\n \"details\": [\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146740 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\\\" \",\n \"fileSize\": 31567874,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 100000\n },\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146741 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\\\" \",\n \"fileSize\": 31517224,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000 \n }\n ],\n \"fileSize\": 63085098,\n \"importedRows\": 200000,\n \"jobId\": \"449839014328146739\",\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000\n }\n}\n","import json\nfrom pymilvus.bulk_writer import list_import_jobs\n\nurl = f\"http://127.0.0.1:19530\"\n\n# List bulk-insert jobs\nresp = list_import_jobs(\n url=url,\n collection_name=\"quick_setup\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void listImportJobs() {\n MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName(\"quick_setup\").build();\n String listImportJobsResult = BulkImport.listImportJobs(\"http://localhost:19530\", listImportJobsRequest);\n System.out.println(listImportJobsResult);\n}\n\npublic static void main(String[] args) throws Exception {\n listImportJobs();\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/list\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"quick_setup\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"records\": [\n {\n \"collectionName\": \"quick_setup\",\n \"jobId\": \"448761313698322011\",\n \"progress\": 50,\n \"state\": \"Importing\"\n }\n ]\n }\n}\n"],"headingContent":"Import data","anchorList":[{"label":"استيراد البيانات","href":"Import-data","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-start","type":2,"isActive":false},{"label":"استيراد البيانات","href":"Import-data","type":2,"isActive":false},{"label":"تحقق من تقدم الاستيراد","href":"Check-import-progress","type":2,"isActive":false},{"label":"سرد مهام الاستيراد","href":"List-Import-Jobs","type":2,"isActive":false},{"label":"القيود","href":"Limitations","type":2,"isActive":false},{"label":"القيود","href":"Constraints","type":2,"isActive":false},{"label":"التوصيات","href":"Recommendations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/data-import/import-data.md b/localization/v2.5.x/site/ar/userGuide/data-import/import-data.md new file mode 100644 index 000000000..00824050d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/data-import/import-data.md @@ -0,0 +1,401 @@ +--- +id: import-data.md +order: 1 +title: استيراد البيانات +summary: توضح هذه الصفحة إجراء استيراد البيانات المعدة. +--- +

    استيراد البيانات

    توضح هذه الصفحة إجراء استيراد البيانات المعدة.

    +

    قبل أن تبدأ

      +
    • أن تكون قد أعددت بياناتك بالفعل ووضعتها في دلو ملفوس.

      +

      إذا لم يكن الأمر كذلك، يجب عليك استخدام RemoteBulkWriter لإعداد بياناتك أولاً، والتأكد من أن البيانات المعدة قد تم نقلها بالفعل إلى دلو Milvus على مثيل MinIO الذي تم تشغيله مع مثيل Milvus الخاص بك. للحصول على التفاصيل، راجع إعداد بيانات المصدر.

    • +
    • لقد قمت بالفعل بإنشاء مجموعة مع المخطط الذي تستخدمه لإعداد بياناتك. إذا لم يكن كذلك، راجع إدارة المجموعات.

    • +
    +
    +

    يقوم مقتطف التعليمات البرمجية التالي بإنشاء مجموعة بسيطة بالمخطط المحدد. لمزيد من المعلومات حول المعلمات، راجع create_schema() و create_collection() في مرجع SDK.

    +
    +
    +

    ينشئ مقتطف الشيفرة التالي مجموعة بسيطة بالمخطط المحدد. للمزيد من المعلومات حول المعلمات، ارجع إلى createCollection() في مرجع SDK.

    +
    +

    استيراد البيانات

    لاستيراد البيانات المعدة، عليك إنشاء مهمة استيراد على النحو التالي:

    + +
    from pymilvus.bulk_writer import bulk_import
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Bulk-insert data from a set of JSON files already uploaded to the MinIO server
    +resp = bulk_import(
    +    url=url,
    +    collection_name="quick_setup",
    +    files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],
    +)
    +
    +job_id = resp.json()['data']['jobId']
    +print(job_id)
    +
    +
    private static String bulkImport(List<List<String>> batchFiles) throws InterruptedException {
    +    MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()
    +            .collectionName("quick_setup")
    +            .files(batchFiles)
    +            .build();
    +    String bulkImportResult = BulkImport.bulkImport("http://localhost:19530", milvusImportRequest);
    +    System.out.println(bulkImportResult);
    +
    +    JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);
    +    String jobId = bulkImportObject.getAsJsonObject("data").get("jobId").getAsString();
    +    System.out.println("Create a bulkInert task, job id: " + jobId);
    +    return jobId;
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/create" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "files": [
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet"
    +        ],
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet"
    +        ]
    +    ],
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    يحتوي نص الطلب على حقلين:

    +
      +
    • collectionName

      +

      اسم المجموعة المستهدفة.

    • +
    • files

      +

      قائمة بقوائم مسارات الملفات بالنسبة للمسار الجذر لحافظة Milvus على مثيل MioIO الذي بدأ مع مثيل Milvus الخاص بك. القوائم الفرعية المحتملة هي كما يلي:

      +
        +
      • ملفات JSON

        +

        إذا كان الملف المُعد بتنسيق JSON، فيجب أن تحتوي كل قائمة فرعية على المسار إلى ملف JSON واحد مُعد.

        +
        [
        +    "/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json"
        +],
        +
      • +
      • ملفات الباركيه

        +

        إذا كان الملف المُعد بتنسيق Parquet، فيجب أن تحتوي كل قائمة فرعية على المسار إلى ملف باركيه واحد مُعد.

        +
        [
        +    "/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet"
        +]
        +
        +
      • +
    • +
    +

    العائد المحتمل كما يلي:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "jobId": "448707763884413158"
    +    }
    +}
    +
    +

    تحقق من تقدم الاستيراد

    بمجرد الحصول على معرف مهمة الاستيراد، يمكنك التحقق من تقدم الاستيراد على النحو التالي:

    + +
    import json
    +from pymilvus.bulk_writer import get_import_progress
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Get bulk-insert job progress
    +resp = get_import_progress(
    +    url=url,
    +    job_id="453265736269038336",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void getImportProgress(String jobId) {
    +    while (true) {
    +        System.out.println("Wait 5 second to check bulkInsert job state...");
    +        try {
    +            TimeUnit.SECONDS.sleep(5);
    +        } catch (InterruptedException e) {
    +            break;
    +        }
    +
    +        MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()
    +                .jobId(jobId)
    +                .build();
    +        String getImportProgressResult = BulkImport.getImportProgress("http://localhost:19530", request);
    +
    +        JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);
    +        String state = getImportProgressObject.getAsJsonObject("data").get("state").getAsString();
    +        String progress = getImportProgressObject.getAsJsonObject("data").get("progress").getAsString();
    +        if ("Failed".equals(state)) {
    +            String reason = getImportProgressObject.getAsJsonObject("data").get("reason").getAsString();
    +            System.out.printf("The job %s failed, reason: %s%n", jobId, reason);
    +            break;
    +        } else if ("Completed".equals(state)) {
    +            System.out.printf("The job %s completed%n", jobId);
    +            break;
    +        } else {
    +            System.out.printf("The job %s is running, state:%s progress:%s%n", jobId, state, progress);
    +        }
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +    getImportProgress(jobId);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/describe" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "jobId": "449839014328146739"
    +}'
    +
    +

    يكون الرد المحتمل كما يلي:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "collectionName": "quick_setup",
    +        "completeTime": "2024-05-18T02:57:13Z",
    +        "details": [
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146740 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\" ",
    +                "fileSize": 31567874,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 100000
    +            },
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146741 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\" ",
    +                "fileSize": 31517224,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 200000            
    +            }
    +        ],
    +        "fileSize": 63085098,
    +        "importedRows": 200000,
    +        "jobId": "449839014328146739",
    +        "progress": 100,
    +        "state": "Completed",
    +        "totalRows": 200000
    +    }
    +}
    +
    +

    سرد مهام الاستيراد

    يمكنك سرد جميع مهام الاستيراد المتعلقة بمجموعة محددة على النحو التالي:

    + +
    import json
    +from pymilvus.bulk_writer import list_import_jobs
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# List bulk-insert jobs
    +resp = list_import_jobs(
    +    url=url,
    +    collection_name="quick_setup",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void listImportJobs() {
    +    MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName("quick_setup").build();
    +    String listImportJobsResult = BulkImport.listImportJobs("http://localhost:19530", listImportJobsRequest);
    +    System.out.println(listImportJobsResult);
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    listImportJobs();
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/list" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    القيم الممكنة هي كالتالي:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "records": [
    +            {
    +                "collectionName": "quick_setup",
    +                "jobId": "448761313698322011",
    +                "progress": 50,
    +                "state": "Importing"
    +            }
    +        ]
    +    }
    +}
    +
    +

    القيود

      +
    • يجب ألا يتجاوز حجم كل ملف استيراد 16 جيجابايت.

    • +
    • يجب ألا يتجاوز الحد الأقصى لعدد طلبات الاستيراد 1024.

    • +
    • يجب ألا يتجاوز الحد الأقصى لعدد الملفات لكل طلب استيراد 1024.

    • +
    • يمكن تحديد اسم قسم واحد فقط في طلب الاستيراد. إذا لم يتم تحديد اسم قسم، سيتم إدراج البيانات في القسم الافتراضي. بالإضافة إلى ذلك، لا يمكنك تعيين اسم قسم في طلب الاستيراد إذا قمت بتعيين مفتاح القسم في المجموعة المستهدفة.

    • +
    +

    القيود

    قبل استيراد البيانات، تأكد من أنك قد تعرفت على القيود فيما يتعلق بسلوكيات ميلفوس التالية:

    +
      +
    • القيود المتعلقة بسلوك التحميل:

      +
        +
      • إذا تم تحميل مجموعة بالفعل قبل الاستيراد، يمكنك استخدام الدالة refresh_load لتحميل البيانات المستوردة حديثًا بعد اكتمال الاستيراد.
      • +
    • +
    • القيود المتعلقة بسلوكيات الاستعلام والبحث:

      +
        +
      • قبل اكتمال حالة مهمة الاستيراد، يتم ضمان أن تكون البيانات المستوردة حديثًا غير مرئية للاستعلامات وعمليات البحث.

      • +
      • بمجرد اكتمال حالة المهمة,

        +
          +
        • إذا لم يتم تحميل المجموعة، يمكنك استخدام الدالة load لتحميل البيانات المستوردة حديثًا.

        • +
        • إذا كانت المجموعة محملة بالفعل، يمكنك استدعاء load(is_refresh=True) لتحميل البيانات المستوردة.

        • +
      • +
    • +
    • القيود المتعلقة بسلوك الحذف:

      +
        +
      • قبل اكتمال حالة مهمة الاستيراد، الحذف غير مضمون وقد ينجح أو لا ينجح.

      • +
      • الحذف بعد اكتمال حالة المهمة مضمون النجاح.

      • +
    • +
    +

    التوصيات

    نوصي بشدة باستخدام ميزة الاستيراد متعدد الملفات، والتي تسمح لك بتحميل عدة ملفات في طلب واحد. لا تعمل هذه الطريقة على تبسيط عملية الاستيراد فحسب، بل تعزز أداء الاستيراد بشكل كبير. وفي الوقت نفسه، من خلال دمج عمليات التحميل الخاصة بك، يمكنك تقليل الوقت المستغرق في إدارة البيانات وجعل سير عملك أكثر كفاءة.

    diff --git a/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.json b/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.json new file mode 100644 index 000000000..3d1791f90 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# You need to work out a collection schema out of your dataset.\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True\n)\n\nDIM = 512\n\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True),\nschema.add_field(field_name=\"bool\", datatype=DataType.BOOL),\nschema.add_field(field_name=\"int8\", datatype=DataType.INT8),\nschema.add_field(field_name=\"int16\", datatype=DataType.INT16),\nschema.add_field(field_name=\"int32\", datatype=DataType.INT32),\nschema.add_field(field_name=\"int64\", datatype=DataType.INT64),\nschema.add_field(field_name=\"float\", datatype=DataType.FLOAT),\nschema.add_field(field_name=\"double\", datatype=DataType.DOUBLE),\nschema.add_field(field_name=\"varchar\", datatype=DataType.VARCHAR, max_length=512),\nschema.add_field(field_name=\"json\", datatype=DataType.JSON),\nschema.add_field(field_name=\"array_str\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)\nschema.add_field(field_name=\"array_int\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)\nschema.add_field(field_name=\"float_vector\", datatype=DataType.FLOAT_VECTOR, dim=DIM),\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=DIM),\nschema.add_field(field_name=\"float16_vector\", datatype=DataType.FLOAT16_VECTOR, dim=DIM),\n# schema.add_field(field_name=\"bfloat16_vector\", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)\n\nschema.verify()\n\nprint(schema)\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\nimport io.milvus.bulkwriter.BulkImport;\nimport io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\nimport io.milvus.bulkwriter.common.clientenum.CloudStorage;\nimport io.milvus.bulkwriter.connect.S3ConnectParam;\nimport io.milvus.bulkwriter.connect.StorageConnectParam;\nimport io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;\nimport io.milvus.bulkwriter.request.import_.MilvusImportRequest;\nimport io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;\nimport io.milvus.common.utils.Float16Utils;\nimport io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.*;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\nprivate static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint(\"http://127.0.0.1:9000\");\nprivate static final String BUCKET_NAME = \"a-bucket\";\nprivate static final String ACCESS_KEY = \"minioadmin\";\nprivate static final String SECRET_KEY = \"minioadmin\";\n\nprivate static final Integer DIM = 512;\nprivate static final Gson GSON_INSTANCE = new Gson();\n\nprivate static CreateCollectionReq.CollectionSchema createSchema() {\n CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(true)\n .build();\n schema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(io.milvus.v2.common.DataType.Int64)\n .isPrimaryKey(Boolean.TRUE)\n .autoID(false)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"bool\")\n .dataType(DataType.Bool)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int8\")\n .dataType(DataType.Int8)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int16\")\n .dataType(DataType.Int16)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int32\")\n .dataType(DataType.Int32)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int64\")\n .dataType(DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float\")\n .dataType(DataType.Float)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"double\")\n .dataType(DataType.Double)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"varchar\")\n .dataType(DataType.VarChar)\n .maxLength(512)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"json\")\n .dataType(io.milvus.v2.common.DataType.JSON)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_int\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_str\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.VarChar)\n .maxLength(128)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float_vector\")\n .dataType(io.milvus.v2.common.DataType.FloatVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"binary_vector\")\n .dataType(io.milvus.v2.common.DataType.BinaryVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float16_vector\")\n .dataType(io.milvus.v2.common.DataType.Float16Vector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"sparse_vector\")\n .dataType(io.milvus.v2.common.DataType.SparseFloatVector)\n .build());\n \n return schema;\n}\n","from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType\n# Use `from pymilvus import LocalBulkWriter, BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = LocalBulkWriter(\n schema=schema,\n local_path='.',\n segment_size=512 * 1024 * 1024, # Default value\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.LocalBulkWriter;\nimport io.milvus.bulkwriter.LocalBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\n\nLocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withLocalPath(\".\")\n .withChunkSize(512 * 1024 * 1024)\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nLocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);\n","from pymilvus.bulk_writer import RemoteBulkWriter\n# Use `from pymilvus import RemoteBulkWriter` \n# when you use pymilvus earlier than 2.4.2 \n\n# Third-party constants\nACCESS_KEY=\"minioadmin\"\nSECRET_KEY=\"minioadmin\"\nBUCKET_NAME=\"a-bucket\"\n\n# Connections parameters to access the remote bucket\nconn = RemoteBulkWriter.S3ConnectParam(\n endpoint=\"localhost:9000\", # the default MinIO service started along with Milvus\n access_key=ACCESS_KEY,\n secret_key=SECRET_KEY,\n bucket_name=BUCKET_NAME,\n secure=False\n)\n\nfrom pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n\nprint('bulk writer created.')\n","private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n","from pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\n\nRemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withConnectParam(storageConnectParam)\n .withChunkSize(512 * 1024 * 1024)\n .withRemotePath(\"/\")\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nRemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);\n","import random, string, json\nimport numpy as np\nimport tensorflow as tf\n\ndef generate_random_str(length=5):\n letters = string.ascii_uppercase\n digits = string.digits\n \n return ''.join(random.choices(letters + digits, k=length))\n\n# optional input for binary vector:\n# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]\n# 2. numpy array of uint8\ndef gen_binary_vector(to_numpy_arr):\n raw_vector = [random.randint(0, 1) for i in range(DIM)]\n if to_numpy_arr:\n return np.packbits(raw_vector, axis=-1)\n return raw_vector\n\n# optional input for float vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float32\ndef gen_float_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=\"float32\")\n return raw_vector\n\n# # optional input for bfloat16 vector:\n# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# # 2. numpy array of bfloat16\n# def gen_bf16_vector(to_numpy_arr):\n# raw_vector = [random.random() for _ in range(DIM)]\n# if to_numpy_arr:\n# return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()\n# return raw_vector\n\n# optional input for float16 vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float16\ndef gen_fp16_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=np.float16)\n return raw_vector\n\n# optional input for sparse vector:\n# only accepts dict like {2: 13.23, 45: 0.54} or {\"indices\": [1, 2], \"values\": [0.1, 0.2]}\n# note: no need to sort the keys\ndef gen_sparse_vector(pair_dict: bool):\n raw_vector = {}\n dim = random.randint(2, 20)\n if pair_dict:\n raw_vector[\"indices\"] = [i for i in range(dim)]\n raw_vector[\"values\"] = [random.random() for _ in range(dim)]\n else:\n for i in range(dim):\n raw_vector[i] = random.random()\n return raw_vector\n\nfor i in range(10000):\n writer.append_row({\n \"id\": np.int64(i),\n \"bool\": True if i % 3 == 0 else False,\n \"int8\": np.int8(i%128),\n \"int16\": np.int16(i%1000),\n \"int32\": np.int32(i%100000),\n \"int64\": np.int64(i),\n \"float\": np.float32(i/3),\n \"double\": np.float64(i/7),\n \"varchar\": f\"varchar_{i}\",\n \"json\": json.dumps({\"dummy\": i, \"ok\": f\"name_{i}\"}),\n \"array_str\": np.array([f\"str_{k}\" for k in range(5)], np.dtype(\"str\")),\n \"array_int\": np.array([k for k in range(10)], np.dtype(\"int64\")),\n \"float_vector\": gen_float_vector(True),\n \"binary_vector\": gen_binary_vector(True),\n \"float16_vector\": gen_fp16_vector(True),\n # \"bfloat16_vector\": gen_bf16_vector(True),\n \"sparse_vector\": gen_sparse_vector(True),\n f\"dynamic_{i}\": i,\n })\n if (i+1)%1000 == 0:\n writer.commit()\n print('committed')\n\nprint(writer.batch_files)\n","private static byte[] genBinaryVector() {\n Random ran = new Random();\n int byteCount = DIM / 8;\n ByteBuffer vector = ByteBuffer.allocate(byteCount);\n for (int i = 0; i < byteCount; ++i) {\n vector.put((byte) ran.nextInt(Byte.MAX_VALUE));\n }\n return vector.array();\n}\n\nprivate static List genFloatVector() {\n Random ran = new Random();\n List vector = new ArrayList<>();\n for (int i = 0; i < DIM; ++i) {\n vector.add(ran.nextFloat());\n }\n return vector;\n}\n\nprivate static byte[] genFloat16Vector() {\n List originalVector = genFloatVector();\n return Float16Utils.f32VectorToFp16Buffer(originalVector).array();\n}\n\nprivate static SortedMap genSparseVector() {\n Random ran = new Random();\n SortedMap sparse = new TreeMap<>();\n int dim = ran.nextInt(18) + 2; // [2, 20)\n for (int i = 0; i < dim; ++i) {\n sparse.put((long)ran.nextInt(1000000), ran.nextFloat());\n }\n return sparse;\n}\n\nprivate static List genStringArray(int length) {\n List arr = new ArrayList<>();\n for (int i = 0; i < length; i++) {\n arr.add(\"str_\" + i);\n }\n return arr;\n}\n\nprivate static List genIntArray(int length) {\n List arr = new ArrayList<>();\n for (long i = 0; i < length; i++) {\n arr.add(i);\n }\n return arr;\n}\n\nprivate static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n\nprivate static List> uploadData() throws Exception {\n CreateCollectionReq.CollectionSchema collectionSchema = createSchema();\n try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {\n for (int i = 0; i < 10000; ++i) {\n JsonObject rowObject = new JsonObject();\n\n rowObject.addProperty(\"id\", i);\n rowObject.addProperty(\"bool\", i % 3 == 0);\n rowObject.addProperty(\"int8\", i % 128);\n rowObject.addProperty(\"int16\", i % 1000);\n rowObject.addProperty(\"int32\", i % 100000);\n rowObject.addProperty(\"int64\", i);\n rowObject.addProperty(\"float\", i / 3);\n rowObject.addProperty(\"double\", i / 7);\n rowObject.addProperty(\"varchar\", \"varchar_\" + i);\n rowObject.addProperty(\"json\", String.format(\"{\\\"dummy\\\": %s, \\\"ok\\\": \\\"name_%s\\\"}\", i, i));\n rowObject.add(\"array_str\", GSON_INSTANCE.toJsonTree(genStringArray(5)));\n rowObject.add(\"array_int\", GSON_INSTANCE.toJsonTree(genIntArray(10)));\n rowObject.add(\"float_vector\", GSON_INSTANCE.toJsonTree(genFloatVector()));\n rowObject.add(\"binary_vector\", GSON_INSTANCE.toJsonTree(genBinaryVector()));\n rowObject.add(\"float16_vector\", GSON_INSTANCE.toJsonTree(genFloat16Vector()));\n rowObject.add(\"sparse_vector\", GSON_INSTANCE.toJsonTree(genSparseVector()));\n rowObject.addProperty(\"dynamic\", \"dynamic_\" + i);\n\n remoteBulkWriter.appendRow(rowObject);\n\n if ((i+1)%1000 == 0) {\n remoteBulkWriter.commit(false);\n }\n }\n\n List> batchFiles = remoteBulkWriter.getBatchFiles();\n System.out.println(batchFiles);\n return batchFiles;\n } catch (Exception e) {\n throw e;\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n}\n","print(writer.batch_files)\n\n# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],\n# ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]\n","// localBulkWriter.getBatchFiles();\nremoteBulkWriter.getBatchFiles();\n\n// \n\n// Close the BulkWriter\ntry {\n localBulkWriter.close();\n remoteBulkWriter.close(); \n} catch (Exception e) {\n // TODO: handle exception\n e.printStackTrace();\n}\n","# JSON\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.json \n\n# Parquet\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.parquet \n"],"headingContent":"Prepare Source Data","anchorList":[{"label":"إعداد بيانات المصدر","href":"Prepare-Source-Data","type":1,"isActive":false},{"label":"قبل أن تبدأ","href":"Before-you-start","type":2,"isActive":false},{"label":"إعداد BulkWriter بالجملة","href":"Set-up-BulkWriter","type":2,"isActive":false},{"label":"بدء الكتابة","href":"Start-writing","type":2,"isActive":false},{"label":"التحقّق من النتائج","href":"Verify-the-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.md b/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.md new file mode 100644 index 000000000..f45054f68 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/data-import/prepare-source-data.md @@ -0,0 +1,633 @@ +--- +id: prepare-source-data.md +order: 0 +title: إعداد بيانات المصدر +summary: >- + تناقش هذه الصفحة شيئًا يجب أن تضعه في اعتبارك قبل البدء في إدراج البيانات + بالجملة في مجموعتك. +--- +

    إعداد بيانات المصدر

    تناقش هذه الصفحة شيئًا يجب أن تضعه في اعتبارك قبل البدء في إدراج البيانات المجمعة في مجموعتك.

    +

    قبل أن تبدأ

    تتطلب المجموعة المستهدفة تعيين بيانات المصدر إلى مخططها. يوضح الرسم البياني أدناه كيفية تعيين بيانات المصدر المقبولة إلى مخطط المجموعة المستهدفة.

    +

    + + Map data to schema + تعيين البيانات إلى المخطط

    +

    يجب عليك فحص بياناتك بعناية وتصميم مخطط المجموعة الهدف وفقًا لذلك.

    +

    بأخذ بيانات JSON في الرسم البياني أعلاه كمثال، هناك كيانان في قائمة الصفوف، كل صف يحتوي على ستة حقول. يتضمن مخطط المجموعة بشكل انتقائي أربعة حقول: المعرف، والمتجه، والمقدار_1، والمقدار_2.

    +

    هناك أمران آخران يجب مراعاتهما عند تصميم المخطط:

    +
      +
    • ما إذا كنت تريد تمكين المعرف التلقائي

      +

      يعمل حقل المعرف كحقل أساسي للمجموعة. لجعل الحقل الأساسي يتزايد تلقائيًا، يمكنك تمكين المعرف التلقائي في المخطط. في هذه الحالة، يجب استبعاد حقل المعرف من كل صف في البيانات المصدر.

    • +
    • ما إذا كنت تريد تمكين الحقول الديناميكية

      +

      يمكن للمجموعة المستهدفة أيضًا تخزين الحقول غير المضمنة في مخططها المحدد مسبقًا إذا كان المخطط يمكّن الحقول الديناميكية. الحقل $meta هو حقل JSON محجوز للاحتفاظ بالحقول الديناميكية وقيمها في أزواج قيمة المفتاح. في الرسم البياني أعلاه، سيتم حفظ الحقلين الديناميكي_الحقل_1 والديناميكي_الحقل_2 والقيم كأزواج قيمة مفتاح في حقل $meta.

    • +
    +

    يوضح الرمز التالي كيفية إعداد المخطط للمجموعة الموضحة في الرسم البياني أعلاه.

    +
    +

    للحصول على مزيد من المعلومات، ارجع إلى create_schema() و add_field() في مرجع SDK.

    +
    +
    +

    للحصول على مزيد من المعلومات، ارجع إلى CollectionSchema في مرجع SDK.

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# You need to work out a collection schema out of your dataset.
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True
    +)
    +
    +DIM = 512
    +
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True),
    +schema.add_field(field_name="bool", datatype=DataType.BOOL),
    +schema.add_field(field_name="int8", datatype=DataType.INT8),
    +schema.add_field(field_name="int16", datatype=DataType.INT16),
    +schema.add_field(field_name="int32", datatype=DataType.INT32),
    +schema.add_field(field_name="int64", datatype=DataType.INT64),
    +schema.add_field(field_name="float", datatype=DataType.FLOAT),
    +schema.add_field(field_name="double", datatype=DataType.DOUBLE),
    +schema.add_field(field_name="varchar", datatype=DataType.VARCHAR, max_length=512),
    +schema.add_field(field_name="json", datatype=DataType.JSON),
    +schema.add_field(field_name="array_str", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)
    +schema.add_field(field_name="array_int", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)
    +schema.add_field(field_name="float_vector", datatype=DataType.FLOAT_VECTOR, dim=DIM),
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=DIM),
    +schema.add_field(field_name="float16_vector", datatype=DataType.FLOAT16_VECTOR, dim=DIM),
    +# schema.add_field(field_name="bfloat16_vector", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
    +
    +schema.verify()
    +
    +print(schema)
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +import io.milvus.bulkwriter.BulkImport;
    +import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +import io.milvus.bulkwriter.common.clientenum.CloudStorage;
    +import io.milvus.bulkwriter.connect.S3ConnectParam;
    +import io.milvus.bulkwriter.connect.StorageConnectParam;
    +import io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;
    +import io.milvus.bulkwriter.request.import_.MilvusImportRequest;
    +import io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;
    +import io.milvus.common.utils.Float16Utils;
    +import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.*;
    +
    +import java.io.IOException;
    +import java.nio.ByteBuffer;
    +import java.util.*;
    +import java.util.concurrent.TimeUnit;
    +
    +private static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint("http://127.0.0.1:9000");
    +private static final String BUCKET_NAME = "a-bucket";
    +private static final String ACCESS_KEY = "minioadmin";
    +private static final String SECRET_KEY = "minioadmin";
    +
    +private static final Integer DIM = 512;
    +private static final Gson GSON_INSTANCE = new Gson();
    +
    +private static CreateCollectionReq.CollectionSchema createSchema() {
    +    CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(true)
    +        .build();
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("id")
    +            .dataType(io.milvus.v2.common.DataType.Int64)
    +            .isPrimaryKey(Boolean.TRUE)
    +            .autoID(false)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("bool")
    +            .dataType(DataType.Bool)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int8")
    +            .dataType(DataType.Int8)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int16")
    +            .dataType(DataType.Int16)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int32")
    +            .dataType(DataType.Int32)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int64")
    +            .dataType(DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float")
    +            .dataType(DataType.Float)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("double")
    +            .dataType(DataType.Double)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("varchar")
    +            .dataType(DataType.VarChar)
    +            .maxLength(512)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("json")
    +            .dataType(io.milvus.v2.common.DataType.JSON)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_int")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_str")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.VarChar)
    +            .maxLength(128)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float_vector")
    +            .dataType(io.milvus.v2.common.DataType.FloatVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("binary_vector")
    +            .dataType(io.milvus.v2.common.DataType.BinaryVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float16_vector")
    +            .dataType(io.milvus.v2.common.DataType.Float16Vector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("sparse_vector")
    +            .dataType(io.milvus.v2.common.DataType.SparseFloatVector)
    +            .build());
    +    
    +    return schema;
    +}
    +
    +

    إعداد BulkWriter بالجملة

    BulkWriter هي أداة مصممة لتحويل مجموعات البيانات الخام إلى تنسيق مناسب للاستيراد عبر واجهة برمجة تطبيقات الاستيراد RESTful Import. تقدم نوعين من الكتّاب:

    +
      +
    • LocalBulkWriter: يقرأ مجموعة البيانات المعينة ويحولها إلى تنسيق سهل الاستخدام.
    • +
    • RemoteBulkWriter: يؤدي نفس مهمة LocalBulkWriter ولكنه ينقل بالإضافة إلى ذلك ملفات البيانات المحولة إلى مجموعة تخزين كائنات محددة عن بعد.
    • +
    +

    يختلفRemoteBulkWriter عن LocalBulkWriter في أن RemoteBulkWriter ينقل ملفات البيانات المحولة إلى دلو تخزين كائن مستهدف.

    +

    إعداد LocalBulkWriter المحلي

    يقوم LocalBulkWriter بإلحاق الصفوف من مجموعة البيانات المصدر وينقلها إلى ملف محلي بالتنسيق المحدد.

    + +
    from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType
    +# Use `from pymilvus import LocalBulkWriter, BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = LocalBulkWriter(
    +    schema=schema,
    +    local_path='.',
    +    segment_size=512 * 1024 * 1024, # Default value
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.LocalBulkWriter;
    +import io.milvus.bulkwriter.LocalBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +
    +LocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withLocalPath(".")
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +LocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);
    +
    +
    +

    عند إنشاء LocalBulkWriter LocalBulkWriter، يجب عليك:

    +
      +
    • الإشارة إلى المخطط الذي تم إنشاؤه في schema.
    • +
    • تعيين local_path إلى دليل الإخراج.
    • +
    • تعيين file_type إلى نوع ملف الإخراج.
    • +
    • إذا كانت مجموعة البيانات الخاصة بك تحتوي على عدد كبير من السجلات، يُنصح بتجزئة بياناتك عن طريق تعيين segment_size إلى قيمة مناسبة.
    • +
    +

    للحصول على تفاصيل حول إعدادات المعلمات، راجع LocalBulkWriter في مرجع SDK.

    +
    +
    +

    عند إنشاء LocalBulkWriter، يجب عليك:

    +
      +
    • الرجوع إلى المخطط الذي تم إنشاؤه في CollectionSchema().
    • +
    • تعيين دليل الإخراج في withLocalPath().
    • +
    • تعيين نوع ملف الإخراج في withFileType().
    • +
    • إذا كانت مجموعة البيانات الخاصة بك تحتوي على عدد كبير من السجلات، يُنصح بتجزئة بياناتك عن طريق تعيين withChunkSize() إلى قيمة مناسبة.
    • +
    +

    للحصول على تفاصيل حول إعدادات المعلمات، راجع LocalBulkWriter في مرجع SDK.

    +
    +

    إعداد RemoteBulkWriter

    بدلاً من ارتكاب البيانات المُلحقة إلى ملف محلي، يقوم RemoteBulkWriter بارتكابها إلى دلو بعيد. لذلك، يجب عليك إعداد كائن ConnectParam قبل إنشاء RemoteBulkWriter.

    + +
    from pymilvus.bulk_writer import RemoteBulkWriter
    +# Use `from pymilvus import RemoteBulkWriter` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +# Third-party constants
    +ACCESS_KEY="minioadmin"
    +SECRET_KEY="minioadmin"
    +BUCKET_NAME="a-bucket"
    +
    +# Connections parameters to access the remote bucket
    +conn = RemoteBulkWriter.S3ConnectParam(
    +    endpoint="localhost:9000", # the default MinIO service started along with Milvus
    +    access_key=ACCESS_KEY,
    +    secret_key=SECRET_KEY,
    +    bucket_name=BUCKET_NAME,
    +    secure=False
    +)
    +
    +from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +print('bulk writer created.')
    +
    +
    private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +

    بمجرد أن تكون معلمات الاتصال جاهزة، يمكنك الرجوع إليها في RemoteBulkWriter على النحو التالي:

    + +
    from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +
    +RemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withConnectParam(storageConnectParam)
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withRemotePath("/")
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +RemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);
    +
    +
    +

    بالكاد تكون معلمات إنشاء RemoteBulkWriter هي نفسها تلك الخاصة بـ LocalBulkWriter، باستثناء connect_param. للحصول على تفاصيل حول إعدادات المعلمات، راجع RemoteBulkWriter و ConnectParam في مرجع SDK.

    +
    +
    +

    تكاد تكون معلمات إنشاء RemoteBulkWriter مماثلة لتلك الخاصة بـ LocalBulkWriter، باستثناء StorageConnectParam. للحصول على تفاصيل حول إعدادات المعلمات، راجع RemoteBulkWriter و StorageConnectParam في مرجع SDK.

    +
    +

    بدء الكتابة

    +

    يحتوي BulkWriter BulkWriter على طريقتين: append_row() إضافة صف من مجموعة بيانات مصدر، و commit() يرتكب الصفوف المضافة إلى ملف محلي أو دلو بعيد.

    +
    +
    +

    يحتوي BulkWriter بالجملة على طريقتين: appendRow() يضيف صفًا من مجموعة بيانات مصدر، و commit() يرتكب الصفوف المضافة إلى ملف محلي أو دلو بعيد.

    +
    +

    لأغراض العرض التوضيحي، تلحق الشيفرة التالية البيانات التي تم إنشاؤها عشوائيًا.

    + +
    import random, string, json
    +import numpy as np
    +import tensorflow as tf
    +
    +def generate_random_str(length=5):
    +    letters = string.ascii_uppercase
    +    digits = string.digits
    +    
    +    return ''.join(random.choices(letters + digits, k=length))
    +
    +# optional input for binary vector:
    +# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]
    +# 2. numpy array of uint8
    +def gen_binary_vector(to_numpy_arr):
    +    raw_vector = [random.randint(0, 1) for i in range(DIM)]
    +    if to_numpy_arr:
    +        return np.packbits(raw_vector, axis=-1)
    +    return raw_vector
    +
    +# optional input for float vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float32
    +def gen_float_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype="float32")
    +    return raw_vector
    +
    +# # optional input for bfloat16 vector:
    +# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# # 2. numpy array of bfloat16
    +# def gen_bf16_vector(to_numpy_arr):
    +#     raw_vector = [random.random() for _ in range(DIM)]
    +#     if to_numpy_arr:
    +#         return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()
    +#     return raw_vector
    +
    +# optional input for float16 vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float16
    +def gen_fp16_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype=np.float16)
    +    return raw_vector
    +
    +# optional input for sparse vector:
    +# only accepts dict like {2: 13.23, 45: 0.54} or {"indices": [1, 2], "values": [0.1, 0.2]}
    +# note: no need to sort the keys
    +def gen_sparse_vector(pair_dict: bool):
    +    raw_vector = {}
    +    dim = random.randint(2, 20)
    +    if pair_dict:
    +        raw_vector["indices"] = [i for i in range(dim)]
    +        raw_vector["values"] = [random.random() for _ in range(dim)]
    +    else:
    +        for i in range(dim):
    +            raw_vector[i] = random.random()
    +    return raw_vector
    +
    +for i in range(10000):
    +    writer.append_row({
    +        "id": np.int64(i),
    +        "bool": True if i % 3 == 0 else False,
    +        "int8": np.int8(i%128),
    +        "int16": np.int16(i%1000),
    +        "int32": np.int32(i%100000),
    +        "int64": np.int64(i),
    +        "float": np.float32(i/3),
    +        "double": np.float64(i/7),
    +        "varchar": f"varchar_{i}",
    +        "json": json.dumps({"dummy": i, "ok": f"name_{i}"}),
    +        "array_str": np.array([f"str_{k}" for k in range(5)], np.dtype("str")),
    +        "array_int": np.array([k for k in range(10)], np.dtype("int64")),
    +        "float_vector": gen_float_vector(True),
    +        "binary_vector": gen_binary_vector(True),
    +        "float16_vector": gen_fp16_vector(True),
    +        # "bfloat16_vector": gen_bf16_vector(True),
    +        "sparse_vector": gen_sparse_vector(True),
    +        f"dynamic_{i}": i,
    +    })
    +    if (i+1)%1000 == 0:
    +        writer.commit()
    +        print('committed')
    +
    +print(writer.batch_files)
    +
    +
    private static byte[] genBinaryVector() {
    +    Random ran = new Random();
    +    int byteCount = DIM / 8;
    +    ByteBuffer vector = ByteBuffer.allocate(byteCount);
    +    for (int i = 0; i < byteCount; ++i) {
    +        vector.put((byte) ran.nextInt(Byte.MAX_VALUE));
    +    }
    +    return vector.array();
    +}
    +
    +private static List<Float> genFloatVector() {
    +    Random ran = new Random();
    +    List<Float> vector = new ArrayList<>();
    +    for (int i = 0; i < DIM; ++i) {
    +        vector.add(ran.nextFloat());
    +    }
    +    return vector;
    +}
    +
    +private static byte[] genFloat16Vector() {
    +    List<Float> originalVector = genFloatVector();
    +    return Float16Utils.f32VectorToFp16Buffer(originalVector).array();
    +}
    +
    +private static SortedMap<Long, Float> genSparseVector() {
    +    Random ran = new Random();
    +    SortedMap<Long, Float> sparse = new TreeMap<>();
    +    int dim = ran.nextInt(18) + 2; // [2, 20)
    +    for (int i = 0; i < dim; ++i) {
    +        sparse.put((long)ran.nextInt(1000000), ran.nextFloat());
    +    }
    +    return sparse;
    +}
    +
    +private static List<String> genStringArray(int length) {
    +    List<String> arr = new ArrayList<>();
    +    for (int i = 0; i < length; i++) {
    +        arr.add("str_" + i);
    +    }
    +    return arr;
    +}
    +
    +private static List<Long> genIntArray(int length) {
    +    List<Long> arr = new ArrayList<>();
    +    for (long i = 0; i < length; i++) {
    +        arr.add(i);
    +    }
    +    return arr;
    +}
    +
    +private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +private static List<List<String>> uploadData() throws Exception {
    +    CreateCollectionReq.CollectionSchema collectionSchema = createSchema();
    +    try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {
    +        for (int i = 0; i < 10000; ++i) {
    +            JsonObject rowObject = new JsonObject();
    +
    +            rowObject.addProperty("id", i);
    +            rowObject.addProperty("bool", i % 3 == 0);
    +            rowObject.addProperty("int8", i % 128);
    +            rowObject.addProperty("int16", i % 1000);
    +            rowObject.addProperty("int32", i % 100000);
    +            rowObject.addProperty("int64", i);
    +            rowObject.addProperty("float", i / 3);
    +            rowObject.addProperty("double", i / 7);
    +            rowObject.addProperty("varchar", "varchar_" + i);
    +            rowObject.addProperty("json", String.format("{\"dummy\": %s, \"ok\": \"name_%s\"}", i, i));
    +            rowObject.add("array_str", GSON_INSTANCE.toJsonTree(genStringArray(5)));
    +            rowObject.add("array_int", GSON_INSTANCE.toJsonTree(genIntArray(10)));
    +            rowObject.add("float_vector", GSON_INSTANCE.toJsonTree(genFloatVector()));
    +            rowObject.add("binary_vector", GSON_INSTANCE.toJsonTree(genBinaryVector()));
    +            rowObject.add("float16_vector", GSON_INSTANCE.toJsonTree(genFloat16Vector()));
    +            rowObject.add("sparse_vector", GSON_INSTANCE.toJsonTree(genSparseVector()));
    +            rowObject.addProperty("dynamic", "dynamic_" + i);
    +
    +            remoteBulkWriter.appendRow(rowObject);
    +
    +            if ((i+1)%1000 == 0) {
    +                remoteBulkWriter.commit(false);
    +            }
    +        }
    +
    +        List<List<String>> batchFiles = remoteBulkWriter.getBatchFiles();
    +        System.out.println(batchFiles);
    +        return batchFiles;
    +    } catch (Exception e) {
    +        throw e;
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +}
    +
    +

    التحقّق من النتائج

    +

    للتحقق من النتائج، يمكنك الحصول على مسار الإخراج الفعلي عن طريق طباعة الخاصية batch_files للكاتب.

    +
    +
    +

    للتحقق من النتائج، يمكنك الحصول على مسار الإخراج الفعلي عن طريق طباعة الخاصية getBatchFiles() للكاتب.

    +
    + +
    print(writer.batch_files)
    +
    +# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],
    +#  ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]
    +
    +
    // localBulkWriter.getBatchFiles();
    +remoteBulkWriter.getBatchFiles();
    +
    +// 
    +
    +// Close the BulkWriter
    +try {
    +    localBulkWriter.close();
    +    remoteBulkWriter.close();            
    +} catch (Exception e) {
    +    // TODO: handle exception
    +    e.printStackTrace();
    +}
    +
    +

    ينشئBulkWriter BulkWriter معرّف UUID، وينشئ مجلدًا فرعيًا باستخدام معرّف UUID في دليل الإخراج المُقدَّم، ويضع جميع الملفات التي تم إنشاؤها في المجلد الفرعي. انقر هنا لتنزيل نموذج البيانات المعد.

    +

    هياكل المجلدات الممكنة هي كما يلي:

    +
    # JSON
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.json 
    +
    +# Parquet
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.parquet 
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.json b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.json new file mode 100644 index 000000000..b2468355c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n filter=\"color in ['red_3314', 'purple_7392']\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .filter(\"color in ['red_3314', 'purple_7392']\")​\n .build());​\n​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Delete entities​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n filter: \"color in ['red', 'green']\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 3​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color in [\\\"red_3314\\\", \\\"purple_7392\\\"]\"​\n}'​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n ids=[18, 19]​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19]​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":{}}​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n ids=[18, 19],​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .partitionName(\"partitionA\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19],​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"cost\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Delete Entities​","anchorList":[{"label":"حذف الكيانات","href":"Delete-Entities​","type":1,"isActive":false},{"label":"حذف الكيانات بواسطة شروط التصفية","href":"Delete-Entities-by-Filtering-Conditions​","type":2,"isActive":false},{"label":"حذف الكيانات حسب المفاتيح الأساسية","href":"Delete-Entities-by-Primary-Keys​","type":2,"isActive":false},{"label":"حذف الكيانات من الأقسام","href":"Delete-Entities-from-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.md b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.md new file mode 100644 index 000000000..5523aa95f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/delete-entities.md @@ -0,0 +1,257 @@ +--- +id: delete-entities.md +title: حذف الكيانات +--- +

    حذف الكيانات

    يمكنك حذف الكيانات التي لم تعد هناك حاجة إليها عن طريق تصفية الشروط أو مفاتيحها الأساسية.

    +

    حذف الكيانات بواسطة شروط التصفية

    عند حذف العديد من الكيانات التي تشترك في بعض السمات دفعة واحدة، يمكنك استخدام تعبيرات التصفية. يستخدم المثال أدناه الرمز أدناه الرمز in لحذف جميع الكيانات التي تم تعيين حقل اللون الخاص بها على قيمتي الأحمر والأخضر. يمكنك أيضًا استخدام عوامل أخرى لإنشاء تعبيرات تصفية تفي بمتطلباتك. لمزيد من المعلومات حول تعبيرات التصفية، يُرجى الرجوع إلى تصفية البيانات الوصفية.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    filter="color in ['red_3314', 'purple_7392']"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +ilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .filter("color in ['red_3314', 'purple_7392']")​
    +        .build());​
    +​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Delete entities​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    filter: "color in ['red', 'green']"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 3​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color in [\"red_3314\", \"purple_7392\"]"​
    +}'​
    +
    +
    +

    حذف الكيانات حسب المفاتيح الأساسية

    في معظم الحالات، يقوم المفتاح الأساسي بتعريف الكيان بشكل فريد. يمكنك حذف الكيانات عن طريق تعيين مفاتيحها الأساسية في طلب الحذف. يوضح المثال البرمجي أدناه كيفية حذف كيانين بمفتاحين أساسيين 18 و 19.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    ids=[18, 19]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19]​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +## {"code":0,"cost":0,"data":{}}​
    +
    +
    +

    حذف الكيانات من الأقسام

    يمكنك أيضًا حذف الكيانات المخزنة في أقسام محددة. تفترض مقتطفات التعليمات البرمجية التالية أن لديك قسمًا باسم PartitionA في مجموعتك.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    ids=[18, 19],​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .partitionName("partitionA")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19],​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "cost": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.json b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.json new file mode 100644 index 000000000..996538aa7 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n partition_name=\"partitionA\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_name: \"partitionA\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 10,​\n# 11,​\n# 12,​\n# 13,​\n# 14,​\n# 15,​\n# 16,​\n# 17,​\n# 18,​\n# 19​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Insert Entities​","anchorList":[{"label":"إدراج الكيانات","href":"Insert-Entities​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إدراج الكيانات في مجموعة","href":"Insert-Entities-into-a-Collection​","type":2,"isActive":false},{"label":"إدراج كيانات في قسم","href":"Insert-Entities-into-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.md b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.md new file mode 100644 index 000000000..1cce3dca6 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/insert-update-delete.md @@ -0,0 +1,365 @@ +--- +id: insert-update-delete.md +summary: >- + الكيانات في المجموعة هي سجلات البيانات التي تشترك في نفس مجموعة الحقول. تشكل + قيم الحقول في كل سجل بيانات كيانًا. تقدم هذه الصفحة كيفية إدراج الكيانات في + مجموعة. +title: إدراج الكيانات +--- +

    إدراج الكيانات

    الكيانات في المجموعة هي سجلات البيانات التي تشترك في نفس مجموعة الحقول. تشكل قيم الحقول في كل سجل بيانات كيانًا. تقدم هذه الصفحة كيفية إدراج الكيانات في مجموعة.

    +

    نظرة عامة

    في Milvus، يشير الكيان إلى سجلات البيانات في مجموعة تشترك في نفس المخطط، حيث تشكل البيانات الموجودة في كل حقل من حقول الصف كيانًا. لذلك، فإن الكيانات داخل نفس المجموعة لها نفس السمات (مثل أسماء الحقول وأنواع البيانات والقيود الأخرى).

    +

    عند إدراج كيان في مجموعة، لا يمكن إضافة الكيان المراد إدراجه بنجاح إلا إذا كان يحتوي على جميع الحقول المحددة في المخطط. سيدخل الكيان الذي تم إدراجه في قسم يسمى _افتراضي في ترتيب الإدراج. شريطة وجود قسم معين، يمكنك أيضًا إدراج كيانات في هذا القسم من خلال تحديد اسم القسم في طلب الإدراج.

    +

    يدعم Milvus أيضًا الحقول الديناميكية للحفاظ على قابلية التوسع في المجموعة. عندما يتم تمكين الحقل الديناميكي، يمكنك إدراج الحقول التي لم يتم تعريفها في المخطط في المجموعة. سيتم تخزين هذه الحقول والقيم كأزواج مفاتيح-قيم في حقل محجوز باسم $meta. لمزيد من المعلومات حول الحقول الديناميكية، يرجى الرجوع إلى الحقل الديناميكي.

    +

    إدراج الكيانات في مجموعة

    قبل إدراج البيانات، تحتاج إلى تنظيم بياناتك في قائمة من القواميس وفقًا للمخطط، بحيث يمثل كل قاموس كيانًا ويحتوي على جميع الحقول المحددة في المخطط. إذا تم تمكين الحقل الديناميكي في المجموعة، يمكن أن يتضمن كل قاموس أيضًا الحقول غير المحددة في المخطط.

    +

    في هذا القسم، ستقوم بإدراج الكيانات في مجموعة تم إنشاؤها بطريقة الإعداد السريع. تحتوي المجموعة التي تم إنشاؤها بهذه الطريقة على حقلين فقط، وهما المعرف والمتجه. بالإضافة إلى ذلك، تحتوي هذه المجموعة على حقل ديناميكي ممكّن، لذا فإن الكيانات في شيفرة المثال تتضمن حقلاً يسمى **اللون ** غير معرف في المخطط.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    إدراج كيانات في قسم

    يمكنك أيضًا إدراج كيانات في قسم محدد. تفترض مقتطفات التعليمات البرمجية التالية أن لديك قسمًا باسم PartitionA في مجموعتك.

    + +
    data=[​
    +    {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    partition_name="partitionA",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_name: "partitionA",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             10,​
    +#             11,​
    +#             12,​
    +#             13,​
    +#             14,​
    +#             15,​
    +#             16,​
    +#             17,​
    +#             18,​
    +#             19​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.json b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.json new file mode 100644 index 000000000..7956b814c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"},​\n {\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"},​\n {\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"},​\n {\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"},​\n {\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"},​\n {\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"},​\n {\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"},​\n {\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"},​\n {\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"},​\n {\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}​\n]​\n​\nres = client.upsert(​\n collection_name='quick_setup',​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \\\"color\\\": \\\"black_9898\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \\\"color\\\": \\\"red_7319\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \\\"color\\\": \\\"white_6465\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \\\"color\\\": \\\"orange_7580\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \\\"color\\\": \\\"red_3314\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \\\"color\\\": \\\"black_9955\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \\\"color\\\": \\\"yellow_2461\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \\\"color\\\": \\\"white_5015\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \\\"color\\\": \\\"purple_6414\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \\\"color\\\": \\\"brown_7231\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\ndata = [​\n {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: \"black_9898\"},​\n {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: \"red_7319\"},​\n {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: \"white_6465\"},​\n {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: \"orange_7580\"},​\n {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: \"red_3314\"},​\n {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: \"black_9955\"},​\n {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: \"yellow_2461\"},​\n {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: \"white_5015\"},​\n {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: \"purple_6414\"},​\n {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: \"brown_7231\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n]​\n​\nres = client.upsert(​\n collection_name=\"quick_setup\",​\n data=data,​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \\\"color\\\": \\\"black_3651\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \\\"color\\\": \\\"grey_2049\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \\\"color\\\": \\\"blue_6168\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \\\"color\\\": \\\"blue_1672\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \\\"color\\\": \\\"pink_1601\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \\\"color\\\": \\\"yellow_9925\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \\\"color\\\": \\\"orange_9872\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \\\"color\\\": \\\"red_6450\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \\\"color\\\": \\\"purple_7392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \\\"color\\\": \\\"pink_4996\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 6. Upsert data in partitions​\ndata = [​\n {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: \"black_3651\"},​\n {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: \"grey_2049\"},​\n {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: \"blue_6168\"},​\n {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: \"blue_1672\"},​\n {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: \"pink_1601\"},​\n {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: \"yellow_9925\"},​\n {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: \"orange_9872\"},​\n {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: \"red_6450\"},​\n {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: \"purple_7392\"},​\n {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: \"pink_4996\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Upsert Entities​","anchorList":[{"label":"كيانات Upsert","href":"Upsert-Entities​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"رفع الكيانات في مجموعة","href":"Upsert-Entity-in-a-Collection​","type":2,"isActive":false},{"label":"إدراج الكيانات في قسم","href":"Upsert-Entities-in-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.md b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.md new file mode 100644 index 000000000..5abde156a --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/insert-and-delete/upsert-entities.md @@ -0,0 +1,360 @@ +--- +id: upsert-entities.md +title: كيانات Upsert +--- +

    كيانات Upsert

    تجمع عملية Upsert بين إجراءات تحديث وإدراج البيانات. يحدد ميلفوس ما إذا كان سيتم إجراء عملية تحديث أو إدراج عن طريق التحقق من وجود المفتاح الأساسي. سيقدم هذا القسم كيفية إدراج كيان والسلوكيات المحددة لعملية Upsert في سيناريوهات مختلفة.

    +

    نظرة عامة

    عندما تحتاج إلى تحديث كيان في مجموعة أو عندما لا تكون متأكدًا مما إذا كنت تريد التحديث أو الإدراج، يمكنك محاولة استخدام عملية Upsert. عند استخدام هذه العملية، من الضروري التأكد من أن الكيان المضمن في طلب Upsert يحتوي على المفتاح الأساسي؛ وإلا سيحدث خطأ. عند تلقي طلب Upsert، سيقوم ميلفوس بتنفيذ العملية التالية.

    +
      +
    1. التحقق مما إذا كان الحقل الأساسي للمجموعة يحتوي على معرف تلقائي ممكّن.

      +

      a. إذا كان كذلك، فسيقوم Milvus باستبدال المفتاح الأساسي في الكيان بمفتاح أساسي تم إنشاؤه تلقائيًا وإدراج البيانات.

      +

      b. إذا لم يكن كذلك، سيستخدم Milvus المفتاح الأساسي الذي يحمله الكيان لإدراج البيانات.

    2. +
    3. ج. تنفيذ عملية حذف استناداً إلى قيمة المفتاح الأساسي للكيان المضمن في طلب Upsert.

    4. +
    +

    + + Upsert Entities + كيانات Upsert Upsert

    +

    رفع الكيانات في مجموعة

    في هذا القسم، ستقوم في هذا القسم بإدراج الكيانات في مجموعة تم إنشاؤها بطريقة الإعداد السريع. تحتوي المجموعة التي تم إنشاؤها بهذه الطريقة على حقلين فقط، وهما المعرف والمتجه. بالإضافة إلى ذلك، تحتوي هذه المجموعة على حقل ديناميكي ممكّن، لذا فإن الكيانات في شيفرة المثال تتضمن حقلاً يسمى اللون غير معرف في المخطط.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_9898"},​
    +    {"id": 1, "vector": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], "color": "red_7319"},​
    +    {"id": 2, "vector": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], "color": "white_6465"},​
    +    {"id": 3, "vector": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], "color": "orange_7580"},​
    +    {"id": 4, "vector": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], "color": "red_3314"},​
    +    {"id": 5, "vector": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], "color": "black_9955"},​
    +    {"id": 6, "vector": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], "color": "yellow_2461"},​
    +    {"id": 7, "vector": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], "color": "white_5015"},​
    +    {"id": 8, "vector": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], "color": "purple_6414"},​
    +    {"id": 9, "vector": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], "color": "brown_7231"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name='quick_setup',​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +data = [​
    +    {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: "black_9898"},​
    +    {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: "red_7319"},​
    +    {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: "white_6465"},​
    +    {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: "orange_7580"},​
    +    {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: "red_3314"},​
    +    {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: "black_9955"},​
    +    {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: "yellow_2461"},​
    +    {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: "white_5015"},​
    +    {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: "purple_6414"},​
    +    {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: "brown_7231"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    إدراج الكيانات في قسم

    يمكنك أيضًا إدراج كيانات في قسم محدد. تفترض مقتطفات التعليمات البرمجية التالية أن لديك قسمًا باسم PartitionA في مجموعتك.

    + +
    data=[​
    +    {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +    {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +    {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +    {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +    {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +    {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +    {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +    {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +    {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +    {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name="quick_setup",​
    +    data=data,​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 6. Upsert data in partitions​
    +data = [​
    +    {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: "black_3651"},​
    +    {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: "grey_2049"},​
    +    {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: "blue_6168"},​
    +    {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: "blue_1672"},​
    +    {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: "pink_1601"},​
    +    {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: "yellow_9925"},​
    +    {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: "orange_9872"},​
    +    {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: "red_6450"},​
    +    {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: "purple_7392"},​
    +    {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: "pink_4996"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +        {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +        {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +        {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +        {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +        {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +        {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +        {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +        {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +        {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.json b/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.json new file mode 100644 index 000000000..3a3ec9166 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nindex_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​\nindex_params.add_index(​\n field_name=\"category\", # Name of the scalar field to be indexed​\n index_type=\"BITMAP\", # Type of index to be created​\n index_name=\"category_bitmap_index\" # Name of the index to be created​\n)​\n​\nclient.create_index(​\n collection_name=\"my_collection\", # Specify the collection name​\n index_params=index_params​\n)​\n\n"],"headingContent":"BITMAP​","anchorList":[{"label":"BITMAP","href":"BITMAP​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"إنشاء فهرس نقطي","href":"Create-a-bitmap-index","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.md b/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.md new file mode 100644 index 000000000..58b0b3cad --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/bitmap.md @@ -0,0 +1,124 @@ +--- +id: bitmap.md +title: BITMAP +related_key: bitmap +summary: >- + فهرسة الصور النقطية هي تقنية فهرسة فعالة مصممة لتحسين أداء الاستعلام على + الحقول العددية منخفضة الكمية. +--- +

    BITMAP

    فهرسة الصور النقطية هي تقنية فهرسة فعالة مصممة لتحسين أداء الاستعلام على الحقول ذات العددية المنخفضة. تشير الكاردينالية إلى عدد القيم المميزة في الحقل. تعتبر الحقول التي تحتوي على عدد أقل من العناصر المميزة منخفضة الكاردينالية.

    +

    يساعد هذا النوع من الفهرس على تقليل وقت استرجاع الاستعلامات العددية من خلال تمثيل قيم الحقل بتنسيق ثنائي مضغوط وإجراء عمليات فعالة على هذه القيم. وبالمقارنة مع الأنواع الأخرى من الفهارس، عادةً ما تتمتع الفهارس النقطية بكفاءة مساحة أعلى وسرعات استعلام أسرع عند التعامل مع الحقول ذات البطاقات المنخفضة.

    +

    نظرة عامة

    يجمع مصطلح الصورة النقطية بين كلمتين: بت وخريطة. يمثل البت أصغر وحدة بيانات في الكمبيوتر، والتي يمكن أن تحتوي فقط على قيمة 0 أو 1. تشير الخريطة، في هذا السياق، إلى عملية تحويل البيانات وتنظيمها وفقًا للقيمة التي يجب تعيينها لـ 0 و1.

    +

    يتكون فهرس الصورة النقطية من مكونين رئيسيين: الخرائط النقطية والمفاتيح. تمثل المفاتيح القيم الفريدة في الحقل المفهرس. لكل قيمة فريدة، هناك صورة نقطية مقابلة لها. طول هذه الصور النقطية يساوي عدد السجلات في المجموعة. يتوافق كل بت في الصورة النقطية مع سجل في المجموعة. إذا كانت قيمة الحقل المفهرس في السجل تتطابق مع المفتاح، يتم تعيين البت المقابل إلى وإلا يتم تعيينه إلى 0.

    +

    انظر إلى مجموعة من المستندات التي تحتوي على حقلي الفئة والعام. نريد استرداد المستندات التي تندرج ضمن الفئة التقنية والمفتوحة للجمهور. في هذه الحالة، تكون مفاتيح فهارس الصور النقطية لدينا هي التقنية والعامة.

    +

    + + Bitmap indexing + فهرسة الصور النقطية

    +

    كما هو موضح في الشكل، فهارس الصور النقطية للفئة والعام هي

    +
      +
    • تقني: [1، 0، 0، 1، 0، 0]، مما يدل على أن المستندين الأول والثالث فقط يقعان في الفئة التقنية.

    • +
    • عام: [1، 0، 0، 0، 1، 0]، وهو ما يوضح أن المستندين الأول والرابع فقط متاحان للعامة.

    • +
    +

    للعثور على المستندات التي تطابق كلا المعيارين، نقوم بإجراء عملية توافق بت على هاتين الخريطتين النقطيتين.

    +
      +
    • تقني وعام: [1, 0, 0, 0, 0]
    • +
    +

    تشير الصورة النقطية الناتجة [1، 0، 0، 0، 0، 0] إلى أن المستند الأول فقط(المعرف 1) يستوفي كلا المعيارين. باستخدام الفهارس النقطية والعمليات النقطية الفعالة، يمكننا تضييق نطاق البحث بسرعة، مما يلغي الحاجة إلى مسح مجموعة البيانات بأكملها.

    +

    إنشاء فهرس نقطي

    لإنشاء فهرس صورة نقطية في ميلفوس، استخدم الطريقة create_index() وقم بتعيين المعلمة index_type إلى "BITMAP".

    +
    from pymilvus import MilvusClient​
    +​
    +index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​
    +index_params.add_index(​
    +    field_name="category", # Name of the scalar field to be indexed​
    +    index_type="BITMAP", # Type of index to be created​
    +    index_name="category_bitmap_index" # Name of the index to be created​
    +)​
    +​
    +client.create_index(​
    +    collection_name="my_collection", # Specify the collection name​
    +    index_params=index_params​
    +)​
    +
    +
    +

    في هذا المثال، نقوم في هذا المثال بإنشاء فهرس صورة نقطية على الحقل category في المجموعة my_collection. يُستخدم الأسلوب add_index() لتحديد اسم الحقل ونوع الفهرس واسم الفهرس.

    +

    بمجرد إنشاء فهرس الصورة النقطية، يمكنك استخدام المعلمة filter في عمليات الاستعلام لإجراء تصفية عددية استنادًا إلى الحقل المفهرس. يتيح لك ذلك تضييق نطاق نتائج البحث بكفاءة باستخدام الفهرس النقطي. لمزيد من المعلومات، راجع تصفية البيانات الوصفية.

    +

    الحدود

      +
    • الفهارس النقطية مدعومة فقط للحقول القياسية التي ليست مفاتيح أساسية.

    • +
    • يجب أن يكون نوع بيانات الحقل أحد ما يلي.

      +
        +
      • BOOL، INT8 ، INT16 ، ، INT32 ، INT64 ، VARCHAR

      • +
      • ARRAY (يجب أن تكون العناصر واحدة من: BOOL ، INT8 ، ، INT16 ، INT32 ، INT64 ، VARCHAR)

      • +
    • +
    • لا تدعم فهارس الصور النقطية أنواع البيانات التالية.

      +
        +
      • FLOAT، DOUBLE: أنواع الفاصلة العائمة غير متوافقة مع الطبيعة الثنائية لفهارس الصور النقطية.

      • +
      • JSON: أنواع بيانات JSON لها بنية معقدة لا يمكن تمثيلها بكفاءة باستخدام فهارس الصور النقطية.

      • +
    • +
    • فهارس الصور النقطية غير مناسبة للحقول ذات الكمية الكبيرة (أي الحقول التي تحتوي على عدد كبير من القيم المميزة).

      +
        +
      • كمبدأ توجيهي عام، تكون فهارس الصور النقطية أكثر فعالية عندما تكون قيمة الحقل أقل من 500.

      • +
      • عندما تزيد الكاردينالية عن هذا الحد، تتضاءل مزايا أداء الفهارس النقطية، وتصبح نفقات التخزين الزائدة كبيرة.

      • +
      • بالنسبة للحقول ذات الكاردينالية العالية، فكر في استخدام تقنيات فهرسة بديلة مثل الفهارس المقلوبة، اعتمادًا على حالة الاستخدام المحددة ومتطلبات الاستعلام.

      • +
    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.json b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.json new file mode 100644 index 000000000..241bcac62 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.json @@ -0,0 +1 @@ +{"codeList":["# Auto indexing\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\nindex_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters\n\nindex_params.add_index(\n field_name=\"scalar_1\", # Name of the scalar field to be indexed\n index_type=\"\", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n index_name=\"default_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"default_index\") // Name of the index to be created\n .indexType(\"\") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"default_index\", // Name of the index to be created\n index_type: \"\" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n})\n","index_params = MilvusClient.prepare_index_params() # Prepare an IndexParams object\n\nindex_params.add_index(\n field_name=\"scalar_2\", # Name of the scalar field to be indexed\n index_type=\"INVERTED\", # Type of index to be created\n index_name=\"inverted_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"inverted_index\") // Name of the index to be created\n .indexType(\"INVERTED\") // Type of index to be created\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"inverted_index\", // Name of the index to be created\n index_type: \"INVERTED\" // Type of index to be created\n})\n","client.list_indexes(\n collection_name=\"test_scalar_index\" # Specify the collection name\n)\n\n# Output:\n# ['default_index','inverted_index']\n","import java.util.List;\nimport io.milvus.v2.service.index.request.ListIndexesReq;\n\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ]\n","res = await client.listIndexes({\n collection_name: 'test_scalar_index'\n})\n\nconsole.log(res.indexes)\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ] \n"],"headingContent":"Index Scalar Fields","anchorList":[{"label":"فهرس الحقول العددية","href":"Index-Scalar-Fields","type":1,"isActive":false},{"label":"أنواع الفهرسة العددية","href":"Types-of-scalar-indexing","type":2,"isActive":false},{"label":"الفهرسة التلقائية","href":"Auto-indexing","type":2,"isActive":false},{"label":"فهرسة مخصصة","href":"Custom-indexing","type":2,"isActive":false},{"label":"التحقق من النتيجة","href":"Verifying-the-result","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.md b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.md new file mode 100644 index 000000000..5a7f5fac2 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-scalar-fields.md @@ -0,0 +1,326 @@ +--- +id: index-scalar-fields.md +order: 2 +summary: >- + سيرشدك هذا الدليل إلى كيفية إنشاء وتكوين الفهارس العددية للحقول مثل الأعداد + الصحيحة والسلاسل وما إلى ذلك. +title: فهرس الحقول العددية +--- +

    فهرس الحقول العددية

    في Milvus، يتم استخدام الفهرس العددي لتسريع التصفية الوصفية حسب قيمة حقل معين غير متجه، على غرار فهرس قاعدة البيانات التقليدية. سيرشدك هذا الدليل إلى كيفية إنشاء وتكوين الفهارس العددية للحقول مثل الأعداد الصحيحة والسلاسل وغيرها.

    +

    أنواع الفهرسة العددية

      +
    • الفهرسة التلقائية: يقرر Milvus تلقائيًا نوع الفهرس بناءً على نوع بيانات الحقل القياسي. وهذا مناسب عندما لا تحتاج إلى التحكم في نوع الفهرس المحدد.

    • +
    • الفهرسة المخصصة: يمكنك تحديد نوع الفهرس الدقيق، مثل الفهرس المقلوب أو الفهرس النقطي. يوفر هذا المزيد من التحكم في تحديد نوع الفهرس.

    • +
    +

    الفهرسة التلقائية

    +

    لاستخدام الفهرسة التلقائية، احذف معلمة نوع الفهرسة في add_index()بحيث يمكن ل Milvus استنتاج نوع الفهرس بناءً على نوع الحقل القياسي.

    +
    +
    +

    لاستخدام الفهرسة التلقائية، احذف معلمة نوع الفهرس في IndexParamبحيث يمكن ل Milvus استنتاج نوع الفهرس بناءً على نوع الحقل القياسي.

    +
    +
    +

    لاستخدام الفهرسة التلقائية، احذف معلمة نوع الفهرس في createIndex()بحيث يمكن ل Milvus استنتاج نوع الفهرس بناءً على نوع الحقل القياسي.

    +
    +

    للاطلاع على التعيينات بين أنواع البيانات العددية وخوارزميات الفهرسة الافتراضية، راجع خوارزميات فهرسة الحقل العددي.

    + +
    # Auto indexing
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +index_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
    +
    +index_params.add_index(
    +    field_name="scalar_1", # Name of the scalar field to be indexed
    +    index_type="", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    index_name="default_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("default_index") // Name of the index to be created
    +    .indexType("") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "default_index", // Name of the index to be created
    +    index_type: "" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +})
    +
    +

    فهرسة مخصصة

    +

    لاستخدام الفهرسة المخصصة، حدد نوع فهرسة معين باستخدام معلمة index_type في add_index().

    +
    +
    +

    لاستخدام الفهرسة المخصصة، حدد نوع فهرسة معين باستخدام معلمة indexType في . IndexParam.

    +
    +
    +

    لاستخدام الفهرسة المخصصة، حدد نوع فهرسة معين باستخدام المعلمة index_type في . createIndex().

    +
    +

    ينشئ المثال أدناه فهرسًا مقلوبًا للحقل القياسي scalar_2.

    + +
    index_params = MilvusClient.prepare_index_params() #  Prepare an IndexParams object
    +
    +index_params.add_index(
    +    field_name="scalar_2", # Name of the scalar field to be indexed
    +    index_type="INVERTED", # Type of index to be created
    +    index_name="inverted_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("inverted_index") // Name of the index to be created
    +    .indexType("INVERTED") // Type of index to be created
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "inverted_index", // Name of the index to be created
    +    index_type: "INVERTED" // Type of index to be created
    +})
    +
    +
    +

    الطرق والمعلمات

    +
      +
    • إعداد_المفهرس_بارامز()

      +

      يقوم بإعداد كائن IndexParams.

    • +
    • إضافة_الفهرس()

      +

      يضيف تكوينات الفهرس إلى كائن IndexParams.

      +
        +
      • اسم_الحقل(سلسلة)

        +

        اسم الحقل القياسي المراد فهرسته.

      • +
      • نوع_الفهرس(سلسلة):

        +

        نوع الفهرس القياسي المراد إنشاؤه. للفهرسة الضمنية، اتركها فارغة أو احذف هذه المعلمة.

        +

        للفهرسة المخصصة، القيم الصالحة هي:

        +
          +
        • INVERTED: (موصى به) يتكون الفهرس المقلوب من قاموس مصطلحات يحتوي على جميع الكلمات الرمزية مرتبة أبجديًا. لمزيد من التفاصيل، راجع الفهرس المقلوب.

        • +
        • STL_SORT: يفرز الحقول العددية باستخدام خوارزمية فرز مكتبة القالب القياسية. يدعم فقط الحقول الرقمية (مثل INT8 و INT16 و INT32 و INT64 و FLOAT و DOUBLE).

        • +
        • تري: بنية بيانات شجرية لعمليات البحث والاسترجاع السريع للبادئة. يدعم حقول VARCHAR.

        • +
      • +
      • اسم_الفهرس(سلسلة)

        +

        اسم الفهرس القياسي المراد إنشاؤه. يدعم كل حقل قياسي فهرسًا واحدًا.

      • +
    • +
    • إنشاء_فهرس()

      +

      إنشاء الفهرس في المجموعة المحددة.

      +
        +
      • اسم_المجموعة(سلسلة)

        +

        اسم المجموعة التي يتم إنشاء الفهرس لها.

      • +
      • index_params

        +

        كائن IndexParams الذي يحتوي على تكوينات الفهرس.

      • +
    • +
    +
    +
    +

    الأساليب والمعلمات

    +
      +
    • إعداد كائن IndexParamإعداد كائن IndexParam.
        +
      • اسم الحقل(سلسلة) اسم الحقل القياسي المراد فهرسته.
      • +
      • اسم الفهرس(سلسلة) اسم الفهرس القياسي المراد إنشاؤه. يدعم كل حقل قياسي فهرس واحد.
      • +
      • نوع الفهرس(سلسلة) نوع الفهرس القياسي المراد إنشاؤه. للفهرسة الضمنية، اتركها فارغة أو احذف هذه المعلمة. للفهرسة المخصصة، القيم الصالحة هي
          +
        • INVERTED: (موصى به) يتكون الفهرس المقلوب من قاموس مصطلحات يحتوي على جميع الكلمات الرمزية مرتبة أبجديًا. لمزيد من التفاصيل، راجع الفهرس المقلوب.
        • +
        • STL_SORT: يفرز الحقول العددية باستخدام خوارزمية فرز مكتبة القالب القياسية. يدعم الحقول المنطقية والرقمية (مثل INT8 و INT16 و INT32 و INT64 و FLOAT و DOUBLE).
        • +
        • تري: بنية بيانات شجرية لعمليات البحث والاسترجاع السريع للبادئة. يدعم حقول VARCHAR.
        • +
      • +
    • +
    • CreateIndexReq إنشاءفهرس في المجموعة المحددة.
        +
      • اسم المجموعة(سلسلة) اسم المجموعة التي يتم إنشاء الفهرس لها.
      • +
      • indexParams(قائمة) قائمة بكائنات IndexParam التي تحتوي على تكوينات الفهرس.
      • +
    • +
    +
    +
    +

    الأساليب والمعلمات

    +
      +
    • إنشاء فهرس

      +

      إنشاء الفهرس في المجموعة المحددة.

      +
        +
      • اسم_المجموعة(سلسلة) اسم المجموعة التي يتم إنشاء الفهرس لها.
      • +
      • اسم_الحقل(سلسلة) اسم الحقل القياسي المراد فهرسته.
      • +
      • اسم_الفهرس(سلسلة) اسم الفهرس القياسي المراد إنشاؤه. يدعم كل حقل قياسي فهرس واحد.
      • +
      • نوع_الفهرس(سلسلة) نوع الفهرس القياسي المراد إنشاؤه. للفهرسة الضمنية، اتركها فارغة أو احذف هذه المعلمة. للفهرسة المخصصة، القيم الصالحة هي
          +
        • INVERTED: (موصى به) يتكون الفهرس المقلوب من قاموس مصطلحات يحتوي على جميع الكلمات الرمزية مرتبة أبجديًا. لمزيد من التفاصيل، راجع الفهرس المقلوب.
        • +
        • STL_SORT: يفرز الحقول العددية باستخدام خوارزمية فرز مكتبة القالب القياسية. يدعم الحقول المنطقية والرقمية (مثل INT8 و INT16 و INT32 و INT64 و FLOAT و DOUBLE).
        • +
        • تري: بنية بيانات شجرية لعمليات البحث والاسترجاع السريع للبادئة. يدعم حقول VARCHAR.
        • +
      • +
    • +
    +
    +

    التحقق من النتيجة

    +

    استخدم طريقة list_indexes() للتحقق من إنشاء الفهارس العددية:

    +
    +
    +

    استخدم الطريقة listIndexes() للتحقق من إنشاء الفهارس العددية:

    +
    +
    +

    استخدم الأسلوب listIndexes() للتحقق من إنشاء الفهارس العددية:

    +
    + +
    client.list_indexes(
    +    collection_name="test_scalar_index"  # Specify the collection name
    +)
    +
    +# Output:
    +# ['default_index','inverted_index']
    +
    +
    import java.util.List;
    +import io.milvus.v2.service.index.request.ListIndexesReq;
    +
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("test_scalar_index")  // Specify the collection name
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]
    +
    +
    res = await client.listIndexes({
    +    collection_name: 'test_scalar_index'
    +})
    +
    +console.log(res.indexes)
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]   
    +
    +

    الحدود

      +
    • تدعم الفهرسة العددية حاليًا أنواع البيانات INT8 و INT16 و INT32 و INT64 و FLOAT و DOUBLE و BOOL و VARCHAR و ARRAY، ولكن ليس نوع بيانات JSON.
    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.json b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.json new file mode 100644 index 000000000..9f5ec5512 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# 1. Set up a Milvus client\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\n# 2. Create schema\n# 2.1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True,\n)\n\n# 2.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)\n\n# 3. Create collection\nclient.create_collection(\n collection_name=\"customized_setup\", \n schema=schema, \n)\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";\n\n// 1. Connect to Milvus server\nConnectConfig connectConfig = ConnectConfig.builder()\n .uri(CLUSTER_ENDPOINT)\n .build();\n\nMilvusClientV2 client = new MilvusClientV2(connectConfig);\n\n// 2. Create a collection\n\n// 2.1 Create schema\nCreateCollectionReq.CollectionSchema schema = client.createSchema();\n\n// 2.2 Add fields to schema\nschema.addField(AddFieldReq.builder().fieldName(\"id\").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());\nschema.addField(AddFieldReq.builder().fieldName(\"vector\").dataType(DataType.FloatVector).dimension(5).build());\n\n// 3 Create a collection without schema and index parameters\nCreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()\n.collectionName(\"customized_setup\")\n.collectionSchema(schema)\n.build();\n\nclient.createCollection(customizedSetupReq);\n","// 1. Set up a Milvus Client\nclient = new MilvusClient({address, token});\n\n// 2. Define fields for the collection\nconst fields = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n autoID: false\n },\n {\n name: \"vector\",\n data_type: DataType.FloatVector,\n dim: 5\n },\n]\n\n// 3. Create a collection\nres = await client.createCollection({\n collection_name: \"customized_setup\",\n fields: fields,\n})\n\nconsole.log(res.error_code) \n\n// Output\n// \n// Success\n// \n","# 4.1. Set up the index parameters\nindex_params = MilvusClient.prepare_index_params()\n\n# 4.2. Add an index on the vector field.\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"IVF_FLAT\",\n index_name=\"vector_index\",\n params={ \"nlist\": 128 }\n)\n\n# 4.3. Create an index file\nclient.create_index(\n collection_name=\"customized_setup\",\n index_params=index_params,\n sync=False # Whether to wait for index creation to complete before returning. Defaults to True.\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\n// 4 Prepare index parameters\n\n// 4.2 Add an index for the vector field \"vector\"\nIndexParam indexParamForVectorField = IndexParam.builder()\n .fieldName(\"vector\")\n .indexName(\"vector_index\")\n .indexType(IndexParam.IndexType.IVF_FLAT)\n .metricType(IndexParam.MetricType.COSINE)\n .extraParams(Map.of(\"nlist\", 128))\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\n// 4.3 Crate an index file\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","// 4. Set up index for the collection\n// 4.1. Set up the index parameters\nres = await client.createIndex({\n collection_name: \"customized_setup\",\n field_name: \"vector\",\n index_type: \"AUTOINDEX\",\n metric_type: \"COSINE\", \n index_name: \"vector_index\",\n params: { \"nlist\": 128 }\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n","# 5. Describe index\nres = client.list_indexes(\n collection_name=\"customized_setup\"\n)\n\nprint(res)\n\n# Output\n#\n# [\n# \"vector_index\",\n# ]\n\nres = client.describe_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n\nprint(res)\n\n# Output\n#\n# {\n# \"index_type\": ,\n# \"metric_type\": \"COSINE\",\n# \"field_name\": \"vector\",\n# \"index_name\": \"vector_index\"\n# }\n","import io.milvus.v2.service.index.request.DescribeIndexReq;\nimport io.milvus.v2.service.index.response.DescribeIndexResp;\n\n// 5. Describe index\n// 5.1 List the index names\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"customized_setup\")\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"vector_index\"\n// ]\n\n// 5.2 Describe an index\nDescribeIndexReq describeIndexReq = DescribeIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nDescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);\n\nSystem.out.println(JSONObject.toJSON(describeIndexResp));\n\n// Output:\n// {\n// \"metricType\": \"COSINE\",\n// \"indexType\": \"AUTOINDEX\",\n// \"fieldName\": \"vector\",\n// \"indexName\": \"vector_index\"\n// }\n","// 5. Describe the index\nres = await client.describeIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(JSON.stringify(res.index_descriptions, null, 2))\n\n// Output\n// \n// [\n// {\n// \"params\": [\n// {\n// \"key\": \"index_type\",\n// \"value\": \"AUTOINDEX\"\n// },\n// {\n// \"key\": \"metric_type\",\n// \"value\": \"COSINE\"\n// }\n// ],\n// \"index_name\": \"vector_index\",\n// \"indexID\": \"449007919953063141\",\n// \"field_name\": \"vector\",\n// \"indexed_rows\": \"0\",\n// \"total_rows\": \"0\",\n// \"state\": \"Finished\",\n// \"index_state_fail_reason\": \"\",\n// \"pending_index_rows\": \"0\"\n// }\n// ]\n// \n","# 6. Drop index\nclient.drop_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n","// 6. Drop index\n\nDropIndexReq dropIndexReq = DropIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nclient.dropIndex(dropIndexReq);\n","// 6. Drop the index\nres = await client.dropIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n"],"headingContent":"Index Vector Fields","anchorList":[{"label":"فهرسة الحقول المتجهة","href":"Index-Vector-Fields","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"الإعدادات","href":"Preparations","type":2,"isActive":false},{"label":"فهرسة مجموعة","href":"Index-a-Collection","type":2,"isActive":false},{"label":"التحقق من تفاصيل الفهرس","href":"Check-Index-Details","type":2,"isActive":false},{"label":"إسقاط فهرس","href":"Drop-an-Index","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.md b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.md new file mode 100644 index 000000000..9e994a7be --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-vector-fields.md @@ -0,0 +1,593 @@ +--- +id: index-vector-fields.md +order: 1 +summary: >- + يرشدك هذا الدليل إلى العمليات الأساسية لإنشاء الفهارس وإدارتها على الحقول + المتجهة في مجموعة. +title: فهرسة الحقول المتجهة +--- +

    فهرسة الحقول المتجهة

    يرشدك هذا الدليل إلى العمليات الأساسية لإنشاء الفهارس وإدارتها على الحقول المتجهة في مجموعة.

    +

    نظرة عامة

    من خلال الاستفادة من البيانات الوصفية المخزنة في ملف الفهرس، ينظم Milvus بياناتك في بنية متخصصة، مما يسهل الاسترجاع السريع للمعلومات المطلوبة أثناء عمليات البحث أو الاستعلامات.

    +

    يوفر Milvus العديد من أنواع الفهارس والمقاييس لفرز قيم الحقول لإجراء عمليات بحث فعالة للتشابه. يسرد الجدول التالي أنواع الفهارس والمقاييس المدعومة لأنواع الحقول المتجهة المختلفة. يدعم Milvus حاليًا أنواعًا مختلفة من بيانات المتجهات، بما في ذلك التضمينات ذات النقطة العائمة (المعروفة غالبًا باسم متجهات النقطة العائمة أو المتجهات الكثيفة)، والتضمينات الثنائية (المعروفة أيضًا باسم المتجهات الثنائية)، والتضمينات المتفرقة (المعروفة أيضًا باسم المتجهات المتفرقة). لمزيد من التفاصيل، راجع الفهرس داخل الذاكرة ومقاييس التشابه.

    + +
    + + + + + + + + + + + + + +
    أنواع المقاييسأنواع الفهرس
    • المسافة الإقليدية (L2)
    • الضرب الداخلي (IP)
    • تشابه جيب التمام (COSINE)
    • مسطح
    • IVF_FLAT
    • IVF_SQ8
    • IVF_PQ
    • GPU_IVF_FLAT
    • GPU_IVF_PQ
    • HNSW
    • DISKANN
    +
    +
    + + + + + + + + + + + + + +
    أنواع المقاييسأنواع الفهرس
    • جاكارد (JACCARD)
    • هامينغ (HAMMING)
    • BIN_FLAT
    • BIN_IVF_FLAT
    +
    +
    + + + + + + + + + + + + + +
    الأنواع المتريةأنواع الفهرس
    IP
    • الفهرس_المتفرق_المقلوب_الفهرس
    • SPARSE_WAND
    +
    +

    يوصى بإنشاء فهارس لكل من الحقل المتجه والحقول القياسية التي يتم الوصول إليها بشكل متكرر.

    +

    الإعدادات

    كما هو موضح في إدارة المجموعات، يقوم ميلفوس تلقائيًا بإنشاء فهرس وتحميله في الذاكرة عند إنشاء مجموعة إذا تم تحديد أي من الشروط التالية في طلب إنشاء المجموعة

    +
      +
    • بُعد الحقل المتجه ونوع المقياس، أو

    • +
    • المخطط ومعلمات الفهرس.

    • +
    +

    يقوم مقتطف التعليمات البرمجية أدناه بإعادة استخدام التعليمات البرمجية الحالية لإنشاء اتصال بمثيل Milvus وإنشاء مجموعة دون تحديد معلمات الفهرس الخاصة بها. في هذه الحالة، تفتقر المجموعة إلى فهرس وتبقى غير محملة.

    +
    +

    للتحضير للفهرسة، استخدم MilvusClient للاتصال بخادم Milvus وإنشاء مجموعة باستخدام create_schema(), add_field()و create_collection().

    +
    +
    +

    للتحضير للفهرسة، استخدم MilvusClientV2 للاتصال بخادم ميلفوس وإعداد مجموعة باستخدام createSchema(), addField()و createCollection().

    +
    +
    +

    للتحضير للفهرسة، استخدم MilvusClient للاتصال بخادم ميلفوس وإعداد مجموعة باستخدام createCollection().

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# 1. Set up a Milvus client
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +# 2. Create schema
    +# 2.1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True,
    +)
    +
    +# 2.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
    +
    +# 3. Create collection
    +client.create_collection(
    +    collection_name="customized_setup", 
    +    schema=schema, 
    +)
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +String CLUSTER_ENDPOINT = "http://localhost:19530";
    +
    +// 1. Connect to Milvus server
    +ConnectConfig connectConfig = ConnectConfig.builder()
    +    .uri(CLUSTER_ENDPOINT)
    +    .build();
    +
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);
    +
    +// 2. Create a collection
    +
    +// 2.1 Create schema
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();
    +
    +// 2.2 Add fields to schema
    +schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
    +schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());
    +
    +// 3 Create a collection without schema and index parameters
    +CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
    +.collectionName("customized_setup")
    +.collectionSchema(schema)
    +.build();
    +
    +client.createCollection(customizedSetupReq);
    +
    +
    // 1. Set up a Milvus Client
    +client = new MilvusClient({address, token});
    +
    +// 2. Define fields for the collection
    +const fields = [
    +    {
    +        name: "id",
    +        data_type: DataType.Int64,
    +        is_primary_key: true,
    +        autoID: false
    +    },
    +    {
    +        name: "vector",
    +        data_type: DataType.FloatVector,
    +        dim: 5
    +    },
    +]
    +
    +// 3. Create a collection
    +res = await client.createCollection({
    +    collection_name: "customized_setup",
    +    fields: fields,
    +})
    +
    +console.log(res.error_code)  
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    +

    فهرسة مجموعة

    +

    لإنشاء فهرس لمجموعة أو فهرسة مجموعة، استخدم . prepare_index_params() لإعداد معلمات الفهرس و create_index() لإنشاء الفهرس.

    +
    +
    +

    لإنشاء فهرس لمجموعة أو فهرسة مجموعة، استخدم IndexParam لإعداد معلمات الفهرس و createIndex() لإنشاء الفهرس.

    +
    +
    +

    لإنشاء فهرس لمجموعة أو فهرسة مجموعة، استخدم createIndex().

    +
    + +
    # 4.1. Set up the index parameters
    +index_params = MilvusClient.prepare_index_params()
    +
    +# 4.2. Add an index on the vector field.
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="IVF_FLAT",
    +    index_name="vector_index",
    +    params={ "nlist": 128 }
    +)
    +
    +# 4.3. Create an index file
    +client.create_index(
    +    collection_name="customized_setup",
    +    index_params=index_params,
    +    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +// 4 Prepare index parameters
    +
    +// 4.2 Add an index for the vector field "vector"
    +IndexParam indexParamForVectorField = IndexParam.builder()
    +    .fieldName("vector")
    +    .indexName("vector_index")
    +    .indexType(IndexParam.IndexType.IVF_FLAT)
    +    .metricType(IndexParam.MetricType.COSINE)
    +    .extraParams(Map.of("nlist", 128))
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +// 4.3 Crate an index file
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    // 4. Set up index for the collection
    +// 4.1. Set up the index parameters
    +res = await client.createIndex({
    +    collection_name: "customized_setup",
    +    field_name: "vector",
    +    index_type: "AUTOINDEX",
    +    metric_type: "COSINE",   
    +    index_name: "vector_index",
    +    params: { "nlist": 128 }
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    field_nameاسم الملف الهدف لتطبيق هذا الكائن.
    metric_typeالخوارزمية المستخدمة لقياس التشابه بين المتجهات. القيم الممكنة هي IP و L2 و COSINE و JACCARD و HAMMING. يتوفر هذا فقط عندما يكون الحقل المحدد هو حقل متجه. لمزيد من المعلومات، راجع الفهارس المدعومة في ميلفوس.
    index_typeاسم الخوارزمية المستخدمة لترتيب البيانات في الحقل المحدد. لمعرفة الخوارزميات القابلة للتطبيق، راجع الفهرس داخل الذاكرة والفهرس على القرص.
    index_nameاسم ملف الفهرس الذي تم إنشاؤه بعد تطبيق هذا الكائن.
    paramsمعلمات الضبط الدقيق لنوع الفهرس المحدد. للحصول على تفاصيل حول المفاتيح الممكنة ونطاقات القيم، راجع الفهرس داخل الذاكرة.
    collection_nameاسم مجموعة موجودة.
    index_paramsكائن IndexParams يحتوي على قائمة من كائنات IndexParam.
    syncيتحكم في كيفية بناء الفهرس فيما يتعلق بطلب العميل. قيم صالحة:
    • True (افتراضي): ينتظر العميل حتى يتم بناء الفهرس بالكامل قبل إرجاعه. هذا يعني أنك لن تحصل على استجابة حتى تكتمل العملية.
    • False: يعود العميل فور استلام الطلب ويتم إنشاء الفهرس في الخلفية. لمعرفة ما إذا كان إنشاء الفهرس قد اكتمل، استخدم طريقة describe_index().
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    fieldNameاسم الحقل المستهدف لتطبيق كائن IndexParam هذا.
    indexNameاسم ملف الفهرس الذي تم إنشاؤه بعد تطبيق هذا الكائن.
    indexTypeاسم الخوارزمية المستخدمة لترتيب البيانات في الحقل المحدد. لمعرفة الخوارزميات القابلة للتطبيق، راجع الفهرس داخل الذاكرة والفهرس على القرص.
    metricTypeمقياس المسافة المراد استخدامه للفهرس. القيم الممكنة هي IP وL2 وCOSINE وJACCARD وHAMMING.
    extraParamsمعلمات الفهرس الإضافية. لمزيد من التفاصيل، راجع الفهرس داخل الذاكرة والفهرس على القرص.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    المعلمةالوصف
    collection_nameاسم المجموعة الموجودة.
    field_nameاسم الحقل المراد إنشاء فهرس فيه.
    index_typeنوع الفهرس المراد إنشاؤه.
    metric_typeنوع المقياس المستخدم لقياس المسافة المتجهة.
    index_nameاسم الفهرس المراد إنشاؤه.
    paramsمعلمات أخرى خاصة بالفهرس.
    +
    +

    ملاحظات

    +

    يمكنك حالياً إنشاء ملف فهرس واحد فقط لكل حقل في مجموعة.

    +
    +

    التحقق من تفاصيل الفهرس

    بمجرد إنشاء فهرس، يمكنك التحقق من تفاصيله.

    +
    +

    للتحقق من تفاصيل الفهرس، استخدم list_indexes() لسرد أسماء الفهرس و describe_index() للحصول على تفاصيل الفهرس.

    +
    +
    +

    للتحقق من تفاصيل الفهرس، استخدم describeIndex() للحصول على تفاصيل الفهرس.

    +
    +
    +

    للتحقق من تفاصيل الفهرس، استخدم describeIndex() للحصول على تفاصيل الفهرس.

    +
    + +
    # 5. Describe index
    +res = client.list_indexes(
    +    collection_name="customized_setup"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# [
    +#     "vector_index",
    +# ]
    +
    +res = client.describe_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# {
    +#     "index_type": ,
    +#     "metric_type": "COSINE",
    +#     "field_name": "vector",
    +#     "index_name": "vector_index"
    +# }
    +
    +
    import io.milvus.v2.service.index.request.DescribeIndexReq;
    +import io.milvus.v2.service.index.response.DescribeIndexResp;
    +
    +// 5. Describe index
    +// 5.1 List the index names
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("customized_setup")
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "vector_index"
    +// ]
    +
    +// 5.2 Describe an index
    +DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);
    +
    +System.out.println(JSONObject.toJSON(describeIndexResp));
    +
    +// Output:
    +// {
    +//     "metricType": "COSINE",
    +//     "indexType": "AUTOINDEX",
    +//     "fieldName": "vector",
    +//     "indexName": "vector_index"
    +// }
    +
    +
    // 5. Describe the index
    +res = await client.describeIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(JSON.stringify(res.index_descriptions, null, 2))
    +
    +// Output
    +// 
    +// [
    +//   {
    +//     "params": [
    +//       {
    +//         "key": "index_type",
    +//         "value": "AUTOINDEX"
    +//       },
    +//       {
    +//         "key": "metric_type",
    +//         "value": "COSINE"
    +//       }
    +//     ],
    +//     "index_name": "vector_index",
    +//     "indexID": "449007919953063141",
    +//     "field_name": "vector",
    +//     "indexed_rows": "0",
    +//     "total_rows": "0",
    +//     "state": "Finished",
    +//     "index_state_fail_reason": "",
    +//     "pending_index_rows": "0"
    +//   }
    +// ]
    +// 
    +
    +

    يمكنك التحقق من ملف الفهرس الذي تم إنشاؤه على حقل معين، وجمع إحصائيات عدد الصفوف المفهرسة باستخدام ملف الفهرس هذا.

    +

    إسقاط فهرس

    يمكنك ببساطة إسقاط فهرس إذا لم تعد هناك حاجة إليه.

    +
    +

    قبل إسقاط فهرس، تأكد أولاً من إصداره.

    +
    +
    +

    لإسقاط فهرس، استخدم drop_index().

    +
    +
    +

    لإسقاط فهرس، استخدم . dropIndex().

    +
    +
    +

    لإسقاط فهرس، استخدم . dropIndex().

    +
    + +
    # 6. Drop index
    +client.drop_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +
    // 6. Drop index
    +
    +DropIndexReq dropIndexReq = DropIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +client.dropIndex(dropIndexReq);
    +
    +
    // 6. Drop the index
    +res = await client.dropIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.json b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.json new file mode 100644 index 000000000..9db0010b1 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.json @@ -0,0 +1 @@ +{"codeList":["gpu:\n initMemSize: 0 #set the initial memory pool size.\n maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","gpu:\n initMemSize: 2048 #set the initial memory pool size.\n maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_CAGRA\",\n \"params\": {\n 'intermediate_graph_degree': 64,\n 'graph_degree': 32\n }\n}\n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_IVF_FLAT\", # Or GPU_IVF_PQ\n \"params\": {\n \"nlist\": 1024\n }\n}\n","index_params = {\n 'index_type': 'GPU_BRUTE_FORCE',\n 'metric_type': 'L2',\n 'params': {}\n}\n","# Get an existing collection\ncollection = Collection(\"YOUR_COLLECTION_NAME\")\n\ncollection.create_index(\n field_name=\"vector\", # Name of the vector field on which an index is built\n index_params=index_params\n)\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {}\n}\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {\n \"itopk_size\": 128,\n \"search_width\": 4,\n \"min_iterations\": 0,\n \"max_iterations\": 0,\n \"team_size\": 0\n }\n}\n","search_params = {\n \"metric_type\": \"L2\", \n \"params\": {\"nprobe\": 10}\n}\n","# Load data into memory\ncollection.load()\n\ncollection.search(\n data=[[query_vector]], # Your query vector\n anns_field=\"vector\", # Name of the vector field\n param=search_params,\n limit=100 # Number of the results to return\n)\n"],"headingContent":"Index with GPU","anchorList":[{"label":"الفهرس باستخدام وحدة معالجة الرسومات","href":"Index-with-GPU","type":1,"isActive":false},{"label":"تكوين إعدادات Milvus للتحكم في ذاكرة GPU","href":"Configure-Milvus-settings-for-GPU-memory-control","type":2,"isActive":false},{"label":"إنشاء فهرس","href":"Build-an-index","type":2,"isActive":false},{"label":"بحث","href":"Search","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.md b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.md new file mode 100644 index 000000000..370a7d36c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage-indexes/index-with-gpu.md @@ -0,0 +1,231 @@ +--- +id: index-with-gpu.md +order: 3 +summary: يشرح هذا الدليل كيفية إنشاء فهرس مع دعم GPU في Milvus لتحسين أداء البحث. +title: الفهرس باستخدام وحدة معالجة الرسومات +--- +

    الفهرس باستخدام وحدة معالجة الرسومات

    يوضح هذا الدليل الخطوات اللازمة لإنشاء فهرس مع دعم GPU في Milvus، والذي يمكن أن يحسن أداء البحث بشكل كبير في سيناريوهات الإنتاجية العالية والاستدعاء العالي. للحصول على تفاصيل حول أنواع فهارس GPU التي تدعمها Milvus، راجع فهرس GPU.

    +

    تكوين إعدادات Milvus للتحكم في ذاكرة GPU

    يستخدم Milvus مخزن ذاكرة رسومات عام لتخصيص ذاكرة وحدة معالجة الرسومات.

    +

    وهو يدعم معلمتين initMemSize و maxMemSize في ملف تكوين Milvus. يتم تعيين حجم التجمع في البداية على initMemSize ، وسيتم توسيعه تلقائيًا إلى maxMemSize بعد تجاوز هذا الحد.

    +

    ويكون الافتراضي initMemSize هو 1/2 من ذاكرة وحدة معالجة الرسومات المتوفرة عند بدء تشغيل Milvus، ويكون الافتراضي maxMemSize يساوي كل ذاكرة وحدة معالجة الرسومات المتوفرة.

    +

    حتى الإصدار Milvus 2.4.1 (بما في ذلك الإصدار 2.4.1)، استخدم Milvus تجمع ذاكرة GPU موحد. بالنسبة للإصدارات السابقة للإصدار 2.4.1( بما في ذلك الإصدار 2.4.1)، كان يوصى بتعيين كلتا القيمتين إلى 0.

    +
    gpu:
    +  initMemSize: 0 #set the initial memory pool size.
    +  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    بدءًا من الإصدار Milvus 2.4.1 وما بعده، يتم استخدام مخزن ذاكرة وحدة معالجة الرسومات فقط لبيانات وحدة معالجة الرسومات المؤقتة أثناء عمليات البحث. لذلك، يوصى بتعيينها إلى 2048 و4096.

    +
    gpu:
    +  initMemSize: 2048 #set the initial memory pool size.
    +  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    إنشاء فهرس

    توضح الأمثلة التالية كيفية إنشاء فهارس GPU بأنواعها المختلفة.

    +

    إعداد معلمات الفهرس

    عند إعداد معلمات فهرس GPU، قم بتعريف نوع_الفهرس ونوع_المقياس والبارامز:

    +
      +
    • نوع_الفهرس(سلسلة): نوع الفهرس المستخدم لتسريع البحث المتجه. تتضمن الخيارات الصالحة GPU_CAGRA و GPU_IVF_FLAT و GPU_IVF_FLAT و GPU_IVF_PQ و GPU_BRUTE_FORCE.

    • +
    • نوع_المقياس(سلسلة): نوع المقاييس المستخدمة لقياس تشابه المتجهات. الخيارات الصالحة هي IP و L2.

    • +
    • بارامز(إملاء): معلمات البناء الخاصة بالفهرس. تعتمد الخيارات الصالحة لهذه المعلمة على نوع الفهرس.

    • +
    +

    فيما يلي أمثلة على التكوينات لأنواع الفهرس المختلفة:

    +
      +
    • فهرسGPU_CAGRA

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_CAGRA",
      +    "params": {
      +        'intermediate_graph_degree': 64,
      +        'graph_degree': 32
      +    }
      +}
      +
      +

      تتضمن الخيارات الممكنة للمعلمات ما يلي:

      +
        +
      • intermediate_graph_degree(int): يؤثر على الاستدعاء ووقت الإنشاء من خلال تحديد درجة الرسم البياني قبل التقليم. القيم الموصى بها هي 32 أو 64.

      • +
      • درجة_الرسم البياني(int): تؤثر على أداء البحث والاستدعاء من خلال تحديد درجة الرسم البياني بعد التقليم. عادةً ما تكون نصف درجة_درجة_الرسم البياني المتوسطة. ينتج عن الفرق الأكبر بين هاتين الدرجتين وقت بناء أطول. يجب أن تكون قيمته أصغر من قيمة intermediate_graph_degree.

      • +
      • build_algo(سلسلة): يحدد خوارزمية إنشاء الرسم البياني قبل التقليم. الخيارات الممكنة:

        +
          +
        • IVF_PQ: تقدم جودة أعلى ولكن وقت بناء أبطأ.

        • +
        • NN_DESCENT: يوفر بناء أسرع مع احتمال استرجاع أقل.

        • +
      • +
      • cache_dataset_dataset_on_device(سلسلة، "صواب" | "خطأ"): يقرر ما إذا كان سيتم تخزين مجموعة البيانات الأصلية مؤقتًا في ذاكرة وحدة معالجة الرسومات. يعمل ضبط هذا على "صواب" على تحسين الاستدعاء من خلال تحسين نتائج البحث، بينما يعمل ضبطه على "خطأ" على الحفاظ على ذاكرة وحدة معالجة الرسومات.

      • +
    • +
    • فهرسGPU_IVF_FLAT أو GPU_IVF_PQ

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ
      +    "params": {
      +        "nlist": 1024
      +    }
      +}
      +
      +

      تتطابق خيارات البارامز مع تلك المستخدمة في IVF_FLAT وIVF_PQ.

    • +
    • فهرسGPU_BRUTE_FORCE

      +
      index_params = {
      +    'index_type': 'GPU_BRUTE_FORCE',
      +    'metric_type': 'L2',
      +    'params': {}
      +}
      +
      +

      لا توجد تكوينات بارامز إضافية مطلوبة.

    • +
    +

    بناء الفهرس

    بعد تكوين معلمات الفهرس في index_params، قم باستدعاء طريقة create_index() لإنشاء الفهرس.

    +
    # Get an existing collection
    +collection = Collection("YOUR_COLLECTION_NAME")
    +
    +collection.create_index(
    +    field_name="vector", # Name of the vector field on which an index is built
    +    index_params=index_params
    +)
    +
    +

    بمجرد إنشاء فهرس GPU، فإن الخطوة التالية هي إعداد معلمات البحث قبل إجراء البحث.

    +

    إعداد معلمات البحث

    فيما يلي أمثلة على تكوينات لأنواع الفهرس المختلفة:

    +
      +
    • فهرسGPU_BRUTE_FORCE

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {}
      +}
      +
      +

      لا توجد تكوينات بارامترات إضافية مطلوبة.

    • +
    • فهرسGPU_CAGRA

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {
      +        "itopk_size": 128,
      +        "search_width": 4,
      +        "min_iterations": 0,
      +        "max_iterations": 0,
      +        "team_size": 0
      +    }
      +}
      +
      +

      تتضمن معلمات البحث الرئيسية:

      +
        +
      • itopk_size: يحدد حجم النتائج الوسيطة المحفوظة أثناء البحث. قد تؤدي القيمة الأكبر إلى تحسين الاستدعاء على حساب أداء البحث. يجب أن تكون مساوية على الأقل للقيمة النهائية لأعلى k(الحد الأعلى) وعادةً ما تكون قوة 2 (على سبيل المثال، 16، 32، 64، 128).

      • +
      • عرض_البحث: يحدد عدد نقاط الدخول إلى الرسم البياني CAGRA أثناء البحث. قد تؤدي زيادة هذه القيمة إلى تحسين الاستدعاء ولكنها قد تؤثر على أداء البحث.

      • +
      • min_iterations / max_iterations: تتحكم هذه المعلمات في عملية تكرار البحث. بشكل افتراضي، يتم تعيينهما على وتحدد CAGRA تلقائيًا عدد التكرارات بناءً على itopk_size وعرض_البحث. يمكن أن يساعد ضبط هذه القيم يدويًا في تحقيق التوازن بين الأداء والدقة.

      • +
      • team_size: يحدد عدد خيوط CUDA المستخدمة لحساب المسافة المترية على وحدة معالجة الرسومات. القيم الشائعة هي قوة 2 حتى 32 (على سبيل المثال 2، 4، 8، 16، 32). لها تأثير طفيف على أداء البحث. القيمة الافتراضية هي حيث يقوم Milvus تلقائيًا بتحديد حجم_الفريق تلقائيًا استنادًا إلى بُعد المتجه.

      • +
    • +
    • فهرسGPU_IVF_FLAT أو GPU_IVF_PQ

      +
      search_params = {
      +    "metric_type": "L2", 
      +    "params": {"nprobe": 10}
      +}
      +
      +

      تتشابه معلمات البحث لهذين النوعين من الفهرسين مع تلك المستخدمة في IVF_FLAT و IVF_PQ. لمزيد من المعلومات، راجع إجراء بحث تشابه المتجهات.

    • +
    +

    استخدم طريقة search() لإجراء بحث تشابه متجه على فهرس GPU.

    +
    # Load data into memory
    +collection.load()
    +
    +collection.search(
    +    data=[[query_vector]], # Your query vector
    +    anns_field="vector", # Name of the vector field
    +    param=search_params,
    +    limit=100 # Number of the results to return
    +)
    +
    +

    الحدود

    عند استخدام فهارس GPU، كن على دراية ببعض القيود:

    +
      +
    • بالنسبة إلى GPU_IVF_FLAT، الحد الأقصى لقيمة الحد هو 1024.

    • +
    • بالنسبة لفهرسي GPU_IVF_PQ و GPU_CAGRA، القيمة القصوى للحد هي 1024.

    • +
    • في حين أنه لا يوجد حد أقصى معين للحد على GPU_BRUTE_FORCE، يوصى بعدم تجاوز 4096 لتجنب مشاكل الأداء المحتملة.

    • +
    • لا تدعم فهارس وحدة معالجة الرسومات حاليًا مسافة COSINE. إذا كانت مسافة COSINE مطلوبة، يجب تطبيع البيانات أولاً، ثم يمكن استخدام مسافة المنتج الداخلي (IP) كبديل.

    • +
    • تحميل حماية OOM لفهارس وحدة معالجة الرسومات غير مدعوم بالكامل، قد يؤدي تحميل الكثير من البيانات إلى تعطل QueryNode.

    • +
    • لا تدعم فهارس وحدة معالجة الرسومات وظائف البحث مثل البحث في النطاق والبحث بالتجميع.

    • +
    +

    الأسئلة الشائعة

      +
    • متى يكون من المناسب استخدام فهرس GPU؟

      +

      يكون فهرس GPU مفيدًا بشكل خاص في المواقف التي تتطلب إنتاجية عالية أو استرجاعًا عاليًا. على سبيل المثال، عند التعامل مع الدفعات الكبيرة، يمكن أن تتجاوز إنتاجية فهرسة وحدة معالجة الرسومات إنتاجية فهرسة وحدة المعالجة المركزية بما يصل إلى 100 مرة. في السيناريوهات ذات الدُفعات الأصغر، لا تزال فهارس وحدة معالجة الرسومات تتفوق بشكل كبير على فهارس وحدة المعالجة المركزية من حيث الأداء. علاوةً على ذلك، إذا كانت هناك متطلبات لإدخال البيانات بسرعة، فإن دمج وحدة معالجة الرسومات يمكن أن يسرّع عملية إنشاء الفهارس بشكل كبير.

    • +
    • ما هي السيناريوهات التي تكون فيها فهارس وحدة معالجة الرسومات مثل CAGRA وGPU_IVF_PQ وGPU_IVF_FFLAT وGPU_BRUTE_FORCE الأنسب؟

      +

      تُعد فهارس CAGRA مثالية للسيناريوهات التي تتطلب أداءً محسنًا، وإن كان ذلك على حساب استهلاك المزيد من الذاكرة. بالنسبة للبيئات التي يكون فيها الحفاظ على الذاكرة أولوية، يمكن أن يساعد فهرس GPU_IVF_PQ في تقليل متطلبات التخزين، على الرغم من أن ذلك يأتي مع خسارة أعلى في الدقة. يعمل فهرس GPU_IVF_FLAT كخيار متوازن، حيث يوفر حلاً وسطًا بين الأداء واستخدام الذاكرة. أخيرًا، تم تصميم فهرس GPU_BRUTE_FORCE لعمليات البحث الشاملة، مما يضمن معدل استرجاع 1 من خلال إجراء عمليات بحث اجتياحية.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/manage_databases.json b/localization/v2.5.x/site/ar/userGuide/manage_databases.json new file mode 100644 index 000000000..ade8bc8c0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage_databases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, db\n\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\n\ndatabase = db.create_database(\"my_database\")\n","import io.milvus.client.MilvusServiceClient;\nimport io.milvus.param.ConnectParam;\nimport io.milvus.param.collection.CreateDatabaseParam;\n\n// 1. Connect to Milvus server\nConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n\n// 3. Create a new database\nCreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()\n .withDatabaseName(\"\")\n .build();\n\nR response = client.createDatabase(createDatabaseParam);\n","const address = \"http://localhost:19530\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address });\n\n// 3. Create a database\nres = await client.createDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n\n// {\n// error_code: 'Success',\n// reason: '',\n// code: 0,\n// retriable: false,\n// detail: ''\n// }\n","db.using_database(\"my_database\")\n","// No equivalent method is available.\n","// 4. Activate another database\nres = await client.useDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n","conn = connections.connect(\n host=\"127.0.0.1\",\n port=\"19530\",\n db_name=\"my_database\"\n)\n","ConnectParam connectParam = ConnectParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n","const address = \"http://localhost:19530\";\nconst db_name = \"my_database\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address, db_name });\n","db.list_database()\n\n# Output\n['default', 'my_database']\n","import io.milvus.grpc.ListDatabasesResponse;\nimport io.milvus.param.R;\n\n// 2. List all databases\nR listDatabasesResponse = client.listDatabases();\nSystem.out.println(listDatabasesResponse.getData());\n\n// status {\n// }\n// db_names: \"default\"\n// db_names: \"my_database\"\n// created_timestamp: 1716794498117757990\n// created_timestamp: 1716797196479639477\n","res = await client.listDatabases();\n\nconsole.log(res.db_names);\n\n// [ 'default', 'my_database' ]\n","db.drop_database(\"my_database\")\n\ndb.list_database()\n\n# Output\n['default']\n","import io.milvus.param.collection.DropDatabaseParam;\n\nDropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .build();\n\nresponse = client.dropDatabase(dropDatabaseParam);\n","res = await client.dropDatabase({\n db_name: \"my_database\",\n});\n","from pymilvus import connections, Role\n\n_URI = \"http://localhost:19530\"\n_TOKEN = \"root:Milvus\"\n_DB_NAME = \"default\"\n\n\ndef connect_to_milvus(db_name=\"default\"):\n print(f\"connect to milvus\\n\")\n connections.connect(\n uri=_URI,\n token=_TOKEN,\n db_name=db_name\n )\n","String URI = \"http://localhost:19530\";\nString TOKEN = \"root:Milvus\";\n\npublic class ConnectToMilvus {\n private String _dbName = \"default\";\n\n public newBuilder() {}\n\n public MilvusServiceClient build() {\n ConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(URI)\n .withToken(TOKEN)\n .withDatabaseName(_dbNAME)\n .build();\n\n return new MilvusServiceClient(connectParam);\n }\n\n public newBuilder withDbName(String dbName) {\n this._dbName = dbName;\n return this;\n }\n}\n","const address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\n\nfunction connectToMilvus(dbName = \"default\") {\n const client = new MilvusClient({\n address,\n token,\n dbName,\n });\n\n return client;\n}\n","_ROLE_NAME = \"test_role\"\n_PRIVILEGE_INSERT = \"Insert\"\n\nconnect_to_milvus()\nrole = Role(_ROLE_NAME)\nrole.create()\n\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","String ROLE_NAME = \"test_role\";\nString PRIVILEGE_INSERT = \"Insert\";\n\nMilvusServiceClient client = new ConnectToMilvus().build();\nR response = client.createRole(CreateRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const ROLE_NAME = \"test_role\";\nconst PRIVILEGE_INSERT = \"Insert\";\n\nconst client = connectToMilvus();\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\nconnect_to_milvus(db_name=\"foo\")\n\n# This role will have the insert permission of all collections under foo db,\n# excluding the insert permissions of collections under other dbs\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","// NOTE: please make sure the 'foo' db has been created\nMilvusServiceClient client = new ConnectToMilvus().withDbName(\"foo\").build();\n\n// This role will have the insert permission of all collections under foo db,\n// excluding the insert permissions of collections under other dbs\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const client = connectToMilvus(\"foo\");\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\n\ndb_name = \"foo\"\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\nprint(role.list_grants(db_name=db_name))\nprint(role.list_grant(\"Collection\", \"*\", db_name=db_name))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\n","// NOTE: please make sure the 'foo' db has been created\n\nString dbName = \"foo\";\nMilvusServiceClient client = new ConnectToMilvus().build();\n\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","// The Node.js SDK currently cannot support this case.\n"],"headingContent":"Manage Databases","anchorList":[{"label":"إدارة قواعد البيانات","href":"Manage-Databases","type":1,"isActive":false},{"label":"إنشاء قاعدة بيانات","href":"Create-database","type":2,"isActive":false},{"label":"استخدام قاعدة بيانات","href":"Use-a-database","type":2,"isActive":false},{"label":"قائمة قواعد البيانات","href":"List-databases","type":2,"isActive":false},{"label":"إسقاط قاعدة بيانات","href":"Drop-database","type":2,"isActive":false},{"label":"استخدام RBAC مع قاعدة البيانات","href":"Use-RBAC-with-database","type":2,"isActive":false},{"label":"ما التالي","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/manage_databases.md b/localization/v2.5.x/site/ar/userGuide/manage_databases.md new file mode 100644 index 000000000..f5313cb8e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/manage_databases.md @@ -0,0 +1,597 @@ +--- +id: manage_databases.md +title: إدارة قواعد البيانات +--- +

    إدارة قواعد البيانات

    على غرار محركات قواعد البيانات التقليدية، يمكنك أيضًا إنشاء قواعد بيانات في ميلفوس وتخصيص امتيازات لمستخدمين معينين لإدارتها. ثم يحق لهؤلاء المستخدمين إدارة المجموعات في قواعد البيانات. تدعم مجموعة ميلفوس 64 قاعدة بيانات كحد أقصى.

    +
    +

    تستخدم مقتطفات التعليمات البرمجية في هذه الصفحة الوحدة النمطية PyMilvus ORM للتفاعل مع Milvus. ستتوفر مقتطفات التعليمات البرمجية مع وحدة MilvusClient SDK الجديدة قريبًا.

    +
    +

    إنشاء قاعدة بيانات

    +

    استخدم connect() للاتصال بخادم Milvus و create_database() لإنشاء قاعدة بيانات جديدة:

    +
    +
    +

    استخدم MilvusClient للاتصال بخادم Milvus وإنشاء قاعدة بيانات() لإنشاء قاعدة بيانات جديدة:

    +
    +
    +

    استخدم MilvusClient للاتصال بخادم Milvus وإنشاء قاعدة بيانات() لإنشاء قاعدة بيانات جديدة:

    +
    + +
    from pymilvus import connections, db
    +
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +
    +database = db.create_database("my_database")
    +
    +
    import io.milvus.client.MilvusServiceClient;
    +import io.milvus.param.ConnectParam;
    +import io.milvus.param.collection.CreateDatabaseParam;
    +
    +// 1. Connect to Milvus server
    +ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +// 3. Create a new database
    +CreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()
    +    .withDatabaseName("")
    +    .build();
    +
    +R<RpcStatus> response = client.createDatabase(createDatabaseParam);
    +
    +
    const address = "http://localhost:19530";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address });
    +
    +// 3. Create a database
    +res = await client.createDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +// {
    +//   error_code: 'Success',
    +//   reason: '',
    +//   code: 0,
    +//   retriable: false,
    +//   detail: ''
    +// }
    +
    +

    تتصل مقتطفات التعليمات البرمجية أعلاه بقاعدة البيانات الافتراضية وتنشئ قاعدة بيانات جديدة باسم my_database.

    +

    استخدام قاعدة بيانات

    يتم شحن مجموعة Milvus مع قاعدة بيانات افتراضية، اسمها "افتراضي". يتم إنشاء المجموعات في قاعدة البيانات الافتراضية ما لم يتم تحديد خلاف ذلك.

    +

    لتغيير قاعدة البيانات الافتراضية، قم بما يلي:

    + +
    db.using_database("my_database")
    +
    +
    // No equivalent method is available.
    +
    +
    // 4. Activate another database
    +res = await client.useDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +

    يمكنك أيضًا تعيين قاعدة بيانات لاستخدامها عند الاتصال بمجموعة ميلفوس الخاصة بك على النحو التالي:

    + +
    conn = connections.connect(
    +    host="127.0.0.1",
    +    port="19530",
    +    db_name="my_database"
    +)
    +
    +
    ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +
    const address = "http://localhost:19530";
    +const db_name = "my_database";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address, db_name });
    +
    +

    قائمة قواعد البيانات

    +

    للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم طريقة list_database():

    +
    +
    +

    للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم طريقة listDatabase():

    +
    +
    +

    للعثور على جميع قواعد البيانات الموجودة في مجموعة ميلفوس الخاصة بك، استخدم أسلوب listDatabases():

    +
    + +
    db.list_database()
    +
    +# Output
    +['default', 'my_database']
    +
    +
    import io.milvus.grpc.ListDatabasesResponse;
    +import io.milvus.param.R;
    +
    +// 2. List all databases
    +R<ListDatabasesResponse> listDatabasesResponse = client.listDatabases();
    +System.out.println(listDatabasesResponse.getData());
    +
    +// status {
    +// }
    +// db_names: "default"
    +// db_names: "my_database"
    +// created_timestamp: 1716794498117757990
    +// created_timestamp: 1716797196479639477
    +
    +
    res = await client.listDatabases();
    +
    +console.log(res.db_names);
    +
    +// [ 'default', 'my_database' ]
    +
    +

    إسقاط قاعدة بيانات

    لإسقاط قاعدة بيانات، عليك إسقاط جميع مجموعاتها أولاً. وإلا ستفشل عملية الإسقاط.

    +
    +

    لإسقاط قاعدة بيانات، استخدم الأسلوب drop_database():

    +
    +
    +

    لإسقاط قاعدة بيانات، استخدم طريقة dropDatabase():

    +
    +
    +

    لإسقاط قاعدة بيانات، استخدم طريقة dropDatabase(): لإسقاط قاعدة بيانات:

    +
    + +
    db.drop_database("my_database")
    +
    +db.list_database()
    +
    +# Output
    +['default']
    +
    +
    import io.milvus.param.collection.DropDatabaseParam;
    +
    +DropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .build();
    +
    +response = client.dropDatabase(dropDatabaseParam);
    +
    +
    res = await client.dropDatabase({
    +    db_name: "my_database",
    +});
    +
    +

    استخدام RBAC مع قاعدة البيانات

    يغطي RBAC أيضًا عمليات قاعدة البيانات ويضمن التوافق المستقبلي. كلمة قاعدة البيانات في واجهات برمجة تطبيقات الأذونات (منح / إبطال / قائمة منح) لها المعاني التالية:

    +
      +
    • إذا لم يحدد اتصال Milvus أو استدعاء واجهة برمجة تطبيقات الأذونات db_name ، تشير قاعدة البيانات إلى قاعدة البيانات الافتراضية.
    • +
    • إذا كان اتصال Milvus يحدد db_name ، ولكن استدعاء واجهة برمجة تطبيقات Permission API بعد ذلك لا يحدد ، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في اتصال Milvus.
    • +
    • إذا تم إجراء استدعاء Permission API عند اتصال Milvus، مع أو بدون تحديد db_name ، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في استدعاء واجهة برمجة التطبيقات الخاصة بالإذن.
    • +
    +

    مقتطف الكود التالي مشترك بين الكتل المدرجة أدناه.

    + +
    from pymilvus import connections, Role
    +
    +_URI = "http://localhost:19530"
    +_TOKEN = "root:Milvus"
    +_DB_NAME = "default"
    +
    +
    +def connect_to_milvus(db_name="default"):
    +    print(f"connect to milvus\n")
    +    connections.connect(
    +        uri=_URI,
    +        token=_TOKEN,
    +        db_name=db_name
    +    )
    +
    +
    String URI = "http://localhost:19530";
    +String TOKEN = "root:Milvus";
    +
    +public class ConnectToMilvus {
    +    private String _dbName = "default";
    +
    +    public newBuilder() {}
    +
    +    public MilvusServiceClient build() {
    +        ConnectParam connectParam = ConnectParam.newBuilder()
    +            .withUri(URI)
    +            .withToken(TOKEN)
    +            .withDatabaseName(_dbNAME)
    +            .build();
    +
    +        return new MilvusServiceClient(connectParam);
    +    }
    +
    +    public newBuilder withDbName(String dbName) {
    +        this._dbName = dbName;
    +        return this;
    +    }
    +}
    +
    +
    const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +
    +function connectToMilvus(dbName = "default") {
    +    const client = new MilvusClient({
    +        address,
    +        token,
    +        dbName,
    +    });
    +
    +    return client;
    +}
    +
    +
      +
    • إذا لم يحدد اتصال Milvus ولا استدعاء واجهة برمجة تطبيقات الأذونات db_name ، تشير قاعدة البيانات إلى قاعدة البيانات الافتراضية.

      +

      +
      _ROLE_NAME = "test_role"
      +_PRIVILEGE_INSERT = "Insert"
      +
      +connect_to_milvus()
      +role = Role(_ROLE_NAME)
      +role.create()
      +
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      String ROLE_NAME = "test_role";
      +String PRIVILEGE_INSERT = "Insert";
      +
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +R<RpcStatus> response = client.createRole(CreateRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const ROLE_NAME = "test_role";
      +const PRIVILEGE_INSERT = "Insert";
      +
      +const client = connectToMilvus();
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • إذا كان اتصال Milvus يحدد db_name ، ولكن استدعاء واجهة برمجة تطبيقات الأذونات بعد ذلك لا يحدد ، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في اتصال Milvus.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +connect_to_milvus(db_name="foo")
      +
      +# This role will have the insert permission of all collections under foo db,
      +# excluding the insert permissions of collections under other dbs
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +MilvusServiceClient client = new ConnectToMilvus().withDbName("foo").build();
      +
      +// This role will have the insert permission of all collections under foo db,
      +// excluding the insert permissions of collections under other dbs
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const client = connectToMilvus("foo");
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • إذا تم إجراء مكالمة Permission API عند اتصال Milvus، مع تحديد db_name أو بدونه، تشير قاعدة البيانات إلى قاعدة البيانات التي تم تحديد اسمها في مكالمة Permission API.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +
      +db_name = "foo"
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +print(role.list_grants(db_name=db_name))
      +print(role.list_grant("Collection", "*", db_name=db_name))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +
      +String dbName = "foo";
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      // The Node.js SDK currently cannot support this case.
      +
    • +
    +

    ما التالي

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.json new file mode 100644 index 000000000..4272f22bb --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"type\": \"standard\", # Uses the standard built-in analyzer​\n \"stop_words\": [\"a\", \"an\", \"for\"] # Defines a list of common words (stop words) to exclude from tokenization​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"standard\");\nanalyzerParams.put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n","const analyzer_params = {\n \"type\": \"standard\", // Uses the standard built-in analyzer\n \"stop_words\": [\"a\", \"an\", \"for\"] // Defines a list of common words (stop words) to exclude from tokenization\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }'\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stop\",​\n \"stop_words\": [\"a\", \"an\", \"for\"]​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","[\"Vector\", \"Database\", \"Built\", \"for\", \"Scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"whitespace\");\n","const analyzer_params = {\n \"tokenizer\": \"whitespace\",\n};\n","export analyzerParams='{\n \"type\": \"whitespace\"\n }'\n","[\"vector\", \"database\", \"built\", \"for\", \"scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [\"lowercase\"], # Optional: Built-in filter that converts text to lowercase​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\", Collections.singletonList(\"lowercase\"));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\"lowercase\"], // Optional: Built-in filter that converts text to lowercase\n}\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\"lowercase\"]\n}'\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [​\n {​\n \"type\": \"stop\", # Specifies 'stop' as the filter type​\n \"stop_words\": [\"of\", \"to\"], # Customizes stop words for this filter type​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Collections.singletonList(new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\n {\n \"type\": \"stop\", // Specifies 'stop' as the filter type\n \"stop_words\": [\"of\", \"to\"], // Customizes stop words for this filter type\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","from pymilvus import MilvusClient, DataType​\n​\n# Set up a Milvus client​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\"​\n)​\n​\n# Create schema​\nschema = client.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\n# Add fields to schema​\n​\n# Use a built-in analyzer​\nanalyzer_params_built_in = {​\n \"type\": \"english\"​\n}​\n​\n# Add VARCHAR field `title_en`​\nschema.add_field(​\n field_name='title_en', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_built_in,​\n enable_match=True, ​\n)​\n​\n# Configure a custom analyzer​\nanalyzer_params_custom = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\", # Built-in filter​\n {​\n \"type\": \"length\", # Custom filter​\n \"max\": 40​\n },​\n {​\n \"type\": \"stop\", # Custom filter​\n \"stop_words\": [\"of\", \"to\"]​\n }​\n ]​\n}​\n​\n# Add VARCHAR field `title`​\nschema.add_field(​\n field_name='title', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_custom,​\n enable_match=True, ​\n)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n# Add primary field​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\n​\n# Set up index params for vector field​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"embedding\", metric_type=\"COSINE\", index_type=\"AUTOINDEX\")​\n​\n# Create collection with defined schema​\nclient.create_collection(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n schema=schema,​\n index_params=index_params​\n)​\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\n// Set up a Milvus client\nConnectConfig config = ConnectConfig.builder()\n .uri(\"http://localhost:19530\")\n .build();\nMilvusClientV2 client = new MilvusClientV2(config);\n\n// Create schema\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\n// Add fields to schema\n// Use a built-in analyzer\nMap analyzerParamsBuiltin = new HashMap<>();\nanalyzerParamsBuiltin.put(\"type\", \"english\");\n// Add VARCHAR field `title_en`\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title_en\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParamsBuiltin)\n .enableMatch(true)\n .build());\n\n// Configure a custom analyzer\nMap analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"length\");\n put(\"max\", 40);\n }},\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}\n )\n);\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true) // must enable this if you use TextMatch\n .build());\n\n// Add vector field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"embedding\")\n .dataType(DataType.FloatVector)\n .dimension(3)\n .build());\n// Add primary field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\n\n// Set up index params for vector field\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"embedding\")\n .indexType(IndexParam.IndexType.AUTOINDEX)\n .metricType(IndexParam.MetricType.COSINE)\n .build());\n\n// Create collection with defined schema\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\n// Set up a Milvus client\nconst client = new MilvusClient(\"http://localhost:19530\");\n// Use a built-in analyzer for VARCHAR field `title_en`\nconst analyzerParamsBuiltIn = {\n type: \"english\",\n};\n\n// Configure a custom analyzer for VARCHAR field `title`\nconst analyzerParamsCustom = {\n tokenizer: \"standard\",\n filter: [\n \"lowercase\",\n {\n type: \"length\",\n max: 40,\n },\n {\n type: \"stop\",\n stop_words: [\"of\", \"to\"],\n },\n ],\n};\n\n// Create schema\nconst schema = {\n auto_id: true,\n fields: [\n {\n name: \"id\",\n type: DataType.INT64,\n is_primary: true,\n },\n {\n name: \"title_en\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsBuiltIn,\n enable_match: true,\n },\n {\n name: \"title\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsCustom,\n enable_match: true,\n },\n {\n name: \"embedding\",\n data_type: DataType.FLOAT_VECTOR,\n dim: 4,\n },\n ],\n};\n\n// Set up index params for vector field\nconst indexParams = [\n {\n name: \"embedding\",\n metric_type: \"COSINE\",\n index_type: \"AUTOINDEX\",\n },\n];\n\n// Create collection with defined schema\nawait client.createCollection({\n collection_name: \"YOUR_COLLECTION_NAME\",\n schema: schema,\n index_params: indexParams,\n});\n\nconsole.log(\"Collection created successfully!\");\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"title_en\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"title\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\n \"tokenizer\": \"standard\",\n \"filter\":[\n \"lowercase\",\n {\n \"type\":\"length\",\n \"max\":40\n },\n {\n \"type\":\"stop\",\n \"stop_words\":[\"of\",\"to\"]\n }\n ]\n }\n }\n },\n {\n \"fieldName\": \"embedding\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\":3\n }\n }\n ]\n }'\n \nexport indexParams='[\n {\n \"fieldName\": \"embedding\",\n \"metricType\": \"COSINE\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"YOUR_COLLECTION_NAME\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n"],"headingContent":"Analyzer Overview​","anchorList":[{"label":"نظرة عامة على المحلل","href":"Analyzer-Overview​","type":1,"isActive":false},{"label":"تشريح المحلل","href":"Anatomy-of-an-analyzer​","type":2,"isActive":false},{"label":"أنواع المحللات","href":"Analyzer-types​","type":2,"isActive":false},{"label":"مثال على الاستخدام","href":"Example-use​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.md new file mode 100644 index 000000000..415b93377 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer-overview.md @@ -0,0 +1,584 @@ +--- +id: analyzer-overview.md +title: نظرة عامة على المحلل +summary: >- + في معالجة النصوص، يعتبر المحلل عنصرًا أساسيًا في تحويل النص الخام إلى تنسيق + منظم وقابل للبحث. يتكون كل محلل عادةً من عنصرين أساسيين: مُحلل الرموز والمرشح. + يقومان معًا بتحويل النص المدخل إلى رموز، وتنقيح هذه الرموز، وإعدادها للفهرسة + والاسترجاع بكفاءة. +--- +

    نظرة عامة على المحلل

    في معالجة النصوص، يعد المحلل مكونًا أساسيًا يحول النص الخام إلى تنسيق منظم وقابل للبحث. يتكون كل محلل عادةً من عنصرين أساسيين: مُحلل الرموز والمرشح. يقومان معًا بتحويل النص المُدخَل إلى رموز، وتنقيح هذه الرموز، وإعدادها للفهرسة والاسترجاع بكفاءة.

    +

    وبدعم من Tantivy، يتم تكوين المحللات في Milvus أثناء إنشاء المجموعة عند إضافة حقول VARCHAR إلى مخطط المجموعة. يمكن استخدام الرموز التي ينتجها المحلل لبناء فهرس لمطابقة النص أو تحويلها إلى تضمينات متفرقة للبحث في النص الكامل. لمزيد من المعلومات، راجع مطابقة النص أو البحث عن النص الكامل.

    +
    +

    قد يؤثر استخدام المحللات على الأداء.

    +
      +
    • البحث عن النص الكامل: للبحث عن النص الكامل، تستهلك قناتا DataNode وQueryNode البيانات بشكل أبطأ لأنه يجب أن تنتظر اكتمال الترميز. ونتيجة لذلك، تستغرق البيانات التي تم إدخالها حديثًا وقتًا أطول لتصبح متاحة للبحث.

    • +
    • مطابقة النص: بالنسبة لمطابقة النص، يكون إنشاء الفهرس أبطأ أيضًا نظرًا لأن الترميز يحتاج إلى الانتهاء من الترميز قبل أن يتم إنشاء الفهرس.

    • +
    +
    +

    تشريح المحلل

    يتكوّن المحلّل في ميلفوس من مُحلّل واحد فقط من أداة ترميز واحدة وصفر أو أكثر من المرشحات.

    +
      +
    • أداة الترميز: يقوم أداة الترميز بتقسيم النص المدخل إلى وحدات منفصلة تسمى الرموز. قد تكون هذه الرموز عبارة عن كلمات أو عبارات، اعتمادًا على نوع الرمز المميز.

    • +
    • المرشحات: يمكن تطبيق عوامل التصفية على الرموز الرمزية لزيادة تنقيحها، على سبيل المثال، بجعلها صغيرة أو إزالة الكلمات الشائعة.

    • +
    +

    يوضح سير العمل أدناه كيفية معالجة المحلل للنص.

    +

    analyzer-overview

    +

    أنواع المحللات

    يوفر ميلفوس نوعين من المحللات لتلبية احتياجات معالجة النصوص المختلفة.

    +
      +
    • محلل مدمج: وهي تكوينات محددة مسبقًا تغطي مهام معالجة النصوص الشائعة بأقل قدر من الإعداد. تعتبر المحللات المدمجة مثالية لعمليات البحث ذات الأغراض العامة، لأنها لا تتطلب تكوينًا معقدًا.

    • +
    • محلل مخصص: بالنسبة للمتطلبات الأكثر تقدمًا، تسمح لك المحللات المخصصة بتحديد التكوين الخاص بك عن طريق تحديد كل من أداة الترميز وصفر أو أكثر من المرشحات. هذا المستوى من التخصيص مفيد بشكل خاص لحالات الاستخدام المتخصصة حيث يلزم التحكم الدقيق في معالجة النص.

    • +
    +
    +

    إذا قمت بحذف تكوينات المحلل أثناء إنشاء المجموعة، فإن Milvus يستخدم محلل standard لجميع عمليات معالجة النصوص بشكل افتراضي. لمزيد من التفاصيل، راجع المعيار.

    +
    +

    محلل مدمج

    يتم تهيئة المحللات المدمجة في Milvus مسبقًا باستخدام محلل رموز ومرشحات محددة، مما يسمح لك باستخدامها على الفور دون الحاجة إلى تحديد هذه المكونات بنفسك. يعمل كل محلل مدمج كقالب يتضمن أداة ترميز ومرشحات محددة مسبقًا، مع معلمات اختيارية للتخصيص.

    +

    على سبيل المثال، لاستخدام المحلّل المدمج standard ، ما عليك سوى تحديد اسمه standard على أنه type وتضمين اختياريًا تكوينات إضافية خاصة بهذا النوع من المحلّلات، مثل stop_words.

    + +
    analyzer_params = {​
    +    "type": "standard", # Uses the standard built-in analyzer​
    +    "stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "standard");
    +analyzerParams.put("stop_words", Arrays.asList("a", "an", "for"));
    +
    +
    const analyzer_params = {
    +    "type": "standard", // Uses the standard built-in analyzer
    +    "stop_words": ["a", "an", "for"] // Defines a list of common words (stop words) to exclude from tokenization
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "stop_words": ["a", "an", "for"]
    +    }'
    +
    +

    إن تكوين المحلل المدمج standard أعلاه يعادل إعداد محلل مخصص بالمعلمات التالية، حيث يتم تحديد الخيارين tokenizer و filter بشكل صريح لتحقيق نفس الوظيفة:

    + +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stop",​
    +            "stop_words": ["a", "an", "for"]​
    +        }​
    +    ]​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}));
    +
    +
    const analyzer_params = {
    +    "tokenizer": "standard",
    +    "filter": [
    +        "lowercase",
    +        {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +        }
    +    ]
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "filter":  [
    +       "lowercase",
    +       {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +       }
    +   ]
    +}'
    +
    +

    يقدم Milvus المحللات المدمجة التالية، والتي يمكن استخدام كل منها مباشرة عن طريق تحديد اسمها كمعامل type.

    +
      +
    • standard: مناسبة لمعالجة النصوص للأغراض العامة، وتطبيق الترميز القياسي والتصفية بالأحرف الصغيرة.

    • +
    • english: مُحسّن للنصوص باللغة الإنجليزية، مع دعم كلمات التوقف الإنجليزية.

    • +
    • chinese: متخصص في معالجة النصوص الصينية، بما في ذلك الترميز المخصص لتراكيب اللغة الصينية.

    • +
    +

    محلل مخصص

    لمزيد من المعالجة المتقدمة للنصوص، تتيح لك المحللات المخصصة في Milvus إنشاء خط أنابيب مخصص لمعالجة النصوص من خلال تحديد كل من أداة الترميز والمرشحات. يعد هذا الإعداد مثاليًا لحالات الاستخدام المتخصصة التي تتطلب تحكمًا دقيقًا.

    +

    أداة الترميز

    يعدّ أداة الترميز مكوّنًا إلزاميًا لمحلل مخصص، حيث يبدأ خط أنابيب المحلل عن طريق تقسيم نص الإدخال إلى وحدات أو رموز منفصلة. تتبع عملية الترميز قواعد محددة، مثل التقسيم حسب المسافات البيضاء أو علامات الترقيم، اعتمادًا على نوع أداة الترميز. تسمح هذه العملية بمعالجة أكثر دقة واستقلالية لكل كلمة أو عبارة.

    +

    على سبيل المثال، تقوم أداة الترميز بتحويل النص "Vector Database Built for Scale" إلى رموز منفصلة.

    +
    ["Vector", "Database", "Built", "for", "Scale"]​
    +
    +

    مثال على تحديد أداة ترميز.

    + +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "whitespace");
    +
    +
    const analyzer_params = {
    +    "tokenizer": "whitespace",
    +};
    +
    +
    export analyzerParams='{
    +       "type": "whitespace"
    +    }'
    +
    +

    المرشحات

    الفلاتر هي مكوّنات اختيارية تعمل على الرموز التي ينتجها مُصنِّف الرموز الرموز الرمزية، وتقوم بتحويلها أو تنقيحها حسب الحاجة. على سبيل المثال، بعد تطبيق مرشح lowercase على المصطلحات المرمزة ["Vector", "Database", "Built", "for", "Scale"] ، قد تكون النتيجة.

    +
    ["vector", "database", "built", "for", "scale"]​
    +
    +

    يمكن أن تكون الفلاتر في محلل مخصص إما مدمجة أو مخصصة، حسب احتياجات التكوين.

    +
      +
    • مرشحات مدمجة: تم تكوينها مسبقًا بواسطة Milvus، وتتطلب الحد الأدنى من الإعداد. يمكنك استخدام هذه المرشحات خارج الصندوق من خلال تحديد أسمائها. المرشحات أدناه مدمجة للاستخدام المباشر.

      +
        +
      • lowercase: تحويل النص إلى أحرف صغيرة، مما يضمن مطابقة غير حساسة لحالة الأحرف. لمزيد من التفاصيل، راجع الأحرف الصغيرة.

      • +
      • asciifolding: يقوم بتحويل الأحرف غير ASCII إلى معادلات ASCII، مما يبسط معالجة النص متعدد اللغات. لمزيد من التفاصيل، راجع طي ASCII.

      • +
      • alphanumonly: يحتفظ بالأحرف الأبجدية الرقمية فقط عن طريق إزالة الأحرف الأخرى. لمزيد من التفاصيل، راجع Alphanumonly.

      • +
      • cnalphanumonly: يزيل الرموز التي تحتوي على أي أحرف غير الأحرف الصينية أو الأحرف الإنجليزية أو الأرقام. لمزيد من التفاصيل، ارجع إلى Cnalphanumonumonly.

      • +
      • cncharonly: يزيل الرموز التي تحتوي على أي أحرف غير صينية. لمزيد من التفاصيل، راجع Cncharonly.

      • +
      +

      مثال على استخدام عامل تصفية مدمج:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase​
      +}​
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter", Collections.singletonList("lowercase"));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": ["lowercase"], // Optional: Built-in filter that converts text to lowercase
      +}
      +
      +
      export analyzerParams='{
      +   "type": "standard",
      +   "filter":  ["lowercase"]
      +}'
      +
    • +
    • مرشحات مخصصة: تسمح المرشحات المخصصة بتكوينات متخصصة. يمكنك تحديد مرشح مخصص عن طريق اختيار نوع مرشح صالح (filter.type) وإضافة إعدادات محددة لكل نوع مرشح. أمثلة على أنواع الفلاتر التي تدعم التخصيص.

      +
        +
      • stop: إزالة الكلمات الشائعة المحددة عن طريق تعيين قائمة بكلمات التوقف (على سبيل المثال، "stop_words": ["of", "to"]). لمزيد من التفاصيل، راجع الإيقاف.

      • +
      • length: يستبعد الرموز بناءً على معايير الطول، مثل تعيين الحد الأقصى لطول الرمز المميز. لمزيد من التفاصيل، راجع الطول.

      • +
      • stemmer: يختزل الكلمات إلى أشكالها الجذرية لمطابقة أكثر مرونة. لمزيد من التفاصيل، راجع Stemmer.

      • +
      +

      مثال على تكوين عامل تصفية مخصص:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": [​
      +        {​
      +            "type": "stop", # Specifies 'stop' as the filter type​
      +            "stop_words": ["of", "to"], # Customizes stop words for this filter type​
      +        }​
      +    ]​
      +}​
      +
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter",
      +    Collections.singletonList(new HashMap<String, Object>() {{
      +        put("type", "stop");
      +        put("stop_words", Arrays.asList("a", "an", "for"));
      +    }}));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": [
      +        {
      +            "type": "stop", // Specifies 'stop' as the filter type
      +            "stop_words": ["of", "to"], // Customizes stop words for this filter type
      +        }
      +    ]
      +};
      +
      +
      export analyzerParams='{
      +    "type": "standard",
      +    "filter":  [
      +    {
      +            "type": "stop",
      +            "stop_words": ["a", "an", "for"]
      +    }
      +    ]
      +}'
      +
    • +
    +

    مثال على الاستخدام

    في هذا المثال، نحدد في هذا المثال مخطط مجموعة مع حقل متجه للتضمين وحقلين VARCHAR لإمكانيات معالجة النصوص. يتم تكوين كل حقل VARCHAR بإعدادات محلل خاص به للتعامل مع احتياجات المعالجة المختلفة.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +# Set up a Milvus client​
    +client = MilvusClient(​
    +    uri="http://localhost:19530"​
    +)​
    +​
    +# Create schema​
    +schema = client.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +# Add fields to schema​
    +​
    +# Use a built-in analyzer​
    +analyzer_params_built_in = {​
    +    "type": "english"​
    +}​
    +​
    +# Add VARCHAR field `title_en`​
    +schema.add_field(​
    +    field_name='title_en', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_built_in,​
    +    enable_match=True, ​
    +)​
    +​
    +# Configure a custom analyzer​
    +analyzer_params_custom = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase", # Built-in filter​
    +        {​
    +            "type": "length", # Custom filter​
    +            "max": 40​
    +        },​
    +        {​
    +            "type": "stop", # Custom filter​
    +            "stop_words": ["of", "to"]​
    +        }​
    +    ]​
    +}​
    +​
    +# Add VARCHAR field `title`​
    +schema.add_field(​
    +    field_name='title', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_custom,​
    +    enable_match=True, ​
    +)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +# Add primary field​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Set up index params for vector field​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")​
    +​
    +# Create collection with defined schema​
    +client.create_collection(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +// Set up a Milvus client
    +ConnectConfig config = ConnectConfig.builder()
    +        .uri("http://localhost:19530")
    +        .build();
    +MilvusClientV2 client = new MilvusClientV2(config);
    +
    +// Create schema
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +// Add fields to schema
    +// Use a built-in analyzer
    +Map<String, Object> analyzerParamsBuiltin = new HashMap<>();
    +analyzerParamsBuiltin.put("type", "english");
    +// Add VARCHAR field `title_en`
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title_en")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParamsBuiltin)
    +        .enableMatch(true)
    +        .build());
    +
    +// Configure a custom analyzer
    +Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "length");
    +                    put("max", 40);
    +                }},
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}
    +        )
    +);
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true) // must enable this if you use TextMatch
    +        .build());
    +
    +// Add vector field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("embedding")
    +        .dataType(DataType.FloatVector)
    +        .dimension(3)
    +        .build());
    +// Add primary field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +
    +// Set up index params for vector field
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("embedding")
    +        .indexType(IndexParam.IndexType.AUTOINDEX)
    +        .metricType(IndexParam.MetricType.COSINE)
    +        .build());
    +
    +// Create collection with defined schema
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +// Set up a Milvus client
    +const client = new MilvusClient("http://localhost:19530");
    +// Use a built-in analyzer for VARCHAR field `title_en`
    +const analyzerParamsBuiltIn = {
    +  type: "english",
    +};
    +
    +// Configure a custom analyzer for VARCHAR field `title`
    +const analyzerParamsCustom = {
    +  tokenizer: "standard",
    +  filter: [
    +    "lowercase",
    +    {
    +      type: "length",
    +      max: 40,
    +    },
    +    {
    +      type: "stop",
    +      stop_words: ["of", "to"],
    +    },
    +  ],
    +};
    +
    +// Create schema
    +const schema = {
    +  auto_id: true,
    +  fields: [
    +    {
    +      name: "id",
    +      type: DataType.INT64,
    +      is_primary: true,
    +    },
    +    {
    +      name: "title_en",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsBuiltIn,
    +      enable_match: true,
    +    },
    +    {
    +      name: "title",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsCustom,
    +      enable_match: true,
    +    },
    +    {
    +      name: "embedding",
    +      data_type: DataType.FLOAT_VECTOR,
    +      dim: 4,
    +    },
    +  ],
    +};
    +
    +// Set up index params for vector field
    +const indexParams = [
    +  {
    +    name: "embedding",
    +    metric_type: "COSINE",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +// Create collection with defined schema
    +await client.createCollection({
    +  collection_name: "YOUR_COLLECTION_NAME",
    +  schema: schema,
    +  index_params: indexParams,
    +});
    +
    +console.log("Collection created successfully!");
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "title_en",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "title",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {
    +                        "tokenizer": "standard",
    +                        "filter":[
    +                            "lowercase",
    +                            {
    +                                "type":"length",
    +                                "max":40
    +                            },
    +                            {
    +                                "type":"stop",
    +                                "stop_words":["of","to"]
    +                            }
    +                        ]
    +                    }
    +                }
    +            },
    +            {
    +                "fieldName": "embedding",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim":3
    +                }
    +            }
    +        ]
    +    }'
    +    
    +export indexParams='[
    +        {
    +            "fieldName": "embedding",
    +            "metricType": "COSINE",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"YOUR_COLLECTION_NAME\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.json new file mode 100644 index 000000000..7addc1e24 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n \"filter\": [\"cnalphanumonly\"]​\n}​\n","analyzer_params = {​\n \"type\": \"chinese\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\"]​\n"],"headingContent":"Chinese​","anchorList":[{"label":"الصينية","href":"Chinese​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.md new file mode 100644 index 000000000..994617c02 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/chinese-analyzer.md @@ -0,0 +1,50 @@ +--- +id: chinese-analyzer.md +title: محلل صيني +related_key: 'chinese, analyzer' +summary: >- + تم تصميم المحلل "الصيني" خصيصًا للتعامل مع النص الصيني، مما يوفر تجزئة + وترميزًا فعالين. +--- +

    الصينية

    تم تصميم محلل chinese خصيصًا للتعامل مع النص الصيني، مما يوفر تجزئة وترميزًا فعالين للنصوص الصينية.

    +

    التعريف

    يتكون محلل chinese من.

    +
      +
    • أداة الترميز: يستخدم أداة ترميز jieba لتجزئة النص الصيني إلى رموز بناءً على المفردات والسياق. لمزيد من المعلومات، راجع Jieba.

    • +
    • عامل التصفية: يستخدم عامل التصفية cnalphanumonly لإزالة الرموز التي تحتوي على أي أحرف غير صينية. لمزيد من المعلومات، راجع Cnalphanumonly.

    • +
    +

    تكافئ وظيفة محلل chinese تكوين المحلل المخصص التالي.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +    "filter": ["cnalphanumonly"]​
    +}​
    +
    +

    التكوين

    لتطبيق محلل chinese على حقل ما، ما عليك سوى تعيين type إلى chinese في analyzer_params.

    +
    analyzer_params = {​
    +    "type": "chinese",​
    +}​
    +
    +
    +

    لا يقبل محلل chinese أي معلمات اختيارية.

    +
    +

    مثال على الإخراج

    إليك كيفية معالجة محلل chinese للنص.

    +

    النص الأصلي.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    الناتج المتوقع.

    +
    ["Milvus", "是", "一个", "高性", "性能", "高性能", "可", "扩展", "的", "向量", "数据", "据库", "数据库"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.json new file mode 100644 index 000000000..064088db5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stemmer\",​\n \"language\": \"english\"​\n },{​\n \"type\": \"stop\",​\n \"stop_words\": \"_english_\",​\n }​\n ]​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n \"stop_words\": [\"a\", \"an\", \"the\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"milvus\", \"vector\", \"databas\", \"built\", \"scale\"]​\n"],"headingContent":"English​","anchorList":[{"label":"اللغة الإنجليزية","href":"English​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.md new file mode 100644 index 000000000..fac51b557 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/english-analyzer.md @@ -0,0 +1,74 @@ +--- +id: english-analyzer.md +title: محلل اللغة الإنجليزية +related_key: 'english, analyzer' +summary: >- + تم تصميم محلل "اللغة الإنجليزية" في Milvus لمعالجة النص الإنجليزي، وتطبيق + قواعد خاصة باللغة لترميز النصوص وتصفيتها. +--- +

    اللغة الإنجليزية

    تم تصميم محلل english في ميلفوس لمعالجة النص الإنجليزي، وتطبيق قواعد خاصة باللغة لترميز وتصفية الرموز.

    +

    التعريف

    يستخدم محلل english المكونات التالية.

    +
      +
    • أداة الترميز: يستخدم standard tokenizer لتقسيم النص إلى وحدات كلمات منفصلة.

    • +
    • المرشحات: يتضمن مرشحات متعددة لمعالجة النص بشكل شامل.

      +
        +
      • lowercase: يحول جميع الرموز إلى أحرف صغيرة، مما يتيح عمليات بحث غير حساسة لحالة الأحرف.

      • +
      • stemmer: يقلل الكلمات إلى صيغتها الجذرية لدعم مطابقة أوسع (على سبيل المثال، "تشغيل" تصبح "تشغيل").

      • +
      • stop_words: يزيل كلمات التوقف الإنجليزية الشائعة للتركيز على المصطلحات الرئيسية في النص.

      • +
    • +
    +

    وظيفة محلل english مكافئة لتكوين المحلل المخصص التالي.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stemmer",​
    +            "language": "english"​
    +        },{​
    +            "type": "stop",​
    +            "stop_words": "_english_",​
    +        }​
    +    ]​
    +}​
    +
    +

    التكوين

    لتطبيق محلل english على أحد الحقول، ما عليك سوى تعيين type إلى english في analyzer_params ، وتضمين معلمات اختيارية حسب الحاجة.

    +
    analyzer_params = {​
    +    "type": "english",​
    +}​
    +
    +

    يقبل محلل english المعلمات الاختيارية التالية:

    +

    المعلمة

    +

    الوصف

    +

    stop_words

    +

    مصفوفة تحتوي على قائمة بكلمات التوقف، والتي ستتم إزالتها من الترميز. الإعداد الافتراضي هو _english_ ، وهي مجموعة مدمجة من كلمات التوقف الشائعة في اللغة الإنجليزية.

    +
    +

    مثال على التكوين مع كلمات الإيقاف المخصصة.

    +
    analyzer_params = {​
    +    "type": "english",​
    +    "stop_words": ["a", "an", "the"]​
    +}​
    +
    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط مجموعة. يسمح ذلك لـ Milvus بمعالجة النص في هذا الحقل باستخدام المحلل المحدد من أجل ترميز وتصفية فعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي كيفية معالجة محلل english للنص.

    +

    النص الأصلي.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    الناتج المتوقع.

    +
    ["milvus", "vector", "databas", "built", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.json new file mode 100644 index 000000000..1cf37b453 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n \"stop_words\", [\"of\"] # Optional: List of words to exclude from tokenization​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"the\", \"milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"قياسي","href":"Standard​","type":1,"isActive":false},{"label":"التعريف","href":"Definition​","type":2,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.md new file mode 100644 index 000000000..8f812e8a6 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/analyzer/standard-analyzer.md @@ -0,0 +1,106 @@ +--- +id: standard-analyzer.md +title: محلل قياسي +related_key: 'standard, analyzer' +summary: >- + المحلل "القياسي" هو المحلل الافتراضي في Milvus، والذي يتم تطبيقه تلقائيًا على + حقول النصوص إذا لم يتم تحديد محلل. وهو يستخدم الترميز القائم على القواعد + النحوية، مما يجعله فعالاً لمعظم اللغات. +--- +

    قياسي

    محلل standard هو المحلل الافتراضي في ميلفوس، والذي يتم تطبيقه تلقائيًا على حقول النص إذا لم يتم تحديد محلل. وهو يستخدم الترميز القائم على القواعد النحوية، مما يجعله فعالاً لمعظم اللغات.

    +

    التعريف

    يتكون محلل standard من.

    +
      +
    • أداة الترميز: يستخدم أداة الترميز standard لتقسيم النص إلى وحدات كلمات منفصلة بناءً على قواعد النحو. لمزيد من المعلومات، راجع المعيار.

    • +
    • عامل التصفية: يستخدم عامل التصفية lowercase لتحويل جميع الرموز إلى أحرف صغيرة، مما يتيح عمليات بحث غير حساسة لحالة الأحرف. لمزيد من المعلومات، راجعlowercase filter.

    • +
    +

    تكافئ وظيفة محلل standard تكوين المحلل المخصص التالي.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    التكوين

    لتطبيق محلل standard على أحد الحقول، ما عليك سوى تعيين type إلى standard في analyzer_params ، وتضمين معلمات اختيارية حسب الحاجة.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +}​
    +
    +

    يقبل محلل standard المعلمات الاختيارية التالية:

    +

    المعلمة

    +

    الوصف

    +

    stop_words

    +

    مصفوفة تحتوي على قائمة بكلمات التوقف، والتي ستتم إزالتها من الترميز. افتراضي إلى _english_ ، وهي مجموعة مدمجة من كلمات التوقف الشائعة في اللغة الإنجليزية. يمكن الاطلاع على تفاصيل _english_ هنا.

    +
    +

    مثال على تكوين كلمات التوقف المخصصة.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +    "stop_words", ["of"] # Optional: List of words to exclude from tokenization​
    +}​
    +
    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح هذا لميلفوس بمعالجة النص في هذا الحقل باستخدام المحلل المحدد من أجل ترميز وتصفية فعالة. لمزيد من المعلومات، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    إليك كيفية معالجة محلل standard للنص.

    +

    النص الأصلي.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    الناتج المتوقع.

    +
    ["the", "milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.json new file mode 100644 index 000000000..8d2da24af --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"alphanumonly\"],​\n}​\n","\"Milvus 2.0 @ Scale! #AI #Vector_Databasé\"​\n","[\"Milvus\", \"2\", \"0\", \"Scale\", \"AI\", \"Vector\"]​\n"],"headingContent":"Alphanumonly​","anchorList":[{"label":"Alphanumonly","href":"Alphanumonly​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.md new file mode 100644 index 000000000..5c58e9966 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/alphanumonly-filter.md @@ -0,0 +1,70 @@ +--- +id: alphanumonly-filter.md +title: مرشح ألفانومونلي فقط +summary: >- + يزيل عامل التصفية "alphanumonly" الرموز التي تحتوي على أحرف غير ASCII، مع + الاحتفاظ فقط بالمصطلحات الأبجدية الرقمية. يُفيد هذا الفلتر في معالجة النصوص + التي لا تحتوي إلا على أحرف وأرقام أساسية ذات صلة، مع استبعاد أي أحرف أو رموز + خاصة. +--- +

    Alphanumonly

    يقوم عامل التصفية alphanumonly بإزالة الرموز التي تحتوي على أحرف غير ASCII، مع الاحتفاظ فقط بالمصطلحات الأبجدية الرقمية. هذا الفلتر مفيد لمعالجة النصوص التي تكون فيها الأحرف والأرقام الأساسية فقط ذات صلة، مع استبعاد أي أحرف أو رموز خاصة.

    +

    التكوين

    عامل التصفية alphanumonly مدمج في ميلفوس. لاستخدامه، ما عليك سوى تحديد اسمه في القسم filter داخل analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["alphanumonly"],​
    +}​
    +
    +

    يعمل عامل التصفية alphanumonly على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية alphanumonly للنص.

    +

    النص الأصلي.

    +
    "Milvus 2.0 @ Scale! #AI #Vector_Databasé"​
    +
    +

    الإخراج المتوقع.

    +
    ["Milvus", "2", "0", "Scale", "AI", "Vector"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.json new file mode 100644 index 000000000..38e11abc8 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"asciifolding\"],​\n}​\n","\"Café Möller serves crème brûlée and piñatas.\"​\n","[\"Cafe\", \"Moller\", \"serves\", \"creme\", \"brulee\", \"and\", \"pinatas\"]​\n"],"headingContent":"ASCII folding​","anchorList":[{"label":"طي ASCII","href":"ASCII-folding​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.md new file mode 100644 index 000000000..dde98d164 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/ascii-folding-filter.md @@ -0,0 +1,68 @@ +--- +id: ascii-folding-filter.md +title: طي ASCII +summary: >- + يقوم عامل التصفية "أسكيفولدينغ"** ** بتحويل الأحرف خارج كتلة يونيكود اللاتينية + الأساسية (أول 127 حرف ASCII) إلى معادلاتها من ASCII. +--- +

    طي ASCII

    يحول المرشح asciifolding** ** الأحرف خارج كتلة يونيكود اللاتينية الأساسية (أول 127 حرف ASCII) إلى معادلاتها من ASCII. على سبيل المثال، يقوم بتحويل أحرف مثل í إلى i ، مما يجعل معالجة النص أبسط وأكثر اتساقًا، خاصة للمحتوى متعدد اللغات.

    +

    التكوين

    تم تضمين عامل التصفية asciifolding في ميلفوس. لاستخدامه، ما عليك سوى تحديد اسمه في القسم filter داخل analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["asciifolding"],​
    +}​
    +
    +

    يعمل مرشح asciifolding على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية asciifolding للنص.

    +

    النص الأصلي.

    +
    "Café Möller serves crème brûlée and piñatas."​
    +
    +

    الإخراج المتوقع.

    +
    ["Cafe", "Moller", "serves", "creme", "brulee", "and", "pinatas"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json new file mode 100644 index 000000000..4684e4548 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cnalphanumonly\"],​\n}​\n\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"Milvus\", \"是\", \"LF\", \"AI\", \"Data\", \"Foundation\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"Apache\", \"2.0\", \"许可\", \"发布\"]​\n"],"headingContent":"Cnalphanumonly​","anchorList":[{"label":"Cnalphanumonly","href":"Cnalphanumonly​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md new file mode 100644 index 000000000..db3bb3496 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md @@ -0,0 +1,69 @@ +--- +id: cnalphanumonly-filter.md +title: فلتر Cnalphanumonly +summary: >- + يقوم عامل التصفية "cnalphanumonly" بإزالة الرموز التي تحتوي على أي أحرف غير + الأحرف الصينية أو الأحرف الإنجليزية أو الأرقام. +--- +

    Cnalphanumonly

    يقوم عامل التصفية cnalphanumonly بإزالة الرموز المميزة التي تحتوي على أي أحرف غير الأحرف الصينية أو الأحرف الإنجليزية أو الأرقام.

    +

    التكوين

    عامل التصفية cnalphanumonly مدمج في ميلفوس. لاستخدامه، ما عليك سوى تحديد اسمه في القسم filter داخل analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cnalphanumonly"],​
    +}​
    +
    +
    +

    يعمل عامل التصفية cnalphanumonly على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية cnalphanumonly للنص.

    +

    النص الأصلي.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    الإخراج المتوقع.

    +
    ["Milvus", "是", "LF", "AI", "Data", "Foundation", "下", "的", "一个", "开源", "项目", "以", "Apache", "2.0", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.json new file mode 100644 index 000000000..b27aa6293 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cncharonly\"],​\n}​\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"是\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"许可\", \"发布\"]​\n"],"headingContent":"Cncharonly​","anchorList":[{"label":"كنشارونلي","href":"Cncharonly​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.md new file mode 100644 index 000000000..931b9207f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/cncharonly-filter.md @@ -0,0 +1,68 @@ +--- +id: cncharonly-filter.md +title: مرشح كنشارونلي +summary: >- + يقوم عامل التصفية "cnalphanumonly" بإزالة الرموز التي تحتوي على أي أحرف غير + الأحرف الصينية أو الأحرف الإنجليزية أو الأرقام. +--- +

    كنشارونلي

    يزيل عامل التصفية cncharonly الرموز التي تحتوي على أي رموز غير صينية. يكون هذا الفلتر مفيدًا عندما تريد التركيز فقط على النص الصيني، مع تصفية أي رموز تحتوي على نصوص أو أرقام أو رموز أخرى.

    +

    التكوين

    عامل التصفية cncharonly مدمج في ميلفوس. لاستخدامه، ما عليك سوى تحديد اسمه في القسم filter داخل analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cncharonly"],​
    +}​
    +
    +

    يعمل عامل التصفية cncharonly على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية cncharonly للنص.

    +

    النص الأصلي.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    الإخراج المتوقع.

    +
    ["是", "下", "的", "一个", "开源", "项目", "以", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.json new file mode 100644 index 000000000..3bc39b330 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"decompounder\", # Specifies the filter type as decompounder​\n \"word_list\": [\"dampf\", \"schiff\", \"fahrt\", \"brot\", \"backen\", \"automat\"],​\n }],​\n}​\n","\"dampfschifffahrt brotbackautomat\"​\n","[\"dampf\", \"schiff\", \"fahrt\", \"brotbackautomat\"]​\n"],"headingContent":"Decompounder​","anchorList":[{"label":"مفكك الكلمات المركبة","href":"Decompounder​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.md new file mode 100644 index 000000000..3ccb13e19 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/decompounder-filter.md @@ -0,0 +1,78 @@ +--- +id: decompounder-filter.md +title: فلتر مزيل العادم +summary: >- + يقسّم فلتر "decompounder" الكلمات المركّبة إلى مكوّنات فردية استنادًا إلى + قاموس محدد، مما يسهّل البحث عن أجزاء من المصطلحات المركّبة. هذا المرشح مفيد + بشكل خاص للغات التي تستخدم كلمات مركبة بشكل متكرر، مثل الألمانية. +--- +

    مفكك الكلمات المركبة

    يقوم عامل التصفية decompounder بتقسيم الكلمات المركبة إلى مكونات فردية بناءً على قاموس محدد، مما يسهل البحث عن أجزاء من المصطلحات المركبة. هذا الفلتر مفيد بشكل خاص للغات التي تستخدم كلمات مركبة بشكل متكرر، مثل الألمانية.

    +

    التكوين

    عامل التصفية decompounder هو عامل تصفية مخصص في ميلفوس. لاستخدامه، حدد "type": "decompounder" في تكوين عامل التصفية، إلى جانب معلمة word_list التي توفر قاموس مكونات الكلمات المراد التعرف عليها.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "decompounder", # Specifies the filter type as decompounder​
    +        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],​
    +    }],​
    +}​
    +
    +

    يقبل عامل التصفية decompounder المعلمات التالية القابلة للتكوين.

    +

    المعلمة

    +

    الوصف

    +

    word_list

    +

    قائمة بمكونات الكلمات المستخدمة لتقسيم المصطلحات المركبة. يحدد هذا القاموس كيفية تحليل الكلمات المركبة إلى مصطلحات فردية.

    +
    +

    يعمل عامل التصفية decompounder على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذا يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية decompounder للنص.

    +

    النص الأصلي.

    +
    "dampfschifffahrt brotbackautomat"​
    +
    +

    الإخراج المتوقع (مع word_list: ["dampf", "schiff", "fahrt", "brot", "backen", "automat"]).

    +
    ["dampf", "schiff", "fahrt", "brotbackautomat"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.json new file mode 100644 index 000000000..53126cac0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"length\", # Specifies the filter type as length​\n \"max\": 10, # Sets the maximum token length to 10 characters​\n }],​\n}​\n","\"The length filter allows control over token length requirements for text processing.\"​\n","[\"length\", \"filter\", \"allows\", \"control\", \"over\", \"token\", \"length\", \"for\", \"text\"]​\n"],"headingContent":"Length​","anchorList":[{"label":"الطول","href":"Length​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.md new file mode 100644 index 000000000..9a582f5bd --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/length-filter.md @@ -0,0 +1,77 @@ +--- +id: length-filter.md +title: مرشح الطول +summary: >- + يزيل عامل التصفية "الطول" الرموز التي لا تفي بمتطلبات الطول المحددة، مما يسمح + لك بالتحكم في طول الرموز المحتفظ بها أثناء معالجة النص. +--- +

    الطول

    يقوم عامل التصفية length بإزالة الرموز التي لا تفي بمتطلبات الطول المحددة، مما يسمح لك بالتحكم في طول الرموز التي يتم الاحتفاظ بها أثناء معالجة النص.

    +

    التكوين

    عامل التصفية length هو عامل تصفية مخصص في ميلفوس، يتم تحديده من خلال الإعداد "type": "length" في تكوين عامل التصفية. يمكنك تكوينه كقاموس داخل analyzer_params لتحديد حدود الطول.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "length", # Specifies the filter type as length​
    +        "max": 10, # Sets the maximum token length to 10 characters​
    +    }],​
    +}​
    +
    +

    يقبل عامل التصفية length المعلمات التالية القابلة للتكوين.

    +

    المعلمة

    +

    الوصف

    +

    max

    +

    يضبط الحد الأقصى لطول الرمز المميز. تتم إزالة الرموز الأطول من هذا الطول.

    +
    +

    يعمل عامل التصفية length على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامها مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية length للنص.

    +

    مثال علىالنص.

    +
    "The length filter allows control over token length requirements for text processing."​
    +
    +

    الإخراج المتوقع (مع max: 10).

    +
    ["length", "filter", "allows", "control", "over", "token", "length", "for", "text"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.json new file mode 100644 index 000000000..2807a071c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"],​\n}​\n","\"The Lowercase Filter Ensures Uniformity In Text Processing.\"​\n","[\"the\", \"lowercase\", \"filter\", \"ensures\", \"uniformity\", \"in\", \"text\", \"processing\"]​\n"],"headingContent":"Lowercase​","anchorList":[{"label":"الأحرف الصغيرة","href":"Lowercase​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.md new file mode 100644 index 000000000..312b3f71d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/lowercase-filter.md @@ -0,0 +1,68 @@ +--- +id: lowercase-filter.md +title: مرشح الأحرف الصغيرة +summary: >- + يقوم عامل التصفية "الأحرف الصغيرة" بتحويل المصطلحات التي تم إنشاؤها بواسطة + أداة الترميز إلى أحرف صغيرة، مما يجعل عمليات البحث غير حساسة لحالة الأحرف. +--- +

    الأحرف الصغيرة

    يقوم عامل التصفية lowercase بتحويل المصطلحات التي تم إنشاؤها بواسطة أداة الترميز إلى أحرف صغيرة، مما يجعل عمليات البحث غير حساسة لحالة الأحرف. على سبيل المثال، يمكنه تحويل ["High", "Performance", "Vector", "Database"] إلى ["high", "performance", "vector", "database"].

    +

    التكوين

    عامل التصفية lowercase مدمج في ميلفوس. لاستخدامه، ما عليك سوى تحديد اسمه في قسم filter داخل analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"],​
    +}​
    +
    +

    يعمل مرشح lowercase على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية lowercase للنص.

    +

    النص الأصلي.

    +
    "The Lowercase Filter Ensures Uniformity In Text Processing."​
    +
    +

    الإخراج المتوقع.

    +
    ["the", "lowercase", "filter", "ensures", "uniformity", "in", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.json new file mode 100644 index 000000000..03e1caed5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stemmer\", # Specifies the filter type as stemmer​\n \"language\": \"english\", # Sets the language for stemming to English​\n }],​\n}​\n","\"running runs looked ran runner\"​\n","[\"run\", \"run\", \"look\", \"ran\", \"runner\"]​\n"],"headingContent":"Stemmer​","anchorList":[{"label":"الجذع","href":"Stemmer​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.md new file mode 100644 index 000000000..f9b07f464 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stemmer-filter.md @@ -0,0 +1,77 @@ +--- +id: stemmer-filter.md +title: فلتر ستيمير +summary: >- + يعمل مرشح "الجذع" على تقليل الكلمات إلى شكلها الأساسي أو الجذري (المعروف باسم + الجذع)، مما يسهل مطابقة الكلمات ذات المعاني المتشابهة عبر التصريفات المختلفة. +--- +

    الجذع

    يقوم مرشح stemmer بتقليل الكلمات إلى شكلها الأساسي أو الجذري (المعروف باسم الجذع)، مما يسهل مطابقة الكلمات ذات المعاني المتشابهة عبر تصريفات مختلفة. يدعم مرشح stemmer لغات متعددة، مما يسمح بالبحث والفهرسة الفعالة في سياقات لغوية مختلفة.

    +

    التكوين

    عامل التصفية stemmer هو عامل تصفية مخصص في ميلفوس. لاستخدامه، حدد "type": "stemmer" في تكوين الفلتر، إلى جانب معلمة language لتحديد اللغة المرغوبة للوقف.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stemmer", # Specifies the filter type as stemmer​
    +        "language": "english", # Sets the language for stemming to English​
    +    }],​
    +}​
    +
    +

    يقبل عامل التصفية stemmer المعلمات التالية القابلة للتكوين.

    +

    المعلمة

    +

    الوصف

    +

    language

    +

    تحديد لغة عملية الجذع. اللغات المدعومة تشمل: "arabic" "danish" و "dutch" و و "english" و و "finnish" و "french" و "german" و و "greek" و "hungarian" و "italian" و "norwegian" و و "portuguese" و "romanian" و "russian" و "spanish" و "swedish" و "tamil" و "turkish"

    +
    +

    يعمل مرشح stemmer على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية stemmer للنص.

    +

    النص الأصلي.

    +
    "running runs looked ran runner"​
    +
    +

    الإخراج المتوقع (مع language: "english").

    +
    ["run", "run", "look", "ran", "runner"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.json new file mode 100644 index 000000000..d249d47a2 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stop\", # Specifies the filter type as stop​\n \"stop_words\": [\"of\", \"to\", \"_english_\"], # Defines custom stop words and includes the English stop word list​\n }],​\n}​\n","\"The stop filter allows control over common stop words for text processing.\"​\n","[\"The\", \"stop\", \"filter\", \"allows\", \"control\", \"common\", \"stop\", \"words\", \"text\", \"processing\"]​\n"],"headingContent":"Stop​","anchorList":[{"label":"التوقف","href":"Stop​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.md new file mode 100644 index 000000000..d199f089a --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/filter/stop-filter.md @@ -0,0 +1,78 @@ +--- +id: stop-filter.md +title: إيقاف التصفية +summary: >- + يزيل عامل التصفية "stop" كلمات الإيقاف المحددة من النص المرموز، مما يساعد على + التخلص من الكلمات الشائعة الأقل أهمية. يمكنك تكوين قائمة كلمات التوقف باستخدام + معلمة 'stop_words'. +--- +

    التوقف

    يقوم عامل التصفية stop بإزالة كلمات الإيقاف المحددة من النص المرموز، مما يساعد على التخلص من الكلمات الشائعة الأقل معنى. يمكنك تكوين قائمة كلمات الإيقاف باستخدام المعلمة stop_words.

    +

    التكوين

    عامل التصفية length هو عامل تصفية مخصص في ميلفوس. لاستخدامه، حدد "type": "stop" في تكوين عامل التصفية، إلى جانب معلمة stop_words التي توفر قائمة بكلمات التوقف.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stop", # Specifies the filter type as stop​
    +        "stop_words": ["of", "to", "_english_"], # Defines custom stop words and includes the English stop word list​
    +    }],​
    +}​
    +
    +

    يقبل عامل التصفية stop المعلمات التالية القابلة للتكوين.

    +

    المعلمة

    +

    الوصف

    +

    stop_words

    +

    قائمة بالكلمات المراد إزالتها من الترميز. بشكل افتراضي، يتم استخدام قائمة _english_ المحددة مسبقًا، والتي تحتوي على كلمات التوقف الإنجليزية الشائعة. يمكن الاطلاع على تفاصيل _english_ هنا.

    +
    +

    يعمل عامل التصفية stop على المصطلحات التي تم إنشاؤها بواسطة أداة الترميز، لذلك يجب استخدامه مع أداة الترميز.

    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة عامل التصفية stop للنص.

    +

    النص الأصلي.

    +
    "The stop filter allows control over common stop words for text processing."​
    +
    +

    الإخراج المتوقع (مع stop_words: ["the", "over", "_english_"]).

    +
    ["The", "stop", "filter", "allows", "control", "common", "stop", "words", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json new file mode 100644 index 000000000..14af081c4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \" \", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"、\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\", \"!\"]​\n"],"headingContent":"Jieba​","anchorList":[{"label":"جيبا","href":"Jieba​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md new file mode 100644 index 000000000..43e81d1d9 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md @@ -0,0 +1,64 @@ +--- +id: jieba-tokenizer.md +title: جيبا توكنزر Jieba Tokenizer +summary: تعالج أداة ترميز "جيبا" النص الصيني عن طريق تقسيمه إلى الكلمات المكوّنة له. +--- +

    جيبا

    يعالج أداة الترميز jieba النص الصيني عن طريق تقسيمه إلى الكلمات المكوّنة له.

    +

    التكوين

    لتكوين محلل باستخدام أداة الترميز jieba ، قم بتعيين tokenizer إلى jieba في analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +}​
    +
    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح هذا لميلفوس بمعالجة النص في هذا الحقل باستخدام المحلل المحدد لترميز وتصفية فعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة أداة الترميز jieba للنص.

    +

    النص الأصلي.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    الإخراج المتوقع.

    +
    ["Milvus", " ", "是", "一个", "高性", "性能", "高性能", "、", "可", "扩展", "的", "向量", "数据", "据库", "数据库", "!"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json new file mode 100644 index 000000000..778d3f07c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n}​\n\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"قياسي","href":"Standard​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md new file mode 100644 index 000000000..08797e6f4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md @@ -0,0 +1,77 @@ +--- +id: standard-tokenizer.md +title: الرمز المميز القياسي +summary: >- + تقوم أداة الترميز "القياسية" في Milvus بتقسيم النص بناءً على المسافات وعلامات + الترقيم، مما يجعلها مناسبة لمعظم اللغات. +--- +

    قياسي

    يقوم أداة ترميز standard في Milvus بتقسيم النص بناءً على المسافات وعلامات الترقيم، مما يجعله مناسبًا لمعظم اللغات.

    +

    التكوين

    لتكوين محلل باستخدام أداة الترميز standard ، قم بتعيين tokenizer إلى standard في analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +}​
    +
    +
    +

    يمكن أن يعمل الرمز المميز standard مع واحد أو أكثر من المرشحات. على سبيل المثال، يُعرّف الرمز التالي محللاً يستخدم أداة الترميز standard ومرشح lowercase.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +
    +
    +

    من أجل إعداد أبسط، يمكنك اختيار استخدام standard analyzerالذي يجمع بين أداة الترميز standard مع أداة الترميز و lowercase filter.

    +
    +

    بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح هذا لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد لترميز وتصفية فعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة أداة الترميز standard للنص.

    +

    النص الأصلي.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    الإخراج المتوقع.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json new file mode 100644 index 000000000..c3018def9 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n \"filter\": [\"lowercase\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale!\"]​\n"],"headingContent":"Whitespace​","anchorList":[{"label":"المسافات البيضاء","href":"Whitespace​","type":1,"isActive":false},{"label":"التكوين","href":"Configuration​","type":2,"isActive":false},{"label":"مثال على الإخراج","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md new file mode 100644 index 000000000..24d94bd6c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md @@ -0,0 +1,72 @@ +--- +id: whitespace-tokenizer.md +title: أداة ترميز المساحات البيضاء +summary: >- + تقسم أداة ترميز "المسافة البيضاء" النص إلى مصطلحات كلما كانت هناك مسافة بين + الكلمات. +--- +

    المسافات البيضاء

    يقوم أداة الترميز whitespace بتقسيم النص إلى مصطلحات كلما كانت هناك مسافة بين الكلمات.

    +

    التكوين

    لتكوين محلل باستخدام أداة ترميز whitespace ، قم بتعيين tokenizer إلى whitespace في analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +

    يمكن لأداة ترميز المسافات البيضاء أن تعمل بالاقتران مع واحد أو أكثر من عوامل التصفية. على سبيل المثال، يُعرّف الرمز التالي محللاً يستخدم أداة الترميز whitespace و lowercase filter:

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    بعد تعريف analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تعريف مخطط المجموعة. يسمح هذا لميلفوس بمعالجة النص في هذا الحقل باستخدام المحلل المحدد من أجل الترميز والتصفية الفعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.

    +

    مثال على الإخراج

    فيما يلي مثال على كيفية معالجة أداة الترميز whitespace للنص.

    +

    النص الأصلي.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    الإخراج المتوقع.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale!"]​
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.json b/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.json new file mode 100644 index 000000000..b16ca4bee --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3]​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\n# Add an Array field with elements of type VARCHAR​\nschema.add_field(field_name=\"tags\", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​\n# Add an Array field with elements of type INT64​\nschema.add_field(field_name=\"ratings\", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​\n​\n# Add primary field​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"tags\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(10)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"ratings\")​\n .dataType(DataType.Array)​\n .elementType(DataType.Int64)​\n .maxCapacity(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"tags\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 10,​\n max_length: 65535​\n },​\n {​\n name: \"rating\",​\n data_type: DataType.Array,​\n element_type: DataType.Int64,​\n max_capacity: 5,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export arrayField1='{​\n \"fieldName\": \"tags\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 10,​\n \"max_length\": 100​\n }​\n}'​\n​\nexport arrayField2='{​\n \"fieldName\": \"ratings\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"Int64\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 5​\n }​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $arrayField1,​\n $arrayField2,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","# Prepare index parameters​\nindex_params = client.prepare_index_params() # Prepare IndexParams object​\n​\nindex_params.add_index(​\n field_name=\"tags\", # Name of the Array field to index​\n index_type=\"AUTOINDEX\", # Index type​\n index_name=\"inverted_index\" # Index name​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"tags\")​\n .indexName(\"inverted_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'inverted_index',​\n field_name: 'tags',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, such as L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n"," indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_array_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_array_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_array_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_array_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n]​\n​\nclient.insert(​\n collection_name=\"my_array_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"pop\\\", \\\"rock\\\", \\\"classic\\\"], \\\"ratings\\\": [5, 4, 3], \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"jazz\\\", \\\"blues\\\"], \\\"ratings\\\": [4, 5], \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"electronic\\\", \\\"dance\\\"], \\\"ratings\\\": [3, 3, 4], \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_array_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n];​\n​\nclient.insert({​\n collection_name: \"my_array_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n } ​\n ],​\n \"collectionName\": \"my_array_collection\"​\n}'​\n\n","filter = 'ratings[0] < 4'​\n​\nres = client.query(​\n collection_name=\"my_array_collection\",​\n filter=filter,​\n output_fields=[\"tags\", \"ratings\", \"embedding\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"ratings[0] < 4\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_array_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​\n\n","client.query({​\n collection_name: 'my_array_collection',​\n filter: 'ratings[0] < 4',​\n output_fields: ['tags', 'ratings', 'embedding']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"filter\": \"ratings[0] < 4\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"embedding\":[0.67,0.45,0.89],\"pk\":3,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[3,3,4]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"electronic\",\"dance\"]}}}}]}​\n\n","filter = 'tags[0] == \"pop\"'​\n​\nres = client.search(​\n collection_name=\"my_array_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"tags\", \"ratings\", \"embedding\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"tags[0] == \\\"pop\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_array_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_array_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['tags', 'ratings', 'embdding'],​\n filter: 'tags[0] == \"pop\"'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"filter\": \"tags[0] == \\\"pop\\\"\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"embedding\":[0.12,0.34,0.56],\"id\":1,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[5,4,3]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"pop\",\"rock\",\"classic\"]}}}}]}​\n\n"],"headingContent":"Array Field​","anchorList":[{"label":"حقل المصفوفة","href":"Array-Field​","type":1,"isActive":false},{"label":"إضافة حقل مصفوفة","href":"Add-Array-field​","type":2,"isActive":false},{"label":"تعيين معلمات الفهرس","href":"Set-index-params​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-collection​","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data​","type":2,"isActive":false},{"label":"البحث والاستعلام","href":"Search-and-query​","type":2,"isActive":false},{"label":"الحدود","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.md b/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.md new file mode 100644 index 000000000..662a6fb59 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/array_data_type.md @@ -0,0 +1,630 @@ +--- +id: array_data_type.md +title: حقل المصفوفة +summary: >- + يُستخدم نوع المصفوفة لتخزين الحقول التي تحتوي على قيم متعددة من نفس نوع + البيانات. ويوفر طريقة مرنة لتخزين السمات ذات العناصر المتعددة، مما يجعلها + مفيدة بشكل خاص في السيناريوهات التي تحتاج إلى حفظ مجموعة من البيانات ذات + الصلة. في Milvus، يمكنك تخزين حقول المصفوفات جنبًا إلى جنب مع البيانات + المتجهة، مما يتيح متطلبات استعلام وتصفية أكثر تعقيدًا. +--- +

    حقل المصفوفة

    يُستخدم نوع المصفوفة لتخزين الحقول التي تحتوي على قيم متعددة من نفس نوع البيانات. يوفر طريقة مرنة لتخزين السمات ذات العناصر المتعددة، مما يجعلها مفيدة بشكل خاص في السيناريوهات التي تحتاج إلى حفظ مجموعة من البيانات ذات الصلة. في Milvus، يمكنك تخزين حقول المصفوفات جنبًا إلى جنب مع البيانات المتجهة، مما يتيح متطلبات استعلام وتصفية أكثر تعقيدًا.

    +

    على سبيل المثال، في نظام التوصية بالموسيقى، يمكن لحقل المصفوفة تخزين قائمة علامات لأغنية ما؛ وفي تحليل سلوك المستخدم، يمكن تخزين تقييمات المستخدمين للأغاني. فيما يلي مثال لحقل مصفوفة نموذجي.

    +
    {​
    +  "tags": ["pop", "rock", "classic"],​
    +  "ratings": [5, 4, 3]​
    +}​
    +
    +
    +

    في هذا المثال، tags و ratings كلاهما حقلا مصفوفة. الحقل tags عبارة عن مصفوفة سلاسل تمثل أنواع الأغاني مثل البوب والروك والكلاسيكية، بينما الحقل ratings عبارة عن مصفوفة أعداد صحيحة تمثل تقييمات المستخدمين للأغنية، والتي تتراوح من 1 إلى 5. توفر حقول المصفوفات هذه طريقة مرنة لتخزين البيانات متعددة القيم، مما يسهل إجراء تحليل مفصل أثناء الاستعلامات والتصفية.

    +

    إضافة حقل مصفوفة

    لاستخدام حقول المصفوفات في Milvus، قم بتعريف نوع الحقل ذي الصلة عند إنشاء مخطط المجموعة. تتضمن هذه العملية.

    +
      +
    1. تعيين datatype إلى نوع بيانات المصفوفات المدعوم، ARRAY.

    2. +
    3. استخدام المعلمة element_type لتحديد نوع بيانات العناصر في المصفوفة. يمكن أن يكون هذا أي نوع بيانات قياسي مدعوم من قبل Milvus، مثل VARCHAR أو INT64. يجب أن تكون جميع العناصر في نفس المصفوفة من نفس نوع البيانات.

    4. +
    5. استخدام المعلمة max_capacity لتحديد السعة القصوى للمصفوفة، أي الحد الأقصى لعدد العناصر التي يمكن أن تحتويها.

    6. +
    +

    إليك كيفية تعريف مخطط مجموعة يتضمن حقول المصفوفات.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +# Add an Array field with elements of type VARCHAR​
    +schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​
    +# Add an Array field with elements of type INT64​
    +schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​
    +​
    +# Add primary field​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("tags")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(10)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("ratings")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.Int64)​
    +        .maxCapacity(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "tags",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 10,​
    +    max_length: 65535​
    +  },​
    +  {​
    +    name: "rating",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.Int64,​
    +    max_capacity: 5,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export arrayField1='{​
    +    "fieldName": "tags",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_capacity": 10,​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export arrayField2='{​
    +    "fieldName": "ratings",​
    +    "dataType": "Array",​
    +    "elementDataType": "Int64",​
    +    "elementTypeParams": {​
    +        "max_capacity": 5​
    +    }​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $arrayField1,​
    +        $arrayField2,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    في هذا المثال

    +
      +
    • tags هي مصفوفة سلاسل مع ضبط element_type على VARCHAR ، مما يشير إلى أن العناصر في المصفوفة يجب أن تكون سلاسل. max_capacity مضبوطة على 10، مما يعني أن المصفوفة يمكن أن تحتوي على ما يصل إلى 10 عناصر.

    • +
    • ratings هي مصفوفة عدد صحيح مع تعيين element_type إلى INT64 ، مما يشير إلى أن العناصر يجب أن تكون أعدادًا صحيحة. max_capacity مضبوط على 5، مما يسمح بما يصل إلى 5 تصنيفات.

    • +
    • نضيف أيضًا حقل مفتاح أساسي pk وحقل متجه embedding.

    • +
    +
    +

    يكون الحقل الأساسي وحقل المتجه إلزاميًا عند إنشاء مجموعة. يعرّف الحقل الأساسي كل كيان بشكل فريد، في حين أن الحقل المتجه مهم للبحث عن التشابه. للمزيد من التفاصيل، راجع الحقل الأساسي والمعرف التلقائي أو المتجه الكثيف أو المتجه الثنائي أو المتجه المتناثر.

    +
    +

    تعيين معلمات الفهرس

    يعد تعيين معلمات الفهرس لحقول المصفوفة أمرًا اختياريًا ولكن يمكن أن يحسن كفاءة الاسترجاع بشكل كبير.

    +

    في المثال التالي، نقوم بإنشاء AUTOINDEX للحقل tags ، مما يعني أن ميلفوس سيقوم تلقائيًا بإنشاء فهرس قياسي مناسب بناءً على نوع البيانات.

    + +
    # Prepare index parameters​
    +index_params = client.prepare_index_params()  # Prepare IndexParams object​
    +​
    +index_params.add_index(​
    +    field_name="tags",  # Name of the Array field to index​
    +    index_type="AUTOINDEX",  # Index type​
    +    index_name="inverted_index"  # Index name​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("tags")​
    +        .indexName("inverted_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'inverted_index',​
    +    field_name: 'tags',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    بالإضافة إلى AUTOINDEX ، يمكنك تحديد أنواع الفهارس العددية الأخرى مثل INVERTED أو BITMAP. لمعرفة أنواع الفهارس المدعومة، راجع الفهارس العددية.

    +

    علاوة على ذلك، يجب عليك إنشاء فهرس للحقل المتجه قبل إنشاء المجموعة. في هذا المثال، نستخدم في هذا المثال AUTOINDEX لتبسيط إعداد الفهرس المتجه.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, such as L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
     indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    إنشاء مجموعة

    استخدم المخطط المحدد ومعلمات الفهرس لإنشاء مجموعة.

    + +
    client.create_collection(​
    +    collection_name="my_array_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_array_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_array_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، يمكنك إدراج البيانات التي تتضمن حقول المصفوفة.

    + +
    data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_array_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"tags\": [\"pop\", \"rock\", \"classic\"], \"ratings\": [5, 4, 3], \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"jazz\", \"blues\"], \"ratings\": [4, 5], \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"electronic\", \"dance\"], \"ratings\": [3, 3, 4], \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_array_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }       ​
    +    ],​
    +    "collectionName": "my_array_collection"​
    +}'​
    +
    +
    +

    في هذا المثال

    +
      +
    • يتضمن كل إدخال بيانات حقلًا أساسيًا (pk)، بينما tags و ratings هما حقلا مصفوفة يستخدمان لتخزين العلامات والتقييمات.

    • +
    • embedding هو حقل متجه ثلاثي الأبعاد يستخدم لعمليات البحث عن التشابه المتجه.

    • +
    +

    البحث والاستعلام

    تعمل حقول المصفوفات على تمكين التصفية العددية أثناء عمليات البحث، مما يعزز قدرات البحث المتجهية في ميلفوس. يمكنك الاستعلام بناءً على خصائص حقول المصفوفات إلى جانب عمليات البحث عن التشابه المتجه.

    +

    تصفية الاستعلامات

    يمكنك تصفية البيانات استنادًا إلى خصائص حقول المصفوفة، مثل الوصول إلى عنصر معين أو التحقق مما إذا كان عنصر المصفوفة يفي بشرط معين.

    + +
    filter = 'ratings[0] < 4'​
    +​
    +res = client.query(​
    +    collection_name="my_array_collection",​
    +    filter=filter,​
    +    output_fields=["tags", "ratings", "embedding"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "ratings[0] < 4";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_array_collection',​
    +    filter: 'ratings[0] < 4',​
    +    output_fields: ['tags', 'ratings', 'embedding']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "filter": "ratings[0] < 4",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"embedding":[0.67,0.45,0.89],"pk":3,"ratings":{"Data":{"LongData":{"data":[3,3,4]}}},"tags":{"Data":{"StringData":{"data":["electronic","dance"]}}}}]}​
    +
    +
    +

    في هذا الاستعلام، يقوم Milvus بتصفية الكيانات التي يكون فيها العنصر الأول من المصفوفة ratings أقل من 4، مع إرجاع الكيانات التي تطابق الشرط.

    +

    البحث المتجه مع تصفية المصفوفة

    من خلال الجمع بين تشابه المتجهات مع تصفية المصفوفات، يمكنك التأكد من أن البيانات المسترجعة ليست متشابهة في الدلالات فحسب، بل تفي أيضًا بشروط محددة، مما يجعل نتائج البحث أكثر دقة وتوافقًا مع احتياجات العمل.

    + +
    filter = 'tags[0] == "pop"'​
    +​
    +res = client.search(​
    +    collection_name="my_array_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["tags", "ratings", "embedding"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "tags[0] == \"pop\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_array_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['tags', 'ratings', 'embdding'],​
    +    filter: 'tags[0] == "pop"'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "filter": "tags[0] == \"pop\"",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"distance":-0.24793813,"embedding":[0.12,0.34,0.56],"id":1,"ratings":{"Data":{"LongData":{"data":[5,4,3]}}},"tags":{"Data":{"StringData":{"data":["pop","rock","classic"]}}}}]}​
    +
    +
    +

    في هذا المثال، يقوم Milvus بإرجاع أفضل 5 كيانات الأكثر تشابهًا مع متجه الاستعلام، حيث يكون العنصر الأول في مصفوفة tags هو "pop".

    +

    بالإضافة إلى ذلك، يدعم ميلفوس عوامل تصفية المصفوفات المتقدمة مثل ARRAY_CONTAINS و ARRAY_CONTAINS_ALL و ARRAY_CONTAINS_ANY و ARRAY_LENGTH لتعزيز قدرات الاستعلام. لمزيد من التفاصيل، راجع تصفية البيانات الوصفية.

    +

    الحدود

      +
    • نوع البيانات: يجب أن تحتوي جميع العناصر في حقل المصفوفة على نفس نوع البيانات، كما هو محدد في element_type.

    • +
    • سعة المصفوفة: يجب أن يكون عدد العناصر في حقل المصفوفة أقل من أو يساوي السعة القصوى المحددة عند إنشاء المصفوفة، كما هو محدد في max_capacity.

    • +
    • التعامل مع السلسلة: يتم تخزين قيم السلسلة في حقول المصفوفات كما هي، دون هروب دلالي أو تحويل. على سبيل المثال، يتم تخزين 'a"b' و "a'b" و 'a\'b' و "a\"b" كما تم إدخالها، بينما 'a'b' و "a"b" تعتبر قيمًا غير صالحة.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.json b/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.json new file mode 100644 index 000000000..718e55485 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=128)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"binary_vector\")​\n .dataType(DataType.BinaryVector)​\n .dimension(128)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"binary vector\",​\n data_type: DataType.BinaryVector,​\n dim: 128,​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"binary_vector\",​\n \"dataType\": \"BinaryVector\",​\n \"elementTypeParams\": {​\n \"dim\": 128​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ],​\n \\\"enableDynamicField\\\": true​\n}\"​\n​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"binary_vector\",​\n index_name=\"binary_vector_index\",​\n index_type=\"BIN_IVF_FLAT\",​\n metric_type=\"HAMMING\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexParams = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexParams.add(IndexParam.builder()​\n .fieldName(\"binary_vector\")​\n .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​\n .metricType(IndexParam.MetricType.HAMMING)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n indexName: \"binary_vector_index\",​\n field_name: \"binary_vector\",​\n metric_type: MetricType.HAMMING,​\n index_type: IndexType.BIN_IVF_FLAT,​\n params: {​\n nlist: 128,​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"binary_vector\",​\n \"metricType\": \"HAMMING\",​\n \"indexName\": \"binary_vector_index\",​\n \"indexType\": \"BIN_IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_binary_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","def convert_bool_list_to_bytes(bool_list):​\n if len(bool_list) % 8 != 0:​\n raise ValueError(\"The length of a boolean list must be a multiple of 8\")​\n​\n byte_array = bytearray(len(bool_list) // 8)​\n for i, bit in enumerate(bool_list):​\n if bit == 1:​\n index = i // 8​\n shift = i % 8​\n byte_array[index] |= (1 << shift)​\n return bytes(byte_array)​\n​\n​\nbool_vectors = [​\n [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​\n [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​\n]​\n​\ndata = [{\"binary_vector\": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​\n​\nclient.insert(​\n collection_name=\"my_binary_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nprivate static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​\n byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​\n for (int i = 0; i < booleanArray.length; i++) {​\n if (booleanArray[i]) {​\n int index = i / Byte.SIZE;​\n int shift = i % Byte.SIZE;​\n byteArray[index] |= (byte) (1 << shift);​\n }​\n }​\n​\n return byteArray;​\n}​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n{​\n boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_binary_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"data\\\": $data,​\n \\\"collectionName\\\": \\\"my_binary_collection\\\"​\n}\"​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​\nquery_vector = convert_bool_list_to_bytes(query_bool_list)​\n​\nres = client.search(​\n collection_name=\"my_binary_collection\",​\n data=[query_vector],​\n anns_field=\"binary_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.BinaryVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nboolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\nBinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"binary_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\n System.out.println(searchR.getSearchResults());​\n ​\n // Output​\n //​\n // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​\n\n","query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​\n​\nclient.search({​\n collection_name: 'my_binary_collection',​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","export searchParams='{​\n \"params\":{\"nprobe\":10}​\n }'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"data\\\": $data,​\n \\\"annsField\\\": \\\"binary_vector\\\",​\n \\\"limit\\\": 5,​\n \\\"searchParams\\\":$searchParams,​\n \\\"outputFields\\\": [\\\"pk\\\"]​\n}\"​\n\n"],"headingContent":"Binary Vector​","anchorList":[{"label":"المتجهات الثنائية","href":"Binary-Vector​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام المتجهات الثنائية في ميلفوس","href":"Use-binary-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.md b/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.md new file mode 100644 index 000000000..f68a883a2 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/binary-vector.md @@ -0,0 +1,444 @@ +--- +id: binary-vector.md +title: المتجهات الثنائية +summary: >- + المتجهات الثنائية هي شكل خاص من أشكال تمثيل البيانات التي تحول متجهات الفاصلة + العائمة التقليدية عالية الأبعاد إلى متجهات ثنائية تحتوي على 0 و1 فقط. لا يؤدي + هذا التحويل إلى ضغط حجم المتجه فحسب، بل يقلل أيضًا من تكاليف التخزين والتكاليف + الحسابية مع الاحتفاظ بالمعلومات الدلالية. عندما لا تكون الدقة للخصائص غير + الحرجة ضرورية، يمكن للمتجهات الثنائية أن تحافظ بشكل فعال على معظم سلامة وفائدة + متجهات الفاصلة العائمة الأصلية. +--- +

    المتجهات الثنائية

    المتجهات الثنائية هي شكل خاص من أشكال تمثيل البيانات التي تحول متجهات الفاصلة العائمة التقليدية عالية الأبعاد إلى متجهات ثنائية تحتوي على 0 و1 فقط. لا يؤدي هذا التحويل إلى ضغط حجم المتجه فحسب، بل يقلل أيضًا من تكاليف التخزين والتكاليف الحسابية مع الاحتفاظ بالمعلومات الدلالية. عندما لا تكون الدقة للخصائص غير الحرجة ضرورية، يمكن للمتجهات الثنائية أن تحافظ بشكل فعال على معظم سلامة وفائدة متجهات الفاصلة العائمة الأصلية.

    +

    تتمتع المتجهات الثنائية بمجموعة واسعة من التطبيقات، خاصة في الحالات التي تكون فيها الكفاءة الحسابية وتحسين التخزين أمرًا بالغ الأهمية. في أنظمة الذكاء الاصطناعي واسعة النطاق، مثل محركات البحث أو أنظمة التوصية، تعد المعالجة الآنية لكميات هائلة من البيانات أمرًا أساسيًا. من خلال تقليل حجم المتجهات، تساعد المتجهات الثنائية في تقليل زمن الاستجابة والتكاليف الحسابية دون التضحية بالدقة بشكل كبير. بالإضافة إلى ذلك، تُعدّ المتجهات الثنائية مفيدة في البيئات المحدودة الموارد، مثل الأجهزة المحمولة والأنظمة المدمجة، حيث تكون الذاكرة وقوة المعالجة محدودة. من خلال استخدام المتجهات الثنائية، يمكن تنفيذ وظائف الذكاء الاصطناعي المعقدة في هذه البيئات المحدودة مع الحفاظ على الأداء العالي.

    +

    نظرة عامة

    المتجهات الثنائية هي طريقة لترميز الكائنات المعقدة (مثل الصور أو النصوص أو الصوت) إلى قيم ثنائية ذات طول ثابت. في ميلفوس، يتم تمثيل المتجهات الثنائية عادةً كمصفوفات بت أو مصفوفات بايت. على سبيل المثال، يمكن تمثيل متجه ثنائي ثنائي 8 أبعاد على شكل [1, 0, 1, 1, 0, 0, 1, 0].

    +

    يوضح الرسم البياني أدناه كيف تمثل المتجهات الثنائية وجود كلمات رئيسية في محتوى النص. في هذا المثال، يتم استخدام متجه ثنائي من 10 أبعاد لتمثيل نصين مختلفين(النص 1 والنص 2)، حيث يتوافق كل بُعد مع كلمة في المفردات: 1 يشير إلى وجود الكلمة في النص، بينما يشير 0 إلى غيابها.

    +

    + + Binary vector representation of text content + التمثيل المتجه الثنائي لمحتوى النص

    +

    تتميز المتجهات الثنائية بالخصائص التالية.

    +
      +
    • كفاءة التخزين: يتطلب كل بُعد تخزين بت واحد فقط، مما يقلل من مساحة التخزين بشكل كبير.

    • +
    • الحساب السريع: يمكن حساب التشابه بين المتجهات بسرعة باستخدام عمليات متشابهة البتات مثل XOR.

    • +
    • طول ثابت: يظل طول المتجه ثابتًا بغض النظر عن طول النص الأصلي، مما يجعل الفهرسة والاسترجاع أسهل.

    • +
    • بسيط وبديهي: يعكس مباشرةً وجود الكلمات الرئيسية، مما يجعله مناسبًا لبعض مهام الاسترجاع المتخصصة.

    • +
    +

    يمكن إنشاء المتجهات الثنائية من خلال طرق مختلفة. في معالجة النصوص، يمكن استخدام المفردات المحددة مسبقًا لتعيين البتات المقابلة بناءً على وجود الكلمات. في معالجة الصور، يمكن لخوارزميات التجزئة الإدراكية (مثل pHash) توليد ميزات ثنائية للصور. في تطبيقات التعلّم الآلي، يمكن تحويل مخرجات النماذج إلى ثنائية للحصول على تمثيلات متجهات ثنائية.

    +

    بعد تحويلها إلى متجهات ثنائية، يمكن تخزين البيانات في ميلفوس للإدارة واسترجاع المتجهات. يوضح الرسم البياني أدناه العملية الأساسية.

    +

    + + Use binary vectors in Milvus + استخدام المتجهات الثنائية في ملفوس

    +
    +

    على الرغم من أن المتجهات الثنائية تتفوق في سيناريوهات محددة، إلا أن لها قيودًا في قدرتها التعبيرية، مما يجعل من الصعب التقاط العلاقات الدلالية المعقدة. لذلك، في سيناريوهات العالم الحقيقي، غالبًا ما تُستخدم المتجهات الثنائية جنبًا إلى جنب مع أنواع المتجهات الأخرى لتحقيق التوازن بين الكفاءة والتعبير. لمزيد من المعلومات، راجع المتجهات الكثيفة والمتجهات المتفرقة.

    +
    +

    استخدام المتجهات الثنائية في ميلفوس

    إضافة حقل متجه

    لاستخدام المتجهات الثنائية في ملفوس، قم أولاً بتعريف حقل متجه لتخزين المتجهات الثنائية عند إنشاء مجموعة. تتضمن هذه العملية.

    +
      +
    1. تعيين datatype إلى نوع بيانات المتجه الثنائي المدعوم، أي BINARY_VECTOR.

    2. +
    3. تحديد أبعاد المتجه باستخدام المعلمة dim. لاحظ أنه يجب أن يكون dim من مضاعفات العدد 8 حيث يجب تحويل المتجهات الثنائية إلى مصفوفة بايت عند الإدراج. سيتم تعبئة كل 8 قيم منطقية (0 أو 1) في بايت واحد. على سبيل المثال، إذا كان dim=128 ، يلزم وجود مصفوفة 16 بايت للإدراج.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("binary_vector")​
    +        .dataType(DataType.BinaryVector)​
    +        .dimension(128)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "binary vector",​
    +  data_type: DataType.BinaryVector,​
    +  dim: 128,​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "binary_vector",​
    +    "dataType": "BinaryVector",​
    +    "elementTypeParams": {​
    +        "dim": 128​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ],​
    +    \"enableDynamicField\": true​
    +}"​
    +​
    +
    +
    +

    في هذا المثال، تمت إضافة حقل متجه باسم binary_vector لتخزين المتجهات الثنائية. نوع بيانات هذا الحقل هو BINARY_VECTOR ، ببعد 128.

    +

    تعيين بارامترات الفهرس لحقل المتجه

    لتسريع عمليات البحث، يجب إنشاء فهرس لحقل المتجه الثنائي. يمكن للفهرسة تحسين كفاءة استرجاع البيانات المتجهة واسعة النطاق بشكل كبير.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="binary_vector",​
    +    index_name="binary_vector_index",​
    +    index_type="BIN_IVF_FLAT",​
    +    metric_type="HAMMING",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexParams.add(IndexParam.builder()​
    +        .fieldName("binary_vector")​
    +        .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.HAMMING)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +  indexName: "binary_vector_index",​
    +  field_name: "binary_vector",​
    +  metric_type: MetricType.HAMMING,​
    +  index_type: IndexType.BIN_IVF_FLAT,​
    +  params: {​
    +    nlist: 128,​
    +  },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "binary_vector",​
    +            "metricType": "HAMMING",​
    +            "indexName": "binary_vector_index",​
    +            "indexType": "BIN_IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    في المثال أعلاه، يتم إنشاء فهرس باسم binary_vector_index للحقل binary_vector ، باستخدام نوع الفهرس BIN_IVF_FLAT. تم تعيين metric_type على HAMMING ، مما يشير إلى استخدام مسافة هامينج لقياس التشابه.

    +

    إلى جانب BIN_IVF_FLAT ، يدعم ميلفوس أنواع الفهارس الأخرى للمتجهات الثنائية. لمزيد من التفاصيل، راجع فهارس المتجهات الثنائية. بالإضافة إلى ذلك، يدعم ميلفوس مقاييس تشابه أخرى للمتجهات الثنائية. لمزيد من المعلومات، راجع أنواع المقاييس.

    +

    إنشاء مجموعة

    بمجرد اكتمال إعدادات المتجه الثنائي والفهرس الثنائي، قم بإنشاء مجموعة تحتوي على متجهات ثنائية. يستخدم المثال أدناه طريقة create_collection لإنشاء مجموعة باسم my_binary_collection.

    + +
    client.create_collection(​
    +    collection_name="my_binary_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، استخدم الأسلوب insert لإضافة بيانات تحتوي على متجهات ثنائية. لاحظ أنه يجب توفير المتجهات الثنائية على شكل مصفوفة بايت، حيث يمثل كل بايت 8 قيم منطقية.

    +

    على سبيل المثال، بالنسبة إلى متجه ثنائي مكون من 128 بُعدًا، يلزم توفير مصفوفة من 16 بايت (بما أن 128 بت ÷ 8 بت/بايت = 16 بايت). فيما يلي مثال على شيفرة لإدخال البيانات.

    + +
    def convert_bool_list_to_bytes(bool_list):​
    +    if len(bool_list) % 8 != 0:​
    +        raise ValueError("The length of a boolean list must be a multiple of 8")​
    +​
    +    byte_array = bytearray(len(bool_list) // 8)​
    +    for i, bit in enumerate(bool_list):​
    +        if bit == 1:​
    +            index = i // 8​
    +            shift = i % 8​
    +            byte_array[index] |= (1 << shift)​
    +    return bytes(byte_array)​
    +​
    +​
    +bool_vectors = [​
    +    [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​
    +    [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​
    +]​
    +​
    +data = [{"binary_vector": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​
    +​
    +client.insert(​
    +    collection_name="my_binary_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +private static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​
    +    byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​
    +    for (int i = 0; i < booleanArray.length; i++) {​
    +        if (booleanArray[i]) {​
    +            int index = i / Byte.SIZE;​
    +            int shift = i % Byte.SIZE;​
    +            byteArray[index] |= (byte) (1 << shift);​
    +        }​
    +    }​
    +​
    +    return byteArray;​
    +}​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +{​
    +    boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_binary_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"data\": $data,​
    +    \"collectionName\": \"my_binary_collection\"​
    +}"​
    +
    +
    +

    إجراء بحث التشابه

    البحث عن التشابه هو أحد الميزات الأساسية في ميلفوس، مما يسمح لك بالعثور بسرعة على البيانات الأكثر تشابهًا مع متجه الاستعلام بناءً على المسافة بين المتجهات. لإجراء بحث تشابه باستخدام متجهات ثنائية، قم بإعداد متجه الاستعلام ومعلمات البحث، ثم قم باستدعاء الطريقة search.

    +

    أثناء عمليات البحث، يجب أيضًا توفير المتجهات الثنائية في شكل مصفوفة بايت. تأكد من أن أبعاد متجه الاستعلام تتطابق مع البعد المحدد عند تحديد dim وأن كل 8 قيم منطقية يتم تحويلها إلى بايت واحد.

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​
    +query_vector = convert_bool_list_to_bytes(query_bool_list)​
    +​
    +res = client.search(​
    +    collection_name="my_binary_collection",​
    +    data=[query_vector],​
    +    anns_field="binary_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.BinaryVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +BinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("binary_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    + System.out.println(searchR.getSearchResults());​
    + ​
    + // Output​
    + //​
    + // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​
    +
    +
    +
    query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​
    +​
    +client.search({​
    +    collection_name: 'my_binary_collection',​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    export searchParams='{​
    +        "params":{"nprobe":10}​
    +    }'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"data\": $data,​
    +    \"annsField\": \"binary_vector\",​
    +    \"limit\": 5,​
    +    \"searchParams\":$searchParams,​
    +    \"outputFields\": [\"pk\"]​
    +}"​
    +
    +
    +

    لمزيد من المعلومات حول معلمات بحث التشابه، راجع بحث ANN الأساسي.

    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.json b/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.json new file mode 100644 index 000000000..4cf483b76 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.json @@ -0,0 +1 @@ +{"codeList":["[​\n -0.013052909,​\n 0.020387933,​\n -0.007869,​\n -0.11111383,​\n -0.030188112,​\n -0.0053388323,​\n 0.0010654867,​\n 0.072027855,​\n // ... more dimensions​\n]​\n​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=4)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(4)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"dense_vector\",​\n data_type: DataType.FloatVector,​\n dim: 128,​\n});​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"dense_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 4​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"dense_vector\",​\n index_name=\"dense_vector_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"dense_vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n index_name: 'dense_vector_index',​\n field_name: 'dense_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.IVF_FLAT,​\n params: {​\n nlist: 128​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_vector_index\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_dense_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_dense_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.7]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.8]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_dense_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.1, 0.2, 0.3, 0.4]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.2, 0.3, 0.4, 0.5]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { dense_vector: [0.1, 0.2, 0.3, 0.7] },​\n { dense_vector: [0.2, 0.3, 0.4, 0.8] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_dense_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.4]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.5]} ​\n ],​\n \"collectionName\": \"my_dense_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572531\",\"453577185629572532\"]}}​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_vector = [0.1, 0.2, 0.3, 0.7]​\n​\nres = client.search(​\n collection_name=\"my_dense_collection\",​\n data=[query_vector],​\n anns_field=\"dense_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"dense_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​\n\n","query_vector = [0.1, 0.2, 0.3, 0.7];​\n​\nclient.search({​\n collection_name: my_dense_collection,​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dense_collection\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.7]​\n ],​\n \"annsField\": \"dense_vector\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.55,\"id\":\"453577185629572532\",\"pk\":\"453577185629572532\"},{\"distance\":0.42,\"id\":\"453577185629572531\",\"pk\":\"453577185629572531\"}]}​\n\n"],"headingContent":"Dense Vector​","anchorList":[{"label":"المتجهات الكثيفة","href":"Dense-Vector​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام المتجهات الكثيفة في ميلفوس","href":"Use-dense-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.md b/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.md new file mode 100644 index 000000000..3afe8dac4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/dense-vector.md @@ -0,0 +1,432 @@ +--- +id: dense-vector.md +title: المتجهات الكثيفة +summary: >- + المتجهات الكثيفة هي تمثيلات رقمية للبيانات تُستخدم على نطاق واسع في التعلم + الآلي وتحليل البيانات. وهي تتكون من مصفوفات بأرقام حقيقية، حيث تكون معظم + العناصر أو جميعها غير صفرية. بالمقارنة مع المتجهات المتفرّقة، تحتوي المتجهات + الكثيفة على المزيد من المعلومات على نفس مستوى الأبعاد، حيث يحتوي كل بُعد على + قيم ذات معنى. يمكن لهذا التمثيل التقاط أنماط وعلاقات معقدة بشكل فعال، مما يسهل + تحليل البيانات ومعالجتها في مساحات عالية الأبعاد. عادةً ما تحتوي المتجهات + الكثيفة على عدد ثابت من الأبعاد، يتراوح بين بضع عشرات إلى عدة مئات أو حتى آلاف + الأبعاد، اعتمادًا على التطبيق والمتطلبات المحددة. +--- +

    المتجهات الكثيفة

    المتجهات الكثيفة هي تمثيلات رقمية للبيانات تُستخدم على نطاق واسع في التعلم الآلي وتحليل البيانات. وهي تتكون من مصفوفات بأرقام حقيقية، حيث تكون معظم العناصر أو جميعها غير صفرية. بالمقارنة مع المتجهات المتناثرة، تحتوي المتجهات الكثيفة على المزيد من المعلومات على نفس مستوى الأبعاد، حيث يحتوي كل بُعد على قيم ذات معنى. يمكن لهذا التمثيل التقاط أنماط وعلاقات معقدة بشكل فعال، مما يسهل تحليل البيانات ومعالجتها في مساحات عالية الأبعاد. عادةً ما تحتوي المتجهات الكثيفة على عدد ثابت من الأبعاد، يتراوح بين بضع عشرات إلى عدة مئات أو حتى الآلاف، اعتمادًا على التطبيق والمتطلبات المحددة.

    +

    تُستخدم المتجهات الكثيفة بشكل أساسي في السيناريوهات التي تتطلب فهم دلالات البيانات، مثل أنظمة البحث الدلالي والتوصيات. في البحث الدلالي، تساعد المتجهات الكثيفة في التقاط الروابط الأساسية بين الاستعلامات والمستندات، مما يحسن من أهمية نتائج البحث. أما في أنظمة التوصيات، فهي تساعد في تحديد أوجه التشابه بين المستخدمين والعناصر، مما يوفر اقتراحات أكثر تخصيصًا.

    +

    نظرة عامة

    عادةً ما يتم تمثيل المتجهات الكثيفة كمصفوفات من أرقام الفاصلة العائمة ذات الطول الثابت، مثل [0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5]. تتراوح أبعاد هذه المتجهات عادةً من مئات إلى آلاف الأبعاد، مثل 128 أو 256 أو 768 أو 1024. ويلتقط كل بُعد سمات دلالية محددة لكائن ما، مما يجعلها قابلة للتطبيق على سيناريوهات مختلفة من خلال حسابات التشابه.

    +

    + + Dense vectors in 2D space + المتجهات الكثيفة في الفضاء ثنائي الأبعاد

    +

    توضح الصورة أعلاه تمثيل المتجهات الكثيفة في فضاء ثنائي الأبعاد. على الرغم من أن المتجهات الكثيفة في تطبيقات العالم الحقيقي غالبًا ما يكون لها أبعاد أعلى بكثير، إلا أن هذا الرسم التوضيحي ثنائي الأبعاد ينقل بشكل فعال العديد من المفاهيم الأساسية.

    +
      +
    • التمثيل متعدد الأبعاد: تمثل كل نقطة كائنًا مفاهيميًا (مثل ميلفوس وقاعدة بيانات المتجهات ونظام الاسترجاع، إلخ)، مع تحديد موضعها من خلال قيم أبعادها.

    • +
    • العلاقات الدلالية: تعكس المسافات بين النقاط التشابه الدلالي بين المفاهيم. تشير النقاط الأقرب إلى المفاهيم الأكثر ارتباطاً من الناحية الدلالية.

    • +
    • تأثير التجميع: يتم وضع المفاهيم ذات الصلة (مثل ميلفوس وقاعدة البيانات المتجهة ونظام الاسترجاع) بالقرب من بعضها البعض في الفضاء، مما يشكل مجموعة دلالية.

    • +
    +

    فيما يلي مثال لمتجه كثيف حقيقي يمثل النص "Milvus is an efficient vector database".

    +
    [​
    +    -0.013052909,​
    +    0.020387933,​
    +    -0.007869,​
    +    -0.11111383,​
    +    -0.030188112,​
    +    -0.0053388323,​
    +    0.0010654867,​
    +    0.072027855,​
    +    // ... more dimensions​
    +]​
    +​
    +
    +
    +

    يمكن توليد المتجهات الكثيفة باستخدام نماذج تضمين مختلفة، مثل نماذج CNN (مثل ResNet وVGG) للصور ونماذج اللغة (مثل BERT وWord2Vec) للنصوص. تقوم هذه النماذج بتحويل البيانات الأولية إلى نقاط في فضاء عالي الأبعاد، مع التقاط السمات الدلالية للبيانات. بالإضافة إلى ذلك، يوفر Milvus طرقًا ملائمة لمساعدة المستخدمين على إنشاء متجهات كثيفة ومعالجتها، كما هو مفصل في Embedddings.

    +

    بمجرد تحويل البيانات إلى متجهات، يمكن تخزينها في ميلفوس لإدارتها واسترجاع المتجهات. يوضح الرسم البياني أدناه العملية الأساسية.

    +

    + + Use dense vecctors in Milvus + استخدام المتجهات الكثيفة في ملفوس

    +
    +

    إلى جانب المتجهات الكثيفة، يدعم Milvus أيضًا المتجهات المتفرقة والمتجهات الثنائية. تعد المتجهات المتفرقة مناسبة للمطابقات الدقيقة بناءً على مصطلحات محددة، مثل البحث عن الكلمات الرئيسية ومطابقة المصطلحات، بينما تُستخدم المتجهات الثنائية بشكل شائع للتعامل بكفاءة مع البيانات ثنائية الثنائية، مثل مطابقة أنماط الصور وبعض تطبيقات التجزئة. لمزيد من المعلومات، راجع المتجهات الثنائية والمتجهات المتفرقة.

    +
    +

    استخدام المتجهات الكثيفة في ميلفوس

    إضافة حقل متجه

    لاستخدام المتجهات الكثيفة في ملفوس، قم أولاً بتعريف حقل متجه لتخزين المتجهات الكثيفة عند إنشاء مجموعة. تتضمن هذه العملية.

    +
      +
    1. تعيين datatype إلى نوع بيانات متجه كثيف مدعوم. لمعرفة أنواع بيانات المتجهات الكثيفة المدعومة، راجع أنواع البيانات.

    2. +
    3. تحديد أبعاد المتجه الكثيف باستخدام المعلمة dim.

    4. +
    +

    في المثال أدناه، نضيف حقلاً متجهًا باسم dense_vector لتخزين المتجهات الكثيفة. نوع بيانات الحقل هو FLOAT_VECTOR ، بأبعاد 4.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(4)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "dense_vector",​
    +  data_type: DataType.FloatVector,​
    +  dim: 128,​
    +});​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "dense_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 4​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    أنواع البيانات المدعومة لحقول المتجهات الكثيفة:

    + + + + + + + + + +
    النوعالوصف
    FLOAT_VECTORيخزن الأرقام ذات الفاصلة العائمة 32 بت، وتستخدم عادةً لتمثيل الأرقام الحقيقية في الحسابات العلمية والتعلم الآلي. مثالية للسيناريوهات التي تتطلب دقة عالية، مثل تمييز المتجهات المتشابهة.
    FLOAT16_VECTORيخزن الأرقام ذات الفاصلة العائمة بنصف دقة 16 بت، وتستخدم للتعلم العميق وحسابات وحدة معالجة الرسومات. يوفر مساحة تخزين في السيناريوهات التي تكون فيها الدقة أقل أهمية، كما هو الحال في مرحلة الاستدعاء منخفضة الدقة لأنظمة التوصيات.
    BFLOAT16_VECTORيخزّن أرقام الفاصلة العائمة الدماغية ذات 16 بت (bfloat16)، حيث يقدم نفس نطاق الأسس مثل Float32 ولكن بدقة أقل. مناسب للسيناريوهات التي تحتاج إلى معالجة كميات كبيرة من المتجهات بسرعة، مثل استرجاع الصور على نطاق واسع.
    +

    تعيين بارامترات الفهرس لحقل المتجهات

    لتسريع عمليات البحث الدلالية، يجب إنشاء فهرس للحقل المتجه. يمكن للفهرسة تحسين كفاءة استرجاع البيانات المتجهة واسعة النطاق بشكل كبير.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="dense_vector",​
    +    index_name="dense_vector_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("dense_vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +    index_name: 'dense_vector_index',​
    +    field_name: 'dense_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.IVF_FLAT,​
    +    params: {​
    +      nlist: 128​
    +    },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense_vector",​
    +            "metricType": "IP",​
    +            "indexName": "dense_vector_index",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    في المثال أعلاه، يتم إنشاء فهرس باسم dense_vector_index للحقل dense_vector باستخدام نوع الفهرس IVF_FLAT. تم تعيين metric_type على IP ، مما يشير إلى أنه سيتم استخدام المنتج الداخلي كمقياس للمسافة.

    +

    يدعم ميلفوس أنواع الفهارس الأخرى أيضًا. لمزيد من التفاصيل، راجع فهارس المتجهات العائمة. بالإضافة إلى ذلك، يدعم Milvus أنواع مقاييس أخرى. لمزيد من المعلومات، راجع أنواع المقاييس.

    +

    إنشاء مجموعة

    بمجرد اكتمال إعدادات المتجهات الكثيفة ومعلمة الفهرس يمكنك إنشاء مجموعة تحتوي على متجهات كثيفة. يستخدم المثال أدناه طريقة create_collection لإنشاء مجموعة باسم my_dense_collection.

    + +
    client.create_collection(​
    +    collection_name="my_dense_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_dense_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، استخدم الطريقة insert لإضافة بيانات تحتوي على متجهات كثيفة. تأكد من أن أبعاد المتجهات الكثيفة التي يتم إدراجها تتطابق مع القيمة dim المحددة عند إضافة حقل المتجهات الكثيفة.

    + +
    data = [​
    +    {"dense_vector": [0.1, 0.2, 0.3, 0.7]},​
    +    {"dense_vector": [0.2, 0.3, 0.4, 0.8]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_dense_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.1, 0.2, 0.3, 0.4]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.2, 0.3, 0.4, 0.5]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { dense_vector: [0.1, 0.2, 0.3, 0.7] },​
    +  { dense_vector: [0.2, 0.3, 0.4, 0.8] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_dense_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"dense_vector": [0.1, 0.2, 0.3, 0.4]},​
    +        {"dense_vector": [0.2, 0.3, 0.4, 0.5]}        ​
    +    ],​
    +    "collectionName": "my_dense_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572531","453577185629572532"]}}​
    +
    +
    +

    إجراء بحث التشابه

    يعد البحث الدلالي المستند إلى المتجهات الكثيفة إحدى الميزات الأساسية في ميلفوس، مما يسمح لك بالعثور بسرعة على البيانات الأكثر تشابهًا مع متجه الاستعلام بناءً على المسافة بين المتجهات. لإجراء بحث عن التشابه، قم بإعداد متجه الاستعلام ومعلمات البحث، ثم اتصل بالطريقة search.

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_vector = [0.1, 0.2, 0.3, 0.7]​
    +​
    +res = client.search(​
    +    collection_name="my_dense_collection",​
    +    data=[query_vector],​
    +    anns_field="dense_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("dense_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​
    +
    +
    +
    query_vector = [0.1, 0.2, 0.3, 0.7];​
    +​
    +client.search({​
    +    collection_name: my_dense_collection,​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dense_collection",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.7]​
    +    ],​
    +    "annsField": "dense_vector",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.55,"id":"453577185629572532","pk":"453577185629572532"},{"distance":0.42,"id":"453577185629572531","pk":"453577185629572531"}]}​
    +
    +
    +

    للمزيد من المعلومات حول معلمات البحث عن التشابه، راجع بحث التشابه الأساسي.

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.json b/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.json new file mode 100644 index 000000000..72602bd52 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient= MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.create_collection(​\n collection_name=\"my_dynamic_collection\",​\n dimension=5,​\n # highlight-next-line​\n enable_dynamic_field=True​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .dimension(5)​\n // highlight-next-line​\n .enableDynamicField(true)​\n .build()​\nclient.createCollection(createCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new Client({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: \"customized_setup_2\",​\n schema: schema,​\n // highlight-next-line​\n enable_dynamic_field: true​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"dimension\": 5,​\n \"enableDynamicField\": true​\n}'​\n\n","[​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n\n","data=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"my_dynamic_collection\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n ​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"my_dynamic_collection\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_dynamic_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\"',​\n output_fields=[\"color\"]​\n # highlight-end​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(queryVector))​\n .outputFields(Collections.singletonList(\"color\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .topK(5)​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​\n​\n\n","const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: \"color like \\\"red%\\\"\",​\n output_fields: [\"color\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"distance\":0.6290165,\"id\":1},{\"color\":\"red_4794\",\"distance\":0.5975797,\"id\":4},{\"color\":\"red_9392\",\"distance\":-0.24996185,\"id\":6}]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Dynamic Field​","anchorList":[{"label":"الحقل الديناميكي","href":"Dynamic-Field​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"تمكين الحقل الديناميكي","href":"Enable-dynamic-field​","type":2,"isActive":false},{"label":"استخدام الحقل الديناميكي","href":"Use-dynamic-field​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.md b/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.md new file mode 100644 index 000000000..d41d9e7d9 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/enable-dynamic-field.md @@ -0,0 +1,381 @@ +--- +id: enable-dynamic-field.md +title: تمكين الحقل الديناميكي +summary: >- + يجب تضمين جميع الحقول المحددة في مخطط المجموعة في الكيانات المراد إدراجها. إذا + كنت تريد أن تكون بعض الحقول اختيارية، ففكر في تمكين الحقل الديناميكي. يصف هذا + الموضوع كيفية تمكين الحقل الديناميكي واستخدامه. +--- +

    الحقل الديناميكي

    يجب تضمين جميع الحقول المحددة في مخطط المجموعة في الكيانات المراد إدراجها. إذا كنت تريد أن تكون بعض الحقول اختيارية، ففكر في تمكين الحقل الديناميكي. يصف هذا الموضوع كيفية تمكين الحقل الديناميكي واستخدامه.

    +

    نظرة عامة

    في ملفوس، يمكنك إنشاء مخطط مجموعة من خلال تعيين الأسماء وأنواع البيانات لكل حقل في المجموعة. عند إضافة حقل إلى المخطط، تأكد من تضمين هذا الحقل في الكيان الذي تنوي إدراجه. إذا كنت تريد أن تكون بعض الحقول اختيارية، فإن تمكين الحقل الديناميكي هو أحد الخيارات.

    +

    الحقل الديناميكي هو حقل محجوز يسمى $meta ، وهو من نوع JavaScript Object Notation (JSON). سيتم تخزين أي حقول في الكيانات التي لم يتم تعريفها في المخطط في حقل JSON المحجوز هذا كأزواج قيمة مفتاح-قيمة.

    +

    بالنسبة للمجموعة الممكّنة للحقل الديناميكي، يمكنك استخدام المفاتيح في الحقل الديناميكي للتصفية العددية، تمامًا كما تفعل مع الحقول المحددة صراحةً في المخطط.

    +

    تمكين الحقل الديناميكي

    يتم تمكين الحقل الديناميكي افتراضيًا في المجموعات التي تم إنشاؤها باستخدام الطريقة الموضحة في إنشاء مجموعة على الفور. يمكنك أيضًا تمكين الحقل الديناميكي يدويًا عند إنشاء مجموعة بإعدادات مخصصة.

    + +
    from pymilvus import MilvusClient​
    +​
    +client= MilvusClient(uri="http://localhost:19530")​
    +​
    +client.create_collection(​
    +    collection_name="my_dynamic_collection",​
    +    dimension=5,​
    +    # highlight-next-line​
    +    enable_dynamic_field=True​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +    .collectionName("my_dynamic_collection")​
    +    .dimension(5)​
    +    // highlight-next-line​
    +    .enableDynamicField(true)​
    +    .build()​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new Client({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    enable_dynamic_field: true​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "dimension": 5,​
    +    "enableDynamicField": true​
    +}'​
    +
    +
    +

    استخدام الحقل الديناميكي

    عندما يتم تمكين الحقل الديناميكي في مجموعتك، سيتم تخزين جميع الحقول وقيمها التي لم يتم تعريفها في المخطط كأزواج مفاتيح-قيم في الحقل الديناميكي.

    +

    على سبيل المثال، لنفترض أن مخطط مجموعتك يحدد حقلين فقط، وهما id و vector ، مع تمكين الحقل الديناميكي. الآن، أدخل مجموعة البيانات التالية في هذه المجموعة.

    +
    [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +
    +
    +

    تحتوي مجموعة البيانات أعلاه على 10 كيانات، يتضمن كل منها الحقول id و vector و color. هنا، لم يتم تعريف الحقل color في المخطط. نظرًا لأن المجموعة تحتوي على الحقل الديناميكي، فسيتم تخزين الحقل color كزوج من مفتاح وقيمة داخل الحقل الديناميكي.

    +

    إدراج البيانات

    يوضح الرمز التالي كيفية إدراج مجموعة البيانات هذه في المجموعة.

    + +
    data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="my_dynamic_collection",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +   ​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "my_dynamic_collection"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    الاستعلام والبحث باستخدام الحقل الديناميكي

    يدعم ميلفوس استخدام تعبيرات التصفية أثناء الاستعلامات وعمليات البحث، مما يسمح لك بتحديد الحقول التي يجب تضمينها في النتائج. يوضح المثال التالي كيفية إجراء الاستعلامات وعمليات البحث باستخدام الحقل color ، الذي لم يتم تعريفه في المخطط، باستخدام الحقل الديناميكي.

    + +
    query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_dynamic_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%"',​
    +    output_fields=["color"]​
    +    # highlight-end​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(queryVector))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .filter("color like \"red%\"")​
    +        .topK(5)​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​
    +​
    +
    +
    +
    const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: "color like \"red%\"",​
    +    output_fields: ["color"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"color":"red_7025","distance":0.6290165,"id":1},{"color":"red_4794","distance":0.5975797,"id":4},{"color":"red_9392","distance":-0.24996185,"id":6}]}​
    +
    +
    +

    في تعبير التصفية المستخدم في مثال الكود أعلاه، color like "red%" and likes > 50 ، تحدد الشروط أن قيمة الحقل color يجب أن تبدأ بـ "أحمر". في نموذج البيانات، يستوفي كيانان فقط هذا الشرط. وبالتالي، عندما يتم تعيين limit (topK) على 3 أو أقل، سيتم إرجاع كلا هذين الكيانين.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.json b/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.json new file mode 100644 index 000000000..c5028a592 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri='http://localhost:19530')​\n​\n# Define collection schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, nullable=True) # Nullable field​\n​\n# Set index params​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\n# Create collection​\nclient.create_collection(collection_name=\"user_profiles_null\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .isNullable(true)​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_null\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.Int64, dim: 5 },​\n​\n { name: \"age\", data_type: DataType.FloatVector, nullable: true },​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.AUTOINDEX,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport nullField='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"nullable\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $nullField​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_null\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": None},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}​\n]​\n​\nclient.insert(collection_name=\"user_profiles_null\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6], \\\"age\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​\n { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​\n { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_null\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]} ​\n ],​\n \"collectionName\": \"user_profiles_null\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_null\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n limit=2,​\n search_params={\"params\": {\"nprobe\": 16}},​\n output_fields=[\"id\", \"age\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .topK(2)​\n .searchParams(params)​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​\n\n","client.search({​\n collection_name: 'user_profiles_null',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id'],​\n filter: '25 <= age <= 35',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"data\": [​\n [0.1, -0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n#{\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"distance\":0.16000001,\"id\":1},{\"age\":null,\"distance\":0.28999996,\"id\":2},{\"age\":null,\"distance\":0.52000004,\"id\":3}]}​\n\n","# Reviewing previously inserted data:​\n# {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30}​\n# {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129], \"age\": None}​\n# {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": None} # Omitted age column is treated as None​\n​\nresults = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"age >= 0\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [​\n# {\"id\": 1, \"age\": 30}​\n# ]​\n# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"age >= 0\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=1, age=30})]​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"age >= 0\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"filter\": \"age >= 0\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1}]}​\n\n","null_results = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [{\"id\": 2, \"age\": None}, {\"id\": 3, \"age\": None}]​\n\n","QueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .limit(10)​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"expr\": \"\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1},{\"age\":null,\"id\":2},{\"age\":null,\"id\":3}]}​\n\n","schema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, default_value=18)​\nschema.add_field(field_name=\"status\", datatype=DataType.VARCHAR, default_value=\"active\", max_length=10)​\n​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\nclient.create_collection(collection_name=\"user_profiles_default\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .defaultValue(18L)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"status\")​\n .dataType(DataType.VarChar)​\n .maxLength(10)​\n .defaultValue(\"active\")​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_default\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.FloatVector, dim: 5 },​\n { name: \"age\", data_type: DataType.Int64, default_value: 18 },​\n { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.IVF_FLAT,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport defaultValueField1='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"defaultValue\": 18​\n}'​\n​\nexport defaultValueField2='{​\n \"fieldName\": \"status\",​\n \"dataType\": \"VarChar\",​\n \"defaultValue\": \"active\",​\n \"elementTypeParams\": {​\n \"max_length\": 10​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $defaultValueField1,​\n $defaultValueField2​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_default\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129]},\n {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": 25, \"status\": None}, \n {\"id\": 4, \"vector\": [0.4, 0.5, ..., 0.131], \"age\": None, \"status\": \"inactive\"} \n]​\n​\nclient.insert(collection_name=\"user_profiles_default\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30, \\\"status\\\": \\\"premium\\\"}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7], \\\"age\\\": 25, \\\"status\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4, 0.5, 0.6, 0.7, 0.8], \\\"age\\\": null, \\\"status\\\": \\\"inactive\\\"}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_default\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n ],​\n \"collectionName\": \"user_profiles_default\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_default\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n search_params={\"params\": {\"nprobe\": 16}},​\n filter=\"age == 18\", # 18 is the default value of the `age` field​\n limit=10,​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .searchParams(params)​\n .filter(\"age == 18\")​\n .topK(10)​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​\n\n","client.search({​\n collection_name: 'user_profiles_default',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id', 'status'],​\n filter: 'age == 18',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"distance\":0.050000004,\"id\":2,\"status\":\"active\"},{\"age\":18,\"distance\":0.45000002,\"id\":4,\"status\":\"inactive\"}]}​\n\n","# Query all entities where `age` equals the default value (18)​\ndefault_age_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter=\"age == 18\",​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\n# Query all entities where `status` equals the default value (\"active\")​\ndefault_status_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter='status == \"active\"',​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp ageResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"age == 18\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(ageResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​\n​\nQueryResp statusResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"status == \\\"active\\\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(statusResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​\n\n","// Query all entities where `age` equals the default value (18)​\nconst default_age_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: \"age == 18\",​\n output_fields: [\"id\", \"age\", \"status\"]​\n);​\n// Query all entities where `status` equals the default value (\"active\")​\nconst default_status_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: 'status == \"active\"',​\n output_fields: [\"id\", \"age\", \"status\"]​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":18,\"id\":4,\"status\":\"inactive\"}]}​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"status == \\\"active\\\"\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":25,\"id\":3,\"status\":\"active\"}]}​\n\n"],"headingContent":"Nullable & Default​","anchorList":[{"label":"قابل للإلغاء والافتراضي","href":"Nullable--Default​","type":1,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"السمة القابلة للإلغاء","href":"Nullable-attribute","type":2,"isActive":false},{"label":"القيم الافتراضية","href":"Default-values​","type":2,"isActive":false},{"label":"القواعد المطبقة","href":"Applicable-rules","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.md b/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.md new file mode 100644 index 000000000..4fccafd8a --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/nullable-and-default.md @@ -0,0 +1,877 @@ +--- +id: nullable-and-default.md +title: قابل للإلغاء والافتراضي +related_key: 'nullable, default' +summary: >- + يسمح لك Milvus بتعيين السمة "لاغية" والقيم الافتراضية للحقول القياسية، + باستثناء الحقل الأساسي. بالنسبة للحقول التي تم وضع علامة "لاغية=صحيح"، يمكنك + تخطي الحقل عند إدراج البيانات، أو تعيينه مباشرة إلى قيمة لاغية وسيتعامل النظام + معه على أنه لاغٍ دون التسبب في حدوث خطأ. +--- +

    قابل للإلغاء والافتراضي

    يسمح لك Milvus بتعيين السمة nullable والقيم الافتراضية للحقول القياسية، باستثناء الحقل الأساسي. بالنسبة للحقول التي تم وضع علامة nullable=True ، يمكنك تخطي الحقل عند إدراج البيانات، أو تعيينه مباشرة إلى قيمة فارغة، وسيتعامل النظام معه على أنه فارغ دون التسبب في حدوث خطأ. عندما يكون للحقل قيمة افتراضية، سيقوم النظام تلقائيًا بتطبيق هذه القيمة إذا لم يتم تحديد بيانات للحقل أثناء الإدراج.

    +

    تعمل القيمة الافتراضية والسمات القابلة للإلغاء على تبسيط عملية ترحيل البيانات من أنظمة قواعد البيانات الأخرى إلى ميلفوس من خلال السماح بمعالجة مجموعات البيانات ذات القيم الفارغة والحفاظ على إعدادات القيمة الافتراضية. عند إنشاء مجموعة، يمكنك أيضًا تمكين القيم القابلة للإلغاء أو تعيين قيم افتراضية للحقول التي قد تكون القيم فيها غير مؤكدة.

    +

    الحدود

      +
    • تدعم الحقول العددية فقط، باستثناء الحقل الأساسي، القيم الافتراضية والسمة القابلة للإلغاء.

    • +
    • لا تدعم حقول JSON و Array القيم الافتراضية.

    • +
    • يمكن تكوين القيم الافتراضية أو السمة القابلة للإلغاء فقط أثناء إنشاء المجموعة ولا يمكن تعديلها بعد ذلك.

    • +
    • لا يمكن استخدام الحقول العددية ذات السمة القابلة للإلغاء الممكّنة كـ group_by_field في بحث التجميع. لمزيد من المعلومات حول بحث التجميع، راجع بحث التجميع.

    • +
    • لا يمكن استخدام الحقول التي تم وضع علامة لاغية عليها كمفاتيح تقسيم. لمزيد من المعلومات حول مفاتيح التقسيم، راجع استخدام مفتاح التقسيم.

    • +
    • عند إنشاء فهرس على حقل قياسي مع تمكين السمة القابلة للفراغ، سيتم استبعاد القيم الفارغة من الفهرس.

    • +
    +

    السمة القابلة للإلغاء

    تتيح لك السمة nullable تخزين القيم الفارغة في مجموعة، مما يوفر مرونة عند التعامل مع البيانات غير المعروفة.

    +

    تعيين السمة القابلة للفراغ

    عند إنشاء مجموعة، استخدم nullable=True لتعريف الحقول القابلة للفراغ (الإعدادات الافتراضية إلى False). يقوم المثال التالي بإنشاء مجموعة باسم user_profiles_null وتعيين الحقل age كحقل قابل للإلغاء.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri='http://localhost:19530')​
    +​
    +# Define collection schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True) # Nullable field​
    +​
    +# Set index params​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +# Create collection​
    +client.create_collection(collection_name="user_profiles_null", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .isNullable(true)​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_null",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.Int64, dim: 5 },​
    +​
    +    { name: "age", data_type: DataType.FloatVector, nullable: true },​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.AUTOINDEX,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export nullField='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "nullable": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $nullField​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_null\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج الكيانات

    عندما تقوم بإدراج بيانات في حقل قابل للإلغاء، قم بإدراج لاغية أو احذف هذا الحقل مباشرةً.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": None},​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]}​
    +]​
    +​
    +client.insert(collection_name="user_profiles_null", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​
    +  { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​
    +  { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_null",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": null}, ​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]} ​
    +    ],​
    +    "collectionName": "user_profiles_null"​
    +}'​
    +
    +
    +

    البحث والاستعلام بقيم فارغة

    عند استخدام الأسلوب search ، إذا كان الحقل يحتوي على قيم null ، فإن نتيجة البحث ستعيد الحقل على أنه فارغ.

    + +
    res = client.search(​
    +    collection_name="user_profiles_null",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    limit=2,​
    +    search_params={"params": {"nprobe": 16}},​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .topK(2)​
    +        .searchParams(params)​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_null',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id'],​
    +    filter: '25 <= age <= 35',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "data": [​
    +        [0.1, -0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +#{"code":0,"cost":0,"data":[{"age":30,"distance":0.16000001,"id":1},{"age":null,"distance":0.28999996,"id":2},{"age":null,"distance":0.52000004,"id":3}]}​
    +
    +
    +

    عند استخدام الأسلوب query للتصفية العددية، تكون نتائج التصفية للقيم الفارغة كلها خاطئة، مما يشير إلى أنه لن يتم تحديدها.

    + +
    # Reviewing previously inserted data:​
    +# {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30}​
    +# {"id": 2, "vector": [0.2, 0.3, ..., 0.129], "age": None}​
    +# {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": None}  # Omitted age  column is treated as None​
    +​
    +results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="age >= 0",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [​
    +#     {"id": 1, "age": 30}​
    +# ]​
    +# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("age >= 0")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=1, age=30})]​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "age >= 0",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "filter": "age >= 0",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1}]}​
    +
    +
    +

    للاستعلام عن كيانات بقيم null ، استخدم تعبيرًا فارغًا "".

    + +
    null_results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [{"id": 2, "age": None}, {"id": 3, "age": None}]​
    +
    +
    +
    QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .limit(10)​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "expr": "",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1},{"age":null,"id":2},{"age":null,"id":3}]}​
    +
    +
    +

    القيم الافتراضية

    القيم الافتراضية هي قيم محددة مسبقًا للحقول القياسية. إذا لم تقم بتوفير قيمة لحقل بقيم افتراضية أثناء الإدراج، يستخدم النظام تلقائيًا القيمة الافتراضية.

    +

    تعيين القيم الافتراضية

    عند إنشاء مجموعة، استخدم المعلمة default_value لتحديد القيمة الافتراضية للحقل. يوضح المثال التالي كيفية تعيين القيمة الافتراضية age إلى 18 و status إلى "active".

    + +
    schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)​
    +schema.add_field(field_name="status", datatype=DataType.VARCHAR, default_value="active", max_length=10)​
    +​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +client.create_collection(collection_name="user_profiles_default", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .defaultValue(18L)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("status")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(10)​
    +        .defaultValue("active")​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_default",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.FloatVector, dim: 5 },​
    +    { name: "age", data_type: DataType.Int64, default_value: 18 },​
    +    { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.IVF_FLAT,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export defaultValueField1='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "defaultValue": 18​
    +}'​
    +​
    +export defaultValueField2='{​
    +    "fieldName": "status",​
    +    "dataType": "VarChar",​
    +    "defaultValue": "active",​
    +    "elementTypeParams": {​
    +        "max_length": 10​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $defaultValueField1,​
    +        $defaultValueField2​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_default\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج الكيانات

    عند إدراج البيانات، إذا قمت بحذف الحقول ذات القيمة الافتراضية أو تعيين قيمتها إلى لا شيء، يستخدم النظام القيمة الافتراضية.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, ..., 0.129]},
    +    {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": 25, "status": None}, 
    +    {"id": 4, "vector": [0.4, 0.5, ..., 0.131], "age": None, "status": "inactive"} 
    +]​
    +​
    +client.insert(collection_name="user_profiles_default", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +    {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}  ​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_default",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]},​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +        {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}      ​
    +    ],​
    +    "collectionName": "user_profiles_default"​
    +}'​
    +
    +
    +
    +

    لمزيد من المعلومات حول كيفية تفعيل إعدادات القيمة الفارغة والافتراضية، راجع القواعد القابلة للتطبيق.

    +
    +

    البحث والاستعلام بالقيم الافتراضية

    يتم التعامل مع الكيانات التي تحتوي على قيم افتراضية مثل أي كيانات أخرى أثناء عمليات البحث المتجه والتصفية القياسية. يمكنك تضمين القيم الافتراضية كجزء من عمليات search و query الخاصة بك.

    +

    على سبيل المثال، في عملية search ، سيتم تضمين الكيانات التي تحتوي على age على القيمة الافتراضية 18 في النتائج.

    + +
    res = client.search(​
    +    collection_name="user_profiles_default",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    search_params={"params": {"nprobe": 16}},​
    +    filter="age == 18",  # 18 is the default value of the `age` field​
    +    limit=10,​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .searchParams(params)​
    +        .filter("age == 18")​
    +        .topK(10)​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_default',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id', 'status'],​
    +    filter: 'age == 18',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"distance":0.050000004,"id":2,"status":"active"},{"age":18,"distance":0.45000002,"id":4,"status":"inactive"}]}​
    +
    +
    +

    في عملية query ، يمكنك المطابقة أو التصفية حسب القيم الافتراضية مباشرةً.

    + +
    # Query all entities where `age` equals the default value (18)​
    +default_age_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter="age == 18",​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +# Query all entities where `status` equals the default value ("active")​
    +default_status_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter='status == "active"',​
    +    output_fields=["id", "age", "status"]​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp ageResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("age == 18")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(ageResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​
    +​
    +QueryResp statusResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("status == \"active\"")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(statusResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​
    +
    +
    +
    // Query all entities where `age` equals the default value (18)​
    +const default_age_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: "age == 18",​
    +    output_fields: ["id", "age", "status"]​
    +);​
    +// Query all entities where `status` equals the default value ("active")​
    +const default_status_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: 'status == "active"',​
    +    output_fields: ["id", "age", "status"]​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":18,"id":4,"status":"inactive"}]}​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "status == \"active\"",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":25,"id":3,"status":"active"}]}​
    +
    +
    +

    القواعد المطبقة

    يلخّص الجدول التالي سلوك الأعمدة القابلة للإلغاء والقيم الافتراضية ضمن مجموعات تكوين مختلفة. تحدد هذه القواعد كيفية تعامل Milvus مع البيانات عند محاولة إدراج قيم فارغة أو إذا لم يتم توفير قيم الحقل.

    + + + + + + + + + + + +
    قابل للفراغالقيمة الافتراضيةنوع القيمة الافتراضيةإدخال المستخدمالنتيجةمثال
    غير فارغةلا شيء/لاغيةيستخدم القيمة الافتراضية
    • الحقل: age
    • القيمة الافتراضية: 18
    • إدخال المستخدم: فارغة
    • النتيجة: يتم تخزينها كـ 18
    -لا شيء / فارغمخزنة على أنها لاغية
    • الحقل:
    • middle_name
    • القيمة الافتراضية:
    • -مدخلات
    • المستخدم
    • : فارغة
    • النتيجة: مخزنة على أنها فارغة
    غير فارغةلا شيء / لاغيةيستخدم القيمة الافتراضية
    • الحقل:
    • status
    • القيمة الافتراضية:
    • "active"
    • مدخلات المستخدم: فارغة
    • النتيجة: مخزنة كـ "active"
    -لا شيء / فارغيلقي خطأ
    • الحقل:
    • email
    • القيمة الافتراضية:
    • -إدخال
    • المستخدم
    • : فارغ
    • النتيجة: العملية مرفوضة، يقوم النظام بإلقاء خطأ
    لا يوجدلا شيء / فارغيلقي خطأ
    • الحقل:
    • username
    • القيمة الافتراضية:
    • فارغةإدخال
    • المستخدم
    • : فارغة
    • النتيجة: العملية مرفوضة، يقوم النظام بإلقاء خطأ
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/number.json b/localization/v2.5.x/site/ar/userGuide/schema/number.json new file mode 100644 index 000000000..29eef8f6b --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/number.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64)​\nschema.add_field(field_name=\"price\", datatype=DataType.FLOAT)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"price\")​\n .dataType(DataType.Float)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"age\",​\n data_type: DataType.Int64,​\n },​\n {​\n name: \"price\",​\n data_type: DataType.Float,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n​\n\n","export int64Field='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport floatField='{​\n \"fieldName\": \"price\",​\n \"dataType\": \"Float\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $int64Field,​\n $floatField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"age\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"inverted_index\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"age\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n​\n\n","const indexParams = {​\n index_name: 'inverted_index',​\n field_name: 'age',​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","import { IndexType } from \"@zilliz/milvus2-sdk-node\";​\nconst indexParams = [​\n {​\n field_name: \"age\",​\n index_name: \"inverted_index\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n {​\n field_name: \"embedding\",​\n metric_type: \"COSINE\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n];​\n​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_scalar_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_scalar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_scalar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"age\\\": 25, \\\"price\\\": 99.99, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 30, \\\"price\\\": 149.50, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 35, \\\"price\\\": 199.99, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​\n { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​\n { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_scalar_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_scalar_collection\"​\n}'​\n\n","filter = \"30 <= age <= 40\"​\n​\nres = client.query(​\n collection_name=\"my_scalar_collection\",​\n filter=filter,​\n output_fields=[\"age\",\"price\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'age': 30, 'price': np.float32(149.5), 'pk': 2}\", \"{'age': 35, 'price': np.float32(199.99), 'pk': 3}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"30 <= age <= 40\";​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .build());​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: '30 <= age <= 40',​\n output_fields: ['age', 'price']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"filter\": \"30 <= age <= 40\",​\n \"outputFields\": [\"age\",\"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"pk\":2,\"price\":149.5},{\"age\":35,\"pk\":3,\"price\":199.99}]}​\n\n","filter = \"25 <= age <= 35\"​\n​\nres = client.search(​\n collection_name=\"my_scalar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"age\",\"price\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"25 <= age <= 35\";​\n​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_scalar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['age', 'price'],​\n filter: '25 <= age <= 35'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"outputFields\": [\"age\", \"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":35,\"distance\":-0.19054288,\"id\":3,\"price\":199.99},{\"age\":30,\"distance\":-0.20163085,\"id\":2,\"price\":149.5},{\"age\":25,\"distance\":-0.2364331,\"id\":1,\"price\":99.99}]}​\n\n"],"headingContent":"Number Field​","anchorList":[{"label":"حقول الأرقام","href":"Number-Field​","type":1,"isActive":false},{"label":"أنواع حقول الأرقام المدعومة","href":"Supported-number-field-types​","type":2,"isActive":false},{"label":"إضافة حقل رقم","href":"Add-number-field​","type":2,"isActive":false},{"label":"تعيين معلمات الفهرس","href":"Set-index-params​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-collection​","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data​","type":2,"isActive":false},{"label":"البحث والاستعلام","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/number.md b/localization/v2.5.x/site/ar/userGuide/schema/number.md new file mode 100644 index 000000000..a5a3ce87f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/number.md @@ -0,0 +1,567 @@ +--- +id: number.md +title: حقول الأرقام +related_key: 'number, integer, float, double' +summary: >- + تُستخدم حقول الأرقام لتخزين البيانات العددية غير المتجهة في ميلفوس. تُستخدم + هذه الحقول عادةً لوصف المعلومات الإضافية المتعلقة ببيانات المتجهات، مثل العمر + والسعر وما إلى ذلك. باستخدام هذه البيانات، يمكنك وصف المتجهات بشكل أفضل وتحسين + كفاءة تصفية البيانات والاستعلامات الشرطية. +--- +

    حقول الأرقام

    تُستخدم حقول الأرقام لتخزين البيانات الرقمية غير المتجهة في ملفوس. تُستخدم هذه الحقول عادةً لوصف المعلومات الإضافية المتعلقة ببيانات المتجهات، مثل العمر والسعر وما إلى ذلك. باستخدام هذه البيانات، يمكنك وصف المتجهات بشكل أفضل وتحسين كفاءة تصفية البيانات والاستعلامات الشرطية.

    +

    تعتبر حقول الأرقام مفيدة بشكل خاص في العديد من السيناريوهات. على سبيل المثال، في توصيات التجارة الإلكترونية، يمكن استخدام حقل السعر للتصفية؛ في تحليل الملف الشخصي للمستخدم، يمكن أن تساعد النطاقات العمرية في تنقيح النتائج. بالاقتران مع البيانات المتجهة، يمكن أن تساعد حقول الأرقام النظام في توفير عمليات بحث متشابهة مع تلبية احتياجات المستخدم الشخصية بدقة أكبر.

    +

    أنواع حقول الأرقام المدعومة

    يدعم Milvus أنواع حقول أرقام مختلفة لتلبية احتياجات تخزين البيانات والاستعلام المختلفة.

    +

    النوع

    +

    الوصف

    +

    BOOL

    +

    نوع منطقي لتخزين true أو false ، مناسب لوصف الحالات الثنائية.

    +

    INT8

    +

    عدد صحيح 8 بت، مناسب لتخزين البيانات الصحيحة ذات النطاق الصغير.

    +

    INT16

    +

    عدد صحيح 16 بت، مناسب لبيانات الأعداد الصحيحة متوسطة المدى.

    +

    INT32

    +

    عدد صحيح 32 بت، مثالي لتخزين البيانات الصحيحة العامة مثل كميات المنتجات أو معرّفات المستخدم.

    +

    INT64

    +

    عدد صحيح 64 بت، مناسب لتخزين البيانات ذات النطاق الكبير مثل الطوابع الزمنية أو المعرفات.

    +

    FLOAT

    +

    رقم عائم 32 بت، للبيانات التي تتطلب دقة عامة، مثل التصنيفات أو درجة الحرارة.

    +

    DOUBLE

    +

    رقم ذو فاصلة عائمة مزدوجة الدقة 64 بت، للبيانات عالية الدقة مثل المعلومات المالية أو الحسابات العلمية.

    +
    +

    إضافة حقل رقم

    لاستخدام حقول الأرقام في Milvus، قم بتعريف الحقول ذات الصلة في مخطط المجموعة، مع تعيين datatype إلى نوع مدعوم مثل BOOL أو INT8. للحصول على قائمة كاملة بأنواع حقول الأرقام المدعومة، راجع أنواع حقول الأرقام المدعومة.

    +

    يوضح المثال التالي كيفية تعريف مخطط يتضمن حقول الأرقام age و price.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="age", datatype=DataType.INT64)​
    +schema.add_field(field_name="price", datatype=DataType.FLOAT)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("price")​
    +        .dataType(DataType.Float)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "age",​
    +    data_type: DataType.Int64,​
    +  },​
    +  {​
    +    name: "price",​
    +    data_type: DataType.Float,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export floatField='{​
    +    "fieldName": "price",​
    +    "dataType": "Float"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $int64Field,​
    +        $floatField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +
    +

    الحقل الأساسي وحقل المتجه إلزاميان عند إنشاء مجموعة. يعرّف الحقل الأساسي كل كيان بشكل فريد، بينما يعد الحقل المتجه ضروريًا للبحث عن التشابه. لمزيد من التفاصيل، راجع الحقل الأساسي والمعرف التلقائي أو المتجه الكثيف أو المتجه الثنائي أو المتجه المتناثر.

    +
    +

    تعيين معلمات الفهرس

    يعد تعيين معلمات الفهرس لحقول الأرقام أمرًا اختياريًا ولكن يمكن أن يحسن كفاءة الاسترجاع بشكل كبير.

    +

    في المثال التالي، نقوم بإنشاء AUTOINDEX لحقل الرقم age ، مما يسمح لـ Milvus بإنشاء فهرس مناسب تلقائيًا بناءً على نوع البيانات. لمزيد من المعلومات، راجع AUTOINDEX.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="age",​
    +    index_type="AUTOINDEX",​
    +    index_name="inverted_index"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("age")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'inverted_index',​
    +    field_name: 'age',​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    بالإضافة إلى AUTOINDEX ، يمكنك تحديد أنواع فهرس حقول الأرقام الأخرى. لمعرفة أنواع الفهارس المدعومة، راجع الفهارس العددية.

    +

    علاوة على ذلك، قبل إنشاء المجموعة، يجب إنشاء فهرس للحقل المتجه. في هذا المثال، نستخدم في هذا المثال AUTOINDEX لتبسيط إعدادات فهرس المتجه.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    import { IndexType } from "@zilliz/milvus2-sdk-node";​
    +const indexParams = [​
    +  {​
    +    field_name: "age",​
    +    index_name: "inverted_index",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +  {​
    +    field_name: "embedding",​
    +    metric_type: "COSINE",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +];​
    +​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    إنشاء مجموعة

    بمجرد تحديد المخطط والفهارس، يمكنك إنشاء مجموعة تتضمن حقول الأرقام.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_scalar_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_scalar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، يمكنك إدراج البيانات التي تتضمن حقول الأرقام.

    + +
    data = [​
    +    {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_scalar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​
    +  { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​
    +  { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_scalar_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +        {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +        {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_scalar_collection"​
    +}'​
    +
    +
    +

    في هذا المثال، نقوم بإدراج البيانات التي تتضمن age ، price ، pk (الحقل الأساسي)، والتمثيلات المتجهة (embedding). للتأكد من أن البيانات المدرجة تتطابق مع الحقول المحددة في المخطط، يوصى بالتحقق من أنواع البيانات مسبقًا لتجنب الأخطاء.

    +

    إذا قمت بتعيين enable_dynamic_fields=True عند تعريف المخطط، يسمح لك ميلفوس بإدراج حقول الأرقام التي لم يتم تعريفها مسبقًا. ومع ذلك، ضع في اعتبارك أن هذا قد يزيد من تعقيد الاستعلامات والإدارة، مما قد يؤثر على الأداء. لمزيد من المعلومات، راجع الحقل الديناميكي.

    +

    البحث والاستعلام

    بعد إضافة حقول الأرقام، يمكنك استخدامها للتصفية في عمليات البحث والاستعلام لتحقيق نتائج بحث أكثر دقة.

    +

    تصفية الاستعلامات

    بعد إضافة حقول الأرقام، يمكنك استخدامها للتصفية في الاستعلامات. على سبيل المثال، يمكنك الاستعلام عن جميع الكيانات التي يتراوح فيها age بين 30 و40.

    + +
    filter = "30 <= age <= 40"​
    +​
    +res = client.query(​
    +    collection_name="my_scalar_collection",​
    +    filter=filter,​
    +    output_fields=["age","price"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'age': 30, 'price': np.float32(149.5), 'pk': 2}", "{'age': 35, 'price': np.float32(199.99), 'pk': 3}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "30 <= age <= 40";​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .build());​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: '30 <= age <= 40',​
    +    output_fields: ['age', 'price']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "filter": "30 <= age <= 40",​
    +    "outputFields": ["age","price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":30,"pk":2,"price":149.5},{"age":35,"pk":3,"price":199.99}]}​
    +
    +
    +

    يُرجع تعبير الاستعلام هذا جميع الكيانات المطابقة ويُخرج حقولها age و price. لمزيد من المعلومات حول استعلامات التصفية، راجع تصفية البيانات الوصفية.

    +

    البحث المتجه مع تصفية الأرقام

    بالإضافة إلى تصفية حقول الأرقام الأساسية، يمكنك دمج عمليات البحث عن التشابه المتجه مع مرشحات حقول الأرقام. على سبيل المثال، يوضح الرمز التالي كيفية إضافة عامل تصفية حقل رقمي إلى بحث متجه.

    + +
    filter = "25 <= age <= 35"​
    +​
    +res = client.search(​
    +    collection_name="my_scalar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["age","price"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "25 <= age <= 35";​
    +​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_scalar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['age', 'price'],​
    +    filter: '25 <= age <= 35'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "outputFields": ["age", "price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":35,"distance":-0.19054288,"id":3,"price":199.99},{"age":30,"distance":-0.20163085,"id":2,"price":149.5},{"age":25,"distance":-0.2364331,"id":1,"price":99.99}]}​
    +
    +
    +

    في هذا المثال، نحدد أولًا متجه استعلام ونضيف شرط تصفية 25 <= age <= 35 أثناء البحث. هذا يضمن أن نتائج البحث لا تتشابه مع متجه الاستعلام فحسب، بل تفي أيضًا بالنطاق العمري المحدد. لمزيد من المعلومات، راجع تصفية البيانات الوصفية.

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/primary-field.json b/localization/v2.5.x/site/ar/userGuide/schema/primary-field.json new file mode 100644 index 000000000..7b2192f21 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/primary-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n​\nschema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n // highlight-end​\n .build());​\n);​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"pk\",​\n description: \"ID field\",​\n data_type: DataType.VARCHAR,​\n is_primary_key: true,​\n max_length: 100,​\n },​\n];​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.VARCHAR,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n max_length=512,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.VarChar)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(512)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.VarChar,​\n // highlight-start​\n is_primary_key: true,​\n autoID: true,​\n maxLength: 512​\n // highlight-end​\n});​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ],​\n \\\"params\\\": {​\n \\\"max_length\\\": 512​\n }​\n}\"​\n\n"],"headingContent":"Primary Field & AutoID​","anchorList":[{"label":"الحقل الأساسي والمعرف التلقائي","href":"Primary-Field--AutoID​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام المفاتيح الأساسية Int64","href":"Use-Int64-Primary-Keys​","type":2,"isActive":false},{"label":"استخدام المفاتيح الأساسية VarChar المتغيرة","href":"Use-VarChar-Primary-Keys​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/primary-field.md b/localization/v2.5.x/site/ar/userGuide/schema/primary-field.md new file mode 100644 index 000000000..c9775673c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/primary-field.md @@ -0,0 +1,195 @@ +--- +id: primary-field.md +title: الحقل الأساسي والمعرف التلقائي +summary: >- + يحدد الحقل الأساسي هوية الكيان بشكل فريد. تقدم هذه الصفحة كيفية إضافة الحقل + الأساسي لنوعين مختلفين من البيانات وكيفية تمكين ميلفوس من تخصيص قيم الحقل + الأساسي تلقائياً. +--- +

    الحقل الأساسي والمعرف التلقائي

    يحدد الحقل الأساسي هوية الكيان بشكل فريد. تقدم هذه الصفحة كيفية إضافة الحقل الأساسي لنوعين مختلفين من البيانات، وكيفية تمكين ميلفوس من تخصيص قيم الحقل الأساسي تلقائياً.

    +

    نظرة عامة

    في المجموعة، يجب أن يكون المفتاح الأساسي لكل كيان فريدًا عالميًا. عند إضافة الحقل الأساسي، تحتاج إلى تعيين نوع بياناته صراحةً إلى VARCHAR أو INT64. يشير تعيين نوع بياناته إلى INT64 إلى أن المفاتيح الأساسية يجب أن تكون عددًا صحيحًا مشابهًا لـ 12345 ؛ يشير تعيين نوع بياناته إلى VARCHAR إلى أن المفاتيح الأساسية يجب أن تكون سلسلة مشابهة لـ my_entity_1234.

    +

    يمكنك أيضًا تمكين AutoID لجعل Milvus يخصص المفاتيح الأساسية تلقائيًا للكيانات الواردة. بمجرد تمكين AutoID في مجموعتك، لا تقم بتضمين المفاتيح الأساسية عند إدراج الكيانات.

    +

    لا يحتوي الحقل الأساسي في المجموعة على قيمة افتراضية ولا يمكن أن يكون فارغًا.

    +

    استخدام المفاتيح الأساسية Int64

    لاستخدام المفاتيح الأساسية من النوع Int64، تحتاج إلى تعيين datatype إلى DataType.INT64 وتعيين is_primary إلى true. إذا كنت تحتاج أيضًا إلى أن يخصص ميلفوس المفاتيح الأساسية للكيانات الواردة، فقم أيضًا بتعيين auto_id إلى true.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +​
    +schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        // highlight-end​
    +        .build());​
    +);​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "pk",​
    +    description: "ID field",​
    +    data_type: DataType.VARCHAR,​
    +    is_primary_key: true,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}"​
    +
    +
    +

    استخدام المفاتيح الأساسية VarChar المتغيرة

    لاستخدام مفاتيح VarChar الأساسية، بالإضافة إلى تغيير قيمة المعلمة data_type إلى DataType.VARCHAR ، تحتاج أيضًا إلى تعيين المعلمة max_length للحقل.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    max_length=512,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(512)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.VarChar,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: true,​
    +    maxLength: 512​
    +    // highlight-end​
    +});​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ],​
    +    \"params\": {​
    +        \"max_length\": 512​
    +    }​
    +}"​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.json b/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.json new file mode 100644 index 000000000..a0becea8b --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\ncollection_name = \"my_collection\"​\n​\n# client = MilvusClient(uri=\"http://localhost:19530\")​\nclient = MilvusClient(uri=\"./milvus_demo.db\")​\n​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n)​\n​\nschema.add_field(field_name=\"article_id\", datatype=DataType.INT64, is_primary=True, description=\"article id\")​\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=200, description=\"article title\")​\nschema.add_field(field_name=\"author_info\", datatype=DataType.JSON, description=\"author information\")​\nschema.add_field(field_name=\"publish_ts\", datatype=DataType.INT32, description=\"publish timestamp\")​\nschema.add_field(field_name=\"image_url\", datatype=DataType.VARCHAR, max_length=500, description=\"image URL\")​\nschema.add_field(field_name=\"image_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"image vector\")​\nschema.add_field(field_name=\"summary\", datatype=DataType.VARCHAR, max_length=1000, description=\"article summary\")​\nschema.add_field(field_name=\"summary_dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"summary dense vector\")​\nschema.add_field(field_name=\"summary_sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR, description=\"summary sparse vector\")​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"image_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_dense_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_sparse_vector\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"publish_ts\",​\n index_type=\"INVERTED\",​\n)​\n\n","client.create_collection(​\n collection_name=collection_name,​\n schema=schema,​\n index_params=index_params,​\n)​\n\n","collection_desc = client.describe_collection(​\n collection_name=collection_name​\n)​\nprint(collection_desc)​\n\n"],"headingContent":"Schema Design Hands-On​","anchorList":[{"label":"التدريب العملي على تصميم المخطط","href":"Schema-Design-Hands-On​","type":1,"isActive":false},{"label":"مثال على ذلك: البحث عن الأخبار","href":"An-Example-News-Search​","type":1,"isActive":false},{"label":"كيفية تنفيذ مخطط المثال","href":"How-to-Implement-the-Example-Schema​","type":1,"isActive":false},{"label":"إنشاء مخطط","href":"Create-Schema​","type":2,"isActive":false},{"label":"تعريف الفهرس","href":"Define-Index​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-Collection​","type":2,"isActive":false},{"label":"اعتبارات أخرى","href":"Other-Considerations​","type":1,"isActive":false},{"label":"تحميل الفهرس","href":"Loading-Index​","type":2,"isActive":false},{"label":"كيفية تعريف نموذج البيانات للمستأجرين المتعددين","href":"How-to-Define-Data-Model-For-Multi-tenancy​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.md b/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.md new file mode 100644 index 000000000..c0e86c7a0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/schema-hands-on.md @@ -0,0 +1,270 @@ +--- +id: schema-hands-on.md +title: التدريب العملي على تصميم المخطط +summary: >- + يدعم Milvus تحديد نموذج البيانات من خلال مخطط مجموعة. وتنظم المجموعة البيانات + غير المهيكلة مثل النصوص والصور، إلى جانب تمثيلاتها المتجهية، بما في ذلك + المتجهات الكثيفة والمتناثرة بدقة مختلفة تستخدم للبحث الدلالي. بالإضافة إلى + ذلك، يدعم Milvus تخزين وتصفية أنواع البيانات غير المتجهة التي تسمى "Scalar". + تشمل الأنواع العددية BOOL و INT8/16/32/64 و FLOAT/DOUBLE و VARCHAR و JSON و + Array. +--- +

    التدريب العملي على تصميم المخطط

    تُعد أنظمة استرجاع المعلومات (IR)، والمعروفة أيضًا باسم البحث، ضرورية لتطبيقات الذكاء الاصطناعي المختلفة مثل التوليد المعزز للاسترجاع (RAG) والبحث عن الصور والتوصية بالمنتجات. تتمثل الخطوة الأولى في تطوير نظام استرجاع المعلومات في تصميم نموذج البيانات، والذي يتضمن تحليل متطلبات العمل، وتحديد كيفية تنظيم المعلومات، وفهرسة البيانات لجعلها قابلة للبحث الدلالي.

    +

    يدعم Milvus تحديد نموذج البيانات من خلال مخطط تجميع. وتنظم المجموعة البيانات غير المهيكلة مثل النصوص والصور، إلى جانب تمثيلاتها المتجهة، بما في ذلك المتجهات الكثيفة والمتناثرة بدقة مختلفة تستخدم للبحث الدلالي. بالإضافة إلى ذلك، يدعم Milvus تخزين وتصفية أنواع البيانات غير المتجهة التي تسمى "Scalar". تشمل الأنواع العددية BOOL و INT8/16/32/64 و FLOAT/DOUBLE و VARCHAR و JSON و Array.

    +

    + + Example data schema designed for searching news article + مثال على مخطط بيانات مصمم للبحث في مقالة إخبارية

    +

    يتضمن تصميم نموذج البيانات لنظام البحث تحليل احتياجات العمل وتجريد المعلومات في نموذج بيانات معبّر عن المخطط. على سبيل المثال، للبحث في جزء من النص، يجب "فهرسته" عن طريق تحويل السلسلة الحرفية إلى متجه من خلال "التضمين"، مما يتيح البحث في المتجه. بالإضافة إلى هذا الشرط الأساسي، قد يكون من الضروري تخزين خصائص أخرى مثل الطابع الزمني للنشر والمؤلف. تسمح هذه البيانات الوصفية بتنقيح عمليات البحث الدلالي من خلال التصفية، بحيث لا تُعيد سوى النصوص المنشورة بعد تاريخ محدد أو من قبل مؤلف معين. قد يلزم أيضًا استرجاعها مع النص الرئيسي، لعرض نتيجة البحث في التطبيق. ولتنظيم هذه الأجزاء النصية، يجب تعيين معرّف فريد لكل منها، يتم التعبير عنه كعدد صحيح أو سلسلة. هذه العناصر ضرورية لتحقيق منطق بحث متطور.

    +

    يعد المخطط المصمم جيدًا مهمًا لأنه يلخص نموذج البيانات ويقرر ما إذا كان يمكن تحقيق أهداف العمل من خلال البحث. علاوة على ذلك، نظرًا لأن كل صف من البيانات التي يتم إدراجها في المجموعة يجب أن يتبع المخطط، فإنه يساعد بشكل كبير في الحفاظ على اتساق البيانات والجودة على المدى الطويل. من من منظور تقني، يؤدي المخطط المحدد جيدًا إلى تخزين بيانات الأعمدة بشكل جيد التنظيم وهيكل فهرس أنظف، مما يمكن أن يعزز أداء البحث.

    +

    مثال على ذلك: البحث عن الأخبار

    لنفترض أننا نريد إنشاء بحث لموقع إلكتروني إخباري ولدينا مجموعة من الأخبار مع نصوص وصور مصغرة وبيانات وصفية أخرى. أولاً، نحتاج أولاً إلى تحليل كيفية استخدام البيانات لدعم متطلبات العمل الخاصة بالبحث. تخيل أن المتطلب هو استرداد الأخبار استنادًا إلى الصورة المصغرة وملخص المحتوى، وأخذ البيانات الوصفية مثل معلومات المؤلف ووقت النشر كمعايير لتصفية نتيجة البحث. يمكن تقسيم هذه المتطلبات إلى.

    +
      +
    • للبحث عن الصور من خلال النص، يمكننا تضمين الصور في متجهات عبر نموذج تضمين متعدد الوسائط يمكنه تعيين بيانات النص والصورة في نفس المساحة الكامنة.

    • +
    • يتم تضمين النص الموجز لمقالة ما في متجهات عبر نموذج تضمين النص.

    • +
    • للتصفية استنادًا إلى وقت النشر، يتم تخزين التواريخ كحقل قياسي ويلزم وجود فهرس للحقل القياسي للتصفية الفعالة. يمكن تخزين هياكل بيانات أخرى أكثر تعقيدًا مثل JSON في عدد قياسي وإجراء بحث مصفى على محتوياتها (فهرسة JSON ميزة قادمة).

    • +
    • لاسترداد الصورة المصغرة للصور بالبايت وعرضها على صفحة نتائج البحث، يتم تخزين عنوان url الخاص بالصورة أيضًا. وبالمثل، لنص الملخص والعنوان. (بدلاً من ذلك، يمكننا تخزين بيانات النص الخام وبيانات ملف الصورة كحقول قياسية إذا لزم الأمر).

    • +
    • لتحسين نتيجة البحث على النص الملخص، نقوم بتصميم نهج بحث هجين. بالنسبة لأحد مسارات الاسترجاع، نستخدم نموذج التضمين العادي لتوليد متجه كثيف من النص، مثل OpenAI's text-embedding-3-large أو نموذج bge-large-en-v1.5 المفتوح المصدر. هذه النماذج جيدة في تمثيل الدلالات الإجمالية للنص. والمسار الآخر هو استخدام نماذج التضمين المتناثر مثل BM25 أو SPLADE لتوليد متجه متناثر، يشبه البحث في النص الكامل الذي يجيد استيعاب التفاصيل والمفاهيم الفردية في النص. يدعم Milvus استخدام كليهما في نفس مجموعة البيانات بفضل ميزة المتجهات المتعددة. يمكن إجراء البحث على متجهات متعددة في عملية واحدة hybrid_search().

    • +
    • أخيرًا، نحتاج أيضًا إلى حقل معرّف لتحديد كل صفحة أخبار فردية، يشار إليه رسميًا باسم "كيان" في مصطلحات ميلفوس. يُستخدم هذا الحقل كمفتاح أساسي (أو "pk" اختصارًا).

    • +
    +

    اسم الحقل

    +

    article_id (المفتاح الأساسي)

    +

    العنوان

    +

    المؤلف_المعلومات

    +

    نشر_ت

    +

    صورة_url

    +

    متجه_الصورة

    +

    ملخص

    +

    ملخص_المتجه_الكثيف

    +

    ملخص_ملخص_المتجه_الكثيف

    +

    النوع

    +

    INT64

    +

    VARCHAR

    +

    JSON

    +

    INT32

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    متناثر_مُتجه_مُتفرق

    +

    تحتاج إلى فهرس

    +

    N

    +

    N

    +

    N (الدعم قريبًا)

    +

    Y

    +

    N

    +

    Y

    +

    N

    +

    Y

    +

    Y

    +
    +

    كيفية تنفيذ مخطط المثال

    إنشاء مخطط

    أولاً، نقوم بإنشاء مثيل عميل Milvus، والذي يمكن استخدامه للاتصال بخادم Milvus وإدارة المجموعات والبيانات.

    +

    لإعداد مخطط، نستخدم create_schema() لإنشاء كائن مخطط و add_field() لإضافة حقول إلى المخطط.

    +
    from pymilvus import MilvusClient, DataType​
    +​
    +collection_name = "my_collection"​
    +​
    +# client = MilvusClient(uri="http://localhost:19530")​
    +client = MilvusClient(uri="./milvus_demo.db")​
    +​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +)​
    +​
    +schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, description="article id")​
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200, description="article title")​
    +schema.add_field(field_name="author_info", datatype=DataType.JSON, description="author information")​
    +schema.add_field(field_name="publish_ts", datatype=DataType.INT32, description="publish timestamp")​
    +schema.add_field(field_name="image_url", datatype=DataType.VARCHAR,  max_length=500, description="image URL")​
    +schema.add_field(field_name="image_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="image vector")​
    +schema.add_field(field_name="summary", datatype=DataType.VARCHAR, max_length=1000, description="article summary")​
    +schema.add_field(field_name="summary_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="summary dense vector")​
    +schema.add_field(field_name="summary_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="summary sparse vector")​
    +
    +
    +

    قد تلاحظ الوسيطة uri في MilvusClient ، والتي تُستخدم للاتصال بخادم ميلفوس. يمكنك تعيين الوسيطات على النحو التالي.

    +
      +
    • إذا كنت تحتاج فقط إلى قاعدة بيانات متجهية محلية للبيانات ذات النطاق الصغير أو النموذج الأولي، فإن تعيين الوسيطة كملف محلي، على سبيل المثال./milvus.db ، هي الطريقة الأكثر ملاءمة، حيث تستخدم تلقائيًا Milvus Lite لتخزين جميع البيانات في هذا الملف.

    • +
    • إذا كان لديك حجم كبير من البيانات، على سبيل المثال أكثر من مليون ناقل، يمكنك إعداد خادم Milvus أكثر أداءً على Docker أو Kubernetes. في هذا الإعداد، يُرجى استخدام عنوان الخادم والمنفذ كـ uri، على سبيل المثالhttp://localhost:19530. إذا قمت بتمكين خاصية المصادقة على Milvus، استخدم "<your_username>: <your_password>" كرمز مميز، وإلا فلا تقم بتعيين الرمز المميز.

    • +
    • إذا كنت تستخدم Zilliz Cloud، الخدمة السحابية المدارة بالكامل لـ Milvus، فاضبط uri و token ، والتي تتوافق مع نقطة النهاية العامة ومفتاح واجهة برمجة التطبيقات في Zilliz Cloud.

    • +
    +

    أما بالنسبة إلى auto_id في MilvusClient.create_schema ، فإن المعرف التلقائي هو سمة للحقل الأساسي الذي يحدد ما إذا كان سيتم تمكين الزيادة التلقائية للحقل الأساسي. نظرًا لأننا قمنا بتعيين الحقلarticle_id كمفتاح أساسي ونريد إضافة معرف المقالة يدويًا، قمنا بتعيين auto_id False لتعطيل هذه الميزة.

    +

    بعد إضافة جميع الحقول إلى كائن المخطط، يتوافق كائن المخطط الخاص بنا مع الإدخالات في الجدول أعلاه.

    +

    تعريف الفهرس

    بعد تعريف المخطط بحقول مختلفة، بما في ذلك حقول البيانات الوصفية والحقول المتجهة لبيانات الصور والملخص، تتضمن الخطوة التالية إعداد معلمات الفهرس. الفهرسة أمر بالغ الأهمية لتحسين البحث عن المتجهات واسترجاعها، مما يضمن أداء استعلام فعال. في القسم التالي، سنقوم بتعريف معلمات الفهرس للحقول المتجهة والحقول القياسية المحددة في المجموعة.

    +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="image_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_dense_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_sparse_vector",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="publish_ts",​
    +    index_type="INVERTED",​
    +)​
    +
    +
    +

    وبمجرد إعداد معلمات الفهرس وتطبيقها، يتم تحسين Milvus للتعامل مع الاستعلامات المعقدة على البيانات المتجهة والقياسية. تعمل هذه الفهرسة على تحسين أداء ودقة عمليات البحث عن التشابه داخل المجموعة، مما يسمح باسترجاع المقالات بكفاءة استنادًا إلى متجهات الصور والمتجهات القياسية. من خلال الاستفادة من AUTOINDEX للمتجهات الكثيفة، و SPARSE_INVERTED_INDEX للمتجهات المتفرقة و INVERTED_INDEX للمقاييس القياسية، يمكن لـ Milvus تحديد النتائج الأكثر صلة وإرجاعها بسرعة، مما يحسن بشكل كبير من تجربة المستخدم الإجمالية وفعالية عملية استرجاع البيانات.

    +

    هناك العديد من أنواع المؤشرات والمقاييس. لمزيد من المعلومات حولها، يمكنك الرجوع إلى نوع فهرس Milvus ونوع مقياس Milvus.

    +

    إنشاء مجموعة

    مع تحديد المخطط والفهارس، نقوم بإنشاء "مجموعة" بهذه المعلمات. المجموعة بالنسبة لـ Milvus تشبه جدولاً في قاعدة بيانات علائقية.

    +
    client.create_collection(​
    +    collection_name=collection_name,​
    +    schema=schema,​
    +    index_params=index_params,​
    +)​
    +
    +
    +

    يمكننا التحقق من أن المجموعة قد تم إنشاؤها بنجاح من خلال وصف المجموعة.

    +
    collection_desc = client.describe_collection(​
    +    collection_name=collection_name​
    +)​
    +print(collection_desc)​
    +
    +
    +

    اعتبارات أخرى

    تحميل الفهرس

    عند إنشاء مجموعة في Milvus، يمكنك اختيار تحميل الفهرس على الفور أو تأجيله إلى ما بعد استيعاب بعض البيانات بشكل مجمّع. عادةً لا تحتاج إلى اتخاذ خيار صريح حول هذا الأمر، حيث توضح الأمثلة أعلاه أن الفهرس يتم إنشاؤه تلقائيًا لأي بيانات تم استيعابها مباشرةً بعد إنشاء المجموعة. هذا يسمح بإمكانية البحث الفوري عن البيانات التي تم استيعابها. ومع ذلك، إذا كان لديك عملية إدراج مجمعة كبيرة بعد إنشاء المجموعة ولا تحتاج إلى البحث عن أي بيانات حتى نقطة معينة، يمكنك تأجيل بناء الفهرس عن طريق حذف index_params في إنشاء المجموعة وإنشاء الفهرس عن طريق استدعاء التحميل صراحةً بعد استيعاب جميع البيانات. تعتبر هذه الطريقة أكثر فعالية لبناء الفهرس على مجموعة كبيرة، ولكن لا يمكن إجراء أي عمليات بحث حتى استدعاء التحميل().

    +

    كيفية تعريف نموذج البيانات للمستأجرين المتعددين

    يُستخدم مفهوم المستأجرين المتعددين بشكل شائع في السيناريوهات التي يحتاج فيها تطبيق أو خدمة برمجية واحدة لخدمة عدة مستخدمين أو مؤسسات مستقلة، لكل منها بيئتها المعزولة. يظهر هذا بشكل متكرر في الحوسبة السحابية وتطبيقات SaaS (البرمجيات كخدمة) وأنظمة قواعد البيانات. على سبيل المثال، يمكن أن تستخدم خدمة التخزين السحابي الإيجار المتعدد للسماح لشركات مختلفة بتخزين بياناتها وإدارتها بشكل منفصل مع مشاركة نفس البنية التحتية الأساسية. هذا النهج يزيد من استخدام الموارد والكفاءة مع ضمان أمن البيانات والخصوصية لكل مستأجر.

    +

    أسهل طريقة للتمييز بين المستأجرين هي عزل بياناتهم ومواردهم عن بعضهم البعض. كل مستأجر إما لديه وصول حصري إلى موارد محددة أو يشارك الموارد مع الآخرين لإدارة كيانات Milvus مثل قواعد البيانات والمجموعات والأقسام. هناك طرق محددة تتماشى مع هذه الكيانات لتنفيذ الإيجار المتعدد في ميلفوس. يمكنك الرجوع إلى صفحة الإيجار المتعدد في ميلفوس للمزيد من المعلومات.

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/schema.json b/localization/v2.5.x/site/ar/userGuide/schema/schema.json new file mode 100644 index 000000000..25713bc61 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = []​\n\n","export schema='{​\n \"fields\": []​\n}'​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=False,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(false)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n // highlight-start​\n is_primary_key: true,​\n autoID: false​\n // highlight-end​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema='{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}'​\n\n","schema.add_field(​\n field_name=\"my_vector\",​\n datatype=DataType.FLOAT_VECTOR,​\n # highlight-next-line​\n dim=5​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n // highlight-next-line​\n .dimension(5)​\n .build());​\n\n","schema.push({​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n // highlight-next-line​\n dim: 5​\n});​\n\n","export vectorField='{​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_varchar\",​\n datatype=DataType.VARCHAR,​\n # highlight-next-line​\n max_length=512​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n // highlight-next-line​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n // highlight-next-line​\n max_length: 512​\n});​\n\n","export varCharField='{​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 256​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_int64\",​\n datatype=DataType.INT64,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_int64\")​\n .dataType(DataType.Int64)​\n .build());​\n\n","schema.push({​\n name: \"my_int64\",​\n data_type: DataType.Int64,​\n});​\n\n","export int64Field='{​\n \"fieldName\": \"my_int64\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_bool\",​\n datatype=DataType.BOOL,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_bool\")​\n .dataType(DataType.Bool)​\n .build());​\n\n","schema.push({​\n name: \"my_bool\",​\n data_type: DataType.Boolean,​\n});​\n\n","export boolField='{​\n \"fieldName\": \"my_bool\",​\n \"dataType\": \"Boolean\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_json\",​\n datatype=DataType.JSON,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_json\")​\n .dataType(DataType.JSON)​\n .build());​\n\n","schema.push({​\n name: \"my_json\",​\n data_type: DataType.JSON,​\n});​\n\n","export jsonField='{​\n \"fieldName\": \"my_json\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_array\",​\n datatype=DataType.ARRAY,​\n element_type=DataType.VARCHAR,​\n max_capacity=5,​\n max_length=512,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_array\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(5)​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_array\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 5,​\n max_length: 512​\n});​\n\n","export arrayField='{​\n \"fieldName\": \"my_array\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField,​\n $arrayField​\n ]​\n}\"​\n\n"],"headingContent":"Schema Explained​","anchorList":[{"label":"شرح المخطط","href":"Schema-Explained​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء مخطط","href":"Create-Schema​","type":2,"isActive":false},{"label":"إضافة حقل أساسي","href":"Add-Primary-Field​","type":2,"isActive":false},{"label":"إضافة حقول متجهة","href":"Add-Vector-Fields​","type":2,"isActive":false},{"label":"إضافة الحقول العددية","href":"Add-Scalar-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/schema.md b/localization/v2.5.x/site/ar/userGuide/schema/schema.md new file mode 100644 index 000000000..4e44c3705 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/schema.md @@ -0,0 +1,452 @@ +--- +id: schema.md +title: شرح المخطط +summary: >- + يحدد المخطط بنية بيانات المجموعة. قبل إنشاء مجموعة، تحتاج إلى وضع تصميم + لمخططها. تساعدك هذه الصفحة على فهم مخطط المجموعة وتصميم مثال للمخطط بنفسك. +--- +

    شرح المخطط

    يحدد المخطط بنية بيانات المجموعة. قبل إنشاء مجموعة، تحتاج إلى وضع تصميم لمخططها. تساعدك هذه الصفحة على فهم مخطط المجموعة وتصميم مثال للمخطط بنفسك.

    +

    نظرة عامة

    في Milvus، يقوم مخطط المجموعة بتجميع جدول في قاعدة بيانات علائقية، والذي يحدد كيفية تنظيم Milvus للبيانات في المجموعة.

    +

    يعد المخطط المصمم بشكل جيد أمرًا ضروريًا لأنه يلخص نموذج البيانات ويقرر ما إذا كان بإمكانك تحقيق أهداف العمل من خلال البحث. علاوة على ذلك، نظرًا لأن كل صف من البيانات المدرجة في المجموعة يجب أن يتبع المخطط، فإنه يساعد في الحفاظ على اتساق البيانات والجودة على المدى الطويل. من من منظور تقني، يؤدي المخطط المحدد جيدًا إلى تخزين بيانات الأعمدة بشكل جيد التنظيم وهيكل فهرس أنظف، مما يعزز أداء البحث.

    +

    يحتوي مخطط المجموعة على مفتاح أساسي، وأربعة حقول متجهة كحد أقصى، والعديد من الحقول القياسية. يوضح الرسم البياني التالي كيفية تعيين مقالة إلى قائمة حقول المخطط.

    +

    + + Schema design + تصميم المخطط

    +

    يتضمن تصميم نموذج البيانات لنظام البحث تحليل احتياجات العمل وتجريد المعلومات في نموذج بيانات معبّر عن المخطط. على سبيل المثال، يجب "فهرسة" البحث في جزء من النص من خلال تحويل السلسلة الحرفية إلى متجه من خلال "التضمين" وتمكين البحث في المتجه. بالإضافة إلى هذا الشرط الأساسي، قد يكون من الضروري تخزين خصائص أخرى مثل الطابع الزمني للنشر والمؤلف. تسمح هذه البيانات الوصفية بتنقيح عمليات البحث الدلالية من خلال التصفية، وإرجاع النصوص المنشورة بعد تاريخ محدد أو من قبل مؤلف معين فقط. يمكنك أيضًا استرداد هذه المقاييس مع النص الرئيسي لعرض نتيجة البحث في التطبيق. يجب تعيين مُعرِّف فريد لكل منها لتنظيم هذه الأجزاء النصية، معبراً عنه كعدد صحيح أو سلسلة. هذه العناصر ضرورية لتحقيق منطق بحث متطور.

    +

    راجع التدريب العملي على تصميم المخطط لمعرفة كيفية إنشاء مخطط جيد التصميم.

    +

    إنشاء مخطط

    يوضح مقتطف الشيفرة التالي كيفية إنشاء مخطط.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = []​
    +
    +
    +
    export schema='{​
    +    "fields": []​
    +}'​
    +
    +
    +

    إضافة حقل أساسي

    يُعرِّف الحقل الأساسي في مجموعة ما كيانًا بشكل فريد. يقبل فقط قيم Int64 أو VarChar. توضح مقتطفات الشيفرة التالية كيفية إضافة الحقل الأساسي.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=False,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.Int64,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: false​
    +    // highlight-end​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema='{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}'​
    +
    +
    +

    عند إضافة حقل، يمكنك توضيح الحقل صراحةً كحقل أساسي عن طريق تعيين الخاصية is_primary إلى True. يقبل الحقل الأساسي قيم Int64 افتراضيًا. في هذه الحالة، يجب أن تكون قيمة الحقل الأساسي أعدادًا صحيحة مشابهة لـ 12345. إذا اخترت استخدام قيم VarChar في الحقل الأساسي، فيجب أن تكون القيمة سلاسل مشابهة لـ my_entity_1234.

    +

    يمكنك أيضًا تعيين خصائص autoId على True لجعل ميلفوس يخصص قيم الحقل الأساسي تلقائيًا عند إدراج البيانات.

    +

    لمزيد من التفاصيل، راجع الحقل الأساسي والمعرف التلقائي.

    +

    إضافة حقول متجهة

    تقبل الحقول المتجهة العديد من التضمينات المتجهة المتفرقة والكثيفة. في ميلفوس، يمكنك إضافة أربعة حقول متجهة إلى مجموعة. توضح مقتطفات التعليمات البرمجية التالية كيفية إضافة حقل متجه.

    + +
    schema.add_field(​
    +    field_name="my_vector",​
    +    datatype=DataType.FLOAT_VECTOR,​
    +    # highlight-next-line
    +    dim=5​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        // highlight-next-line​
    +        .dimension(5)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_vector",​
    +    data_type: DataType.FloatVector,​
    +    // highlight-next-line​
    +    dim: 5​
    +});​
    +
    +
    +
    export vectorField='{​
    +    "fieldName": "my_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    تشير المعلمة dim في مقتطفات التعليمات البرمجية أعلاه إلى بُعدية التضمينات المتجهة التي سيتم الاحتفاظ بها في الحقل المتجه. تشير القيمة FLOAT_VECTOR إلى أن حقل المتجه يحتوي على قائمة من الأرقام العائمة 32 بت، والتي تستخدم عادةً لتمثيل مضادات الجذر، بالإضافة إلى ذلك، يدعم ميلفوس أيضًا الأنواع التالية من تضمينات المتجهات.

    +
      +
    • FLOAT16_VECTOR

      +

      يحتوي الحقل المتجه من هذا النوع على قائمة من الأعداد العائمة نصف الدقة 16 بت، وعادةً ما ينطبق على سيناريوهات التعلم العميق المقيد بالذاكرة أو الحوسبة القائمة على وحدة معالجة الرسومات.

    • +
    • BFLOAT16_VECTOR

      +

      يحتفظ حقل متجه من هذا النوع بقائمة من الأرقام ذات الفاصلة العائمة 16 بت ذات دقة مخفضة ولكن بنفس نطاق الأس مثل Float32. يُستخدم هذا النوع من البيانات بشكل شائع في سيناريوهات التعلّم العميق، حيث أنه يقلل من استخدام الذاكرة دون التأثير على الدقة بشكل كبير.

    • +
    • BINARY_VECTOR

      +

      يحتوي الحقل المتجه من هذا النوع على قائمة من 0 و1. وهي بمثابة ميزات مضغوطة لتمثيل البيانات في سيناريوهات معالجة الصور واسترجاع المعلومات.

    • +
    • SPARSE_FLOAT_VECTOR

      +

      ويحتوي الحقل المتجه من هذا النوع على قائمة من الأرقام غير الصفرية وأرقام تسلسلها لتمثيل تضمينات متجهات متفرقة.

    • +
    +

    إضافة الحقول العددية

    في الحالات الشائعة، يمكنك استخدام الحقول القياسية لتخزين البيانات الوصفية للتضمينات المتجهة المخزنة في Milvus، وإجراء عمليات بحث الشبكة النانوية مع تصفية البيانات الوصفية لتحسين صحة نتائج البحث. يدعم Milvus أنواع حقول قياسية متعددة، بما في ذلك VarChar و Boolean و Int و Float و Double و Array و JSON.

    +

    إضافة حقول سلسلة

    في Milvus، يمكنك استخدام حقول VarChar لتخزين السلاسل. لمعرفة المزيد عن حقل VarChar، راجع حقل السلسلة.

    + +
    schema.add_field(​
    +    field_name="my_varchar",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-next-line
    +    max_length=512​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-next-line​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_varchar",​
    +    data_type: DataType.VarChar,​
    +    // highlight-next-line​
    +    max_length: 512​
    +});​
    +
    +
    +
    export varCharField='{​
    +    "fieldName": "my_varchar",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 256​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField​
    +    ]​
    +}"​
    +
    +
    +

    إضافة حقول أرقام

    أنواع الأرقام التي يدعمها Milvus هي Int8 و Int16 و و Int32 و Int64 و Float و Double. لمعرفة المزيد عن حقول الأرقام، راجع حقل الأرقام.

    + +
    schema.add_field(​
    +    field_name="my_int64",​
    +    datatype=DataType.INT64,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_int64")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_int64",​
    +    data_type: DataType.Int64,​
    +});​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "my_int64",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field​
    +    ]​
    +}"​
    +
    +
    +

    إضافة حقول منطقية

    يدعم ميلفوس الحقول المنطقية. توضح مقتطفات التعليمات البرمجية التالية كيفية إضافة حقل منطقي.

    + +
    schema.add_field(​
    +    field_name="my_bool",​
    +    datatype=DataType.BOOL,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_bool")​
    +        .dataType(DataType.Bool)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_bool",​
    +    data_type: DataType.Boolean,​
    +});​
    +
    +
    +
    export boolField='{​
    +    "fieldName": "my_bool",​
    +    "dataType": "Boolean"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField​
    +    ]​
    +}"​
    +
    +
    +

    إضافة حقول JSON

    عادةً ما يخزن حقل JSON بيانات JSON نصف مهيكلة. للمزيد عن حقول JSON، راجع حقل JSON.

    + +
    schema.add_field(​
    +    field_name="my_json",​
    +    datatype=DataType.JSON,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_json")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_json",​
    +    data_type: DataType.JSON,​
    +});​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "my_json",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField​
    +    ]​
    +}"​
    +
    +
    +

    إضافة حقول مصفوفة

    يخزن حقل المصفوفة قائمة من العناصر. يجب أن تكون أنواع البيانات لجميع العناصر في حقل المصفوفة متشابهة. للمزيد عن حقول المصفوفة، راجع حقل المصفوفة.

    + +
    schema.add_field(​
    +    field_name="my_array",​
    +    datatype=DataType.ARRAY,​
    +    element_type=DataType.VARCHAR,​
    +    max_capacity=5,​
    +    max_length=512,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_array")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(5)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_array",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 5,​
    +    max_length: 512​
    +});​
    +
    +
    +
    export arrayField='{​
    +    "fieldName": "my_array",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 512​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField,​
    +        $arrayField​
    +    ]​
    +}"​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.json b/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.json new file mode 100644 index 000000000..b7a7f6f14 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.json @@ -0,0 +1 @@ +{"codeList":["from scipy.sparse import csr_matrix​\n​\n# Create a sparse matrix​\nrow = [0, 0, 1, 2, 2, 2]​\ncol = [0, 2, 2, 0, 1, 2]​\ndata = [1, 2, 3, 4, 5, 6]​\nsparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​\n​\n# Represent sparse vector using the sparse matrix​\nsparse_vector = sparse_matrix.getrow(0)​\n\n","# Represent sparse vector using a dictionary​\nsparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​\n\n","SortedMap sparseVector = new TreeMap<>();​\nsparseVector.put(1L, 0.5f);​\nsparseVector.put(100L, 0.3f);​\nsparseVector.put(500L, 0.8f);​\nsparseVector.put(1024L, 0.2f);​\nsparseVector.put(5000L, 0.6f);​\n\n","# Represent sparse vector using a list of tuples​\nsparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.drop_collection(collection_name=\"my_sparse_collection\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse_vector\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"sparse_vector\",​\n data_type: DataType.SparseFloatVector,​\n }​\n];​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"sparse_vector\",​\n \"dataType\": \"SparseFloatVector\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse_vector\",​\n index_name=\"sparse_inverted_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n params={\"drop_ratio_build\": 0.2},​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"drop_ratio_build\", 0.2);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"sparse_vector\")​\n .indexName(\"sparse_inverted_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","const indexParams = await client.createIndex({​\n index_name: 'sparse_inverted_index',​\n field_name: 'sparse_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.SPARSE_WAND,​\n params: {​\n drop_ratio_build: 0.2,​\n },​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"sparse_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_inverted_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\",​\n \"params\":{\"drop_ratio_build\": 0.2}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_sparse_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_sparse_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_sparse_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","sparse_vectors = [​\n {\"sparse_vector\": {1: 0.5, 100: 0.3, 500: 0.8}},​\n {\"sparse_vector\": {10: 0.1, 200: 0.7, 1000: 0.9}},​\n]​\n​\nclient.insert(​\n collection_name=\"my_sparse_collection\",​\n data=sparse_vectors​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(1L, 0.5f);​\n sparse.put(100L, 0.3f);​\n sparse.put(500L, 0.8f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(10L, 0.1f);​\n sparse.put(200L, 0.7f);​\n sparse.put(1000L, 0.9f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { sparse_vector: { \"1\": 0.5, \"100\": 0.3, \"500\": 0.8 } },​\n { sparse_vector: { \"10\": 0.1, \"200\": 0.7, \"1000\": 0.9 } },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"sparse_vector\": {\"1\": 0.5, \"100\": 0.3, \"500\": 0.8}},​\n {\"sparse_vector\": {\"10\": 0.1, \"200\": 0.7, \"1000\": 0.9}} ​\n ],​\n \"collectionName\": \"my_sparse_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572534\",\"453577185629572535\"]}}​\n\n","# Prepare search parameters​\nsearch_params = {​\n \"params\": {\"drop_ratio_search\": 0.2}, # Additional optional search parameters​\n}​\n​\n# Prepare the query vector​\nquery_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​\n\n","res = client.search(​\n collection_name=\"my_sparse_collection\",​\n data=query_vector,​\n limit=3,​\n output_fields=[\"pk\"],​\n search_params=search_params,​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"drop_ratio_search\", 0.2);​\n​\nSortedMap sparse = new TreeMap<>();​\nsparse.put(10L, 0.1f);​\nsparse.put(200L, 0.7f);​\nsparse.put(1000L, 0.9f);​\n​\nSparseFloatVec queryVector = new SparseFloatVec(sparse);​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"sparse_vector\")​\n .searchParams(searchParams)​\n .topK(3)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​\n\n","client.search({​\n collection_name: 'my_sparse_collection',​\n data: {1: 0.2, 50: 0.4, 1000: 0.7},​\n limit: 3,​\n output_fields: ['pk'],​\n params: {​\n drop_ratio_search: 0.2​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_sparse_collection\",​\n \"data\": [​\n {\"1\": 0.2, \"50\": 0.4, \"1000\": 0.7}​\n ],​\n \"annsField\": \"sparse_vector\",​\n \"limit\": 3,​\n \"searchParams\":{​\n \"params\":{\"drop_ratio_search\": 0.2}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.63,\"id\":\"453577185629572535\",\"pk\":\"453577185629572535\"},{\"distance\":0.1,\"id\":\"453577185629572534\",\"pk\":\"453577185629572534\"}]}​\n\n"],"headingContent":"Sparse Vector​","anchorList":[{"label":"المتجهات المتفرقة","href":"Sparse-Vector​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام المتجهات المتفرقة في ميلفوس","href":"Use-sparse-vectors-in-Milvus​","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.md b/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.md new file mode 100644 index 000000000..c5683c73d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/sparse_vector.md @@ -0,0 +1,536 @@ +--- +id: sparse_vector.md +title: متجه متناثر +summary: >- + تُعد المتجهات المتفرقة طريقة مهمة لتمثيل البيانات في استرجاع المعلومات ومعالجة + اللغات الطبيعية. بينما تشتهر المتجهات الكثيفة بقدراتها الممتازة على الفهم + الدلالي، إلا أن المتجهات المتفرقة غالباً ما تقدم نتائج أكثر دقة عندما يتعلق + الأمر بالتطبيقات التي تتطلب مطابقة دقيقة للكلمات أو العبارات الرئيسية. +--- +

    المتجهات المتفرقة

    تعد المتجهات المتفرقة طريقة مهمة لتمثيل البيانات في استرجاع المعلومات ومعالجة اللغات الطبيعية. بينما تشتهر المتجهات الكثيفة بقدراتها الممتازة على الفهم الدلالي، غالبًا ما توفر المتجهات المتفرقة نتائج أكثر دقة عندما يتعلق الأمر بالتطبيقات التي تتطلب مطابقة دقيقة للكلمات أو العبارات الرئيسية.

    +

    نظرة عامة

    المتجهات المتفرقة هي تمثيل خاص للمتجهات عالية الأبعاد حيث تكون معظم عناصرها صفرية، وبعض أبعادها فقط ذات قيم غير صفرية. هذه الخاصية تجعل المتجهات المتفرقة فعالة بشكل خاص في التعامل مع البيانات واسعة النطاق وعالية الأبعاد ولكن متناثرة. تشمل التطبيقات الشائعة ما يلي.

    +
      +
    • تحليل النصوص: تمثيل المستندات على هيئة متجهات كيس من الكلمات، حيث يتوافق كل بُعد مع كلمة، والكلمات التي تظهر في المستند فقط هي التي لها قيم غير صفرية.

    • +
    • أنظمة التوصيات: مصفوفات التفاعل بين المستخدم والعنصر، حيث يمثل كل بُعد تقييم المستخدم لعنصر معين، حيث يتفاعل معظم المستخدمين مع عدد قليل من العناصر فقط.

    • +
    • معالجة الصور: تمثيل الميزات المحلية، مع التركيز فقط على النقاط الرئيسية في الصورة، مما ينتج عنه متجهات متناثرة عالية الأبعاد.

    • +
    +

    كما هو موضح في الرسم البياني أدناه، عادةً ما يتم تمثيل المتجهات الكثيفة كمصفوفات مستمرة حيث يكون لكل موضع قيمة (على سبيل المثال، [0.3, 0.8, 0.2, 0.3, 0.1]). في المقابل، تخزّن المتجهات المتفرقة العناصر غير الصفرية ومؤشراتها فقط، وغالبًا ما يتم تمثيلها كأزواج قيمة مفتاح-قيمة (على سبيل المثال، [{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}]). يقلل هذا التمثيل بشكل كبير من مساحة التخزين ويزيد من الكفاءة الحسابية، خاصة عند التعامل مع بيانات عالية الأبعاد للغاية (على سبيل المثال، 10000 بُعد).

    +

    + + Spare vector representation + تمثيل المتجهات المتفرقة

    +

    يمكن إنشاء المتجهات المتفرقة باستخدام طرق مختلفة، مثل TF-IDF (تردد المصطلح-تردد المستند العكسي) و BM25 في معالجة النصوص. بالإضافة إلى ذلك، يوفر Milvus طرقًا ملائمة للمساعدة في توليد المتجهات المتفرقة ومعالجتها. لمزيد من التفاصيل، راجع التضمينات.

    +

    بالنسبة للبيانات النصية، يوفر Milvus أيضًا إمكانات البحث في النص الكامل، مما يسمح لك بإجراء عمليات بحث عن المتجهات مباشرةً على بيانات النص الخام دون استخدام نماذج تضمين خارجية لإنشاء متجهات متفرقة. لمزيد من المعلومات، راجع البحث عن النص الكامل.

    +

    بعد التحويل إلى متجهات، يمكن تخزين البيانات في ميلفوس لإدارتها واسترجاع المتجهات. يوضح الرسم البياني أدناه العملية الأساسية.

    +

    + + Use sparse vector in Milvus + استخدام المتجهات المتفرقة في ملفوس

    +
    +

    بالإضافة إلى المتجهات المتناثرة، يدعم ميلفوس أيضًا المتجهات الكثيفة والمتجهات الثنائية. تُعد المتجهات الكثيفة مثالية لالتقاط العلاقات الدلالية العميقة، بينما تتفوق المتجهات الثنائية في سيناريوهات مثل مقارنات التشابه السريعة وإلغاء تكرار المحتوى. لمزيد من المعلومات، راجع المتجهات الكثيفة والمتجهات الثنائية.

    +
    +

    استخدام المتجهات المتفرقة في ميلفوس

    يدعم Milvus تمثيل المتجهات المتفرقة بأي من التنسيقات التالية.

    +
      +
    • مصفوفة متفرقة (باستخدام فئة scipy.sparse )

      +

      +
      from scipy.sparse import csr_matrix​
      +​
      +# Create a sparse matrix​
      +row = [0, 0, 1, 2, 2, 2]​
      +col = [0, 2, 2, 0, 1, 2]​
      +data = [1, 2, 3, 4, 5, 6]​
      +sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​
      +​
      +# Represent sparse vector using the sparse matrix​
      +sparse_vector = sparse_matrix.getrow(0)​
      +
      +
    • +
    • قائمة القواميس (بتنسيق {dimension_index: value, ...})

      +

      +
      # Represent sparse vector using a dictionary​
      +sparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​
      +
      +
      +
      SortedMap<Long, Float> sparseVector = new TreeMap<>();​
      +sparseVector.put(1L, 0.5f);​
      +sparseVector.put(100L, 0.3f);​
      +sparseVector.put(500L, 0.8f);​
      +sparseVector.put(1024L, 0.2f);​
      +sparseVector.put(5000L, 0.6f);​
      +
      +
    • +
    • قائمة القواميس التكرارية (منسقة على [(dimension_index, value)])

      +

      +
      # Represent sparse vector using a list of tuples​
      +sparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​
      +
      +
    • +
    +

    إضافة حقل متجه

    لاستخدام المتجهات المتفرقة في Milvus، قم بتعريف حقل لتخزين المتجهات المتفرقة عند إنشاء مجموعة. تتضمن هذه العملية.

    +
      +
    1. تعيين datatype إلى نوع بيانات المتجهات المتفرقة المدعومة، SPARSE_FLOAT_VECTOR.

    2. +
    3. لا حاجة لتحديد البُعد.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +client.drop_collection(collection_name="my_sparse_collection")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse_vector")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "sparse_vector",​
    +    data_type: DataType.SparseFloatVector,​
    +  }​
    +];​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "sparse_vector",​
    +    "dataType": "SparseFloatVector"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    في هذا المثال، تمت إضافة حقل متجه باسم sparse_vector لتخزين المتجهات المتفرقة. نوع بيانات هذا الحقل هو SPARSE_FLOAT_VECTOR.

    +

    تعيين بارامترات الفهرس للحقل المتجه

    تشبه عملية إنشاء فهرس للمتجهات المتفرقة عملية إنشاء فهرس للمتجهات الكثيفة، ولكن مع وجود اختلافات في نوع الفهرس المحدد (index_type)، ومقياس المسافة (metric_type)، ومعلمات الفهرس (params).

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse_vector",​
    +    index_name="sparse_inverted_index",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +    params={"drop_ratio_build": 0.2},​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("drop_ratio_build", 0.2);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("sparse_vector")​
    +        .indexName("sparse_inverted_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    const indexParams = await client.createIndex({​
    +    index_name: 'sparse_inverted_index',​
    +    field_name: 'sparse_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.SPARSE_WAND,​
    +    params: {​
    +      drop_ratio_build: 0.2,​
    +    },​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "sparse_vector",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_inverted_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX",​
    +            "params":{"drop_ratio_build": 0.2}​
    +        }​
    +    ]'​
    +
    +
    +

    في المثال أعلاه.

    +
      +
    • يتم إنشاء فهرس من النوع SPARSE_INVERTED_INDEX للمتجه المتناثر. بالنسبة للمتجهات المتناثرة، يمكنك تحديد SPARSE_INVERTED_INDEX أو SPARSE_WAND. لمزيد من التفاصيل، راجع فهارس المتجهات المتفرقة.

    • +
    • بالنسبة للمتجهات المتناثرة، يدعم metric_type فقط IP (الضرب الداخلي)، ويستخدم لقياس التشابه بين متجهين متناثرين. للمزيد من المعلومات حول التشابه، راجع أنواع المتجهات المترية.

    • +
    • drop_ratio_build هي معلمة فهرس اختيارية مخصصة للمتجهات المتفرقة. تتحكم في نسبة قيم المتجهات الصغيرة المستبعدة أثناء بناء الفهرس. على سبيل المثال، باستخدام {"drop_ratio_build": 0.2} ، سيتم استبعاد أصغر 20٪ من قيم المتجهات أثناء إنشاء الفهرس، مما يقلل من الجهد الحسابي أثناء عمليات البحث.

    • +
    +

    إنشاء مجموعة

    بمجرد اكتمال إعدادات المتجهات المتناثرة والفهرس، يمكنك إنشاء مجموعة تحتوي على متجهات متفرقة. يستخدم المثال أدناه طريقة create_collection لإنشاء مجموعة باسم my_sparse_collection.

    + +
    client.create_collection(​
    +    collection_name="my_sparse_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_sparse_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_sparse_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، أدخل البيانات التي تحتوي على متجهات متفرقة.

    + +
    sparse_vectors = [​
    +    {"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}},​
    +    {"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_sparse_collection",​
    +    data=sparse_vectors​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(1L, 0.5f);​
    +    sparse.put(100L, 0.3f);​
    +    sparse.put(500L, 0.8f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(10L, 0.1f);​
    +    sparse.put(200L, 0.7f);​
    +    sparse.put(1000L, 0.9f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { sparse_vector: { "1": 0.5, "100": 0.3, "500": 0.8 } },​
    +  { sparse_vector: { "10": 0.1, "200": 0.7, "1000": 0.9 } },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"sparse_vector": {"1": 0.5, "100": 0.3, "500": 0.8}},​
    +        {"sparse_vector": {"10": 0.1, "200": 0.7, "1000": 0.9}}        ​
    +    ],​
    +    "collectionName": "my_sparse_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572534","453577185629572535"]}}​
    +
    +
    +

    إجراء بحث التشابه

    لإجراء بحث التشابه باستخدام متجهات متناثرة، قم بإعداد متجه الاستعلام ومعلمات البحث.

    + +
    # Prepare search parameters​
    +search_params = {​
    +    "params": {"drop_ratio_search": 0.2},  # Additional optional search parameters​
    +}​
    +​
    +# Prepare the query vector​
    +query_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​
    +
    +
    +

    في هذا المثال، drop_ratio_search هي معلمة اختيارية مخصصة للمتجهات المتناثرة، مما يسمح بضبط القيم الصغيرة في متجه الاستعلام أثناء البحث. على سبيل المثال، باستخدام {"drop_ratio_search": 0.2} ، سيتم تجاهل أصغر 20% من القيم في متجه الاستعلام أثناء البحث.

    +

    بعد ذلك، قم بتنفيذ بحث التشابه باستخدام الطريقة search.

    + +
    res = client.search(​
    +    collection_name="my_sparse_collection",​
    +    data=query_vector,​
    +    limit=3,​
    +    output_fields=["pk"],​
    +    search_params=search_params,​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("drop_ratio_search", 0.2);​
    +​
    +SortedMap<Long, Float> sparse = new TreeMap<>();​
    +sparse.put(10L, 0.1f);​
    +sparse.put(200L, 0.7f);​
    +sparse.put(1000L, 0.9f);​
    +​
    +SparseFloatVec queryVector = new SparseFloatVec(sparse);​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("sparse_vector")​
    +        .searchParams(searchParams)​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_sparse_collection',​
    +    data: {1: 0.2, 50: 0.4, 1000: 0.7},​
    +    limit: 3,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        drop_ratio_search: 0.2​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_sparse_collection",​
    +    "data": [​
    +        {"1": 0.2, "50": 0.4, "1000": 0.7}​
    +    ],​
    +    "annsField": "sparse_vector",​
    +    "limit": 3,​
    +    "searchParams":{​
    +        "params":{"drop_ratio_search": 0.2}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.63,"id":"453577185629572535","pk":"453577185629572535"},{"distance":0.1,"id":"453577185629572534","pk":"453577185629572534"}]}​
    +
    +
    +

    لمزيد من المعلومات حول معلمات البحث عن التشابه، راجع بحث التشابه الأساسي.

    +

    الحدود

    عند استخدام المتجهات المتفرقة في ميلفوس، ضع في اعتبارك الحدود التالية:

    +
      +
    • حاليًا، يتم دعم مقاييس المسافة IP و BM25 (للبحث في النص الكامل) فقط للمتجهات المتفرقة. إن الأبعاد العالية للمتجهات المتفرقة تجعل المسافة L2 ومسافة جيب التمام غير عملية.

    • +
    • بالنسبة لحقول المتجهات المتناثرة، يتم دعم أنواع الفهرس SPARSE_INVERTED_INDEX و SPARSE_WAND فقط.

    • +
    • أنواع البيانات المدعومة للمتجهات المتفرقة:

      +
        +
      • يجب أن يكون جزء البُعد عددًا صحيحًا غير موقع 32 بت;
      • +
      • يمكن أن يكون جزء القيمة رقمًا عائمًا غير سالب 32 بت غير سالب.
      • +
    • +
    • يجب أن تستوفي المتجهات المتفرقة المتطلبات التالية للإدراج والبحث:

      +
        +
      • قيمة واحدة على الأقل في المتجه لا تساوي صفرًا;
      • +
      • مؤشرات المتجهات غير سالبة.
      • +
    • +
    +

    الأسئلة الشائعة

      +
    • هل يمكنكم شرح الفرق بين SPARSE_INVERTED_INDEX و SPARSE_WAND، وكيف يمكنني الاختيار بينهما؟

      +

      SPARSE_INVERTED_INDEX هو فهرس مقلوب تقليدي، بينما يستخدم SPARSE_WAND خوارزمية SPARSE_WAND خوارزمية ضعيفة-AND لتقليل عدد تقييمات مسافة IP الكاملة أثناء البحث. عادةً ما تكون SPARSE_WAND أسرع، لكن أداءها يمكن أن ينخفض مع زيادة كثافة المتجهات. للاختيار بينها، قم بإجراء التجارب والمعايير بناءً على مجموعة البيانات وحالة الاستخدام الخاصة بك.

    • +
    • كيف يمكنني اختيار معلمات drop_ratio_build و drop_ratio_search؟

      +

      يعتمد اختيار دروب_راتيو_بناء ودروب_راتيو_بحث على خصائص بياناتك ومتطلباتك من حيث زمن انتقال/إنتاجية البحث والدقة.

    • +
    • هل يمكن أن يكون بُعد التضمين المتناثر أي قيمة منفصلة ضمن فضاء uint32؟

      +

      نعم، مع استثناء واحد. يمكن أن يكون بُعد التضمين المتناثر أي قيمة في نطاق [0, maximum of uint32). هذا يعني أنه لا يمكنك استخدام القيمة القصوى ل uint32.

    • +
    • هل تجرى عمليات البحث على المقاطع المتزايدة من خلال فهرس أم بالقوة الغاشمة؟

      +

      تجرى عمليات البحث على المقاطع المتنامية من خلال فهرس من نفس نوع فهرس المقطع المختوم. بالنسبة للمقاطع المتنامية الجديدة قبل إنشاء الفهرس، يتم استخدام البحث بالقوة الغاشمة.

    • +
    • هل من الممكن وجود متجهات متناثرة وكثيفة في مجموعة واحدة؟

      +

      نعم، مع دعم أنواع المتجهات المتعددة، يمكنك إنشاء مجموعات مع كل من أعمدة المتجهات المتفرقة والكثيفة وإجراء عمليات بحث مختلطة عليها.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/string.json b/localization/v2.5.x/site/ar/userGuide/schema/string.json new file mode 100644 index 000000000..a61a41152 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/string.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\n# define schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"varchar_field1\", datatype=DataType.VARCHAR, max_length=100)​\nschema.add_field(field_name=\"varchar_field2\", datatype=DataType.VARCHAR, max_length=200)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field1\")​\n .dataType(DataType.VarChar)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field2\")​\n .dataType(DataType.VarChar)​\n .maxLength(200)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"varchar_field2\",​\n data_type: DataType.VarChar,​\n max_length: 200,​\n },​\n {​\n name: \"varchar_field1\",​\n data_type: DataType.VarChar,​\n max_length: 100,​\n },​\n];​\n\n","export varcharField1='{​\n \"fieldName\": \"varchar_field1\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport varcharField2='{​\n \"fieldName\": \"varchar_field2\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 200​\n }​\n}'​\n​\nexport primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $varcharField1,​\n $varcharField2,​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"varchar_field1\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"varchar_index\"​\n)​\n\n","​\nimport io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"varchar_field1\")​\n .indexName(\"varchar_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'varchar_index',​\n field_name: 'varchar_field1',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metric_type: MetricType.COSINE,​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_varchar_collection\",​\n schema: schema,​\n index_params: index_params​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_varchar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n## {\"code\":0,\"data\":{}}​\n\n","data = [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_varchar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product A\\\", \\\"varchar_field2\\\": \\\"High quality product\\\", \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product B\\\", \\\"varchar_field2\\\": \\\"Affordable price\\\", \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product C\\\", \\\"varchar_field2\\\": \\\"Best seller\\\", \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n varchar_field1: \"Product A\",​\n varchar_field2: \"High quality product\",​\n pk: 1,​\n embedding: [0.1, 0.2, 0.3],​\n },​\n {​\n varchar_field1: \"Product B\",​\n varchar_field2: \"Affordable price\",​\n pk: 2,​\n embedding: [0.4, 0.5, 0.6],​\n },​\n {​\n varchar_field1: \"Product C\",​\n varchar_field2: \"Best seller\",​\n pk: 3,​\n embedding: [0.7, 0.8, 0.9],​\n },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_varchar_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":3,\"insertIds\":[1,2,3]}}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.query(​\n collection_name=\"my_varchar_collection\",​\n filter=filter,​\n output_fields=[\"varchar_field1\", \"varchar_field2\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​\n\n","client.query({​\n collection_name: 'my_varchar_collection',​\n filter: 'varchar_field1 == \"Product A\"',​\n output_fields: ['varchar_field1', 'varchar_field2']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\",​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"]​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":[{\"pk\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.search(​\n collection_name=\"my_varchar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"varchar_field1\", \"varchar_field2\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_varchar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['varchar_field1', 'varchar_field2'],​\n filter: 'varchar_field1 == \"Product A\"'​\n params: {​\n nprobe:10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"],​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.2364331,\"id\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n"],"headingContent":"String Field​","anchorList":[{"label":"حقل السلسلة","href":"String-Field​","type":1,"isActive":false},{"label":"إضافة حقل VARCHAR","href":"Add-VARCHAR-field​","type":2,"isActive":false},{"label":"تعيين معلمات الفهرس","href":"Set-index-params​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-collection​","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data​","type":2,"isActive":false},{"label":"البحث والاستعلام","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/string.md b/localization/v2.5.x/site/ar/userGuide/schema/string.md new file mode 100644 index 000000000..62905965a --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/string.md @@ -0,0 +1,559 @@ +--- +id: string.md +title: حقل الأوتار +summary: >- + في Milvus، VARCHAR هو نوع البيانات المستخدم لتخزين البيانات من نوع السلسلة، + وهو مناسب لتخزين السلاسل ذات الطول المتغير. ويمكنه تخزين السلاسل ذات الأحرف + أحادية ومتعددة البايت، بطول أقصى يصل إلى 65,535 حرفًا. عند تحديد حقل VARCHAR، + يجب عليك أيضًا تحديد معلمة الطول الأقصى للطول الأقصى. يوفر نوع سلسلة VARCHAR + طريقة فعالة ومرنة لتخزين البيانات النصية وإدارتها، مما يجعلها مثالية للتطبيقات + التي تتعامل مع سلاسل ذات أطوال مختلفة. +--- +

    حقل السلسلة

    في Milvus، VARCHAR هو نوع البيانات المستخدم لتخزين البيانات من نوع السلسلة، وهو مناسب لتخزين السلاسل ذات الطول المتغير. ويمكنه تخزين السلاسل التي تحتوي على أحرف أحادية ومتعددة البايت، بطول أقصى يصل إلى 65,535 حرفًا. عند تحديد حقل VARCHAR ، يجب أيضًا تحديد معلمة الطول الأقصى max_length. يوفر نوع السلسلة VARCHAR طريقة فعالة ومرنة لتخزين البيانات النصية وإدارتها، مما يجعلها مثالية للتطبيقات التي تتعامل مع سلاسل ذات أطوال مختلفة.

    +

    إضافة حقل VARCHAR

    لاستخدام بيانات السلسلة في ميلفوس، قم بتعريف حقل VARCHAR عند إنشاء مجموعة. تتضمن هذه العملية.

    +
      +
    1. تعيين datatype إلى نوع بيانات السلسلة المدعوم، أي VARCHAR.

    2. +
    3. تحديد الحد الأقصى لطول نوع السلسلة باستخدام المعلمة max_length ، والتي لا يمكن أن تتجاوز 60,535 حرفًا.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +# define schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="varchar_field1", datatype=DataType.VARCHAR, max_length=100)​
    +schema.add_field(field_name="varchar_field2", datatype=DataType.VARCHAR, max_length=200)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field1")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field2")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(200)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "varchar_field2",​
    +    data_type: DataType.VarChar,​
    +    max_length: 200,​
    +  },​
    +  {​
    +    name: "varchar_field1",​
    +    data_type: DataType.VarChar,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    export varcharField1='{​
    +    "fieldName": "varchar_field1",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export varcharField2='{​
    +    "fieldName": "varchar_field2",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 200​
    +    }​
    +}'​
    +​
    +export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $varcharField1,​
    +        $varcharField2,​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    في هذا المثال، نضيف في هذا المثال حقلين VARCHAR: varchar_field1 و varchar_field2 ، مع تعيين الحد الأقصى للطول إلى 100 و 200 حرف على التوالي. يوصى بتعيين max_length بناءً على خصائص البيانات الخاصة بك للتأكد من أنها تستوعب أطول البيانات مع تجنب تخصيص مساحة زائدة. بالإضافة إلى ذلك، قمنا بإضافة حقل أساسي pk وحقل متجه embedding.

    +
    +

    الحقل الأساسي والحقل المتجه إلزاميان عند إنشاء مجموعة. يعرّف الحقل الأساسي كل كيان بشكل فريد، في حين أن الحقل المتجه مهم للبحث عن التشابه. للمزيد من التفاصيل، راجع الحقل الأساسي والمعرف التلقائي أو المتجه الكثيف أو المتجه الثنائي أو المتجه المتناثر.

    +
    +

    تعيين معلمات الفهرس

    يعد تعيين معلمات الفهرس لحقول VARCHAR أمرًا اختياريًا ولكنه يمكن أن يحسن كفاءة الاسترجاع بشكل كبير.

    +

    في المثال التالي، نقوم بإنشاء AUTOINDEX لـ varchar_field1 ، مما يعني أن ميلفوس سيقوم تلقائيًا بإنشاء فهرس مناسب بناءً على نوع البيانات. لمزيد من المعلومات، راجع AUTOINDEX.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="varchar_field1",​
    +    index_type="AUTOINDEX",​
    +    index_name="varchar_index"​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("varchar_field1")​
    +        .indexName("varchar_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'varchar_index',​
    +    field_name: 'varchar_field1',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    بالإضافة إلى AUTOINDEX ، يمكنك تحديد أنواع فهارس قياسية أخرى، مثل INVERTED أو BITMAP. للاطلاع على أنواع الفهارس المدعومة، راجع الفهارس العددية.

    +

    علاوة على ذلك، قبل إنشاء المجموعة، يجب إنشاء فهرس للحقل المتجه. في هذا المثال، نستخدم في هذا المثال AUTOINDEX لتبسيط إعدادات الفهرس المتجه.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metric_type: MetricType.COSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    إنشاء مجموعة

    بمجرد تحديد المخطط والفهرس، يمكنك إنشاء مجموعة تتضمن حقول سلسلة.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_varchar_collection",​
    +    schema: schema,​
    +    index_params: index_params​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_varchar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +## {"code":0,"data":{}}​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، يمكنك إدراج البيانات التي تتضمن حقول سلسلة.

    + +
    data = [​
    +    {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_varchar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +    varchar_field1: "Product A",​
    +    varchar_field2: "High quality product",​
    +    pk: 1,​
    +    embedding: [0.1, 0.2, 0.3],​
    +  },​
    +  {​
    +    varchar_field1: "Product B",​
    +    varchar_field2: "Affordable price",​
    +    pk: 2,​
    +    embedding: [0.4, 0.5, 0.6],​
    +  },​
    +  {​
    +    varchar_field1: "Product C",​
    +    varchar_field2: "Best seller",​
    +    pk: 3,​
    +    embedding: [0.7, 0.8, 0.9],​
    +  },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_varchar_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":3,"insertIds":[1,2,3]}}​
    +
    +
    +

    في هذا المثال، نقوم بإدراج البيانات التي تتضمن حقول VARCHAR (varchar_field1 و varchar_field2)، وحقل أساسي (pk)، وتمثيلات متجهة (embedding). للتأكد من تطابق البيانات المدرجة مع الحقول المحددة في المخطط، يوصى بالتحقق من أنواع البيانات مسبقًا لتجنب أخطاء الإدراج.

    +

    إذا قمت بتعيين enable_dynamic_fields=True عند تعريف المخطط، يسمح لك Milvus بإدراج حقول سلسلة لم يتم تعريفها مسبقًا. ومع ذلك، ضع في اعتبارك أن هذا قد يزيد من تعقيد الاستعلامات والإدارة، مما قد يؤثر على الأداء. لمزيد من المعلومات، راجع الحقل الديناميكي.

    +

    البحث والاستعلام

    بعد إضافة حقول السلسلة، يمكنك استخدامها للتصفية في عمليات البحث والاستعلام، وتحقيق نتائج بحث أكثر دقة.

    +

    تصفية الاستعلامات

    بعد إضافة حقول السلسلة، يمكنك تصفية النتائج باستخدام هذه الحقول في الاستعلامات. على سبيل المثال، يمكنك الاستعلام عن جميع الكيانات حيث varchar_field1 يساوي "Product A".

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.query(​
    +    collection_name="my_varchar_collection",​
    +    filter=filter,​
    +    output_fields=["varchar_field1", "varchar_field2"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_varchar_collection',​
    +    filter: 'varchar_field1 == "Product A"',​
    +    output_fields: ['varchar_field1', 'varchar_field2']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "filter": "varchar_field1 == \"Product A\"",​
    +    "outputFields": ["varchar_field1", "varchar_field2"]​
    +}'​
    +## {"code":0,"cost":0,"data":[{"pk":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    يُرجع تعبير الاستعلام هذا جميع الكيانات المطابقة ويُخرج حقولها varchar_field1 و varchar_field2. لمزيد من المعلومات حول استعلامات التصفية، راجع تصفية البيانات الوصفية.

    +

    البحث المتجه مع تصفية السلسلة

    بالإضافة إلى تصفية الحقول القياسية الأساسية، يمكنك دمج عمليات البحث عن التشابه المتجه مع مرشحات الحقول القياسية. على سبيل المثال، يوضح الرمز التالي كيفية إضافة عامل تصفية الحقل القياسي إلى بحث متجه.

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.search(​
    +    collection_name="my_varchar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["varchar_field1", "varchar_field2"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_varchar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['varchar_field1', 'varchar_field2'],​
    +    filter: 'varchar_field1 == "Product A"'​
    +    params: {​
    +       nprobe:10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["varchar_field1", "varchar_field2"],​
    +    "filter": "varchar_field1 == \"Product A\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.2364331,"id":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    في هذا المثال، نحدد أولًا متجه استعلام ونضيف شرط تصفية varchar_field1 == "Product A" أثناء البحث. هذا يضمن ألا تكون نتائج البحث مشابهة لمتجه الاستعلام فحسب، بل تتطابق أيضًا مع شرط عامل تصفية السلسلة المحدد. لمزيد من المعلومات، راجع تصفية البيانات الوصفية.

    diff --git a/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.json b/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.json new file mode 100644 index 000000000..26ada0eda --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"category\": \"electronics\",​\n \"price\": 99.99,​\n \"brand\": \"BrandA\"​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"metadata\")​\n .dataType(DataType.JSON)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export jsonField='{​\n \"fieldName\": \"metadata\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $jsonField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","​\nindex_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","const indexParams = {​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metricType: MetricType.CONSINE,​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_json_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_json_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_json_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_json_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# Data to be inserted​\ndata = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\n# Insert data into the collection​\nclient.insert(​\n collection_name=\"your_collection_name\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"home_appliances\\\", \\\"price\\\": 249.99, \\\"brand\\\": \\\"BrandB\\\"}, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"furniture\\\", \\\"price\\\": 399.99, \\\"brand\\\": \\\"BrandC\\\"}, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_json_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\nclient.insert({​\n collection_name: \"my_json_collection\",​\n data: data​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n } ​\n ],​\n \"collectionName\": \"my_json_collection\"​\n}'​\n\n","filter = 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150'​\n​\nres = client.query(​\n collection_name=\"my_json_collection\",​\n filter=filter,​\n output_fields=[\"metadata\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_json_collection\")​\n .filter(filter)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}, pk=1})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n output_fields: ['metadata']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"filter\": \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\",​\n \"outputFields\": [\"metadata\"]​\n}'​\n{\"code\":0,\"cost\":0,\"data\":[{\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\",\"pk\":1}]}​\n\n","filter = 'metadata[\"brand\"] == \"BrandA\"'​\n​\nres = client.search(​\n collection_name=\"my_json_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"metadata\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_json_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_json_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['metadata'],​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"metadata\"],​\n \"filter\": \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"id\":1,\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\"}]}​\n\n"],"headingContent":"JSON Field​","anchorList":[{"label":"حقل JSON","href":"JSON-Field​","type":1,"isActive":false},{"label":"إضافة حقل JSON","href":"Add-JSON-field​","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"Create-collection​","type":2,"isActive":false},{"label":"إدراج البيانات","href":"Insert-data​","type":2,"isActive":false},{"label":"البحث والاستعلام","href":"Search-and-query​","type":2,"isActive":false},{"label":"الحدود","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.md b/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.md new file mode 100644 index 000000000..84326a075 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/schema/use-json-fields.md @@ -0,0 +1,523 @@ +--- +id: use-json-fields.md +title: استخدام حقول JSON +summary: >- + JSON (تدوين كائنات جافا سكريبت) هو تنسيق خفيف الوزن لتبادل البيانات يوفر طريقة + مرنة لتخزين هياكل البيانات المعقدة والاستعلام عنها. في Milvus، يمكنك تخزين + معلومات منظمة إضافية إلى جانب بيانات المتجهات باستخدام حقول JSON، مما يتيح + عمليات بحث واستعلامات متقدمة تجمع بين تشابه المتجهات والتصفية المنظمة. +--- +

    حقل JSON

    JSON (تدوين كائنات JavaScript) هو تنسيق خفيف الوزن لتبادل البيانات يوفر طريقة مرنة لتخزين هياكل البيانات المعقدة والاستعلام عنها. في Milvus، يمكنك تخزين معلومات منظمة إضافية إلى جانب بيانات المتجهات باستخدام حقول JSON، مما يتيح عمليات بحث واستعلامات متقدمة تجمع بين تشابه المتجهات والتصفية المنظمة.

    +

    تعتبر حقول JSON مثالية للتطبيقات التي تتطلب بيانات وصفية لتحسين نتائج الاسترجاع. على سبيل المثال، في التجارة الإلكترونية، يمكن تعزيز ناقلات المنتجات بسمات مثل الفئة والسعر والعلامة التجارية. في أنظمة التوصيات، يمكن دمج ناقلات المستخدم مع التفضيلات والمعلومات الديموغرافية. فيما يلي مثال لحقل JSON نموذجي.

    +
    {​
    +  "category": "electronics",​
    +  "price": 99.99,​
    +  "brand": "BrandA"​
    +}​
    +
    +
    +

    إضافة حقل JSON

    لاستخدام حقول JSON في Milvus، قم بتعريف نوع الحقل ذي الصلة في مخطط المجموعة، مع تعيين datatype إلى نوع JSON المدعوم، أي JSON.

    +

    إليك كيفية تعريف مخطط مجموعة يتضمن حقل JSON.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("metadata")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "metadata",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $jsonField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    في هذا المثال، نضيف حقل JSON يسمى metadata لتخزين البيانات الوصفية الإضافية المتعلقة ببيانات المتجه، مثل فئة المنتج والسعر ومعلومات العلامة التجارية.

    +
    +

    يكون الحقل الأساسي وحقل المتجه إلزاميًا عند إنشاء مجموعة. يعرّف الحقل الأساسي كل كيان بشكل فريد، في حين أن حقل المتجه مهم للبحث عن التشابه. لمزيد من التفاصيل، راجع الحقل الأساسي والمعرف التلقائي أو المتجه الكثيف أو المتجه الثنائي أو المتجه المتناثر.

    +
    +

    إنشاء مجموعة

    عند إنشاء مجموعة، يجب إنشاء فهرس للحقل المتجه لضمان أداء الاسترجاع. في هذا المثال، نستخدم في هذا المثال AUTOINDEX لتبسيط إعداد الفهرس. لمزيد من التفاصيل، راجع AUTOINDEX.

    + +
    ​
    +index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metricType: MetricType.CONSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    استخدم المخطط المحدد ومعلمات الفهرس لإنشاء مجموعة.

    + +
    client.create_collection(​
    +    collection_name="my_json_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_json_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_json_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    بعد إنشاء المجموعة، يمكنك إدراج البيانات التي تتضمن حقول JSON.

    + +
    # Data to be inserted​
    +data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +# Insert data into the collection​
    +client.insert(​
    +    collection_name="your_collection_name",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"}, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"}, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +client.insert({​
    +    collection_name: "my_json_collection",​
    +    data: data​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +            "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +            "pk": 1,​
    +            "embedding": [0.12, 0.34, 0.56]​
    +        },​
    +        {​
    +            "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +            "pk": 2,​
    +            "embedding": [0.56, 0.78, 0.90]​
    +        },​
    +        {​
    +            "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +            "pk": 3,​
    +            "embedding": [0.91, 0.18, 0.23]​
    +        }       ​
    +    ],​
    +    "collectionName": "my_json_collection"​
    +}'​
    +
    +
    +

    في هذا المثال

    +
      +
    • يتضمن كل إدخال بيانات حقلاً أساسيًا (pkmetadata كحقل JSON لتخزين معلومات مثل فئة المنتج والسعر والعلامة التجارية.

    • +
    • embedding حقل متجه ثلاثي الأبعاد يُستخدم للبحث عن تشابه المتجهات.

    • +
    +

    البحث والاستعلام

    تسمح حقول JSON بالتصفية العددية أثناء عمليات البحث، مما يعزز قدرات البحث المتجهية في Milvus. يمكنك الاستعلام بناءً على خصائص JSON إلى جانب تشابه المتجهات.

    +

    تصفية الاستعلامات

    يمكنك تصفية البيانات بناءً على خصائص JSON، مثل مطابقة قيم محددة أو التحقق مما إذا كان الرقم يقع ضمن نطاق معين.

    + +
    filter = 'metadata["category"] == "electronics" and metadata["price"] < 150'​
    +​
    +res = client.query(​
    +    collection_name="my_json_collection",​
    +    filter=filter,​
    +    output_fields=["metadata"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .filter(filter)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +    output_fields: ['metadata']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "filter": "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150",​
    +    "outputFields": ["metadata"]​
    +}'​
    +{"code":0,"cost":0,"data":[{"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}","pk":1}]}​
    +
    +
    +

    في الاستعلام أعلاه، يقوم Milvus بتصفية الكيانات التي يكون فيها الحقل metadata فئة "electronics" وسعر أقل من 150، وإرجاع الكيانات التي تطابق هذه المعايير.

    +

    البحث المتجه مع تصفية JSON

    من خلال الجمع بين تشابه المتجهات مع تصفية JSON، يمكنك التأكد من أن البيانات المسترجعة لا تتطابق دلاليًا فحسب، بل تفي أيضًا بشروط عمل محددة، مما يجعل نتائج البحث أكثر دقة وتوافقًا مع احتياجات المستخدم.

    + +
    filter = 'metadata["brand"] == "BrandA"'​
    +​
    +res = client.search(​
    +    collection_name="my_json_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["metadata"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "metadata[\"brand\"] == \"BrandA\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_json_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['metadata'],​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["metadata"],​
    +    "filter": "metadata[\"brand\"] == \"BrandA\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.24793813,"id":1,"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}"}]}​
    +
    +
    +

    في هذا المثال، يقوم Milvus بإرجاع أفضل 5 كيانات الأكثر تشابهًا مع متجه الاستعلام، مع احتواء الحقل metadata على علامة تجارية "BrandA".

    +

    بالإضافة إلى ذلك، يدعم Milvus عوامل تصفية JSON المتقدمة مثل JSON_CONTAINS و JSON_CONTAINS_ALL و JSON_CONTAINS_ANY ، والتي يمكن أن تعزز قدرات الاستعلام بشكل أكبر. لمزيد من التفاصيل، راجع تصفية البيانات الوصفية.

    +

    الحدود

      +
    • حدود الفهرسة: نظرًا لتعقيد هياكل البيانات، لا يتم دعم فهرسة حقول JSON.

    • +
    • مطابقة نوع البيانات: إذا كانت قيمة المفتاح لحقل JSON عبارة عن عدد صحيح أو نقطة عائمة، فلا يمكن مقارنتها إلا مع مفتاح آخر صحيح أو عائم أو INT32/64 أو FLOAT32/64. إذا كانت قيمة المفتاح سلسلة (VARCHAR)، فلا يمكن مقارنتها إلا مع مفتاح سلسلة آخر.

    • +
    • قيود التسمية: عند تسمية مفاتيح JSON، يوصى باستخدام الأحرف والأحرف الرقمية والأحرف السفلية فقط، لأن الأحرف الأخرى قد تسبب مشاكل أثناء التصفية أو البحث.

    • +
    • التعامل مع قيم السلسلة: بالنسبة لقيم السلسلة (VARCHAR)، يخزن Milvus سلاسل حقول JSON كما هي دون تحويل دلالي. على سبيل المثال 'a"b' "a'b" و 'a\\'b' و و "a\\"b" يتم تخزينها كما تم إدخالها ؛ ومع ذلك، 'a'b' و "a"b" تعتبر غير صالحة.

    • +
    • التعامل مع القواميس المتداخلة: يتم التعامل مع أي قواميس متداخلة داخل قيم حقول JSON كسلاسل.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.json new file mode 100644 index 000000000..86367227d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​\n\n","filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_LENGTH(history_temperatures) < 10'​\n\n"],"headingContent":"ARRAY Operators​","anchorList":[{"label":"مشغلات المصفوفات","href":"ARRAY-Operators​","type":1,"isActive":false},{"label":"معاملات ARRAY المتاحة","href":"Available-ARRAY-Operators​","type":2,"isActive":false},{"label":"ARRAY_CONTAINS","href":"ARRAYCONTAINS​","type":2,"isActive":false},{"label":"array_contains_all","href":"ARRAYCONTAINSALL​","type":2,"isActive":false},{"label":"مصفوفة_تحتوي_على_أي","href":"ARRAYCONTAINSANY​","type":2,"isActive":false},{"label":"ARRAY_LENGTH","href":"ARRAYLENGTH​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.md new file mode 100644 index 000000000..1a43d6eb8 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/array-operators.md @@ -0,0 +1,136 @@ +--- +id: array-operators.md +summary: >- + يوفر Milvus مشغلات قوية للاستعلام عن حقول المصفوفات، مما يسمح لك بتصفية + الكيانات واسترجاعها بناءً على محتويات المصفوفات. +title: مشغلات المصفوفات +--- +

    مشغلات المصفوفات

    يوفر Milvus مشغلات قوية للاستعلام عن حقول المصفوفات، مما يسمح لك بتصفية الكيانات واسترجاعها بناءً على محتويات المصفوفات.

    +
    +

    يجب أن تكون جميع العناصر داخل المصفوفة من نفس النوع، ويتم التعامل مع البنى المتداخلة داخل المصفوفات كسلاسل عادية. ولذلك، عند العمل مع حقول ARRAY، يُنصح بتجنب التداخل العميق بشكل مفرط والتأكد من أن بنيات البيانات الخاصة بك مسطحة قدر الإمكان لتحقيق الأداء الأمثل.

    +
    +

    معاملات ARRAY المتاحة

    تسمح مشغلات ARRAY بالاستعلام الدقيق لحقول المصفوفات في ميلفوس. هذه المعاملات هي.

    + +

    ARRAY_CONTAINS

    يتحقق المشغل ARRAY_CONTAINS من وجود عنصر محدد في حقل مصفوفة. يكون مفيدًا عندما تريد العثور على كيانات حيث يوجد عنصر معين في المصفوفة.

    +

    مثال

    +

    لنفترض أن لديك حقل مصفوفة history_temperatures ، والذي يحتوي على أدنى درجات الحرارة المسجلة لسنوات مختلفة. للعثور على جميع الكيانات التي تحتوي فيها المصفوفة على القيمة 23 ، يمكنك استخدام تعبير التصفية التالي.

    +
    filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​
    +
    +
    +

    سيعيد هذا جميع الكيانات حيث تحتوي المصفوفة history_temperatures على القيمة 23.

    +

    array_contains_all

    يضمن المشغل ARRAY_CONTAINS_ALL وجود جميع عناصر القائمة المحددة في حقل المصفوفة. يكون هذا العامل مفيدًا عندما تريد مطابقة الكيانات التي تحتوي على قيم متعددة في المصفوفة.

    +

    مثال

    +

    إذا كنت تريد العثور على جميع الكيانات التي تحتوي فيها المصفوفة history_temperatures على كل من 23 و 24 ، يمكنك استخدام.

    +
    filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​
    +
    +
    +

    سيؤدي هذا إلى إرجاع جميع الكيانات حيث تحتوي المصفوفة history_temperatures على كل من القيم المحددة.

    +

    مصفوفة_تحتوي_على_أي

    يتحقق المشغل ARRAY_CONTAINS_ANY مما إذا كان أي من عناصر القائمة المحددة موجودًا في حقل المصفوفة. هذا مفيد عندما تريد مطابقة الكيانات التي تحتوي على قيمة واحدة على الأقل من القيم المحددة في المصفوفة.

    +

    مثال

    +

    للعثور على جميع الكيانات حيث تحتوي المصفوفة history_temperatures على 23 أو 24 ، يمكنك استخدام.

    +
    filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​
    +
    +
    +

    سيؤدي هذا إلى إرجاع جميع الكيانات حيث تحتوي المصفوفة history_temperatures على واحدة على الأقل من القيمتين 23 أو 24.

    +

    ARRAY_LENGTH

    يسمح لك المشغل ARRAY_LENGTH بتصفية الكيانات بناءً على عدد العناصر في حقل مصفوفة. هذا مفيد عندما تحتاج إلى العثور على كيانات ذات مصفوفات ذات طول معين.

    +

    مثال

    +

    إذا كنت تريد العثور على جميع الكيانات التي تحتوي المصفوفة history_temperatures على أقل من 10 عناصر، يمكنك استخدام.

    +
    filter = 'ARRAY_LENGTH(history_temperatures) < 10'​
    +
    +
    +

    سيؤدي هذا إلى إرجاع جميع الكيانات التي تحتوي المصفوفة history_temperatures على أقل من 10 عناصر.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.json new file mode 100644 index 000000000..5670b45e5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'status == \"active\"'​\n\n","filter = 'status != \"inactive\"'​\n\n","filter = 'age > 30'​\n\n","filter = 'price < 100'​\n\n","filter = 'rating >= 4'​\n\n","filter = 'discount <= 10'​\n\n","filter = 'color in [\"red\", \"green\", \"blue\"]'​\n\n","filter = 'name LIKE \"Prod%\"'​\n\n","filter = 'name LIKE \"%XYZ\"'​\n\n","filter = 'name LIKE \"%Pro%\"'​\n\n","filter = 'total == base_price + tax'​\n\n","filter = 'quantity - quantity_sold > 50'​\n\n","filter = 'price * quantity > 1000'​\n\n","filter = 'total_price / quantity < 50'​\n\n","filter = 'id % 2 == 0'​\n\n","filter = 'price ** 2 > 1000'​\n\n","filter = 'price > 100 AND stock > 50'​\n\n","filter = 'color == \"red\" OR color == \"blue\"'​\n\n","filter = 'NOT color == \"green\"'​\n\n","filter = 'product[\"price\"] > 1000'​\n\n","filter = 'history_temperatures[0] > 30'​\n\n"],"headingContent":"Basic Operators​","anchorList":[{"label":"المشغلات الأساسية","href":"Basic-Operators​","type":1,"isActive":false},{"label":"عوامل المقارنة","href":"Comparison-operators​","type":2,"isActive":false},{"label":"عوامل النطاق","href":"Range-operators​","type":2,"isActive":false},{"label":"المعاملات الحسابية","href":"Arithmetic-Operators​","type":2,"isActive":false},{"label":"المعاملات المنطقية","href":"Logical-Operators​","type":2,"isActive":false},{"label":"نصائح حول استخدام عوامل التشغيل الأساسية مع حقول JSON و ARRAY","href":"Tips-on-Using-Basic-Operators-with-JSON-and-ARRAY-Fields​","type":2,"isActive":false},{"label":"خاتمة","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.md new file mode 100644 index 000000000..0d6504b8b --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/basic-operators.md @@ -0,0 +1,236 @@ +--- +id: basic-operators.md +summary: >- + يوفر Milvus مجموعة غنية من العوامل الأساسية لمساعدتك في تصفية البيانات + والاستعلام عنها بكفاءة. تسمح لك هذه العوامل بتحسين شروط البحث الخاصة بك + استنادًا إلى الحقول القياسية والحسابات الرقمية والشروط المنطقية وغيرها. يعد + فهم كيفية استخدام هذه العوامل أمرًا بالغ الأهمية لبناء استعلامات دقيقة وزيادة + كفاءة عمليات البحث الخاصة بك. +title: المشغلون الأساسيون +--- +

    المشغلات الأساسية

    يوفر ميلفوس مجموعة غنية من العوامل الأساسية لمساعدتك في تصفية البيانات والاستعلام عنها بكفاءة. تسمح لك هذه المعاملات بتحسين شروط البحث الخاصة بك بناءً على الحقول القياسية والحسابات الرقمية والشروط المنطقية وغيرها. يعد فهم كيفية استخدام هذه العوامل أمرًا بالغ الأهمية لبناء استعلامات دقيقة وزيادة كفاءة عمليات البحث الخاصة بك.

    +

    عوامل المقارنة

    تُستخدم عوامل المقارنة لتصفية البيانات بناءً على التساوي أو عدم المساواة أو الحجم. وهي قابلة للتطبيق على الحقول الرقمية والنصية والتاريخية.

    +

    عوامل المقارنة المدعومة.

      +
    • == (يساوي إلى)

    • +
    • != (لا يساوي)

    • +
    • > (أكبر من)

    • +
    • < (أقل من)

    • +
    • >= (أكبر من أو يساوي)

    • +
    • <= (أقل من أو يساوي)

    • +
    +

    مثال 1: التصفية باستخدام Equal To (==)

    افترض أن لديك حقلًا باسم status وتريد العثور على جميع الكيانات التي يكون فيها status "نشط". يمكنك استخدام عامل المساواة ==.

    +
    filter = 'status == "active"'​
    +
    +
    +

    مثال 2: التصفية باستخدام لا يساوي (!=)

    للعثور على الكيانات حيث status ليس "غير نشط".

    +
    filter = 'status != "inactive"'​
    +
    +
    +

    مثال 3: التصفية باستخدام أكبر من (>)

    إذا كنت تريد العثور على جميع الكيانات التي تحتوي على age أكبر من 30

    +
    filter = 'age > 30'​
    +
    +
    +

    مثال 4: التصفية باستخدام أقل من (<)

    للعثور على الكيانات التي يكون فيها price أقل من 100.

    +
    filter = 'price < 100'​
    +
    +
    +

    مثال 5: التصفية باستخدام أكبر من أو يساوي (>=)

    إذا كنت ترغب في العثور على جميع الكيانات ذات rating أكبر من أو يساوي 4.

    +
    filter = 'rating >= 4'​
    +
    +
    +

    مثال 6: التصفية باستخدام أقل من أو يساوي (<=)

    للعثور على الكيانات التي تحتوي على discount أقل من أو تساوي 10٪.

    +
    filter = 'discount <= 10'​
    +
    +
    +

    عوامل النطاق

    تساعد عوامل تشغيل النطاق في تصفية البيانات بناءً على مجموعات أو نطاقات محددة من القيم.

    +

    معاملات النطاق المدعومة.

      +
    • IN: تستخدم لمطابقة القيم ضمن مجموعة أو نطاق محدد.

    • +
    • LIKE: يُستخدم لمطابقة نمط (غالبًا للحقول النصية).

    • +
    +

    مثال 1: استخدام IN لمطابقة قيم متعددة

    إذا كنت تريد العثور على جميع الكيانات التي يكون فيها color إما "أحمر" أو "أخضر" أو "أزرق".

    +
    filter = 'color in ["red", "green", "blue"]'​
    +
    +
    +

    يكون هذا مفيدًا عندما تريد التحقق من العضوية في قائمة من القيم.

    +

    مثال 2: استخدام LIKE لمطابقة الأنماط

    يُستخدم المشغل LIKE لمطابقة الأنماط في حقول السلاسل. يمكنه مطابقة السلاسل الفرعية في مواضع مختلفة داخل النص: كبادئة أو لاحقة أو لاحقة. يستخدم المشغل LIKE الرمز % كحرف بدل، والذي يمكن أن يطابق أي عدد من الأحرف (بما في ذلك الصفر).

    +

    مطابقة البادئة (يبدأ بـ)

    لإجراء مطابقة البادئة، حيث تبدأ السلسلة بنمط معين، يمكنك وضع النمط في البداية واستخدام % لمطابقة أي أحرف تليه. على سبيل المثال، للعثور على جميع المنتجات التي يبدأ اسمها name بـ "Prod".

    +
    filter = 'name LIKE "Prod%"'​
    +
    +
    +

    سيطابق هذا أي منتج يبدأ اسمه بـ "Prod"، مثل "المنتج أ"، "المنتج ب"، إلخ.

    +

    مطابقة لاحقة (تنتهي بـ)

    لمطابقة اللاحقة، حيث تنتهي السلسلة بنمط معين، ضع الرمز % في بداية النمط. على سبيل المثال، للعثور على جميع المنتجات التي ينتهي اسمها name بـ "XYZ".

    +
    filter = 'name LIKE "%XYZ"'​
    +
    +
    +

    سيؤدي هذا إلى مطابقة أي منتج ينتهي اسمه بـ "XYZ"، مثل "ProductXYZ"، "SampleXYZ"، إلخ.

    +

    مطابقة لاحقة (يحتوي على)

    لإجراء تطابق لاحق، حيث يمكن أن يظهر النمط في أي مكان في السلسلة، يمكنك وضع الرمز % في بداية النمط ونهايته. على سبيل المثال، للعثور على جميع المنتجات التي يحتوي name على كلمة "Pro".

    +
    filter = 'name LIKE "%Pro%"'​
    +
    +
    +

    سيتطابق هذا مع أي منتج يحتوي اسمه على السلسلة الفرعية "Pro"، مثل "منتج" أو "ProLine" أو "ProPro" أو "SuperPro".

    +

    المعاملات الحسابية

    تسمح لك العوامل الحسابية بإنشاء شروط تستند إلى عمليات حسابية تتضمن حقول رقمية.

    +

    المعاملات الحسابية المدعومة.

      +
    • + (الجمع)

    • +
    • - (الطرح)

    • +
    • * (الضرب)

    • +
    • / (القسمة)

    • +
    • % (المقياس)

    • +
    • ** (الأس)

    • +
    +

    مثال 1: استخدام الجمع (+)

    لإيجاد الكيانات التي يكون فيها سعر total هو مجموع base_price و tax.

    +
    filter = 'total == base_price + tax'​
    +
    +
    +

    مثال 2: استخدام الطرح (-)

    للعثور على الكيانات التي يكون فيها quantity أكبر من 50 و quantity_sold أقل من 30.

    +
    filter = 'quantity - quantity_sold > 50'​
    +
    +
    +

    مثال 3: استخدام الضرب (*)

    للعثور على الكيانات التي يكون فيها price أكبر من 100 و quantity أكبر من 10، مضروبًا.

    +
    filter = 'price * quantity > 1000'​
    +
    +
    +

    مثال 4: استخدام القسمة (/)

    للعثور على الكيانات التي يكون فيها total_price مقسومًا على quantity أقل من 50.

    +
    filter = 'total_price / quantity < 50'​
    +
    +
    +

    مثال 5: استخدام المقياس (%)

    لإيجاد الكيانات التي يكون فيها id عددًا زوجيًا (أي يقبل القسمة على 2).

    +
    filter = 'id % 2 == 0'​
    +
    +
    +

    مثال 6: استخدام الأس (**)

    للعثور على الكيانات التي يكون فيها price مرفوعًا للقوة 2 أكبر من 1000.

    +
    filter = 'price ** 2 > 1000'​
    +
    +
    +

    المعاملات المنطقية

    تُستخدم العوامل المنطقية لدمج عدة شروط في تعبير مرشح أكثر تعقيدًا. وتشمل هذه AND و OR و NOT.

    +

    المعاملات المنطقية المدعومة.

      +
    • AND: يجمع بين عدة شروط يجب أن تكون جميعها صحيحة.

    • +
    • OR: يجمع بين شروط يجب أن يكون أحدها على الأقل صحيحًا.

    • +
    • NOT: ينفي الشرط.

    • +
    +

    مثال 1: استخدام AND للجمع بين الشروط

    للعثور على جميع المنتجات التي يكون فيها price أكبر من 100 و stock أكبر من 50.

    +
    filter = 'price > 100 AND stock > 50'​
    +
    +
    +

    مثال 2: استخدام OR لدمج الشروط

    للعثور على جميع المنتجات التي يكون فيها color إما "أحمر" أو "أزرق".

    +
    filter = 'color == "red" OR color == "blue"'​
    +
    +
    +

    مثال 3: استخدام NOT لاستبعاد شرط

    للعثور على جميع المنتجات حيث color ليس "أخضر".

    +
    filter = 'NOT color == "green"'​
    +
    +
    +

    نصائح حول استخدام عوامل التشغيل الأساسية مع حقول JSON و ARRAY

    في حين أن المشغلات الأساسية في Milvus متعددة الاستخدامات ويمكن تطبيقها على الحقول القياسية، إلا أنه يمكن استخدامها أيضًا بفعالية مع المفاتيح والفهارس في حقلي JSON و ARRAY.

    +

    على سبيل المثال، إذا كان لديك حقل product يحتوي على مفاتيح متعددة مثل price و model و tags ، فقم دائمًا بالرجوع إلى المفتاح مباشرةً.

    +
    filter = 'product["price"] > 1000'​
    +
    +
    +

    للعثور على السجلات التي تتجاوز فيها درجة الحرارة الأولى في مصفوفة من درجات الحرارة المسجلة قيمة معينة، استخدم.

    +
    filter = 'history_temperatures[0] > 30'​
    +
    +
    +

    خاتمة

    يقدم Milvus مجموعة من العوامل الأساسية التي تمنحك المرونة في تصفية بياناتك والاستعلام عنها. من خلال الجمع بين المقارنة والنطاق والعوامل الحسابية والمنطقية، يمكنك إنشاء تعبيرات تصفية قوية لتضييق نطاق نتائج البحث واسترداد البيانات التي تحتاجها بكفاءة.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.json new file mode 100644 index 000000000..9a504d8ba --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.json @@ -0,0 +1 @@ +{"codeList":["filter='color in [\"red\", \"green\", \"blue\"]'​\n\n","filter='product[\"model\"] == \"JSN-087\" and product[\"price\"] < 1850'​\n\n","filter='history_temperatures[10] > 23'​\n\n","filter = \"age > 25 and city in ['北京', '上海']\"​\n\n","filter = \"age > {age} and city in {city}\",​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter='json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n","filter=\"ARRAY_CONTAINS(history_temperatures, 23)\"​\n\n","filter=\"ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_LENGTH(history_temperatures) < 10\"​\n\n"],"headingContent":"Filtering Explained​","anchorList":[{"label":"شرح التصفية","href":"Filtering-Explained​","type":1,"isActive":false},{"label":"العوامل الأساسية","href":"Basic-operators​","type":2,"isActive":false},{"label":"قوالب تعبيرات التصفية","href":"Filter-expression-templates​","type":2,"isActive":false},{"label":"المشغلات الخاصة بنوع البيانات","href":"Data-type-specific-operators​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.md new file mode 100644 index 000000000..47600876e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/boolean.md @@ -0,0 +1,145 @@ +--- +id: boolean.md +summary: >- + يوفر برنامج Milvus إمكانات تصفية قوية تتيح الاستعلام الدقيق عن بياناتك. تسمح + لك تعبيرات التصفية باستهداف حقول قياسية محددة وتنقيح نتائج البحث بشروط مختلفة. + يشرح هذا الدليل كيفية استخدام تعبيرات التصفية في ملفوس، مع أمثلة تركز على + عمليات الاستعلام. يمكنك أيضًا تطبيق هذه المرشحات في طلبات البحث والحذف. +title: شرح التصفية +--- +

    شرح التصفية

    يوفر برنامج Milvus إمكانات تصفية قوية تتيح الاستعلام الدقيق عن بياناتك. تسمح لك تعبيرات التصفية باستهداف حقول قياسية محددة وتنقيح نتائج البحث بشروط مختلفة. يشرح هذا الدليل كيفية استخدام تعبيرات التصفية في ملفوس، مع أمثلة تركز على عمليات الاستعلام. يمكنك أيضًا تطبيق هذه المرشحات في طلبات البحث والحذف.

    +

    العوامل الأساسية

    يدعم ملفوس العديد من العوامل الأساسية لتصفية البيانات.

    +
      +
    • عوامل المقارنة == != و > و و < و >= و <= تسمح بالتصفية بناءً على حقول رقمية أو نصية أو تاريخية.

    • +
    • مرشحات النطاق: IN و LIKE تساعد في مطابقة نطاقات أو مجموعات قيم محددة.

    • +
    • المعاملات الحسابية: + - و * و و / و % و "" تستخدم للحسابات التي تتضمن حقولًا رقمية.

    • +
    • المعاملات المنطقية: AND ، OR ، و NOT أو "&&"، "|"، "|"، "~"، "!" تجمع بين عدة شروط في تعبيرات معقدة.

    • +
    +

    مثال: التصفية حسب اللون

    للعثور على كيانات ذات ألوان أساسية (أحمر، أو أخضر، أو أزرق) في حقل قياسي color ، استخدم تعبير التصفية التالي.

    +
    filter='color in ["red", "green", "blue"]'​
    +
    +
    +

    مثال: تصفية حقول JSON

    يسمح ميلفوس بالرجوع إلى المفاتيح في حقول JSON. على سبيل المثال، إذا كان لديك حقل JSON product مع المفتاحين price و model ، وتريد العثور على منتجات ذات طراز وسعر محدد أقل من 1850، استخدم تعبير التصفية هذا.

    +
    filter='product["model"] == "JSN-087" and product["price"] < 1850'​
    +
    +
    +

    مثال: تصفية حقول المصفوفات

    إذا كان لديك حقل مصفوفة history_temperatures يحتوي على سجلات درجات الحرارة، وتريد العثور على المراصد التي تتجاوز درجة الحرارة المسجلة فيها 10 درجات حرارة مسجلة 23 درجة مئوية، استخدم هذا التعبير.

    +
    filter='history_temperatures[10] > 23'​
    +
    +
    +

    لمزيد من المعلومات حول هذه العوامل الأساسية، راجع المعاملات الأساسية.

    +

    قوالب تعبيرات التصفية

    عند التصفية باستخدام أحرف CJK، يمكن أن تكون المعالجة أكثر تعقيدًا بسبب مجموعات الأحرف الأكبر واختلافات الترميز. يمكن أن يؤدي ذلك إلى أداء أبطأ، خاصةً مع المشغل IN.

    +

    يقدم Milvus قوالب تعبيرات التصفية لتحسين الأداء عند العمل مع أحرف CJK. من خلال فصل القيم الديناميكية عن تعبير عامل التصفية، يتعامل محرك الاستعلام مع إدخال المعلمات بكفاءة أكبر.

    +

    مثال

    للعثور على الأفراد الذين تزيد أعمارهم عن 25 عامًا ويعيشون إما في "北京" (بكين) أو "海海 海" (شنغهاي)، استخدم تعبير القالب التالي.

    +
    filter = "age > 25 and city in ['北京', '上海']"​
    +
    +
    +

    لتحسين الأداء، استخدم هذا الشكل مع المعلمات.

    +
    filter = "age > {age} and city in {city}",​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    هذا الأسلوب يقلل من عبء التحليل ويحسن سرعة الاستعلام. للمزيد من المعلومات، راجع نموذج التصفية.

    +

    المشغلات الخاصة بنوع البيانات

    يوفر Milvus عوامل تصفية متقدمة لأنواع بيانات محددة، مثل حقول JSON و ARRAY و VARCHAR.

    +

    مشغلات خاصة بحقل JSON

    يوفر Milvus مشغلات متقدمة للاستعلام عن حقول JSON، مما يتيح تصفية دقيقة داخل هياكل JSON المعقدة.

    +

    JSON_CONTAINS(identifier, jsonExpr): التحقق من وجود تعبير JSON في الحقل.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains(tags, "sale")'​
    +
    +
    +

    JSON_CONTAINS_ALL(identifier, jsonExpr): يتأكد من وجود جميع عناصر تعبير JSON.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter='json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    JSON_CONTAINS_ANY(identifier, jsonExpr): يقوم بتصفية الكيانات التي يوجد فيها عنصر واحد على الأقل في تعبير JSON.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    لمزيد من التفاصيل حول مشغلي JSON، راجع مشغلي JSON.

    +

    المشغلات الخاصة بحقل ARRAY

    يوفر ميلفوس عوامل تصفية متقدمة لحقول المصفوفات، مثل ARRAY_CONTAINS و ARRAY_CONTAINS_ALL و ARRAY_CONTAINS_ANY و ARRAY_LENGTH ، والتي تسمح بالتحكم الدقيق في بيانات المصفوفات.

    +

    ARRAY_CONTAINS: تصفية الكيانات التي تحتوي على عنصر معين.

    +
    filter="ARRAY_CONTAINS(history_temperatures, 23)"​
    +
    +
    +

    ARRAY_CONTAINS_ALL: تصفية الكيانات التي تحتوي على جميع العناصر الموجودة في القائمة.

    +
    filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_CONTAINS_ANY: : تصفية الكيانات التي تحتوي على أي عنصر من القائمة.

    +
    filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_LENGTH: تصفيات بناءً على طول المصفوفة.

    +
    filter="ARRAY_LENGTH(history_temperatures) < 10"​
    +
    +
    +

    لمزيد من التفاصيل حول مشغلي المصفوفة، راجع مشغلي ARRAY.

    +

    المشغلات الخاصة بحقل VARCHAR

    يسمح المشغل Text_Match باسترجاع المستندات بدقة بناءً على مصطلحات استعلام محددة. وهو مفيد بشكل خاص لعمليات البحث المصفاة التي تجمع بين المرشحات القياسية وعمليات البحث عن التشابه المتجه. على عكس عمليات البحث الدلالية، يركّز Text Match على التكرارات الدقيقة للمصطلحات.

    +

    يستخدم ميلفوس تانتيفي لدعم الفهرسة المقلوبة والبحث النصي القائم على المصطلحات. تتضمن العملية

    +
      +
    1. المحلّل: ترميز النص المدخلات ومعالجتها.

    2. +
    3. الفهرسة: ينشئ فهرسًا مقلوبًا يعيّن الرموز الفريدة للمستندات.

    4. +
    +

    لمزيد من التفاصيل، راجع مطابقة النص.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.json new file mode 100644 index 000000000..53d25dc32 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.json @@ -0,0 +1 @@ +{"codeList":["filter = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.search(​\n \"hello_milvus\",​\n vectors[:nq],​\n filter=expr,​\n limit=10,​\n output_fields=[\"age\", \"city\"],​\n search_params={\"metric_type\": \"COSINE\", \"params\": {\"search_list\": 100}},​\n filter_params=filter_params,​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.query(​\n \"hello_milvus\",​\n filter=expr,​\n output_fields=[\"age\", \"city\"],​\n filter_params=filter_params​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.delete(​\n \"hello_milvus\",​\n filter=expr,​\n filter_params=filter_params​\n)​\n\n"],"headingContent":"Filter Templating​","anchorList":[{"label":"تصميم عامل التصفية","href":"Filter-Templating​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"عمليات البحث","href":"Search-Operations​","type":2,"isActive":false},{"label":"عمليات الاستعلام","href":"Query-Operations​","type":2,"isActive":false},{"label":"عمليات الحذف","href":"Delete-Operations​","type":2,"isActive":false},{"label":"الخلاصة","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.md new file mode 100644 index 000000000..c3b21e0f9 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/filtering-templating.md @@ -0,0 +1,154 @@ +--- +id: filtering-templating.md +summary: >- + في Milvus، يمكن أن تؤثر تعبيرات التصفية المعقدة التي تحتوي على العديد من + العناصر، خاصةً تلك التي تتضمن أحرفًا غير ASCII مثل أحرف CJK، بشكل كبير على + أداء الاستعلام. ولمعالجة هذه المشكلة، يقدم ميلفوس آلية نمذجة تعبيرات التصفية + المصممة لتحسين الكفاءة من خلال تقليل الوقت المستغرق في تحليل التعبيرات + المعقدة. تشرح هذه الصفحة استخدام نموذج تعبير المرشح في عمليات البحث والاستعلام + والحذف. +title: تصفية القوالب النمذجة +--- +

    تصميم عامل التصفية

    في Milvus، يمكن أن تؤثر تعبيرات التصفية المعقدة التي تحتوي على العديد من العناصر، خاصة تلك التي تتضمن أحرفًا غير ASCII مثل أحرف CJK، بشكل كبير على أداء الاستعلام. ولمعالجة هذه المشكلة، يقدم ميلفوس آلية نمذجة تعبيرات التصفية المصممة لتحسين الكفاءة من خلال تقليل الوقت المستغرق في تحليل التعبيرات المعقدة. تشرح هذه الصفحة استخدام نموذج تعبير المرشح في عمليات البحث والاستعلام والحذف.

    +

    نظرة عامة

    يسمح لك نمذجة تعبير التصفية بإنشاء تعبيرات التصفية مع العناصر النائبة التي يمكن استبدالها ديناميكيًا بقيم أثناء تنفيذ الاستعلام. باستخدام القالب، يمكنك تجنب تضمين المصفوفات الكبيرة أو التعبيرات المعقدة مباشرةً في عامل التصفية، مما يقلل من وقت التحليل ويحسن أداء الاستعلام.

    +

    لنفترض أن لديك تعبير مرشح يتضمن حقلين، age و city ، وتريد العثور على جميع الأشخاص الذين تزيد أعمارهم عن 25 عامًا ويعيشون إما في "北京 海" (بكين) أو "海 海" (شنغهاي). بدلاً من تضمين القيم مباشرة في تعبير المرشح، يمكنك استخدام قالب.

    +
    filter = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    هنا، {age} و {city} هي عناصر نائبة سيتم استبدالها بالقيم الفعلية في filter_params عند تنفيذ الاستعلام.

    +

    يتميز استخدام قالب تعبير المرشح في ميلفوس بالعديد من المزايا الرئيسية.

    +
      +
    • تقليل وقت التحليل: من خلال استبدال تعبيرات التصفية الكبيرة أو المعقدة بالعناصر النائبة، يقضي النظام وقتًا أقل في تحليل المرشح ومعالجته.

    • +
    • تحسين أداء الاستعلام: مع انخفاض تكاليف التحليل الزائدة، يتحسن أداء الاستعلام، مما يؤدي إلى زيادة معدل الاستجابة السريعة وأوقات استجابة أسرع.

    • +
    • قابلية التوسع: مع نمو مجموعات البيانات الخاصة بك وزيادة تعقيد تعبيرات التصفية، يضمن النمذجة أن يظل الأداء فعالاً وقابلاً للتطوير.

    • +
    +

    عمليات البحث

    بالنسبة لعمليات البحث في Milvus، يُستخدم التعبير filter لتحديد شرط التصفية، وتُستخدم المعلمة filter_params لتحديد قيم العناصر النائبة. يحتوي القاموس filter_params على القيم الديناميكية التي سيستخدمها ميلفوس للاستعاضة عنها في تعبير التصفية.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.search(​
    +    "hello_milvus",​
    +    vectors[:nq],​
    +    filter=expr,​
    +    limit=10,​
    +    output_fields=["age", "city"],​
    +    search_params={"metric_type": "COSINE", "params": {"search_list": 100}},​
    +    filter_params=filter_params,​
    +)​
    +
    +
    +

    في هذا المثال، سيستبدل ميلفوس ديناميكيًا {age} ب 25 و {city} ب ["北京", "上海"] عند تنفيذ البحث.

    +

    عمليات الاستعلام

    يمكن تطبيق آلية النمذجة نفسها على عمليات الاستعلام في ميلفوس. في الدالة query ، يمكنك تحديد تعبير المرشح واستخدام filter_params لتحديد القيم المراد استبدالها.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.query(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    output_fields=["age", "city"],​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    باستخدام filter_params ، يتعامل ميلفوس بكفاءة مع الإدراج الديناميكي للقيم، مما يحسن من سرعة تنفيذ الاستعلام.

    +

    عمليات الحذف

    يمكنك أيضًا استخدام قالب تعبير المرشح في عمليات الحذف. على غرار البحث والاستعلام، يحدد تعبير filter الشروط، ويوفر filter_params القيم الديناميكية للعناصر النائبة.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.delete(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    يعمل هذا الأسلوب على تحسين أداء عمليات الحذف، خاصة عند التعامل مع شروط التصفية المعقدة.

    +

    الخلاصة

    يعد نموذج تعبير المرشح أداة أساسية لتحسين أداء الاستعلام في ميلفوس. باستخدام العناصر النائبة والقاموس filter_params ، يمكنك تقليل الوقت المستغرق في تحليل تعبيرات التصفية المعقدة بشكل كبير. وهذا يؤدي إلى تنفيذ الاستعلام بشكل أسرع وأداء أفضل بشكل عام.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.json new file mode 100644 index 000000000..3dc47c492 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.json @@ -0,0 +1 @@ +{"codeList":["# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter = 'json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n"],"headingContent":"JSON Operators​","anchorList":[{"label":"مشغلات JSON","href":"JSON-Operators​","type":1,"isActive":false},{"label":"معاملات JSON المتاحة","href":"Available-JSON-Operators​","type":2,"isActive":false},{"label":"JSON_CONTAINS","href":"JSONCONTAINS​","type":2,"isActive":false},{"label":"json_contains_all","href":"JSONCONTAINSALL​","type":2,"isActive":false},{"label":"json_cotains_any","href":"JSONCOTAINSANY​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.md new file mode 100644 index 000000000..ce89b0519 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/boolean/json-operators.md @@ -0,0 +1,120 @@ +--- +id: json-operators.md +summary: >- + تدعم Milvus عوامل تشغيل متقدمة للاستعلام عن حقول JSON وتصفيتها، مما يجعلها + مثالية لإدارة البيانات المعقدة والمنظمة. تتيح هذه العوامل الاستعلام الفعال + للغاية عن مستندات JSON، مما يسمح لك باسترداد الكيانات بناءً على عناصر أو قيم + أو شروط محددة داخل حقول JSON. سيرشدك هذا القسم إلى كيفية استخدام مشغلات JSON + الخاصة ب JSON في Milvus، مع تقديم أمثلة عملية لتوضيح وظائفها. +title: مشغلات JSON +--- +

    مشغلات JSON

    تدعم Milvus مشغلات متقدمة للاستعلام عن حقول JSON وتصفيتها، مما يجعلها مثالية لإدارة البيانات المعقدة والمنظمة. تتيح هذه المشغلات الاستعلام الفعال للغاية عن مستندات JSON، مما يسمح لك باسترداد الكيانات بناءً على عناصر أو قيم أو شروط محددة داخل حقول JSON. سيرشدك هذا القسم إلى كيفية استخدام مشغلي JSON في Milvus، مع تقديم أمثلة عملية لتوضيح وظائفهم.

    +
    +

    لا يمكن لحقول JSON التعامل مع البنى المعقدة والمتداخلة وتتعامل مع جميع البنى المتداخلة كسلاسل عادية. ولذلك، عند العمل مع حقول JSON، يُنصح بتجنب التداخل العميق بشكل مفرط والتأكد من أن هياكل البيانات الخاصة بك مسطحة قدر الإمكان لتحقيق الأداء الأمثل.

    +
    +

    معاملات JSON المتاحة

    يوفر ميلفوس العديد من عوامل تشغيل JSON القوية التي تساعد في تصفية بيانات JSON والاستعلام عنها، وهذه العوامل هي

    + +

    دعونا نستكشف هذه العوامل مع أمثلة لنرى كيف يمكن تطبيقها في سيناريوهات العالم الحقيقي.

    +

    JSON_CONTAINS

    يتحقق المشغل json_contains مما إذا كان هناك عنصر معين أو مصفوفة فرعية موجودة داخل حقل JSON. يكون مفيدًا عندما تريد التأكد من احتواء مصفوفة أو كائن JSON على قيمة معينة.

    +

    مثال

    +

    تخيل أن لديك مجموعة من المنتجات، كل منها يحتوي على حقل tags يحتوي على مصفوفة JSON من السلاسل، مثل ["electronics", "sale", "new"]. تريد تصفية المنتجات التي تحتوي على العلامة "sale".

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains(tags, "sale")'​
    +
    +
    +

    في هذا المثال، سيعيد Milvus جميع المنتجات التي يحتوي فيها الحقل tags على العنصر "sale".

    +

    json_contains_all

    يضمن المشغل json_contains_all وجود جميع عناصر تعبير JSON المحدد في الحقل الهدف. وهو مفيد بشكل خاص عندما تحتاج إلى مطابقة قيم متعددة داخل مصفوفة JSON.

    +

    مثال

    +

    استمرارًا لسيناريو علامات المنتج، إذا كنت تريد العثور على جميع المنتجات التي تحتوي على العلامات "electronics" و "sale" و "new" ، يمكنك استخدام المشغل json_contains_all.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter = 'json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    سيعيد هذا الاستعلام جميع المنتجات حيث تحتوي المصفوفة tags على العناصر الثلاثة المحددة: "electronics" و "sale" و "new".

    +

    json_cotains_any

    يقوم المشغل json_contains_any بتصفية الكيانات التي يوجد فيها عضو واحد على الأقل من تعبير JSON داخل الحقل. يكون هذا مفيدًا عندما تريد مطابقة الكيانات استنادًا إلى أي قيمة من عدة قيم ممكنة.

    +

    مثال

    +

    لنفترض أنك تريد تصفية المنتجات التي تحتوي على واحدة على الأقل من العلامات "electronics" أو "sale" أو "new". يمكنك استخدام المشغل json_contains_any لتحقيق ذلك.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    في هذه الحالة، سيعيد Milvus جميع المنتجات التي تحتوي على واحدة على الأقل من العلامات في القائمة ["electronics", "new", "clearance"]. حتى إذا كان المنتج يحتوي على إحدى هذه العلامات فقط، فسيتم تضمينه في النتيجة.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.json new file mode 100644 index 000000000..12637a715 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.json @@ -0,0 +1 @@ +{"codeList":["dataCoord:\n compaction:\n clustering:\n enable: true \n autoEnable: false \n triggerInterval: 600 \n minInterval: 3600 \n maxInterval: 259200 \n newDataSizeThreshold: 512m \n timeout: 7200\n \nqueryNode:\n enableSegmentPrune: true \n\ndatanode:\n clusteringCompaction:\n memoryBufferRatio: 0.1 \n workPoolSize: 8 \ncommon:\n usePartitionKeyAsClusteringKey: true \n","default_fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n FieldSchema(name=\"key\", dtype=DataType.INT64, is_clustering_key=True),\n FieldSchema(name=\"var\", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),\n FieldSchema(name=\"embeddings\", dtype=DataType.FLOAT_VECTOR, dim=dim)\n]\n\ndefault_schema = CollectionSchema(\n fields=default_fields, \n description=\"test clustering-key collection\"\n)\n\ncoll1 = Collection(name=\"clustering_test\", schema=default_schema)\n","coll1.compact(is_clustering=True)\ncoll1.get_compaction_state(is_clustering=True)\ncoll1.wait_for_compaction_completed(is_clustering=True)\n"],"headingContent":"Clustering Compaction","anchorList":[{"label":"ضغط التجميع","href":"Clustering-Compaction","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"استخدام ضغط التجميع","href":"Use-Clustering-Compaction","type":2,"isActive":false},{"label":"تشغيل ضغط التجميع التجميعي","href":"Trigger-Clustering-Compaction","type":2,"isActive":false},{"label":"أفضل الممارسات","href":"Best-practices","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.md new file mode 100644 index 000000000..31a28c24d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/clustering-compaction.md @@ -0,0 +1,272 @@ +--- +id: clustering-compaction.md +title: ضغط التجميع +related_key: 'clustering, compaction' +summary: >- + تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. + سيساعدك هذا الدليل على فهم ضغط المجموعات وكيف يمكن لهذه الميزة تحسين أداء + البحث. +--- +

    ضغط التجميع

    تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. سيساعدك هذا الدليل على فهم ضغط التجميع وكيف يمكن لهذه الميزة تحسين أداء البحث.

    +

    نظرة عامة

    يقوم Milvus بتخزين الكيانات الواردة في مقاطع داخل مجموعة ويغلق المقطع عندما يمتلئ. إذا حدث ذلك، يتم إنشاء مقطع جديد لاستيعاب كيانات إضافية. ونتيجة لذلك، يتم توزيع الكيانات بشكل اعتباطي عبر المقاطع. يتطلب هذا التوزيع من Milvus البحث في مقاطع متعددة للعثور على أقرب الجيران إلى متجه استعلام معين.

    +

    + + Without clustering Compaction + بدون ضغط التجميع

    +

    إذا كان بإمكان Milvus توزيع الكيانات بين المقاطع بناءً على القيم الموجودة في حقل معين، يمكن تقييد نطاق البحث داخل مقطع واحد، وبالتالي تحسين أداء البحث.

    +

    إنضغط التجميع هو ميزة في Milvus تقوم بإعادة توزيع الكيانات بين المقاطع في مجموعة استنادًا إلى القيم الموجودة في حقل قياسي. لتمكين هذه الميزة، تحتاج أولاً إلى تحديد حقل قياسي كمفتاح تجميع. يسمح ذلك ل Milvus بإعادة توزيع الكيانات في مقطع عندما تقع قيم مفتاح التجميع الخاصة بها ضمن نطاق محدد. عندما تقوم بتشغيل ضغط التجميع، يقوم Milvus بإنشاء/تحديث فهرس عام يسمى PartitionStats، والذي يسجل علاقة التعيين بين المقاطع وقيم مفاتيح التجميع.

    +

    + + With Clustering Compaction + مع ضغط التجميع

    +

    باستخدام PartitionStats كمرجع، يمكن لـ Milvus تشذيب البيانات غير ذات الصلة عند تلقي طلب بحث/استعلام يحمل قيمة مفتاح تجميع وتقييد نطاق البحث داخل المقاطع التي تم تعيينها إلى القيمة، وبالتالي تحسين أداء البحث. للحصول على تفاصيل حول تحسين الأداء، راجع الاختبارات المعيارية.

    +

    استخدام ضغط التجميع

    ميزة ضغط التجميع في Milvus قابلة للتكوين بدرجة كبيرة. يمكنك اختيار تشغيله يدويًا أو تعيينه ليتم تشغيله تلقائيًا على فترات بواسطة Milvus. لتمكين ضغط التجميع، قم بما يلي:

    +

    التكوين العام

    تحتاج إلى تعديل ملف تكوين Milvus كما هو موضح أدناه.

    +
    dataCoord:
    +  compaction:
    +    clustering:
    +      enable: true 
    +      autoEnable: false 
    +      triggerInterval: 600 
    +      minInterval: 3600 
    +      maxInterval: 259200 
    +      newDataSizeThreshold: 512m 
    +      timeout: 7200
    +     
    +queryNode:
    +  enableSegmentPrune: true 
    +
    +datanode:
    +  clusteringCompaction:
    +    memoryBufferRatio: 0.1 
    +    workPoolSize: 8  
    +common:
    +  usePartitionKeyAsClusteringKey: true 
    +
    +
      +
    • dataCoord.compaction.clustering

      + + + + + + + + + + + + + +
      عنصر التكوينالوصفالقيمة الافتراضية
      enableتحديد ما إذا كان سيتم تمكين ضغط التجميع أم لا.
      تعيين هذا إلى true إذا كنت بحاجة إلى تمكين هذه الميزة لكل مجموعة لها مفتاح تجميع.
      false
      autoEnableتحديد ما إذا كنت تريد تمكين الضغط الذي يتم تشغيله تلقائياً.
      يشير تعيين هذا إلى true إلى أن Milvus يقوم بضغط المجموعات التي تحتوي على مفتاح تجميع في الفواصل الزمنية المحددة.
      false
      triggerIntervalيحدد الفاصل الزمني بالمللي ثانية الذي يبدأ عنده Milvus ضغط التجميع.
      هذه المعلمة صالحة فقط عندما يتم تعيين autoEnable إلى true.
      -
      minIntervalيحدد الحد الأدنى للفاصل الزمني بالثواني.
      هذه المعلمة صالحة فقط عندما يتم تعيين autoEnable إلى true.
      يساعد تعيين هذه المعلمة على عدد صحيح أكبر من المشغّلInterval على تجنب عمليات التجميع المتكررة خلال فترة قصيرة.
      -
      maxIntervalيحدد الحد الأقصى للفاصل الزمني بالثواني.
      هذه المعلمة صالحة فقط عندما يتم تعيين autoEnable إلى true.
      بمجرد أن يكتشف Milvus أن المجموعة لم يتم تجميعها لمدة أطول من هذه القيمة، فإنه يفرض تجميعًا مضغوطًا.
      -
      newDataSizeThresholdيحدد العتبة العليا لتشغيل ضغط التجميع.
      هذه المعلمة صالحة فقط عندما يتم تعيين autoEnable على true.
      بمجرد أن يكتشف Milvus أن حجم البيانات في مجموعة ما يتجاوز هذه القيمة، فإنه يبدأ عملية ضغط التجميع.
      -
      timeoutيحدد مدة المهلة لضغط التجميع.
      تفشل عملية ضغط التجميع إذا تجاوز وقت تنفيذها هذه القيمة.
      -
      +
    • +
    • queryNode

      + + + + + + + +
      عنصر التكوينالوصفالقيمة الافتراضية
      enableSegmentPruneتحديد ما إذا كان Milvus يقوم بتشذيب البيانات بالرجوع إلى PartitionStats عند تلقي طلبات البحث/الاستعلام.
      تعيين هذا إلى true يُمكّن Milvus من تشذيب البيانات غير ذات الصلة من المقاطع أثناء طلب البحث/الاستعلام.
      false
      +
    • +
    • dataNode.clusteringCompaction

      + + + + + + + + +
      عنصر التكوينالوصفالقيمة الافتراضية
      memoryBufferRatioتحديد نسبة المخزن المؤقت للذاكرة لمهام ضغط المجموعات.
      يقوم Milvus بمسح البيانات عندما يتجاوز حجم البيانات حجم المخزن المؤقت المخصص المحسوب باستخدام هذه النسبة.
      -
      workPoolSizeتحديد حجم تجمع العاملين لمهمة ضغط التجميع.-
      +
    • +
    • common

      + + + + + + + +
      عنصر التكوينالوصفالقيمة الافتراضية
      usePartitionKeyAsClusteringKeyتحديد ما إذا كان سيتم استخدام مفتاح القسم في المجموعات كمفتاح تجميع.
      يشير تعيين هذا إلى true إلى استخدام مفتاح التقسيم كمفتاح تجميع.
      يمكنك دائماً تجاوز هذا الإعداد في مجموعة من خلال تعيين مفتاح التجميع بشكل صريح.
      false
      +
    • +
    +

    لتطبيق التغييرات المذكورة أعلاه على مجموعة Milvus الخاصة بك، يُرجى اتباع الخطوات الواردة في تكوين Milvus مع Helm وتكوين Milvus مع مشغلي Milvus.

    +

    تكوين التجميع

    لضغط التجميع في مجموعة معينة، يجب عليك تحديد حقل قياسي من المجموعة كمفتاح التجميع.

    +
    default_fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +    FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
    +    FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
    +    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
    +]
    +
    +default_schema = CollectionSchema(
    +    fields=default_fields, 
    +    description="test clustering-key collection"
    +)
    +
    +coll1 = Collection(name="clustering_test", schema=default_schema)
    +
    +
    +

    يمكنك استخدام الحقول القياسية لأنواع البيانات التالية كمفتاح التجميع: Int8 و Int16 و و Int32 و Int64 و Float و Double و VarChar.

    +
    +

    تشغيل ضغط التجميع التجميعي

    إذا قمت بتمكين الضغط التجميعي التلقائي للتجميع، يقوم برنامج Milvus تلقائيًا بتشغيل الضغط في الفاصل الزمني المحدد. بدلاً من ذلك، يمكنك تشغيل الضغط يدويًا على النحو التالي:

    +
    coll1.compact(is_clustering=True)
    +coll1.get_compaction_state(is_clustering=True)
    +coll1.wait_for_compaction_completed(is_clustering=True)
    +
    +

    اختبار معياري

    يحدد حجم البيانات وأنماط الاستعلام مجتمعةً تحسين الأداء الذي يمكن أن يحققه ضغط التجميع. يُظهر اختبار معياري داخلي أن ضغط التجميع يؤدي إلى تحسين يصل إلى 25 ضعفًا في الاستعلامات في الثانية (QPS).

    +

    يتم إجراء الاختبار المعياري على مجموعة تحتوي على كيانات من مجموعة بيانات LAION ذات 20 مليونًا و768 بُعدًا مع تعيين الحقل الرئيسي كمفتاح تجميع. بعد تشغيل ضغط التجميع في المجموعة، يتم إرسال عمليات البحث المتزامنة حتى يصل استخدام وحدة المعالجة المركزية إلى مستوى عالٍ من وحدة المعالجة المركزية.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    مرشح البحثنسبة التقليمالكمون (مللي ثانية)QPS (طلبات/ثانية)
    متوسطالحد الأدنىالحد الأقصىالمتوسطTP99
    لا يوجد0%168567222941710229117.75
    مفتاح > 200 ومفتاح < 80040.2%10454718281085161728.38
    مفتاح > 200 ومفتاح < 60059.8%829451483882130335.78
    مفتاح > 200 ومفتاح < 40079.5%55010098558489854.00
    المفتاح = = 100099%6824127370246431.41
    +

    كلما ضاق نطاق البحث في مرشحات البحث، تزداد نسبة التقليم. هذا يعني أنه يتم تخطي المزيد من الكيانات أثناء عملية البحث. عند مقارنة الإحصائيات في الصفين الأول والأخير، يمكنك أن ترى أن عمليات البحث بدون ضغط التجميع تتطلب مسح المجموعة بأكملها. من ناحية أخرى، يمكن أن تحقق عمليات البحث باستخدام ضغط التجميع باستخدام مفتاح معين تحسينًا يصل إلى 25 ضعفًا.

    +

    أفضل الممارسات

    إليك بعض النصائح لاستخدام ضغط التجميع بكفاءة:

    +
      +
    • قم بتمكين ذلك للمجموعات ذات أحجام البيانات الكبيرة. يتحسن أداء البحث مع وجود أحجام بيانات أكبر في المجموعة. من الجيد تمكين هذه الميزة للمجموعات التي تحتوي على أكثر من مليون كيان.

    • +
    • اختيار مفتاح تجميع مناسب. يمكنك استخدام الحقول القياسية المستخدمة عادةً كشروط تصفية كمفتاح تجميع. بالنسبة للمجموعات التي تحتوي على بيانات من مستأجرين متعددين، يمكنك استخدام الحقل الذي يميز مستأجر عن آخر كمفتاح تجميع.

    • +
    • استخدم مفتاح التقسيم كمفتاح التجميع. يمكنك تعيين common.usePartitionKeyAsClusteringKey إلى صواب إذا كنت تريد تمكين هذه الميزة لجميع المجموعات في مثيل Milvus الخاص بك أو إذا كنت لا تزال تواجه مشكلات في الأداء في مجموعة كبيرة بمفتاح التقسيم. من خلال القيام بذلك، سيكون لديك مفتاح تجميع ومفتاح تقسيم عندما تختار حقلاً قياسيًا في مجموعة كمفتاح تقسيم.

      +

      لاحظ أن هذا الإعداد لا يمنعك من اختيار حقل قياسي آخر كمفتاح تجميع. تكون الأولوية دائمًا لمفتاح التجميع المعين صراحةً.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.json new file mode 100644 index 000000000..417b758d1 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.json @@ -0,0 +1 @@ +{"codeList":["client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Strong\",​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n // highlight-next​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isClusteringKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n​\nexport params='{​\n \"consistencyLevel\": \"Strong\"​\n}'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","res = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-start​\n consistency_level=\"Bounded\",​\n # highlight-next​\n)​\n\n","SearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .searchParams(params)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"limit\": 3,​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n\n","res = client.query(​\n collection_name=\"my_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3,​\n # highlight-start​\n consistency_level=\"Eventually\",​\n # highlight-next​\n)​\n\n","QueryReq queryReq = QueryReq.builder()​\n .collectionName(\"my_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .consistencyLevel(ConsistencyLevel.EVENTUALLY)​\n .build();​\n ​\n QueryResp getResp = client.query(queryReq);​\n\n"],"headingContent":"Consistency Level​","anchorList":[{"label":"مستوى الاتساق","href":"Consistency-Level​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"تعيين مستوى الاتساق","href":"Set-Consistency-Level​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.md new file mode 100644 index 000000000..23f93b40f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/consistency.md @@ -0,0 +1,211 @@ +--- +id: consistency.md +summary: تعرف على مستويات الاتساق الأربعة في ميلفوس. +title: الاتساق +--- +

    مستوى الاتساق

    كقاعدة بيانات متجهة موزعة، تقدم Milvus مستويات متعددة من الاتساق لضمان أن كل عقدة أو نسخة متماثلة يمكنها الوصول إلى نفس البيانات أثناء عمليات القراءة والكتابة. وتتضمن مستويات الاتساق المدعومة حاليًا مستويات الاتساق القوية والمحدودة والنهائية والجلسة، مع كون المستوى المحدود هو المستوى الافتراضي للاتساق المستخدم.

    +

    نظرة عامة

    ميلفوس هو نظام يفصل بين التخزين والحوسبة. في هذا النظام، تكون DataNodes مسؤولة عن ثبات البيانات وتخزينها في نهاية المطاف في تخزين الكائنات الموزعة مثل MinIO/S3. تتعامل QueryNodes مع المهام الحسابية مثل البحث. تتضمن هذه المهام معالجة كل من البيانات الدفعية والبيانات المتدفقة. ببساطة، يمكن فهم البيانات الدفعية على أنها البيانات التي تم تخزينها بالفعل في وحدة تخزين الكائنات بينما تشير البيانات المتدفقة إلى البيانات التي لم يتم تخزينها بعد في وحدة تخزين الكائنات. نظرًا لوقت استجابة الشبكة، غالبًا ما لا تحتفظ QueryNodes بأحدث بيانات التدفق. وبدون ضمانات إضافية، قد يؤدي إجراء البحث مباشرةً على بيانات التدفق إلى فقدان العديد من نقاط البيانات غير الملتزم بها، مما يؤثر على دقة نتائج البحث.

    +

    ميلفوس هو نظام يفصل بين التخزين والحوسبة. في هذا النظام، تكون عقد البيانات DataNodes مسؤولة عن ثبات البيانات وتخزينها في نهاية المطاف في تخزين كائنات موزعة مثل MinIO/S3. تتعامل QueryNodes مع المهام الحسابية مثل البحث. تتضمن هذه المهام معالجة كل من البيانات الدفعية والبيانات المتدفقة. ببساطة، يمكن فهم البيانات الدفعية على أنها البيانات التي تم تخزينها بالفعل في وحدة تخزين الكائنات، بينما تشير البيانات المتدفقة إلى البيانات التي لم يتم تخزينها بعد في وحدة تخزين الكائنات. نظرًا لوقت استجابة الشبكة، غالبًا ما لا تحتفظ QueryNodes بأحدث بيانات التدفق. من دون ضمانات إضافية، قد يؤدي إجراء البحث مباشرةً على بيانات التدفق إلى فقدان العديد من نقاط البيانات غير الملتزم بها، مما يؤثر على دقة نتائج البحث.

    +

    + + Batch data and streaming data + البيانات المجمّعة وبيانات التدفق

    +

    كما هو موضح في الشكل أعلاه، يمكن أن تتلقى عقد الاستعلامات كلاً من بيانات الدفق والبيانات الدفعية في وقت واحد بعد تلقي طلب بحث. ومع ذلك، وبسبب زمن انتقال الشبكة، قد تكون بيانات التدفق التي تحصل عليها عقد الاستعلام غير مكتملة.

    +

    ولمعالجة هذه المشكلة، تقوم Milvus بوضع طوابع زمنية لكل سجل في قائمة انتظار البيانات وإدراج طوابع زمنية للمزامنة باستمرار في قائمة انتظار البيانات. كلما تم استلام طابع زمني للمزامنة (syncTs)، تقوم QueryNodes بتعيينه كوقت الخدمة، مما يعني أن QueryNodes يمكنها رؤية جميع البيانات قبل وقت الخدمة هذا. استنادًا إلى ServiceTime، يمكن لـ Milvus توفير طوابع زمنية مضمونة (GuaranteeTs) لتلبية متطلبات المستخدم المختلفة من حيث الاتساق والتوافر. يمكن للمستخدمين إبلاغ QueryNodes بالحاجة إلى تضمين البيانات قبل نقطة زمنية محددة في نطاق البحث من خلال تحديد GuaranteeTs في طلبات البحث الخاصة بهم.

    +

    + + ServiceTime and GuaranteeTs + وقت الخدمة و GuaranteeTs

    +

    كما هو موضح في الشكل أعلاه، إذا كان GuaranteeTs أقل من ServiceTime، فهذا يعني أن جميع البيانات قبل النقطة الزمنية المحددة قد تمت كتابتها بالكامل على القرص، مما يسمح ل QueryNodes بتنفيذ عملية البحث على الفور. عندما يكون GuaranteeTs أكبر من ServiceTime، يجب أن تنتظر عقد الاستعلام حتى يتجاوز وقت الخدمة GuaranteeTs قبل أن تتمكن من تنفيذ عملية البحث.

    +

    يحتاج المستخدمون إلى إجراء مفاضلة بين دقة الاستعلام وزمن الاستعلام. إذا كان المستخدمون لديهم متطلبات اتساق عالية وليس لديهم حساسية تجاه زمن انتقال الاستعلام، فيمكنهم تعيين GuaranteeTs إلى قيمة كبيرة قدر الإمكان؛ إذا كان المستخدمون يرغبون في تلقي نتائج البحث بسرعة ويتحملون دقة الاستعلام، فيمكن تعيين GuaranteeTs إلى قيمة أصغر.

    +

    + + Consistency Levels Illustrated + توضيح مستويات الاتساق

    +

    يوفّر ميلفوس أربعة أنواع من مستويات الاتساق مع مستويات ضمانات مختلفة.

    +
      +
    • قوي

      +

      يتم استخدام أحدث طابع زمني كـ GuaranteeTs، ويتعين على عقد الاستعلام الانتظار حتى يفي وقت الخدمة بـ GuaranteeTs قبل تنفيذ طلبات البحث.

    • +
    • نهائي

      +

      يتم تعيين GuaranteeTs على قيمة صغيرة للغاية، مثل 1، لتجنب عمليات التحقق من الاتساق بحيث يمكن لعُقد الاستعلام تنفيذ طلبات البحث على الفور على جميع البيانات الدفعية.

    • +
    • الثبات المحدود

      +

      يتم تعيين GuranteeTs إلى نقطة زمنية أقدم من الطابع الزمني الأخير لجعل QueryNodes تنفذ عمليات البحث مع تحمل فقدان بيانات معينة.

    • +
    • الجلسة

      +

      يتم استخدام آخر نقطة زمنية يقوم فيها العميل بإدراج البيانات كـ GuaranteeTs بحيث يمكن لـ QueryNodes إجراء عمليات بحث على جميع البيانات التي أدخلها العميل.

    • +
    +

    يستخدم ميلفوس مستوى الثبات المحدود كمستوى الاتساق الافتراضي. إذا تُرك مستوى الضمانة غير محدد، يتم استخدام أحدث وقت خدمة كمستوى ضمانة.

    +

    تعيين مستوى الاتساق

    يمكنك تعيين مستويات اتساق مختلفة عند إنشاء مجموعة وكذلك إجراء عمليات بحث واستعلامات.

    +

    تعيين مستوى الاتساق عند إنشاء مجموعة

    عند إنشاء مجموعة، يمكنك تعيين مستوى الاتساق لعمليات البحث والاستعلامات داخل المجموعة. يقوم المثال البرمجي التالي بتعيين مستوى الاتساق إلى قوي.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Strong",​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .collectionSchema(schema)​
    +        // highlight-next​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isClusteringKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +​
    +export params='{​
    +    "consistencyLevel": "Strong"​
    +}'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_collection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    القيم الممكنة للمعلمة consistency_level هي Strong و Bounded و Eventually و Session.

    +

    تعيين مستوى الاتساق في البحث

    يمكنك دائمًا تغيير مستوى الاتساق لبحث معين. يقوم مثال التعليمات البرمجية التالي بتعيين مستوى الاتساق إلى المستوى المحدود. ينطبق التغيير فقط على طلب البحث الحالي.

    + +
    res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-start​
    +    consistency_level="Bounded",​
    +    # highlight-next​
    +)​
    +
    +
    +
    SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .searchParams(params)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "limit": 3,​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +
    +
    +

    هذه المعلمة متاحة أيضًا في عمليات البحث المختلطة ومكرر البحث. القيم الممكنة للمعلمة consistency_level هي Strong و Bounded و Eventually و Session.

    +

    تعيين مستوى الاتساق في الاستعلام

    يمكنك دائمًا تغيير مستوى الاتساق لبحث معين. يقوم مثال التعليمات البرمجية التالي بتعيين مستوى الاتساق إلى النهاية. ينطبق الإعداد فقط على طلب الاستعلام الحالي.

    + +
    res = client.query(​
    +    collection_name="my_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3,​
    +    # highlight-start​
    +    consistency_level="Eventually",​
    +    # highlight-next​
    +)​
    +
    +
    +
    QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("my_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .consistencyLevel(ConsistencyLevel.EVENTUALLY)​
    +        .build();​
    +        ​
    + QueryResp getResp = client.query(queryReq);​
    +
    +
    +

    تتوفر هذه المعلمة أيضًا في مكرر الاستعلام. القيم الممكنة للمعلمة consistency_level هي Strong و Bounded و Eventually و Session.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.json new file mode 100644 index 000000000..2ee31db72 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\", \"likes\": 165},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\", \"likes\": 25},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\", \"likes\": 764},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\", \"likes\": 234},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\", \"likes\": 122},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\", \"likes\": 12},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\", \"likes\": 58},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\", \"likes\": 775},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\", \"likes\": 876},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\", \"likes\": 765}​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\" and likes > 50',​\n output_fields=[\"color\", \"likes\"]​\n # highlight-end​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"filtered_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .filter(\"color like \\\"red%\\\" and likes > 50\")​\n .outputFields(Arrays.asList(\"color\", \"likes\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​\n\n","import (​\n \"context\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_filter() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"filtered_search_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithFilter(`color like \"red%\" and likes > 50`).WithOutputFields(\"color\", \"likes\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nconst res = await client.search({​\n collection_name: \"filtered_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: 'color like \"red%\" and likes > 50',​\n output_fields: [\"color\", \"likes\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\", \"likes\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Filtered Search​","anchorList":[{"label":"البحث المصفى","href":"Filtered-Search​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"أمثلة","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.md new file mode 100644 index 000000000..625dee25a --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/filtered-search.md @@ -0,0 +1,257 @@ +--- +id: filtered-search.md +title: البحث المصفى +related_key: 'ann search, filtered search' +summary: >- + يعثر بحث الشبكة العصبية الاصطناعية على تضمينات المتجهات الأكثر تشابهًا مع + تضمينات المتجهات المحددة. ومع ذلك، قد لا تكون نتائج البحث صحيحة دائماً. يمكنك + تضمين شروط التصفية في طلب البحث بحيث يقوم ميلفوس بإجراء تصفية للبيانات الوصفية + قبل إجراء عمليات بحث الشبكة الوصفية ANN، مما يقلل من نطاق البحث من المجموعة + بأكملها إلى الكيانات المطابقة لشروط التصفية المحددة فقط. +--- +

    البحث المصفى

    يعثر بحث ANN على التضمينات المتجهة الأكثر تشابهًا مع التضمينات المتجهة المحددة. ومع ذلك، قد لا تكون نتائج البحث صحيحة دائماً. يمكنك تضمين شروط التصفية في طلب البحث بحيث يقوم ميلفوس بإجراء تصفية للبيانات الوصفية قبل إجراء عمليات بحث الشبكة النانوية المتجهة، مما يقلل من نطاق البحث من المجموعة بأكملها إلى الكيانات المطابقة لشروط التصفية المحددة فقط.

    +

    نظرة عامة

    إذا كانت المجموعة تحتوي على كل من التضمينات المتجهة والبيانات الوصفية الخاصة بها، يمكنك تصفية البيانات الوصفية قبل البحث في الشبكة النانوية الوصفية لتحسين ملاءمة نتيجة البحث. بمجرد أن يتلقى ميلفوس طلب بحث يحمل شرط تصفية، فإنه يقيد نطاق البحث ضمن الكيانات المطابقة لشرط التصفية المحدد.

    +

    + + Filtered search + البحث المصفى

    +

    كما هو موضح في الرسم البياني أعلاه، يحمل طلب البحث chunk like % red % كشرط تصفية، مما يشير إلى أن ميلفوس يجب أن يجري بحث الشبكة النانوية ضمن جميع الكيانات التي تحتوي على كلمة red في الحقل chunk. على وجه التحديد، يقوم ميلفوس بما يلي.

    +
      +
    • تصفية الكيانات التي تطابق شروط التصفية الواردة في طلب البحث.

    • +
    • إجراء بحث ANN داخل الكيانات التي تمت تصفيتها.

    • +
    • إرجاع الكيانات الأعلى-K.

    • +
    +

    أمثلة

    يوضح هذا القسم كيفية إجراء بحث تمت تصفيته. تفترض مقتطفات التعليمات البرمجية في هذا القسم أن لديك بالفعل الكيانات التالية في مجموعتك. يحتوي كل كيان على أربعة حقول، وهي المعرف والمتجه واللون والإعجابات.

    +
    [​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025", "likes": 25},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781", "likes": 764},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298", "likes": 234},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794", "likes": 122},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222", "likes": 12},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392", "likes": 58},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510", "likes": 775},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381", "likes": 876},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976", "likes": 765}​
    +]​
    +
    +
    +

    طلب البحث في مقتطف الشيفرة التالي يحمل شرط تصفية والعديد من حقول الإخراج.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%" and likes > 50',​
    +    output_fields=["color", "likes"]​
    +    # highlight-end​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("filtered_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .filter("color like \"red%\" and likes > 50")​
    +        .outputFields(Arrays.asList("color", "likes"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​
    +
    +
    +
    import (​
    +    "context"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_filter() {​
    +        ctx, cancel := context.WithCancel(context.Background())​
    +        defer cancel()​
    +​
    +        milvusAddr := "127.0.0.1:19530"​
    +        token := "root:Milvus"​
    +​
    +        cli, err := client.New(ctx, &client.ClientConfig{​
    +                Address: milvusAddr,​
    +                APIKey:  token,​
    +        })​
    +        if err != nil {​
    +                log.Fatal("failed to connect to milvus server: ", err.Error())​
    +        }​
    +​
    +        defer cli.Close(ctx)​
    +​
    +        queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +        resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +                "filtered_search_collection", // collectionName​
    +                3,             // limit​
    +                []entity.Vector{entity.FloatVector(queryVector)},​
    +        ).WithFilter(`color like "red%" and likes > 50`).WithOutputFields("color", "likes"))​
    +        if err != nil {​
    +                log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +        }​
    +​
    +        for _, resultSet := range resultSets {​
    +                log.Println("IDs: ", resultSet.IDs)​
    +                log.Println("Scores: ", resultSet.Scores)​
    +        }​
    +        // Output:​
    +        // IDs:​
    +        // Scores:​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +const res = await client.search({​
    +    collection_name: "filtered_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: 'color like "red%" and likes > 50',​
    +    output_fields: ["color", "likes"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "outputFields": ["color", "likes"]​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    يقرأ شرط التصفية المحمول في طلب البحث color like "red%" and likes > 50. ويستخدم العامل "و" لتضمين شرطين: الأول يطلب الكيانات التي لها قيمة تبدأ بـ red في الحقل color ، والآخر يطلب الكيانات التي لها قيمة أكبر من 50 في الحقل likes. هناك كيانان فقط يستوفيان هذين الشرطين. مع تعيين أعلى K على 3 ، سيقوم ميلفوس بحساب المسافة بين هذين الكيانين إلى متجه الاستعلام وإعادتهما كنتيجة للبحث.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    لمزيد من المعلومات حول العوامل التي يمكنك استخدامها في تصفية البيانات الوصفية، راجع تصفية البيانات الوصفية.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.json new file mode 100644 index 000000000..fd48440d5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType, Function, FunctionType​\n\nclient = MilvusClient(uri=\"http://localhost:19530\")\n​\nschema = client.create_schema()​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True, auto_id=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .build();\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"sparse\")\n .dataType(DataType.SparseFloatVector)\n .build());\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\nconst schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n\nconsole.log(res.results)\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n","bm25_function = Function(​\n name=\"text_bm25_emb\", # Function name​\n input_field_names=[\"text\"], # Name of the VARCHAR field containing raw text data​\n output_field_names=[\"sparse\"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​\n function_type=FunctionType.BM25,​\n)​\n​\nschema.add_function(bm25_function)​\n\n","import io.milvus.common.clientenum.FunctionType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq.Function;\n\nimport java.util.*;\n\nschema.addFunction(Function.builder()\n .functionType(FunctionType.BM25)\n .name(\"text_bm25_emb\")\n .inputFieldNames(Collections.singletonList(\"text\"))\n .outputFieldNames(Collections.singletonList(\"vector\"))\n .build());\n","const functions = [\n {\n name: 'text_bm25_emb',\n description: 'bm25 function',\n type: FunctionType.BM25,\n input_field_names: ['text'],\n output_field_names: ['vector'],\n params: {},\n },\n];\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ],\n \"functions\": [\n {\n \"name\": \"text_bm25_emb\",\n \"type\": \"BM25\",\n \"inputFieldNames\": [\"text\"],\n \"outputFieldNames\": [\"sparse\"],\n \"params\": {}\n }\n ]\n }'\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_type=\"AUTOINDEX\", ​\n metric_type=\"BM25\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;\n\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"sparse\")\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)\n .metricType(IndexParam.MetricType.BM25)\n .build());\n","const index_params = [\n {\n field_name: \"sparse\",\n metric_type: \"BM25\",\n index_type: \"AUTOINDEX\",\n },\n];\n","export indexParams='[\n {\n \"fieldName\": \"sparse\",\n \"metricType\": \"BM25\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n","client.create_collection(​\n collection_name='demo', ​\n schema=schema, ​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"demo\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","await client.create_collection(\n collection_name: 'demo', \n schema: schema, \n index_params: index_params,\n functions: functions\n);\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"demo\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n","client.insert('demo', [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n])\n\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\n\nimport io.milvus.v2.service.vector.request.InsertReq;\n\nGson gson = new Gson();\nList rows = Arrays.asList(\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval is a field of study.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval focuses on finding relevant information in large datasets.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"data mining and information retrieval overlap in research.\\\"}\", JsonObject.class)\n);\n\nclient.insert(InsertReq.builder()\n .collectionName(\"demo\")\n .data(rows)\n .build());\n","await client.insert({\ncollection_name: 'demo', \ndata: [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n]);\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"data\": [\n {\"text\": \"information retrieval is a field of study.\"},\n {\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"},\n {\"text\": \"data mining and information retrieval overlap in research.\"} \n ],\n \"collectionName\": \"demo\"\n}'\n","search_params = {​\n 'params': {'drop_ratio_search': 0.2},​\n}​\n​\nclient.search(​\n collection_name='demo', ​\n data=['whats the focus of information retrieval?'],​\n anns_field='sparse',​\n limit=3,​\n search_params=search_params​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq;\nimport io.milvus.v2.service.vector.request.data.EmbeddedText;\nimport io.milvus.v2.service.vector.response.SearchResp;\n\nMap searchParams = new HashMap<>();\nsearchParams.put(\"drop_ratio_search\", 0.2);\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"demo\")\n .data(Collections.singletonList(new EmbeddedText(\"whats the focus of information retrieval?\")))\n .annsField(\"sparse\")\n .topK(3)\n .searchParams(searchParams)\n .outputFields(Collections.singletonList(\"text\"))\n .build());\n","await client.search(\n collection_name: 'demo', \n data: ['whats the focus of information retrieval?'],\n anns_field: 'sparse',\n limit: 3,\n params: {'drop_ratio_search': 0.2},\n)\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"demo\",\n \"data\": [\n \"whats the focus of information retrieval?\"\n ],\n \"annsField\": \"sparse\",\n \"limit\": 3,\n \"outputFields\": [\n \"text\"\n ],\n \"searchParams\":{\n \"params\":{\n \"drop_ratio_search\":0.2\n }\n }\n}'\n"],"headingContent":"Full Text Search​","anchorList":[{"label":"البحث في النص الكامل","href":"Full-Text-Search​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء مجموعة للبحث في النص الكامل","href":"Create-a-collection-for-full-text-search​","type":2,"isActive":false},{"label":"إدراج البيانات النصية","href":"Insert-text-data","type":2,"isActive":false},{"label":"إجراء بحث نصي كامل","href":"Perform-full-text-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.md new file mode 100644 index 000000000..2020f042f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/full-text-search.md @@ -0,0 +1,501 @@ +--- +id: full-text-search.md +title: البحث في النص الكامل +related_key: 'full, text, search' +summary: >- + البحث عن النص الكامل هي ميزة تسترجع المستندات التي تحتوي على مصطلحات أو عبارات + محددة في مجموعات البيانات النصية، ثم تقوم بترتيب النتائج بناءً على مدى + ملاءمتها. +--- +

    البحث في النص الكامل

    البحث عن النص الكامل هي ميزة تسترجع المستندات التي تحتوي على مصطلحات أو عبارات محددة في مجموعات البيانات النصية، ثم تقوم بترتيب النتائج بناءً على مدى ملاءمتها. تتغلب هذه الميزة على قيود البحث الدلالي، التي قد تتجاهل المصطلحات الدقيقة، مما يضمن حصولك على النتائج الأكثر دقة وذات الصلة بالسياق. بالإضافة إلى ذلك، تعمل هذه الميزة على تبسيط عمليات البحث المتجهية من خلال قبول مدخلات النص الخام، وتحويل بياناتك النصية تلقائيًا إلى تضمينات متفرقة دون الحاجة إلى إنشاء تضمينات متجهة يدويًا.

    +

    وباستخدام خوارزمية BM25 لتسجيل درجة الملاءمة، تُعد هذه الميزة ذات قيمة خاصة في سيناريوهات التوليد المعزز للاسترجاع (RAG)، حيث تعطي الأولوية للمستندات التي تتطابق بشكل وثيق مع مصطلحات بحث محددة.

    +
    +
      +
    • من خلال دمج البحث النصي الكامل مع البحث المتجه الكثيف القائم على الدلالة، يمكنك تحسين دقة نتائج البحث ومدى ملاءمتها. لمزيد من المعلومات، راجع البحث المختلط.
    • +
    • يتوفر البحث عن النص الكامل في Milvus Standalone وMilvus Distributed ولكن ليس في Milvus Lite، على الرغم من أن إضافته إلى Milvus Lite موجودة على خارطة الطريق.
    • +
    +
    +

    نظرة عامة

    يعمل البحث عن النص الكامل على تبسيط عملية البحث المستند إلى النص من خلال إلغاء الحاجة إلى التضمين اليدوي. تعمل هذه الميزة من خلال سير العمل التالي.

    +
      +
    1. إدخال النص: يمكنك إدراج مستندات نصية أولية أو توفير نص استعلام دون الحاجة إلى تضمينها يدويًا.

    2. +
    3. تحليل النص: يستخدم ميلفوس محلل لترميز النص المدخل إلى مصطلحات فردية قابلة للبحث. لمزيد من المعلومات حول المحللين، راجع نظرة عامة على المحلل.

    4. +
    5. معالجة الدالة: تستقبل الدالة المدمجة المصطلحات المرمزة وتحولها إلى تمثيلات متجهة متفرقة.

    6. +
    7. مخزن المجموعة: يخزن ميلفوس هذه التضمينات المتفرقة في مجموعة لاسترجاعها بكفاءة.

    8. +
    9. تسجيل BM25: أثناء البحث، يطبّق ميلفوس خوارزمية BM25 لحساب درجات المستندات المخزنة وترتيب النتائج المتطابقة بناءً على مدى صلتها بنص الاستعلام.

    10. +
    +

    + + Full text search + البحث بالنص الكامل

    +

    لاستخدام البحث بالنص الكامل، اتبع الخطوات الرئيسية التالية.

    +
      +
    1. إنشاء مجموعة: إعداد مجموعة مع الحقول اللازمة وتحديد دالة لتحويل النص الخام إلى تضمينات متفرقة.

    2. +
    3. إدراج البيانات: أدخل مستنداتك النصية الأولية في المجموعة.

    4. +
    5. إجراء عمليات البحث: استخدم نصوص الاستعلام للبحث في مجموعتك واسترداد النتائج ذات الصلة.

    6. +
    +

    إنشاء مجموعة للبحث في النص الكامل

    لتمكين البحث عن النص الكامل، قم بإنشاء مجموعة بمخطط محدد. يجب أن يتضمن هذا المخطط ثلاثة حقول ضرورية.

    +
      +
    • الحقل الأساسي الذي يحدد بشكل فريد كل كيان في المجموعة.

    • +
    • حقل VARCHAR يقوم بتخزين المستندات النصية الخام، مع تعيين السمة enable_analyzer على True. وهذا يسمح لـ Milvus بترميز النص إلى مصطلحات محددة لمعالجة الدالة.

    • +
    • حقل SPARSE_FLOAT_VECTOR محجوز لتخزين التضمينات المتفرقة التي سيقوم ميلفوس بإنشائها تلقائيًا للحقل VARCHAR.

    • +
    +

    تحديد مخطط المجموعة

    أولاً، قم بإنشاء المخطط وإضافة الحقول اللازمة.

    + +
    from pymilvus import MilvusClient, DataType, Function, FunctionType​
    +
    +client = MilvusClient(uri="http://localhost:19530")
    +​
    +schema = client.create_schema()​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .build();
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("sparse")
    +        .dataType(DataType.SparseFloatVector)
    +        .build());
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +console.log(res.results)
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +

    في هذا التكوين

    +
      +
    • id: يعمل كمفتاح أساسي ويتم إنشاؤه تلقائيًا باستخدام auto_id=True.

    • +
    • text: يخزن بيانات النص الخام لعمليات البحث عن النص الكامل. يجب أن يكون نوع البيانات هو VARCHAR ، حيث أن VARCHAR هو نوع بيانات سلسلة ميلفوس لتخزين النص. قم بتعيين enable_analyzer=True للسماح لـ Milvus بترميز النص. بشكل افتراضي، يستخدم Milvus المحلل القياسي لتحليل النص. لتكوين محلل مختلف، ارجع إلى نظرة عامة.

    • +
    • sparse:: حقل متجه محجوز لتخزين التضمينات المتفرقة التي تم إنشاؤها داخليًا لعمليات البحث عن النص الكامل. يجب أن يكون نوع البيانات SPARSE_FLOAT_VECTOR.

    • +
    +

    الآن، قم بتعريف الدالة التي ستقوم بتحويل النص إلى تمثيلات متجهة متناثرة ثم قم بإضافتها إلى المخطط.

    + +
    bm25_function = Function(​
    +    name="text_bm25_emb", # Function name​
    +    input_field_names=["text"], # Name of the VARCHAR field containing raw text data​
    +    output_field_names=["sparse"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​
    +    function_type=FunctionType.BM25,​
    +)​
    +​
    +schema.add_function(bm25_function)​
    +
    +
    +
    import io.milvus.common.clientenum.FunctionType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq.Function;
    +
    +import java.util.*;
    +
    +schema.addFunction(Function.builder()
    +        .functionType(FunctionType.BM25)
    +        .name("text_bm25_emb")
    +        .inputFieldNames(Collections.singletonList("text"))
    +        .outputFieldNames(Collections.singletonList("vector"))
    +        .build());
    +
    +
    const functions = [
    +    {
    +      name: 'text_bm25_emb',
    +      description: 'bm25 function',
    +      type: FunctionType.BM25,
    +      input_field_names: ['text'],
    +      output_field_names: ['vector'],
    +      params: {},
    +    },
    +];
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ],
    +        "functions": [
    +            {
    +                "name": "text_bm25_emb",
    +                "type": "BM25",
    +                "inputFieldNames": ["text"],
    +                "outputFieldNames": ["sparse"],
    +                "params": {}
    +            }
    +        ]
    +    }'
    +
    +

    المعلمة

    +

    الوصف

    +

    name

    +

    +

    اسم الدالة. تقوم هذه الدالة بتحويل النص الخام من الحقل text إلى متجهات قابلة للبحث سيتم تخزينها في الحقل sparse.

    +

    input_field_names

    +

    اسم الحقل VARCHAR الذي يتطلب تحويل النص إلى متجهات متفرقة. بالنسبة إلى FunctionType.BM25 ، تقبل هذه المعلمة اسم حقل واحد فقط.

    +

    output_field_names

    +

    اسم الحقل حيث سيتم تخزين المتجهات المتفرقة التي تم إنشاؤها داخلياً. بالنسبة إلى FunctionType.BM25 ، تقبل هذه المعلمة اسم حقل واحد فقط.

    +

    function_type

    +

    نوع الدالة المراد استخدامها. اضبط القيمة على FunctionType.BM25.

    +
    +
    +

    بالنسبة للمجموعات التي تحتوي على حقول VARCHAR متعددة تتطلب تحويل النص إلى متجهات متناثرة، أضف دوال منفصلة إلى مخطط المجموعة، مع التأكد من أن كل دالة لها اسم فريد وقيمة output_field_names.

    +
    +

    تكوين الفهرس

    بعد تحديد المخطط بالحقول الضرورية والدالة المدمجة، قم بإعداد الفهرس لمجموعتك. لتبسيط هذه العملية، استخدم AUTOINDEX كـ index_type ، وهو خيار يسمح لـ Milvus باختيار وتكوين نوع الفهرس الأنسب بناءً على بنية بياناتك.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_type="AUTOINDEX", ​
    +    metric_type="BM25"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;
    +
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("sparse")
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)
    +        .metricType(IndexParam.MetricType.BM25)
    +        .build());
    +
    +
    const index_params = [
    +  {
    +    field_name: "sparse",
    +    metric_type: "BM25",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +
    export indexParams='[
    +        {
    +            "fieldName": "sparse",
    +            "metricType": "BM25",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +

    المعلمة

    +

    الوصف

    +

    field_name

    +

    اسم الحقل المتجه المراد فهرسته. للبحث عن النص الكامل، يجب أن يكون هذا هو الحقل الذي يخزن المتجهات المتفرقة التي تم إنشاؤها. في هذا المثال، اضبط القيمة على sparse.

    +

    index_type

    +

    نوع الفهرس المراد إنشاؤه. AUTOINDEX يسمح لـ Milvus بتحسين إعدادات الفهرس تلقائيًا. إذا كنت بحاجة إلى مزيد من التحكم في إعدادات الفهرس الخاص بك، يمكنك الاختيار من بين أنواع الفهارس المختلفة المتاحة للمتجهات المتفرقة في ملفوس. لمزيد من المعلومات، راجع الفهارس المدعومة في ملفوس.

    +

    metric_type

    +

    يجب تعيين قيمة هذه المعلمة على BM25 خصيصًا لوظيفة البحث عن النص الكامل.

    +
    +

    إنشاء المجموعة

    الآن قم بإنشاء المجموعة باستخدام المخطط ومعلمات الفهرس المحددة.

    + +
    client.create_collection(​
    +    collection_name='demo', ​
    +    schema=schema, ​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("demo")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    await client.create_collection(
    +    collection_name: 'demo', 
    +    schema: schema, 
    +    index_params: index_params,
    +    functions: functions
    +);
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"demo\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    +

    إدراج البيانات النصية

    بعد إعداد المجموعة والفهرس، تكون جاهزًا لإدراج البيانات النصية. في هذه العملية، تحتاج فقط إلى توفير النص الخام. تقوم الدالة المضمنة التي حددناها سابقًا تلقائيًا بإنشاء المتجه المتناثر المقابل لكل إدخال نصي.

    + +
    client.insert('demo', [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +])
    +
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +
    +import io.milvus.v2.service.vector.request.InsertReq;
    +
    +Gson gson = new Gson();
    +List<JsonObject> rows = Arrays.asList(
    +        gson.fromJson("{\"text\": \"information retrieval is a field of study.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"data mining and information retrieval overlap in research.\"}", JsonObject.class)
    +);
    +
    +client.insert(InsertReq.builder()
    +        .collectionName("demo")
    +        .data(rows)
    +        .build());
    +
    +
    await client.insert({
    +collection_name: 'demo', 
    +data: [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +]);
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "data": [
    +        {"text": "information retrieval is a field of study."},
    +        {"text": "information retrieval focuses on finding relevant information in large datasets."},
    +        {"text": "data mining and information retrieval overlap in research."}       
    +    ],
    +    "collectionName": "demo"
    +}'
    +
    +

    بمجرد إدراج البيانات في مجموعتك، يمكنك إجراء عمليات بحث نصية كاملة باستخدام استعلامات نصية خام. يقوم Milvus تلقائيًا بتحويل استعلامك إلى متجه متناثر وترتيب نتائج البحث المتطابقة باستخدام خوارزمية BM25، ثم يُرجع أعلىK (limit) النتائج.

    + +
    search_params = {​
    +    'params': {'drop_ratio_search': 0.2},​
    +}​
    +​
    +client.search(​
    +    collection_name='demo', ​
    +    data=['whats the focus of information retrieval?'],​
    +    anns_field='sparse',​
    +    limit=3,​
    +    search_params=search_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;
    +import io.milvus.v2.service.vector.request.data.EmbeddedText;
    +import io.milvus.v2.service.vector.response.SearchResp;
    +
    +Map<String,Object> searchParams = new HashMap<>();
    +searchParams.put("drop_ratio_search", 0.2);
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("demo")
    +        .data(Collections.singletonList(new EmbeddedText("whats the focus of information retrieval?")))
    +        .annsField("sparse")
    +        .topK(3)
    +        .searchParams(searchParams)
    +        .outputFields(Collections.singletonList("text"))
    +        .build());
    +
    +
    await client.search(
    +    collection_name: 'demo', 
    +    data: ['whats the focus of information retrieval?'],
    +    anns_field: 'sparse',
    +    limit: 3,
    +    params: {'drop_ratio_search': 0.2},
    +)
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "demo",
    +    "data": [
    +        "whats the focus of information retrieval?"
    +    ],
    +    "annsField": "sparse",
    +    "limit": 3,
    +    "outputFields": [
    +        "text"
    +    ],
    +    "searchParams":{
    +        "params":{
    +            "drop_ratio_search":0.2
    +        }
    +    }
    +}'
    +
    +

    المعلمة

    +

    الوصف

    +

    search_params

    +

    قاموس يحتوي على معلمات البحث.

    +

    params.drop_ratio_search

    +

    نسبة المصطلحات منخفضة التردد التي يجب تجاهلها أثناء البحث. لمزيد من التفاصيل، راجع Sparse Vector.

    +

    data

    +

    نص الاستعلام الخام.

    +

    anns_field

    +

    اسم الحقل الذي يحتوي على متجهات متفرقة تم إنشاؤها داخليًا.

    +

    limit

    +

    الحد الأقصى لعدد أعلى التطابقات المطلوب إرجاعها.

    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.json new file mode 100644 index 000000000..879bb7e8d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"},​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.GetReq​\nimport io.milvus.v2.service.vector.request.GetResp​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nGetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .ids(Arrays.asList(0, 1, 2))​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\nList results = getResp.getGetResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.get({​\n collection_name=\"query_collection\",​\n ids=[0,1,2],​\n output_fields=[\"vector\", \"color\"]​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"pink_8682\",\"id\":0,\"vector\":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"orange_6781\",\"id\":2,\"vector\":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n\n","​\nimport io.milvus.v2.service.vector.request.QueryReq​\nimport io.milvus.v2.service.vector.request.QueryResp​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\nList results = getResp.getQueryResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​\n// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nfunc ExampleClient_Query_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n resultSet, err := cli.Query(ctx, client.NewQueryOption(\"query_collection\").​\n WithFilter(`color like \"red%\"`).​\n WithOutputFields(\"vector\", \"color\").​\n WithLimit(3))​\n​\n fmt.Println(resultSet.GetColumn(\"color\"))​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.query({​\n collection_name=\"quick_setup\",​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n#{\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"red_4794\",\"id\":4,\"vector\":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{\"color\":\"red_9392\",\"id\":6,\"vector\":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​\n\n","from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","import io.milvus.orm.iterator.QueryIterator;​\nimport io.milvus.response.QueryResultsWrapper;​\nimport io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.QueryIteratorReq;​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n​\nwhile (true) {​\n List res = queryIterator.next();​\n if (res.isEmpty()) {​\n queryIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n​\n// Output​\n// [color:red_7025, id:1]​\n// [color:red_4794, id:4]​\n// [color:red_9392, id:6]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","# Currently not available\n\n","from pymilvus import MilvusClient​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nfrom pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n​\n# 使用 QueryIterator​\nfrom pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","GetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionName(\"partitionA\")​\n .ids(Arrays.asList(10, 11, 12))​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Collections.singletonList(\"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 使用 Get 方法​\nvar res = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 使用 Query 方法​\nres = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 暂不支持使用 QueryIterator​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n partition_names: ['partitionA'],​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['vector', 'color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\n# 使用 Get 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# 使用 Query 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"],​\n \"id\": [0, 1, 2]​\n}'​\n\n"],"headingContent":"Query​","anchorList":[{"label":"الاستعلام","href":"Query​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام الحصول على","href":"Use-Get​","type":2,"isActive":false},{"label":"استخدام الاستعلام","href":"Use-Query​","type":2,"isActive":false},{"label":"استخدام QueryIterator","href":"Use-QueryIterator​","type":2,"isActive":false},{"label":"الاستعلامات في الأقسام","href":"Queries-in-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.md new file mode 100644 index 000000000..4caf6bf1c --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/get-and-scalar-query.md @@ -0,0 +1,587 @@ +--- +id: get-and-scalar-query.md +summary: >- + بالإضافة إلى عمليات بحث ANN، يدعم ميلفوس أيضًا تصفية البيانات الوصفية من خلال + الاستعلامات. تقدم هذه الصفحة كيفية استخدام الاستعلام، والحصول، والاستعلامات + لإجراء تصفية البيانات الوصفية للبيانات الوصفية. +title: استعلام +--- +

    الاستعلام

    بالإضافة إلى عمليات بحث ANN، يدعم ميلفوس أيضًا تصفية البيانات الوصفية من خلال الاستعلامات. تقدم هذه الصفحة كيفية استخدام الاستعلام، والحصول، والاستعلامات لإجراء تصفية البيانات الوصفية للبيانات الوصفية.

    +

    نظرة عامة

    يمكن للمجموعة تخزين أنواع مختلفة من الحقول القياسية. يمكنك جعل Milvus يقوم بتصفية الكيانات بناءً على حقل قياسي واحد أو أكثر. يقدم Milvus ثلاثة أنواع من الاستعلامات: الاستعلام، والحصول، والاستعلام، والاستعلام المتكرر. يقارن الجدول أدناه بين أنواع الاستعلامات الثلاثة هذه.

    +

    +

    الحصول على

    +

    استعلام

    +

    الاستعلام المُؤقت

    +

    سيناريوهات قابلة للتطبيق

    +

    للعثور على الكيانات التي تحتوي على المفاتيح الأساسية المحددة.

    +

    +

    للعثور على جميع الكيانات أو عدد محدد من الكيانات التي تستوفي شروط التصفية المخصصة

    +

    للعثور على جميع الكيانات التي تفي بشروط التصفية المخصصة في استعلامات مرقمة.

    +

    طريقة التصفية

    +

    حسب المفاتيح الأساسية

    +

    بواسطة تعبيرات التصفية.

    +

    بواسطة تعبيرات التصفية.

    +

    معلمات إلزامية

    +
    • اسم المجموعة

    • +
    • المفاتيح الأساسية

    +

    +
    • اسم المجموعة

    • +
    • تعبيرات التصفية

    +
    • اسم المجموعة

    • +
    • تعبيرات التصفية

    • +
    • عدد الكيانات المطلوب إرجاعها لكل استعلام

    +

    معلمات اختيارية

    +
    • اسم القسم

    • +
    • حقول الإخراج

    +
    • اسم القسم

    • +
    • عدد الكيانات المطلوب إرجاعها

    • +
    • حقول الإخراج

    +
    • اسم القسم

    • +
    • عدد الكيانات المراد إرجاعها إجمالاً

    • +
    • حقول الإخراج

    +

    إرجاع

    +

    إرجاع الكيانات التي تحتوي على المفاتيح الأساسية المحددة في المجموعة أو القسم المحدد.

    +

    إرجاع كل أو عدد محدد من الكيانات التي تستوفي شروط التصفية المخصصة في المجموعة أو القسم المحدد.

    +

    إرجاع كافة الكيانات التي تفي بشروط التصفية المخصصة في المجموعة أو القسم المحدد من خلال استعلامات مرقمة بالصفحات.

    +
    +

    لمعرفة المزيد حول تصفية بيانات التعريف، راجع تصفية بيانات التعريف.

    +

    استخدام الحصول على

    عندما تحتاج إلى العثور على كيانات حسب مفاتيحها الأساسية، يمكنك استخدام الأسلوب Get. تفترض الأمثلة البرمجية التالية أن هناك ثلاثة حقول مسماة id و vector و color في مجموعتك وإرجاع الكيانات ذات المفاتيح الأساسية 1 و 2 و 3.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},​
    +]​
    +
    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.GetReq​
    +import io.milvus.v2.service.vector.request.GetResp​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +        ​
    +GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .ids(Arrays.asList(0, 1, 2))​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getGetResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.get({​
    +    collection_name="query_collection",​
    +    ids=[0,1,2],​
    +    output_fields=["vector", "color"]​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"color":"pink_8682","id":0,"vector":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"orange_6781","id":2,"vector":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​
    +
    +
    +

    استخدام الاستعلام

    عندما تحتاج إلى العثور على كيانات حسب شروط التصفية المخصصة، استخدم طريقة الاستعلام. تفترض أمثلة التعليمات البرمجية التالية وجود ثلاثة حقول باسم id و vector و color وإرجاع العدد المحدد من الكيانات التي تحتوي على قيمة color تبدأ ب red.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.service.vector.request.QueryReq​
    +import io.milvus.v2.service.vector.request.QueryResp​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getQueryResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​
    +// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +func ExampleClient_Query_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    resultSet, err := cli.Query(ctx, client.NewQueryOption("query_collection").​
    +        WithFilter(`color like "red%"`).​
    +        WithOutputFields("vector", "color").​
    +        WithLimit(3))​
    +​
    +    fmt.Println(resultSet.GetColumn("color"))​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.query({​
    +    collection_name="quick_setup",​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +#{"code":0,"cost":0,"data":[{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"red_4794","id":4,"vector":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{"color":"red_9392","id":6,"vector":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​
    +
    +
    +

    استخدام QueryIterator

    عندما تحتاج إلى العثور على الكيانات من خلال شروط تصفية مخصصة من خلال استعلامات مرقمة، قم بإنشاء QueryIterator واستخدم طريقة التالي() الخاصة به للتكرار على جميع الكيانات للعثور على تلك التي تستوفي شروط التصفية. تفترض الأمثلة البرمجية التالية أن هناك ثلاثة حقول باسم id و vector و color وإرجاع جميع الكيانات التي تحتوي على قيمة color تبدأ ب red.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    import io.milvus.orm.iterator.QueryIterator;​
    +import io.milvus.response.QueryResultsWrapper;​
    +import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.QueryIteratorReq;​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = queryIterator.next();​
    +    if (res.isEmpty()) {​
    +        queryIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +​
    +// Output​
    +// [color:red_7025, id:1]​
    +// [color:red_4794, id:4]​
    +// [color:red_9392, id:6]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    # Currently not available
    +
    +
    +

    الاستعلامات في الأقسام

    يمكنك أيضًا إجراء استعلامات ضمن قسم واحد أو عدة أقسام من خلال تضمين أسماء الأقسام في طلب الحصول أو الاستعلام أو الاستعلام أو الاستعلام المتكرر. تفترض الأمثلة البرمجية التالية وجود قسم باسم PartitionA في المجموعة.

    + +
    from pymilvus import MilvusClient​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +​
    +# 使用 QueryIterator​
    +from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionName("partitionA")​
    +        .ids(Arrays.asList(10, 11, 12))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Collections.singletonList("color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 使用 Get 方法​
    +var res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 使用 Query 方法​
    +res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 暂不支持使用 QueryIterator​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  partition_names: ['partitionA'],​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['vector', 'color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +# 使用 Get 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# 使用 Query 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"],​
    +    "id": [0, 1, 2]​
    +}'​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.json new file mode 100644 index 000000000..074051f08 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"chunk\": \"pink_8682\", \"docId\": 1},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"chunk\": \"red_7025\", \"docId\": 5},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"chunk\": \"orange_6781\", \"docId\": 2},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"chunk\": \"pink_9298\", \"docId\": 3},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"chunk\": \"red_4794\", \"docId\": 3},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"chunk\": \"yellow_4222\", \"docId\": 4},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"chunk\": \"red_9392\", \"docId\": 1},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"chunk\": \"grey_8510\", \"docId\": 2},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"chunk\": \"white_9381\", \"docId\": 5},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"chunk\": \"purple_4976\", \"docId\": 3},​\n]​\n​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vectors = [​\n [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​\n​\n# Group search results​\nres = client.search(​\n collection_name=\"group_search_collection\",​\n data=query_vectors,​\n limit=3,​\n group_by_field=\"docId\",​\n output_fields=[\"docId\"]​\n)​\n​\n# Retrieve the values in the `docId` column​\ndoc_ids = [result['entity']['docId'] for result in res[0]]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .groupByFieldName(\"docId\")​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n\n","// nolint​\nfunc ExampleClient_Search_grouping() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithGroupByField(\"docId\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n // highlight-start​\n group_by_field: \"docId\"​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"groupingField\": \"docId\",​\n \"outputFields\": [\"docId\"]​\n}'​\n\n","# Group search results​\n​\nres = client.search(​\n collection_name=\"group_search_collection\", ​\n data=query_vectors, # Query vector\n limit=5, # Top K results​ to return​\n group_by_field=\"docId\", # Group by docId​\n group_size=2, # Return 2 entities per group​\n strict_group_size=True, # Ensure each group has 2 entities​\n output_fields=[\"docId\"]​\n)​\n\n","FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .groupByFieldName(\"docId\")​\n .groupSize(2)​\n .strictGroupSize(true)​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n group_by_field: \"docId\",​\n // highlight-start​\n group_size: 2,​\n strict_group_size: true​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"groupingField\": \"docId\",​\n \"groupSize\":2,​\n \"strictGroupSize\":true,​\n \"outputFields\": [\"docId\"]​\n}'​\n\n"],"headingContent":"Grouping Search​","anchorList":[{"label":"تجميع البحث","href":"Grouping-Search​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إجراء بحث التجميع","href":"Perform-Grouping-Search​","type":2,"isActive":false},{"label":"تكوين حجم المجموعة","href":"Configure-group-size​","type":2,"isActive":false},{"label":"الاعتبارات","href":"Considerations​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.md new file mode 100644 index 000000000..ffa132cdc --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/grouping-search.md @@ -0,0 +1,365 @@ +--- +id: grouping-search.md +summary: >- + يسمح بحث التجميع لميلفوس بتجميع نتائج البحث حسب القيم الموجودة في حقل محدد + لتجميع البيانات على مستوى أعلى. على سبيل المثال، يمكنك استخدام بحث التجميع + الأساسي للعثور على الكتب المشابهة للكتاب الذي بين يديك، ولكن يمكنك استخدام بحث + التجميع للعثور على فئات الكتب التي قد تتضمن الموضوعات التي تمت مناقشتها في ذلك + الكتاب. يصف هذا الموضوع كيفية استخدام بحث التجميع إلى جانب الاعتبارات + الرئيسية. +title: تجميع البحث عن المجموعات +--- +

    تجميع البحث

    يسمح بحث التجميع لميلفوس بتجميع نتائج البحث حسب القيم الموجودة في حقل محدد لتجميع البيانات على مستوى أعلى. على سبيل المثال، يمكنك استخدام بحث التجميع الأساسي للعثور على الكتب المشابهة للكتاب الذي بين يديك، ولكن يمكنك استخدام بحث التجميع للعثور على فئات الكتب التي قد تتضمن الموضوعات التي تمت مناقشتها في ذلك الكتاب. يصف هذا الموضوع كيفية استخدام بحث التجميع إلى جانب الاعتبارات الرئيسية.

    +

    نظرة عامة

    عندما تشترك الكيانات في نتائج البحث في نفس القيمة في حقل قياسي، فإن هذا يشير إلى أنها متشابهة في سمة معينة، مما قد يؤثر سلبًا على نتائج البحث.

    +

    افترض أن مجموعة تخزن مستندات متعددة (يُشار إليها بـ docId). للاحتفاظ بأكبر قدر ممكن من المعلومات الدلالية عند تحويل المستندات إلى متجهات، يتم تقسيم كل مستند إلى فقرات (أو أجزاء) أصغر يمكن التحكم فيها وتخزينها ككيانات منفصلة. على الرغم من تقسيم المستند إلى أقسام أصغر، إلا أن المستخدمين غالبًا ما يظلون مهتمين بتحديد المستندات الأكثر صلة باحتياجاتهم.

    +

    + + ANN Search + البحث في الشبكة النانوية

    +

    عند إجراء بحث الجار الأقرب التقريبي (ANN) على مثل هذه المجموعة، قد تتضمن نتائج البحث عدة فقرات من نفس المستند، مما قد يؤدي إلى تجاهل مستندات أخرى، وهو ما قد لا يتماشى مع حالة الاستخدام المقصودة.

    +

    + + Grouping Search + تجميع البحث

    +

    لتحسين تنوّع نتائج البحث، يمكنك إضافة المعلمة group_by_field في طلب البحث لتمكين تجميع البحث. كما هو موضح في الرسم التخطيطي، يمكنك تعيين group_by_field إلى docId. عند تلقي هذا الطلب، سيقوم ميلفوس بـ

    +
      +
    • إجراء بحث ANN استنادًا إلى متجه الاستعلام المقدم للعثور على جميع الكيانات الأكثر تشابهًا مع الاستعلام.

    • +
    • تجميع نتائج البحث حسب group_by_field المحدد، مثل docId.

    • +
    • إرجاع أفضل النتائج لكل مجموعة، كما هو محدد بواسطة المعلمة limit ، مع الكيان الأكثر تشابهًا من كل مجموعة.

    • +
    +
    +

    بشكل افتراضي، يقوم بحث التجميع بإرجاع كيان واحد فقط لكل مجموعة. إذا كنت ترغب في زيادة عدد النتائج المراد إرجاعها لكل مجموعة، يمكنك التحكم في ذلك باستخدام المعلمة group_size والمعلمة strict_group_size.

    +
    +

    إجراء بحث التجميع

    يوفر هذا القسم مثالاً على التعليمات البرمجية لتوضيح استخدام البحث عن التجميع. يفترض المثال التالي أن المجموعة تتضمن حقول id و vector و chunk و docId.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "chunk": "pink_8682", "docId": 1},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "chunk": "red_7025", "docId": 5},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "chunk": "orange_6781", "docId": 2},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "chunk": "pink_9298", "docId": 3},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "chunk": "red_4794", "docId": 3},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "chunk": "yellow_4222", "docId": 4},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "chunk": "red_9392", "docId": 1},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "chunk": "grey_8510", "docId": 2},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "chunk": "white_9381", "docId": 5},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "chunk": "purple_4976", "docId": 3},​
    +]​
    +​
    +
    +
    +

    في طلب البحث، قم بتعيين كل من group_by_field و output_fields إلى docId. سيقوم Milvus بتجميع النتائج حسب الحقل المحدد وإرجاع الكيان الأكثر تشابهًا من كل مجموعة، بما في ذلك قيمة docId لكل كيان تم إرجاعه.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vectors = [​
    +    [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​
    +​
    +# Group search results​
    +res = client.search(​
    +    collection_name="group_search_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +    group_by_field="docId",​
    +    output_fields=["docId"]​
    +)​
    +​
    +# Retrieve the values in the `docId` column​
    +doc_ids = [result['entity']['docId'] for result in res[0]]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .groupByFieldName("docId")​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +
    +
    +
    // nolint​
    +func ExampleClient_Search_grouping() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,               // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ).WithGroupByField("docId"))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    // highlight-start​
    +    group_by_field: "docId"​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "groupingField": "docId",​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    في الطلب أعلاه، limit=3 يشير إلى أن النظام سيعيد نتائج البحث من ثلاث مجموعات، بحيث تحتوي كل مجموعة على الكيان الأكثر تشابهًا مع متجه الاستعلام.

    +

    تكوين حجم المجموعة

    بشكل افتراضي، يُرجع البحث عن المجموعات كيان واحد فقط لكل مجموعة. إذا كنت تريد نتائج متعددة لكل مجموعة، اضبط المعلمات group_size و strict_group_size.

    + +
    # Group search results​
    +​
    +res = client.search(​
    +    collection_name="group_search_collection", ​
    +    data=query_vectors, # Query vector
    +    limit=5, # Top K results​ to return​
    +    group_by_field="docId", # Group by docId​
    +    group_size=2, # Return 2 entities per group​
    +    strict_group_size=True, # Ensure each group has 2 entities​
    +    output_fields=["docId"]​
    +)​
    +
    +
    +
    FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .groupByFieldName("docId")​
    +        .groupSize(2)​
    +        .strictGroupSize(true)​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    group_by_field: "docId",​
    +    // highlight-start​
    +    group_size: 2,​
    +    strict_group_size: true​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "groupingField": "docId",​
    +    "groupSize":2,​
    +    "strictGroupSize":true,​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    في المثال أعلاه

    +
      +
    • group_size: يحدد عدد الكيانات المطلوب إرجاعها لكل مجموعة. على سبيل المثال، تعيين group_size=2 يعني أن كل مجموعة (أو كل docId) يجب أن تُرجع بشكل مثالي فقرتين من أكثر الفقرات (أو القطع) تشابهًا. إذا لم يتم تعيين group_size ، يقوم النظام افتراضيًا بإرجاع نتيجة واحدة لكل مجموعة.

    • +
    • strict_group_size: تتحكم هذه المعلمة المنطقية فيما إذا كان يجب على النظام فرض العدد الذي تم تعيينه بواسطة group_size. عند strict_group_size=True ، سيحاول النظام تضمين العدد الدقيق للكيانات المحددة بواسطة group_size في كل مجموعة (على سبيل المثال، فقرتان)، ما لم تكن هناك بيانات كافية في تلك المجموعة. بشكل افتراضي (strict_group_size=False)، يعطي النظام الأولوية لتلبية عدد المجموعات المحددة بواسطة المعلمة limit ، بدلاً من ضمان احتواء كل مجموعة على group_size كيانات. هذا النهج أكثر كفاءة بشكل عام في الحالات التي يكون فيها توزيع البيانات غير متساوٍ.

    • +
    +

    للحصول على تفاصيل المعلمة الإضافية، راجع البحث ().

    +

    الاعتبارات

      +
    • عدد المجموعات: تتحكم المعلمة limit في عدد المجموعات التي يتم إرجاع نتائج البحث منها، بدلاً من العدد المحدد للكيانات داخل كل مجموعة. يساعد تعيين limit المناسب في التحكم في تنوع البحث وأداء الاستعلام. يمكن أن يؤدي تقليل limit إلى تقليل تكاليف الحوسبة إذا كانت البيانات موزعة بكثافة أو إذا كان الأداء مصدر قلق.

    • +
    • الكيانات لكل مجموعة: تتحكم المعلمة group_size في عدد الكيانات التي يتم إرجاعها لكل مجموعة. يمكن أن يؤدي ضبط group_size بناءً على حالة الاستخدام إلى زيادة ثراء نتائج البحث. ومع ذلك، إذا كانت البيانات موزعة بشكل غير متساوٍ، فقد تقوم بعض المجموعات بإرجاع عدد كيانات أقل من المحدد بواسطة group_size ، خاصة في سيناريوهات البيانات المحدودة.

    • +
    • حجم المجموعة الصارم: عند strict_group_size=True ، سيحاول النظام إرجاع العدد المحدد من الكيانات (group_size) لكل مجموعة، ما لم تكن هناك بيانات كافية في تلك المجموعة. يضمن هذا الإعداد عدد كيانات متناسق لكل مجموعة ولكنه قد يؤدي إلى تدهور الأداء مع التوزيع غير المتكافئ للبيانات أو الموارد المحدودة. إذا لم يكن عدد الكيانات الصارم مطلوبًا، يمكن أن يؤدي الإعداد strict_group_size=False إلى تحسين سرعة الاستعلام.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.json new file mode 100644 index 000000000..f1468d167 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True, # Whether to enable text analysis for this field​\n enable_match=True # Whether to enable text match​\n)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n\n","analyzer_params={​\n \"type\": \"english\"​\n}​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=200, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params,​\n enable_match=True, ​\n)​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"english\");\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(200)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n analyzer_params: { type: 'english' },\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 200,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"my_vector\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\": \"5\"\n }\n }\n ]\n }'\n\n","TEXT_MATCH(field_name, text)​\n\n","filter = \"TEXT_MATCH(text, 'machine deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine deep')\";\n","export filter=\"\\\"TEXT_MATCH(text, 'machine deep')\\\"\"\n","filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"\n","export filter=\"\\\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\\\"\"\n","filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\"\n","String filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","const filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","export filter=\"\\\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\\\"\"\n","# Match entities with `keyword1` or `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1 keyword2')\"​\n​\n# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​\nresult = MilvusClient.search(​\n collection_name=\"YOUR_COLLECTION_NAME\", # Your collection name​\n anns_field=\"embeddings\", # Vector field name​\n data=[query_vector], # Query vector​\n filter=filter,​\n search_params={\"params\": {\"nprobe\": 10}},​\n limit=10, # Max. number of results to return​\n output_fields=[\"id\", \"text\"] # Fields to return​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .annsField(\"embeddings\")\n .data(Collections.singletonList(queryVector)))\n .filter(filter)\n .topK(10)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build());\n","// Match entities with `keyword1` or `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\n// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field\nconst result = await client.search(\n collection_name: \"YOUR_COLLECTION_NAME\", // Your collection name\n anns_field: \"embeddings\", // Vector field name\n data: [query_vector], // Query vector\n filter: filter,\n params: {\"nprobe\": 10},\n limit: 10, // Max. number of results to return\n output_fields: [\"id\", \"text\"] //Fields to return\n);\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1 keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"annsField\": \"my_vector\",\n \"data\": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],\n \"filter\": '\"$filter\"',\n \"searchParams\": {\n \"params\": {\n \"nprobe\": 10\n }\n },\n \"limit\": 3,\n \"outputFields\": [\"text\",\"id\"]\n}'\n","# Match entities with both `keyword1` and `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\"​\n​\nresult = MilvusClient.query(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n filter=filter, ​\n output_fields=[\"id\", \"text\"]​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nQueryResp queryResp = client.query(QueryReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .filter(filter)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build()\n);\n","// Match entities with both `keyword1` and `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nconst result = await client.query(\n collection_name: \"YOUR_COLLECTION_NAME\",\n filter: filter, \n output_fields: [\"id\", \"text\"]\n)\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"filter\": '\"$filter\"',\n \"outputFields\": [\"id\", \"text\"]\n}'\n"],"headingContent":"Text Match​","anchorList":[{"label":"مطابقة النص","href":"Text-Match​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"تمكين مطابقة النص","href":"Enable-text-match","type":2,"isActive":false},{"label":"استخدام مطابقة النص","href":"Use-text-match","type":2,"isActive":false},{"label":"الاعتبارات","href":"Considerations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.md new file mode 100644 index 000000000..598c9d420 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/keyword-match.md @@ -0,0 +1,430 @@ +--- +id: keyword-match.md +summary: >- + تتيح مطابقة النص في ميلفوس استرجاع المستندات بدقة بناءً على مصطلحات محددة. + تُستخدم هذه الميزة في المقام الأول للبحث المصفى لاستيفاء شروط محددة ويمكنها + دمج التصفية القياسية لتنقيح نتائج الاستعلام، مما يسمح بالبحث عن التشابه داخل + المتجهات التي تستوفي المعايير القياسية. +title: مطابقة النص +--- +

    مطابقة النص

    تتيح مطابقة النص في ميلفوس استرجاع المستندات بدقة بناءً على مصطلحات محددة. تُستخدم هذه الميزة في المقام الأول للبحث المصفى لتلبية شروط محددة ويمكنها دمج التصفية القياسية لتحسين نتائج الاستعلام، مما يسمح بالبحث عن التشابه داخل المتجهات التي تستوفي المعايير القياسية.

    +
    +

    تركز المطابقة النصية على العثور على التكرارات الدقيقة لمصطلحات الاستعلام، دون تسجيل مدى ملاءمة المستندات المتطابقة. إذا كنت ترغب في استرداد المستندات الأكثر صلة بناءً على المعنى الدلالي وأهمية مصطلحات الاستعلام، نوصيك باستخدام البحث في النص الكامل.

    +
    +

    نظرة عامة

    يدمج ميلفوس برنامج Tantivy لتشغيل فهرسه المقلوب الأساسي والبحث النصي القائم على المصطلحات. لكل إدخال نصي، يقوم ميلفوس بفهرسته باتباع الإجراء.

    +
      +
    1. المحلّل: يقوم المحلل بمعالجة النص المدخل عن طريق ترميزه إلى كلمات فردية أو رموز، ثم تطبيق المرشحات حسب الحاجة. وهذا يسمح لميلفوس ببناء فهرس بناءً على هذه الرموز.

    2. +
    3. الفهرسة: بعد تحليل النص، ينشئ Milvus فهرسًا مقلوبًا يقوم بتعيين كل رمز مميز إلى المستندات التي تحتوي عليه.

    4. +
    +

    عندما يقوم المستخدم بإجراء مطابقة نصية، يتم استخدام الفهرس المقلوب لاسترداد جميع المستندات التي تحتوي على المصطلحات بسرعة. وهذا أسرع بكثير من المسح الضوئي لكل مستند على حدة.

    +

    + + Text Match + مطابقة النص

    +

    تمكين مطابقة النص

    تعمل مطابقة النص على نوع الحقل VARCHAR ، وهو في الأساس نوع بيانات السلسلة في ملفوس. لتمكين مطابقة النص، قم بتعيين كل من enable_analyzer و enable_match على True ثم قم اختياريًا بتكوين محلل لتحليل النص عند تحديد مخطط المجموعة الخاص بك.

    +

    تعيين enable_analyzer و enable_match

    لتمكين مطابقة النص لحقل معين VARCHAR ، قم بتعيين كل من المعلمات enable_analyzer و enable_match إلى True عند تحديد مخطط الحقل. هذا يرشد Milvus إلى ترميز النص وإنشاء فهرس مقلوب للحقل المحدد، مما يسمح بمطابقة نصية سريعة وفعالة.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True, # Whether to enable text analysis for this field​
    +    enable_match=True # Whether to enable text match​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +
    +

    اختياري: تكوين محلل

    يعتمد أداء ودقة مطابقة النص على المحلل المحدد. المحللات المختلفة مصممة خصيصًا لمختلف اللغات والتراكيب النصية، لذا فإن اختيار المحلل المناسب يمكن أن يؤثر بشكل كبير على نتائج البحث لحالة الاستخدام الخاصة بك.

    +

    بشكل افتراضي، يستخدم Milvus محلل standard ، والذي يقوم بترميز النص استنادًا إلى المسافات البيضاء وعلامات الترقيم، ويزيل الرموز التي يزيد طولها عن 40 حرفًا، ويحول النص إلى أحرف صغيرة. لا حاجة إلى معلمات إضافية لتطبيق هذا الإعداد الافتراضي. لمزيد من المعلومات، راجع Standard.

    +

    في الحالات التي تتطلب محللًا مختلفًا، يمكنك تكوين محلل مختلف باستخدام المعلمة analyzer_params. على سبيل المثال، لتطبيق محلل english لمعالجة النص الإنجليزي.

    + +
    analyzer_params={​
    +    "type": "english"​
    +}​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=200, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params,​
    +    enable_match=True, ​
    +)​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "english");
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(200)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +    analyzer_params: { type: 'english' },
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 200,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "my_vector",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim": "5"
    +                }
    +            }
    +        ]
    +    }'
    +
    +
    +

    يوفر ميلفوس أيضًا العديد من المحللين الآخرين المناسبين للغات والسيناريوهات المختلفة. لمزيد من التفاصيل، راجع نظرة عامة.

    +

    استخدام مطابقة النص

    بمجرد تمكين مطابقة النص لحقل VARCHAR في مخطط مجموعتك، يمكنك إجراء مطابقات نصية باستخدام التعبير TEXT_MATCH.

    +

    بناء جملة تعبير TEXT_MATCH

    يُستخدم التعبير TEXT_MATCH لتحديد الحقل والمصطلحات المراد البحث عنها. وتكون صيغته على النحو التالي.

    +
    TEXT_MATCH(field_name, text)​
    +
    +
    +
      +
    • field_name: اسم حقل VARCHAR المطلوب البحث عنه.

    • +
    • text: المصطلحات المطلوب البحث عنها. يمكن الفصل بين المصطلحات المتعددة بمسافات أو محددات أخرى مناسبة بناءً على اللغة والمحلل المهيأ.

    • +
    +

    بشكل افتراضي، يستخدم TEXT_MATCH منطق المطابقة OR، مما يعني أنه سيعيد المستندات التي تحتوي على أي من المصطلحات المحددة. على سبيل المثال، للبحث عن المستندات التي تحتوي على المصطلح machine أو deep في الحقل text ، استخدم التعبير التالي.

    + +
    filter = "TEXT_MATCH(text, 'machine deep')"​
    +
    +
    String filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    const filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    export filter="\"TEXT_MATCH(text, 'machine deep')\""
    +
    +

    يمكنك أيضًا دمج عدة تعبيرات TEXT_MATCH باستخدام عوامل تشغيل منطقية لإجراء المطابقة AND.

    +
      +
    • للبحث عن المستندات التي تحتوي على كل من machine و deep في الحقل text ، استخدم التعبير التالي.

      +

      +
      filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"​
      +
      +
      String filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')";
      +
      +
      const filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
      +
      +
      export filter="\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\""
      +
    • +
    • للبحث عن المستندات التي تحتوي على كل من machine و learning ولكن بدون deep في الحقل text ، استخدم التعبيرات التالية:

      +

      +
      filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"
      +
      +
      String filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      const filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      export filter="\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\""
      +
    • +
    +

    البحث باستخدام مطابقة النص

    يمكن استخدام مطابقة النص مع البحث بالتشابه المتجه لتضييق نطاق البحث وتحسين أداء البحث. من خلال تصفية المجموعة باستخدام مطابقة النص قبل البحث عن التشابه المتجه، يمكنك تقليل عدد المستندات التي تحتاج إلى البحث، مما يؤدي إلى تسريع أوقات الاستعلام.

    +

    في هذا المثال، يقوم التعبير filter بتصفية نتائج البحث لتضمين المستندات التي تطابق المصطلح المحدد فقط keyword1 أو keyword2. ثم يتم إجراء بحث التشابه المتجه على هذه المجموعة الفرعية المصفاة من المستندات.

    + +
    # Match entities with `keyword1` or `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1 keyword2')"​
    +​
    +# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​
    +result = MilvusClient.search(​
    +    collection_name="YOUR_COLLECTION_NAME", # Your collection name​
    +    anns_field="embeddings", # Vector field name​
    +    data=[query_vector], # Query vector​
    +    filter=filter,​
    +    search_params={"params": {"nprobe": 10}},​
    +    limit=10, # Max. number of results to return​
    +    output_fields=["id", "text"] # Fields to return​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .annsField("embeddings")
    +        .data(Collections.singletonList(queryVector)))
    +        .filter(filter)
    +        .topK(10)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build());
    +
    +
    // Match entities with `keyword1` or `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
    +const result = await client.search(
    +    collection_name: "YOUR_COLLECTION_NAME", // Your collection name
    +    anns_field: "embeddings", // Vector field name
    +    data: [query_vector], // Query vector
    +    filter: filter,
    +    params: {"nprobe": 10},
    +    limit: 10, // Max. number of results to return
    +    output_fields: ["id", "text"] //Fields to return
    +);
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1 keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "annsField": "my_vector",
    +    "data": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],
    +    "filter": '"$filter"',
    +    "searchParams": {
    +        "params": {
    +            "nprobe": 10
    +        }
    +    },
    +    "limit": 3,
    +    "outputFields": ["text","id"]
    +}'
    +
    +

    الاستعلام مع مطابقة النص

    يمكن أيضًا استخدام مطابقة النص للتصفية العددية في عمليات الاستعلام. من خلال تحديد تعبير TEXT_MATCH في المعلمة expr للطريقة query() ، يمكنك استرداد المستندات التي تطابق المصطلحات المحددة.

    +

    يسترجع المثال أدناه المستندات حيث يحتوي الحقل text على كل من المصطلحين keyword1 و keyword2.

    + +
    # Match entities with both `keyword1` and `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"​
    +​
    +result = MilvusClient.query(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    filter=filter, ​
    +    output_fields=["id", "text"]​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +QueryResp queryResp = client.query(QueryReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .filter(filter)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build()
    +);
    +
    +
    // Match entities with both `keyword1` and `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +const result = await client.query(
    +    collection_name: "YOUR_COLLECTION_NAME",
    +    filter: filter, 
    +    output_fields: ["id", "text"]
    +)
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "filter": '"$filter"',
    +    "outputFields": ["id", "text"]
    +}'
    +
    +

    الاعتبارات

      +
    • يؤدي تمكين مطابقة النص لحقل ما إلى إنشاء فهرس مقلوب، مما يستهلك موارد التخزين. ضع في اعتبارك تأثير التخزين عند اتخاذ قرار تمكين هذه الميزة، حيث يختلف بناءً على حجم النص والرموز الفريدة والمحلل المستخدم.

    • +
    • بمجرد تحديد محلل في المخطط الخاص بك، تصبح إعداداته دائمة لتلك المجموعة. إذا قررت أن محللًا مختلفًا يناسب احتياجاتك بشكل أفضل، يمكنك التفكير في إسقاط المجموعة الحالية وإنشاء مجموعة جديدة بتكوين المحلل المطلوب.

    • +
    • قواعد الهروب في تعبيرات filter:

      +
        +
      • يتم تفسير الأحرف المحاطة بعلامات اقتباس مزدوجة أو علامات اقتباس مفردة داخل التعبيرات على أنها ثوابت سلسلة. إذا كان ثابت السلسلة يتضمن أحرف هروب، فيجب تمثيل أحرف الهروب بتسلسل الهروب. على سبيل المثال، استخدم \\ لتمثيل \ و \\t لتمثيل علامة تبويب \t و \\n لتمثيل سطر جديد.
      • +
      • إذا كان ثابت السلسلة محاطًا بعلامات اقتباس مفردة، يجب تمثيل علامة اقتباس مفردة داخل الثابت على أنه \\' بينما يمكن تمثيل علامة الاقتباس المزدوجة إما " أو \\". مثال: 'It\\'s milvus'.
      • +
      • إذا كان ثابت السلسلة محاطًا بعلامات اقتباس مزدوجة، فيجب تمثيل علامة اقتباس مزدوجة داخل الثابت على أنه \\" بينما يمكن تمثيل علامة الاقتباس المفردة إما ' أو \\'. مثال: "He said \\"Hi\\"".
      • +
    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.json new file mode 100644 index 000000000..8cbd2c7c1 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Metric Types​","anchorList":[{"label":"أنواع المقاييس","href":"Metric-Types​","type":1,"isActive":false},{"label":"المسافة الإقليدية (L2)","href":"Euclidean-distance-L2​","type":2,"isActive":false},{"label":"الضرب الداخلي (IP)","href":"Inner-product-IP​","type":2,"isActive":false},{"label":"تشابه جيب التمام","href":"Cosine-similarity-​","type":2,"isActive":false},{"label":"مسافة JACCARD","href":"JACCARD-distance​","type":2,"isActive":false},{"label":"مسافة هامينج","href":"HAMMING-distance​","type":2,"isActive":false},{"label":"تشابه BM25","href":"BM25-similarity​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.md new file mode 100644 index 000000000..643655cd7 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/metric.md @@ -0,0 +1,251 @@ +--- +id: metric.md +summary: >- + تُستخدم مقاييس التشابه لقياس أوجه التشابه بين المتجهات. يساعد اختيار مقياس + المسافة المناسب في تحسين أداء التصنيف والتجميع بشكل كبير. +title: الأنواع المترية +--- +

    أنواع المقاييس

    تُستخدم مقاييس التشابه لقياس أوجه التشابه بين المتجهات. يساعد اختيار مقياس المسافة المناسب في تحسين أداء التصنيف والتجميع بشكل كبير.

    +

    يدعم ميلفوس حاليًا هذه الأنواع من مقاييس التشابه: المسافة الإقليدية (L2)، الضرب الداخلي (IP)، تشابه جيب التمام (COSINEJACCARD و HAMMING و BM25 (المصممة خصيصًا للبحث عن النص الكامل على المتجهات المتفرقة).

    +

    يلخص الجدول أدناه التعيين بين أنواع الحقول المختلفة وأنواع المقاييس المقابلة لها.

    +

    نوع الحقل

    +

    نطاق البعد

    +

    أنواع المقاييس المدعومة

    +

    نوع القياس الافتراضي

    +

    FLOAT_VECTOR

    +

    2-32,768

    +

    COSINE، L2 ، IP

    +

    COSINE

    +

    FLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    +

    COSINE

    +

    BFLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE L2, IP

    +

    COSINE

    +

    SPARSE_FLOAT_VECTOR

    +

    لا حاجة لتحديد البُعد

    +

    IP، BM25 (يستخدم فقط للبحث في النص الكامل)

    +

    IP

    +

    BINARY_VECTOR

    +

    8-32,768*8

    +

    +

    HAMMING JACCARD

    +

    HAMMING

    +
    +
    +
      +
    • بالنسبة للحقول المتجهة من النوع SPARSE_FLOAT_VECTOR ، استخدم النوع المتري BM25 فقط عند إجراء بحث بالنص الكامل. لمزيد من المعلومات، راجع البحث عن النص الكامل.

    • +
    • بالنسبة للحقول المتجهة من النوع BINARY_VECTOR ، يجب أن تكون قيمة البُعد (dim) من مضاعفات العدد 8.

    • +
    +
    +

    يلخص الجدول أدناه خصائص قيم مسافة التشابه لجميع أنواع المقاييس المدعومة ونطاق قيمها.

    +

    نوع المقياس

    +

    خصائص قيم مسافات التشابه في المسافة

    +

    نطاق قيمة مسافة التشابه

    +

    L2

    +

    تشير القيمة الأصغر إلى تشابه أكبر.

    +

    [0, ∞)

    +

    IP

    +

    تشير القيمة الأكبر إلى تشابه أكبر.

    +

    [-1, 1]

    +

    COSINE

    +

    تشير القيمة الأكبر إلى تشابه أكبر.

    +

    [-1, 1]

    +

    JACCARD

    +

    تشير القيمة الأصغر إلى تشابه أكبر.

    +

    [0, 1]

    +

    HAMMING

    +

    تشير القيمة الأصغر إلى تشابه أكبر.

    +

    [0، خافت (متجه)]

    +

    BM25

    +

    تسجيل درجة الصلة استنادًا إلى تكرار المصطلح وتكرار المستند المقلوب وتطبيع المستند.

    +

    [0, ∞)

    +

    +
    +

    المسافة الإقليدية (L2)

    بشكل أساسي، تقيس المسافة الإقليدية طول القطعة التي تربط بين نقطتين.

    +

    فيما يلي صيغة المسافة الإقليدية.

    +

    + + Euclidean distance formula + صيغة المسافة الإقليدية

    +

    حيث a = (a0،a1،...،...،an-1) و b = (b0،b1،...،...، bn-1) نقطتان في الفضاء الإقليدي ن في الفضاء الإقليدي.

    +

    إنه مقياس المسافة الأكثر استخدامًا وهو مفيد جدًا عندما تكون البيانات متصلة.

    +
    +

    يحسب ميلفوس القيمة فقط قبل تطبيق الجذر التربيعي عند اختيار المسافة الإقليدية كمقياس للمسافة.

    +
    +

    الضرب الداخلي (IP)

    يتم تعريف المسافة IP بين تضمينينين على النحو التالي.

    +

    + + Inner product formula + صيغة الضرب الداخلي

    +

    يكون IP أكثر فائدة إذا كنت بحاجة إلى مقارنة بيانات غير طبيعية أو عندما تهتم بالمقدار والزاوية.

    +
    +

    إذا كنت تستخدم IP لحساب أوجه التشابه بين التضمينات، فيجب عليك تطبيع التضمينات. بعد التطبيع، يساوي حاصل الضرب الداخلي تشابه جيب التمام.

    +
    +

    لنفترض أن X' تم تطبيعه من تضمين X.

    +

    + + Normalized inner product formula + صيغة الضرب الداخلي الطبيعي

    +

    يكون الارتباط بين التضمينين على النحو التالي.

    +

    + + Correlation between embeddings + الارتباط بين التضمينين

    +

    تشابه جيب التمام

    يستخدم تشابه جيب التمام جيب تمام الزاوية بين مجموعتين من المتجهات لقياس مدى تشابههما. يمكنك التفكير في مجموعتي المتجهات على أنهما قطعتان مستقيمتان تبدآن من نفس النقطة، مثل [0،0،...]، لكنهما تشيران في اتجاهين مختلفين.

    +

    لحساب التشابه في جيب التمام بين مجموعتين من المتجهات A = (a0،a1،...،an-1) وB = (b0،b1،...، bn-1)، استخدم الصيغة التالية.

    +

    + + Cosine similarity formula + صيغة تشابه جيب التمام

    +

    يكون تشابه جيب التمام دائمًا في الفترة [-1، 1]. على سبيل المثال، متجهان متناسبان يكون تشابه جيب التمام بينهما يساوي ومتجهان متعامدان يكون التشابه بينهما يساوي ومتجهان متعاكسان يكون التشابه بينهما يساوي -1. كلما كان جيب التمام أكبر، كانت الزاوية بين المتجهين أصغر، ما يشير إلى أن هذين المتجهين متشابهان أكثر تشابهًا مع بعضهما البعض.

    +

    بطرح التشابه في جيب التمام من 1، يمكنك الحصول على مسافة جيب التمام بين المتجهين.

    +

    مسافة JACCARD

    يقيس معامل التشابه JACCARD التشابه بين مجموعتين من العينات، ويُعرَّف بأنه مقدار التشابه بين مجموعتين محددتين مقسومًا على مقدار التشابه بين مجموعتين محددتين. لا يمكن تطبيقه إلا على مجموعات العينات المحدودة.

    +

    + + JACCARD similarity coefficient formula + صيغة معامل التشابه JACCARD

    +

    تقيس المسافة JACCARD التباين بين مجموعات البيانات، ويتم الحصول عليها بطرح معامل تشابه JACCARD من 1. بالنسبة للمتغيرات الثنائية، تعادل المسافة JACCARD معامل تانيموتو.

    +

    + + JACCARD distance formula + صيغة مسافة JACCARD

    +

    مسافة هامينج

    تقيس مسافة HAMMING سلاسل البيانات الثنائية. المسافة بين سلسلتين متساويتين في الطول هي عدد مواضع البتات التي تختلف عندها البتات.

    +

    على سبيل المثال، لنفترض أن هناك سلسلتين، 1101 1001 و1001 1101.

    +

    11011001 ⊕ 10011101 = 01000100. وبما أن هذا يحتوي على اثنين من 1، فإن المسافة بين السلسلتين هي د (11011001، 10011101) = 2.

    +

    تشابه BM25

    BM25 هي طريقة قياس صلة النص المستخدمة على نطاق واسع، وهي مصممة خصيصًا للبحث في النص الكامل. وهي تجمع بين العوامل الرئيسية الثلاثة التالية.

    +
      +
    • تردد المصطلح (TF): يقيس مدى تكرار ظهور المصطلح في المستند. في حين أن الترددات الأعلى غالبًا ما تشير إلى أهمية أكبر، يستخدم BM25 معامل التشبع k1 لمنع المصطلحات المتكررة بشكل مفرط من الهيمنة على درجة الصلة.

    • +
    • تردد المستند العكسي (IDF): يعكس أهمية المصطلح عبر المجموعة بأكملها. وتحصل المصطلحات التي تظهر في عدد أقل من المستندات على قيمة أعلى لتكرار المستند (IDF)، مما يشير إلى مساهمة أكبر في الأهمية.

    • +
    • تطبيع طول المستند: تميل المستندات الأطول إلى الحصول على درجات أعلى بسبب احتوائها على مصطلحات أكثر. يخفف BM25 من هذا التحيز من خلال تطبيع أطوال المستندات، حيث يتحكم المعامل b في قوة هذا التطبيع.

    • +
    +

    يتم حساب درجة BM25 على النحو التالي.

    +

    + + BM25 similarity formula + معادلة تشابه BM25

    +

    وصف المعلمة.

    +
      +
    • ​Q: نص الاستعلام المقدم من المستخدم.

    • +
    • ​D: المستند الذي يتم تقييمه.

    • +
    • ​TF(qi​,D): تكرار المصطلح الذي يمثل عدد مرات ظهور المصطلح ​qi في المستند ​D.

    • +
    • ​IDF(qi​): : تردد المستند العكسي، محسوبًا على النحو التالي.

      +

      + + IDF formula + صيغة IDF

      +

      حيث ​N هو العدد الإجمالي للمستندات في مجموعة المستندات، و ​n(qi​) هو عدد المستندات التي تحتوي على المصطلح qi.

    • +
    • ​∣D∣: طول المستند ​D (إجمالي عدد المصطلحات).

    • +
    • ​avgdl: متوسط طول جميع المستندات في المجموعة.

    • +
    • ​k1​: يتحكم في تأثير تكرار المصطلح على النتيجة. تزيد القيم الأعلى من أهمية تكرار المصطلح. النطاق النموذجي هو [1.2، 2.0]، بينما يسمح ميلفوس بنطاق [0، 3].

    • +
    • ​b: يتحكم في درجة تطبيع الطول، وتتراوح من 0 إلى 1. عندما تكون القيمة 0، لا يتم تطبيق أي تطبيع؛ وعندما تكون القيمة 1، يتم تطبيق التطبيع الكامل.

    • +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.json new file mode 100644 index 000000000..b375a2262 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.json @@ -0,0 +1 @@ +{"codeList":["# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n # Set memory mapping property for whole cluster\n mmapEnabled: false | true\n # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. \n mmapDirPath: any/valid/path \n....\n","# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n vectorField: false # Enable mmap for loading vector data\n vectorIndex: false # Enable mmap for loading vector index\n scalarField: false # Enable mmap for loading scalar data\n scalarIndex: false # Enable mmap for loading scalar index\n....\n","# Get existing collection\ncollection = Collection(\"test_collection\") # Replace with your collection name\n\n# Set memory mapping property to True or Flase\ncollection.set_properties({'mmap.enabled': True})\n","schema = MilvusClient.create_schema()\n\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)\n","collection.alter_index(\n index_name=\"vector_index\", # Replace with your vector index name\n extra_params={\"mmap.enabled\": True} # Enable memory mapping for index\n)\n","# new-values.yaml\nextraConfigFiles:\n user.yaml: |+\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \nhelm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# patch.yaml\nspec:\n config:\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \n kubectl patch milvus --patch-file patch.yaml\n","# A new installation script is provided to enable mmap-related settings.\n"],"headingContent":"MMap-enabled Data Storage","anchorList":[{"label":"تخزين البيانات الممكّنة لخريطة الذاكرة","href":"MMap-enabled-Data-Storage","type":1,"isActive":false},{"label":"تكوين تعيين الذاكرة","href":"Configure-memory-mapping","type":2,"isActive":false},{"label":"تخصيص مسار التخزين في عمليات النشر المختلفة","href":"Customize-storage-path-in-different-deployments","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false},{"label":"الأسئلة الشائعة","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.md new file mode 100644 index 000000000..60ee1c3f9 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/mmap.md @@ -0,0 +1,190 @@ +--- +id: mmap.md +summary: يتيح MMap المزيد من البيانات في عقدة واحدة. +title: تخزين البيانات الممكّنة لخريطة الذاكرة +--- +

    تخزين البيانات الممكّنة لخريطة الذاكرة

    في Milvus، تسمح الملفات المعينة بالذاكرة بتعيين محتويات الملف مباشرة في الذاكرة. تعمل هذه الميزة على تحسين كفاءة الذاكرة، خاصةً في الحالات التي تكون فيها الذاكرة المتوفرة نادرة ولكن تحميل البيانات بالكامل غير ممكن. يمكن لآلية التحسين هذه أن تزيد من سعة البيانات مع ضمان الأداء حتى حد معين؛ ومع ذلك، عندما تتجاوز كمية البيانات الذاكرة بمقدار كبير، قد يعاني أداء البحث والاستعلام من تدهور خطير، لذا يرجى اختيار تشغيل هذه الميزة أو إيقاف تشغيلها حسب الاقتضاء.

    +

    تكوين تعيين الذاكرة

    بدءًا من Milvus 2.4، لديك المرونة لضبط ملف التكوين الثابت لتكوين إعدادات تعيين الذاكرة الافتراضية للمجموعة بأكملها قبل النشر. بالإضافة إلى ذلك، هناك خيار يمكنك من تغيير المعلمات ديناميكيًا لضبط إعدادات تعيين الذاكرة على مستوى المجموعة والفهرس. بالنظر إلى المستقبل، ستعمل التحديثات المستقبلية على توسيع إمكانيات تعيين الذاكرة لتشمل التكوينات على مستوى الحقل.

    +

    قبل نشر المجموعة: التكوين العام

    قبل نشر المجموعة، تطبق الإعدادات على مستوى المجموعة تعيين الذاكرة عبر المجموعة بأكملها. يضمن ذلك التزام جميع الكائنات الجديدة تلقائيًا بهذه التكوينات. من المهم ملاحظة أن تعديل هذه الإعدادات يتطلب إعادة تشغيل المجموعة لتصبح فعالة.

    +

    لضبط إعدادات تعيين ذاكرة مجموعتك، قم بتحرير الملف configs/milvus.yaml. ضمن هذا الملف، يمكنك تحديد ما إذا كنت تريد تمكين تعيين الذاكرة بشكل افتراضي وتحديد مسار الدليل لتخزين الملفات المعينة بالذاكرة. إذا تم ترك المسار (mmapDirPath) غير محدد، فسيقوم النظام افتراضيًا بتخزين الملفات المعينة للذاكرة في {localStorage.path}/mmap. لمزيد من المعلومات، راجع التكوينات المتعلقة بالتخزين المحلي.

    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    # Set memory mapping property for whole cluster
    +    mmapEnabled: false | true
    +    # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. 
    +    mmapDirPath: any/valid/path 
    +....
    +
    +

    بعد 2.4.10 ، ينقسم التكوين queryNode.mmap.mmapEnabled إلى أربعة حقول منفصلة أدناه، وجميع الإعدادات الافتراضية هي false:

    +
      +
    • queryNode.mmap.vectorField، يتحكم فيما إذا كانت بيانات المتجه هي mmap;
    • +
    • queryNode.mmap.vectorIndex، يتحكم فيما إذا كان فهرس المتجه هو mmap;
    • +
    • queryNode.mmap.scalarField، يتحكم فيما إذا كانت البيانات القياسية هي mmap;
    • +
    • queryNode.mmap.scalarIndex، يتحكم فيما إذا كان الفهرس القياسي هو mmap;
    • +
    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    vectorField: false # Enable mmap for loading vector data
    +    vectorIndex: false # Enable mmap for loading vector index
    +    scalarField: false # Enable mmap for loading scalar data
    +    scalarIndex: false # Enable mmap for loading scalar index
    +....
    +
    +

    بالإضافة إلى ذلك، يمكن فقط تشغيل وإيقاف تشغيل فهرس المتجه وبيانات المتجه mmap لمجموعة على حدة، ولكن ليس للآخرين.

    +

    التوافق: إذا تم تعيين التكوين الأصلي queryNode.mmap.mmapEnabled إلى true ، فسيتم تعيين التكوين المضاف حديثًا إلى true في هذا الوقت. إذا تم تعيين queryNode.mmap.mmapEnabled على false ، إذا تم تعيين التكوين الجديد على true ، فستكون القيمة النهائية true.

    +

    أثناء تشغيل الكتلة: التكوين الديناميكي

    أثناء وقت تشغيل المجموعة، يمكنك ضبط إعدادات تعيين الذاكرة ديناميكيًا على مستوى المجموعة أو الفهرس.

    +

    على مستوى المجموعة، يتم تطبيق تعيين الذاكرة على جميع البيانات الأولية غير المفهرسة داخل المجموعة، باستثناء المفاتيح الأساسية والطوابع الزمنية ومعرفات الصفوف. هذا النهج مناسب بشكل خاص للإدارة الشاملة لمجموعات البيانات الكبيرة.

    +

    لإجراء تعديلات ديناميكية على إعدادات تعيين الذاكرة داخل مجموعة، استخدم الأسلوب set_properties(). هنا، يمكنك التبديل mmap.enabled بين True أو False حسب الحاجة.

    +
    # Get existing collection
    +collection = Collection("test_collection") # Replace with your collection name
    +
    +# Set memory mapping property to True or Flase
    +collection.set_properties({'mmap.enabled': True})
    +
    +

    بعد 2.4.10 ، إعدادات تعيين الذاكرة داخل مجموعة، استخدم الأسلوب add_field. هنا، يمكنك التبديل mmap_enabled بين True أو False حسب الحاجة.

    +
    schema = MilvusClient.create_schema()
    +
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
    +
    +

    بالنسبة للإعدادات على مستوى الفهرس، يمكن تطبيق تعيين الذاكرة بشكل خاص على فهارس المتجهات دون التأثير على أنواع البيانات الأخرى. هذه الميزة لا تقدر بثمن بالنسبة للمجموعات التي تتطلب أداءً محسنًا لعمليات البحث عن المتجهات.

    +

    لتمكين أو تعطيل تعيين الذاكرة لفهرس داخل مجموعة، قم باستدعاء الأسلوب alter_index() ، مع تحديد اسم الفهرس الهدف في index_name وتعيين mmap.enabled إلى True أو False.

    +
    collection.alter_index(
    +    index_name="vector_index", # Replace with your vector index name
    +    extra_params={"mmap.enabled": True} # Enable memory mapping for index
    +)
    +
    +

    تخصيص مسار التخزين في عمليات النشر المختلفة

    يتم تعيين الملفات المعينة بالذاكرة افتراضيًا إلى الدليل /mmap داخل localStorage.path. إليك كيفية تخصيص هذا الإعداد عبر طرق النشر المختلفة:

    +
      +
    • بالنسبة لـ Milvus المثبت باستخدام مخطط Helm:
    • +
    +
    # new-values.yaml
    +extraConfigFiles:
    +   user.yaml: |+
    +      queryNode:
    +         mmap:
    +           mmapEnabled: true
    +           mmapDirPath: any/valid/path
    +        
    +helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
      +
    • بالنسبة ل Milvus المثبتة باستخدام مشغل Milvus:
    • +
    +
    # patch.yaml
    +spec:
    +  config:
    +    queryNode:
    +      mmap:
    +        mmapEnabled: true
    +        mmapDirPath: any/valid/path
    +      
    + kubectl patch milvus <milvus-name> --patch-file patch.yaml
    +
    +
      +
    • بالنسبة لـ Milvus المثبت باستخدام Docker:
    • +
    +
    # A new installation script is provided to enable mmap-related settings.
    +
    +

    الحدود

      +
    • لا يمكن تمكين تعيين الذاكرة لمجموعة محملة، تأكد من تحرير المجموعة قبل تمكين تعيين الذاكرة.

    • +
    • تعيين الذاكرة غير مدعوم لفهارس DiskANN أو فئة GPU.

    • +
    +

    الأسئلة الشائعة

      +
    • في أي السيناريوهات يوصى بتمكين تعيين الذاكرة؟ ما هي المفاضلات بعد تمكين هذه الميزة؟

      +

      يوصى بتعيين الذاكرة عندما تكون الذاكرة محدودة أو عندما تكون متطلبات الأداء معتدلة. يؤدي تمكين هذه الميزة إلى زيادة سعة تحميل البيانات. على سبيل المثال، في حالة تكوين وحدتي معالجة مركزية وذاكرة بسعة 8 جيجابايت، يمكن أن يسمح تمكين تعيين الذاكرة بتحميل بيانات أكثر بما يصل إلى 4 أضعاف مقارنةً بعدم تمكينها. يختلف التأثير على الأداء:

      +
        +
      • مع وجود ذاكرة كافية، يكون الأداء المتوقع مشابهًا لأداء استخدام الذاكرة فقط.

      • +
      • في حالة عدم كفاية الذاكرة، قد يتدهور الأداء المتوقع.

      • +
    • +
    • ما هي العلاقة بين تكوينات مستوى المجموعة ومستوى الفهرس؟

      +

      مستوى التجميع ومستوى الفهرس ليست علاقات شاملة، يتحكم مستوى التجميع فيما إذا كانت البيانات الأصلية ممكّنة على مستوى الذاكرة أم لا، بينما مستوى الفهرس مخصص للفهارس المتجهة فقط.

    • +
    • هل هناك أي نوع فهرس موصى به لتعيين الذاكرة؟

      +

      نعم، يوصى باستخدام HNSW لتمكين mmap. لقد اختبرنا فهارس سلاسل HNSW و IVF_FLAT و IVF_PQ/SQ من قبل، وانخفض أداء فهارس سلسلة IVF بشكل خطير، بينما لا يزال انخفاض الأداء عند تشغيل mmap لفهارس HNSW ضمن التوقعات.

    • +
    • ما نوع التخزين المحلي المطلوب لتعيين الذاكرة؟

      +

      يعمل القرص عالي الجودة على تحسين الأداء، مع كون محركات أقراص NVMe الخيار المفضل.

    • +
    • هل يمكن تعيين الذاكرة للبيانات القياسية؟

      +

      يمكن تطبيق تعيين الذاكرة على البيانات القياسية، ولكن لا يمكن تطبيقه على الفهارس المبنية على الحقول القياسية.

    • +
    • كيف يتم تحديد الأولوية لتكوينات تعيين الذاكرة عبر مستويات مختلفة؟

      +

      في Milvus، عندما يتم تحديد تكوينات تعيين الذاكرة بشكل صريح عبر مستويات متعددة، تشترك التكوينات على مستوى الفهرس ومستوى المجموعة في الأولوية العليا، ثم تليها التكوينات على مستوى المجموعة.

    • +
    • إذا قمتُ بالترقية من Milvus 2.3 وقمتُ بتكوين مسار دليل تعيين الذاكرة، ماذا سيحدث؟

      +

      إذا قمت بالترقية من Milvus 2.3 وقمت بتكوين مسار دليل تعيين الذاكرة (mmapDirPath)، فسيتم الاحتفاظ بالتكوين الخاص بك، وسيكون الإعداد الافتراضي لتعيين الذاكرة الممكّن (mmapEnabled) true. من المهم ترحيل البيانات الوصفية لمزامنة تكوين ملفاتك الحالية المعينة للذاكرة. لمزيد من التفاصيل، راجع ترحيل البيانات الوصفية.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.json new file mode 100644 index 000000000..444c8364d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.json @@ -0,0 +1 @@ +{"codeList":["# Create a collection in customized setup mode​\nfrom pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n# Add fields to schema​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(field_name=\"dense\", datatype=DataType.FLOAT_VECTOR, dim=5)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"text\")​\n .dataType(DataType.VarChar)​\n .maxLength(1000)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense\")​\n .dataType(DataType.FloatVector)​\n .dimension(768)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","// WIP​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// Create a collection in customized setup mode​\n// Define fields​\nconst fields = [​\n {​\n name: \"id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"text\",​\n data_type: DataType.VarChar,​\n max_length: 1000​\n },​\n {​\n name: \"sparse\",​\n data_type: DataType.SPARSE_FLOAT_VECTOR​\n },​\n {​\n name: \"dense\",​\n data_type: DataType.FloatVector,​\n dim: 768​\n }​\n]​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": true,​\n \"fields\": [​\n {​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"text\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 1000​\n }​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"dataType\": \"SparseFloatVector\"​\n },​\n {​\n \"fieldName\": \"dense\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"768\"​\n }​\n }​\n ]​\n }'​\n\n","from pymilvus import MilvusClient​\n​\n# Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# Add indexes​\nindex_params.add_index(​\n field_name=\"dense\",​\n index_name=\"dense_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128},​\n)​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_name=\"sparse_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\", # Index type for sparse vectors​\n metric_type=\"IP\", # Currently, only IP (Inner Product) is supported for sparse vectors​\n params={\"drop_ratio_build\": 0.2}, # The ratio of small vector values to be dropped during indexing​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nMap denseParams = new HashMap<>();​\ndenseParams.put(\"nlist\", 128);​\nIndexParam indexParamForDenseField = IndexParam.builder()​\n .fieldName(\"dense\")​\n .indexName(\"dense_index\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(denseParams)​\n .build();​\n​\nMap sparseParams = new HashMap<>();​\nsparseParams.put(\"drop_ratio_build\", 0.2);​\nIndexParam indexParamForSparseField = IndexParam.builder()​\n .fieldName(\"sparse\")​\n .indexName(\"sparse_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(sparseParams)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForDenseField);​\nindexParams.add(indexParamForSparseField);​\n\n","const index_params = [{​\n field_name: \"dense\",​\n index_type: \"IVF_FLAT\",​\n metric_type: \"IP\"​\n},{​\n field_name: \"sparse\",​\n index_type: \"SPARSE_INVERTED_INDEX\",​\n metric_type: \"IP\"​\n}]​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_index\",​\n \"indexType\":\"IVF_FLAT\",​\n \"params\":{\"nlist\":128}​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\"​\n }​\n ]'​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_collection(​\n collection_name=\"hybrid_search_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","res = await client.createCollection({​\n collection_name: \"hybrid_search_collection\",​\n fields: fields,​\n index_params: index_params,​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","from pymilvus import MilvusClient​\n​\ndata=[​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n​\nres = client.insert(​\n collection_name=\"hybrid_search_collection\",​\n data=data​\n)​\n​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\n​\nGson gson = new Gson();​\nJsonObject row1 = new JsonObject();​\nrow1.addProperty(\"id\", 1);​\nrow1.addProperty(\"text\", \"Artificial intelligence was founded as an academic discipline in 1956.\");​\nrow1.add(\"dense\", gson.toJsonTree(dense1));​\nrow1.add(\"sparse\", gson.toJsonTree(sparse1));​\n​\nJsonObject row2 = new JsonObject();​\nrow2.addProperty(\"id\", 2);​\nrow2.addProperty(\"text\", \"Alan Turing was the first person to conduct substantial research in AI.\");​\nrow2.add(\"dense\", gson.toJsonTree(dense2));​\nrow2.add(\"sparse\", gson.toJsonTree(sparse2));​\n​\nJsonObject row3 = new JsonObject();​\nrow3.addProperty(\"id\", 3);​\nrow3.addProperty(\"text\", \"Born in Maida Vale, London, Turing was raised in southern England.\");​\nrow3.add(\"dense\", gson.toJsonTree(dense3));​\nrow3.add(\"sparse\", gson.toJsonTree(sparse3));​\n​\nList data = Arrays.asList(row1, row2, row3);​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nvar data = [​\n {id: 0, text: \"Artificial intelligence was founded as an academic discipline in 1956.\", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​\n {id: 1, text: \"Alan Turing was the first person to conduct substantial research in AI.\", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​\n {id: 2, text: \"Born in Maida Vale, London, Turing was raised in southern England.\" , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"hybrid_search_collection\",​\n data: data,​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{\"9637\": 0.30856525997853057, \"4399\": 0.19771651149001523}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{\"6959\": 0.31025067641541815, \"1729\": 0.8265339135915016}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{\"1220\": 0.15303302147479103, \"7335\": 0.9436728846033107}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n ],​\n \"collectionName\": \"hybrid_search_collection\"​\n}'​\n\n","from pymilvus import AnnSearchRequest​\n​\nquery_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nsearch_param_1 = {​\n \"data\": [query_dense_vector],​\n \"anns_field\": \"dense\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2​\n}​\nrequest_1 = AnnSearchRequest(**search_param_1)​\n​\nquery_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​\nsearch_param_2 = {​\n \"data\": [query_sparse_vector],​\n \"anns_field\": \"sparse\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2​\n}​\nrequest_2 = AnnSearchRequest(**search_param_2)​\n​\nreqs = [request_1, request_2]​\n​\n\n","import io.milvus.v2.service.vector.request.AnnSearchReq;​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\n​\nfloat[] dense = new float[]{-0.0475336798f, 0.0521207601f, 0.0904406682f, ...};​\nSortedMap sparse = new TreeMap() {{​\n put(3573L, 0.34701499f);​\n put(5263L, 0.263937551f);​\n ...​\n}};​\n​\n​\nList queryDenseVectors = Collections.singletonList(new FloatVec(dense));​\nList querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​\n​\nList searchRequests = new ArrayList<>();​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"dense\")​\n .vectors(queryDenseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"nprobe\\\": 10}\")​\n .topK(2)​\n .build());​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"sparse\")​\n .vectors(querySparseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"drop_ratio_build\\\": 0.2}\")​\n .topK(2)​\n .build());​\n\n","const search_param_1 = {​\n \"data\": query_vector, ​\n \"anns_field\": \"dense\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n​\nconst search_param_2 = {​\n \"data\": query_sparse_vector, ​\n \"anns_field\": \"sparse\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n\n","export req='[​\n {​\n \"data\": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​\n \"annsField\": \"dense\",​\n \"params\": {​\n \"params\": {​\n \"nprobe\": 10​\n }​\n },​\n \"limit\": 2​\n },​\n {​\n \"data\": [{\"3573\": 0.34701499565746674}, {\"5263\": 0.2639375518635271}],​\n \"annsField\": \"sparse\",​\n \"params\": {​\n \"params\": {​\n \"drop_ratio_build\": 0.2​\n }​\n },​\n \"limit\": 2​\n }​\n ]'​\n\n","from pymilvus import WeightedRanker​\n​\nrerank= WeightedRanker(0.8, 0.3) ​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.WeightedRanker;​\n​\nBaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = WeightedRanker(0.8, 0.3);​\n\n","export rerank='{​\n \"strategy\": \"ws\",​\n \"params\": {\"weights\": [0.8,0.3]}​\n }'​\n\n","from pymilvus import RRFRanker​\n​\nranker = RRFRanker(100)​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.RRFRanker;​\n​\nBaseRanker reranker = new RRFRanker(100);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = RRFRanker(\"100\");​\n\n","export rerank='{​\n \"strategy\": \"rrf\",​\n \"params\": { \"k\": 100}​\n }'​\n\n","from pymilvus import MilvusClient​\n​\nres = client.hybrid_search(​\n collection_name=\"hybrid_search_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n limit=2​\n)​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.HybridSearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nHybridSearchReq hybridSearchReq = HybridSearchReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .searchRequests(searchRequests)​\n .ranker(reranker)​\n .topK(2)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.hybridSearch(hybridSearchReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.loadCollection({​\n collection_name: \"hybrid_search_collection\"​\n})​\n​\nimport { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​\n​\nconst search = await client.search({​\n collection_name: \"hybrid_search_collection\",​\n data: [search_param_1, search_param_2],​\n limit: 2,​\n rerank: RRFRanker(100)​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"search\\\": ${req},​\n \\\"rerank\\\": {​\n \\\"strategy\\\":\\\"rrf\\\",​\n \\\"params\\\": {​\n \\\"k\\\": 10​\n }​\n },​\n \\\"limit\\\": 3,​\n \\\"outputFields\\\": [​\n \\\"user_id\\\",​\n \\\"word_count\\\",​\n \\\"book_describe\\\"​\n ]​\n}\"​\n\n","[\"['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']\"]​\n\n"],"headingContent":"Hybrid Search​","anchorList":[{"label":"البحث الهجين","href":"Hybrid-Search​","type":1,"isActive":false},{"label":"السيناريوهات","href":"Scenarios​","type":2,"isActive":false},{"label":"سير العمل","href":"Workflow​","type":2,"isActive":false},{"label":"أمثلة","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.md new file mode 100644 index 000000000..4e67d8a19 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/multi-vector-search.md @@ -0,0 +1,681 @@ +--- +id: multi-vector-search.md +order: 2 +summary: يوضح هذا الدليل كيفية إجراء البحث المختلط في ميلفوس وفهم إعادة ترتيب النتائج. +title: البحث الهجين +--- +

    البحث الهجين

    يشير البحث المختلط إلى طريقة بحث تُجري عمليات بحث متعددة للشبكات العصبية الاصطناعية في وقت واحد، وتعيد ترتيب مجموعات متعددة من النتائج من عمليات البحث هذه، ثم تُرجع في النهاية مجموعة واحدة من النتائج. يمكن أن يؤدي استخدام البحث الهجين إلى تحسين دقة البحث. يدعم Zilliz إجراء بحث هجين على مجموعة ذات حقول متجهة متعددة.

    +

    يُستخدم البحث الهجين بشكل شائع في سيناريوهات تشمل عمليات البحث عن المتجهات المتفرقة الكثيفة وعمليات البحث متعددة الوسائط. سيوضح هذا الدليل كيفية إجراء بحث هجين في Zilliz مع مثال محدد.

    +

    السيناريوهات

    البحث الهجين مناسب للسيناريوهين التاليين.

    +

    بحث متناثر - كثيف المتجهات

    يمكن لأنواع مختلفة من المتجهات أن تمثل معلومات مختلفة، ويمكن أن يؤدي استخدام نماذج تضمين مختلفة إلى تمثيل ميزات وجوانب مختلفة من البيانات بشكل أكثر شمولاً. على سبيل المثال، يمكن أن يؤدي استخدام نماذج تضمين مختلفة لنفس الجملة إلى توليد متجه كثيف لتمثيل المعنى الدلالي ومتجه متناثر لتمثيل تكرار الكلمات في الجملة.

    +
      +
    • المتجهات المتفرقة: تتميز المتجهات المتفرقة بأبعادها المتجهة العالية ووجود عدد قليل من القيم غير الصفرية. هذه البنية تجعلها مناسبة بشكل خاص لتطبيقات استرجاع المعلومات التقليدية. في معظم الحالات، يتوافق عدد الأبعاد المستخدمة في المتجهات المتفرقة مع الرموز المختلفة في لغة واحدة أو أكثر. يتم تعيين قيمة لكل بُعد تشير إلى الأهمية النسبية لهذا الرمز في المستند. يثبت هذا التصميم فائدته للمهام التي تتضمن مطابقة النصوص.

    • +
    • المتجهات الكثيفة: المتجهات الكثيفة هي تضمينات مشتقة من الشبكات العصبية. عند ترتيبها في مصفوفة مرتبة، تلتقط هذه المتجهات الجوهر الدلالي للنص المدخل. تجدر الإشارة إلى أن المتجهات الكثيفة لا تقتصر على معالجة النصوص؛ فهي تُستخدم أيضًا على نطاق واسع في الرؤية الحاسوبية لتمثيل دلالات البيانات المرئية. وتتميز هذه المتجهات الكثيفة، التي يتم إنشاؤها عادةً بواسطة نماذج تضمين النص، بأن معظم العناصر أو جميعها لا تساوي صفرًا. وبالتالي، تكون المتجهات الكثيفة فعالة بشكل خاص في تطبيقات البحث الدلالي، حيث يمكنها إرجاع النتائج الأكثر تشابهًا استنادًا إلى المسافة بين المتجهات حتى في حالة عدم وجود تطابق نصي دقيق. تتيح هذه الإمكانية الحصول على نتائج بحث أكثر دقة وإدراكًا للسياق، وغالبًا ما تلتقط العلاقات بين المفاهيم التي قد تغفلها الأساليب القائمة على الكلمات الرئيسية.

    • +
    +

    لمزيد من التفاصيل، راجع المتجهات المتفرقة والمتجهات الكثيفة.

    +

    البحث متعدد الوسائط

    يشير البحث متعدد الوسائط إلى البحث عن تشابه البيانات غير المهيكلة عبر طرائق متعددة (مثل الصور ومقاطع الفيديو والصوت والنصوص وغيرها). على سبيل المثال، يمكن تمثيل شخص ما باستخدام طرائق مختلفة من البيانات مثل بصمات الأصابع والبصمات الصوتية وملامح الوجه. يدعم البحث الهجين عمليات بحث متعددة في وقت واحد. على سبيل المثال البحث عن شخص ببصمات أصابع وبصمات صوتية متشابهة.

    +

    سير العمل

    سير العمل الرئيسي لإجراء البحث الهجين هو كما يلي.

    +
      +
    1. توليد متجهات كثيفة من خلال تضمين نماذج مثل BERT و Transformers.

    2. +
    3. توليد متجهات متناثرة من خلال نماذج التضمين مثل BM25 و BGE-M3 و SPLADE وغيرها.

    4. +
    5. إنشاء مجموعة في Zilliz وتحديد مخطط المجموعة الذي يتضمن حقول المتجهات الكثيفة والمتناثرة.

    6. +
    7. أدخل المتجهات الكثيفة المتفرقة في المجموعة التي تم إنشاؤها للتو في الخطوة السابقة.

    8. +
    9. إجراء بحث هجين: سيعود البحث الهجين على المتجهات الكثيفة بمجموعة من أفضل K من النتائج الأكثر تشابهًا، كما سيعود البحث الهجين على المتجهات المتفرقة بمجموعة من أفضل K من النتائج.

    10. +
    11. التطبيع: قم بتطبيع درجات مجموعتي أعلى K من النتائج، وتحويل الدرجات إلى نطاق بين [0،1].

    12. +
    13. اختر إستراتيجية إعادة ترتيب مناسبة لدمج مجموعتي نتائج أعلى K وإعادة ترتيبها وإرجاع مجموعة نهائية من نتائج أعلى K في النهاية.

    14. +
    +

    + + Hybrid Search Workflow + سير عمل البحث الهجين

    +

    أمثلة

    سيستخدم هذا القسم مثالاً محددًا لتوضيح كيفية إجراء بحث هجين على المتجهات المتفرقة الكثيفة لتعزيز دقة عمليات البحث النصية.

    +

    إنشاء مجموعة مع حقول متجهات متعددة

    تتضمن عملية إنشاء مجموعة ثلاثة أجزاء: تحديد مخطط المجموعة، وتكوين معلمات الفهرس، وإنشاء المجموعة.

    +

    تعريف المخطط

    في هذا المثال، يجب تعريف حقول متجهة متعددة ضمن مخطط المجموعة. حاليًا، يمكن أن تتضمن كل مجموعة ما يصل إلى 4 حقول متجهة بشكل افتراضي. لكن يمكنك أيضًا تعديل قيمة proxy.maxVectorFieldNum لتضمين ما يصل إلى 10 حقول متجهة في مجموعة حسب الحاجة.

    +

    يحدد المثال التالي مخطط مجموعة، حيث dense و sparse هما حقلا المتجهات.

    +
      +
    • id: يعمل هذا الحقل كمفتاح أساسي لتخزين المعرفات النصية. نوع بيانات هذا الحقل هو INT64.

    • +
    • text: يستخدم هذا الحقل لتخزين المحتوى النصي. نوع بيانات هذا الحقل هو VARCHAR، بحد أقصى للطول 1000 حرف.

    • +
    • dense: يستخدم هذا الحقل لتخزين المتجهات الكثيفة للنصوص. نوع بيانات هذا الحقل هو FLOAT_VECTOR، ببعد متجه يبلغ 768.

    • +
    • sparse: يستخدم هذا الحقل لتخزين المتجهات المتفرقة للنصوص. نوع بيانات هذا الحقل هو SPARSE_FLOAT_VECTOR.

    • +
    + +
    # Create a collection in customized setup mode​
    +from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +# Add fields to schema​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field(field_name="dense", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("text")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(1000)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(768)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    // WIP​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// Create a collection in customized setup mode​
    +// Define fields​
    +const fields = [​
    +    {​
    +        name: "id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "text",​
    +        data_type: DataType.VarChar,​
    +        max_length: 1000​
    +    },​
    +    {​
    +        name: "sparse",​
    +        data_type: DataType.SPARSE_FLOAT_VECTOR​
    +    },​
    +    {​
    +        name: "dense",​
    +        data_type: DataType.FloatVector,​
    +        dim: 768​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": true,​
    +        "fields": [​
    +            {​
    +                "fieldName": "id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "text",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 1000​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "sparse",​
    +                "dataType": "SparseFloatVector"​
    +            },​
    +            {​
    +                "fieldName": "dense",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "768"​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    أثناء عمليات البحث في المتجهات المتناثرة، يمكنك تبسيط عملية توليد متجهات التضمين المتناثرة من خلال الاستفادة من إمكانيات البحث في النص الكامل. لمزيد من التفاصيل، راجع البحث بالنص الكامل.

    +

    إنشاء فهرس

    بعد تحديد مخطط المجموعة، من الضروري إعداد فهارس المتجهات ومقاييس التشابه. في هذا المثال، يتم إنشاء فهرس IVF_FLAT لحقل المتجهات الكثيفة dense ، ويتم إنشاء فهرس SPARSE_INVERTED_INDEX لحقل المتجهات المتفرقة sparse. للتعرف على أنواع الفهارس المدعومة، راجع شرح الفهرس.

    + +
    from pymilvus import MilvusClient​
    +​
    +# Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# Add indexes​
    +index_params.add_index(​
    +    field_name="dense",​
    +    index_name="dense_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128},​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_name="sparse_index",​
    +    index_type="SPARSE_INVERTED_INDEX",  # Index type for sparse vectors​
    +    metric_type="IP",  # Currently, only IP (Inner Product) is supported for sparse vectors​
    +    params={"drop_ratio_build": 0.2},  # The ratio of small vector values to be dropped during indexing​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +Map<String, Object> denseParams = new HashMap<>();​
    +denseParams.put("nlist", 128);​
    +IndexParam indexParamForDenseField = IndexParam.builder()​
    +        .fieldName("dense")​
    +        .indexName("dense_index")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(denseParams)​
    +        .build();​
    +​
    +Map<String, Object> sparseParams = new HashMap<>();​
    +sparseParams.put("drop_ratio_build", 0.2);​
    +IndexParam indexParamForSparseField = IndexParam.builder()​
    +        .fieldName("sparse")​
    +        .indexName("sparse_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(sparseParams)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForDenseField);​
    +indexParams.add(indexParamForSparseField);​
    +
    +
    +
    const index_params = [{​
    +    field_name: "dense",​
    +    index_type: "IVF_FLAT",​
    +    metric_type: "IP"​
    +},{​
    +    field_name: "sparse",​
    +    index_type: "SPARSE_INVERTED_INDEX",​
    +    metric_type: "IP"​
    +}]​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense",​
    +            "metricType": "IP",​
    +            "indexName": "dense_index",​
    +            "indexType":"IVF_FLAT",​
    +            "params":{"nlist":128}​
    +        },​
    +        {​
    +            "fieldName": "sparse",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    إنشاء مجموعة

    قم بإنشاء مجموعة باسم demo مع مخطط المجموعة والفهارس التي تم تكوينها في الخطوتين السابقتين.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_collection(​
    +    collection_name="hybrid_search_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    res = await client.createCollection({​
    +    collection_name: "hybrid_search_collection",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    إدراج البيانات

    أدخل المتجهات المتناثرة الكثيفة في المجموعة demo.

    + +
    from pymilvus import MilvusClient​
    +​
    +data=[​
    +    {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +    {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +    {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +​
    +res = client.insert(​
    +    collection_name="hybrid_search_collection",​
    +    data=data​
    +)​
    +​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +​
    +Gson gson = new Gson();​
    +JsonObject row1 = new JsonObject();​
    +row1.addProperty("id", 1);​
    +row1.addProperty("text", "Artificial intelligence was founded as an academic discipline in 1956.");​
    +row1.add("dense", gson.toJsonTree(dense1));​
    +row1.add("sparse", gson.toJsonTree(sparse1));​
    +​
    +JsonObject row2 = new JsonObject();​
    +row2.addProperty("id", 2);​
    +row2.addProperty("text", "Alan Turing was the first person to conduct substantial research in AI.");​
    +row2.add("dense", gson.toJsonTree(dense2));​
    +row2.add("sparse", gson.toJsonTree(sparse2));​
    +​
    +JsonObject row3 = new JsonObject();​
    +row3.addProperty("id", 3);​
    +row3.addProperty("text", "Born in Maida Vale, London, Turing was raised in southern England.");​
    +row3.add("dense", gson.toJsonTree(dense3));​
    +row3.add("sparse", gson.toJsonTree(sparse3));​
    +​
    +List<JsonObject> data = Arrays.asList(row1, row2, row3);​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +var data = [​
    +    {id: 0, text: "Artificial intelligence was founded as an academic discipline in 1956.", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​
    +    {id: 1, text: "Alan Turing was the first person to conduct substantial research in AI.", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​
    +    {id: 2, text: "Born in Maida Vale, London, Turing was raised in southern England." , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]}       ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "hybrid_search_collection",​
    +    data: data,​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{"9637": 0.30856525997853057, "4399": 0.19771651149001523}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +        {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{"6959": 0.31025067641541815, "1729": 0.8265339135915016}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +        {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{"1220": 0.15303302147479103, "7335": 0.9436728846033107}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +    ],​
    +    "collectionName": "hybrid_search_collection"​
    +}'​
    +
    +
    +

    إنشاء مثيلات AnnSearchRequest متعددة

    يتم تنفيذ البحث الهجين من خلال إنشاء عدة AnnSearchRequest في الدالة hybrid_search() ، حيث يمثل كل AnnSearchRequest طلب بحث ANN أساسي لحقل متجه معين. لذلك، قبل إجراء البحث الهجين، من الضروري إنشاء AnnSearchRequest لكل حقل متجه.

    +
    +

    في البحث الهجين، يدعم كل AnnSearchRequest متجه استعلام واحد فقط.

    +
    +

    لنفترض أن نص الاستعلام "من بدأ أبحاث الذكاء الاصطناعي؟" قد تم تحويله بالفعل إلى متجهات متفرقة وكثيفة. بناءً على ذلك، يتم إنشاء طلبي بحث AnnSearchRequest لحقلي المتجهات sparse و dense على التوالي، كما هو موضح في المثال التالي.

    + +
    from pymilvus import AnnSearchRequest​
    +​
    +query_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +search_param_1 = {​
    +    "data": [query_dense_vector],​
    +    "anns_field": "dense",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2​
    +}​
    +request_1 = AnnSearchRequest(**search_param_1)​
    +​
    +query_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​
    +search_param_2 = {​
    +    "data": [query_sparse_vector],​
    +    "anns_field": "sparse",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2​
    +}​
    +request_2 = AnnSearchRequest(**search_param_2)​
    +​
    +reqs = [request_1, request_2]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.AnnSearchReq;​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +​
    +float[] dense = new float[]{-0.0475336798f,  0.0521207601f,  0.0904406682f, ...};​
    +SortedMap<Long, Float> sparse = new TreeMap<Long, Float>() {{​
    +    put(3573L, 0.34701499f);​
    +    put(5263L, 0.263937551f);​
    +    ...​
    +}};​
    +​
    +​
    +List<BaseVector> queryDenseVectors = Collections.singletonList(new FloatVec(dense));​
    +List<BaseVector> querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​
    +​
    +List<AnnSearchReq> searchRequests = new ArrayList<>();​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("dense")​
    +        .vectors(queryDenseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"nprobe\": 10}")​
    +        .topK(2)​
    +        .build());​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("sparse")​
    +        .vectors(querySparseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"drop_ratio_build\": 0.2}")​
    +        .topK(2)​
    +        .build());​
    +
    +
    +
    const search_param_1 = {​
    +    "data": query_vector, ​
    +    "anns_field": "dense", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +​
    +const search_param_2 = {​
    +    "data": query_sparse_vector, ​
    +    "anns_field": "sparse", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +
    +
    +
    export req='[​
    +    {​
    +        "data": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​
    +        "annsField": "dense",​
    +        "params": {​
    +            "params": {​
    +                "nprobe": 10​
    +             }​
    +        },​
    +        "limit": 2​
    +    },​
    +    {​
    +        "data": [{"3573": 0.34701499565746674}, {"5263": 0.2639375518635271}],​
    +        "annsField": "sparse",​
    +        "params": {​
    +            "params": {​
    +                "drop_ratio_build": 0.2​
    +             }​
    +        },​
    +        "limit": 2​
    +    }​
    + ]'​
    +
    +
    +

    نظرًا لأن المعلمة limit مضبوطة على 2، فإن كل AnnSearchRequest يُرجع نتيجتي بحث. في هذا المثال، يتم إنشاء 2 AnnSearchRequest ، وبالتالي سيتم إرجاع إجمالي 4 نتائج بحث.

    +

    تكوين استراتيجية إعادة الترتيب

    لدمج وإعادة ترتيب مجموعتي نتائج بحث الشبكة النشطة ANN، من الضروري تحديد استراتيجية إعادة ترتيب مناسبة. يدعم Zilliz نوعين من استراتيجية إعادة الترتيب: استراتيجية إعادة الترتيب الموزونة واستراتيجية إعادة الترتيب RRFRanker. عند اختيار إستراتيجية إعادة الترتيب، من الأمور التي يجب أخذها بعين الاعتبار ما إذا كان هناك أي تركيز على بحث واحد أو أكثر من البحث الأساسي للشبكة العصبية الاصطناعية على حقول المتجهات.

    +
      +
    • مُرجِّح الرتبة: يوصى باستخدام هذه الاستراتيجية إذا كنت تريد أن تركز النتائج على حقل متجه معين. تسمح لك أداة WeightedRanker المرجحة بتعيين أوزان أعلى لحقول متجهة معينة، والتركيز عليها بشكل أكبر. على سبيل المثال، في عمليات البحث متعدد الوسائط، يمكن اعتبار الأوصاف النصية لصورة ما أكثر أهمية من الألوان في هذه الصورة.

    • +
    • RRFRanker (مصنف دمج الرتب المتبادل): يوصى بهذه الاستراتيجية عندما لا يكون هناك تركيز محدد. يمكن لـ RRRF موازنة أهمية كل حقل متجه بشكل فعال.

    • +
    +

    لمزيد من التفاصيل حول آليات هاتين الاستراتيجيتين لإعادة التصنيف، راجع إعادة التصنيف.

    +

    يشرح المثالان التاليان كيفية استخدام استراتيجيتي إعادة الترتيب المرجحة وRRRFRanker.

    +
      +
    1. مثال 1: استخدام أداة إعادة الترتيب المرجحة

      +

      عند استخدام إستراتيجية WeightedRanker المرجحة، تحتاج إلى إدخال قيم الوزن في الدالة WeightedRanker. يتوافق عدد عمليات البحث الأساسية للشبكة العصبية الاصطناعية في البحث الهجين مع عدد القيم التي يجب إدخالها. يجب أن تكون قيم المدخلات في النطاق [0،1]، حيث تشير القيم الأقرب إلى 1 إلى أهمية أكبر.

      +

      +
      from pymilvus import WeightedRanker​
      +​
      +rerank= WeightedRanker(0.8, 0.3) ​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.WeightedRanker;​
      +​
      +BaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = WeightedRanker(0.8, 0.3);​
      +
      +
      +
      export rerank='{​
      +        "strategy": "ws",​
      +        "params": {"weights": [0.8,0.3]}​
      +    }'​
      +
      +
    2. +
    3. مثال 2: استخدام RRFRFRanker

      +

      عند استخدام استراتيجية RRFRFRanker، تحتاج إلى إدخال قيمة المعلمة k في RRFRanker. القيمة الافتراضية لـ k هي 60. تساعد هذه المعلمة في تحديد كيفية دمج الرتب من مختلف عمليات بحث الشبكة العنكبوتية الوطنية، بهدف موازنة ومزج الأهمية في جميع عمليات البحث.

      +

      +
      from pymilvus import RRFRanker​
      +​
      +ranker = RRFRanker(100)​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.RRFRanker;​
      +​
      +BaseRanker reranker = new RRFRanker(100);​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = RRFRanker("100");​
      +
      +
      +
      export rerank='{​
      +        "strategy": "rrf",​
      +        "params": { "k": 100}​
      +    }'​
      +
      +
    4. +
    +

    إجراء بحث هجين

    قبل إجراء بحث مختلط، من الضروري تحميل المجموعة في الذاكرة. إذا لم يكن لأي حقول متجهة في المجموعة فهرس أو لم يتم تحميلها، سيحدث خطأ عند استدعاء طريقة البحث الهجين.

    + +
    from pymilvus import MilvusClient​
    +​
    +res = client.hybrid_search(​
    +    collection_name="hybrid_search_collection",​
    +    reqs=reqs,​
    +    ranker=ranker,​
    +    limit=2​
    +)​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.HybridSearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +HybridSearchReq hybridSearchReq = HybridSearchReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .searchRequests(searchRequests)​
    +        .ranker(reranker)​
    +        .topK(2)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.hybridSearch(hybridSearchReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.loadCollection({​
    +    collection_name: "hybrid_search_collection"​
    +})​
    +​
    +import { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​
    +​
    +const search = await client.search({​
    +  collection_name: "hybrid_search_collection",​
    +  data: [search_param_1, search_param_2],​
    +  limit: 2,​
    +  rerank: RRFRanker(100)​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"search\": ${req},​
    +    \"rerank\": {​
    +        \"strategy\":\"rrf\",​
    +        \"params\": {​
    +            \"k\": 10​
    +        }​
    +    },​
    +    \"limit\": 3,​
    +    \"outputFields\": [​
    +        \"user_id\",​
    +        \"word_count\",​
    +        \"book_describe\"​
    +    ]​
    +}"​
    +
    +
    +

    فيما يلي الإخراج.

    +
    ["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]​
    +
    +
    +

    نظرًا لأنه تم تحديد limit=2 في البحث الهجين، سيعيد Zilliz ترتيب نتائج البحث الأربعة من الخطوة 3 ويعيد في النهاية نتائج البحث الأكثر تشابهًا فقط.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.json new file mode 100644 index 000000000..6a361312d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={​\n # highlight-start​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n # highlight-end​\n }​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"radius\", 0.4);​\nextraParams.put(\"range_filter\", 0.6);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"range_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .searchParams(extraParams)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​\n\n","// TODO ​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"range_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n params: {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"searchParams\": {​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n }​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n"],"headingContent":"Range Search​","anchorList":[{"label":"بحث النطاق","href":"Range-Search​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"أمثلة","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.md new file mode 100644 index 000000000..0c95b3403 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/range-search.md @@ -0,0 +1,213 @@ +--- +id: range-search.md +summary: >- + يعمل البحث في النطاق على تحسين ملاءمة نتائج البحث من خلال تقييد المسافة أو + درجة الكيانات التي تم إرجاعها ضمن نطاق محدد. تساعدك هذه الصفحة على فهم ما هو + بحث النطاق وإجراءات إجراء بحث النطاق. +title: البحث عن النطاق +--- +

    بحث النطاق

    يعمل البحث في النطاق على تحسين ملاءمة نتائج البحث من خلال تقييد المسافة أو درجة الكيانات التي تم إرجاعها ضمن نطاق محدد. تساعدك هذه الصفحة على فهم ماهية بحث النطاق وإجراءات إجراء بحث النطاق.

    +

    نظرة عامة

    عند تنفيذ طلب البحث عن النطاق، يستخدم ميلفوس المتجهات الأكثر تشابهًا مع متجه الاستعلام من نتائج بحث النطاق كمركز، مع تحديد نصف القطر المحدد في طلب البحث كنصف قطر الدائرة الخارجية، وفلتر_النطاق_نصف قطر الدائرة الداخلية لرسم دائرتين متحدتي المركز. سيتم إرجاع جميع المتجهات ذات درجات التشابه التي تقع داخل المنطقة الحلقية التي تشكلها هاتان الدائرتان متحدة المركز. هنا، يمكن ضبط range_filter على مما يشير إلى أنه سيتم إرجاع جميع الكيانات التي تقع ضمن درجة التشابه المحددة (نصف القطر).

    +

    + + Range search + بحث النطاق

    +

    يوضح الرسم البياني أعلاه أن طلب البحث عن النطاق يحمل معلمتين: نصف القطر و range_filter. عند تلقي طلب بحث النطاق، يقوم ميلفوس بما يلي.

    +
      +
    • استخدام نوع المقياس المحدد(COSINE) للعثور على جميع تضمينات المتجهات الأكثر تشابهًا مع متجه الاستعلام.

    • +
    • تصفية التضمينات المتجهة التي تقع مسافاتها أو درجاتها إلى متجه الاستعلام ضمن النطاق المحدد بواسطة معلمات نصف القطر و range_filter.

    • +
    • إرجاع الكيانات الأعلى K من الكيانات التي تمت تصفيتها.

    • +
    +

    تختلف طريقة تعيين نصف القطر و range_filter_filter باختلاف نوع مقياس البحث. يسرد الجدول التالي متطلبات تعيين هاتين المعلمتين مع أنواع المقاييس المختلفة.

    +

    نوع المتري

    +

    الدلالات

    +

    متطلبات تعيين نصف القطر و range_filter_filter

    +

    L2

    +

    تشير المسافة L2 الأصغر إلى تشابه أعلى.

    +

    لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن

    +

    range_filter <= المسافة < radius

    +

    IP

    +

    تشير مسافة IP الأكبر إلى تشابه أعلى.

    +

    لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن

    +

    radius << المسافة <= range_filter

    +

    COSINE

    +

    تشير مسافة COSINE الأكبر إلى تشابه أعلى.

    +

    لتجاهل أكثر تضمينات المتجهات تشابهًا، تأكد من أن

    +

    radius <المسافة <= range_filter

    +

    JACCARD

    +

    تشير مسافة جاكارد الأصغر إلى تشابه أعلى.

    +

    +

    لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن

    +

    range_filter <= المسافة < radius

    +

    HAMMING

    +

    تشير مسافة هامينج الأصغر إلى تشابه أعلى.

    +

    لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن

    +

    range_filter <= المسافة < radius

    +
    +

    أمثلة

    يوضح هذا القسم كيفية إجراء بحث في النطاق. لا تحمل طلبات البحث في مقتطفات التعليمات البرمجية التالية نوع متري، مما يشير إلى تطبيق نوع المتري الافتراضي COSINE. في هذه الحالة، تأكد من أن قيمة نصف القطر أصغر من قيمة range_filter.

    +

    في مقتطفات التعليمات البرمجية التالية، قم بتعيين radius إلى 0.4 و range_filter إلى 0.6 بحيث يُرجع Milvus جميع الكيانات التي تقع مسافاتها أو درجاتها إلى متجه الاستعلام في حدود 0.4 إلى 0.6.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={​
    +        # highlight-start​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +        # highlight-end​
    +    }​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    + io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("radius", 0.4);​
    +extraParams.put("range_filter", 0.6);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("range_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .searchParams(extraParams)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​
    +
    +
    +
    // TODO ​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "range_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    params: {​
    +        "radius": 0.4,​
    +        "range_filter": 0.6​
    +    }​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "searchParams": {​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +    }​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.json new file mode 100644 index 000000000..f3652f5a3 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import WeightedRanker\n\n# Use WeightedRanker to combine results with specified weights\nrerank = WeightedRanker(0.8, 0.8, 0.7) \n","from pymilvus import RRFRanker\n\n# Default k value is 60\nranker = RRFRanker()\n\n# Or specify k value\nranker = RRFRanker(k=100)\n"],"headingContent":"Reranking","anchorList":[{"label":"إعادة الترتيب","href":"Reranking","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"الدرجات المرجحة (WeightedRanker)","href":"Weighted-Scoring-WeightedRanker","type":2,"isActive":false},{"label":"دمج الرتب المتبادل (RRFRanker)","href":"Reciprocal-Rank-Fusion-RRFRanker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.md new file mode 100644 index 000000000..696f9dfb0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/reranking.md @@ -0,0 +1,122 @@ +--- +id: reranking.md +summary: >- + يغطي هذا الموضوع عملية إعادة الترتيب، مع شرح أهميتها وتنفيذ طريقتين لإعادة + الترتيب. +title: إعادة الترتيب +--- +

    إعادة الترتيب

    يتيح Milvus إمكانات البحث المختلط باستخدام واجهة برمجة التطبيقات hybrid_search() ، التي تتضمن استراتيجيات إعادة ترتيب متطورة لتحسين نتائج البحث من مثيلات AnnSearchRequest متعددة. يغطي هذا الموضوع عملية إعادة التصنيف، ويشرح أهميتها وتنفيذ استراتيجيات إعادة التصنيف المختلفة في ملفوس.

    +

    نظرة عامة

    يوضح الشكل التالي تنفيذ البحث الهجين في ملفوس ويبرز دور إعادة الترتيب في العملية.

    +

    reranking_process

    +

    تُعد إعادة الترتيب في البحث الهجين خطوة حاسمة تدمج النتائج من عدة حقول متجهة، مما يضمن أن يكون الناتج النهائي ملائمًا ومحدد الأولويات بدقة. يقدم ميلفوس حاليًا استراتيجيات إعادة الترتيب هذه:

    +
      +
    • WeightedRanker: يدمج هذا النهج النتائج عن طريق حساب متوسط مرجح للنتائج (أو مسافات المتجهات) من عمليات بحث متجهات مختلفة. ويقوم بتعيين أوزان بناءً على أهمية كل حقل متجه.

    • +
    • RRFRanker: تجمع هذه الاستراتيجية بين النتائج بناءً على رتبها عبر أعمدة المتجهات المختلفة.

    • +
    +

    الدرجات المرجحة (WeightedRanker)

    تقوم إستراتيجية WeightedRanker بتعيين أوزان مختلفة للنتائج من كل مسار استرجاع متجه بناءً على أهمية كل حقل متجه. يتم تطبيق إستراتيجية إعادة الترتيب هذه عندما تختلف أهمية كل حقل متجه، مما يسمح لك بالتركيز على حقول متجهات معينة على غيرها من خلال تعيين أوزان أعلى لها. على سبيل المثال، في بحث متعدد الوسائط، يمكن اعتبار الوصف النصي أكثر أهمية من توزيع الألوان في الصور.

    +

    تتم العملية الأساسية لـ WeightedRanker على النحو التالي:

    +
      +
    • جمع الدرجات أثناء الاسترجاع: جمع النتائج ودرجاتها من مسارات استرجاع المتجهات المختلفة.

    • +
    • تطبيع النتائج: تطبيع الدرجات من كل مسار إلى نطاق [0،1]، حيث تشير القيم الأقرب إلى 1 إلى أهمية أعلى. يعد هذا التطبيع أمرًا بالغ الأهمية نظرًا لاختلاف توزيعات الدرجات باختلاف أنواع المقاييس. على سبيل المثال، تتراوح المسافة لبروتوكول الإنترنت من [- ∞، + ∞]، بينما تتراوح المسافة لـ L2 من [0، + ∞]. يستخدم ميلفوس الدالة arctan ، ويحول القيم إلى النطاق [0،1] لتوفير أساس موحد لأنواع المقاييس المختلفة.

      +

      arctan-function

    • +
    • تخصيص الوزن: تعيين وزن w𝑖 لكل مسار استرجاع المتجهات. يقوم المستخدمون بتحديد الأوزان التي تعكس موثوقية مصدر البيانات أو دقته أو المقاييس الأخرى ذات الصلة. يتراوح كل وزن من [0،1].

    • +
    • دمج النقاط: حساب متوسط مرجح للدرجات الموزونة لاشتقاق الدرجة النهائية. يتم بعد ذلك ترتيب النتائج بناءً على هذه الدرجات من الأعلى إلى الأدنى لتوليد النتائج النهائية المصنفة.

    • +
    +

    + + weighted-reranker + الموزون الموزون الموزون

    +

    لاستخدام هذه الإستراتيجية، قم بتطبيق مثيل WeightedRanker وقم بتعيين قيم الترجيح عن طريق تمرير عدد متغير من الوسيطات الرقمية.

    +
    from pymilvus import WeightedRanker
    +
    +# Use WeightedRanker to combine results with specified weights
    +rerank = WeightedRanker(0.8, 0.8, 0.7) 
    +
    +

    لاحظ أن:

    +
      +
    • تتراوح كل قيمة ترجيحية من 0 (الأقل أهمية) إلى 1 (الأكثر أهمية)، مما يؤثر على النتيجة المجمعة النهائية.

    • +
    • يجب أن يكون العدد الإجمالي لقيم الترجيح المقدمة في WeightedRanker مساويًا لعدد مثيلات AnnSearchRequest التي قمت بإنشائها سابقًا.

    • +
    • تجدر الإشارة إلى أنه نظرًا لاختلاف قياسات أنواع المقاييس المختلفة، فإننا نقوم بتطبيع مسافات نتائج الاستدعاء بحيث تقع في الفترة [0،1]، حيث يعني الرقم 0 اختلافًا و1 تشابهًا. ستكون النتيجة النهائية هي مجموع قيم الترجيح والمسافات.

    • +
    +

    دمج الرتب المتبادل (RRFRanker)

    RRRF هي طريقة دمج البيانات التي تجمع بين قوائم الترتيب بناءً على مقلوب رتبها. إنها طريقة فعالة لموازنة تأثير كل حقل متجه، خاصةً عندما لا يكون هناك أسبقية واضحة للأهمية. تُستخدم هذه الاستراتيجية عادةً عندما ترغب في إعطاء اعتبار متساوٍ لجميع الحقول المتجهة أو عندما يكون هناك عدم يقين بشأن الأهمية النسبية لكل حقل.

    +

    وتتم العملية الأساسية لـ RRF على النحو التالي:

    +
      +
    • جمع التصنيفات أثناء الاسترجاع: تقوم المسترجعات عبر حقول متجهات متعددة باسترجاع النتائج وفرزها.

    • +
    • دمج الرتب: تقوم خوارزمية RRF بموازنة ودمج الرتب من كل مسترجع. الصيغة كالتالي:

      +

      + + rrf-ranker + RRF-ranker

      +

      هنا، ع يمثل عدد مسارات الاسترجاع المختلفة، ورتبة ت(ف) هي موضع رتبة المستند المسترجع ف بواسطة المسترجع ت، وك هو معامل تنعيم، وعادةً ما يتم تعيينه إلى 60.

    • +
    • الترتيب الشامل: إعادة ترتيب النتائج المسترجعة بناءً على الدرجات المجمعة للحصول على النتائج النهائية.

    • +
    +

    لاستخدام هذه الاستراتيجية، قم بتطبيق مثيل RRFRanker.

    +
    from pymilvus import RRFRanker
    +
    +# Default k value is 60
    +ranker = RRFRanker()
    +
    +# Or specify k value
    +ranker = RRFRanker(k=100)
    +
    +

    يسمح RRRF بموازنة التأثير عبر الحقول دون تحديد أوزان صريحة. سيتم إعطاء الأولوية لأفضل التطابقات المتفق عليها من قبل الحقول المتعددة في الترتيب النهائي.

    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.json new file mode 100644 index 000000000..5866265bf --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n anns_field=\"vector\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"}​\n)​\n​\nfor hits in res:​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 7. Search with multiple vectors​\n# 7.1. Prepare query vectors​\nquery_vectors = [​\n [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​\n [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​\n]​\n​\n# 7.2. Start search​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# Output​\n#​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ],​\n# [​\n# {​\n# \"id\": 730,​\n# \"distance\": 0.04431751370429993,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 333,​\n# \"distance\": 0.04231833666563034,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 232,​\n# \"distance\": 0.04221535101532936,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nList queryVectors = Arrays.asList(​\n new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​\n new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​\n);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(queryVectors)​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​\n// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​\n// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​\n// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​\n\n","// 7. Search with multiple vectors​\nconst query_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n vectors: query_vectors,​\n limit: 5,​\n})​\n​\nconsole.log(res.results)​\n​\n// Output​\n// ​\n// [​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ],​\n// [​\n// { score: 0.04431751370429993, id: '730' },​\n// { score: 0.04231833666563034, id: '333' },​\n// { score: 0.04221535101532936, id: '232' },​\n// ]​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ],​\n# [​\n# {​\n# \"distance\": 0.04431751370429993,​\n# \"id\": 730​\n# },​\n# {​\n# \"distance\": 0.04231833666563034,​\n# \"id\": 333​\n# },​\n# {​\n# \"distance\": 0.04221535101532936,​\n# \"id\": 232​\n# }​\n# ]​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n data=[query_vector],​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​\n// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​\n// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_names: [\"partitionA\"],​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"],​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-next-line​\n output_fields=[\"color\"]​\n)​\n​\nprint(res)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {​\n# \"color\": \"orange_6781\"​\n# }​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {​\n# \"color\": \"red_4794\"​\n# }​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {​\n# \"color\": \"grey_8510\"​\n# }​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n // highlight-next-line​\n output_fields: [\"color\"]​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551', entity: {\"color\": \"orange_6781\"}},​\n// { score: 0.0800950899720192, id: '296' entity: {\"color\": \"red_4794\"}},​\n// { score: 0.07794742286205292, id: '43' entity: {\"color\": \"grey_8510\"}}​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551,​\n# \"color\": \"orange_6781\"​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296,​\n# \"color\": \"red_4794\"​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# \"color\": \"grey_8510\"​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={​\n \"metric_type\": \"IP\", ​\n # highlight-next-line​\n \"offset\": 10 # The records to skip​\n }​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .offset(10)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​\n// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​\n// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return,​\n // highlight-next-line​\n offset: 10 // The record to skip.​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"offset\": 10​\n}'​\n\n"],"headingContent":"Ba​sic ANN Search","anchorList":[{"label":"بحث ANN الأساسي","href":"Ba​sic-ANN-Search","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"البحث أحادي المتجه","href":"Single-Vector-Search​","type":2,"isActive":false},{"label":"البحث في المتجهات المجمعة","href":"Bulk-Vector-Search​","type":2,"isActive":false},{"label":"ANN البحث في التقسيم","href":"ANN-Search-in-Partition​","type":2,"isActive":false},{"label":"استخدام حقول المخرجات","href":"Use-Output-Fields​","type":2,"isActive":false},{"label":"استخدام الحد والإزاحة","href":"Use-Limit-and-Offset​","type":2,"isActive":false},{"label":"تعزيز البحث في الشبكة العصبية الاصطناعية","href":"Enhancing-ANN-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.md new file mode 100644 index 000000000..8fa054021 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/single-vector-search.md @@ -0,0 +1,919 @@ +--- +id: single-vector-search.md +order: 1 +summary: >- + توضح هذه المقالة كيفية البحث عن المتجهات في مجموعة ميلفوس باستخدام متجه + استعلام واحد. +title: بحث ANN الأساسي +--- +

    بحث ANN الأساسي

    استنادًا إلى ملف الفهرس الذي يسجل الترتيب المصنّف لتضمينات المتجهات، يحدد البحث التقريبي لأقرب جار (ANN) مجموعة فرعية من تضمينات المتجهات استنادًا إلى متجه الاستعلام المنقول في طلب البحث المستلم، ويقارن متجه الاستعلام مع تلك الموجودة في المجموعة الفرعية، ويعيد النتائج الأكثر تشابهًا. مع البحث باستخدام ANN، يوفر ميلفوس تجربة بحث فعالة. تساعدك هذه الصفحة على تعلم كيفية إجراء عمليات البحث الأساسية للشبكات النانوية الاصطناعية.

    +

    نظرة عامة

    يعتبر بحث ANN وبحث k-Nearest Neighbours (kNN) هما الطريقتان المعتادتان في عمليات البحث عن تشابه المتجهات. في بحث kNN، يجب مقارنة جميع المتجهات في فضاء المتجهات مع متجه الاستعلام المحمول في طلب البحث قبل معرفة أكثرها تشابهًا، وهو ما يستغرق وقتًا طويلاً ويستهلك الكثير من الموارد.

    +

    على عكس عمليات بحث kNN، تطلب خوارزمية بحث الشبكة العصبية الاصطناعية ملف فهرس يسجل الترتيب المصنف لتضمينات المتجهات. عند ورود طلب بحث، يمكنك استخدام ملف الفهرس كمرجع لتحديد موقع مجموعة فرعية تحتوي على الأرجح على تضمينات متجهات أكثر تشابهًا مع متجه الاستعلام بسرعة. بعد ذلك، يمكنك استخدام نوع المقياس المحدد لقياس التشابه بين متجه الاستعلام وتلك الموجودة في المجموعة الفرعية، وفرز أعضاء المجموعة بناءً على التشابه مع متجه الاستعلام، ومعرفة أعضاء المجموعة الأعلى K.

    +

    تعتمد عمليات بحث ANN على فهارس مبنية مسبقًا، وقد يختلف إنتاجية البحث واستخدام الذاكرة وصحة البحث باختلاف أنواع الفهارس التي تختارها. تحتاج إلى الموازنة بين أداء البحث وصحة البحث.

    +

    ولتقليل منحنى التعلم، يوفر Milvus الفهرس التلقائي. باستخدام AUTOINDEX، يمكن ل Milvus تحليل توزيع البيانات داخل مجموعتك أثناء إنشاء الفهرس وتعيين معلمات الفهرس الأكثر تحسينًا استنادًا إلى التحليل لتحقيق التوازن بين أداء البحث وصحته.

    +

    للحصول على تفاصيل حول AUTOINDEX وأنواع المقاييس المطبقة، راجع AUTOINDEX وأنواع المقاييس. ستجد في هذا القسم معلومات مفصلة حول المواضيع التالية.

    + +

    البحث أحادي المتجه

    في عمليات بحث ANN، يشير البحث أحادي المتجه إلى بحث يتضمن متجه استعلام واحد فقط. استنادًا إلى الفهرس الذي تم إنشاؤه مسبقًا ونوع المقياس الموجود في طلب البحث، سيجد ميلفوس المتجهات الأكثر تشابهًا مع متجه الاستعلام.

    +

    في هذا القسم، ستتعلم في هذا القسم كيفية إجراء بحث من متجه واحد. يفترض مقتطف الشيفرة أنك قمت بإنشاء مجموعة بطريقة الإعداد السريع. يحمل طلب البحث متجه استعلام واحد ويطلب من ميلفوس استخدام الضرب الداخلي (IP) لحساب التشابه بين متجهات الاستعلام والمتجهات في المجموعة وإرجاع أكثر ثلاثة متجهات متشابهة.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    anns_field="vector",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"}​
    +)​
    +​
    +for hits in res:​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +    ​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,             // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    يصنف Milvus نتائج البحث حسب درجات تشابهها مع متجه الاستعلام بترتيب تنازلي. يُطلق على درجة التشابه أيضًا المسافة إلى متجه الاستعلام، وتختلف نطاقات قيمتها باختلاف أنواع المقاييس المستخدمة.

    +

    يسرد الجدول التالي أنواع المقاييس القابلة للتطبيق ونطاقات المسافة المقابلة.

    +

    نوع المقياس

    +

    الخصائص

    +

    نطاق المسافة

    +

    L2

    +

    تشير القيمة الأصغر إلى تشابه أعلى.

    +

    [0, ∞)

    +

    IP

    +

    تشير القيمة الأكبر إلى تشابه أعلى.

    +

    [-1, 1]

    +

    COSINE

    +

    تشير القيمة الأكبر إلى تشابه أعلى.

    +

    [-1, 1]

    +

    JACCARD

    +

    تشير القيمة الأصغر إلى تشابه أعلى.

    +

    [0, 1]

    +

    HAMMING

    +

    تشير القيمة الأصغر إلى تشابه أعلى.

    +

    [0، خافت (متجه)]

    +
    +

    البحث في المتجهات المجمعة

    وبالمثل، يمكنك تضمين عدة متجهات استعلام في طلب البحث. سيُجري ميلفوس عمليات بحث ANN عن متجهات الاستعلام بالتوازي ويعيد مجموعتين من النتائج.

    + +
    # 7. Search with multiple vectors​
    +# 7.1. Prepare query vectors​
    +query_vectors = [​
    +    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​
    +    [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​
    +]​
    +​
    +# 7.2. Start search​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# Output​
    +#​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ],​
    +#     [​
    +#         {​
    +#             "id": 730,​
    +#             "distance": 0.04431751370429993,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 333,​
    +#             "distance": 0.04231833666563034,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 232,​
    +#             "distance": 0.04221535101532936,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +List<BaseVector> queryVectors = Arrays.asList(​
    +        new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​
    +        new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​
    +);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(queryVectors)​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​
    +// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​
    +// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​
    +// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​
    +
    +
    +
    // 7. Search with multiple vectors​
    +const query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​
    +    [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    vectors: query_vectors,​
    +    limit: 5,​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// Output​
    +// ​
    +// [​
    +//   [​
    +//     { score: 0.08821295201778412, id: '551' },​
    +//     { score: 0.0800950899720192, id: '296' },​
    +//     { score: 0.07794742286205292, id: '43' }​
    +//   ],​
    +//   [​
    +//     { score: 0.04431751370429993, id: '730' },​
    +//     { score: 0.04231833666563034, id: '333' },​
    +//     { score: 0.04221535101532936, id: '232' },​
    +//   ]​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +        [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         [​
    +#           {​
    +#               "distance": 0.08821295201778412,​
    +#               "id": 551​
    +#           },​
    +#           {​
    +#               "distance": 0.0800950899720192,​
    +#               "id": 296​
    +#           },​
    +#           {​
    +#               "distance": 0.07794742286205292,​
    +#               "id": 43​
    +#           }​
    +#         ],​
    +#         [​
    +#           {​
    +#               "distance": 0.04431751370429993,​
    +#               "id": 730​
    +#           },​
    +#           {​
    +#               "distance": 0.04231833666563034,​
    +#               "id": 333​
    +#           },​
    +#           {​
    +#               "distance": 0.04221535101532936,​
    +#               "id": 232​
    +#           }​
    +#        ]​
    +#     ]​
    +# }​
    +
    +
    +

    ANN البحث في التقسيم

    لنفترض أنك قمت بإنشاء أقسام متعددة في مجموعة، ويمكنك تضييق نطاق البحث إلى عدد محدد من الأقسام. في هذه الحالة، يمكنك تضمين أسماء الأقسام المستهدفة في طلب البحث لتقييد نطاق البحث ضمن الأقسام المحددة. يؤدي تقليل عدد الأقسام المتضمنة في البحث إلى تحسين أداء البحث.

    +

    يفترض مقتطف الشيفرة التالي وجود قسم باسم PartitionA في مجموعتك.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    data=[query_vector],​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​
    +// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​
    +// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_names: ["partitionA"],​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"],​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    استخدام حقول المخرجات

    في نتيجة البحث، يتضمن Milvus قيم الحقول الأساسية ومسافات/درجات التشابه للكيانات التي تحتوي على تضمينات متجه K الأعلى افتراضيًا. يمكنك تضمين أسماء الحقول المستهدفة في طلب البحث كحقول مخرجات لجعل نتائج البحث تحمل قيم الحقول الأخرى في هذه الكيانات.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-next-line​
    +    output_fields=["color"]​
    +)​
    +​
    +print(res)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {​
    +#                 "color": "orange_6781"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {​
    +#                 "color": "red_4794"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {​
    +#                 "color": "grey_8510"​
    +#             }​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +    // highlight-next-line​
    +    output_fields: ["color"]​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551', entity: {"color": "orange_6781"}},​
    +//   { score: 0.0800950899720192, id: '296' entity: {"color": "red_4794"}},​
    +//   { score: 0.07794742286205292, id: '43' entity: {"color": "grey_8510"}}​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551,​
    +#             "color": "orange_6781"​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296,​
    +#             "color": "red_4794"​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#             "color": "grey_8510"​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    استخدام الحد والإزاحة

    قد تلاحظ أن المعلمة limit التي يتم حملها في طلبات البحث تحدد عدد الكيانات المراد تضمينها في نتائج البحث. تحدد هذه المعلمة الحد الأقصى لعدد الكيانات المراد إرجاعها في بحث واحد، وعادةً ما يُطلق عليها الحد الأعلى-ك.

    +

    إذا كنت ترغب في إجراء استعلامات مرقمة، يمكنك استخدام حلقة لإرسال طلبات بحث متعددة، مع معلمي الحد والإزاحة المنقولين في كل طلب استعلام. على وجه التحديد، يمكنك تعيين معلمة الحد إلى عدد الكيانات التي تريد تضمينها في نتائج الاستعلام الحالية، وتعيين الإزاحة إلى إجمالي عدد الكيانات التي تم إرجاعها بالفعل.

    +

    يوضح الجدول أدناه كيفية تعيين معلمات الحد والإزاحة للاستعلامات المرقمة عند إرجاع 100 كيان في المرة الواحدة.

    +

    الاستعلامات

    +

    الكيانات المراد إرجاعها لكل استعلام

    +

    الكيانات التي تم إرجاعها بالفعل في المجموع

    +

    الاستعلام الأول

    +

    100

    +

    0

    +

    الاستعلام الثاني

    +

    100

    +

    100

    +

    الاستعلام الثالث

    +

    100

    +

    200

    +

    الاستعلام التاسع

    +

    100

    +

    100 × (ن-1)

    +
    +

    لاحظ أنه، يجب أن يكون مجموع limit و offset في بحث واحد لشبكة ANN أقل من 16,384.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={​
    +        "metric_type": "IP", ​
    +        # highlight-next-line​
    +        "offset": 10 # The records to skip​
    +    }​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .offset(10)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​
    +// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​
    +// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return,​
    +    // highlight-next-line​
    +    offset: 10 // The record to skip.​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "offset": 10​
    +}'​
    +
    +
    +

    تعزيز البحث في الشبكة العصبية الاصطناعية

    يعمل نظام AUTOINDEX على تسطيح منحنى التعلّم لعمليات بحث الشبكة العصبية الاصطناعية إلى حد كبير. ومع ذلك، قد لا تكون نتائج البحث صحيحة دائمًا مع زيادة أعلى K. من خلال تقليل نطاق البحث، وتحسين ملاءمة نتائج البحث، وتنويع نتائج البحث، يعمل ميلفوس على تحسينات البحث التالية.

    +
      +
    • البحث المصفى

      +

      يمكنك تضمين شروط التصفية في طلب البحث بحيث يقوم ميلفوس بإجراء تصفية للبيانات الوصفية قبل إجراء عمليات بحث ANN، مما يقلل نطاق البحث من المجموعة بأكملها إلى الكيانات المطابقة لشروط التصفية المحددة فقط.

      +

      لمعرفة المزيد حول تصفية البيانات الوصفية وشروط التصفية، راجع البحث المصفى وتصفية البيانات الوصفية.

    • +
    • نطاق البحث

      +

      يمكنك تحسين ملاءمة نتائج البحث عن طريق تقييد مسافة أو درجة الكيانات التي تم إرجاعها ضمن نطاق محدد. في ميلفوس، يتضمن البحث في النطاق رسم دائرتين متحدتي المركز مع تضمين المتجه الأكثر تشابهًا مع متجه الاستعلام كمركز. يحدد طلب البحث نصف قطر كلتا الدائرتين، ويعيد ميلفوس جميع التضمينات المتجهة التي تقع ضمن الدائرة الخارجية وليس الدائرة الداخلية.

      +

      لمعرفة المزيد حول بحث النطاق، راجع بحث النطاق.

    • +
    • بحث التجميع

      +

      إذا كانت الكيانات التي تم إرجاعها تحمل نفس القيمة في حقل معين، فقد لا تمثل نتائج البحث توزيع جميع التضمينات المتجهة في الفضاء المتجه. لتنويع نتائج البحث، فكر في استخدام بحث التجميع.

      +

      لمعرفة المزيد حول بحث التجميع، راجع بحث التجميع.

    • +
    • البحث المختلط

      +

      يمكن أن تتضمن المجموعة ما يصل إلى أربعة حقول متجهة لحفظ التضمينات المتجهة التي تم إنشاؤها باستخدام نماذج تضمين مختلفة. من خلال القيام بذلك، يمكنك استخدام بحث مختلط لإعادة ترتيب نتائج البحث من هذه الحقول المتجهة، مما يحسن معدل الاستدعاء.

      +

      لمعرفة المزيد حول البحث المختلط، راجع البحث المختلط.

    • +
    • مكرر البحث

      +

      يقوم بحث ANN واحد بإرجاع 16,384 كيانًا كحد أقصى. فكر في استخدام مكرر البحث إذا كنت بحاجة إلى إرجاع المزيد من الكيانات في بحث واحد.

      +

      للحصول على تفاصيل حول مكرر البحث، راجع مكرر البحث.

    • +
    • البحث بالنص الكامل

      +

      البحث بالنص الكامل هي ميزة تسترجع المستندات التي تحتوي على مصطلحات أو عبارات محددة في مجموعات البيانات النصية، ثم تقوم بترتيب النتائج بناءً على مدى الصلة. تتغلب هذه الميزة على قيود البحث الدلالي، التي قد تغفل المصطلحات الدقيقة، مما يضمن حصولك على النتائج الأكثر دقة وذات الصلة بالسياق. بالإضافة إلى ذلك، تعمل هذه الميزة على تبسيط عمليات البحث المتجهية من خلال قبول مدخلات النص الخام، وتحويل بياناتك النصية تلقائيًا إلى تضمينات متفرقة دون الحاجة إلى إنشاء تضمينات متجهة يدويًا.

      +

      للحصول على تفاصيل حول البحث في النص الكامل، راجع البحث في النص الكامل.

    • +
    • مطابقة النص

      +

      تتيح مطابقة النص في ميلفوس استرجاع المستندات بدقة بناءً على مصطلحات محددة. تُستخدم هذه الميزة في المقام الأول للبحث المصفى لاستيفاء شروط محددة ويمكنها دمج التصفية القياسية لتحسين نتائج الاستعلام، مما يسمح بالبحث عن التشابه داخل المتجهات التي تستوفي المعايير القياسية.

      +

      للحصول على تفاصيل حول مطابقة النص، راجع مطابقة النص.

    • +
    • استخدام مفتاح التقسيم

      +

      قد يؤثر تضمين حقول قياسية متعددة في تصفية البيانات الوصفية واستخدام شرط تصفية معقد نوعًا ما على كفاءة البحث. بمجرد تعيين حقل قياسي كمفتاح التقسيم واستخدام شرط تصفية يتضمن مفتاح التقسيم في طلب البحث، يمكن أن يساعد في تقييد نطاق البحث داخل الأقسام المطابقة لقيم مفتاح التقسيم المحددة.

      +

      للحصول على تفاصيل حول مفتاح القسم، راجع استخدام مفتاح القسم.

    • +
    • استخدام مفتاح التقسيم

      +

      في Milvus، تسمح الملفات المعينة بالذاكرة بتعيين مباشر لمحتويات الملفات في الذاكرة. تعمل هذه الميزة على تحسين كفاءة الذاكرة، خاصةً في الحالات التي تكون فيها الذاكرة المتوفرة نادرة ولكن تحميل البيانات بالكامل غير ممكن. يمكن لآلية التحسين هذه أن تزيد من سعة البيانات مع ضمان الأداء حتى حد معين؛ ومع ذلك، عندما يتجاوز حجم البيانات الذاكرة بقدر كبير، قد يعاني أداء البحث والاستعلام من تدهور خطير، لذا يرجى اختيار تشغيل هذه الميزة أو إيقاف تشغيلها حسب الاقتضاء.

      +

      للحصول على تفاصيل حول إعدادات mmap-settings، راجع استخدام mmap.

    • +
    • ضغط التجميع

      +

      تم تصميم ضغط التجميع لتحسين أداء البحث وتقليل التكاليف في المجموعات الكبيرة. سيساعدك هذا الدليل على فهم ضغط التجميع وكيف يمكن لهذه الميزة تحسين أداء البحث.

      +

      للحصول على تفاصيل حول ضغط التجميع، راجع ضغط التجميع.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.json new file mode 100644 index 000000000..3514afc6e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nschema = client.create_schema()​\n​\n# Add the partition key​\nschema.add_field(​\n field_name=\"my_varchar\", ​\n datatype=DataType.VARCHAR, ​\n max_length=512,​\n # highlight-next-line​\n is_partition_key=True,​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\n// Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// Add the partition key​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n // highlight-next-line​\n .isPartitionKey(true)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512,​\n // highlight-next-line​\n is_partition_key: true​\n }​\n]​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isPartitionKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next-line​\n num_partitions=1024​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n .numPartitions(1024)​\n .build();​\n client.createCollection(createCollectionReq);​\n\n","await client.create_collection({​\n collection_name: \"my_collection\",​\n schema: schema,​\n num_partitions: 1024​\n})​\n\n","export params='{​\n \"partitionsNum\": 1024​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"myCollection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# Filter based on a single partition key value, or​\nfilter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nfilter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","// Filter based on a single partition key value, or​\nString filter = \"partition_key == 'x' && \";​\n​\n// Filter based on multiple partition key values​\nString filter = \"partition_key in ['x', 'y', 'z'] && \";​\n\n","// Filter based on a single partition key value, or​\nconst filter = 'partition_key == \"x\" && '​\n​\n// Filter based on multiple partition key values​\nconst filter = 'partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","# Filter based on a single partition key value, or​\nexport filter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nexport filter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n"],"headingContent":"Use Partition Key​","anchorList":[{"label":"استخدام مفتاح التقسيم","href":"Use-Partition-Key​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"استخدام مفتاح التقسيم","href":"Use-Partition-Key​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.md new file mode 100644 index 000000000..285518135 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/use-partition-key.md @@ -0,0 +1,245 @@ +--- +id: use-partition-key.md +title: استخدام مفتاح التقسيم +--- +

    استخدام مفتاح التقسيم

    مفتاح التقسيم هو حل لتحسين البحث استناداً إلى الأقسام. من خلال تعيين حقل قياسي محدد كمفتاح التقسيم وتحديد شروط التصفية بناءً على مفتاح التقسيم أثناء البحث، يمكن تضييق نطاق البحث إلى عدة أقسام، وبالتالي تحسين كفاءة البحث. ستقدم هذه المقالة كيفية استخدام مفتاح التقسيم والاعتبارات ذات الصلة.

    +

    نظرة عامة

    في Milvus، يمكنك استخدام الأقسام لتنفيذ فصل البيانات وتحسين أداء البحث من خلال تقييد نطاق البحث إلى أقسام محددة. إذا اخترت إدارة الأقسام يدويًا، يمكنك إنشاء 1024 قسمًا كحد أقصى في مجموعة ما، وإدراج كيانات في هذه الأقسام استنادًا إلى قاعدة محددة بحيث يمكنك تضييق نطاق البحث عن طريق تقييد عمليات البحث ضمن عدد محدد من الأقسام.

    +

    يقدم لك Milvus مفتاح التقسيم لتتمكن من إعادة استخدام الأقسام في فصل البيانات للتغلب على الحد الأقصى لعدد الأقسام التي يمكنك إنشاؤها في مجموعة. عند إنشاء مجموعة، يمكنك استخدام حقل قياسي كمفتاح التقسيم. بمجرد أن تصبح المجموعة جاهزة، يقوم Milvus بإنشاء العدد المحدد من الأقسام داخل المجموعة مع كل قسم يتوافق مع نطاق من القيم الموجودة في مفتاح التقسيم. عند استلام الكيانات المدرجة، يقوم Milvus بتخزينها في أقسام مختلفة بناءً على قيم مفتاح التقسيم الخاصة بها.

    +

    + + Partition v.s. Partition Key + التقسيم مقابل مفتاح القسم

    +

    يوضح الشكل التالي كيفية معالجة Milvus لطلبات البحث في مجموعة مع تمكين ميزة مفتاح التقسيم أو بدونها.

    +
      +
    • في حالة تعطيل مفتاح التقسيم، يبحث Milvus عن الكيانات الأكثر تشابهًا مع متجه الاستعلام داخل المجموعة. يمكنك تضييق نطاق البحث إذا كنت تعرف أي قسم يحتوي على أكثر النتائج ذات الصلة.

    • +
    • إذا تم تمكين مفتاح التقسيم، يحدد Milvus نطاق البحث استناداً إلى قيمة مفتاح التقسيم المحددة في عامل تصفية البحث ويقوم بمسح الكيانات الموجودة داخل الأقسام التي تتطابق فقط.

    • +
    +

    + + With or Without Partition Key + باستخدام مفتاح التقسيم أو بدونه

    +

    استخدام مفتاح التقسيم

    لاستخدام مفتاح التقسيم، تحتاج إلى

    +
      +
    • تعيين مفتاح التقسيم.

    • +
    • تعيين عدد الأقسام المراد إنشاؤها (اختياري)، و

    • +
    • إنشاء شرط تصفية استناداً إلى مفتاح التقسيم.

    • +
    +

    تعيين مفتاح التقسيم

    لتعيين حقل قياسي كمفتاح التقسيم، تحتاج إلى تعيين السمة is_partition_key الخاصة به إلى true عند إضافة الحقل القياسي.

    + +
    from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +schema = client.create_schema()​
    +​
    +# Add the partition key​
    +schema.add_field(​
    +    field_name="my_varchar", ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=512,​
    +    # highlight-next-line​
    +    is_partition_key=True,​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +// Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// Add the partition key​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        // highlight-next-line​
    +        .isPartitionKey(true)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512,​
    +        // highlight-next-line​
    +        is_partition_key: true​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isPartitionKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    تعيين أرقام التقسيم

    عندما تقوم بتعيين حقل قياسي في مجموعة كمفتاح التقسيم، يقوم Milvus تلقائيًا بإنشاء 16 قسمًا في المجموعة. عند استلام أحد الكيانات، يختار Milvus قسمًا بناءً على قيمة مفتاح التقسيم لهذا الكيان ويخزن الكيان في القسم، مما يؤدي إلى احتواء بعض أو كل الأقسام على كيانات بقيم مفاتيح أقسام مختلفة.

    +

    يمكنك أيضًا تحديد عدد الأقسام المراد إنشاؤها مع المجموعة. لا يكون هذا صالحًا إلا إذا كان لديك حقل قياسي معيّن كمفتاح التقسيم.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_partitions=1024​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +                .collectionName("my_collection")​
    +                .collectionSchema(schema)​
    +                .numPartitions(1024)​
    +                .build();​
    +        client.createCollection(createCollectionReq);​
    +
    +
    +
    await client.create_collection({​
    +    collection_name: "my_collection",​
    +    schema: schema,​
    +    num_partitions: 1024​
    +})​
    +
    +
    +
    export params='{​
    +    "partitionsNum": 1024​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"myCollection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    إنشاء شرط التصفية

    عند إجراء عمليات بحث ANN في مجموعة مع تمكين ميزة مفتاح التقسيم، تحتاج إلى تضمين تعبير تصفية يتضمن مفتاح التقسيم في طلب البحث. في تعبير التصفية، يمكنك في تعبير التصفية تقييد قيمة مفتاح التقسيم ضمن نطاق محدد بحيث يقيد Milvus نطاق البحث ضمن الأقسام المقابلة.

    +

    توضّح الأمثلة التالية التصفية المستندة إلى مفتاح القسم استناداً إلى قيمة مفتاح قسم محدد ومجموعة من قيم مفاتيح الأقسام.

    + +
    # Filter based on a single partition key value, or​
    +filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +String filter = "partition_key == 'x' && <other conditions>";​
    +​
    +// Filter based on multiple partition key values​
    +String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +const filter = 'partition_key == "x" && <other conditions>'​
    +​
    +// Filter based on multiple partition key values​
    +const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    # Filter based on a single partition key value, or​
    +export filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +export filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.json b/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.json new file mode 100644 index 000000000..15a77a436 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create iterator​\nquery_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​\n​\ncollection = Collection(\"iterator_collection\")​\n​\niterator = collection.search_iterator(​\n data=query_vectors,​\n anns_field=\"vector\",​\n param={\"metric_type\": \"L2\", \"params\": {\"nprobe\": 16}},​\n # highlight-next-line​\n batch_size=50,​\n output_fields=[\"color\"],​\n # highlight-next-line​\n limit=20000​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.orm.iterator.SearchIterator;​\nimport io.milvus.v2.common.IndexParam.MetricType;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​\n .collectionName(\"iterator_collection\")​\n .vectors(Collections.singletonList(queryVector))​\n .vectorFieldName(\"vector\")​\n .batchSize(500L)​\n .outputFields(Lists.newArrayList(\"color\"))​\n .topK(20000)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","results = []​\n​\nwhile True:​\n # highlight-next-line​\n result = iterator.next()​\n if not result:​\n # highlight-next-line​\n iterator.close()​\n break​\n ​\n for hit in result:​\n results.append(hit.to_dict())​\n\n","import io.milvus.response.QueryResultsWrapper;​\n​\nwhile (true) {​\n List res = searchIterator.next();​\n if (res.isEmpty()) {​\n searchIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n\n"],"headingContent":"Search Iterator​","anchorList":[{"label":"مكرر البحث","href":"Search-Iterator​","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview​","type":2,"isActive":false},{"label":"إنشاء مكرر بحث","href":"Create-SearchIterator​","type":2,"isActive":false},{"label":"استخدام SearchIterator","href":"Use-SearchIterator​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.md b/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.md new file mode 100644 index 000000000..fada33a9f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/search-query-get/with-iterators.md @@ -0,0 +1,161 @@ +--- +id: with-iterators.md +order: 4 +summary: يوفر Milvus مكررات بحث واستعلام لتكرار النتائج مع حجم كبير من الكيانات. +title: مع المتكررات +--- +

    مكرر البحث

    يحتوي بحث ANN Search على حد أقصى لعدد الكيانات التي يمكن استدعاؤها في استعلام واحد، وقد لا يلبي مجرد استخدام بحث ANN Search الأساسي متطلبات الاسترجاع على نطاق واسع. بالنسبة لطلبات بحث ANN Search حيث يتجاوز عدد الكيانات الأعلىK 16,384 كيانًا، يُنصح باستخدام أداة التكرار SearchIterator. سيقدم هذا القسم كيفية استخدام SearchIterator والاعتبارات ذات الصلة.

    +

    نظرة عامة

    يقوم طلب البحث بإرجاع نتائج البحث، بينما يقوم SearchIterator بإرجاع مكرر. يمكنك استدعاء الأسلوب التالي() لهذا المُؤشِّر للحصول على نتائج البحث.

    +

    على وجه التحديد، يمكنك استخدام SearchIterators على النحو التالي.

    +
      +
    1. قم بإنشاء SearchIterator وقم بتعيين عدد الكيانات المراد إرجاعها لكل طلب بحث والعدد الإجمالي للكيانات المراد إرجاعها.

    2. +
    3. استدعاء الأسلوب التالي() من SearchIterator في حلقة للحصول على نتيجة البحث بطريقة ترقيم الصفحات.

    4. +
    5. استدع أسلوب الإغلاق() الخاص بالمُكرر لإنهاء الحلقة إذا أرجع الأسلوب التالي() نتيجة فارغة.

    6. +
    +

    إنشاء مكرر بحث

    يوضِّح مقتطف الشيفرة التالي كيفية إنشاء مُؤشِّر بحث.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create iterator​
    +query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​
    +​
    +collection = Collection("iterator_collection")​
    +​
    +iterator = collection.search_iterator(​
    +    data=query_vectors,​
    +    anns_field="vector",​
    +    param={"metric_type": "L2", "params": {"nprobe": 16}},​
    +    # highlight-next-line
    +    batch_size=50,​
    +    output_fields=["color"],​
    +    # highlight-next-line
    +    limit=20000​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.orm.iterator.SearchIterator;​
    +import io.milvus.v2.common.IndexParam.MetricType;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​
    +        .collectionName("iterator_collection")​
    +        .vectors(Collections.singletonList(queryVector))​
    +        .vectorFieldName("vector")​
    +        .batchSize(500L)​
    +        .outputFields(Lists.newArrayList("color"))​
    +        .topK(20000)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +

    في الأمثلة أعلاه، لقد قمت بتعيين عدد الكيانات المراد إرجاعها لكل بحث(batch_size/batchSize) إلى 50، والعدد الإجمالي للكيانات المراد إرجاعها(topK) إلى 20,000.

    +

    استخدام SearchIterator

    بمجرد أن يصبح SearchIterator جاهزًا، يمكنك استدعاء طريقة التالي() الخاصة به للحصول على نتائج البحث بطريقة ترقيم الصفحات.

    + +
    results = []​
    +​
    +while True:​
    +    # highlight-next-line​
    +    result = iterator.next()​
    +    if not result:​
    +        # highlight-next-line​
    +        iterator.close()​
    +        break​
    +    ​
    +    for hit in result:​
    +        results.append(hit.to_dict())​
    +
    +
    +
    import io.milvus.response.QueryResultsWrapper;​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = searchIterator.next();​
    +    if (res.isEmpty()) {​
    +        searchIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +
    +
    +

    في الأمثلة البرمجية أعلاه، قمتَ بإنشاء حلقة لا نهائية واستدعيتَ طريقة التالي() في الحلقة لتخزين نتائج البحث في متغير وأغلقتَ المُؤشِّر عندما لا يُرجع التالي() شيئًا.

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.json b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.json new file mode 100644 index 000000000..0ff79baa0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo install github.com/milvus-io/birdwatcher\n","go run main.go\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo build -o birdwatcher main.go\n","./birdwatcher\n","wget -O birdwatcher.tar.gz \\\nhttps://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher__.tar.gz\n","tar -xvzf birdwatcher.tar.gz\n./birdwatcher\n","apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: birdwatcher\nspec:\n selector:\n matchLabels:\n app: birdwatcher\n template:\n metadata:\n labels:\n app: birdwatcher\n spec:\n containers:\n - name: birdwatcher\n image: milvusdb/birdwatcher\n resources:\n limits:\n memory: \"128Mi\"\n cpu: \"500m\"\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ndocker build -t milvusdb/birdwatcher .\n","...\n - name: birdwatcher\n image: milvusdb/birdwatcher\n imagePullPolicy: Never\n...\n","kubectl apply -f deployment.yml\n"],"headingContent":"Install Birdwatcher","anchorList":[{"label":"تثبيت Birdwatcher","href":"Install-Birdwatcher","type":1,"isActive":false},{"label":"التثبيت المحلي","href":"Local-install","type":2,"isActive":false},{"label":"التثبيت كجراب Kubernetes","href":"Install-as-a-Kubernetes-pod","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.md b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.md new file mode 100644 index 000000000..7c8f33c1e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_install_guides.md @@ -0,0 +1,118 @@ +--- +id: birdwatcher_install_guides.md +summary: تعرف على كيفية تثبيت Birdwatch لتصحيح أخطاء ميلفوس. +title: تثبيت Birdwatcher +--- +

    تثبيت Birdwatcher

    توضح هذه الصفحة كيفية تثبيت Birdwatcher.

    +

    التثبيت المحلي

    إذا كنت قد قمت بتثبيت ميلفوس ستاندالون باستخدام docker، فمن الأفضل تنزيل وتثبيت النسخة الثنائية المدمجة، أو تثبيت Birdwatcher كوحدة Go مشتركة، أو بناء Birdwatcher من المصدر.

    +
      +
    • قم بتثبيته كوحدة Go مشتركة.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go install github.com/milvus-io/birdwatcher
      +
      +

      ثم يمكنك تشغيل Birdwatcher على النحو التالي:

      +
      go run main.go
      +
    • +
    • قم ببنائه من المصدر.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go build -o birdwatcher main.go
      +
      +

      ثم يمكنك تشغيل Birdwatcher على النحو التالي:

      +
      ./birdwatcher
      +
    • +
    • قم بتنزيل النسخة الثنائية المبنية مسبقًا

      +

      أولاً، افتح صفحة الإصدار الأخير، وابحث عن الثنائيات المجهزة.

      +
      wget -O birdwatcher.tar.gz \
      +https://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher_<os>_<arch>.tar.gz
      +
      +

      ثم يمكنك فك ضغط كرة القطران واستخدام Birdwatcher على النحو التالي:

      +
      tar -xvzf birdwatcher.tar.gz
      +./birdwatcher
      +
    • +
    +

    التثبيت كجراب Kubernetes

    إذا كنت قد قمت بتثبيت إما Milvus Standalone باستخدام مخططات Helm أو Milvus Operator أو Milvus Cluster باستخدام مخططات Helm أو Milvus Operator، يُنصح بتثبيت Birdwatcher كجراب Kubernetes.

    +

    إعداد deployment.yml

    apiVersion: apps/v1
    +kind: Deployment
    +metadata:
    +  name: birdwatcher
    +spec:
    +  selector:
    +    matchLabels:
    +      app: birdwatcher
    +  template:
    +    metadata:
    +      labels:
    +        app: birdwatcher
    +    spec:
    +      containers:
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        resources:
    +          limits:
    +            memory: "128Mi"
    +            cpu: "500m"
    +
    +
    +

    إذا لم تكن الصورة المتوفرة على DockerHub هي الأحدث، يمكنك إنشاء صورة لـ Birdwatcher باستخدام ملف Dockerfile المرفق مع الكود المصدري كما يلي:

    +
    git clone https://github.com/milvus-io/birdwatcher.git
    +cd birdwatcher
    +docker build -t milvusdb/birdwatcher .
    +
    +

    لنشر صورة مبنية محليًا، تحتاج إلى إضافة imagePullPolicy إلى المواصفات المذكورة أعلاه وتعيينها إلى Never.

    +
    ...
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        imagePullPolicy: Never
    +...
    +
    +
    +

    تطبيق deployment.yml

    احفظ YAML أعلاه في ملف وسمه deployment.yml ، وقم بتشغيل الأمر التالي

    +
    kubectl apply -f deployment.yml
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.json b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.json new file mode 100644 index 000000000..165b28eb8 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Birdwatcher","anchorList":[{"label":"مراقب الطيور","href":"Birdwatcher","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisite","type":2,"isActive":false},{"label":"البنية","href":"Architecture","type":2,"isActive":false},{"label":"أحدث إصدار","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.md b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.md new file mode 100644 index 000000000..4dcfedbc2 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_overview.md @@ -0,0 +1,77 @@ +--- +id: birdwatcher_overview.md +summary: >- + Birdwatcher هو أداة تصحيح أخطاء لنظام Milvus 2.x. يتصل بـ etcd ويفحص حالة نظام + Milvus. +title: مراقب الطيور +--- +

    مراقب الطيور

    Milvus عبارة عن قاعدة بيانات متجهة عديمة الحالة تفصل بين القراءات والكتابات، وتلعب إلخd دور المصدر الوحيد للحالة. يجب على جميع المنسقين الاستعلام عن الحالة من إلخd قبل أن يتمكنوا من إجراء أي تغييرات عليها. وبمجرد أن يحتاج المستخدمون إلى التحقق من الحالة أو تنظيفها، فإنهم يحتاجون إلى أداة للتواصل مع إلخd. وهنا يأتي دور Birdwatcher.

    +

    Birdwatcher هي أداة لتصحيح الأخطاء في ميلفوس. باستخدامها للاتصال بـ etcd، يمكنك التحقق من حالة نظام ميلفوس الخاص بك أو تهيئته أثناء التنقل.

    +

    المتطلبات الأساسية

    +

    البنية

    + + Birdwatcher architecture + بنية مراقب الطيور

    +

    أحدث إصدار

    الإصدار v1.0.2

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.json b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.json new file mode 100644 index 000000000..fa070ee19 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.json @@ -0,0 +1 @@ +{"codeList":["./birdwatcher\n","Offline >\n","Offline > connect\nMilvus(by-dev) >\n","kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'\n","kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh\n","Offline > connect --etcd ${ETCD_IP_ADDR}:2379\nMilvus(by-dev)\n","Offline > connect --rootPath my-release\nMilvus(my-release) >\n","Offline > connect --dry\nusing dry mode, ignore rootPath and metaPath\nEtcd(127.0.0.1:2379) > find-milvus\n1 candidates found:\nmy-release\nEtcd(127.0.0.1:2379) > use my-release\nMilvus(my-release) >\n","Milvus(my-release) > show -h\nUsage:\n show [command]\n\nAvailable Commands:\n alias list alias meta info\n channel-watch display channel watching info from data coord meta store\n checkpoint list checkpoint collection vchannels\n collection-history display collection change history\n collection-loaded display information of loaded collection from querycoord\n collections list current available collection from RootCoord\n config-etcd list configuations set by etcd source\n configurations iterate all online components and inspect configuration\n current-version \n database display Database info from rootcoord meta\n index \n partition list partitions of provided collection\n querycoord-channel display querynode information from querycoord cluster\n querycoord-cluster display querynode information from querycoord cluster\n querycoord-task display task information from querycoord\n replica list current replica information from QueryCoord\n segment display segment information from data coord meta store\n segment-index display segment index information\n segment-loaded display segment information from querycoordv1 meta\n segment-loaded-grpc list segments loaded information\n session list online milvus components\n\nFlags:\n -h, --help help for show\n\nUse \" show [command] --help\" for more information about a command.\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n","Milvus(by-dev) > show database\n=============================\nID: 1 Name: default\nTenantID: State: DatabaseCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show collections\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n--- Total collections: 1 Matched collections: 1\n--- Total channel: 1 Healthy collections: 1\n================================================================================\n","Milvus(by-dev) > show collection-history --id 443407225551410746\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n","Milvus(by-dev) > show collection-loaded\nVersion: [>= 2.2.0] CollectionID: 443407225551410746\nReplicaNumber: 1 LoadStatus: Loaded\n--- Collections Loaded: 1\n","Milvus(by-dev) > show checkpoint --collection 443407225551410746\nvchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint\n","Milvus(by-dev) > show index\n*************2.1.x***************\n*************2.2.x***************\n==================================================================\nIndex ID: 443407225551410801 Index Name: _default_idx_102 CollectionID:443407225551410746\nCreate Time: 2023-08-08 09:27:19.139 +0000 Deleted: false\nIndex Type: HNSW Metric Type: L2\nIndex Params: \n==================================================================\n","Milvus(by-dev) > show partition --collection 443407225551410746\nParition ID: 443407225551410747 Name: _default State: PartitionCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show channel-watch\n=============================\nkey: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0\nChannel Name:by-dev-rootcoord-dml_0_443407225551410746v0 WatchState: WatchSuccess\nChannel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000\nStart Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000\nUnflushed segments: []\nFlushed segments: []\nDropped segments: []\n--- Total Channels: 1\n","Milvus(by-dev) > show replica\n================================================================================\nReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0\nAll Nodes:[2]\n","SegmentID: 443407225551610865 State: Flushed, Row Count:5979\n--- Growing: 0, Sealed: 0, Flushed: 1\n--- Total Segments: 1, row count: 5979\n","Milvus(by-dev) > show segment-loaded-grpc\n===========\nServerID 2\nChannel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937\nLeader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0\nGrowing segments number: 0 , ids: []\nSegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0\nSealed segments number: 1 \n","Milvus(by-dev) > show configurations\nclient nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nComponent rootcoord-1\nrootcoord.importtaskexpiration: 900\nrootcoord.enableactivestandby: false\nrootcoord.importtaskretention: 86400\nrootcoord.maxpartitionnum: 4096\nrootcoord.dmlchannelnum: 16\nrootcoord.minsegmentsizetoenableindex: 1024\nrootcoord.port: 53100\nrootcoord.address: localhost\nrootcoord.maxdatabasenum: 64\nComponent datacoord-3\n...\nquerynode.gracefulstoptimeout: 30\nquerynode.cache.enabled: true\nquerynode.cache.memorylimit: 2147483648\nquerynode.scheduler.maxreadconcurrentratio: 2\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n\nMilvus(by-dev) > visit querycoord 7\nQueryCoord-7(10.244.0.8:19531) > configuration\nKey: querycoord.enableactivestandby, Value: false\nKey: querycoord.channeltasktimeout, Value: 60000\nKey: querycoord.overloadedmemorythresholdpercentage, Value: 90\nKey: querycoord.distpullinterval, Value: 500\nKey: querycoord.checkinterval, Value: 10000\nKey: querycoord.checkhandoffinterval, Value: 5000\nKey: querycoord.taskexecutioncap, Value: 256\nKey: querycoord.taskmergecap, Value: 8\nKey: querycoord.autohandoff, Value: true\nKey: querycoord.address, Value: localhost\nKey: querycoord.port, Value: 19531\nKey: querycoord.memoryusagemaxdifferencepercentage, Value: 30\nKey: querycoord.refreshtargetsintervalseconds, Value: 300\nKey: querycoord.balanceintervalseconds, Value: 60\nKey: querycoord.loadtimeoutseconds, Value: 1800\nKey: querycoord.globalrowcountfactor, Value: 0.1\nKey: querycoord.scoreunbalancetolerationfactor, Value: 0.05\nKey: querycoord.reverseunbalancetolerationfactor, Value: 1.3\nKey: querycoord.balancer, Value: ScoreBasedBalancer\nKey: querycoord.autobalance, Value: true\nKey: querycoord.segmenttasktimeout, Value: 120000\n","Milvus(my-release) > backup\nBacking up ... 100%(2452/2451)\nbackup etcd for prefix done\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nbackup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz\n","Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747\nPK 110 found on segment 442844725212299830\nField id, value: &{long_data: }\nField title, value: &{string_data: }\nField title_vector, value: &{dim:768 float_vector: }\nField article_meta, value: &{json_data: }\n","Milvus(by-dev) > probe query\nprobing collection 442682158191982314\nFound vector field vector(103) with dim[384], indexID: 442682158191990455\nfailed to generated mock request probing index type IVF_FLAT not supported yet\nprobing collection 442844725212086932\nFound vector field title_vector(102) with dim[768], indexID: 442844725212086936\nShard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.\nprobing collection 442844725212299747\nFound vector field title_vector(102) with dim[768], indexID: 442844725212299751\nShard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.\nprobing collection 443294505839900248\nFound vector field vector(101) with dim[256], indexID: 443294505839900251\nShard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.\n"],"headingContent":"Use Birdwatcher","anchorList":[{"label":"استخدام مراقب الطيور","href":"Use-Birdwatcher","type":1,"isActive":false},{"label":"ابدأ تشغيل Birdwatcher","href":"Start-Birdwatcher","type":2,"isActive":false},{"label":"الاتصال بـ etcd","href":"Connect-to-etcd","type":2,"isActive":false},{"label":"تحقق من حالة ميلفوس","href":"Check-Milvus-status","type":2,"isActive":false},{"label":"مقاييس النسخ الاحتياطي","href":"Backup-metrics","type":2,"isActive":false},{"label":"مجموعات الاستقصاء","href":"Probe-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.md b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.md new file mode 100644 index 000000000..4b09b3acf --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/birdwatcher_usage_guides.md @@ -0,0 +1,406 @@ +--- +id: birdwatcher_usage_guides.md +summary: تعلم كيفية استخدام Birdwatch لتصحيح أخطاء ميلفوس. +title: استخدام مراقب الطيور +--- +

    استخدام مراقب الطيور

    يرشدك هذا الدليل إلى كيفية استخدام Birdwatcher للتحقق من حالة الميلفوس وتهيئته أثناء التنقل.

    +

    ابدأ تشغيل Birdwatcher

    Birdwatcher هو أداة سطر أوامر، يمكنك تشغيله على النحو التالي:

    +
    ./birdwatcher
    +
    +

    ثم سيتم استقبالك بالمطالبة التالية:

    +
    Offline >
    +
    +

    الاتصال بـ etcd

    تحتاج إلى استخدام Birdwatcher Birdwatcher للاتصال بـ etcd قبل أي عمليات أخرى.

    +
      +
    • الاتصال بالإعدادات الافتراضية

      +
      Offline > connect
      +Milvus(by-dev) >
      +
    • +
    • الاتصال من Birdwatcher في كبسولة

      +

      إذا اخترت تشغيل Birdwatcher Birdwatcher في جراب Kubernetes، فأنت بحاجة أولاً إلى الحصول على عنوان IP الخاص بـ etcd على النحو التالي:

      +
      kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'
      +
      +

      ثم الوصول إلى غلاف الحجرة.

      +
      kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh
      +
      +

      أخيرًا، استخدم عنوان IP الذي تم إرجاعه للاتصال بـ etcd كما يلي:

      +
      Offline > connect --etcd ${ETCD_IP_ADDR}:2379
      +Milvus(by-dev)
      +
    • +
    • الاتصال بمسار جذر مختلف

      +

      إذا كان المسار الجذر لـ Milvus الخاص بك مختلفًا عن by-dev وتمت مطالبتك بخطأ يفيد بوجود مسار جذر غير صحيح، يمكنك الاتصال بـ etcd كما يلي:

      +
      Offline > connect --rootPath my-release
      +Milvus(my-release) >
      +
      +

      إذا كنت لا تعرف المسار الجذر لـ Milvus الخاص بك، اتصل بـ إلخd على النحو التالي:

      +
      Offline > connect --dry
      +using dry mode, ignore rootPath and metaPath
      +Etcd(127.0.0.1:2379) > find-milvus
      +1 candidates found:
      +my-release
      +Etcd(127.0.0.1:2379) > use my-release
      +Milvus(my-release) >
      +
    • +
    +

    تحقق من حالة ميلفوس

    يمكنك استخدام الأوامر show للتحقق من حالة ميلفوس.

    +
    Milvus(my-release) > show -h
    +Usage:
    +   show [command]
    +
    +Available Commands:
    +  alias               list alias meta info
    +  channel-watch       display channel watching info from data coord meta store
    +  checkpoint          list checkpoint collection vchannels
    +  collection-history  display collection change history
    +  collection-loaded   display information of loaded collection from querycoord
    +  collections         list current available collection from RootCoord
    +  config-etcd         list configuations set by etcd source
    +  configurations      iterate all online components and inspect configuration
    +  current-version     
    +  database            display Database info from rootcoord meta
    +  index               
    +  partition           list partitions of provided collection
    +  querycoord-channel  display querynode information from querycoord cluster
    +  querycoord-cluster  display querynode information from querycoord cluster
    +  querycoord-task     display task information from querycoord
    +  replica             list current replica information from QueryCoord
    +  segment             display segment information from data coord meta store
    +  segment-index       display segment index information
    +  segment-loaded      display segment information from querycoordv1 meta
    +  segment-loaded-grpc list segments loaded information
    +  session             list online milvus components
    +
    +Flags:
    +  -h, --help   help for show
    +
    +Use " show [command] --help" for more information about a command.
    +
    +

    سرد الجلسات

    لسرد جلسات العمل المرتبطة بمكونات مختلفة في ملفوس:

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +

    في إخراج الأوامر، يتوافق كل إدخال جلسة عمل مدرج في show session مع عقدة أو خدمة نشطة حاليًا ومسجلة في إلخd.

    +

    التحقق من قواعد البيانات والمجموعات

    يمكنك سرد جميع قواعد البيانات والمجموعات.

    +
      +
    • سرد قواعد البيانات

      +

      في إخراج الأمر، يمكنك العثور على معلومات حول كل قاعدة بيانات.

      +
      Milvus(by-dev) > show database
      +=============================
      +ID: 1   Name: default
      +TenantID:        State: DatabaseCreated
      +--- Total Database(s): 1
      +
    • +
    • سرد المجموعات

      +

      في مخرجات الأمر، يمكنك العثور على معلومات مفصلة حول كل مجموعة.

      +
      Milvus(by-dev) > show collections
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +--- Total collections:  1        Matched collections:  1
      +--- Total channel: 1     Healthy collections: 1
      +================================================================================
      +
    • +
    • عرض مجموعة محددة

      +

      يمكنك عرض مجموعة محددة من خلال تحديد معرفها.

      +
      Milvus(by-dev) > show collection-history --id 443407225551410746
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +
    • +
    • عرض كافة المجموعات المحملة

      +

      يمكنك جعل Birdwatcher يقوم بتصفية كافة المجموعات المحملة.

      +
      Milvus(by-dev) > show collection-loaded
      +Version: [>= 2.2.0]     CollectionID: 443407225551410746
      +ReplicaNumber: 1        LoadStatus: Loaded
      +--- Collections Loaded: 1
      +
    • +
    • سرد كافة نقاط فحص القنوات الخاصة بمجموعة ما

      +

      يمكنك أن تطلب من Birdwatcher سرد كافة نقاط التفتيش الخاصة بمجموعة محددة.

      +
      Milvus(by-dev) > show checkpoint --collection 443407225551410746
      +vchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint
      +
    • +
    +

    التحقق من تفاصيل الفهرس

    قم بتشغيل الأمر التالي لسرد كافة ملفات الفهرس بالتفصيل.

    +
    Milvus(by-dev) > show index
    +*************2.1.x***************
    +*************2.2.x***************
    +==================================================================
    +Index ID: 443407225551410801    Index Name: _default_idx_102    CollectionID:443407225551410746
    +Create Time: 2023-08-08 09:27:19.139 +0000      Deleted: false
    +Index Type: HNSW        Metric Type: L2
    +Index Params: 
    +==================================================================
    +
    +

    سرد الأجزاء

    قم بتشغيل الأمر التالي لسرد كافة الأقسام في مجموعة محددة.

    +
    Milvus(by-dev) > show partition --collection 443407225551410746
    +Parition ID: 443407225551410747 Name: _default  State: PartitionCreated
    +--- Total Database(s): 1
    +
    +

    التحقق من حالة القناة

    قم بتشغيل الأمر التالي لعرض حالة القناة

    +
    Milvus(by-dev) > show channel-watch
    +=============================
    +key: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0
    +Channel Name:by-dev-rootcoord-dml_0_443407225551410746v0         WatchState: WatchSuccess
    +Channel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000
    +Start Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000
    +Unflushed segments: []
    +Flushed segments: []
    +Dropped segments: []
    +--- Total Channels: 1
    +
    +

    سرد كافة النسخ المتماثلة والأجزاء

      +
    • سرد كافة النسخ المتماثلة

      +

      قم بتشغيل الأمر التالي لسرد كافة النسخ المتماثلة والمجموعات المقابلة لها.

      +
      Milvus(by-dev) > show replica
      +================================================================================
      +ReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0
      +All Nodes:[2]
      +
    • +
    • سرد كافة المقاطع

      +

      قم بتشغيل الأمر التالي لسرد كافة المقاطع وحالتها

      +
      SegmentID: 443407225551610865 State: Flushed, Row Count:5979
      +--- Growing: 0, Sealed: 0, Flushed: 1
      +--- Total Segments: 1, row count: 5979
      +
      +

      قم بتشغيل الأمر التالي لسرد جميع المقاطع المحملة بالتفصيل. بالنسبة إلى Milvus 2.1.x، استخدم show segment-loaded بدلاً من ذلك.

      +
      Milvus(by-dev) > show segment-loaded-grpc
      +===========
      +ServerID 2
      +Channel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937
      +Leader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Growing segments number: 0 , ids: []
      +SegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Sealed segments number: 1    
      +
    • +
    +

    سرد التكوينات

    يمكنك أن تطلب من Birdwatcher سرد التكوينات الحالية لكل مكون من مكونات Milvus.

    +
    Milvus(by-dev) > show configurations
    +client nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Component rootcoord-1
    +rootcoord.importtaskexpiration: 900
    +rootcoord.enableactivestandby: false
    +rootcoord.importtaskretention: 86400
    +rootcoord.maxpartitionnum: 4096
    +rootcoord.dmlchannelnum: 16
    +rootcoord.minsegmentsizetoenableindex: 1024
    +rootcoord.port: 53100
    +rootcoord.address: localhost
    +rootcoord.maxdatabasenum: 64
    +Component datacoord-3
    +...
    +querynode.gracefulstoptimeout: 30
    +querynode.cache.enabled: true
    +querynode.cache.memorylimit: 2147483648
    +querynode.scheduler.maxreadconcurrentratio: 2
    +
    +

    وكبديل عن ذلك، يمكنك زيارة كل مكون من مكونات Milvus للعثور على تكوينه. يوضح ما يلي كيفية سرد تكوينات QueryCoord بالمعرف 7.

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +Milvus(by-dev) > visit querycoord 7
    +QueryCoord-7(10.244.0.8:19531) > configuration
    +Key: querycoord.enableactivestandby, Value: false
    +Key: querycoord.channeltasktimeout, Value: 60000
    +Key: querycoord.overloadedmemorythresholdpercentage, Value: 90
    +Key: querycoord.distpullinterval, Value: 500
    +Key: querycoord.checkinterval, Value: 10000
    +Key: querycoord.checkhandoffinterval, Value: 5000
    +Key: querycoord.taskexecutioncap, Value: 256
    +Key: querycoord.taskmergecap, Value: 8
    +Key: querycoord.autohandoff, Value: true
    +Key: querycoord.address, Value: localhost
    +Key: querycoord.port, Value: 19531
    +Key: querycoord.memoryusagemaxdifferencepercentage, Value: 30
    +Key: querycoord.refreshtargetsintervalseconds, Value: 300
    +Key: querycoord.balanceintervalseconds, Value: 60
    +Key: querycoord.loadtimeoutseconds, Value: 1800
    +Key: querycoord.globalrowcountfactor, Value: 0.1
    +Key: querycoord.scoreunbalancetolerationfactor, Value: 0.05
    +Key: querycoord.reverseunbalancetolerationfactor, Value: 1.3
    +Key: querycoord.balancer, Value: ScoreBasedBalancer
    +Key: querycoord.autobalance, Value: true
    +Key: querycoord.segmenttasktimeout, Value: 120000
    +
    +

    مقاييس النسخ الاحتياطي

    يمكنك جعل Birdwatcher يقوم بعمل نسخة احتياطية من المقاييس لجميع المكونات

    +
    Milvus(my-release) > backup
    +Backing up ... 100%(2452/2451)
    +backup etcd for prefix  done
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +backup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz
    +
    +

    ثم يمكنك التحقق من الملف في الدليل حيث تبدأ تشغيل Birdwatcher.

    +

    مجموعات الاستقصاء

    يمكنك جعل Birdwatcher يستقصي حالة المجموعات المحملة بمفاتيح أساسية محددة أو استعلامات وهمية.

    +

    استقصاء المجموعات ذات المفتاح الأساسي المعروف

    في الأمر probe ، يجب تحديد المفتاح الأساسي باستخدام العلامة pk ومعرف المجموعة باستخدام العلامة collection.

    +
    Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747
    +PK 110 found on segment 442844725212299830
    +Field id, value: &{long_data:<data:110 > }
    +Field title, value: &{string_data:<data:"Human Resources Datafication" > }
    +Field title_vector, value: &{dim:768 float_vector:<data:0.022454707 data:0.007861045 data:0.0063843643 data:0.024065714 data:0.013782166 data:0.018483251 data:-0.026526336 ... data:-0.06579628 data:0.00033906146 data:0.030992996 data:-0.028134001 data:-0.01311325 data:0.012471594 > }
    +Field article_meta, value: &{json_data:<data:"{\"link\":\"https:\\/\\/towardsdatascience.com\\/human-resources-datafication-d44c8f7cb365\",\"reading_time\":6,\"publication\":\"Towards Data Science\",\"claps\":256,\"responses\":0}" > }
    +
    +

    استقصي جميع المجموعات باستخدام استعلامات وهمية

    يمكنك أيضًا جعل Birdwatcher يستقصي جميع المجموعات باستخدام استعلامات وهمية.

    +
    Milvus(by-dev) > probe query
    +probing collection 442682158191982314
    +Found vector field vector(103) with dim[384], indexID: 442682158191990455
    +failed to generated mock request probing index type IVF_FLAT not supported yet
    +probing collection 442844725212086932
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212086936
    +Shard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.
    +probing collection 442844725212299747
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212299751
    +Shard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.
    +probing collection 443294505839900248
    +Found vector field vector(101) with dim[256], indexID: 443294505839900251
    +Shard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.json b/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.json new file mode 100644 index 000000000..f20f67bcf --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.json @@ -0,0 +1 @@ +{"codeList":["clear\n","connect [-uri (text)] [-t (text)]\n","milvus_cli > connect -uri http://127.0.0.1:19530\n","create database -db (text)\n","milvus_cli > create database -db testdb\n","use database -db (text)\n","milvus_cli > use database -db testdb\n","list databases\n","milvus_cli > list databases\n","delete database -db (text)\n","milvus_cli > delete database -db testdb\n","create user -u (text) -p (text)\n","milvus_cli > create user -u zilliz -p zilliz\n","create role -r (text)\n","milvus_cli > create role -r role1\n","create alias -c (text) -a (text) [-A]\n","milvus_cli > create alias -c car -a carAlias1\n","milvus_cli > create alias -c car2 -A -a carAlias1\n","create collection -c (text) -f (text) -p (text) [-a] [-d (text)]\n","## For array field: --schema-field support :::(:if Varchar)\n\nmilvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'\n","create partition -c (text) -p (text) [-d (text)]\n","milvus_cli > create partition -c car -p new_partition -d test_add_partition\n","create index\n","milvus_cli > create index\n\nCollection name (car, car2): car2\n\nThe name of the field to create an index for (vector): vector\n\nIndex name: vectorIndex\n\n# Default is ''\nIndex type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT\n\n# Default is ''\nIndex metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:\n\nTimeout []:\n","delete user -u (text)\n","milvus_cli > delete user -u zilliz\n","delete role -r (text)\n","milvus_cli > delete role -r role1\n","delete alias -a (text)\n","delete collection -c (text)\n","milvus_cli > delete collection -c car\n","delete entities -c (text) -p (text)\n","milvus_cli > delete entities -c car\n\nThe expression to specify entities to be deleted, such as \"film_id in [ 0, 1 ]\": film_id in [ 0, 1 ]\n\nYou are trying to delete the entities of collection. This action cannot be undone!\n\nDo you want to continue? [y/N]: y\n","delete partition -c (text) -p (text)\n","milvus_cli > delete partition -c car -p new_partition\n","delete index -c (text) -in (text)\n","milvus_cli > delete index -c car -in indexName\n","grant role -r role1 -u user1\n","grant privilege\n","grant role -r role1 -u user1\n","revoke privilege\n","show collection -c (text)\n","milvus_cli > show collection -c test_collection_insert\n","show partition -c (text) -p (text)\n","milvus_cli > show partition -c test_collection_insert -p _default\n","show index -c (text) -in (text)\n","milvus_cli > show index -c test_collection -in index_name\n","exit\n","help \n","import -c (text)[-p (text)] \n","milvus_cli > import -c car 'examples/import_csv/vectors.csv'\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-\nio/milvus_cli/main/examples/import_csv/vectors.csv'\n\nReading file from remote URL.\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","list users\n","list roles\n","milvus_cli > list roles\n","milvus_cli > list grants -r role1 -o object1 -t Collection\n","list collections\n","list indexes -c (text)\n","list partitions -c (text)\n","load -c (text) [-p (text)]\n","query\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id in [ 428960801420883491, 428960801420883492,\n428960801420883493 ]\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: color, brand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id > 428960801420883491\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: id, color,\nbrand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","release -c (text) [-p (text)]\n","search\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file\nout headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):\n [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, car2): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []:\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []:\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","list connections\n","show index_progress -c (text) [-i (text)]\n","show loading_progress -c (text) [-p (text)]\n","version\n","$ milvus_cli --version\nMilvus_CLI v0.4.0\n"],"headingContent":"Milvus_CLI Command Reference","anchorList":[{"label":"مرجع أوامر Milvus_CLI","href":"MilvusCLI-Command-Reference","type":1,"isActive":false},{"label":"مسح","href":"clear","type":2,"isActive":false},{"label":"الاتصال","href":"connect","type":2,"isActive":false},{"label":"إنشاء قاعدة بيانات","href":"create-Database","type":2,"isActive":false},{"label":"استخدام قاعدة البيانات","href":"use-Database","type":2,"isActive":false},{"label":"قائمة قواعد البيانات","href":"list-Databases","type":2,"isActive":false},{"label":"حذف قاعدة البيانات","href":"delete-Database","type":2,"isActive":false},{"label":"إنشاء مستخدم","href":"create-user","type":2,"isActive":false},{"label":"إنشاء دور","href":"create-role","type":2,"isActive":false},{"label":"إنشاء اسم مستعار","href":"create-alias","type":2,"isActive":false},{"label":"إنشاء مجموعة","href":"create-collection","type":2,"isActive":false},{"label":"إنشاء قسم","href":"create-partition","type":2,"isActive":false},{"label":"إنشاء فهرس","href":"create-index","type":2,"isActive":false},{"label":"حذف مستخدم","href":"delete-user","type":2,"isActive":false},{"label":"حذف الدور","href":"delete-role","type":2,"isActive":false},{"label":"حذف الاسم المستعار","href":"delete-alias","type":2,"isActive":false},{"label":"حذف مجموعة","href":"delete-collection","type":2,"isActive":false},{"label":"حذف الكيانات","href":"delete-entities","type":2,"isActive":false},{"label":"حذف قسم","href":"delete-partition","type":2,"isActive":false},{"label":"حذف الفهرس","href":"delete-index","type":2,"isActive":false},{"label":"منح دور","href":"grant-role","type":2,"isActive":false},{"label":"منح امتياز","href":"grant-privilege","type":2,"isActive":false},{"label":"إبطال الدور","href":"revoke-role","type":2,"isActive":false},{"label":"إبطال امتياز","href":"revoke-privilege","type":2,"isActive":false},{"label":"إظهار المجموعة","href":"show-collection","type":2,"isActive":false},{"label":"إظهار القسم","href":"show-partition","type":2,"isActive":false},{"label":"إظهار الفهرس","href":"show-index","type":2,"isActive":false},{"label":"خروج","href":"exit","type":2,"isActive":false},{"label":"تعليمات","href":"help","type":2,"isActive":false},{"label":"استيراد","href":"import","type":2,"isActive":false},{"label":"سرد المستخدمين","href":"list-users","type":2,"isActive":false},{"label":"سرد الأدوار","href":"List-roles","type":2,"isActive":false},{"label":"سرد المنح","href":"List-grants","type":2,"isActive":false},{"label":"سرد المجموعات","href":"list-collections","type":2,"isActive":false},{"label":"قائمة الفهارس","href":"list-indexes","type":2,"isActive":false},{"label":"سرد الأقسام","href":"list-partitions","type":2,"isActive":false},{"label":"تحميل","href":"load","type":2,"isActive":false},{"label":"استعلام","href":"query","type":2,"isActive":false},{"label":"تحرير","href":"release","type":2,"isActive":false},{"label":"بحث","href":"search","type":2,"isActive":false},{"label":"سرد الاتصالات","href":"list-connection","type":2,"isActive":false},{"label":"إظهار تقدم الفهرسة","href":"show-indexprogress","type":2,"isActive":false},{"label":"إظهار تقدم التحميل","href":"show-loadingprogress","type":2,"isActive":false},{"label":"الإصدار","href":"version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.md b/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.md new file mode 100644 index 000000000..6f3f4dc70 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/cli_commands.md @@ -0,0 +1,1530 @@ +--- +id: cli_commands.md +summary: تفاعل مع ميلفوس باستخدام الأوامر. +title: مرجع أوامر Milvus_CLI +--- +

    مرجع أوامر Milvus_CLI

    واجهة سطر الأوامر Milvus (CLI) هي أداة سطر أوامر تدعم الاتصال بقاعدة البيانات وعمليات البيانات واستيراد البيانات وتصديرها.

    +

    يقدم هذا الموضوع جميع الأوامر المدعومة والخيارات المقابلة لها. كما يتم تضمين بعض الأمثلة للرجوع إليها.

    +

    مسح

    مسح الشاشة.

    +

    بناء الجملة

    +
    clear
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    الاتصال

    يتصل بميلفوس.

    +

    بناء الجملة

    +
    connect [-uri (text)] [-t (text)]
    +
    +

    خيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -uri-uri(اختياري) اسم uri. الافتراضي هو "http://127.0.0.1:19530".
    -t-الرمز المميز(اختياري) الرمز المميز ل zilliz cloud apikey أو username:password. الافتراضي هو لا شيء.
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +
    milvus_cli > connect -uri http://127.0.0.1:19530
    +
    +

    إنشاء قاعدة بيانات

    إنشاء قاعدة بيانات في ميلفوس

    +

    بناء الجملة

    +
    create database -db (text)
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -db-database[مطلوب] اسم قاعدة البيانات في ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    مثال 1

    يقوم المثال التالي بإنشاء قاعدة البيانات testdb في ميلفوس.

    +
    milvus_cli > create database -db testdb
    +
    +

    استخدام قاعدة البيانات

    استخدام قاعدة البيانات في ملفوس

    +

    بناء الجملة

    +
    use database -db (text)
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -db-database[مطلوب] اسم قاعدة البيانات في ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    مثال 1

    يستخدم المثال التالي قاعدة البيانات testdb في ميلفوس.

    +
    milvus_cli > use database -db testdb
    +
    +

    قائمة قواعد البيانات

    سرد قواعد البيانات في ملفوس

    +

    بناء الجملة

    +
    list databases
    +
    +

    أمثلة

    المثال 1

    يسرد المثال التالي قائمة قواعد البيانات في ملفوس.

    +
    milvus_cli > list databases
    +
    +

    حذف قاعدة البيانات

    حذف قاعدة بيانات في ملفوس

    +

    بناء الجملة

    +
    delete database -db (text)
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -db-database[مطلوب] اسم قاعدة البيانات في ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    مثال 1

    يقوم المثال التالي بحذف قاعدة البيانات testdb في ميلفوس.

    +
    milvus_cli > delete database -db testdb
    +
    +

    إنشاء مستخدم

    إنشاء مستخدم في ملفوس

    +

    بناء الجملة

    +
    create user -u (text) -p (text)
    +
    +

    الخيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -p-كلمة المروركلمة مرور المستخدم في ميلفوس. الافتراضي هو "لا شيء".
    -u-اسم المستخدماسم المستخدم في ميلفوس. الافتراضي هو "بلا".
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    مثال 1

    ينشئ المثال التالي المستخدم zilliz وكلمة المرور zilliz في ميلفوس.

    +
    milvus_cli > create user -u zilliz -p zilliz
    +
    +

    إنشاء دور

    إنشاء دور في ميلفوس

    +

    بناء الجملة

    +
    create role -r (text)
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -r-roleNameاسم دور دور ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    مثال 1

    المثال التالي إنشاء الدور role1 في ميلفوس.

    +
    milvus_cli > create role -r role1
    +
    +

    إنشاء اسم مستعار

    تحديد أسماء مستعارة فريدة لمجموعة ما.

    +
    يمكن أن تحتوي المجموعة على عدة أسماء مستعارة. ومع ذلك، يتوافق الاسم المستعار مع مجموعة واحدة كحد أقصى.
    +

    بناء الجملة

    +
    create alias -c (text) -a (text) [-A]
    +
    +

    خيارات

    + + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -a-الاسم المستعارالاسم المستعار.
    -A-تغيير(اختياري) علامة لنقل الاسم المستعار إلى مجموعة محددة.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    +

    مثال 1

    +

    ينشئ المثال التالي carAlias1 و carAlias2 الأسماء المستعارة للمجموعة car.

    +
    milvus_cli > create alias -c car -a carAlias1
    +
    +

    مثال 2

    +
    يعتمد المثال 2 على المثال 1.
    +

    ينقل المثال التالي الاسم المستعار carAlias1 من المجموعة car إلى المجموعة car2.

    +
    milvus_cli > create alias -c car2 -A -a carAlias1
    +
    +

    إنشاء مجموعة

    إنشاء مجموعة.

    +

    بناء الجملة

    +
    create collection -c (text) -f (text) -p (text) [-a] [-d (text)]
    +
    +

    الخيارات

    + + + + + + + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -f-الحقل -Sschema-field(متعدد) مخطط الحقل بتنسيق <fieldName>:<dataType>:<dimOfVector/desc>.
    -p-Sschema-المجال الأساسياسم حقل المفتاح الأساسي.
    -a-المعرف التلقائي للمخطط(اختياري) علم لإنشاء المعرفات تلقائيًا.
    -desc-وصف-نظرية-وصف(اختياري) وصف المجموعة.
    -مستوى-مستوى الاتساق(اختياري) مستوى الاتساق: محدود، جلسة عمل، قوي، نهائي.
    -d-هو ديناميكي(اختياري) يدعم مخطط المجموعة الحقول الديناميكية أم لا.
    -s-عدد الأجزاء(اختياري) عدد الأجزاء
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +
    ## For array field: --schema-field support <fieldName>:<dataType>:<maxCapacity>:<elementDataType>(:<maxLength>if Varchar)
    +
    +milvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'
    +
    +

    إنشاء قسم

    إنشاء قسم.

    +

    بناء الجملة

    +
    create partition -c (text) -p (text) [-d (text)]
    +
    +

    الخيارات

    + + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -p-التقسيماسم القسم.
    -d-الوصف(اختياري) وصف القسم.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > create partition -c car -p new_partition -d test_add_partition
    +
    +

    إنشاء فهرس

    إنشاء فهرس لحقل ما.

    +
    تدعم المجموعة حاليًا فهرسًا واحدًا كحد أقصى.
    +

    بناء الجملة

    +
    create index
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +

    لإنشاء فهرس لحقل ومطالبته بالإدخال المطلوب:

    +
    milvus_cli > create index
    +
    +Collection name (car, car2): car2
    +
    +The name of the field to create an index for (vector): vector
    +
    +Index name: vectorIndex
    +
    +# Default is ''
    +Index type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT
    +
    +# Default is ''
    +Index metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:
    +
    +Timeout []:
    +
    +

    حذف مستخدم

    حذف مستخدم

    +

    بناء الجملة

    delete user -u (text)
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -u-اسم المستخدماسم المستخدم.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    milvus_cli > delete user -u zilliz
    +
    +

    حذف الدور

    حذف الدور في ميلفوس

    +

    بناء الجملة

    +
    delete role -r (text)
    +
    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -r-roleNameاسم دور دور ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    أمثلة

    يقوم المثال التالي بحذف الدور role1 في ميلفوس.

    +
    milvus_cli > delete role -r role1
    +
    +

    حذف الاسم المستعار

    حذف اسم مستعار.

    +

    بناء الجملة

    +
    delete alias -a (text)
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم المستعارالوصف
    -a-الاسم المستعار-الاسم المستعارالاسم المستعار.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    حذف مجموعة

    حذف مجموعة.

    +

    بناء الجملة

    +
    delete collection -c (text)
    +
    +

    خيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة المراد حذفها.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > delete collection -c car
    +
    +

    حذف الكيانات

    حذف الكيانات.

    +

    بناء الجملة

    +
    delete entities -c (text) -p (text)
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي تنتمي إليها الكيانات المراد حذفها.
    -p-قسم(اختياري) اسم القسم المراد حذفه.
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +
    milvus_cli > delete entities -c car
    +
    +The expression to specify entities to be deleted, such as "film_id in [ 0, 1 ]": film_id in [ 0, 1 ]
    +
    +You are trying to delete the entities of collection. This action cannot be undone!
    +
    +Do you want to continue? [y/N]: y
    +
    +

    حذف قسم

    حذف قسم.

    +

    بناء الجملة

    +
    delete partition -c (text) -p (text)
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي ينتمي إليها القسم المراد حذفه.
    -p-قسماسم القسم المراد حذفه.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > delete partition -c car -p new_partition
    +
    +

    حذف الفهرس

    يقوم بحذف فهرس وملفات الفهرس المقابلة.

    +
    تدعم المجموعة حالياً فهرساً واحداً كحد أقصى.
    +

    بناء الجملة

    +
    delete index -c (text) -in (text)
    +
    +

    خيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -في-اسم الفهرساسم اسم الفهرس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > delete index -c car -in indexName
    +
    +

    منح دور

    منح دور للمستخدم

    +

    بناء الجملة

    +

    خيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -r-roleNameاسم دور دور ميلفوس.
    -u-اسم المستخدماسم المستخدم لمستخدم ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    grant role -r role1 -u user1
    +
    +

    منح امتياز

    تعيين امتياز لدور ما.

    +

    بناء الجملة

    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +
    grant privilege
    +
    +

    إبطال الدور

    إبطال الدور المعين لمستخدم.

    +

    بناء الجملة

    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -r-roleNameاسم دور دور ميلفوس.
    -u-اسم المستخدماسم المستخدم لمستخدم ميلفوس.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    grant role -r role1 -u user1
    +
    +

    إبطال امتياز

    إبطال امتياز تم تعيينه مسبقاً لدور ما.

    +

    بناء الجملة

    +

    الخيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +
    revoke privilege
    +
    +

    إظهار المجموعة

    يعرض المعلومات التفصيلية للمجموعة.

    +

    بناء الجملة

    +
    show collection -c (text)
    +
    +

    الخيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > show collection -c test_collection_insert
    +
    +

    إظهار القسم

    يعرض المعلومات التفصيلية لقسم ما.

    +

    بناء الجملة

    +
    show partition -c (text) -p (text)
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي ينتمي إليها القسم.
    -p-قسماسم القسم.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال

    +
    milvus_cli > show partition -c test_collection_insert -p _default
    +
    +

    إظهار الفهرس

    يعرض المعلومات التفصيلية للفهرس.

    +

    بناء الجملة

    +
    show index -c (text) -in (text)
    +
    +

    الخيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -في-اسم الفهرساسم الفهرس.
    +

    |-المساعدة |عرض التعليمات الخاصة باستخدام الأمر. |

    +

    مثال

    +
    milvus_cli > show index -c test_collection -in index_name
    +
    +

    خروج

    يغلق نافذة سطر الأوامر.

    +

    بناء الجملة

    +
    exit
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    تعليمات

    يعرض تعليمات استخدام الأمر.

    +

    بناء الجملة

    +
    help <command>
    +
    +

    الأوامر

    + + + + + + + + + + + + + + + + + + + + + + + + +
    الأمرالوصف
    مسحمسح الشاشة.
    الاتصاليتصل بميلفوس.
    إنشاءإنشاء مجموعة وقاعدة بيانات وقسم ومستخدم ودور وفهرس.
    منحمنح الدور والامتياز.
    إبطالإبطال الدور والامتياز .
    حذفحذف المجموعة أو قاعدة البيانات أو القسم أو الاسم المستعار أو المستخدم أو الدور أو الفهرس.
    إنهاءيغلق نافذة سطر الأوامر.
    تعليماتيعرض تعليمات استخدام الأمر.
    إدراجيستورد البيانات إلى قسم.
    قائمةسرد المجموعات أو قواعد البيانات أو الأقسام أو المستخدمين أو الأدوار أو المنح أو الفهارس.
    تحميلتحميل مجموعة أو قسم.
    استعلاميعرض نتائج الاستعلام التي تطابق جميع المعايير التي تقوم بإدخالها.
    إصدارتحرير مجموعة أو قسم.
    بحثإجراء بحث تشابه متجه أو بحث مختلط.
    إظهارإظهار الاتصال أو قاعدة البيانات أو المجموعة أو التحميل_التقدم أو الفهرس_التقدم.
    إعادة تسميةإعادة تسمية المجموعة
    استخداماستخدام قاعدة البيانات
    الإصداريعرض إصدار Milvus_CLI.
    +

    استيراد

    يستورد البيانات المحلية أو البعيدة إلى قسم.

    +

    بناء الجملة

    +
    import -c (text)[-p (text)] <file_path>
    +
    +

    خيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي يتم إدراج البيانات فيها.
    -p-قسم(اختياري) اسم القسم الذي يتم إدراج البيانات فيه. يشير عدم تمرير خيار القسم هذا إلى اختيار القسم "_default".
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    مثال 1

    +يستورد المثال التالي ملف CSV محلي.

    +
    milvus_cli > import -c car 'examples/import_csv/vectors.csv'
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    المثال 2

    +يستورد المثال التالي ملف CSV عن بعد.

    +
    milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-
    +io/milvus_cli/main/examples/import_csv/vectors.csv'
    +
    +Reading file from remote URL.
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    سرد المستخدمين

    سرد كافة المستخدمين.

    +

    بناء الجملة

    list users
    +
    +

    خيارات

    |الخيار |الاسم الكامل |الوصف |-المساعدة |عرض التعليمات الخاصة باستخدام الأمر. |

    +

    سرد الأدوار

    سرد الأدوار في ملفوس

    +

    بناء الجملة

    +
    list roles
    +
    +

    خيارات

    + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    أمثلة

    milvus_cli > list roles
    +
    +

    سرد المنح

    سرد المنح في ميلفوس

    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -r-roleNameاسم دور دور ميلفوس.
    -o-اسم الكائناسم الكائن الخاص بكائن ميلفوس.
    -t-نوع الكائنعام أو مجموعة أو مستخدم.
    -مساعدةغير متاحيعرض تعليمات استخدام الأمر.
    +

    أمثلة

    milvus_cli > list grants -r role1 -o object1 -t Collection
    +
    +

    سرد المجموعات

    سرد كافة المجموعات.

    +

    بناء الجملة

    +
    list collections
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    قائمة الفهارس

    يسرد كافة الفهارس الخاصة بمجموعة ما.

    +
    تدعم المجموعة حاليًا فهرسًا واحدًا كحد أقصى.
    +

    بناء الجملة

    +
    list indexes -c (text)
    +
    +

    الخيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    سرد الأقسام

    يسرد كافة أقسام المجموعة.

    +

    بناء الجملة

    +
    list partitions -c (text)
    +
    +

    خيارات

    + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    تحميل

    تحميل مجموعة أو قسم من مساحة القرص الصلب إلى ذاكرة الوصول العشوائي.

    +

    بناء الجملة

    +
    load -c (text) [-p (text)]
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي ينتمي إليها القسم.
    -p-قسم(اختياري/متعدد) اسم القسم.
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    استعلام

    يعرض نتائج الاستعلام التي تطابق كافة المعايير التي تقوم بإدخالها.

    +

    بناء الجملة

    +
    query
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    مثال

    +

    مثال 1

    +

    لإجراء استعلام والمطالبة بالإدخال المطلوب:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id in [ 428960801420883491, 428960801420883492,
    +428960801420883493 ]
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: color, brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    مثال 2

    +

    لإجراء استعلام ومطالبتك بالإدخال المطلوب:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id > 428960801420883491
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: id, color,
    +brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    تحرير

    تحرير مجموعة أو قسم من ذاكرة الوصول العشوائي.

    +

    بناء الجملة

    +
    release -c (text) [-p (text)]
    +
    +

    خيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي ينتمي إليها القسم.
    -p-قسم(اختياري/متعدد) اسم القسم.
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    إجراء بحث تشابه متجه أو بحث هجين.

    +

    +
    search
    +
    +

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    +

    +

    لإجراء بحث على ملف csv ومطالبتك بالإدخال المطلوب:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file
    +out headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    لإجراء بحث على مجموعة مفهرسة ومطالبتك بالإدخال المطلوب:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):
    +    [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    لإجراء بحث على مجموعة غير مفهرسة ومطالبتك بالإدخال المطلوب: مثال 3:

    +
    milvus_cli > search
    +
    +Collection name (car, car2): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []:
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []:
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    سرد الاتصالات

    سرد الاتصالات.

    +

    بناء الجملة

    +
    list connections
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +

    إظهار تقدم الفهرسة

    يعرض تقدم فهرسة الكيانات.

    +

    بناء الجملة

    +
    show index_progress -c (text) [-i (text)]
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي تنتمي إليها الكيانات.
    -i-الفهرس(اختياري) اسم الفهرس.
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    إظهار تقدم التحميل

    يعرض تقدم تحميل مجموعة ما.

    +

    بناء الجملة

    +
    show loading_progress -c (text) [-p (text)]
    +
    +

    الخيارات

    + + + + + + + + + +
    الخيارالاسم الكاملالوصف
    -c-اسم المجموعةاسم المجموعة التي تنتمي إليها الكيانات.
    -p-قسم(اختياري/متعدد) اسم قسم التحميل.
    -مساعدةغير متوفريعرض التعليمات الخاصة باستخدام الأمر.
    +

    الإصدار

    يعرض إصدار Milvus_CLI.

    +

    بناء الجملة

    +
    version
    +
    +

    خيارات

    + + + + + + + +
    الخيارالاسم الكاملالوصف
    -مساعدةغير متوفريعرض تعليمات استخدام الأمر.
    +
    يمكنك أيضًا التحقق من إصدار Milvus_CLI في shell كما هو موضح في المثال التالي. في هذه الحالة، يعمل milvus_cli --version كأمر.
    +

    مثال

    +
    $ milvus_cli --version
    +Milvus_CLI v0.4.0
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.json b/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.json new file mode 100644 index 000000000..32b6d84f5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Command-Line Interface","anchorList":[{"label":"واجهة سطر الأوامر Milvus","href":"Milvus-Command-Line-Interface","type":1,"isActive":false},{"label":"الإصدار الموصى به","href":"Recommended-version","type":2,"isActive":false},{"label":"الإصدار الحالي","href":"Current-version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.md b/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.md new file mode 100644 index 000000000..15dff1de7 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/cli_overview.md @@ -0,0 +1,78 @@ +--- +id: cli_overview.md +summary: >- + واجهة سطر الأوامر Milvus (CLI) هي أداة سطر أوامر تدعم الاتصال بقاعدة البيانات + وعمليات البيانات واستيراد البيانات وتصديرها. +title: واجهة سطر الأوامر Milvus +--- +

    واجهة سطر الأوامر Milvus

    واجهة سطر الأوامر Milvus (CLI) هي أداة سطر أوامر تدعم الاتصال بقاعدة البيانات وعمليات البيانات واستيراد البيانات وتصديرها. استنادًا إلى Milvus Python SDK، فهي تسمح بتنفيذ الأوامر من خلال محطة طرفية باستخدام مطالبات سطر الأوامر التفاعلية.

    +

    في الجدول التالي، يمكنك العثور على الإصدارات الموصى بها من PyMilvus و Milvus_CLI وفقًا لإصدار Milvus الذي تستخدمه.

    + + + + + + + + + + + + + + + + + + + + + +
    ميلفوسPyMilvusMilvus_CLI
    1.0.x1.0.1x
    1.1.x1.1.2x
    2.0.0.0-RC12.0.0.0RC1x
    2.0.0.0-RC22.0.0.0RC20.1.3
    2.0.0-RC42.0.0.0RC40.1.4
    2.0.0-RC52.0.0.0RC50.1.5
    2.0.0-RC62.0.0.0RC60.1.6
    2.0.0-RC72.0.0.0RC70.1.7
    2.0.0-RC82.0.0.0RC80.1.8
    2.0.0-RC92.0.0.0RC90.1.9
    2.1.02.1.00.3.0
    2.2.x2.2.x0.4.0
    2.3.x2.3.x0.4.2
    2.4.x2.4.x1.0.0
    2.4.x2.4.x1.0.1
    +
    لا يتوافق الإصدار Milvus 2.0.0-RC7 والإصدارات الأحدث مع الإصدار 2.0.0-RC6 والإصدارات الأقدم بسبب التغييرات التي تم إجراؤها على تنسيقات التخزين.
    +

    الإصدار الحالي

    الإصدار الحالي من Milvus_CLI هو 1.0.1. للعثور على الإصدار المثبت لديك ومعرفة ما إذا كنت بحاجة إلى التحديث، قم بتشغيل milvus_cli --version.

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/install_cli.json b/localization/v2.5.x/site/ar/userGuide/tools/install_cli.json new file mode 100644 index 000000000..c5ed23700 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/install_cli.json @@ -0,0 +1 @@ +{"codeList":["pip install milvus-cli\n","$ docker run -it zilliz/milvus_cli:latest\n","git clone https://github.com/zilliztech/milvus_cli.git\n","cd milvus_cli\n","python -m pip install --editable .\n"],"headingContent":"Install Milvus_CLI","anchorList":[{"label":"تثبيت Milvus_CLI","href":"Install-MilvusCLI","type":1,"isActive":false},{"label":"التثبيت من PyPI","href":"Install-from-PyPI","type":2,"isActive":false},{"label":"التثبيت باستخدام Docker","href":"Install-with-Docker","type":2,"isActive":false},{"label":"التثبيت من التعليمات البرمجية المصدرية","href":"Install-from-source-code","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/install_cli.md b/localization/v2.5.x/site/ar/userGuide/tools/install_cli.md new file mode 100644 index 000000000..e3c4003bf --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/install_cli.md @@ -0,0 +1,100 @@ +--- +id: install_cli.md +summary: تعرف على كيفية تثبيت Milvus_CLI. +title: تثبيت Milvus_CLI +--- +

    تثبيت Milvus_CLI

    يصف هذا الموضوع كيفية تثبيت Milvus_CLI.

    +

    التثبيت من PyPI

    يمكنك تثبيت Milvus_CLI من PyPI.

    +

    المتطلبات الأساسية

    +

    التثبيت عبر pip

    قم بتشغيل الأمر التالي لتثبيت Milvus_CLI.

    +
    pip install milvus-cli
    +
    +

    التثبيت باستخدام Docker

    يمكنك تثبيت Milvus_CLI باستخدام Docker.

    +

    المتطلبات الأساسية

    مطلوب Docker 19.03 أو أحدث.

    +

    التثبيت بناءً على صورة Docker

    $ docker run -it zilliz/milvus_cli:latest
    +
    +

    التثبيت من التعليمات البرمجية المصدرية

      +
    1. قم بتشغيل الأمر التالي لتنزيل مستودع milvus_cli.
    2. +
    +
    git clone https://github.com/zilliztech/milvus_cli.git
    +
    +
      +
    1. قم بتشغيل الأمر التالي للدخول إلى المجلد milvus_cli.
    2. +
    +
    cd milvus_cli
    +
    +
      +
    1. قم بتشغيل الأمر التالي لتثبيت Milvus_CLI.
    2. +
    +
    python -m pip install --editable .
    +
    +

    وبدلاً من ذلك، يمكنك تثبيت Milvus_CLI من ملف tarball مضغوط (.tar.gz ). قم بتنزيل ملف tarball وتشغيل python -m pip install milvus_cli-<version>.tar.gz.

    +

    التثبيت من ملف .exe

    تنطبق طريقة التثبيت هذه على نظام ويندوز فقط.
    +

    قم بتنزيل ملف .exe من GitHub وقم بتشغيله لتثبيت Milvus_CLI. في حالة نجاحه، يظهر milvus_cli-<version>.exe كما هو موضح في الشكل التالي.

    +

    + + Milvus_CLI + Milvus_CLI

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json new file mode 100644 index 000000000..c608037db --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across Buckets","anchorList":[{"label":"الترحيل بين المثيلات عبر الدلاء","href":"Migrate-Between-Instances-Across-Buckets","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية**","href":"Prerequisites","type":2,"isActive":false},{"label":"النسخ الاحتياطي لمجموعة من milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"استعادة النسخة الاحتياطية إلى milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md new file mode 100644 index 000000000..1f2c882de --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md @@ -0,0 +1,203 @@ +--- +id: cross-bucket-backup-and-restore.md +summary: >- + يشرح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مجموعة من مثيل + Milvus واستعادتها إلى مثيل آخر +title: الترحيل بين المثيلات عبر الدلاء +--- +

    الترحيل بين المثيلات عبر الدلاء

    يوضح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مثيل Milvus واستعادتها إلى مثيل آخر، مع استخدام كل مثيل دلاء مختلفة داخل نفس مخزن الكائنات.

    +

    نظرة عامة

    يوضح الرسم البياني أدناه عملية النسخ الاحتياطي والاستعادة باستخدام دلاء مختلفة داخل نفس وحدة تخزين الكائنات.

    +

    + + cross-bucket-backup-and-restore.png + النسخ الاحتياطي والاستعادة عبر الدلو. png

    +

    لنفترض أن لدينا مثيلين من Milvus، milvus_A و milvus_B ، وكلاهما يستخدم محرك التخزين الافتراضي MinIO لتخزين الكائنات. تستخدم هاتان المثيلتان دلاء مختلفة الدلو_A و bucket_B داخل نفس مخزن الكائنات. في هذا المثال، هدفنا هو إكمال المهام التالية:

    +
      +
    1. إنشاء نسخة احتياطية (my_backup) للمجموعة coll في bucket_A وتخزين النسخة الاحتياطية في bucket_B.

    2. +
    3. في bucket_B ، الاستعادة من النسخة الاحتياطية وتسمية المجموعة المستعادة coll_bak.

    4. +
    +

    المتطلبات الأساسية**

      +
    • تأكد من تثبيت أداة النسخ الاحتياطي Milvus-backup.

    • +
    • تعرف على تكوين إعدادات تخزين كائنات ميلفوس. للحصول على التفاصيل، راجع تخزين الكائنات.

    • +
    +

    النسخ الاحتياطي لمجموعة من milvus_A

    الخطوة 1: إعداد التكوين

    انتقل إلى دليل مشروع النسخ الاحتياطي لـ milvus-backup وأنشئ دليلاً باسم التكوينات:

    +
    mkdir configs
    +cd configs
    +
    +

    قم بتنزيل ملف التكوين الاحتياطي backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    تبدو بنية الملف هكذا:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    الخطوة 2: تحرير ملف التكوين

    قم بتعديل ملف backup.yaml لتعيين التكوينات المناسبة لـmilvus_A:

    +
      +
    • تكوينات الاتصال

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: عنوان IP أو اسم المضيف للخادم milvus_A.

      • +
      • milvus.port: منفذ TCP الذي يستمع إليه خادم ميلفوس (الافتراضي 19530).

      • +
    • +
    • تكوينات التخزين (إعدادات MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: localhost # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: اسم الدلو المستخدم لتخزين البيانات في milvus_A. في هذا المثال، تم تعيينه إلى bucket_A.

    • +
    • minio.rootPath: المسار الجذر داخل الدلو حيث يتم تخزين البيانات من milvus_A. في هذا المثال، تم التعيين إلى files.

    • +
    • minio.backupBucketName: اسم الدلو المستخدم للتخزين الاحتياطي فيmilvus_B. في هذا المثال، يستخدم milvus_A و milvus_B دلاء مختلفة. لذلك، قم بالتعيين إلى bucket_B.

    • +
    • minio.backupRootPath: المسار الجذر داخل الدلو المخصص لتخزين ملفات النسخ الاحتياطي في milvus_B. في هذا المثال، اضبط على backup.

    • +
    +

    الخطوة 3: إنشاء نسخة احتياطية

    بمجرد حفظ backup.yaml، قم بإنشاء نسخة احتياطية باسم my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    ينشئ هذا الأمر النسخة الاحتياطية bucket_B/backup/my_backup في تخزين الكائنات للمجموعة coll.

    +

    استعادة النسخة الاحتياطية إلى milvus_B

    الخطوة 1: تكوين إعدادات الاستعادة

    كرر الخطوة 2 لتعديل التكوينات للاستعادة إلى milvus_B ، مع التأكد من ضبط minio.bucketName على bucket_B.

    +

    إليك نموذج تكوين

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +...
    +
    +

    الخطوة 2: استعادة النسخة الاحتياطية

    استعادة النسخة الاحتياطية إلى milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    يستعيد هذا الأمر النسخة الاحتياطية إلى مجموعة جديدة باسم coll_bak في milvus_B ، مع تخزين البيانات في bucket_B/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json new file mode 100644 index 000000000..106c49be4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","# configure a Minio host\nmc alias set my_minio https:// \n","# List the available buckets\nmc ls my_minio\n","# Download a bucket recursively\nmc cp --recursive my_minio/ \n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across S3 Environments","anchorList":[{"label":"الترحيل بين المثيلات عبر بيئات S3","href":"Migrate-Between-Instances-Across-S3-Environments","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"النسخ الاحتياطي لمجموعة من milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"قم بنقل النسخة الاحتياطية يدويًا إلى milvus_B","href":"Manually-transfer-the-backup-to-milvusB","type":2,"isActive":false},{"label":"الاستعادة من النسخة الاحتياطية إلى milvus_B","href":"Restore-from-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md new file mode 100644 index 000000000..69a524b42 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md @@ -0,0 +1,246 @@ +--- +id: multi-storage-backup-and-restore.md +summary: >- + يشرح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مجموعة من مثيل + Milvus واستعادتها إلى مثيل آخر +title: الترحيل بين المثيلات عبر بيئات S3 +--- +

    الترحيل بين المثيلات عبر بيئات S3

    يوضح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مثيل Milvus واستعادتها إلى مثيل آخر، مع استخدام كل مثيل لمخزن كائنات مختلف.

    +

    نظرة عامة

    يوضح الرسم البياني أدناه عملية النسخ الاحتياطي والاستعادة باستخدام وحدات تخزين كائنات مختلفة.

    +

    + + multi-storage-backup-and-restore.png + النسخ الاحتياطي والاستعادة متعدد المخازن. png

    +

    لنفترض أن لدينا مثيلين من Milvus، milvus_A و milvus_B ، باستخدام وحدة تخزين كائنات مختلفة. في هذا المثال، هدفنا هو إكمال المهام التالية:

    +
      +
    1. قم بإنشاء نسخة احتياطية (my_backup) للمجموعة coll في bucket_A من مخزن الكائناتmilvus_A.

    2. +
    3. انقل النسخة الاحتياطية my_backup إلى bucket_B من وحدة تخزين الكائنات milvus_B.

    4. +
    +

    في bucket_B ، قم بالاستعادة من النسخة الاحتياطية وقم بتسمية المجموعة المستعادة coll_bak.

    +

    المتطلبات الأساسية

      +
    • تأكد من تثبيت أداة النسخ الاحتياطي Milvus-backup.

    • +
    • تعرف على تكوين إعدادات تخزين كائنات ميلفوس. لمزيد من التفاصيل، راجع تخزين الكائنات.

    • +
    +

    النسخ الاحتياطي لمجموعة من milvus_A

    الخطوة 1: إعداد التكوين

    انتقل إلى دليل مشروع النسخ الاحتياطي لـ milvus-backup وأنشئ دليلاً باسم التكوينات:

    +
    mkdir configs
    +cd configs
    +
    +

    قم بتنزيل ملف التكوين الاحتياطي backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    تبدو بنية الملف هكذا:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    الخطوة 2: تحرير ملف التكوين

    قم بتعديل الملف backup.yaml لتعيين التكوينات المناسبة لملف milvus_A:

    +
      +
    • تكوينات الاتصال

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: عنوان IP أو اسم المضيف لخادم milvus_A.

      • +
      • milvus.port: منفذ TCP الذي يستمع إليه خادم Milvus (الافتراضي 19530).

      • +
    • +
    • تكوينات التخزين (إعدادات MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: minio_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: اسم الدلو المستخدم لتخزين البيانات في milvus_A. في هذا المثال، تم تعيينه إلى bucket_A.

    • +
    • minio.rootPath: المسار الجذر داخل الدلو حيث يتم تخزين البيانات من milvus_A. في هذا المثال، تم التعيين إلى files.

    • +
    • minio.backupBucketName: اسم الدلو المستخدم للتخزين الاحتياطي. في هذا المثال، تم التعيين إلى bucket_A.

    • +
    • minio.backupRootPath: : المسار الجذر داخل الدلو المخصص لتخزين ملفات النسخ الاحتياطي في milvus_B. في هذا المثال، اضبط على backup.

    • +
    +

    الخطوة 3: إنشاء نسخة احتياطية

    بمجرد حفظ backup.yaml، قم بإنشاء نسخة احتياطية باسم my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    ينشئ هذا الأمر النسخة الاحتياطية bucket_A/backup/my_backup في مخزن الكائنات في milvus_A.

    +

    قم بنقل النسخة الاحتياطية يدويًا إلى milvus_B

    نظرًا لأن milvus_A و milvus_B يستخدمان وحدة تخزين كائنات مختلفة، فأنت بحاجة إلى تنزيل النسخة الاحتياطية يدويًا من وحدة تخزين ميلفوس_أ وتحميلها إلى وحدة تخزينmilvus_B.

    +

    استخدام وحدة تحكم MinIO

    +
      +
    1. قم بتسجيل الدخول إلى وحدة تحكم MinIO.

    2. +
    3. حدد موقع الدلو المحدد في minio.address لـ milvus_A.

    4. +
    5. حدد ملفات النسخ الاحتياطي في الدلو.

    6. +
    7. انقر فوق تنزيل لتنزيل الملفات إلى جهازك.

    8. +
    +

    استخدام عميل mc

    +

    بدلاً من ذلك، يمكنك استخدام عميل mc لتنزيل ملفات النسخ الاحتياطية:

    +
      +
    1. تكوين مضيف MinIO:
    2. +
    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +
      +
    1. سرد الدلاء المتاحة:
    2. +
    +
    # List the available buckets
    +mc ls my_minio
    +
    +
      +
    1. تنزيل دلو بشكل متكرر:
    2. +
    +
    # Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    بمجرد تنزيل ملفات النسخ الاحتياطية، يمكنك تحميلها إلى وحدة تخزين الكائنات التي يستخدمها milvus_B للاستعادة المستقبلية. بدلاً من ذلك، يمكنك تحميل النسخة الاحتياطية إلى Zilliz Cloud لإنشاء قاعدة بيانات متجهة مُدارة ببياناتك. لمزيد من التفاصيل، راجع الترحيل من ميلفوس إلى زيليز كلاود.

    +

    الاستعادة من النسخة الاحتياطية إلى milvus_B

    الخطوة 1: تكوين إعدادات الاستعادة

    كرر الخطوة 2 لتعديل التكوينات للاستعادة إلى milvus_B ، مع التأكد من ضبط minio.bucketName على bucket_B.

    +

    إليك نموذج تهيئة

    +
    # milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: minio_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    الخطوة 2: الاستعادة من النسخة الاحتياطية

    استعادة النسخة الاحتياطية إلى milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    يعمل هذا الأمر على استعادة النسخة الاحتياطية إلى مجموعة جديدة باسم coll_bak فيmilvus_B ، مع تخزين البيانات في bucket_B/files/insert_log/[ID of new collection] داخل مخزن الكائنات milvus_B.

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json new file mode 100644 index 000000000..ad0968afa --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_A\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_B\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n ...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances in One Bucket (Different Root Paths)","anchorList":[{"label":"الترحيل بين المثيلات في دلو واحد (مسارات جذر مختلفة)","href":"Migrate-Between-Instances-in-One-Bucket-Different-Root-Paths","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"قم بعمل نسخة احتياطية من مجموعة من milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"استعادة النسخة الاحتياطية إلى milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md new file mode 100644 index 000000000..f6a1ee76b --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md @@ -0,0 +1,198 @@ +--- +id: shared-bucket-backup-and-restore.md +summary: >- + يشرح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مثيل Milvus + واستعادتها إلى مثيل آخر أثناء استخدام دلو مشترك لتخزين الكائنات +title: الترحيل بين المثيلات في دلو واحد (مسارات جذر مختلفة) +--- +

    الترحيل بين المثيلات في دلو واحد (مسارات جذر مختلفة)

    يوضح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة من مثيل Milvus واستعادتها إلى مثيل آخر أثناء استخدام دلو مشترك لتخزين الكائنات، مع وجود مسارات جذر مختلفة لكل مثيل.

    +

    نظرة عامة

    يوضح الرسم البياني أدناه عملية النسخ الاحتياطي والاستعادة باستخدام دلو مشترك.

    +

    + + shared-bucket-backup-and-restore.png + دلو مشترك للنسخ الاحتياطي والاستعادة. png

    +

    لنفترض أن لدينا مثيلات Milvus، milvus_A و milvus_B ، وكلاهما يستخدم محرك التخزين الافتراضي MinIO لتخزين الكائنات. يشترك هذان المثيلان في نفس الدلو، bucket_A ، ولكنهما يخزنان بياناتهما في مسارات جذر مختلفة: files_A ل milvus_A والملفات_B ل milvus_B. في هذا المثال، هدفنا هو إكمال المهام التالية:

    +
      +
    1. إنشاء نسخة احتياطية (my_backup) للمجموعة coll المخزنة تحت مسارfiles_A لـ milvus_A.

    2. +
    3. الاستعادة من النسخة الاحتياطية وتخزينها في files_B لـ milvus_B.

    4. +
    +

    المتطلبات الأساسية

      +
    • تأكد من تثبيت أداة النسخ الاحتياطي Milvus-backup.

    • +
    • تعرف على تكوين إعدادات تخزين كائنات Milvus. للحصول على التفاصيل، راجع تخزين الكائنات.

    • +
    +

    قم بعمل نسخة احتياطية من مجموعة من milvus_A

    الخطوة 1: إعداد التكوين

    انتقل إلى دليل مشروع milvus-backup وأنشئ دليلاً باسم التكوينات:

    +
    mkdir configs
    +cd configs
    +
    +

    قم بتنزيل ملف التكوين الاحتياطي backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    تبدو بنية الملف هكذا:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    الخطوة 2: تحرير ملف التكوين

    قم بتعديل ملف backup.yaml لتعيين التكوينات المناسبة لـmilvus_A:

    +
      +
    • تكوينات الاتصال

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: عنوان IP أو اسم المضيف للخادم milvus_A.

      • +
      • milvus.port: منفذ TCP الذي يستمع إليه خادم ميلفوس (الافتراضي 19530).

      • +
    • +
    • تكوينات التخزين (إعدادات MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: milvus_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files_A" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
      +
        +
      • minio.bucketName: اسم الدلو المستخدم للتخزين milvus_A. في هذا المثال، اضبط على bucket_A.

      • +
      • minio.rootPath: المسار الجذر داخل الدلو حيث يتم تخزين البيانات من milvus_A. في هذا المثال، تم التعيين إلى files_A.

      • +
      • minio.backupBucketName: اسم الدلو المستخدم للتخزين. في هذا المثال، milvus_A و milvus_B يشتركان في الدلو. لذلك، قم بالتعيين إلىbucket_A.

      • +
      • minio.backupRootPath: المسار الجذر داخل الدلو المخصص لتخزين ملفات النسخ الاحتياطي في milvus_B. في هذا المثال، استخدم مسارًا مختلفًا عن milvus_A. لذلك، قم بالتعيين إلى backup.

      • +
    • +
    +

    الخطوة 3: إنشاء نسخة احتياطية

    بمجرد حفظ backup.yaml ، قم بإنشاء نسخة احتياطية باسم my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    يقوم هذا الأمر بإنشاء نسخة احتياطية bucket_A/backup/my_backup في مخزن الكائنات للمجموعة coll.

    +

    استعادة النسخة الاحتياطية إلى milvus_B

    الخطوة 1: تكوين إعدادات الاستعادة

    كرر الخطوة 2 لتعديل التكوينات للاستعادة إلى milvus_B ، مع التأكد من تعيين minio.bucketName إلى bucket_A و minio.rootPath إلى files_B لتمييز مواقع التخزين بين المثيلين.

    +

    إليك نموذج تكوين:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: milvus_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files_B" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +  ...
    +
    +

    الخطوة 2: استعادة النسخة الاحتياطية

    استعادة النسخة الاحتياطية إلى milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    يستعيد هذا الأمر النسخة الاحتياطية إلى مجموعة جديدة باسم coll_bak في milvus_B ، مع تخزين البيانات في bucket_A/files_B/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json new file mode 100644 index 000000000..f6d483ae0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Backup and Restore in One Instance","anchorList":[{"label":"النسخ الاحتياطي والاستعادة في مثيل واحد","href":"Backup-and-Restore-in-One-Instance","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"النسخ الاحتياطي للمجموعة","href":"Back-up-the-collection","type":2,"isActive":false},{"label":"الاستعادة من النسخة الاحتياطية داخل milvus_A","href":"Restore-from-the-backup-within-milvusA","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md new file mode 100644 index 000000000..66aadf51e --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md @@ -0,0 +1,142 @@ +--- +id: single-instance-backup-and-restore.md +summary: >- + يوضح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة ما واستعادتها من + النسخة الاحتياطية داخل نفس مثيل Milvus +title: النسخ الاحتياطي والاستعادة في مثيل واحد +--- +

    النسخ الاحتياطي والاستعادة في مثيل واحد

    يوضح هذا الموضوع بالتفصيل عملية النسخ الاحتياطي لمجموعة واستعادتها من النسخة الاحتياطية داخل نفس مثيل Milvus.

    +

    نظرة عامة

    يوضح الرسم البياني أدناه عملية النسخ الاحتياطي والاستعادة ضمن مثيل Milvus واحد.

    +

    + + single-instance-backup-and-restore.png + النسخ الاحتياطي والاستعادة من مثيل واحد. png

    +

    لنفترض أن لدينا مثيل Milvus، milvus_A ، باستخدام دلو باسمbucket_A لتخزين البيانات. في هذا المثال، هدفنا هو إكمال المهام التالية:

    +
      +
    1. إنشاء نسخة احتياطية (my_backup) للمجموعة coll في bucket_A.

    2. +
    3. الاستعادة من النسخة الاحتياطية وتسمية المجموعة المستعادة coll_bak.

    4. +
    +

    المتطلبات الأساسية

      +
    • تأكد من تثبيت أداة النسخ الاحتياطي Milvus-backup.

    • +
    • تعرف على تكوين إعدادات تخزين كائنات Milvus. للحصول على التفاصيل، راجع تخزين الكائنات.

    • +
    +

    النسخ الاحتياطي للمجموعة

    الخطوة 1: إعداد التكوين

    انتقل إلى دليل مشروع milvus-backup وأنشئ دليلاً باسم configs:

    +
    mkdir configs
    +cd configs
    +
    +

    قم بتنزيل ملف تكوين النسخ الاحتياطي backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    تبدو بنية الملف هكذا:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    الخطوة 2: تحرير ملف التكوين

    قم بتعديل ملف backup.yaml لتعيين التكوينات المناسبة لـmilvus_A. فيما يلي نموذج تكوين التخزين:

    +
    # Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    الخطوة 3: إنشاء نسخة احتياطية

    بمجرد حفظ backup.yaml، قم بإنشاء نسخة احتياطية باسم my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    يقوم هذا الأمر بإنشاء نسخة احتياطية bucket_A/backup/my_backup في مخزن الكائنات milvus_A.

    +

    الاستعادة من النسخة الاحتياطية داخل milvus_A

    بمجرد إنشاء النسخة الاحتياطية، يمكنك الاستعادة منها باستخدام الأمر أدناه:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    يستعيد هذا الأمر من النسخة الاحتياطية وينشئ مجموعة جديدة باسم coll_bak في milvus_A ، مع البيانات المخزنة في bucket_A/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.json new file mode 100644 index 000000000..8b5f0e179 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","./milvus-backup server\n","./milvus-backup server -p 443\n","python example/prepare_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/create' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"backup_name\": \"my_backup\",\n \"collection_names\": [\n \"hello_milvus\"\n ]\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/list' \\\n--header 'Content-Type: application/json'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=&backup_name=my_backup' \\\n--header 'Content-Type: application/json'\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"_recover\",\n \"backup_name\":\"my_backup\"\n}'\n","python example/clean_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"\",\n \"backup_name\":\"my_backup\"\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=' \\\n--header 'Content-Type: application/json'\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using APIs","anchorList":[{"label":"النسخ الاحتياطي واستعادة البيانات باستخدام واجهات برمجة التطبيقات","href":"Back-up-and-Restore-Data-Using-APIs","type":1,"isActive":false},{"label":"الحصول على النسخ الاحتياطي لميلفوس","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"إعداد ملف التكوين","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"بدء تشغيل خادم API","href":"Start-up-the-API-server","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-data","type":2,"isActive":false},{"label":"النسخ الاحتياطي للبيانات","href":"Back-up-data","type":2,"isActive":false},{"label":"استعادة البيانات","href":"Restore-data","type":2,"isActive":false},{"label":"التحقق من البيانات المستعادة","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.md new file mode 100644 index 000000000..8edfc9fc1 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_api.md @@ -0,0 +1,230 @@ +--- +id: milvus_backup_api.md +summary: تعلم كيفية استخدام Milvus Backup من خلال واجهة برمجة التطبيقات (API) +title: النسخ الاحتياطي واستعادة البيانات باستخدام واجهات برمجة التطبيقات +--- +

    النسخ الاحتياطي واستعادة البيانات باستخدام واجهات برمجة التطبيقات

    يوفر برنامج Milvus Backup ميزات النسخ الاحتياطي للبيانات واستعادتها لضمان أمان بيانات Milvus الخاصة بك.

    +

    الحصول على النسخ الاحتياطي لميلفوس

    يمكنك إما تنزيل النسخة الثنائية المجمعة أو الإنشاء من المصدر.

    +

    لتنزيل الإصدار الثنائي المترجم، انتقل إلى صفحة الإصدار، حيث يمكنك العثور على جميع الإصدارات الرسمية. تذكر، استخدم دائمًا الثنائيات الموجودة في الإصدار الذي يحمل علامة الأحدث.

    +

    للتجميع من المصدر، قم بما يلي:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    إعداد ملف التكوين

    قم بتنزيل ملف التكوين النموذجي وقم بتخصيصه ليناسب احتياجاتك.

    +

    ثم قم بإنشاء مجلد إلى جانب الإصدار الثنائي الذي تم تنزيله أو إنشاؤه من Milvus Backup، وقم بتسمية المجلد configs ، وضع ملف التكوين داخل المجلد configs.

    +

    يجب أن تكون بنية مجلدك مشابهة لما يلي:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    نظرًا لأن ملف Milvus Backup لا يمكنه نسخ بياناتك احتياطيًا إلى مسار محلي، تأكد من صحة إعدادات Minio عند تخصيص ملف التكوين.

    +
    +

    يختلف اسم دلو Minio الافتراضي باختلاف طريقة تثبيت Milvus. عند إجراء تغييرات على إعدادات Minio، قم بالرجوع إلى الجدول التالي.

    + + + + + + + + +
    الحقلدلو الإرساءهيلم / مشغل ميلفوس
    bucketNameدلوميلفوس-الدلو
    rootPathالملفاتملف
    +
    +

    بدء تشغيل خادم API

    ثم يمكنك بدء تشغيل خادم API على النحو التالي:

    +
    ./milvus-backup server
    +
    +

    يستمع خادم API على المنفذ 8080 افتراضيًا. يمكنك تغييره عن طريق تشغيله باستخدام العلامة -p. لبدء استماع خادم واجهة برمجة التطبيقات على المنفذ 443، قم بما يلي:

    +
    ./milvus-backup server -p 443
    +
    +

    يمكنك الوصول إلى واجهة مستخدم Swagger UI باستخدام http://localhost:/api/v1/docs/index.html.

    +

    إعداد البيانات

    إذا قمت بتشغيل مثيل Milvus محلي فارغ يستمع على المنفذ الافتراضي 19530، استخدم مثال البرامج النصية Python لإنشاء بعض البيانات في مثيلك. لا تتردد في إجراء التغييرات اللازمة على البرامج النصية لتناسب احتياجاتك.

    +

    احصل على البرامج النصية. ثم قم بتشغيل البرامج النصية لإنشاء البيانات. تأكد من تثبيت PyMilvus، وهي مجموعة أدوات تطوير البرمجيات الرسمية لـ Milvus Python SDK.

    +
    python example/prepare_data.py
    +
    +

    هذه الخطوة اختيارية. إذا تخطيت هذه الخطوة، تأكد من أن لديك بالفعل بعض البيانات في مثيل Milvus الخاص بك.

    +

    النسخ الاحتياطي للبيانات

    +

    لاحظ أن تشغيل النسخ الاحتياطي لـ Milvus Backup على مثيل Milvus لن يؤثر عادةً على تشغيل المثيل. يعمل مثيل Milvus الخاص بك بشكل كامل أثناء النسخ الاحتياطي أو الاستعادة.

    +

    قم بتشغيل الأمر التالي لإنشاء نسخة احتياطية. قم بتغيير collection_names و backup_name إذا لزم الأمر.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/create' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +  "async": true,
    +  "backup_name": "my_backup",
    +  "collection_names": [
    +    "hello_milvus"
    +  ]
    +}'
    +
    +

    بمجرد تنفيذ الأمر، يمكنك سرد النسخ الاحتياطية في الدلو المحدد في إعدادات Minio على النحو التالي:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/list' \
    +--header 'Content-Type: application/json'
    +
    +

    وتنزيل ملفات النسخ الاحتياطية على النحو التالي:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=<test_backup_id>&backup_name=my_backup' \
    +--header 'Content-Type: application/json'
    +
    +

    أثناء تشغيل الأمر أعلاه، قم بتغيير backup_id و backup_name إلى العنوان الذي تم إرجاعه بواسطة واجهة برمجة تطبيقات القائمة.

    +

    الآن، يمكنك حفظ ملفات النسخ الاحتياطية في مكان آمن لاستعادتها في المستقبل، أو تحميلها إلى Zilliz Cloud لإنشاء قاعدة بيانات متجهة مُدارة ببياناتك. لمزيد من التفاصيل، راجع الترحيل من ميلفوس إلى زيليز كلاود.

    +

    استعادة البيانات

    +

    يمكنك استدعاء أمر استعادة واجهة برمجة التطبيقات مع خيار collection_suffix لإنشاء مجموعة جديدة من خلال استعادة البيانات من النسخة الاحتياطية. قم بتغيير collection_names و backup_name إذا لزم الأمر.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "_recover",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    يتيح لك الخيار collection_suffix تعيين لاحقة للمجموعة الجديدة المراد إنشاؤها. سيؤدي الأمر أعلاه إلى إنشاء مجموعة جديدة تسمى hello_milvus_recover في مثيل Milvus الخاص بك.

    +

    إذا كنت تفضل استعادة المجموعة التي تم نسخها احتياطيًا دون تغيير اسمها، فقم بإسقاط المجموعة قبل استعادتها من النسخة الاحتياطية. يمكنك الآن تنظيف البيانات التي تم إنشاؤها في إعداد البيانات عن طريق تشغيل الأمر التالي.

    +
    python example/clean_data.py
    +
    +

    ثم قم بتشغيل الأمر التالي لاستعادة البيانات من النسخة الاحتياطية.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    يمكن أن تستغرق عملية الاستعادة وقتاً طويلاً اعتماداً على حجم البيانات المراد استعادتها. لذلك، يتم تشغيل جميع مهام الاستعادة بشكل غير متزامن. يمكنك التحقق من حالة مهمة الاستعادة عن طريق التشغيل:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=<test_restore_id>' \
    +--header 'Content-Type: application/json'
    +
    +

    تذكّر تغيير test_restore_id إلى تلك التي تمت استعادتها بواسطة واجهة برمجة تطبيقات الاستعادة.

    +

    التحقق من البيانات المستعادة

    بمجرد اكتمال الاستعادة، يمكنك التحقق من البيانات المستعادة عن طريق فهرسة المجموعة المستعادة على النحو التالي:

    +
    python example/verify_data.py
    +
    +

    لاحظ أن البرنامج النصي أعلاه يفترض أنك قمت بتشغيل الأمر restore مع العلم -s وتعيين اللاحقة على -recover. لا تتردد في إجراء التغييرات اللازمة على البرنامج النصي لتناسب حاجتك.

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.json new file mode 100644 index 000000000..bad0c8d87 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","python example/prepare_data.py\n","./milvus-backup create -n \n","# configure a Minio host\nmc alias set my_minio https:// \n\n# List the available buckets\nmc ls my_minio\n\n# Download a bucket recursively\nmc cp --recursive my_minio/ \n","./milvus-backup restore -n my_backup -s _recover\n","python example/clean_data.py\n","./milvus-backup restore -n my_backup\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using Commands","anchorList":[{"label":"النسخ الاحتياطي واستعادة البيانات باستخدام الأوامر","href":"Back-up-and-Restore-Data-Using-Commands","type":1,"isActive":false},{"label":"الحصول على النسخ الاحتياطي لميلفوس","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"إعداد ملف التكوين","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"إعداد البيانات","href":"Prepare-data","type":2,"isActive":false},{"label":"النسخ الاحتياطي للبيانات","href":"Back-up-data","type":2,"isActive":false},{"label":"استعادة البيانات","href":"Restore-data","type":2,"isActive":false},{"label":"تحقق من البيانات المستعادة","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.md new file mode 100644 index 000000000..c385f2ea0 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_cli.md @@ -0,0 +1,180 @@ +--- +id: milvus_backup_cli.md +summary: تعلم كيفية استخدام Milvus Backup من خلال CLI +title: النسخ الاحتياطي واستعادة البيانات باستخدام الأوامر +--- +

    النسخ الاحتياطي واستعادة البيانات باستخدام الأوامر

    يوفر برنامج Milvus Backup ميزات النسخ الاحتياطي للبيانات واستعادتها لضمان أمان بيانات Milvus الخاصة بك.

    +

    الحصول على النسخ الاحتياطي لميلفوس

    يمكنك إما تنزيل النسخة الثنائية المجمعة أو الإنشاء من المصدر.

    +

    لتنزيل الإصدار الثنائي المترجم، انتقل إلى صفحة الإصدار، حيث يمكنك العثور على جميع الإصدارات الرسمية. تذكر، استخدم دائمًا الثنائيات الموجودة في الإصدار الذي يحمل علامة الأحدث.

    +

    للتجميع من المصدر، قم بما يلي:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    إعداد ملف التكوين

    قم بتنزيل ملف التكوين النموذجي وقم بتخصيصه ليناسب احتياجاتك.

    +

    ثم قم بإنشاء مجلد إلى جانب الإصدار الثنائي الذي تم تنزيله أو إنشاؤه من Milvus Backup، وقم بتسمية المجلد configs ، وضع ملف التكوين داخل المجلد configs.

    +

    يجب أن تكون بنية مجلدك مشابهة لما يلي:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    نظرًا لأن ملف Milvus Backup لا يمكنه نسخ بياناتك احتياطيًا إلى مسار محلي، تأكد من صحة إعدادات Minio عند تخصيص ملف التكوين.

    +
    +

    يختلف اسم دلو Minio الافتراضي باختلاف طريقة تثبيت Milvus. عند إجراء تغييرات على إعدادات Minio، قم بالرجوع إلى الجدول التالي.

    + + + + + + + + +
    الحقلدلو الإرساءهيلم / مشغل ميلفوس
    bucketNameدلوميلفوس-الدلو
    rootPathالملفاتملف
    +
    +

    إعداد البيانات

    إذا قمت بتشغيل مثيل Milvus محلي فارغ على المنفذ الافتراضي، استخدم مثال البرامج النصية Python لإنشاء بعض البيانات في مثيلك. لا تتردد في إجراء التغييرات اللازمة على البرامج النصية لتناسب احتياجاتك.

    +

    احصل على البرامج النصية. ثم قم بتشغيل البرامج النصية لإنشاء البيانات. تأكّد من تثبيت PyMilvus، وهي مجموعة أدوات تطوير البرمجة الرسمية لـ Milvus Python SDK.

    +
    python example/prepare_data.py
    +
    +

    هذه الخطوة اختيارية. إذا تخطيت هذه الخطوة، تأكد من أن لديك بالفعل بعض البيانات في مثيل Milvus الخاص بك.

    +

    النسخ الاحتياطي للبيانات

    لاحظ أن تشغيل النسخ الاحتياطي لـ Milvus Backup على مثيل Milvus لن يؤثر عادةً على تشغيل المثيل. يعمل مثيل Milvus الخاص بك بشكل كامل أثناء النسخ الاحتياطي أو الاستعادة.

    +
    +

    قم بتشغيل الأمر التالي لإنشاء نسخة احتياطية.

    +
    ./milvus-backup create -n <backup_name>
    +
    +

    بمجرد تنفيذ الأمر، يمكنك التحقق من ملفات النسخ الاحتياطي في الدلو المحدد في إعدادات Minio. على وجه التحديد، يمكنك تنزيلها باستخدام Minio Console أو عميل mc.

    +

    للتنزيل من Minio Console، قم بتسجيل الدخول إلى Minio Console، وحدد موقع الدلو المحدد في minio.address ، وحدد الملفات الموجودة في الدلو، وانقر فوق تنزيل لتنزيلها.

    +

    إذا كنت تفضل عميل mc، فقم بما يلي:

    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +# List the available buckets
    +mc ls my_minio
    +
    +# Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    الآن، يمكنك حفظ ملفات النسخ الاحتياطية في مكان آمن لاستعادتها في المستقبل، أو تحميلها إلى Zilliz Cloud لإنشاء قاعدة بيانات متجهة مُدارة ببياناتك. لمزيد من التفاصيل، راجع الترحيل من ميلفوس إلى زيليز كلاود.

    +

    استعادة البيانات

    +

    يمكنك تشغيل الأمر restore باستخدام العلامة -s لإنشاء مجموعة جديدة من خلال استعادة البيانات من النسخة الاحتياطية:

    +
    ./milvus-backup restore -n my_backup -s _recover
    +
    +

    تسمح لك العلامة -s بتعيين لاحقة للمجموعة الجديدة المراد إنشاؤها. سيُنشئ الأمر أعلاه مجموعة جديدة تسمى hello_milvus_recover في مثيل Milvus الخاص بك.

    +

    إذا كنت تفضل استعادة المجموعة التي تم نسخها احتياطيًا دون تغيير اسمها، فقم بإسقاط المجموعة قبل استعادتها من النسخة الاحتياطية. يمكنك الآن تنظيف البيانات التي تم إنشاؤها في إعداد البيانات عن طريق تشغيل الأمر التالي.

    +
    python example/clean_data.py
    +
    +

    ثم قم بتشغيل الأمر التالي لاستعادة البيانات من النسخة الاحتياطية.

    +
    ./milvus-backup restore -n my_backup
    +
    +

    تحقق من البيانات المستعادة

    بمجرد اكتمال الاستعادة، يمكنك التحقق من البيانات المستعادة عن طريق فهرسة المجموعة المستعادة على النحو التالي:

    +
    python example/verify_data.py
    +
    +

    لاحظ أن البرنامج النصي أعلاه يفترض أنك قمت بتشغيل الأمر restore مع العلم -s وتعيين اللاحقة على -recover. لا تتردد في إجراء التغييرات اللازمة على البرنامج النصي لتناسب حاجتك.

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.json new file mode 100644 index 000000000..a9f9b0dd5 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Backup","anchorList":[{"label":"ميلفوس النسخ الاحتياطي","href":"Milvus-Backup","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"البنية","href":"Architecture","type":2,"isActive":false},{"label":"أحدث إصدار","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.md new file mode 100644 index 000000000..fa8f89619 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-backup/milvus_backup_overview.md @@ -0,0 +1,81 @@ +--- +id: milvus_backup_overview.md +summary: Milvus-Backup هي أداة تسمح للمستخدمين بالنسخ الاحتياطي واستعادة بيانات Milvus. +title: ميلفوس النسخ الاحتياطي +--- +

    ميلفوس النسخ الاحتياطي

    Milvus Backup هي أداة تسمح للمستخدمين بالنسخ الاحتياطي واستعادة بيانات Milvus. وهي توفر كلاً من واجهة برمجة التطبيقات CLI وواجهة برمجة التطبيقات API لتتناسب مع سيناريوهات التطبيقات المختلفة.

    +

    المتطلبات الأساسية

    قبل البدء باستخدام Milvus Backup، تأكد من أن

    +
      +
    • نظام التشغيل هو CentOS 7.5+ أو Ubuntu LTS 18.04+,
    • +
    • إصدار Go هو 1.20.2 أو أحدث.
    • +
    +

    البنية

    + + Milvus Backup architecture + بنية ميلفوس للنسخ الاحتياطي

    +

    تسهّل Milvus Backup النسخ الاحتياطي واستعادة البيانات الوصفية والمقاطع والبيانات عبر مثيلات Milvus. ويوفر واجهات متجهة للشمال، مثل واجهة برمجة التطبيقات وواجهة برمجة التطبيقات ووحدة Go المستندة إلى gRPC، من أجل معالجة مرنة لعمليات النسخ الاحتياطي والاستعادة.

    +

    يقرأ Milvus Backup البيانات الوصفية للمجموعة والمقاطع من مثيل Milvus المصدر لإنشاء نسخة احتياطية. ثم يقوم بنسخ بيانات المجموعة من المسار الجذر لمثيل Milvus المصدر ويحفظ البيانات المنسوخة في المسار الجذر للنسخ الاحتياطي.

    +

    للاستعادة من نسخة احتياطية، ينشئ Milvus Backup مجموعة جديدة في مثيل Milvus الهدف استنادًا إلى بيانات تعريف المجموعة ومعلومات المقطع في النسخة الاحتياطية. ثم ينسخ بيانات النسخة الاحتياطية من المسار الجذر للنسخة الاحتياطية إلى المسار الجذر للمثيل الهدف.

    +

    أحدث إصدار

    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.json new file mode 100644 index 000000000..7e4cae7ea --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Monitoring","anchorList":[{"label":"المراقبة","href":"Monitoring","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.md new file mode 100644 index 000000000..7ea4528d6 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/cdc-monitoring.md @@ -0,0 +1,42 @@ +--- +id: cdc-monitoring.md +order: 4 +summary: يوفر Milvus-CDC إمكانات مراقبة شاملة من خلال لوحات معلومات Grafana. +title: المراقبة +--- +

    المراقبة

    يوفر Milvus-CDC إمكانات مراقبة شاملة من خلال لوحات معلومات Grafana، مما يسمح لك بتصور المقاييس الرئيسية وضمان التشغيل السلس لمهام التقاط بيانات التغيير (CDC) وصحة الخادم.

    +

    مقاييس مهام CDC

    للبدء، قم باستيراد ملف cdc-grafana.json إلى Grafana. سيؤدي ذلك إلى إضافة لوحة معلومات مصممة خصيصًا لمراقبة حالة مهام CDC.

    +

    نظرة عامة على لوحة معلومات CDC Grafana Dashboard:

    +

    + + milvus-cdc-dashboard + لوحة القيادة milvus-cdc-dashboard

    +

    شرح المقاييس الرئيسية:

    +
      +
    • المهمة: عدد مهام CDC في حالات مختلفة، بما في ذلك الحالات الأولية والجارية والمتوقفة مؤقتاً.

    • +
    • إجمالي الطلبات: إجمالي عدد الطلبات التي استلمها مركز البيانات الميلفوس-سي دي سي.

    • +
    • نجاح الطلب: عدد الطلبات الناجحة التي تم تلقيها بواسطة Milvus-CDC.

    • +
    • عدد المهام: عدد المهام في الحالات الأولية والمتوقفة مؤقتاً والجارية بمرور الوقت.

    • +
    • حالة المهمة: حالة المهام الفردية.

    • +
    • عدد الطلبات: عدد الطلبات الناجحة وإجمالي الطلبات

    • +
    • كمون الطلب: كمون الطلبات من خلال p99 والمتوسط والإحصائيات الأخرى.

    • +
    • معدل بيانات النسخ المتماثل: معدل بيانات النسخ المتماثل لعمليات القراءة/الكتابة

    • +
    • التأخر الزمني للنسخالمتماثل: التأخر الزمني للنسخ المتماثل لعمليات القراءة/الكتابة.

    • +
    • عدد مرات تنفيذ واجهة برمجة التطبيقات: عدد المرات التي تم فيها تنفيذ واجهات برمجة تطبيقات Milvus-CDC المختلفة.

    • +
    • مركز ts: الطابع الزمني لمهام القراءة/الكتابة.

    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.json new file mode 100644 index 000000000..8c9a56209 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/zilliztech/milvus-cdc.git\n\ncd milvus-cdc/server/configs\n","# cdc meta data config\nmetaStoreConfig:\n # the metastore type, available value: etcd, mysql\n storeType: etcd\n # etcd address\n etcdEndpoints:\n - localhost:2379\n # mysql connection address\n # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8\n # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy\n rootPath: cdc\n","# milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.\nsourceConfig:\n # etcd config\n etcdAddress:\n - localhost:2379\n etcdRootPath: by-dev\n etcdMetaSubPath: meta\n # default partition name\n defaultPartitionName: _default\n # read buffer length, mainly used for buffering if writing data to milvus-target is slow.\n readChanLen: 10\n replicateChan: by-dev-replicate-msg\n # milvus-source mq config, which is pulsar or kafka\n pulsar:\n address: pulsar://localhost:6650\n webAddress: localhost:80\n maxMessageSize: 5242880\n tenant: public\n namespace: default\n# authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken\n# authParams: token:xxx\n# kafka:\n# address: 127.0.0.1:9092\n","make build\n","bash build_image.sh\n","# dir tree\n.\n├── milvus-cdc # build from source code or download from release page\n├── configs\n│ └── cdc.yaml # config for cdc and source milvus\n\n# start milvus cdc\n./milvus-cdc server\n","docker compose up -d\n"],"headingContent":"Deploy CDC Server","anchorList":[{"label":"نشر خادم CDC","href":"Deploy-CDC-Server","type":1,"isActive":false},{"label":"المتطلبات الأساسية","href":"Prerequisites","type":2,"isActive":false},{"label":"الخطوات","href":"Steps","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.md new file mode 100644 index 000000000..af7192878 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/deploy-cdc-server.md @@ -0,0 +1,154 @@ +--- +id: deploy-cdc-server.md +order: 2 +summary: يوفر هذا الدليل عملية خطوة بخطوة لنشر خادم Milvus-CDC. +title: نشر خادم CDC +--- +

    نشر خادم CDC

    يوفر هذا الدليل عملية خطوة بخطوة لنشر خادم Milvus-CDC.

    +

    المتطلبات الأساسية

    تأكد من استيفاء الشروط التالية قبل نشر خادم Milvus-CDC:

    +
      +
    • مثيلات ميلفوس: يجب نشر وتشغيل كل من الميلفوس المصدر وميلفوس مستهدف واحد على الأقل.

      +
        +
      • يجب أن يكون كلا الإصدارين المصدر والهدف Milvus 2.3.2 أو أعلى، ويفضل أن يكون 2.4.x. نوصي باستخدام نفس الإصدار للمصدر والهدف Milvus لضمان التوافق.

      • +
      • قم بتعيين التكوين common.ttMsgEnabled للهدف Milvus على false.

      • +
      • تكوين المصدر والهدف ميلفوس المصدر والهدف مع إعدادات تخزين التعريف والرسائل المختلفة لمنع التعارضات. على سبيل المثال، تجنب استخدام نفس تكوينات etcd و rootPath، بالإضافة إلى خدمات Pulsar و chanNamePrefix المتطابقة في مثيلات Milvus المتعددة.

      • +
    • +
    • المخزن الوصفية: قم بتجهيز قاعدة بيانات إلخd أو قاعدة بيانات MySQL لقاعدة بيانات Milvus-CDC الوصفية.

    • +
    +

    الخطوات

    الحصول على ملف تكوين Milvus-CDC

    استنسخ الريبو Mil vus-CDC وانتقل إلى الدليل milvus-cdc/server/configs للوصول إلى ملف التكوين cdc.yaml.

    +
    git clone https://github.com/zilliztech/milvus-cdc.git
    +
    +cd milvus-cdc/server/configs
    +
    +

    قم بتحرير ملف التكوين

    في الدليل milvus-cdc/server/configs ، قم بتعديل الملف cdc.yaml لتخصيص التكوينات المتعلقة بمخزن ميتاستور Milvus-CDC وتفاصيل الاتصال بمصدر Milvus.

    +
      +
    • تكوين المستودع الوصفية:

      +
        +
      • metaStoreConfig.storeType: نوع المخزن الوصفية لـ Milvus-CDC. القيم الممكنة هي etcd أو mysql.

      • +
      • metaStoreConfig.etcdEndpoints: :: عنوان الاتصال بـ إلخd لـ Milvus-CDC. مطلوب إذا تم تعيين storeType على etcd.

      • +
      • metaStoreConfig.mysqlSourceUrl: عنوان الاتصال لقاعدة بيانات MySQL لخادم Milvus-CDC. مطلوب إذا تم تعيين storeType على mysql.

      • +
      • metaStoreConfig.rootPath: المسار الجذر لخادم Milvus-CDC metastore. يتيح هذا التكوين إمكانية تعدد الاستئجار، مما يسمح لخدمات CDC المتعددة باستخدام نفس مثيل إلخd أو MySQL مع تحقيق العزل من خلال مسارات جذر مختلفة.

      • +
      +

      مثال على التكوين:

      +
      # cdc meta data config
      +metaStoreConfig:
      +  # the metastore type, available value: etcd, mysql
      +  storeType: etcd
      +  # etcd address
      +  etcdEndpoints:
      +    - localhost:2379
      +  # mysql connection address
      +  # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8
      +  # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy
      +  rootPath: cdc
      +
    • +
    • تكوين المصدر Milvus المصدر:

      +

      تحديد تفاصيل الاتصال الخاصة بمصدر Milvus، بما في ذلك مصدر Milvus، بما في ذلك إلخd وتخزين الرسائل، لإنشاء اتصال بين خادم Milvus-CDC ومصدر Milvus.

      +
        +
      • sourceConfig.etcdAddress: عنوان الاتصال بـ إلخd الخاص بالمصدر Milvus. للمزيد من المعلومات، راجع التكوينات المتعلقة بـ إلخd.

      • +
      • sourceConfig.etcdRootPath: البادئة الجذرية للمفتاح الذي يخزن فيه المصدر Milvus البيانات في إلخd. قد تختلف القيمة بناءً على طريقة نشر مثيل Milvus:

        +
          +
        • Helm أو Docker Compose: الإعداد الافتراضي إلى by-dev.

        • +
        • المشغل: افتراضي إلى <release_name>.

        • +
      • +
      • replicateChan:: اسم قناة النسخ المتماثل لـ milvus، وهو {msgChannel.chanNamePrefix.cluster}/{msgChannel.chanNamePrefix.replicateMsg} في ملف milvus.yaml

      • +
      • sourceConfig.pulsar: تكوينات النابض لمصدر Milvus Milvus. إذا كان المصدر Milvus المصدر يستخدم Kafka لتخزين الرسائل، فقم بإزالة جميع التكوينات المتعلقة بـ Pulsar. لمزيد من المعلومات، راجع التكوينات المتعلقة بـ Pulsar.

      • +
      • sourceConfig.kafka.address: عنوان كافكا للمصدر Milvus. قم بإلغاء هذا التكوين إذا كان المصدر Milvus يستخدم Kafka لتخزين الرسائل.

      • +
    • +
    +

    مثال على التكوين:

    +
    # milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.
    +sourceConfig:
    +  # etcd config
    +  etcdAddress:
    +    - localhost:2379
    +  etcdRootPath: by-dev
    +  etcdMetaSubPath: meta
    +  # default partition name
    +  defaultPartitionName: _default
    +  # read buffer length, mainly used for buffering if writing data to milvus-target is slow.
    +  readChanLen: 10
    +  replicateChan: by-dev-replicate-msg
    +  # milvus-source mq config, which is pulsar or kafka
    +  pulsar:
    +    address: pulsar://localhost:6650
    +    webAddress: localhost:80
    +    maxMessageSize: 5242880
    +    tenant: public
    +    namespace: default
    +#    authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken
    +#    authParams: token:xxx
    +#  kafka:
    +#    address: 127.0.0.1:9092
    +
    +

    تجميع خادم Milvus-CDC

    بعد حفظ الملف cdc.yaml ، انتقل إلى الدليل milvus-cdc وقم بتشغيل أحد الأوامر التالية لتجميع الخادم:

    +
      +
    • لملف ثنائي:

      +
      make build
      +
    • +
    • لصورة Docker:

      +
      bash build_image.sh
      +
      +

      بالنسبة لصورة Docker، قم بتحميل الملف المجمّع إلى /app/server/configs/cdc.yaml داخل الحاوية.

    • +
    +

    ابدأ تشغيل الخادم

      +
    • باستخدام الملف الثنائي

      +

      انتقل إلى الدليل الذي يحتوي على الملف الثنائي milvus-cdc والدليل configs مع الملف cdc.yaml ، ثم ابدأ تشغيل الخادم:

      +
      # dir tree
      +.
      +├── milvus-cdc # build from source code or download from release page
      +├── configs
      +│   └── cdc.yaml # config for cdc and source milvus
      +
      +# start milvus cdc
      +./milvus-cdc server
      +
    • +
    • باستخدام Docker Compose:

      +
      docker compose up -d
      +
    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.json new file mode 100644 index 000000000..e046a4ea4 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.json @@ -0,0 +1 @@ +{"codeList":["curl -X POST http:_//localhost:8444/cdc \\\n-H \"Content-Type: application/json\" \\\n-d '{\n \"request_type\": \"create\",\n \"request_data\": {\n \"milvus_connect_param\": {\n \"uri\": \"http://localhost:19530\",\n \"token\":\"root:Milvus\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ]\n }\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"task_id\":\"xxxx\"\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\": \"list\"\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"tasks\": [\n {\n \"task_id\": \"xxxxx\",\n \"milvus_connect_param\": {\n \"uri\":\"http://localhost:19530\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"state\": \"Running\"\n }\n ]\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"pause\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"resume\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"get\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"Task\": {\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"milvus_connect_param\": {\n \"connect_timeout\": 10,\n \"uri\":\"http://localhost:19530\"\n },\n \"state\": \"Running\",\n \"task_id\": \"xxxx\"\n }\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"delete\",\n \"request_data\": {\n \"task_id\": \"30d1e325df604ebb99e14c2a335a1421\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n"],"headingContent":"Manage CDC Tasks","anchorList":[{"label":"إدارة مهام CDC","href":"Manage-CDC-Tasks","type":1,"isActive":false},{"label":"إنشاء مهمة","href":"Create-a-task","type":2,"isActive":false},{"label":"سرد المهام","href":"List-tasks","type":2,"isActive":false},{"label":"إيقاف مهمة مؤقتاً","href":"Pause-a-task","type":2,"isActive":false},{"label":"استئناف مهمة","href":"Resume-a-task","type":2,"isActive":false},{"label":"استرداد تفاصيل المهمة","href":"Retrieve-task-details","type":2,"isActive":false},{"label":"حذف مهمة","href":"Delete-a-task","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.md new file mode 100644 index 000000000..b7ec28446 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/manage-cdc-tasks.md @@ -0,0 +1,275 @@ +--- +id: manage-cdc-tasks.md +order: 3 +summary: >- + تعمل مهمة التقاط تغيير البيانات (CDC) على تمكين مزامنة البيانات من مثيل Milvus + المصدر إلى مثيل Milvus الهدف. +title: إدارة مهام CDC +--- +

    إدارة مهام CDC

    تمكّن مهمة التقاط تغيير البيانات (CDC) من مزامنة البيانات من مثيل Milvus المصدر إلى مثيل Milvus الهدف. وهي تراقب سجلات التشغيل من المصدر وتنسخ تغييرات البيانات مثل عمليات الإدراج والحذف وعمليات الفهرسة إلى الهدف في الوقت الفعلي. وهذا يسهل عملية التعافي من الكوارث في الوقت الحقيقي أو موازنة التحميل النشط النشط بين عمليات نشر Milvus.

    +

    يغطي هذا الدليل كيفية إدارة مهام CDC، بما في ذلك الإنشاء والإيقاف المؤقت والاستئناف واسترداد التفاصيل والإدراج والحذف من خلال طلبات HTTP.

    +

    إنشاء مهمة

    يسمح إنشاء مهمة CDC بمزامنة عمليات تغيير البيانات في المصدر Milvus إلى الهدف Milvus.

    +

    لإنشاء مهمة CDC:

    +
    curl -X POST http:_//localhost:8444/cdc \
    +-H "Content-Type: application/json" \
    +-d '{
    +  "request_type": "create",
    +  "request_data": {
    +    "milvus_connect_param": {
    +      "uri": "http://localhost:19530",
    +      "token":"root:Milvus",
    +      "connect_timeout": 10
    +    },
    +    "collection_infos": [
    +      {
    +        "name": "*"
    +      }
    +    ]
    +  }
    +}'
    +
    +

    استبدل المضيف المحلي بعنوان IP الخاص بخادم ملفوس الهدف.

    +

    المعلمات:

    +
      +
    • milvus_connect_param: معلمات الاتصال الخاصة بخادم ملفوس الهدف.

      +
        +
      • المضيف: اسم المضيف أو عنوان IP لخادم ميلفوس.

      • +
      • المنفذ: رقم المنفذ الذي يستمع إليه خادم ميلفوس.

      • +
      • اسم المستخدم: اسم المستخدم للمصادقة مع خادم ملفوس.

      • +
      • كلمة المرور: كلمة المرور للمصادقة مع خادم مالفوس.

      • +
      • تمكين_tls: ما إذا كان يجب استخدام تشفير TLS/SSL للاتصال.

      • +
      • مهلة_الاتصال: فترة المهلة بالثواني لإنشاء الاتصال.

      • +
    • +
    • مجموعات_المعلومات: المجموعات المراد مزامنتها. في الوقت الحالي، يتم دعم علامة النجمة(*) فقط، حيث تتم مزامنة Milvus-CDC على مستوى المجموعة، وليس المجموعات الفردية.

    • +
    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "task_id":"xxxx"
    +  }
    +}
    +
    +

    سرد المهام

    لسرد جميع مهام CDC التي تم إنشاؤها:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type": "list"
    +}' http://localhost:8444/cdc
    +
    +

    استبدل المضيف المحلي بعنوان IP لخادم Milvus الهدف.

    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "tasks": [
    +      {
    +        "task_id": "xxxxx",
    +        "milvus_connect_param": {
    +          "uri":"http://localhost:19530",
    +          "connect_timeout": 10
    +        },
    +        "collection_infos": [
    +          {
    +            "name": "*"
    +          }
    +        ],
    +        "state": "Running"
    +      }
    +    ]
    +  }
    +}
    +
    +

    إيقاف مهمة مؤقتاً

    لإيقاف مهمة CDC مؤقتاً:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"pause",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    استبدل المضيف المحلي بعنوان IP الخاص بخادم Milvus الهدف.

    +

    المعلمات:

    +
      +
    • task_id: معرف مهمة CDC المراد إيقافها مؤقتاً.
    • +
    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    استئناف مهمة

    لاستئناف مهمة CDC متوقفة مؤقتاً:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"resume",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    استبدل المضيف المحلي بعنوان IP الخاص بخادم Milvus الهدف.

    +

    المعلمات:

    +
      +
    • task_id: معرف مهمة CDC المراد استئنافها.
    • +
    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    استرداد تفاصيل المهمة

    لاسترداد تفاصيل مهمة CDC محددة:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"get",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    استبدل المضيف المحلي بعنوان IP الخاص بخادم ميلفوس الهدف.

    +

    المعلمات:

    +
      +
    • task_id: معرف مهمة CDC المراد الاستعلام عنها.
    • +
    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "Task": {
    +      "collection_infos": [
    +        {
    +          "name": "*"
    +        }
    +      ],
    +      "milvus_connect_param": {
    +        "connect_timeout": 10,
    +        "uri":"http://localhost:19530"
    +      },
    +      "state": "Running",
    +      "task_id": "xxxx"
    +    }
    +  }
    +}
    +
    +

    حذف مهمة

    لحذف مهمة CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"delete",
    +  "request_data": {
    +    "task_id": "30d1e325df604ebb99e14c2a335a1421"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    استبدل المضيف المحلي بعنوان IP الخاص بخادم ميلفوس الهدف.

    +

    المعلمات:

    +
      +
    • task_id: معرف مهمة CDC المراد حذفها.
    • +
    +

    الاستجابة المتوقعة:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.json new file mode 100644 index 000000000..7aa3c2cba --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview","anchorList":[{"label":"نظرة عامة","href":"Overview","type":1,"isActive":false},{"label":"القدرات الرئيسية","href":"Key-capabilities","type":2,"isActive":false},{"label":"البنية","href":"Architecture","type":2,"isActive":false},{"label":"سير العمل","href":"Workflow","type":2,"isActive":false},{"label":"الحدود","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.md new file mode 100644 index 000000000..0a5ca4078 --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-cdc/milvus-cdc-overview.md @@ -0,0 +1,125 @@ +--- +id: milvus-cdc-overview.md +order: 1 +summary: >- + Milvus-CDC هي أداة سهلة الاستخدام يمكنها التقاط ومزامنة البيانات الإضافية في + مثيلات Milvus. +title: نظرة عامة على مركز مكافحة الأمراض والوقاية منها +--- +

    نظرة عامة

    Milvus-CDC هي أداة سهلة الاستخدام يمكنها التقاط ومزامنة البيانات الإضافية في مثيلات Milvus. وهي تضمن موثوقية بيانات الأعمال من خلال نقلها بسلاسة بين مثيلات المصدر والهدف، مما يسمح بسهولة النسخ الاحتياطي التزايدي واستعادة البيانات في حالات الكوارث.

    +

    القدرات الرئيسية

      +
    • مزامنة البيانات المتسلسلة: يضمن تكامل البيانات واتساقها من خلال مزامنة تغييرات البيانات بالتتابع بين مثيلات Milvus.

    • +
    • النسخ التزايدي للبيانات: يقوم بتكرار البيانات التزايدية، بما في ذلك عمليات الإدراج والحذف، من المصدر Milvus إلى الهدف Milvus، مما يوفر تخزينًا مستمرًا.

    • +
    • إدارة مهام CDC: يسمح بإدارة مهام CDC من خلال طلبات OpenAPI، بما في ذلك إنشاء مهام CDC والاستعلام عن حالتها وحذفها.

    • +
    +

    بالإضافة إلى ذلك، نحن نخطط لتوسيع قدراتنا لتشمل دعم التكامل مع أنظمة معالجة التدفق في المستقبل.

    +

    البنية

    تتبنى Milvus-CCDC بنية مع مكونين رئيسيين - خادم HTTP الذي يدير المهام والبيانات الوصفية، و Corelib الذي يزامن تنفيذ المهام مع قارئ يحصل على البيانات من مثيل Milvus المصدر وكاتب يرسل البيانات المعالجة إلى مثيل Milvus الهدف.

    +

    + + milvus-cdc-architecture + معمارية ميلفوس-سي دي سي-مركز البيانات

    +

    في الرسم البياني السابق

    +
      +
    • خادم HTTP: يعالج طلبات المستخدم وينفذ المهام ويحافظ على البيانات الوصفية. وهو بمثابة مستوى التحكم لتنسيق المهام داخل نظام Milvus-CDC.

    • +
    • Corelib: مسؤول عن المزامنة الفعلية للمهام. يتضمن مكون قارئ يقوم باسترداد المعلومات من مصدر ميلفوس المصدر وقائمة انتظار الرسائل (MQ)، ومكون كاتب يقوم بترجمة الرسائل من MQ إلى معلمات واجهة برمجة التطبيقات لنظام ميلفوس ويرسل هذه الطلبات إلى الهدف ميلفوس لإكمال عملية المزامنة.

    • +
    +

    سير العمل

    يتضمن تدفق معالجة بيانات مالفوس-مزامنة البيانات الخطوات التالية:

    +
      +
    1. إنشاء المهمة: يبدأ المستخدمون مهمة CDC عبر طلبات HTTP.

    2. +
    3. استرجاع البيانات الوصفية: يقوم النظام بجلب البيانات الوصفية الخاصة بالمجموعة من المصدر Milvus's etcd، بما في ذلك معلومات القناة ونقطة التفتيش الخاصة بالمجموعة.

    4. +
    5. اتصال MQ: مع وجود البيانات الوصفية في متناول اليد، يتصل النظام ب MQ لبدء الاشتراك في دفق البيانات.

    6. +
    7. معالجة البيانات: تتم قراءة البيانات من MQ وتحليلها وتمريرها إما باستخدام Go SDK أو معالجتها لتكرار العمليات التي يتم إجراؤها في المصدر Milvus.

    8. +
    +

    + + milvus-cdc-workflow + سير عمل ميلفوس-سي دي سي

    +

    الحدود

      +
    • تزامن البيانات التزايدي: اعتبارًا من الآن، تم تصميم Milvus-CCD لمزامنة البيانات التزايدية فقط. إذا كان عملك يتطلب نسخة احتياطية كاملة للبيانات، يرجى التواصل معنا للحصول على المساعدة.

    • +
    • نطاق المزامنة: حاليًا، يمكن ل Milvus-CDC مزامنة البيانات على مستوى المجموعة. نحن نعمل على إضافة دعم لمزامنة البيانات على مستوى المجموعة في الإصدارات القادمة.

    • +
    • طلبات واجهة برمجة التطبيقات المدعومة: يدعم Milvus-CDC حاليًا طلبات واجهة برمجة التطبيقات التالية. نخطط لتوسيع الدعم ليشمل طلبات إضافية في الإصدارات المستقبلية:

      +
        +
      • إنشاء/إسقاط مجموعة

      • +
      • إدراج/حذف/إسقاط/إدراج

      • +
      • إنشاء/إسقاط قسم

      • +
      • إنشاء/إسقاط فهرس

      • +
      • تحميل/إصدار/إدخال/إسقاط

      • +
      • تحميل/إزالة/إصدار قسم

      • +
      • إنشاء/إسقاط قاعدة بيانات

      • +
    • +
    diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.json b/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.json new file mode 100644 index 000000000..2b6e4d57d --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.json @@ -0,0 +1 @@ +{"codeList":["http://${MILVUS_PROXY_IP}:9091/webui\n"],"headingContent":"Milvus WebUI","anchorList":[{"label":"واجهة مستخدم ويب ميلفوس","href":"Milvus-WebUI","type":1,"isActive":false},{"label":"نظرة عامة","href":"Overview","type":2,"isActive":false},{"label":"الميزات","href":"Features","type":2,"isActive":false},{"label":"الصفحة الرئيسية","href":"Home","type":2,"isActive":false},{"label":"المجموعات","href":"Collections","type":2,"isActive":false},{"label":"استعلام","href":"Query","type":2,"isActive":false},{"label":"البيانات","href":"Data","type":2,"isActive":false},{"label":"المهام","href":"Tasks","type":2,"isActive":false},{"label":"الطلبات البطيئة","href":"Slow-requests","type":2,"isActive":false},{"label":"التكوينات","href":"Configurations","type":2,"isActive":false},{"label":"الأدوات","href":"Tools","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.md b/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.md new file mode 100644 index 000000000..39cde846f --- /dev/null +++ b/localization/v2.5.x/site/ar/userGuide/tools/milvus-webui.md @@ -0,0 +1,289 @@ +--- +id: milvus-webui.md +summary: >- + Milvus Web UI هي أداة إدارة رسومية لـ Milvus. وهي تعزز إمكانية مراقبة النظام + بواجهة بسيطة وبديهية. يمكنك +title: واجهة مستخدم ويب ميلفوس +--- +

    واجهة مستخدم ويب ميلفوس

    Milvus Web UI هي أداة إدارة رسومية ل Milvus. وهي تعزز إمكانية مراقبة النظام بواجهة بسيطة وبديهية. يمكنك استخدام واجهة مستخدم الويب Milvus Web UI لمراقبة الإحصائيات والمقاييس الخاصة بمكونات وتبعيات Milvus، والتحقق من تفاصيل قاعدة البيانات والتجميع، وسرد تكوينات Milvus التفصيلية.

    +

    نظرة عامة

    تختلف واجهة مستخدم الويب Milvus Web UI عن Birdwatcher و Attu في أنها أداة مدمجة لتوفير إمكانية مراقبة النظام بشكل عام مع واجهة بسيطة وبديهية.

    +

    الجدول التالي يقارن بين ميزات واجهة مستخدم ميلفوس ويب وواجهة مستخدم بيردواتشر/أتو:

    + + + + + + + + + + + + +
    الميزةواجهة مستخدم ميلفوس ويبمراقب الطيورأتو
    نموذج التشغيلواجهة المستخدم الرسوميةواجهة المستخدم الرسوميةواجهة المستخدم الرسومية
    المستخدمون المستهدفونالمشرفون والمطورونالمشرفونالمطورون
    التثبيتمدمجأداة مستقلةأداة مستقلة
    التبعياتميلفوسميلفوس / إلخdميلفوس
    الوظائف الأساسيةبيئة وقت التشغيل، وتفاصيل قاعدة البيانات/المجموعة، والشرائح، والقنوات، والمهام، وطلبات الاستعلام البطيئةفحص البيانات الوصفية وتنفيذ واجهة برمجة تطبيقات ميلفوسإدارة قاعدة البيانات والمهام التشغيلية
    متوفر منذv2.5.0v2.0.0v0.1.8
    +

    اعتبارًا من الإصدار 2.5.0، يمكنك الوصول إلى واجهة مستخدم ويب Milvus Web UI باستخدام عنوان URL التالي على مثيل Milvus قيد التشغيل:

    +
    http://${MILVUS_PROXY_IP}:9091/webui
    +
    +

    الميزات

    توفر واجهة مستخدم ويب Milvus Web UI الميزات التالية:

    +

    + + Milvus Web UI overview + نظرة عامة على واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • الصفحة الرئيسية

      +

      يمكنك العثور على معلومات حول مثيل Milvus قيد التشغيل الحالي ومكوناته والعملاء المتصلين والتبعيات.

    • +
    • المجموعات

      +

      يمكنك عرض قائمة قواعد البيانات والمجموعات الموجودة حالياً في ملفوس والتحقق من تفاصيلها.

    • +
    • الاستعلام

      +

      يمكنك عرض الإحصائيات المجمعة لعقد الاستعلام ومنسقي الاستعلام من حيث المقاطع والقنوات والنسخ المتماثلة ومجموعات الموارد.

    • +
    • البيانات

      +

      يمكنك عرض الإحصائيات المجمعة لعقد البيانات من حيث المقاطع والقنوات.

    • +
    • المهام

      +

      يمكنك عرض قائمة المهام التي تعمل في Milvus، بما في ذلك مهام جدولة Querycoord ومهام الضغط ومهام بناء الفهرس ومهام الاستيراد ومهام مزامنة البيانات.

    • +
    • الطلبات البطيئة

      +

      يمكنك عرض قائمة الطلبات البطيئة في Milvus، بما في ذلك نوع الطلب ومدة الطلب ومعلمات الطلب.

    • +
    • التكوينات

      +

      يمكنك عرض قائمة تكوينات Milvus وقيمها.

    • +
    • الأدوات

      +

      يمكنك الوصول إلى الأداتين المدمجتين، أداة pprof وأداة تصور بيانات Milvus، من واجهة مستخدم الويب.

    • +
    +

    الصفحة الرئيسية

    في الصفحة الرئيسية، يمكنك العثور على المعلومات التالية:

    +

    + + Milvus Web UI Home + الصفحة الرئيسية لواجهة مستخدم الويب ميلفوس ويب

    +
      +
    • معلومات النظام: عرض معلومات النظام، بما في ذلك معلومات حول وضع النشر والصورة المستخدمة في النشر والمعلومات ذات الصلة.

    • +
    • معلومات المكونات: عرض حالة ومقاييس المكونات في Milvus، بما في ذلك حالة ومقاييس عقد الاستعلام وعقد البيانات وعقد الفهرس والمنسقين والوكلاء.

    • +
    • العملاء المتصلين: عرض العملاء المتصلين ومعلوماتهم، بما في ذلك نوع SDK وإصداره، واسم المستخدم، وسجل الوصول الخاص بهم.

    • +
    • تبعيات النظام: عرض حالة ومقاييس التبعيات الخاصة ب Milvus، بما في ذلك حالة ومقاييس مخزن التعريف وقائمة انتظار الرسائل وتخزين الكائنات.

    • +
    +

    المجموعات

    في صفحة المجموعات، يمكنك عرض قائمة قواعد البيانات والمجموعات الموجودة حاليًا في Milvus والتحقق من تفاصيلها.

    +

    + + Milvus Web UI Collections + مجموعات واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • قواعد البيانات: عرض قائمة قواعد البيانات الموجودة حاليًا في Milvus وتفاصيلها.

    • +
    • المجموعات: عرض قائمة المجموعات في كل قاعدة بيانات وتفاصيلها.

      +

      يمكنك النقر على مجموعة لعرض تفاصيلها، بما في ذلك عدد الحقول والأقسام والفهارس وغيرها من المعلومات بالتفصيل.

      +

      + + Milvus Web UI Collection Details + تفاصيل مجموعة واجهة مستخدم الويب Milvus Web UI

    • +
    +

    استعلام

    + + Milvus Web UI Query Page + صفحة استعلام واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • الشرائح: عرض قائمة المقاطع وتفاصيلها، بما في ذلك معرّف المقطع والمجموعة المقابلة والحالة والحجم وما إلى ذلك.

    • +
    • القنوات: عرض قائمة القنوات وتفاصيلها، بما في ذلك اسم القناة والمجموعات المقابلة لها، إلخ.

    • +
    • النسخ المتماثلة: عرض قائمة بالنسخ المتماثلة وتفاصيلها، بما في ذلك معرف النسخة المتماثلة والمجموعة المقابلة لها، إلخ.

    • +
    • مجموعات الموارد: عرض قائمة مجموعات الموارد وتفاصيلها، بما في ذلك اسم مجموعة الموارد وعدد عقد الاستعلام في المجموعة وتكويناتها، إلخ.

    • +
    +

    البيانات

    + + Milvus Web UI Data Page + صفحة بيانات واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • الشرائح: عرض قائمة المقاطع من عقد/منسقي البيانات وتفاصيلها، بما في ذلك معرف المقطع، والمجموعة المقابلة، والحالة، والحجم، وما إلى ذلك.

    • +
    • القنوات: عرض قائمة القنوات من عُقد البيانات/المنسقين وتفاصيلها، بما في ذلك اسم القناة والمجموعات المقابلة لها، إلخ.

    • +
    +

    المهام

    + + Milvus Web UI Tasks Page + صفحة مهام واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • المهام: عرض قائمة المهام التي تعمل في ملفوس، بما في ذلك نوع المهمة وحالتها وإجراءاتها.

      +
        +
      • مهام QueryCoord: عرض جميع مهام جدولة QueryCoord، بما في ذلك الموازن والفهرس/الجزء/القناة/المدقق القائد في آخر 15 دقيقة.

      • +
      • مهام الضغط: عرض جميع مهام الضغط من منسقي البيانات في آخر 15 دقيقة.

      • +
      • مهام بناء الفهرس: عرض جميع مهام إنشاء الفهرس من منسقي البيانات في آخر 30 دقيقة.

      • +
      • مهام الاستيراد: عرض جميع مهام الاستيراد من منسقي البيانات في آخر 30 دقيقة.

      • +
      • مهام مزامنة البيانات: عرض جميع مهام مزامنة البيانات من عقد البيانات في آخر 15 دقيقة.

      • +
    • +
    +

    الطلبات البطيئة

    + + Milvus Web UI Slow Requests Page + صفحة الطلبات البطيئة لواجهة مستخدم الويب Milvus Web UI

    +
      +
    • الطلبات البطيئة: الطلب البطيء هو طلب بحث أو استعلام له زمن انتقال أطول من قيمة proxy.slowQuerySpanInSeconds المحددة في التكوين. تعرض قائمة الطلبات البطيئة جميع الطلبات البطيئة في آخر 15 دقيقة.
    • +
    +

    التكوينات

    + + Milvus Web UI Configurations Page + صفحة تكوينات واجهة مستخدم ويب ميلفوس ويب

    +
      +
    • التكوينات: عرض قائمة تكوينات وقت تشغيل Milvus وقيمها.
    • +
    +

    الأدوات

      +
    • أداةpprof: الوصول إلى أداة pprof لتنميط وتصحيح أخطاء ميلفوس.

    • +
    • أداة تصور بيانات ميلفوس: الوصول إلى أداة تصور بيانات Milvus لتصور البيانات في Milvus.

    • +
    diff --git a/localization/v2.5.x/site/id/about/comparison.json b/localization/v2.5.x/site/id/about/comparison.json new file mode 100644 index 000000000..132e5b3ca --- /dev/null +++ b/localization/v2.5.x/site/id/about/comparison.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Comparing Milvus with Alternatives","anchorList":[{"label":"Membandingkan Milvus dengan Alternatif Lain","href":"Comparing-Milvus-with-Alternatives","type":1,"isActive":false},{"label":"Sorotan Milvus","href":"Milvus-highlights","type":2,"isActive":false},{"label":"Perbandingan keseluruhan","href":"Overall-comparison","type":2,"isActive":false},{"label":"Perbandingan terminologi","href":"Terminology-comparison","type":2,"isActive":false},{"label":"Perbandingan kemampuan","href":"Capability-comparison","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/about/comparison.md b/localization/v2.5.x/site/id/about/comparison.md new file mode 100644 index 000000000..32008679d --- /dev/null +++ b/localization/v2.5.x/site/id/about/comparison.md @@ -0,0 +1,159 @@ +--- +id: comparison.md +title: Perbandingan +summary: Artikel ini membandingkan Milvus dengan solusi pencarian vektor lainnya. +--- +

    Membandingkan Milvus dengan Alternatif Lain

    Ketika menjelajahi berbagai opsi database vektor, panduan komprehensif ini akan membantu Anda memahami fitur-fitur unik Milvus, memastikan Anda memilih database yang paling sesuai dengan kebutuhan spesifik Anda. Khususnya, Milvus adalah basis data vektor sumber terbuka terkemuka, dan Zilliz Cloud menawarkan layanan Milvus yang dikelola sepenuhnya. Untuk mengevaluasi Milvus secara objektif terhadap para pesaingnya, pertimbangkan untuk menggunakan alat tolok ukur untuk menganalisis metrik kinerja.

    +

    Sorotan Milvus

      +
    • Fungsionalitas: Milvus melampaui pencarian kemiripan vektor dasar dengan mendukung fungsionalitas tingkat lanjut seperti vektor jarang, vektor massal, pencarian yang difilter, dan kemampuan pencarian hibrida.

    • +
    • Fleksibilitas: Milvus mengakomodasi berbagai mode penerapan dan beberapa SDK, semuanya dalam ekosistem yang kuat dan terintegrasi.

    • +
    • Kinerja: Milvus menjamin pemrosesan waktu nyata dengan throughput tinggi dan latensi rendah, didukung oleh algoritme pengindeksan yang dioptimalkan seperti HNSW dan DiskANN, serta akselerasi GPU tingkat lanjut.

    • +
    • Skalabilitas: Arsitektur terdistribusi yang dipesan lebih dahulu dengan mudah diskalakan, mengakomodasi apa pun mulai dari kumpulan data kecil hingga koleksi yang melebihi 10 miliar vektor.

    • +
    +

    Perbandingan keseluruhan

    Untuk membandingkan antara Milvus dan Pinecone, dua solusi basis data vektor, tabel berikut ini disusun untuk menyoroti perbedaan di berbagai fitur.

    + + + + + + + + + + + + + +
    FiturPineconeMilvusKeterangan
    Mode PenerapanHanya SaaSMilvus Lite, On-prem Standalone & Cluster, Zilliz Cloud Saas & BYOCMilvus menawarkan fleksibilitas yang lebih besar dalam mode penerapan.
    SDK yang didukungPython, JavaScript/TypeScriptPython, Java, NodeJS, Go, Restful API, C#, RustMilvus mendukung lebih banyak bahasa pemrograman.
    Status Sumber TerbukaDitutupSumber terbukaMilvus adalah basis data vektor sumber terbuka yang populer.
    SkalabilitasHanya skala naik/turunSkala keluar/masuk dan Skala naik/turunMilvus memiliki arsitektur terdistribusi untuk meningkatkan skalabilitas.
    KetersediaanArsitektur berbasis pod dalam zona yang tersediaFailover zona yang tersedia dan HA lintas wilayahMilvus CDC (Change Data Capture) memungkinkan mode primer/standby untuk ketersediaan yang lebih tinggi.
    Biaya Perf (Dolar per juta kueri)Mulai dari $0,178 untuk dataset menengah, $1,222 untuk dataset besarZilliz Cloud mulai dari $0,148 untuk dataset menengah, $0,635 untuk dataset besar; tersedia versi gratisLihat laporan Peringkat Biaya.
    Akselerasi GPUTidak didukungMendukung GPU NVIDIAAkselerasi GPU secara signifikan meningkatkan kinerja, seringkali dengan urutan besarnya.
    +

    Perbandingan terminologi

    Meskipun keduanya memiliki fungsi yang sama sebagai basis data vektor, terminologi khusus domain antara Milvus dan Pinecone menunjukkan sedikit variasi. Perbandingan terminologi yang terperinci adalah sebagai berikut.

    + + + + + + + + + + + + +
    PineconeMilvusKeterangan
    IndeksKoleksiDalam Pinecone, indeks berfungsi sebagai unit organisasi untuk menyimpan dan mengelola vektor dengan ukuran yang sama, dan indeks ini terintegrasi erat dengan perangkat keras, yang dikenal sebagai pod. Sebaliknya, koleksi Milvus memiliki tujuan yang sama, tetapi memungkinkan penanganan beberapa koleksi dalam satu instance.
    KoleksiCadanganDi Pinecone, koleksi pada dasarnya adalah cuplikan statis dari sebuah indeks, yang digunakan terutama untuk tujuan pencadangan dan tidak dapat ditanyakan. Di Milvus, fitur yang setara untuk membuat cadangan lebih transparan dan diberi nama secara langsung.
    Ruang namaKunci partisiRuang nama memungkinkan partisi vektor dalam indeks menjadi beberapa subset. Milvus menyediakan beberapa metode seperti partisi atau kunci partisi untuk memastikan isolasi data yang efisien dalam sebuah koleksi.
    MetadataBidang skalarPenanganan metadata Pinecone bergantung pada pasangan key-value, sementara Milvus memungkinkan bidang skalar yang kompleks, termasuk tipe data standar dan bidang JSON dinamis.
    KueriPencarianNama metode yang digunakan untuk menemukan tetangga terdekat untuk vektor yang diberikan, mungkin dengan beberapa filter tambahan yang diterapkan di atasnya.
    Tidak tersediaIteratorPinecone tidak memiliki fitur untuk mengulang semua vektor dalam sebuah indeks. Milvus memperkenalkan metode Search Iterator dan Query Iterator, yang meningkatkan kemampuan pencarian data di seluruh kumpulan data.
    +

    Perbandingan kemampuan

    + + + + + + + + + + + + +
    KemampuanPineconeMilvus
    Mode PenerapanHanya SaaSMilvus Lite, On-prem Standalone & Cluster, Zilliz Cloud Saas & BYOC
    Fungsi PenyematanTidak tersediaDukungan dengan pymilvus [model]
    Tipe DataString, Angka, Bool, Daftar StringString, VarChar, Angka (Int, Float, Double), Bool, Larik, JSON, Vektor Float, Vektor Biner, BFloat16, Float16, Vektor Jarang
    Jenis Metrik dan IndeksCos, Dot, Euclidean
    Keluarga-P, Keluarga-S
    Cosinus, IP (Dot), L2 (Euclidean), Hamming, Jaccard
    FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, HNSW, SCANN, Indeks GPU
    Desain SkemaMode fleksibelMode fleksibel, Mode ketat
    Beberapa Bidang VektorN/APencarian multi-vektor dan hibrida
    AlatKumpulan data, utilitas teks, konektor sparkKonektor Attu, Pengamat Burung, Pencadangan, CLI, CDC, Spark, dan Kafka
    +

    Wawasan utama

      +
    • Mode penerapan: Milvus menawarkan berbagai opsi penerapan, termasuk penerapan lokal, Docker, Kubernetes di lokasi, Cloud SaaS, dan Bring Your Own Cloud (BYOC) untuk perusahaan, sedangkan Pinecone terbatas pada penerapan SaaS.

    • +
    • Fungsi penyematan: Milvus mendukung pustaka penyematan tambahan, memungkinkan penggunaan langsung model penyematan untuk mengubah data sumber menjadi vektor.

    • +
    • Tipe data: Milvus mendukung tipe data yang lebih luas daripada Pinecone, termasuk array dan JSON. Pinecone hanya mendukung struktur metadata datar dengan string, angka, boolean, atau daftar string sebagai nilai, sedangkan Milvus dapat menangani objek JSON apa pun, termasuk struktur bersarang, dalam bidang JSON. Pinecone membatasi ukuran metadata hingga 40KB per vektor.

    • +
    • Jenis metrik dan indeks: Milvus mendukung banyak pilihan jenis metrik dan indeks untuk mengakomodasi berbagai kasus penggunaan, sementara Pinecone memiliki pilihan yang lebih terbatas. Meskipun indeks untuk vektor adalah wajib di Milvus, opsi AUTO_INDEX tersedia untuk menyederhanakan proses konfigurasi.

    • +
    • Desain skema: Milvus menawarkan mode create_collection yang fleksibel untuk desain skema, termasuk pengaturan cepat dengan skema dinamis untuk pengalaman tanpa skema yang mirip dengan Pinecone dan pengaturan yang disesuaikan dengan bidang skema yang telah ditentukan sebelumnya dan indeks yang mirip dengan sistem manajemen basis data relasional (RDBMS).

    • +
    • Beberapa bidang vektor: Milvus memungkinkan penyimpanan beberapa bidang vektor dalam satu koleksi, yang dapat berupa bidang vektor yang jarang atau padat dan dapat bervariasi dalam hal dimensi. Pinecone tidak menawarkan fitur yang sebanding.

    • +
    • Alat: Milvus menawarkan pilihan alat yang lebih luas untuk manajemen dan pemanfaatan basis data, seperti Attu, Birdwatcher, Backup, CLI, CDC dan konektor Spark dan Kafka.

    • +
    +

    Apa selanjutnya

      +
    • Uji coba: Rasakan pengalaman Milvus secara langsung dengan memulai menggunakan quickstart Milvus atau mendaftar ke Zilliz Cloud.

    • +
    • Pelajari lebih lanjut: Selami lebih dalam fitur-fitur Milvus melalui Terminologi dan Panduan Pengguna kami yang komprehensif.

    • +
    • Jelajahi alternatif: Untuk perbandingan yang lebih luas tentang opsi database vektor, jelajahi sumber daya tambahan di halaman ini.

    • +
    diff --git a/localization/v2.5.x/site/id/about/limitations.json b/localization/v2.5.x/site/id/about/limitations.json new file mode 100644 index 000000000..afec2f1b6 --- /dev/null +++ b/localization/v2.5.x/site/id/about/limitations.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Limits","anchorList":[{"label":"Batasan Milvus","href":"Milvus-Limits","type":1,"isActive":false},{"label":"Panjang nama sumber daya","href":"Length-of-a-resource-name","type":2,"isActive":false},{"label":"Aturan penamaan","href":"Naming-rules","type":2,"isActive":false},{"label":"Jumlah sumber daya","href":"Number-of-resources","type":2,"isActive":false},{"label":"Jumlah sumber daya dalam koleksi","href":"Number-of-resources-in-a-collection","type":2,"isActive":false},{"label":"Panjang sebuah string","href":"Length-of-a-string","type":2,"isActive":false},{"label":"Dimensi sebuah vektor","href":"Dimensions-of-a-vector","type":2,"isActive":false},{"label":"Masukan dan Keluaran per RPC","href":"Input-and-Output-per-RPC","type":2,"isActive":false},{"label":"Batas pemuatan","href":"Load-limits","type":2,"isActive":false},{"label":"Batas pencarian","href":"Search-limits","type":2,"isActive":false},{"label":"Batas indeks pada berbagai jenis pencarian","href":"Index-limits-on-different-search-types","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/about/limitations.md b/localization/v2.5.x/site/id/about/limitations.md new file mode 100644 index 000000000..582eabeb5 --- /dev/null +++ b/localization/v2.5.x/site/id/about/limitations.md @@ -0,0 +1,260 @@ +--- +id: limitations.md +title: Batasan Milvus +related_key: Limitations +summary: Pelajari tentang batasan-batasan saat menggunakan Milvus. +--- +

    Batasan Milvus

    Milvus berkomitmen untuk menyediakan basis data vektor terbaik untuk mendukung aplikasi AI dan pencarian kemiripan vektor. Namun, tim terus bekerja untuk menghadirkan lebih banyak fitur dan utilitas terbaik untuk meningkatkan pengalaman pengguna. Halaman ini mencantumkan beberapa batasan yang diketahui yang mungkin ditemui pengguna saat menggunakan Milvus.

    +

    Panjang nama sumber daya

    + + + + + + + + + +
    Sumber dayaBatas
    Koleksi255 karakter
    Bidang255 karakter
    Indeks255 karakter
    Partisi255 karakter
    +

    Aturan penamaan

    Nama sumber daya dapat terdiri dari angka, huruf, dan garis bawah (_). Nama sumber daya harus dimulai dengan huruf atau garis bawah (_).

    +

    Jumlah sumber daya

    + + + + + + + +
    Sumber dayaBatas
    Koleksi65,536
    Koneksi / proxy65,536
    +

    Jumlah sumber daya dalam koleksi

    + + + + + + + + + + +
    Sumber dayaBatas
    Partisi1,024
    Pecahan16
    Bidang64
    Indeks1
    Entitastidak terbatas
    +

    Panjang sebuah string

    + + + + + + +
    Tipe dataBatas
    VARCHAR65,535
    +

    Dimensi sebuah vektor

    + + + + + + +
    PropertiBatas
    Dimensi32,768
    +

    Masukan dan Keluaran per RPC

    + + + + + + + + +
    OperasiBatas
    Memasukkan64 MB
    Cari64 MB
    Permintaan64 MB
    +

    Batas pemuatan

    Pada rilis saat ini, data yang akan dimuat harus di bawah 90% dari total sumber daya memori semua node kueri untuk mencadangkan sumber daya memori untuk mesin eksekusi.

    +

    Batas pencarian

    + + + + + + + +
    VektorBatas
    topk (jumlah hasil yang paling mirip untuk dikembalikan)16,384
    nq (jumlah permintaan pencarian)16,384
    +

    Batas indeks pada berbagai jenis pencarian

    Tabel berikut ini memberikan gambaran umum tentang dukungan untuk berbagai perilaku pencarian di berbagai jenis indeks.

    + + + + + + + + + + + + + + + + + +
    HNSWDISKANNDATARIVF_FLATIVF_SQ8IVF_PQPEMINDAIANGPU_IFV_FLATGPU_IVF_PQGPU_CAGRAGPU_BRUTE_FORCEINDEKS_TERBALIK_JARANGSPARSE_WANDBIN_FLATBIN_IVF_FLAT
    Pencarian dasarYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Pencarian partisiYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Pencarian dasar dengan data mentah yang diambilYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Pencarian dasar dengan penomoran halamanYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Pencarian yang difilterYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Pencarian rentangYaYaYaYaYaYaYaTidakTidakTidakTidakTidakTidakYaYa
    Mengelompokkan pencarianYaTidakYaYaTidakTidakTidakTidakTidakTidakTidakTidakTidakTidakTidak
    Cari dengan iteratorYaYaYaYaYaYaYaTidakTidakTidakTidakTidakTidakTidakTidak
    Pencarian hibridaYaYaYaYaYaYaYaYaYaYaYaYa (Hanya RRFRanker)Ya (Hanya RRFRanker)YaYa
    Query/GetYaYaYaYaYaYaYaYaYaYaYaYaYaYaYa
    Kueri dengan iteratorYaYaYaYaYaYaYaTidakTidakTidakTidakYaYaYaYa
    diff --git a/localization/v2.5.x/site/id/about/milvus_adopters.json b/localization/v2.5.x/site/id/about/milvus_adopters.json new file mode 100644 index 000000000..ec1d6dcfb --- /dev/null +++ b/localization/v2.5.x/site/id/about/milvus_adopters.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Adopters","anchorList":[{"label":"Pengadopsi Milvus","href":"Milvus-Adopters","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/about/milvus_adopters.md b/localization/v2.5.x/site/id/about/milvus_adopters.md new file mode 100644 index 000000000..aa8bca2d8 --- /dev/null +++ b/localization/v2.5.x/site/id/about/milvus_adopters.md @@ -0,0 +1,29 @@ +--- +id: milvus_adopters.md +title: Pengadopsi Milvus +related_key: Milvus adopters +summary: >- + Pelajari tentang perusahaan-perusahaan yang telah mengadopsi Milvus dalam + aplikasi produksi. +--- +

    Pengadopsi Milvus

    Milvus berdiri sebagai basis data vektor terdepan di kalangan pengguna perusahaan, dengan dukungan dari perusahaan-perusahaan terkemuka seperti Nvidia, Roblox, AT&T, dan banyak lagi. Di bawah ini adalah daftar perusahaan yang telah berhasil mengintegrasikan Milvus ke dalam aplikasi mereka.

    +

    + + Milvus Adopters + Pengadopsi Milvus

    +

    Kunjungi halaman kasus penggunaan Milvus untuk mengetahui bagaimana para pemimpin industri memanfaatkan Milvus untuk meningkatkan aplikasi AI mereka dan mempercepat pertumbuhan bisnis.

    diff --git a/localization/v2.5.x/site/id/about/overview.json b/localization/v2.5.x/site/id/about/overview.json new file mode 100644 index 000000000..0e6aa39e3 --- /dev/null +++ b/localization/v2.5.x/site/id/about/overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"What is Milvus?","anchorList":[{"label":"Apa itu Milvus?","href":"What-is-Milvus","type":1,"isActive":false},{"label":"Data Tidak Terstruktur, Penyematan, dan Milvus","href":"Unstructured-Data-Embeddings-and-Milvus","type":2,"isActive":false},{"label":"Apa yang Membuat Milvus Begitu Cepat?","href":"What-Makes-Milvus-so-Fast","type":2,"isActive":false},{"label":"Apa yang Membuat Milvus begitu Skalabel","href":"What-Makes-Milvus-so-Scalable","type":2,"isActive":false},{"label":"Jenis Pencarian yang Didukung oleh Milvus","href":"Types-of-Searches-Supported-by-Milvus","type":2,"isActive":false},{"label":"Kumpulan Fitur Komprehensif","href":"Comprehensive-Feature-Set","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/about/overview.md b/localization/v2.5.x/site/id/about/overview.md new file mode 100644 index 000000000..9283807f8 --- /dev/null +++ b/localization/v2.5.x/site/id/about/overview.md @@ -0,0 +1,179 @@ +--- +id: overview.md +title: Apa itu Milvus +related_key: Milvus Overview +summary: >- + Milvus adalah basis data vektor berkinerja tinggi dan sangat skalabel yang + berjalan secara efisien di berbagai lingkungan, mulai dari laptop hingga + sistem terdistribusi berskala besar. Milvus tersedia sebagai perangkat lunak + sumber terbuka dan layanan cloud. +--- +

    Apa itu Milvus?

    Milvus adalah basis data vektor berkinerja tinggi dan sangat skalabel yang berjalan secara efisien di berbagai lingkungan, mulai dari laptop hingga sistem terdistribusi berskala besar. Milvus tersedia sebagai perangkat lunak sumber terbuka dan layanan cloud.

    +

    Milvus adalah proyek sumber terbuka di bawah LF AI & Data Foundation yang didistribusikan di bawah lisensi Apache 2.0. Sebagian besar kontributor adalah para ahli dari komunitas komputasi berkinerja tinggi (HPC), yang berspesialisasi dalam membangun sistem berskala besar dan mengoptimalkan kode yang sadar akan perangkat keras. Kontributor inti termasuk para profesional dari Zilliz, ARM, NVIDIA, AMD, Intel, Meta, IBM, Salesforce, Alibaba, dan Microsoft.

    +

    Data Tidak Terstruktur, Penyematan, dan Milvus

    Data tidak terstruktur, seperti teks, gambar, dan audio, memiliki format yang beragam dan memiliki semantik yang kaya, sehingga sulit untuk dianalisis. Untuk mengelola kerumitan ini, embeddings digunakan untuk mengubah data yang tidak terstruktur menjadi vektor numerik yang menangkap karakteristik esensialnya. Vektor-vektor ini kemudian disimpan dalam basis data vektor, sehingga memungkinkan pencarian dan analisis yang cepat dan terukur.

    +

    Milvus menawarkan kemampuan pemodelan data yang kuat, memungkinkan Anda untuk mengatur data yang tidak terstruktur atau multi-modal ke dalam koleksi yang terstruktur. Milvus mendukung berbagai tipe data untuk pemodelan atribut yang berbeda, termasuk tipe numerik dan karakter yang umum, berbagai tipe vektor, larik, set, dan JSON, sehingga Anda tidak perlu repot mengelola banyak sistem basis data.

    +

    + + Untructured data, embeddings, and Milvus + Data tidak terstruktur, penyematan, dan Milvus

    +

    Milvus menawarkan tiga mode penerapan, yang mencakup berbagai skala data-dari pembuatan prototipe lokal di Jupyter Notebooks hingga cluster Kubernetes besar yang mengelola puluhan miliar vektor:

    +
      +
    • Milvus Lite adalah pustaka Python yang dapat dengan mudah diintegrasikan ke dalam aplikasi Anda. Sebagai versi ringan dari Milvus, Milvus Lite sangat ideal untuk membuat prototipe cepat di Jupyter Notebooks atau berjalan di perangkat dengan sumber daya terbatas. Pelajari lebih lanjut.
    • +
    • Milvus Standalone adalah penerapan server mesin tunggal, dengan semua komponen yang dibundel ke dalam satu image Docker untuk penerapan yang mudah. Pelajari lebih lanjut.
    • +
    • Milvus Distributed dapat digunakan pada cluster Kubernetes, menampilkan arsitektur cloud-native yang dirancang untuk skenario berskala miliaran atau bahkan lebih besar. Arsitektur ini memastikan redundansi pada komponen-komponen penting. Pelajari lebih lanjut.
    • +
    +

    Apa yang Membuat Milvus Begitu Cepat?

    Milvus dirancang sejak hari pertama untuk menjadi sistem basis data vektor yang sangat efisien. Dalam banyak kasus, Milvus mengungguli database vektor lain sebanyak 2-5x (lihat hasil VectorDBBench). Performa tinggi ini adalah hasil dari beberapa keputusan desain utama:

    +

    Pengoptimalan yang sadar akan perangkat keras: Untuk mengakomodasi Milvus di berbagai lingkungan perangkat keras, kami telah mengoptimalkan kinerjanya secara khusus untuk berbagai arsitektur dan platform perangkat keras, termasuk AVX512, SIMD, GPU, dan SSD NVMe.

    +

    Algoritma Pencarian Tingkat Lanjut: Milvus mendukung berbagai macam algoritme pengindeksan/pencarian dalam memori dan pada disk, termasuk IVF, HNSW, DiskANN, dan banyak lagi, yang semuanya telah dioptimalkan secara mendalam. Dibandingkan dengan implementasi populer seperti FAISS dan HNSWLib, Milvus memberikan kinerja 30%-70% lebih baik.

    +

    Mesin Pencari dalam bahasa C++: Lebih dari 80% kinerja basis data vektor ditentukan oleh mesin pencarinya. Milvus menggunakan C++ untuk komponen penting ini karena performa bahasa yang tinggi, optimasi tingkat rendah, dan manajemen sumber daya yang efisien. Yang paling penting, Milvus mengintegrasikan berbagai pengoptimalan kode yang sadar akan perangkat keras, mulai dari vektorisasi tingkat perakitan hingga paralelisasi dan penjadwalan multi-thread, untuk memanfaatkan kemampuan perangkat keras secara maksimal.

    +

    Berorientasi pada Kolom: Milvus adalah sistem basis data vektor yang berorientasi pada kolom. Keuntungan utama berasal dari pola akses data. Ketika melakukan kueri, database berorientasi kolom hanya membaca kolom tertentu yang terlibat dalam kueri, bukan seluruh baris, yang sangat mengurangi jumlah data yang diakses. Selain itu, operasi pada data berbasis kolom dapat dengan mudah dibuat vektornya, sehingga memungkinkan operasi diterapkan di seluruh kolom sekaligus, yang selanjutnya meningkatkan kinerja.

    +

    Apa yang Membuat Milvus begitu Skalabel

    Pada tahun 2022, Milvus mendukung vektor berskala miliaran, dan pada tahun 2023, Milvus meningkatkan skalanya hingga puluhan miliar dengan stabilitas yang konsisten, memberdayakan skenario berskala besar untuk lebih dari 300 perusahaan besar, termasuk Salesforce, PayPal, Shopee, Airbnb, eBay, NVIDIA, IBM, AT&T, LINE, ROBLOX, Inflection, dan lain-lain.

    +

    Arsitektur sistem Milvus yang cloud-native dan sangat terpisah memastikan bahwa sistem dapat terus berkembang seiring dengan pertumbuhan data:

    +

    + + Highly decoupled system architecture of Milvus + Arsitektur sistem yang sangat terpisah dari Milvus

    +

    Milvus sendiri sepenuhnya tidak memiliki status sehingga dapat dengan mudah diskalakan dengan bantuan Kubernetes atau cloud publik. Selain itu, komponen-komponen Milvus dipisahkan dengan baik, dengan tiga tugas yang paling penting-pencarian, penyisipan data, dan pengindeksan/pemadatan-dirancang sebagai proses yang mudah diparalelkan, dengan logika yang rumit yang dipisahkan. Hal ini memastikan bahwa simpul kueri, simpul data, dan simpul indeks yang sesuai dapat menskalakan naik dan turun secara independen, mengoptimalkan kinerja dan efisiensi biaya.

    +

    Jenis Pencarian yang Didukung oleh Milvus

    Milvus mendukung berbagai jenis fungsi pencarian untuk memenuhi tuntutan kasus penggunaan yang berbeda:

    +
      +
    • Pencarian ANN: Menemukan K vektor teratas yang paling dekat dengan vektor kueri Anda.
    • +
    • Pencarian Pemfilteran: Melakukan pencarian ANN di bawah kondisi pemfilteran yang ditentukan.
    • +
    • Pencarian Rentang: Menemukan vektor dalam radius tertentu dari vektor kueri Anda.
    • +
    • Pencarian Hibrida: Melakukan pencarian ANN berdasarkan beberapa bidang vektor.
    • +
    • Pencarian Teks Lengkap: Pencarian teks lengkap berdasarkan BM25.
    • +
    • Pemeringkatan ulang: Menyesuaikan urutan hasil pencarian berdasarkan kriteria tambahan atau algoritme sekunder, menyempurnakan hasil pencarian ANN awal.
    • +
    • Ambil: Mengambil data berdasarkan kunci utamanya.
    • +
    • Query: Mengambil data menggunakan ekspresi tertentu.
    • +
    +

    Kumpulan Fitur Komprehensif

    Selain fitur-fitur pencarian utama yang disebutkan di atas, Milvus juga menyediakan serangkaian fitur yang diimplementasikan di sekitar pencarian ANN sehingga Anda dapat sepenuhnya memanfaatkan kemampuannya.

    +

    API dan SDK

    +

    Tipe Data Tingkat Lanjut

    Selain tipe data primitif, Milvus mendukung berbagai tipe data tingkat lanjut dan metrik jarak yang dapat diterapkan.

    + +

    Akselerasi

      +
    • Algoritme Pencarian Milvus mendukung serangkaian pengindeksan yang dapat disesuaikan dan algoritme pencarian. Untuk detailnya, lihat Indeks Dalam Memori, Indeks Pada Disk, dan Indeks GPU.

    • +
    • Partisi dan Kunci Partisi Partisi adalah sub-divisi dari koleksi Milvus. Anda dapat memilih bidang skalar sebagai kunci partisi untuk performa pencarian yang lebih baik. Untuk detailnya, lihat Mengelola Partisi dan Menggunakan Kunci Partisi.

    • +
    • Model Konsistensi yang Dapat Disetel Konsistensi memastikan setiap simpul atau replika Milvus memiliki tampilan data yang sama ketika menulis atau membaca data pada waktu tertentu. Anda dapat dengan mudah menyetel tingkat konsistensi ketika melakukan pencarian ANN di Milvus. Untuk detailnya, lihat Konsistensi.

    • +
    • Impor Data Throughput Tinggi Untuk mengimpor data dalam jumlah besar ke dalam Milvus daripada memasukkannya satu per satu, pertimbangkan untuk menggunakan alat impor data throughput tinggi. Untuk detailnya, lihat Menyiapkan Data Sumber dan Mengimpor Data.

    • +
    • Dukungan Multi-tenancy Milvus telah mengimplementasikan banyak fitur yang berorientasi pada skenario multi-tenancy, termasuk Partition Key, Clustering Key, dan banyak lagi. Untuk detailnya, lihat Strategi Multi-tenancy.

    • +
    +

    Keamanan dan Otorisasi

      +
    • Model Konsistensi yang Dapat Disetel Konsistensi memastikan setiap node atau replika Milvus memiliki tampilan data yang sama saat menulis atau membaca data pada waktu tertentu. Anda dapat dengan mudah menyetel tingkat konsistensi saat melakukan pencarian ANN di Milvus. Untuk detailnya, lihat Konsistensi.

    • +
    • Isolasi Data dan Kontrol Sumber Daya Untuk skenario multi-tenancy, isolasi data adalah persyaratan keamanan dasar. Milvus mengimplementasikan beberapa fitur untuk menyelesaikan masalah keamanan Anda. Untuk detailnya, lihat Mengelola Grup Sumber Daya dan Pemadatan Clustering.

    • +
    +

    Integrasi AI

      +
    • Integrasi Model Penyematan Model Penyematan mengubah data yang tidak terstruktur menjadi representasi numerik dalam ruang data berdimensi tinggi sehingga Anda dapat menyimpannya di Milvus. Saat ini, PyMilvus, Python SDK, mengintegrasikan beberapa model embedding sehingga Anda dapat dengan cepat menyiapkan data Anda ke dalam embedding vektor. Untuk detailnya, lihat Ikhtisar Penyematan.

    • +
    • Integrasi Model Perangkingan Dalam ranah pencarian informasi dan AI generatif, perangking ulang adalah alat penting yang mengoptimalkan urutan hasil dari pencarian awal. PyMilvus juga mengintegrasikan beberapa model perangkingan ulang untuk mengoptimalkan urutan hasil yang dikembalikan dari pencarian awal. Untuk detailnya, lihat Ikhtisar Perangking.

    • +
    • LangChain dan Integrasi Alat AI lainnya Di era GenAI, alat, seperti LangChain, mendapatkan banyak perhatian dari para pengembang aplikasi. Sebagai komponen inti, Milvus biasanya berfungsi sebagai penyimpan vektor dalam alat tersebut. Untuk mempelajari cara mengintegrasikan Milvus ke dalam alat AI favorit Anda, lihat Integrasi dan Tutorial kami.

    • +
    +

    Alat dan Ekosistem

      +
    • Attu Attu adalah GUI intuitif lengkap yang membantu Anda mengelola Milvus dan data yang disimpannya. Untuk detailnya, lihat repositori Attu.

    • +
    • Birdwatcher Birdwatcher adalah alat debugging untuk Milvus. Dengan menggunakannya untuk terhubung ke etcd, Anda dapat memeriksa status sistem Milvus Anda atau mengkonfigurasinya dengan cepat. Untuk detailnya, lihat BirdWatcher.

    • +
    • Integrasi Promethus & Grafana Prometheus adalah perangkat pemantauan dan peringatan sistem sumber terbuka untuk Kubernetes. Grafana adalah tumpukan visualisasi sumber terbuka yang dapat terhubung dengan semua sumber data. Anda dapat menggunakan Promethus & Grafana sebagai penyedia layanan pemantauan untuk memantau kinerja Milvus yang didistribusikan secara visual. Untuk detailnya, lihat Menerapkan Layanan Pemantauan.

    • +
    • Cadangan Milvus Cadangan Milvus adalah alat yang memungkinkan pengguna untuk mencadangkan dan memulihkan data Milvus. Alat ini menyediakan CLI dan API untuk menyesuaikan diri dengan skenario aplikasi yang berbeda. Untuk detailnya, lihat Cadangan Milvus.

    • +
    • Milvus Capture Data Change (CDC) Milvus-CDC dapat menangkap dan menyinkronkan data tambahan dalam instance Milvus dan memastikan keandalan data bisnis dengan mentransfernya dengan mulus antara instance sumber dan target, sehingga memudahkan pencadangan tambahan dan pemulihan bencana. Untuk detailnya, lihat Milvus CDC.

    • +
    • Konektor Milvus Milvus telah merencanakan satu set konektor bagi Anda untuk mengintegrasikan Milvus dengan alat pihak ketiga, seperti Apache Spark. Saat ini, Anda dapat menggunakan Konektor Spark kami untuk memasukkan data Milvus Anda ke Apache Spark untuk pemrosesan pembelajaran mesin. Untuk detailnya, lihat Konektor Spark-Milvus.

    • +
    • Layanan Transmisi Vektor (VTS) Milvus menyediakan seperangkat alat bagi Anda untuk mentransfer data Anda antara instans Milvus dan sekumpulan sumber data, termasuk klaster Zilliz, Elasticsearch, Postgres (PgVector), dan instans Milvus lainnya. Untuk detailnya, lihat Migrasi.

    • +
    diff --git a/localization/v2.5.x/site/id/about/roadmap.json b/localization/v2.5.x/site/id/about/roadmap.json new file mode 100644 index 000000000..d8f44af76 --- /dev/null +++ b/localization/v2.5.x/site/id/about/roadmap.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Roadmap","anchorList":[{"label":"Peta Jalan Milvus","href":"Milvus-Roadmap","type":1,"isActive":false},{"label":"Peta Jalan","href":"Roadmap","type":2,"isActive":false},{"label":"Bagaimana cara berkontribusi","href":"How-to-contribute","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/about/roadmap.md b/localization/v2.5.x/site/id/about/roadmap.md new file mode 100644 index 000000000..be2be5781 --- /dev/null +++ b/localization/v2.5.x/site/id/about/roadmap.md @@ -0,0 +1,110 @@ +--- +id: roadmap.md +title: Peta Jalan Milvus +related_key: Milvus roadmap +summary: >- + Milvus adalah basis data vektor sumber terbuka yang dibangun untuk mendukung + aplikasi AI. Berikut ini adalah peta jalan kami untuk memandu pengembangan + kami. +--- +

    Peta Jalan Milvus

    Selamat datang di Peta Jalan Milvus! Bergabunglah bersama kami dalam perjalanan berkelanjutan kami untuk meningkatkan dan mengembangkan Milvus. Kami sangat senang berbagi pencapaian, rencana masa depan, dan visi kami untuk masa depan. Roadmap kami lebih dari sekadar daftar fitur-fitur yang akan datang - ini mencerminkan komitmen kami terhadap inovasi dan dedikasi kami untuk bekerja sama dengan komunitas. Kami mengundang Anda untuk mempelajari peta jalan kami, memberikan umpan balik, dan membantu membentuk masa depan Milvus!

    +

    Peta Jalan

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KategoriMilvus 2.5.0 (Dicapai dalam rilis terbaru)Rilis Berikutnya (Pertengahan CY25)Peta Jalan Masa Depan (Dalam 1 tahun)
    Pemrosesan Data Tidak Terstruktur Berbasis AI
    Memperkuat kemampuan untuk memproses dan menganalisis data tidak terstruktur dengan menggunakan model AI dan teknologi canggih.
    Pencarian Teks Lengkap
    Mendukung pencarian teks lengkap dengan Sparse-BM25. API baru menerima teks sebagai input dan secara otomatis menghasilkan vektor jarang di dalam Milvus

    Sparse Vector (GA)
    Mendukung metode penyimpanan dan pengindeksan yang efisien untuk vektor jarang
    Data-In dan Data-Out
    Mendukung layanan model utama untuk menelan data asli

    Advanced Reranker
    Mendukung perangking ulang berbasis model dan fungsi penilaian yang ditentukan pengguna

    Peningkatan JSON
    Pengindeksan dan penguraian JSON untuk mempercepat pemrosesan
    Data Asli Masuk dan Keluar
    Mendukung Blob dan referensi url untuk memproses data asli

    Mendukung Lebih Banyak Jenis Data
    mis. Datetime, Peta, GIS

    Mendukung Tensor
    Mendukung daftar vektor, penggunaan umum seperti Colbert, Copali, dll.
    Kualitas & Performa Pencarian
    Memberikan hasil yang akurat, relevan, dan cepat dengan mengoptimalkan arsitektur, algoritme, dan API
    Fungsi Pencocokan Teks
    Memfilter kata kunci/token dengan cepat dalam teks/varchar

    Peningkatan Pencarian Pengelompokan
    Memperkenalkan group_size dan menambahkan grup dengan dukungan dalam pencarian hybrid

    Indeks Bitmap & Indeks Terbalik
    Mempercepat pemfilteran pada tag
    Pencocokan Tingkat Lanjut
    misal: Pencocokan Frasa, Pencocokan Fuzzy, dan lebih banyak tokenizer

    Agregasi
    Agregasi bidang skalar, misal: min, max, count, distinct.
    Pembaruan Parsial
    Mendukung pembaruan untuk nilai bidang tertentu

    Kemampuan Penyortiran
    Mengurutkan berdasarkan bidang skalar selama eksekusi

    Mendukung Pengelompokan Data
    Lokalitas data
    Fungsionalitas & Manajemen yang Kaya
    Fitur manajemen data yang ramah pengembang dan kuat
    Mendukung file CSV dalam impor data
    Bulkinsert mendukung format CSV

    Mendukung Nilai Null dan Default
    Tipe Nulldan Default membuat impor data dari DBMS lain menjadi lebih mudah

    Milvus WebUI (Beta)
    Alat bantu manajemen visual untuk DBA
    Deduplikasi Primary Key
    Dengan menggunakan indeks pk global

    Perubahan Skema Online
    misal: menambah/menghapus field, memodifikasi panjang varchar

    Data Versioning & Restore
    Mendukung data versioning dengan snapshot
    Rust dan C++ SDK
    Mendukung lebih banyak klien

    Mendukung UDF
    Fungsi yang ditentukan pengguna
    Efisiensi Biaya & Arsitektur
    Sistem yang canggih, mengutamakan stabilitas, efisiensi biaya, dan skalabilitas
    Load by Field
    Pilih bagian dari koleksi yang akan dimuat

    Pengoptimalan Memori
    Mengurangi OOM dan peningkatan beban

    Streaming Node (Beta)
    Memberikan konsistensi global dan mengatasi hambatan kinerja pada koordinator root

    Format Penyimpanan V2 (Beta)
    Desain dan fondasi format universal untuk akses data berbasis disk

    Pemadatan Clustering
    Distribusi ulang data berdasarkan konfigurasi untuk mempercepat kinerja pembacaan
    Lazy Load
    Load dapat dimulai dengan operasi baca pertama tanpa secara eksplisit memanggil load()

    TieredStorage
    Mendukung penyimpanan panas dan dingin untuk optimasi biaya

    Release by Field
    Melepaskan bagian dari koleksi untuk mengurangi penggunaan memori

    Streaming Node (GA)
    Memproses data streaming dan menyederhanakan arsitektur
    Menghilangkanketergantungan
    Mengurangi atau menghilangkan ketergantungan pada komponen eksternal seperti pulsar, dll.

    Menggabungkan logika coord ke dalam MixCoord
    Menyederhanakan arsitektur
    +
      +
    • Roadmap kami biasanya terstruktur menjadi tiga bagian: rilis terbaru, rilis berikutnya yang akan datang, dan visi jangka menengah hingga jangka panjang dalam satu tahun ke depan.
    • +
    • Seiring dengan perkembangannya, kami terus belajar dan sesekali menyesuaikan fokus kami, menambahkan atau menghapus item sesuai kebutuhan.
    • +
    • Rencana ini bersifat indikatif dan dapat berubah, dan dapat bervariasi berdasarkan layanan berlangganan.
    • +
    • Kami tetap berpegang teguh pada peta jalan kami, dengan catatan rilis kami yang berfungsi sebagai referensi.
    • +
    +

    Bagaimana cara berkontribusi

    Sebagai proyek sumber terbuka, Milvus berkembang dengan kontribusi komunitas. Berikut adalah cara Anda dapat menjadi bagian dari perjalanan kami.

    +

    Berbagi umpan balik

    +

    Kontribusi kode

      +
    • Tarik permintaan: Berkontribusi langsung ke basis kode kami. Baik itu memperbaiki bug, menambahkan fitur, atau meningkatkan dokumentasi, kontribusi Anda diterima.

    • +
    • Panduan pengembangan: Lihat Panduan Kontributor kami untuk panduan kontribusi kode.

    • +
    +

    Menyebarkan berita

      +
    • Berbagi secara sosial: Suka Milvus? Bagikan kasus penggunaan dan pengalaman Anda di media sosial dan blog teknologi.

    • +
    • Bintangi kami di GitHub: Tunjukkan dukungan Anda dengan membintangi repositori GitHub kami.

    • +
    diff --git a/localization/v2.5.x/site/id/adminGuide/allocate.json b/localization/v2.5.x/site/id/adminGuide/allocate.json new file mode 100644 index 000000000..bd2eced83 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/allocate.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi\n","helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi\n","dataNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\nqueryNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\n","helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml\n"],"headingContent":"Allocate Resources on Kubernetes","anchorList":[{"label":"Mengalokasikan Sumber Daya di Kubernetes","href":"Allocate-Resources-on-Kubernetes","type":1,"isActive":false},{"label":"1. Melihat sumber daya yang tersedia","href":"1-View-available-resources","type":2,"isActive":false},{"label":"2. Mengalokasikan sumber daya","href":"2-Allocate-resources","type":2,"isActive":false},{"label":"3. Menerapkan konfigurasi","href":"3-Apply-configurations","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/allocate.md b/localization/v2.5.x/site/id/adminGuide/allocate.md new file mode 100644 index 000000000..5794341b8 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/allocate.md @@ -0,0 +1,141 @@ +--- +id: allocate.md +title: Mengalokasikan Sumber Daya ke Milvus di Kubernetes +summary: Pelajari cara mengalokasikan sumber daya ke Milvus di Kubernetes. +--- +

    Mengalokasikan Sumber Daya di Kubernetes

    Topik ini menjelaskan cara mengalokasikan sumber daya ke cluster Milvus di Kubernetes.

    +

    Secara umum, sumber daya yang Anda alokasikan ke klaster Milvus dalam produksi harus proporsional dengan beban kerja mesin. Anda juga harus mempertimbangkan jenis mesin saat mengalokasikan sumber daya. Meskipun Anda dapat memperbarui konfigurasi saat klaster berjalan, kami sarankan untuk menetapkan nilainya sebelum menerapkan klaster.

    +
    +

    Untuk informasi tentang cara mengalokasikan sumber daya dengan Milvus Operator, lihat Mengalokasikan Sumber Daya dengan Milvus Operator.

    +
    +

    1. Melihat sumber daya yang tersedia

    Jalankan kubectl describe nodes untuk melihat sumber daya yang tersedia pada instance yang telah Anda sediakan.

    +

    2. Mengalokasikan sumber daya

    Gunakan Helm untuk mengalokasikan sumber daya CPU dan memori ke komponen Milvus.

    +
    +Menggunakan Helm untuk meningkatkan sumber daya akan menyebabkan pod yang sedang berjalan melakukan pembaruan bergulir.
    +

    Ada dua cara untuk mengalokasikan sumber daya:

    + +

    Mengalokasikan sumber daya dengan perintah

    Anda perlu mengatur variabel sumber daya untuk setiap komponen Milvus jika Anda menggunakan --set untuk memperbarui konfigurasi sumber daya.

    + +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi
    +
    +
    +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi
    +
    +
    +

    Mengalokasikan sumber daya dengan mengatur file konfigurasi

    Anda juga dapat mengalokasikan sumber daya CPU dan memori dengan menetapkan parameter resources.requests dan resources.limits pada berkas resources.yaml.

    +
    dataNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +queryNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +
    +

    3. Menerapkan konfigurasi

    Jalankan perintah berikut untuk menerapkan konfigurasi baru ke cluster Milvus Anda.

    +
    helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml
    +
    +
    +Jika resources.limits tidak ditentukan, pod akan menggunakan semua sumber daya CPU dan memori yang tersedia. Oleh karena itu, pastikan untuk menentukan resources.requests dan resources.limits untuk menghindari pengalokasian sumber daya secara keseluruhan saat tugas lain yang berjalan pada instans yang sama membutuhkan konsumsi memori lebih banyak.
    +

    Lihat dokumentasi Kubernetes untuk informasi lebih lanjut tentang mengelola sumber daya.

    +

    Selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/authenticate.json b/localization/v2.5.x/site/id/adminGuide/authenticate.json new file mode 100644 index 000000000..1a766b390 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/authenticate.json @@ -0,0 +1 @@ +{"codeList":["...\ncommon:\n...\n security:\n authorizationEnabled: true\n...\n","...\nextraConfigFiles:\n user.yaml: |+\n common:\n security:\n authorizationEnabled: true\n...\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n common:\n security:\n authorizationEnabled: true\n","# use default `root` user to connect to Milvus\n\nfrom pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri='http://localhost:19530', # replace with your own Milvus server address\n token=\"root:Milvus\"\n) \n","# create a user\nclient.create_user(\n user_name=\"user_1\",\n password=\"P@ssw0rd\",\n)\n\n# verify the user has been created\n\nclient.describe_user(\"user_1\")\n\n# output\n# {'user_name': 'user_1', 'roles': ()}\n","# connect to milvus with the newly created user\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"user_1:P@ssw0rd\"\n)\n","# update password\n\nclient.update_password(\n user_name=\"user_1\",\n old_password=\"P@ssw0rd\",\n new_password=\"P@ssw0rd123\"\n)\n","common:\n security:\n superUsers: root, foo\n","client.drop_user(user_name=\"user_1\")\n","# list all users\n\nclient.list_users()\n"],"headingContent":"Authenticate User Access","anchorList":[{"label":"Mengautentikasi Akses Pengguna","href":"Authenticate-User-Access","type":1,"isActive":false},{"label":"Mengaktifkan autentikasi pengguna","href":"Enable-user-authentication","type":2,"isActive":false},{"label":"Terhubung ke Milvus dengan autentikasi","href":"Connect-to-Milvus-with-authentication","type":2,"isActive":false},{"label":"Membuat pengguna baru","href":"Create-a-new-user","type":2,"isActive":false},{"label":"Terhubung ke Milvus dengan pengguna baru","href":"Connect-to-Milvus-with-a-new-user","type":2,"isActive":false},{"label":"Memperbarui kata sandi pengguna","href":"Update-user-password","type":2,"isActive":false},{"label":"Menghapus pengguna","href":"Drop-a-user","type":2,"isActive":false},{"label":"Membuat daftar semua pengguna","href":"List-all-users","type":2,"isActive":false},{"label":"Batasan","href":"Limitations","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/authenticate.md b/localization/v2.5.x/site/id/adminGuide/authenticate.md new file mode 100644 index 000000000..c9d0260c9 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/authenticate.md @@ -0,0 +1,277 @@ +--- +id: authenticate.md +summary: Pelajari cara mengelola autentikasi pengguna di Milvus. +title: Mengautentikasi Akses Pengguna +--- +

    Mengautentikasi Akses Pengguna

    Panduan ini menjelaskan cara mengelola autentikasi pengguna di Milvus, termasuk mengaktifkan autentikasi, menyambung sebagai pengguna, dan memodifikasi kredensial pengguna.

    +
    +
      +
    • TLS dan autentikasi pengguna adalah dua pendekatan keamanan yang berbeda. Jika anda telah mengaktifkan autentikasi pengguna dan TLS di sistem Milvus anda, anda harus menyediakan nama pengguna, kata sandi, dan jalur file sertifikat. Untuk informasi tentang cara mengaktifkan TLS, lihat Enkripsi dalam Perjalanan.

    • +
    • Potongan kode pada halaman ini menggunakan MilvusClient (Python) baru untuk berinteraksi dengan Milvus. SDK MilvusClient baru untuk bahasa lain akan dirilis pada pembaruan mendatang.

    • +
    +
    +

    Mengaktifkan autentikasi pengguna

    +
    +

    Untuk mengaktifkan autentikasi pengguna bagi server Milvus Anda, setel common.security.authorizationEnabled ke true pada berkas konfigurasi Milvus milvus.yaml. Untuk informasi lebih lanjut tentang konfigurasi, lihat Mengkonfigurasi Milvus dengan Docker Compose.

    +
    ...
    +common:
    +...
    +  security:
    +    authorizationEnabled: true
    +...
    +
    +
    +
    +

    Untuk mengaktifkan autentikasi pengguna bagi server Milvus Anda, setel authorizationEnabled ke true pada berkas konfigurasi Milvus values.yaml. Untuk informasi lebih lanjut tentang konfigurasi, lihat Mengkonfigurasi Milvus dengan Helm Charts.

    +
    ...
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        authorizationEnabled: true
    +...
    +
    +
    +
    +

    Untuk mengaktifkan autentikasi, setel spec.common.security.authorizationEnabled ke true pada CRD Milvus. Untuk informasi lebih lanjut tentang CRD Milvus, lihat Mengkonfigurasi Milvus dengan Operator Milvus.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  config:
    +    common:
    +      security:
    +        authorizationEnabled: true
    +
    +
    +

    Terhubung ke Milvus dengan autentikasi

    Setelah mengaktifkan autentikasi, Anda harus terhubung ke Milvus menggunakan nama pengguna dan kata sandi. Secara default, pengguna root dibuat dengan kata sandi Milvus ketika Milvus dimulai. Berikut ini adalah contoh bagaimana menghubungkan ke Milvus dengan autentikasi yang diaktifkan menggunakan pengguna default root:

    +
    # use default `root` user to connect to Milvus
    +
    +from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri='http://localhost:19530', # replace with your own Milvus server address
    +    token="root:Milvus"
    +) 
    +
    +
    +Jika Anda gagal memberikan token yang valid saat menyambung ke Milvus dengan autentikasi yang diaktifkan, Anda akan menerima kesalahan gRPC.
    +

    Membuat pengguna baru

    Setelah tersambung sebagai pengguna root default, Anda dapat membuat dan mengautentikasi pengguna baru sebagai berikut:

    +
    # create a user
    +client.create_user(
    +    user_name="user_1",
    +    password="P@ssw0rd",
    +)
    +
    +# verify the user has been created
    +
    +client.describe_user("user_1")
    +
    +# output
    +# {'user_name': 'user_1', 'roles': ()}
    +
    +

    Untuk informasi lebih lanjut tentang cara membuat pengguna, lihat create_user().

    +

    Terhubung ke Milvus dengan pengguna baru

    Sambungkan dengan menggunakan kredensial pengguna yang baru dibuat:

    +
    # connect to milvus with the newly created user
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="user_1:P@ssw0rd"
    +)
    +
    +

    Memperbarui kata sandi pengguna

    Ubah kata sandi untuk pengguna yang sudah ada dengan kode berikut:

    +
    # update password
    +
    +client.update_password(
    +    user_name="user_1",
    +    old_password="P@ssw0rd",
    +    new_password="P@ssw0rd123"
    +)
    +
    +

    Untuk informasi lebih lanjut mengenai cara memperbarui kata sandi pengguna, lihat update_password().

    +

    Jika anda lupa kata sandi lama anda, Milvus menyediakan sebuah item konfigurasi yang memungkinkan anda untuk menetapkan pengguna tertentu sebagai pengguna super. Hal ini menghilangkan kebutuhan akan kata sandi lama ketika anda mengatur ulang kata sandi.

    +

    Secara default, kolom common.security.superUsers pada file konfigurasi Milvus kosong, yang berarti bahwa semua pengguna harus memasukkan kata sandi lama ketika mereset kata sandi mereka. Namun, anda dapat menetapkan pengguna tertentu sebagai pengguna super yang tidak perlu memberikan kata sandi lama. Pada cuplikan di bawah ini, root dan foo ditetapkan sebagai pengguna super.

    +

    Anda harus menambahkan item konfigurasi di bawah ini pada berkas konfigurasi Milvus yang mengatur jalannya instans Milvus Anda.

    +
    common:
    +    security:
    +        superUsers: root, foo
    +
    +

    Menghapus pengguna

    Untuk menghapus pengguna, gunakan metode drop_user().

    +
    client.drop_user(user_name="user_1")
    +
    +
    +Untuk menjatuhkan pengguna, Anda tidak boleh menjadi pengguna yang dijatuhkan. Jika tidak, kesalahan akan muncul.
    +

    Membuat daftar semua pengguna

    Membuat daftar semua pengguna.

    +
    # list all users
    +
    +client.list_users()
    +
    +

    Batasan

      +
    1. Nama pengguna tidak boleh kosong, dan panjangnya tidak boleh lebih dari 32 karakter. Nama pengguna harus dimulai dengan huruf, dan hanya berisi garis bawah, huruf, atau angka.
    2. +
    3. Kata sandi harus terdiri dari minimal 6 karakter dan tidak boleh melebihi 256 karakter.
    4. +
    +

    Selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/chunk_cache.json b/localization/v2.5.x/site/id/adminGuide/chunk_cache.json new file mode 100644 index 000000000..7763d9fb7 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/chunk_cache.json @@ -0,0 +1 @@ +{"codeList":["queryNode:\n cache:\n warmup: async\n"],"headingContent":"Configure Chunk Cache","anchorList":[{"label":"Mengonfigurasi Chunk Cache","href":"Configure-Chunk-Cache","type":1,"isActive":false},{"label":"Latar Belakang","href":"Background","type":2,"isActive":false},{"label":"Mengonfigurasi Chunk Cache","href":"Configure-Chunk-Cache","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/chunk_cache.md b/localization/v2.5.x/site/id/adminGuide/chunk_cache.md new file mode 100644 index 000000000..2ed871e6e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/chunk_cache.md @@ -0,0 +1,77 @@ +--- +id: chunk_cache.md +title: Mengonfigurasi Chunk Cache +--- +

    Mengonfigurasi Chunk Cache

    Mekanisme chunk cache memungkinkan Milvus untuk memuat data terlebih dahulu ke dalam cache pada hard disk lokal dari node kueri sebelum dibutuhkan. Mekanisme ini secara signifikan meningkatkan kinerja pengambilan vektor dengan mengurangi waktu yang dibutuhkan untuk memuat data dari disk ke memori.

    +

    Latar Belakang

    Sebelum melakukan kueri untuk mengambil vektor, Milvus perlu memuat data dari penyimpanan objek ke cache memori pada hard disk lokal node kueri. Ini adalah proses yang memakan waktu. Sebelum semua data dimuat, Milvus mungkin merespons beberapa permintaan pengambilan vektor dengan penundaan.

    +

    Untuk meningkatkan kinerja kueri, Milvus menyediakan mekanisme cache chunk untuk memuat data dari penyimpanan objek ke dalam cache di hard disk lokal sebelum dibutuhkan. Ketika permintaan kueri diterima, Segcore pertama-tama memeriksa apakah data ada di cache, bukan di penyimpanan objek. Jika data ada di cache, Segcore dapat dengan cepat mengambilnya dari cache dan mengembalikan hasilnya ke klien.

    +

    Mengonfigurasi Cache Chunk

    Panduan ini menyediakan instruksi tentang cara mengonfigurasi mekanisme chunk cache untuk instance Milvus. Konfigurasi bervariasi sesuai dengan cara Anda menginstal instans Milvus.

    +
      +
    • Untuk instans Milvus yang diinstal menggunakan Helm Charts

      +

      Tambahkan konfigurasi ke file values.yaml di bawah bagian config. Untuk detailnya, lihat Mengonfigurasi Milvus dengan Helm Charts.

    • +
    • Untuk instans Milvus yang diinstal menggunakan Docker Compose

      +

      Tambahkan konfigurasi ke berkas milvus.yaml yang Anda gunakan untuk memulai instans Milvus. Untuk detailnya, lihat Mengkonfigurasi Milvus dengan Docker Compose.

    • +
    • Untuk instans Milvus yang diinstal menggunakan Operator

      +

      Tambahkan konfigurasi ke bagian spec.components pada sumber daya kustom Milvus. Untuk detailnya, lihat Mengkonfigurasi Milvus dengan Operator.

    • +
    +

    Opsi konfigurasi

    queryNode:
    +    cache:
    +        warmup: async
    +
    +

    Parameter warmup menentukan apakah Milvus melakukan pra-muat data dari penyimpanan objek ke dalam cache di hard disk lokal dari node kueri sebelum dibutuhkan. Parameter ini secara default adalah disable. Opsi yang mungkin adalah sebagai berikut:

    +
      +
    • async: Milvus melakukan pra-muat data secara asinkron di latar belakang, yang tidak mempengaruhi waktu yang dibutuhkan untuk memuat koleksi. Namun, pengguna mungkin mengalami penundaan ketika mengambil vektor untuk waktu yang singkat setelah proses pemuatan selesai. Ini adalah opsi default.
    • +
    • sync: Milvus melakukan pra-load data secara sinkron, yang dapat mempengaruhi waktu yang dibutuhkan untuk memuat koleksi. Namun, pengguna dapat melakukan kueri segera setelah proses pemuatan selesai tanpa penundaan.
    • +
    • disable: Milvus tidak melakukan pra-memuat data ke dalam cache memori.
    • +
    +

    Perhatikan bahwa pengaturan cache chunk juga berlaku ketika data baru dimasukkan ke dalam koleksi atau indeks koleksi dibangun ulang.

    +

    PERTANYAAN UMUM

      +
    • Bagaimana cara menentukan apakah mekanisme chunk cache bekerja dengan benar?

      +

      Anda disarankan untuk memeriksa latensi permintaan pencarian atau kueri setelah memuat koleksi. Jika latensi secara signifikan lebih tinggi dari yang diharapkan (misalnya, beberapa detik), hal ini mengindikasikan bahwa mekanisme cache chunk masih berfungsi.

      +

      Jika latensi kueri tetap tinggi untuk waktu yang lama. Anda dapat memeriksa throughput penyimpanan objek untuk memastikan bahwa chunk cache masih berfungsi. Dalam kasus normal, chunk cache yang berfungsi akan menghasilkan throughput yang tinggi pada penyimpanan objek. Sebagai alternatif, Anda dapat mencoba chunk cache dalam mode sync.

    • +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.json b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.json new file mode 100644 index 000000000..094a9bd32 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.json @@ -0,0 +1 @@ +{"codeList":["variable \"index_count\" {\n description = \"Amount of index instances to run\"\n type = number\n default = 5\n}\n","variable \"index_ec2_type\" {\n description = \"Which server type\"\n type = string\n default = \"c5.2xlarge\"\n}\n","variable \"key_name\" {\n description = \"Which aws key to use for access into instances, needs to be uploaded already\"\n type = string\n default = \"\"\n}\n\nvariable \"my_ip\" {\n description = \"my_ip for security group. used so that ansible and terraform can ssh in\"\n type = string\n default = \"x.x.x.x/32\"\n}\n","provider \"aws\" {\n profile = \"default\"\n region = \"us-east-2\"\n}\n","resource \"aws_security_group\" \"cluster_sg\" {\n name = \"cluster_sg\"\n description = \"Allows only me to access\"\n vpc_id = aws_vpc.cluster_vpc.id\n\n ingress {\n description = \"All ports from my IP\"\n from_port = 0\n to_port = 65535\n protocol = \"tcp\"\n cidr_blocks = [var.my_ip]\n }\n\n ingress {\n description = \"Full subnet communication\"\n from_port = 0\n to_port = 65535\n protocol = \"all\"\n self = true\n }\n\n egress {\n from_port = 0\n to_port = 0\n protocol = \"-1\"\n cidr_blocks = [\"0.0.0.0/0\"]\n ipv6_cidr_blocks = [\"::/0\"]\n }\n\n tags = {\n Name = \"cluster_sg\"\n }\n}\n","resource \"aws_vpc\" \"cluster_vpc\" {\n cidr_block = \"10.0.0.0/24\"\n tags = {\n Name = \"cluster_vpc\"\n }\n}\n\nresource \"aws_internet_gateway\" \"cluster_gateway\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n tags = {\n Name = \"cluster_gateway\"\n }\n}\n","resource \"aws_subnet\" \"cluster_subnet\" {\n vpc_id = aws_vpc.cluster_vpc.id\n cidr_block = \"10.0.0.0/24\"\n map_public_ip_on_launch = true\n\n tags = {\n Name = \"cluster_subnet\"\n }\n}\n\nresource \"aws_route_table\" \"cluster_subnet_gateway_route\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n route {\n cidr_block = \"0.0.0.0/0\"\n gateway_id = aws_internet_gateway.cluster_gateway.id\n }\n\n tags = {\n Name = \"cluster_subnet_gateway_route\"\n }\n}\n\nresource \"aws_route_table_association\" \"cluster_subnet_add_gateway\" {\n subnet_id = aws_subnet.cluster_subnet.id\n route_table_id = aws_route_table.cluster_subnet_gateway_route.id\n}\n\n","resource \"aws_instance\" \"minio_node\" {\n count = var.minio_count\n ami = \"ami-0d8d212151031f51c\"\n instance_type = var.minio_ec2_type\n key_name = var.key_name\n subnet_id = aws_subnet.cluster_subnet.id \n vpc_security_group_ids = [aws_security_group.cluster_sg.id]\n\n root_block_device {\n volume_type = \"gp2\"\n volume_size = 1000\n }\n \n tags = {\n Name = \"minio-${count.index + 1}\"\n }\n}\n","git clone https://github.com/milvus-io/milvus.git\n","$ cd ./milvus/deployments/docker/cluster-distributed-deployment\n","[dockernodes] #Add docker host names.\ndockernode01\ndockernode02\ndockernode03\n\n[admin] #Add Ansible controller name.\nansible-controller\n\n[coords] #Add the host names of Milvus coordinators.\n; Take note the IP of this host VM, and replace 10.170.0.17 with it.\ndockernode01\n\n[nodes] #Add the host names of Milvus nodes.\ndockernode02\n\n[dependencies] #Add the host names of Milvus dependencies.\n; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. \n; Take note the IP of this host VM, and replace 10.170.0.19 with it.\ndockernode03\n\n[docker:children]\ndockernodes\ncoords\nnodes\ndependencies\n\n[docker:vars]\nansible_python_interpreter= /usr/bin/python3\nStrictHostKeyChecking= no\n\n; Setup variables to control what type of network to use when creating containers.\ndependencies_network= host\nnodes_network= host\n\n; Setup varibale to control what version of Milvus image to use.\nimage= milvusdb/milvus-dev:master-20220412-4781db8a\n\n; Setup static IP addresses of the docker hosts as variable for container environment variable config.\n; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM\n; on which the etcd, minio, pulsar, coordinators will be hosted.\netcd_ip= 10.170.0.19\nminio_ip= 10.170.0.19\npulsar_ip= 10.170.0.19\ncoords_ip= 10.170.0.17\n\n; Setup container environment which later will be used in container creation.\nETCD_ENDPOINTS= {{etcd_ip}}:2379 \nMINIO_ADDRESS= {{minio_ip}}:9000\nPULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650\nQUERY_COORD_ADDRESS= {{coords_ip}}:19531\nDATA_COORD_ADDRESS= {{coords_ip}}:13333\nROOT_COORD_ADDRESS= {{coords_ip}}:53100\nINDEX_COORD_ADDRESS= {{coords_ip}}:31000\n","[defaults]\nhost_key_checking = False\ninventory = inventory.ini # Specify the Inventory file\nprivate_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host\n","---\n- name: setup pre-requisites # Install prerequisite\n hosts: all\n become: yes\n become_user: root\n roles:\n - install-modules\n - configure-hosts-file\n\n- name: install docker\n become: yes\n become_user: root\n hosts: dockernodes\n roles:\n - docker-installation\n","$ ansible all -m ping\n","dockernode01 | SUCCESS => {\n\"changed\": false,\n\"ping\": \"pong\"\n}\nansible-controller | SUCCESS => {\n \"ansible_facts\": {\n \"discovered_interpreter_python\": \"/usr/bin/python3\"\n },\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode03 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode02 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\n","$ ansible-playbook deploy-docker.yml --syntax-check\n","playbook: deploy-docker.yml\n","$ ansible-playbook deploy-docker.yml\n","TASK [docker-installation : Install Docker-CE] *******************************************************************\nok: [dockernode01]\nok: [dockernode03]\nok: [dockernode02]\n\nTASK [docker-installation : Install python3-docker] **************************************************************\nok: [dockernode01]\nok: [dockernode02]\nok: [dockernode03]\n\nTASK [docker-installation : Install docker-compose python3 library] **********************************************\nchanged: [dockernode01]\nchanged: [dockernode03]\nchanged: [dockernode02]\n\nPLAY RECAP *******************************************************************************************************\nansible-controller : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n","$ docker -v\n","$ sudo docker -v\n","Docker version 20.10.14, build a224086\n","$ docker ps\n","$ ansible-playbook deploy-milvus.yml --syntax-check\n","playbook: deploy-milvus.yml\n","$ ansible-playbook deploy-milvus.yml\n","PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode03]\n\nTASK [etcd] *******************************************************************************************************\nchanged: [dockernode03]\n\nTASK [pulsar] *****************************************************************************************************\nchanged: [dockernode03]\n\nTASK [minio] ******************************************************************************************************\nchanged: [dockernode03]\n\nPLAY [Create milvus nodes] ****************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode02]\n\nTASK [querynode] **************************************************************************************************\nchanged: [dockernode02]\n\nTASK [datanode] ***************************************************************************************************\nchanged: [dockernode02]\n\nTASK [indexnode] **************************************************************************************************\nchanged: [dockernode02]\n\nPLAY [Create milvus coords] ***************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode01]\n\nTASK [rootcoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [datacoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [querycoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [indexcoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [proxy] ******************************************************************************************************\nchanged: [dockernode01]\n\nPLAY RECAP ********************************************************************************************************\ndockernode01 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n"],"headingContent":"(Deprecated) Deploy a Milvus Cluster on EC2","anchorList":[{"label":"(Tidak lagi digunakan) Menerapkan Cluster Milvus pada EC2","href":"Deprecated-Deploy-a-Milvus-Cluster-on-EC2","type":1,"isActive":false},{"label":"Menyediakan cluster Milvus","href":"Provision-a-Milvus-cluster","type":2,"isActive":false},{"label":"Memulai cluster Milvus","href":"Start-the-Milvus-cluster","type":2,"isActive":false},{"label":"Menghentikan node","href":"Stop-nodes","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.md b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.md new file mode 100644 index 000000000..ffb379d5c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws.md @@ -0,0 +1,494 @@ +--- +id: aws.md +title: Menerapkan Cluster Milvus pada EC2 +related_key: cluster +summary: Pelajari cara menggunakan cluster Milvus di AWS EC2. +--- +

    (Tidak lagi digunakan) Menerapkan Cluster Milvus pada EC2

    Topik ini menjelaskan cara menggunakan cluster Milvus di Amazon EC2 dengan Terraform dan Ansible.

    +
    +

    Topik ini sudah usang dan akan segera dihapus. Anda disarankan untuk merujuk ke Menerapkan Cluster Milvus pada EKS sebagai gantinya.

    +
    +

    Menyediakan cluster Milvus

    Bagian ini menjelaskan cara menggunakan Terraform untuk menyediakan cluster Milvus.

    +

    Terraform adalah alat perangkat lunak infrastruktur sebagai kode (IaC). Dengan Terraform, Anda dapat menyediakan infrastruktur dengan menggunakan file konfigurasi deklaratif.

    +

    Prasyarat

      +
    • Menginstal dan mengonfigurasi Terraform

    • +
    • Menginstal dan mengonfigurasi AWS CLI

    • +
    +

    Siapkan konfigurasi

    Anda dapat mengunduh file konfigurasi template di Google Drive.

    +
      +
    • main.tf

      +

      File ini berisi konfigurasi untuk penyediaan cluster Milvus.

    • +
    • variables.tf

      +

      File ini memungkinkan pengeditan cepat variabel yang digunakan untuk menyiapkan atau memperbarui cluster Milvus.

    • +
    • output.tf dan inventory.tmpl

      +

      File-file ini menyimpan metadata dari cluster Milvus. Metadata yang digunakan dalam topik ini adalah public_ip untuk setiap instance node, private_ip untuk setiap instance node, dan semua ID instance EC2.

    • +
    +

    Menyiapkan variabel.tf

    Bagian ini menjelaskan konfigurasi yang berisi file variables.tf.

    +
      +
    • Jumlah node

      +

      Templat berikut ini mendeklarasikan variabel index_count yang digunakan untuk mengatur jumlah simpul indeks.

      +
      Nilai index_count harus lebih besar atau sama dengan satu.
      +
      variable "index_count" {
      +  description = "Amount of index instances to run"
      +  type        = number
      +  default     = 5
      +}
      +
    • +
    • Jenis contoh untuk jenis simpul

      +

      Templat berikut ini mendeklarasikan variabel index_ec2_type yang digunakan untuk mengatur tipe instance untuk node indeks.

      +
      variable "index_ec2_type" {
      +  description = "Which server type"
      +  type        = string
      +  default     = "c5.2xlarge"
      +}
      +
    • +
    • Izin akses

      +

      Templat berikut ini mendeklarasikan variabel key_name dan variabel my_ip. Variabel key_name mewakili kunci akses AWS. Variabel my_ip mewakili rentang alamat IP untuk grup keamanan.

      +
      variable "key_name" {
      +  description = "Which aws key to use for access into instances, needs to be uploaded already"
      +  type        = string
      +  default     = ""
      +}
      +
      +variable "my_ip" {
      +  description = "my_ip for security group. used so that ansible and terraform can ssh in"
      +  type        = string
      +  default     = "x.x.x.x/32"
      +}
      +
    • +
    +

    Menyiapkan main.tf

    Bagian ini menjelaskan konfigurasi yang berisi file main.tf.

    +
      +
    • Penyedia dan wilayah cloud

      +

      Templat berikut ini menggunakan wilayah us-east-2. Lihat Wilayah yang Tersedia untuk informasi lebih lanjut.

      +
      provider "aws" {
      +  profile = "default"
      +  region  = "us-east-2"
      +}
      +
    • +
    • Grup keamanan

      +

      Templat berikut ini mendeklarasikan grup keamanan yang mengizinkan lalu lintas masuk dari rentang alamat CIDR yang diwakili oleh my_ip yang dideklarasikan di variables.tf.

      +
      resource "aws_security_group" "cluster_sg" {
      +  name        = "cluster_sg"
      +  description = "Allows only me to access"
      +  vpc_id      = aws_vpc.cluster_vpc.id
      +
      +  ingress {
      +    description      = "All ports from my IP"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "tcp"
      +    cidr_blocks      = [var.my_ip]
      +  }
      +
      +  ingress {
      +    description      = "Full subnet communication"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "all"
      +    self             = true
      +  }
      +
      +  egress {
      +    from_port        = 0
      +    to_port          = 0
      +    protocol         = "-1"
      +    cidr_blocks      = ["0.0.0.0/0"]
      +    ipv6_cidr_blocks = ["::/0"]
      +  }
      +
      +  tags = {
      +    Name = "cluster_sg"
      +  }
      +}
      +
    • +
    • VPC

      +

      Templat berikut menentukan VPC dengan blok CIDR 10.0.0.0/24 pada cluster Milvus.

      +
      resource "aws_vpc" "cluster_vpc" {
      +  cidr_block = "10.0.0.0/24"
      +  tags = {
      +    Name = "cluster_vpc"
      +  }
      +}
      +
      +resource "aws_internet_gateway" "cluster_gateway" {
      +  vpc_id = aws_vpc.cluster_vpc.id
      +
      +  tags = {
      +    Name = "cluster_gateway"
      +  }
      +}
      +
    • +
    • Subnet (Opsional)

      +

      Templat berikut ini mendeklarasikan subnet yang trafiknya dialihkan ke gateway internet. Dalam kasus ini, ukuran blok CIDR subnet sama dengan blok CIDR VPC.

      +
      resource "aws_subnet" "cluster_subnet" {
      +  vpc_id                  = aws_vpc.cluster_vpc.id
      +  cidr_block              = "10.0.0.0/24"
      +  map_public_ip_on_launch = true
      +
      +  tags = {
      +    Name = "cluster_subnet"
      +  }
      +}
      +
      +resource "aws_route_table" "cluster_subnet_gateway_route" {
      +  vpc_id       = aws_vpc.cluster_vpc.id
      +
      +  route {
      +    cidr_block = "0.0.0.0/0"
      +    gateway_id = aws_internet_gateway.cluster_gateway.id
      +  }
      +
      +  tags = {
      +    Name = "cluster_subnet_gateway_route"
      +  }
      +}
      +
      +resource "aws_route_table_association" "cluster_subnet_add_gateway" {
      +  subnet_id      = aws_subnet.cluster_subnet.id
      +  route_table_id = aws_route_table.cluster_subnet_gateway_route.id
      +}
      +
      +
    • +
    • Instance node (Node)

      +

      Templat berikut ini mendeklarasikan instance node MinIO. File template main.tf mendeklarasikan node dari 11 jenis node. Untuk beberapa jenis node, Anda perlu mengatur root_block_device. Lihat Perangkat EBS, Ephemeral, dan Root Block untuk informasi lebih lanjut.

      +
      resource "aws_instance" "minio_node" {
      +  count         = var.minio_count
      +  ami           = "ami-0d8d212151031f51c"
      +  instance_type = var.minio_ec2_type
      +  key_name      = var.key_name
      +  subnet_id     = aws_subnet.cluster_subnet.id 
      +  vpc_security_group_ids = [aws_security_group.cluster_sg.id]
      +
      +  root_block_device {
      +    volume_type = "gp2"
      +    volume_size = 1000
      +  }
      +  
      +  tags = {
      +    Name = "minio-${count.index + 1}"
      +  }
      +}
      +
    • +
    +

    Menerapkan konfigurasi

      +
    1. Buka terminal dan arahkan ke folder yang menyimpan main.tf.

    2. +
    3. Untuk menginisialisasi konfigurasi, jalankan terraform init.

    4. +
    5. Untuk menerapkan konfigurasi, jalankan terraform apply dan masukkan yes saat diminta.

    6. +
    +

    Anda sekarang telah menyediakan cluster Milvus dengan Terraform.

    +

    Memulai cluster Milvus

    Bagian ini menjelaskan cara menggunakan Ansible untuk memulai cluster Milvus yang telah Anda sediakan.

    +

    Ansible adalah alat manajemen konfigurasi yang digunakan untuk mengotomatiskan penyediaan cloud dan manajemen konfigurasi.

    +

    Prasyarat

    +

    Unduh Panduan Penyebaran Node Ansible Milvus

    Kloning repositori Milvus dari GitHub untuk mengunduh Playbook penyebaran node Ansible Milvus.

    +
    git clone https://github.com/milvus-io/milvus.git
    +
    +

    Mengonfigurasi file instalasi

    File inventory.ini dan ansible.cfg digunakan untuk mengontrol variabel lingkungan dan metode verifikasi masuk di Ansible playbook. Dalam berkas inventory.ini, bagian dockernodes mendefinisikan semua server mesin docker. Bagian ansible.cfg mendefinisikan semua server koordinator Milvus. Bagian node mendefinisikan semua server dari simpul Milvus.

    +

    Masukkan jalur lokal ke Playbook dan konfigurasikan berkas instalasi.

    +
    $ cd ./milvus/deployments/docker/cluster-distributed-deployment
    +
    +

    inventory.ini

    Konfigurasikan inventory.ini untuk membagi host dalam kelompok sesuai dengan perannya dalam sistem Milvus.

    +

    Tambahkan nama host, dan tentukan grup docker dan vars.

    +
    [dockernodes] #Add docker host names.
    +dockernode01
    +dockernode02
    +dockernode03
    +
    +[admin] #Add Ansible controller name.
    +ansible-controller
    +
    +[coords] #Add the host names of Milvus coordinators.
    +; Take note the IP of this host VM, and replace 10.170.0.17 with it.
    +dockernode01
    +
    +[nodes] #Add the host names of Milvus nodes.
    +dockernode02
    +
    +[dependencies] #Add the host names of Milvus dependencies.
    +; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. 
    +; Take note the IP of this host VM, and replace 10.170.0.19 with it.
    +dockernode03
    +
    +[docker:children]
    +dockernodes
    +coords
    +nodes
    +dependencies
    +
    +[docker:vars]
    +ansible_python_interpreter= /usr/bin/python3
    +StrictHostKeyChecking= no
    +
    +; Setup variables to control what type of network to use when creating containers.
    +dependencies_network= host
    +nodes_network= host
    +
    +; Setup varibale to control what version of Milvus image to use.
    +image= milvusdb/milvus-dev:master-20220412-4781db8a
    +
    +; Setup static IP addresses of the docker hosts as variable for container environment variable config.
    +; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
    +; on which the etcd, minio, pulsar, coordinators will be hosted.
    +etcd_ip= 10.170.0.19
    +minio_ip= 10.170.0.19
    +pulsar_ip= 10.170.0.19
    +coords_ip= 10.170.0.17
    +
    +; Setup container environment which later will be used in container creation.
    +ETCD_ENDPOINTS= {{etcd_ip}}:2379 
    +MINIO_ADDRESS= {{minio_ip}}:9000
    +PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
    +QUERY_COORD_ADDRESS= {{coords_ip}}:19531
    +DATA_COORD_ADDRESS= {{coords_ip}}:13333
    +ROOT_COORD_ADDRESS= {{coords_ip}}:53100
    +INDEX_COORD_ADDRESS= {{coords_ip}}:31000
    +
    +

    ansible.cfg

    ansible.cfg mengontrol aksi dari playbook, misalnya, kunci SSH, dll. Jangan mengatur kata sandi melalui kunci SSH pada hos docker. Jika tidak, koneksi SSH Ansible akan gagal. Kami menyarankan untuk menyiapkan nama pengguna dan kunci SSH yang sama pada tiga hos dan menyiapkan akun pengguna baru untuk menjalankan sudo tanpa kata sandi. Jika tidak, Anda akan menerima kesalahan bahwa nama pengguna tidak cocok dengan kata sandi atau Anda tidak diberikan hak istimewa yang lebih tinggi saat menjalankan panduan Ansible.

    +
    [defaults]
    +host_key_checking = False
    +inventory = inventory.ini # Specify the Inventory file
    +private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host
    +
    +

    deploy-docker.yml

    deploy-docker.yml mendefinisikan tugas selama penginstalan Docker. Lihat komentar kode dalam berkas untuk detailnya.

    +
    ---
    +- name: setup pre-requisites # Install prerequisite
    +  hosts: all
    +  become: yes
    +  become_user: root
    +  roles:
    +    - install-modules
    +    - configure-hosts-file
    +
    +- name: install docker
    +  become: yes
    +  become_user: root
    +  hosts: dockernodes
    +  roles:
    +    - docker-installation
    +
    +

    Menguji konektivitas Ansible

    Uji konektivitas ke Ansible.

    +
    $ ansible all -m ping
    +
    +

    Tambahkan -i pada perintah untuk menentukan jalur ke berkas inventori jika Anda tidak menentukannya di ansible.cfg, jika tidak, Ansible menggunakan /etc/ansible/hosts.

    +

    Terminal kembali sebagai berikut:

    +
    dockernode01 | SUCCESS => {
    +"changed": false,
    +"ping": "pong"
    +}
    +ansible-controller | SUCCESS => {
    +    "ansible_facts": {
    +        "discovered_interpreter_python": "/usr/bin/python3"
    +    },
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode03 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode02 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +
    +

    Periksa Sintaks Playbook

    Periksa sintaks Playbook.

    +
    $ ansible-playbook deploy-docker.yml --syntax-check
    +
    +

    Biasanya, terminal akan kembali sebagai berikut:

    +
    playbook: deploy-docker.yml
    +
    +

    Instal Docker

    Instal Docker dengan Playbook.

    +
    $ ansible-playbook deploy-docker.yml
    +
    +

    Jika Docker berhasil diinstal pada ketiga hos, terminal akan menampilkan tampilan berikut:

    +
    TASK [docker-installation : Install Docker-CE] *******************************************************************
    +ok: [dockernode01]
    +ok: [dockernode03]
    +ok: [dockernode02]
    +
    +TASK [docker-installation : Install python3-docker] **************************************************************
    +ok: [dockernode01]
    +ok: [dockernode02]
    +ok: [dockernode03]
    +
    +TASK [docker-installation : Install docker-compose python3 library] **********************************************
    +changed: [dockernode01]
    +changed: [dockernode03]
    +changed: [dockernode02]
    +
    +PLAY RECAP *******************************************************************************************************
    +ansible-controller         : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode01               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    Verifikasi penginstalan

    Masuk ke tiga hos dengan kunci SSH, dan verifikasi penginstalan pada hos.

    +
      +
    • Untuk hos root:
    • +
    +
    $ docker -v
    +
    +
      +
    • Untuk hos non-root:
    • +
    +
    $ sudo docker -v
    +
    +

    Biasanya, terminal akan menampilkan hasil sebagai berikut:

    +
    Docker version 20.10.14, build a224086
    +
    +

    Periksa status kontainer yang sedang berjalan.

    +
    $ docker ps
    +
    +

    Periksa Sintaks

    Periksa sintaks deploy-milvus.yml.

    +
    $ ansible-playbook deploy-milvus.yml --syntax-check
    +
    +

    Biasanya, terminal akan menampilkan hasil sebagai berikut:

    +
    playbook: deploy-milvus.yml
    +
    +

    Membuat kontainer Milvus

    Tugas untuk membuat kontainer Milvus didefinisikan di deploy-milvus.yml.

    +
    $ ansible-playbook deploy-milvus.yml
    +
    +

    Terminal kembali:

    +
    PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode03]
    +
    +TASK [etcd] *******************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [pulsar] *****************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [minio] ******************************************************************************************************
    +changed: [dockernode03]
    +
    +PLAY [Create milvus nodes] ****************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode02]
    +
    +TASK [querynode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [datanode] ***************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [indexnode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +PLAY [Create milvus coords] ***************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode01]
    +
    +TASK [rootcoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [datacoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [querycoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [indexcoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [proxy] ******************************************************************************************************
    +changed: [dockernode01]
    +
    +PLAY RECAP ********************************************************************************************************
    +dockernode01               : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    Sekarang Anda telah menggunakan Milvus pada tiga hos.

    +

    Menghentikan node

    Anda dapat menghentikan semua node setelah Anda tidak membutuhkan cluster Milvus lagi.

    +
    Pastikan bahwa biner terraform tersedia di PATH.
    +
      +
    1. Jalankan terraform destroy dan masukkan yes saat diminta.

    2. +
    3. Jika berhasil, semua instans node akan dihentikan.

    4. +
    +

    Apa selanjutnya

    Jika Anda ingin mempelajari cara men-deploy Milvus di cloud lain:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.json b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.json new file mode 100644 index 000000000..6fffdc67c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP\n","# If the import-certificate command is successful, it returns the arn of the imported certificate.\naws acm import-certificate --certificate fileb://Certificate.pem \\\n --certificate-chain fileb://CertificateChain.pem \\\n --private-key fileb://PrivateKey.pem \n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n namespace: milvus\n name: milvus-demo\n annotations:\n alb.ingress.kubernetes.io/scheme: internet-facing\n alb.ingress.kubernetes.io/backend-protocol-version: GRPC\n alb.ingress.kubernetes.io/target-type: ip\n alb.ingress.kubernetes.io/listen-ports: '[{\"HTTPS\":443}]'\n alb.ingress.kubernetes.io/certificate-arn: \"arn:aws:acm:region:account-id:certificate/certificate-id\"\n\nspec:\n ingressClassName: alb\n rules:\n - host: milvus-demo.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: milvus-demo\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmilvus-demo alb milvus-demo.milvus.io k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com 80 10m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\nconnections.connect(\"default\", host=\"k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com\", port=\"443\", secure=True, server_name=\"milvus-demo.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on AWS","anchorList":[{"label":"Menyiapkan Load Balancer Layer-7 untuk Milvus di AWS","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-AWS","type":1,"isActive":false},{"label":"Verifikasi koneksi melalui penyeimbang beban Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.md b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.md new file mode 100644 index 000000000..ca238de69 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/aws_layer7.md @@ -0,0 +1,109 @@ +--- +id: aws_layer7.md +title: Menyiapkan Load Balancer Layer-7 untuk Milvus di AWS +related_key: cluster +summary: >- + Pelajari cara menggunakan cluster Milvus di belakang penyeimbang beban Layer-7 + di AWS. +--- +

    Menyiapkan Load Balancer Layer-7 untuk Milvus di AWS

    Jika dibandingkan dengan penyeimbang beban Layer-4, penyeimbang beban Layer-7 menawarkan kemampuan penyeimbangan beban dan caching yang cerdas dan merupakan pilihan yang tepat untuk layanan cloud-native.

    +

    Panduan ini memandu Anda dalam menyiapkan penyeimbang beban Layer-7 untuk cluster Milvus yang sudah berjalan di belakang penyeimbang beban Layer-4.

    +

    Sebelum memulai

    +

    Mengubah konfigurasi Milvus

    Panduan ini mengasumsikan bahwa Anda telah menggunakan cluster Milvus di belakang penyeimbang beban Layer-4 di AWS.

    +

    Sebelum menyiapkan penyeimbang beban Layer-7 untuk klaster Milvus ini, jalankan perintah berikut untuk menghapus penyeimbang beban Layer-4.

    +
    helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP
    +
    +

    Siapkan sertifikat TLS

    TLS membutuhkan sertifikat agar dapat berfungsi. Kami menggunakan ACM untuk mengelola sertifikat dan perlu mengimpor sertifikat yang sudah ada ke ACM. Lihat Mengimpor Sertifikat. Berikut ini adalah contohnya.

    +
    # If the import-certificate command is successful, it returns the arn of the imported certificate.
    +aws acm import-certificate --certificate fileb://Certificate.pem \
    +      --certificate-chain fileb://CertificateChain.pem \
    +      --private-key fileb://PrivateKey.pem  
    +
    +

    Membuat Ingress untuk menghasilkan Load Balancer Layer-7

    Siapkan berkas ingress sebagai berikut dan beri nama ingress.yaml. Ganti arn sertifikat dan host dengan milik Anda sendiri.

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  namespace: milvus
    +  name: milvus-demo
    +  annotations:
    +    alb.ingress.kubernetes.io/scheme: internet-facing
    +    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
    +    alb.ingress.kubernetes.io/target-type: ip
    +    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    +    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:region:account-id:certificate/certificate-id"
    +
    +spec:
    +  ingressClassName: alb
    +  rules:
    +    - host: milvus-demo.milvus.io
    +      http:
    +        paths:
    +        - path: /
    +          pathType: Prefix
    +          backend:
    +            service:
    +              name: milvus-demo
    +              port:
    +                number: 19530
    +
    +

    Kemudian Anda dapat membuat Ingress dengan menerapkan file tersebut ke cluster EKS Anda.

    +
    kubectl apply -f ingress.yaml
    +
    +

    Sekarang, tunggu AWS menyiapkan penyeimbang beban Layer-7. Anda dapat memeriksa kemajuannya dengan menjalankan

    +
    kubectl -f ingress.yaml get -w
    +
    +

    Keluarannya akan serupa dengan yang berikut ini:

    +
    NAME          CLASS   HOSTS                   ADDRESS                                                                PORTS   AGE
    +milvus-demo   alb     milvus-demo.milvus.io   k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com   80      10m
    +
    +

    Setelah alamat ditampilkan pada bidang ADDRESS, penyeimbang beban Layer-7 siap digunakan.

    +

    Verifikasi koneksi melalui penyeimbang beban Layer-7

    Panduan ini menggunakan PyMilvus untuk memverifikasi koneksi ke layanan Milvus di belakang penyeimbang beban Layer-7 yang baru saja kita buat. Untuk langkah-langkah terperinci, baca ini.

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +connections.connect("default", host="k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com", port="443", secure=True, server_name="milvus-demo.milvus.io")
    +
    +
    +
      +
    • Host dan nama_server harus diganti dengan nama Anda sendiri.
    • +
    • Jika Anda telah menyiapkan catatan DNS untuk memetakan nama domain ke alb, ganti host dengan nama domain dan hilangkan nama_server.
    • +
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.json b/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.json new file mode 100644 index 000000000..62e33f951 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.json @@ -0,0 +1 @@ +{"codeList":["{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"S3BucketManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:CreateBucket\",\n \"s3:PutBucketAcl\",\n \"s3:PutBucketOwnershipControls\",\n \"s3:DeleteBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::milvus-bucket-*\"\n ]\n }\n ]\n}\n","{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"IAMPolicyManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iam:CreatePolicy\",\n \"iam:DeletePolicy\"\n ],\n \"Resource\": \"arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite\"\n }\n ]\n} \n","milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","aws iam attach-user-policy --user-name --policy-arn \"arn:aws:iam:::policy/MilvusS3ReadWrite\"\n","apiVersion: eksctl.io/v1alpha5\nkind: ClusterConfig\n\nmetadata:\n name: 'milvus-eks-cluster'\n region: 'us-east-2'\n version: \"1.27\"\n\niam:\n withOIDC: true\n\n serviceAccounts:\n - metadata:\n name: aws-load-balancer-controller\n namespace: kube-system\n wellKnownPolicies:\n awsLoadBalancerController: true\n\nmanagedNodeGroups:\n - name: milvus-node-group\n labels: { role: milvus }\n instanceType: m6i.4xlarge\n desiredCapacity: 3\n privateNetworking: true\n \naddons:\n- name: vpc-cni\n version: latest\n attachPolicyARNs:\n - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy\n- name: coredns\n version: latest\n- name: kube-proxy\n version: latest\n- name: aws-ebs-csi-driver\n version: latest\n wellKnownPolicies:\n ebsCSIController: true\n","eksctl create cluster -f eks_cluster.yaml\n","aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'\n","kubectl cluster-info\n\nkubectl get nodes -A -o wide\n","cat <\"\n useIAM: false\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n accessKey: \"\"\n secretKey: \"\"\n region: \"us-east-2\"\n\n# HA Configurations\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n","kubectl get pods -n milvus\n","kubectl get svc -n milvus\n","wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py\n","python3 hello_milvus.py\n","=== start connecting to Milvus ===\n\nDoes collection hello_milvus exist in Milvus: False\n\n=== Create collection `hello_milvus` ===\n\n\n=== Start inserting entities ===\n\nNumber of entities in Milvus: 3000\n\n=== Start Creating index IVF_FLAT ===\n\n\n=== Start loading ===\n\n\n=== Start searching based on vector similarity ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561\nhit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304\nhit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482\nhit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nsearch latency = 0.4693s\n\n=== Start querying with `random > 0.5` ===\n\nquery result:\n-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}\nsearch latency = 0.9407s\nquery pagination(limit=4):\n [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\nquery pagination(offset=1, limit=3):\n [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\n\n=== Start hybrid searching with `random > 0.5` ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661\nhit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nhit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499\nhit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955\nsearch latency = 0.4652s\n\n=== Start deleting with expr `pk in [\"0\" , \"1\"]` ===\n\nquery before delete by expr=`pk in [\"0\" , \"1\"]` -> result:\n-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}\n-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}\n\nquery after delete by expr=`pk in [\"0\" , \"1\"]` -> result: []\n\n\n=== Drop collection `hello_milvus` ===\n","helm uninstall milvus-demo -n milvus\n","eksctl delete cluster --name milvus-eks-cluster --region us-east-2\n","aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive\n\naws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2\n\naws iam detach-user-policy --user-name --policy-arn \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\"\n\naws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\n"],"headingContent":"Deploy a Milvus Cluster on EKS","anchorList":[{"label":"Menerapkan Cluster Milvus di EKS","href":"Deploy-a-Milvus-Cluster-on-EKS","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menyiapkan Sumber Daya AWS","href":"Set-up-AWS-Resources","type":2,"isActive":false},{"label":"Membuat StorageClass","href":"Create-a-StorageClass","type":2,"isActive":false},{"label":"Menerapkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Verifikasi instalasi","href":"Verify-the-installation","type":2,"isActive":false},{"label":"Pekerjaan pembersihan","href":"Clean-up-works","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.md b/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.md new file mode 100644 index 000000000..8eefb21e5 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/eks.md @@ -0,0 +1,518 @@ +--- +id: eks.md +title: Menerapkan Cluster Milvus di EKS +related_key: cluster +summary: Pelajari cara menggunakan cluster Milvus di EKS +--- +

    Menerapkan Cluster Milvus di EKS

    Topik ini menjelaskan cara menerapkan cluster Milvus di Amazon EKS.

    +

    Prasyarat

      +
    • Anda telah menginstal AWS CLI di PC lokal atau Amazon EC2, yang akan berfungsi sebagai titik akhir untuk melakukan operasi yang tercakup dalam dokumen ini. Untuk Amazon Linux 2 atau Amazon Linux 2023, alat AWS CLI sudah terinstal. Untuk menginstal AWS CLi di PC lokal Anda. Lihat Cara menginstal AWS CLI.
    • +
    • Anda telah menginstal alat Kubernetes dan EKS yang diinstal di perangkat titik akhir yang diinginkan, termasuk:
    • +
    • Izin AWS IAM telah diberikan dengan benar. Prinsipal keamanan IAM yang Anda gunakan harus memiliki izin untuk menggunakan peran Amazon EKS IAM, peran terkait layanan, AWS CloudFormation, VPC, dan sumber daya terkait lainnya. Anda dapat mengikuti salah satu cara berikut untuk memberikan izin yang tepat kepada prinsipal Anda.
        +
      • (Tidak disarankan) Cukup tetapkan kebijakan asosiasi pengguna/peran yang Anda gunakan ke kebijakan terkelola AWS AdministratorAccess.
      • +
      • (Sangat disarankan) Untuk menerapkan prinsip hak istimewa paling sedikit, lakukan hal berikut:
          +
        • Untuk mengatur izin untuk eksctl, lihat Izin minimum untuk eksctl.

        • +
        • Untuk mengatur izin untuk membuat/menghapus bucket AWS S3, lihat pengaturan izin berikut:

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "S3BucketManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "s3:CreateBucket",
          +        "s3:PutBucketAcl",
          +        "s3:PutBucketOwnershipControls",
          +        "s3:DeleteBucket"
          +      ],
          +      "Resource": [
          +        "arn:aws:s3:::milvus-bucket-*"
          +      ]
          +    }
          +  ]
          +}
          +
        • +
        • Untuk menyiapkan izin membuat/menghapus kebijakan IAM, lihat pengaturan izin berikut. Ganti YOUR_ACCOUNT_ID dengan milik Anda sendiri.

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "IAMPolicyManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "iam:CreatePolicy",
          +        "iam:DeletePolicy"
          +      ],
          +      "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite"
          +    }
          +  ]
          +}    
          +
        • +
      • +
    • +
    +

    Menyiapkan Sumber Daya AWS

    Anda dapat menyiapkan sumber daya AWS yang diperlukan, termasuk bucket AWS S3 dan cluster EKS, menggunakan AWS Management Console, AWS CLI, atau alat bantu IaC, seperti Terraform. Dalam dokumen ini, AWS CLI lebih dipilih untuk mendemonstrasikan cara menyiapkan sumber daya AWS.

    +

    Membuat Bucket Amazon S3

      +
    • Buat bucket AWS S3.

      +

      Baca Aturan Penamaan Bucket dan amati aturan penamaan saat menamai bucket AWS S3 Anda.

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • Buat kebijakan IAM untuk membaca dan menulis objek di dalam bucket yang telah dibuat di atas. Ganti nama bucket dengan nama Anda sendiri.

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:GetObject",
      +        "s3:PutObject",
      +        "s3:ListBucket",
      +        "s3:DeleteObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>",
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • Lampirkan kebijakan tersebut ke Pengguna AWS Anda.

      +
      aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
      +
    • +
    +

    Membuat Cluster Amazon EKS

      +
    • Siapkan file konfigurasi cluster sebagai berikut dan beri nama eks_cluster.yaml.

      +
      apiVersion: eksctl.io/v1alpha5
      +kind: ClusterConfig
      +
      +metadata:
      +  name: 'milvus-eks-cluster'
      +  region: 'us-east-2'
      +  version: "1.27"
      +
      +iam:
      +  withOIDC: true
      +
      +  serviceAccounts:
      +  - metadata:
      +      name: aws-load-balancer-controller
      +      namespace: kube-system
      +    wellKnownPolicies:
      +      awsLoadBalancerController: true
      +
      +managedNodeGroups:
      +  - name: milvus-node-group
      +    labels: { role: milvus }
      +    instanceType: m6i.4xlarge
      +    desiredCapacity: 3
      +    privateNetworking: true
      +    
      +addons:
      +- name: vpc-cni
      +  version: latest
      +  attachPolicyARNs:
      +    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
      +- name: coredns
      +  version: latest
      +- name: kube-proxy
      +  version: latest
      +- name: aws-ebs-csi-driver
      +  version: latest
      +  wellKnownPolicies:
      +    ebsCSIController: true
      +
    • +
    • Jalankan perintah berikut untuk membuat cluster EKS.

      +
      eksctl create cluster -f eks_cluster.yaml
      +
    • +
    • Dapatkan file kubeconfig.

      +
      aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
      +
    • +
    • Verifikasi cluster EKS.

      +
      kubectl cluster-info
      +
      +kubectl get nodes -A -o wide
      +
    • +
    +

    Membuat StorageClass

    Milvus menggunakan etcd sebagai meta storage dan perlu mengandalkan gp3 StorageClass untuk membuat dan mengelola PVC.

    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: storage.k8s.io/v1
    +kind: StorageClass
    +metadata:
    +  name: ebs-gp3-sc
    +  annotations:
    +    storageclass.kubernetes.io/is-default-class: "true"
    +provisioner: ebs.csi.aws.com
    +volumeBindingMode: WaitForFirstConsumer
    +parameters:
    +  type: gp3
    +EOF
    +
    +

    Atur StorageClass gp2 asli ke non-default.

    +
    kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    +
    +

    Instal Pengontrol LoadBalancer AWS

      +
    • Tambahkan repo karakter Helm.

      +
      helm repo add eks https://aws.github.io/eks-charts
      +helm repo update
      +
    • +
    • Instal Pengontrol Penyeimbang Beban AWS.

      +
      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
      +  -n kube-system \
      +  --set clusterName='milvus-eks-cluster' \
      +  --set serviceAccount.create=false \
      +  --set serviceAccount.name=aws-load-balancer-controller 
      +
    • +
    • Verifikasi penginstalan

      +
      kubectl get deployment -n kube-system aws-load-balancer-controller
      +
    • +
    +

    Menerapkan Milvus

    Dalam panduan ini, kita akan menggunakan Milvus Helm Charts untuk menerapkan cluster Milvus. Anda dapat menemukan bagan tersebut di sini.

    +
      +
    • Tambahkan repo Milvus Helm Chart.

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm/
      +helm repo update
      +
    • +
    • Siapkan berkas konfigurasi Milvus milvus.yaml, dan ganti <bucket-name> <s3-access-key> <s3-secret-key> dengan milik Anda.

      +

      +
        +
      • Untuk mengonfigurasi HA untuk Milvus Anda, lihat kalkulator ini untuk informasi lebih lanjut. Anda dapat mengunduh konfigurasi terkait langsung dari kalkulator, dan Anda harus menghapus konfigurasi yang terkait dengan MinIO.
      • +
      • Untuk mengimplementasikan penyebaran multi-replika koordinator, setel xxCoordinator.activeStandby.enabled ke true.
      • +
      +

      +
      cluster:
      +  enabled: true
      +
      +service:
      +  type: LoadBalancer
      +  port: 19530
      +  annotations: 
      +    service.beta.kubernetes.io/aws-load-balancer-type: external
      +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
      +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
      +
      +minio:
      +  enabled: false
      +
      +externalS3:
      +  enabled: true
      +  host: "s3.us-east-2.amazonaws.com"
      +  port: "443"
      +  useSSL: true
      +  bucketName: "<bucket-name>"
      +  useIAM: false
      +  cloudProvider: "aws"
      +  iamEndpoint: ""
      +  accessKey: "<s3-access-key>"
      +  secretKey: "<s3-secret-key>"
      +  region: "us-east-2"
      +
      +# HA Configurations
      +rootCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi
      +
      +indexCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +queryCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +dataCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +proxy:
      +  replicas: 2
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi  
      +
    • +
    • Instal Milvus.

      +
      helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
      +
    • +
    • Tunggu sampai semua pod Running.

      +
      kubectl get pods -n milvus
      +
      +

      +

      Helm tidak mendukung penjadwalan urutan pembuatan layanan. Adalah normal jika pod bisnis memulai ulang selama satu atau dua kali sebelum etcd dan pulsar aktif pada tahap awal.

      +

    • +
    • Dapatkan alamat layanan Milvus.

      +
      kubectl get svc -n milvus
      +
    • +
    +

    Verifikasi instalasi

    Anda dapat mengikuti panduan sederhana di bawah ini untuk memverifikasi instalasi. Untuk lebih jelasnya, lihat contoh berikut.

    +
      +
    • Unduh kode contoh.

      +
      wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
      +
    • +
    • Ubah argumen host pada kode contoh ke alamat layanan Milvus di atas.

    • +
    +
    ```python
    +...
    +connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
    +...
    +```
    +
    +
      +
    • Jalankan kode contoh tersebut.

      +
      python3 hello_milvus.py
      +
      +

      Hasilnya akan serupa dengan yang berikut ini:

      +
      === start connecting to Milvus     ===
      +
      +Does collection hello_milvus exist in Milvus: False
      +
      +=== Create collection `hello_milvus` ===
      +
      +
      +=== Start inserting entities       ===
      +
      +Number of entities in Milvus: 3000
      +
      +=== Start Creating index IVF_FLAT  ===
      +
      +
      +=== Start loading                  ===
      +
      +
      +=== Start searching based on vector similarity ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561
      +hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304
      +hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
      +hit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +search latency = 0.4693s
      +
      +=== Start querying with `random > 0.5` ===
      +
      +query result:
      +-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}
      +search latency = 0.9407s
      +query pagination(limit=4):
      +        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +query pagination(offset=1, limit=3):
      +        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +
      +=== Start hybrid searching with `random > 0.5` ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661
      +hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +hit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499
      +hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955
      +search latency = 0.4652s
      +
      +=== Start deleting with expr `pk in ["0" , "1"]` ===
      +
      +query before delete by expr=`pk in ["0" , "1"]` -> result:
      +-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}
      +-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}
      +
      +query after delete by expr=`pk in ["0" , "1"]` -> result: []
      +
      +
      +=== Drop collection `hello_milvus` ===
      +
    • +
    +

    Pekerjaan pembersihan

    Jika Anda perlu memulihkan lingkungan dengan mencopot pemasangan Milvus, menghancurkan cluster EKS, dan menghapus bucket AWS S3 dan kebijakan IAM terkait.

    +
      +
    • Copot pemasangan Milvus.

      +
      helm uninstall milvus-demo -n milvus
      +
    • +
    • Hancurkan cluster EKS.

      +
      eksctl delete cluster --name milvus-eks-cluster --region us-east-2
      +
    • +
    • Hapus bucket AWS S3 dan kebijakan IAM terkait.

      +

      Anda harus mengganti nama bucket dan ARN kebijakan dengan nama Anda sendiri.

      +
      aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive
      +
      +aws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2
      +
      +aws iam detach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite"
      +
      +aws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
      +
    • +
    +

    Apa selanjutnya

    Jika Anda ingin mempelajari cara menerapkan Milvus di cloud lain:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.json b/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.json new file mode 100644 index 000000000..01eaa0d26 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.json @@ -0,0 +1 @@ +{"codeList":["milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:PutObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \\\n --attach-policy-arn arn:aws:iam:::policy/MilvusS3ReadWrite --approve\n","aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument\n# An example output is as follows\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Federated\": \"arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE\"\n },\n \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n \"Condition\": {\n \"StringEquals\": {\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub\": \"system:serviceaccount:default:my-service-account\",\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud\": \"sts.amazonaws.com\"\n }\n }\n }\n ]\n}\n","aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text\n# An example output is as follows\narn:aws:iam::12345678901:policy/MilvusS3ReadWrite\n","export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\naws iam get-policy --policy-arn $policy_arn\n# An example output is as follows\n{\n \"Policy\": {\n \"PolicyName\": \"MilvusS3ReadWrite\",\n \"PolicyId\": \"EXAMPLEBIOWGLDEXAMPLE\",\n \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n \"Path\": \"/\",\n \"DefaultVersionId\": \"v2\",\n [...]\n }\n}\n","aws iam get-policy-version --policy-arn $policy_arn --version-id v2\n# An example output is as follows\n{\n \"PolicyVersion\": {\n \"Document\": {\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n },\n [...]\n }\n}\n","kubectl describe serviceaccount milvus-s3-access-sa -n milvus\n# An example output is as follows\nName: milvus-s3-access-sa\nNamespace: milvus\nLabels: app.kubernetes.io/managed-by=eksctl\nAnnotations: eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa\n[...]\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n port: 19530\n annotations: \n service.beta.kubernetes.io/aws-load-balancer-type: external\n service.beta.kubernetes.io/aws-load-balancer-name: milvus-service\n service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing\n service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip\n\nserviceAccount:\n create: false\n name: milvus-s3-access-sa\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: \"s3.us-east-2.amazonaws.com\"\n port: \"443\"\n useSSL: true\n bucketName: \"\"\n useIAM: true\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n"],"headingContent":"Configure S3 Access by IAM Role","anchorList":[{"label":"Mengonfigurasi Akses S3 dengan Peran IAM","href":"Configure-S3-Access-by-IAM-Role","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Mengaitkan peran IAM dengan akun layanan Kubernetes","href":"Associate-an-IAM-role-with-a-Kubernetes-service-account","type":2,"isActive":false},{"label":"Verifikasi penyiapan peran dan akun layanan","href":"Verify-the-role-and-service-account-setup","type":2,"isActive":false},{"label":"Menerapkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Verifikasi instalasi","href":"Verify-the-installation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.md b/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.md new file mode 100644 index 000000000..6071cebcc --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/aws/s3.md @@ -0,0 +1,341 @@ +--- +id: s3.md +title: Mengonfigurasi Akses S3 dengan Peran IAM +related_key: 's3, storage, iam' +summary: Pelajari cara mengonfigurasi s3 dengan Peran IAM. +--- +

    Mengonfigurasi Akses S3 dengan Peran IAM

    Topik ini memperkenalkan cara mengonfigurasi akses s3 berdasarkan Peran IAM ketika Anda menginstal Milvus dengan helm. Untuk detail lebih lanjut, lihat Peran IAM.

    +

    Sebelum Anda mulai

    +

    Mengaitkan peran IAM dengan akun layanan Kubernetes

      +
    • Buat bucket AWS S3.

      +

      Baca Aturan Penamaan Bucket dan amati aturan penamaan saat menamai bucket AWS S3 Anda.

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • Buat kebijakan IAM untuk membaca dan menulis objek di dalam bucket yang telah dibuat di atas. Ganti nama bucket dengan nama Anda sendiri.

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:ListBucket"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>"
      +      ]
      +    },
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:DeleteObject",
      +        "s3:GetObject",
      +        "s3:PutObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • Buat peran IAM dan kaitkan dengan akun layanan Kubernetes. Ganti your-account-id dengan ID akun Anda.

    • +
    +
    eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \
    +    --attach-policy-arn arn:aws:iam::<your-account-id>:policy/MilvusS3ReadWrite --approve
    +
    +

    Verifikasi penyiapan peran dan akun layanan

    Silakan merujuk ke peran IAM.

    +
      +
    • Konfirmasikan bahwa kebijakan kepercayaan peran IAM telah dikonfigurasi dengan benar.
    • +
    +
    aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument
    +# An example output is as follows
    +{
    +    "Version": "2012-10-17",
    +    "Statement": [
    +        {
    +            "Effect": "Allow",
    +            "Principal": {
    +                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
    +            },
    +            "Action": "sts:AssumeRoleWithWebIdentity",
    +            "Condition": {
    +                "StringEquals": {
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
    +                }
    +            }
    +        }
    +    ]
    +}
    +
    +
      +
    • Konfirmasikan bahwa kebijakan yang Anda lampirkan ke peran Anda pada langkah sebelumnya telah dilampirkan ke peran tersebut.
    • +
    +
    aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text
    +# An example output is as follows
    +arn:aws:iam::12345678901:policy/MilvusS3ReadWrite
    +
    +
      +
    • Lihat versi default kebijakan.
    • +
    +
    export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
    +aws iam get-policy --policy-arn $policy_arn
    +# An example output is as follows
    +{
    +    "Policy": {
    +        "PolicyName": "MilvusS3ReadWrite",
    +        "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
    +        "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
    +        "Path": "/",
    +        "DefaultVersionId": "v2",
    +        [...]
    +    }
    +}
    +
    +
      +
    • Lihat konten kebijakan untuk memastikan bahwa kebijakan mencakup semua izin yang dibutuhkan Pod Anda. Jika perlu, ganti 1 pada perintah berikut dengan versi yang dikembalikan pada keluaran sebelumnya.
    • +
    +
    aws iam get-policy-version --policy-arn $policy_arn --version-id v2
    +# An example output is as follows
    +{
    +    "PolicyVersion": {
    +        "Document": {
    +            "Version": "2012-10-17",
    +            "Statement": [
    +                {
    +                    "Effect": "Allow",
    +                    "Action": [
    +                        "s3:GetObject",
    +                        "s3:PutObject",
    +                        "s3:ListBucket",
    +                        "s3:DeleteObject"
    +                    ],
    +                    "Resource": [
    +                        "arn:aws:s3:::<bucket-name>",
    +                        "arn:aws:s3:::<bucket-name>/*"
    +                    ]
    +                }
    +            ]
    +        },
    +        [...]
    +    }
    +}
    +
    +
      +
    • Konfirmasikan bahwa akun layanan Kubernetes telah diberi keterangan dengan peran.
    • +
    +
    kubectl describe serviceaccount milvus-s3-access-sa -n milvus
    +# An example output is as follows
    +Name:                milvus-s3-access-sa
    +Namespace:           milvus
    +Labels:              app.kubernetes.io/managed-by=eksctl
    +Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa
    +[...]
    +
    +

    Menerapkan Milvus

    Dalam panduan ini, kita akan menggunakan Milvus Helm Charts untuk men-deploy cluster Milvus. Anda dapat menemukan bagan di sini.

    +
      +
    • Tambahkan repo Milvus Helm Chart.
    • +
    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +
    +
      +
    • Siapkan berkas konfigurasi Milvus milvus.yaml, dan ganti <bucket-name> dengan nama bucket yang telah dibuat di atas.
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +  port: 19530
    +  annotations: 
    +    service.beta.kubernetes.io/aws-load-balancer-type: external
    +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
    +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-s3-access-sa
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: "s3.us-east-2.amazonaws.com"
    +  port: "443"
    +  useSSL: true
    +  bucketName: "<bucket-name>"
    +  useIAM: true
    +  cloudProvider: "aws"
    +  iamEndpoint: ""
    +
    +rootCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi
    +
    +indexCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +queryCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +dataCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +proxy:
    +  replicas: 2
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi  
    +
    +
      +
    • Instal Milvus.
    • +
    +
    helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml
    +
    +

    Verifikasi instalasi

    Silakan lihat Verifikasi instalasi.

    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/azure/abs.json b/localization/v2.5.x/site/id/adminGuide/clouds/azure/abs.json new file mode 100644 index 000000000..daaa99269 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/azure/abs.json @@ -0,0 +1 @@ +{"codeList":["export RESOURCE_GROUP=\"\"\nexport AKS_CLUSTER=\"\" \nexport SUB_ID=\"\"\nexport USER_ASSIGNED_IDENTITY_NAME=\"workload-identity\"\nexport SERVICE_ACCOUNT_NAME=\"milvus-abs-access-sa\"\nexport STORAGE_ACCOUNT_NAME=\"milvustesting1\"\nexport CONTAINER_NAME=\"testmilvus\"\nexport LOCATION=\"\"\nexport SERVICE_ACCOUNT_NAMESPACE=\"default\"\n","az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity\n","export SERVICE_ACCOUNT_ISSUER=\"$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)\"\n","az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}\n\n","az identity create --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\"\nexport USER_ASSIGNED_IDENTITY_CLIENT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'clientId' -otsv)\"\nexport USER_ASSIGNED_IDENTITY_OBJECT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'principalId' -otsv)\"\naz role assignment create --role \"Storage Blob Data Contributor\" --assignee \"${USER_ASSIGNED_IDENTITY_OBJECT_ID}\" --scope \"/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}\"\n\n","cat <Mengonfigurasi Akses Penyimpanan Blob dengan Identitas Beban Kerja

    Topik ini memperkenalkan cara mengonfigurasi akses Azure Blob Storage dengan Workload Identity ketika Anda menginstal Milvus dengan helm. Untuk detail lebih lanjut, lihat Workload Identity.

    +

    Mengonfigurasi aplikasi untuk menggunakan Workload Identity

      +
    • Tetapkan env.
    • +
    +
    export RESOURCE_GROUP="<your resource group>"
    +export AKS_CLUSTER="<your aks cluster name>" 
    +export SUB_ID="<your Subscription ID>"
    +export USER_ASSIGNED_IDENTITY_NAME="workload-identity"
    +export SERVICE_ACCOUNT_NAME="milvus-abs-access-sa"
    +export STORAGE_ACCOUNT_NAME="milvustesting1"
    +export CONTAINER_NAME="testmilvus"
    +export LOCATION="<your location>"
    +export SERVICE_ACCOUNT_NAMESPACE="default"
    +
    +
      +
    • Perbarui cluster AKS dengan OIDC Issuer dan Workload Identity.
    • +
    +
    az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity
    +
    +
      +
    • Dapatkan URL penerbit OIDC.
    • +
    +
    export SERVICE_ACCOUNT_ISSUER="$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)"
    +
    +
      +
    • Buat akun penyimpanan dan kontainer.
    • +
    +
    az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}
    +
    +
    +
      +
    • Buat identitas terkelola yang ditetapkan pengguna dan tetapkan peran.
    • +
    +
    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"
    +export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'clientId' -otsv)"
    +export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'principalId' -otsv)"
    +az role assignment create --role "Storage Blob Data Contributor" --assignee "${USER_ASSIGNED_IDENTITY_OBJECT_ID}" --scope "/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}"
    +
    +
    +
      +
    • Buat Akun Layanan.
    • +
    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ServiceAccount
    +metadata:
    +  annotations:
    +    azure.workload.identity/client-id: ${USER_ASSIGNED_IDENTITY_CLIENT_ID}
    +  name: ${SERVICE_ACCOUNT_NAME}
    +EOF
    +
    +
      +
    • Buat kredensial identitas federasi antara identitas dan penerbit akun layanan & subjek.
    • +
    +
    az identity federated-credential create \
    +  --name "kubernetes-federated-credential" \
    +  --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
    +  --resource-group "${RESOURCE_GROUP}" \
    +  --issuer "${SERVICE_ACCOUNT_ISSUER}" \
    +  --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
    +
    +

    Menyebarkan Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    konten values.yaml:

    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +labels:
    +  azure.workload.identity/use: "true"
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-abs-access-sa # SERVICE_ACCOUNT_NAME
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # CONTAINER_NAME
    +  cloudProvider: azure
    +  useSSL: true
    +  useIAM: true
    +  accessKey: "milvustesting1" # STORAGE_ACCOUNT_NAME
    +  secretKey: ""
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.json b/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.json new file mode 100644 index 000000000..01f210e12 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.json @@ -0,0 +1 @@ +{"codeList":["az account set --subscription EXAMPLE-SUBSCRIPTION-ID\n","az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME\n","az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n testmilvus --account-name milvustesting1\n","az storage account keys list --account-name milvustesting2\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nextraConfigFiles:\n user.yaml: |+\n common:\n storageType: remote\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: core.windows.net\n port: 443\n rootPath: my-release\n bucketName: testmilvus # the storage account container name\n cloudProvider: azure\n useSSL: true\n accessKey: \"milvustesting1\" # the storage account name\n secretKey: \"\" \n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy Milvus on Azure with AKS","anchorList":[{"label":"Menerapkan Milvus di Azure dengan AKS","href":"Deploy-Milvus-on-Azure-with-AKS","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Persyaratan perangkat lunak","href":"Software-requirements","type":2,"isActive":false},{"label":"Menyediakan cluster Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"Menghubungkan ke cluster","href":"Connect-to-the-cluster","type":2,"isActive":false},{"label":"Mengatur langganan dan kredensial","href":"Set-a-subscription-and-credentials","type":2,"isActive":false},{"label":"Menggunakan Azure Blob Storage sebagai penyimpanan objek eksternal","href":"Using-Azure-Blob-Storage-as-external-object-storage","type":2,"isActive":false},{"label":"Menyebarkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Verifikasi penerapan","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"Halo Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.md b/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.md new file mode 100644 index 000000000..cf22a3893 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/azure/azure.md @@ -0,0 +1,299 @@ +--- +id: azure.md +title: Menerapkan Milvus di Microsoft Azure Dengan Kubernetes +related_key: cluster +summary: Pelajari cara menggunakan cluster Milvus di Azure. +--- +

    Menerapkan Milvus di Azure dengan AKS

    Topik ini menjelaskan cara menyediakan dan membuat cluster dengan Azure Kubernetes Service (AKS) dan portal Azure.

    +

    Prasyarat

    Pastikan proyek Azure Anda telah disiapkan dengan benar dan Anda memiliki akses ke sumber daya yang ingin Anda gunakan. Hubungi administrator Anda jika Anda tidak yakin tentang izin akses Anda.

    +

    Persyaratan perangkat lunak

    +

    Sebagai alternatif, Anda dapat menggunakan Cloud Shell yang memiliki Azure CLI, kubectl, dan Helm yang sudah diinstal sebelumnya.

    +
    Setelah Anda menginstal Azure CLI, pastikan Anda terautentikasi dengan benar.
    +

    Menyediakan cluster Kubernetes

      +
    1. Masuk ke portal Azure.
    2. +
    3. Pada menu portal Azure atau dari halaman Beranda, pilih Buat sumber daya.
    4. +
    5. Pilih Kontainer > Layanan Kubernetes.
    6. +
    7. Pada halaman Dasar-dasar, konfigurasikan opsi berikut:
    8. +
    +
      +
    • Detail proyek:

      +
        +
      • Langganan: Hubungi Administrator Azure organisasi Anda untuk menentukan langganan mana yang harus Anda gunakan.

        +
          +
        • Grup sumber daya: Hubungi Administrator Azure organisasi Anda untuk menentukan grup sumber daya mana yang harus Anda gunakan.
        • +
      • +
    • +
    • Detail cluster:

      +
        +
      • Nama cluster Kubernetes: Masukkan nama cluster.

      • +
      • Wilayah: Pilih wilayah.

      • +
      • Zona ketersediaan: Pilih zona ketersediaan yang Anda perlukan. Untuk cluster produksi, kami sarankan agar Anda memilih beberapa zona ketersediaan.

      • +
    • +
    • Kumpulan simpul utama:

      +
        +
      • Ukuran node: Kami sarankan Anda memilih VM dengan RAM minimal 16 GB, tetapi Anda dapat memilih ukuran mesin virtual sesuai kebutuhan.

      • +
      • Metode skala: Pilih metode skala.

      • +
      • Rentang jumlah node: Pilih rentang untuk jumlah node.

      • +
    • +
    • Kumpulan node:

      +
        +
      • Mengaktifkan node virtual: Pilih kotak centang untuk mengaktifkan node virtual.

      • +
      • Mengaktifkan set skala mesin virtual: Kami menyarankan Anda memilih enabled.

      • +
    • +
    • Jaringan:

      +
        +
      • Konfigurasi jaringan: Kami menyarankan Anda memilih Kubenet.

      • +
      • Awalan nama DNS: Masukkan awalan nama DNS.

      • +
      • Perutean lalu lintas:

        +
          +
        • Penyeimbang beban: Standard.

        • +
        • Perutean aplikasi HTTP: Tidak diperlukan.

        • +
      • +
    • +
    +
      +
    1. Setelah mengonfigurasi opsi, klik Tinjau + buat lalu Buat saat validasi selesai. Diperlukan beberapa menit untuk membuat cluster.
    2. +
    +

    Menghubungkan ke cluster

      +
    1. Arahkan ke klaster yang telah Anda buat di layanan Kubernetes dan klik klaster tersebut.
    2. +
    3. Pada panel navigasi sisi kiri, klik Overview.
    4. +
    5. Pada halaman Ikhtisar yang muncul, klik Hubungkan untuk melihat grup sumber daya dan langganan.
    6. +
    +

    Mengatur langganan dan kredensial

    Anda dapat menggunakan Azure Cloud Shell untuk melakukan prosedur berikut.
    +
      +
    1. Jalankan perintah berikut untuk mengatur langganan Anda.
    2. +
    +
    az account set --subscription EXAMPLE-SUBSCRIPTION-ID
    +
    +
      +
    1. Jalankan perintah berikut untuk mengunduh kredensial dan mengonfigurasi CLI Kubernetes untuk menggunakannya.
    2. +
    +
    az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME
    +
    +
    +Gunakan shell yang sama untuk prosedur berikut. Jika Anda beralih ke shell lain, jalankan lagi perintah sebelumnya.
    +

    Menggunakan Azure Blob Storage sebagai penyimpanan objek eksternal

    Azure Blob Storage adalah versi Azure dari AWS Simple Storage Service (S3).

    +
      +
    • Buat akun penyimpanan dan wadah
    • +
    +
    az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n testmilvus --account-name milvustesting1
    +
    +
      +
    • dapatkan kunci rahasia, gunakan nilai pertama
    • +
    +
    az storage account keys list --account-name milvustesting2
    +
    +
      +
    • Tambahkan values.yaml
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # the storage account container name
    +  cloudProvider: azure
    +  useSSL: true
    +  accessKey: "milvustesting1" # the storage account name
    +  secretKey: "<secret-key>" 
    +
    +

    Menyebarkan Milvus

    Sekarang cluster Kubernetes sudah siap. Mari kita terapkan Milvus sekarang juga.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    Pada perintah sebelumnya, kita menambahkan repo bagan Milvus Helm secara lokal dan memperbarui repo untuk mengambil bagan terbaru. Kemudian kita menginstal sebuah instans Milvus dan menamainya dengan nama my-release.

    +

    Perhatikan nilai konfigurasi service.type, yang mengindikasikan bahwa kita ingin mengekspos instans Milvus melalui penyeimbang beban Layer-4.

    +

    Verifikasi penerapan

    Setelah semua pod berjalan, jalankan perintah berikut ini untuk mendapatkan alamat IP eksternal.

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    Halo Milvus

    Silakan merujuk ke Hello Milvus, ubah nilai host ke alamat IP eksternal, lalu jalankan kode.

    +

    Apa selanjutnya

    Jika Anda ingin mempelajari cara menerapkan Milvus di cloud lain:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.json b/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.json new file mode 100644 index 000000000..df143648a --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.json @@ -0,0 +1 @@ +{"codeList":["export DNS_LABEL=\"milvustest\" # Your DNS label must be unique within its Azure location.\nexport NAMESPACE=\"ingress-basic\"\n","helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\nhelm repo update\nhelm install ingress-nginx ingress-nginx/ingress-nginx \\\n --create-namespace \\\n --namespace $NAMESPACE \\\n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-dns-label-name\"=$DNS_LABEL \\ \n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path\"=/healthz\n","kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller\n","# Public IP address of your ingress controller\nIP=\"MY_EXTERNAL_IP\"\n\n# Get the resource-id of the public IP\nPUBLICIPID=$(az network public-ip list --query \"[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]\" --output tsv)\n\n# Update public IP address with DNS name\naz network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL\n\n# Display the FQDN\naz network public-ip show --ids $PUBLICIPID --query \"[dnsSettings.fqdn]\" --output tsv\n# sample output: milvustest.eastus2.cloudapp.azure.com\n","helm repo add jetstack https://charts.jetstack.io\nhelm repo update\nhelm install cert-manager jetstack/cert-manager \\\n --namespace $NAMESPACE \\\n --set installCRDs=true\n","apiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt\nspec:\n acme:\n server: https://acme-v02.api.letsencrypt.org/directory\n email: MY_EMAIL_ADDRESS\n privateKeySecretRef:\n name: letsencrypt\n solvers:\n - http01:\n ingress:\n class: nginx\n","kubectl apply -f cluster-issuer.yaml\n","kubectl apply -f ingress.yaml\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n annotations:\n cert-manager.io/cluster-issuer: letsencrypt\n nginx.ingress.kubernetes.io/backend-protocol: GRPC\n nginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n nginx.ingress.kubernetes.io/proxy-body-size: 2048m\nspec:\n ingressClassName: nginx\n tls:\n - hosts:\n - milvustest.eastus2.cloudapp.azure.com # the FQDN\n secretName: tls-secret\n rules:\n - host: milvustest.eastus2.cloudapp.azure.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl get certificate \nNAME READY SECRET AGE\ntls-secret True tls-secret 8m7s\nkubectl get ingress\nNAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus nginx milvustest.eastus2.cloudapp.azure.com EXTERNAL-IP 80, 443 8m15s\n","connections.connect(\"default\",uri=\"https://milvustest.eastus2.cloudapp.azure.com:443\") \n"],"headingContent":"Configure ingress nginx with Milvus","anchorList":[{"label":"Mengonfigurasi ingress nginx dengan Milvus","href":"Configure-ingress-nginx-with-Milvus","type":1,"isActive":false},{"label":"Mengonfigurasi ingress nginx","href":"Configure-ingress-nginx","type":2,"isActive":false},{"label":"Instal cert-manager","href":"Install-cert-manager","type":2,"isActive":false},{"label":"Membuat penerbit klaster CA","href":"Create-a-CA-cluster-issuer","type":2,"isActive":false},{"label":"Menerapkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Membuat rute masuk Milvus","href":"Create-Milvus-ingress-route","type":2,"isActive":false},{"label":"Verifikasi","href":"Verify","type":2,"isActive":false},{"label":"Halo Milvus","href":"Hello-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.md b/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.md new file mode 100644 index 000000000..af328e853 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/azure/ingress.md @@ -0,0 +1,235 @@ +--- +id: ingress.md +title: Mengonfigurasi ingress nginx dengan Milvus +related_key: ingress nginx +summary: Pelajari cara mengonfigurasi akses masuk nginx dengan Milvus. +--- +

    Mengonfigurasi ingress nginx dengan Milvus

    Topik ini memperkenalkan cara mengonfigurasi ingress nginx dengan Milvus. Untuk detail lebih lanjut, lihat ingress-nginx.

    +

    Mengonfigurasi ingress nginx

      +
    • Tetapkan env.
    • +
    +
    export DNS_LABEL="milvustest" # Your DNS label must be unique within its Azure location.
    +export NAMESPACE="ingress-basic"
    +
    +
      +
    • Instal ingress nginx
    • +
    +
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    +helm repo update
    +helm install ingress-nginx ingress-nginx/ingress-nginx \
    +    --create-namespace \
    +    --namespace $NAMESPACE \
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \  
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
    +
    +
      +
    • Dapatkan alamat IP eksternal.
    • +
    +
    kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller
    +
    +
      +
    • Konfigurasikan FQDN untuk pengontrol akses masuk Anda.
    • +
    +
    # Public IP address of your ingress controller
    +IP="MY_EXTERNAL_IP"
    +
    +# Get the resource-id of the public IP
    +PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
    +
    +# Update public IP address with DNS name
    +az network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL
    +
    +# Display the FQDN
    +az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    +# sample output: milvustest.eastus2.cloudapp.azure.com
    +
    +

    Instal cert-manager

    helm repo add jetstack https://charts.jetstack.io
    +helm repo update
    +helm install cert-manager jetstack/cert-manager \
    +    --namespace $NAMESPACE \
    +    --set installCRDs=true
    +
    +

    Membuat penerbit klaster CA

      +
    • Buatlah penerbit klaster, seperti cluster-issuer.yaml, dengan menggunakan manifes contoh berikut. Ganti MY_EMAIL_ADDRESS dengan alamat yang valid dari organisasi Anda.
    • +
    +
    apiVersion: cert-manager.io/v1
    +kind: ClusterIssuer
    +metadata:
    +  name: letsencrypt
    +spec:
    +  acme:
    +    server: https://acme-v02.api.letsencrypt.org/directory
    +    email: MY_EMAIL_ADDRESS
    +    privateKeySecretRef:
    +      name: letsencrypt
    +    solvers:
    +    - http01:
    +        ingress:
    +          class: nginx
    +
    +
      +
    • Terapkan penerbit menggunakan perintah kubectl apply.
    • +
    +
    kubectl apply -f cluster-issuer.yaml
    +
    +

    Menerapkan Milvus

    lihat Azure, perhatikan nilai config service.type, Anda perlu mengubahnya menjadi ClusterIP.

    +

    Membuat rute masuk Milvus

    kubectl apply -f ingress.yaml
    +
    +

    konten ingress.yaml:

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  name: my-release-milvus
    +  annotations:
    +    cert-manager.io/cluster-issuer: letsencrypt
    +    nginx.ingress.kubernetes.io/backend-protocol: GRPC
    +    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    +    nginx.ingress.kubernetes.io/proxy-body-size: 2048m
    +spec:
    +  ingressClassName: nginx
    +  tls:
    +  - hosts:
    +    - milvustest.eastus2.cloudapp.azure.com # the FQDN
    +    secretName: tls-secret
    +  rules:
    +    - host: milvustest.eastus2.cloudapp.azure.com
    +      http:
    +        paths:
    +          - path: /
    +            pathType: Prefix
    +            backend:
    +              service:
    +                name: my-release-milvus
    +                port:
    +                  number: 19530
    +
    +

    Verifikasi

    kubectl get certificate 
    +NAME         READY   SECRET       AGE
    +tls-secret   True    tls-secret   8m7s
    +kubectl get ingress
    +NAME                CLASS   HOSTS                                   ADDRESS        PORTS     AGE
    +my-release-milvus   nginx   milvustest.eastus2.cloudapp.azure.com   EXTERNAL-IP   80, 443   8m15s
    +
    +

    Halo Milvus

    Silakan merujuk ke Hello Milvus, ubah uri args, lalu jalankan kodenya.

    +
    connections.connect("default",uri="https://milvustest.eastus2.cloudapp.azure.com:443") 
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.json b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.json new file mode 100644 index 000000000..5a1864573 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.json @@ -0,0 +1 @@ +{"codeList":["gcloud compute networks create milvus-network \\\n --project=milvus-testing-nonprod \\\n --subnet-mode=auto \\\n --mtu=1460 \\\n --bgp-routing-mode=regional\n","gcloud compute firewall-rules create milvus-network-allow-icmp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows ICMP connections from any source to any instance on the network.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=icmp\n\ngcloud compute firewall-rules create milvus-network-allow-internal \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows connections from any source in the network IP range to any instance on the network using all protocols.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=10.128.0.0/9 \\\n --action=ALLOW --rules=all\n\ngcloud compute firewall-rules create milvus-network-allow-rdp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows RDP connections from any source to any instance on the network using port 3389.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:3389\n\ngcloud compute firewall-rules create milvus-network-allow-ssh \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows TCP connections from any source to any instance on the network using port 22.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:22\n","gcloud compute firewall-rules create allow-milvus-in \\\n --project=milvus-testing-nonprod \\\n --description=\"Allow ingress traffic for Milvus on port 19530\" \\\n --direction=INGRESS \\\n --priority=1000 \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --action=ALLOW \\\n --rules=tcp:19530 \\\n --source-ranges=0.0.0.0/0\n","gcloud container clusters create \"milvus-cluster-1\" \\\n --project \"milvus-testing-nonprod\" \\\n --zone \"us-west1-a\" \\\n --workload-pool \"milvus-testing-nonprod.svc.id.goog\" \\\n --no-enable-basic-auth \\\n --cluster-version \"1.28.10-gke.1075001\" \\\n --release-channel \"regular\" \\\n --machine-type \"c2-standard-4\" \\\n --image-type \"COS_CONTAINERD\" \\\n --disk-type \"pd-standard\" \\\n --disk-size \"100\" \\\n --max-pods-per-node \"110\" \\\n --num-nodes \"3\" \\\n --enable-ip-alias \\\n --network \"projects/milvus-testing-nonprod/global/networks/milvus-network\" \\\n --subnetwork \"projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network\"\n","gcloud container clusters get-credentials milvus-cluster-1 --zone \"us-west1-a\"\n","gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n accessKey: \"\"\n secretKey: \"\"\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy a Milvus Cluster on GKE","anchorList":[{"label":"Menerapkan Cluster Milvus di GKE","href":"Deploy-a-Milvus-Cluster-on-GKE","type":1,"isActive":false},{"label":"Sebelum memulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Menyiapkan jaringan","href":"Set-up-the-network","type":2,"isActive":false},{"label":"Menyediakan klaster Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"Gunakan Google Cloud Storage (GCS) sebagai penyimpanan objek eksternal","href":"Use-Google-Cloud-Storage-GCS-as-external-object-storage","type":2,"isActive":false},{"label":"Menyebarkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Verifikasi penerapan","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"Halo Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.md b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.md new file mode 100644 index 000000000..371eae16e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp.md @@ -0,0 +1,287 @@ +--- +id: gcp.md +title: Menerapkan Cluster Milvus di GKE +related_key: cluster +summary: Pelajari cara menggunakan cluster Milvus di GKE. +--- +

    Menerapkan Cluster Milvus di GKE

    Milvus adalah basis data vektor asli cloud dan dapat digunakan di berbagai lingkungan cloud. Panduan ini memandu Anda melalui setiap detail tentang menyiapkan Milvus di Google Cloud Platform (GCP).

    +

    + + Deploy a Milvus cluster on GCP + Menerapkan cluster Milvus di GCP

    +

    Sebelum memulai

    Untuk menerapkan Milvus di GCP, pastikan bahwa

    + +

    Menyiapkan jaringan

    Untuk memastikan keamanan Milvus, Anda perlu membuat jaringan virtual yang terisolasi secara logis dalam proyek GCP Anda. Perintah berikut ini akan membuat sebuah VPC.

    +
    gcloud compute networks create milvus-network \
    +    --project=milvus-testing-nonprod \
    +    --subnet-mode=auto \
    +    --mtu=1460 \
    +    --bgp-routing-mode=regional
    +
    +

    Untuk memfasilitasi pekerjaan Anda, Anda juga perlu menyiapkan beberapa aturan firewall untuk mengizinkan lalu lintas eksternal melalui ICMP, RDP, dan SSH serta lalu lintas di dalam VPC.

    +
    gcloud compute firewall-rules create milvus-network-allow-icmp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows ICMP connections from any source to any instance on the network." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=icmp
    +
    +gcloud compute firewall-rules create milvus-network-allow-internal \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows connections from any source in the network IP range to any instance on the network using all protocols." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=10.128.0.0/9 \
    +    --action=ALLOW --rules=all
    +
    +gcloud compute firewall-rules create milvus-network-allow-rdp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows RDP connections from any source to any instance on the network using port 3389." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:3389
    +
    +gcloud compute firewall-rules create milvus-network-allow-ssh \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows TCP connections from any source to any instance on the network using port 22." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:22
    +
    +

    Terakhir, Anda perlu mengizinkan lalu lintas masuk ke instans Milvus yang akan kita buat nanti di port 19530.

    +
    gcloud compute firewall-rules create allow-milvus-in \
    +    --project=milvus-testing-nonprod  \
    +    --description="Allow ingress traffic for Milvus on port 19530" \
    +    --direction=INGRESS \
    +    --priority=1000 \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --action=ALLOW \
    +    --rules=tcp:19530 \
    +    --source-ranges=0.0.0.0/0
    +
    +

    Menyediakan klaster Kubernetes

    Dalam panduan ini, kita akan menggunakan layanan Google Kubernetes Engine (GKE) untuk menyediakan klaster Kubernetes dengan dua node di zona us-west1-a. Setiap node adalah mesin virtual Compute Engine e2-standard-4 yang menjalankan citra COS_CONTAINERD.

    +
    +

    Anda disarankan untuk menggunakan jenis mesin yang menawarkan memori minimum 16 GB untuk memastikan stabilitas layanan.

    +
    +
    gcloud container clusters create "milvus-cluster-1" \
    +    --project "milvus-testing-nonprod" \
    +    --zone "us-west1-a" \
    +    --workload-pool "milvus-testing-nonprod.svc.id.goog" \
    +    --no-enable-basic-auth \
    +    --cluster-version "1.28.10-gke.1075001" \
    +    --release-channel "regular" \
    +    --machine-type "c2-standard-4" \
    +    --image-type "COS_CONTAINERD" \
    +    --disk-type "pd-standard" \
    +    --disk-size "100" \
    +    --max-pods-per-node "110" \
    +    --num-nodes "3" \
    +    --enable-ip-alias \
    +    --network "projects/milvus-testing-nonprod/global/networks/milvus-network" \
    +    --subnetwork "projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network"
    +
    +

    Diperlukan waktu beberapa menit agar kluster Kubernetes dapat aktif. Setelah klaster siap, gunakan perintah berikut ini untuk mengambil kredensial sehingga Anda dapat menjalankan perintah kubectl di terminal Anda untuk berkomunikasi dengan klaster dari jarak jauh.

    +
    gcloud container clusters get-credentials milvus-cluster-1 --zone "us-west1-a"
    +
    +

    Gunakan Google Cloud Storage (GCS) sebagai penyimpanan objek eksternal

      +
    • Buat bucket.
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • Buat Kunci Akses Pengguna dan Kunci Rahasia, Anda harus masuk ke halaman penyimpanan proyek Anda. Di bilah sisi kiri dasbor, klik Google Cloud Storage, lalu Pengaturan. Pilih tab Interoperabilitas. Jika Anda belum mengaktifkannya, klik Akses yang Dapat Dioperasikan. Kemudian klik tombol BUAT KUNCI untuk membuat.
    • +
    +

    + + GCP Access keys for your user account + Kunci Akses GCP untuk akun pengguna Anda

    +
      +
    • Tambahkan nilai-nilai.yaml
    • +
    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    accessKey: "<access-key>"
    +    secretKey: "<secret-key>"
    +
    +

    Menyebarkan Milvus

    Sekarang, kluster Kubernetes sudah siap. Mari kita terapkan Milvus sekarang juga.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    Pada perintah sebelumnya, kita menambahkan repo peta Milvus Helm secara lokal dan memperbarui repo untuk mengambil peta terbaru. Kemudian kita menginstal sebuah instans Milvus dan menamainya dengan nama my-release.

    +

    Perhatikan nilai konfigurasi service.type, yang mengindikasikan bahwa kita ingin mengekspos instans Milvus melalui penyeimbang beban Layer-4.

    +

    Jika Anda ingin mengekspos instans Milvus Anda melalui penyeimbang beban Layer-7, bacalah ini.

    +

    Verifikasi penerapan

    Setelah semua pod berjalan, jalankan perintah berikut ini untuk mendapatkan alamat IP eksternal.

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    Halo Milvus

    Silakan merujuk ke Hello Milvus, ubah nilai host ke alamat IP eksternal, lalu jalankan kodenya.

    +

    Apa selanjutnya

    Jika Anda ingin mempelajari cara menerapkan Milvus di cloud lain:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.json b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.json new file mode 100644 index 000000000..24dbe4f30 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --set service.type=ClusterIP\n","helm upgrade my-release milvus/milvus -f tls.yaml\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n tlsMode: 1\n","apiVersion: cloud.google.com/v1\nkind: BackendConfig\nmetadata:\n name: my-release-backendconfig\n namespace: default\nspec:\n healthCheck:\n port: 9091\n requestPath: /healthz\n type: HTTP\n","kubectl apply -f backendconfig.yaml\n","kubectl annotate service my-release-milvus \\\n cloud.google.com/app-protocols='{\"milvus\":\"HTTP2\"}' \\\n cloud.google.com/backend-config='{\"default\": \"my-release-backendconfig\"}' \\\n cloud.google.com/neg='{\"ingress\": true}' --overwrite\n","# Generates a tls.key.\nopenssl genrsa -out tls.key 2048\n\n# Creates a certificate and signs it with the preceding key.\nopenssl req -new -key tls.key -out tls.csr \\\n -subj \"/CN=my-release.milvus.io\"\n\nopenssl x509 -req -days 99999 -in tls.csr -signkey tls.key \\\n -out tls.crt\n","kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key\n","apiVersion: networking.gke.io/v1\nkind: ManagedCertificate\nmetadata:\n name: my-release-milvus-tls\nspec:\n domains:\n - my-release.milvus.io\n","kubectl apply -f ./managed-crt.yaml\n","kubectl get -f ./managed-crt.yaml -o yaml -w\n","status:\n certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e\n certificateStatus: Provisioning\n domainStatus:\n - domain: my-release.milvus.io\n status: Provisioning\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\nspec:\n tls:\n - hosts:\n - my-release.milvus.io\n secretName: my-release-milvus-tls\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\n annotations:\n networking.gke.io/managed-certificates: \"my-release-milvus-tls\"\nspec:\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ./config/samples/ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus my-release.milvus.io 80 4s\nmy-release-milvus my-release.milvus.io 34.111.144.65 80, 443 41m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", server_pem_path=\"tls.crt\", secure=True, server_name=\"my-release.milvus.io\")\n\n# For Google-managed certificates, there is not need to do so.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", secure=True, server_name=\"my-release.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on GCP","anchorList":[{"label":"Menyiapkan Penyeimbang Beban Layer-7 untuk Milvus di GCP","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-GCP","type":1,"isActive":false},{"label":"Verifikasi koneksi melalui penyeimbang beban Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.md b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.md new file mode 100644 index 000000000..3b29eeeac --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcp_layer7.md @@ -0,0 +1,215 @@ +--- +id: gcp_layer7.md +title: Menyiapkan Penyeimbang Beban Layer-7 untuk Milvus di GCP +related_key: cluster +summary: >- + Pelajari cara menggunakan cluster Milvus di belakang penyeimbang beban Layer-7 + pada GCP. +--- +

    Menyiapkan Penyeimbang Beban Layer-7 untuk Milvus di GCP

    Jika dibandingkan dengan penyeimbang beban Layer-4, penyeimbang beban Layer-7 menawarkan kemampuan penyeimbangan beban dan caching yang cerdas dan merupakan pilihan yang tepat untuk layanan cloud-native.

    +

    Panduan ini memandu Anda dalam menyiapkan penyeimbang beban Layer-7 untuk cluster Milvus yang sudah berjalan di belakang penyeimbang beban Layer-4.

    +

    Sebelum memulai

    +

    Mengubah konfigurasi Milvus

    Panduan ini mengasumsikan bahwa Anda telah menggunakan cluster Milvus di belakang penyeimbang beban Layer-4 pada GCP.

    +

    Sebelum menyiapkan penyeimbang beban Layer-7 untuk klaster Milvus ini, jalankan perintah berikut untuk menghapus penyeimbang beban Layer-4.

    +
    helm upgrade my-release milvus/milvus --set service.type=ClusterIP
    +
    +

    Sebagai layanan backend dari penyeimbang beban Layer-7, Milvus harus memenuhi persyaratan enkripsi tertentu agar dapat memahami permintaan HTTP/2 dari penyeimbang beban. Oleh karena itu, Anda perlu mengaktifkan TLS pada cluster Milvus Anda sebagai berikut.

    +
    helm upgrade my-release milvus/milvus -f tls.yaml
    +
    +

    konten tls.yaml:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        tlsMode: 1
    +
    +

    Menyiapkan titik akhir pemeriksaan kesehatan

    Untuk memastikan ketersediaan layanan, penyeimbangan beban Layer-7 pada GCP memerlukan pemeriksaan kondisi kesehatan layanan backend. Oleh karena itu, kita perlu menyiapkan BackendConfig untuk membungkus titik akhir pemeriksaan kesehatan dan mengaitkan BackendConfig dengan layanan Milvus melalui anotasi.

    +

    Cuplikan berikut ini adalah pengaturan BackendConfig. Simpan sebagai backendconfig.yaml untuk digunakan nanti.

    +
    apiVersion: cloud.google.com/v1
    +kind: BackendConfig
    +metadata:
    +  name: my-release-backendconfig
    +  namespace: default
    +spec:
    +  healthCheck:
    +    port: 9091
    +    requestPath: /healthz
    +    type: HTTP
    +
    +

    Kemudian jalankan perintah berikut untuk membuat titik akhir pemeriksaan kesehatan.

    +
    kubectl apply -f backendconfig.yaml
    +
    +

    Terakhir, perbarui anotasi pada layanan Milvus untuk meminta penyeimbang beban Layer-7 yang akan kita buat nanti untuk melakukan pemeriksaan kesehatan menggunakan endpoint yang baru saja dibuat.

    +
    kubectl annotate service my-release-milvus \
    +    cloud.google.com/app-protocols='{"milvus":"HTTP2"}' \
    +    cloud.google.com/backend-config='{"default": "my-release-backendconfig"}' \
    +    cloud.google.com/neg='{"ingress": true}' --overwrite
    +
    +
    +
      +
    • Mengenai penjelasan pertama,

      +

      Milvus adalah asli dari gRPC, yang dibangun di atas HTTP/2. Oleh karena itu, kita dapat menggunakan HTTP/2 sebagai protokol komunikasi antara penyeimbang beban Layer-7 dan Milvus.

    • +
    • Mengenai penjelasan kedua,

      +

      Milvus hanya menawarkan endpoint pemeriksaan kesehatan melalui gRPC dan HTTP/1. Kita perlu menyiapkan BackendConfig untuk membungkus endpoint pemeriksaan kesehatan dan mengasosiasikannya dengan layanan Milvus sehingga penyeimbang beban Layer-7 menyelidiki endpoint ini untuk mengetahui kondisi kesehatan Milvus.

    • +
    • Mengenai anotasi ketiga,

      +

      Ini meminta pembuatan grup titik akhir jaringan (NEG) setelah Ingress dibuat. Ketika NEG digunakan dengan GKE Ingress, pengontrol Ingress memfasilitasi pembuatan semua aspek penyeimbang beban. Ini termasuk membuat alamat IP virtual, aturan penerusan, pemeriksaan kesehatan, aturan firewall, dan banyak lagi. Untuk detailnya, lihat dokumen Google Cloud.

    • +
    +
    +

    Menyiapkan sertifikat TLS

    TLS memerlukan sertifikat agar dapat berfungsi. Ada dua cara untuk membuat sertifikat, yaitu dikelola sendiri dan dikelola Google.

    +

    Panduan ini menggunakan my-release.milvus.io sebagai nama domain untuk mengakses layanan Milvus.

    +

    Membuat sertifikat yang dikelola sendiri

    Jalankan perintah berikut ini untuk membuat sertifikat.

    +
    # Generates a tls.key.
    +openssl genrsa -out tls.key 2048
    +
    +# Creates a certificate and signs it with the preceding key.
    +openssl req -new -key tls.key -out tls.csr \
    +    -subj "/CN=my-release.milvus.io"
    +
    +openssl x509 -req -days 99999 -in tls.csr -signkey tls.key \
    +    -out tls.crt
    +
    +

    Kemudian, buatlah rahasia di dalam cluster GKE Anda dengan berkas-berkas ini untuk digunakan nanti.

    +
    kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
    +
    +

    Membuat sertifikat yang dikelola Google

    Cuplikan berikut ini adalah pengaturan ManagedCertificate. Simpan sebagai managed-crt.yaml untuk digunakan nanti.

    +
    apiVersion: networking.gke.io/v1
    +kind: ManagedCertificate
    +metadata:
    +  name: my-release-milvus-tls
    +spec:
    +  domains:
    +    - my-release.milvus.io
    +
    +

    Buat sertifikat terkelola dengan menerapkan pengaturan ke cluster GKE Anda sebagai berikut:

    +
    kubectl apply -f ./managed-crt.yaml
    +
    +

    Hal ini dapat berlangsung selama beberapa saat. Anda dapat memeriksa kemajuannya dengan menjalankan

    +
    kubectl get -f ./managed-crt.yaml -o yaml -w
    +
    +

    Keluarannya akan serupa dengan yang berikut ini:

    +
    status:
    +  certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
    +  certificateStatus: Provisioning
    +  domainStatus:
    +  - domain: my-release.milvus.io
    +    status: Provisioning
    +
    +

    Setelah certificateStatus berubah menjadi Active, Anda siap untuk menyiapkan penyeimbang beban.

    +

    Membuat Ingress untuk menghasilkan Load Balancer Layer-7

    Buat berkas YAML dengan salah satu cuplikan berikut ini.

    +
      +
    • Menggunakan sertifikat yang dikelola sendiri

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +spec:
      +  tls:
      +  - hosts:
      +    - my-release.milvus.io
      +    secretName: my-release-milvus-tls
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    • Menggunakan sertifikat yang dikelola Google

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +  annotations:
      +    networking.gke.io/managed-certificates: "my-release-milvus-tls"
      +spec:
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    +

    Kemudian, Anda dapat membuat Ingress dengan menerapkan berkas tersebut ke cluster GKE Anda.

    +
    kubectl apply -f ingress.yaml
    +
    +

    Sekarang, tunggu Google menyiapkan penyeimbang beban Layer-7. Anda dapat memeriksa kemajuannya dengan menjalankan

    +
    kubectl  -f ./config/samples/ingress.yaml get -w
    +
    +

    Keluarannya akan serupa dengan yang berikut ini:

    +
    NAME                CLASS    HOSTS                  ADDRESS   PORTS   AGE
    +my-release-milvus   <none>   my-release.milvus.io             80      4s
    +my-release-milvus   <none>   my-release.milvus.io   34.111.144.65   80, 443   41m
    +
    +

    Setelah alamat IP ditampilkan di bidang ADDRESS, penyeimbang beban Layer-7 siap digunakan. Baik port 80 dan port 443 ditampilkan pada output di atas. Ingat, Anda harus selalu menggunakan port 443 untuk kepentingan Anda.

    +

    Verifikasi koneksi melalui penyeimbang beban Layer-7

    Panduan ini menggunakan PyMilvus untuk memverifikasi koneksi ke layanan Milvus di belakang penyeimbang beban Layer-7 yang baru saja kita buat. Untuk langkah-langkah terperinci, baca ini.

    +

    Perhatikan bahwa parameter koneksi bervariasi sesuai dengan cara yang Anda pilih untuk mengelola sertifikat di Siapkan sertifikat TLS.

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.
    +connections.connect("default", host="34.111.144.65", port="443", server_pem_path="tls.crt", secure=True, server_name="my-release.milvus.io")
    +
    +# For Google-managed certificates, there is not need to do so.
    +connections.connect("default", host="34.111.144.65", port="443", secure=True, server_name="my-release.milvus.io")
    +
    +
    +
      +
    • Alamat IP dan nomor port pada host dan port harus sama dengan yang tercantum di akhir Membuat Ingress untuk menghasilkan Load Balancer Layer-7.
    • +
    • Jika Anda telah menyiapkan catatan DNS untuk memetakan nama domain ke alamat IP host, ganti alamat IP pada host dengan nama domain dan hilangkan nama_server.
    • +
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.json b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.json new file mode 100644 index 000000000..e9170aa42 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.json @@ -0,0 +1 @@ +{"codeList":["gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","kubectl create serviceaccount milvus-gcs-access-sa\n","gcloud iam service-accounts create milvus-gcs-access-sa \\\n --project=milvus-testing-nonprod\n","gcloud projects add-iam-policy-binding milvus-testing-nonprod \\\n --member \"serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\" \\\n --role \"roles/storage.admin\" \\\n --condition='title=milvus-testing-nonprod,expression=resource.service == \"storage.googleapis.com\" && resource.name.startsWith(\"projects/_/buckets/milvus-testing-nonprod\")'\n","gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \\\n --role \"roles/iam.workloadIdentityUser\" \\\n --member \"serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]\"\n","kubectl annotate serviceaccount milvus-gcs-access-sa \\\n --namespace default \\\n iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\n","curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email\n","helm install -f values.yaml my-release milvus/milvus\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nserviceAccount:\n create: false\n name: milvus-gcs-access-sa\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n useIAM: true\n"],"headingContent":"Configure GCS Access by Workload Identity","anchorList":[{"label":"Mengonfigurasi Akses GCS dengan Identitas Beban Kerja","href":"Configure-GCS-Access-by-Workload-Identity","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Mengonfigurasi aplikasi untuk menggunakan Workload Identity","href":"Configure-applications-to-use-Workload-Identity","type":2,"isActive":false},{"label":"Verifikasi penyiapan Identitas Beban Kerja","href":"Verify-the-Workload-Identity-setup","type":2,"isActive":false},{"label":"Menerapkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.md b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.md new file mode 100644 index 000000000..f501479e5 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/gcp/gcs.md @@ -0,0 +1,151 @@ +--- +id: gcs.md +title: Mengonfigurasi Akses GCS dengan Identitas Beban Kerja +related_key: 'gcs, storage, workload identity, iam' +summary: Pelajari cara mengonfigurasi gcs dengan Workload Identity. +--- +

    Mengonfigurasi Akses GCS dengan Identitas Beban Kerja

    Topik ini memperkenalkan cara mengonfigurasi akses GCS dengan Workload Identity ketika Anda menginstal Milvus dengan helm. Untuk detail lebih lanjut, lihat Workload Identity.

    +

    Sebelum Anda mulai

    Aktifkan Workload Identity pada cluster dan node pool menggunakan Google Cloud CLI atau konsol Google Cloud. Identitas Beban Kerja harus diaktifkan di tingkat cluster sebelum Anda dapat mengaktifkan Identitas Beban Kerja di kumpulan node.

    +

    Mengonfigurasi aplikasi untuk menggunakan Workload Identity

      +
    • Buat bucket.
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • Buat akun layanan Kubernetes untuk digunakan aplikasi Anda.
    • +
    +
    kubectl create serviceaccount milvus-gcs-access-sa
    +
    +
      +
    • Buat akun layanan IAM untuk aplikasi Anda atau gunakan akun layanan IAM yang sudah ada. Anda dapat menggunakan akun layanan IAM apa pun di proyek mana pun di organisasi Anda.
    • +
    +
    gcloud iam service-accounts create milvus-gcs-access-sa \
    +    --project=milvus-testing-nonprod
    +
    +
      +
    • Pastikan akun layanan IAM Anda memiliki peran yang Anda perlukan. Anda dapat memberikan peran tambahan menggunakan perintah berikut:
    • +
    +
    gcloud projects add-iam-policy-binding milvus-testing-nonprod \
    +    --member "serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com" \
    +    --role "roles/storage.admin" \
    +    --condition='title=milvus-testing-nonprod,expression=resource.service == "storage.googleapis.com" && resource.name.startsWith("projects/_/buckets/milvus-testing-nonprod")'
    +
    +
      +
    • Izinkan akun layanan Kubernetes untuk meniru akun layanan IAM dengan menambahkan pengikatan kebijakan IAM di antara kedua akun layanan. Pengikatan ini memungkinkan akun layanan Kubernetes bertindak sebagai akun layanan IAM.
    • +
    +
    gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \
    +    --role "roles/iam.workloadIdentityUser" \
    +    --member "serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]"
    +
    +
      +
    • Anotasi akun layanan Kubernetes dengan alamat email akun layanan IAM.
    • +
    +
    kubectl annotate serviceaccount milvus-gcs-access-sa \
    +    --namespace default \
    +    iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com
    +
    +

    Verifikasi penyiapan Identitas Beban Kerja

    Silakan lihat Identitas Beban Kerja. Jalankan perintah berikut di dalam Pod:

    +
    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
    +
    +

    Jika hasilnya adalah milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com, tidak apa-apa.

    +

    Menerapkan Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    konten values.yaml:

    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +serviceAccount:
    +    create: false
    +    name: milvus-gcs-access-sa
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    useIAM: true
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.json b/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.json new file mode 100644 index 000000000..6f66306e8 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.json @@ -0,0 +1 @@ +{"codeList":["# milvus-operator-certificate.yaml\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n name: milvus-operator-serving-cert\n namespace: milvus-operator\nspec:\n dnsNames:\n - milvus-operator-webhook-service.milvus-operator.svc\n - milvus-operator-webhook-service.milvus-operator.svc.cluster.local\n issuerRef:\n kind: Issuer\n name: milvus-operator-selfsigned-issuer\n secretName: milvus-operator-webhook-cert\n---\napiVersion: cert-manager.io/v1\nkind: Issuer\nmetadata:\n name: milvus-operator-selfsigned-issuer\n namespace: milvus-operator\nspec:\n selfSigned: {}\n","kubectl apply -f milvus-operator-certificate.yaml\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update milvus-operator\n","helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator\n"],"headingContent":"Deploy a Milvus Cluster on OpenShift","anchorList":[{"label":"Menerapkan Cluster Milvus di OpenShift","href":"Deploy-a-Milvus-Cluster-on-OpenShift","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Langkah 1: Instal Cert Manager","href":"Step-1-Install-Cert-Manager","type":2,"isActive":false},{"label":"Langkah 2: Menerbitkan Sertifikat yang Ditandatangani Sendiri untuk Operator Milvus","href":"Step-2-Issue-a-Self-Signed-Certificate-for-Milvus-Operator","type":2,"isActive":false},{"label":"Langkah 3: Menginstal Operator Milvus","href":"Step-3-Install-Milvus-Operator","type":2,"isActive":false},{"label":"Langkah 4: Menerapkan Milvus","href":"Step-4-Deploy-Milvus","type":2,"isActive":false},{"label":"Apa Selanjutnya","href":"Whats-Next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.md b/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.md new file mode 100644 index 000000000..d726c4e81 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/clouds/openshift/openshift.md @@ -0,0 +1,183 @@ +--- +id: openshift.md +title: Menerapkan Cluster Milvus di OpenShift +related_key: cluster +summary: Pelajari cara menggunakan cluster Milvus di OpenShift. +--- +

    Menerapkan Cluster Milvus di OpenShift

    Topik ini menyediakan panduan langkah demi langkah tentang cara menggunakan Milvus di OpenShift.

    +

    Prasyarat

    Sebelum memulai proses penerapan, pastikan Anda memiliki:

    +
      +
    • Cluster OpenShift yang sedang berjalan.
    • +
    • Akses cluster OpenShift dengan hak akses yang memadai (cluster-admin role atau yang setara).
    • +
    • Akses ke konsol web OpenShift Container Platform.
    • +
    +

    Langkah 1: Instal Cert Manager

    Cert Manager diperlukan untuk mengelola sertifikat TLS untuk Milvus Operator.

    +
      +
    1. Temukan versi cert-manager yang sesuai untuk versi OpenShift Anda: Rilis Cert Manager.

    2. +
    3. Instal Cert Manager dengan mengikuti panduan resmi: Instalasi Cert Manager.

    4. +
    5. Verifikasi bahwa Cert Manager Anda telah berfungsi:

      +
        +
      1. Di konsol openshift Anda, navigasikan ke Workloads > Pods. Pilih proyek cert-manager.

        +

        + + cert-manager-1 + cert-manager-1

      2. +
      3. Pastikan semua pod sudah siap. Sebagai contoh, gambar di bawah ini menunjukkan bahwa pods masih dalam proses memulai. Tunggu hingga semua pod ini siap.

        +

        + + cert-manager-2 + cert-manager-2

      4. +
    6. +
    +

    Langkah 2: Menerbitkan Sertifikat yang Ditandatangani Sendiri untuk Operator Milvus

    Pastikan Anda masuk sebagai kubeadmin atau memiliki hak akses yang setara.

    +
      +
    1. Buat berkas manifes berikut ini dengan nama milvus-operator-certificate.yaml:

      +
      # milvus-operator-certificate.yaml
      +apiVersion: cert-manager.io/v1
      +kind: Certificate
      +metadata:
      +  name: milvus-operator-serving-cert
      +  namespace: milvus-operator
      +spec:
      +  dnsNames:
      +  - milvus-operator-webhook-service.milvus-operator.svc
      +  - milvus-operator-webhook-service.milvus-operator.svc.cluster.local
      +  issuerRef:
      +    kind: Issuer
      +    name: milvus-operator-selfsigned-issuer
      +  secretName: milvus-operator-webhook-cert
      +---
      +apiVersion: cert-manager.io/v1
      +kind: Issuer
      +metadata:
      +  name: milvus-operator-selfsigned-issuer
      +  namespace: milvus-operator
      +spec:
      +  selfSigned: {}
      +
    2. +
    3. Terapkan file tersebut:

      +
      kubectl apply -f milvus-operator-certificate.yaml
      +
    4. +
    +

    Langkah 3: Menginstal Operator Milvus

    Sekarang Anda dapat mulai menginstal Milvus Operator. Disarankan untuk menggunakan Helm untuk menginstal Milvus Operator untuk menyederhanakan proses konfigurasi.

    +
      +
    1. Tambahkan repositori Helm Milvus Operator:

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/
      +helm repo update milvus-operator
      +
    2. +
    3. Instal Milvus Operator:

      +
      helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator
      +
    4. +
    +

    Langkah 4: Menerapkan Milvus

    Ikuti panduan selanjutnya pada situs dokumentasi Milvus: Menerapkan Milvus.

    +

    Apa Selanjutnya

    Jika Anda ingin mempelajari cara menerapkan Milvus di cloud lain:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.json b/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.json new file mode 100644 index 000000000..478ec7b76 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl create namespace observability\n$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability\n","$ kubectl get deployment jaeger-operator -n observability\n\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\njaeger-operator 1 1 1 1 48s\n","apiVersion: jaegertracing.io/v1\nkind: Jaeger\nmetadata:\n name: jaeger\n","$ kubectl apply -f simplest.yaml\n","$ kubectl get jaegers\n\nNAME STATUS VERSION STRATEGY STORAGE AGE\njaeger Running 1.62.0 allinone memory 13s\n","extraConfigFiles:\n user.yaml: |+\n trace:\n exporter: jaeger\n sampleFraction: 1\n jaeger:\n url: \"http://jaeger-collector:14268/api/traces\"\n","$ helm repo add zilliztech https://zilliztech.github.io/milvus-helm\n$ helm repo update\n$ helm upgrade --install -f values.yaml my-release milvus/milvus\n","$ helm upgrade my-release -f values.yaml milvus/milvus\n","$ kubectl get ingress\n\nNAME CLASS HOSTS ADDRESS PORTS AGE\njaeger-query * 192.168.122.34 80 14m\n"],"headingContent":"Configure Trace","anchorList":[{"label":"Mengkonfigurasi Jejak","href":"Configure-Trace","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Deply Jaeger","href":"Deply-Jaeger","type":2,"isActive":false},{"label":"Menginstal Milvus dengan Helm Chart","href":"Install-Milvus-with-Helm-Chart","type":2,"isActive":false},{"label":"Melihat Jejak","href":"View-Traces","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.md b/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.md new file mode 100644 index 000000000..57d69ba50 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/config_jaeger_tracing.md @@ -0,0 +1,148 @@ +--- +id: config_jaeger_tracing.md +title: Mengkonfigurasi Jejak +related_key: 'Jaeger, Milvus, Trace' +summary: >- + Panduan ini memberikan instruksi tentang cara mengonfigurasi Jaeger untuk + mengumpulkan jejak untuk Milvus. +--- +

    Mengkonfigurasi Jejak

    Panduan ini memberikan petunjuk tentang cara mengonfigurasi Jaeger untuk mengumpulkan jejak untuk Milvus.

    +

    Prasyarat

      +
    • Anda telah menginstal alat yang diperlukan, termasuk Helm dan Kubectl.
    • +
    • Cert-manager versi 1.6.1 atau yang lebih tinggi harus diinstal. Panduan instalasi dapat ditemukan di sini.
    • +
    +

    Deply Jaeger

    Jaeger adalah platform penelusuran terdistribusi yang dirilis sebagai sumber terbuka oleh Uber Technologies.

    +

    1. Menginstal Operator Jaeger di Kubernetes

    Untuk menginstal operator, jalankan:

    +
    $ kubectl create namespace observability
    +$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability
    +
    +

    Pada titik ini, seharusnya ada deployment jaeger-operator yang tersedia. Anda dapat melihatnya dengan menjalankan perintah berikut:

    +
    $ kubectl get deployment jaeger-operator -n observability
    +
    +NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    +jaeger-operator   1         1         1            1           48s
    +
    +

    2. Menerapkan Jaeger

    Cara paling sederhana untuk membuat instans Jaeger adalah dengan membuat berkas YAML seperti contoh berikut. Ini akan menginstal strategi AllInOne default, yang menerapkan gambar all-in-one (menggabungkan jaeger-agent, jaeger-collector, jaeger-query, dan Jaeger UI) dalam satu pod, menggunakan penyimpanan dalam memori secara default.

    +

    Jika Anda ingin menyimpan jejak untuk waktu yang lama, silakan lihat strategi-produksi.

    +
    apiVersion: jaegertracing.io/v1
    +kind: Jaeger
    +metadata:
    +  name: jaeger
    +
    +

    File YAML kemudian dapat digunakan dengan kubectl:

    +
    $ kubectl apply -f simplest.yaml
    +
    +

    Dalam beberapa detik, instance Jaeger all-in-one dalam memori yang baru akan tersedia, cocok untuk demo cepat dan tujuan pengembangan. Untuk memeriksa instance yang telah dibuat, buat daftar objek Jaeger:

    +
    $ kubectl get jaegers
    +
    +NAME     STATUS    VERSION   STRATEGY   STORAGE   AGE
    +jaeger   Running   1.62.0    allinone   memory    13s
    +
    +

    Menginstal Milvus dengan Helm Chart

    Anda dapat menginstal atau mengupgrade Milvus dengan Helm Chart dengan pengaturan berikut:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    trace:
    +      exporter: jaeger
    +      sampleFraction: 1
    +      jaeger:
    +        url: "http://jaeger-collector:14268/api/traces"
    +
    +

    Untuk menerapkan pengaturan di atas pada deployment Milvus yang baru, Anda dapat menjalankan perintah berikut:

    +
    $ helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +$ helm repo update
    +$ helm upgrade --install -f values.yaml my-release milvus/milvus
    +
    +

    Untuk menerapkan pengaturan di atas pada deployment Milvus yang sudah ada, Anda dapat menjalankan perintah berikut:

    +
    $ helm upgrade my-release -f values.yaml milvus/milvus
    +
    +

    Melihat Jejak

    Setelah Anda men-deploy Jaeger dan Milvus dengan Helm Chart, ingress telah diaktifkan oleh dfault. Anda dapat melihat ingress dengan menjalankan perintah berikut:

    +
    $ kubectl get ingress
    +
    +NAME           CLASS    HOSTS   ADDRESS         PORTS   AGE
    +jaeger-query   <none>   *       192.168.122.34  80      14m
    +
    +

    Setelah ingress tersedia, Anda dapat mengakses Jaeger UI dengan menavigasi ke http://${ADDRESS}. Ganti ${ADDRESS} dengan alamat IP yang sebenarnya dari ingress.

    +

    Tangkapan layar berikut ini menunjukkan Jaeger UI dengan jejak Milvus selama operasi pencarian dan operasi pengumpulan beban:

    +

    + + Trace Search Request + Melacak Permintaan Pencarian

    +

    + + Trace Load Collection Request + Melacak Permintaan Pengumpulan Beban

    diff --git a/localization/v2.5.x/site/id/adminGuide/configure-docker.json b/localization/v2.5.x/site/id/adminGuide/configure-docker.json new file mode 100644 index 000000000..c0058f613 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-docker.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml\n","# For Milvus standalone\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n","...\n standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.2.13\n command: [\"milvus\", \"run\", \"standalone\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml # Map the local path to the container path\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n...\n","$ sudo docker compose up -d\n"],"headingContent":"Configure Milvus with Docker Compose","anchorList":[{"label":"Mengonfigurasi Milvus dengan Docker Compose","href":"Configure-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"Mengunduh berkas konfigurasi","href":"Download-a-configuration-file","type":2,"isActive":false},{"label":"Memodifikasi berkas konfigurasi","href":"Modify-the-configuration-file","type":2,"isActive":false},{"label":"Mengunduh berkas instalasi","href":"Download-an-installation-file","type":2,"isActive":false},{"label":"Memodifikasi berkas instalasi","href":"Modify-the-installation-file","type":2,"isActive":false},{"label":"Mulai Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/configure-docker.md b/localization/v2.5.x/site/id/adminGuide/configure-docker.md new file mode 100644 index 000000000..65fa5e60f --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-docker.md @@ -0,0 +1,296 @@ +--- +id: configure-docker.md +label: Docker Compose +related_key: configure +summary: Konfigurasikan Milvus dengan Docker Compose. +title: Mengonfigurasi Milvus dengan Docker Compose +--- +

    Mengonfigurasi Milvus dengan Docker Compose

    Topik ini menjelaskan cara mengonfigurasi komponen Milvus dan dependensi pihak ketiganya dengan Docker Compose.

    +
    +Pada rilis saat ini, semua parameter hanya berlaku setelah Milvus dimulai ulang.
    +

    Mengunduh berkas konfigurasi

    Unduh milvus.yaml secara langsung atau dengan perintah berikut.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml
    +
    +

    Memodifikasi berkas konfigurasi

    Konfigurasikan instans Milvus Anda agar sesuai dengan skenario aplikasi Anda dengan menyesuaikan parameter yang sesuai di milvus.yaml.

    +

    Periksa tautan berikut untuk informasi lebih lanjut tentang setiap parameter.

    +

    Diurutkan berdasarkan:

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    TujuanParameter
    Penyetelan kinerja + +
    Data dan meta + +
    Administrasi + +
    Kuota dan Batas + +
    +
    +

    Mengunduh berkas instalasi

    Unduh berkas instalasi untuk Milvus mandiri, dan simpan sebagai docker-compose.yml.

    +

    Anda juga dapat menjalankan perintah berikut.

    +
    # For Milvus standalone
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +

    Memodifikasi berkas instalasi

    Pada docker-compose.yml, tambahkan bagian volumes di bawah setiap milvus-standalone.

    +

    Petakan jalur lokal ke berkas milvus.yaml Anda ke jalur kontainer docker yang sesuai dengan berkas konfigurasi /milvus/configs/milvus.yaml di bawah semua bagian volumes.

    +
    ...
    +  standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:v2.2.13
    +    command: ["milvus", "run", "standalone"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml   # Map the local path to the container path
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +    ports:
    +      - "19530:19530"
    +      - "9091:9091"
    +    depends_on:
    +      - "etcd"
    +      - "minio"
    +...
    +
    +
    +Data disimpan di folder /volumes sesuai dengan konfigurasi default di docker-compose.yml. Untuk mengubah folder untuk menyimpan data, edit docker-compose.yml atau jalankan $ export DOCKER_VOLUME_DIRECTORY=.
    +

    Mulai Milvus

    Setelah selesai memodifikasi file konfigurasi dan file instalasi, Anda dapat menjalankan Milvus.

    +
    $ sudo docker compose up -d
    +
    +

    Selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/configure-helm.json b/localization/v2.5.x/site/id/adminGuide/configure-helm.json new file mode 100644 index 000000000..03d0f1612 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-helm.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml\n","# Extra configs for milvus.yaml\n# If set, this config will merge into milvus.yaml\n# Please follow the config structure in the milvus.yaml\n# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml\n# Note: this config will be the top priority which will override the config\n# in the image and helm chart.\nextraConfigFiles:\n user.yaml: |+\n # For example to set the graceful time for query nodes\n # queryNodes:\n # gracefulTime: 10\n","$ helm upgrade my-release milvus/milvus -f values.yaml\n","$ helm show values milvus/milvus\n","# For instance, upgrade the Milvus cluster with compaction disabled\n$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false\n"],"headingContent":"Configure Milvus with Helm Charts","anchorList":[{"label":"Mengkonfigurasi Milvus dengan Helm Charts","href":"Configure-Milvus-with-Helm-Charts","type":1,"isActive":false},{"label":"Mengkonfigurasi Milvus melalui file konfigurasi","href":"Configure-Milvus-via-configuration-file","type":2,"isActive":false},{"label":"Mengkonfigurasi Milvus melalui baris perintah","href":"Configure-Milvus-via-command-line","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/configure-helm.md b/localization/v2.5.x/site/id/adminGuide/configure-helm.md new file mode 100644 index 000000000..c197fa8d1 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-helm.md @@ -0,0 +1,250 @@ +--- +id: configure-helm.md +label: Helm +related_key: configure +summary: Konfigurasikan Milvus dengan Helm Charts. +title: Mengkonfigurasi Milvus dengan Helm Charts +--- +

    Mengkonfigurasi Milvus dengan Helm Charts

    Topik ini menjelaskan bagaimana mengkonfigurasi komponen Milvus dan dependensi pihak ketiganya dengan Helm Charts.

    +
    +Pada rilis saat ini, semua parameter hanya berlaku setelah Milvus dimulai ulang.
    +

    Mengkonfigurasi Milvus melalui file konfigurasi

    Anda dapat mengkonfigurasi Milvus dengan file konfigurasi values.yaml.

    +

    Mengunduh file konfigurasi

    Unduh values.yaml secara langsung atau dengan perintah berikut.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml
    +
    +

    Memodifikasi berkas konfigurasi

    Konfigurasikan instance Milvus Anda agar sesuai dengan skenario aplikasi Anda dengan menyesuaikan parameter yang sesuai di values.yaml.

    +

    Secara khusus, cari extraConfigFiles di values.yaml dan masukkan konfigurasi Anda di bagian ini sebagai berikut:

    +
    # Extra configs for milvus.yaml
    +# If set, this config will merge into milvus.yaml
    +# Please follow the config structure in the milvus.yaml
    +# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml
    +# Note: this config will be the top priority which will override the config
    +# in the image and helm chart.
    +extraConfigFiles:
    +  user.yaml: |+
    +    #    For example to set the graceful time for query nodes
    +    #    queryNodes:
    +    #      gracefulTime: 10
    +
    +

    Periksa tautan berikut untuk informasi lebih lanjut tentang setiap parameter.

    +

    Diurutkan berdasarkan:

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    TujuanParameter
    Penyetelan kinerja + +
    Data dan meta + +
    Administrasi + +
    Kuota dan Batas + +
    +
    +

    Untuk parameter lain yang khusus untuk instalasi Kubernetes, Lihat Konfigurasi Diagram Helm Milvus.

    +

    Memulai Milvus

    Setelah selesai memodifikasi berkas konfigurasi, Anda dapat memulai Milvus dengan berkas tersebut.

    +
    $ helm upgrade my-release milvus/milvus -f values.yaml
    +
    +

    Mengkonfigurasi Milvus melalui baris perintah

    Sebagai alternatif, Anda dapat mengupgrade konfigurasi Milvus secara langsung dengan perintah Helm.

    +

    Memeriksa parameter yang dapat dikonfigurasi

    Sebelum melakukan upgrade, Anda dapat memeriksa parameter yang dapat dikonfigurasi dengan grafik Helm.

    +
    $ helm show values milvus/milvus
    +
    +

    Memulai Milvus

    Konfigurasikan dan mulai Milvus dengan menambahkan --values atau --set pada perintah untuk upgrade.

    +
    # For instance, upgrade the Milvus cluster with compaction disabled
    +$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false
    +
    +

    Selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.json b/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.json new file mode 100644 index 000000000..7be5ac988 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.json @@ -0,0 +1 @@ +{"codeList":["$ lsblk | grep nvme\nnvme0n1 259:0 0 250.0G 0 disk \nnvme1n1 259:1 0 250.0G 0 disk \n","MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"==MYBOUNDARY==\"\n\n--==MYBOUNDARY==\nContent-Type: text/x-shellscript; charset=\"us-ascii\"\n\n#!/bin/bash\necho \"Running custom user data script\"\nif ( lsblk | fgrep -q nvme1n1 ); then\n mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker\n mkfs.xfs /dev/nvme1n1\n mount /dev/nvme1n1 /mnt/data\n chmod 0755 /mnt/data\n mv /var/lib/kubelet /mnt/data/\n mv /var/lib/docker /mnt/data/\n ln -sf /mnt/data/kubelet /var/lib/kubelet\n ln -sf /mnt/data/docker /var/lib/docker\n UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')\n echo \"UUID=$UUID /mnt/data xfs defaults,noatime 1 1\" >> /etc/fstab\nfi\necho 10485760 > /proc/sys/fs/aio-max-nr\n\n--==MYBOUNDARY==--\n","gcloud container node-pools create ${POOL_NAME} \\\n --cluster=${CLUSTER_NAME} \\\n --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \\\n --machine-type=${MACHINE_TYPE}\n","mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1\nmdadm -Ds > /etc/mdadm/mdadm.conf \nupdate-initramfs -u\n\nmkfs.xfs /dev/md0\nmkdir -p /var/lib/kubelet\necho '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab\nmount -a\n","#!/bin/bash\necho \"nvme init start...\"\nmkfs.xfs /dev/nvme0n1\nmkdir -p /mnt/data\necho '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab\nmount -a\n\nmkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods\nmkdir -p /var/lib/kubelet /var/lib/containerd /var/log/pods\n\necho '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab\nmount -a\n\necho \"nvme init end...\"\n","sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state\nsudo vim /etc/containerd/config.toml\n","[plugins.\"io.containerd.grpc.v1.cri\".containerd]\nsnapshotter = \"overlayfs\"\nroot = \"/mnt/nvme/containerd\"\nstate = \"/mnt/nvme/containerd/state\"\n","sudo systemctl restart containerd\n","kubectl create -f ubuntu.yaml\n","apiVersion: v1\nkind: Pod\nmetadata:\nname: ubuntu\nspec:\ncontainers:\n- name: ubuntu\n image: ubuntu:latest\n command: [\"sleep\", \"86400\"]\n volumeMounts:\n - name: data-volume\n mountPath: /data\nvolumes:\n - name: data-volume\n emptyDir: {}\n","# enter the container\nkubectl exec pod/ubuntu -it bash\n\n# in container\napt-get update\napt-get install fio -y\n\n# change to the mounted dir\ncd /data\n\n# write 10GB\nfio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test\n\n# verify the read speed\n# compare with the disk performance indicators provided by various cloud providers.\nfio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly\n","Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]\niops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024\nread: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)\n slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96\n clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13\n lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74\n clat percentiles (usec):\n | 1.00th=[ 69], 5.00th=[ 79], 10.00th=[ 85], 20.00th=[ 95],\n | 30.00th=[ 106], 40.00th=[ 123], 50.00th=[ 149], 60.00th=[ 11469],\n | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],\n | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],\n | 99.99th=[767558]\nbw ( MiB/s): min= 236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591\niops : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591\nlat (usec) : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%\nlat (usec) : 1000=0.08%\nlat (msec) : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%\nlat (msec) : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%\nlat (msec) : 2000=0.01%\ncpu : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665\nIO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%\n submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%\n complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%\n issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0\n latency : target=0, window=0, percentile=100.00%, depth=64\n","...\nspec:\n components:\n queryNode:\n volumeMounts:\n - mountPath: /var/lib/milvus/data\n name: data\n volumes:\n - emptyDir:\n name: data\n"],"headingContent":"Configure Milvus QueryNode with Local Disk","anchorList":[{"label":"Mengkonfigurasi Milvus QueryNode dengan Disk Lokal","href":"Configure-Milvus-QueryNode-with-Local-Disk","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Mengonfigurasi Kubernetes untuk menggunakan disk lokal","href":"Configure-Kubernetes-to-use-local-disk","type":2,"isActive":false},{"label":"Verifikasi kinerja disk","href":"Verify-disk-performance","type":2,"isActive":false},{"label":"Menyebarkan Milvus Terdistribusi","href":"Deploy-Milvus-Distributed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.md b/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.md new file mode 100644 index 000000000..c28109a99 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure-querynode-localdisk.md @@ -0,0 +1,282 @@ +--- +id: configure-querynode-localdisk.md +title: Mengkonfigurasi Milvus QueryNode dengan Disk Lokal +related_key: 'querynode, query node, local disk' +summary: Pelajari cara mengonfigurasi Milvus QueryNode untuk menggunakan disk lokal. +--- +

    Mengkonfigurasi Milvus QueryNode dengan Disk Lokal

    Artikel ini menjelaskan cara mengonfigurasi Milvus QueryNode untuk menggunakan penyimpanan disk lokal.

    +

    Gambaran Umum

    Milvus adalah basis data vektor yang berfokus pada AI yang dirancang untuk penyimpanan dan pengambilan data vektor dalam jumlah besar secara efisien. Sangat ideal untuk tugas-tugas seperti analisis gambar dan video, pemrosesan bahasa alami, dan sistem rekomendasi. Untuk memastikan performa yang optimal, sangat penting untuk meminimalkan latensi pembacaan disk. Menggunakan SSD NVMe lokal sangat disarankan untuk mencegah penundaan dan menjaga stabilitas sistem.

    +

    Fitur utama yang berperan penting dalam penyimpanan disk lokal meliputi:

    +
      +
    • Cache potongan: Memuat data sebelumnya ke dalam cache disk lokal untuk pencarian yang lebih cepat.
    • +
    • MMap: Memetakan konten file secara langsung ke dalam memori untuk efisiensi memori yang lebih baik.
    • +
    • Indeks DiskANN: Memerlukan penyimpanan disk untuk manajemen indeks yang efisien.
    • +
    +

    Dalam artikel ini, kita akan fokus pada penerapan Milvus Distributed di platform cloud, dan cara mengonfigurasi QueryNode untuk menggunakan penyimpanan disk NVMe. Tabel berikut mencantumkan jenis mesin yang direkomendasikan dari berbagai penyedia cloud.

    + + + + + + + + + + + +
    Penyedia CloudJenis Mesin
    AWSSeri R6id
    GCPSeri N2
    AzureSeri Lsv3
    Alibaba CloudSeri i3
    Tencent CloudSeri IT5
    +

    Jenis mesin ini menyediakan penyimpanan disk NVMe. Anda dapat menggunakan perintah lsblk pada instance jenis mesin ini untuk memeriksa apakah mereka memiliki penyimpanan disk NVMe. Jika ya, Anda dapat melanjutkan ke langkah berikutnya.

    +
    $ lsblk | grep nvme
    +nvme0n1     259:0    0 250.0G  0 disk 
    +nvme1n1     259:1    0 250.0G  0 disk 
    +
    +

    Mengonfigurasi Kubernetes untuk menggunakan disk lokal

    Untuk mengonfigurasi QueryNode Milvus Distributed agar menggunakan penyimpanan disk NVMe, Anda perlu mengonfigurasi node pekerja dari cluster Kubernetes target untuk menyimpan kontainer dan citra pada disk NVMe. Prosedurnya bervariasi, tergantung pada penyedia layanan cloud.

    +

    AWS

    Saat menggunakan Amazon EKS, Anda dapat menyesuaikan node terkelola dengan templat peluncuran, yang di dalamnya Anda dapat menentukan pengaturan konfigurasi untuk grup node. Berikut ini adalah contoh cara memasang disk NVMe pada node pekerja di cluster Amazon EKS Anda:

    +
    MIME-Version: 1.0
    +Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
    +
    +--==MYBOUNDARY==
    +Content-Type: text/x-shellscript; charset="us-ascii"
    +
    +#!/bin/bash
    +echo "Running custom user data script"
    +if ( lsblk | fgrep -q nvme1n1 ); then
    +    mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker
    +    mkfs.xfs /dev/nvme1n1
    +    mount /dev/nvme1n1 /mnt/data
    +    chmod 0755 /mnt/data
    +    mv /var/lib/kubelet /mnt/data/
    +    mv /var/lib/docker /mnt/data/
    +    ln -sf /mnt/data/kubelet /var/lib/kubelet
    +    ln -sf /mnt/data/docker /var/lib/docker
    +    UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')
    +    echo "UUID=$UUID     /mnt/data   xfs    defaults,noatime  1   1" >> /etc/fstab
    +fi
    +echo 10485760 > /proc/sys/fs/aio-max-nr
    +
    +--==MYBOUNDARY==--
    +
    +
    +

    Pada contoh di atas, kami mengasumsikan bahwa disk NVMe adalah /dev/nvme1n1. Anda perlu memodifikasi skrip agar sesuai dengan konfigurasi spesifik Anda.

    +
    +

    Untuk detailnya, lihat Menyesuaikan node terkelola dengan templat peluncuran.

    +

    GCP

    Untuk menyediakan penyimpanan SSD Lokal di cluster Google Kubernetes Engine (GKE), dan mengonfigurasi beban kerja untuk mengonsumsi data dari penyimpanan sementara yang didukung SSD Lokal yang terpasang pada node di cluster Anda, jalankan perintah berikut:

    +
    gcloud container node-pools create ${POOL_NAME} \
    +    --cluster=${CLUSTER_NAME} \
    +    --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \
    +    --machine-type=${MACHINE_TYPE}
    +
    +

    Untuk detailnya, lihat Menyediakan penyimpanan SSD Lokal di GKE.

    +

    Azure

    Untuk membuat set skala mesin virtual (VMSS) dengan penyimpanan disk NVMe lokal, Anda perlu meneruskan data khusus ke instance VM. Berikut ini adalah contoh cara melampirkan disk NVMe ke instance VM di VMSS:

    +
    mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1
    +mdadm -Ds > /etc/mdadm/mdadm.conf 
    +update-initramfs -u
    +
    +mkfs.xfs /dev/md0
    +mkdir -p /var/lib/kubelet
    +echo '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +
    +

    Pada contoh di atas, kami mengasumsikan bahwa disk NVMe adalah /dev/nvme0n1 dan /dev/nvme1n1. Anda perlu memodifikasi skrip agar sesuai dengan konfigurasi spesifik Anda.

    +
    +

    Alibaba Cloud & TecentCloud

    Untuk membuat kumpulan node yang menggunakan volume SSD Lokal, kita perlu mengoper Data Kustom. Berikut ini adalah contoh data khusus.

    +
    #!/bin/bash
    +echo "nvme init start..."
    +mkfs.xfs /dev/nvme0n1
    +mkdir -p /mnt/data
    +echo '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +mkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods
    +mkdir -p  /var/lib/kubelet /var/lib/containerd /var/log/pods
    +
    +echo '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab
    +mount -a
    +
    +echo "nvme init end..."
    +
    +
    +

    Pada contoh di atas, kami mengasumsikan bahwa disk NVMe adalah /dev/nvme0n1. Anda perlu memodifikasi skrip agar sesuai dengan konfigurasi spesifik Anda.

    +
    +

    IDC Anda sendiri

    Jika Anda menjalankan IDC sendiri dan ingin mengonfigurasi container untuk menggunakan sistem file pada disk NVMe yang baru dipasang secara default di containerd, ikuti langkah berikut:

    +
      +
    • Pasang disk NVMe.

      +

      Pastikan disk NVMe Anda terpasang dengan benar di mesin host. Anda dapat menyambungkannya ke direktori pilihan Anda. Misalnya, jika Anda memasangnya ke /mnt/nvme, pastikan sudah diatur dengan benar dan Anda dapat melihat disk yang tersedia di /mnt/nvme dengan menjalankan lsblk atau df -h.

    • +
    • Perbarui konfigurasi containerd.

      +

      Ubah konfigurasi containerd untuk menggunakan mount baru sebagai direktori root untuk penyimpanan kontainer.

      +
      sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state
      +sudo vim /etc/containerd/config.toml
      +
      +

      Cari bagian [plugins."io.containerd.grpc.v1.cri".containerd], dan modifikasi pengaturan snapshotter dan root sebagai berikut

      +
      [plugins."io.containerd.grpc.v1.cri".containerd]
      +snapshotter = "overlayfs"
      +root = "/mnt/nvme/containerd"
      +state = "/mnt/nvme/containerd/state"
      +
    • +
    • Mulai ulang containerd.

      +

      Mulai ulang layanan containerd untuk menerapkan perubahan.

      +
      sudo systemctl restart containerd
      +
    • +
    +

    Verifikasi kinerja disk

    Anda disarankan untuk memverifikasi performa disk menggunakan Fio, yang merupakan alat populer untuk membandingkan performa disk. Berikut ini adalah contoh cara menjalankan Fio untuk menguji performa disk.

    +
      +
    • Sebarkan pod uji ke node dengan disk NVMe.

      +
      kubectl create -f ubuntu.yaml
      +
      +

      File ubuntu.yaml adalah sebagai berikut:

      +
      apiVersion: v1
      +kind: Pod
      +metadata:
      +name: ubuntu
      +spec:
      +containers:
      +- name: ubuntu
      +    image: ubuntu:latest
      +    command: ["sleep", "86400"]
      +    volumeMounts:
      +    - name: data-volume
      +        mountPath: /data
      +volumes:
      +    - name: data-volume
      +    emptyDir: {}
      +
    • +
    • Jalankan Fio untuk menguji performa disk.

      +
      # enter the container
      +kubectl exec pod/ubuntu -it bash
      +
      +# in container
      +apt-get update
      +apt-get install fio -y
      +
      +# change to the mounted dir
      +cd /data
      +
      +# write 10GB
      +fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test
      +
      +# verify the read speed
      +# compare with the disk performance indicators provided by various cloud providers.
      +fio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1  --readonly
      +
      +

      Dan hasilnya akan terlihat seperti ini:

      +
      Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]
      +iops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024
      +read: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)
      +    slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96
      +    clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13
      +    lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74
      +    clat percentiles (usec):
      +    |  1.00th=[    69],  5.00th=[    79], 10.00th=[    85], 20.00th=[    95],
      +    | 30.00th=[   106], 40.00th=[   123], 50.00th=[   149], 60.00th=[ 11469],
      +    | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],
      +    | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],
      +    | 99.99th=[767558]
      +bw (  MiB/s): min=  236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591
      +iops        : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591
      +lat (usec)   : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%
      +lat (usec)   : 1000=0.08%
      +lat (msec)   : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%
      +lat (msec)   : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%
      +lat (msec)   : 2000=0.01%
      +cpu          : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665
      +IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
      +    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
      +    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
      +    issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0
      +    latency   : target=0, window=0, percentile=100.00%, depth=64
      +
    • +
    +

    Menyebarkan Milvus Terdistribusi

    Setelah hasil verifikasi memuaskan, Anda dapat menggunakan Milvus Distributed dengan langkah-langkah berikut:

    +

    Kiat untuk men-deploy Milvus Distributed menggunakan Helm

    Pod QueryNode menggunakan disk NVMe sebagai volume EmptyDir secara default. Anda disarankan untuk memasang disk NVMe ke /var/lib/milvus/data di dalam pod QueryNode untuk memastikan performa yang optimal.

    +

    Untuk detail tentang cara menggunakan Milvus Distributed menggunakan Helm, lihat Menjalankan Milvus di Kubernetes dengan Helm.

    +

    Kiat untuk menerapkan Milvus Distributed menggunakan Milvus Operator

    Milvus Operator secara otomatis mengonfigurasi pod QueryNode untuk menggunakan disk NVMe sebagai volume EmptyDir. Anda disarankan untuk menambahkan konfigurasi berikut ke sumber daya khusus MilvusCluster:

    +
    ...
    +spec:
    +  components:
    +    queryNode:
    +      volumeMounts:
    +      - mountPath: /var/lib/milvus/data
    +        name: data
    +      volumes:
    +      - emptyDir:
    +        name: data
    +
    +

    Ini akan memastikan bahwa pod QueryNode menggunakan disk NVMe sebagai volume data. Untuk detail tentang cara menggunakan Milvus Distributed menggunakan Milvus Operator, lihat Menjalankan Milvus di Kubernetes dengan Milvus Operator.

    diff --git a/localization/v2.5.x/site/id/adminGuide/configure_access_logs.json b/localization/v2.5.x/site/id/adminGuide/configure_access_logs.json new file mode 100644 index 000000000..97e879005 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure_access_logs.json @@ -0,0 +1 @@ +{"codeList":["proxy:\n accessLog:\n enable: true\n # If `filename` is emtpy, logs will be printed to stdout.\n filename: \"\"\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\" # Name of the access log file\n localPath: \"/var/logs/milvus\" # Local file path where the access log file is stored\n maxSize: 500 # Max size for each single access log file. Unit: MB\n rotatedTime: 24 # Time interval for log rotation. Unit: seconds\n maxBackups: 7 # Max number of sealed access log files that can be retained\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n maxSize: 500\n rotatedTime: 24 \n maxBackups: 7\n minioEnable: true\n remotePath: \"/milvus/logs/access_logs\"\n remoteMaxTime: 0\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n # Define custom formatters for access logs with format and applicable methods\n formatters:\n # The `base` formatter applies to all methods by default\n # The `base` formatter does not require specific method association\n base: \n # Format string; an empty string means no log output\n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]\"\n # Custom formatter for specific methods (e.g., Query, Search)\n query: \n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]\"\n # Specify the methods to which this custom formatter applies\n methods: [\"Query\", \"Search\"]\n"],"headingContent":"Configure Access Logs","anchorList":[{"label":"Mengonfigurasi Log Akses","href":"Configure-Access-Logs","type":1,"isActive":false},{"label":"Opsi konfigurasi","href":"Configuration-options","type":2,"isActive":false},{"label":"Konfigurasi pemformat","href":"Formatter-config","type":2,"isActive":false},{"label":"Referensi: Metrik yang didukung","href":"Reference-Supported-metrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/configure_access_logs.md b/localization/v2.5.x/site/id/adminGuide/configure_access_logs.md new file mode 100644 index 000000000..8092b640a --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure_access_logs.md @@ -0,0 +1,175 @@ +--- +id: configure_access_logs.md +title: Mengonfigurasi Log Akses +--- +

    Mengonfigurasi Log Akses

    Fitur log akses di Milvus memungkinkan manajer server untuk mencatat dan menganalisis perilaku akses pengguna, membantu dalam memahami aspek-aspek seperti tingkat keberhasilan kueri dan alasan kegagalan.

    +

    Panduan ini memberikan instruksi terperinci tentang cara mengonfigurasi log akses di Milvus.

    +

    Konfigurasi log akses tergantung pada metode instalasi Milvus:

    + +

    Opsi konfigurasi

    Pilih di antara tiga opsi konfigurasi berdasarkan kebutuhan Anda:

    +
      +
    • Konfigurasi dasar: Untuk keperluan umum.
    • +
    • Config untuk file log akses lokal: Untuk menyimpan log secara lokal.
    • +
    • Config untuk mengunggah log akses lokal ke MinIO: Untuk penyimpanan dan pencadangan cloud.
    • +
    +

    Konfigurasi dasar

    Konfigurasi dasar melibatkan pengaktifan log akses dan menentukan nama file log atau menggunakan stdout.

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    # If `filename` is emtpy, logs will be printed to stdout.
    +    filename: ""
    +    # Additional formatter configurations...
    +
    +
      +
    • proxy.accessLog.enable: Apakah akan mengaktifkan fitur log akses. Defaultnya adalah false (salah).
    • +
    • proxy.accessLog.filename: Nama file log akses. Jika Anda membiarkan parameter ini kosong, log akses akan dicetak ke stdout.
    • +
    +

    Konfigurasi untuk file log akses lokal

    Mengkonfigurasi penyimpanan lokal untuk file log akses dengan parameter yang mencakup jalur file lokal, ukuran file, dan interval rotasi:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt" # Name of the access log file
    +    localPath: "/var/logs/milvus" # Local file path where the access log file is stored
    +    maxSize: 500 # Max size for each single access log file. Unit: MB
    +    rotatedTime: 24 # Time interval for log rotation. Unit: seconds
    +    maxBackups: 7 # Max number of sealed access log files that can be retained
    +    # Additional formatter configurations...
    +
    +

    Parameter ini ditentukan bila filename tidak kosong.

    +
      +
    • proxy.accessLog.localPath: Jalur file lokal tempat file log akses disimpan.
    • +
    • proxy.accessLog.maxSize: Ukuran maksimum dalam MB yang diperbolehkan untuk satu file log akses. Jika ukuran file log mencapai batas ini, proses rotasi akan dipicu. Proses ini akan menyegel file log akses saat ini, membuat file log baru, dan menghapus isi file log asli.
    • +
    • proxy.accessLog.rotatedTime: Interval waktu maksimum dalam detik yang diizinkan untuk memutar file log akses tunggal. Setelah mencapai interval waktu yang ditentukan, proses rotasi akan dipicu, menghasilkan pembuatan file log akses baru dan menyegel file log sebelumnya.
    • +
    • proxy.accessLog.maxBackups: Jumlah maksimum file log akses tersegel yang dapat disimpan. Jika jumlah file log akses tersegel melebihi batas ini, file log akses yang paling lama akan dihapus.
    • +
    +

    Config untuk mengunggah file log akses lokal ke MinIO

    Aktifkan dan konfigurasikan pengaturan untuk mengunggah file log akses lokal ke MinIO:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    maxSize: 500
    +    rotatedTime: 24 
    +    maxBackups: 7
    +    minioEnable: true
    +    remotePath: "/milvus/logs/access_logs"
    +    remoteMaxTime: 0
    +    # Additional formatter configurations...
    +
    +

    Saat mengonfigurasi parameter MinIO, pastikan Anda telah menetapkan maxSize atau rotatedTime. Jika tidak, hal ini dapat menyebabkan kegagalan pengunggahan file log akses lokal ke MinIO.

    +
      +
    • proxy.accessLog.minioEnable: Apakah akan mengunggah file log akses lokal ke MinIO. Defaultnya adalah false.
    • +
    • proxy.accessLog.remotePath: Jalur penyimpanan objek untuk mengunggah file log akses.
    • +
    • proxy.accessLog.remoteMaxTime: Interval waktu yang diizinkan untuk mengunggah file log akses. Jika waktu pengunggahan file log melebihi interval ini, file akan dihapus. Mengatur nilai ke 0 akan menonaktifkan fitur ini.
    • +
    +

    Konfigurasi pemformat

    Format log default yang digunakan untuk semua metode adalah format base, yang tidak memerlukan asosiasi metode tertentu. Namun, jika Anda ingin menyesuaikan output log untuk metode tertentu, Anda dapat menentukan format log khusus dan menerapkannya pada metode yang terkait.

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    # Define custom formatters for access logs with format and applicable methods
    +    formatters:
    +      # The `base` formatter applies to all methods by default
    +      # The `base` formatter does not require specific method association
    +      base: 
    +        # Format string; an empty string means no log output
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]"
    +      # Custom formatter for specific methods (e.g., Query, Search)
    +      query: 
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]"
    +        # Specify the methods to which this custom formatter applies
    +        methods: ["Query", "Search"]
    +
    +
      +
    • proxy.accessLog.<formatter_name>.format: Menentukan format log dengan metrik dinamis. Untuk informasi lebih lanjut, lihat Metrik yang didukung.
    • +
    • proxy.accessLog.<formatter_name>.methods: Mencantumkan operasi Milvus yang menggunakan pemformat ini. Untuk mendapatkan nama metode, lihat MilvusService di metode Milvus.
    • +
    +

    Referensi: Metrik yang didukung

    + + + + + + + + + + + + + + + + + + + + + + +
    Nama MetrikDeskripsi
    $method_nameNama metode
    $method_statusStatus akses: OK atau Gagal
    $method_exprEkspresi yang digunakan untuk operasi kueri, pencarian, atau penghapusan
    $trace_idTraceID yang terkait dengan akses
    $user_addrAlamat IP pengguna
    $user_nameNama pengguna
    $response_sizeUkuran data respons
    $error_codeKode kesalahan khusus untuk Milvus
    $error_msgPesan kesalahan terperinci
    $database_nameNama pangkalan data Milvus target
    $collection_nameNama koleksi Milvus target
    $partition_nameNama atau nama-nama partisi Milvus target
    $time_costWaktu yang dibutuhkan untuk menyelesaikan akses
    $time_nowWaktu saat log akses dicetak (biasanya setara dengan $time_end)
    $time_startWaktu saat akses dimulai
    $time_endWaktu di mana akses berakhir
    $sdk_versionVersi SDK Milvus yang digunakan oleh pengguna
    diff --git a/localization/v2.5.x/site/id/adminGuide/configure_operator.json b/localization/v2.5.x/site/id/adminGuide/configure_operator.json new file mode 100644 index 000000000..d7f478489 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n nodeSelector: {}\n tolerations: {}\n env: {}\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n","kubectl apply -f milvuscluster_resource.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n rootCoord: \n replicas: 1\n port: 8080\n resources:\n limits:\n cpu: '6'\n memory: '10Gi'\n dataCoord: {}\n queryCoord: {}\n indexCoord: {}\n dataNode: {}\n indexNode: {}\n queryNode: {}\n proxy:\n replicas: 1\n serviceType: ClusterIP\n resources:\n limits:\n cpu: '2'\n memory: 4Gi\n requests:\n cpu: 100m\n memory: 128Mi\n config: {}\n dependencies: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Milvus with Milvus Operator","anchorList":[{"label":"Mengkonfigurasi Milvus dengan Operator Milvus","href":"Configure-Milvus-with-Milvus-Operator","type":1,"isActive":false},{"label":"Mengonfigurasi sumber daya global","href":"Configure-global-resources","type":2,"isActive":false},{"label":"Mengonfigurasi sumber daya pribadi","href":"Configure-private-resources","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/configure_operator.md b/localization/v2.5.x/site/id/adminGuide/configure_operator.md new file mode 100644 index 000000000..600c95e24 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/configure_operator.md @@ -0,0 +1,336 @@ +--- +id: configure_operator.md +label: Milvus Operator +related_key: Milvus Operator +summary: Pelajari cara mengonfigurasi Milvus dengan Milvus Operator. +title: Mengkonfigurasi Milvus dengan Operator Milvus +--- +

    Mengkonfigurasi Milvus dengan Operator Milvus

    Dalam lingkungan produksi, Anda perlu mengalokasikan sumber daya ke cluster Milvus berdasarkan jenis mesin dan beban kerja. Anda dapat mengonfigurasi selama penerapan atau memperbarui konfigurasi saat cluster berjalan.

    +

    Topik ini memperkenalkan cara mengonfigurasi cluster Milvus saat Anda menginstalnya dengan Milvus Operator.

    +

    Topik ini mengasumsikan bahwa Anda telah menerapkan Milvus Operator. Lihat Menyebarkan Milvus Operator untuk informasi lebih lanjut.

    +

    Mengonfigurasi cluster Milvus dengan Milvus Operator meliputi:

    +
      +
    • Konfigurasi sumber daya global
    • +
    • Konfigurasi sumber daya pribadi
    • +
    +
    +Konfigurasi sumber daya privat akan menimpa konfigurasi sumber daya global. Jika Anda mengonfigurasi sumber daya secara global dan menentukan sumber daya privat komponen tertentu pada saat yang sama, komponen akan memprioritaskan dan merespons konfigurasi privat terlebih dahulu.
    +

    Mengonfigurasi sumber daya global

    Saat menggunakan Milvus Operator untuk memulai cluster Milvus, Anda perlu menentukan file konfigurasi. Contoh di sini menggunakan berkas konfigurasi default.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Rincian berkas konfigurasi adalah sebagai berikut:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    Bidang spec.components mencakup konfigurasi sumber daya global dan privat dari semua komponen Milvus. Berikut ini adalah empat bidang yang umum digunakan untuk mengonfigurasi sumber daya global.

    +
      +
    • image: Citra docker Milvus yang digunakan.
    • +
    • resources: Sumber daya komputasi yang dialokasikan untuk setiap komponen.
    • +
    • tolerations dan nodeSelector: Aturan penjadwalan dari setiap komponen Milvus dalam klaster K8s. Lihat toleransi dan nodeSelector untuk informasi lebih lanjut.
    • +
    • env: Variabel lingkungan.
    • +
    +

    Jika Anda ingin mengonfigurasi lebih banyak bidang, lihat dokumentasi di sini.

    +

    Untuk mengonfigurasi sumber daya global untuk klaster Milvus, buat file milvuscluster_resource.yaml.

    +

    Contoh

    Contoh berikut ini mengonfigurasi sumber daya global untuk cluster Milvus.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    nodeSelector: {}
    +    tolerations: {}
    +    env: {}
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +
    +

    Jalankan perintah berikut untuk menerapkan konfigurasi baru:

    +
    kubectl apply -f milvuscluster_resource.yaml
    +
    +
    +Sumber daya cluster akan diperbarui sesuai dengan file konfigurasi jika ada cluster Milvus bernama my-release di cluster K8s. Jika tidak, cluster Milvus baru akan dibuat.
    +

    Mengonfigurasi sumber daya pribadi

    Pada awalnya di Milvus 2.0, sebuah klaster Milvus memiliki tujuh komponen: proxy, root coord, data coord, query coord, simpul indeks, simpul data, dan simpul kueri. Namun, sebuah komponen baru, mix coord, dirilis bersama dengan Milvus 2.1.0. Mix coord mencakup semua komponen koordinator. Oleh karena itu, memulai mix coord berarti Anda tidak perlu menginstal dan memulai koordinator lain termasuk root coord, data coord, dan query coord.

    +

    Bidang umum yang digunakan untuk mengonfigurasi setiap komponen meliputi:

    +
      +
    • replica: Jumlah replika setiap komponen.
    • +
    • port: Nomor port listen dari setiap komponen.
    • +
    • Empat bidang yang umum digunakan dalam konfigurasi sumber daya global: image env , nodeSelector, tolerations, resources (lihat di atas). Untuk bidang yang dapat dikonfigurasi lebih lanjut, klik pada setiap komponen dalam dokumentasi ini.
    • +
    +
    +Selain itu, ketika mengkonfigurasi proxy, ada bidang tambahan yang disebut `serviceType`. Bidang ini mendefinisikan jenis layanan yang disediakan Milvus dalam cluster K8s.
    +

    Untuk mengonfigurasi sumber daya untuk komponen tertentu, tambahkan nama komponen di bidang di bawah spec.componets terlebih dahulu dan kemudian konfigurasikan sumber daya pribadinya.

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    TujuanParameter
    Penyetelan kinerja + +
    Data dan meta + +
    Administrasi + +
    Kuota dan Batas + +
    +
    +

    Contoh

    Contoh di bawah ini mengonfigurasi replika dan sumber daya komputasi proxy dan datanode dalam berkas milvuscluster.yaml.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +    rootCoord: 
    +      replicas: 1
    +      port: 8080
    +      resources:
    +        limits:
    +          cpu: '6'
    +          memory: '10Gi'
    +    dataCoord: {}
    +    queryCoord: {}
    +    indexCoord: {}
    +    dataNode: {}
    +    indexNode: {}
    +    queryNode: {}
    +    proxy:
    +      replicas: 1
    +      serviceType: ClusterIP
    +      resources:
    +        limits:
    +          cpu: '2'
    +          memory: 4Gi
    +        requests:
    +          cpu: 100m
    +          memory: 128Mi
    +  config: {}
    +  dependencies: {}
    +
    +
    +Contoh ini mengkonfigurasi tidak hanya sumber daya global tetapi juga sumber daya komputasi pribadi untuk root coord dan proxy. Ketika menggunakan berkas konfigurasi ini untuk memulai cluster Milvus, konfigurasi sumber daya privat akan diterapkan pada root coord dan proxy, sementara komponen lainnya akan mengikuti konfigurasi sumber daya global.
    +

    Jalankan perintah berikut untuk menerapkan konfigurasi baru:

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.json b/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.json new file mode 100644 index 000000000..f9bc0a734 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.json @@ -0,0 +1 @@ +{"codeList":["version: '3'\nservices:\n zookeeper:\n image: wurstmeister/zookeeper:latest\n container_name: zookeeper\n ports:\n - 2181:2181\n restart: always\n\n kafka:\n image: wurstmeister/kafka:latest\n container_name: kafka\n ports:\n - 9092:9092\n environment:\n - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\n - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092\n - KAFKA_LISTENERS=PLAINTEXT://:9092\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n restart: always\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9092\"\n saslUsername:\n saslPassword:\n saslMechanisms:\n securityProtocol:\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: \n tlsKey:\n tlsCACert:\n tlsKeyPassword:\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n ports:\n - 2181:2181\n\n kafka:\n image: confluentinc/cp-kafka:latest\n container_name: kafka\n depends_on:\n - zookeeper\n ports:\n - 9092:9092\n - 9093:9093\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","KafkaServer {\n org.apache.kafka.common.security.plain.PlainLoginModule required\n username=\"kafka\"\n password=\"pass123\"\n user_kafka=\"pass123\";\n};\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_PLAINTEXT\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: # path to client's public key\n tlsKey: # path to client's private key\n tlsCACert: # file or directory path to CA certificate\n tlsKeyPassword: # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","#!/bin/bash\n#\n#\n# This scripts generates:\n# - root CA certificate\n# - server certificate and keystore\n# - client keys\n#\n# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka\n#\n\n\nif [[ \"$1\" == \"-k\" ]]; then\n USE_KEYTOOL=1\n shift\nelse\n USE_KEYTOOL=0\nfi\n\nOP=\"$1\"\nCA_CERT=\"$2\"\nPFX=\"$3\"\nHOST=\"$4\"\n\nC=NN\nST=NN\nL=NN\nO=NN\nOU=NN\nCN=\"kafka-ssl\"\n \n\n# Password\nPASS=\"abcdefgh\"\n\n# Cert validity, in days\nVALIDITY=365\n\nset -e\n\nexport LC_ALL=C\n\nif [[ $OP == \"ca\" && ! -z \"$CA_CERT\" && ! -z \"$3\" ]]; then\n CN=\"$3\"\n openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin \"pass:$PASS\" -passout \"pass:$PASS\" < \"\n echo \" $0 [-k] server|client \"\n echo \"\"\n echo \" -k = Use keytool/Java Keystore, else standard SSL keys\"\n exit 1\nfi\n","$ ./gen-ssl-certs.sh ca ca-cert kafka-ssl\n","$ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl\n","$ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client\n","$ ls -l my_secrets\ntotal 12\n-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert\n-rw------- 1 1.9K Feb 26 11:53 ca-cert.key\n-rw-rw-r-- 1 41 Feb 26 11:54 ca-cert.srl\n-rw-rw-r-- 1 9 Feb 26 12:08 cert_creds\n-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed\n-rw------- 1 1.8K Feb 26 11:54 kafka_client.key\n-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem\n-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req\n-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: \n saslPassword: \n saslMechanisms: \n securityProtocol: SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SASL_SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n"],"headingContent":"Connecting to Kafka with SASL/SSL","anchorList":[{"label":"Menghubungkan ke Kafka dengan SASL/SSL","href":"Connecting-to-Kafka-with-SASLSSL","type":1,"isActive":false},{"label":"Menghubungkan Milvus ke Kafka Tanpa SASL/SSL","href":"Connect-Milvus-to-Kafka-Without-SASLSSL","type":2,"isActive":false},{"label":"Menghubungkan Milus ke Kafka dengan SASL/PLAIN Saja","href":"Connect-Milus-to-Kafka-with-SASLPLAIN-Alone","type":2,"isActive":false},{"label":"Menghubungkan Milvus ke Kafka dengan SSL Saja","href":"Connect-Milvus-to-Kafka-with-SSL-Alone","type":2,"isActive":false},{"label":"Menghubungkan Milvus ke Kafka dengan SASL/PLAIN dan SSL","href":"Connect-Milvus-to-Kafka-with-SASLPLAIN-and-SSL","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.md b/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.md new file mode 100644 index 000000000..d7e3892a4 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/connect_kafka_ssl.md @@ -0,0 +1,620 @@ +--- +id: connect_kafka_ssl.md +title: Menghubungkan ke Kafka dengan SASL/SSL +related_key: 'kafka, sasl, tls' +summary: >- + Panduan ini mencantumkan beberapa cara untuk menghubungkan Milvus ke Kafka, + mulai dari yang paling sederhana tanpa SASL/SSL hingga yang sepenuhnya aman + dengan SASL/SSL. +--- +

    Menghubungkan ke Kafka dengan SASL/SSL

    Panduan ini mencantumkan beberapa cara untuk menghubungkan Milvus ke Kafka, mulai dari yang paling sederhana tanpa SASL/SSL hingga yang sepenuhnya aman dengan SASL/SSL.

    +

    Menghubungkan Milvus ke Kafka Tanpa SASL/SSL

    Untuk memulai Milvus dan Kafka tanpa SASL/SSL, Anda menonaktifkan autentikasi dan enkripsi untuk Kafka dan Milvus. Gunakan hanya di lingkungan yang terpercaya.

    +

    1. Memulai layanan Kafka tanpa SASL/SSL

    Anda dapat menggunakan berkas docker-compose.yaml berikut ini untuk memulai layanan Kafka tanpa SASL/SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: wurstmeister/zookeeper:latest
    +    container_name: zookeeper
    +    ports:
    +      - 2181:2181
    +    restart: always
    +
    +  kafka:
    +    image: wurstmeister/kafka:latest
    +    container_name: kafka
    +    ports:
    +      - 9092:9092
    +    environment:
    +      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
    +      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
    +      - KAFKA_LISTENERS=PLAINTEXT://:9092
    +    volumes:
    +      - /var/run/docker.sock:/var/run/docker.sock
    +    restart: always
    +
    +

    Kemudian Anda dapat memulai layanan Kafka dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    2. Mulai Milvus dan Hubungkan ke Kafka

    Setelah layanan Kafka dimulai, Anda dapat memulai Milvus dan menyambungkannya. Gunakan berkas docker-compose.yaml berikut ini untuk memulai Milvus dan menyambung ke Kafka tanpa SASL/SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    Gunakan perintah berikut untuk mengunduh templat berkas konfigurasi Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    Dan atur parameter berikut:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9092"
    +  saslUsername:
    +  saslPassword:
    +  saslMechanisms:
    +  securityProtocol:
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: 
    +    tlsKey:
    +    tlsCACert:
    +    tlsKeyPassword:
    +
    +

    Kemudian Anda dapat memulai Milvus dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    Menghubungkan Milus ke Kafka dengan SASL/PLAIN Saja

    Untuk memulai Kafka dengan autentikasi SASL/PLAIN, Anda perlu menambahkan berkas kafka_server_jass.conf dengan pengaturan yang tepat.

    +

    1. Memulai layanan Kafka dengan SASL/PLAIN

    Letakkan berkas docker-compose.yaml dan berkas kafka_server_jaas.conf di direktori yang sama.

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    environment:
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +    ports:
    +      - 2181:2181
    +
    +  kafka:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka
    +    depends_on:
    +      - zookeeper
    +    ports:
    +      - 9092:9092
    +      - 9093:9093
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    Dalam berkas kafka_server_jass.conf, atur parameter berikut:

    +
    KafkaServer {
    +    org.apache.kafka.common.security.plain.PlainLoginModule required
    +    username="kafka"
    +    password="pass123"
    +    user_kafka="pass123";
    +};
    +
    +

    Kemudian Anda dapat memulai layanan Kafka dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    2. Mulai Milvus dan Hubungkan ke Kafka

    Setelah layanan Kafka dimulai, Anda dapat memulai Milvus dan menyambungkannya. Gunakan berkas docker-compose.yaml berikut untuk memulai Milvus dan menyambung ke Kafka dengan SASL/PLAIN:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    Gunakan perintah berikut untuk mengunduh templat berkas konfigurasi Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    Dan atur parameter berikut:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_PLAINTEXT
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: # path to client's public key
    +    tlsKey: # path to client's private key
    +    tlsCACert: # file or directory path to CA certificate
    +    tlsKeyPassword: # private key passphrase for use with private key, if any
    +
    +

    Kemudian Anda dapat memulai Milvus dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    Menghubungkan Milvus ke Kafka dengan SSL Saja

    Untuk memulai Kafka dengan autentikasi SSL, Anda perlu mendapatkan beberapa berkas sertifikat atau membuat berkas yang ditandatangani sendiri. Pada contoh ini, kita menggunakan sertifikat yang ditandatangani sendiri.

    +

    1. Menghasilkan Sertifikat yang Ditandatangani Sendiri

    Buat folder bernama my_secrets, tambahkan skrip bash bernama gen-ssl-certs.sh di dalamnya, dan tempelkan konten berikut ke dalamnya:

    +
    #!/bin/bash
    +#
    +#
    +# This scripts generates:
    +#  - root CA certificate
    +#  - server certificate and keystore
    +#  - client keys
    +#
    +# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka
    +#
    +
    +
    +if [[ "$1" == "-k" ]]; then
    +    USE_KEYTOOL=1
    +    shift
    +else
    +    USE_KEYTOOL=0
    +fi
    +
    +OP="$1"
    +CA_CERT="$2"
    +PFX="$3"
    +HOST="$4"
    +
    +C=NN
    +ST=NN
    +L=NN
    +O=NN
    +OU=NN
    +CN="kafka-ssl"
    + 
    +
    +# Password
    +PASS="abcdefgh"
    +
    +# Cert validity, in days
    +VALIDITY=365
    +
    +set -e
    +
    +export LC_ALL=C
    +
    +if [[ $OP == "ca" && ! -z "$CA_CERT" && ! -z "$3" ]]; then
    +    CN="$3"
    +    openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin "pass:$PASS" -passout "pass:$PASS" <<EOF
    +${C}
    +${ST}
    +${L}
    +${O}
    +${OU}
    +${CN}
    +$USER@${CN}
    +.
    +.
    +EOF
    +
    +
    +
    +elif [[ $OP == "server" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    #Step 1
    +    echo "############ Generating key"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        
    +    #Step 2
    +    echo "############ Adding CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    #Step 3
    +    echo "############ Export certificate"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +    echo "############ Sign certificate"
    +    openssl x509 -req -CA $CA_CERT -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin "pass:$PASS"
    +    
    +    
    +    echo "############ Import CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    echo "############ Import signed CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -import -file ${PFX}cert-signed    
    +
    +    
    +elif [[ $OP == "client" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    if [[ $USE_KEYTOOL == 1 ]]; then
    +        echo "############ Creating client truststore"
    +
    +        [[ -f ${PFX}client.truststore.jks ]] || keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +
    +        echo "############ Generating key"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        echo "########### Export certificate"
    +        keytool -storepass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +        echo "########### Sign certificate"
    +        openssl x509 -req -CA ${CA_CERT} -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASS        
    +
    +        echo "########### Import CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias CARoot -import -file ${CA_CERT} <<EOF
    +yes
    +EOF
    +
    +        echo "########### Import signed CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -import -file ${PFX}cert-signed
    +
    +    else
    +        # Standard OpenSSL keys
    +        echo "############ Generating key"
    +        openssl genrsa -des3 -passout "pass:$PASS" -out ${PFX}client.key 2048 
    +        
    +        echo "############ Generating request"
    +        openssl req -passin "pass:$PASS" -passout "pass:$PASS" -key ${PFX}client.key -new -out ${PFX}client.req \
    +                <<EOF
    +$C
    +$ST
    +$L
    +$O
    +$OU
    +$CN
    +.
    +$PASS
    +.
    +EOF
    +
    +        echo "########### Signing key"
    +        openssl x509 -req -passin "pass:$PASS" -in ${PFX}client.req -CA $CA_CERT -CAkey ${CA_CERT}.key -CAcreateserial -out ${PFX}client.pem -days $VALIDITY
    +
    +    fi
    +
    +    
    +    
    +
    +else
    +    echo "Usage: $0 ca <ca-cert-file> <CN>"
    +    echo "       $0 [-k] server|client <ca-cert-file> <file_prefix> <hostname>"
    +    echo ""
    +    echo "       -k = Use keytool/Java Keystore, else standard SSL keys"
    +    exit 1
    +fi
    +
    +

    Pada skrip di atas, kata sandi default abcdefgh berlaku. Untuk mengubah kata sandi, buat file teks bernama cert_creds dan masukkan kata sandi di baris pertama.

    +

    Kemudian jalankan perintah berikut ini untuk menghasilkan sertifikat:

    +
      +
    • Hasilkan sertifikat CA:

      +

      Perintah berikut ini mengasumsikan file sertifikat CA bernama ca-cert dan nama host broker adalah kafka-ssl:

      +
      $ ./gen-ssl-certs.sh ca ca-cert kafka-ssl
      +
    • +
    • Hasilkan sertifikat server dan penyimpanan kunci:

      +

      Berikut ini mengasumsikan file sertifikat CA bernama ca-cert, awalan untuk semua file keluaran adalah kafka_, dan nama host broker adalah kafka-ssl:

      +
      $ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl
      +
    • +
    • Menghasilkan kunci klien:

      +

      Berikut ini mengasumsikan file sertifikat CA bernama ca-cert, awalan untuk semua file keluaran adalah kafka_, dan nama klien adalah kafka-client:

      +
      $ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client
      +
    • +
    +

    Setelah semua sertifikat yang diperlukan dibuat, Anda bisa melihat file-file berikut ini di folder my_secrets:

    +
    $ ls -l my_secrets
    +total 12
    +-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert
    +-rw------- 1 1.9K Feb 26 11:53 ca-cert.key
    +-rw-rw-r-- 1   41 Feb 26 11:54 ca-cert.srl
    +-rw-rw-r-- 1    9 Feb 26 12:08 cert_creds
    +-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed
    +-rw------- 1 1.8K Feb 26 11:54 kafka_client.key
    +-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem
    +-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req
    +-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks
    +
    +

    2. Memulai layanan Kafka dengan SSL

    Gunakan berkas docker-compose.yaml berikut ini untuk memulai layanan Kafka dengan SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +
    +

    Kemudian mulai layanan Kafka dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    3. Mulai Milvus dan Hubungkan ke Kafka dengan SSL

    Setelah layanan Kafka dimulai, Anda dapat memulai Milvus dan menyambungkannya. Gunakan berkas docker-compose.yaml berikut untuk memulai Milvus dan terhubung ke Kafka dengan SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    Gunakan perintah berikut untuk mengunduh templat berkas konfigurasi Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    Dan atur parameter berikut:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: 
    +  saslPassword: 
    +  saslMechanisms: 
    +  securityProtocol: SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    +

    Kemudian jalankan Milvus dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    Menghubungkan Milvus ke Kafka dengan SASL/PLAIN dan SSL

    Untuk menghubungkan Milvus ke Kafka dengan SASL/PLAIN dan SSL, Anda perlu mengulangi langkah-langkah pada Menghubungkan Milus ke Kafka dengan SASL/PLAIN Saja dan Menghubungkan Milus ke Kafka dengan SSL Saja.

    +

    1. Memulai layanan Kafka dengan SASL/PLAIN dan SSL

    Gunakan file kafka_server_jass.conf yang disebutkan di Hubungkan Milus ke Kafka dengan SASL / PLAIN Saja dan folder my_secrets yang dihasilkan di Hubungkan Milus ke Kafka dengan SSL Saja untuk memulai layanan Kafka dengan SASL / PLAIN dan SSL.

    +

    File docker-compose.yaml berikut ini dapat digunakan untuk memulai layanan Kafka dengan SASL/PLAIN dan SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SASL_SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    Kemudian mulai layanan Kafka dengan perintah berikut:

    +
    $ docker compose up -d
    +
    +

    2. Mulai Milvus dan Hubungkan ke Kafka dengan SASL/PLAIN dan SSL

    Setelah layanan Kafka dimulai, Anda dapat memulai Milvus dan menyambungkannya. Gunakan berkas docker-compose.yaml berikut ini untuk memulai Milvus dan menyambung ke Kafka dengan SASL/PLAIN dan SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +    
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    Gunakan perintah berikut untuk mengunduh templat berkas konfigurasi Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    Dan atur parameter berikut:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_etcd.json b/localization/v2.5.x/site/id/adminGuide/deploy_etcd.json new file mode 100644 index 000000000..d886d056e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_etcd.json @@ -0,0 +1 @@ +{"codeList":["etcd:\n endpoints:\n - localhost:2379\n rootPath: by-dev # The root path where data are stored in etcd\n metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath\n kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath\n log:\n # path is one of:\n # - \"default\" as os.Stderr,\n # - \"stderr\" as os.Stderr,\n # - \"stdout\" as os.Stdout,\n # - file path to append server logs to.\n # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log\n path: stdout\n level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.\n use:\n # please adjust in embedded Milvus: true\n embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).\n data:\n # Embedded Etcd only.\n # please adjust in embedded Milvus: /tmp/milvus/etcdData/\n dir: default.etcd\n","docker compose up\n","etcd:\n enabled: false\n","externalEtcd:\n enabled: true\n ## the endpoints of the external etcd\n endpoints:\n - :2379\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={:2379}\n"],"headingContent":"Configure Meta Storage with Docker Compose or Helm","anchorList":[{"label":"Mengonfigurasi Penyimpanan Meta dengan Docker Compose atau Helm","href":"Configure-Meta-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Mengonfigurasi etcd dengan Docker Compose","href":"Configure-etcd-with-Docker-Compose","type":2,"isActive":false},{"label":"Mengkonfigurasi etcd pada K8","href":"Configure-etcd-on-K8s","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_etcd.md b/localization/v2.5.x/site/id/adminGuide/deploy_etcd.md new file mode 100644 index 000000000..8556f8925 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_etcd.md @@ -0,0 +1,138 @@ +--- +id: deploy_etcd.md +title: Mengonfigurasi Penyimpanan Meta dengan Docker Compose atau Helm +related_key: 'S3, storage' +summary: >- + Pelajari cara mengonfigurasi penyimpanan meta untuk Milvus dengan Docker + Compose/Helm. +--- +

    Mengonfigurasi Penyimpanan Meta dengan Docker Compose atau Helm

    Milvus menggunakan etcd untuk menyimpan metadata. Topik ini memperkenalkan cara mengonfigurasi etcd dengan Docker Compose atau Helm.

    +

    Mengonfigurasi etcd dengan Docker Compose

    1. Mengkonfigurasi etcd

    Untuk mengonfigurasi etcd dengan Docker Compose, berikan nilai Anda untuk bagian etcd di berkas milvus.yaml pada jalur milvus/configs.

    +
    etcd:
    +  endpoints:
    +    - localhost:2379
    +  rootPath: by-dev # The root path where data are stored in etcd
    +  metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
    +  kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
    +  log:
    +    # path is one of:
    +    #  - "default" as os.Stderr,
    +    #  - "stderr" as os.Stderr,
    +    #  - "stdout" as os.Stdout,
    +    #  - file path to append server logs to.
    +    # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
    +    path: stdout
    +    level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
    +  use:
    +    # please adjust in embedded Milvus: true
    +    embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).
    +  data:
    +    # Embedded Etcd only.
    +    # please adjust in embedded Milvus: /tmp/milvus/etcdData/
    +    dir: default.etcd
    +
    +

    Lihat Konfigurasi terkait etcd untuk informasi lebih lanjut.

    +

    2. Menjalankan Milvus

    Jalankan perintah berikut untuk menjalankan Milvus yang menggunakan konfigurasi etcd.

    +
    docker compose up
    +
    +
    Konfigurasi hanya berlaku setelah Milvus dijalankan. Lihat Memulai Milvus untuk informasi lebih lanjut.
    +

    Mengkonfigurasi etcd pada K8

    Untuk cluster Milvus pada K8, Anda dapat mengkonfigurasi etcd pada perintah yang sama dengan perintah untuk memulai Milvus. Sebagai alternatif, Anda dapat mengkonfigurasi etcd menggunakan berkas values.yml pada direktori /charts/milvus di repositori milvus-helm sebelum memulai Milvus.

    +

    Tabel berikut berisi daftar kunci untuk mengkonfigurasi etcd pada file YAML.

    + + + + + + + + + +
    KunciDeskripsiNilai
    etcd.enabledMengaktifkan atau menonaktifkan etcd.true/false
    externalEtcd.enabledMengaktifkan atau menonaktifkan etcd eksternal.true/false
    externalEtcd.endpointsTitik akhir untuk mengakses etcd.
    +

    Menggunakan file YAML

      +
    1. Konfigurasikan bagian etcd menggunakan nilai Anda di file values.yaml.
    2. +
    +
    etcd:
    +  enabled: false
    +
    +
      +
    1. Konfigurasikan bagian externaletcd menggunakan nilai Anda di file values.yaml.
    2. +
    +
    externalEtcd:
    +  enabled: true
    +  ## the endpoints of the external etcd
    +  endpoints:
    +    - <your_etcd_IP>:2379
    +
    +
      +
    1. Setelah mengkonfigurasi bagian sebelumnya dan menyimpan berkas values.yaml, jalankan perintah berikut untuk menginstall Milvus yang menggunakan konfigurasi etcd.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Menggunakan sebuah perintah

    Untuk menginstall Milvus dan mengkonfigurasi etcd, jalankan perintah berikut ini dengan menggunakan nilai-nilai Anda.

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={<your_etcd_IP>:2379}
    +
    +

    Selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Docker Compose atau Helm:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.json b/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.json new file mode 100644 index 000000000..86dd74732 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.json @@ -0,0 +1 @@ +{"codeList":["pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of pulsar\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n","docker compose up\n","extraConfigFiles:\n user.yaml: |+\n pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of Pulsar\n webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n tenant: public\n namespace: default \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n kafka:\n brokerList:\n - :\n saslUsername:\n saslPassword:\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n rocksmq:\n # The path where the message is stored in rocksmq\n # please adjust in embedded Milvus: /tmp/milvus/rdb_data\n path: /var/lib/milvus/rdb_data\n lrucacheratio: 0.06 # rocksdb cache memory ratio\n rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq\n retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.\n retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.\n compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data\n # compaction compression type, only support use 0,7.\n # 0 means not compress, 7 will use zstd\n # len of types means num of rocksdb level.\n compressionTypes: [0, 0, 7, 7, 7] \n","extraConfigFiles:\n user.yaml: |+\n mq:\n type: natsmq\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n"],"headingContent":"Configure Message Storage with Docker Compose or Helm","anchorList":[{"label":"Mengonfigurasi Penyimpanan Pesan dengan Docker Compose atau Helm","href":"Configure-Message-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Mengonfigurasi Pulsar dengan Docker Compose","href":"Configure-Pulsar-with-Docker-Compose","type":2,"isActive":false},{"label":"Mengkonfigurasi Pulsar dengan Helm","href":"Configure-Pulsar-with-Helm","type":2,"isActive":false},{"label":"Mengkonfigurasi Kafka dengan Helm","href":"Configure-Kafka-with-Helm","type":2,"isActive":false},{"label":"Mengkonfigurasi RocksMQ dengan Helm","href":"Configure-RocksMQ-with-Helm","type":2,"isActive":false},{"label":"Mengkonfigurasi NATS dengan Helm","href":"Configure-NATS-with-Helm","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.md b/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.md new file mode 100644 index 000000000..b49621e08 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_pulsar.md @@ -0,0 +1,242 @@ +--- +id: deploy_pulsar.md +title: Mengonfigurasi Penyimpanan Pesan dengan Docker Compose atau Helm +related_key: 'Pulsar, storage' +summary: >- + Pelajari cara mengonfigurasi penyimpanan pesan dengan Docker Compose atau + Helm. +--- +

    Mengonfigurasi Penyimpanan Pesan dengan Docker Compose atau Helm

    Milvus menggunakan Pulsar atau Kafka untuk mengelola log perubahan terbaru, mengeluarkan log aliran, dan menyediakan langganan log. Pulsar adalah sistem penyimpanan pesan default. Topik ini memperkenalkan cara mengonfigurasi penyimpanan pesan dengan Docker Compose atau Helm.

    +

    Anda dapat mengonfigurasi Pulsar dengan Docker Compose atau pada K8 dan mengonfigurasi Kafka pada K8.

    +

    Mengonfigurasi Pulsar dengan Docker Compose

    1. Mengkonfigurasi Pulsar

    Untuk mengonfigurasi Pulsar dengan Docker Compose, berikan nilai Anda untuk bagian pulsar di berkas milvus.yaml pada jalur milvus/configs.

    +
    pulsar:
    +  address: localhost # Address of pulsar
    +  port: 6650 # Port of pulsar
    +  maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +
    +

    Lihat Konfigurasi terkait Pulsar untuk informasi lebih lanjut.

    +

    2. Menjalankan Milvus

    Jalankan perintah berikut untuk menjalankan Milvus yang menggunakan konfigurasi Pulsar.

    +
    docker compose up
    +
    +
    Konfigurasi hanya berlaku setelah Milvus dijalankan. Lihat Memulai Milvus untuk informasi lebih lanjut.
    +

    Mengkonfigurasi Pulsar dengan Helm

    Untuk gugus Milvus pada K8, Anda dapat mengonfigurasi Pulsar dengan perintah yang sama dengan perintah untuk memulai Milvus. Atau, Anda dapat mengkonfigurasi Pulsar menggunakan berkas values.yml pada jalur /charts/milvus di repositori milvus-helm sebelum memulai Milvus.

    +

    Untuk detail tentang cara mengkonfigurasi Milvus menggunakan Helm, lihat Mengkonfigurasi Milvus dengan Grafik Helm. Untuk detail mengenai item konfigurasi yang berhubungan dengan Pulsar, lihat Konfigurasi yang berhubungan dengan Pulsar.

    +

    Menggunakan file YAML

      +
    1. Konfigurasikan bagian externalConfigFiles pada file values.yaml.
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    pulsar:
    +      address: localhost # Address of pulsar
    +      port: 6650 # Port of Pulsar
    +      webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080
    +      maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +      tenant: public
    +      namespace: default    
    +
    +
      +
    1. Setelah mengkonfigurasi bagian sebelumnya dan menyimpan file values.yaml, jalankan perintah berikut untuk menginstal Milvus yang menggunakan konfigurasi Pulsar.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Mengkonfigurasi Kafka dengan Helm

    Untuk cluster Milvus pada K8, Anda dapat mengonfigurasi Kafka dengan perintah yang sama dengan perintah untuk menjalankan Milvus. Atau, Anda dapat mengonfigurasi Kafka menggunakan file values.yml pada jalur /charts/milvus di repositori milvus-helm sebelum memulai Milvus.

    +

    Untuk detail mengenai cara mengkonfigurasi Milvus menggunakan Helm, lihat Mengkonfigurasi Milvus dengan Grafik Helm. Untuk detail mengenai item konfigurasi yang berhubungan dengan Pulsar, lihat Konfigurasi yang berhubungan dengan Pulsar.

    +

    Menggunakan file YAML

      +
    1. Konfigurasikan bagian externalConfigFiles pada file values.yaml jika Anda ingin menggunakan Kafka sebagai sistem penyimpanan pesan.
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    kafka:
    +      brokerList:
    +        -  <your_kafka_address>:<your_kafka_port>
    +      saslUsername:
    +      saslPassword:
    +      saslMechanisms: PLAIN
    +      securityProtocol: SASL_SSL    
    +
    +
      +
    1. Setelah mengkonfigurasi bagian sebelumnya dan menyimpan berkas values.yaml, jalankan perintah berikut untuk menginstal Milvus yang menggunakan konfigurasi Kafka.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Mengkonfigurasi RocksMQ dengan Helm

    Milvus mandiri menggunakan RocksMQ sebagai penyimpanan pesan default. Untuk langkah-langkah terperinci tentang cara mengonfigurasi Milvus dengan Helm, lihat Mengonfigurasi Milvus dengan Grafik Helm. Untuk detail tentang item konfigurasi yang berhubungan dengan RocksMQ, lihat Konfigurasi yang berhubungan dengan RocksMQ.

    +
      +
    • Jika Anda memulai Milvus dengan RocksMQ dan ingin mengubah pengaturannya, Anda dapat menjalankan helm upgrade -f dengan pengaturan yang telah diubah pada file YAML berikut ini.

    • +
    • Jika Anda telah menginstal Milvus mandiri menggunakan Helm dengan penyimpanan pesan selain RocksMQ dan ingin mengubahnya kembali ke RocksMQ, jalankan helm upgrade -f dengan file YAML berikut setelah Anda mem-flush semua koleksi dan menghentikan Milvus.

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    rocksmq:
    +      # The path where the message is stored in rocksmq
    +      # please adjust in embedded Milvus: /tmp/milvus/rdb_data
    +      path: /var/lib/milvus/rdb_data
    +      lrucacheratio: 0.06 # rocksdb cache memory ratio
    +      rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq
    +      retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.
    +      retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.
    +      compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data
    +      # compaction compression type, only support use 0,7.
    +      # 0 means not compress, 7 will use zstd
    +      # len of types means num of rocksdb level.
    +      compressionTypes: [0, 0, 7, 7, 7]    
    +
    +
    +

    Mengubah penyimpanan pesan tidak disarankan. Jika Anda ingin melakukan ini, hentikan semua operasi DDL, lalu panggil FlushAll API untuk mem-flush semua koleksi, dan akhirnya hentikan Milvus sebelum Anda benar-benar mengubah penyimpanan pesan.

    +
    +

    Mengkonfigurasi NATS dengan Helm

    NATS adalah alternatif penyimpanan pesan eksperimental untuk RocksMQ. Untuk langkah-langkah rinci tentang bagaimana mengkonfigurasi Milvus dengan Helm, lihat Mengkonfigurasi Milvus dengan Grafik Helm. Untuk detail tentang item konfigurasi yang berhubungan dengan RocksMQ, lihat Konfigurasi yang berhubungan dengan NATS.

    +
      +
    • Jika Anda memulai Milvus dengan NATS dan ingin mengubah pengaturannya, Anda dapat menjalankan helm upgrade -f dengan pengaturan yang telah diubah pada file YAML berikut ini.

    • +
    • Jika Anda telah menginstal Milvus mandiri dengan penyimpanan pesan selain NATS dan ingin mengubahnya menjadi NATS, jalankan helm upgrade -f dengan berkas YAML berikut setelah Anda mem-flush semua koleksi dan menghentikan Milvus.

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    mq:
    +      type: natsmq
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +
    +
    +

    Memilih antara RockMQ dan NATS?

    +

    RockMQ menggunakan CGO untuk berinteraksi dengan RocksDB dan mengelola memori dengan sendirinya, sementara NATS murni-GO yang tertanam dalam instalasi Milvus mendelegasikan pengelolaan memorinya ke pengumpul sampah Go (GC).

    +

    Dalam skenario di mana paket data lebih kecil dari 64 kb, RocksDB mengungguli dalam hal penggunaan memori, penggunaan CPU, dan waktu respons. Di sisi lain, jika paket data lebih besar dari 64 kb, NATS unggul dalam hal waktu respons dengan memori yang cukup dan penjadwalan GC yang ideal.

    +

    Saat ini, Anda disarankan untuk menggunakan NATS hanya untuk eksperimen.

    +
    +

    Selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Docker Compose atau Helm:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_s3.json b/localization/v2.5.x/site/id/adminGuide/deploy_s3.json new file mode 100644 index 000000000..7a8961e3c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_s3.json @@ -0,0 +1 @@ +{"codeList":["minio:\n address: \n port: \n accessKeyID: \n secretAccessKey: \n useSSL: \n bucketName: \"\"\n","docker compose up\n","minio:\n enabled: false\n","externalS3:\n enabled: true\n host: \"\"\n port: \"\"\n accessKey: \"\"\n secretKey: \"\"\n useSSL: \n bucketName: \"\"\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host= --set externalS3.port= --set externalS3.accessKey= --set externalS3.secretKey= --set externalS3.bucketName=\n"],"headingContent":"Configure Object Storage with Docker Compose or Helm","anchorList":[{"label":"Mengonfigurasi Penyimpanan Objek dengan Docker Compose atau Helm","href":"Configure-Object-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Mengkonfigurasi S3 dengan Docker Compose","href":"Configure-S3-with-Docker-Compose","type":2,"isActive":false},{"label":"Mengkonfigurasi S3 pada K8","href":"Configure-S3-on-K8s","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/deploy_s3.md b/localization/v2.5.x/site/id/adminGuide/deploy_s3.md new file mode 100644 index 000000000..9192a614c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/deploy_s3.md @@ -0,0 +1,134 @@ +--- +id: deploy_s3.md +title: Mengonfigurasi Penyimpanan Objek dengan Docker Compose atau Helm +related_key: 'S3, storage' +summary: >- + Pelajari cara menyiapkan penyimpanan S3 untuk Milvus dengan Docker Compose + atau Helm. +--- +

    Mengonfigurasi Penyimpanan Objek dengan Docker Compose atau Helm

    Milvus menggunakan MinIO untuk penyimpanan objek secara default, tetapi juga mendukung penggunaan Amazon Simple Storage Service (S3) sebagai penyimpanan objek yang persisten untuk berkas log dan indeks. Topik ini menjelaskan cara mengonfigurasi S3 untuk Milvus. Anda dapat melewatkan topik ini jika Anda sudah puas dengan MinIO.

    +

    Anda dapat mengonfigurasi S3 dengan Docker Compose atau pada K8.

    +

    Mengkonfigurasi S3 dengan Docker Compose

    1. Mengkonfigurasi S3

    MinIO kompatibel dengan S3. Untuk mengonfigurasi S3 dengan Docker Compose, berikan nilai Anda untuk bagian minio pada berkas milvus.yaml di jalur milvus/configs.

    +
    minio:
    +  address: <your_s3_endpoint>
    +  port: <your_s3_port>
    +  accessKeyID: <your_s3_access_key_id>
    +  secretAccessKey: <your_s3_secret_access_key>
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +

    Lihat Konfigurasi MinIO/S3 untuk informasi lebih lanjut.

    +

    2. Sempurnakan docker-compose.yaml

    Anda juga akan menghapus variabel lingkungan MINIO_ADDRESS untuk layanan milvus di docker-compose.yaml. Secara default, milvus akan menggunakan minio lokal, bukan S3 eksternal.

    +

    3. Menjalankan Milvus

    Jalankan perintah berikut untuk menjalankan Milvus yang menggunakan konfigurasi S3.

    +
    docker compose up
    +
    +
    Konfigurasi hanya berlaku setelah Milvus dijalankan. Lihat Memulai Milvus untuk informasi lebih lanjut.
    +

    Mengkonfigurasi S3 pada K8

    Untuk cluster Milvus pada K8, Anda dapat mengonfigurasi S3 dengan perintah yang sama dengan perintah untuk memulai Milvus. Sebagai alternatif, Anda dapat mengkonfigurasi S3 menggunakan berkas values.yml pada jalur /charts/milvus di repositori milvus-helm sebelum memulai Milvus.

    +

    Tabel berikut mencantumkan kunci untuk mengkonfigurasi S3 pada file YAML.

    + + + + + + + + + + + + + + + +
    KunciDeskripsiNilai
    minio.enabledMengaktifkan atau menonaktifkan MinIO.true/false
    externalS3.enabledMengaktifkan atau menonaktifkan S3.true/false
    externalS3.hostTitik akhir untuk mengakses S3.
    externalS3.portPort untuk mengakses S3.
    externalS3.rootPathJalur root dari penyimpanan S3.String emtpy secara default.
    externalS3.accessKeyID kunci akses untuk S3.
    externalS3.secretKeyKunci akses rahasia untuk S3.
    externalS3.bucketNameNama bucket S3.
    externalS3.useSSLApakah akan menggunakan SSL saat menyambungNilai-nilai yang ditetapkan secara default untuk false
    +

    Menggunakan file YAML

      +
    1. Mengonfigurasi bagian minio di file values.yaml.
    2. +
    +
    minio:
    +  enabled: false
    +
    +
      +
    1. Konfigurasikan bagian externalS3 menggunakan nilai Anda di file values.yaml.
    2. +
    +
    externalS3:
    +  enabled: true
    +  host: "<your_s3_endpoint>"
    +  port: "<your_s3_port>"
    +  accessKey: "<your_s3_access_key_id>"
    +  secretKey: "<your_s3_secret_key>"
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +
      +
    1. Setelah mengonfigurasi bagian sebelumnya dan menyimpan berkas values.yaml, jalankan perintah berikut untuk menginstal Milvus yang menggunakan konfigurasi S3.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Menggunakan perintah

    Untuk menginstall Milvus dan mengkonfigurasi S3, jalankan perintah berikut ini dengan menggunakan nilai-nilai Anda.

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true  --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host=<your_s3_endpoint> --set externalS3.port=<your_s3_port> --set externalS3.accessKey=<your_s3_access_key_id> --set externalS3.secretKey=<your_s3_secret_key> --set externalS3.bucketName=<your_bucket_name>
    +
    +

    Selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Docker Compose atau Helm:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/drop_users_roles.json b/localization/v2.5.x/site/id/adminGuide/drop_users_roles.json new file mode 100644 index 000000000..deb2f13cb --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/drop_users_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create a user​\nclient.drop_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.client.ConnectConfig​\nimport io.milvus.v2.client.MilvusClientV2​\nimport io.milvus.v2.service.rbac.request.DropUserReq​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropUserReq dropUserReq = DropUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nclient.dropUser(dropUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.deleteUser({​\n username: 'user_1'​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","import io.milvus.v2.service.rbac.request.listUsersReq​\n​\nList resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listUsers()​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root']​\n\n","from pymilvus import MilvusClient​\n​\nclient.drop_role(role_name=\"role_a\")​\n\n","import io.milvus.v2.service.rbac.request.DropRoleReq​\n​\nDropRoleReq dropRoleReq = DropRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\nclient.dropRole(dropRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.dropRole({​\n roleName: 'role_a',​\n })​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List resp = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listRoles(​\n includeUserInfo: True​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin']​\n\n"],"headingContent":"Drop Users & Roles​","anchorList":[{"label":"Hapus Pengguna & Peran","href":"Drop-Users--Roles​","type":1,"isActive":false},{"label":"Menghapus pengguna","href":"Drop-a-user​","type":2,"isActive":false},{"label":"Menghapus peran","href":"Drop-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/drop_users_roles.md b/localization/v2.5.x/site/id/adminGuide/drop_users_roles.md new file mode 100644 index 000000000..d64e08265 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/drop_users_roles.md @@ -0,0 +1,205 @@ +--- +id: drop_users_roles.md +related_key: enable RBAC +summary: >- + Untuk memastikan keamanan data, Anda disarankan untuk menghapus pengguna dan + peran yang sudah tidak digunakan. Panduan ini memperkenalkan cara menghapus + pengguna dan peran. +title: Hapus Pengguna & Peran +--- +

    Hapus Pengguna & Peran

    Untuk memastikan keamanan data, Anda disarankan untuk menghapus pengguna dan peran yang sudah tidak digunakan. Panduan ini memperkenalkan cara menghapus pengguna dan peran.

    +

    Menghapus pengguna

    Contoh berikut ini menunjukkan cara menghapus pengguna user_1.

    +
    +

    Pengguna root tidak dapat dihapus.

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create a user​
    +client.drop_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig​
    +import io.milvus.v2.client.MilvusClientV2​
    +import io.milvus.v2.service.rbac.request.DropUserReq​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropUserReq dropUserReq = DropUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +client.dropUser(dropUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.deleteUser({​
    +    username: 'user_1'​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    Setelah pengguna dijatuhkan, Anda dapat membuat daftar semua pengguna yang ada untuk memeriksa apakah operasi penghapusan berhasil.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.listUsersReq​
    +​
    +List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listUsers()​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran. Tidak ada user_1 dalam daftar. Operasi penghapusan berhasil.

    +
    ['root']​
    +
    +
    +

    Menghapus peran

    Contoh berikut ini menunjukkan cara menghapus peran role_a.

    +
    +

    Peran bawaan admin tidak dapat dihapus.

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.drop_role(role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropRoleReq​
    +​
    +DropRoleReq dropRoleReq = DropRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +client.dropRole(dropRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.dropRole({​
    +   roleName: 'role_a',​
    + })​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    Setelah peran dihapus, Anda dapat mencantumkan semua peran yang ada untuk memeriksa apakah operasi penghapusan berhasil.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> resp = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listRoles(​
    +    includeUserInfo: True​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran. Tidak ada role_a dalam daftar. Operasi pelepasan berhasil.

    +
    ['admin']​
    +
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/dynamic_config.json b/localization/v2.5.x/site/id/adminGuide/dynamic_config.json new file mode 100644 index 000000000..aa82f45a8 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/dynamic_config.json @@ -0,0 +1 @@ +{"codeList":["$ etcdctl put by-dev/config/proxy/minPasswordLength 8\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl del by-dev/config/proxy/minPasswordLength \n# or \n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl get --prefix by-dev/config\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd\"\n","Offline > connect --etcd ip:port \nMilvus(by-dev) > show session # List all nodes with their server ID\nMilvus(by-dev) > visit querycoord 1 # Visit a node by server ID\nQueryCoord-1(ip:port) > configuration # List the configuration of the node\n"],"headingContent":"Configure Milvus on the Fly","anchorList":[{"label":"Mengkonfigurasi Milvus dengan Cepat","href":"Configure-Milvus-on-the-Fly","type":1,"isActive":false},{"label":"Sebelum Anda memulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Mengubah konfigurasi","href":"Change-configurations","type":2,"isActive":false},{"label":"Mengembalikan konfigurasi","href":"Roll-back-configurations","type":2,"isActive":false},{"label":"Melihat konfigurasi","href":"View-configurations","type":2,"isActive":false},{"label":"Item konfigurasi yang berlaku","href":"Applicable-configuration-items","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/dynamic_config.md b/localization/v2.5.x/site/id/adminGuide/dynamic_config.md new file mode 100644 index 000000000..815354458 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/dynamic_config.md @@ -0,0 +1,208 @@ +--- +id: dynamic_config.md +related_key: configure +summary: Pelajari tentang konfigurasi dinamis Milvus. +title: Mengkonfigurasi Milvus dengan Cepat +--- +

    Mengkonfigurasi Milvus dengan Cepat

    Milvus memungkinkan Anda untuk mengubah beberapa konfigurasinya dengan cepat.

    +

    Sebelum Anda memulai

    Anda perlu memastikan bahwa: - Anda telah

    +
      +
    • Anda telah menginstal Birdwatcher. Untuk detailnya, lihat Menginstal Birdwatcher,
    • +
    • Anda telah menginstal etcdctl. Untuk detailnya, lihat Berinteraksi dengan etcd, atau
    • +
    • Anda telah menginstal klien etcd lain, seperti klien Python.
    • +
    +
    +
      +
    • Contoh dalam panduan ini mengubah nilai proxy.minPasswordLength menjadi 8. Anda dapat mengganti kunci dengan kunci yang berlaku yang tercantum dalam item konfigurasi yang berlaku.
    • +
    • Contoh dalam panduan ini mengasumsikan bahwa jalur root Milvus Anda adalah by-dev. Semua konfigurasi terdaftar di bawah jalur by-dev/config. Jalur root Milvus bervariasi tergantung pada cara Anda menginstalnya. Untuk instans yang terinstalasi menggunakan grafik Helm, jalur root default-nya adalah by-dev. Jika Anda tidak mengetahui jalur root, lihat Menghubungkan ke etcd.
    • +
    +
    +

    Mengubah konfigurasi

    Pada Milvus, proxy.minPasswordLength diatur ke 6 secara default. Untuk mengubah nilai ini, Anda dapat melakukan hal berikut:

    +
    $ etcdctl put by-dev/config/proxy/minPasswordLength 8
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8"
    +
    +

    Kemudian Anda dapat memeriksa konfigurasi sebagai berikut:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    Mengembalikan konfigurasi

    Milvus juga memungkinkan Anda untuk mengembalikan konfigurasi Anda jika nilai yang diubah tidak lagi berlaku.

    +
    $ etcdctl del by-dev/config/proxy/minPasswordLength 
    +# or 
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength"
    +
    +

    Kemudian Anda dapat memeriksa konfigurasi sebagai berikut:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    Melihat konfigurasi

    Selain melihat nilai dari item konfigurasi tertentu, Anda juga dapat mencantumkan semua item konfigurasi.

    +
    $ etcdctl get --prefix by-dev/config
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd"
    +
    +

    Untuk melihat konfigurasi node tertentu:

    +
    Offline > connect --etcd ip:port 
    +Milvus(by-dev) > show session          # List all nodes with their server ID
    +Milvus(by-dev) > visit querycoord 1    # Visit a node by server ID
    +QueryCoord-1(ip:port) > configuration  # List the configuration of the node
    +
    +

    Item konfigurasi yang berlaku

    Saat ini, Anda dapat mengubah item konfigurasi berikut dengan cepat.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Item konfigurasiNilai default
    pulsar.maxMessageSize5242880
    common.retentionDuration86400
    common.entityExpiration-1
    common.gracefulTime5000
    common.gracefulStopTimeout30
    kuotaDanBatas.ddl.enabledFALSE
    kuotaDanBatas.indexRate.diaktifkanFALSE
    kuotaDanBatas.flushRate.diaktifkanSALAH
    kuotaDanBatas.compactionRate.enabledFALSE
    kuotaDanBatas.dml.diaktifkanFALSE
    kuotaDanBatas.dql.diaktifkanFALSE
    kuotaDanBatas.limits.collection.maxNum64
    kuotaDanBatas.batasPenulisan.forceDenyFALSE
    kuotaDanBatas.batasPenulisan.ttProteksi.diaktifkanFALSE
    kuotaDanBatas.batasPenulisan.ttProtection.maxTimeTickDelay9223372036854775807
    kuotaDanBatas.batasPenulisan.memProteksi.diaktifkanBENAR
    kuotaDanBatas.batasPenulisan.memProteksi.dataNodeMemoryLowWaterLevel0.85
    kuotaDanBatas.batasPenulisan.memProteksi.dataNodeMemoryTingkatAirTinggi0.95
    kuotaDanBatas.batasPenulisan.memProteksi.kueriNodeMemoriTingkatAirRendah0.85
    kuotaDanBatas.batasPenulisan.memProteksi.queryNodeMemoryTingkatAirTinggi0.95
    kuotaDanBatas.batasPenulisan.perlindunganDisk.diaktifkanBENAR
    kuotaDanBatas.batasPenulisan.diskProtection.diskQuota+INF
    kuotaDanBatas.batasBaca.forceDenyFALSE
    kuotaDanBatas.batasBaca.perlindunganAntrean.diaktifkanFALSE
    kuotaDanBatas.batasPembacaan.perlindunganAntrean.nqInQueueThreshold9223372036854775807
    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold+INF
    kuotaDanBatas.batasPembacaan.proteksiHasil.diaktifkanFALSE
    kuotaDanBatas.batasPembacaan.proteksiHasil.maxReadResultRate+INF
    kuotaDanBatas.batasBaca.kecepatanDingin0.9
    autoIndex.enableFALSE
    autoIndex.params.build""
    autoIndex.params.extra""
    autoIndex.params.search""
    proxy.maxNameLength255
    proxy.maxPanjangNamaPengguna32
    proxy.minPanjangKataPassword6
    proxy.maxPanjangKataPassword256
    proxy.maxFieldNum64
    proxy.maxShardNum256
    proxy.maxDimension32768
    proxy.maxUserNum100
    proxy.maxRoleNum10
    queryNode.enableDiskTRUE
    dataCoord.segment.diskSegmentMaxSize2048
    dataCoord.compaction.enableAutoCompactionTRUE
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/grant_privileges.json b/localization/v2.5.x/site/id/adminGuide/grant_privileges.json new file mode 100644 index 000000000..9fb920b66 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/grant_privileges.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"privilege_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\n\nawait milvusClient.grantPrivilege({\n roleName: 'role_a',\n object: 'Collection', \n objectName: 'collection_01',\n privilegeName: 'Search'\n });\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"privilege_group_1\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n","from pymilvus import MilvusClient\n\nclient.describe_role(role_name=\"role_a\")\n","import io.milvus.v2.service.rbac.response.DescribeRoleResp;\nimport io.milvus.v2.service.rbac.request.DescribeRoleReq\n\nDescribeRoleReq describeRoleReq = DescribeRoleReq.builder()\n .roleName(\"role_a\")\n .build();\nDescribeRoleResp resp = client.describeRole(describeRoleReq);\nList infos = resp.getGrantInfos();\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.ListRoles(context.Background())\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nawait milvusClient.describeRole({roleName: 'role_a'});\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\"\n}'\n","{\n \"role\": \"role_a\",\n \"privileges\": [\n {\n \"collection_name\": \"collection_01\",\n \"db_name\": \"default\",\n \"role_name\": \"role_a\",\n \"privilege\": \"Search\",\n \"grantor_name\": \"root\"\n },\n \"privilege_group_1\"\n ]\n}\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"privielge_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n"],"headingContent":"Grant Privilege or Privilege Group to Roles​","anchorList":[{"label":"Memberikan Hak Istimewa atau Grup Hak Istimewa ke Peran","href":"Grant-Privilege-or-Privilege-Group-to-Roles​","type":1,"isActive":false},{"label":"Memberikan hak istimewa atau grup hak istimewa ke peran","href":"Grant-a-privilege-or-a-privilege-group-to-a-role​","type":2,"isActive":false},{"label":"Mendeskripsikan peran","href":"Describe-a-role","type":2,"isActive":false},{"label":"Mencabut hak istimewa atau grup hak istimewa dari suatu peran","href":"Revoke-a-privilege-or-a-privilege-group-from-a-role","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/grant_privileges.md b/localization/v2.5.x/site/id/adminGuide/grant_privileges.md new file mode 100644 index 000000000..6e9c0ff34 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/grant_privileges.md @@ -0,0 +1,543 @@ +--- +id: grant_privileges.md +related_key: enable RBAC +summary: >- + Setelah peran dibuat, Anda dapat memberikan hak istimewa pada peran tersebut. + Panduan ini memperkenalkan cara memberikan hak istimewa atau kelompok hak + istimewa ke peran. +title: Memberikan Hak Istimewa atau Grup Hak Istimewa ke Peran +--- +

    Memberikan Hak Istimewa atau Grup Hak Istimewa ke Peran

    Setelah peran dibuat, Anda dapat memberikan hak istimewa pada peran tersebut. Panduan ini memperkenalkan cara memberikan hak istimewa atau grup hak istimewa ke peran.

    +

    Memberikan hak istimewa atau grup hak istimewa ke peran

    Milvus 2.5 memperkenalkan versi baru API yang menyederhanakan operasi pemberian hak istimewa. Anda tidak perlu lagi mencari tipe objek ketika memberikan hak istimewa kepada sebuah role. Berikut ini adalah parameter dan penjelasan terkait.

    +
      +
    • role_name: Nama peran target yang perlu diberikan hak istimewa atau grup hak istimewa.

    • +
    • Resource: Sumber daya target hak istimewa, yang dapat berupa instance, database, atau koleksi tertentu. Tabel berikut ini menjelaskan cara menentukan sumber daya dalam metode client.grantV2().

    • +
    +

    Tingkat

    +

    Sumber Daya

    +

    Metode Pemberian

    +

    Catatan

    +

    Koleksi

    +

    +

    Koleksi tertentu

    +

    +

    client.grant_privilege_v2(nama_peran = "roleA", hak_keahlian = "CollectionAdmin", nama_koleksi = "col1", nama_db = "db1")

    +

    Masukkan nama koleksi target Anda dan nama basis data tempat koleksi target berada.

    +

    +

    Semua koleksi di bawah basis data tertentu

    +

    client.grant_privilege_v2(nama_peran = "peranA", hak_keuntungan = "CollectionAdmin", nama_koleksi = "*", nama_db = "db1")

    +

    Masukkan nama basis data target Anda dan karakter pengganti `*` sebagai nama koleksi.

    +

    Basis data ** ** Basis data**

    +

    Basis data tertentu

    +

    client.grant_privilege_v2(nama_peran = "peranA", hak = "DatabaseAdmin", nama_koleksi = "*", nama_basis = "db1")

    +

    Masukkan nama basis data target Anda dan karakter pengganti `*` sebagai nama koleksi.

    +

    +

    Semua basis data di bawah instans saat ini

    +

    client.grant_privilege_v2(nama_peran = "peranA", hak = "DatabaseAdmin", nama_koleksi = "*", nama_db = "*")

    +

    Masukkan `*` sebagai nama basis data dan `*` sebagai nama koleksi.

    +

    Instance ** Instance**

    +

    Instance saat ini

    +

    client.grant_privilege_v2(nama_peran = "peranA", hak = "ClusterAdmin", nama_koleksi = "*", nama_basis = "*")

    +

    Masukkan `*` sebagai nama basis data dan `*` sebagai nama koleksi.

    +
    +
      +
    • Hak istimewa: Privilege atau kelompok privilese tertentu yang perlu Anda berikan kepada sebuah role. Saat ini, Milvus menyediakan 56 jenis privilese yang dapat anda berikan. Tabel di bawah ini mencantumkan daftar hak istimewa di Milvus.

      +

      +

      Kolom jenis pada tabel di bawah ini digunakan untuk memudahkan anda mencari hak istimewa dengan cepat dan hanya digunakan untuk tujuan klasifikasi. Ketika memberikan hak istimewa, anda tidak perlu memahami jenisnya. Anda hanya perlu memasukkan hak istimewa yang sesuai.

      +

    • +
    +

    Ketik ** Jenis **

    +

    **Hak Istimewa**

    +

    **Deskripsi**

    +

    **Deskripsi API yang relevan di sisi klien**

    +

    Hak Istimewa Basis Data

    +

    DaftarDatabase

    +

    Melihat semua basis data dalam instance saat ini

    +

    [ListDatabases](https://milvus.io/docs/manage_databases.md)

    +

    JelaskanDatabase

    +

    Melihat detail sebuah basis data

    +

    [DescribeDatabase](https://milvus.io/docs/manage_databases.md)

    +

    CreateDatabase

    +

    Membuat basis data

    +

    [CreateDatabase](https://milvus.io/docs/manage_databases.md)

    +

    DropDatabase

    +

    Menghapus basis data

    +

    [DropDatabase](https://milvus.io/docs/manage_databases.md)

    +

    AlterDatabase

    +

    Memodifikasi properti sebuah basis data

    +

    [AlterDatabase](https://milvus.io/docs/manage_databases.md)

    +

    Hak Istimewa Koleksi

    +

    +

    GetFlushState

    +

    Memeriksa status operasi flush koleksi

    +

    [GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    GetLoadState

    +

    Memeriksa status pemuatan koleksi

    +

    [GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    GetLoadingProgress

    +

    Memeriksa kemajuan pemuatan koleksi

    +

    [GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)

    +

    TampilkanKoleksi

    +

    Melihat semua koleksi dengan hak akses koleksi

    +

    [TampilkanKoleksi](https://milvus.io/docs/view-collections.md)

    +

    DaftarAlias

    +

    Melihat semua alias dari sebuah koleksi

    +

    [ListAliases](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/list_aliases.md)

    +

    JelaskanKoleksi

    +

    Melihat detail dari sebuah koleksi

    +

    [DescribeCollection](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_collection.md)

    +

    JelaskanAlias

    +

    Melihat detail sebuah alias

    +

    [DescribeAlias](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_alias.md)

    +

    GetStatistics

    +

    Mendapatkan statistik koleksi (mis. Jumlah entitas dalam koleksi)

    +

    [GetCollectionStatistics](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/get_collection_stats.md)

    +

    CreateCollection

    +

    Membuat sebuah koleksi

    +

    [CreateCollection](https://milvus.io/docs/create-collection.md)

    +

    DropCollection

    +

    Jatuhkan koleksi

    +

    [DropCollection](https://milvus.io/docs/drop-collection.md)

    +

    Memuat

    +

    Memuat koleksi

    +

    [LoadCollection](https://milvus.io/docs/load-and-release.md)/[GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)/[GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    Rilis

    +

    Melepaskan koleksi

    +

    [ReleaseCollection](https://milvus.io/docs/load-and-release.md)

    +

    Siram

    +

    +

    Mempertahankan semua entitas dalam koleksi ke dalam segmen tertutup. Setiap entitas yang disisipkan setelah operasi flush akan disimpan dalam segmen baru.

    +

    [Flush](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)/[GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    Pemadatan

    +

    Memicu pemadatan secara manual

    +

    [Compact](https://milvus.io/docs/v2.0.x/compact_data.md)

    +

    Ganti NamaKoleksi

    +

    Mengganti nama koleksi

    +

    [RenameCollection](https://milvus.io/docs/modify-collection.md)

    +

    CreateAlias

    +

    Membuat alias untuk sebuah koleksi

    +

    [CreateAlias](https://milvus.io/docs/manage-aliases.md)

    +

    DropAlias

    +

    Menghilangkan alias dari sebuah koleksi

    +

    [DropAlias](https://milvus.io/docs/manage-aliases.md)

    +

    FlushAll

    +

    Mengosongkan semua koleksi dalam sebuah basis data

    +

    [FlushAll](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/flush_all.md)

    +

    Keistimewaan Partisi

    +

    HasPartition

    +

    Memeriksa apakah sebuah partisi ada

    +

    [HasPartition](https://milvus.io/docs/manage-partitions.md)

    +

    TampilkanPartisi

    +

    Melihat semua partisi dalam sebuah koleksi

    +

    [ShowPartitions](https://milvus.io/docs/manage-partitions.md)

    +

    CreatePartition

    +

    Membuat sebuah partisi

    +

    [CreatePartition](https://milvus.io/docs/manage-partitions.md)

    +

    DropPartition

    +

    Menghapus partisi

    +

    [DropPartition](https://milvus.io/docs/manage-partitions.md)

    +

    Hak Istimewa Indeks

    +

    IndexDetail

    +

    Melihat detail indeks

    +

    +

    [DescribeIndex/GetIndexState/GetIndexBuildProgress](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    CreateIndex

    +

    Membuat indeks

    +

    [CreateIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    DropIndex

    +

    Membuang sebuah indeks

    +

    [DropIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    Hak Istimewa Manajemen Sumber Daya

    +

    +

    LoadBalance

    +

    Mencapai keseimbangan beban

    +

    [LoadBalance](https://milvus.io/docs/resource_group.md)

    +

    Membuat Grup Sumber Daya

    +

    Membuat grup sumber daya

    +

    [CreateResourceGroup](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/create_resource_group.md)

    +

    Menghapus Grup Sumber Daya

    +

    Menghapus grup sumber daya

    +

    [DropResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    Memperbarui Grup Sumber Daya

    +

    Memperbarui grup sumber daya

    +

    [UpdateResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    JelaskanGrup Sumber Daya

    +

    Melihat detail grup sumber daya

    +

    [DescribeResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    ListResourceGroups

    +

    Melihat semua grup sumber daya dari instance saat ini

    +

    [ListResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    TransferNode

    +

    Mentransfer node di antara grup sumber daya

    +

    [TransferNode](https://milvus.io/docs/resource_group.md)

    +

    TransferReplica

    +

    Mentransfer replika antara kelompok sumber daya

    +

    [TransferReplica](https://milvus.io/docs/resource_group.md)

    +

    Pencadangan RBAC

    +

    Membuat cadangan untuk semua operasi terkait RBAC dalam instance saat ini

    +

    BackupRBAC

    +

    PulihkanRBAC

    +

    Memulihkan cadangan semua operasi terkait RBAC dalam instans saat ini

    +

    PulihkanRBAC

    +

    Hak Istimewa Entitas

    +

    +

    Kueri

    +

    Melakukan kueri

    +

    [Kueri] (https://milvus.io/docs/get-and-scalar-query.md)

    +

    Pencarian

    +

    Melakukan pencarian

    +

    [Cari](https://milvus.io/docs/single-vector-search.md)

    +

    Menyisipkan

    +

    Menyisipkan entitas

    +

    [Sisipkan](https://milvus.io/docs/insert-update-delete.md)

    +

    Menghapus

    +

    Menghapus entitas

    +

    [Hapus](https://milvus.io/docs/delete-entities.md)

    +

    Menyisipkan

    +

    Menyisipkan entitas

    +

    [Upsert](https://milvus.io/docs/upsert-entities.md)

    +

    Impor

    +

    Menyisipkan atau mengimpor entitas secara massal

    +

    [BulkInsert/Import](https://milvus.io/docs/import-data.md)

    +

    Hak Istimewa RBAC

    +

    BuatKepemilikan

    +

    Membuat pengguna atau peran

    +

    [CreateUser/CreateRole](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    PerbaruiPengguna

    +

    Memperbarui kata sandi pengguna

    +

    [PerbaruiKredensial](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    JatuhkanKepemilikan

    +

    Menghapus kata sandi pengguna atau peran

    +

    [HapusKredensial/DropRole](https://zilliverse.feishu.cn/wiki/OqZnwJHrJilLPukfvp5cSgnmnTh)

    +

    PilihKepemilikan

    +

    Melihat semua pengguna yang diberikan peran tertentu

    +

    [SelectRole/SelectGrant](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    Kelola Kepemilikan

    +

    Mengelola pengguna atau peran atau memberikan peran kepada pengguna

    +

    [OperateUserRole/OperatePrivilege/OperatePrivilegeV2](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    PilihPengguna

    +

    Melihat semua peran yang diberikan kepada pengguna

    +

    [SelectUser](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    BuatKelompokKeistimewaan

    +

    Membuat grup hak istimewa

    +

    [CreatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    HapusGrup Hak Istimewa

    +

    Menghapus grup hak istimewa

    +

    [DropPrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    Daftar Grup Hak Istimewa

    +

    Melihat semua grup hak istimewa dalam instans saat ini

    +

    [ListPrivilegeGroups](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    OperatePrivilegeGroup

    +

    Menambahkan hak istimewa atau menghapus hak istimewa dari grup hak istimewa

    +

    [OperatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +
    +

    Contoh berikut ini mendemonstrasikan cara memberikan hak istimewa PrivilegeSearch pada collection_01 di bawah basis data default serta grup hak istimewa bernama privilege_group_1 ke peran role_a.

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "privilege_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +
    +await milvusClient.grantPrivilege({
    +   roleName: 'role_a',
    +   object: 'Collection', 
    +   objectName: 'collection_01',
    +   privilegeName: 'Search'
    + });
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "privilege_group_1",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    +

    Mendeskripsikan peran

    Contoh berikut ini menunjukkan cara melihat hak istimewa yang diberikan kepada role role_a menggunakan metode describe_role.

    + +
    from pymilvus import MilvusClient
    +
    +client.describe_role(role_name="role_a")
    +
    +
    import io.milvus.v2.service.rbac.response.DescribeRoleResp;
    +import io.milvus.v2.service.rbac.request.DescribeRoleReq
    +
    +DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
    +        .roleName("role_a")
    +        .build();
    +DescribeRoleResp resp = client.describeRole(describeRoleReq);
    +List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.ListRoles(context.Background())
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +await milvusClient.describeRole({roleName: 'role_a'});
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a"
    +}'
    +
    +

    Di bawah ini adalah contoh keluaran.

    +
    {
    +     "role": "role_a",
    +     "privileges": [
    +         {
    +             "collection_name": "collection_01",
    +             "db_name": "default",
    +             "role_name": "role_a",
    +             "privilege": "Search",
    +             "grantor_name": "root"
    +         },
    +         "privilege_group_1"
    +     ]
    +}
    +
    +

    Mencabut hak istimewa atau grup hak istimewa dari suatu peran

    Contoh berikut ini menunjukkan cara mencabut hak istimewa PrivilegeSearch pada collection_01 di bawah basis data default serta grup hak istimewa privilege_group_1 yang telah diberikan kepada role role_a.

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "privielge_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/grant_roles.json b/localization/v2.5.x/site/id/adminGuide/grant_roles.json new file mode 100644 index 000000000..4ab8a6fa7 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/grant_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.grant_role(user_name=\"user_1\", role_name=\"role_a\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.GrantRoleReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nGrantRoleReq grantRoleReq = GrantRoleReq.builder()​\n .roleName(\"role_a\")​\n .userName(\"user_1\")​\n .build();​\nclient.grantRole(grantRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.grantRole({​\n username: 'user_1',​\n roleName: 'role_a'​\n })​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\",​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.describe_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.service.rbac.request.DescribeUserReq;​\nimport io.milvus.v2.service.rbac.response.DescribeUserResp;​\n​\nDescribeUserReq describeUserReq = DescribeUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nDescribeUserResp describeUserResp = client.describeUser(describeUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.describeUser({username: 'user_1'})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","{'user_name': 'user_1', 'roles': 'role_a'}​\n\n","from pymilvus import MilvusClient​\n​\nclient.revoke_role(​\n user_name='user_1',​\n role_name='role_a'​\n)​\n\n","import io.milvus.v2.service.rbac.request.RevokeRoleReq;​\n​\nclient.revokeRole(RevokeRoleReq.builder()​\n .userName(\"user_1\")​\n .roleName(\"role_a\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"roleName\": \"role_a\"​\n}'​\n\n"],"headingContent":"Grant Roles to Users​","anchorList":[{"label":"Memberikan Peran kepada Pengguna","href":"Grant-Roles-to-Users​","type":1,"isActive":false},{"label":"Memberikan peran kepada pengguna","href":"Grant-a-role-to-a-user​","type":2,"isActive":false},{"label":"Mendeskripsikan pengguna","href":"Describe-user​","type":2,"isActive":false},{"label":"Mencabut peran","href":"Revoke-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/grant_roles.md b/localization/v2.5.x/site/id/adminGuide/grant_roles.md new file mode 100644 index 000000000..967837162 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/grant_roles.md @@ -0,0 +1,205 @@ +--- +id: grant_roles.md +related_key: enable RBAC +summary: >- + Setelah membuat peran dan memberikan hak istimewa pada peran tersebut, Anda + dapat memberikan peran tersebut kepada pengguna sehingga pengguna dapat + mengakses sumber daya dan melakukan tindakan yang ditentukan oleh peran + tersebut. Anda dapat memberikan beberapa peran kepada pengguna atau memberikan + peran kepada beberapa pengguna. Panduan ini memperkenalkan cara memberikan + peran kepada pengguna. +title: Memberikan Peran kepada Pengguna +--- +

    Memberikan Peran kepada Pengguna

    Setelah membuat peran dan memberikan hak istimewa pada peran tersebut, Anda dapat memberikan peran tersebut kepada pengguna agar pengguna dapat mengakses sumber daya dan melakukan tindakan yang ditentukan oleh peran tersebut. Anda dapat memberikan beberapa peran kepada pengguna atau memberikan peran kepada beberapa pengguna. Panduan ini memperkenalkan cara memberikan peran kepada pengguna.

    +

    Pengguna bawaan root di Milvus telah diberikan peran admin, yang memiliki semua hak istimewa. Anda tidak perlu memberikan peran lain padanya.

    +

    Memberikan peran kepada pengguna

    Contoh berikut ini mendemonstrasikan cara memberikan peran role_a kepada pengguna user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.grant_role(user_name="user_1", role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.GrantRoleReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +GrantRoleReq grantRoleReq = GrantRoleReq.builder()​
    +        .roleName("role_a")​
    +        .userName("user_1")​
    +        .build();​
    +client.grantRole(grantRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.grantRole({​
    +   username: 'user_1',​
    +   roleName: 'role_a'​
    + })​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a",​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    Mendeskripsikan pengguna

    Setelah Anda memberikan peran kepada pengguna, Anda dapat memeriksa apakah operasi pemberian berhasil melalui metode describe_user().

    +

    Contoh berikut ini mendemonstrasikan cara memeriksa peran pengguna user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.describe_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DescribeUserReq;​
    +import io.milvus.v2.service.rbac.response.DescribeUserResp;​
    +​
    +DescribeUserReq describeUserReq = DescribeUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +DescribeUserResp describeUserResp = client.describeUser(describeUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.describeUser({username: 'user_1'})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran.

    +
    {'user_name': 'user_1', 'roles': 'role_a'}​
    +
    +
    +

    Mencabut peran

    Anda juga dapat mencabut peran yang telah ditetapkan ke pengguna.

    +

    Contoh berikut ini menunjukkan cara mencabut peran role_a yang diberikan kepada pengguna user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.revoke_role(​
    +    user_name='user_1',​
    +    role_name='role_a'​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RevokeRoleReq;​
    +​
    +client.revokeRole(RevokeRoleReq.builder()​
    +        .userName("user_1")​
    +        .roleName("role_a")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.json b/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.json new file mode 100644 index 000000000..f3ab52bfa --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.json @@ -0,0 +1 @@ +{"codeList":["rootCoord:\n maxGeneralCapacity: 65536\n","60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960\n","failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:\n"],"headingContent":"Limit Collection Counts","anchorList":[{"label":"Batasi Jumlah Koleksi","href":"Limit-Collection-Counts","type":1,"isActive":false},{"label":"Opsi konfigurasi","href":"Configuration-options","type":2,"isActive":false},{"label":"Menghitung jumlah koleksi","href":"Calculating-the-number-of-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.md b/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.md new file mode 100644 index 000000000..0e909e5df --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/limit_collection_counts.md @@ -0,0 +1,72 @@ +--- +id: limit_collection_counts.md +title: Tetapkan Batas Jumlah Penagihan +--- +

    Batasi Jumlah Koleksi

    Sebuah instance Milvus memungkinkan hingga 65.536 koleksi. Namun, koleksi yang terlalu banyak dapat menyebabkan masalah kinerja. Oleh karena itu, disarankan untuk membatasi jumlah koleksi yang dibuat dalam sebuah instans Milvus.

    +

    Panduan ini menyediakan instruksi tentang cara menetapkan batasan jumlah koleksi dalam sebuah instans Milvus.

    +

    Konfigurasi bervariasi tergantung pada cara Anda menginstal instans Milvus.

    +
      +
    • Untuk instans Milvus yang diinstal menggunakan Helm Charts

      +

      Tambahkan konfigurasi ke file values.yaml di bawah bagian config. Untuk detailnya, lihat Mengonfigurasi Milvus dengan Helm Charts.

    • +
    • Untuk instans Milvus yang diinstal menggunakan Docker Compose

      +

      Tambahkan konfigurasi ke berkas milvus.yaml yang Anda gunakan untuk memulai instans Milvus. Untuk detailnya, lihat Mengkonfigurasi Milvus dengan Docker Compose.

    • +
    • Untuk instans Milvus yang diinstal menggunakan Operator

      +

      Tambahkan konfigurasi ke bagian spec.components pada sumber daya kustom Milvus. Untuk detailnya, lihat Mengkonfigurasi Milvus dengan Operator.

    • +
    +

    Opsi konfigurasi

    rootCoord:
    +    maxGeneralCapacity: 65536
    +
    +

    Parameter maxGeneralCapacity mengatur jumlah maksimum koleksi yang dapat ditampung oleh instans Milvus saat ini. Nilai defaultnya adalah 65536.

    +

    Menghitung jumlah koleksi

    Dalam sebuah koleksi, Anda bisa mengatur beberapa pecahan dan partisi. Pecahan adalah unit logika yang digunakan untuk mendistribusikan operasi penulisan data di antara beberapa simpul data. Partisi adalah unit logika yang digunakan untuk meningkatkan efisiensi pengambilan data dengan hanya memuat sebagian data koleksi. Ketika menghitung jumlah koleksi dalam instance Milvus saat ini, Anda juga perlu menghitung pecahan dan partisi.

    +

    Sebagai contoh, anggaplah Anda telah membuat 100 koleksi, dengan 2 pecahan dan 4 partisi di 60 koleksi dan dengan 1 pecahan dan 12 partisi di 40 koleksi lainnya. Jumlah total unit koleksi (dihitung sebagai shards × partitions) dapat ditentukan sebagai berikut:

    +
    60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960
    +
    +

    Dalam contoh ini, jumlah total 960 unit koleksi yang dihitung mewakili penggunaan saat ini. maxGeneralCapacity mendefinisikan jumlah maksimum unit koleksi yang dapat didukung oleh sebuah instans, yang diatur ke 65536 secara default. Ini berarti instance dapat menampung hingga 65.536 unit koleksi. Jika jumlah total melebihi batas ini, sistem akan menampilkan pesan kesalahan berikut:

    +
    failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:
    +
    +

    Untuk menghindari kesalahan ini, Anda bisa mengurangi jumlah pecahan atau partisi dalam koleksi yang sudah ada atau yang baru, menghapus beberapa koleksi, atau menambah nilai maxGeneralCapacity.

    diff --git a/localization/v2.5.x/site/id/adminGuide/message_storage_operator.json b/localization/v2.5.x/site/id/adminGuide/message_storage_operator.json new file mode 100644 index 000000000..2edaf2781 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/message_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: \n msgStreamType: 'natsmq'\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n pulsar: # Optional\n # Whether (=true) to use an existed external pulsar as specified in the field endpoints or \n # (=false) create a new pulsar inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external pulsar endpoints if external=true\n endpoints:\n - 192.168.1.1:6650\n components: {}\n config: {} \n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n pulsar:\n inCluster:\n values:\n components:\n autorecovery: false\n zookeeper:\n replicaCount: 1\n bookkeeper:\n replicaCount: 1\n resoureces:\n limit:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n broker:\n replicaCount: 1\n configData:\n ## Enable `autoSkipNonRecoverableData` since bookkeeper is running\n ## without persistence\n autoSkipNonRecoverableData: \"true\"\n managedLedgerDefaultEnsembleSize: \"1\"\n managedLedgerDefaultWriteQuorum: \"1\"\n managedLedgerDefaultAckQuorum: \"1\"\n proxy:\n replicaCount: 1\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n config:\n kafka:\n # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL \n securityProtocol: PLAINTEXT\n # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512\n saslMechanisms: PLAIN\n saslUsername: \"\"\n saslPassword: \"\"\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n msgStreamType: \"kafka\"\n kafka:\n external: true\n brokerList: \n - \"kafkaBrokerAddr1:9092\"\n - \"kafkaBrokerAddr2:9092\"\n # ...\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec: \n dependencies:\n msgStreamType: \"kafka\"\n kafka:\n inCluster: \n values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka\n components: {}\n config: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Message Storage with Milvus Operator","anchorList":[{"label":"Mengonfigurasi Penyimpanan Pesan dengan Operator Milvus","href":"Configure-Message-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-begin","type":2,"isActive":false},{"label":"Mengkonfigurasi RocksMQ","href":"Configure-RocksMQ","type":2,"isActive":false},{"label":"Mengkonfigurasi NATS","href":"Configure-NATS","type":2,"isActive":false},{"label":"Mengkonfigurasi Pulsar","href":"Configure-Pulsar","type":2,"isActive":false},{"label":"Mengkonfigurasi Kafka","href":"Configure-Kafka","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/message_storage_operator.md b/localization/v2.5.x/site/id/adminGuide/message_storage_operator.md new file mode 100644 index 000000000..69ea44072 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/message_storage_operator.md @@ -0,0 +1,348 @@ +--- +id: message_storage_operator.md +title: Mengonfigurasi Penyimpanan Pesan dengan Operator Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: Pelajari cara mengonfigurasi penyimpanan pesan dengan Milvus Operator. +--- +

    Mengonfigurasi Penyimpanan Pesan dengan Operator Milvus

    Milvus menggunakan RocksMQ, Pulsar, atau Kafka untuk mengelola log perubahan terbaru, mengeluarkan log aliran, dan menyediakan langganan log. Topik ini memperkenalkan cara mengonfigurasi ketergantungan penyimpanan pesan ketika Anda menginstal Milvus dengan Milvus Operator. Untuk detail lebih lanjut, lihat Mengonfigurasi Penyimpanan Pesan dengan Milvus Operator di repositori Milvus Operator.

    +

    Topik ini mengasumsikan bahwa Anda telah men-deploy Milvus Operator.

    +
    Lihat Menyebarkan Operator Milvus untuk informasi lebih lanjut.
    +

    Anda perlu menentukan file konfigurasi untuk menggunakan Milvus Operator untuk memulai cluster Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Anda hanya perlu mengedit template kode di milvus_cluster_default.yaml untuk mengonfigurasi dependensi pihak ketiga. Bagian berikut ini memperkenalkan cara mengonfigurasi penyimpanan objek, etcd, dan Pulsar.

    +

    Sebelum Anda mulai

    Tabel di bawah ini menunjukkan apakah RocksMQ, NATS, Pulsar, dan Kafka didukung dalam mode mandiri dan klaster Milvus.

    + + + + + + + + +
    RocksMQNATSPulsarKafka
    Mode mandiri✔️✔️✔️✔️
    Mode cluster✖️✖️✔️✔️
    +

    Ada juga batasan lain untuk menentukan penyimpanan pesan:

    +
      +
    • Hanya satu penyimpanan pesan untuk satu instance Milvus yang didukung. Namun kami masih memiliki kompatibilitas ke belakang dengan beberapa penyimpanan pesan yang ditetapkan untuk satu instance. Prioritasnya adalah sebagai berikut:
        +
      • mode mandiri: RocksMQ (default) > Pulsar > Kafka
      • +
      • mode cluster: Pulsar (default) > Kafka
      • +
      • Nats yang diperkenalkan di 2.3 tidak berpartisipasi dalam aturan prioritas ini untuk kompatibilitas ke belakang.
      • +
    • +
    • Penyimpanan pesan tidak dapat diubah ketika sistem Milvus sedang berjalan.
    • +
    • Hanya versi Kafka 2.x atau 3.x yang didukung.
    • +
    +

    Mengkonfigurasi RocksMQ

    RocksMQ adalah penyimpanan pesan default pada Milvus mandiri.

    +
    +

    Saat ini, Anda hanya dapat mengonfigurasi RocksMQ sebagai penyimpanan pesan untuk Milvus standalone dengan Milvus Operator.

    +
    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan RocksMQ.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    Mengkonfigurasi NATS

    NATS adalah penyimpanan pesan alternatif untuk NATS.

    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan NATS.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: 
    +    msgStreamType: 'natsmq'
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +  components: {}
    +  config: {}
    +
    +

    Untuk memigrasikan penyimpanan pesan dari RocksMQ ke NATS, lakukan hal berikut:

    +
      +
    1. Hentikan semua operasi DDL.

    2. +
    3. Panggil API FlushAll dan kemudian hentikan Milvus setelah panggilan API selesai dieksekusi.

    4. +
    5. Ubah msgStreamType menjadi natsmq dan lakukan perubahan yang diperlukan pada pengaturan NATS di spec.dependencies.natsmq.

    6. +
    7. Jalankan Milvus lagi dan periksa apakah:

      +
        +
      • Entri log yang bertuliskan mqType=natsmq ada pada log.
      • +
      • Direktori bernama jetstream ada di direktori yang ditentukan di spec.dependencies.natsmq.server.storeDir.
      • +
    8. +
    9. (Opsional) Cadangkan dan bersihkan berkas data dalam direktori penyimpanan RocksMQ.

    10. +
    +
    +

    Pilih antara RocksMQ dan NATS?

    +

    RockMQ menggunakan CGO untuk berinteraksi dengan RocksDB dan mengelola memori dengan sendirinya, sementara NATS murni-GO yang tertanam dalam instalasi Milvus mendelegasikan manajemen memorinya ke pengumpul sampah Go (GC).

    +

    Dalam skenario di mana paket data lebih kecil dari 64 kb, RocksDB mengungguli dalam hal penggunaan memori, penggunaan CPU, dan waktu respons. Di sisi lain, jika paket data lebih besar dari 64 kb, NATS unggul dalam hal waktu respons dengan memori yang cukup dan penjadwalan GC yang ideal.

    +

    Saat ini, Anda disarankan untuk menggunakan NATS hanya untuk eksperimen.

    +
    +

    Mengkonfigurasi Pulsar

    Pulsar mengelola log perubahan terbaru, mengeluarkan log aliran, dan menyediakan langganan log. Mengkonfigurasi Pulsar untuk penyimpanan pesan didukung pada Milvus mandiri dan Milvus cluster. Namun, dengan Milvus Operator, Anda hanya dapat mengonfigurasi Pulsar sebagai penyimpanan pesan untuk Milvus cluster. Tambahkan bidang yang diperlukan di bawah spec.dependencies.pulsar untuk mengkonfigurasi Pulsar.

    +

    pulsar Milvus Operator mendukung external dan inCluster.

    +

    Pulsar eksternal

    external menunjukkan penggunaan layanan Pulsar eksternal. Bidang yang digunakan untuk mengkonfigurasi layanan Pulsar eksternal meliputi:

    +
      +
    • external: Nilai true menunjukkan bahwa Milvus menggunakan layanan Pulsar eksternal.
    • +
    • endpoints: Titik akhir Pulsar.
    • +
    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan Pulsar eksternal.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    pulsar: # Optional
    +      # Whether (=true) to use an existed external pulsar as specified in the field endpoints or 
    +      # (=false) create a new pulsar inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external pulsar endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:6650
    +  components: {}
    +  config: {}           
    +
    +

    Pulsar internal

    inCluster menunjukkan ketika kluster Milvus dimulai, layanan Pulsar dimulai secara otomatis di dalam kluster.

    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan Pulsar internal.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    pulsar:
    +      inCluster:
    +        values:
    +          components:
    +            autorecovery: false
    +          zookeeper:
    +            replicaCount: 1
    +          bookkeeper:
    +            replicaCount: 1
    +            resoureces:
    +              limit:
    +                cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +          broker:
    +            replicaCount: 1
    +            configData:
    +              ## Enable `autoSkipNonRecoverableData` since bookkeeper is running
    +              ## without persistence
    +              autoSkipNonRecoverableData: "true"
    +              managedLedgerDefaultEnsembleSize: "1"
    +              managedLedgerDefaultWriteQuorum: "1"
    +              managedLedgerDefaultAckQuorum: "1"
    +          proxy:
    +            replicaCount: 1
    +  components: {}
    +  config: {}            
    +
    +
    Contoh ini menentukan jumlah replika setiap komponen Pulsar, sumber daya komputasi Pulsar BookKeeper, dan konfigurasi lainnya.
    +
    Temukan item konfigurasi lengkap untuk mengonfigurasi layanan Pulsar internal di values.yaml. Tambahkan item konfigurasi sesuai kebutuhan di pulsar.inCluster.values seperti yang ditunjukkan pada contoh sebelumnya.
    +

    Dengan asumsi bahwa berkas konfigurasi bernama milvuscluster.yaml, jalankan perintah berikut untuk menerapkan konfigurasi.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Mengkonfigurasi Kafka

    Pulsar adalah penyimpanan pesan default dalam cluster Milvus. Jika Anda ingin menggunakan Kafka, tambahkan bidang opsional msgStreamType untuk mengkonfigurasi Kafka.

    +

    kafka Kafka mendukung external dan inCluster.

    +

    Kafka eksternal

    external mengindikasikan penggunaan layanan Kafka eksternal.

    +

    Bidang yang digunakan untuk mengonfigurasi layanan Kafka eksternal meliputi:

    +
      +
    • external: Nilai true menunjukkan bahwa Milvus menggunakan layanan Kafka eksternal.
    • +
    • brokerList: Daftar broker yang akan dikirimi pesan.
    • +
    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan Kafka eksternal.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  config:
    +    kafka:
    +      # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL 
    +      securityProtocol: PLAINTEXT
    +      # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512
    +      saslMechanisms: PLAIN
    +      saslUsername: ""
    +      saslPassword: ""
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    msgStreamType: "kafka"
    +    kafka:
    +      external: true
    +      brokerList: 
    +        - "kafkaBrokerAddr1:9092"
    +        - "kafkaBrokerAddr2:9092"
    +        # ...
    +
    +
    +

    Konfigurasi SASL didukung dalam operator v0.8.5 atau versi yang lebih tinggi.

    +
    +

    Kafka internal

    inCluster menunjukkan ketika cluster Milvus dimulai, layanan Kafka dimulai secara otomatis dalam cluster.

    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan Kafka internal.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec: 
    +  dependencies:
    +    msgStreamType: "kafka"
    +    kafka:
    +      inCluster: 
    +        values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka
    +  components: {}
    +  config: {}
    +
    +

    Temukan item konfigurasi lengkap untuk mengonfigurasi layanan Kafka internal di sini. Tambahkan item konfigurasi sesuai kebutuhan di kafka.inCluster.values.

    +

    Dengan asumsi bahwa berkas konfigurasi bernama milvuscluster.yaml, jalankan perintah berikut untuk menerapkan konfigurasi.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Milvus Operator:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.json b/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.json new file mode 100644 index 000000000..4419f7a89 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","kind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n etcd: # Optional\n # Whether (=true) to use an existed external etcd as specified in the field endpoints or \n # (=false) create a new etcd inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external etcd endpoints if external=true\n endpoints:\n - 192.168.1.1:2379\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n etcd:\n inCluster:\n values:\n replicaCount: 5\n resources:\n limits: \n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Meta Storage with Milvus Operator","anchorList":[{"label":"Mengkonfigurasi Penyimpanan Meta dengan Operator Milvus","href":"Configure-Meta-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Mengkonfigurasi etcd","href":"Configure-etcd","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.md b/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.md new file mode 100644 index 000000000..a71de388b --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/meta_storage_operator.md @@ -0,0 +1,117 @@ +--- +id: meta_storage_operator.md +title: Mengkonfigurasi Penyimpanan Meta dengan Operator Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: Pelajari cara mengonfigurasi meta storage dengan Milvus Operator. +--- +

    Mengkonfigurasi Penyimpanan Meta dengan Operator Milvus

    Milvus menggunakan etcd untuk menyimpan metadata. Topik ini memperkenalkan cara mengonfigurasi ketergantungan meta storage ketika Anda menginstal Milvus dengan Milvus Operator. Untuk detail lebih lanjut, lihat Mengkonfigurasi Meta Storage dengan Milvus Operator di repositori Milvus Operator.

    +

    Topik ini mengasumsikan bahwa Anda telah men-deploy Milvus Operator.

    +
    Lihat Menerapkan Milvus Operator untuk informasi lebih lanjut.
    +

    Anda perlu menentukan file konfigurasi untuk menggunakan Milvus Operator untuk memulai cluster Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Anda hanya perlu mengedit template kode di milvus_cluster_default.yaml untuk mengonfigurasi dependensi pihak ketiga. Bagian berikut ini memperkenalkan cara mengonfigurasi penyimpanan objek, etcd, dan Pulsar.

    +

    Mengkonfigurasi etcd

    Tambahkan bidang yang diperlukan di bawah spec.dependencies.etcd untuk mengkonfigurasi etcd.

    +

    etcd mendukung external dan inCluster.

    +

    Bidang yang digunakan untuk mengkonfigurasi layanan etcd eksternal meliputi:

    +
      +
    • external: Nilai true mengindikasikan bahwa Milvus menggunakan layanan etcd eksternal.
    • +
    • endpoints: Titik akhir dari etcd.
    • +
    +

    etcd eksternal

    Contoh

    Contoh berikut ini mengonfigurasi layanan etcd eksternal.

    +
    kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    etcd: # Optional
    +      # Whether (=true) to use an existed external etcd as specified in the field endpoints or 
    +      # (=false) create a new etcd inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external etcd endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:2379
    +  components: {}
    +  config: {}
    +
    +

    Internal etcd

    inCluster menunjukkan saat kluster Milvus dimulai, layanan etcd dimulai secara otomatis di dalam kluster.

    +

    Contoh

    Contoh berikut ini mengonfigurasi layanan etcd internal.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    etcd:
    +      inCluster:
    +        values:
    +          replicaCount: 5
    +          resources:
    +            limits: 
    +              cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +  components: {}
    +  config: {}              
    +
    +
    Contoh sebelumnya menetapkan jumlah replika sebagai 5 dan membatasi sumber daya komputasi untuk etcd.
    +
    Temukan item konfigurasi lengkap untuk mengonfigurasi layanan etcd internal di values.yaml. Tambahkan item konfigurasi sesuai kebutuhan di bawah etcd.inCluster.values seperti yang ditunjukkan pada contoh sebelumnya.
    +

    Dengan asumsi bahwa berkas konfigurasi bernama milvuscluster.yaml, jalankan perintah berikut untuk menerapkan konfigurasi.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Milvus Operator:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/alert.json b/localization/v2.5.x/site/id/adminGuide/monitor/alert.json new file mode 100644 index 000000000..58f2d8cff --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/alert.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Create an Alert for Milvus Services","anchorList":[{"label":"Membuat Peringatan untuk Layanan Milvus","href":"Create-an-Alert-for-Milvus-Services","type":1,"isActive":false},{"label":"Skenario untuk membuat peringatan","href":"Scenarios-for-creating-alerts","type":2,"isActive":false},{"label":"Mengatur peringatan","href":"Set-up-alerts","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/alert.md b/localization/v2.5.x/site/id/adminGuide/monitor/alert.md new file mode 100644 index 000000000..400ea232c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/alert.md @@ -0,0 +1,132 @@ +--- +id: alert.md +title: Membuat peringatan +related_key: monitor and alert. +summary: Pelajari cara membuat peringatan untuk layanan Milvus di Grafana. +--- +

    Membuat Peringatan untuk Layanan Milvus

    Topik ini memperkenalkan mekanisme peringatan untuk layanan Milvus dan menjelaskan mengapa, kapan, dan bagaimana cara membuat peringatan di Milvus.

    +

    Dengan membuat peringatan, Anda dapat menerima notifikasi ketika nilai metrik tertentu melebihi ambang batas yang telah Anda tentukan sebelumnya.

    +

    Sebagai contoh, Anda membuat peringatan dan menetapkan 80 MB sebagai nilai maksimum untuk penggunaan memori oleh komponen Milvus. Jika penggunaan aktual melebihi angka yang telah ditetapkan, Anda akan menerima peringatan yang mengingatkan Anda bahwa penggunaan memori oleh komponen Milvus melebihi 80 MB. Setelah menerima peringatan tersebut, Anda dapat menyesuaikan alokasi sumber daya secara tepat dan tepat waktu untuk memastikan ketersediaan layanan.

    +

    Skenario untuk membuat peringatan

    Di bawah ini adalah beberapa skenario umum yang perlu Anda buat peringatannya.

    +
      +
    • Penggunaan CPU atau memori oleh komponen Milvus terlalu tinggi.
    • +
    • Pod komponen Milvus hampir kehabisan ruang disk.
    • +
    • Pod komponen Milvus terlalu sering memulai ulang.
    • +
    +

    Metrik berikut ini tersedia untuk konfigurasi peringatan:

    + + + + + + + + + + + +
    MetrikDeskripsiSatuan ukuran
    Penggunaan CPUPenggunaan CPU oleh komponen Milvus yang ditunjukkan oleh waktu berjalannya CPU.Detik
    MemoriSumber daya memori yang dikonsumsi oleh komponen Milvus.MB
    GoroutinesAktivitas eksekusi bersamaan dalam bahasa GO./
    OS ThreadsThread, atau proses ringan dalam sistem operasi./
    Proses yang Dibuka FdsJumlah deskriptor file yang digunakan saat ini./
    +

    Mengatur peringatan

    Panduan ini mengambil contoh membuat peringatan untuk penggunaan memori komponen Milvus. Untuk membuat jenis peringatan lain, silakan sesuaikan perintah Anda. Jika Anda menemukan masalah selama proses ini, jangan ragu untuk bertanya di forum Milvus atau memulai diskusi di Slack.

    +

    Prasyarat

    Tutorial ini mengasumsikan bahwa Anda telah menginstal dan mengkonfigurasi Grafana. Jika belum, kami sarankan untuk membaca panduan pemantauan.

    +

    1. Menambahkan kueri baru

    Untuk menambahkan peringatan untuk penggunaan memori komponen Milvus, edit panel Memori. Kemudian, tambahkan kueri baru dengan metrik: process_resident_memory_bytes{app_kubernetes_io_name="milvus", app_kubernetes_io_instance=~"my-release", namespace="default"}

    +

    + + Alert_metric + Alert_metric

    +

    2. Menyimpan dasbor

    Simpan dasbor, dan tunggu beberapa menit untuk melihat peringatan.

    +

    + + Alert_dashboard + Alert_dashboard

    +

    Kueri peringatan Grafana tidak mendukung variabel template. Oleh karena itu, Anda harus menambahkan kueri kedua tanpa variabel template dalam label. Kueri kedua diberi nama "A" secara default. Anda dapat mengganti namanya dengan mengklik dropdown.

    +

    + + Alert_query + Alert_query

    +

    3. Menambahkan notifikasi peringatan

    Untuk menerima notifikasi peringatan, tambahkan "saluran notifikasi". Kemudian, tentukan saluran di bidang "Kirim ke".

    +

    + + Alert_notification + Alert_notification

    +

    Jika peringatan berhasil dibuat dan dipicu, Anda akan menerima notifikasi seperti yang ditunjukkan pada gambar di bawah ini.

    +

    + + Notification_message + Pesan_pemberitahuan

    +

    Untuk menghapus peringatan, buka panel "Peringatan" dan klik tombol hapus.

    +

    + + Delete_alert + Hapus_peringatan

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.json b/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.json new file mode 100644 index 000000000..00927ae2e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.json @@ -0,0 +1 @@ +{"codeList":["helm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n\nminio:\n enabled: true\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n storage:\n bucketNames:\n chunks: loki-chunks\n ruler: loki-ruler\n admin: loki-admin\n type: 's3'\n s3:\n endpoint: s3.us-west-2.amazonaws.com\n region: us-west-2\n secretAccessKey: \n accessKeyId: \n","kubectl create ns loki\nhelm install --values loki.yaml loki grafana/loki -n loki\n","config:\n clients:\n - url: http://loki-gateway/loki/api/v1/push\n","helm install --values promtail.yaml promtail grafana/promtail -n loki\n","kubectl create ns monitoring\nhelm install my-grafana grafana/grafana --namespace monitoring\n","kubectl get secret --namespace monitoring my-grafana -o jsonpath=\"{.data.admin-password}\" | base64 --decode ; echo\n","export POD_NAME=$(kubectl get pods --namespace monitoring -l \"app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana\" -o jsonpath=\"{.items[0].metadata.name}\")\nkubectl --namespace monitoring port-forward $POD_NAME 3000\n"],"headingContent":"Configure Grafana Loki","anchorList":[{"label":"Mengkonfigurasi Grafana Loki","href":"Configure-Grafana-Loki","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menerapkan Loki","href":"Deploy-Loki","type":2,"isActive":false},{"label":"Menyebarkan Promtail","href":"Deploy-Promtail","type":2,"isActive":false},{"label":"Menanyakan Log dengan Grafana","href":"Query-Logs-with-Grafana","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.md b/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.md new file mode 100644 index 000000000..9c0a90e6e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/configure_grafana_loki.md @@ -0,0 +1,174 @@ +--- +id: configure_grafana_loki.md +title: Mengkonfigurasi Grafana Loki +summary: >- + Topik ini menjelaskan cara mengumpulkan log menggunakan Loki dan melakukan + query log untuk cluster Milvus menggunakan Grafana. +--- +

    Mengkonfigurasi Grafana Loki

    Panduan ini menyediakan instruksi tentang cara mengonfigurasi Loki untuk mengumpulkan log dan Grafana untuk menanyakan dan menampilkan log untuk cluster Milvus.

    +

    Dalam panduan ini, Anda akan mempelajari caranya:

    +
      +
    • Menerapkan Loki dan Promtail pada cluster Milvus menggunakan Helm.
    • +
    • Mengonfigurasi penyimpanan objek untuk Loki.
    • +
    • Menanyakan log menggunakan Grafana.
    • +
    +

    Prasyarat

    +

    Menerapkan Loki

    Loki adalah sistem agregasi log yang terinspirasi oleh Prometheus. Terapkan Loki menggunakan Helm untuk mengumpulkan log dari cluster Milvus Anda.

    +

    1. Menambahkan Repositori Bagan Helm Grafana

    Tambahkan repositori bagan Grafana ke Helm dan perbarui:

    +
    helm repo add grafana https://grafana.github.io/helm-charts
    +helm repo update
    +
    +

    2. Mengonfigurasi Penyimpanan Objek untuk Loki

    Pilih salah satu opsi penyimpanan berikut dan buat file konfigurasi loki.yaml:

    +
      +
    • Opsi 1: Menggunakan MinIO untuk penyimpanan

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +
      +minio:
      +  enabled: true
      +
    • +
    • Opsi 2: Menggunakan AWS S3 untuk penyimpanan

      +

      Pada contoh berikut, ganti <accessKey> dan <keyId> dengan kunci akses dan ID S3 Anda sendiri, s3.endpoint dengan titik akhir S3, dan s3.region dengan wilayah S3.

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +  storage:
      +    bucketNames:
      +      chunks: loki-chunks
      +      ruler: loki-ruler
      +      admin: loki-admin
      +    type: 's3'
      +    s3:
      +      endpoint: s3.us-west-2.amazonaws.com
      +      region: us-west-2
      +      secretAccessKey: <accessKey>
      +      accessKeyId: <keyId>
      +
    • +
    +

    3. Menginstal Loki

    Jalankan perintah berikut ini untuk menginstal Loki:

    +
    kubectl create ns loki
    +helm install --values loki.yaml loki grafana/loki -n loki
    +
    +

    Menyebarkan Promtail

    Promtail adalah agen pengumpul log untuk Loki. Promtail membaca log dari pod Milvus dan mengirimkannya ke Loki.

    +

    1. Membuat Konfigurasi Promtail

    Buat file konfigurasi promtail.yaml:

    +
    config:
    +  clients:
    +    - url: http://loki-gateway/loki/api/v1/push
    +
    +

    2. Instal Promtail

    Instal Promtail menggunakan Helm:

    +
    helm install  --values promtail.yaml promtail grafana/promtail -n loki
    +
    +

    Menanyakan Log dengan Grafana

    Terapkan Grafana dan konfigurasikan untuk terhubung ke Loki untuk melakukan kueri log.

    +

    1. Menyebarkan Grafana

    Instal Grafana menggunakan perintah berikut:

    +
    kubectl create ns monitoring
    +helm install my-grafana grafana/grafana --namespace monitoring
    +
    +

    Sebelum Anda dapat mengakses Grafana, Anda perlu mengambil kata sandi admin:

    +
    kubectl get secret --namespace monitoring my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    +
    +

    Kemudian, teruskan porta Grafana ke mesin lokal Anda:

    +
    export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana" -o jsonpath="{.items[0].metadata.name}")
    +kubectl --namespace monitoring port-forward $POD_NAME 3000
    +
    +

    2. Menambahkan Loki sebagai Sumber Data di Grafana

    Setelah Grafana berjalan, Anda perlu menambahkan Loki sebagai sumber data untuk menanyakan log.

    +
      +
    1. Buka peramban web dan arahkan ke 127.0.0.1:3000. Masuk menggunakan nama pengguna admin dan kata sandi yang telah Anda dapatkan sebelumnya.
    2. +
    3. Pada menu sebelah kiri, pilih Sambungan > Tambah sambungan baru.
    4. +
    5. Pada halaman yang muncul, pilih Loki sebagai tipe sumber data. Anda dapat memasukkan loki pada kolom pencarian untuk menemukan sumber data.
    6. +
    7. Di pengaturan sumber data Loki, tentukan Nama dan URL, lalu klik Simpan & uji.
    8. +
    +

    + + DataSource + Sumber Data

    +

    3. Menanyakan Log Milvus

    Setelah menambahkan Loki sebagai sumber data, lakukan kueri log Milvus di Grafana:

    +
      +
    1. Pada menu sebelah kiri, klik Jelajahi.
    2. +
    3. Di sudut kiri atas halaman, pilih sumber data Loki.
    4. +
    5. Gunakan browser Label untuk memilih label dan menanyakan log.
    6. +
    +

    + + Query + Kueri

    diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.json b/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.json new file mode 100644 index 000000000..0489e53d5 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Metrics Dashboard","anchorList":[{"label":"Dasbor Metrik Milvus","href":"Milvus-Metrics-Dashboard","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.md b/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.md new file mode 100644 index 000000000..486758820 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/metrics_dashboard.md @@ -0,0 +1,196 @@ +--- +id: metrics_dashboard.md +title: Dasbor Metrik Milvus +summary: Topik ini memperkenalkan metrik pemantauan yang ditampilkan di Dasbor Milvus. +--- +

    Dasbor Metrik Milvus

    Milvus mengeluarkan daftar metrik deret waktu yang terperinci selama waktu berjalan. Anda dapat menggunakan Prometheus dan Grafana untuk memvisualisasikan metrik. Topik ini memperkenalkan metrik pemantauan yang ditampilkan di Dasbor Grafana Milvus.

    +

    Satuan waktu dalam topik ini adalah milidetik. Dan "persentil ke-99" dalam topik ini mengacu pada fakta bahwa 99 persen dari statistik waktu dikontrol dalam nilai tertentu.

    +

    Kami sarankan untuk membaca ikhtisar kerangka kerja pemantauan Milvus untuk memahami metrik Prometheus terlebih dahulu.

    +

    Proksi

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Tingkat Jumlah Vektor PencarianJumlah rata-rata vektor yang ditanyakan per detik oleh setiap proxy dalam dua menit terakhir.sum(increase(milvus_proxy_search_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_search_vectors_countAkumulasi jumlah vektor yang ditanyakan.
    Tingkat Jumlah Vektor SisipanJumlah rata-rata vektor yang dimasukkan per detik oleh setiap proxy dalam dua menit terakhir.sum(increase(milvus_proxy_insert_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_insert_vectors_countJumlah akumulasi vektor yang dimasukkan.
    Latensi PencarianLatensi rata-rata dan persentil ke-99 dari latensi penerimaan permintaan pencarian dan kueri oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_latencyLatensi permintaan pencarian dan kueri.
    Latensi Pencarian KoleksiLatensi rata-rata dan persentil ke-99 dari latensi penerimaan permintaan pencarian dan kueri ke koleksi tertentu oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    avg:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sumLatensi permintaan pencarian dan kueri ke koleksi tertentu
    Latensi MutasiLatensi rata-rata dan persentil ke-99 dari latensi penerimaan permintaan mutasi oleh setiap proksi dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_mutation_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_latency_sumLatensi permintaan mutasi.
    Latensi Mutasi KoleksiLatensi rata-rata dan persentil ke-99 dari latensi penerimaan permintaan mutasi ke koleksi tertentu oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    avg:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sumLatensi permintaan mutasi ke koleksi tertentu
    Latensi Hasil Pencarian TungguLatensi rata-rata dan persentil ke-99 dari latensi antara pengiriman permintaan pencarian dan kueri dan penerimaan hasil oleh proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_wait_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_wait_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_wait_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_wait_result_latencyLatensi antara mengirim permintaan pencarian dan kueri dan menerima hasil.
    Mengurangi Latensi Hasil PencarianLatensi rata-rata dan persentil ke-99 dari latensi penggabungan hasil pencarian dan kueri oleh proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_reduce_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_reduce_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_reduce_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_reduce_result_latencyLatensi penggabungan hasil pencarian dan kueri yang dikembalikan oleh setiap simpul kueri.
    Menguraikan Latensi Hasil PencarianLatensi rata-rata dan persentil ke-99 dari latensi penguraian hasil pencarian dan kueri oleh proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_decode_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_decode_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_decode_resultlatency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_decode_result_latencyLatensi penguraian kode setiap hasil pencarian dan kueri.
    Jumlah Objek Aliran MsgJumlah rata-rata, maksimum, dan minimum dari objek msgstream yang dibuat oleh setiap proxy pada topik fisik yang sesuai dalam dua menit terakhir.avg(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_msgstream_obj_numJumlah objek msgstream yang dibuat pada setiap topik fisik.
    Latensi Pengiriman MutasiLatensi rata-rata dan persentil ke-99 dari latensi pengiriman permintaan penyisipan atau penghapusan oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_send_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_mutation_send_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_send_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_send_latencyLatensi pengiriman permintaan penyisipan atau penghapusan.
    Cache Hit RateTingkat hit cache rata-rata dari operasi termasuk GeCollectionID, GetCollectionInfo, dan GetCollectionSchema per detik dalam dua menit terakhir.sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", cache_state="hit"}[2m])/120) by(cache_name, pod, node_id) / sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(cache_name, pod, node_id)milvus_proxy_cache_hit_countStatistik tingkat keberhasilan dan kegagalan setiap operasi pembacaan cache.
    Latensi Pembaruan CacheLatensi rata-rata dan persentil ke-99 dari latensi pembaruan cache oleh proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_cache_update_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_cache_update_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_cache_update_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_cache_update_latencyLatensi pembaruan cache setiap kali.
    Waktu SinkronisasiJumlah rata-rata, maksimum, dan minimum waktu epoch yang disinkronkan oleh setiap proxy di saluran fisik yang sesuai.avg(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_sync_epoch_timeWaktu epoch setiap saluran fisik (waktu Unix, milidetik yang telah berlalu sejak 1 Januari 1970).
    Ada default ChannelName selain dari saluran fisik.
    Menerapkan Latensi PKLatensi rata-rata dan persentil ke-99 dari latensi aplikasi kunci utama oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_pk_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_pk_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_pk_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_pk_latencyLatensi penerapan kunci utama.
    Menerapkan Latensi Stempel WaktuLatensi rata-rata dan persentil ke-99 dari latensi aplikasi stempel waktu oleh setiap proxy dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_timestamp_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_timestamp_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_timestamp_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_timestamp_latencyLatensi penerapan stempel waktu.
    Tingkat Keberhasilan PermintaanJumlah permintaan yang berhasil diterima per detik oleh setiap proxy, dengan perincian terperinci dari setiap jenis permintaan. Jenis permintaan yang mungkin adalah DescribeCollection, DescribeIndex, GetCollectionStatistics, HasCollection, Search, Query, ShowPartitions, Insert, dll.
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="success"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countJumlah semua jenis permintaan yang diterima
    Tingkat Permintaan GagalJumlah permintaan gagal yang diterima per detik oleh setiap proxy, dengan perincian terperinci dari setiap jenis permintaan. Jenis permintaan yang mungkin adalah DescribeCollection, DescribeIndex, GetCollectionStatistics, HasCollection, Search, Query, ShowPartitions, Insert, dll.
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="fail"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countJumlah semua jenis permintaan yang diterima
    Latensi PermintaanLatensi rata-rata dan persentil ke-99 dari latensi semua jenis permintaan yang diterima oleh setiap proxyp99:
    histogram_quantile(0.99, sum by (le, pod, node_id, function_name) (rate(milvus_proxy_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name) / sum(increase(milvus_proxy_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name)
    milvus_proxy_req_latencyLatensi dari semua jenis permintaan penerimaan
    Tingkat Byte Permintaan Sisipkan/HapusJumlah byte permintaan sisipkan dan hapus yang diterima per detik oleh proxy dalam dua menit terakhir.sum(increase(milvus_proxy_receive_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_receive_bytes_countJumlah permintaan sisipkan dan hapus.
    Kecepatan Pengiriman ByteJumlah byte per detik yang dikirim kembali ke klien ketika setiap proxy merespons permintaan pencarian dan kueri dalam dua menit terakhir.sum(increase(milvus_proxy_send_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_send_bytes_countJumlah byte yang dikirim kembali ke klien ketika setiap proxy merespons permintaan pencarian dan kueri.
    +

    +

    Koordinator root

    + + + + + + + + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Jumlah Simpul ProksiJumlah proxy yang dibuat.sum(milvus_rootcoord_proxy_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_proxy_numJumlah proxy.
    Waktu SinkronisasiJumlah rata-rata, maksimum, dan minimum waktu epoch yang disinkronkan oleh setiap koordinat root di setiap saluran fisik (PChannel).avg(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_sync_epoch_timeWaktu epoch setiap saluran fisik (waktu Unix, milidetik yang telah berlalu sejak 1 Januari 1970).
    Tingkat Permintaan DDLStatus dan jumlah permintaan DDL per detik dalam dua menit terakhir.sum(increase(milvus_rootcoord_ddl_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, function_name)milvus_rootcoord_ddl_req_countJumlah total permintaan DDL termasuk CreateCollection, DescribeCollection, DescribeSegments, HasCollection, ShowCollections, ShowPartitions, dan ShowSegments.
    Latensi Permintaan DDLLatensi rata-rata dan persentil ke-99 latensi permintaan DDL dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, function_name) (rate(milvus_rootcoord_ddl_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_rootcoord_ddl_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name) / sum(increase(milvus_rootcoord_ddl_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name)
    milvus_rootcoord_ddl_req_latencyLatensi semua jenis permintaan DDL.
    Latensi Timetick SinkronisasiLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh root coord untuk menyinkronkan semua cap waktu ke PChannel dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_rootcoord_sync_timetick_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_rootcoord_sync_timetick_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_rootcoord_sync_timetick_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_rootcoord_sync_timetick_latencywaktu yang digunakan oleh root coord untuk menyinkronkan semua cap waktu ke pchannel.
    Tingkat Alokasi IDJumlah ID yang diberikan oleh root coord per detik dalam dua menit terakhir.sum(increase(milvus_rootcoord_id_alloc_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120)milvus_rootcoord_id_alloc_countJumlah akumulasi ID yang diberikan oleh root coord.
    Stempel waktuCap waktu terbaru dari root coord.milvus_rootcoord_timestamp{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestampCap waktu terbaru dari koordinat akar.
    Stempel Waktu TersimpanStempel waktu yang telah ditetapkan sebelumnya yang disimpan oleh root coord di penyimpanan meta.milvus_rootcoord_timestamp_saved{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestamp_savedStempel waktu yang telah ditetapkan sebelumnya yang disimpan oleh root coord di penyimpanan meta.
    Stempel waktu ditetapkan 3 detik sebelumnya. Dan stempel waktu diperbarui dan disimpan dalam penyimpanan meta setiap 50 milidetik.
    Jumlah KoleksiJumlah total koleksi.sum(milvus_rootcoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_collection_numJumlah total koleksi yang ada di Milvus saat ini.
    Partition NumJumlah total partisi.sum(milvus_rootcoord_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_partition_numJumlah total partisi yang ada di Milvus saat ini.
    Jumlah Saluran DMLJumlah total saluran DML.sum(milvus_rootcoord_dml_channel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_dml_channel_numJumlah total saluran DML yang ada di Milvus saat ini.
    Msgstream NumJumlah total msgstream.sum(milvus_rootcoord_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_msgstream_obj_numJumlah total msgstream yang ada di Milvus saat ini.
    Jumlah KredensialJumlah total kredensial.sum(milvus_rootcoord_credential_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_credential_numJumlah total kredensial di Milvus saat ini.
    Penundaan Detak WaktuJumlah waktu tunda tick delay maksimum dari grafik aliran pada semua DataNode dan QueryNode.sum(milvus_rootcoord_time_tick_delay{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_time_tick_delayWaktu tunda tick delay maksimum dari grafik aliran pada setiap DataNode dan QueryNode.
    +

    +

    Koordinator kueri

    + + + + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Jumlah Koleksi yang DimuatJumlah koleksi yang saat ini dimuat ke dalam memori.sum(milvus_querycoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_collection_numJumlah koleksi yang saat ini dimuat oleh Milvus.
    Jumlah Entitas yang DimuatJumlah entitas yang saat ini dimuat ke dalam memori.sum(milvus_querycoord_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_entitiy_numJumlah entitas yang sedang dimuat oleh Milvus.
    Tingkat Permintaan MuatJumlah permintaan beban per detik dalam dua menit terakhir.sum(increase(milvus_querycoord_load_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])120) by (status)milvus_querycoord_load_req_countJumlah akumulasi permintaan beban.
    Tingkat Permintaan RilisJumlah permintaan rilis per detik dalam dua menit terakhir.sum(increase(milvus_querycoord_release_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_querycoord_release_req_countJumlah akumulasi permintaan pelepasan.
    Latensi Permintaan MuatLatensi rata-rata dan persentil ke-99 dari latensi permintaan muat dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_load_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_load_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_load_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_load_latencyWaktu yang digunakan untuk menyelesaikan permintaan muat.
    Latensi Permintaan RilisLatensi rata-rata dan persentil ke-99 dari latensi permintaan rilis dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_release_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_release_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_release_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_release_latencyWaktu yang digunakan untuk menyelesaikan permintaan pelepasan.
    Tugas Sub-BebanJumlah tugas sub beban.sum(milvus_querycoord_child_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_child_task_numJumlah sub tugas beban.
    Sebuah koordinat kueri membagi permintaan muat menjadi beberapa sub tugas muat.
    Tugas Beban IndukJumlah tugas beban induk.sum(milvus_querycoord_parent_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_parent_task_numJumlah sub tugas beban.
    Setiap permintaan beban berhubungan dengan tugas induk dalam antrean tugas.
    Latensi Tugas Sub-MemuatLatensi rata-rata dan persentil ke-99 dari latensi tugas sub-muat dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_child_task_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_child_task_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_child_task_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) namespace"}[2m])))
    milvus_querycoord_child_task_latencyLatensi untuk menyelesaikan tugas sub-beban.
    Jumlah Node KueriJumlah node kueri yang dikelola oleh koordinat kueri.sum(milvus_querycoord_querynode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_querynode_numJumlah node kueri yang dikelola oleh koordinat kueri.
    +

    +

    Node kueri

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Jumlah Koleksi yang DimuatJumlah koleksi yang dimuat ke dalam memori oleh setiap simpul kueri.sum(milvus_querynode_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_collection_numJumlah koleksi yang dimuat oleh setiap node kueri.
    Partition Loaded NumJumlah partisi yang dimuat ke dalam memori oleh setiap simpul kueri.sum(milvus_querynode_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_partition_numJumlah partisi yang dimuat oleh setiap simpul kueri.
    Segmen Dimuat NumJumlah segmen yang dimuat ke dalam memori oleh setiap node kueri.sum(milvus_querynode_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_segment_numJumlah segmen yang dimuat oleh setiap node kueri.
    Jumlah Entitas yang Dapat DiperolehJumlah entitas yang dapat ditanyakan dan dicari pada setiap node kueri.sum(milvus_querynode_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_entity_numJumlah entitas yang dapat di-query dan dapat dicari pada setiap node kueri.
    Saluran Virtual DMLJumlah saluran virtual DML yang ditonton oleh setiap node kueri.sum(milvus_querynode_dml_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_dml_vchannel_numJumlah saluran virtual DML yang ditonton oleh setiap node kueri.
    Saluran Virtual DeltaJumlah saluran delta yang ditonton oleh setiap node kueri.sum(milvus_querynode_delta_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_delta_vchannel_numJumlah saluran delta yang ditonton oleh setiap node kueri.
    Jumlah KonsumenJumlah konsumen di setiap node kueri.sum(milvus_querynode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_consumer_numJumlah konsumen di setiap node kueri.
    Tingkat Permintaan PencarianJumlah total permintaan pencarian dan permintaan kueri yang diterima per detik oleh setiap node kueri dan jumlah permintaan pencarian dan permintaan kueri yang berhasil dalam dua menit terakhir.sum(increase(milvus_querynode_sq_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (query_type, status, pod, node_id)milvus_querynode_sq_req_countJumlah akumulasi permintaan pencarian dan permintaan kueri.
    Latensi Permintaan PencarianLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan dalam permintaan pencarian dan permintaan kueri oleh setiap node kueri dalam dua menit terakhir.
    Panel ini menampilkan latensi permintaan pencarian dan permintaan kueri yang berstatus "sukses" atau "total".
    p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_sq_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_req_latencyLatensi permintaan pencarian dari simpul kueri.
    Pencarian dalam Latensi AntrianLatensi rata-rata dan persentil ke-99 dari latensi permintaan pencarian dan kueri dalam antrean dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_queue_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_queue_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_queue_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_queue_latencyLatensi permintaan pencarian dan kueri yang diterima oleh simpul kueri.
    Latensi Segmen PencarianLatensi rata-rata dan persentil ke-99 dari waktu yang dibutuhkan setiap node kueri untuk mencari dan meminta segmen dalam dua menit terakhir.
    Status segmen dapat disegel atau berkembang.
    p99:
    histogram_quantile(0.99, sum by (le, query_type, segment_state, pod, node_id) (rate(milvus_querynode_sq_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state) / sum(increase(milvus_querynode_sq_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state)
    milvus_querynode_sq_segment_latencyWaktu yang dibutuhkan setiap simpul kueri untuk mencari dan menanyakan setiap segmen.
    Latensi Permintaan SegmenLatensi rata-rata dan persentil ke-99 dari waktu yang dibutuhkan setiap simpul kueri untuk mencari dan meminta di segcore dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_querynode_sq_core_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_core_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_core_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_core_latencyWaktu yang dibutuhkan setiap simpul kueri untuk mencari dan membuat kueri dalam segcore.
    Pencarian Mengurangi LatensiLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap node kueri selama tahap pengurangan pencarian atau kueri dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_reduce_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_reduce_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_reduce_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_reduce_latencyWaktu yang dihabiskan setiap kueri selama tahap pengurangan.
    Latensi Segmen MuatLatensi rata-rata dan persentil ke-99 dari waktu yang dibutuhkan setiap simpul kueri untuk memuat segmen dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_load_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_load_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_load_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketWaktu yang dibutuhkan setiap simpul kueri untuk memuat sebuah segmen.
    Jumlah FlowgraphJumlah flowgraph di setiap node kueri.sum(milvus_querynode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_flowgraph_numJumlah flowgraph di setiap node kueri.
    Panjang Tugas Baca yang Belum TerpecahkanPanjang antrean permintaan baca yang belum terselesaikan di setiap node kueri.sum(milvus_querynode_read_task_unsolved_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_unsolved_lenPanjang antrean permintaan baca yang belum terpecahkan.
    Panjang Tugas Baca SiapPanjang antrian permintaan baca yang akan dieksekusi di setiap node kueri.sum(milvus_querynode_read_task_ready_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_ready_lenPanjang antrean permintaan baca yang akan dieksekusi.
    Jumlah Tugas Baca ParalelJumlah permintaan baca bersamaan yang sedang dieksekusi di setiap node kueri.sum(milvus_querynode_read_task_concurrency{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_concurrencyJumlah permintaan baca bersamaan yang sedang dieksekusi.
    Perkirakan Penggunaan CPUPenggunaan CPU oleh setiap node kueri yang diperkirakan oleh penjadwal.sum(milvus_querynode_estimate_cpu_usage{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_estimate_cpu_usagePenggunaan CPU oleh setiap node kueri yang diperkirakan oleh penjadwal.
    Bila nilainya 100, ini berarti seluruh CPU virtual (vCPU) digunakan.
    Ukuran Grup PencarianJumlah rata-rata dan persentil ke-99 dari ukuran grup pencarian (yaitu jumlah total permintaan pencarian asli dalam permintaan pencarian gabungan yang dieksekusi oleh setiap node kueri) dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketJumlah tugas pencarian asli di antara tugas pencarian gabungan dari bucket yang berbeda (yaitu Ukuran grup pencarian).
    Pencarian NQJumlah rata-rata dan persentil ke-99 dari jumlah kueri (NQ) yang dilakukan saat setiap simpul kueri mengeksekusi permintaan pencarian dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketJumlah kueri (NQ) permintaan pencarian.
    NQ Grup PencarianJumlah rata-rata dan persentil ke-99 dari NQ permintaan pencarian yang digabungkan dan dieksekusi oleh setiap simpul kueri dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_nq_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_nq_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_nq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketNQ permintaan pencarian yang digabungkan dari berbagai bucket.
    Pencarian Top_KJumlah rata-rata dan persentil ke-99 dari Top_K permintaan pencarian yang dieksekusi oleh setiap simpul kueri dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketJumlah Top_K permintaan pencarian.
    Kelompok Pencarian Top_KJumlah rata-rata dan persentil ke-99 dari Top_K permintaan pencarian yang digabungkan dan dieksekusi oleh setiap simpul kueri dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketJumlah Top_K permintaan pencarian yang digabungkan dari berbagai bucket.
    Tingkat Permintaan Baca yang DigusurJumlah permintaan baca yang digusur per detik oleh setiap simpul kueri dalam dua menit terakhir.sum(increase(milvus_querynode_read_evicted_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_querynode_sq_req_countJumlah akumulasi permintaan baca yang digusur oleh simpul kueri karena pembatasan lalu lintas.
    +

    +

    Koordinator data

    + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Data Node NumJumlah node data yang dikelola oleh koordinat data.sum(milvus_datacoord_datanode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_datanode_numJumlah node data yang dikelola oleh koordinat data.
    Jumlah SegmenJumlah semua jenis segmen yang dicatat dalam metadata oleh koordin data.sum(milvus_datacoord_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (segment_state)milvus_datacoord_segment_numJumlah semua jenis segmen yang dicatat dalam metadata menurut koordinat data.
    Jenis-jenis segmen meliputi: jatuh, disiram, disiram, tumbuh, dan disegel.
    Jumlah KoleksiJumlah koleksi yang tercatat dalam metadata menurut koordinat data.sum(milvus_datacoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_collection_numJumlah koleksi yang dicatat dalam metadata menurut koordinat data.
    Baris TersimpanJumlah akumulasi baris data yang valid dan dibuang dalam koordinat data.sum(milvus_datacoord_stored_rows_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_rows_numJumlah akumulasi baris data yang valid dan dibuang dalam koordinat data.
    Tingkat Baris TersimpanJumlah rata-rata baris yang di-flush per detik dalam dua menit terakhir.sum(increase(milvus_datacoord_stored_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_datacoord_stored_rows_countAkumulasi jumlah baris yang di-flush oleh koordinat data.
    Waktu SinkronisasiJumlah rata-rata, maksimum, dan minimum waktu epoch yang disinkronkan oleh koordin data di setiap saluran fisik.avg(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_sync_epoch_timeWaktu epoch setiap saluran fisik (waktu Unix, milidetik yang telah berlalu sejak 1 Januari 1970).
    Ukuran Binlog yang DisimpanUkuran total binlog yang disimpan.sum(milvus_datacoord_stored_binlog_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_binlog_sizeUkuran total binlog yang tersimpan dalam Milvus.
    +

    +

    Simpul data

    + + + + + + + + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Flowgraph NumJumlah objek flowgraph yang berhubungan dengan setiap node data.sum(milvus_datanode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_flowgraph_numJumlah objek flowgraph.
    Setiap pecahan dalam koleksi berhubungan dengan objek flowgraph.
    Tingkat Konsumsi Baris MsgJumlah baris pesan streaming yang dikonsumsi per detik oleh setiap simpul data dalam dua menit terakhir.sum(increase(milvus_datanode_msg_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_msg_rows_countJumlah baris pesan streaming yang dikonsumsi.
    Saat ini, pesan streaming yang dihitung oleh simpul data hanya mencakup pesan penyisipan dan penghapusan.
    Tingkat Ukuran Data FlushUkuran setiap pesan yang dibilas yang direkam per detik oleh setiap simpul data dalam dua menit terakhir.sum(increase(milvus_datanode_flushed_data_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_flushed_data_sizeUkuran dari setiap pesan yang dibilas.
    Saat ini, pesan streaming yang dihitung oleh simpul data hanya mencakup pesan penyisipan dan penghapusan.
    Jumlah KonsumenJumlah konsumen yang dibuat pada setiap simpul data.sum(milvus_datanode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_consumer_numJumlah konsumen yang dibuat pada setiap simpul data.
    Setiap diagram alir berhubungan dengan sebuah konsumen.
    Producer NumJumlah produsen yang dibuat pada setiap simpul data.sum(milvus_datanode_producer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_producer_numJumlah konsumen yang dibuat pada setiap simpul data.
    Setiap pecahan dalam sebuah koleksi berhubungan dengan produsen saluran delta dan produsen saluran timetick.
    Waktu SinkronisasiJumlah rata-rata, maksimum, dan minimum waktu epoch yang disinkronkan oleh setiap simpul data di semua topik fisik.avg(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_sync_epoch_timeWaktu epoch (waktu Unix, milidetik yang telah berlalu sejak 1 Januari 1970.) dari setiap topik fisik pada simpul data.
    Jumlah Segmen yang Tidak DibilasJumlah segmen yang tidak di-flush yang dibuat pada setiap simpul data.sum(milvus_datanode_unflushed_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_unflushed_segment_numJumlah segmen yang tidak di-flush yang dibuat pada setiap simpul data.
    Latensi Penyandian Buffer EncodeLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan untuk meng-encode buffer oleh setiap simpul data dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_encode_buffer_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_encode_buffer_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_encode_buffer_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_encode_buffer_latencyWaktu yang dibutuhkan setiap simpul data untuk menyandikan buffer.
    Menyimpan Latensi DataLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan untuk menulis buffer ke dalam lapisan penyimpanan oleh setiap node data dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_save_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_save_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_save_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_save_latencyWaktu yang dibutuhkan setiap simpul data untuk menulis buffer ke dalam lapisan penyimpanan.
    Laju Pengoperasian Flush (Flush Operate Rate)Berapa kali setiap simpul data mengosongkan buffer per detik dalam dua menit terakhir.sum(increase(milvus_datanode_flush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_buffer_op_countJumlah akumulasi berapa kali simpul data mengisi buffer.
    Tingkat Pengoperasian Flush OtomatisBerapa kali setiap simpul data secara otomatis mengisi buffer per detik dalam dua menit terakhir.sum(increase(milvus_datanode_autoflush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_autoflush_buffer_op_countJumlah akumulasi berapa kali simpul data melakukan flushing otomatis pada buffer.
    Tingkat Permintaan FlushBerapa kali setiap simpul data menerima permintaan flush buffer per detik dalam dua menit terakhir.sum(increase(milvus_datanode_flush_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_req_countJumlah akumulasi berapa kali node data menerima permintaan flush dari koordinat data.
    Latensi PemadatanLatensi rata-rata dan persentil 99 dari waktu yang dibutuhkan setiap node data untuk menjalankan tugas pemadatan dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_compaction_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_compaction_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_compaction_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_compaction_latencyWaktu yang dibutuhkan setiap simpul data untuk menjalankan tugas pemadatan.
    +

    +

    Koordinator indeks

    + + + + + + + + + +
    PanelDeskripsi panelPromQL (bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Tingkat Permintaan IndeksJumlah rata-rata permintaan pembuatan indeks yang diterima per detik dalam dua menit terakhir.sum(increase(milvus_indexcoord_indexreq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_indexcoord_indexreq_countJumlah permintaan pembuatan indeks yang diterima.
    Jumlah Tugas IndeksJumlah semua tugas pengindeksan yang dicatat dalam metadata indeks.sum(milvus_indexcoord_indextask_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (index_task_status)milvus_indexcoord_indextask_countJumlah semua tugas pengindeksan yang dicatat dalam metadata indeks.
    Jumlah Node IndeksJumlah node indeks yang dikelola.sum(milvus_indexcoord_indexnode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_indexcoord_indexnode_numJumlah simpul indeks yang dikelola.
    +

    +

    Simpul indeks

    + + + + + + + + + + + + +
    PanelDeskripsi panelPromQL (Bahasa kueri Prometheus)Metrik Milvus yang digunakanDeskripsi metrik Milvus
    Tingkat Tugas IndeksJumlah rata-rata tugas pembuatan indeks yang diterima oleh setiap simpul indeks per detik dalam dua menit terakhir.sum(increase(milvus_indexnode_index_task_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_indexnode_index_task_countJumlah tugas pembuatan indeks yang diterima.
    Latensi Bidang MuatLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap simpul indeks untuk memuat data bidang segmen setiap kali dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_load_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_load_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_load_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_load_field_latencyWaktu yang digunakan oleh simpul indeks untuk memuat data bidang segmen.
    Latensi Bidang DekodeLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap simpul indeks untuk menyandikan data bidang setiap kali dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_decode_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_decode_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_decode_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_decode_field_latencyWaktu yang digunakan untuk memecahkan kode data lapangan.
    Membangun Latensi IndeksLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap simpul indeks untuk membangun indeks dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_build_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_build_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_build_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_build_index_latencyWaktu yang digunakan untuk membangun indeks.
    Menyandikan Latensi IndeksLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap simpul indeks untuk menyandikan file indeks dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_encode_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_encode_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_encode_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_encode_index_latencyWaktu yang digunakan untuk menyandikan file indeks.
    Simpan Latensi IndeksLatensi rata-rata dan persentil ke-99 dari waktu yang digunakan oleh setiap simpul indeks untuk menyimpan berkas indeks dalam dua menit terakhir.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_save_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_save_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_save_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_save_index_latencyWaktu yang digunakan untuk menyimpan file indeks.
    +

    diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/monitor.json b/localization/v2.5.x/site/id/adminGuide/monitor/monitor.json new file mode 100644 index 000000000..49fcb7f15 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/monitor.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/prometheus-operator/kube-prometheus.git\n$ cd kube-prometheus\n$ kubectl apply --server-side -f manifests/setup\n$ kubectl wait \\\n --for condition=Established \\\n --all CustomResourceDefinition \\\n --namespace=monitoring\n$ kubectl apply -f manifests/\n","kubectl patch clusterrole prometheus-k8s --type=json -p='[{\"op\": \"add\", \"path\": \"/rules/-\", \"value\": {\"apiGroups\": [\"\"], \"resources\": [\"pods\", \"services\", \"endpoints\"], \"verbs\": [\"get\", \"watch\", \"list\"]}}]'\n","$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090\n$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000\n","$ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values\n","$ kubectl get servicemonitor\n","NAME AGE\nmy-release-milvus 54s\n"],"headingContent":"Deploying Monitoring Services on Kubernetes","anchorList":[{"label":"Menerapkan Layanan Pemantauan pada Kubernetes","href":"Deploying-Monitoring-Services-on-Kubernetes","type":1,"isActive":false},{"label":"Memantau metrik dengan Prometheus","href":"Monitor-metrics-with-Prometheus","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menerapkan layanan pemantauan di Kubernetes","href":"Deploy-monitoring-services-on-Kubernetes","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/monitor.md b/localization/v2.5.x/site/id/adminGuide/monitor/monitor.md new file mode 100644 index 000000000..f27ca0f4f --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/monitor.md @@ -0,0 +1,136 @@ +--- +id: monitor.md +title: Menerapkan Layanan Pemantauan +related_key: 'monitor, alert' +summary: >- + Pelajari cara menerapkan layanan pemantauan untuk cluster Milvus menggunakan + Prometheus. +--- +

    Menerapkan Layanan Pemantauan pada Kubernetes

    Topik ini menjelaskan cara menggunakan Prometheus untuk menerapkan layanan pemantauan untuk cluster Milvus di Kubernetes.

    +

    Memantau metrik dengan Prometheus

    Metrik adalah indikator yang menyediakan informasi tentang status berjalannya sistem Anda. Misalnya, dengan metrik, Anda dapat memahami berapa banyak memori atau sumber daya CPU yang dikonsumsi oleh node data di Milvus. Dengan mengetahui kinerja dan status komponen dalam cluster Milvus Anda, Anda akan mendapatkan informasi yang lebih baik sehingga dapat mengambil keputusan yang lebih baik dan menyesuaikan alokasi sumber daya secara lebih tepat waktu.

    +

    Umumnya, metrik disimpan dalam basis data deret waktu (TSDB), seperti Prometheus, dan metrik direkam dengan stempel waktu. Dalam kasus pemantauan layanan Milvus, Anda dapat menggunakan Prometheus untuk menarik data dari titik akhir yang ditetapkan oleh eksportir. Prometheus kemudian mengekspor metrik dari setiap komponen Milvus di http://<component-host>:9091/metrics.

    +

    Namun, Anda mungkin memiliki beberapa replika untuk satu komponen, yang membuat konfigurasi manual Prometheus menjadi terlalu rumit. Oleh karena itu, Anda dapat menggunakan Prometheus Operator, sebuah ekstensi untuk Kubernetes, untuk pengelolaan instance pemantauan Prometheus secara otomatis dan efektif. Menggunakan Prometheus Operator akan menghemat kesulitan Anda dalam menambahkan target metrik dan penyedia layanan secara manual.

    +

    Definisi Sumber Daya Khusus (CRD) ServiceMonitor memungkinkan Anda untuk mendefinisikan secara deklaratif bagaimana sekumpulan layanan dinamis dimonitor. Hal ini juga memungkinkan pemilihan layanan mana yang akan dipantau dengan konfigurasi yang diinginkan menggunakan pilihan label. Dengan Prometheus Operator, Anda dapat memperkenalkan konvensi yang menentukan bagaimana metrik diekspos. Layanan baru dapat secara otomatis ditemukan mengikuti konvensi yang Anda tetapkan tanpa perlu konfigurasi ulang secara manual.

    +

    Gambar berikut mengilustrasikan alur kerja Prometheus.

    +

    + + Prometheus_architecture + Prometheus_architecture

    +

    Prasyarat

    Tutorial ini menggunakan kube-prometheus untuk menyelamatkan Anda dari kesulitan menginstal dan mengonfigurasi secara manual setiap komponen pemantauan dan peringatan.

    +

    Kube-prometheus mengumpulkan manifes Kubernetes, dasbor Grafana, dan aturan Prometheus yang digabungkan dengan dokumentasi dan skrip.

    +

    Sebelum menerapkan layanan pemantauan, Anda perlu membuat tumpukan pemantauan dengan menggunakan konfigurasi di direktori manifes kube-prometheus.

    +
    $ git clone https://github.com/prometheus-operator/kube-prometheus.git
    +$ cd kube-prometheus
    +$ kubectl apply --server-side -f manifests/setup
    +$ kubectl wait \
    +        --for condition=Established \
    +        --all CustomResourceDefinition \
    +        --namespace=monitoring
    +$ kubectl apply -f manifests/
    +
    +
    +Clusterrole prometheus-k8s default tidak dapat menangkap metrik milvus, perlu ditambal:
    +
    kubectl patch clusterrole prometheus-k8s --type=json -p='[{"op": "add", "path": "/rules/-", "value": {"apiGroups": [""], "resources": ["pods", "services", "endpoints"], "verbs": ["get", "watch", "list"]}}]'
    +
    +

    Untuk menghapus stack, jalankan kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup.

    +

    Menerapkan layanan pemantauan di Kubernetes

    1. Mengakses dasbor

    Teruskan layanan Prometheus ke porta 9090, dan layanan Grafana ke porta 3000.

    +
    $ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090
    +$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000
    +
    +

    2. Mengaktifkan ServiceMonitor

    ServiceMonitor tidak diaktifkan untuk Milvus Helm secara default. Setelah menginstal Prometheus Operator di klaster Kubernetes, Anda dapat mengaktifkannya dengan menambahkan parameter metrics.serviceMonitor.enabled=true.

    +
    $ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values
    +
    +

    Ketika instalasi selesai, gunakan kubectl untuk memeriksa sumber daya ServiceMonitor.

    +
    $ kubectl get servicemonitor
    +
    +
    NAME                           AGE
    +my-release-milvus              54s
    +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.json b/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.json new file mode 100644 index 000000000..bb71c0ebc --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus monitoring framework overview","anchorList":[{"label":"Gambaran umum kerangka kerja pemantauan Milvus","href":"Milvus-monitoring-framework-overview","type":1,"isActive":false},{"label":"Prometheus di Milvus","href":"Prometheus-in-Milvus","type":2,"isActive":false},{"label":"Grafana di Milvus","href":"Grafana-in-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.md b/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.md new file mode 100644 index 000000000..5f1e369c2 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/monitor_overview.md @@ -0,0 +1,113 @@ +--- +id: monitor_overview.md +title: Ikhtisar Monitor +related_key: 'monitor, alert' +summary: >- + Pelajari bagaimana Prometheus dan Grafana digunakan di Milvus untuk layanan + montoring dan peringatan. +--- +

    Gambaran umum kerangka kerja pemantauan Milvus

    Topik ini menjelaskan bagaimana Milvus menggunakan Prometheus untuk memantau metrik dan Grafana untuk memvisualisasikan metrik dan membuat peringatan.

    +

    Prometheus di Milvus

    Prometheus adalah perangkat pemantauan dan peringatan sumber terbuka untuk implementasi Kubernetes. Prometheus mengumpulkan dan menyimpan metrik sebagai data deret waktu. Ini berarti bahwa metrik disimpan dengan stempel waktu saat direkam, bersama dengan pasangan nilai-kunci opsional yang disebut label.

    +

    Saat ini Milvus menggunakan komponen-komponen Prometheus berikut ini:

    +
      +
    • Titik akhir Prometheus untuk menarik data dari titik akhir yang ditetapkan oleh eksportir.
    • +
    • Operator Prometheus untuk mengelola instance pemantauan Prometheus secara efektif.
    • +
    • Kube-prometheus untuk menyediakan pemantauan cluster Kubernetes end-to-end yang mudah dioperasikan.
    • +
    +

    Nama metrik

    Nama metrik yang valid di Prometheus berisi tiga elemen: namespace, subsistem, dan nama. Ketiga elemen ini dihubungkan dengan "_".

    +

    Ruang nama metrik Milvus yang dipantau oleh Prometheus adalah "milvus". Bergantung pada peran yang dimiliki metrik, subsistemnya haruslah salah satu dari delapan peran berikut: "rootcoord", "proxy", "querycoord", "querynode", "indexcoord", "indexnode", "datacoord", "datanode".

    +

    Misalnya, metrik Milvus yang menghitung jumlah total vektor yang ditanyakan diberi nama milvus_proxy_search_vectors_count.

    +

    Jenis metrik

    Prometheus mendukung empat jenis metrik:

    +
      +
    • Penghitung: jenis metrik kumulatif yang nilainya hanya dapat bertambah atau disetel ulang ke nol pada saat restart.
    • +
    • Pengukur: jenis metrik yang nilainya bisa naik dan turun.
    • +
    • Histogram: jenis metrik yang dihitung berdasarkan bucket yang dapat dikonfigurasi. Contoh umum adalah durasi permintaan.
    • +
    • Ringkasan: jenis metrik yang mirip dengan histogram yang menghitung kuantil yang dapat dikonfigurasi selama jendela waktu geser.
    • +
    +

    Label metrik

    Prometheus membedakan sampel dengan nama metrik yang sama dengan memberi label. Label adalah atribut tertentu dari sebuah metrik. Metrik dengan nama yang sama harus memiliki nilai yang sama untuk bidang variable_labels. Tabel berikut mencantumkan nama dan arti label umum metrik Milvus.

    + + + + + + + + + + + + + + + + + +
    Nama labelDefinisiNilai
    "node_id"Identitas unik dari sebuah peran.ID unik global yang dihasilkan oleh milvus.
    "status"Status operasi atau permintaan yang sedang diproses."meninggalkan", "sukses", atau "gagal".
    "tipe_query"Jenis permintaan baca."cari" atau "kueri".
    "msg_type"Jenis pesan."masukkan", "hapus", "cari", atau "kueri".
    "segment_state"Status sebuah segmen."Disegel", "Tumbuh", "Memerah", "Pembilasan", "Menjatuhkan", atau "Mengimpor".
    "cache_state"Status objek yang di-cache."hit" atau "miss".
    "cache_name"Nama objek yang ditembolok. Label ini digunakan bersama dengan label "cache_state".Misalnya "CollectionID", "Schema", dll.
    "channel_name"Topik fisik dalam penyimpanan pesan (Pulsar atau Kafka).Contoh: "by-dev-rootcoord-dml_0", "by-dev-rootcoord-dml_255", dsb.
    "nama_fungsi"Nama fungsi yang menangani permintaan tertentu.Misalnya "CreateCollection", "CreatePartition", "CreateIndex", dll.
    "user_name"Nama pengguna yang digunakan untuk autentikasi.Nama pengguna pilihan Anda.
    "index_task_status"Status tugas indeks dalam penyimpanan meta."belum diterbitkan", "sedang dalam proses", "gagal", "selesai", atau "didaur ulang".
    +

    Grafana di Milvus

    Grafana adalah tumpukan visualisasi sumber terbuka yang dapat terhubung dengan semua sumber data. Dengan menarik metrik, Grafana membantu pengguna memahami, menganalisis, dan memantau data yang sangat besar.

    +

    Milvus menggunakan dasbor Grafana yang dapat disesuaikan untuk visualisasi metrik.

    +

    Apa selanjutnya

    Setelah mempelajari alur kerja dasar pemantauan dan peringatan, pelajari:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/visualize.json b/localization/v2.5.x/site/id/adminGuide/monitor/visualize.json new file mode 100644 index 000000000..aaeeef9ad --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/visualize.json @@ -0,0 +1 @@ +{"codeList":["wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json\n"],"headingContent":"Visualize Milvus Metrics in Grafana","anchorList":[{"label":"Memvisualisasikan Metrik Milvus di Grafana","href":"Visualize-Milvus-Metrics-in-Grafana","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Memvisualisasikan metrik menggunakan Grafana","href":"Visualize-metrics-using-Grafana","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/monitor/visualize.md b/localization/v2.5.x/site/id/adminGuide/monitor/visualize.md new file mode 100644 index 000000000..42ee9767e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/monitor/visualize.md @@ -0,0 +1,100 @@ +--- +id: visualize.md +title: Memvisualisasikan Metrik +related_key: 'monitor, alert' +summary: Pelajari cara memvisualisasikan metrik Milvus di Grafana. +--- +

    Memvisualisasikan Metrik Milvus di Grafana

    Topik ini menjelaskan cara memvisualisasikan metrik Milvus menggunakan Grafana.

    +

    Seperti yang dijelaskan dalam panduan pemantauan, metrik berisi informasi yang berguna seperti berapa banyak memori yang digunakan oleh komponen Milvus tertentu. Memantau metrik membantu Anda lebih memahami kinerja Milvus dan status berjalannya sehingga Anda dapat menyesuaikan alokasi sumber daya secara tepat waktu.

    +

    Visualisasi adalah grafik yang menunjukkan perubahan penggunaan sumber daya dari waktu ke waktu, yang memudahkan Anda untuk melihat dan mengetahui perubahan penggunaan sumber daya dengan cepat, terutama ketika suatu peristiwa terjadi.

    +

    Tutorial ini menggunakan Grafana, sebuah platform sumber terbuka untuk analisis deret waktu, untuk memvisualisasikan berbagai metrik kinerja cluster Milvus yang digunakan di Kubernetes (K8).

    +

    Prasyarat

      +
    • Anda telah menginstal cluster Milvus pada K8s).
    • +
    • Anda perlu mengonfigurasi Prometheus untuk memantau dan mengumpulkan metrik sebelum menggunakan Grafana untuk memvisualisasikan metrik. Jika pengaturan berhasil, Anda dapat mengakses Grafana di http://localhost:3000. Atau Anda juga dapat mengakses Grafana menggunakan Grafana default user:password dari admin:admin.
    • +
    +

    Memvisualisasikan metrik menggunakan Grafana

    1. Unduh dan impor dasbor

    Unduh dan impor dasbor Milvus dari file JSON.

    +
    wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json
    +
    +

    + + Download_and_import + Unduh_dan_impor

    +

    2. Melihat metrik

    Pilih instance Milvus yang ingin Anda pantau. Kemudian Anda dapat melihat panel komponen Milvus.

    +

    + + Select_instance + Pilih instance

    +

    + + Grafana_panel + Grafana_panel

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/object_storage_operator.json b/localization/v2.5.x/site/id/adminGuide/object_storage_operator.json new file mode 100644 index 000000000..a8d1bbce5 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/object_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n storage:\n inCluster:\n values:\n mode: standalone\n resources:\n requests:\n memory: 100Mi\n deletionPolicy: Delete # Delete | Retain, default: Retain\n pvcDeletion: true # default: false\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-s3-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n # your bucket name\n bucketName: \n # Optional, config the prefix of the bucket milvus will use\n rootPath: milvus/my-release\n useSSL: true\n dependencies:\n storage:\n # enable external object storage\n external: true\n type: S3 # MinIO | S3\n # the endpoint of AWS S3\n endpoint: s3.amazonaws.com:443\n # the secret storing the access key and secret key\n secretRef: \"my-release-s3-secret\"\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n eks.amazonaws.com/role-arn: \n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n # enable AssumeRole\n useIAM: true\n # Omit other fields ...\n dependencies:\n storage:\n # Omit other fields ...\n # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect\n endpoint: s3..amazonaws.com:443\n secretRef: \"\" # we don't need to specify the secret here\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-gcp-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n cloudProvider: gcp\n dependencies:\n storage:\n # Omit other fields ...\n endpoint: storage.googleapis.com:443\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n iam.gke.io/gcp-service-account: \n","labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n cloudProvider: gcp\n # enable AssumeRole\n useIAM: true\n # Omit other fields ... \n"],"headingContent":"Configure Object Storage with Milvus Operator","anchorList":[{"label":"Mengkonfigurasi Penyimpanan Objek dengan Operator Milvus","href":"Configure-Object-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Mengkonfigurasi penyimpanan objek","href":"Configure-object-storage","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/object_storage_operator.md b/localization/v2.5.x/site/id/adminGuide/object_storage_operator.md new file mode 100644 index 000000000..4d64b7b03 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/object_storage_operator.md @@ -0,0 +1,230 @@ +--- +id: object_storage_operator.md +title: Mengkonfigurasi Penyimpanan Objek dengan Operator Milvus +related_key: 'minio, s3, storage, etcd, pulsar' +summary: Pelajari cara mengonfigurasi penyimpanan objek dengan Milvus Operator. +--- +

    Mengkonfigurasi Penyimpanan Objek dengan Operator Milvus

    Milvus menggunakan MinIO atau S3 sebagai penyimpanan objek untuk menyimpan berkas berskala besar, seperti berkas indeks dan log biner. Topik ini memperkenalkan cara mengonfigurasi ketergantungan penyimpanan objek ketika Anda menginstal Milvus dengan Milvus Operator. Untuk detail lebih lanjut, lihat Mengonfigurasi Penyimpanan Objek dengan Milvus Operator di repositori Milvus Operator.

    +

    Topik ini mengasumsikan bahwa Anda telah men-deploy Milvus Operator.

    +
    Lihat Menerapkan Milvus Operator untuk informasi lebih lanjut.
    +

    Anda perlu menentukan file konfigurasi untuk menggunakan Milvus Operator untuk memulai cluster Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Anda hanya perlu mengedit template kode di milvus_cluster_default.yaml untuk mengonfigurasi dependensi pihak ketiga. Bagian berikut ini memperkenalkan cara mengonfigurasi penyimpanan objek, etcd, dan Pulsar.

    +

    Mengkonfigurasi penyimpanan objek

    Milvus cluster menggunakan MinIO atau S3 sebagai penyimpanan objek untuk menyimpan berkas-berkas berskala besar, seperti berkas indeks dan log biner. Tambahkan bidang yang diperlukan di bawah spec.dependencies.storage untuk mengonfigurasi penyimpanan objek, opsi yang memungkinkan adalah external dan inCluster.

    +

    Penyimpanan objek internal

    Secara default, Operator Milvus menggunakan MinIO dalam cluster untuk Milvus. Berikut ini adalah contoh konfigurasi untuk mendemonstrasikan bagaimana menggunakan MinIO ini sebagai penyimpanan objek internal.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    storage:
    +      inCluster:
    +        values:
    +          mode: standalone
    +          resources:
    +            requests:
    +              memory: 100Mi
    +        deletionPolicy: Delete # Delete | Retain, default: Retain
    +        pvcDeletion: true # default: false
    +
    +

    Setelah konfigurasi di atas diterapkan, MinIO in-cluster akan berjalan dalam mode mandiri dengan batas memori hingga 100Mi. Perhatikan bahwa

    +
      +
    • Kolom deletionPolicy menentukan kebijakan penghapusan MinIO dalam cluster. Secara default adalah Delete dan memiliki Retain sebagai opsi alternatif.

      +
        +
      • Delete mengindikasikan bahwa penyimpanan objek dalam klaster akan dihapus ketika Anda menghentikan instans Milvus.
      • +
      • Retain mengindikasikan bahwa penyimpanan objek dalam cluster dipertahankan sebagai layanan ketergantungan untuk startup berikutnya dari instans Milvus Anda.
      • +
    • +
    • Kolom pvcDeletion menentukan apakah akan menghapus PVC (Persistent Volume Claim) ketika MinIO dalam cluster dihapus.

    • +
    +

    Kolom di bawah inCluster.values sama dengan yang ada di Milvus Helm Chart, dan Anda dapat menemukannya di sini.

    +

    Penyimpanan objek eksternal

    Menggunakan external dalam file YAML template menunjukkan penggunaan layanan penyimpanan objek eksternal. Untuk menggunakan penyimpanan objek eksternal, Anda perlu mengatur bidang dengan benar di bawah spec.dependencies.storage dan spec.config.minio di Milvus CRD.

    +

    Menggunakan Amazon Web Service (AWS) S3 sebagai penyimpanan objek eksternal

      +
    • Mengonfigurasi Akses AWS S3 dengan AK/SK

      +

      Bucket S3 biasanya dapat diakses dengan sepasang kunci akses dan kunci rahasia akses. Anda dapat membuat objek Secret untuk menyimpannya di Kubernetes Anda sebagai berikut:

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-s3-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      Kemudian Anda dapat mengonfigurasi AWS S3 bucket sebagai penyimpanan objek eksternal:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      # your bucket name
      +      bucketName: <my-bucket>
      +      # Optional, config the prefix of the bucket milvus will use
      +      rootPath: milvus/my-release
      +      useSSL: true
      +  dependencies:
      +    storage:
      +      # enable external object storage
      +      external: true
      +      type: S3 # MinIO | S3
      +      # the endpoint of AWS S3
      +      endpoint: s3.amazonaws.com:443
      +      # the secret storing the access key and secret key
      +      secretRef: "my-release-s3-secret"
      +
    • +
    • Mengonfigurasi Akses AWS S3 dengan AssumeRole

      +

      Sebagai alternatif, Anda dapat membuat Milvus mengakses bucket AWS S3 Anda menggunakan AssumeRole, sehingga hanya kredensial sementara yang dilibatkan, bukan AK/SK Anda yang sebenarnya.

      +

      Jika ini yang Anda inginkan, Anda perlu menyiapkan role di konsol AWS Anda dan mendapatkan ARN-nya, yang biasanya dalam bentuk arn:aws:iam::<your account id>:role/<role-name>.

      +

      Kemudian buatlah objek ServiceAccount untuk menyimpannya di Kubernetes Anda sebagai berikut:

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    eks.amazonaws.com/role-arn: <my-role-arn>
      +
      +

      Setelah semuanya siap, rujuk ServiceAccount di atas pada berkas YAML template, dan setel spec.config.minio.useIAM ke true untuk mengaktifkan AssumeRole.

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect
      +      endpoint: s3.<my-bucket-region>.amazonaws.com:443
      +      secretRef: "" # we don't need to specify the secret here
      +
    • +
    +

    Gunakan Google Cloud Storage (GCS) sebagai penyimpanan objek eksternal

    Penyimpanan objek AWS S3 bukan satu-satunya pilihan. Anda juga dapat menggunakan layanan penyimpanan objek dari penyedia cloud publik lainnya, seperti Google Cloud.

    +
      +
    • Konfigurasikan Akses GCS dengan AK/SK

      +

      Konfigurasinya sebagian besar mirip dengan menggunakan AWS S3. Anda masih perlu membuat objek Secret untuk menyimpan kredensial Anda di Kubernetes.

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-gcp-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      Kemudian, Anda hanya perlu mengubah endpoint menjadi storage.googleapis.com:443 dan mengatur spec.config.minio.cloudProvider menjadi gcp sebagai berikut:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      endpoint: storage.googleapis.com:443
      +
    • +
    • Mengonfigurasi Akses GCS dengan AssumeRole

      +

      Mirip dengan AWS S3, Anda juga dapat menggunakan Workload Identity untuk mengakses GCS dengan kredensial sementara jika Anda menggunakan GKE sebagai cluster Kubernetes Anda.

      +

      Penjelasan pada ServiceAccount berbeda dengan penjelasan pada AWS EKS. Anda perlu menentukan nama akun layanan GCP, bukan ARN peran.

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    iam.gke.io/gcp-service-account: <my-gcp-service-account-name>
      +
      +

      Kemudian, Anda dapat mengonfigurasi instans Milvus Anda untuk menggunakan ServiceAccount di atas dan mengaktifkan AssumeRole dengan mengatur spec.config.minio.useIAM ke true sebagai berikut:

      +
      labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...  
      +
    • +
    +

    Apa selanjutnya

    Pelajari cara mengonfigurasi dependensi Milvus lainnya dengan Milvus Operator:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/privilege_group.json b/localization/v2.5.x/site/id/adminGuide/privilege_group.json new file mode 100644 index 000000000..6ad2e6808 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/privilege_group.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\nclient.create_privileg_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​\n​\nclient.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.CreatePrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​\n\n","import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​\n​\nclient.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Arrays.asList(\"Query\", \"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.AddPrivilegesToGroup(context.Background(), \"privilege_group_1\", []string{\"Query\", \"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Query\", \"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​\n\n","import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​\n​\nclient.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Collections.singletonList(\"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.RemovePrivilegesFromGroup(context.Background(), \"privilege_group_1\", []string{\"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.list_privilege_groups()​\n\n","import io.milvus.v2.service.rbac.PrivilegeGroup;​\nimport io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​\nimport io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​\n​\nListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​\n .build());​\nList groups = resp.getPrivilegeGroups();​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.ListPrivilegeGroups(context.Background())​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","PrivilegeGroupItem: , ​\n\n","from pymilvus import MilvusClient​\nclient.drop_privilege_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​\n​\nclient.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.DropPrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n"],"headingContent":"Create Privilege Group​","anchorList":[{"label":"Membuat Grup Hak Istimewa","href":"Create-Privilege-Group​","type":1,"isActive":false},{"label":"Grup hak istimewa vs hak istimewa","href":"Privilege-group-vs-privileges​","type":2,"isActive":false},{"label":"Grup hak istimewa bawaan","href":"Built-in-privilege-groups​","type":2,"isActive":false},{"label":"Prosedur","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/privilege_group.md b/localization/v2.5.x/site/id/adminGuide/privilege_group.md new file mode 100644 index 000000000..287e67c0a --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/privilege_group.md @@ -0,0 +1,491 @@ +--- +id: privilege_group.md +related_key: enable RBAC +summary: >- + Untuk menyederhanakan proses pemberian hak istimewa, Anda disarankan untuk + menggabungkan beberapa hak istimewa ke dalam grup hak istimewa. +title: Membuat Grup Hak Istimewa +--- +

    Membuat Grup Hak Istimewa

    Untuk menyederhanakan proses pemberian hak istimewa, Anda disarankan untuk menggabungkan beberapa hak istimewa ke dalam grup hak istimewa.

    +

    Grup hak istimewa vs hak istimewa

    Grup hak istimewa terdiri dari beberapa hak istimewa.

    +

    + + Privilege group illustrated + Ilustrasi grup hak istimewa

    +

    Seperti yang ditunjukkan pada gambar di atas, misalkan Anda perlu memberikan tiga hak istimewa yang berbeda pada sebuah peran.

    +
      +
    • Jika Anda tidak menggunakan grup hak istimewa, Anda perlu memberikan hak istimewa tiga kali.

    • +
    • Jika Anda menggunakan grup hak istimewa, Anda hanya perlu membuat grup hak istimewa dan menambahkan tiga hak istimewa ke grup hak istimewa ini dan memberikan grup hak istimewa tersebut ke Role A.

    • +
    +

    Dengan menggunakan grup hak istimewa, Anda dapat memberikan beberapa hak istimewa secara massal ke sebuah peran.

    +

    Grup hak istimewa bawaan

    Untuk kemudahan penggunaan, Milvus menyediakan total 9 hak istimewa bawaan di tingkat koleksi, basis data, dan instance: COLL_RO, COLL_RW, COLL_ADMIN, DB_RO, DB_RW, DB_Admin, Cluster_RO, Cluster_RW, dan Cluster_Admin.

    +
    +

    Tiga tingkat grup hak istimewa bawaan tidak memiliki hubungan berjenjang. Menetapkan grup hak istimewa pada tingkat instance tidak secara otomatis menetapkan izin untuk semua database dan koleksi di bawah instance tersebut. Hak istimewa di tingkat database dan koleksi perlu diatur secara manual.

    +
    +

    Tabel berikut ini menjelaskan hak istimewa yang disertakan dalam setiap grup hak istimewa bawaan.

    +

    Tingkat koleksi

      +
    • COLL_RO: mencakup hak istimewa untuk membaca data koleksi

    • +
    • COLL_RW: mencakup hak istimewa untuk membaca dan menulis data koleksi

    • +
    • COLL_ADMIN: mencakup hak istimewa untuk membaca dan menulis data koleksi dan mengelola koleksi.

    • +
    +

    Tabel di bawah ini mencantumkan hak istimewa khusus yang termasuk dalam tiga kelompok hak istimewa bawaan pada tingkat koleksi.

    +

    **Hak Istimewa**

    +

    ** KoleksiBacaSaja**

    +

    ** KoleksiBacaTulis**

    +

    **CollectionAdmin** (Admin Koleksi)

    +

    Permintaan

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    Pencarian

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    IndexDetail

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetFlushState

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetLoadState

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetLoadingProgress

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    MemilikiPartisi

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    TampilkanPartisi

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    DaftarAliases

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    JelaskanKoleksi

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    JelaskanAlias

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetStatistics

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    CreateIndex

    +

    +

    ✔️

    +

    ✔️

    +

    DropIndex

    +

    +

    ✔️

    +

    ✔️

    +

    BuatPartisi

    +

    +

    ✔️

    +

    ✔️

    +

    JatuhkanPartisi

    +

    +

    ✔️

    +

    ✔️

    +

    Memuat

    +

    +

    ✔️

    +

    ✔️

    +

    Lepaskan

    +

    +

    ✔️

    +

    ✔️

    +

    Sisipkan

    +

    +

    ✔️

    +

    ✔️

    +

    Menghapus

    +

    +

    ✔️

    +

    ✔️

    +

    Upsert

    +

    +

    ✔️

    +

    ✔️

    +

    Impor

    +

    +

    ✔️

    +

    ✔️

    +

    Siram

    +

    +

    ✔️

    +

    ✔️

    +

    Pemadatan

    +

    +

    ✔️

    +

    ✔️

    +

    Keseimbangan Beban

    +

    +

    ✔️

    +

    ✔️

    +

    BuatAlias

    +

    +

    +

    ✔️

    +

    DropAlias

    +

    +

    +

    ✔️

    +
    +

    Tingkat basis data

      +
    • DB_RO: mencakup hak istimewa untuk membaca data basis data

    • +
    • DB_RW: mencakup hak istimewa untuk membaca dan menulis data basis data

    • +
    • DB_Admin: mencakup hak istimewa untuk membaca dan menulis data basis data dan mengelola basis data.

    • +
    +

    Tabel di bawah ini mencantumkan hak istimewa khusus yang termasuk dalam tiga kelompok hak istimewa bawaan pada tingkat basis data.

    +

    **Hak Istimewa**

    +

    **BacaBasisDataSaja**

    +

    ** DatabaseBacaTulis**

    +

    **DatabaseAdmin**

    +

    TampilkanKoleksi

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    JelaskanDatabase

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    MembuatKoleksi

    +

    +

    +

    ✔️

    +

    DropCollection

    +

    +

    +

    ✔️

    +

    AlterDatabase

    +

    +

    ✔️

    +

    ✔️

    +
    +

    Tingkat cluster

      +
    • Cluster_RO: termasuk hak istimewa untuk membaca data instnace

    • +
    • Cluster_RW: termasuk hak istimewa untuk membaca dan menulis data instance

    • +
    • Cluster_Admin: mencakup hak istimewa untuk membaca dan menulis data instans dan mengelola instans.

    • +
    +

    Tabel di bawah ini mencantumkan hak istimewa spesifik yang termasuk dalam tiga grup hak istimewa bawaan di tingkat instance.

    +

    **Hak Istimewa**

    +

    **ClusterReadOnly**

    +

    ** ClusterBacaTulis**

    +

    **ClusterAdmin**

    +

    DaftarDatabase

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    Ganti NamaKoleksi

    +

    +

    +

    ✔️

    +

    BuatKepemilikan

    +

    +

    +

    ✔️

    +

    PerbaruiPengguna

    +

    +

    +

    ✔️

    +

    JatuhkanKepemilikan

    +

    +

    +

    ✔️

    +

    PilihKepemilikan

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    KelolaKepemilikan

    +

    +

    +

    ✔️

    +

    PilihPengguna

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    BackupRBAC

    +

    +

    +

    ✔️

    +

    PulihkanRBAC

    +

    +

    +

    ✔️

    +

    Membuat Grup Sumber Daya

    +

    +

    +

    ✔️

    +

    Menghapus Grup Sumber Daya

    +

    +

    +

    ✔️

    +

    Perbarui Grup Sumber Daya

    +

    +

    ✔️

    +

    ✔️

    +

    JelaskanKelompokSumberDaya

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    DaftarKelompokSumberDaya

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    TransferNode

    +

    +

    ✔️

    +

    ✔️

    +

    TransferReplika

    +

    +

    ✔️

    +

    ✔️

    +

    MembuatDatabase

    +

    +

    +

    ✔️

    +

    DropDatabase

    +

    +

    +

    ✔️

    +

    FlushAll

    +

    +

    ✔️

    +

    ✔️

    +

    BuatKelompokHakKhusus

    +

    +

    +

    ✔️

    +

    HapusKeistimewaanGrup

    +

    +

    +

    ✔️

    +

    DaftarKelompokHakKhusus

    +

    +

    +

    ✔️

    +

    OperatePrivilegeGroup

    +

    +

    +

    ✔️

    +
    +

    Prosedur

    Anda dapat membuat grup hak istimewa dan kemudian menambahkan hak istimewa ke grup hak istimewa.

    +

    Membuat grup hak istimewa

    Contoh berikut ini menunjukkan cara membuat grup hak istimewa bernama privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.create_privileg_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​
    +​
    +client.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.CreatePrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    +

    Menambahkan hak istimewa ke grup hak istimewa

    Contoh berikut menunjukkan cara menambahkan hak istimewa PrivilegeBackupRBAC dan PrivilegeRestoreRBAC ke grup hak istimewa privilege_group_1 yang baru saja dibuat.

    + +
    from pymilvus import MilvusClient​
    +client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​
    +​
    +client.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Arrays.asList("Query", "Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.AddPrivilegesToGroup(context.Background(), "privilege_group_1", []string{"Query", "Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Query", "Search"]​
    +}'​
    +
    +
    +

    Menghapus hak istimewa dari grup hak istimewa

    Contoh berikut menunjukkan cara menghapus hak istimewa PrivilegeRestoreRBAC dari grup hak istimewa privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​
    +​
    +client.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Collections.singletonList("Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.RemovePrivilegesFromGroup(context.Background(), "privilege_group_1", []string{"Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Search"]​
    +}'​
    +
    +
    +

    Membuat daftar grup hak istimewa

    Contoh berikut ini menunjukkan cara membuat daftar semua grup hak istimewa yang ada.

    + +
    from pymilvus import MilvusClient​
    +client.list_privilege_groups()​
    +
    +
    +
    import io.milvus.v2.service.rbac.PrivilegeGroup;​
    +import io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​
    +import io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​
    +​
    +ListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​
    +        .build());​
    +List<PrivilegeGroup> groups = resp.getPrivilegeGroups();​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.ListPrivilegeGroups(context.Background())​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran.

    +
    PrivilegeGroupItem: <privilege_group:privilege_group_1>, <privileges:('Search', 'Query')>​
    +
    +
    +

    Menghapus grup hak istimewa

    Contoh berikut ini menunjukkan cara menghapus grup hak istimewa privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.drop_privilege_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​
    +​
    +client.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.DropPrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/rbac.json b/localization/v2.5.x/site/id/adminGuide/rbac.json new file mode 100644 index 000000000..e60c948e3 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/rbac.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"RBAC Explained​","anchorList":[{"label":"Penjelasan RBAC","href":"RBAC-Explained​","type":1,"isActive":false},{"label":"Konsep-konsep utama RBAC","href":"RBAC-key-concepts​","type":2,"isActive":false},{"label":"Prosedur","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/rbac.md b/localization/v2.5.x/site/id/adminGuide/rbac.md new file mode 100644 index 000000000..e22559a4f --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/rbac.md @@ -0,0 +1,78 @@ +--- +id: rbac.md +related_key: enable RBAC +summary: >- + RBAC (Role-Based Access Control) adalah metode kontrol akses berdasarkan + peran. Dengan RBAC, Anda dapat mengontrol dengan baik operasi yang dapat + dilakukan pengguna di tingkat koleksi, basis data, dan instance, sehingga + meningkatkan keamanan data. +title: Penjelasan RBAC +--- +

    Penjelasan RBAC

    RBAC (Role-Based Access Control) adalah metode kontrol akses berdasarkan peran. Dengan RBAC, Anda dapat mengontrol dengan baik operasi yang dapat dilakukan pengguna di tingkat koleksi, basis data, dan instance, sehingga meningkatkan keamanan data.

    +

    Tidak seperti model kontrol akses pengguna tradisional, RBAC memperkenalkan konsep peran. Dalam model RBAC, Anda memberikan hak istimewa pada peran dan kemudian memberikan peran tersebut kepada pengguna. Kemudian pengguna dapat memperoleh hak istimewa.

    +

    Model RBAC dapat meningkatkan efisiensi manajemen kontrol akses. Misalnya, jika beberapa pengguna memerlukan serangkaian hak istimewa yang sama, Anda tidak perlu mengatur hak istimewa secara manual untuk setiap pengguna. Sebagai gantinya, Anda bisa membuat peran dan menetapkan peran tersebut kepada pengguna. Jika Anda ingin menyesuaikan hak istimewa pengguna ini, Anda cukup menyesuaikan hak istimewa peran dan modifikasi akan diterapkan ke semua pengguna dengan peran ini.

    +

    Konsep-konsep utama RBAC

    + + Users, roles, and privileges + Pengguna, peran, dan hak istimewa

    +

    Ada empat komponen utama dalam model RBAC.

    +
      +
    • **Sumber daya: **Entitas sumber daya yang dapat diakses. Ada tiga tingkat sumber daya di Milvus - contoh, basis data, dan koleksi.

    • +
    • **Privilege: **Izin untuk melakukan operasi tertentu pada sumber daya Milvus (misalnya, membuat koleksi, menyisipkan data, dll).

    • +
    • **Kelompok hak istimewa: **Sekelompok beberapa hak istimewa.

    • +
    • **Peran: **Peran terdiri dari dua bagian - hak istimewa dan sumber daya. Privilege menentukan jenis operasi yang dapat dilakukan oleh role, sedangkan resource menentukan sumber daya target tempat operasi dapat dilakukan. Sebagai contoh, role administrator database dapat melakukan operasi membaca, menulis, dan mengelola database tertentu.

    • +
    • **Pengguna: **Pengguna adalah seseorang yang menggunakan Milvus. Setiap pengguna memiliki ID unik dan diberikan sebuah peran atau beberapa peran.

    • +
    +

    Prosedur

    Untuk mencapai kontrol akses melalui RBAC, anda perlu mengikuti langkah-langkah di bawah ini.

    +
      +
    1. Membuat pengguna: Selain pengguna default root di Milvus, Anda dapat membuat pengguna baru dan mengatur kata sandi untuk melindungi keamanan data.

    2. +
    3. Membuat peran: Anda dapat membuat peran yang disesuaikan berdasarkan kebutuhan Anda. Kemampuan spesifik peran ditentukan oleh hak istimewanya.

    4. +
    5. Membuat grup hak istimewa: Gabungkan beberapa hak istimewa ke dalam satu grup hak istimewa untuk menyederhanakan proses pemberian hak istimewa pada suatu peran.

    6. +
    7. Memberikan hak istimewa atau grup hak istimewa ke suatu peran: Tentukan kemampuan peran dengan memberikan hak istimewa atau grup hak istimewa ke peran ini.

    8. +
    9. Memberikan peran kepada pengguna: Memberikan peran dengan hak istimewa tertentu kepada pengguna sehingga pengguna dapat memiliki hak istimewa peran. Satu peran dapat diberikan kepada beberapa pengguna.

    10. +
    diff --git a/localization/v2.5.x/site/id/adminGuide/resource_group.json b/localization/v2.5.x/site/id/adminGuide/resource_group.json new file mode 100644 index 000000000..1c32870a9 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/resource_group.json @@ -0,0 +1 @@ +{"codeList":["{\n \"requests\": { \"nodeNum\": 1 },\n \"limits\": { \"nodeNum\": 1 },\n \"transfer_from\": [{ \"resource_group\": \"rg1\" }],\n \"transfer_to\": [{ \"resource_group\": \"rg2\" }]\n}\n","import pymilvus\n\n# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).\nname = \"rg\"\nnode_num = 0\n\n# create a resource group that exactly hold no query node.\ntry:\n utility.create_resource_group(name, config=utility.ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n ), using='default')\n print(f\"Succeeded in creating resource group {name}.\")\nexcept Exception:\n print(\"Failed to create the resource group.\")\n","rgs = utility.list_resource_groups(using='default')\nprint(f\"Resource group list: {rgs}\")\n\n# Resource group list: ['__default_resource_group', 'rg']\n","info = utility.describe_resource_group(name, using=\"default\")\nprint(f\"Resource group description: {info}\")\n\n# Resource group description: \n# , // string, rg name\n# , // int, num_node which has been transfer to this rg\n# , // int, available node_num, some node may shutdown\n# , // map[string]int, from collection_name to loaded replica of each collecion in this rg\n# , // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg \n# . // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg\n","source = '__default_resource_group'\ntarget = 'rg'\nexpected_num_nodes_in_default = 0\nexpected_num_nodes_in_rg = 1\n\ntry:\n utility.update_resource_groups({\n source: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_default},\n limits={\"node_num\": expected_num_nodes_in_default},\n ),\n target: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_rg},\n limits={\"node_num\": expected_num_nodes_in_rg},\n )\n }, using=\"default\")\n print(f\"Succeeded in move 1 node(s) from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving nodes.\")\n\n# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.\n","from pymilvus import Collection\n\ncollection = Collection('demo')\n\n# Milvus loads the collection to the default resource group.\ncollection.load(replica_number=2)\n\n# Or, you can ask Milvus load the collection to the desired resource group.\n# make sure that query nodes num should be greater or equal to replica_number\nresource_groups = ['rg']\ncollection.load(replica_number=2, _resource_groups=resource_groups) \n","collection = Collection(\"Books\")\n\n# Use the load method of a collection to load one of its partition\ncollection.load([\"Novels\"], replica_number=2, _resource_groups=resource_groups)\n\n# Or, you can use the load method of a partition directly\npartition = Partition(collection, \"Novels\")\npartition.load(replica_number=2, _resource_groups=resource_groups)\n","source = '__default_resource_group'\ntarget = 'rg'\ncollection_name = 'c'\nnum_replicas = 1\n\ntry:\n utility.transfer_replica(source, target, collection_name, num_replicas, using=\"default\")\n print(f\"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving replicas.\")\n\n# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.\n","try:\n utility.update_resource_groups({\n \"rg\": utility.ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n ),\n }, using=\"default\")\n utility.drop_resource_group(\"rg\", using=\"default\")\n print(f\"Succeeded in dropping {source}.\")\nexcept Exception:\n print(f\"Something went wrong while dropping {source}.\")\n","from pymilvus import utility\nfrom pymilvus.client.types import ResourceGroupConfig\n\n_PENDING_NODES_RESOURCE_GROUP=\"__pending_nodes\"\n\ndef init_cluster(node_num: int):\n print(f\"Init cluster with {node_num} nodes, all nodes will be put in default resource group\")\n # create a pending resource group, which can used to hold the pending nodes that do not hold any data.\n utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(\n requests={\"node_num\": 0}, # this resource group can hold 0 nodes, no data will be load on it.\n limits={\"node_num\": 10000}, # this resource group can hold at most 10000 nodes \n ))\n\n # update default resource group, which can used to hold the nodes that all initial node in it.\n utility.update_resource_groups({\n \"__default_resource_group\": ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.\n )})\n utility.create_resource_group(name=\"rg1\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n utility.create_resource_group(name=\"rg2\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n\ninit_cluster(1)\n","\ndef scale_to(node_num: int):\n # scale the querynode number in Milvus into node_num.\n pass\n","# scale rg1 into 3 nodes, rg2 into 1 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 3},\n limits={\"node_num\": 3},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n \"rg2\": ResourceGroupConfig(\n requests={\"node_num\": 1},\n limits={\"node_num\": 1},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\nscale_to(5)\n# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.\n","# scale rg1 from 3 nodes into 2 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 2},\n limits={\"node_num\": 2},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\n\n# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.\nscale_to(4)\n# scale the node in __pending_nodes\n"],"headingContent":"Manage Resource Groups","anchorList":[{"label":"Mengelola Grup Sumber Daya","href":"Manage-Resource-Groups","type":1,"isActive":false},{"label":"Apa yang dimaksud dengan grup sumber daya","href":"What-is-a-resource-group","type":2,"isActive":false},{"label":"Konsep kelompok sumber daya","href":"Concepts-of-resource-group","type":2,"isActive":false},{"label":"Gunakan api deklaratif untuk mengelola kelompok sumber daya","href":"Use-declarative-api-to-manage-resource-group","type":2,"isActive":false},{"label":"Praktik yang baik untuk mengelola penskalaan cluster","href":"A-good-practice-to-manage-cluster-scaling","type":2,"isActive":false},{"label":"Bagaimana kelompok sumber daya berinteraksi dengan beberapa replika","href":"How-resource-groups-interacts-with-multiple-replicas","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/resource_group.md b/localization/v2.5.x/site/id/adminGuide/resource_group.md new file mode 100644 index 000000000..2aa1bd2f1 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/resource_group.md @@ -0,0 +1,353 @@ +--- +id: resource_group.md +related_key: Manage Resource Groups +summary: Pelajari cara mengelola grup sumber daya. +title: Mengelola Grup Sumber Daya +--- +

    Mengelola Grup Sumber Daya

    Di Milvus, Anda dapat menggunakan grup sumber daya untuk mengisolasi secara fisik node kueri tertentu dari yang lain. Panduan ini memandu Anda tentang cara membuat dan mengelola grup sumber daya khusus serta mentransfer node di antara mereka.

    +

    Apa yang dimaksud dengan grup sumber daya

    Grup sumber daya dapat menampung beberapa atau semua node kueri dalam cluster Milvus. Anda dapat menentukan bagaimana Anda ingin mengalokasikan node kueri di antara kelompok sumber daya berdasarkan apa yang paling masuk akal bagi Anda. Sebagai contoh, dalam skenario multi-koleksi, Anda dapat mengalokasikan jumlah node kueri yang sesuai untuk setiap kelompok sumber daya dan memuat koleksi ke dalam kelompok sumber daya yang berbeda, sehingga operasi di dalam setiap koleksi secara fisik tidak bergantung pada koleksi lain.

    +

    Perhatikan bahwa sebuah instance Milvus mempertahankan sebuah grup sumber daya default untuk menampung semua node kueri pada saat start-up dan menamainya dengan __default_resource_group.

    +

    Mulai dari versi 2.4.1, Milvus menyediakan API grup sumber daya deklaratif, sementara API grup sumber daya yang lama sudah tidak digunakan lagi. API deklaratif yang baru memungkinkan pengguna untuk mencapai idempoten, untuk melakukan pengembangan sekunder di lingkungan cloud-native dengan lebih mudah.

    +

    Konsep kelompok sumber daya

    Grup sumber daya dijelaskan oleh konfigurasi grup sumber daya:

    +
    {
    +    "requests": { "nodeNum": 1 },
    +    "limits": { "nodeNum": 1 },
    +    "transfer_from": [{ "resource_group": "rg1" }],
    +    "transfer_to": [{ "resource_group": "rg2" }]
    +}
    +
    +
      +
    • Atribut permintaan menentukan kondisi yang harus dipenuhi oleh grup sumber daya.
    • +
    • Atribut batas menentukan batas maksimum untuk grup sumber daya.
    • +
    • Atribut transfer_from dan transfer_to menjelaskan dari grup sumber daya mana grup sumber daya sebaiknya memperoleh sumber daya dan ke grup sumber daya mana grup sumber daya harus mentransfer sumber daya.
    • +
    +

    Setelah konfigurasi kelompok sumber daya berubah, Milvus akan menyesuaikan sumber daya Query Node saat ini sebanyak mungkin sesuai dengan konfigurasi baru, memastikan bahwa semua kelompok sumber daya pada akhirnya memenuhi kondisi berikut:

    +

    .requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.

    +

    Kecuali dalam kasus-kasus berikut ini:

    +
      +
    • Ketika jumlah QueryNode dalam cluster Milvus tidak mencukupi, misalnya, NumOfQueryNode < sum(.requests.nodeNum), akan selalu ada kelompok sumber daya tanpa QueryNode yang cukup.
    • +
    • Ketika jumlah QueryNode dalam cluster Milvus berlebihan, misalnya, NumOfQueryNode > sum(.limits.nodeNum), QueryNode yang berlebihan akan selalu ditempatkan di __default_resource_group terlebih dahulu.
    • +
    +

    Tentu saja, jika jumlah QueryNode dalam klaster berubah, Milvus akan terus berusaha menyesuaikan untuk memenuhi kondisi akhir. Oleh karena itu, Anda dapat menerapkan perubahan konfigurasi grup sumber daya terlebih dahulu, lalu melakukan penskalaan QueryNode.

    +

    Gunakan api deklaratif untuk mengelola kelompok sumber daya

    +

    Semua contoh kode pada halaman ini terdapat pada PyMilvus 2.5.3. Upgrade instalasi PyMilvus Anda sebelum menjalankannya.

    +
    +
      +
    1. Membuat grup sumber daya.

      +

      Untuk membuat grup sumber daya, jalankan kode berikut setelah Anda terhubung ke sebuah instans Milvus. Cuplikan berikut ini mengasumsikan bahwa default adalah nama alias dari koneksi Milvus Anda.

      +
      import pymilvus
      +
      +# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).
      +name = "rg"
      +node_num = 0
      +
      +# create a resource group that exactly hold no query node.
      +try:
      +    utility.create_resource_group(name, config=utility.ResourceGroupConfig(
      +        requests={"node_num": node_num},
      +        limits={"node_num": node_num},
      +    ), using='default')
      +    print(f"Succeeded in creating resource group {name}.")
      +except Exception:
      +    print("Failed to create the resource group.")
      +
    2. +
    3. Membuat daftar grup sumber daya.

      +

      Setelah Anda membuat grup sumber daya, Anda dapat melihatnya di daftar grup sumber daya.

      +

      Untuk melihat daftar grup sumber daya dalam instans Milvus, lakukan hal berikut:

      +
      rgs = utility.list_resource_groups(using='default')
      +print(f"Resource group list: {rgs}")
      +
      +# Resource group list: ['__default_resource_group', 'rg']
      +
    4. +
    5. Mendeskripsikan sebuah grup sumber daya.

      +

      Anda dapat meminta Milvus mendeskripsikan grup sumber daya yang menjadi perhatian sebagai berikut:

      +
      info = utility.describe_resource_group(name, using="default")
      +print(f"Resource group description: {info}")
      +
      +# Resource group description: 
      +#        <name:"rg">,           // string, rg name
      +#        <capacity:1>,            // int, num_node which has been transfer to this rg
      +#        <num_available_node:0>,  // int, available node_num, some node may shutdown
      +#        <num_loaded_replica:{}>, // map[string]int, from collection_name to loaded replica of each collecion in this rg
      +#        <num_outgoing_node:{}>,  // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg 
      +#        <num_incoming_node:{}>.  // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg
      +
    6. +
    7. Mentransfer node di antara grup sumber daya.

      +

      Anda mungkin memperhatikan bahwa grup sumber daya yang dideskripsikan belum memiliki node kueri. Pindahkan beberapa node dari grup sumber daya default ke grup yang Anda buat sebagai berikut: Asumsikan saat ini ada 1 QueryNodes dalam __default_resource_group pada klaster, dan kita ingin mentransfer satu node ke dalam rg yang telah dibuat.update_resource_groups memastikan atomisitas untuk beberapa perubahan konfigurasi, sehingga tidak ada status peralihan yang akan terlihat oleh Milvus.

      +
      source = '__default_resource_group'
      +target = 'rg'
      +expected_num_nodes_in_default = 0
      +expected_num_nodes_in_rg = 1
      +
      +try:
      +    utility.update_resource_groups({
      +        source: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_default},
      +            limits={"node_num": expected_num_nodes_in_default},
      +        ),
      +        target: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_rg},
      +            limits={"node_num": expected_num_nodes_in_rg},
      +        )
      +    }, using="default")
      +    print(f"Succeeded in move 1 node(s) from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving nodes.")
      +
      +# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.
      +
    8. +
    9. Memuat koleksi dan partisi ke sebuah grup sumber daya.

      +

      Setelah ada node kueri dalam sebuah grup sumber daya, Anda dapat memuat koleksi ke grup sumber daya ini. Cuplikan berikut ini mengasumsikan bahwa koleksi bernama demo sudah ada.

      +
      from pymilvus import Collection
      +
      +collection = Collection('demo')
      +
      +# Milvus loads the collection to the default resource group.
      +collection.load(replica_number=2)
      +
      +# Or, you can ask Milvus load the collection to the desired resource group.
      +# make sure that query nodes num should be greater or equal to replica_number
      +resource_groups = ['rg']
      +collection.load(replica_number=2, _resource_groups=resource_groups) 
      +
      +

      Selain itu, Anda juga dapat memuat partisi ke dalam grup sumber daya dan membuat replikanya terdistribusi di antara beberapa grup sumber daya. Berikut ini mengasumsikan bahwa koleksi bernama Books sudah ada dan memiliki partisi bernama Novels.

      +
      collection = Collection("Books")
      +
      +# Use the load method of a collection to load one of its partition
      +collection.load(["Novels"], replica_number=2, _resource_groups=resource_groups)
      +
      +# Or, you can use the load method of a partition directly
      +partition = Partition(collection, "Novels")
      +partition.load(replica_number=2, _resource_groups=resource_groups)
      +
      +

      Perhatikan bahwa _resource_groups adalah parameter opsional, dan jika tidak ditentukan, Milvus akan memuat replika ke node kueri dalam grup sumber daya default.

      +

      Agar Milus memuat setiap replika koleksi dalam grup sumber daya yang terpisah, pastikan jumlah grup sumber daya sama dengan jumlah replika.

    10. +
    11. Mentransfer replika di antara grup sumber daya.

      +

      Milvus menggunakan replika untuk mencapai penyeimbangan beban di antara segmen-segmen yang didistribusikan di beberapa node kueri. Anda dapat memindahkan replika tertentu dari sebuah koleksi dari satu grup sumber daya ke grup sumber daya lainnya sebagai berikut:

      +
      source = '__default_resource_group'
      +target = 'rg'
      +collection_name = 'c'
      +num_replicas = 1
      +
      +try:
      +    utility.transfer_replica(source, target, collection_name, num_replicas, using="default")
      +    print(f"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving replicas.")
      +
      +# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.
      +
    12. +
    13. Menghapus grup sumber daya.

      +

      Anda dapat menghapus grup sumber daya yang tidak memiliki simpul kueri (limits.node_num = 0) kapan saja. Dalam panduan ini, grup sumber daya rg sekarang memiliki satu simpul kueri. Anda perlu mengubah konfigurasi limits.node_num grup sumber daya menjadi nol terlebih dahulu.

      +
      try:
      +    utility.update_resource_groups({
      +        "rg": utility.ResourceGroupConfig(
      +            requests={"node_num": 0},
      +            limits={"node_num": 0},
      +        ),
      +    }, using="default")
      +    utility.drop_resource_group("rg", using="default")
      +    print(f"Succeeded in dropping {source}.")
      +except Exception:
      +    print(f"Something went wrong while dropping {source}.")
      +
    14. +
    +

    Untuk lebih jelasnya, silakan lihat contoh yang relevan di pymilvus

    +

    Praktik yang baik untuk mengelola penskalaan cluster

    Saat ini, Milvus tidak dapat melakukan penskalaan masuk dan keluar secara mandiri di lingkungan cloud-native. Namun, dengan menggunakan Declarative Resource Group API bersama dengan orkestrasi kontainer, Milvus dapat dengan mudah mencapai isolasi sumber daya dan manajemen untuk QueryNodes. Berikut ini adalah praktik yang baik untuk mengelola QueryNodes di lingkungan cloud:

    +
      +
    1. Secara default, Milvus membuat __default_resource_group. Grup sumber daya ini tidak dapat dihapus dan juga berfungsi sebagai grup sumber daya pemuatan default untuk semua koleksi dan QueryNode yang berlebihan selalu ditugaskan ke grup tersebut. Oleh karena itu, kita dapat membuat grup sumber daya yang tertunda untuk menampung sumber daya QueryNode yang tidak digunakan, sehingga sumber daya QueryNode tidak digunakan oleh __default_resource_group.

      +

      Selain itu, jika kita secara ketat menerapkan batasan sum(.requests.nodeNum) <= queryNodeNum, kita dapat secara tepat mengontrol penugasan QueryNode dalam cluster. Mari kita asumsikan saat ini hanya ada satu QueryNode di dalam cluster dan menginisialisasi cluster. Berikut ini adalah contoh pengaturannya:

      +
      from pymilvus import utility
      +from pymilvus.client.types import ResourceGroupConfig
      +
      +_PENDING_NODES_RESOURCE_GROUP="__pending_nodes"
      +
      +def init_cluster(node_num: int):
      +    print(f"Init cluster with {node_num} nodes, all nodes will be put in default resource group")
      +    # create a pending resource group, which can used to hold the pending nodes that do not hold any data.
      +    utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(
      +        requests={"node_num": 0}, # this resource group can hold 0 nodes, no data will be load on it.
      +        limits={"node_num": 10000}, # this resource group can hold at most 10000 nodes 
      +    ))
      +
      +    # update default resource group, which can used to hold the nodes that all initial node in it.
      +    utility.update_resource_groups({
      +        "__default_resource_group": ResourceGroupConfig(
      +            requests={"node_num": node_num},
      +            limits={"node_num": node_num},
      +            transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.
      +            transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.
      +        )})
      +    utility.create_resource_group(name="rg1", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +    utility.create_resource_group(name="rg2", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +
      +init_cluster(1)
      +
      +

      Dengan menggunakan contoh kode di atas, kita membuat grup sumber daya bernama __pending_nodes untuk menampung QueryNode tambahan. Kita juga membuat dua Resource Group khusus pengguna bernama rg1 dan rg2. Selain itu, kami memastikan bahwa grup sumber daya lainnya memprioritaskan pemulihan QueryNode yang hilang atau berlebihan dari __pending_nodes.

    2. +
    3. Skala klaster

      +

      Anggaplah kita memiliki fungsi penskalaan berikut ini:

      +
      
      +def scale_to(node_num: int):
      +    # scale the querynode number in Milvus into node_num.
      +    pass
      +
      +

      Kita dapat menggunakan API untuk menskalakan kelompok sumber daya tertentu ke sejumlah QueryNode yang ditentukan tanpa memengaruhi kelompok sumber daya lainnya.

      +
      # scale rg1 into 3 nodes, rg2 into 1 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 3},
      +        limits={"node_num": 3},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +    "rg2": ResourceGroupConfig(
      +        requests={"node_num": 1},
      +        limits={"node_num": 1},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +scale_to(5)
      +# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.
      +
    4. +
    5. Skala cluster masuk

      +

      Demikian pula, kita dapat membuat aturan penskalaan yang memprioritaskan pemilihan QueryNode dari kelompok sumber daya __pending_nodes. Informasi ini dapat diperoleh melalui API describe_resource_group. Mencapai tujuan penskalaan pada kelompok sumber daya tertentu.

      +
      # scale rg1 from 3 nodes into 2 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 2},
      +        limits={"node_num": 2},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +
      +# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.
      +scale_to(4)
      +# scale the node in __pending_nodes
      +
    6. +
    +

    Bagaimana kelompok sumber daya berinteraksi dengan beberapa replika

      +
    • Replika dari satu koleksi dan kelompok sumber daya memiliki hubungan N-ke-N.
    • +
    • Ketika beberapa replika dari satu koleksi dimuat ke dalam satu kelompok sumber daya, QueryNode dari kelompok sumber daya tersebut didistribusikan secara merata di antara replika, memastikan bahwa perbedaan jumlah QueryNode yang dimiliki setiap replika tidak melebihi 1.
    • +
    +

    Selanjutnya

    Untuk menerapkan instans Milvus multi-penyewa, baca yang berikut ini:

    + diff --git a/localization/v2.5.x/site/id/adminGuide/scale-dependencies.json b/localization/v2.5.x/site/id/adminGuide/scale-dependencies.json new file mode 100644 index 000000000..f98e7812d --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/scale-dependencies.json @@ -0,0 +1 @@ +{"codeList":["# new-values.yaml\nminio:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yam;\nminio:\n zones: 2\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n resources:\n limits:\n cpu: 2\n memory: 12Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n replicaCount: 4\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n broker:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","pulsar:\n bookkeeper:\n volumes:\n journal:\n size: 20Gi\n storageClassName: gp3\n","# new-values.yaml\npulsar:\n broker:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n replicaCount: 5\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n"],"headingContent":"Scale Milvus Dependencies","anchorList":[{"label":"Skala Ketergantungan Milvus","href":"Scale-Milvus-Dependencies","type":1,"isActive":false},{"label":"Skala MinIO","href":"Scale-MinIO","type":2,"isActive":false},{"label":"Kafka","href":"Kafka","type":2,"isActive":false},{"label":"Tambahkan kumpulan broker Kafka ekstra (Disarankan)","href":"Add-an-extra-Kafka-broker-pool-Recommended","type":2,"isActive":false},{"label":"Pulsar","href":"Pulsar","type":2,"isActive":false},{"label":"Meningkatkan sumber daya per pod broker Pulsar","href":"Increase-resources-per-Pulsar-broker-pod","type":2,"isActive":false},{"label":"Tingkatkan sumber daya per pod bandar Pulsar","href":"Increase-resources-per-Pulsar-bookie-pod","type":2,"isActive":false},{"label":"etcd","href":"etcd","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/scale-dependencies.md b/localization/v2.5.x/site/id/adminGuide/scale-dependencies.md new file mode 100644 index 000000000..5f6eac379 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/scale-dependencies.md @@ -0,0 +1,252 @@ +--- +id: scale-dependencies.md +title: Ketergantungan Skala +--- +

    Skala Ketergantungan Milvus

    Milvus bergantung pada berbagai ketergantungan seperti MinIO, Kafka, Pulsar, dan lain-lain. Menskalakan komponen-komponen ini dapat meningkatkan kemampuan beradaptasi Milvus terhadap kebutuhan yang berbeda.

    + +

    Skala MinIO

    Meningkatkan sumber daya per pod MinIO

    MinIO, sistem penyimpanan objek yang digunakan oleh Milvus, dapat ditingkatkan sumber daya CPU dan memorinya untuk setiap pod.

    +
    # new-values.yaml
    +minio:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Anda juga dapat meningkatkan kapasitas disk untuk cluster MioIO dengan mengubah nilai spec.resources.requests.storage secara manual untuk setiap MioIO Persistent Volume Claim (PVC). Perhatikan bahwa kelas penyimpanan default Anda harus mengizinkan ekspansi volume.

    +

    Anda disarankan untuk menambahkan pool server MioIO ekstra untuk instance Milvus Anda.

    +
    # new-values.yam;
    +minio:
    +  zones: 2
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Ini akan menambahkan sebuah pool server tambahan ke cluster MinIO Anda, sehingga Milvus dapat menulis ke pool server MinIO berdasarkan kapasitas disk kosong dari setiap pool server. Sebagai contoh, jika sebuah grup yang terdiri dari tiga pool memiliki total ruang kosong 10 TiB yang didistribusikan di seluruh pool sebagai berikut:

    + + + + + + + + + +
    Ruang kosongKemungkinan penulisan
    Pool A3 TiB30% (3/10)
    Pool B2 TiB20% (2/10)
    Pool C5 TiB50% (5/10)
    +
    +

    MinIO tidak secara otomatis menyeimbangkan kembali objek di seluruh pool server baru. Anda dapat memulai prosedur penyeimbangan ulang secara manual dengan mc admin rebalance jika diperlukan.

    +
    +

    Kafka

    Tingkatkan sumber daya per pod broker Kafka

    Tingkatkan kapasitas broker Kafka dengan menyesuaikan sumber daya CPU dan memori untuk setiap pod broker.

    +
    # new-values.yaml
    +kafka:
    +  resources:
    +     limits:
    +        cpu: 2
    +        memory: 12Gi
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Anda juga dapat meningkatkan kapasitas disk untuk cluster Kafka dengan mengubah nilai spec.resources.requests.storage secara manual untuk setiap Kafka Persistent Volume Claim (PVC). Pastikan kelas penyimpanan default Anda mengizinkan ekspansi volume.

    +

    Anda disarankan untuk menambahkan pool server Kafka tambahan untuk instance Milvus Anda.

    +
    # new-values.yaml
    +kafka:
    +  replicaCount: 4
    +
    +

    Setelah menyimpan berkas, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Ini akan menambahkan satu broker tambahan ke kluster Kafka Anda.

    +
    +

    Kafka tidak secara otomatis menyeimbangkan kembali topik di semua broker. Seimbangkan kembali topik/partisi secara manual di semua broker Kafka menggunakan bin/kafka-reassign-partitions.sh setelah masuk ke setiap pod broker Kafka jika diperlukan.

    +
    +

    Pulsar

    Pulsar memisahkan komputasi dan penyimpanan. Anda dapat secara mandiri meningkatkan kapasitas broker Pulsar (komputasi) dan bandar judi Pulsar (penyimpanan).

    +

    Meningkatkan sumber daya per pod broker Pulsar

    # new-values.yaml
    +pulsar:
    +  broker:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Tingkatkan sumber daya per pod bandar Pulsar

    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Anda juga dapat meningkatkan kapasitas disk untuk cluster Pulsar dengan mengubah nilai spec.resources.requests.storage secara manual untuk setiap Persistent Volume Claim (PVC) bandar Pulsar. Perhatikan bahwa kelas penyimpanan default Anda harus mengizinkan ekspansi volume.

    +

    Sebuah pod bandar Pulsar memiliki dua jenis penyimpanan: journal dan legers. Untuk jenis penyimpanan journal, pertimbangkan untuk menggunakan ssd atau gp3 sebagai kelas penyimpanan. Berikut adalah contoh untuk menentukan kelas penyimpanan untuk jurnal pulsar.

    +
    pulsar:
    +  bookkeeper:
    +    volumes:
    +      journal:
    +        size: 20Gi
    +        storageClassName: gp3
    +
    +

    Menambahkan pod broker Pulsar tambahan

    # new-values.yaml
    +pulsar:
    +  broker:
    +    replicaCount: 3
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    replicaCount: 3
    +
    +

    Setelah menyimpan file, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    etcd

    # new-values.yaml
    +etcd:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    Setelah menyimpan berkas, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Menambahkan pod etcd tambahan

    Jumlah total pod etcd harus dalam angka ganjil.

    +
    # new-values.yaml
    +etcd:
    +  replicaCount: 5
    +
    +

    Setelah menyimpan berkas, terapkan perubahan dengan perintah berikut:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/scaleout.json b/localization/v2.5.x/site/id/adminGuide/scaleout.json new file mode 100644 index 000000000..551b1375f --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/scaleout.json @@ -0,0 +1 @@ +{"codeList":["NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 1m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 1m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 1m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 1m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 1m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 1m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 1m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 1m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 1m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 1m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 1m \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-czq9f 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-jcdcn 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n"],"headingContent":"Scale a Milvus Cluster","anchorList":[{"label":"Menetapkan Skala Cluster Milvus","href":"Scale-a-Milvus-Cluster","type":1,"isActive":false},{"label":"Apa yang dimaksud dengan penskalaan horizontal?","href":"What-is-horizontal-scaling","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengukur skala klaster Milvus","href":"Scale-a-Milvus-cluster","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/scaleout.md b/localization/v2.5.x/site/id/adminGuide/scaleout.md new file mode 100644 index 000000000..f2a8d788d --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/scaleout.md @@ -0,0 +1,183 @@ +--- +id: scaleout.md +related_key: scale Milvus cluster +summary: >- + Pelajari cara melakukan scale out dan scale in secara manual atau otomatis + dalam cluster Milvus. +title: Menetapkan Skala Cluster Milvus +--- +

    Menetapkan Skala Cluster Milvus

    Milvus mendukung penskalaan horizontal pada komponen-komponennya. Ini berarti Anda dapat menambah atau mengurangi jumlah node pekerja dari setiap jenis sesuai dengan kebutuhan Anda.

    +

    Topik ini menjelaskan cara untuk melakukan scale out dan scale in pada cluster Milvus. Kami mengasumsikan bahwa Anda telah menginstal cluster Milvus sebelum melakukan penskalaan. Selain itu, kami sarankan untuk membiasakan diri Anda dengan arsitektur Milvus sebelum memulai.

    +

    Tutorial ini menggunakan penskalaan tiga node kueri sebagai contoh. Untuk menskalakan jenis node lainnya, ganti queryNode dengan jenis node yang sesuai pada baris perintah.

    +
    +

    Untuk informasi tentang cara menskalakan cluster dengan Milvus Operator, lihat Menskalakan Cluster dengan Milvus Operator.

    +
    +

    Apa yang dimaksud dengan penskalaan horizontal?

    Penskalaan horizontal meliputi penskalaan keluar dan penskalaan masuk.

    +

    Scaling out

    Scaling out mengacu pada peningkatan jumlah node dalam sebuah cluster. Tidak seperti scaling up, scaling out tidak mengharuskan Anda mengalokasikan lebih banyak sumber daya ke satu node dalam cluster. Sebaliknya, scaling out memperluas cluster secara horizontal dengan menambahkan lebih banyak node.

    +

    + + Scaleout + Pengecilan ukuran

    +

    + + Scaleup + Peningkatan

    +

    Menurut arsitektur Milvus, node pekerja tanpa kewarganegaraan meliputi node kueri, node data, node indeks, dan proxy. Oleh karena itu, Anda dapat melakukan scale out node jenis ini agar sesuai dengan kebutuhan bisnis dan skenario aplikasi Anda. Anda dapat menskalakan cluster Milvus secara manual atau otomatis.

    +

    Umumnya, Anda perlu melakukan scale out cluster Milvus yang Anda buat jika cluster tersebut digunakan secara berlebihan. Di bawah ini adalah beberapa situasi umum di mana Anda mungkin perlu melakukan scale out cluster Milvus:

    +
      +
    • Penggunaan CPU dan memori tinggi untuk jangka waktu tertentu.
    • +
    • Throughput kueri menjadi lebih tinggi.
    • +
    • Diperlukan kecepatan yang lebih tinggi untuk pengindeksan.
    • +
    • Volume besar dari kumpulan data yang besar perlu diproses.
    • +
    • Ketersediaan layanan Milvus yang tinggi perlu dipastikan.
    • +
    +

    Penskalaan ke dalam

    Scaling in mengacu pada pengurangan jumlah node dalam sebuah cluster. Umumnya, Anda perlu melakukan penskalaan dalam cluster Milvus yang Anda buat jika cluster tersebut kurang dimanfaatkan. Di bawah ini adalah beberapa situasi umum di mana Anda perlu melakukan penskalaan dalam cluster Milvus:

    +
      +
    • Pemanfaatan CPU dan memori rendah untuk jangka waktu tertentu.
    • +
    • Throughput kueri menjadi lebih rendah.
    • +
    • Kecepatan yang lebih tinggi untuk pengindeksan tidak diperlukan.
    • +
    • Ukuran dataset yang akan diproses kecil.
    • +
    +
    +Kami tidak menyarankan untuk mengurangi jumlah node pekerja secara drastis. Misalnya, jika ada lima node data dalam cluster, kami sarankan untuk mengurangi satu node data pada satu waktu untuk memastikan ketersediaan layanan. Jika layanan tersedia setelah upaya pertama penskalaan, Anda dapat melanjutkan untuk mengurangi jumlah node data lebih lanjut.
    +

    Prasyarat

    Jalankan kubectl get pods untuk mendapatkan daftar komponen dan status kerjanya dalam cluster Milvus yang Anda buat.

    +
    NAME                                            READY   STATUS       RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running      0          1m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running      0          1m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running      0          1m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running      0          1m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running      0          1m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running      0          1m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running      0          1m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running      0          1m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running      0          1m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running      0          1m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running      0          1m 
    +
    +
    +Milvus hanya mendukung penambahan node pekerja dan tidak mendukung penambahan komponen koordinator.
    +

    Mengukur skala klaster Milvus

    Anda dapat melakukan penskalaan pada klaster Milvus Anda secara manual atau otomatis. Jika autoscaling diaktifkan, cluster Milvus akan menyusut atau membesar secara otomatis ketika konsumsi sumber daya CPU dan memori mencapai nilai yang Anda tetapkan.

    +

    Saat ini, Milvus 2.1.0 hanya mendukung penskalaan masuk dan keluar secara manual.

    +

    Mengecilkan skala

    Jalankan helm upgrade my-release milvus/milvus --set queryNode.replicas=3 --reuse-values untuk memperkecil node kueri secara manual.

    +

    Jika berhasil, tiga pod yang sedang berjalan pada node kueri akan ditambahkan seperti yang ditunjukkan pada contoh berikut.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-czq9f    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-jcdcn    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    Penskalaan masuk

    Jalankan helm upgrade my-release milvus/milvus --set queryNode.replicas=1 --reuse-values untuk menskalakan node kueri.

    +

    Jika berhasil, tiga pod yang sedang berjalan pada simpul kueri dikurangi menjadi satu seperti yang ditunjukkan pada contoh berikut.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/tls.json b/localization/v2.5.x/site/id/adminGuide/tls.json new file mode 100644 index 000000000..c8559ca30 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/tls.json @@ -0,0 +1 @@ +{"codeList":["openssl version\n","sudo apt install openssl\n","mkdir cert && cd cert\ntouch gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out ca.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# create a new ca certificate\nopenssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n","chmod +x gen.sh\n./gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n","chmod +x renew.sh\n./renew.sh\n","proxy:\n http:\n # for now milvus do not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \ntls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n tlsMode: 1\n","internaltls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n internaltlsEnabled: true \n","├── docker-compose.yml\n├── milvus.yaml\n└── tls\n ├── server.pem\n ├── server.key\n └── ca.pem\n"," standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:latest\n command: [\"milvus\", \"run\", \"standalone\"]\n security_opt:\n - seccomp:unconfined\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","sudo docker compose up -d\n","├── milvus.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost # the CommonName in your certificates\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","kubectl create -f milvus.yaml\n","├── values.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","extraConfigFiles:\n user.yaml: |+\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS\n # Configure tls certificates path for external service\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update milvus\nhelm install my-release milvus/milvus -f values.yaml\n","[...date time...] [INFO] [utils/util.go:56] [\"Internal TLS Enabled\"] [value=true]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n server_pem_path=\"path_to/server.pem\",\n server_name=\"localhost\"\n)\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n client_pem_path=\"path_to/client.pem\",\n client_key_path=\"path_to/client.key\",\n ca_pem_path=\"path_to/ca.pem\",\n server_name=\"localhost\"\n)\n","curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n","curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n"],"headingContent":"Encryption in Transit","anchorList":[{"label":"Enkripsi dalam Perjalanan","href":"Encryption-in-Transit","type":1,"isActive":false},{"label":"Membuat sertifikat Anda sendiri","href":"Create-your-own-certificate","type":2,"isActive":false},{"label":"Menyiapkan server Milvus dengan TLS","href":"Set-up-a-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"Memverifikasi TLS internal yang diaktifkan","href":"Verify-Internal-TLS-enabled","type":2,"isActive":false},{"label":"Menghubungkan ke server Milvus dengan TLS","href":"Connect-to-the-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"Menyambungkan ke server Milvus RESTful dengan TLS","href":"Connect-to-the-Milvus-RESTful-server-with-TLS","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/tls.md b/localization/v2.5.x/site/id/adminGuide/tls.md new file mode 100644 index 000000000..40b50e17b --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/tls.md @@ -0,0 +1,449 @@ +--- +id: tls.md +title: Enkripsi dalam Perjalanan +summary: Pelajari cara mengaktifkan proksi TLS di Milvus. +--- +

    Enkripsi dalam Perjalanan

    TLS (Transport Layer Security) adalah protokol enkripsi untuk memastikan keamanan komunikasi. Proksi Milvus menggunakan autentikasi TLS satu arah dan dua arah.

    +

    Topik ini menjelaskan cara mengaktifkan TLS di proxy Milvus untuk lalu lintas gRPC dan RESTful.

    +
    +

    TLS dan autentikasi pengguna adalah dua pendekatan keamanan yang berbeda. Jika Anda telah mengaktifkan autentikasi pengguna dan TLS di sistem Milvus Anda, Anda harus menyediakan nama pengguna, kata sandi, dan jalur file sertifikat. Untuk informasi tentang cara mengaktifkan autentikasi pengguna, lihat Mengautentikasi Akses Pengguna.

    +
    +

    Membuat sertifikat Anda sendiri

    Prasyarat

    Pastikan OpenSSL telah terinstal. Jika Anda belum menginstalnya, bangun dan instal OpenSSL terlebih dahulu.

    +
    openssl version
    +
    +

    Jika OpenSSL tidak diinstal. Ini dapat diinstal dengan perintah berikut di Ubuntu.

    +
    sudo apt install openssl
    +
    +

    Membuat berkas

      +
    1. Buat berkas gen.sh.
    2. +
    +
    mkdir cert && cd cert
    +touch gen.sh
    +
    +
      +
    1. Salin skrip berikut ini ke dalam gen.sh.
    2. +
    +

    Anda perlu mengonfigurasi CommonName dalam berkas gen.sh. CommonName mengacu pada nama server yang harus ditentukan oleh klien saat menyambung.

    +

    gen.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out ca.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# create a new ca certificate
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +
    +

    +

    Variabel-variabel dalam file gen.sh sangat penting untuk proses pembuatan file permintaan penandatanganan sertifikat. Lima variabel pertama adalah informasi penandatanganan dasar, termasuk negara, negara bagian, lokasi, organisasi, unit organisasi. Diperlukan kehati-hatian saat mengonfigurasi CommonName karena akan diverifikasi selama komunikasi klien-server.

    +

    Jalankan gen.sh untuk menghasilkan sertifikat

    Jalankan file gen.sh untuk membuat sertifikat.

    +
    chmod +x gen.sh
    +./gen.sh
    +
    +

    Tujuh berkas berikut ini akan dibuat: ca.key ca.pem , ca.srl, server.key, server.pem, client.key, client.pem.

    +

    Pastikan untuk menyimpan ca.key, ca.pem, ca.srl dengan aman untuk memperbarui sertifikat Anda nanti. File server.key dan server.pem digunakan oleh server, dan file client.key dan client.pem digunakan oleh klien.

    +

    Memperbarui sertifikat (opsional)

    Jika Anda ingin memperbarui sertifikat dalam beberapa kasus, misalnya jika sertifikat akan segera kedaluwarsa. Anda dapat menggunakan skrip berikut.

    +

    Anda membutuhkan ca.key, ca.pem, ca.srl di direktori kerja Anda.

    +

    renew.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +

    +

    Jalankan file renew.sh untuk membuat sertifikat.

    +
    chmod +x renew.sh
    +./renew.sh
    +
    +

    Menyiapkan server Milvus dengan TLS

    Bagian ini menguraikan langkah-langkah untuk mengonfigurasi server Milvus dengan enkripsi TLS.

    +

    Penyiapan untuk Docker Compose

    1. Memodifikasi konfigurasi server Milvus

    Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut dalam berkas milvus.yaml:

    +
    proxy:
    +  http:
    +    # for now milvus do not support config restful on same port with grpc
    +    # so we set to 8080, grpc will still use 19530
    +    port: 8080 
    +tls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    tlsMode: 1
    +
    +

    Parameter

    +
      +
    • serverPemPath: Jalur ke file sertifikat server.
    • +
    • serverKeyPath: Jalur ke file kunci server.
    • +
    • caPemPath: Jalur ke berkas sertifikat CA.
    • +
    • tlsMode: Mode TLS untuk layanan eksternal. Nilai yang valid:
        +
      • 1: Otentikasi satu arah, di mana hanya server yang memerlukan sertifikat dan klien memverifikasinya. Mode ini membutuhkan server.pem dan server.key dari sisi server, dan server.pem dari sisi klien.
      • +
      • 2: Otentikasi dua arah, di mana server dan klien memerlukan sertifikat untuk membuat koneksi yang aman. Mode ini memerlukan server.pem, server.key, dan ca.pem dari sisi server, dan client.pem, client.key, dan ca.pem dari sisi klien.
      • +
    • +
    +

    Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini di file milvus.yaml:

    +
    internaltls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    internaltlsEnabled: true 
    +
    +

    Parameter:

    +
      +
    • serverPemPath: Jalur ke file sertifikat server.
    • +
    • serverKeyPath: Jalur ke file kunci server.
    • +
    • caPemPath: Jalur ke berkas sertifikat CA.
    • +
    • internaltlsEnabled: Apakah akan mengaktifkan TLS internal. Untuk saat ini hanya TLS satu arah yang didukung.
    • +
    +

    2. Memetakan berkas sertifikat ke kontainer

    Siapkan berkas sertifikat

    Buat folder baru bernama tls di direktori yang sama dengan docker-compose.yaml. Salin server.pem, server.key, dan ca.pem ke dalam folder tls. Tempatkan berkas-berkas tersebut dalam struktur direktori sebagai berikut:

    +
    ├── docker-compose.yml
    +├── milvus.yaml
    +└── tls
    +     ├── server.pem
    +     ├── server.key
    +     └── ca.pem
    +
    +

    Perbarui konfigurasi Docker Compose

    Edit berkas docker-compose.yaml untuk memetakan jalur berkas sertifikat di dalam kontainer seperti yang ditunjukkan di bawah ini:

    +
      standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:latest
    +    command: ["milvus", "run", "standalone"]
    +    security_opt:
    +    - seccomp:unconfined
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +
    Menerapkan Milvus menggunakan Docker Compose

    Jalankan perintah berikut untuk men-deploy Milvus:

    +
    sudo docker compose up -d
    +
    +

    Penyiapan untuk Operator Milvus

    Letakkan berkas sertifikat di dalam direktori kerja Anda. Struktur direktori akan terlihat seperti ini:

    +
    ├── milvus.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    Buat rahasia dengan berkas sertifikat:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut ini pada berkas milvus.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini pada berkas milvus.yaml:

    +

    Ingatlah untuk mengganti bidang internaltls.sni dengan Nama Umum di sertifikat Anda.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost # the CommonName in your certificates
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    membuat Milvus CR:

    +
    kubectl create -f milvus.yaml
    +
    +

    untuk Milvus Helm

    Letakkan file sertifikat di direktori kerja Anda. Struktur direktori akan terlihat seperti ini:

    +
    ├── values.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    Buat sebuah rahasia dengan file sertifikat:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    Untuk mengaktifkan TLS eksternal, tambahkan konfigurasi berikut ini pada berkas values.yaml:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS
    +    # Configure tls certificates path for external service
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    Untuk mengaktifkan TLS internal, tambahkan konfigurasi berikut ini pada berkas values.yaml:

    +

    Ingatlah untuk mengganti bidang internaltls.sni dengan Nama Umum dalam sertifikat Anda.

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    Buat rilis milvus:

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update milvus
    +helm install my-release milvus/milvus -f values.yaml
    +
    +

    Memverifikasi TLS internal yang diaktifkan

    Sulit untuk memverifikasi TLS internal secara langsung. Anda dapat memeriksa log Milvus untuk melihat apakah TLS internal telah diaktifkan.

    +

    Pada log Milvus, Anda akan melihat pesan berikut ini jika TLS internal diaktifkan:

    +
    [...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
    +
    +

    Menghubungkan ke server Milvus dengan TLS

    Untuk interaksi SDK, gunakan pengaturan berikut ini tergantung pada mode TLS.

    +

    Koneksi TLS satu arah

    Sediakan jalur ke server.pem dan pastikan server_name cocok dengan CommonName yang dikonfigurasi dalam sertifikat.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    server_pem_path="path_to/server.pem",
    +    server_name="localhost"
    +)
    +
    +

    Koneksi TLS dua arah

    Sediakan jalur ke client.pem, client.key, dan ca.pem, dan pastikan server_name cocok dengan CommonName yang dikonfigurasi dalam sertifikat.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    client_pem_path="path_to/client.pem",
    +    client_key_path="path_to/client.key",
    +    ca_pem_path="path_to/ca.pem",
    +    server_name="localhost"
    +)
    +
    +

    Lihat example_tls1.py dan example_tls2.py untuk informasi lebih lanjut.

    +

    Menyambungkan ke server Milvus RESTful dengan TLS

    Untuk API RESTful, Anda dapat memeriksa tls dengan menggunakan perintah curl.

    +

    Koneksi TLS satu arah

    curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    +

    Koneksi TLS dua arah

    curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.json b/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.json new file mode 100644 index 000000000..c9ad3883d --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.json @@ -0,0 +1 @@ +{"codeList":["kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​\n","[1] 8116​\nForwarding from 127.0.0.1:9091 -> 9091​\n\n","pid=8116​\n\n","curl 127.0.0.1:9091/api/v1/collections \\​\n|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\\​\n|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \\​\n> flushing_segments.json​\ncat flushing_segments.json​\n\n","{​\n \"segmentIDs\": [​\n 454097953998181000,​\n 454097953999383600,​\n 454097953998180800​\n ]​\n}​\n\n","cat flushing_segments.json| curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​\n\n","{\"status\":{},\"flushed\":true}​\n\n","kill $pid​\n\n","[1] + 8116 terminated kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 ​\n\n","helm -n default get values my-release -o yaml > values.yaml​\ncat values.yaml​\n\n","helm -n default uninstall my-release​\n\n","These resources were kept due to the resource policy:​\n[PersistentVolumeClaim] my-release-minio​\n​\nrelease \"my-release\" uninstalled​\n\n","kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​\nkubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​\necho \"Volume Claims:\"​\ncat pulsar-pvcs.txt​\necho \"Volumes:\"​\ncat pulsar-pvs.txt​\n\n","Volume Claims:​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​\nmy-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​\nVolumes:​\npvc-f590a4de-df31-4ca8-a424-007eac3c619a​\npvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​\npvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​\npvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​\npvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​\n\n","cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","persistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0\" deleted​\n\n","cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","Error from server (NotFound): persistentvolumeclaims \"pvc-f590a4de-df31-4ca8-a424-007eac3c619a\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a\" not found​\n\n","kubectl -n default get milvus my-release -o yaml > milvus.yaml​\nhead milvus.yaml -n 20​\n\n","apiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations:​\n milvus.io/dependency-values-merged: \"true\"​\n milvus.io/pod-service-label-added: \"true\"​\n milvus.io/querynode-current-group-id: \"0\"​\n creationTimestamp: \"2024-11-22T08:06:59Z\"​\n finalizers:​\n - milvus.milvus.io/finalizer​\n generation: 3​\n labels:​\n app: milvus​\n milvus.io/operator-version: 1.1.2​\nname: my-release​\nnamespace: default​\nresourceVersion: \"692217324\"​\nuid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​\nspec:​\n components:​\n\n","# a patch to retain etcd & storage data and delete pulsar data while delete milvus​\nspec:​\n dependencies:​\n etcd:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n storage:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n pulsar:​\n inCluster:​\n deletionPolicy: Delete​\n pvcDeletion: true​\n\n","kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​\n\n","milvus.milvus.io/my-release patched​\n\n","kubectl -n default delete milvus my-release --wait=false​\nkubectl -n default get milvus my-release​\nkubectl -n default delete milvus my-release --wait=true​\n\n","milvus.milvus.io \"my-release\" deleted​\nNAME MODE STATUS UPDATED AGE​\nmy-release cluster Deleting True 41m​\nmilvus.milvus.io \"my-release\" deleted​\n\n","kubectl -n default get milvus my-release​\n\n","No resources found in default namespace.​\n\n","# change the following:​\npulsar:​\n enabled: false # set to false​\n # you may also clean up rest fields under pulsar field​\n # it's ok to keep them though.​\npulsarv3:​\n enabled: true​\n # append other values for pulsar v3 chart if needs​\n\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm​\nhelm repo update zilliztech​\n\n","\"zilliztech\" already exists with the same configuration, skipping​\nHang tight while we grab the latest from your chart repositories...​\n...Successfully got an update from the \"zilliztech\" chart repository​\nUpdate Complete. ⎈Happy Helming!⎈​\n\n","helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​\n\n","NAME: my-release​\nLAST DEPLOYED: Fri Nov 22 15:31:27 2024​\nNAMESPACE: default​\nSTATUS: deployed​\nREVISION: 1​\nTEST SUITE: None​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 4m3s​\nmy-release-milvus-datanode-56487bc4bc-s6mbd 1/1 Running 0 4m5s​\nmy-release-milvus-indexnode-6476894d6-rv85d 1/1 Running 0 4m5s​\nmy-release-milvus-mixcoord-6d8875cb9c-67fcq 1/1 Running 0 4m4s​\nmy-release-milvus-proxy-7bc45d57c5-2qf8m 1/1 Running 0 4m4s​\nmy-release-milvus-querynode-77465747b-kt7f4 1/1 Running 0 4m4s​\nmy-release-minio-684ff4f5df-pnc97 1/1 Running 0 4m5s​\nmy-release-pulsarv3-bookie-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-1 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-2 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-init-6z4tk 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-broker-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-broker-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-pulsar-init-wvqpc 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-recovery-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-zookeeper-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-2 1/1 Running 0 4m2s​\n\n","# change the followings fields:​\napiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations: null # this field should be removed or set to null​\n resourceVersion: null # this field should be removed or set to null​\n uid: null # this field should be removed or set to null​\nspec:​\n dependencies:​\n pulsar:​\n inCluster:​\n chartVersion: pulsar-v3​\n # delete all previous values for pulsar v2 and set it to null.​\n # you may add additional values here for pulsar v3 if you're sure about it.​\n values: null​\n\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​\nhelm repo update milvus-operator​\nhelm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​\n\n","kubectl create -f milvus.yaml​\n\n","milvus.milvus.io/my-release created​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 65m​\nmy-release-milvus-datanode-57fd59ff58-5mdrk 1/1 Running 0 93s​\nmy-release-milvus-indexnode-67867c6b9b-4wsbw 1/1 Running 0 93s​\nmy-release-milvus-mixcoord-797849f9bb-sf8z5 1/1 Running 0 93s​\nmy-release-milvus-proxy-5d5bf98445-c55m6 1/1 Running 0 93s​\nmy-release-milvus-querynode-0-64797f5c9-lw4rh 1/1 Running 0 92s​\nmy-release-minio-79476ccb49-zvt2h 1/1 Running 0 65m​\nmy-release-pulsar-bookie-0 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-1 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-2 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-init-v8fdj 0/1 Completed 0 5m11s​\nmy-release-pulsar-broker-0 1/1 Running 0 5m11s​\nmy-release-pulsar-broker-1 1/1 Running 0 5m10s​\nmy-release-pulsar-proxy-0 1/1 Running 0 5m11s​\nmy-release-pulsar-proxy-1 1/1 Running 0 5m10s​\nmy-release-pulsar-pulsar-init-5lhx7 0/1 Completed 0 5m11s​\nmy-release-pulsar-recovery-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-1 1/1 Running 0 5m10s​\nmy-release-pulsar-zookeeper-2 1/1 Running 0 5m10s​\n\n"],"headingContent":"Upgrading Pulsar ​","anchorList":[{"label":"Memutakhirkan Pulsar","href":"Upgrading-Pulsar-​","type":1,"isActive":false},{"label":"Peta jalan","href":"Roadmap","type":2,"isActive":false},{"label":"Prosedur","href":"Procedures","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.md b/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.md new file mode 100644 index 000000000..0ef1376da --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade-pulsar-v3.md @@ -0,0 +1,427 @@ +--- +id: upgrade-pulsar-v3.md +related_key: upgrade pulsar v3 +summary: >- + Pelajari cara meng-upgrade Pulsar dari V2 ke V3 di Milvus agar Anda dapat + menggunakan versi terbaru Milvus v2.5.x. +title: Tingkatkan Pulsar di Milvus dari V2 ke V3 +--- +

    Memutakhirkan Pulsar

    Artikel ini menjelaskan prosedur bagi Anda untuk mengupgrade komponen Pulsar Anda dari V2 ke V3 jika Anda telah memiliki penerapan Milvus yang berfungsi dengan Pulsar V2.

    +

    Sejak Milvus v2.5, milvus-helm dan milvus-operator akan menggunakan Pulsar V3 secara default untuk memperbaiki beberapa bug dan kerentanan keamanan. Meskipun Milvus 2.5 kompatibel dengan Pulsar 2.x, upgrade ke Pulsar V3 bersifat opsional. Untuk meningkatkan stabilitas dan performa, kami merekomendasikan upgrade ke Pulsar V3.

    +

    Jika Anda lebih suka menggunakan Pulsar V2 dengan Milvus v2.5.x, baca Menggunakan Pulsar V2 dengan Milvus v2.5.x.

    +
    +
      +
    1. Proses peningkatan memerlukan pemadaman layanan singkat (biasanya membutuhkan waktu sekitar beberapa menit hingga lebih dari sepuluh menit, tergantung pada jumlah data).

    2. +
    3. Sebelum operasi, Anda harus menghentikan semua klien yang sedang berjalan untuk menulis data ke Milvus. Jika tidak, data yang ditulis dapat hilang.

    4. +
    5. Artikel ini mengasumsikan bahwa Milvus terinstal pada namespace default dan bernama my-release. Silakan ubah parameter ke namespace dan nama rilis Anda sendiri ketika menjalankan perintah-perintah yang disalin dari halaman ini.

    6. +
    7. Pastikan bahwa lingkungan kerja Anda memiliki izin di bawah namespace yang disebutkan di atas dalam kluster Kubernetes dan perintah berikut ini telah terinstal.

      +

      a. kubectl >= 1.20

      +

      b. helm >= 3.14.0

      +

      c. cat, grep, awk untuk operasi manipulasi string

      +

      d. curl atau Attu v2.4+ untuk berinteraksi dengan API manajemen milvus

    8. +
    +
    +

    Peta jalan

    Proses peningkatan mencakup langkah-langkah berikut:

    +
      +
    1. Menyimpan data yang tidak dikonsumsi dalam pulsar.

    2. +
    3. Menghentikan Milvus dan menghapus pulsar V2.

    4. +
    5. Mulai Pulsar V3 dan Milvus.

    6. +
    +

    Prosedur

    Bagian ini memberikan prosedur terperinci untuk meningkatkan Pulsar dari V2 ke V3 di Milvus.

    +

    Menyimpan data yang tidak digunakan di Pulsar

    Pada langkah ini, Anda perlu memastikan bahwa data yang ada di Pulsar telah dipertahankan ke layanan penyimpanan objek. Ada dua pendekatan yang tersedia, dan Anda dapat memilih salah satu yang sesuai dengan kebutuhan Anda.

    +

    Pendekatan 1: Menggunakan Attu

    Jika Anda hanya memiliki sejumlah kecil koleksi dalam penerapan Milvus yang sedang berjalan dengan segmen yang tidak terlalu banyak, Anda dapat menggunakan Attu untuk menyimpan data ke layanan penyimpanan objek.

    +
      +
    1. Pilih setiap koleksi di semua basis data Anda, masuk ke panel Segments, Klik tombol Flush

      +

      + + Segment panel of a collection + Panel segmen dari sebuah koleksi

    2. +
    3. Kemudian pada popup, Klik Flush lagi.

      +

      + + Data flush prompt in Attu + Perintah flush data di Attu

    4. +
    5. Kemudian tunggu hingga semua status Persistent Segment semua koleksi menjadi Flushed.

      +

      + + View data flush status in Attu + Melihat status flush data di Attu

    6. +
    +

    Pendekatan 2: Menggunakan API manajemen

      +
    1. Proksi port 9091 dari proksi Milvus ke hos lokal untuk operasi selanjutnya.

      +
      kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​
      +
      +

      Keluaran.

      +
      [1] 8116​
      +Forwarding from 127.0.0.1:9091 -> 9091​
      +
      +
    2. +
    3. Simpan Pid untuk pembersihan selanjutnya.

      +
      pid=8116​
      +
      +
    4. +
    5. Memicu tindakan mempertahankan semua data yang dimasukkan dari Pulsar ke Ojbect Storage.

      +
      curl 127.0.0.1:9091/api/v1/collections \​
      +|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\​
      +|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \​
      +> flushing_segments.json​
      +cat flushing_segments.json​
      +
      +
      +

      Keluaran.

      +
      {​
      +  "segmentIDs": [​
      +    454097953998181000,​
      +    454097953999383600,​
      +    454097953998180800​
      +  ]​
      +}​
      +
      +
    6. +
    7. Centang Semua segmen telah dibilas.

      +
      cat flushing_segments.json|  curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​
      +
      +
      +

      Setelah selesai, Anda akan melihat keluaran berikut ini

      +
      {"status":{},"flushed":true}​
      +
      +
    8. +
    9. Hentikan proses latar belakang kubectl port-forward

      +
      kill $pid​
      +
      +
      +

      Keluaran.

      +
      [1]  + 8116 terminated  kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091                      ​
      +
      +
    10. +
    +

    Hentikan Milvus dan hapus Pulsar V2

    Pada langkah ini, Anda perlu menghentikan pod Milvus dan menghapus penyebaran Pulsar V2. Ada dua bagian terpisah yang tersedia:

    + +

    Menghapus Pulsar V2 menggunakan Helm

    Jika Anda telah menginstal Milvus menggunakan grafik Milvus Helm, ikuti langkah-langkah di bawah ini untuk menghentikan pod Milvus dan menghapus penyebaran Pulsar V2.

    +
      +
    1. Simpan nilai rilis Milvus saat ini ke values.yaml untuk pemulihan nanti.

      +
      helm -n default get values my-release -o yaml > values.yaml​
      +cat values.yaml​
      +
      +
    2. +
    3. Gunakan perintah ini untuk menghentikan Milvus dan semua dependensinya. Jangan khawatir tentang volume data, mereka akan disimpan secara default.

      +
      helm -n default uninstall my-release​
      +
      +
      +

      Keluaran

      +
      These resources were kept due to the resource policy:​
      +[PersistentVolumeClaim] my-release-minio​
      +​
      +release "my-release" uninstalled​
      +
      +
    4. +
    5. Daftar PVC & PV pulsar (Klaim Volume Persisten & Volume Persisten) yang perlu dihapus

      +
      kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​
      +kubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​
      +echo "Volume Claims:"​
      +cat pulsar-pvcs.txt​
      +echo "Volumes:"​
      +cat pulsar-pvs.txt​
      +
      +
      +

      Keluaran

      +
      Volume Claims:​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​
      +my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​
      +Volumes:​
      +pvc-f590a4de-df31-4ca8-a424-007eac3c619a​
      +pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​
      +pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​
      +pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​
      +pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​
      +
      +
    6. +
    7. Periksa apakah daftar PVC dari pulsar-pvcs.txt semuanya untuk Pulsar. Setelah Anda mengonfirmasi bahwa tidak ada kesalahan, hapus PVC.

      +
      cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      Keluaran.

      +
      persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0" deleted​
      +
      +
    8. +
    9. (Opsional) Tergantung pada kelas penyimpanan yang menyediakan PVC, Anda mungkin juga perlu menghapus PV secara manual.

      +
      cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      Tidak masalah jika keluarannya adalah kesalahan NotFound. Itu sudah dihapus oleh pengontrol kubernetes.

      +
      Error from server (NotFound): persistentvolumeclaims "pvc-f590a4de-df31-4ca8-a424-007eac3c619a" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a" not found​
      +
      +
    10. +
    +

    Menghapus Pulsar V2 menggunakan Operator Milvus

    Jika Anda telah menginstal Milvus menggunakan Milvus Operator, ikuti langkah-langkah di bawah ini untuk menghentikan pod Milvus dan menghapus penyebaran Pulsar V2.

    +
      +
    1. Simpan Manifes Milvus saat ini ke milvus.yaml untuk digunakan di kemudian hari.

      +
      kubectl -n default get milvus my-release -o yaml > milvus.yaml​
      +head milvus.yaml -n 20​
      +
      +
      +

      Keluaran.

      +
      apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations:​
      +    milvus.io/dependency-values-merged: "true"​
      +    milvus.io/pod-service-label-added: "true"​
      +    milvus.io/querynode-current-group-id: "0"​
      +  creationTimestamp: "2024-11-22T08:06:59Z"​
      +  finalizers:​
      +  - milvus.milvus.io/finalizer​
      +  generation: 3​
      +  labels:​
      +    app: milvus​
      +    milvus.io/operator-version: 1.1.2​
      +name: my-release​
      +namespace: default​
      +resourceVersion: "692217324"​
      +uid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​
      +spec:​
      +  components:​
      +
      +
    2. +
    3. Buat berkas patch.yaml dengan konten berikut ini.

      +
      # a patch to retain etcd & storage data and delete pulsar data while delete milvus​
      +spec:​
      +  dependencies:​
      +    etcd:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    storage:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    pulsar:​
      +      inCluster:​
      +        deletionPolicy: Delete​
      +        pvcDeletion: true​
      +
      +
    4. +
    5. Gunakan kubectl patch untuk menyimpan data etcd & penyimpanan dan menghapus data pulsar saat menghapus milvus.

      +
      kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​
      +
      +
      +

      Keluaran.

      +
      milvus.milvus.io/my-release patched​
      +
      +
    6. +
    7. Hentikan Milvus dan hapus pulsar V2. Jangan khawatir dengan volume data penyimpanan etcd & objek, mereka akan disimpan secara default.

      +
      kubectl -n default delete milvus my-release --wait=false​
      +kubectl -n default get milvus my-release​
      +kubectl -n default delete milvus my-release --wait=true​
      +
      +
      +

      Keluaran: Perhatikan bahwa mungkin diperlukan beberapa menit bagi milvus untuk berhenti secara perlahan dan bagi operator untuk menghapus volume pulsar.

      +
      milvus.milvus.io "my-release" deleted​
      +NAME         MODE      STATUS     UPDATED   AGE​
      +my-release   cluster   Deleting   True      41m​
      +milvus.milvus.io "my-release" deleted​
      +
      +
      +

      Tunggu sampai perintah selesai.

    8. +
    9. Periksa lagi untuk melihat apakah sumber daya milvus sudah hilang

      +
      kubectl -n default get milvus my-release​
      +
      +
      +

      Keluarannya seharusnya seperti ini.

      +
      No resources found in default namespace.​
      +
      +
    10. +
    +

    Memulai Pulsar V3 dan Milvus

    Pada langkah ini, Anda harus memulai Pulsar V3 dan Milvus. Ada dua bagian terpisah yang tersedia:

    +
      +
    • Untuk Pengguna Helm

      +

      Jika Anda telah menginstal Milvus menggunakan bagan Helm Milvus, masuk ke Untuk Pengguna Helm.

    • +
    • Untuk pengguna Operator Milvus

      +

      Jika Anda telah menginstal Milvus menggunakan Milvus Operator, masuk ke Untuk Pengguna Milvus Operator.

    • +
    +

    3. Mulai Pulsar V3 dan menggunakan Helm

      +
    1. Edit values.yaml yang telah disimpan pada langkah sebelumnya.

      +
      # change the following:​
      +pulsar:​
      +  enabled: false # set to false​
      +  # you may also clean up rest fields under pulsar field​
      +  # it's ok to keep them though.​
      +pulsarv3:​
      +  enabled: true​
      +  # append other values for pulsar v3 chart if needs​
      +
      +
    2. +
    3. Perbarui repositori helm lokal anda

      +
      helm repo add zilliztech https://zilliztech.github.io/milvus-helm​
      +helm repo update zilliztech​
      +
      +
      +

      Keluaran

      +
      "zilliztech" already exists with the same configuration, skipping​
      +Hang tight while we grab the latest from your chart repositories...​
      +...Successfully got an update from the "zilliztech" chart repository​
      +Update Complete. ⎈Happy Helming!⎈​
      +
      +
    4. +
    5. Instal rilis milvus Anda dengan versi helm chart terbaru menggunakan values.yaml yang telah diedit.

      +
      helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​
      +
      +
      +

      Keluaran

      +
      NAME: my-release​
      +LAST DEPLOYED: Fri Nov 22 15:31:27 2024​
      +NAMESPACE: default​
      +STATUS: deployed​
      +REVISION: 1​
      +TEST SUITE: None​
      +
      +
    6. +
    7. Periksa pods untuk melihat apakah semuanya sudah dijadwalkan dan berjalan dengan kubectl -n default get pods.

      +

      Mungkin perlu beberapa menit agar semua pod dapat berjalan

      +

      Keluarannya akan terlihat seperti.

      +
      NAME                                          READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                             1/1     Running     0          4m3s​
      +my-release-milvus-datanode-56487bc4bc-s6mbd   1/1     Running     0          4m5s​
      +my-release-milvus-indexnode-6476894d6-rv85d   1/1     Running     0          4m5s​
      +my-release-milvus-mixcoord-6d8875cb9c-67fcq   1/1     Running     0          4m4s​
      +my-release-milvus-proxy-7bc45d57c5-2qf8m      1/1     Running     0          4m4s​
      +my-release-milvus-querynode-77465747b-kt7f4   1/1     Running     0          4m4s​
      +my-release-minio-684ff4f5df-pnc97             1/1     Running     0          4m5s​
      +my-release-pulsarv3-bookie-0                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-1                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-2                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-init-6z4tk         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-broker-0                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-broker-1                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-0                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-1                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-pulsar-init-wvqpc         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-recovery-0                1/1     Running     0          4m3s​
      +my-release-pulsarv3-zookeeper-0               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-1               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-2               1/1     Running     0          4m2s​
      +
      +
    8. +
    +

    Mulai Pulsar V3 dan gunakan Milvus Operator

      +
    1. Edit milvus.yaml yang disimpan pada Langkah sebelumnya.

      +
      # change the followings fields:​
      +apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations: null # this field should be removed or set to null​
      +  resourceVersion: null # this field should be removed or set to null​
      +  uid: null # this field should be removed or set to null​
      +spec:​
      +  dependencies:​
      +    pulsar:​
      +      inCluster:​
      +        chartVersion: pulsar-v3​
      +        # delete all previous values for pulsar v2 and set it to null.​
      +        # you may add additional values here for pulsar v3 if you're sure about it.​
      +        values: null​
      +
      +
    2. +
    3. Pastikan Milvus Operator anda sudah diupgrade ke versi v1.1.2 atau versi yang lebih baru

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​
      +helm repo update milvus-operator​
      +helm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​
      +
      +
      +

      Gunakan perintah untuk memulai milvus dengan pulsar v3

      +
      kubectl create -f milvus.yaml​
      +
      +
      +

      Keluaran

      +
      milvus.milvus.io/my-release created​
      +
      +
    4. +
    5. Periksa pod untuk melihat apakah semuanya sudah dijadwalkan dan berjalan dengan kubectl -n default get pods.

      +

      Mungkin perlu beberapa menit agar semua pod dapat dimulai.

      +

      Keluarannya akan terlihat seperti.

      +
      NAME                                            READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                               1/1     Running     0          65m​
      +my-release-milvus-datanode-57fd59ff58-5mdrk     1/1     Running     0          93s​
      +my-release-milvus-indexnode-67867c6b9b-4wsbw    1/1     Running     0          93s​
      +my-release-milvus-mixcoord-797849f9bb-sf8z5     1/1     Running     0          93s​
      +my-release-milvus-proxy-5d5bf98445-c55m6        1/1     Running     0          93s​
      +my-release-milvus-querynode-0-64797f5c9-lw4rh   1/1     Running     0          92s​
      +my-release-minio-79476ccb49-zvt2h               1/1     Running     0          65m​
      +my-release-pulsar-bookie-0                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-2                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-init-v8fdj             0/1     Completed   0          5m11s​
      +my-release-pulsar-broker-0                      1/1     Running     0          5m11s​
      +my-release-pulsar-broker-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-proxy-0                       1/1     Running     0          5m11s​
      +my-release-pulsar-proxy-1                       1/1     Running     0          5m10s​
      +my-release-pulsar-pulsar-init-5lhx7             0/1     Completed   0          5m11s​
      +my-release-pulsar-recovery-0                    1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-0                   1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-1                   1/1     Running     0          5m10s​
      +my-release-pulsar-zookeeper-2                   1/1     Running     0          5m10s​
      +
      +
    6. +
    +

    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.json new file mode 100644 index 000000000..f61acacc0 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nrootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.5.3\n...\nproxy:\n container_name: milvus-proxy\n image: milvusdb/milvus:v2.5.3\n...\nquerycoord:\n container_name: milvus-querycoord\n image: milvusdb/milvus:v2.5.3 \n...\nquerynode:\n container_name: milvus-querynode\n image: milvusdb/milvus:v2.5.3\n...\nindexcoord:\n container_name: milvus-indexcoord\n image: milvusdb/milvus:v2.5.3\n...\nindexnode:\n container_name: milvus-indexnode\n image: milvusdb/milvus:v2.5.3 \n...\ndatacoord:\n container_name: milvus-datacoord\n image: milvusdb/milvus:v2.5.3 \n...\ndatanode:\n container_name: milvus-datanode\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","Update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Cluster with Docker Compose","anchorList":[{"label":"Memutakhirkan Milvus Cluster dengan Docker Compose","href":"Upgrade-Milvus-Cluster-with-Docker-Compose","type":1,"isActive":false},{"label":"Memutakhirkan Milvus dengan mengubah citranya","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Memigrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.md new file mode 100644 index 000000000..d7c828f35 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-docker.md @@ -0,0 +1,154 @@ +--- +id: upgrade_milvus_cluster-docker.md +summary: Pelajari cara meningkatkan cluster Milvus dengan Docker Compose. +title: Memutakhirkan Milvus Cluster dengan Docker Compose +--- + +

    Memutakhirkan Milvus Cluster dengan Docker Compose

    Topik ini menjelaskan cara memutakhirkan Milvus menggunakan Docker Compose.

    +

    Dalam kasus normal, Anda dapat memutakhirkan Milvus dengan mengubah citranya. Namun, Anda perlu memigrasikan metadata sebelum melakukan pemutakhiran apa pun dari v2.1.x ke v2.5.3.

    +

    Memutakhirkan Milvus dengan mengubah citranya

    Dalam kasus normal, Anda dapat memutakhirkan Milvus dengan cara berikut:

    +
      +
    1. Ubahlah tag gambar Milvus di docker-compose.yaml.

      +

      Perhatikan bahwa Anda perlu mengubah tag image untuk Proxy, semua koordinator, dan semua node pekerja.

      +
      ...
      +rootcoord:
      +  container_name: milvus-rootcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +proxy:
      +  container_name: milvus-proxy
      +  image: milvusdb/milvus:v2.5.3
      +...
      +querycoord:
      +  container_name: milvus-querycoord
      +  image: milvusdb/milvus:v2.5.3  
      +...
      +querynode:
      +  container_name: milvus-querynode
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexcoord:
      +  container_name: milvus-indexcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexnode:
      +  container_name: milvus-indexnode
      +  image: milvusdb/milvus:v2.5.3 
      +...
      +datacoord:
      +  container_name: milvus-datacoord
      +  image: milvusdb/milvus:v2.5.3   
      +...
      +datanode:
      +  container_name: milvus-datanode
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. Jalankan perintah berikut untuk melakukan peningkatan.

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    Memigrasi metadata

      +
    1. Hentikan semua komponen Milvus.

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. Siapkan berkas konfigurasi migrate.yaml untuk migrasi metadata.

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. Jalankan kontainer migrasi.

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. Mulai kembali komponen Milvus dengan citra Milvus yang baru.

      +
      Update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.json new file mode 100644 index 000000000..9e50f56d3 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update zilliztech\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update zilliztech\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nnew-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4 \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 21m\nmy-release-etcd-1 1/1 Running 0 21m\nmy-release-etcd-2 1/1 Running 0 21m\nmy-release-milvus-datacoord-664c58798d-fl75s 1/1 Running 0 21m\nmy-release-milvus-datanode-5f75686c55-xfg2r 1/1 Running 0 21m\nmy-release-milvus-indexcoord-5f98b97589-2l48r 1/1 Running 0 21m\nmy-release-milvus-indexnode-857b4ddf98-vmd75 1/1 Running 0 21m\nmy-release-milvus-proxy-6c548f787f-scspp 1/1 Running 0 21m\nmy-release-milvus-querycoord-c454f44cd-dwmwq 1/1 Running 0 21m\nmy-release-milvus-querynode-76bb4946d-lbrz6 1/1 Running 0 21m\nmy-release-milvus-rootcoord-7764c5b686-62msm 1/1 Running 0 21m\nmy-release-minio-0 1/1 Running 0 21m\nmy-release-minio-1 1/1 Running 0 21m\nmy-release-minio-2 1/1 Running 0 21m\nmy-release-minio-3 1/1 Running 0 21m\nmy-release-pulsar-bookie-0 1/1 Running 0 21m\nmy-release-pulsar-bookie-1 1/1 Running 0 21m\nmy-release-pulsar-bookie-2 1/1 Running 0 21m\nmy-release-pulsar-bookie-init-tjxpj 0/1 Completed 0 21m\nmy-release-pulsar-broker-0 1/1 Running 0 21m\nmy-release-pulsar-proxy-0 1/1 Running 0 21m\nmy-release-pulsar-pulsar-init-c8vvc 0/1 Completed 0 21m\nmy-release-pulsar-recovery-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 20m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 20m\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0\n"],"headingContent":"Upgrade Milvus Cluster with Helm Chart","anchorList":[{"label":"Tingkatkan Cluster Milvus dengan Helm Chart","href":"Upgrade-Milvus-Cluster-with-Helm-Chart","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Memeriksa Bagan Helm Milvus","href":"Check-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"Melakukan pemutakhiran bergilir","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Memutakhirkan Milvus menggunakan Helm","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"Memigrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.md new file mode 100644 index 000000000..df43d42a5 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-helm.md @@ -0,0 +1,281 @@ +--- +id: upgrade_milvus_cluster-helm.md +label: Helm +order: 1 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: Pelajari cara meningkatkan klaster Milvus dengan Helm Chart. +title: Tingkatkan Cluster Milvus dengan Helm Chart +--- + +

    Tingkatkan Cluster Milvus dengan Helm Chart

    Panduan ini menjelaskan cara mengupgrade cluster Milvus Anda dengan grafik Helm Milvus.

    +

    Prasyarat

      +
    • Versi Helm >= 3.14.0
    • +
    • Versi Kubernetes >= 1.20.0
    • +
    +
    +

    Sejak grafik Milvus-Helm versi 4.2.21, kami memperkenalkan grafik pulsar-v3.x sebagai ketergantungan. Untuk kompatibilitas ke belakang, silakan tingkatkan helm Anda ke versi v3.14 atau versi yang lebih baru, dan pastikan untuk menambahkan opsi --reset-then-reuse-values setiap kali Anda menggunakan helm upgrade.

    +
    +

    Memeriksa Bagan Helm Milvus

    Jalankan perintah berikut ini untuk memeriksa versi Milvus yang baru.

    +
    $ helm repo update zilliztech
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    Repo Milvus Helm Charts di https://milvus-io.github.io/milvus-helm/ telah diarsipkan dan Anda dapat memperoleh pembaruan lebih lanjut dari https://zilliztech.github.io/milvus-helm/ sebagai berikut:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    Repo yang diarsipkan masih tersedia untuk grafik hingga versi 4.0.31. Untuk rilis yang lebih baru, gunakan repo yang baru.

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    Anda dapat memilih jalur upgrade untuk Milvus Anda sebagai berikut:

    +
    - [Lakukan peningkatan bergilir] (#melakukan-peningkatan bergilir) dari Milvus v2.2.3 dan rilis yang lebih baru ke v2.5.3.
    + +
    +

    Melakukan pemutakhiran bergilir

    Sejak Milvus 2.2.3, Anda dapat mengkonfigurasi koordinator Milvus untuk bekerja dalam mode siaga aktif dan mengaktifkan fitur peningkatan bergilir untuk mereka, sehingga Milvus dapat menanggapi permintaan yang masuk selama peningkatan koordinator. Pada rilis sebelumnya, koordinator akan dihapus dan kemudian dibuat selama peningkatan, yang dapat menyebabkan waktu henti tertentu pada layanan.

    +

    Upgrade bergulir mengharuskan koordinator untuk bekerja dalam mode siaga aktif. Anda dapat menggunakan skrip yang kami sediakan untuk mengonfigurasi koordinator agar bekerja dalam mode siaga aktif dan memulai pemutakhiran bergulir.

    +

    Berdasarkan kemampuan pembaruan bergulir yang disediakan oleh Kubernetes, skrip di atas memberlakukan pembaruan terurut dari penyebaran sesuai dengan dependensinya. Selain itu, Milvus mengimplementasikan mekanisme untuk memastikan bahwa komponen-komponennya tetap kompatibel dengan komponen-komponen yang bergantung padanya selama peningkatan, sehingga secara signifikan mengurangi potensi waktu henti layanan.

    +

    Skrip ini hanya berlaku untuk peningkatan Milvus yang diinstal dengan Helm. Tabel berikut mencantumkan flag perintah yang tersedia dalam skrip.

    + + + + + + + + + + + +
    ParameterDeskripsiNilai defaultDiperlukan
    iNama instance MilvusNoneBenar
    nRuang nama tempat Milvus diinstaldefaultSalah
    tVersi Milvus yang ditargetkanNoneBenar
    wTag gambar Milvus yang barumilvusdb/milvus:v2.2.3Benar
    oOperasiupdateSalah
    +

    Setelah Anda memastikan bahwa semua deployment dalam instans Milvus Anda berada dalam status normal. Anda dapat menjalankan perintah berikut untuk meng-upgrade instans Milvus ke 2.5.3.

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. Skrip ini mengkodekan urutan peningkatan dari deployment dan tidak dapat diubah.
    2. +
    3. Skrip ini menggunakan kubectl patch untuk memperbarui deployment dan kubectl rollout status untuk melihat statusnya.
    4. +
    5. Skrip menggunakan kubectl patch untuk memperbarui label app.kubernetes.io/version pada deployment ke label yang ditentukan setelah bendera -t pada perintah.
    6. +
    +
    +
    +

    Memutakhirkan Milvus menggunakan Helm

    Untuk memutakhirkan Milvus dari rilis minor sebelum v2.2.3 ke versi terbaru, jalankan perintah berikut:

    +
    helm repo update zilliztech
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    Gunakan versi grafik Helm pada perintah sebelumnya. Untuk detail mengenai cara mendapatkan versi grafik Helm, lihat Memeriksa versi Milvus.

    +

    Memigrasi metadata

    Sejak Milvus 2.2.0, metadata tidak kompatibel dengan metadata pada rilis sebelumnya. Contoh cuplikan berikut ini mengasumsikan upgrade dari Milvus 2.1.4 ke Milvus 2.2.0.

    +

    1. Memeriksa versi Milvus

    Jalankan $ helm list untuk memeriksa versi aplikasi Milvus Anda. Anda dapat melihat bahwa APP VERSION adalah 2.1.4.

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION    
    +new-release         default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4 
    +
    +

    2. Memeriksa pod yang sedang berjalan

    Jalankan $ kubectl get pods untuk memeriksa pod yang sedang berjalan. Anda dapat melihat keluaran berikut ini.

    +
    NAME                                             READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          21m
    +my-release-etcd-1                               1/1     Running     0          21m
    +my-release-etcd-2                               1/1     Running     0          21m
    +my-release-milvus-datacoord-664c58798d-fl75s    1/1     Running     0          21m
    +my-release-milvus-datanode-5f75686c55-xfg2r     1/1     Running     0          21m
    +my-release-milvus-indexcoord-5f98b97589-2l48r   1/1     Running     0          21m
    +my-release-milvus-indexnode-857b4ddf98-vmd75    1/1     Running     0          21m
    +my-release-milvus-proxy-6c548f787f-scspp        1/1     Running     0          21m
    +my-release-milvus-querycoord-c454f44cd-dwmwq    1/1     Running     0          21m
    +my-release-milvus-querynode-76bb4946d-lbrz6     1/1     Running     0          21m
    +my-release-milvus-rootcoord-7764c5b686-62msm    1/1     Running     0          21m
    +my-release-minio-0                              1/1     Running     0          21m
    +my-release-minio-1                              1/1     Running     0          21m
    +my-release-minio-2                              1/1     Running     0          21m
    +my-release-minio-3                              1/1     Running     0          21m
    +my-release-pulsar-bookie-0                      1/1     Running     0          21m
    +my-release-pulsar-bookie-1                      1/1     Running     0          21m
    +my-release-pulsar-bookie-2                      1/1     Running     0          21m
    +my-release-pulsar-bookie-init-tjxpj             0/1     Completed   0          21m
    +my-release-pulsar-broker-0                      1/1     Running     0          21m
    +my-release-pulsar-proxy-0                       1/1     Running     0          21m
    +my-release-pulsar-pulsar-init-c8vvc             0/1     Completed   0          21m
    +my-release-pulsar-recovery-0                    1/1     Running     0          21m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          21m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          20m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          20m
    +
    +

    3. Memeriksa tag gambar

    Periksa tag gambar untuk pod my-release-milvus-proxy-6c548f787f-scspp. Anda dapat melihat rilis klaster Milvus Anda adalah v2.1.4.

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4. Migrasi metadata

    Perubahan besar di Milvus 2.2 adalah struktur metadata dari indeks segmen. Oleh karena itu, Anda perlu menggunakan Helm untuk memigrasikan metadata ketika mengupgrade Milvus dari v2.1.x ke v2.2.0. Berikut ini adalah skrip untuk memigrasikan metadata Anda dengan aman.

    +

    Skrip ini hanya berlaku untuk Milvus yang diinstal pada cluster K8s. Kembalikan ke versi sebelumnya dengan operasi rollback terlebih dahulu jika terjadi kesalahan selama proses.

    +

    Tabel berikut mencantumkan operasi yang dapat Anda lakukan untuk migrasi metadata.

    + + + + + + + + + + + + + + + + + +
    ParameterDeskripsiNilai defaultWajib diisi
    iNama instance Milvus.NoneTrue
    nRuang nama tempat Milvus diinstal.defaultFalse
    sVersi Milvus sumber.NoneTrue
    tVersi Milvus target.NoneBenar
    rJalur akar dari meta Milvus.by-devSalah
    wTag gambar Milvus yang baru.milvusdb/milvus:v2.2.0False
    mTag gambar migrasi meta.milvusdb/meta-migration:v2.2.0False
    oOperasi migrasi meta.migrateFalse
    dApakah akan menghapus pod migrasi setelah migrasi selesai.falseFalse
    cKelas penyimpanan untuk meta migrasi pvc.default storage classFalse
    eEnpoint etcd yang digunakan oleh milvus.etcd svc installed with milvusFalse
    +

    1. Memigrasi metadata

      +
    1. Unduh skrip migrasi.
    2. +
    3. Hentikan komponen Milvus. Sesi live apa pun di Milvus etcd dapat menyebabkan kegagalan migrasi.
    4. +
    5. Buat cadangan untuk metadata Milvus.
    6. +
    7. Migrasi metadata Milvus.
    8. +
    9. Memulai komponen Milvus dengan image baru.
    10. +
    +

    2. Memutakhirkan Milvus dari v2.1.x ke 2.2.0

    Perintah berikut ini mengasumsikan bahwa Anda memutakhirkan Milvus dari v2.1.4 ke 2.2.0. Ubahlah ke versi yang sesuai dengan kebutuhan Anda.

    +
      +
    1. Tentukan nama instans Milvus, versi Milvus sumber, dan versi Milvus target.

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.2.0
      +
    2. +
    3. Tentukan namespace dengan -n jika Milvus Anda tidak terinstal pada namespace default K8s.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0
      +
    4. +
    5. Tentukan jalur root dengan -r jika Milvus Anda terinstalasi dengan rootpath.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev
      +
    6. +
    7. Tentukan tag gambar dengan -w jika Milvus Anda terinstalasi dengan image.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0
      +
    8. +
    9. Tetapkan -d true jika Anda ingin menghapus pod migrasi secara otomatis setelah migrasi selesai.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true
      +
    10. +
    11. Kembalikan dan migrasi lagi jika migrasi gagal.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0
      +
    12. +
    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.json new file mode 100644 index 000000000..6daf0f23c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Cluster with Milvus Operator","anchorList":[{"label":"Meningkatkan Cluster Milvus dengan Operator Milvus","href":"Upgrade-Milvus-Cluster-with-Milvus-Operator","type":1,"isActive":false},{"label":"Tingkatkan operator Milvus Anda","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"Melakukan pemutakhiran bergilir","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Memutakhirkan Milvus dengan mengubah citranya","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Migrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.md new file mode 100644 index 000000000..fac1f2078 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_cluster-operator.md @@ -0,0 +1,179 @@ +--- +id: upgrade_milvus_cluster-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: Pelajari cara meng-upgrade cluster Milvus dengan Milvus Operator. +title: Meningkatkan Cluster Milvus dengan Operator Milvus +--- + +

    Meningkatkan Cluster Milvus dengan Operator Milvus

    Panduan ini menjelaskan cara mengupgrade cluster Milvus Anda dengan operator Milvus.

    +

    Tingkatkan operator Milvus Anda

    Jalankan perintah berikut untuk mengupgrade versi Operator Milvus Anda ke v1.0.1.

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    Setelah Anda mengupgrade operator Milvus Anda ke versi terbaru, Anda memiliki beberapa pilihan berikut:

    + +

    Melakukan pemutakhiran bergilir

    Sejak Milvus 2.2.3, Anda dapat mengonfigurasi koordinator Milvus untuk bekerja dalam mode siaga aktif dan mengaktifkan fitur peningkatan bergilir untuk mereka, sehingga Milvus dapat merespon permintaan yang masuk selama peningkatan koordinator. Pada rilis sebelumnya, koordinator akan dihapus dan kemudian dibuat selama peningkatan, yang dapat menyebabkan waktu henti tertentu pada layanan.

    +

    Berdasarkan kemampuan pembaruan bergulir yang disediakan oleh Kubernetes, operator Milvus memberlakukan pembaruan yang teratur pada penerapan sesuai dengan ketergantungannya. Selain itu, Milvus mengimplementasikan mekanisme untuk memastikan bahwa komponennya tetap kompatibel dengan komponen yang bergantung padanya selama peningkatan, sehingga secara signifikan mengurangi potensi downtime layanan.

    +

    Fitur peningkatan bergulir dinonaktifkan secara default. Anda perlu mengaktifkannya secara eksplisit melalui file konfigurasi.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Pada file konfigurasi di atas, atur spec.components.enableRollingUpdate ke true dan atur spec.components.image ke versi Milvus yang diinginkan.

    +

    Secara default, Milvus melakukan pemutakhiran bergilir untuk koordinator dengan cara berurutan, di mana Milvus mengganti image pod koordinator satu demi satu. Untuk mengurangi waktu peningkatan, pertimbangkan untuk mengatur spec.components.imageUpdateMode ke all sehingga Milvus mengganti semua gambar pod pada waktu yang sama.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Anda dapat mengatur spec.components.imageUpdateMode ke rollingDowngrade agar Milvus mengganti image pod koordinator dengan versi yang lebih rendah.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-old-version>
    +
    +

    Kemudian simpan konfigurasi Anda sebagai berkas YAML (misalnya, milvusupgrade.yml) dan tambal berkas konfigurasi ini ke instans Milvus Anda sebagai berikut:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    Memutakhirkan Milvus dengan mengubah citranya

    Pada kasus normal, Anda cukup memperbarui Milvus Anda ke versi terbaru dengan mengubah image-nya. Namun, perhatikan bahwa akan ada waktu henti tertentu saat mengupgrade Milvus dengan cara ini.

    +

    Buatlah berkas konfigurasi sebagai berikut dan simpan sebagai milvusupgrade.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    Kemudian jalankan perintah berikut ini untuk melakukan peningkatan:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    Migrasi metadata

    Sejak Milvus 2.2.0, metadata tidak kompatibel dengan metadata pada rilis sebelumnya. Contoh cuplikan berikut mengasumsikan peningkatan dari Milvus 2.1.4 ke Milvus 2.5.3.

    +

    1. Buat file .yaml untuk migrasi metadata

    Buatlah file migrasi metadata. Berikut ini adalah contohnya. Anda perlu menentukan name, sourceVersion, dan targetVersion dalam file konfigurasi. Contoh berikut ini mengatur name ke my-release-upgrade, sourceVersion ke v2.1.4, dan targetVersion ke v2.5.3. Ini berarti bahwa cluster Milvus Anda akan ditingkatkan dari v2.1.4 ke v2.5.3.

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2. Menerapkan konfigurasi baru

    Jalankan perintah berikut untuk membuat konfigurasi baru.

    +
    $ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml
    +
    +

    3. Memeriksa status migrasi metadata

    Jalankan perintah berikut untuk memeriksa status migrasi metadata Anda.

    +
    kubectl describe milvus release-name
    +
    +

    Status ready pada keluaran berarti migrasi metadata berhasil.

    +

    Atau, Anda juga dapat menjalankan kubectl get pod untuk memeriksa semua pod. Jika semua pod adalah ready, migrasi metadata berhasil.

    +

    4. Hapus my-release-upgrade

    Jika peningkatan berhasil, hapus my-release-upgrade dalam berkas YAML.

    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.json new file mode 100644 index 000000000..9734081f8 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nstandalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","// Run the following only after update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Standalone with Docker Compose","anchorList":[{"label":"Memutakhirkan Milvus Standalone dengan Docker Compose","href":"Upgrade-Milvus-Standalone-with-Docker-Compose","type":1,"isActive":false},{"label":"Tingkatkan Milvus dengan mengubah gambarnya","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Memigrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.md new file mode 100644 index 000000000..20a58591c --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-docker.md @@ -0,0 +1,132 @@ +--- +id: upgrade_milvus_standalone-docker.md +label: Docker Compose +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: Pelajari cara meng-upgrade Milvus mandiri dengan Docker Compose. +title: Memutakhirkan Milvus Standalone dengan Docker Compose +--- + +

    Memutakhirkan Milvus Standalone dengan Docker Compose

    Topik ini menjelaskan cara memutakhirkan Milvus menggunakan Docker Compose.

    +

    Dalam kasus normal, Anda dapat memutakhirkan Milvus dengan mengubah citranya. Namun, Anda perlu memigrasikan metadata sebelum melakukan pemutakhiran apa pun dari v2.1.x ke v2.5.3.

    +
    +

    Karena masalah keamanan, Milvus mengupgrade MinIO ke RELEASE.2023-03-20T20-16-18Z dengan rilis v2.2.5. Sebelum peningkatan apa pun dari rilis Milvus Standalone sebelumnya diinstal menggunakan Docker Compose, Anda harus membuat penerapan MinIO Single-Node Single-Drive dan memigrasikan pengaturan dan konten MinIO yang sudah ada ke penerapan yang baru. Untuk detailnya, lihat panduan ini.

    +
    +

    Tingkatkan Milvus dengan mengubah gambarnya

    Dalam kasus normal, Anda dapat mengupgrade Milvus sebagai berikut:

    +
      +
    1. Ubah tag image Milvus di docker-compose.yaml.

      +
      ...
      +standalone:
      +  container_name: milvus-standalone
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. Jalankan perintah berikut untuk melakukan pemutakhiran.

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    Memigrasi metadata

      +
    1. Hentikan semua komponen Milvus.

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. Siapkan berkas konfigurasi migration.yaml untuk migrasi metadata.

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. Jalankan kontainer migrasi.

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. Mulai kembali komponen Milvus dengan citra Milvus yang baru.

      +
      // Run the following only after update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.json new file mode 100644 index 000000000..cbf1dca3f --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update zilliztech\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update\nhelm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nmy-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 84s\nmy-release-milvus-standalone-75c599fffc-6rwlj 1/1 Running 0 84s\nmy-release-minio-744dd9586f-qngzv 1/1 Running 0 84s\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3\n"],"headingContent":"Upgrade Milvus Standalone with Helm Chart","anchorList":[{"label":"Meningkatkan Milvus Standalone dengan Helm Chart","href":"Upgrade-Milvus-Standalone-with-Helm-Chart","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Memeriksa versi Milvus","href":"Check-the-Milvus-version","type":2,"isActive":false},{"label":"Melakukan pemutakhiran bergilir","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Memutakhirkan Milvus menggunakan Helm","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"Memigrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.md new file mode 100644 index 000000000..9cb7d4463 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-helm.md @@ -0,0 +1,259 @@ +--- +id: upgrade_milvus_standalone-helm.md +label: Helm +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: Pelajari cara meng-upgrade Milvus mandiri dengan Helm Chart. +title: Meningkatkan Milvus Standalone dengan Helm Chart +--- + +

    Meningkatkan Milvus Standalone dengan Helm Chart

    Panduan ini menjelaskan cara mengupgrade Milvus standalone Anda dengan Milvus Helm chart.

    +

    Prasyarat

      +
    • Versi Helm >= 3.14.0
    • +
    • Versi Kubernetes >= 1.20.0
    • +
    +
    +

    Sejak grafik Milvus-Helm versi 4.2.21, kami memperkenalkan grafik pulsar-v3.x sebagai ketergantungan. Untuk kompatibilitas ke belakang, harap tingkatkan helm Anda ke versi v3.14 atau versi yang lebih baru, dan pastikan untuk menambahkan opsi --reset-then-reuse-values setiap kali Anda menggunakan helm upgrade.

    +
    +

    Memeriksa versi Milvus

    Jalankan perintah berikut ini untuk memeriksa versi Milvus yang baru.

    +
    $ helm repo update
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    Repo Milvus Helm Charts di https://milvus-io.github.io/milvus-helm/ telah diarsipkan dan Anda dapat memperoleh pembaruan lebih lanjut dari https://zilliztech.github.io/milvus-helm/ sebagai berikut:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update zilliztech
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    Repo yang diarsipkan masih tersedia untuk grafik hingga versi 4.0.31. Untuk rilis yang lebih baru, gunakan repo yang baru.

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    Anda dapat memilih jalur upgrade untuk Milvus Anda sebagai berikut:

    +
    - [Lakukan peningkatan bergilir] (#melakukan-peningkatan bergilir) dari Milvus v2.2.3 dan rilis yang lebih baru ke v2.5.3.
    + +
    +

    Melakukan pemutakhiran bergilir

    Sejak Milvus 2.2.3, Anda dapat mengkonfigurasi koordinator Milvus untuk bekerja dalam mode siaga aktif dan mengaktifkan fitur peningkatan bergilir untuk mereka, sehingga Milvus dapat menanggapi permintaan yang masuk selama peningkatan koordinator. Pada rilis sebelumnya, koordinator akan dihapus dan kemudian dibuat selama peningkatan, yang dapat menyebabkan waktu henti tertentu pada layanan.

    +

    Upgrade bergulir mengharuskan koordinator untuk bekerja dalam mode siaga aktif. Anda dapat menggunakan skrip yang kami sediakan untuk mengonfigurasi koordinator agar bekerja dalam mode siaga aktif dan memulai pemutakhiran bergulir.

    +

    Berdasarkan kemampuan pembaruan bergulir yang disediakan oleh Kubernetes, skrip di atas memberlakukan pembaruan terurut dari penyebaran sesuai dengan dependensinya. Selain itu, Milvus mengimplementasikan mekanisme untuk memastikan bahwa komponen-komponennya tetap kompatibel dengan komponen-komponen yang bergantung padanya selama peningkatan, sehingga secara signifikan mengurangi potensi waktu henti layanan.

    +

    Skrip ini hanya berlaku untuk peningkatan Milvus yang diinstal dengan Helm. Tabel berikut mencantumkan flag perintah yang tersedia dalam skrip.

    + + + + + + + + + + + +
    ParameterDeskripsiNilai defaultDiperlukan
    iNama instance MilvusNoneBenar
    nRuang nama tempat Milvus diinstaldefaultSalah
    tVersi Milvus yang ditargetkanNoneBenar
    wTag gambar Milvus yang barumilvusdb/milvus:v2.2.3Benar
    oOperasiupdateSalah
    +

    Setelah Anda memastikan bahwa semua deployment dalam instans Milvus Anda berada dalam status normal. Anda dapat menjalankan perintah berikut untuk meng-upgrade instans Milvus ke 2.5.3.

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. Skrip ini tidak berlaku pada instans Milvus yang terinstalasi dengan RocksMQ.
    2. +
    3. Skrip ini mengkodekan urutan peningkatan penyebaran dan tidak dapat diubah.
    4. +
    5. Skrip ini menggunakan kubectl patch untuk memperbarui penyebaran dan kubectl rollout status untuk melihat statusnya.
    6. +
    7. Skrip menggunakan kubectl patch untuk memperbarui label app.kubernetes.io/version pada deployment ke label yang ditentukan setelah bendera -t pada perintah.
    8. +
    +
    +
    +

    Memutakhirkan Milvus menggunakan Helm

    Untuk memutakhirkan Milvus dari rilis minor sebelum v2.2.3 ke versi terbaru, jalankan perintah berikut:

    +
    helm repo update
    +helm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    Gunakan versi grafik Helm pada perintah sebelumnya. Untuk detail mengenai cara mendapatkan versi grafik Helm, lihat Memeriksa versi Milvus.

    +

    Memigrasi metadata

    Sejak Milvus 2.2.0, metadata tidak kompatibel dengan metadata pada rilis sebelumnya. Contoh cuplikan berikut ini mengasumsikan upgrade dari Milvus 2.1.4 ke Milvus 2.2.0.

    +

    1. Memeriksa versi Milvus

    Jalankan $ helm list untuk memeriksa versi aplikasi Milvus Anda. Anda dapat melihat bahwa APP VERSION adalah 2.1.4.

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION     
    +my-release          default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4
    +
    +

    2. Memeriksa pod yang sedang berjalan

    Jalankan $ kubectl get pods untuk memeriksa pod yang sedang berjalan. Anda dapat melihat keluaran berikut ini.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          84s
    +my-release-milvus-standalone-75c599fffc-6rwlj   1/1     Running   0          84s
    +my-release-minio-744dd9586f-qngzv               1/1     Running   0          84s
    +
    +

    3. Memeriksa tag gambar

    Periksa tag gambar untuk pod my-release-milvus-proxy-6c548f787f-scspp. Anda dapat melihat rilis klaster Milvus Anda adalah v2.1.4.

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4. Migrasi metadata

    Perubahan besar di Milvus 2.2 adalah struktur metadata dari indeks segmen. Oleh karena itu, Anda perlu menggunakan Helm untuk memigrasikan metadata ketika mengupgrade Milvus dari v2.1.x ke v2.2.0. Berikut ini adalah skrip untuk memigrasikan metadata Anda dengan aman.

    +

    Skrip ini hanya berlaku untuk Milvus yang diinstal pada cluster K8s. Kembalikan ke versi sebelumnya dengan operasi rollback terlebih dahulu jika terjadi kesalahan selama proses.

    +

    Tabel berikut mencantumkan operasi yang dapat Anda lakukan untuk migrasi metadata.

    + + + + + + + + + + + + + + + + + +
    ParameterDeskripsiNilai defaultWajib diisi
    iNama instance Milvus.NoneTrue
    nRuang nama tempat Milvus diinstal.defaultFalse
    sVersi Milvus sumber.NoneTrue
    tVersi Milvus target.NoneBenar
    rJalur akar dari meta Milvus.by-devSalah
    wTag gambar Milvus yang baru.milvusdb/milvus:v2.2.0False
    mTag gambar migrasi meta.milvusdb/meta-migration:v2.2.0False
    oOperasi migrasi meta.migrateFalse
    dApakah akan menghapus pod migrasi setelah migrasi selesai.falseFalse
    cKelas penyimpanan untuk meta migrasi pvc.default storage classFalse
    eEnpoint etcd yang digunakan oleh milvus.etcd svc installed with milvusFalse
    +

    1. Memigrasi metadata

      +
    1. Unduh skrip migrasi.
    2. +
    3. Hentikan komponen Milvus. Sesi live apa pun di Milvus etcd dapat menyebabkan kegagalan migrasi.
    4. +
    5. Buat cadangan untuk metadata Milvus.
    6. +
    7. Migrasi metadata Milvus.
    8. +
    9. Memulai komponen Milvus dengan image baru.
    10. +
    +

    2. Memutakhirkan Milvus dari v2.1.x ke 2.5.3

    Perintah berikut ini mengasumsikan bahwa Anda memutakhirkan Milvus dari v2.1.4 ke 2.5.3. Ubahlah ke versi yang sesuai dengan kebutuhan Anda.

    +
      +
    1. Tentukan nama instans Milvus, versi Milvus sumber, dan versi Milvus target.

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.5.3
      +
    2. +
    3. Tentukan namespace dengan -n jika Milvus Anda tidak terinstal pada namespace default K8s.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3
      +
    4. +
    5. Tentukan jalur root dengan -r jika Milvus Anda terinstalasi dengan rootpath.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev
      +
    6. +
    7. Tentukan tag gambar dengan -w jika Milvus Anda terinstalasi dengan image.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3
      +
    8. +
    9. Tetapkan -d true jika Anda ingin menghapus pod migrasi secara otomatis setelah migrasi selesai.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true
      +
    10. +
    11. Kembalikan dan migrasi lagi jika migrasi gagal.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3
      +
    12. +
    diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.json b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.json new file mode 100644 index 000000000..aa3bb9990 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nlabels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Standalone with Milvus Operator","anchorList":[{"label":"Mengupgrade Milvus Standalone dengan Milvus Operator","href":"Upgrade-Milvus-Standalone-with-Milvus-Operator","type":1,"isActive":false},{"label":"Memutakhirkan operator Milvus Anda","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"Melakukan pemutakhiran bergilir","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Memutakhirkan Milvus dengan mengubah citranya","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Migrasi metadata","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.md b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.md new file mode 100644 index 000000000..b9b226c3e --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/upgrade_milvus_standalone-operator.md @@ -0,0 +1,181 @@ +--- +id: upgrade_milvus_standalone-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: Pelajari cara meng-upgrade Milvus mandiri dengan operator Milvus. +title: Mengupgrade Milvus Standalone dengan Milvus Operator +--- + +

    Mengupgrade Milvus Standalone dengan Milvus Operator

    Panduan ini menjelaskan cara mengupgrade Milvus standalone Anda dengan operator Milvus.

    +

    Memutakhirkan operator Milvus Anda

    Jalankan perintah berikut untuk mengupgrade versi operator Milvus Anda ke v1.0.1.

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    Setelah Anda mengupgrade operator Milvus Anda ke versi terbaru, Anda memiliki beberapa pilihan berikut:

    + +

    Melakukan pemutakhiran bergilir

    Sejak Milvus 2.2.3, Anda dapat mengonfigurasi koordinator Milvus untuk bekerja dalam mode siaga aktif dan mengaktifkan fitur peningkatan bergilir untuk mereka, sehingga Milvus dapat merespon permintaan yang masuk selama peningkatan koordinator. Pada rilis sebelumnya, koordinator akan dihapus dan kemudian dibuat selama peningkatan, yang dapat menyebabkan waktu henti tertentu pada layanan.

    +

    Berdasarkan kemampuan pembaruan bergulir yang disediakan oleh Kubernetes, operator Milvus memberlakukan pembaruan yang teratur pada penerapan sesuai dengan ketergantungannya. Selain itu, Milvus mengimplementasikan mekanisme untuk memastikan bahwa komponennya tetap kompatibel dengan komponen yang bergantung padanya selama peningkatan, sehingga secara signifikan mengurangi potensi downtime layanan.

    +

    Fitur peningkatan bergulir dinonaktifkan secara default. Anda perlu mengaktifkannya secara eksplisit melalui file konfigurasi.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Pada file konfigurasi di atas, atur spec.components.enableRollingUpdate ke true dan atur spec.components.image ke versi Milvus yang diinginkan.

    +

    Secara default, Milvus melakukan pemutakhiran bergilir untuk koordinator dengan cara berurutan, di mana Milvus mengganti image pod koordinator satu demi satu. Untuk mengurangi waktu peningkatan, pertimbangkan untuk mengatur spec.components.imageUpdateMode ke all sehingga Milvus mengganti semua gambar pod secara bersamaan.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Anda dapat mengatur spec.components.imageUpdateMode ke rollingDowngrade agar Milvus mengganti image pod koordinator dengan versi yang lebih rendah.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-older-version>
    +
    +

    Kemudian simpan konfigurasi Anda sebagai berkas YAML (misalnya, milvusupgrade.yml) dan tambal berkas konfigurasi ini ke instans Milvus Anda sebagai berikut:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    Memutakhirkan Milvus dengan mengubah citranya

    Pada kasus normal, Anda cukup memperbarui Milvus Anda ke versi terbaru dengan mengubah image-nya. Namun, perhatikan bahwa akan ada waktu henti tertentu saat mengupgrade Milvus dengan cara ini.

    +

    Buatlah berkas konfigurasi sebagai berikut dan simpan sebagai milvusupgrade.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +    name: my-release
    +labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    Kemudian jalankan perintah berikut ini untuk melakukan peningkatan:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    Migrasi metadata

    Sejak Milvus 2.2.0, metadata tidak kompatibel dengan metadata pada rilis sebelumnya. Contoh cuplikan berikut mengasumsikan peningkatan dari Milvus 2.1.4 ke Milvus v2.5.3.

    +

    1. Buat file .yaml untuk migrasi metadata

    Buatlah sebuah file migrasi metadata. Berikut ini adalah contohnya. Anda perlu menentukan name, sourceVersion, dan targetVersion dalam file konfigurasi. Contoh berikut ini mengatur name ke my-release-upgrade, sourceVersion ke v2.1.4, dan targetVersion ke v2.5.3. Ini berarti bahwa instans Milvus Anda akan ditingkatkan dari v2.1.4 ke v2.5.3.

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2. Menerapkan konfigurasi baru

    Jalankan perintah berikut untuk menerapkan konfigurasi baru.

    +
    $ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml
    +
    +

    3. Memeriksa status migrasi metadata

    Jalankan perintah berikut untuk memeriksa status migrasi metadata Anda.

    +
    kubectl describe milvus release-name
    +
    +

    Status ready pada keluaran berarti migrasi metadata berhasil.

    +

    Atau, Anda juga dapat menjalankan kubectl get pod untuk memeriksa semua pod. Jika semua pod adalah ready, migrasi metadata berhasil.

    +

    4. Hapus my-release-upgrade

    Jika peningkatan berhasil, hapus my-release-upgrade dalam berkas YAML.

    diff --git a/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.json b/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.json new file mode 100644 index 000000000..33b8cbc91 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.json @@ -0,0 +1 @@ +{"codeList":["namespace=default\nrelease=my-release\nhelm -n ${namespace} get values ${release} -o yaml > values.yaml\ncat values.yaml\n","# ... omit existing values\npulsar:\n enabled: true\npulsarv3:\n enabled: false\nimage:\n all:\n repository: milvusdb/milvus\n tag: v2.5.0-beta \n","helm repo add milvus https://zilliztech.github.io/milvus-helm\nhelm repo update milvus\n","helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml\n","wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n namespace: default\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies:\n pulsar:\n inCluster:\n chartVersion: pulsar-v2\n","kubectl apply -f milvus_cluster_default.yaml\n","helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false\n","pulsar:\n enabled: true\npulsarv3:\n enabled: false\n","helm install my-release milvus/milvus -f values.yaml\n"],"headingContent":"Use Pulsar v2 with Milvus v2.5.x","anchorList":[{"label":"Menggunakan Pulsar v2 dengan Milvus v2.5.x","href":"Use-Pulsar-v2-with-Milvus-v25x","type":1,"isActive":false},{"label":"Melanjutkan penggunaan Pulsar v2 sambil mengupgrade Milvus v2.5.x","href":"Continue-using-Pulsar-v2-while-upgrading-Milvus-v25x","type":2,"isActive":false},{"label":"Membuat instans Milvus baru dengan Pulsar v2","href":"Creating-a-new-Milvus-instance-with-Pulsar-v2","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.md b/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.md new file mode 100644 index 000000000..825cbe692 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/use-pulsar-v2.md @@ -0,0 +1,140 @@ +--- +id: use-pulsar-v2.md +related_key: use pulsar v2 with milvus v2.5.x +summary: >- + Milvus menyarankan Anda untuk meng-upgrade Pulsar ke v3 untuk Milvus v2.5.x. + Namun, jika Anda lebih memilih untuk menggunakan Pulsar v2, artikel ini akan + memandu Anda melalui langkah-langkah untuk terus menggunakan Pulsar v2 dengan + Milvus v2.5.x. +title: Menggunakan Pulsar v2 dengan Milvus v2.5.x +--- +

    Menggunakan Pulsar v2 dengan Milvus v2.5.x

    Milvus menyarankan Anda untuk mengupgrade Pulsar ke v3 untuk menjalankan Milvus v2.5.x. Untuk informasi lebih lanjut, lihat Upgrade Pulsar. Namun, jika Anda lebih suka menggunakan Pulsar v2 dengan Milvus v2.5.x, artikel ini akan memandu Anda melalui prosedur untuk menjalankan Milvus v2.5.x dengan Pulsar v2.

    +

    Jika Anda telah memiliki instans Milvus yang berjalan dan ingin memutakhirkannya ke v2.5.x namun tetap menggunakan Pulsar v2, Anda dapat mengikuti langkah-langkah di halaman ini.

    +

    Melanjutkan penggunaan Pulsar v2 sambil mengupgrade Milvus v2.5.x

    Bagian ini akan memandu Anda melalui langkah-langkah untuk terus menggunakan Pulsar v2 sembari mengupgrade instance Milvus yang sedang berjalan ke Milvus v2.5.x.

    +

    Untuk pengguna Milvus Operator

    Milvus Operator kompatibel dengan peningkatan Pulsar v2 secara default. Anda dapat mengupgrade instance Milvus Anda ke v2.5.x dengan merujuk ke Upgrade Milvus Cluster dengan Milvus Operator.

    +

    Setelah peningkatan selesai, Anda dapat terus menggunakan Pulsar v2 dengan instance Milvus Anda.

    +

    Untuk pengguna Helm

    Sebelum melakukan peningkatan, pastikan bahwa

    +
      +
    • Versi Helm Anda di atas v3.12, dan versi terbaru direkomendasikan.

      +

      Untuk informasi lebih lanjut, lihat Menginstal Helm.

    • +
    • Versi Kubernetes Anda di atas v1.20.

    • +
    +

    Pengoperasian dalam artikel ini mengasumsikan demikian:

    +
      +
    • Milvus telah terinstal di ruang nama default.

    • +
    • Nama rilis Milvus adalah my-release.

    • +
    +

    Anda perlu mengubah berkas values.yaml untuk menentukan versi Pulsar sebagai v2 sebelum memutakhirkan Milvus. Langkah-langkahnya adalah sebagai berikut:

    +
      +
    1. Dapatkan berkas values.yaml saat ini dari instans Milvus Anda.

      +
      namespace=default
      +release=my-release
      +helm -n ${namespace} get values ${release} -o yaml > values.yaml
      +cat values.yaml
      +
    2. +
    3. Edit berkas values.yaml untuk menentukan versi Pulsar sebagai v2.

      +
      # ... omit existing values
      +pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +image:
      +  all:
      +    repository: milvusdb/milvus
      +    tag: v2.5.0-beta 
      +
      +

      Untuk image, ubah tag ke versi Milvus yang diinginkan (misal: v2.5.0-beta).

    4. +
    5. Perbarui bagan Helm Milvus.

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm
      +helm repo update milvus
      +
    6. +
    7. Memperbarui instance Milvus.

      +
      helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml
      +
    8. +
    +

    Membuat instans Milvus baru dengan Pulsar v2

    Bagian ini akan memandu Anda melalui langkah-langkah untuk membuat instans Milvus baru dengan Pulsar v2.

    +

    Untuk pengguna Milvus Operator

    Sebelum Anda menggunakan Milvus v2.5.x, Anda perlu mengunduh dan mengedit file Customer Resource Definition (CRD) Milvus. Untuk detail tentang cara menginstal Milvus menggunakan Milvus Operator, lihat Menginstalasi Milvus Cluster dengan Milvus Operator.

    +
      +
    1. Unduh file CRD.

      +
      wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
      +
    2. +
    3. Edit berkas milvus_cluster_default.yaml untuk menentukan versi Pulsar sebagai v2.

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  namespace: default
      +  labels:
      +    app: milvus
      +spec:
      +  mode: cluster
      +  dependencies:
      +    pulsar:
      +      inCluster:
      +        chartVersion: pulsar-v2
      +
      +

      Untuk dependencies, ubah pulsar.inCluster.chartVersion menjadi pulsar-v2.

    4. +
    5. Lanjutkan dengan langkah-langkah pada Install Milvus Cluster dengan Milvus Operator untuk mendeploy Milvus v2.5.x dengan Pulsar v2 menggunakan file CRD yang telah diedit.

      +
      kubectl apply -f milvus_cluster_default.yaml
      +
    6. +
    +

    Untuk pengguna Helm

    Sebelum Anda menggunakan Milvus v2.5.x, Anda dapat menyiapkan file values.yaml atau menggunakan parameter inline untuk menentukan versi Pulsar. Untuk detail tentang cara menginstal Milvus menggunakan Helm, lihat Menginstalasi Milvus Cluster dengan Helm.

    +
      +
    • Gunakan parameter sebaris untuk menentukan versi Pulsar sebagai v2.

      +
      helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false
      +
    • +
    • Gunakan berkas values.yaml untuk menentukan versi Pulsar sebagai v2.

      +
      pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +
      +

      Kemudian, terapkan Milvus v2.5.x dengan Pulsar v2 menggunakan berkas values.yaml.

      +
      helm install my-release milvus/milvus -f values.yaml
      +
    • +
    diff --git a/localization/v2.5.x/site/id/adminGuide/users_and_roles.json b/localization/v2.5.x/site/id/adminGuide/users_and_roles.json new file mode 100644 index 000000000..c1302eb65 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/users_and_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.create_user(user_name=\"user_1\", password=\"P@ssw0rd\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.CreateUserReq;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nCreateUserReq createUserReq = CreateUserReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .build();​\n ​\nclient.createUser(createUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nawait milvusClient.createUser({​\n username: 'user_1',​\n password: 'P@ssw0rd',​\n });​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.update_password(​\n user_name=\"user_1\",​\n old_password=\"P@ssw0rd\",​\n new_password=\"NewP@ssw0rd\"​\n)​\n\n","import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​\n​\nUpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .newPassword(\"NewP@ssw0rd\")​\n .build();​\nclient.updatePassword(updatePasswordReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.updateUser({​\n username: 'user_1',​\n newPassword: 'P@ssw0rd',​\n oldPassword: 'NewP@ssw0rd',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"newPassword\": \"P@ssw0rd!\",​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","List resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listUsers();​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root', 'user_1']​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_role(role_name=\"role_a\")​\nimport io.milvus.v2.service.rbac.request.CreateRoleReq;​\n\n","CreateRoleReq createRoleReq = CreateRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\n ​\n\n","client.createRole(createRoleReq);​\nconst { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.createRole({​\n roleName: 'role_a',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List roles = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listRoles(​\n includeUserInfo: True​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin', 'role_a']​\n\n"],"headingContent":"Create Users & Roles​","anchorList":[{"label":"Membuat Pengguna & Peran","href":"Create-Users--Roles​","type":1,"isActive":false},{"label":"Pengguna","href":"User​","type":2,"isActive":false},{"label":"Peran","href":"Role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/adminGuide/users_and_roles.md b/localization/v2.5.x/site/id/adminGuide/users_and_roles.md new file mode 100644 index 000000000..e661b7f12 --- /dev/null +++ b/localization/v2.5.x/site/id/adminGuide/users_and_roles.md @@ -0,0 +1,260 @@ +--- +id: users_and_roles.md +related_key: 'users, roles' +summary: >- + Milvus mencapai kontrol akses yang halus melalui RBAC. Anda bisa mulai dengan + membuat pengguna dan peran, kemudian menetapkan hak istimewa atau grup hak + istimewa untuk peran, dan akhirnya mengelola kontrol akses dengan memberikan + peran kepada pengguna. Metode ini memastikan efisiensi dan keamanan manajemen + akses. Halaman ini memperkenalkan cara membuat pengguna dan peran di Milvus. +title: Membuat Pengguna & Peran +--- +

    Membuat Pengguna & Peran

    Milvus mencapai kontrol akses yang halus melalui RBAC. Anda bisa mulai dengan membuat pengguna dan peran, kemudian menetapkan hak istimewa atau grup hak istimewa untuk peran, dan akhirnya mengelola kontrol akses dengan memberikan peran kepada pengguna. Metode ini memastikan efisiensi dan keamanan manajemen akses. Halaman ini memperkenalkan cara membuat pengguna dan peran di Milvus.

    +

    Pengguna

    Setelah menginisialisasi instans Milvus, pengguna root secara otomatis dibuat untuk autentikasi saat terhubung ke Milvus untuk pertama kalinya. Nama pengguna root adalah root dan kata sandinya adalah Milvus. Peran default dari pengguna root adalah admin, yang memiliki akses ke semua sumber daya. Untuk memastikan keamanan data, simpanlah kredensial pengguna root Anda dengan aman untuk mencegah akses yang tidak sah.

    +

    Untuk operasi harian, kami sarankan untuk membuat pengguna daripada menggunakan pengguna root.

    +

    Membuat pengguna

    Contoh berikut ini menunjukkan cara membuat pengguna dengan nama pengguna user_1 dan kata sandi P@ssw0rd. Nama pengguna dan kata sandi untuk pengguna harus mengikuti aturan berikut.

    +
      +
    • Nama pengguna: Harus dimulai dengan huruf dan hanya boleh terdiri dari huruf besar atau huruf kecil, angka, dan garis bawah.

    • +
    • Kata sandi: Harus terdiri dari 8-64 karakter dan harus menyertakan tiga hal berikut ini: huruf besar, huruf kecil, angka, dan karakter khusus.

    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.create_user(user_name="user_1", password="P@ssw0rd")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.CreateUserReq;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +CreateUserReq createUserReq = CreateUserReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .build();​
    +        ​
    +client.createUser(createUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +await milvusClient.createUser({​
    +   username: 'user_1',​
    +   password: 'P@ssw0rd',​
    + });​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    Memperbarui kata sandi

    Setelah membuat pengguna, Anda dapat memperbarui kata sandi jika Anda lupa.

    +

    Kata sandi yang baru juga harus mengikuti aturan berikut.

    +
      +
    • Harus terdiri dari 8-64 karakter dan mencakup tiga hal berikut ini: huruf besar, huruf kecil, angka, dan karakter khusus.
    • +
    +

    Contoh berikut ini menunjukkan cara memperbarui kata sandi untuk pengguna user_1 menjadi NewP@ssw0rd.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.update_password(​
    +    user_name="user_1",​
    +    old_password="P@ssw0rd",​
    +    new_password="NewP@ssw0rd"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​
    +​
    +UpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .newPassword("NewP@ssw0rd")​
    +        .build();​
    +client.updatePassword(updatePasswordReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.updateUser({​
    +   username: 'user_1',​
    +   newPassword: 'P@ssw0rd',​
    +   oldPassword: 'NewP@ssw0rd',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "newPassword": "P@ssw0rd!",​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    Membuat daftar pengguna

    Setelah membuat beberapa pengguna, Anda dapat membuat daftar dan melihat semua pengguna yang ada.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listUsers();​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran. root adalah pengguna default yang dibuat secara otomatis di Milvus. user_1 adalah pengguna baru yang baru saja dibuat.

    +
    ['root', 'user_1']​
    +
    +
    +

    Peran

    Milvus menyediakan sebuah role bawaan yang disebut admin, yang merupakan role administrator yang dapat mengakses sumber daya di bawah semua instans dan memiliki hak istimewa untuk semua operasi. Untuk manajemen akses yang lebih baik dan keamanan data yang lebih baik, Anda disarankan untuk membuat role khusus berdasarkan kebutuhan Anda.

    +

    Membuat peran

    Contoh berikut ini menunjukkan cara membuat peran bernama role_a.

    +

    Nama peran harus mengikuti aturan berikut.

    +
      +
    • Harus dimulai dengan huruf dan hanya boleh menyertakan huruf besar atau huruf kecil, angka, dan garis bawah."
    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_role(role_name="role_a")​
    +import io.milvus.v2.service.rbac.request.CreateRoleReq;​
    +
    +
    +
    CreateRoleReq createRoleReq = CreateRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +       ​
    +
    +
    +
    client.createRole(createRoleReq);​
    +const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.createRole({​
    +   roleName: 'role_a',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    Membuat daftar peran

    Setelah membuat beberapa peran, Anda dapat membuat daftar dan melihat semua peran yang ada.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> roles = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listRoles(​
    +    includeUserInfo: True​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Di bawah ini adalah contoh keluaran. admin adalah peran default di Milvus. role_a adalah peran baru yang baru saja dibuat.

    +
    ['admin', 'role_a']​
    +
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.json b/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.json new file mode 100644 index 000000000..c8761f540 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\nbge_m3_ef = BGEM3EmbeddingFunction(\n model_name='BAAI/bge-m3', # Specify the model name\n device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = bge_m3_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense document dim:\", bge_m3_ef.dim[\"dense\"], docs_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse document dim:\", bge_m3_ef.dim[\"sparse\"], list(docs_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02505937, -0.00142193, 0.04015467, ..., -0.02094924,\n 0.02623661, 0.00324098], dtype=float32), array([ 0.00118463, 0.00649292, -0.00735763, ..., -0.01446293,\n 0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 , 0.0009811 , ..., -0.02559666,\n 0.08084674, 0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type ''\n with 43 stored elements in Compressed Sparse Row format>}\nDense document dim: 1024 (1024,)\nSparse document dim: 250002 (1, 250002)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bge_m3_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense query dim:\", bge_m3_ef.dim[\"dense\"], query_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse query dim:\", bge_m3_ef.dim[\"sparse\"], list(query_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02024024, -0.01514386, 0.02380808, ..., 0.00234648,\n -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,\n 0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type ''\n with 14 stored elements in Compressed Sparse Row format>}\nDense query dim: 1024 (1024,)\nSparse query dim: 250002 (1, 250002)\n"],"headingContent":"BGE M3","anchorList":[{"label":"BGE M3","href":"BGE-M3","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.md b/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.md new file mode 100644 index 000000000..375105133 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-bgm-m3.md @@ -0,0 +1,93 @@ +--- +id: embed-with-bgm-m3.md +order: 4 +summary: >- + BGE-M3 dinamakan demikian karena kemampuannya dalam Multi-Bahasa, + Multi-Fungsi, dan Multi-Granularitas. +title: BGE M3 +--- +

    BGE M3

    BGE-M3 dinamakan demikian karena kemampuannya dalam Multi-Bahasa, Multi-Fungsi, dan Multi-Granularitas. Mampu mendukung lebih dari 100 bahasa, BGE-M3 menetapkan tolok ukur baru dalam tugas pengambilan multi-bahasa dan lintas-bahasa. Kemampuannya yang unik untuk melakukan pencarian padat, pencarian multi-vektor, dan pencarian jarang dalam satu kerangka kerja membuatnya menjadi pilihan ideal untuk berbagai aplikasi pencarian informasi (IR).

    +

    Milvus terintegrasi dengan model BGE M3 menggunakan kelas BGEM3EmbeddingFunction. Kelas ini menangani komputasi embedding dan mengembalikannya dalam format yang kompatibel dengan Milvus untuk pengindeksan dan pencarian. Untuk menggunakan fitur ini, FlagEmbedding harus diinstal.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal BGEM3EmbeddingFunction:

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(
    +    model_name='BAAI/bge-m3', # Specify the model name
    +    device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +    use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.
    +)
    +
    +

    Parameter:

    +
      +
    • model_name(string)

      +

      Nama model yang akan digunakan untuk pengkodean. Nilai defaultnya adalah BAAI/bge-m3.

    • +
    • device(string)

      +

      Perangkat yang akan digunakan, dengan cpu untuk CPU dan cuda:n untuk perangkat GPU ke-n.

    • +
    • use_fp16(bool)

      +

      Apakah akan menggunakan presisi floating-point 16-bit (fp16). Tentukan False bila perangkat adalah cpu.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = bge_m3_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense document dim:", bge_m3_ef.dim["dense"], docs_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse document dim:", bge_m3_ef.dim["sparse"], list(docs_embeddings["sparse"])[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: {'dense': [array([-0.02505937, -0.00142193,  0.04015467, ..., -0.02094924,
    +        0.02623661,  0.00324098], dtype=float32), array([ 0.00118463,  0.00649292, -0.00735763, ..., -0.01446293,
    +        0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 ,  0.0009811 , ..., -0.02559666,
    +        0.08084674,  0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 43 stored elements in Compressed Sparse Row format>}
    +Dense document dim: 1024 (1024,)
    +Sparse document dim: 250002 (1, 250002)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bge_m3_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense query dim:", bge_m3_ef.dim["dense"], query_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse query dim:", bge_m3_ef.dim["sparse"], list(query_embeddings["sparse"])[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: {'dense': [array([-0.02024024, -0.01514386,  0.02380808, ...,  0.00234648,
    +       -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,
    +        0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 14 stored elements in Compressed Sparse Row format>}
    +Dense query dim: 1024 (1024,)
    +Sparse query dim: 250002 (1, 250002)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-bm25.json b/localization/v2.5.x/site/id/embeddings/embed-with-bm25.json new file mode 100644 index 000000000..04ac93b04 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-bm25.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer\nfrom pymilvus.model.sparse import BM25EmbeddingFunction\n\n# there are some built-in analyzers for several languages, now we use 'en' for English.\nanalyzer = build_default_analyzer(language=\"en\")\n\ncorpus = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\n# analyzer can tokenize the text into tokens\ntokens = analyzer(corpus[0])\nprint(\"tokens:\", tokens)\n","tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']\n","# Use the analyzer to instantiate the BM25EmbeddingFunction\nbm25_ef = BM25EmbeddingFunction(analyzer)\n\n# Fit the model on the corpus to get the statstics of the corpus\nbm25_ef.fit(corpus)\n","docs = [\n \"The field of artificial intelligence was established as an academic subject in 1956.\",\n \"Alan Turing was the pioneer in conducting significant research in artificial intelligence.\",\n \"Originating in Maida Vale, London, Turing grew up in the southern regions of England.\",\n \"In 1956, artificial intelligence emerged as a scholarly field.\",\n \"Turing, originally from Maida Vale, London, was brought up in the south of England.\"\n]\n\n# Create embeddings for the documents\ndocs_embeddings = bm25_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 0) 1.0208816705336425\n (0, 1) 1.0208816705336425\n (0, 3) 1.0208816705336425\n...\n (4, 16) 0.9606986899563318\n (4, 17) 0.9606986899563318\n (4, 20) 0.9606986899563318\nSparse dim: 21 (1, 21)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bm25_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 0) 0.5108256237659907\n (0, 1) 0.5108256237659907\n (0, 2) 0.5108256237659907\n (1, 6) 0.5108256237659907\n (1, 7) 0.11554389108992644\n (1, 14) 0.5108256237659907\nSparse dim: 21 (1, 21)\n"],"headingContent":"BM25","anchorList":[{"label":"BM25","href":"BM25","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-bm25.md b/localization/v2.5.x/site/id/embeddings/embed-with-bm25.md new file mode 100644 index 000000000..e409cb951 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-bm25.md @@ -0,0 +1,112 @@ +--- +id: embed-with-bm25.md +order: 5 +summary: >- + BM25 adalah fungsi peringkat yang digunakan dalam pencarian informasi untuk + memperkirakan relevansi dokumen dengan permintaan pencarian yang diberikan. +title: BM25 +--- +

    BM25

    BM25 adalah fungsi pemeringkatan yang digunakan dalam pencarian informasi untuk memperkirakan relevansi dokumen dengan kueri penelusuran yang diberikan. Fungsi ini meningkatkan pendekatan frekuensi term dasar dengan memasukkan normalisasi panjang dokumen dan saturasi frekuensi term. BM25 dapat menghasilkan sematan yang jarang dengan merepresentasikan dokumen sebagai vektor nilai kepentingan istilah, sehingga memungkinkan pengambilan dan pemeringkatan yang efisien dalam ruang vektor yang jarang.

    +

    Milvus berintegrasi dengan model BM25 menggunakan kelas BM25EmbeddingFunction. Kelas ini menangani komputasi penyematan dan mengembalikannya dalam format yang kompatibel dengan Milvus untuk pengindeksan dan pencarian. Hal yang penting dalam proses ini adalah membangun penganalisis untuk tokenisasi.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Untuk membuat tokenizer dengan mudah, Milvus menawarkan penganalisis default yang hanya perlu menentukan bahasa teks.

    +

    Contoh:

    +
    from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
    +from pymilvus.model.sparse import BM25EmbeddingFunction
    +
    +# there are some built-in analyzers for several languages, now we use 'en' for English.
    +analyzer = build_default_analyzer(language="en")
    +
    +corpus = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +# analyzer can tokenize the text into tokens
    +tokens = analyzer(corpus[0])
    +print("tokens:", tokens)
    +
    +

    Parameter

    +
      +
    • bahasa(string)

      +

      Bahasa teks yang akan diberi token. Pilihan yang valid adalah en (Inggris), de (Jerman), fr (Prancis), ru (Rusia), sp (Spanyol), it (Italia), pt (Portugis), zh (Cina), jp (Jepang), kr (Korea).

    • +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
    +
    +

    Algoritme BM25 memproses teks dengan memecahnya terlebih dahulu menjadi token-token menggunakan penganalisis bawaan, seperti yang ditunjukkan dengan token-token bahasa Inggris seperti 'artifici', 'intellig', dan 'academ'. Kemudian mengumpulkan statistik pada token-token ini, mengevaluasi frekuensi dan distribusinya di seluruh dokumen. Inti dari BM25 menghitung skor relevansi dari setiap token berdasarkan tingkat kepentingannya, dengan token yang lebih jarang mendapatkan skor yang lebih tinggi. Proses ringkas ini memungkinkan pemeringkatan dokumen yang efektif berdasarkan relevansi dengan kueri.

    +

    Untuk mengumpulkan statistik pada korpus, gunakan metode fit():

    +
    # Use the analyzer to instantiate the BM25EmbeddingFunction
    +bm25_ef = BM25EmbeddingFunction(analyzer)
    +
    +# Fit the model on the corpus to get the statstics of the corpus
    +bm25_ef.fit(corpus)
    +
    +

    Kemudian, gunakan encode_documents() untuk membuat penyematan dokumen:

    +
    docs = [
    +    "The field of artificial intelligence was established as an academic subject in 1956.",
    +    "Alan Turing was the pioneer in conducting significant research in artificial intelligence.",
    +    "Originating in Maida Vale, London, Turing grew up in the southern regions of England.",
    +    "In 1956, artificial intelligence emerged as a scholarly field.",
    +    "Turing, originally from Maida Vale, London, was brought up in the south of England."
    +]
    +
    +# Create embeddings for the documents
    +docs_embeddings = bm25_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings:   (0, 0)        1.0208816705336425
    +  (0, 1)        1.0208816705336425
    +  (0, 3)        1.0208816705336425
    +...
    +  (4, 16)        0.9606986899563318
    +  (4, 17)        0.9606986899563318
    +  (4, 20)        0.9606986899563318
    +Sparse dim: 21 (1, 21)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bm25_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings:   (0, 0)        0.5108256237659907
    +  (0, 1)        0.5108256237659907
    +  (0, 2)        0.5108256237659907
    +  (1, 6)        0.5108256237659907
    +  (1, 7)        0.11554389108992644
    +  (1, 14)        0.5108256237659907
    +Sparse dim: 21 (1, 21)
    +
    +

    Catatan:

    +

    Saat menggunakan BM25EmbeddingFunction, perhatikan bahwa operasi encode_queries() dan encoding_documents() tidak dapat dipertukarkan secara matematis. Oleh karena itu, tidak ada implementasi bm25_ef(teks) yang tersedia.

    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-cohere.json b/localization/v2.5.x/site/id/embeddings/embed-with-cohere.json new file mode 100644 index 000000000..3ce35a476 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import CohereEmbeddingFunction\n\ncohere_ef = CohereEmbeddingFunction(\n model_name=\"embed-english-light-v3.0\",\n api_key=\"YOUR_COHERE_API_KEY\",\n input_type=\"search_document\",\n embedding_types=[\"float\"]\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = cohere_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", cohere_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 3.43322754e-02, 1.16252899e-03, -5.25207520e-02, 1.32846832e-03,\n -6.80541992e-02, 6.10961914e-02, -7.06176758e-02, 1.48925781e-01,\n 1.54174805e-01, 1.98516846e-02, 2.43835449e-02, 3.55224609e-02,\n 1.82952881e-02, 7.57446289e-02, -2.40783691e-02, 4.40063477e-02,\n...\n 0.06359863, -0.01971436, -0.02253723, 0.00354195, 0.00222015,\n 0.00184727, 0.03408813, -0.00777817, 0.04919434, 0.01519775,\n -0.02862549, 0.04760742, -0.07891846, 0.0124054 ], dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = cohere_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", cohere_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-1.33361816e-02, 9.79423523e-04, -7.28759766e-02, -1.93786621e-02,\n -9.71679688e-02, 4.34875488e-02, -9.81445312e-02, 1.16882324e-01,\n 5.89904785e-02, -4.19921875e-02, 4.95910645e-02, 5.83496094e-02,\n 3.47595215e-02, -5.87463379e-03, -7.30514526e-03, 2.92816162e-02,\n...\n 0.00749969, -0.01192474, 0.02719116, 0.03347778, 0.07696533,\n 0.01409149, 0.00964355, -0.01681519, -0.0073204 , 0.00043154,\n -0.04577637, 0.03591919, -0.02807617, -0.04812622], dtype=float32)]\nDim 384 (384,)\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-cohere.md b/localization/v2.5.x/site/id/embeddings/embed-with-cohere.md new file mode 100644 index 000000000..98b7e18d8 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-cohere.md @@ -0,0 +1,106 @@ +--- +id: embed-with-cohere.md +order: 9 +summary: >- + Artikel ini menjelaskan cara menggunakan CohereEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan Cohere. +title: Sematkan Cohere +--- +

    Cohere

    Model penyematan Cohere digunakan untuk menghasilkan penyematan teks, yang merupakan daftar angka floating-point yang menangkap informasi semantik tentang teks. Penyematan ini dapat digunakan untuk tugas-tugas seperti klasifikasi teks dan pencarian semantik.

    +

    Milvus terintegrasi dengan model penyematan Cohere menggunakan kelas CohereEmbeddingFunction. Kelas ini menangani komputasi penyematan dan mengembalikannya dalam format yang kompatibel dengan Milvus untuk pengindeksan dan pencarian.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instansikan CohereEmbeddingFunction:

    +
    from pymilvus.model.dense import CohereEmbeddingFunction
    +
    +cohere_ef = CohereEmbeddingFunction(
    +    model_name="embed-english-light-v3.0",
    +    api_key="YOUR_COHERE_API_KEY",
    +    input_type="search_document",
    +    embedding_types=["float"]
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan Cohere yang akan digunakan untuk pengkodean. Anda dapat menentukan salah satu nama model penyematan Cohere yang tersedia, misalnya, embed-english-v3.0, embed-multilingual-v3.0, dll. Jika Anda membiarkan parameter ini tidak ditentukan, embed-english-light-v3.0 akan digunakan. Untuk daftar model yang tersedia, lihat Sematkan.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Cohere.

    • +
    • input_type (string)

      +

      Jenis input yang diteruskan ke model. Diperlukan untuk model penyematan v3 dan yang lebih tinggi.

      +
        +
      • "search_document": Digunakan untuk penyematan yang disimpan dalam basis data vektor untuk kasus penggunaan pencarian.
      • +
      • "search_query": Digunakan untuk penyematan kueri penelusuran yang dijalankan terhadap DB vektor untuk menemukan dokumen yang relevan.
      • +
      • "classification": Digunakan untuk penyematan yang dilewatkan melalui pengklasifikasi teks.
      • +
      • "clustering": Digunakan untuk penyematan yang dijalankan melalui algoritma pengelompokan.
      • +
    • +
    • embedding_types (Daftar [str])

      +

      Jenis sematan yang ingin Anda dapatkan kembali. Tidak diperlukan dan nilai standarnya adalah None, yang mengembalikan jenis respons Embed Floats. Saat ini, Anda hanya dapat menentukan satu nilai untuk parameter ini. Nilai yang mungkin:

      +
        +
      • "float": Gunakan ini bila Anda ingin mendapatkan kembali penyematan mengambang default. Berlaku untuk semua model.
      • +
      • "binary": Gunakan ini bila Anda ingin mendapatkan kembali penyematan biner yang ditandatangani. Hanya berlaku untuk model v3.
      • +
      • "ubinary": Gunakan ini bila Anda ingin mendapatkan kembali embedding biner yang tidak ditandatangani. Hanya berlaku untuk model v3.
      • +
    • +
    +

    Untuk membuat sematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = cohere_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", cohere_ef.dim, docs_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 3.43322754e-02,  1.16252899e-03, -5.25207520e-02,  1.32846832e-03,
    +       -6.80541992e-02,  6.10961914e-02, -7.06176758e-02,  1.48925781e-01,
    +        1.54174805e-01,  1.98516846e-02,  2.43835449e-02,  3.55224609e-02,
    +        1.82952881e-02,  7.57446289e-02, -2.40783691e-02,  4.40063477e-02,
    +...
    +        0.06359863, -0.01971436, -0.02253723,  0.00354195,  0.00222015,
    +        0.00184727,  0.03408813, -0.00777817,  0.04919434,  0.01519775,
    +       -0.02862549,  0.04760742, -0.07891846,  0.0124054 ], dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = cohere_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", cohere_ef.dim, query_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan serupa dengan yang berikut ini:

    +
    Embeddings: [array([-1.33361816e-02,  9.79423523e-04, -7.28759766e-02, -1.93786621e-02,
    +       -9.71679688e-02,  4.34875488e-02, -9.81445312e-02,  1.16882324e-01,
    +        5.89904785e-02, -4.19921875e-02,  4.95910645e-02,  5.83496094e-02,
    +        3.47595215e-02, -5.87463379e-03, -7.30514526e-03,  2.92816162e-02,
    +...
    +        0.00749969, -0.01192474,  0.02719116,  0.03347778,  0.07696533,
    +        0.01409149,  0.00964355, -0.01681519, -0.0073204 ,  0.00043154,
    +       -0.04577637,  0.03591919, -0.02807617, -0.04812622], dtype=float32)]
    +Dim 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-instructor.json b/localization/v2.5.x/site/id/embeddings/embed-with-instructor.json new file mode 100644 index 000000000..543f79b6a --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-instructor.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import InstructorEmbeddingFunction\n\nef = InstructorEmbeddingFunction(\n model_name=\"hkunlp/instructor-xl\", # Defaults to `hkunlp/instructor-xl`\n query_instruction=\"Represent the question for retrieval:\",\n doc_instruction=\"Represent the document for retrieval:\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,\n -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,\n -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,\n -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,\n ...\n -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,\n 6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],\n dtype=float32)]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,\n -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,\n -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,\n -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,\n ...\n 7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,\n 1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],\n dtype=float32)]\nDim 768 (768,)\n"],"headingContent":"Instructor","anchorList":[{"label":"Instruktur","href":"Instructor","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-instructor.md b/localization/v2.5.x/site/id/embeddings/embed-with-instructor.md new file mode 100644 index 000000000..636d7c927 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-instructor.md @@ -0,0 +1,92 @@ +--- +id: embed-with-instructor.md +order: 10 +summary: >- + Artikel ini menjelaskan cara menggunakan InstructorEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan Instructor. +title: Instruktur +--- +

    Instruktur

    Instructor adalah model penyematan teks yang disesuaikan dengan instruksi yang dapat menghasilkan penyematan teks yang disesuaikan dengan tugas apa pun (misalnya, klasifikasi, pencarian, pengelompokan, evaluasi teks, dll.) dan domain (misalnya, sains, keuangan, dll.) hanya dengan memberikan instruksi tugas, tanpa penyesuaian apa pun.

    +

    Milvus terintegrasi dengan model penyematan Instructor melalui kelas InstructorEmbeddingFunction. Kelas ini menyediakan metode untuk menyandikan dokumen dan kueri menggunakan model penyematan Instructor dan mengembalikan penyematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instansikan InstructorEmbeddingFunction:

    +
    from pymilvus.model.dense import InstructorEmbeddingFunction
    +
    +ef = InstructorEmbeddingFunction(
    +    model_name="hkunlp/instructor-xl", # Defaults to `hkunlp/instructor-xl`
    +    query_instruction="Represent the question for retrieval:",
    +    doc_instruction="Represent the document for retrieval:"
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan AI Mistral yang akan digunakan untuk pengkodean. Nilai defaultnya adalah hkunlp/instructor-xl. Untuk informasi lebih lanjut, lihat Daftar Model.

    • +
    • query_instruction (string)

      +

      Instruksi khusus tugas yang memandu model tentang cara menghasilkan penyematan untuk kueri atau pertanyaan.

    • +
    • doc_instruction (string)

      +

      Instruksi khusus tugas yang memandu model untuk menghasilkan sematan untuk dokumen.

    • +
    +

    Untuk membuat sematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan serupa dengan yang berikut ini:

    +
    Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,
    +       -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,
    +       -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,
    +       -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,
    +       ...
    +       -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,
    +        6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],
    +      dtype=float32)]
    +Dim: 768 (768,)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,
    +       -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,
    +       -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,
    +       -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,
    +       ...
    +        7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,
    +        1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],
    +      dtype=float32)]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-jina.json b/localization/v2.5.x/site/id/embeddings/embed-with-jina.json new file mode 100644 index 000000000..4cee744ff --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINAAI_API_KEY, # Provide your Jina AI API key\n task=\"retrieval.passage\", # Specify the task\n dimensions=1024, # Defaults to 1024\n)\n","\n```python\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = jina_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", jina_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([9.80641991e-02, -8.51697400e-02, 7.36531913e-02, 1.42558888e-02,\n -2.23589484e-02, 1.68494112e-03, -3.50753777e-02, -3.11530549e-02,\n -3.26012149e-02, 5.04568312e-03, 3.69836427e-02, 3.48948985e-02,\n 8.19722563e-03, 5.88679723e-02, -6.71099266e-03, -1.82369724e-02,\n...\n 2.48654783e-02, 3.43279652e-02, -1.66154150e-02, -9.90478322e-03,\n -2.96043139e-03, -8.57473817e-03, -7.39028037e-04, 6.25024503e-03,\n -1.08831357e-02, -4.00776342e-02, 3.25369164e-02, -1.42691191e-03])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = jina_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", jina_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([8.79201014e-03, 1.47551354e-02, 4.02722731e-02, -2.52991207e-02,\n 1.12719582e-02, 3.75947170e-02, 3.97946090e-02, -7.36681819e-02,\n -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,\n 5.26071340e-02, 6.75181448e-02, 3.92445624e-02, -1.40817231e-02,\n...\n 8.81703943e-03, 4.24629413e-02, -2.32944116e-02, -2.05193572e-02,\n -3.22035812e-02, 2.81896023e-03, 3.85326855e-02, 3.64372656e-02,\n -1.65050142e-02, -4.26847413e-02, 2.02664156e-02, -1.72684863e-02])]\nDim 1024 (1024,)\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINA_API_KEY, # Provide your Jina AI API key\n task=\"text-matching\",\n dimensions=1024, # Defaults to 1024\n)\n\ntexts = [\n \"Follow the white rabbit.\", # English\n \"Sigue al conejo blanco.\", # Spanish\n \"Suis le lapin blanc.\", # French\n \"跟着白兔走。\", # Chinese\n \"اتبع الأرنب الأبيض.\", # Arabic\n \"Folge dem weißen Kaninchen.\", # German\n]\n\nembeddings = jina_ef(texts)\n\n# Compute similarities\nprint(embeddings[0] @ embeddings[1].T)\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-jina.md b/localization/v2.5.x/site/id/embeddings/embed-with-jina.md new file mode 100644 index 000000000..9dd6c572d --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-jina.md @@ -0,0 +1,130 @@ +--- +id: embed-with-jina.md +order: 8 +summary: >- + Artikel ini menjelaskan cara menggunakan JinaEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan Jina AI. +title: Jina AI - Sematkan +--- +

    Jina AI

    Model penyematan Jina AI adalah model penyematan teks berkinerja tinggi yang dapat menerjemahkan input tekstual ke dalam representasi numerik, menangkap semantik teks. Model-model ini unggul dalam aplikasi seperti pengambilan data yang padat, kesamaan teks semantik, dan pemahaman multibahasa.

    +

    Milvus terintegrasi dengan model penyematan Jina AI melalui kelas JinaEmbeddingFunction. Kelas ini menyediakan metode untuk mengkodekan dokumen dan kueri menggunakan model penyematan Jina AI dan mengembalikan penyematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus. Untuk memanfaatkan fungsionalitas ini, dapatkan kunci API dari Jina AI.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal JinaEmbeddingFunction:

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINAAI_API_KEY, # Provide your Jina AI API key
    +    task="retrieval.passage", # Specify the task
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan Jina AI yang akan digunakan untuk penyandian. Anda dapat menentukan salah satu nama model penyematan Jina AI yang tersedia, misalnya, jina-embeddings-v3, jina-embeddings-v2-base-en, dll. Jika Anda membiarkan parameter ini tidak ditentukan, jina-embeddings-v3 akan digunakan. Untuk daftar model yang tersedia, lihat Penyematan Jina.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Jina AI.

    • +
    • task (string)

      +

      Jenis input yang diteruskan ke model. Diperlukan untuk model penyematan v3 dan yang lebih tinggi.

      +
        +
      • "retrieval.passage": Digunakan untuk menyandikan dokumen besar dalam tugas pengambilan pada waktu pengindeksan.
      • +
      • "retrieval.query": Digunakan untuk menyandikan kueri atau pertanyaan pengguna dalam tugas pengambilan.
      • +
      • "classification": Digunakan untuk menyandikan teks untuk tugas klasifikasi teks.
      • +
      • "text-matching": Digunakan untuk menyandikan teks untuk pencocokan kemiripan, seperti mengukur kemiripan antara dua kalimat.
      • +
      • "clustering": Digunakan untuk tugas pengelompokan atau pemeringkatan.
      • +
    • +
    • dimensions (int)

      +

      Jumlah dimensi yang harus dimiliki oleh penyematan keluaran yang dihasilkan. Nilai default adalah 1024. Hanya didukung untuk model penyematan v3 dan yang lebih tinggi.

    • +
    • late_chunking (bool)

      +

      Parameter ini mengontrol apakah akan menggunakan metode chunking baru yang diperkenalkan Jina AI bulan lalu untuk menyandikan sekumpulan kalimat. Defaultnya adalah False. Jika disetel ke True, Jina AI API akan menggabungkan semua kalimat di bidang input dan mengumpankannya sebagai string tunggal ke model. Secara internal, model menyematkan string panjang yang digabungkan ini dan kemudian melakukan pemotongan akhir, mengembalikan daftar penyematan yang sesuai dengan ukuran daftar masukan.

    • +
    +

    Untuk membuat penyematan dokumen, gunakan metode encode_documents(). Metode ini dirancang untuk penyematan dokumen dalam tugas pengambilan asimetris, seperti mengindeks dokumen untuk tugas pencarian atau rekomendasi. Metode ini menggunakan retrieval.passage sebagai tugas.

    +
    
    +```python
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = jina_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", jina_ef.dim, docs_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan adalah seperti berikut ini:

    +
    Embeddings: [array([9.80641991e-02, -8.51697400e-02,  7.36531913e-02,  1.42558888e-02,
    +       -2.23589484e-02,  1.68494112e-03, -3.50753777e-02, -3.11530549e-02,
    +       -3.26012149e-02,  5.04568312e-03,  3.69836427e-02,  3.48948985e-02,
    +        8.19722563e-03,  5.88679723e-02, -6.71099266e-03, -1.82369724e-02,
    +...
    +        2.48654783e-02,  3.43279652e-02, -1.66154150e-02, -9.90478322e-03,
    +       -2.96043139e-03, -8.57473817e-03, -7.39028037e-04,  6.25024503e-03,
    +       -1.08831357e-02, -4.00776342e-02,  3.25369164e-02, -1.42691191e-03])]
    +Dim: 1024 (1024,)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries(). Metode ini dirancang untuk penyematan kueri dalam tugas pengambilan asimetris, seperti kueri penelusuran atau pertanyaan. Metode ini menggunakan retrieval.query sebagai tugas.

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = jina_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", jina_ef.dim, query_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([8.79201014e-03,  1.47551354e-02,  4.02722731e-02, -2.52991207e-02,
    +        1.12719582e-02,  3.75947170e-02,  3.97946090e-02, -7.36681819e-02,
    +       -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,
    +        5.26071340e-02,  6.75181448e-02,  3.92445624e-02, -1.40817231e-02,
    +...
    +        8.81703943e-03,  4.24629413e-02, -2.32944116e-02, -2.05193572e-02,
    +       -3.22035812e-02,  2.81896023e-03,  3.85326855e-02,  3.64372656e-02,
    +       -1.65050142e-02, -4.26847413e-02,  2.02664156e-02, -1.72684863e-02])]
    +Dim 1024 (1024,)
    +
    +

    Untuk membuat penyematan input untuk pencocokan kesamaan (seperti tugas STS atau pengambilan simetris), klasifikasi teks, pengelompokan, atau tugas pemeringkatan, gunakan nilai parameter task yang sesuai saat menginstansiasi kelas JinaEmbeddingFunction.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINA_API_KEY, # Provide your Jina AI API key
    +    task="text-matching",
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +texts = [
    +    "Follow the white rabbit.",  # English
    +    "Sigue al conejo blanco.",  # Spanish
    +    "Suis le lapin blanc.",  # French
    +    "跟着白兔走。",  # Chinese
    +    "اتبع الأرنب الأبيض.",  # Arabic
    +    "Folge dem weißen Kaninchen.",  # German
    +]
    +
    +embeddings = jina_ef(texts)
    +
    +# Compute similarities
    +print(embeddings[0] @ embeddings[1].T)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-mgte.json b/localization/v2.5.x/site/id/embeddings/embed-with-mgte.json new file mode 100644 index 000000000..c951e2997 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-mgte.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import MGTEEmbeddingFunction\n\nef = MGTEEmbeddingFunction(\n model_name=\"Alibaba-NLP/gte-multilingual-base\", # Defaults to `Alibaba-NLP/gte-multilingual-base`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of embeddings\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,\n 1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,\n 2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,\n 6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,\n ...\n 2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,\n 6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,\n 1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,\n -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,\n 8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,\n ...\n 3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,\n 7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n"],"headingContent":"mGTE","anchorList":[{"label":"mGTE","href":"mGTE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-mgte.md b/localization/v2.5.x/site/id/embeddings/embed-with-mgte.md new file mode 100644 index 000000000..07bb93dac --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-mgte.md @@ -0,0 +1,90 @@ +--- +id: embed-with-mgte.md +order: 13 +summary: >- + Artikel ini menjelaskan cara menggunakan MGTEEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan mGTE. +title: mGTE +--- +

    mGTE

    mGTE adalah model representasi teks multibahasa dan model pemeringkatan ulang untuk tugas-tugas pencarian teks.

    +

    Milvus terintegrasi dengan model penyematan mGTE melalui kelas MGTEEmbeddingFunction. Kelas ini menyediakan metode untuk menyandikan dokumen dan kueri menggunakan model penyematan mGTE dan mengembalikan penyematan sebagai vektor padat dan jarang yang kompatibel dengan pengindeksan Milvus.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal MGTEEmbeddingFunction:

    +
    from pymilvus.model.hybrid import MGTEEmbeddingFunction
    +
    +ef = MGTEEmbeddingFunction(
    +    model_name="Alibaba-NLP/gte-multilingual-base", # Defaults to `Alibaba-NLP/gte-multilingual-base`
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan mGTE yang akan digunakan untuk penyandian. Nilai defaultnya adalah Alibaba-NLP/gte-multilingual-base.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of embeddings
    +print(ef.dim)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,
    +        1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,
    +        2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,
    +        6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,
    +        ...
    +        2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,
    +        6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 41 stored elements and shape (3, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print(ef.dim)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,
    +        1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,
    +       -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,
    +        8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,
    +        ...
    +        3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,
    +        7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 13 stored elements and shape (2, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.json b/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.json new file mode 100644 index 000000000..77004b3fc --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import MistralAIEmbeddingFunction\n\nef = MistralAIEmbeddingFunction(\n model_name=\"mistral-embed\", # Defaults to `mistral-embed`\n api_key=\"MISTRAL_API_KEY\" # Provide your Mistral AI API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,\n 0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,\n 0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,\n 0.03634644, -0.01802063])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,\n 0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,\n 0.03582764, 0.00366592])]\nDim 1024 (1024,)\n"],"headingContent":"Mistral AI","anchorList":[{"label":"Mistral AI","href":"Mistral-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.md b/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.md new file mode 100644 index 000000000..30ad5c916 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-mistral-ai.md @@ -0,0 +1,80 @@ +--- +id: embed-with-mistral-ai.md +order: 11 +summary: >- + Artikel ini menjelaskan cara menggunakan MistralAIEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan AI Mistral. +title: Mistral AI +--- +

    Mistral AI

    Model penyematanMistral AI adalah model penyematan teks yang dirancang untuk mengubah input tekstual menjadi vektor numerik yang padat, yang secara efektif menangkap makna yang mendasari teks. Model-model ini sangat dioptimalkan untuk tugas-tugas seperti pencarian semantik, pemahaman bahasa alami, dan aplikasi yang sadar konteks, sehingga cocok untuk berbagai solusi bertenaga AI.

    +

    Milvus terintegrasi dengan model penyematan Mistral AI melalui kelas MistralAIEmbeddingFunction. Kelas ini menyediakan metode untuk menyandikan dokumen dan kueri menggunakan model penyematan AI Mistral dan mengembalikan penyematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus. Untuk menggunakan fungsi ini, dapatkan kunci API dari Mistral AI.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal MistralAIEmbeddingFunction:

    +
    from pymilvus.model.dense import MistralAIEmbeddingFunction
    +
    +ef = MistralAIEmbeddingFunction(
    +    model_name="mistral-embed", # Defaults to `mistral-embed`
    +    api_key="MISTRAL_API_KEY" # Provide your Mistral AI API key
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan Mistral AI yang akan digunakan untuk pengkodean. Nilai defaultnya adalah mistral-embed. Untuk informasi lebih lanjut, lihat Penyematan.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Mistral AI.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan serupa dengan yang berikut ini:

    +
    Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,
    +       0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,
    +       0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,
    +       0.03634644, -0.01802063])]
    +Dim: 1024 (1024,)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,
    +       0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,
    +       0.03582764, 0.00366592])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-nomic.json b/localization/v2.5.x/site/id/embeddings/embed-with-nomic.json new file mode 100644 index 000000000..cc09bcb43 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-nomic.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","# Before accessing the Nomic Atlas API, configure your Nomic API token\nimport nomic\nnomic.login('YOUR_NOMIC_API_KEY')\n\n# Import Nomic embedding function\nfrom pymilvus.model.dense import NomicEmbeddingFunction\n\nef = NomicEmbeddingFunction(\n model_name=\"nomic-embed-text-v1.5\", # Defaults to `mistral-embed`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,\n 6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,\n 3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,\n ...\n -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,\n -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,\n -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,\n 7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,\n -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,\n ...\n 7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,\n -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,\n -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]\nDim 768 (768,)\n"],"headingContent":"Nomic","anchorList":[{"label":"Nomic","href":"Nomic","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-nomic.md b/localization/v2.5.x/site/id/embeddings/embed-with-nomic.md new file mode 100644 index 000000000..2841b2b23 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-nomic.md @@ -0,0 +1,89 @@ +--- +id: embed-with-nomic.md +order: 12 +summary: >- + Artikel ini menjelaskan cara menggunakan NomicEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model penyematan Nomic. +title: Nomic +--- +

    Nomic

    ModelNomic adalah serangkaian solusi penyematan teks dan gambar canggih yang dikembangkan oleh Nomic AI, yang dirancang untuk mengubah berbagai bentuk data menjadi vektor numerik padat yang menangkap makna semantiknya.

    +

    Milvus terintegrasi dengan model penyematan Nomic melalui kelas NomicEmbeddingFunction. Kelas ini menyediakan metode untuk menyandikan dokumen dan kueri menggunakan model penyematan Nomic dan mengembalikan penyematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus. Untuk menggunakan fungsi ini, dapatkan kunci API dari Nomic Atlas.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instalasikan NomicEmbeddingFunction:

    +
    # Before accessing the Nomic Atlas API, configure your Nomic API token
    +import nomic
    +nomic.login('YOUR_NOMIC_API_KEY')
    +
    +# Import Nomic embedding function
    +from pymilvus.model.dense import NomicEmbeddingFunction
    +
    +ef = NomicEmbeddingFunction(
    +    model_name="nomic-embed-text-v1.5", # Defaults to `mistral-embed`
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model penyematan Nomic yang akan digunakan untuk pengkodean. Nilai defaultnya adalah nomic-embed-text-v1.5. Untuk informasi lebih lanjut, lihat dokumentasi resmi Nomic.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,
    +        6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,
    +        3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,
    +        ...
    +       -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,
    +       -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,
    +       -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]
    +Dim: 768 (768,)
    +
    +

    Untuk membuat sematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,
    +        7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,
    +       -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,
    +        ...
    +        7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,
    +       -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,
    +       -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-openai.json b/localization/v2.5.x/site/id/embeddings/embed-with-openai.json new file mode 100644 index 000000000..abcf3721e --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nopenai_ef = model.dense.OpenAIEmbeddingFunction(\n model_name='text-embedding-3-large', # Specify the model name\n api_key='YOUR_API_KEY', # Provide your OpenAI API key\n dimensions=512 # Set the embedding dimensionality\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = openai_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", openai_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,\n 4.23139781e-02, -6.64533582e-03, 4.21088142e-03, 1.04644023e-01,\n 5.10009527e-02, 5.32827862e-02, -3.26061808e-02, -3.66494283e-02,\n...\n -8.93232748e-02, 6.68255147e-03, 3.55093405e-02, -5.09071983e-02,\n 3.74144339e-03, 4.72541340e-02, 2.11916920e-02, 1.00753829e-02,\n -5.76633997e-02, 9.68257990e-03, 4.62721288e-02, -4.33261096e-02])]\nDim: 512 (512,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = openai_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim\", openai_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033, 0.01635982,\n -0.03169853, -0.0033602 , 0.09047844, 0.00030747, 0.11853652,\n -0.02870182, -0.01526102, 0.05505067, 0.00993909, -0.07165466,\n...\n -9.78106782e-02, -2.22669560e-02, 1.21873049e-02, -4.83198799e-02,\n 5.32377362e-02, -1.90469325e-02, 5.62430918e-02, 1.02650477e-02,\n -6.21757433e-02, 7.88027793e-02, 4.91846527e-04, -1.51633881e-02])]\nDim 512 (512,)\n"],"headingContent":"OpenAI","anchorList":[{"label":"OpenAI","href":"OpenAI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-openai.md b/localization/v2.5.x/site/id/embeddings/embed-with-openai.md new file mode 100644 index 000000000..e65434213 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-openai.md @@ -0,0 +1,91 @@ +--- +id: embed-with-openai.md +order: 2 +summary: >- + Milvus terintegrasi dengan model-model OpenAI melalui kelas + OpenAIEmbeddingFunction. +title: OpenAI +--- +

    OpenAI

    Milvus terintegrasi dengan model-model OpenAI melalui kelas OpenAIEmbeddingFunction. Kelas ini menyediakan metode untuk mengkodekan dokumen dan kueri menggunakan model OpenAI yang telah dilatih sebelumnya dan mengembalikan embedding sebagai vektor padat yang kompatibel dengan pengindeksan Milvus. Untuk menggunakan fungsi ini, dapatkan kunci API dari OpenAI dengan membuat akun di platform mereka.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal OpenAIEmbeddingFunction:

    +
    from pymilvus import model
    +
    +openai_ef = model.dense.OpenAIEmbeddingFunction(
    +    model_name='text-embedding-3-large', # Specify the model name
    +    api_key='YOUR_API_KEY', # Provide your OpenAI API key
    +    dimensions=512 # Set the embedding dimensionality
    +)
    +
    +

    Parameter:

    +
      +
    • model_name(string)

      +

      Nama model OpenAI yang akan digunakan untuk penyematan. Opsi yang valid adalah text-embedding-3-kecil, text-embedding-3-besar, dan text-embedding-ada-002 (default).

    • +
    • api_key(string)

      +

      Kunci API untuk mengakses API OpenAI.

    • +
    • dimensions(int)

      +

      Jumlah dimensi yang harus dimiliki oleh penyematan keluaran yang dihasilkan. Hanya didukung pada model penyematan teks-3 dan yang lebih baru.

    • +
    +

    Untuk membuat sematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = openai_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", openai_ef.dim, docs_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,
    +        4.23139781e-02, -6.64533582e-03,  4.21088142e-03,  1.04644023e-01,
    +        5.10009527e-02,  5.32827862e-02, -3.26061808e-02, -3.66494283e-02,
    +...
    +       -8.93232748e-02,  6.68255147e-03,  3.55093405e-02, -5.09071983e-02,
    +        3.74144339e-03,  4.72541340e-02,  2.11916920e-02,  1.00753829e-02,
    +       -5.76633997e-02,  9.68257990e-03,  4.62721288e-02, -4.33261096e-02])]
    +Dim: 512 (512,)
    +
    +

    Untuk membuat penyematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = openai_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim", openai_ef.dim, query_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033,  0.01635982,
    +       -0.03169853, -0.0033602 ,  0.09047844,  0.00030747,  0.11853652,
    +       -0.02870182, -0.01526102,  0.05505067,  0.00993909, -0.07165466,
    +...
    +       -9.78106782e-02, -2.22669560e-02,  1.21873049e-02, -4.83198799e-02,
    +        5.32377362e-02, -1.90469325e-02,  5.62430918e-02,  1.02650477e-02,
    +       -6.21757433e-02,  7.88027793e-02,  4.91846527e-04, -1.51633881e-02])]
    +Dim 512 (512,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.json b/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.json new file mode 100644 index 000000000..a49e6f63c --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(\n model_name='all-MiniLM-L6-v2', # Specify the model name\n device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = sentence_transformer_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = sentence_transformer_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-2.52114702e-02, -5.29330298e-02, 1.14570223e-02, 1.95571519e-02,\n -2.46500354e-02, -2.66519729e-02, -8.48201662e-03, 2.82961670e-02,\n -3.65092754e-02, 7.50745758e-02, 4.28900979e-02, 7.18822703e-02,\n...\n -6.76431581e-02, -6.45996556e-02, -4.67132553e-02, 4.78532910e-02,\n -2.31596199e-03, 4.13446948e-02, 1.06935494e-01, -1.08258888e-01],\n dtype=float32)]\nDim: 384 (384,)\n"],"headingContent":"Sentence Transformers","anchorList":[{"label":"Transformator Kalimat","href":"Sentence-Transformers","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.md b/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.md new file mode 100644 index 000000000..3ff6a8463 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-sentence-transform.md @@ -0,0 +1,88 @@ +--- +id: embed-with-sentence-transform.md +order: 3 +summary: >- + Artikel ini mendemonstrasikan cara menggunakan Sentence Transformers di Milvus + untuk mengkodekan dokumen dan kueri ke dalam vektor padat. +title: Transformator Kalimat +--- +

    Transformator Kalimat

    Milvus terintegrasi dengan model-model yang telah dilatih sebelumnya oleh Sentence Transformer melalui kelas SentenceTransformerEmbeddingFunction. Kelas ini menyediakan metode untuk menyandikan dokumen dan kueri menggunakan model Sentence Transformer yang telah dilatih sebelumnya dan mengembalikan sematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instansikan SentenceTransformerEmbeddingFunction:

    +
    from pymilvus import model
    +
    +sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
    +    model_name='all-MiniLM-L6-v2', # Specify the model name
    +    device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Parameter:

    +
      +
    • nama_model(string)

      +

      Nama model Sentence Transformer yang akan digunakan untuk penyandian. Nilai defaultnya adalah all-MiniLM-L6-v2. Anda dapat menggunakan salah satu model yang telah dilatih sebelumnya dari Sentence Transformer. Untuk daftar model yang tersedia, lihat Model yang sudah dilatih.

    • +
    • perangkat(string)

      +

      Perangkat yang akan digunakan, dengan cpu untuk CPU dan cuda:n untuk perangkat GPU ke-n.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = sentence_transformer_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, docs_embeddings[0].shape)
    +
    +

    Output yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Untuk membuat embedding untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = sentence_transformer_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, query_embeddings[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([-2.52114702e-02, -5.29330298e-02,  1.14570223e-02,  1.95571519e-02,
    +       -2.46500354e-02, -2.66519729e-02, -8.48201662e-03,  2.82961670e-02,
    +       -3.65092754e-02,  7.50745758e-02,  4.28900979e-02,  7.18822703e-02,
    +...
    +       -6.76431581e-02, -6.45996556e-02, -4.67132553e-02,  4.78532910e-02,
    +       -2.31596199e-03,  4.13446948e-02,  1.06935494e-01, -1.08258888e-01],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-splade.json b/localization/v2.5.x/site/id/embeddings/embed-with-splade.json new file mode 100644 index 000000000..06db0bdf6 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-splade.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsplade_ef = model.sparse.SpladeEmbeddingFunction(\n model_name=\"naver/splade-cocondenser-selfdistil\", \n device=\"cpu\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = splade_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6392706036567688\n (0, 2034) 0.024093208834528923\n (0, 2082) 0.3230178654193878\n...\n (2, 23602) 0.5671860575675964\n (2, 26757) 0.5770265460014343\n (2, 28639) 3.1990697383880615\nSparse dim: 30522 (1, 30522)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = splade_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6353746056556702\n (0, 2194) 0.015553371049463749\n (0, 2301) 0.2756537199020386\n...\n (1, 18522) 0.1282549500465393\n (1, 23602) 0.13133203983306885\n (1, 28639) 2.8150033950805664\nSparse dim: 30522 (1, 30522)\n"],"headingContent":"SPLADE","anchorList":[{"label":"SPLADE","href":"SPLADE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-splade.md b/localization/v2.5.x/site/id/embeddings/embed-with-splade.md new file mode 100644 index 000000000..73cf36e49 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-splade.md @@ -0,0 +1,89 @@ +--- +id: embed-with-splade.md +order: 6 +summary: >- + Artikel ini menjelaskan cara menggunakan SpladeEmbeddingFunction untuk + mengkodekan dokumen dan kueri menggunakan model SPLADE. +title: SPLADE +--- +

    SPLADE

    SPLADE embedding adalah model yang menawarkan representasi yang sangat jarang untuk dokumen dan kueri, mewarisi properti yang diinginkan dari model bag-of-words (BOW) seperti pencocokan istilah yang tepat dan efisiensi.

    +

    Milvus berintegrasi dengan model SPLADE melalui kelas SpladeEmbeddingFunction. Kelas ini menyediakan metode untuk mengkodekan dokumen dan kueri dan mengembalikan sematan sebagai vektor jarang yang kompatibel dengan pengindeksan Milvus.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Untuk menginstansiasi SpladeEmbeddingFunction, gunakan perintah:

    +
    from pymilvus import model
    +
    +splade_ef = model.sparse.SpladeEmbeddingFunction(
    +    model_name="naver/splade-cocondenser-selfdistil", 
    +    device="cpu"
    +)
    +
    +

    Parameter:

    +
      +
    • model_name(string)

      +

      Nama model SPLADE yang akan digunakan untuk pengkodean. Opsi yang valid adalah naver/splade-cocondenser-ensembledistil (default), naver/splade_v2_max, naver/splade_v2_distil, dan naver/splade-cocondenser-selfdistil. Untuk informasi lebih lanjut, lihat Bermain dengan model.

    • +
    • perangkat(string)

      +

      Perangkat yang akan digunakan, dengan cpu untuk CPU dan cuda:n untuk perangkat GPU ke-n.

    • +
    +

    Untuk membuat penyematan untuk dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = splade_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    Output yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings:   (0, 2001) 0.6392706036567688
    +  (0, 2034) 0.024093208834528923
    +  (0, 2082) 0.3230178654193878
    +...
    +  (2, 23602)    0.5671860575675964
    +  (2, 26757)    0.5770265460014343
    +  (2, 28639)    3.1990697383880615
    +Sparse dim: 30522 (1, 30522)
    +
    +

    Untuk membuat embedding untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = splade_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings:   (0, 2001)        0.6353746056556702
    +  (0, 2194)        0.015553371049463749
    +  (0, 2301)        0.2756537199020386
    +...
    +  (1, 18522)        0.1282549500465393
    +  (1, 23602)        0.13133203983306885
    +  (1, 28639)        2.8150033950805664
    +Sparse dim: 30522 (1, 30522)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-voyage.json b/localization/v2.5.x/site/id/embeddings/embed-with-voyage.json new file mode 100644 index 000000000..ba7547304 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import VoyageEmbeddingFunction\n\nvoyage_ef = VoyageEmbeddingFunction(\n model_name=\"voyage-3\", # Defaults to `voyage-3`\n api_key=VOYAGE_API_KEY # Provide your Voyage API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = voyage_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", voyage_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,\n 0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,\n 0.03349845, 0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,\n 0.07658645, 0.03064499])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = voyage_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", voyage_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,\n 0.04493361, 0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,\n 0.05706626, 0.0263358 ])]\nDim 1024 (1024,)\n"],"headingContent":"Voyage","anchorList":[{"label":"Voyage","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embed-with-voyage.md b/localization/v2.5.x/site/id/embeddings/embed-with-voyage.md new file mode 100644 index 000000000..2ab0bdb38 --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embed-with-voyage.md @@ -0,0 +1,77 @@ +--- +id: embed-with-voyage.md +order: 7 +summary: >- + Artikel ini menjelaskan cara menggunakan VoyageEmbeddingFunction untuk + menyandikan dokumen dan kueri menggunakan model Voyage. +title: Sematkan Perjalanan +--- +

    Voyage

    Milvus terintegrasi dengan model-model Voyage melalui kelas VoyageEmbeddingFunction. Kelas ini menyediakan metode untuk mengkodekan dokumen dan kueri menggunakan model Voyage dan mengembalikan sematan sebagai vektor padat yang kompatibel dengan pengindeksan Milvus. Untuk menggunakan fungsi ini, dapatkan kunci API dari Voyage dengan membuat akun di platform mereka.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal VoyageEmbeddingFunction:

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +
    +voyage_ef = VoyageEmbeddingFunction(
    +    model_name="voyage-3", # Defaults to `voyage-3`
    +    api_key=VOYAGE_API_KEY # Provide your Voyage API key
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string) Nama model Voyage yang akan digunakan untuk pengkodean. Anda dapat menentukan salah satu nama model Voyage yang tersedia, misalnya, voyage-3-lite, voyage-finance-2, dsb. Jika Anda membiarkan parameter ini tidak ditentukan, voyage-3 akan digunakan. Untuk daftar model yang tersedia, lihat dokumentasi resmi Voyage.
    • +
    • api_key (string) Kunci API untuk mengakses API Voyage. Untuk informasi tentang cara membuat kunci API, lihat Kunci API dan Klien Python.
    • +
    +

    Untuk membuat penyematan dokumen, gunakan metode encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = voyage_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", voyage_ef.dim, docs_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan serupa dengan yang berikut ini:

    +
    Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,
    +        0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,
    +        0.03349845,  0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,
    +        0.07658645,  0.03064499])]
    +Dim: 1024 (1024,)
    +
    +

    Untuk membuat penyematan untuk kueri, gunakan metode encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = voyage_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", voyage_ef.dim, query_embeddings[0].shape)
    +
    +

    Hasil yang diharapkan serupa dengan yang berikut ini:

    +
    Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,
    +        0.04493361,  0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,
    +        0.05706626,  0.0263358 ])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/id/embeddings/embeddings.json b/localization/v2.5.x/site/id/embeddings/embeddings.json new file mode 100644 index 000000000..9667f842f --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embeddings.json @@ -0,0 +1 @@ +{"codeList":["pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# This will download \"all-MiniLM-L6-v2\", a light weight model.\nef = model.DefaultEmbeddingFunction()\n\n# Data from which embeddings are to be generated \ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nembeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import (\n utility,\n FieldSchema, CollectionSchema, DataType,\n Collection, AnnSearchRequest, RRFRanker, connections,\n)\n","# 1. prepare a small corpus to search\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\nquery = \"Who started AI research?\"\n\n# BGE-M3 model can embed texts as dense and sparse vectors.\n# It is included in the optional `model` module in pymilvus, to install it,\n# simply run \"pip install pymilvus[model]\".\n\nbge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\n\ndocs_embeddings = bge_m3_ef(docs)\nquery_embeddings = bge_m3_ef([query])\n"],"headingContent":"Embedding Overview","anchorList":[{"label":"Gambaran Umum Embedding","href":"Embedding-Overview","type":1,"isActive":false},{"label":"Contoh 1: Gunakan fungsi penyematan default untuk menghasilkan vektor padat","href":"Example-1-Use-default-embedding-function-to-generate-dense-vectors","type":2,"isActive":false},{"label":"Contoh 2: Menghasilkan vektor padat dan vektor jarang dalam satu pemanggilan dengan model BGE M3","href":"Example-2-Generate-dense-and-sparse-vectors-in-one-call-with-BGE-M3-model","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/embeddings/embeddings.md b/localization/v2.5.x/site/id/embeddings/embeddings.md new file mode 100644 index 000000000..cc4dd9f5c --- /dev/null +++ b/localization/v2.5.x/site/id/embeddings/embeddings.md @@ -0,0 +1,143 @@ +--- +id: embeddings.md +order: 1 +summary: Pelajari cara membuat penyematan untuk data Anda. +title: Gambaran Umum Embedding +--- +

    Gambaran Umum Embedding

    Embedding adalah konsep pembelajaran mesin untuk memetakan data ke dalam ruang dimensi tinggi, di mana data dengan semantik yang sama ditempatkan berdekatan. Biasanya berupa Deep Neural Network dari BERT atau keluarga Transformer lainnya, model embedding dapat secara efektif merepresentasikan semantik teks, gambar, dan tipe data lainnya dengan serangkaian angka yang dikenal sebagai vektor. Fitur utama dari model ini adalah jarak matematis antara vektor dalam ruang dimensi tinggi dapat menunjukkan kemiripan semantik teks atau gambar asli. Properti ini membuka banyak aplikasi pencarian informasi, seperti mesin pencari web seperti Google dan Bing, pencarian produk dan rekomendasi di situs e-commerce, dan paradigma Retrieval Augmented Generation (RAG) yang baru-baru ini populer dalam AI generatif.

    +

    Ada dua kategori utama penyematan, masing-masing menghasilkan jenis vektor yang berbeda:

    +
      +
    • Penyematan padat: Sebagian besar model penyematan merepresentasikan informasi sebagai vektor titik mengambang dengan ratusan hingga ribuan dimensi. Keluarannya disebut vektor "padat" karena sebagian besar dimensi memiliki nilai bukan nol. Sebagai contoh, model penyematan sumber terbuka yang populer, BAAI/bge-base-en-v1.5 menghasilkan vektor 768 angka floating point (vektor float 768 dimensi).

    • +
    • Penyematan yangjarang: Sebaliknya, vektor keluaran dari embedding jarang memiliki sebagian besar dimensi nol, yaitu vektor "jarang". Vektor-vektor ini sering kali memiliki dimensi yang jauh lebih tinggi (puluhan ribu atau lebih) yang ditentukan oleh ukuran kosakata token. Vektor jarang dapat dihasilkan oleh Deep Neural Networks atau analisis statistik dari korpus teks. Karena kemampuan interpretasi dan kemampuan generalisasi di luar domain yang lebih baik, sematan jarang semakin banyak diadopsi oleh pengembang sebagai pelengkap sematan padat.

    • +
    +

    Milvus adalah basis data vektor yang dirancang untuk manajemen, penyimpanan, dan pengambilan data vektor. Dengan mengintegrasikan model penyematan dan pemeringkatan ulang yang umum, Anda dapat dengan mudah mengubah teks asli menjadi vektor yang dapat dicari atau memeringkat ulang hasil menggunakan model yang kuat untuk mencapai hasil yang lebih akurat untuk RAG. Integrasi ini menyederhanakan transformasi teks dan menghilangkan kebutuhan akan komponen penyematan atau pemeringkatan ulang tambahan, sehingga menyederhanakan pengembangan dan validasi RAG.

    +

    Untuk membuat penyematan dalam tindakan, lihat Menggunakan Model PyMilvus Untuk Menghasilkan Penyematan Teks.

    + + + + + + + + + + + + + + + + + +
    Fungsi PenyematanJenisAPI atau Sumber terbuka
    openaiPadatAPI
    pengubah-kalimatPadatBersumber terbuka
    SpladeJarangBersumber terbuka
    bge-m3HibridaSumber terbuka
    voyageaiPadatAPI
    jinaPadatAPI
    koherenPadatAPI
    InstrukturPadatSumber terbuka
    Mistral AIPadatAPI
    NomicPadatAPI
    mGTEHibridaSumber terbuka
    +

    Contoh 1: Gunakan fungsi penyematan default untuk menghasilkan vektor padat

    Untuk menggunakan fungsi embedding dengan Milvus, pertama-tama instal pustaka klien PyMilvus dengan subpaket model yang membungkus semua utilitas untuk pembuatan embedding.

    +
    pip install "pymilvus[model]"
    +
    +

    Subpaket model mendukung berbagai model embedding, mulai dari OpenAI, Sentence Transformers, BGE M3, hingga model-model yang telah dilatih sebelumnya oleh SPLADE. Untuk mempermudah, contoh ini menggunakan DefaultEmbeddingFunction yang merupakan model sentence transformer all-MiniLM-L6-v2, model ini berukuran sekitar 70MB dan akan diunduh pada saat pertama kali digunakan:

    +
    from pymilvus import model
    +
    +# This will download "all-MiniLM-L6-v2", a light weight model.
    +ef = model.DefaultEmbeddingFunction()
    +
    +# Data from which embeddings are to be generated 
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, embeddings[0].shape)
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Contoh 2: Menghasilkan vektor padat dan vektor jarang dalam satu pemanggilan dengan model BGE M3

    Dalam contoh ini, kami menggunakan model hibrida BGE M3 untuk menyematkan teks ke dalam vektor padat dan vektor jarang dan menggunakannya untuk mengambil dokumen yang relevan. Keseluruhan langkahnya adalah sebagai berikut:

    +
      +
    1. Sematkan teks sebagai vektor padat dan vektor jarang menggunakan model BGE-M3;

    2. +
    3. Siapkan koleksi Milvus untuk menyimpan vektor padat dan jarang;

    4. +
    5. Masukkan data ke Milvus;

    6. +
    7. Cari dan periksa hasilnya.

    8. +
    +

    Pertama, kita perlu menginstal dependensi yang diperlukan.

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import (
    +    utility,
    +    FieldSchema, CollectionSchema, DataType,
    +    Collection, AnnSearchRequest, RRFRanker, connections,
    +)
    +
    +

    Gunakan BGE M3 untuk menyandikan dokumen dan kueri untuk pengambilan embedding.

    +
    # 1. prepare a small corpus to search
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +query = "Who started AI research?"
    +
    +# BGE-M3 model can embed texts as dense and sparse vectors.
    +# It is included in the optional `model` module in pymilvus, to install it,
    +# simply run "pip install pymilvus[model]".
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +
    +docs_embeddings = bge_m3_ef(docs)
    +query_embeddings = bge_m3_ef([query])
    +
    diff --git a/localization/v2.5.x/site/id/faq/operational_faq.json b/localization/v2.5.x/site/id/faq/operational_faq.json new file mode 100644 index 000000000..2f176ba87 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/operational_faq.json @@ -0,0 +1 @@ +{"codeList":["{\n \"registry-mirrors\": [\"https://registry.docker-cn.com\"]\n}\n","$ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512\n","pip install pymilvus>=2.4.2\n","# Python Example: result of len() str cannot be used as \"max-length\" in Milvus \n>>> s = \"你好,世界!\"\n>>> len(s) # Number of characters of s.\n6\n>>> len(bytes(s, \"utf-8\")) # Size in bytes of s, max-length in Milvus.\n18\n","pip install pymilvus>=2.4.2\n"],"headingContent":"Operational FAQ","anchorList":[{"label":"Pertanyaan Umum Operasional","href":"Operational-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/faq/operational_faq.md b/localization/v2.5.x/site/id/faq/operational_faq.md new file mode 100644 index 000000000..a1999a33a --- /dev/null +++ b/localization/v2.5.x/site/id/faq/operational_faq.md @@ -0,0 +1,109 @@ +--- +id: operational_faq.md +summary: >- + Temukan jawaban atas pertanyaan umum yang sering diajukan tentang operasi di + Milvus. +title: Pertanyaan Umum Operasional +--- +

    Pertanyaan Umum Operasional

    Bagaimana jika saya gagal menarik citra Milvus Docker dari Docker Hub?

    Jika Anda gagal menarik citra Milvus Docker dari Docker Hub, coba tambahkan mirror registri lainnya.

    +

    Pengguna dari Tiongkok Daratan dapat menambahkan URL "https://registry.docker-cn.com" ke larik registri-mirror di /etc.docker/daemon.json.

    +
    {
    +  "registry-mirrors": ["https://registry.docker-cn.com"]
    +}
    +
    +

    Apakah Docker satu-satunya cara untuk menginstal dan menjalankan Milvus?

    Docker adalah cara yang efisien untuk menggunakan Milvus, tetapi bukan satu-satunya cara. Anda juga dapat menggunakan Milvus dari kode sumber. Ini membutuhkan Ubuntu (18.04 atau lebih tinggi) atau CentOS (7 atau lebih tinggi). Lihat Membangun Milvus dari Kode Sumber untuk informasi lebih lanjut.

    +

    Apa saja faktor utama yang memengaruhi pemanggilan?

    Pemanggilan dipengaruhi terutama oleh jenis indeks dan parameter pencarian.

    +

    Untuk indeks FLAT, Milvus melakukan pemindaian menyeluruh di dalam koleksi, dengan pengembalian 100%.

    +

    Untuk indeks IVF, parameter nprobe menentukan cakupan pencarian di dalam koleksi. Meningkatkan nprobe akan meningkatkan proporsi vektor yang dicari dan penarikan kembali, tetapi mengurangi kinerja kueri.

    +

    Untuk indeks HNSW, parameter ef menentukan luasnya pencarian grafik. Meningkatkan ef akan meningkatkan jumlah titik yang dicari pada grafik dan penarikan, tetapi mengurangi kinerja kueri.

    +

    Untuk informasi lebih lanjut, lihat Pengindeksan Vektor.

    +

    Mengapa perubahan yang saya lakukan pada file konfigurasi tidak berlaku?

    Milvus tidak mendukung modifikasi pada file konfigurasi selama runtime. Anda harus memulai ulang Milvus Docker agar perubahan pada berkas konfigurasi dapat diterapkan.

    +

    Bagaimana saya tahu jika Milvus telah berhasil dijalankan?

    Jika Milvus dimulai menggunakan Docker Compose, jalankan docker ps untuk mengamati berapa banyak kontainer Docker yang berjalan dan memeriksa apakah layanan Milvus telah dimulai dengan benar.

    +

    Untuk Milvus mandiri, Anda seharusnya dapat mengamati setidaknya tiga kontainer Docker yang berjalan, satu adalah layanan Milvus dan dua lainnya adalah layanan manajemen dan penyimpanan etcd. Untuk informasi lebih lanjut, lihat Menginstalasi Milvus Mandiri.

    +

    Mengapa waktu dalam berkas log berbeda dengan waktu sistem?

    Perbedaan waktu biasanya disebabkan oleh fakta bahwa mesin hos tidak menggunakan Waktu Universal Terkoordinasi (UTC).

    +

    Berkas log di dalam citra Docker menggunakan UTC secara default. Jika mesin hos Anda tidak menggunakan UTC, masalah ini dapat terjadi.

    +

    Bagaimana saya tahu jika CPU saya mendukung Milvus?

    Operasi komputasi Milvus bergantung pada dukungan CPU untuk set instruksi ekstensi SIMD (Single Instruction, Multiple Data). Dukungan CPU Anda terhadap set instruksi ekstensi SIMD sangat penting untuk pembuatan indeks dan pencarian kemiripan vektor dalam Milvus. Pastikan bahwa CPU Anda mendukung setidaknya satu dari set instruksi SIMD berikut ini:

    +
      +
    • SSE4.2
    • +
    • AVX
    • +
    • AVX2
    • +
    • AVX512
    • +
    +

    Jalankan perintah lscpu untuk memeriksa apakah CPU Anda mendukung set instruksi SIMD yang disebutkan di atas:

    +
    $ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512
    +
    +

    Mengapa Milvus mengembalikan illegal instruction selama startup?

    Milvus membutuhkan CPU Anda untuk mendukung set instruksi SIMD: SSE4.2, AVX, AVX2, atau AVX512. CPU harus mendukung setidaknya salah satu dari ini untuk memastikan bahwa Milvus beroperasi secara normal. Kesalahan illegal instruction yang dikembalikan saat startup menunjukkan bahwa CPU Anda tidak mendukung salah satu dari empat set instruksi di atas.

    +

    Lihat dukungan CPU untuk Set Instruksi SIMD.

    +

    Dapatkah saya menginstal Milvus pada Windows?

    Ya, Anda dapat menginstall Milvus pada Windows baik dengan meng-compile dari kode sumber atau dari paket biner.

    +

    Lihat Menjalankan Milvus pada Windows untuk mempelajari cara menginstal Milvus pada Windows.

    +

    Saya mendapatkan kesalahan saat menginstal pymilvus pada Windows. Apa yang harus saya lakukan?

    Tidak disarankan untuk menginstal PyMilvus pada Windows. Tetapi jika Anda harus menginstal PyMilvus di Windows tetapi mendapatkan kesalahan, cobalah menginstalnya di lingkungan Conda. Lihat Instal Milvus SDK untuk informasi lebih lanjut tentang cara menginstal PyMilvus di lingkungan Conda.

    +

    Dapatkah saya menggunakan Milvus ketika terputus dari Internet?

    Ya, Anda dapat menginstal Milvus di lingkungan offline. Lihat Menginstal Milvus Offline untuk informasi lebih lanjut.

    +

    Di mana saya bisa menemukan log yang dihasilkan oleh Milvus?

    Log Milvus dicetak ke stout (keluaran standar) dan stderr (kesalahan standar) secara default, namun kami sangat menyarankan untuk mengalihkan log Anda ke volume persisten dalam produksi. Untuk melakukannya, perbarui log.file.rootPath di milvus.yaml. Dan jika Anda menggunakan Milvus dengan milvus-helm chart, Anda juga perlu mengaktifkan persistensi log terlebih dahulu melalui --set log.persistence.enabled=true.

    +

    Jika Anda tidak mengubah konfigurasi, menggunakan log kubectl <pod-name> atau log docker CONTAINER juga dapat membantu Anda menemukan log.

    +

    Dapatkah saya membuat indeks untuk suatu segmen sebelum memasukkan data ke dalamnya?

    Ya, Anda bisa. Namun, kami menyarankan untuk memasukkan data secara berkelompok, yang masing-masing tidak boleh melebihi 256 MB, sebelum mengindeks setiap segmen.

    +

    Dapatkah saya berbagi sebuah instance etcd di antara beberapa instance Milvus?

    Ya, Anda dapat berbagi instance etcd di antara beberapa instance Milvus. Untuk melakukannya, Anda perlu mengubah etcd.rootPath menjadi nilai yang terpisah untuk setiap instans Milvus dalam berkas konfigurasi masing-masing instans sebelum memulainya.

    +

    Dapatkah saya membagikan sebuah instans Pulsar di antara beberapa instans Milvus?

    Ya, Anda dapat berbagi instans Pulsar di antara beberapa instans Milvus. Untuk melakukannya, Anda dapat

    +
      +
    • Jika multi-tenancy diaktifkan pada instans Pulsar Anda, pertimbangkan untuk mengalokasikan penyewa atau namespace terpisah untuk setiap instans Milvus. Untuk melakukannya, Anda perlu mengubah pulsar.tenant atau pulsar.namespace dalam berkas konfigurasi instans Milvus Anda menjadi nilai unik untuk masing-masing instans sebelum memulainya.
    • +
    • Jika Anda tidak berencana untuk mengaktifkan multi-tenancy pada instans Pulsar Anda, pertimbangkan untuk mengubah msgChannel.chanNamePrefix.cluster dalam berkas konfigurasi instans Milvus Anda menjadi nilai unik untuk masing-masing instans sebelum memulainya.
    • +
    +

    Dapatkah saya berbagi instance MinIO di antara beberapa instance Milvus?

    Ya, Anda dapat berbagi instance MinIO di antara beberapa instance Milvus. Untuk melakukannya, Anda perlu mengubah minio.rootPath menjadi nilai unik untuk setiap instans Milvus dalam file konfigurasi masing-masing sebelum memulai mereka.

    +

    Bagaimana cara menangani pesan kesalahan pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>?

    Pesan kesalahan Illegal uri [example.db] mengindikasikan bahwa Anda mencoba terhubung ke Milvus Lite menggunakan versi PyMilvus yang lebih lama yang tidak mendukung tipe koneksi ini. Untuk mengatasi masalah ini, perbarui instalasi PyMilvus Anda ke setidaknya versi 2.4.2, yang mencakup dukungan untuk terhubung ke Milvus Lite.

    +

    Anda dapat memutakhirkan PyMilvus dengan menggunakan perintah berikut:

    +
    pip install pymilvus>=2.4.2
    +
    +

    Mengapa saya mendapatkan hasil yang lebih sedikit daripada limit yang saya tetapkan dalam pencarian/kueri saya?

    Ada beberapa alasan mengapa Anda mendapatkan hasil yang lebih sedikit dari limit yang Anda tentukan:

    +
      +
    • Data terbatas: Koleksi mungkin tidak memiliki cukup entitas untuk memenuhi batas yang Anda minta. Jika jumlah total entitas dalam koleksi kurang dari batas, Anda akan menerima hasil yang lebih sedikit.

    • +
    • Kunci Utama Duplikat: Milvus memprioritaskan entitas tertentu ketika menemukan kunci utama duplikat selama pencarian. Perilaku ini bervariasi berdasarkan jenis pencarian:

    • +
    • Kueri (Pencocokan Tepat): Milvus memilih entitas terbaru dengan PK yang cocok Pencarian ANN: Milvus memilih entitas dengan nilai kemiripan tertinggi, meskipun entitas memiliki PK yang sama. Prioritas ini dapat menghasilkan hasil unik yang lebih sedikit daripada batas jika koleksi Anda memiliki banyak kunci utama yang sama.

    • +
    • Kecocokan yang tidak mencukupi: Ekspresi pemfilteran pencarian Anda mungkin terlalu ketat, sehingga menghasilkan lebih sedikit entitas yang memenuhi ambang batas kemiripan. Jika kondisi yang ditetapkan untuk pencarian terlalu ketat, tidak cukup banyak entitas yang cocok, sehingga menghasilkan hasil yang lebih sedikit dari yang diharapkan.

    • +
    +

    MilvusClient("milvus_demo.db") gives an error: ModuleNotFoundError: No module named 'milvus_lite'. Apa yang menyebabkan hal ini dan bagaimana cara mengatasinya?

    Kesalahan ini terjadi ketika Anda mencoba menggunakan Milvus Lite pada platform Windows. Milvus Lite terutama didesain untuk lingkungan Linux dan mungkin tidak memiliki dukungan asli untuk Windows.

    +

    Solusinya adalah menggunakan lingkungan Linux:

    +
      +
    • Gunakan sistem operasi berbasis Linux atau mesin virtual untuk menjalankan Milvus Lite.
    • +
    • Pendekatan ini akan memastikan kompatibilitas dengan ketergantungan dan fungsionalitas perpustakaan.
    • +
    +

    Apa yang dimaksud dengan kesalahan "panjang melebihi panjang maksimum" di Milvus, dan bagaimana cara untuk memahami dan mengatasinya?

    Kesalahan "panjang melebihi panjang maksimal" di Milvus terjadi ketika ukuran elemen data melebihi ukuran maksimum yang diperbolehkan untuk sebuah koleksi atau field. Berikut adalah beberapa contoh dan penjelasannya:

    +
      +
    • Kesalahan bidang JSON: <MilvusException: (code=1100, message=the length (398324) of json field (metadata) exceeds max length (65536): expected=valid length json string, actual=length exceeds max length: invalid parameter)>

    • +
    • Kesalahan panjang string: <ParamError: (code=1, message=invalid input, length of string exceeds max length. length: 74238, max length: 60535)>

    • +
    • Kesalahan bidang VarChar: <MilvusException: (code=1100, message=the length (60540) of 0th VarChar paragraph exceeds max length (0)%!(EXTRA int64=60535): invalid parameter)>

    • +
    +

    Untuk memahami dan mengatasi kesalahan-kesalahan ini:

    +
      +
    • Pahami bahwa len(str) dalam Python mewakili jumlah karakter, bukan ukuran dalam byte.
    • +
    • Untuk tipe data berbasis string seperti VARCHAR dan JSON, gunakan len(bytes(str, encoding='utf-8')) untuk menentukan ukuran sebenarnya dalam byte, yang digunakan Milvus untuk "max-length".
    • +
    +

    Contoh dalam Python:

    +
    # Python Example: result of len() str cannot be used as "max-length" in Milvus 
    +>>> s = "你好,世界!"
    +>>> len(s) # Number of characters of s.
    +6
    +>>> len(bytes(s, "utf-8")) # Size in bytes of s, max-length in Milvus.
    +18
    +
    +

    pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>. Apa yang menyebabkan hal ini dan bagaimana cara mengatasinya?

    Kesalahan ini mengindikasikan bahwa Anda mencoba terhubung ke Milvus Lite menggunakan versi pymilvus yang lebih lama yang tidak mendukungnya. Untuk mengatasinya, tingkatkan instalasi pymilvus Anda ke setidaknya versi 2.4.2. Versi ini mendukung koneksi ke Milvus Lite. Untuk memutakhirkan, gunakan perintah berikut:

    +
    pip install pymilvus>=2.4.2
    +
    +

    Masih memiliki pertanyaan?

    Tentu saja bisa:

    +
      +
    • Lihat Milvus di GitHub. Jangan ragu untuk mengajukan pertanyaan, berbagi ide, dan membantu orang lain.
    • +
    • Bergabunglah dengan Forum Milvus atau Saluran Slack untuk mendapatkan dukungan dan terlibat dengan komunitas sumber terbuka kami.
    • +
    diff --git a/localization/v2.5.x/site/id/faq/performance_faq.json b/localization/v2.5.x/site/id/faq/performance_faq.json new file mode 100644 index 000000000..6ae647ec8 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/performance_faq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Performance FAQ","anchorList":[{"label":"Pertanyaan Umum tentang Kinerja","href":"Performance-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/faq/performance_faq.md b/localization/v2.5.x/site/id/faq/performance_faq.md new file mode 100644 index 000000000..17ed03d75 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/performance_faq.md @@ -0,0 +1,51 @@ +--- +id: performance_faq.md +summary: >- + Temukan jawaban atas pertanyaan yang sering diajukan tentang performa + pencarian, peningkatan performa, dan masalah terkait performa lainnya. +title: Pertanyaan Umum tentang Kinerja +--- +

    Pertanyaan Umum tentang Kinerja

    Bagaimana cara mengatur nlist dan nprobe untuk indeks IVF?

    Menyetel nlist bersifat spesifik untuk setiap skenario. Sebagai patokan, nilai yang disarankan untuk nlist adalah 4 × sqrt(n), di mana n adalah jumlah total entitas dalam sebuah segmen.

    +

    Ukuran setiap segmen ditentukan oleh parameter datacoord.segment.maxSize, yang disetel ke 512 MB secara default. Jumlah total entitas dalam segmen n dapat diperkirakan dengan membagi datacoord.segment.maxSize dengan ukuran masing-masing entitas.

    +

    Pengaturan nprobe khusus untuk dataset dan skenario, dan melibatkan pertukaran antara akurasi dan kinerja kueri. Kami merekomendasikan untuk menemukan nilai ideal melalui eksperimen berulang kali.

    +

    Grafik berikut ini adalah hasil dari uji coba yang dilakukan pada dataset sift50m dan indeks IVF_SQ8, yang membandingkan performa recall dan kueri dari pasangan nlist/nprobe yang berbeda.

    +

    + + Accuracy test + Uji akurasi Performance testUji kinerja

    +

    Mengapa kueri terkadang membutuhkan waktu lebih lama pada set data yang lebih kecil?

    Operasi kueri dilakukan pada segmen. Indeks mengurangi jumlah waktu yang diperlukan untuk melakukan kueri pada sebuah segmen. Jika sebuah segmen belum diindeks, Milvus menggunakan pencarian brute-force pada data mentah - meningkatkan waktu kueri secara drastis.

    +

    Oleh karena itu, biasanya diperlukan waktu lebih lama untuk melakukan kueri pada kumpulan data yang kecil (koleksi) karena belum membangun indeks. Hal ini karena ukuran segmen-segmennya belum mencapai ambang batas pembangunan indeks yang ditetapkan oleh rootCoord.minSegmentSizeToEnableindex. Hubungi create_index() untuk memaksa Milvus mengindeks segmen yang telah mencapai ambang batas tetapi belum diindeks secara otomatis, sehingga secara signifikan meningkatkan kinerja kueri.

    +

    Faktor-faktor apa saja yang memengaruhi penggunaan CPU?

    Penggunaan CPU meningkat ketika Milvus membangun indeks atau menjalankan kueri. Secara umum, pembuatan indeks menggunakan CPU yang intensif kecuali ketika menggunakan Annoy, yang berjalan pada satu thread.

    +

    Ketika menjalankan kueri, penggunaan CPU dipengaruhi oleh nq dan nprobe. Ketika nq dan nprobe kecil, konkurensi rendah dan penggunaan CPU tetap rendah.

    +

    Apakah memasukkan data dan pencarian secara bersamaan memengaruhi kinerja kueri?

    Operasi penyisipan tidak menggunakan CPU secara intensif. Namun, karena segmen baru mungkin belum mencapai ambang batas untuk pembuatan indeks, Milvus menggunakan pencarian brute-force - yang secara signifikan memengaruhi kinerja kueri.

    +

    Parameter rootcoord.minSegmentSizeToEnableIndex menentukan ambang batas pembuatan indeks untuk sebuah segmen, dan diatur ke 1024 baris secara default. Lihat Konfigurasi Sistem untuk informasi lebih lanjut.

    +

    Apakah mengindeks bidang VARCHAR dapat meningkatkan kecepatan penghapusan?

    Mengindeks bidang VARCHAR dapat mempercepat operasi "Hapus Berdasarkan Ekspresi", tetapi hanya dalam kondisi tertentu:

    +
      +
    • Indeks Terbalik: Indeks ini membantu untuk ekspresi IN atau == pada field VARCHAR non-kunci utama.
    • +
    • Indeks Trie: Indeks ini membantu untuk kueri awalan (misalnya, LIKE prefix%) pada bidang VARCHAR non-kunci utama.
    • +
    +

    Namun, mengindeks bidang VARCHAR tidak mempercepat:

    +
      +
    • Menghapus berdasarkan ID: Ketika bidang VARCHAR adalah kunci utama.
    • +
    • Ekspresi yang tidak terkait: Ketika bidang VARCHAR bukan bagian dari ekspresi penghapusan.
    • +
    +

    Masih memiliki pertanyaan?

    Anda bisa:

    +
      +
    • Lihat Milvus di GitHub. Jangan ragu untuk bertanya, berbagi ide, dan membantu orang lain.
    • +
    • Bergabunglah dengan Saluran Slack kami untuk mendapatkan dukungan dan terlibat dengan komunitas sumber terbuka kami.
    • +
    diff --git a/localization/v2.5.x/site/id/faq/product_faq.json b/localization/v2.5.x/site/id/faq/product_faq.json new file mode 100644 index 000000000..ad7f4afab --- /dev/null +++ b/localization/v2.5.x/site/id/faq/product_faq.json @@ -0,0 +1 @@ +{"codeList":["60 * 2 * 4 + 40 * 1 * 12 = 960\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n"],"headingContent":"Product FAQ","anchorList":[{"label":"Tanya Jawab Produk","href":"Product-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/faq/product_faq.md b/localization/v2.5.x/site/id/faq/product_faq.md new file mode 100644 index 000000000..0e3ed1419 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/product_faq.md @@ -0,0 +1,102 @@ +--- +id: product_faq.md +summary: >- + Temukan jawaban atas pertanyaan yang sering diajukan tentang basis data vektor + tercanggih di dunia. +title: Tanya Jawab Produk +--- +

    Tanya Jawab Produk

    Berapa harga Milvus?

    Milvus adalah proyek sumber terbuka yang 100% gratis.

    +

    Mohon patuhi Lisensi Apache 2.0 ketika menggunakan Milvus untuk tujuan produksi atau distribusi.

    +

    Zilliz, perusahaan di balik Milvus, juga menawarkan versi cloud yang dikelola sepenuhnya dari platform ini bagi mereka yang tidak ingin membangun dan memelihara instance terdistribusi mereka sendiri. Zilliz Cloud secara otomatis menjaga keandalan data dan memungkinkan pengguna membayar hanya untuk apa yang mereka gunakan.

    +

    Apakah Milvus mendukung arsitektur non-x86?

    Milvus tidak dapat diinstal atau dijalankan pada platform non-x86.

    +

    CPU Anda harus mendukung salah satu set instruksi berikut untuk menjalankan Milvus: SSE4.2, AVX, AVX2, AVX512. Ini semua adalah set instruksi SIMD khusus x86.

    +

    Di mana Milvus menyimpan data?

    Milvus menangani dua jenis data, data yang disisipkan dan metadata.

    +

    Data yang disisipkan, termasuk data vektor, data skalar, dan skema khusus koleksi, disimpan dalam penyimpanan persisten sebagai log tambahan. Milvus mendukung beberapa backend penyimpanan objek, termasuk MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, dan Tencent Cloud Object Storage (COS).

    +

    Metadata dibuat di dalam Milvus. Setiap modul Milvus memiliki metadata sendiri yang disimpan dalam etcd.

    +

    Mengapa tidak ada data vektor di etcd?

    etcd menyimpan metadata modul Milvus; MinIO menyimpan entitas.

    +

    Apakah Milvus mendukung penyisipan dan pencarian data secara bersamaan?

    Ya. Operasi penyisipan dan operasi kueri ditangani oleh dua modul terpisah yang saling independen. Dari perspektif klien, operasi penyisipan selesai ketika data yang disisipkan masuk ke dalam antrian pesan. Namun, data yang disisipkan tidak dapat dicari sampai data tersebut dimuat ke node kueri. Jika ukuran segmen tidak mencapai ambang batas pembuatan indeks (512 MB secara default), Milvus menggunakan pencarian brute-force dan kinerja kueri dapat berkurang.

    +

    Dapatkah vektor dengan kunci primer ganda dimasukkan ke dalam Milvus?

    Ya. Milvus tidak memeriksa apakah kunci primer vektor adalah duplikat.

    +

    Ketika vektor dengan kunci primer ganda dimasukkan, apakah Milvus memperlakukannya sebagai operasi pembaruan?

    Tidak. Milvus saat ini tidak mendukung operasi pembaruan dan tidak memeriksa apakah kunci utama entitas adalah duplikat. Anda bertanggung jawab untuk memastikan bahwa primary key entitas adalah unik, dan jika tidak, Milvus dapat berisi beberapa entitas dengan primary key yang terduplikasi.

    +

    Jika hal ini terjadi, salinan data mana yang akan dikembalikan ketika ditanyakan masih belum diketahui. Batasan ini akan diperbaiki di rilis mendatang.

    +

    Berapa panjang maksimum dari kunci primer entitas yang ditentukan sendiri?

    Kunci utama entitas harus berupa bilangan bulat 64-bit non-negatif.

    +

    Berapa jumlah maksimum data yang dapat ditambahkan per operasi penyisipan?

    Operasi penyisipan tidak boleh melebihi ukuran 1.024 MB. Ini adalah batas yang ditetapkan oleh gRPC.

    +

    Apakah ukuran koleksi memengaruhi performa kueri saat mencari di partisi tertentu?

    Tidak. Jika partisi untuk pencarian ditentukan, Milvus hanya akan mencari di partisi yang ditentukan.

    +

    Tergantung data apa yang dibutuhkan untuk pencarian. Semua partisi yang mungkin muncul dalam hasil pencarian harus dimuat sebelum melakukan pencarian.

    +
      +
    • Sebagai contoh, jika Anda hanya ingin mencari partisi tertentu, Anda tidak perlu memuat semua partisi. Panggil load_partition() untuk memuat partisi yang dituju , lalu tentukan partisi dalam pemanggilan metode search().
    • +
    • Jika Anda ingin mencari semua partisi, panggil load_collection() untuk memuat seluruh koleksi termasuk semua partisi.
    • +
    • Jika Anda gagal memuat koleksi atau partisi tertentu sebelum melakukan pencarian, Milvus akan mengembalikan sebuah kesalahan.
    • +
    +

    Dapatkah indeks dibuat setelah memasukkan vektor?

    Ya. Jika indeks telah dibuat untuk koleksi oleh create_index() sebelumnya, Milvus akan secara otomatis membuat indeks untuk vektor yang disisipkan setelahnya. Namun, Milvus tidak membuat indeks sampai vektor yang baru disisipkan memenuhi seluruh ruas dan berkas indeks yang baru dibuat terpisah dari berkas indeks sebelumnya.

    +

    Apa perbedaan antara indeks FLAT dan IVF_FLAT?

    Indeks IVF_FLAT membagi ruang vektor ke dalam kelompok daftar. Pada nilai daftar default 16.384, Milvus membandingkan jarak antara vektor target dan centroid dari semua 16.384 klaster untuk kembali menyelidiki klaster terdekat. Milvus kemudian membandingkan jarak antara vektor target dan vektor dalam cluster yang dipilih untuk mendapatkan vektor terdekat. Tidak seperti IVF_FLAT, FLAT secara langsung membandingkan jarak antara vektor target dan setiap vektor lainnya.

    +

    Ketika jumlah total vektor kurang lebih sama dengan nlist, hanya ada sedikit perbedaan antara IVF_FLAT dan FLAT dalam hal persyaratan perhitungan dan kinerja pencarian. Namun, ketika jumlah vektor melebihi nlist dengan faktor dua atau lebih, IVF_FLAT mulai menunjukkan keunggulan kinerja.

    +

    Lihat Indeks Vektor untuk informasi lebih lanjut.

    +

    Bagaimana cara Milvus mem-flash data?

    Milvus mengembalikan hasil yang sukses ketika data yang disisipkan dimasukkan ke dalam antrean pesan. Namun, data belum di-flush ke disk. Kemudian simpul data Milvus menulis data dalam antrean pesan ke penyimpanan persisten sebagai log tambahan. Jika flush() dipanggil, simpul data dipaksa untuk menulis semua data dalam antrean pesan ke penyimpanan persisten dengan segera.

    +

    Apa yang dimaksud dengan normalisasi? Mengapa normalisasi dibutuhkan?

    Normalisasi mengacu pada proses mengubah sebuah vektor sehingga normanya sama dengan 1. Jika inner product digunakan untuk menghitung kesamaan vektor, vektor harus dinormalisasi. Setelah normalisasi, hasil kali dalam sama dengan kemiripan kosinus.

    +

    Lihat Wikipedia untuk informasi lebih lanjut.

    +

    Mengapa jarak Euclidean (L2) dan inner product (IP) memberikan hasil yang berbeda?

    Untuk vektor yang dinormalisasi, jarak Euclidean (L2) secara matematis setara dengan inner product (IP). Jika metrik kemiripan ini memberikan hasil yang berbeda, periksa apakah vektor Anda dinormalisasi

    +

    Apakah ada batasan jumlah total koleksi dan partisi di Milvus?

    Ya, Anda dapat membuat hingga 65.535 koleksi dalam sebuah instans Milvus. Ketika menghitung jumlah koleksi yang ada, Milvus menghitung semua koleksi dengan pecahan dan partisi di dalamnya.

    +

    Sebagai contoh, anggaplah Anda telah membuat 100 koleksi, dengan 2 pecahan dan 4 partisi di 60 koleksi dan 1 pecahan dan 12 partisi di 40 koleksi lainnya. Jumlah koleksi saat ini dapat dihitung sebagai:

    +
    60 * 2 * 4 + 40 * 1 * 12 = 960
    +
    +

    Mengapa saya mendapatkan lebih sedikit dari k vektor ketika mencari vektor topk?

    Di antara indeks-indeks yang didukung Milvus, IVF_FLAT dan IVF_SQ8 mengimplementasikan metode pengelompokan k-means. Sebuah ruang data dibagi menjadi beberapa cluster nlist dan vektor yang dimasukkan didistribusikan ke cluster-cluster ini. Milvus kemudian memilih nprobe cluster terdekat dan membandingkan jarak antara vektor target dan semua vektor dalam cluster yang dipilih untuk mengembalikan hasil akhir.

    +

    Jika nlist dan topk besar dan nprobe kecil, jumlah vektor dalam klaster nprobe mungkin kurang dari k. Oleh karena itu, ketika Anda mencari topk vektor terdekat, jumlah vektor yang dikembalikan kurang dari k.

    +

    Untuk menghindari hal ini, coba atur nprobe lebih besar dan nlist dan k lebih kecil.

    +

    Lihat Indeks Vektor untuk informasi lebih lanjut.

    +

    Berapa dimensi vektor maksimum yang didukung oleh Milvus?

    Milvus dapat mengelola vektor hingga 32.768 dimensi secara default. Anda dapat meningkatkan nilai Proxy.maxDimension untuk memungkinkan vektor dengan dimensi yang lebih besar.

    +

    Apakah Milvus mendukung CPU Apple M1?

    Rilis Milvus saat ini tidak mendukung Apple M1 CPU secara langsung. Setelah Milvus 2.3, Milvus menyediakan image Docker untuk arsitektur ARM64.

    +

    Tipe data apa yang didukung Milvus pada bidang kunci utama?

    Pada rilis saat ini, Milvus mendukung INT64 dan string.

    +

    Apakah Milvus dapat diskalakan?

    Ya. Anda dapat menggunakan cluster Milvus dengan banyak node melalui Helm Chart di Kubernetes. Lihat Panduan Skala untuk instruksi lebih lanjut.

    +

    Apa yang dimaksud dengan growing segment dan sealed segment?

    Ketika permintaan pencarian datang, Milvus mencari data tambahan dan data historis. Data tambahan adalah pembaruan terkini, yang disimpan di segmen yang berkembang, yang disangga dalam memori sebelum mencapai ambang batas untuk dipertahankan dalam penyimpanan objek dan indeks yang lebih efisien dibuat untuknya, sedangkan data historis adalah pembaruan beberapa waktu yang lalu. Data tersebut berada dalam segmen tertutup yang telah disimpan dalam penyimpanan objek. Data tambahan dan data historis bersama-sama membentuk keseluruhan kumpulan data untuk pencarian. Desain ini membuat data apa pun yang dimasukkan ke Milvus dapat langsung dicari. Untuk Milvus Distributed, ada faktor yang lebih kompleks yang menentukan kapan sebuah record yang baru saja dimasukkan dapat muncul di hasil pencarian. Pelajari lebih lanjut mengenai hal tersebut di tingkat konsistensi.

    +

    Ya. Untuk kueri pada koleksi yang sama, Milvus secara bersamaan mencari data tambahan dan data historis. Namun, pencarian pada koleksi yang berbeda dilakukan secara berurutan. Meskipun data historis dapat berupa kumpulan data yang sangat besar, pencarian pada data historis relatif lebih memakan waktu dan pada dasarnya dilakukan secara seri.

    +

    Mengapa data di MinIO tetap ada setelah koleksi yang bersangkutan dihapus?

    Data di MinIO dirancang untuk tetap ada selama jangka waktu tertentu untuk kenyamanan pengembalian data.

    +

    Apakah Milvus mendukung mesin pesan selain Pulsar?

    Ya. Kafka didukung di Milvus 2.1.0.

    +

    Apa perbedaan antara pencarian dan kueri?

    Di Milvus, pencarian kemiripan vektor mengambil vektor berdasarkan perhitungan kemiripan dan akselerasi indeks vektor. Tidak seperti pencarian kemiripan vektor, kueri vektor mengambil vektor melalui pemfilteran skalar berdasarkan ekspresi boolean. Ekspresi boolean memfilter bidang skalar atau bidang kunci utama, dan mengambil semua hasil yang cocok dengan filter. Dalam kueri, tidak ada metrik kemiripan maupun indeks vektor yang terlibat.

    +

    Mengapa nilai vektor float memiliki ketepatan 7 digit desimal di Milvus?

    Milvus mendukung penyimpanan vektor sebagai larik Float32. Nilai Float32 memiliki ketelitian 7 digit desimal. Bahkan dengan nilai Float64, seperti 1.3476964684980388, Milvus menyimpannya sebagai 1.347696. Oleh karena itu, ketika Anda mengambil vektor seperti itu dari Milvus, ketepatan nilai Float64 akan hilang.

    +

    Bagaimana Milvus menangani tipe data vektor dan ketepatannya?

    Milvus mendukung tipe vektor Biner, Float32, Float16, dan BFloat16.

    +
      +
    • Vektor biner: Menyimpan data biner sebagai urutan 0 dan 1, yang digunakan dalam pemrosesan gambar dan pengambilan informasi.
    • +
    • Vektor Float32: Penyimpanan default dengan presisi sekitar 7 digit desimal. Bahkan nilai Float64 pun disimpan dengan presisi Float32, yang menyebabkan potensi kehilangan presisi pada saat pengambilan.
    • +
    • Vektor Float16 dan BFloat16: Menawarkan pengurangan presisi dan penggunaan memori. Float16 cocok untuk aplikasi dengan bandwidth dan penyimpanan terbatas, sedangkan BFloat16 menyeimbangkan jangkauan dan efisiensi, biasanya digunakan dalam deep learning untuk mengurangi kebutuhan komputasi tanpa memengaruhi akurasi secara signifikan.
    • +
    +

    Apakah Milvus mendukung penentuan nilai default untuk bidang skalar atau vektor?

    Saat ini, Milvus 2.4.x tidak mendukung penentuan nilai default untuk bidang skalar atau vektor. Fitur ini direncanakan untuk rilis mendatang.

    +

    Apakah ruang penyimpanan akan langsung tersedia setelah penghapusan data di Milvus?

    Tidak, ruang penyimpanan tidak akan langsung dilepaskan ketika Anda menghapus data di Milvus. Meskipun menghapus data menandai entitas sebagai "dihapus secara logis", ruang penyimpanan yang sebenarnya mungkin tidak langsung kosong. Inilah alasannya:

    +
      +
    • Pemadatan: Milvus secara otomatis memadatkan data di latar belakang. Proses ini menggabungkan segmen data yang lebih kecil menjadi lebih besar dan menghapus data yang dihapus secara logis (entitas yang ditandai untuk dihapus) atau data yang telah melampaui Time-To-Live (TTL). Namun, pemadatan menciptakan segmen baru sekaligus menandai segmen lama sebagai "Dibuang".
    • +
    • Pengumpulan Sampah: Proses terpisah yang disebut Garbage Collection (GC) secara berkala menghapus segmen "Dropped" ini, membebaskan ruang penyimpanan yang mereka tempati. Hal ini memastikan penggunaan penyimpanan yang efisien, tetapi dapat menimbulkan sedikit penundaan antara penghapusan dan reklamasi ruang.
    • +
    +

    Dapatkah saya melihat data yang disisipkan, dihapus, atau disisipkan segera setelah operasi tanpa menunggu flush?

    Ya, di Milvus, visibilitas data tidak secara langsung terkait dengan operasi flush karena arsitektur pemilahan komputasi penyimpanannya. Anda dapat mengelola keterbacaan data menggunakan tingkat konsistensi.

    +

    Ketika memilih tingkat konsistensi, pertimbangkan trade-off antara konsistensi dan kinerja. Untuk operasi yang membutuhkan visibilitas langsung, gunakan tingkat konsistensi "Kuat". Untuk penulisan yang lebih cepat, prioritaskan konsistensi yang lebih lemah (data mungkin tidak langsung terlihat). Untuk informasi lebih lanjut, lihat Konsistensi.

    +

    Setelah mengaktifkan fitur kunci partisi, berapa nilai default dari num_partitions di Milvus, dan mengapa?

    Ketika fitur kunci partisi diaktifkan, nilai default dari num_partitions di Milvus diatur ke 16. Nilai default ini dipilih karena alasan stabilitas dan kinerja. Anda dapat menyesuaikan nilai num_partitions sesuai kebutuhan dengan menentukannya di fungsi create_collection.

    +

    Apakah ada batas panjang maksimum untuk ekspresi pemfilteran skalar?

    Ya, panjang maksimum ekspresi pemfilteran skalar dibatasi oleh batas transfer RPC, yang ditentukan dalam file konfigurasi milvus.yaml. Secara khusus, batas tersebut ditetapkan oleh parameter serverMaxRecvSize di bawah bagian proxy:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    Secara default, ukuran maksimum setiap permintaan RPC adalah 64MB. Oleh karena itu, panjang ekspresi pemfilteran harus kurang dari batas ini untuk memastikan pemrosesan yang berhasil.

    +

    Saat melakukan pencarian vektor massal, berapa banyak vektor yang dapat ditentukan sekaligus? Apakah ada batasnya?

    Ya, jumlah vektor yang dapat ditentukan dalam pencarian vektor massal dibatasi oleh ukuran transfer RPC, seperti yang ditentukan dalam file konfigurasi milvus.yaml. Batas ini ditentukan oleh parameter serverMaxRecvSize di bawah bagian proxy:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    Secara default, ukuran maksimum setiap permintaan RPC adalah 64MB. Oleh karena itu, ukuran total vektor input, termasuk data dimensi dan metadata, harus kurang dari batas ini untuk memastikan eksekusi yang sukses.

    +

    Masih memiliki pertanyaan?

    Kamu bisa:

    +
      +
    • Lihat Milvus di GitHub. Anda dapat mengajukan pertanyaan, berbagi ide, dan membantu orang lain.
    • +
    • Bergabunglah dengan komunitas Slack kami untuk mendapatkan dukungan dan terlibat dengan komunitas sumber terbuka kami.
    • +
    diff --git a/localization/v2.5.x/site/id/faq/troubleshooting.json b/localization/v2.5.x/site/id/faq/troubleshooting.json new file mode 100644 index 000000000..0f9140e64 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/troubleshooting.json @@ -0,0 +1 @@ +{"codeList":["$ docker logs \n","kubectl scale sts --replicas=1\n# delete the pvc for etcd-1 and etcd-2\nkubectl scale sts --replicas=3\n","kubectl kubectl scale sts --replicas=0\n# delete the pvc for etcd-0, etcd-1, etcd-2\nkubectl kubectl scale sts --replicas=1\n# restore the backup data\n"],"headingContent":"Troubleshooting","anchorList":[{"label":"Pemecahan masalah","href":"Troubleshooting","type":1,"isActive":false},{"label":"Masalah boot","href":"Boot-issues","type":2,"isActive":false},{"label":"Masalah waktu proses (runtime)","href":"Runtime-issues","type":2,"isActive":false},{"label":"Masalah API","href":"API-issues","type":2,"isActive":false},{"label":"masalah kerusakan etcd","href":"etcd-crash-issues","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/faq/troubleshooting.md b/localization/v2.5.x/site/id/faq/troubleshooting.md new file mode 100644 index 000000000..71ec911b7 --- /dev/null +++ b/localization/v2.5.x/site/id/faq/troubleshooting.md @@ -0,0 +1,114 @@ +--- +id: troubleshooting.md +summary: >- + Pelajari tentang masalah umum yang mungkin Anda hadapi dengan Milvus dan cara + mengatasinya. +title: Pemecahan masalah +--- +

    Pemecahan masalah

    Halaman ini berisi daftar masalah umum yang mungkin terjadi ketika menjalankan Milvus, serta tips pemecahan masalah. Masalah pada halaman ini termasuk dalam kategori berikut:

    + +

    Masalah boot

    Kesalahan boot biasanya berakibat fatal. Jalankan perintah berikut untuk melihat detail kesalahan:

    +
    $ docker logs <your milvus container id>
    +
    +

    Masalah waktu proses (runtime)

    Kesalahan yang terjadi selama runtime dapat menyebabkan kerusakan layanan. Untuk mengatasi masalah ini, periksa kompatibilitas antara server dan klien Anda sebelum melanjutkan.

    +

    Masalah API

    Masalah ini terjadi selama pemanggilan metode API antara server Milvus dan klien Anda. Mereka akan dikembalikan ke klien secara sinkron atau asinkron.

    +

    masalah kerusakan etcd

    1. pod etcd tertunda

    Cluster etcd menggunakan pvc secara default. StorageClass perlu dikonfigurasi sebelumnya untuk kluster Kubernetes.

    +

    2. kerusakan pod etcd

    Saat pod etcd mengalami kerusakan pada Error: bad member ID arg (strconv.ParseUint: parsing "": invalid syntax), expecting ID in Hex, Anda dapat masuk ke pod ini dan menghapus berkas /bitnami/etcd/data/member_id.

    +

    3. Beberapa pod terus mengalami kerusakan saat etcd-0 masih berjalan

    Anda dapat menjalankan kode berikut jika beberapa pod terus mengalami crash saat etcd-0 masih berjalan.

    +
    kubectl scale sts <etcd-sts> --replicas=1
    +# delete the pvc for etcd-1 and etcd-2
    +kubectl scale sts <etcd-sts> --replicas=3
    +
    +

    4. Semua pod mengalami crash

    Ketika semua pod mengalami crash, coba salin berkas /bitnami/etcd/data/member/snap/db. Gunakan https://github.com/etcd-io/bbolt untuk memodifikasi data basis data.

    +

    Semua metadata Milvus disimpan di dalam bucket key. Cadangkan data di dalam bucket ini dan jalankan perintah berikut. Perhatikan bahwa data awalan dalam file by-dev/meta/session tidak memerlukan cadangan.

    +
    kubectl kubectl scale sts <etcd-sts> --replicas=0
    +# delete the pvc for etcd-0, etcd-1, etcd-2
    +kubectl kubectl scale sts <etcd-sts> --replicas=1
    +# restore the backup data
    +
    +


    +

    Jika Anda memerlukan bantuan untuk memecahkan masalah, silakan hubungi kami:

    +
      +
    • Bergabunglah dengan saluran Slack kami dan minta bantuan dari tim Milvus.
    • +
    • Ajukan Masalah di GitHub yang menyertakan detail tentang masalah Anda.
    • +
    diff --git a/localization/v2.5.x/site/id/getstarted/install-overview.json b/localization/v2.5.x/site/id/getstarted/install-overview.json new file mode 100644 index 000000000..791c6bcd5 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview of Milvus Deployment Options","anchorList":[{"label":"Gambaran Umum Opsi Penerapan Milvus","href":"Overview-of-Milvus-Deployment-Options","type":1,"isActive":false},{"label":"Milvus Lite","href":"Milvus-Lite","type":2,"isActive":false},{"label":"Milvus Standalone","href":"Milvus-Standalone","type":2,"isActive":false},{"label":"Milvus Terdistribusi","href":"Milvus-Distributed","type":2,"isActive":false},{"label":"Pilih Penerapan yang Tepat untuk Kasus Penggunaan Anda","href":"Choose-the-Right-Deployment-for-Your-Use-Case","type":2,"isActive":false},{"label":"Perbandingan fungsionalitas","href":"Comparison-on-functionalities","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/install-overview.md b/localization/v2.5.x/site/id/getstarted/install-overview.md new file mode 100644 index 000000000..eb16b7ee7 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install-overview.md @@ -0,0 +1,139 @@ +--- +id: install-overview.md +summary: >- + Milvus adalah basis data vektor yang berkinerja tinggi dan dapat diskalakan. + Milvus mendukung kasus penggunaan dengan berbagai ukuran, mulai dari demo yang + berjalan secara lokal di Notebook Jupyter hingga cluster Kubernetes berskala + besar yang menangani puluhan miliar vektor. Saat ini, ada tiga opsi penerapan + Milvus_ Milvus Lite, Milvus Standalone, dan Milvus Distributed. +title: Gambaran Umum Opsi Penerapan Milvus +--- +

    Gambaran Umum Opsi Penerapan Milvus

    Milvus adalah basis data vektor yang berkinerja tinggi dan dapat diskalakan. Milvus mendukung kasus penggunaan dengan berbagai ukuran, mulai dari demo yang berjalan secara lokal di Notebook Jupyter hingga cluster Kubernetes berskala besar yang menangani puluhan miliar vektor. Saat ini, ada tiga opsi penerapan Milvus: Milvus Lite, Milvus Standalone, dan Milvus Distributed.

    +

    Milvus Lite

    Milvus Lite adalah pustaka Python yang dapat diimpor ke dalam aplikasi Anda. Sebagai versi ringan dari Milvus, ini sangat ideal untuk membuat prototipe cepat di Notebook Jupyter atau berjalan di perangkat pintar dengan sumber daya terbatas. Milvus Lite mendukung API yang sama dengan penerapan Milvus lainnya. Kode sisi klien yang berinteraksi dengan Milvus Lite juga dapat bekerja dengan instance Milvus dalam mode penerapan lainnya.

    +

    Untuk mengintegrasikan Milvus Lite ke dalam aplikasi Anda, jalankan pip install pymilvus untuk menginstalnya dan gunakan pernyataan MilvusClient("./demo.db") untuk menginstansiasi basis data vektor dengan file lokal yang menyimpan semua data Anda. Untuk lebih jelasnya, lihat Menjalankan Milvus Lite.

    +

    Milvus Standalone

    Milvus Standalone adalah penerapan server mesin tunggal. Semua komponen Milvus Standalone dikemas ke dalam satu citra Docker, sehingga memudahkan penyebaran. Jika Anda memiliki beban kerja produksi tetapi memilih untuk tidak menggunakan Kubernetes, menjalankan Milvus Standalone pada satu mesin dengan memori yang cukup adalah pilihan yang baik. Selain itu, Milvus Standalone mendukung ketersediaan tinggi melalui replikasi master-slave.

    +

    Milvus Terdistribusi

    Milvus Distributed dapat digunakan pada cluster Kubernetes. Penerapan ini memiliki fitur arsitektur cloud-native, di mana beban konsumsi dan permintaan pencarian ditangani secara terpisah oleh node yang terisolasi, sehingga memungkinkan redundansi untuk komponen penting. Ini menawarkan skalabilitas dan ketersediaan tertinggi, serta fleksibilitas dalam menyesuaikan sumber daya yang dialokasikan di setiap komponen. Milvus Distributed adalah pilihan utama bagi pengguna perusahaan yang menjalankan sistem pencarian vektor berskala besar dalam produksi.

    +

    Pilih Penerapan yang Tepat untuk Kasus Penggunaan Anda

    Pemilihan mode penyebaran biasanya tergantung pada tahap pengembangan aplikasi Anda:

    +
      +
    • Untuk Pembuatan Prototipe Cepat

      +

      Jika Anda ingin membuat sesuatu dengan cepat sebagai prototipe atau untuk tujuan pembelajaran, seperti demo Retrieval Augmented Generation (RAG), chatbot AI, pencarian multi-modalitas, Milvus Lite itu sendiri atau kombinasi dari Milvus Lite dan Milvus Standalone sangat cocok. Anda dapat menggunakan Milvus Lite di notebook untuk membuat prototipe cepat dan mengeksplorasi berbagai pendekatan seperti strategi chunking yang berbeda di RAG. Anda mungkin ingin menggunakan aplikasi yang dibuat dengan Milvus Lite dalam produksi skala kecil untuk melayani pengguna yang sebenarnya, atau memvalidasi ide pada dataset yang lebih besar, misalnya lebih dari beberapa juta vektor. Milvus Standalone adalah pilihan yang tepat. Logika aplikasi untuk Milvus Lite masih dapat digunakan bersama karena semua penggunaan Milvus memiliki API sisi klien yang sama. Data yang disimpan di Milvus Lite juga dapat dipindahkan ke Milvus Standalone dengan alat baris perintah.

    • +
    • Penerapan Produksi Skala Kecil

      +

      Untuk produksi tahap awal, ketika proyek masih mencari kesesuaian produk dengan pasar dan kelincahan lebih penting daripada skalabilitas, Milvus Standalone adalah pilihan terbaik. Milvus Standalone masih dapat menskalakan hingga 100 juta vektor dengan sumber daya mesin yang cukup, namun membutuhkan lebih sedikit DevOps dibandingkan dengan mempertahankan cluster K8.

    • +
    • Penerapan Produksi Skala Besar

      +

      Ketika bisnis Anda berkembang pesat dan skala data melebihi kapasitas satu server, inilah saatnya untuk mempertimbangkan Milvus Distributed. Anda dapat tetap menggunakan Milvus Standalone untuk lingkungan pengembangan atau pementasan karena kenyamanannya, dan mengoperasikan cluster K8 yang menjalankan Milvus Distributed. Hal ini dapat mendukung Anda dalam menangani puluhan miliar vektor, serta memberikan fleksibilitas dalam menyesuaikan ukuran node untuk beban kerja khusus Anda, seperti kasus baca tinggi, tulis jarang atau tulis tinggi, baca rendah.

    • +
    • Pencarian Lokal pada Perangkat Edge

      +

      Untuk pencarian melalui perangkat yang bersifat pribadi atau sensitif di perangkat edge, Anda dapat menggunakan Milvus Lite di perangkat tanpa bergantung pada layanan berbasis cloud untuk melakukan pencarian teks atau gambar. Ini cocok untuk kasus-kasus seperti pencarian dokumen milik pribadi, atau deteksi objek di perangkat.

    • +
    +

    Pilihan mode penerapan Milvus tergantung pada tahap dan skala proyek Anda. Milvus menyediakan solusi yang fleksibel dan kuat untuk berbagai kebutuhan, mulai dari pembuatan prototipe yang cepat hingga penerapan perusahaan berskala besar.

    +
      +
    • Milvus Lite direkomendasikan untuk dataset yang lebih kecil, hingga beberapa juta vektor.
    • +
    • Milvus Standalone cocok untuk dataset berukuran sedang, dengan skala hingga 100 juta vektor.
    • +
    • Milvus Distributed dirancang untuk penerapan skala besar, yang mampu menangani dataset dari 100 juta hingga puluhan miliar vektor.
    • +
    +

    + + Select deployment option for your use case + Pilih opsi penerapan untuk kasus penggunaan Anda

    +

    Perbandingan fungsionalitas

    + + + + + + + + + + + +
    FiturMilvus LiteMilvus StandaloneMilvus Terdistribusi
    SDK / Pustaka KlienPython
    gRPC
    Python
    Go
    Java
    Node.js
    C#
    RESTful
    Python
    Java
    Go
    Node.js
    C#
    RESTful
    Tipe dataVektor Padat
    Vektor Jarang
    Vektor Biner
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    Dense Vector
    Sparse Vector
    Binary Vector
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    Vektor Padat
    Vektor Jarang
    Vektor Biner
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    Kemampuan pencarianPencarian Vektor (Pencarian ANN)
    Pemfilteran Metadata
    Pencarian Rentang
    Kueri Skalar
    Dapatkan Entitas dengan Kunci Utama
    Pencarian Hibrida
    Pencarian Vektor (Pencarian ANN)
    Pemfilteran Metadata
    Pencarian Rentang
    Kueri Skalar
    Dapatkan Entitas dengan Kunci Utama
    Pencarian Hibrida
    Pencarian Vektor (Pencarian ANN)
    Pemfilteran Metadata
    Pencarian Rentang
    Kueri Skalar
    Dapatkan Entitas berdasarkan Kunci Utama
    Pencarian Hibrida
    Operasi CRUD✔️✔️✔️
    Manajemen data tingkat lanjutN/AKontrol Akses
    Partisi
    Kunci Partisi
    Kontrol Akses
    Partisi
    Kunci Partisi
    Pengelompokan Sumber Daya Fisik
    Tingkat KonsistensiKuatKuat
    Bounded Staleness
    Session
    Eventual
    Kuat
    Bounded Staleness
    Session
    Eventual
    diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.json b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.json new file mode 100644 index 000000000..411d8c518 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.json @@ -0,0 +1 @@ +{"codeList":["$ go get -u github.com/milvus-io/milvus-sdk-go/v2\n"],"headingContent":"Install Milvus Go SDK","anchorList":[{"label":"Menginstal Milvus Go SDK","href":"Install-Milvus-Go-SDK","type":1,"isActive":false},{"label":"Persyaratan","href":"Requirement","type":2,"isActive":false},{"label":"Instal Milvus GO SDK","href":"Install-Milvus-GO-SDK","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.md b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.md new file mode 100644 index 000000000..ea2a8ca6d --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-go.md @@ -0,0 +1,83 @@ +--- +id: install-go.md +label: Install GO SDK +related_key: SDK +summary: Pelajari cara menginstal GO SDK dari Milvus. +title: Menginstal Milvus Go SDK +--- +

    Menginstal Milvus Go SDK

    Topik ini menjelaskan cara menginstal Milvus Go SDK untuk Milvus.

    +

    Versi Milvus saat ini mendukung SDK dalam bahasa Python, Node.js, GO, dan Java.

    +

    Persyaratan

    GO (1.17 atau yang lebih baru) diperlukan.

    +

    Instal Milvus GO SDK

    Instal Milvus GO SDK dan dependensi melalui go get.

    +
    $ go get -u github.com/milvus-io/milvus-sdk-go/v2
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus GO SDK, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.json b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.json new file mode 100644 index 000000000..e55b21d3a --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.json @@ -0,0 +1 @@ +{"codeList":["\n io.milvus\n milvus-sdk-java\n 2.5.4\n\n","implementation 'io.milvus:milvus-sdk-java:2.5.4'\n"],"headingContent":"Install Milvus Java SDK","anchorList":[{"label":"Menginstal Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":1,"isActive":false},{"label":"Persyaratan","href":"Requirement","type":2,"isActive":false},{"label":"Menginstal Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.md b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.md new file mode 100644 index 000000000..1faf7baa0 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-java.md @@ -0,0 +1,100 @@ +--- +id: install-java.md +label: Install Java SDK +related_key: SDK +summary: Pelajari cara menginstal Java SDK dari Milvus. +title: Menginstal Milvus Java SDK +--- +

    Menginstal Milvus Java SDK

    Topik ini menjelaskan cara menginstal Milvus Java SDK untuk Milvus.

    +

    Versi Milvus saat ini mendukung SDK dalam bahasa Python, Node.js, GO, dan Java.

    +

    Persyaratan

      +
    • Java (8 atau yang lebih baru)
    • +
    • Apache Maven atau Gradle/Grails
    • +
    +

    Menginstal Milvus Java SDK

    Jalankan perintah berikut untuk menginstal Milvus Java SDK.

    +
      +
    • Apache Maven
    • +
    +
    <dependency>
    +    <groupId>io.milvus</groupId>
    +    <artifactId>milvus-sdk-java</artifactId>
    +    <version>2.5.4</version>
    +</dependency>
    +
    +
      +
    • Gradle/Grails
    • +
    +
    implementation 'io.milvus:milvus-sdk-java:2.5.4'
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus Java SDK, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.json b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.json new file mode 100644 index 000000000..94bffe19a --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.json @@ -0,0 +1 @@ +{"codeList":["npm install @zilliz/milvus2-sdk-node\n# or ...\nyarn add @zilliz/milvus2-sdk-node\n"],"headingContent":"Install Milvus Nodejs SDK","anchorList":[{"label":"Menginstal Milvus Nodejs SDK","href":"Install-Milvus-Nodejs-SDK","type":1,"isActive":false},{"label":"Kompatibilitas","href":"Compatibility","type":2,"isActive":false},{"label":"Persyaratan","href":"Requirement","type":2,"isActive":false},{"label":"Instalasi","href":"Installation","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.md b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.md new file mode 100644 index 000000000..863f17add --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-node.md @@ -0,0 +1,118 @@ +--- +id: install-node.md +label: Install Node.js SDK +related_key: SDK +summary: Pelajari cara menginstal SDK Node.js dari Milvus. +title: Menginstal Milvus Nodejs SDK +--- +

    Menginstal Milvus Nodejs SDK

    Topik ini menjelaskan cara menginstal Milvus Node.js SDK untuk Milvus.

    +

    Kompatibilitas

    Koleksi berikut ini menunjukkan versi Milvus dan versi @zilliz/milvus2-sdk-node yang direkomendasikan:

    + + + + + + + + + + + + + +
    Versi MilvusVersi @zilliz/milvus2-sdk-node yang direkomendasikan
    2.5.xterbaru
    2.4.x2.4.10
    2.3.x2.3.5
    2.2.x2.2.x
    2.1.x2.1.x
    2.0.12.0.0, 2.0.1
    2.0.02.0.0
    +

    Persyaratan

    Node.js v18+

    +

    Instalasi

    Cara yang disarankan untuk memulai menggunakan klien node.js Milvus adalah dengan menggunakan npm (Node package manager) untuk menginstal ketergantungan dalam proyek Anda.

    +
    npm install @zilliz/milvus2-sdk-node
    +# or ...
    +yarn add @zilliz/milvus2-sdk-node
    +
    +

    Ini akan mengunduh Milvus node.js sdk dan menambahkan entri ketergantungan dalam file package.json Anda.

    +

    Apa selanjutnya

    Setelah menginstal Milvus Node.js SDK, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.json b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.json new file mode 100644 index 000000000..ab275ef32 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.json @@ -0,0 +1 @@ +{"codeList":["$ python3 -m pip install pymilvus==2.5.3\n","$ python3 -c \"from pymilvus import Collection\"\n"],"headingContent":"Install Milvus Python SDK","anchorList":[{"label":"Menginstal Milvus Python SDK","href":"Install-Milvus-Python-SDK","type":1,"isActive":false},{"label":"Persyaratan","href":"Requirements","type":2,"isActive":false},{"label":"Menginstal PyMilvus melalui pip","href":"Install-PyMilvus-via-pip","type":2,"isActive":false},{"label":"Verifikasi instalasi","href":"Verify-installation","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.md b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.md new file mode 100644 index 000000000..c54d645d1 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/install_SDKs/install-pymilvus.md @@ -0,0 +1,109 @@ +--- +id: install-pymilvus.md +label: Install PyMilvus +related_key: SDK +summary: Pelajari cara menginstal Python SDK dari Milvus. +title: Menginstal Milvus Python SDK +--- +

    Menginstal Milvus Python SDK

    Topik ini menjelaskan cara menginstal Milvus Python SDK pymilvus untuk Milvus.

    +

    Versi Milvus saat ini mendukung SDK dalam bahasa Python, Node.js, GO, dan Java.

    +

    Persyaratan

      +
    • Python 3.7 atau yang lebih baru.
    • +
    • Google protobuf sudah terinstal. Anda dapat menginstalnya dengan perintah pip3 install protobuf==3.20.0.
    • +
    • grpcio-tools sudah terinstal. Anda dapat menginstalnya dengan perintah pip3 install grpcio-tools.
    • +
    +

    Menginstal PyMilvus melalui pip

    PyMilvus tersedia di Python Package Index.

    +
    +Direkomendasikan untuk menginstal versi PyMilvus yang sesuai dengan versi server Milvus yang Anda instal. Untuk informasi lebih lanjut, lihat Catatan Rilis.
    +
    $ python3 -m pip install pymilvus==2.5.3
    +
    +

    Verifikasi instalasi

    Jika PyMilvus terinstal dengan benar, tidak ada pengecualian yang akan dimunculkan ketika Anda menjalankan perintah berikut.

    +
    $ python3 -c "from pymilvus import Collection"
    +
    +

    Apa selanjutnya

    Setelah menginstal PyMilvus, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/milvus_lite.json b/localization/v2.5.x/site/id/getstarted/milvus_lite.json new file mode 100644 index 000000000..47cfbdeb3 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/milvus_lite.json @@ -0,0 +1 @@ +{"codeList":["pip install -U pymilvus\n","from pymilvus import MilvusClient\nclient = MilvusClient(\"./milvus_demo.db\")\n","from pymilvus import MilvusClient\nimport numpy as np\n\nclient = MilvusClient(\"./milvus_demo.db\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=384 # The vectors we will use in this demo has 384 dimensions\n)\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# For illustration, here we use fake vectors with random numbers (384 dimension).\n\nvectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]\ndata = [ {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"} for i in range(len(vectors)) ]\nres = client.insert(\n collection_name=\"demo_collection\",\n data=data\n)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=[vectors[0]],\n filter=\"subject == 'history'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# a query that retrieves all entities matching filter expressions.\nres = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# delete\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n)\nprint(res)\n","# Install\npip install -U \"pymilvus[bulk_writer]\"\n\nmilvus-lite dump -h\n\nusage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]\n\noptional arguments:\n -h, --help show this help message and exit\n -d DB_FILE, --db-file DB_FILE\n milvus lite db file\n -c COLLECTION, --collection COLLECTION\n collection that need to be dumped\n -p PATH, --path PATH dump file storage dir\n","milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir\n# ./milvus_demo.db: milvus lite db file\n# demo_collection: collection that need to be dumped\n#./data_dir : dump file storage dir\n"],"headingContent":"Run Milvus Lite Locally","anchorList":[{"label":"Menjalankan Milvus Lite Secara Lokal","href":"Run-Milvus-Lite-Locally","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menyiapkan Milvus Lite","href":"Set-up-Milvus-Lite","type":2,"isActive":false},{"label":"Menghubungkan ke Milvus Lite","href":"Connect-to-Milvus-Lite","type":2,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false},{"label":"Memigrasi data dari Milvus Lite","href":"Migrating-data-from-Milvus-Lite","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/milvus_lite.md b/localization/v2.5.x/site/id/getstarted/milvus_lite.md new file mode 100644 index 000000000..4caff6e78 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/milvus_lite.md @@ -0,0 +1,412 @@ +--- +id: milvus_lite.md +summary: Mulailah dengan Milvus Lite. +title: Menjalankan Milvus Lite Secara Lokal +--- +

    Menjalankan Milvus Lite Secara Lokal

    Halaman ini mengilustrasikan cara menjalankan Milvus secara lokal dengan Milvus Lite. Milvus Lite adalah versi ringan dari Milvus, sebuah database vektor sumber terbuka yang mendukung aplikasi AI dengan penyematan vektor dan pencarian kemiripan.

    +

    Gambaran Umum

    Milvus Lite dapat diimpor ke dalam aplikasi Python Anda, menyediakan fungsionalitas pencarian vektor inti Milvus. Milvus Lite sudah termasuk dalam Python SDK dari Milvus. Hal ini dapat dengan mudah digunakan dengan pip install pymilvus.

    +

    Dengan Milvus Lite, Anda dapat mulai membangun aplikasi AI dengan pencarian kemiripan vektor dalam hitungan menit! Milvus Lite bagus untuk dijalankan di lingkungan berikut ini:

    +
      +
    • Notebook Jupyter / Google Colab
    • +
    • Laptop
    • +
    • Perangkat Tepi
    • +
    +

    Milvus Lite memiliki API yang sama dengan Milvus Standalone dan Distributed, dan mencakup sebagian besar fitur seperti persistensi dan manajemen data vektor, operasi CRUD vektor, pencarian vektor yang jarang dan padat, pemfilteran metadata, multi-vektor, dan pencarian hybrid. Bersama-sama, mereka memberikan pengalaman yang konsisten di berbagai jenis lingkungan, mulai dari perangkat edge hingga cluster di cloud, yang sesuai dengan kasus penggunaan dengan ukuran berbeda. Dengan kode sisi klien yang sama, Anda dapat menjalankan aplikasi GenAI dengan Milvus Lite di laptop atau Notebook Jupyter, atau Milvus Standalone di kontainer Docker, atau Milvus Didistribusikan di klaster Kubernetes berskala masif yang melayani miliaran vektor dalam produksi.

    +

    Prasyarat

    Milvus Lite saat ini mendukung lingkungan berikut:

    +
      +
    • Ubuntu >= 20.04 (x86_64 dan arm64)
    • +
    • MacOS >= 11.0 (Apple Silicon M1/M2 dan x86_64)
    • +
    +

    Harap diperhatikan bahwa Milvus Lite hanya cocok untuk kasus pencarian vektor skala kecil. Untuk kasus penggunaan skala besar, kami merekomendasikan untuk menggunakan Milvus Standalone atau Milvus Distributed. Anda juga dapat mempertimbangkan Milvus yang dikelola secara penuh di Zilliz Cloud.

    +

    Menyiapkan Milvus Lite

    pip install -U pymilvus
    +
    +

    Kami merekomendasikan menggunakan pymilvus. Karena milvus-lite termasuk dalam pymilvus versi 2.4.2 atau lebih tinggi, Anda dapat pip install dengan -U untuk memaksa pembaruan ke versi terbaru dan milvus-lite diinstal secara otomatis.

    +

    Jika Anda ingin secara eksplisit menginstal paket milvus-lite, atau Anda telah menginstal versi yang lebih lama dari milvus-lite dan ingin memperbaruinya, Anda dapat melakukan pip install -U milvus-lite.

    +

    Menghubungkan ke Milvus Lite

    Pada pymilvus, tentukan nama file lokal sebagai parameter uri dari MilvusClient yang akan digunakan oleh Milvus Lite.

    +
    from pymilvus import MilvusClient
    +client = MilvusClient("./milvus_demo.db")
    +
    +

    Setelah menjalankan potongan kode di atas, sebuah file database bernama milvus_demo.db akan dibuat di folder saat ini.

    +
    +

    CATATAN: Perhatikan bahwa API yang sama juga berlaku untuk Milvus Standalone, Milvus Distributed dan Zilliz Cloud, perbedaannya hanya pada penggantian nama file lokal ke endpoint dan kredensial server jarak jauh, misalnyaclient = MilvusClient(uri="http://localhost:19530", token="username:password").

    +
    +

    Contoh

    Berikut ini adalah demo sederhana yang menunjukkan cara menggunakan Milvus Lite untuk pencarian teks. Ada contoh yang lebih komprehensif untuk menggunakan Milvus Lite untuk membangun aplikasi seperti RAG, pencarian gambar, dan menggunakan Milvus Lite dalam kerangka kerja RAG yang populer seperti LangChain dan LlamaIndex!

    +
    from pymilvus import MilvusClient
    +import numpy as np
    +
    +client = MilvusClient("./milvus_demo.db")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=384  # The vectors we will use in this demo has 384 dimensions
    +)
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# For illustration, here we use fake vectors with random numbers (384 dimension).
    +
    +vectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]
    +data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ]
    +res = client.insert(
    +    collection_name="demo_collection",
    +    data=data
    +)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=[vectors[0]],
    +    filter="subject == 'history'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# a query that retrieves all entities matching filter expressions.
    +res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# delete
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +)
    +print(res)
    +
    +

    Batasan

    Ketika menjalankan Milvus Lite, perhatikan bahwa beberapa fitur tidak didukung. Tabel berikut ini merangkum batasan penggunaan Milvus Lite.

    +

    Koleksi

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Metode / ParameterDidukung di Milvus Lite
    membuat_koleksi()Dukungan dengan parameter terbatas
    collection_nameY
    dimensionY
    primary_field_nameY
    id_typeY
    vector_field_nameY
    metric_typeY
    auto_idY
    schemaY
    index_paramsY
    enable_dynamic_fieldY
    num_shardsN
    partition_key_fieldN
    num_partitionsN
    consistency_levelN (Hanya mendukung Strong; Konfigurasi apa pun akan diperlakukan sebagai Strong.)
    get_collection_stats()Mendukung mendapatkan statistik koleksi.
    collection_nameY
    timeoutY
    describe_collection()num_shards, consistency_level, dan collection_id sebagai respons tidak valid.
    timeoutY
    has_collection()Mendukung pengecekan apakah sebuah koleksi ada.
    collection_nameY
    timeoutY
    daftar_koleksi()Mendukung daftar semua koleksi.
    drop_collection()Mendukung proses membuang koleksi.
    collection_nameY
    timeoutY
    ganti_nama_koleksi()Mengganti nama koleksi tidak didukung.
    +

    Bidang & Skema

    + + + + + + + + + + + + + + + + + + + +
    Metode / ParameterDidukung di Milvus Lite
    create_schema()Dukungan dengan parameter terbatas
    auto_idY
    enable_dynamic_fieldY
    primary_fieldY
    partition_key_fieldN
    add_field()Dukungan dengan parameter terbatas
    field_nameY
    datatypeY
    is_primaryY
    max_lengthY
    element_typeY
    max_capacityY
    dimY
    is_partition_keyN
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Metode / ParameterDidukung di Milvus Lite
    cari()Dukungan dengan parameter terbatas
    collection_nameY
    dataY
    filterY
    limitY
    output_fieldsY
    search_paramsY
    timeoutY
    partition_namesN
    anns_fieldY
    query()Dukungan dengan parameter terbatas
    collection_nameY
    filterY
    output_fieldsY
    timeoutY
    idsY
    partition_namesN
    get()Dukungan dengan parameter terbatas
    collection_nameY
    idsY
    output_fieldsY
    timeoutY
    partition_namesN
    hapus()Dukungan dengan parameter terbatas
    collection_nameY
    idsY
    timeoutY
    filterY
    partition_nameN
    masukkan ()Dukungan dengan parameter terbatas
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    upsert()Dukungan dengan parameter terbatas
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    +

    Muat & Lepas

    + + + + + + + + + + + + + + +
    Metode / ParameterDidukung di Milvus Lite
    load_collection()Y
    collection_nameY
    timeoutY
    lepaskan_koleksi()Y
    collection_nameY
    timeoutY
    get_load_state()Mendapatkan status beban tidak didukung.
    refresh_load()Memuat data yang tidak dimuat dari koleksi yang dimuat tidak didukung.
    close()Y
    +

    Indeks

    + + + + + + + + + + + + + + + + + + + +
    Metode / ParameterDidukung di Milvus Lite
    list_indexes()Mencantumkan indeks didukung.
    collection_nameY
    field_nameY
    create_index()Hanya mendukung tipe indeks FLAT.
    index_paramsY
    timeoutY
    drop_index()Menjatuhkan indeks didukung.
    collection_nameY
    index_nameY
    timeoutY
    mendeskripsikan_indeks()Mendeskripsikan indeks didukung.
    collection_nameY
    index_nameY
    timeoutY
    +

    Jenis Indeks Vektor

    Milvus Lite hanya mendukung jenis indeks FLAT. Ia menggunakan jenis FLAT terlepas dari jenis indeks yang ditentukan dalam koleksi.

    +

    Fitur Pencarian

    Milvus Lite mendukung Vektor Jarang, Multi-vektor, Pencarian Hibrida.

    +

    Partisi

    Milvus Lite tidak mendukung partisi dan metode yang berhubungan dengan partisi.

    +

    Pengguna & Peran

    Milvus Lite tidak mendukung pengguna dan peran serta metode terkait.

    +

    Alias

    Milvus Lite tidak mendukung alias dan metode terkait alias.

    +

    Memigrasi data dari Milvus Lite

    Semua data yang disimpan di Milvus Lite dapat dengan mudah diekspor dan dimuat ke dalam jenis penerapan Milvus lainnya, seperti Milvus Standalone di Docker, Milvus Distributed di K8, atau Milvus yang dikelola sepenuhnya di Zilliz Cloud.

    +

    Milvus Lite menyediakan alat baris perintah yang dapat membuang data ke dalam file json, yang dapat diimpor ke dalam milvus dan Zilliz Cloud(layanan cloud terkelola penuh untuk Milvus). Perintah milvus-lite akan diinstal bersama dengan paket python milvus-lite

    +
    # Install
    +pip install -U "pymilvus[bulk_writer]"
    +
    +milvus-lite dump -h
    +
    +usage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]
    +
    +optional arguments:
    +  -h, --help            show this help message and exit
    +  -d DB_FILE, --db-file DB_FILE
    +                        milvus lite db file
    +  -c COLLECTION, --collection COLLECTION
    +                        collection that need to be dumped
    +  -p PATH, --path PATH  dump file storage dir
    +
    +

    Contoh berikut ini membuang semua data dari koleksi demo_collection yang disimpan di ./milvus_demo.db (file basis data Milvus Lite)

    +

    Untuk mengekspor data:

    +
    milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
    +# ./milvus_demo.db: milvus lite db file
    +# demo_collection: collection that need to be dumped
    +#./data_dir : dump file storage dir
    +
    +

    Dengan file dump, Anda dapat mengunggah data ke Zilliz Cloud melalui Impor Data, atau mengunggah data ke server Milvus melalui Bulk Insert.

    +

    Apa selanjutnya

    Setelah terhubung ke Milvus Lite, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/quickstart.json b/localization/v2.5.x/site/id/getstarted/quickstart.json new file mode 100644 index 000000000..28bc7ff50 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/quickstart.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","if client.has_collection(collection_name=\"demo_collection\"):\n client.drop_collection(collection_name=\"demo_collection\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=768, # The vectors we will use in this demo has 768 dimensions\n)\n","$ pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# If connection to https://huggingface.co/ failed, uncomment the following path\n# import os\n# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n\n# This will download a small embedding model \"paraphrase-albert-small-v2\" (~50MB).\nembedding_fn = model.DefaultEmbeddingFunction()\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = embedding_fn.encode_documents(docs)\n# The output vector has 768 dimensions, matching the collection that we just created.\nprint(\"Dim:\", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)\n\n# Each entity has id, vector representation, raw text, and a subject label that we use\n# to demo metadata filtering later.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Dim: 768 (768,)\nData has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","import random\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# Use fake representation with random vectors (768 dimension).\nvectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","res = client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res)\n","{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}\n","query_vectors = embedding_fn.encode_queries([\"Who is Alan Turing?\"])\n# If you don't have the embedding function you can use a fake vector to finish the demo:\n# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]\n\nres = client.search(\n collection_name=\"demo_collection\", # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nprint(res)\n","data: [\"[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]\"] , extra_info: {'cost': 0}\n","# Insert more docs in another subject.\ndocs = [\n \"Machine learning has been used for drug design.\",\n \"Computational synthesis with AI algorithms predicts molecular properties.\",\n \"DDR1 is involved in cancers and fibrosis.\",\n]\nvectors = embedding_fn.encode_documents(docs)\ndata = [\n {\"id\": 3 + i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"biology\"}\n for i in range(len(vectors))\n]\n\nclient.insert(collection_name=\"demo_collection\", data=data)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=embedding_fn.encode_queries([\"tell me AI related information\"]),\n filter=\"subject == 'biology'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\n\nprint(res)\n","data: [\"[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]\"] , extra_info: {'cost': 0}\n","res = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\n","res = client.query(\n collection_name=\"demo_collection\",\n ids=[0, 2],\n output_fields=[\"vector\", \"text\", \"subject\"],\n)\n","# Delete entities by primary key\nres = client.delete(collection_name=\"demo_collection\", ids=[0, 2])\n\nprint(res)\n\n# Delete entities by a filter expression\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'biology'\",\n)\n\nprint(res)\n","[0, 2]\n[3, 4, 5]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","# Drop collection\nclient.drop_collection(collection_name=\"demo_collection\")\n","client = MilvusClient(uri=\"http://localhost:19530\", token=\"root:Milvus\")\n"],"headingContent":"Quickstart with Milvus Lite","anchorList":[{"label":"Memulai dengan cepat dengan Milvus Lite","href":"Quickstart-with-Milvus-Lite","type":1,"isActive":false},{"label":"Menginstal Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Menyiapkan Basis Data Vektor","href":"Set-Up-Vector-Database","type":2,"isActive":false},{"label":"Membuat Koleksi","href":"Create-a-Collection","type":2,"isActive":false},{"label":"Menyiapkan Data","href":"Prepare-Data","type":2,"isActive":false},{"label":"Merepresentasikan teks dengan vektor","href":"Represent-text-with-vectors","type":2,"isActive":false},{"label":"[Alternatif] Gunakan representasi palsu dengan vektor acak","href":"Alternatively-Use-fake-representation-with-random-vectors","type":2,"isActive":false},{"label":"Memasukkan Data","href":"Insert-Data","type":2,"isActive":false},{"label":"Pencarian Semantik","href":"Semantic-Search","type":2,"isActive":false},{"label":"Pencarian Vektor dengan Pemfilteran Metadata","href":"Vector-Search-with-Metadata-Filtering","type":2,"isActive":false},{"label":"Menghapus Entitas","href":"Delete-Entities","type":2,"isActive":false},{"label":"Memuat Data yang Sudah Ada","href":"Load-Existing-Data","type":2,"isActive":false},{"label":"Menghapus koleksi","href":"Drop-the-collection","type":2,"isActive":false},{"label":"Pelajari Lebih Lanjut","href":"Learn-More","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/quickstart.md b/localization/v2.5.x/site/id/getstarted/quickstart.md new file mode 100644 index 000000000..f27762a7e --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/quickstart.md @@ -0,0 +1,408 @@ +--- +id: quickstart.md +summary: Mulailah dengan Milvus. +title: Mulai cepat +--- +

    Memulai dengan cepat dengan Milvus Lite

    Open In Colab +GitHub Repository

    +

    Vektor, format data keluaran dari model Neural Network, dapat secara efektif mengkodekan informasi dan memiliki peran penting dalam aplikasi AI seperti basis pengetahuan, pencarian semantik, Retrieval Augmented Generation (RAG), dan banyak lagi.

    +

    Milvus adalah basis data vektor sumber terbuka yang cocok untuk aplikasi AI dari berbagai ukuran, mulai dari menjalankan chatbot demo di notebook Jupyter hingga membangun pencarian berskala web yang melayani miliaran pengguna. Dalam panduan ini, kami akan memandu Anda tentang cara menyiapkan Milvus secara lokal dalam beberapa menit dan menggunakan pustaka klien Python untuk membuat, menyimpan, dan mencari vektor.

    +

    Menginstal Milvus

    Dalam panduan ini kami menggunakan Milvus Lite, sebuah pustaka python yang disertakan dalam pymilvus yang dapat disematkan ke dalam aplikasi klien. Milvus juga mendukung penerapan di Docker dan Kubernetes untuk kasus penggunaan produksi.

    +

    Sebelum memulai, pastikan Anda memiliki Python 3.8+ yang tersedia di lingkungan lokal. Instal pymilvus yang berisi pustaka klien python dan Milvus Lite:

    +
    $ pip install -U pymilvus
    +
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +
    +

    Menyiapkan Basis Data Vektor

    Untuk membuat database vektor Milvus lokal, cukup instal MilvusClient dengan menentukan nama file untuk menyimpan semua data, seperti "milvus_demo.db".

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    Membuat Koleksi

    Di Milvus, kita membutuhkan sebuah koleksi untuk menyimpan vektor dan metadata terkait. Anda dapat menganggapnya sebagai sebuah tabel dalam database SQL tradisional. Ketika membuat koleksi, Anda dapat mendefinisikan skema dan parameter indeks untuk mengonfigurasi spesifikasi vektor seperti dimensi, jenis indeks, dan metrik jauh. Ada juga konsep yang kompleks untuk mengoptimalkan indeks untuk kinerja pencarian vektor. Untuk saat ini, mari kita fokus pada dasar-dasarnya dan menggunakan default untuk segala sesuatu yang memungkinkan. Minimal, Anda hanya perlu mengatur nama koleksi dan dimensi bidang vektor koleksi.

    +
    if client.has_collection(collection_name="demo_collection"):
    +    client.drop_collection(collection_name="demo_collection")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=768,  # The vectors we will use in this demo has 768 dimensions
    +)
    +
    +

    Dalam pengaturan di atas,

    +
      +
    • Kunci utama dan bidang vektor menggunakan nama defaultnya ("id" dan "vektor").
    • +
    • Jenis metrik (definisi jarak vektor) diatur ke nilai default(COSINE).
    • +
    • Bidang kunci utama menerima bilangan bulat dan tidak secara otomatis bertambah (yaitu tidak menggunakan fitur auto-id) Sebagai alternatif, Anda dapat mendefinisikan skema koleksi secara formal dengan mengikuti instruksi ini.
    • +
    +

    Menyiapkan Data

    Dalam panduan ini, kita menggunakan vektor untuk melakukan pencarian semantik pada teks. Kita perlu membuat vektor untuk teks dengan mengunduh model penyematan. Hal ini dapat dengan mudah dilakukan dengan menggunakan fungsi-fungsi utilitas dari pustaka pymilvus[model].

    +

    Merepresentasikan teks dengan vektor

    Pertama, instal pustaka model. Paket ini termasuk alat ML yang penting seperti PyTorch. Pengunduhan paket mungkin memerlukan waktu jika lingkungan lokal Anda belum pernah menginstal PyTorch.

    +
    $ pip install "pymilvus[model]"
    +
    +

    Buatlah penyematan vektor dengan model default. Milvus mengharapkan data yang akan disisipkan disusun sebagai sebuah daftar kamus, di mana setiap kamus merepresentasikan sebuah catatan data, yang disebut sebagai sebuah entitas.

    +
    from pymilvus import model
    +
    +# If connection to https://huggingface.co/ failed, uncomment the following path
    +# import os
    +# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    +
    +# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
    +embedding_fn = model.DefaultEmbeddingFunction()
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = embedding_fn.encode_documents(docs)
    +# The output vector has 768 dimensions, matching the collection that we just created.
    +print("Dim:", embedding_fn.dim, vectors[0].shape)  # Dim: 768 (768,)
    +
    +# Each entity has id, vector representation, raw text, and a subject label that we use
    +# to demo metadata filtering later.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Dim: 768 (768,)
    +Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    [Alternatif] Gunakan representasi palsu dengan vektor acak

    Jika Anda tidak dapat mengunduh model karena masalah jaringan, sebagai solusi sementara, Anda dapat menggunakan vektor acak untuk merepresentasikan teks dan tetap menyelesaikan contoh. Harap diperhatikan bahwa hasil pencarian tidak akan mencerminkan kemiripan semantik karena vektor-vektor tersebut adalah vektor palsu.

    +
    import random
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# Use fake representation with random vectors (768 dimension).
    +vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    Memasukkan Data

    Mari masukkan data ke dalam koleksi:

    +
    res = client.insert(collection_name="demo_collection", data=data)
    +
    +print(res)
    +
    +
    {'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
    +
    +

    Sekarang kita dapat melakukan pencarian semantik dengan merepresentasikan teks kueri penelusuran sebagai vektor, dan melakukan pencarian kemiripan vektor di Milvus.

    +

    Milvus menerima satu atau beberapa permintaan pencarian vektor secara bersamaan. Nilai dari variabel query_vectors adalah sebuah daftar vektor, di mana setiap vektor adalah sebuah array angka float.

    +
    query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
    +# If you don't have the embedding function you can use a fake vector to finish the demo:
    +# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
    +
    +res = client.search(
    +    collection_name="demo_collection",  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
    +
    +

    Keluarannya adalah daftar hasil, masing-masing dipetakan ke permintaan pencarian vektor. Setiap kueri berisi daftar hasil, di mana setiap hasil berisi kunci utama entitas, jarak ke vektor kueri, dan detail entitas dengan output_fields yang ditentukan.

    +

    Pencarian Vektor dengan Pemfilteran Metadata

    Anda juga dapat melakukan pencarian vektor dengan mempertimbangkan nilai metadata (disebut bidang "skalar" di Milvus, karena skalar mengacu pada data non-vektor). Hal ini dilakukan dengan ekspresi filter yang menentukan kriteria tertentu. Mari kita lihat cara mencari dan memfilter dengan bidang subject pada contoh berikut.

    +
    # Insert more docs in another subject.
    +docs = [
    +    "Machine learning has been used for drug design.",
    +    "Computational synthesis with AI algorithms predicts molecular properties.",
    +    "DDR1 is involved in cancers and fibrosis.",
    +]
    +vectors = embedding_fn.encode_documents(docs)
    +data = [
    +    {"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
    +    for i in range(len(vectors))
    +]
    +
    +client.insert(collection_name="demo_collection", data=data)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=embedding_fn.encode_queries(["tell me AI related information"]),
    +    filter="subject == 'biology'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
    +
    +

    Secara default, bidang skalar tidak diindeks. Jika Anda perlu melakukan pencarian yang difilter metadata dalam kumpulan data yang besar, Anda dapat mempertimbangkan untuk menggunakan skema tetap dan juga mengaktifkan indeks untuk meningkatkan kinerja pencarian.

    +

    Selain pencarian vektor, Anda juga dapat melakukan jenis pencarian lainnya:

    +

    Kueri

    Query () adalah operasi yang mengambil semua entitas yang cocok dengan kriteria, seperti ekspresi filter atau pencocokan beberapa id.

    +

    Misalnya, mengambil semua entitas yang bidang skalarnya memiliki nilai tertentu:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +
    +

    Mengambil entitas secara langsung berdasarkan kunci utama:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    ids=[0, 2],
    +    output_fields=["vector", "text", "subject"],
    +)
    +
    +

    Menghapus Entitas

    Jika Anda ingin menghapus data, Anda dapat menghapus entitas dengan menentukan kunci utama atau menghapus semua entitas yang cocok dengan ekspresi filter tertentu.

    +
    # Delete entities by primary key
    +res = client.delete(collection_name="demo_collection", ids=[0, 2])
    +
    +print(res)
    +
    +# Delete entities by a filter expression
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'biology'",
    +)
    +
    +print(res)
    +
    +
    [0, 2]
    +[3, 4, 5]
    +
    +

    Memuat Data yang Sudah Ada

    Karena semua data Milvus Lite disimpan dalam file lokal, Anda dapat memuat semua data ke dalam memori bahkan setelah program dihentikan, dengan membuat MilvusClient dengan file yang ada. Sebagai contoh, ini akan memulihkan koleksi dari file "milvus_demo.db" dan terus menulis data ke dalamnya.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    Menghapus koleksi

    Jika Anda ingin menghapus semua data dalam sebuah koleksi, Anda dapat menghapus koleksi tersebut dengan perintah

    +
    # Drop collection
    +client.drop_collection(collection_name="demo_collection")
    +
    +

    Pelajari Lebih Lanjut

    Milvus Lite sangat bagus untuk memulai dengan program python lokal. Jika Anda memiliki data berskala besar atau ingin menggunakan Milvus dalam produksi, Anda dapat mempelajari tentang men-deploy Milvus di Docker dan Kubernetes. Semua mode deployment Milvus memiliki API yang sama, sehingga kode sisi klien Anda tidak perlu banyak berubah jika berpindah ke mode deployment lain. Cukup tentukan URI dan Token server Milvus yang digunakan di mana saja:

    +
    client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
    +
    +

    Milvus menyediakan API REST dan gRPC, dengan pustaka klien dalam bahasa seperti Python, Java, Go, C#, dan Node.js.

    diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.json b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.json new file mode 100644 index 000000000..ebee3e3c0 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.json @@ -0,0 +1 @@ +{"codeList":["# Download the configuration file\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n\n# Start Milvus\n$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker-compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n"],"headingContent":"Run Milvus with Docker Compose (Linux)","anchorList":[{"label":"Menjalankan Milvus dengan Docker Compose (Linux)","href":"Run-Milvus-with-Docker-Compose-Linux","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Menghentikan dan menghapus Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.md b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.md new file mode 100644 index 000000000..defaf527d --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker-compose.md @@ -0,0 +1,155 @@ +--- +id: install_standalone-docker-compose.md +label: Docker Compose +related_key: Docker Compose +summary: Pelajari cara menginstal Milvus mandiri dengan Docker Compose. +title: Menjalankan Milvus dengan Docker Compose (Linux) +--- +

    Menjalankan Milvus dengan Docker Compose (Linux)

    Halaman ini mengilustrasikan cara meluncurkan instans Milvus di Docker menggunakan Docker Compose.

    +

    Prasyarat

    +

    Menginstal Milvus

    Milvus menyediakan berkas konfigurasi Docker Compose di repositori Milvus. Untuk menginstal Milvus menggunakan Docker Compose, cukup jalankan

    +
    # Download the configuration file
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +# Start Milvus
    +$ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +
      +
    • Jika Anda gagal menjalankan perintah di atas, periksa apakah sistem Anda telah menginstal Docker Compose V1. Jika demikian, Anda disarankan untuk bermigrasi ke Docker Compose V2 sesuai dengan catatan di halaman ini.

    • +
    • Jika Anda mengalami masalah dalam menarik citra, hubungi kami di community@zilliz.com dengan detail tentang masalahnya, dan kami akan memberikan dukungan yang diperlukan.

    • +
    +
    +

    Setelah memulai Milvus,

    +
      +
    • Kontainer bernama milvus-standalone, milvus-minio, dan milvus-etcd akan aktif.
        +
      • Kontainer milvus-etcd tidak mengekspos port apa pun ke hos dan memetakan datanya ke volume/etcd dalam folder saat ini.
      • +
      • Kontainer milvus-minio melayani port 9090 dan 9091 secara lokal dengan kredensial autentikasi default dan memetakan datanya ke volume/minio dalam folder saat ini.
      • +
      • Kontainer milvus-standalone melayani port 19530 secara lokal dengan pengaturan default dan memetakan datanya ke volume/milvus di folder saat ini.
      • +
    • +
    +

    Anda dapat memeriksa apakah kontainer sudah aktif dan berjalan menggunakan perintah berikut:

    +
    $ sudo docker-compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    Anda juga dapat mengakses Milvus WebUI di http://127.0.0.1:9091/webui/ untuk mempelajari lebih lanjut tentang instans Milvus Anda. Untuk detailnya, lihat Milvus WebUI.

    +

    Menghentikan dan menghapus Milvus

    Anda dapat menghentikan dan menghapus kontainer ini sebagai berikut

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.json b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.json new file mode 100644 index 000000000..5395e8747 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["# Download the installation script\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh\n\n# Start the Docker container\n$ bash standalone_embed.sh start\n","# Stop Milvus\n$ bash standalone_embed.sh stop\n\n# Delete Milvus data\n$ bash standalone_embed.sh delete\n","# upgrade Milvus\n$ bash standalone_embed.sh upgrade\n"],"headingContent":"Run Milvus in Docker (Linux)","anchorList":[{"label":"Menjalankan Milvus di Docker (Linux)","href":"Run-Milvus-in-Docker-Linux","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Milvus di Docker","href":"Install-Milvus-in-Docker","type":2,"isActive":false},{"label":"Menghentikan dan menghapus Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.md b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.md new file mode 100644 index 000000000..6ef437a7a --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-docker.md @@ -0,0 +1,142 @@ +--- +id: install_standalone-docker.md +label: Docker +related_key: Docker +summary: Pelajari cara menginstal Milvus mandiri dengan Docker. +title: Menjalankan Milvus di Docker (Linux) +--- +

    Menjalankan Milvus di Docker (Linux)

    Halaman ini mengilustrasikan cara meluncurkan instans Milvus di Docker.

    +

    Prasyarat

    +

    Menginstal Milvus di Docker

    Milvus menyediakan skrip instalasi untuk menginstalnya sebagai kontainer docker. Skrip ini tersedia di repositori Milvus. Untuk menginstal Milvus di Docker, cukup jalankan

    +
    # Download the installation script
    +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
    +
    +# Start the Docker container
    +$ bash standalone_embed.sh start
    +
    +
    +

    Jika Anda mengalami masalah dalam menarik citra, hubungi kami di community@zilliz.com dengan detail tentang masalahnya, dan kami akan memberikan dukungan yang diperlukan.

    +
    +

    Setelah menjalankan skrip instalasi:

    +
      +
    • Kontainer docker bernama milvus telah dimulai pada port 19530.
    • +
    • Sebuah embed etcd telah terinstal bersama dengan Milvus di dalam kontainer yang sama dan melayani di port 2379. Berkas konfigurasinya dipetakan ke embedEtcd.yaml di dalam folder saat ini.
    • +
    • Untuk mengubah konfigurasi default Milvus, tambahkan pengaturan Anda ke file user.yaml di folder saat ini dan kemudian mulai ulang layanan.
    • +
    • Volume data Milvus dipetakan ke volume/milvus di folder saat ini.
    • +
    +

    Anda dapat mengakses Milvus WebUI di http://127.0.0.1:9091/webui/ untuk mempelajari lebih lanjut tentang instans Milvus Anda. Untuk detailnya, lihat Milvus WebUI.

    +

    Menghentikan dan menghapus Milvus

    Anda dapat menghentikan dan menghapus kontainer ini dengan cara berikut

    +
    # Stop Milvus
    +$ bash standalone_embed.sh stop
    +
    +# Delete Milvus data
    +$ bash standalone_embed.sh delete
    +
    +

    Anda dapat memutakhirkan Milvus versi terbaru sebagai berikut

    +
    # upgrade Milvus
    +$ bash standalone_embed.sh upgrade
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.json b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.json new file mode 100644 index 000000000..35aeb1689 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.json @@ -0,0 +1 @@ +{"codeList":["C:\\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​\n\n","C:\\>standalone.bat start​\nWait for Milvus starting...​\nStart successfully.​\nTo change the default Milvus configuration, edit user.yaml and restart the service.​\n\n","# Stop Milvus​\nC:\\>standalone.bat stop​\nStop successfully.​\n​\n# Delete Milvus container​\nC:\\>standalone.bat delete​\nDelete Milvus container successfully. # Container has been removed.​\nDelete successfully. # Data has been removed.​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","# Download the installation script​\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​\n​\n# Start the Docker container​\n$ bash standalone_embed.sh start​\n\n","$ bash standalone_embed.sh start​\nWait for Milvus Starting...​\nStart successfully.​\nTo change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​\n\n","# Stop Milvus​\n$ bash standalone_embed.sh stop​\nStop successfully.​\n​\n# Delete Milvus data​\n$ bash standalone_embed.sh stop​\nDelete Milvus container successfully.​\nDelete successfully.​\n\n","# Download the configuration file and rename it as docker-compose.yml​\nC:\\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​\n​\n# Start Milvus​\nC:\\>docker compose up -d​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","$ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​\n\n","$ sudo docker compose up -d​\n​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>net start com.docker.service​\nThe Docker for Windows Service service is starting.​\nThe Docker for Windows Service service was started successfully.​\n\n","C:\\>wsl --update​\nChecking for updates.​\nThe most recent version of Windows Subsystem for Linux is already installed.​\n\n","C:\\>cd \"C:\\Program Files\\Docker\\Docker\"​\nC:\\Program Files\\Docker\\Docker>.\\DockerCli.exe -SwitchDaemon​\nSwitching to windows engine: Post \"http://ipc/engine/switch\": open \\\\.\\pipe\\dockerBackendApiServer: The system cannot find the file specified.​\n\n"],"headingContent":"Run Milvus in Docker (Windows)","anchorList":[{"label":"Menjalankan Milvus di Docker (Windows)","href":"Run-Milvus-in-Docker-Windows","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites​","type":2,"isActive":false},{"label":"Menjalankan Milvus di Docker","href":"Run-Milvus-in-Docker​","type":2,"isActive":false},{"label":"Menjalankan Milvus dengan Docker Compose","href":"Run-Milvus-with-Docker-Compose​","type":2,"isActive":false},{"label":"Pertanyaan Umum","href":"FAQs​","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.md b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.md new file mode 100644 index 000000000..9d6fd255c --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/install_standalone-windows.md @@ -0,0 +1,301 @@ +--- +id: install_standalone-windows.md +label: Docker +related_key: Docker +summary: Pelajari cara menginstal Milvus mandiri dengan Docker Desktop untuk Windows. +title: Jalankan Milvus di Docker (Linux) +--- +

    Menjalankan Milvus di Docker (Windows)

    Halaman ini mendemonstrasikan cara menjalankan Milvus pada Windows menggunakan Docker Desktop untuk Windows.

    +

    Prasyarat

    +

    Menjalankan Milvus di Docker

    Milvus menyediakan skrip instalasi untuk menginstalnya sebagai kontainer Docker. Setelah Anda menginstal Docker Desktop pada Microsoft Windows, Anda dapat mengakses Docker CLI dari PowerShell atau Windows Command Prompt dalam mode administrator dan dari WSL 2.

    +

    Dari PowerShell atau Windows Command Prompt

    Jika Anda lebih akrab dengan PowerShell atau Windows Command Prompt, prompt perintahnya adalah sebagai berikut.

    +
      +
    1. Buka Desktop Docker dalam mode administrator dengan mengeklik kanan dan memilih Jalankan sebagai administrator.

    2. +
    3. Unduh skrip instalasi dan simpan sebagai standalone.bat.

      +
      C:\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​
      +
      +
    4. +
    5. Jalankan skrip yang diunduh untuk memulai Milvus sebagai kontainer Docker.

      +
      C:\>standalone.bat start​
      +Wait for Milvus starting...​
      +Start successfully.​
      +To change the default Milvus configuration, edit user.yaml and restart the service.​
      +
      +
      +

      Setelah menjalankan skrip instalasi.

      +
        +
      • Kontainer docker bernama milvus-standalone telah dimulai pada port 19530.

      • +
      • Sebuah embed etcd telah terinstal bersama dengan Milvus di dalam kontainer yang sama dan melayani di port 2379. Berkas konfigurasinya dipetakan ke embedEtcd.yaml di dalam folder saat ini.

      • +
      • Volume data Milvus dipetakan ke volume/milvus dalam folder saat ini.

      • +
      +

      Anda dapat menggunakan perintah berikut untuk mengelola kontainer Milvus dan data yang tersimpan.

      +
      # Stop Milvus​
      +C:\>standalone.bat stop​
      +Stop successfully.​
      +​
      +# Delete Milvus container​
      +C:\>standalone.bat delete​
      +Delete Milvus container successfully. # Container has been removed.​
      +Delete successfully. # Data has been removed.​
      +
      +
    6. +
    +

    Dari WSL 2

    Jika Anda lebih suka memulai Milvus menggunakan perintah Linux dan skrip shell pada Windows, pastikan bahwa Anda sudah menginstal perintah WSL 2. Untuk detail tentang cara menginstal perintah WSL 2, Anda dapat merujuk ke artikel Microsoft ini.

    +
      +
    1. Mulai WSL 2.

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. Unduh skrip instalasi

      +
      # Download the installation script​
      +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​
      +​
      +# Start the Docker container​
      +$ bash standalone_embed.sh start​
      +
      +
    4. +
    5. Mulai Milvus sebagai kontainer docker.

      +
      $ bash standalone_embed.sh start​
      +Wait for Milvus Starting...​
      +Start successfully.​
      +To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​
      +
      +
      +

      Anda dapat menggunakan perintah berikut untuk mengelola kontainer Milvus dan data yang tersimpan.

      +
      # Stop Milvus​
      +$ bash standalone_embed.sh stop​
      +Stop successfully.​
      +​
      +# Delete Milvus data​
      +$ bash standalone_embed.sh stop​
      +Delete Milvus container successfully.​
      +Delete successfully.​
      +
      +
    6. +
    +

    Menjalankan Milvus dengan Docker Compose

    Setelah Anda menginstal Docker Desktop pada Microsoft Windows, Anda dapat mengakses CLI Docker dari PowerShell atau Command Prompt Windows dalam mode administrator. Anda dapat menjalankan Docker Compose baik di PowerShell, Windows Command Prompt, atau WSL 2 untuk memulai Milvus.

    +

    Dari PowerShell atau Windows Command Prompt

      +
    1. Buka Docker Desktop dalam mode administrator dengan mengeklik kanan dan memilih Run as administrator.

    2. +
    3. Jalankan perintah berikut ini di PowerShell atau Windows Command Prompt untuk mengunduh berkas konfigurasi Docker Compose untuk Milvus Standalone dan memulai Milvus.

      +
      # Download the configuration file and rename it as docker-compose.yml​
      +C:\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​
      +​
      +# Start Milvus​
      +C:\>docker compose up -d​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
      +

      Tergantung pada koneksi jaringan Anda, mengunduh citra untuk instalasi Milvus mungkin membutuhkan waktu beberapa saat. Setelah kontainer bernama milvus-standalone, milvus-minio, dan milvus-etcd aktif, Anda dapat menyaksikan bahwa

      +
        +
      • Kontainer milvus-etcd tidak mengekspos port apa pun ke hos dan memetakan datanya ke volume/etcd dalam folder saat ini.

      • +
      • Kontainer milvus-minio melayani port 9090 dan 9091 secara lokal dengan kredensial autentikasi default dan memetakan datanya ke volume/minio dalam folder saat ini.

      • +
      • Kontainer milvus-standalone melayani port 19530 secara lokal dengan pengaturan default dan memetakan datanya ke volume/milvus di folder saat ini.

      • +
    4. +
    +

    Anda juga dapat memanggil perintah Docker Compose versi Linux jika Anda telah menginstal WSL 2.

    +

    Dari WSL 2

    Prosedurnya serupa dengan menggunakan Docker Compose untuk menginstal Milvus di sistem Linux.

    +
      +
    1. Mulai WSL 2.

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. Unduh berkas konfigurasi Milvus.

      +
      $ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​
      +
      +
    4. +
    5. Mulai Milvus.

      +
      $ sudo docker compose up -d​
      +​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
    6. +
    +

    Pertanyaan Umum

    Bagaimana cara mengatasi kesalahan Docker Engine stopped?

    Setelah Anda menginstal Docker Desktop pada Windows, Anda mungkin mengalami kesalahan Docker Engine stopped jika komputer Anda tidak terkonfigurasi dengan benar. Dalam kasus ini, Anda mungkin perlu melakukan pemeriksaan berikut.

    +
      +
    1. Periksa apakah virtualisasi diaktifkan.

      +

      Anda dapat memeriksa apakah virtualisasi telah diaktifkan dengan melihat tab Performa di Task Manager.

      +

      + + Virtualization in Task Manager + Virtualisasi di Task Manager

      +

      Jika virtualisasi dinonaktifkan, Anda mungkin perlu memeriksa pengaturan BIOS pada firmware motherboard. Cara untuk mengaktifkan virtualisasi dalam pengaturan BIOS bervariasi menurut vendor motherboard. Untuk motherboard ASUS, misalnya, Anda dapat merujuk ke artikel ini untuk mengaktifkan virtualisasi.

      +

      Kemudian, Anda perlu menghidupkan ulang komputer dan mengaktifkan Hyper-V. Untuk detailnya, lihat artikel Microsoft ini.

    2. +
    3. Periksa apakah Layanan Desktop Docker telah dimulai.

      +

      Anda dapat menjalankan perintah berikut untuk memulai Layanan Desktop Docker.

      +
      C:\>net start com.docker.service​
      +The Docker for Windows Service service is starting.​
      +The Docker for Windows Service service was started successfully.​
      +
      +
    4. +
    5. Periksa apakah WSL telah terinstal dengan benar.

      +

      Anda dapat menjalankan perintah berikut untuk menginstal atau memperbarui perintah WSL 2.

      +
      C:\>wsl --update​
      +Checking for updates.​
      +The most recent version of Windows Subsystem for Linux is already installed.​
      +
      +
    6. +
    7. Periksa apakah Docker Daemon telah dimulai.

      +

      Anda harus membuka direktori instalasi Docker Desktop dan menjalankan .\DockerCli.exe -SwitchDaemon untuk memulai Docker Daemon.

      +
      C:\>cd "C:\Program Files\Docker\Docker"​
      +C:\Program Files\Docker\Docker>.\DockerCli.exe -SwitchDaemon​
      +Switching to windows engine: Post "http://ipc/engine/switch": open \\.\pipe\dockerBackendApiServer: The system cannot find the file specified.​
      +
      +
    8. +
    9. Periksa apakah Anda telah memulai Docker Desktop dalam mode administrator.

      +

      Pastikan Anda telah memulai Docker Desktop dalam mode administrator. Untuk melakukannya, klik kanan pada Docker Desktop dan pilih Jalankan sebagai administrator.

      +

      + + Start Docker Desktop as Administrator + Memulai Docker Desktop sebagai Administrator

    10. +
    +

    Jika Anda mengalami masalah terkait WSL saat menjalankan Milvus dari WSL 2, Anda mungkin perlu memeriksa apakah Anda telah mengonfigurasi Docker Desktop untuk menggunakan mesin berbasis WSL 2 sebagai berikut.

    +
      +
    1. Pastikan bahwa "Gunakan mesin berbasis WSL 2" dicentang di Pengaturan > Umum.

      +

      + + Use the WSL 2 based engine in Docker Desktop Settings + Gunakan mesin berbasis WSL 2 di Pengaturan Desktop Docker

    2. +
    3. Pilih dari distribusi WSL 2 terinstal yang ingin Anda aktifkan integrasi Docker dengan membuka Pengaturan > Sumber Daya > Integrasi WSL.

      +

      + + Select WSL 2 distributions in Docker Desktop Settings + Pilih distribusi WSL 2 di Pengaturan Desktop Docker

    4. +
    +

    + + Read config failed error prompt in Milvus startup + Prompt kesalahan baca konfigurasi gagal saat pengaktifan Milvus

    +

    Untuk menangani kesalahan yang muncul selama pengaktifan Milvus yang berbunyi "Read config failed," Anda perlu memeriksa apakah volume yang dipasang ke dalam kontainer Milvus sudah benar. Jika volume sudah terpasang dengan benar ke dalam kontainer, Anda dapat menggunakan perintah docker exec untuk masuk ke dalam kontainer dan membuat daftar folder /milvus/configs sebagai berikut.

    +

    + + List Milvus config files + Membuat daftar berkas konfigurasi Milvus

    +

    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.json b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.json new file mode 100644 index 000000000..0c3aaf94c --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n"],"headingContent":"Requirements for Installing Milvus with Docker Compose","anchorList":[{"label":"Persyaratan untuk Menginstalasi Milvus dengan Docker Compose","href":"Requirements-for-Installing-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"Persyaratan perangkat keras","href":"Hardware-requirements","type":2,"isActive":false},{"label":"Persyaratan perangkat lunak","href":"Software-requirements","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.md b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.md new file mode 100644 index 000000000..87fce5949 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-docker/prerequisite-docker.md @@ -0,0 +1,113 @@ +--- +id: prerequisite-docker.md +label: Docker requirements +related_key: Docker +summary: >- + Pelajari persiapan yang diperlukan sebelum menginstal Milvus dengan Docker + Compose. +title: Persyaratan untuk Menginstalasi Milvus dengan Docker Compose +--- +

    Persyaratan untuk Menginstalasi Milvus dengan Docker Compose

    Sebelum menginstal instans Milvus, periksa perangkat keras dan perangkat lunak Anda untuk mengetahui apakah keduanya memenuhi persyaratan.

    +

    Persyaratan perangkat keras

    + + + + + + + + + +
    KomponenPersyaratanRekomendasiCatatan
    CPU
    • CPU Intel Core Generasi ke-2 atau lebih tinggi
    • Silikon Apple
    • Mandiri: 4 inti atau lebih
    • Cluster 8 inti atau lebih
    Set instruksi CPU
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Pencarian kemiripan vektor dan pembuatan indeks dalam Milvus memerlukan dukungan CPU untuk set ekstensi instruksi tunggal, beberapa data (SIMD). Pastikan CPU mendukung setidaknya satu dari ekstensi SIMD yang terdaftar. Lihat CPU dengan AVX untuk informasi lebih lanjut.
    RAM
    • Mandiri: 8G
    • Cluster 32G
    • Mandiri: 16G
    • Cluster 128G
    Ukuran RAM tergantung pada volume data.
    Hard driveSSD SATA 3.0 atau lebih tinggiSSD NVMe atau lebih tinggiUkuran hard drive tergantung pada volume data.
    +

    Persyaratan perangkat lunak

    + + + + + + + + +
    Sistem operasiPerangkat lunakCatatan
    macOS 10.14 atau yang lebih baruDesktop DockerAtur mesin virtual (VM) Docker untuk menggunakan minimal 2 CPU virtual (vCPU) dan memori awal 8 GB. Jika tidak, penginstalan mungkin gagal.
    Lihat Menginstal Docker Desktop pada Mac untuk informasi lebih lanjut.
    Platform Linux
    • Docker 19.03 atau yang lebih baru
    • Docker Compose 1.25.1 atau yang lebih baru
    Lihat Instal Mesin Docker dan Instal Docker Compose untuk informasi selengkapnya.
    Windows dengan WSL 2 yang diaktifkanDesktop DockerKami menyarankan agar Anda menyimpan kode sumber dan data lain yang diikat ke dalam kontainer Linux di sistem berkas Linux, bukan di sistem berkas Windows.
    Lihat Menginstal Docker Desktop di Windows dengan backend WSL 2 untuk informasi lebih lanjut.
    +

    Ketergantungan berikut ini akan didapatkan dan dikonfigurasi secara otomatis saat Milvus Standalone diinstal menggunakan skrip Docker, atau konfigurasi Docker Compose:

    + + + + + + + + + +
    Perangkat LunakVersiCatatan
    etcd3.5.0Lihat persyaratan disk tambahan.
    MinIORELEASE.2023-03-20T20-16-18Z
    Pulsar2.8.2
    +

    Persyaratan disk tambahan

    Performa disk sangat penting untuk etcd. Sangat disarankan agar Anda menggunakan SSD NVMe lokal. Respons disk yang lebih lambat dapat menyebabkan seringnya pemilihan kluster yang pada akhirnya akan menurunkan layanan etcd.

    +

    Untuk menguji apakah disk Anda memenuhi syarat, gunakan fio.

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    Idealnya, disk Anda harus mencapai lebih dari 500 IOPS dan di bawah 10 ms untuk latensi fsync persentil ke-99. Baca Dokumen etcd untuk persyaratan yang lebih terperinci.

    +

    Apa selanjutnya

    Jika perangkat keras dan perangkat lunak Anda memenuhi persyaratan di atas, Anda dapat

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json new file mode 100644 index 000000000..16a7b7d7d --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nstandalone:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datacoord-6fd4bd885c-gkzwx 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexcoord-5bfcf6bdd8-nmh5l 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querycoord-579cd79455-xht5n 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-milvus-rootcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 30s\nmy-release-milvus-standalone-54c4f88cb9-f84pf 1/1 Running 0 30s\nmy-release-minio-5564fbbddc-mz7f5 1/1 Running 0 30s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus with GPU Support Using Helm Chart","anchorList":[{"label":"Menjalankan Milvus dengan Dukungan GPU Menggunakan Helm Chart","href":"Run-Milvus-with-GPU-Support-Using-Helm-Chart","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Helm Chart untuk Milvus","href":"Install-Helm-Chart-for-Milvus","type":2,"isActive":false},{"label":"Memulai Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"Mengakses Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Copot pemasangan Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md new file mode 100644 index 000000000..97a872a51 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md @@ -0,0 +1,378 @@ +--- +id: install_cluster-helm-gpu.md +label: Cluster (Helm) +related_key: Kubernetes +summary: Pelajari cara menginstal cluster Milvus di Kubernetes. +title: Menjalankan Milvus dengan Dukungan GPU Menggunakan Helm Chart +--- +

    Menjalankan Milvus dengan Dukungan GPU Menggunakan Helm Chart

    Halaman ini mengilustrasikan cara memulai instans Milvus dengan dukungan GPU menggunakan Helm Chart.

    +

    Gambaran Umum

    Helm menggunakan format pengemasan yang disebut chart. Bagan adalah kumpulan berkas yang mendeskripsikan sekumpulan sumber daya Kubernetes terkait. Milvus menyediakan sekumpulan bagan untuk membantu Anda menerapkan dependensi dan komponen Milvus. Milvus Helm Chart adalah solusi yang mem-bootstrap penerapan Milvus pada cluster Kubernetes (K8s) menggunakan manajer paket Helm.

    +

    Prasyarat

    +
    +

    Jika Anda mengalami masalah dalam menarik gambar, hubungi kami di community@zilliz.com dengan detail masalahnya, dan kami akan memberikan dukungan yang diperlukan.

    +
    +

    Menginstal Helm Chart untuk Milvus

    Helm adalah manajer paket K8s yang dapat membantu Anda menerapkan Milvus dengan cepat.

    +
      +
    1. Menambahkan repositori Milvus Helm.
    2. +
    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    Repositori Milvus Helm Chart di https://milvus-io.github.io/milvus-helm/ telah diarsipkan dan Anda dapat memperoleh pembaruan lebih lanjut dari https://zilliztech.github.io/milvus-helm/ sebagai berikut:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    Repo yang diarsipkan masih tersedia untuk grafik hingga versi 4.0.31. Untuk rilis yang lebih baru, gunakan repo yang baru.

    +
    +
      +
    1. Memperbarui grafik secara lokal.
    2. +
    +
    $ helm repo update
    +
    +

    Memulai Milvus

    Setelah Anda menginstal bagan Helm, Anda dapat memulai Milvus di Kubernetes. Pada bagian ini, kami akan memandu Anda melalui langkah-langkah untuk memulai Milvus dengan dukungan GPU.

    +

    Anda harus memulai Milvus dengan Helm dengan menentukan nama rilis, bagan, dan parameter yang ingin Anda ubah. Pada panduan ini, kami menggunakan my-release sebagai nama rilis. Untuk menggunakan nama rilis yang berbeda, ganti my-release pada perintah berikut dengan nama rilis yang Anda gunakan.

    +

    Milvus memungkinkan Anda untuk menetapkan satu atau beberapa perangkat GPU ke Milvus.

    +

    1. Menetapkan satu perangkat GPU

    Milvus dengan dukungan GPU memungkinkan Anda untuk menetapkan satu atau beberapa perangkat GPU.

    +
      +
    • Gugus Milvus

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
    • +
    • Milvus mandiri

      +
      cat <<EOF > custom-values.yaml
      +standalone:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2. Menetapkan beberapa perangkat GPU

    Selain satu perangkat GPU, Anda juga dapat menetapkan beberapa perangkat GPU ke Milvus.

    +
      +
    • Milvus cluster

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      Pada konfigurasi di atas, indexNode dan queryNode menggunakan dua GPU. Untuk menetapkan GPU yang berbeda ke indexNode dan queryNode, Anda dapat memodifikasi konfigurasi yang sesuai dengan mengatur extraEnv dalam file konfigurasi sebagai berikut:

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
      +
      +
        +
      • Nama rilis hanya boleh terdiri dari huruf, angka, dan tanda hubung. Titik tidak diperbolehkan dalam nama rilis.
      • +
      • Baris perintah default menginstal Milvus versi cluster saat menginstal Milvus dengan Helm. Pengaturan lebih lanjut diperlukan saat menginstal Milvus secara mandiri.
      • +
      • Menurut panduan migrasi API yang sudah tidak digunakan lagi dari Kuberenetes, versi API policy/v1beta1 dari PodDisruptionBudget tidak lagi dilayani pada v1.25. Anda disarankan untuk memigrasi manifes dan klien API untuk menggunakan versi API policy/v1 sebagai gantinya.
        Sebagai solusi untuk pengguna yang masih menggunakan versi API policy/v1beta1 dari PodDisruptionBudget di Kuberenetes v1.25 dan yang lebih baru, Anda dapat menjalankan perintah berikut untuk menginstal Milvus:
        helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
      • +
      • Lihat Bagan dan Helm Milvus untuk informasi lebih lanjut.
      • +
      +
      +
    • +
    • Milvus mandiri

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      Pada konfigurasi di atas, indexNode dan queryNode menggunakan dua GPU. Untuk menetapkan GPU yang berbeda ke indexNode dan queryNode, Anda dapat memodifikasi konfigurasi yang sesuai dengan mengatur extraEnv dalam file konfigurasi sebagai berikut:

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2. Memeriksa status Milvus

    Jalankan perintah berikut untuk memeriksa status Milvus:

    +
    $ kubectl get pods
    +
    +

    Setelah Milvus dimulai, kolom READY akan menampilkan 1/1 untuk semua pod.

    +
      +
    • Milvus cluster

      +
      NAME                                             READY  STATUS   RESTARTS  AGE
      +my-release-etcd-0                                1/1    Running   0        3m23s
      +my-release-etcd-1                                1/1    Running   0        3m23s
      +my-release-etcd-2                                1/1    Running   0        3m23s
      +my-release-milvus-datacoord-6fd4bd885c-gkzwx     1/1    Running   0        3m23s
      +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
      +my-release-milvus-indexcoord-5bfcf6bdd8-nmh5l    1/1    Running   0        3m23s
      +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
      +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
      +my-release-milvus-querycoord-579cd79455-xht5n    1/1    Running   0        3m24s
      +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
      +my-release-milvus-rootcoord-7fb9488465-dmbbj     1/1    Running   0        3m23s
      +my-release-minio-0                               1/1    Running   0        3m23s
      +my-release-minio-1                               1/1    Running   0        3m23s
      +my-release-minio-2                               1/1    Running   0        3m23s
      +my-release-minio-3                               1/1    Running   0        3m23s
      +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
      +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
      +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
      +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
      +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
      +
    • +
    • Milvus mandiri

      +
      NAME                                               READY   STATUS      RESTARTS   AGE
      +my-release-etcd-0                                  1/1     Running     0          30s
      +my-release-milvus-standalone-54c4f88cb9-f84pf      1/1     Running     0          30s
      +my-release-minio-5564fbbddc-mz7f5                  1/1     Running     0          30s
      +
    • +
    +

    3. Meneruskan port lokal ke Milvus

    Verifikasi port lokal mana yang didengarkan oleh server Milvus. Ganti nama pod dengan nama Anda sendiri.

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Kemudian, jalankan perintah berikut untuk meneruskan porta lokal ke porta yang dilayani oleh Milvus.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    Secara opsional, Anda dapat menggunakan :19530 dan bukan 27017:19530 pada perintah di atas untuk membiarkan kubectl mengalokasikan porta lokal untuk Anda sehingga Anda tidak perlu mengelola konflik porta.

    +

    Secara default, penerusan porta kubectl hanya mendengarkan localhost. Gunakan flag address jika Anda ingin Milvus mendengarkan pada alamat IP yang dipilih atau semua alamat IP. Perintah berikut ini membuat port-forward mendengarkan semua alamat IP pada mesin host.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Sekarang, Anda dapat terhubung ke Milvus menggunakan port yang diteruskan.

    +

    Mengakses Milvus WebUI

    Milvus dilengkapi dengan alat GUI bawaan yang disebut Milvus WebUI yang dapat Anda akses melalui peramban. Milvus Web UI meningkatkan kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda dapat menggunakan Milvus Web UI untuk mengamati statistik dan metrik komponen dan ketergantungan Milvus, memeriksa detail basis data dan koleksi, dan membuat daftar konfigurasi Milvus yang terperinci. Untuk detail tentang Milvus Web UI, lihat Milvus WebUI

    +

    Untuk mengaktifkan akses ke Milvus Web UI, anda perlu melakukan port-forward proxy pod ke port lokal.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Sekarang, Anda dapat mengakses Milvus Web UI di http://localhost:27018.

    +

    Copot pemasangan Milvus

    Jalankan perintah berikut untuk menghapus instalan Milvus.

    +
    $ helm uninstall my-release
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus, Anda bisa:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json new file mode 100644 index 000000000..9c7c8bf8c --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: [\"0\"]\n...\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: ['0', '1']\n...\n","$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","$ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone\n","$ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n","docker cp :/milvus/configs/milvus.yaml milvus.yaml\n","vim milvus.yaml\n","...\ngpu:\n initMemSize: 0\n maxMemSize: 0\n...\n","docker cp milvus.yaml :/milvus/configs/milvus.yaml\n","docker stop \ndocker start \n"],"headingContent":"Run Milvus with GPU Support Using Docker Compose","anchorList":[{"label":"Menjalankan Milvus dengan Dukungan GPU Menggunakan Docker Compose","href":"Run-Milvus-with-GPU-Support-Using-Docker-Compose","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Mengonfigurasi kumpulan memori","href":"Configure-memory-pool","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md new file mode 100644 index 000000000..871f9f943 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md @@ -0,0 +1,224 @@ +--- +id: install_standalone-docker-compose-gpu.md +label: Standalone (Docker Compose) +related_key: Kubernetes +summary: Pelajari cara menginstal cluster Milvus di Kubernetes. +title: Menjalankan Milvus dengan Dukungan GPU Menggunakan Docker Compose +--- +

    Menjalankan Milvus dengan Dukungan GPU Menggunakan Docker Compose

    Halaman ini mengilustrasikan cara memulai instans Milvus dengan dukungan GPU menggunakan Docker Compose.

    +

    Prasyarat

    +
    +

    Jika Anda mengalami masalah dalam menarik citra, hubungi kami di community@zilliz.com dengan detail tentang masalahnya, dan kami akan memberi Anda dukungan yang diperlukan.

    +
    +

    Menginstal Milvus

    Untuk menginstall Milvus dengan dukungan GPU menggunakan Docker Compose, ikuti langkah-langkah berikut.

    +

    1. Unduh dan konfigurasikan berkas YAML

    Unduh milvus-standalone-docker-compose-gpu.yml dan simpan sebagai docker-compose.yml secara manual, atau dengan perintah berikut.

    +
    $ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml
    +
    +

    Anda perlu membuat beberapa perubahan pada variabel lingkungan dari layanan mandiri dalam berkas YAML sebagai berikut:

    +
      +
    • Untuk menetapkan perangkat GPU tertentu ke Milvus, cari bidang deploy.resources.reservations.devices[0].devices_ids dalam definisi layanan standalone dan ganti nilainya dengan ID GPU yang diinginkan. Anda dapat menggunakan alat nvidia-smi, yang disertakan dengan driver tampilan GPU NVIDIA, untuk menentukan ID perangkat GPU. Milvus mendukung beberapa perangkat GPU.
    • +
    +

    Menetapkan satu perangkat GPU ke Milvus:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ["0"]
    +...
    +
    +

    Menetapkan beberapa perangkat GPU ke Milvus:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ['0', '1']
    +...
    +
    +

    2. Mulai Milvus

    Pada direktori yang menyimpan docker-compose.yml, jalankan Milvus dengan menjalankannya:

    +
    $ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +

    Jika Anda gagal menjalankan perintah di atas, periksa apakah sistem Anda telah menginstal Docker Compose V1. Jika demikian, Anda disarankan untuk bermigrasi ke Docker Compose V2 sesuai dengan catatan di halaman ini.

    +
    +

    Setelah memulai Milvus,

    +
      +
    • Kontainer bernama milvus-standalone, milvus-minio, dan milvus-etcd sudah aktif.
        +
      • Kontainer milvus-etcd tidak mengekspos port apa pun ke hos dan memetakan datanya ke volume/etcd dalam folder saat ini.
      • +
      • Kontainer milvus-minio melayani port 9090 dan 9091 secara lokal dengan kredensial autentikasi default dan memetakan datanya ke volume/minio dalam folder saat ini.
      • +
      • Kontainer milvus-standalone melayani port 19530 secara lokal dengan pengaturan default dan memetakan datanya ke volume/milvus di folder saat ini.
      • +
    • +
    +

    Anda dapat memeriksa apakah kontainer sudah aktif dan berjalan menggunakan perintah berikut:

    +
    $ sudo docker compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    Anda juga dapat mengakses Milvus WebUI di http://127.0.0.1:9091/webui/ untuk mempelajari lebih lanjut tentang instans Milvus Anda. Untuk detailnya, lihat Milvus WebUI.

    +

    Jika Anda telah menetapkan beberapa perangkat GPU ke Milvus di docker-compose.yml, Anda dapat menentukan perangkat GPU mana yang terlihat atau tersedia untuk digunakan.

    +

    Membuat perangkat GPU 0 terlihat oleh Milvus:

    +
    $ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone
    +
    +

    Membuat perangkat GPU 0 dan 1 terlihat oleh Milvus:

    +
    $ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone
    +
    +

    Anda dapat menghentikan dan menghapus kontainer ini sebagai berikut.

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    Mengonfigurasi kumpulan memori

    Setelah Milvus aktif dan berjalan, Anda dapat menyesuaikan kumpulan memori dengan memodifikasi pengaturan initMemSize dan maxMemSize dalam berkas milvus.yaml.

    +
    +

    Berkas milvus.yaml terletak di direktori /milvus/configs/ di dalam kontainer Milvus.

    +
    +

    Untuk mengonfigurasi kumpulan memori, ubah pengaturan initMemSize dan maxMemSize dalam berkas milvus.yaml sebagai berikut.

    +
      +
    1. Gunakan perintah berikut untuk menyalin milvus.yaml dari kontainer Milvus ke mesin lokal Anda. Ganti <milvus_container_id> dengan ID kontainer Milvus Anda yang sebenarnya.

      +
      docker cp <milvus_container_id>:/milvus/configs/milvus.yaml milvus.yaml
      +
    2. +
    3. Buka berkas milvus.yaml yang telah disalin dengan editor teks pilihan Anda. Sebagai contoh, menggunakan vim:

      +
      vim milvus.yaml
      +
    4. +
    5. Edit pengaturan initMemSize dan maxMemSize sesuai kebutuhan dan simpan perubahan Anda:

      +
      ...
      +gpu:
      +  initMemSize: 0
      +  maxMemSize: 0
      +...
      +
      +
        +
      • initMemSize: Ukuran awal dari kumpulan memori. Defaultnya adalah 1024.
      • +
      • maxMemSize: Ukuran maksimum dari kumpulan memori. Setelan awal adalah 2048.
      • +
    6. +
    7. Gunakan perintah berikut untuk menyalin berkas milvus.yaml yang telah dimodifikasi kembali ke kontainer Milvus. Ganti <milvus_container_id> dengan ID kontainer Milvus Anda yang sebenarnya.

      +
      docker cp milvus.yaml <milvus_container_id>:/milvus/configs/milvus.yaml
      +
    8. +
    9. Mulai ulang kontainer Milvus untuk menerapkan perubahan:

      +
      docker stop <milvus_container_id>
      +docker start <milvus_container_id>
      +
    10. +
    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.json b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.json new file mode 100644 index 000000000..4ea23af53 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545\n","$ modinfo nvidia | grep \"^version\"\nversion: 545.29.06\n","$ minikube start\n","$ kubectl cluster-info\n"," $ kubectl describe node \n\n Capacity:\n ...\n nvidia.com/gpu: 4\n ...\n Allocatable:\n ...\n nvidia.com/gpu: 4\n ...\n ``` \n"],"headingContent":"Requirements for Installing Milvus with GPU","anchorList":[{"label":"Persyaratan untuk Menginstalasi Milvus dengan GPU","href":"Requirements-for-Installing-Milvus-with-GPU","type":1,"isActive":false},{"label":"Kemampuan komputasi","href":"Compute-capability","type":2,"isActive":false},{"label":"Driver NVIDIA","href":"NVIDIA-driver","type":2,"isActive":false},{"label":"Persyaratan perangkat lunak","href":"Software-requirements","type":2,"isActive":false},{"label":"Pertanyaan Umum","href":"FAQs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.md b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.md new file mode 100644 index 000000000..3c04707f2 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-gpu/prerequisite-gpu.md @@ -0,0 +1,149 @@ +--- +id: prerequisite-gpu.md +label: GPU requirements +related_key: GPU +summary: Pelajari persiapan yang diperlukan sebelum menginstal Milvus dengan GPU. +title: Persyaratan untuk Menginstalasi Milvus dengan GPU +--- +

    Persyaratan untuk Menginstalasi Milvus dengan GPU

    Halaman ini berisi daftar persyaratan perangkat keras dan perangkat lunak untuk menyiapkan Milvus dengan dukungan GPU.

    +

    Kemampuan komputasi

    Kemampuan komputasi perangkat GPU Anda haruslah salah satu dari yang berikut ini: 6.0, 7.0, 7.5, 8.0, 8.6, 9.0.

    +

    Untuk memeriksa apakah perangkat GPU Anda memenuhi persyaratan, lihat Kemampuan Komputasi GPU Anda di situs web pengembang NVIDIA.

    +

    Driver NVIDIA

    Driver NVIDIA untuk perangkat GPU Anda harus ada di salah satu distribusi Linux yang didukung, dan NVIDIA Container Toolkit telah diinstal dengan mengikuti panduan ini.

    +

    Untuk pengguna Ubuntu 22.04, Anda dapat menginstal driver dan container toolkit dengan perintah berikut:

    +
    $ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545
    +
    +

    Untuk pengguna OS lain, lihat panduan penginstalan resmi.

    +

    Anda dapat memeriksa apakah driver telah terinstal dengan benar dengan menjalankan perintah berikut:

    +
    $ modinfo nvidia | grep "^version"
    +version:        545.29.06
    +
    +

    Anda disarankan untuk menggunakan driver versi 545 ke atas.

    +

    Persyaratan perangkat lunak

    Anda disarankan untuk menjalankan klaster Kubernetes pada platform Linux.

    +
      +
    • kubectl adalah alat baris perintah untuk Kubernetes. Gunakan versi kubectl yang berada dalam satu perbedaan versi kecil dari klaster Anda. Menggunakan versi terbaru dari kubectl membantu menghindari masalah yang tidak terduga.
    • +
    • minikube diperlukan saat menjalankan klaster Kubernetes secara lokal. minikube membutuhkan Docker sebagai dependensi. Pastikan Anda menginstal Docker sebelum menginstal Milvus menggunakan Helm. Lihat Dapatkan Docker untuk informasi lebih lanjut.
    • +
    + + + + + + + +
    Sistem operasiPerangkat lunakCatatan
    Platform Linux
    • Kubernetes 1.16 atau yang lebih baru
    • kubectl
    • Helm 3.0.0 atau yang lebih baru
    • minikube (untuk Milvus mandiri)
    • Docker 19.03 atau yang lebih baru (untuk Milvus mandiri)
    Lihat Dokumen Helm untuk informasi lebih lanjut.
    +

    Pertanyaan Umum

    Bagaimana cara memulai cluster K8s secara lokal untuk tujuan pengujian?

    Anda dapat menggunakan alat seperti minikube, kind, dan Kubeadm, untuk menyiapkan klaster Kubernetes secara lokal dengan cepat. Prosedur berikut ini menggunakan minikube sebagai contoh.

    +
      +
    1. Unduh minikube
    2. +
    +

    Buka halaman Memulai, periksa apakah Anda telah memenuhi persyaratan yang tercantum di bagian Apa yang Anda perlukan, klik tombol yang menggambarkan platform target Anda, dan salin perintah untuk mengunduh dan menginstal biner.

    +
      +
    1. Memulai cluster K8s menggunakan minikube
    2. +
    +
    $ minikube start
    +
    +
      +
    1. Memeriksa status klaster K8s
    2. +
    +

    Anda dapat memeriksa status klaster K8s yang terinstal menggunakan perintah berikut.

    +
    $ kubectl cluster-info
    +
    +
    +

    Pastikan Anda dapat mengakses klaster K8s melalui kubectl. Jika Anda belum menginstal kubectl secara lokal, lihat Menggunakan kubectl di dalam minikube.

    +
    +

    Bagaimana cara memulai klaster K8s dengan node pekerja GPU?

    Jika Anda lebih suka menggunakan node pekerja berkemampuan GPU, Anda dapat mengikuti langkah-langkah di bawah ini untuk membuat klaster K8s dengan node pekerja GPU. Kami menyarankan untuk menginstal Milvus pada cluster K8s dengan node pekerja GPU dan menggunakan kelas penyimpanan default yang disediakan.

    +
      +
    1. Menyiapkan node pekerja GPU
    2. +
    +

    Untuk menggunakan node pekerja berkemampuan GPU, ikuti langkah-langkah di Mempersiapkan node GPU Anda.

    +
      +
    1. Mengaktifkan dukungan GPU pada K8
    2. +
    +

    Terapkan nvidia-device-plugin dengan Helm dengan mengikuti langkah-langkah berikut .

    +

    Setelah menyiapkan, lihat sumber daya GPU dengan perintah berikut. Ganti <gpu-worker-node> dengan nama node yang sebenarnya.

    +
      $ kubectl describe node <gpu-worker-node>
    +
    +  Capacity:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  Allocatable:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  ```  
    +
    diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.json b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.json new file mode 100644 index 000000000..36617ff99 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm/\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","$ helm install my-release milvus/milvus\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-mixcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm template my-release milvus/milvus > milvus_manifest.yaml\n","$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt\n$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py\n","$ pip3 install -r requirements.txt\n$ python3 save_image.py --manifest milvus_manifest.yaml\n","$ for image in $(find . -type f -name \"*.tar.gz\") ; do gunzip -c $image | docker load; done\n","$ kubectl apply -f milvus_manifest.yaml\n","$ helm repo update\n$ helm upgrade my-release zilliztech/milvus\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus in Kubernetes with Helm","anchorList":[{"label":"Menjalankan Milvus di Kubernetes dengan Helm","href":"Run-Milvus-in-Kubernetes-with-Helm","type":1,"isActive":false},{"label":"Gambaran umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Milvus Helm Chart","href":"Install-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"Instalasi online","href":"Online-install","type":2,"isActive":false},{"label":"Mengakses Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Mengakses Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Instalasi offline","href":"Offline-install","type":2,"isActive":false},{"label":"Memutakhirkan cluster Milvus yang sedang berjalan","href":"Upgrade-running-Milvus-cluster","type":2,"isActive":false},{"label":"Copot pemasangan Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.md b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.md new file mode 100644 index 000000000..8be9eb162 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-helm.md @@ -0,0 +1,335 @@ +--- +id: install_cluster-helm.md +label: Helm +related_key: Kubernetes +summary: Pelajari cara menginstal cluster Milvus di Kubernetes. +title: Pasang Milvus Cluster dengan Helm +--- +

    Menjalankan Milvus di Kubernetes dengan Helm

    Halaman ini mengilustrasikan cara memulai instans Milvus di Kubernetes menggunakan bagan Helm Milvus.

    +

    Gambaran umum

    Helm menggunakan format pengemasan yang disebut bagan. Bagan adalah kumpulan berkas yang mendeskripsikan sekumpulan sumber daya Kubernetes terkait. Milvus menyediakan sekumpulan bagan untuk membantu Anda menerapkan dependensi dan komponen Milvus.

    +

    Prasyarat

      +
    • Instal Helm CLI.

    • +
    • Buat kluster K8s.

    • +
    • Instal StorageClass. Anda dapat memeriksa StorageClass yang terinstal sebagai berikut.

      +
      $ kubectl get sc
      +
      +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
      +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
      +
    • +
    • Periksa persyaratan perangkat keras dan perangkat lunak sebelum instalasi.

    • +
    • Sebelum menginstal Milvus, disarankan untuk menggunakan Milvus Sizing Tool untuk memperkirakan kebutuhan perangkat keras berdasarkan ukuran data Anda. Hal ini membantu memastikan kinerja dan alokasi sumber daya yang optimal untuk instalasi Milvus Anda.

    • +
    +
    +

    Jika Anda mengalami masalah dalam menarik gambar, hubungi kami di community@zilliz.com dengan rincian tentang masalahnya, dan kami akan memberikan dukungan yang diperlukan.

    +
    +

    Menginstal Milvus Helm Chart

    Sebelum menginstal Milvus Helm Charts, Anda harus menambahkan repositori Milvus Helm.

    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    Repositori Milvus Helm Charts di https://github.com/milvus-io/milvus-helm telah diarsipkan dan Anda dapat memperoleh pembaruan lebih lanjut dari https://github.com/zilliztech/milvus-helm sebagai berikut:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    Repo yang diarsipkan masih tersedia untuk grafik hingga versi 4.0.31. Untuk rilis yang lebih baru, gunakan repo yang baru.

    +
    +

    Kemudian ambil grafik Milvus dari repositori sebagai berikut:

    +
    $ helm repo update
    +
    +

    Anda selalu dapat menjalankan perintah ini untuk mengambil grafik Milvus Helm terbaru.

    +

    Instalasi online

    1. Menerapkan sebuah cluster Milvus

    Setelah Anda menginstal bagan Helm, Anda dapat memulai Milvus di Kubernetes. Bagian ini akan memandu Anda melalui langkah-langkah untuk memulai Milvus.

    +
    $ helm install my-release milvus/milvus
    +
    +

    Pada perintah di atas, my-release adalah nama rilis, dan milvus/milvus adalah repositori bagan yang terinstal secara lokal. Untuk menggunakan nama yang berbeda, ganti my-release dengan nama yang Anda inginkan.

    +

    Perintah di atas men-deploy sebuah cluster Milvus dengan komponen dan dependensinya menggunakan konfigurasi default. Untuk menyesuaikan pengaturan ini, kami sarankan Anda menggunakan Milvus Sizing Tool untuk menyesuaikan konfigurasi berdasarkan ukuran data Anda yang sebenarnya, lalu mengunduh berkas YAML yang sesuai. Untuk mempelajari lebih lanjut tentang parameter konfigurasi, lihat Daftar Periksa Konfigurasi Sistem Milvus.

    +
    +
      +
    • Nama rilis hanya boleh terdiri dari huruf, angka, dan tanda hubung. Titik tidak diperbolehkan dalam nama rilis.
    • +
    • Baris perintah default menginstal Milvus versi cluster saat menginstal Milvus dengan Helm. Pengaturan lebih lanjut diperlukan saat menginstal Milvus secara mandiri.
    • +
    • Menurut panduan migrasi API yang sudah tidak digunakan lagi dari Kubernetes, versi API policy/v1beta1 dari PodDisruptionBudget tidak lagi dilayani pada v1.25. Anda disarankan untuk memigrasi manifes dan klien API untuk menggunakan versi API policy/v1 sebagai gantinya.
      Sebagai solusi untuk pengguna yang masih menggunakan versi API policy/v1beta1 dari PodDisruptionBudget di Kubernetes v1.25 dan yang lebih baru, Anda dapat menjalankan perintah berikut ini untuk menginstal Milvus:
      helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
    • +
    • Lihat Bagan dan Helm Milvus untuk informasi lebih lanjut.
    • +
    +
    +

    2. Memeriksa status klaster Milvus

    Jalankan perintah berikut untuk memeriksa status semua pod dalam cluster Milvus Anda.

    +
    $ kubectl get pods
    +
    +

    Setelah semua pod berjalan, keluaran dari perintah di atas akan serupa dengan yang berikut ini:

    +
    NAME                                             READY  STATUS   RESTARTS  AGE
    +my-release-etcd-0                                1/1    Running   0        3m23s
    +my-release-etcd-1                                1/1    Running   0        3m23s
    +my-release-etcd-2                                1/1    Running   0        3m23s
    +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
    +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
    +my-release-milvus-mixcoord-7fb9488465-dmbbj      1/1    Running   0        3m23s
    +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
    +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
    +my-release-minio-0                               1/1    Running   0        3m23s
    +my-release-minio-1                               1/1    Running   0        3m23s
    +my-release-minio-2                               1/1    Running   0        3m23s
    +my-release-minio-3                               1/1    Running   0        3m23s
    +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
    +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
    +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
    +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
    +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
    +
    +

    Anda juga dapat mengakses Milvus WebUI di http://127.0.0.1:9091/webui/ untuk mempelajari lebih lanjut tentang instans Milvus Anda. Untuk detailnya, lihat Milvus WebUI.

    +

    3. Meneruskan port lokal ke Milvus

    Jalankan perintah berikut untuk mendapatkan port di mana kluster Milvus Anda melayani.

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Keluarannya menunjukkan bahwa instans Milvus melayani pada port default 19530.

    +
    +

    Jika Anda telah menggunakan Milvus dalam mode mandiri, ubah nama pod dari my-release-milvus-proxy-xxxxxxxxxx-xxxxx menjadi my-release-milvus-xxxxxxxxxx-xxxxx.

    +
    +

    Kemudian, jalankan perintah berikut untuk meneruskan porta lokal ke porta tempat Milvus melayani.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    Secara opsional, Anda dapat menggunakan :19530 dan bukan 27017:19530 pada perintah di atas untuk membiarkan kubectl mengalokasikan porta lokal untuk Anda sehingga Anda tidak perlu mengelola konflik porta.

    +

    Secara default, penerusan porta kubectl hanya mendengarkan localhost. Gunakan flag address jika Anda ingin Milvus mendengarkan pada alamat IP yang dipilih atau semua alamat IP. Perintah berikut ini membuat port-forward mendengarkan semua alamat IP pada mesin host.

    +

    Sekarang, Anda dapat terhubung ke Milvus menggunakan port yang diteruskan.

    +

    Mengakses Milvus WebUI

    Milvus dilengkapi dengan alat GUI bawaan yang disebut Milvus WebUI yang dapat Anda akses melalui peramban. Milvus Web UI meningkatkan kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda dapat menggunakan Milvus Web UI untuk mengamati statistik dan metrik komponen dan ketergantungan Milvus, memeriksa detail basis data dan koleksi, dan membuat daftar konfigurasi Milvus yang terperinci. Untuk detail tentang Milvus Web UI, lihat Milvus WebUI

    +

    Untuk mengaktifkan akses ke Milvus Web UI, anda perlu melakukan port-forward proxy pod ke port lokal.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Sekarang, Anda dapat mengakses Milvus Web UI di http://localhost:27018.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Sekarang, Anda dapat terhubung ke Milvus menggunakan port yang diteruskan.

    +

    Mengakses Milvus WebUI

    Milvus dilengkapi dengan alat GUI bawaan yang disebut Milvus WebUI yang dapat Anda akses melalui peramban. Milvus Web UI meningkatkan kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda dapat menggunakan Milvus Web UI untuk mengamati statistik dan metrik komponen dan ketergantungan Milvus, memeriksa detail basis data dan koleksi, dan membuat daftar konfigurasi Milvus yang terperinci. Untuk detail tentang Milvus Web UI, lihat Milvus WebUI

    +

    Untuk mengaktifkan akses ke Milvus Web UI, anda perlu meneruskan porta proxy pod ke porta lokal.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Sekarang, Anda dapat mengakses Milvus Web UI di http://localhost:27018.

    +

    Instalasi offline

    Jika Anda berada di lingkungan yang dibatasi jaringan, ikuti prosedur di bagian ini untuk memulai cluster Milvus.

    +

    1. Dapatkan manifes Milvus

    Jalankan perintah berikut untuk mendapatkan manifes Milvus.

    +
    $ helm template my-release milvus/milvus > milvus_manifest.yaml
    +
    +

    Perintah di atas membuat templat bagan untuk klaster Milvus dan menyimpan hasilnya ke berkas manifes bernama milvus_manifest.yaml. Dengan menggunakan manifes ini, Anda dapat menginstal klaster Milvus dengan komponen dan dependensinya dalam pod yang terpisah.

    +
    +
      +
    • Untuk menginstal instans Milvus dalam mode mandiri di mana semua komponen Milvus berada dalam satu pod, Anda harus menjalankan helm template my-release --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false milvus/milvus > milvus_manifest.yaml sebagai gantinya untuk merender templat bagan untuk instans Milvus dalam mode mandiri.
    • +
    • Untuk mengubah konfigurasi Milvus, unduh template value.yaml template, letakkan pengaturan yang Anda inginkan di dalamnya, dan gunakan helm template -f values.yaml my-release milvus/milvus > milvus_manifest.yaml untuk merender manifes yang sesuai.
    • +
    +
    +

    2. Unduh skrip penarik gambar

    Skrip penarik gambar dikembangkan dalam bahasa Python. Anda harus mengunduh skrip bersama dengan dependensinya di file requirement.txt.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt
    +$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py
    +
    +

    3. Menarik dan menyimpan gambar

    Jalankan perintah berikut untuk menarik dan menyimpan gambar yang diperlukan.

    +
    $ pip3 install -r requirements.txt
    +$ python3 save_image.py --manifest milvus_manifest.yaml
    +
    +

    Gambar-gambar tersebut akan ditarik ke dalam sub-folder bernama images di direktori saat ini.

    +

    4. Memuat gambar

    Anda sekarang dapat memuat gambar ke host di lingkungan yang dibatasi jaringan sebagai berikut:

    +
    $ for image in $(find . -type f -name "*.tar.gz") ; do gunzip -c $image | docker load; done
    +
    +

    5. Menyebarkan Milvus

    $ kubectl apply -f milvus_manifest.yaml
    +
    +

    Hingga saat ini, Anda dapat mengikuti langkah 2 dan 3 dari penginstalan online untuk memeriksa status klaster dan meneruskan porta lokal ke Milvus.

    +

    Memutakhirkan cluster Milvus yang sedang berjalan

    Jalankan perintah berikut untuk meng-upgrade cluster Milvus yang sedang berjalan ke versi terbaru:

    +
    $ helm repo update
    +$ helm upgrade my-release zilliztech/milvus
    +
    +

    Copot pemasangan Milvus

    Jalankan perintah berikut untuk menghapus instalan Milvus.

    +
    $ helm uninstall my-release
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json new file mode 100644 index 000000000..415161210 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml\n","customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created\nnamespace/cert-manager created\nserviceaccount/cert-manager-cainjector created\n...\nservice/cert-manager created\nservice/cert-manager-webhook created\ndeployment.apps/cert-manager-cainjector created\ndeployment.apps/cert-manager created\ndeployment.apps/cert-manager-webhook created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\n","$ kubectl get pods -n cert-manager\n\nNAME READY STATUS RESTARTS AGE\ncert-manager-848f547974-gccz8 1/1 Running 0 70s\ncert-manager-cainjector-54f4cc6b5-dpj84 1/1 Running 0 70s\ncert-manager-webhook-7c9588c76-tqncn 1/1 Running 0 70s\n","$ helm install milvus-operator \\\n -n milvus-operator --create-namespace \\\n --wait --wait-for-jobs \\\n https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz\n","NAME: milvus-operator\nLAST DEPLOYED: Thu Jul 7 13:18:40 2022\nNAMESPACE: milvus-operator\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nMilvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed\nIf Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`\nFull Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md\nQuick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`\nMore samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples\nCRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml\n","namespace/milvus-operator created\ncustomresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created\nserviceaccount/milvus-operator-controller-manager created\nrole.rbac.authorization.k8s.io/milvus-operator-leader-election-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created\nrolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created\nconfigmap/milvus-operator-manager-config created\nservice/milvus-operator-controller-manager-metrics-service created\nservice/milvus-operator-webhook-service created\ndeployment.apps/milvus-operator-controller-manager created\ncertificate.cert-manager.io/milvus-operator-serving-cert created\nissuer.cert-manager.io/milvus-operator-selfsigned-issuer created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created\n","$ kubectl get pods -n milvus-operator\n\nNAME READY STATUS RESTARTS AGE\nmilvus-operator-5fd77b87dc-msrk4 1/1 Running 0 46s\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","$ kubectl get milvus my-release -o yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n...\nstatus:\n conditions:\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n reason: StorageReady\n status: \"True\"\n type: StorageReady\n - lastTransitionTime: \"2021-11-02T06:06:23Z\"\n message: Pulsar is ready\n reason: PulsarReady\n status: \"True\"\n type: PulsarReady\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n message: Etcd endpoints is healthy\n reason: EtcdReady\n status: \"True\"\n type: EtcdReady\n - lastTransitionTime: \"2021-11-02T06:12:36Z\"\n message: All Milvus components are healthy\n reason: MilvusClusterHealthy\n status: \"True\"\n type: MilvusReady\n endpoint: my-release-milvus.default:19530\n status: Healthy\n","$ kubectl get pods\n\nNAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 14m\nmy-release-etcd-1 1/1 Running 0 14m\nmy-release-etcd-2 1/1 Running 0 14m\nmy-release-milvus-datanode-5c686bd65-wxtmf 1/1 Running 0 6m\nmy-release-milvus-indexnode-5b9787b54-xclbx 1/1 Running 0 6m\nmy-release-milvus-proxy-84f67cdb7f-pg6wf 1/1 Running 0 6m\nmy-release-milvus-querynode-5bcb59f6-nhqqw 1/1 Running 0 6m\nmy-release-milvus-mixcoord-fdcccfc84-9964g 1/1 Running 0 6m\nmy-release-minio-0 1/1 Running 0 14m\nmy-release-minio-1 1/1 Running 0 14m\nmy-release-minio-2 1/1 Running 0 14m\nmy-release-minio-3 1/1 Running 0 14m\nmy-release-pulsar-bookie-0 1/1 Running 0 14m\nmy-release-pulsar-bookie-1 1/1 Running 0 14m\nmy-release-pulsar-bookie-init-h6tfz 0/1 Completed 0 14m\nmy-release-pulsar-broker-0 1/1 Running 0 14m\nmy-release-pulsar-broker-1 1/1 Running 0 14m\nmy-release-pulsar-proxy-0 1/1 Running 0 14m\nmy-release-pulsar-proxy-1 1/1 Running 0 14m\nmy-release-pulsar-pulsar-init-d2t56 0/1 Completed 0 14m\nmy-release-pulsar-recovery-0 1/1 Running 0 14m\nmy-release-pulsar-toolset-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 13m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 13m\n","$ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl delete milvus my-release\n","$ helm -n milvus-operator uninstall milvus-operator\n","$ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml\n"],"headingContent":"Run Milvus in Kubernetes with Milvus Operator","anchorList":[{"label":"Menjalankan Milvus di Kubernetes dengan Milvus Operator","href":"Run-Milvus-in-Kubernetes-with-Milvus-Operator","type":1,"isActive":false},{"label":"Gambaran umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menginstal Milvus Operator","href":"Install-Milvus-Operator","type":2,"isActive":false},{"label":"Menyebarkan Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Mengakses Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Copot pemasangan Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Menghapus Instalasi Operator Milvus","href":"Uninstall-Milvus-Operator","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md new file mode 100644 index 000000000..fa6fd10d4 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md @@ -0,0 +1,394 @@ +--- +id: install_cluster-milvusoperator.md +label: Milvus Operator +related_key: Kubernetes +summary: >- + Pelajari cara menginstal cluster Milvus di Kubernetes menggunakan Milvus + Operator +title: Instal Milvus Cluster dengan Operator Milvus +--- +

    Menjalankan Milvus di Kubernetes dengan Milvus Operator

    Halaman ini mengilustrasikan cara memulai instans Milvus di Kubernetes menggunakan Milvus Operator.

    +

    Gambaran umum

    Milvus Operator adalah solusi yang membantu Anda men-deploy dan mengelola tumpukan layanan Milvus secara lengkap untuk menargetkan cluster Kubernetes (K8). Stack ini mencakup semua komponen Milvus dan dependensi yang relevan seperti etcd, Pulsar, dan MinIO.

    +

    Prasyarat

      +
    • Buat cluster K8s.

    • +
    • Instal StorageClass. Anda dapat memeriksa StorageClass yang terinstal sebagai berikut.

      +
      $ kubectl get sc
      +
      +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
      +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
      +
    • +
    • Periksa persyaratan perangkat keras dan perangkat lunak sebelum instalasi.

    • +
    • Sebelum menginstal Milvus, disarankan untuk menggunakan Milvus Sizing Tool untuk memperkirakan kebutuhan perangkat keras berdasarkan ukuran data Anda. Hal ini membantu memastikan kinerja dan alokasi sumber daya yang optimal untuk instalasi Milvus Anda.

    • +
    +
    +

    Jika Anda mengalami masalah dalam menarik gambar, hubungi kami di community@zilliz.com dengan rincian tentang masalahnya, dan kami akan memberikan dukungan yang diperlukan.

    +
    +

    Menginstal Milvus Operator

    Milvus Operator mendefinisikan sumber daya khusus klaster Milvus di atas Sumber Daya Khusus Kubernetes. Ketika sumber daya khusus didefinisikan, Anda dapat menggunakan API K8s dengan cara deklaratif dan mengelola tumpukan penerapan Milvus untuk memastikan skalabilitas dan ketersediaannya yang tinggi.

    +

    1. Instal cert-manager

    Milvus Operator menggunakan cert-manager untuk menyediakan sertifikat untuk server webhook.

    +
    + +
    +

    Jalankan perintah berikut ini untuk menginstal cert-manager.

    +
    $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
    +
    +

    Anda akan melihat keluaran yang serupa dengan berikut ini setelah proses instalasi berakhir.

    +
    customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
    +namespace/cert-manager created
    +serviceaccount/cert-manager-cainjector created
    +...
    +service/cert-manager created
    +service/cert-manager-webhook created
    +deployment.apps/cert-manager-cainjector created
    +deployment.apps/cert-manager created
    +deployment.apps/cert-manager-webhook created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +
    +

    Anda dapat memeriksa apakah cert-manager pod berjalan sebagai berikut:

    +
    $ kubectl get pods -n cert-manager
    +
    +NAME                                      READY   STATUS    RESTARTS   AGE
    +cert-manager-848f547974-gccz8             1/1     Running   0          70s
    +cert-manager-cainjector-54f4cc6b5-dpj84   1/1     Running   0          70s
    +cert-manager-webhook-7c9588c76-tqncn      1/1     Running   0          70s
    +
    +

    2. Menginstal Milvus Operator

    Anda dapat menginstal Milvus Operator dengan salah satu dari cara berikut ini:

    + +

    Menginstal dengan Helm

    Jalankan perintah berikut untuk menginstal Milvus Operator dengan Helm.

    +
    $ helm install milvus-operator \
    +  -n milvus-operator --create-namespace \
    +  --wait --wait-for-jobs \
    +  https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz
    +
    +

    Anda akan melihat output yang mirip dengan yang berikut ini setelah proses instalasi berakhir.

    +
    NAME: milvus-operator
    +LAST DEPLOYED: Thu Jul  7 13:18:40 2022
    +NAMESPACE: milvus-operator
    +STATUS: deployed
    +REVISION: 1
    +TEST SUITE: None
    +NOTES:
    +Milvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed
    +If Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`
    +Full Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md
    +Quick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`
    +More samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples
    +CRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD
    +
    +

    Instal dengan kubectl

    Jalankan perintah berikut untuk menginstal Milvus Operator dengan kubectl.

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
    +
    +

    Anda akan melihat output seperti berikut setelah proses instalasi berakhir.

    +
    namespace/milvus-operator created
    +customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
    +serviceaccount/milvus-operator-controller-manager created
    +role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created
    +rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created
    +configmap/milvus-operator-manager-config created
    +service/milvus-operator-controller-manager-metrics-service created
    +service/milvus-operator-webhook-service created
    +deployment.apps/milvus-operator-controller-manager created
    +certificate.cert-manager.io/milvus-operator-serving-cert created
    +issuer.cert-manager.io/milvus-operator-selfsigned-issuer created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created
    +
    +

    Anda dapat memeriksa apakah pod Milvus Operator telah berjalan sebagai berikut:

    +
    $ kubectl get pods -n milvus-operator
    +
    +NAME                               READY   STATUS    RESTARTS   AGE
    +milvus-operator-5fd77b87dc-msrk4   1/1     Running   0          46s
    +
    +

    Menyebarkan Milvus

    1. Menyebarkan cluster Milvus

    Setelah pod Milvus Operator berjalan, Anda dapat men-deploy cluster Milvus sebagai berikut.

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Perintah di atas men-deploy cluster Milvus dengan komponen dan dependensinya dalam pod terpisah menggunakan konfigurasi default. Untuk menyesuaikan pengaturan ini, kami sarankan Anda menggunakan Milvus Sizing Tool untuk menyesuaikan konfigurasi berdasarkan ukuran data Anda yang sebenarnya, lalu mengunduh file YAML yang sesuai. Untuk mempelajari lebih lanjut tentang parameter konfigurasi, lihat Daftar Periksa Konfigurasi Sistem Milvus.

    +
    +
      +
    • Nama rilis hanya boleh terdiri dari huruf, angka, dan tanda hubung. Titik tidak diperbolehkan dalam nama rilis.
    • +
    • Anda juga dapat menggunakan instans Milvus dalam mode mandiri, di mana semua komponennya berada dalam satu pod. Untuk melakukannya, ubah URL berkas konfigurasi pada perintah di atas menjadi https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_default.yaml
    • +
    +
    +

    2. Memeriksa status cluster Milvus

    Jalankan perintah berikut untuk memeriksa status cluster Milvus

    +
    $ kubectl get milvus my-release -o yaml
    +
    +

    Setelah cluster Milvus Anda siap, keluaran dari perintah di atas akan serupa dengan yang berikut ini. Jika bidang status.status tetap Unhealthy, cluster Milvus Anda masih dalam proses pembuatan.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +...
    +status:
    +  conditions:
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    reason: StorageReady
    +    status: "True"
    +    type: StorageReady
    +  - lastTransitionTime: "2021-11-02T06:06:23Z"
    +    message: Pulsar is ready
    +    reason: PulsarReady
    +    status: "True"
    +    type: PulsarReady
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    message: Etcd endpoints is healthy
    +    reason: EtcdReady
    +    status: "True"
    +    type: EtcdReady
    +  - lastTransitionTime: "2021-11-02T06:12:36Z"
    +    message: All Milvus components are healthy
    +    reason: MilvusClusterHealthy
    +    status: "True"
    +    type: MilvusReady
    +  endpoint: my-release-milvus.default:19530
    +  status: Healthy
    +
    +

    Milvus Operator membuat dependensi Milvus, seperti etcd, Pulsar, dan MinIO, dan kemudian komponen Milvus, seperti proxy, koordinator, dan node.

    +

    Setelah cluster Milvus Anda siap, status semua pod dalam cluster Milvus akan serupa dengan yang berikut ini.

    +
    $ kubectl get pods
    +
    +NAME                                            READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          14m
    +my-release-etcd-1                               1/1     Running     0          14m
    +my-release-etcd-2                               1/1     Running     0          14m
    +my-release-milvus-datanode-5c686bd65-wxtmf      1/1     Running     0          6m
    +my-release-milvus-indexnode-5b9787b54-xclbx     1/1     Running     0          6m
    +my-release-milvus-proxy-84f67cdb7f-pg6wf        1/1     Running     0          6m
    +my-release-milvus-querynode-5bcb59f6-nhqqw      1/1     Running     0          6m
    +my-release-milvus-mixcoord-fdcccfc84-9964g      1/1     Running     0          6m
    +my-release-minio-0                              1/1     Running     0          14m
    +my-release-minio-1                              1/1     Running     0          14m
    +my-release-minio-2                              1/1     Running     0          14m
    +my-release-minio-3                              1/1     Running     0          14m
    +my-release-pulsar-bookie-0                      1/1     Running     0          14m
    +my-release-pulsar-bookie-1                      1/1     Running     0          14m
    +my-release-pulsar-bookie-init-h6tfz             0/1     Completed   0          14m
    +my-release-pulsar-broker-0                      1/1     Running     0          14m
    +my-release-pulsar-broker-1                      1/1     Running     0          14m
    +my-release-pulsar-proxy-0                       1/1     Running     0          14m
    +my-release-pulsar-proxy-1                       1/1     Running     0          14m
    +my-release-pulsar-pulsar-init-d2t56             0/1     Completed   0          14m
    +my-release-pulsar-recovery-0                    1/1     Running     0          14m
    +my-release-pulsar-toolset-0                     1/1     Running     0          14m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          14m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          13m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          13m
    +
    +

    3. Meneruskan port lokal ke Milvus

    Jalankan perintah berikut untuk mendapatkan port di mana cluster Milvus Anda melayani.

    +
    $ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Keluarannya menunjukkan bahwa instans Milvus melayani pada port default 19530.

    +
    +

    Jika Anda telah menggunakan Milvus dalam mode mandiri, ubah nama pod dari my-release-milvus-proxy-xxxxxxxxxx-xxxxx menjadi my-release-milvus-xxxxxxxxxx-xxxxx.

    +
    +

    Kemudian, jalankan perintah berikut untuk meneruskan porta lokal ke porta tempat Milvus melayani.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    Secara opsional, Anda dapat menggunakan :19530 dan bukan 27017:19530 pada perintah di atas untuk membiarkan kubectl mengalokasikan porta lokal untuk Anda sehingga Anda tidak perlu mengelola konflik porta.

    +

    Secara default, penerusan porta kubectl hanya mendengarkan localhost. Gunakan flag address jika Anda ingin Milvus mendengarkan pada alamat IP yang dipilih atau semua alamat IP. Perintah berikut ini membuat port-forward mendengarkan semua alamat IP pada mesin host.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Sekarang, Anda dapat terhubung ke Milvus menggunakan port yang diteruskan.

    +

    Mengakses Milvus WebUI

    Milvus dilengkapi dengan alat GUI bawaan yang disebut Milvus WebUI yang dapat Anda akses melalui peramban. Milvus Web UI meningkatkan kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda dapat menggunakan Milvus Web UI untuk mengamati statistik dan metrik komponen dan ketergantungan Milvus, memeriksa detail basis data dan koleksi, dan membuat daftar konfigurasi Milvus yang terperinci. Untuk detail tentang Milvus Web UI, lihat Milvus WebUI

    +

    Untuk mengaktifkan akses ke Milvus Web UI, anda perlu melakukan port-forward proxy pod ke port lokal.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Sekarang, Anda dapat mengakses Milvus Web UI di http://localhost:27018.

    +

    Copot pemasangan Milvus

    Jalankan perintah berikut untuk menghapus instalan cluster Milvus.

    +
    $ kubectl delete milvus my-release
    +
    +
    +
      +
    • Ketika Anda menghapus cluster Milvus menggunakan konfigurasi default, dependensi seperti etcd, Pulsar, dan MinIO tidak terhapus. Oleh karena itu, pada saat Anda menginstal instans cluster Milvus yang sama, dependensi ini akan digunakan lagi.
    • +
    • Untuk menghapus dependensi dan private virtual cloud (PVC) bersama dengan cluster Milvus, lihat file konfigurasi.
    • +
    +
    +

    Menghapus Instalasi Operator Milvus

    Ada juga dua cara untuk menghapus instalan Milvus Operator.

    + +

    Copot pemasangan dengan Helm

    $ helm -n milvus-operator uninstall milvus-operator
    +
    +

    Copot pemasangan dengan kubectl

    $ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml
    +
    +

    Apa selanjutnya

    Setelah menginstal Milvus di Docker, Anda dapat:

    + diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.json b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.json new file mode 100644 index 000000000..25fc4d344 --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n","$ minikube start\n","$ kubectl cluster-info\n"],"headingContent":"Requirements for running Milvus on Kubernetes","anchorList":[{"label":"Persyaratan untuk menjalankan Milvus di Kubernetes","href":"Requirements-for-running-Milvus-on-Kubernetes","type":1,"isActive":false},{"label":"Persyaratan perangkat keras","href":"Hardware-requirements","type":2,"isActive":false},{"label":"Persyaratan perangkat lunak","href":"Software-requirements","type":2,"isActive":false},{"label":"Pertanyaan Umum","href":"FAQs","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.md b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.md new file mode 100644 index 000000000..a5fd68bbf --- /dev/null +++ b/localization/v2.5.x/site/id/getstarted/run-milvus-k8s/prerequisite-helm.md @@ -0,0 +1,148 @@ +--- +id: prerequisite-helm.md +label: Install on Kubernetes +related_key: Kubernetes +summary: Pelajari persiapan yang diperlukan sebelum memasang Milvus dengan Helm. +title: Persyaratan untuk menjalankan Milvus di Kubernetes +--- +

    Persyaratan untuk menjalankan Milvus di Kubernetes

    Halaman ini mencantumkan persyaratan perangkat keras dan perangkat lunak untuk menjalankan Milvus.

    +

    Persyaratan perangkat keras

    + + + + + + + + + +
    KomponenPersyaratanRekomendasiCatatan
    CPU
    • CPU Intel Core Generasi ke-2 atau lebih tinggi
    • Silikon Apple
    • Mandiri: 4 inti atau lebih
    • Cluster 8 inti atau lebih
    Set instruksi CPU
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Pencarian kemiripan vektor dan pembuatan indeks dalam Milvus memerlukan dukungan CPU untuk set ekstensi instruksi tunggal, beberapa data (SIMD). Pastikan CPU mendukung setidaknya satu dari ekstensi SIMD yang terdaftar. Lihat CPU dengan AVX untuk informasi lebih lanjut.
    RAM
    • Mandiri: 8G
    • Cluster 32G
    • Mandiri: 16G
    • Cluster 128G
    Ukuran RAM tergantung pada volume data.
    Hard driveSSD SATA 3.0 atau CloudStorageSSD NVMe atau yang lebih tinggiUkuran hard drive tergantung pada volume data.
    +

    Persyaratan perangkat lunak

    Anda disarankan untuk menjalankan klaster Kubernetes pada platform Linux.

    +

    kubectl adalah alat baris perintah untuk Kubernetes. Gunakan versi kubectl yang memiliki perbedaan versi kecil dengan klaster Anda. Menggunakan versi terbaru dari kubectl membantu menghindari masalah yang tidak terduga.

    +

    minikube diperlukan saat menjalankan klaster Kubernetes secara lokal. minikube membutuhkan Docker sebagai dependensi. Pastikan Anda menginstal Docker sebelum menginstal Milvus menggunakan Helm. Lihat Dapatkan Docker untuk informasi lebih lanjut.

    + + + + + + + +
    Sistem operasiPerangkat lunakCatatan
    Platform Linux
    • Kubernetes 1.16 atau yang lebih baru
    • kubectl
    • Helm 3.0.0 atau yang lebih baru
    • minikube (untuk Milvus mandiri)
    • Docker 19.03 atau yang lebih baru (untuk Milvus mandiri)
    Lihat Dokumen Helm untuk informasi lebih lanjut.
    + + + + + + + + + +
    Perangkat LunakVersiCatatan
    etcd3.5.0Lihat persyaratan disk tambahan.
    MinIORELEASE.2023-03-20T20-16-18Z
    Pulsar2.8.2
    +

    Persyaratan disk tambahan

    Performa disk sangat penting untuk etcd. Sangat disarankan agar Anda menggunakan SSD NVMe lokal. Respons disk yang lebih lambat dapat menyebabkan seringnya pemilihan kluster yang pada akhirnya akan menurunkan layanan etcd.

    +

    Untuk menguji apakah disk Anda memenuhi syarat, gunakan fio.

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    Idealnya, disk Anda harus mencapai lebih dari 500 IOPS dan di bawah 10 ms untuk latensi fsync persentil ke-99. Baca Dokumen etcd untuk persyaratan yang lebih terperinci.

    +

    Pertanyaan Umum

    Bagaimana cara memulai cluster K8s secara lokal untuk tujuan pengujian?

    Anda dapat menggunakan alat seperti minikube, kind, dan Kubeadm, untuk menyiapkan klaster Kubernetes secara lokal dengan cepat. Prosedur berikut ini menggunakan minikube sebagai contoh.

    +
      +
    1. Unduh minikube
    2. +
    +

    Buka halaman Memulai, periksa apakah Anda telah memenuhi persyaratan yang tercantum di bagian Apa yang Anda perlukan, klik tombol yang menggambarkan platform target Anda, dan salin perintah untuk mengunduh dan menginstal biner.

    +
      +
    1. Memulai cluster K8s menggunakan minikube
    2. +
    +
    $ minikube start
    +
    +
      +
    1. Memeriksa status klaster K8s
    2. +
    +

    Anda dapat memeriksa status klaster K8s yang terinstal menggunakan perintah berikut.

    +
    $ kubectl cluster-info
    +
    +
    +

    Pastikan Anda dapat mengakses klaster K8s melalui kubectl. Jika Anda belum menginstal kubectl secara lokal, lihat Menggunakan kubectl di dalam minikube.

    +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/home/home.json b/localization/v2.5.x/site/id/home/home.json new file mode 100644 index 000000000..2cb5e0956 --- /dev/null +++ b/localization/v2.5.x/site/id/home/home.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"","anchorList":[{"label":"Mulai","href":"Get-Started","type":2,"isActive":false},{"label":"Artikel yang direkomendasikan","href":"Recommended-articles","type":2,"isActive":false},{"label":"Apa yang baru di dokumen","href":"Whats-new-in-docs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/home/home.md b/localization/v2.5.x/site/id/home/home.md new file mode 100644 index 000000000..1b1101d2f --- /dev/null +++ b/localization/v2.5.x/site/id/home/home.md @@ -0,0 +1,122 @@ +--- +id: home.md +--- +
    +

    +Selamat datang di Milvus Docs!

    +

    +Di sini Anda akan mempelajari tentang apa itu Milvus, dan bagaimana cara menginstal, menggunakan, dan menggunakan Milvus untuk membangun aplikasi sesuai dengan kebutuhan bisnis Anda.

    +
    +
    +
    +

    Coba Managed Milvus Gratis!

    +

    Zilliz Cloud tidak merepotkan, didukung oleh Milvus dan 10x lebih cepat.

    +
    + +
    +

    Mulai

    +
    + + icon +

    Pelajari cara menginstal Milvus menggunakan Docker Compose atau Kubernetes.

    +
    +
    + + icon +

    Pelajari cara menjalankan Milvus dengan cepat dengan kode sampel.

    +
    +
    + + icon +

    + Pelajari cara membuat aplikasi pencarian kemiripan vektor dengan Milvus.

    +
    +
    + +
    +

    Apa yang baru di dokumen

    Nov 2024 - Rilis Milvus 2.5.0

    + +
    diff --git a/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.json b/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.json new file mode 100644 index 000000000..e5767e8f8 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/HydroXai/pii-masker-v1.git\n$ cd pii-masker-v1/pii-masker\n","$ pip install --upgrade pymilvus openai requests tqdm dataset\n","$ export OPENAI_API_KEY=sk-***********\n","text_lines = [\n \"Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16\",\n \"Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.\",\n \"In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.\",\n \"Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.\",\n]\n","from model import PIIMasker\n\nmasker = PIIMasker()\n","masked_results = []\nfor full_text in text_lines:\n masked_text, _ = masker.mask_pii(full_text)\n masked_results.append(masked_text)\n\nfor res in masked_results:\n print(res + \"\\n\")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(masked_results, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"What was the office address of Hiroshi's partner from Munich?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=1, # Return top 1 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say \"I don't know\".\nAI:\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus + PII Masker","anchorList":[{"label":"Bangun RAG dengan Milvus + Masker PII","href":"Build-RAG-with-Milvus-+-PII-Masker","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.md b/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.md new file mode 100644 index 000000000..fa80f115c --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/RAG_with_pii_and_milvus.md @@ -0,0 +1,242 @@ +--- +id: RAG_with_pii_and_milvus.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan PII Masker. +title: Bangun RAG dengan Milvus + Masker PII +--- +

    Bangun RAG dengan Milvus + Masker PII

    PII (Personally Identifiable Information) adalah jenis data sensitif yang dapat digunakan untuk mengidentifikasi individu.

    +

    PII Masker, yang dikembangkan oleh HydroX AI, adalah alat sumber terbuka canggih yang dirancang untuk melindungi data sensitif Anda dengan memanfaatkan model AI yang canggih. Baik saat Anda menangani data pelanggan, melakukan analisis data, atau memastikan kepatuhan terhadap peraturan privasi, PII Masker menyediakan solusi yang kuat dan terukur untuk menjaga keamanan informasi Anda.

    +

    Dalam tutorial ini, kami akan menunjukkan cara menggunakan PII Masker dengan Milvus untuk melindungi data pribadi dalam aplikasi RAG (Retrieval-Augmented Generation). Dengan menggabungkan kekuatan kemampuan penyembunyian data PII Masker dengan pengambilan data yang efisien dari Milvus, Anda dapat membuat jalur pipa yang aman dan sesuai dengan privasi untuk menangani informasi sensitif dengan penuh percaya diri. Pendekatan ini memastikan aplikasi Anda dilengkapi untuk memenuhi standar privasi dan melindungi data pengguna secara efektif.

    +

    Persiapan

    Memulai dengan PII Masker

    Ikuti panduan instalasi PII Masker untuk menginstal dependensi yang diperlukan dan mengunduh model. Berikut adalah panduan sederhana:

    +
    $ git clone https://github.com/HydroXai/pii-masker-v1.git
    +$ cd pii-masker-v1/pii-masker
    +
    +

    Unduh model darihttps://huggingface.co/hydroxai/pii_model_weight, dan ganti dengan file di: pii-masker/output_model/deberta3base_1024/

    +

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus openai requests tqdm dataset
    +
    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    $ export OPENAI_API_KEY=sk-***********
    +
    +

    Kemudian Anda dapat membuat notebook python atau jupyter untuk menjalankan kode berikut.

    +

    Menyiapkan data

    Mari kita buat beberapa baris palsu yang berisi informasi PII untuk tujuan pengujian atau demonstrasi.

    +
    text_lines = [
    +    "Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16",
    +    "Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.",
    +    "In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.",
    +    "Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.",
    +]
    +
    +

    Tutupi data dengan PIIMasker

    Mari kita inisialisasi objek PIIMasker dan memuat model.

    +
    from model import PIIMasker
    +
    +masker = PIIMasker()
    +
    +

    Kita kemudian menutupi PII dari daftar baris teks dan mencetak hasil yang disamarkan.

    +
    masked_results = []
    +for full_text in text_lines:
    +    masked_text, _ = masker.mask_pii(full_text)
    +    masked_results.append(masked_text)
    +
    +for res in masked_results:
    +    print(res + "\n")
    +
    +
    Alice [B-NAME] , a resident of Dublin Ireland attended flower festival at Hyde Park on May 15 2023 [B-PHONE_NUM] She entered the park noon using her digital passport number 23 [B-ID_NUM] [B-NAME] afternoon admiring various flowers and plants attending gardening workshop having light snack one food stalls While there she met another visitor Mr Thompson who was visiting from London They exchanged tips shared contact information : ' s address 492 [I-STREET_ADDRESS] his cell phone + [B-PHONE_NUM] [B-NAME] details home Ranch [B-STREET_ADDRESS]
    +
    +Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]
    +
    +In an online forum discussion about culinary exchanges around the world [I-STREET_ADDRESS] several participants shared their experiences [I-STREET_ADDRESS] One user Male with email 2022 [B-EMAIL] his insights He mentioned ID code 1 [B-ID_NUM] [I-PHONE_NUM] reference number L [B-ID_NUM] residing in Italy but originally from Australia provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 456 [I-STREET_ADDRESS]
    +
    +Another user joined the conversation on topic of international volunteering opportunities . Identified as Female , she used email 2023 [B-EMAIL] share her story She noted 98 [B-ID_NUM] [I-PHONE_NUM] M [B-ID_NUM] residing in Germany but originally from Brazil provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 789 [I-STREET_ADDRESS] DE 10 178
    +
    +

    Menyiapkan Model Penyematan

    Kita menginisialisasi klien OpenAI untuk menyiapkan model penyematan.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Tentukan fungsi untuk menghasilkan penyematan teks menggunakan klien OpenAI. Kami menggunakan model text-embedding-3-small sebagai contoh.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Hasilkan embedding uji dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks bertopeng, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(masked_results, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 4/4 [00:01<00:00,  2.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 4, 'ids': [0, 1, 2, 3], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari tentukan pertanyaan tentang dokumen.

    +
    question = "What was the office address of Hiroshi's partner from Munich?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil kecocokan semantik 1 teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=1,  # Return top 1 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        "Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]",
    +        0.6544462442398071
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan permintaan sistem dan pengguna untuk Model Lanage.

    +

    Catatan: Kami memberi tahu LLM jika tidak ada informasi yang berguna dalam cuplikan, cukup katakan "Saya tidak tahu".

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say "I don't know".
    +AI:
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan OpenAI ChatGPT untuk menghasilkan respons berdasarkan permintaan.

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-4o-mini",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    I don't know.
    +
    +

    Di sini kita dapat melihat, karena kita telah mengganti PII dengan topeng, LLM tidak dapat memperoleh informasi PII dalam konteks. Jadi, ia menjawab: "Saya tidak tahu." Dengan cara ini, kita dapat secara efektif melindungi privasi pengguna.

    diff --git a/localization/v2.5.x/site/id/integrations/apify_milvus_rag.json b/localization/v2.5.x/site/id/integrations/apify_milvus_rag.json new file mode 100644 index 000000000..9dd13642e --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/apify_milvus_rag.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0\n","import os\nfrom getpass import getpass\n\nos.environ[\"APIFY_API_TOKEN\"] = getpass(\"Enter YOUR APIFY_API_TOKEN\")\nos.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter YOUR OPENAI_API_KEY\")\n","os.environ[\"MILVUS_URI\"] = getpass(\"Enter YOUR MILVUS_URI\")\nos.environ[\"MILVUS_TOKEN\"] = getpass(\"Enter YOUR MILVUS_TOKEN\")\n\nMILVUS_COLLECTION_NAME = \"apify\"\n","from apify_client import ApifyClient\n\nclient = ApifyClient(os.getenv(\"APIFY_API_TOKEN\"))\n\nactor_id = \"apify/website-content-crawler\"\nrun_input = {\n \"crawlerType\": \"cheerio\",\n \"maxCrawlPages\": 10,\n \"startUrls\": [{\"url\": \"https://milvus.io/\"}, {\"url\": \"https://zilliz.com/\"}],\n}\n\nactor_call = client.actor(actor_id).call(run_input=run_input)\n","dataset_id = actor_call[\"defaultDatasetId\"]\ndataset_id\n","item = client.dataset(dataset_id).list_items(limit=1).items\nitem[0].get(\"text\")\n","milvus_integration_inputs = {\n \"milvusUri\": os.getenv(\"MILVUS_URI\"),\n \"milvusToken\": os.getenv(\"MILVUS_TOKEN\"),\n \"milvusCollectionName\": MILVUS_COLLECTION_NAME,\n \"datasetFields\": [\"text\", \"metadata.title\"],\n \"datasetId\": actor_call[\"defaultDatasetId\"],\n \"performChunking\": True,\n \"embeddingsApiKey\": os.getenv(\"OPENAI_API_KEY\"),\n \"embeddingsProvider\": \"OpenAI\",\n}\n","actor_call = client.actor(\"apify/milvus-integration\").call(\n run_input=milvus_integration_inputs\n)\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.vectorstores import Milvus\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n\nvectorstore = Milvus(\n connection_args={\n \"uri\": os.getenv(\"MILVUS_URI\"),\n \"token\": os.getenv(\"MILVUS_TOKEN\"),\n },\n embedding_function=embeddings,\n collection_name=MILVUS_COLLECTION_NAME,\n)\n\nprompt = PromptTemplate(\n input_variables=[\"context\", \"question\"],\n template=\"Use the following pieces of retrieved context to answer the question. If you don't know the answer, \"\n \"just say that you don't know. \\nQuestion: {question} \\nContext: {context} \\nAnswer:\",\n)\n\n\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n\n\nrag_chain = (\n {\n \"context\": vectorstore.as_retriever() | format_docs,\n \"question\": RunnablePassthrough(),\n }\n | prompt\n | ChatOpenAI(model=\"gpt-4o-mini\")\n | StrOutputParser()\n)\n","question = \"What is Milvus database?\"\n\nrag_chain.invoke(question)\n"],"headingContent":"Retrieval-Augmented Generation: Crawling Websites with Apify and Saving Data to Milvus for Question Answering","anchorList":[{"label":"Pengambilan-Penambahan Generasi: Merayapi Situs Web dengan Apify dan Menyimpan Data ke Milvus untuk Menjawab Pertanyaan","href":"Retrieval-Augmented-Generation-Crawling-Websites-with-Apify-and-Saving-Data-to-Milvus-for-Question-Answering","type":1,"isActive":false},{"label":"Sebelum memulai","href":"Before-you-begin","type":1,"isActive":false},{"label":"Menginstal dependensi","href":"Install-dependencies","type":2,"isActive":false},{"label":"Menyiapkan kunci Apify dan Open API","href":"Set-up-Apify-and-Open-API-keys","type":2,"isActive":false},{"label":"Menyiapkan URI, token, dan nama koleksi Milvus/Zilliz","href":"Set-up-MilvusZilliz-URI-token-and-collection-name","type":2,"isActive":false},{"label":"Menggunakan Perayap Konten Situs Web untuk mengikis konten teks dari Milvus.io","href":"Using-the-Website-Content-Crawler-to-scrape-text-content-from-Milvusio","type":2,"isActive":false},{"label":"Pengambilan dan pipeline generatif LLM","href":"Retrieval-and-LLM-generative-pipeline","type":1,"isActive":false},{"label":"Kesimpulan","href":"Conclusion","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/apify_milvus_rag.md b/localization/v2.5.x/site/id/integrations/apify_milvus_rag.md new file mode 100644 index 000000000..f0c0bd839 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/apify_milvus_rag.md @@ -0,0 +1,267 @@ +--- +id: apify_milvus_rag.md +summary: >- + Tutorial ini menjelaskan cara merayapi situs web menggunakan Perayap Konten + Situs Web Apify dan menyimpan data ke dalam basis data vektor Milvus / Zilliz + untuk kemudian digunakan untuk menjawab pertanyaan. +title: >- + Pengambilan-Penambahan Generasi: Merayapi Situs Web dengan Apify dan Menyimpan + Data ke Milvus untuk Menjawab Pertanyaan +--- +

    Pengambilan-Penambahan Generasi: Merayapi Situs Web dengan Apify dan Menyimpan Data ke Milvus untuk Menjawab Pertanyaan

    Open In Colab

    +

    Tutorial ini menjelaskan cara merayapi situs web menggunakan Website Content Crawler dari Apify dan menyimpan datanya ke dalam basis data vektor Milvus/Zilliz untuk kemudian digunakan untuk menjawab pertanyaan.

    +

    Apify adalah platform web scraping dan ekstraksi data yang menawarkan pasar aplikasi dengan lebih dari dua ribu alat cloud siap pakai, yang dikenal sebagai Actors. Alat-alat ini ideal untuk kasus-kasus penggunaan seperti mengekstraksi data terstruktur dari situs web e-commerce, media sosial, mesin pencari, peta online, dan banyak lagi.

    +

    Misalnya, Aktor Perayap Konten Situs Web dapat merayapi situs web secara mendalam, membersihkan HTML-nya dengan menghapus modal cookie, footer, atau navigasi, dan kemudian mengubah HTML tersebut menjadi Penurunan Harga.

    +

    Integrasi Apify untuk Milvus/Zilliz memudahkan untuk mengunggah data dari web ke database vektor.

    +

    Sebelum memulai

    Sebelum menjalankan buku catatan ini, pastikan Anda memiliki yang berikut ini:

    + +

    Menginstal dependensi

    $ pip install --upgrade --quiet  apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
    +
    +

    Menyiapkan kunci Apify dan Open API

    import os
    +from getpass import getpass
    +
    +os.environ["APIFY_API_TOKEN"] = getpass("Enter YOUR APIFY_API_TOKEN")
    +os.environ["OPENAI_API_KEY"] = getpass("Enter YOUR OPENAI_API_KEY")
    +
    +
    Enter YOUR APIFY_API_TOKEN··········
    +Enter YOUR OPENAI_API_KEY··········
    +
    +

    Menyiapkan URI, token, dan nama koleksi Milvus/Zilliz

    Anda memerlukan URI dan Token Milvus/Zilliz Anda untuk menyiapkan klien.

    +
      +
    • Jika Anda telah menempatkan server Milvus sendiri di Docker atau Kubernetes, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama pengguna Anda>:<kata sandi Anda>" sebagai token, jika tidak, biarkan token sebagai string kosong.
    • +
    • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
    • +
    +

    Perhatikan bahwa koleksi tidak perlu ada sebelumnya. Koleksi ini akan secara otomatis dibuat ketika data diunggah ke database.

    +
    os.environ["MILVUS_URI"] = getpass("Enter YOUR MILVUS_URI")
    +os.environ["MILVUS_TOKEN"] = getpass("Enter YOUR MILVUS_TOKEN")
    +
    +MILVUS_COLLECTION_NAME = "apify"
    +
    +
    Enter YOUR MILVUS_URI··········
    +Enter YOUR MILVUS_TOKEN··········
    +
    +

    Menggunakan Perayap Konten Situs Web untuk mengikis konten teks dari Milvus.io

    Selanjutnya, kita akan menggunakan Website Content Crawler dengan Apify Python SDK. Kita akan mulai dengan mendefinisikan actor_id dan run_input, lalu menentukan informasi yang akan disimpan ke database vektor.

    +

    actor_id="apify/website-content-crawler" adalah pengenal untuk Website Content Crawler. Perilaku perayap dapat dikontrol sepenuhnya melalui parameter run_input (lihat halaman input untuk lebih jelasnya). Dalam contoh ini, kita akan merayapi dokumentasi Milvus, yang tidak memerlukan rendering JavaScript. Oleh karena itu, kita menetapkan crawlerType=cheerio, mendefinisikan startUrls, dan membatasi jumlah halaman yang dirayapi dengan menetapkan maxCrawlPages=10.

    +
    from apify_client import ApifyClient
    +
    +client = ApifyClient(os.getenv("APIFY_API_TOKEN"))
    +
    +actor_id = "apify/website-content-crawler"
    +run_input = {
    +    "crawlerType": "cheerio",
    +    "maxCrawlPages": 10,
    +    "startUrls": [{"url": "https://milvus.io/"}, {"url": "https://zilliz.com/"}],
    +}
    +
    +actor_call = client.actor(actor_id).call(run_input=run_input)
    +
    +

    Perayap Konten Situs Web akan merayapi situs secara menyeluruh hingga mencapai batas yang telah ditentukan yang ditetapkan oleh maxCrawlPages. Data yang di-crawl akan disimpan di Dataset pada platform Apify. Untuk mengakses dan menganalisis data ini, Anda dapat menggunakan plugin defaultDatasetId

    +
    dataset_id = actor_call["defaultDatasetId"]
    +dataset_id
    +
    +
    'P9dLFfeJAljlePWnz'
    +
    +

    Kode berikut ini mengambil data yang di-scrape dari Apify Dataset dan menampilkan situs web yang di-scrape pertama kali

    +
    item = client.dataset(dataset_id).list_items(limit=1).items
    +item[0].get("text")
    +
    +
    'The High-Performance Vector Database Built for Scale\nStart running Milvus in seconds\nfrom pymilvus import MilvusClient client = MilvusClient("milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=5 )\nDeployment Options to Match Your Unique Journey\nMilvus Lite\nLightweight, easy to start\nVectorDB-as-a-library runs in notebooks/ laptops with a pip install\nBest for learning and prototyping\nMilvus Standalone\nRobust, single-machine deployment\nComplete vector database for production or testing\nIdeal for datasets with up to millions of vectors\nMilvus Distributed\nScalable, enterprise-grade solution\nHighly reliable and distributed vector database with comprehensive toolkit\nScale horizontally to handle billions of vectors\nZilliz Cloud\nFully managed with minimal operations\nAvailable in both serverless and dedicated cluster\nSaaS and BYOC options for different security and compliance requirements\nTry Free\nLearn more about different Milvus deployment models\nLoved by GenAI developers\nBased on our research, Milvus was selected as the vector database of choice (over Chroma and Pinecone). Milvus is an open-source vector database designed specifically for similarity search on massive datasets of high-dimensional vectors.\nWith its focus on efficient vector similarity search, Milvus empowers you to build robust and scalable image retrieval systems. Whether you’re managing a personal photo library or developing a commercial image search application, Milvus offers a powerful foundation for unlocking the hidden potential within your image collections.\nBhargav Mankad\nSenior Solution Architect\nMilvus is a powerful vector database tailored for processing and searching extensive vector data. It stands out for its high performance and scalability, rendering it perfect for machine learning, deep learning, similarity search tasks, and recommendation systems.\nIgor Gorbenko\nBig Data Architect\nStart building your GenAI app now\nGuided with notebooks developed by us and our community\nRAG\nTry Now\nImage Search\nTry Now\nMultimodal Search\nTry Now\nUnstructured Data Meetups\nJoin a Community of Passionate Developers and Engineers Dedicated to Gen AI.\nRSVP now\nWhy Developers Prefer Milvus for Vector Databases\nScale as needed\nElastic scaling to tens of billions of vectors with distributed architecture.\nBlazing fast\nRetrieve data quickly and accurately with Global Index, regardless of scale.\nReusable Code\nWrite once, and deploy with one line of code into the production environment.\nFeature-rich\nMetadata filtering, hybrid search, multi-vector and more.\nWant to learn more about Milvus? View our documentation\nJoin the community of developers building GenAI apps with Milvus, now with over 25 million downloads\nGet Milvus Updates\nSubscribe to get updates on the latest Milvus releases, tutorials and training from Zilliz, the creator and key maintainer of Milvus.'
    +
    +

    Untuk mengunggah data ke dalam basis data Milvus, kita menggunakan integrasi Apify Milvus. Pertama, kita perlu mengatur parameter untuk database Milvus. Selanjutnya, kita pilih field (datasetFields) yang ingin kita simpan di dalam database. Pada contoh di bawah ini, kita menyimpan field text dan metadata.title.

    +
    milvus_integration_inputs = {
    +    "milvusUri": os.getenv("MILVUS_URI"),
    +    "milvusToken": os.getenv("MILVUS_TOKEN"),
    +    "milvusCollectionName": MILVUS_COLLECTION_NAME,
    +    "datasetFields": ["text", "metadata.title"],
    +    "datasetId": actor_call["defaultDatasetId"],
    +    "performChunking": True,
    +    "embeddingsApiKey": os.getenv("OPENAI_API_KEY"),
    +    "embeddingsProvider": "OpenAI",
    +}
    +
    +

    Sekarang, kita akan memanggil apify/milvus-integration untuk menyimpan data

    +
    actor_call = client.actor("apify/milvus-integration").call(
    +    run_input=milvus_integration_inputs
    +)
    +
    +

    Semua data yang telah dikikis sekarang tersimpan di dalam basis data Milvus dan siap untuk diambil dan menjawab pertanyaan

    +

    Pengambilan dan pipeline generatif LLM

    Selanjutnya, kita akan mendefinisikan pipeline yang ditambahi pengambilan menggunakan Langchain. Pipeline ini bekerja dalam dua tahap:

    +
      +
    • Vectorstore (Milvus): Langchain mengambil dokumen yang relevan dari Milvus dengan mencocokkan sematan kueri dengan sematan dokumen yang tersimpan.
    • +
    • Tanggapan LLM: Dokumen yang diambil memberikan konteks untuk LLM (misalnya, GPT-4) untuk menghasilkan jawaban yang tepat.
    • +
    +

    Untuk detail lebih lanjut tentang rantai RAG, silakan lihat dokumentasi Langchain.

    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.vectorstores import Milvus
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +vectorstore = Milvus(
    +    connection_args={
    +        "uri": os.getenv("MILVUS_URI"),
    +        "token": os.getenv("MILVUS_TOKEN"),
    +    },
    +    embedding_function=embeddings,
    +    collection_name=MILVUS_COLLECTION_NAME,
    +)
    +
    +prompt = PromptTemplate(
    +    input_variables=["context", "question"],
    +    template="Use the following pieces of retrieved context to answer the question. If you don't know the answer, "
    +    "just say that you don't know. \nQuestion: {question} \nContext: {context} \nAnswer:",
    +)
    +
    +
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +
    +rag_chain = (
    +    {
    +        "context": vectorstore.as_retriever() | format_docs,
    +        "question": RunnablePassthrough(),
    +    }
    +    | prompt
    +    | ChatOpenAI(model="gpt-4o-mini")
    +    | StrOutputParser()
    +)
    +
    +

    Setelah kita memiliki data di dalam basis data, kita dapat mulai mengajukan pertanyaan

    +
    +
    question = "What is Milvus database?"
    +
    +rag_chain.invoke(question)
    +
    +
    'Milvus is an open-source vector database specifically designed for billion-scale vector similarity search. It facilitates efficient management and querying of vector data, which is essential for applications involving unstructured data, such as AI and machine learning. Milvus allows users to perform operations like CRUD (Create, Read, Update, Delete) and vector searches, making it a powerful tool for handling large datasets.'
    +
    +

    Kesimpulan

    Dalam tutorial ini, kami mendemonstrasikan cara merayapi konten situs web menggunakan Apify, menyimpan data dalam basis data vektor Milvus, dan menggunakan pipeline yang telah ditambahi pengambilan untuk melakukan tugas menjawab pertanyaan. Dengan menggabungkan kemampuan web scraping Apify dengan Milvus/Zilliz untuk penyimpanan vektor dan Langchain untuk model bahasa, Anda dapat membangun sistem pencarian informasi yang sangat efektif.

    +

    Untuk meningkatkan pengumpulan dan pembaruan data dalam database, integrasi Apify menawarkan pembaruan inkremental, yang hanya memperbarui data baru atau data yang dimodifikasi berdasarkan checksum. Selain itu, integrasi ini dapat secara otomatis menghapus data usang yang belum dirayapi dalam waktu tertentu. Fitur-fitur ini membantu menjaga basis data vektor Anda tetap dioptimalkan dan memastikan bahwa pipeline yang telah ditingkatkan untuk pengambilan data Anda tetap efisien dan mutakhir dengan upaya manual yang minimal.

    +

    Untuk detail lebih lanjut tentang integrasi Apify-Milvus, silakan lihat dokumentasi Apify Milvus dan file README integrasi.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.json new file mode 100644 index 000000000..9c70c0d28 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus git+https://github.com/topoteretes/cognee.git\n","import os\n\nimport cognee\n\ncognee.config.set_llm_api_key(\"YOUR_OPENAI_API_KEY\")\n\n\nos.environ[\"VECTOR_DB_PROVIDER\"] = \"milvus\"\nos.environ[\"VECTOR_DB_URL\"] = \"./milvus.db\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","await cognee.add(data=text_lines, dataset_name=\"milvus_faq\")\nawait cognee.cognify()\n\n# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\\n\\nYes. When ...\n# ...\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)\n\nprint(search_results[0])\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)\n","def format_and_print(data):\n print(\"ID:\", data[\"id\"])\n print(\"\\nText:\\n\")\n paragraphs = data[\"text\"].split(\"\\n\\n\")\n for paragraph in paragraphs:\n print(paragraph.strip())\n print()\n\n\nformat_and_print(search_results[0])\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","# We only use one line of text as the dataset, which simplifies the output later\ntext = \"\"\"\n Natural language processing (NLP) is an interdisciplinary\n subfield of computer science and information retrieval.\n \"\"\"\n\nawait cognee.add(text)\nawait cognee.cognify()\n","query_text = \"Tell me about NLP\"\nsearch_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)\n\nfor result_text in search_results:\n print(result_text)\n\n# Example output:\n# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})\n# (...)\n#\n# It represents nodes and relationships in the knowledge graph:\n# - The first element is the source node (e.g., 'natural language processing').\n# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').\n# - The third element is the target node (e.g., 'computer science').\n"],"headingContent":"","anchorList":[{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.md new file mode 100644 index 000000000..0e69df303 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_cognee.md @@ -0,0 +1,159 @@ +--- +id: build_RAG_with_milvus_and_cognee.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan Cognee. +title: Membangun RAG dengan Milvus dan Cognee +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Membangun RAG dengan Milvus dan Cognee

    Cognee adalah platform khusus pengembang yang menyederhanakan pengembangan aplikasi AI dengan pipeline ECL (Extract, Cognify, Load) modular yang dapat diskalakan. Dengan mengintegrasikan secara mulus dengan Milvus, Cognee memungkinkan koneksi dan pengambilan percakapan, dokumen, dan transkripsi yang efisien, mengurangi halusinasi dan mengoptimalkan biaya operasional.

    +

    Dengan dukungan yang kuat untuk penyimpanan vektor seperti Milvus, basis data grafik, dan LLM, Cognee menyediakan kerangka kerja yang fleksibel dan dapat disesuaikan untuk membangun sistem retrieval-augmented generation (RAG). Arsitekturnya yang siap produksi memastikan peningkatan akurasi dan efisiensi untuk aplikasi yang didukung AI.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus dan Cognee.

    +
    $ pip install pymilvus git+https://github.com/topoteretes/cognee.git
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Secara default, ia menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api, dan mengaturnya dalam fungsi konfigurasi set_llm_api_key().

    +

    Untuk mengkonfigurasi Milvus sebagai basis data vektor, atur VECTOR_DB_PROVIDER ke milvus dan tentukan VECTOR_DB_URL dan VECTOR_DB_KEY. Karena kita menggunakan Milvus Lite untuk menyimpan data pada demo ini, maka hanya VECTOR_DB_URL yang perlu disediakan.

    +
    import os
    +
    +import cognee
    +
    +cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
    +
    +
    +os.environ["VECTOR_DB_PROVIDER"] = "milvus"
    +os.environ["VECTOR_DB_URL"] = "./milvus.db"
    +
    +
    +

    Sedangkan untuk variabel lingkungan VECTOR_DB_URL dan VECTOR_DB_KEY:

    +
      +
    • Mengatur VECTOR_DB_URL sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai VECTOR_DB_URL.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan VECTOR_DB_URL dan VECTOR_DB_KEY, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +

    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Membangun RAG

    Mengatur Ulang Data Cognee

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    Dengan catatan yang bersih, kita sekarang dapat menambahkan kumpulan data kita dan memprosesnya menjadi grafik pengetahuan.

    +

    Menambahkan Data dan Mengenali

    await cognee.add(data=text_lines, dataset_name="milvus_faq")
    +await cognee.cognify()
    +
    +# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
    +# ...
    +
    +

    Metode add memuat set data (Milvus FAQ) ke dalam Cognee dan metode cognify memproses data untuk mengekstrak entitas, hubungan, dan rangkuman, membangun grafik pengetahuan.

    +

    Mengajukan Pertanyaan untuk Rangkuman

    Setelah data diproses, mari kita melakukan kueri pada grafik pengetahuan.

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
    +
    +print(search_results[0])
    +
    +
    {'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
    +
    +

    Kueri ini mencari ringkasan yang terkait dengan teks kueri, dan kandidat yang paling terkait akan dicetak.

    +

    Mengajukan Kueri untuk Potongan

    Ringkasan menawarkan wawasan tingkat tinggi, tetapi untuk detail yang lebih terperinci, kita dapat melakukan kueri untuk potongan data tertentu secara langsung dari kumpulan data yang telah diproses. Potongan-potongan ini berasal dari data asli yang ditambahkan dan dianalisis selama pembuatan grafik pengetahuan.

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
    +
    +

    Mari kita format dan tampilkan agar lebih mudah dibaca!

    +
    def format_and_print(data):
    +    print("ID:", data["id"])
    +    print("\nText:\n")
    +    paragraphs = data["text"].split("\n\n")
    +    for paragraph in paragraphs:
    +        print(paragraph.strip())
    +        print()
    +
    +
    +format_and_print(search_results[0])
    +
    +
    ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
    +
    +Text:
    +
    +Where does Milvus store data?
    +
    +Milvus deals with two types of data, inserted data and metadata.
    +
    +Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
    +
    +Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
    +
    +###
    +
    +

    Pada langkah sebelumnya, kami menanyakan dataset FAQ Milvus untuk ringkasan dan potongan data tertentu. Meskipun hal ini memberikan wawasan yang rinci dan informasi granular, dataset ini sangat besar, sehingga sulit untuk memvisualisasikan ketergantungan dengan jelas di dalam grafik pengetahuan.

    +

    Untuk mengatasi hal ini, kita akan mengatur ulang lingkungan Cognee dan bekerja dengan set data yang lebih kecil dan lebih terfokus. Hal ini akan memungkinkan kita untuk menunjukkan hubungan dan ketergantungan yang diekstrak selama proses cognify dengan lebih baik. Dengan menyederhanakan data, kita dapat dengan jelas melihat bagaimana Cognee mengatur dan menyusun informasi dalam grafik pengetahuan.

    +

    Mengatur Ulang Cognee

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    Menambahkan Dataset Terfokus

    Di sini, kumpulan data yang lebih kecil dengan hanya satu baris teks ditambahkan dan diproses untuk memastikan grafik pengetahuan yang terfokus dan mudah diinterpretasikan.

    +
    # We only use one line of text as the dataset, which simplifies the output later
    +text = """
    +    Natural language processing (NLP) is an interdisciplinary
    +    subfield of computer science and information retrieval.
    +    """
    +
    +await cognee.add(text)
    +await cognee.cognify()
    +
    +

    Mengajukan Pertanyaan untuk Wawasan

    Dengan berfokus pada kumpulan data yang lebih kecil ini, kita sekarang dapat dengan jelas menganalisis hubungan dan struktur di dalam knowledge graph.

    +
    query_text = "Tell me about NLP"
    +search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
    +
    +for result_text in search_results:
    +    print(result_text)
    +
    +# Example output:
    +# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
    +# (...)
    +#
    +# It represents nodes and relationships in the knowledge graph:
    +# - The first element is the source node (e.g., 'natural language processing').
    +# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
    +# - The third element is the target node (e.g., 'computer science').
    +
    +

    Output ini mewakili hasil dari kueri grafik pengetahuan, menampilkan entitas (node) dan hubungannya (edge) yang diekstrak dari dataset yang diproses. Setiap tupel mencakup entitas sumber, jenis hubungan, dan entitas target, bersama dengan metadata seperti ID unik, deskripsi, dan stempel waktu. Grafik menyoroti konsep-konsep utama dan hubungan semantiknya, memberikan pemahaman yang terstruktur tentang kumpulan data.

    +

    Selamat, Anda telah mempelajari penggunaan dasar cognee dengan Milvus. Jika Anda ingin mengetahui penggunaan cognee yang lebih lanjut, silakan lihat halaman resminya.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.json new file mode 100644 index 000000000..699766589 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"DEEPSEEK_API_KEY\"] = \"***********\"\n","! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\ndeepseek_client = OpenAI(\n api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n base_url=\"https://api.deepseek.com\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = deepseek_client.chat.completions.create(\n model=\"deepseek-chat\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and DeepSeek","anchorList":[{"label":"Membangun RAG dengan Milvus dan DeepSeek","href":"Build-RAG-with-Milvus-and-DeepSeek","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.md new file mode 100644 index 000000000..1466d970c --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_deepseek.md @@ -0,0 +1,247 @@ +--- +id: build_RAG_with_milvus_and_deepseek.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + Retrieval-Augmented Generation (RAG) menggunakan Milvus dan DeepSeek. +title: Membangun RAG dengan Milvus dan DeepSeek +--- +

    Membangun RAG dengan Milvus dan DeepSeek

    Open In Colab +GitHub Repository

    +

    DeepSeek memungkinkan pengembang untuk membangun dan menskalakan aplikasi AI dengan model bahasa berkinerja tinggi. Ia menawarkan inferensi yang efisien, API yang fleksibel, dan arsitektur Mixture-of-Experts (MoE) yang canggih untuk tugas penalaran dan pengambilan yang kuat.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline Retrieval-Augmented Generation (RAG) menggunakan Milvus dan DeepSeek.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    ! pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    DeepSeek mengaktifkan API gaya OpenAI. Anda dapat masuk ke situs web resminya dan menyiapkan kunci api DEEPSEEK_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["DEEPSEEK_API_KEY"] = "***********"
    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    ! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "#" untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Mempersiapkan LLM dan Model Penyematan

    DeepSeek mengaktifkan API gaya OpenAI, dan Anda dapat menggunakan API yang sama dengan sedikit penyesuaian untuk memanggil LLM.

    +
    from openai import OpenAI
    +
    +deepseek_client = OpenAI(
    +    api_key=os.environ["DEEPSEEK_API_KEY"],
    +    base_url="https://api.deepseek.com",
    +)
    +
    +

    Tentukan model penyematan untuk menghasilkan penyematan teks menggunakan milvus_model. Kami menggunakan model DefaultEmbeddingFunction sebagai contoh, yang merupakan model penyematan yang sudah terlatih dan ringan.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    Buatlah embedding uji coba dan cetak dimensi dan beberapa elemen pertamanya.

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings:   0%|          | 0/72 [00:00<?, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 246522.36it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan model deepseek-chat yang disediakan oleh DeepSeek untuk menghasilkan respons berdasarkan petunjuk.

    +
    response = deepseek_client.chat.completions.create(
    +    model="deepseek-chat",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +1. **Inserted Data**: This includes vector data, scalar data, and collection-specific schema. The inserted data is stored in persistent storage as incremental logs. Milvus supports various object storage backends for this purpose, such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +2. **Metadata**: Metadata is generated within Milvus and is specific to each Milvus module. This metadata is stored in etcd, a distributed key-value store.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and Milvus returns success at this stage. The data is then written to persistent storage as incremental logs by the data node. If the `flush()` function is called, the data node is forced to write all data in the message queue to persistent storage immediately.
    +
    +

    Bagus! Kita telah berhasil membangun pipeline RAG dengan Milvus dan DeepSeek.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.json new file mode 100644 index 000000000..20539bae7 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"FIREWORKS_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nfireworks_client = OpenAI(\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n base_url=\"https://api.fireworks.ai/inference/v1\",\n)\n","def emb_text(text):\n return (\n fireworks_client.embeddings.create(\n input=text, model=\"nomic-ai/nomic-embed-text-v1.5\"\n )\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = fireworks_client.chat.completions.create(\n model=\"accounts/fireworks/models/llama-v3p1-405b-instruct\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Fireworks AI","anchorList":[{"label":"Membangun RAG dengan Milvus dan Fireworks AI","href":"Build-RAG-with-Milvus-and-Fireworks-AI","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.md new file mode 100644 index 000000000..eee47aeac --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_fireworks.md @@ -0,0 +1,248 @@ +--- +id: build_RAG_with_milvus_and_fireworks.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan Fireworks AI. +title: Membangun RAG dengan Milvus dan Fireworks AI +--- +

    Membangun RAG dengan Milvus dan Fireworks AI

    +Open In Colab + + +GitHub Repository +

    +

    FireworksAI adalah platform inferensi AI generatif yang menawarkan kecepatan dan kesiapan produksi yang terdepan di industri untuk menjalankan dan menyesuaikan model. Fireworks AI menyediakan berbagai layanan AI generatif, termasuk model tanpa server, penerapan sesuai permintaan, dan kemampuan penyempurnaan. Menawarkan lingkungan yang komprehensif untuk menerapkan berbagai model AI, termasuk model bahasa besar (LLM) dan model penyematan. Fireworks AI menggabungkan berbagai model, sehingga pengguna dapat dengan mudah mengakses dan memanfaatkan sumber daya ini tanpa perlu pengaturan infrastruktur yang rumit.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus dan Fireworks AI.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Fireworks AI mengaktifkan API gaya OpenAI. Anda dapat masuk ke situs web resminya dan menyiapkan kunci api FIREWORKS_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["FIREWORKS_API_KEY"] = "***********"
    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "#" untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Mempersiapkan LLM dan Model Penyematan

    Kami menginisialisasi klien untuk menyiapkan LLM dan model penyematan. Fireworks AI mengaktifkan API gaya OpenAI, dan Anda dapat menggunakan API yang sama dengan sedikit penyesuaian untuk memanggil model penyematan dan LLM.

    +
    from openai import OpenAI
    +
    +fireworks_client = OpenAI(
    +    api_key=os.environ["FIREWORKS_API_KEY"],
    +    base_url="https://api.fireworks.ai/inference/v1",
    +)
    +
    +

    Tentukan fungsi untuk menghasilkan penyematan teks menggunakan klien. Kami menggunakan model nomic-ai/nomic-embed-text-v1.5 sebagai contoh.

    +
    def emb_text(text):
    +    return (
    +        fireworks_client.embeddings.create(
    +            input=text, model="nomic-ai/nomic-embed-text-v1.5"
    +        )
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Buatlah sebuah embedding uji dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[0.04815673828125, 0.0261993408203125, -0.1749267578125, -0.03131103515625, 0.068115234375, -0.00621795654296875, 0.03955078125, -0.0210723876953125, 0.039703369140625, -0.0286102294921875]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:28<00:00,  2.51it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8334928750991821
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.746377170085907
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7328270673751831
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan model llama-v3p1-405b-instruct yang disediakan oleh Fireworks untuk menghasilkan respons berdasarkan prompt.

    +
    response = fireworks_client.chat.completions.create(
    +    model="accounts/fireworks/models/llama-v3p1-405b-instruct",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    According to the provided context, Milvus stores data in two ways:
    +
    +1. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. This can be done using multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +2. Metadata, which are generated within Milvus, are stored in etcd, with each Milvus module having its own metadata.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and then written to persistent storage as incremental logs by the data node. The `flush()` function can be used to force the data node to write all data in the message queue to persistent storage immediately.
    +
    +

    Bagus! Kita telah berhasil membangun pipeline RAG dengan Milvus dan Fireworks AI.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.json new file mode 100644 index 000000000..b7fdf766e --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus google-generativeai requests tqdm\n","import os\n\nos.environ[\"GEMINI_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","import google.generativeai as genai\n\ngenai.configure(api_key=os.environ[\"GEMINI_API_KEY\"])\n\ngemini_model = genai.GenerativeModel(\"gemini-1.5-flash\")\n\nresponse = gemini_model.generate_content(\"who are you\")\nprint(response.text)\n","test_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=[\"This is a test1\", \"This is a test2\"]\n)[\"embedding\"]\n\nembedding_dim = len(test_embeddings[0])\nprint(embedding_dim)\nprint(test_embeddings[0][:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=text_lines\n)[\"embedding\"]\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","question_embedding = genai.embed_content(\n model=\"models/text-embedding-004\", content=question\n)[\"embedding\"]\n\nsearch_res = milvus_client.search(\n collection_name=collection_name,\n data=[question_embedding],\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","gemini_model = genai.GenerativeModel(\n \"gemini-1.5-flash\", system_instruction=SYSTEM_PROMPT\n)\nresponse = gemini_model.generate_content(USER_PROMPT)\nprint(response.text)\n"],"headingContent":"Build RAG with Milvus and Gemini","anchorList":[{"label":"Membangun RAG dengan Milvus dan Gemini","href":"Build-RAG-with-Milvus-and-Gemini","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Muat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.md new file mode 100644 index 000000000..80cea9d0b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_gemini.md @@ -0,0 +1,247 @@ +--- +id: build_RAG_with_milvus_and_gemini.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan Gemini. Kita akan + menggunakan model Gemini untuk menghasilkan teks berdasarkan kueri yang + diberikan. Kita juga akan menggunakan Milvus untuk menyimpan dan mengambil + teks yang dihasilkan. +title: Membangun RAG dengan Milvus dan Gemini +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Membangun RAG dengan Milvus dan Gemini

    API Gemini dan Google AI Studio membantu Anda mulai bekerja dengan model-model terbaru Google dan mengubah ide Anda menjadi aplikasi yang berskala besar. Gemini menyediakan akses ke model bahasa yang kuat seperti Gemini-1.5-Flash, Gemini-1.5-Flash-8B, dan Gemini-1.5-Pro untuk tugas-tugas seperti pembuatan teks, pemrosesan dokumen, visi, analisis audio, dan banyak lagi. API memungkinkan Anda untuk memasukkan konteks yang panjang dengan jutaan token, menyempurnakan model untuk tugas-tugas tertentu, menghasilkan output terstruktur seperti JSON, dan meningkatkan kemampuan seperti pengambilan semantik dan eksekusi kode.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus dan Gemini. Kita akan menggunakan model Gemini untuk menghasilkan teks berdasarkan kueri yang diberikan. Kita juga akan menggunakan Milvus untuk menyimpan dan mengambil teks yang dihasilkan.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus google-generativeai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Anda harus masuk terlebih dahulu ke platform Google AI Studio dan menyiapkan kunci api GEMINI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["GEMINI_API_KEY"] = "***********"
    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Menyiapkan LLM dan Model Penyematan

    Kami menggunakan gemini-1.5-flash sebagai LLM, dan text-embedding-004 sebagai model penyematan.

    +

    Mari kita coba membuat respons pengujian dari LLM:

    +
    import google.generativeai as genai
    +
    +genai.configure(api_key=os.environ["GEMINI_API_KEY"])
    +
    +gemini_model = genai.GenerativeModel("gemini-1.5-flash")
    +
    +response = gemini_model.generate_content("who are you")
    +print(response.text)
    +
    +
    I am a large language model, trained by Google.  I am an AI and don't have a personal identity or consciousness.  My purpose is to process information and respond to a wide range of prompts and questions in a helpful and informative way.
    +
    +

    Buatlah sebuah embedding tes dan cetak dimensi dan beberapa elemen pertamanya.

    +
    test_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=["This is a test1", "This is a test2"]
    +)["embedding"]
    +
    +embedding_dim = len(test_embeddings[0])
    +print(embedding_dim)
    +print(test_embeddings[0][:10])
    +
    +
    768
    +[0.013588584, -0.004361838, -0.08481652, -0.039724775, 0.04723794, -0.0051557426, 0.026071774, 0.045514572, -0.016867816, 0.039378334]
    +
    +

    Muat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=text_lines
    +)["embedding"]
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 468201.38it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    question_embedding = genai.embed_content(
    +    model="models/text-embedding-004", content=question
    +)["embedding"]
    +
    +search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[question_embedding],
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8048275113105774
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7574886679649353
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7453608512878418
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan Gemini untuk menghasilkan respons berdasarkan prompt.

    +
    gemini_model = genai.GenerativeModel(
    +    "gemini-1.5-flash", system_instruction=SYSTEM_PROMPT
    +)
    +response = gemini_model.generate_content(USER_PROMPT)
    +print(response.text)
    +
    +
    Milvus stores data in two ways:  Inserted data (vector data, scalar data, and collection-specific schema) is stored as an incremental log in persistent storage using object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.  Metadata, generated by each Milvus module, is stored in etcd.
    +
    +

    Bagus! Kita telah berhasil membangun sebuah pipeline RAG dengan Milvus dan Gemini.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.json new file mode 100644 index 000000000..61ea406f3 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"LEPTONAI_TOKEN\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nlepton_client = OpenAI(\n api_key=os.environ[\"LEPTONAI_TOKEN\"],\n base_url=\"https://mistral-7b.lepton.run/api/v1/\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = lepton_client.chat.completions.create(\n model=\"mistral-7b\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Lepton AI","anchorList":[{"label":"Membangun RAG dengan Milvus dan Lepton AI","href":"Build-RAG-with-Milvus-and-Lepton-AI","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.md new file mode 100644 index 000000000..9f1880baa --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_lepton.md @@ -0,0 +1,243 @@ +--- +id: build_RAG_with_milvus_and_lepton.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan Lepton AI. +title: Membangun RAG dengan Milvus dan Lepton AI +--- +

    Membangun RAG dengan Milvus dan Lepton AI

    +Open In Colab + + +GitHub Repository +

    +

    Lepton AI memungkinkan pengembang dan perusahaan menjalankan aplikasi AI secara efisien dalam hitungan menit, dan dalam skala siap produksi. Lepton AI memungkinkan Anda membangun model dengan cara asli Python, men-debug dan menguji model secara lokal, menerapkannya ke cloud dengan satu perintah, dan menggunakan model dalam aplikasi apa pun dengan API yang sederhana dan fleksibel. Ini menyediakan lingkungan yang komprehensif untuk menerapkan berbagai model AI, termasuk model bahasa besar (LLM) dan model difusi, tanpa perlu pengaturan infrastruktur yang ekstensif.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus dan Lepton AI.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Lepton mengaktifkan API gaya OpenAI. Anda dapat masuk ke situs web resminya dan menyiapkan kunci api LEPTONAI_TOKEN sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["LEPTONAI_TOKEN"] = "***********"
    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "#" untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Menyiapkan LLM dan Model Penyematan

    Lepton mengaktifkan API gaya OpenAI, dan Anda dapat menggunakan API yang sama dengan sedikit penyesuaian untuk memanggil LLM.

    +
    from openai import OpenAI
    +
    +lepton_client = OpenAI(
    +    api_key=os.environ["LEPTONAI_TOKEN"],
    +    base_url="https://mistral-7b.lepton.run/api/v1/",
    +)
    +
    +

    Tentukan model penyematan untuk menghasilkan penyematan teks menggunakan milvus_model. Kami menggunakan model DefaultEmbeddingFunction sebagai contoh, yang merupakan model penyematan yang sudah terlatih dan ringan.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    Buatlah embedding uji coba dan cetak dimensi dan beberapa elemen pertamanya.

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 1090216.20it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan model mistral-7b yang disediakan oleh Lepton AI untuk menghasilkan respons berdasarkan prompt.

    +
    response = lepton_client.chat.completions.create(
    +    model="mistral-7b",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Inserted data in Milvus, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and stored in etcd.
    +
    +

    Bagus! Kita telah berhasil membangun pipeline RAG dengan Milvus dan Lepton AI.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.json new file mode 100644 index 000000000..29a6262c0 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus ollama\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","! ollama pull mxbai-embed-large\n","! ollama pull llama3.2\n","import ollama\n\n\ndef emb_text(text):\n response = ollama.embeddings(model=\"mxbai-embed-large\", prompt=text)\n return response[\"embedding\"]\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","from ollama import chat\nfrom ollama import ChatResponse\n\nresponse: ChatResponse = chat(\n model=\"llama3.2\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response[\"message\"][\"content\"])\n"],"headingContent":"Build RAG with Milvus and Ollama","anchorList":[{"label":"Membangun RAG dengan Milvus dan Ollama","href":"Build-RAG-with-Milvus-and-Ollama","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.md new file mode 100644 index 000000000..5564267c1 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_ollama.md @@ -0,0 +1,282 @@ +--- +id: build_RAG_with_milvus_and_ollama.md +summary: >- + Dalam panduan ini, kami akan menunjukkan kepada Anda cara memanfaatkan Ollama + dan Milvus untuk membangun pipeline RAG (Retrieval-Augmented Generation) + secara efisien dan aman. +title: Membangun RAG dengan Milvus dan Ollama +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Membangun RAG dengan Milvus dan Ollama

    Ollama adalah platform sumber terbuka yang menyederhanakan menjalankan dan menyesuaikan model bahasa besar (LLM) secara lokal. Ollama memberikan pengalaman yang ramah pengguna, bebas cloud, memungkinkan pengunduhan, instalasi, dan interaksi model yang mudah tanpa memerlukan keahlian teknis tingkat lanjut. Dengan perpustakaan LLM yang telah dilatih sebelumnya - dari tujuan umum hingga spesifik domain - Ollama memudahkan untuk mengelola dan menyesuaikan model untuk berbagai aplikasi. Hal ini memastikan privasi dan fleksibilitas data, memberdayakan pengguna untuk menyempurnakan, mengoptimalkan, dan menerapkan solusi berbasis AI sepenuhnya pada mesin mereka.

    +

    Dalam panduan ini, kami akan menunjukkan kepada Anda cara memanfaatkan Ollama dan Milvus untuk membangun pipeline RAG (Retrieval-Augmented Generation) secara efisien dan aman.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install pymilvus ollama
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +
    --2024-11-26 21:47:19--  https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +Resolving github.com (github.com)... 140.82.112.4
    +Connecting to github.com (github.com)|140.82.112.4|:443... connected.
    +HTTP request sent, awaiting response... 302 Found
    +Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream [following]
    +--2024-11-26 21:47:20--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream
    +Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ...
    +Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
    +HTTP request sent, awaiting response... 200 OK
    +Length: 613094 (599K) [application/octet-stream]
    +Saving to: ‘milvus_docs_2.4.x_en.zip’
    +
    +milvus_docs_2.4.x_e 100%[===================>] 598.72K  1.20MB/s    in 0.5s    
    +
    +2024-11-26 21:47:20 (1.20 MB/s) - ‘milvus_docs_2.4.x_en.zip’ saved [613094/613094]
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "#" untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Menyiapkan LLM dan Model Penyematan

    Ollama mendukung beberapa model untuk tugas-tugas berbasis LLM dan pembuatan embedding, sehingga memudahkan untuk mengembangkan aplikasi pembuatan retrieval-augmented generation (RAG). Untuk pengaturan ini:

    +
      +
    • Kita akan menggunakan Llama 3.2 (3B ) sebagai LLM untuk tugas-tugas pembuatan teks.
    • +
    • Untuk pembuatan penyematan, kita akan menggunakan mxbai-embed-large, model parameter 334M yang dioptimalkan untuk kemiripan semantik.
    • +
    +

    Sebelum memulai, pastikan kedua model ditarik secara lokal:

    +
    ! ollama pull mxbai-embed-large
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling 819c2adf5ce6... 100% ▕████████████████▏ 669 MB                         
    +pulling c71d239df917... 100% ▕████████████████▏  11 KB                         
    +pulling b837481ff855... 100% ▕████████████████▏   16 B                         
    +pulling 38badd946f91... 100% ▕████████████████▏  408 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +
    ! ollama pull llama3.2
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling dde5aa3fc5ff... 100% ▕████████████████▏ 2.0 GB                         
    +pulling 966de95ca8a6... 100% ▕████████████████▏ 1.4 KB                         
    +pulling fcc5a6bec9da... 100% ▕████████████████▏ 7.7 KB                         
    +pulling a70ff7e570d9... 100% ▕████████████████▏ 6.0 KB                         
    +pulling 56bb8bd477a5... 100% ▕████████████████▏   96 B                         
    +pulling 34bb5ab01051... 100% ▕████████████████▏  561 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +

    Dengan model-model ini siap, kita dapat melanjutkan untuk mengimplementasikan pembuatan berbasis LLM dan alur kerja pengambilan berbasis penyematan.

    +
    import ollama
    +
    +
    +def emb_text(text):
    +    response = ollama.embeddings(model="mxbai-embed-large", prompt=text)
    +    return response["embedding"]
    +
    +

    Buatlah sebuah embedding uji dan cetak dimensi dan beberapa elemen pertamanya.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.23276396095752716, 0.4257211685180664, 0.19724100828170776, 0.46120673418045044, -0.46039995551109314, -0.1413791924715042, -0.18261606991291046, -0.07602324336767197, 0.39991313219070435, 0.8337644338607788]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:03<00:00, 22.56it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        231.9398193359375
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        226.48316955566406
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        210.60745239257812
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan model llama3.2 yang disediakan oleh Ollama untuk menghasilkan respons berdasarkan prompt.

    +
    from ollama import chat
    +from ollama import ChatResponse
    +
    +response: ChatResponse = chat(
    +    model="llama3.2",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response["message"]["content"])
    +
    +
    According to the provided context, data in Milvus is stored in two types:
    +
    +1. **Inserted data**: Storing data in persistent storage as incremental log. It supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +
    +2. **Metadata**: Generated within Milvus and stored in etcd.
    +
    +

    Bagus! Kita telah berhasil membangun sebuah pipeline RAG dengan Milvus dan Ollama.

    diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.json b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.json new file mode 100644 index 000000000..a1388ab03 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"SILICON_FLOW_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nsiliconflow_client = OpenAI(\n api_key=os.environ[\"SILICON_FLOW_API_KEY\"], base_url=\"https://api.siliconflow.cn/v1\"\n)\n","def emb_text(text):\n return (\n siliconflow_client.embeddings.create(input=text, model=\"BAAI/bge-large-en-v1.5\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = siliconflow_client.chat.completions.create(\n model=\"deepseek-ai/DeepSeek-V2.5\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and SiliconFlow","anchorList":[{"label":"Membangun RAG dengan Milvus dan SiliconFlow","href":"Build-RAG-with-Milvus-and-SiliconFlow","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.md b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.md new file mode 100644 index 000000000..4adfab2fa --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_RAG_with_milvus_and_siliconflow.md @@ -0,0 +1,244 @@ +--- +id: build_RAG_with_milvus_and_siliconflow.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline + RAG (Retrieval-Augmented Generation) dengan Milvus dan SiliconFlow. +title: Membangun RAG dengan Milvus dan SiliconFlow +--- +

    Membangun RAG dengan Milvus dan SiliconFlow

    +Open In Colab + + +GitHub Repository +

    +

    SiliconFlow berkomitmen untuk membangun platform AI Infra yang dapat diskalakan, terstandardisasi, dan berkinerja tinggi. SiliconCloud adalah salah satu penawaran utama dari SiliconFlow, yang digambarkan sebagai platform Model sebagai Layanan (MaaS). Platform ini menyediakan lingkungan yang komprehensif untuk menerapkan berbagai model AI, termasuk model bahasa besar (LLM) dan model penyematan. SiliconCloud menggabungkan berbagai model sumber terbuka, memungkinkan pengguna untuk mengakses dan memanfaatkan sumber daya ini dengan mudah tanpa perlu pengaturan infrastruktur yang rumit.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus dan SiliconFlow.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    SiliconFlow mengaktifkan API gaya OpenAI. Anda dapat masuk ke situs web resminya dan menyiapkan kunci api SILICON_FLOW_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["SILICON_FLOW_API_KEY"] = "***********"
    +
    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Mempersiapkan Model Penyematan

    Kami menginisialisasi klien untuk menyiapkan model penyematan. SiliconFlow memungkinkan API gaya OpenAI, dan Anda dapat menggunakan API yang sama dengan sedikit penyesuaian untuk memanggil model penyematan dan LLM.

    +
    from openai import OpenAI
    +
    +siliconflow_client = OpenAI(
    +    api_key=os.environ["SILICON_FLOW_API_KEY"], base_url="https://api.siliconflow.cn/v1"
    +)
    +
    +

    Tentukan fungsi untuk menghasilkan penyematan teks menggunakan klien. Kami menggunakan model BAAI/bge-large-en-v1.5 sebagai contoh.

    +
    def emb_text(text):
    +    return (
    +        siliconflow_client.embeddings.create(input=text, model="BAAI/bge-large-en-v1.5")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Buatlah sebuah embedding uji dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.011475468054413795, 0.02982141077518463, 0.0038535362109541893, 0.035921916365623474, -0.0159175843000412, -0.014918108470737934, -0.018094222992658615, -0.002937349723652005, 0.030917132273316383, 0.03390815854072571]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:04<00:00, 16.97it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.833885133266449
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.812842607498169
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7714196443557739
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan model deepseek-ai/DeepSeek-V2.5 yang disediakan oleh SiliconCloud untuk menghasilkan respons berdasarkan prompt.

    +
    response = siliconflow_client.chat.completions.create(
    +    model="deepseek-ai/DeepSeek-V2.5",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +- **Inserted Data**: This includes vector data, scalar data, and collection-specific schema, which are stored in persistent storage as incremental logs. Milvus supports various object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +- **Metadata**: This is generated within Milvus, with each module having its own metadata stored in etcd, a distributed key-value store.
    +
    +

    Bagus! Kita telah berhasil membangun sebuah pipeline RAG dengan Milvus dan SiliconFlow.

    diff --git a/localization/v2.5.x/site/id/integrations/build_rag_on_arm.json b/localization/v2.5.x/site/id/integrations/build_rag_on_arm.json new file mode 100644 index 000000000..769919975 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_rag_on_arm.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt update\n$ sudo apt install python-is-python3 python3-pip python3-venv -y\n","$ python -m venv venv\n$ source venv/bin/activate\n","$ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(\n uri=\"\", token=\"\"\n)\n\ncollection_name = \"my_rag_collection\"\n\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=384,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from langchain_huggingface import HuggingFaceEmbeddings\n\nembedding_model = HuggingFaceEmbeddings(model_name=\"all-MiniLM-L6-v2\")\n","from tqdm import tqdm\n\ndata = []\n\ntext_embeddings = embedding_model.embed_documents(text_lines)\n\nfor i, (line, embedding) in enumerate(\n tqdm(zip(text_lines, text_embeddings), desc=\"Creating embeddings\")\n):\n data.append({\"id\": i, \"vector\": embedding, \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","$ sudo apt install make cmake -y\n$ sudo apt install gcc g++ -y\n$ sudo apt install build-essential -y\n","$ git clone https://github.com/ggerganov/llama.cpp\n","$ cd llama.cpp\n$ make GGML_NO_LLAMAFILE=1 -j$(nproc)\n","$ ./llama-cli -h\n","$ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False\n","$ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8\n","$ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536 --port 8080\n","from openai import OpenAI\n\nllm_client = OpenAI(base_url=\"http://localhost:8080/v1\", api_key=\"no-key\")\n","test_embedding = embedding_model.embed_query(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n embedding_model.embed_query(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","response = llm_client.chat.completions.create(\n model=\"not-used\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n\n"],"headingContent":"Build RAG on Arm Architecture","anchorList":[{"label":"Membangun RAG pada Arsitektur Arm","href":"Build-RAG-on-Arm-Architecture","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisite","type":2,"isActive":false},{"label":"Memuat Data Offline","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"Meluncurkan Layanan LLM di Arm","href":"Launch-LLM-Service-on-Arm","type":2,"isActive":false},{"label":"RAG Online","href":"Online-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/build_rag_on_arm.md b/localization/v2.5.x/site/id/integrations/build_rag_on_arm.md new file mode 100644 index 000000000..4dbf696d8 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/build_rag_on_arm.md @@ -0,0 +1,302 @@ +--- +id: build_rag_on_arm.md +summary: >- + Dalam tutorial ini, Anda akan mempelajari cara membuat aplikasi + Retrieval-Augmented Generation (RAG) pada infrastruktur berbasis Arm. Untuk + penyimpanan vektor, kami menggunakan Zilliz Cloud, basis data vektor Milvus + yang dikelola secara penuh. Zilliz Cloud tersedia di cloud utama seperti AWS, + GCP, dan Azure. Dalam demo ini, kami menggunakan Zilliz Cloud yang digunakan + di AWS dengan mesin Arm. Untuk LLM, kami menggunakan model Llama-3.1-8B pada + CPU server berbasis AWS Arm menggunakan llama.cpp. +title: Membangun RAG pada Arsitektur Arm +--- +

    Membangun RAG pada Arsitektur Arm

    CPUArm digunakan secara luas di berbagai aplikasi, termasuk kasus penggunaan pembelajaran mesin (ML) dan kecerdasan buatan (AI) tradisional.

    +

    Dalam tutorial ini, Anda akan mempelajari cara membuat aplikasi Retrieval-Augmented Generation (RAG) pada infrastruktur berbasis Arm. Untuk penyimpanan vektor, kami menggunakan Zilliz Cloud, basis data vektor Milvus yang dikelola secara penuh. Zilliz Cloud tersedia di cloud utama seperti AWS, GCP, dan Azure. Dalam demo ini, kami menggunakan Zilliz Cloud yang digunakan di AWS dengan mesin Arm. Untuk LLM, kami menggunakan model Llama-3.1-8B pada CPU server berbasis AWS Arm menggunakan llama.cpp.

    +

    Prasyarat

    Untuk menjalankan contoh ini, kami sarankan Anda untuk menggunakan AWS Graviton, yang menyediakan cara yang hemat biaya untuk menjalankan beban kerja ML pada server berbasis Arm. Notebook ini telah diuji pada instance AWS Graviton3 c7g.2xlarge dengan sistem Ubuntu 22.04 LTS.

    +

    Anda membutuhkan setidaknya empat core dan RAM 8GB untuk menjalankan contoh ini. Konfigurasikan penyimpanan disk hingga setidaknya 32 GB. Kami menyarankan Anda untuk menggunakan instans dengan spesifikasi yang sama atau lebih baik.

    +

    Setelah Anda meluncurkan instans, sambungkan ke instans tersebut dan jalankan perintah berikut ini untuk menyiapkan lingkungan.

    +

    Instal python pada server:

    +
    $ sudo apt update
    +$ sudo apt install python-is-python3 python3-pip python3-venv -y
    +
    +

    Buat dan aktifkan lingkungan virtual:

    +
    $ python -m venv venv
    +$ source venv/bin/activate
    +
    +

    Instal dependensi python yang diperlukan:

    +
    $ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm
    +
    +

    Memuat Data Offline

    Membuat Koleksi

    Kami menggunakan Zilliz Cloud yang diterapkan di AWS dengan mesin berbasis Arm untuk menyimpan dan mengambil data vektor. Untuk memulai dengan cepat, cukup daftarkan akun di Zilliz Cloud secara gratis.

    +
    +

    Selain Zilliz Cloud, Milvus yang dihosting sendiri juga merupakan opsi (lebih rumit untuk disiapkan). Kita juga dapat menggunakan Milvus Standalone dan Kubernetes pada mesin berbasis ARM. Untuk informasi lebih lanjut tentang instalasi Milvus, silakan lihat dokumentasi instalasi.

    +
    +

    Kami menetapkan uri dan token sebagai Public Endpoint dan Api key di Zilliz Cloud.

    +
    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(
    +    uri="<your_zilliz_public_endpoint>", token="<your_zilliz_api_key>"
    +)
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apapun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=384,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Kami menggunakan jarak hasil kali dalam sebagai jenis metrik default. Untuk informasi lebih lanjut tentang jenis jarak, Anda dapat merujuk ke halaman Metrik Kemiripan

    +

    Siapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipa RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Sisipkan data

    Kami menyiapkan model penyematan yang sederhana namun efisien, yaitu all-MiniLM-L6-v2 yang dapat mengubah teks menjadi vektor penyematan.

    +
    from langchain_huggingface import HuggingFaceEmbeddings
    +
    +embedding_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
    +
    +

    Lakukan iterasi melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +text_embeddings = embedding_model.embed_documents(text_lines)
    +
    +for i, (line, embedding) in enumerate(
    +    tqdm(zip(text_lines, text_embeddings), desc="Creating embeddings")
    +):
    +    data.append({"id": i, "vector": embedding, "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 72/72 [00:18<00:00,  3.91it/s]
    +
    +

    Meluncurkan Layanan LLM di Arm

    Pada bagian ini, kita akan membangun dan meluncurkan layanan llama.cpp pada CPU berbasis Arm.

    +

    Model Llama 3.1 & llama.cpp

    Model Llama-3.1-8B dari Meta adalah bagian dari keluarga model Llama 3.1 dan bebas digunakan untuk tujuan penelitian dan komersial. Sebelum Anda menggunakan model ini, kunjungi situs web Llama dan isi formulir untuk meminta akses.

    +

    llama.cpp adalah proyek C/C++ sumber terbuka yang memungkinkan inferensi LLM yang efisien pada berbagai perangkat keras - baik secara lokal maupun di cloud. Anda dapat dengan mudah meng-host model Llama 3.1 menggunakan llama.cpp.

    +

    Unduh dan bangun llama.cpp

    Jalankan perintah berikut untuk menginstal make, cmake, gcc, g++, dan alat penting lainnya yang diperlukan untuk membangun llama.cpp dari sumbernya:

    +
    $ sudo apt install make cmake -y
    +$ sudo apt install gcc g++ -y
    +$ sudo apt install build-essential -y
    +
    +

    Anda sekarang siap untuk mulai membangun llama.cpp.

    +

    Kloning repositori sumber untuk llama.cpp:

    +
    $ git clone https://github.com/ggerganov/llama.cpp
    +
    +

    Secara default, llama.cpp dibuat hanya untuk CPU di Linux dan Windows. Anda tidak perlu menyediakan switch tambahan untuk membangunnya untuk CPU Arm tempat Anda menjalankannya.

    +

    Jalankan make untuk membangunnya:

    +
    $ cd llama.cpp
    +$ make GGML_NO_LLAMAFILE=1 -j$(nproc)
    +
    +

    Periksa apakah llama.cpp telah dibangun dengan benar dengan menjalankan perintah bantuan:

    +
    $ ./llama-cli -h
    +
    +

    Jika llama.cpp telah dibangun dengan benar, Anda akan melihat opsi bantuan yang ditampilkan. Cuplikan output terlihat seperti ini:

    +
    example usage:
    +
    +    text generation:     ./llama-cli -m your_model.gguf -p "I believe the meaning of life is" -n 128
    +
    +    chat (conversation): ./llama-cli -m your_model.gguf -p "You are a helpful assistant" -cnv
    +
    +

    Anda sekarang dapat mengunduh model menggunakan cli huggingface:

    +
    $ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False
    +
    +

    Format model GGUF, yang diperkenalkan oleh tim llama.cpp, menggunakan kompresi dan kuantisasi untuk mengurangi presisi bobot menjadi bilangan bulat 4-bit, yang secara signifikan mengurangi kebutuhan komputasi dan memori dan membuat Arm CPU efektif untuk inferensi LLM.

    +

    Menghitung ulang bobot model

    Untuk menghitung ulang, jalankan

    +
    $ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8
    +
    +

    Ini akan menghasilkan file baru, dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf, yang berisi bobot yang dikonfigurasi ulang yang memungkinkan llama-cli untuk menggunakan dukungan SVE 256 dan MATMUL_INT8.

    +
    +

    Kuantisasi ulang ini optimal secara khusus untuk Graviton3. Untuk Graviton2, rekuantisasi optimal harus dilakukan dalam format Q4_0_4_4, dan untuk Graviton4, format Q4_0_4_8 adalah yang paling cocok untuk rekuantisasi.

    +
    +

    Memulai Layanan LLM

    Anda dapat menggunakan program server llama.cpp dan mengirim permintaan melalui API yang kompatibel dengan OpenAI. Hal ini memungkinkan Anda untuk mengembangkan aplikasi yang berinteraksi dengan LLM beberapa kali tanpa harus berulang kali memulai dan menghentikannya. Selain itu, Anda dapat mengakses server dari mesin lain di mana LLM di-host melalui jaringan.

    +

    Mulai server dari baris perintah, dan server akan mendengarkan port 8080:

    +
    $ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536  --port 8080
    +
    +
    'main: server is listening on 127.0.0.1:8080 - starting the main loop
    +
    +

    Anda juga dapat menyesuaikan parameter LLM yang diluncurkan untuk menyesuaikannya dengan perangkat keras server Anda untuk mendapatkan kinerja yang ideal. Untuk informasi parameter lebih lanjut, lihat perintah llama-server --help.

    +

    Jika Anda kesulitan melakukan langkah ini, Anda dapat merujuk ke dokumen resmi untuk informasi lebih lanjut.

    +

    Anda telah memulai layanan LLM pada CPU berbasis Arm. Selanjutnya, kita langsung berinteraksi dengan layanan menggunakan OpenAI SDK.

    +

    RAG Online

    Klien LLM dan Model Penyematan

    Kita menginisialisasi klien LLM dan menyiapkan model penyematan.

    +

    Untuk LLM, kita menggunakan OpenAI SDK untuk meminta layanan Llama yang telah diluncurkan sebelumnya. Kita tidak perlu menggunakan kunci API apa pun karena ini sebenarnya adalah layanan llama.cpp lokal kita.

    +
    from openai import OpenAI
    +
    +llm_client = OpenAI(base_url="http://localhost:8080/v1", api_key="no-key")
    +
    +

    Buatlah penyematan tes dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = embedding_model.embed_query("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    384
    +[0.03061249852180481, 0.013831384479999542, -0.02084377221763134, 0.016327863559126854, -0.010231520049273968, -0.0479842908680439, -0.017313342541456223, 0.03728749603033066, 0.04588735103607178, 0.034405000507831573]
    +
    +

    Mengambil data untuk sebuah kueri

    Mari kita tentukan sebuah pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan tersebut dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        embedding_model.embed_query(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian kueri

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6488019824028015
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5974207520484924
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5833579301834106
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil menjadi format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +
    Define system and user prompts for the Language Model. This prompt is assembled with the retrieved documents from Milvus.
    +
    +SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan LLM untuk menghasilkan respons berdasarkan petunjuk. Kami menetapkan parameter model menjadi not-used karena parameter ini merupakan parameter yang berlebihan untuk layanan llama.cpp.

    +
    response = llm_client.chat.completions.create(
    +    model="not-used",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    +
    Milvus stores data in two types: inserted data and metadata. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and each Milvus module has its own metadata that are stored in etcd.
    +
    +

    Selamat! Anda telah membangun aplikasi RAG di atas infrastruktur berbasis Arm.

    diff --git a/localization/v2.5.x/site/id/integrations/dify_with_milvus.json b/localization/v2.5.x/site/id/integrations/dify_with_milvus.json new file mode 100644 index 000000000..f522af847 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/dify_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/langgenius/dify.git\n","cd dify/docker\n","cp .env.example .env\n","VECTOR_STORE=milvus\n","MILVUS_URI=xxx\nMILVUS_TOKEN=xxx\n","docker compose up -d\n","docker compose up -d\n"],"headingContent":"Deploying Dify with Milvus","anchorList":[{"label":"Menerapkan Dify dengan Milvus","href":"Deploying-Dify-with-Milvus","type":1,"isActive":false},{"label":"Mengkloning Repositori","href":"Clone-the-Repository","type":2,"isActive":false},{"label":"Mengatur Variabel Lingkungan","href":"Set-the-Environment-Variables","type":2,"isActive":false},{"label":"Memulai Kontainer Docker","href":"Start-the-Docker-Containers","type":2,"isActive":false},{"label":"Masuk ke Dify","href":"Log-in-to-Dify","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/dify_with_milvus.md b/localization/v2.5.x/site/id/integrations/dify_with_milvus.md new file mode 100644 index 000000000..701313695 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/dify_with_milvus.md @@ -0,0 +1,111 @@ +--- +id: dify_with_milvus.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Dify + dengan Milvus, untuk memungkinkan pengambilan yang efisien dan mesin RAG. +title: Menerapkan Dify dengan Milvus +--- +

    Menerapkan Dify dengan Milvus

    Dify adalah platform sumber terbuka yang dirancang untuk menyederhanakan pembuatan aplikasi AI dengan menggabungkan Backend-as-a-Service dengan LLM. Dify mendukung LLM utama, menawarkan antarmuka orkestrasi cepat yang intuitif, mesin RAG berkualitas tinggi, dan kerangka kerja agen AI yang fleksibel. Dengan alur kerja kode rendah, antarmuka yang mudah digunakan, dan API, Dify memungkinkan pengembang dan pengguna non-teknis untuk fokus menciptakan solusi AI dunia nyata yang inovatif tanpa harus berurusan dengan kerumitan.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Dify dengan Milvus, untuk memungkinkan pengambilan yang efisien dan mesin RAG.

    +

    Mengkloning Repositori

    Kloning kode sumber Dify ke mesin lokal Anda:

    +
    git clone https://github.com/langgenius/dify.git
    +
    +

    Mengatur Variabel Lingkungan

    Arahkan ke direktori Docker dalam kode sumber Dify

    +
    cd dify/docker
    +
    +

    Salin berkas konfigurasi lingkungan

    +
    cp .env.example .env
    +
    +

    Ubah nilai VECTOR_STORE dalam berkas .env

    +
    VECTOR_STORE=milvus
    +
    +

    Ubah konfigurasi Milvus dalam berkas .env

    +
    MILVUS_URI=xxx
    +MILVUS_TOKEN=xxx
    +
    +

    Dalam penyiapan ini, gunakan URI eksternal server, misalnyahttp://172.16.16.16:19530, sebagai MILVUS_URI.

    +

    Untuk MILVUS_TOKEN, jika Anda belum mengatur token untuk server Milvus Anda, Anda dapat mengaturnya menjadi string kosong seperti MILVUS_TOKEN=, jika tidak, Anda harus mengaturnya ke token Milvus Anda. Untuk informasi lebih lanjut tentang cara mengatur token di Milvus, Anda dapat merujuk ke halaman otentikasi.

    +

    Memulai Kontainer Docker

    Pilih perintah yang sesuai untuk memulai kontainer berdasarkan versi Docker Compose pada sistem Anda. Anda dapat menggunakan perintah $ docker compose version untuk memeriksa versi, dan merujuk ke dokumentasi Docker untuk informasi lebih lanjut:

    +

    Jika Anda memiliki Docker Compose V2, gunakan perintah berikut:

    +
    docker compose up -d
    +
    +

    Jika Anda memiliki Docker Compose V1, gunakan perintah berikut:

    +
    docker compose up -d
    +
    +

    Masuk ke Dify

    Buka peramban Anda dan buka halaman instalasi Dify, dan Anda dapat mengatur akun admin Anda di sini:http://localhost/install, Lalu masuk ke halaman utama Dify untuk penggunaan lebih lanjut.

    +

    Untuk penggunaan dan panduan lebih lanjut, silakan lihat dokumentasi Dify.

    diff --git a/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.json b/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.json new file mode 100644 index 000000000..dd38b95ea --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas deepeval\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from deepeval.metrics import (\n ContextualPrecisionMetric,\n ContextualRecallMetric,\n ContextualRelevancyMetric,\n)\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\ncontextual_precision = ContextualPrecisionMetric()\ncontextual_recall = ContextualRecallMetric()\ncontextual_relevancy = ContextualRelevancyMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[contextual_precision, contextual_recall, contextual_relevancy],\n print_results=False, # Change to True to see detailed metric results\n)\n","from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\nanswer_relevancy = AnswerRelevancyMetric()\nfaithfulness = FaithfulnessMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[answer_relevancy, faithfulness],\n print_results=False, # Change to True to see detailed metric results\n)\n"],"headingContent":"Evaluation with DeepEval","anchorList":[{"label":"Evaluasi dengan DeepEval","href":"Evaluation-with-DeepEval","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mendefinisikan pipeline RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Jalankan pipeline RAG dan dapatkan hasilnya","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Mengevaluasi Retriever","href":"Evaluating-Retriever","type":2,"isActive":false},{"label":"Mengevaluasi Generasi","href":"Evaluating-Generation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.md b/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.md new file mode 100644 index 000000000..bf8f6be0b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/evaluation_with_deepeval.md @@ -0,0 +1,434 @@ +--- +id: evaluation_with_deepeval.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan DeepEval untuk mengevaluasi + pipeline Retrieval-Augmented Generation (RAG) yang dibangun di atas Milvus. +title: Evaluasi dengan DeepEval +--- +

    Evaluasi dengan DeepEval

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara menggunakan DeepEval untuk mengevaluasi pipeline Retrieval-Augmented Generation (RAG) yang dibangun di atas Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    DeepEval adalah sebuah kerangka kerja yang membantu Anda mengevaluasi pipeline RAG Anda. Ada alat dan kerangka kerja yang ada yang membantu Anda membangun pipeline ini, tetapi mengevaluasinya dan mengukur kinerja pipeline Anda bisa jadi sulit. Di sinilah DeepEval masuk.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut ini:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas deepeval
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    Mendefinisikan pipeline RAG

    Kita akan mendefinisikan kelas RAG yang menggunakan Milvus sebagai penyimpan vektor, dan OpenAI sebagai LLM. Kelas ini berisi metode load, yang memuat data teks ke dalam Milvus, metode retrieve, yang mengambil data teks yang paling mirip dengan pertanyaan yang diberikan, dan metode answer, yang menjawab pertanyaan yang diberikan dengan pengetahuan yang telah diambil.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Mari kita inisialisasi kelas RAG dengan klien OpenAI dan Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Jalankan pipeline RAG dan dapatkan hasilnya

    Kami menggunakan panduan pengembangan Milvus sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh dan muat ke dalam pipeline RAG.

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:20<00:00,  2.26it/s]
    +
    +

    Mari kita mendefinisikan pertanyaan kueri tentang konten dokumentasi panduan pengembangan. Lalu gunakan metode answer untuk mendapatkan jawaban dan teks konteks yang diambil.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is as follows:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Sekarang mari kita siapkan beberapa pertanyaan dengan jawaban ground truth yang sesuai. Kita mendapatkan jawaban dan konteks dari pipeline RAG kita.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.06s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    pertanyaankonteksjawabanground_truth
    0apa spesifikasi kebutuhan perangkat keras yang ...[Persyaratan Perangkat Keras\n\nSpesifikasi berikut ini adalah spesifikasi ...Spesifikasi persyaratan perangkat keras untuk membangun ...Jika Anda ingin membangun Milvus dan menjalankannya dari sumber ...
    1Apa bahasa pemrograman yang digunakan untuk menulis ...[CMake & Conan\n\nPustaka algoritme dari Mil...Bahasa pemrograman yang digunakan untuk menulis Knowher...Bahasa pemrograman yang digunakan untuk menulis Knowher...
    2Apa yang harus dipastikan sebelum menjalankan cakupan kode ...[Cakupan kode\n\nSebelum mengirimkan pull ...Sebelum menjalankan cakupan kode, Anda harus memastikan ...Sebelum menjalankan cakupan kode, Anda harus membuat ...
    +
    +

    Mengevaluasi Retriever

    Saat mengevaluasi retriever dalam sistem model bahasa besar (LLM), sangat penting untuk menilai hal-hal berikut:

    +
      +
    1. Relevansi Peringkat: Seberapa efektif retriever memprioritaskan informasi yang relevan di atas data yang tidak relevan.

    2. +
    3. Pengambilan Kontekstual: Kemampuan untuk menangkap dan mengambil informasi yang relevan secara kontekstual berdasarkan masukan.

    4. +
    5. Keseimbangan: Seberapa baik retriever mengelola ukuran potongan teks dan cakupan pengambilan untuk meminimalkan ketidakrelevanan.

    6. +
    +

    Bersama-sama, faktor-faktor ini memberikan pemahaman yang komprehensif tentang bagaimana retriever memprioritaskan, menangkap, dan menyajikan informasi yang paling berguna.

    +
    from deepeval.metrics import (
    +    ContextualPrecisionMetric,
    +    ContextualRecallMetric,
    +    ContextualRelevancyMetric,
    +)
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +contextual_precision = ContextualPrecisionMetric()
    +contextual_recall = ContextualRecallMetric()
    +contextual_relevancy = ContextualRelevancyMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[contextual_precision, contextual_recall, contextual_relevancy],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/deepeval/__init__.py:49: UserWarning: You are using deepeval version 1.1.6, however version 1.2.2 is available. You should consider upgrading via the "pip install --upgrade deepeval" command.
    +  warnings.warn(
    +
    +
    ✨ Anda menjalankan Metrik Ketepatan Kontekstual terbaru dari DeepEval! (menggunakan gpt-4o, strict= False, async_mode= True)...
    +
    ✨ Anda menjalankan Metrik Recall Kontekstual terbaru dari DeepEval! (menggunakan gpt-4o, strict=False, async_mode=True)...
    +
    ✨ Anda sedang menjalankan Metrik Relevansi Kontekstual terbaru dari DeepEval! (menggunakan gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.91s/test case]
    +
    +
    Pengujian selesai 🎉! Jalankan 'deepeval login' untuk melihat hasil evaluasi pada Confident AI. 
    +‼️ CATATAN: Anda juga dapat menjalankan evaluasi pada SEMUA metrik deepeval secara langsung di Confident AI.
    +

    Mengevaluasi Generasi

    Untuk menilai kualitas output yang dihasilkan dalam model bahasa besar (LLM), penting untuk fokus pada dua aspek utama:

    +
      +
    1. Relevansi: Mengevaluasi apakah perintah secara efektif memandu LLM untuk menghasilkan respons yang bermanfaat dan sesuai dengan konteks.

    2. +
    3. Kesetiaan: Mengukur keakuratan output, memastikan model menghasilkan informasi yang secara faktual benar dan bebas dari halusinasi atau kontradiksi. Konten yang dihasilkan harus selaras dengan informasi faktual yang disediakan dalam konteks pencarian.

    4. +
    +

    Faktor-faktor ini bersama-sama memastikan bahwa output yang dihasilkan relevan dan dapat diandalkan.

    +
    from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +answer_relevancy = AnswerRelevancyMetric()
    +faithfulness = FaithfulnessMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[answer_relevancy, faithfulness],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    ✨ Anda menjalankan Metrik Relevansi Jawaban terbaru dari DeepEval! (menggunakan gpt-4o, strict= False, async_mode= True)...
    +
    ✨ Anda menjalankan Metrik Kesetiaan terbaru dari DeepEval! (menggunakan gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.97s/test case]
    +
    +
     Pengujian selesai 🎉! Jalankan 'deepeval login' untuk melihat hasil evaluasi pada Confident AI. 
    +‼️ CATATAN: Anda juga dapat menjalankan evaluasi pada SEMUA metrik deepeval secara langsung di Confident AI.
    diff --git a/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.json b/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.json new file mode 100644 index 000000000..95973cb53 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas \"arize-phoenix>=4.29.0\" nest_asyncio\n","import os\n\n# os.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","import phoenix as px\nfrom phoenix.trace.openai import OpenAIInstrumentor\n\n# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:\nsession = px.launch_app()\n\n# Initialize OpenAI auto-instrumentation\nOpenAIInstrumentor().instrument()\n","import nest_asyncio\n\nfrom phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals\n\nnest_asyncio.apply() # This is needed for concurrency in notebook environments\n\n# Set your OpenAI API key\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Define your evaluators\nhallucination_evaluator = HallucinationEvaluator(eval_model)\nqa_evaluator = QAEvaluator(eval_model)\n\n# We have to make some minor changes to our dataframe to use the column names expected by our evaluators\n# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'\n# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'\ndf[\"context\"] = df[\"contexts\"]\ndf[\"reference\"] = df[\"contexts\"]\ndf.rename(columns={\"question\": \"input\", \"answer\": \"output\"}, inplace=True)\nassert all(\n column in df.columns for column in [\"output\", \"input\", \"context\", \"reference\"]\n)\n\n# Run the evaluators, each evaluator will return a dataframe with evaluation results\n# We upload the evaluation results to Phoenix in the next step\nhallucination_eval_df, qa_eval_df = run_evals(\n dataframe=df,\n evaluators=[hallucination_evaluator, qa_evaluator],\n provide_explanation=True,\n)\n","results_df = df.copy()\nresults_df[\"hallucination_eval\"] = hallucination_eval_df[\"label\"]\nresults_df[\"hallucination_explanation\"] = hallucination_eval_df[\"explanation\"]\nresults_df[\"qa_eval\"] = qa_eval_df[\"label\"]\nresults_df[\"qa_explanation\"] = qa_eval_df[\"explanation\"]\nresults_df.head()\n"],"headingContent":"Evaluation with Arize Pheonix","anchorList":[{"label":"Evaluasi dengan Arize Pheonix","href":"Evaluation-with-Arize-Pheonix","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mendefinisikan pipeline RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Jalankan pipeline RAG dan dapatkan hasilnya","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Evaluasi dengan Arize Phoenix","href":"Evaluation-with-Arize-Phoenix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.md b/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.md new file mode 100644 index 000000000..f7abf8ba7 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/evaluation_with_phoenix.md @@ -0,0 +1,475 @@ +--- +id: evaluation_with_phoenix.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan Arize Pheonix untuk + mengevaluasi pipeline Retrieval-Augmented Generation (RAG) yang dibangun di + atas Milvus. +title: Evaluasi dengan Arize Pheonix +--- +

    Evaluasi dengan Arize Pheonix

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara menggunakan Arize Pheonix untuk mengevaluasi pipeline Retrieval-Augmented Generation (RAG) yang dibangun di atas Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    Arize Pheonix adalah sebuah kerangka kerja yang membantu Anda mengevaluasi pipeline RAG Anda. Ada alat dan kerangka kerja yang ada yang membantu Anda membangun pipeline ini, tetapi mengevaluasinya dan mengukur kinerja pipeline Anda bisa jadi sulit. Di sinilah Arize Pheonix hadir.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut ini:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas "arize-phoenix>=4.29.0" nest_asyncio
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +# os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    Mendefinisikan pipeline RAG

    Kita akan mendefinisikan kelas RAG yang menggunakan Milvus sebagai penyimpan vektor, dan OpenAI sebagai LLM. Kelas ini berisi metode load, yang memuat data teks ke dalam Milvus, metode retrieve, yang mengambil data teks yang paling mirip dengan pertanyaan yang diberikan, dan metode answer, yang menjawab pertanyaan yang diberikan dengan pengetahuan yang telah diambil.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Mari kita inisialisasi kelas RAG dengan klien OpenAI dan Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Jalankan pipeline RAG dan dapatkan hasilnya

    Kami menggunakan panduan pengembangan Milvus sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh dan muat ke dalam pipeline RAG.

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:12<00:00,  3.84it/s]
    +
    +

    Mari kita mendefinisikan pertanyaan kueri tentang konten dokumentasi panduan pengembangan. Lalu gunakan metode answer untuk mendapatkan jawaban dan teks konteks yang diambil.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code are:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Sekarang mari kita siapkan beberapa pertanyaan dengan jawaban ground truth yang sesuai. Kita mendapatkan jawaban dan konteks dari pipeline RAG kita.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.04s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    pertanyaankonteksjawabanground_truth
    0apa spesifikasi kebutuhan perangkat keras yang ...[Persyaratan Perangkat Keras\n\nSpesifikasi berikut ini adalah spesifikasi ...Spesifikasi persyaratan perangkat keras untuk membangun ...Jika Anda ingin membangun Milvus dan menjalankannya dari sumber ...
    1Apa bahasa pemrograman yang digunakan untuk menulis ...[CMake & Conan\n\nPustaka algoritme dari Mil...Bahasa pemrograman yang digunakan untuk menulis Knowher...Bahasa pemrograman yang digunakan untuk menulis Knowher...
    2Apa yang harus dipastikan sebelum menjalankan cakupan kode ...[Cakupan kode\n\nSebelum mengirimkan pull ...Sebelum menjalankan cakupan kode, Anda harus memastikan ...Sebelum menjalankan cakupan kode, Anda harus membuat ...
    +
    +

    Evaluasi dengan Arize Phoenix

    Kami menggunakan Arize Phoenix untuk mengevaluasi pipeline retrieval-augmented generation (RAG) kami, dengan fokus pada dua metrik utama:

    +
      +
    • Evaluasi Halusinasi: Menentukan apakah konten tersebut faktual atau halusinasi (informasi yang tidak sesuai dengan konteks), untuk memastikan integritas data.

      +
        +
      • Penjelasan Halusinasi: Menjelaskan mengapa suatu tanggapan bersifat faktual atau tidak.
      • +
    • +
    • Evaluasi QA: Menilai keakuratan jawaban model terhadap pertanyaan masukan.

      +
        +
      • Penjelasan QA: Merinci mengapa suatu jawaban benar atau salah.
      • +
    • +
    +

    Ikhtisar Penelusuran Phoenix

    Phoenix menyediakan penelusuran yang kompatibel dengan OTEL untuk aplikasi LLM, dengan integrasi untuk kerangka kerja seperti Langchain, LlamaIndex, dan SDK seperti OpenAI dan Mistral. Penelusuran menangkap seluruh aliran permintaan, menawarkan wawasan ke dalam:

    +
      +
    • Latensi Aplikasi: Mengidentifikasi dan mengoptimalkan panggilan LLM yang lambat dan kinerja komponen.
    • +
    • Penggunaan Token: Memecah konsumsi token untuk pengoptimalan biaya.
    • +
    • Pengecualian Runtime: Menangkap masalah kritis seperti pembatasan kecepatan.
    • +
    • Dokumen yangDiambil: Menganalisis pengambilan dokumen, skor, dan urutan.
    • +
    +

    Dengan memanfaatkan penelusuran Phoenix, Anda dapat mengidentifikasi kemacetan, mengoptimalkan sumber daya, dan memastikan keandalan sistem di berbagai kerangka kerja dan bahasa.

    +
    import phoenix as px
    +from phoenix.trace.openai import OpenAIInstrumentor
    +
    +# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:
    +session = px.launch_app()
    +
    +# Initialize OpenAI auto-instrumentation
    +OpenAIInstrumentor().instrument()
    +
    +
    🌍 To view the Phoenix app in your browser, visit http://localhost:6006/
    +📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix
    +
    +

    + + Alt Text + Alt Text

    +
    import nest_asyncio
    +
    +from phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals
    +
    +nest_asyncio.apply()  # This is needed for concurrency in notebook environments
    +
    +# Set your OpenAI API key
    +eval_model = OpenAIModel(model="gpt-4o")
    +
    +# Define your evaluators
    +hallucination_evaluator = HallucinationEvaluator(eval_model)
    +qa_evaluator = QAEvaluator(eval_model)
    +
    +# We have to make some minor changes to our dataframe to use the column names expected by our evaluators
    +# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'
    +# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'
    +df["context"] = df["contexts"]
    +df["reference"] = df["contexts"]
    +df.rename(columns={"question": "input", "answer": "output"}, inplace=True)
    +assert all(
    +    column in df.columns for column in ["output", "input", "context", "reference"]
    +)
    +
    +# Run the evaluators, each evaluator will return a dataframe with evaluation results
    +# We upload the evaluation results to Phoenix in the next step
    +hallucination_eval_df, qa_eval_df = run_evals(
    +    dataframe=df,
    +    evaluators=[hallucination_evaluator, qa_evaluator],
    +    provide_explanation=True,
    +)
    +
    +
    run_evals |██████████| 6/6 (100.0%) | ⏳ 00:03<00:00 |  1.64it/s
    +
    +
    results_df = df.copy()
    +results_df["hallucination_eval"] = hallucination_eval_df["label"]
    +results_df["hallucination_explanation"] = hallucination_eval_df["explanation"]
    +results_df["qa_eval"] = qa_eval_df["label"]
    +results_df["qa_explanation"] = qa_eval_df["explanation"]
    +results_df.head()
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    inputkontekskeluaranground_truthkonteksreferensievaluasi_halusinasipenjelasan_halusinasiqa_evalqa_eksplanasi
    0apa spesifikasi persyaratan perangkat keras ...[Persyaratan Perangkat Keras\n\nSpesifikasi berikut ini adalah spesifikasi ...Spesifikasi kebutuhan perangkat keras untuk membangun ...Jika Anda ingin membuat Milvus dan menjalankannya dari sumber ...[Persyaratan Perangkat Keras] Spesifikasi berikut ini untuk membangun ...[Persyaratan Perangkat Keras\n\nSpesifikasi berikut ini untuk membangun ...faktualUntuk menentukan apakah jawaban tersebut faktual atau halus...benarUntuk menentukan apakah jawabannya benar, kita perlu...
    1Apa bahasa pemrograman yang digunakan untuk menulis ...[CMake & Conan\n\nPustaka algoritma dari Mil...Bahasa pemrograman yang digunakan untuk menulis Knowher...Bahasa pemrograman yang digunakan untuk menulis Knowher...[CMake & Conan\n\nPustaka algoritma dari Mil...[CMake & Conan\n\nPustaka algoritma dari Mil...faktualUntuk menentukan apakah jawaban tersebut faktual atau halus...benarUntuk menentukan apakah jawabannya benar, kita perlu...
    2Apa yang harus dipastikan sebelum menjalankan cakupan kode ...[Cakupan kode\n\nSebelum mengirimkan pull ...Sebelum menjalankan cakupan kode, Anda harus memastikan ...Sebelum menjalankan cakupan kode, Anda harus membuat ...[Cakupan kode\n\nSebelum mengirimkan pull ...[Cakupan kode\n\nSebelum mengirimkan pull ...faktualTeks referensi menentukan bahwa sebelum menjalankan ...benarUntuk menentukan apakah jawabannya benar, kita perlu...
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.json b/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.json new file mode 100644 index 000000000..fbc32f853 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.json @@ -0,0 +1 @@ +{"codeList":["pip install streamlit pymilvus openai\n","import streamlit as st\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n # TODO check for related support cases and articles\n st.write(\"Submitted!\")\n","streamlit run basic_support_form.py\n","import streamlit as st\nimport os\nimport pymilvus\nimport openai\n\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem?\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n import os\n import pymilvus\n import openai\n\n org_id = 360033549136 # TODO Load from customer login data\n\n pymilvus.connections.connect(uri=os.environ[\"MILVUS_URL\"], token=os.environ[\"MILVUS_TOKEN\"])\n collection = pymilvus.Collection(\"zendesk\")\n\n embedding = openai.Embedding.create(input=text_val, model=\"text-embedding-ada-002\")['data'][0]['embedding']\n\n results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=2, output_fields=[\"_id\", \"subject\", \"description\"], expr=f'status == \"new\" and organization_id == {org_id}')\n\n st.write(results[0])\n if len(results[0]) > 0 and results[0].distances[0] < 0.35:\n matching_ticket = results[0][0].entity\n st.write(f\"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before\")\n else:\n st.write(\"Submitted!\")\n \n","export MILVUS_TOKEN=...\nexport MILVUS_URL=https://...\nexport OPENAI_API_KEY=sk-...\n\nstreamlit run app.py\n"," ......\n \n else:\n # TODO Actually send out the ticket\n st.write(\"Submitted!\")\n article_results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=5, output_fields=[\"title\", \"html_url\"], expr=f'_ab_stream == \"articles\"')\n st.write(article_results[0])\n if len(article_results[0]) > 0:\n st.write(\"We also found some articles that might help you:\")\n for hit in article_results[0]:\n if hit.distance < 0.362:\n st.write(f\"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})\")\n\n"],"headingContent":"Airbyte: Open-Source Data Movement Infrastructure","anchorList":[{"label":"Airbyte: Infrastruktur Pergerakan Data Sumber Terbuka","href":"Airbyte-Open-Source-Data-Movement-Infrastructure","type":1,"isActive":false},{"label":"Komponen-komponen Utama Airbyte","href":"Major-Components-of-Airbyte","type":2,"isActive":false},{"label":"Sebelum Anda Memulai","href":"Before-You-Begin","type":2,"isActive":false},{"label":"Menyiapkan Milvus Cluster","href":"Set-Up-Milvus-Cluster","type":2,"isActive":false},{"label":"Menyiapkan Koneksi di Airbyte","href":"Set-Up-Connection-in-Airbyte","type":2,"isActive":false},{"label":"Membangun aplikasi Streamlit yang menanyakan koleksi","href":"Build-Streamlit-app-querying-the-collection","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.md b/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.md new file mode 100644 index 000000000..a5e8d9bdc --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_airbyte.md @@ -0,0 +1,248 @@ +--- +id: integrate_with_airbyte.md +summary: >- + Airbyte adalah infrastruktur pergerakan data sumber terbuka untuk membangun + pipa data ekstrak dan beban (EL). Ini dirancang untuk keserbagunaan, + skalabilitas, dan kemudahan penggunaan. Katalog konektor Airbyte hadir "di + luar kotak" dengan lebih dari 350 konektor yang sudah jadi. Konektor-konektor + ini dapat digunakan untuk mulai mereplikasi data dari sumber ke tujuan hanya + dalam beberapa menit. +title: 'Airbyte: Infrastruktur Pergerakan Data Sumber Terbuka' +--- +

    Airbyte: Infrastruktur Pergerakan Data Sumber Terbuka

    Airbyte adalah infrastruktur pergerakan data sumber terbuka untuk membangun pipa data ekstrak dan beban (EL). Infrastruktur ini dirancang untuk keserbagunaan, skalabilitas, dan kemudahan penggunaan. Katalog konektor Airbyte hadir "di luar kotak" dengan lebih dari 350 konektor yang sudah jadi. Konektor-konektor ini dapat digunakan untuk mulai mereplikasi data dari sumber ke tujuan hanya dalam beberapa menit.

    +

    Komponen-komponen Utama Airbyte

    1. Katalog Konektor

      +
    • 350+ Konektor yang Sudah Dibangun Sebelumnya: Katalog konektor Airbyte hadir "out-of-the-box" dengan lebih dari 350 konektor yang sudah jadi. Konektor-konektor ini dapat digunakan untuk mulai mereplikasi data dari sumber ke tujuan hanya dalam beberapa menit.
    • +
    • Pembuat Konektor Tanpa Kode: Anda dapat dengan mudah memperluas fungsionalitas Airbyte untuk mendukung kasus penggunaan khusus Anda melalui alat seperti No-Code Connector Builder.
    • +
    +

    2. Platform

    Platform Airbyte menyediakan semua layanan horizontal yang diperlukan untuk mengonfigurasi dan menskalakan operasi perpindahan data, tersedia dalam bentuk cloud-managed atau self-managed.

    +

    3. Antarmuka Pengguna

    Airbyte memiliki fitur UI, PyAirbyte (library Python), API, dan Terraform Provider untuk berintegrasi dengan tooling dan pendekatan yang Anda inginkan untuk manajemen infrastruktur.

    +

    Dengan kemampuan Airbyte, pengguna dapat mengintegrasikan sumber data ke dalam cluster Milvus untuk pencarian kemiripan.

    +

    Sebelum Anda Memulai

    Anda akan membutuhkan

    +
      +
    • Akun Zendesk (atau sumber data lain yang ingin Anda sinkronkan datanya)
    • +
    • Akun Airbyte atau instance lokal
    • +
    • Kunci API OpenAI
    • +
    • Milvus cluster
    • +
    • Python 3.10 yang terinstal secara lokal
    • +
    +

    Menyiapkan Milvus Cluster

    Jika Anda telah menggunakan cluster K8s untuk produksi, Anda dapat melewati langkah ini dan langsung menggunakan Milvus Operator. Jika belum, Anda dapat mengikuti langkah-langkah untuk menggunakan cluster Milvus dengan Milvus Operator.

    +

    Entitas individual (dalam kasus kami, tiket dukungan dan artikel basis pengetahuan) disimpan dalam sebuah "koleksi" - setelah cluster Anda disiapkan, Anda perlu membuat koleksi. Pilih nama yang sesuai dan atur Dimension ke 1536 untuk mencocokkan dimensi vektor yang dihasilkan oleh layanan penyematan OpenAI.

    +

    Setelah pembuatan, catat info titik akhir dan autentikasi.

    +

    Menyiapkan Koneksi di Airbyte

    Basis data kita sudah siap, mari kita pindahkan beberapa data! Untuk melakukan ini, kita perlu mengonfigurasi koneksi di Airbyte. Daftar akun cloud Airbyte di cloud.airbyte.com atau jalankan instance lokal seperti yang dijelaskan dalam dokumentasi.

    +

    Mengatur Sumber

    Setelah instance Anda berjalan, kita perlu menyiapkan koneksi - klik "New connection" dan pilih konektor "Zendesk Support" sebagai sumber. Setelah mengklik tombol "Test and Save", Airbyte akan memeriksa apakah koneksi dapat dibuat.

    +

    Di Airbyte cloud, Anda dapat dengan mudah mengautentikasi dengan mengklik tombol Autentikasi. Saat menggunakan instance Airbyte lokal, ikuti petunjuk yang diuraikan pada halaman dokumentasi.

    +

    Mengatur Tujuan

    Jika semuanya bekerja dengan benar, langkah selanjutnya adalah mengatur tujuan untuk memindahkan data. Di sini, pilih konektor "Milvus".

    +

    Konektor Milvus melakukan tiga hal:

    +
      +
    • Chunking and Formatting - Memisahkan catatan Zendesk menjadi teks dan metadata. Jika teks lebih besar dari ukuran chunk yang ditentukan, catatan akan dipecah menjadi beberapa bagian yang dimuat ke dalam koleksi satu per satu. Pemecahan teks (atau chunking) dapat, misalnya, terjadi pada kasus tiket dukungan yang besar atau artikel pengetahuan. Dengan memecah teks, Anda dapat memastikan bahwa pencarian selalu memberikan hasil yang berguna.
    • +
    +

    Mari kita mulai dengan ukuran chunk 1000 token dan bidang teks body, judul, deskripsi, dan subjek, karena ini akan ada di data yang akan kita terima dari Zendesk.

    +
      +
    • Penyematan - Menggunakan model Machine Learning mengubah potongan teks yang dihasilkan oleh bagian pemrosesan menjadi penyematan vektor yang kemudian dapat Anda cari kesamaan semantiknya. Untuk membuat penyematan, Anda harus menyediakan kunci API OpenAI. Airbyte akan mengirimkan setiap potongan ke OpenAI dan menambahkan vektor yang dihasilkan ke entitas yang dimuat ke dalam cluster Milvus Anda.
    • +
    • Pengindeksan - Setelah Anda membuat vektor potongan, Anda dapat memuatnya ke dalam database. Untuk melakukannya, masukkan informasi yang Anda dapatkan ketika menyiapkan klaster dan koleksi Anda di klaster Milvus.
      Mengklik "Test and save" akan memeriksa apakah semuanya sudah tersusun dengan benar (kredensial yang valid, koleksi ada dan memiliki dimensi vektor yang sama dengan penyematan yang dikonfigurasi, dll.)
    • +
    +

    Mengatur aliran sinkronisasi aliran

    Langkah terakhir sebelum data siap mengalir adalah memilih "stream" mana yang akan disinkronkan. Sebuah stream adalah kumpulan dari record-record yang ada di source. Karena Zendesk mendukung sejumlah besar stream yang tidak relevan dengan kasus penggunaan kita, mari kita hanya memilih "tiket" dan "artikel" dan menonaktifkan yang lainnya untuk menghemat bandwidth dan memastikan hanya informasi yang relevan yang akan muncul dalam pencarian:

    Anda dapat memilih bidang mana yang akan diekstrak dari sumbernya dengan mengeklik nama aliran. Mode sinkronisasi "Incremental | Append + Deduped" berarti bahwa proses koneksi selanjutnya akan membuat Zendesk dan Milvus tetap sinkron sembari mentransfer data yang minimal (hanya artikel dan tiket yang telah berubah sejak proses sebelumnya).

    +

    Segera setelah koneksi disiapkan, Airbyte akan mulai menyinkronkan data. Diperlukan waktu beberapa menit untuk muncul di koleksi Milvus Anda.

    +

    Jika Anda memilih frekuensi replikasi, Airbyte akan berjalan secara teratur untuk menjaga koleksi Milvus Anda tetap mutakhir dengan perubahan pada artikel Zendesk dan masalah yang baru dibuat.

    +

    Alur pemeriksaan

    Anda dapat memeriksa di Milvus cluster UI bagaimana data terstruktur dalam koleksi dengan menavigasi ke taman bermain dan mengeksekusi kueri "Query Data" dengan filter yang disetel ke "_ab_stream == \"tickets\"".

    Seperti yang dapat Anda lihat pada tampilan Result, setiap record yang berasal dari Zendesk disimpan sebagai entitas yang terpisah di Milvus dengan semua metadata yang ditentukan. Potongan teks yang menjadi dasar penyematan ditampilkan sebagai properti "text" - ini adalah teks yang disematkan menggunakan OpenAI dan akan menjadi apa yang akan kita cari.

    +

    Membangun aplikasi Streamlit yang menanyakan koleksi

    Data kita sudah siap - sekarang kita perlu membangun aplikasi untuk menggunakannya. Dalam hal ini, aplikasi akan menjadi formulir dukungan sederhana bagi pengguna untuk mengirimkan kasus dukungan. Ketika pengguna menekan tombol kirim, kita akan melakukan dua hal:

    +
      +
    • Mencari tiket serupa yang dikirimkan oleh pengguna dari organisasi yang sama
    • +
    • Mencari artikel berbasis pengetahuan yang mungkin relevan dengan pengguna
    • +
    +

    Dalam kedua kasus tersebut, kita akan memanfaatkan pencarian semantik menggunakan sematan OpenAI. Untuk melakukan hal ini, deskripsi masalah yang dimasukkan pengguna juga disematkan dan digunakan untuk mengambil entitas yang serupa dari klaster Milvus. Jika ada hasil yang relevan, hasil tersebut akan ditampilkan di bawah formulir.

    +

    Menyiapkan lingkungan UI

    Anda akan membutuhkan instalasi Python lokal karena kita akan menggunakan Streamlit untuk mengimplementasikan aplikasi.

    +

    Pertama, instal Streamlit, pustaka klien Milvus, dan pustaka klien OpenAI secara lokal:

    +
    pip install streamlit pymilvus openai
    +
    +

    Untuk membuat formulir dukungan dasar, buatlah file python basic_support_form.py:

    +
    import streamlit as st
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        # TODO check for related support cases and articles
    +        st.write("Submitted!")
    +
    +

    Untuk menjalankan aplikasi Anda, gunakan Streamlit run:

    +
    streamlit run basic_support_form.py
    +
    +

    Ini akan merender formulir dasar:

    Kode untuk contoh ini juga dapat ditemukan di GitHub.

    +

    Menyiapkan layanan kueri backend

    Selanjutnya, mari kita periksa tiket terbuka yang mungkin relevan. Untuk melakukan hal ini, kita menyematkan teks yang dimasukkan pengguna menggunakan OpenAI, lalu melakukan pencarian kemiripan pada koleksi kita, memfilter tiket yang masih terbuka. Jika ada satu dengan jarak yang sangat rendah antara tiket yang disediakan dan tiket yang ada, beri tahu pengguna dan jangan kirimkan:

    +
    import streamlit as st
    +import os
    +import pymilvus
    +import openai
    +
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem?")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        import os
    +        import pymilvus
    +        import openai
    +
    +        org_id = 360033549136 # TODO Load from customer login data
    +
    +        pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
    +        collection = pymilvus.Collection("zendesk")
    +
    +        embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
    +
    +        results = collection.search(data=[embedding], anns_field="vector", param={}, limit=2, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
    +
    +        st.write(results[0])
    +        if len(results[0]) > 0 and results[0].distances[0] < 0.35:
    +            matching_ticket = results[0][0].entity
    +            st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
    +        else:
    +            st.write("Submitted!")
    +            
    +
    +

    Ada beberapa hal yang terjadi di sini:

    +
      +
    • Koneksi ke cluster Milvus sudah diatur.
    • +
    • Layanan OpenAI digunakan untuk menghasilkan penyematan deskripsi yang dimasukkan pengguna.
    • +
    • Pencarian kemiripan dilakukan, memfilter hasil berdasarkan status tiket dan id organisasi (karena hanya tiket terbuka dari organisasi yang sama yang relevan).
    • +
    • Jika ada hasil dan jarak antara vektor penyematan tiket yang ada dan teks yang baru dimasukkan berada di bawah ambang batas tertentu, panggil fakta ini.
    • +
    +

    Untuk menjalankan aplikasi baru, Anda perlu mengatur variabel lingkungan untuk OpenAI dan Milvus terlebih dahulu:

    +
    export MILVUS_TOKEN=...
    +export MILVUS_URL=https://...
    +export OPENAI_API_KEY=sk-...
    +
    +streamlit run app.py
    +
    +

    Ketika mencoba mengirimkan tiket yang sudah ada, seperti inilah hasilnya:

    Kode untuk contoh ini juga dapat ditemukan di GitHub.

    +

    Tampilkan informasi yang lebih relevan

    Seperti yang dapat Anda lihat pada keluaran debug hijau yang tersembunyi di versi final, dua tiket cocok dengan pencarian kami (dalam status baru, dari organisasi saat ini, dan dekat dengan vektor penyematan). Namun, yang pertama (relevan) memiliki peringkat yang lebih tinggi daripada yang kedua (tidak relevan dalam situasi ini), yang tercermin dalam nilai jarak yang lebih rendah. Hubungan ini ditangkap dalam vektor penyematan tanpa mencocokkan kata secara langsung, seperti dalam pencarian teks lengkap biasa.

    +

    Sebagai penutup, mari kita tampilkan informasi yang berguna setelah tiket dikirimkan untuk memberikan informasi yang relevan kepada pengguna sebanyak mungkin.

    +

    Untuk melakukan hal ini, kita akan melakukan pencarian kedua setelah tiket dikirimkan untuk mengambil artikel basis pengetahuan yang paling cocok:

    +
       ......
    +   
    +        else:
    +            # TODO Actually send out the ticket
    +            st.write("Submitted!")
    +            article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
    +            st.write(article_results[0])
    +            if len(article_results[0]) > 0:
    +                st.write("We also found some articles that might help you:")
    +                for hit in article_results[0]:
    +                    if hit.distance < 0.362:
    +                        st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
    +
    +
    +

    Jika tidak ada tiket dukungan terbuka dengan skor kemiripan yang tinggi, tiket baru akan dikirimkan dan artikel pengetahuan yang relevan akan ditampilkan di bawah ini:

    Kode untuk contoh ini juga dapat ditemukan di Github.

    +

    Kesimpulan

    Meskipun UI yang ditampilkan di sini bukanlah formulir dukungan yang sebenarnya, melainkan sebuah contoh untuk mengilustrasikan kasus penggunaan, kombinasi Airbyte dan Milvus adalah kombinasi yang sangat kuat - ini memudahkan untuk memuat teks dari berbagai macam sumber (dari basis data seperti Postgres melalui API seperti Zendesk atau GitHub hingga sumber yang sepenuhnya dibuat khusus dengan menggunakan SDK Airbyte atau pembangun konektor visual) dan mengindeksnya dalam bentuk yang disematkan di Milvus, sebuah mesin pencari vektor yang kuat dan dapat menskalakan ke data dalam jumlah yang sangat besar.

    +

    Airbyte dan Milvus adalah open source dan sepenuhnya gratis untuk digunakan pada infrastruktur Anda, dengan penawaran cloud untuk membebani operasi jika diinginkan.

    +

    Di luar kasus penggunaan pencarian semantik klasik yang diilustrasikan dalam artikel ini, pengaturan umum juga dapat digunakan untuk membangun bot obrolan penjawab pertanyaan menggunakan metode RAG (Retrieval Augmented Generation), sistem pemberi rekomendasi, atau membantu membuat iklan menjadi lebih relevan dan efisien.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.json b/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.json new file mode 100644 index 000000000..79d1d375b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus bentoml\n","import bentoml\n\nBENTO_EMBEDDING_MODEL_END_POINT = \"BENTO_EMBEDDING_MODEL_END_POINT\"\nBENTO_API_TOKEN = \"BENTO_API_TOKEN\"\n\nembedding_client = bentoml.SyncHTTPClient(\n BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN\n)\n","# naively chunk on newlines\ndef chunk_text(filename: str) -> list:\n with open(filename, \"r\") as f:\n text = f.read()\n sentences = text.split(\"\\n\")\n return sentences\n","import os\nimport requests\nimport urllib.request\n\n# set up the data source\nrepo = \"ytang07/bento_octo_milvus_RAG\"\ndirectory = \"data\"\nsave_dir = \"./city_data\"\napi_url = f\"https://api.github.com/repos/{repo}/contents/{directory}\"\n\n\nresponse = requests.get(api_url)\ndata = response.json()\n\nif not os.path.exists(save_dir):\n os.makedirs(save_dir)\n\nfor item in data:\n if item[\"type\"] == \"file\":\n file_url = item[\"download_url\"]\n file_path = os.path.join(save_dir, item[\"name\"])\n urllib.request.urlretrieve(file_url, file_path)\n","# please upload your data directory under this file's folder\ncities = os.listdir(\"city_data\")\n# store chunked text for each of the cities in a list of dicts\ncity_chunks = []\nfor city in cities:\n chunked = chunk_text(f\"city_data/{city}\")\n cleaned = []\n for chunk in chunked:\n if len(chunk) > 7:\n cleaned.append(chunk)\n mapped = {\"city_name\": city.split(\".\")[0], \"chunks\": cleaned}\n city_chunks.append(mapped)\n","def get_embeddings(texts: list) -> list:\n if len(texts) > 25:\n splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]\n embeddings = []\n for split in splits:\n embedding_split = embedding_client.encode(sentences=split)\n embeddings += embedding_split\n return embeddings\n return embedding_client.encode(\n sentences=texts,\n )\n","entries = []\nfor city_dict in city_chunks:\n # No need for the embeddings list if get_embeddings already returns a list of lists\n embedding_list = get_embeddings(city_dict[\"chunks\"]) # returns a list of lists\n # Now match texts with embeddings and city name\n for i, embedding in enumerate(embedding_list):\n entry = {\n \"embedding\": embedding,\n \"sentence\": city_dict[\"chunks\"][\n i\n ], # Assume \"chunks\" has the corresponding texts for the embeddings\n \"city\": city_dict[\"city_name\"],\n }\n entries.append(entry)\n print(entries)\n","from pymilvus import MilvusClient\n\nCOLLECTION_NAME = \"Bento_Milvus_RAG\" # random name for your collection\nDIMENSION = 384\n\n# Initialize a Milvus Lite client\nmilvus_client = MilvusClient(\"milvus_demo.db\")\n","from pymilvus import connections\n\nconnections.connect(uri=\"milvus_demo.db\")\n","from pymilvus import MilvusClient, DataType, Collection\n\n# Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n)\n\n# 3.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# prepare index parameters\nindex_params = milvus_client.prepare_index_params()\n\n# add index\nindex_params.add_index(\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n\n# create collection\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME, schema=schema, index_params=index_params\n)\n\n# Outside the loop, now you upsert all the entries at once\nmilvus_client.insert(collection_name=COLLECTION_NAME, data=entries)\n","BENTO_LLM_END_POINT = \"BENTO_LLM_END_POINT\"\n\nllm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)\n","def dorag(question: str, context: str):\n\n prompt = (\n f\"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \\n\"\n f\"The user question is {question}\"\n )\n\n results = llm_client.generate(\n max_tokens=1024,\n prompt=prompt,\n )\n\n res = \"\"\n for result in results:\n res += result\n\n return res\n","question = \"What state is Cambridge in?\"\n\n\ndef ask_a_question(question):\n embeddings = get_embeddings([question])\n res = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=embeddings, # search for the one (1) embedding returned as a list of lists\n anns_field=\"embedding\", # Search across embeddings\n limit=5, # get me the top 5 results\n output_fields=[\"sentence\"], # get the sentence/chunk and city\n )\n\n sentences = []\n for hits in res:\n for hit in hits:\n print(hit)\n sentences.append(hit[\"entity\"][\"sentence\"])\n context = \". \".join(sentences)\n return context\n\n\ncontext = ask_a_question(question=question)\nprint(context)\n","print(dorag(question=question, context=context))\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and BentoML","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) dengan Milvus dan BentoML","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-BentoML","type":1,"isActive":false},{"label":"Pendahuluan","href":"Introduction","type":2,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-begin","type":2,"isActive":false},{"label":"Menyajikan Penyematan dengan BentoML/BentoCloud","href":"Serving-Embeddings-with-BentoMLBentoCloud","type":2,"isActive":false},{"label":"Memasukkan Data ke dalam Basis Data Vektor untuk Pengambilan","href":"Inserting-Data-into-a-Vector-Database-for-Retrieval","type":2,"isActive":false},{"label":"Membuat Koleksi Milvus Lite Anda","href":"Creating-Your-Milvus-Lite-Collection","type":2,"isActive":false},{"label":"Menyiapkan LLM Anda untuk RAG","href":"Set-up-Your-LLM-for-RAG","type":2,"isActive":false},{"label":"Petunjuk LLM","href":"LLM-Instructions","type":2,"isActive":false},{"label":"Contoh RAG","href":"A-RAG-Example","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.md b/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.md new file mode 100644 index 000000000..cc9e5ac09 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_bentoml.md @@ -0,0 +1,351 @@ +--- +id: integrate_with_bentoml.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan model penyematan sumber terbuka + dan model bahasa besar di BentoCloud dengan basis data vektor Milvus untuk + membuat aplikasi Retrieval Augmented Generation (RAG). +title: Retrieval-Augmented Generation (RAG) dengan Milvus dan BentoML +--- +

    Retrieval-Augmented Generation (RAG) dengan Milvus dan BentoML

    Open In Colab +GitHub Repository

    +

    Pendahuluan

    Panduan ini mendemonstrasikan cara menggunakan model penyematan sumber terbuka dan model bahasa besar di BentoCloud dengan basis data vektor Milvus untuk membangun aplikasi RAG (Retrieval Augmented Generation). BentoCloud adalah Platform Inferensi AI untuk tim AI yang bergerak cepat, yang menawarkan infrastruktur terkelola penuh yang disesuaikan untuk inferensi model. Platform ini bekerja bersama dengan BentoML, sebuah kerangka kerja penyajian model sumber terbuka, untuk memfasilitasi pembuatan dan penerapan layanan model berkinerja tinggi dengan mudah. Dalam demo ini, kami menggunakan Milvus Lite sebagai basis data vektor, yang merupakan versi ringan dari Milvus yang dapat disematkan ke dalam aplikasi Python Anda.

    +

    Sebelum Anda mulai

    Milvus Lite tersedia di PyPI. Anda dapat menginstalnya melalui pip untuk Python 3.8+:

    +
    $ pip install -U pymilvus bentoml
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Setelah masuk ke BentoCloud, kita dapat berinteraksi dengan Layanan BentoCloud yang telah diterapkan di Deployment, dan END_POINT serta API yang sesuai berada di Playground -> Python. Anda dapat mengunduh data kota di sini.

    +

    Menyajikan Penyematan dengan BentoML/BentoCloud

    Untuk menggunakan endpoint ini, impor bentoml dan siapkan klien HTTP menggunakan SyncHTTPClient dengan menentukan endpoint dan opsional token (jika Anda mengaktifkan Endpoint Authorization di BentoCloud). Sebagai alternatif, Anda dapat menggunakan model yang sama yang disajikan melalui BentoML menggunakan repositori Sentence Transformers Embeddings.

    +
    import bentoml
    +
    +BENTO_EMBEDDING_MODEL_END_POINT = "BENTO_EMBEDDING_MODEL_END_POINT"
    +BENTO_API_TOKEN = "BENTO_API_TOKEN"
    +
    +embedding_client = bentoml.SyncHTTPClient(
    +    BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN
    +)
    +
    +

    Setelah kita terhubung ke embedding_client, kita perlu memproses data kita. Kami menyediakan beberapa fungsi untuk melakukan pemisahan dan penyematan data.

    +

    Baca file dan praproses teks menjadi daftar string.

    +
    # naively chunk on newlines
    +def chunk_text(filename: str) -> list:
    +    with open(filename, "r") as f:
    +        text = f.read()
    +    sentences = text.split("\n")
    +    return sentences
    +
    +

    Pertama kita perlu mengunduh data kota.

    +
    import os
    +import requests
    +import urllib.request
    +
    +# set up the data source
    +repo = "ytang07/bento_octo_milvus_RAG"
    +directory = "data"
    +save_dir = "./city_data"
    +api_url = f"https://api.github.com/repos/{repo}/contents/{directory}"
    +
    +
    +response = requests.get(api_url)
    +data = response.json()
    +
    +if not os.path.exists(save_dir):
    +    os.makedirs(save_dir)
    +
    +for item in data:
    +    if item["type"] == "file":
    +        file_url = item["download_url"]
    +        file_path = os.path.join(save_dir, item["name"])
    +        urllib.request.urlretrieve(file_url, file_path)
    +
    +

    Selanjutnya, kita memproses setiap file yang kita miliki.

    +
    # please upload your data directory under this file's folder
    +cities = os.listdir("city_data")
    +# store chunked text for each of the cities in a list of dicts
    +city_chunks = []
    +for city in cities:
    +    chunked = chunk_text(f"city_data/{city}")
    +    cleaned = []
    +    for chunk in chunked:
    +        if len(chunk) > 7:
    +            cleaned.append(chunk)
    +    mapped = {"city_name": city.split(".")[0], "chunks": cleaned}
    +    city_chunks.append(mapped)
    +
    +

    Membagi daftar string menjadi daftar embedding, masing-masing mengelompokkan 25 string teks.

    +
    def get_embeddings(texts: list) -> list:
    +    if len(texts) > 25:
    +        splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]
    +        embeddings = []
    +        for split in splits:
    +            embedding_split = embedding_client.encode(sentences=split)
    +            embeddings += embedding_split
    +        return embeddings
    +    return embedding_client.encode(
    +        sentences=texts,
    +    )
    +
    +

    Sekarang, kita perlu mencocokkan embedding dan potongan teks. Karena daftar sematan dan daftar kalimat harus sesuai dengan indeks, kita dapat enumerate melalui kedua daftar tersebut untuk mencocokkannya.

    +
    entries = []
    +for city_dict in city_chunks:
    +    # No need for the embeddings list if get_embeddings already returns a list of lists
    +    embedding_list = get_embeddings(city_dict["chunks"])  # returns a list of lists
    +    # Now match texts with embeddings and city name
    +    for i, embedding in enumerate(embedding_list):
    +        entry = {
    +            "embedding": embedding,
    +            "sentence": city_dict["chunks"][
    +                i
    +            ],  # Assume "chunks" has the corresponding texts for the embeddings
    +            "city": city_dict["city_name"],
    +        }
    +        entries.append(entry)
    +    print(entries)
    +
    +

    Memasukkan Data ke dalam Basis Data Vektor untuk Pengambilan

    Dengan penyematan dan data yang telah disiapkan, kita dapat memasukkan vektor bersama dengan metadata ke dalam Milvus Lite untuk pencarian vektor nantinya. Langkah pertama pada bagian ini adalah memulai sebuah klien dengan menghubungkan ke Milvus Lite. Kita cukup mengimpor modul MilvusClient dan menginisialisasi klien Milvus Lite yang terhubung ke basis data vektor Milvus Lite Anda. Ukuran dimensi berasal dari ukuran model embedding, contohnya model Sentence Transformer all-MiniLM-L6-v2 menghasilkan vektor berdimensi 384.

    +
    from pymilvus import MilvusClient
    +
    +COLLECTION_NAME = "Bento_Milvus_RAG"  # random name for your collection
    +DIMENSION = 384
    +
    +# Initialize a Milvus Lite client
    +milvus_client = MilvusClient("milvus_demo.db")
    +
    +
    +

    Sedangkan untuk argumen MilvusClient:

    +
      +
    • Mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Atau dengan koneksi lama.connect API (tidak disarankan):

    +
    from pymilvus import connections
    +
    +connections.connect(uri="milvus_demo.db")
    +
    +

    Membuat Koleksi Milvus Lite Anda

    Membuat koleksi menggunakan Milvus Lite melibatkan dua langkah: pertama, mendefinisikan skema, dan kedua, mendefinisikan indeks. Untuk bagian ini, kita membutuhkan satu modul: DataType memberi tahu kita jenis data apa yang akan ada di dalam sebuah field. Kita juga perlu menggunakan dua fungsi untuk membuat skema dan menambahkan field. create_schema(): membuat skema koleksi, add_field(): menambahkan sebuah field ke dalam skema koleksi.

    +
    from pymilvus import MilvusClient, DataType, Collection
    +
    +# Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +)
    +
    +# 3.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    Sekarang kita telah membuat skema dan berhasil mendefinisikan field data, kita perlu mendefinisikan indeks. Dalam hal pencarian, sebuah "indeks" mendefinisikan bagaimana kita akan memetakan data kita untuk diambil. Kita menggunakan pilihan default AUTOINDEX untuk mengindeks data kita untuk proyek ini.

    +

    Selanjutnya, kita membuat koleksi dengan nama, skema, dan indeks yang telah diberikan sebelumnya. Terakhir, kita memasukkan data yang telah diproses sebelumnya.

    +
    # prepare index parameters
    +index_params = milvus_client.prepare_index_params()
    +
    +# add index
    +index_params.add_index(
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +# create collection
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME, schema=schema, index_params=index_params
    +)
    +
    +# Outside the loop, now you upsert all the entries at once
    +milvus_client.insert(collection_name=COLLECTION_NAME, data=entries)
    +
    +

    Menyiapkan LLM Anda untuk RAG

    Untuk membangun aplikasi RAG, kita perlu menerapkan LLM di BentoCloud. Mari kita gunakan LLM Llama3 terbaru. Setelah aktif dan berjalan, cukup salin titik akhir dan token layanan model ini dan siapkan klien untuknya.

    +
    BENTO_LLM_END_POINT = "BENTO_LLM_END_POINT"
    +
    +llm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)
    +
    +

    Petunjuk LLM

    Sekarang, kita menyiapkan instruksi LLM dengan prompt, konteks, dan pertanyaan. Berikut ini adalah fungsi yang berperilaku sebagai LLM dan kemudian mengembalikan keluaran dari klien dalam format string.

    +
    def dorag(question: str, context: str):
    +
    +    prompt = (
    +        f"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \n"
    +        f"The user question is {question}"
    +    )
    +
    +    results = llm_client.generate(
    +        max_tokens=1024,
    +        prompt=prompt,
    +    )
    +
    +    res = ""
    +    for result in results:
    +        res += result
    +
    +    return res
    +
    +

    Contoh RAG

    Sekarang kita siap untuk mengajukan pertanyaan. Fungsi ini hanya mengambil sebuah pertanyaan dan kemudian melakukan RAG untuk menghasilkan konteks yang relevan dari informasi latar belakang. Kemudian, kita mengoper konteks dan pertanyaan ke dorag() dan mendapatkan hasilnya.

    +
    question = "What state is Cambridge in?"
    +
    +
    +def ask_a_question(question):
    +    embeddings = get_embeddings([question])
    +    res = milvus_client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=embeddings,  # search for the one (1) embedding returned as a list of lists
    +        anns_field="embedding",  # Search across embeddings
    +        limit=5,  # get me the top 5 results
    +        output_fields=["sentence"],  # get the sentence/chunk and city
    +    )
    +
    +    sentences = []
    +    for hits in res:
    +        for hit in hits:
    +            print(hit)
    +            sentences.append(hit["entity"]["sentence"])
    +    context = ". ".join(sentences)
    +    return context
    +
    +
    +context = ask_a_question(question=question)
    +print(context)
    +
    +

    Menerapkan RAG

    +
    print(dorag(question=question, context=context))
    +
    +

    Untuk contoh pertanyaan yang menanyakan di negara bagian mana Cambridge berada, kita dapat mencetak seluruh respons dari BentoML. Namun, jika kita meluangkan waktu untuk menguraikannya, hasilnya akan terlihat lebih baik, dan akan memberi tahu kita bahwa Cambridge terletak di Massachusetts.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_camel.json b/localization/v2.5.x/site/id/integrations/integrate_with_camel.json new file mode 100644 index 000000000..58ce68586 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_camel.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U \"camel-ai[all]\" pymilvus\n","import os\nimport requests\n\nos.makedirs(\"local_data\", exist_ok=True)\n\nurl = \"https://arxiv.org/pdf/2303.17760.pdf\"\nresponse = requests.get(url)\nwith open(\"local_data/camel paper.pdf\", \"wb\") as file:\n file.write(response.content)\n","os.environ[\"OPENAI_API_KEY\"] = \"Your Key\"\n","from camel.embeddings import OpenAIEmbedding\n\nembedding_instance = OpenAIEmbedding()\n","from camel.storages import MilvusStorage\n\nstorage_instance = MilvusStorage(\n vector_dim=embedding_instance.get_output_dim(),\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n collection_name=\"camel_paper\",\n)\n","from camel.retrievers import VectorRetriever\n\nvector_retriever = VectorRetriever(\n embedding_model=embedding_instance, storage=storage_instance\n)\n","vector_retriever.process(content_input_path=\"local_data/camel paper.pdf\")\n","retrieved_info = vector_retriever.query(query=\"What is CAMEL?\", top_k=1)\nprint(retrieved_info)\n","retrieved_info_irrelevant = vector_retriever.query(\n query=\"Compared with dumpling and rice, which should I take for dinner?\", top_k=1\n)\n\nprint(retrieved_info_irrelevant)\n","from camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\nauto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n)\n\nretrieved_info = auto_retriever.run_vector_retriever(\n query=\"What is CAMEL-AI\",\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n top_k=1,\n return_detailed_info=True,\n)\n\nprint(retrieved_info)\n","from camel.agents import ChatAgent\nfrom camel.messages import BaseMessage\nfrom camel.types import RoleType\nfrom camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\n\ndef single_agent(query: str) -> str:\n # Set agent role\n assistant_sys_msg = BaseMessage(\n role_name=\"Assistant\",\n role_type=RoleType.ASSISTANT,\n meta_dict=None,\n content=\"\"\"You are a helpful assistant to answer question,\n I will give you the Original Query and Retrieved Context,\n answer the Original Query based on the Retrieved Context,\n if you can't answer the question just say I don't know.\"\"\",\n )\n\n # Add auto retriever\n auto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n )\n\n retrieved_info = auto_retriever.run_vector_retriever(\n query=query,\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n # vector_storage_local_path=\"storage_default_run\",\n top_k=1,\n return_detailed_info=True,\n )\n\n # Pass the retrieved infomation to agent\n user_msg = BaseMessage.make_user_message(role_name=\"User\", content=retrieved_info)\n agent = ChatAgent(assistant_sys_msg)\n\n # Get response\n assistant_response = agent.step(user_msg)\n return assistant_response.msg.content\n\n\nprint(single_agent(\"What is CAMEL-AI\"))\n","from typing import List\nfrom colorama import Fore\n\nfrom camel.agents.chat_agent import FunctionCallingRecord\nfrom camel.configs import ChatGPTConfig\nfrom camel.functions import (\n MATH_FUNCS,\n RETRIEVAL_FUNCS,\n)\nfrom camel.societies import RolePlaying\nfrom camel.types import ModelType\nfrom camel.utils import print_text_animated\n\n\ndef role_playing_with_rag(\n task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10\n) -> None:\n task_prompt = task_prompt\n\n user_model_config = ChatGPTConfig(temperature=0.0)\n\n function_list = [\n *MATH_FUNCS,\n *RETRIEVAL_FUNCS,\n ]\n assistant_model_config = ChatGPTConfig(\n tools=function_list,\n temperature=0.0,\n )\n\n role_play_session = RolePlaying(\n assistant_role_name=\"Searcher\",\n user_role_name=\"Professor\",\n assistant_agent_kwargs=dict(\n model_type=model_type,\n model_config=assistant_model_config,\n tools=function_list,\n ),\n user_agent_kwargs=dict(\n model_type=model_type,\n model_config=user_model_config,\n ),\n task_prompt=task_prompt,\n with_task_specify=False,\n )\n\n print(\n Fore.GREEN\n + f\"AI Assistant sys message:\\n{role_play_session.assistant_sys_msg}\\n\"\n )\n print(Fore.BLUE + f\"AI User sys message:\\n{role_play_session.user_sys_msg}\\n\")\n\n print(Fore.YELLOW + f\"Original task prompt:\\n{task_prompt}\\n\")\n print(\n Fore.CYAN\n + f\"Specified task prompt:\\n{role_play_session.specified_task_prompt}\\n\"\n )\n print(Fore.RED + f\"Final task prompt:\\n{role_play_session.task_prompt}\\n\")\n\n n = 0\n input_msg = role_play_session.init_chat()\n while n < chat_turn_limit:\n n += 1\n assistant_response, user_response = role_play_session.step(input_msg)\n\n if assistant_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI Assistant terminated. Reason: \"\n f\"{assistant_response.info['termination_reasons']}.\"\n )\n )\n break\n if user_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI User terminated. \"\n f\"Reason: {user_response.info['termination_reasons']}.\"\n )\n )\n break\n\n # Print output from the user\n print_text_animated(Fore.BLUE + f\"AI User:\\n\\n{user_response.msg.content}\\n\")\n\n # Print output from the assistant, including any function\n # execution information\n print_text_animated(Fore.GREEN + \"AI Assistant:\")\n tool_calls: List[FunctionCallingRecord] = assistant_response.info[\"tool_calls\"]\n for func_record in tool_calls:\n print_text_animated(f\"{func_record}\")\n print_text_animated(f\"{assistant_response.msg.content}\\n\")\n\n if \"CAMEL_TASK_DONE\" in user_response.msg.content:\n break\n\n input_msg = assistant_response.msg\n","role_playing_with_rag(\n task_prompt=\"\"\"What is the main termination reasons for AI Society\n dataset, how many number of messages did camel decided to\n limit, what's the value plus 100? You should refer to the\n content in path camel/local_data/camel paper.pdf\"\"\"\n)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Camel","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) dengan Milvus dan Camel","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Camel","type":1,"isActive":false},{"label":"Memuat Data","href":"Load-Data","type":2,"isActive":false},{"label":"1. RAG yang disesuaikan","href":"1-Customized-RAG","type":2,"isActive":false},{"label":"2. RAG otomatis","href":"2-Auto-RAG","type":2,"isActive":false},{"label":"3. Agen Tunggal dengan RAG Otomatis","href":"3-Single-Agent-with-Auto-RAG","type":2,"isActive":false},{"label":"4. Bermain peran dengan Auto RAG","href":"4-Role-playing-with-Auto-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_camel.md b/localization/v2.5.x/site/id/integrations/integrate_with_camel.md new file mode 100644 index 000000000..0c29a055c --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_camel.md @@ -0,0 +1,474 @@ +--- +id: integrate_with_camel.md +summary: >- + Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented + Generation (RAG) menggunakan CAMEL dan Milvus. +title: Retrieval-Augmented Generation (RAG) dengan Milvus dan Camel +--- +

    Retrieval-Augmented Generation (RAG) dengan Milvus dan Camel

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented Generation (RAG) dengan menggunakan CAMEL dan Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    CAMEL adalah sebuah kerangka kerja multi-agen. Milvus adalah basis data vektor sumber terbuka paling canggih di dunia, yang dibangun untuk mendukung pencarian kemiripan dan aplikasi AI.

    +

    Dalam buku catatan ini, kami menunjukkan penggunaan CAMEL Retrieve Module dengan cara yang disesuaikan dan cara otomatis. Kami juga akan menunjukkan cara menggabungkan AutoRetriever dengan ChatAgent, dan selanjutnya menggabungkan AutoRetriever dengan RolePlaying dengan menggunakan Function Calling.

    +

    Termasuk 4 bagian utama:

    +
      +
    • RAG yang disesuaikan
    • +
    • RAG Otomatis
    • +
    • Agen Tunggal dengan RAG Otomatis
    • +
    • Bermain peran dengan RAG Otomatis
    • +
    +

    Memuat Data

    Pertama-tama, mari kita muat kertas CAMEL dari https://arxiv.org/pdf/2303.17760.pdf. Ini akan menjadi data contoh lokal kita.

    +
    $ pip install -U "camel-ai[all]" pymilvus
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +
    import os
    +import requests
    +
    +os.makedirs("local_data", exist_ok=True)
    +
    +url = "https://arxiv.org/pdf/2303.17760.pdf"
    +response = requests.get(url)
    +with open("local_data/camel paper.pdf", "wb") as file:
    +    file.write(response.content)
    +
    +

    1. RAG yang disesuaikan

    Pada bagian ini kita akan mengatur pipeline RAG yang telah disesuaikan, kita akan menggunakan VectorRetriever sebagai contoh. Kita akan mengatur OpenAIEmbedding sebagai model embeddding dan MilvusStorage sebagai penyimpanannya.

    +

    Untuk mengatur embedding OpenAI, kita perlu mengatur OPENAI_API_KEY di bawah ini.

    +
    os.environ["OPENAI_API_KEY"] = "Your Key"
    +
    +

    Impor dan atur instance embedding:

    +
    from camel.embeddings import OpenAIEmbedding
    +
    +embedding_instance = OpenAIEmbedding()
    +
    +

    Impor dan atur instance penyimpanan vektor:

    +
    from camel.storages import MilvusStorage
    +
    +storage_instance = MilvusStorage(
    +    vector_dim=embedding_instance.get_output_dim(),
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    collection_name="camel_paper",
    +)
    +
    +
    +

    Untuk url_and_api_key:

    +
      +
    • Menggunakan file lokal, misalnya./milvus.db, sebagai URI koneksi Milvus adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat menyiapkan server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai url Anda.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri koneksi dan token, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +
    +

    Impor dan atur instance retriever:

    +

    Secara default, similarity_threshold diatur ke 0,75. Anda dapat mengubahnya.

    +
    from camel.retrievers import VectorRetriever
    +
    +vector_retriever = VectorRetriever(
    +    embedding_model=embedding_instance, storage=storage_instance
    +)
    +
    +

    Kami menggunakan Unstructured Module terintegrasi untuk membagi konten menjadi potongan-potongan kecil, konten akan dipecah secara otomatis dengan fungsi chunk_by_title, karakter maksimum untuk setiap potongan adalah 500 karakter, yang merupakan panjang yang sesuai untuk OpenAIEmbedding. Semua teks dalam potongan akan disematkan dan disimpan ke instance penyimpanan vektor, ini akan memakan waktu, harap tunggu.

    +
    vector_retriever.process(content_input_path="local_data/camel paper.pdf")
    +
    +
    [nltk_data] Downloading package punkt to /root/nltk_data...
    +[nltk_data]   Unzipping tokenizers/punkt.zip.
    +[nltk_data] Downloading package averaged_perceptron_tagger to
    +[nltk_data]     /root/nltk_data...
    +[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
    +
    +

    Sekarang kita dapat mengambil informasi dari penyimpanan vektor dengan memberikan query. Secara default, ini akan mengembalikan konten teks dari 1 chunk teratas dengan nilai kemiripan Cosine tertinggi, dan nilai kemiripan harus lebih tinggi dari 0,75 untuk memastikan konten yang diambil relevan dengan kueri. Anda juga dapat mengubah nilai top_k.

    +

    Daftar string yang dikembalikan meliputi:

    +
      +
    • skor kemiripan
    • +
    • jalur konten
    • +
    • metadata
    • +
    • teks
    • +
    +
    retrieved_info = vector_retriever.query(query="What is CAMEL?", top_k=1)
    +print(retrieved_info)
    +
    +
    [{'similarity score': '0.8321675658226013', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 45}, 'text': 'CAMEL Data and Code License The intended purpose and licensing of CAMEL is solely for research use. The source code is licensed under Apache 2.0. The datasets are licensed under CC BY NC 4.0, which permits only non-commercial usage. It is advised that any models trained using the dataset should not be utilized for anything other than research purposes.\n\n45'}]
    +
    +

    Mari kita coba kueri yang tidak relevan:

    +
    retrieved_info_irrelevant = vector_retriever.query(
    +    query="Compared with dumpling and rice, which should I take for dinner?", top_k=1
    +)
    +
    +print(retrieved_info_irrelevant)
    +
    +
    [{'text': 'No suitable information retrieved from local_data/camel paper.pdf                 with similarity_threshold = 0.75.'}]
    +
    +

    2. RAG otomatis

    Pada bagian ini kita akan menjalankan AutoRetriever dengan pengaturan default. Ini menggunakan OpenAIEmbedding sebagai model penyematan default dan Milvus sebagai penyimpanan vektor default.

    +

    Yang perlu Anda lakukan adalah:

    +
      +
    • Tetapkan jalur masukan konten, yang dapat berupa jalur lokal atau url jarak jauh
    • +
    • Tetapkan url jarak jauh dan kunci api untuk Milvus
    • +
    • Berikan kueri
    • +
    +

    Pipeline Auto RAG akan membuat koleksi untuk jalur input konten yang diberikan, nama koleksi akan diatur secara otomatis berdasarkan nama jalur input konten, jika koleksi tersebut ada, maka akan dilakukan pengambilan secara langsung.

    +
    from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +auto_retriever = AutoRetriever(
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    storage_type=StorageType.MILVUS,
    +    embedding_model=embedding_instance,
    +)
    +
    +retrieved_info = auto_retriever.run_vector_retriever(
    +    query="What is CAMEL-AI",
    +    content_input_paths=[
    +        "local_data/camel paper.pdf",  # example local path
    +        "https://www.camel-ai.org/",  # example remote url
    +    ],
    +    top_k=1,
    +    return_detailed_info=True,
    +)
    +
    +print(retrieved_info)
    +
    +
    Original Query:
    +{What is CAMEL-AI}
    +Retrieved Context:
    +{'similarity score': '0.8252888321876526', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 7}, 'text': ' Section 3.2, to simulate assistant-user cooperation. For our analysis, we set our attention on AI Society setting. We also gathered conversational data, named CAMEL AI Society and CAMEL Code datasets and problem-solution pairs data named CAMEL Math and CAMEL Science and analyzed and evaluated their quality. Moreover, we will discuss potential extensions of our framework and highlight both the risks and opportunities that future AI society might present.'}
    +{'similarity score': '0.8378663659095764', 'content path': 'https://www.camel-ai.org/', 'metadata': {'filetype': 'text/html', 'languages': ['eng'], 'page_number': 1, 'url': 'https://www.camel-ai.org/', 'link_urls': ['#h.3f4tphhd9pn8', 'https://join.slack.com/t/camel-ai/shared_invite/zt-2g7xc41gy-_7rcrNNAArIP6sLQqldkqQ', 'https://discord.gg/CNcNpquyDc'], 'link_texts': [None, None, None], 'emphasized_text_contents': ['Mission', 'CAMEL-AI.org', 'is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.', 'Join us via', 'Slack', 'Discord', 'or'], 'emphasized_text_tags': ['span', 'span', 'span', 'span', 'span', 'span', 'span']}, 'text': 'Mission\n\nCAMEL-AI.org is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.\n\nJoin us via\n\nSlack\n\nDiscord\n\nor'}
    +
    +

    3. Agen Tunggal dengan RAG Otomatis

    Pada bagian ini kami akan menunjukkan cara menggabungkan AutoRetriever dengan satu ChatAgent.

    +

    Mari kita atur sebuah fungsi agent, di dalam fungsi ini kita bisa mendapatkan respon dengan memberikan query ke agent ini.

    +
    from camel.agents import ChatAgent
    +from camel.messages import BaseMessage
    +from camel.types import RoleType
    +from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +
    +def single_agent(query: str) -> str:
    +    # Set agent role
    +    assistant_sys_msg = BaseMessage(
    +        role_name="Assistant",
    +        role_type=RoleType.ASSISTANT,
    +        meta_dict=None,
    +        content="""You are a helpful assistant to answer question,
    +         I will give you the Original Query and Retrieved Context,
    +        answer the Original Query based on the Retrieved Context,
    +        if you can't answer the question just say I don't know.""",
    +    )
    +
    +    # Add auto retriever
    +    auto_retriever = AutoRetriever(
    +        url_and_api_key=(
    +            "./milvus_demo.db",  # Your Milvus connection URI
    +            "",  # Your Milvus token
    +        ),
    +        storage_type=StorageType.MILVUS,
    +        embedding_model=embedding_instance,
    +    )
    +
    +    retrieved_info = auto_retriever.run_vector_retriever(
    +        query=query,
    +        content_input_paths=[
    +            "local_data/camel paper.pdf",  # example local path
    +            "https://www.camel-ai.org/",  # example remote url
    +        ],
    +        # vector_storage_local_path="storage_default_run",
    +        top_k=1,
    +        return_detailed_info=True,
    +    )
    +
    +    # Pass the retrieved infomation to agent
    +    user_msg = BaseMessage.make_user_message(role_name="User", content=retrieved_info)
    +    agent = ChatAgent(assistant_sys_msg)
    +
    +    # Get response
    +    assistant_response = agent.step(user_msg)
    +    return assistant_response.msg.content
    +
    +
    +print(single_agent("What is CAMEL-AI"))
    +
    +
    CAMEL-AI is an open-source community dedicated to the study of autonomous and communicative agents. It provides, implements, and supports various types of agents, tasks, prompts, models, datasets, and simulated environments to facilitate research in this field.
    +
    +

    4. Bermain peran dengan Auto RAG

    Pada bagian ini kami akan menunjukkan cara menggabungkan RETRIEVAL_FUNCS dengan RolePlaying dengan menggunakan Function Calling.

    +
    from typing import List
    +from colorama import Fore
    +
    +from camel.agents.chat_agent import FunctionCallingRecord
    +from camel.configs import ChatGPTConfig
    +from camel.functions import (
    +    MATH_FUNCS,
    +    RETRIEVAL_FUNCS,
    +)
    +from camel.societies import RolePlaying
    +from camel.types import ModelType
    +from camel.utils import print_text_animated
    +
    +
    +def role_playing_with_rag(
    +    task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10
    +) -> None:
    +    task_prompt = task_prompt
    +
    +    user_model_config = ChatGPTConfig(temperature=0.0)
    +
    +    function_list = [
    +        *MATH_FUNCS,
    +        *RETRIEVAL_FUNCS,
    +    ]
    +    assistant_model_config = ChatGPTConfig(
    +        tools=function_list,
    +        temperature=0.0,
    +    )
    +
    +    role_play_session = RolePlaying(
    +        assistant_role_name="Searcher",
    +        user_role_name="Professor",
    +        assistant_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=assistant_model_config,
    +            tools=function_list,
    +        ),
    +        user_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=user_model_config,
    +        ),
    +        task_prompt=task_prompt,
    +        with_task_specify=False,
    +    )
    +
    +    print(
    +        Fore.GREEN
    +        + f"AI Assistant sys message:\n{role_play_session.assistant_sys_msg}\n"
    +    )
    +    print(Fore.BLUE + f"AI User sys message:\n{role_play_session.user_sys_msg}\n")
    +
    +    print(Fore.YELLOW + f"Original task prompt:\n{task_prompt}\n")
    +    print(
    +        Fore.CYAN
    +        + f"Specified task prompt:\n{role_play_session.specified_task_prompt}\n"
    +    )
    +    print(Fore.RED + f"Final task prompt:\n{role_play_session.task_prompt}\n")
    +
    +    n = 0
    +    input_msg = role_play_session.init_chat()
    +    while n < chat_turn_limit:
    +        n += 1
    +        assistant_response, user_response = role_play_session.step(input_msg)
    +
    +        if assistant_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI Assistant terminated. Reason: "
    +                    f"{assistant_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +        if user_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI User terminated. "
    +                    f"Reason: {user_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +
    +        # Print output from the user
    +        print_text_animated(Fore.BLUE + f"AI User:\n\n{user_response.msg.content}\n")
    +
    +        # Print output from the assistant, including any function
    +        # execution information
    +        print_text_animated(Fore.GREEN + "AI Assistant:")
    +        tool_calls: List[FunctionCallingRecord] = assistant_response.info["tool_calls"]
    +        for func_record in tool_calls:
    +            print_text_animated(f"{func_record}")
    +        print_text_animated(f"{assistant_response.msg.content}\n")
    +
    +        if "CAMEL_TASK_DONE" in user_response.msg.content:
    +            break
    +
    +        input_msg = assistant_response.msg
    +
    +

    Jalankan role-playing dengan fungsi retriever yang telah ditentukan:

    +
    role_playing_with_rag(
    +    task_prompt="""What is the main termination reasons for AI Society
    +                   dataset, how many number of messages did camel decided to
    +                   limit, what's the value plus 100? You should refer to the
    +                   content in path camel/local_data/camel paper.pdf"""
    +)
    +
    +
    AI Assistant sys message:
    +BaseMessage(role_name='Searcher', role_type=<RoleType.ASSISTANT: 'assistant'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content="===== RULES OF ASSISTANT =====\nNever forget you are a Searcher and I am a Professor. Never flip roles! Never instruct me!\nWe share a common interest in collaborating to successfully complete a task.\nYou must help me to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?. Never forget our task!\nI must instruct you based on your expertise and my needs to complete the task.\n\nI must give you one instruction at a time.\nYou must write a specific solution that appropriately solves the requested instruction and explain your solutions.\nYou must decline my instruction honestly if you cannot perform the instruction due to physical, moral, legal reasons or your capability and explain the reasons.\nUnless I say the task is completed, you should always start with:\n\nSolution: <YOUR_SOLUTION>\n\n<YOUR_SOLUTION> should be very specific, include detailed explanations and provide preferable detailed implementations and examples and lists for task-solving.\nAlways end <YOUR_SOLUTION> with: Next request.")
    +
    +AI User sys message:
    +BaseMessage(role_name='Professor', role_type=<RoleType.USER: 'user'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content='===== RULES OF USER =====\nNever forget you are a Professor and I am a Searcher. Never flip roles! You will always instruct me.\nWe share a common interest in collaborating to successfully complete a task.\nI must help you to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what\'s the value plus 100?. Never forget our task!\nYou must instruct me based on my expertise and your needs to solve the task ONLY in the following two ways:\n\n1. Instruct with a necessary input:\nInstruction: <YOUR_INSTRUCTION>\nInput: <YOUR_INPUT>\n\n2. Instruct without any input:\nInstruction: <YOUR_INSTRUCTION>\nInput: None\n\nThe "Instruction" describes a task or question. The paired "Input" provides further context or information for the requested "Instruction".\n\nYou must give me one instruction at a time.\nI must write a response that appropriately solves the requested instruction.\nI must decline your instruction honestly if I cannot perform the instruction due to physical, moral, legal reasons or my capability and explain the reasons.\nYou should instruct me not ask me questions.\nNow you must start to instruct me using the two ways described above.\nDo not add anything else other than your instruction and the optional corresponding input!\nKeep giving me instructions and necessary inputs until you think the task is completed.\nWhen the task is completed, you must only reply with a single word <CAMEL_TASK_DONE>.\nNever say <CAMEL_TASK_DONE> unless my responses have solved your task.')
    +
    +Original task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +Specified task prompt:
    +None
    +
    +Final task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +
    +
    +AI User:
    +
    +Instruction: Provide a summary of the main termination reasons in the AI Society dataset.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: local_retriever
    +    Args: {'query': 'main termination reasons for AI Society dataset'}
    +    Result: Original Query:
    +{main termination reasons for AI Society dataset}
    +Retrieved Context:
    +Next we examine the conversation termination reasons for both AI Society and Code datasets. As can be seen in Figure 8, the main termination reasons for AI Society dataset is Assistant Instruct whereas for Code it is Token Limit. The latter is expected as the since responses that contain code tend to be long. It is also interesting to note that in both datasets, the termination due to Maximum Number of Messages is low indicating that the limit of 40 maximum messages is reasonable. Our decision t
    +
    +Solution: The main termination reason for the AI Society dataset is "Assistant Instruct." This indicates that conversations in the AI Society dataset typically end when the assistant is instructed to terminate the conversation.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Identify the number of messages that the camel decided to limit in the context provided.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Solution: The context provided from the local retriever indicates that the camel decided to limit the number of messages to a maximum of 40 messages. This is mentioned in the retrieved context where it states that the termination due to Maximum Number of Messages is low, indicating that the limit of 40 maximum messages is reasonable.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Calculate the value of the message limit plus 100.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: add
    +    Args: {'a': 40, 'b': 100}
    +    Result: 140
    +
    +Solution: The value of the message limit plus 100 is 140.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +CAMEL_TASK_DONE
    +
    +
    +AI Assistant:
    +
    +Solution: Understood, the task is completed.
    +
    +Next request.
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_cohere.json b/localization/v2.5.x/site/id/integrations/integrate_with_cohere.json new file mode 100644 index 000000000..943ebbaf7 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus cohere pandas numpy tqdm\n","import cohere\nimport pandas\nimport numpy as np\nfrom tqdm import tqdm\nfrom pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility\n","FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json' # The SQuAD dataset url\nCOLLECTION_NAME = 'question_answering_db' # Collection name\nDIMENSION = 1024 # Embeddings size, cohere embeddings default to 4096 with the large model\nCOUNT = 5000 # How many questions to embed and insert into Milvus\nBATCH_SIZE = 96 # How large of batches to use for embedding and insertion\nMILVUS_HOST = 'localhost' # Milvus server URI\nMILVUS_PORT = '19530'\nCOHERE_API_KEY = 'replace-this-with-the-cohere-api-key' # API key obtained from Cohere\n","# Download the dataset\ndataset = pandas.read_json(FILE)\n\n# Clean up the dataset by grabbing all the question answer pairs\nsimplified_records = []\nfor x in dataset['data']:\n for y in x['paragraphs']:\n for z in y['qas']:\n if len(z['answers']) != 0:\n simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})\n\n# Grab the amount of records based on COUNT\nsimplified_records = pandas.DataFrame.from_records(simplified_records)\nsimplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)\n\n# Check the length of the cleaned dataset matches count\nprint(len(simplified_records))\n","5000\n","# Connect to Milvus Database\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n\n# Remove collection if it already exists\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n\n# Create collection which includes the id, title, and embedding.\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n\n# Create an IVF_FLAT index for collection.\nindex_params = {\n 'metric_type':'IP',\n 'index_type':\"IVF_FLAT\",\n 'params':{\"nlist\": 1024}\n}\ncollection.create_index(field_name=\"original_question_embedding\", index_params=index_params)\ncollection.load()\n","# Set up a co:here client.\ncohere_client = cohere.Client(COHERE_API_KEY)\n\n# Extract embeddings from questions using Cohere\ndef embed(texts, input_type):\n res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)\n return res.embeddings\n\n# Insert each question, answer, and qustion embedding\ntotal = pandas.DataFrame()\nfor batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):\n questions = batch['question'].tolist()\n embeddings = embed(questions, \"search_document\")\n \n data = [\n {\n 'original_question': x,\n 'answer': batch['answer'].tolist()[i],\n 'original_question_embedding': embeddings[i]\n } for i, x in enumerate(questions)\n ]\n\n collection.insert(data=data)\n\ntime.sleep(10)\n","# Search the cluster for an answer to a question text\ndef search(text, top_k = 5):\n\n # AUTOINDEX does not require any search params \n search_params = {}\n\n results = collection.search(\n data = embed([text], \"search_query\"), # Embeded the question\n anns_field='original_question_embedding',\n param=search_params,\n limit = top_k, # Limit to top_k results per search\n output_fields=['original_question', 'answer'] # Include the original question and answer in the result\n )\n\n distances = results[0].distances\n entities = [ x.entity.to_dict()['entity'] for x in results[0] ]\n\n ret = [ {\n \"answer\": x[1][\"answer\"],\n \"distance\": x[0],\n \"original_question\": x[1]['original_question']\n } for x in zip(distances, entities)]\n\n return ret\n\n# Ask these questions\nsearch_questions = ['What kills bacteria?', 'What\\'s the biggest dog?']\n\n# Print out the results in order of [answer, similarity score, original question]\n\nret = [ { \"question\": x, \"candidates\": search(x) } for x in search_questions ]\n","# Output\n#\n# [\n# {\n# \"question\": \"What kills bacteria?\",\n# \"candidates\": [\n# {\n# \"answer\": \"farming\",\n# \"distance\": 0.6261022090911865,\n# \"original_question\": \"What makes bacteria resistant to antibiotic treatment?\"\n# },\n# {\n# \"answer\": \"Phage therapy\",\n# \"distance\": 0.6093736886978149,\n# \"original_question\": \"What has been talked about to treat resistant bacteria?\"\n# },\n# {\n# \"answer\": \"oral contraceptives\",\n# \"distance\": 0.5902313590049744,\n# \"original_question\": \"In therapy, what does the antibacterial interact with?\"\n# },\n# {\n# \"answer\": \"slowing down the multiplication of bacteria or killing the bacteria\",\n# \"distance\": 0.5874154567718506,\n# \"original_question\": \"How do antibiotics work?\"\n# },\n# {\n# \"answer\": \"in intensive farming to promote animal growth\",\n# \"distance\": 0.5667208433151245,\n# \"original_question\": \"Besides in treating human disease where else are antibiotics used?\"\n# }\n# ]\n# },\n# {\n# \"question\": \"What's the biggest dog?\",\n# \"candidates\": [\n# {\n# \"answer\": \"English Mastiff\",\n# \"distance\": 0.7875324487686157,\n# \"original_question\": \"What breed was the largest dog known to have lived?\"\n# },\n# {\n# \"answer\": \"forest elephants\",\n# \"distance\": 0.5886962413787842,\n# \"original_question\": \"What large animals reside in the national park?\"\n# },\n# {\n# \"answer\": \"Rico\",\n# \"distance\": 0.5634892582893372,\n# \"original_question\": \"What is the name of the dog that could ID over 200 things?\"\n# },\n# {\n# \"answer\": \"Iditarod Trail Sled Dog Race\",\n# \"distance\": 0.546872615814209,\n# \"original_question\": \"Which dog-sled race in Alaska is the most famous?\"\n# },\n# {\n# \"answer\": \"part of the family\",\n# \"distance\": 0.5387814044952393,\n# \"original_question\": \"Most people today describe their dogs as what?\"\n# }\n# ]\n# }\n# ]\n\n"],"headingContent":"Question Answering Using Milvus and Cohere","anchorList":[{"label":"Menjawab Pertanyaan Menggunakan Milvus dan Cohere","href":"Question-Answering-Using-Milvus-and-Cohere","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-begin","type":2,"isActive":false},{"label":"Parameter","href":"Parameters","type":2,"isActive":false},{"label":"Menyiapkan dataset","href":"Prepare-the-dataset","type":2,"isActive":false},{"label":"Membuat sebuah koleksi","href":"Create-a-collection","type":2,"isActive":false},{"label":"Memasukkan data","href":"Insert-data","type":2,"isActive":false},{"label":"Mengajukan pertanyaan","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_cohere.md b/localization/v2.5.x/site/id/integrations/integrate_with_cohere.md new file mode 100644 index 000000000..a7cf9d516 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_cohere.md @@ -0,0 +1,319 @@ +--- +id: integrate_with_cohere.md +summary: >- + Halaman ini membahas cara mencari jawaban terbaik untuk pertanyaan menggunakan + Milvus sebagai Basis Data Vektor dan Hugging Face sebagai sistem penyematan. +title: Menjawab Pertanyaan Menggunakan Milvus dan Cohere +--- +

    Menjawab Pertanyaan Menggunakan Milvus dan Cohere

    Halaman ini mengilustrasikan cara membuat sistem penjawab pertanyaan berdasarkan dataset SQuAD menggunakan Milvus sebagai basis data vektor dan Cohere sebagai sistem penyematan.

    +

    Sebelum Anda mulai

    Potongan kode pada halaman ini membutuhkan pymilvus, cohere, pandas, numpy, dan tqdm yang sudah terinstal. Di antara paket-paket ini, pymilvus adalah klien untuk Milvus. Jika tidak ada pada sistem Anda, jalankan perintah berikut untuk menginstalnya:

    +
    pip install pymilvus cohere pandas numpy tqdm
    +
    +

    Kemudian Anda perlu memuat modul-modul yang akan digunakan pada panduan ini.

    +
    import cohere
    +import pandas
    +import numpy as np
    +from tqdm import tqdm
    +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
    +
    +

    Parameter

    Di sini kita dapat menemukan parameter yang digunakan pada cuplikan berikut. Beberapa di antaranya perlu diubah agar sesuai dengan lingkungan Anda. Di samping setiap parameter terdapat penjelasan mengenai parameter tersebut.

    +
    FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json'  # The SQuAD dataset url
    +COLLECTION_NAME = 'question_answering_db'  # Collection name
    +DIMENSION = 1024  # Embeddings size, cohere embeddings default to 4096 with the large model
    +COUNT = 5000  # How many questions to embed and insert into Milvus
    +BATCH_SIZE = 96 # How large of batches to use for embedding and insertion
    +MILVUS_HOST = 'localhost'  # Milvus server URI
    +MILVUS_PORT = '19530'
    +COHERE_API_KEY = 'replace-this-with-the-cohere-api-key'  # API key obtained from Cohere
    +
    +

    Untuk mengetahui lebih lanjut mengenai model dan dataset yang digunakan pada halaman ini, lihat co:here dan SQuAD.

    +

    Menyiapkan dataset

    Dalam contoh ini, kita akan menggunakan Stanford Question Answering Dataset (SQuAD) sebagai sumber kebenaran untuk menjawab pertanyaan. Dataset ini hadir dalam bentuk file JSON dan kita akan menggunakan pandas untuk memuatnya.

    +
    # Download the dataset
    +dataset = pandas.read_json(FILE)
    +
    +# Clean up the dataset by grabbing all the question answer pairs
    +simplified_records = []
    +for x in dataset['data']:
    +    for y in x['paragraphs']:
    +        for z in y['qas']:
    +            if len(z['answers']) != 0:
    +                simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})
    +
    +# Grab the amount of records based on COUNT
    +simplified_records = pandas.DataFrame.from_records(simplified_records)
    +simplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)
    +
    +# Check the length of the cleaned dataset matches count
    +print(len(simplified_records))
    +
    +

    Keluarannya adalah jumlah record dalam dataset tersebut

    +
    5000
    +
    +

    Membuat sebuah koleksi

    Bagian ini berhubungan dengan Milvus dan menyiapkan basis data untuk kasus penggunaan ini. Di dalam Milvus, kita perlu membuat koleksi dan mengindeksnya.

    +
    # Connect to Milvus Database
    +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
    +
    +# Remove collection if it already exists
    +if utility.has_collection(COLLECTION_NAME):
    +    utility.drop_collection(COLLECTION_NAME)
    +
    +# Create collection which includes the id, title, and embedding.
    +fields = [
    +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +]
    +schema = CollectionSchema(fields=fields)
    +collection = Collection(name=COLLECTION_NAME, schema=schema)
    +
    +# Create an IVF_FLAT index for collection.
    +index_params = {
    +    'metric_type':'IP',
    +    'index_type':"IVF_FLAT",
    +    'params':{"nlist": 1024}
    +}
    +collection.create_index(field_name="original_question_embedding", index_params=index_params)
    +collection.load()
    +
    +

    Memasukkan data

    Setelah kita menyiapkan koleksi, kita perlu mulai memasukkan data. Ini dilakukan dalam tiga langkah

    +
      +
    • membaca data,
    • +
    • menyematkan pertanyaan asli, dan
    • +
    • memasukkan data ke dalam koleksi yang baru saja kita buat di Milvus.
    • +
    +

    Dalam contoh ini, data termasuk pertanyaan asli, penyematan pertanyaan asli, dan jawaban untuk pertanyaan asli.

    +
    # Set up a co:here client.
    +cohere_client = cohere.Client(COHERE_API_KEY)
    +
    +# Extract embeddings from questions using Cohere
    +def embed(texts, input_type):
    +    res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)
    +    return res.embeddings
    +
    +# Insert each question, answer, and qustion embedding
    +total = pandas.DataFrame()
    +for batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):
    +    questions = batch['question'].tolist()
    +    embeddings = embed(questions, "search_document")
    +    
    +    data = [
    +        {
    +            'original_question': x,
    +            'answer': batch['answer'].tolist()[i],
    +            'original_question_embedding': embeddings[i]
    +        } for i, x in enumerate(questions)
    +    ]
    +
    +    collection.insert(data=data)
    +
    +time.sleep(10)
    +
    +

    Mengajukan pertanyaan

    Setelah semua data dimasukkan ke dalam koleksi Milvus, kita dapat mengajukan pertanyaan kepada sistem dengan mengambil frasa pertanyaan kita, menyematkannya dengan Cohere, dan melakukan pencarian dengan koleksi tersebut.

    +
    +

    Pencarian yang dilakukan pada data tepat setelah penyisipan mungkin sedikit lebih lambat karena pencarian data yang belum diindeks dilakukan dengan cara brute force. Setelah data baru diindeks secara otomatis, pencarian akan menjadi lebih cepat.

    +
    +
    # Search the cluster for an answer to a question text
    +def search(text, top_k = 5):
    +
    +    # AUTOINDEX does not require any search params 
    +    search_params = {}
    +
    +    results = collection.search(
    +        data = embed([text], "search_query"),  # Embeded the question
    +        anns_field='original_question_embedding',
    +        param=search_params,
    +        limit = top_k,  # Limit to top_k results per search
    +        output_fields=['original_question', 'answer']  # Include the original question and answer in the result
    +    )
    +
    +    distances = results[0].distances
    +    entities = [ x.entity.to_dict()['entity'] for x in results[0] ]
    +
    +    ret = [ {
    +        "answer": x[1]["answer"],
    +        "distance": x[0],
    +        "original_question": x[1]['original_question']
    +    } for x in zip(distances, entities)]
    +
    +    return ret
    +
    +# Ask these questions
    +search_questions = ['What kills bacteria?', 'What\'s the biggest dog?']
    +
    +# Print out the results in order of [answer, similarity score, original question]
    +
    +ret = [ { "question": x, "candidates": search(x) } for x in search_questions ]
    +
    +

    Hasil pencarian akan terlihat seperti berikut ini:

    +
    # Output
    +#
    +# [
    +#     {
    +#         "question": "What kills bacteria?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "farming",
    +#                 "distance": 0.6261022090911865,
    +#                 "original_question": "What makes bacteria resistant to antibiotic treatment?"
    +#             },
    +#             {
    +#                 "answer": "Phage therapy",
    +#                 "distance": 0.6093736886978149,
    +#                 "original_question": "What has been talked about to treat resistant bacteria?"
    +#             },
    +#             {
    +#                 "answer": "oral contraceptives",
    +#                 "distance": 0.5902313590049744,
    +#                 "original_question": "In therapy, what does the antibacterial interact with?"
    +#             },
    +#             {
    +#                 "answer": "slowing down the multiplication of bacteria or killing the bacteria",
    +#                 "distance": 0.5874154567718506,
    +#                 "original_question": "How do antibiotics work?"
    +#             },
    +#             {
    +#                 "answer": "in intensive farming to promote animal growth",
    +#                 "distance": 0.5667208433151245,
    +#                 "original_question": "Besides in treating human disease where else are antibiotics used?"
    +#             }
    +#         ]
    +#     },
    +#     {
    +#         "question": "What's the biggest dog?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "English Mastiff",
    +#                 "distance": 0.7875324487686157,
    +#                 "original_question": "What breed was the largest dog known to have lived?"
    +#             },
    +#             {
    +#                 "answer": "forest elephants",
    +#                 "distance": 0.5886962413787842,
    +#                 "original_question": "What large animals reside in the national park?"
    +#             },
    +#             {
    +#                 "answer": "Rico",
    +#                 "distance": 0.5634892582893372,
    +#                 "original_question": "What is the name of the dog that could ID over 200 things?"
    +#             },
    +#             {
    +#                 "answer": "Iditarod Trail Sled Dog Race",
    +#                 "distance": 0.546872615814209,
    +#                 "original_question": "Which dog-sled race in Alaska is the most famous?"
    +#             },
    +#             {
    +#                 "answer": "part of the family",
    +#                 "distance": 0.5387814044952393,
    +#                 "original_question": "Most people today describe their dogs as what?"
    +#             }
    +#         ]
    +#     }
    +# ]
    +
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_dspy.json b/localization/v2.5.x/site/id/integrations/integrate_with_dspy.json new file mode 100644 index 000000000..66783708c --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_dspy.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"dspy-ai[milvus]\"\n$ pip install -U pymilvus\n","from dspy.datasets import HotPotQA\n\n# Load the dataset.\ndataset = HotPotQA(\n train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0\n)\n\n# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.\ntrainset = [x.with_inputs(\"question\") for x in dataset.train]\ndevset = [x.with_inputs(\"question\") for x in dataset.dev]\n","import requests\nimport os\n\nos.environ[\"OPENAI_API_KEY\"] = \"\"\nMILVUS_URI = \"example.db\"\nMILVUS_TOKEN = \"\"\n\nfrom pymilvus import MilvusClient, DataType, Collection\nfrom dspy.retrieve.milvus_rm import openai_embedding_function\n\nclient = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)\n\nif \"dspy_example\" not in client.list_collections():\n client.create_collection(\n collection_name=\"dspy_example\",\n overwrite=True,\n dimension=1536,\n primary_field_name=\"id\",\n vector_field_name=\"embedding\",\n id_type=\"int\",\n metric_type=\"IP\",\n max_length=65535,\n enable_dynamic=True,\n )\ntext = requests.get(\n \"https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt\"\n).text\n\nfor idx, passage in enumerate(text.split(\"\\n\")):\n if len(passage) == 0:\n continue\n client.insert(\n collection_name=\"dspy_example\",\n data=[\n {\n \"id\": idx,\n \"embedding\": openai_embedding_function(passage)[0],\n \"text\": passage,\n }\n ],\n )\n","from dspy.retrieve.milvus_rm import MilvusRM\nimport dspy\n\nretriever_model = MilvusRM(\n collection_name=\"dspy_example\",\n uri=MILVUS_URI,\n token=MILVUS_TOKEN, # ignore this if no token is required for Milvus connection\n embedding_function=openai_embedding_function,\n)\nturbo = dspy.OpenAI(model=\"gpt-3.5-turbo\")\ndspy.settings.configure(lm=turbo)\n","class GenerateAnswer(dspy.Signature):\n \"\"\"Answer questions with short factoid answers.\"\"\"\n\n context = dspy.InputField(desc=\"may contain relevant facts\")\n question = dspy.InputField()\n answer = dspy.OutputField(desc=\"often between 1 and 5 words\")\n","class RAG(dspy.Module):\n def __init__(self, rm):\n super().__init__()\n self.retrieve = rm\n\n # This signature indicates the task imposed on the COT module.\n self.generate_answer = dspy.ChainOfThought(GenerateAnswer)\n\n def forward(self, question):\n # Use milvus_rm to retrieve context for the question.\n context = self.retrieve(question).passages\n # COT module takes \"context, query\" and output \"answer\".\n prediction = self.generate_answer(context=context, question=question)\n return dspy.Prediction(\n context=[item.long_text for item in context], answer=prediction.answer\n )\n","rag = RAG(retriever_model)\nprint(rag(\"who write At My Window\").answer)\n","from dspy.evaluate.evaluate import Evaluate\nfrom dspy.datasets import HotPotQA\n\nevaluate_on_hotpotqa = Evaluate(\n devset=devset, num_threads=1, display_progress=False, display_table=5\n)\n\nmetric = dspy.evaluate.answer_exact_match\nscore = evaluate_on_hotpotqa(rag, metric=metric)\nprint(\"rag:\", score)\n","from dspy.teleprompt import BootstrapFewShot\n\n# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.\n\n\ndef validate_context_and_answer(example, pred, trace=None):\n answer_EM = dspy.evaluate.answer_exact_match(example, pred)\n answer_PM = dspy.evaluate.answer_passage_match(example, pred)\n return answer_EM and answer_PM\n\n\n# Set up a basic teleprompter, which will compile our RAG program.\nteleprompter = BootstrapFewShot(metric=validate_context_and_answer)\n\n# Compile!\ncompiled_rag = teleprompter.compile(rag, trainset=trainset)\n\n# Now compiled_rag is optimized and ready to answer your new question!\n# Now, let’s evaluate the compiled RAG program.\nscore = evaluate_on_hotpotqa(compiled_rag, metric=metric)\nprint(score)\nprint(\"compile_rag:\", score)\n"],"headingContent":"Integrate Milvus with DSPy","anchorList":[{"label":"Mengintegrasikan Milvus dengan DSPy","href":"Integrate-Milvus-with-DSPy","type":1,"isActive":false},{"label":"Apa itu DSPy","href":"What-is-DSPy","type":2,"isActive":false},{"label":"Manfaat menggunakan DSPy","href":"Benefits-of-using-DSPy","type":2,"isActive":false},{"label":"Modul","href":"Modules","type":2,"isActive":false},{"label":"Mengapa Milvus di DSPy","href":"Why-Milvus-in-DSPy","type":2,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false},{"label":"Ringkasan","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_dspy.md b/localization/v2.5.x/site/id/integrations/integrate_with_dspy.md new file mode 100644 index 000000000..d07c0f86d --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_dspy.md @@ -0,0 +1,278 @@ +--- +id: integrate_with_dspy.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan MilvusRM, salah satu modul + retriever DSPy, untuk mengoptimalkan program RAG. +title: Mengintegrasikan Milvus dengan DSPy +--- +

    Mengintegrasikan Milvus dengan DSPy

    Open In Colab +GitHub Repository

    +

    Apa itu DSPy

    DSPy, yang diperkenalkan oleh Stanford NLP Group, merupakan kerangka kerja terobosan yang dirancang untuk mengoptimalkan permintaan dan bobot dalam model bahasa, terutama yang sangat berguna dalam skenario di mana model bahasa besar (LLM) diintegrasikan di berbagai tahap pipeline. Tidak seperti teknik rekayasa prompting konvensional yang bergantung pada pembuatan dan penyesuaian manual, DSPy mengadopsi pendekatan berbasis pembelajaran. Dengan mengasimilasi contoh-contoh pertanyaan-jawaban, DSPy menghasilkan prompt yang dioptimalkan secara dinamis, disesuaikan dengan tugas-tugas tertentu. Metodologi inovatif ini memungkinkan pemasangan kembali seluruh pipeline tanpa hambatan, sehingga tidak perlu lagi melakukan penyesuaian prompt secara manual. Sintaks Python DSPy menawarkan berbagai modul yang dapat dikomposisikan dan deklaratif, menyederhanakan instruksi LLM.

    +

    Manfaat menggunakan DSPy

      +
    • Pendekatan Pemrograman: DSPy menyediakan pendekatan pemrograman sistematis untuk pengembangan pipeline LM dengan mengabstraksikan pipeline sebagai grafik transformasi teks, bukan hanya memerintahkan LLM. Modul deklaratifnya memungkinkan desain dan pengoptimalan terstruktur, menggantikan metode coba-coba pada templat prompt tradisional.
    • +
    • Peningkatan Kinerja: DSPy menunjukkan peningkatan kinerja yang signifikan dibandingkan metode yang ada. Melalui studi kasus, DSPy mengungguli prompt standar dan demonstrasi yang dibuat oleh para ahli, menunjukkan keserbagunaan dan keefektifannya bahkan ketika dikompilasi ke model LM yang lebih kecil.
    • +
    • Abstraksi termodulasi: DSPy secara efektif mengabstraksikan aspek-aspek rumit dari pengembangan pipeline LM, seperti dekomposisi, fine-tuning, dan pemilihan model. Dengan DSPy, program yang ringkas dapat diterjemahkan dengan mulus ke dalam instruksi untuk berbagai model, seperti GPT-4, Llama2-13b, atau T5-base, sehingga merampingkan pengembangan dan meningkatkan kinerja.
    • +
    +

    Modul

    Ada banyak komponen yang berkontribusi dalam membangun pipeline LLM. Di sini, kami akan menjelaskan beberapa komponen utama untuk memberikan pemahaman tingkat tinggi tentang cara kerja DSPy.

    +

    + + DSPy Modules + Modul DSPy

    +

    Tanda tangan: Signature dalam DSPy berfungsi sebagai spesifikasi deklaratif, yang menguraikan perilaku input/output modul, memandu model bahasa dalam eksekusi tugas. Modul: Modul DSPy berfungsi sebagai komponen fundamental untuk program yang memanfaatkan model bahasa (LM). Modul ini mengabstraksikan berbagai teknik prompt, seperti rantai pemikiran atau ReAct, dan dapat beradaptasi untuk menangani DSPy Signature apa pun. Dengan parameter yang dapat dipelajari dan kemampuan untuk memproses input dan menghasilkan output, modul-modul ini dapat dikombinasikan untuk membentuk program yang lebih besar, mengambil inspirasi dari modul NN di PyTorch tetapi disesuaikan untuk aplikasi LM. Pengoptimal: Pengoptimal dalam DSPy menyempurnakan parameter program DSPy, seperti petunjuk dan bobot LLM, untuk memaksimalkan metrik yang ditentukan seperti akurasi, meningkatkan efisiensi program.

    +

    Mengapa Milvus di DSPy

    DSPy adalah kerangka kerja pemrograman yang kuat yang meningkatkan aplikasi RAG. Aplikasi tersebut perlu mengambil informasi yang berguna untuk meningkatkan kualitas jawaban, yang membutuhkan basis data vektor. Milvus adalah basis data vektor sumber terbuka yang terkenal untuk meningkatkan kinerja dan skalabilitas. Dengan MilvusRM, sebuah modul retriever di DSPy, mengintegrasikan Milvus menjadi sangat mudah. Sekarang, pengembang dapat dengan mudah mendefinisikan dan mengoptimalkan program RAG menggunakan DSPy, dengan memanfaatkan kemampuan pencarian vektor yang kuat dari Milvus. Kolaborasi ini membuat aplikasi RAG menjadi lebih efisien dan terukur, menggabungkan kemampuan pemrograman DSPy dengan fitur pencarian Milvus.

    +

    Contoh

    Sekarang, mari kita lihat contoh singkat untuk mendemonstrasikan cara memanfaatkan Milvus dalam DSPy untuk mengoptimalkan aplikasi RAG.

    +

    Prasyarat

    Sebelum membuat aplikasi RAG, instal DSPy dan PyMilvus.

    +
    $ pip install "dspy-ai[milvus]"
    +$ pip install -U pymilvus
    +
    +
    +Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu **memulai ulang runtime** (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).
    +

    Memuat dataset

    Dalam contoh ini, kita menggunakan HotPotQA, sebuah kumpulan pasangan pertanyaan-jawaban yang kompleks, sebagai kumpulan data latihan. Kita dapat memuatnya melalui kelas HotPotQA.

    +
    from dspy.datasets import HotPotQA
    +
    +# Load the dataset.
    +dataset = HotPotQA(
    +    train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0
    +)
    +
    +# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
    +trainset = [x.with_inputs("question") for x in dataset.train]
    +devset = [x.with_inputs("question") for x in dataset.dev]
    +
    +

    Memasukkan data ke dalam basis data vektor Milvus

    Masukkan informasi konteks ke dalam koleksi Milvus untuk pengambilan vektor. Koleksi ini harus memiliki bidang embedding dan bidang text. Kami menggunakan model text-embedding-3-small dari OpenAI sebagai fungsi penyematan kueri default dalam kasus ini.

    +
    import requests
    +import os
    +
    +os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"
    +MILVUS_URI = "example.db"
    +MILVUS_TOKEN = ""
    +
    +from pymilvus import MilvusClient, DataType, Collection
    +from dspy.retrieve.milvus_rm import openai_embedding_function
    +
    +client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)
    +
    +if "dspy_example" not in client.list_collections():
    +    client.create_collection(
    +        collection_name="dspy_example",
    +        overwrite=True,
    +        dimension=1536,
    +        primary_field_name="id",
    +        vector_field_name="embedding",
    +        id_type="int",
    +        metric_type="IP",
    +        max_length=65535,
    +        enable_dynamic=True,
    +    )
    +text = requests.get(
    +    "https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt"
    +).text
    +
    +for idx, passage in enumerate(text.split("\n")):
    +    if len(passage) == 0:
    +        continue
    +    client.insert(
    +        collection_name="dspy_example",
    +        data=[
    +            {
    +                "id": idx,
    +                "embedding": openai_embedding_function(passage)[0],
    +                "text": passage,
    +            }
    +        ],
    +    )
    +
    +

    Mendefinisikan MilvusRM.

    Sekarang, Anda perlu mendefinisikan MilvusRM.

    +
    from dspy.retrieve.milvus_rm import MilvusRM
    +import dspy
    +
    +retriever_model = MilvusRM(
    +    collection_name="dspy_example",
    +    uri=MILVUS_URI,
    +    token=MILVUS_TOKEN,  # ignore this if no token is required for Milvus connection
    +    embedding_function=openai_embedding_function,
    +)
    +turbo = dspy.OpenAI(model="gpt-3.5-turbo")
    +dspy.settings.configure(lm=turbo)
    +
    +

    Membangun tanda tangan

    Setelah kita memuat data, mari kita mulai mendefinisikan tanda tangan untuk sub-tugas pipeline kita. Kita dapat mengidentifikasi masukan sederhana kita question dan keluaran answer, tetapi karena kita sedang membangun pipeline RAG, kita akan mengambil informasi kontekstual dari Milvus. Jadi mari kita definisikan tanda tangan kita sebagai context, question --> answer.

    +
    class GenerateAnswer(dspy.Signature):
    +    """Answer questions with short factoid answers."""
    +
    +    context = dspy.InputField(desc="may contain relevant facts")
    +    question = dspy.InputField()
    +    answer = dspy.OutputField(desc="often between 1 and 5 words")
    +
    +

    Kami menyertakan deskripsi singkat untuk bidang context dan answer untuk mendefinisikan panduan yang lebih jelas tentang apa yang akan diterima dan dihasilkan oleh model.

    +

    Membangun pipeline

    Sekarang, mari kita mendefinisikan pipeline RAG.

    +
    class RAG(dspy.Module):
    +    def __init__(self, rm):
    +        super().__init__()
    +        self.retrieve = rm
    +
    +        # This signature indicates the task imposed on the COT module.
    +        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
    +
    +    def forward(self, question):
    +        # Use milvus_rm to retrieve context for the question.
    +        context = self.retrieve(question).passages
    +        # COT module takes "context, query" and output "answer".
    +        prediction = self.generate_answer(context=context, question=question)
    +        return dspy.Prediction(
    +            context=[item.long_text for item in context], answer=prediction.answer
    +        )
    +
    +

    Menjalankan pipeline dan mendapatkan hasilnya

    Sekarang, kita telah membuat pipeline RAG ini. Mari kita coba dan dapatkan hasilnya.

    +
    rag = RAG(retriever_model)
    +print(rag("who write At My Window").answer)
    +
    +
    Townes Van Zandt
    +
    +

    Kita dapat mengevaluasi hasil kuantitatif pada dataset.

    +
    from dspy.evaluate.evaluate import Evaluate
    +from dspy.datasets import HotPotQA
    +
    +evaluate_on_hotpotqa = Evaluate(
    +    devset=devset, num_threads=1, display_progress=False, display_table=5
    +)
    +
    +metric = dspy.evaluate.answer_exact_match
    +score = evaluate_on_hotpotqa(rag, metric=metric)
    +print("rag:", score)
    +
    +

    Mengoptimalkan pipeline

    Setelah mendefinisikan program ini, langkah selanjutnya adalah kompilasi. Proses ini memperbarui parameter dalam setiap modul untuk meningkatkan kinerja. Proses kompilasi bergantung pada tiga faktor penting:

    +
      +
    • Training Set: Kami akan menggunakan 20 contoh pertanyaan-jawaban dari kumpulan data pelatihan kami untuk demonstrasi ini.
    • +
    • Metrik Validasi: Kami akan membuat metrik sederhana validate_context_and_answer. Metrik ini memverifikasi keakuratan jawaban yang diprediksi dan memastikan bahwa konteks yang diambil mencakup jawabannya.
    • +
    • Pengoptimal Khusus (Teleprompter): Kompiler DSPy menggabungkan beberapa teleprompter yang dirancang untuk mengoptimalkan program Anda secara efektif.
    • +
    +
    from dspy.teleprompt import BootstrapFewShot
    +
    +# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.
    +
    +
    +def validate_context_and_answer(example, pred, trace=None):
    +    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
    +    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
    +    return answer_EM and answer_PM
    +
    +
    +# Set up a basic teleprompter, which will compile our RAG program.
    +teleprompter = BootstrapFewShot(metric=validate_context_and_answer)
    +
    +# Compile!
    +compiled_rag = teleprompter.compile(rag, trainset=trainset)
    +
    +# Now compiled_rag is optimized and ready to answer your new question!
    +# Now, let’s evaluate the compiled RAG program.
    +score = evaluate_on_hotpotqa(compiled_rag, metric=metric)
    +print(score)
    +print("compile_rag:", score)
    +
    +

    Skor Ragas telah meningkat dari nilai sebelumnya 50.0 menjadi 52.0, yang menunjukkan peningkatan kualitas jawaban.

    +

    Ringkasan

    DSPy menandai lompatan dalam interaksi model bahasa melalui antarmuka yang dapat diprogram, yang memfasilitasi pengoptimalan algoritmik dan otomatis dari permintaan dan bobot model. Dengan memanfaatkan DSPy untuk implementasi RAG, kemampuan beradaptasi terhadap berbagai model bahasa atau kumpulan data menjadi mudah, secara drastis mengurangi kebutuhan akan intervensi manual yang membosankan.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.json b/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.json new file mode 100644 index 000000000..205d6ab50 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.json @@ -0,0 +1 @@ +{"codeList":["$ mkdir fastgpt\n$ cd fastgpt\n$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json\n\n# milvus version\n$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml\n# zilliz version\n# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml\n","# Launch the container\n$ docker compose up -d\n# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql\n$ sleep 10\n# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)\n$ docker restart oneapi\n","$ docker compose down\n"],"headingContent":"Deploying FastGPT with Milvus","anchorList":[{"label":"Menerapkan FastGPT dengan Milvus","href":"Deploying-FastGPT-with-Milvus","type":1,"isActive":false},{"label":"Unduh docker-compose.yml","href":"Download-docker-composeyml","type":2,"isActive":false},{"label":"Luncurkan Kontainer","href":"Launch-the-Container","type":2,"isActive":false},{"label":"Mengakses OneAPI untuk Menambahkan Model","href":"Access-OneAPI-to-Add-Models","type":2,"isActive":false},{"label":"Mengatur Token","href":"Setting-Tokens","type":2,"isActive":false},{"label":"Mengakses FastGPT","href":"Accessing-FastGPT","type":2,"isActive":false},{"label":"Menghentikan kontainer","href":"Stop-the-Container","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.md b/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.md new file mode 100644 index 000000000..4b7a4b969 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_fastgpt.md @@ -0,0 +1,145 @@ +--- +id: integrate_with_fastgpt.md +summary: >- + Tutorial ini akan memandu Anda tentang cara menerapkan aplikasi FastGPT + eksklusif Anda sendiri dengan cepat menggunakan [Milvus] (https://milvus.io/). +title: Menerapkan FastGPT dengan Milvus +--- +

    Menerapkan FastGPT dengan Milvus

    FastGPT adalah sistem tanya jawab berbasis pengetahuan yang dibangun di atas model bahasa besar LLM, yang menawarkan kemampuan siap pakai untuk pemrosesan data dan pemanggilan model. Selain itu, FastGPT memungkinkan orkestrasi alur kerja melalui visualisasi Flow, sehingga memfasilitasi skenario tanya jawab yang kompleks. Tutorial ini akan memandu Anda tentang cara menerapkan aplikasi FastGPT eksklusif Anda sendiri dengan cepat menggunakan Milvus.

    +

    Unduh docker-compose.yml

    Pastikan Anda telah menginstal Docker Compose.
    +Jalankan perintah di bawah ini untuk mengunduh berkas docker-compose.yml.

    +
    $ mkdir fastgpt
    +$ cd fastgpt
    +$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
    +
    +# milvus version
    +$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
    +# zilliz version
    +# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
    +
    +
    +

    Jika Anda menggunakan versi Zilliz, sesuaikan parameter tautan MILVUS_ADDRESS dan MILVUS_TOKEN dalam berkas docker-compose.yml, yang sesuai dengan Public Endpoint dan kunci Api di Zilliz Cloud.

    +
    +

    Luncurkan Kontainer

    Jalankan di direktori yang sama dengan docker-compose.yml. Pastikan bahwa versi docker-compose idealnya di atas 2.17, karena beberapa perintah otomatisasi mungkin tidak akan berfungsi jika tidak.

    +
    # Launch the container
    +$ docker compose up -d
    +# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql
    +$ sleep 10
    +# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)
    +$ docker restart oneapi
    +
    +

    Mengakses OneAPI untuk Menambahkan Model

    OneAPI dapat diakses di ip:3001. Nama pengguna default adalah root, dan kata sandinya 123456. Anda dapat mengubah kata sandi setelah masuk.
    +Dengan menggunakan model OpenAI sebagai contoh, klik pada tab "Channel", dan pilih model obrolan dan model penyematan Anda di bawah "Models".
    +Masukkan Kunci API OpenAI Anda di bagian "Rahasia".
    +Untuk penggunaan model di luar OpenAI, dan informasi lebih lanjut, silakan baca One API.

    +

    Mengatur Token

    Klik pada tab "Token". Secara default, ada token Initial Root Token. Anda juga dapat membuat token baru dan mengatur kuota sendiri.
    +Klik "Salin" pada token Anda, pastikan bahwa nilai token ini sesuai dengan nilai CHAT_API_KEY yang ditetapkan dalam berkas docker-compose.yml.

    +

    Mengakses FastGPT

    Saat ini, FastGPT dapat diakses langsung di ip:3000 (harap perhatikan firewall). Nama pengguna login adalah root, dengan kata sandi yang diatur ke DEFAULT_ROOT_PSW dalam variabel lingkungan docker-compose.yml. Jika Anda memerlukan akses nama domain, Anda perlu menginstal dan mengonfigurasi Nginx sendiri.

    +

    Menghentikan kontainer

    Jalankan perintah berikut untuk menghentikan kontainer.

    +
    $ docker compose down
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_haystack.json b/localization/v2.5.x/site/id/integrations/integrate_with_haystack.json new file mode 100644 index 000000000..6f279f64b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_haystack.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import os\nimport urllib.request\n\nurl = \"https://www.gutenberg.org/cache/epub/7785/pg7785.txt\"\nfile_path = \"./davinci.txt\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\n","from haystack import Pipeline\nfrom haystack.components.converters import MarkdownToDocument\nfrom haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder\nfrom haystack.components.preprocessors import DocumentSplitter\nfrom haystack.components.writers import DocumentWriter\nfrom haystack.utils import Secret\n\nfrom milvus_haystack import MilvusDocumentStore\nfrom milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever\n\n\ndocument_store = MilvusDocumentStore(\n connection_args={\"uri\": \"./milvus.db\"},\n # connection_args={\"uri\": \"http://localhost:19530\"},\n # connection_args={\"uri\": YOUR_ZILLIZ_CLOUD_URI, \"token\": Secret.from_env_var(\"ZILLIZ_CLOUD_API_KEY\")},\n drop_old=True,\n)\n","indexing_pipeline = Pipeline()\nindexing_pipeline.add_component(\"converter\", MarkdownToDocument())\nindexing_pipeline.add_component(\n \"splitter\", DocumentSplitter(split_by=\"sentence\", split_length=2)\n)\nindexing_pipeline.add_component(\"embedder\", OpenAIDocumentEmbedder())\nindexing_pipeline.add_component(\"writer\", DocumentWriter(document_store))\nindexing_pipeline.connect(\"converter\", \"splitter\")\nindexing_pipeline.connect(\"splitter\", \"embedder\")\nindexing_pipeline.connect(\"embedder\", \"writer\")\nindexing_pipeline.run({\"converter\": {\"sources\": [file_path]}})\n\nprint(\"Number of documents:\", document_store.count_documents())\n","question = 'Where is the painting \"Warrior\" currently stored?'\n\nretrieval_pipeline = Pipeline()\nretrieval_pipeline.add_component(\"embedder\", OpenAITextEmbedder())\nretrieval_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nretrieval_pipeline.connect(\"embedder\", \"retriever\")\n\nretrieval_results = retrieval_pipeline.run({\"embedder\": {\"text\": question}})\n\nfor doc in retrieval_results[\"retriever\"][\"documents\"]:\n print(doc.content)\n print(\"-\" * 10)\n","from haystack.utils import Secret\nfrom haystack.components.builders import PromptBuilder\nfrom haystack.components.generators import OpenAIGenerator\n\nprompt_template = \"\"\"Answer the following query based on the provided context. If the context does\n not include an answer, reply with 'I don't know'.\\n\n Query: {{query}}\n Documents:\n {% for doc in documents %}\n {{ doc.content }}\n {% endfor %}\n Answer:\n \"\"\"\n\nrag_pipeline = Pipeline()\nrag_pipeline.add_component(\"text_embedder\", OpenAITextEmbedder())\nrag_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nrag_pipeline.add_component(\"prompt_builder\", PromptBuilder(template=prompt_template))\nrag_pipeline.add_component(\n \"generator\",\n OpenAIGenerator(\n api_key=Secret.from_token(os.getenv(\"OPENAI_API_KEY\")),\n generation_kwargs={\"temperature\": 0},\n ),\n)\nrag_pipeline.connect(\"text_embedder.embedding\", \"retriever.query_embedding\")\nrag_pipeline.connect(\"retriever.documents\", \"prompt_builder.documents\")\nrag_pipeline.connect(\"prompt_builder\", \"generator\")\n\nresults = rag_pipeline.run(\n {\n \"text_embedder\": {\"text\": question},\n \"prompt_builder\": {\"query\": question},\n }\n)\nprint(\"RAG answer:\", results[\"generator\"][\"replies\"][0])\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Haystack","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) dengan Milvus dan Haystack","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Haystack","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Siapkan data","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Membuat pipeline pengindeksan","href":"Create-the-indexing-Pipeline","type":2,"isActive":false},{"label":"Buat pipeline pengambilan","href":"Create-the-retrieval-pipeline","type":2,"isActive":false},{"label":"Membuat pipeline RAG","href":"Create-the-RAG-pipeline","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_haystack.md b/localization/v2.5.x/site/id/integrations/integrate_with_haystack.md new file mode 100644 index 000000000..d8ddcff98 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_haystack.md @@ -0,0 +1,256 @@ +--- +id: integrate_with_haystack.md +summary: >- + Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented + Generation (RAG) menggunakan Haystack dan Milvus. +title: Retrieval-Augmented Generation (RAG) dengan Milvus dan Haystack +--- +

    Retrieval-Augmented Generation (RAG) dengan Milvus dan Haystack

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented Generation (RAG) menggunakan Haystack dan Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    Haystack adalah kerangka kerja Python sumber terbuka oleh deepset untuk membangun aplikasi khusus dengan model bahasa besar (LLM). Milvus adalah basis data vektor sumber terbuka yang paling canggih di dunia, yang dibangun untuk mendukung pencarian kemiripan dan aplikasi AI.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut:

    +
    ! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan model dari OpenAI. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Siapkan data

    Kami menggunakan konten online tentang Leonardo Da Vinci sebagai penyimpan pengetahuan pribadi untuk pipeline RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh dan simpan sebagai file teks lokal.

    +
    import os
    +import urllib.request
    +
    +url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
    +file_path = "./davinci.txt"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +
    +

    Membuat pipeline pengindeksan

    Buat pipeline pengindeksan yang mengubah teks menjadi dokumen, membaginya menjadi kalimat, dan menyematkannya. Dokumen-dokumen tersebut kemudian ditulis ke penyimpanan dokumen Milvus.

    +
    from haystack import Pipeline
    +from haystack.components.converters import MarkdownToDocument
    +from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
    +from haystack.components.preprocessors import DocumentSplitter
    +from haystack.components.writers import DocumentWriter
    +from haystack.utils import Secret
    +
    +from milvus_haystack import MilvusDocumentStore
    +from milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever
    +
    +
    +document_store = MilvusDocumentStore(
    +    connection_args={"uri": "./milvus.db"},
    +    # connection_args={"uri": "http://localhost:19530"},
    +    # connection_args={"uri": YOUR_ZILLIZ_CLOUD_URI, "token": Secret.from_env_var("ZILLIZ_CLOUD_API_KEY")},
    +    drop_old=True,
    +)
    +
    +
    +

    Untuk connection_args:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +
    indexing_pipeline = Pipeline()
    +indexing_pipeline.add_component("converter", MarkdownToDocument())
    +indexing_pipeline.add_component(
    +    "splitter", DocumentSplitter(split_by="sentence", split_length=2)
    +)
    +indexing_pipeline.add_component("embedder", OpenAIDocumentEmbedder())
    +indexing_pipeline.add_component("writer", DocumentWriter(document_store))
    +indexing_pipeline.connect("converter", "splitter")
    +indexing_pipeline.connect("splitter", "embedder")
    +indexing_pipeline.connect("embedder", "writer")
    +indexing_pipeline.run({"converter": {"sources": [file_path]}})
    +
    +print("Number of documents:", document_store.count_documents())
    +
    +
    Converting markdown files to Documents: 100%|█| 1/
    +Calculating embeddings: 100%|█| 9/9 [00:05<00:00, 
    +E20240516 10:40:32.945937 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946677 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946704 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946725 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +
    +
    +Number of documents: 277
    +
    +

    Buat pipeline pengambilan

    Buat pipeline pengambilan yang mengambil dokumen dari penyimpanan dokumen Milvus menggunakan mesin pencari kemiripan vektor.

    +
    question = 'Where is the painting "Warrior" currently stored?'
    +
    +retrieval_pipeline = Pipeline()
    +retrieval_pipeline.add_component("embedder", OpenAITextEmbedder())
    +retrieval_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +retrieval_pipeline.connect("embedder", "retriever")
    +
    +retrieval_results = retrieval_pipeline.run({"embedder": {"text": question}})
    +
    +for doc in retrieval_results["retriever"]["documents"]:
    +    print(doc.content)
    +    print("-" * 10)
    +
    +
    ). The
    +composition of this oil-painting seems to have been built up on the
    +second cartoon, which he had made some eight years earlier, and which
    +was apparently taken to France in 1516 and ultimately lost.
    +----------
    +
    +This "Baptism of Christ," which is now in the Accademia in Florence
    +and is in a bad state of preservation, appears to have been a
    +comparatively early work by Verrocchio, and to have been painted
    +in 1480-1482, when Leonardo would be about thirty years of age.
    +
    +To about this period belongs the superb drawing of the "Warrior," now
    +in the Malcolm Collection in the British Museum.
    +----------
    +" Although he
    +completed the cartoon, the only part of the composition which he
    +eventually executed in colour was an incident in the foreground
    +which dealt with the "Battle of the Standard." One of the many
    +supposed copies of a study of this mural painting now hangs on the
    +south-east staircase in the Victoria and Albert Museum.
    +----------
    +
    +

    Membuat pipeline RAG

    Buat pipeline RAG yang menggabungkan MilvusEmbeddingRetriever dan OpenAIGenerator untuk menjawab pertanyaan dengan menggunakan dokumen yang diambil.

    +
    from haystack.utils import Secret
    +from haystack.components.builders import PromptBuilder
    +from haystack.components.generators import OpenAIGenerator
    +
    +prompt_template = """Answer the following query based on the provided context. If the context does
    +                     not include an answer, reply with 'I don't know'.\n
    +                     Query: {{query}}
    +                     Documents:
    +                     {% for doc in documents %}
    +                        {{ doc.content }}
    +                     {% endfor %}
    +                     Answer:
    +                  """
    +
    +rag_pipeline = Pipeline()
    +rag_pipeline.add_component("text_embedder", OpenAITextEmbedder())
    +rag_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
    +rag_pipeline.add_component(
    +    "generator",
    +    OpenAIGenerator(
    +        api_key=Secret.from_token(os.getenv("OPENAI_API_KEY")),
    +        generation_kwargs={"temperature": 0},
    +    ),
    +)
    +rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
    +rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
    +rag_pipeline.connect("prompt_builder", "generator")
    +
    +results = rag_pipeline.run(
    +    {
    +        "text_embedder": {"text": question},
    +        "prompt_builder": {"query": question},
    +    }
    +)
    +print("RAG answer:", results["generator"]["replies"][0])
    +
    +
    RAG answer: The painting "Warrior" is currently stored in the Malcolm Collection in the British Museum.
    +
    +

    Untuk informasi lebih lanjut tentang cara menggunakan milvus-haystack, silakan merujuk ke milvus-haystack Readme.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.json b/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.json new file mode 100644 index 000000000..3c9a91063 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus transformers datasets torch\n","from datasets import load_dataset\n\n\nDATASET = \"squad\" # Name of dataset from HuggingFace Datasets\nINSERT_RATIO = 0.001 # Ratio of example dataset to be inserted\n\ndata = load_dataset(DATASET, split=\"validation\")\n# Generates a fixed subset. To generate a random subset, remove the seed.\ndata = data.train_test_split(test_size=INSERT_RATIO, seed=42)[\"test\"]\n# Clean up the data structure in the dataset.\ndata = data.map(\n lambda val: {\"answer\": val[\"answers\"][\"text\"][0]},\n remove_columns=[\"id\", \"answers\", \"context\"],\n)\n\n# View summary of example data\nprint(data)\n","from transformers import AutoTokenizer, AutoModel\nimport torch\n\nMODEL = (\n \"sentence-transformers/all-MiniLM-L6-v2\" # Name of model from HuggingFace Models\n)\nINFERENCE_BATCH_SIZE = 64 # Batch size of model inference\n\n# Load tokenizer & model from HuggingFace Hub\ntokenizer = AutoTokenizer.from_pretrained(MODEL)\nmodel = AutoModel.from_pretrained(MODEL)\n\n\ndef encode_text(batch):\n # Tokenize sentences\n encoded_input = tokenizer(\n batch[\"question\"], padding=True, truncation=True, return_tensors=\"pt\"\n )\n\n # Compute token embeddings\n with torch.no_grad():\n model_output = model(**encoded_input)\n\n # Perform pooling\n token_embeddings = model_output[0]\n attention_mask = encoded_input[\"attention_mask\"]\n input_mask_expanded = (\n attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n )\n sentence_embeddings = torch.sum(\n token_embeddings * input_mask_expanded, 1\n ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)\n\n # Normalize embeddings\n batch[\"question_embedding\"] = torch.nn.functional.normalize(\n sentence_embeddings, p=2, dim=1\n )\n return batch\n\n\ndata = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)\ndata_list = data.to_list()\n","from pymilvus import MilvusClient\n\n\nMILVUS_URI = \"./huggingface_milvus_test.db\" # Connection URI\nCOLLECTION_NAME = \"huggingface_test\" # Collection name\nDIMENSION = 384 # Embedding dimension depending on model\n\nmilvus_client = MilvusClient(MILVUS_URI)\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n dimension=DIMENSION,\n auto_id=True, # Enable auto id\n enable_dynamic_field=True, # Enable dynamic fields\n vector_field_name=\"question_embedding\", # Map vector field name and embedding column in dataset\n consistency_level=\"Strong\", # To enable search with latest data\n)\n","milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)\n","questions = {\n \"question\": [\n \"What is LGM?\",\n \"When did Massachusetts first mandate that children be educated in schools?\",\n ]\n}\n\n# Generate question embeddings\nquestion_embeddings = [v.tolist() for v in encode_text(questions)[\"question_embedding\"]]\n\n# Search across Milvus\nsearch_results = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=question_embeddings,\n limit=3, # How many search results to output\n output_fields=[\"answer\", \"question\"], # Include these fields in search results\n)\n\n# Print out results\nfor q, res in zip(questions[\"question\"], search_results):\n print(\"Question:\", q)\n for r in res:\n print(\n {\n \"answer\": r[\"entity\"][\"answer\"],\n \"score\": r[\"distance\"],\n \"original question\": r[\"entity\"][\"question\"],\n }\n )\n print(\"\\n\")\n"],"headingContent":"Question Answering Using Milvus and Hugging Face","anchorList":[{"label":"Menjawab Pertanyaan Menggunakan Milvus dan Hugging Face","href":"Question-Answering-Using-Milvus-and-Hugging-Face","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-begin","type":2,"isActive":false},{"label":"Menyiapkan data","href":"Prepare-data","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data","type":2,"isActive":false},{"label":"Ajukan pertanyaan","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.md b/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.md new file mode 100644 index 000000000..404dd27ab --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_hugging-face.md @@ -0,0 +1,245 @@ +--- +id: integrate_with_hugging-face.md +summary: >- + Tutorial ini menunjukkan cara membangun sistem penjawab pertanyaan menggunakan + Hugging Face sebagai pemuat data & generator penyisipan untuk pemrosesan + data dan Milvus sebagai basis data vektor untuk pencarian semantik. +title: Menjawab Pertanyaan Menggunakan Milvus dan Hugging Face +--- +

    Menjawab Pertanyaan Menggunakan Milvus dan Hugging Face

    Open In Colab +GitHub Repository

    +

    Sistem penjawab pertanyaan berdasarkan pencarian semantik bekerja dengan menemukan pertanyaan yang paling mirip dari kumpulan data pasangan pertanyaan-jawaban untuk pertanyaan kueri yang diberikan. Setelah pertanyaan yang paling mirip diidentifikasi, jawaban yang sesuai dari kumpulan data dianggap sebagai jawaban untuk pertanyaan tersebut. Pendekatan ini bergantung pada ukuran kemiripan semantik untuk menentukan kemiripan antara pertanyaan dan mengambil jawaban yang relevan.

    +

    Tutorial ini menunjukkan cara membangun sistem penjawab pertanyaan menggunakan Hugging Face sebagai pemuat data & generator penyematan untuk pemrosesan data dan Milvus sebagai basis data vektor untuk pencarian semantik.

    +

    Sebelum Anda mulai

    Anda harus memastikan semua dependensi yang diperlukan sudah terinstal:

    +
      +
    • pymilvus: paket python yang bekerja dengan layanan basis data vektor yang didukung oleh Milvus atau Zilliz Cloud.
    • +
    • datasets, transformers: paket Hugging Face mengelola data dan memanfaatkan model.
    • +
    • torch: pustaka yang kuat menyediakan komputasi tensor yang efisien dan alat pembelajaran mendalam.
    • +
    +
    $ pip install --upgrade pymilvus transformers datasets torch
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Menyiapkan data

    Pada bagian ini, kita akan memuat contoh pasangan pertanyaan-jawaban dari Hugging Face Datasets. Sebagai demo, kami hanya mengambil sebagian data dari pembagian validasi SQuAD.

    +
    from datasets import load_dataset
    +
    +
    +DATASET = "squad"  # Name of dataset from HuggingFace Datasets
    +INSERT_RATIO = 0.001  # Ratio of example dataset to be inserted
    +
    +data = load_dataset(DATASET, split="validation")
    +# Generates a fixed subset. To generate a random subset, remove the seed.
    +data = data.train_test_split(test_size=INSERT_RATIO, seed=42)["test"]
    +# Clean up the data structure in the dataset.
    +data = data.map(
    +    lambda val: {"answer": val["answers"]["text"][0]},
    +    remove_columns=["id", "answers", "context"],
    +)
    +
    +# View summary of example data
    +print(data)
    +
    +
    Dataset({
    +    features: ['title', 'question', 'answer'],
    +    num_rows: 11
    +})
    +
    +

    Untuk membuat penyematan pertanyaan, Anda dapat memilih model penyematan teks dari Hugging Face Models. Dalam tutorial ini, kita akan menggunakan model penyematan kalimat kecil all-MiniLM-L6-v2 sebagai contoh.

    +
    from transformers import AutoTokenizer, AutoModel
    +import torch
    +
    +MODEL = (
    +    "sentence-transformers/all-MiniLM-L6-v2"  # Name of model from HuggingFace Models
    +)
    +INFERENCE_BATCH_SIZE = 64  # Batch size of model inference
    +
    +# Load tokenizer & model from HuggingFace Hub
    +tokenizer = AutoTokenizer.from_pretrained(MODEL)
    +model = AutoModel.from_pretrained(MODEL)
    +
    +
    +def encode_text(batch):
    +    # Tokenize sentences
    +    encoded_input = tokenizer(
    +        batch["question"], padding=True, truncation=True, return_tensors="pt"
    +    )
    +
    +    # Compute token embeddings
    +    with torch.no_grad():
    +        model_output = model(**encoded_input)
    +
    +    # Perform pooling
    +    token_embeddings = model_output[0]
    +    attention_mask = encoded_input["attention_mask"]
    +    input_mask_expanded = (
    +        attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    +    )
    +    sentence_embeddings = torch.sum(
    +        token_embeddings * input_mask_expanded, 1
    +    ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
    +
    +    # Normalize embeddings
    +    batch["question_embedding"] = torch.nn.functional.normalize(
    +        sentence_embeddings, p=2, dim=1
    +    )
    +    return batch
    +
    +
    +data = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)
    +data_list = data.to_list()
    +
    +

    Menyisipkan data

    Sekarang kita memiliki pasangan pertanyaan-jawaban yang siap dengan penyematan pertanyaan. Langkah selanjutnya adalah memasukkannya ke dalam basis data vektor.

    +

    Pertama-tama kita harus terhubung ke layanan Milvus dan membuat koleksi Milvus.

    +
    from pymilvus import MilvusClient
    +
    +
    +MILVUS_URI = "./huggingface_milvus_test.db"  # Connection URI
    +COLLECTION_NAME = "huggingface_test"  # Collection name
    +DIMENSION = 384  # Embedding dimension depending on model
    +
    +milvus_client = MilvusClient(MILVUS_URI)
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    dimension=DIMENSION,
    +    auto_id=True,  # Enable auto id
    +    enable_dynamic_field=True,  # Enable dynamic fields
    +    vector_field_name="question_embedding",  # Map vector field name and embedding column in dataset
    +    consistency_level="Strong",  # To enable search with latest data
    +)
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Masukkan semua data ke dalam koleksi:

    +
    milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)
    +
    +
    {'insert_count': 11,
    + 'ids': [450072488481390592, 450072488481390593, 450072488481390594, 450072488481390595, 450072488481390596, 450072488481390597, 450072488481390598, 450072488481390599, 450072488481390600, 450072488481390601, 450072488481390602],
    + 'cost': 0}
    +
    +

    Ajukan pertanyaan

    Setelah semua data dimasukkan ke dalam Milvus, kita dapat mengajukan pertanyaan dan melihat jawaban yang paling mendekati.

    +
    questions = {
    +    "question": [
    +        "What is LGM?",
    +        "When did Massachusetts first mandate that children be educated in schools?",
    +    ]
    +}
    +
    +# Generate question embeddings
    +question_embeddings = [v.tolist() for v in encode_text(questions)["question_embedding"]]
    +
    +# Search across Milvus
    +search_results = milvus_client.search(
    +    collection_name=COLLECTION_NAME,
    +    data=question_embeddings,
    +    limit=3,  # How many search results to output
    +    output_fields=["answer", "question"],  # Include these fields in search results
    +)
    +
    +# Print out results
    +for q, res in zip(questions["question"], search_results):
    +    print("Question:", q)
    +    for r in res:
    +        print(
    +            {
    +                "answer": r["entity"]["answer"],
    +                "score": r["distance"],
    +                "original question": r["entity"]["question"],
    +            }
    +        )
    +    print("\n")
    +
    +
    Question: What is LGM?
    +{'answer': 'Last Glacial Maximum', 'score': 0.956273078918457, 'original question': 'What does LGM stands for?'}
    +{'answer': 'coordinate the response to the embargo', 'score': 0.2120140939950943, 'original question': 'Why was this short termed organization created?'}
    +{'answer': '"Reducibility Among Combinatorial Problems"', 'score': 0.1945795714855194, 'original question': 'What is the paper written by Richard Karp in 1972 that ushered in a new era of understanding between intractability and NP-complete problems?'}
    +
    +
    +Question: When did Massachusetts first mandate that children be educated in schools?
    +{'answer': '1852', 'score': 0.9709997177124023, 'original question': 'In what year did Massachusetts first require children to be educated in schools?'}
    +{'answer': 'several regional colleges and universities', 'score': 0.34164726734161377, 'original question': 'In 1890, who did the university decide to team up with?'}
    +{'answer': '1962', 'score': 0.1931006908416748, 'original question': 'When were stromules discovered?'}
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_jina.json b/localization/v2.5.x/site/id/integrations/integrate_with_jina.json new file mode 100644 index 000000000..b9d473a45 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_jina.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n$ pip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=1024\n)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information retrieval is the process of finding relevant information from a large collection of data or documents.\"\n\nqvecs = ef.encode_queries([query]) # This method uses `retrieval.query` as the task\ndvecs = ef.encode_documents([doc]) # This method uses `retrieval.passage` as the task\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-de\", jina_api_key)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden.\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-code\", jina_api_key)\n\n# Case1: Enhanced Code Navigation\n# query: text description of the functionality\n# document: relevant code snippet\n\nquery = \"function to calculate average in Python.\"\ndoc = \"\"\"\ndef calculate_average(numbers):\n total = sum(numbers)\n count = len(numbers)\n return total / count\n\"\"\"\n\n# Case2: Streamlined Code Review\n# query: text description of the programming concept\n# document: relevante code snippet or PR\n\nquery = \"pull quest related to Collection\"\ndoc = \"fix:[restful v2] parameters of create collection ...\"\n\n# Case3: Automatic Documentation Assistance\n# query: code snippet you need explanation\n# document: relevante document or DocsString\n\nquery = \"What is Collection in Milvus\"\ndoc = \"\"\"\nIn Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.\nMilvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.\n\"\"\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\nfrom pymilvus import MilvusClient\n\njina_api_key = \"\"\nDIMENSION = 1024 # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. \nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=DIMENSION,\n)\n\n\ndoc = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\ndvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task\n\ndata = [\n {\"id\": i, \"vector\": dvecs[i], \"text\": doc[i], \"subject\": \"history\"}\n for i in range(len(dvecs))\n]\n\nmilvus_client = MilvusClient(\"./milvus_jina_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\nres = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)\n\nprint(res[\"insert_count\"])\n","queries = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\nqvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=[qvecs[0]], # query vectors\n limit=3, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)[0]\n\nfor result in res:\n print(result)\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_api_key = \"\"\n\nrf = JinaRerankFunction(\"jina-reranker-v1-base-en\", jina_api_key)\n\nquery = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\nrf(query, documents)\n"],"headingContent":"Integrate Milvus with Jina AI","anchorList":[{"label":"Mengintegrasikan Milvus dengan Jina AI","href":"Integrate-Milvus-with-Jina-AI","type":1,"isActive":false},{"label":"Siapa itu Jina AI","href":"Who-is-Jina-AI","type":2,"isActive":false},{"label":"Penyematan Milvus dan Jina AI","href":"Milvus-and-Jina-AIs-Embedding","type":2,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false},{"label":"Penyematan Tujuan Umum","href":"General-Purpose-Embedding","type":2,"isActive":false},{"label":"Penyematan Bilingual","href":"Bilingual-Embeddings","type":2,"isActive":false},{"label":"Penyematan Kode","href":"Code-Embeddings","type":2,"isActive":false},{"label":"Pencarian Semantik dengan Jina & Milvus","href":"Semantic-Search-with-Jina--Milvus","type":2,"isActive":false},{"label":"Jina Reranker","href":"Jina-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_jina.md b/localization/v2.5.x/site/id/integrations/integrate_with_jina.md new file mode 100644 index 000000000..e4d30650e --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_jina.md @@ -0,0 +1,307 @@ +--- +id: integrate_with_jina.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan penyematan Jina dan Milvus + untuk melakukan tugas pencarian dan pengambilan kemiripan. +title: Mengintegrasikan Milvus dengan Jina +--- +

    Mengintegrasikan Milvus dengan Jina AI

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara menggunakan penyematan Jina AI dan Milvus untuk melakukan tugas pencarian dan pengambilan kemiripan.

    +

    Siapa itu Jina AI

    Jina AI, yang didirikan pada tahun 2020 di Berlin, adalah perusahaan AI perintis yang berfokus pada revolusi masa depan kecerdasan buatan melalui fondasi pencariannya. Mengkhususkan diri dalam AI multimodal, Jina AI bertujuan untuk memberdayakan bisnis dan pengembang untuk memanfaatkan kekuatan data multimodal untuk penciptaan nilai dan penghematan biaya melalui rangkaian komponen terintegrasi, termasuk penyematan, pemeringkatan, operasi cepat, dan infrastruktur inti. Penyematan Jina AI yang canggih membanggakan kinerja tingkat atas, yang menampilkan model dengan panjang token 8192 yang ideal untuk representasi data yang komprehensif. Menawarkan dukungan multibahasa dan integrasi tanpa batas dengan platform terkemuka seperti OpenAI, penyematan ini memfasilitasi aplikasi lintas bahasa.

    +

    Penyematan Milvus dan Jina AI

    Untuk menyimpan dan mencari embedding ini secara efisien demi kecepatan dan skala, diperlukan infrastruktur khusus yang dirancang untuk tujuan ini. Milvus adalah basis data vektor sumber terbuka canggih yang dikenal luas yang mampu menangani data vektor berskala besar. Milvus memungkinkan pencarian vektor (embedding) yang cepat dan akurat sesuai dengan banyak metrik. Skalabilitasnya memungkinkan penanganan data gambar dalam jumlah besar tanpa hambatan, memastikan operasi pencarian berkinerja tinggi bahkan ketika kumpulan data terus bertambah.

    +

    Contoh

    Penyematan Jina telah diintegrasikan ke dalam pustaka model PyMilvus. Sekarang, kami akan mendemonstrasikan contoh kode untuk menunjukkan cara menggunakan embedding Jina.

    +

    Sebelum kita mulai, kita perlu menginstal pustaka model untuk PyMilvus.

    +
    $ pip install -U pymilvus
    +$ pip install "pymilvus[model]"
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime. (Klik pada menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu dropdown).

    +
    +

    Penyematan Tujuan Umum

    Model penyematan inti Jina AI, unggul dalam memahami teks yang mendetail, sehingga ideal untuk pencarian semantik, klasifikasi konten sehingga mendukung analisis sentimen tingkat lanjut, ringkasan teks, dan sistem rekomendasi yang dipersonalisasi.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=1024
    +)
    +
    +query = "what is information retrieval?"
    +doc = "Information retrieval is the process of finding relevant information from a large collection of data or documents."
    +
    +qvecs = ef.encode_queries([query])  # This method uses `retrieval.query` as the task
    +dvecs = ef.encode_documents([doc])  # This method uses `retrieval.passage` as the task
    +
    +

    Penyematan Bilingual

    Model dwibahasa Jina AI meningkatkan platform multibahasa, dukungan global, dan penemuan konten lintas bahasa. Dirancang untuk terjemahan bahasa Jerman-Inggris dan bahasa Mandarin-Inggris, model ini mendorong pemahaman di antara kelompok bahasa yang beragam, sehingga menyederhanakan interaksi lintas bahasa.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-de", jina_api_key)
    +
    +query = "what is information retrieval?"
    +doc = "Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden."
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    Penyematan Kode

    Model penyematan kode Jina AI menyediakan kemampuan pencarian melalui kode dan dokumentasi. Model ini mendukung bahasa Inggris dan 30 bahasa pemrograman populer yang dapat digunakan untuk meningkatkan navigasi kode, tinjauan kode yang efisien, dan bantuan dokumentasi otomatis.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-code", jina_api_key)
    +
    +# Case1: Enhanced Code Navigation
    +# query: text description of the functionality
    +# document: relevant code snippet
    +
    +query = "function to calculate average in Python."
    +doc = """
    +def calculate_average(numbers):
    +    total = sum(numbers)
    +    count = len(numbers)
    +    return total / count
    +"""
    +
    +# Case2: Streamlined Code Review
    +# query: text description of the programming concept
    +# document: relevante code snippet or PR
    +
    +query = "pull quest related to Collection"
    +doc = "fix:[restful v2] parameters of create collection ..."
    +
    +# Case3: Automatic Documentation Assistance
    +# query: code snippet you need explanation
    +# document: relevante document or DocsString
    +
    +query = "What is Collection in Milvus"
    +doc = """
    +In Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.
    +Milvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.
    +"""
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    Pencarian Semantik dengan Jina & Milvus

    Dengan fungsi penyematan vektor yang kuat, kita dapat menggabungkan penyematan yang diambil dengan memanfaatkan model AI Jina dengan basis data vektor Milvus Lite untuk melakukan pencarian semantik.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +from pymilvus import MilvusClient
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +DIMENSION = 1024  # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. 
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=DIMENSION,
    +)
    +
    +
    +doc = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +dvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task
    +
    +data = [
    +    {"id": i, "vector": dvecs[i], "text": doc[i], "subject": "history"}
    +    for i in range(len(dvecs))
    +]
    +
    +milvus_client = MilvusClient("./milvus_jina_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +res = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Dengan semua data dalam basis data vektor Milvus, kita sekarang dapat melakukan pencarian semantik dengan membuat penyematan vektor untuk kueri dan melakukan pencarian vektor.

    +
    queries = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +qvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=[qvecs[0]],  # query vectors
    +    limit=3,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)[0]
    +
    +for result in res:
    +    print(result)
    +
    +
    {'id': 1, 'distance': 0.8802614808082581, 'entity': {'text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", 'subject': 'history'}}
    +
    +

    Jina Reranker

    Jina Ai juga menyediakan perangking ulang untuk lebih meningkatkan kualitas pencarian setelah melakukan pencarian menggunakan penyematan.

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +
    +rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)
    +
    +query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +rf(query, documents)
    +
    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9370958209037781, index=1),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.35420963168144226, index=3),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.3498658835887909, index=0),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.2728956639766693, index=2)]
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.json b/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.json new file mode 100644 index 000000000..40bdd1e67 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade\n","import os\n\n# Get keys for your project from the project settings page\n# https://cloud.langfuse.com\nos.environ[\"LANGFUSE_PUBLIC_KEY\"] = \"\"\nos.environ[\"LANGFUSE_SECRET_KEY\"] = \"\"\nos.environ[\"LANGFUSE_HOST\"] = \"https://cloud.langfuse.com\" # 🇪🇺 EU region\n# os.environ[\"LANGFUSE_HOST\"] = \"https://us.cloud.langfuse.com\" # 🇺🇸 US region\n\n# Your openai key\nos.environ[\"OPENAI_API_KEY\"] = \"\"\n","from llama_index.core import Settings\nfrom llama_index.core.callbacks import CallbackManager\nfrom langfuse.llama_index import LlamaIndexCallbackHandler\n \nlangfuse_callback_handler = LlamaIndexCallbackHandler()\nSettings.callback_manager = CallbackManager([langfuse_callback_handler])\n","from llama_index.core import Document\n\ndoc1 = Document(text=\"\"\"\nMaxwell \"Max\" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.\n\"\"\")\ndoc2 = Document(text=\"\"\"\nThroughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are \"Fleeting Echoes,\" \"Halcyon Dusk,\" and the Academy Award-winning sci-fi epic, \"Event Horizon's Brink.\" His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.\n\"\"\")\n","# Example index construction + LLM query\n\nfrom llama_index.core import VectorStoreIndex\nfrom llama_index.core import StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(\n uri=\"tmp/milvus_demo.db\", dim=1536, overwrite=False\n)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\nindex = VectorStoreIndex.from_documents(\n [doc1,doc2], storage_context=storage_context\n)\n","# Query\nresponse = index.as_query_engine().query(\"What did he do growing up?\")\nprint(response)\n","# Chat\nresponse = index.as_chat_engine().chat(\"What did he do growing up?\")\nprint(response)\n","# As we want to immediately see result in Langfuse, we need to flush the callback handler\nlangfuse_callback_handler.flush()\n"],"headingContent":"Using Langfuse to Trace Queries in RAG","anchorList":[{"label":"Menggunakan Langfuse untuk Melacak Kueri di RAG","href":"Using-Langfuse-to-Trace-Queries-in-RAG","type":1,"isActive":false},{"label":"Penyiapan","href":"Setup","type":2,"isActive":false},{"label":"Mengindeks menggunakan Milvus Lite","href":"Index-using-Milvus-Lite","type":2,"isActive":false},{"label":"Kueri","href":"Query","type":2,"isActive":false},{"label":"Jelajahi jejak di Langfuse","href":"Explore-traces-in-Langfuse","type":2,"isActive":false},{"label":"Tertarik dengan fitur yang lebih canggih?","href":"Interested-in-more-advanced-features","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.md b/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.md new file mode 100644 index 000000000..f13f708c2 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_langfuse.md @@ -0,0 +1,180 @@ +--- +id: integrate_with_langfuse.md +summary: >- + Ini adalah buku resep sederhana yang mendemonstrasikan cara menggunakan + integrasi LlamaIndex Langfuse. Buku ini menggunakan Milvus Lite untuk + menyimpan dokumen dan Query. +title: Menggunakan Langfuse untuk Mengevaluasi Kualitas RAG +--- +

    Menggunakan Langfuse untuk Melacak Kueri di RAG

    +Open In Colab +

    +

    Ini adalah buku resep sederhana yang mendemonstrasikan cara menggunakan Langfuse untuk melacak kueri Anda di RAG. Pipeline RAG diimplementasikan dengan LlamaIndex dan Milvus Lite untuk menyimpan dan mengambil dokumen.

    +

    Dalam tutorial singkat ini, kami akan menunjukkan kepada Anda cara menyiapkan aplikasi LlamaIndex menggunakan Milvus Lite sebagai penyimpan vektor. Kami juga akan menunjukkan kepada Anda cara menggunakan integrasi Langfuse LlamaIndex untuk melacak aplikasi Anda.

    +

    Langfuse adalah platform rekayasa LLM sumber terbuka yang membantu tim secara kolaboratif men-debug, menganalisis, dan mengulang aplikasi LLM mereka. Semua fitur platform terintegrasi secara native untuk mempercepat alur kerja pengembangan.

    +

    Milvus Lite adalah versi ringan dari Milvus, database vektor sumber terbuka yang mendukung aplikasi AI dengan penyematan vektor dan pencarian kemiripan.

    +

    Penyiapan

    Pastikan Anda telah menginstal llama-index dan langfuse.

    +
    $ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade
    +
    +

    Inisialisasi integrasi. Dapatkan kunci API Anda dari pengaturan proyek Langfuse, dan ganti public_key secret_key dengan nilai kunci Anda. Contoh ini menggunakan OpenAI untuk penyematan dan penyelesaian obrolan, sehingga Anda juga perlu menentukan kunci OpenAI Anda di variabel lingkungan.

    +
    import os
    +
    +# Get keys for your project from the project settings page
    +# https://cloud.langfuse.com
    +os.environ["LANGFUSE_PUBLIC_KEY"] = ""
    +os.environ["LANGFUSE_SECRET_KEY"] = ""
    +os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # 🇪🇺 EU region
    +# os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # 🇺🇸 US region
    +
    +# Your openai key
    +os.environ["OPENAI_API_KEY"] = ""
    +
    +
    from llama_index.core import Settings
    +from llama_index.core.callbacks import CallbackManager
    +from langfuse.llama_index import LlamaIndexCallbackHandler
    + 
    +langfuse_callback_handler = LlamaIndexCallbackHandler()
    +Settings.callback_manager = CallbackManager([langfuse_callback_handler])
    +
    +

    Mengindeks menggunakan Milvus Lite

    from llama_index.core import Document
    +
    +doc1 = Document(text="""
    +Maxwell "Max" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.
    +""")
    +doc2 = Document(text="""
    +Throughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are "Fleeting Echoes," "Halcyon Dusk," and the Academy Award-winning sci-fi epic, "Event Horizon's Brink." His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.
    +""")
    +
    +
    # Example index construction + LLM query
    +
    +from llama_index.core import VectorStoreIndex
    +from llama_index.core import StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(
    +    uri="tmp/milvus_demo.db", dim=1536, overwrite=False
    +)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +index = VectorStoreIndex.from_documents(
    +    [doc1,doc2], storage_context=storage_context
    +)
    +
    +

    Kueri

    # Query
    +response = index.as_query_engine().query("What did he do growing up?")
    +print(response)
    +
    +
    # Chat
    +response = index.as_chat_engine().chat("What did he do growing up?")
    +print(response)
    +
    +

    Jelajahi jejak di Langfuse

    # As we want to immediately see result in Langfuse, we need to flush the callback handler
    +langfuse_callback_handler.flush()
    +
    +

    Selesai! ✨ Anda melihat jejak indeks dan kueri Anda di proyek Langfuse Anda.

    +

    Contoh jejak (tautan publik):

    +
      +
    1. Query
    2. +
    3. Kueri (obrolan)
    4. +
    +

    Jejak di Langfuse:

    +

    + + Langfuse Traces + Jejak Langfuse

    +

    Tertarik dengan fitur yang lebih canggih?

    Lihat dokumen integrasi lengkap untuk mempelajari lebih lanjut tentang fitur-fitur canggih dan cara menggunakannya:

    +
      +
    • Interoperabilitas dengan Langfuse Python SDK dan integrasi lainnya
    • +
    • Menambahkan metadata dan atribut khusus ke jejak
    • +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.json b/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.json new file mode 100644 index 000000000..73587b49a --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus>=2.4.2\n","$ pip install llama-index-vector-stores-milvus\n","$ pip install llama-index\n","import openai\n\nopenai.api_key = \"sk-***********\"\n","! mkdir -p 'data/'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'\n","from llama_index.core import SimpleDirectoryReader\n\n# load documents\ndocuments = SimpleDirectoryReader(\n input_files=[\"./data/paul_graham_essay.txt\"]\n).load_data()\n\nprint(\"Document ID:\", documents[0].doc_id)\n","# Create an index over the documents\nfrom llama_index.core import VectorStoreIndex, StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\n","query_engine = index.as_query_engine()\nres = query_engine.query(\"What did the author learn?\")\nprint(res)\n","res = query_engine.query(\"What challenges did the disease pose for the author?\")\nprint(res)\n","from llama_index.core import Document\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(\n [Document(text=\"The number that is being searched for is ten.\")],\n storage_context,\n)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"Who is the author?\")\nprint(res)\n","del index, vector_store, storage_context, query_engine\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", overwrite=False)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"What is the number?\")\nprint(res)\n","res = query_engine.query(\"Who is the author?\")\nprint(res)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Load all the two documents loaded before\ndocuments_all = SimpleDirectoryReader(\"./data/\").load_data()\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents_all, storage_context)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"uber_2021.pdf\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"paul_graham_essay.txt\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LlamaIndex","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) dengan Milvus dan LlamaIndex","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LlamaIndex","type":1,"isActive":false},{"label":"Sebelum Anda memulai","href":"Before-you-begin","type":2,"isActive":false},{"label":"Memulai","href":"Getting-Started","type":2,"isActive":false},{"label":"Penyaringan metadata","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.md b/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.md new file mode 100644 index 000000000..44c3ffd86 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_llamaindex.md @@ -0,0 +1,203 @@ +--- +id: integrate_with_llamaindex.md +summary: >- + Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented + Generation (RAG) menggunakan LlamaIndex dan Milvus. +title: Retrieval-Augmented Generation (RAG) dengan Milvus dan LlamaIndex +--- +

    Retrieval-Augmented Generation (RAG) dengan Milvus dan LlamaIndex

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented Generation (RAG) dengan menggunakan LlamaIndex dan Milvus.

    +

    Sistem RAG menggabungkan sistem pencarian dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari sebuah korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    LlamaIndex adalah kerangka kerja data yang sederhana dan fleksibel untuk menghubungkan sumber data khusus ke model bahasa besar (LLM). Milvus adalah basis data vektor sumber terbuka yang paling canggih di dunia, yang dibuat untuk mendukung pencarian kemiripan dan aplikasi AI.

    +

    Dalam buku catatan ini, kami akan menunjukkan demo singkat penggunaan MilvusVectorStore.

    +

    Sebelum Anda memulai

    Menginstal ketergantungan

    Potongan kode pada halaman ini membutuhkan dependensi pymilvus dan llamaindex. Anda dapat menginstalnya dengan menggunakan perintah berikut:

    +
    $ pip install pymilvus>=2.4.2
    +
    +
    $ pip install llama-index-vector-stores-milvus
    +
    +
    $ pip install llama-index
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Menyiapkan OpenAI

    Pertama-tama, mari kita mulai dengan menambahkan kunci api openai. Ini akan memungkinkan kita untuk mengakses chatgpt.

    +
    import openai
    +
    +openai.api_key = "sk-***********"
    +
    +

    Menyiapkan data

    Anda dapat mengunduh data sampel dengan perintah berikut:

    +
    ! mkdir -p 'data/'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'
    +
    +

    Memulai

    Menghasilkan data kita

    Sebagai contoh pertama, mari kita buat sebuah dokumen dari file paul_graham_essay.txt. Dokumen tersebut adalah sebuah esai dari Paul Graham yang berjudul What I Worked On. Untuk menghasilkan dokumen, kita akan menggunakan SimpleDirectoryReader.

    +
    from llama_index.core import SimpleDirectoryReader
    +
    +# load documents
    +documents = SimpleDirectoryReader(
    +    input_files=["./data/paul_graham_essay.txt"]
    +).load_data()
    +
    +print("Document ID:", documents[0].doc_id)
    +
    +
    Document ID: 95f25e4d-f270-4650-87ce-006d69d82033
    +
    +

    Membuat indeks di seluruh data

    Sekarang kita telah memiliki sebuah dokumen, kita dapat membuat sebuah indeks dan menyisipkan dokumen tersebut.

    +
    +

    Harap dicatat bahwa Milvus Lite membutuhkan pymilvus>=2.4.2.

    +
    +
    # Create an index over the documents
    +from llama_index.core import VectorStoreIndex, StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +
    +
    +

    Untuk parameter MilvusVectorStore:

    +
      +
    • Mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis Milvus Lite akan menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Menanyakan data

    Setelah dokumen kita tersimpan dalam indeks, kita dapat mengajukan pertanyaan terhadap indeks. Indeks akan menggunakan data yang tersimpan di dalamnya sebagai basis pengetahuan untuk chatgpt.

    +
    query_engine = index.as_query_engine()
    +res = query_engine.query("What did the author learn?")
    +print(res)
    +
    +
    The author learned that philosophy courses in college were boring to him, leading him to switch his focus to studying AI.
    +
    +
    res = query_engine.query("What challenges did the disease pose for the author?")
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in her losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    +

    Pengujian berikutnya menunjukkan bahwa penimpaan akan menghapus data sebelumnya.

    +
    from llama_index.core import Document
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(
    +    [Document(text="The number that is being searched for is ten.")],
    +    storage_context,
    +)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    The author is the individual who created the context information.
    +
    +

    Pengujian berikutnya menunjukkan penambahan data tambahan ke indeks yang sudah ada.

    +
    del index, vector_store, storage_context, query_engine
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", overwrite=False)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("What is the number?")
    +print(res)
    +
    +
    The number is ten.
    +
    +
    res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    Paul Graham
    +
    +

    Penyaringan metadata

    Kita dapat menghasilkan hasil dengan menyaring sumber-sumber tertentu. Contoh berikut mengilustrasikan pemuatan semua dokumen dari direktori dan kemudian menyaringnya berdasarkan metadata.

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Load all the two documents loaded before
    +documents_all = SimpleDirectoryReader("./data/").load_data()
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents_all, storage_context)
    +
    +

    Kita hanya ingin mengambil dokumen dari file uber_2021.pdf.

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="uber_2021.pdf")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges related to the adverse impact on the business and operations, including reduced demand for Mobility offerings globally, affecting travel behavior and demand. Additionally, the pandemic led to driver supply constraints, impacted by concerns regarding COVID-19, with uncertainties about when supply levels would return to normal. The rise of the Omicron variant further affected travel, resulting in advisories and restrictions that could adversely impact both driver supply and consumer demand for Mobility offerings.
    +
    +

    Kita mendapatkan hasil yang berbeda ketika mengambil dari file paul_graham_essay.txt.

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="paul_graham_essay.txt")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in his mother losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.json b/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.json new file mode 100644 index 000000000..d5b74c55c --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.json @@ -0,0 +1 @@ +{"codeList":["$ pip install 'pymemgpt[milvus]'\n","$ memgpt configure\n","...\n? Select storage backend for archival data: milvus\n? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db\n","# we're saving the file as \"memgpt_research_paper.pdf\"\n$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf\n","$ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf\n","Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00, 3.94file/s]\nLoaded 74 passages and 13 documents from memgpt_research_paper\n","# reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona\n$ memgpt run --persona memgpt_doc\n","? Would you like to select an existing agent? No\n\n🧬 Creating new agent...\n-> 🤖 Using persona profile: 'sam_pov'\n-> 🧑 Using human profile: 'basic'\n🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)\n\nHit enter to begin (will request first MemGPT message)\n\n💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.\n🤖 Greetings Chad! I'm MemGPT. How may I assist you today?\n\n> Enter your message: /attach\n? Select data source memgpt_research_paper\n100%|███████████████████████████████████| 1/1 [00:00<00:00, 4.81it/s]\n","> Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?\n\n💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive\nunderstanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.\n⚡🧠 [function] searching memory with archival_memory_search\n💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within\nthe LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.\n🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern \nLarge Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision \nof extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context \nbaselines in deep memory retrieval and it's able to analyze large documents with precision.\n\n"],"headingContent":"MemGPT with Milvus Integration","anchorList":[{"label":"MemGPT dengan Integrasi Milvus","href":"MemGPT-with-Milvus-Integration","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration","type":2,"isActive":false},{"label":"Membuat sumber data eksternal","href":"Creating-an-external-data-source","type":2,"isActive":false},{"label":"Melampirkan sumber data ke agen MemGPT","href":"Attaching-the-data-source-to-a-MemGPT-agent","type":2,"isActive":false},{"label":"Menguji chatbot baru kami","href":"Testing-out-our-new-chatbot","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.md b/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.md new file mode 100644 index 000000000..d8c9a8d66 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_memgpt.md @@ -0,0 +1,145 @@ +--- +id: integrate_with_memgpt.md +summary: >- + MemGPT memudahkan untuk membangun dan menggunakan agen LLM yang stateful. + Dengan integrasi Milvus, Anda bisa membuat agen dengan koneksi ke sumber data + eksternal (RAG). +title: MemGPT dengan Integrasi Milvus +--- +

    MemGPT dengan Integrasi Milvus

    MemGPT memudahkan untuk membangun dan menggunakan agen LLM yang stateful. Dengan integrasi Milvus, Anda dapat membuat agen dengan koneksi ke sumber data eksternal (RAG).

    +

    Dalam contoh ini, kita akan menggunakan MemGPT untuk mengobrol dengan sumber data khusus yang disimpan di Milvus.

    +

    Konfigurasi

    Untuk menjalankan MemGPT, Anda harus memastikan versi Python >= 3.10.

    +

    Untuk mengaktifkan backend Milvus, pastikan Anda telah menginstal dependensi yang diperlukan:

    +
    $ pip install 'pymemgpt[milvus]'
    +
    +

    Anda dapat mengonfigurasi koneksi Milvus melalui perintah

    +
    $ memgpt configure
    +
    +
    ...
    +? Select storage backend for archival data: milvus
    +? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db
    +
    +

    Anda cukup mengatur URI ke jalur file lokal, misalnya ~/.memgpt/milvus.db, yang secara otomatis akan memanggil instance layanan Milvus lokal melalui Milvus Lite.

    +

    Jika Anda memiliki data berskala besar, seperti lebih dari satu juta dokumen, kami sarankan untuk menyiapkan server Milvus yang lebih berkinerja baik di docker atau kubenetes. Dalam hal ini, URI Anda haruslah URI server, misalnya http://localhost:19530.

    +

    Membuat sumber data eksternal

    Untuk memasukkan data eksternal ke dalam chatbot MemGPT, pertama-tama kita perlu membuat sumber data.

    +

    Untuk mengunduh makalah penelitian MemGPT, kami akan menggunakan curl (Anda juga dapat mengunduh PDF dari browser Anda):

    +
    # we're saving the file as "memgpt_research_paper.pdf"
    +$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf
    +
    +

    Sekarang setelah kita mengunduh makalahnya, kita dapat membuat sumber data MemGPT menggunakan memgpt load:

    +
    $ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf
    +
    +
    Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  3.94file/s]
    +Loaded 74 passages and 13 documents from memgpt_research_paper
    +
    +

    Melampirkan sumber data ke agen MemGPT

    Sekarang setelah kita membuat sumber data ini, kita dapat melampirkannya ke chatbot MemGPT kapan saja.

    +

    Mari kita buat chatbot baru menggunakan persona memgpt_doc (tetapi Anda dapat menggunakan persona apa pun yang Anda inginkan):

    +
    # reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona
    +$ memgpt run --persona memgpt_doc
    +
    +

    Setelah kita mengobrol dengan agen, kita dapat "melampirkan" sumber data ke memori arsip agen:

    +
    ? Would you like to select an existing agent? No
    +
    +🧬 Creating new agent...
    +->  🤖 Using persona profile: 'sam_pov'
    +->  🧑 Using human profile: 'basic'
    +🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)
    +
    +Hit enter to begin (will request first MemGPT message)
    +
    +💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.
    +🤖 Greetings Chad! I'm MemGPT. How may I assist you today?
    +
    +> Enter your message: /attach
    +? Select data source memgpt_research_paper
    +100%|███████████████████████████████████| 1/1 [00:00<00:00,  4.81it/s]
    +
    +

    Menguji chatbot baru kami

    Sekarang setelah data dimuat ke dalam memori chatbot, kita dapat mulai mengajukan pertanyaan tentang data tersebut:

    +
    > Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?
    +
    +💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive
    +understanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.
    +⚡🧠 [function] searching memory with archival_memory_search
    +💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within
    +the LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.
    +🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern 
    +Large Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision 
    +of extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context 
    +baselines in deep memory retrieval and it's able to analyze large documents with precision.
    +
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_openai.json b/localization/v2.5.x/site/id/integrations/integrate_with_openai.json new file mode 100644 index 000000000..d8c957c65 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade openai pymilvus\n","from openai import OpenAI\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"text-embedding-3-small\" # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models\nDIMENSION = 1536 # Dimension of vector embedding\n\n# Connect to OpenAI with API Key.\nopenai_client = OpenAI(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data\n]\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_openai_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_openai_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data\n]\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n","[\n {\n \"id\": 0,\n \"distance\": -0.772376537322998,\n \"entity\": {\n \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"subject\": \"history\",\n },\n },\n {\n \"id\": 1,\n \"distance\": -0.58596271276474,\n \"entity\": {\n \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"subject\": \"history\",\n },\n },\n]\n"],"headingContent":"Semantic Search with Milvus and OpenAI","anchorList":[{"label":"Pencarian Semantik dengan Milvus dan OpenAI","href":"Semantic-Search-with-Milvus-and-OpenAI","type":1,"isActive":false},{"label":"Memulai","href":"Getting-started","type":2,"isActive":false},{"label":"Mencari judul buku dengan OpenAI & Milvus","href":"Searching-book-titles-with-OpenAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_openai.md b/localization/v2.5.x/site/id/integrations/integrate_with_openai.md new file mode 100644 index 000000000..f637cdf7b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_openai.md @@ -0,0 +1,155 @@ +--- +id: integrate_with_openai.md +title: Pencarian Semantik dengan Milvus dan OpenAI +summary: Halaman ini membahas integrasi basis data vektor dengan API penyematan OpenAI. +--- +

    Pencarian Semantik dengan Milvus dan OpenAI

    Open In Colab +GitHub Repository

    +

    Panduan ini menunjukkan bagaimana Embedding API OpenAI dapat digunakan dengan basis data vektor Milvus untuk melakukan pencarian semantik pada teks.

    +

    Memulai

    Sebelum memulai, pastikan Anda telah menyiapkan kunci API OpenAI, atau Anda bisa mendapatkannya dari situs web OpenAI.

    +

    Data yang digunakan dalam contoh ini adalah judul buku. Anda dapat mengunduh dataset di sini dan meletakkannya di direktori yang sama dengan tempat Anda menjalankan kode berikut.

    +

    Pertama, instal paket untuk Milvus dan OpenAI:

    +
    pip install --upgrade openai pymilvus
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik pada menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Dengan ini, kita siap untuk membuat sematan dan menggunakan basis data vektor untuk melakukan pencarian semantik.

    +

    Mencari judul buku dengan OpenAI & Milvus

    Pada contoh berikut, kita memuat data judul buku dari file CSV yang diunduh, menggunakan model penyematan OpenAI untuk menghasilkan representasi vektor, dan menyimpannya di database vektor Milvus untuk pencarian semantik.

    +
    from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "text-embedding-3-small"  # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models
    +DIMENSION = 1536  # Dimension of vector embedding
    +
    +# Connect to OpenAI with API Key.
    +openai_client = OpenAI(api_key="<YOUR_OPENAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data
    +]
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_openai_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_openai_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Dengan semua data dalam basis data vektor Milvus, kita sekarang dapat melakukan pencarian semantik dengan membuat penyematan vektor untuk kueri dan melakukan pencarian vektor.

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data
    +]
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +

    Anda akan melihat hasil sebagai berikut:

    +
    [
    +    {
    +        "id": 0,
    +        "distance": -0.772376537322998,
    +        "entity": {
    +            "text": "Artificial intelligence was founded as an academic discipline in 1956.",
    +            "subject": "history",
    +        },
    +    },
    +    {
    +        "id": 1,
    +        "distance": -0.58596271276474,
    +        "entity": {
    +            "text": "Alan Turing was the first person to conduct substantial research in AI.",
    +            "subject": "history",
    +        },
    +    },
    +]
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.json b/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.json new file mode 100644 index 000000000..4008df10a --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus torch gdown torchvision tqdm\n","import gdown\nimport zipfile\n\nurl = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'\noutput = './paintings.zip'\ngdown.download(url, output)\n\nwith zipfile.ZipFile(\"./paintings.zip\",\"r\") as zip_ref:\n zip_ref.extractall(\"./paintings\")\n","# Milvus Setup Arguments\nCOLLECTION_NAME = 'image_search' # Collection name\nDIMENSION = 2048 # Embedding vector size in this example\nMILVUS_HOST = \"localhost\"\nMILVUS_PORT = \"19530\"\n\n# Inference Arguments\nBATCH_SIZE = 128\nTOP_K = 3\n","from pymilvus import connections\n\n# Connect to the instance\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n","from pymilvus import utility\n\n# Remove any previous collections with the same name\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n","from pymilvus import FieldSchema, CollectionSchema, DataType, Collection\n\n# Create collection which includes the id, filepath of the image, and image embedding\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200), # VARCHARS need a maximum length, so for this example they are set to 200 characters\n FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n","# Create an AutoIndex index for collection\nindex_params = {\n'metric_type':'L2',\n'index_type':\"IVF_FLAT\",\n'params':{'nlist': 16384}\n}\ncollection.create_index(field_name=\"image_embedding\", index_params=index_params)\ncollection.load()\n","import glob\n\n# Get the filepaths of the images\npaths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)\nlen(paths)\n","import torch\n\n# Load the embedding model with the last layer removed\nmodel = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\nmodel = torch.nn.Sequential(*(list(model.children())[:-1]))\nmodel.eval()\n","from torchvision import transforms\n\n# Preprocessing for images\npreprocess = transforms.Compose([\n transforms.Resize(256),\n transforms.CenterCrop(224),\n transforms.ToTensor(),\n transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n","from PIL import Image\nfrom tqdm import tqdm\n\n# Embed function that embeds the batch and inserts it\ndef embed(data):\n with torch.no_grad():\n output = model(torch.stack(data[0])).squeeze()\n collection.insert([data[1], output.tolist()])\n\ndata_batch = [[],[]]\n\n# Read the images into batches for embedding and insertion\nfor path in tqdm(paths):\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n if len(data_batch[0]) % BATCH_SIZE == 0:\n embed(data_batch)\n data_batch = [[],[]]\n\n# Embed and insert the remainder\nif len(data_batch[0]) != 0:\n embed(data_batch)\n\n# Call a flush to index any unsealed segments.\ncollection.flush()\n","import glob\n\n# Get the filepaths of the search images\nsearch_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)\nlen(search_paths)\n","import time\nfrom matplotlib import pyplot as plt\n\n# Embed the search images\ndef embed(data):\n with torch.no_grad():\n ret = model(torch.stack(data))\n # If more than one image, use squeeze\n if len(ret) > 1:\n return ret.squeeze().tolist()\n # Squeeze would remove batch for single image, so using flatten\n else:\n return torch.flatten(ret, start_dim=1).tolist()\n\ndata_batch = [[],[]]\n\nfor path in search_paths:\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n\nembeds = embed(data_batch[0])\nstart = time.time()\nres = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])\nfinish = time.time()\n","# Show the image results\nf, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)\n\nfor hits_i, hits in enumerate(res):\n axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))\n axarr[hits_i][0].set_axis_off()\n axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))\n for hit_i, hit in enumerate(hits):\n axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))\n axarr[hits_i][hit_i + 1].set_axis_off()\n axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))\n\n# Save the search result in a separate image file alongside your script.\nplt.savefig('search_result.png')\n"],"headingContent":"Image Search with PyTorch and Milvus","anchorList":[{"label":"Pencarian Gambar dengan PyTorch dan Milvus","href":"Image-Search-with-PyTorch-and-Milvus","type":1,"isActive":false},{"label":"Menginstal persyaratan","href":"Installing-the-requirements","type":2,"isActive":false},{"label":"Mengambil data","href":"Grabbing-the-data","type":2,"isActive":false},{"label":"Argumen Global","href":"Global-Arguments","type":2,"isActive":false},{"label":"Menyiapkan Milvus","href":"Setting-up-Milvus","type":2,"isActive":false},{"label":"Memasukkan data","href":"Inserting-the-data","type":2,"isActive":false},{"label":"Melakukan pencarian","href":"Performing-the-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.md b/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.md new file mode 100644 index 000000000..32cf03ad4 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_pytorch.md @@ -0,0 +1,299 @@ +--- +id: integrate_with_pytorch.md +summary: >- + Halaman ini mendemonstrasikan cara membuat pencarian gambar dengan PyTorch dan + Milvus +title: Pencarian Gambar dengan PyTorch dan Milvus +--- +

    Pencarian Gambar dengan PyTorch dan Milvus

    Panduan ini memperkenalkan contoh pengintegrasian PyTorch dan Milvus untuk melakukan pencarian gambar menggunakan penyematan. PyTorch adalah kerangka kerja pembelajaran mendalam sumber terbuka yang kuat dan banyak digunakan untuk membangun dan menerapkan model pembelajaran mesin. Dalam contoh ini, kita akan memanfaatkan pustaka Torchvision dan model ResNet50 yang telah dilatih sebelumnya untuk menghasilkan vektor fitur (embedding) yang merepresentasikan konten gambar. Embeddings ini akan disimpan di Milvus, database vektor berkinerja tinggi, untuk memungkinkan pencarian kemiripan yang efisien. Dataset yang digunakan adalah Impressionist-Classifier Dataset dari Kaggle. Dengan menggabungkan kemampuan pembelajaran mendalam PyTorch dengan fungsionalitas pencarian yang dapat diskalakan dari Milvus, contoh ini mendemonstrasikan cara membangun sistem pengambilan gambar yang kuat dan efisien.

    +

    Mari kita mulai!

    +

    Menginstal persyaratan

    Untuk contoh ini, kita akan menggunakan pymilvus untuk terhubung menggunakan Milvus, torch untuk menjalankan model penyematan, torchvision untuk model aktual dan prapemrosesan, gdown untuk mengunduh dataset contoh dan tqdm untuk memuat bilah.

    +
    pip install pymilvus torch gdown torchvision tqdm
    +
    +

    Mengambil data

    Kita akan menggunakan gdown untuk mengambil zip dari Google Drive dan kemudian mendekompresnya dengan pustaka zipfile bawaan.

    +
    import gdown
    +import zipfile
    +
    +url = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'
    +output = './paintings.zip'
    +gdown.download(url, output)
    +
    +with zipfile.ZipFile("./paintings.zip","r") as zip_ref:
    +    zip_ref.extractall("./paintings")
    +
    +
    +

    Ukuran dataset adalah 2,35 GB, dan waktu yang dihabiskan untuk mengunduhnya tergantung pada kondisi jaringan Anda.

    +
    +

    Argumen Global

    Berikut ini adalah beberapa argumen global utama yang akan kita gunakan untuk memudahkan pelacakan dan pembaruan.

    +
    # Milvus Setup Arguments
    +COLLECTION_NAME = 'image_search'  # Collection name
    +DIMENSION = 2048  # Embedding vector size in this example
    +MILVUS_HOST = "localhost"
    +MILVUS_PORT = "19530"
    +
    +# Inference Arguments
    +BATCH_SIZE = 128
    +TOP_K = 3
    +
    +

    Menyiapkan Milvus

    Pada tahap ini, kita akan mulai menyiapkan Milvus. Langkah-langkahnya adalah sebagai berikut:

    +
      +
    1. Hubungkan ke instans Milvus menggunakan URI yang disediakan.

      +
      from pymilvus import connections
      +
      +# Connect to the instance
      +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
      +
    2. +
    3. Jika koleksinya sudah ada, hapus saja.

      +
      from pymilvus import utility
      +
      +# Remove any previous collections with the same name
      +if utility.has_collection(COLLECTION_NAME):
      +    utility.drop_collection(COLLECTION_NAME)
      +
    4. +
    5. Buat koleksi yang menyimpan ID, jalur berkas gambar, dan penyematannya.

      +
      from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
      +
      +# Create collection which includes the id, filepath of the image, and image embedding
      +fields = [
      +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
      +    FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200),  # VARCHARS need a maximum length, so for this example they are set to 200 characters
      +    FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
      +]
      +schema = CollectionSchema(fields=fields)
      +collection = Collection(name=COLLECTION_NAME, schema=schema)
      +
    6. +
    7. Buat indeks pada koleksi yang baru dibuat dan muat ke dalam memori.

      +
      # Create an AutoIndex index for collection
      +index_params = {
      +'metric_type':'L2',
      +'index_type':"IVF_FLAT",
      +'params':{'nlist': 16384}
      +}
      +collection.create_index(field_name="image_embedding", index_params=index_params)
      +collection.load()
      +
    8. +
    +

    Setelah langkah-langkah ini selesai, koleksi siap untuk dimasukkan ke dalam dan dicari. Setiap data yang ditambahkan akan diindeks secara otomatis dan tersedia untuk segera dicari. Jika data masih sangat baru, pencarian mungkin akan lebih lambat karena pencarian brute force akan digunakan pada data yang masih dalam proses pengindeksan.

    +

    Memasukkan data

    Untuk contoh ini, kita akan menggunakan model ResNet50 yang disediakan oleh torch dan hub modelnya. Untuk mendapatkan penyematan, kita akan membuang lapisan klasifikasi akhir, yang menghasilkan model yang memberikan penyematan 2048 dimensi. Semua model visi yang ditemukan di torch menggunakan preprocessing yang sama dengan yang kami sertakan di sini.

    +

    Dalam beberapa langkah berikutnya kita akan melakukannya:

    +
      +
    1. Memuat data.

      +
      import glob
      +
      +# Get the filepaths of the images
      +paths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)
      +len(paths)
      +
    2. +
    3. Memproses data menjadi beberapa kelompok.

      +
      import torch
      +
      +# Load the embedding model with the last layer removed
      +model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
      +model = torch.nn.Sequential(*(list(model.children())[:-1]))
      +model.eval()
      +
    4. +
    5. Menanamkan data.

      +
      from torchvision import transforms
      +
      +# Preprocessing for images
      +preprocess = transforms.Compose([
      +    transforms.Resize(256),
      +    transforms.CenterCrop(224),
      +    transforms.ToTensor(),
      +    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      +])
      +
    6. +
    7. Memasukkan data.

      +
      from PIL import Image
      +from tqdm import tqdm
      +
      +# Embed function that embeds the batch and inserts it
      +def embed(data):
      +    with torch.no_grad():
      +        output = model(torch.stack(data[0])).squeeze()
      +        collection.insert([data[1], output.tolist()])
      +
      +data_batch = [[],[]]
      +
      +# Read the images into batches for embedding and insertion
      +for path in tqdm(paths):
      +    im = Image.open(path).convert('RGB')
      +    data_batch[0].append(preprocess(im))
      +    data_batch[1].append(path)
      +    if len(data_batch[0]) % BATCH_SIZE == 0:
      +        embed(data_batch)
      +        data_batch = [[],[]]
      +
      +# Embed and insert the remainder
      +if len(data_batch[0]) != 0:
      +    embed(data_batch)
      +
      +# Call a flush to index any unsealed segments.
      +collection.flush()
      +
      +
      +
        +
      • Langkah ini relatif memakan waktu karena penyematan membutuhkan waktu. Minumlah seteguk kopi dan bersantailah.
      • +
      • PyTorch mungkin tidak bekerja dengan baik dengan Python 3.9 dan versi sebelumnya. Pertimbangkan untuk menggunakan Python 3.10 dan versi yang lebih baru.
      • +
      +
      +
    8. +
    +

    Dengan semua data yang telah dimasukkan ke dalam Milvus, kita dapat mulai melakukan pencarian. Pada contoh ini, kita akan mencari dua contoh gambar. Karena kita melakukan pencarian batch, waktu pencarian dibagi ke seluruh gambar dalam batch tersebut.

    +
    import glob
    +
    +# Get the filepaths of the search images
    +search_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)
    +len(search_paths)
    +
    +
    import time
    +from matplotlib import pyplot as plt
    +
    +# Embed the search images
    +def embed(data):
    +    with torch.no_grad():
    +        ret = model(torch.stack(data))
    +        # If more than one image, use squeeze
    +        if len(ret) > 1:
    +            return ret.squeeze().tolist()
    +        # Squeeze would remove batch for single image, so using flatten
    +        else:
    +            return torch.flatten(ret, start_dim=1).tolist()
    +
    +data_batch = [[],[]]
    +
    +for path in search_paths:
    +    im = Image.open(path).convert('RGB')
    +    data_batch[0].append(preprocess(im))
    +    data_batch[1].append(path)
    +
    +embeds = embed(data_batch[0])
    +start = time.time()
    +res = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])
    +finish = time.time()
    +
    +
    # Show the image results
    +f, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)
    +
    +for hits_i, hits in enumerate(res):
    +    axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))
    +    axarr[hits_i][0].set_axis_off()
    +    axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))
    +    for hit_i, hit in enumerate(hits):
    +        axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))
    +        axarr[hits_i][hit_i + 1].set_axis_off()
    +        axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))
    +
    +# Save the search result in a separate image file alongside your script.
    +plt.savefig('search_result.png')
    +
    +

    Gambar hasil pencarian akan terlihat seperti berikut ini:

    +

    + + Image search output + Output pencarian gambar

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_ragas.json b/localization/v2.5.x/site/id/integrations/integrate_with_ragas.json new file mode 100644 index 000000000..d20c398e6 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_ragas.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas ragas\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-3.5-turbo\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\n self.USER_PROMPT = \"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"foo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import os\nimport urllib.request\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\n# We simply use \"# \" to separate the content in the file, which can roughly separate the content of each main part of the markdown file.\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines) # Load the text data into RAG pipeline\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from ragas import evaluate\nfrom ragas.metrics import (\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n)\n\nresult = evaluate(\n rag_results,\n metrics=[\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n ],\n)\n\nresult\n"],"headingContent":"Evaluation with Ragas","anchorList":[{"label":"Evaluasi dengan Ragas","href":"Evaluation-with-Ragas","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mendefinisikan pipeline RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Jalankan pipeline RAG dan dapatkan hasilnya","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Evaluasi dengan Ragas","href":"Evaluation-with-Ragas","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_ragas.md b/localization/v2.5.x/site/id/integrations/integrate_with_ragas.md new file mode 100644 index 000000000..1f8545c5d --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_ragas.md @@ -0,0 +1,359 @@ +--- +id: integrate_with_ragas.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan Ragas untuk mengevaluasi + pipeline Retrieval-Augmented Generation (RAG) yang dibangun di atas Milvus. +title: Evaluasi dengan Ragas +--- +

    Evaluasi dengan Ragas

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara menggunakan Ragas untuk mengevaluasi pipeline Retrieval-Augmented Generation (RAG) yang dibangun di atas Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    Ragas adalah sebuah kerangka kerja yang membantu Anda mengevaluasi pipeline RAG Anda. Ada alat dan kerangka kerja yang ada yang membantu Anda membangun pipeline ini, tetapi mengevaluasinya dan mengukur kinerja pipeline Anda bisa jadi sulit. Di sinilah Ragas (Penilaian RAG) masuk.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut ini:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas ragas
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Mendefinisikan pipeline RAG

    Kita akan mendefinisikan kelas RAG yang menggunakan Milvus sebagai penyimpan vektor, dan OpenAI sebagai LLM. Kelas ini berisi metode load, yang memuat data teks ke dalam Milvus, metode retrieve, yang mengambil data teks yang paling mirip dengan pertanyaan yang diberikan, dan metode answer, yang menjawab pertanyaan yang diberikan dengan pengetahuan yang telah diambil.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-3.5-turbo",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +        self.USER_PROMPT = """
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("foo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",  # Inner product distance
    +            consistency_level="Strong",  # Strong consistency level
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Mari kita inisialisasi kelas RAG dengan klien OpenAI dan Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Jalankan pipeline RAG dan dapatkan hasilnya

    Kami menggunakan panduan pengembangan Milvus sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh dan muat ke dalam pipeline RAG.

    +
    import os
    +import urllib.request
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +# We simply use "# " to separate the content in the file, which can roughly separate the content of each main part of the markdown file.
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)  # Load the text data into RAG pipeline
    +
    +
    Creating embeddings: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 47/47 [00:16<00:00,  2.80it/s]
    +
    +

    Mari kita mendefinisikan pertanyaan kueri tentang konten dokumentasi panduan pengembangan. Lalu gunakan metode answer untuk mendapatkan jawaban dan teks konteks yang diambil.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is 8GB of RAM and 50GB of free disk space.',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Sekarang mari kita siapkan beberapa pertanyaan dengan jawaban ground truth yang sesuai. Kita mendapatkan jawaban dan konteks dari pipeline RAG kita.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    Answering questions: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.29s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    pertanyaankonteksjawabanground_truth
    0apa spesifikasi kebutuhan perangkat keras yang ...[Persyaratan Perangkat Keras\n\nSpesifikasi berikut ini adalah spesifikasi ...Spesifikasi persyaratan perangkat keras untuk membangun ...Jika Anda ingin membuat Milvus dan menjalankannya dari sumber ...
    1Apa bahasa pemrograman yang digunakan untuk menulis ...[CMake & Conan\n\nPustaka algoritma dari Mil...Bahasa pemrograman yang digunakan untuk menulis kode program Kno...Bahasa pemrograman yang digunakan untuk menulis algoritma Knowher...
    2Apa yang harus dipastikan sebelum menjalankan cakupan kode ...[Cakupan kode\n\nSebelum mengirimkan pull ...Sebelum menjalankan cakupan kode, Anda harus memastikan ...Sebelum menjalankan cakupan kode, Anda harus membuat ...
    +
    +

    Evaluasi dengan Ragas

    Kami menggunakan Ragas untuk mengevaluasi performa hasil pipeline RAG kami.

    +

    Ragas menyediakan satu set metrik yang mudah digunakan. Kami menggunakan Answer relevancy, Faithfulness, Context recall, dan Context precision sebagai metrik untuk mengevaluasi pipeline RAG kami. Untuk informasi lebih lanjut tentang metrik, silakan lihat Metrik Ragas.

    +
    from ragas import evaluate
    +from ragas.metrics import (
    +    answer_relevancy,
    +    faithfulness,
    +    context_recall,
    +    context_precision,
    +)
    +
    +result = evaluate(
    +    rag_results,
    +    metrics=[
    +        answer_relevancy,
    +        faithfulness,
    +        context_recall,
    +        context_precision,
    +    ],
    +)
    +
    +result
    +
    +
    Evaluating:   0%|          | 0/12 [00:00<?, ?it/s]
    +
    +
    +
    +
    +
    +{'answer_relevancy': 0.9445, 'faithfulness': 1.0000, 'context_recall': 1.0000, 'context_precision': 1.0000}
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.json b/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.json new file mode 100644 index 000000000..c6fc9e6cb --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus sentence-transformers datasets tqdm\n","from datasets import load_dataset\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nfrom tqdm import tqdm\n","embedding_dim = 384\ncollection_name = \"movie_embeddings\"\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","client = MilvusClient(uri=\"./sentence_transformers_example.db\")\n","fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n FieldSchema(name=\"year\", dtype=DataType.INT64),\n FieldSchema(name=\"origin\", dtype=DataType.VARCHAR, max_length=64),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"IP\")\nclient.create_index(collection_name, index_params)\n","model = SentenceTransformer(\"all-MiniLM-L12-v2\")\n","for batch in tqdm(ds.batch(batch_size=512)):\n embeddings = model.encode(batch[\"PlotSummary\"])\n data = [\n {\"title\": title, \"embedding\": embedding, \"year\": year, \"origin\": origin}\n for title, embedding, year, origin in zip(\n batch[\"Title\"], embeddings, batch[\"Release Year\"], batch[\"Origin/Ethnicity\"]\n )\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n 'A shark terrorizes an LA beach.',\n 'An archaeologist searches for ancient artifacts while fighting Nazis.',\n 'Teenagers in detention learn about themselves.',\n 'A teenager fakes illness to get off school and have adventures with two friends.',\n 'A young couple with a kid look after a hotel during winter and the husband goes insane.',\n 'Four turtles fight bad guys.'\n ]\n\n# Search the database based on input text\ndef embed_query(data):\n vectors = model.encode(data)\n return [x for x in vectors]\n\n\nquery_vectors = embed_query(queries)\n\nres = client.search(\n collection_name=collection_name,\n data=query_vectors,\n filter='origin == \"American\" and year > 1945 and year < 2000',\n anns_field=\"embedding\",\n limit=3,\n output_fields=[\"title\"],\n)\n\nfor idx, hits in enumerate(res):\n print(\"Query:\", queries[idx])\n print(\"Results:\")\n for hit in hits:\n print(hit[\"entity\"].get(\"title\"), \"(\", round(hit[\"distance\"], 2), \")\")\n print()\n","Query: An archaeologist searches for ancient artifacts while fighting Nazis.\nResults:\nLove Slaves of the Amazons ( 0.4 )\nA Time to Love and a Time to Die ( 0.39 )\nThe Fifth Element ( 0.39 )\n\nQuery: Teenagers in detention learn about themselves.\nResults:\nThe Breakfast Club ( 0.54 )\nUp the Academy ( 0.46 )\nFame ( 0.43 )\n\nQuery: A teenager fakes illness to get off school and have adventures with two friends.\nResults:\nFerris Bueller's Day Off ( 0.48 )\nFever Lake ( 0.47 )\nLosin' It ( 0.39 )\n\nQuery: A young couple with a kid look after a hotel during winter and the husband goes insane.\nResults:\nThe Shining ( 0.48 )\nThe Four Seasons ( 0.42 )\nHighball ( 0.41 )\n\nQuery: Four turtles fight bad guys.\nResults:\nTeenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )\nDevil May Hare ( 0.43 )\nAttack of the Giant Leeches ( 0.42 )\n"],"headingContent":"Movie Search Using Milvus and SentenceTransformers","anchorList":[{"label":"Pencarian Film Menggunakan Milvus dan SentenceTransformers","href":"Movie-Search-Using-Milvus-and-SentenceTransformers","type":1,"isActive":false},{"label":"Pustaka yang Dibutuhkan","href":"Required-Libraries","type":2,"isActive":false},{"label":"Mengunduh dan Membuka Dataset","href":"Downloading-and-Opening-the-Dataset","type":2,"isActive":false},{"label":"Menghubungkan ke Basis Data","href":"Connecting-to-the-Database","type":2,"isActive":false},{"label":"Memasukkan Data","href":"Inserting-the-Data","type":2,"isActive":false},{"label":"Melakukan Pencarian","href":"Performing-the-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.md b/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.md new file mode 100644 index 000000000..088cf3baa --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_sentencetransformers.md @@ -0,0 +1,224 @@ +--- +id: integrate_with_sentencetransformers.md +summary: Halaman ini membahas pencarian film menggunakan Milvus +title: Pencarian Film Menggunakan Milvus dan SentenceTransformers +--- +

    Pencarian Film Menggunakan Milvus dan SentenceTransformers

    Dalam contoh ini, kita akan mencari ringkasan plot film menggunakan Milvus dan pustaka SentenceTransformers. Dataset yang akan kita gunakan adalah Wikipedia Movie Plots with Summaries yang dihosting di HuggingFace.

    +

    Mari kita mulai!

    +

    Pustaka yang Dibutuhkan

    Untuk contoh ini, kita akan menggunakan pymilvus untuk terhubung menggunakan Milvus, sentence-transformers untuk menghasilkan penyematan vektor, dan datasets untuk mengunduh dataset contoh.

    +
    pip install pymilvus sentence-transformers datasets tqdm
    +
    +
    from datasets import load_dataset
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +from tqdm import tqdm
    +
    +

    Kita akan mendefinisikan beberapa parameter global,

    +
    embedding_dim = 384
    +collection_name = "movie_embeddings"
    +
    +

    Mengunduh dan Membuka Dataset

    Dalam satu baris, datasets memungkinkan kita untuk mengunduh dan membuka dataset. Perpustakaan akan menyimpan dataset secara lokal dan menggunakan salinan tersebut pada saat dataset dijalankan. Setiap baris berisi rincian film yang memiliki artikel Wikipedia yang menyertainya. Kami menggunakan kolom Title, PlotSummary, Release Year, dan Origin/Ethnicity.

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +

    Menghubungkan ke Basis Data

    Pada titik ini, kita akan mulai menyiapkan Milvus. Langkah-langkahnya adalah sebagai berikut:

    +
      +
    1. Buatlah sebuah database Milvus Lite dalam sebuah berkas lokal. (Ganti URI ini dengan alamat server untuk Milvus Standalone dan Milvus Distributed).
    2. +
    +
    client = MilvusClient(uri="./sentence_transformers_example.db")
    +
    +
      +
    1. Buat skema data. Ini menentukan bidang-bidang yang terdiri dari sebuah elemen termasuk dimensi penyematan vektor.
    2. +
    +
    fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +    FieldSchema(name="year", dtype=DataType.INT64),
    +    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +
      +
    1. Tentukan algoritme pengindeksan pencarian vektor. Milvus Lite mendukung tipe indeks FLAT, sedangkan Milvus Standalone dan Milvus Distributed mengimplementasikan berbagai macam metode seperti IVF, HNSW, dan DiskANN. Untuk skala data yang kecil dalam demo ini, semua jenis indeks pencarian sudah cukup, jadi kami menggunakan yang paling sederhana, yaitu FLAT.
    2. +
    +
    index_params = client.prepare_index_params()
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
    +client.create_index(collection_name, index_params)
    +
    +

    Setelah langkah-langkah ini selesai, kita siap memasukkan data ke dalam koleksi dan melakukan pencarian. Setiap data yang ditambahkan akan diindeks secara otomatis dan langsung tersedia untuk pencarian. Jika datanya masih sangat baru, pencarian mungkin akan lebih lambat karena pencarian brute force akan digunakan pada data yang masih dalam proses pengindeksan.

    +

    Memasukkan Data

    Untuk contoh ini, kita akan menggunakan model miniLM SentenceTransformers untuk membuat penyisipan teks plot. Model ini menghasilkan penyematan 384 dimensi.

    +
    model = SentenceTransformer("all-MiniLM-L12-v2")
    +
    +

    Kami mengulang baris data, menyematkan bidang ringkasan plot, dan menyisipkan entitas ke dalam basis data vektor. Secara umum, Anda harus melakukan langkah ini pada sekumpulan item data untuk memaksimalkan throughput CPU atau GPU untuk model penyematan, seperti yang kita lakukan di sini.

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    embeddings = model.encode(batch["PlotSummary"])
    +    data = [
    +        {"title": title, "embedding": embedding, "year": year, "origin": origin}
    +        for title, embedding, year, origin in zip(
    +            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
    +        )
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    Operasi di atas relatif memakan waktu karena penyematan membutuhkan waktu. Langkah ini membutuhkan waktu sekitar 2 menit menggunakan CPU pada MacBook Pro 2023 dan akan jauh lebih cepat dengan GPU khusus. Beristirahatlah dan nikmati secangkir kopi!

    +
    +

    Dengan semua data yang telah dimasukkan ke dalam Milvus, kita dapat mulai melakukan pencarian. Dalam contoh ini, kita akan mencari film berdasarkan ringkasan plot dari Wikipedia. Karena kita melakukan pencarian batch, waktu pencarian dibagi untuk semua pencarian film. (Dapatkah Anda menebak film apa yang ingin saya ambil berdasarkan teks deskripsi kueri?)

    +
    queries = [
    +    'A shark terrorizes an LA beach.',
    +    'An archaeologist searches for ancient artifacts while fighting Nazis.',
    +    'Teenagers in detention learn about themselves.',
    +    'A teenager fakes illness to get off school and have adventures with two friends.',
    +    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
    +    'Four turtles fight bad guys.'
    +    ]
    +
    +# Search the database based on input text
    +def embed_query(data):
    +    vectors = model.encode(data)
    +    return [x for x in vectors]
    +
    +
    +query_vectors = embed_query(queries)
    +
    +res = client.search(
    +    collection_name=collection_name,
    +    data=query_vectors,
    +    filter='origin == "American" and year > 1945 and year < 2000',
    +    anns_field="embedding",
    +    limit=3,
    +    output_fields=["title"],
    +)
    +
    +for idx, hits in enumerate(res):
    +    print("Query:", queries[idx])
    +    print("Results:")
    +    for hit in hits:
    +        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
    +    print()
    +
    +

    Hasilnya adalah:

    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +Love Slaves of the Amazons ( 0.4 )
    +A Time to Love and a Time to Die ( 0.39 )
    +The Fifth Element ( 0.39 )
    +
    +Query: Teenagers in detention learn about themselves.
    +Results:
    +The Breakfast Club ( 0.54 )
    +Up the Academy ( 0.46 )
    +Fame ( 0.43 )
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +Ferris Bueller's Day Off ( 0.48 )
    +Fever Lake ( 0.47 )
    +Losin' It ( 0.39 )
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining ( 0.48 )
    +The Four Seasons ( 0.42 )
    +Highball ( 0.41 )
    +
    +Query: Four turtles fight bad guys.
    +Results:
    +Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
    +Devil May Hare ( 0.43 )
    +Attack of the Giant Leeches ( 0.42 )
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.json b/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.json new file mode 100644 index 000000000..46a0f31d0 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.json @@ -0,0 +1 @@ +{"codeList":["snowsql -a ${instance_name} -u ${user_name}\n","USE ROLE ACCOUNTADMIN;\nCREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH\n TYPE=oauth\n OAUTH_CLIENT=snowservices_ingress\n ENABLED=true;\n \nUSE ROLE ACCOUNTADMIN;\nGRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;\n","USE ROLE SECURITYADMIN;\nCREATE ROLE MILVUS_ROLE;\n\nUSE ROLE USERADMIN;\nCREATE USER milvus_user\n PASSWORD='milvususerok'\n DEFAULT_ROLE = MILVUS_ROLE\n DEFAULT_SECONDARY_ROLES = ('ALL')\n MUST_CHANGE_PASSWORD = FALSE;\n \nUSE ROLE SECURITYADMIN;\nGRANT ROLE MILVUS_ROLE TO USER milvus_user;\n","USE ROLE SYSADMIN;\nCREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH\nWAREHOUSE_SIZE='X-SMALL'\nAUTO_SUSPEND = 180\nAUTO_RESUME = true\nINITIALLY_SUSPENDED=false;\n\nUSE ROLE SYSADMIN;\nCREATE DATABASE IF NOT EXISTS MILVUS_DEMO;\nUSE DATABASE MILVUS_DEMO;\nCREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nCREATE OR REPLACE STAGE YAML_STAGE;\nCREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\nCREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n","USE ROLE SECURITYADMIN;\nGRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;\n","USE ROLE ACCOUNTADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\nCREATE NETWORK RULE allow_all_rule\nTYPE = 'HOST_PORT'\nMODE= 'EGRESS'\nVALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');\n\nCREATE EXTERNAL ACCESS INTEGRATION allow_all_eai\nALLOWED_NETWORK_RULES=(allow_all_rule)\nENABLED=TRUE;\n\nGRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;\n","cd ${repo_git_root_path}\ndocker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus\ndocker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter\n","docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}\n","docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","docker images | grep milvus\n\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus latest 3721bbb8f62b 2 days ago 2.95GB\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter latest 20633f5bcadf 2 days ago 2GB\n","docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","USE ROLE SYSADMIN;\nCREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\nCREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\n","DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;\nDESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;\n","PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;\nPUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;\n","USE ROLE SYSADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\n\nCREATE SERVICE MILVUS\n IN COMPUTE POOL MILVUS_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='milvus.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n\nCREATE SERVICE JUPYTER\n IN COMPUTE POOL JUPYTER_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='jupyter.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n","SHOW SERVICES;\n\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| name | database_name | schema_name | owner | compute_pool | dns_name | ......\n|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| JUPYTER | MILVUS_DEMO | PUBLIC | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... \n| MILVUS | MILVUS_DEMO | PUBLIC | SYSADMIN | MILVUS_COMPUTE_POOL | milvus.public.milvus-demo.snowflakecomputing.internal | ......\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n","USE ROLE SECURITYADMIN;\nGRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;\n","USE ROLE SYSADMIN;\nSHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n","USE ROLE ACCOUNTADMIN;\nDROP USER milvus_user;\n\nUSE ROLE SYSADMIN;\nDROP SERVICE MILVUS;\nDROP SERVICE JUPYTER;\n\nDROP COMPUTE POOL MILVUS_COMPUTE_POOL;\nDROP COMPUTE POOL JUPYTER_COMPUTE_POOL;\n\nDROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nDROP DATABASE MILVUS_DEMO;\nDROP WAREHOUSE MILVUS_WAREHOUSE;\n\nUSE ROLE ACCOUNTADMIN;\nDROP ROLE MILVUS_ROLE;\nDROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;\n"],"headingContent":"Milvus on Snowpark Container Services","anchorList":[{"label":"Milvus pada Layanan Kontainer Snowpark","href":"Milvus-on-Snowpark-Container-Services","type":1,"isActive":false},{"label":"Tentang Layanan Kontainer Snowpark","href":"About-Snowpark-Container-Services","type":2,"isActive":false},{"label":"Mengkonfigurasi demo Milvus","href":"Configure-Milvus-demo","type":2,"isActive":false},{"label":"Menggunakan Notebook","href":"Use-Notebook","type":2,"isActive":false},{"label":"7. Membersihkan","href":"7-Clean-up","type":2,"isActive":false},{"label":"Tentang Milvus","href":"About-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.md b/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.md new file mode 100644 index 000000000..50ec0d8c8 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_snowpark.md @@ -0,0 +1,322 @@ +--- +id: integrate_with_snowpark.md +summary: >- + Panduan ini mendemonstrasikan cara memulai demo Milvus pada layanan kontainer + Snowpark. +title: Milvus pada Layanan Kontainer Snowpark +--- +

    Milvus pada Layanan Kontainer Snowpark

    Panduan ini menunjukkan cara memulai demo Milvus pada layanan kontainer Snowpark.

    +

    Tentang Layanan Kontainer Snowpark

    Layanan Kontainer Snowpark adalah penawaran kontainer terkelola penuh yang dirancang untuk memfasilitasi penerapan, pengelolaan, dan penskalaan aplikasi terkontainerisasi dalam ekosistem Snowflake. Layanan ini memungkinkan pengguna untuk menjalankan beban kerja dalam kontainer secara langsung di dalam Snowflake, memastikan bahwa data tidak perlu dipindahkan dari lingkungan Snowflake untuk diproses. Untuk informasi lebih lanjut, silakan lihat pengantar resmi: Layanan Kontainer Snowpark.

    +

    Mengkonfigurasi demo Milvus

    Berikut ini akan membantu pengguna memahami kemampuan Milvus dan cara menggunakan Milvus di SPCS melalui konfigurasi dan kode.

    +

    1. Dapatkan informasi akun

    Unduh klien SPCS: SnowSQL, lalu masuk ke akun Anda.

    +
    snowsql -a ${instance_name} -u ${user_name}
    +
    +

    Aturan dari ${instance_name} adalah ${org_name}-${acct_name}. Informasi yang relevan dapat diperoleh dengan masuk ke app.snowflake.com dan memeriksa informasi akun pribadi.

    +

    + + Snowflake account information + Informasi akun Snowflake

    +

    2. Mengonfigurasi Peran dan hak istimewa

    Konfigurasikan integrasi OAUTH.

    +
    USE ROLE ACCOUNTADMIN;
    +CREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH
    +  TYPE=oauth
    +  OAUTH_CLIENT=snowservices_ingress
    +  ENABLED=true;
    +  
    +USE ROLE ACCOUNTADMIN;
    +GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;
    +
    +

    Buat peran untuk layanan, perhatikan bahwa bagian ${PASSWORD} di sini perlu diganti oleh pengguna saat demo

    +
    USE ROLE SECURITYADMIN;
    +CREATE ROLE MILVUS_ROLE;
    +
    +USE ROLE USERADMIN;
    +CREATE USER milvus_user
    +  PASSWORD='milvususerok'
    +  DEFAULT_ROLE = MILVUS_ROLE
    +  DEFAULT_SECONDARY_ROLES = ('ALL')
    +  MUST_CHANGE_PASSWORD = FALSE;
    +  
    +USE ROLE SECURITYADMIN;
    +GRANT ROLE MILVUS_ROLE TO USER milvus_user;
    +
    +

    3. Membuat konfigurasi penyimpanan data

      +
    • Membuat gudang dan basis data

      +
      USE ROLE SYSADMIN;
      +CREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH
      +WAREHOUSE_SIZE='X-SMALL'
      +AUTO_SUSPEND = 180
      +AUTO_RESUME = true
      +INITIALLY_SUSPENDED=false;
      +
      +USE ROLE SYSADMIN;
      +CREATE DATABASE IF NOT EXISTS MILVUS_DEMO;
      +USE DATABASE MILVUS_DEMO;
      +CREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
      +CREATE OR REPLACE STAGE YAML_STAGE;
      +CREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +CREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +
    • +
    • Berikan hak istimewa peran

      +
      USE ROLE SECURITYADMIN;
      +GRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;
      +
    • +
    • Mengonfigurasi ACL

      +
      USE ROLE ACCOUNTADMIN;
      +USE DATABASE MILVUS_DEMO;
      +USE SCHEMA PUBLIC;
      +CREATE NETWORK RULE allow_all_rule
      +TYPE = 'HOST_PORT'
      +MODE= 'EGRESS'
      +VALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');
      +
      +CREATE EXTERNAL ACCESS INTEGRATION allow_all_eai
      +ALLOWED_NETWORK_RULES=(allow_all_rule)
      +ENABLED=TRUE;
      +
      +GRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;
      +
    • +
    +

    4. Membuat citra

    Image yang digunakan oleh Milvus perlu dibuat secara lokal dan kemudian diunggah oleh pengguna. Untuk konfigurasi citra yang relevan, silakan lihat repositori ini. Setelah mengkloning kode, masuk ke direktori root proyek dan bersiaplah untuk membangun citra.

    +
      +
    • Membangun citra secara lokal

      +

      Buka shell lokal Anda dan mulailah membangun citra.

      +
      cd ${repo_git_root_path}
      +docker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus
      +docker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter
      +
      +

      Ada dua image di sini, yang pertama menjalankan basis data Milvus, dan yang kedua adalah notebook yang digunakan untuk tampilan.

      +

      Setelah image lokal dibangun, bersiaplah untuk menandai dan mengunggahnya.

    • +
    • Menandai citra yang dibangun

      +

      Masuk ke hub docker SPCS.

      +
      docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}
      +
      +

      Dan Anda dapat menandai citra untuk spcs sekarang.

      +
      docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
      +

      Kemudian gunakan docker images | grep milvus pada shell lokal untuk memeriksa apakah citra telah dipaketkan dan ditandai dengan sukses.

      +
      docker images | grep milvus
      +
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus    latest        3721bbb8f62b   2 days ago    2.95GB
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter   latest        20633f5bcadf   2 days ago    2GB
      +
    • +
    • Mendorong citra ke SPCS

      +
      docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
    • +
    +

    5. Membuat dan memulai layanan

    Mari kita kembali ke shell SnowSQL.

    +
      +
    • Membuat kumpulan komputasi
    • +
    +
    USE ROLE SYSADMIN;
    +CREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +CREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +
    +

    Periksa compute pools melalui DESCRIBE hingga statusnya menjadi ACTIVE atau IDLE.

    +
    DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +

    + + Compute pool status + Status kumpulan komputasi

    +
      +
    • Unggah file spesifikasi
    • +
    +

    Setelah membuat compute pool, mulailah menyiapkan file spce untuk layanan. Berkas-berkas tersebut juga ada di dalam repo ini. Silakan merujuk ke direktori spesifikasi.

    +

    Buka berkas spesifikasi kedua layanan ini, temukan ${org_name}-${acct_name} dalam berkas spesifikasi, dan ganti dengan ${instance_name} akun Anda sendiri. Setelah modifikasi, gunakan SnowSQL untuk menyelesaikan pengunggahan.

    +
    PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;
    +PUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;
    +
    +
      +
    • Membuat layanan
    • +
    +

    Setelah pengunggahan selesai, Anda siap untuk membuat layanan, Lanjutkan untuk menyelesaikan proses pembuatan layanan.

    +
    USE ROLE SYSADMIN;
    +USE DATABASE MILVUS_DEMO;
    +USE SCHEMA PUBLIC;
    +
    +CREATE SERVICE MILVUS
    +  IN COMPUTE POOL MILVUS_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='milvus.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +CREATE SERVICE JUPYTER
    +  IN COMPUTE POOL JUPYTER_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='jupyter.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +

    Layanan juga dapat dilihat melalui SHOW SERVICES;.

    +
    SHOW SERVICES;
    +
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| name    | database_name | schema_name | owner    | compute_pool         | dns_name                                               | ......
    +|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| JUPYTER | MILVUS_DEMO   | PUBLIC      | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... 
    +| MILVUS  | MILVUS_DEMO   | PUBLIC      | SYSADMIN | MILVUS_COMPUTE_POOL  | milvus.public.milvus-demo.snowflakecomputing.internal  | ......
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +
    +

    Jika Anda mengalami masalah saat memulai layanan, Anda dapat melihat informasi layanan melalui CALL SYSTEM$GET_SERVICE_STATUS('milvus');.

    +

    + + Service status + Status layanan

    +

    Informasi lebih lanjut dapat diperoleh melalui CALL SYSTEM$GET_SERVICE_LOGS('milvus', '0', 'milvus', 10);.

    +

    Menggunakan Notebook

    Gunakan SnowSQL untuk memberikan izin.

    +
    USE ROLE SECURITYADMIN;
    +GRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;
    +
    +

    Kemudian lihat dan catat titik akhir buku catatan Jupyter.

    +
    USE ROLE SYSADMIN;
    +SHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;
    +
    +

    Catat bagian ingress_url dari informasi tersebut, kemudian buka browser dan masuk ke ingress_url, gunakan akun milvus_user untuk masuk ke situs web.

    +

    + + Obtain the ingress URL + Dapatkan URL masuk

    +

    Membuka buku catatan melalui ingress_url, klik dua kali file TestMilvus.ipynb pada halaman untuk mencoba Milvus. Pilih bagian pertama dari blok kode, dan klik tombol Run untuk mulai membuat koneksi dan menginisialisasi fungsi penyematan.

    +

    + + Run TestMilvus.ipynb in the notebook + Jalankan TestMilvus.ipynb di notebook

    +

    Setelah membuat koneksi, lanjutkan dengan mengklik RUN. Kode ini akan mengubah sebuah teks menjadi data vektor setelah proses embedding, dan kemudian memasukkannya ke dalam Milvus.

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +

    Kemudian gunakan teks sebagai kueri: "Siapa yang memulai penelitian AI?", lakukan kueri setelah pemrosesan penyematan, dan akhirnya dapatkan dan tampilkan hasil yang paling relevan.

    +

    + + Obtain and display the most relevant results + Mendapatkan dan menampilkan hasil yang paling relevan

    +

    Untuk informasi lebih lanjut tentang penggunaan klien Milvus, Anda dapat merujuk ke bagian Dokumen Milvus.

    +

    7. Membersihkan

    Setelah verifikasi, Anda dapat menggunakan SnowSQL untuk membersihkan layanan, peran, dan sumber daya data.

    +
    USE ROLE ACCOUNTADMIN;
    +DROP USER milvus_user;
    +
    +USE ROLE SYSADMIN;
    +DROP SERVICE MILVUS;
    +DROP SERVICE JUPYTER;
    +
    +DROP COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DROP COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +DROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
    +DROP DATABASE MILVUS_DEMO;
    +DROP WAREHOUSE MILVUS_WAREHOUSE;
    +
    +USE ROLE ACCOUNTADMIN;
    +DROP ROLE MILVUS_ROLE;
    +DROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;
    +
    +

    Tentang Milvus

    Untuk informasi lebih lanjut tentang Milvus, Anda dapat memulai dengan pengenalan Milvus dan Memulai cepat. Tentu saja, ada pengenalan yang lebih rinci tentang API, lihat versi Python dan Java, dan ada juga informasi tentang Penyematan dan Integrasi untuk referensi.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_spark.json b/localization/v2.5.x/site/id/integrations/integrate_with_spark.json new file mode 100644 index 000000000..d9bad4149 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_spark.json @@ -0,0 +1 @@ +{"codeList":["wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","from pyspark.sql import SparkSession\n\ncolumns = [\"id\", \"text\", \"vec\"]\ndata = [(1, \"a\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (2, \"b\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (3, \"c\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (4, \"d\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]\nsample_df = spark.sparkContext.parallelize(data).toDF(columns)\nsample_df.write \\\n .mode(\"append\") \\\n .option(\"milvus.host\", \"localhost\") \\\n .option(\"milvus.port\", \"19530\") \\\n .option(\"milvus.collection.name\", \"hello_spark_milvus\") \\\n .option(\"milvus.collection.vectorField\", \"vec\") \\\n .option(\"milvus.collection.vectorDim\", \"8\") \\\n .option(\"milvus.collection.primaryKeyField\", \"id\") \\\n .format(\"milvus\") \\\n .save()\n","import org.apache.spark.sql.{SaveMode, SparkSession}\n\nobject Hello extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"HelloSparkMilvus\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"a\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (2, \"b\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (3, \"c\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (4, \"d\", Seq(1.0,2.0,3.0,4.0,5.0))\n ).toDF(\"id\", \"text\", \"vec\")\n\n // set milvus options\n val milvusOptions = Map(\n \"milvus.host\" -> \"localhost\" -> uri,\n \"milvus.port\" -> \"19530\",\n \"milvus.collection.name\" -> \"hello_spark_milvus\",\n \"milvus.collection.vectorField\" -> \"vec\",\n \"milvus.collection.vectorDim\" -> \"5\",\n \"milvus.collection.primaryKeyField\", \"id\"\n )\n \n sampleDF.write.format(\"milvus\")\n .options(milvusOptions)\n .mode(SaveMode.Append)\n .save()\n}\n","val df = spark.read\n .format(\"milvusbinlog\")\n .load(path)\n .withColumnRenamed(\"val\", \"embedding\")\n","{\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]}\n{\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]}\n{\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]}\n{\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]}\n{\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n","{\n \"rows\":[\n {\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]},\n {\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]},\n {\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]},\n {\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]},\n {\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n ]\n}\n","val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n","df.write.format(\"parquet\").save(outputPath)\nMilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, \"parquet\")\n","spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar\n","import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.{SaveMode, SparkSession}\nimport zilliztech.spark.milvus.MilvusOptions._\n\nimport org.apache.spark.ml.linalg.Vector\n\nobject Mysql2MilvusDemo extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"Mysql2MilvusDemo\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models.\"),\n (2, \"As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. \"),\n (3, \"Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data.\"),\n (4, \"As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.\")\n ).toDF(\"id\", \"text\")\n\n // Write to MySQL Table\n sampleDF.write\n .mode(SaveMode.Append)\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .save()\n\n // Read from MySQL Table\n val dfMysql = spark.read\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .load()\n\n val tokenizer = new Tokenizer().setInputCol(\"text\").setOutputCol(\"tokens\")\n val tokenizedDf = tokenizer.transform(dfMysql)\n\n // Learn a mapping from words to Vectors.\n val word2Vec = new Word2Vec()\n .setInputCol(\"tokens\")\n .setOutputCol(\"vectors\")\n .setVectorSize(128)\n .setMinCount(0)\n val model = word2Vec.fit(tokenizedDf)\n\n val result = model.transform(tokenizedDf)\n\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // Apply the UDF to the DataFrame\n val resultDF = result.withColumn(\"embedding\", vectorToArrayUDF($\"vectors\"))\n val milvusDf = resultDF.drop(\"tokens\").drop(\"vectors\")\n\n milvusDf.write.format(\"milvus\")\n .option(MILVUS_HOST, \"localhost\")\n .option(MILVUS_PORT, \"19530\")\n .option(MILVUS_COLLECTION_NAME, \"text_embedding\")\n .option(MILVUS_COLLECTION_VECTOR_FIELD, \"embedding\")\n .option(MILVUS_COLLECTION_VECTOR_DIM, \"128\")\n .option(MILVUS_COLLECTION_PRIMARY_KEY, \"id\")\n .mode(SaveMode.Append)\n .save()\n}\n","import org.apache.spark.ml.feature.PCA\nimport org.apache.spark.ml.linalg.{Vector, Vectors}\nimport org.apache.spark.SparkConf\nimport org.apache.spark.sql.SparkSession\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.util.CaseInsensitiveStringMap\nimport zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}\n\nimport scala.collection.JavaConverters._\n\nobject TransformDemo extends App {\n val sparkConf = new SparkConf().setMaster(\"local\")\n val spark = SparkSession.builder().config(sparkConf).getOrCreate()\n\n import spark.implicits._\n\n val host = \"localhost\"\n val port = 19530\n val user = \"root\"\n val password = \"Milvus\"\n val fs = \"s3a://\"\n val bucketName = \"a-bucket\"\n val rootPath = \"files\"\n val minioAK = \"minioadmin\"\n val minioSK = \"minioadmin\"\n val minioEndpoint = \"localhost:9000\"\n val collectionName = \"hello_spark_milvus1\"\n val targetCollectionName = \"hello_spark_milvus2\"\n\n val properties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n\n // 1, configurations\n val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))\n\n // 2, batch read milvus collection data to dataframe\n // Schema: dim of `embeddings` is 8\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=8 |\n // +-+------------+------------+------------------+\n val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))\n val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n .withColumn(\"embeddings_vec\", arrayToVectorUDF($\"embeddings\"))\n .drop(\"embeddings\")\n \n // 3. Use PCA to reduce dim of vector\n val dim = 4\n val pca = new PCA()\n .setInputCol(\"embeddings_vec\")\n .setOutputCol(\"pca_vec\")\n .setK(dim)\n .fit(collectionDF)\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // embeddings dim number reduce to 4\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=4 |\n // +-+------------+------------+------------------+\n val pcaDf = pca.transform(collectionDF)\n .withColumn(\"embeddings\", vectorToArrayUDF($\"pca_vec\"))\n .select(\"pk\", \"random\", \"embeddings\")\n\n // 4. Write PCAed data to S3\n val outputPath = \"s3a://a-bucket/result\"\n pcaDf.write\n .mode(\"overwrite\")\n .format(\"parquet\")\n .save(outputPath)\n\n // 5. Config MilvusOptions of target table \n val targetProperties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n // 6. Bulkinsert Spark output files into milvus\n MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"parquet\")\n}\n","// Write the data in batch into the Milvus bucket storage.\nval outputPath = \"s3://my-temp-bucket/result\"\ndf.write\n .mode(\"overwrite\")\n .format(\"mjson\")\n .save(outputPath)\n// Specify Milvus options.\nval targetProperties = Map(\n MilvusOptions.MILVUS_URI -> zilliz_uri,\n MilvusOptions.MILVUS_TOKEN -> zilliz_token,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n)\nval targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n// Bulk insert Spark output files into Milvus\nMilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"mjson\")\n"],"headingContent":"Spark-Milvus Connector User Guide","anchorList":[{"label":"Panduan Pengguna Konektor Spark-Milvus","href":"Spark-Milvus-Connector-User-Guide","type":1,"isActive":false},{"label":"Mulai cepat","href":"Quick-start","type":2,"isActive":false},{"label":"Fitur & konsep","href":"Features--concepts","type":2,"isActive":false},{"label":"Format data Milvus","href":"Milvus-data-format","type":2,"isActive":false},{"label":"MilvusUtils","href":"MilvusUtils","type":2,"isActive":false},{"label":"Penggunaan Tingkat Lanjut","href":"Advanced-Usage","type":2,"isActive":false},{"label":"Praktik langsung","href":"Hands-on","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_spark.md b/localization/v2.5.x/site/id/integrations/integrate_with_spark.md new file mode 100644 index 000000000..4a8d40c8e --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_spark.md @@ -0,0 +1,505 @@ +--- +id: integrate_with_spark.md +summary: Halaman ini membahas konektor Spark-Milvus. +title: Panduan Pengguna Konektor Spark-Milvus +--- +

    Panduan Pengguna Konektor Spark-Milvus

    Konektor Spark-Milvus (https://github.com/zilliztech/spark-milvus) menyediakan integrasi tanpa batas antara Apache Spark dan Milvus, yang menggabungkan pemrosesan data dan fitur ML dari Apache Spark dengan penyimpanan data vektor dan kemampuan pencarian Milvus. Integrasi ini memungkinkan berbagai aplikasi menarik, termasuk:

    +
      +
    • Memuat data vektor secara efisien ke dalam Milvus dalam jumlah besar,
    • +
    • Memindahkan data antara Milvus dan sistem penyimpanan atau basis data lainnya,
    • +
    • Menganalisis data di Milvus dengan memanfaatkan Spark MLlib dan alat AI lainnya.
    • +
    +

    Mulai cepat

    Persiapan

    Konektor Spark-Milvus mendukung bahasa pemrograman Scala dan Python. Pengguna dapat menggunakannya dengan Pyspark atau Spark-shell. Untuk menjalankan demo ini, siapkan lingkungan Spark yang berisi ketergantungan Spark-Milvus Connector dengan langkah-langkah berikut:

    +
      +
    1. Instal Apache Spark (versi >= 3.3.0)

      +

      Anda dapat menginstal Apache Spark dengan merujuk pada dokumentasi resminya.

    2. +
    3. Unduh berkas jar spark-milvus.

      +
      wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar
      +
    4. +
    5. Mulai runtime Spark dengan jar spark-milvus sebagai salah satu dependensi.

      +

      Untuk memulai runtime Spark dengan Spark-Milvus Connector, tambahkan spark-milvus yang telah diunduh sebagai dependensi pada perintah.

      +
        +
      • pyspark

        +
        ./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
      • spark-shell

        +
        ./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
    6. +
    +

    Demo

    Dalam demo ini, kita membuat contoh Spark DataFrame dengan data vektor dan menuliskannya ke Milvus melalui Spark-Milvus Connector. Sebuah koleksi akan dibuat di Milvus secara otomatis berdasarkan skema dan opsi yang ditentukan.

    + +
    from pyspark.sql import SparkSession
    +
    +columns = ["id", "text", "vec"]
    +data = [(1, "a", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (2, "b", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (3, "c", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (4, "d", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]
    +sample_df = spark.sparkContext.parallelize(data).toDF(columns)
    +sample_df.write \
    +    .mode("append") \
    +    .option("milvus.host", "localhost") \
    +    .option("milvus.port", "19530") \
    +    .option("milvus.collection.name", "hello_spark_milvus") \
    +    .option("milvus.collection.vectorField", "vec") \
    +    .option("milvus.collection.vectorDim", "8") \
    +    .option("milvus.collection.primaryKeyField", "id") \
    +    .format("milvus") \
    +    .save()
    +
    +
    import org.apache.spark.sql.{SaveMode, SparkSession}
    +
    +object Hello extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("HelloSparkMilvus")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "a", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (2, "b", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (3, "c", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (4, "d", Seq(1.0,2.0,3.0,4.0,5.0))
    +  ).toDF("id", "text", "vec")
    +
    +  // set milvus options
    +  val milvusOptions = Map(
    +      "milvus.host" -> "localhost" -> uri,
    +      "milvus.port" -> "19530",
    +      "milvus.collection.name" -> "hello_spark_milvus",
    +      "milvus.collection.vectorField" -> "vec",
    +      "milvus.collection.vectorDim" -> "5",
    +      "milvus.collection.primaryKeyField", "id"
    +    )
    +    
    +  sampleDF.write.format("milvus")
    +    .options(milvusOptions)
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    Setelah menjalankan kode di atas, Anda dapat melihat data yang telah dimasukkan di Milvus menggunakan SDK atau Attu (Dasbor Milvus). Anda dapat menemukan koleksi bernama hello_spark_milvus yang dibuat dengan 4 entitas yang telah dimasukkan ke dalamnya.

    +

    Fitur & konsep

    Opsi-opsi Milvus

    Pada bagian Mulai Cepat, kami telah menunjukkan opsi-opsi pengaturan selama operasi dengan Milvus. Opsi-opsi ini disarikan sebagai Opsi Milvus. Opsi-opsi ini digunakan untuk membuat koneksi ke Milvus dan mengontrol perilaku Milvus lainnya. Tidak semua opsi wajib dipilih.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tombol OpsiNilai DefaultDeskripsi
    milvus.hostlocalhostHost server Milvus. Lihat Mengelola Koneksi Milvus untuk detailnya.
    milvus.port19530Port server Milvus. Lihat Mengelola Koneksi Milvus untuk detailnya.
    milvus.usernamerootNama pengguna untuk server Milvus. Lihat Mengelola Sambungan Milvus untuk detailnya.
    milvus.passwordMilvusKata sandi untuk server Milvus. Lihat Mengelola Sambungan Milvus untuk detailnya.
    milvus.uri--URI server Milvus. Lihat Mengelola Koneksi Milvus untuk detailnya.
    milvus.token--Token server Milvus. Lihat Mengelola Koneksi Milvus untuk detailnya.
    milvus.database.namedefaultNama basis data Milvus yang akan dibaca atau ditulis.
    milvus.collection.namehello_milvusNama koleksi Milvus yang akan dibaca atau ditulis.
    milvus.collection.primaryKeyFieldNoneNama bidang kunci utama dalam koleksi. Diperlukan jika koleksi tidak ada.
    milvus.collection.vectorFieldNoneNama bidang vektor dalam koleksi. Diperlukan jika koleksi tidak ada.
    milvus.collection.vectorDimNoneDimensi bidang vektor dalam koleksi. Diperlukan jika koleksi tidak ada.
    milvus.collection.autoIDfalseJika koleksi tidak ada, opsi ini menentukan apakah akan secara otomatis menghasilkan ID untuk entitas. Untuk informasi lebih lanjut, lihat create_collection
    milvus.bucketa-bucketNama ember di penyimpanan Milvus. Ini harus sama dengan minio.bucketName di milvus.yaml.
    milvus.rootpathfilesJalur root dari penyimpanan Milvus. Ini harus sama dengan minio.rootpath di milvus.yaml.
    milvus.fss3a://Sistem berkas dari penyimpanan Milvus. Nilai s3a:// berlaku untuk Spark yang bersumber terbuka. Gunakan s3:// untuk Databricks.
    milvus.storage.endpointlocalhost:9000Titik akhir penyimpanan Milvus. Ini harus sama dengan minio.address:minio.port di milvus.yaml.
    milvus.storage.userminioadminPengguna dari penyimpanan Milvus. Ini harus sama dengan minio.accessKeyID di milvus.yaml.
    milvus.storage.passwordminioadminKata sandi dari penyimpanan Milvus. Ini harus sama dengan minio.secretAccessKey di milvus.yaml.
    milvus.storage.useSSLfalseApakah akan menggunakan SSL untuk penyimpanan Milvus. Ini harus sama dengan minio.useSSL di milvus.yaml.
    +

    Format data Milvus

    Konektor Spark-Milvus mendukung pembacaan dan penulisan data dalam format data Milvus berikut ini:

    +
      +
    • milvus: Format data Milvus untuk konversi tanpa hambatan dari Spark DataFrame ke entitas Milvus.
    • +
    • milvusbinlog: Format data Milvus untuk membaca data binlog bawaan Milvus.
    • +
    • mjson: Format JSON Milvus untuk memasukkan data secara massal ke dalam Milvus.
    • +
    +

    milvus

    Dalam Mulai cepat, kita menggunakan format milvus untuk menulis data sampel ke dalam klaster Milvus. Format milvus adalah format data baru yang mendukung penulisan data Spark DataFrame secara mulus ke dalam Koleksi Milvus. Hal ini dicapai dengan panggilan batch ke API Insert dari Milvus SDK. Jika koleksi tidak ada di Milvus, koleksi baru akan dibuat berdasarkan skema Dataframe. Namun, koleksi yang dibuat secara otomatis mungkin tidak mendukung semua fitur dari skema koleksi. Oleh karena itu, disarankan untuk membuat koleksi melalui SDK terlebih dahulu dan kemudian menggunakan spark-milvus untuk menulis. Untuk informasi lebih lanjut, silakan lihat demo.

    +

    milvusbinlog

    Format data baru milvusbinlog digunakan untuk membaca data binlog bawaan Milvus. Binlog adalah format penyimpanan data internal Milvus yang berbasis parket. Sayangnya, format ini tidak dapat dibaca oleh pustaka parket biasa, sehingga kami mengimplementasikan format data baru ini untuk membantu pekerjaan Spark membacanya. Tidak disarankan untuk menggunakan milvusbinlog secara langsung kecuali jika Anda sudah terbiasa dengan detail penyimpanan internal Milvus. Kami menyarankan untuk menggunakan fungsi MilvusUtils yang akan diperkenalkan pada bagian selanjutnya.

    +
    val df = spark.read
    +  .format("milvusbinlog")
    +  .load(path)
    +  .withColumnRenamed("val", "embedding")
    +
    +

    mjson

    Milvus menyediakan fungsionalitas Bulkinsert untuk performa penulisan yang lebih baik ketika beroperasi dengan dataset besar. Namun, format JSON yang digunakan oleh Milvus sedikit berbeda dengan format keluaran JSON bawaan Spark. Untuk mengatasi hal ini, kami memperkenalkan format data mjson untuk menghasilkan data yang memenuhi persyaratan Milvus. Berikut ini adalah contoh yang menunjukkan perbedaan antara JSON-lines dan mjson:

    +
      +
    • Baris-baris JSON:

      +
      {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]}
      +{"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]}
      +{"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]}
      +{"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]}
      +{"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +
    • +
    • mjson (Diperlukan untuk Milvus Bulkinsert):

      +
      {
      +    "rows":[
      +        {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]},
      +        {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]},
      +        {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]},
      +        {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]},
      +        {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +    ]
      +}
      +
    • +
    +

    Hal ini akan ditingkatkan di masa mendatang. Kami menyarankan untuk menggunakan format parquet dalam integrasi spark-milvus jika versi Milvus Anda adalah v2.3.7+ yang mendukung bulkinsert dengan format Parquet. Lihat Demo di Github.

    +

    MilvusUtils

    MilvusUtils berisi beberapa fungsi util yang berguna. Saat ini hanya didukung di Scala. Contoh penggunaan lebih lanjut ada di bagian Penggunaan Lanjutan.

    +

    MilvusUtils.readMilvusCollection

    MilvusUtils.readMilvusCollection adalah sebuah antarmuka sederhana untuk memuat seluruh koleksi Milvus ke dalam Spark Dataframe. Antarmuka ini membungkus berbagai operasi, termasuk memanggil Milvus SDK, membaca milvusbinlog, dan operasi gabungan/gabungan yang umum.

    +
    val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +
    +

    MilvusUtils.bulkInsertFromSpark

    MilvusUtils.bulkInsertFromSpark menyediakan cara yang mudah untuk mengimpor file keluaran Spark ke Milvus dalam jumlah yang besar. Ini membungkus API Bullkinsert dari Milvus SDK.

    +
    df.write.format("parquet").save(outputPath)
    +MilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, "parquet")
    +
    +

    Penggunaan Tingkat Lanjut

    Pada bagian ini, Anda akan menemukan contoh penggunaan lanjutan dari Spark-Milvus Connector untuk analisis dan migrasi data. Untuk lebih banyak demo, lihat contoh.

    +

    MySQL -> penyematan -> Milvus

    Dalam demo ini, kita akan

    +
      +
    1. Membaca data dari MySQL melalui Konektor Spark-MySQL,
    2. +
    3. Menghasilkan penyematan (menggunakan Word2Vec sebagai contoh), dan
    4. +
    5. Menulis data yang disematkan ke dalam Milvus.
    6. +
    +

    Untuk mengaktifkan Spark-MySQL Connector, Anda perlu menambahkan ketergantungan berikut ini ke lingkungan Spark Anda:

    +
    spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar
    +
    +
    import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.{SaveMode, SparkSession}
    +import zilliztech.spark.milvus.MilvusOptions._
    +
    +import org.apache.spark.ml.linalg.Vector
    +
    +object Mysql2MilvusDemo  extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("Mysql2MilvusDemo")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models."),
    +    (2, "As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. "),
    +    (3, "Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data."),
    +    (4, "As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.")
    +  ).toDF("id", "text")
    +
    +  // Write to MySQL Table
    +  sampleDF.write
    +    .mode(SaveMode.Append)
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .save()
    +
    +  // Read from MySQL Table
    +  val dfMysql = spark.read
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .load()
    +
    +  val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("tokens")
    +  val tokenizedDf = tokenizer.transform(dfMysql)
    +
    +  // Learn a mapping from words to Vectors.
    +  val word2Vec = new Word2Vec()
    +    .setInputCol("tokens")
    +    .setOutputCol("vectors")
    +    .setVectorSize(128)
    +    .setMinCount(0)
    +  val model = word2Vec.fit(tokenizedDf)
    +
    +  val result = model.transform(tokenizedDf)
    +
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // Apply the UDF to the DataFrame
    +  val resultDF = result.withColumn("embedding", vectorToArrayUDF($"vectors"))
    +  val milvusDf = resultDF.drop("tokens").drop("vectors")
    +
    +  milvusDf.write.format("milvus")
    +    .option(MILVUS_HOST, "localhost")
    +    .option(MILVUS_PORT, "19530")
    +    .option(MILVUS_COLLECTION_NAME, "text_embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_FIELD, "embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_DIM, "128")
    +    .option(MILVUS_COLLECTION_PRIMARY_KEY, "id")
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    Milvus -> Transform -> Milvus

    Dalam demo ini, kita akan

    +
      +
    1. Membaca data dari koleksi Milvus,
    2. +
    3. Menerapkan transformasi (menggunakan PCA sebagai contoh), dan
    4. +
    5. Menulis data yang telah ditransformasi ke Milvus lain melalui API Bulkinsert.
    6. +
    +
    +

    Model PCA adalah model tranformasi yang mengurangi dimensi vektor penyisipan, yang merupakan operasi umum dalam pembelajaran mesin. Anda dapat menambahkan operasi pemrosesan lainnya, seperti pemfilteran, penggabungan, atau normalisasi, ke dalam langkah transformasi.

    +
    +
    import org.apache.spark.ml.feature.PCA
    +import org.apache.spark.ml.linalg.{Vector, Vectors}
    +import org.apache.spark.SparkConf
    +import org.apache.spark.sql.SparkSession
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.util.CaseInsensitiveStringMap
    +import zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}
    +
    +import scala.collection.JavaConverters._
    +
    +object TransformDemo extends App {
    +  val sparkConf = new SparkConf().setMaster("local")
    +  val spark = SparkSession.builder().config(sparkConf).getOrCreate()
    +
    +  import spark.implicits._
    +
    +  val host = "localhost"
    +  val port = 19530
    +  val user = "root"
    +  val password = "Milvus"
    +  val fs = "s3a://"
    +  val bucketName = "a-bucket"
    +  val rootPath = "files"
    +  val minioAK = "minioadmin"
    +  val minioSK = "minioadmin"
    +  val minioEndpoint = "localhost:9000"
    +  val collectionName = "hello_spark_milvus1"
    +  val targetCollectionName = "hello_spark_milvus2"
    +
    +  val properties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +
    +  // 1, configurations
    +  val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))
    +
    +  // 2, batch read milvus collection data to dataframe
    +  //  Schema: dim of `embeddings` is 8
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=8        |
    +  // +-+------------+------------+------------------+
    +  val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))
    +  val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +    .withColumn("embeddings_vec", arrayToVectorUDF($"embeddings"))
    +    .drop("embeddings")
    +  
    +  // 3. Use PCA to reduce dim of vector
    +  val dim = 4
    +  val pca = new PCA()
    +    .setInputCol("embeddings_vec")
    +    .setOutputCol("pca_vec")
    +    .setK(dim)
    +    .fit(collectionDF)
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // embeddings dim number reduce to 4
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=4        |
    +  // +-+------------+------------+------------------+
    +  val pcaDf = pca.transform(collectionDF)
    +    .withColumn("embeddings", vectorToArrayUDF($"pca_vec"))
    +    .select("pk", "random", "embeddings")
    +
    +  // 4. Write PCAed data to S3
    +  val outputPath = "s3a://a-bucket/result"
    +  pcaDf.write
    +    .mode("overwrite")
    +    .format("parquet")
    +    .save(outputPath)
    +
    +  // 5. Config MilvusOptions of target table  
    +  val targetProperties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +  val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +  // 6. Bulkinsert Spark output files into milvus
    +  MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
    +}
    +
    +

    Databricks -> Zilliz Cloud

    Jika Anda menggunakan Zilliz Cloud (layanan Milvus yang dikelola), Anda dapat memanfaatkan API Impor Data yang nyaman. Zilliz Cloud menyediakan alat dan dokumentasi yang komprehensif untuk membantu Anda memindahkan data secara efisien dari berbagai sumber data, termasuk Spark dan Databricks. Cukup siapkan bucket S3 sebagai perantara dan buka aksesnya ke akun Zilliz Cloud Anda. API Impor Data Zilliz Cloud akan secara otomatis memuat seluruh data dari bucket S3 ke cluster Zilliz Cloud Anda.

    +

    Persiapan

    +
      +
    1. Muat runtime Spark dengan menambahkan file jar ke Databricks Cluster Anda.

      +

      Anda dapat menginstal library dengan berbagai cara. Tangkapan layar ini menunjukkan pengunggahan jar dari lokal ke cluster. Untuk informasi lebih lanjut, lihat Cluster Libraries di dokumentasi Databricks.

      +

      + + Install Databricks Library + Menginstal Perpustakaan Databricks

    2. +
    3. Buat bucket S3 dan konfigurasikan sebagai lokasi penyimpanan eksternal untuk cluster Databricks Anda.

      +

      Bulkinsert membutuhkan data untuk disimpan di bucket sementara agar Zilliz Cloud dapat mengimpor data secara batch. Anda dapat membuat bucket S3 dan mengonfigurasikannya sebagai lokasi eksternal untuk databricks. Silakan lihat Lokasi eksternal untuk detailnya.

    4. +
    5. Amankan kredensial Databricks Anda.

      +

      Untuk lebih jelasnya, lihat petunjuk di blog Mengelola Kredensial dengan Aman di Databricks.

    6. +
    +

    Demo

    +

    Berikut adalah cuplikan kode yang menampilkan proses migrasi data batch. Mirip dengan contoh Milvus di atas, Anda hanya perlu mengganti kredensial dan alamat bucket S3.

    +
    // Write the data in batch into the Milvus bucket storage.
    +val outputPath = "s3://my-temp-bucket/result"
    +df.write
    +  .mode("overwrite")
    +  .format("mjson")
    +  .save(outputPath)
    +// Specify Milvus options.
    +val targetProperties = Map(
    +  MilvusOptions.MILVUS_URI -> zilliz_uri,
    +  MilvusOptions.MILVUS_TOKEN -> zilliz_token,
    +  MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +  MilvusOptions.MILVUS_BUCKET -> bucketName,
    +  MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +  MilvusOptions.MILVUS_FS -> fs,
    +  MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +  MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +  MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +)
    +val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +// Bulk insert Spark output files into Milvus
    +MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "mjson")
    +
    +

    Praktik langsung

    Untuk membantu Anda memulai dengan cepat menggunakan Spark-Milvus Connector, kami telah menyiapkan sebuah buku catatan yang memandu Anda melalui proses streaming dan transfer data batch, dengan Milvus dan Zilliz Cloud.

    + diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_vanna.json b/localization/v2.5.x/site/id/integrations/integrate_with_vanna.json new file mode 100644 index 000000000..1c2ccae5f --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_vanna.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"vanna[milvus,openai]\"\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from pymilvus import MilvusClient, model\nfrom vanna.milvus import Milvus_VectorStore\nfrom vanna.openai import OpenAI_Chat\n\n\nclass VannaMilvus(Milvus_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n Milvus_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n","milvus_uri = \"./milvus_vanna.db\"\n\nmilvus_client = MilvusClient(uri=milvus_uri)\n\nvn_milvus = VannaMilvus(\n config={\n \"api_key\": os.getenv(\"OPENAI_API_KEY\"),\n \"model\": \"gpt-3.5-turbo\",\n \"milvus_client\": milvus_client,\n \"embedding_function\": model.DefaultEmbeddingFunction(),\n \"n_results\": 2, # The number of results to return from Milvus semantic search.\n }\n)\n","import sqlite3\n\nsqlite_path = \"./my-database.sqlite\"\nsql_connect = sqlite3.connect(sqlite_path)\nc = sql_connect.cursor()\n\ninit_sqls = \"\"\"\nCREATE TABLE IF NOT EXISTS Customer (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Company TEXT NOT NULL,\n City TEXT NOT NULL,\n Phone TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS Company (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Industry TEXT NOT NULL,\n Location TEXT NOT NULL,\n EmployeeCount INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS User (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Username TEXT NOT NULL UNIQUE,\n Email TEXT NOT NULL UNIQUE\n);\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');\n\nINSERT INTO Company (Name, Industry, Location, EmployeeCount)\nVALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);\n\nINSERT INTO User (Username, Email)\nVALUES ('johndoe123', 'johndoe123@example.com');\n\"\"\"\n\nfor sql in init_sqls.split(\";\"):\n c.execute(sql)\n\nsql_connect.commit()\n\n# Connect to the SQLite database\nvn_milvus.connect_to_sqlite(sqlite_path)\n","# If there exists training data, we should remove it before training.\nexisting_training_data = vn_milvus.get_training_data()\nif len(existing_training_data) > 0:\n for _, training_data in existing_training_data.iterrows():\n vn_milvus.remove_training_data(training_data[\"id\"])\n\n# Get the DDL of the SQLite database\ndf_ddl = vn_milvus.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\n# Train the model on the DDL data\nfor ddl in df_ddl[\"sql\"].to_list():\n vn_milvus.train(ddl=ddl)\n","# Add documentation about your business terminology or definitions.\nvn_milvus.train(\n documentation=\"ABC Corp specializes in cutting-edge technology solutions and innovation.\"\n)\nvn_milvus.train(\n documentation=\"XYZ Inc is a global leader in manufacturing and supply chain management.\"\n)\n\n# You can also add SQL queries to your training data.\nvn_milvus.train(sql=\"SELECT * FROM Customer WHERE Name = 'John Doe'\")\n","training_data = vn_milvus.get_training_data()\ntraining_data\n","sql = vn_milvus.generate_sql(\"what is the phone number of John Doe?\")\nvn_milvus.run_sql(sql)\n","sql = vn_milvus.generate_sql(\"which customer works for a manufacturing corporation?\")\nvn_milvus.run_sql(sql)\n","sql_connect.close()\nmilvus_client.close()\n\nos.remove(sqlite_path)\nif os.path.exists(milvus_uri):\n os.remove(milvus_uri)\n"],"headingContent":"Write SQL with Vanna and Milvus","anchorList":[{"label":"Menulis SQL dengan Vanna dan Milvus","href":"Write-SQL-with-Vanna-and-Milvus","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Persiapan data","href":"Data-preparation","type":2,"isActive":false},{"label":"Melatih dengan data","href":"Train-with-data","type":2,"isActive":false},{"label":"Menghasilkan SQL dan menjalankannya","href":"Generate-SQLs-and-execute-them","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_vanna.md b/localization/v2.5.x/site/id/integrations/integrate_with_vanna.md new file mode 100644 index 000000000..4dce37a3a --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_vanna.md @@ -0,0 +1,369 @@ +--- +id: integrate_with_vanna.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan Vanna untuk menghasilkan dan + mengeksekusi kueri SQL berdasarkan data Anda yang tersimpan dalam database. +title: Menulis SQL dengan Vanna dan Milvus +--- +

    Menulis SQL dengan Vanna dan Milvus

    Open In Colab +GitHub Repository

    +

    Vanna adalah kerangka kerja Python RAG (Retrieval-Augmented Generation) sumber terbuka untuk pembuatan SQL dan fungsionalitas terkait. Milvus adalah basis data vektor sumber terbuka yang paling canggih di dunia, yang dibangun untuk mendukung pencarian kemiripan dan aplikasi AI.

    +

    Vanna bekerja dalam dua langkah mudah - melatih "model" RAG pada data Anda, dan kemudian mengajukan pertanyaan yang akan menghasilkan kueri SQL yang dapat diatur untuk dijalankan pada database Anda. Panduan ini mendemonstrasikan cara menggunakan Vanna untuk membuat dan menjalankan kueri SQL berdasarkan data Anda yang tersimpan di database.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut:

    +
    $ pip install "vanna[milvus,openai]"
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Dan Anda perlu mengatur OPENAI_API_KEY dalam variabel lingkungan Anda. Anda dapat memperoleh kunci API dari OpenAI.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Persiapan data

    Pertama, kita perlu mewarisi kelas Milvus_VectorStore dan OpenAI_Chat dari Vanna dan mendefinisikan kelas baru VannaMilvus yang menggabungkan kemampuan dari keduanya.

    +
    from pymilvus import MilvusClient, model
    +from vanna.milvus import Milvus_VectorStore
    +from vanna.openai import OpenAI_Chat
    +
    +
    +class VannaMilvus(Milvus_VectorStore, OpenAI_Chat):
    +    def __init__(self, config=None):
    +        Milvus_VectorStore.__init__(self, config=config)
    +        OpenAI_Chat.__init__(self, config=config)
    +
    +

    Kita menginisialisasi kelas VannaMilvus dengan parameter konfigurasi yang diperlukan. Kita menggunakan instance milvus_client untuk menyimpan embeddings dan model.DefaultEmbeddingFunction() yang diinisialisasi dari milvus_model untuk menghasilkan embeddings.C

    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +
    milvus_uri = "./milvus_vanna.db"
    +
    +milvus_client = MilvusClient(uri=milvus_uri)
    +
    +vn_milvus = VannaMilvus(
    +    config={
    +        "api_key": os.getenv("OPENAI_API_KEY"),
    +        "model": "gpt-3.5-turbo",
    +        "milvus_client": milvus_client,
    +        "embedding_function": model.DefaultEmbeddingFunction(),
    +        "n_results": 2,  # The number of results to return from Milvus semantic search.
    +    }
    +)
    +
    +

    Ini adalah contoh sederhana dengan hanya beberapa sampel data, jadi kami mengatur n_results ke 2 untuk memastikan kami mencari 2 hasil teratas yang paling mirip. Dalam praktiknya, Anda harus mengatur n_results ke nilai yang lebih tinggi ketika berhadapan dengan kumpulan data pelatihan yang lebih besar.

    +

    Kita akan menggunakan contoh database SQLite dengan beberapa tabel yang berisi beberapa sampel data.

    +
    import sqlite3
    +
    +sqlite_path = "./my-database.sqlite"
    +sql_connect = sqlite3.connect(sqlite_path)
    +c = sql_connect.cursor()
    +
    +init_sqls = """
    +CREATE TABLE IF NOT EXISTS Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +);
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');
    +
    +INSERT INTO Company (Name, Industry, Location, EmployeeCount)
    +VALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);
    +
    +INSERT INTO User (Username, Email)
    +VALUES ('johndoe123', 'johndoe123@example.com');
    +"""
    +
    +for sql in init_sqls.split(";"):
    +    c.execute(sql)
    +
    +sql_connect.commit()
    +
    +# Connect to the SQLite database
    +vn_milvus.connect_to_sqlite(sqlite_path)
    +
    +

    Melatih dengan data

    Kita dapat melatih model pada data DDL dari database SQLite. Kita mendapatkan data DDL dan mengumpankannya ke fungsi train.

    +
    # If there exists training data, we should remove it before training.
    +existing_training_data = vn_milvus.get_training_data()
    +if len(existing_training_data) > 0:
    +    for _, training_data in existing_training_data.iterrows():
    +        vn_milvus.remove_training_data(training_data["id"])
    +
    +# Get the DDL of the SQLite database
    +df_ddl = vn_milvus.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
    +
    +# Train the model on the DDL data
    +for ddl in df_ddl["sql"].to_list():
    +    vn_milvus.train(ddl=ddl)
    +
    +
    Adding ddl: CREATE TABLE Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +)
    +Adding ddl: CREATE TABLE sqlite_sequence(name,seq)
    +Adding ddl: CREATE TABLE Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +)
    +Adding ddl: CREATE TABLE User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +)
    +
    +

    Selain melatih pada data DDL, kita juga dapat melatih pada dokumentasi dan kueri SQL dari database.

    +
    # Add documentation about your business terminology or definitions.
    +vn_milvus.train(
    +    documentation="ABC Corp specializes in cutting-edge technology solutions and innovation."
    +)
    +vn_milvus.train(
    +    documentation="XYZ Inc is a global leader in manufacturing and supply chain management."
    +)
    +
    +# You can also add SQL queries to your training data.
    +vn_milvus.train(sql="SELECT * FROM Customer WHERE Name = 'John Doe'")
    +
    +
    Adding documentation....
    +Adding documentation....
    +Using model gpt-3.5-turbo for 65.0 tokens (approx)
    +Question generated with sql: What are the details of the customer named John Doe? 
    +Adding SQL...
    +
    +
    +
    +
    +
    +'595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sql'
    +
    +

    Mari kita lihat data pelatihannya.

    +
    training_data = vn_milvus.get_training_data()
    +training_data
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #idpertanyaankonten
    0595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sqlApa saja detail dari pelanggan yang bernama Joh...SELECT * FROM Pelanggan WHERE Nama = 'John Doe'
    025f4956c-e370-4097-994f-996f22d145fa-ddlTidak adaCREATE TABLE Perusahaan (\n ID INTEGER PRIMARY ...
    1b95ecc66-f65b-49dc-a9f1-c1842ad230ff-ddlTidak adaCREATE TABLE Pelanggan (\n ID INTEGER PRIMARY...
    2fcc73d15-30a5-4421-9d73-b8c3b0ed5305-ddlTidak adaCREATE TABLE sqlite_sequence (nama,seq)
    3feae618c-5910-4f6f-8b4b-6cc3e03aec06-ddlTidak adaCREATE TABLE Pengguna (\n ID INTEGER PRIMARY KE...
    079a48db1-ba1f-4fd5-be99-74f2ca2eaeeb-docTidak adaXYZ Inc adalah pemimpin global dalam bidang manufaktur dan ...
    19f9df1b8-ae62-4823-ad28-d7e0f2d1f4c0-docTidak adaABC Corp mengkhususkan diri dalam teknologi mutakhir ...
    +
    +

    Menghasilkan SQL dan menjalankannya

    Seperti yang telah kita latih dengan data DDL, struktur tabel sekarang tersedia untuk membuat kueri SQL.

    +

    Mari kita coba sebuah pertanyaan sederhana.

    +
    sql = vn_milvus.generate_sql("what is the phone number of John Doe?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\nCREATE TABLE User (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Username TEXT NOT NULL UNIQUE,\n    Email TEXT NOT NULL UNIQUE\n)\n\n\n===Additional Context \n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'what is the phone number of John Doe?'}]
    +Using model gpt-3.5-turbo for 367.25 tokens (approx)
    +LLM Response: SELECT Phone FROM Customer WHERE Name = 'John Doe'
    +
    +
    + + + + + + + + + + + + + +
    #Telepon
    0123-456-7890
    +
    +

    Ini adalah pertanyaan yang lebih kompleks. Informasi nama perusahaan manufaktur ada dalam data dokumen, yang merupakan informasi latar belakang. Kueri SQL yang dihasilkan akan mengambil informasi pelanggan berdasarkan nama perusahaan manufaktur tertentu.

    +
    sql = vn_milvus.generate_sql("which customer works for a manufacturing corporation?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Company (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Industry TEXT NOT NULL,\n    Location TEXT NOT NULL,\n    EmployeeCount INTEGER NOT NULL\n)\n\nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\n\n===Additional Context \n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'which customer works for a manufacturing corporation?'}]
    +Using model gpt-3.5-turbo for 384.25 tokens (approx)
    +LLM Response: SELECT * 
    +FROM Customer 
    +WHERE Company = 'XYZ Inc'
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    #IDNamaPerusahaanKotaTelepon
    022. Jane SmithXYZ IncLos Angeles098-765-4321
    +
    +

    Putuskan sambungan dari SQLite dan Milvus dan hapus untuk membebaskan sumber daya.

    +
    sql_connect.close()
    +milvus_client.close()
    +
    +os.remove(sqlite_path)
    +if os.path.exists(milvus_uri):
    +    os.remove(milvus_uri)
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.json b/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.json new file mode 100644 index 000000000..f2b973334 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.json @@ -0,0 +1 @@ +{"codeList":["python3 -m pip install pymilvus fiftyone torch torchvision\n","import fiftyone as fo\nimport fiftyone.brain as fob\nimport fiftyone.zoo as foz\n\n# Step 1: Load your data into FiftyOne\ndataset = foz.load_zoo_dataset(\"quickstart\")\n\n# Steps 2 and 3: Compute embeddings and create a similarity index\nmilvus_index = fob.compute_similarity(\n dataset,\n brain_key=\"milvus_index\",\n backend=\"milvus\",\n)\n","# Step 4: Query your data\nquery = dataset.first().id # query by sample ID\nview = dataset.sort_by_similarity(\n query,\n brain_key=\"milvus_index\",\n k=10, # limit to 10 most similar samples\n)\n\n# Step 5 (optional): Cleanup\n\n# Delete the Milvus collection\nmilvus_index.cleanup()\n\n# Delete run record from FiftyOne\ndataset.delete_brain_run(\"milvus_index\")\n","# Step 5: Delete the index\nmilvus_index.delete()\n","import fiftyone.brain as fob\n\nfob.compute_similarity(..., backend=\"milvus\", ...)\n","export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus\n","{\n \"default_similarity_backend\": \"milvus\"\n}\n","export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX\n\n# also available if necessary\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"uri\": \"XXXXXX\",\n \"user\": \"XXXXXX\",\n \"password\": \"XXXXXX\",\n\n # also available if necessary\n \"secure\": true,\n \"token\": \"XXXXXX\",\n \"db_name\": \"XXXXXX\",\n \"client_key_path\": \"XXXXXX\",\n \"client_pem_path\": \"XXXXXX\",\n \"ca_pem_path\": \"XXXXXX\",\n \"server_pem_path\": \"XXXXXX\",\n \"server_name\": \"XXXXXX\"\n }\n }\n}\n","import fiftyone.brain as fob\n\nmilvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","milvus_index = dataset.load_brain_results(\n \"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"collection_name\": \"your_collection\",\n \"metric\": \"dotproduct\",\n \"consistency_level\": \"Strong\"\n }\n }\n}\n","milvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n collection_name=\"your_collection\",\n metric=\"dotproduct\",\n consistency_level=\"Strong\",\n)\n","import fiftyone.brain as fob\n\n# List all brain runs\ndataset.list_brain_runs()\n\n# Only list similarity runs\ndataset.list_brain_runs(type=fob.Similarity)\n\n# Only list specific similarity runs\ndataset.list_brain_runs(\n type=fob.Similarity,\n patches_field=\"ground_truth\",\n supports_prompts=True,\n)\n","info = dataset.get_brain_info(brain_key)\nprint(info)\n","dataset.rename_brain_run(brain_key, new_brain_key)\n","dataset.delete_brain_run(brain_key)\n","# Delete the Milvus collection\nmilvus_index = dataset.load_brain_results(brain_key)\nmilvus_index.cleanup()\n"],"headingContent":"Conduct Vision Searches with Milvus and FiftyOne","anchorList":[{"label":"Melakukan Pencarian Visi dengan Milvus dan FiftyOne","href":"Conduct-Vision-Searches-with-Milvus-and-FiftyOne","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Persyaratan Instalasi","href":"Installing-Requirements","type":2,"isActive":false},{"label":"Resep dasar","href":"Basic-recipe","type":2,"isActive":false},{"label":"Prosedur","href":"Procedures","type":2,"isActive":false},{"label":"Menggunakan backend Milvus","href":"Use-the-Milvus-backend","type":2,"isActive":false},{"label":"Otentikasi","href":"Authentication","type":2,"isActive":false},{"label":"Mengelola brain run","href":"Manage-brain-runs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.md b/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.md new file mode 100644 index 000000000..3225ecb66 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_voxel51.md @@ -0,0 +1,337 @@ +--- +id: integrate_with_voxel51.md +summary: Halaman ini membahas integrasi dengan voxel51 +title: Melakukan Pencarian Visi dengan Milvus dan FiftyOne +--- +

    Melakukan Pencarian Visi dengan Milvus dan FiftyOne

    FiftyOne adalah alat sumber terbuka untuk membangun dataset berkualitas tinggi dan model visi komputer. Panduan ini membantu Anda mengintegrasikan kemampuan pencarian kemiripan Milvus ke FiftyOne, sehingga Anda dapat melakukan pencarian visi pada set data Anda sendiri.

    +

    FiftyOne menyediakan API untuk membuat koleksi Milvus, mengunggah vektor, dan menjalankan kueri kemiripan, baik secara terprogram di Python maupun melalui tunjuk-dan-klik di Aplikasi. Demonstrasi di halaman ini berfokus pada integrasi terprogram.

    +

    Prasyarat

    Sebelum memulai, pastikan Anda memiliki yang berikut ini:

    +
      +
    • Server Milvus yang sedang berjalan.
    • +
    • Lingkungan Python dengan pymilvus dan fiftyone terinstal.
    • +
    • Sebuah kumpulan data gambar untuk dicari.
    • +
    +

    Persyaratan Instalasi

    Untuk contoh ini, kita akan menggunakan pymilvus dan fiftyone. Anda dapat menginstalnya dengan menjalankan perintah berikut:

    +
    python3 -m pip install pymilvus fiftyone torch torchvision
    +
    +

    Resep dasar

    Alur kerja dasar untuk menggunakan Milvus untuk membuat indeks kemiripan pada dataset FiftyOne Anda dan menggunakannya untuk menanyakan data Anda adalah sebagai berikut:

    +
      +
    1. Muat dataset ke FiftyOne
    2. +
    3. Hitung embedding vektor untuk sampel atau patch dalam dataset Anda, atau pilih model untuk menggunakan embedding yang dihasilkan.
    4. +
    5. Gunakan metode compute_similarity() untuk menghasilkan indeks kemiripan Milvus untuk sampel atau tambalan objek dalam dataset dengan mengatur parameter backend="milvus" dan menentukan brain_key pilihan Anda.
    6. +
    7. Gunakan indeks kemiripan Milvus ini untuk menanyakan data Anda dengan sort_by_similarity().
    8. +
    9. Jika diinginkan, hapus indeks tersebut.
    10. +
    +

    Prosedur

    Contoh di bawah ini menunjukkan alur kerja di atas.

    +

    1. Muat set data ke FiftyOne dan hitung penyematan untuk sampel

    Kode berikut ini menggunakan kumpulan gambar sampel yang disediakan oleh FiftyOne untuk mendemonstrasikan integrasi. Anda dapat menyiapkan set gambar Anda sendiri dengan merujuk ke artikel ini.

    +
    import fiftyone as fo
    +import fiftyone.brain as fob
    +import fiftyone.zoo as foz
    +
    +# Step 1: Load your data into FiftyOne
    +dataset = foz.load_zoo_dataset("quickstart")
    +
    +# Steps 2 and 3: Compute embeddings and create a similarity index
    +milvus_index = fob.compute_similarity(
    +    dataset,
    +    brain_key="milvus_index",
    +    backend="milvus",
    +)
    +
    +

    2. Melakukan pencarian kemiripan penglihatan

    Sekarang Anda dapat menggunakan indeks kesamaan Milvus untuk melakukan pencarian kesamaan visi pada kumpulan data Anda.

    +
    # Step 4: Query your data
    +query = dataset.first().id  # query by sample ID
    +view = dataset.sort_by_similarity(
    +    query,
    +    brain_key="milvus_index",
    +    k=10,  # limit to 10 most similar samples
    +)
    +
    +# Step 5 (optional): Cleanup
    +
    +# Delete the Milvus collection
    +milvus_index.cleanup()
    +
    +# Delete run record from FiftyOne
    +dataset.delete_brain_run("milvus_index")
    +
    +

    3. Menghapus indeks

    Jika Anda tidak lagi memerlukan indeks kemiripan Milvus, Anda dapat menghapusnya dengan menggunakan kode berikut:

    +
    # Step 5: Delete the index
    +milvus_index.delete()
    +
    +

    Menggunakan backend Milvus

    Secara default, memanggil compute_similarity() atau sort_by_similarity() akan menggunakan backend sklearn.

    +

    Untuk menggunakan backend Milvus, cukup setel parameter backend opsional compute_similarity() ke "milvus":

    +
    import fiftyone.brain as fob
    +
    +fob.compute_similarity(..., backend="milvus", ...)
    +
    +

    Atau, Anda dapat mengonfigurasi FiftyOne secara permanen untuk menggunakan backend Milvus dengan mengatur variabel lingkungan berikut:

    +
    export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
    +
    +

    atau dengan mengatur parameter default_similarity_backend pada konfigurasi otak Anda yang terletak di ~/.fiftyone/brain_config.json:

    +
    {
    +    "default_similarity_backend": "milvus"
    +}
    +
    +

    Otentikasi

    Jika Anda menggunakan server Milvus khusus, Anda dapat memberikan kredensial Anda dengan berbagai cara.

    +

    Cara yang disarankan untuk mengonfigurasi kredensial Milvus Anda adalah dengan menyimpannya dalam variabel lingkungan yang ditunjukkan di bawah ini, yang secara otomatis diakses oleh FiftyOne setiap kali koneksi ke Milvus dibuat.

    +
    export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
    +
    +# also available if necessary
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
    +
    +

    Konfigurasi FiftyOne Brain

    Anda juga dapat menyimpan kredensial Anda dalam konfigurasi otak Anda yang terletak di ~/.fiftyone/brain_config.json:

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "uri": "XXXXXX",
    +            "user": "XXXXXX",
    +            "password": "XXXXXX",
    +
    +            # also available if necessary
    +            "secure": true,
    +            "token": "XXXXXX",
    +            "db_name": "XXXXXX",
    +            "client_key_path": "XXXXXX",
    +            "client_pem_path": "XXXXXX",
    +            "ca_pem_path": "XXXXXX",
    +            "server_pem_path": "XXXXXX",
    +            "server_name": "XXXXXX"
    +        }
    +    }
    +}
    +
    +

    Perhatikan bahwa file ini tidak akan ada sampai Anda membuatnya.

    +

    Argumen kata kunci

    Anda dapat secara manual memberikan kredensial Milvus Anda sebagai argumen kata kunci setiap kali Anda memanggil metode seperti compute_similarity() yang membutuhkan koneksi ke Milvus:

    +
    import fiftyone.brain as fob
    +
    +milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    Perhatikan bahwa, ketika menggunakan strategi ini, Anda harus memberikan kredensial secara manual ketika memuat indeks nanti melalui load_brain_results():

    +
    milvus_index = dataset.load_brain_results(
    +    "milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    Parameter konfigurasi Milvus

    Backend Milvus mendukung berbagai parameter kueri yang dapat digunakan untuk menyesuaikan kueri kemiripan Anda. Parameter-parameter ini meliputi:

    +
      +
    • collection_name(Tidak ada): nama koleksi Milvus yang akan digunakan atau dibuat. Jika tidak ada yang disediakan, koleksi baru akan dibuat

    • +
    • metrik ("dotproduct"): metrik jarak sematan yang akan digunakan saat membuat indeks baru. Nilai yang didukung adalah ("dotproduct", "euclidean")

    • +
    • consistency_level ("Session"): tingkat konsistensi yang akan digunakan. Nilai yang didukung adalah ("Strong", "Session", "Bounded", "Eventually")

    • +
    +

    Untuk informasi terperinci tentang parameter ini, lihat dokumentasi otentikasi Milvus dan dokumentasi tingkat konsistensi Milvus.

    +

    Anda dapat menentukan parameter-parameter ini melalui salah satu strategi yang dijelaskan di bagian sebelumnya. Berikut ini contoh konfigurasi otak yang mencakup semua parameter yang tersedia:

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "collection_name": "your_collection",
    +            "metric": "dotproduct",
    +            "consistency_level": "Strong"
    +        }
    +    }
    +}
    +
    +

    Namun, biasanya parameter-parameter ini secara langsung diteruskan ke compute_similarity() untuk mengonfigurasi indeks baru yang spesifik:

    +
    milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    collection_name="your_collection",
    +    metric="dotproduct",
    +    consistency_level="Strong",
    +)
    +
    +

    Mengelola brain run

    FiftyOne menyediakan berbagai metode yang dapat Anda gunakan untuk mengelola brain run.

    +

    Sebagai contoh, Anda dapat memanggil list_brain_runs() untuk melihat kunci otak yang tersedia pada kumpulan data:

    +
    import fiftyone.brain as fob
    +
    +# List all brain runs
    +dataset.list_brain_runs()
    +
    +# Only list similarity runs
    +dataset.list_brain_runs(type=fob.Similarity)
    +
    +# Only list specific similarity runs
    +dataset.list_brain_runs(
    +    type=fob.Similarity,
    +    patches_field="ground_truth",
    +    supports_prompts=True,
    +)
    +
    +

    Atau, Anda dapat menggunakan get_brain_info() untuk mengambil informasi tentang konfigurasi brain run:

    +
    info = dataset.get_brain_info(brain_key)
    +print(info)
    +
    +

    Gunakan load_brain_results() untuk memuat SimilarityIndex untuk menjalankan brain run.

    +

    Anda dapat menggunakan rename_brain_run() untuk mengganti nama kunci otak yang terkait dengan hasil run kemiripan yang sudah ada:

    +
    dataset.rename_brain_run(brain_key, new_brain_key)
    +
    +

    Terakhir, Anda dapat menggunakan delete_brain_run() untuk menghapus brain run:

    +
    dataset.delete_brain_run(brain_key)
    +
    +
    +

    Memanggil delete_brain_run() hanya akan menghapus catatan brain run dari kumpulan data FiftyOne Anda; ini tidak akan menghapus koleksi Milvus yang terkait, yang dapat Anda lakukan sebagai berikut:

    +
    # Delete the Milvus collection
    +milvus_index = dataset.load_brain_results(brain_key)
    +milvus_index.cleanup()
    +
    +
    +

    Untuk alur kerja pencarian vektor umum pada dataset FiftyOne menggunakan backend Milvus, lihat Contoh di sini.

    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.json b/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.json new file mode 100644 index 000000000..0f58823c1 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade voyageai pymilvus\n","import voyageai\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"voyage-law-2\" # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models\nDIMENSION = 1024 # Dimension of vector embedding\n\n# Connect to VoyageAI with API Key.\nvoyage_client = voyageai.Client(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_voyage_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_voyage_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = voyage_client.embed(\n texts=queries, model=MODEL_NAME, truncation=False\n).embeddings\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n"],"headingContent":"Semantic Search with Milvus and VoyageAI","anchorList":[{"label":"Pencarian Semantik dengan Milvus dan VoyageAI","href":"Semantic-Search-with-Milvus-and-VoyageAI","type":1,"isActive":false},{"label":"Memulai","href":"Getting-started","type":2,"isActive":false},{"label":"Mencari judul buku dengan VoyageAI & Milvus","href":"Searching-book-titles-with-VoyageAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.md b/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.md new file mode 100644 index 000000000..9e6499ddd --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_voyageai.md @@ -0,0 +1,136 @@ +--- +id: integrate_with_voyageai.md +title: Pencarian Semantik dengan Milvus dan VoyageAI +summary: >- + Halaman ini membahas integrasi basis data vektor dengan API penyematan + VoyageAI. +--- +

    Pencarian Semantik dengan Milvus dan VoyageAI

    Open In Colab +GitHub Repository

    +

    Panduan ini menunjukkan bagaimana API Embedding VoyageAI dapat digunakan dengan basis data vektor Milvus untuk melakukan pencarian semantik pada teks.

    +

    Memulai

    Sebelum memulai, pastikan Anda telah menyiapkan kunci API Voyage, atau Anda bisa mendapatkannya dari situs web VoyageAI.

    +

    Data yang digunakan dalam contoh ini adalah judul buku. Anda dapat mengunduh dataset di sini dan menaruhnya di direktori yang sama dengan tempat Anda menjalankan kode berikut.

    +

    Pertama, instal paket untuk Milvus dan Voyage AI:

    +
    $ pip install --upgrade voyageai pymilvus
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Dengan ini, kita siap untuk membuat sematan dan menggunakan basis data vektor untuk melakukan pencarian semantik.

    +

    Mencari judul buku dengan VoyageAI & Milvus

    Pada contoh berikut, kita memuat data judul buku dari file CSV yang diunduh, menggunakan model penyematan Voyage AI untuk menghasilkan representasi vektor, dan menyimpannya di basis data vektor Milvus untuk pencarian semantik.

    +
    import voyageai
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "voyage-law-2"  # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models
    +DIMENSION = 1024  # Dimension of vector embedding
    +
    +# Connect to VoyageAI with API Key.
    +voyage_client = voyageai.Client(api_key="<YOUR_VOYAGEAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_voyage_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_voyage_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Dengan semua data dalam basis data vektor Milvus, kita sekarang dapat melakukan pencarian semantik dengan membuat penyematan vektor untuk kueri dan melakukan pencarian vektor.

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = voyage_client.embed(
    +    texts=queries, model=MODEL_NAME, truncation=False
    +).embeddings
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +
    Query: When was artificial intelligence founded?
    +[{'id': 0, 'distance': 0.7196218371391296, 'entity': {'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}}, {'id': 1, 'distance': 0.6297335028648376, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.json b/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.json new file mode 100644 index 000000000..8c9817447 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus, whyhow_rbr\n","from pymilvus import MilvusClient\n\n# Milvus Lite local path\npath=\"./milvus_demo.db\" # random name for local milvus lite db path\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(path)\n","from pymilvus import MilvusClient\n\n# Milvus Cloud credentials\nYOUR_MILVUS_CLOUD_END_POINT = \"YOUR_MILVUS_CLOUD_END_POINT\"\nYOUR_MILVUS_CLOUD_TOKEN = \"YOUR_MILVUS_CLOUD_TOKEN\"\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(\n milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, \n milvus_token=YOUR_MILVUS_CLOUD_TOKEN,\n)\n","# Define collection name\nCOLLECTION_NAME=\"YOUR_COLLECTION_NAME\" # take your own collection name\n\n# Define vector dimension size\nDIMENSION=1536 # decide by the model you use\n","schema = milvus_client.create_schema(auto_id=True) # Enable id matching\n\nschema = milvus_client.add_field(schema=schema, field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema = milvus_client.add_field(schema=schema, field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# Start to indexing data field\nindex_params = milvus_client.prepare_index_params()\nindex_params = milvus_client.add_index(\n index_params=index_params, # pass in index_params object\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n","# Create Collection\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n schema=schema,\n index_params=index_params\n)\n","# get pdfs\npdfs = [\"harry-potter.pdf\", \"game-of-thrones.pdf\"] # replace to your pdfs path\n\n# Uploading the PDF document\nmilvus_client.upload_documents(\n collection_name=COLLECTION_NAME,\n documents=pdfs\n)\n","# Search data and implement RAG!\nres = milvus_client.search(\n question='What food does Harry Potter like to eat?',\n collection_name=COLLECTION_NAME,\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# RULES(search on book harry-potter on page 8):\nPARTITION_NAME='harry-potter' # search on books\npage_number='page_number == 8'\n\n# first create a partitions to store the book and later search on this specific partition:\nmilvus_client.crate_partition(\n collection_name=COLLECTION_NAME,\n partition_name=PARTITION_NAME # separate base on your pdfs type\n)\n\n# search with rules\nres = milvus_client.search(\n question='Tell me about the greedy method',\n collection_name=COLLECTION_NAME,\n partition_names=PARTITION_NAME,\n filter=page_number, # append any rules follow the Boolean Expression Rule\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# Clean up\nmilvus_client.drop_collection(\n collection_name=COLLECTION_NAME\n)\n"],"headingContent":"Integrate Milvus with WhyHow","anchorList":[{"label":"Mengintegrasikan Milvus dengan WhyHow","href":"Integrate-Milvus-with-WhyHow","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Instalasi","href":"Installation","type":2,"isActive":false},{"label":"Membuat Koleksi","href":"Create-Collection","type":2,"isActive":false},{"label":"Mengunggah dokumen","href":"Upload-documents","type":2,"isActive":false},{"label":"Menjawab pertanyaan","href":"Question-answering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.md b/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.md new file mode 100644 index 000000000..16a02e351 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrate_with_whyhow.md @@ -0,0 +1,218 @@ +--- +id: integrate_with_whyhow.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan whyhow.ai dan Milvus Lite untuk + melakukan Rule-based Retrieval. +title: Mengintegrasikan Milvus dengan WhyHow +--- +

    Mengintegrasikan Milvus dengan WhyHow

    Panduan ini mendemonstrasikan cara menggunakan whyhow.ai dan Milvus Lite untuk melakukan Rule-based Retrieval.

    +

    Gambaran Umum

    WhyHow adalah platform yang menyediakan blok bangunan yang dibutuhkan pengembang untuk mengatur, mengontekstualisasikan, dan mengambil data tidak terstruktur secara andal untuk melakukan RAG yang kompleks. Paket Rule-based Retrieval adalah paket Python yang dikembangkan oleh WhyHow yang memungkinkan orang untuk membuat dan mengelola aplikasi Retrieval Augmented Generation (RAG) dengan kemampuan pemfilteran tingkat lanjut.

    +

    Instalasi

    Sebelum memulai, silakan instal semua paket python yang diperlukan untuk digunakan nanti.

    +
    pip install --upgrade pymilvus, whyhow_rbr
    +
    +

    Selanjutnya, kita perlu menginisialisasi klien Milvus untuk mengimplementasikan Rule-based Retrieval dengan menggunakan Milvus Lite.

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Lite local path
    +path="./milvus_demo.db" # random name for local milvus lite db path
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(path)
    +
    +

    Anda juga dapat menginisialisasi klien Milvus melalui Milvus Cloud

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Cloud credentials
    +YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
    +YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(
    +        milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, 
    +        milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
    +)
    +
    +

    Membuat Koleksi

    Mendefinisikan variabel yang diperlukan

    # Define collection name
    +COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
    +
    +# Define vector dimension size
    +DIMENSION=1536 # decide by the model you use
    +
    +

    Menambahkan skema

    Sebelum memasukkan data ke dalam database Milvus Lite, kita perlu mendefinisikan field data terlebih dahulu, yang disebut schema di sini. Dengan membuat objek CollectionSchema dan menambahkan data field melalui add_field(), kita dapat mengontrol tipe data dan karakteristiknya. Langkah ini wajib dilakukan sebelum memasukkan data apapun ke dalam Milvus.

    +
    schema = milvus_client.create_schema(auto_id=True) # Enable id matching
    +
    +schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    Membuat indeks

    Untuk setiap skema, akan lebih baik jika kita memiliki sebuah indeks agar proses query menjadi lebih efisien. Untuk membuat indeks, pertama-tama kita membutuhkan sebuah index_params dan kemudian menambahkan lebih banyak data indeks pada objek IndexParams ini.

    +
    # Start to indexing data field
    +index_params = milvus_client.prepare_index_params()
    +index_params = milvus_client.add_index(
    +    index_params=index_params,  # pass in index_params object
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +

    Metode ini merupakan pembungkus tipis dari implementasi resmi Milvus(dokumen resmi).

    +

    Membuat koleksi

    Setelah mendefinisikan semua field data dan mengindeksnya, sekarang kita perlu membuat koleksi basis data kita sehingga kita dapat mengakses data kita dengan cepat dan tepat. Yang perlu disebutkan adalah bahwa kita menginisialisasi enable_dynamic_field menjadi true sehingga Anda dapat mengunggah data apa pun dengan bebas. Konsekuensinya adalah permintaan data mungkin tidak efisien.

    +
    # Create Collection
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    schema=schema,
    +    index_params=index_params
    +)
    +
    +

    Mengunggah dokumen

    Setelah membuat koleksi, kita siap untuk mengisinya dengan dokumen. Di whyhow_rbr, hal ini dilakukan dengan menggunakan metode upload_documents dari MilvusClient. Metode ini melakukan langkah-langkah berikut ini:

    +
      +
    • Pemrosesan awal: Membaca dan membagi file PDF yang disediakan menjadi beberapa bagian
    • +
    • Penyematan: Menyematkan semua potongan menggunakan model OpenAI
    • +
    • Memasukkan: Mengunggah penyematan dan metadata ke Milvus Lite
    • +
    +
    # get pdfs
    +pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
    +
    +# Uploading the PDF document
    +milvus_client.upload_documents(
    +    collection_name=COLLECTION_NAME,
    +    documents=pdfs
    +)
    +
    +

    Menjawab pertanyaan

    Sekarang kita akhirnya dapat beralih ke pengambilan augmented generation.

    +
    # Search data and implement RAG!
    +res = milvus_client.search(
    +    question='What food does Harry Potter like to eat?',
    +    collection_name=COLLECTION_NAME,
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    Aturan

    Pada contoh sebelumnya, setiap dokumen dalam indeks kita dipertimbangkan. Namun, kadang-kadang mungkin bermanfaat untuk hanya mengambil dokumen yang memenuhi beberapa kondisi yang telah ditentukan (misalnya filename=harry-potter.pdf). Di whyhow_rbr melalui Milvus Lite, hal ini dapat dilakukan dengan menyesuaikan parameter pencarian.

    +

    Sebuah aturan dapat mengontrol atribut metadata berikut ini

    +
      +
    • filename nama berkas
    • +
    • page_numbers daftar bilangan bulat yang berhubungan dengan nomor halaman (pengindeksan 0)
    • +
    • id pengenal unik dari sebuah potongan (ini adalah filter yang paling "ekstrem")
    • +
    • Aturan lain yang didasarkan pada Ekspresi Boolean
    • +
    +
    # RULES(search on book harry-potter on page 8):
    +PARTITION_NAME='harry-potter' # search on books
    +page_number='page_number == 8'
    +
    +# first create a partitions to store the book and later search on this specific partition:
    +milvus_client.crate_partition(
    +    collection_name=COLLECTION_NAME,
    +    partition_name=PARTITION_NAME # separate base on your pdfs type
    +)
    +
    +# search with rules
    +res = milvus_client.search(
    +    question='Tell me about the greedy method',
    +    collection_name=COLLECTION_NAME,
    +    partition_names=PARTITION_NAME,
    +    filter=page_number, # append any rules follow the Boolean Expression Rule
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    Dalam contoh ini, pertama-tama kita membuat partisi yang menyimpan pdf yang berhubungan dengan Harry Potter, dan melalui pencarian di dalam partisi ini, kita dapat memperoleh informasi yang paling langsung. Selain itu, kami juga menerapkan nomor halaman sebagai filter untuk menentukan halaman yang ingin kami cari. Ingat, parameter filer harus mengikuti aturan boolean.

    +

    Bersihkan

    Akhirnya, setelah menerapkan semua instruksi, Anda dapat membersihkan basis data dengan menghubungi drop_collection().

    +
    # Clean up
    +milvus_client.drop_collection(
    +    collection_name=COLLECTION_NAME
    +)
    +
    diff --git a/localization/v2.5.x/site/id/integrations/integrations_overview.json b/localization/v2.5.x/site/id/integrations/integrations_overview.json new file mode 100644 index 000000000..cafbd2146 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrations_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Integrations Overview","anchorList":[{"label":"Ikhtisar Integrasi","href":"Integrations-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/integrations_overview.md b/localization/v2.5.x/site/id/integrations/integrations_overview.md new file mode 100644 index 000000000..f5f4411b7 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/integrations_overview.md @@ -0,0 +1,80 @@ +--- +id: integrations_overview.md +summary: >- + Halaman ini menyediakan daftar tutorial bagi Anda untuk berinteraksi dengan + Milvus dan alat bantu pihak ketiga. +title: Ikhtisar Integrasi +--- +

    Ikhtisar Integrasi

    Halaman ini menyediakan daftar tutorial bagi Anda untuk berinteraksi dengan Milvus dan alat bantu pihak ketiga.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TutorialKasus PenggunaanMitra atau Tumpukan
    RAG dengan Milvus dan LlamaIndexRAGMilvus, LLamaIndex
    RAG dengan Milvus dan LangChainRAGMilvus, LangChain
    Retriever Pencarian Hibrida Milvus di LangChainPencarian HibridaMilvus, LangChain
    Pencarian Semantik dengan Milvus dan OpenAIPencarian SemantikMilvus, OpenAI
    Menjawab Pertanyaan Menggunakan Milvus dan CoherePencarian SemantikMilvus, Cohere
    Penjawaban Pertanyaan menggunakan Milvus dan HuggingFacePenjawaban PertanyaanMilvus, HuggingFace
    Pencarian Gambar menggunakan Milvus dan PytorchPencarian SemantikMilvus, Pytorch
    Pencarian Film menggunakan Milvus dan SentenceTransfromersPencarian SemantikMilvus, Pengubah Kalimat
    Menggunakan Milvus sebagai Penyimpan Vektor di LangChainPencarian SemantikMilvus, LangChain
    RAG dengan Milvus dan HaystackRAGMilvus, Haystack
    Melakukan Pencarian Visi dengan Milvus dan FiftyOnePencarian SemantikMilvus, FiftyOne
    Pencarian Semantik dengan Milvus dan VoyageAIPencarian SemantikMilvus, VoyageAI
    RAG dengan Milvus dan BentoMLRAGMilvus, BentoML
    RAG dengan Milvus dan DSPyRAGMilvus, DSPy
    Pencarian Semantik dengan Milvus dan JinaPencarian SemantikMilvus, Jina
    Milvus pada Layanan Kontainer SnowparkKoneksi DataMilvus, Snowpark
    Pencarian Berbasis Aturan dengan Milvus dan WhyHowMenjawab PertanyaanMilvus, WhyHow
    Milvus di LangfuseKeteramatanMilvus, Langfuse
    Evaluasi RAG dengan Ragas dan MilvusEvaluasiMilvus, Ragas
    Agen Chatbot dengan Milvus dan MemGPTAgenMilvus, MemGPT
    Cara menggunakan FastGPT dengan MilvusRAGMilvus, FastGPT
    Menulis SQL dengan Vanna dan MilvusRAGMilvus, Vanna
    RAG dengan Milvus dan CamelRAGMilvus, Camel
    Airbyte & Milvus: Infrastruktur Pergerakan Data Sumber TerbukaKoneksi DataMilvus, Airbyte
    Pencarian Video Tingkat Lanjut: Memanfaatkan Twelve Labs dan Milvus untuk Pencarian SemantikPencarian SemantikMilvus, Dua Belas Laboratorium
    Membangun RAG dengan Milvus, vLLM, dan Llama 3.1RAGMilvus, vLLM, LlamaIndex
    Sistem Multi-agen dengan Mistral AI, Milvus, dan Llama-agenAgenMilvus, Mistral AI, LlamaIndex
    Menghubungkan Kafka dengan MilvusSumber DataMilvus, Kafka
    Kotaemon RAG dengan MilvusRAGMilvus, Kotaemon
    Pengambilan-Pembangkitan yang Ditambah: Merayapi Situs Web dengan Apify dan Menyimpan Data ke Milvus untuk Menjawab PertanyaanSumber DataMilvus, Apify
    Evaluasi dengan DeepEvalEvaluasi & PengamatanMilvus, DeepEval
    Evaluasi dengan Arize PheonixEvaluasi & KeteramatanMilvus, Arize Pheonix
    Menerapkan Dify dengan MilvusOkestrasiMilvus, Dify
    Membangun Sistem RAG Menggunakan Langflow dengan MilvusOchestrationMilvus, Langflow
    Membangun RAG pada Arsitektur LenganRAGMilvus, Arm
    Membangun RAG dengan Milvus dan Fireworks AILLMMilvus, Fireworks AI
    Membangun RAG dengan Milvus dan Lepton AILLMMilvus, Lepton AI
    Membangun RAG dengan Milvus dan SiliconFlowLLMMilvus, SiliconFlow
    Membangun RAG dengan Milvus dan UnstructuredSumber DataMilvus, Tidak Terstruktur
    Membangun RAG dengan Milvus + PII MaskerSumber DataMilvus, PII Masker
    Menggunakan Milvus di PrivateGPTOkestrasipencarian vektor
    Memulai dengan Mem0 dan MilvusAgenMem0, Milvus
    Tabel Pengetahuan dengan MilvusRekayasa PengetahuanTabel Pengetahuan, Milvus
    Gunakan Milvus di DocsGPTOkestrasiDocsGPT, Milvus
    Menggunakan Milvus dengan SambaNovaOrkestrasiMilvus, SambaNova
    Membangun RAG dengan Milvus dan CogneeRekayasa PengetahuanMilvus, Cognee
    Membangun RAG dengan Milvus dan GeminiLLMMilvus, Gemini
    Membangun RAG dengan Milvus dan OllamaLLMMilvus, Ollama
    Memulai dengan Dynamiq dan MilvusOrkestrasiMilvus, Dynamiq
    Membangun RAG dengan Milvus dan DeepSeekLLMMilvus, DeepSeek
    diff --git a/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.json b/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.json new file mode 100644 index 000000000..705d8c5c4 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ tar -xzf kafka_2.13-3.6.1.tgz\n$ cd kafka_2.13-3.6.1\n","$ bin/zookeeper-server-start.sh config/zookeeper.properties\n","$ bin/kafka-server-start.sh config/server.properties\n","$ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092\n","key.converter.schemas.enable=false\nvalue.converter.schemas.enable=false\nplugin.path=libs/zilliz-kafka-connect-milvus-xxx\n","name=zilliz-kafka-connect-milvus\nconnector.class=com.milvus.io.kafka.MilvusSinkConnector\npublic.endpoint=https://:port\ntoken=*****************************************\ncollection.name=topic_0\ntopics=topic_0\n","$ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties\n","bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092 \n>{\"id\": 0, \"title\": \"The Reported Mortality Rate of Coronavirus Is Not Important\", \"title_vector\": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], \"link\": \"https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912\"}\n"],"headingContent":"Connect Kafka with Milvus","anchorList":[{"label":"Menghubungkan Kafka dengan Milvus","href":"Connect-Kafka-with-Milvus","type":1,"isActive":false},{"label":"Langkah 1: Unduh plugin kafka-connect-milvus","href":"Step-1-Download-the-kafka-connect-milvus-plugin","type":2,"isActive":false},{"label":"Langkah 2: Unduh Kafka","href":"Step-2-Download-Kafka","type":2,"isActive":false},{"label":"LANGKAH 3: Memulai Lingkungan Kafka","href":"STEP-3-Start-the-Kafka-Environment","type":2,"isActive":false},{"label":"Langkah 4: Konfigurasikan Kafka dan Zilliz Cloud","href":"Step-4-Configure-Kafka-and-Zilliz-Cloud","type":2,"isActive":false},{"label":"Langkah 5: Muatkan plugin kafka-connect-milvus ke Kafka Instance","href":"Step-5-Load-the-kafka-connect-milvus-plugin-to-Kafka-Instance","type":2,"isActive":false},{"label":"Langkah 6: Luncurkan konektor","href":"Step-6-Launch-the-connector","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.md b/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.md new file mode 100644 index 000000000..cf0140f6a --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/kafka-connect-milvus.md @@ -0,0 +1,181 @@ +--- +id: kafka-connect-milvus.md +summary: >- + Dalam panduan singkat ini, kami menunjukkan cara menyiapkan open source kafka + dan Zilliz Cloud untuk menelan data vektor. +title: Mengintegrasikan Milvus dengan WhyHow +--- +

    Menghubungkan Kafka dengan Milvus

    Dalam panduan singkat ini, kami akan menunjukkan cara menyiapkan kafka open source dan Zilliz Cloud untuk memasukkan data vektor.

    +

    Langkah 1: Unduh plugin kafka-connect-milvus

    Selesaikan langkah-langkah berikut untuk mengunduh plugin kafka-connect-milvus.

    +
      +
    1. unduh file zip plugin terbaru zilliz-kafka-connect-milvus-xxx.zip dari sini.
    2. +
    +

    Langkah 2: Unduh Kafka

      +
    1. Unduh kafka terbaru dari sini.
    2. +
    3. Buka zip file yang telah diunduh dan buka direktori kafka.
    4. +
    +
    $ tar -xzf kafka_2.13-3.6.1.tgz
    +$ cd kafka_2.13-3.6.1
    +
    +

    LANGKAH 3: Memulai Lingkungan Kafka

    +

    CATATAN: Lingkungan lokal Anda harus sudah terinstal Java 8+.

    +
    +

    Jalankan perintah berikut untuk memulai semua layanan dalam urutan yang benar:

    +
      +
    1. Mulai layanan ZooKeeper

      +
      $ bin/zookeeper-server-start.sh config/zookeeper.properties
      +
    2. +
    3. Mulai layanan broker Kafka

      +

      Buka sesi terminal lain dan jalankan:

      +
      $ bin/kafka-server-start.sh config/server.properties
      +
    4. +
    +

    Setelah semua layanan berhasil dijalankan, Anda akan memiliki lingkungan dasar Kafka yang berjalan dan siap digunakan.

    +
      +
    • periksa panduan memulai cepat resmi dari kafka untuk detailnya: https://kafka.apache.org/quickstart
    • +
    +

    Langkah 4: Konfigurasikan Kafka dan Zilliz Cloud

    Pastikan Anda telah menyiapkan Kafka dan Zilliz Cloud dan dikonfigurasi dengan benar.

    +
      +
    1. Jika Anda belum memiliki topik di Kafka, buatlah sebuah topik (contoh: topic_0) di Kafka.

      +
      $ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092
      +
    2. +
    3. Jika Anda belum memiliki koleksi di Zilliz Cloud, buatlah koleksi dengan bidang vektor (dalam contoh ini vektornya adalah dimension=8). Anda dapat menggunakan contoh skema berikut di Zilliz Cloud:

      +

      +

      +

      Catatan: Pastikan skema di kedua sisi cocok satu sama lain. Dalam skema tersebut, terdapat tepat satu bidang vektor. Nama setiap bidang di kedua sisi sama persis.

      +

    4. +
    +

    Langkah 5: Muatkan plugin kafka-connect-milvus ke Kafka Instance

      +
    1. unzip berkas zilliz-kafka-connect-milvus-xxx.zip yang Anda unduh pada Langkah 1.

    2. +
    3. salin direktori zilliz-kafka-connect-milvus ke direktori libs pada instalasi Kafka Anda.

    4. +
    5. memodifikasi berkas connect-standalone.properties di direktori config pada instalasi Kafka Anda.

      +
      key.converter.schemas.enable=false
      +value.converter.schemas.enable=false
      +plugin.path=libs/zilliz-kafka-connect-milvus-xxx
      +
    6. +
    7. buat dan konfigurasikan berkas milvus-sink-connector.properties di direktori config pada instalasi Kafka Anda.

      +
      name=zilliz-kafka-connect-milvus
      +connector.class=com.milvus.io.kafka.MilvusSinkConnector
      +public.endpoint=https://<public.endpoint>:port
      +token=*****************************************
      +collection.name=topic_0
      +topics=topic_0
      +
    8. +
    +

    Langkah 6: Luncurkan konektor

      +
    1. Jalankan konektor dengan berkas konfigurasi sebelumnya

      +
      $ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties
      +
    2. +
    3. Coba buat pesan ke topik Kafka yang baru saja Anda buat di Kafka

      +
      bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092                        
      +>{"id": 0, "title": "The Reported Mortality Rate of Coronavirus Is Not Important", "title_vector": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], "link": "https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912"}
      +
    4. +
    5. Periksa apakah entitas telah dimasukkan ke dalam koleksi di Zilliz Cloud. Berikut adalah tampilannya di Zilliz Cloud jika penyisipan berhasil:

      +

    6. +
    +

    Dukungan

    Jika Anda memerlukan bantuan atau memiliki pertanyaan tentang Kafka Connect Milvus Connector, jangan ragu untuk menghubungi tim dukungan kami: Email: support@zilliz.com

    diff --git a/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.json b/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.json new file mode 100644 index 000000000..69aba3cae --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/whyhow-ai/knowledge-table.git\n","$ docker compose up -d --build\n","$ docker compose down\n"],"headingContent":"Knowledge Table with Milvus","anchorList":[{"label":"Tabel Pengetahuan dengan Milvus","href":"Knowledge-Table-with-Milvus","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengkloning proyek","href":"Cloning-the-project","type":2,"isActive":false},{"label":"Menyiapkan lingkungan","href":"Set-up-the-environment","type":2,"isActive":false},{"label":"Memulai aplikasi","href":"Starting-the-app","type":2,"isActive":false},{"label":"Menghentikan aplikasi","href":"Stopping-the-app","type":2,"isActive":false},{"label":"Mengakses proyek","href":"Accessing-the-project","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.md b/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.md new file mode 100644 index 000000000..2482ca7ff --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/knowledge_table_with_milvus.md @@ -0,0 +1,146 @@ +--- +id: knowledge_table_with_milvus.md +summary: >- + Secara default, Tabel Pengetahuan menggunakan basis data Milvus untuk + menyimpan dan mengambil data yang diekstrak. Hal ini memungkinkan pengguna + untuk dengan mudah mencari, memfilter, dan menganalisis data dengan + menggunakan fitur-fitur canggih dari Milvus. Dalam tutorial ini, kami akan + menunjukkan bagaimana cara memulai dengan Knowledge Table dan Milvus. +title: Tabel Pengetahuan dengan Milvus +--- +

    Tabel Pengetahuan dengan Milvus

    Knowledge Table, yang dikembangkan oleh WhyHow AI, adalah paket sumber terbuka yang dirancang untuk memfasilitasi ekstraksi dan eksplorasi data terstruktur dari dokumen yang tidak terstruktur. Paket ini menyediakan antarmuka seperti spreadsheet bagi pengguna dan memungkinkan pembuatan representasi pengetahuan, seperti tabel dan grafik, melalui antarmuka kueri bahasa alami. Paket ini mencakup aturan ekstraksi yang dapat disesuaikan, opsi pemformatan, dan penelusuran data melalui sumbernya, sehingga dapat beradaptasi untuk beragam aplikasi. Paket ini mendukung integrasi tanpa batas ke dalam alur kerja RAG, yang melayani pengguna bisnis yang membutuhkan antarmuka yang ramah pengguna dan pengembang yang membutuhkan backend yang fleksibel untuk pemrosesan dokumen yang efisien.

    +

    Secara default, Knowledge Table menggunakan basis data Milvus untuk menyimpan dan mengambil data yang diekstrak. Hal ini memungkinkan pengguna untuk dengan mudah mencari, memfilter, dan menganalisis data menggunakan fitur-fitur canggih Milvus. Dalam tutorial ini, kami akan menunjukkan cara memulai dengan Tabel Pengetahuan dan Milvus.

    +

    Prasyarat

      +
    • Docker
    • +
    • Docker Compose
    • +
    +

    Mengkloning proyek

    $ git clone https://github.com/whyhow-ai/knowledge-table.git
    +
    +

    Menyiapkan lingkungan

    Anda akan menemukan berkas .env.example di direktori akar proyek. Salin berkas ini ke .env dan isi variabel lingkungan yang diperlukan.

    +

    Untuk Milvus, Anda harus mengatur variabel lingkungan MILVUS_DB_URI dan MILVUS_DB_TOKEN. Berikut adalah beberapa tips:

    +
    +
      +
    • Mengatur MILVUS_DB_URI sebagai berkas lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam berkas ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan MILVUS_DB_URI dan MILVUS_DB_TOKEN, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +
    +

    Selain Milvus, Anda juga harus mengatur lingkungan lain, misalnya OPENAI_API_KEY. Anda bisa mendapatkan masing-masing dari situs web masing-masing.

    +

    Memulai aplikasi

    $ docker compose up -d --build
    +
    +

    Menghentikan aplikasi

    $ docker compose down
    +
    +

    Mengakses proyek

    Frontend dapat diakses di http://localhost:3000, dan backend dapat diakses di http://localhost:8000.

    +

    + + + + +

    +

    Anda dapat bermain-main dengan UI dan mencoba dengan dokumen Anda sendiri.

    +

    Untuk penggunaan demo lebih lanjut, Anda dapat merujuk ke dokumentasi resmi Knowledge Table.

    diff --git a/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.json b/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.json new file mode 100644 index 000000000..6abeff542 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["# optional (setup env)\nconda create -n kotaemon python=3.10\nconda activate kotaemon\n\ngit clone https://github.com/Cinnamon/kotaemon\ncd kotaemon\n\npip install -e \"libs/kotaemon[all]\"\npip install -e \"libs/ktem\"\n","\"__type__\": \"kotaemon.storages.MilvusVectorStore\"\n","python app.py\n"],"headingContent":"Kotaemon RAG with Milvus","anchorList":[{"label":"Kotaemon RAG dengan Milvus","href":"Kotaemon-RAG-with-Milvus","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Memulai RAG dengan kotaemon","href":"Start-RAG-with-kotaemon","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.md b/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.md new file mode 100644 index 000000000..c4c26c519 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/kotaemon_with_milvus.md @@ -0,0 +1,99 @@ +--- +id: kotaemon_with_milvus.md +summary: >- + Tutorial ini akan memandu Anda tentang cara menyesuaikan aplikasi kotaemon + Anda menggunakan Milvus. +title: Kotaemon RAG dengan Milvus +--- +

    Kotaemon RAG dengan Milvus

    Kotaemon adalah UI RAG yang bersih dan dapat disesuaikan dari sumber terbuka untuk mengobrol dengan dokumen Anda. Dibangun dengan mempertimbangkan pengguna akhir dan pengembang.

    +

    Kotaemon menyediakan web-UI QA dokumen multi-pengguna yang dapat disesuaikan dan mendukung LLM lokal dan berbasis API. Menawarkan pipeline RAG hibrida dengan pengambilan teks dan vektor lengkap, QA multi-modal untuk dokumen dengan gambar dan tabel, dan kutipan tingkat lanjut dengan pratinjau dokumen. Ini mendukung metode penalaran yang kompleks seperti ReAct dan ReWOO, dan menyediakan pengaturan yang dapat dikonfigurasi untuk pengambilan dan pembuatan.

    +

    Tutorial ini akan memandu Anda tentang cara menyesuaikan aplikasi kotaemon Anda menggunakan Milvus.

    +

    Prasyarat

    Instalasi

    Kami merekomendasikan untuk menginstal kotaemon dengan cara ini:

    +
    # optional (setup env)
    +conda create -n kotaemon python=3.10
    +conda activate kotaemon
    +
    +git clone https://github.com/Cinnamon/kotaemon
    +cd kotaemon
    +
    +pip install -e "libs/kotaemon[all]"
    +pip install -e "libs/ktem"
    +
    +

    Selain cara ini, ada beberapa cara lain untuk menginstal kotaemon. Anda dapat merujuk pada dokumentasi resmi untuk informasi lebih lanjut.

    +

    Mengatur Milvus sebagai penyimpanan vektor default

    Untuk mengubah penyimpanan vektor default menjadi Milvus, Anda harus memodifikasi berkas flowsettings.py dengan mengganti KH_VECTORSTORE:

    +
    "__type__": "kotaemon.storages.MilvusVectorStore"
    +
    +

    Mengatur Variabel Lingkungan

    Anda dapat mengonfigurasi model melalui file .env dengan informasi yang dibutuhkan untuk terhubung ke LLM dan model penyematan. misalnya OpenAI, Azure, Ollama, dll.

    +

    Jalankan Kotaemon

    Setelah mengatur variabel lingkungan dan mengubah penyimpanan vektor, Anda dapat menjalankan kotaemon dengan menjalankan perintah berikut:

    +
    python app.py
    +
    +

    Nama pengguna / kata sandi default adalah: admin / admin

    +

    Memulai RAG dengan kotaemon

    1. Menambahkan model AI Anda

    + + + + +

    +

    Pada tab Resources, Anda dapat menambahkan dan mengatur LLM dan model penyematan. Anda dapat menambahkan beberapa model dan mengaturnya sebagai aktif atau tidak aktif. Anda hanya perlu menyediakan setidaknya satu model. Anda juga dapat menyediakan beberapa model untuk memungkinkan peralihan di antara mereka.

    +

    2. Unggah dokumen Anda

    + + + + +

    +

    Untuk melakukan QA pada dokumen Anda, Anda perlu mengunggahnya ke aplikasi terlebih dahulu. Buka tab File Index, dan Anda dapat mengunggah dan mengelola dokumen khusus Anda.

    +

    Secara default, semua data aplikasi disimpan di folder ./ktem_app_data. Data basis data Milvus disimpan di ./ktem_app_data/user_data/vectorstore. Anda dapat mencadangkan atau menyalin folder ini untuk memindahkan instalasi Anda ke mesin yang baru.

    +

    3. Mengobrol dengan dokumen Anda

    + + + + +

    +

    Sekarang arahkan kembali ke tab Chat. Tab Obrolan terdiri dari 3 wilayah: Panel Pengaturan Percakapan, tempat Anda mengelola percakapan dan referensi file; Panel Obrolan untuk berinteraksi dengan chatbot; dan Panel Informasi, yang menampilkan bukti pendukung, skor kepercayaan, dan peringkat relevansi untuk jawaban.

    +

    Anda dapat memilih dokumen Anda di Panel Pengaturan Percakapan. Kemudian mulai saja RAG dengan dokumen Anda dengan mengetik pesan di kotak input dan kirimkan ke chatbot.

    +

    Jika Anda ingin mendalami cara menggunakan kotaemon, Anda bisa mendapatkan panduan lengkapnya dari dokumentasi resmi.

    diff --git a/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.json b/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.json new file mode 100644 index 000000000..2d8fa1178 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.json @@ -0,0 +1 @@ +{"codeList":["%pip install -qU langchain_milvus\n","import EmbeddingTabs from \"@theme/EmbeddingTabs\";\n\n\n","# | output: false\n# | echo: false\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-large\")\n","from langchain_milvus import Milvus\n\n# The easiest way is to use Milvus Lite where everything is stored in a local file.\n# If you have a Milvus server you can use the server URI such as \"http://localhost:19530\".\nURI = \"./milvus_example.db\"\n\nvector_store = Milvus(\n embedding_function=embeddings,\n connection_args={\"uri\": URI},\n)\n","from langchain_core.documents import Document\n\nvector_store_saved = Milvus.from_documents(\n [Document(page_content=\"foo!\")],\n embeddings,\n collection_name=\"langchain_example\",\n connection_args={\"uri\": URI},\n)\n","vector_store_loaded = Milvus(\n embeddings,\n connection_args={\"uri\": URI},\n collection_name=\"langchain_example\",\n)\n","from uuid import uuid4\n\nfrom langchain_core.documents import Document\n\ndocument_1 = Document(\n page_content=\"I had chocalate chip pancakes and scrambled eggs for breakfast this morning.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_2 = Document(\n page_content=\"The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_3 = Document(\n page_content=\"Building an exciting new project with LangChain - come check it out!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_4 = Document(\n page_content=\"Robbers broke into the city bank and stole $1 million in cash.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_5 = Document(\n page_content=\"Wow! That was an amazing movie. I can't wait to see it again.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_6 = Document(\n page_content=\"Is the new iPhone worth the price? Read this review to find out.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_7 = Document(\n page_content=\"The top 10 soccer players in the world right now.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_8 = Document(\n page_content=\"LangGraph is the best framework for building stateful, agentic applications!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_9 = Document(\n page_content=\"The stock market is down 500 points today due to fears of a recession.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_10 = Document(\n page_content=\"I have a bad feeling I am going to get deleted :(\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocuments = [\n document_1,\n document_2,\n document_3,\n document_4,\n document_5,\n document_6,\n document_7,\n document_8,\n document_9,\n document_10,\n]\nuuids = [str(uuid4()) for _ in range(len(documents))]\n\nvector_store.add_documents(documents=documents, ids=uuids)\n","vector_store.delete(ids=[uuids[-1]])\n","results = vector_store.similarity_search(\n \"LangChain provides abstractions to make working with LLMs easy\",\n k=2,\n filter={\"source\": \"tweet\"},\n)\nfor res in results:\n print(f\"* {res.page_content} [{res.metadata}]\")\n","results = vector_store.similarity_search_with_score(\n \"Will it be hot tomorrow?\", k=1, filter={\"source\": \"news\"}\n)\nfor res, score in results:\n print(f\"* [SIM={score:3f}] {res.page_content} [{res.metadata}]\")\n","retriever = vector_store.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1})\nretriever.invoke(\"Stealing from the bank is a crime\", filter={\"source\": \"news\"})\n","from langchain_core.documents import Document\n\ndocs = [\n Document(page_content=\"i worked at kensho\", metadata={\"namespace\": \"harrison\"}),\n Document(page_content=\"i worked at facebook\", metadata={\"namespace\": \"ankush\"}),\n]\nvectorstore = Milvus.from_documents(\n docs,\n embeddings,\n connection_args={\"uri\": URI},\n drop_old=True,\n partition_key_field=\"namespace\", # Use the \"namespace\" field as the partition key\n)\n","# This will only get documents for Ankush\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"ankush\"'}).invoke(\n \"where did i work?\"\n)\n","# This will only get documents for Harrison\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"harrison\"'}).invoke(\n \"where did i work?\"\n)\n"],"headingContent":"Use Milvus as a Vector Store","anchorList":[{"label":"Menggunakan Milvus sebagai Penyimpan Vektor","href":"Use-Milvus-as-a-Vector-Store","type":1,"isActive":false},{"label":"Penyiapan","href":"Setup","type":2,"isActive":false},{"label":"Inisialisasi","href":"Initialization","type":2,"isActive":false},{"label":"Mengelola penyimpanan vektor","href":"Manage-vector-store","type":2,"isActive":false},{"label":"Menanyakan penyimpanan vektor","href":"Query-vector-store","type":2,"isActive":false},{"label":"Penggunaan untuk pembuatan yang ditambah dengan pengambilan","href":"Usage-for-retrieval-augmented-generation","type":2,"isActive":false},{"label":"Referensi API","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.md b/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.md new file mode 100644 index 000000000..2a7f7f5eb --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/basic_usage_langchain.md @@ -0,0 +1,321 @@ +--- +id: basic_usage_langchain.md +summary: >- + Buku catatan ini menunjukkan cara menggunakan fungsionalitas yang terkait + dengan database vektor Milvus. +title: Menggunakan Milvus sebagai Penyimpan Vektor +--- +

    Menggunakan Milvus sebagai Penyimpan Vektor

    +

    Milvus adalah basis data yang menyimpan, mengindeks, dan mengelola vektor penyematan masif yang dihasilkan oleh jaringan syaraf tiruan dan model pembelajaran mesin (ML) lainnya.

    +
    +

    Buku catatan ini menunjukkan cara menggunakan fungsionalitas yang terkait dengan basis data vektor Milvus.

    +

    Penyiapan

    Anda harus menginstal langchain-milvus dengan pip install -qU langchain-milvus untuk menggunakan integrasi ini.

    +
    %pip install -qU  langchain_milvus
    +
    +

    Versi terbaru dari pymilvus dilengkapi dengan database vektor lokal Milvus Lite, yang bagus untuk pembuatan prototipe. Jika Anda memiliki data berskala besar seperti lebih dari satu juta dokumen, kami sarankan untuk menyiapkan server Milvus yang lebih berkinerja tinggi pada docker atau kubernetes.

    +

    Kredensial

    Tidak ada kredensial yang diperlukan untuk menggunakan Milvus vektor store.

    +

    Inisialisasi

    import EmbeddingTabs from "@theme/EmbeddingTabs";
    +
    +<EmbeddingTabs/>
    +
    +
    # | output: false
    +# | echo: false
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
    +
    +
    from langchain_milvus import Milvus
    +
    +# The easiest way is to use Milvus Lite where everything is stored in a local file.
    +# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
    +URI = "./milvus_example.db"
    +
    +vector_store = Milvus(
    +    embedding_function=embeddings,
    +    connection_args={"uri": URI},
    +)
    +
    +

    Mengelompokkan data dengan Koleksi Milvus

    Anda dapat menyimpan dokumen yang berbeda yang tidak terkait dalam koleksi yang berbeda dalam instans Milvus yang sama untuk mempertahankan konteksnya

    +

    Berikut adalah cara membuat koleksi baru

    +
    from langchain_core.documents import Document
    +
    +vector_store_saved = Milvus.from_documents(
    +    [Document(page_content="foo!")],
    +    embeddings,
    +    collection_name="langchain_example",
    +    connection_args={"uri": URI},
    +)
    +
    +

    Dan berikut ini adalah cara Anda mengambil koleksi yang tersimpan

    +
    vector_store_loaded = Milvus(
    +    embeddings,
    +    connection_args={"uri": URI},
    +    collection_name="langchain_example",
    +)
    +
    +

    Mengelola penyimpanan vektor

    Setelah Anda membuat penyimpanan vektor, kita dapat berinteraksi dengannya dengan menambahkan dan menghapus item yang berbeda.

    +

    Menambahkan item ke penyimpanan vektor

    Kita dapat menambahkan item ke penyimpanan vektor dengan menggunakan fungsi add_documents.

    +
    from uuid import uuid4
    +
    +from langchain_core.documents import Document
    +
    +document_1 = Document(
    +    page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_2 = Document(
    +    page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
    +    metadata={"source": "news"},
    +)
    +
    +document_3 = Document(
    +    page_content="Building an exciting new project with LangChain - come check it out!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_4 = Document(
    +    page_content="Robbers broke into the city bank and stole $1 million in cash.",
    +    metadata={"source": "news"},
    +)
    +
    +document_5 = Document(
    +    page_content="Wow! That was an amazing movie. I can't wait to see it again.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_6 = Document(
    +    page_content="Is the new iPhone worth the price? Read this review to find out.",
    +    metadata={"source": "website"},
    +)
    +
    +document_7 = Document(
    +    page_content="The top 10 soccer players in the world right now.",
    +    metadata={"source": "website"},
    +)
    +
    +document_8 = Document(
    +    page_content="LangGraph is the best framework for building stateful, agentic applications!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_9 = Document(
    +    page_content="The stock market is down 500 points today due to fears of a recession.",
    +    metadata={"source": "news"},
    +)
    +
    +document_10 = Document(
    +    page_content="I have a bad feeling I am going to get deleted :(",
    +    metadata={"source": "tweet"},
    +)
    +
    +documents = [
    +    document_1,
    +    document_2,
    +    document_3,
    +    document_4,
    +    document_5,
    +    document_6,
    +    document_7,
    +    document_8,
    +    document_9,
    +    document_10,
    +]
    +uuids = [str(uuid4()) for _ in range(len(documents))]
    +
    +vector_store.add_documents(documents=documents, ids=uuids)
    +
    +
    ['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
    + 'fa642726-5329-4495-a072-187e948dd71f',
    + '9905001c-a4a3-455e-ab94-72d0ed11b476',
    + 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
    + '7508f7ff-c0c9-49ea-8189-634f8a0244d8',
    + '2e179609-3ff7-4c6a-9e05-08978903fe26',
    + 'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
    + '1206d237-ee3a-484f-baf2-b5ac38eeb314',
    + 'd43cbf9a-a772-4c40-993b-9439065fec01',
    + '25e667bb-6f09-4574-a368-661069301906']
    +
    +

    Menghapus item dari penyimpanan vektor

    vector_store.delete(ids=[uuids[-1]])
    +
    +
    (insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
    +
    +

    Menanyakan penyimpanan vektor

    Setelah penyimpanan vektor anda dibuat dan dokumen-dokumen yang relevan telah ditambahkan, kemungkinan besar anda ingin menanyakannya selama menjalankan rantai atau agen anda.

    +

    Menanyakan secara langsung

    Melakukan pencarian kemiripan sederhana dengan pemfilteran pada metadata dapat dilakukan sebagai berikut:

    +
    results = vector_store.similarity_search(
    +    "LangChain provides abstractions to make working with LLMs easy",
    +    k=2,
    +    filter={"source": "tweet"},
    +)
    +for res in results:
    +    print(f"* {res.page_content} [{res.metadata}]")
    +
    +
    * Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
    +* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
    +
    +

    Pencarian kemiripan dengan skor

    Anda juga dapat mencari dengan skor:

    +
    results = vector_store.similarity_search_with_score(
    +    "Will it be hot tomorrow?", k=1, filter={"source": "news"}
    +)
    +for res, score in results:
    +    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
    +
    +
    * [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
    +
    +

    Untuk daftar lengkap semua opsi pencarian yang tersedia saat menggunakan penyimpanan vektor Milvus, Anda dapat mengunjungi referensi API.

    +

    Kueri dengan mengubah menjadi retriever

    Anda juga dapat mengubah penyimpanan vektor menjadi retriever untuk penggunaan yang lebih mudah di dalam rantai Anda.

    +
    retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
    +retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
    +
    +
    [Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
    +
    +

    Penggunaan untuk pembuatan yang ditambah dengan pengambilan

    Untuk panduan tentang cara menggunakan penyimpanan vektor ini untuk pembuatan retrieval-augmented (RAG), lihat bagian berikut:

    + +

    Pengambilan Per-Pengguna

    Ketika membuat aplikasi pengambilan, Anda sering kali harus membuatnya dengan mempertimbangkan banyak pengguna. Ini berarti bahwa Anda mungkin menyimpan data tidak hanya untuk satu pengguna, tetapi untuk banyak pengguna yang berbeda, dan mereka seharusnya tidak dapat melihat data satu sama lain.

    +

    Milvus merekomendasikan penggunaan partition_key untuk mengimplementasikan multi-tenancy, berikut ini contohnya.

    +
    +

    Fitur Partition key saat ini tidak tersedia di Milvus Lite, jika Anda ingin menggunakannya, Anda harus memulai server Milvus dari docker atau kubernetes.

    +
    +
    from langchain_core.documents import Document
    +
    +docs = [
    +    Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
    +    Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
    +]
    +vectorstore = Milvus.from_documents(
    +    docs,
    +    embeddings,
    +    connection_args={"uri": URI},
    +    drop_old=True,
    +    partition_key_field="namespace",  # Use the "namespace" field as the partition key
    +)
    +
    +

    Untuk melakukan pencarian menggunakan kunci partisi, Anda harus menyertakan salah satu dari yang berikut ini dalam ekspresi boolean permintaan pencarian:

    +

    search_kwargs={"expr": '<partition_key> == "xxxx"'}

    +

    search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

    +

    Ganti <partition_key> dengan nama bidang yang ditunjuk sebagai kunci partisi.

    +

    Milvus mengubah partisi berdasarkan kunci partisi yang ditentukan, memfilter entitas berdasarkan kunci partisi, dan mencari di antara entitas yang difilter.

    +
    # This will only get documents for Ankush
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
    +
    +
    # This will only get documents for Harrison
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
    +
    +

    Referensi API

    Untuk dokumentasi rinci dari semua fitur dan konfigurasi __ModuleName__VectorStore, kunjungi referensi API: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html

    diff --git a/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.json b/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.json new file mode 100644 index 000000000..cdcfb2345 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import bs4\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\n\n# Create a WebBaseLoader instance to load documents from web sources\nloader = WebBaseLoader(\n web_paths=(\n \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n \"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/\",\n ),\n bs_kwargs=dict(\n parse_only=bs4.SoupStrainer(\n class_=(\"post-content\", \"post-title\", \"post-header\")\n )\n ),\n)\n# Load documents from web sources using the loader\ndocuments = loader.load()\n# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks\ntext_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)\n\n# Split the documents into chunks using the text_splitter\ndocs = text_splitter.split_documents(documents)\n\n# Let's take a look at the first document\ndocs[1]\n","from langchain_milvus import Milvus, Zilliz\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings()\n\nvectorstore = Milvus.from_documents( # or Zilliz.from_documents\n documents=docs,\n embedding=embeddings,\n connection_args={\n \"uri\": \"./milvus_demo.db\",\n },\n drop_old=True, # Drop the old Milvus collection if it exists\n)\n","query = \"What is self-reflection of an AI Agent?\"\nvectorstore.similarity_search(query, k=1)\n","from langchain_core.runnables import RunnablePassthrough\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_openai import ChatOpenAI\n\n# Initialize the OpenAI language model for response generation\nllm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n\n# Define the prompt template for generating AI responses\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n\n{context}\n\n\n\n{question}\n\n\nThe response should be specific and use statistics or numbers when possible.\n\nAssistant:\"\"\"\n\n# Create a PromptTemplate instance with the defined template and input variables\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n# Convert the vector store to a retriever\nretriever = vectorstore.as_retriever()\n\n\n# Define a function to format the retrieved documents\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","# Define the RAG (Retrieval-Augmented Generation) chain for AI response generation\nrag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n\n# rag_chain.get_graph().print_ascii()\n\n# Invoke the RAG chain with a specific question and retrieve the response\nres = rag_chain.invoke(query)\nres\n","vectorstore.similarity_search(\n \"What is CoT?\",\n k=1,\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n)\n\n# The same as:\n# vectorstore.as_retriever(search_kwargs=dict(\n# k=1,\n# expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n# )).invoke(\"What is CoT?\")\n","from langchain_core.runnables import ConfigurableField\n\n# Define a new retriever with a configurable field for search_kwargs\nretriever2 = vectorstore.as_retriever().configurable_fields(\n search_kwargs=ConfigurableField(\n id=\"retriever_search_kwargs\",\n )\n)\n\n# Invoke the retriever with a specific search_kwargs which filter the documents by source\nretriever2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n k=1,\n )\n }\n).invoke(query)\n","# Define a new RAG chain with this dynamically configurable retriever\nrag_chain2 = (\n {\"context\": retriever2 | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","# Invoke this RAG chain with a specific question and config\nrag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n )\n }\n).invoke(query)\n","rag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'\",\n )\n }\n).invoke(query)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LangChain","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) dengan Milvus dan LangChain","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LangChain","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menyiapkan data","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Membangun rantai RAG dengan Milvus Vector Store","href":"Build-RAG-chain-with-Milvus-Vector-Store","type":2,"isActive":false},{"label":"Pemfilteran metadata","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.md b/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.md new file mode 100644 index 000000000..057e53133 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/integrate_with_langchain.md @@ -0,0 +1,283 @@ +--- +id: integrate_with_langchain.md +summary: >- + Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented + Generation (RAG) menggunakan LangChain dan Milvus. +title: Retrieval-Augmented Generation (RAG) dengan Milvus dan LangChain +--- +

    Retrieval-Augmented Generation (RAG) dengan Milvus dan LangChain

    Open In Colab +GitHub Repository

    +

    Panduan ini mendemonstrasikan cara membangun sistem Retrieval-Augmented Generation (RAG) dengan menggunakan LangChain dan Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan perintah yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    LangChain adalah kerangka kerja untuk mengembangkan aplikasi yang didukung oleh model bahasa besar (LLM). Milvus adalah basis data vektor sumber terbuka yang paling canggih di dunia, yang dibuat untuk mendukung pencarian kemiripan dan aplikasi AI.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut:

    +
    $ pip install --upgrade --quiet  langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan model dari OpenAI. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Menyiapkan data

    Kita menggunakan Langchain WebBaseLoader untuk memuat dokumen dari sumber web dan membaginya menjadi beberapa bagian menggunakan RecursiveCharacterTextSplitter.

    +
    import bs4
    +from langchain_community.document_loaders import WebBaseLoader
    +from langchain_text_splitters import RecursiveCharacterTextSplitter
    +
    +# Create a WebBaseLoader instance to load documents from web sources
    +loader = WebBaseLoader(
    +    web_paths=(
    +        "https://lilianweng.github.io/posts/2023-06-23-agent/",
    +        "https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
    +    ),
    +    bs_kwargs=dict(
    +        parse_only=bs4.SoupStrainer(
    +            class_=("post-content", "post-title", "post-header")
    +        )
    +    ),
    +)
    +# Load documents from web sources using the loader
    +documents = loader.load()
    +# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks
    +text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
    +
    +# Split the documents into chunks using the text_splitter
    +docs = text_splitter.split_documents(documents)
    +
    +# Let's take a look at the first document
    +docs[1]
    +
    +
    Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/'})
    +
    +

    Seperti yang bisa kita lihat, dokumen sudah dipecah menjadi beberapa bagian. Dan isi datanya adalah tentang agen AI.

    +

    Membangun rantai RAG dengan Milvus Vector Store

    Kita akan menginisialisasi Milvus Vector Store dengan dokumen-dokumen tersebut, yang akan memuat dokumen-dokumen tersebut ke dalam Milvus Vector Store dan membuat sebuah indeks di bawahnya.

    +
    from langchain_milvus import Milvus, Zilliz
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings()
    +
    +vectorstore = Milvus.from_documents(  # or Zilliz.from_documents
    +    documents=docs,
    +    embedding=embeddings,
    +    connection_args={
    +        "uri": "./milvus_demo.db",
    +    },
    +    drop_old=True,  # Drop the old Milvus collection if it exists
    +)
    +
    +
    +

    Untuk connection_args:

    +
      +
    • Menetapkan uri sebagai berkas lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam berkas ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, ganti Milvus.from_documents dengan Zilliz.from_documents, dan sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Cari dokumen di penyimpanan vektor Milvus menggunakan pertanyaan kueri uji. Mari kita lihat 1 dokumen teratas.

    +
    query = "What is self-reflection of an AI Agent?"
    +vectorstore.similarity_search(query, k=1)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    from langchain_core.runnables import RunnablePassthrough
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.output_parsers import StrOutputParser
    +from langchain_openai import ChatOpenAI
    +
    +# Initialize the OpenAI language model for response generation
    +llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
    +
    +# Define the prompt template for generating AI responses
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +If you don't know the answer, just say that you don't know, don't try to make up an answer.
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +The response should be specific and use statistics or numbers when possible.
    +
    +Assistant:"""
    +
    +# Create a PromptTemplate instance with the defined template and input variables
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +# Convert the vector store to a retriever
    +retriever = vectorstore.as_retriever()
    +
    +
    +# Define a function to format the retrieved documents
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    Gunakan LCEL (LangChain Expression Language) untuk membangun rantai RAG.

    +
    # Define the RAG (Retrieval-Augmented Generation) chain for AI response generation
    +rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +# rag_chain.get_graph().print_ascii()
    +
    +# Invoke the RAG chain with a specific question and retrieve the response
    +res = rag_chain.invoke(query)
    +res
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    Selamat! Anda telah membangun sebuah rantai RAG dasar yang didukung oleh Milvus dan LangChain.

    +

    Pemfilteran metadata

    Kita dapat menggunakan Aturan Pemfilteran Skalar Milvus untuk memfilter dokumen berdasarkan metadata. Kita telah memuat dokumen dari dua sumber yang berbeda, dan kita dapat menyaring dokumen berdasarkan metadata source.

    +
    vectorstore.similarity_search(
    +    "What is CoT?",
    +    k=1,
    +    expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +)
    +
    +# The same as:
    +# vectorstore.as_retriever(search_kwargs=dict(
    +#     k=1,
    +#     expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +# )).invoke("What is CoT?")
    +
    +
    [Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555858})]
    +
    +

    Jika kita ingin mengubah parameter pencarian secara dinamis tanpa membangun ulang rantai, kita dapat mengonfigurasi internal rantai runtime. Mari kita tentukan retriever baru dengan konfigurasi dinamis ini dan menggunakannya untuk membangun rantai RAG baru.

    +
    from langchain_core.runnables import ConfigurableField
    +
    +# Define a new retriever with a configurable field for search_kwargs
    +retriever2 = vectorstore.as_retriever().configurable_fields(
    +    search_kwargs=ConfigurableField(
    +        id="retriever_search_kwargs",
    +    )
    +)
    +
    +# Invoke the retriever with a specific search_kwargs which filter the documents by source
    +retriever2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +            k=1,
    +        )
    +    }
    +).invoke(query)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    # Define a new RAG chain with this dynamically configurable retriever
    +rag_chain2 = (
    +    {"context": retriever2 | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    Mari kita coba rantai RAG yang dapat dikonfigurasi secara dinamis ini dengan kondisi filter yang berbeda.

    +
    # Invoke this RAG chain with a specific question and config
    +rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    Ketika kita mengubah kondisi pencarian untuk memfilter dokumen berdasarkan sumber kedua, karena konten sumber blog ini tidak ada hubungannya dengan pertanyaan kueri, kita mendapatkan jawaban tanpa informasi yang relevan.

    +
    rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "I'm sorry, but based on the provided context, there is no specific information or statistical data available regarding the self-reflection of an AI agent."
    +
    +
    +

    Tutorial ini memfokuskan pada penggunaan dasar integrasi Milvus LangChain dan pendekatan RAG yang sederhana. Untuk teknik RAG yang lebih lanjut, silakan lihat bootcamp rag tingkat lanjut.

    diff --git a/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.json b/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.json new file mode 100644 index 000000000..9be9b3916 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.json @@ -0,0 +1 @@ +{"codeList":["# os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass(\"Enter your LangSmith API key: \")\n# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n","%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever\nfrom langchain_milvus.utils.sparse import BM25SparseEmbedding\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom pymilvus import (\n Collection,\n CollectionSchema,\n DataType,\n FieldSchema,\n WeightedRanker,\n connections,\n)\n","CONNECTION_URI = \"http://localhost:19530\"\n","export OPENAI_API_KEY=\n","texts = [\n \"In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.\",\n \"In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.\",\n \"In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.\",\n \"In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.\",\n \"In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.\",\n \"In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.\",\n \"In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.\",\n \"In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.\",\n \"In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.\",\n \"In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.\",\n]\n","dense_embedding_func = OpenAIEmbeddings()\ndense_dim = len(dense_embedding_func.embed_query(texts[1]))\ndense_dim\n","sparse_embedding_func = BM25SparseEmbedding(corpus=texts)\nsparse_embedding_func.embed_query(texts[1])\n","connections.connect(uri=CONNECTION_URI)\n","pk_field = \"doc_id\"\ndense_field = \"dense_vector\"\nsparse_field = \"sparse_vector\"\ntext_field = \"text\"\nfields = [\n FieldSchema(\n name=pk_field,\n dtype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n ),\n FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),\n]\n","schema = CollectionSchema(fields=fields, enable_dynamic_field=False)\ncollection = Collection(\n name=\"IntroductionToTheNovels\", schema=schema, consistency_level=\"Strong\"\n)\n","dense_index = {\"index_type\": \"FLAT\", \"metric_type\": \"IP\"}\ncollection.create_index(\"dense_vector\", dense_index)\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncollection.create_index(\"sparse_vector\", sparse_index)\ncollection.flush()\n","entities = []\nfor text in texts:\n entity = {\n dense_field: dense_embedding_func.embed_documents([text])[0],\n sparse_field: sparse_embedding_func.embed_documents([text])[0],\n text_field: text,\n }\n entities.append(entity)\ncollection.insert(entities)\ncollection.load()\n","sparse_search_params = {\"metric_type\": \"IP\"}\ndense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\nretriever = MilvusCollectionHybridSearchRetriever(\n collection=collection,\n rerank=WeightedRanker(0.5, 0.5),\n anns_fields=[dense_field, sparse_field],\n field_embeddings=[dense_embedding_func, sparse_embedding_func],\n field_search_params=[dense_search_params, sparse_search_params],\n top_k=3,\n text_field=text_field,\n)\n","retriever.invoke(\"What are the story about ventures?\")\n","llm = ChatOpenAI()\n\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\n\n\n{context}\n\n\n\n{question}\n\n\nAssistant:\"\"\"\n\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n","def format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","rag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","rag_chain.invoke(\"What novels has Lila written and what are their contents?\")\n","collection.drop()\n"],"headingContent":"Milvus Hybrid Search Retriever","anchorList":[{"label":"Anjing Pelacak Hibrida Milvus","href":"Milvus-Hybrid-Search-Retriever","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Penyiapan","href":"Setup","type":2,"isActive":false},{"label":"Instansiasi","href":"Instantiation","type":2,"isActive":false},{"label":"Penggunaan","href":"Usage","type":2,"isActive":false},{"label":"Gunakan dalam sebuah rantai","href":"Use-within-a-chain","type":2,"isActive":false},{"label":"Referensi API","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.md b/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.md new file mode 100644 index 000000000..4f3625511 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/langchain/milvus_hybrid_search_retriever.md @@ -0,0 +1,310 @@ +--- +id: milvus_hybrid_search_retriever.md +summary: >- + Buku catatan ini menunjukkan cara menggunakan fungsionalitas yang terkait + dengan database vektor Milvus. +title: Anjing Pelacak Hibrida Milvus +--- +

    Anjing Pelacak Hibrida Milvus

    Gambaran Umum

    +

    Milvus adalah basis data vektor sumber terbuka yang dibuat untuk mendukung pencarian kesamaan dan aplikasi AI. Milvus membuat pencarian data yang tidak terstruktur menjadi lebih mudah diakses, dan memberikan pengalaman pengguna yang konsisten terlepas dari lingkungan penerapannya.

    +
    +

    Ini akan membantu Anda memulai dengan Milvus Hybrid Search retriever, yang menggabungkan kekuatan pencarian vektor padat dan jarang. Untuk dokumentasi terperinci tentang semua fitur dan konfigurasi MilvusCollectionHybridSearchRetriever, kunjungi referensi API.

    +

    Lihat juga dokumen Pencarian Multi-Vektor Milvus.

    +

    Detail integrasi

    + + + + + + +
    RetrieverTuan rumah mandiriPenawaran cloudPaket
    MilvusCollectionHybridSearchRetrieverlangchain_milvus
    +

    Penyiapan

    Jika Anda ingin mendapatkan penelusuran otomatis dari kueri individual, Anda juga dapat mengatur kunci API LangSmith Anda dengan mengosongkan komentar di bawah ini:

    +
    # os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
    +# os.environ["LANGSMITH_TRACING"] = "true"
    +
    +

    Instalasi

    Retriever ini berada di dalam paket langchain-milvus. Panduan ini membutuhkan dependensi berikut:

    +
    %pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
    +
    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
    +from langchain_milvus.utils.sparse import BM25SparseEmbedding
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from pymilvus import (
    +    Collection,
    +    CollectionSchema,
    +    DataType,
    +    FieldSchema,
    +    WeightedRanker,
    +    connections,
    +)
    +
    +

    Memulai layanan Milvus

    Silakan lihat dokumentasi Milvus untuk memulai layanan Milvus.

    +

    Setelah memulai milvus, Anda perlu menentukan URI koneksi milvus Anda.

    +
    CONNECTION_URI = "http://localhost:19530"
    +
    +

    Menyiapkan Kunci API OpenAI

    Silakan lihat dokumentasi OpenAI untuk mendapatkan kunci API OpenAI Anda, dan tetapkan sebagai variabel lingkungan.

    +
    export OPENAI_API_KEY=<your_api_key>
    +
    +

    Menyiapkan fungsi penyematan padat dan jarang

    Mari kita membuat fiksi 10 deskripsi novel palsu. Dalam produksi yang sebenarnya, ini mungkin merupakan data teks dalam jumlah besar.

    +
    texts = [
    +    "In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.",
    +    "In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.",
    +    "In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.",
    +    "In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.",
    +    "In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.",
    +    "In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.",
    +    "In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.",
    +    "In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.",
    +    "In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.",
    +    "In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.",
    +]
    +
    +

    Kita akan menggunakan OpenAI Embedding untuk menghasilkan vektor padat, dan algoritma BM25 untuk menghasilkan vektor jarang.

    +

    Inisialisasi fungsi penyematan padat dan dapatkan dimensi

    +
    dense_embedding_func = OpenAIEmbeddings()
    +dense_dim = len(dense_embedding_func.embed_query(texts[1]))
    +dense_dim
    +
    +
    1536
    +
    +

    Inisialisasi fungsi embedding jarang.

    +

    Perhatikan bahwa output dari sparse embedding adalah sekumpulan vektor jarang, yang merepresentasikan indeks dan bobot kata kunci dari teks input.

    +
    sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
    +sparse_embedding_func.embed_query(texts[1])
    +
    +
    {0: 0.4270424944042204,
    + 21: 1.845826690498331,
    + 22: 1.845826690498331,
    + 23: 1.845826690498331,
    + 24: 1.845826690498331,
    + 25: 1.845826690498331,
    + 26: 1.845826690498331,
    + 27: 1.2237754316221157,
    + 28: 1.845826690498331,
    + 29: 1.845826690498331,
    + 30: 1.845826690498331,
    + 31: 1.845826690498331,
    + 32: 1.845826690498331,
    + 33: 1.845826690498331,
    + 34: 1.845826690498331,
    + 35: 1.845826690498331,
    + 36: 1.845826690498331,
    + 37: 1.845826690498331,
    + 38: 1.845826690498331,
    + 39: 1.845826690498331}
    +
    +

    Membuat Koleksi Milvus dan memuat data

    Inisialisasi URI koneksi dan buat koneksi

    +
    connections.connect(uri=CONNECTION_URI)
    +
    +

    Tentukan nama field dan tipe datanya

    +
    pk_field = "doc_id"
    +dense_field = "dense_vector"
    +sparse_field = "sparse_vector"
    +text_field = "text"
    +fields = [
    +    FieldSchema(
    +        name=pk_field,
    +        dtype=DataType.VARCHAR,
    +        is_primary=True,
    +        auto_id=True,
    +        max_length=100,
    +    ),
    +    FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +    FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),
    +]
    +
    +

    Buat koleksi dengan skema yang ditentukan

    +
    schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +collection = Collection(
    +    name="IntroductionToTheNovels", schema=schema, consistency_level="Strong"
    +)
    +
    +

    Tentukan indeks untuk vektor padat dan jarang

    +
    dense_index = {"index_type": "FLAT", "metric_type": "IP"}
    +collection.create_index("dense_vector", dense_index)
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +collection.create_index("sparse_vector", sparse_index)
    +collection.flush()
    +
    +

    Masukkan entitas ke dalam koleksi dan muat koleksi

    +
    entities = []
    +for text in texts:
    +    entity = {
    +        dense_field: dense_embedding_func.embed_documents([text])[0],
    +        sparse_field: sparse_embedding_func.embed_documents([text])[0],
    +        text_field: text,
    +    }
    +    entities.append(entity)
    +collection.insert(entities)
    +collection.load()
    +
    +

    Instansiasi

    Sekarang kita dapat menginstansiasi retriever kita, mendefinisikan parameter pencarian untuk field yang jarang dan padat:

    +
    sparse_search_params = {"metric_type": "IP"}
    +dense_search_params = {"metric_type": "IP", "params": {}}
    +retriever = MilvusCollectionHybridSearchRetriever(
    +    collection=collection,
    +    rerank=WeightedRanker(0.5, 0.5),
    +    anns_fields=[dense_field, sparse_field],
    +    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    +    field_search_params=[dense_search_params, sparse_search_params],
    +    top_k=3,
    +    text_field=text_field,
    +)
    +
    +

    Dalam parameter masukan Retriever ini, kita menggunakan penyematan padat dan penyematan jarang untuk melakukan pencarian hibrida pada dua bidang dari Koleksi ini, dan menggunakan WeightedRanker untuk pemeringkatan. Akhirnya, 3 Dokumen K teratas akan dikembalikan.

    +

    Penggunaan

    retriever.invoke("What are the story about ventures?")
    +
    +
    [Document(page_content="In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.", metadata={'doc_id': '449281835035545843'}),
    + Document(page_content="In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.", metadata={'doc_id': '449281835035545845'}),
    + Document(page_content="In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.", metadata={'doc_id': '449281835035545846'})]
    +
    +

    Gunakan dalam sebuah rantai

    Inisialisasi ChatOpenAI dan tentukan templat prompt

    +
    llm = ChatOpenAI()
    +
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +Assistant:"""
    +
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +
    +

    Tentukan fungsi untuk memformat dokumen

    +
    def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    Tentukan sebuah rantai menggunakan retriever dan komponen lainnya

    +
    rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    Melakukan kueri menggunakan rantai yang ditentukan

    +
    rag_chain.invoke("What novels has Lila written and what are their contents?")
    +
    +
    "Lila Rose has written 'The Memory Thief,' which follows a charismatic thief with the ability to steal and manipulate memories as they navigate a daring heist and a web of deceit and betrayal."
    +
    +

    Membuang koleksi

    +
    collection.drop()
    +
    +

    Referensi API

    Untuk dokumentasi terperinci tentang semua fitur dan konfigurasi MilvusCollectionHybridSearchRetriever, buka referensi API.

    diff --git a/localization/v2.5.x/site/id/integrations/llama_agents_metadata.json b/localization/v2.5.x/site/id/integrations/llama_agents_metadata.json new file mode 100644 index 000000000..dae586152 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/llama_agents_metadata.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-agents pymilvus openai python-dotenv\n","$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai\n","# NOTE: This is ONLY necessary in jupyter notebook.\n# Details: Jupyter runs an event-loop behind the scenes.\n# This results in nested event-loops when we start an event-loop to make async queries.\n# This is normally not allowed, we use nest_asyncio to allow it for convenience.\nimport nest_asyncio\n\nnest_asyncio.apply()\n","\"\"\"\nload_dotenv reads key-value pairs from a .env file and can set them as environment variables.\nThis is useful to avoid leaking your API key for example :D\n\"\"\"\n\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n","$ mkdir -p 'data/10k/'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'\n","from llama_index.core import Settings\nfrom llama_index.embeddings.mistralai import MistralAIEmbedding\n\n# Define the default Embedding model used in this Notebook.\n# We are using Mistral Models, so we are also using Mistral Embeddings\n\nSettings.embed_model = MistralAIEmbedding(model_name=\"mistral-embed\")\n","from llama_index.llms.ollama import Ollama\n\nSettings.llm = Ollama(\"mistral-nemo\")\n","from llama_index.vector_stores.milvus import MilvusVectorStore\nfrom llama_index.core import (\n SimpleDirectoryReader,\n VectorStoreIndex,\n StorageContext,\n load_index_from_storage,\n)\nfrom llama_index.core.tools import QueryEngineTool, ToolMetadata\n\ninput_files = [\"./data/10k/lyft_2021.pdf\", \"./data/10k/uber_2021.pdf\"]\n\n# Create a single Milvus vector store\nvector_store = MilvusVectorStore(\n uri=\"./milvus_demo.db\", dim=1024, overwrite=False, collection_name=\"companies_docs\"\n)\n\n# Create a storage context with the Milvus vector store\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\n# Load data\ndocs = SimpleDirectoryReader(input_files=input_files).load_data()\n\n# Build index\nindex = VectorStoreIndex.from_documents(docs, storage_context=storage_context)\n\n# Define the query engine\ncompany_engine = index.as_query_engine(similarity_top_k=3)\n","# Define the different tools that can be used by our Agent.\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"lyft_10k\",\n description=(\n \"Provides information about Lyft financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"uber_10k\",\n description=(\n \"Provides information about Uber financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","from llama_index.llms.ollama import Ollama\nfrom llama_index.llms.mistralai import MistralAI\n\n# Set up the agent\nllm = Ollama(model=\"mistral-nemo\")\n\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"Could you please provide a comparison between Lyft and Uber's total revenues in 2021?\",\n allow_parallel_tool_calls=True,\n)\n\n# Example usage without metadata filtering\nprint(\"Response without metadata filtering:\")\nprint(response)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Example usage with metadata filtering\nfilters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"lyft_2021.pdf\")]\n)\n\nprint(f\"filters: {filters}\")\nfiltered_query_engine = index.as_query_engine(filters=filters)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Use this tool to retrieve specific data points about a company. \"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","# Set up the LLM we will use for Function Calling\n\nllm = Ollama(model=\"mistral-nemo\")\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"How many employees does Uber have?\",\n allow_parallel_tool_calls=True,\n)\nprint(response)\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"What are the risk factors for Lyft?\",\n allow_parallel_tool_calls=True,\n)\n\nprint(response)\n","> Question: What are the risk factors for Uber?\n\n> Response without metadata filtering:\nBased on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:\n\n- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.\n- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.\n- Risks related to attracting and retaining qualified drivers and riders.\n","from llama_index.core.prompts.base import PromptTemplate\n\n\n# Function to create a filtered query engine\ndef create_query_engine(question):\n # Extract metadata filters from question using a language model\n prompt_template = PromptTemplate(\n \"Given the following question, extract relevant metadata filters.\\n\"\n \"Consider company names, years, and any other relevant attributes.\\n\"\n \"Don't write any other text, just the MetadataFilters object\"\n \"Format it by creating a MetadataFilters like shown in the following\\n\"\n \"MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\\n\"\n \"If no specific filters are mentioned, returns an empty MetadataFilters()\\n\"\n \"Question: {question}\\n\"\n \"Metadata Filters:\\n\"\n )\n\n prompt = prompt_template.format(question=question)\n llm = Ollama(model=\"mistral-nemo\")\n response = llm.complete(prompt)\n\n metadata_filters_str = response.text.strip()\n if metadata_filters_str:\n metadata_filters = eval(metadata_filters_str)\n print(f\"eval: {metadata_filters}\")\n return index.as_query_engine(filters=metadata_filters)\n return index.as_query_engine()\n","response = create_query_engine(\n \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\n)\n","## Example usage with metadata filtering\nquestion = \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\nfiltered_query_engine = create_query_engine(question)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs_filtering\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n ),\n ),\n ),\n]\n# Set up the agent with the updated query engine tools\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=question,\n allow_parallel_tool_calls=True,\n)\n\nprint(\"Response with metadata filtering:\")\nprint(response)\n","from llama_agents import (\n AgentService,\n ToolService,\n LocalLauncher,\n MetaServiceTool,\n ControlPlaneServer,\n SimpleMessageQueue,\n AgentOrchestrator,\n)\n\nfrom llama_index.core.agent import FunctionCallingAgentWorker\nfrom llama_index.llms.mistralai import MistralAI\n\n# create our multi-agent framework components\nmessage_queue = SimpleMessageQueue()\ncontrol_plane = ControlPlaneServer(\n message_queue=message_queue,\n orchestrator=AgentOrchestrator(llm=MistralAI(\"mistral-large-latest\")),\n)\n\n# define Tool Service\ntool_service = ToolService(\n message_queue=message_queue,\n tools=query_engine_tools,\n running=True,\n step_interval=0.5,\n)\n\n# define meta-tools here\nmeta_tools = [\n await MetaServiceTool.from_tool_service(\n t.metadata.name,\n message_queue=message_queue,\n tool_service=tool_service,\n )\n for t in query_engine_tools\n]\n\n# define Agent and agent service\nworker1 = FunctionCallingAgentWorker.from_tools(\n meta_tools, llm=MistralAI(\"mistral-large-latest\")\n)\n\nagent1 = worker1.as_agent()\nagent_server_1 = AgentService(\n agent=agent1,\n message_queue=message_queue,\n description=\"Used to answer questions over differnet companies for their Financial results\",\n service_name=\"Companies_analyst_agent\",\n)\n","import logging\n\n# change logging level to enable or disable more verbose logging\nlogging.getLogger(\"llama_agents\").setLevel(logging.INFO)\n","## Define Launcher\nlauncher = LocalLauncher(\n [agent_server_1, tool_service],\n control_plane,\n message_queue,\n)\n","query_str = \"What are the risk factors for Uber?\"\nresult = launcher.launch_single(query_str)\n","print(result)\n"],"headingContent":"Multi-agent Systems with Mistral AI, Milvus and Llama-agents","anchorList":[{"label":"Sistem Multi-agen dengan Mistral AI, Milvus, dan Llama-agen","href":"Multi-agent-Systems-with-Mistral-AI-Milvus-and-Llama-agents","type":1,"isActive":false},{"label":"Tujuan dari Buku Catatan ini","href":"Goal-of-this-Notebook","type":2,"isActive":false},{"label":"Milvus","href":"Milvus","type":2,"isActive":false},{"label":"llama-agents","href":"llama-agents","type":2,"isActive":false},{"label":"llama-index","href":"llama-index","type":2,"isActive":false},{"label":"Mistral AI","href":"Mistral-AI","type":2,"isActive":false},{"label":"Menginstal Ketergantungan","href":"Install-Dependencies","type":2,"isActive":false},{"label":"Dapatkan Kunci API Anda untuk Mistral","href":"Get-your-API-Key-for-Mistral","type":2,"isActive":false},{"label":"Unduh data","href":"Download-data","type":2,"isActive":false},{"label":"Menyiapkan Model Penyematan","href":"Prepare-Embedding-Model","type":1,"isActive":false},{"label":"Menentukan Model LLM","href":"Define-the-LLM-Model","type":2,"isActive":false},{"label":"Menginstal Milvus dan Memuat Data","href":"Instanciate-Milvus-and-Load-Data","type":2,"isActive":false},{"label":"Tentukan Alat","href":"Define-Tools","type":2,"isActive":false},{"label":"Pemfilteran Metadata","href":"Metadata-Filtering","type":2,"isActive":false},{"label":"Kasus Penggunaan untuk Pemfilteran Metadata","href":"Use-Cases-for-Metadata-Filtering","type":2,"isActive":false},{"label":"Contoh penggunaan","href":"Example-usage","type":2,"isActive":false},{"label":"Pemanggilan Fungsi","href":"Function-Calling","type":2,"isActive":false},{"label":"Berinteraksi dengan Agen","href":"Interact-with-the-Agent","type":2,"isActive":false},{"label":"Contoh Kebingungan Tanpa Pemfilteran Metadata","href":"Example-of-Confusion-Without-Metadata-Filtering","type":2,"isActive":false},{"label":"Menggunakan Agen untuk Mengekstrak Filter Metadata","href":"Using-an-Agent-to-Extract-Metadata-Filters","type":2,"isActive":false},{"label":"Contoh Kode","href":"Code-Example","type":2,"isActive":false},{"label":"Mengatur berbagai layanan dengan Mistral Large","href":"Orchestrating-the-different-services-with-Mistral-Large","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/llama_agents_metadata.md b/localization/v2.5.x/site/id/integrations/llama_agents_metadata.md new file mode 100644 index 000000000..c4c318f42 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/llama_agents_metadata.md @@ -0,0 +1,784 @@ +--- +id: llama_agents_metadata.md +summary: >- + Dalam buku catatan ini, kita akan mengeksplorasi berbagai ide: Menyimpan data + ke dalam Milvus, menggunakan llama-index dengan model Mistral untuk kueri + data, membuat agen pencarian dan pembacaan data otomatis, dan mengembangkan + agen untuk penyaringan metadata berdasarkan kueri pengguna. +title: 'Sistem Multi-agen dengan Mistral AI, Milvus, dan Llama-agen' +--- +

    Sistem Multi-agen dengan Mistral AI, Milvus, dan Llama-agen

    Tujuan dari Buku Catatan ini

    Dalam buku catatan ini, kita akan mengeksplorasi berbagai ide:

    +
      +
    • 1️⃣ Menyimpan Data ke dalam Milvus: Belajar menyimpan data ke dalam Milvus, sebuah basis data vektor yang efisien yang didesain untuk pencarian kemiripan berkecepatan tinggi dan aplikasi AI.

    • +
    • 2️⃣ Menggunakan llama-index dengan Model Mistral untuk Kueri Data: Temukan cara menggunakan llama-index yang dikombinasikan dengan model Mistral untuk melakukan kueri data yang tersimpan di Milvus.

    • +
    • 3️⃣ Membuat Agen Pencarian dan Pembacaan Data Otomatis: Buat agen yang dapat secara otomatis mencari dan membaca data berdasarkan permintaan pengguna. Agen otomatis ini akan meningkatkan pengalaman pengguna dengan memberikan respons yang cepat dan akurat, sehingga mengurangi upaya pencarian manual.

    • +
    • 4️⃣ Mengembangkan Agen untuk Pemfilteran Metadata Berdasarkan Kueri Pengguna: Menerapkan agen yang dapat secara otomatis menghasilkan filter metadata dari kueri pengguna, menyempurnakan dan mengontekstualisasikan hasil pencarian, menghindari kebingungan, serta meningkatkan keakuratan informasi yang diambil, bahkan untuk kueri yang rumit.

    • +
    • Rangkuman Pada akhir buku catatan ini, Anda akan memiliki pemahaman yang komprehensif dalam menggunakan Milvus, llama-index dengan llama-agents, dan model Mistral untuk membangun sistem pencarian data yang tangguh dan efisien.

    • +
    +

    Milvus

    Milvus adalah basis data vektor sumber terbuka yang mendukung aplikasi AI dengan penyematan vektor dan pencarian kemiripan.

    +

    Dalam buku catatan ini, kami menggunakan Milvus Lite, yaitu versi ringan dari Milvus.

    +

    Dengan Milvus Lite, Anda dapat mulai membangun aplikasi AI dengan pencarian kemiripan vektor dalam hitungan menit! Milvus Lite bagus untuk dijalankan di lingkungan berikut ini:

    +
      +
    • Notebook Jupyter / Google Colab
    • +
    • Laptop
    • +
    • Perangkat Tepi
    • +
    +

    + + image.png + image.png

    +

    llama-agents

    llama-agents memungkinkan untuk menjalankan agen sebagai layanan mikro. Hal ini memungkinkan untuk meningkatkan dan menurunkan skala layanan.

    +

    llama-index

    LlamaIndex adalah kerangka kerja data untuk aplikasi LLM Anda. Ini menyediakan alat seperti:

    +
      +
    • Konektor data menelan data yang ada dari sumber dan format aslinya.
    • +
    • Indeks data menyusun data Anda dalam representasi perantara yang mudah dan berkinerja baik untuk dikonsumsi oleh LLM.
    • +
    • Mesin menyediakan akses bahasa alami ke data Anda.
    • +
    • Agen adalah pekerja pengetahuan yang didukung LLM yang dilengkapi dengan alat bantu, mulai dari fungsi pembantu sederhana hingga integrasi API dan banyak lagi.
    • +
    +

    + + image.png + image.png

    +

    Mistral AI

    Mistral AI adalah laboratorium penelitian yang membangun LLM dan Model Embeddings, mereka baru-baru ini merilis versi baru dari model mereka, Mistral Nemo dan Mistral Large yang telah terbukti sangat baik dalam pemanggilan RAG dan fungsi. Oleh karena itu, kami akan menggunakannya di notebook ini

    +

    Menginstal Ketergantungan

    $ pip install llama-agents pymilvus openai python-dotenv
    +
    +
    $ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai
    +
    +
    # NOTE: This is ONLY necessary in jupyter notebook.
    +# Details: Jupyter runs an event-loop behind the scenes.
    +#          This results in nested event-loops when we start an event-loop to make async queries.
    +#          This is normally not allowed, we use nest_asyncio to allow it for convenience.
    +import nest_asyncio
    +
    +nest_asyncio.apply()
    +
    +

    Dapatkan Kunci API Anda untuk Mistral

    Anda bisa mendapatkan kunci API Mistral dari Mistral Cloud Console.

    +
    """
    +load_dotenv reads key-value pairs from a .env file and can set them as environment variables.
    +This is useful to avoid leaking your API key for example :D
    +"""
    +
    +from dotenv import load_dotenv
    +import os
    +
    +load_dotenv()
    +
    +
    True
    +
    +

    Unduh data

    $ mkdir -p 'data/10k/'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
    +
    +

    Menyiapkan Model Penyematan

    Kami mendefinisikan Model Embedding yang akan digunakan dalam buku catatan ini. Kami menggunakan mistral-embed, ini adalah model Embedding yang dikembangkan oleh Mistral, telah dilatih dengan mempertimbangkan Retrieval, yang membuatnya sangat bagus untuk sistem Agentic RAG kami. Untuk detailnya, silakan lihat halaman Embedding di Dokumentasi Mistral.

    +
    from llama_index.core import Settings
    +from llama_index.embeddings.mistralai import MistralAIEmbedding
    +
    +# Define the default Embedding model used in this Notebook.
    +# We are using Mistral Models, so we are also using Mistral Embeddings
    +
    +Settings.embed_model = MistralAIEmbedding(model_name="mistral-embed")
    +
    +

    Menentukan Model LLM

    Llama Index menggunakan LLM untuk merespons permintaan dan pertanyaan, dan bertanggung jawab untuk menulis respons bahasa alami. Kami mendefinisikan Mistral Nemo sebagai model default. Nemo menawarkan jendela konteks yang besar hingga 128 ribu token. Penalaran, pengetahuan dunia, dan akurasi pengkodeannya adalah yang tercanggih dalam kategori ukurannya.

    +
    from llama_index.llms.ollama import Ollama
    +
    +Settings.llm = Ollama("mistral-nemo")
    +
    +

    Menginstal Milvus dan Memuat Data

    Milvus adalah basis data vektor sumber terbuka yang populer yang mendukung aplikasi AI dengan pencarian kemiripan vektor yang berkinerja tinggi dan dapat diskalakan.

    +
      +
    • Mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri Anda.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
    • +
    +
    from llama_index.vector_stores.milvus import MilvusVectorStore
    +from llama_index.core import (
    +    SimpleDirectoryReader,
    +    VectorStoreIndex,
    +    StorageContext,
    +    load_index_from_storage,
    +)
    +from llama_index.core.tools import QueryEngineTool, ToolMetadata
    +
    +input_files = ["./data/10k/lyft_2021.pdf", "./data/10k/uber_2021.pdf"]
    +
    +# Create a single Milvus vector store
    +vector_store = MilvusVectorStore(
    +    uri="./milvus_demo.db", dim=1024, overwrite=False, collection_name="companies_docs"
    +)
    +
    +# Create a storage context with the Milvus vector store
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +# Load data
    +docs = SimpleDirectoryReader(input_files=input_files).load_data()
    +
    +# Build index
    +index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
    +
    +# Define the query engine
    +company_engine = index.as_query_engine(similarity_top_k=3)
    +
    +

    Tentukan Alat

    Salah satu langkah penting dalam membangun agen yang efektif adalah menentukan alat yang dapat digunakan untuk menjalankan tugasnya. Alat-alat ini pada dasarnya adalah fungsi atau layanan yang dapat dipanggil oleh agen untuk mengambil informasi atau melakukan tindakan.

    +

    Di bawah ini, kami akan mendefinisikan dua alat yang dapat digunakan agen kami untuk menanyakan informasi keuangan tentang Lyft dan Uber mulai tahun 2021. Alat-alat ini akan diintegrasikan ke dalam agen kami, sehingga memungkinkannya untuk merespons pertanyaan bahasa alami dengan informasi yang tepat dan relevan.

    +

    Jika Anda melihat grafik yang kami miliki di bagian atas, inilah yang dimaksud dengan "Layanan Agen".

    +
    # Define the different tools that can be used by our Agent.
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="lyft_10k",
    +            description=(
    +                "Provides information about Lyft financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="uber_10k",
    +            description=(
    +                "Provides information about Uber financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    from llama_index.llms.ollama import Ollama
    +from llama_index.llms.mistralai import MistralAI
    +
    +# Set up the agent
    +llm = Ollama(model="mistral-nemo")
    +
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="Could you please provide a comparison between Lyft and Uber's total revenues in 2021?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +# Example usage without metadata filtering
    +print("Response without metadata filtering:")
    +print(response)
    +
    +
    Response without metadata filtering:
    +The revenue for Lyft in 2021 was $3.84 billion.
    +
    +Uber's total revenue for the year ended December 31, 2021 was $17,455 million.
    +
    +

    Pemfilteran Metadata

    Milvus mendukung pemfilteran Metadata, sebuah teknik yang memungkinkan Anda untuk mempersempit dan mempersempit hasil pencarian berdasarkan atribut atau tag tertentu yang terkait dengan data Anda. Hal ini sangat berguna dalam skenario di mana Anda memiliki banyak data dan hanya perlu mengambil subset data yang relevan yang sesuai dengan kriteria tertentu.

    +

    Kasus Penggunaan untuk Pemfilteran Metadata

      +
    • Ketepatan dalam Hasil Pencarian: Dengan menerapkan filter metadata, Anda dapat memastikan bahwa hasil pencarian sangat relevan dengan kueri pengguna. Misalnya, jika Anda memiliki koleksi dokumen keuangan, Anda dapat memfilternya berdasarkan nama perusahaan, tahun, atau metadata lain yang relevan.

    • +
    • Efisiensi: Pemfilteran metadata membantu mengurangi jumlah data yang perlu diproses, sehingga operasi pencarian menjadi lebih efisien. Hal ini sangat bermanfaat ketika berurusan dengan kumpulan data yang besar.

    • +
    • Kustomisasi: Pengguna atau aplikasi yang berbeda mungkin memiliki persyaratan yang berbeda. Pemfilteran metadata memungkinkan Anda untuk menyesuaikan hasil pencarian untuk memenuhi kebutuhan tertentu, seperti mengambil dokumen dari tahun atau perusahaan tertentu.

    • +
    +

    Contoh penggunaan

    Pada blok kode di bawah ini, pemfilteran metadata digunakan untuk membuat mesin kueri terfilter yang mengambil dokumen berdasarkan pasangan kunci-nilai metadata tertentu: file_name: lyft_2021.pdf

    +

    QueryEngineTool yang didefinisikan di bawah ini lebih umum daripada yang didefinisikan di atas, pada yang di atas, kami memiliki alat per perusahaan (Uber dan Lyft), yang ini lebih umum. Kita hanya tahu bahwa kita memiliki dokumen keuangan tentang perusahaan, tapi hanya itu saja. Dengan menambahkan Pemfilteran Metadata, kita dapat memfilter untuk hanya mendapatkan data dari dokumen tertentu.

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Example usage with metadata filtering
    +filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="lyft_2021.pdf")]
    +)
    +
    +print(f"filters: {filters}")
    +filtered_query_engine = index.as_query_engine(filters=filters)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Use this tool to retrieve specific data points about a company. "
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    filters: filters=[MetadataFilter(key='file_name', value='lyft_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +

    Pemanggilan Fungsi

    Mistral Nemo dan Large mendukung pemanggilan fungsi asli. Terdapat integrasi yang mulus dengan alat LlamaIndex, melalui fungsi predict_and_call pada LLM. Hal ini memungkinkan pengguna untuk melampirkan alat apa pun dan membiarkan LLM memutuskan alat mana yang akan dipanggil (jika ada).

    +

    Anda dapat mempelajari lebih lanjut tentang Agen di situs web llama-index.

    +
    # Set up the LLM we will use for Function Calling
    +
    +llm = Ollama(model="mistral-nemo")
    +
    +

    Berinteraksi dengan Agen

    Sekarang kita dapat menggunakan Pemfilteran Metadata:

    +
      +
    1. Pada yang pertama, Agen seharusnya tidak dapat menemukan apa pun dari kueri pengguna karena kueri ini tentang Uber dan kita memfilter pada Dokumen hanya tentang Lyft.
    2. +
    3. Pada contoh kedua, Agen seharusnya dapat menemukan informasi tentang Lyft karena kita hanya akan mencari melalui dokumen tentang Lyft.
    4. +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="How many employees does Uber have?",
    +    allow_parallel_tool_calls=True,
    +)
    +print(response)
    +
    +
    I'm unable to provide information about Uber's employee count as it's outside the given Lyft context.
    +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="What are the risk factors for Lyft?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print(response)
    +
    +
    Investing in Lyft carries significant risks. These include general economic factors like impacts from pandemics or crises, operational factors such as competition, pricing changes, and driver/ride growth unpredictability, insurance coverage issues, autonomous vehicle technology uncertainties, reputational concerns, potential security breaches, reliance on third-party services, and challenges in expanding platform offerings. Lyft's business operations are subject to numerous other risks not explicitly mentioned here, which could also harm its financial condition and prospects.
    +
    +

    Contoh Kebingungan Tanpa Pemfilteran Metadata

    > Question: What are the risk factors for Uber?
    +
    +> Response without metadata filtering:
    +Based on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:
    +
    +- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.
    +- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.
    +- Risks related to attracting and retaining qualified drivers and riders.
    +
    +

    Pada contoh ini, sistem salah memberikan informasi tentang Lyft dan bukannya Uber, yang menyebabkan respon yang menyesatkan. Dimulai dengan mengatakan bahwa ia tidak memiliki informasi tersebut, tetapi kemudian terus berlanjut.

    +

    Menggunakan Agen untuk Mengekstrak Filter Metadata

    Untuk mengatasi masalah ini, kita dapat menggunakan agen untuk mengekstrak filter metadata secara otomatis dari pertanyaan pengguna dan menerapkannya selama proses menjawab pertanyaan. Hal ini memastikan bahwa sistem mengambil informasi yang benar dan relevan.

    +

    Contoh Kode

    Di bawah ini adalah contoh kode yang menunjukkan cara membuat mesin kueri terfilter menggunakan agen untuk mengekstrak filter metadata dari pertanyaan pengguna:

    +

    Penjelasan

      +
    • Prompt Template: Kelas PromptTemplate digunakan untuk mendefinisikan templat untuk mengekstrak filter metadata dari pertanyaan pengguna. Templat ini menginstruksikan model bahasa untuk mempertimbangkan nama perusahaan, tahun, dan atribut lain yang relevan.

    • +
    • LLM: Mistral Nemo digunakan untuk menghasilkan filter metadata berdasarkan pertanyaan pengguna. Model ini diminta dengan pertanyaan dan templat untuk mengekstrak filter yang relevan.

    • +
    • Filter Metadata: Tanggapan dari LLM diuraikan untuk membuat objek MetadataFilters. Jika tidak ada filter spesifik yang disebutkan, objek MetadataFilters kosong akan dikembalikan.

    • +
    • Mesin Kueri Terfilter: Metode index.as_query_engine(filters=metadata_filters) membuat mesin kueri yang menerapkan filter metadata yang diekstrak ke indeks. Hal ini memastikan bahwa hanya dokumen yang cocok dengan kriteria filter yang diambil.

    • +
    +
    from llama_index.core.prompts.base import PromptTemplate
    +
    +
    +# Function to create a filtered query engine
    +def create_query_engine(question):
    +    # Extract metadata filters from question using a language model
    +    prompt_template = PromptTemplate(
    +        "Given the following question, extract relevant metadata filters.\n"
    +        "Consider company names, years, and any other relevant attributes.\n"
    +        "Don't write any other text, just the MetadataFilters object"
    +        "Format it by creating a MetadataFilters like shown in the following\n"
    +        "MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\n"
    +        "If no specific filters are mentioned, returns an empty MetadataFilters()\n"
    +        "Question: {question}\n"
    +        "Metadata Filters:\n"
    +    )
    +
    +    prompt = prompt_template.format(question=question)
    +    llm = Ollama(model="mistral-nemo")
    +    response = llm.complete(prompt)
    +
    +    metadata_filters_str = response.text.strip()
    +    if metadata_filters_str:
    +        metadata_filters = eval(metadata_filters_str)
    +        print(f"eval: {metadata_filters}")
    +        return index.as_query_engine(filters=metadata_filters)
    +    return index.as_query_engine()
    +
    +
    response = create_query_engine(
    +    "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +
    ## Example usage with metadata filtering
    +question = "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +filtered_query_engine = create_query_engine(question)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs_filtering",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +            ),
    +        ),
    +    ),
    +]
    +# Set up the agent with the updated query engine tools
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg=question,
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print("Response with metadata filtering:")
    +print(response)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +Response with metadata filtering:
    +Uber's total revenue for the year ended December 31, 2021, is $17.455 billion.
    +
    +

    Mengatur berbagai layanan dengan Mistral Large

    Mistral Large adalah model andalan Mistral dengan kemampuan penalaran, pengetahuan, dan pengkodean yang sangat baik. Sangat ideal untuk tugas-tugas kompleks yang membutuhkan kemampuan penalaran yang besar atau sangat terspesialisasi. Model ini memiliki kemampuan pemanggilan fungsi tingkat lanjut, yang persis seperti yang kita butuhkan untuk mengatur berbagai agen kita.

    +

    Mengapa kita membutuhkan Model yang lebih cerdas?

    Pertanyaan yang dijawab di bawah ini sangat menantang karena membutuhkan orkestrasi berbagai layanan dan agen untuk memberikan respons yang koheren dan akurat. Hal ini melibatkan koordinasi berbagai alat dan agen untuk mengambil dan memproses informasi dari sumber yang berbeda, seperti data keuangan dari berbagai perusahaan.

    +

    Apa yang sulit dari hal itu?

      +
    • Kompleksitas: Pertanyaan ini melibatkan banyak agen dan layanan, masing-masing dengan fungsi dan sumber datanya sendiri. Mengkoordinasikan agen-agen ini untuk bekerja sama dengan lancar adalah tugas yang kompleks.
    • +
    +
      +
    • Integrasi Data: Pertanyaan ini membutuhkan pengintegrasian data dari berbagai sumber, yang dapat menjadi tantangan karena adanya variasi format, struktur, dan metadata data.

    • +
    • Pemahaman Kontekstual: Pertanyaan mungkin memerlukan pemahaman konteks dan hubungan antara berbagai informasi, yang merupakan tugas yang menuntut kognitif.

    • +
    +

    Mengapa Mistral Large dapat membantu dalam kasus ini?

    Mistral Large sangat cocok untuk tugas ini karena kemampuan penalaran dan pemanggilan fungsinya yang canggih. Berikut ini adalah bagaimana hal tersebut membantu:

    +
      +
    • Penalaran Tingkat Lanjut: Mistral Large dapat menangani tugas-tugas penalaran yang kompleks, sehingga ideal untuk mengatur banyak agen dan layanan. Mistral Large dapat memahami hubungan antara berbagai informasi dan membuat keputusan yang tepat.

    • +
    • Kemampuan Pemanggilan Fungsi: Mistral Large memiliki kemampuan pemanggilan fungsi tingkat lanjut, yang sangat penting untuk mengoordinasikan tindakan berbagai agen. Hal ini memungkinkan integrasi dan orkestrasi yang mulus dari berbagai layanan.

    • +
    • Pengetahuan Khusus: Mistral Large dirancang untuk tugas-tugas yang sangat terspesialisasi, sehingga sangat cocok untuk menangani kueri kompleks yang membutuhkan pengetahuan domain yang mendalam.

    • +
    +

    Untuk semua alasan itu, saya memutuskan bahwa menggunakan Mistral Large daripada Mistral Nemo lebih cocok di sini.

    +
    from llama_agents import (
    +    AgentService,
    +    ToolService,
    +    LocalLauncher,
    +    MetaServiceTool,
    +    ControlPlaneServer,
    +    SimpleMessageQueue,
    +    AgentOrchestrator,
    +)
    +
    +from llama_index.core.agent import FunctionCallingAgentWorker
    +from llama_index.llms.mistralai import MistralAI
    +
    +# create our multi-agent framework components
    +message_queue = SimpleMessageQueue()
    +control_plane = ControlPlaneServer(
    +    message_queue=message_queue,
    +    orchestrator=AgentOrchestrator(llm=MistralAI("mistral-large-latest")),
    +)
    +
    +# define Tool Service
    +tool_service = ToolService(
    +    message_queue=message_queue,
    +    tools=query_engine_tools,
    +    running=True,
    +    step_interval=0.5,
    +)
    +
    +# define meta-tools here
    +meta_tools = [
    +    await MetaServiceTool.from_tool_service(
    +        t.metadata.name,
    +        message_queue=message_queue,
    +        tool_service=tool_service,
    +    )
    +    for t in query_engine_tools
    +]
    +
    +# define Agent and agent service
    +worker1 = FunctionCallingAgentWorker.from_tools(
    +    meta_tools, llm=MistralAI("mistral-large-latest")
    +)
    +
    +agent1 = worker1.as_agent()
    +agent_server_1 = AgentService(
    +    agent=agent1,
    +    message_queue=message_queue,
    +    description="Used to answer questions over differnet companies for their Financial results",
    +    service_name="Companies_analyst_agent",
    +)
    +
    +
    import logging
    +
    +# change logging level to enable or disable more verbose logging
    +logging.getLogger("llama_agents").setLevel(logging.INFO)
    +
    +
    ## Define Launcher
    +launcher = LocalLauncher(
    +    [agent_server_1, tool_service],
    +    control_plane,
    +    message_queue,
    +)
    +
    +
    query_str = "What are the risk factors for Uber?"
    +result = launcher.launch_single(query_str)
    +
    +
    INFO:llama_agents.message_queues.simple - Consumer AgentService-27cde4ed-5163-4005-90fc-13c158eda7e3: Companies_analyst_agent has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ToolService-b73c500a-5fbe-4f57-95c7-db74e173bd1b: default_tool_service has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer 62465ab8-32ff-436e-95fa-74e828745150: human has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ControlPlaneServer-f4c27d43-5474-43ca-93ca-a9aeed4534d7: control_plane has been registered.
    +INFO:llama_agents.services.agent - Companies_analyst_agent launch_local
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Launching message queue locally
    +INFO:llama_agents.services.agent - Processing initiated.
    +INFO:llama_agents.services.tool - Processing initiated.
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.simple - Consumer MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41: MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41 has been registered.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f4c270a4-bc47-4bbf-92fe-e2cc80757943 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f888f9a8-e716-4505-bfe2-577452e9b6e6 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'human' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'human' to consumer.
    +
    +
    print(result)
    +
    +
    [{"name": "finalize", "arguments": {"input": "Uber faces several risk factors, including general economic impacts such as pandemics or downturns, operational challenges like competition, market growth uncertainty, attracting and retaining drivers and riders, insurance adequacy, autonomous vehicle technology development, maintaining its reputation and brand, and managing growth. Additionally, reliance on third-party providers for various services can introduce further risks to its operations."}}]
    +
    +

    Kesimpulan

    Dalam buku catatan ini, Anda telah melihat bagaimana Anda dapat menggunakan llama-agents untuk melakukan berbagai tindakan dengan memanggil alat yang sesuai. Dengan menggunakan Mistral Large yang dikombinasikan dengan Mistral Nemo, kami mendemonstrasikan cara mengatur sistem yang cerdas dan hemat sumber daya secara efektif dengan memanfaatkan kekuatan LLM yang berbeda. Kami melihat bahwa Agen dapat memilih koleksi yang berisi data yang diminta oleh pengguna.

    diff --git a/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.json b/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.json new file mode 100644 index 000000000..c0002aff7 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.json @@ -0,0 +1 @@ +{"codeList":["$ pip install dynamiq pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Importing necessary libraries for the workflow\nfrom io import BytesIO\nfrom dynamiq import Workflow\nfrom dynamiq.nodes import InputTransformer\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.converters import PyPDFConverter\nfrom dynamiq.nodes.splitters.document import DocumentSplitter\nfrom dynamiq.nodes.embedders import OpenAIDocumentEmbedder\nfrom dynamiq.nodes.writers import MilvusDocumentWriter\n\n# Initialize the workflow\nrag_wf = Workflow()\n","converter = PyPDFConverter(document_creation_mode=\"one-doc-per-page\")\nconverter_added = rag_wf.flow.add_nodes(\n converter\n) # Add node to the DAG (Directed Acyclic Graph)\n","document_splitter = DocumentSplitter(\n split_by=\"sentence\", # Splits documents into sentences\n split_length=10,\n split_overlap=1,\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[converter.id]}.output.documents\",\n },\n ),\n).depends_on(\n converter\n) # Set dependency on the PDF converter\nsplitter_added = rag_wf.flow.add_nodes(document_splitter) # Add to the DAG\n","embedder = OpenAIDocumentEmbedder(\n connection=OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"]),\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[document_splitter.id]}.output.documents\",\n },\n ),\n).depends_on(\n document_splitter\n) # Set dependency on the splitter\ndocument_embedder_added = rag_wf.flow.add_nodes(embedder) # Add to the DAG\n","vector_store = (\n MilvusDocumentWriter(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n create_if_not_exist=True,\n metric_type=\"COSINE\",\n )\n .inputs(documents=embedder.outputs.documents) # Connect to embedder output\n .depends_on(embedder) # Set dependency on the embedder\n)\nmilvus_writer_added = rag_wf.flow.add_nodes(vector_store) # Add to the DAG\n","file_paths = [\"./pdf_files/WhatisMilvus.pdf\"]\ninput_data = {\n \"files\": [BytesIO(open(path, \"rb\").read()) for path in file_paths],\n \"metadata\": [{\"filename\": path} for path in file_paths],\n}\n\n# Run the workflow with the prepared input data\ninserted_data = rag_wf.run(input_data=input_data)\n","from dynamiq import Workflow\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.embedders import OpenAITextEmbedder\nfrom dynamiq.nodes.retrievers import MilvusDocumentRetriever\nfrom dynamiq.nodes.llms import OpenAI\nfrom dynamiq.prompts import Message, Prompt\n\n# Initialize the workflow\nretrieval_wf = Workflow()\n","# Establish OpenAI connection\nopenai_connection = OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"])\n\n# Define the text embedder node\nembedder = OpenAITextEmbedder(\n connection=openai_connection,\n model=\"text-embedding-3-small\",\n)\n\n# Add the embedder node to the workflow\nembedder_added = retrieval_wf.flow.add_nodes(embedder)\n","document_retriever = (\n MilvusDocumentRetriever(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n top_k=5,\n )\n .inputs(embedding=embedder.outputs.embedding) # Connect to embedder output\n .depends_on(embedder) # Dependency on the embedder node\n)\n\n# Add the retriever node to the workflow\nmilvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)\n","# Define the prompt template for the LLM\nprompt_template = \"\"\"\nPlease answer the question based on the provided context.\n\nQuestion: {{ query }}\n\nContext:\n{% for document in documents %}\n- {{ document.content }}\n{% endfor %}\n\"\"\"\n\n# Create the prompt object\nprompt = Prompt(messages=[Message(content=prompt_template, role=\"user\")])\n","answer_generator = (\n OpenAI(\n connection=openai_connection,\n model=\"gpt-4o\",\n prompt=prompt,\n )\n .inputs(\n documents=document_retriever.outputs.documents,\n query=embedder.outputs.query,\n )\n .depends_on(\n [document_retriever, embedder]\n ) # Dependencies on retriever and embedder\n)\n\n# Add the answer generator node to the workflow\nanswer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)\n","# Run the workflow with a sample query\nsample_query = \"What is the Advanced Search Algorithms in Milvus?\"\n\nresult = retrieval_wf.run(input_data={\"query\": sample_query})\n\nanswer = result.output.get(answer_generator.id).get(\"output\", {}).get(\"content\")\nprint(answer)\n"],"headingContent":"Getting Started with Dynamiq and Milvus","anchorList":[{"label":"Memulai dengan Dynamiq dan Milvus","href":"Getting-Started-with-Dynamiq-and-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"RAG - Alur Pengindeksan Dokumen","href":"RAG---Document-Indexing-Flow","type":2,"isActive":false},{"label":"Alur Pengambilan Dokumen RAG","href":"RAG-Document-Retrieval-Flow","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.md b/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.md new file mode 100644 index 000000000..8615f9e99 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/milvus_rag_with_dynamiq.md @@ -0,0 +1,339 @@ +--- +id: milvus_rag_with_dynamiq.md +summary: >- + Dalam tutorial ini, kita akan mengeksplorasi cara menggunakan Dynamiq dengan + Milvus, basis data vektor berkinerja tinggi yang dibuat khusus untuk alur + kerja RAG. Milvus unggul dalam penyimpanan, pengindeksan, dan pengambilan + embedding vektor yang efisien, menjadikannya komponen yang sangat diperlukan + untuk sistem AI yang menuntut akses data kontekstual yang cepat dan tepat. +title: Memulai dengan Dynamiq dan Milvus +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Memulai dengan Dynamiq dan Milvus

    Dynamiq adalah kerangka kerja Gen AI yang kuat yang menyederhanakan pengembangan aplikasi bertenaga AI. Dengan dukungan yang kuat untuk retrieval-augmented generation (RAG) dan agen model bahasa besar (LLM), Dynamiq memberdayakan para pengembang untuk membuat sistem yang cerdas dan dinamis dengan mudah dan efisien.

    +

    Dalam tutorial ini, kita akan mengeksplorasi cara menggunakan Dynamiq dengan Milvus, basis data vektor berkinerja tinggi yang dibuat khusus untuk alur kerja RAG. Milvus unggul dalam penyimpanan, pengindeksan, dan pengambilan embedding vektor yang efisien, menjadikannya komponen yang sangat diperlukan untuk sistem AI yang menuntut akses data kontekstual yang cepat dan tepat.

    +

    Panduan langkah demi langkah ini akan membahas dua alur kerja inti RAG:

    +
      +
    • Alur Pengindeksan Dokumen: Mempelajari cara memproses file input (mis., PDF), mengubah kontennya menjadi embedding vektor, dan menyimpannya di Milvus. Memanfaatkan kemampuan pengindeksan berkinerja tinggi dari Milvus akan memastikan data Anda siap untuk diambil dengan cepat.

    • +
    • Alur Pengambilan Dokumen: Temukan cara meminta Milvus untuk mendapatkan sematan dokumen yang relevan dan menggunakannya untuk menghasilkan respons yang berwawasan luas dan sesuai konteks dengan agen LLM Dynamiq, sehingga menciptakan pengalaman pengguna yang didukung oleh AI yang mulus.

    • +
    +

    Di akhir tutorial ini, Anda akan mendapatkan pemahaman yang kuat tentang bagaimana Milvus dan Dynamiq bekerja sama untuk membangun sistem AI yang dapat diskalakan dan sadar konteks yang disesuaikan dengan kebutuhan Anda.

    +

    Persiapan

    Unduh pustaka yang diperlukan

    $ pip install dynamiq pymilvus
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Mengonfigurasi agen LLM

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    RAG - Alur Pengindeksan Dokumen

    Tutorial ini mendemonstrasikan alur kerja Retrieval-Augmented Generation (RAG) untuk mengindeks dokumen dengan Milvus sebagai basis data vektor. Alur kerja ini mengambil file PDF masukan, memprosesnya menjadi potongan-potongan yang lebih kecil, menghasilkan penyematan vektor menggunakan model penyematan OpenAI, dan menyimpan penyematan dalam koleksi Milvus untuk pengambilan yang efisien.

    +

    Pada akhir alur kerja ini, Anda akan memiliki sistem pengindeksan dokumen yang terukur dan efisien yang mendukung tugas-tugas RAG di masa mendatang seperti pencarian semantik dan menjawab pertanyaan.

    +

    Mengimpor Pustaka yang Diperlukan dan Menginisialisasi Alur Kerja

    # Importing necessary libraries for the workflow
    +from io import BytesIO
    +from dynamiq import Workflow
    +from dynamiq.nodes import InputTransformer
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.converters import PyPDFConverter
    +from dynamiq.nodes.splitters.document import DocumentSplitter
    +from dynamiq.nodes.embedders import OpenAIDocumentEmbedder
    +from dynamiq.nodes.writers import MilvusDocumentWriter
    +
    +# Initialize the workflow
    +rag_wf = Workflow()
    +
    +

    Tentukan Node Pengonversi PDF

    converter = PyPDFConverter(document_creation_mode="one-doc-per-page")
    +converter_added = rag_wf.flow.add_nodes(
    +    converter
    +)  # Add node to the DAG (Directed Acyclic Graph)
    +
    +

    Tentukan Node Pemisah Dokumen

    document_splitter = DocumentSplitter(
    +    split_by="sentence",  # Splits documents into sentences
    +    split_length=10,
    +    split_overlap=1,
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[converter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    converter
    +)  # Set dependency on the PDF converter
    +splitter_added = rag_wf.flow.add_nodes(document_splitter)  # Add to the DAG
    +
    +

    Tentukan Node Penyisipan

    embedder = OpenAIDocumentEmbedder(
    +    connection=OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]),
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[document_splitter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    document_splitter
    +)  # Set dependency on the splitter
    +document_embedder_added = rag_wf.flow.add_nodes(embedder)  # Add to the DAG
    +
    +

    Tentukan Node Penyimpanan Vektor Milvus

    vector_store = (
    +    MilvusDocumentWriter(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        create_if_not_exist=True,
    +        metric_type="COSINE",
    +    )
    +    .inputs(documents=embedder.outputs.documents)  # Connect to embedder output
    +    .depends_on(embedder)  # Set dependency on the embedder
    +)
    +milvus_writer_added = rag_wf.flow.add_nodes(vector_store)  # Add to the DAG
    +
    +
    2024-11-19 22:14:03 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:03 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:04 - DEBUG - Created new connection using: 0bef2849fdb1458a85df8bb9dd27f51d
    +2024-11-19 22:14:04 - INFO - Collection my_milvus_collection does not exist. Creating a new collection.
    +2024-11-19 22:14:04 - DEBUG - Successfully created collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +
    +
    +

    Milvus menawarkan dua jenis penerapan, yang melayani berbagai kasus penggunaan:

    +
      +
    1. MilvusDeploymentType.FILE
    2. +
    +
      +
    • Ideal untuk pembuatan prototipe lokal atau penyimpanan data berskala kecil.
    • +
    • Atur uri ke jalur file lokal (misalnya, ./milvus.db) untuk memanfaatkan Milvus Lite, yang secara otomatis menyimpan semua data dalam file yang ditentukan.
    • +
    • Ini adalah opsi yang nyaman untuk pengaturan dan eksperimen cepat.
    • +
    +
      +
    1. MilvusDeploymentType.HOST
    2. +
    +
      +
    • Dirancang untuk skenario data berskala besar, seperti mengelola lebih dari satu juta vektor.

      +

      Server yang Diinangi Sendiri

      +
        +
      • Menerapkan server Milvus berkinerja tinggi menggunakan Docker atau Kubernetes.
      • +
      • Konfigurasikan alamat dan port server sebagai uri (mis., http://localhost:19530).
      • +
      • Jika autentikasi diaktifkan:
      • +
      • Berikan <your_username>:<your_password> sebagai token.
      • +
      • Jika autentikasi dinonaktifkan:
      • +
      • Biarkan token tidak disetel.
      • +
      +

      Zilliz Cloud (Layanan Terkelola)

      +
    • +
    +
    +

    Tentukan Data Masukan dan Jalankan Alur Kerja

    file_paths = ["./pdf_files/WhatisMilvus.pdf"]
    +input_data = {
    +    "files": [BytesIO(open(path, "rb").read()) for path in file_paths],
    +    "metadata": [{"filename": path} for path in file_paths],
    +}
    +
    +# Run the workflow with the prepared input data
    +inserted_data = rag_wf.run(input_data=input_data)
    +
    +
    /var/folders/09/d0hx80nj35sb5hxb5cpc1q180000gn/T/ipykernel_31319/3145804345.py:4: ResourceWarning: unclosed file <_io.BufferedReader name='./pdf_files/WhatisMilvus.pdf'>
    +  BytesIO(open(path, "rb").read()) for path in file_paths
    +ResourceWarning: Enable tracemalloc to get the object allocation traceback
    +2024-11-19 22:14:09 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution started.
    +2024-11-19 22:14:09 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution succeeded in 58ms.
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution started.
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/websockets/legacy/__init__.py:6: DeprecationWarning: websockets.legacy is deprecated; see https://websockets.readthedocs.io/en/stable/howto/upgrade.html for upgrade instructions
    +  warnings.warn(  # deprecated in 14.0 - 2024-11-09
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/pydantic/fields.py:804: PydanticDeprecatedSince20: Using extra keyword arguments on `Field` is deprecated and will be removed. Use `json_schema_extra` instead. (Extra keys: 'is_accessible_to_agent'). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/
    +  warn(
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution succeeded in 104ms.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution started.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution succeeded in 724ms.
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution succeeded in 66ms.
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution succeeded in 961ms.
    +2024-11-19 22:14:10 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 1.3s.
    +2024-11-19 22:14:10 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution succeeded in 1.3s.
    +
    +

    Melalui alur kerja ini, kami telah berhasil mengimplementasikan pipeline pengindeksan dokumen menggunakan Milvus sebagai basis data vektor dan model penyematan OpenAI untuk representasi semantik. Pengaturan ini memungkinkan pengambilan berbasis vektor yang cepat dan akurat, membentuk fondasi untuk alur kerja RAG seperti pencarian semantik, pengambilan dokumen, dan interaksi berbasis AI kontekstual.

    +

    Dengan kemampuan penyimpanan yang dapat diskalakan dari Milvus dan orkestrasi Dynamiq, solusi ini siap untuk pembuatan prototipe dan penerapan produksi berskala besar. Anda sekarang dapat memperluas pipeline ini untuk menyertakan tugas tambahan seperti menjawab pertanyaan berbasis pengambilan atau pembuatan konten berbasis AI.

    +

    Alur Pengambilan Dokumen RAG

    Dalam tutorial ini, kami mengimplementasikan alur kerja pengambilan dokumen Retrieval-Augmented Generation (RAG). Alur kerja ini mengambil kueri pengguna, menghasilkan penyematan vektor untuk kueri tersebut, mengambil dokumen yang paling relevan dari basis data vektor Milvus, dan menggunakan model bahasa besar (LLM) untuk menghasilkan jawaban yang terperinci dan sesuai konteks berdasarkan dokumen yang diambil.

    +

    Dengan mengikuti alur kerja ini, Anda akan membuat solusi end-to-end untuk pencarian semantik dan menjawab pertanyaan, yang menggabungkan kekuatan pengambilan dokumen berbasis vektor dengan kemampuan LLM canggih OpenAI. Pendekatan ini memungkinkan respons yang efisien dan cerdas terhadap pertanyaan pengguna dengan memanfaatkan pengetahuan yang tersimpan dalam database dokumen Anda.

    +

    Impor Pustaka yang Diperlukan dan Inisialisasi Alur Kerja

    from dynamiq import Workflow
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.embedders import OpenAITextEmbedder
    +from dynamiq.nodes.retrievers import MilvusDocumentRetriever
    +from dynamiq.nodes.llms import OpenAI
    +from dynamiq.prompts import Message, Prompt
    +
    +# Initialize the workflow
    +retrieval_wf = Workflow()
    +
    +

    Tentukan Koneksi OpenAI dan Penyemat Teks

    # Establish OpenAI connection
    +openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"])
    +
    +# Define the text embedder node
    +embedder = OpenAITextEmbedder(
    +    connection=openai_connection,
    +    model="text-embedding-3-small",
    +)
    +
    +# Add the embedder node to the workflow
    +embedder_added = retrieval_wf.flow.add_nodes(embedder)
    +
    +

    Tentukan Milvus Document Retriever

    document_retriever = (
    +    MilvusDocumentRetriever(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        top_k=5,
    +    )
    +    .inputs(embedding=embedder.outputs.embedding)  # Connect to embedder output
    +    .depends_on(embedder)  # Dependency on the embedder node
    +)
    +
    +# Add the retriever node to the workflow
    +milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)
    +
    +
    2024-11-19 22:14:19 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:19 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:19 - DEBUG - Created new connection using: 98d1132773af4298a894ad5925845fd2
    +2024-11-19 22:14:19 - INFO - Collection my_milvus_collection already exists. Skipping creation.
    +
    +

    Tentukan Templat Prompt

    # Define the prompt template for the LLM
    +prompt_template = """
    +Please answer the question based on the provided context.
    +
    +Question: {{ query }}
    +
    +Context:
    +{% for document in documents %}
    +- {{ document.content }}
    +{% endfor %}
    +"""
    +
    +# Create the prompt object
    +prompt = Prompt(messages=[Message(content=prompt_template, role="user")])
    +
    +

    Tentukan Generator Jawaban

    answer_generator = (
    +    OpenAI(
    +        connection=openai_connection,
    +        model="gpt-4o",
    +        prompt=prompt,
    +    )
    +    .inputs(
    +        documents=document_retriever.outputs.documents,
    +        query=embedder.outputs.query,
    +    )
    +    .depends_on(
    +        [document_retriever, embedder]
    +    )  # Dependencies on retriever and embedder
    +)
    +
    +# Add the answer generator node to the workflow
    +answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)
    +
    +

    Jalankan Alur Kerja

    # Run the workflow with a sample query
    +sample_query = "What is the Advanced Search Algorithms in Milvus?"
    +
    +result = retrieval_wf.run(input_data={"query": sample_query})
    +
    +answer = result.output.get(answer_generator.id).get("output", {}).get("content")
    +print(answer)
    +
    +
    2024-11-19 22:14:22 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution started.
    +2024-11-19 22:14:22 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:22 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution started.
    +2024-11-19 22:14:23 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:23 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution succeeded in 474ms.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution started.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution succeeded in 23ms.
    +2024-11-19 22:14:23 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution started.
    +2024-11-19 22:14:24 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +2024-11-19 22:14:24 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution succeeded in 1.8s.
    +2024-11-19 22:14:25 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 2.4s.
    +2024-11-19 22:14:25 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution succeeded in 2.4s.
    +
    +
    +The advanced search algorithms in Milvus include a variety of in-memory and on-disk indexing/search algorithms such as IVF (Inverted File), HNSW (Hierarchical Navigable Small World), and DiskANN. These algorithms have been deeply optimized to enhance performance, delivering 30%-70% better performance compared to popular implementations like FAISS and HNSWLib. These optimizations are part of Milvus's design to ensure high efficiency and scalability in handling vector data.
    +
    diff --git a/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.json b/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.json new file mode 100644 index 000000000..b59cb7353 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.json @@ -0,0 +1 @@ +{"codeList":["from langchain.document_loaders import DirectoryLoader\n# Load HTML files already saved in a local directory\npath = \"../../RAG/rtdocs_new/\"\nglobal_pattern = '*.html'\nloader = DirectoryLoader(path=path, glob=global_pattern)\ndocs = loader.load()\n\n\n# Print num documents and a preview.\nprint(f\"loaded {len(docs)} documents\")\nprint(docs[0].page_content)\npprint.pprint(docs[0].metadata)\n","loaded 22 documents\nWhy Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...\n{'source': 'https://milvus.io/docs/quickstart.md'}\n","import torch\nfrom sentence_transformers import SentenceTransformer\n\n\n# Initialize torch settings for device-agnostic code.\nN_GPU = torch.cuda.device_count()\nDEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')\n\n\n# Download the model from huggingface model hub.\nmodel_name = \"BAAI/bge-large-en-v1.5\"\nencoder = SentenceTransformer(model_name, device=DEVICE)\n\n\n# Get the model parameters and save for later.\nEMBEDDING_DIM = encoder.get_sentence_embedding_dimension()\nMAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()\n\n\n# Inspect model parameters.\nprint(f\"model_name: {model_name}\")\nprint(f\"EMBEDDING_DIM: {EMBEDDING_DIM}\")\nprint(f\"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}\")\n","model_name: BAAI/bge-large-en-v1.5\nEMBEDDING_DIM: 1024\nMAX_SEQ_LENGTH: 512\n","from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n\nCHUNK_SIZE = 512\nchunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)\nprint(f\"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}\")\n\n\n# Define the splitter.\nchild_splitter = RecursiveCharacterTextSplitter(\n chunk_size=CHUNK_SIZE,\n chunk_overlap=chunk_overlap)\n\n\n# Chunk the docs.\nchunks = child_splitter.split_documents(docs)\nprint(f\"{len(docs)} docs split into {len(chunks)} child documents.\")\n\n\n# Encoder input is doc.page_content as strings.\nlist_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]\n\n\n# Embedding inference using HuggingFace encoder.\nembeddings = torch.tensor(encoder.encode(list_of_strings))\n\n\n# Normalize the embeddings.\nembeddings = np.array(embeddings / np.linalg.norm(embeddings))\n\n\n# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.\nconverted_values = list(map(np.float32, embeddings))\n\n\n# Create dict_list for Milvus insertion.\ndict_list = []\nfor chunk, vector in zip(chunks, converted_values):\n # Assemble embedding vector, original text chunk, metadata.\n chunk_dict = {\n 'chunk': chunk.page_content,\n 'source': chunk.metadata.get('source', \"\"),\n 'vector': vector,\n }\n dict_list.append(chunk_dict)\n","chunk_size: 512, chunk_overlap: 51.0\n22 docs split into 355 child documents.\n","# Connect a client to the Milvus Lite server.\nfrom pymilvus import MilvusClient\nmc = MilvusClient(\"milvus_demo.db\")\n\n\n# Create a collection with flexible schema and AUTOINDEX.\nCOLLECTION_NAME = \"MilvusDocs\"\nmc.create_collection(COLLECTION_NAME,\n EMBEDDING_DIM,\n consistency_level=\"Eventually\",\n auto_id=True, \n overwrite=True)\n\n\n# Insert data into the Milvus collection.\nprint(\"Start inserting entities\")\nstart_time = time.time()\nmc.insert(\n COLLECTION_NAME,\n data=dict_list,\n progress_bar=True)\n\n\nend_time = time.time()\nprint(f\"Milvus insert time for {len(dict_list)} vectors: \", end=\"\")\nprint(f\"{round(end_time - start_time, 2)} seconds\")\n","Start inserting entities\nMilvus insert time for 355 vectors: 0.2 seconds\n","SAMPLE_QUESTION = \"What do the parameters for HNSW mean?\"\n\n\n# Embed the question using the same encoder.\nquery_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))\n# Normalize embeddings to unit length.\nquery_embeddings = F.normalize(query_embeddings, p=2, dim=1)\n# Convert the embeddings to list of list of np.float32.\nquery_embeddings = list(map(np.float32, query_embeddings))\n\n\n# Define metadata fields you can filter on.\nOUTPUT_FIELDS = list(dict_list[0].keys())\nOUTPUT_FIELDS.remove('vector')\n\n\n# Define how many top-k results you want to retrieve.\nTOP_K = 2\n\n\n# Run semantic vector search using your query and the vector database.\nresults = mc.search(\n COLLECTION_NAME,\n data=query_embeddings,\n output_fields=OUTPUT_FIELDS,\n limit=TOP_K,\n consistency_level=\"Eventually\")\n","Retrieved result #1\ndistance = 0.7001987099647522\n('Chunk text: layer, finds the node closest to the target in this layer, and'\n...\n'outgoing')\nsource: https://milvus.io/docs/index.md\n\nRetrieved result #2\ndistance = 0.6953287124633789\n('Chunk text: this value can improve recall rate at the cost of increased'\n...\n'to the target')\nsource: https://milvus.io/docs/index.md\n","# (Recommended) Create a new conda environment.\nconda create -n myenv python=3.11 -y\nconda activate myenv\n\n\n# Install vLLM with CUDA 12.1.\npip install -U vllm transformers torch\n\n\nimport vllm, torch\nfrom vllm import LLM, SamplingParams\n\n\n# Clear the GPU memory cache.\ntorch.cuda.empty_cache()\n\n\n# Check the GPU.\n!nvidia-smi\n","# Login to HuggingFace using your new token.\nfrom huggingface_hub import login\nfrom google.colab import userdata\nhf_token = userdata.get('HF_TOKEN')\nlogin(token = hf_token, add_to_git_credential=True)\n","# 1. Choose a model\nMODELTORUN = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n\n\n# 2. Clear the GPU memory cache, you're going to need it all!\ntorch.cuda.empty_cache()\n\n\n# 3. Instantiate a vLLM model instance.\nllm = LLM(model=MODELTORUN,\n enforce_eager=True,\n dtype=torch.bfloat16,\n gpu_memory_utilization=0.5,\n max_model_len=1000,\n seed=415,\n max_num_batched_tokens=3000)\n","# Separate all the context together by space.\ncontexts_combined = ' '.join(contexts)\n# Lance Martin, LangChain, says put the best contexts at the end.\ncontexts_combined = ' '.join(reversed(contexts))\n\n\n# Separate all the unique sources together by comma.\nsource_combined = ' '.join(reversed(list(dict.fromkeys(sources))))\n\n\nSYSTEM_PROMPT = f\"\"\"First, check if the provided Context is relevant to\nthe user's question. Second, only if the provided Context is strongly relevant, answer the question using the Context. Otherwise, if the Context is not strongly relevant, answer the question without using the Context. \nBe clear, concise, relevant. Answer clearly, in fewer than 2 sentences.\nGrounding sources: {source_combined}\nContext: {contexts_combined}\nUser's question: {SAMPLE_QUESTION}\n\"\"\"\n\n\nprompts = [SYSTEM_PROMPT]\n","# Sampling parameters\nsampling_params = SamplingParams(temperature=0.2, top_p=0.95)\n\n\n# Invoke the vLLM model.\noutputs = llm.generate(prompts, sampling_params)\n\n\n# Print the outputs.\nfor output in outputs:\n prompt = output.prompt\n generated_text = output.outputs[0].text\n # !r calls repr(), which prints a string inside quotes.\n print()\n print(f\"Question: {SAMPLE_QUESTION!r}\")\n pprint.pprint(f\"Generated text: {generated_text!r}\")\n","Question: 'What do the parameters for HNSW MEAN!?'\nGenerated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '\n'* M: The maximum degree of nodes on each layer oof the graph, which can improve '\n'recall rate at the cost of increased search time. * efConstruction and ef: ' \n'These parameters specify a search range when building or searching an index.'\n"],"headingContent":"Building RAG with Milvus, vLLM, and Llama 3.1","anchorList":[{"label":"Membangun RAG dengan Milvus, vLLM, dan Llama 3.1","href":"Building-RAG-with-Milvus-vLLM-and-Llama-31","type":1,"isActive":false},{"label":"Pengantar ke Milvus, vLLM, dan Llama 3.1 Meta","href":"Introduction-to-Milvus-vLLM-and-Meta’s-Llama-31","type":2,"isActive":false},{"label":"Membangun dan Melakukan Pengambilan RAG dengan Milvus","href":"Build-and-Perform-the-RAG-Retrieval-with-Milvus","type":2,"isActive":false},{"label":"Membangun dan Melakukan Pembangkitan RAG dengan vLLM dan Llama 3.1-8B","href":"Build-and-Perform-the-RAG-Generation-with-vLLM-and-Llama-31-8B","type":2,"isActive":false},{"label":"Referensi","href":"References","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.md b/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.md new file mode 100644 index 000000000..3ff15c34f --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/milvus_rag_with_vllm.md @@ -0,0 +1,387 @@ +--- +id: milvus_rag_with_vllm.md +summary: >- + Blog ini akan menunjukkan kepada Anda bagaimana membangun dan menjalankan RAG + dengan Milvus, vLLM, dan Llama 3.1. Lebih khusus lagi, saya akan menunjukkan + kepada Anda cara menyematkan dan menyimpan informasi teks sebagai penyematan + vektor di Milvus dan menggunakan penyimpanan vektor ini sebagai basis + pengetahuan untuk secara efisien mengambil potongan teks yang relevan dengan + pertanyaan pengguna. +title: 'Membangun RAG dengan Milvus, vLLM, dan Llama 3.1' +--- +

    Membangun RAG dengan Milvus, vLLM, dan Llama 3.1

    University of California - Berkeley mendonasikan vLLM, sebuah perpustakaan yang cepat dan mudah digunakan untuk inferensi dan penyajian LLM, kepada LF AI & Data Foundation sebagai proyek tahap inkubasi pada bulan Juli 2024. Sebagai sesama anggota proyek, kami ingin menyambut vLLM bergabung dengan keluarga LF AI & Data! 🎉

    +

    Large Language Models(LLM) dan basis data vektor biasanya dipasangkan untuk membangun Retrieval Augmented Generation(RAG), sebuah arsitektur aplikasi AI yang populer untuk mengatasi AI Halusinasi. Blog ini akan menunjukkan kepada Anda bagaimana cara membangun dan menjalankan RAG dengan Milvus, vLLM, dan Llama 3.1. Lebih khusus lagi, saya akan menunjukkan kepada Anda cara menyematkan dan menyimpan informasi teks sebagai penyematan vektor di Milvus dan menggunakan penyimpanan vektor ini sebagai basis pengetahuan untuk mengambil potongan teks yang relevan dengan pertanyaan pengguna secara efisien. Terakhir, kita akan memanfaatkan vLLM untuk menyajikan model Llama 3.1-8B dari Meta untuk menghasilkan jawaban yang ditambah dengan teks yang diambil. Mari kita selami!

    +

    Pengantar ke Milvus, vLLM, dan Llama 3.1 Meta

    Basis data vektor Milvus

    Milvus adalah basis data vektor yang bersifat open-source, dibuat khusus, dan didistribusikan untuk menyimpan, mengindeks, dan mencari vektor untuk beban kerja Generative AI (GenAI). Kemampuannya untuk melakukan pencarian hybrid, pemfilteran metadata, pemeringkatan ulang, dan secara efisien menangani triliunan vektor membuat Milvus menjadi pilihan utama untuk beban kerja AI dan pembelajaran mesin. Milvus dapat dijalankan secara lokal, di cluster, atau di-host di Zilliz Cloud yang dikelola secara penuh.

    +

    vLLM

    vLLM adalah proyek sumber terbuka yang dimulai di UC Berkeley SkyLab yang berfokus pada pengoptimalan kinerja penyajian LLM. Ini menggunakan manajemen memori yang efisien dengan PagedAttention, pengelompokan berkelanjutan, dan kernel CUDA yang dioptimalkan. Dibandingkan dengan metode tradisional, vLLM meningkatkan performa penyajian hingga 24x lipat sekaligus memangkas penggunaan memori GPU hingga setengahnya.

    +

    Menurut makalah "Manajemen Memori yang Efisien untuk Penyajian Model Bahasa Besar dengan PagedAttention," cache KV menggunakan sekitar 30% memori GPU, yang menyebabkan potensi masalah memori. Cache KV disimpan dalam memori yang bersebelahan, tetapi perubahan ukuran dapat menyebabkan fragmentasi memori, yang tidak efisien untuk komputasi.

    +

    + + + + +

    +

    Gambar 1. Manajemen memori cache KV dalam sistem yang ada ( Makalah Perhatian Halaman 2023)

    +

    Dengan menggunakan memori virtual untuk cache KV, vLLM hanya mengalokasikan memori GPU fisik sesuai kebutuhan, sehingga menghilangkan fragmentasi memori dan menghindari pengalokasian awal. Dalam pengujian, vLLM mengungguli HuggingFace Transformers (HF) dan Text Generation Inference (TGI), mencapai throughput hingga 24x lebih tinggi daripada HF dan 3,5x lebih tinggi daripada TGI pada GPU NVIDIA A10G dan A100.

    +

    + + + + +

    +

    Gambar 2. Menyajikan throughput ketika setiap permintaan meminta tiga penyelesaian output paralel. vLLM mencapai throughput 8,5x-15x lebih tinggi daripada HF dan 3,3x-3,5x lebih tinggi daripada TGI ( blog vLLM 2023).

    +

    Meta's Llama 3.1

    Llama 3.1 dari Meta diumumkan pada tanggal 23 Juli 2024. Model 405B memberikan performa yang canggih pada beberapa benchmark publik dan memiliki jendela konteks 128.000 token input dengan berbagai penggunaan komersial yang diizinkan. Bersamaan dengan model parameter 405 miliar, Meta merilis versi terbaru dari Llama3 70B (70 miliar parameter) dan 8B (8 miliar parameter). Bobot model tersedia untuk diunduh di situs web Meta.

    +

    Wawasan utama adalah bahwa menyempurnakan data yang dihasilkan dapat meningkatkan kinerja, tetapi contoh berkualitas buruk dapat menurunkannya. Tim Llama bekerja secara ekstensif untuk mengidentifikasi dan menghapus contoh-contoh yang buruk ini dengan menggunakan model itu sendiri, model tambahan, dan alat bantu lainnya.

    +

    Membangun dan Melakukan Pengambilan RAG dengan Milvus

    Siapkan dataset Anda.

    Saya menggunakan dokumentasi resmi Milvus sebagai dataset untuk demo ini, yang saya unduh dan simpan secara lokal.

    +
    from langchain.document_loaders import DirectoryLoader
    +# Load HTML files already saved in a local directory
    +path = "../../RAG/rtdocs_new/"
    +global_pattern = '*.html'
    +loader = DirectoryLoader(path=path, glob=global_pattern)
    +docs = loader.load()
    +
    +
    +# Print num documents and a preview.
    +print(f"loaded {len(docs)} documents")
    +print(docs[0].page_content)
    +pprint.pprint(docs[0].metadata)
    +
    +
    loaded 22 documents
    +Why Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...
    +{'source': 'https://milvus.io/docs/quickstart.md'}
    +
    +

    Unduh model penyematan.

    Selanjutnya, unduh model penyematan sumber terbuka gratis dari HuggingFace.

    +
    import torch
    +from sentence_transformers import SentenceTransformer
    +
    +
    +# Initialize torch settings for device-agnostic code.
    +N_GPU = torch.cuda.device_count()
    +DEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')
    +
    +
    +# Download the model from huggingface model hub.
    +model_name = "BAAI/bge-large-en-v1.5"
    +encoder = SentenceTransformer(model_name, device=DEVICE)
    +
    +
    +# Get the model parameters and save for later.
    +EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
    +MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
    +
    +
    +# Inspect model parameters.
    +print(f"model_name: {model_name}")
    +print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
    +print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
    +
    +
    model_name: BAAI/bge-large-en-v1.5
    +EMBEDDING_DIM: 1024
    +MAX_SEQ_LENGTH: 512
    +
    +

    Potong dan enkode data khusus Anda sebagai vektor.

    Saya akan menggunakan panjang tetap 512 karakter dengan 10% tumpang tindih.

    +
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    +
    +
    +CHUNK_SIZE = 512
    +chunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)
    +print(f"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}")
    +
    +
    +# Define the splitter.
    +child_splitter = RecursiveCharacterTextSplitter(
    +   chunk_size=CHUNK_SIZE,
    +   chunk_overlap=chunk_overlap)
    +
    +
    +# Chunk the docs.
    +chunks = child_splitter.split_documents(docs)
    +print(f"{len(docs)} docs split into {len(chunks)} child documents.")
    +
    +
    +# Encoder input is doc.page_content as strings.
    +list_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]
    +
    +
    +# Embedding inference using HuggingFace encoder.
    +embeddings = torch.tensor(encoder.encode(list_of_strings))
    +
    +
    +# Normalize the embeddings.
    +embeddings = np.array(embeddings / np.linalg.norm(embeddings))
    +
    +
    +# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.
    +converted_values = list(map(np.float32, embeddings))
    +
    +
    +# Create dict_list for Milvus insertion.
    +dict_list = []
    +for chunk, vector in zip(chunks, converted_values):
    +   # Assemble embedding vector, original text chunk, metadata.
    +   chunk_dict = {
    +       'chunk': chunk.page_content,
    +       'source': chunk.metadata.get('source', ""),
    +       'vector': vector,
    +   }
    +   dict_list.append(chunk_dict)
    +
    +
    chunk_size: 512, chunk_overlap: 51.0
    +22 docs split into 355 child documents.
    +
    +

    Simpan vektor di Milvus.

    Masukkan penyematan vektor yang telah disandikan ke dalam basis data vektor Milvus.

    +
    # Connect a client to the Milvus Lite server.
    +from pymilvus import MilvusClient
    +mc = MilvusClient("milvus_demo.db")
    +
    +
    +# Create a collection with flexible schema and AUTOINDEX.
    +COLLECTION_NAME = "MilvusDocs"
    +mc.create_collection(COLLECTION_NAME,
    +       EMBEDDING_DIM,
    +       consistency_level="Eventually",
    +       auto_id=True, 
    +       overwrite=True)
    +
    +
    +# Insert data into the Milvus collection.
    +print("Start inserting entities")
    +start_time = time.time()
    +mc.insert(
    +   COLLECTION_NAME,
    +   data=dict_list,
    +   progress_bar=True)
    +
    +
    +end_time = time.time()
    +print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
    +print(f"{round(end_time - start_time, 2)} seconds")
    +
    +
    Start inserting entities
    +Milvus insert time for 355 vectors: 0.2 seconds
    +
    +

    Ajukan sebuah pertanyaan dan cari potongan tetangga terdekat dari basis pengetahuan Anda di Milvus.

    +
    SAMPLE_QUESTION = "What do the parameters for HNSW mean?"
    +
    +
    +# Embed the question using the same encoder.
    +query_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))
    +# Normalize embeddings to unit length.
    +query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
    +# Convert the embeddings to list of list of np.float32.
    +query_embeddings = list(map(np.float32, query_embeddings))
    +
    +
    +# Define metadata fields you can filter on.
    +OUTPUT_FIELDS = list(dict_list[0].keys())
    +OUTPUT_FIELDS.remove('vector')
    +
    +
    +# Define how many top-k results you want to retrieve.
    +TOP_K = 2
    +
    +
    +# Run semantic vector search using your query and the vector database.
    +results = mc.search(
    +    COLLECTION_NAME,
    +    data=query_embeddings,
    +    output_fields=OUTPUT_FIELDS,
    +    limit=TOP_K,
    +    consistency_level="Eventually")
    +
    +

    Hasil yang didapat adalah seperti yang ditunjukkan di bawah ini.

    +
    Retrieved result #1
    +distance = 0.7001987099647522
    +('Chunk text: layer, finds the node closest to the target in this layer, and'
    +...
    +'outgoing')
    +source: https://milvus.io/docs/index.md
    +
    +Retrieved result #2
    +distance = 0.6953287124633789
    +('Chunk text: this value can improve recall rate at the cost of increased'
    +...
    +'to the target')
    +source: https://milvus.io/docs/index.md
    +
    +

    Membangun dan Melakukan Pembangkitan RAG dengan vLLM dan Llama 3.1-8B

    Instal vLLM dan model-model dari HuggingFace

    vLLM mengunduh model bahasa yang besar dari HuggingFace secara default. Secara umum, kapan pun Anda ingin menggunakan model baru di HuggingFace, Anda harus melakukan instalasi pip --upgrade atau -U. Selain itu, Anda juga membutuhkan GPU untuk menjalankan inferensi model Llama 3.1 Meta dengan vLLM.

    +

    Untuk daftar lengkap semua model yang didukung vLLM, lihat halaman dokumentasi ini.

    +
    # (Recommended) Create a new conda environment.
    +conda create -n myenv python=3.11 -y
    +conda activate myenv
    +
    +
    +# Install vLLM with CUDA 12.1.
    +pip install -U vllm transformers torch
    +
    +
    +import vllm, torch
    +from vllm import LLM, SamplingParams
    +
    +
    +# Clear the GPU memory cache.
    +torch.cuda.empty_cache()
    +
    +
    +# Check the GPU.
    +!nvidia-smi
    +
    +

    Untuk mempelajari lebih lanjut tentang cara memasang vLLM, lihat halaman pemasangannya.

    +

    Dapatkan token HuggingFace.

    Beberapa model pada HuggingFace, seperti Meta Llama 3.1, mengharuskan pengguna untuk menerima lisensinya sebelum dapat mengunduh timbangan. Oleh karena itu, Anda harus membuat akun HuggingFace, menerima lisensi model, dan menghasilkan token.

    +

    Ketika mengunjungi halaman Llama3.1 ini di HuggingFace, Anda akan mendapatkan pesan yang meminta Anda untuk menyetujui persyaratan. Klik "Terima Lisensi" untuk menerima persyaratan Meta sebelum mengunduh bobot model. Persetujuan biasanya membutuhkan waktu kurang dari satu hari.

    +

    Setelah Anda menerima persetujuan, Anda harus membuat token HuggingFace yang baru. Token lama Anda tidak akan berfungsi dengan izin yang baru.

    +

    Sebelum memasang vLLM, masuk ke HuggingFace dengan token baru Anda. Di bawah ini, saya menggunakan rahasia Colab untuk menyimpan token.

    +
    # Login to HuggingFace using your new token.
    +from huggingface_hub import login
    +from google.colab import userdata
    +hf_token = userdata.get('HF_TOKEN')
    +login(token = hf_token, add_to_git_credential=True)
    +
    +

    Menjalankan Pembuatan RAG

    Dalam demo, kami menjalankan model Llama-3.1-8B, yang membutuhkan GPU dan memori yang cukup besar untuk menjalankannya. Contoh berikut ini dijalankan di Google Colab Pro ($10/bulan) dengan GPU A100. Untuk mempelajari lebih lanjut tentang cara menjalankan vLLM, Anda dapat melihat dokumentasi Quickstart.

    +
    # 1. Choose a model
    +MODELTORUN = "meta-llama/Meta-Llama-3.1-8B-Instruct"
    +
    +
    +# 2. Clear the GPU memory cache, you're going to need it all!
    +torch.cuda.empty_cache()
    +
    +
    +# 3. Instantiate a vLLM model instance.
    +llm = LLM(model=MODELTORUN,
    +         enforce_eager=True,
    +         dtype=torch.bfloat16,
    +         gpu_memory_utilization=0.5,
    +         max_model_len=1000,
    +         seed=415,
    +         max_num_batched_tokens=3000)
    +
    +

    Tulis pertanyaan menggunakan konteks dan sumber yang diambil dari Milvus.

    +
    # Separate all the context together by space.
    +contexts_combined = ' '.join(contexts)
    +# Lance Martin, LangChain, says put the best contexts at the end.
    +contexts_combined = ' '.join(reversed(contexts))
    +
    +
    +# Separate all the unique sources together by comma.
    +source_combined = ' '.join(reversed(list(dict.fromkeys(sources))))
    +
    +
    +SYSTEM_PROMPT = f"""First, check if the provided Context is relevant to
    +the user's question.  Second, only if the provided Context is strongly relevant, answer the question using the Context.  Otherwise, if the Context is not strongly relevant, answer the question without using the Context. 
    +Be clear, concise, relevant.  Answer clearly, in fewer than 2 sentences.
    +Grounding sources: {source_combined}
    +Context: {contexts_combined}
    +User's question: {SAMPLE_QUESTION}
    +"""
    +
    +
    +prompts = [SYSTEM_PROMPT]
    +
    +

    Sekarang, buatlah jawaban dengan menggunakan potongan-potongan yang diambil dan pertanyaan asli yang dimasukkan ke dalam prompt.

    +
    # Sampling parameters
    +sampling_params = SamplingParams(temperature=0.2, top_p=0.95)
    +
    +
    +# Invoke the vLLM model.
    +outputs = llm.generate(prompts, sampling_params)
    +
    +
    +# Print the outputs.
    +for output in outputs:
    +   prompt = output.prompt
    +   generated_text = output.outputs[0].text
    +   # !r calls repr(), which prints a string inside quotes.
    +   print()
    +   print(f"Question: {SAMPLE_QUESTION!r}")
    +   pprint.pprint(f"Generated text: {generated_text!r}")
    +
    +
    Question: 'What do the parameters for HNSW MEAN!?'
    +Generated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '
    +'* M: The maximum degree of nodes on each layer oof the graph, which can improve '
    +'recall rate at the cost of increased search time. * efConstruction and ef: ' 
    +'These parameters specify a search range when building or searching an index.'
    +
    +

    Jawaban di atas terlihat sempurna bagi saya!

    +

    Jika Anda tertarik dengan demo ini, silakan mencobanya sendiri dan beritahu kami pendapat Anda. Anda juga dapat bergabung dengan komunitas Milvus kami di Discord untuk berdiskusi dengan para pengembang GenAI secara langsung.

    +

    Referensi

    diff --git a/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.json b/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.json new file mode 100644 index 000000000..a24243c56 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install mem0ai pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Define Config\nfrom mem0 import Memory\n\nconfig = {\n \"vector_store\": {\n \"provider\": \"milvus\",\n \"config\": {\n \"collection_name\": \"quickstart_mem0_with_milvus\",\n \"embedding_model_dims\": \"1536\",\n \"url\": \"./milvus.db\", # Use local vector database for demo purpose\n },\n },\n \"version\": \"v1.1\",\n}\n\nm = Memory.from_config(config)\n","# Add a memory to user: Working on improving tennis skills\nres = m.add(\n messages=\"I am working on improving my tennis skills.\",\n user_id=\"alice\",\n metadata={\"category\": \"hobbies\"},\n)\n\nres\n","# Get memory_id\nmemory_id = res[\"results\"][0][\"id\"]\n\n# Update this memory with new information: Likes to play tennis on weekends\nm.update(memory_id=memory_id, data=\"Likes to play tennis on weekends\")\n","# Get all memory for the user Alice\nm.get_all(user_id=\"alice\")\n","m.history(memory_id=memory_id)\n","new_mem = m.add(\n \"I have a linear algebra midterm exam on November 20\",\n user_id=\"alice\",\n metadata={\"category\": \"task\"},\n)\n","m.get_all(user_id=\"alice\")\n","m.search(query=\"What are Alice's hobbies\", user_id=\"alice\")\n","m.delete(memory_id=memory_id)\n\nm.get_all(\"alice\")\n"],"headingContent":"Getting Started with Mem0 and Milvus","anchorList":[{"label":"Memulai dengan Mem0 dan Milvus","href":"Getting-Started-with-Mem0-and-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Mengelola Memori Pengguna dengan Mem0 dan Milvus","href":"Managing-User-Memories-with-Mem0-and-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.md b/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.md new file mode 100644 index 000000000..6a52a07d6 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/quickstart_mem0_with_milvus.md @@ -0,0 +1,217 @@ +--- +id: quickstart_mem0_with_milvus.md +summary: >- + Dalam tutorial ini, kita akan membahas operasi manajemen memori Mem0 yang + penting-menambahkan, mengambil, memperbarui, mencari, menghapus, dan melacak + riwayat memori-menggunakan Milvus, basis data vektor sumber terbuka berkinerja + tinggi yang mendukung penyimpanan dan pengambilan yang efisien. Pengenalan + langsung ini akan memandu Anda melalui operasi memori dasar untuk membantu + Anda membangun interaksi AI yang dipersonalisasi dengan Mem0 dan Milvus. +title: Memulai dengan Mem0 dan Milvus +--- +

    Memulai dengan Mem0 dan Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Mem0 adalah lapisan memori cerdas untuk aplikasi AI, yang dirancang untuk menghadirkan interaksi yang dipersonalisasi dan efisien dengan mempertahankan preferensi pengguna dan terus beradaptasi dari waktu ke waktu. Ideal untuk chatbot dan alat yang digerakkan oleh AI, Mem0 menciptakan pengalaman yang mulus dan sesuai dengan konteks.

    +

    Dalam tutorial ini, kita akan membahas operasi manajemen memori Mem0 yang penting-menambahkan, mengambil, memperbarui, mencari, menghapus, dan melacak riwayat memori-menggunakan Milvus, basis data vektor sumber terbuka berkinerja tinggi yang mendukung penyimpanan dan pengambilan yang efisien. Pengenalan langsung ini akan memandu Anda melalui operasi memori dasar untuk membantu Anda membangun interaksi AI yang dipersonalisasi dengan Mem0 dan Milvus.

    +

    Persiapan

    Unduh pustaka yang diperlukan

    $ pip install mem0ai pymilvus
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Mengkonfigurasi Mem0 dengan Milvus

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Sekarang, kita dapat mengonfigurasi Mem0 untuk menggunakan Milvus sebagai penyimpan vektor

    +
    # Define Config
    +from mem0 import Memory
    +
    +config = {
    +    "vector_store": {
    +        "provider": "milvus",
    +        "config": {
    +            "collection_name": "quickstart_mem0_with_milvus",
    +            "embedding_model_dims": "1536",
    +            "url": "./milvus.db",  # Use local vector database for demo purpose
    +        },
    +    },
    +    "version": "v1.1",
    +}
    +
    +m = Memory.from_config(config)
    +
    +
    +
    +
      +
    • Jika Anda hanya membutuhkan basis data vektor lokal untuk data skala kecil atau pembuatan prototipe, mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi di Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan kunci API di Zilliz Cloud.
    • +
    +
    +
    +

    Mengelola Memori Pengguna dengan Mem0 dan Milvus

    Menambahkan Memori

    Fungsi add menyimpan teks tidak terstruktur di Milvus sebagai memori, mengaitkannya dengan pengguna tertentu dan metadata opsional.

    +

    Di sini, kita menambahkan memori Alice, "bekerja untuk meningkatkan kemampuan tenis saya," bersama dengan metadata yang relevan untuk konteks Milvus.

    +
    # Add a memory to user: Working on improving tennis skills
    +res = m.add(
    +    messages="I am working on improving my tennis skills.",
    +    user_id="alice",
    +    metadata={"category": "hobbies"},
    +)
    +
    +res
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Working on improving tennis skills',
    +   'event': 'ADD'}],
    + 'relations': []}
    +
    +

    Memperbarui Memori

    Kita dapat menggunakan nilai balik fungsi add untuk mengambil ID memori, yang memungkinkan kita untuk memperbarui memori ini dengan informasi baru melalui update.

    +
    # Get memory_id
    +memory_id = res["results"][0]["id"]
    +
    +# Update this memory with new information: Likes to play tennis on weekends
    +m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
    +
    +
    {'message': 'Memory updated successfully!'}
    +
    +

    Mendapatkan Semua Memori Untuk Seorang Pengguna

    Kita dapat menggunakan fungsi get_all untuk melihat semua memori yang disisipkan atau memfilter dengan user_id di Milvus.

    +

    Perhatikan bahwa kita dapat melihat memori sekarang berubah dari "Bekerja untuk meningkatkan kemampuan tenis" menjadi "Suka bermain tenis di akhir pekan".

    +
    # Get all memory for the user Alice
    +m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'}]}
    +
    +

    Melihat Riwayat Pembaruan Memori

    Kita juga dapat melihat riwayat pembaruan memori dengan menentukan memory_id mana yang kita minati melalui fungsi history.

    +
    m.history(memory_id=memory_id)
    +
    +
    [{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': None,
    +  'new_memory': 'Working on improving tennis skills',
    +  'event': 'ADD',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': None},
    + {'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': 'Working on improving tennis skills',
    +  'new_memory': 'Likes to play tennis on weekends',
    +  'event': 'UPDATE',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
    +
    +

    Cari Memori

    Kita dapat menggunakan fungsi search untuk mencari memori yang paling berhubungan dengan pengguna.

    +

    Mari kita mulai dengan menambahkan memori lain untuk Alice.

    +
    new_mem = m.add(
    +    "I have a linear algebra midterm exam on November 20",
    +    user_id="alice",
    +    metadata={"category": "task"},
    +)
    +
    +

    Sekarang, kita panggil get_all dengan menyebutkan user_id untuk memverifikasi bahwa kita memang memiliki 2 entri memori untuk user Alice.

    +
    m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    Kita dapat melakukan search sekarang dengan menyediakan query dan user_id. Perhatikan bahwa kita secara default menggunakan metrik L2 untuk pencarian kemiripan, jadi score yang lebih kecil berarti kemiripan yang lebih besar.

    +
    m.search(query="What are Alice's hobbies", user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'score': 1.2807445526123047,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'score': 1.728922724723816,
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    Menghapus Memori

    Kita juga dapat delete sebuah memori dengan memberikan memory_id yang sesuai.

    +

    Kita akan menghapus memori "Suka bermain tenis di akhir pekan" karena memory_id telah diambil, dan memanggil get_all untuk memverifikasi bahwa penghapusan telah berhasil.

    +
    m.delete(memory_id=memory_id)
    +
    +m.get_all("alice")
    +
    +
    {'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    diff --git a/localization/v2.5.x/site/id/integrations/rag_with_langflow.json b/localization/v2.5.x/site/id/integrations/rag_with_langflow.json new file mode 100644 index 000000000..fb40a3339 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/rag_with_langflow.json @@ -0,0 +1 @@ +{"codeList":["$ python -m pip install langflow -U\n","$ python -m langflow run\n"],"headingContent":"Building a RAG System Using Langflow with Milvus","anchorList":[{"label":"Membangun Sistem RAG Menggunakan Langflow dengan Milvus","href":"Building-a-RAG-System-Using-Langflow-with-Milvus","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Tutorial","href":"Tutorial","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/rag_with_langflow.md b/localization/v2.5.x/site/id/integrations/rag_with_langflow.md new file mode 100644 index 000000000..d9e4421f0 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/rag_with_langflow.md @@ -0,0 +1,84 @@ +--- +id: rag_with_langflow.md +summary: >- + Panduan ini mendemonstrasikan cara menggunakan Langflow untuk membuat pipeline + Retrieval-Augmented Generation (RAG) dengan Milvus. +title: Membangun Sistem RAG Menggunakan Langflow dengan Milvus +--- +

    Membangun Sistem RAG Menggunakan Langflow dengan Milvus

    Panduan ini mendemonstrasikan cara menggunakan Langflow untuk membangun pipeline Retrieval-Augmented Generation (RAG) dengan Milvus.

    +

    Sistem RAG meningkatkan pembuatan teks dengan pertama-tama mengambil dokumen yang relevan dari basis pengetahuan dan kemudian menghasilkan respons baru berdasarkan konteks ini. Milvus digunakan untuk menyimpan dan mengambil penyematan teks, sementara Langflow memfasilitasi integrasi pengambilan dan pembuatan dalam alur kerja visual.

    +

    Langflow memungkinkan konstruksi yang mudah dari pipa RAG, di mana potongan-potongan teks disematkan, disimpan di Milvus, dan diambil ketika kueri yang relevan dibuat. Hal ini memungkinkan model bahasa untuk menghasilkan respons yang sesuai dengan konteks.

    +

    Milvus berfungsi sebagai basis data vektor yang dapat diskalakan yang dengan cepat menemukan teks yang mirip secara semantik, sementara Langflow memungkinkan Anda untuk mengatur bagaimana pipeline Anda menangani pengambilan teks dan pembuatan respons. Bersama-sama, keduanya menyediakan cara yang efisien untuk membangun pipeline RAG yang kuat untuk aplikasi berbasis teks yang disempurnakan.

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal dependensi berikut ini:

    +
    $ python -m pip install langflow -U
    +
    +

    Tutorial

    Setelah semua dependensi terinstal, mulai dasbor Langflow dengan mengetikkan perintah berikut:

    +
    $ python -m langflow run
    +
    +

    Kemudian sebuah dashboard akan muncul seperti yang ditunjukkan di bawah ini: langflowlangflow

    +

    Kita ingin membuat sebuah proyek Vector Store, jadi pertama-tama kita perlu mengklik tombol New Project. Sebuah panel akan muncul, dan kita pilih opsi Vector Store RAG: panelpanel

    +

    Setelah proyek Vector Store Rag berhasil dibuat, penyimpanan vektor defaultnya adalah AstraDB, sedangkan kita ingin menggunakan Milvus. Jadi kita perlu mengganti kedua modul astraDB ini dengan Milvus agar dapat menggunakan Milvus sebagai vektor store. astraDBastraDB

    +

    Langkah-langkah untuk mengganti astraDB dengan Milvus:

      +
    1. Hapus kartu-kartu yang ada di Vector Store. Klik pada dua kartu AstraDB yang ditandai dengan warna merah pada gambar di atas, dan tekan backspace untuk menghapusnya.
    2. +
    3. Klik pada opsi Vector Store pada bilah sisi, pilih Milvus dan seret ke dalam kanvas. Lakukan ini dua kali karena kita membutuhkan 2 kartu Milvus, satu untuk menyimpan alur kerja pemrosesan file dan satu lagi untuk alur kerja pencarian.
    4. +
    5. Tautkan Modul Milvus ke komponen lainnya. Lihat gambar di bawah ini untuk referensi.
    6. +
    7. Konfigurasikan kredensial Milvus untuk kedua modul Milvus. Cara yang paling sederhana adalah dengan menggunakan Milvus Lite dengan mengatur Connection URI ke milvus_demo.db. Jika Anda memiliki server Milvus yang digunakan sendiri atau di Zilliz Cloud, atur Connection URI ke server endpoint dan Connection Password ke token (untuk Milvus yang digabungkan ":", untuk Zilliz Cloud adalah API Key). Lihat gambar di bawah ini untuk referensi:
    8. +
    +

    + + Milvus Structure demo + Demo Struktur Milvus

    +

    Menanamkan pengetahuan ke dalam sistem RAG

      +
    1. Unggah sebuah file sebagai basis pengetahuan LLM melalui modul file di bagian kiri bawah. Di sini kami mengunggah sebuah file yang berisi pengenalan singkat tentang Milvus
    2. +
    3. Jalankan alur kerja penyisipan dengan menekan tombol run pada modul Milvus di kanan bawah. Ini akan menyisipkan pengetahuan ke dalam penyimpanan vektor Milvus
    4. +
    5. Uji apakah pengetahuan tersebut ada di dalam memori. Buka playground dan tanyakan apa saja yang berhubungan dengan file yang Anda unggah.
    6. +
    +

    + + why milvus + mengapa milvus

    diff --git a/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.json b/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.json new file mode 100644 index 000000000..bf8543195 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -qU \"unstructured-ingest[pdf]\" unstructured pymilvus openai\n","import os\n\n\nos.environ[\"UNSTRUCTURED_API_KEY\"] = \"***********\"\nos.environ[\"UNSTRUCTURED_URL\"] = \"***********\"\n\nos.environ[\"OPENAI_API_KEY\"] = \"***********\"\n","from pymilvus import MilvusClient, DataType\n\n# Initialize Milvus client\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\") # TODO\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n\n\ndef emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","# Create schema\nschema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)\n# Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=65535)\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)\nindex_params = MilvusClient.prepare_index_params()\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"AUTOINDEX\",\n)\nmilvus_client.create_collection(\n collection_name=collection_name,\n schema=schema,\n index_params=index_params,\n consistency_level=\"Strong\",\n)\n\nmilvus_client.load_collection(collection_name=collection_name)\n","from unstructured_ingest.v2.pipeline.pipeline import Pipeline\nfrom unstructured_ingest.v2.interfaces import ProcessorConfig\nfrom unstructured_ingest.v2.processes.connectors.local import (\n LocalIndexerConfig,\n LocalDownloaderConfig,\n LocalConnectionConfig,\n LocalUploaderConfig,\n)\nfrom unstructured_ingest.v2.processes.partitioner import PartitionerConfig\n\ndirectory_with_pdfs = \"./pdf_files\"\ndirectory_with_results = \"./pdf_processed_outputs\"\n\nPipeline.from_configs(\n context=ProcessorConfig(),\n indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),\n downloader_config=LocalDownloaderConfig(),\n source_connection_config=LocalConnectionConfig(),\n partitioner_config=PartitionerConfig(\n partition_by_api=True,\n api_key=os.getenv(\"UNSTRUCTURED_API_KEY\"),\n partition_endpoint=os.getenv(\"UNSTRUCTURED_API_URL\"),\n strategy=\"hi_res\",\n additional_partition_args={\n \"split_pdf_page\": True,\n \"split_pdf_concurrency_level\": 15,\n },\n ),\n uploader_config=LocalUploaderConfig(output_dir=directory_with_results),\n).run()\n\n\nfrom unstructured.staging.base import elements_from_json\n\n\ndef load_processed_files(directory_path):\n elements = []\n for filename in os.listdir(directory_path):\n if filename.endswith(\".json\"):\n file_path = os.path.join(directory_path, filename)\n try:\n elements.extend(elements_from_json(filename=file_path))\n except IOError:\n print(f\"Error: Could not read file {filename}.\")\n\n return elements\n\n\nelements = load_processed_files(directory_with_results)\n","data = []\nfor i, element in enumerate(elements):\n data.append(\n {\n \"id\": i,\n \"vector\": emb_text(element.text),\n \"text\": element.text,\n \"metadata\": element.metadata.to_dict(),\n }\n )\nmilvus_client.insert(collection_name=collection_name, data=data)\n","def retrieve_documents(question, top_k=3):\n search_res = milvus_client.search(\n collection_name=collection_name,\n data=[emb_text(question)],\n limit=top_k,\n # search_params={\"metric_type\": \"IP\", \"params\": {}},\n output_fields=[\"text\"],\n )\n return [(res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]]\n","def generate_rag_response(question):\n retrieved_docs = retrieve_documents(question)\n context = \"\\n\".join([f\"Text: {doc[0]}\\n\" for doc in retrieved_docs])\n system_prompt = (\n \"You are an AI assistant. Provide answers based on the given context.\"\n )\n user_prompt = f\"\"\"\n Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.\n \n Context:\n {context}\n \n Question: {question}\n \"\"\"\n response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": system_prompt},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n return response.choices[0].message.content\n","question = \"What is the Advanced Search Algorithms in Milvus?\"\nanswer = generate_rag_response(question)\nprint(f\"Question: {question}\")\nprint(f\"Answer: {answer}\")\n"],"headingContent":"Build a RAG with Milvus and Unstructured","anchorList":[{"label":"Membangun RAG dengan Milvus dan Unstructured","href":"Build-a-RAG-with-Milvus-and-Unstructured","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Membuat Koleksi Milvus","href":"Create-Milvus-Collection","type":2,"isActive":false},{"label":"Memuat data dari Unstructured","href":"Load-data-from-Unstructured","type":2,"isActive":false},{"label":"Mengambil dan Menghasilkan Respon","href":"Retrieve-and-Generate-Response","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.md b/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.md new file mode 100644 index 000000000..19a174522 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/rag_with_milvus_and_unstructured.md @@ -0,0 +1,289 @@ +--- +id: rag_with_milvus_and_unstructured.md +summary: >- + Dalam tutorial ini, kita akan menggunakan Unstructured untuk menelan dokumen + PDF dan kemudian menggunakan Milvus untuk membangun pipeline RAG. +title: Membangun RAG dengan Milvus dan Unstructured +--- +

    Membangun RAG dengan Milvus dan Unstructured

    +Open In Colab + + +GitHub Repository +

    +

    Unstructured menyediakan platform dan alat untuk menelan dan memproses dokumen tak terstruktur untuk Retrieval Augmented Generation (RAG) dan penyempurnaan model. Platform ini menawarkan platform UI tanpa kode dan layanan API tanpa server, yang memungkinkan pengguna untuk memproses data pada sumber daya komputasi yang dihosting oleh Unstructured.

    +

    Dalam tutorial ini, kita akan menggunakan Unstructured untuk mengambil dokumen PDF dan kemudian menggunakan Milvus untuk membangun pipeline RAG.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install -qU "unstructured-ingest[pdf]" unstructured pymilvus openai
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja terinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Anda dapat memperoleh variabel lingkungan UNSTRUCTURED_API_KEY dan UNSTRUCTURED_URL dari sini.

    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +
    +os.environ["UNSTRUCTURED_API_KEY"] = "***********"
    +os.environ["UNSTRUCTURED_URL"] = "***********"
    +
    +os.environ["OPENAI_API_KEY"] = "***********"
    +
    +

    Menyiapkan klien Milvus dan OpenAI

    Anda dapat menggunakan klien Milvus untuk membuat koleksi Milvus dan memasukkan data ke dalamnya.

    +
    from pymilvus import MilvusClient, DataType
    +
    +# Initialize Milvus client
    +milvus_client = MilvusClient(uri="./milvus_demo.db")  # TODO
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Siapkan klien OpenAI untuk menghasilkan embedding dan menghasilkan respons.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +
    +def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Hasilkan embedding uji coba dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    Membuat Koleksi Milvus

    Kita akan membuat sebuah koleksi dengan skema berikut ini:

    +
      +
    • id: kunci utama, yang merupakan pengenal unik untuk setiap dokumen.
    • +
    • vector: penyematan dokumen.
    • +
    • text: konten teks dari dokumen.
    • +
    • metadata: metadata dari dokumen.
    • +
    +

    Kemudian kita membangun sebuah indeks AUTOINDEX pada bidang vector. Dan kemudian buatlah koleksinya.

    +
    # Create schema
    +schema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)
    +# Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)
    +index_params = MilvusClient.prepare_index_params()
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="AUTOINDEX",
    +)
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    schema=schema,
    +    index_params=index_params,
    +    consistency_level="Strong",
    +)
    +
    +milvus_client.load_collection(collection_name=collection_name)
    +
    +

    Memuat data dari Unstructured

    Unstructured menyediakan pipeline ingestion yang fleksibel dan kuat untuk memproses berbagai jenis file, termasuk PDF, HTML, dan lainnya. Kita akan menggunakan fungsionalitas ingest untuk mempartisi file PDF di direktori lokal. Dan kemudian memasukkan data ke dalam Milvus.

    +
    from unstructured_ingest.v2.pipeline.pipeline import Pipeline
    +from unstructured_ingest.v2.interfaces import ProcessorConfig
    +from unstructured_ingest.v2.processes.connectors.local import (
    +    LocalIndexerConfig,
    +    LocalDownloaderConfig,
    +    LocalConnectionConfig,
    +    LocalUploaderConfig,
    +)
    +from unstructured_ingest.v2.processes.partitioner import PartitionerConfig
    +
    +directory_with_pdfs = "./pdf_files"
    +directory_with_results = "./pdf_processed_outputs"
    +
    +Pipeline.from_configs(
    +    context=ProcessorConfig(),
    +    indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),
    +    downloader_config=LocalDownloaderConfig(),
    +    source_connection_config=LocalConnectionConfig(),
    +    partitioner_config=PartitionerConfig(
    +        partition_by_api=True,
    +        api_key=os.getenv("UNSTRUCTURED_API_KEY"),
    +        partition_endpoint=os.getenv("UNSTRUCTURED_API_URL"),
    +        strategy="hi_res",
    +        additional_partition_args={
    +            "split_pdf_page": True,
    +            "split_pdf_concurrency_level": 15,
    +        },
    +    ),
    +    uploader_config=LocalUploaderConfig(output_dir=directory_with_results),
    +).run()
    +
    +
    +from unstructured.staging.base import elements_from_json
    +
    +
    +def load_processed_files(directory_path):
    +    elements = []
    +    for filename in os.listdir(directory_path):
    +        if filename.endswith(".json"):
    +            file_path = os.path.join(directory_path, filename)
    +            try:
    +                elements.extend(elements_from_json(filename=file_path))
    +            except IOError:
    +                print(f"Error: Could not read file {filename}.")
    +
    +    return elements
    +
    +
    +elements = load_processed_files(directory_with_results)
    +
    +

    Memasukkan data ke dalam Milvus.

    +
    data = []
    +for i, element in enumerate(elements):
    +    data.append(
    +        {
    +            "id": i,
    +            "vector": emb_text(element.text),
    +            "text": element.text,
    +            "metadata": element.metadata.to_dict(),
    +        }
    +    )
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +

    Mengambil dan Menghasilkan Respon

    Mendefinisikan sebuah fungsi untuk mengambil dokumen yang relevan dari Milvus.

    +
    def retrieve_documents(question, top_k=3):
    +    search_res = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[emb_text(question)],
    +        limit=top_k,
    +        # search_params={"metric_type": "IP", "params": {}},
    +        output_fields=["text"],
    +    )
    +    return [(res["entity"]["text"], res["distance"]) for res in search_res[0]]
    +
    +

    Tentukan sebuah fungsi untuk menghasilkan respon menggunakan dokumen yang diambil dalam pipeline RAG.

    +
    def generate_rag_response(question):
    +    retrieved_docs = retrieve_documents(question)
    +    context = "\n".join([f"Text: {doc[0]}\n" for doc in retrieved_docs])
    +    system_prompt = (
    +        "You are an AI assistant. Provide answers based on the given context."
    +    )
    +    user_prompt = f"""
    +    Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.
    +    
    +    Context:
    +    {context}
    +    
    +    Question: {question}
    +    """
    +    response = openai_client.chat.completions.create(
    +        model="gpt-4o-mini",
    +        messages=[
    +            {"role": "system", "content": system_prompt},
    +            {"role": "user", "content": user_prompt},
    +        ],
    +    )
    +    return response.choices[0].message.content
    +
    +

    Mari kita uji pipeline RAG dengan sebuah contoh pertanyaan.

    +
    question = "What is the Advanced Search Algorithms in Milvus?"
    +answer = generate_rag_response(question)
    +print(f"Question: {question}")
    +print(f"Answer: {answer}")
    +
    +
    INFO: HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +INFO: HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +
    +
    +Question: What is the Advanced Search Algorithms in Milvus?
    +Answer: The Advanced Search Algorithms in Milvus refer to a wide range of in-memory and on-disk indexing/search algorithms it supports, including IVF, HNSW, DiskANN, and more. These algorithms have been deeply optimized, and Milvus delivers 30%-70% better performance compared to popular implementations like FAISS and HNSWLib.
    +
    diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.json b/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.json new file mode 100644 index 000000000..e09202b45 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/arc53/DocsGPT.git\n$ cd DocsGPT\n","$ echo \"\\nlangchain-milvus==0.1.6\" >> ./application/requirements.txt\n"," backend:\n build: ./application\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n"," worker:\n build: ./application\n command: celery -A application.app.celery worker -l INFO -B\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n","$ docker compose down\n"],"headingContent":"Use Milvus in DocsGPT","anchorList":[{"label":"Gunakan Milvus di DocsGPT","href":"Use-Milvus-in-DocsGPT","type":1,"isActive":false},{"label":"Persyaratan","href":"Requirements","type":2,"isActive":false},{"label":"Kloning repositori","href":"Clone-the-repository","type":2,"isActive":false},{"label":"Tambahkan ketergantungan","href":"Add-dependency","type":2,"isActive":false},{"label":"Mengatur variabel lingkungan","href":"Set-environment-variables","type":2,"isActive":false},{"label":"Memulai layanan","href":"Start-the-services","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.md b/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.md new file mode 100644 index 000000000..49654f18b --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_in_docsgpt.md @@ -0,0 +1,142 @@ +--- +id: use_milvus_in_docsgpt.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Milvus + sebagai basis data vektor backend untuk DocsGPT. +title: Gunakan Milvus di DocsGPT +--- +

    Gunakan Milvus di DocsGPT

    DocsGPT adalah solusi sumber terbuka tingkat lanjut yang menyederhanakan pencarian informasi dalam dokumentasi proyek dengan mengintegrasikan model GPT yang kuat. Hal ini memungkinkan pengembang untuk mendapatkan jawaban yang akurat atas pertanyaan mereka tentang proyek dengan mudah, menghilangkan pencarian manual yang memakan waktu.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Milvus sebagai basis data vektor backend untuk DocsGPT.

    +
    +

    Tutorial ini terutama mengacu pada panduan instalasi resmi DocsGPT. Jika Anda menemukan bahwa tutorial ini memiliki bagian yang sudah usang, Anda dapat memprioritaskan untuk mengikuti panduan resmi dan mengajukan pertanyaan kepada kami.

    +
    +

    Persyaratan

    Pastikan Anda telah menginstal Docker

    +

    Kloning repositori

    Kloning repositori dan arahkan ke sana:

    +
    $ git clone https://github.com/arc53/DocsGPT.git
    +$ cd DocsGPT
    +
    +

    Tambahkan ketergantungan

    Tambahkan ketergantungan langchain-milvus ke berkas requirements.txt di bawah folder application:

    +
    $ echo "\nlangchain-milvus==0.1.6" >> ./application/requirements.txt
    +
    +

    Mengatur variabel lingkungan

    Tambahkan VECTOR_STORE=milvus, MILVUS_URI=..., MILVUS_TOKEN=... ke variabel lingkungan untuk layanan backend dan worker di berkas docker-compose.yaml, seperti ini:

    +
      backend:
    +    build: ./application
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +
      worker:
    +    build: ./application
    +    command: celery -A application.app.celery worker -l INFO -B
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +

    Untuk MILVUS_URI dan MILVUS_TOKEN, Anda dapat menggunakan layanan Zilliz Cloud yang dikelola sepenuhnya (Direkomendasikan) atau layanan Milvus yang dimulai secara manual.

    +
      +
    • Untuk layanan Zillz Cloud yang dikelola sepenuhnya: Kami merekomendasikan untuk menggunakan layanan Zilliz Cloud. Anda dapat mendaftar untuk mendapatkan akun uji coba gratis di Zilliz Cloud. Setelah itu, Anda akan mendapatkan MILVUS_URI dan MILVUS_TOKEN, yang sesuai dengan Public Endpoint dan API key.

    • +
    • Untuk memulai layanan Milvus secara manual: Jika Anda ingin menyiapkan layanan Milvus, Anda dapat mengikuti dokumentasi resmi Milvus untuk menyiapkan server Milvus, dan kemudian mendapatkan MILVUS_URI dan MILVUS_TOKEN dari server. MILVUS_URI dan MILVUS_TOKEN harus dalam format http://<your_server_ip>:19530 dan <your_username>:<your_password>.

    • +
    +

    Memulai layanan

    Jalankan: ./setup.sh

    +

    Kemudian arahkan ke http://localhost:5173/.

    +

    Anda dapat bermain-main dengan UI dan mengajukan pertanyaan tentang dokumen Anda.

    +

    + + alt text + alt text

    +

    Jika Anda ingin menghentikan layanan, jalankan:

    +
    $ docker compose down
    +
    +

    Untuk detail lebih lanjut dan pengaturan yang lebih lanjut, silakan lihat dokumentasi resmi DocsGPT.

    diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.json b/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.json new file mode 100644 index 000000000..62149c801 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/zylon-ai/private-gpt\n$ cd private-gpt\n","$ brew install make\n","$ choco install make\n","$ poetry install --extras \"llms-ollama embeddings-ollama vector-stores-milvus ui\"\n","$ ollama serve\n","$ ollama pull llama3.1\n$ ollama pull nomic-embed-text\n","vectorstore:\n database: milvus\n","milvus:\n uri: http://localhost:19530\n collection_name: my_collection\n","PGPT_PROFILES=ollama make run\n"],"headingContent":"Use Milvus in PrivateGPT","anchorList":[{"label":"Gunakan Milvus di PrivateGPT","href":"Use-Milvus-in-PrivateGPT","type":1,"isActive":false},{"label":"Persyaratan dasar untuk menjalankan PrivateGPT","href":"Base-requirements-to-run-PrivateGPT","type":2,"isActive":false},{"label":"Instal Modul yang Tersedia","href":"Install-Available-Modules","type":2,"isActive":false},{"label":"Memulai layanan Ollama","href":"Start-Ollama-service","type":2,"isActive":false},{"label":"Mengubah Pengaturan Milvus","href":"Change-Milvus-Settings","type":2,"isActive":false},{"label":"Memulai PrivateGPT","href":"Start-PrivateGPT","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.md b/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.md new file mode 100644 index 000000000..a9685e60d --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_in_private_gpt.md @@ -0,0 +1,170 @@ +--- +id: use_milvus_in_private_gpt.md +summary: >- + Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Milvus + sebagai basis data vektor backend untuk PrivateGPT. +title: Gunakan Milvus di PrivateGPT +--- +

    Gunakan Milvus di PrivateGPT

    PrivateGPT adalah proyek AI siap produksi yang memungkinkan pengguna untuk mengajukan pertanyaan tentang dokumen mereka menggunakan Model Bahasa Besar tanpa koneksi internet sambil memastikan privasi 100%. PrivateGPT menawarkan API yang dibagi menjadi blok tingkat tinggi dan tingkat rendah. Ini juga menyediakan klien Gradio UI dan alat yang berguna seperti skrip pengunduhan model massal dan skrip konsumsi. Secara konseptual, PrivateGPT membungkus pipeline RAG dan mengekspos primitifnya, siap digunakan dan menyediakan implementasi penuh API dan pipeline RAG.

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara menggunakan Milvus sebagai basis data vektor backend untuk PrivateGPT.

    +
    +

    Tutorial ini terutama mengacu pada panduan instalasi resmi PrivateGPT. Jika Anda menemukan bahwa tutorial ini memiliki bagian yang sudah usang, Anda dapat memprioritaskan untuk mengikuti panduan resmi dan mengajukan pertanyaan kepada kami.

    +
    +

    Persyaratan dasar untuk menjalankan PrivateGPT

    1. Kloning Repositori PrivateGPT

    Kloning repositori dan arahkan ke sana:

    +
    $ git clone https://github.com/zylon-ai/private-gpt
    +$ cd private-gpt
    +
    +

    2. Instal Puisi

    Instal Puisi untuk manajemen ketergantungan: Ikuti petunjuk di situs web resmi Poetry untuk menginstalnya.

    +

    3. (Opsional) Instal make

    Untuk menjalankan berbagai skrip, Anda perlu menginstal make.

    +

    macOS (Menggunakan Homebrew):

    +
    $ brew install make
    +
    +

    Windows (Menggunakan Chocolatey):

    +
    $ choco install make
    +
    +

    Instal Modul yang Tersedia

    PrivateGPT memungkinkan kustomisasi penyiapan untuk beberapa modul, misalnya LLM, Embeddings, Vector Stores, UI.

    +

    Dalam tutorial ini, kita akan menggunakan modul-modul berikut:

    +
      +
    • LLM: Ollama
    • +
    • Embeddings: Ollama
    • +
    • Vector Stores: Milvus
    • +
    • UI Gradio
    • +
    +

    Jalankan perintah berikut untuk menggunakan puisi untuk menginstal ketergantungan modul yang diperlukan:

    +
    $ poetry install --extras "llms-ollama embeddings-ollama vector-stores-milvus ui"
    +
    +

    Memulai layanan Ollama

    Buka ollama.ai dan ikuti petunjuk untuk menginstal Ollama di komputer Anda.

    +

    Setelah instalasi, pastikan aplikasi desktop Ollama ditutup.

    +

    Sekarang, mulai layanan Ollama (ini akan memulai server inferensi lokal, yang melayani LLM dan Embeddings):

    +
    $ ollama serve
    +
    +

    Instal model yang akan digunakan, defaultnya settings-ollama.yaml dikonfigurasi untuk pengguna llama3.1 8b LLM (~4GB) dan nomic-embed-text Embeddings (~275MB)

    +

    Secara default, PrivateGPT akan secara otomatis menarik model sesuai kebutuhan. Perilaku ini dapat diubah dengan memodifikasi properti ollama.autopull_models.

    +

    Bagaimanapun, jika Anda ingin menarik model secara manual, jalankan perintah berikut:

    +
    $ ollama pull llama3.1
    +$ ollama pull nomic-embed-text
    +
    +

    Anda dapat secara opsional mengubah ke model favorit Anda di file settings-ollama.yaml dan menariknya secara manual.

    +

    Mengubah Pengaturan Milvus

    Dalam file settings-ollama.yaml, atur vectorstore ke milvus:

    +
    vectorstore:
    +  database: milvus
    +
    +

    Anda juga dapat menambahkan beberapa konfigurasi cumstom Milvus untuk menentukan pengaturan Anda. seperti ini:

    +
    milvus:
    +  uri: http://localhost:19530
    +  collection_name: my_collection
    +
    +

    Opsi konfigurasi yang tersedia adalah:

    + + + + + + + + + + +
    Opsi BidangDeskripsi
    uriDefault diatur ke "local_data/private_gpt/milvus/milvus_local.db" sebagai file lokal; Anda juga dapat mengatur server Milvus yang lebih berkinerja di docker atau k8s, misalnya http://localhost:19530, sebagai uri Anda; Untuk menggunakan Zilliz Cloud, sesuaikan uri dan token dengan Public Endpoint dan API key di Zilliz Cloud.
    tokenPasangkan dengan server Milvus di docker atau k8s atau kunci api zilliz cloud.
    nama_koleksiNama koleksi, setel ke default "milvus_db".
    overwriteMenimpa data dalam koleksi jika sudah ada, setel ke default sebagai True.
    +

    Memulai PrivateGPT

    Setelah semua pengaturan selesai, Anda dapat menjalankan PrivateGPT dengan Gradio UI.

    +
    PGPT_PROFILES=ollama make run
    +
    +

    UI akan tersedia di http://0.0.0.0:8001.

    +

    + + + + +

    +

    Anda bisa bermain-main dengan UI dan mengajukan pertanyaan tentang dokumen Anda.

    +

    Untuk detail lebih lanjut, silakan lihat dokumentasi resmi PrivateGPT.

    diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.json b/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.json new file mode 100644 index 000000000..15d6d4933 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/sambanova/ai-starter-kit.git\n$ d ai-starter-kit/enterprise_knowledge_retriever\n","...\nvectorstore = self.vectordb.create_vector_store(\n ..., db_type='milvus'\n)\n...\nvectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)\n","python3 -m venv enterprise_knowledge_env\nsource enterprise_knowledge_env/bin/activate\npip install -r requirements.txt\n","$ streamlit run streamlit/app.py --browser.gatherUsageStats false \n"],"headingContent":"Use Milvus with SambaNova","anchorList":[{"label":"Menggunakan Milvus dengan SambaNova","href":"Use-Milvus-with-SambaNova","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Kloning repositori","href":"Clone-the-repository","type":2,"isActive":false},{"label":"Ubah jenis penyimpanan vektor","href":"Change-the-vector-store-type","type":2,"isActive":false},{"label":"Menginstal dependensi","href":"Install-dependencies","type":2,"isActive":false},{"label":"Memulai aplikasi","href":"Start-the-application","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.md b/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.md new file mode 100644 index 000000000..e0848a2ae --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/use_milvus_with_sambanova.md @@ -0,0 +1,135 @@ +--- +id: use_milvus_with_sambanova.md +summary: >- + Tutorial ini memanfaatkan integrasi Milvus dalam SambaNova AI Starter Kits + untuk membangun sistem Enterprise Knowledge Retrieval, mirip dengan RAG + (Retrieval-Augmented Generation), untuk mengambil dan menjawab berdasarkan + dokumen pribadi perusahaan. +title: Menggunakan Milvus dengan SambaNova +--- +

    Menggunakan Milvus dengan SambaNova

    SambaNova adalah platform teknologi AI inovatif yang mempercepat penerapan AI canggih dan kemampuan pembelajaran mendalam. Dirancang untuk penggunaan perusahaan, platform ini memberdayakan organisasi untuk memanfaatkan AI generatif untuk meningkatkan kinerja dan efisiensi. Dengan menyediakan solusi mutakhir seperti SambaNova Suite dan DataScale, platform ini memungkinkan perusahaan untuk mengekstrak wawasan berharga dari data mereka, mendorong peningkatan operasional, dan mendorong peluang baru dalam lanskap AI.

    +

    SambaNova AI Starter Kits adalah kumpulan sumber daya open-source yang dirancang untuk membantu para pengembang dan perusahaan dalam menerapkan aplikasi berbasis AI dengan SambaNova. Kit ini memberikan contoh dan panduan praktis yang memfasilitasi implementasi berbagai kasus penggunaan AI, sehingga memudahkan pengguna untuk memanfaatkan teknologi canggih SambaNova.

    +

    Tutorial ini memanfaatkan integrasi Milvus dalam SambaNova AI Starter Kits untuk membangun sistem Enterprise Knowledge Retrieval, yang mirip dengan RAG (Retrieval-Augmented Generation), untuk mengambil dan menjawab berdasarkan dokumen pribadi perusahaan.

    +
    +

    Tutorial ini terutama mengacu pada panduan resmi SambaNova AI Starter Kits. Jika Anda menemukan bahwa tutorial ini memiliki bagian yang sudah usang, Anda dapat memprioritaskan untuk mengikuti panduan resmi dan mengajukan pertanyaan kepada kami.

    +
    +

    Prasyarat

    Kami merekomendasikan penggunaan Python >= 3.10 dan < 3.12.

    +

    Kunjungi SambaNova Cloud untuk mendapatkan kunci API SambaNova.

    +

    Kloning repositori

    $ git clone https://github.com/sambanova/ai-starter-kit.git
    +$ d ai-starter-kit/enterprise_knowledge_retriever
    +
    +

    Ubah jenis penyimpanan vektor

    Ubah penyimpanan vektor dengan mengatur db_type='milvus' di fungsi create_vector_store() dan load_vdb() di src/document_retrieval.py.

    +
    ...
    +vectorstore = self.vectordb.create_vector_store(
    +    ..., db_type='milvus'
    +)
    +...
    +vectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)
    +
    +

    Menginstal dependensi

    Instal dependensi yang diperlukan dengan menjalankan perintah berikut:

    +
    python3 -m venv enterprise_knowledge_env
    +source enterprise_knowledge_env/bin/activate
    +pip install -r requirements.txt
    +
    +

    Memulai aplikasi

    Gunakan perintah berikut untuk memulai aplikasi:

    +
    $ streamlit run streamlit/app.py --browser.gatherUsageStats false 
    +
    +

    Setelah itu, Anda akan melihat antarmuka pengguna di peramban Anda:http://localhost:8501/

    +

    + + + + +

    +

    Setelah mengatur kunci API SambaNova Anda di UI, Anda dapat bermain-main dengan UI dan mengajukan pertanyaan tentang dokumen Anda.

    +

    Untuk detail lebih lanjut, silakan lihat dokumentasi resmi Enterprise Knowledge Retrieval of SambaNova AI Starter Kits.

    diff --git a/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.json b/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.json new file mode 100644 index 000000000..b1cc702ca --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["mkdir video-search-tutorial\ncd video-search-tutorial\n","python -m venv venv\nsource venv/bin/activate # On Windows, use `venv\\Scripts\\activate`\n","pip install twelvelabs pymilvus\n","touch video_search.py\n","export TWELVE_LABS_API_KEY='your_api_key_here'\n","from pymilvus import MilvusClient\n\n# Initialize the Milvus client\nmilvus_client = MilvusClient(\"milvus_twelvelabs_demo.db\")\n\nprint(\"Successfully connected to Milvus\")\n","# Initialize the collection name\ncollection_name = \"twelvelabs_demo_collection\"\n\n# Check if the collection already exists and drop it if it does\nif milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n\n# Create the collection\nmilvus_client.create_collection(\n collection_name=collection_name,\n dimension=1024 # The dimension of the Twelve Labs embeddings\n)\n\nprint(f\"Collection '{collection_name}' created successfully\")\n","from twelvelabs import TwelveLabs\nfrom twelvelabs.models.embed import EmbeddingsTask\nimport os\n\n# Retrieve the API key from environment variables\nTWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')\n","twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)\n","def generate_embedding(video_url):\n \"\"\"\n Generate embeddings for a given video URL using the Twelve Labs API.\n\n This function creates an embedding task for the specified video URL using\n the Marengo-retrieval-2.6 engine. It monitors the task progress and waits\n for completion. Once done, it retrieves the task result and extracts the\n embeddings along with their associated metadata.\n\n Args:\n video_url (str): The URL of the video to generate embeddings for.\n\n Returns:\n tuple: A tuple containing two elements:\n 1. list: A list of dictionaries, where each dictionary contains:\n - 'embedding': The embedding vector as a list of floats.\n - 'start_offset_sec': The start time of the segment in seconds.\n - 'end_offset_sec': The end time of the segment in seconds.\n - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').\n 2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.\n\n Raises:\n Any exceptions raised by the Twelve Labs API during task creation,\n execution, or retrieval.\n \"\"\"\n\n # Create an embedding task\n task = twelvelabs_client.embed.task.create(\n engine_name=\"Marengo-retrieval-2.6\",\n video_url=video_url\n )\n print(f\"Created task: id={task.id} engine_name={task.engine_name} status={task.status}\")\n\n # Define a callback function to monitor task progress\n def on_task_update(task: EmbeddingsTask):\n print(f\" Status={task.status}\")\n\n # Wait for the task to complete\n status = task.wait_for_done(\n sleep_interval=2,\n callback=on_task_update\n )\n print(f\"Embedding done: {status}\")\n\n # Retrieve the task result\n task_result = twelvelabs_client.embed.task.retrieve(task.id)\n\n # Extract and return the embeddings\n embeddings = []\n for v in task_result.video_embeddings:\n embeddings.append({\n 'embedding': v.embedding.float,\n 'start_offset_sec': v.start_offset_sec,\n 'end_offset_sec': v.end_offset_sec,\n 'embedding_scope': v.embedding_scope\n })\n \n return embeddings, task_result\n","# Example usage\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Generate embeddings for the video\nembeddings, task_result = generate_embedding(video_url)\n\nprint(f\"Generated {len(embeddings)} embeddings for the video\")\nfor i, emb in enumerate(embeddings):\n print(f\"Embedding {i+1}:\")\n print(f\" Scope: {emb['embedding_scope']}\")\n print(f\" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds\")\n print(f\" Embedding vector (first 5 values): {emb['embedding'][:5]}\")\n print()\n","def insert_embeddings(milvus_client, collection_name, task_result, video_url):\n \"\"\"\n Insert embeddings into the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to insert into.\n task_result (EmbeddingsTaskResult): The task result containing video embeddings.\n video_url (str): The URL of the video associated with the embeddings.\n\n Returns:\n MutationResult: The result of the insert operation.\n\n This function takes the video embeddings from the task result and inserts them\n into the specified Milvus collection. Each embedding is stored with additional\n metadata including its scope, start and end times, and the associated video URL.\n \"\"\"\n data = []\n\n for i, v in enumerate(task_result.video_embeddings):\n data.append({\n \"id\": i,\n \"vector\": v.embedding.float,\n \"embedding_scope\": v.embedding_scope,\n \"start_offset_sec\": v.start_offset_sec,\n \"end_offset_sec\": v.end_offset_sec,\n \"video_url\": video_url\n })\n\n insert_result = milvus_client.insert(collection_name=collection_name, data=data)\n print(f\"Inserted {len(data)} embeddings into Milvus\")\n return insert_result\n\n# Usage example\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Assuming this function exists from previous step\nembeddings, task_result = generate_embedding(video_url)\n\n# Insert embeddings into the Milvus collection\ninsert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)\nprint(insert_result)\n","def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):\n \"\"\"\n Perform a similarity search on the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to search in.\n query_vector (list): The query vector to search for similar embeddings.\n limit (int, optional): The maximum number of results to return. Defaults to 5.\n\n Returns:\n list: A list of search results, where each result is a dictionary containing\n the matched entity's metadata and similarity score.\n\n This function searches the specified Milvus collection for embeddings similar to\n the given query vector. It returns the top matching results, including metadata\n such as the embedding scope, time range, and associated video URL for each match.\n \"\"\"\n search_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vector],\n limit=limit,\n output_fields=[\"embedding_scope\", \"start_offset_sec\", \"end_offset_sec\", \"video_url\"]\n )\n\n return search_results\n \n# define the query vector\n# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.\nquery_vector = task_result.video_embeddings[0].embedding.float\n\n# Perform a similarity search on the Milvus collection\nsearch_results = perform_similarity_search(milvus_client, collection_name, query_vector)\n\nprint(\"Search Results:\")\nfor i, result in enumerate(search_results[0]):\n print(f\"Result {i+1}:\")\n print(f\" Video URL: {result['entity']['video_url']}\")\n print(f\" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds\")\n print(f\" Similarity Score: {result['distance']}\")\n print()\n"],"headingContent":"Advanced Video Search: Leveraging Twelve Labs and Milvus for Semantic Retrieval","anchorList":[{"label":"Pencarian Video Tingkat Lanjut: Memanfaatkan Twelve Labs dan Milvus untuk Pencarian Semantik","href":"Advanced-Video-Search-Leveraging-Twelve-Labs-and-Milvus-for-Semantic-Retrieval","type":1,"isActive":false},{"label":"Pengantar","href":"Introduction","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Menyiapkan Lingkungan Pengembangan","href":"Setting-Up-the-Development-Environment","type":2,"isActive":false},{"label":"Menghubungkan ke Milvus","href":"Connecting-to-Milvus","type":2,"isActive":false},{"label":"Membuat Koleksi Milvus untuk Penyematan Video","href":"Creating-a-Milvus-Collection-for-Video-Embeddings","type":2,"isActive":false},{"label":"Menghasilkan Embedding dengan API Embedding Twelve Labs","href":"Generating-Embeddings-with-Twelve-Labs-Embed-API","type":2,"isActive":false},{"label":"Inisialisasi klien Twelve Labs:","href":"Initialize-the-Twelve-Labs-client","type":2,"isActive":false},{"label":"Memasukkan Embedding ke dalam Milvus","href":"Inserting-Embeddings-into-Milvus","type":2,"isActive":false},{"label":"Melakukan Pencarian Kemiripan","href":"Performing-Similarity-Search","type":2,"isActive":false},{"label":"Mengoptimalkan Kinerja","href":"Optimizing-Performance","type":2,"isActive":false},{"label":"Fitur Lanjutan","href":"Advanced-Features","type":2,"isActive":false},{"label":"Penanganan dan Pencatatan Kesalahan","href":"Error-Handling-and-Logging","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.md b/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.md new file mode 100644 index 000000000..fc6dbd875 --- /dev/null +++ b/localization/v2.5.x/site/id/integrations/video_search_with_twelvelabs_and_milvus.md @@ -0,0 +1,464 @@ +--- +id: video_search_with_twelvelabs_and_milvus.md +summary: >- + Pelajari cara membuat aplikasi pencarian video semantik dengan + mengintegrasikan API Embed Twelve Labs untuk menghasilkan sematan multimodal + dengan Milvus. Kursus ini mencakup seluruh proses mulai dari menyiapkan + lingkungan pengembangan hingga mengimplementasikan fitur-fitur canggih seperti + pencarian hibrida dan analisis video temporal, yang menyediakan fondasi + komprehensif untuk membangun sistem analisis dan pengambilan konten video yang + canggih. +title: >- + Pencarian Video Tingkat Lanjut: Memanfaatkan Twelve Labs dan Milvus untuk + Pencarian Semantik +--- +

    Pencarian Video Tingkat Lanjut: Memanfaatkan Twelve Labs dan Milvus untuk Pencarian Semantik

    Pengantar

    Selamat datang di tutorial komprehensif tentang cara mengimplementasikan pencarian video semantik menggunakan Twelve Labs Embed API dan Milvus. Dalam panduan ini, kita akan mengeksplorasi cara memanfaatkan kekuatan penyematan multimodal Twelve Labs yang canggih dan basis data vektor Milvus yang efisien untuk membuat solusi pencarian video yang kuat. Dengan mengintegrasikan teknologi ini, pengembang dapat membuka kemungkinan baru dalam analisis konten video, memungkinkan aplikasi seperti pengambilan video berbasis konten, sistem rekomendasi, dan mesin pencari canggih yang memahami nuansa data video.

    +

    Tutorial ini akan memandu Anda melalui seluruh proses, mulai dari menyiapkan lingkungan pengembangan hingga mengimplementasikan aplikasi pencarian video semantik yang fungsional. Kita akan membahas konsep-konsep utama seperti menghasilkan sematan multimodal dari video, menyimpannya secara efisien di Milvus, dan melakukan pencarian kemiripan untuk mengambil konten yang relevan. Baik Anda sedang membangun platform analitik video, alat penemuan konten, atau meningkatkan aplikasi yang sudah ada dengan kemampuan pencarian video, panduan ini akan memberi Anda pengetahuan dan langkah-langkah praktis untuk memanfaatkan kekuatan gabungan Twelve Labs dan Milvus dalam proyek Anda.

    +

    Prasyarat

    Sebelum memulai, pastikan Anda memiliki yang berikut ini:

    +

    Kunci API Twelve Labs (daftar di https://api.twelvelabs.io jika Anda belum memilikinya) Python 3.7 atau yang lebih baru yang terinstal di sistem Anda

    +

    Menyiapkan Lingkungan Pengembangan

    Buat direktori baru untuk proyek Anda dan arahkan ke sana:

    +
    mkdir video-search-tutorial
    +cd video-search-tutorial
    +
    +

    Siapkan lingkungan virtual (opsional, tetapi disarankan):

    +
    python -m venv venv
    +source venv/bin/activate  # On Windows, use `venv\Scripts\activate`
    +
    +

    Instal pustaka Python yang diperlukan:

    +
    pip install twelvelabs pymilvus
    +
    +

    Buat berkas Python baru untuk proyek Anda:

    +
    touch video_search.py
    +
    +

    File video_search.py ini akan menjadi skrip utama yang akan kita gunakan untuk tutorial ini. Selanjutnya, siapkan kunci API Twelve Labs Anda sebagai variabel lingkungan untuk keamanan:

    +
    export TWELVE_LABS_API_KEY='your_api_key_here'
    +
    +

    Menghubungkan ke Milvus

    Untuk membuat koneksi dengan Milvus, kita akan menggunakan kelas MilvusClient. Pendekatan ini menyederhanakan proses koneksi dan memungkinkan kita untuk bekerja dengan instans Milvus berbasis berkas lokal, yang sangat cocok untuk tutorial kita.

    +
    from pymilvus import MilvusClient
    +
    +# Initialize the Milvus client
    +milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
    +
    +print("Successfully connected to Milvus")
    +
    +

    Kode ini membuat instance Milvus client baru yang akan menyimpan semua data dalam sebuah berkas bernama milvus_twelvelabs_demo.db. Pendekatan berbasis file ini sangat ideal untuk tujuan pengembangan dan pengujian.

    +

    Membuat Koleksi Milvus untuk Penyematan Video

    Setelah terhubung ke Milvus, mari kita buat koleksi untuk menyimpan embedding video dan metadata terkait. Kita akan mendefinisikan skema koleksi dan membuat koleksi jika belum ada.

    +
    # Initialize the collection name
    +collection_name = "twelvelabs_demo_collection"
    +
    +# Check if the collection already exists and drop it if it does
    +if milvus_client.has_collection(collection_name=collection_name):
    +    milvus_client.drop_collection(collection_name=collection_name)
    +
    +# Create the collection
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=1024  # The dimension of the Twelve Labs embeddings
    +)
    +
    +print(f"Collection '{collection_name}' created successfully")
    +
    +

    Dalam kode ini, pertama-tama kita akan memeriksa apakah koleksi tersebut sudah ada dan membuangnya jika sudah ada. Hal ini memastikan kita memulai dengan awal yang bersih. Kami membuat koleksi dengan dimensi 1024, yang sesuai dengan dimensi keluaran dari embedding Twelve Labs.

    +

    Menghasilkan Embedding dengan API Embedding Twelve Labs

    Untuk menghasilkan embedding untuk video kita menggunakan Twelve Labs Embed API, kita akan menggunakan Twelve Labs Python SDK. Proses ini melibatkan pembuatan tugas penyematan, menunggu penyelesaiannya, dan mengambil hasilnya. Berikut ini cara mengimplementasikannya:

    +

    Pertama, pastikan Anda telah menginstal Twelve Labs SDK dan mengimpor modul-modul yang diperlukan:

    +
    from twelvelabs import TwelveLabs
    +from twelvelabs.models.embed import EmbeddingsTask
    +import os
    +
    +# Retrieve the API key from environment variables
    +TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
    +
    +

    Inisialisasi klien Twelve Labs:

    twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
    +
    +

    Buat fungsi untuk menghasilkan sematan untuk URL video tertentu:

    +
    def generate_embedding(video_url):
    +    """
    +    Generate embeddings for a given video URL using the Twelve Labs API.
    +
    +    This function creates an embedding task for the specified video URL using
    +    the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
    +    for completion. Once done, it retrieves the task result and extracts the
    +    embeddings along with their associated metadata.
    +
    +    Args:
    +        video_url (str): The URL of the video to generate embeddings for.
    +
    +    Returns:
    +        tuple: A tuple containing two elements:
    +            1. list: A list of dictionaries, where each dictionary contains:
    +                - 'embedding': The embedding vector as a list of floats.
    +                - 'start_offset_sec': The start time of the segment in seconds.
    +                - 'end_offset_sec': The end time of the segment in seconds.
    +                - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
    +            2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
    +
    +    Raises:
    +        Any exceptions raised by the Twelve Labs API during task creation,
    +        execution, or retrieval.
    +    """
    +
    +    # Create an embedding task
    +    task = twelvelabs_client.embed.task.create(
    +        engine_name="Marengo-retrieval-2.6",
    +        video_url=video_url
    +    )
    +    print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
    +
    +    # Define a callback function to monitor task progress
    +    def on_task_update(task: EmbeddingsTask):
    +        print(f"  Status={task.status}")
    +
    +    # Wait for the task to complete
    +    status = task.wait_for_done(
    +        sleep_interval=2,
    +        callback=on_task_update
    +    )
    +    print(f"Embedding done: {status}")
    +
    +    # Retrieve the task result
    +    task_result = twelvelabs_client.embed.task.retrieve(task.id)
    +
    +    # Extract and return the embeddings
    +    embeddings = []
    +    for v in task_result.video_embeddings:
    +        embeddings.append({
    +            'embedding': v.embedding.float,
    +            'start_offset_sec': v.start_offset_sec,
    +            'end_offset_sec': v.end_offset_sec,
    +            'embedding_scope': v.embedding_scope
    +        })
    +    
    +    return embeddings, task_result
    +
    +

    Gunakan fungsi ini untuk menghasilkan sematan untuk video Anda:

    +
    # Example usage
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Generate embeddings for the video
    +embeddings, task_result = generate_embedding(video_url)
    +
    +print(f"Generated {len(embeddings)} embeddings for the video")
    +for i, emb in enumerate(embeddings):
    +    print(f"Embedding {i+1}:")
    +    print(f"  Scope: {emb['embedding_scope']}")
    +    print(f"  Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
    +    print(f"  Embedding vector (first 5 values): {emb['embedding'][:5]}")
    +    print()
    +
    +

    Implementasi ini memungkinkan Anda menghasilkan sematan untuk URL video apa pun menggunakan API Sematan Twelve Labs. Fungsi generate_embedding menangani seluruh proses, mulai dari membuat tugas hingga mengambil hasilnya. Fungsi ini mengembalikan daftar kamus, masing-masing berisi vektor penyematan beserta metadata (rentang waktu dan cakupannya), dan ingatlah untuk menangani potensi kesalahan, seperti masalah jaringan atau batasan API, di lingkungan produksi. Anda mungkin juga ingin mengimplementasikan percobaan ulang atau penanganan kesalahan yang lebih kuat tergantung pada kasus penggunaan spesifik Anda.

    +

    Memasukkan Embedding ke dalam Milvus

    Setelah membuat embedding menggunakan Twelve Labs Embed API, langkah selanjutnya adalah memasukkan embedding ini beserta metadatanya ke dalam koleksi Milvus kita. Proses ini memungkinkan kita untuk menyimpan dan mengindeks embedding video kita untuk pencarian kemiripan yang efisien nantinya.

    +

    Berikut ini cara memasukkan embedding ke dalam Milvus:

    +
    def insert_embeddings(milvus_client, collection_name, task_result, video_url):
    +    """
    +    Insert embeddings into the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to insert into.
    +        task_result (EmbeddingsTaskResult): The task result containing video embeddings.
    +        video_url (str): The URL of the video associated with the embeddings.
    +
    +    Returns:
    +        MutationResult: The result of the insert operation.
    +
    +    This function takes the video embeddings from the task result and inserts them
    +    into the specified Milvus collection. Each embedding is stored with additional
    +    metadata including its scope, start and end times, and the associated video URL.
    +    """
    +    data = []
    +
    +    for i, v in enumerate(task_result.video_embeddings):
    +        data.append({
    +            "id": i,
    +            "vector": v.embedding.float,
    +            "embedding_scope": v.embedding_scope,
    +            "start_offset_sec": v.start_offset_sec,
    +            "end_offset_sec": v.end_offset_sec,
    +            "video_url": video_url
    +        })
    +
    +    insert_result = milvus_client.insert(collection_name=collection_name, data=data)
    +    print(f"Inserted {len(data)} embeddings into Milvus")
    +    return insert_result
    +
    +# Usage example
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Assuming this function exists from previous step
    +embeddings, task_result = generate_embedding(video_url)
    +
    +# Insert embeddings into the Milvus collection
    +insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
    +print(insert_result)
    +
    +

    Fungsi ini menyiapkan data untuk disisipkan, termasuk semua metadata yang relevan seperti vektor penyematan, rentang waktu, dan URL video sumber. Kemudian menggunakan klien Milvus untuk menyisipkan data ini ke dalam koleksi yang ditentukan.

    +

    Setelah penyematan disimpan di Milvus, kita dapat melakukan pencarian kemiripan untuk menemukan segmen video yang paling relevan berdasarkan vektor kueri. Berikut ini adalah cara mengimplementasikan fungsi ini:

    +
    def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
    +    """
    +    Perform a similarity search on the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to search in.
    +        query_vector (list): The query vector to search for similar embeddings.
    +        limit (int, optional): The maximum number of results to return. Defaults to 5.
    +
    +    Returns:
    +        list: A list of search results, where each result is a dictionary containing
    +              the matched entity's metadata and similarity score.
    +
    +    This function searches the specified Milvus collection for embeddings similar to
    +    the given query vector. It returns the top matching results, including metadata
    +    such as the embedding scope, time range, and associated video URL for each match.
    +    """
    +    search_results = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[query_vector],
    +        limit=limit,
    +        output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
    +    )
    +
    +    return search_results
    +    
    +# define the query vector
    +# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
    +query_vector = task_result.video_embeddings[0].embedding.float
    +
    +# Perform a similarity search on the Milvus collection
    +search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
    +
    +print("Search Results:")
    +for i, result in enumerate(search_results[0]):
    +    print(f"Result {i+1}:")
    +    print(f"  Video URL: {result['entity']['video_url']}")
    +    print(f"  Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
    +    print(f"  Similarity Score: {result['distance']}")
    +    print()
    +
    +

    Implementasi ini melakukan hal berikut:

    +
      +
    1. Mendefinisikan fungsi perform_similarity_search yang mengambil vektor kueri dan mencari sematan yang serupa dalam koleksi Milvus.
    2. +
    3. Menggunakan metode pencarian klien Milvus untuk menemukan vektor yang paling mirip.
    4. +
    5. Menentukan bidang keluaran yang ingin kita ambil, termasuk metadata tentang segmen video yang cocok.
    6. +
    7. Memberikan contoh cara menggunakan fungsi ini dengan video kueri, pertama-tama membuat penyematannya dan kemudian menggunakannya untuk mencari.
    8. +
    9. Mencetak hasil pencarian, termasuk metadata yang relevan dan skor kemiripan.
    10. +
    +

    Dengan mengimplementasikan fungsi-fungsi ini, Anda telah membuat alur kerja yang lengkap untuk menyimpan penyematan video di Milvus dan melakukan pencarian kemiripan. Penyiapan ini memungkinkan pengambilan konten video serupa secara efisien berdasarkan penyematan multimodal yang dihasilkan oleh API Embed Twelve Labs.

    +

    Mengoptimalkan Kinerja

    Baiklah, mari kita bawa aplikasi ini ke tingkat berikutnya! Ketika berurusan dengan koleksi video berskala besar, performa adalah kuncinya. Untuk mengoptimalkan, kita harus mengimplementasikan pemrosesan batch untuk pembuatan dan penyisipan embedding ke dalam Milvus. Dengan cara ini, kita dapat menangani banyak video secara bersamaan, sehingga secara signifikan mengurangi waktu pemrosesan secara keseluruhan. Selain itu, kami dapat memanfaatkan fitur partisi Milvus untuk mengatur data kami secara lebih efisien, mungkin berdasarkan kategori video atau periode waktu. Hal ini akan mempercepat pencarian dengan memungkinkan kami untuk mencari hanya partisi yang relevan.

    +

    Trik pengoptimalan lainnya adalah dengan menggunakan mekanisme caching untuk embedding atau hasil pencarian yang sering diakses. Hal ini dapat secara dramatis meningkatkan waktu respons untuk kueri yang populer. Jangan lupa untuk menyempurnakan parameter indeks Milvus berdasarkan kumpulan data dan pola kueri spesifik Anda - sedikit penyesuaian di sini bisa sangat membantu dalam meningkatkan kinerja pencarian.

    +

    Fitur Lanjutan

    Sekarang, mari kita tambahkan beberapa fitur keren untuk membuat aplikasi kita menonjol! Kita dapat menerapkan pencarian hybrid yang menggabungkan kueri teks dan video. Faktanya, Twelve Labs Embed API juga dapat menghasilkan penyematan teks untuk kueri teks Anda. Bayangkan jika pengguna dapat memasukkan deskripsi teks dan contoh klip video - kami akan membuat sematan untuk keduanya dan melakukan pencarian berbobot di Milvus. Ini akan memberikan hasil yang sangat tepat.

    +

    Tambahan lain yang mengagumkan adalah pencarian temporal di dalam video. Kami dapat memecah video panjang menjadi beberapa segmen yang lebih kecil, masing-masing dengan penyematannya sendiri. Dengan cara ini, pengguna dapat menemukan momen-momen tertentu di dalam video, bukan hanya seluruh klip. Dan hei, mengapa tidak memasukkan beberapa analisis video dasar? Kita dapat menggunakan penyematan untuk mengelompokkan segmen video yang serupa, mendeteksi tren, atau bahkan mengidentifikasi pencilan dalam koleksi video yang besar.

    +

    Penanganan dan Pencatatan Kesalahan

    Mari kita akui saja, banyak hal yang bisa saja salah, dan saat itu terjadi, kita harus siap. Menerapkan penanganan kesalahan yang kuat sangatlah penting. Kita harus membungkus panggilan API dan operasi basis data kita dalam blok try-except, memberikan pesan kesalahan yang informatif kepada pengguna ketika terjadi kegagalan. Untuk masalah yang berhubungan dengan jaringan, mengimplementasikan percobaan ulang dengan backoff eksponensial dapat membantu menangani gangguan sementara dengan baik.

    +

    Sedangkan untuk logging, ini adalah teman terbaik kita untuk melakukan debugging dan pemantauan. Kita harus menggunakan modul pencatatan Python untuk melacak peristiwa penting, kesalahan, dan metrik kinerja di seluruh aplikasi kita. Mari kita siapkan level log yang berbeda - DEBUG untuk pengembangan, INFO untuk operasi umum, dan ERROR untuk masalah kritis. Dan jangan lupa untuk menerapkan rotasi log untuk mengelola ukuran file. Dengan pencatatan yang tepat, kita akan dapat dengan cepat mengidentifikasi dan menyelesaikan masalah, memastikan aplikasi pencarian video kita berjalan dengan lancar meskipun aplikasi ini terus berkembang.

    +

    Kesimpulan

    Selamat! Anda sekarang telah membuat aplikasi pencarian video semantik yang kuat menggunakan API Embed Twelve Labs dan Milvus. Integrasi ini memungkinkan Anda untuk memproses, menyimpan, dan mengambil konten video dengan akurasi dan efisiensi yang belum pernah ada sebelumnya. Dengan memanfaatkan penyematan multimodal, Anda telah menciptakan sistem yang memahami nuansa data video, membuka kemungkinan menarik untuk penemuan konten, sistem rekomendasi, dan analisis video tingkat lanjut.

    +

    Ketika Anda terus mengembangkan dan menyempurnakan aplikasi Anda, ingatlah bahwa kombinasi generasi penyematan canggih Twelve Labs dan penyimpanan vektor yang dapat diskalakan dari Milvus memberikan fondasi yang kuat untuk mengatasi tantangan pemahaman video yang lebih kompleks. Kami mendorong Anda untuk bereksperimen dengan fitur-fitur canggih yang telah dibahas dan mendorong batas-batas dari apa yang mungkin dilakukan dalam pencarian dan analisis video.

    diff --git a/localization/v2.5.x/site/id/menuStructure/id.json b/localization/v2.5.x/site/id/menuStructure/id.json new file mode 100644 index 000000000..ccc573163 --- /dev/null +++ b/localization/v2.5.x/site/id/menuStructure/id.json @@ -0,0 +1,2196 @@ +[ + { + "label": "Tentang Milvus", + "id": "about", + "isMenu": true, + "order": 0, + "children": [ + { + "label": "Apa itu Milvus", + "id": "overview.md", + "order": 0, + "children": [] + }, + { + "label": "Pengadopsi Milvus", + "id": "milvus_adopters.md", + "order": 1, + "children": [] + }, + { + "label": "Peta Jalan Milvus", + "id": "roadmap.md", + "order": 2, + "children": [] + }, + { + "label": "Rilis", + "id": "release_notes.md", + "order": 3, + "children": [] + }, + { + "label": "Tolok ukur", + "id": "benchmark.md", + "order": 4, + "children": [] + }, + { + "label": "Perbandingan", + "id": "comparison.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Memulai", + "id": "getstarted", + "isMenu": true, + "order": 1, + "children": [ + { + "label": "Mulai cepat", + "id": "quickstart.md", + "order": 0, + "children": [] + }, + { + "label": "Instal Milvus", + "id": "install_milvus", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "install-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Jalankan Milvus Lite", + "id": "milvus_lite.md", + "order": 1, + "children": [] + }, + { + "label": "Jalankan Milvus Standalone", + "id": "run_milvus_docker", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Persyaratan", + "id": "prerequisite-docker.md", + "order": 0, + "children": [] + }, + { + "label": "Docker (Linux)", + "id": "install_standalone-docker.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose (Linux)", + "id": "install_standalone-docker-compose.md", + "order": 2, + "children": [] + }, + { + "label": "Desktop Docker (Windows)", + "id": "install_standalone-windows.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Jalankan Milvus Didistribusikan", + "id": "run_milvus_k8s", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Persyaratan", + "id": "prerequisite-helm.md", + "order": 0, + "children": [] + }, + { + "label": "Operator Milvus", + "id": "install_cluster-milvusoperator.md", + "order": 1, + "children": [] + }, + { + "label": "Bagan Helm", + "id": "install_cluster-helm.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Jalankan Milvus dengan GPU", + "id": "run_milvus_gpu", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Persyaratan", + "id": "prerequisite-gpu.md", + "order": 0, + "children": [] + }, + { + "label": "Bagan Helm", + "id": "install_cluster-helm-gpu.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose", + "id": "install_standalone-docker-compose-gpu.md", + "order": 2, + "children": [] + } + ] + } + ] + }, + { + "label": "Menginstal SDK", + "id": "install_sdks", + "order": 2, + "children": [ + { + "label": "PyMilvus", + "id": "install-pymilvus.md", + "order": 0, + "children": [] + }, + { + "label": "Java SDK", + "id": "install-java.md", + "order": 1, + "children": [] + }, + { + "label": "Go SDK", + "id": "install-go.md", + "order": 2, + "children": [] + }, + { + "label": "Node.js SDK", + "id": "install-node.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "Konsep", + "id": "concepts", + "isMenu": true, + "order": 2, + "children": [ + { + "label": "Arsitektur", + "id": "architecture", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "architecture_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Penyimpanan/Komputasi", + "id": "four_layers.md", + "order": 1, + "children": [] + }, + { + "label": "Komponen Utama", + "id": "main_components.md", + "order": 2, + "children": [] + }, + { + "label": "Pengolahan Data", + "id": "data_processing.md", + "order": 3, + "children": [] + }, + { + "label": "Knowhere", + "id": "knowhere.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Bitset", + "id": "bitset.md", + "order": 1, + "children": [] + }, + { + "label": "Multi-penyewaan", + "id": "multi_tenancy.md", + "order": 3, + "children": [] + }, + { + "label": "Cap waktu", + "id": "timestamp.md", + "order": 4, + "children": [] + }, + { + "label": "Sinkronisasi Waktu", + "id": "time_sync.md", + "order": 6, + "children": [] + }, + { + "label": "Indeks Vektor", + "id": "vector_index", + "order": 7, + "isMenu": true, + "children": [ + { + "label": "Indeks dalam memori", + "id": "index.md", + "order": 0, + "children": [] + }, + { + "label": "Indeks Pada Disk", + "id": "disk_index.md", + "order": 1, + "children": [] + }, + { + "label": "Indeks GPU", + "id": "gpu_index.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Indeks Skalar", + "id": "scalar_index.md", + "order": 8, + "children": [] + }, + { + "label": "Jenis Metrik", + "id": "metric.md", + "order": 9, + "children": [] + }, + { + "label": "Tingkat Konsistensi", + "id": "consistency.md", + "order": 10, + "children": [] + }, + { + "label": "Replika dalam memori", + "id": "replica.md", + "order": 11, + "children": [] + }, + { + "label": "Terminologi", + "id": "glossary.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Panduan Pengguna", + "id": "userguide", + "isMenu": true, + "order": 3, + "children": [ + { + "label": "Basis data", + "id": "manage_databases.md", + "order": 0, + "children": [] + }, + { + "label": "Koleksi", + "id": "collections", + "order": 1, + "children": [ + { + "label": "Penjelasan Koleksi", + "id": "manage-collections.md", + "order": 0, + "children": [] + }, + { + "label": "Buat Koleksi", + "id": "create-collection.md", + "order": 1, + "children": [] + }, + { + "label": "Buat Koleksi Secara Instan", + "id": "create-collection-instantly.md", + "order": 2, + "children": [] + }, + { + "label": "Lihat Koleksi", + "id": "view-collections.md", + "order": 3, + "children": [] + }, + { + "label": "Ubah Koleksi", + "id": "modify-collection.md", + "order": 4, + "children": [] + }, + { + "label": "Muat & Lepas", + "id": "load-and-release.md", + "order": 5, + "children": [] + }, + { + "label": "Mengelola Partisi", + "id": "manage-partitions.md", + "order": 6, + "children": [] + }, + { + "label": "Mengelola Alias", + "id": "manage-aliases.md", + "order": 7, + "children": [] + }, + { + "label": "Koleksi Drop", + "id": "drop-collection.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "Bidang Skema & Data", + "id": "schema", + "order": 2, + "children": [ + { + "label": "Penjelasan Skema", + "id": "schema.md", + "order": 0, + "children": [] + }, + { + "label": "Bidang Utama & AutoID", + "id": "primary-field.md", + "order": 1, + "children": [] + }, + { + "label": "Vektor Padat", + "id": "dense-vector.md", + "order": 2, + "children": [] + }, + { + "label": "Vektor Biner", + "id": "binary-vector.md", + "order": 3, + "children": [] + }, + { + "label": "Vektor Jarang", + "id": "sparse_vector.md", + "order": 4, + "children": [] + }, + { + "label": "Bidang String", + "id": "string.md", + "order": 5, + "children": [] + }, + { + "label": "Bidang Nomor", + "id": "number.md", + "order": 6, + "children": [] + }, + { + "label": "Bidang JSON", + "id": "use-json-fields.md", + "order": 7, + "children": [] + }, + { + "label": "Bidang Array", + "id": "array_data_type.md", + "order": 8, + "children": [] + }, + { + "label": "Bidang Dinamis", + "id": "enable-dynamic-field.md", + "order": 9, + "children": [] + }, + { + "label": "Dapat dibatalkan & Default", + "id": "nullable-and-default.md", + "order": 10, + "children": [] + }, + { + "label": "Penganalisis", + "id": "analyzer", + "order": 11, + "children": [ + { + "label": "Ikhtisar Penganalisis", + "id": "analyzer-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Alat Analisis Internal", + "id": "built-in-analyzers", + "order": 1, + "children": [ + { + "label": "Standar", + "id": "standard-analyzer.md", + "order": 0, + "children": [] + }, + { + "label": "Bahasa Inggris", + "id": "english-analyzer.md", + "order": 1, + "children": [] + }, + { + "label": "Cina", + "id": "chinese-analyzer.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Tokenizers", + "id": "tokenizers", + "order": 2, + "children": [ + { + "label": "Standar", + "id": "standard-tokenizer.md", + "order": 0, + "children": [] + }, + { + "label": "Spasi", + "id": "whitespace-tokenizer.md", + "order": 1, + "children": [] + }, + { + "label": "Jieba", + "id": "jieba-tokenizer.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Filter", + "id": "filters", + "order": 3, + "children": [ + { + "label": "Huruf kecil", + "id": "lowercase-filter.md", + "order": 0, + "children": [] + }, + { + "label": "Pelipatan ASCII", + "id": "ascii-folding-filter.md", + "order": 1, + "children": [] + }, + { + "label": "Alphanumonly", + "id": "alphanumonly-filter.md", + "order": 2, + "children": [] + }, + { + "label": "Cnalphanumonly", + "id": "cnalphanumonly-filter.md", + "order": 3, + "children": [] + }, + { + "label": "Cncharonly", + "id": "cncharonly-filter.md", + "order": 4, + "children": [] + }, + { + "label": "Panjang", + "id": "length-filter.md", + "order": 5, + "children": [] + }, + { + "label": "Berhenti.", + "id": "stop-filter.md", + "order": 6, + "children": [] + }, + { + "label": "Pengurai", + "id": "decompounder-filter.md", + "order": 7, + "children": [] + }, + { + "label": "Stemmer", + "id": "stemmer-filter.md", + "order": 8, + "children": [] + } + ] + } + ] + }, + { + "label": "Hands-On", + "id": "schema-hands-on.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Menyisipkan & Menghapus", + "id": "insert-and-delete", + "order": 3, + "children": [ + { + "label": "Sisipkan Entitas", + "id": "insert-update-delete.md", + "order": 0, + "children": [] + }, + { + "label": "Entitas Upsert", + "id": "upsert-entities.md", + "order": 1, + "children": [] + }, + { + "label": "Hapus Entitas", + "id": "delete-entities.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Indeks", + "id": "manage_indexes", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Indeks Vektor", + "id": "index-vector-fields.md", + "order": 0, + "children": [] + }, + { + "label": "Indeks Skalar", + "id": "scalar-index", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Bidang Skalar Indeks", + "id": "index-scalar-fields.md", + "order": 1, + "children": [] + }, + { + "label": "Indeks Bitmap", + "id": "bitmap.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Indeks yang mendukung GPU", + "id": "index-with-gpu.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Cari & Beri Peringkat Ulang", + "id": "search-rerank", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Pencarian ANN Dasar", + "id": "single-vector-search.md", + "order": 0, + "children": [] + }, + { + "label": "Pencarian yang Difilter", + "id": "filtered-search.md", + "order": 1, + "children": [] + }, + { + "label": "Pencarian Rentang", + "id": "range-search.md", + "order": 2, + "children": [] + }, + { + "label": "Pencarian Pengelompokan", + "id": "grouping-search.md", + "order": 3, + "children": [] + }, + { + "label": "Pencarian Hibrida", + "id": "multi-vector-search.md", + "order": 4, + "children": [] + }, + { + "label": "Pertanyaan", + "id": "get-and-scalar-query.md", + "order": 5, + "children": [] + }, + { + "label": "Penyaringan", + "id": "filtering", + "order": 6, + "children": [ + { + "label": "Penjelasan Pemfilteran", + "id": "boolean.md", + "order": 0, + "children": [] + }, + { + "label": "Operator Dasar", + "id": "basic-operators.md", + "order": 1, + "children": [] + }, + { + "label": "Penyaringan Templating", + "id": "filtering-templating.md", + "order": 2, + "children": [] + }, + { + "label": "Operator JSON", + "id": "json-operators.md", + "order": 3, + "children": [] + }, + { + "label": "Operator Array", + "id": "array-operators.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Pencarian Teks Lengkap", + "id": "full-text-search.md", + "order": 7, + "children": [] + }, + { + "label": "Pencocokan Teks", + "id": "keyword-match.md", + "order": 8, + "children": [] + }, + { + "label": "Iterator Pencarian", + "id": "with-iterators.md", + "order": 9, + "children": [] + }, + { + "label": "Gunakan Kunci Partisi", + "id": "use-partition-key.md", + "order": 9, + "children": [] + }, + { + "label": "Pemeringkatan ulang", + "id": "reranking.md", + "order": 10, + "children": [] + } + ] + } + ] + }, + { + "label": "Model", + "id": "models", + "isMenu": true, + "order": 4, + "children": [ + { + "label": "Penyematan", + "id": "embeddings", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "embeddings.md", + "order": 0, + "children": [] + }, + { + "label": "OpenAI", + "id": "embed-with-openai.md", + "order": 1, + "children": [] + }, + { + "label": "Transformator Kalimat", + "id": "embed-with-sentence-transform.md", + "order": 2, + "children": [] + }, + { + "label": "BGE M3", + "id": "embed-with-bgm-m3.md", + "order": 3, + "children": [] + }, + { + "label": "SPLADE", + "id": "embed-with-splade.md", + "order": 5, + "children": [] + }, + { + "label": "Pelayaran", + "id": "embed-with-voyage.md", + "order": 6, + "children": [] + }, + { + "label": "Jina AI", + "id": "embed-with-jina.md", + "order": 7, + "children": [] + }, + { + "label": "Cohere", + "id": "embed-with-cohere.md", + "order": 8, + "children": [] + }, + { + "label": "Instruktur", + "id": "embed-with-instructor.md", + "order": 9, + "children": [] + }, + { + "label": "Mistral AI", + "id": "embed-with-mistral-ai.md", + "order": 10, + "children": [] + }, + { + "label": "Nomic", + "id": "embed-with-nomic.md", + "order": 11, + "children": [] + }, + { + "label": "mGTE", + "id": "embed-with-mgte.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Pemeringkat ulang", + "id": "rerankers", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "rerankers-overview.md", + "order": 0, + "children": [] + }, + { + "label": "BGE", + "id": "rerankers-bge.md", + "order": 1, + "children": [] + }, + { + "label": "Cohere", + "id": "rerankers-cohere.md", + "order": 2, + "children": [] + }, + { + "label": "Cross Encoder", + "id": "rerankers-cross-encoder.md", + "order": 3, + "children": [] + }, + { + "label": "Pelayaran", + "id": "rerankers-voyage.md", + "order": 4, + "children": [] + }, + { + "label": "Jina AI", + "id": "rerankers-jina.md", + "order": 5, + "children": [] + } + ] + } + ] + }, + { + "label": "Impor Data", + "id": "data_import", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Menyiapkan Data Sumber", + "id": "prepare-source-data.md", + "order": 0, + "children": [] + }, + { + "label": "Impor Data", + "id": "import-data.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Migrasi Milvus", + "id": "milvus_migration", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "Ikhtisar", + "id": "migrate_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Instal Alat Migrasi", + "id": "milvusdm_install.md", + "order": 1, + "children": [] + }, + { + "label": "Dari Elasticsearch", + "id": "es2m.md", + "order": 2, + "children": [] + }, + { + "label": "Dari Faiss", + "id": "f2m.md", + "order": 3, + "children": [] + }, + { + "label": "Dari Milvus 1.x", + "id": "m2m.md", + "order": 4, + "children": [] + }, + { + "label": "Dari Milvus 2.3.x", + "id": "from-m2x.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Panduan Administrasi", + "id": "admin_guide", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "Penyebaran", + "id": "deployment", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Di Tempat", + "id": "on_premises", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Dengan Docker", + "id": "configure-docker.md", + "order": 0, + "children": [] + }, + { + "label": "Dengan Helm", + "id": "configure-helm.md", + "order": 1, + "children": [] + }, + { + "label": "Dengan Operator Milvus", + "id": "configure_operator.md", + "order": 2, + "children": [] + }, + { + "label": "Mengalokasikan Sumber Daya", + "id": "allocate.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Di Atas Awan", + "id": "on_cloud", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Menerapkan di AWS", + "id": "eks.md", + "order": 1, + "children": [] + }, + { + "label": "Menyebarkan pada GCP", + "id": "gcp.md", + "order": 2, + "children": [] + }, + { + "label": "Menerapkan di Azure", + "id": "azure.md", + "order": 3, + "children": [] + }, + { + "label": "Menerapkan di OpenShift", + "id": "openshift.md", + "order": 4, + "children": [] + }, + { + "label": "Penyeimbangan Beban Lapisan-7", + "id": "layer-7-lb", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "aws_layer7.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcp_layer7.md", + "order": 2, + "children": [] + }, + { + "label": "Azure", + "id": "ingress.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Penyimpanan Cloud", + "id": "cloud-storage", + "order": 6, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "s3.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcs.md", + "order": 2, + "children": [] + }, + { + "label": "Azure", + "id": "abs.md", + "order": 3, + "children": [] + } + ] + } + ] + } + ] + }, + { + "label": "Konfigurasi", + "id": "configuration", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Konfigurasi Sistem", + "id": "system_configuration.md", + "order": 0, + "children": [] + }, + { + "label": "Dengan Cepat", + "id": "dynamic_config.md", + "order": 1, + "children": [] + }, + { + "label": "Batasi Jumlah Koleksi", + "id": "limit_collection_counts.md", + "order": 2, + "children": [] + }, + { + "label": "Mengonfigurasi Cache Potongan", + "id": "chunk_cache.md", + "order": 3, + "children": [] + }, + { + "label": "Koordinator HA", + "id": "coordinator_ha.md", + "order": 4, + "children": [] + }, + { + "label": "QueryNode Menggunakan Disk Lokal", + "id": "configure-querynode-localdisk.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Mengelola Ketergantungan", + "id": "manage_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Dengan Docker atau Helm", + "id": "docker_helm_dependencies", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Penyimpanan Objek", + "id": "deploy_s3.md", + "order": 0, + "children": [] + }, + { + "label": "Penyimpanan Meta", + "id": "deploy_etcd.md", + "order": 1, + "children": [] + }, + { + "label": "Penyimpanan Pesan", + "id": "deploy_pulsar.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Dengan Operator Milvus", + "id": "milvus_operator_dependencies", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Penyimpanan Objek", + "id": "object_storage_operator.md", + "order": 0, + "children": [] + }, + { + "label": "Penyimpanan Meta", + "id": "meta_storage_operator.md", + "order": 1, + "children": [] + }, + { + "label": "Penyimpanan Pesan", + "id": "message_storage_operator.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Gunakan Pulsa dengan Milvus", + "id": "pulsar_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Tingkatkan ke Pulsar v3", + "id": "upgrade-pulsar-v3.md", + "order": 0, + "children": [] + }, + { + "label": "Melanjutkan Menggunakan Pulsar v2", + "id": "use-pulsar-v2.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "Penskalaan", + "id": "scaling", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Cluster Skala", + "id": "scaleout.md", + "order": 0, + "children": [] + }, + { + "label": "Ketergantungan Skala", + "id": "scale-dependencies.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Tingkatkan", + "id": "upgrade_milvus", + "order": 7, + "children": [ + { + "label": "Tingkatkan Cluster Milvus", + "id": "upgrade_milvus_cluster-operator.md", + "order": 0, + "children": [] + }, + { + "label": "Tingkatkan Milvus Standalone", + "id": "upgrade_milvus_standalone-operator.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Pemantauan, Peringatan & Log", + "id": "monitor_alert_log", + "order": 8, + "isMenu": true, + "children": [ + { + "label": "Pemantauan", + "id": "monitoring", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Arsitektur", + "id": "monitor_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Menerapkan Layanan Pemantauan", + "id": "monitor.md", + "order": 1, + "children": [] + }, + { + "label": "Memvisualisasikan Metrik", + "id": "visualize.md", + "order": 2, + "children": [] + }, + { + "label": "Dasbor Metrik Milvus", + "id": "metrics_dashboard.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Peringatan", + "id": "alerts", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Membuat Peringatan", + "id": "alert.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Log", + "id": "logs", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Konfigurasi Grafana Loki", + "id": "configure_grafana_loki.md", + "order": 0, + "children": [] + }, + { + "label": "Mengkonfigurasi Log Akses", + "id": "configure_access_logs.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Melacak", + "id": "trace", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Pelacakan Jaeger", + "id": "config_jaeger_tracing.md", + "order": 0, + "children": [] + } + ] + } + ] + }, + { + "label": "Kelompok Sumber Daya", + "id": "resource_groups", + "order": 9, + "children": [ + { + "label": "Mengelola Grup Sumber Daya", + "id": "resource_group.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Optimalisasi Penyimpanan", + "id": "storage_optimization", + "order": 10, + "isMenu": true, + "children": [ + { + "label": "Gunakan mmap", + "id": "mmap.md", + "order": 0, + "children": [] + }, + { + "label": "Pemadatan Pengelompokan", + "id": "clustering-compaction.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Keamanan", + "id": "security", + "order": 11, + "isMenu": true, + "children": [ + { + "label": "Aktifkan Otentikasi", + "id": "authenticate.md", + "order": 0, + "children": [] + }, + { + "label": "Pengguna, Hak Istimewa, dan Peran", + "id": "users_and_roles.md", + "order": 10, + "children": [] + }, + { + "label": "Mengaktifkan RBAC", + "id": "rbac.md", + "order": 1, + "isMenu": true, + "children": [] + }, + { + "label": "Enkripsi dalam Perjalanan", + "id": "tls.md", + "order": 2, + "children": [] + }, + { + "label": "Terhubung ke Kafka dengan SASL/SSL", + "id": "connect_kafka_ssl.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus WebUI", + "id": "milvus-webui.md", + "order": "12", + "children": [] + } + ] + }, + { + "label": "Peralatan", + "id": "tools", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "Attu (Milvus GUI)", + "id": "milvus_attu", + "order": 0, + "externalLink": "https://github.com/zilliztech/attu", + "children": [] + }, + { + "label": "Cadangan Milvus", + "id": "milvus_backup", + "order": 1, + "children": [ + { + "label": "Ikhtisar", + "id": "milvus_backup_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Perintah", + "id": "milvus_backup_cli.md", + "order": 1, + "children": [] + }, + { + "label": "API RESTful", + "id": "milvus_backup_api.md", + "order": 2, + "children": [] + }, + { + "label": "Kasus Umum", + "id": "common-cases", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Migrasi Antar Instance dalam Satu Bucket", + "id": "shared-bucket-backup-and-restore.md", + "order": 0, + "children": [] + }, + { + "label": "Migrasi Antar Instance di Seluruh Bucket", + "id": "cross-bucket-backup-and-restore.md", + "order": 1, + "children": [] + }, + { + "label": "Migrasi Antar Instance di Seluruh Lingkungan S3", + "id": "multi-storage-backup-and-restore.md", + "order": 2, + "children": [] + }, + { + "label": "Cadangkan dan Pulihkan dalam Satu Instansi", + "id": "single-instance-backup-and-restore.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "Pengamat burung", + "id": "birdwatcher", + "order": 2, + "children": [ + { + "label": "Ikhtisar", + "id": "birdwatcher_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Panduan Instalasi", + "id": "birdwatcher_install_guides.md", + "order": 1, + "children": [] + }, + { + "label": "Panduan Penggunaan", + "id": "birdwatcher_usage_guides.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Milvus CDC", + "id": "milvus_cdc", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "milvus-cdc-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Menyebarkan Server CDC", + "id": "deploy-cdc-server.md", + "order": 1, + "children": [] + }, + { + "label": "Mengelola Tugas CDC", + "id": "manage-cdc-tasks.md", + "order": 2, + "children": [] + }, + { + "label": "Pemantauan", + "id": "cdc-monitoring.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus CLI", + "id": "cli", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Ikhtisar", + "id": "cli_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Instalasi", + "id": "install_cli.md", + "order": 1, + "children": [] + }, + { + "label": "Perintah", + "id": "cli_commands.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Konektor Milvus", + "id": "milvus_connectors", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Percikan", + "id": "integrate_with_spark.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Alat Pengukur Ukuran Milvus", + "id": "sizing", + "order": 6, + "externalLink": "https://milvus.io/tools/sizing/", + "children": [] + }, + { + "label": "Klien Powershell Milvus", + "id": "milvus_powershell", + "order": 8, + "externalLink": "https://github.com/rrg92/ps-milvus/blob/main/docs/integrate_powershell.md", + "children": [] + } + ] + }, + { + "label": "Integrasi", + "id": "integrations", + "isMenu": true, + "order": 8, + "children": [ + { + "label": "Ikhtisar", + "id": "integrations_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Model Penyematan", + "id": "integrate-embeddings-models", + "order": 1, + "children": [ + { + "label": "OpenAI", + "id": "integrate_with_openai.md", + "order": 0, + "children": [] + }, + { + "label": "Cohere", + "id": "integrate_with_cohere.md", + "order": 1, + "children": [] + }, + { + "label": "HuggingFace", + "id": "integrate_with_hugging-face.md", + "order": 2, + "children": [] + }, + { + "label": "PyTorch", + "id": "integrate_with_pytorch.md", + "order": 3, + "children": [] + }, + { + "label": "Pengubah Kalimat", + "id": "integrate_with_sentencetransformers.md", + "order": 4, + "children": [] + }, + { + "label": "VoyageAI", + "id": "integrate_with_voyageai.md", + "order": 8, + "children": [] + }, + { + "label": "Jina AI", + "id": "integrate_with_jina.md", + "order": 11, + "children": [] + }, + { + "label": "Dua Belas Laboratorium", + "id": "video_search_with_twelvelabs_and_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "BentoML", + "id": "integrate_with_bentoml.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "LLM", + "id": "integrate-llms", + "order": 2, + "children": [ + { + "label": "vLLM", + "id": "milvus_rag_with_vllm.md", + "order": 0, + "children": [] + }, + { + "label": "Mistral AI", + "id": "llama_agents_metadata.md", + "order": 1, + "children": [] + }, + { + "label": "Kembang api", + "id": "build_RAG_with_milvus_and_fireworks.md", + "order": 2, + "children": [] + }, + { + "label": "Lepton", + "id": "build_RAG_with_milvus_and_lepton.md", + "order": 3, + "children": [] + }, + { + "label": "SiliconFlow", + "id": "build_RAG_with_milvus_and_siliconflow.md", + "order": 4, + "children": [] + }, + { + "label": "SambaNova", + "id": "use_milvus_with_sambanova.md", + "order": 5, + "children": [] + }, + { + "label": "Gemini", + "id": "build_RAG_with_milvus_and_gemini.md", + "order": 6, + "children": [] + }, + { + "label": "Ollama", + "id": "build_RAG_with_milvus_and_ollama.md", + "order": 7, + "children": [] + }, + { + "label": "DeepSeek", + "id": "build_RAG_with_milvus_and_deepseek.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "Orkestrasi", + "id": "orchestrate-with-milvus", + "order": 3, + "children": [ + { + "label": "LangChain", + "id": "langchain", + "order": 0, + "children": [ + { + "label": "Penggunaan Dasar", + "id": "basic_usage_langchain.md", + "order": 1, + "children": [] + }, + { + "label": "RAG", + "id": "integrate_with_langchain.md", + "order": 2, + "children": [] + }, + { + "label": "Pencarian Hibrida", + "id": "milvus_hybrid_search_retriever.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "LlamaIndex", + "id": "llamaindex", + "order": 1, + "children": [ + { + "label": "RAG", + "id": "integrate_with_llamaindex.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "DSPy", + "id": "integrate_with_dspy.md", + "order": 2, + "children": [] + }, + { + "label": "FastGPT", + "id": "integrate_with_fastgpt.md", + "order": 3, + "children": [] + }, + { + "label": "Tumpukan jerami", + "id": "integrate_with_haystack.md", + "order": 4, + "children": [] + }, + { + "label": "Kotaemon", + "id": "kotaemon_with_milvus.md", + "order": 5, + "children": [] + }, + { + "label": "Dify", + "id": "dify_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "Langflow", + "id": "rag_with_langflow.md", + "order": 7, + "children": [] + }, + { + "label": "DocsGPT", + "id": "use_milvus_in_docsgpt.md", + "order": 9, + "children": [] + }, + { + "label": "PrivateGPT", + "id": "use_milvus_in_private_gpt.md", + "order": 10, + "children": [] + }, + { + "label": "Dynamiq", + "id": "milvus_rag_with_dynamiq.md", + "order": 11, + "children": [] + } + ] + }, + { + "label": "Agen", + "id": "integrate-agents", + "order": 4, + "children": [ + { + "label": "MemGPT", + "id": "integrate_with_memgpt.md", + "order": 0, + "children": [] + }, + { + "label": "Unta", + "id": "integrate_with_camel.md", + "order": 1, + "children": [] + }, + { + "label": "Mem0", + "id": "quickstart_mem0_with_milvus.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Rekayasa Pengetahuan", + "id": "knowledge-engineering", + "order": 5, + "children": [ + { + "label": "MengapaBagaimana", + "id": "integrate_with_whyhow.md", + "order": 0, + "children": [] + }, + { + "label": "Vanna", + "id": "integrate_with_vanna.md", + "order": 1, + "children": [] + }, + { + "label": "Tabel Pengetahuan", + "id": "knowledge_table_with_milvus.md", + "order": 2, + "children": [] + }, + { + "label": "Cognee", + "id": "build_RAG_with_milvus_and_cognee.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Evaluasi & Keteramatan", + "id": "evaluation-observability", + "order": 6, + "children": [ + { + "label": "Ragas", + "id": "integrate_with_ragas.md", + "order": 0, + "children": [] + }, + { + "label": "LangFuse", + "id": "integrate_with_langfuse.md", + "order": 1, + "children": [] + }, + { + "label": "FiftyOne", + "id": "integrate_with_voxel51.md", + "order": 2, + "children": [] + }, + { + "label": "Arize Pheonix", + "id": "evaluation_with_phoenix.md", + "order": 3, + "children": [] + }, + { + "label": "DeepEval", + "id": "evaluation_with_deepeval.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Sumber Data", + "id": "data-sources", + "order": 7, + "children": [ + { + "label": "Airbyte", + "id": "integrate_with_airbyte.md", + "order": 0, + "children": [] + }, + { + "label": "Kafka", + "id": "kafka-connect-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "Apify", + "id": "apify_milvus_rag.md", + "order": 2, + "children": [] + }, + { + "label": "Tidak terstruktur", + "id": "rag_with_milvus_and_unstructured.md", + "order": 3, + "children": [] + }, + { + "label": "Masker PII", + "id": "RAG_with_pii_and_milvus.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Lainnya", + "id": "other-integrations", + "order": 8, + "children": [ + { + "label": "Kepingan salju", + "id": "integrate_with_snowpark.md", + "order": 0, + "children": [] + }, + { + "label": "Lengan", + "id": "build_rag_on_arm.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "Tutorial", + "id": "tutorials", + "isMenu": true, + "order": 7, + "children": [ + { + "label": "Ikhtisar", + "id": "tutorials-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Bangun RAG dengan Milvus", + "id": "build-rag-with-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "RAG tingkat lanjut", + "id": "how_to_enhance_your_rag.md", + "order": 2, + "children": [] + }, + { + "label": "Pencarian Teks Lengkap dengan Milvus", + "id": "full_text_search_with_milvus.md", + "order": 3, + "children": [] + }, + { + "label": "Pencarian Hibrida dengan Milvus", + "id": "hybrid_search_with_milvus.md", + "order": 4, + "children": [] + }, + { + "label": "Pencarian Gambar dengan Milvus", + "id": "image_similarity_search.md", + "order": 5, + "children": [] + }, + { + "label": "Kain lap multimodal", + "id": "multimodal_rag_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "Grafik RAG dengan Milvus", + "id": "graph_rag_with_milvus.md", + "order": 7, + "children": [] + }, + { + "label": "Pengambilan Kontekstual", + "id": "contextual_retrieval_with_milvus.md", + "order": 8, + "children": [] + }, + { + "label": "Pengelompokan HDBSCAN", + "id": "hdbscan_clustering_with_milvus.md", + "order": 9, + "children": [] + }, + { + "label": "Gunakan ColPali untuk Pengambilan Multi-Modal", + "id": "use_ColPali_with_milvus.md", + "order": 10, + "children": [] + }, + { + "label": "Visualisasi Vektor", + "id": "vector_visualization.md", + "order": 11, + "children": [] + }, + { + "label": "Rekomendasi Film", + "id": "movie_recommendation_with_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "Pencarian Corong dengan Penyematan Matryoshka", + "id": "funnel_search_with_matryoshka.md", + "order": 13, + "children": [] + }, + { + "label": "Memulai cepat dengan Attu", + "id": "quickstart_with_attu.md", + "order": 14, + "children": [] + }, + { + "label": "Gunakan AsyncMilvusClient dengan asyncio", + "id": "use-async-milvus-client-with-asyncio.md", + "order": 15, + "children": [] + }, + { + "label": "Jelajahi Lebih Lanjut", + "id": "explore-more", + "order": 99, + "children": [ + { + "label": "Sistem Penjawab Pertanyaan", + "id": "question_answering_system.md", + "order": 5, + "children": [] + }, + { + "label": "Sistem Rekomendasi", + "id": "recommendation_system.md", + "order": 6, + "children": [] + }, + { + "label": "Pencarian Kemiripan Video", + "id": "video_similarity_search.md", + "order": 7, + "children": [] + }, + { + "label": "Pencarian Kemiripan Audio", + "id": "audio_similarity_search.md", + "order": 8, + "children": [] + }, + { + "label": "Klasifikasi Urutan DNA", + "id": "dna_sequence_classification.md", + "order": 9, + "children": [] + }, + { + "label": "Mesin Pencari Teks", + "id": "text_search_engine.md", + "order": 10, + "children": [] + }, + { + "label": "Mesin Pencari Teks ke Gambar", + "id": "text_image_search.md", + "order": 11, + "children": [] + }, + { + "label": "Sistem Deduplikasi Gambar", + "id": "image_deduplication_system.md", + "order": 12, + "children": [] + } + ] + } + ] + }, + { + "label": "Pertanyaan Umum", + "id": "faq", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "Pertanyaan Umum tentang Kinerja", + "id": "performance_faq.md", + "order": 0, + "children": [] + }, + { + "label": "Pertanyaan Umum Produk", + "id": "product_faq.md", + "order": 1, + "children": [] + }, + { + "label": "Pertanyaan Umum Operasional", + "id": "operational_faq.md", + "order": 2, + "children": [] + }, + { + "label": "Batas Milvus", + "id": "limitations.md", + "order": 3, + "children": [] + }, + { + "label": "Pemecahan masalah", + "id": "troubleshooting.md", + "order": 4, + "children": [] + } + ] + } +] \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/es2m.json b/localization/v2.5.x/site/id/migrate/es2m.json new file mode 100644 index 000000000..e4c489baf --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/es2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n workMode: \"elasticsearch\" # operational mode of the migration job.\n reader:\n bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.\nmeta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.\n mode: \"config\" # specifies the source for meta configs. currently, onlly `config` is supported.\n version: \"8.9.1\"\n index: \"qatest_index\" # identifies the Elasticsearch index to migrate data from.\n fields: # fields within the Elasticsearch index to be migrated.\n - name: \"my_vector\" # name of the Elasticsearch field.\n type: \"dense_vector\" # data type of the Elasticsearch field.\n dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.\n - name: \"id\"\n pk: true # specifies if the field serves as a primary key.\n type: \"long\"\n - name: \"num\"\n type: \"integer\"\n - name: \"double1\"\n type: \"double\"\n - name: \"text1\"\n maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.\n type: \"text\"\n - name: \"bl1\"\n type: \"boolean\"\n - name: \"float1\"\n type: \"float\"\n milvus: # configs specific to creating the collection in Milvus 2.x\n collection: \"Collection_01\" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.\n closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.\n shardNum: 2 # number of shards to be created in the collection.\n consistencyLevel: Strong # consistency level for Milvus collection.\nsource: # connection configs for the source Elasticsearch server\n es:\n urls:\n - \"http://10.15.1.***:9200\" # address of the source Elasticsearch server.\n username: \"\" # username for the Elasticsearch server.\n password: \"\" # password for the Elasticsearch server.\ntarget:\n mode: \"remote\" # storage location for dumped files. valid values: `remote` and `local`.\n remote: # configs for remote storage\n outputDir: \"migration/milvus/test\" # output directory path in the cloud storage bucket.\n cloud: \"aws\" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.\n region: \"us-west-2\" # region of the cloud storage; can be any value if using local Minio.\n bucket: \"zilliz-aws-us-****-*-********\" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.\n useIAM: true # whether to use an IAM Role for connection.\n checkBucket: false # checks if the specified bucket exists in the storage.\n milvus2x: # connection configs for the target Milvus 2.x server\n endpoint: \"http://10.102.*.**:19530\" # address of the target Milvus server.\n username: \"****\" # username for the Milvus 2.x server.\n password: \"******\" # password for the Milvus 2.x server.\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[task/load_base_task.go:94] [\"[LoadTasker] Dec Task Processing-------------->\"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[task/load_base_task.go:76] [\"[LoadTasker] Progress Task --------------->\"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[dbclient/cus_field_milvus2x.go:86] [\"[Milvus2x] begin to ShowCollectionRows\"]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static: \"] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static Total\"] [\"Total Collections\"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]\n[migration/es_starter.go:25] [\"[Starter] migration ES to Milvus finish!!!\"] [Cost=80.009174459]\n[starter/starter.go:106] [\"[Starter] Migration Success!\"] [Cost=80.00928425]\n[cleaner/remote_cleaner.go:27] [\"[Remote Cleaner] Begin to clean files\"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]\n[cmd/start.go:32] [\"[Cleaner] clean file success!\"]\n"],"headingContent":"From Elasticsearch","anchorList":[{"label":"Dari Elasticsearch","href":"From-Elasticsearch","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengkonfigurasi berkas migrasi","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Memulai tugas migrasi","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Verifikasi hasilnya","href":"Verify-the-result","type":2,"isActive":false},{"label":"Referensi pemetaan bidang","href":"Field-mapping-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/es2m.md b/localization/v2.5.x/site/id/migrate/es2m.md new file mode 100644 index 000000000..d44564df4 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/es2m.md @@ -0,0 +1,267 @@ +--- +id: es2m.md +summary: >- + Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk + memigrasikan data dari Elasticsearch ke Milvus 2.x. +title: Dari Elasticsearch +--- +

    Dari Elasticsearch

    Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk memigrasikan data dari Elasticsearch ke Milvus 2.x. Dengan mengikuti panduan ini, Anda akan dapat mentransfer data secara efisien, memanfaatkan fitur-fitur canggih Milvus 2.x, dan meningkatkan kinerja.

    +

    Prasyarat

      +
    • Versi perangkat lunak:
        +
      • Sumber Elasticsearch: 7.x atau 8.x
      • +
      • Target Milvus: 2.x
      • +
      • Untuk detail instalasi, lihat Menginstalasi Elasticsearch dan Menginstalasi Milvus.
      • +
    • +
    • Alat yang dibutuhkan:
    • +
    • Tipe data yang didukung untuk migrasi: Bidang-bidang yang akan dimigrasikan dari sumber indeks Elasticsearch adalah dari jenis berikut - dense_vector, kata kunci, teks, long, integer, double, float, boolean, objek. Tipe data yang tidak tercantum di sini saat ini tidak didukung untuk migrasi. Lihat Referensi pemetaan bidang untuk informasi rinci mengenai pemetaan data antara koleksi Milvus dan indeks Elasticsearch.
    • +
    • Persyaratan indeks Elasticsearch:
        +
      • Indeks Elasticsearch sumber harus berisi ruas vektor dengan tipe dense_vector. Migrasi tidak dapat dimulai tanpa bidang vektor.
      • +
    • +
    +

    Mengkonfigurasi berkas migrasi

    Simpan berkas konfigurasi migrasi contoh sebagai migration.yaml dan modifikasi konfigurasi berdasarkan kondisi Anda yang sebenarnya. Anda bebas meletakkan berkas konfigurasi di direktori lokal mana pun.

    +
    dumper: # configs for the migration job.
    +  worker:
    +    workMode: "elasticsearch" # operational mode of the migration job.
    +    reader:
    +      bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.
    +meta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.
    +  mode: "config" # specifies the source for meta configs. currently, onlly `config` is supported.
    +  version: "8.9.1"
    +  index: "qatest_index" # identifies the Elasticsearch index to migrate data from.
    +  fields: # fields within the Elasticsearch index to be migrated.
    +  - name: "my_vector" # name of the Elasticsearch field.
    +    type: "dense_vector" # data type of the Elasticsearch field.
    +    dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.
    +  - name: "id"
    +    pk: true # specifies if the field serves as a primary key.
    +    type: "long"
    +  - name: "num"
    +    type: "integer"
    +  - name: "double1"
    +    type: "double"
    +  - name: "text1"
    +    maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.
    +    type: "text"
    +  - name: "bl1"
    +    type: "boolean"
    +  - name: "float1"
    +    type: "float"
    +  milvus: # configs specific to creating the collection in Milvus 2.x
    +    collection: "Collection_01" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.
    +    closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.
    +    shardNum: 2 # number of shards to be created in the collection.
    +    consistencyLevel: Strong # consistency level for Milvus collection.
    +source: # connection configs for the source Elasticsearch server
    +  es:
    +    urls:
    +    - "http://10.15.1.***:9200" # address of the source Elasticsearch server.
    +    username: "" # username for the Elasticsearch server.
    +    password: "" # password for the Elasticsearch server.
    +target:
    +  mode: "remote" # storage location for dumped files. valid values: `remote` and `local`.
    +  remote: # configs for remote storage
    +    outputDir: "migration/milvus/test" # output directory path in the cloud storage bucket.
    +    cloud: "aws" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.
    +    region: "us-west-2" # region of the cloud storage; can be any value if using local Minio.
    +    bucket: "zilliz-aws-us-****-*-********" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.
    +    useIAM: true # whether to use an IAM Role for connection.
    +    checkBucket: false # checks if the specified bucket exists in the storage.
    +  milvus2x: # connection configs for the target Milvus 2.x server
    +    endpoint: "http://10.102.*.**:19530" # address of the target Milvus server.
    +    username: "****" # username for the Milvus 2.x server.
    +    password: "******" # password for the Milvus 2.x server.
    +
    +

    Tabel berikut ini menjelaskan parameter dalam berkas konfigurasi contoh. Untuk daftar lengkap konfigurasi, lihat Migrasi Milvus: Elasticsearch ke Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + +
      ParameterDeskripsi
      dumper.worker.workModeMode operasional pekerjaan migrasi. Diatur ke elasticsearch ketika melakukan migrasi dari indeks Elasticsearch.
      dumper.worker.reader.bufferSizeUkuran buffer untuk dibaca dari Elasticsearch di setiap batch. Unit: KB.
      +
    • +
    • meta

      + + + + + + + + + + + + + + + + + + + +
      ParameterDeskripsi
      meta.modeMenentukan sumber untuk meta konfigurasi. Saat ini, hanya config yang didukung.
      meta.indexMengidentifikasi indeks Elasticsearch yang akan dimigrasikan datanya.
      meta.fieldsBidang dalam indeks Elasticsearch yang akan dimigrasi.
      meta.fields.nameNama bidang Elasticsearch.
      meta.fields.maxLenPanjang maksimum bidang. Parameter ini hanya diperlukan jika meta.fields.type adalah keyword atau text.
      meta.fields.pkMenentukan apakah bidang berfungsi sebagai kunci utama.
      meta.fields.typeTipe data bidang Elasticsearch. Saat ini, tipe data berikut di Elasticsearch didukung: dense_vector, kata kunci, teks, long, integer, double, float, boolean, objek.
      meta.fields.dimsDimensi bidang vektor. Parameter ini hanya diperlukan jika meta.fields.type adalah dense_vector.
      meta.milvusKonfigurasi khusus untuk membuat koleksi di Milvus 2.x.
      meta.milvus.collectionNama koleksi Milvus. Defaultnya adalah nama indeks Elasticsearch jika tidak ditentukan.
      meta.milvus.closeDynamicFieldMenentukan apakah akan menonaktifkan bidang dinamis dalam koleksi. Defaultnya adalah false. Untuk informasi lebih lanjut tentang bidang dinamis, lihat Mengaktifkan Bidang Dinamis.
      meta.milvus.shardNumJumlah pecahan yang akan dibuat dalam koleksi. Untuk informasi lebih lanjut tentang pecahan, lihat Terminologi.
      meta.milvus.consistencyLevelTingkat konsistensi untuk koleksi di Milvus. Untuk informasi lebih lanjut, lihat Konsistensi.
      +
    • +
    • source

      + + + + + + + + + + +
      ParameterDeskripsi
      source.esKonfigurasi koneksi untuk server Elasticsearch sumber.
      source.es.urlsAlamat server Elasticsearch sumber.
      source.es.usernameNama pengguna untuk server Elasticsearch.
      source.es.passwordKata sandi untuk server Elasticsearch.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + +
      ParameterDeskripsi
      target.modeLokasi penyimpanan untuk file yang dibuang. Nilai yang valid:
      - local: Menyimpan file yang dibuang di disk lokal.
      - remote: Menyimpan file yang dibuang di penyimpanan objek.
      target.remote.outputDirJalur direktori keluaran di ember penyimpanan cloud.
      target.remote.cloudPenyedia layanan penyimpanan cloud. Nilai contoh: aws, gcp, azure.
      target.remote.regionWilayah penyimpanan cloud. Bisa berupa nilai apa pun jika Anda menggunakan MinIO lokal.
      target.remote.bucketNama bucket untuk menyimpan data. Nilainya harus sama dengan konfigurasi di Milvus 2.x. Untuk informasi lebih lanjut, lihat Konfigurasi Sistem.
      target.remote.useIAMApakah akan menggunakan Peran IAM untuk koneksi.
      target.remote.checkBucketApakah akan memeriksa apakah bucket yang ditentukan ada dalam penyimpanan objek.
      target.milvus2xKonfigurasi koneksi untuk server Milvus 2.x target.
      target.milvus2x.endpointAlamat server Milvus target.
      target.milvus2x.usernameNama pengguna untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      target.milvus2x.passwordKata sandi untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      +
    • +
    +

    Memulai tugas migrasi

    Mulai tugas migrasi dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal tempat berkas konfigurasi migration.yaml berada.

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    Berikut ini adalah contoh keluaran log migrasi yang berhasil:

    +
    [task/load_base_task.go:94] ["[LoadTasker] Dec Task Processing-------------->"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[task/load_base_task.go:76] ["[LoadTasker] Progress Task --------------->"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[dbclient/cus_field_milvus2x.go:86] ["[Milvus2x] begin to ShowCollectionRows"]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static: "] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static Total"] ["Total Collections"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]
    +[migration/es_starter.go:25] ["[Starter] migration ES to Milvus finish!!!"] [Cost=80.009174459]
    +[starter/starter.go:106] ["[Starter] Migration Success!"] [Cost=80.00928425]
    +[cleaner/remote_cleaner.go:27] ["[Remote Cleaner] Begin to clean files"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]
    +[cmd/start.go:32] ["[Cleaner] clean file success!"]
    +
    +

    Verifikasi hasilnya

    Setelah tugas migrasi dijalankan, Anda dapat melakukan panggilan API atau menggunakan Attu untuk melihat jumlah entitas yang dimigrasi. Untuk informasi lebih lanjut, lihat Attu dan get_collection_stats().

    +

    Referensi pemetaan bidang

    Tinjau tabel di bawah ini untuk memahami bagaimana tipe field di indeks Elasticsearch dipetakan ke tipe field di koleksi Milvus.

    +

    Untuk informasi lebih lanjut mengenai tipe data yang didukung di Milvus, lihat Tipe data yang didukung.

    + + + + + + + + + + + + + + + +
    Jenis Bidang ElasticsearchJenis Bidang MilvusDeskripsi
    dense_vectorVektor mengambangDimensi vektor tetap tidak berubah selama migrasi.
    kata kunciVarCharTetapkan Panjang Maksimal (1 hingga 65.535). String yang melebihi batas dapat memicu kesalahan migrasi.
    teksVarCharTetapkan Panjang Maks (1 hingga 65.535). String yang melebihi batas dapat memicu kesalahan migrasi.
    panjangInt64-
    bilangan bulatInt32-
    doubleDouble-
    mengambangMengapung-
    booleanBool-
    objekJSON-
    diff --git a/localization/v2.5.x/site/id/migrate/f2m.json b/localization/v2.5.x/site/id/migrate/f2m.json new file mode 100644 index 000000000..8b4d92245 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/f2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n limit: 2\n workMode: faiss # operational mode of the migration job.\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 2\nsource: # configs for the source Faiss index.\n mode: local\n local:\n faissFile: ./testfiles/faiss/faiss_ivf_flat.index\n\ntarget: # configs for the target Milvus collection.\n create:\n collection:\n name: test1w\n shardsNums: 2\n dim: 256\n metricType: L2\n\n mode: remote\n remote:\n outputDir: testfiles/output/\n cloud: aws\n endpoint: 0.0.0.0:9000\n region: ap-southeast-1\n bucket: a-bucket\n ak: minioadmin\n sk: minioadmin\n useIAM: false\n useSSL: false\n checkBucket: true\n milvus2x:\n endpoint: localhost:19530\n username: xxxxx\n password: xxxxx\n\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Faiss","anchorList":[{"label":"Dari Faiss","href":"From-Faiss","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengkonfigurasi migrasi","href":"Configure-the-migration","type":2,"isActive":false},{"label":"Memulai tugas migrasi","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Verifikasi hasil","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/f2m.md b/localization/v2.5.x/site/id/migrate/f2m.md new file mode 100644 index 000000000..09220d702 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/f2m.md @@ -0,0 +1,209 @@ +--- +id: f2m.md +title: Dari Faiss +related_key: 'Faiss, migrate, import' +summary: Pelajari cara memigrasi data Faiss ke Milvus. +--- +

    Dari Faiss

    Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk memigrasikan data dari Faiss ke Milvus 2.x. Dengan mengikuti panduan ini, Anda akan dapat mentransfer data secara efisien, memanfaatkan fitur-fitur canggih Milvus 2.x, dan meningkatkan kinerja.

    +

    Prasyarat

    +

    Mengkonfigurasi migrasi

    Simpan berkas konfigurasi migrasi contoh sebagai migration.yaml dan modifikasi konfigurasi berdasarkan kondisi aktual Anda. Anda bebas meletakkan berkas konfigurasi di direktori lokal mana pun.

    +
    dumper: # configs for the migration job.
    +  worker:
    +    limit: 2
    +    workMode: faiss    # operational mode of the migration job.
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 2
    +source: # configs for the source Faiss index.
    +  mode: local
    +  local:
    +    faissFile: ./testfiles/faiss/faiss_ivf_flat.index
    +
    +target: # configs for the target Milvus collection.
    +  create:
    +    collection:
    +      name: test1w
    +      shardsNums: 2
    +      dim: 256
    +      metricType: L2
    +
    +  mode: remote
    +  remote:
    +    outputDir: testfiles/output/
    +    cloud: aws
    +    endpoint: 0.0.0.0:9000
    +    region: ap-southeast-1
    +    bucket: a-bucket
    +    ak: minioadmin
    +    sk: minioadmin
    +    useIAM: false
    +    useSSL: false
    +    checkBucket: true
    +  milvus2x:
    +    endpoint: localhost:19530
    +    username: xxxxx
    +    password: xxxxx
    +
    +
    +

    Tabel berikut ini menjelaskan parameter dalam file konfigurasi contoh. Untuk daftar lengkap konfigurasi, lihat Migrasi Milvus: Faiss ke Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      ParameterDeskripsi
      dumper.worker.limitKonkurensi utas dumper.
      dumper.worker.workModeMode operasional pekerjaan migrasi. Diatur ke faiss saat bermigrasi dari indeks Faiss.
      dumper.worker.reader.bufferSizeUkuran buffer untuk dibaca dari Faiss dalam setiap batch. Unit: KB.
      dumper.worker.writer.bufferSizeUkuran buffer untuk menulis ke Milvus dalam setiap batch. Unit: KB.
      +
    • +
    • loader

      + + + + + + + +
      ParameterDeskripsi
      loader.worker.limitKonkurensi utas pemuat.
      +
    • +
    • source

      + + + + + + + + +
      ParameterDeskripsi
      source.modeMenentukan dari mana file sumber dibaca. Nilai yang valid:
      - local: membaca file dari disk lokal.
      - remote: membaca file dari penyimpanan jarak jauh.
      source.local.faissFileJalur direktori tempat file sumber berada. Misalnya, /db/faiss.index.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + + + + + + + +
      ParameterDeskripsi
      target.create.collection.nameNama koleksi Milvus.
      target.create.collection.shardsNumsJumlah pecahan yang akan dibuat dalam koleksi. Untuk informasi lebih lanjut tentang pecahan, lihat Terminologi.
      target.create.collection.dimDimensi bidang vektor.
      target.create.collection.metricTypeJenis metrik yang digunakan untuk mengukur kemiripan antar vektor. Untuk informasi lebih lanjut, lihat Terminologi.
      target.modeLokasi penyimpanan untuk file yang dibuang. Nilai yang valid:
      - local: Menyimpan file yang dibuang di disk lokal.
      - remote: Menyimpan file yang dibuang di penyimpanan objek.
      target.remote.outputDirJalur direktori keluaran di ember penyimpanan cloud.
      target.remote.cloudPenyedia layanan penyimpanan cloud. Nilai contoh: aws, gcp, azure.
      target.remote.endpointTitik akhir penyimpanan Milvus 2.x.
      target.remote.regionWilayah penyimpanan cloud. Dapat berupa nilai apa pun jika Anda menggunakan MinIO lokal.
      target.remote.bucketNama bucket untuk menyimpan data. Nilainya harus sama dengan konfigurasi pada Milvus 2.x. Untuk informasi lebih lanjut, lihat Konfigurasi Sistem.
      target.remote.akKunci akses untuk penyimpanan Milvus 2.x.
      target.remote.skKunci rahasia untuk penyimpanan Milvus 2.x.
      target.remote.useIAMApakah akan menggunakan Peran IAM untuk koneksi.
      target.remote.useSSLApakah akan mengaktifkan SSL saat menyambung ke Milvus 2.x. Untuk informasi lebih lanjut, lihat Enkripsi saat Transit.
      target.remote.checkBucketApakah akan memeriksa apakah bucket yang ditentukan ada dalam penyimpanan objek.
      target.milvus2x.endpointAlamat server Milvus target.
      target.milvus2x.usernameNama pengguna untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      target.milvus2x.passwordKata sandi untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      +
    • +
    +

    Memulai tugas migrasi

      +
    1. Mulai tugas migrasi dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal tempat berkas konfigurasi migration.yaml berada.

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      Perintah di atas mengubah data indeks Faiss menjadi file NumPy, dan kemudian menggunakan operasi bulkInsert untuk menulis data ke bucket target.

    2. +
    3. Setelah berkas NumPy dihasilkan, impor berkas-berkas ini ke dalam Milvus 2.x dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal di mana berkas konfigurasi migration.yaml berada.

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    Verifikasi hasil

    Setelah tugas migrasi dijalankan, Anda dapat melakukan panggilan API atau menggunakan Attu untuk melihat jumlah entitas yang dimigrasi. Untuk informasi lebih lanjut, lihat Attu dan get_collection_stats().

    diff --git a/localization/v2.5.x/site/id/migrate/from-m2x.json b/localization/v2.5.x/site/id/migrate/from-m2x.json new file mode 100644 index 000000000..e7c5bb9f5 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/from-m2x.json @@ -0,0 +1 @@ +{"codeList":["dumper:\n worker:\n workMode: milvus2x\n reader:\n bufferSize: 500\n\nmeta:\n mode: config\n version: 2.3.0\n collection: src_table_name\n\nsource:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n\ntarget:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[INFO] [migration/milvus2x_starter.go:79] [\"=================>JobProcess!\"] [Percent=100]\n[INFO] [migration/milvus2x_starter.go:27] [\"[Starter] migration Milvus2x to Milvus2x finish!!!\"] [Cost=94.877717375]\n[INFO] [starter/starter.go:109] [\"[Starter] Migration Success!\"] [Cost=94.878243583]\n","./milvus-migration server run -p 8080\n","curl -XPOST http://localhost:8080/api/v1/start\n","meta:\n fields:\n - name: id\n - name: title_vector\n - name: reading_time\n","meta:\n milvus:\n collection: target_collection_name\n shardNum: 2\n closeDynamicField: false\n consistencyLevel: Customized\n"],"headingContent":"From Milvus 2.3.x","anchorList":[{"label":"Dari Milvus 2.3.x","href":"From-Milvus-23x","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengkonfigurasi berkas migrasi","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Memulai tugas migrasi","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Verifikasi hasilnya","href":"Verify-the-result","type":2,"isActive":false},{"label":"Opsi konfigurasi tambahan","href":"Additional-configuration-options","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/from-m2x.md b/localization/v2.5.x/site/id/migrate/from-m2x.md new file mode 100644 index 000000000..685ca51be --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/from-m2x.md @@ -0,0 +1,220 @@ +--- +id: from-m2x.md +summary: >- + Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk + memigrasi data dari Milvus 2.3.x ke Milvus 2.3.x atau yang lebih tinggi. +title: Dari Milvus 2.3.x +--- +

    Dari Milvus 2.3.x

    Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk memigrasi data dari Milvus 2.3.x ke Milvus 2.3.x atau yang lebih tinggi.

    +

    Prasyarat

      +
    • Versi perangkat lunak:
        +
      • Milvus Sumber: 2.3.0+ (Alat ini menggunakan iterator untuk mengambil data koleksi sumber, sehingga Milvus sumber harus versi 2.3.0 atau lebih tinggi).
      • +
      • Milvus target: 2.3.0+
      • +
    • +
    • Alat yang dibutuhkan:
    • +
    • Persiapan data:
        +
      • Pastikan bahwa koleksi Milvus sumber telah dimuat dan siap untuk ekspor data.
      • +
      • Jika Milvus target tidak berisi koleksi yang sesuai dengan koleksi sumber, alat migrasi-milvus akan secara otomatis membuatnya. Perhatikan bahwa setelah migrasi, koleksi target tidak akan diindeks, dan Anda harus mengindeks koleksi tersebut secara manual.
      • +
    • +
    +

    Mengkonfigurasi berkas migrasi

    Simpan berkas konfigurasi migrasi contoh sebagai migration.yaml dan ubahlah konfigurasinya sesuai dengan kondisi Anda yang sebenarnya. Anda bebas meletakkan berkas konfigurasi di direktori lokal mana pun.

    +
    dumper:
    +  worker:
    +    workMode: milvus2x
    +    reader:
    +      bufferSize: 500
    +
    +meta:
    +  mode: config
    +  version: 2.3.0
    +  collection: src_table_name
    +
    +source:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +target:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +

    Tabel berikut ini menjelaskan parameter dalam berkas konfigurasi contoh. Untuk informasi lebih lanjut, lihat Migrasi Milvus: Milvus2.x ke Milvus2.x.

    +
      +
    • dumper

      + + + + + + + + +
      ParameterDeskripsi
      dumper.worker.workModeMode operasional dari pekerjaan migrasi. Ditetapkan ke milvus2x saat memigrasi dari Milvus 2.x.
      dumper.worker.reader.bufferSizeUkuran buffer untuk dibaca dari Milvus 2.x dalam setiap batch.
      +
    • +
    • meta

      + + + + + + + + + +
      ParameterDeskripsi
      meta.modeMenentukan dari mana file meta dibaca. Diatur ke config, mengindikasikan bahwa meta config dapat diperoleh dari file migration.yaml ini.
      meta.versionSumber versi Milvus. Diatur ke 2.3.0 atau lebih tinggi.
      meta.collectionNama koleksi sumber.
      +
    • +
    • source

      + + + + + + + + + +
      ParameterDeskripsi
      source.milvus2x.endpointAlamat server Milvus sumber.
      source.milvus2x.usernameNama pengguna untuk server Milvus sumber. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      source.milvus2x.passwordKata sandi untuk server Milvus sumber. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      +
    • +
    • target

      + + + + + + + + + +
      ParameterDeskripsi
      target.milvus2x.endpointAlamat server Milvus target.
      target.milvus2x.usernameNama pengguna untuk server Milvus target. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      target.milvus2x.passwordKata sandi untuk server Milvus target. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      +
    • +
    +

    Memulai tugas migrasi

    Anda memiliki dua opsi untuk memulai tugas migrasi - menggunakan CLI atau membuat permintaan API. Pilih salah satu yang paling sesuai dengan kebutuhan Anda.

    +

    Opsi 1: Menggunakan CLI

    Mulai tugas migrasi dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal tempat berkas konfigurasi migration.yaml berada.

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    Pantau log untuk mengetahui pembaruan kemajuan. Log migrasi yang berhasil harus menyertakan entri seperti:

    +
    [INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
    +[INFO] [migration/milvus2x_starter.go:27] ["[Starter] migration Milvus2x to Milvus2x finish!!!"] [Cost=94.877717375]
    +[INFO] [starter/starter.go:109] ["[Starter] Migration Success!"] [Cost=94.878243583]
    +
    +

    Opsi 2: Membuat permintaan API

    Anda juga dapat menggunakan API Restful untuk menjalankan migrasi. Mulai server API dengan:

    +
    ./milvus-migration server run -p 8080
    +
    +

    Setelah server berhasil dijalankan, letakkan berkas migration.yaml di direktori configs/ pada proyek dan mulai migrasi dengan menggunakan:

    +
    curl -XPOST http://localhost:8080/api/v1/start
    +
    +

    Verifikasi hasilnya

    Setelah tugas migrasi selesai, gunakan Attu untuk melihat jumlah entitas yang dimigrasi. Selain itu, Anda dapat membuat indeks dan memuat koleksi di Attu. Untuk informasi lebih lanjut, lihat Attu dan get_collection_stats().

    +

    Opsi konfigurasi tambahan

    Selain konfigurasi dasar yang disebutkan di atas, Anda juga dapat menambahkan pengaturan tambahan berdasarkan kebutuhan spesifik Anda.

    +
      +
    • Migrasi bidang selektif: Jika Anda hanya perlu memigrasikan bidang tertentu dalam koleksi daripada semua bidang, tentukan bidang yang akan dimigrasikan di bagian meta pada file migration.yaml.

      +
      meta:
      +  fields:
      +    - name: id
      +    - name: title_vector
      +    - name: reading_time
      +
    • +
    • Koleksi target khusus: Untuk menyesuaikan properti koleksi target, tambahkan konfigurasi terkait di bagian meta pada file migration.yaml.

      +
      meta:
      +  milvus:
      +    collection: target_collection_name
      +    shardNum: 2
      +    closeDynamicField: false
      +    consistencyLevel: Customized
      +
    • +
    +

    Untuk informasi rinci, lihat Migrasi Milvus: Milvus2.x ke Milvus2.x.

    diff --git a/localization/v2.5.x/site/id/migrate/m2m.json b/localization/v2.5.x/site/id/migrate/m2m.json new file mode 100644 index 000000000..548cc041b --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/m2m.json @@ -0,0 +1 @@ +{"codeList":["./milvus-migration export -m \"user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local\" -o outputDir\n","./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir\n","migration_data\n├── meta.json\n└── tables\n","dumper:\n worker:\n limit: 2\n workMode: milvus1x\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 16\nmeta:\n mode: local\n localFile: /outputDir/test/meta.json\nsource:\n mode: local\n local:\n tablesDir: /db/tables/\ntarget:\n mode: remote\n remote:\n outputDir: \"migration/test/xx\"\n ak: xxxx\n sk: xxxx\n cloud: aws\n region: us-west-2\n bucket: xxxxx\n useIAM: true\n checkBucket: false\n milvus2x:\n endpoint: \"{yourMilvus2_xServerAddress}:{port}\"\n username: xxxx\n password: xxxx\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Milvus 1.x","anchorList":[{"label":"Dari Milvus 1.x","href":"From-Milvus-1x","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mengekspor metadata dari instalasi Milvus sumber","href":"Export-metadata-of-the-source-Milvus-installation","type":2,"isActive":false},{"label":"Konfigurasikan file migrasi","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Memulai tugas migrasi","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Verifikasi hasil","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/m2m.md b/localization/v2.5.x/site/id/migrate/m2m.md new file mode 100644 index 000000000..43f54d601 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/m2m.md @@ -0,0 +1,243 @@ +--- +id: m2m.md +summary: >- + Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk + memigrasi data dari Milvus 1.x (termasuk 0.9.x dan yang lebih baru) ke Milvus + 2.x. +title: Dari Milvus 1.x +--- +

    Dari Milvus 1.x

    Panduan ini menyediakan proses langkah demi langkah yang komprehensif untuk memindahkan data dari Milvus 1.x (termasuk 0.9.x dan yang lebih baru) ke Milvus 2.x. Dengan mengikuti panduan ini, Anda akan dapat memindahkan data Anda secara efisien, dengan memanfaatkan fitur-fitur canggih Milvus 2.x dan meningkatkan kinerja.

    +

    Prasyarat

      +
    • Versi perangkat lunak:
        +
      • Milvus Sumber: 0.9.x hingga 1.x
      • +
      • Target Milvus: 2.x
      • +
    • +
    • Alat yang dibutuhkan:
    • +
    +

    Mengekspor metadata dari instalasi Milvus sumber

    Untuk menyiapkan data migrasi untuk Milvus 0.9.x hingga 1.x, hentikan Milvus sumber atau setidaknya hentikan operasi DML di dalamnya.

    +
      +
    1. Ekspor metadata dari instalasi Milvus sumber ke meta.json.

      +
        +
      • Untuk instalasi yang menggunakan MySQL sebagai backend, jalankan
      • +
      +
      ./milvus-migration export -m "user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local" -o outputDir
      +
      +
        +
      • Untuk instalasi yang menggunakan SQLite sebagai backend, jalankan
      • +
      +
      ./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir
      +
    2. +
    3. Salin folder tables dari instalasi Milvus Anda, lalu pindahkan folder meta.json dan tables ke folder kosong.

      +

      Setelah langkah ini selesai, struktur folder kosong akan terlihat seperti ini:

      +
      migration_data
      +├── meta.json
      +└── tables
      +
    4. +
    5. Unggah folder yang telah disiapkan pada langkah sebelumnya ke ember penyimpanan blok S3 atau langsung gunakan folder lokal ini pada bagian selanjutnya.

    6. +
    +

    Konfigurasikan file migrasi

    Simpan file konfigurasi migrasi contoh sebagai migration.yaml dan modifikasi konfigurasi berdasarkan kondisi aktual Anda. Anda bebas meletakkan file konfigurasi di direktori lokal mana pun.

    +
    dumper:
    +  worker:
    +    limit: 2
    +    workMode: milvus1x
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 16
    +meta:
    +  mode: local
    +  localFile: /outputDir/test/meta.json
    +source:
    +  mode: local
    +  local:
    +    tablesDir: /db/tables/
    +target:
    +  mode: remote
    +  remote:
    +    outputDir: "migration/test/xx"
    +    ak: xxxx
    +    sk: xxxx
    +    cloud: aws
    +    region: us-west-2
    +    bucket: xxxxx
    +    useIAM: true
    +    checkBucket: false
    +  milvus2x:
    +    endpoint: "{yourMilvus2_xServerAddress}:{port}"
    +    username: xxxx
    +    password: xxxx
    +
    +

    Tabel berikut ini menjelaskan parameter dalam berkas konfigurasi contoh. Untuk daftar lengkap konfigurasi, lihat Migrasi Milvus: Milvus1.x ke Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      ParameterDeskripsi
      dumper.worker.limitKonkurensi utas dumper.
      dumper.worker.workModeMode operasional pekerjaan migrasi. Diatur ke milvus1x saat melakukan migrasi dari Milvus 1.x.
      dumper.worker.reader.bufferSizeUkuran buffer untuk dibaca dari Milvus 1.x dalam setiap batch. Unit: KB.
      dumper.worker.writer.bufferSizeUkuran buffer untuk menulis ke Milvus 2.x dalam setiap batch. Unit: KB.
      +
    • +
    • loader

      + + + + + + + +
      ParameterDeskripsi
      loader.worker.limitKonkurensi utas pemuat.
      +
    • +
    • meta

      + + + + + + + + +
      ParameterDeskripsi
      meta.modeMenentukan dari mana file meta meta.json dibaca. Nilai yang valid: local, remote, mysql, sqlite.
      meta.localFileJalur direktori lokal tempat file meta.json berada. Konfigurasi ini hanya digunakan jika meta.mode disetel ke local. Untuk konfigurasi meta lainnya, lihat README_1X.
      +
    • +
    • source

      + + + + + + + + +
      ParameterDeskripsi
      source.modeMenentukan dari mana file sumber dibaca. Nilai yang valid:
      - local: membaca file dari disk lokal.
      - remote: membaca file dari penyimpanan jarak jauh.
      source.local.tablesDirJalur direktori tempat file sumber berada. Misalnya, /db/tables/.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + +
      ParameterDeskripsi
      target.modeLokasi penyimpanan untuk file yang dibuang. Nilai yang valid:
      - local: Menyimpan file yang dibuang di disk lokal.
      - remote: Menyimpan file yang dibuang di penyimpanan objek.
      target.remote.outputDirJalur direktori keluaran di ember penyimpanan cloud.
      target.remote.akKunci akses untuk penyimpanan Milvus 2.x.
      target.remote.skKunci rahasia untuk penyimpanan Milvus 2.x.
      target.remote.cloudPenyedia layanan penyimpanan awan. Contoh nilai: aws, gcp, azure.
      target.remote.regionWilayah penyimpanan cloud. Dapat berupa nilai apa pun jika Anda menggunakan MinIO lokal.
      target.remote.bucketNama bucket untuk menyimpan data. Nilainya harus sama dengan konfigurasi di Milvus 2.x. Untuk informasi lebih lanjut, lihat Konfigurasi Sistem.
      target.remote.useIAMApakah akan menggunakan Peran IAM untuk koneksi.
      target.remote.checkBucketApakah akan memeriksa apakah bucket yang ditentukan ada dalam penyimpanan objek.
      target.milvus2x.endpointAlamat server Milvus target.
      target.milvus2x.usernameNama pengguna untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      target.milvus2x.passwordKata sandi untuk server Milvus 2.x. Parameter ini diperlukan jika autentikasi pengguna diaktifkan untuk server Milvus Anda. Untuk informasi lebih lanjut, lihat Mengaktifkan Autentikasi.
      +
    • +
    +

    Memulai tugas migrasi

      +
    1. Mulai tugas migrasi dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal tempat berkas konfigurasi migration.yaml berada.

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      Perintah di atas akan mengubah data sumber pada Milvus 1.x menjadi berkas NumPy, dan kemudian menggunakan operasi bulkInsert untuk menulis data ke bucket target.

    2. +
    3. Setelah file NumPy dihasilkan, impor file-file ini ke dalam Milvus 2.x dengan perintah berikut. Ganti {YourConfigFilePath} dengan direktori lokal di mana berkas konfigurasi migration.yaml berada.

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    Verifikasi hasil

    Setelah tugas migrasi dijalankan, Anda dapat melakukan panggilan API atau menggunakan Attu untuk melihat jumlah entitas yang dimigrasi. Untuk informasi lebih lanjut, lihat Attu dan get_collection_stats().

    diff --git a/localization/v2.5.x/site/id/migrate/migrate_overview.json b/localization/v2.5.x/site/id/migrate/migrate_overview.json new file mode 100644 index 000000000..dfb88c31e --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/migrate_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Migration Overview","anchorList":[{"label":"Gambaran Umum Migrasi Milvus","href":"Milvus-Migration-Overview","type":1,"isActive":false},{"label":"Migrasi yang didukung","href":"Supported-migrations","type":2,"isActive":false},{"label":"Fitur","href":"Features","type":2,"isActive":false},{"label":"Arsitektur","href":"Architecture","type":2,"isActive":false},{"label":"Rencana masa depan","href":"Future-plans","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/migrate_overview.md b/localization/v2.5.x/site/id/migrate/migrate_overview.md new file mode 100644 index 000000000..65f597e0e --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/migrate_overview.md @@ -0,0 +1,120 @@ +--- +id: migrate_overview.md +summary: >- + Artikel ini memberikan gambaran umum tentang alat migrasi Milvus, termasuk + migrasi yang didukung, fitur, dan arsitektur. +title: Gambaran Umum Migrasi Milvus +--- +

    Gambaran Umum Migrasi Milvus

    Menyadari beragamnya kebutuhan pengguna, Milvus telah memperluas alat migrasi untuk tidak hanya memfasilitasi peningkatan dari versi Milvus 1.x sebelumnya, tetapi juga untuk memungkinkan integrasi data yang lancar dari sistem lain seperti Elasticsearch dan Faiss. Proyek migrasi Milvus dirancang untuk menjembatani kesenjangan antara lingkungan data yang bervariasi ini dan kemajuan terbaru dalam teknologi Milvus, memastikan Anda dapat memanfaatkan fitur dan kinerja yang lebih baik dengan mulus.

    +

    Migrasi yang didukung

    Alat migrasi Milvus mendukung berbagai jalur migrasi untuk mengakomodasi kebutuhan pengguna yang berbeda:

    + +

    Fitur

    Milvus-migrasi dirancang dengan fitur-fitur yang kuat untuk menangani beragam skenario migrasi:

    +
      +
    • Berbagai metode interaksi: Anda dapat melakukan migrasi melalui antarmuka baris perintah atau melalui API Restful, dengan fleksibilitas dalam cara migrasi dijalankan.
    • +
    • Dukungan untuk berbagai format file dan penyimpanan awan: Alat migrasi Milvus dapat menangani data yang disimpan dalam file lokal maupun dalam solusi penyimpanan awan seperti S3, OSS, dan GCP, memastikan kompatibilitas yang luas.
    • +
    • Penanganan tipe data: Milvus-migration mampu menangani data vektor dan bidang skalar, menjadikannya pilihan serbaguna untuk kebutuhan migrasi data yang berbeda.
    • +
    +

    Arsitektur

    Arsitektur Milvus-migration dirancang secara strategis untuk memfasilitasi proses streaming, penguraian, dan penulisan data yang efisien, sehingga memungkinkan kemampuan migrasi yang kuat di berbagai sumber data.

    +

    + + Milvus-migration architecture + Arsitektur migrasi Milvus

    +

    Pada gambar sebelumnya:

    +
      +
    • Sumber data: Milvus-migration mendukung berbagai sumber data termasuk Elasticsearch melalui API gulir, file data penyimpanan lokal atau cloud, dan basis data Milvus 1.x. Semua ini diakses dan dibaca dengan cara yang efisien untuk memulai proses migrasi.
    • +
    • Pipa aliran:
        +
      • Proses penguraian: Data dari sumber diurai sesuai dengan formatnya. Misalnya, untuk sumber data dari Elasticsearch, parser format Elasticsearch digunakan, sementara format lain menggunakan parser masing-masing. Langkah ini sangat penting untuk mengubah data mentah menjadi format terstruktur yang dapat diproses lebih lanjut.
      • +
      • Proses konversi: Setelah penguraian, data mengalami konversi di mana bidang disaring, tipe data dikonversi, dan nama tabel disesuaikan sesuai dengan target skema Milvus 2.x. Hal ini memastikan bahwa data sesuai dengan struktur dan tipe yang diharapkan dalam Milvus.
      • +
    • +
    • Penulisan dan pemuatan data:
        +
      • Menulis data: Data yang telah diproses ditulis ke dalam file JSON atau NumPy perantara, yang siap untuk dimuat ke dalam Milvus 2.x.
      • +
      • Memuat data: Data akhirnya dimuat ke dalam Milvus 2.x menggunakan operasi BulkInsert, yang secara efisien menulis data dalam jumlah besar ke dalam sistem penyimpanan Milvus, baik yang berbasis cloud maupun filestore.
      • +
    • +
    +

    Rencana masa depan

    Tim pengembang berkomitmen untuk meningkatkan migrasi Milvus dengan fitur-fitur seperti:

    +
      +
    • Dukungan untuk lebih banyak sumber data: Berencana untuk memperluas dukungan untuk database dan sistem file tambahan, seperti Pinecone, Chroma, Qdrant. Jika Anda membutuhkan dukungan untuk sumber data tertentu, silakan kirimkan permintaan Anda melalui tautan masalah GitHub ini.
    • +
    • Penyederhanaan perintah: Upaya untuk menyederhanakan proses perintah agar lebih mudah dieksekusi.
    • +
    • Pengurai / konversiSPI: Arsitektur ini diharapkan dapat menyertakan alat bantu Service Provider Interface (SPI) untuk penguraian dan konversi. Alat-alat ini memungkinkan implementasi khusus yang dapat disambungkan oleh pengguna ke dalam proses migrasi untuk menangani format data atau aturan konversi tertentu.
    • +
    • Memulai kembali pos pemeriksaan: Memungkinkan migrasi dilanjutkan dari checkpoint terakhir untuk meningkatkan keandalan dan efisiensi jika terjadi gangguan. Titik penyimpanan akan dibuat untuk memastikan integritas data dan disimpan dalam database seperti SQLite atau MySQL untuk melacak kemajuan proses migrasi.
    • +
    diff --git a/localization/v2.5.x/site/id/migrate/milvusdm_install.json b/localization/v2.5.x/site/id/migrate/milvusdm_install.json new file mode 100644 index 000000000..0b74ea8b5 --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/milvusdm_install.json @@ -0,0 +1 @@ +{"codeList":["# clone the source project\ngit clone https://github.com/zilliztech/milvus-migration.git\n","cd milvus-migration\n","# compile the project to obtain an executable file\ngo get & go build\n"],"headingContent":"Install Migration Tool","anchorList":[{"label":"Menginstal Alat Migrasi","href":"Install-Migration-Tool","type":1,"isActive":false},{"label":"Unduh biner yang dapat dieksekusi","href":"Download-the-executable-binary","type":2,"isActive":false},{"label":"Kompilasi dari sumbernya","href":"Compile-from-source","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/migrate/milvusdm_install.md b/localization/v2.5.x/site/id/migrate/milvusdm_install.md new file mode 100644 index 000000000..092dfe7fb --- /dev/null +++ b/localization/v2.5.x/site/id/migrate/milvusdm_install.md @@ -0,0 +1,91 @@ +--- +id: milvusdm_install.md +summary: Pelajari cara memasang Milvus-Migration untuk memigrasi data Anda. +title: Menginstal Alat Migrasi +--- +

    Menginstal Alat Migrasi

    Kami mendukung pengunduhan file biner yang dapat dieksekusi atau mengkompilasi alat migrasi Milvus dari sumbernya.

    +

    Unduh biner yang dapat dieksekusi

      +
    1. Unduh rilis terbaru dari repositori GitHub Milvus-Migration.
    2. +
    3. Ekstrak berkas yang diunduh untuk mendapatkan berkas biner yang dapat dieksekusi milvus-migration.
    4. +
    +

    Kompilasi dari sumbernya

    Atau, unduh dan kompilasi dari sumbernya untuk mendapatkan berkas biner yang dapat dieksekusi.

    +
      +
    1. Kloning repositori Milvus-Migration:

      +
      # clone the source project
      +git clone https://github.com/zilliztech/milvus-migration.git
      +
    2. +
    3. Navigasikan ke direktori proyek:

      +
      cd milvus-migration
      +
    4. +
    5. Kompilasi proyek untuk mendapatkan berkas yang dapat dieksekusi:

      +
      # compile the project to obtain an executable file
      +go get & go build
      +
      +

      Ini akan menghasilkan file eksekusi milvus-migration di dalam direktori proyek.

    6. +
    +

    Apa selanjutnya

    Setelah menginstal alat Milvus-migration, Anda dapat memigrasi data dari berbagai sumber:

    + diff --git a/localization/v2.5.x/site/id/reference/architecture/architecture_overview.json b/localization/v2.5.x/site/id/reference/architecture/architecture_overview.json new file mode 100644 index 000000000..50d5f0535 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/architecture_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Architecture Overview","anchorList":[{"label":"Gambaran Umum Arsitektur Milvus","href":"Milvus-Architecture-Overview","type":1,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/architecture/architecture_overview.md b/localization/v2.5.x/site/id/reference/architecture/architecture_overview.md new file mode 100644 index 000000000..bfdd3823d --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/architecture_overview.md @@ -0,0 +1,54 @@ +--- +id: architecture_overview.md +summary: >- + Milvus menyediakan basis data vektor yang cepat, andal, dan stabil yang dibuat + khusus untuk pencarian kemiripan dan kecerdasan buatan. +title: Gambaran Umum Arsitektur Milvus +--- +

    Gambaran Umum Arsitektur Milvus

    Dibangun di atas pustaka pencarian vektor populer termasuk Faiss, HNSW, DiskANN, SCANN, dan banyak lagi, Milvus dirancang untuk pencarian kemiripan pada kumpulan data vektor padat yang berisi jutaan, miliaran, atau bahkan triliunan vektor. Sebelum melanjutkan, biasakan diri Anda dengan prinsip-prinsip dasar pengambilan embedding.

    +

    Milvus juga mendukung pecahan data, konsumsi data streaming, skema dinamis, pencarian yang menggabungkan data vektor dan skalar, pencarian multi-vektor dan hibrida, vektor yang jarang, dan banyak fungsi lanjutan lainnya. Platform ini menawarkan kinerja sesuai permintaan dan dapat dioptimalkan agar sesuai dengan skenario pengambilan embedding apa pun. Kami merekomendasikan penerapan Milvus menggunakan Kubernetes untuk ketersediaan dan elastisitas yang optimal.

    +

    Milvus mengadopsi arsitektur penyimpanan bersama yang menampilkan penyimpanan dan pemilahan komputasi serta skalabilitas horizontal untuk node komputasinya. Mengikuti prinsip pemilahan bidang data dan bidang kontrol, Milvus terdiri dari empat lapisan: lapisan akses, layanan koordinator, simpul pekerja, dan penyimpanan. Lapisan-lapisan ini saling independen dalam hal penskalaan atau pemulihan bencana.

    +

    + + Architecture_diagram + Arsitektur_diagram

    +

    Menurut gambar tersebut, antarmuka dapat diklasifikasikan ke dalam kategori berikut:

    +
      +
    • DDL / DCL: createCollection / createPartition / dropCollection / dropPartition / hasCollection / hasPartition
    • +
    • DML / Menghasilkan: menyisipkan / menghapus / meningkatkan
    • +
    • DQL: pencarian / kueri
    • +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/architecture/data_processing.json b/localization/v2.5.x/site/id/reference/architecture/data_processing.json new file mode 100644 index 000000000..4bda8f1e4 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/data_processing.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Data Processing","anchorList":[{"label":"Pengolahan Data","href":"Data-Processing","type":1,"isActive":false},{"label":"Penyisipan data","href":"Data-insertion","type":2,"isActive":false},{"label":"Pembuatan indeks","href":"Index-building","type":2,"isActive":false},{"label":"Permintaan data","href":"Data-query","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/architecture/data_processing.md b/localization/v2.5.x/site/id/reference/architecture/data_processing.md new file mode 100644 index 000000000..8401e1338 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/data_processing.md @@ -0,0 +1,124 @@ +--- +id: data_processing.md +summary: Pelajari tentang prosedur pemrosesan data di Milvus. +title: Pengolahan Data +--- +

    Pengolahan Data

    Artikel ini memberikan penjelasan rinci mengenai implementasi penyisipan data, pembuatan indeks, dan kueri data di Milvus.

    +

    Penyisipan data

    Anda dapat menentukan sejumlah pecahan untuk setiap koleksi di Milvus, setiap pecahan berhubungan dengan sebuah saluran virtual(vchannel). Seperti yang ditunjukkan pada gambar berikut, Milvus memberikan setiap vchannel pada log broker sebuah saluran fisik(pchannel). Setiap permintaan sisipkan/hapus yang masuk dirutekan ke shard berdasarkan nilai hash dari kunci utama.

    +

    Validasi permintaan DML diteruskan ke proxy karena Milvus tidak memiliki transaksi yang rumit. Proxy akan meminta timestamp untuk setiap permintaan insert/delete dari TSO (Timestamp Oracle), yang merupakan modul waktu yang berada di bawah koordinator root. Dengan cap waktu yang lebih lama ditimpa oleh cap waktu yang lebih baru, cap waktu digunakan untuk menentukan urutan permintaan data yang sedang diproses. Proxy mengambil informasi dalam batch dari koordinator data termasuk segmen entitas dan kunci utama untuk meningkatkan throughput secara keseluruhan dan menghindari pembebanan yang berlebihan pada simpul pusat.

    +

    + + Channels 1 + Saluran 1

    +

    Operasi DML (bahasa manipulasi data) dan operasi DDL (bahasa definisi data) ditulis ke urutan log, tetapi operasi DDL hanya diberi satu saluran karena frekuensi kemunculannya yang rendah.

    +

    + + Channels 2 + Saluran 2

    +

    Vchannels dipertahankan di node broker log yang mendasarinya. Setiap saluran secara fisik tidak dapat dibagi dan tersedia untuk semua tetapi hanya satu node. Ketika tingkat konsumsi data mencapai kemacetan, pertimbangkan dua hal: Apakah node log broker kelebihan beban dan perlu diskalakan, dan apakah ada pecahan yang cukup untuk memastikan keseimbangan beban untuk setiap node.

    +

    + + Write log sequence + Tulis urutan log

    +

    Diagram di atas merangkum empat komponen yang terlibat dalam proses penulisan urutan log: proksi, log broker, simpul data, dan penyimpanan objek. Proses ini melibatkan empat tugas: validasi permintaan DML, publikasi-langganan urutan log, konversi dari log streaming ke snapshot log, dan persistensi snapshot log. Keempat tugas tersebut dipisahkan satu sama lain untuk memastikan setiap tugas ditangani oleh jenis node yang sesuai. Node dengan tipe yang sama dibuat sama dan dapat diskalakan secara elastis dan independen untuk mengakomodasi berbagai beban data, khususnya data streaming yang sangat besar dan sangat berfluktuasi.

    +

    Pembuatan indeks

    Pembangunan indeks dilakukan oleh simpul indeks. Untuk menghindari pembangunan indeks yang sering untuk pembaruan data, koleksi di Milvus dibagi lebih lanjut menjadi beberapa segmen, masing-masing dengan indeksnya sendiri.

    +

    + + Index building + Pembuatan indeks

    +

    Milvus mendukung pembangunan indeks untuk setiap bidang vektor, bidang skalar, dan bidang primer. Baik input maupun output dari pembangunan indeks berhubungan dengan penyimpanan objek: Node indeks memuat snapshot log untuk diindeks dari sebuah segmen (yang ada di penyimpanan objek) ke memori, mendeserialisasi data dan metadata yang sesuai untuk membangun indeks, menserialisasi indeks ketika pembangunan indeks selesai, dan menuliskannya kembali ke penyimpanan objek.

    +

    Pembuatan indeks terutama melibatkan operasi vektor dan matriks dan karenanya bersifat komputasi dan memori intensif. Vektor tidak dapat diindeks secara efisien dengan indeks berbasis pohon tradisional karena sifatnya yang berdimensi tinggi, tetapi dapat diindeks dengan teknik yang lebih matang dalam hal ini, seperti indeks berbasis kluster atau grafik. Apa pun jenisnya, membangun indeks melibatkan perhitungan berulang yang sangat besar untuk vektor berskala besar, seperti Kmeans atau graph traverse.

    +

    Tidak seperti pengindeksan untuk data skalar, membangun indeks vektor harus memanfaatkan sepenuhnya akselerasi SIMD (single instruction, multiple data). Milvus memiliki dukungan bawaan untuk set instruksi SIMD, misalnya, SSE, AVX2, dan AVX512. Mengingat "cegukan" dan sifat intensif sumber daya dari pembangunan indeks vektor, elastisitas menjadi sangat penting bagi Milvus dalam hal ekonomi. Rilis Milvus di masa depan akan mengeksplorasi lebih lanjut dalam komputasi heterogen dan komputasi tanpa server untuk menurunkan biaya terkait.

    +

    Selain itu, Milvus juga mendukung pemfilteran skalar dan kueri bidang utama. Milvus memiliki indeks bawaan untuk meningkatkan efisiensi kueri, misalnya indeks filter Bloom, indeks hash, indeks berbasis pohon, dan indeks terbalik, dan berencana untuk memperkenalkan lebih banyak indeks eksternal, misalnya indeks bitmap dan indeks kasar.

    +

    Permintaan data

    Kueri data mengacu pada proses pencarian koleksi tertentu untuk k jumlah vektor yang terdekat dengan vektor target atau untuk semua vektor dalam rentang jarak tertentu ke vektor. Vektor dikembalikan bersama dengan kunci utama dan bidang yang sesuai.

    +

    + + Data query + Permintaan data

    +

    Koleksi di Milvus dibagi menjadi beberapa segmen, dan simpul kueri memuat indeks per segmen. Ketika permintaan pencarian tiba, permintaan tersebut disiarkan ke semua node kueri untuk pencarian bersamaan. Setiap node kemudian memangkas segmen lokal, mencari vektor yang memenuhi kriteria, dan mengurangi dan mengembalikan hasil pencarian.

    +

    Node kueri tidak bergantung satu sama lain dalam kueri data. Setiap node hanya bertanggung jawab untuk dua tugas: Memuat atau melepaskan segmen mengikuti instruksi dari query coord; melakukan pencarian di dalam segmen lokal. Dan proxy bertanggung jawab untuk mengurangi hasil pencarian dari setiap node kueri dan mengembalikan hasil akhir ke klien.

    +

    + + Handoff + Serah terima

    +

    Ada dua jenis segmen, segmen yang berkembang (untuk data tambahan), dan segmen tertutup (untuk data historis). Node kueri berlangganan ke vchannel untuk menerima pembaruan terbaru (data tambahan) sebagai segmen yang berkembang. Ketika segmen yang berkembang mencapai ambang batas yang telah ditentukan, koordinat data menyegelnya dan pembangunan indeks dimulai. Kemudian operasi handoff yang diprakarsai oleh query coord mengubah data tambahan menjadi data historis. Query coord akan mendistribusikan segmen yang disegel secara merata di antara semua node kueri sesuai dengan penggunaan memori, overhead CPU, dan nomor segmen.

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/architecture/four_layers.json b/localization/v2.5.x/site/id/reference/architecture/four_layers.json new file mode 100644 index 000000000..7cab3f242 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/four_layers.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Storage/Computing Disaggregation","anchorList":[{"label":"Pemilahan Penyimpanan/Komputasi","href":"StorageComputing-Disaggregation","type":1,"isActive":false},{"label":"Lapisan akses","href":"Access-layer","type":2,"isActive":false},{"label":"Layanan koordinator","href":"Coordinator-service","type":2,"isActive":false},{"label":"Simpul pekerja","href":"Worker-nodes","type":2,"isActive":false},{"label":"Penyimpanan","href":"Storage","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/architecture/four_layers.md b/localization/v2.5.x/site/id/reference/architecture/four_layers.md new file mode 100644 index 000000000..511e22e9f --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/four_layers.md @@ -0,0 +1,123 @@ +--- +id: four_layers.md +summary: Struktur pemilahan penyimpanan/komputasi di Milvus. +title: Pemilahan Penyimpanan/Komputasi +--- +

    Pemilahan Penyimpanan/Komputasi

    Mengikuti prinsip disagregasi bidang data dan bidang kontrol, Milvus terdiri dari empat lapisan yang saling independen dalam hal skalabilitas dan pemulihan bencana.

    +

    Lapisan akses

    Terdiri dari sekelompok proksi tanpa kewarganegaraan, lapisan akses adalah lapisan depan sistem dan titik akhir bagi pengguna. Lapisan ini memvalidasi permintaan klien dan mengurangi hasil yang dikembalikan:

    +
      +
    • Proxy dengan sendirinya tidak memiliki kewarganegaraan. Ia menyediakan alamat layanan terpadu menggunakan komponen penyeimbang beban seperti Nginx, Kubernetes Ingress, NodePort, dan LVS.
    • +
    • Karena Milvus menggunakan arsitektur pemrosesan paralel masif (MPP), proksi mengumpulkan dan memproses hasil antara sebelum mengembalikan hasil akhir ke klien.
    • +
    +

    Layanan koordinator

    Layanan koordinator memberikan tugas kepada node pekerja dan berfungsi sebagai otak sistem. Tugas-tugas yang dilakukannya meliputi manajemen topologi cluster, penyeimbangan beban, pembuatan stempel waktu, deklarasi data, dan manajemen data.

    +

    Ada tiga jenis koordinator: koordinator akar (root coord), koordinator data (data coord), dan koordinator kueri (query coord).

    +

    Koordinator akar (root coord)

    Root coord menangani permintaan bahasa definisi data (DDL) dan bahasa kontrol data (DCL), seperti membuat atau menghapus koleksi, partisi, atau indeks, serta mengelola TSO (stempel waktu Oracle) dan penerbitan penunjuk waktu.

    +

    Koordinator kueri (query coord)

    Query coord mengelola topologi dan penyeimbangan beban untuk node kueri, dan melakukan handoff dari segmen yang sedang berkembang ke segmen yang disegel.

    +

    Koordinator data (data coord)

    Data coord mengelola topologi node data dan node indeks, memelihara metadata, dan memicu flush, compact, dan pembangunan indeks serta operasi data latar belakang lainnya.

    +

    Simpul pekerja

    Lengan dan kaki. Node pekerja adalah eksekutor bodoh yang mengikuti instruksi dari layanan koordinator dan menjalankan perintah bahasa manipulasi data (DML) dari proksi. Node pekerja tidak memiliki kewarganegaraan berkat pemisahan penyimpanan dan komputasi, dan dapat memfasilitasi perluasan sistem dan pemulihan bencana saat digunakan di Kubernetes. Ada tiga jenis simpul pekerja:

    +

    Node kueri

    Node kueri mengambil data log tambahan dan mengubahnya menjadi segmen yang terus bertambah dengan berlangganan log broker, memuat data historis dari penyimpanan objek, dan menjalankan pencarian hibrida antara data vektor dan skalar.

    +

    Simpul data

    Simpul data mengambil data log tambahan dengan berlangganan ke log broker, memproses permintaan mutasi, dan mengemas data log ke dalam snapshot log dan menyimpannya di penyimpanan objek.

    +

    Simpul indeks

    Simpul indeks membangun indeks. Node indeks tidak perlu menjadi residen memori, dan dapat diimplementasikan dengan kerangka kerja tanpa server.

    +

    Penyimpanan

    Penyimpanan adalah tulang punggung sistem, yang bertanggung jawab atas persistensi data. Ini terdiri dari penyimpanan meta, perantara log, dan penyimpanan objek.

    +

    Penyimpanan meta

    Penyimpanan meta menyimpan snapshot metadata seperti skema koleksi, dan pos pemeriksaan konsumsi pesan. Menyimpan metadata menuntut ketersediaan yang sangat tinggi, konsistensi yang kuat, dan dukungan transaksi, sehingga Milvus memilih etcd untuk meta store. Milvus juga menggunakan etcd untuk registrasi layanan dan pemeriksaan kesehatan.

    +

    Penyimpanan objek

    Penyimpanan objek menyimpan file snapshot dari log, file indeks untuk data skalar dan vektor, dan hasil kueri menengah. Milvus menggunakan MinIO sebagai penyimpanan objek dan dapat dengan mudah digunakan di AWS S3 dan Azure Blob, dua layanan penyimpanan yang paling populer dan hemat biaya di dunia. Namun, penyimpanan objek memiliki latensi akses yang tinggi dan biaya berdasarkan jumlah permintaan. Untuk meningkatkan kinerjanya dan menurunkan biaya, Milvus berencana untuk menerapkan pemisahan data dingin-panas pada kumpulan cache berbasis memori atau SSD.

    +

    Pialang log

    Log broker adalah sistem pub-sub yang mendukung pemutaran. Sistem ini bertanggung jawab untuk streaming persistensi data dan pemberitahuan peristiwa. Ini juga memastikan integritas data tambahan ketika node pekerja pulih dari kerusakan sistem. Cluster Milvus menggunakan Pulsar sebagai perantara log; Milvus mandiri menggunakan RocksDB sebagai perantara log. Selain itu, log broker dapat dengan mudah diganti dengan platform penyimpanan data streaming seperti Kafka.

    +

    Milvus dibangun di sekitar log broker dan mengikuti prinsip "log sebagai data", sehingga Milvus tidak memelihara tabel fisik tetapi menjamin keandalan data melalui persistensi pencatatan dan snapshot log.

    +

    + + Log_mechanism + Mekanisme log

    +

    Log broker adalah tulang punggung Milvus. Ia bertanggung jawab atas persistensi data dan pemilahan baca-tulis, berkat mekanisme pub-sub bawaannya. Ilustrasi di atas menunjukkan penggambaran mekanisme yang disederhanakan, di mana sistem dibagi menjadi dua peran, log broker (untuk menjaga urutan log) dan log subscriber. Yang pertama mencatat semua operasi yang mengubah status koleksi; yang kedua berlangganan urutan log untuk memperbarui data lokal dan menyediakan layanan dalam bentuk salinan hanya-baca. Mekanisme pub-sub juga menyediakan ruang untuk perluasan sistem dalam hal pengambilan data perubahan (CDC) dan penyebaran yang didistribusikan secara global.

    +

    Selanjutnya

      +
    • Baca Komponen Utama untuk detail lebih lanjut tentang arsitektur Milvus.
    • +
    diff --git a/localization/v2.5.x/site/id/reference/architecture/main_components.json b/localization/v2.5.x/site/id/reference/architecture/main_components.json new file mode 100644 index 000000000..0b3db70cc --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/main_components.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Main Components","anchorList":[{"label":"Komponen Utama","href":"Main-Components","type":1,"isActive":false},{"label":"Milvus mandiri","href":"Milvus-standalone","type":2,"isActive":false},{"label":"Milvus cluster","href":"Milvus-cluster","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/architecture/main_components.md b/localization/v2.5.x/site/id/reference/architecture/main_components.md new file mode 100644 index 000000000..37dd7620b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/architecture/main_components.md @@ -0,0 +1,98 @@ +--- +id: main_components.md +summary: Pelajari tentang komponen utama dalam Milvus standalone dan cluster. +title: Komponen Utama +--- +

    Komponen Utama

    Ada dua mode untuk menjalankan Milvus: Standalone dan Cluster. Kedua mode ini memiliki fitur yang sama. Anda bisa memilih mode yang paling sesuai dengan ukuran dataset, data lalu lintas, dan lainnya. Untuk saat ini, Milvus standalone tidak dapat diupgrade "online" ke Milvus cluster.

    +

    Milvus mandiri

    Milvus standalone terdiri dari tiga komponen:

    +
      +
    • Milvus: Komponen fungsional inti.

    • +
    • Meta Store: Mesin metadata, yang mengakses dan menyimpan metadata dari komponen internal Milvus, termasuk proxy, node indeks, dan banyak lagi.

    • +
    • Penyimpanan Objek: Mesin penyimpanan, yang bertanggung jawab atas persistensi data untuk Milvus.

    • +
    +

    + + Standalone_architecture + Arsitektur mandiri

    +

    Milvus cluster

    Milvus cluster mencakup tujuh komponen layanan mikro dan tiga dependensi pihak ketiga. Semua layanan mikro dapat digunakan di Kubernetes, secara independen satu sama lain.

    +

    Komponen layanan mikro

      +
    • Koordinator akar (root coord)
    • +
    • Proxy
    • +
    • Koordinat kueri
    • +
    • Simpul kueri
    • +
    • Koordinat data
    • +
    • Simpul indeks
    • +
    • Simpul data
    • +
    +

    Ketergantungan pihak ketiga

      +
    • Penyimpanan Meta: Menyimpan metadata untuk berbagai komponen dalam cluster, misalnya etcd.
    • +
    • Penyimpanan Objek: Bertanggung jawab atas persistensi data dari file-file besar di dalam cluster, seperti file indeks dan log biner, misalnya S3
    • +
    • Log Broker: Mengelola log dari operasi mutasi terbaru, mengeluarkan log streaming, dan menyediakan layanan publish-subscribe log, misalnya Pulsar.
    • +
    +

    + + Distributed_architecture + Arsitektur terdistribusi

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/benchmark.json b/localization/v2.5.x/site/id/reference/benchmark.json new file mode 100644 index 000000000..f42d41159 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/benchmark.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus 2.2 Benchmark Test Report","anchorList":[{"label":"Laporan Uji Coba Benchmark Milvus 2.2","href":"Milvus-22-Benchmark-Test-Report","type":1,"isActive":false},{"label":"Ringkasan","href":"Summary","type":2,"isActive":false},{"label":"Terminologi","href":"Terminology","type":2,"isActive":false},{"label":"Lingkungan pengujian","href":"Test-environment","type":2,"isActive":false},{"label":"Pipeline pengujian","href":"Test-pipeline","type":2,"isActive":false},{"label":"Hasil pengujian","href":"Test-results","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/benchmark.md b/localization/v2.5.x/site/id/reference/benchmark.md new file mode 100644 index 000000000..a8692ac09 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/benchmark.md @@ -0,0 +1,279 @@ +--- +id: benchmark.md +summary: Pelajari tentang hasil tolok ukur Milvus. +title: Laporan Uji Coba Benchmark Milvus 2.2 +--- +

    Laporan Uji Coba Benchmark Milvus 2.2

    Laporan ini menunjukkan hasil pengujian utama Milvus 2.2.0. Laporan ini bertujuan untuk memberikan gambaran kinerja pencarian Milvus 2.2.0, terutama dalam kemampuan untuk meningkatkan dan mengurangi.

    +
    +
    +
    + Milvus Performance Evaluation 2023 +
    +
    +
    +

    Kami baru saja menjalankan benchmark terhadap Milvus 2.2.3 dan mendapatkan beberapa temuan penting berikut ini:

    +
      +
    • Pengurangan latensi pencarian sebesar 2,5x lipat
    • +
    • Peningkatan 4,5x dalam QPS
    • +
    • Pencarian kemiripan skala miliaran dengan sedikit penurunan kinerja
    • +
    • Skalabilitas linier saat menggunakan beberapa replika
    • +
    +

    Untuk detailnya, silakan merujuk ke whitepaper ini dan kode uji benchmark terkait.

    +
    +
    +

    Ringkasan

      +
    • Dibandingkan dengan Milvus 2.1, QPS Milvus 2.2.0 meningkat lebih dari 48% dalam mode cluster dan lebih dari 75% dalam mode mandiri.
    • +
    • Milvus 2.2.0 memiliki kemampuan yang mengesankan untuk meningkatkan dan menurunkan skala:
        +
      • QPS meningkat secara linear ketika memperluas core CPU dari 8 menjadi 32.
      • +
      • QPS meningkat secara linear ketika memperluas replika Querynode dari 1 hingga 8.
      • +
    • +
    +

    Terminologi

    +Klik untuk melihat detail istilah yang digunakan dalam pengujian + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    IstilahDeskripsi
    nqJumlah vektor yang akan dicari dalam satu permintaan pencarian
    topkJumlah vektor terdekat yang akan diambil untuk setiap vektor (dalam nq) dalam permintaan pencarian
    efParameter pencarian khusus untuk indeks HNSW
    RTWaktu respons dari mengirim permintaan hingga menerima respons
    QPSJumlah permintaan pencarian yang berhasil diproses per detik
    +

    +

    Lingkungan pengujian

    Semua pengujian dilakukan di bawah lingkungan berikut ini.

    +

    Lingkungan perangkat keras

    + + + + + + + + +
    Perangkat kerasSpesifikasi
    CPUIntel® Xeon® Gold 6226R CPU @ 2,90GHz
    MemoriRDIMM 16 * \ 32 GB, 3200 MT/s
    SSDSATA 6 Gbps
    +

    Lingkungan perangkat lunak

    + + + + + + + +
    Perangkat lunakVersi
    Milvusv2.2.0
    Milvus GO SDKv2.2.0
    +

    Skema penyebaran

      +
    • Instance Milvus (mandiri atau klaster) digunakan melalui Helm pada klaster Kubernetes berdasarkan mesin fisik atau virtual.
    • +
    • Pengujian yang berbeda hanya bervariasi dalam jumlah inti CPU, ukuran memori, dan jumlah replika (node pekerja), yang hanya berlaku untuk cluster Milvus.
    • +
    • Konfigurasi yang tidak ditentukan identik dengan konfigurasi default.
    • +
    • Ketergantungan Milvus (MinIO, Pulsar, dan Etcd) menyimpan data pada SSD lokal di setiap node.
    • +
    • Permintaan pencarian dikirim ke instance Milvus melalui Milvus GO SDK.
    • +
    +

    Kumpulan data

    Pengujian ini menggunakan dataset sumber terbuka SIFT (128 dimensi) dari ANN-Benchmarks.

    +

    Pipeline pengujian

      +
    1. Mulai instans Milvus dengan Helm dengan konfigurasi server masing-masing seperti yang tercantum dalam setiap pengujian.
    2. +
    3. Hubungkan ke instance Milvus melalui Milvus GO SDK dan dapatkan hasil pengujian yang sesuai.
    4. +
    5. Buat sebuah koleksi.
    6. +
    7. Masukkan 1 juta vektor SIFT. Buat indeks HNSW dan konfigurasikan parameter indeks dengan mengatur M ke 8 dan efConstruction ke 200.
    8. +
    9. Memuat koleksi.
    10. +
    11. Cari dengan nomor konkuren yang berbeda dengan parameter pencarian nq=1, topk=1, ef=64, durasi setiap konkuren minimal 1 jam.
    12. +
    +

    Hasil pengujian

    Milvus 2.2.0 vs. Milvus 2.1.0

    Cluster

    +Konfigurasi server (cluster)yaml queryNode: replicas: 1 resources: limits: cpu: "12.0" memory: 8Gi requests: cpu: "12.0" memory: 8Gi

    +

    Kinerja pencarian

    + + + + + + + + +
    MilvusQPSRT (TP99) / msRT (TP50) / msgagal / s
    2.1.0690459280
    2.2.01024863240
    +

    + + Cluster search performance + Performa pencarian cluster

    +

    Mandiri

    +Konfigurasi server (mandiri)yaml standalone: replicas: 1 resources: limits: cpu: "12.0" memory: 16Gi requests: cpu: "12.0" memory: 16Gi

    +

    Kinerja pencarian

    + + + + + + + + +
    MilvusQPSRT (TP99) / msRT (TP50) / msgagal / s
    2.1.04287104760
    2.2.07522127790
    +

    + + Standalone search performance + Performa pencarian mandiri

    +

    Peningkatan Skala Milvus 2.2.0

    Perluas inti CPU dalam satu Querynode untuk memeriksa kemampuan peningkatan skala.

    +

    +Konfigurasi server (cluster)yaml queryNode: replicas: 1 resources: limits: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi requests: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi

    +

    Performa Pencarian

    + + + + + + + + + + +
    Inti CPUJumlah bersamaanQPSRT (TP99) / msRT (TP50) / msgagal / s
    85007153127830
    123001024863240
    166001413585420
    326002028163280
    +

    + + Search performance by Querynode CPU cores + Performa pencarian berdasarkan inti CPU Querynode

    +

    Milvus 2.2.0 Peningkatan skala

    Perluas lebih banyak replika dengan lebih banyak Querynode untuk memeriksa kemampuan untuk melakukan scale-out.

    +
    +

    Catatan: jumlah Querynode sama dengan replica_number saat memuat koleksi.

    +
    +

    +Konfigurasi server (cluster)yaml queryNode: replicas: 1 / 2 / 4 / 8 resources: limits: cpu: "8.0" memory: 8Gi requests: cpu: "8.0" memory: 8Gi

    + + + + + + + + + + +
    ReplikaJumlah SerentakQPSRT (TP99) / msRT (TP50) / msgagal / s
    15007153127830
    250015903105270
    480019281109400
    812003065593380
    +

    + + Search performance by Querynode replicas + Performa pencarian dengan replika Querynode

    +

    Apa selanjutnya

      +
    • Coba lakukan pengujian benchmark Milvus 2.2.0 secara mandiri dengan mengacu pada panduan ini, kecuali Anda sebaiknya menggunakan Milvus 2.2 dan Pymilvus 2.2 dalam panduan ini.
    • +
    diff --git a/localization/v2.5.x/site/id/reference/bitset.json b/localization/v2.5.x/site/id/reference/bitset.json new file mode 100644 index 000000000..275fe6699 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/bitset.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Bitset","anchorList":[{"label":"Bitset","href":"Bitset","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Implementasi","href":"Implementation","type":2,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false},{"label":"Apa yang selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/bitset.md b/localization/v2.5.x/site/id/reference/bitset.md new file mode 100644 index 000000000..a0701109c --- /dev/null +++ b/localization/v2.5.x/site/id/reference/bitset.md @@ -0,0 +1,130 @@ +--- +id: bitset.md +summary: Pelajari tentang bitset di Milvus. +title: Bitset +--- +

    Bitset

    Topik ini memperkenalkan mekanisme bitset yang membantu mengaktifkan fungsi-fungsi utama seperti pemfilteran atribut dan operasi hapus di Milvus.

    +

    Gambaran Umum

    Bitset adalah sekumpulan bit. Bit adalah elemen dengan hanya dua nilai yang mungkin, biasanya 0 dan 1, atau nilai boolean true dan false. Dalam Milvus, bitset adalah array dari angka bit 0 dan 1 yang dapat digunakan untuk merepresentasikan data tertentu secara ringkas dan efisien dibandingkan dengan ints, float, atau char. Nomor bit adalah 0 secara default dan hanya diatur ke 1 jika memenuhi persyaratan tertentu.

    +

    Operasi pada bit-bit dilakukan dengan logika boolean, di mana nilai keluarannya valid atau tidak valid, yang juga dilambangkan dengan 1 dan 0. Sebagai contoh, operator logika AND dapat digunakan untuk membandingkan dua bitset berdasarkan item pada posisi indeks yang sama dan menghasilkan bitset baru dengan hasilnya. Jika dua item dalam sebuah posisi adalah sama, maka dalam bitset baru 1 akan dituliskan pada posisi tersebut; 0 jika berbeda.

    +

    Implementasi

    Bitset adalah mekanisme yang sederhana namun kuat yang membantu Milvus melakukan pemfilteran atribut, penghapusan data, dan kueri dengan Time Travel.

    +

    Pemfilteran atribut

    Karena bitset hanya berisi dua nilai yang mungkin, maka bitset sangat cocok untuk menyimpan hasil penyaringan atribut. Data yang memenuhi persyaratan filter atribut yang diberikan ditandai dengan 1.

    +

    Penghapusan data

    Bitset berfungsi sebagai cara yang ringkas untuk menyimpan informasi tentang apakah sebuah baris dalam segmen telah dihapus. Entitas yang dihapus ditandai dengan 1 dalam bitset yang sesuai, yang tidak akan dikomputasi selama pencarian atau kueri.

    +

    Contoh

    Di sini kami menyajikan tiga contoh yang mengilustrasikan bagaimana bitset digunakan di Milvus, dengan referensi ke ketiga implementasi utama bitset yang telah dibahas di atas. Pada ketiga kasus tersebut, terdapat sebuah segmen dengan 8 entitas dan kemudian serangkaian peristiwa bahasa manipulasi data (DML) terjadi dengan urutan seperti yang ditunjukkan di bawah ini.

    +
      +
    • Empat dari entitas, yang primary_keynya masing-masing adalah [1, 2, 3, 4], disisipkan ketika cap waktu ts sama dengan 100.
    • +
    • Empat entitas lainnya, yang primary_keynya adalah [5, 6, 7, 8], disisipkan ketika timestamp ts sama dengan 200.
    • +
    • Entitas yang primary_key-nya [7, 8] dihapus ketika timestamp ts sama dengan 300.
    • +
    • Hanya entitas yang primary_keynya [1, 3, 5, 7] yang memenuhi syarat pemfilteran atribut.
    • +
    +

    + + Order of DML events + Urutan peristiwa DML

    +

    Kasus pertama

    Dalam kasus ini, seorang pengguna menetapkan time_travel sebagai 150, yang berarti bahwa pengguna melakukan kueri pada data yang memenuhi ts = 150. Proses pembangkitan bitset diilustrasikan oleh Gambar 1.

    +

    Pada tahap penyaringan awal, filter_bitset seharusnya adalah [1, 0, 1, 0, 1, 0, 1, 0], di mana entitas [1, 3, 5, 7] ditandai sebagai 1 karena merupakan hasil penyaringan yang valid.

    +

    Namun, entitas [4, 5, 6, 7] tidak dimasukkan ke dalam basis data vektor ketika ts sama dengan 150. Oleh karena itu, keempat entitas ini harus ditandai sebagai 0 terlepas dari kondisi pemfilteran. Sekarang hasil bitset seharusnya menjadi [1, 0, 1, 0, 0, 0, 0, 0].

    +

    Seperti yang telah dibahas di Penghapusan data, entitas yang ditandai dengan 1 akan diabaikan selama pencarian atau kueri. Hasil bitset sekarang perlu dibalik agar dapat digabungkan dengan bitmap penghapusan, yang memberi kita [0, 1, 0, 1, 1, 1, 1, 1].

    +

    Sedangkan untuk bitmap penghapusan del_bitset, nilai awal seharusnya adalah [0, 0, 0, 0, 0, 0, 1, 1]. Namun, entitas 7 dan 8 tidak akan dihapus sampai ts bernilai 300. Oleh karena itu, ketika ts bernilai 150, entitas 7 dan 8 masih valid. Hasilnya, nilai del_bitset setelah Perjalanan Waktu adalah [0, 0, 0, 0, 0, 0, 0, 0].

    +

    Sekarang kita memiliki dua bitset setelah Perjalanan Waktu dan pemfilteran atribut: filter_bitset [0, 1, 0, 1, 1, 1, 1, 1] dan del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . Gabungkan kedua bitset ini dengan operator logika biner OR. Nilai akhir dari result_bitset adalah [0, 1, 0, 1, 1, 1, 1, 1], yang berarti hanya entitas 1 dan 3 yang akan dikomputasi pada tahap pencarian atau kueri berikutnya.

    +

    + + Figure 1. Search with Time Travel = 150. + Gambar 1. Pencarian dengan Time Travel = 150.

    +

    Kasus kedua

    Pada kasus ini, pengguna menetapkan time_travel sebagai 250. Proses pembangkitan bitset diilustrasikan oleh Gambar 2.

    +

    Seperti pada kasus pertama, filter_bitset awal adalah [1, 0, 1, 0, 1, 0, 1, 0].

    +

    Semua entitas ada di dalam basis data vektor ketika ts = 250. Oleh karena itu, filter_bitset tetap sama ketika kita memperhitungkan cap waktu. Sekali lagi, kita perlu membalik hasilnya dan mendapatkan [0, 1, 0, 1, 0, 1, 0, 1].

    +

    Sedangkan untuk penghapusan bitset del_bitset, nilai awalnya adalah [0, 0, 0, 0, 0, 0, 1, 1]. Namun, entitas 7 dan 8 tidak dihapus sampai ts bernilai 300. Oleh karena itu, ketika ts bernilai 250, entitas 7 dan 8 masih valid. Hasilnya, del_bitset setelah Perjalanan Waktu adalah [0, 0, 0, 0, 0, 0, 0, 0].

    +

    Sekarang kita memiliki dua bitset setelah Perjalanan Waktu dan pemfilteran atribut: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] dan del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . Gabungkan kedua bitset ini dengan operator logika biner OR. Hasil_bitset adalah [0, 1, 0, 1, 0, 1, 0, 1]. Dengan kata lain, hanya entit [1, 3, 5, 7] yang akan dikomputasi pada tahap pencarian atau kueri berikutnya.

    +

    + + Figure 2. Search with Time Travel = 250. + Gambar 2. Pencarian dengan Time Travel = 250.

    +

    Kasus tiga

    Pada kasus ini, pengguna menetapkan time_travel sebagai 350. Proses pembangkitan bitset diilustrasikan oleh Gambar 3.

    +

    Seperti kasus-kasus sebelumnya, filter_bitset awal adalah [0, 1, 0, 1, 0, 1, 0, 1].

    +

    Semua entitas ada di dalam basis data vektor ketika ts= 350. Oleh karena itu, filter_bitset akhir yang telah dibalik adalah [0, 1, 0, 1, 0, 1, 0, 1], sama seperti pada kasus kedua.

    +

    Sedangkan untuk bitset penghapusan del_bitset, karena entitas 7 dan 8 telah dihapus ketika ts = 350, oleh karena itu, hasil dari del_bitset adalah [0, 0, 0, 0, 0, 0, 1, 1].

    +

    Sekarang kita memiliki dua bitset setelah Perjalanan Waktu dan pemfilteran atribut: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] dan del_bitset [0, 0, 0, 0, 0, 0, 1, 1] . Gabungkan kedua bitset ini dengan operator logika biner OR. result_bitset yang terakhir adalah [0, 1, 0, 1, 0, 1, 1, 1]. Dengan kata lain, hanya entitas [1, 3, 5] yang akan dikomputasi pada tahap pencarian atau kueri berikut ini.

    +

    + + Figure 3. Search with Time Travel = 350. + Gambar 3. Pencarian dengan Perjalanan Waktu = 350.

    +

    Apa yang selanjutnya

    Sekarang Anda sudah mengetahui bagaimana cara kerja bitset di Milvus, Anda mungkin juga ingin melakukannya:

    + diff --git a/localization/v2.5.x/site/id/reference/coordinator_ha.json b/localization/v2.5.x/site/id/reference/coordinator_ha.json new file mode 100644 index 000000000..139962606 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/coordinator_ha.json @@ -0,0 +1 @@ +{"codeList":["rootCoordinator:\n enabled: true\n # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.\n replicas: 2 # Otherwise, remove this configuration item.\n resources: {}\n nodeSelector: {}\n affinity: {}\n tolerations: []\n extraEnv: []\n heaptrack:\n enabled: false\n profiling:\n enabled: false # Enable live profiling\n activeStandby:\n enabled: true # Set this to true to have RootCoordinators work in active-standby mode.\n"," rootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.2.3\n command: [\"milvus\", \"run\", \"rootcoord\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n PULSAR_ADDRESS: pulsar://pulsar:6650\n ROOT_COORD_ADDRESS: rootcoord:53100\n # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n depends_on:\n - \"etcd\"\n - \"pulsar\"\n - \"minio\"\n\n# add the following to have RootCoords work in active-standby mode\n# rootcoord-1:\n# container_name: milvus-rootcoord-1\n# image: milvusdb/milvus:v2.2.3\n# command: [\"milvus\", \"run\", \"rootcoord\"]\n# environment:\n# ETCD_ENDPOINTS: etcd:2379\n# MINIO_ADDRESS: minio:9000\n# PULSAR_ADDRESS: pulsar://pulsar:6650\n# ROOT_COORD_ADDRESS: rootcoord-1:53100\n# # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n# depends_on:\n# - \"etcd\"\n# - \"pulsar\"\n# - \"minio\"\n","sudo ./scripts/start_cluster.sh\n","rootCoord:\n address: localhost\n port: 53100 # change to 53001\n","sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &\n","ps aux|grep milvus\n","> ps aux|grep milvus\nroot 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord\nroot 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy\nroot 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord\n...\n","[INFO] [sessionutil/session_util.go:649] [\"serverName: rootcoord is in STANDBY ...\"]\n","[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord-15\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] [\"stop watching ACTIVE key\"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] [\"start retrying to register as ACTIVE service...\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] [\"register ACTIVE service successfully\"] [ServerID=19]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] [\"quit STANDBY mode, this node will become ACTIVE\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] [\"rootcoord switch from standby to active, activating\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] [\"RootCoord Register Finished\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] [\"RootCoord start done ...\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] [\"RootCoord successfully started\"]\n"],"headingContent":"Coordinator HA","anchorList":[{"label":"Koordinator HA","href":"Coordinator-HA","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Aktifkan koordinator HA","href":"Enable-coordinator-HA","type":2,"isActive":false},{"label":"Item konfigurasi terkait","href":"Related-configuration-items","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/coordinator_ha.md b/localization/v2.5.x/site/id/reference/coordinator_ha.md new file mode 100644 index 000000000..f5a8ec0ce --- /dev/null +++ b/localization/v2.5.x/site/id/reference/coordinator_ha.md @@ -0,0 +1,195 @@ +--- +id: coordinator_ha.md +summary: >- + Pelajari tentang motivasi dan prosedur bagi koordinator Milvus untuk bekerja + dalam keadaan siaga aktif. +title: Koordinator HA +--- +

    Koordinator HA

    Seperti yang ditunjukkan dalam arsitektur Milvus, Milvus terdiri dari banyak komponen dan membuatnya bekerja secara terdistribusi. Di antara semua komponen, Milvus memastikan ketersediaan yang tinggi dari para pekerja melalui peningkatan dan penurunan skala dari node, menjadikan koordinator sebagai satu-satunya mata rantai yang lemah dalam rantai.

    +

    Gambaran Umum

    Dalam rilis 2.2.3, Milvus mengimplementasikan ketersediaan tinggi untuk koordinator untuk membuatnya bekerja dalam mode siaga aktif, memitigasi kemungkinan titik kegagalan tunggal (SPoF) yang dapat menyebabkan tidak tersedianya layanan.

    +

    + + Coordinator HA + Koordinator HA

    +

    Gambar di atas mengilustrasikan bagaimana koordinator bekerja dalam mode siaga aktif. Ketika sepasang koordinator memulai, mereka mendaftar ke etcd menggunakan ID server mereka dan bersaing untuk mendapatkan peran aktif. Koordinator yang berhasil menyewa peran aktif dari etcd akan mulai melayani, dan koordinator lain dalam pasangan tersebut akan tetap siaga, mengawasi peran aktif dan siap melayani jika koordinator aktif mati.

    +

    Aktifkan koordinator HA

    Dengan Helm

    Untuk memulai beberapa koordinator dan membuat mereka bekerja dalam mode siaga aktif, anda harus membuat perubahan berikut ini pada berkas values.yaml.

    +
      +
    • Atur xxxCoordinator.replicas ke 2.
    • +
    • 2. Atur xxxCoordinator.activeStandby.enabled menjadi true.
    • +
    +

    Cuplikan kode berikut ini menggunakan RootCoord sebagai contoh. Anda dapat melakukan hal yang sama pada koordinator jenis lain.

    +
    rootCoordinator:
    +  enabled: true
    +  # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.
    +  replicas: 2  # Otherwise, remove this configuration item.
    +  resources: {}
    +  nodeSelector: {}
    +  affinity: {}
    +  tolerations: []
    +  extraEnv: []
    +  heaptrack:
    +    enabled: false
    +  profiling:
    +    enabled: false  # Enable live profiling
    +  activeStandby:
    +    enabled: true  # Set this to true to have RootCoordinators work in active-standby mode.
    +
    +

    Dengan Docker

    Untuk memulai beberapa koordinator dan membuatnya bekerja dalam mode siaga-aktif, Anda dapat menambahkan beberapa definisi ke berkas docker-compose yang Anda gunakan untuk memulai klaster Milvus.

    +

    Cuplikan kode berikut ini menggunakan RootCoord sebagai contoh. Anda dapat melakukan hal yang sama pada koordinator jenis lain.

    +
      rootcoord:
    +    container_name: milvus-rootcoord
    +    image: milvusdb/milvus:v2.2.3
    +    command: ["milvus", "run", "rootcoord"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +      PULSAR_ADDRESS: pulsar://pulsar:6650
    +      ROOT_COORD_ADDRESS: rootcoord:53100
    +      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +    depends_on:
    +      - "etcd"
    +      - "pulsar"
    +      - "minio"
    +
    +#   add the following to have RootCoords work in active-standby mode
    +#   rootcoord-1:
    +#    container_name: milvus-rootcoord-1
    +#    image: milvusdb/milvus:v2.2.3
    +#    command: ["milvus", "run", "rootcoord"]
    +#    environment:
    +#      ETCD_ENDPOINTS: etcd:2379
    +#      MINIO_ADDRESS: minio:9000
    +#      PULSAR_ADDRESS: pulsar://pulsar:6650
    +#      ROOT_COORD_ADDRESS: rootcoord-1:53100
    +#      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +#      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +#    depends_on:
    +#      - "etcd"
    +#      - "pulsar"
    +#      - "minio"
    +
    +

    Dengan shell Mac/Linux

    Untuk memulai beberapa koordinator dan membuatnya bekerja dalam mode siaga aktif, Anda dapat

    +
      +
    1. Unduh kode sumber Milvus ke drive lokal Anda, dan mulai sebuah cluster Milvus dari kode sumber sebagai berikut:

      +
      sudo ./scripts/start_cluster.sh
      +
      +

      Milvus akan berjalan dengan hanya satu koordinator dari setiap jenis pada akhir langkah ini.

    2. +
    3. Perbarui milvus.yaml untuk mengubah nomor port dari koordinator setiap jenis. Berikut ini menggunakan rootCoord sebagai contoh.

      +
      rootCoord:
      +  address: localhost
      +  port: 53100 # change to 53001
      +
    4. +
    5. Mulai koordinator siaga.

      +
      sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
      +
      +

      Pada akhir langkah ini, jalankan perintah berikut untuk memverifikasi bahwa dua proses koordinator ada.

      +
      ps aux|grep milvus
      +
      +

      Keluarannya seharusnya mirip dengan

      +
      > ps aux|grep milvus
      +root        12813   0.7 0.2 410709648   82432   ??  S   5:18PM  0:33.28 ./bin/milvus run rootcoord
      +root        12816   0.5 0.2 409487968   62352   ??  S   5:18PM  0:22.69 ./bin/milvus run proxy
      +root        17739   0.1 0.3 410289872   91792 s003  SN  6:01PM  0:00.30 ./bin/milvus run rootcoord
      +...
      +
      +

      Dan koordinator siaga mengeluarkan entri log setiap sepuluh detik sebagai berikut:

      +
      [INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
      +
    6. +
    7. Matikan koordinator aktif pada pasangan dan perhatikan perilaku koordinator siaga.

      +

      Anda dapat menemukan bahwa dibutuhkan 60 detik bagi koordinator siaga untuk mengambil alih peran aktif.

      +
      [2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
      +
    8. +
    +

    Koordinator HA dinonaktifkan secara default. Anda dapat mengaktifkan fitur ini secara manual dengan mengubah item berikut dalam file konfigurasi Milvus Anda.

    + +

    Batasan

    Saat ini, tidak ada jaminan konsistensi yang kuat antara layanan aktif dan siaga. Oleh karena itu, koordinator siaga perlu memuat ulang metadata saat mengambil alih peran aktif.

    +

    Etcd melepaskan sewa hanya setelah sesi saat ini habis. Batas waktu sesi secara default adalah 60 detik. Oleh karena itu, ada jeda 60 detik antara saat koordinator aktif mati dan saat koordinator siaga mengambil alih peran aktif.

    diff --git a/localization/v2.5.x/site/id/reference/disk_index.json b/localization/v2.5.x/site/id/reference/disk_index.json new file mode 100644 index 000000000..10fbc595c --- /dev/null +++ b/localization/v2.5.x/site/id/reference/disk_index.json @@ -0,0 +1 @@ +{"codeList":["...\nDiskIndex:\n MaxDegree: 56\n SearchListSize: 100\n PQCodeBugetGBRatio: 0.125\n SearchCacheBudgetGBRatio: 0.125\n BeamWidthRatio: 4.0\n...\n"],"headingContent":"On-disk Index","anchorList":[{"label":"Indeks Pada Disk","href":"On-disk-Index","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false},{"label":"Pengaturan indeks dan pencarian","href":"Index-and-search-settings","type":2,"isActive":false},{"label":"Konfigurasi Milvus yang terkait dengan DiskANN","href":"DiskANN-related-Milvus-configurations","type":2,"isActive":false},{"label":"Pemecahan masalah","href":"Troubleshooting","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/disk_index.md b/localization/v2.5.x/site/id/reference/disk_index.md new file mode 100644 index 000000000..987ca818c --- /dev/null +++ b/localization/v2.5.x/site/id/reference/disk_index.md @@ -0,0 +1,159 @@ +--- +id: disk_index.md +related_key: disk_index +summary: Mekanisme indeks disk di Milvus. +title: Indeks Pada Disk +--- +

    Indeks Pada Disk

    Artikel ini memperkenalkan algoritme pengindeksan dalam disk yang dinamai DiskANN. Berdasarkan grafik Vamana, DiskANN mendukung pencarian yang efisien dalam kumpulan data yang besar.

    +

    Untuk meningkatkan performa kueri, Anda dapat menentukan jenis indeks untuk setiap bidang vektor.

    +
    +Saat ini, bidang vektor hanya mendukung satu jenis indeks. Milvus secara otomatis menghapus indeks lama ketika mengganti jenis indeks.
    +

    Prasyarat

    Untuk menggunakan DiskANN, perhatikan bahwa

    +
      +
    • DiskANN dinonaktifkan secara default. Jika Anda lebih memilih indeks dalam memori daripada indeks pada disk, Anda disarankan untuk menonaktifkan fitur ini untuk kinerja yang lebih baik.
        +
      • Untuk menonaktifkannya, Anda dapat mengubah queryNode.enableDisk menjadi false pada berkas konfigurasi milvus Anda.
      • +
      • Untuk mengaktifkannya kembali, Anda dapat mengatur queryNode.enableDisk ke true.
      • +
    • +
    • Instance Milvus berjalan pada Ubuntu 18.04.6 atau rilis yang lebih baru.
    • +
    • Jalur data Milvus harus dipasang ke SSD NVMe untuk performa penuh:
        +
      • Untuk instans Milvus Standalone, jalur data harus berada di /var/lib/milvus/data di dalam kontainer tempat instans berjalan.
      • +
      • Untuk instans Milvus Cluster, jalur data harus /var/lib/milvus/data di wadah tempat QueryNodes dan IndexNodes berjalan.
      • +
    • +
    +

    Batasan

    Untuk menggunakan DiskANN, pastikan Anda

    +
      +
    • Gunakan hanya vektor float dengan setidaknya 1 dimensi dalam data Anda.
    • +
    • Gunakan hanya Euclidean Distance (L2), Inner Product (IP), atau COSINE untuk mengukur jarak antar vektor.
    • +
    +

    Pengaturan indeks dan pencarian

      +
    • Parameter pembuatan indeks

      +

      Saat membuat indeks DiskANN, gunakan DISKANN sebagai jenis indeks. Tidak ada parameter indeks yang diperlukan.

    • +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      search_listUkuran daftar kandidat, ukuran yang lebih besar menawarkan tingkat penarikan yang lebih tinggi dengan kinerja yang menurun.[topk, int32_max]16
      +
    • +
    +

    DiskANN dapat disetel. Anda dapat memodifikasi parameter terkait DiskANN di ${MILVUS_ROOT_PATH}/configs/milvus.yaml untuk meningkatkan kinerjanya.

    +
    ...
    +DiskIndex:
    +  MaxDegree: 56
    +  SearchListSize: 100
    +  PQCodeBugetGBRatio: 0.125
    +  SearchCacheBudgetGBRatio: 0.125
    +  BeamWidthRatio: 4.0
    +...
    +
    + + + + + + + + + + + +
    ParameterDeskripsiRentang NilaiNilai Default
    MaxDegreeDerajat maksimum grafik Vamana.
    Nilai yang lebih besar menawarkan tingkat penarikan yang lebih tinggi tetapi meningkatkan ukuran dan waktu untuk membangun indeks.
    [1, 512]56
    SearchListSizeUkuran daftar kandidat.
    Nilai yang lebih besar meningkatkan waktu yang dihabiskan untuk membangun indeks tetapi menawarkan tingkat penarikan yang lebih tinggi.
    Tetapkan ke nilai yang lebih kecil dari MaxDegree kecuali jika Anda perlu mengurangi waktu pembuatan indeks.
    [1, int32_max]100
    PQCodeBugetGBRatioBatas ukuran pada kode PQ.
    Nilai yang lebih besar menawarkan tingkat pemanggilan yang lebih tinggi tetapi meningkatkan penggunaan memori.
    (0.0, 0.25]0.125
    SearchCacheBudgetGBRatioRasio nomor simpul yang di-cache terhadap data mentah.
    Nilai yang lebih besar meningkatkan kinerja pembuatan indeks dengan peningkatan penggunaan memori.
    [0.0, 0.3)0.10
    BeamWidthRatioRasio antara jumlah maksimum permintaan IO per iterasi pencarian dan nomor CPU.[1, max(128 / nomor CPU, 16)]4.0
    +

    Pemecahan masalah

      +
    • Bagaimana cara mengatasi kesalahan io_setup() failed; returned -11, errno=11:Resource temporarily unavailable?

      +

      Kernel Linux menyediakan fitur Asynchronous non-blocking I/O (AIO) yang memungkinkan sebuah proses memulai beberapa operasi I/O secara bersamaan tanpa harus menunggu sampai operasi tersebut selesai. Hal ini membantu meningkatkan kinerja untuk aplikasi yang dapat tumpang tindih antara pemrosesan dan I/O.

      +

      Performa dapat disetel menggunakan file virtual /proc/sys/fs/aio-max-nr dalam sistem file proc. Parameter aio-max-nr menentukan jumlah maksimum permintaan bersamaan yang diijinkan.

      +

      aio-max-nr defaultnya adalah 65535, Anda dapat mengaturnya ke 10485760.

    • +
    diff --git a/localization/v2.5.x/site/id/reference/glossary.json b/localization/v2.5.x/site/id/reference/glossary.json new file mode 100644 index 000000000..2c2f0bade --- /dev/null +++ b/localization/v2.5.x/site/id/reference/glossary.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Terminology","anchorList":[{"label":"Terminologi","href":"Terminology","type":1,"isActive":false},{"label":"AutoID","href":"AutoID","type":2,"isActive":false},{"label":"Indeks Otomatis","href":"Auto-Index","type":2,"isActive":false},{"label":"Attu","href":"Attu","type":2,"isActive":false},{"label":"Pengamat Burung","href":"Birdwatcher","type":2,"isActive":false},{"label":"Penulis Massal","href":"Bulk-Writer","type":2,"isActive":false},{"label":"Sisipan Massal","href":"Bulk-Insert","type":2,"isActive":false},{"label":"Cardinal","href":"Cardinal","type":2,"isActive":false},{"label":"Saluran","href":"Channel","type":2,"isActive":false},{"label":"Koleksi","href":"Collection","type":2,"isActive":false},{"label":"Ketergantungan","href":"Dependency","type":2,"isActive":false},{"label":"Skema dinamis","href":"Dynamic-schema","type":2,"isActive":false},{"label":"Penyematan","href":"Embeddings","type":2,"isActive":false},{"label":"Entitas","href":"Entity","type":2,"isActive":false},{"label":"Field","href":"Field","type":2,"isActive":false},{"label":"Filter","href":"Filter","type":2,"isActive":false},{"label":"Pencarian yang difilter","href":"Filtered-search","type":2,"isActive":false},{"label":"Pencarian hibrida","href":"Hybrid-search","type":2,"isActive":false},{"label":"Indeks","href":"Index","type":2,"isActive":false},{"label":"Konektor Kafka-Milvus","href":"Kafka-Milvus-Connector","type":2,"isActive":false},{"label":"Knowhere","href":"Knowhere","type":2,"isActive":false},{"label":"Pialang log","href":"Log-broker","type":2,"isActive":false},{"label":"Cuplikan log","href":"Log-snapshot","type":2,"isActive":false},{"label":"Pelanggan log","href":"Log-subscriber","type":2,"isActive":false},{"label":"Penyimpanan pesan","href":"Message-storage","type":2,"isActive":false},{"label":"Jenis metrik","href":"Metric-type","type":2,"isActive":false},{"label":"Mmap","href":"Mmap","type":2,"isActive":false},{"label":"Cadangan Milvus","href":"Milvus-Backup","type":2,"isActive":false},{"label":"Milvus CDC","href":"Milvus-CDC","type":2,"isActive":false},{"label":"Milvus CLI","href":"Milvus-CLI","type":2,"isActive":false},{"label":"Migrasi Milvus","href":"Milvus-Migration","type":2,"isActive":false},{"label":"Cluster Milvus","href":"Milvus-cluster","type":2,"isActive":false},{"label":"Milvus mandiri","href":"Milvus-standalone","type":2,"isActive":false},{"label":"Multi-Vektor","href":"Multi-Vector","type":2,"isActive":false},{"label":"Partisi","href":"Partition","type":2,"isActive":false},{"label":"Kunci partisi","href":"Partition-key","type":2,"isActive":false},{"label":"PChannel","href":"PChannel","type":2,"isActive":false},{"label":"PyMilvus","href":"PyMilvus","type":2,"isActive":false},{"label":"Query","href":"Query","type":2,"isActive":false},{"label":"Pencarian rentang","href":"Range-search","type":2,"isActive":false},{"label":"Skema","href":"Schema","type":2,"isActive":false},{"label":"Pencarian","href":"Search","type":2,"isActive":false},{"label":"Segmen","href":"Segment","type":2,"isActive":false},{"label":"Konektor Spark-Milvus","href":"Spark-Milvus-Connector","type":2,"isActive":false},{"label":"Pecahan","href":"Shard","type":2,"isActive":false},{"label":"Vektor jarang","href":"Sparse-vector","type":2,"isActive":false},{"label":"Data tidak terstruktur","href":"Unstructured-data","type":2,"isActive":false},{"label":"VChannel","href":"VChannel","type":2,"isActive":false},{"label":"Vektor","href":"Vector","type":2,"isActive":false},{"label":"Zilliz Cloud","href":"Zilliz-Cloud","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/glossary.md b/localization/v2.5.x/site/id/reference/glossary.md new file mode 100644 index 000000000..776bad7af --- /dev/null +++ b/localization/v2.5.x/site/id/reference/glossary.md @@ -0,0 +1,806 @@ +--- +id: glossary.md +title: Terminologi +--- +

    Terminologi

    AutoID

    AutoID adalah atribut bidang utama yang menentukan apakah akan mengaktifkan AutoIncrement untuk bidang utama. Nilai AutoID ditentukan berdasarkan stempel waktu. Untuk informasi lebih lanjut, lihat create_schema.

    +

    Indeks Otomatis

    Milvus secara otomatis menentukan jenis indeks dan parameter yang paling tepat untuk field tertentu berdasarkan data empiris. Ini ideal untuk situasi ketika Anda tidak perlu mengontrol param indeks tertentu. Untuk informasi lebih lanjut, lihat add_index.

    +

    Attu

    Attu adalah alat administrasi lengkap untuk Milvus yang secara signifikan mengurangi kerumitan dan biaya pengelolaan sistem.

    +

    Pengamat Burung

    Birdwatcher adalah alat debugging untuk Milvus yang terhubung ke etcd, memungkinkan Anda untuk memonitor status server Milvus dan membuat penyesuaian secara real-time. Alat ini juga mendukung backup file etcd, membantu pengembang dalam pemecahan masalah.

    +

    Penulis Massal

    Bulk Writer adalah alat pemrosesan data yang disediakan oleh SDK Milvus (misalnya PyMilvus, Java SDK), yang dirancang untuk mengonversi kumpulan data mentah ke dalam format yang kompatibel dengan Milvus untuk mengimpor secara efisien.

    +

    Sisipan Massal

    Bulk Insert adalah API yang meningkatkan kinerja penulisan dengan mengizinkan beberapa file diimpor dalam satu permintaan, mengoptimalkan operasi dengan dataset besar.

    +

    Cardinal

    Cardinal, yang dikembangkan oleh Zilliz Cloud, adalah algoritme pencarian vektor mutakhir yang memberikan kualitas dan kinerja pencarian yang tak tertandingi. Dengan desain inovatif dan pengoptimalan yang ekstensif, Cardinal mengungguli Knowhere beberapa kali lipat dengan urutan yang lebih besar sambil secara adaptif menangani beragam skenario produksi, seperti ukuran K yang bervariasi, pemfilteran yang tinggi, distribusi data yang berbeda, dan sebagainya.

    +

    Saluran

    Milvus menggunakan dua jenis saluran, PChannel dan VChannel. Setiap PChannel berhubungan dengan topik untuk penyimpanan log, sementara setiap VChannel berhubungan dengan pecahan dalam koleksi.

    +

    Koleksi

    Dalam Milvus, koleksi setara dengan tabel dalam sistem manajemen basis data relasional (RDBMS). Koleksi adalah objek logis utama yang digunakan untuk menyimpan dan mengelola entitas. Untuk informasi lebih lanjut, lihat Mengelola Koleksi.

    +

    Ketergantungan

    Ketergantungan adalah sebuah program yang diandalkan oleh program lain untuk bekerja. Ketergantungan Milvus meliputi etcd (menyimpan meta data), MinIO atau S3 (penyimpanan objek), dan Pulsar (mengelola snapshot log). Untuk informasi lebih lanjut, lihat Mengelola Ketergantungan.

    +

    Skema dinamis

    Skema dinamis memungkinkan Anda menyisipkan entitas dengan bidang baru ke dalam koleksi tanpa mengubah skema yang sudah ada. Ini berarti Anda dapat menyisipkan data tanpa mengetahui skema lengkap koleksi dan dapat menyertakan bidang yang belum didefinisikan. Anda dapat mengaktifkan kemampuan bebas skema ini dengan mengaktifkan bidang dinamis saat membuat koleksi. Untuk informasi lebih lanjut, lihat Mengaktifkan Bidang Dinamis.

    +

    Penyematan

    Milvus menawarkan fungsi penyematan bawaan yang dapat digunakan dengan penyedia penyematan yang populer. Sebelum membuat koleksi di Milvus, Anda dapat menggunakan fungsi-fungsi ini untuk menghasilkan penyematan untuk kumpulan data Anda, menyederhanakan proses penyiapan data dan pencarian vektor. Untuk membuat penyematan secara langsung, lihat Menggunakan Model PyMilvus Untuk Menghasilkan Penyematan Teks.

    +

    Entitas

    Entitas terdiri dari sekelompok bidang yang merepresentasikan objek dunia nyata. Setiap entitas di Milvus diwakili oleh sebuah kunci primer yang unik.

    +

    Anda dapat menyesuaikan kunci utama. Jika anda tidak mengkonfigurasi secara manual, Milvus akan secara otomatis memberikan primary key ke entitas. Jika Anda memilih untuk menyesuaikan primary key, perhatikan bahwa Milvus tidak mendukung de-duplikasi primary key untuk saat ini. Oleh karena itu, bisa saja terdapat duplikat primary key dalam koleksi yang sama. Untuk informasi lebih lanjut, lihat Menyisipkan Entitas.

    +

    Field

    Sebuah field dalam koleksi Milvus setara dengan kolom tabel dalam RDBMS. Field dapat berupa field skalar untuk data terstruktur (misalnya, angka, string), atau field vektor untuk menyematkan vektor.

    +

    Filter

    Milvus mendukung pemfilteran skalar dengan mencari dengan predikat, memungkinkan Anda untuk menentukan kondisi filter dalam kueri dan pencarian untuk mempersempit hasil.

    +

    Pencarian yang difilter menerapkan filter skalar ke pencarian vektor, memungkinkan Anda untuk menyaring hasil pencarian berdasarkan kriteria tertentu. Untuk informasi lebih lanjut, lihat Pencarian yang difilter.

    +

    Pencarian Hibrida adalah API untuk pencarian hibrida sejak Milvus 2.4.0. Anda dapat mencari beberapa bidang vektor dan menggabungkannya. Untuk pencarian vektor yang digabungkan dengan pemfilteran bidang skalar, ini disebut sebagai "pencarian yang difilter". Untuk informasi lebih lanjut, lihat Pencarian Hibrida.

    +

    Indeks

    Indeks vektor adalah struktur data yang ditata ulang yang berasal dari data mentah yang dapat mempercepat proses pencarian kesamaan vektor. Milvus mendukung berbagai jenis indeks untuk bidang vektor dan bidang skalar. Untuk informasi lebih lanjut, lihat Jenis indeks vektor.

    +

    Konektor Kafka-Milvus

    Konektor Kafka-Milvus mengacu pada konektor sink Kafka untuk Milvus. Konektor ini memungkinkan Anda untuk mengalirkan data vektor dari Kafka ke Milvus.

    +

    Knowhere

    Knowhere adalah mesin eksekusi vektor inti dari Milvus yang menggabungkan beberapa pustaka pencarian kemiripan vektor termasuk Faiss, Hnswlib, dan Annoy. Knowhere juga dirancang untuk mendukung komputasi heterogen. Knowhere mengontrol perangkat keras (CPU atau GPU) mana yang akan menjalankan pembuatan indeks dan permintaan pencarian. Inilah bagaimana Knowhere mendapatkan namanya - mengetahui di mana harus menjalankan operasi.

    +

    Pialang log

    Log broker adalah sistem publish-subscribe yang mendukung pemutaran. Sistem ini bertanggung jawab untuk streaming persistensi data, eksekusi kueri asinkron yang andal, pemberitahuan peristiwa, dan pengembalian hasil kueri. Ini juga memastikan integritas data tambahan ketika node pekerja pulih dari kerusakan sistem.

    +

    Cuplikan log

    Snapshot log adalah log biner, sebuah unit yang lebih kecil dalam segmen yang mencatat dan menangani pembaruan dan perubahan yang dilakukan pada data di Milvus. Data dari sebuah segmen disimpan dalam beberapa binlog. Ada tiga jenis binlog di Milvus: InsertBinlog, DeleteBinlog, dan DDLBinlog. Untuk informasi lebih lanjut, lihat Penyimpanan Meta.

    +

    Pelanggan log

    Pelanggan log berlangganan ke urutan log untuk memperbarui data lokal dan menyediakan layanan dalam bentuk salinan hanya-baca.

    +

    Penyimpanan pesan

    Penyimpanan pesan adalah mesin penyimpanan log Milvus. Milvus mendukung Kafka atau Pulsa sebagai penyimpanan pesan. Untuk informasi lebih lanjut, lihat Mengonfigurasi Penyimpanan Pesan.

    +

    Jenis metrik

    Jenis metrik kemiripan digunakan untuk mengukur kemiripan antara vektor. Saat ini, Milvus mendukung jenis metrik Euclidean distance (L2), Inner product (IP), Cosine similarity (COSINE), dan biner. Anda dapat memilih jenis metrik yang paling tepat berdasarkan skenario Anda. Untuk informasi lebih lanjut, lihat Metrik Kemiripan.

    +

    Mmap

    File yang dipetakan ke memori memungkinkan penanganan data yang efisien dengan memetakan konten file secara langsung ke dalam memori. Hal ini sangat berguna ketika memori terbatas dan memuat semua data tidak memungkinkan. Teknik ini dapat meningkatkan kapasitas data dan mempertahankan kinerja hingga batas tertentu. Namun, jika data sangat melebihi kapasitas memori, kecepatan pencarian dan kueri dapat menurun secara signifikan. Untuk informasi lebih lanjut, lihat Penyimpanan Data yang mendukung MMap.

    +

    Cadangan Milvus

    Milvus Backup adalah alat untuk membuat salinan data, yang dapat digunakan untuk memulihkan data asli setelah peristiwa kehilangan data.

    +

    Milvus CDC

    Milvus CDC (Change data capture) adalah alat yang mudah digunakan yang dapat menangkap dan menyinkronkan data tambahan dalam instance Milvus. Alat ini memastikan keandalan data bisnis dengan mentransfernya secara mulus antara instance sumber dan target, sehingga memudahkan pencadangan dan pemulihan bencana.

    +

    Milvus CLI

    Milvus Command-Line Interface (CLI) adalah alat bantu baris perintah yang mendukung koneksi basis data, operasi data, serta impor dan ekspor data. Berdasarkan Milvus Python SDK, alat ini memungkinkan eksekusi perintah melalui terminal menggunakan prompt baris perintah interaktif.

    +

    Migrasi Milvus

    Milvus Migration adalah alat sumber terbuka yang dirancang untuk memfasilitasi migrasi data yang mudah dari berbagai sumber data ke dalam Milvus 2.x.

    +

    Cluster Milvus

    Dalam penerapan cluster Milvus, layanan disediakan oleh sekelompok node untuk mencapai ketersediaan yang tinggi dan skalabilitas yang mudah.

    +

    Milvus mandiri

    Dalam penerapan Milvus secara mandiri, semua operasi termasuk penyisipan data, pembuatan indeks, dan pencarian kemiripan vektor diselesaikan dalam satu proses.

    +

    Multi-Vektor

    Milvus mendukung beberapa bidang vektor dalam satu koleksi sejak versi 2.4.0. Untuk informasi lebih lanjut, lihat Pencarian Hibrida.

    +

    Partisi

    Partisi adalah pembagian koleksi. Milvus mendukung pembagian data koleksi menjadi beberapa bagian pada penyimpanan fisik. Proses ini disebut partisi, dan setiap partisi dapat berisi beberapa segmen. Untuk informasi lebih lanjut, lihat Mengelola Partisi.

    +

    Kunci partisi

    Atribut kunci partisi dari suatu bidang memungkinkan pemisahan entitas ke dalam partisi yang berbeda berdasarkan nilai kunci partisi mereka. Pengelompokan ini memastikan bahwa entitas yang memiliki nilai kunci yang sama disimpan bersama, yang dapat mempercepat operasi pencarian dengan mengizinkan sistem melewati partisi yang tidak relevan selama kueri yang difilter oleh bidang kunci partisi. Untuk informasi lebih lanjut, lihat Menggunakan Kunci Partisi.

    +

    PChannel

    PChannel adalah singkatan dari saluran fisik. Setiap PChannel berhubungan dengan topik untuk penyimpanan log. Secara default, sebuah grup yang terdiri dari 16 PChannel akan ditetapkan untuk menyimpan log yang merekam penyisipan, penghapusan, dan pembaruan data ketika cluster Milvus dimulai. Untuk informasi lebih lanjut, lihat Konfigurasi terkait Saluran Pesan.

    +

    PyMilvus

    PyMilvus adalah SDK Python dari Milvus. Kode sumbernya bersumber terbuka dan dihosting di GitHub. Anda memiliki fleksibilitas untuk memilih MilvusClient (Python SDK versi baru) atau modul ORM asli untuk berbicara dengan Milvus.

    +

    Query

    Query adalah API yang melakukan pemfilteran skalar dengan ekspresi boolean tertentu sebagai filter. Untuk informasi lebih lanjut, lihat Get & Scalar Query.

    +

    Pencarian rentang memungkinkan Anda menemukan vektor yang berada dalam jarak tertentu dari vektor pencarian Anda. Untuk informasi lebih lanjut, lihat Pencarian rentang.

    +

    Skema

    Skema adalah informasi meta yang mendefinisikan tipe data dan properti data. Setiap koleksi memiliki skema koleksi sendiri yang mendefinisikan semua bidang koleksi, pengaktifan alokasi ID otomatis (kunci utama), dan deskripsi koleksi. Skema bidang juga termasuk dalam skema koleksi, yang mendefinisikan nama, tipe data, dan properti lain dari sebuah bidang. Untuk informasi lebih lanjut, lihat Mengelola Skema.

    +

    Pencarian adalah API yang melakukan operasi untuk melakukan pencarian kesamaan vektor, yang membutuhkan data vektor untuk pelaksanaannya. Untuk informasi lebih lanjut, lihat Pencarian Vektor Tunggal.

    +

    Segmen

    Segmen adalah file data yang dibuat secara otomatis yang menyimpan data yang disisipkan. Sebuah koleksi dapat berisi beberapa segmen, dan setiap segmen dapat menyimpan banyak entitas. Selama pencarian kemiripan vektor, Milvus memeriksa setiap segmen untuk menyusun hasil pencarian.

    +

    Ada dua jenis segmen: tumbuh dan tertutup. Segmen yang berkembang terus mengumpulkan data baru hingga mencapai ambang batas atau batas waktu tertentu, dan setelah itu segmen tersebut menjadi tertutup. Setelah disegel, segmen tidak lagi menerima data baru dan dipindahkan ke penyimpanan objek. Sementara itu, data yang masuk dialihkan ke segmen baru yang sedang tumbuh. Transisi dari segmen yang sedang tumbuh ke segmen yang disegel dipicu baik dengan mencapai batas entitas yang telah ditentukan atau dengan melebihi durasi maksimum yang diizinkan dalam keadaan tumbuh. Untuk informasi lebih lanjut, lihat Detail Desain.

    +

    Konektor Spark-Milvus

    Spark-Milvus Connector menyediakan integrasi tanpa batas antara Apache Spark dan Milvus, yang menggabungkan fitur pemrosesan data dan pembelajaran mesin (ML) dari Apache Spark dengan penyimpanan data vektor dan kemampuan pencarian Milvus.

    +

    Pecahan

    Milvus meningkatkan performa penulisan data dengan mendistribusikan operasi penulisan di beberapa node menggunakan shard, yang diatur berdasarkan hashing kunci utama. Hal ini memanfaatkan kemampuan komputasi paralel cluster.

    +

    Partisi berfungsi untuk mengurangi beban baca dengan menentukan nama partisi, sementara sharding menyebarkan beban tulis di antara beberapa server.

    +

    Vektor jarang

    Vektor jarang merepresentasikan kata atau frasa menggunakan penyematan vektor yang sebagian besar elemennya bernilai nol, dengan hanya satu elemen bukan nol yang menunjukkan keberadaan kata tertentu. Model vektor jarang, seperti SPLADEv2, mengungguli model padat dalam pencarian pengetahuan di luar domain, kesadaran kata kunci, dan kemampuan penafsiran. Untuk informasi lebih lanjut, lihat Vektor Jarang.

    +

    Data tidak terstruktur

    Data tidak terstruktur, termasuk gambar, video, audio, dan bahasa alami, adalah informasi yang tidak mengikuti model atau cara pengorganisasian yang telah ditentukan sebelumnya. Jenis data ini menyumbang sekitar 80% dari data dunia, dan dapat dikonversi menjadi vektor menggunakan berbagai model kecerdasan buatan (AI) dan ML.

    +

    VChannel

    VChannel adalah singkatan dari saluran logis. Setiap VChannel mewakili pecahan dalam sebuah koleksi. Setiap koleksi akan diberikan sekelompok VChannel untuk merekam penyisipan, penghapusan, dan pembaruan data. VChannel dipisahkan secara logis namun secara fisik berbagi sumber daya.

    +

    Vektor

    Vektor penyematan adalah abstraksi fitur dari data yang tidak terstruktur, seperti email, data sensor IoT, foto Instagram, struktur protein, dan banyak lagi. Secara matematis, vektor penyematan adalah sebuah larik angka floating-point atau biner. Teknik penyematan modern digunakan untuk mengubah data yang tidak terstruktur menjadi vektor penyematan. Milvus mendukung vektor padat dan jarang sejak 2.4.0.

    +

    Zilliz Cloud

    Milvus yang dikelola sepenuhnya di Zilliz Cloud, dengan lebih banyak fitur perusahaan dan kinerja yang sangat optimal.

    diff --git a/localization/v2.5.x/site/id/reference/gpu_index.json b/localization/v2.5.x/site/id/reference/gpu_index.json new file mode 100644 index 000000000..b491df1c2 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/gpu_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"GPU Index","anchorList":[{"label":"Indeks GPU","href":"GPU-Index","type":1,"isActive":false},{"label":"GPU_CAGRA","href":"GPUCAGRA","type":2,"isActive":false},{"label":"GPU_IVF_FLAT","href":"GPUIVFFLAT","type":2,"isActive":false},{"label":"GPU_IVF_PQ","href":"GPUIVFPQ","type":2,"isActive":false},{"label":"GPU_BRUTE_FORCE","href":"GPUBRUTEFORCE","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/gpu_index.md b/localization/v2.5.x/site/id/reference/gpu_index.md new file mode 100644 index 000000000..8f8082fce --- /dev/null +++ b/localization/v2.5.x/site/id/reference/gpu_index.md @@ -0,0 +1,239 @@ +--- +id: gpu_index.md +related_key: gpu_index +summary: Mekanisme indeks GPU di Milvus. +title: Indeks GPU +--- +

    Indeks GPU

    Milvus mendukung berbagai jenis indeks GPU untuk mempercepat kinerja dan efisiensi pencarian, terutama dalam skenario throughput tinggi dan pemanggilan tinggi. Topik ini memberikan gambaran umum tentang jenis indeks GPU yang didukung oleh Milvus, kasus penggunaan yang sesuai, dan karakteristik kinerja. Untuk informasi tentang membangun indeks dengan GPU, lihat Indeks dengan GPU.

    +

    Penting untuk dicatat bahwa menggunakan indeks GPU belum tentu mengurangi latensi dibandingkan dengan menggunakan indeks CPU. Jika Anda ingin memaksimalkan throughput sepenuhnya, Anda memerlukan tekanan permintaan yang sangat tinggi atau vektor kueri dalam jumlah besar.

    +

    + + performance + kinerja

    +

    Dukungan GPU Milvus dikontribusikan oleh tim Nvidia RAPIDS. Berikut ini adalah jenis indeks GPU yang saat ini didukung oleh Milvus.

    +

    GPU_CAGRA

    GPU_CAGRA adalah indeks berbasis grafik yang dioptimalkan untuk GPU, Menggunakan GPU kelas inferensi untuk menjalankan versi GPU Milvus dapat lebih hemat biaya dibandingkan dengan menggunakan GPU kelas pelatihan yang mahal.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + + + + + +
      ParameterDeskripsiNilai Default
      intermediate_graph_degreeMempengaruhi waktu pemanggilan dan pembangunan dengan menentukan derajat grafik sebelum pemangkasan. Nilai yang disarankan adalah 32 atau 64.128
      graph_degreeMempengaruhi kinerja pencarian dan pemanggilan dengan mengatur derajat grafik setelah pemangkasan. Perbedaan yang lebih besar antara kedua derajat ini menghasilkan waktu pembangunan yang lebih lama. Nilainya harus lebih kecil dari nilai intermediate_graph_degree.64
      build_algoMemilih algoritma pembuatan graf sebelum pemangkasan. Nilai yang mungkin:
      IVF_PQ: Menawarkan kualitas yang lebih tinggi tetapi waktu pembuatan lebih lambat.
      NN_DESCENT: Menyediakan pembuatan yang lebih cepat dengan potensi pemanggilan yang lebih rendah.
      IVF_PQ
      cache_dataset_on_deviceMemutuskan apakah akan menyimpan dataset asli dalam memori GPU. Nilai yang mungkin:
      “true”: Menyimpan dataset asli untuk meningkatkan pemanggilan dengan menyempurnakan hasil pencarian.
      “false” Tidak menyimpan set data asli untuk menghemat memori GPU.
      “false”
      adapt_for_cpuMemutuskan apakah akan menggunakan GPU untuk pembuatan indeks dan CPU untuk pencarian.
      Mengatur parameter ini ke true memerlukan kehadiran parameter ef dalam permintaan pencarian.
      “false”
      +
    • +
    • Parameter pencarian

      + + + + + + + + + + + +
      ParameterDeskripsiNilai Default
      itopk_sizeMenentukan ukuran hasil perantara yang disimpan selama pencarian. Nilai yang lebih besar dapat meningkatkan daya ingat dengan mengorbankan kinerja pencarian. Setidaknya harus sama dengan nilai top-k (batas) akhir dan biasanya merupakan pangkat 2 (misalnya, 16, 32, 64, 128).Kosong
      search_widthMenentukan jumlah titik masuk ke dalam grafik CAGRA selama pencarian. Meningkatkan nilai ini dapat meningkatkan daya ingat tetapi dapat memengaruhi kinerja pencarian (misalnya 1, 2, 4, 8, 16, 32).Kosong
      min_iterations / max_iterationsMengontrol proses iterasi pencarian. Secara default, nilai ini diatur ke 0, dan CAGRA secara otomatis menentukan jumlah iterasi berdasarkan itopk_size dan search_width. Menyesuaikan nilai ini secara manual dapat membantu menyeimbangkan kinerja dan akurasi.0
      team_sizeMenentukan jumlah thread CUDA yang digunakan untuk menghitung jarak metrik pada GPU. Nilai yang umum adalah pangkat 2 hingga 32 (mis. 2, 4, 8, 16, 32). Hal ini berdampak kecil pada kinerja pencarian. Nilai defaultnya adalah 0, di mana Milvus secara otomatis memilih team_size berdasarkan dimensi vektor.0
      efMenentukan pertukaran waktu/akurasi kueri. Nilai ef yang lebih tinggi akan menghasilkan pencarian yang lebih akurat tetapi lebih lambat.
      Parameter ini wajib diisi jika Anda mengatur adapt_for_cpu ke true ketika Anda membangun indeks.
      [top_k, int_max]
      +
    • +
    +
      +
    • Batasan pada pencarian

      + + + + + + + + +
      ParameterRentang
      limit (K atas)<= 1024
      limit (top-K)<=max((itopk_size + 31)// 32, search_width) * 32
      +
    • +
    +

    GPU_IVF_FLAT

    Serupa dengan IVF_FLAT, GPU_IVF_FLAT juga membagi data vektor ke dalam unit cluster nlist, dan kemudian membandingkan jarak antara vektor input target dan pusat setiap cluster. Bergantung pada jumlah klaster yang diatur oleh sistem untuk melakukan kueri (nprobe), hasil pencarian kemiripan dikembalikan berdasarkan perbandingan antara input target dan vektor dalam klaster yang paling mirip saja - secara drastis mengurangi waktu kueri.

    +

    Dengan menyesuaikan nprobe, keseimbangan ideal antara akurasi dan kecepatan dapat ditemukan untuk skenario tertentu. Hasil dari uji kinerja IVF_FLAT menunjukkan bahwa waktu kueri meningkat tajam seiring dengan bertambahnya jumlah vektor input target (nq), dan jumlah cluster yang dicari (nprobe).

    +

    GPU_IVF_FLAT adalah indeks IVF yang paling dasar, dan data yang disandikan yang disimpan di setiap unit konsisten dengan data asli.

    +

    Ketika melakukan pencarian, perhatikan bahwa Anda dapat mengatur K teratas hingga 256 untuk pencarian apa pun terhadap koleksi yang diindeks GPU_IVF_FLAT.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      nlistJumlah unit cluster[1, 65536]128
      cache_dataset_on_deviceMemutuskan apakah akan menyimpan dataset asli dalam memori GPU. Nilai yang mungkin:
      “true”: Menyimpan dataset asli untuk meningkatkan daya ingat dengan menyempurnakan hasil pencarian.
      “false” Tidak menyimpan set data asli untuk menghemat memori GPU.
      "true" "flase""false"
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
    • +
    • Batas pencarian

      + + + + + + + +
      ParameterRentang
      limit (K atas)<= 2048
      +
    • +
    +

    GPU_IVF_PQ

    PQ (Kuantisasi Produk) secara seragam menguraikan ruang vektor dimensi tinggi asli menjadi produk Cartesian dari ruang vektor dimensi rendah m, dan kemudian mengkuantisasi ruang vektor dimensi rendah yang telah diuraikan. Alih-alih menghitung jarak antara vektor target dan pusat semua unit, kuantisasi produk memungkinkan perhitungan jarak antara vektor target dan pusat pengelompokan setiap ruang dimensi rendah dan sangat mengurangi kompleksitas waktu dan kompleksitas ruang algoritma.

    +

    IVF_PQ melakukan pengelompokan indeks IVF sebelum mengkuantisasi produk vektor. File indeksnya bahkan lebih kecil daripada IVF_SQ8, tetapi juga menyebabkan hilangnya akurasi selama pencarian vektor.

    +
    +

    Parameter pembuatan indeks dan parameter pencarian bervariasi dengan distribusi Milvus. Pilih distribusi Milvus Anda terlebih dahulu.

    +

    Ketika melakukan pencarian, perhatikan bahwa Anda dapat mengatur top-K hingga 8192 untuk setiap pencarian terhadap koleksi yang diindeks GPU_IVF_FLAT.

    +
    +
      +
    • Parameter pembuatan indeks

      + + + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      nlistJumlah unit cluster[1, 65536]128
      mJumlah faktor kuantisasi produk,dim mod m or = 00
      nbits[Opsional] Jumlah bit tempat penyimpanan setiap vektor dimensi rendah.[1, 16]8
      cache_dataset_on_deviceMemutuskan apakah akan menyimpan dataset asli dalam memori GPU. Nilai yang mungkin:
      “true”: Menyimpan dataset asli untuk meningkatkan daya ingat dengan menyempurnakan hasil pencarian.
      “false” Tidak menyimpan set data asli untuk menghemat memori GPU.
      "true" "false""false"
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
    • +
    • Batas pencarian

      + + + + + + + +
      ParameterRentang
      limit (K atas)<= 1024
      +
    • +
    +

    GPU_BRUTE_FORCE

    GPU_BRUTE_FORCE dirancang untuk kasus-kasus di mana pemanggilan yang sangat tinggi sangat penting, menjamin pemanggilan 1 dengan membandingkan setiap kueri dengan semua vektor dalam kumpulan data. Ini hanya membutuhkan tipe metrik (metric_type) dan top-k (limit) sebagai parameter pembangunan indeks dan pencarian.

    +

    Untuk GPU_BRUTE_FORCE, tidak ada tambahan parameter pembangun indeks atau parameter pencarian yang diperlukan.

    +

    Kesimpulan

    Saat ini, Milvus memuat semua indeks ke dalam memori GPU untuk operasi pencarian yang efisien. Jumlah data yang dapat dimuat tergantung pada ukuran memori GPU:

    +
      +
    • GPU_CAGRA: Penggunaan memori sekitar 1,8 kali lipat dari data vektor asli.
    • +
    • GPU_IVF_FLAT dan GPU_BRUTE_FORCE: Membutuhkan memori yang sama dengan ukuran data asli.
    • +
    • GPU_IVF_PQ: Memanfaatkan jejak memori yang lebih kecil, yang bergantung pada pengaturan parameter kompresi.
    • +
    diff --git a/localization/v2.5.x/site/id/reference/index.json b/localization/v2.5.x/site/id/reference/index.json new file mode 100644 index 000000000..27dd05065 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-memory Index","anchorList":[{"label":"Indeks dalam memori","href":"In-memory-Index","type":1,"isActive":false},{"label":"Indeks vektor ANNS","href":"ANNS-vector-indexes","type":2,"isActive":false},{"label":"Indeks yang didukung dalam Milvus","href":"Indexes-supported-in-Milvus","type":2,"isActive":false},{"label":"FAQ","href":"FAQ","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/index.md b/localization/v2.5.x/site/id/reference/index.md new file mode 100644 index 000000000..c38bce518 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/index.md @@ -0,0 +1,679 @@ +--- +id: index.md +related_key: index +summary: Mekanisme indeks di Milvus. +title: Indeks dalam memori +--- +

    Indeks dalam memori

    Topik ini berisi daftar berbagai jenis indeks dalam memori yang didukung Milvus, skenario yang paling sesuai, dan parameter yang dapat dikonfigurasikan oleh pengguna untuk mendapatkan performa pencarian yang lebih baik. Untuk indeks dalam disk, lihat Indeks Dalam Disk.

    +

    Pengindeksan adalah proses pengorganisasian data secara efisien, dan ini memainkan peran utama dalam membuat pencarian kemiripan menjadi berguna dengan mempercepat kueri yang memakan waktu secara dramatis pada kumpulan data yang besar.

    +

    Untuk meningkatkan kinerja kueri, Anda dapat menentukan jenis indeks untuk setiap bidang vektor.

    +
    +Saat ini, bidang vektor hanya mendukung satu jenis indeks. Milvus secara otomatis menghapus indeks lama ketika mengganti jenis indeks.
    +

    Indeks vektor ANNS

    Sebagian besar jenis indeks vektor yang didukung oleh Milvus menggunakan algoritme pencarian tetangga terdekat (ANNS). Dibandingkan dengan pengambilan yang akurat, yang biasanya sangat memakan waktu, ide inti dari ANNS tidak lagi terbatas pada mengembalikan hasil yang paling akurat, tetapi hanya mencari tetangga dari target. ANNS meningkatkan efisiensi pengambilan dengan mengorbankan akurasi dalam kisaran yang dapat diterima.

    +

    Menurut metode implementasinya, indeks vektor ANNS dapat dikategorikan ke dalam empat jenis: Berbasis pohon, berbasis grafik, berbasis hash, dan berbasis kuantisasi.

    +

    Indeks yang didukung dalam Milvus

    Milvus mendukung berbagai jenis indeks, yang dikategorikan berdasarkan jenis penyematan vektor yang mereka tangani: penyematan floating-point (juga dikenal sebagai vektor floating point atau vektor padat), penyematan biner (juga dikenal sebagai vektor biner), dan penyematan jarang (juga dikenal sebagai vektor jarang).

    + +
    +

    Indeks untuk penyematan titik mengambang

    Untuk penyematan floating-point 128 dimensi (vektor), penyimpanan yang digunakan adalah 128 * ukuran float = 512 byte. Dan metrik jarak yang digunakan untuk penyematan float-point adalah jarak Euclidean (L2) dan Inner product (IP).

    +

    Jenis-jenis indeks ini termasuk FLAT, IVF_FLAT, IVF_PQ, IVF_SQ8, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, dan SCANN untuk pencarian ANN berbasis CPU.

    +
    +
    +

    Indeks untuk penyematan biner

    Untuk sematan biner 128 dimensi, penyimpanan yang dibutuhkan adalah 128 / 8 = 16 byte. Dan metrik jarak yang digunakan untuk sematan biner adalah JACCARD dan HAMMING.

    +

    Jenis indeks ini termasuk BIN_FLAT dan BIN_IVF_FLAT.

    +
    +
    +

    Indeks untuk penyematan yang jarang

    Indeks untuk sematan jarang hanya mendukung metrik IP dan BM25 (untuk pencarian teks lengkap).

    +

    Jenis indeks ini meliputi SPARSE_INVERTED_INDEX dan SPARSE_WAND.

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Indeks yang didukungKlasifikasiSkenario
    DATARN/A +
      +
    • Dataset yang relatif kecil
    • +
    • Membutuhkan tingkat penarikan kembali 100%
    • +
    +
    IVF_FLATN/A +
      +
    • Kueri berkecepatan tinggi
    • +
    • Membutuhkan tingkat penarikan setinggi mungkin
    • +
    +
    IVF_SQ8Indeks berbasis kuantisasi +
      +
    • Kueri berkecepatan sangat tinggi
    • +
    • Sumber daya memori terbatas
    • +
    • Menerima kompromi kecil dalam tingkat pemanggilan kembali
    • +
    +
    IVF_PQIndeks berbasis kuantisasi +
      +
    • Kueri berkecepatan tinggi
    • +
    • Sumber daya memori terbatas
    • +
    • Menerima kompromi kecil dalam tingkat pemanggilan kembali
    • +
    +
    HNSWIndeks berbasis grafik +
      +
    • Kueri berkecepatan sangat tinggi
    • +
    • Membutuhkan tingkat pemanggilan setinggi mungkin
    • +
    • Sumber daya memori yang besar
    • +
    +
    HNSW_SQIndeks berbasis kuantisasi +
      +
    • Kueri berkecepatan sangat tinggi
    • +
    • Sumber daya memori terbatas
    • +
    • Menerima kompromi kecil dalam tingkat pemanggilan kembali
    • +
    +
    HNSW_PQIndeks berbasis kuantisasi +
      +
    • Kueri kecepatan sedang
    • +
    • Sumber daya memori yang sangat terbatas
    • +
    • Menerima kompromi kecil dalam tingkat pemanggilan kembali
    • +
    +
    HNSW_PRQIndeks berbasis kuantisasi +
      +
    • Kueri kecepatan sedang
    • +
    • Sumber daya memori yang sangat terbatas
    • +
    • Menerima kompromi kecil dalam tingkat pemanggilan kembali
    • +
    +
    SCANNIndeks berbasis kuantisasi +
      +
    • Kueri berkecepatan sangat tinggi
    • +
    • Membutuhkan tingkat pemanggilan setinggi mungkin
    • +
    • Sumber daya memori yang besar
    • +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Indeks yang didukungKlasifikasiSkenario
    BIN_FLATIndeks berbasis kuantisasi
      +
    • Tergantung pada set data yang relatif kecil.
    • +
    • Membutuhkan akurasi yang sempurna.
    • +
    • Tidak menggunakan kompresi.
    • +
    • Menjamin hasil pencarian yang tepat.
    • +
    BIN_IVF_FLATIndeks berbasis kuantisasi
      +
    • Kueri berkecepatan tinggi
    • +
    • Membutuhkan tingkat penarikan setinggi mungkin
    • +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Indeks yang didukungKlasifikasiSkenario
    INDEKS_TERBALIK YANG JARANGIndeks terbalik
      +
    • Tergantung pada set data yang relatif kecil.
    • +
    • Membutuhkan tingkat penarikan 100%.
    • +
    SPARSE_WANDIndeks terbalik
      +
    • Algoritmalemah dan dipercepat
    • +
    • Dapat memperoleh peningkatan kecepatan yang signifikan dengan hanya mengorbankan sedikit recall.
    • +
    +
    +
    +

    FLAT

    Untuk aplikasi pencarian kemiripan vektor yang membutuhkan akurasi sempurna dan bergantung pada kumpulan data yang relatif kecil (skala jutaan), indeks FLAT adalah pilihan yang baik. FLAT tidak memampatkan vektor, dan merupakan satu-satunya indeks yang dapat menjamin hasil pencarian yang tepat. Hasil dari FLAT juga dapat digunakan sebagai titik perbandingan untuk hasil yang dihasilkan oleh indeks lain yang memiliki recall kurang dari 100%.

    +

    FLAT akurat karena menggunakan pendekatan yang menyeluruh dalam melakukan pencarian, yang berarti untuk setiap kueri, input target dibandingkan dengan setiap kumpulan vektor dalam kumpulan data. Hal ini membuat FLAT menjadi indeks paling lambat dalam daftar kami, dan tidak cocok untuk melakukan kueri data vektor yang sangat besar. Tidak ada parameter yang diperlukan untuk indeks FLAT di Milvus, dan untuk menggunakannya tidak memerlukan pelatihan data.

    +
      +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRange
      metric_type[Opsional] Metrik jarak yang dipilih.Lihat Metrik yang Didukung.
      +
    • +
    +

    IVF_FLAT

    IVF_FLAT membagi data vektor ke dalam unit klaster nlist, lalu membandingkan jarak antara vektor input target dan pusat setiap klaster. Bergantung pada jumlah klaster yang diatur oleh sistem untuk melakukan kueri (nprobe), hasil pencarian kemiripan dikembalikan berdasarkan perbandingan antara input target dan vektor dalam klaster yang paling mirip saja - secara drastis mengurangi waktu kueri.

    +

    Dengan menyesuaikan nprobe, keseimbangan ideal antara akurasi dan kecepatan dapat ditemukan untuk skenario tertentu. Hasil dari uji kinerja IVF_FLAT menunjukkan bahwa waktu kueri meningkat tajam seiring dengan bertambahnya jumlah vektor input target (nq), dan jumlah cluster yang dicari (nprobe).

    +

    IVF_FLAT adalah indeks IVF yang paling dasar, dan data yang disandikan yang disimpan di setiap unit konsisten dengan data aslinya.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      nlistJumlah unit cluster[1, 65536]128
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
      • Pencarian rentang

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        max_empty_result_bucketsJumlah maksimum bucket yang tidak mengembalikan hasil pencarian.
        Ini adalah parameter pencarian rentang dan menghentikan proses pencarian ketika jumlah bucket kosong secara berurutan mencapai nilai yang ditentukan.
        Meningkatkan nilai ini dapat meningkatkan tingkat penarikan dengan mengorbankan waktu pencarian yang lebih lama.
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_SQ8

    IVF_FLAT tidak melakukan kompresi apa pun, sehingga file indeks yang dihasilkannya memiliki ukuran yang kurang lebih sama dengan data vektor mentah yang tidak diindeks. Sebagai contoh, jika set data SIFT 1B asli berukuran 476 GB, file indeks IVF_FLAT akan sedikit lebih kecil (~470 GB). Memuat semua file indeks ke dalam memori akan menghabiskan 470 GB penyimpanan.

    +

    Ketika sumber daya memori disk, CPU, atau GPU terbatas, IVF_SQ8 adalah pilihan yang lebih baik daripada IVF_FLAT. Jenis indeks ini dapat mengubah setiap FLOAT (4 byte) menjadi UINT8 (1 byte) dengan melakukan Kuantisasi Skalar (SQ). Hal ini mengurangi konsumsi memori disk, CPU, dan GPU sebesar 70-75%. Untuk kumpulan data SIFT 1B, file indeks IVF_SQ8 hanya membutuhkan penyimpanan 140 GB.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + +
      ParameterDeskripsiRentang
      nlistJumlah unit cluster[1, 65536]
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
      • Pencarian rentang

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        max_empty_result_bucketsJumlah maksimum bucket yang tidak mengembalikan hasil pencarian.
        Ini adalah parameter pencarian rentang dan menghentikan proses pencarian ketika jumlah bucket kosong secara berurutan mencapai nilai yang ditentukan.
        Meningkatkan nilai ini dapat meningkatkan tingkat penarikan dengan mengorbankan waktu pencarian yang lebih lama.
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_PQ

    PQ (Kuantisasi Produk) secara seragam menguraikan ruang vektor dimensi tinggi asli menjadi produk Cartesian dari ruang vektor dimensi rendah m, dan kemudian mengkuantisasi ruang vektor dimensi rendah yang terurai. Alih-alih menghitung jarak antara vektor target dan pusat semua unit, kuantisasi produk memungkinkan perhitungan jarak antara vektor target dan pusat pengelompokan setiap ruang dimensi rendah dan sangat mengurangi kompleksitas waktu dan kompleksitas ruang algoritma.

    +

    IVF_PQ melakukan pengelompokan indeks IVF sebelum mengkuantisasi produk vektor. File indeksnya bahkan lebih kecil daripada IVF_SQ8, tetapi juga menyebabkan hilangnya akurasi selama pencarian vektor.

    +
    +

    Parameter pembuatan indeks dan parameter pencarian bervariasi dengan distribusi Milvus. Pilih distribusi Milvus Anda terlebih dahulu.

    +
    +
      +
    • Parameter pembuatan indeks

      + + + + + + + + + +
      ParameterDeskripsiRentang
      nlistJumlah unit cluster[1, 65536]
      mJumlah faktor kuantisasi produkdim mod m == 0
      nbits[Opsional] Jumlah bit tempat penyimpanan setiap vektor dimensi rendah.[1, 64] (8 secara default)
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
      • Pencarian rentang

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        max_empty_result_bucketsJumlah maksimum bucket yang tidak mengembalikan hasil pencarian.
        Ini adalah parameter pencarian rentang dan menghentikan proses pencarian ketika jumlah bucket kosong secara berurutan mencapai nilai yang ditentukan.
        Meningkatkan nilai ini dapat meningkatkan tingkat penarikan dengan mengorbankan waktu pencarian yang lebih lama.
        [1, 65535]2
        +
      • +
    • +
    +

    SCANN

    ScaNN (Scalable Nearest Neighbors) mirip dengan IVF_PQ dalam hal pengelompokan vektor dan kuantisasi produk. Apa yang membuat mereka berbeda terletak pada detail implementasi kuantisasi produk dan penggunaan SIMD (Single-Instruction/Multi-data) untuk penghitungan yang efisien.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + + +
      ParameterDeskripsiRentang
      nlistJumlah unit cluster[1, 65536]
      with_raw_dataApakah akan menyertakan data mentah dalam indeksTrue atau False. Nilai default untuk True.
      +
      +

      Tidak seperti IVF_PQ, nilai default berlaku untuk m dan nbits untuk kinerja yang dioptimalkan.

      +
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + + +
        ParameterDeskripsiRentangNilai default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]
        reorder_kJumlah unit kandidat yang akan ditanyakan[top_k, ∞]top_k
        +
      • +
      • Pencarian rentang

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        max_empty_result_bucketsJumlah maksimum bucket yang tidak mengembalikan hasil pencarian.
        Ini adalah parameter pencarian rentang dan menghentikan proses pencarian ketika jumlah bucket kosong secara berurutan mencapai nilai yang ditentukan.
        Meningkatkan nilai ini dapat meningkatkan tingkat penarikan dengan mengorbankan waktu pencarian yang lebih lama.
        [1, 65535]2
        +
      • +
    • +
    +

    HNSW

    HNSW (Hierarchical Navigable Small World Graph) adalah algoritma pengindeksan berbasis grafik. Algoritma ini membangun struktur navigasi multi-lapisan untuk sebuah gambar menurut aturan tertentu. Dalam struktur ini, lapisan atas lebih jarang dan jarak antar node lebih jauh; lapisan bawah lebih padat dan jarak antar node lebih dekat. Pencarian dimulai dari lapisan paling atas, menemukan node yang paling dekat dengan target di lapisan ini, dan kemudian memasuki lapisan berikutnya untuk memulai pencarian lain. Setelah beberapa kali iterasi, ia dapat dengan cepat mendekati posisi target.

    +

    Untuk meningkatkan kinerja, HNSW membatasi tingkat maksimum node pada setiap lapisan grafik ke M. Selain itu, Anda dapat menggunakan efConstruction (saat membangun indeks) atau ef (saat mencari target) untuk menentukan rentang pencarian.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      MM mendefinisikan jumlah maksimum koneksi keluar dalam grafik. M yang lebih tinggi akan menghasilkan akurasi/waktu_jalan yang lebih tinggi pada ef/efKonstruksi yang tetap.[2, 2048]Tidak ada
      efConstructionef_construction mengontrol kecepatan pencarian indeks/pertukaran kecepatan pembangunan. Meningkatkan parameter efConstruction dapat meningkatkan kualitas indeks, tetapi juga cenderung memperpanjang waktu pengindeksan.[1, int_max]Tidak ada
      +
    • +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      efParameter yang mengendalikan pertukaran waktu kueri/akurasi. ef yang lebih tinggi akan menghasilkan pencarian yang lebih akurat namun lebih lambat.[top_k, int_max]Tidak ada
      +
    • +
    +

    HNSW_SQ

    Kuantisasi Skalar (SQ) adalah teknik yang digunakan untuk mendiskritkan data floating-point menjadi sekumpulan nilai yang terbatas berdasarkan besarnya. Sebagai contoh, SQ6 merepresentasikan kuantisasi ke dalam (2^6 = 64) nilai diskrit, di mana setiap angka floating-point dikodekan menggunakan 6 bit. Demikian pula, SQ8 mengkuantisasi data menjadi (2^8 = 256) nilai diskrit, dengan setiap angka floating-point diwakili oleh 8 bit. Kuantisasi ini mengurangi jejak memori sekaligus mempertahankan struktur data yang penting untuk pemrosesan yang efisien.

    +

    Dikombinasikan dengan SQ, HNSW_SQ menawarkan pertukaran yang dapat dikontrol antara ukuran indeks dan akurasi, sambil mempertahankan kinerja query-per-detik (QPS) yang tinggi. Dibandingkan dengan HNSW standar, ini menghasilkan peningkatan yang tidak terlalu besar dalam waktu pembangunan indeks.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      MM mendefinisikan jumlah maksimum koneksi keluar dalam grafik. M yang lebih tinggi akan menghasilkan akurasi/waktu_jalan yang lebih tinggi pada ef/efKonstruksi yang tetap.[2, 2048]Tidak ada
      efConstructionef_construction mengontrol kecepatan pencarian indeks/pertukaran kecepatan pembangunan. Meningkatkan parameter efConstruction dapat meningkatkan kualitas indeks, tetapi juga cenderung memperpanjang waktu pengindeksan.[1, int_max]Tidak ada
      sq_typeJenis kuantizer skalar.SQ6,SQ8, BF16, FP16SQ8
      refineApakah data yang disempurnakan dicadangkan selama pembangunan indeks.true, falsefalse
      refine_typeTipe data dari indeks yang disempurnakan.SQ6, SQ8, BF16, FP16, FP32Tidak ada
      +
    • +
    • Parameter pencarian

      + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      efParameter yang mengendalikan pertukaran waktu kueri/akurasi. ef yang lebih tinggi akan menghasilkan pencarian yang lebih akurat namun lebih lambat.[top_k, int_max]Tidak ada
      refine_kFaktor pembesaran dari refine dibandingkan dengan k.[1, float_max] (1, float_max)1
      +
    • +
    +

    HNSW_PQ

    Ide dasar dari PQ adalah untuk membagi vektor menjadi sub-vektor m, yang masing-masing akan menemukan 2^{nbits} centroid berdasarkan kmeans, dan setiap sub-vektor akan memilih centroid terdekat sebagai perkiraan sub-vektor. Kemudian kita mencatat semua centroid, sehingga setiap subvektor dapat dikodekan sebagai nbits, dan vektor mengambang dengan panjang dim dapat dikodekan sebagai m ⋅ n bit.

    +

    Dikombinasikan dengan PQ, HNSW_PQ menawarkan pertukaran yang dapat dikontrol antara ukuran indeks dan akurasi, tetapi memiliki nilai QPS yang lebih rendah dan tingkat penarikan yang lebih tinggi daripada HNSW_SQ untuk tingkat kompresi yang sama. Dibandingkan dengan HNSW_SQ, dibutuhkan waktu lebih lama untuk membangun indeks.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      MM mendefinisikan jumlah maksimum koneksi keluar dalam grafik. M yang lebih tinggi akan menghasilkan akurasi/waktu_jalan yang lebih tinggi pada ef/efKonstruksi yang tetap.[2, 2048]Tidak ada
      efConstructionef_construction mengontrol kecepatan pencarian indeks/pertukaran kecepatan pembangunan. Meningkatkan parameter efConstruction dapat meningkatkan kualitas indeks, tetapi juga cenderung memperpanjang waktu pengindeksan.[1, int_max]Tidak ada
      mJumlah kelompok sub-vektor untuk membagi vektor.[1, 65536]32
      nbitsJumlah bit yang dikuantisasi ke dalam setiap kelompok sub-vektor.[1, 24]8
      refineApakah data yang disempurnakan dicadangkan selama pembangunan indeks.true, falsefalse
      refine_typeTipe data dari indeks penghalusan.SQ6, SQ8, BF16, FP16, FP32Tidak ada
      +
    • +
    • Parameter pencarian

      + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      efParameter yang mengendalikan pertukaran waktu kueri/akurasi. ef yang lebih tinggi akan menghasilkan pencarian yang lebih akurat namun lebih lambat.[top_k, int_max]Tidak ada
      refine_kFaktor pembesaran dari refine dibandingkan dengan k.[1, float_max] (1, float_max)1
      +
    • +
    +

    HNSW_PRQ

    PRQ mirip dengan PQ, dan juga membagi vektor ke dalam kelompok-kelompok m. Setiap sub-vektor akan dikodekan sebagai nbits. Setelah menyelesaikan kuantisasi pq, ia akan menghitung sisa antara vektor dan vektor terkuantisasi pq, dan menerapkan kuantisasi pq ke vektor sisa. Sebanyak nrq kuantisasi pq lengkap akan dilakukan, sehingga vektor mengambang dengan panjang dim akan dikodekan sebagai m ⋅ nbit ⋅ nrq bit.

    +

    Dikombinasikan dengan Product Residual Quantizer (PRQ), HNSW_PRQ menawarkan pertukaran yang dapat dikontrol lebih tinggi antara ukuran indeks dan akurasi. Memiliki nilai QPS yang hampir setara dan tingkat recall yang lebih tinggi daripada HNSW_PQ untuk tingkat kompresi yang sama. Dibandingkan dengan HNSW_PQ, waktu untuk membangun indeks dapat meningkat beberapa kali lipat.

    +
      +
    • Parameter pembangunan indeks

      + + + + + + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      MM mendefinisikan jumlah maksimum koneksi keluar dalam grafik. M yang lebih tinggi akan menghasilkan akurasi/waktu_jalan yang lebih tinggi pada ef/efKonstruksi yang tetap.[2, 2048]Tidak ada
      efConstructionef_construction mengontrol kecepatan pencarian indeks/pertukaran kecepatan pembangunan. Meningkatkan parameter efConstruction dapat meningkatkan kualitas indeks, tetapi juga cenderung memperpanjang waktu pengindeksan.[1, int_max]Tidak ada
      mJumlah kelompok sub-vektor untuk membagi vektor.[1, 65536]32
      nbitsJumlah bit yang dikuantisasi ke dalam setiap kelompok sub-vektor.[1, 24]8
      nrqJumlah subkuantisasi sisa.[1, 16]2
      refineApakah data yang disempurnakan dicadangkan selama pembangunan indeks.true, falsefalse
      refine_typeTipe data dari indeks penghalusan.SQ6, SQ8, BF16, FP16, FP32Tidak ada
      +
    • +
    • Parameter pencarian

      + + + + + + + + +
      ParameterDeskripsiRentangNilai Default
      efParameter yang mengendalikan pertukaran waktu kueri/akurasi. ef yang lebih tinggi akan menghasilkan pencarian yang lebih akurat namun lebih lambat.[top_k, int_max]Tidak ada
      refine_kFaktor pembesaran dari refine dibandingkan dengan k.[1, float_max] (1, float_max)1
      +
    • +
    +
    +
    +

    BIN_FLAT

    Indeks ini persis sama dengan FLAT kecuali bahwa ini hanya dapat digunakan untuk penyematan biner.

    +

    Untuk aplikasi pencarian kemiripan vektor yang membutuhkan akurasi sempurna dan bergantung pada dataset yang relatif kecil (skala jutaan), indeks BIN_FLAT adalah pilihan yang baik. BIN_FLAT tidak memampatkan vektor, dan merupakan satu-satunya indeks yang dapat menjamin hasil pencarian yang tepat. Hasil dari BIN_FLAT juga dapat digunakan sebagai titik perbandingan untuk hasil yang dihasilkan oleh indeks lain yang memiliki recall kurang dari 100%.

    +

    BIN_FLAT akurat karena menggunakan pendekatan menyeluruh untuk pencarian, yang berarti untuk setiap kueri, input target dibandingkan dengan vektor dalam kumpulan data. Hal ini membuat BIN_FLAT menjadi indeks paling lambat dalam daftar kami, dan tidak cocok untuk kueri data vektor yang sangat besar. Tidak ada parameter untuk indeks BIN_FLAT di Milvus, dan menggunakannya tidak memerlukan pelatihan data atau penyimpanan tambahan.

    +
      +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRange
      metric_type[Opsional] Metrik jarak yang dipilih.Lihat Metrik yang Didukung.
      +
    • +
    +

    BIN_IVF_FLAT

    Indeks ini persis sama dengan IVF_FLAT kecuali bahwa indeks ini hanya dapat digunakan untuk penyematan biner.

    +

    BIN_IVF_FLAT membagi data vektor ke dalam unit klaster nlist, lalu membandingkan jarak antara vektor input target dan pusat setiap klaster. Bergantung pada jumlah klaster yang diatur oleh sistem untuk melakukan kueri (nprobe), hasil pencarian kemiripan dikembalikan berdasarkan perbandingan antara input target dan vektor dalam klaster yang paling mirip saja - secara drastis mengurangi waktu kueri.

    +

    Dengan menyesuaikan nprobe, keseimbangan ideal antara akurasi dan kecepatan dapat ditemukan untuk skenario tertentu. Waktu kueri meningkat tajam seiring dengan meningkatnya jumlah vektor input target (nq), dan jumlah cluster yang dicari (nprobe).

    +

    BIN_IVF_FLAT adalah indeks BIN_IVF yang paling dasar, dan data yang disandikan yang disimpan di setiap unit konsisten dengan data aslinya.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + +
      ParameterDeskripsiRentang
      nlistJumlah unit cluster[1, 65536]
      +
    • +
    • Parameter pencarian

      +
        +
      • Pencarian umum

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        nprobeJumlah unit yang akan ditanyakan[1, nlist]8
        +
      • +
      • Pencarian rentang

        + + + + + + + +
        ParameterDeskripsiRentangNilai Default
        max_empty_result_bucketsJumlah maksimum bucket yang tidak mengembalikan hasil pencarian.
        Ini adalah parameter pencarian rentang dan menghentikan proses pencarian ketika jumlah bucket kosong secara berurutan mencapai nilai yang ditentukan.
        Meningkatkan nilai ini dapat meningkatkan tingkat penarikan dengan mengorbankan waktu pencarian yang lebih lama.
        [1, 65535]2
        +
      • +
    • +
    +
    +
    +

    SPARSE_INVERTED_INDEX

    Setiap dimensi menyimpan daftar vektor yang memiliki nilai bukan nol pada dimensi tersebut. Selama pencarian, Milvus melakukan iterasi melalui setiap dimensi vektor kueri dan menghitung nilai untuk vektor yang memiliki nilai bukan nol pada dimensi tersebut.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + +
      ParameterDeskripsiRentang
      drop_ratio_buildProporsi nilai vektor kecil yang dikecualikan selama proses pengindeksan. Opsi ini memungkinkan penyempurnaan proses pengindeksan, membuat keseimbangan antara efisiensi dan akurasi dengan mengabaikan nilai-nilai kecil saat membangun indeks.[0, 1]
      +
    • +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRentang
      drop_ratio_searchProporsi nilai vektor kecil yang dikecualikan selama proses pencarian. Opsi ini memungkinkan penyempurnaan proses pencarian dengan menentukan rasio nilai terkecil dalam vektor kueri yang akan diabaikan. Opsi ini membantu menyeimbangkan ketepatan dan kinerja pencarian. Semakin kecil nilai yang ditetapkan untuk drop_ratio_search, semakin sedikit nilai kecil ini berkontribusi pada skor akhir. Dengan mengabaikan beberapa nilai kecil, kinerja pencarian dapat ditingkatkan dengan dampak minimal pada akurasi.[0, 1]
      +
    • +
    +

    SPARSE_WAND

    Indeks ini memiliki kemiripan dengan SPARSE_INVERTED_INDEX, namun menggunakan algoritma Weak-AND untuk mengurangi jumlah evaluasi jarak IP secara penuh selama proses pencarian.

    +

    Berdasarkan pengujian kami, SPARSE_WAND secara umum mengungguli metode-metode lain dalam hal kecepatan. Namun, kinerjanya bisa memburuk dengan cepat seiring dengan meningkatnya kepadatan vektor. Untuk mengatasi masalah ini, memperkenalkan drop_ratio_search yang bukan nol dapat meningkatkan kinerja secara signifikan dengan hanya mengalami sedikit penurunan akurasi. Untuk informasi lebih lanjut, lihat Vektor Jarang.

    +
      +
    • Parameter pembuatan indeks

      + + + + + + + +
      ParameterDeskripsiRentang
      drop_ratio_buildProporsi nilai vektor kecil yang dikecualikan selama proses pengindeksan. Opsi ini memungkinkan penyempurnaan proses pengindeksan, membuat keseimbangan antara efisiensi dan akurasi dengan mengabaikan nilai-nilai kecil saat membangun indeks.[0, 1]
      +
    • +
    • Parameter pencarian

      + + + + + + + +
      ParameterDeskripsiRentang
      drop_ratio_searchProporsi nilai vektor kecil yang dikecualikan selama proses pencarian. Opsi ini memungkinkan penyempurnaan proses pencarian dengan menentukan rasio nilai terkecil dalam vektor kueri yang akan diabaikan. Opsi ini membantu menyeimbangkan ketepatan dan kinerja pencarian. Semakin kecil nilai yang ditetapkan untuk drop_ratio_search, semakin sedikit nilai kecil ini berkontribusi pada skor akhir. Dengan mengabaikan beberapa nilai kecil, kinerja pencarian dapat ditingkatkan dengan dampak minimal pada akurasi.[0, 1]
      +
    • +
    +
    +

    FAQ

    +Apa perbedaan antara indeks FLAT dan indeks IVF_FLAT?

    +

    Indeks IVF_FLAT membagi ruang vektor menjadi klaster nlist. Jika Anda mempertahankan nilai default nlist sebagai 16384, Milvus membandingkan jarak antara vektor target dan pusat dari semua 16384 klaster untuk mendapatkan nprobe klaster terdekat. Kemudian Milvus membandingkan jarak antara vektor target dan vektor dalam cluster yang dipilih untuk mendapatkan vektor terdekat. Tidak seperti IVF_FLAT, FLAT secara langsung membandingkan jarak antara vektor target dan setiap vektor.

    +

    +Oleh karena itu, ketika jumlah total vektor kurang lebih sama dengan nlist, IVF_FLAT dan FLAT memiliki sedikit perbedaan dalam hal perhitungan yang diperlukan dan kinerja pencarian. Tetapi ketika jumlah vektor bertambah menjadi dua kali, tiga kali, atau n kali dari nlist, indeks IVF_FLAT mulai menunjukkan keuntungan yang semakin besar.

    +

    +Lihat Cara Memilih Indeks di Milvus untuk informasi lebih lanjut.

    +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/knowhere.json b/localization/v2.5.x/site/id/reference/knowhere.json new file mode 100644 index 000000000..ecae7d4a2 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/knowhere.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Knowhere","anchorList":[{"label":"Knowhere","href":"Knowhere","type":1,"isActive":false},{"label":"Gambaran umum","href":"Overview","type":2,"isActive":false},{"label":"Knowhere dalam arsitektur Milvus","href":"Knowhere-in-the-Milvus-architecture","type":2,"isActive":false},{"label":"Keunggulan Knowhere","href":"Knowhere-advantages","type":2,"isActive":false},{"label":"Struktur kode Knowhere","href":"Knowhere-code-structure","type":2,"isActive":false},{"label":"Menambahkan indeks ke Knowhere","href":"Adding-indices-to-Knowhere","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/knowhere.md b/localization/v2.5.x/site/id/reference/knowhere.md new file mode 100644 index 000000000..7d0e84527 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/knowhere.md @@ -0,0 +1,179 @@ +--- +id: knowhere.md +summary: Pelajari tentang Knowhere di Milvus. +title: Knowhere +--- +

    Knowhere

    Topik ini memperkenalkan Knowhere, mesin eksekusi vektor inti dari Milvus.

    +

    Gambaran umum

    Knowhere adalah mesin eksekusi vektor inti dari Milvus, yang menggabungkan beberapa pustaka pencarian kemiripan vektor termasuk Faiss, Hnswlib, dan Annoy. Knowhere juga dirancang untuk mendukung komputasi heterogen. Knowhere mengontrol perangkat keras (CPU atau GPU) mana yang akan menjalankan pembuatan indeks dan permintaan pencarian. Inilah bagaimana Knowhere mendapatkan namanya - mengetahui di mana harus menjalankan operasi. Lebih banyak jenis perangkat keras termasuk DPU dan TPU akan didukung dalam rilis mendatang.

    +

    Knowhere dalam arsitektur Milvus

    Gambar di bawah ini mengilustrasikan posisi Knowhere dalam arsitektur Milvus.

    +

    + + Knowhere + Knowhere

    +

    Lapisan paling bawah adalah perangkat keras sistem. Di atasnya terdapat pustaka indeks pihak ketiga. Pada lapisan paling atas, Knowhere berinteraksi dengan simpul indeks dan simpul kueri melalui CGO, yang memungkinkan paket Go memanggil kode C.

    +

    Keunggulan Knowhere

    Berikut ini adalah keunggulan Knowhere dibandingkan Faiss.

    +

    Dukungan untuk BitsetView

    Milvus memperkenalkan mekanisme bitset untuk merealisasikan "penghapusan lunak". Vektor yang dihapus secara lunak masih ada dalam database tetapi tidak akan dihitung selama pencarian atau kueri kemiripan vektor.

    +

    Setiap bit dalam bitset berhubungan dengan vektor yang diindeks. Jika sebuah vektor ditandai sebagai "1" dalam bitset, itu berarti vektor ini dihapus secara lunak dan tidak akan dilibatkan selama pencarian vektor. Parameter bitset diterapkan pada semua API kueri indeks Faiss yang terbuka di Knowhere, termasuk indeks CPU dan GPU.

    +

    Untuk informasi lebih lanjut tentang mekanisme bitset, lihat bitset.

    +

    Dukungan untuk beberapa metrik kemiripan untuk mengindeks vektor biner

    Knowhere mendukung Hamming, Jaccard, Tanimoto, Superstruktur, dan Substruktur. Jaccard dan Tanimoto dapat digunakan untuk mengukur kemiripan antara dua set sampel, sedangkan Superstruktur dan Substruktur dapat digunakan untuk mengukur kemiripan struktur kimia.

    +

    Dukungan untuk set instruksi AVX512

    Selain AArch64, SSE4.2 dan AVX2, set instruksi yang telah didukung oleh Faiss, Knowhere juga mendukung AVX512, yang dapat meningkatkan kinerja pembuatan indeks dan kueri sebesar 20% hingga 30% dibandingkan dengan AVX2.

    +

    Pemilihan instruksi SIMD otomatis

    Knowhere mendukung pemanggilan instruksi SIMD yang sesuai secara otomatis (misalnya, SIMD SSE, AVX, AVX2, dan AVX512) pada prosesor CPU apa pun (baik di lokasi maupun platform cloud), sehingga pengguna tidak perlu secara manual menentukan flag SIMD (misalnya, "-msse4") selama kompilasi.

    +

    Knowhere dibangun dengan memfaktorkan ulang basis kode Faiss. Fungsi-fungsi umum (misalnya, komputasi kesamaan) yang mengandalkan akselerasi SIMD telah diperhitungkan. Kemudian untuk setiap fungsi, empat versi (yaitu, SSE, AVX, AVX2, AVX512) diimplementasikan dan masing-masing dimasukkan ke dalam file sumber yang terpisah. Kemudian file sumber selanjutnya dikompilasi secara individual dengan bendera SIMD yang sesuai. Oleh karena itu, pada saat runtime, Knowhere dapat secara otomatis memilih instruksi SIMD yang paling sesuai berdasarkan flag CPU saat ini dan kemudian menghubungkan penunjuk fungsi yang tepat menggunakan pengait.

    +

    Optimalisasi kinerja lainnya

    Baca Milvus: Sistem Manajemen Data Vektor yang Dibangun Khusus untuk mengetahui lebih lanjut tentang pengoptimalan kinerja Knowhere.

    +

    Struktur kode Knowhere

    Komputasi dalam Milvus terutama melibatkan operasi vektor dan skalar. Knowhere hanya menangani operasi pengindeksan vektor.

    +

    Indeks adalah struktur data yang terpisah dari data vektor aslinya. Secara umum, pengindeksan membutuhkan empat langkah: membuat indeks, melatih data, menyisipkan data, dan membangun indeks. Dalam beberapa aplikasi AI, pelatihan dataset dipisahkan dari pencarian vektor. Data dari dataset pertama-tama dilatih dan kemudian dimasukkan ke dalam basis data vektor seperti Milvus untuk pencarian kemiripan. Sebagai contoh, dataset terbuka sift1M dan sift1B membedakan data untuk pelatihan dan data untuk pengujian.

    +

    Namun, di Knowhere, data untuk pelatihan dan pencarian adalah sama. Knowhere melatih semua data dalam sebuah segmen dan kemudian memasukkan semua data yang telah dilatih dan membuat indeks untuk data tersebut.

    +

    DataObj: kelas dasar

    DataObj adalah kelas dasar dari semua struktur data di Knowhere. Size() adalah satu-satunya metode virtual di DataObj. Kelas Index diwarisi dari DataObj dengan sebuah field bernama "size_". Kelas Index juga memiliki dua metode virtual - Serialize() dan Load(). Kelas VecIndex yang diturunkan dari Index adalah kelas dasar virtual untuk semua indeks vektor. VecIndex menyediakan metode termasuk Train(), Query(), GetStatistics(), dan ClearStatistics().

    +

    + + base class + kelas dasar

    +

    Beberapa jenis indeks lainnya tercantum di sebelah kanan pada gambar di atas.

    +
      +
    • Indeks Faiss memiliki dua kelas dasar: FaissBaseIndex untuk semua indeks pada vektor float point, dan FaissBaseBinaryIndex untuk semua indeks pada vektor biner.

    • +
    • GPUIndex adalah kelas dasar untuk semua indeks GPU Faiss.

    • +
    • OffsetBaseIndex adalah kelas dasar untuk semua indeks yang dikembangkan sendiri. Dengan hanya ID vektor yang disimpan dalam berkas indeks, ukuran berkas untuk vektor 128 dimensi dapat dikurangi 2 kali lipat.

    • +
    +

    + + IDMAP + IDMAP

    +

    Secara teknis, IDMAP bukanlah sebuah indeks, melainkan digunakan untuk pencarian brute-force. Ketika vektor dimasukkan ke dalam basis data, tidak diperlukan pelatihan data atau pembuatan indeks. Pencarian akan dilakukan secara langsung pada data vektor yang dimasukkan.

    +

    Namun, untuk konsistensi kode, IDMAP juga mewarisi kelas VecIndex dengan semua antarmuka virtualnya. Penggunaan IDMAP sama dengan indeks lainnya.

    +

    Indeks IVF

    + + IVF + IVF

    +

    Indeks IVF (inverted file) adalah indeks yang paling sering digunakan. Kelas IVF berasal dari VecIndex dan FaissBaseIndex, dan selanjutnya meluas ke IVFSQ dan IVFPQ. GPUIVF berasal dari GPUIndex dan IVF. Kemudian GPUIVF diperluas lebih lanjut menjadi GPUIVFSQ dan GPUIVFPQ.

    +

    IVFSQHybrid adalah indeks hibrida yang dikembangkan sendiri. Kuantizer kasar dieksekusi di GPU sementara pencarian di bucket di CPU. Jenis indeks ini dapat mengurangi terjadinya penyalinan memori antara CPU dan GPU dengan memanfaatkan daya komputasi GPU. IVFSQHybrid memiliki tingkat recall yang sama dengan GPUIVFSQ tetapi hadir dengan kinerja yang lebih baik.

    +

    Struktur kelas dasar untuk indeks biner relatif lebih sederhana. BinaryIDMAP dan BinaryIVF diturunkan dari FaissBaseBinaryIndex dan VecIndex.

    +

    Indeks pihak ketiga

    + + third-party indices + indeks pihak ketiga

    +

    Saat ini, hanya ada dua jenis indeks pihak ketiga yang didukung selain Faiss: indeks berbasis pohon Annoy, dan indeks berbasis grafik HNSW. Kedua indeks pihak ketiga yang umum dan sering digunakan ini berasal dari VecIndex.

    +

    Menambahkan indeks ke Knowhere

    Jika Anda ingin menambahkan indeks baru ke Knowhere, pertama-tama Anda dapat merujuk ke indeks yang sudah ada:

    +
      +
    • Untuk menambahkan indeks berbasis kuantisasi, lihat IVF_FLAT.

    • +
    • Untuk menambahkan indeks berbasis grafik, lihat HNSW.

    • +
    • Untuk menambahkan indeks berbasis pohon, lihat Annoy.

    • +
    +

    Setelah merujuk ke indeks yang ada, Anda dapat mengikuti langkah-langkah di bawah ini untuk menambahkan indeks baru ke Knowhere.

    +
      +
    1. Tambahkan nama indeks baru di IndexEnum. Tipe datanya adalah string.

    2. +
    3. Tambahkan pemeriksaan validasi data pada indeks baru di file ConfAdapter.cpp. Pemeriksaan validasi terutama untuk memvalidasi parameter untuk pelatihan data dan kueri.

    4. +
    5. Buat file baru untuk indeks baru. Kelas dasar dari indeks baru harus menyertakan VecIndex, dan antarmuka virtual yang diperlukan dari VecIndex.

    6. +
    7. Tambahkan logika pembangunan indeks untuk indeks baru di VecIndexFactory::CreateVecIndex().

    8. +
    9. Tambahkan unit test di bawah direktori unittest.

    10. +
    +

    Apa selanjutnya

    Setelah mempelajari cara kerja Knowhere di Milvus, Anda mungkin juga ingin:

    + diff --git a/localization/v2.5.x/site/id/reference/multi_tenancy.json b/localization/v2.5.x/site/id/reference/multi_tenancy.json new file mode 100644 index 000000000..83d6dd901 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/multi_tenancy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Multi-tenancy strategies","anchorList":[{"label":"Strategi multi-penyewaan","href":"Multi-tenancy-strategies","type":1,"isActive":false},{"label":"Multi-tenancy yang berorientasi pada basis data","href":"Database-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Penyewaan multi-penyewa yang berorientasi pada koleksi","href":"Collection-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Multi-penyewaan berorientasi partisi","href":"Partition-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/multi_tenancy.md b/localization/v2.5.x/site/id/reference/multi_tenancy.md new file mode 100644 index 000000000..80e2db3f6 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/multi_tenancy.md @@ -0,0 +1,106 @@ +--- +id: multi_tenancy.md +related_key: multi-tenancy +summary: Multi-penyewaan di Milvus. +title: Strategi multi-penyewaan +--- +

    Strategi multi-penyewaan

    Dalam banyak kasus penggunaan, pengembang ingin menjalankan satu cluster Milvus dan melayani beberapa penyewa, seperti beberapa tim produk, atau jutaan pengguna akhir. Panduan ini menjelaskan beberapa strategi berbeda untuk mencapai multi-tenancy di Milvus.

    +

    Milvus dirancang untuk mendukung multi-tenancy di tingkat database, koleksi, atau partisi. Tujuan dari multi-tenancy adalah untuk memisahkan data dan sumber daya satu sama lain. Menerapkan multi-tenancy pada tingkat yang berbeda dapat mencapai tingkat isolasi yang berbeda tetapi juga melibatkan biaya yang berbeda. Di sini kami menjelaskan trade-off dari keduanya.

    +

    Multi-tenancy yang berorientasi pada basis data

    Sejak Milvus versi 2.2.9, Anda dapat membuat beberapa database dalam satu cluster Milvus. Fitur ini memungkinkan untuk mencapai multi-tenancy berorientasi database dengan memberikan database untuk setiap penyewa, sehingga mereka dapat membuat koleksi mereka sendiri. Pendekatan ini memberikan isolasi data dan sumber daya terbaik untuk penyewa, tetapi terbatas pada 64 database dalam satu cluster.

    +

    Penyewaan multi-penyewa yang berorientasi pada koleksi

    Ada dua cara yang memungkinkan untuk mencapai multi-penyewaan berorientasi koleksi.

    +

    Satu koleksi untuk semua penyewa

    Menggunakan satu koleksi untuk mengimplementasikan multi-penyewaan dengan menambahkan bidang penyewa untuk membedakan antara penyewa adalah pilihan yang sederhana. Saat melakukan pencarian ANN untuk penyewa tertentu, tambahkan ekspresi filter untuk menyaring semua entitas yang dimiliki oleh penyewa lain. Ini adalah cara paling sederhana untuk mencapai multi-tenancy. Namun, perlu diketahui bahwa kinerja filter dapat menjadi penghambat pencarian ANN. Untuk meningkatkan kinerja pencarian, Anda dapat mengoptimalkan dengan multi-tenancy berorientasi partisi di bawah ini.

    +

    Satu koleksi per penyewa

    Pendekatan lain adalah membuat koleksi untuk setiap penyewa untuk menyimpan datanya sendiri, alih-alih menyimpan data semua penyewa dalam satu koleksi. Hal ini memberikan isolasi data dan kinerja kueri yang lebih baik. Namun, perlu diingat bahwa pendekatan ini membutuhkan lebih banyak sumber daya dalam penjadwalan dan terbatas pada 10.000 koleksi dalam satu klaster.

    +

    Multi-penyewaan berorientasi partisi

    Ada dua cara untuk mencapai multi-penyewaan berorientasi partisi:

    +

    Satu partisi per penyewa

    Mengelola satu koleksi jauh lebih mudah daripada mengelola banyak koleksi. Daripada membuat banyak koleksi, pertimbangkan untuk menetapkan satu partisi untuk setiap penyewa untuk mencapai isolasi data yang fleksibel dan manajemen memori. Performa pencarian multi-penyewaan berorientasi partisi jauh lebih baik daripada multi-penyewaan berorientasi koleksi. Namun, perlu diperhatikan bahwa jumlah penyewa koleksi tidak boleh melebihi jumlah maksimum partisi yang dapat ditampung oleh sebuah koleksi.

    +

    Penyewaan multi-penyewa berbasis kunci partisi

    Milvus 2.2.9 memperkenalkan fitur baru bernama kunci partisi. Pada saat pembuatan koleksi, tentukan bidang penyewa dan jadikan bidang tersebut sebagai kunci partisi. Milvus akan menyimpan entitas dalam sebuah partisi sesuai dengan nilai hash dari field kunci partisi. Ketika melakukan pencarian ANN, Milvus hanya mencari partisi yang berisi kunci partisi. Hal ini akan mengurangi cakupan pencarian sehingga mencapai kinerja yang lebih baik daripada tanpa kunci partisi.

    +
    +

    Strategi ini menghilangkan batasan jumlah maksimum penyewa yang dapat didukung oleh koleksi Milvus dan sangat menyederhanakan manajemen sumber daya karena Milvus secara otomatis mengelola partisi untuk Anda.

    +

    Sebagai rangkuman, Anda bisa menggunakan salah satu atau beberapa strategi multi-tenancy di atas untuk membentuk solusi Anda sendiri. Tabel berikut membuat perbandingan di antara strategi-strategi ini dalam hal isolasi data, kinerja pencarian, dan jumlah maksimum penyewa.

    + + + + + + + + + + + +
    Isolasi dataPerforma pencarian.Maks. jumlah penyewaMerekomendasikan skenario
    Berorientasi pada basis dataKuatKuat64Untuk mereka yang membutuhkan koleksi yang bervariasi dengan proyek, terutama cocok untuk isolasi data antar departemen dalam organisasi Anda.
    Satu koleksi untuk semuaLemahSedangN/AUntuk mereka yang memiliki sumber daya terbatas dan tidak peka terhadap isolasi data.
    Satu koleksi per penyewaKuatKuatKurang dari 10.000Untuk yang memiliki kurang dari 10.000 penyewa per klaster.
    Satu partisi per penyewaSedangKuat4,096Untuk yang memiliki kurang dari 4.096 penyewa per koleksi.
    Berbasis kunci partisiSedangKuat10,000,000+Untuk mereka yang memprediksi peningkatan penyewa yang cepat menjadi jutaan.
    +

    Apa selanjutnya

    MengelolaSkemaBasis Data

    diff --git a/localization/v2.5.x/site/id/reference/replica.json b/localization/v2.5.x/site/id/reference/replica.json new file mode 100644 index 000000000..b8d32e3d3 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/replica.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-Memory Replica","anchorList":[{"label":"Replika Dalam Memori","href":"In-Memory-Replica","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Konsep Utama","href":"Key-Concepts","type":2,"isActive":false},{"label":"Detail Desain","href":"Design-Details","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/replica.md b/localization/v2.5.x/site/id/reference/replica.md new file mode 100644 index 000000000..91a384426 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/replica.md @@ -0,0 +1,91 @@ +--- +id: replica.md +summary: Pelajari tentang replika dalam memori di Milvus. +title: Replika Dalam Memori +--- +

    Replika Dalam Memori

    Topik ini memperkenalkan mekanisme replika dalam memori (replikasi) dalam Milvus yang memungkinkan replikasi beberapa segmen dalam memori kerja untuk meningkatkan kinerja dan ketersediaan.

    +

    Untuk informasi tentang cara mengonfigurasi replika dalam memori, lihat Konfigurasi terkait Node Query.

    +

    Gambaran Umum

    + + Replica_Availiability + Replika_Ketersediaan

    +

    Dengan replika dalam memori, Milvus dapat memuat segmen yang sama pada beberapa node kueri. Jika satu simpul kueri gagal atau sibuk dengan permintaan pencarian saat ini ketika yang lain tiba, sistem dapat mengirim permintaan baru ke simpul kueri yang menganggur yang memiliki replikasi segmen yang sama.

    +

    Kinerja

    Replika dalam memori memungkinkan Anda memanfaatkan sumber daya CPU dan memori ekstra. Hal ini sangat berguna jika Anda memiliki kumpulan data yang relatif kecil tetapi ingin meningkatkan throughput pembacaan dengan sumber daya perangkat keras tambahan. Keseluruhan QPS (kueri per detik) dan throughput dapat ditingkatkan secara signifikan.

    +

    Ketersediaan

    Replika dalam memori membantu Milvus pulih lebih cepat jika simpul kueri mengalami kegagalan. Ketika sebuah node kueri gagal, segmen tidak harus dimuat ulang di node kueri lain. Sebaliknya, permintaan pencarian dapat dikirim ulang ke node kueri baru dengan segera tanpa harus memuat ulang data lagi. Dengan beberapa replika segmen yang dipertahankan secara bersamaan, sistem lebih tangguh dalam menghadapi kegagalan.

    +

    Konsep Utama

    Replika dalam memori disusun sebagai grup replika. Setiap grup replika berisi replika pecahan. Setiap replika pecahan memiliki replika streaming dan replika historis yang sesuai dengan segmen yang tumbuh dan disegel dalam pecahan (yaitu saluran DML).

    +

    + + An illustration of how in-memory replica works + Ilustrasi cara kerja replika dalam memori

    +

    Grup replika

    Grup replika terdiri dari beberapa node kueri yang bertanggung jawab untuk menangani data historis dan replika.

    +

    Replika pecahan

    Replika pecahan terdiri dari replika streaming dan replika historis, keduanya termasuk dalam pecahan yang sama. Jumlah replika pecahan dalam kelompok replika ditentukan oleh jumlah pecahan dalam koleksi tertentu.

    +

    Replika streaming

    Replika streaming berisi semua segmen yang berkembang dari saluran DML yang sama. Secara teknis, replika streaming harus dilayani oleh hanya satu simpul kueri dalam satu replika.

    +

    Replika historis

    Replika historis berisi semua segmen tersegel dari saluran DML yang sama. Segmen tersegel dari satu replika historis dapat didistribusikan pada beberapa node kueri dalam grup replika yang sama.

    +

    Pemimpin pecahan

    Shard leader adalah simpul kueri yang melayani replika streaming dalam replika pecahan.

    +

    Detail Desain

    Keseimbangan

    Segmen baru yang perlu dimuat akan dialokasikan ke beberapa node kueri yang berbeda. Permintaan pencarian dapat diproses setelah setidaknya satu replika berhasil dimuat.

    +

    Cache

    Proksi memelihara cache yang memetakan segmen ke node kueri dan memperbaruinya secara berkala. Ketika proksi menerima permintaan, Milvus mendapatkan semua segmen tersegel yang perlu dicari dari cache dan mencoba menetapkannya ke node kueri secara merata.

    +

    Untuk segmen yang terus bertambah, proksi juga memelihara cache saluran-ke-simpul-simpul dan mengirimkan permintaan ke simpul-simpul kueri yang sesuai.

    +

    Failover

    Cache pada proxy tidak selalu diperbarui. Beberapa segmen atau saluran mungkin telah dipindahkan ke node kueri lain ketika permintaan masuk. Dalam kasus ini, proxy akan menerima respons kesalahan, memperbarui cache dan mencoba untuk menugaskannya ke node kueri lain.

    +

    Segmen akan diabaikan jika proxy masih tidak dapat menemukannya setelah memperbarui cache. Hal ini dapat terjadi jika segmen telah dipadatkan.

    +

    Jika cache tidak akurat, proxy mungkin melewatkan beberapa segmen. Node kueri dengan saluran DML (segmen yang berkembang) mengembalikan respons pencarian bersama dengan daftar segmen yang dapat diandalkan yang dapat dibandingkan oleh proxy dan memperbarui cache.

    +

    Peningkatan

    Proxy tidak dapat mengalokasikan permintaan pencarian ke node kueri secara merata dan node kueri mungkin memiliki sumber daya yang berbeda untuk melayani permintaan pencarian. Untuk menghindari distribusi sumber daya yang berekor panjang, proksi akan menetapkan segmen aktif pada node kueri lain ke node kueri yang menganggur yang juga memiliki segmen ini.

    diff --git a/localization/v2.5.x/site/id/reference/scalar_index.json b/localization/v2.5.x/site/id/reference/scalar_index.json new file mode 100644 index 000000000..8e727bf4d --- /dev/null +++ b/localization/v2.5.x/site/id/reference/scalar_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Scalar Index","anchorList":[{"label":"Indeks Skalar","href":"Scalar-Index","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Algoritma pengindeksan bidang skalar","href":"Scalar-field-indexing-algorithms","type":2,"isActive":false},{"label":"Rekomendasi kinerja","href":"Performance-recommandations","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/scalar_index.md b/localization/v2.5.x/site/id/reference/scalar_index.md new file mode 100644 index 000000000..031f96a2a --- /dev/null +++ b/localization/v2.5.x/site/id/reference/scalar_index.md @@ -0,0 +1,165 @@ +--- +id: scalar_index.md +related_key: scalar_index +summary: Indeks skalar dalam Milvus. +title: Indeks Skalar +--- +

    Indeks Skalar

    Milvus mendukung pencarian terfilter yang menggabungkan bidang skalar dan vektor. Untuk meningkatkan efisiensi pencarian yang melibatkan bidang skalar, Milvus memperkenalkan pengindeksan bidang skalar mulai versi 2.1.0. Artikel ini memberikan gambaran umum mengenai pengindeksan medan skalar di Milvus, untuk membantu Anda memahami arti penting dan implementasinya.

    +

    Gambaran Umum

    Setelah melakukan pencarian kemiripan vektor di Milvus, Anda dapat menggunakan operator logika untuk mengorganisasikan bidang skalar ke dalam ekspresi boolean.

    +

    Ketika Milvus menerima permintaan pencarian dengan ekspresi boolean, Milvus menguraikan ekspresi boolean menjadi pohon sintaks abstrak (AST) untuk menghasilkan rencana fisik untuk pemfilteran atribut. Milvus kemudian menerapkan rencana fisik di setiap segmen untuk menghasilkan bitset sebagai hasil penyaringan dan menyertakan hasilnya sebagai parameter pencarian vektor untuk mempersempit cakupan pencarian. Dalam hal ini, kecepatan pencarian vektor sangat bergantung pada kecepatan pemfilteran atribut.

    +

    + + Attribute filtering in a segment + Pemfilteran atribut dalam segmen

    +

    Pengindeksan bidang skalar adalah cara untuk memastikan kecepatan pemfilteran atribut dengan mengurutkan nilai bidang skalar dengan cara tertentu untuk mempercepat pencarian informasi.

    +

    Algoritma pengindeksan bidang skalar

    Milvus bertujuan untuk mencapai penggunaan memori yang rendah, efisiensi penyaringan yang tinggi, dan waktu pemuatan yang singkat dengan algoritme pengindeksan bidang skalar. Algoritme ini dikategorikan ke dalam dua jenis utama: pengindeksan otomatis dan pengindeksan terbalik.

    +

    Pengindeksan otomatis

    Milvus menyediakan opsi AUTOINDEX untuk membebaskan Anda dari keharusan memilih jenis indeks secara manual. Ketika memanggil metode create_index, jika index_type tidak ditentukan, Milvus secara otomatis memilih jenis indeks yang paling sesuai berdasarkan tipe data.

    +

    Tabel berikut mencantumkan tipe data yang didukung Milvus dan algoritme pengindeksan otomatis yang sesuai.

    + + + + + + + + + + + + + +
    Tipe dataAlgoritme pengindeksan otomatis
    VARCHARIndeks terbalik
    INT8Indeks terbalik
    INT16Indeks terbalik
    INT32Indeks terbalik
    INT64Indeks terbalik
    FLOATIndeks terbalik
    GANDAIndeks terbalik
    +

    Pengindeksan terbalik

    Pengindeksan terbalik menawarkan cara yang fleksibel untuk membuat indeks untuk bidang skalar dengan menentukan parameter indeks secara manual. Metode ini bekerja dengan baik untuk berbagai skenario, termasuk kueri titik, kueri pencocokan pola, pencarian teks lengkap, pencarian JSON, pencarian Boolean, dan bahkan kueri pencocokan awalan.

    +

    Indeks terbalik yang diimplementasikan di Milvus didukung oleh Tantivy, sebuah pustaka mesin pencari teks lengkap. Tantivy memastikan bahwa pengindeksan terbalik di Milvus efisien dan cepat.

    +

    Indeks terbalik memiliki dua komponen utama: kamus istilah dan daftar terbalik. Kamus istilah mencakup semua kata yang diberi tanda yang diurutkan menurut abjad, sedangkan daftar terbalik berisi daftar dokumen di mana setiap kata muncul. Pengaturan ini membuat kueri titik dan kueri rentang jauh lebih cepat dan lebih efisien daripada pencarian brute force.

    +

    + + Inverted index diagram + Diagram indeks terbalik

    +

    Keuntungan menggunakan indeks terbalik terutama terlihat dalam operasi berikut:

    +
      +
    • Kueri titik: Misalnya, ketika mencari dokumen yang mengandung kata Milvus, prosesnya dimulai dengan memeriksa apakah Milvus ada dalam kamus istilah. Jika tidak ditemukan, tidak ada dokumen yang mengandung kata tersebut. Namun, jika ditemukan, daftar terbalik yang terkait dengan Milvus diambil, yang menunjukkan dokumen yang mengandung kata tersebut. Metode ini jauh lebih efisien daripada pencarian brute-force melalui jutaan dokumen, karena kamus istilah yang diurutkan secara signifikan mengurangi kerumitan waktu untuk menemukan kata Milvus.
    • +
    • Kueri rentang: Efisiensi kueri rentang, seperti menemukan dokumen dengan kata yang secara alfabetis lebih besar daripada sangat, juga ditingkatkan oleh kamus istilah yang diurutkan. Pendekatan ini lebih efisien daripada pencarian brute-force, memberikan hasil yang lebih cepat dan lebih akurat.
    • +
    +

    Hasil pengujian

    Untuk menunjukkan peningkatan kinerja yang disediakan oleh indeks skalar di Milvus, sebuah percobaan dilakukan dengan membandingkan kinerja beberapa ekspresi menggunakan pengindeksan terbalik dan pencarian brute-force pada data mentah.

    +

    Eksperimen ini melibatkan pengujian berbagai ekspresi dalam dua kondisi: dengan indeks terbalik dan dengan pencarian brute-force. Untuk memastikan keadilan, distribusi data yang sama dipertahankan di seluruh pengujian, dengan menggunakan koleksi yang sama setiap kali. Sebelum setiap pengujian, koleksi dirilis, dan indeks dibuang dan dibangun kembali. Selain itu, kueri hangat dilakukan sebelum setiap pengujian untuk meminimalkan dampak data dingin dan panas, dan setiap kueri dieksekusi beberapa kali untuk memastikan keakuratan.

    +

    Untuk dataset yang terdiri dari 1 juta record, menggunakan indeks terbalik dapat memberikan peningkatan kinerja hingga 30x lipat untuk kueri titik. Peningkatan kinerja bisa lebih signifikan untuk dataset yang lebih besar.

    +

    Rekomendasi kinerja

    Untuk memanfaatkan sepenuhnya kemampuan Milvus dalam pengindeksan bidang skalar dan mengeluarkan kekuatannya dalam pencarian kemiripan vektor, Anda mungkin memerlukan model untuk memperkirakan ukuran memori yang diperlukan berdasarkan data yang Anda miliki.

    +

    Tabel-tabel berikut mencantumkan fungsi-fungsi estimasi untuk semua tipe data yang didukung oleh Milvus.

    +
      +
    • Bidang numerik

      + + + + + + + + + + + + +
      Tipe dataFungsi estimasi memori (MB)
      INT8numOfRows * 12 / 1024 / 1024
      INT16numOfRows * 12 / 1024 / 1024
      INT32numOfRows * 12 / 1024 / 1024
      INT64numOfRows * 24 / 1024 / 1024
      FLOAT32numOfRows * 12 / 1024 / 1024
      GANDAnumOfRows * 24 / 1024 / 1024
      +
    • +
    • Bidang string

      + + + + + + + + + + + + +
      Panjang stringFungsi estimasi memori (MB)
      (0, 8]numOfRows * 128 / 1024 / 1024
      (8, 16]numOfRows * 144 / 1024 / 1024
      (16, 32]numOfRows * 160 / 1024 / 1024
      (32, 64]numOfRows * 192 / 1024 / 1024
      (64, 128]numOfRows * 256 / 1024 / 1024
      (128, 65535]numOfRows * strLen * 1.5 / 1024 / 1024
      +
    • +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/schema.json b/localization/v2.5.x/site/id/reference/schema.json new file mode 100644 index 000000000..fac3421e9 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import DataType, FieldSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# The following creates a field and use it as the partition key\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n","from pymilvus import DataType, FieldSchema\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n # configure default value `25` for field `age`\n FieldSchema(name=\"age\", dtype=DataType.INT64, default_value=25, description=\"age\"),\n embedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n]\n","from pymilvus import DataType, FieldSchema, CollectionSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n\n# Set enable_dynamic_field to True if you need to use dynamic fields. \nschema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description=\"desc of a collection\")\n","from pymilvus import Collection, connections\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\ncollection_name1 = \"tutorial_1\"\ncollection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)\n","from pymilvus import Collection\nimport pandas as pd\ndf = pd.DataFrame({\n \"id\": [i for i in range(nb)],\n \"age\": [random.randint(20, 40) for i in range(nb)],\n \"embedding\": [[random.random() for _ in range(dim)] for _ in range(nb)],\n \"position\": \"test_pos\"\n})\n\ncollection, ins_res = Collection.construct_from_dataframe(\n 'my_collection',\n df,\n primary_field='id',\n auto_id=False\n )\n"],"headingContent":"Manage Schema","anchorList":[{"label":"Mengelola Skema","href":"Manage-Schema","type":1,"isActive":false},{"label":"Skema bidang","href":"Field-schema","type":2,"isActive":false},{"label":"Skema koleksi","href":"Collection-schema","type":2,"isActive":false},{"label":"Selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/schema.md b/localization/v2.5.x/site/id/reference/schema.md new file mode 100644 index 000000000..274da3f56 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/schema.md @@ -0,0 +1,252 @@ +--- +id: schema.md +summary: Pelajari cara mendefinisikan skema di Milvus. +title: Mengelola Skema +--- +

    Mengelola Skema

    Topik ini memperkenalkan skema di Milvus. Skema digunakan untuk mendefinisikan properti koleksi dan field-field di dalamnya.

    +

    Skema bidang

    Skema field adalah definisi logis dari sebuah field. Ini adalah hal pertama yang perlu Anda definisikan sebelum mendefinisikan skema koleksi dan mengelola koleksi.

    +

    Milvus hanya mendukung satu field kunci utama dalam sebuah koleksi.

    +

    Properti skema field

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertiDeskripsiCatatan
    nameNama bidang dalam koleksi yang akan dibuatTipe data: String.
    Wajib
    dtypeTipe data dari field tersebutWajib
    descriptionDeskripsi bidangTipe data: String.
    Opsional
    is_primaryApakah akan menetapkan bidang sebagai bidang kunci utama atau tidakTipe data: Boolean (true atau false).
    Wajib untuk bidang kunci utama
    auto_id (Wajib untuk bidang kunci utama)Beralih untuk mengaktifkan atau menonaktifkan alokasi ID (kunci utama) otomatis.True atau False
    max_length (Wajib untuk bidang VARCHAR)Panjang byte maksimum untuk string yang diizinkan untuk disisipkan. Perhatikan bahwa karakter multibyte (misalnya, karakter Unicode) dapat menempati lebih dari satu byte, jadi pastikan panjang byte string yang disisipkan tidak melebihi batas yang ditentukan.[1, 65,535]
    dimDimensi vektorTipe data: Bilangan bulat ∈[1, 32768].
    Wajib untuk bidang vektor yang padat. Hilangkan untuk bidang vektor yang jarang.
    is_partition_keyApakah bidang ini merupakan bidang kunci-partisi.Tipe data: Boolean (true atau false).
    +

    Membuat skema bidang

    Untuk mengurangi kerumitan dalam penyisipan data, Milvus mengizinkan Anda untuk menentukan nilai default untuk setiap field skalar selama pembuatan skema field, tidak termasuk field kunci utama. Hal ini mengindikasikan bahwa jika Anda mengosongkan sebuah field ketika memasukkan data, nilai default yang Anda tentukan untuk field tersebut akan berlaku.

    +

    Membuat skema bidang biasa:

    +
    from pymilvus import DataType, FieldSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# The following creates a field and use it as the partition key
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +

    Membuat skema bidang dengan nilai bidang default:

    +
    from pymilvus import DataType, FieldSchema
    +
    +fields = [
    +  FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +  # configure default value `25` for field `age`
    +  FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
    +  embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +]
    +
    +

    Tipe data yang didukung

    DataType menentukan jenis data yang berisi bidang. Bidang yang berbeda mendukung tipe data yang berbeda.

    +
      +
    • Mendukung bidang kunci utama:

      +
        +
      • INT64: numpy.int64
      • +
      • VARCHAR: VARCHAR
      • +
    • +
    • Mendukung bidang skalar:

      +
        +
      • BOOL: Boolean (true atau false)
      • +
      • INT8: numpy.int8
      • +
      • INT16: numpy.int16
      • +
      • INT32: numpy.int32
      • +
      • INT64: numpy.int64
      • +
      • FLOAT: numpy.float32
      • +
      • DOUBLE: numpy.double
      • +
      • VARCHAR: VARCHAR
      • +
      • JSON: JSON
      • +
      • Larik Larik
      • +
      +

      JSON sebagai tipe data gabungan tersedia. Bidang JSON terdiri dari pasangan kunci-nilai. Setiap kunci adalah string, dan nilai dapat berupa angka, string, nilai boolean, larik, atau daftar. Untuk detailnya, lihat JSON: tipe data baru.

    • +
    • Mendukung bidang vektor:

      +
        +
      • BINARY_VECTOR: Menyimpan data biner sebagai urutan 0 dan 1, yang digunakan untuk representasi fitur yang ringkas dalam pemrosesan gambar dan pengambilan informasi.
      • +
      • FLOAT_VECTOR: Menyimpan angka floating-point 32-bit, yang biasa digunakan dalam komputasi ilmiah dan pembelajaran mesin untuk merepresentasikan bilangan real.
      • +
      • FLOAT16_VECTOR: Menyimpan angka floating-point setengah presisi 16-bit, digunakan dalam pembelajaran mendalam dan komputasi GPU untuk efisiensi memori dan bandwidth.
      • +
      • BFLOAT16_VECTOR: Menyimpan angka floating-point 16-bit dengan presisi yang berkurang tetapi rentang eksponen yang sama dengan Float32, populer dalam deep learning untuk mengurangi kebutuhan memori dan komputasi tanpa memengaruhi akurasi secara signifikan.
      • +
      • SPARSE_FLOAT_VECTOR: Menyimpan daftar elemen bukan nol dan indeks yang sesuai, yang digunakan untuk merepresentasikan vektor jarang. Untuk informasi lebih lanjut, lihat Vektor Jarang.
      • +
      +

      Milvus mendukung beberapa bidang vektor dalam sebuah koleksi. Untuk informasi lebih lanjut, lihat Pencarian Hibrid.

    • +
    +

    Skema koleksi

    Skema koleksi adalah definisi logis dari sebuah koleksi. Biasanya Anda perlu mendefinisikan skema bidang sebelum mendefinisikan skema koleksi dan mengelola koleksi.

    +

    Properti skema koleksi

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertiDeskripsiCatatan
    fieldBidang dalam koleksi yang akan dibuatWajib
    descriptionDeskripsi koleksiTipe data: String.
    Opsional
    partition_key_fieldNama bidang yang dirancang untuk bertindak sebagai kunci partisi.Tipe data: String.
    Opsional
    enable_dynamic_fieldApakah akan mengaktifkan skema dinamis atau tidakTipe data: Boolean (true atau false).
    Opsional, nilai defaultnya adalah False.
    Untuk detail mengenai skema dinamis, lihat Skema Dinam is dan panduan pengguna untuk mengelola koleksi.
    +

    Membuat skema koleksi

    + Tentukan skema bidang sebelum menentukan skema koleksi.
    +
    from pymilvus import DataType, FieldSchema, CollectionSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +# Set enable_dynamic_field to True if you need to use dynamic fields. 
    +schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")
    +
    +

    Buat koleksi dengan skema yang ditentukan:

    +
    from pymilvus import Collection, connections
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +collection_name1 = "tutorial_1"
    +collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
    +
    +
    +
      +
    • Anda dapat menentukan nomor pecahan dengan shards_num.
    • +
    • Anda dapat menentukan server Milvus tempat Anda ingin membuat koleksi dengan menentukan alias di using.
    • +
    • Anda dapat mengaktifkan fitur kunci partisi pada bidang dengan mengatur is_partition_key ke True pada bidang jika Anda perlu mengimplementasikan multi-tenancy berbasis kunci partisi.
    • +
    • Anda dapat mengaktifkan skema dinamis dengan mengatur enable_dynamic_field ke True pada skema koleksi jika Anda perlu mengaktifkan field dinamis.
    • +
    +
    +


    +Anda juga dapat membuat koleksi dengan Collection.construct_from_dataframe, yang secara otomatis membuat skema koleksi dari DataFrame dan membuat koleksi.

    +
    from pymilvus import Collection
    +import pandas as pd
    +df = pd.DataFrame({
    +    "id": [i for i in range(nb)],
    +    "age": [random.randint(20, 40) for i in range(nb)],
    +    "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
    +    "position": "test_pos"
    +})
    +
    +collection, ins_res = Collection.construct_from_dataframe(
    +    'my_collection',
    +    df,
    +    primary_field='id',
    +    auto_id=False
    +    )
    +
    +

    Selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_common.json b/localization/v2.5.x/site/id/reference/sys_config/configure_common.json new file mode 100644 index 000000000..c36c4ee5b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_common.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"common-related Configurations","anchorList":[{"label":"Konfigurasi terkait umum","href":"common-related-Configurations","type":1,"isActive":false},{"label":"common.defaultPartitionName","href":"commondefaultPartitionName","type":2,"isActive":false},{"label":"common.defaultIndexName","href":"commondefaultIndexName","type":2,"isActive":false},{"label":"common.entityExpiration","href":"commonentityExpiration","type":2,"isActive":false},{"label":"common.indexSliceSize","href":"commonindexSliceSize","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.highPriority","href":"commonthreadCoreCoefficienthighPriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.middlePriority","href":"commonthreadCoreCoefficientmiddlePriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.lowPriority","href":"commonthreadCoreCoefficientlowPriority","type":2,"isActive":false},{"label":"common.gracefulTime","href":"commongracefulTime","type":2,"isActive":false},{"label":"common.gracefulStopTimeout","href":"commongracefulStopTimeout","type":2,"isActive":false},{"label":"common.storageType","href":"commonstorageType","type":2,"isActive":false},{"label":"common.simdType","href":"commonsimdType","type":2,"isActive":false},{"label":"common.security.superUsers","href":"commonsecuritysuperUsers","type":2,"isActive":false},{"label":"common.security.defaultRootPassword","href":"commonsecuritydefaultRootPassword","type":2,"isActive":false},{"label":"common.session.ttl","href":"commonsessionttl","type":2,"isActive":false},{"label":"common.session.retryTimes","href":"commonsessionretryTimes","type":2,"isActive":false},{"label":"common.locks.metrics.enable","href":"commonlocksmetricsenable","type":2,"isActive":false},{"label":"common.locks.threshold.info","href":"commonlocksthresholdinfo","type":2,"isActive":false},{"label":"common.locks.threshold.warn","href":"commonlocksthresholdwarn","type":2,"isActive":false},{"label":"common.ttMsgEnabled","href":"commonttMsgEnabled","type":2,"isActive":false},{"label":"common.traceLogMode","href":"commontraceLogMode","type":2,"isActive":false},{"label":"common.bloomFilterSize","href":"commonbloomFilterSize","type":2,"isActive":false},{"label":"common.maxBloomFalsePositive","href":"commonmaxBloomFalsePositive","type":2,"isActive":false},{"label":"common.bloomFilterType","href":"commonbloomFilterType","type":2,"isActive":false},{"label":"common.bloomFilterApplyBatchSize","href":"commonbloomFilterApplyBatchSize","type":2,"isActive":false},{"label":"common.usePartitionKeyAsClusteringKey","href":"commonusePartitionKeyAsClusteringKey","type":2,"isActive":false},{"label":"common.useVectorAsClusteringKey","href":"commonuseVectorAsClusteringKey","type":2,"isActive":false},{"label":"common.enableVectorClusteringKey","href":"commonenableVectorClusteringKey","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_common.md b/localization/v2.5.x/site/id/reference/sys_config/configure_common.md new file mode 100644 index 000000000..590a9d823 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_common.md @@ -0,0 +1,812 @@ +--- +id: configure_common.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi umum untuk Milvus. +--- +

    Konfigurasi terkait umum

    common.defaultPartitionName

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nama partisi default saat koleksi dibuat _default
    +

    common.defaultIndexName

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nama indeks ketika dibuat dengan nama yang tidak ditentukan _default_idx
    +

    common.entityExpiration

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Masa berlaku entitas dalam hitungan detik, PERHATIAN -1 berarti tidak pernah kedaluwarsa -1
    +

    common.indexSliceSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran irisan indeks dalam MB 16
    +

    common.threadCoreCoefficient.highPriority

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Parameter ini menentukan berapa kali jumlah thread adalah jumlah core dalam pool prioritas tinggi 10
    +

    common.threadCoreCoefficient.middlePriority

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Parameter ini menentukan berapa kali jumlah thread adalah jumlah core dalam pool prioritas menengah 5
    +

    common.threadCoreCoefficient.lowPriority

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Parameter ini menentukan berapa kali jumlah thread adalah jumlah core dalam pool prioritas rendah 1
    +

    common.gracefulTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    milidetik. ini mewakili interval (dalam ms) di mana waktu kedatangan permintaan perlu dikurangi dalam kasus Bounded Consistency. 5000
    +

    common.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. ini akan memaksa keluar dari server jika proses penghentian secara perlahan tidak selesai selama waktu ini. 1800
    +

    common.storageType

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    silakan sesuaikan di Milvus yang disematkan: lokal, nilai yang tersedia adalah [lokal, jarak jauh, opendal], nilai minio sudah tidak digunakan, gunakan jarak jauh sebagai gantinya jarak jauh
    +

    common.simdType

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Nilai default: otomatis
  • +
  • Nilai yang valid: [auto, avx512, avx2, avx, sse4_2]
  • +
  • Konfigurasi ini hanya digunakan oleh querynode dan indexnode, konfigurasi ini memilih set instruksi CPU untuk pencarian dan pembuatan indeks.
  • auto
    +

    common.security.superUsers

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Pengguna super akan mengabaikan beberapa proses pemeriksaan sistem,
  • +
  • seperti verifikasi kata sandi lama saat memperbarui kredensial
  • +

    common.security.defaultRootPassword

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kata sandi default untuk pengguna root Milvus
    +

    common.session.ttl

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nilai ttl saat sesi memberikan izin untuk mendaftarkan layanan 30
    +

    common.session.retryTimes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    waktu coba ulang saat sesi mengirim permintaan etcd 30
    +

    common.locks.metrics.enable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    apakah mengumpulkan statistik untuk kunci metrik false
    +

    common.locks.threshold.info

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    milidetik minimum untuk durasi pencetakan di tingkat info 500
    +

    common.locks.threshold.warn

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    milidetik minimum untuk durasi pencetakan dalam tingkat peringatan 1000
    +

    common.ttMsgEnabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Apakah akan menonaktifkan mekanisme pesan waktu internal untuk sistem.
  • +
  • Jika dinonaktifkan (diatur ke false), sistem tidak akan mengizinkan operasi DML, termasuk penyisipan, penghapusan, kueri, dan pencarian.
  • +
  • Hal ini membantu Milvus-CDC menyinkronkan data tambahan
  • benar
    +

    common.traceLogMode

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    melacak info permintaan 0
    +

    common.bloomFilterSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran awal filter mekar 100000
    +

    common.maxBloomFalsePositive

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    tingkat positif palsu maksimum untuk filter mekar 0.001
    +

    common.bloomFilterType

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jenis filter mekar, mendukung BasicBloomFilter dan BlockedBloomFilter BasicBloomFilter
    +

    common.bloomFilterApplyBatchSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran batch kapan harus menerapkan pk ke filter mekar 1000
    +

    common.usePartitionKeyAsClusteringKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jika benar, lakukan pemadatan pengelompokan dan pemangkasan segmen pada bidang kunci partisi salah
    +

    common.useVectorAsClusteringKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jika benar, lakukan pemadatan clustering dan pemangkasan segmen pada bidang vektor false
    +

    common.enableVectorClusteringKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jika benar, aktifkan kunci pengelompokan vektor dan pemadatan pengelompokan vektor false
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.json b/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.json new file mode 100644 index 000000000..e8a5adbdb --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataCoord-related Configurations","anchorList":[{"label":"Konfigurasi terkait dataCoord","href":"dataCoord-related-Configurations","type":1,"isActive":false},{"label":"dataCoord.channel.watchTimeoutInterval","href":"dataCoordchannelwatchTimeoutInterval","type":2,"isActive":false},{"label":"dataCoord.channel.balanceWithRpc","href":"dataCoordchannelbalanceWithRpc","type":2,"isActive":false},{"label":"dataCoord.channel.legacyVersionWithoutRPCWatch","href":"dataCoordchannellegacyVersionWithoutRPCWatch","type":2,"isActive":false},{"label":"dataCoord.channel.balanceSilentDuration","href":"dataCoordchannelbalanceSilentDuration","type":2,"isActive":false},{"label":"dataCoord.channel.balanceInterval","href":"dataCoordchannelbalanceInterval","type":2,"isActive":false},{"label":"dataCoord.channel.checkInterval","href":"dataCoordchannelcheckInterval","type":2,"isActive":false},{"label":"dataCoord.channel.notifyChannelOperationTimeout","href":"dataCoordchannelnotifyChannelOperationTimeout","type":2,"isActive":false},{"label":"dataCoord.segment.maxSize","href":"dataCoordsegmentmaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.diskSegmentMaxSize","href":"dataCoordsegmentdiskSegmentMaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.sealProportion","href":"dataCoordsegmentsealProportion","type":2,"isActive":false},{"label":"dataCoord.segment.assignmentExpiration","href":"dataCoordsegmentassignmentExpiration","type":2,"isActive":false},{"label":"dataCoord.segment.allocLatestExpireAttempt","href":"dataCoordsegmentallocLatestExpireAttempt","type":2,"isActive":false},{"label":"dataCoord.segment.maxLife","href":"dataCoordsegmentmaxLife","type":2,"isActive":false},{"label":"dataCoord.segment.maxIdleTime","href":"dataCoordsegmentmaxIdleTime","type":2,"isActive":false},{"label":"dataCoord.segment.minSizeFromIdleToSealed","href":"dataCoordsegmentminSizeFromIdleToSealed","type":2,"isActive":false},{"label":"dataCoord.segment.maxBinlogFileNumber","href":"dataCoordsegmentmaxBinlogFileNumber","type":2,"isActive":false},{"label":"dataCoord.segment.smallProportion","href":"dataCoordsegmentsmallProportion","type":2,"isActive":false},{"label":"dataCoord.segment.compactableProportion","href":"dataCoordsegmentcompactableProportion","type":2,"isActive":false},{"label":"dataCoord.segment.expansionRate","href":"dataCoordsegmentexpansionRate","type":2,"isActive":false},{"label":"dataCoord.sealPolicy.channel.growingSegmentsMemSize","href":"dataCoordsealPolicychannelgrowingSegmentsMemSize","type":2,"isActive":false},{"label":"dataCoord.autoUpgradeSegmentIndex","href":"dataCoordautoUpgradeSegmentIndex","type":2,"isActive":false},{"label":"dataCoord.segmentFlushInterval","href":"dataCoordsegmentFlushInterval","type":2,"isActive":false},{"label":"dataCoord.enableCompaction","href":"dataCoordenableCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.enableAutoCompaction","href":"dataCoordcompactionenableAutoCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.enable","href":"dataCoordcompactionclusteringenable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.autoEnable","href":"dataCoordcompactionclusteringautoEnable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.triggerInterval","href":"dataCoordcompactionclusteringtriggerInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minInterval","href":"dataCoordcompactionclusteringminInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxInterval","href":"dataCoordcompactionclusteringmaxInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.newDataSizeThreshold","href":"dataCoordcompactionclusteringnewDataSizeThreshold","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxTrainSizeRatio","href":"dataCoordcompactionclusteringmaxTrainSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxCentroidsNum","href":"dataCoordcompactionclusteringmaxCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minCentroidsNum","href":"dataCoordcompactionclusteringminCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minClusterSizeRatio","href":"dataCoordcompactionclusteringminClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSizeRatio","href":"dataCoordcompactionclusteringmaxClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSize","href":"dataCoordcompactionclusteringmaxClusterSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.minSize","href":"dataCoordcompactionlevelzeroforceTriggerminSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.maxSize","href":"dataCoordcompactionlevelzeroforceTriggermaxSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMinNum","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMaxNum","type":2,"isActive":false},{"label":"dataCoord.syncSegmentsInterval","href":"dataCoordsyncSegmentsInterval","type":2,"isActive":false},{"label":"dataCoord.enableGarbageCollection","href":"dataCoordenableGarbageCollection","type":2,"isActive":false},{"label":"dataCoord.gc.interval","href":"dataCoordgcinterval","type":2,"isActive":false},{"label":"dataCoord.gc.missingTolerance","href":"dataCoordgcmissingTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.dropTolerance","href":"dataCoordgcdropTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.removeConcurrent","href":"dataCoordgcremoveConcurrent","type":2,"isActive":false},{"label":"dataCoord.gc.scanInterval","href":"dataCoordgcscanInterval","type":2,"isActive":false},{"label":"dataCoord.brokerTimeout","href":"dataCoordbrokerTimeout","type":2,"isActive":false},{"label":"dataCoord.autoBalance","href":"dataCoordautoBalance","type":2,"isActive":false},{"label":"dataCoord.checkAutoBalanceConfigInterval","href":"dataCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"dataCoord.import.filesPerPreImportTask","href":"dataCoordimportfilesPerPreImportTask","type":2,"isActive":false},{"label":"dataCoord.import.taskRetention","href":"dataCoordimporttaskRetention","type":2,"isActive":false},{"label":"dataCoord.import.maxSizeInMBPerImportTask","href":"dataCoordimportmaxSizeInMBPerImportTask","type":2,"isActive":false},{"label":"dataCoord.import.scheduleInterval","href":"dataCoordimportscheduleInterval","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalHigh","href":"dataCoordimportcheckIntervalHigh","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalLow","href":"dataCoordimportcheckIntervalLow","type":2,"isActive":false},{"label":"dataCoord.import.maxImportFileNumPerReq","href":"dataCoordimportmaxImportFileNumPerReq","type":2,"isActive":false},{"label":"dataCoord.import.waitForIndex","href":"dataCoordimportwaitForIndex","type":2,"isActive":false},{"label":"dataCoord.gracefulStopTimeout","href":"dataCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"dataCoord.slot.clusteringCompactionUsage","href":"dataCoordslotclusteringCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.mixCompactionUsage","href":"dataCoordslotmixCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.l0DeleteCompactionUsage","href":"dataCoordslotl0DeleteCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.ip","href":"dataCoordip","type":2,"isActive":false},{"label":"dataCoord.port","href":"dataCoordport","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxSendSize","href":"dataCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxRecvSize","href":"dataCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxSendSize","href":"dataCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxRecvSize","href":"dataCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.md b/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.md new file mode 100644 index 000000000..a59dd6fc8 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_datacoord.md @@ -0,0 +1,2009 @@ +--- +id: configure_datacoord.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi dataCoord untuk Milvus. +--- +

    Konfigurasi terkait dataCoord

    dataCoord.channel.watchTimeoutInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Batas waktu menonton saluran (dalam detik). Pembaruan datanode tickler kemajuan menonton akan mengatur ulang waktu batas waktu. 300
    +

    dataCoord.channel.balanceWithRpc

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan keseimbangan dengan RPC, default untuk menggunakan arloji etcd benar
    +

    dataCoord.channel.legacyVersionWithoutRPCWatch

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Datanode <= versi ini dianggap sebagai node lama, yang tidak memiliki watch() berbasis rpc. Ini hanya digunakan selama peningkatan bergilir di mana node lama tidak akan mendapatkan saluran baru 2.4.1
    +

    dataCoord.channel.balanceSilentDuration

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Durasi setelah manajer saluran memulai penyeimbangan saluran latar belakang 300
    +

    dataCoord.channel.balanceInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval yang digunakan manajer saluran untuk memeriksa status keseimbangan saluran dml 360
    +

    dataCoord.channel.checkInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval dalam detik yang digunakan manajer saluran untuk memajukan status saluran 1
    +

    dataCoord.channel.notifyChannelOperationTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Batas waktu pemberitahuan operasi saluran (dalam detik). 5
    +

    dataCoord.segment.maxSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum segmen, unit: MB. datacoord.segment.maxSize dan datacoord.segment.sealProportion bersama-sama menentukan apakah sebuah segmen dapat disegel. 1024
    +

    dataCoord.segment.diskSegmentMaxSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum segmen dalam MB untuk koleksi yang memiliki indeks Disk 2048
    +

    dataCoord.segment.sealProportion

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Proporsi minimum untuk datacoord.segment.maxSize untuk menyegel segmen. datacoord.segment.maxSize dan datacoord.segment.sealProportion bersama-sama menentukan apakah segmen dapat disegel. 0.12
    +

    dataCoord.segment.assignmentExpiration

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Waktu kedaluwarsa penetapan segmen, unit: ms 2000
    +

    dataCoord.segment.allocLatestExpireAttempt

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Waktu yang digunakan untuk mengalokasikan lastExpire terbaru dari rootCoord setelah restart 200
    +

    dataCoord.segment.maxLife

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Masa pakai maksimal segmen dalam detik, 24 * 60 * 60 86400
    +

    dataCoord.segment.maxIdleTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jika sebuah segmen tidak menerima catatan dml dalam maxIdleTime dan ukuran segmen lebih besar dari
  • +
  • minSizeFromIdleToSealed, Milvus akan secara otomatis menyegelnya.
  • +
  • Waktu idle maksimum segmen dalam detik, 10 * 60.
  • 600
    +

    dataCoord.segment.minSizeFromIdleToSealed

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran minimum dalam MB dari segmen yang dapat menganggur dari disegel. 16
    +

    dataCoord.segment.maxBinlogFileNumber

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum file binlog untuk satu segmen, segmen akan disegel jika
  • +
  • jumlah file binlog mencapai nilai maksimal.
  • 32
    +

    dataCoord.segment.smallProportion

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Segmen dianggap sebagai "segmen kecil" jika jumlah barisnya lebih kecil dari 0.5
    +

    dataCoord.segment.compactableProportion

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • (smallProportion * jumlah baris maksimal segmen).
  • +
  • Pemadatan akan terjadi pada segmen kecil jika segmen setelah pemadatan akan memiliki
  • 0.85
    +

    dataCoord.segment.expansionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • lebih dari (compactableProportion * segment max # of rows) baris.
  • +
  • HARUS LEBIH BESAR DARI ATAU SAMA DENGAN !!!
  • +
  • Selama pemadatan, ukuran segmen # baris dapat melebihi segmen max # baris sebesar (expansionRate-1) * 100%.
  • 1.25
    +

    dataCoord.sealPolicy.channel.growingSegmentsMemSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Ambang batas ukuran dalam MB, jika ukuran total segmen yang tumbuh dari setiap pecahan
  • +
  • melebihi ambang batas ini, segmen yang tumbuh terbesar akan disegel.
  • 4096
    +

    dataCoord.autoUpgradeSegmentIndex

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    apakah mengupgrade indeks segmen secara otomatis ke versi mesin indeks salah
    +

    dataCoord.segmentFlushInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi interval minimal (unit: Detik) antara operasi penyalaan pada segmen yang sama 2
    +

    dataCoord.enableCompaction

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Ganti nilai untuk mengontrol apakah akan mengaktifkan pemadatan segmen.
  • +
  • Pemadatan menggabungkan segmen ukuran kecil menjadi segmen besar, dan menghapus entitas yang dihapus di luar durasi penyewaan Perjalanan Waktu.
  • true
    +

    dataCoord.compaction.enableAutoCompaction

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Alihkan nilai untuk mengontrol apakah akan mengaktifkan pemadatan segmen otomatis selama data coord menempatkan dan menggabungkan segmen yang dapat dipadatkan di latar belakang.
  • +
  • Konfigurasi ini hanya berlaku jika dataCoord.enableCompaction disetel sebagai true.
  • true
    +

    dataCoord.compaction.clustering.enable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan pemadatan pengelompokan true
    +

    dataCoord.compaction.clustering.autoEnable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan pemadatan pengelompokan otomatis salah
    +

    dataCoord.compaction.clustering.triggerInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval pemicu pemadatan pengelompokan dalam detik 600
    +

    dataCoord.compaction.clustering.minInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval minimum antara eksekusi pemadatan pengelompokan satu koleksi, untuk menghindari pemadatan yang berlebihan 3600
    +

    dataCoord.compaction.clustering.maxInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jika sebuah koleksi belum dipadatkan pengelompokannya lebih lama dari maxInterval, paksakan pemadatan 259200
    +

    dataCoord.compaction.clustering.newDataSizeThreshold

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jika ukuran data baru lebih besar dari newDataSizeThreshold, jalankan pemadatan pengelompokan 512m
    +

    dataCoord.compaction.clustering.maxTrainSizeRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    rasio ukuran data maksimum dalam Kmeans train, jika lebih besar dari itu, akan turun sampling untuk memenuhi batas ini 0.8
    +

    dataCoord.compaction.clustering.maxCentroidsNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah centroid maksimum dalam kereta Kmeans 10240
    +

    dataCoord.compaction.clustering.minCentroidsNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah centroid minimum dalam kereta Kmeans 16
    +

    dataCoord.compaction.clustering.minClusterSizeRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran klaster minimum / ukuran rata-rata dalam Kmeans train 0.01
    +

    dataCoord.compaction.clustering.maxClusterSizeRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran cluster maksimum / ukuran rata-rata dalam kereta Kmeans 10
    +

    dataCoord.compaction.clustering.maxClusterSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran cluster maksimum dalam Kmeans train 5g
    +

    dataCoord.compaction.levelzero.forceTrigger.minSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran minimum dalam byte untuk memicu pemaksaan Pemadatan LevelNol, nilai defaultnya adalah 8MB 8388608
    +

    dataCoord.compaction.levelzero.forceTrigger.maxSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum dalam byte untuk memaksa memicu Pemadatan LevelNol, standarnya 64MB 67108864
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah minimum file deltalog yang dipaksa untuk memicu Pemadatan LevelNol 10
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum file deltalog yang dipaksa untuk memicu Pemadatan LevelNol, nilai defaultnya adalah 30 30
    +

    dataCoord.syncSegmentsInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval waktu untuk menyinkronkan segmen secara teratur 300
    +

    dataCoord.enableGarbageCollection

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengalihkan nilai untuk mengontrol apakah akan mengaktifkan pengumpulan sampah untuk menghapus data yang dibuang dalam layanan MinIO atau S3. true
    +

    dataCoord.gc.interval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval di mana koordinat data melakukan pengumpulan sampah, unit: detik. 3600
    +

    dataCoord.gc.missingTolerance

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Durasi penyimpanan file log biner (binlog) yang tidak direkam. Menetapkan nilai yang cukup besar untuk parameter ini untuk menghindari kesalahan menghapus file binlog yang baru dibuat yang tidak memiliki metadata. Satuan: detik. 86400
    +

    dataCoord.gc.dropTolerance

    + + + + + + + + + + + + +
    DeskripsiNilai default
    Durasi penyimpanan file binlog dari segmen yang dihapus sebelum dihapus, satuan: detik. 10800
    +

    dataCoord.gc.removeConcurrent

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah goroutine bersamaan untuk menghapus objek s3 yang terjatuh 32
    +

    dataCoord.gc.scanInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    file yatim (file di oss tetapi belum terdaftar di meta) pada penyimpanan objek interval pemindaian pengumpulan sampah dalam jam 168
    +

    dataCoord.brokerTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    5000ms, batas waktu rpc broker dataCoord 5000
    +

    dataCoord.autoBalance

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Aktifkan saldo otomatis benar
    +

    dataCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval pemeriksaan konfigurasi saldo otomatis 10
    +

    dataCoord.import.filesPerPreImportTask

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum file yang diizinkan per tugas pra-impor. 2
    +

    dataCoord.import.taskRetention

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Periode retensi dalam detik untuk tugas dalam status Selesai atau Gagal. 10800
    +

    dataCoord.import.maxSizeInMBPerImportTask

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Untuk mencegah pembuatan segmen kecil, kami akan mengelompokkan ulang file yang diimpor. Parameter ini mewakili jumlah ukuran file di setiap grup (setiap ImportTask). 6144
    +

    dataCoord.import.scheduleInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval untuk penjadwalan impor, diukur dalam detik. 2
    +

    dataCoord.import.checkIntervalHigh

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval untuk memeriksa impor, diukur dalam detik, diatur ke frekuensi tinggi untuk pemeriksa impor. 2
    +

    dataCoord.import.checkIntervalLow

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval untuk memeriksa impor, diukur dalam detik, diatur ke frekuensi rendah untuk pemeriksa impor. 120
    +

    dataCoord.import.maxImportFileNumPerReq

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum file yang diizinkan per satu permintaan impor. 1024
    +

    dataCoord.import.waitForIndex

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Menunjukkan apakah operasi impor menunggu selesainya pembuatan indeks. true
    +

    dataCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. paksa menghentikan simpul tanpa penghentian yang anggun 5
    +

    dataCoord.slot.clusteringCompactionUsage

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    penggunaan slot pekerjaan pemadatan pengelompokan. 16
    +

    dataCoord.slot.mixCompactionUsage

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    penggunaan slot pekerjaan pemadatan campuran. 8
    +

    dataCoord.slot.l0DeleteCompactionUsage

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    penggunaan slot pekerjaan pemadatan l0. 8
    +

    dataCoord.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari dataCoord. Jika tidak ditentukan, gunakan alamat pertama yang dapat disiarkan
    +

    dataCoord.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari dataCoord 13333
    +

    dataCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh dataCoord, satuan: byte 536870912
    +

    dataCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh dataCoord, satuan: byte 268435456
    +

    dataCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien di dataCoord, satuan: byte 268435456
    +

    dataCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di dataCoord, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.json b/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.json new file mode 100644 index 000000000..e497dead1 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataNode-related Configurations","anchorList":[{"label":"Konfigurasi terkait dataNode","href":"dataNode-related-Configurations","type":1,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxQueueLength","href":"dataNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxParallelism","href":"dataNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"dataNode.dataSync.maxParallelSyncMgrTasks","href":"dataNodedataSyncmaxParallelSyncMgrTasks","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.enable","href":"dataNodedataSyncskipModeenable","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.skipNum","href":"dataNodedataSyncskipModeskipNum","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.coldTime","href":"dataNodedataSyncskipModecoldTime","type":2,"isActive":false},{"label":"dataNode.segment.insertBufSize","href":"dataNodesegmentinsertBufSize","type":2,"isActive":false},{"label":"dataNode.segment.deleteBufBytes","href":"dataNodesegmentdeleteBufBytes","type":2,"isActive":false},{"label":"dataNode.segment.syncPeriod","href":"dataNodesegmentsyncPeriod","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncEnable","href":"dataNodememoryforceSyncEnable","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncSegmentNum","href":"dataNodememoryforceSyncSegmentNum","type":2,"isActive":false},{"label":"dataNode.memory.checkInterval","href":"dataNodememorycheckInterval","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncWatermark","href":"dataNodememoryforceSyncWatermark","type":2,"isActive":false},{"label":"dataNode.channel.workPoolSize","href":"dataNodechannelworkPoolSize","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointMaxParallel","href":"dataNodechannelupdateChannelCheckpointMaxParallel","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointInterval","href":"dataNodechannelupdateChannelCheckpointInterval","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointRPCTimeout","href":"dataNodechannelupdateChannelCheckpointRPCTimeout","type":2,"isActive":false},{"label":"dataNode.channel.maxChannelCheckpointsPerPRC","href":"dataNodechannelmaxChannelCheckpointsPerPRC","type":2,"isActive":false},{"label":"dataNode.channel.channelCheckpointUpdateTickInSeconds","href":"dataNodechannelchannelCheckpointUpdateTickInSeconds","type":2,"isActive":false},{"label":"dataNode.import.maxConcurrentTaskNum","href":"dataNodeimportmaxConcurrentTaskNum","type":2,"isActive":false},{"label":"dataNode.import.maxImportFileSizeInGB","href":"dataNodeimportmaxImportFileSizeInGB","type":2,"isActive":false},{"label":"dataNode.import.readBufferSizeInMB","href":"dataNodeimportreadBufferSizeInMB","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroBatchMemoryRatio","href":"dataNodecompactionlevelZeroBatchMemoryRatio","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroMaxBatchSize","href":"dataNodecompactionlevelZeroMaxBatchSize","type":2,"isActive":false},{"label":"dataNode.gracefulStopTimeout","href":"dataNodegracefulStopTimeout","type":2,"isActive":false},{"label":"dataNode.slot.slotCap","href":"dataNodeslotslotCap","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.memoryBufferRatio","href":"dataNodeclusteringCompactionmemoryBufferRatio","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.workPoolSize","href":"dataNodeclusteringCompactionworkPoolSize","type":2,"isActive":false},{"label":"dataNode.ip","href":"dataNodeip","type":2,"isActive":false},{"label":"dataNode.port","href":"dataNodeport","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxSendSize","href":"dataNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxRecvSize","href":"dataNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxSendSize","href":"dataNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxRecvSize","href":"dataNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.md b/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.md new file mode 100644 index 000000000..595f59d20 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_datanode.md @@ -0,0 +1,1015 @@ +--- +id: configure_datanode.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi dataNode untuk Milvus. +--- +

    Konfigurasi terkait dataNode

    dataNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Panjang maksimum antrean tugas dalam diagram alir 16
    +

    dataNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum tugas yang dieksekusi secara paralel dalam diagram alir 1024
    +

    dataNode.dataSync.maxParallelSyncMgrTasks

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah tugas sinkronisasi serentak maksimum dari mgr sinkronisasi datanode secara global 256
    +

    dataNode.dataSync.skipMode.enable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mendukung melewatkan beberapa pesan tanda waktu untuk mengurangi penggunaan CPU benar
    +

    dataNode.dataSync.skipMode.skipNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Konsumsi satu untuk setiap n catatan yang dilewati 4
    +

    dataNode.dataSync.skipMode.coldTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Aktifkan mode lewati setelah hanya ada msg tanda waktu selama x detik 60
    +

    dataNode.segment.insertBufSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Ukuran maksimum setiap file binlog dalam segmen yang disangga dalam memori. File binlog yang ukurannya melebihi nilai ini akan dibuang ke layanan MinIO atau S3.
  • +
  • Satuan Byte
  • +
  • Mengatur parameter ini terlalu kecil menyebabkan sistem terlalu sering menyimpan data dalam jumlah kecil. Mengaturnya terlalu besar akan meningkatkan permintaan memori sistem.
  • 16777216
    +

    dataNode.segment.deleteBufBytes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran buffer maksimum dalam byte untuk melakukan flush del untuk satu saluran, defaultnya adalah 16MB 16777216
    +

    dataNode.segment.syncPeriod

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Periode untuk menyinkronkan segmen jika buffer tidak kosong. 600
    +

    dataNode.memory.forceSyncEnable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Tetapkan true untuk memaksa sinkronisasi jika penggunaan memori terlalu tinggi true
    +

    dataNode.memory.forceSyncSegmentNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah segmen yang akan disinkronkan, segmen dengan buffer terbesar akan disinkronkan. 1
    +

    dataNode.memory.checkInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interal untuk memeriksa penggunaan memori datanode, dalam milidetik 3000
    +

    dataNode.memory.forceSyncWatermark

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    tanda air memori untuk mandiri, setelah mencapai tanda air ini, segmen akan disinkronkan. 0.5
    +

    dataNode.channel.workPoolSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • tentukan ukuran kumpulan kerja global dari semua saluran
  • +
  • jika parameter ini <= 0, akan menetapkannya sebagai jumlah maksimum CPU yang dapat dieksekusi
  • +
  • menyarankan untuk mengaturnya lebih besar pada jumlah koleksi yang besar untuk menghindari pemblokiran
  • -1
    +

    dataNode.channel.updateChannelCheckpointMaxParallel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • tentukan ukuran kumpulan kerja global untuk pembaruan pos pemeriksaan saluran
  • +
  • jika parameter ini <= 0, akan menetapkannya sebagai 10
  • 10
    +

    dataNode.channel.updateChannelCheckpointInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi interval (dalam detik) untuk datanode untuk memperbarui pos pemeriksaan saluran dari setiap saluran 60
    +

    dataNode.channel.updateChannelCheckpointRPCTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu dalam detik untuk panggilan RPC UpdateChannelCheckpoint 20
    +

    dataNode.channel.maxChannelCheckpointsPerPRC

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum titik pemeriksaan saluran per RPC UpdateChannelCheckpoint. 128
    +

    dataNode.channel.channelCheckpointUpdateTickInSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Frekuensi, dalam detik, di mana pemutakhiran pos pemeriksaan saluran mengeksekusi pembaruan. 10
    +

    dataNode.import.maxConcurrentTaskNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum tugas impor/pra-impor yang diizinkan untuk dijalankan secara bersamaan pada datanode. 16
    +

    dataNode.import.maxImportFileSizeInGB

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran file maksimum (dalam GB) untuk file impor, di mana file impor mengacu pada file Berbasis Baris atau sekumpulan file Berbasis Kolom. 16
    +

    dataNode.import.readBufferSizeInMB

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran blok data (dalam MB) yang dibaca dari manajer chunk oleh datanode selama impor. 16
    +

    dataNode.compaction.levelZeroBatchMemoryRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Rasio memori minimal dari memori bebas untuk pemadatan level nol yang dijalankan dalam mode batch 0.05
    +

    dataNode.compaction.levelZeroMaxBatchSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran batch maksimum mengacu pada jumlah maksimum segmen L1/L2 dalam batch saat menjalankan pemadatan L0. Default ke -1, nilai apa pun yang kurang dari 1 berarti tidak ada batas. Rentang yang valid: >= 1. -1
    +

    dataNode.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. simpul berhenti paksa tanpa penghentian yang anggun 1800
    +

    dataNode.slot.slotCap

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum tugas (mis. pemadatan, pengimporan) yang diizinkan untuk berjalan secara bersamaan pada sebuah datanode 16
    +

    dataNode.clusteringCompaction.memoryBufferRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Rasio buffer memori untuk pemadatan pengelompokan. Data yang lebih besar dari ambang batas akan dibuang ke penyimpanan. 0.1
    +

    dataNode.clusteringCompaction.workPoolSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran kumpulan pekerja untuk satu pekerjaan pemadatan pengelompokan. 8
    +

    dataNode.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari dataNode. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    dataNode.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari dataNode 21124
    +

    dataNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh dataNode, satuan: byte 536870912
    +

    dataNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh dataNode, satuan: byte 268435456
    +

    dataNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien pada dataNode, satuan: byte 268435456
    +

    dataNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di dataNode, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.json b/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.json new file mode 100644 index 000000000..75fcb6bfc --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"etcd-related Configurations","anchorList":[{"label":"Konfigurasi terkait etcd","href":"etcd-related-Configurations","type":1,"isActive":false},{"label":"etcd.endpoints","href":"etcdendpoints","type":2,"isActive":false},{"label":"etcd.rootPath","href":"etcdrootPath","type":2,"isActive":false},{"label":"etcd.metaSubPath","href":"etcdmetaSubPath","type":2,"isActive":false},{"label":"etcd.kvSubPath","href":"etcdkvSubPath","type":2,"isActive":false},{"label":"etcd.log.level","href":"etcdloglevel","type":2,"isActive":false},{"label":"etcd.log.path","href":"etcdlogpath","type":2,"isActive":false},{"label":"etcd.ssl.enabled","href":"etcdsslenabled","type":2,"isActive":false},{"label":"etcd.ssl.tlsCert","href":"etcdssltlsCert","type":2,"isActive":false},{"label":"etcd.ssl.tlsKey","href":"etcdssltlsKey","type":2,"isActive":false},{"label":"etcd.ssl.tlsCACert","href":"etcdssltlsCACert","type":2,"isActive":false},{"label":"etcd.ssl.tlsMinVersion","href":"etcdssltlsMinVersion","type":2,"isActive":false},{"label":"etcd.requestTimeout","href":"etcdrequestTimeout","type":2,"isActive":false},{"label":"etcd.use.embed","href":"etcduseembed","type":2,"isActive":false},{"label":"etcd.data.dir","href":"etcddatadir","type":2,"isActive":false},{"label":"etcd.auth.enabled","href":"etcdauthenabled","type":2,"isActive":false},{"label":"etcd.auth.userName","href":"etcdauthuserName","type":2,"isActive":false},{"label":"etcd.auth.password","href":"etcdauthpassword","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.md b/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.md new file mode 100644 index 000000000..e74c93236 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_etcd.md @@ -0,0 +1,538 @@ +--- +id: configure_etcd.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengkonfigurasi etcd untuk Milvus. +--- +

    Konfigurasi terkait etcd

    Konfigurasi terkait etcd, digunakan untuk menyimpan metadata Milvus & penemuan layanan.

    +

    etcd.endpoints

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Titik akhir yang digunakan untuk mengakses layanan etcd. Anda dapat mengubah parameter ini sebagai titik akhir dari klaster etcd Anda sendiri.
  • +
  • Variabel lingkungan: ETCD_ENDPOINTS
  • +
  • etcd secara istimewa mendapatkan alamat yang valid dari variabel lingkungan ETCD_ENDPOINTS saat Milvus dimulai.
  • localhost: 2379
    +

    etcd.rootPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan root dari kunci tempat Milvus menyimpan data dalam etcd.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • +
  • Untuk membagi sebuah instance etcd di antara beberapa instans Milvus, pertimbangkan untuk mengubahnya ke nilai yang berbeda untuk setiap instans Milvus sebelum Anda menjalankannya.
  • +
  • Tetapkan jalur root yang mudah diidentifikasi untuk Milvus jika layanan etcd sudah ada.
  • +
  • Mengubah ini untuk instans Milvus yang sudah berjalan dapat mengakibatkan kegagalan membaca data lama.
  • by-dev
    +

    etcd.metaSubPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Sub-awalan dari kunci tempat Milvus menyimpan informasi terkait metadata di etcd.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus selama beberapa waktu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • meta
    +

    etcd.kvSubPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Sub-awalan dari kunci di mana Milvus menyimpan stempel waktu di etcd.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Disarankan untuk tidak mengubah parameter ini jika tidak ada alasan khusus.
  • kv
    +

    etcd.log.level

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Hanya mendukung debug, info, peringatan, error, panik, atau fatal. Nilai default adalah 'info'. info
    +

    etcd.log.path

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • path adalah salah satu dari:
  • +
  • - "default" sebagai os.Stderr,
  • +
  • - "stderr" sebagai os.Stderr,
  • +
  • - "stdout" sebagai os.Stdout,
  • +
  • - jalur file untuk menambahkan log server.
  • +
  • harap sesuaikan di Milvus yang disematkan: /tmp/milvus/logs/etcd.log
  • stdout
    +

    etcd.ssl.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mendukung mode koneksi aman ETCD false
    +

    etcd.ssl.tlsCert

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file sertifikat Anda /path/to/etcd-client.pem
    +

    etcd.ssl.tlsKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke berkas kunci Anda /path/to/etcd-client-key.pem
    +

    etcd.ssl.tlsCACert

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file CACert Anda /path/to/ca.pem
    +

    etcd.ssl.tlsMinVersion

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Versi minimum TLS
  • +
  • Nilai opsional: 1.0, 1.1, 1.2, 1.3。
  • +
  • Kami menyarankan untuk menggunakan versi 1.2 ke atas.
  • 1.3
    +

    etcd.requestTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Batas waktu operasi etcd dalam milidetik 10000
    +

    etcd.use.embed

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan Etcd tertanam (EtcdServer yang sedang diproses). false
    +

    etcd.data.dir

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Hanya Etcd yang disematkan. harap sesuaikan di Milvus yang disematkan: /tmp/milvus/etcdData/ default.etcd
    +

    etcd.auth.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan autentikasi false
    +

    etcd.auth.userName

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nama pengguna untuk autentikasi etcd
    +

    etcd.auth.password

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kata sandi untuk autentikasi etcd
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.json b/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.json new file mode 100644 index 000000000..53c9c347e --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"gpu-related Configurations","anchorList":[{"label":"Konfigurasi terkait GPU","href":"gpu-related-Configurations","type":1,"isActive":false},{"label":"gpu.initMemSize","href":"gpuinitMemSize","type":2,"isActive":false},{"label":"gpu.maxMemSize","href":"gpumaxMemSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.md b/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.md new file mode 100644 index 000000000..4c8f4b544 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_gpu.md @@ -0,0 +1,85 @@ +--- +id: configure_gpu.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi gpu untuk Milvus. +--- +

    Konfigurasi terkait GPU

    #Saat menggunakan pengindeksan GPU, Milvus akan menggunakan sebuah pool memori untuk menghindari alokasi dan deallokasi memori yang sering terjadi.

    +

    #Di sini, Anda dapat mengatur ukuran memori yang ditempati oleh pool memori, dengan satuan MB.

    +

    #Perhatikan bahwa ada kemungkinan Milvus mengalami crash ketika permintaan memori aktual melebihi nilai yang ditetapkan oleh maxMemSize.

    +

    #Jika initMemSize dan MaxMemSize keduanya bernilai nol,

    +

    #milvus akan secara otomatis menginisialisasi setengah dari memori GPU yang tersedia,

    +

    #maxMemSize akan menginisialisasi seluruh memori GPU yang tersedia.

    +

    gpu.initMemSize

    + + + + + + + + + + + + +
    KeteranganNilai Default
    Ukuran inisialisasi Pool Memori Gpu
    +

    gpu.maxMemSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum Kumpulan Memori Gpu
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.json b/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.json new file mode 100644 index 000000000..3dad5a589 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"grpc-related Configurations","anchorList":[{"label":"Konfigurasi terkait grpc","href":"grpc-related-Configurations","type":1,"isActive":false},{"label":"grpc.gracefulStopTimeout","href":"grpcgracefulStopTimeout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.md b/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.md new file mode 100644 index 000000000..7eac9d43a --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_grpc.md @@ -0,0 +1,50 @@ +--- +id: configure_grpc.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi grpc untuk Milvus. +--- +

    Konfigurasi terkait grpc

    grpc.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik, waktu untuk menunggu waktu berhenti dengan anggun 10
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.json b/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.json new file mode 100644 index 000000000..96890425b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexCoord-related Configurations","anchorList":[{"label":"Konfigurasi terkait indexCoord","href":"indexCoord-related-Configurations","type":1,"isActive":false},{"label":"indexCoord.segment.minSegmentNumRowsToEnableIndex","href":"indexCoordsegmentminSegmentNumRowsToEnableIndex","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.md b/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.md new file mode 100644 index 000000000..605cfc3bf --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_indexcoord.md @@ -0,0 +1,50 @@ +--- +id: configure_indexcoord.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi indexCoord untuk Milvus. +--- +

    Konfigurasi terkait indexCoord

    indexCoord.segment.minSegmentNumRowsToEnableIndex

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ini adalah ambang batas. Ketika baris num segmen kurang dari nilai ini, segmen tidak akan diindeks 1024
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.json b/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.json new file mode 100644 index 000000000..6b3316641 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexNode-related Configurations","anchorList":[{"label":"Konfigurasi terkait indexNode","href":"indexNode-related-Configurations","type":1,"isActive":false},{"label":"indexNode.enableDisk","href":"indexNodeenableDisk","type":2,"isActive":false},{"label":"indexNode.ip","href":"indexNodeip","type":2,"isActive":false},{"label":"indexNode.port","href":"indexNodeport","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxSendSize","href":"indexNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxRecvSize","href":"indexNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxSendSize","href":"indexNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxRecvSize","href":"indexNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.md b/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.md new file mode 100644 index 000000000..9c06b4b34 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_indexnode.md @@ -0,0 +1,224 @@ +--- +id: configure_indexnode.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi indexNode untuk Milvus. +--- +

    Konfigurasi terkait indexNode

    indexNode.enableDisk

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    aktifkan indeks node membangun indeks vektor disk true
    +

    indexNode.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari indexNode. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    indexNode.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari indexNode 21121
    +

    indexNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh indexNode, satuan: byte 536870912
    +

    indexNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh indexNode, satuan: byte 268435456
    +

    indexNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien di indexNode, satuan: byte 268435456
    +

    indexNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di indexNode, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.json b/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.json new file mode 100644 index 000000000..134d6bd0c --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"localStorage-related Configurations","anchorList":[{"label":"Konfigurasi yang terkait dengan localStorage","href":"localStorage-related-Configurations","type":1,"isActive":false},{"label":"localStorage.path","href":"localStoragepath","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.md b/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.md new file mode 100644 index 000000000..bf7f5dc9d --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_localstorage.md @@ -0,0 +1,53 @@ +--- +id: configure_localstorage.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi localStorage untuk Milvus. +--- +

    Konfigurasi yang terkait dengan localStorage

    localStorage.path

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jalur lokal ke tempat penyimpanan data vektor selama pencarian atau kueri untuk menghindari akses berulang ke layanan MinIO atau S3.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Disarankan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • /var/lib/milvus/data/
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_log.json b/localization/v2.5.x/site/id/reference/sys_config/configure_log.json new file mode 100644 index 000000000..e01627be6 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_log.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"log-related Configurations","anchorList":[{"label":"Konfigurasi terkait log","href":"log-related-Configurations","type":1,"isActive":false},{"label":"log.level","href":"loglevel","type":2,"isActive":false},{"label":"log.file.rootPath","href":"logfilerootPath","type":2,"isActive":false},{"label":"log.file.maxSize","href":"logfilemaxSize","type":2,"isActive":false},{"label":"log.file.maxAge","href":"logfilemaxAge","type":2,"isActive":false},{"label":"log.file.maxBackups","href":"logfilemaxBackups","type":2,"isActive":false},{"label":"log.format","href":"logformat","type":2,"isActive":false},{"label":"log.stdout","href":"logstdout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_log.md b/localization/v2.5.x/site/id/reference/sys_config/configure_log.md new file mode 100644 index 000000000..3d4c23d39 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_log.md @@ -0,0 +1,231 @@ +--- +id: configure_log.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi log untuk Milvus. +--- +

    Konfigurasi terkait log

    Mengkonfigurasi output log sistem.

    +

    log.level

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Tingkat log Milvus. Opsi: debug, info, peringatan, kesalahan, panik, dan fatal.
  • +
  • Disarankan untuk menggunakan level debug di lingkungan pengujian dan pengembangan, dan level info di lingkungan produksi.
  • info
    +

    log.file.rootPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jalur root ke file log.
  • +
  • Nilai default diatur kosong, yang mengindikasikan untuk mengeluarkan file log ke output standar (stdout) dan kesalahan standar (stderr).
  • +
  • Jika parameter ini diatur ke jalur lokal yang valid, Milvus akan menulis dan menyimpan file log pada jalur ini.
  • +
  • Atur parameter ini sebagai jalur yang Anda memiliki izin untuk menulis.
  • +

    log.file.maxSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum file log, satuan: MB. 300
    +

    log.file.maxAge

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Waktu penyimpanan maksimum sebelum file log dihapus secara otomatis, satuan: hari. Nilai minimumnya adalah 1. 10
    +

    log.file.maxBackups

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum file log yang akan dicadangkan, satuan: hari. Nilai minimumnya adalah 1. 20
    +

    log.format

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Format log Milvus. Opsi: teks dan JSON teks
    +

    log.stdout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Stdout diaktifkan atau tidak benar
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.json b/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.json new file mode 100644 index 000000000..cd4418090 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"metastore-related Configurations","anchorList":[{"label":"Konfigurasi terkait metastore","href":"metastore-related-Configurations","type":1,"isActive":false},{"label":"metastore.type","href":"metastoretype","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.md b/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.md new file mode 100644 index 000000000..d315eb350 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_metastore.md @@ -0,0 +1,50 @@ +--- +id: configure_metastore.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi metastore untuk Milvus. +--- +

    Konfigurasi terkait metastore

    metastore.type

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nilai default: etcd, Nilai yang valid: [etcd, tikv] etcd
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_minio.json b/localization/v2.5.x/site/id/reference/sys_config/configure_minio.json new file mode 100644 index 000000000..6c70330a5 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_minio.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"minio-related Configurations","anchorList":[{"label":"Konfigurasi terkait Minio","href":"minio-related-Configurations","type":1,"isActive":false},{"label":"minio.address","href":"minioaddress","type":2,"isActive":false},{"label":"minio.port","href":"minioport","type":2,"isActive":false},{"label":"minio.accessKeyID","href":"minioaccessKeyID","type":2,"isActive":false},{"label":"minio.secretAccessKey","href":"miniosecretAccessKey","type":2,"isActive":false},{"label":"minio.useSSL","href":"miniouseSSL","type":2,"isActive":false},{"label":"minio.ssl.tlsCACert","href":"miniossltlsCACert","type":2,"isActive":false},{"label":"minio.bucketName","href":"miniobucketName","type":2,"isActive":false},{"label":"minio.rootPath","href":"miniorootPath","type":2,"isActive":false},{"label":"minio.useIAM","href":"miniouseIAM","type":2,"isActive":false},{"label":"minio.cloudProvider","href":"miniocloudProvider","type":2,"isActive":false},{"label":"minio.iamEndpoint","href":"minioiamEndpoint","type":2,"isActive":false},{"label":"minio.logLevel","href":"miniologLevel","type":2,"isActive":false},{"label":"minio.region","href":"minioregion","type":2,"isActive":false},{"label":"minio.useVirtualHost","href":"miniouseVirtualHost","type":2,"isActive":false},{"label":"minio.requestTimeoutMs","href":"miniorequestTimeoutMs","type":2,"isActive":false},{"label":"minio.listObjectsMaxKeys","href":"miniolistObjectsMaxKeys","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_minio.md b/localization/v2.5.x/site/id/reference/sys_config/configure_minio.md new file mode 100644 index 000000000..890f50239 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_minio.md @@ -0,0 +1,528 @@ +--- +id: configure_minio.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi minio untuk Milvus. +--- +

    Konfigurasi terkait Minio

    Konfigurasi terkait MinIO/S3/GCS atau layanan lainnya mendukung API S3, yang bertanggung jawab atas persistensi data untuk Milvus.

    +

    Kami menyebut layanan penyimpanan sebagai MinIO/S3 dalam deskripsi berikut ini untuk mempermudah.

    +

    minio.address

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Alamat IP layanan MinIO atau S3.
  • +
  • Variabel lingkungan: MINIO_ADDRESS
  • +
  • minio.address dan minio.port bersama-sama menghasilkan akses yang valid ke layanan MinIO atau S3.
  • +
  • MinIO secara khusus memperoleh alamat IP yang valid dari variabel lingkungan MINIO_ADDRESS ketika Milvus dimulai.
  • +
  • Nilai default berlaku ketika MinIO atau S3 berjalan pada jaringan yang sama dengan Milvus.
  • localhost
    +

    minio.port

    + + + + + + + + + + + + +
    DeskripsiNilai default
    Port layanan MinIO atau S3. 9000
    +

    minio.accessKeyID

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • ID kunci akses yang dikeluarkan MinIO atau S3 kepada pengguna untuk akses resmi.
  • +
  • Variabel lingkungan: MINIO_ACCESS_KEY_ID atau minio.accessKeyID
  • +
  • minio.accessKeyID dan minio.secretAccessKey bersama-sama digunakan untuk otentikasi identitas untuk mengakses layanan MinIO atau S3.
  • +
  • Konfigurasi ini harus diatur identik dengan variabel lingkungan MINIO_ACCESS_KEY_ID, yang diperlukan untuk memulai MinIO atau S3.
  • +
  • Nilai default berlaku untuk layanan MinIO atau S3 yang dimulai dengan file docker-compose.yml default.
  • minioadmin
    +

    minio.secretAccessKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Kunci rahasia yang digunakan untuk mengenkripsi string tanda tangan dan memverifikasi string tanda tangan pada server. Kunci ini harus dijaga kerahasiaannya dan hanya dapat diakses oleh server MinIO atau S3 dan pengguna.
  • +
  • Variabel lingkungan: MINIO_SECRET_ACCESS_KEY atau minio.secretAccessKey
  • +
  • minio.accessKeyID dan minio.secretAccessKey bersama-sama digunakan untuk otentikasi identitas untuk mengakses layanan MinIO atau S3.
  • +
  • Konfigurasi ini harus diatur identik dengan variabel lingkungan MINIO_SECRET_ACCESS_KEY, yang diperlukan untuk memulai MinIO atau S3.
  • +
  • Nilai default berlaku untuk layanan MinIO atau S3 yang dimulai dengan file docker-compose.yml default.
  • minioadmin
    +

    minio.useSSL

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nilai sakelar untuk mengontrol apakah akan mengakses layanan MinIO atau S3 melalui SSL. false
    +

    minio.ssl.tlsCACert

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file CACert Anda /path/to/public.crt
    +

    minio.bucketName

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Nama bucket tempat Milvus menyimpan data dalam MinIO atau S3.
  • +
  • Milvus 2.0.0 tidak mendukung penyimpanan data dalam beberapa bucket.
  • +
  • Bucket dengan nama ini akan dibuat jika belum ada. Jika bucket sudah ada dan dapat diakses, maka akan digunakan secara langsung. Jika tidak, akan ada kesalahan.
  • +
  • Untuk berbagi instance MinIO di antara beberapa instance Milvus, pertimbangkan untuk mengubahnya ke nilai yang berbeda untuk setiap instance Milvus sebelum Anda memulainya. Untuk detailnya, lihat Pertanyaan Umum Operasi.
  • +
  • Data akan disimpan di Docker lokal jika Docker digunakan untuk memulai layanan MinIO secara lokal. Pastikan ruang penyimpanannya memadai.
  • +
  • Nama bucket bersifat unik secara global dalam satu instans MinIO atau S3.
  • a-bucket
    +

    minio.rootPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan root dari kunci tempat Milvus menyimpan data dalam MinIO atau S3.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • +
  • Untuk berbagi instance MinIO di antara beberapa instance Milvus, pertimbangkan untuk mengubahnya ke nilai yang berbeda untuk setiap instance Milvus sebelum Anda memulainya. Untuk detailnya, lihat Pertanyaan Umum Operasi.
  • +
  • Tetapkan awalan kunci root yang mudah diidentifikasi untuk Milvus jika layanan etcd sudah ada.
  • +
  • Mengubah ini untuk instans Milvus yang sudah berjalan dapat mengakibatkan kegagalan membaca data lama.
  • file
    +

    minio.useIAM

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Apakah akan menggunakan peran IAM untuk mengakses S3/GCS alih-alih kunci akses/rahasia
  • +
  • Untuk informasi lebih lanjut, lihat
  • +
  • aws: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
  • +
  • gcp: https://cloud.google.com/storage/docs/access-control/iam
  • +
  • aliyun (ack): https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-rrsa-to-enforce-access-control
  • +
  • aliyun (ecs): https://www.alibabacloud.com/help/en/elastic-compute-service/latest/attach-an-instance-ram-role
  • salah
    +

    minio.cloudProvider

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Penyedia Cloud dari S3. Mendukung "aws", "gcp", "aliyun".
  • +
  • Anda dapat menggunakan "aws" untuk penyedia cloud lain yang mendukung API S3 dengan signature v4, misalnya: minio
  • +
  • Anda dapat menggunakan "gcp" untuk penyedia cloud lain yang mendukung API S3 dengan signature v2
  • +
  • Anda dapat menggunakan "aliyun" untuk penyedia cloud lain yang menggunakan virtual host style bucket
  • +
  • Saat useIAM diaktifkan, hanya "aws", "gcp", "aliyun" yang didukung untuk saat ini
  • aws
    +

    minio.iamEndpoint

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Titik akhir khusus untuk mengambil kredensial peran IAM. ketika useIAM benar & cloudProvider adalah "aws".
  • +
  • Biarkan kosong jika Anda ingin menggunakan endpoint default AWS
  • +

    minio.logLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Level log untuk log sdk aws. Level yang didukung: off, fatal, error, error, warn, info, debug, trace fatal
    +

    minio.region

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Tentukan wilayah lokasi sistem penyimpanan minio
    +

    minio.useVirtualHost

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah menggunakan mode host virtual untuk bucket salah
    +

    minio.requestTimeoutMs

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu minio untuk waktu permintaan dalam milidetik 10000
    +

    minio.listObjectsMaxKeys

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum objek yang diminta per batch dalam minio ListObjects rpc,
  • +
  • 0 berarti menggunakan klien oss secara default, kurangi konfigurasinya jika ListObjects timeout
  • 0
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_mq.json b/localization/v2.5.x/site/id/reference/sys_config/configure_mq.json new file mode 100644 index 000000000..f0ebe1dba --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_mq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"mq-related Configurations","anchorList":[{"label":"Konfigurasi yang berhubungan dengan MQ","href":"mq-related-Configurations","type":1,"isActive":false},{"label":"mq.type","href":"mqtype","type":2,"isActive":false},{"label":"mq.enablePursuitMode","href":"mqenablePursuitMode","type":2,"isActive":false},{"label":"mq.pursuitLag","href":"mqpursuitLag","type":2,"isActive":false},{"label":"mq.pursuitBufferSize","href":"mqpursuitBufferSize","type":2,"isActive":false},{"label":"mq.mqBufSize","href":"mqmqBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.mergeCheckInterval","href":"mqdispatchermergeCheckInterval","type":2,"isActive":false},{"label":"mq.dispatcher.targetBufSize","href":"mqdispatchertargetBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.maxTolerantLag","href":"mqdispatchermaxTolerantLag","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_mq.md b/localization/v2.5.x/site/id/reference/sys_config/configure_mq.md new file mode 100644 index 000000000..6be8d7402 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_mq.md @@ -0,0 +1,262 @@ +--- +id: configure_mq.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi mq untuk Milvus. +--- +

    Konfigurasi yang berhubungan dengan MQ

    Milvus mendukung empat MQ: rocksmq (berdasarkan RockDB), natsmq (embedded nats-server), Pulsar, dan Kafka.

    +

    Anda dapat mengubah mq Anda dengan mengatur bidang mq.type.

    +

    Jika Anda tidak mengatur bidang mq.type sebagai default, ada catatan tentang mengaktifkan prioritas jika kita mengkonfigurasi beberapa mq dalam berkas ini.

    +
      +
    1. mode standalone (lokal): rocksmq (default) > natsmq > Pulsar > Kafka

    2. +
    3. mode cluster: Pulsar(default) > Kafka (rocksmq dan natsmq tidak didukung dalam mode cluster)

    4. +
    +

    mq.type

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Nilai default: "default"
  • +
  • Nilai yang valid: [default, pulsar, kafka, rocksmq, natsmq]
  • default
    +

    mq.enablePursuitMode

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nilai default: "true" benar
    +

    mq.pursuitLag

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ambang batas jeda waktu detak untuk masuk ke mode pengejaran, dalam detik 10
    +

    mq.pursuitBufferSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran buffer mode pengejaran dalam byte 8388608
    +

    mq.mqBufSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Panjang buffer konsumen klien MQ 16
    +

    mq.dispatcher.mergeCheckInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    waktu interval (dalam detik) bagi operator untuk memeriksa apakah akan menggabungkan 1
    +

    mq.dispatcher.targetBufSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    pinjaman buffer saluran untuk target 16
    +

    mq.dispatcher.maxTolerantLag

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Nilai default: "3", batas waktu (dalam detik) yang digunakan target untuk mengirim msgPack 3
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.json b/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.json new file mode 100644 index 000000000..85b7bfa1d --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"msgChannel-related Configurations","anchorList":[{"label":"Konfigurasi yang berhubungan dengan msgChannel","href":"msgChannel-related-Configurations","type":1,"isActive":false},{"label":"msgChannel.chanNamePrefix.cluster","href":"msgChannelchanNamePrefixcluster","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordTimeTick","href":"msgChannelchanNamePrefixrootCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordStatistics","href":"msgChannelchanNamePrefixrootCoordStatistics","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordDml","href":"msgChannelchanNamePrefixrootCoordDml","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.queryTimeTick","href":"msgChannelchanNamePrefixqueryTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordTimeTick","href":"msgChannelchanNamePrefixdataCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordSegmentInfo","href":"msgChannelchanNamePrefixdataCoordSegmentInfo","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataCoordSubNamePrefix","href":"msgChannelsubNamePrefixdataCoordSubNamePrefix","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataNodeSubNamePrefix","href":"msgChannelsubNamePrefixdataNodeSubNamePrefix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.md b/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.md new file mode 100644 index 000000000..a0776b16b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_msgchannel.md @@ -0,0 +1,316 @@ +--- +id: configure_msgchannel.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi msgChannel untuk Milvus. +--- +

    Konfigurasi yang berhubungan dengan msgChannel

    Topik ini memperkenalkan konfigurasi terkait saluran pesan pada Milvus.

    +

    msgChannel.chanNamePrefix.cluster

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan nama root dari saluran ketika saluran pesan dibuat.
  • +
  • Disarankan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • +
  • Untuk berbagi instans Pulsar di antara beberapa instans Milvus, pertimbangkan untuk mengubahnya menjadi sebuah nama, bukan nama default untuk setiap instans Milvus sebelum Anda memulainya.
  • by-dev
    +

    msgChannel.chanNamePrefix.rootCoordTimeTick

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana koordinat root mempublikasikan pesan time tick.
  • +
  • Awalan nama saluran yang lengkap adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordTimeTick}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • rootcoord-timetick
    +

    msgChannel.chanNamePrefix.rootCoordStatistics

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana root coord mempublikasikan pesan statistiknya sendiri.
  • +
  • Awalan nama saluran yang lengkap adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordStatistics}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • rootcoord-statistics
    +

    msgChannel.chanNamePrefix.rootCoordDml

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana root coord mempublikasikan pesan-pesan Data Manipulation Language (DML).
  • +
  • Awalan nama saluran yang lengkap adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordDml}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • rootcoord-dml
    +

    msgChannel.chanNamePrefix.queryTimeTick

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana simpul kueri menerbitkan pesan centang waktu.
  • +
  • Awalan nama saluran yang lengkap adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.queryTimeTick}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Disarankan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • queryTimeTick
    +

    msgChannel.chanNamePrefix.dataCoordTimeTick

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana koordinat data mempublikasikan pesan time tick.
  • +
  • Awalan nama saluran lengkapnya adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordTimeTick}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • datacoord-timetick-channel
    +

    msgChannel.chanNamePrefix.dataCoordSegmentInfo

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan sub-nama dari saluran pesan di mana koordin data menerbitkan pesan informasi segmen.
  • +
  • Awalan nama saluran lengkapnya adalah ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordSegmentInfo}
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • segment-info-channel
    +

    msgChannel.subNamePrefix.dataCoordSubNamePrefix

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan nama langganan dari koordinat data.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data yang lama.
  • +
  • Disarankan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • dataCoord
    +

    msgChannel.subNamePrefix.dataNodeSubNamePrefix

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan nama langganan dari simpul data.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Disarankan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • dataNode
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.json b/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.json new file mode 100644 index 000000000..ee1180c46 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"natsmq-related Configurations","anchorList":[{"label":"Konfigurasi terkait natsmq","href":"natsmq-related-Configurations","type":1,"isActive":false},{"label":"natsmq.server.port","href":"natsmqserverport","type":2,"isActive":false},{"label":"natsmq.server.storeDir","href":"natsmqserverstoreDir","type":2,"isActive":false},{"label":"natsmq.server.maxFileStore","href":"natsmqservermaxFileStore","type":2,"isActive":false},{"label":"natsmq.server.maxPayload","href":"natsmqservermaxPayload","type":2,"isActive":false},{"label":"natsmq.server.maxPending","href":"natsmqservermaxPending","type":2,"isActive":false},{"label":"natsmq.server.initializeTimeout","href":"natsmqserverinitializeTimeout","type":2,"isActive":false},{"label":"natsmq.server.monitor.trace","href":"natsmqservermonitortrace","type":2,"isActive":false},{"label":"natsmq.server.monitor.debug","href":"natsmqservermonitordebug","type":2,"isActive":false},{"label":"natsmq.server.monitor.logTime","href":"natsmqservermonitorlogTime","type":2,"isActive":false},{"label":"natsmq.server.monitor.logFile","href":"natsmqservermonitorlogFile","type":2,"isActive":false},{"label":"natsmq.server.monitor.logSizeLimit","href":"natsmqservermonitorlogSizeLimit","type":2,"isActive":false},{"label":"natsmq.server.retention.maxAge","href":"natsmqserverretentionmaxAge","type":2,"isActive":false},{"label":"natsmq.server.retention.maxBytes","href":"natsmqserverretentionmaxBytes","type":2,"isActive":false},{"label":"natsmq.server.retention.maxMsgs","href":"natsmqserverretentionmaxMsgs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.md b/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.md new file mode 100644 index 000000000..aaed7718e --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_natsmq.md @@ -0,0 +1,429 @@ +--- +id: configure_natsmq.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengkonfigurasi natsmq untuk Milvus. +--- +

    Konfigurasi terkait natsmq

    konfigurasi natsmq.

    +

    detail lebih lanjut: https://docs.nats.io/running-a-nats-service/configuration

    +

    natsmq.server.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port pendengaran dari server Nats. 4222
    +

    natsmq.server.storeDir

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Direktori yang digunakan untuk penyimpanan JetStream dari nats /var/lib/milvus/nats
    +

    natsmq.server.maxFileStore

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum penyimpanan 'file' 17179869184
    +

    natsmq.server.maxPayload

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum byte dalam muatan pesan 8388608
    +

    natsmq.server.maxPending

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum byte yang disangga untuk sebuah koneksi Berlaku untuk koneksi klien 67108864
    +

    natsmq.server.initializeTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    menunggu inisialisasi natsmq selesai 4000
    +

    natsmq.server.monitor.trace

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jika benar, aktifkan pesan log jejak protokol salah
    +

    natsmq.server.monitor.debug

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jika benar mengaktifkan pesan log debug salah
    +

    natsmq.server.monitor.logTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jika diatur ke false, log tanpa stempel waktu. true
    +

    natsmq.server.monitor.logFile

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jalur file log relatif terhadap .. dari biner milvus jika menggunakan jalur relatif /tmp/milvus/logs/nats.log
    +

    natsmq.server.monitor.logSizeLimit

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran dalam byte setelah file log bergulir ke yang baru 536870912
    +

    natsmq.server.retention.maxAge

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Usia maksimum dari setiap pesan di saluran-P 4320
    +

    natsmq.server.retention.maxBytes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Berapa banyak byte yang mungkin terkandung dalam saluran-P tunggal. Menghapus pesan terlama jika saluran-P melebihi ukuran ini
    +

    natsmq.server.retention.maxMsgs

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Berapa banyak pesan yang mungkin berisi saluran P tunggal. Menghapus pesan terlama jika saluran-P melebihi batas ini
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.json b/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.json new file mode 100644 index 000000000..d455f0083 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"proxy-related Configurations","anchorList":[{"label":"Konfigurasi terkait proxy","href":"proxy-related-Configurations","type":1,"isActive":false},{"label":"proxy.timeTickInterval","href":"proxytimeTickInterval","type":2,"isActive":false},{"label":"proxy.healthCheckTimeout","href":"proxyhealthCheckTimeout","type":2,"isActive":false},{"label":"proxy.msgStream.timeTick.bufSize","href":"proxymsgStreamtimeTickbufSize","type":2,"isActive":false},{"label":"proxy.maxNameLength","href":"proxymaxNameLength","type":2,"isActive":false},{"label":"proxy.maxFieldNum","href":"proxymaxFieldNum","type":2,"isActive":false},{"label":"proxy.maxVectorFieldNum","href":"proxymaxVectorFieldNum","type":2,"isActive":false},{"label":"proxy.maxShardNum","href":"proxymaxShardNum","type":2,"isActive":false},{"label":"proxy.maxDimension","href":"proxymaxDimension","type":2,"isActive":false},{"label":"proxy.ginLogging","href":"proxyginLogging","type":2,"isActive":false},{"label":"proxy.ginLogSkipPaths","href":"proxyginLogSkipPaths","type":2,"isActive":false},{"label":"proxy.maxTaskNum","href":"proxymaxTaskNum","type":2,"isActive":false},{"label":"proxy.mustUsePartitionKey","href":"proxymustUsePartitionKey","type":2,"isActive":false},{"label":"proxy.accessLog.enable","href":"proxyaccessLogenable","type":2,"isActive":false},{"label":"proxy.accessLog.minioEnable","href":"proxyaccessLogminioEnable","type":2,"isActive":false},{"label":"proxy.accessLog.localPath","href":"proxyaccessLoglocalPath","type":2,"isActive":false},{"label":"proxy.accessLog.filename","href":"proxyaccessLogfilename","type":2,"isActive":false},{"label":"proxy.accessLog.maxSize","href":"proxyaccessLogmaxSize","type":2,"isActive":false},{"label":"proxy.accessLog.rotatedTime","href":"proxyaccessLogrotatedTime","type":2,"isActive":false},{"label":"proxy.accessLog.remotePath","href":"proxyaccessLogremotePath","type":2,"isActive":false},{"label":"proxy.accessLog.remoteMaxTime","href":"proxyaccessLogremoteMaxTime","type":2,"isActive":false},{"label":"proxy.accessLog.cacheSize","href":"proxyaccessLogcacheSize","type":2,"isActive":false},{"label":"proxy.accessLog.cacheFlushInterval","href":"proxyaccessLogcacheFlushInterval","type":2,"isActive":false},{"label":"proxy.connectionCheckIntervalSeconds","href":"proxyconnectionCheckIntervalSeconds","type":2,"isActive":false},{"label":"proxy.connectionClientInfoTTLSeconds","href":"proxyconnectionClientInfoTTLSeconds","type":2,"isActive":false},{"label":"proxy.maxConnectionNum","href":"proxymaxConnectionNum","type":2,"isActive":false},{"label":"proxy.gracefulStopTimeout","href":"proxygracefulStopTimeout","type":2,"isActive":false},{"label":"proxy.slowQuerySpanInSeconds","href":"proxyslowQuerySpanInSeconds","type":2,"isActive":false},{"label":"proxy.queryNodePooling.size","href":"proxyqueryNodePoolingsize","type":2,"isActive":false},{"label":"proxy.http.enabled","href":"proxyhttpenabled","type":2,"isActive":false},{"label":"proxy.http.debug_mode","href":"proxyhttpdebugmode","type":2,"isActive":false},{"label":"proxy.http.port","href":"proxyhttpport","type":2,"isActive":false},{"label":"proxy.http.acceptTypeAllowInt64","href":"proxyhttpacceptTypeAllowInt64","type":2,"isActive":false},{"label":"proxy.http.enablePprof","href":"proxyhttpenablePprof","type":2,"isActive":false},{"label":"proxy.ip","href":"proxyip","type":2,"isActive":false},{"label":"proxy.port","href":"proxyport","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxSendSize","href":"proxygrpcserverMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxRecvSize","href":"proxygrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxSendSize","href":"proxygrpcclientMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxRecvSize","href":"proxygrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.md b/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.md new file mode 100644 index 000000000..59b436d5b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_proxy.md @@ -0,0 +1,1155 @@ +--- +id: configure_proxy.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi proxy untuk Milvus. +--- +

    Konfigurasi terkait proxy

    Konfigurasi terkait proxy, digunakan untuk memvalidasi permintaan klien dan mengurangi hasil yang dikembalikan.

    +

    proxy.timeTickInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval di mana proxy menyinkronkan detak waktu, unit: ms. 200
    +

    proxy.healthCheckTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ms, interval untuk melakukan pemeriksaan kesehatan komponen 3000
    +

    proxy.msgStream.timeTick.bufSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum pesan yang dapat disangga dalam aliran pesan timeTick dari proxy saat memproduksi pesan. 512
    +

    proxy.maxNameLength

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Panjang maksimum nama atau alias yang dapat dibuat di Milvus, termasuk nama koleksi, alias koleksi, nama partisi, dan nama bidang. 255
    +

    proxy.maxFieldNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum field yang dapat dibuat saat membuat koleksi. Sangat TIDAK DIANJURKAN untuk mengatur maxFieldNum >= 64. 64
    +

    proxy.maxVectorFieldNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum bidang vektor yang dapat ditentukan dalam koleksi. Rentang nilai: [1, 10]. 4
    +

    proxy.maxShardNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum pecahan yang dapat dibuat saat membuat dalam koleksi. 16
    +

    proxy.maxDimension

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum dimensi vektor yang dapat dimiliki saat membuat dalam koleksi. 32768
    +

    proxy.ginLogging

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Apakah akan menghasilkan log gin.\n
  • +
  • harap sesuaikan di Milvus yang disematkan: false
  • benar
    +

    proxy.ginLogSkipPaths

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    lewati jalur url untuk log gin /
    +

    proxy.maxTaskNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum tugas dalam antrean tugas proxy. 1024
    +

    proxy.mustUsePartitionKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    sakelar apakah proxy harus menggunakan kunci partisi untuk koleksi false
    +

    proxy.accessLog.enable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan fitur log akses. false
    +

    proxy.accessLog.minioEnable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengunggah file log akses lokal ke MinIO. Parameter ini dapat ditentukan ketika proxy.accessLog.filename tidak kosong. false
    +

    proxy.accessLog.localPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jalur folder lokal tempat file log akses disimpan. Parameter ini dapat ditentukan bila proxy.accessLog.filename tidak kosong. /tmp/milvus_access
    +

    proxy.accessLog.filename

    + + + + + + + + + + + + +
    DeskripsiNilai default
    Nama file log akses. Jika Anda membiarkan parameter ini kosong, log akses akan dicetak ke stdout.
    +

    proxy.accessLog.maxSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum yang diizinkan untuk satu file log akses. Jika ukuran file log mencapai batas ini, proses rotasi akan dipicu. Proses ini akan menyegel file log akses saat ini, membuat file log baru, dan menghapus isi file log asli. Satuan MB. 64
    +

    proxy.accessLog.rotatedTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval waktu maksimum yang diizinkan untuk merotasi file log akses tunggal. Setelah mencapai interval waktu yang ditentukan, proses rotasi akan dipicu, sehingga menghasilkan pembuatan file log akses baru dan menyegel file log akses sebelumnya. Satuan: detik 0
    +

    proxy.accessLog.remotePath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jalur penyimpanan objek untuk mengunggah file log akses. access_log/
    +

    proxy.accessLog.remoteMaxTime

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval waktu yang diizinkan untuk mengunggah file log akses. Jika waktu pengunggahan file log melebihi interval ini, file akan dihapus. Mengatur nilai ke 0 akan menonaktifkan fitur ini. 0
    +

    proxy.accessLog.cacheSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran log cache tulis, dalam byte. (Tutup cache tulis jika ukurannya 0) 0
    +

    proxy.accessLog.cacheFlushInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval waktu flush cache tulis otomatis, dalam detik. (Tutup flush otomatis jika intervalnya 0) 3
    +

    proxy.connectionCheckIntervalSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval waktu (dalam detik) bagi manajer koneksi untuk memindai info klien yang tidak aktif 120
    +

    proxy.connectionClientInfoTTLSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi TTL info klien tidak aktif, dalam detik 86400
    +

    proxy.maxConnectionNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah info klien maksimum yang harus dikelola proxy, hindari terlalu banyak info klien 10000
    +

    proxy.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. paksa hentikan simpul tanpa penghentian yang anggun 30
    +

    proxy.slowQuerySpanInSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kueri yang waktu eksekusinya melebihi `slowQuerySpanInSeconds` dapat dianggap lambat, dalam hitungan detik. 5
    +

    proxy.queryNodePooling.size

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran untuk kumpulan klien shardleader (node kueri) 10
    +

    proxy.http.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan server http true
    +

    proxy.http.debug_mode

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan mode debug server http false
    +

    proxy.http.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    api istirahat tingkat tinggi
    +

    proxy.http.acceptTypeAllowInt64

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    high-level restful api, apakah klien http dapat menangani int64 true
    +

    proxy.http.enablePprof

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mengaktifkan middleware pprof pada port metrik true
    +

    proxy.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP proxy. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    proxy.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP proxy 19530
    +

    proxy.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh proxy, satuan: byte 268435456
    +

    proxy.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh proxy, satuan: byte 67108864
    +

    proxy.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien pada proxy, satuan: byte 268435456
    +

    proxy.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien pada proxy, satuan: byte 67108864
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.json b/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.json new file mode 100644 index 000000000..c74710487 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"pulsar-related Configurations","anchorList":[{"label":"Konfigurasi terkait pulsar","href":"pulsar-related-Configurations","type":1,"isActive":false},{"label":"pulsar.address","href":"pulsaraddress","type":2,"isActive":false},{"label":"pulsar.port","href":"pulsarport","type":2,"isActive":false},{"label":"pulsar.webport","href":"pulsarwebport","type":2,"isActive":false},{"label":"pulsar.maxMessageSize","href":"pulsarmaxMessageSize","type":2,"isActive":false},{"label":"pulsar.tenant","href":"pulsartenant","type":2,"isActive":false},{"label":"pulsar.namespace","href":"pulsarnamespace","type":2,"isActive":false},{"label":"pulsar.requestTimeout","href":"pulsarrequestTimeout","type":2,"isActive":false},{"label":"pulsar.enableClientMetrics","href":"pulsarenableClientMetrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.md b/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.md new file mode 100644 index 000000000..43731cb11 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_pulsar.md @@ -0,0 +1,264 @@ +--- +id: configure_pulsar.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi pulsar untuk Milvus. +--- +

    Konfigurasi terkait pulsar

    Konfigurasi terkait pulsar, digunakan untuk mengelola log Milvus dari operasi mutasi terbaru, log streaming keluaran, dan menyediakan layanan berlangganan-publikasi log.

    +

    pulsar.address

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Alamat IP layanan Pulsar.
  • +
  • Variabel lingkungan: PULSAR_ADDRESS
  • +
  • pulsar.address dan pulsar.port bersama-sama menghasilkan akses yang valid ke Pulsar.
  • +
  • Pulsar secara istimewa memperoleh alamat IP yang valid dari variabel lingkungan PULSAR_ADDRESS ketika Milvus dimulai.
  • +
  • Nilai default berlaku ketika Pulsar berjalan pada jaringan yang sama dengan Milvus.
  • localhost
    +

    pulsar.port

    + + + + + + + + + + + + +
    DeskripsiNilai default
    Port layanan Pulsar. 6650
    +

    pulsar.webport

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port web layanan Pulsar. Jika Anda terhubung langsung tanpa proxy, sebaiknya gunakan 8080. 80
    +

    pulsar.maxMessageSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Ukuran maksimum setiap pesan dalam Pulsar. Unit: Byte.
  • +
  • Secara default, Pulsar dapat mengirimkan paling banyak 5 MB data dalam satu pesan. Ketika ukuran data yang dimasukkan lebih besar dari nilai ini, proxy akan memecah data menjadi beberapa pesan untuk memastikan data tersebut dapat dikirim dengan benar.
  • +
  • Jika parameter yang sesuai di Pulsar tetap tidak berubah, meningkatkan konfigurasi ini akan menyebabkan Milvus gagal, dan menguranginya tidak menghasilkan keuntungan.
  • 5242880
    +

    pulsar.tenant

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Pulsar dapat disediakan untuk penyewa tertentu dengan kapasitas yang sesuai yang dialokasikan untuk penyewa.
  • +
  • Untuk berbagi instance Pulsar di antara beberapa instance Milvus, Anda dapat mengubahnya menjadi penyewa Pulsar, bukan penyewa default untuk setiap instance Milvus sebelum Anda memulainya. Namun, jika Anda tidak menginginkan multi-tenancy Pulsar, Anda disarankan untuk mengubah msgChannel.chanNamePrefix.cluster ke nilai yang berbeda.
  • public
    +

    pulsar.namespace

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ruang nama Pulsar adalah nomenklatur unit administratif dalam sebuah penyewa. default
    +

    pulsar.requestTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu permintaan global klien pulsar dalam detik 60
    +

    pulsar.enableClientMetrics

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mendaftarkan metrik klien pulsar ke dalam jalur metrik milvus. false
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.json b/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.json new file mode 100644 index 000000000..a6b90ec10 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryCoord-related Configurations","anchorList":[{"label":"Konfigurasi terkait queryCoord","href":"queryCoord-related-Configurations","type":1,"isActive":false},{"label":"queryCoord.autoHandoff","href":"queryCoordautoHandoff","type":2,"isActive":false},{"label":"queryCoord.autoBalance","href":"queryCoordautoBalance","type":2,"isActive":false},{"label":"queryCoord.autoBalanceChannel","href":"queryCoordautoBalanceChannel","type":2,"isActive":false},{"label":"queryCoord.balancer","href":"queryCoordbalancer","type":2,"isActive":false},{"label":"queryCoord.globalRowCountFactor","href":"queryCoordglobalRowCountFactor","type":2,"isActive":false},{"label":"queryCoord.scoreUnbalanceTolerationFactor","href":"queryCoordscoreUnbalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.reverseUnBalanceTolerationFactor","href":"queryCoordreverseUnBalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.overloadedMemoryThresholdPercentage","href":"queryCoordoverloadedMemoryThresholdPercentage","type":2,"isActive":false},{"label":"queryCoord.balanceIntervalSeconds","href":"queryCoordbalanceIntervalSeconds","type":2,"isActive":false},{"label":"queryCoord.memoryUsageMaxDifferencePercentage","href":"queryCoordmemoryUsageMaxDifferencePercentage","type":2,"isActive":false},{"label":"queryCoord.rowCountFactor","href":"queryCoordrowCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountFactor","href":"queryCoordsegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.globalSegmentCountFactor","href":"queryCoordglobalSegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountMaxSteps","href":"queryCoordsegmentCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.rowCountMaxSteps","href":"queryCoordrowCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.randomMaxSteps","href":"queryCoordrandomMaxSteps","type":2,"isActive":false},{"label":"queryCoord.growingRowCountWeight","href":"queryCoordgrowingRowCountWeight","type":2,"isActive":false},{"label":"queryCoord.delegatorMemoryOverloadFactor","href":"queryCoorddelegatorMemoryOverloadFactor","type":2,"isActive":false},{"label":"queryCoord.balanceCostThreshold","href":"queryCoordbalanceCostThreshold","type":2,"isActive":false},{"label":"queryCoord.channelTaskTimeout","href":"queryCoordchannelTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.segmentTaskTimeout","href":"queryCoordsegmentTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.heartbeatAvailableInterval","href":"queryCoordheartbeatAvailableInterval","type":2,"isActive":false},{"label":"queryCoord.distRequestTimeout","href":"queryCoorddistRequestTimeout","type":2,"isActive":false},{"label":"queryCoord.heatbeatWarningLag","href":"queryCoordheatbeatWarningLag","type":2,"isActive":false},{"label":"queryCoord.checkHealthInterval","href":"queryCoordcheckHealthInterval","type":2,"isActive":false},{"label":"queryCoord.checkHealthRPCTimeout","href":"queryCoordcheckHealthRPCTimeout","type":2,"isActive":false},{"label":"queryCoord.brokerTimeout","href":"queryCoordbrokerTimeout","type":2,"isActive":false},{"label":"queryCoord.collectionRecoverTimes","href":"queryCoordcollectionRecoverTimes","type":2,"isActive":false},{"label":"queryCoord.observerTaskParallel","href":"queryCoordobserverTaskParallel","type":2,"isActive":false},{"label":"queryCoord.checkAutoBalanceConfigInterval","href":"queryCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"queryCoord.checkNodeSessionInterval","href":"queryCoordcheckNodeSessionInterval","type":2,"isActive":false},{"label":"queryCoord.gracefulStopTimeout","href":"queryCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"queryCoord.enableStoppingBalance","href":"queryCoordenableStoppingBalance","type":2,"isActive":false},{"label":"queryCoord.channelExclusiveNodeFactor","href":"queryCoordchannelExclusiveNodeFactor","type":2,"isActive":false},{"label":"queryCoord.collectionObserverInterval","href":"queryCoordcollectionObserverInterval","type":2,"isActive":false},{"label":"queryCoord.checkExecutedFlagInterval","href":"queryCoordcheckExecutedFlagInterval","type":2,"isActive":false},{"label":"queryCoord.updateCollectionLoadStatusInterval","href":"queryCoordupdateCollectionLoadStatusInterval","type":2,"isActive":false},{"label":"queryCoord.cleanExcludeSegmentInterval","href":"queryCoordcleanExcludeSegmentInterval","type":2,"isActive":false},{"label":"queryCoord.ip","href":"queryCoordip","type":2,"isActive":false},{"label":"queryCoord.port","href":"queryCoordport","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxSendSize","href":"queryCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxRecvSize","href":"queryCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxSendSize","href":"queryCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxRecvSize","href":"queryCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.md b/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.md new file mode 100644 index 000000000..4fbbc70a3 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_querycoord.md @@ -0,0 +1,1300 @@ +--- +id: configure_querycoord.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi queryCoord untuk Milvus. +--- +

    Konfigurasi terkait queryCoord

    Konfigurasi terkait queryCoord, digunakan untuk mengelola topologi dan penyeimbangan beban untuk node kueri, dan handoff dari segmen yang sedang tumbuh ke segmen yang disegel.

    +

    queryCoord.autoHandoff

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Nilai sakelar untuk mengontrol apakah akan secara otomatis mengganti segmen yang sedang tumbuh dengan segmen tersegel terindeks yang sesuai ketika segmen yang sedang tumbuh mencapai ambang batas penyegelan.
  • +
  • Jika parameter ini disetel salah, Milvus hanya akan mencari segmen yang sedang tumbuh dengan brute force.
  • benar
    +

    queryCoord.autoBalance

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ganti nilai untuk mengontrol apakah akan menyeimbangkan penggunaan memori secara otomatis di antara node kueri dengan mendistribusikan operasi pemuatan dan pelepasan segmen secara merata. true
    +

    queryCoord.autoBalanceChannel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan saluran keseimbangan otomatis benar
    +

    queryCoord.balancer

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    penyeimbang otomatis yang digunakan untuk segmen pada queryNode Penyeimbang Berbasis Skor
    +

    queryCoord.globalRowCountFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    bobot yang digunakan saat menyeimbangkan segmen di antara queryNodes 0.1
    +

    queryCoord.scoreUnbalanceTolerationFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nilai terkecil untuk tingkat ketidakseimbangan antara dari dan ke node saat melakukan penyeimbangan 0.05
    +

    queryCoord.reverseUnBalanceTolerationFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nilai terbesar untuk ketidakseimbangan antara dari dan ke node setelah melakukan penyeimbangan 1.3
    +

    queryCoord.overloadedMemoryThresholdPercentage

    + + + + + + + + + + + + +
    KeteranganNilai Default
    Ambang batas penggunaan memori (dalam persentase) dalam node kueri untuk memicu penyeimbangan segmen tertutup. 90
    +

    queryCoord.balanceIntervalSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval saat koordinat kueri menyeimbangkan penggunaan memori di antara node kueri. 60
    +

    queryCoord.memoryUsageMaxDifferencePercentage

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ambang batas perbedaan penggunaan memori (dalam persentase) antara dua node kueri untuk memicu penyeimbangan segmen tertutup. 30
    +

    queryCoord.rowCountFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    bobot jumlah baris yang digunakan saat menyeimbangkan segmen di antara queryNode 0.4
    +

    queryCoord.segmentCountFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    bobot jumlah segmen yang digunakan saat menyeimbangkan segmen di antara queryNode 0.4
    +

    queryCoord.globalSegmentCountFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    bobot jumlah segmen yang digunakan saat menyeimbangkan segmen di antara queryNode 0.1
    +

    queryCoord.segmentCountMaxSteps

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    langkah maksimum pembuat rencana berdasarkan jumlah segmen 50
    +

    queryCoord.rowCountMaxSteps

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    langkah maksimum generator rencana berdasarkan jumlah segmen 50
    +

    queryCoord.randomMaxSteps

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    langkah maksimum generator rencana berdasarkan jumlah segmen 10
    +

    queryCoord.growingRowCountWeight

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    bobot memori dari jumlah baris segmen yang bertambah 4
    +

    queryCoord.delegatorMemoryOverloadFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    faktor memori delegator yang kelebihan beban 0.1
    +

    queryCoord.balanceCostThreshold

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ambang batas biaya keseimbangan, jika selisih biaya cluster setelah mengeksekusi rencana keseimbangan kurang dari nilai ini, rencana tidak akan dieksekusi 0.001
    +

    queryCoord.channelTaskTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    1 menit 60000
    +

    queryCoord.segmentTaskTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    2 menit 120000
    +

    queryCoord.heartbeatAvailableInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    10s, Hanya QueryNode yang mengambil detak jantung dalam durasi tersebut yang tersedia 10000
    +

    queryCoord.distRequestTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu permintaan untuk querycoord yang mengambil distribusi data dari querynode, dalam milidetik 5000
    +

    queryCoord.heatbeatWarningLag

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nilai jeda untuk peringatan laporan querycoord ketika heatbeat terakhir terlalu lama, dalam milidetik 5000
    +

    queryCoord.checkHealthInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    3s, interval ketika koordin kueri mencoba memeriksa kesehatan simpul kueri 3000
    +

    queryCoord.checkHealthRPCTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    100ms, batas waktu untuk memeriksa kesehatan rpc ke node kueri 2000
    +

    queryCoord.brokerTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    5000ms, batas waktu rpc broker querycoord 5000
    +

    queryCoord.collectionRecoverTimes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jika waktu pemulihan koleksi mencapai batas selama status pemuatan, lepaskan 3
    +

    queryCoord.observerTaskParallel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nomor tugas dispatcher pengamat paralel 16
    +

    queryCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval pemeriksaan konfigurasi keseimbangan otomatis 10
    +

    queryCoord.checkNodeSessionInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval (dalam detik) pemeriksaan sesi klaster kueri simpul 60
    +

    queryCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. paksa hentikan simpul tanpa penghentian secara halus 5
    +

    queryCoord.enableStoppingBalance

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    apakah mengaktifkan penghentian saldo benar
    +

    queryCoord.channelExclusiveNodeFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nomor simpul paling sedikit untuk mengaktifkan mode eksklusif saluran 4
    +

    queryCoord.collectionObserverInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval pengamat pengumpulan 200
    +

    queryCoord.checkExecutedFlagInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval pemeriksaan yang dieksekusi flag untuk memaksa menarik dist 100
    +

    queryCoord.updateCollectionLoadStatusInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    5m, interval maksimum untuk memperbarui status koleksi yang dimuat 5
    +

    queryCoord.cleanExcludeSegmentInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi waktu untuk membersihkan segmen pengecualian pipa yang digunakan untuk menyaring data yang tidak valid, dalam detik 60
    +

    queryCoord.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari queryCoord. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    queryCoord.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari queryCoord 19531
    +

    queryCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh queryCoord, satuan: byte 536870912
    +

    queryCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh queryCoord, satuan: byte 268435456
    +

    queryCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien di queryCoord, satuan: byte 268435456
    +

    queryCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di queryCoord, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.json b/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.json new file mode 100644 index 000000000..6d49cb323 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryNode-related Configurations","anchorList":[{"label":"Konfigurasi terkait queryNode","href":"queryNode-related-Configurations","type":1,"isActive":false},{"label":"queryNode.stats.publishInterval","href":"queryNodestatspublishInterval","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereThreadPoolNumRatio","href":"queryNodesegcoreknowhereThreadPoolNumRatio","type":2,"isActive":false},{"label":"queryNode.segcore.chunkRows","href":"queryNodesegcorechunkRows","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.enableIndex","href":"queryNodesegcoreinterimIndexenableIndex","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nlist","href":"queryNodesegcoreinterimIndexnlist","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nprobe","href":"queryNodesegcoreinterimIndexnprobe","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.memExpansionRate","href":"queryNodesegcoreinterimIndexmemExpansionRate","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.buildParallelRate","href":"queryNodesegcoreinterimIndexbuildParallelRate","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereScoreConsistency","href":"queryNodesegcoreknowhereScoreConsistency","type":2,"isActive":false},{"label":"queryNode.loadMemoryUsageFactor","href":"queryNodeloadMemoryUsageFactor","type":2,"isActive":false},{"label":"queryNode.enableDisk","href":"queryNodeenableDisk","type":2,"isActive":false},{"label":"queryNode.cache.memoryLimit","href":"queryNodecachememoryLimit","type":2,"isActive":false},{"label":"queryNode.cache.readAheadPolicy","href":"queryNodecachereadAheadPolicy","type":2,"isActive":false},{"label":"queryNode.cache.warmup","href":"queryNodecachewarmup","type":2,"isActive":false},{"label":"queryNode.mmap.mmapEnabled","href":"queryNodemmapmmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.growingMmapEnabled","href":"queryNodemmapgrowingMmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.fixedFileSizeForMmapAlloc","href":"queryNodemmapfixedFileSizeForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.mmap.maxDiskUsagePercentageForMmapAlloc","href":"queryNodemmapmaxDiskUsagePercentageForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.lazyload.enabled","href":"queryNodelazyloadenabled","type":2,"isActive":false},{"label":"queryNode.lazyload.waitTimeout","href":"queryNodelazyloadwaitTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceTimeout","href":"queryNodelazyloadrequestResourceTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceRetryInterval","href":"queryNodelazyloadrequestResourceRetryInterval","type":2,"isActive":false},{"label":"queryNode.lazyload.maxRetryTimes","href":"queryNodelazyloadmaxRetryTimes","type":2,"isActive":false},{"label":"queryNode.lazyload.maxEvictPerRetry","href":"queryNodelazyloadmaxEvictPerRetry","type":2,"isActive":false},{"label":"queryNode.scheduler.maxReadConcurrentRatio","href":"queryNodeschedulermaxReadConcurrentRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.cpuRatio","href":"queryNodeschedulercpuRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.name","href":"queryNodeschedulerscheduleReadPolicyname","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.taskQueueExpire","href":"queryNodeschedulerscheduleReadPolicytaskQueueExpire","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping","href":"queryNodeschedulerscheduleReadPolicyenableCrossUserGrouping","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser","href":"queryNodeschedulerscheduleReadPolicymaxPendingTaskPerUser","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxQueueLength","href":"queryNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxParallelism","href":"queryNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"queryNode.enableSegmentPrune","href":"queryNodeenableSegmentPrune","type":2,"isActive":false},{"label":"queryNode.bloomFilterApplyParallelFactor","href":"queryNodebloomFilterApplyParallelFactor","type":2,"isActive":false},{"label":"queryNode.queryStreamBatchSize","href":"queryNodequeryStreamBatchSize","type":2,"isActive":false},{"label":"queryNode.workerPooling.size","href":"queryNodeworkerPoolingsize","type":2,"isActive":false},{"label":"queryNode.ip","href":"queryNodeip","type":2,"isActive":false},{"label":"queryNode.port","href":"queryNodeport","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxSendSize","href":"queryNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxRecvSize","href":"queryNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxSendSize","href":"queryNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxRecvSize","href":"queryNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.md b/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.md new file mode 100644 index 000000000..ae0be6743 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_querynode.md @@ -0,0 +1,1261 @@ +--- +id: configure_querynode.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi queryNode untuk Milvus. +--- +

    Konfigurasi terkait queryNode

    Konfigurasi terkait queryNode, digunakan untuk menjalankan pencarian hibrida antara data vektor dan skalar.

    +

    queryNode.stats.publishInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval saat node kueri menerbitkan informasi statistik node, termasuk status segmen, penggunaan cpu, penggunaan memori, status kesehatan, dll. Satuan: ms. 1000
    +

    queryNode.segcore.knowhereThreadPoolNumRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah utas dalam kumpulan utas knowhere. Jika disk diaktifkan, ukuran pool akan dikalikan dengan knowhereThreadPoolNumRatio([1, 32]). 4
    +

    queryNode.segcore.chunkRows

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah baris yang digunakan Segcore untuk membagi segmen menjadi beberapa bagian. 128
    +

    queryNode.segcore.interimIndex.enableIndex

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Apakah akan membuat indeks sementara untuk segmen yang sedang berkembang dan segmen yang disegel yang belum diindeks, untuk meningkatkan kinerja pencarian.
  • +
  • Milvus pada akhirnya akan menyegel dan mengindeks semua segmen, tetapi dengan mengaktifkan ini akan mengoptimalkan kinerja pencarian untuk kueri langsung setelah penyisipan data.
  • +
  • Ini adalah nilai default untuk true, yang menunjukkan bahwa Milvus membuat indeks sementara untuk segmen yang sedang berkembang dan segmen yang disegel yang belum diindeks pada saat pencarian.
  • true
    +

    queryNode.segcore.interimIndex.nlist

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    indeks sementara nlist, rekomendasikan untuk mengatur sqrt(chunkRows), harus lebih kecil dari chunkRows/8 128
    +

    queryNode.segcore.interimIndex.nprobe

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    nprobe untuk mencari indeks kecil, berdasarkan kebutuhan akurasi Anda, harus lebih kecil dari nlist 16
    +

    queryNode.segcore.interimIndex.memExpansionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    memori ekstra yang dibutuhkan untuk membangun indeks sementara 1.15
    +

    queryNode.segcore.interimIndex.buildParallelRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    rasio membangun indeks sementara paralel yang cocok dengan num cpu 0.5
    +

    queryNode.segcore.knowhereScoreConsistency

    + + + + + + + + + + + + +
    KeteranganNilai Default
    Mengaktifkan logika perhitungan skor konsistensi yang kuat di mana saja false
    +

    queryNode.loadMemoryUsageFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Faktor pengali untuk menghitung penggunaan memori saat memuat segmen 1
    +

    queryNode.enableDisk

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    aktifkan querynode memuat indeks disk, dan mencari pada indeks disk false
    +

    queryNode.cache.memoryLimit

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    2 GB, 2 * 1024 * 1024 * 1024 2147483648
    +

    queryNode.cache.readAheadPolicy

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Kebijakan baca di depan cache chunk, opsi: `normal, acak, berurutan, perlu, tidak perlu` akan membutuhkan
    +

    queryNode.cache.warmup

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • opsi: asinkronisasi, sinkronisasi, nonaktifkan.
  • +
  • Menentukan kebutuhan untuk pemanasan cache chunk.
  • +
  • 1. Jika diatur ke "sync" atau "async", data vektor asli akan dimuat secara sinkron/asinkron ke dalam
  • +
  • chunk cache selama proses pemuatan. Pendekatan ini memiliki potensi untuk secara substansial mengurangi latensi kueri/pencarian
  • +
  • untuk durasi tertentu setelah pemuatan, meskipun disertai dengan peningkatan penggunaan disk secara bersamaan;
  • +
  • 2. Jika disetel ke "disable", data vektor asli hanya akan dimuat ke dalam chunk cache selama proses pencarian/query.
  • menonaktifkan
    +

    queryNode.mmap.mmapEnabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan mmap untuk memuat data false
    +

    queryNode.mmap.growingMmapEnabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan mmap untuk digunakan dalam menumbuhkan data mentah false
    +

    queryNode.mmap.fixedFileSizeForMmapAlloc

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran file tmp untuk pengelola potongan mmap 1
    +

    queryNode.mmap.maxDiskUsagePercentageForMmapAlloc

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    persentase disk yang digunakan dalam mmap chunk manager 50
    +

    queryNode.lazyload.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengaktifkan lazyload untuk memuat data false
    +

    queryNode.lazyload.waitTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi batas waktu tunggu maksimum dalam milidetik sebelum mulai melakukan pencarian dan pengambilan lazyload 30000
    +

    queryNode.lazyload.requestResourceTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu maksimal dalam milidetik untuk menunggu sumber daya permintaan untuk lazy load, 5 detik secara default 5000
    +

    queryNode.lazyload.requestResourceRetryInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    interval coba ulang dalam milidetik untuk sumber daya permintaan menunggu untuk beban malas, 2 detik secara default 2000
    +

    queryNode.lazyload.maxRetryTimes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    waktu percobaan ulang maksimum untuk beban malas, 1 secara default 1
    +

    queryNode.lazyload.maxEvictPerRetry

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah pengusiran maksimal untuk beban malas, 1 secara default 1
    +

    queryNode.scheduler.maxReadConcurrentRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • maxReadConcurrentRatio adalah rasio konkurensi tugas baca (tugas pencarian dan tugas kueri).
  • +
  • Konkurensi baca maksimum adalah nilai dari hardware.GetCPUNum * maxReadConcurrentRatio.
  • +
  • Defaultnya adalah 2.0, yang berarti konkurensi baca maksimum adalah nilai dari hardware.GetCPUNum * 2.
  • +
  • Konkurensi baca maksimum harus lebih besar atau sama dengan 1, dan kurang dari atau sama dengan hardware.GetCPUNum * 100.
  • +
  • (0, 100]
  • 1
    +

    queryNode.scheduler.cpuRatio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    rasio yang digunakan untuk memperkirakan penggunaan cpu tugas baca. 10
    +

    queryNode.scheduler.scheduleReadPolicy.name

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • fifo Antrian FIFO yang mendukung jadwal.
  • +
  • user-task-polling:
  • +
  • Tugas pengguna akan disurvei satu per satu dan dijadwalkan.
  • +
  • Penjadwalan adil berdasarkan perincian tugas.
  • +
  • Kebijakan ini didasarkan pada nama pengguna untuk otentikasi.
  • +
  • Dan nama pengguna yang kosong dianggap sebagai pengguna yang sama.
  • +
  • Jika tidak ada banyak pengguna, kebijakan akan berubah menjadi FIFO"
  • FIFO
    +

    queryNode.scheduler.scheduleReadPolicy.taskQueueExpire

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Mengontrol berapa lama (dalam detik) antrean ditahan sejak antrean kosong 60
    +

    queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Aktifkan pengelompokan pengguna silang saat menggunakan kebijakan pengumpulan tugas pengguna. (Nonaktifkan jika tugas pengguna tidak dapat digabungkan satu sama lain) false
    +

    queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Tugas tertunda maksimum per pengguna dalam penjadwal 1024
    +

    queryNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum cache antrean tugas dalam grafik aliran di node kueri. 16
    +

    queryNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum tugas yang dieksekusi secara paralel dalam diagram alir 1024
    +

    queryNode.enableSegmentPrune

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    gunakan statistik partisi untuk memangkas data dalam pencarian/kueri pada delegator pecahan false
    +

    queryNode.bloomFilterApplyParallelFactor

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    faktor paralel kapan harus menerapkan pk ke filter mekar, standarnya 4*CPU_CORE_NUM 4
    +

    queryNode.queryStreamBatchSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    mengembalikan ukuran batch dari kueri aliran 4194304
    +

    queryNode.workerPooling.size

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran untuk kumpulan klien node kueri pekerja 10
    +

    queryNode.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari queryNode. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    queryNode.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari queryNode 21123
    +

    queryNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh queryNode, satuan: byte 536870912
    +

    queryNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh queryNode, satuan: byte 268435456
    +

    queryNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien pada queryNode, satuan: byte 268435456
    +

    queryNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di queryNode, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.json b/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.json new file mode 100644 index 000000000..7b6a07ff6 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"quotaAndLimits-related Configurations","anchorList":[{"label":"Konfigurasi terkait kuota dan batas","href":"quotaAndLimits-related-Configurations","type":1,"isActive":false},{"label":"quotaAndLimits.enabled","href":"quotaAndLimitsenabled","type":2,"isActive":false},{"label":"quotaAndLimits.quotaCenterCollectInterval","href":"quotaAndLimitsquotaCenterCollectInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocRetryTimes","href":"quotaAndLimitslimitsallocRetryTimes","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocWaitInterval","href":"quotaAndLimitslimitsallocWaitInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.complexDeleteLimitEnable","href":"quotaAndLimitslimitscomplexDeleteLimitEnable","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxCollectionNumPerDB","href":"quotaAndLimitslimitsmaxCollectionNumPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxInsertSize","href":"quotaAndLimitslimitsmaxInsertSize","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxResourceGroupNumOfQueryNode","href":"quotaAndLimitslimitsmaxResourceGroupNumOfQueryNode","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.enabled","href":"quotaAndLimitsddlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.collectionRate","href":"quotaAndLimitsddlcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.partitionRate","href":"quotaAndLimitsddlpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.collectionRate","href":"quotaAndLimitsddldbcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.partitionRate","href":"quotaAndLimitsddldbpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.enabled","href":"quotaAndLimitsindexRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.max","href":"quotaAndLimitsindexRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.db.max","href":"quotaAndLimitsindexRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.enabled","href":"quotaAndLimitsflushRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.max","href":"quotaAndLimitsflushRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.collection.max","href":"quotaAndLimitsflushRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.db.max","href":"quotaAndLimitsflushRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.enabled","href":"quotaAndLimitscompactionRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.max","href":"quotaAndLimitscompactionRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.db.max","href":"quotaAndLimitscompactionRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.enabled","href":"quotaAndLimitsdmlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.max","href":"quotaAndLimitsdmlinsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.db.max","href":"quotaAndLimitsdmlinsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.collection.max","href":"quotaAndLimitsdmlinsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.partition.max","href":"quotaAndLimitsdmlinsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.max","href":"quotaAndLimitsdmlupsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.db.max","href":"quotaAndLimitsdmlupsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.collection.max","href":"quotaAndLimitsdmlupsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.partition.max","href":"quotaAndLimitsdmlupsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.max","href":"quotaAndLimitsdmldeleteRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.db.max","href":"quotaAndLimitsdmldeleteRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.collection.max","href":"quotaAndLimitsdmldeleteRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.partition.max","href":"quotaAndLimitsdmldeleteRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.max","href":"quotaAndLimitsdmlbulkLoadRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.db.max","href":"quotaAndLimitsdmlbulkLoadRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.collection.max","href":"quotaAndLimitsdmlbulkLoadRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.partition.max","href":"quotaAndLimitsdmlbulkLoadRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.enabled","href":"quotaAndLimitsdqlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.max","href":"quotaAndLimitsdqlsearchRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.db.max","href":"quotaAndLimitsdqlsearchRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.collection.max","href":"quotaAndLimitsdqlsearchRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.partition.max","href":"quotaAndLimitsdqlsearchRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.max","href":"quotaAndLimitsdqlqueryRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.db.max","href":"quotaAndLimitsdqlqueryRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.collection.max","href":"quotaAndLimitsdqlqueryRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.partition.max","href":"quotaAndLimitsdqlqueryRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.forceDeny","href":"quotaAndLimitslimitWritingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay","href":"quotaAndLimitslimitWritingttProtectionmaxTimeTickDelay","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.enabled","href":"quotaAndLimitslimitWritingmemProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled","href":"quotaAndLimitslimitWritinggrowingSegmentsSizeProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.enabled","href":"quotaAndLimitslimitWritingdiskProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuota","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuota","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerCollection","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerPartition","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionlowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionhighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.forceDeny","href":"quotaAndLimitslimitReadingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold","href":"quotaAndLimitslimitReadingqueueProtectionnqInQueueThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold","href":"quotaAndLimitslimitReadingqueueProtectionqueueLatencyThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.resultProtection.maxReadResultRate","href":"quotaAndLimitslimitReadingresultProtectionmaxReadResultRate","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.coolOffSpeed","href":"quotaAndLimitslimitReadingcoolOffSpeed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.md b/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.md new file mode 100644 index 000000000..25d665be6 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_quotaandlimits.md @@ -0,0 +1,2137 @@ +--- +id: configure_quotaandlimits.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi kuotaAndLimits untuk Milvus. +--- +

    Konfigurasi terkait kuota dan batas

    QuotaConfig, konfigurasi kuota dan batas Milvus.

    +

    Secara default, kami mengaktifkan:

    +
      +
    1. Perlindungan TT;

    2. +
    3. Perlindungan memori.

    4. +
    5. Perlindungan kuota disk.

    6. +
    +

    Anda dapat mengaktifkan:

    +
      +
    1. Batasan throughput DML;

    2. +
    3. Batasan DDL, DQL qps/rps;

    4. +
    5. Perlindungan panjang antrean/latensi DQL;

    6. +
    7. Perlindungan tingkat hasil DQL;

    8. +
    +

    Jika perlu, Anda juga dapat secara manual menolak permintaan RW.

    +

    quotaAndLimits.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    `true` untuk mengaktifkan kuota dan batas, `false` untuk menonaktifkan. true
    +

    quotaAndLimits.quotaCenterCollectInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • quotaCenterCollectInterval adalah interval waktu yang digunakan quotaCenter
  • +
  • mengumpulkan metrik dari Proksi, klaster Kueri, dan klaster Data.
  • +
  • detik, (0 ~ 65536)
  • 3
    +

    quotaAndLimits.limits.allocRetryTimes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    waktu coba ulang ketika menghapus data alokasi maju dari batas tarif gagal 15
    +

    quotaAndLimits.limits.allocWaitInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    durasi tunggu ulang ketika menghapus data alokasi maju dari batas laju gagal, dalam milidetik 1000
    +

    quotaAndLimits.limits.complexDeleteLimitEnable

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    apakah kompleks menghapus data periksa ke depan dengan pembatas false
    +

    quotaAndLimits.limits.maxCollectionNumPerDB

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum koleksi per basis data. 65536
    +

    quotaAndLimits.limits.maxInsertSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran maksimum dari satu permintaan penyisipan, dalam byte, -1 berarti tidak ada batas -1
    +

    quotaAndLimits.limits.maxResourceGroupNumOfQueryNode

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jumlah maksimum kelompok sumber daya dari node kueri 1024
    +

    quotaAndLimits.ddl.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan DDL diaktifkan. false
    +

    quotaAndLimits.ddl.collectionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum permintaan DDL terkait koleksi per detik.
  • +
  • Mengatur item ini ke 10 menunjukkan bahwa Milvus memproses tidak lebih dari 10 permintaan DDL terkait koleksi per detik, termasuk permintaan pembuatan koleksi, permintaan penghapusan koleksi, permintaan pemuatan koleksi, dan permintaan pelepasan koleksi.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.ddl.enabled ke true pada waktu yang sama.
  • -1
    +

    quotaAndLimits.ddl.partitionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum permintaan DDL terkait partisi per detik.
  • +
  • Mengatur item ini ke 10 mengindikasikan bahwa Milvus memproses tidak lebih dari 10 permintaan terkait partisi per detik, termasuk permintaan pembuatan partisi, permintaan penghapusan partisi, permintaan pemuatan partisi, dan permintaan pelepasan partisi.
  • +
  • Untuk menggunakan pengaturan ini, set quotaAndLimits.ddl.enabled ke true pada saat yang bersamaan.
  • -1
    +

    quotaAndLimits.ddl.db.collectionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps dari level db, default tanpa batas, nilai untuk CreateCollection, DropCollection, LoadCollection, ReleaseCollection -1
    +

    quotaAndLimits.ddl.db.partitionRate

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps dari level db, default tanpa batas, kecepatan untuk CreatePartition, DropPartition, LoadPartition, ReleasePartition -1
    +

    quotaAndLimits.indexRate.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan terkait indeks diaktifkan. false
    +

    quotaAndLimits.indexRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum permintaan terkait indeks per detik.
  • +
  • Mengatur item ini ke 10 menunjukkan bahwa Milvus memproses tidak lebih dari 10 permintaan terkait partisi per detik, termasuk permintaan pembuatan indeks dan permintaan penghapusan indeks.
  • +
  • Untuk menggunakan pengaturan ini, set quotaAndLimits.indexRate.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.indexRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps dari level db, default tanpa batas, laju untuk CreateIndex, DropIndex -1
    +

    quotaAndLimits.flushRate.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan flush diaktifkan. true
    +

    quotaAndLimits.flushRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum permintaan flush per detik.
  • +
  • Menetapkan item ini ke 10 menunjukkan bahwa Milvus memproses tidak lebih dari 10 permintaan flush per detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.flushRate.enabled ke true pada waktu yang sama.
  • -1
    +

    quotaAndLimits.flushRate.collection.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps, default tanpa batas, laju untuk flush pada tingkat koleksi. 0.1
    +

    quotaAndLimits.flushRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps dari level db, default tanpa batas, kecepatan untuk flush -1
    +

    quotaAndLimits.compactionRate.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan pemadatan manual diaktifkan. false
    +

    quotaAndLimits.compactionRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum permintaan pemadatan manual per detik.
  • +
  • Mengatur item ini ke 10 menunjukkan bahwa Milvus memproses tidak lebih dari 10 permintaan pemadatan manual per detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.compaction.enabled ke true pada saat yang bersamaan.
  • -1
    +

    quotaAndLimits.compactionRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps dari level db, default tanpa batas, laju untuk manualCompaction -1
    +

    quotaAndLimits.dml.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan DML diaktifkan. false
    +

    quotaAndLimits.dml.insertRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Laju penyisipan data tertinggi per detik.
  • +
  • Mengatur item ini ke 5 menunjukkan bahwa Milvus hanya mengizinkan penyisipan data dengan kecepatan 5 MB/detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dml.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.dml.insertRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas -1
    +

    quotaAndLimits.dml.insertRate.collection.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Laju penyisipan data tertinggi per koleksi per detik.
  • +
  • Mengatur item ini ke 5 menunjukkan bahwa Milvus hanya mengizinkan penyisipan data ke koleksi apa pun dengan kecepatan 5 MB/detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dml.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.dml.insertRate.partition.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas -1
    +

    quotaAndLimits.dml.upsertRate.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/detik, default tanpa batas -1
    +

    quotaAndLimits.dml.upsertRate.db.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/detik, default tanpa batas -1
    +

    quotaAndLimits.dml.upsertRate.collection.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/detik, default tanpa batas -1
    +

    quotaAndLimits.dml.upsertRate.partition.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/detik, default tanpa batas -1
    +

    quotaAndLimits.dml.deleteRate.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    +
  • Laju penghapusan data tertinggi per detik.
  • +
  • Mengatur item ini ke 0,1 menunjukkan bahwa Milvus hanya mengizinkan penghapusan data dengan kecepatan 0,1 MB/detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dml.enabled ke true pada waktu yang sama.
  • -1
    +

    quotaAndLimits.dml.deleteRate.db.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/s, default tanpa batas -1
    +

    quotaAndLimits.dml.deleteRate.collection.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    +
  • Laju penghapusan data tertinggi per detik.
  • +
  • Mengatur item ini ke 0,1 menunjukkan bahwa Milvus hanya mengizinkan penghapusan data dari koleksi apa pun dengan kecepatan 0,1 MB/detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dml.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.dml.deleteRate.partition.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas -1
    +

    quotaAndLimits.dml.bulkLoadRate.max

    + + + + + + + + + + + + +
    KeteranganNilai Default
    MB/s, default tanpa batas, belum mendukung. TODO: batasi laju bulkLoad -1
    +

    quotaAndLimits.dml.bulkLoadRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas, belum mendukung. TODO: batasi db bulkLoad rate -1
    +

    quotaAndLimits.dml.bulkLoadRate.collection.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas, belum mendukung. TODO: batasi pengumpulan bulkLoad rate -1
    +

    quotaAndLimits.dml.bulkLoadRate.partition.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB/s, default tanpa batas, belum mendukung. TODO: batasi partisi bulkLoad rate -1
    +

    quotaAndLimits.dql.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah pelambatan permintaan DQL diaktifkan. false
    +

    quotaAndLimits.dql.searchRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum vektor yang akan dicari per detik.
  • +
  • Mengatur item ini ke 100 mengindikasikan bahwa Milvus hanya mengizinkan pencarian 100 vektor per detik, tidak peduli apakah 100 vektor tersebut berada dalam satu pencarian atau tersebar di beberapa pencarian.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dql.enabled ke true pada saat yang bersamaan.
  • -1
    +

    quotaAndLimits.dql.searchRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    vps (vektor per detik), default tanpa batas -1
    +

    quotaAndLimits.dql.searchRate.collection.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum vektor yang akan dicari per koleksi per detik.
  • +
  • Mengatur item ini ke 100 menunjukkan bahwa Milvus hanya mengizinkan pencarian 100 vektor per detik per koleksi, tidak peduli apakah 100 vektor ini ada dalam satu pencarian atau tersebar di beberapa pencarian.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dql.enabled ke true pada saat yang bersamaan.
  • -1
    +

    quotaAndLimits.dql.searchRate.partition.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    vps (vektor per detik), default tanpa batas -1
    +

    quotaAndLimits.dql.queryRate.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum kueri per detik.
  • +
  • Mengatur item ini ke 100 mengindikasikan bahwa Milvus hanya mengizinkan 100 kueri per detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dql.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.dql.queryRate.db.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps, default tanpa batas -1
    +

    quotaAndLimits.dql.queryRate.collection.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum kueri per koleksi per detik.
  • +
  • Mengatur item ini ke 100 mengindikasikan bahwa Milvus hanya mengizinkan 100 kueri per koleksi per detik.
  • +
  • Untuk menggunakan pengaturan ini, setel quotaAndLimits.dql.enabled ke true pada saat yang sama.
  • -1
    +

    quotaAndLimits.dql.queryRate.partition.max

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    qps, default tanpa batas -1
    +

    quotaAndLimits.limitWriting.forceDeny

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • forceDeny false berarti permintaan dml diperbolehkan (kecuali untuk beberapa
  • +
  • kondisi tertentu, seperti memori node ke penanda air), true berarti selalu menolak semua permintaan dml.
  • false
    +

    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • maxTimeTickDelay menunjukkan tekanan balik untuk Operasi DML.
  • +
  • Kecepatan DML akan berkurang sesuai dengan rasio waktu tunda detak waktu terhadap maxTimeTickDelay,
  • +
  • jika time tick delay lebih besar dari maxTimeTickDelay, semua permintaan DML akan ditolak.
  • +
  • detik
  • 300
    +

    quotaAndLimits.limitWriting.memProtection.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Ketika penggunaan memori > memoryHighWaterLevel, semua permintaan DML akan ditolak;
  • +
  • Ketika memoryLowWaterLevel < penggunaan memori < memoryHighWaterLevel, kurangi kecepatan dml;
  • +
  • Ketika penggunaan memori < memoryLowWaterLevel, tidak ada tindakan.
  • true
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    (0, 1], memoryLowWaterLevel dalam DataNode 0.85
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    (0, 1], memoryHighWaterLevel dalam DataNodes 0.95
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    (0, 1], memoryLowWaterLevel dalam QueryNodes 0.85
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    (0, 1], memoryHighWaterLevel dalam QueryNodes 0.95
    +

    quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Tidak ada tindakan yang akan dilakukan jika ukuran segmen yang tumbuh kurang dari watermark rendah.
  • +
  • Ketika ukuran segmen yang tumbuh melebihi watermark rendah, laju dml akan dikurangi,
  • +
  • tetapi laju tidak akan lebih rendah dari minRateRatio * dmlRate.
  • false
    +

    quotaAndLimits.limitWriting.diskProtection.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ketika total ukuran file penyimpanan objek lebih besar dari `diskQuota`, semua permintaan dml akan ditolak; true
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuota

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB, (0, +inf), default tanpa batas -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB, (0, +inf), default tanpa batas -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB, (0, +inf), default tanpa batas -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    MB, (0, +inf), default tanpa batas -1
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    sakelar untuk mengaktifkan kuota jumlah baris segmen l0 salah
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kuota jumlah baris segmen l0, ketinggian air rendah 32768
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kuota jumlah baris segmen l0, permukaan air rendah 65536
    +

    quotaAndLimits.limitReading.forceDeny

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • forceDeny false berarti permintaan dql diperbolehkan (kecuali untuk beberapa
  • +
  • kondisi tertentu, seperti koleksi telah dibatalkan), true berarti selalu menolak semua permintaan dql.
  • false
    +

    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • nqInQueueThreshold mengindikasikan bahwa sistem berada di bawah tekanan balik untuk jalur Penelusuran/Pengambilan.
  • +
  • Jika NQ dalam antrian QueryNode lebih besar dari nqInQueueThreshold, tingkat pencarian & kueri secara bertahap akan mendingin
  • +
  • hingga NQ dalam antrean tidak lagi melebihi nqInQueueThreshold. Kami menganggap NQ permintaan kueri sebagai 1.
  • +
  • int, default tanpa batas
  • -1
    +

    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold

    + + + + + + + + + + + + +
    DeskripsiNilai default
    +
  • queueLatencyThreshold mengindikasikan bahwa sistem berada di bawah tekanan balik untuk jalur pencarian/kueri.
  • +
  • Jika latensi antrian dql lebih besar dari queueLatencyThreshold, tingkat pencarian & kueri secara bertahap akan mendingin
  • +
  • hingga latensi antrian tidak lagi melebihi queueLatencyThreshold.
  • +
  • Latensi di sini mengacu pada latensi rata-rata selama periode waktu tertentu.
  • +
  • milidetik, default tanpa batas
  • -1
    +

    quotaAndLimits.limitReading.resultProtection.maxReadResultRate

    + + + + + + + + + + + + +
    DeskripsiNilai default
    +
  • maxReadResultRate mengindikasikan bahwa sistem berada di bawah tekanan balik untuk jalur Penelusuran/Pengujian.
  • +
  • Jika laju hasil dql lebih besar dari maxReadResultRate, laju pencarian & kueri akan menurun secara bertahap
  • +
  • sampai tingkat hasil baca tidak lagi melebihi maxReadResultRate.
  • +
  • MB/s, default tanpa batas
  • -1
    +

    quotaAndLimits.limitReading.coolOffSpeed

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • colOffSpeed adalah kecepatan laju pencarian & kueri dingin.
  • +
  • (0, 1]
  • 0.9
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.json b/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.json new file mode 100644 index 000000000..488e7f999 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rocksmq-related Configurations","anchorList":[{"label":"Konfigurasi terkait rocksmq","href":"rocksmq-related-Configurations","type":1,"isActive":false},{"label":"rocksmq.path","href":"rocksmqpath","type":2,"isActive":false},{"label":"rocksmq.lrucacheratio","href":"rocksmqlrucacheratio","type":2,"isActive":false},{"label":"rocksmq.rocksmqPageSize","href":"rocksmqrocksmqPageSize","type":2,"isActive":false},{"label":"rocksmq.retentionTimeInMinutes","href":"rocksmqretentionTimeInMinutes","type":2,"isActive":false},{"label":"rocksmq.retentionSizeInMB","href":"rocksmqretentionSizeInMB","type":2,"isActive":false},{"label":"rocksmq.compactionInterval","href":"rocksmqcompactionInterval","type":2,"isActive":false},{"label":"rocksmq.compressionTypes","href":"rocksmqcompressionTypes","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.md b/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.md new file mode 100644 index 000000000..6929b9458 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_rocksmq.md @@ -0,0 +1,247 @@ +--- +id: configure_rocksmq.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengkonfigurasi rocksmq untuk Milvus. +--- +

    Konfigurasi terkait rocksmq

    Jika Anda ingin mengaktifkan kafka, perlu mengomentari konfigurasi pulsar

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslKata Sandi:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout: 10

    +

    rocksmq.path

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Awalan kunci tempat Milvus menyimpan data di RocksMQ.
  • +
  • Perhatian: Mengubah parameter ini setelah menggunakan Milvus untuk jangka waktu tertentu akan mempengaruhi akses Anda ke data lama.
  • +
  • Direkomendasikan untuk mengubah parameter ini sebelum memulai Milvus untuk pertama kalinya.
  • +
  • Tetapkan awalan kunci root yang mudah diidentifikasi untuk Milvus jika layanan etcd sudah ada.
  • /var/lib/milvus/rdb_data
    +

    rocksmq.lrucacheratio

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    rasio memori cache rocksdb 0.06
    +

    rocksmq.rocksmqPageSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum pesan dalam setiap halaman di RocksMQ. Pesan di RocksMQ diperiksa dan dihapus (ketika kedaluwarsa) dalam batch berdasarkan parameter ini. Unit: Byte. 67108864
    +

    rocksmq.retentionTimeInMinutes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Waktu retensi maksimum pesan yang di-acked di RocksMQ. Pesan yang di-acked di RocksMQ akan disimpan selama jangka waktu yang ditentukan dan kemudian dihapus. Unit: Menit. 4320
    +

    rocksmq.retentionSizeInMB

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran retensi maksimum pesan yang di-ack dari setiap topik di RocksMQ. Pesan acked di setiap topik akan dihapus jika ukurannya melebihi parameter ini. Satuan MB. 8192
    +

    rocksmq.compactionInterval

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Interval waktu untuk memicu pemadatan rocksdb untuk menghapus data yang dihapus. Unit: Detik 86400
    +

    rocksmq.compressionTypes

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jenis kompresi pemadatan, hanya mendukung penggunaan 0,7. 0 berarti tidak memadatkan, 7 akan menggunakan zstd. Panjang jenis berarti jumlah level batuandb. 0,0,7,7,7
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.json b/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.json new file mode 100644 index 000000000..bf66e3265 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rootCoord-related Configurations","anchorList":[{"label":"Konfigurasi terkait rootCoord","href":"rootCoord-related-Configurations","type":1,"isActive":false},{"label":"rootCoord.dmlChannelNum","href":"rootCoorddmlChannelNum","type":2,"isActive":false},{"label":"rootCoord.maxPartitionNum","href":"rootCoordmaxPartitionNum","type":2,"isActive":false},{"label":"rootCoord.minSegmentSizeToEnableIndex","href":"rootCoordminSegmentSizeToEnableIndex","type":2,"isActive":false},{"label":"rootCoord.maxDatabaseNum","href":"rootCoordmaxDatabaseNum","type":2,"isActive":false},{"label":"rootCoord.maxGeneralCapacity","href":"rootCoordmaxGeneralCapacity","type":2,"isActive":false},{"label":"rootCoord.gracefulStopTimeout","href":"rootCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"rootCoord.ip","href":"rootCoordip","type":2,"isActive":false},{"label":"rootCoord.port","href":"rootCoordport","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxSendSize","href":"rootCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxRecvSize","href":"rootCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxSendSize","href":"rootCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxRecvSize","href":"rootCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.md b/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.md new file mode 100644 index 000000000..3b5e02b5b --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_rootcoord.md @@ -0,0 +1,375 @@ +--- +id: configure_rootcoord.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi rootCoord untuk Milvus. +--- +

    Konfigurasi terkait rootCoord

    Konfigurasi terkait rootCoord, digunakan untuk menangani permintaan bahasa definisi data (DDL) dan bahasa kontrol data (DCL)

    +

    rootCoord.dmlChannelNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah DML-Channel yang akan dibuat pada saat pengaktifan root coord. 16
    +

    rootCoord.maxPartitionNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah maksimum partisi dalam setiap koleksi.
  • +
  • Partisi baru tidak dapat dibuat jika parameter ini ditetapkan sebagai 0 atau 1.
  • +
  • Rentang [0, INT64MAX]
  • 1024
    +

    rootCoord.minSegmentSizeToEnableIndex

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • Jumlah baris minimum segmen yang diperlukan untuk membuat indeks.
  • +
  • Segmen dengan ukuran yang lebih kecil dari parameter ini tidak akan diindeks, dan akan dicari dengan brute force.
  • 1024
    +

    rootCoord.maxDatabaseNum

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jumlah maksimum basis data 64
    +

    rootCoord.maxGeneralCapacity

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas atas untuk jumlah dari hasil kali antara nomorPartisi dan nomor pecahan 65536
    +

    rootCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    detik. paksa berhenti simpul tanpa berhenti dengan anggun 5
    +

    rootCoord.ip

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Alamat TCP/IP dari rootCoord. Jika tidak ditentukan, gunakan alamat pertama yang dapat di-unicast
    +

    rootCoord.port

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Port TCP dari rootCoord 53100
    +

    rootCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh rootCoord, satuan: byte 536870912
    +

    rootCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima rootCoord, satuan: byte 268435456
    +

    rootCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat dikirim oleh klien di rootCoord, satuan: byte 268435456
    +

    rootCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Ukuran maksimum setiap permintaan RPC yang dapat diterima oleh klien di rootCoord, satuan: byte 536870912
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.json b/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.json new file mode 100644 index 000000000..b018d74f9 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tikv-related Configurations","anchorList":[{"label":"Konfigurasi terkait tikv","href":"tikv-related-Configurations","type":1,"isActive":false},{"label":"tikv.endpoints","href":"tikvendpoints","type":2,"isActive":false},{"label":"tikv.rootPath","href":"tikvrootPath","type":2,"isActive":false},{"label":"tikv.metaSubPath","href":"tikvmetaSubPath","type":2,"isActive":false},{"label":"tikv.kvSubPath","href":"tikvkvSubPath","type":2,"isActive":false},{"label":"tikv.requestTimeout","href":"tikvrequestTimeout","type":2,"isActive":false},{"label":"tikv.snapshotScanSize","href":"tikvsnapshotScanSize","type":2,"isActive":false},{"label":"tikv.ssl.enabled","href":"tikvsslenabled","type":2,"isActive":false},{"label":"tikv.ssl.tlsCert","href":"tikvssltlsCert","type":2,"isActive":false},{"label":"tikv.ssl.tlsKey","href":"tikvssltlsKey","type":2,"isActive":false},{"label":"tikv.ssl.tlsCACert","href":"tikvssltlsCACert","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.md b/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.md new file mode 100644 index 000000000..3bfcdd9f0 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_tikv.md @@ -0,0 +1,314 @@ +--- +id: configure_tikv.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi tikv untuk Milvus. +--- +

    Konfigurasi terkait tikv

    Konfigurasi terkait tikv, digunakan untuk menyimpan metadata Milvus.

    +

    Perhatikan bahwa ketika TiKV diaktifkan untuk metastore, Anda masih perlu memiliki etcd untuk penemuan layanan.

    +

    TiKV adalah pilihan yang baik ketika ukuran metadata membutuhkan skalabilitas horizontal yang lebih baik.

    +

    tikv.endpoints

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Perhatikan bahwa port pd default tikv adalah 2379, yang bertentangan dengan etcd. 127.0.0.1:2389
    +

    tikv.rootPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Jalur root di mana data disimpan dalam tikv by-dev
    +

    tikv.metaSubPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    metaRootPath = rootPath + '/' + metaSubPath meta
    +

    tikv.kvSubPath

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    kvRootPath = rootPath + '/' + kvSubPath kv
    +

    tikv.requestTimeout

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ms, batas waktu permintaan tikv 10000
    +

    tikv.snapshotScanSize

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ukuran batch pemindaian snapshot tikv 256
    +

    tikv.ssl.enabled

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    Apakah akan mendukung mode koneksi aman TiKV salah
    +

    tikv.ssl.tlsCert

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file sertifikat Anda
    +

    tikv.ssl.tlsKey

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file kunci Anda
    +

    tikv.ssl.tlsCACert

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    jalur ke file CACert Anda
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_tls.json b/localization/v2.5.x/site/id/reference/sys_config/configure_tls.json new file mode 100644 index 000000000..f27d6da7f --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_tls.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tls-related Configurations","anchorList":[{"label":"Konfigurasi terkait tls","href":"tls-related-Configurations","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_tls.md b/localization/v2.5.x/site/id/reference/sys_config/configure_tls.md new file mode 100644 index 000000000..52842b3a3 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_tls.md @@ -0,0 +1,22 @@ +--- +id: configure_tls.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi tls untuk Milvus. +--- +

    Konfigurasi terkait tls

    Konfigurasikan pengaktifan tls proxy.

    diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_trace.json b/localization/v2.5.x/site/id/reference/sys_config/configure_trace.json new file mode 100644 index 000000000..411fb3a63 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_trace.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"trace-related Configurations","anchorList":[{"label":"Konfigurasi terkait jejak","href":"trace-related-Configurations","type":1,"isActive":false},{"label":"trace.exporter","href":"traceexporter","type":2,"isActive":false},{"label":"trace.sampleFraction","href":"tracesampleFraction","type":2,"isActive":false},{"label":"trace.jaeger.url","href":"tracejaegerurl","type":2,"isActive":false},{"label":"trace.otlp.endpoint","href":"traceotlpendpoint","type":2,"isActive":false},{"label":"trace.otlp.method","href":"traceotlpmethod","type":2,"isActive":false},{"label":"trace.initTimeoutSeconds","href":"traceinitTimeoutSeconds","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/configure_trace.md b/localization/v2.5.x/site/id/reference/sys_config/configure_trace.md new file mode 100644 index 000000000..c0639e77e --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/configure_trace.md @@ -0,0 +1,200 @@ +--- +id: configure_trace.md +related_key: configure +group: system_configuration.md +summary: Pelajari cara mengonfigurasi jejak untuk Milvus. +--- +

    Konfigurasi terkait jejak

    trace.exporter

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    +
  • jenis pengekspor jejak, defaultnya adalah stdout,
  • +
  • nilai opsional: ['noop','stdout', 'jaeger', 'otlp']
  • noop
    +

    trace.sampleFraction

    + + + + + + + + + + + + +
    DeskripsiNilai default
    +
  • pecahan dari sampel berbasis traceID,
  • +
  • nilai opsional: [0, 1]
  • +
  • Pecahan >= 1 akan selalu menjadi sampel. Pecahan <0 akan dianggap nol.
  • 0
    +

    trace.jaeger.url

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    ketika eksportir adalah jaeger harus mengatur URL jaeger
    +

    trace.otlp.endpoint

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    contoh: "127.0.0.1:4317" untuk grpc, "127.0.0.1:4318" untuk http
    +

    trace.otlp.method

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    metode ekspor otlp, nilai yang dapat diterima: ["grpc", "http"], menggunakan "grpc" secara default
    +

    trace.initTimeoutSeconds

    + + + + + + + + + + + + +
    DeskripsiNilai Default
    batas waktu inisialisasi segcore dalam hitungan detik, mencegah otlp grpc hang selamanya 10
    diff --git a/localization/v2.5.x/site/id/reference/sys_config/system_configuration.json b/localization/v2.5.x/site/id/reference/sys_config/system_configuration.json new file mode 100644 index 000000000..8ce39ec90 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/system_configuration.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus System Configurations Checklist","anchorList":[{"label":"Daftar Periksa Konfigurasi Sistem Milvus","href":"Milvus-System-Configurations-Checklist","type":1,"isActive":false},{"label":"Bagian","href":"Sections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/sys_config/system_configuration.md b/localization/v2.5.x/site/id/reference/sys_config/system_configuration.md new file mode 100644 index 000000000..c40f481ac --- /dev/null +++ b/localization/v2.5.x/site/id/reference/sys_config/system_configuration.md @@ -0,0 +1,129 @@ +--- +id: system_configuration.md +related_key: configure +group: system_configuration.md +summary: Pelajari tentang konfigurasi sistem Milvus. +--- +

    Daftar Periksa Konfigurasi Sistem Milvus

    Topik ini memperkenalkan bagian umum dari konfigurasi sistem pada Milvus.

    +

    Milvus memiliki banyak sekali parameter yang mengonfigurasi sistem. Setiap konfigurasi memiliki nilai default yang dapat digunakan secara langsung. Anda dapat memodifikasi parameter-parameter ini secara fleksibel sehingga Milvus dapat melayani aplikasi Anda dengan lebih baik. Lihat Mengkonfigurasi Milvus untuk informasi lebih lanjut.

    +
    +Pada rilis saat ini, semua parameter hanya berlaku setelah dikonfigurasi pada saat Milvus dijalankan.
    +

    Bagian

    Untuk kemudahan pemeliharaan, Milvus mengklasifikasikan konfigurasinya ke dalam beberapa bagian berdasarkan komponen, ketergantungan, dan penggunaan secara umum.

    +

    etcd

    Konfigurasi terkait etcd, digunakan untuk menyimpan metadata Milvus & penemuan layanan.

    +

    Lihat Konfigurasi terkait etcd untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    metastore

    Lihat Konfigurasi terkait metastore untuk penjelasan rinci untuk setiap parameter pada bagian ini.

    +

    tikv

    Konfigurasi terkait tikv, digunakan untuk menyimpan metadata Milvus.

    +

    Perhatikan bahwa ketika TiKV diaktifkan untuk metastore, Anda masih perlu memiliki etcd untuk penemuan layanan.

    +

    TiKV adalah pilihan yang baik ketika ukuran metadata membutuhkan skalabilitas horizontal yang lebih baik.

    +

    Lihat Konfigurasi terkait tikv untuk penjelasan terperinci untuk setiap parameter di bagian ini.

    +

    localStorage

    Lihat Konfigurasi terkait localStorage untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    minio

    Konfigurasi terkait MinIO/S3/GCS atau layanan lainnya mendukung API S3, yang bertanggung jawab atas persistensi data untuk Milvus.

    +

    Kami menyebut layanan penyimpanan sebagai MinIO/S3 dalam deskripsi berikut ini untuk mempermudah.

    +

    Lihat Konfigurasi terkait MinIO untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    mq

    Milvus mendukung empat MQ: rocksmq (berbasis RockDB), natsmq (embedded nats-server), Pulsar, dan Kafka.

    +

    Anda dapat mengubah mq Anda dengan mengatur bidang mq.type.

    +

    Jika Anda tidak mengatur bidang mq.type sebagai default, ada catatan tentang mengaktifkan prioritas jika kita mengkonfigurasi beberapa mq dalam berkas ini.

    +
      +
    1. mode standalone (lokal): rocksmq (default) > natsmq > Pulsar > Kafka

    2. +
    3. mode cluster: Pulsar(default) > Kafka (rocksmq dan natsmq tidak didukung dalam mode cluster)

    4. +
    +

    Lihat Konfigurasi terkait mq untuk penjelasan rinci untuk setiap parameter pada bagian ini.

    +

    pulsar

    Konfigurasi terkait pulsar, digunakan untuk mengelola log Milvus dari operasi mutasi terkini, log streaming keluaran, dan menyediakan layanan berlangganan-publikasi log.

    +

    Lihat Konfigurasi terkait pulsar untuk penjelasan rinci untuk setiap parameter pada bagian ini.

    +

    rocksmq

    Jika Anda ingin mengaktifkan kafka, Anda perlu mengomentari konfigurasi pulsar

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslKata Sandi:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout: 10

    +

    Lihat Konfigurasi terkait rocksmq untuk penjelasan mendetail untuk setiap parameter dalam bagian ini.

    +

    natsmq

    konfigurasi natsmq.

    +

    detail lebih lanjut: https://docs.nats.io/running-a-nats-service/configuration

    +

    Lihat Konfigurasi terkait natsmq untuk penjelasan mendetail untuk setiap parameter pada bagian ini.

    +

    rootCoord

    Konfigurasi terkait rootCoord, yang digunakan untuk menangani permintaan bahasa definisi data (DDL) dan bahasa kontrol data (DCL)

    +

    Lihat Konfigurasi terkait rootCoord untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    proxy

    Konfigurasi terkait proxy, digunakan untuk memvalidasi permintaan klien dan mengurangi hasil yang dikembalikan.

    +

    Lihat Konfigurasi terkait proxy untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    queryCoord

    Konfigurasi terkait queryCoord, digunakan untuk mengelola topologi dan penyeimbangan beban untuk node kueri, dan handoff dari segmen yang sedang berkembang ke segmen yang disegel.

    +

    Lihat Konfigurasi terkait queryCoord untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    queryNode

    Konfigurasi terkait queryNode, digunakan untuk menjalankan pencarian hibrida antara data vektor dan skalar.

    +

    Lihat Konfigurasi terkait queryNode untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    indexCoord

    Lihat Konfigurasi terkait indexCoord untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    indexNode

    Lihat Konfigurasi terkait indexNode untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    dataCoord

    Lihat Konfigurasi terkait dataCoord untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    dataNode

    Lihat Konfigurasi terkait dataNode untuk penjelasan rinci untuk setiap parameter dalam bagian ini.

    +

    msgChannel

    Topik ini memperkenalkan konfigurasi terkait saluran pesan pada Milvus.

    +

    Lihat Konfigurasi terkait saluran pesan untuk penjelasan rinci untuk setiap parameter dalam bagian ini.

    +

    log

    Mengkonfigurasi output log sistem.

    +

    Lihat Konfigurasi terkait log untuk penjelasan rinci untuk setiap parameter dalam bagian ini.

    +

    grpc

    Lihat Konfigurasi terkait grpc untuk penjelasan rinci untuk setiap parameter dalam bagian ini.

    +

    tls

    Mengonfigurasi pengaktifan tls proxy.

    +

    Lihat Konfigurasi terkait tls untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    common

    Lihat Konfigurasi terkait umum untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    quotaAndLimits

    QuotaConfig, konfigurasi kuota dan batas Milvus.

    +

    Secara default, kami mengaktifkan:

    +
      +
    1. Perlindungan TT;

    2. +
    3. Perlindungan memori.

    4. +
    5. Perlindungan kuota disk.

    6. +
    +

    Anda dapat mengaktifkan:

    +
      +
    1. Batasan throughput DML;

    2. +
    3. Batasan DDL, DQL qps/rps;

    4. +
    5. Perlindungan panjang antrean/latensi DQL;

    6. +
    7. Perlindungan tingkat hasil DQL;

    8. +
    +

    Jika perlu, Anda juga dapat secara manual menolak permintaan RW.

    +

    Lihat Konfigurasi terkait kuota dan batasan untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    trace

    Lihat Konfigurasi terkait jejak untuk penjelasan rinci untuk setiap parameter di bagian ini.

    +

    gpu

    #Saat menggunakan pengindeksan GPU, Milvus akan menggunakan kumpulan memori untuk menghindari alokasi dan deallokasi memori yang sering terjadi.

    +

    #Di sini, Anda dapat mengatur ukuran memori yang ditempati oleh pool memori, dengan satuan MB.

    +

    #Perhatikan bahwa ada kemungkinan Milvus mengalami crash ketika permintaan memori aktual melebihi nilai yang ditetapkan oleh maxMemSize.

    +

    #Jika initMemSize dan MaxMemSize keduanya bernilai nol,

    +

    #milvus akan secara otomatis menginisialisasi setengah dari memori GPU yang tersedia,

    +

    #maxMemSize akan menginisialisasi seluruh memori GPU yang tersedia.

    +

    Lihat Konfigurasi terkait GPU untuk penjelasan rinci untuk setiap parameter pada bagian ini.

    diff --git a/localization/v2.5.x/site/id/reference/time_sync.json b/localization/v2.5.x/site/id/reference/time_sync.json new file mode 100644 index 000000000..89af1816f --- /dev/null +++ b/localization/v2.5.x/site/id/reference/time_sync.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Time Synchronization","anchorList":[{"label":"Sinkronisasi Waktu","href":"Time-Synchronization","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Timestamp oracle (TSO)","href":"Timestamp-oracle-TSO","type":2,"isActive":false},{"label":"Sistem sinkronisasi waktu (timetick)","href":"Time-synchronization-system-timetick","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/time_sync.md b/localization/v2.5.x/site/id/reference/time_sync.md new file mode 100644 index 000000000..62fe07812 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/time_sync.md @@ -0,0 +1,161 @@ +--- +id: time_sync.md +title: Sinkronisasi Waktu +summary: Pelajari tentang sistem sinkronisasi waktu di Milvus. +--- +

    Sinkronisasi Waktu

    Topik ini memperkenalkan mekanisme sinkronisasi waktu di Milvus.

    +

    Gambaran Umum

    Kejadian-kejadian dalam Milvus secara umum dapat dikategorikan ke dalam dua jenis:

    +
      +
    • Peristiwa bahasa definisi data (DDL): membuat/menghapus koleksi, membuat/menghapus partisi, dsb.

    • +
    • Peristiwa bahasa manipulasi data (DML): menyisipkan, mencari, dll.

    • +
    +

    Setiap kejadian, baik kejadian DDL maupun DML, ditandai dengan stempel waktu yang dapat mengindikasikan kapan kejadian tersebut terjadi.

    +

    Misalkan ada dua pengguna yang memulai serangkaian kejadian DML dan DDL di Milvus dengan urutan waktu yang ditunjukkan pada tabel berikut.

    + + + + + + + + + + + + + + +
    Stempel waktuPengguna 1Pengguna 2
    t0Membuat koleksi bernama C0./
    t2/Melakukan pencarian pada koleksi C0.
    t5Memasukkan data A1 ke dalam koleksi C0./
    t7/Melakukan pencarian pada koleksi C0.
    t10Memasukkan data A2 ke dalam koleksi C0./
    t12/Melakukan pencarian pada koleksi C0
    t15Menghapus data A1 dari koleksi C0./
    t17/Melakukan pencarian pada koleksi C0
    +

    Idealnya, pengguna 2 harus dapat melihat:

    +
      +
    • Koleksi kosong C0 di t2.

    • +
    • Data A1 di t7.

    • +
    • Kedua data A1 dan A2 di t12.

    • +
    • Hanya data A2 di t17 (karena data A1 telah dihapus dari koleksi sebelum titik ini).

    • +
    +

    Skenario ideal ini dapat dengan mudah dicapai ketika hanya ada satu simpul tunggal. Namun, Milvus adalah basis data vektor terdistribusi, dan untuk memastikan semua operasi DML dan DDL pada node yang berbeda tetap teratur, Milvus perlu mengatasi dua masalah berikut:

    +
      +
    1. Jam waktu berbeda untuk dua pengguna pada contoh di atas jika mereka berada pada node yang berbeda. Sebagai contoh, jika pengguna 2 24 jam di belakang pengguna 1, semua operasi oleh pengguna 1 tidak terlihat oleh pengguna 2 sampai hari berikutnya.

    2. +
    3. Mungkin ada latensi jaringan. Jika pengguna 2 melakukan pencarian pada koleksi C0 di t17, Milvus harus dapat menjamin bahwa semua operasi sebelum t17 berhasil diproses dan diselesaikan. Jika operasi hapus di t15 tertunda karena latensi jaringan, sangat mungkin pengguna 2 masih dapat melihat data yang seharusnya dihapus A1 ketika melakukan pencarian di t17.

    4. +
    +

    Oleh karena itu, Milvus mengadopsi sistem sinkronisasi waktu (timetick) untuk mengatasi masalah ini.

    +

    Timestamp oracle (TSO)

    Untuk mengatasi masalah pertama yang disebutkan di bagian sebelumnya, Milvus, seperti sistem terdistribusi lainnya, menyediakan layanan timestamp oracle (TSO). Ini berarti bahwa semua kejadian di Milvus harus dialokasikan dengan cap waktu dari TSO dan bukan dari jam lokal.

    +

    Layanan TSO disediakan oleh koordinator root di Milvus. Klien dapat mengalokasikan satu atau beberapa stempel waktu dalam satu permintaan alokasi stempel waktu.

    +

    Stempel waktu TSO adalah jenis nilai uint64 yang terdiri dari bagian fisik dan bagian logis. Gambar di bawah ini menunjukkan format stempel waktu.

    +

    + + TSO_Timestamp + TSO_Timestamp.

    +

    Seperti yang diilustrasikan, 46 bit di awal adalah bagian fisik, yaitu waktu UTC dalam milidetik. 18 bit terakhir adalah bagian logis.

    +

    Sistem sinkronisasi waktu (timetick)

    Bagian ini menggunakan contoh operasi penyisipan data untuk menjelaskan mekanisme sinkronisasi waktu dalam Milvus.

    +

    Ketika proxy menerima permintaan penyisipan data dari SDK, proxy membagi pesan-pesan penyisipan ke dalam beberapa aliran pesan (MsgStream) sesuai dengan nilai hash dari kunci utama.

    +

    Setiap pesan penyisipan (InsertMsg) diberi stempel waktu sebelum dikirim ke MsgStream.

    +
    + MsgStream adalah pembungkus dari antrian pesan, yang secara default adalah Pulsar di Milvus 2.0.
    +

    + + timesync_proxy_insert_msg + timesync_proxy_insert_msg

    +

    Satu prinsip umum adalah bahwa dalam MsgStream, penanda waktu dariInsertMsgs dari proxy yang sama harus bersifat inkremental. Namun, tidak ada aturan seperti itu untuk InsertMsgs dari proxy yang berbeda.

    +

    Gambar berikut ini adalah contoh InsertMsgs dalam MsgStream. Cuplikan ini berisi lima InsertMsgs, tiga di antaranya berasal dari Proxy1 dan sisanya dari Proxy2.

    +

    + + msgstream + msgstream

    +

    Stempel waktu dari tiga InsertMsgs dari Proxy1 bersifat inkremental, begitu juga dengan dua InsertMsgs dari Proxy2. Namun, tidak ada urutan tertentu di antara Proxy1 dan Proxy2 InsertMsgs .

    +

    Salah satu skenario yang mungkin terjadi adalah ketika membaca pesan dengan timestamp 110 dari Proxy2, Milvus menemukan bahwa pesan dengan timestamp 80 dari Proxy1 masih berada di dalam MsgStream. Oleh karena itu, Milvus memperkenalkan sistem sinkronisasi waktu, timetick, untuk memastikan bahwa ketika membaca pesan dari MsgStream, semua pesan dengan nilai timestamp yang lebih kecil harus dikonsumsi.

    +

    + + time_synchronization + time_synchronization

    +

    Seperti yang ditunjukkan pada gambar di atas,

    +
      +
    • Setiap proxy secara berkala (setiap 200 ms secara default) melaporkan nilai cap waktu terbesar dari InsertMsg terbaru di MsgStreamke root coord.

    • +
    • Root coord mengidentifikasi nilai stempel waktu minimum pada Msgstream ini, tidak peduli pada proxy mana InsertMsgs itu berada. Kemudian root coord menyisipkan stempel waktu minimum ini ke dalam Msgstream. Stempel waktu ini juga disebut timetick.

    • +
    • Ketika komponen konsumen membaca timetick yang disisipkan oleh root coord, mereka memahami bahwa semua pesan sisipan dengan nilai timestamp yang lebih kecil telah dikonsumsi. Oleh karena itu, permintaan yang relevan dapat dieksekusi dengan aman tanpa mengganggu pesanan.

    • +
    +

    Gambar berikut ini adalah contoh dari Msgstream dengan timetick yang disisipkan.

    +

    + + timetick + timetick

    +

    MsgStream memproses pesan dalam batch sesuai dengan tanda waktu untuk memastikan bahwa pesan keluaran memenuhi persyaratan cap waktu. Pada contoh di atas, ini akan mengkonsumsi semua catatan kecuali InsertMsgs dari Proxy2 di Timestamp: 120 karena ini adalah setelah TimeTick terbaru.

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/reference/timestamp.json b/localization/v2.5.x/site/id/reference/timestamp.json new file mode 100644 index 000000000..abe16f081 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/timestamp.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Timestamp","anchorList":[{"label":"Cap waktu","href":"Timestamp","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview","type":2,"isActive":false},{"label":"Parameter stempel waktu","href":"Timestamp-parameters","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/reference/timestamp.md b/localization/v2.5.x/site/id/reference/timestamp.md new file mode 100644 index 000000000..33bb751e0 --- /dev/null +++ b/localization/v2.5.x/site/id/reference/timestamp.md @@ -0,0 +1,109 @@ +--- +id: timestamp.md +title: Stempel waktu di Milvus +summary: >- + Pelajari tentang konsep cap waktu dan empat parameter utama terkait cap waktu + dalam basis data vektor Milvus. +--- +

    Cap waktu

    Topik ini menjelaskan konsep cap waktu dan memperkenalkan empat parameter utama terkait cap waktu dalam basis data vektor Milvus.

    +

    Ikhtisar

    Milvus adalah basis data vektor yang dapat mencari dan menanyakan vektor yang dikonversi dari data yang tidak terstruktur. Ketika melakukan operasi bahasa manipulasi data (DML), termasuk penyisipan dan penghapusan data, Milvus memberikan stempel waktu ke entitas yang terlibat dalam operasi. Oleh karena itu, semua entitas di Milvus memiliki atribut stempel waktu. Dan kumpulan entitas dalam operasi DML yang sama memiliki nilai stempel waktu yang sama.

    +

    Parameter stempel waktu

    Beberapa parameter terkait cap waktu dilibatkan ketika Anda melakukan pencarian atau kueri kemiripan vektor di Milvus.

    +
      +
    • Guarantee_timestamp

    • +
    • Service_timestamp

    • +
    • Graceful_time

    • +
    • Travel_timestamp

    • +
    +

    Guarantee_timestamp

    Guarantee_timestamp adalah jenis cap waktu yang digunakan untuk memastikan bahwa semua pembaruan data oleh operasi DML sebelum Guarantee_timestamp terlihat ketika pencarian atau kueri kemiripan vektor dilakukan. Sebagai contoh, jika Anda memasukkan satu kumpulan data pada pukul 3 sore, kumpulan data lainnya pada pukul 5 sore, dan nilai Guarantee_timestamp ditetapkan sebagai pukul 6 sore saat pencarian kemiripan vektor. Ini berarti bahwa dua kumpulan data yang dimasukkan pada pukul 3 sore dan 5 sore harus dilibatkan dalam pencarian.

    +

    Jika Guarantee_timestamp tidak dikonfigurasi, Milvus secara otomatis mengambil titik waktu ketika permintaan pencarian dibuat. Oleh karena itu, pencarian dilakukan pada tampilan data dengan semua pembaruan data oleh operasi DML sebelum pencarian.

    +

    Untuk menghemat waktu Anda dalam memahami TSO di dalam Milvus, sebagai pengguna, Anda tidak perlu mengkonfigurasi secara langsung parameter Guarantee_timestamp. Anda hanya perlu memilih tingkat konsistensi, dan Milvus secara otomatis menangani parameter Guarantee_timestamp untuk Anda. Setiap tingkat konsistensi sesuai dengan nilai Guarantee_timestamp tertentu.

    +

    + + Guarantee_Timestamp + Guarantee_Timestamp.

    +

    Contoh

    Seperti yang ditunjukkan pada ilustrasi di atas, nilai Guarantee_timestamp ditetapkan sebagai 2021-08-26T18:15:00 (untuk mempermudah, stempel waktu pada contoh ini diwakili oleh waktu fisik). Saat Anda melakukan pencarian atau kueri, semua data sebelum 2021-08-26T18:15:00 akan dicari atau ditanyakan.

    +

    Service_timestamp

    Service_timestamp adalah jenis stempel waktu yang secara otomatis dibuat dan dikelola oleh node kueri di Milvus. Ini digunakan untuk menunjukkan operasi DML mana yang dijalankan oleh node kueri.

    +

    Data yang dikelola oleh node kueri dapat dikategorikan ke dalam dua jenis:

    +
      +
    • Data historis (atau juga disebut data batch)

    • +
    • Data tambahan (atau disebut juga data streaming).

    • +
    +

    Di Milvus, Anda perlu memuat data sebelum melakukan pencarian atau kueri. Oleh karena itu, data batch dalam koleksi dimuat oleh simpul kueri sebelum permintaan pencarian atau kueri dibuat. Namun, data streaming dimasukkan ke dalam atau dihapus dari Milvus dengan cepat, yang mengharuskan simpul kueri untuk menyimpan garis waktu operasi DML dan permintaan pencarian atau kueri. Akibatnya, node kueri menggunakan Service_timestamp untuk menyimpan garis waktu tersebut. Service_timestamp dapat dilihat sebagai titik waktu ketika data tertentu terlihat karena node kueri dapat memastikan bahwa semua operasi DML sebelum Service_timestamp telah selesai.

    +

    Ketika ada permintaan pencarian atau kueri yang masuk, node kueri membandingkan nilai Service_timestamp dan Guarantee_timestamp. Terutama ada dua skenario.

    +

    + + Service_Timestamp + Stempel Waktu Layanan.

    +

    Skenario 1: Service_timestamp >= Guarantee_timestamp

    Seperti yang ditunjukkan pada gambar 1, nilai Guarantee_timestamp ditetapkan sebagai 2021-08-26T18:15:00. Ketika nilai Service_timestamp bertambah menjadi 2021-08-26T18:15:01, ini berarti bahwa semua operasi DML sebelum titik waktu ini dieksekusi dan diselesaikan oleh node kueri, termasuk operasi DML sebelum waktu yang ditunjukkan oleh Guarantee_timestamp. Hasilnya, permintaan pencarian atau permintaan kueri dapat dieksekusi dengan segera.

    +

    Skenario 2: Service_timestamp < Guarantee_timestamp

    Seperti yang ditunjukkan pada gambar 2, nilai Guarantee_timestamp ditetapkan sebagai 2021-08-26T18:15:00, dan nilai Service_timestamp saat ini hanya 2021-08-26T18:14:55. Ini berarti bahwa hanya operasi DML sebelum 2021-08-26T18:14:55 yang dieksekusi dan diselesaikan, meninggalkan bagian dari operasi DML setelah titik waktu ini tetapi sebelum Guarantee_timestamp yang belum selesai. Jika pencarian atau kueri dieksekusi pada titik ini, beberapa data yang diperlukan tidak terlihat dan belum tersedia, yang secara serius memengaruhi keakuratan hasil pencarian atau kueri. Oleh karena itu, simpul kueri perlu menunda permintaan pencarian atau kueri hingga operasi DML sebelum guarantee_timestamp selesai (yaitu ketika Service_timestamp >= Guarantee_timestamp).

    +

    Graceful_time

    Secara teknis, Graceful_time bukanlah cap waktu, melainkan periode waktu (misalnya 100ms). Namun, Graceful_time layak disebut karena sangat terkait dengan Guarantee_timestamp dan Service_timestamp. Graceful_time adalah parameter yang dapat dikonfigurasi dalam file konfigurasi Milvus. Parameter ini digunakan untuk menunjukkan periode waktu yang dapat ditoleransi sebelum data tertentu terlihat. Singkatnya, operasi DML yang belum selesai selama Graceful_time dapat ditoleransi.

    +

    Ketika ada permintaan pencarian atau permintaan kueri yang masuk, ada dua skenario.

    +

    + + Graceful_Time + Graceful_Time.

    +

    Skenario 1: Service_timestamp + Graceful_time >= Guarantee_timestamp

    Seperti yang ditunjukkan pada gambar 1, nilai Guarantee_timestamp ditetapkan sebagai 2021-08-26T18:15:01, dan Graceful_time sebagai 2s. Nilai Service_timestamp bertambah menjadi 2021-08-26T18:15:00. Meskipun nilai Service_timestamp masih lebih kecil daripada Guarantee_timestamp dan tidak semua operasi DML sebelum 2021-08-26T18:15:01 selesai, periode ketidaktampakan data selama 2 detik masih dapat ditoleransi seperti yang ditunjukkan oleh nilai Graceful_time. Oleh karena itu, permintaan pencarian atau permintaan kueri yang masuk dapat segera dieksekusi.

    +

    Skenario 2: Service_timestamp + Graceful_time < Guarantee_timestamp

    Seperti yang ditunjukkan pada gambar 2, nilai Guarantee_timestamp ditetapkan sebagai 2021-08-26T18:15:01, dan Graceful_time sebagai 2s. Nilai saat ini dari Service_timestamp hanya 2021-08-26T18:14:54. Ini berarti bahwa operasi DML yang diharapkan belum selesai dan bahkan dengan adanya waktu tenggang 2 detik, ketidaktampakan data masih tidak dapat ditoleransi. Oleh karena itu, simpul kueri perlu menunda pencarian atau permintaan kueri hingga permintaan DML tertentu selesai (yaitu ketika Service_timestamp + Graceful_time >= Guarantee_timestamp).

    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/release_notes.json b/localization/v2.5.x/site/id/release_notes.json new file mode 100644 index 000000000..64308a6aa --- /dev/null +++ b/localization/v2.5.x/site/id/release_notes.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Release Notes","anchorList":[{"label":"Catatan Rilis","href":"Release-Notes","type":1,"isActive":false},{"label":"v2.5.3","href":"v253","type":2,"isActive":false},{"label":"v2.5.2","href":"v252","type":2,"isActive":false},{"label":"v2.5.1","href":"v251","type":2,"isActive":false},{"label":"v2.5.0","href":"v250","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/release_notes.md b/localization/v2.5.x/site/id/release_notes.md new file mode 100644 index 000000000..1d8fcecf7 --- /dev/null +++ b/localization/v2.5.x/site/id/release_notes.md @@ -0,0 +1,210 @@ +--- +id: release_notes.md +summary: Catatan Rilis Milvus +title: Catatan Rilis +--- +

    Catatan Rilis

    Cari tahu apa yang baru di Milvus! Halaman ini merangkum fitur-fitur baru, peningkatan, masalah yang diketahui, dan perbaikan bug di setiap rilis. Anda dapat menemukan catatan rilis untuk setiap versi yang dirilis setelah v2.5.0 di bagian ini. Kami menyarankan agar Anda secara teratur mengunjungi halaman ini untuk mempelajari tentang pembaruan.

    +

    v2.5.3

    Tanggal rilis: 13 Januari 2025

    + + + + + + + +
    Versi MilvusVersi Python SDKVersi SDK Node.jsVersi Java SDK
    2.5.32.5.32.5.32.5.4
    +

    Milvus 2.5.3 memberikan perbaikan bug kritis dan peningkatan kinerja untuk meningkatkan stabilitas, keandalan, dan kegunaan secara keseluruhan. Versi ini menyempurnakan penanganan konkurensi, meningkatkan pengindeksan dan pengambilan data, dan memperbarui beberapa komponen utama untuk pengalaman pengguna yang lebih kuat.

    +

    Perbaikan bug

      +
    • Memperbaiki masalah di mana menggunakan filter IN pada kunci utama VARCHAR dapat mengembalikan hasil yang kosong.(#39108)
    • +
    • Memperbaiki masalah konkurensi antara operasi query dan delete yang dapat menyebabkan hasil yang salah.(#39054)
    • +
    • Memperbaiki kegagalan yang disebabkan oleh pemfilteran berulang ketika expr kosong dalam permintaan kueri.(#39034)
    • +
    • Memperbaiki masalah di mana kesalahan disk selama pembaruan konfigurasi menyebabkan penggunaan pengaturan konfigurasi default.(#39072)
    • +
    • Memperbaiki potensi kehilangan data yang dihapus karena pemadatan clustering.(#39133)
    • +
    • Memperbaiki kueri pencocokan teks yang rusak di segmen data yang sedang tumbuh.(#39113)
    • +
    • Memperbaiki kegagalan pengambilan yang disebabkan oleh indeks yang tidak berisi data asli untuk vektor yang jarang.(#39146)
    • +
    • Memperbaiki kemungkinan kondisi perlombaan bidang kolom yang disebabkan oleh kueri dan pemuatan data secara bersamaan.(#39152)
    • +
    • Memperbaiki kegagalan penyisipan massal ketika bidang yang dapat dinullkan atau nilai_default tidak disertakan dalam data.(#39111)
    • +
    +

    Perbaikan

      +
    • Menambahkan API grup sumber daya untuk antarmuka RESTful.(#39092)
    • +
    • Mengoptimalkan kinerja pengambilan dengan memanfaatkan metode bitset SIMD.(#39041)
    • +
    • Menggunakan stempel waktu MVCC sebagai stempel waktu jaminan saat ditentukan.(#39019)
    • +
    • Menambahkan metrik penghapusan yang hilang.(#38747)
    • +
    • Memperbarui Etcd ke versi v3.5.16.(#38969)
    • +
    • Membuat paket Go baru untuk mengelola protos.(#39128)
    • +
    +

    v2.5.2

    Tanggal rilis: 3 Januari 2025

    + + + + + + + +
    Versi MilvusVersi Python SDKVersi SDK Node.jsVersi Java SDK
    2.5.22.5.32.5.32.5.3
    +

    Milvus 2.5.2 mendukung modifikasi panjang maksimum untuk kolom VARCHAR dan menyelesaikan beberapa masalah kritis yang berkaitan dengan konkurensi, partisi drop, dan penanganan statistik BM25 selama impor. Kami sangat menyarankan untuk melakukan upgrade ke versi ini untuk meningkatkan stabilitas dan performa.

    +

    Peningkatan

      +
    • Menghasilkan log penggunaan disk hanya jika jalur yang ditentukan tidak ada.(#38822)
    • +
    • Menambahkan parameter untuk menyetel panjang VARCHAR maksimum dan mengembalikan batasnya ke 65.535.(#38883)
    • +
    • Mendukung konversi tipe parameter untuk ekspresi.(#38782)
    • +
    +

    Perbaikan bug

      +
    • Memperbaiki potensi kebuntuan dalam skenario konkurensi.(#38863)
    • +
    • Menghasilkan file index_null_offset hanya untuk bidang yang mendukung nilai nol.(#38834)
    • +
    • Memperbaiki penggunaan paket retrieve setelah bebas dalam fase pengurangan.(#38841)
    • +
    • Mengenali ekspresi dengan huruf besar AND dan OR.(#38928)
    • +
    • Mengizinkan penurunan partisi yang berhasil meskipun pemuatan gagal.(#38874)
    • +
    • Memperbaiki masalah registrasi file statistik BM25 selama impor.(#38881)
    • +
    +

    v2.5.1

    Tanggal rilis: 26 Desember 2024

    + + + + + + + +
    Versi MilvusVersi Python SDKVersi SDK Node.jsVersi Java SDK
    2.5.12.5.22.5.22.5.2
    +

    Milvus 2.5.1 berfokus pada serangkaian perbaikan bug yang menangani pemuatan memori, daftar RBAC, penyeimbangan simpul kueri, dan pengindeksan segmen tersegel, sementara juga meningkatkan UI Web dan penyadap. Kami sangat menyarankan untuk meningkatkan ke 2.5.1 untuk meningkatkan stabilitas dan keandalan.

    +

    Peningkatan

      +
    • Memperbarui halaman koleksi dan kueri UI web.(#38701)
    • +
    +

    Perbaikan bug

      +
    • Memperbaiki masalah OOM dengan menambahkan faktor memori untuk estimasi pemuatan.(#38722)
    • +
    • Memperbaiki perluasan grup hak istimewa saat mencantumkan kebijakan di RootCoord.(#38760)
    • +
    • Memperbaiki masalah dengan daftar grup hak istimewa dan koleksi.(#38738)
    • +
    • Memperbaiki penyeimbang untuk menghindari kelebihan beban berulang kali pada simpul kueri yang sama.(#38724)
    • +
    • Memperbaiki tugas keseimbangan yang tidak terduga yang dipicu setelah QueryCoord dimulai ulang.(#38725)
    • +
    • Memperbaiki pembaruan konfigurasi beban yang tidak berlaku untuk memuat koleksi.(#38737)
    • +
    • Memperbaiki jumlah pembacaan nol selama impor data.(#38695)
    • +
    • Memperbaiki decoding Unicode untuk kunci JSON dalam ekspresi.(#38653)
    • +
    • Memperbaiki nama DB pencegat untuk alterCollectionField di 2.5. (#38663)
    • +
    • Memperbaiki parameter indeks kosong untuk segmen yang disegel saat menggunakan pencarian brute force BM25.(#38752)
    • +
    +

    v2.5.0

    Tanggal rilis: 23 Desember 2024

    + + + + + + + +
    Versi MilvusVersi Python SDKVersi SDK Node.jsVersi Java SDK
    2.5.02.5.12.5.22.5.2
    +

    Milvus 2.5.0 membawa kemajuan yang signifikan untuk meningkatkan kegunaan, skalabilitas, dan kinerja bagi pengguna yang berurusan dengan pencarian vektor dan manajemen data berskala besar. Dengan rilis ini, Milvus mengintegrasikan fitur-fitur baru yang kuat seperti pencarian berbasis istilah, pemadatan klaster untuk kueri yang dioptimalkan, dan dukungan serbaguna untuk metode pencarian vektor yang jarang dan padat. Peningkatan dalam manajemen klaster, pengindeksan, dan penanganan data memperkenalkan tingkat fleksibilitas dan kemudahan penggunaan yang baru, membuat Milvus menjadi basis data vektor yang lebih kuat dan mudah digunakan.

    +

    Fitur Utama

    Milvus 2.5 mendukung pencarian teks lengkap yang diimplementasikan dengan Sparse-BM25! Fitur ini merupakan pelengkap penting bagi kemampuan pencarian semantik Milvus yang kuat, terutama dalam skenario yang melibatkan kata-kata langka atau istilah teknis. Pada versi sebelumnya, Milvus mendukung vektor jarang untuk membantu skenario pencarian kata kunci. Vektor-vektor jarang ini dihasilkan di luar Milvus oleh model neural seperti SPLADEv2/BGE-M3 atau model statistik seperti algoritma BM25.

    +

    Didukung oleh Tantivy, Milvus 2.5 memiliki analisis bawaan dan ekstraksi vektor jarang, memperluas API dari hanya menerima vektor sebagai input menjadi menerima teks secara langsung. Informasi statistik BM25 diperbarui secara real time saat data dimasukkan, sehingga meningkatkan kegunaan dan akurasi. Selain itu, vektor yang jarang berdasarkan algoritma perkiraan tetangga terdekat (ANN) menawarkan kinerja yang lebih kuat daripada sistem pencarian kata kunci standar.

    +

    Untuk detailnya, lihat Ikhtisar Penganalisis dan Pencarian Teks Lengkap.

    +

    WebUI Manajemen Klaster (Beta)

    Untuk mendukung data yang sangat besar dan fitur yang kaya dengan lebih baik, desain Milvus yang canggih mencakup berbagai ketergantungan, banyak peran node, struktur data yang kompleks, dan banyak lagi. Aspek-aspek ini dapat menimbulkan tantangan untuk penggunaan dan pemeliharaan.

    +

    Milvus 2.5 memperkenalkan Cluster Management WebUI bawaan, mengurangi kesulitan pemeliharaan sistem dengan memvisualisasikan informasi lingkungan runtime Milvus yang kompleks. Ini termasuk rincian database dan koleksi, segmen, saluran, ketergantungan, status kesehatan node, informasi tugas, kueri yang lambat, dan banyak lagi.

    +

    Untuk detailnya, lihat Milvus WebUI.

    +

    Pencocokan Teks

    Milvus 2.5 memanfaatkan penganalisis dan pengindeksan dari Tantivy untuk prapemrosesan teks dan pembuatan indeks, yang mendukung pencocokan bahasa alami yang tepat untuk data teks berdasarkan istilah-istilah tertentu. Fitur ini terutama digunakan untuk pencarian yang difilter untuk memenuhi kondisi tertentu dan dapat menggabungkan pemfilteran skalar untuk menyempurnakan hasil kueri, sehingga memungkinkan pencarian kemiripan dalam vektor yang memenuhi kriteria skalar.

    +

    Untuk detailnya, lihat Ikhtisar Penganalisis dan Pencocokan Teks.

    +

    Indeks Bitmap

    Indeks data skalar baru telah ditambahkan ke keluarga Milvus. Indeks BitMap menggunakan larik bit, yang panjangnya sama dengan jumlah baris, untuk merepresentasikan keberadaan nilai dan mempercepat pencarian.

    +

    Indeks Bitmap secara tradisional efektif untuk bidang dengan kardinalitas rendah, yang memiliki sejumlah kecil nilai yang berbeda-misalnya, kolom yang berisi informasi jenis kelamin dengan hanya dua nilai yang mungkin: laki-laki dan perempuan.

    +

    Untuk detailnya, lihat Indeks Bitmap.

    +

    Nilai yang Dapat Dinolkan & Nilai Default

    Milvus sekarang mendukung pengaturan properti nullable dan nilai default untuk field skalar selain field kunci utama. Untuk field skalar yang ditandai sebagai nullable=True, pengguna dapat menghilangkan field tersebut ketika memasukkan data; sistem akan memperlakukannya sebagai nilai null atau nilai default (jika diatur) tanpa memberikan kesalahan.

    +

    Nilai default dan properti yang dapat dinolkan memberikan fleksibilitas yang lebih besar untuk Milvus. Pengguna dapat menggunakan fitur ini untuk field dengan nilai yang tidak pasti ketika membuat koleksi. Fitur ini juga menyederhanakan migrasi data dari sistem basis data lain ke Milvus, yang memungkinkan untuk menangani kumpulan data yang mengandung nilai null dengan tetap mempertahankan pengaturan nilai default yang asli.

    +

    Untuk detailnya, lihat Nilai Nullable & Default.

    +

    HNSW SQ/PQ/PRQ berbasis Faiss

    Melalui kolaborasi erat dengan komunitas Faiss, algoritme HNSW di Faiss telah mengalami peningkatan yang signifikan dalam hal fungsionalitas dan kinerja. Untuk pertimbangan stabilitas dan pemeliharaan, Milvus 2.5 telah secara resmi memigrasikan dukungannya untuk HNSW dari hnswlib ke Faiss.

    +

    Berdasarkan Faiss, Milvus 2.5 mendukung berbagai metode kuantisasi pada HNSW untuk memenuhi kebutuhan skenario yang berbeda: SQ (Pengukur Skalar), PQ (Pengukur Produk), dan PRQ (Pengukur Sisa Produk). SQ dan PQ lebih umum digunakan; SQ memberikan kinerja kueri yang baik dan kecepatan pembuatan, sementara PQ menawarkan penarikan yang lebih baik pada rasio kompresi yang sama. Banyak basis data vektor biasanya menggunakan kuantisasi biner, yang merupakan bentuk sederhana dari kuantisasi SQ.

    +

    PRQ adalah perpaduan antara PQ dan AQ (Additive Quantizer). Dibandingkan dengan PQ, PRQ membutuhkan waktu pembuatan yang lebih lama untuk menghasilkan penarikan yang lebih baik, terutama pada tingkat kompresi yang tinggi, dengan kata lain kompresi biner.

    +

    Pemadatan Pengelompokan (Beta)

    Milvus 2.5 memperkenalkan Pemadatan Clustering untuk mempercepat pencarian dan mengurangi biaya dalam koleksi yang besar. Dengan menentukan bidang skalar sebagai kunci pengelompokan, data didistribusikan kembali berdasarkan rentang untuk mengoptimalkan penyimpanan dan pengambilan. Bertindak seperti indeks global, fitur ini memungkinkan Milvus memangkas data secara efisien selama kueri berdasarkan metadata pengelompokan, sehingga meningkatkan kinerja pencarian ketika filter skalar diterapkan.

    +

    Untuk detailnya, lihat Pemadatan Klaster.

    +

    Fitur Lainnya

    Streaming Node (Beta)

    Milvus 2.5 memperkenalkan komponen baru yang disebut streaming node, yang menyediakan layanan Write-Ahead Logging (WAL). Hal ini memungkinkan Milvus untuk mencapai konsensus sebelum dan sesudah membaca dan menulis saluran, membuka fitur, fungsi, dan pengoptimalan baru. Fitur ini dinonaktifkan secara default pada Milvus 2.5 dan akan tersedia secara resmi pada versi 3.0.

    +

    Dukungan IPv6

    Milvus sekarang mendukung IPv6, yang memungkinkan konektivitas dan kompatibilitas jaringan yang lebih luas.

    +

    Impor Massal CSV

    Selain format JSON dan Parquet, Milvus sekarang mendukung impor data secara langsung dalam format CSV.

    +

    Templat Ekspresi untuk Akselerasi Kueri

    Milvus sekarang mendukung templat ekspresi, meningkatkan efisiensi penguraian ekspresi, terutama dalam skenario dengan ekspresi yang kompleks.

    +

    Untuk detailnya, lihat Templat Filter.

    +

    Penyempurnaan Berdasarkan Grup

      +
    • Ukuran Grup yang dapatdisesuaikan: Menambahkan dukungan untuk menentukan jumlah entri yang dikembalikan untuk setiap grup.
    • +
    • Pencarian GroupBy Hybrid: Mendukung pencarian GroupBy hybrid berdasarkan beberapa kolom vektor.
    • +
    +

    Peningkatan Iterator

      +
    • Dukungan MVCC: Pengguna kini dapat menggunakan iterator tanpa terpengaruh oleh perubahan data berikutnya seperti penyisipan dan penghapusan, berkat Kontrol Konkurensi Multi-Versi (MVCC).
    • +
    • Kursor Persisten: Milvus sekarang mendukung kursor persisten untuk QueryIterator, sehingga pengguna dapat melanjutkan iterasi dari posisi terakhir setelah Milvus dimulai ulang tanpa perlu memulai ulang seluruh proses iterasi.
    • +
    +

    Peningkatan

    Optimalisasi Penghapusan

    Meningkatkan kecepatan dan mengurangi penggunaan memori untuk penghapusan berskala besar dengan mengoptimalkan penggunaan kunci dan manajemen memori.

    +

    Peningkatan Ketergantungan

    Peningkatan ke ETCD 3.5.16 dan Pulsar 3.0.7 LTS, memperbaiki CVE yang ada dan meningkatkan keamanan. Catatan: Upgrade ke Pulsar 3.x tidak kompatibel dengan versi 2.x sebelumnya.

    +

    Untuk pengguna yang sudah memiliki penerapan Milvus yang berfungsi, Anda perlu meng-upgrade komponen ETCD dan Pulsar sebelum dapat menggunakan fitur dan fungsi baru. Untuk detailnya, lihat Meningkatkan Pulsar dari 2.x ke 3.x

    +

    Penyimpanan Lokal V2

    Memperkenalkan format file lokal baru di Milvus 2.5, meningkatkan efisiensi pemuatan dan kueri untuk data skalar, mengurangi overhead memori, dan meletakkan dasar untuk pengoptimalan di masa mendatang.

    +

    Pengoptimalan Penguraian Ekspresi

    Penguraian ekspresi yang lebih baik dengan mengimplementasikan caching untuk ekspresi yang diulang, meningkatkan ANTLR, dan mengoptimalkan kinerja klausa NOT IN.

    +

    Peningkatan Kinerja Konkurensi DDL

    Mengoptimalkan kinerja konkurensi operasi Data Definition Language (DDL).

    +

    Penyelarasan Fitur API RESTful

    Menyelaraskan fungsionalitas RESTful API dengan SDK lain untuk konsistensi.

    +

    Pembaruan Keamanan & Konfigurasi

    TLS yang didukung untuk mengamankan komunikasi antar-simpul di lingkungan yang lebih kompleks atau lingkungan perusahaan. Untuk detailnya, lihat Konfigurasi Keamanan.

    +

    Peningkatan Kinerja Pemadatan

    Menghapus batasan segmen maksimum dalam pemadatan campuran dan sekarang memprioritaskan segmen yang lebih kecil terlebih dahulu, meningkatkan efisiensi dan mempercepat kueri pada set data yang besar atau terfragmentasi.

    +

    Penyeimbangan Saluran Berbasis Skor

    Memperkenalkan kebijakan yang secara dinamis menyeimbangkan beban di seluruh saluran, meningkatkan pemanfaatan sumber daya dan stabilitas secara keseluruhan dalam penerapan skala besar.

    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-bge.json b/localization/v2.5.x/site/id/rerankers/rerankers-bge.json new file mode 100644 index 000000000..2b0b4680b --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-bge.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import BGERerankFunction\n\n# Define the rerank function\nbge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = bge_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.991162\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: 0.032697\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: 0.006515\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"BGE","anchorList":[{"label":"BGE","href":"BGE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-bge.md b/localization/v2.5.x/site/id/rerankers/rerankers-bge.md new file mode 100644 index 000000000..01323c5ac --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-bge.md @@ -0,0 +1,79 @@ +--- +id: rerankers-bge.md +order: 2 +summary: >- + Milvus mendukung model pemeringkatan BGE melalui kelas `BGERerankFunction`. + Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan + kueri-dokumen secara efektif. +title: BGE +--- +

    BGE

    Milvus mendukung model perangking BGE melalui kelas BGERerankFunction. Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan kueri-dokumen secara efektif.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +# Define the rerank function
    +bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Parameter

    +
      +
    • model_name (string)

      +

      Nama model yang akan digunakan. Anda dapat menentukan salah satu nama model reranker BGE yang tersedia, misalnya, BAAI/bge-reranker-base, BAAI/bge-reranker-large, dll. Jika Anda membiarkan parameter ini tidak ditentukan, BAAI/bge-reranker-v2-m3 akan digunakan. Untuk daftar model yang tersedia, lihat Daftar Model.

    • +
    • device (string)

      +

      Opsional. Perangkat yang akan digunakan untuk menjalankan model. Jika tidak ditentukan, model akan dijalankan pada CPU. Anda dapat menentukan cpu untuk CPU dan cuda:n untuk perangkat GPU ke-n.

    • +
    +

    Kemudian, gunakan kode berikut untuk memberi peringkat ulang dokumen berdasarkan kueri:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = bge_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Index: 1
    +Score: 0.991162
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: 0.032697
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: 0.006515
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-cohere.json b/localization/v2.5.x/site/id/rerankers/rerankers-cohere.json new file mode 100644 index 000000000..711fccdf0 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CohereRerankFunction\n\n# Define the rerank function\ncohere_rf = CohereRerankFunction(\n model_name=\"rerank-english-v3.0\", # Specify the model name. Defaults to `rerank-english-v2.0`.\n api_key=COHERE_API_KEY # Replace with your Cohere API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = cohere_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.99691266\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.8578872\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.3589146\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-cohere.md b/localization/v2.5.x/site/id/rerankers/rerankers-cohere.md new file mode 100644 index 000000000..a92adeca8 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-cohere.md @@ -0,0 +1,79 @@ +--- +id: rerankers-cohere.md +order: 3 +summary: >- + Milvus mendukung model perangking Cohere melalui kelas `CohereRerankFunction`. + Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan + kueri-dokumen secara efektif. +title: Peringkat ulang Cohere +--- +

    Cohere

    Milvus mendukung model perangking Cohere melalui kelas CohereRerankFunction. Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan kueri-dokumen secara efektif.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal CohereRerankFunction:

    +
    from pymilvus.model.reranker import CohereRerankFunction
    +
    +# Define the rerank function
    +cohere_rf = CohereRerankFunction(
    +    model_name="rerank-english-v3.0",  # Specify the model name. Defaults to `rerank-english-v2.0`.
    +    api_key=COHERE_API_KEY # Replace with your Cohere API key
    +)
    +
    +

    Parameter

    +
      +
    • model_name (string)

      +

      Nama model yang akan digunakan. Anda dapat menentukan salah satu nama model perangking Cohere yang tersedia, misalnya, rerank-english-v3.0, rerank-multilingual-v3.0, dsb. Jika Anda membiarkan parameter ini tidak ditentukan, rerank-english-v2.0 akan digunakan. Untuk daftar model yang tersedia, lihat Rerangking.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Cohere. Untuk informasi tentang cara membuat kunci API, lihat Dasbor Cohere.

    • +
    +

    Kemudian, gunakan kode berikut untuk memberi peringkat ulang dokumen berdasarkan kueri:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = cohere_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    Index: 1
    +Score: 0.99691266
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.8578872
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.3589146
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.json b/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.json new file mode 100644 index 000000000..ea23cea26 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CrossEncoderRerankFunction\n\n# Define the rerank function\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = ce_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 6.250533\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: -2.954602\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: -4.771512\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Cross Encoder","anchorList":[{"label":"Penyandi Silang","href":"Cross-Encoder","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.md b/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.md new file mode 100644 index 000000000..5bf1189d6 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-cross-encoder.md @@ -0,0 +1,79 @@ +--- +id: rerankers-cross-encoder.md +order: 4 +summary: >- + Milvus mendukung model perangkingan ulang Cross Encoder melalui kelas + `CrossEncoderRerankFunction`. Fungsionalitas ini memungkinkan Anda untuk + menilai relevansi pasangan kueri-dokumen secara efektif. +title: Penyandi Silang +--- +

    Penyandi Silang

    Milvus mendukung Penyandi Silang melalui kelas CrossEncoderRerankFunction. Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan kueri-dokumen secara efektif.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal CrossEncoderRerankFunction:

    +
    from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +# Define the rerank function
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model yang akan digunakan. Anda dapat menentukan salah satu nama model Cross-Encoder yang tersedia, misalnya, cross-encoder/ms-marco-TinyBERT-L-2-v2, cross-encoder/ms-marco-MiniLM-L-2-v2, dll. Jika Anda membiarkan parameter ini tidak ditentukan, string kosong akan digunakan. Untuk daftar model yang tersedia, lihat Penyandi Silang Terlatih.

    • +
    • device (string)

      +

      Perangkat yang akan digunakan untuk menjalankan model. Anda dapat menentukan cpu untuk CPU dan cuda:n untuk perangkat GPU ke-n.

    • +
    +

    Kemudian, gunakan kode berikut untuk memberi peringkat ulang dokumen berdasarkan kueri:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = ce_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Index: 1
    +Score: 6.250533
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: -2.954602
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: -4.771512
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-jina.json b/localization/v2.5.x/site/id/rerankers/rerankers-jina.json new file mode 100644 index 000000000..a7f7c04fe --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_rf = JinaRerankFunction(\n model_name=\"jina-reranker-v2-base-multilingual\", # Defaults to `jina-reranker-v2-base-multilingual`\n api_key=JINAAI_API_KEY\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = jina_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.937096\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.354210\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.349866\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-jina.md b/localization/v2.5.x/site/id/rerankers/rerankers-jina.md new file mode 100644 index 000000000..007db3104 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-jina.md @@ -0,0 +1,78 @@ +--- +id: rerankers-jina.md +order: 6 +summary: >- + Milvus mendukung model perangkingan Jina melalui kelas `JinaRerankFunction`. + Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan + kueri-dokumen secara efektif. +title: Jina AI - Peringkat Ulang +--- +

    Jina AI

    Milvus mendukung model pemeringkat Jina AI melalui kelas JinaRerankFunction. Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan kueri-dokumen secara efektif.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal JinaRerankFunction:

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_rf = JinaRerankFunction(
    +    model_name="jina-reranker-v2-base-multilingual", # Defaults to `jina-reranker-v2-base-multilingual`
    +    api_key=JINAAI_API_KEY
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model pemeringkat Jina AI yang akan digunakan untuk pengodean. Jika Anda membiarkan parameter ini tidak ditentukan, jina-reranker-v2-base-multilingual akan digunakan. Untuk daftar model yang tersedia, lihat Jina AI Reranker.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Jina AI.

    • +
    +

    Kemudian, gunakan kode berikut untuk memberi peringkat ulang dokumen berdasarkan kueri:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = jina_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    Index: 1
    +Score: 0.937096
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.354210
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.349866
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-overview.json b/localization/v2.5.x/site/id/rerankers/rerankers-overview.json new file mode 100644 index 000000000..25d7cead9 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-overview.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus[model]\n# or pip install \"pymilvus[model]\" for zsh.\n","from pymilvus.model.reranker import BGERerankFunction\n","bge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nbge_rf(query, documents)\n","[RerankResult(text=\"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\", score=0.9911615761470803, index=1),\n RerankResult(text=\"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\", score=0.0326971950177779, index=0),\n RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),\n RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]\n","entities = [\n {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\"}, \n {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\"}, \n {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, \n {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}\n]\n","from pymilvus import MilvusClient, DataType\n\nclient = MilvusClient(\n uri=\"http://10.102.6.214:19530\" # replace with your own Milvus server address\n)\n\nclient.drop_collection('test_collection')\n\n# define schema\n\nschema = client.create_schema(auto_id=False, enabel_dynamic_field=True)\n\nschema.add_field(field_name=\"doc_id\", datatype=DataType.INT64, is_primary=True, description=\"document id\")\nschema.add_field(field_name=\"doc_vector\", datatype=DataType.FLOAT_VECTOR, dim=384, description=\"document vector\")\nschema.add_field(field_name=\"doc_text\", datatype=DataType.VARCHAR, max_length=65535, description=\"document text\")\n\n# define index params\n\nindex_params = client.prepare_index_params()\n\nindex_params.add_index(field_name=\"doc_vector\", index_type=\"IVF_FLAT\", metric_type=\"IP\", params={\"nlist\": 128})\n\n# create collection\n\nclient.create_collection(collection_name=\"test_collection\", schema=schema, index_params=index_params)\n\n# insert data into collection\n\nclient.insert(collection_name=\"test_collection\", data=entities)\n\n# Output:\n# {'insert_count': 4, 'ids': [0, 1, 2, 3]}\n","# search results based on our query\n\nres = client.search(\n collection_name=\"test_collection\",\n data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector\n limit=3,\n output_fields=[\"doc_id\", \"doc_text\"]\n)\n\nfor i in res[0]:\n print(f'distance: {i[\"distance\"]}')\n print(f'doc_text: {i[\"entity\"][\"doc_text\"]}')\n","distance: 0.7235960960388184\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\ndistance: 0.6269873976707458\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\ndistance: 0.5340118408203125\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n","# use reranker to rerank search results\n\nfrom pymilvus.model.reranker import CrossEncoderRerankFunction\n\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n\nreranked_results = ce_rf(\n query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',\n documents=[\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n ],\n top_k=3\n)\n\n# print the reranked results\nfor result in reranked_results:\n print(f'score: {result.score}')\n print(f'doc_text: {result.text}')\n","score: 6.250532627105713\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\nscore: -2.9546022415161133\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\nscore: -4.771512031555176\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Rerankers Overview","anchorList":[{"label":"Gambaran Umum Perangking Ulang","href":"Rerankers-Overview","type":1,"isActive":false},{"label":"Contoh 1: Gunakan fungsi BGE rerank untuk memberi peringkat ulang dokumen menurut kueri","href":"Example-1-Use-BGE-rerank-function-to-rerank-documents-according-to-a-query","type":2,"isActive":false},{"label":"Contoh 2: Gunakan perangking ulang untuk meningkatkan relevansi hasil pencarian","href":"Example-2-Use-a-reranker-to-enhance-relevance-of-search-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-overview.md b/localization/v2.5.x/site/id/rerankers/rerankers-overview.md new file mode 100644 index 000000000..a99def69f --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-overview.md @@ -0,0 +1,210 @@ +--- +id: rerankers-overview.md +order: 1 +summary: >- + Pustaka model PyMilvus mengintegrasikan fungsi rerank untuk mengoptimalkan + urutan hasil yang dikembalikan dari pencarian awal. +title: Gambaran Umum Perangking Ulang +--- +

    Gambaran Umum Perangking Ulang

    Dalam ranah pencarian informasi dan AI generatif, reranker adalah alat penting yang mengoptimalkan urutan hasil dari pencarian awal. Perangking ulang berbeda dari model penyematan tradisional dengan mengambil kueri dan dokumen sebagai masukan dan secara langsung mengembalikan skor kemiripan, bukan penyematan. Skor ini menunjukkan relevansi antara kueri masukan dan dokumen.

    +

    Perangking ulang sering digunakan setelah pencarian tahap pertama, biasanya dilakukan melalui teknik vektor Approximate Nearest Neighbor (ANN). Meskipun pencarian ANN efisien dalam mengambil sekumpulan hasil yang berpotensi relevan, mereka mungkin tidak selalu memprioritaskan hasil dalam hal kedekatan semantik aktual dengan kueri. Di sini, reranker digunakan untuk mengoptimalkan urutan hasil menggunakan analisis kontekstual yang lebih dalam, yang sering kali memanfaatkan model pembelajaran mesin tingkat lanjut seperti BERT atau model berbasis Transformer lainnya. Dengan melakukan hal ini, reranker dapat secara dramatis meningkatkan akurasi dan relevansi hasil akhir yang disajikan kepada pengguna.

    +

    Pustaka model PyMilvus mengintegrasikan fungsi peringkat ulang untuk mengoptimalkan urutan hasil yang dikembalikan dari pencarian awal. Setelah Anda mengambil embedding terdekat dari Milvus, Anda dapat memanfaatkan alat perangkingan ulang ini untuk menyaring hasil pencarian untuk meningkatkan ketepatan hasil pencarian.

    + + + + + + + + + + + +
    Fungsi Peringkat UlangAPI atau Sumber terbuka
    BGESumber terbuka
    Penyandi SilangSumber terbuka
    PelayaranAPI
    CohereAPI
    Jina AIAPI
    +
    +
      +
    • Sebelum menggunakan perangking sumber terbuka, pastikan untuk mengunduh dan menginstal semua dependensi dan model yang diperlukan.

    • +
    • Untuk perangking berbasis API, dapatkan kunci API dari penyedia dan setel di variabel lingkungan atau argumen yang sesuai.

    • +
    +
    +

    Contoh 1: Gunakan fungsi BGE rerank untuk memberi peringkat ulang dokumen menurut kueri

    Dalam contoh ini, kami mendemonstrasikan cara memberi peringkat ulang hasil pencarian menggunakan perankah BGE berdasarkan kueri tertentu.

    +

    Untuk menggunakan perankingan ulang dengan pustaka model PyMilvus, mulailah dengan menginstal pustaka model PyMilvus bersama dengan subpaket model yang berisi semua utilitas perankingan ulang yang diperlukan:

    +
    pip install pymilvus[model]
    +# or pip install "pymilvus[model]" for zsh.
    +
    +

    Untuk menggunakan reranker BGE, pertama-tama impor kelas BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +

    Kemudian, buatlah sebuah instance BGERerankFunction untuk perankingan ulang:

    +
    bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Untuk memberi peringkat ulang dokumen berdasarkan kueri, gunakan kode berikut:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +bge_rf(query, documents)
    +
    +

    Keluaran yang diharapkan mirip dengan yang berikut ini:

    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9911615761470803, index=1),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.0326971950177779, index=0),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]
    +
    +

    Contoh 2: Gunakan perangking ulang untuk meningkatkan relevansi hasil pencarian

    Dalam panduan ini, kita akan mengeksplorasi bagaimana cara menggunakan metode search() di PyMilvus untuk melakukan pencarian kemiripan, dan bagaimana cara meningkatkan relevansi hasil pencarian menggunakan reranker. Demonstrasi kami akan menggunakan dataset berikut:

    +
    entities = [
    +    {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence."}, 
    +    {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals."}, 
    +    {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, 
    +    {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}
    +]
    +
    +

    Komponen dataset:

    +
      +
    • doc_id: Pengenal unik untuk setiap dokumen.
    • +
    • doc_vector: Sematan vektor yang mewakili dokumen. Untuk panduan tentang cara membuat penyematan, lihat Penyematan.
    • +
    • doc_text: Konten teks dari dokumen.
    • +
    +

    Persiapan

    Sebelum memulai pencarian kemiripan, Anda perlu membuat koneksi dengan Milvus, membuat koleksi, dan menyiapkan serta memasukkan data ke dalam koleksi tersebut. Cuplikan kode berikut ini mengilustrasikan langkah-langkah awal ini.

    +
    from pymilvus import MilvusClient, DataType
    +
    +client = MilvusClient(
    +    uri="http://10.102.6.214:19530" # replace with your own Milvus server address
    +)
    +
    +client.drop_collection('test_collection')
    +
    +# define schema
    +
    +schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
    +
    +schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
    +schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
    +schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
    +
    +# define index params
    +
    +index_params = client.prepare_index_params()
    +
    +index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
    +
    +# create collection
    +
    +client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
    +
    +# insert data into collection
    +
    +client.insert(collection_name="test_collection", data=entities)
    +
    +# Output:
    +# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
    +
    +

    Setelah penyisipan data, lakukan pencarian kemiripan dengan menggunakan metode search.

    +
    # search results based on our query
    +
    +res = client.search(
    +    collection_name="test_collection",
    +    data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
    +    limit=3,
    +    output_fields=["doc_id", "doc_text"]
    +)
    +
    +for i in res[0]:
    +    print(f'distance: {i["distance"]}')
    +    print(f'doc_text: {i["entity"]["doc_text"]}')
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    distance: 0.7235960960388184
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +distance: 0.6269873976707458
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +distance: 0.5340118408203125
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +

    Gunakan perangking ulang untuk meningkatkan hasil pencarian

    Kemudian, tingkatkan relevansi hasil pencarian Anda dengan langkah perankingan ulang. Dalam contoh ini, kami menggunakan CrossEncoderRerankFunction yang dibangun di PyMilvus untuk memberi peringkat ulang hasil untuk meningkatkan akurasi.

    +
    # use reranker to rerank search results
    +
    +from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +reranked_results = ce_rf(
    +    query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',
    +    documents=[
    +        "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +        "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +        "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +        "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +    ],
    +    top_k=3
    +)
    +
    +# print the reranked results
    +for result in reranked_results:
    +    print(f'score: {result.score}')
    +    print(f'doc_text: {result.text}')
    +
    +

    Hasil yang diharapkan mirip dengan yang berikut ini:

    +
    score: 6.250532627105713
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +score: -2.9546022415161133
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +score: -4.771512031555176
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-voyage.json b/localization/v2.5.x/site/id/rerankers/rerankers-voyage.json new file mode 100644 index 000000000..e4cad0c5a --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import VoyageRerankFunction\n\n# Define the rerank function\nvoyage_rf = VoyageRerankFunction(\n model_name=\"rerank-lite-1\", # Specify the model name. Defaults to `rerank-lite-1`.\n api_key=VOYAGE_API_KEY # Replace with your Voyage API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = voyage_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.898438\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.718750\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.679688\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Voyage","anchorList":[{"label":"Voyage","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/rerankers/rerankers-voyage.md b/localization/v2.5.x/site/id/rerankers/rerankers-voyage.md new file mode 100644 index 000000000..9981959a0 --- /dev/null +++ b/localization/v2.5.x/site/id/rerankers/rerankers-voyage.md @@ -0,0 +1,79 @@ +--- +id: rerankers-voyage.md +order: 5 +summary: >- + Milvus mendukung model perangkingan ulang Voyage melalui kelas + `VoyageRerankFunction`. Fungsionalitas ini memungkinkan Anda untuk menilai + relevansi pasangan kueri-dokumen secara efektif. +title: Pelayaran Rerangking +--- +

    Voyage

    Milvus mendukung model perangkingan Voyage melalui kelas VoyageRerankFunction. Fungsionalitas ini memungkinkan Anda untuk menilai relevansi pasangan kueri-dokumen secara efektif.

    +

    Untuk menggunakan fitur ini, instal dependensi yang diperlukan:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Kemudian, instal VoyageRerankFunction:

    +
    from pymilvus.model.reranker import VoyageRerankFunction
    +
    +# Define the rerank function
    +voyage_rf = VoyageRerankFunction(
    +    model_name="rerank-lite-1",  # Specify the model name. Defaults to `rerank-lite-1`.
    +    api_key=VOYAGE_API_KEY # Replace with your Voyage API key
    +)
    +
    +

    Parameter:

    +
      +
    • model_name (string)

      +

      Nama model Voyage yang akan digunakan untuk pengkodean. Jika Anda membiarkan parameter ini tidak ditentukan, rerank-lite-1 akan digunakan. Untuk daftar model yang tersedia, lihat Reranker.

    • +
    • api_key (string)

      +

      Kunci API untuk mengakses API Voyage. Untuk informasi mengenai cara membuat kunci API, lihat Kunci API dan Klien Python.

    • +
    +

    Kemudian, gunakan kode berikut untuk memberi peringkat ulang dokumen berdasarkan kueri:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = voyage_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Hasil yang diharapkan serupa dengan yang berikut ini:

    +
    Index: 1
    +Score: 0.898438
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.718750
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.679688
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/id/tutorials/audio_similarity_search.json b/localization/v2.5.x/site/id/tutorials/audio_similarity_search.json new file mode 100644 index 000000000..79d36f9b1 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/audio_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Audio Similarity Search","anchorList":[{"label":"Pencarian Kemiripan Audio","href":"Audio-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/audio_similarity_search.md b/localization/v2.5.x/site/id/tutorials/audio_similarity_search.md new file mode 100644 index 000000000..a5d9bc4e6 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/audio_similarity_search.md @@ -0,0 +1,36 @@ +--- +id: audio_similarity_search.md +summary: Bangun sistem pencarian kemiripan audio dengan Milvus. +title: Pencarian Kemiripan Audio +--- +

    Pencarian Kemiripan Audio

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka untuk membangun sistem pencarian kemiripan audio.

    +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    +
      +
    • PANN (Jaringan Saraf Tiruan Audio Skala Besar yang Sudah Terlatih)
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    Pencarian ucapan, musik, efek suara, dan jenis pencarian audio lainnya memungkinkan untuk secara cepat meminta data audio dalam jumlah besar dan memunculkan suara yang mirip. Aplikasi sistem pencarian kemiripan audio termasuk mengidentifikasi efek suara yang mirip, meminimalkan pelanggaran IP, dan banyak lagi. Pencarian audio dapat digunakan untuk mencari dan memantau media online secara real-time untuk menindak pelanggaran hak kekayaan intelektual. Ini juga mengasumsikan peran penting dalam klasifikasi dan analisis statistik data audio.

    +


    +

    Dalam tutorial ini, Anda akan belajar cara membangun sistem pencarian kemiripan audio yang dapat mengembalikan klip suara yang serupa. Klip audio yang diunggah diubah menjadi vektor menggunakan PANN. Vektor-vektor ini disimpan di Milvus yang secara otomatis menghasilkan ID unik untuk setiap vektor. Kemudian pengguna dapat melakukan pencarian kemiripan vektor di Milvus dan menanyakan jalur data klip audio yang sesuai dengan ID vektor unik yang dikembalikan oleh Milvus.

    +


    +

    + + Audio_search + Audio_search Audio_search_demoAudio_search_demo

    diff --git a/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.json b/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.json new file mode 100644 index 000000000..dcc39339c --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-3.5-turbo\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus","anchorList":[{"label":"Membangun RAG dengan Milvus","href":"Build-RAG-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Membangun RAG","href":"Build-RAG","type":2,"isActive":false},{"label":"Penerapan Cepat","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.md b/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.md new file mode 100644 index 000000000..beeb354ec --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/build-rag-with-milvus.md @@ -0,0 +1,250 @@ +--- +id: build-rag-with-milvus.md +summary: membangun lap dengan milvus +title: Membangun RAG dengan Milvus +--- +

    Membangun RAG dengan Milvus

    Open In Colab +GitHub Repository

    +

    +

    Dalam tutorial ini, kami akan menunjukkan kepada Anda cara membuat pipeline RAG (Retrieval-Augmented Generation) dengan Milvus.

    +

    Sistem RAG menggabungkan sistem pengambilan dengan model generatif untuk menghasilkan teks baru berdasarkan prompt yang diberikan. Sistem ini pertama-tama mengambil dokumen yang relevan dari korpus menggunakan Milvus, dan kemudian menggunakan model generatif untuk menghasilkan teks baru berdasarkan dokumen yang diambil.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Menyiapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Menyiapkan Model Penyematan

    Kita menginisialisasi klien OpenAI untuk menyiapkan model penyematan.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Tentukan fungsi untuk menghasilkan penyematan teks menggunakan klien OpenAI. Kami menggunakan model penyematan-teks-3-kecil sebagai contoh.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Hasilkan embedding uji dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.00988506618887186, -0.005540902726352215, 0.0068014683201909065, -0.03810417652130127, -0.018254263326525688, -0.041231658309698105, -0.007651153020560741, 0.03220026567578316, 0.01892443746328354, 0.00010708322952268645]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:27<00:00,  2.67it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    Membangun RAG

    Mengambil data untuk kueri

    Mari kita tentukan pertanyaan yang sering muncul tentang Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 3 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri tersebut

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7883545756340027
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6757288575172424
    +    ],
    +    [
    +        "How much does Milvus cost?\n\nMilvus is a 100% free open-source project.\n\nPlease adhere to [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) when using Milvus for production or distribution purposes.\n\nZilliz, the company behind Milvus, also offers a fully managed cloud version of the platform for those that don't want to build and maintain their own distributed instance. [Zilliz Cloud](https://zilliz.com/cloud) automatically maintains data reliability and allows users to pay only for what they use.\n\n###",
    +        0.6421123147010803
    +    ]
    +]
    +
    +

    Gunakan LLM untuk mendapatkan respons RAG

    Ubah dokumen yang diambil ke dalam format string.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Tentukan perintah sistem dan pengguna untuk Model Lanage. Perintah ini dirangkai dengan dokumen yang diambil dari Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Gunakan OpenAI ChatGPT untuk menghasilkan respons berdasarkan prompt.

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-3.5-turbo",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Milvus stores data in persistent storage as incremental logs, including inserted data (vector data, scalar data, and collection-specific schema) and metadata. Inserted data is stored in various object storage backends like MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage. Metadata generated within Milvus is stored in etcd.
    +
    +

    Penerapan Cepat

    Untuk mempelajari tentang cara memulai demo online dengan tutorial ini, silakan lihat contoh aplikasi.

    diff --git a/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.json b/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.json new file mode 100644 index 000000000..e8de4ad6e --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install tqdm\n$ pip install anthropic\n","$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","from pymilvus.model.dense import VoyageEmbeddingFunction\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus.model.reranker import CohereRerankFunction\n\nfrom typing import List, Dict, Any\nfrom typing import Callable\nfrom pymilvus import (\n MilvusClient,\n DataType,\n AnnSearchRequest,\n RRFRanker,\n)\nfrom tqdm import tqdm\nimport json\nimport anthropic\n\n\nclass MilvusContextualRetriever:\n def __init__(\n self,\n uri=\"milvus.db\",\n collection_name=\"contexual_bgem3\",\n dense_embedding_function=None,\n use_sparse=False,\n sparse_embedding_function=None,\n use_contextualize_embedding=False,\n anthropic_client=None,\n use_reranker=False,\n rerank_function=None,\n ):\n self.collection_name = collection_name\n\n # For Milvus-lite, uri is a local path like \"./milvus.db\"\n # For Milvus standalone service, uri is like \"http://localhost:19530\"\n # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.\n self.client = MilvusClient(uri)\n\n self.embedding_function = dense_embedding_function\n\n self.use_sparse = use_sparse\n self.sparse_embedding_function = None\n\n self.use_contextualize_embedding = use_contextualize_embedding\n self.anthropic_client = anthropic_client\n\n self.use_reranker = use_reranker\n self.rerank_function = rerank_function\n\n if use_sparse is True and sparse_embedding_function:\n self.sparse_embedding_function = sparse_embedding_function\n elif sparse_embedding_function is False:\n raise ValueError(\n \"Sparse embedding function cannot be None if use_sparse is False\"\n )\n else:\n pass\n\n def build_collection(self):\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"dense_vector\",\n datatype=DataType.FLOAT_VECTOR,\n dim=self.embedding_function.dim,\n )\n if self.use_sparse is True:\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n if self.use_sparse is True:\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"IP\",\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n enable_dynamic_field=True,\n )\n\n def insert_data(self, chunk, metadata):\n dense_vec = self.embedding_function([chunk])[0]\n if self.use_sparse is True:\n sparse_result = self.sparse_embedding_function.encode_documents([chunk])\n if type(sparse_result) == dict:\n sparse_vec = sparse_result[\"sparse\"][[0]]\n else:\n sparse_vec = sparse_result[[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def insert_contextualized_data(self, doc, chunk, metadata):\n contextualized_text, usage = self.situate_context(doc, chunk)\n metadata[\"context\"] = contextualized_text\n text_to_embed = f\"{chunk}\\n\\n{contextualized_text}\"\n dense_vec = self.embedding_function([text_to_embed])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_documents(\n [text_to_embed]\n )[\"sparse\"][[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def situate_context(self, doc: str, chunk: str):\n DOCUMENT_CONTEXT_PROMPT = \"\"\"\n \n {doc_content}\n \n \"\"\"\n\n CHUNK_CONTEXT_PROMPT = \"\"\"\n Here is the chunk we want to situate within the whole document\n \n {chunk_content}\n \n\n Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.\n Answer only with the succinct context and nothing else.\n \"\"\"\n\n response = self.anthropic_client.beta.prompt_caching.messages.create(\n model=\"claude-3-haiku-20240307\",\n max_tokens=1000,\n temperature=0.0,\n messages=[\n {\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),\n \"cache_control\": {\n \"type\": \"ephemeral\"\n }, # we will make use of prompt caching for the full documents\n },\n {\n \"type\": \"text\",\n \"text\": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),\n },\n ],\n },\n ],\n extra_headers={\"anthropic-beta\": \"prompt-caching-2024-07-31\"},\n )\n return response.content[0].text, response.usage\n\n def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:\n dense_vec = self.embedding_function([query])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_queries([query])[\n \"sparse\"\n ][[0]]\n\n req_list = []\n if self.use_reranker:\n k = k * 10\n if self.use_sparse is True:\n req_list = []\n dense_search_param = {\n \"data\": [dense_vec],\n \"anns_field\": \"dense_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n dense_req = AnnSearchRequest(**dense_search_param)\n req_list.append(dense_req)\n\n sparse_search_param = {\n \"data\": [sparse_vec],\n \"anns_field\": \"sparse_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n sparse_req = AnnSearchRequest(**sparse_search_param)\n\n req_list.append(sparse_req)\n\n docs = self.client.hybrid_search(\n self.collection_name,\n req_list,\n RRFRanker(),\n k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n else:\n docs = self.client.search(\n self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n if self.use_reranker and self.use_contextualize_embedding:\n reranked_texts = []\n reranked_docs = []\n for i in range(k):\n if self.use_contextualize_embedding:\n reranked_texts.append(\n f\"{docs[0][i]['entity']['content']}\\n\\n{docs[0][i]['entity']['context']}\"\n )\n else:\n reranked_texts.append(f\"{docs[0][i]['entity']['content']}\")\n results = self.rerank_function(query, reranked_texts)\n for result in results:\n reranked_docs.append(docs[0][result.index])\n docs[0] = reranked_docs\n return docs\n\n\ndef evaluate_retrieval(\n queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20\n) -> Dict[str, float]:\n total_score = 0\n total_queries = len(queries)\n for query_item in tqdm(queries, desc=\"Evaluating retrieval\"):\n query = query_item[\"query\"]\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n # Find all golden chunk contents\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (\n doc\n for doc in query_item[\"golden_documents\"]\n if doc[\"uuid\"] == doc_uuid\n ),\n None,\n )\n if not golden_doc:\n print(f\"Warning: Golden document not found for UUID {doc_uuid}\")\n continue\n\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if not golden_chunk:\n print(\n f\"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}\"\n )\n continue\n\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n if not golden_contents:\n print(f\"Warning: No golden contents found for query: {query}\")\n continue\n\n retrieved_docs = retrieval_function(query, db, k=k)\n\n # Count how many golden chunks are in the top k retrieved documents\n chunks_found = 0\n for golden_content in golden_contents:\n for doc in retrieved_docs[0][:k]:\n retrieved_content = doc[\"entity\"][\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n total_score += query_score\n\n average_score = total_score / total_queries\n pass_at_n = average_score * 100\n return {\n \"pass_at_n\": pass_at_n,\n \"average_score\": average_score,\n \"total_queries\": total_queries,\n }\n\n\ndef retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:\n return db.search(query, k=k)\n\n\ndef load_jsonl(file_path: str) -> List[Dict[str, Any]]:\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndef evaluate_db(db, original_jsonl_path: str, k):\n # Load the original JSONL data for queries and ground truth\n original_data = load_jsonl(original_jsonl_path)\n\n # Evaluate retrieval\n results = evaluate_retrieval(original_data, retrieve_base, db, k)\n print(f\"Pass@{k}: {results['pass_at_n']:.2f}%\")\n print(f\"Total Score: {results['average_score']}\")\n print(f\"Total queries: {results['total_queries']}\")\n","dense_ef = VoyageEmbeddingFunction(api_key=\"your-voyage-api-key\", model_name=\"voyage-2\")\nsparse_ef = BGEM3EmbeddingFunction()\ncohere_rf = CohereRerankFunction(api_key=\"your-cohere-api-key\")\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n","standard_retriever = MilvusContextualRetriever(\n uri=\"standard.db\", collection_name=\"standard\", dense_embedding_function=dense_ef\n)\n\nstandard_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(standard_retriever, \"evaluation_set.jsonl\", 5)\n","hybrid_retriever = MilvusContextualRetriever(\n uri=\"hybrid.db\",\n collection_name=\"hybrid\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n)\n\nhybrid_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n hybrid_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(hybrid_retriever, \"evaluation_set.jsonl\", 5)\n","anthropic_client = anthropic.Anthropic(\n api_key=\"your-anthropic-api-key\",\n)\n","contextual_retriever = MilvusContextualRetriever(\n uri=\"contextual.db\",\n collection_name=\"contextual\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n use_contextualize_embedding=True,\n anthropic_client=anthropic_client,\n)\n\ncontextual_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n contextual_retriever.insert_contextualized_data(\n doc_content, chunk_content, metadata\n )\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n","contextual_retriever.use_reranker = True\ncontextual_retriever.rerank_function = cohere_rf\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n"],"headingContent":"Contextual Retrieval with Milvus","anchorList":[{"label":"Pengambilan Kontekstual dengan Milvus","href":"Contextual-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Mengunduh Data","href":"Download-Data","type":2,"isActive":false},{"label":"Mendefinisikan Retriever","href":"Define-Retriever","type":2,"isActive":false},{"label":"Eksperimen I: Pengambilan Standar","href":"Experiment-I-Standard-Retrieval","type":2,"isActive":false},{"label":"Eksperimen II: Pengambilan Hibrida","href":"Experiment-II-Hybrid-Retrieval","type":2,"isActive":false},{"label":"Eksperimen III: Temu Kembali Kontekstual","href":"Experiment-III-Contextual-Retrieval","type":2,"isActive":false},{"label":"Eksperimen IV: Pengambilan Kontekstual dengan Reranker","href":"Experiment-IV-Contextual-Retrieval-with-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.md b/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.md new file mode 100644 index 000000000..c44988374 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/contextual_retrieval_with_milvus.md @@ -0,0 +1,621 @@ +--- +id: contextual_retrieval_with_milvus.md +summary: >- + Contextal Retrieval adalah metode pengambilan lanjutan yang diusulkan oleh + Anthropic untuk mengatasi masalah isolasi semantik dari potongan-potongan + dokumen, yang muncul dalam solusi Retrieval-Augmented Generation (RAG) saat + ini. Dalam paradigma RAG praktis saat ini, dokumen dibagi menjadi beberapa + bagian, dan basis data vektor digunakan untuk mencari kueri, mengambil bagian + yang paling relevan. LLM kemudian merespons kueri menggunakan + potongan-potongan yang diambil ini. Namun, proses pemotongan ini dapat + mengakibatkan hilangnya informasi kontekstual, sehingga menyulitkan retriever + untuk menentukan relevansi. +title: Pengambilan Kontekstual dengan Milvus +--- +

    Pengambilan Kontekstual dengan Milvus

    Open In Colab +GitHub Repository

    +

    + + image + Pengambilan Kontekstual gambar adalah metode pengambilan lanjutan yang diusulkan oleh Anthropic untuk mengatasi masalah isolasi semantik dari potongan-potongan, yang muncul dalam solusi Retrieval-Augmented Generation (RAG) saat ini. Dalam paradigma RAG praktis saat ini, dokumen dibagi menjadi beberapa bagian, dan basis data vektor digunakan untuk mencari kueri, mengambil bagian yang paling relevan. LLM kemudian merespons kueri menggunakan potongan-potongan yang diambil ini. Namun, proses pemotongan ini dapat mengakibatkan hilangnya informasi kontekstual, sehingga menyulitkan retriever untuk menentukan relevansi.

    +

    Contextual Retrieval meningkatkan sistem pencarian tradisional dengan menambahkan konteks yang relevan pada setiap potongan dokumen sebelum disematkan atau diindeks, sehingga meningkatkan akurasi dan mengurangi kesalahan pencarian. Dikombinasikan dengan teknik seperti pengambilan hibrida dan pemeringkatan ulang, hal ini meningkatkan sistem Retrieval-Augmented Generation (RAG), terutama untuk basis pengetahuan yang besar. Selain itu, ia menawarkan solusi yang hemat biaya jika dipasangkan dengan cache yang cepat, yang secara signifikan mengurangi latensi dan biaya operasional, dengan potongan yang dikontekstualisasikan dengan biaya sekitar $ 1,02 per juta token dokumen. Hal ini menjadikannya pendekatan yang terukur dan efisien untuk menangani basis pengetahuan yang besar. Solusi Anthropic menunjukkan dua aspek yang mendalam:

    +
      +
    • Document Enhancement: Penulisan ulang kueri adalah teknik penting dalam pencarian informasi modern, yang sering kali menggunakan informasi tambahan untuk membuat kueri menjadi lebih informatif. Demikian pula, untuk mencapai kinerja yang lebih baik dalam RAG, prapemrosesan dokumen dengan LLM (misalnya, membersihkan sumber data, melengkapi informasi yang hilang, meringkas, dll.) sebelum pengindeksan dapat secara signifikan meningkatkan peluang untuk mengambil dokumen yang relevan. Dengan kata lain, langkah prapemrosesan ini membantu mendekatkan dokumen ke kueri dalam hal relevansi.
    • +
    • Low-Cost Processing by Caching Long Context: Salah satu kekhawatiran umum ketika menggunakan LLM untuk memproses dokumen adalah biaya. KVCache adalah solusi populer yang memungkinkan penggunaan kembali hasil antara untuk konteks sebelumnya yang sama. Meskipun sebagian besar vendor LLM yang dihosting membuat fitur ini transparan bagi pengguna, Anthropic memberikan kontrol kepada pengguna atas proses caching. Ketika terjadi pemanggilan cache, sebagian besar komputasi dapat disimpan (hal ini biasa terjadi ketika konteks yang panjang tetap sama, tetapi instruksi untuk setiap kueri berubah). Untuk lebih jelasnya, klik di sini.
    • +
    +

    Dalam buku catatan ini, kami akan mendemonstrasikan bagaimana melakukan pengambilan kontekstual menggunakan Milvus dengan LLM, menggabungkan pengambilan hibrida padat-jarang dan perangking ulang untuk menciptakan sistem pengambilan yang semakin kuat. Data dan pengaturan eksperimental didasarkan pada pengambilan kontekstual.

    +

    Persiapan

    Instal Ketergantungan

    $ pip install "pymilvus[model]"
    +$ pip install tqdm
    +$ pip install anthropic
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Anda akan membutuhkan kunci API dari Cohere, Voyage, dan Anthropic untuk menjalankan kode.

    +

    Mengunduh Data

    Perintah berikut ini akan mengunduh contoh data yang digunakan dalam demo Anthropic asli.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    Mendefinisikan Retriever

    Kelas ini didesain agar fleksibel, sehingga Anda dapat memilih mode pengambilan data yang berbeda sesuai dengan kebutuhan Anda. Dengan menentukan opsi dalam metode inisialisasi, Anda dapat menentukan apakah akan menggunakan pencarian kontekstual, pencarian hibrida (menggabungkan metode pencarian padat dan jarang), atau perangking untuk hasil yang lebih baik.

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus.model.reranker import CohereRerankFunction
    +
    +from typing import List, Dict, Any
    +from typing import Callable
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +from tqdm import tqdm
    +import json
    +import anthropic
    +
    +
    +class MilvusContextualRetriever:
    +    def __init__(
    +        self,
    +        uri="milvus.db",
    +        collection_name="contexual_bgem3",
    +        dense_embedding_function=None,
    +        use_sparse=False,
    +        sparse_embedding_function=None,
    +        use_contextualize_embedding=False,
    +        anthropic_client=None,
    +        use_reranker=False,
    +        rerank_function=None,
    +    ):
    +        self.collection_name = collection_name
    +
    +        # For Milvus-lite, uri is a local path like "./milvus.db"
    +        # For Milvus standalone service, uri is like "http://localhost:19530"
    +        # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.
    +        self.client = MilvusClient(uri)
    +
    +        self.embedding_function = dense_embedding_function
    +
    +        self.use_sparse = use_sparse
    +        self.sparse_embedding_function = None
    +
    +        self.use_contextualize_embedding = use_contextualize_embedding
    +        self.anthropic_client = anthropic_client
    +
    +        self.use_reranker = use_reranker
    +        self.rerank_function = rerank_function
    +
    +        if use_sparse is True and sparse_embedding_function:
    +            self.sparse_embedding_function = sparse_embedding_function
    +        elif sparse_embedding_function is False:
    +            raise ValueError(
    +                "Sparse embedding function cannot be None if use_sparse is False"
    +            )
    +        else:
    +            pass
    +
    +    def build_collection(self):
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_field=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="dense_vector",
    +            datatype=DataType.FLOAT_VECTOR,
    +            dim=self.embedding_function.dim,
    +        )
    +        if self.use_sparse is True:
    +            schema.add_field(
    +                field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +            )
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +        if self.use_sparse is True:
    +            index_params.add_index(
    +                field_name="sparse_vector",
    +                index_type="SPARSE_INVERTED_INDEX",
    +                metric_type="IP",
    +            )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +            enable_dynamic_field=True,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        dense_vec = self.embedding_function([chunk])[0]
    +        if self.use_sparse is True:
    +            sparse_result = self.sparse_embedding_function.encode_documents([chunk])
    +            if type(sparse_result) == dict:
    +                sparse_vec = sparse_result["sparse"][[0]]
    +            else:
    +                sparse_vec = sparse_result[[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def insert_contextualized_data(self, doc, chunk, metadata):
    +        contextualized_text, usage = self.situate_context(doc, chunk)
    +        metadata["context"] = contextualized_text
    +        text_to_embed = f"{chunk}\n\n{contextualized_text}"
    +        dense_vec = self.embedding_function([text_to_embed])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_documents(
    +                [text_to_embed]
    +            )["sparse"][[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def situate_context(self, doc: str, chunk: str):
    +        DOCUMENT_CONTEXT_PROMPT = """
    +        <document>
    +        {doc_content}
    +        </document>
    +        """
    +
    +        CHUNK_CONTEXT_PROMPT = """
    +        Here is the chunk we want to situate within the whole document
    +        <chunk>
    +        {chunk_content}
    +        </chunk>
    +
    +        Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.
    +        Answer only with the succinct context and nothing else.
    +        """
    +
    +        response = self.anthropic_client.beta.prompt_caching.messages.create(
    +            model="claude-3-haiku-20240307",
    +            max_tokens=1000,
    +            temperature=0.0,
    +            messages=[
    +                {
    +                    "role": "user",
    +                    "content": [
    +                        {
    +                            "type": "text",
    +                            "text": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),
    +                            "cache_control": {
    +                                "type": "ephemeral"
    +                            },  # we will make use of prompt caching for the full documents
    +                        },
    +                        {
    +                            "type": "text",
    +                            "text": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),
    +                        },
    +                    ],
    +                },
    +            ],
    +            extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"},
    +        )
    +        return response.content[0].text, response.usage
    +
    +    def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:
    +        dense_vec = self.embedding_function([query])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_queries([query])[
    +                "sparse"
    +            ][[0]]
    +
    +        req_list = []
    +        if self.use_reranker:
    +            k = k * 10
    +        if self.use_sparse is True:
    +            req_list = []
    +            dense_search_param = {
    +                "data": [dense_vec],
    +                "anns_field": "dense_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            dense_req = AnnSearchRequest(**dense_search_param)
    +            req_list.append(dense_req)
    +
    +            sparse_search_param = {
    +                "data": [sparse_vec],
    +                "anns_field": "sparse_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            sparse_req = AnnSearchRequest(**sparse_search_param)
    +
    +            req_list.append(sparse_req)
    +
    +            docs = self.client.hybrid_search(
    +                self.collection_name,
    +                req_list,
    +                RRFRanker(),
    +                k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        else:
    +            docs = self.client.search(
    +                self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        if self.use_reranker and self.use_contextualize_embedding:
    +            reranked_texts = []
    +            reranked_docs = []
    +            for i in range(k):
    +                if self.use_contextualize_embedding:
    +                    reranked_texts.append(
    +                        f"{docs[0][i]['entity']['content']}\n\n{docs[0][i]['entity']['context']}"
    +                    )
    +                else:
    +                    reranked_texts.append(f"{docs[0][i]['entity']['content']}")
    +            results = self.rerank_function(query, reranked_texts)
    +            for result in results:
    +                reranked_docs.append(docs[0][result.index])
    +            docs[0] = reranked_docs
    +        return docs
    +
    +
    +def evaluate_retrieval(
    +    queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20
    +) -> Dict[str, float]:
    +    total_score = 0
    +    total_queries = len(queries)
    +    for query_item in tqdm(queries, desc="Evaluating retrieval"):
    +        query = query_item["query"]
    +        golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +        # Find all golden chunk contents
    +        golden_contents = []
    +        for doc_uuid, chunk_index in golden_chunk_uuids:
    +            golden_doc = next(
    +                (
    +                    doc
    +                    for doc in query_item["golden_documents"]
    +                    if doc["uuid"] == doc_uuid
    +                ),
    +                None,
    +            )
    +            if not golden_doc:
    +                print(f"Warning: Golden document not found for UUID {doc_uuid}")
    +                continue
    +
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if not golden_chunk:
    +                print(
    +                    f"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}"
    +                )
    +                continue
    +
    +            golden_contents.append(golden_chunk["content"].strip())
    +
    +        if not golden_contents:
    +            print(f"Warning: No golden contents found for query: {query}")
    +            continue
    +
    +        retrieved_docs = retrieval_function(query, db, k=k)
    +
    +        # Count how many golden chunks are in the top k retrieved documents
    +        chunks_found = 0
    +        for golden_content in golden_contents:
    +            for doc in retrieved_docs[0][:k]:
    +                retrieved_content = doc["entity"]["content"].strip()
    +                if retrieved_content == golden_content:
    +                    chunks_found += 1
    +                    break
    +
    +        query_score = chunks_found / len(golden_contents)
    +        total_score += query_score
    +
    +    average_score = total_score / total_queries
    +    pass_at_n = average_score * 100
    +    return {
    +        "pass_at_n": pass_at_n,
    +        "average_score": average_score,
    +        "total_queries": total_queries,
    +    }
    +
    +
    +def retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:
    +    return db.search(query, k=k)
    +
    +
    +def load_jsonl(file_path: str) -> List[Dict[str, Any]]:
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +def evaluate_db(db, original_jsonl_path: str, k):
    +    # Load the original JSONL data for queries and ground truth
    +    original_data = load_jsonl(original_jsonl_path)
    +
    +    # Evaluate retrieval
    +    results = evaluate_retrieval(original_data, retrieve_base, db, k)
    +    print(f"Pass@{k}: {results['pass_at_n']:.2f}%")
    +    print(f"Total Score: {results['average_score']}")
    +    print(f"Total queries: {results['total_queries']}")
    +
    +

    Sekarang Anda perlu menginisialisasi model-model ini untuk eksperimen berikut. Anda dapat dengan mudah beralih ke model lain menggunakan pustaka model PyMilvus.

    +
    dense_ef = VoyageEmbeddingFunction(api_key="your-voyage-api-key", model_name="voyage-2")
    +sparse_ef = BGEM3EmbeddingFunction()
    +cohere_rf = CohereRerankFunction(api_key="your-cohere-api-key")
    +
    +
    Fetching 30 files:   0%|          | 0/30 [00:00<?, ?it/s]
    +
    +
    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +

    Eksperimen I: Pengambilan Standar

    Pengambilan standar hanya menggunakan sematan padat untuk mengambil dokumen terkait. Dalam percobaan ini, kita akan menggunakan Pass@5 untuk mereproduksi hasil dari repo asli.

    +
    standard_retriever = MilvusContextualRetriever(
    +    uri="standard.db", collection_name="standard", dense_embedding_function=dense_ef
    +)
    +
    +standard_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(standard_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [01:29<00:00,  2.77it/s]
    +
    +Pass@5: 80.92%
    +Total Score: 0.8091877880184332
    +Total queries: 248
    +
    +

    Eksperimen II: Pengambilan Hibrida

    Setelah kita mendapatkan hasil yang menjanjikan dengan penyematan Voyage, kita akan beralih ke pengambilan hibrida dengan menggunakan model BGE-M3 yang menghasilkan penyematan jarang yang kuat. Hasil dari dense retrieval dan sparse retrieval akan digabungkan menggunakan metode Reciprocal Rank Fusion (RRF) untuk menghasilkan hasil hybrid.

    +
    hybrid_retriever = MilvusContextualRetriever(
    +    uri="hybrid.db",
    +    collection_name="hybrid",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +)
    +
    +hybrid_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        hybrid_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(hybrid_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:09<00:00,  1.92it/s]
    +
    +Pass@5: 84.69%
    +Total Score: 0.8469182027649771
    +Total queries: 248
    +
    +

    Eksperimen III: Temu Kembali Kontekstual

    Temu kembali hibrida menunjukkan peningkatan, tetapi hasilnya dapat lebih ditingkatkan dengan menerapkan metode temu kembali kontekstual. Untuk mencapai hal ini, kami akan menggunakan model bahasa Anthropic untuk mempersiapkan konteks dari keseluruhan dokumen untuk setiap potongan.

    +
    anthropic_client = anthropic.Anthropic(
    +    api_key="your-anthropic-api-key",
    +)
    +
    +
    contextual_retriever = MilvusContextualRetriever(
    +    uri="contextual.db",
    +    collection_name="contextual",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +    use_contextualize_embedding=True,
    +    anthropic_client=anthropic_client,
    +)
    +
    +contextual_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        contextual_retriever.insert_contextualized_data(
    +            doc_content, chunk_content, metadata
    +        )
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
     Evaluating retrieval: 100%|██████████| 248/248 [01:55<00:00,  2.15it/s]
    +Pass@5: 87.14%
    +Total Score: 0.8713517665130568
    +Total queries: 248 
    +
    +

    Eksperimen IV: Pengambilan Kontekstual dengan Reranker

    Hasilnya dapat ditingkatkan lebih lanjut dengan menambahkan perangking ulang Cohere. Tanpa menginisialisasi retriever baru dengan reranker secara terpisah, kita cukup mengonfigurasi retriever yang sudah ada untuk menggunakan reranker untuk meningkatkan kinerja.

    +
    contextual_retriever.use_reranker = True
    +contextual_retriever.rerank_function = cohere_rf
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:02<00:00,  2.00it/s]
    +Pass@5: 90.91%
    +Total Score: 0.9090821812596005
    +Total queries: 248
    +
    +

    Kami telah mendemonstrasikan beberapa metode untuk meningkatkan kinerja pengambilan. Dengan desain yang lebih ad-hoc yang disesuaikan dengan skenario, pengambilan kontekstual menunjukkan potensi yang signifikan untuk melakukan prapemrosesan dokumen dengan biaya rendah, sehingga menghasilkan sistem RAG yang lebih baik.

    diff --git a/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.json b/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.json new file mode 100644 index 000000000..df1a0fa05 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"DNA Sequence Classification","anchorList":[{"label":"Klasifikasi Urutan DNA","href":"DNA-Sequence-Classification","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.md b/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.md new file mode 100644 index 000000000..7dc77c50a --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/dna_sequence_classification.md @@ -0,0 +1,36 @@ +--- +id: dna_sequence_classification.md +summary: Membangun sistem klasifikasi sekuens DNA dengan Milvus. +title: Klasifikasi Urutan DNA +--- +

    Klasifikasi Urutan DNA

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun model klasifikasi sekuens DNA.

    +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    +
      +
    • CountVectorizer
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    Sekuens DNA adalah konsep yang populer dalam penelusuran gen, identifikasi spesies, diagnosis penyakit, dan masih banyak lagi. Ketika semua industri membutuhkan metode penelitian yang lebih cerdas dan efisien, kecerdasan buatan telah menarik banyak perhatian terutama dari domain biologi dan medis. Semakin banyak ilmuwan dan peneliti yang berkontribusi pada pembelajaran mesin dan pembelajaran mendalam di bidang bioinformatika. Untuk membuat hasil eksperimen lebih meyakinkan, salah satu opsi yang umum dilakukan adalah dengan meningkatkan ukuran sampel. Kolaborasi dengan data besar dalam genomik membawa lebih banyak kemungkinan aplikasi dalam kenyataan. Namun, penyelarasan sekuens tradisional memiliki keterbatasan, sehingga tidak cocok untuk dataset yang besar. Untuk mengurangi trade-off pada kenyataannya, vektorisasi adalah pilihan yang baik untuk kumpulan data sekuens DNA yang besar.

    +


    +

    Dalam tutorial ini, Anda akan belajar bagaimana membangun model klasifikasi sekuens DNA. Tutorial ini menggunakan CountVectorizer untuk mengekstrak fitur-fitur sekuens DNA dan mengubahnya menjadi vektor. Kemudian, vektor-vektor ini disimpan dalam Milvus dan kelas DNA yang sesuai disimpan dalam MySQL. Pengguna dapat melakukan pencarian kemiripan vektor di Milvus dan mengingat klasifikasi DNA yang sesuai dari MySQL.

    +


    +

    + + dna + dna

    diff --git a/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.json b/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.json new file mode 100644 index 000000000..af7d48b82 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","pip install \"pymilvus[model]\" -U \n","import json\n\nfrom pymilvus import (\n MilvusClient,\n DataType,\n Function,\n FunctionType,\n AnnSearchRequest,\n RRFRanker,\n)\n\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\n\nclass HybridRetriever:\n def __init__(self, uri, collection_name=\"hybrid\", dense_embedding_function=None):\n self.uri = uri\n self.collection_name = collection_name\n self.embedding_function = dense_embedding_function\n self.use_reranker = True\n self.use_sparse = True\n self.client = MilvusClient(uri=uri)\n\n def build_collection(self):\n if isinstance(self.embedding_function.dim, dict):\n dense_dim = self.embedding_function.dim[\"dense\"]\n else:\n dense_dim = self.embedding_function.dim\n\n tokenizer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"length\",\n \"max\": 200,\n },\n {\"type\": \"stemmer\", \"language\": \"english\"},\n {\n \"type\": \"stop\",\n \"stop_words\": [\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"for\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"no\",\n \"not\",\n \"of\",\n \"on\",\n \"or\",\n \"such\",\n \"that\",\n \"the\",\n \"their\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"to\",\n \"was\",\n \"will\",\n \"with\",\n ],\n },\n ],\n }\n\n schema = MilvusClient.create_schema()\n schema.add_field(\n field_name=\"pk\",\n datatype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n )\n schema.add_field(\n field_name=\"content\",\n datatype=DataType.VARCHAR,\n max_length=65535,\n analyzer_params=tokenizer_params,\n enable_match=True,\n enable_analyzer=True,\n )\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n schema.add_field(\n field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=dense_dim\n )\n schema.add_field(\n field_name=\"original_uuid\", datatype=DataType.VARCHAR, max_length=128\n )\n schema.add_field(field_name=\"doc_id\", datatype=DataType.VARCHAR, max_length=64)\n schema.add_field(\n field_name=\"chunk_id\", datatype=DataType.VARCHAR, max_length=64\n ),\n schema.add_field(field_name=\"original_index\", datatype=DataType.INT32)\n\n functions = Function(\n name=\"bm25\",\n function_type=FunctionType.BM25,\n input_field_names=[\"content\"],\n output_field_names=\"sparse_vector\",\n )\n\n schema.add_function(functions)\n\n index_params = MilvusClient.prepare_index_params()\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"BM25\",\n )\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n )\n\n def insert_data(self, chunk, metadata):\n embedding = self.embedding_function([chunk])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n self.client.insert(\n self.collection_name, {\"dense_vector\": dense_vec, **metadata}\n )\n\n def search(self, query: str, k: int = 20, mode=\"hybrid\"):\n\n output_fields = [\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n ]\n if mode in [\"dense\", \"hybrid\"]:\n embedding = self.embedding_function([query])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n\n if mode == \"sparse\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[query],\n anns_field=\"sparse_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"dense\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"hybrid\":\n full_text_search_params = {\"metric_type\": \"BM25\"}\n full_text_search_req = AnnSearchRequest(\n [query], \"sparse_vector\", full_text_search_params, limit=k\n )\n\n dense_search_params = {\"metric_type\": \"IP\"}\n dense_req = AnnSearchRequest(\n [dense_vec], \"dense_vector\", dense_search_params, limit=k\n )\n\n results = self.client.hybrid_search(\n self.collection_name,\n [full_text_search_req, dense_req],\n ranker=RRFRanker(),\n limit=k,\n output_fields=output_fields,\n )\n else:\n raise ValueError(\"Invalid mode\")\n return [\n {\n \"doc_id\": doc[\"entity\"][\"doc_id\"],\n \"chunk_id\": doc[\"entity\"][\"chunk_id\"],\n \"content\": doc[\"entity\"][\"content\"],\n \"score\": doc[\"distance\"],\n }\n for doc in results[0]\n ]\n","dense_ef = BGEM3EmbeddingFunction()\nstandard_retriever = HybridRetriever(\n uri=\"http://localhost:19530\",\n collection_name=\"milvus_hybrid\",\n dense_embedding_function=dense_ef,\n)\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n\nis_insert = True\nif is_insert:\n standard_retriever.build_collection()\n for doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","results = standard_retriever.search(\"create a logger?\", mode=\"sparse\", k=3)\nprint(results)\n","def load_jsonl(file_path: str):\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndataset = load_jsonl(\"evaluation_set.jsonl\")\nk = 5\n\n# mode can be \"dense\", \"sparse\" or \"hybrid\".\nmode = \"hybrid\"\n\ntotal_query_score = 0\nnum_queries = 0\n\nfor query_item in dataset:\n\n query = query_item[\"query\"]\n\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n chunks_found = 0\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (doc for doc in query_item[\"golden_documents\"] if doc[\"uuid\"] == doc_uuid),\n None,\n )\n if golden_doc:\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if golden_chunk:\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n results = standard_retriever.search(query, mode=mode, k=5)\n\n for golden_content in golden_contents:\n for doc in results[:k]:\n retrieved_content = doc[\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n\n total_query_score += query_score\n num_queries += 1\n","print(\"Pass@5: \", total_query_score / num_queries)\n"],"headingContent":"Full Text Search with Milvus","anchorList":[{"label":"Pencarian Teks Lengkap dengan Milvus","href":"Full-Text-Search-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Evaluasi","href":"Evaluation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.md b/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.md new file mode 100644 index 000000000..5f9549784 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/full_text_search_with_milvus.md @@ -0,0 +1,372 @@ +--- +id: full_text_search_with_milvus.md +summary: >- + Dengan dirilisnya Milvus 2.5, Pencarian Teks Penuh memungkinkan pengguna untuk + mencari teks secara efisien berdasarkan kata kunci atau frasa, memberikan + kemampuan pencarian teks yang kuat. Fitur ini meningkatkan akurasi pencarian + dan dapat dikombinasikan secara mulus dengan pengambilan berbasis penyematan + untuk pencarian hibrida, sehingga memungkinkan untuk mendapatkan hasil + berbasis semantik dan kata kunci dalam satu kueri. Dalam buku catatan ini, + kami akan menunjukkan penggunaan dasar pencarian teks lengkap di Milvus. +title: Pencarian Teks Lengkap dengan Milvus +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Pencarian Teks Lengkap dengan Milvus

    Dengan dirilisnya Milvus 2.5, Pencarian Teks Penuh memungkinkan pengguna untuk mencari teks secara efisien berdasarkan kata kunci atau frasa, sehingga memberikan kemampuan pencarian teks yang kuat. Fitur ini meningkatkan akurasi pencarian dan dapat dikombinasikan secara mulus dengan pengambilan berbasis penyematan untuk pencarian hibrida, sehingga memungkinkan untuk mendapatkan hasil berbasis semantik dan kata kunci dalam satu kueri. Dalam buku catatan ini, kami akan menunjukkan penggunaan dasar pencarian teks lengkap di Milvus.

    +

    Persiapan

    Unduh dataset

    Perintah berikut ini akan mengunduh contoh data yang digunakan dalam demo Anthropic yang asli.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    Instal Milvus 2.5

    Lihat panduan instalasi resmi untuk detail lebih lanjut.

    +

    Menginstal PyMilvus

    Jalankan perintah berikut untuk menginstal PyMilvus:

    +
    pip install "pymilvus[model]" -U 
    +
    +

    Tentukan Retriever

    import json
    +
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    Function,
    +    FunctionType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +
    +class HybridRetriever:
    +    def __init__(self, uri, collection_name="hybrid", dense_embedding_function=None):
    +        self.uri = uri
    +        self.collection_name = collection_name
    +        self.embedding_function = dense_embedding_function
    +        self.use_reranker = True
    +        self.use_sparse = True
    +        self.client = MilvusClient(uri=uri)
    +
    +    def build_collection(self):
    +        if isinstance(self.embedding_function.dim, dict):
    +            dense_dim = self.embedding_function.dim["dense"]
    +        else:
    +            dense_dim = self.embedding_function.dim
    +
    +        tokenizer_params = {
    +            "tokenizer": "standard",
    +            "filter": [
    +                "lowercase",
    +                {
    +                    "type": "length",
    +                    "max": 200,
    +                },
    +                {"type": "stemmer", "language": "english"},
    +                {
    +                    "type": "stop",
    +                    "stop_words": [
    +                        "a",
    +                        "an",
    +                        "and",
    +                        "are",
    +                        "as",
    +                        "at",
    +                        "be",
    +                        "but",
    +                        "by",
    +                        "for",
    +                        "if",
    +                        "in",
    +                        "into",
    +                        "is",
    +                        "it",
    +                        "no",
    +                        "not",
    +                        "of",
    +                        "on",
    +                        "or",
    +                        "such",
    +                        "that",
    +                        "the",
    +                        "their",
    +                        "then",
    +                        "there",
    +                        "these",
    +                        "they",
    +                        "this",
    +                        "to",
    +                        "was",
    +                        "will",
    +                        "with",
    +                    ],
    +                },
    +            ],
    +        }
    +
    +        schema = MilvusClient.create_schema()
    +        schema.add_field(
    +            field_name="pk",
    +            datatype=DataType.VARCHAR,
    +            is_primary=True,
    +            auto_id=True,
    +            max_length=100,
    +        )
    +        schema.add_field(
    +            field_name="content",
    +            datatype=DataType.VARCHAR,
    +            max_length=65535,
    +            analyzer_params=tokenizer_params,
    +            enable_match=True,
    +            enable_analyzer=True,
    +        )
    +        schema.add_field(
    +            field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +        )
    +        schema.add_field(
    +            field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=dense_dim
    +        )
    +        schema.add_field(
    +            field_name="original_uuid", datatype=DataType.VARCHAR, max_length=128
    +        )
    +        schema.add_field(field_name="doc_id", datatype=DataType.VARCHAR, max_length=64)
    +        schema.add_field(
    +            field_name="chunk_id", datatype=DataType.VARCHAR, max_length=64
    +        ),
    +        schema.add_field(field_name="original_index", datatype=DataType.INT32)
    +
    +        functions = Function(
    +            name="bm25",
    +            function_type=FunctionType.BM25,
    +            input_field_names=["content"],
    +            output_field_names="sparse_vector",
    +        )
    +
    +        schema.add_function(functions)
    +
    +        index_params = MilvusClient.prepare_index_params()
    +        index_params.add_index(
    +            field_name="sparse_vector",
    +            index_type="SPARSE_INVERTED_INDEX",
    +            metric_type="BM25",
    +        )
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        embedding = self.embedding_function([chunk])
    +        if isinstance(embedding, dict) and "dense" in embedding:
    +            dense_vec = embedding["dense"][0]
    +        else:
    +            dense_vec = embedding[0]
    +        self.client.insert(
    +            self.collection_name, {"dense_vector": dense_vec, **metadata}
    +        )
    +
    +    def search(self, query: str, k: int = 20, mode="hybrid"):
    +
    +        output_fields = [
    +            "content",
    +            "original_uuid",
    +            "doc_id",
    +            "chunk_id",
    +            "original_index",
    +        ]
    +        if mode in ["dense", "hybrid"]:
    +            embedding = self.embedding_function([query])
    +            if isinstance(embedding, dict) and "dense" in embedding:
    +                dense_vec = embedding["dense"][0]
    +            else:
    +                dense_vec = embedding[0]
    +
    +        if mode == "sparse":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[query],
    +                anns_field="sparse_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "dense":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "hybrid":
    +            full_text_search_params = {"metric_type": "BM25"}
    +            full_text_search_req = AnnSearchRequest(
    +                [query], "sparse_vector", full_text_search_params, limit=k
    +            )
    +
    +            dense_search_params = {"metric_type": "IP"}
    +            dense_req = AnnSearchRequest(
    +                [dense_vec], "dense_vector", dense_search_params, limit=k
    +            )
    +
    +            results = self.client.hybrid_search(
    +                self.collection_name,
    +                [full_text_search_req, dense_req],
    +                ranker=RRFRanker(),
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        else:
    +            raise ValueError("Invalid mode")
    +        return [
    +            {
    +                "doc_id": doc["entity"]["doc_id"],
    +                "chunk_id": doc["entity"]["chunk_id"],
    +                "content": doc["entity"]["content"],
    +                "score": doc["distance"],
    +            }
    +            for doc in results[0]
    +        ]
    +
    +
    dense_ef = BGEM3EmbeddingFunction()
    +standard_retriever = HybridRetriever(
    +    uri="http://localhost:19530",
    +    collection_name="milvus_hybrid",
    +    dense_embedding_function=dense_ef,
    +)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 108848.72it/s]
    +
    +

    Masukkan data

    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +is_insert = True
    +if is_insert:
    +    standard_retriever.build_collection()
    +    for doc in dataset:
    +        doc_content = doc["content"]
    +        for chunk in doc["chunks"]:
    +            metadata = {
    +                "doc_id": doc["doc_id"],
    +                "original_uuid": doc["original_uuid"],
    +                "chunk_id": chunk["chunk_id"],
    +                "original_index": chunk["original_index"],
    +                "content": chunk["content"],
    +            }
    +            chunk_content = chunk["content"]
    +            standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    results = standard_retriever.search("create a logger?", mode="sparse", k=3)
    +print(results)
    +
    +
    [{'doc_id': 'doc_10', 'chunk_id': 'doc_10_chunk_0', 'content': 'use {\n    crate::args::LogArgs,\n    anyhow::{anyhow, Result},\n    simplelog::{Config, LevelFilter, WriteLogger},\n    std::fs::File,\n};\n\npub struct Logger;\n\nimpl Logger {\n    pub fn init(args: &impl LogArgs) -> Result<()> {\n        let filter: LevelFilter = args.log_level().into();\n        if filter != LevelFilter::Off {\n            let logfile = File::create(args.log_file())\n                .map_err(|e| anyhow!("Failed to open log file: {e:}"))?;\n            WriteLogger::init(filter, Config::default(), logfile)\n                .map_err(|e| anyhow!("Failed to initalize logger: {e:}"))?;\n        }\n        Ok(())\n    }\n}\n', 'score': 9.12518310546875}, {'doc_id': 'doc_87', 'chunk_id': 'doc_87_chunk_3', 'content': '\t\tLoggerPtr INF = Logger::getLogger(LOG4CXX_TEST_STR("INF"));\n\t\tINF->setLevel(Level::getInfo());\n\n\t\tLoggerPtr INF_ERR = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR"));\n\t\tINF_ERR->setLevel(Level::getError());\n\n\t\tLoggerPtr DEB = Logger::getLogger(LOG4CXX_TEST_STR("DEB"));\n\t\tDEB->setLevel(Level::getDebug());\n\n\t\t// Note: categories with undefined level\n\t\tLoggerPtr INF_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.UNDEF"));\n\t\tLoggerPtr INF_ERR_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR.UNDEF"));\n\t\tLoggerPtr UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("UNDEF"));\n\n', 'score': 7.0077056884765625}, {'doc_id': 'doc_89', 'chunk_id': 'doc_89_chunk_3', 'content': 'using namespace log4cxx;\nusing namespace log4cxx::helpers;\n\nLOGUNIT_CLASS(FMTTestCase)\n{\n\tLOGUNIT_TEST_SUITE(FMTTestCase);\n\tLOGUNIT_TEST(test1);\n\tLOGUNIT_TEST(test1_expanded);\n\tLOGUNIT_TEST(test10);\n//\tLOGUNIT_TEST(test_date);\n\tLOGUNIT_TEST_SUITE_END();\n\n\tLoggerPtr root;\n\tLoggerPtr logger;\n\npublic:\n\tvoid setUp()\n\t{\n\t\troot = Logger::getRootLogger();\n\t\tMDC::clear();\n\t\tlogger = Logger::getLogger(LOG4CXX_TEST_STR("java.org.apache.log4j.PatternLayoutTest"));\n\t}\n\n', 'score': 6.750633716583252}]
    +
    +

    Evaluasi

    Sekarang kita telah memasukkan dataset ke dalam Milvus, kita dapat menggunakan pencarian padat, jarang, atau hibrida untuk mengambil 5 hasil teratas. Anda dapat mengubah mode dan mengevaluasi masing-masing. Kami menyajikan metrik Pass@5, yang melibatkan pengambilan 5 hasil teratas untuk setiap kueri dan menghitung Recall.

    +
    def load_jsonl(file_path: str):
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +dataset = load_jsonl("evaluation_set.jsonl")
    +k = 5
    +
    +# mode can be "dense", "sparse" or "hybrid".
    +mode = "hybrid"
    +
    +total_query_score = 0
    +num_queries = 0
    +
    +for query_item in dataset:
    +
    +    query = query_item["query"]
    +
    +    golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +    chunks_found = 0
    +    golden_contents = []
    +    for doc_uuid, chunk_index in golden_chunk_uuids:
    +        golden_doc = next(
    +            (doc for doc in query_item["golden_documents"] if doc["uuid"] == doc_uuid),
    +            None,
    +        )
    +        if golden_doc:
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if golden_chunk:
    +                golden_contents.append(golden_chunk["content"].strip())
    +
    +    results = standard_retriever.search(query, mode=mode, k=5)
    +
    +    for golden_content in golden_contents:
    +        for doc in results[:k]:
    +            retrieved_content = doc["content"].strip()
    +            if retrieved_content == golden_content:
    +                chunks_found += 1
    +                break
    +
    +    query_score = chunks_found / len(golden_contents)
    +
    +    total_query_score += query_score
    +    num_queries += 1
    +
    +
    print("Pass@5: ", total_query_score / num_queries)
    +
    +
    Pass@5:  0.7911386328725037
    +
    diff --git a/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.json b/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.json new file mode 100644 index 000000000..db5bad946 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.json @@ -0,0 +1 @@ +{"codeList":["import functools\n\nfrom datasets import load_dataset\nimport numpy as np\nimport pandas as pd\nimport pymilvus\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nimport torch\nimport torch.nn.functional as F\nfrom tqdm import tqdm\n","model = SentenceTransformer(\n # Remove 'device='mps' if running on non-Mac device\n \"nomic-ai/nomic-embed-text-v1.5\",\n trust_remote_code=True,\n device=\"mps\",\n)\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","embedding_dim = 768\nsearch_dim = 128\ncollection_name = \"movie_embeddings\"\n\nclient = MilvusClient(uri=\"./wiki-movie-plots-matryoshka.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n # First sixth of unnormalized embedding vector\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n # Entire unnormalized embedding vector\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"COSINE\")\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n # This particular model requires us to prefix 'search_document:' to stored entities\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Output of embedding model is unnormalized\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n \"An archaeologist searches for ancient artifacts while fighting Nazis.\",\n \"A teenager fakes illness to get off school and have adventures with two friends.\",\n \"A young couple with a kid look after a hotel during winter and the husband goes insane.\",\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\n# This particular model requires us to prefix 'search_query:' to queries\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries]\nsearch_data = embed_search(instruct_queries)\n\n# Normalize head embeddings\nhead_search = [x[:search_dim] for x in search_data]\n\n# Perform standard vector search on first sixth of embedding dimensions\nres = client.search(\n collection_name=collection_name,\n data=head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits][:5]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:\n \"\"\"\n Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.\n\n \"\"\"\n rows = [x[\"entity\"] for x in hits]\n rows_dict = [\n {\"title\": x[\"title\"], \"embedding\": torch.tensor(x[\"embedding\"])} for x in rows\n ]\n return pd.DataFrame.from_records(rows_dict)\n\n\ndfs = [hits_to_dataframe(hits) for hits in res]\n","# An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)\ndef calculate_score(row, query_emb=None, dims=768):\n emb = F.normalize(row[\"embedding\"][:dims], dim=-1)\n return (emb @ query_emb).item()\n\n\n# You could also add a top-K parameter as a termination condition\ndef funnel_search(\n df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5\n) -> pd.DataFrame:\n # Loop over increasing prefixes of the embeddings\n for dims in scales:\n # Query vector must be normalized for each new dimensionality\n emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))\n\n # Score\n scores = df.apply(\n functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1\n )\n df[\"scores\"] = scores\n\n # Re-rank\n df = df.sort_values(by=\"scores\", ascending=False)\n\n # Prune (in our case, remove half of candidates at each step)\n df = df.head(int(prune_ratio * len(df)))\n\n return df\n\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, search_data)\n]\n","for d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:5][\"title\"], \"\\n\")\n","# Search on entire embeddings\nres = client.search(\n collection_name=collection_name,\n data=search_data,\n anns_field=\"embedding\",\n limit=5,\n output_fields=[\"title\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","queries2 = [\n \"A teenager fakes illness to get off school and have adventures with two friends.\"\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries2]\nsearch_data2 = embed_search(instruct_queries)\nhead_search2 = [x[:search_dim] for x in search_data2]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=head_search2,\n anns_field=\"head_embedding\",\n limit=256,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", queries2[0])\n for idx, row in enumerate(rows):\n if row[\"title\"].strip() == \"Ferris Bueller's Day Off\":\n print(f\"Row {idx}: Ferris Bueller's Day Off\")\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries2, dfs, search_data2)\n]\n\nfor d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:7][\"title\"].to_string(index=False), \"\\n\")\n","client = MilvusClient(uri=\"./wikiplots-matryoshka-flipped.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n\nindex_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Encode and flip embeddings\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n embeddings = torch.flip(embeddings, dims=[-1])\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","# Normalize head embeddings\n\nflip_search_data = [\n torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data\n]\nflip_head_search = [x[:search_dim] for x in flip_search_data]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=flip_head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, flip_search_data)\n]\n\nfor d in dfs_results:\n print(\n d[\"query\"],\n \"\\n\",\n d[\"results\"][:7][\"title\"].to_string(index=False, header=False),\n \"\\n\",\n )\n"],"headingContent":"Funnel Search with Matryoshka Embeddings","anchorList":[{"label":"Pencarian Corong dengan Penyematan Matryoshka","href":"Funnel-Search-with-Matryoshka-Embeddings","type":1,"isActive":false},{"label":"Memuat Model Penyematan Matryoshka","href":"Load-Matryoshka-Embedding-Model","type":2,"isActive":false},{"label":"Memuat Dataset, Menyematkan Item, dan Membangun Basis Data Vektor","href":"Loading-Dataset-Embedding-Items-and-Building-Vector-Database","type":2,"isActive":false},{"label":"Melakukan Pencarian Corong","href":"Performing-Funnel-Search","type":2,"isActive":false},{"label":"Membandingkan Pencarian Corong dengan Pencarian Biasa","href":"Comparing-Funnel-Search-to-Regular-Search","type":2,"isActive":false},{"label":"Menyelidiki Kegagalan Pemanggilan Kembali Pencarian Corong untuk Hari Libur Ferris Bueller","href":"Investigating-Funnel-Search-Recall-Failure-for-Ferris-Buellers-Day-Off","type":2,"isActive":false},{"label":"Apakah urutannya penting? Penyematan awalan vs akhiran.","href":"Does-the-order-matter-Prefix-vs-suffix-embeddings","type":2,"isActive":false},{"label":"Ringkasan","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.md b/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.md new file mode 100644 index 000000000..01e702174 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/funnel_search_with_matryoshka.md @@ -0,0 +1,571 @@ +--- +id: funnel_search_with_matryoshka.md +summary: >- + Dalam buku catatan ini, kami membahas cara menggunakan embedding Matryoshka + dengan Milvus untuk pencarian semantik. Kami mengilustrasikan sebuah algoritma + yang disebut "pencarian corong" yang memungkinkan kita untuk melakukan + pencarian kemiripan pada sebagian kecil dari dimensi embedding kita tanpa + penurunan drastis dalam recall. +title: Pencarian Corong dengan Penyematan Matryoshka +--- +

    Pencarian Corong dengan Penyematan Matryoshka

    Ketika membangun sistem pencarian vektor yang efisien, salah satu tantangan utama adalah mengelola biaya penyimpanan sambil mempertahankan latensi dan pemanggilan yang dapat diterima. Model penyematan modern menghasilkan vektor dengan ratusan atau ribuan dimensi, menciptakan penyimpanan yang signifikan dan overhead komputasi untuk vektor mentah dan indeks.

    +

    Secara tradisional, kebutuhan penyimpanan dikurangi dengan menerapkan metode kuantisasi atau pengurangan dimensi sebelum membangun indeks. Sebagai contoh, kita dapat menghemat penyimpanan dengan menurunkan presisi menggunakan Product Quantization (PQ) atau jumlah dimensi menggunakan Principal Component Analysis (PCA). Metode-metode ini menganalisis seluruh kumpulan vektor untuk menemukan vektor yang lebih ringkas yang mempertahankan hubungan semantik antar vektor.

    +

    Meskipun efektif, pendekatan standar ini mengurangi presisi atau dimensi hanya sekali dan pada skala tunggal. Namun, bagaimana jika kita dapat mempertahankan beberapa lapisan detail secara bersamaan, seperti piramida representasi yang semakin presisi?

    +

    Masuklah ke dalam penyematan Matryoshka. Dinamai berdasarkan boneka sarang Rusia (lihat ilustrasi), konstruksi cerdas ini menyematkan beberapa skala representasi dalam satu vektor. Tidak seperti metode pasca-pemrosesan tradisional, embeddings Matryoshka mempelajari struktur multi-skala ini selama proses pelatihan awal. Hasilnya luar biasa: tidak hanya penyematan penuh yang menangkap semantik input, tetapi setiap awalan subset bersarang (paruh pertama, kuartal pertama, dll.) memberikan representasi yang koheren, meskipun tidak terlalu detail.

    +
    +

    Dalam buku catatan ini, kami membahas cara menggunakan embedding Matryoshka dengan Milvus untuk pencarian semantik. Kami mengilustrasikan sebuah algoritma yang disebut "pencarian corong" yang memungkinkan kita untuk melakukan pencarian kemiripan pada sebagian kecil dari dimensi penyematan kita tanpa penurunan yang drastis dalam mengingat.

    +
    import functools
    +
    +from datasets import load_dataset
    +import numpy as np
    +import pandas as pd
    +import pymilvus
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +import torch
    +import torch.nn.functional as F
    +from tqdm import tqdm
    +
    +

    Memuat Model Penyematan Matryoshka

    Alih-alih menggunakan model embedding standar seperti sentence-transformers/all-MiniLM-L12-v2kami menggunakan model dari Nomic yang dilatih secara khusus untuk menghasilkan embedding Matryoshka.

    +
    model = SentenceTransformer(
    +    # Remove 'device='mps' if running on non-Mac device
    +    "nomic-ai/nomic-embed-text-v1.5",
    +    trust_remote_code=True,
    +    device="mps",
    +)
    +
    +
    <All keys matched successfully>
    +
    +

    Memuat Dataset, Menyematkan Item, dan Membangun Basis Data Vektor

    Kode berikut ini adalah modifikasi dari halaman dokumentasi "Pencarian Film dengan Pengubah Kalimat dan Milvus". Pertama, kita memuat dataset dari HuggingFace. Dataset ini berisi sekitar 35 ribu entri, masing-masing sesuai dengan film yang memiliki artikel Wikipedia. Kita akan menggunakan bidang Title dan PlotSummary dalam contoh ini.

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +
    Dataset({
    +    features: ['Release Year', 'Title', 'Origin/Ethnicity', 'Director', 'Cast', 'Genre', 'Wiki Page', 'Plot', 'PlotSummary'],
    +    num_rows: 34886
    +})
    +
    +

    Selanjutnya, kita sambungkan ke basis data Milvus Lite, tentukan skema datanya, dan buat koleksi dengan skema ini. Kita akan menyimpan embedding yang belum dinormalisasi dan seperenam pertama dari embedding di bidang yang terpisah. Alasannya adalah karena kita membutuhkan 1/6 pertama dari embedding Matryoshka untuk melakukan pencarian kemiripan, dan 5/6 embedding yang tersisa untuk menentukan peringkat dan meningkatkan hasil pencarian.

    +
    embedding_dim = 768
    +search_dim = 128
    +collection_name = "movie_embeddings"
    +
    +client = MilvusClient(uri="./wiki-movie-plots-matryoshka.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    # First sixth of unnormalized embedding vector
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    # Entire unnormalized embedding vector
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +

    Milvus saat ini tidak mendukung pencarian melalui subset dari embedding, jadi kami memecah embedding menjadi dua bagian: kepala mewakili subset awal vektor untuk diindeks dan dicari, dan ekor adalah sisanya. Model dilatih untuk pencarian kemiripan jarak kosinus, jadi kami menormalkan embedding kepala. Namun, untuk menghitung kemiripan untuk subset yang lebih besar di kemudian hari, kita perlu menyimpan norma dari penyisipan kepala, sehingga kita dapat menormalkannya kembali sebelum menggabungkannya ke ekor.

    +

    Untuk melakukan pencarian melalui 1/6 pertama dari penyematan, kita perlu membuat indeks pencarian vektor di bidang head_embedding. Nantinya, kita akan membandingkan hasil "pencarian corong" dengan pencarian vektor biasa, dan juga membuat indeks pencarian di atas penyematan penuh.

    +

    Yang penting, kita menggunakan metrik jarak COSINE dan bukan IP, karena jika tidak, kita harus melacak norma-norma penyematan, yang akan menyulitkan implementasi (hal ini akan lebih masuk akal setelah algoritme pencarian corong dijelaskan).

    +
    index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="COSINE")
    +client.create_index(collection_name, index_params)
    +
    +

    Terakhir, kami mengkodekan ringkasan plot untuk semua 35 ribu film dan memasukkan penyematan yang sesuai ke dalam basis data.

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    # This particular model requires us to prefix 'search_document:' to stored entities
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Output of embedding model is unnormalized
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:57<00:00,  5.18s/it]
    +
    +

    Sekarang mari kita mengimplementasikan "pencarian corong" dengan menggunakan 1/6 pertama dari dimensi penyematan Matryoshka. Saya memiliki tiga film yang akan diambil dan telah membuat ringkasan plot saya sendiri untuk menanyakan database. Kami menyematkan kueri, lalu melakukan pencarian vektor pada bidang head_embedding, mengambil 128 kandidat hasil.

    +
    queries = [
    +    "An archaeologist searches for ancient artifacts while fighting Nazis.",
    +    "A teenager fakes illness to get off school and have adventures with two friends.",
    +    "A young couple with a kid look after a hotel during winter and the husband goes insane.",
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +# This particular model requires us to prefix 'search_query:' to queries
    +instruct_queries = ["search_query: " + q.strip() for q in queries]
    +search_data = embed_search(instruct_queries)
    +
    +# Normalize head embeddings
    +head_search = [x[:search_dim] for x in search_data]
    +
    +# Perform standard vector search on first sixth of embedding dimensions
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +

    Pada titik ini, kita telah melakukan pencarian pada ruang vektor yang jauh lebih kecil, dan oleh karena itu kemungkinan besar telah menurunkan latensi dan mengurangi kebutuhan penyimpanan untuk indeks dibandingkan dengan pencarian pada ruang penuh. Mari kita periksa 5 kecocokan teratas untuk setiap kueri:

    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits][:5]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +The Passage
    +Counterblast
    +Dominion: Prequel to the Exorcist
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +How to Deal
    +Shorts
    +Blackbird
    +Valentine
    +Unfriended
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +Ghostkeeper
    +Our Vines Have Tender Grapes
    +The Ref
    +Impact
    +The House in Marsh Road
    +
    +

    Seperti yang bisa kita lihat, recall mengalami penurunan akibat pemotongan sematan selama pencarian. Pencarian corong memperbaiki hal ini dengan trik yang cerdas: kita dapat menggunakan sisa dimensi penyematan untuk memberi peringkat ulang dan memangkas daftar kandidat kita untuk memulihkan kinerja pencarian tanpa menjalankan pencarian vektor tambahan yang mahal.

    +

    Untuk memudahkan penjelasan algoritme pencarian corong, kami mengubah hit pencarian Milvus untuk setiap kueri menjadi bingkai data Pandas.

    +
    def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:
    +    """
    +    Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.
    +
    +    """
    +    rows = [x["entity"] for x in hits]
    +    rows_dict = [
    +        {"title": x["title"], "embedding": torch.tensor(x["embedding"])} for x in rows
    +    ]
    +    return pd.DataFrame.from_records(rows_dict)
    +
    +
    +dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +

    Sekarang, untuk melakukan pencarian corong, kami melakukan iterasi pada himpunan bagian yang semakin besar dari sematan. Pada setiap iterasi, kami mengubah peringkat kandidat berdasarkan kesamaan baru dan memangkas sebagian kecil dari peringkat terendah.

    +

    Untuk memperjelas hal ini, dari langkah sebelumnya kami telah mengambil 128 kandidat dengan menggunakan 1/6 dari dimensi embedding dan kueri. Langkah pertama dalam melakukan pencarian corong adalah menghitung ulang kemiripan antara kueri dan kandidat menggunakan 1/3 dimensi pertama. 64 kandidat terbawah dipangkas. Kemudian kami mengulangi proses ini dengan 2/3 dimensi pertama, dan kemudian semua dimensi, secara berurutan memangkas menjadi 32 dan 16 kandidat.

    +
    # An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)
    +def calculate_score(row, query_emb=None, dims=768):
    +    emb = F.normalize(row["embedding"][:dims], dim=-1)
    +    return (emb @ query_emb).item()
    +
    +
    +# You could also add a top-K parameter as a termination condition
    +def funnel_search(
    +    df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5
    +) -> pd.DataFrame:
    +    # Loop over increasing prefixes of the embeddings
    +    for dims in scales:
    +        # Query vector must be normalized for each new dimensionality
    +        emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))
    +
    +        # Score
    +        scores = df.apply(
    +            functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1
    +        )
    +        df["scores"] = scores
    +
    +        # Re-rank
    +        df = df.sort_values(by="scores", ascending=False)
    +
    +        # Prune (in our case, remove half of candidates at each step)
    +        df = df.head(int(prune_ratio * len(df)))
    +
    +    return df
    +
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, search_data)
    +]
    +
    +
    for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:5]["title"], "\n")
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    + 0           "Pimpernel" Smith
    +1               Black Hunters
    +29    Raiders of the Lost Ark
    +34             The Master Key
    +51            My Gun Is Quick
    +Name: title, dtype: object 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    + 21               How I Live Now
    +32     On the Edge of Innocence
    +77             Bratz: The Movie
    +4                    Unfriended
    +108                  Simon Says
    +Name: title, dtype: object 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    + 9         The Shining
    +0         Ghostkeeper
    +11     Fast and Loose
    +7      Killing Ground
    +12         Home Alone
    +Name: title, dtype: object 
    +
    +

    Kami telah mampu memulihkan daya ingat tanpa melakukan pencarian vektor tambahan! Secara kualitatif, hasil ini tampaknya memiliki daya ingat yang lebih tinggi untuk "Raiders of the Lost Ark" dan "The Shining" daripada pencarian vektor standar dalam tutorial, "Pencarian Film menggunakan Milvus dan Sentence Transformers", yang menggunakan model penyematan yang berbeda. Namun, tidak dapat menemukan "Ferris Bueller's Day Off", yang akan kita bahas nanti di buku catatan ini. (Lihat makalah Pembelajaran Representasi Matryoshka untuk eksperimen dan pembandingan yang lebih kuantitatif).

    +

    Mari kita bandingkan hasil pencarian corong kita dengan pencarian vektor standar pada dataset yang sama dengan model penyematan yang sama. Kami melakukan pencarian pada penyematan penuh.

    +
    # Search on entire embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=search_data,
    +    anns_field="embedding",
    +    limit=5,
    +    output_fields=["title", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +Raiders of the Lost Ark
    +The Master Key
    +My Gun Is Quick
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +A Walk to Remember
    +Ferris Bueller's Day Off
    +How I Live Now
    +On the Edge of Innocence
    +Bratz: The Movie
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining
    +Ghostkeeper
    +Fast and Loose
    +Killing Ground
    +Home Alone
    +
    +

    Dengan pengecualian hasil untuk "Seorang remaja berpura-pura sakit agar tidak masuk sekolah...", hasil di bawah pencarian corong hampir sama dengan pencarian lengkap, meskipun pencarian corong dilakukan pada ruang pencarian 128 dimensi vs 768 dimensi untuk pencarian biasa.

    +

    Menyelidiki Kegagalan Pemanggilan Kembali Pencarian Corong untuk Hari Libur Ferris Bueller

    Mengapa pencarian corong tidak berhasil mendapatkan Ferris Bueller's Day Off? Mari kita periksa apakah film tersebut ada dalam daftar kandidat asli atau salah disaring.

    +
    queries2 = [
    +    "A teenager fakes illness to get off school and have adventures with two friends."
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +instruct_queries = ["search_query: " + q.strip() for q in queries2]
    +search_data2 = embed_search(instruct_queries)
    +head_search2 = [x[:search_dim] for x in search_data2]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search2,
    +    anns_field="head_embedding",
    +    limit=256,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", queries2[0])
    +    for idx, row in enumerate(rows):
    +        if row["title"].strip() == "Ferris Bueller's Day Off":
    +            print(f"Row {idx}: Ferris Bueller's Day Off")
    +
    +
    Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Row 228: Ferris Bueller's Day Off
    +
    +

    Kami melihat bahwa masalahnya adalah daftar kandidat awal tidak cukup besar, atau lebih tepatnya, hasil yang diinginkan tidak cukup mirip dengan kueri pada tingkat perincian tertinggi. Mengubahnya dari 128 ke 256 menghasilkan pengambilan yang berhasil. Kita harus membuat sebuah aturan praktis untuk mengatur jumlah kandidat pada kumpulan yang ditahan untuk mengevaluasi secara empiris pertukaran antara recall dan latensi.

    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries2, dfs, search_data2)
    +]
    +
    +for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:7]["title"].to_string(index=False), "\n")
    +
    +
    A teenager fakes illness to get off school and have adventures with two friends. 
    +       A Walk to Remember
    +Ferris Bueller's Day Off
    +          How I Live Now
    +On the Edge of Innocence
    +        Bratz: The Movie
    +              Unfriended
    +              Simon Says 
    +
    +

    Apakah urutannya penting? Penyematan awalan vs akhiran.

    Model ini dilatih untuk melakukan pencocokan awalan yang lebih kecil secara rekursif dengan baik dari sematan. Apakah urutan dimensi yang kita gunakan penting? Sebagai contoh, bisakah kita juga mengambil himpunan bagian dari sematan yang merupakan sufiks? Dalam percobaan ini, kami membalik urutan dimensi dalam embedding Matryoshka dan melakukan pencarian corong.

    +
    client = MilvusClient(uri="./wikiplots-matryoshka-flipped.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +client.create_index(collection_name, index_params)
    +
    +
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +
    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Encode and flip embeddings
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    embeddings = torch.flip(embeddings, dims=[-1])
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:50<00:00,  5.08s/it]
    +
    +
    # Normalize head embeddings
    +
    +flip_search_data = [
    +    torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data
    +]
    +flip_head_search = [x[:search_dim] for x in flip_search_data]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=flip_head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, flip_search_data)
    +]
    +
    +for d in dfs_results:
    +    print(
    +        d["query"],
    +        "\n",
    +        d["results"][:7]["title"].to_string(index=False, header=False),
    +        "\n",
    +    )
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    +       "Pimpernel" Smith
    +          Black Hunters
    +Raiders of the Lost Ark
    +         The Master Key
    +        My Gun Is Quick
    +            The Passage
    +        The Mole People 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    +                       A Walk to Remember
    +                          How I Live Now
    +                              Unfriended
    +Cirque du Freak: The Vampire's Assistant
    +                             Last Summer
    +                                 Contest
    +                                 Day One 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    +         Ghostkeeper
    +     Killing Ground
    +Leopard in the Snow
    +              Stone
    +          Afterglow
    +         Unfaithful
    +     Always a Bride 
    +
    +

    Daya ingat jauh lebih buruk daripada pencarian corong atau pencarian biasa seperti yang diharapkan (model penyematan dilatih dengan pembelajaran kontras pada awalan dari dimensi penyematan, bukan akhiran).

    +

    Ringkasan

    Berikut ini adalah perbandingan hasil pencarian kami di seluruh metode:

    +
    +
    +
    +Kami telah menunjukkan cara menggunakan penyematan Matryoshka dengan Milvus untuk melakukan algoritme pencarian semantik yang lebih efisien yang disebut "pencarian corong." Kami juga mengeksplorasi pentingnya langkah pemeringkatan dan pemangkasan algoritma, serta mode kegagalan ketika daftar kandidat awal terlalu kecil. Terakhir, kami membahas bagaimana urutan dimensi itu penting ketika membentuk sub-embedding - harus dengan cara yang sama seperti ketika model dilatih. Atau lebih tepatnya, hanya karena model dilatih dengan cara tertentu, maka awalan embedding menjadi bermakna. Sekarang Anda tahu cara mengimplementasikan sematan Matryoshka dan pencarian corong untuk mengurangi biaya penyimpanan pencarian semantik tanpa mengorbankan terlalu banyak kinerja pencarian! diff --git a/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.json b/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.json new file mode 100644 index 000000000..fbff0a9bd --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import numpy as np\n\nfrom collections import defaultdict\nfrom scipy.sparse import csr_matrix\nfrom pymilvus import MilvusClient\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser, JsonOutputParser\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom tqdm import tqdm\n","milvus_client = MilvusClient(uri=\"./milvus.db\")\n\nllm = ChatOpenAI(\n model=\"gpt-4o\",\n temperature=0,\n)\nembedding_model = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n","nano_dataset = [\n {\n \"passage\": \"Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.\",\n \"triplets\": [\n [\"Jakob Bernoulli\", \"made significant contributions to\", \"calculus\"],\n [\n \"Jakob Bernoulli\",\n \"made significant contributions to\",\n \"the theory of probability\",\n ],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli numbers\"],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli theorem\"],\n [\"The Bernoulli theorem\", \"is a precursor to\", \"the law of large numbers\"],\n [\"Jakob Bernoulli\", \"was the older brother of\", \"Johann Bernoulli\"],\n ],\n },\n {\n \"passage\": \"Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.\",\n \"triplets\": [\n [\n \"Johann Bernoulli\",\n \"was a major figure of\",\n \"the development of calculus\",\n ],\n [\"Johann Bernoulli\", \"was\", \"Jakob's younger brother\"],\n [\"Johann Bernoulli\", \"worked on\", \"infinitesimal calculus\"],\n [\"Johann Bernoulli\", \"was instrumental in spreading\", \"Leibniz's ideas\"],\n [\"Johann Bernoulli\", \"contributed to\", \"the calculus of variations\"],\n [\"Johann Bernoulli\", \"was known for\", \"the brachistochrone problem\"],\n ],\n },\n {\n \"passage\": \"Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.\",\n \"triplets\": [\n [\"Daniel Bernoulli\", \"was the son of\", \"Johann Bernoulli\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"fluid dynamics\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"probability\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"statistics\"],\n [\"Daniel Bernoulli\", \"is most famous for\", \"Bernoulli’s principle\"],\n [\n \"Bernoulli’s principle\",\n \"is fundamental to\",\n \"the understanding of aerodynamics\",\n ],\n ],\n },\n {\n \"passage\": \"Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.\",\n \"triplets\": [\n [\n \"Leonhard Euler\",\n \"had a significant relationship with\",\n \"the Bernoulli family\",\n ],\n [\"leonhard Euler\", \"was born in\", \"Basel\"],\n [\"Leonhard Euler\", \"was a student of\", \"Johann Bernoulli\"],\n [\"Johann Bernoulli's influence\", \"was profound on\", \"Euler\"],\n ],\n },\n]\n","entityid_2_relationids = defaultdict(list)\nrelationid_2_passageids = defaultdict(list)\n\nentities = []\nrelations = []\npassages = []\nfor passage_id, dataset_info in enumerate(nano_dataset):\n passage, triplets = dataset_info[\"passage\"], dataset_info[\"triplets\"]\n passages.append(passage)\n for triplet in triplets:\n if triplet[0] not in entities:\n entities.append(triplet[0])\n if triplet[2] not in entities:\n entities.append(triplet[2])\n relation = \" \".join(triplet)\n if relation not in relations:\n relations.append(relation)\n entityid_2_relationids[entities.index(triplet[0])].append(\n len(relations) - 1\n )\n entityid_2_relationids[entities.index(triplet[2])].append(\n len(relations) - 1\n )\n relationid_2_passageids[relations.index(relation)].append(passage_id)\n","embedding_dim = len(embedding_model.embed_query(\"foo\"))\n\n\ndef create_milvus_collection(collection_name: str):\n if milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n consistency_level=\"Strong\",\n )\n\n\nentity_col_name = \"entity_collection\"\nrelation_col_name = \"relation_collection\"\npassage_col_name = \"passage_collection\"\ncreate_milvus_collection(entity_col_name)\ncreate_milvus_collection(relation_col_name)\ncreate_milvus_collection(passage_col_name)\n","def milvus_insert(\n collection_name: str,\n text_list: list[str],\n):\n batch_size = 512\n for row_id in tqdm(range(0, len(text_list), batch_size), desc=\"Inserting\"):\n batch_texts = text_list[row_id : row_id + batch_size]\n batch_embeddings = embedding_model.embed_documents(batch_texts)\n\n batch_ids = [row_id + j for j in range(len(batch_texts))]\n batch_data = [\n {\n \"id\": id_,\n \"text\": text,\n \"vector\": vector,\n }\n for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)\n ]\n milvus_client.insert(\n collection_name=collection_name,\n data=batch_data,\n )\n\n\nmilvus_insert(\n collection_name=relation_col_name,\n text_list=relations,\n)\n\nmilvus_insert(\n collection_name=entity_col_name,\n text_list=entities,\n)\n\nmilvus_insert(\n collection_name=passage_col_name,\n text_list=passages,\n)\n","query = \"What contribution did the son of Euler's teacher make?\"\n\nquery_ner_list = [\"Euler\"]\n# query_ner_list = ner(query) # In practice, replace it with your custom NER approach\n\nquery_ner_embeddings = [\n embedding_model.embed_query(query_ner) for query_ner in query_ner_list\n]\n\ntop_k = 3\n\nentity_search_res = milvus_client.search(\n collection_name=entity_col_name,\n data=query_ner_embeddings,\n limit=top_k,\n output_fields=[\"id\"],\n)\n\nquery_embedding = embedding_model.embed_query(query)\n\nrelation_search_res = milvus_client.search(\n collection_name=relation_col_name,\n data=[query_embedding],\n limit=top_k,\n output_fields=[\"id\"],\n)[0]\n","# Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.\nentity_relation_adj = np.zeros((len(entities), len(relations)))\nfor entity_id, entity in enumerate(entities):\n entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1\n\n# Convert the adjacency matrix to a sparse matrix for efficient computation.\nentity_relation_adj = csr_matrix(entity_relation_adj)\n\n# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.\nentity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T\nrelation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj\n\n# Specify the target degree of the subgraph to be expanded.\n# 1 or 2 is enough for most cases.\ntarget_degree = 1\n\n# Compute the target degree adjacency matrices using matrix multiplication.\nentity_adj_target_degree = entity_adj_1_degree\nfor _ in range(target_degree - 1):\n entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree\nrelation_adj_target_degree = relation_adj_1_degree\nfor _ in range(target_degree - 1):\n relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree\n\nentity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj\n","expanded_relations_from_relation = set()\nexpanded_relations_from_entity = set()\n# You can set the similarity threshold here to guarantee the quality of the retrieved ones.\n# entity_sim_filter_thresh = ...\n# relation_sim_filter_thresh = ...\n\nfiltered_hit_relation_ids = [\n relation_res[\"entity\"][\"id\"]\n for relation_res in relation_search_res\n # if relation_res['distance'] > relation_sim_filter_thresh\n]\nfor hit_relation_id in filtered_hit_relation_ids:\n expanded_relations_from_relation.update(\n relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()\n )\n\nfiltered_hit_entity_ids = [\n one_entity_res[\"entity\"][\"id\"]\n for one_entity_search_res in entity_search_res\n for one_entity_res in one_entity_search_res\n # if one_entity_res['distance'] > entity_sim_filter_thresh\n]\n\nfor filtered_hit_entity_id in filtered_hit_entity_ids:\n expanded_relations_from_entity.update(\n entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()\n )\n\n# Merge the expanded relations from the relation and entity retrieval ways.\nrelation_candidate_ids = list(\n expanded_relations_from_relation | expanded_relations_from_entity\n)\n\nrelation_candidate_texts = [\n relations[relation_id] for relation_id in relation_candidate_ids\n]\n","query_prompt_one_shot_input = \"\"\"I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.\n\nQuestion:\nWhen was the mother of the leader of the Third Crusade born?\n\nRelationship descriptions:\n[1] Eleanor was born in 1122.\n[2] Eleanor married King Louis VII of France.\n[3] Eleanor was the Duchess of Aquitaine.\n[4] Eleanor participated in the Second Crusade.\n[5] Eleanor had eight children.\n[6] Eleanor was married to Henry II of England.\n[7] Eleanor was the mother of Richard the Lionheart.\n[8] Richard the Lionheart was the King of England.\n[9] Henry II was the father of Richard the Lionheart.\n[10] Henry II was the King of England.\n[11] Richard the Lionheart led the Third Crusade.\n\n\"\"\"\nquery_prompt_one_shot_output = \"\"\"{\"thought_process\": \"To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.\", \"useful_relationships\": [\"[11] Richard the Lionheart led the Third Crusade\", \"[7] Eleanor was the mother of Richard the Lionheart\", \"[1] Eleanor was born in 1122\"]}\"\"\"\n\nquery_prompt_template = \"\"\"Question:\n{question}\n\nRelationship descriptions:\n{relation_des_str}\n\n\"\"\"\n\n\ndef rerank_relations(\n query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]\n) -> list[int]:\n relation_des_str = \"\\n\".join(\n map(\n lambda item: f\"[{item[0]}] {item[1]}\",\n zip(relation_candidate_ids, relation_candidate_texts),\n )\n ).strip()\n rerank_prompts = ChatPromptTemplate.from_messages(\n [\n HumanMessage(query_prompt_one_shot_input),\n AIMessage(query_prompt_one_shot_output),\n HumanMessagePromptTemplate.from_template(query_prompt_template),\n ]\n )\n rerank_chain = (\n rerank_prompts\n | llm.bind(response_format={\"type\": \"json_object\"})\n | JsonOutputParser()\n )\n rerank_res = rerank_chain.invoke(\n {\"question\": query, \"relation_des_str\": relation_des_str}\n )\n rerank_relation_ids = []\n rerank_relation_lines = rerank_res[\"useful_relationships\"]\n id_2_lines = {}\n for line in rerank_relation_lines:\n id_ = int(line[line.find(\"[\") + 1 : line.find(\"]\")])\n id_2_lines[id_] = line.strip()\n rerank_relation_ids.append(id_)\n return rerank_relation_ids\n\n\nrerank_relation_ids = rerank_relations(\n query,\n relation_candidate_texts=relation_candidate_texts,\n relation_candidate_ids=relation_candidate_ids,\n)\n","final_top_k = 2\n\nfinal_passages = []\nfinal_passage_ids = []\nfor relation_id in rerank_relation_ids:\n for passage_id in relationid_2_passageids[relation_id]:\n if passage_id not in final_passage_ids:\n final_passage_ids.append(passage_id)\n final_passages.append(passages[passage_id])\npassages_from_our_method = final_passages[:final_top_k]\n","naive_passage_res = milvus_client.search(\n collection_name=passage_col_name,\n data=[query_embedding],\n limit=final_top_k,\n output_fields=[\"text\"],\n)[0]\npassages_from_naive_rag = [res[\"entity\"][\"text\"] for res in naive_passage_res]\n\nprint(\n f\"Passages retrieved from naive RAG: \\n{passages_from_naive_rag}\\n\\n\"\n f\"Passages retrieved from our method: \\n{passages_from_our_method}\\n\\n\"\n)\n\n\nprompt = ChatPromptTemplate.from_messages(\n [\n (\n \"human\",\n \"\"\"Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.\nQuestion: {question}\nContext: {context}\nAnswer:\"\"\",\n )\n ]\n)\n\nrag_chain = prompt | llm | StrOutputParser()\n\nanswer_from_naive_rag = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_naive_rag)}\n)\nanswer_from_our_method = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_our_method)}\n)\n\nprint(\n f\"Answer from naive RAG: {answer_from_naive_rag}\\n\\nAnswer from our method: {answer_from_our_method}\"\n)\n"],"headingContent":"Graph RAG with Milvus","anchorList":[{"label":"Grafik RAG dengan Milvus","href":"Graph-RAG-with-Milvus","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Pemuatan Data Offline","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"Kueri Online","href":"Online-Querying","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.md b/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.md new file mode 100644 index 000000000..5261b33ab --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/graph_rag_with_milvus.md @@ -0,0 +1,509 @@ +--- +id: graph_rag_with_milvus.md +summary: Grafik RAG dengan Milvus +title: Grafik RAG dengan Milvus +--- +

    Grafik RAG dengan Milvus

    Open In Colab +GitHub Repository

    +

    Penerapan model bahasa besar yang meluas menyoroti pentingnya meningkatkan akurasi dan relevansi respons mereka. Retrieval-Augmented Generation (RAG) meningkatkan model dengan basis pengetahuan eksternal, memberikan informasi yang lebih kontekstual dan mengurangi masalah seperti halusinasi dan pengetahuan yang tidak memadai. Namun, hanya mengandalkan paradigma RAG yang sederhana memiliki keterbatasan, terutama ketika berhadapan dengan hubungan entitas yang kompleks dan pertanyaan multi-hop, di mana model sering kali kesulitan untuk memberikan jawaban yang akurat.

    +

    Memperkenalkan grafik pengetahuan (KG) ke dalam sistem RAG menawarkan solusi baru. KG menyajikan entitas dan hubungannya secara terstruktur, memberikan informasi pengambilan yang lebih tepat dan membantu RAG untuk menangani tugas-tugas menjawab pertanyaan yang kompleks dengan lebih baik. KG-RAG masih dalam tahap awal, dan belum ada konsensus mengenai cara mengambil entitas dan hubungan secara efektif dari KG atau cara mengintegrasikan pencarian kemiripan vektor dengan struktur graf.

    +

    Dalam buku catatan ini, kami memperkenalkan sebuah pendekatan yang sederhana namun kuat untuk meningkatkan performa dari skenario ini. Ini adalah paradigma RAG sederhana dengan pengambilan multi-arah dan kemudian melakukan pemeringkatan ulang, tetapi mengimplementasikan Graph RAG secara logis, dan mencapai kinerja yang canggih dalam menangani pertanyaan-pertanyaan multi-hop. Mari kita lihat bagaimana implementasinya.

    +

    + + + + +

    +

    Prasyarat

    Sebelum menjalankan notebook ini, pastikan Anda telah menginstal ketergantungan berikut ini:

    +
    $ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Kita akan menggunakan model dari OpenAI. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Impor library dan dependensi yang diperlukan.

    +
    import numpy as np
    +
    +from collections import defaultdict
    +from scipy.sparse import csr_matrix
    +from pymilvus import MilvusClient
    +from langchain_core.messages import AIMessage, HumanMessage
    +from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
    +from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from tqdm import tqdm
    +
    +

    Inisialisasi instance klien Milvus, LLM, dan model penyematan.

    +
    milvus_client = MilvusClient(uri="./milvus.db")
    +
    +llm = ChatOpenAI(
    +    model="gpt-4o",
    +    temperature=0,
    +)
    +embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +
    +

    Untuk argumen-argumen di MilvusClient:

    +
      +
    • Menetapkan uri sebagai berkas lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam berkas ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Pemuatan Data Offline

    Persiapan Data

    Kami akan menggunakan dataset nano yang memperkenalkan hubungan antara keluarga Bernoulli dan Euler untuk mendemonstrasikan sebagai contoh. Dataset nano berisi 4 bagian dan satu set triplet yang sesuai, di mana setiap triplet berisi subjek, predikat, dan objek. Dalam praktiknya, Anda dapat menggunakan pendekatan apa pun untuk mengekstrak triplet dari korpus kustom Anda sendiri.

    +
    nano_dataset = [
    +    {
    +        "passage": "Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.",
    +        "triplets": [
    +            ["Jakob Bernoulli", "made significant contributions to", "calculus"],
    +            [
    +                "Jakob Bernoulli",
    +                "made significant contributions to",
    +                "the theory of probability",
    +            ],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli numbers"],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli theorem"],
    +            ["The Bernoulli theorem", "is a precursor to", "the law of large numbers"],
    +            ["Jakob Bernoulli", "was the older brother of", "Johann Bernoulli"],
    +        ],
    +    },
    +    {
    +        "passage": "Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.",
    +        "triplets": [
    +            [
    +                "Johann Bernoulli",
    +                "was a major figure of",
    +                "the development of calculus",
    +            ],
    +            ["Johann Bernoulli", "was", "Jakob's younger brother"],
    +            ["Johann Bernoulli", "worked on", "infinitesimal calculus"],
    +            ["Johann Bernoulli", "was instrumental in spreading", "Leibniz's ideas"],
    +            ["Johann Bernoulli", "contributed to", "the calculus of variations"],
    +            ["Johann Bernoulli", "was known for", "the brachistochrone problem"],
    +        ],
    +    },
    +    {
    +        "passage": "Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.",
    +        "triplets": [
    +            ["Daniel Bernoulli", "was the son of", "Johann Bernoulli"],
    +            ["Daniel Bernoulli", "made major contributions to", "fluid dynamics"],
    +            ["Daniel Bernoulli", "made major contributions to", "probability"],
    +            ["Daniel Bernoulli", "made major contributions to", "statistics"],
    +            ["Daniel Bernoulli", "is most famous for", "Bernoulli’s principle"],
    +            [
    +                "Bernoulli’s principle",
    +                "is fundamental to",
    +                "the understanding of aerodynamics",
    +            ],
    +        ],
    +    },
    +    {
    +        "passage": "Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.",
    +        "triplets": [
    +            [
    +                "Leonhard Euler",
    +                "had a significant relationship with",
    +                "the Bernoulli family",
    +            ],
    +            ["leonhard Euler", "was born in", "Basel"],
    +            ["Leonhard Euler", "was a student of", "Johann Bernoulli"],
    +            ["Johann Bernoulli's influence", "was profound on", "Euler"],
    +        ],
    +    },
    +]
    +
    +

    Kami membangun entitas dan relasi sebagai berikut:

    +
      +
    • Entitas adalah subjek atau objek dalam kembar tiga, jadi kita langsung mengekstraknya dari kembar tiga.
    • +
    • Di sini kita membangun konsep relasi dengan menggabungkan subjek, predikat, dan objek secara langsung dengan spasi di antaranya.
    • +
    +

    Kita juga menyiapkan sebuah dict untuk memetakan id entitas ke id relasi, dan sebuah dict lain untuk memetakan id relasi ke id bagian untuk digunakan di kemudian hari.

    +
    entityid_2_relationids = defaultdict(list)
    +relationid_2_passageids = defaultdict(list)
    +
    +entities = []
    +relations = []
    +passages = []
    +for passage_id, dataset_info in enumerate(nano_dataset):
    +    passage, triplets = dataset_info["passage"], dataset_info["triplets"]
    +    passages.append(passage)
    +    for triplet in triplets:
    +        if triplet[0] not in entities:
    +            entities.append(triplet[0])
    +        if triplet[2] not in entities:
    +            entities.append(triplet[2])
    +        relation = " ".join(triplet)
    +        if relation not in relations:
    +            relations.append(relation)
    +            entityid_2_relationids[entities.index(triplet[0])].append(
    +                len(relations) - 1
    +            )
    +            entityid_2_relationids[entities.index(triplet[2])].append(
    +                len(relations) - 1
    +            )
    +        relationid_2_passageids[relations.index(relation)].append(passage_id)
    +
    +

    Penyisipan Data

    Buatlah koleksi Milvus untuk entitas, relasi, dan bagian. Koleksi entitas dan koleksi relasi digunakan sebagai koleksi utama untuk konstruksi graf dalam metode kami, sedangkan koleksi bagian digunakan sebagai perbandingan pengambilan RAG naif atau tujuan tambahan.

    +
    embedding_dim = len(embedding_model.embed_query("foo"))
    +
    +
    +def create_milvus_collection(collection_name: str):
    +    if milvus_client.has_collection(collection_name=collection_name):
    +        milvus_client.drop_collection(collection_name=collection_name)
    +    milvus_client.create_collection(
    +        collection_name=collection_name,
    +        dimension=embedding_dim,
    +        consistency_level="Strong",
    +    )
    +
    +
    +entity_col_name = "entity_collection"
    +relation_col_name = "relation_collection"
    +passage_col_name = "passage_collection"
    +create_milvus_collection(entity_col_name)
    +create_milvus_collection(relation_col_name)
    +create_milvus_collection(passage_col_name)
    +
    +

    Masukkan data dengan informasi metadatanya ke dalam koleksi Milvus, termasuk koleksi entitas, relasi, dan bagian. Informasi metadata termasuk id bagian dan entitas kedekatan atau id relasi.

    +
    def milvus_insert(
    +    collection_name: str,
    +    text_list: list[str],
    +):
    +    batch_size = 512
    +    for row_id in tqdm(range(0, len(text_list), batch_size), desc="Inserting"):
    +        batch_texts = text_list[row_id : row_id + batch_size]
    +        batch_embeddings = embedding_model.embed_documents(batch_texts)
    +
    +        batch_ids = [row_id + j for j in range(len(batch_texts))]
    +        batch_data = [
    +            {
    +                "id": id_,
    +                "text": text,
    +                "vector": vector,
    +            }
    +            for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)
    +        ]
    +        milvus_client.insert(
    +            collection_name=collection_name,
    +            data=batch_data,
    +        )
    +
    +
    +milvus_insert(
    +    collection_name=relation_col_name,
    +    text_list=relations,
    +)
    +
    +milvus_insert(
    +    collection_name=entity_col_name,
    +    text_list=entities,
    +)
    +
    +milvus_insert(
    +    collection_name=passage_col_name,
    +    text_list=passages,
    +)
    +
    +
    Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.02it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.39it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  2.28it/s]
    +
    +

    Kueri Online

    Pengambilan Kemiripan

    Kami mengambil entitas dan relasi yang paling mirip berdasarkan kueri masukan dari Milvus.

    +

    Ketika melakukan pengambilan entitas, pertama-tama kita harus mengekstrak entitas kueri dari teks kueri menggunakan beberapa metode tertentu seperti NER (Named-entity recognition). Untuk mempermudah, kami menyiapkan hasil NER di sini. Jika Anda ingin mengubah kueri sebagai pertanyaan khusus Anda, Anda harus mengubah daftar NER kueri yang sesuai. Dalam praktiknya, Anda dapat menggunakan model atau pendekatan lain untuk mengekstrak entitas dari kueri.

    +
    query = "What contribution did the son of Euler's teacher make?"
    +
    +query_ner_list = ["Euler"]
    +# query_ner_list = ner(query) # In practice, replace it with your custom NER approach
    +
    +query_ner_embeddings = [
    +    embedding_model.embed_query(query_ner) for query_ner in query_ner_list
    +]
    +
    +top_k = 3
    +
    +entity_search_res = milvus_client.search(
    +    collection_name=entity_col_name,
    +    data=query_ner_embeddings,
    +    limit=top_k,
    +    output_fields=["id"],
    +)
    +
    +query_embedding = embedding_model.embed_query(query)
    +
    +relation_search_res = milvus_client.search(
    +    collection_name=relation_col_name,
    +    data=[query_embedding],
    +    limit=top_k,
    +    output_fields=["id"],
    +)[0]
    +
    +

    Memperluas Subgraf

    Kita menggunakan entitas dan relasi yang diambil untuk memperluas subgraf dan mendapatkan relasi kandidat, lalu menggabungkannya dari dua cara. Berikut adalah diagram alir dari proses perluasan subgraf: + + + +

    +

    Di sini kita membuat sebuah matriks kedekatan dan menggunakan perkalian matriks untuk menghitung informasi pemetaan kedekatan dalam beberapa derajat. Dengan cara ini, kita dapat dengan cepat mendapatkan informasi dari setiap derajat perluasan.

    +
    # Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.
    +entity_relation_adj = np.zeros((len(entities), len(relations)))
    +for entity_id, entity in enumerate(entities):
    +    entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1
    +
    +# Convert the adjacency matrix to a sparse matrix for efficient computation.
    +entity_relation_adj = csr_matrix(entity_relation_adj)
    +
    +# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.
    +entity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T
    +relation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj
    +
    +# Specify the target degree of the subgraph to be expanded.
    +# 1 or 2 is enough for most cases.
    +target_degree = 1
    +
    +# Compute the target degree adjacency matrices using matrix multiplication.
    +entity_adj_target_degree = entity_adj_1_degree
    +for _ in range(target_degree - 1):
    +    entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree
    +relation_adj_target_degree = relation_adj_1_degree
    +for _ in range(target_degree - 1):
    +    relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree
    +
    +entity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj
    +
    +

    Dengan mengambil nilai dari matriks perluasan derajat target, kita dapat dengan mudah memperluas derajat yang sesuai dari entitas dan relasi yang diambil untuk mendapatkan semua relasi dari subgraf.

    +
    expanded_relations_from_relation = set()
    +expanded_relations_from_entity = set()
    +# You can set the similarity threshold here to guarantee the quality of the retrieved ones.
    +# entity_sim_filter_thresh = ...
    +# relation_sim_filter_thresh = ...
    +
    +filtered_hit_relation_ids = [
    +    relation_res["entity"]["id"]
    +    for relation_res in relation_search_res
    +    # if relation_res['distance'] > relation_sim_filter_thresh
    +]
    +for hit_relation_id in filtered_hit_relation_ids:
    +    expanded_relations_from_relation.update(
    +        relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()
    +    )
    +
    +filtered_hit_entity_ids = [
    +    one_entity_res["entity"]["id"]
    +    for one_entity_search_res in entity_search_res
    +    for one_entity_res in one_entity_search_res
    +    # if one_entity_res['distance'] > entity_sim_filter_thresh
    +]
    +
    +for filtered_hit_entity_id in filtered_hit_entity_ids:
    +    expanded_relations_from_entity.update(
    +        entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()
    +    )
    +
    +# Merge the expanded relations from the relation and entity retrieval ways.
    +relation_candidate_ids = list(
    +    expanded_relations_from_relation | expanded_relations_from_entity
    +)
    +
    +relation_candidate_texts = [
    +    relations[relation_id] for relation_id in relation_candidate_ids
    +]
    +
    +

    Kita telah mendapatkan relasi-relasi kandidat dengan memperluas subgraf, yang akan diperingkat ulang oleh LLM pada langkah berikutnya.

    +

    Pemeringkatan ulang LLM

    Pada tahap ini, kami menggunakan mekanisme self-attention yang kuat dari LLM untuk menyaring dan menyempurnakan lebih lanjut himpunan kandidat relasi. Kami menggunakan perintah sekali tembak, memasukkan kueri dan kumpulan kandidat hubungan ke dalam perintah, dan menginstruksikan LLM untuk memilih hubungan potensial yang dapat membantu menjawab kueri. Mengingat bahwa beberapa pertanyaan mungkin rumit, kami mengadopsi pendekatan Chain-of-Thought, yang memungkinkan LLM untuk mengartikulasikan proses berpikirnya dalam menjawab pertanyaan tersebut. Kami menetapkan bahwa respons LLM dalam format json untuk memudahkan penguraian.

    +
    query_prompt_one_shot_input = """I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.
    +
    +Question:
    +When was the mother of the leader of the Third Crusade born?
    +
    +Relationship descriptions:
    +[1] Eleanor was born in 1122.
    +[2] Eleanor married King Louis VII of France.
    +[3] Eleanor was the Duchess of Aquitaine.
    +[4] Eleanor participated in the Second Crusade.
    +[5] Eleanor had eight children.
    +[6] Eleanor was married to Henry II of England.
    +[7] Eleanor was the mother of Richard the Lionheart.
    +[8] Richard the Lionheart was the King of England.
    +[9] Henry II was the father of Richard the Lionheart.
    +[10] Henry II was the King of England.
    +[11] Richard the Lionheart led the Third Crusade.
    +
    +"""
    +query_prompt_one_shot_output = """{"thought_process": "To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.", "useful_relationships": ["[11] Richard the Lionheart led the Third Crusade", "[7] Eleanor was the mother of Richard the Lionheart", "[1] Eleanor was born in 1122"]}"""
    +
    +query_prompt_template = """Question:
    +{question}
    +
    +Relationship descriptions:
    +{relation_des_str}
    +
    +"""
    +
    +
    +def rerank_relations(
    +    query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]
    +) -> list[int]:
    +    relation_des_str = "\n".join(
    +        map(
    +            lambda item: f"[{item[0]}] {item[1]}",
    +            zip(relation_candidate_ids, relation_candidate_texts),
    +        )
    +    ).strip()
    +    rerank_prompts = ChatPromptTemplate.from_messages(
    +        [
    +            HumanMessage(query_prompt_one_shot_input),
    +            AIMessage(query_prompt_one_shot_output),
    +            HumanMessagePromptTemplate.from_template(query_prompt_template),
    +        ]
    +    )
    +    rerank_chain = (
    +        rerank_prompts
    +        | llm.bind(response_format={"type": "json_object"})
    +        | JsonOutputParser()
    +    )
    +    rerank_res = rerank_chain.invoke(
    +        {"question": query, "relation_des_str": relation_des_str}
    +    )
    +    rerank_relation_ids = []
    +    rerank_relation_lines = rerank_res["useful_relationships"]
    +    id_2_lines = {}
    +    for line in rerank_relation_lines:
    +        id_ = int(line[line.find("[") + 1 : line.find("]")])
    +        id_2_lines[id_] = line.strip()
    +        rerank_relation_ids.append(id_)
    +    return rerank_relation_ids
    +
    +
    +rerank_relation_ids = rerank_relations(
    +    query,
    +    relation_candidate_texts=relation_candidate_texts,
    +    relation_candidate_ids=relation_candidate_ids,
    +)
    +
    +

    Dapatkan Hasil Akhir

    Kita bisa mendapatkan hasil akhir yang diambil dari relasi yang diurutkan ulang.

    +
    final_top_k = 2
    +
    +final_passages = []
    +final_passage_ids = []
    +for relation_id in rerank_relation_ids:
    +    for passage_id in relationid_2_passageids[relation_id]:
    +        if passage_id not in final_passage_ids:
    +            final_passage_ids.append(passage_id)
    +            final_passages.append(passages[passage_id])
    +passages_from_our_method = final_passages[:final_top_k]
    +
    +

    Kita dapat membandingkan hasilnya dengan metode RAG naif, yang mengambil bagian topK berdasarkan penyematan kueri secara langsung dari koleksi bagian.

    +
    naive_passage_res = milvus_client.search(
    +    collection_name=passage_col_name,
    +    data=[query_embedding],
    +    limit=final_top_k,
    +    output_fields=["text"],
    +)[0]
    +passages_from_naive_rag = [res["entity"]["text"] for res in naive_passage_res]
    +
    +print(
    +    f"Passages retrieved from naive RAG: \n{passages_from_naive_rag}\n\n"
    +    f"Passages retrieved from our method: \n{passages_from_our_method}\n\n"
    +)
    +
    +
    +prompt = ChatPromptTemplate.from_messages(
    +    [
    +        (
    +            "human",
    +            """Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.
    +Question: {question}
    +Context: {context}
    +Answer:""",
    +        )
    +    ]
    +)
    +
    +rag_chain = prompt | llm | StrOutputParser()
    +
    +answer_from_naive_rag = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_naive_rag)}
    +)
    +answer_from_our_method = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_our_method)}
    +)
    +
    +print(
    +    f"Answer from naive RAG: {answer_from_naive_rag}\n\nAnswer from our method: {answer_from_our_method}"
    +)
    +
    +
    Passages retrieved from naive RAG: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.']
    +
    +Passages retrieved from our method: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.']
    +
    +
    +Answer from naive RAG: I don't know. The retrieved context does not provide information about the contributions made by the son of Euler's teacher.
    +
    +Answer from our method: The son of Euler's teacher, Daniel Bernoulli, made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.
    +
    +

    Seperti yang dapat kita lihat, bagian yang diambil dari RAG naif melewatkan bagian yang benar, yang menyebabkan jawaban yang salah. Bagian yang diambil dari metode kami adalah benar, dan ini membantu untuk mendapatkan jawaban yang akurat untuk pertanyaan tersebut.

    diff --git a/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.json b/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.json new file mode 100644 index 000000000..97b82acf0 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install hdbscan\n$ pip install plotly\n$ pip install umap-learn\n","import pandas as pd\nfrom dotenv import load_dotenv\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType\n\nload_dotenv()\n\ndf = pd.read_csv(\"news_data_dedup.csv\")\n\n\ndocs = [\n f\"{title}\\n{description}\" for title, description in zip(df.title, df.description)\n]\nef = BGEM3EmbeddingFunction()\n\nembeddings = ef(docs)[\"dense\"]\n\nconnections.connect(uri=\"milvus.db\")\n","fields = [\n FieldSchema(\n name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True\n ), # Primary ID field\n FieldSchema(\n name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=1024\n ), # Float vector field (embedding)\n FieldSchema(\n name=\"text\", dtype=DataType.VARCHAR, max_length=65535\n ), # Float vector field (embedding)\n]\n\nschema = CollectionSchema(fields=fields, description=\"Embedding collection\")\n\ncollection = Collection(name=\"news_data\", schema=schema)\n\nfor doc, embedding in zip(docs, embeddings):\n collection.insert({\"text\": doc, \"embedding\": embedding})\n print(doc)\n\nindex_params = {\"index_type\": \"FLAT\", \"metric_type\": \"L2\", \"params\": {}}\n\ncollection.create_index(field_name=\"embedding\", index_params=index_params)\n\ncollection.flush()\n","import hdbscan\nimport numpy as np\nimport pandas as pd\nimport plotly.express as px\nfrom umap import UMAP\nfrom pymilvus import Collection\n\ncollection = Collection(name=\"news_data\")\ncollection.load()\n\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"embedding\"]\n)\n\nsearch_params = {\n \"metric_type\": \"L2\",\n \"params\": {\"nprobe\": 10},\n} # L2 is Euclidean distance\n\nids = []\ndist = {}\n\nembeddings = []\n","while True:\n batch = iterator.next()\n batch_ids = [data[\"id\"] for data in batch]\n ids.extend(batch_ids)\n\n query_vectors = [data[\"embedding\"] for data in batch]\n embeddings.extend(query_vectors)\n\n results = collection.search(\n data=query_vectors,\n limit=50,\n anns_field=\"embedding\",\n param=search_params,\n output_fields=[\"id\"],\n )\n for i, batch_id in enumerate(batch_ids):\n dist[batch_id] = []\n for result in results[i]:\n dist[batch_id].append((result.id, result.distance))\n\n if len(batch) == 0:\n break\n\nids2index = {}\n\nfor id in dist:\n ids2index[id] = len(ids2index)\n\ndist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)\n\nfor id in dist:\n for result in dist[id]:\n dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]\n\nh = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric=\"precomputed\")\nhdb = h.fit(dist_metric)\n","import plotly.io as pio\n\npio.renderers.default = \"notebook\"\n\numap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)\n\ndf_umap = (\n pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=[\"x\", \"y\"])\n .assign(cluster=lambda df: hdb.labels_.astype(str))\n .query('cluster != \"-1\"')\n .sort_values(by=\"cluster\")\n)\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"text\"]\n)\n\nids = []\ntexts = []\n\nwhile True:\n batch = iterator.next()\n if len(batch) == 0:\n break\n batch_ids = [data[\"id\"] for data in batch]\n batch_texts = [data[\"text\"] for data in batch]\n ids.extend(batch_ids)\n texts.extend(batch_texts)\n\nshow_texts = [texts[i] for i in df_umap.index]\n\ndf_umap[\"hover_text\"] = show_texts\nfig = px.scatter(\n df_umap, x=\"x\", y=\"y\", color=\"cluster\", hover_data={\"hover_text\": True}\n)\nfig.show()\n"],"headingContent":"HDBSCAN Clustering with Milvus","anchorList":[{"label":"Pengelompokan HDBSCAN dengan Milvus","href":"HDBSCAN-Clustering-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Unduh Data","href":"Download-Data","type":2,"isActive":false},{"label":"Mengekstrak sematan ke Milvus","href":"Extract-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"Membangun Matriks Jarak untuk HDBSCAN","href":"Construct-the-Distance-Matrix-for-HDBSCAN","type":2,"isActive":false},{"label":"Visualisasi Cluster menggunakan UMAP","href":"Clusters-Visualization-using-UMAP","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.md b/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.md new file mode 100644 index 000000000..010587f6d --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/hdbscan_clustering_with_milvus.md @@ -0,0 +1,277 @@ +--- +id: hdbscan_clustering_with_milvus.md +summary: >- + Dalam buku catatan ini, kita akan menggunakan model penyematan BGE-M3 untuk + mengekstrak penyematan dari dataset judul berita, memanfaatkan Milvus untuk + menghitung jarak antar penyematan secara efisien untuk membantu HDBSCAN dalam + pengelompokan, dan kemudian memvisualisasikan hasilnya untuk analisis + menggunakan metode UMAP. Buku catatan ini merupakan adaptasi Milvus dari + artikel Dylan Castillo. +title: Pengelompokan HDBSCAN dengan Milvus +--- +

    Pengelompokan HDBSCAN dengan Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Data dapat diubah menjadi embeddings menggunakan model pembelajaran mendalam, yang menangkap representasi yang bermakna dari data asli. Dengan menerapkan algoritme pengelompokan tanpa pengawasan, kita dapat mengelompokkan titik-titik data yang serupa berdasarkan pola yang melekat. HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) adalah algoritme pengelompokan yang banyak digunakan untuk mengelompokkan titik-titik data secara efisien dengan menganalisis kepadatan dan jaraknya. Algoritma ini sangat berguna untuk menemukan cluster dengan berbagai bentuk dan ukuran. Dalam buku catatan ini, kita akan menggunakan HDBSCAN dengan Milvus, database vektor berkinerja tinggi, untuk mengelompokkan titik data ke dalam kelompok-kelompok yang berbeda berdasarkan penyematannya.

    +

    HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) adalah algoritme pengelompokan yang mengandalkan penghitungan jarak antara titik data dalam ruang embedding. Ruang embedding ini, yang dibuat oleh model pembelajaran mendalam, merepresentasikan data dalam bentuk dimensi tinggi. Untuk mengelompokkan titik data yang serupa, HDBSCAN menentukan kedekatan dan kepadatannya, tetapi menghitung jarak ini secara efisien, terutama untuk kumpulan data yang besar, dapat menjadi tantangan.

    +

    Milvus, basis data vektor berkinerja tinggi, mengoptimalkan proses ini dengan menyimpan dan mengindeks penyematan, sehingga memungkinkan pengambilan vektor yang serupa dengan cepat. Ketika digunakan bersama-sama, HDBSCAN dan Milvus memungkinkan pengelompokan yang efisien untuk set data berskala besar dalam ruang embedding.

    +

    Dalam buku catatan ini, kami akan menggunakan model embedding BGE-M3 untuk mengekstrak embedding dari dataset berita utama, memanfaatkan Milvus untuk menghitung jarak antar embedding secara efisien untuk membantu HDBSCAN dalam pengelompokan, dan kemudian memvisualisasikan hasilnya untuk analisis menggunakan metode UMAP. Buku catatan ini merupakan adaptasi Milvus dari artikel Dylan Castillo.

    +

    Persiapan

    unduh dataset berita dari https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/

    +
    $ pip install "pymilvus[model]"
    +$ pip install hdbscan
    +$ pip install plotly
    +$ pip install umap-learn
    +
    +

    Unduh Data

    Unduh dataset berita dari https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/, ekstrak news_data_dedup.csv dan letakkan di direktori saat ini.

    +

    Mengekstrak sematan ke Milvus

    Kita akan membuat koleksi menggunakan Milvus, dan mengekstrak embedding padat menggunakan model BGE-M3.

    +
    import pandas as pd
    +from dotenv import load_dotenv
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType
    +
    +load_dotenv()
    +
    +df = pd.read_csv("news_data_dedup.csv")
    +
    +
    +docs = [
    +    f"{title}\n{description}" for title, description in zip(df.title, df.description)
    +]
    +ef = BGEM3EmbeddingFunction()
    +
    +embeddings = ef(docs)["dense"]
    +
    +connections.connect(uri="milvus.db")
    +
    +
    +
      +
    • Jika Anda hanya membutuhkan basis data vektor lokal untuk data skala kecil atau pembuatan prototipe, mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi di Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
    • +
    +
    +
    fields = [
    +    FieldSchema(
    +        name="id", dtype=DataType.INT64, is_primary=True, auto_id=True
    +    ),  # Primary ID field
    +    FieldSchema(
    +        name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024
    +    ),  # Float vector field (embedding)
    +    FieldSchema(
    +        name="text", dtype=DataType.VARCHAR, max_length=65535
    +    ),  # Float vector field (embedding)
    +]
    +
    +schema = CollectionSchema(fields=fields, description="Embedding collection")
    +
    +collection = Collection(name="news_data", schema=schema)
    +
    +for doc, embedding in zip(docs, embeddings):
    +    collection.insert({"text": doc, "embedding": embedding})
    +    print(doc)
    +
    +index_params = {"index_type": "FLAT", "metric_type": "L2", "params": {}}
    +
    +collection.create_index(field_name="embedding", index_params=index_params)
    +
    +collection.flush()
    +
    +

    Membangun Matriks Jarak untuk HDBSCAN

    HDBSCAN memerlukan penghitungan jarak antar titik untuk pengelompokan, yang bisa jadi sangat intensif secara komputasi. Karena titik-titik yang jauh memiliki pengaruh yang lebih kecil pada penugasan pengelompokan, kita dapat meningkatkan efisiensi dengan menghitung k tetangga terdekat. Dalam contoh ini, kita menggunakan indeks FLAT, tetapi untuk kumpulan data berskala besar, Milvus mendukung metode pengindeksan yang lebih canggih untuk mempercepat proses pencarian. Pertama, kita perlu mendapatkan iterator untuk mengulang koleksi Milvus yang telah kita buat sebelumnya.

    +
    import hdbscan
    +import numpy as np
    +import pandas as pd
    +import plotly.express as px
    +from umap import UMAP
    +from pymilvus import Collection
    +
    +collection = Collection(name="news_data")
    +collection.load()
    +
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "embedding"]
    +)
    +
    +search_params = {
    +    "metric_type": "L2",
    +    "params": {"nprobe": 10},
    +}  # L2 is Euclidean distance
    +
    +ids = []
    +dist = {}
    +
    +embeddings = []
    +
    +

    Kita akan mengulang semua sematan di dalam koleksi Milvus. Untuk setiap embedding, kita akan mencari top-k tetangganya dalam koleksi yang sama, mendapatkan id dan jaraknya. Kemudian kita juga perlu membuat sebuah kamus untuk memetakan ID asli ke sebuah indeks kontinu di dalam matriks jarak. Setelah selesai, kita perlu membuat matriks jarak yang diinisialisasi dengan semua elemen sebagai tak terhingga dan mengisi elemen-elemen yang kita cari. Dengan cara ini, jarak antara titik-titik yang jauh akan diabaikan. Terakhir, kita menggunakan library HDBSCAN untuk mengelompokkan titik-titik menggunakan matriks jarak yang telah kita buat. Kita perlu mengatur metrik ke 'precomputed' untuk menunjukkan bahwa data tersebut merupakan matriks jarak dan bukannya embedding asli.

    +
    while True:
    +    batch = iterator.next()
    +    batch_ids = [data["id"] for data in batch]
    +    ids.extend(batch_ids)
    +
    +    query_vectors = [data["embedding"] for data in batch]
    +    embeddings.extend(query_vectors)
    +
    +    results = collection.search(
    +        data=query_vectors,
    +        limit=50,
    +        anns_field="embedding",
    +        param=search_params,
    +        output_fields=["id"],
    +    )
    +    for i, batch_id in enumerate(batch_ids):
    +        dist[batch_id] = []
    +        for result in results[i]:
    +            dist[batch_id].append((result.id, result.distance))
    +
    +    if len(batch) == 0:
    +        break
    +
    +ids2index = {}
    +
    +for id in dist:
    +    ids2index[id] = len(ids2index)
    +
    +dist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)
    +
    +for id in dist:
    +    for result in dist[id]:
    +        dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]
    +
    +h = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric="precomputed")
    +hdb = h.fit(dist_metric)
    +
    +

    Setelah itu, pengelompokan HDBSCAN selesai. Kita bisa mendapatkan beberapa data dan menunjukkan klasternya. Perhatikan bahwa beberapa data tidak akan dimasukkan ke dalam klaster mana pun, yang berarti data tersebut adalah noise, karena terletak di wilayah yang jarang.

    +

    Visualisasi Cluster menggunakan UMAP

    Kita telah mengelompokkan data menggunakan HDBSCAN dan mendapatkan label untuk setiap titik data. Namun dengan menggunakan beberapa teknik visualisasi, kita bisa mendapatkan gambaran keseluruhan dari cluster untuk analisis intuitif. Sekarang kita akan menggunakan UMAP untuk memvisualisasikan cluster. UMAP adalah metode yang efisien yang digunakan untuk pengurangan dimensi, mempertahankan struktur data dimensi tinggi sambil memproyeksikannya ke dalam ruang dimensi yang lebih rendah untuk visualisasi atau analisis lebih lanjut. Dengannya, kita dapat memvisualisasikan data dimensi tinggi asli dalam ruang 2D atau 3D, dan melihat cluster dengan jelas. Di sini sekali lagi, kita mengulang titik data dan mendapatkan id dan teks untuk data asli, kemudian kita menggunakan ploty untuk memplot titik-titik data dengan metainfo ini dalam sebuah gambar, dan menggunakan warna yang berbeda untuk merepresentasikan cluster yang berbeda.

    +
    import plotly.io as pio
    +
    +pio.renderers.default = "notebook"
    +
    +umap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)
    +
    +df_umap = (
    +    pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=["x", "y"])
    +    .assign(cluster=lambda df: hdb.labels_.astype(str))
    +    .query('cluster != "-1"')
    +    .sort_values(by="cluster")
    +)
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "text"]
    +)
    +
    +ids = []
    +texts = []
    +
    +while True:
    +    batch = iterator.next()
    +    if len(batch) == 0:
    +        break
    +    batch_ids = [data["id"] for data in batch]
    +    batch_texts = [data["text"] for data in batch]
    +    ids.extend(batch_ids)
    +    texts.extend(batch_texts)
    +
    +show_texts = [texts[i] for i in df_umap.index]
    +
    +df_umap["hover_text"] = show_texts
    +fig = px.scatter(
    +    df_umap, x="x", y="y", color="cluster", hover_data={"hover_text": True}
    +)
    +fig.show()
    +
    +

    + + image + gambar

    +

    Di sini, kami mendemonstrasikan bahwa data dikelompokkan dengan baik, dan Anda dapat mengarahkan kursor ke titik-titik tersebut untuk memeriksa teks yang diwakilinya. Dengan buku catatan ini, kami harap Anda dapat mempelajari cara menggunakan HDBSCAN untuk mengelompokkan embedding dengan Milvus secara efisien, yang juga dapat diterapkan pada jenis data lainnya. Dikombinasikan dengan model bahasa yang besar, pendekatan ini memungkinkan analisis yang lebih dalam pada data Anda dalam skala besar.

    diff --git a/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.json b/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.json new file mode 100644 index 000000000..1d2c8572c --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"How to Enhance the Performance of Your RAG Pipeline","anchorList":[{"label":"Cara Meningkatkan Kinerja Pipeline RAG Anda","href":"How-to-Enhance-the-Performance-of-Your-RAG-Pipeline","type":1,"isActive":false},{"label":"Pipeline RAG Standar","href":"A-Standard-RAG-Pipeline","type":2,"isActive":false},{"label":"Berbagai Jenis Teknik Peningkatan RAG","href":"Various-Types-of-RAG-Enhancement-Techniques","type":2,"isActive":false},{"label":"Peningkatan Kueri","href":"Query-Enhancement","type":2,"isActive":false},{"label":"Peningkatan Pengindeksan","href":"Indexing-Enhancement","type":2,"isActive":false},{"label":"Peningkatan Retriever","href":"Retriever-Enhancement","type":2,"isActive":false},{"label":"Peningkatan Generator","href":"Generator-Enhancement","type":2,"isActive":false},{"label":"Peningkatan Pipa RAG","href":"RAG-Pipeline-Enhancement","type":2,"isActive":false},{"label":"Ringkasan","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.md b/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.md new file mode 100644 index 000000000..3fda96aed --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/how_to_enhance_your_rag.md @@ -0,0 +1,296 @@ +--- +id: how_to_enhance_your_rag.md +summary: >- + Dengan meningkatnya popularitas aplikasi Retrieval Augmented Generation RAG, + ada kekhawatiran yang berkembang tentang peningkatan kinerja mereka. Artikel + ini menyajikan semua cara yang memungkinkan untuk mengoptimalkan pipeline RAG + dan memberikan ilustrasi yang sesuai untuk membantu Anda memahami dengan cepat + strategi pengoptimalan RAG yang utama. +title: Cara Meningkatkan Kinerja Pipeline RAG Anda +--- +

    Cara Meningkatkan Kinerja Pipeline RAG Anda

    Dengan meningkatnya popularitas aplikasi Retrieval Augmented Generation(RAG), ada perhatian yang semakin besar untuk meningkatkan kinerjanya. Artikel ini menyajikan semua cara yang memungkinkan untuk mengoptimalkan pipeline RAG dan memberikan ilustrasi yang sesuai untuk membantu Anda memahami dengan cepat strategi pengoptimalan RAG yang utama.

    +

    Penting untuk dicatat bahwa kami hanya akan memberikan eksplorasi tingkat tinggi dari strategi dan teknik ini, dengan fokus pada bagaimana mereka berintegrasi ke dalam sistem RAG. Namun, kami tidak akan membahas detail yang rumit atau memandu Anda melalui implementasi langkah demi langkah.

    +

    Pipeline RAG Standar

    Diagram di bawah ini menunjukkan pipeline RAG vanila yang paling mudah. Pertama, potongan dokumen dimuat ke dalam penyimpanan vektor (seperti Milvus atau Zilliz cloud). Kemudian, penyimpanan vektor mengambil potongan Top-K yang paling relevan yang terkait dengan kueri. Potongan-potongan yang relevan ini kemudian disuntikkan ke dalam prompt konteks LLM, dan akhirnya, LLM mengembalikan jawaban akhir.

    +

    + + + + +

    +

    Berbagai Jenis Teknik Peningkatan RAG

    Kita dapat mengklasifikasikan pendekatan peningkatan RAG yang berbeda berdasarkan perannya dalam tahapan pipeline RAG.

    +
      +
    • Peningkatan Kueri: Memodifikasi dan memanipulasi proses kueri dari input RAG untuk mengekspresikan atau memproses maksud kueri dengan lebih baik.
    • +
    • Peningkatan Pengindeksan: Mengoptimalkan pembuatan indeks chunking menggunakan teknik seperti multi-chunking, pengindeksan bertahap, atau pengindeksan multi-arah.
    • +
    • Peningkatan Retriever: Menerapkan teknik dan strategi pengoptimalan selama proses pengambilan.
    • +
    • Peningkatan Generator: Menyesuaikan dan mengoptimalkan prompt saat merakit prompt untuk LLM agar dapat memberikan respons yang lebih baik.
    • +
    • Peningkatan RAG Pipeline: Mengalihkan proses secara dinamis di dalam seluruh pipeline RAG, termasuk menggunakan agen atau alat untuk mengoptimalkan langkah-langkah utama dalam pipeline RAG.
    • +
    +

    Selanjutnya, kami akan memperkenalkan metode spesifik di bawah masing-masing kategori ini.

    +

    Peningkatan Kueri

    Mari jelajahi empat metode efektif untuk meningkatkan pengalaman kueri Anda: Pertanyaan Hipotetis, Penyematan Dokumen Hipotetis, Sub-Kueri, dan Prompt Mundur.

    +

    Membuat Pertanyaan Hipotetis

    Membuat pertanyaan hipotetis melibatkan penggunaan LLM untuk menghasilkan beberapa pertanyaan yang mungkin ditanyakan pengguna tentang konten di dalam setiap bagian dokumen. Sebelum kueri pengguna yang sebenarnya mencapai LLM, penyimpanan vektor mengambil pertanyaan hipotetis yang paling relevan yang terkait dengan kueri yang sebenarnya, bersama dengan potongan dokumen yang sesuai, dan meneruskannya ke LLM.

    +

    + + + + +

    +

    Metodologi ini melewati masalah asimetri lintas domain dalam proses pencarian vektor dengan secara langsung terlibat dalam pencarian kueri-ke-kueri, sehingga mengurangi beban pencarian vektor. Namun, metodologi ini menimbulkan biaya tambahan dan ketidakpastian dalam menghasilkan pertanyaan hipotetis.

    +

    HyDE (Penyematan Dokumen Hipotetis)

    HyDE adalah singkatan dari Hypothetical Document Embeddings. Ini memanfaatkan LLM untuk membuat "Hypothetical Document" atau jawaban palsu dalam menanggapi pertanyaan pengguna tanpa informasi kontekstual. Jawaban palsu ini kemudian diubah menjadi vektor embeddings dan digunakan untuk menanyakan potongan dokumen yang paling relevan dalam basis data vektor. Selanjutnya, basis data vektor mengambil potongan dokumen Top-K yang paling relevan dan mengirimkannya ke LLM dan kueri pengguna asli untuk menghasilkan jawaban akhir.

    +

    + + + + +

    +

    Metode ini mirip dengan teknik pertanyaan hipotetis dalam mengatasi asimetri lintas domain dalam pencarian vektor. Namun, metode ini juga memiliki kekurangan, seperti biaya komputasi tambahan dan ketidakpastian dalam menghasilkan jawaban palsu.

    +

    Untuk informasi lebih lanjut, lihat makalah HyDE.

    +

    Membuat Sub-Kueri

    Ketika kueri pengguna terlalu rumit, kita dapat menggunakan LLM untuk memecahnya menjadi sub-kueri yang lebih sederhana sebelum meneruskannya ke basis data vektor dan LLM. Mari kita lihat sebuah contoh.

    +

    Bayangkan seorang pengguna bertanya: "Apa saja perbedaan fitur antara Milvus dan Zilliz Cloud?" Pertanyaan ini cukup rumit dan mungkin tidak memiliki jawaban langsung dalam basis pengetahuan kita. Untuk mengatasi masalah ini, kita bisa membaginya menjadi dua sub-kueri yang lebih sederhana:

    +
      +
    • Sub-kueri 1: "Apa saja fitur-fitur yang dimiliki Milvus?"
    • +
    • Sub-kueri 2: "Apa saja fitur-fitur Zilliz Cloud?"
    • +
    +

    Setelah kami memiliki sub-kueri ini, kami mengirim semuanya ke basis data vektor setelah mengubahnya menjadi sematan vektor. Basis data vektor kemudian menemukan potongan dokumen Top-K yang paling relevan dengan setiap sub-kueri. Terakhir, LLM menggunakan informasi ini untuk menghasilkan jawaban yang lebih baik.

    +

    + + + + +

    +

    Dengan memecah kueri pengguna menjadi sub-kueri, kami mempermudah sistem kami untuk menemukan informasi yang relevan dan memberikan jawaban yang akurat, bahkan untuk pertanyaan yang rumit sekalipun.

    +

    Membuat Petunjuk Mundur

    Cara lain untuk menyederhanakan kueri pengguna yang rumit adalah dengan membuat petunjuk mundur. Teknik ini melibatkan pengabstraksian pertanyaan pengguna yang rumit menjadi "pertanyaan mundur"** menggunakan LLM. Kemudian, basis data vektor menggunakan pertanyaan-pertanyaan mundur ini untuk mengambil potongan dokumen yang paling relevan. Terakhir, LLM menghasilkan jawaban yang lebih akurat berdasarkan potongan dokumen yang diambil.

    +

    Mari kita ilustrasikan teknik ini dengan sebuah contoh. Pertimbangkan pertanyaan berikut ini, yang cukup kompleks dan tidak mudah untuk dijawab secara langsung:

    +

    Permintaan Pengguna Asli: "Saya memiliki kumpulan data dengan 10 miliar catatan dan ingin menyimpannya di Milvus untuk kueri. Apakah itu mungkin?"

    +

    Untuk menyederhanakan pertanyaan pengguna ini, kita dapat menggunakan LLM untuk menghasilkan pertanyaan mundur yang lebih mudah:

    +

    Pertanyaan Mundur: "Berapa batas ukuran dataset yang dapat ditangani oleh Milvus?"

    +

    + + + + +

    +

    Metode ini dapat membantu kita mendapatkan jawaban yang lebih baik dan lebih akurat untuk pertanyaan yang kompleks. Metode ini memecah pertanyaan asli ke dalam bentuk yang lebih sederhana, sehingga memudahkan sistem kami untuk menemukan informasi yang relevan dan memberikan jawaban yang akurat.

    +

    Peningkatan Pengindeksan

    Meningkatkan pengindeksan adalah strategi lain untuk meningkatkan kinerja aplikasi RAG Anda. Mari kita jelajahi tiga teknik peningkatan pengindeksan.

    +

    Menggabungkan Potongan Dokumen Secara Otomatis

    Saat membuat indeks, kita dapat menggunakan dua tingkat perincian: potongan anak dan potongan induknya. Awalnya, kita mencari potongan anak pada tingkat detail yang lebih halus. Kemudian, kami menerapkan strategi penggabungan: jika sejumlah tertentu, n, potongan anak dari k potongan anak pertama termasuk dalam potongan induk yang sama, kami memberikan potongan induk ini ke LLM sebagai informasi kontekstual.

    +

    + + + + +

    +

    Metodologi ini telah diimplementasikan di LlamaIndex.

    +

    Membangun Indeks Hirarkis

    Ketika membuat indeks untuk dokumen, kita dapat membuat indeks dua tingkat: satu untuk ringkasan dokumen dan satu lagi untuk potongan dokumen. Proses pencarian vektor terdiri dari dua tahap: pertama, kami menyaring dokumen yang relevan berdasarkan ringkasan, dan selanjutnya, kami mengambil potongan dokumen yang sesuai secara eksklusif di dalam dokumen-dokumen yang relevan ini.

    +

    + + + + +

    +

    Pendekatan ini terbukti bermanfaat dalam situasi yang melibatkan volume data yang besar atau contoh di mana data bersifat hirarkis, seperti pengambilan konten dalam koleksi perpustakaan.

    +

    Temu Kembali Hibrida dan Pemeringkatan Ulang

    Teknik Hybrid Retrieval and Reranking mengintegrasikan satu atau lebih metode pencarian tambahan dengan pencarian kemiripan vektor. Kemudian, pemeringkat memberi peringkat ulang hasil yang diambil berdasarkan relevansinya dengan kueri pengguna.

    +

    Algoritme pencarian tambahan yang umum termasuk metode berbasis frekuensi leksikal seperti BM25 atau model besar yang menggunakan sematan jarang seperti Splade. Algoritme pemeringkatan ulang termasuk RRF atau model yang lebih canggih seperti Cross-Encoder, yang menyerupai arsitektur seperti BERT.

    +

    + + + + +

    +

    Pendekatan ini memanfaatkan beragam metode pencarian ulang untuk meningkatkan kualitas pencarian ulang dan mengatasi potensi kesenjangan dalam penarikan vektor.

    +

    Peningkatan Retriever

    Penyempurnaan komponen retriever dalam sistem RAG juga dapat meningkatkan aplikasi RAG. Mari kita jelajahi beberapa metode yang efektif untuk meningkatkan retriever.

    +

    Pengambilan Jendela Kalimat

    Dalam sistem RAG dasar, potongan dokumen yang diberikan kepada LLM adalah jendela yang lebih besar yang mencakup potongan sematan yang diambil. Hal ini memastikan bahwa informasi yang diberikan kepada LLM mencakup detail kontekstual yang lebih luas, sehingga meminimalkan kehilangan informasi. Teknik Pengambilan Jendela Kalimat memisahkan potongan dokumen yang digunakan untuk pengambilan sematan dari potongan yang diberikan ke LLM.

    +

    + + + + +

    +

    Namun, memperbesar ukuran jendela dapat menyebabkan informasi tambahan yang mengganggu. Kita dapat menyesuaikan ukuran perluasan jendela berdasarkan kebutuhan bisnis tertentu.

    +

    Pemfilteran Meta-data

    Untuk memastikan jawaban yang lebih tepat, kita dapat menyaring dokumen yang diambil dengan menyaring metadata seperti waktu dan kategori sebelum meneruskannya ke LLM. Misalnya, jika laporan keuangan yang mencakup beberapa tahun diambil, pemfilteran berdasarkan tahun yang diinginkan akan menyaring informasi untuk memenuhi persyaratan tertentu. Metode ini terbukti efektif dalam situasi dengan data yang luas dan metadata yang terperinci, seperti pengambilan konten dalam koleksi perpustakaan.

    +

    + + + + +

    +

    Peningkatan Generator

    Mari kita jelajahi lebih banyak teknik pengoptimalan RAG dengan meningkatkan generator dalam sistem RAG.

    +

    Mengompresi prompt LLM

    Informasi noise dalam potongan dokumen yang diambil dapat secara signifikan memengaruhi keakuratan jawaban akhir RAG. Jendela prompt yang terbatas dalam LLM juga menghadirkan rintangan untuk mendapatkan jawaban yang lebih akurat. Untuk mengatasi tantangan ini, kita dapat memampatkan detail yang tidak relevan, menekankan paragraf kunci, dan mengurangi panjang konteks keseluruhan potongan dokumen yang diambil.

    +

    + + + + +

    +

    Pendekatan ini mirip dengan metode pengambilan dan pemeringkatan hibrida yang telah dibahas sebelumnya, di mana pemeringkat digunakan untuk menyaring potongan dokumen yang tidak relevan.

    +

    Menyesuaikan urutan potongan dalam prompt

    Dalam makalah "Lost in the middle," para peneliti mengamati bahwa LLM sering mengabaikan informasi di tengah-tengah dokumen yang diberikan selama proses penalaran. Sebaliknya, mereka cenderung lebih mengandalkan informasi yang disajikan di awal dan akhir dokumen.

    +

    Berdasarkan pengamatan ini, kita dapat menyesuaikan urutan potongan yang diambil untuk meningkatkan kualitas jawaban: ketika mengambil beberapa potongan pengetahuan, potongan dengan kepercayaan yang relatif rendah ditempatkan di tengah, dan potongan dengan kepercayaan yang relatif tinggi diposisikan di kedua ujungnya.

    +

    + + + + +

    +

    Peningkatan Pipa RAG

    Kami juga dapat meningkatkan performa aplikasi RAG Anda dengan meningkatkan seluruh pipeline RAG.

    +

    Refleksi diri

    Pendekatan ini menggabungkan konsep refleksi diri dalam agen AI. Lalu, bagaimana cara kerja teknik ini?

    +

    Beberapa potongan dokumen Top-K yang diambil pada awalnya bersifat ambigu dan mungkin tidak menjawab pertanyaan pengguna secara langsung. Dalam kasus seperti itu, kita dapat melakukan refleksi putaran kedua untuk memverifikasi apakah potongan dokumen tersebut benar-benar dapat menjawab pertanyaan pengguna.

    +

    Kita dapat melakukan refleksi dengan menggunakan metode refleksi yang efisien seperti model Natural Language Inference (NLI) atau alat tambahan seperti pencarian di internet untuk verifikasi.

    +

    + + + + +

    +

    Konsep refleksi diri ini telah dieksplorasi dalam beberapa makalah atau proyek, termasuk Self-RAG, Corrective RAG, LangGraph, dll.

    +

    Perutean Kueri dengan Agen

    Terkadang, kita tidak perlu menggunakan sistem RAG untuk menjawab pertanyaan sederhana karena dapat mengakibatkan lebih banyak kesalahpahaman dan kesimpulan dari informasi yang menyesatkan. Dalam kasus seperti itu, kita dapat menggunakan agen sebagai perute pada tahap kueri. Agen ini menilai apakah kueri perlu melalui jalur RAG. Jika ya, pipa RAG berikutnya dimulai; jika tidak, LLM secara langsung menangani kueri tersebut.

    +

    + + + + + + + + + + +

    +

    Agen ini dapat mengambil berbagai bentuk, termasuk LLM, model klasifikasi kecil, atau bahkan seperangkat aturan.

    +

    Dengan merutekan kueri berdasarkan maksud pengguna, Anda dapat mengalihkan sebagian dari kueri, yang mengarah ke peningkatan signifikan dalam waktu respons dan pengurangan nyata dalam kebisingan yang tidak perlu.

    +

    Kita dapat memperluas teknik perutean kueri ke proses lain dalam sistem RAG, seperti menentukan kapan harus menggunakan alat bantu seperti penelusuran web, melakukan sub-kueri, atau mencari gambar. Pendekatan ini memastikan bahwa setiap langkah dalam sistem RAG dioptimalkan berdasarkan persyaratan spesifik dari kueri, sehingga menghasilkan pencarian informasi yang lebih efisien dan akurat.

    +

    Ringkasan

    Meskipun pipeline RAG vanila mungkin terlihat sederhana, namun untuk mencapai kinerja bisnis yang optimal sering kali membutuhkan teknik pengoptimalan yang lebih canggih.

    +

    Artikel ini merangkum berbagai pendekatan populer untuk meningkatkan kinerja aplikasi RAG Anda. Kami juga memberikan ilustrasi yang jelas untuk membantu Anda memahami konsep dan teknik ini dengan cepat dan mempercepat implementasi dan pengoptimalannya.

    +

    Anda bisa mendapatkan implementasi sederhana dari pendekatan utama yang tercantum dalam artikel ini di tautan GitHub ini.

    diff --git a/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.json b/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.json new file mode 100644 index 000000000..a9a3e0ca4 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus \"pymilvus[model]\"\n","# Run this cell to download the dataset\n$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv\n","import pandas as pd\n\nfile_path = \"quora_duplicate_questions.tsv\"\ndf = pd.read_csv(file_path, sep=\"\\t\")\nquestions = set()\nfor _, row in df.iterrows():\n obj = row.to_dict()\n questions.add(obj[\"question1\"][:512])\n questions.add(obj[\"question2\"][:512])\n if len(questions) > 500: # Skip this if you want to use the full dataset\n break\n\ndocs = list(questions)\n\n# example question\nprint(docs[0])\n","from milvus_model.hybrid import BGEM3EmbeddingFunction\n\nef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\ndense_dim = ef.dim[\"dense\"]\n\n# Generate embeddings using BGE-M3 model\ndocs_embeddings = ef(docs)\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# Connect to Milvus given URI\nconnections.connect(uri=\"./milvus.db\")\n\n# Specify the data schema for the new Collection\nfields = [\n # Use auto generated id as primary key\n FieldSchema(\n name=\"pk\", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100\n ),\n # Store the original text to retrieve based on semantically distance\n FieldSchema(name=\"text\", dtype=DataType.VARCHAR, max_length=512),\n # Milvus now supports both sparse and dense vectors,\n # we can store each in a separate field to conduct hybrid search on both vectors\n FieldSchema(name=\"sparse_vector\", dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=\"dense_vector\", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n]\nschema = CollectionSchema(fields)\n\n# Create collection (drop the old one if exists)\ncol_name = \"hybrid_demo\"\nif utility.has_collection(col_name):\n Collection(col_name).drop()\ncol = Collection(col_name, schema, consistency_level=\"Strong\")\n\n# To make vector search efficient, we need to create indices for the vector fields\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"sparse_vector\", sparse_index)\ndense_index = {\"index_type\": \"AUTOINDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"dense_vector\", dense_index)\ncol.load()\n","# For efficiency, we insert 50 records in each small batch\nfor i in range(0, len(docs), 50):\n batched_entities = [\n docs[i : i + 50],\n docs_embeddings[\"sparse\"][i : i + 50],\n docs_embeddings[\"dense\"][i : i + 50],\n ]\n col.insert(batched_entities)\nprint(\"Number of entities inserted:\", col.num_entities)\n","# Enter your search query\nquery = input(\"Enter your search query: \")\nprint(query)\n\n# Generate embeddings for the query\nquery_embeddings = ef([query])\n# print(query_embeddings)\n","from pymilvus import (\n AnnSearchRequest,\n WeightedRanker,\n)\n\n\ndef dense_search(col, query_dense_embedding, limit=10):\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n res = col.search(\n [query_dense_embedding],\n anns_field=\"dense_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef sparse_search(col, query_sparse_embedding, limit=10):\n search_params = {\n \"metric_type\": \"IP\",\n \"params\": {},\n }\n res = col.search(\n [query_sparse_embedding],\n anns_field=\"sparse_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef hybrid_search(\n col,\n query_dense_embedding,\n query_sparse_embedding,\n sparse_weight=1.0,\n dense_weight=1.0,\n limit=10,\n):\n dense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n dense_req = AnnSearchRequest(\n [query_dense_embedding], \"dense_vector\", dense_search_params, limit=limit\n )\n sparse_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n sparse_req = AnnSearchRequest(\n [query_sparse_embedding], \"sparse_vector\", sparse_search_params, limit=limit\n )\n rerank = WeightedRanker(sparse_weight, dense_weight)\n res = col.hybrid_search(\n [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=[\"text\"]\n )[0]\n return [hit.get(\"text\") for hit in res]\n","dense_results = dense_search(col, query_embeddings[\"dense\"][0])\nsparse_results = sparse_search(col, query_embeddings[\"sparse\"]._getrow(0))\nhybrid_results = hybrid_search(\n col,\n query_embeddings[\"dense\"][0],\n query_embeddings[\"sparse\"]._getrow(0),\n sparse_weight=0.7,\n dense_weight=1.0,\n)\n","def doc_text_formatting(ef, query, docs):\n tokenizer = ef.model.tokenizer\n query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)\n query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)\n formatted_texts = []\n\n for doc in docs:\n ldx = 0\n landmarks = []\n encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)\n tokens = tokenizer.convert_ids_to_tokens(encoding[\"input_ids\"])[1:-1]\n offsets = encoding[\"offset_mapping\"][1:-1]\n for token, (start, end) in zip(tokens, offsets):\n if token in query_tokens:\n if len(landmarks) != 0 and start == landmarks[-1]:\n landmarks[-1] = end\n else:\n landmarks.append(start)\n landmarks.append(end)\n close = False\n formatted_text = \"\"\n for i, c in enumerate(doc):\n if ldx == len(landmarks):\n pass\n elif i == landmarks[ldx]:\n if close:\n formatted_text += \"\"\n else:\n formatted_text += \"\"\n close = not close\n ldx = ldx + 1\n formatted_text += c\n if close is True:\n formatted_text += \"\"\n formatted_texts.append(formatted_text)\n return formatted_texts\n","from IPython.display import Markdown, display\n\n# Dense search results\ndisplay(Markdown(\"**Dense Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, dense_results)\nfor result in dense_results:\n display(Markdown(result))\n\n# Sparse search results\ndisplay(Markdown(\"\\n**Sparse Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, sparse_results)\nfor result in formatted_results:\n display(Markdown(result))\n\n# Hybrid search results\ndisplay(Markdown(\"\\n**Hybrid Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, hybrid_results)\nfor result in formatted_results:\n display(Markdown(result))\n"],"headingContent":"Hybrid Search with Milvus","anchorList":[{"label":"Pencarian Hibrida dengan Milvus","href":"Hybrid-Search-with-Milvus","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.md b/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.md new file mode 100644 index 000000000..e9a3da9dc --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/hybrid_search_with_milvus.md @@ -0,0 +1,313 @@ +--- +id: hybrid_search_with_milvus.md +summary: Pencarian Hibrida dengan Milvus +title: Pencarian Hibrida dengan Milvus +--- +

    Pencarian Hibrida dengan Milvus

    Open In Colab +GitHub Repository

    +

    +

    Dalam tutorial ini, kami akan mendemonstrasikan cara melakukan pencarian hybrid dengan Milvus dan model BGE-M3. Model BGE-M3 dapat mengubah teks menjadi vektor padat dan jarang. Milvus mendukung penyimpanan kedua jenis vektor tersebut dalam satu koleksi, sehingga memungkinkan pencarian hibrida yang meningkatkan relevansi hasil.

    +

    Milvus mendukung metode pencarian Dense, Sparse, dan Hybrid:

    +
      +
    • Pengambilan Padat: Memanfaatkan konteks semantik untuk memahami makna di balik kueri.
    • +
    • Pencarian Jarang (Sparse Retrieval): Menekankan pencocokan teks untuk menemukan hasil berdasarkan istilah tertentu, setara dengan pencarian teks lengkap.
    • +
    • Temu Kembali Hibrida: Menggabungkan pendekatan Dense dan Sparse, menangkap konteks lengkap dan kata kunci spesifik untuk hasil pencarian yang komprehensif.
    • +
    +

    Dengan mengintegrasikan metode-metode ini, Pencarian Hibrida Milvus menyeimbangkan kemiripan semantik dan leksikal, sehingga meningkatkan relevansi hasil pencarian secara keseluruhan. Buku catatan ini akan memandu Anda melalui proses pengaturan dan penggunaan strategi pencarian ini, menyoroti keefektifannya dalam berbagai skenario pencarian.

    +

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus "pymilvus[model]"
    +
    +

    Unduh Dataset

    Untuk mendemonstrasikan pencarian, kita memerlukan korpus dokumen. Mari kita gunakan dataset Pertanyaan Duplikat Quora dan letakkan di direktori lokal.

    +

    Sumber dataset: Rilis Dataset Quora Pertama: Pasangan Pertanyaan

    +
    # Run this cell to download the dataset
    +$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv
    +
    +

    Memuat dan Menyiapkan Data

    Kami akan memuat set data dan menyiapkan korpus kecil untuk pencarian.

    +
    import pandas as pd
    +
    +file_path = "quora_duplicate_questions.tsv"
    +df = pd.read_csv(file_path, sep="\t")
    +questions = set()
    +for _, row in df.iterrows():
    +    obj = row.to_dict()
    +    questions.add(obj["question1"][:512])
    +    questions.add(obj["question2"][:512])
    +    if len(questions) > 500:  # Skip this if you want to use the full dataset
    +        break
    +
    +docs = list(questions)
    +
    +# example question
    +print(docs[0])
    +
    +
    What is the strongest Kevlar cord?
    +
    +

    Gunakan Model BGE-M3 untuk Penyematan

    Model BGE-M3 dapat menyematkan teks sebagai vektor padat dan jarang.

    +
    from milvus_model.hybrid import BGEM3EmbeddingFunction
    +
    +ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +dense_dim = ef.dim["dense"]
    +
    +# Generate embeddings using BGE-M3 model
    +docs_embeddings = ef(docs)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 302473.85it/s]
    +Inference Embeddings: 100%|██████████| 32/32 [01:59<00:00,  3.74s/it]
    +
    +

    Menyiapkan Koleksi dan Indeks Milvus

    Kita akan menyiapkan koleksi Milvus dan membuat indeks untuk bidang vektor.

    +
    +
      +
    • Menetapkan uri sebagai file lokal, misalnya "./milvus.db", adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan uri server, misalnya http://localhost:19530, sebagai uri Anda.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
    • +
    +
    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# Connect to Milvus given URI
    +connections.connect(uri="./milvus.db")
    +
    +# Specify the data schema for the new Collection
    +fields = [
    +    # Use auto generated id as primary key
    +    FieldSchema(
    +        name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
    +    ),
    +    # Store the original text to retrieve based on semantically distance
    +    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),
    +    # Milvus now supports both sparse and dense vectors,
    +    # we can store each in a separate field to conduct hybrid search on both vectors
    +    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +]
    +schema = CollectionSchema(fields)
    +
    +# Create collection (drop the old one if exists)
    +col_name = "hybrid_demo"
    +if utility.has_collection(col_name):
    +    Collection(col_name).drop()
    +col = Collection(col_name, schema, consistency_level="Strong")
    +
    +# To make vector search efficient, we need to create indices for the vector fields
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +col.create_index("sparse_vector", sparse_index)
    +dense_index = {"index_type": "AUTOINDEX", "metric_type": "IP"}
    +col.create_index("dense_vector", dense_index)
    +col.load()
    +
    +

    Memasukkan Data ke dalam Koleksi Milvus

    Masukkan dokumen dan penyematannya ke dalam koleksi.

    +
    # For efficiency, we insert 50 records in each small batch
    +for i in range(0, len(docs), 50):
    +    batched_entities = [
    +        docs[i : i + 50],
    +        docs_embeddings["sparse"][i : i + 50],
    +        docs_embeddings["dense"][i : i + 50],
    +    ]
    +    col.insert(batched_entities)
    +print("Number of entities inserted:", col.num_entities)
    +
    +
    Number of entities inserted: 502
    +
    +

    Masukkan Kueri Pencarian Anda

    # Enter your search query
    +query = input("Enter your search query: ")
    +print(query)
    +
    +# Generate embeddings for the query
    +query_embeddings = ef([query])
    +# print(query_embeddings)
    +
    +
    How to start learning programming?
    +
    +

    Pertama-tama kita akan menyiapkan beberapa fungsi yang berguna untuk menjalankan pencarian:

    +
      +
    • dense_search: hanya mencari di bidang vektor yang padat
    • +
    • sparse_search: hanya mencari di bidang vektor yang jarang
    • +
    • hybrid_search: mencari di seluruh bidang vektor padat dan vektor dengan perangkingan tertimbang
    • +
    +
    from pymilvus import (
    +    AnnSearchRequest,
    +    WeightedRanker,
    +)
    +
    +
    +def dense_search(col, query_dense_embedding, limit=10):
    +    search_params = {"metric_type": "IP", "params": {}}
    +    res = col.search(
    +        [query_dense_embedding],
    +        anns_field="dense_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def sparse_search(col, query_sparse_embedding, limit=10):
    +    search_params = {
    +        "metric_type": "IP",
    +        "params": {},
    +    }
    +    res = col.search(
    +        [query_sparse_embedding],
    +        anns_field="sparse_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def hybrid_search(
    +    col,
    +    query_dense_embedding,
    +    query_sparse_embedding,
    +    sparse_weight=1.0,
    +    dense_weight=1.0,
    +    limit=10,
    +):
    +    dense_search_params = {"metric_type": "IP", "params": {}}
    +    dense_req = AnnSearchRequest(
    +        [query_dense_embedding], "dense_vector", dense_search_params, limit=limit
    +    )
    +    sparse_search_params = {"metric_type": "IP", "params": {}}
    +    sparse_req = AnnSearchRequest(
    +        [query_sparse_embedding], "sparse_vector", sparse_search_params, limit=limit
    +    )
    +    rerank = WeightedRanker(sparse_weight, dense_weight)
    +    res = col.hybrid_search(
    +        [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=["text"]
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +

    Mari kita jalankan tiga pencarian yang berbeda dengan fungsi yang ditentukan:

    +
    dense_results = dense_search(col, query_embeddings["dense"][0])
    +sparse_results = sparse_search(col, query_embeddings["sparse"]._getrow(0))
    +hybrid_results = hybrid_search(
    +    col,
    +    query_embeddings["dense"][0],
    +    query_embeddings["sparse"]._getrow(0),
    +    sparse_weight=0.7,
    +    dense_weight=1.0,
    +)
    +
    +

    Menampilkan Hasil Pencarian

    Untuk menampilkan hasil pencarian Padat, Jarang, dan Hibrida, kita memerlukan beberapa utilitas untuk memformat hasilnya.

    +
    def doc_text_formatting(ef, query, docs):
    +    tokenizer = ef.model.tokenizer
    +    query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)
    +    query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)
    +    formatted_texts = []
    +
    +    for doc in docs:
    +        ldx = 0
    +        landmarks = []
    +        encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)
    +        tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])[1:-1]
    +        offsets = encoding["offset_mapping"][1:-1]
    +        for token, (start, end) in zip(tokens, offsets):
    +            if token in query_tokens:
    +                if len(landmarks) != 0 and start == landmarks[-1]:
    +                    landmarks[-1] = end
    +                else:
    +                    landmarks.append(start)
    +                    landmarks.append(end)
    +        close = False
    +        formatted_text = ""
    +        for i, c in enumerate(doc):
    +            if ldx == len(landmarks):
    +                pass
    +            elif i == landmarks[ldx]:
    +                if close:
    +                    formatted_text += "</span>"
    +                else:
    +                    formatted_text += "<span style='color:red'>"
    +                close = not close
    +                ldx = ldx + 1
    +            formatted_text += c
    +        if close is True:
    +            formatted_text += "</span>"
    +        formatted_texts.append(formatted_text)
    +    return formatted_texts
    +
    +

    Kemudian kita dapat menampilkan hasil pencarian dalam bentuk teks dengan sorotan:

    +
    from IPython.display import Markdown, display
    +
    +# Dense search results
    +display(Markdown("**Dense Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, dense_results)
    +for result in dense_results:
    +    display(Markdown(result))
    +
    +# Sparse search results
    +display(Markdown("\n**Sparse Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, sparse_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +# Hybrid search results
    +display(Markdown("\n**Hybrid Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, hybrid_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +

    Hasil Pencarian Padat:

    +

    Apa cara terbaik untuk mulai belajar robotika?

    +

    Bagaimana cara mempelajari bahasa komputer seperti java?

    +

    Bagaimana saya bisa mulai belajar keamanan informasi?

    +

    Apa itu pemrograman Java? Bagaimana Cara Belajar Bahasa Pemrograman Java?

    +

    Bagaimana saya bisa belajar keamanan komputer?

    +

    Apa cara terbaik untuk memulai robotika? Apa papan pengembangan terbaik yang bisa saya gunakan untuk mulai mengerjakannya?

    +

    Bagaimana saya bisa belajar berbicara bahasa Inggris dengan lancar?

    +

    Apa cara terbaik untuk belajar bahasa Prancis?

    +

    Bagaimana cara membuat fisika menjadi mudah dipelajari?

    +

    Bagaimana cara kita mempersiapkan diri untuk UPSC?

    +

    Hasil Pencarian Jarang:

    +

    Apa itu pemrograman Java? Bagaimana Cara Belajar Bahasa Pemrograman Java?

    +

    Apa cara terbaik untuk mulai belajar robotika?

    +

    Apa alternatif lain dari pembelajaran mesin?

    +

    Bagaimana cara membuat Terminal baru dan shell baru di Linux menggunakan pemrograman C?

    +

    Bagaimana cara membuat shell baru di terminal baru menggunakan pemrograman C (terminal Linux)?

    +

    Bisnis mana yang lebih baik untuk dimulai di Hyderabad?

    +

    Bisnis mana yang bagus untuk memulai di Hyderabad?

    +

    Apa cara terbaik untuk memulai robotika? Apa papan pengembangan terbaik yang bisa saya gunakan untuk mulai mengerjakannya?

    +

    Matematika apa yang dibutuhkan oleh seorang pemula untuk memahami algoritma pemrograman komputer? Buku algoritma apa yang cocok untuk pemula yang lengkap?

    +

    Bagaimana Anda membuat hidup sesuai dengan Anda dan menghentikan hidup menyiksa Anda secara mental dan emosional?

    +

    Hasil Pencarian Hibrida:

    +

    Apa cara terbaik untuk memulai robotika? Apa papan pengembangan terbaik yang bisa saya gunakan untuk mulai mengerjakannya?

    +

    Apa itu pemrograman Java? Bagaimana Cara Belajar Bahasa Pemrograman Java?

    +

    Apa cara terbaik untuk mulai belajar robotika?

    +

    Bagaimana cara kita mempersiapkan diri untuk UPSC?

    +

    Bagaimana cara membuat fisika menjadi mudah dipelajari?

    +

    Apa cara terbaik untuk belajar bahasa Prancis?

    +

    Bagaimana saya bisa belajar berbicara bahasa Inggris dengan lancar?

    +

    Bagaimana saya bisa belajar keamanan komputer?

    +

    Bagaimana saya bisa mulai belajar keamanan informasi?

    +

    Bagaimana cara belajar bahasa komputer seperti java?

    +

    Apa alternatif lain untuk pembelajaran mesin?

    +

    Bagaimana cara membuat Terminal dan shell baru di Linux menggunakan pemrograman C?

    +

    Bagaimana cara membuat shell baru di terminal baru menggunakan pemrograman C (terminal Linux)?

    +

    Bisnis mana yang lebih baik untuk dimulai di Hyderabad?

    +

    Bisnis mana yang bagus untuk memulai di Hyderabad?

    +

    Matematika apa yang dibutuhkan seorang pemula untuk memahami algoritma pemrograman komputer? Buku algoritma apa yang cocok untuk pemula yang lengkap?

    +

    Bagaimana Anda membuat hidup sesuai dengan Anda dan menghentikan hidup menyiksa Anda secara mental dan emosional?

    +

    Penerapan Cepat

    Untuk mempelajari tentang cara memulai demo online dengan tutorial ini, silakan lihat contoh aplikasi.

    diff --git a/localization/v2.5.x/site/id/tutorials/image_deduplication_system.json b/localization/v2.5.x/site/id/tutorials/image_deduplication_system.json new file mode 100644 index 000000000..c8928e137 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/image_deduplication_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Image Deduplication","anchorList":[{"label":"Deduplikasi Gambar","href":"Image-Deduplication","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/image_deduplication_system.md b/localization/v2.5.x/site/id/tutorials/image_deduplication_system.md new file mode 100644 index 000000000..f2f6a95a3 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/image_deduplication_system.md @@ -0,0 +1,35 @@ +--- +id: image_deduplication_system.md +summary: Membangun sistem deduplikasi gambar dengan Milvus. +title: Deduplikasi Gambar +--- +

    Deduplikasi Gambar

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun sistem deduplikasi gambar.

    + +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    + +

    Beberapa tahun terakhir ini menjadi saksi ledakan eksponensial dari konten buatan pengguna. Orang dapat langsung mengunggah gambar yang telah mereka ambil ke platform media sosial. Namun, dengan melimpahnya data gambar, kami melihat banyak konten yang diduplikasi. Untuk meningkatkan pengalaman pengguna, gambar-gambar yang terduplikasi ini harus dihapus. Sistem deduplikasi gambar menyelamatkan kita dari pekerjaan manual untuk membandingkan gambar dalam database satu per satu untuk mencari gambar duplikat. Memilih gambar yang sama persis bukanlah tugas yang rumit. Namun, terkadang gambar dapat diperbesar, dipotong, atau dengan kecerahan atau skala abu-abu yang disesuaikan. Sistem deduplikasi gambar perlu mengidentifikasi gambar-gambar yang mirip ini dan menghilangkannya juga.

    +

    Dalam tutorial ini, Anda akan belajar cara membangun sistem deduplikasi gambar. Tutorial ini menggunakan model ResNet-50 untuk mengekstrak fitur gambar dan mengubahnya menjadi vektor. Kemudian vektor-vektor gambar ini disimpan dalam basis data vektor Milvus dan pencarian kemiripan vektor juga dilakukan di Milvus.

    +

    + + Image_deduplication_workflow + Alur kerja image_deduplikasi

    diff --git a/localization/v2.5.x/site/id/tutorials/image_similarity_search.json b/localization/v2.5.x/site/id/tutorials/image_similarity_search.json new file mode 100644 index 000000000..a05a863fc --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/image_similarity_search.json @@ -0,0 +1 @@ +{"codeList":["!wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip\n!unzip -q -o reverse_image_search.zip\n","$ pip install pymilvus --upgrade\n$ pip install timm\n","import torch\nfrom PIL import Image\nimport timm\nfrom sklearn.preprocessing import normalize\nfrom timm.data import resolve_data_config\nfrom timm.data.transforms_factory import create_transform\n\n\nclass FeatureExtractor:\n def __init__(self, modelname):\n # Load the pre-trained model\n self.model = timm.create_model(\n modelname, pretrained=True, num_classes=0, global_pool=\"avg\"\n )\n self.model.eval()\n\n # Get the input size required by the model\n self.input_size = self.model.default_cfg[\"input_size\"]\n\n config = resolve_data_config({}, model=modelname)\n # Get the preprocessing function provided by TIMM for the model\n self.preprocess = create_transform(**config)\n\n def __call__(self, imagepath):\n # Preprocess the input image\n input_image = Image.open(imagepath).convert(\"RGB\") # Convert to RGB if needed\n input_image = self.preprocess(input_image)\n\n # Convert the image to a PyTorch tensor and add a batch dimension\n input_tensor = input_image.unsqueeze(0)\n\n # Perform inference\n with torch.no_grad():\n output = self.model(input_tensor)\n\n # Extract the feature vector\n feature_vector = output.squeeze().numpy()\n\n return normalize(feature_vector.reshape(1, -1), norm=\"l2\").flatten()\n","from pymilvus import MilvusClient\n\n# Set up a Milvus client\nclient = MilvusClient(uri=\"example.db\")\n# Create a collection in quick setup mode\nif client.has_collection(collection_name=\"image_embeddings\"):\n client.drop_collection(collection_name=\"image_embeddings\")\nclient.create_collection(\n collection_name=\"image_embeddings\",\n vector_field_name=\"vector\",\n dimension=512,\n auto_id=True,\n enable_dynamic_field=True,\n metric_type=\"COSINE\",\n)\n","import os\n\nextractor = FeatureExtractor(\"resnet34\")\n\nroot = \"./train\"\ninsert = True\nif insert is True:\n for dirpath, foldername, filenames in os.walk(root):\n for filename in filenames:\n if filename.endswith(\".JPEG\"):\n filepath = dirpath + \"/\" + filename\n image_embedding = extractor(filepath)\n client.insert(\n \"image_embeddings\",\n {\"vector\": image_embedding, \"filename\": filepath},\n )\n","from IPython.display import display\n\nquery_image = \"./test/Afghan_hound/n02088094_4261.JPEG\"\n\nresults = client.search(\n \"image_embeddings\",\n data=[extractor(query_image)],\n output_fields=[\"filename\"],\n search_params={\"metric_type\": \"COSINE\"},\n)\nimages = []\nfor result in results:\n for hit in result[:10]:\n filename = hit[\"entity\"][\"filename\"]\n img = Image.open(filename)\n img = img.resize((150, 150))\n images.append(img)\n\nwidth = 150 * 5\nheight = 150 * 2\nconcatenated_image = Image.new(\"RGB\", (width, height))\n\nfor idx, img in enumerate(images):\n x = idx % 5\n y = idx // 5\n concatenated_image.paste(img, (x * 150, y * 150))\ndisplay(\"query\")\ndisplay(Image.open(query_image).resize((150, 150)))\ndisplay(\"results\")\ndisplay(concatenated_image)\n"],"headingContent":"Image Search with Milvus","anchorList":[{"label":"Pencarian Gambar dengan Milvus","href":"Image-Search-with-Milvus","type":1,"isActive":false},{"label":"Persiapan Dataset","href":"Dataset-Preparation","type":2,"isActive":false},{"label":"Prasyarat","href":"Prequisites","type":2,"isActive":false},{"label":"Tentukan Pengekstrak Fitur","href":"Define-the-Feature-Extractor","type":2,"isActive":false},{"label":"Membuat Koleksi Milvus","href":"Create-a-Milvus-Collection","type":2,"isActive":false},{"label":"Memasukkan Embeddings ke Milvus","href":"Insert-the-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"Penyebaran Cepat","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/image_similarity_search.md b/localization/v2.5.x/site/id/tutorials/image_similarity_search.md new file mode 100644 index 000000000..a5fb389db --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/image_similarity_search.md @@ -0,0 +1,263 @@ +--- +id: image_similarity_search.md +summary: pencarian gambar dengan Milvus +title: Pencarian Gambar dengan Milvus +--- +

    Pencarian Gambar dengan Milvus

    Open In Colab +GitHub Repository

    +

    +

    Dalam buku catatan ini, kami akan menunjukkan kepada Anda cara menggunakan Milvus untuk mencari gambar yang mirip dalam sebuah dataset. Kami akan menggunakan subset dari dataset ImageNet, kemudian mencari gambar anjing Afghan untuk mendemonstrasikan hal ini.

    +

    Persiapan Dataset

    Pertama, kita perlu memuat dataset dan mengekstraknya untuk diproses lebih lanjut.

    +
    !wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
    +!unzip -q -o reverse_image_search.zip
    +
    +

    Prasyarat

    Untuk menjalankan notebook ini, Anda perlu menginstal dependensi berikut ini:

    +
      +
    • pymilvus>=2.4.2
    • +
    • timm
    • +
    • torch
    • +
    • numpy
    • +
    • sklearn
    • +
    • bantal
    • +
    +

    Untuk menjalankan Colab, kami menyediakan perintah praktis untuk menginstal dependensi yang diperlukan.

    +
    $ pip install pymilvus --upgrade
    +$ pip install timm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime. (Klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Tentukan Pengekstrak Fitur

    Kemudian, kita perlu mendefinisikan ekstraktor fitur yang mengekstrak penyematan dari sebuah gambar menggunakan model ResNet-34 dari timm.

    +
    import torch
    +from PIL import Image
    +import timm
    +from sklearn.preprocessing import normalize
    +from timm.data import resolve_data_config
    +from timm.data.transforms_factory import create_transform
    +
    +
    +class FeatureExtractor:
    +    def __init__(self, modelname):
    +        # Load the pre-trained model
    +        self.model = timm.create_model(
    +            modelname, pretrained=True, num_classes=0, global_pool="avg"
    +        )
    +        self.model.eval()
    +
    +        # Get the input size required by the model
    +        self.input_size = self.model.default_cfg["input_size"]
    +
    +        config = resolve_data_config({}, model=modelname)
    +        # Get the preprocessing function provided by TIMM for the model
    +        self.preprocess = create_transform(**config)
    +
    +    def __call__(self, imagepath):
    +        # Preprocess the input image
    +        input_image = Image.open(imagepath).convert("RGB")  # Convert to RGB if needed
    +        input_image = self.preprocess(input_image)
    +
    +        # Convert the image to a PyTorch tensor and add a batch dimension
    +        input_tensor = input_image.unsqueeze(0)
    +
    +        # Perform inference
    +        with torch.no_grad():
    +            output = self.model(input_tensor)
    +
    +        # Extract the feature vector
    +        feature_vector = output.squeeze().numpy()
    +
    +        return normalize(feature_vector.reshape(1, -1), norm="l2").flatten()
    +
    +

    Membuat Koleksi Milvus

    Kemudian kita perlu membuat koleksi Milvus untuk menyimpan embedding gambar

    +
    from pymilvus import MilvusClient
    +
    +# Set up a Milvus client
    +client = MilvusClient(uri="example.db")
    +# Create a collection in quick setup mode
    +if client.has_collection(collection_name="image_embeddings"):
    +    client.drop_collection(collection_name="image_embeddings")
    +client.create_collection(
    +    collection_name="image_embeddings",
    +    vector_field_name="vector",
    +    dimension=512,
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +    metric_type="COSINE",
    +)
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Memasukkan Embeddings ke Milvus

    Kami akan mengekstrak embeddings dari setiap gambar menggunakan model ResNet34 dan memasukkan gambar dari set pelatihan ke Milvus.

    +
    import os
    +
    +extractor = FeatureExtractor("resnet34")
    +
    +root = "./train"
    +insert = True
    +if insert is True:
    +    for dirpath, foldername, filenames in os.walk(root):
    +        for filename in filenames:
    +            if filename.endswith(".JPEG"):
    +                filepath = dirpath + "/" + filename
    +                image_embedding = extractor(filepath)
    +                client.insert(
    +                    "image_embeddings",
    +                    {"vector": image_embedding, "filename": filepath},
    +                )
    +
    +
    from IPython.display import display
    +
    +query_image = "./test/Afghan_hound/n02088094_4261.JPEG"
    +
    +results = client.search(
    +    "image_embeddings",
    +    data=[extractor(query_image)],
    +    output_fields=["filename"],
    +    search_params={"metric_type": "COSINE"},
    +)
    +images = []
    +for result in results:
    +    for hit in result[:10]:
    +        filename = hit["entity"]["filename"]
    +        img = Image.open(filename)
    +        img = img.resize((150, 150))
    +        images.append(img)
    +
    +width = 150 * 5
    +height = 150 * 2
    +concatenated_image = Image.new("RGB", (width, height))
    +
    +for idx, img in enumerate(images):
    +    x = idx % 5
    +    y = idx // 5
    +    concatenated_image.paste(img, (x * 150, y * 150))
    +display("query")
    +display(Image.open(query_image).resize((150, 150)))
    +display("results")
    +display(concatenated_image)
    +
    +
    'query'
    +
    +

    + + png + png

    +
    'results'
    +
    +

    + + Results + Hasil

    +

    Kita dapat melihat bahwa sebagian besar gambar berasal dari kategori yang sama dengan gambar pencarian, yaitu anjing Afghan. Ini berarti kami menemukan gambar yang mirip dengan gambar pencarian.

    +

    Penyebaran Cepat

    Untuk mempelajari tentang cara memulai demo online dengan tutorial ini, silakan lihat contoh aplikasi.

    diff --git a/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.json b/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.json new file mode 100644 index 000000000..d1cef2163 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install openai pymilvus datasets tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","COLLECTION_NAME = \"movie_search\"\nDIMENSION = 1536\n\nBATCH_SIZE = 1000\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Database\nclient = MilvusClient(\"./milvus_demo.db\")\n","# Remove collection if it already exists\nif client.has_collection(COLLECTION_NAME):\n client.drop_collection(COLLECTION_NAME)\n","from pymilvus import DataType\n\n# Create collection which includes the id, title, and embedding.\n\n# 1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=False,\n)\n\n# 2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"type\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"release_year\", datatype=DataType.INT64)\nschema.add_field(field_name=\"rating\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"description\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n\n# 3. Create collection with the schema\nclient.create_collection(collection_name=COLLECTION_NAME, schema=schema)\n","# Create the index on the collection and load it.\n\n# 1. Prepare index parameters\nindex_params = client.prepare_index_params()\n\n\n# 2. Add an index on the embedding field\nindex_params.add_index(\n field_name=\"embedding\", metric_type=\"IP\", index_type=\"AUTOINDEX\", params={}\n)\n\n\n# 3. Create index\nclient.create_index(collection_name=COLLECTION_NAME, index_params=index_params)\n\n\n# 4. Load collection\nclient.load_collection(collection_name=COLLECTION_NAME, replica_number=1)\n","from datasets import load_dataset\n\ndataset = load_dataset(\"hugginglearners/netflix-shows\", split=\"train\")\n","def emb_texts(texts):\n res = openai_client.embeddings.create(input=texts, model=\"text-embedding-3-small\")\n return [res_data.embedding for res_data in res.data]\n","from tqdm import tqdm\n\n# batch (data to be inserted) is a list of dictionaries\nbatch = []\n\n# Embed and insert in batches\nfor i in tqdm(range(0, len(dataset))):\n batch.append(\n {\n \"title\": dataset[i][\"title\"] or \"\",\n \"type\": dataset[i][\"type\"] or \"\",\n \"release_year\": dataset[i][\"release_year\"] or -1,\n \"rating\": dataset[i][\"rating\"] or \"\",\n \"description\": dataset[i][\"description\"] or \"\",\n }\n )\n\n if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:\n embeddings = emb_texts([item[\"description\"] for item in batch])\n\n for item, emb in zip(batch, embeddings):\n item[\"embedding\"] = emb\n\n client.insert(collection_name=COLLECTION_NAME, data=batch)\n batch = []\n","import textwrap\n\n\ndef query(query, top_k=5):\n text, expr = query\n\n res = client.search(\n collection_name=COLLECTION_NAME,\n data=emb_texts(text),\n filter=expr,\n limit=top_k,\n output_fields=[\"title\", \"type\", \"release_year\", \"rating\", \"description\"],\n search_params={\n \"metric_type\": \"IP\",\n \"params\": {},\n },\n )\n\n print(\"Description:\", text, \"Expression:\", expr)\n\n for hit_group in res:\n print(\"Results:\")\n for rank, hit in enumerate(hit_group, start=1):\n entity = hit[\"entity\"]\n\n print(\n f\"\\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}\"\n )\n print(\n f\"\\t\\tType: {entity.get('type', '')} \"\n f\"Release Year: {entity.get('release_year', '')} \"\n f\"Rating: {entity.get('rating', '')}\"\n )\n description = entity.get(\"description\", \"\")\n print(textwrap.fill(description, width=88))\n print()\n\n\nmy_query = (\"movie about a fluffly animal\", 'release_year < 2019 and rating like \"PG%\"')\n\nquery(my_query)\n"],"headingContent":"Movie Recommendation with Milvus","anchorList":[{"label":"Rekomendasi Film dengan Milvus","href":"Movie-Recommendation-with-Milvus","type":1,"isActive":false},{"label":"Ketergantungan dan Lingkungan","href":"Dependencies-and-Environment","type":2,"isActive":false},{"label":"Inisialisasi klien OpenAI dan Milvus","href":"Initialize-OpenAI-client-and-Milvus","type":2,"isActive":false},{"label":"Dataset","href":"Dataset","type":2,"isActive":false},{"label":"Memasukkan Data","href":"Insert-the-Data","type":2,"isActive":false},{"label":"Menanyakan Basis Data","href":"Query-the-Database","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.md b/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.md new file mode 100644 index 000000000..3fc42c22d --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/movie_recommendation_with_milvus.md @@ -0,0 +1,299 @@ +--- +id: movie_recommendation_with_milvus.md +summary: >- + Dalam buku catatan ini, kita akan mengeksplorasi cara membuat penyematan + deskripsi film menggunakan OpenAI dan memanfaatkan penyematan tersebut di + dalam Milvus untuk merekomendasikan film yang sesuai dengan preferensi Anda. + Untuk meningkatkan hasil pencarian, kita akan menggunakan pemfilteran untuk + melakukan pencarian metadata. Kumpulan data yang digunakan dalam contoh ini + bersumber dari kumpulan data HuggingFace dan berisi lebih dari 8.000 entri + film, menyediakan banyak pilihan untuk rekomendasi film. +title: Rekomendasi Film dengan Milvus +--- +

    Rekomendasi Film dengan Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Dalam buku catatan ini, kita akan mengeksplorasi cara membuat embedding deskripsi film menggunakan OpenAI dan memanfaatkan embedding tersebut di dalam Milvus untuk merekomendasikan film yang sesuai dengan preferensi Anda. Untuk meningkatkan hasil pencarian, kita akan menggunakan pemfilteran untuk melakukan pencarian metadata. Dataset yang digunakan dalam contoh ini bersumber dari dataset HuggingFace dan berisi lebih dari 8.000 entri film, memberikan banyak pilihan untuk rekomendasi film.

    +

    Ketergantungan dan Lingkungan

    Anda dapat menginstal dependensi dengan menjalankan perintah berikut:

    +
    $ pip install openai pymilvus datasets tqdm
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +

    Kita akan menggunakan OpenAI sebagai LLM dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Inisialisasi klien OpenAI dan Milvus

    Inisialisasi klien OpenAI.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Tetapkan nama koleksi dan dimensi untuk penyematan.

    +
    COLLECTION_NAME = "movie_search"
    +DIMENSION = 1536
    +
    +BATCH_SIZE = 1000
    +
    +

    Hubungkan ke Milvus.

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Database
    +client = MilvusClient("./milvus_demo.db")
    +
    +
    +

    Adapun argumen url dan token:

    +
      +
    • Mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan Api key di Zilliz Cloud.
    • +
    +
    +
    # Remove collection if it already exists
    +if client.has_collection(COLLECTION_NAME):
    +    client.drop_collection(COLLECTION_NAME)
    +
    +

    Tentukan bidang untuk koleksi, yang meliputi id, judul, jenis, tahun rilis, peringkat, dan deskripsi.

    +
    from pymilvus import DataType
    +
    +# Create collection which includes the id, title, and embedding.
    +
    +# 1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=False,
    +)
    +
    +# 2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="type", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="release_year", datatype=DataType.INT64)
    +schema.add_field(field_name="rating", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +# 3. Create collection with the schema
    +client.create_collection(collection_name=COLLECTION_NAME, schema=schema)
    +
    +

    Buat indeks pada koleksi dan muat.

    +
    # Create the index on the collection and load it.
    +
    +# 1. Prepare index parameters
    +index_params = client.prepare_index_params()
    +
    +
    +# 2. Add an index on the embedding field
    +index_params.add_index(
    +    field_name="embedding", metric_type="IP", index_type="AUTOINDEX", params={}
    +)
    +
    +
    +# 3. Create index
    +client.create_index(collection_name=COLLECTION_NAME, index_params=index_params)
    +
    +
    +# 4. Load collection
    +client.load_collection(collection_name=COLLECTION_NAME, replica_number=1)
    +
    +

    Dataset

    Dengan Milvus aktif dan berjalan, kita dapat mulai mengambil data kita. Hugging Face Datasets adalah hub yang menampung banyak dataset pengguna yang berbeda, dan untuk contoh ini kita menggunakan dataset netflix-shows milik HuggingLearners. Dataset ini berisi film dan pasangan metadatanya untuk lebih dari 8 ribu film. Kita akan menyematkan setiap deskripsi dan menyimpannya di dalam Milvus bersama dengan judul, jenis, tahun rilis, dan peringkatnya.

    +
    from datasets import load_dataset
    +
    +dataset = load_dataset("hugginglearners/netflix-shows", split="train")
    +
    +

    Memasukkan Data

    Sekarang kita sudah memiliki data di mesin kita, kita bisa mulai menyematkannya dan memasukkannya ke dalam Milvus. Fungsi penyematan mengambil teks dan mengembalikan penyematan dalam format daftar.

    +
    def emb_texts(texts):
    +    res = openai_client.embeddings.create(input=texts, model="text-embedding-3-small")
    +    return [res_data.embedding for res_data in res.data]
    +
    +

    Langkah selanjutnya adalah melakukan penyisipan yang sebenarnya. Kita mengulang semua entri dan membuat batch yang kita sisipkan setelah kita mencapai ukuran batch yang kita tetapkan. Setelah perulangan selesai, kita menyisipkan batch remaning terakhir jika ada.

    +
    from tqdm import tqdm
    +
    +# batch (data to be inserted) is a list of dictionaries
    +batch = []
    +
    +# Embed and insert in batches
    +for i in tqdm(range(0, len(dataset))):
    +    batch.append(
    +        {
    +            "title": dataset[i]["title"] or "",
    +            "type": dataset[i]["type"] or "",
    +            "release_year": dataset[i]["release_year"] or -1,
    +            "rating": dataset[i]["rating"] or "",
    +            "description": dataset[i]["description"] or "",
    +        }
    +    )
    +
    +    if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:
    +        embeddings = emb_texts([item["description"] for item in batch])
    +
    +        for item, emb in zip(batch, embeddings):
    +            item["embedding"] = emb
    +
    +        client.insert(collection_name=COLLECTION_NAME, data=batch)
    +        batch = []
    +
    +

    Menanyakan Basis Data

    Dengan data yang telah dimasukkan ke dalam Milvus, kita sekarang dapat melakukan query. Kueri ini mengambil tuple dari deskripsi film yang Anda cari dan filter yang akan digunakan. Info lebih lanjut tentang filter dapat ditemukan di sini. Pencarian pertama-tama mencetak deskripsi dan ekspresi filter Anda. Setelah itu untuk setiap hasil, kami mencetak skor, judul, jenis, tahun rilis, peringkat dan deskripsi film hasil pencarian.

    +
    import textwrap
    +
    +
    +def query(query, top_k=5):
    +    text, expr = query
    +
    +    res = client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=emb_texts(text),
    +        filter=expr,
    +        limit=top_k,
    +        output_fields=["title", "type", "release_year", "rating", "description"],
    +        search_params={
    +            "metric_type": "IP",
    +            "params": {},
    +        },
    +    )
    +
    +    print("Description:", text, "Expression:", expr)
    +
    +    for hit_group in res:
    +        print("Results:")
    +        for rank, hit in enumerate(hit_group, start=1):
    +            entity = hit["entity"]
    +
    +            print(
    +                f"\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}"
    +            )
    +            print(
    +                f"\t\tType: {entity.get('type', '')} "
    +                f"Release Year: {entity.get('release_year', '')} "
    +                f"Rating: {entity.get('rating', '')}"
    +            )
    +            description = entity.get("description", "")
    +            print(textwrap.fill(description, width=88))
    +            print()
    +
    +
    +my_query = ("movie about a fluffly animal", 'release_year < 2019 and rating like "PG%"')
    +
    +query(my_query)
    +
    +
    Description: movie about a fluffly animal Expression: release_year < 2019 and rating like "PG%"
    +Results:
    +    Rank: 1 Score: 0.42213767766952515 Title: The Adventures of Tintin
    +        Type: Movie Release Year: 2011 Rating: PG
    +This 3-D motion capture adapts Georges Remi's classic comic strip about the adventures
    +of fearless young journalist Tintin and his trusty dog, Snowy.
    +
    +    Rank: 2 Score: 0.4041026830673218 Title: Hedgehogs
    +        Type: Movie Release Year: 2016 Rating: PG
    +When a hedgehog suffering from memory loss forgets his identity, he ends up on a big
    +city journey with a pigeon to save his habitat from a human threat.
    +
    +    Rank: 3 Score: 0.3980264663696289 Title: Osmosis Jones
    +        Type: Movie Release Year: 2001 Rating: PG
    +Peter and Bobby Farrelly outdo themselves with this partially animated tale about an
    +out-of-shape 40-year-old man who's the host to various organisms.
    +
    +    Rank: 4 Score: 0.39479154348373413 Title: The Lamb
    +        Type: Movie Release Year: 2017 Rating: PG
    +A big-dreaming donkey escapes his menial existence and befriends some free-spirited
    +animal pals in this imaginative retelling of the Nativity Story.
    +
    +    Rank: 5 Score: 0.39370301365852356 Title: Open Season 2
    +        Type: Movie Release Year: 2008 Rating: PG
    +Elliot the buck and his forest-dwelling cohorts must rescue their dachshund pal from
    +some spoiled pets bent on returning him to domesticity.
    +
    diff --git a/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.json b/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.json new file mode 100644 index 000000000..841197e02 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm\n","$ git clone https://github.com/FlagOpen/FlagEmbedding.git\n$ pip install -e FlagEmbedding\n","$ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz\n$ tar -xzf amazon_reviews_2023_subset.tar.gz\n","$ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth\n","import torch\nfrom FlagEmbedding.visual.modeling import Visualized_BGE\n\n\nclass Encoder:\n def __init__(self, model_name: str, model_path: str):\n self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)\n self.model.eval()\n\n def encode_query(self, image_path: str, text: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path, text=text)\n return query_emb.tolist()[0]\n\n def encode_image(self, image_path: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path)\n return query_emb.tolist()[0]\n\n\nmodel_name = \"BAAI/bge-base-en-v1.5\"\nmodel_path = \"./Visualized_base_en_v1.5.pth\" # Change to your own value if using a different model path\nencoder = Encoder(model_name, model_path)\n","import os\nfrom tqdm import tqdm\nfrom glob import glob\n\n\n# Generate embeddings for the image dataset\ndata_dir = (\n \"./images_folder\" # Change to your own value if using a different data directory\n)\nimage_list = glob(\n os.path.join(data_dir, \"images\", \"*.jpg\")\n) # We will only use images ending with \".jpg\"\nimage_dict = {}\nfor image_path in tqdm(image_list, desc=\"Generating image embeddings: \"):\n try:\n image_dict[image_path] = encoder.encode_image(image_path)\n except Exception as e:\n print(f\"Failed to generate embedding for {image_path}. Skipped.\")\n continue\nprint(\"Number of encoded images:\", len(image_dict))\n","from pymilvus import MilvusClient\n\n\ndim = len(list(image_dict.values())[0])\ncollection_name = \"multimodal_rag_demo\"\n\n# Connect to Milvus client given URI\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\n# Create Milvus Collection\n# By default, vector field name is \"vector\"\nmilvus_client.create_collection(\n collection_name=collection_name,\n auto_id=True,\n dimension=dim,\n enable_dynamic_field=True,\n)\n\n# Insert data into collection\nmilvus_client.insert(\n collection_name=collection_name,\n data=[{\"image_path\": k, \"vector\": v} for k, v in image_dict.items()],\n)\n","query_image = os.path.join(\n data_dir, \"leopard.jpg\"\n) # Change to your own query image path\nquery_text = \"phone case with this image theme\"\n\n# Generate query embedding given image and text instructions\nquery_vec = encoder.encode_query(image_path=query_image, text=query_text)\n\nsearch_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vec],\n output_fields=[\"image_path\"],\n limit=9, # Max number of search results to return\n search_params={\"metric_type\": \"COSINE\", \"params\": {}}, # Search parameters\n)[0]\n\nretrieved_images = [hit.get(\"entity\").get(\"image_path\") for hit in search_results]\nprint(retrieved_images)\n","import numpy as np\nimport cv2\n\nimg_height = 300\nimg_width = 300\nrow_count = 3\n\n\ndef create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:\n \"\"\"\n creates a 5x5 panoramic view image from a list of images\n\n args:\n images: list of images to be combined\n\n returns:\n np.ndarray: the panoramic view image\n \"\"\"\n panoramic_width = img_width * row_count\n panoramic_height = img_height * row_count\n panoramic_image = np.full(\n (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8\n )\n\n # create and resize the query image with a blue border\n query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)\n query_image = Image.open(query_image_path).convert(\"RGB\")\n query_array = np.array(query_image)[:, :, ::-1]\n resized_image = cv2.resize(query_array, (img_width, img_height))\n\n border_size = 10\n blue = (255, 0, 0) # blue color in BGR\n bordered_query_image = cv2.copyMakeBorder(\n resized_image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=blue,\n )\n\n query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(\n bordered_query_image, (img_width, img_height)\n )\n\n # add text \"query\" below the query image\n text = \"query\"\n font_scale = 1\n font_thickness = 2\n text_org = (10, img_height * 3 + 30)\n cv2.putText(\n query_image_null,\n text,\n text_org,\n cv2.FONT_HERSHEY_SIMPLEX,\n font_scale,\n blue,\n font_thickness,\n cv2.LINE_AA,\n )\n\n # combine the rest of the images into the panoramic view\n retrieved_imgs = [\n np.array(Image.open(img).convert(\"RGB\"))[:, :, ::-1] for img in retrieved_images\n ]\n for i, image in enumerate(retrieved_imgs):\n image = cv2.resize(image, (img_width - 4, img_height - 4))\n row = i // row_count\n col = i % row_count\n start_row = row * img_height\n start_col = col * img_width\n\n border_size = 2\n bordered_image = cv2.copyMakeBorder(\n image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=(0, 0, 0),\n )\n panoramic_image[\n start_row : start_row + img_height, start_col : start_col + img_width\n ] = bordered_image\n\n # add red index numbers to each image\n text = str(i)\n org = (start_col + 50, start_row + 30)\n (font_width, font_height), baseline = cv2.getTextSize(\n text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2\n )\n\n top_left = (org[0] - 48, start_row + 2)\n bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)\n\n cv2.rectangle(\n panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED\n )\n cv2.putText(\n panoramic_image,\n text,\n (start_col + 10, start_row + 30),\n cv2.FONT_HERSHEY_SIMPLEX,\n 1,\n (0, 0, 255),\n 2,\n cv2.LINE_AA,\n )\n\n # combine the query image with the panoramic view\n panoramic_image = np.hstack([query_image_null, panoramic_image])\n return panoramic_image\n","from PIL import Image\n\ncombined_image_path = os.path.join(data_dir, \"combined_image.jpg\")\npanoramic_image = create_panoramic_view(query_image, retrieved_images)\ncv2.imwrite(combined_image_path, panoramic_image)\n\ncombined_image = Image.open(combined_image_path)\nshow_combined_image = combined_image.resize((300, 300))\nshow_combined_image.show()\n","import requests\nimport base64\n\nopenai_api_key = \"sk-***\" # Change to your OpenAI API Key\n\n\ndef generate_ranking_explanation(\n combined_image_path: str, caption: str, infos: dict = None\n) -> tuple[list[int], str]:\n with open(combined_image_path, \"rb\") as image_file:\n base64_image = base64.b64encode(image_file.read()).decode(\"utf-8\")\n\n information = (\n \"You are responsible for ranking results for a Composed Image Retrieval. \"\n \"The user retrieves an image with an 'instruction' indicating their retrieval intent. \"\n \"For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. \"\n \"Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. \"\n f\"User instruction: {caption} \\n\\n\"\n )\n\n # add additional information for each image\n if infos:\n for i, info in enumerate(infos[\"product\"]):\n information += f\"{i}. {info}\\n\"\n\n information += (\n \"Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. \"\n \"The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent.\"\n )\n\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\",\n }\n\n payload = {\n \"model\": \"gpt-4o\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": information},\n {\n \"type\": \"image_url\",\n \"image_url\": {\"url\": f\"data:image/jpeg;base64,{base64_image}\"},\n },\n ],\n }\n ],\n \"max_tokens\": 300,\n }\n\n response = requests.post(\n \"https://api.openai.com/v1/chat/completions\", headers=headers, json=payload\n )\n result = response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n # parse the ranked indices from the response\n start_idx = result.find(\"[\")\n end_idx = result.find(\"]\")\n ranked_indices_str = result[start_idx + 1 : end_idx].split(\",\")\n ranked_indices = [int(index.strip()) for index in ranked_indices_str]\n\n # extract explanation\n explanation = result[end_idx + 1 :].strip()\n\n return ranked_indices, explanation\n","ranked_indices, explanation = generate_ranking_explanation(\n combined_image_path, query_text\n)\n","print(explanation)\n\nbest_index = ranked_indices[0]\nbest_img = Image.open(retrieved_images[best_index])\nbest_img = best_img.resize((150, 150))\nbest_img.show()\n"],"headingContent":"Multimodal RAG with Milvus","anchorList":[{"label":"RAG multimodal dengan Milvus","href":"Multimodal-RAG-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Muat Data","href":"Load-Data","type":2,"isActive":false},{"label":"Pencarian Multimodal dengan Perangking Generatif","href":"Multimodal-Search-with-Generative-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.md b/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.md new file mode 100644 index 000000000..817d91db8 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/multimodal_rag_with_milvus.md @@ -0,0 +1,424 @@ +--- +id: multimodal_rag_with_milvus.md +summary: RAG multimodal dengan Milvus +title: RAG multimodal dengan Milvus +--- +

    RAG multimodal dengan Milvus

    Open In Colab +GitHub Repository

    +

    +

    Tutorial ini menampilkan RAG multimodal yang didukung oleh Milvus, model BGE yang divisualisasikan, dan GPT-4o. Dengan sistem ini, pengguna dapat mengunggah gambar dan mengedit instruksi teks, yang diproses oleh model pengambilan yang disusun oleh BGE untuk mencari gambar kandidat. GPT-4o kemudian bertindak sebagai pemeringkat, memilih gambar yang paling sesuai dan memberikan alasan di balik pilihan tersebut. Kombinasi yang kuat ini memungkinkan pengalaman pencarian gambar yang mulus dan intuitif, memanfaatkan Milvus untuk pengambilan yang efisien, model BGE untuk pemrosesan dan pencocokan gambar yang tepat, dan GPT-4o untuk pemeringkatan ulang tingkat lanjut.

    +

    Persiapan

    Instal Ketergantungan

    $ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm
    +
    +
    $ git clone https://github.com/FlagOpen/FlagEmbedding.git
    +$ pip install -e FlagEmbedding
    +
    +
    +

    Jika Anda menggunakan Google Colab, untuk mengaktifkan dependensi yang baru saja diinstal, Anda mungkin perlu memulai ulang runtime (klik menu "Runtime" di bagian atas layar, dan pilih "Restart session" dari menu tarik-turun).

    +
    +

    Unduh Data

    Perintah berikut ini akan mengunduh data contoh dan mengekstrak ke folder lokal "./images_folder", termasuk:

    +
      +
    • images: Bagian dari Amazon Reviews 2023 yang berisi sekitar 900 gambar dari kategori "Alat", "Ponsel dan Aksesori", dan "Elektronik".

    • +
    • macantutul.jpg: Contoh gambar kueri.

    • +
    +
    $ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz
    +$ tar -xzf amazon_reviews_2023_subset.tar.gz
    +
    +

    Model Penyematan Muatan

    Kami akan menggunakan model BGE yang divisualisasikan "bge-visualized-base-en-v1.5" untuk menghasilkan sematan baik untuk gambar maupun teks.

    +

    1. Berat unduhan

    +
    $ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth
    +
    +

    2. Bangun pembuat enkode

    +
    import torch
    +from FlagEmbedding.visual.modeling import Visualized_BGE
    +
    +
    +class Encoder:
    +    def __init__(self, model_name: str, model_path: str):
    +        self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)
    +        self.model.eval()
    +
    +    def encode_query(self, image_path: str, text: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path, text=text)
    +        return query_emb.tolist()[0]
    +
    +    def encode_image(self, image_path: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path)
    +        return query_emb.tolist()[0]
    +
    +
    +model_name = "BAAI/bge-base-en-v1.5"
    +model_path = "./Visualized_base_en_v1.5.pth"  # Change to your own value if using a different model path
    +encoder = Encoder(model_name, model_path)
    +
    +

    Muat Data

    Bagian ini akan memuat gambar contoh ke dalam database dengan embedding yang sesuai.

    +

    Menghasilkan embeddings

    Muat semua gambar jpeg dari direktori data dan terapkan penyandi untuk mengonversi gambar menjadi embedding.

    +
    import os
    +from tqdm import tqdm
    +from glob import glob
    +
    +
    +# Generate embeddings for the image dataset
    +data_dir = (
    +    "./images_folder"  # Change to your own value if using a different data directory
    +)
    +image_list = glob(
    +    os.path.join(data_dir, "images", "*.jpg")
    +)  # We will only use images ending with ".jpg"
    +image_dict = {}
    +for image_path in tqdm(image_list, desc="Generating image embeddings: "):
    +    try:
    +        image_dict[image_path] = encoder.encode_image(image_path)
    +    except Exception as e:
    +        print(f"Failed to generate embedding for {image_path}. Skipped.")
    +        continue
    +print("Number of encoded images:", len(image_dict))
    +
    +
    Generating image embeddings: 100%|██████████| 900/900 [00:20<00:00, 44.08it/s]
    +
    +Number of encoded images: 900
    +
    +

    Masukkan ke dalam Milvus

    Sisipkan gambar dengan jalur dan sematan yang sesuai ke dalam koleksi Milvus.

    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya ./milvus_demo.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +
    from pymilvus import MilvusClient
    +
    +
    +dim = len(list(image_dict.values())[0])
    +collection_name = "multimodal_rag_demo"
    +
    +# Connect to Milvus client given URI
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +# Create Milvus Collection
    +# By default, vector field name is "vector"
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    auto_id=True,
    +    dimension=dim,
    +    enable_dynamic_field=True,
    +)
    +
    +# Insert data into collection
    +milvus_client.insert(
    +    collection_name=collection_name,
    +    data=[{"image_path": k, "vector": v} for k, v in image_dict.items()],
    +)
    +
    +
    {'insert_count': 900,
    + 'ids': [451537887696781312, 451537887696781313, ..., 451537887696782211],
    + 'cost': 0}
    +
    +

    Pencarian Multimodal dengan Perangking Generatif

    Pada bagian ini, pertama-tama kita akan mencari gambar yang relevan dengan kueri multimodal dan kemudian menggunakan layanan LLM untuk memberi peringkat ulang hasil dan menemukan yang terbaik dengan penjelasan.

    +

    Sekarang kita siap untuk melakukan pencarian gambar lanjutan dengan data kueri yang terdiri dari gambar dan instruksi teks.

    +
    query_image = os.path.join(
    +    data_dir, "leopard.jpg"
    +)  # Change to your own query image path
    +query_text = "phone case with this image theme"
    +
    +# Generate query embedding given image and text instructions
    +query_vec = encoder.encode_query(image_path=query_image, text=query_text)
    +
    +search_results = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[query_vec],
    +    output_fields=["image_path"],
    +    limit=9,  # Max number of search results to return
    +    search_params={"metric_type": "COSINE", "params": {}},  # Search parameters
    +)[0]
    +
    +retrieved_images = [hit.get("entity").get("image_path") for hit in search_results]
    +print(retrieved_images)
    +
    +
    ['./images_folder/images/518Gj1WQ-RL._AC_.jpg', './images_folder/images/41n00AOfWhL._AC_.jpg', './images_folder/images/51Wqge9HySL._AC_.jpg', './images_folder/images/51R2SZiywnL._AC_.jpg', './images_folder/images/516PebbMAcL._AC_.jpg', './images_folder/images/51RrgfYKUfL._AC_.jpg', './images_folder/images/515DzQVKKwL._AC_.jpg', './images_folder/images/51BsgVw6RhL._AC_.jpg', './images_folder/images/51INtcXu9FL._AC_.jpg']
    +
    +

    Beri peringkat ulang dengan GPT-4o

    Kami akan menggunakan LLM untuk mengurutkan gambar dan menghasilkan penjelasan untuk hasil terbaik berdasarkan kueri pengguna dan hasil yang diambil.

    +

    1. Buat tampilan panorama

    +
    import numpy as np
    +import cv2
    +
    +img_height = 300
    +img_width = 300
    +row_count = 3
    +
    +
    +def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:
    +    """
    +    creates a 5x5 panoramic view image from a list of images
    +
    +    args:
    +        images: list of images to be combined
    +
    +    returns:
    +        np.ndarray: the panoramic view image
    +    """
    +    panoramic_width = img_width * row_count
    +    panoramic_height = img_height * row_count
    +    panoramic_image = np.full(
    +        (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8
    +    )
    +
    +    # create and resize the query image with a blue border
    +    query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)
    +    query_image = Image.open(query_image_path).convert("RGB")
    +    query_array = np.array(query_image)[:, :, ::-1]
    +    resized_image = cv2.resize(query_array, (img_width, img_height))
    +
    +    border_size = 10
    +    blue = (255, 0, 0)  # blue color in BGR
    +    bordered_query_image = cv2.copyMakeBorder(
    +        resized_image,
    +        border_size,
    +        border_size,
    +        border_size,
    +        border_size,
    +        cv2.BORDER_CONSTANT,
    +        value=blue,
    +    )
    +
    +    query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(
    +        bordered_query_image, (img_width, img_height)
    +    )
    +
    +    # add text "query" below the query image
    +    text = "query"
    +    font_scale = 1
    +    font_thickness = 2
    +    text_org = (10, img_height * 3 + 30)
    +    cv2.putText(
    +        query_image_null,
    +        text,
    +        text_org,
    +        cv2.FONT_HERSHEY_SIMPLEX,
    +        font_scale,
    +        blue,
    +        font_thickness,
    +        cv2.LINE_AA,
    +    )
    +
    +    # combine the rest of the images into the panoramic view
    +    retrieved_imgs = [
    +        np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images
    +    ]
    +    for i, image in enumerate(retrieved_imgs):
    +        image = cv2.resize(image, (img_width - 4, img_height - 4))
    +        row = i // row_count
    +        col = i % row_count
    +        start_row = row * img_height
    +        start_col = col * img_width
    +
    +        border_size = 2
    +        bordered_image = cv2.copyMakeBorder(
    +            image,
    +            border_size,
    +            border_size,
    +            border_size,
    +            border_size,
    +            cv2.BORDER_CONSTANT,
    +            value=(0, 0, 0),
    +        )
    +        panoramic_image[
    +            start_row : start_row + img_height, start_col : start_col + img_width
    +        ] = bordered_image
    +
    +        # add red index numbers to each image
    +        text = str(i)
    +        org = (start_col + 50, start_row + 30)
    +        (font_width, font_height), baseline = cv2.getTextSize(
    +            text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2
    +        )
    +
    +        top_left = (org[0] - 48, start_row + 2)
    +        bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)
    +
    +        cv2.rectangle(
    +            panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED
    +        )
    +        cv2.putText(
    +            panoramic_image,
    +            text,
    +            (start_col + 10, start_row + 30),
    +            cv2.FONT_HERSHEY_SIMPLEX,
    +            1,
    +            (0, 0, 255),
    +            2,
    +            cv2.LINE_AA,
    +        )
    +
    +    # combine the query image with the panoramic view
    +    panoramic_image = np.hstack([query_image_null, panoramic_image])
    +    return panoramic_image
    +
    +

    Gabungkan gambar kueri dan gambar yang diambil dengan indeks dalam tampilan panorama.

    +
    from PIL import Image
    +
    +combined_image_path = os.path.join(data_dir, "combined_image.jpg")
    +panoramic_image = create_panoramic_view(query_image, retrieved_images)
    +cv2.imwrite(combined_image_path, panoramic_image)
    +
    +combined_image = Image.open(combined_image_path)
    +show_combined_image = combined_image.resize((300, 300))
    +show_combined_image.show()
    +
    +

    + + Create a panoramic view + Membuat tampilan panorama

    +

    2. Beri peringkat ulang dan jelaskan

    +

    Kami akan mengirimkan gambar gabungan ke layanan LLM multimodal bersama dengan petunjuk yang tepat untuk memberi peringkat hasil yang diambil dengan penjelasan. Untuk mengaktifkan GPT-4o sebagai LLM, Anda harus menyiapkan OpenAI API Key.

    +
    import requests
    +import base64
    +
    +openai_api_key = "sk-***"  # Change to your OpenAI API Key
    +
    +
    +def generate_ranking_explanation(
    +    combined_image_path: str, caption: str, infos: dict = None
    +) -> tuple[list[int], str]:
    +    with open(combined_image_path, "rb") as image_file:
    +        base64_image = base64.b64encode(image_file.read()).decode("utf-8")
    +
    +    information = (
    +        "You are responsible for ranking results for a Composed Image Retrieval. "
    +        "The user retrieves an image with an 'instruction' indicating their retrieval intent. "
    +        "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. "
    +        "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. "
    +        f"User instruction: {caption} \n\n"
    +    )
    +
    +    # add additional information for each image
    +    if infos:
    +        for i, info in enumerate(infos["product"]):
    +            information += f"{i}. {info}\n"
    +
    +    information += (
    +        "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. "
    +        "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent."
    +    )
    +
    +    headers = {
    +        "Content-Type": "application/json",
    +        "Authorization": f"Bearer {openai_api_key}",
    +    }
    +
    +    payload = {
    +        "model": "gpt-4o",
    +        "messages": [
    +            {
    +                "role": "user",
    +                "content": [
    +                    {"type": "text", "text": information},
    +                    {
    +                        "type": "image_url",
    +                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
    +                    },
    +                ],
    +            }
    +        ],
    +        "max_tokens": 300,
    +    }
    +
    +    response = requests.post(
    +        "https://api.openai.com/v1/chat/completions", headers=headers, json=payload
    +    )
    +    result = response.json()["choices"][0]["message"]["content"]
    +
    +    # parse the ranked indices from the response
    +    start_idx = result.find("[")
    +    end_idx = result.find("]")
    +    ranked_indices_str = result[start_idx + 1 : end_idx].split(",")
    +    ranked_indices = [int(index.strip()) for index in ranked_indices_str]
    +
    +    # extract explanation
    +    explanation = result[end_idx + 1 :].strip()
    +
    +    return ranked_indices, explanation
    +
    +

    Dapatkan indeks gambar setelah pemeringkatan dan alasan hasil terbaik:

    +
    ranked_indices, explanation = generate_ranking_explanation(
    +    combined_image_path, query_text
    +)
    +
    +

    3. Tampilkan hasil terbaik dengan penjelasan

    +
    print(explanation)
    +
    +best_index = ranked_indices[0]
    +best_img = Image.open(retrieved_images[best_index])
    +best_img = best_img.resize((150, 150))
    +best_img.show()
    +
    +
    Reasons: The most suitable item for the user's query intent is index 6 because the instruction specifies a phone case with the theme of the image, which is a leopard. The phone case with index 6 has a thematic design resembling the leopard pattern, making it the closest match to the user's request for a phone case with the image theme.
    +
    +

    + + The best result + Hasil terbaik

    +

    Penerapan Cepat

    Untuk mempelajari tentang cara memulai demo online dengan tutorial ini, silakan lihat contoh aplikasi.

    diff --git a/localization/v2.5.x/site/id/tutorials/question_answering_system.json b/localization/v2.5.x/site/id/tutorials/question_answering_system.json new file mode 100644 index 000000000..6280532a5 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/question_answering_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Question Answering System","anchorList":[{"label":"Sistem Penjawab Pertanyaan","href":"Question-Answering-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/question_answering_system.md b/localization/v2.5.x/site/id/tutorials/question_answering_system.md new file mode 100644 index 000000000..faddaada9 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/question_answering_system.md @@ -0,0 +1,44 @@ +--- +id: question_answering_system.md +summary: Bangun sistem penjawab pertanyaan dengan Milvus. +title: Sistem Penjawab Pertanyaan +--- +

    Sistem Penjawab Pertanyaan

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun sebuah sistem penjawab pertanyaan (QA).

    + +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    + +


    +

    Sistem penjawab pertanyaan adalah aplikasi dunia nyata umum yang termasuk dalam bidang pemrosesan bahasa alami. Sistem QA yang umum mencakup sistem layanan pelanggan online, chatbot QA, dan banyak lagi. Sebagian besar sistem penjawab pertanyaan dapat diklasifikasikan sebagai: sistem penjawab pertanyaan generatif atau pengambilan, satu putaran atau multi-putaran, domain terbuka atau sistem penjawab pertanyaan spesifik.

    +


    +

    Dalam tutorial ini, Anda akan belajar cara membuat sistem QA yang dapat menghubungkan pertanyaan pengguna baru dengan jawaban besar yang sebelumnya disimpan dalam database vektor. Untuk membuat chatbot seperti itu, siapkan kumpulan data pertanyaan dan jawaban yang sesuai. Simpan pertanyaan dan jawaban di MySQL, sebuah database relasional. Kemudian gunakan BERT, model machine learning (ML) untuk pemrosesan bahasa alami (NLP) untuk mengubah pertanyaan menjadi vektor. Vektor pertanyaan ini disimpan dan diindeks dalam Milvus. Ketika pengguna memasukkan pertanyaan baru, pertanyaan tersebut diubah menjadi vektor dengan model BERT juga, dan Milvus mencari vektor pertanyaan yang paling mirip dengan vektor baru ini. Sistem QA mengembalikan jawaban yang sesuai untuk pertanyaan yang paling mirip.

    +


    +

    + + QA_Chatbot + QA_Chatbot

    +

    + + QA_chatbot_demo + QA_chatbot_demo

    diff --git a/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.json b/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.json new file mode 100644 index 000000000..07f0af3fd --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.json @@ -0,0 +1 @@ +{"codeList":["attu.app is damaged and cannot be opened.\n","sudo xattr -rd com.apple.quarantine /Applications/attu.app\n","wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\nunzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n text_lines += file_text.split(\"# \")\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n\n# Generate test embedding\ntest_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","768\n[-0.04836066 0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448\n -0.03041712 -0.02269499 -0.02317863 -0.00426028]\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Standalone\nclient = MilvusClient(uri=\"http://localhost:19530\")\n\ncollection_name = \"attu_tutorial\"\n\n# Drop collection if it exists\nif client.has_collection(collection_name):\n client.drop_collection(collection_name)\n\n# Create a new collection\nclient.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\"\n)\n","from tqdm import tqdm\n\ndata = []\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nclient.insert(collection_name=collection_name, data=data)\n"],"headingContent":"Quick Start with Attu Desktop","anchorList":[{"label":"Memulai Cepat dengan Attu Desktop","href":"Quick-Start-with-Attu-Desktop","type":1,"isActive":false},{"label":"1. Pendahuluan","href":"1-Introduction","type":2,"isActive":false},{"label":"2. Instal Aplikasi Desktop","href":"2-Install-Desktop-Application","type":2,"isActive":false},{"label":"3. Menghubungkan ke Milvus","href":"3-Connect-to-Milvus","type":2,"isActive":false},{"label":"4. Menyiapkan Data, Membuat Koleksi, dan Menyisipkan Data","href":"4-Prepare-Data-Create-Collection-and-Insert-Data","type":2,"isActive":false},{"label":"5. Memvisualisasikan Hasil Pencarian dan Hubungan","href":"5-Visualizing-Search-Results-and-Relationships","type":2,"isActive":false},{"label":"6. Kesimpulan","href":"6-Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.md b/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.md new file mode 100644 index 000000000..a8667dce7 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/quickstart_with_attu.md @@ -0,0 +1,242 @@ +--- +id: quickstart_with_attu.md +summary: >- + Attu adalah alat administrasi sumber terbuka yang lengkap untuk Milvus. Attu + memiliki antarmuka pengguna grafis (GUI) yang intuitif, memungkinkan Anda + untuk berinteraksi dengan database Anda dengan mudah. Hanya dengan beberapa + klik, Anda bisa memvisualisasikan status cluster Anda, mengelola metadata, + melakukan kueri data, dan banyak lagi. +title: Sistem Penjawab Pertanyaan +--- +

    Memulai Cepat dengan Attu Desktop

    1. Pendahuluan

    Attu adalah alat administrasi sumber terbuka yang lengkap untuk Milvus. Attu memiliki antarmuka pengguna grafis (GUI) yang intuitif, memungkinkan Anda untuk berinteraksi dengan database Anda dengan mudah. Hanya dengan beberapa klik, Anda dapat memvisualisasikan status cluster Anda, mengelola metadata, melakukan kueri data, dan banyak lagi.

    +
    +

    2. Instal Aplikasi Desktop

    Unduh versi desktop Attu dengan mengunjungi halaman Attu GitHub Releases. Pilih versi yang sesuai untuk sistem operasi Anda dan ikuti langkah-langkah instalasi.

    +

    Catatan untuk macOS (chip seri M):

    Jika Anda mengalami kesalahan:

    +
    attu.app is damaged and cannot be opened.
    +
    +

    Jalankan perintah berikut di terminal untuk mengatasi masalah ini:

    +
    sudo xattr -rd com.apple.quarantine /Applications/attu.app
    +
    +
    +

    3. Menghubungkan ke Milvus

    Attu mendukung koneksi ke Milvus Standalone dan Zilliz Cloud, memberikan fleksibilitas untuk bekerja dengan basis data lokal atau yang di-host di cloud.

    +

    Untuk menggunakan Milvus Standalone secara lokal:

    +
      +
    1. Mulai Milvus Standalone dengan mengikuti panduan instalasi Milvus.
    2. +
    3. Buka Attu dan masukkan informasi koneksi:
        +
      • Alamat Milvus: URI server Milvus Standalone Anda, contoh: http://localhost:19530
      • +
      • Pengaturan opsional lainnya: Anda dapat mengaturnya sesuai dengan konfigurasi Milvus Anda atau membiarkannya sebagai default.
      • +
    4. +
    5. Klik Hubungkan untuk mengakses database Anda.
    6. +
    +
    +

    Anda juga dapat menghubungkan Milvus yang telah dikelola secara penuh di Zilliz Cloud. Cukup atur Milvus Address dan token ke Public Endpoint dan API key dari instance Zilliz Cloud Anda.

    +
    +
      +
    1. Klik untuk mengakses database Anda.
    2. +
    +

    + Attu Login Page +

    +
    +

    4. Menyiapkan Data, Membuat Koleksi, dan Menyisipkan Data

    4.1 Menyiapkan Data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai kumpulan data untuk contoh ini.

    +

    Unduh dan Ekstrak Data:

    wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Memproses File Penurunan Harga:

    from glob import glob
    +
    +text_lines = []
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +    text_lines += file_text.split("# ")
    +
    +
    +

    4.2 Hasilkan Penyematan

    Tentukan model penyematan untuk menghasilkan penyematan teks menggunakan milvus_model. Kami menggunakan model DefaultEmbeddingFunction sebagai contoh, yang merupakan model penyematan yang sudah terlatih dan ringan.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +# Generate test embedding
    +test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +

    Keluaran:

    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +
    +

    4.3 Membuat Koleksi

    Hubungkan ke Milvus dan buat koleksi:

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Standalone
    +client = MilvusClient(uri="http://localhost:19530")
    +
    +collection_name = "attu_tutorial"
    +
    +# Drop collection if it exists
    +if client.has_collection(collection_name):
    +    client.drop_collection(collection_name)
    +
    +# Create a new collection
    +client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong"
    +)
    +
    +
    +

    4.4 Menyisipkan Data

    Lakukan iterasi melalui baris teks, buat penyematan, dan masukkan data ke dalam Milvus:

    +
    from tqdm import tqdm
    +
    +data = []
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    4.5 Memvisualisasikan Data dan Skema

    Sekarang kita dapat memvisualisasikan skema data dan entitas yang disisipkan menggunakan antarmuka Attu. Skema menampilkan bidang yang telah ditentukan, termasuk bidang id dengan tipe Int64 dan bidang vector dengan tipe FloatVector(768) dengan metrik Inner Product (IP). Koleksi ini dimuat dengan 72 entitas.

    +

    Selain itu, kita dapat melihat data yang disisipkan, termasuk ID, penyematan vektor, dan bidang dinamis yang menyimpan metadata seperti konten teks. Antarmuka mendukung pemfilteran dan kueri berdasarkan kondisi yang ditentukan atau bidang dinamis.

    +

    + Schema View + Data View +

    +

    5. Memvisualisasikan Hasil Pencarian dan Hubungan

    Attu menyediakan antarmuka yang kuat untuk memvisualisasikan dan mengeksplorasi hubungan data. Untuk memeriksa titik data yang dimasukkan dan hubungan kemiripannya, ikuti langkah-langkah berikut:

    +

    Buka tab Pencarian Vektor di Attu.

    +
      +
    1. Klik tombol Generate Random Data untuk membuat kueri pengujian.
    2. +
    3. Klik Cari untuk mengambil hasil berdasarkan data yang dihasilkan.
    4. +
    +

    Hasilnya ditampilkan dalam sebuah tabel, yang menunjukkan ID, skor kemiripan, dan bidang dinamis untuk setiap entitas yang cocok.

    +

    + Search Results Table +

    +
    +

    5.2 Jelajahi Hubungan Data

    Klik tombol Jelajahi di panel hasil untuk memvisualisasikan hubungan antara vektor kueri dan hasil pencarian dalam struktur seperti grafik pengetahuan.

    +
      +
    • Simpul pusat mewakili vektor pencarian.
    • +
    • Node yang terhubung mewakili hasil pencarian, dengan mengekliknya akan menampilkan informasi rinci dari node yang bersangkutan.
    • +
    +

    + Knowledge Graph Visualization +

    +
    +

    5.3 Memperluas Grafik

    Klik dua kali pada simpul hasil mana pun untuk memperluas koneksinya. Tindakan ini akan memperlihatkan hubungan tambahan antara simpul yang dipilih dengan titik data lain dalam koleksi, sehingga menciptakan grafik pengetahuan yang lebih besar dan saling terhubung.

    +

    Tampilan yang diperluas ini memungkinkan eksplorasi yang lebih dalam tentang bagaimana titik-titik data terkait, berdasarkan kemiripan vektor.

    +

    + Expanded Knowledge Graph +

    +
    +

    6. Kesimpulan

    Attu menyederhanakan pengelolaan dan visualisasi data vektor yang disimpan di Milvus. Dari penyisipan data hingga eksekusi kueri dan eksplorasi interaktif, Attu menyediakan antarmuka yang intuitif untuk menangani tugas-tugas pencarian vektor yang kompleks. Dengan fitur-fitur seperti dukungan skema dinamis, visualisasi pencarian grafis, dan filter kueri yang fleksibel, Attu memberdayakan pengguna untuk menganalisis kumpulan data berskala besar secara efektif.

    +

    Dengan memanfaatkan alat eksplorasi visual Attu, pengguna dapat lebih memahami data mereka, mengidentifikasi hubungan yang tersembunyi, dan membuat keputusan berdasarkan data. Mulailah menjelajahi dataset Anda sendiri hari ini dengan Attu dan Milvus!

    +
    diff --git a/localization/v2.5.x/site/id/tutorials/recommendation_system.json b/localization/v2.5.x/site/id/tutorials/recommendation_system.json new file mode 100644 index 000000000..e1575c87f --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/recommendation_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Recommender System","anchorList":[{"label":"Sistem Rekomendasi","href":"Recommender-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/recommendation_system.md b/localization/v2.5.x/site/id/tutorials/recommendation_system.md new file mode 100644 index 000000000..fe38a6438 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/recommendation_system.md @@ -0,0 +1,36 @@ +--- +id: recommendation_system.md +summary: Bangun sistem rekomendasi yang dipersonalisasi dengan Milvus. +title: Sistem Rekomendasi +--- +

    Sistem Rekomendasi

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun sistem rekomendasi.

    +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    +
      +
    • PaddlePaddle
    • +
    • Redis atau MySQL
    • +
    • Towhee
    • +
    +


    +

    Sistem rekomendasi adalah bagian dari sistem penyaringan informasi, yang dapat digunakan dalam berbagai skenario termasuk rekomendasi film, musik, produk, dan feed stream yang dipersonalisasi. Tidak seperti mesin pencari, sistem rekomendasi tidak mengharuskan pengguna untuk mendeskripsikan kebutuhan mereka secara akurat, tetapi menemukan kebutuhan dan minat pengguna dengan menganalisis perilaku pengguna.

    +


    +

    Dalam tutorial ini, Anda akan belajar cara membuat sistem rekomendasi film yang dapat menyarankan film yang sesuai dengan minat pengguna. Untuk membangun sistem rekomendasi seperti itu, pertama-tama unduhlah dataset terkait film. Tutorial ini menggunakan MovieLens 1M. Sebagai alternatif, Anda dapat menyiapkan dataset Anda sendiri, yang harus menyertakan informasi seperti penilaian pengguna terhadap film, karakteristik demografis pengguna, dan deskripsi film. Gunakan PaddlePaddle untuk menggabungkan ID dan fitur pengguna dan mengonversinya menjadi vektor 256 dimensi. Ubah ID dan fitur film menjadi vektor dengan cara yang sama. Simpan vektor film di Milvus dan gunakan vektor pengguna untuk pencarian kemiripan. Jika vektor pengguna mirip dengan vektor film, Milvus akan mengembalikan vektor film dan ID-nya sebagai hasil rekomendasi. Kemudian melakukan kueri informasi film menggunakan ID vektor film yang disimpan di Redis atau MySQL.

    +


    +

    + + recommender_system + recommender_system

    diff --git a/localization/v2.5.x/site/id/tutorials/text_image_search.json b/localization/v2.5.x/site/id/tutorials/text_image_search.json new file mode 100644 index 000000000..16c7cebdb --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/text_image_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text to Image Search Engine","anchorList":[{"label":"Mesin Pencari Teks ke Gambar","href":"Text-to-Image-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/text_image_search.md b/localization/v2.5.x/site/id/tutorials/text_image_search.md new file mode 100644 index 000000000..bf06e63a7 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/text_image_search.md @@ -0,0 +1,39 @@ +--- +id: text_image_search.md +summary: Buat mesin pencari teks ke gambar dengan Milvus. +title: Mesin Pencari Teks ke Gambar +--- +

    Mesin Pencari Teks ke Gambar

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun mesin pencari teks ke gambar.

    +

    Anda dapat dengan cepat membuat mesin pencari teks-ke-gambar yang layak dengan mengikuti tutorial dasar. Atau, Anda juga dapat membaca tutorial mendalam yang mencakup segala hal mulai dari pemilihan model hingga penerapan layanan. Anda bisa membangun mesin pencari teks-ke-gambar yang lebih canggih yang sesuai dengan kebutuhan bisnis Anda sendiri dengan mengikuti instruksi dalam tutorial pendalaman.

    + +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    + +

    Saat ini, mesin pencari teks tradisional kehilangan pesonanya karena semakin banyak orang yang beralih ke TikTok sebagai mesin pencari favorit mereka. Selama pencarian teks tradisional, orang memasukkan kata kunci dan diperlihatkan semua teks yang mengandung kata kunci tersebut. Namun, orang-orang mengeluh bahwa mereka tidak selalu dapat menemukan apa yang mereka inginkan dalam pencarian seperti ini. Terlebih lagi, hasilnya tidak cukup intuitif. Orang-orang mengatakan bahwa mereka menemukan gambar dan video jauh lebih intuitif dan menyenangkan daripada harus merayapi barisan teks. Mesin pencari teks-ke-gambar lintas-modal muncul sebagai hasilnya. Dengan mesin pencari jenis baru ini, orang bisa menemukan gambar yang relevan dengan memasukkan sepotong teks dari beberapa kata kunci.

    +

    Dalam tutorial ini, Anda akan belajar cara membuat mesin pencari teks-ke-gambar. Tutorial ini menggunakan model CLIP untuk mengekstrak fitur gambar dan mengubahnya menjadi vektor. Kemudian vektor gambar ini disimpan dalam basis data vektor Milvus. Ketika pengguna memasukkan teks kueri, teks-teks ini juga dikonversi menjadi vektor penyisipan menggunakan model ML CLIP yang sama. Selanjutnya, pencarian kemiripan vektor dilakukan di Milvus untuk mengambil vektor gambar yang paling mirip dengan vektor teks masukan.

    +

    + + Text_image_search + Pencarian teks_gambar

    diff --git a/localization/v2.5.x/site/id/tutorials/text_search_engine.json b/localization/v2.5.x/site/id/tutorials/text_search_engine.json new file mode 100644 index 000000000..695ce7ca9 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/text_search_engine.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text Search Engine","anchorList":[{"label":"Mesin Pencari Teks","href":"Text-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/text_search_engine.md b/localization/v2.5.x/site/id/tutorials/text_search_engine.md new file mode 100644 index 000000000..1ebfdfb05 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/text_search_engine.md @@ -0,0 +1,39 @@ +--- +id: text_search_engine.md +summary: Buat mesin pencari teks dengan Milvus. +title: Mesin Pencari Teks +--- +

    Mesin Pencari Teks

    Dalam tutorial ini, Anda akan mempelajari cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun mesin pencari teks.

    + +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    + +


    +

    Salah satu aplikasi utama Milvus dalam bidang pemrosesan bahasa alami (NLP) adalah mesin pencari teks. Ini adalah alat yang hebat yang dapat membantu pengguna menemukan informasi yang mereka cari. Bahkan dapat memunculkan informasi yang sulit ditemukan. Mesin pencari teks membandingkan kata kunci atau semantik yang dimasukkan pengguna dengan database teks, dan kemudian mengembalikan hasil yang memenuhi kriteria tertentu.

    +


    +

    Dalam tutorial ini, Anda akan belajar cara membuat mesin pencari teks. Tutorial ini menggunakan BERT untuk mengubah teks menjadi vektor dengan panjang tetap. Milvus digunakan sebagai basis data vektor untuk penyimpanan dan pencarian kemiripan vektor. Kemudian gunakan MySQL untuk memetakan ID vektor yang dihasilkan oleh Milvus ke data teks.

    +


    +

    + + text_search_engine + text_search_engine text_search_enginetext_search_engine

    diff --git a/localization/v2.5.x/site/id/tutorials/tutorials-overview.json b/localization/v2.5.x/site/id/tutorials/tutorials-overview.json new file mode 100644 index 000000000..7ecdb33ba --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/tutorials-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Tutorials Overview","anchorList":[{"label":"Ikhtisar Tutorial","href":"Tutorials-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/tutorials-overview.md b/localization/v2.5.x/site/id/tutorials/tutorials-overview.md new file mode 100644 index 000000000..8534db7fb --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/tutorials-overview.md @@ -0,0 +1,54 @@ +--- +id: tutorials-overview.md +summary: >- + Halaman ini menyediakan daftar tutorial bagi Anda untuk berinteraksi dengan + Milvus. +title: Ikhtisar Tutorial +--- +

    Ikhtisar Tutorial

    Halaman ini menyediakan daftar tutorial bagi Anda untuk berinteraksi dengan Milvus.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TutorialKasus PenggunaanFitur-fitur terkait Milvus
    Membangun RAG dengan MilvusRAGPencarian vektor
    RAG tingkat lanjutRAGPencarian vektor
    Pencarian Teks Lengkap dengan MilvusMulai CepatPencarian Teks Lengkap
    Pencarian Hibrida dengan MilvusPencarian Hibridapencarian hibrida, multi vektor, penyematan padat, penyematan jarang
    Pencarian Gambar dengan MilvusPencarian Semantikpencarian vektor, bidang dinamis
    RAG multimodal dengan MilvusRAGpencarian vektor, bidang dinamis
    Pencarian Multimodal menggunakan Multi VektorPencarian Semantikmulti vektor, pencarian hibrida
    Grafik RAG dengan MilvusRAGpencarian grafik
    Pencarian Kontekstual dengan MilvusMemulai dengan cepatPencarian vektor
    Pengelompokan HDBSCAN dengan MilvusMulai cepatpencarian vektor
    Gunakan ColPali untuk Pencarian Multi-Modal dengan MilvusMulai Cepatpencarian vektor
    Visualisasi VektorMulai Cepatpencarian vektor
    Rekomendasi Film dengan MilvusSistem Rekomendasipencarian vektor
    Pencarian Corong dengan Penyematan MatryoshkaMulai cepatPencarian vektor
    Sistem Penjawab PertanyaanMenjawab PertanyaanPencarian vektor
    Sistem RekomendasiSistem RekomendasiPencarian Vektor
    Pencarian Kemiripan VideoPencarian SemantikPencarian Vektor
    Pencarian Kemiripan AudioPencarian Semantikpencarian vektor
    Klasifikasi DNAKlasifikasipencarian vektor
    Mesin Pencari TeksPencarian SemantikPencarian Vektor
    Cari Gambar dengan TeksPencarian SemantikPencarian Vektor
    Deduplikasi GambarDeduplikasipencarian vektor
    Memulai cepat dengan AttuMemulai cepatPencarian vektor
    Gunakan AsyncMilvusClient dengan asyncioAsyncIOAsyncIO, pencarian vektor
    diff --git a/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.json b/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.json new file mode 100644 index 000000000..cf88c861d --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.json @@ -0,0 +1 @@ +{"codeList":["import asyncio​\nimport numpy as np​\nfrom scipy.sparse import csr_matrix​\nfrom pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​\n​\nloop = asyncio.get_event_loop()​\n\n","# Connect to Milvus server using AsyncMilvusClient​\nasync_client = AsyncMilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n\n","schema = async_client.create_schema(​\n auto_id=False,​\n description=\"This is a sample schema\",​\n)​\n​\nschema.add_field(\"id\", DataType.INT64, is_primary=True)​\nschema.add_field(\"dense_vector\", DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(\"sparse_vector\", DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(\"text\", DataType.VARCHAR, max_length=512)​\n\n","async def create_my_collection(collection_name, schema):​\n if (client.has_collection(collection_name)):​\n await async_client.drop_collection(collection_name)​\n​\n await async_client.create_collection(​\n collection_name=collection_name,​\n schema=schema​\n )​\n​\n if (client.has_collection(collection_name)):​\n print(\"Collection created successfully\")​\n else:​\n print(\"Failed to create collection\")​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_my_collection(\"my_collection\", schema))​\n​\n# Output​\n#​\n# Collection created successfully​\n\n","async def create_indexes(collection_name):​\n index_params = client.prepare_index_params()​\n​\n index_params.add_index(field_name=\"dense_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"sparse_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"text\", index_type=\"AUTOINDEX\")​\n​\n await async_client.create_index(collection_name, index_params)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_indexes(\"my_collection\"))​\n\n","async def load_my_collection(collection_name):​\n await async_client.load_collection(collection_name)​\n print(client.get_load_state(collection_name))​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(load_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# {'state': }​\n\n","async def insert_sample_data(collection_name):​\n # Randomly generated data will be used here​\n rng = np.random.default_rng(42)​\n​\n def generate_random_text(length):​\n seed = \"this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence.\"​\n words = seed.split()​\n return \" \".join(rng.choice(words, length))​\n ​\n data = [{​\n 'id': i, ​\n 'dense_vector': rng.random(5).tolist(), ​\n 'sparse_vector': csr_matrix(rng.random(5)), ​\n 'text': generate_random_text(10)​\n } for i in range(10000)]​\n​\n res = await async_client.insert(collection_name, data)​\n​\n print(res)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(insert_sample_data(\"my_collection\"))​\n​\n# Output​\n#​\n# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​\n\n","async def query_my_collection(collection_name):​\n # Find the number of entities with the `text` fields starting with the word \"random\" in the `my_collection` collection.​\n​\n res = await async_client.query(​\n collection_name=\"my_collection\",​\n filter='text like \"%random%\"',​\n output_fields=[\"count(*)\"]​\n )​\n​\n print(res) ​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(query_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# data: [\"{'count(*)': 6802}\"] ​\n\n","async def conduct_vector_search(collection_name, type, field):​\n # Generate a set of three random query vectors​\n query_vectors = []​\n if type == \"dense\":​\n query_vectors = [ rng.random(5) for _ in range(3) ]​\n ​\n if type == \"sparse\":​\n query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​\n​\n print(query_vectors)​\n​\n res = await async_client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n anns_field=field,​\n output_fields=[\"text\", field]​\n )​\n​\n print(res)​\n ​\n# To search against the dense vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"dense\", \"dense_vector\"))​\n​\n# To search against the sparse vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"sparse\", \"sparse_vector\"))​\n\n","async def conduct_hybrid_search(collection_name):​\n req_dense = AnnSearchRequest(​\n data=[ rng.random(5) for _ in range(3) ],​\n anns_field=\"dense_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n req_sparse = AnnSearchRequest(​\n data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​\n anns_field=\"sparse_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n reqs = [req_dense, req_sparse]​\n​\n ranker = RRFRanker()​\n​\n res = await async_client.hybrid_search(​\n collection_name=\"my_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n output_fields=[\"text\", \"dense_vector\", \"sparse_vector\"]​\n )​\n​\n print(res)​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(conduct_hybrid_search(\"my_collection\"))​\n\n"],"headingContent":"Tutorial: Use AsyncMilvusClient with asyncio​","anchorList":[{"label":"Tutorial: Menggunakan AsyncMilvusClient dengan asyncio","href":"Tutorial-Use-AsyncMilvusClient-with-asyncio​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat perulangan kejadian","href":"Create-an-event-loop​","type":2,"isActive":false},{"label":"Terhubung dengan AsyncMilvusClient","href":"Connect-with-AsyncMilvusClient​","type":2,"isActive":false},{"label":"Membuat skema","href":"Create-schema​","type":2,"isActive":false},{"label":"Membuat koleksi","href":"Create-collection​","type":2,"isActive":false},{"label":"Membuat indeks","href":"Create-index​","type":2,"isActive":false},{"label":"Memuat koleksi","href":"Load-collection​","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data​","type":2,"isActive":false},{"label":"Kueri","href":"Query​","type":2,"isActive":false},{"label":"Pencarian","href":"Search​","type":2,"isActive":false},{"label":"Pencarian Hibrida","href":"Hybrid-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.md b/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.md new file mode 100644 index 000000000..c48bd224b --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/use-async-milvus-client-with-asyncio.md @@ -0,0 +1,416 @@ +--- +id: use-async-milvus-client-with-asyncio.md +summary: >- + AsyncMilvusClient adalah MilvusClient asinkron yang menawarkan API berbasis + coroutine untuk akses tanpa pemblokiran ke Milvus melalui asinkronisasi. Pada + artikel ini, Anda akan mempelajari tentang proses pemanggilan API yang + disediakan oleh AsyncMilvusClient dan aspek-aspek yang perlu Anda perhatikan. +title: Sistem Penjawab Pertanyaan +--- +

    Tutorial: Menggunakan AsyncMilvusClient dengan asyncio

    AsyncMilvusClient adalah MilvusClient asinkron yang menawarkan API berbasis coroutine untuk akses tanpa pemblokiran ke Milvus melalui asyncio. Pada artikel ini, Anda akan mempelajari tentang proses pemanggilan API yang disediakan oleh AsyncMilvusClient dan aspek-aspek yang perlu Anda perhatikan.

    +

    Gambaran Umum

    Asyncio adalah pustaka untuk menulis kode konkuren menggunakan sintaks async/await dan berfungsi sebagai fondasi untuk klien asinkron berkinerja tinggi dari Milvus, yang akan sesuai dengan pustaka kode Anda yang berjalan di atas asyncio.

    +

    Metode-metode yang disediakan oleh AsyncMilvusClient memiliki set parameter dan perilaku yang sama dengan yang dimiliki oleh MilvusClient. Satu-satunya perbedaan terletak pada cara Anda memanggilnya. Tabel berikut mencantumkan metode yang tersedia di AsyncMilvusClient.

    +

    **Klien**

    +

    `close()`

    +

    +

    +

    **Koleksi & Partisi**

    +

    `create_collection()`

    +

    `drop_collection()`

    +

    `create_partition()`

    +

    `drop_partition()`

    +

    +

    +

    **Indeks**

    +

    `create_index()`

    +

    `drop_index()`

    +

    `load_collection()`

    +

    `release_collection()`

    +

    `load_partitions()`

    +

    `release_partitions()`

    +

    ** Vektor**

    +

    `insert()`

    +

    `upsert()`

    +

    `delete()`

    +

    `search()`

    +

    `query()`

    +

    `hybrid_search()`

    +

    `get()`

    +

    +

    +
    +

    Jika Anda masih membutuhkan versi asinkron dari metode MilvusClient lainnya, Anda dapat mengirimkan permintaan fitur di repositori pymilvus. Kontribusi kode juga diterima.

    +

    Membuat perulangan kejadian

    Aplikasi yang menggunakan asinkronisasi biasanya menggunakan event loop sebagai pengatur untuk mengelola tugas-tugas asinkron dan operasi I/O. Dalam tutorial ini, kita akan mendapatkan event loop dari asyncio dan menggunakannya sebagai orkestrator.

    +
    import asyncio​
    +import numpy as np​
    +from scipy.sparse import csr_matrix​
    +from pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​
    +​
    +loop = asyncio.get_event_loop()​
    +
    +
    +

    Terhubung dengan AsyncMilvusClient

    Contoh berikut ini mendemonstrasikan cara menghubungkan Milvus secara asinkron.

    +
    # Connect to Milvus server using AsyncMilvusClient​
    +async_client = AsyncMilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +
    +
    +

    Membuat skema

    Saat ini, create_schema() tidak tersedia di AsyncMilvusClient. Sebagai gantinya, kita akan menggunakan MilvusClient untuk membuat skema untuk koleksi.

    +
    schema = async_client.create_schema(​
    +    auto_id=False,​
    +    description="This is a sample schema",​
    +)​
    +​
    +schema.add_field("id", DataType.INT64, is_primary=True)​
    +schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field("text", DataType.VARCHAR, max_length=512)​
    +
    +
    +
    +

    AsyncMilvusClient memanggil metode create_schema() secara sinkron; oleh karena itu, Anda tidak perlu mengatur pemanggilan menggunakan perulangan peristiwa.

    +
    +

    Membuat koleksi

    Sekarang kita akan menggunakan skema untuk membuat koleksi. Perhatikan bahwa Anda perlu mengawali kata kunci await pada setiap pemanggilan ke metode AsyncMilvusClient dan menempatkan pemanggilan tersebut di dalam fungsi async sebagai berikut.

    +
    async def create_my_collection(collection_name, schema):​
    +    if (client.has_collection(collection_name)):​
    +        await async_client.drop_collection(collection_name)​
    +​
    +    await async_client.create_collection(​
    +        collection_name=collection_name,​
    +        schema=schema​
    +    )​
    +​
    +    if (client.has_collection(collection_name)):​
    +        print("Collection created successfully")​
    +    else:​
    +        print("Failed to create collection")​
    +        ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_my_collection("my_collection", schema))​
    +​
    +# Output​
    +#​
    +# Collection created successfully​
    +
    +
    +

    Membuat indeks

    Anda juga perlu membuat indeks untuk semua bidang vektor dan bidang skalar opsional. Menurut skema yang didefinisikan di atas, ada dua bidang vektor dalam koleksi, dan Anda akan membuat indeks untuk mereka sebagai berikut.

    +
    async def create_indexes(collection_name):​
    +    index_params = client.prepare_index_params()​
    +​
    +    index_params.add_index(field_name="dense_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="sparse_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="text", index_type="AUTOINDEX")​
    +​
    +    await async_client.create_index(collection_name, index_params)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_indexes("my_collection"))​
    +
    +
    +

    Memuat koleksi

    Koleksi dapat dimuat setelah bidang yang diperlukan diindeks. Kode berikut ini menunjukkan cara memuat koleksi secara asinkron.

    +
    async def load_my_collection(collection_name):​
    +    await async_client.load_collection(collection_name)​
    +    print(client.get_load_state(collection_name))​
    +    ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(load_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'state': <LoadState: Loaded>}​
    +
    +
    +

    Menyisipkan data

    Anda dapat menggunakan model penyematan yang tersedia di pymilvus untuk menghasilkan penyematan vektor untuk teks Anda. Untuk detailnya, lihat Ikhtisar Penyematan. Pada bagian ini, kita akan menyisipkan data yang dibuat secara acak ke dalam koleksi.

    +
    async def insert_sample_data(collection_name):​
    +    # Randomly generated data will be used here​
    +    rng = np.random.default_rng(42)​
    +​
    +    def generate_random_text(length):​
    +        seed = "this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence."​
    +        words = seed.split()​
    +        return " ".join(rng.choice(words, length))​
    +    ​
    +    data = [{​
    +        'id': i, ​
    +        'dense_vector': rng.random(5).tolist(), ​
    +        'sparse_vector': csr_matrix(rng.random(5)), ​
    +        'text': generate_random_text(10)​
    +    } for i in range(10000)]​
    +​
    +    res = await async_client.insert(collection_name, data)​
    +​
    +    print(res)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(insert_sample_data("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​
    +
    +
    +

    Kueri

    Setelah koleksi dimuat dan diisi dengan data, Anda dapat melakukan pencarian dan kueri di dalamnya. Pada bagian ini, Anda akan menemukan jumlah entitas di bidang text yang dimulai dengan kata random dalam koleksi bernama my_collection.

    +
    async def query_my_collection(collection_name):​
    +    # Find the number of entities with the `text` fields starting with the word "random" in the `my_collection` collection.​
    +​
    +    res = await async_client.query(​
    +        collection_name="my_collection",​
    +        filter='text like "%random%"',​
    +        output_fields=["count(*)"]​
    +    )​
    +​
    +    print(res) ​
    +    ​
    +# Call the above function asynchronously   ​
    +loop.run_until_complete(query_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# data: ["{'count(*)': 6802}"] ​
    +
    +
    +

    Pencarian

    Pada bagian ini, Anda akan melakukan pencarian vektor pada bidang vektor padat dan bidang vektor jarang dari koleksi target.

    +
    async def conduct_vector_search(collection_name, type, field):​
    +    # Generate a set of three random query vectors​
    +    query_vectors = []​
    +    if type == "dense":​
    +        query_vectors = [ rng.random(5) for _ in range(3) ]​
    +    ​
    +    if type == "sparse":​
    +        query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​
    +​
    +    print(query_vectors)​
    +​
    +    res = await async_client.search(​
    +        collection_name="my_collection",​
    +        data=query_vectors,​
    +        anns_field=field,​
    +        output_fields=["text", field]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# To search against the dense vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "dense", "dense_vector"))​
    +​
    +# To search against the sparse vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "sparse", "sparse_vector"))​
    +
    +
    +

    Hasil pencarian harus mencantumkan tiga set hasil yang sesuai dengan vektor kueri yang ditentukan.

    +

    Pencarian Hibrida

    Pencarian hibrida menggabungkan hasil dari beberapa pencarian dan memberi peringkat ulang untuk mendapatkan pemanggilan yang lebih baik. Pada bagian ini, Anda akan melakukan pencarian hibrida menggunakan bidang vektor padat dan jarang.

    +
    async def conduct_hybrid_search(collection_name):​
    +    req_dense = AnnSearchRequest(​
    +        data=[ rng.random(5) for _ in range(3) ],​
    +        anns_field="dense_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    req_sparse = AnnSearchRequest(​
    +        data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​
    +        anns_field="sparse_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    reqs = [req_dense, req_sparse]​
    +​
    +    ranker = RRFRanker()​
    +​
    +    res = await async_client.hybrid_search(​
    +        collection_name="my_collection",​
    +        reqs=reqs,​
    +        ranker=ranker,​
    +        output_fields=["text", "dense_vector", "sparse_vector"]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# Call the above function asynchronously  ​
    +loop.run_until_complete(conduct_hybrid_search("my_collection"))​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.json b/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.json new file mode 100644 index 000000000..555aba6e4 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pdf2image\n$ pip pymilvus\n$ pip install colpali_engine\n$ pip install tqdm\n$ pip instal pillow\n","from pdf2image import convert_from_path\n\npdf_path = \"pdfs/2004.12832v2.pdf\"\nimages = convert_from_path(pdf_path)\n\nfor i, image in enumerate(images):\n image.save(f\"pages/page_{i + 1}.png\", \"PNG\")\n","from pymilvus import MilvusClient, DataType\nimport numpy as np\nimport concurrent.futures\n\nclient = MilvusClient(uri=\"milvus.db\")\n","class MilvusColbertRetriever:\n def __init__(self, milvus_client, collection_name, dim=128):\n # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.\n # If the collection exists, load it.\n self.collection_name = collection_name\n self.client = milvus_client\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.load_collection(collection_name)\n self.dim = dim\n\n def create_collection(self):\n # Create a new collection in Milvus for storing embeddings.\n # Drop the existing collection if it already exists and define the schema for the collection.\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.drop_collection(collection_name=self.collection_name)\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_fields=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=self.dim\n )\n schema.add_field(field_name=\"seq_id\", datatype=DataType.INT16)\n schema.add_field(field_name=\"doc_id\", datatype=DataType.INT64)\n schema.add_field(field_name=\"doc\", datatype=DataType.VARCHAR, max_length=65535)\n\n self.client.create_collection(\n collection_name=self.collection_name, schema=schema\n )\n\n def create_index(self):\n # Create an index on the vector field to enable fast similarity search.\n # Releases and drops any existing index before creating a new one with specified parameters.\n self.client.release_collection(collection_name=self.collection_name)\n self.client.drop_index(\n collection_name=self.collection_name, index_name=\"vector\"\n )\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"vector\",\n index_name=\"vector_index\",\n index_type=\"HNSW\", # or any other index type you want\n metric_type=\"IP\", # or the appropriate metric type\n params={\n \"M\": 16,\n \"efConstruction\": 500,\n }, # adjust these parameters as needed\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def create_scalar_index(self):\n # Create a scalar index for the \"doc_id\" field to enable fast lookups by document ID.\n self.client.release_collection(collection_name=self.collection_name)\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"doc_id\",\n index_name=\"int32_index\",\n index_type=\"INVERTED\", # or any other index type you want\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def search(self, data, topk):\n # Perform a vector search on the collection to find the top-k most similar documents.\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n results = self.client.search(\n self.collection_name,\n data,\n limit=int(50),\n output_fields=[\"vector\", \"seq_id\", \"doc_id\"],\n search_params=search_params,\n )\n doc_ids = set()\n for r_id in range(len(results)):\n for r in range(len(results[r_id])):\n doc_ids.add(results[r_id][r][\"entity\"][\"doc_id\"])\n\n scores = []\n\n def rerank_single_doc(doc_id, data, client, collection_name):\n # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.\n doc_colbert_vecs = client.query(\n collection_name=collection_name,\n filter=f\"doc_id in [{doc_id}]\",\n output_fields=[\"seq_id\", \"vector\", \"doc\"],\n limit=1000,\n )\n doc_vecs = np.vstack(\n [doc_colbert_vecs[i][\"vector\"] for i in range(len(doc_colbert_vecs))]\n )\n score = np.dot(data, doc_vecs.T).max(1).sum()\n return (score, doc_id)\n\n with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:\n futures = {\n executor.submit(\n rerank_single_doc, doc_id, data, client, self.collection_name\n ): doc_id\n for doc_id in doc_ids\n }\n for future in concurrent.futures.as_completed(futures):\n score, doc_id = future.result()\n scores.append((score, doc_id))\n\n scores.sort(key=lambda x: x[0], reverse=True)\n if len(scores) >= topk:\n return scores[:topk]\n else:\n return scores\n\n def insert(self, data):\n # Insert ColBERT embeddings and metadata for a document into the collection.\n colbert_vecs = [vec for vec in data[\"colbert_vecs\"]]\n seq_length = len(colbert_vecs)\n doc_ids = [data[\"doc_id\"] for i in range(seq_length)]\n seq_ids = list(range(seq_length))\n docs = [\"\"] * seq_length\n docs[0] = data[\"filepath\"]\n\n # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.\n self.client.insert(\n self.collection_name,\n [\n {\n \"vector\": colbert_vecs[i],\n \"seq_id\": seq_ids[i],\n \"doc_id\": doc_ids[i],\n \"doc\": docs[i],\n }\n for i in range(seq_length)\n ],\n )\n","from colpali_engine.models import ColPali\nfrom colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor\nfrom colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor\nfrom colpali_engine.utils.torch_utils import ListDataset, get_torch_device\nfrom torch.utils.data import DataLoader\nimport torch\nfrom typing import List, cast\n\ndevice = get_torch_device(\"cpu\")\nmodel_name = \"vidore/colpali-v1.2\"\n\nmodel = ColPali.from_pretrained(\n model_name,\n torch_dtype=torch.bfloat16,\n device_map=device,\n).eval()\n\nqueries = [\n \"How to end-to-end retrieval with ColBert?\",\n \"Where is ColBERT performance table?\",\n]\n\nprocessor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))\n\ndataloader = DataLoader(\n dataset=ListDataset[str](queries),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_queries(x),\n)\n\nqs: List[torch.Tensor] = []\nfor batch_query in dataloader:\n with torch.no_grad():\n batch_query = {k: v.to(model.device) for k, v in batch_query.items()}\n embeddings_query = model(**batch_query)\n qs.extend(list(torch.unbind(embeddings_query.to(\"cpu\"))))\n","from tqdm import tqdm\nfrom PIL import Image\nimport os\n\nimages = [Image.open(\"./pages/\" + name) for name in os.listdir(\"./pages\")]\n\ndataloader = DataLoader(\n dataset=ListDataset[str](images),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_images(x),\n)\n\nds: List[torch.Tensor] = []\nfor batch_doc in tqdm(dataloader):\n with torch.no_grad():\n batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}\n embeddings_doc = model(**batch_doc)\n ds.extend(list(torch.unbind(embeddings_doc.to(\"cpu\"))))\n\nprint(ds[0].shape)\n","retriever = MilvusColbertRetriever(collection_name=\"colpali\", milvus_client=client)\nretriever.create_collection()\nretriever.create_index()\n","filepaths = [\"./pages/\" + name for name in os.listdir(\"./pages\")]\nfor i in range(len(filepaths)):\n data = {\n \"colbert_vecs\": ds[i].float().numpy(),\n \"doc_id\": i,\n \"filepath\": filepaths[i],\n }\n retriever.insert(data)\n","for query in qs:\n query = query.float().numpy()\n result = retriever.search(query, topk=1)\n print(filepaths[result[0][1]])\n"],"headingContent":"Use ColPali for Multi-Modal Retrieval with Milvus","anchorList":[{"label":"Gunakan ColPali untuk Pengambilan Multi-Modal dengan Milvus","href":"Use-ColPali-for-Multi-Modal-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Siapkan data","href":"Prepare-the-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.md b/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.md new file mode 100644 index 000000000..057de1c67 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/use_ColPali_with_milvus.md @@ -0,0 +1,336 @@ +--- +id: use_ColPali_with_milvus.md +summary: >- + Dalam buku catatan ini, kami menyebut representasi multi-vektor semacam ini + sebagai "embeddings ColBERT" untuk keumuman. Namun, model sebenarnya yang + digunakan adalah model ColPali. Kami akan mendemonstrasikan cara menggunakan + Milvus untuk pengambilan multi-vektor. Selanjutnya, kami akan memperkenalkan + cara menggunakan ColPali untuk mengambil halaman berdasarkan kueri yang + diberikan. +title: Gunakan ColPali untuk Pengambilan Multi-Modal dengan Milvus +--- +

    Gunakan ColPali untuk Pengambilan Multi-Modal dengan Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Model pengambilan modern biasanya menggunakan satu penyematan untuk merepresentasikan teks atau gambar. Akan tetapi, ColBERT adalah model neural yang menggunakan daftar penyematan untuk setiap contoh data dan menggunakan operasi "MaxSim" untuk menghitung kemiripan antara dua teks. Selain data tekstual, gambar, tabel, dan diagram juga mengandung informasi yang kaya, yang sering diabaikan dalam pencarian informasi berbasis teks.

    +

    + + + + +

    +

    Fungsi MaxSim membandingkan kueri dengan dokumen (yang Anda cari) dengan melihat penyematan tokennya. Untuk setiap kata dalam kueri, ia memilih kata yang paling mirip dari dokumen (menggunakan cosine similarity atau jarak L2 kuadrat) dan menjumlahkan kemiripan maksimum ini di semua kata dalam kueri

    +

    ColPali adalah metode yang menggabungkan representasi multi-vektor ColBERT dengan PaliGemma (model bahasa besar multimodal) untuk meningkatkan kemampuan pemahamannya yang kuat. Pendekatan ini memungkinkan sebuah halaman dengan teks dan gambar direpresentasikan menggunakan penyematan multi-vektor terpadu. Penyematan dalam representasi multi-vektor ini dapat menangkap informasi yang terperinci, meningkatkan kinerja pengambilan-penambahan generasi (RAG) untuk data multimodal.

    +

    Dalam buku catatan ini, kami menyebut representasi multi-vektor semacam ini sebagai "embeddings ColBERT" untuk keumumannya. Namun, model sebenarnya yang digunakan adalah model ColPali. Kami akan mendemonstrasikan bagaimana cara menggunakan Milvus untuk pengambilan multi-vektor. Selanjutnya, kami akan memperkenalkan cara menggunakan ColPali untuk mengambil halaman berdasarkan kueri yang diberikan.

    +

    Persiapan

    $ pip install pdf2image
    +$ pip pymilvus
    +$ pip install colpali_engine
    +$ pip install tqdm
    +$ pip instal pillow
    +
    +

    Siapkan data

    Kita akan menggunakan PDF RAG sebagai contoh. Anda dapat mengunduh dokumen ColBERT dan memasukkannya ke dalam ./pdf. ColPali tidak memproses teks secara langsung; sebaliknya, seluruh halaman di-raster menjadi sebuah gambar. Model ColPali unggul dalam memahami informasi tekstual yang terkandung di dalam gambar-gambar ini. Oleh karena itu, kita akan mengubah setiap halaman PDF menjadi gambar untuk diproses.

    +
    from pdf2image import convert_from_path
    +
    +pdf_path = "pdfs/2004.12832v2.pdf"
    +images = convert_from_path(pdf_path)
    +
    +for i, image in enumerate(images):
    +    image.save(f"pages/page_{i + 1}.png", "PNG")
    +
    +

    Selanjutnya, kita akan menginisialisasi database menggunakan Milvus Lite. Anda dapat dengan mudah beralih ke instance Milvus penuh dengan mengatur uri ke alamat yang sesuai di mana layanan Milvus Anda dihosting.

    +
    from pymilvus import MilvusClient, DataType
    +import numpy as np
    +import concurrent.futures
    +
    +client = MilvusClient(uri="milvus.db")
    +
    +
    +
      +
    • Jika Anda hanya membutuhkan basis data vektor lokal untuk data skala kecil atau pembuatan prototipe, mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi pada Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.
    • +
    • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.
    • +
    +
    +

    Kita akan mendefinisikan kelas MilvusColbertRetriever untuk membungkus klien Milvus untuk pengambilan data multi-vektor. Implementasi ini meratakan penyematan ColBERT dan memasukkannya ke dalam sebuah koleksi, di mana setiap baris mewakili penyematan individu dari daftar penyematan ColBERT. Implementasi ini juga mencatat doc_id dan seq_id untuk melacak asal usul setiap embedding.

    +

    Ketika mencari dengan daftar embedding ColBERT, beberapa pencarian akan dilakukan-satu untuk setiap embedding ColBERT. Doc_id yang diambil kemudian akan diduplikasi. Proses pemeringkatan ulang akan dilakukan, di mana penyematan lengkap untuk setiap doc_id diambil, dan skor MaxSim dihitung untuk menghasilkan hasil peringkat akhir.

    +
    class MilvusColbertRetriever:
    +    def __init__(self, milvus_client, collection_name, dim=128):
    +        # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.
    +        # If the collection exists, load it.
    +        self.collection_name = collection_name
    +        self.client = milvus_client
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.load_collection(collection_name)
    +        self.dim = dim
    +
    +    def create_collection(self):
    +        # Create a new collection in Milvus for storing embeddings.
    +        # Drop the existing collection if it already exists and define the schema for the collection.
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.drop_collection(collection_name=self.collection_name)
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_fields=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=self.dim
    +        )
    +        schema.add_field(field_name="seq_id", datatype=DataType.INT16)
    +        schema.add_field(field_name="doc_id", datatype=DataType.INT64)
    +        schema.add_field(field_name="doc", datatype=DataType.VARCHAR, max_length=65535)
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name, schema=schema
    +        )
    +
    +    def create_index(self):
    +        # Create an index on the vector field to enable fast similarity search.
    +        # Releases and drops any existing index before creating a new one with specified parameters.
    +        self.client.release_collection(collection_name=self.collection_name)
    +        self.client.drop_index(
    +            collection_name=self.collection_name, index_name="vector"
    +        )
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="vector",
    +            index_name="vector_index",
    +            index_type="HNSW",  # or any other index type you want
    +            metric_type="IP",  # or the appropriate metric type
    +            params={
    +                "M": 16,
    +                "efConstruction": 500,
    +            },  # adjust these parameters as needed
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def create_scalar_index(self):
    +        # Create a scalar index for the "doc_id" field to enable fast lookups by document ID.
    +        self.client.release_collection(collection_name=self.collection_name)
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="doc_id",
    +            index_name="int32_index",
    +            index_type="INVERTED",  # or any other index type you want
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def search(self, data, topk):
    +        # Perform a vector search on the collection to find the top-k most similar documents.
    +        search_params = {"metric_type": "IP", "params": {}}
    +        results = self.client.search(
    +            self.collection_name,
    +            data,
    +            limit=int(50),
    +            output_fields=["vector", "seq_id", "doc_id"],
    +            search_params=search_params,
    +        )
    +        doc_ids = set()
    +        for r_id in range(len(results)):
    +            for r in range(len(results[r_id])):
    +                doc_ids.add(results[r_id][r]["entity"]["doc_id"])
    +
    +        scores = []
    +
    +        def rerank_single_doc(doc_id, data, client, collection_name):
    +            # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.
    +            doc_colbert_vecs = client.query(
    +                collection_name=collection_name,
    +                filter=f"doc_id in [{doc_id}]",
    +                output_fields=["seq_id", "vector", "doc"],
    +                limit=1000,
    +            )
    +            doc_vecs = np.vstack(
    +                [doc_colbert_vecs[i]["vector"] for i in range(len(doc_colbert_vecs))]
    +            )
    +            score = np.dot(data, doc_vecs.T).max(1).sum()
    +            return (score, doc_id)
    +
    +        with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:
    +            futures = {
    +                executor.submit(
    +                    rerank_single_doc, doc_id, data, client, self.collection_name
    +                ): doc_id
    +                for doc_id in doc_ids
    +            }
    +            for future in concurrent.futures.as_completed(futures):
    +                score, doc_id = future.result()
    +                scores.append((score, doc_id))
    +
    +        scores.sort(key=lambda x: x[0], reverse=True)
    +        if len(scores) >= topk:
    +            return scores[:topk]
    +        else:
    +            return scores
    +
    +    def insert(self, data):
    +        # Insert ColBERT embeddings and metadata for a document into the collection.
    +        colbert_vecs = [vec for vec in data["colbert_vecs"]]
    +        seq_length = len(colbert_vecs)
    +        doc_ids = [data["doc_id"] for i in range(seq_length)]
    +        seq_ids = list(range(seq_length))
    +        docs = [""] * seq_length
    +        docs[0] = data["filepath"]
    +
    +        # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.
    +        self.client.insert(
    +            self.collection_name,
    +            [
    +                {
    +                    "vector": colbert_vecs[i],
    +                    "seq_id": seq_ids[i],
    +                    "doc_id": doc_ids[i],
    +                    "doc": docs[i],
    +                }
    +                for i in range(seq_length)
    +            ],
    +        )
    +
    +

    Kita akan menggunakan colpali_engine untuk mengekstrak daftar sematan untuk dua kueri dan mengambil informasi yang relevan dari halaman PDF.

    +
    from colpali_engine.models import ColPali
    +from colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor
    +from colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor
    +from colpali_engine.utils.torch_utils import ListDataset, get_torch_device
    +from torch.utils.data import DataLoader
    +import torch
    +from typing import List, cast
    +
    +device = get_torch_device("cpu")
    +model_name = "vidore/colpali-v1.2"
    +
    +model = ColPali.from_pretrained(
    +    model_name,
    +    torch_dtype=torch.bfloat16,
    +    device_map=device,
    +).eval()
    +
    +queries = [
    +    "How to end-to-end retrieval with ColBert?",
    +    "Where is ColBERT performance table?",
    +]
    +
    +processor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](queries),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_queries(x),
    +)
    +
    +qs: List[torch.Tensor] = []
    +for batch_query in dataloader:
    +    with torch.no_grad():
    +        batch_query = {k: v.to(model.device) for k, v in batch_query.items()}
    +        embeddings_query = model(**batch_query)
    +    qs.extend(list(torch.unbind(embeddings_query.to("cpu"))))
    +
    +

    Selain itu, kita perlu mengekstrak daftar penyematan untuk setiap halaman dan ini menunjukkan bahwa ada 1030 penyematan 128 dimensi untuk setiap halaman.

    +
    from tqdm import tqdm
    +from PIL import Image
    +import os
    +
    +images = [Image.open("./pages/" + name) for name in os.listdir("./pages")]
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](images),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_images(x),
    +)
    +
    +ds: List[torch.Tensor] = []
    +for batch_doc in tqdm(dataloader):
    +    with torch.no_grad():
    +        batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
    +        embeddings_doc = model(**batch_doc)
    +    ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
    +
    +print(ds[0].shape)
    +
    +
      0%|          | 0/10 [00:00<?, ?it/s]
    +
    +100%|██████████| 10/10 [01:22<00:00,  8.24s/it]
    +
    +torch.Size([1030, 128])
    +
    +

    Kita akan membuat koleksi bernama "colpali" menggunakan MilvusColbertRetriever.

    +
    retriever = MilvusColbertRetriever(collection_name="colpali", milvus_client=client)
    +retriever.create_collection()
    +retriever.create_index()
    +
    +

    Kita akan memasukkan daftar penyematan ke dalam basis data Milvus.

    +
    filepaths = ["./pages/" + name for name in os.listdir("./pages")]
    +for i in range(len(filepaths)):
    +    data = {
    +        "colbert_vecs": ds[i].float().numpy(),
    +        "doc_id": i,
    +        "filepath": filepaths[i],
    +    }
    +    retriever.insert(data)
    +
    +

    Sekarang kita dapat mencari halaman yang paling relevan menggunakan daftar sematan kueri.

    +
    for query in qs:
    +    query = query.float().numpy()
    +    result = retriever.search(query, topk=1)
    +    print(filepaths[result[0][1]])
    +
    +
    ./pages/page_5.png
    +./pages/page_7.png
    +
    +

    Terakhir, kita mengambil nama halaman asli. Dengan ColPali, kita dapat mengambil dokumen multimodal tanpa memerlukan teknik pemrosesan yang rumit untuk mengekstrak teks dan gambar dari dokumen. Dengan memanfaatkan model visi besar, lebih banyak informasi - seperti tabel dan gambar - dapat dianalisis tanpa kehilangan informasi yang signifikan.

    diff --git a/localization/v2.5.x/site/id/tutorials/vector_visualization.json b/localization/v2.5.x/site/id/tutorials/vector_visualization.json new file mode 100644 index 000000000..9aa28b771 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/vector_visualization.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-large\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","# Modify the question to test it with your own query!\n\nquestion = \"How is data stored in Milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=10, # Return top 10 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","import pandas as pd\nimport numpy as np\nfrom sklearn.manifold import TSNE\n\ndata.append({\"id\": len(data), \"vector\": emb_text(question), \"text\": question})\nembeddings = []\nfor gp in data:\n embeddings.append(gp[\"vector\"])\n\nX = np.array(embeddings, dtype=np.float32)\ntsne = TSNE(random_state=0, max_iter=1000)\ntsne_results = tsne.fit_transform(X)\n\ndf_tsne = pd.DataFrame(tsne_results, columns=[\"TSNE1\", \"TSNE2\"])\ndf_tsne\n","import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Extract similar ids from search results\nsimilar_ids = [gp[\"id\"] for gp in search_res[0]]\n\ndf_norm = df_tsne[:-1]\n\ndf_query = pd.DataFrame(df_tsne.iloc[-1]).T\n\n# Filter points based on similar ids\nsimilar_points = df_tsne[df_tsne.index.isin(similar_ids)]\n\n# Create the plot\nfig, ax = plt.subplots(figsize=(8, 6)) # Set figsize\n\n# Set the style of the plot\nsns.set_style(\"darkgrid\", {\"grid.color\": \".6\", \"grid.linestyle\": \":\"})\n\n# Plot all points in blue\nsns.scatterplot(\n data=df_tsne, x=\"TSNE1\", y=\"TSNE2\", color=\"blue\", label=\"All knowledge\", ax=ax\n)\n\n# Overlay similar points in red\nsns.scatterplot(\n data=similar_points,\n x=\"TSNE1\",\n y=\"TSNE2\",\n color=\"red\",\n label=\"Similar knowledge\",\n ax=ax,\n)\n\nsns.scatterplot(\n data=df_query, x=\"TSNE1\", y=\"TSNE2\", color=\"green\", label=\"Query\", ax=ax\n)\n\n# Set plot titles and labels\nplt.title(\"Scatter plot of knowledge using t-SNE\")\nplt.xlabel(\"TSNE1\")\nplt.ylabel(\"TSNE2\")\n\n# Set axis to be equal\nplt.axis(\"equal\")\n\n# Display the legend\nplt.legend()\n\n# Show the plot\nplt.show()\n"],"headingContent":"Vector Visualization","anchorList":[{"label":"Visualisasi Vektor","href":"Vector-Visualization","type":1,"isActive":false},{"label":"Persiapan","href":"Preparation","type":2,"isActive":false},{"label":"Menyiapkan data","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Menyiapkan Model Penyematan","href":"Prepare-the-Embedding-Model","type":2,"isActive":false},{"label":"Memuat data ke dalam Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data","type":2,"isActive":false},{"label":"Memvisualisasikan Penyematan dalam Pencarian Vektor","href":"Visualizing-Embeddings-in-Vector-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/vector_visualization.md b/localization/v2.5.x/site/id/tutorials/vector_visualization.md new file mode 100644 index 000000000..5410e9657 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/vector_visualization.md @@ -0,0 +1,434 @@ +--- +id: vector_visualization.md +summary: >- + Pada contoh ini, kami akan menunjukkan bagaimana memvisualisasikan embedding + (vektor) di Milvus menggunakan t-SN. +title: Visualisasi Vektor +--- +

    Visualisasi Vektor

    +Open In Colab + + +GitHub Repository +

    +

    Dalam contoh ini, kami akan menunjukkan bagaimana memvisualisasikan embedding (vektor) dalam Milvus menggunakan t-SNE.

    +

    Teknik pengurangan dimensi, seperti t-SNE, sangat berharga untuk memvisualisasikan data yang kompleks dan berdimensi tinggi dalam ruang 2D atau 3D dengan tetap mempertahankan struktur lokal. Hal ini memungkinkan pengenalan pola, meningkatkan pemahaman tentang hubungan fitur, dan memfasilitasi interpretasi hasil model pembelajaran mesin. Selain itu, t-SNE membantu dalam evaluasi algoritme dengan membandingkan hasil pengelompokan secara visual, menyederhanakan presentasi data kepada audiens non-spesialis, dan dapat mengurangi biaya komputasi dengan bekerja dengan representasi dimensi yang lebih rendah. Melalui aplikasi ini, t-SNE tidak hanya membantu mendapatkan wawasan yang lebih dalam tentang kumpulan data tetapi juga mendukung proses pengambilan keputusan yang lebih tepat.

    +

    Persiapan

    Ketergantungan dan Lingkungan

    $ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn
    +
    +

    Kita akan menggunakan model penyematan OpenAI dalam contoh ini. Anda harus menyiapkan kunci api OPENAI_API_KEY sebagai variabel lingkungan.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Menyiapkan data

    Kami menggunakan halaman FAQ dari Dokumentasi Milvus 2.4.x sebagai pengetahuan pribadi dalam RAG kami, yang merupakan sumber data yang baik untuk pipeline RAG sederhana.

    +

    Unduh file zip dan ekstrak dokumen ke folder milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Kami memuat semua file penurunan harga dari folder milvus_docs/en/faq. Untuk setiap dokumen, kita cukup menggunakan "# " untuk memisahkan konten dalam file, yang secara kasar dapat memisahkan konten dari setiap bagian utama dari file penurunan harga.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Menyiapkan Model Penyematan

    Kita menginisialisasi klien OpenAI untuk menyiapkan model penyematan.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Tentukan fungsi untuk menghasilkan penyematan teks menggunakan klien OpenAI. Kami menggunakan model penyematan-teks-3-besar sebagai contoh.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-large")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Hasilkan embedding uji dan cetak dimensi dan beberapa elemen pertama.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    3072
    +[-0.015370666049420834, 0.00234124343842268, -0.01011690590530634, 0.044725317507982254, -0.017235849052667618, -0.02880779094994068, -0.026678944006562233, 0.06816216558218002, -0.011376636102795601, 0.021659553050994873]
    +
    +

    Memuat data ke dalam Milvus

    Membuat Koleksi

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Adapun argumen dari MilvusClient:

    +
      +
    • Menetapkan uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.
    • +
    • Jika Anda memiliki data dalam skala besar, Anda dapat mengatur server Milvus yang lebih berkinerja pada docker atau kubernetes. Dalam pengaturan ini, silakan gunakan uri server, misalnyahttp://localhost:19530, sebagai uri.
    • +
    • Jika Anda ingin menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan kunci Public Endpoint dan Api di Zilliz Cloud.
    • +
    +
    +

    Periksa apakah koleksi sudah ada dan hapus jika sudah ada.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Buat koleksi baru dengan parameter yang ditentukan.

    +

    Jika kita tidak menentukan informasi field apa pun, Milvus akan secara otomatis membuat field default id untuk primary key, dan field vector untuk menyimpan data vektor. Bidang JSON yang dicadangkan digunakan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Menyisipkan data

    Lakukan perulangan melalui baris teks, buat penyematan, lalu masukkan data ke dalam Milvus.

    +

    Berikut ini adalah bidang baru text, yang merupakan bidang yang tidak ditentukan dalam skema koleksi. Field ini akan secara otomatis ditambahkan ke field dinamis JSON yang dicadangkan, yang dapat diperlakukan sebagai field normal pada level tinggi.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:20<00:00,  3.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Pada bagian ini, kita melakukan pencarian milvus dan kemudian memvisualisasikan vektor kueri dan vektor yang diambil bersama-sama dalam dimensi yang diperkecil.

    +

    Mengambil Data untuk Kueri

    Mari siapkan pertanyaan untuk pencarian.

    +
    # Modify the question to test it with your own query!
    +
    +question = "How is data stored in Milvus?"
    +
    +

    Cari pertanyaan dalam koleksi dan ambil 10 kecocokan semantik teratas.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=10,  # Return top 10 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Mari kita lihat hasil pencarian dari kueri

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7675539255142212
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6210848689079285
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.585393488407135
    +    ],
    +    [
    +        "Why is there no vector data in etcd?\n\netcd stores Milvus module metadata; MinIO stores entities.\n\n###",
    +        0.579704999923706
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5777501463890076
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5655910968780518
    +    ],
    +    [
    +        "Does Milvus support inserting and searching data simultaneously?\n\nYes. Insert operations and query operations are handled by two separate modules that are mutually independent. From the client\u2019s perspective, an insert operation is complete when the inserted data enters the message queue. However, inserted data are unsearchable until they are loaded to the query node. If the segment size does not reach the index-building threshold (512 MB by default), Milvus resorts to brute-force search and query performance may be diminished.\n\n###",
    +        0.5618637204170227
    +    ],
    +    [
    +        "What data types does Milvus support on the primary key field?\n\nIn current release, Milvus supports both INT64 and string.\n\n###",
    +        0.5561620593070984
    +    ],
    +    [
    +        "Is Milvus available for concurrent search?\n\nYes. For queries on the same collection, Milvus concurrently searches the incremental and historical data. However, queries on different collections are conducted in series. Whereas the historical data can be an extremely huge dataset, searches on the historical data are relatively more time-consuming and essentially performed in series.\n\n###",
    +        0.529681921005249
    +    ],
    +    [
    +        "Can vectors with duplicate primary keys be inserted into Milvus?\n\nYes. Milvus does not check if vector primary keys are duplicates.\n\n###",
    +        0.528809666633606
    +    ]
    +]
    +
    +

    Pengurangan dimensi menjadi 2-d dengan t-SNE

    Mari kita kurangi dimensi sematan menjadi 2-d dengan t-SNE. Kita akan menggunakan pustaka sklearn untuk melakukan transformasi t-SNE.

    +
    import pandas as pd
    +import numpy as np
    +from sklearn.manifold import TSNE
    +
    +data.append({"id": len(data), "vector": emb_text(question), "text": question})
    +embeddings = []
    +for gp in data:
    +    embeddings.append(gp["vector"])
    +
    +X = np.array(embeddings, dtype=np.float32)
    +tsne = TSNE(random_state=0, max_iter=1000)
    +tsne_results = tsne.fit_transform(X)
    +
    +df_tsne = pd.DataFrame(tsne_results, columns=["TSNE1", "TSNE2"])
    +df_tsne
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TSNE1TSNE2
    0-3.8773620.866726
    1-5.9230840.671701
    2-0.6459540.240083
    30.4445821.222875
    46.503896-4.984684
    .........
    696.3540551.264959
    706.0559611.266211
    71-1.5160031.328765
    723.971772-0.681780
    733.971772-0.681780
    +

    74 baris × 2 kolom

    +
    +

    Memvisualisasikan hasil pencarian Milvus pada bidang 2d

    Kita akan memplot vektor kueri dengan warna hijau, vektor yang diambil dengan warna merah, dan vektor yang tersisa dengan warna biru.

    +
    import matplotlib.pyplot as plt
    +import seaborn as sns
    +
    +# Extract similar ids from search results
    +similar_ids = [gp["id"] for gp in search_res[0]]
    +
    +df_norm = df_tsne[:-1]
    +
    +df_query = pd.DataFrame(df_tsne.iloc[-1]).T
    +
    +# Filter points based on similar ids
    +similar_points = df_tsne[df_tsne.index.isin(similar_ids)]
    +
    +# Create the plot
    +fig, ax = plt.subplots(figsize=(8, 6))  # Set figsize
    +
    +# Set the style of the plot
    +sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
    +
    +# Plot all points in blue
    +sns.scatterplot(
    +    data=df_tsne, x="TSNE1", y="TSNE2", color="blue", label="All knowledge", ax=ax
    +)
    +
    +# Overlay similar points in red
    +sns.scatterplot(
    +    data=similar_points,
    +    x="TSNE1",
    +    y="TSNE2",
    +    color="red",
    +    label="Similar knowledge",
    +    ax=ax,
    +)
    +
    +sns.scatterplot(
    +    data=df_query, x="TSNE1", y="TSNE2", color="green", label="Query", ax=ax
    +)
    +
    +# Set plot titles and labels
    +plt.title("Scatter plot of knowledge using t-SNE")
    +plt.xlabel("TSNE1")
    +plt.ylabel("TSNE2")
    +
    +# Set axis to be equal
    +plt.axis("equal")
    +
    +# Display the legend
    +plt.legend()
    +
    +# Show the plot
    +plt.show()
    +
    +

    + + png + png

    +

    Seperti yang dapat kita lihat, vektor kueri dekat dengan vektor yang diambil. Meskipun vektor yang diambil tidak berada dalam lingkaran standar dengan radius tetap yang berpusat pada kueri, kita dapat melihat bahwa vektor-vektor tersebut masih sangat dekat dengan vektor kueri pada bidang 2D.

    +

    Menggunakan teknik reduksi dimensi dapat memfasilitasi pemahaman vektor dan pemecahan masalah. Semoga Anda dapat memperoleh pemahaman yang lebih baik tentang vektor melalui tutorial ini.

    diff --git a/localization/v2.5.x/site/id/tutorials/video_similarity_search.json b/localization/v2.5.x/site/id/tutorials/video_similarity_search.json new file mode 100644 index 000000000..c8e52af26 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/video_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Video Similarity Search","anchorList":[{"label":"Pencarian Kemiripan Video","href":"Video-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/tutorials/video_similarity_search.md b/localization/v2.5.x/site/id/tutorials/video_similarity_search.md new file mode 100644 index 000000000..048de75d0 --- /dev/null +++ b/localization/v2.5.x/site/id/tutorials/video_similarity_search.md @@ -0,0 +1,40 @@ +--- +id: video_similarity_search.md +summary: Buat sistem pencarian kemiripan video dengan Milvus. +title: Pencarian Kemiripan Video +--- +

    Pencarian Kemiripan Video

    Tutorial ini mendemonstrasikan cara menggunakan Milvus, basis data vektor sumber terbuka, untuk membangun sistem pencarian kemiripan video.

    + +

    Model ML dan perangkat lunak pihak ketiga yang digunakan meliputi:

    +
      +
    • OpenCV
    • +
    • ResNet-50
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    Saat ini, setelah menonton film atau video yang mereka sukai, orang dapat dengan mudah mengambil tangkapan layar dan membagikan pemikiran mereka dengan memposting di berbagai platform jejaring sosial. Ketika para pengikut melihat tangkapan layar, akan sangat sulit bagi mereka untuk mengetahui film mana yang dimaksud jika nama film tersebut tidak disebutkan secara eksplisit dalam postingan. Untuk mengetahui nama filmnya, orang bisa memanfaatkan sistem pencarian kemiripan video. Dengan menggunakan sistem ini, pengguna dapat mengunggah sebuah gambar dan mendapatkan video atau film yang mengandung frame kunci yang mirip dengan gambar yang diunggah.

    +


    +

    Dalam tutorial ini, Anda akan belajar cara membuat sistem pencarian kemiripan video. Tutorial ini menggunakan sekitar 100 gif animasi di Tumblr untuk membangun sistem. Namun, Anda juga dapat menyiapkan dataset video Anda sendiri. Sistem ini pertama-tama menggunakan OpenCV untuk mengekstrak frame kunci dalam video dan kemudian mendapatkan vektor fitur dari setiap frame kunci menggunakan ResNet-50. Semua vektor disimpan dan dicari di Milvus, yang akan mengembalikan ID vektor yang serupa. Kemudian memetakan ID ke video yang sesuai yang disimpan di MySQL.

    +


    +

    + + video_search + video_search video_search_demovideo_search_demo

    diff --git a/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.json b/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.json new file mode 100644 index 000000000..7afa1be56 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"quick_setup\",​\n dimension=5​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .dimension(5)​\n .build();​\n​\nclient.createCollection(quickSetupReq);​\n​\nGetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(quickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nimport { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"quick_setup\",​\n dimension: 5,​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"dimension\": 5​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"custom_quick_setup\",​\n dimension=5,​\n primary_field_name=\"my_id\",​\n id_type=\"string\",​\n vector_field_name=\"my_vector\",​\n metric_type=\"L2\",​\n auto_id=True,​\n max_length=512​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .dimension(5)​\n .primaryFieldName(\"my_id\")​\n .idType(DataType.VarChar)​\n .maxLength(512)​\n .vectorFieldName(\"my_vector\")​\n .metricType(\"L2\")​\n .autoID(true)​\n .build();​\n​\nclient.createCollection(customQuickSetupReq);​\n​\nGetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(customQuickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"custom_quick_setup\",​\n dimension: 5,​\n primary_field_name: \"my_id\",​\n id_type: \"Varchar\",​\n max_length: 512,​\n vector_field_name: \"my_vector\",​\n metric_type: \"L2\",​\n auto_id: true​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\",​\n \"dimension\": 5,​\n \"primaryFieldName\": \"my_id\",​\n \"idType\": \"VarChar\",​\n \"vectorFieldName\": \"my_vector\",​\n \"metricType\": \"L2\",​\n \"autoId\": true,​\n \"params\": {​\n \"max_length\": \"512\"​\n }​\n}'​\n\n"],"headingContent":"Create Collection Instantly​","anchorList":[{"label":"Membuat Koleksi Secara Instan","href":"Create-Collection-Instantly​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Penyiapan Cepat","href":"Quick-Setup​","type":2,"isActive":false},{"label":"Penyiapan Cepat dengan Bidang Khusus","href":"Quick-Setup-with-Custom-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.md b/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.md new file mode 100644 index 000000000..2c02a36b7 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/create-collection-instantly.md @@ -0,0 +1,341 @@ +--- +id: create-collection-instantly.md +title: Buat Koleksi Secara Instan +--- +

    Membuat Koleksi Secara Instan

    Anda dapat membuat koleksi secara instan dengan mengatur nama dan dimensi bidang vektor. Milvus secara otomatis mengindeks bidang vektor dan memuat koleksi pada saat pembuatan. Halaman ini mendemonstrasikan cara membuat koleksi secara instan dengan pengaturan default.

    +

    Gambaran Umum

    Koleksi adalah sebuah tabel dua dimensi dengan kolom tetap dan baris yang bervariasi. Setiap kolom mewakili sebuah field, dan setiap baris mewakili sebuah entitas. Sebuah skema diperlukan untuk mengimplementasikan manajemen data struktural tersebut. Setiap entitas yang akan dimasukkan harus memenuhi batasan yang ditentukan dalam skema.

    +

    Aplikasi AIGC biasanya menggunakan basis data vektor sebagai basis pengetahuan untuk mengelola data yang dihasilkan selama interaksi antara pengguna dan Model Bahasa Besar (Large Language Models/LLM). Basis pengetahuan tersebut hampir serupa. Untuk mempercepat penggunaan cluster Milvus dalam skenario seperti itu, tersedia metode instan bagi Anda untuk membuat koleksi hanya dengan dua parameter, yaitu nama koleksi dan dimensi bidang vektor.

    +

    Ketika Anda membuat koleksi secara instan dengan pengaturan default, pengaturan berikut ini berlaku.

    +
      +
    • Bidang utama dan bidang vektor ditambahkan ke skema(id dan vektor).

    • +
    • Bidang utama menerima bilangan bulat dan menonaktifkan AutoId.

    • +
    • Bidang vektor menerima penyematan vektor mengambang.

    • +
    • AUTOINDEX digunakan untuk membuat indeks pada bidang vektor.

    • +
    • COSINE digunakan untuk mengukur kemiripan antara penyematan vektor.

    • +
    • Bidang dinamis cadangan bernama $meta diaktifkan untuk menyimpan bidang yang tidak ditentukan skema dan nilainya dalam pasangan kunci-nilai.

    • +
    • Koleksi ini secara otomatis dimuat pada saat pembuatan.

    • +
    +

    Untuk detail mengenai terminologi di atas, lihat Penjelasan Koleksi.

    +

    Perlu dicatat bahwa membuat koleksi secara instan dengan pengaturan default tidak cocok untuk semua skenario. Anda disarankan untuk membiasakan diri dengan prosedur pembuatan koleksi yang umum sehingga Anda dapat memperoleh pemahaman yang lebih baik tentang kemampuan Milvus.

    +

    Penyiapan Cepat

    Dengan cara ini, Anda dapat membuat koleksi secara instan hanya dengan nama koleksi dan dimensi bidang vektor.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="quick_setup",​
    +    dimension=5​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .dimension(5)​
    +        .build();​
    +​
    +client.createCollection(quickSetupReq);​
    +​
    +GetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(quickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "quick_setup",​
    +    dimension: 5,​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "dimension": 5​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    Penyiapan Cepat dengan Bidang Khusus

    Jika jenis metrik, nama field, dan tipe data default tidak sesuai dengan kebutuhan Anda, Anda dapat menyesuaikan pengaturan ini sebagai berikut.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="custom_quick_setup",​
    +    dimension=5,​
    +    primary_field_name="my_id",​
    +    id_type="string",​
    +    vector_field_name="my_vector",​
    +    metric_type="L2",​
    +    auto_id=True,​
    +    max_length=512​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .dimension(5)​
    +        .primaryFieldName("my_id")​
    +        .idType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .vectorFieldName("my_vector")​
    +        .metricType("L2")​
    +        .autoID(true)​
    +        .build();​
    +​
    +client.createCollection(customQuickSetupReq);​
    +​
    +GetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(customQuickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "custom_quick_setup",​
    +    dimension: 5,​
    +    primary_field_name: "my_id",​
    +    id_type: "Varchar",​
    +    max_length: 512,​
    +    vector_field_name: "my_vector",​
    +    metric_type: "L2",​
    +    auto_id: true​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup",​
    +    "dimension": 5,​
    +    "primaryFieldName": "my_id",​
    +    "idType": "VarChar",​
    +    "vectorFieldName": "my_vector",​
    +    "metricType": "L2",​
    +    "autoId": true,​
    +    "params": {​
    +        "max_length": "512"​
    +    }​
    +}'​
    +
    +
    +

    Jika koleksi yang dibuat menggunakan dua cara di atas masih belum memenuhi kebutuhan Anda, pertimbangkan untuk mengikuti prosedur di Create Collection.

    diff --git a/localization/v2.5.x/site/id/userGuide/collections/create-collection.json b/localization/v2.5.x/site/id/userGuide/collections/create-collection.json new file mode 100644 index 000000000..4cd84a533 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/create-collection.json @@ -0,0 +1 @@ +{"codeList":["# 3. Create a collection in customized setup mode​\nfrom pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 3.1. Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n​\n# 3.2. Add fields to schema​\nschema.add_field(field_name=\"my_id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"my_vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"my_varchar\", datatype=DataType.VARCHAR, max_length=512)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 3. Create a collection in customized setup mode​\n​\n// 3.1 Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// 3.2 Add fields to schema​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n dim: 5​\n },​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512​\n }​\n]​\n\n","import \"github.com/milvus-io/milvus/client/v2/entity\"​\n​\nschema := entity.NewSchema().WithDynamicFieldEnabled(true).​\n WithField(entity.NewField().WithName(\"my_id\").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​\n WithField(entity.NewField().WithName(\"my_vector\").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​\n WithField(entity.NewField().WithName(\"my_varchar\").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","# 3.3. Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# 3.4. Add indexes​\nindex_params.add_index(​\n field_name=\"my_id\",​\n index_type=\"STL_SORT\"​\n)​\n​\nindex_params.add_index(​\n field_name=\"my_vector\", ​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\n// 3.3 Prepare index parameters​\nIndexParam indexParamForIdField = IndexParam.builder()​\n .fieldName(\"my_id\")​\n .indexType(IndexParam.IndexType.STL_SORT)​\n .build();​\n​\nIndexParam indexParamForVectorField = IndexParam.builder()​\n .fieldName(\"my_vector\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForIdField);​\nindexParams.add(indexParamForVectorField);​\n\n","// 3.2 Prepare index parameters​\nconst index_params = [{​\n field_name: \"my_id\",​\n index_type: \"STL_SORT\"​\n},{​\n field_name: \"my_vector\",​\n index_type: \"AUTOINDEX\",​\n metric_type: \"COSINE\"​\n}]​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n \"github.com/milvus-io/milvus/client/v2/index\"​\n)​\n​\nindexOptions := []client.CreateIndexOption{​\n client.NewCreateIndexOption(collectionName, \"my_vector\", index.NewAutoIndex(entity.COSINE)).WithIndexName(\"my_vector\"),​\n client.NewCreateIndexOption(collectionName, \"my_id\", index.NewSortedIndex()).WithIndexName(\"my_id\"),​\n}​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"my_vector\",​\n \"metricType\": \"COSINE\",​\n \"indexName\": \"my_vector\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"my_id\",​\n \"indexName\": \"my_id\",​\n \"indexType\": \"STL_SORT\"​\n }​\n ]'​\n\n","# 3.5. Create a collection with the index loaded simultaneously​\nclient.create_collection(​\n collection_name=\"customized_setup_1\",​\n schema=schema,​\n index_params=index_params​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n// 3.4 Create a collection with schema and index parameters​\nCreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\n​\nclient.createCollection(customizedSetupReq1);​\n​\n// 3.5 Get load state of the collection​\nGetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq1);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// true​\n\n","// 3.3 Create a collection with fields and index parameters​\nres = await client.createCollection({​\n collection_name: \"customized_setup_1\",​\n fields: fields,​\n index_params: index_params,​\n})​\n​\nconsole.log(res.error_code) ​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_1\", schema).​\n WithIndexOptions(indexOptions...),​\n)​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_1\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# 3.6. Create a collection and index it separately​\nclient.create_collection(​\n collection_name=\"customized_setup_2\",​\n schema=schema,​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 3.6 Create a collection and index it separately​\nCreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .collectionSchema(schema)​\n .build();​\n​\nclient.createCollection(customizedSetupReq2);​\n​\nGetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n ​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq2);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// false​\n\n","// 3.4 Create a collection and index it seperately​\nres = await client.createCollection({​\n collection_name: \"customized_setup_2\",​\n fields: fields,​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_2\", schema))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\",​\n \\\"schema\\\": $schema​\n}\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\"​\n}\"​\n\n","# With shard number​\nclient.create_collection(​\n collection_name=\"customized_setup_3\",​\n schema=schema,​\n # highlight-next-line​\n num_shards=1​\n)​\n\n","// With shard number​\nCreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_3\")​\n .collectionSchema(collectionSchema)​\n // highlight-next-line​\n .numShards(1)​\n .build();​\nclient.createCollection(customizedSetupReq3);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_3\",​\n schema: schema,​\n // highlight-next-line​\n shards_num: 1​\n}​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_3\", schema).WithShardNum(1))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"shardsNum\": 1​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_3\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With mmap​\nclient.create_collection(​\n collection_name=\"customized_setup_4\",​\n schema=schema,​\n # highlight-next-line​\n enable_mmap=False​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With MMap​\nCreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_4\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.MMAP_ENABLED, \"false\")​\n .build();​\nclient.createCollection(customizedSetupReq4);​\n\n","client.create_collection({​\n collection_name: \"customized_setup_4\",​\n schema: schema,​\n properties: {​\n 'mmap.enabled': true,​\n },​\n})​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_4\", schema).WithProperty(common.MmapEnabledKey, true))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","# Currently not available for REST\n\n","# With TTL​\nclient.create_collection(​\n collection_name=\"customized_setup_5\",​\n schema=schema,​\n # highlight-start​\n properties={​\n \"collection.ttl.seconds\": 86400​\n }​\n # highlight-end​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With TTL​\nCreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_5\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.TTL_SECONDS, \"86400\")​\n .build();​\nclient.createCollection(customizedSetupReq5);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_5\",​\n schema: schema,​\n // highlight-start​\n properties: {​\n \"collection.ttl.seconds\": 86400​\n }​\n // highlight-end​\n}​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr = cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_5\", schema).​\n WithProperty(common.CollectionTTLConfigKey, 86400)) // TTL in seconds​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"ttlSeconds\": 86400​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_5\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With consistency level​\nclient.create_collection(​\n collection_name=\"customized_setup_6\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Bounded\",​\n)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\n​\n// With consistency level​\nCreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_6\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nclient.createCollection(customizedSetupReq6);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_6\",​\n schema: schema,​\n // highlight-next​\n consistency_level: \"Bounded\",​\n // highlight-end​\n}​\n​\nclient.createCollection(createCollectionReq);​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_6\", schema).​\n WithConsistencyLevel(entity.ClBounded))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_6\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n"],"headingContent":"Create Collection​","anchorList":[{"label":"Membuat Koleksi","href":"Create-Collection​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat Skema","href":"Create-Schema​","type":2,"isActive":false},{"label":"(Opsional) Tetapkan Parameter Indeks","href":"Optional-Set-Index-Parameters​","type":2,"isActive":false},{"label":"Membuat Koleksi","href":"Create-Collection​","type":2,"isActive":false},{"label":"Mengatur Properti Koleksi","href":"Set-Collection-Properties​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/create-collection.md b/localization/v2.5.x/site/id/userGuide/collections/create-collection.md new file mode 100644 index 000000000..9bbdcbafd --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/create-collection.md @@ -0,0 +1,760 @@ +--- +id: create-collection.md +title: Membuat Koleksi +--- +

    Membuat Koleksi

    Anda dapat membuat koleksi dengan menentukan skema, parameter indeks, jenis metrik, dan apakah akan dimuat pada saat pembuatan. Halaman ini memperkenalkan cara membuat koleksi dari awal.

    +

    Gambaran Umum

    Koleksi adalah tabel dua dimensi dengan kolom tetap dan baris varian. Setiap kolom mewakili sebuah field, dan setiap baris mewakili sebuah entitas. Sebuah skema diperlukan untuk mengimplementasikan manajemen data struktural tersebut. Setiap entitas yang akan disisipkan harus memenuhi batasan yang ditentukan dalam skema.

    +

    Anda dapat menentukan setiap aspek koleksi, termasuk skema, parameter indeks, jenis metrik, dan apakah akan dimuat pada saat pembuatan untuk memastikan bahwa koleksi tersebut sepenuhnya memenuhi kebutuhan Anda.

    +

    Untuk membuat koleksi, Anda perlu

    + +

    Membuat Skema

    Skema mendefinisikan struktur data koleksi. Saat membuat koleksi, Anda perlu merancang skema berdasarkan kebutuhan Anda. Untuk detailnya, lihat Penjelasan Skema.

    +

    Cuplikan kode berikut ini membuat skema dengan bidang dinamis yang diaktifkan dan tiga bidang wajib bernama my_id, my_vector, dan my_varchar.

    +
    +

    Anda dapat menetapkan nilai default untuk bidang skalar apa pun dan menjadikannya dapat dinihilkan. Untuk detailnya, lihat Nullable & Default.

    +
    + +
    # 3. Create a collection in customized setup mode​
    +from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 3.1. Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +​
    +# 3.2. Add fields to schema​
    +schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 3. Create a collection in customized setup mode​
    +​
    +// 3.1 Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// 3.2 Add fields to schema​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "my_vector",​
    +        data_type: DataType.FloatVector,​
    +        dim: 5​
    +    },​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512​
    +    }​
    +]​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2/entity"​
    +​
    +schema := entity.NewSchema().WithDynamicFieldEnabled(true).​
    +        WithField(entity.NewField().WithName("my_id").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​
    +        WithField(entity.NewField().WithName("my_vector").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​
    +        WithField(entity.NewField().WithName("my_varchar").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    (Opsional) Tetapkan Parameter Indeks

    Membuat indeks pada bidang tertentu akan mempercepat pencarian terhadap bidang tersebut. Indeks mencatat urutan entitas dalam koleksi. Seperti yang ditunjukkan pada cuplikan kode berikut ini, Anda dapat menggunakan metric_type dan index_type untuk memilih cara yang tepat bagi Milvus untuk mengindeks sebuah field dan mengukur kemiripan di antara sematan vektor.

    +

    Di Milvus, Anda dapat menggunakan AUTOINDEX sebagai tipe indeks untuk semua bidang vektor, dan salah satu dari COSINE, L2, dan IP sebagai tipe metrik berdasarkan kebutuhan Anda.

    +

    Seperti yang ditunjukkan pada cuplikan kode di atas, Anda perlu mengatur jenis indeks dan jenis metrik untuk bidang vektor dan hanya jenis indeks untuk bidang skalar. Indeks wajib untuk bidang vektor, dan Anda disarankan untuk membuat indeks pada bidang skalar yang sering digunakan dalam kondisi pemfilteran.

    +

    Untuk detailnya, lihat Indeks.

    + +
    # 3.3. Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# 3.4. Add indexes​
    +index_params.add_index(​
    +    field_name="my_id",​
    +    index_type="STL_SORT"​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="my_vector", ​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +// 3.3 Prepare index parameters​
    +IndexParam indexParamForIdField = IndexParam.builder()​
    +        .fieldName("my_id")​
    +        .indexType(IndexParam.IndexType.STL_SORT)​
    +        .build();​
    +​
    +IndexParam indexParamForVectorField = IndexParam.builder()​
    +        .fieldName("my_vector")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForIdField);​
    +indexParams.add(indexParamForVectorField);​
    +
    +
    +
    // 3.2 Prepare index parameters​
    +const index_params = [{​
    +    field_name: "my_id",​
    +    index_type: "STL_SORT"​
    +},{​
    +    field_name: "my_vector",​
    +    index_type: "AUTOINDEX",​
    +    metric_type: "COSINE"​
    +}]​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +    "github.com/milvus-io/milvus/client/v2/index"​
    +)​
    +​
    +indexOptions := []client.CreateIndexOption{​
    +    client.NewCreateIndexOption(collectionName, "my_vector", index.NewAutoIndex(entity.COSINE)).WithIndexName("my_vector"),​
    +    client.NewCreateIndexOption(collectionName, "my_id", index.NewSortedIndex()).WithIndexName("my_id"),​
    +}​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "my_vector",​
    +            "metricType": "COSINE",​
    +            "indexName": "my_vector",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "my_id",​
    +            "indexName": "my_id",​
    +            "indexType": "STL_SORT"​
    +        }​
    +    ]'​
    +
    +
    +

    Membuat Koleksi

    Jika Anda telah membuat koleksi dengan parameter indeks, Milvus akan secara otomatis memuat koleksi pada saat pembuatannya. Dalam kasus ini, semua bidang yang disebutkan dalam parameter indeks akan diindeks.

    +

    Cuplikan kode berikut ini menunjukkan cara membuat koleksi dengan parameter indeks dan memeriksa status pemuatannya.

    + +
    # 3.5. Create a collection with the index loaded simultaneously​
    +client.create_collection(​
    +    collection_name="customized_setup_1",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +// 3.4 Create a collection with schema and index parameters​
    +CreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +​
    +client.createCollection(customizedSetupReq1);​
    +​
    +// 3.5 Get load state of the collection​
    +GetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq1);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 3.3 Create a collection with fields and index parameters​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_1",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +​
    +console.log(res.error_code)  ​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_1", schema).​
    +    WithIndexOptions(indexOptions...),​
    +)​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_1\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Anda juga dapat membuat koleksi tanpa parameter indeks dan menambahkannya setelahnya. Dalam kasus ini, Milvus tidak memuat koleksi pada saat pembuatannya. Untuk detail tentang cara membuat indeks untuk koleksi yang sudah ada, lihat Penjelasan Indeks.

    +

    Cuplikan kode berikut ini mendemonstrasikan cara membuat koleksi tanpa indeks, dan status pemuatan koleksi tetap tidak dimuat pada saat pembuatannya.

    + +
    # 3.6. Create a collection and index it separately​
    +client.create_collection(​
    +    collection_name="customized_setup_2",​
    +    schema=schema,​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    // 3.6 Create a collection and index it separately​
    +CreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .collectionSchema(schema)​
    +    .build();​
    +​
    +client.createCollection(customizedSetupReq2);​
    +​
    +GetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +        ​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq2);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 3.4 Create a collection and index it seperately​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    fields: fields,​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_2", schema))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\",​
    +    \"schema\": $schema​
    +}"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\"​
    +}"​
    +
    +
    +

    Milvus juga menyediakan cara bagi Anda untuk membuat koleksi secara instan. Untuk detailnya, lihat Membuat Koleksi Secara Instan.

    +

    Mengatur Properti Koleksi

    Anda dapat mengatur properti untuk koleksi yang akan dibuat agar sesuai dengan layanan Anda. Properti yang berlaku adalah sebagai berikut.

    +

    Mengatur Nomor Pecahan

    Pecahan adalah irisan horizontal dari koleksi. Setiap pecahan berhubungan dengan saluran input data. Setiap koleksi memiliki pecahan secara default. Anda dapat mengatur jumlah pecahan yang sesuai saat membuat koleksi berdasarkan keluaran yang diharapkan dan volume data yang akan dimasukkan ke dalam koleksi.

    +

    Dalam kasus yang umum, pertimbangkan untuk meningkatkan jumlah pecahan sebanyak satu setiap kali throughput yang diharapkan meningkat sebesar 500 MB/detik atau volume data yang akan disisipkan meningkat sebesar 100 GB. Saran ini didasarkan pada pengalaman kami sendiri dan mungkin tidak sepenuhnya sesuai dengan skenario aplikasi Anda. Anda dapat menyetel angka ini agar sesuai dengan kebutuhan Anda sendiri atau menggunakan nilai default.

    +

    Cuplikan kode berikut ini menunjukkan cara mengatur nomor pecahan ketika Anda membuat koleksi.

    + +
    # With shard number​
    +client.create_collection(​
    +    collection_name="customized_setup_3",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_shards=1​
    +)​
    +
    +
    +
    // With shard number​
    +CreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_3")​
    +    .collectionSchema(collectionSchema)​
    +    // highlight-next-line​
    +    .numShards(1)​
    +    .build();​
    +client.createCollection(customizedSetupReq3);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_3",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    shards_num: 1​
    +}​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_3", schema).WithShardNum(1))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "shardsNum": 1​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_3\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Mengaktifkan mmap

    Milvus mengaktifkan mmap pada semua koleksi secara default, sehingga Milvus dapat memetakan data lapangan mentah ke dalam memori alih-alih memuatnya secara penuh. Hal ini akan mengurangi jejak memori dan meningkatkan kapasitas koleksi. Untuk detail tentang mmap, lihat Menggunakan mmap.

    + +
    # With mmap​
    +client.create_collection(​
    +    collection_name="customized_setup_4",​
    +    schema=schema,​
    +    # highlight-next-line​
    +    enable_mmap=False​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With MMap​
    +CreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_4")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.MMAP_ENABLED, "false")​
    +        .build();​
    +client.createCollection(customizedSetupReq4);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "customized_setup_4",​
    +    schema: schema,​
    +     properties: {​
    +        'mmap.enabled': true,​
    +     },​
    +})​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_4", schema).WithProperty(common.MmapEnabledKey, true))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    # Currently not available for REST
    +
    +
    +

    Mengatur TTL Koleksi

    Jika sebuah koleksi perlu dihapus untuk periode tertentu, pertimbangkan untuk mengatur Time-To-Live (TTL) dalam hitungan detik. Setelah TTL habis, Milvus akan menghapus entitas di dalam koleksi dan membuang koleksi tersebut. Penghapusan ini bersifat asinkron, yang mengindikasikan bahwa pencarian dan kueri masih dapat dilakukan sebelum penghapusan selesai.

    +

    Cuplikan kode berikut ini mengatur TTL ke satu hari (86400 detik). Anda disarankan untuk menyetel TTL ke beberapa hari minimal.

    + +
    # With TTL​
    +client.create_collection(​
    +    collection_name="customized_setup_5",​
    +    schema=schema,​
    +    # highlight-start​
    +    properties={​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With TTL​
    +CreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_5")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.TTL_SECONDS, "86400")​
    +        .build();​
    +client.createCollection(customizedSetupReq5);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_5",​
    +    schema: schema,​
    +    // highlight-start​
    +    properties: {​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    // highlight-end​
    +}​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err = cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_5", schema).​
    +        WithProperty(common.CollectionTTLConfigKey, 86400)) //  TTL in seconds​
    +if err != nil {​
    +        // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "ttlSeconds": 86400​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_5\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Mengatur Tingkat Konsistensi

    Saat membuat koleksi, Anda dapat mengatur tingkat konsistensi untuk pencarian dan kueri di dalam koleksi. Anda juga dapat mengubah tingkat konsistensi koleksi selama pencarian atau kueri tertentu.

    + +
    # With consistency level​
    +client.create_collection(​
    +    collection_name="customized_setup_6",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Bounded",​
    +)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +​
    +// With consistency level​
    +CreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_6")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +client.createCollection(customizedSetupReq6);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_6",​
    +    schema: schema,​
    +    // highlight-next​
    +    consistency_level: "Bounded",​
    +    // highlight-end​
    +}​
    +​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_6", schema).​
    +    WithConsistencyLevel(entity.ClBounded))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_6\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Untuk mengetahui lebih lanjut tentang tingkat konsistensi, lihat Tingkat Konsistensi.

    +

    Mengaktifkan Bidang Dinamis

    Bidang dinamis dalam koleksi adalah bidang JavaScript Object Notation (JSON) yang dicadangkan bernama $meta. Setelah Anda mengaktifkan bidang ini, Milvus menyimpan semua bidang yang tidak ditentukan skema yang dibawa dalam setiap entitas dan nilainya sebagai pasangan kunci-nilai dalam bidang yang dicadangkan.

    +

    Untuk detail mengenai cara menggunakan bidang dinamis, lihat Bidang Dinamis.

    diff --git a/localization/v2.5.x/site/id/userGuide/collections/drop-collection.json b/localization/v2.5.x/site/id/userGuide/collections/drop-collection.json new file mode 100644 index 000000000..744b486e9 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/drop-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.drop_collection(​\n collection_name=\"customized_setup_2\"​\n)​\n\n","import io.milvus.v2.service.collection.request.DropCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nclient.dropCollection(dropQuickSetupParam);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 10. Drop the collection​\nres = await client.dropCollection({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.DropCollection(ctx, client.NewDropCollectionOption(\"customized_setup_2\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Drop Collection​","anchorList":[{"label":"Jatuhkan Koleksi","href":"Drop-Collection​","type":1,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/drop-collection.md b/localization/v2.5.x/site/id/userGuide/collections/drop-collection.md new file mode 100644 index 000000000..77676765f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/drop-collection.md @@ -0,0 +1,138 @@ +--- +id: drop-collection.md +title: Jatuhkan Koleksi +--- +

    Jatuhkan Koleksi

    Anda dapat membuang koleksi jika sudah tidak diperlukan lagi.

    +

    Contoh

    Cuplikan kode berikut ini mengasumsikan bahwa Anda memiliki koleksi bernama customized_setup_2.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.drop_collection(​
    +    collection_name="customized_setup_2"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DropCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +client.dropCollection(dropQuickSetupParam);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 10. Drop the collection​
    +res = await client.dropCollection({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.DropCollection(ctx, client.NewDropCollectionOption("customized_setup_2"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/collections/load-and-release.json b/localization/v2.5.x/site/id/userGuide/collections/load-and-release.json new file mode 100644 index 000000000..9fb84b560 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/load-and-release.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 7. Load the collection​\nclient.load_collection(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.LoadCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Load the collection​\nres = await client.loadCollection({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\ndefer cli.Close(ctx)​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.load_collection(​\n collection_name=\"customized_setup_1\",​\n # highlight-next-line​\n load_fields=[\"my_id\", \"my_vector\"] # Load only the specified fields​\n skip_load_dynamic_field=True # Skip loading the dynamic field​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .loadFields(Arrays.asList(\"my_id\", \"my_vector\"))​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n\n","await client.load_collection({​\n collection_name: \"customized_setup_1\",​\n load_fields: [\"my_id\", \"my_vector\"], // Load only the specified fields​\n skip_load_dynamic_field: true //Skip loading the dynamic field​\n});​\n​\nconst loadState = client.getCollectionLoadState({​\n collection_name: \"customized_setup_1\",​\n})​\n​\nconsole.log(loadState);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\").​\n WithLoadFields(\"my_id\", \"my_vector\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","# REST 缺失​\n\n","# 8. Release the collection​\nclient.release_collection(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​\n​\n​\n// 8. Release the collection​\nReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nclient.releaseCollection(releaseCollectionReq);​\n​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// false​\n\n","// 8. Release the collection​\nres = await client.releaseCollection({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import (​\n \"context\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nerr := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption(\"custom_quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n"],"headingContent":"Load & Release​","anchorList":[{"label":"Memuat & Melepaskan","href":"Load--Release​","type":1,"isActive":false},{"label":"Memuat Koleksi","href":"Load-Collection​","type":2,"isActive":false},{"label":"Memuat Bidang Tertentu","href":"Load-Specific-Fields​","type":2,"isActive":false},{"label":"Melepaskan Koleksi","href":"Release-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/load-and-release.md b/localization/v2.5.x/site/id/userGuide/collections/load-and-release.md new file mode 100644 index 000000000..17b35cce7 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/load-and-release.md @@ -0,0 +1,411 @@ +--- +id: load-and-release.md +title: Muat & Lepas +--- +

    Memuat & Melepaskan

    Memuat koleksi merupakan prasyarat untuk melakukan pencarian dan kueri kesamaan dalam koleksi. Halaman ini berfokus pada prosedur untuk memuat dan melepaskan koleksi.

    +

    Memuat Koleksi

    Ketika Anda memuat koleksi, Milvus memuat file indeks dan data mentah dari semua bidang ke dalam memori untuk respons cepat terhadap pencarian dan kueri. Entitas yang dimasukkan setelah koleksi dimuat akan diindeks dan dimuat secara otomatis.

    +

    Cuplikan kode berikut ini menunjukkan cara memuat koleksi.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 7. Load the collection​
    +client.load_collection(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.LoadCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Load the collection​
    +res = await client.loadCollection({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +defer cli.Close(ctx)​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Memuat Bidang Tertentu

    Milvus hanya dapat memuat bidang yang terlibat dalam pencarian dan kueri, sehingga mengurangi penggunaan memori dan meningkatkan kinerja pencarian.

    +

    Cuplikan kode berikut ini mengasumsikan bahwa Anda telah membuat koleksi bernama customized_setup_2, dan ada dua field bernama my_id dan my_vector di dalam koleksi tersebut.

    + +
    client.load_collection(​
    +    collection_name="customized_setup_1",​
    +    # highlight-next-line​
    +    load_fields=["my_id", "my_vector"] # Load only the specified fields​
    +    skip_load_dynamic_field=True # Skip loading the dynamic field​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    // 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .loadFields(Arrays.asList("my_id", "my_vector"))​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +
    +
    +
    await client.load_collection({​
    +  collection_name: "customized_setup_1",​
    +  load_fields: ["my_id", "my_vector"], // Load only the specified fields​
    +  skip_load_dynamic_field: true //Skip loading the dynamic field​
    +});​
    +​
    +const loadState = client.getCollectionLoadState({​
    +    collection_name: "customized_setup_1",​
    +})​
    +​
    +console.log(loadState);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1").​
    +    WithLoadFields("my_id", "my_vector"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # REST 缺失​
    +
    +
    +

    Jika Anda memilih untuk memuat bidang tertentu, perlu dicatat bahwa hanya bidang yang disertakan dalam load_fields yang dapat digunakan sebagai filter dan bidang keluaran dalam pencarian dan kueri. Anda harus selalu menyertakan nama bidang utama dan setidaknya satu bidang vektor di load_fields.

    +

    Anda juga dapat menggunakan skip_load_dynamic_field untuk menentukan apakah akan memuat bidang dinamis. Bidang dinamis adalah bidang JSON yang dicadangkan bernama $meta dan menyimpan semua bidang yang tidak ditentukan skema dan nilainya dalam pasangan kunci-nilai. Saat memuat bidang dinamis, semua kunci dalam bidang dimuat dan tersedia untuk pemfilteran dan keluaran. Jika semua kunci dalam bidang dinamis tidak terlibat dalam pemfilteran dan keluaran metadata, setel skip_load_dynamic_field ke True.

    +

    Untuk memuat lebih banyak bidang setelah koleksi dimuat, Anda harus melepaskan koleksi terlebih dahulu untuk menghindari kemungkinan kesalahan yang disebabkan oleh perubahan indeks.

    +

    Melepaskan Koleksi

    Pencarian dan kueri adalah operasi yang memakan banyak memori. Untuk menghemat biaya, Anda disarankan untuk melepaskan koleksi yang sedang tidak digunakan.

    +

    Cuplikan kode berikut ini menunjukkan cara melepaskan koleksi.

    + +
    # 8. Release the collection​
    +client.release_collection(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​
    +​
    +​
    +// 8. Release the collection​
    +ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +client.releaseCollection(releaseCollectionReq);​
    +​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 8. Release the collection​
    +res = await client.releaseCollection({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +err := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption("custom_quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.json b/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.json new file mode 100644 index 000000000..85a5c89a1 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 9. Manage aliases​\n# 9.1. Create aliases​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"bob\"​\n)​\n​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"alice\"​\n)​\n\n","import io.milvus.v2.service.utility.request.CreateAliasReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 9. Manage aliases​\n​\n// 9.1 Create alias​\nCreateAliasReq createAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"bob\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n​\ncreateAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 9. Manage aliases​\n// 9.1 Create aliases​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","# 9.2. List aliases​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\",​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.ListAliasesReq;​\nimport io.milvus.v2.service.utility.response.ListAliasResp;​\n​\n// 9.2 List alises​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob, alice]​\n\n","// 9.2 List aliases​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob', 'alice' ]​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"bob\",​\n# \"alice\"​\n# ]​\n# }​\n\n","# 9.3. Describe aliases​\nres = client.describe_alias(​\n alias=\"bob\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"alias\": \"bob\",​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.DescribeAliasReq;​\nimport io.milvus.v2.service.utility.response.DescribeAliasResp;​\n​\n// 9.3 Describe alias​\nDescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​\n .alias(\"bob\")​\n .build();​\n​\nDescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​\n​\nSystem.out.println(describeAliasRes);​\n​\n// Output:​\n// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​\n\n","// 9.3 Describe aliases​\nres = await client.describeAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// {​\n// status: {​\n// extra_info: {},​\n// error_code: 'Success',​\n// reason: '',​\n// code: 0,​\n// retriable: false,​\n// detail: ''​\n// },​\n// db_name: 'default',​\n// alias: 'bob',​\n// collection: 'customized_setup_2'​\n// }​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n","# 9.4 Reassign aliases to other collections​\nclient.alter_alias(​\n collection_name=\"customized_setup_1\",​\n alias=\"alice\"​\n)​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_1\",​\n# \"db_name\": \"default\"​\n# }​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.AlterAliasReq;​\n​\n// 9.4 Reassign alias to other collections​\nAlterAliasReq alterAliasReq = AlterAliasReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.alterAlias(alterAliasReq);​\n​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\nlistAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nlistAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob]​\n\n","// 9.4 Reassign aliases to other collections​\nres = await client.alterAlias({​\n collection_name: \"customized_setup_1\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'alice' ]​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob' ]​\n// ​\n​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"alice\",​\n# \"collectionName\": \"customized_setup_1\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n"],"headingContent":"Manage Aliases​","anchorList":[{"label":"Kelola Alias","href":"Manage-Aliases​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat Alias","href":"Create-Alias​","type":2,"isActive":false},{"label":"Membuat Daftar Alias","href":"List-Aliases​","type":2,"isActive":false},{"label":"Mendeskripsikan Alias","href":"Describe-Alias​","type":2,"isActive":false},{"label":"Mengubah Alias","href":"Alter-Alias​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.md b/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.md new file mode 100644 index 000000000..20bc56170 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-aliases.md @@ -0,0 +1,542 @@ +--- +id: manage-aliases.md +title: Kelola Alias +--- +

    Kelola Alias

    Milvus menyediakan kemampuan manajemen alias. Halaman ini mendemonstrasikan prosedur untuk membuat, mendaftarkan, mengubah, dan menghapus alias.

    +

    Gambaran Umum

    Anda dapat membuat alias untuk koleksi Anda. Sebuah koleksi dapat memiliki beberapa alias, namun koleksi tidak dapat berbagi alias.

    +

    Setelah menerima permintaan terhadap sebuah koleksi, Milvus akan mencari lokasi koleksi berdasarkan nama yang diberikan. Jika koleksi dengan nama yang diberikan tidak ada, Milvus akan terus mencari nama yang diberikan sebagai nama alias. Anda dapat menggunakan alias koleksi untuk menyesuaikan kode Anda dengan skenario yang berbeda.

    +

    Membuat Alias

    Cuplikan kode berikut ini mendemonstrasikan cara membuat alias untuk sebuah koleksi.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 9. Manage aliases​
    +# 9.1. Create aliases​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="bob"​
    +)​
    +​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="alice"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.utility.request.CreateAliasReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 9. Manage aliases​
    +​
    +// 9.1 Create alias​
    +CreateAliasReq createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("bob")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +​
    +createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 9. Manage aliases​
    +// 9.1 Create aliases​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    Membuat Daftar Alias

    Cuplikan kode berikut ini mendemonstrasikan prosedur untuk membuat daftar alias yang dialokasikan ke koleksi tertentu.

    + +
    # 9.2. List aliases​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob",​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.ListAliasesReq;​
    +import io.milvus.v2.service.utility.response.ListAliasResp;​
    +​
    +// 9.2 List alises​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob, alice]​
    +
    +
    +
    // 9.2 List aliases​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob', 'alice' ]​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "bob",​
    +#         "alice"​
    +#     ]​
    +# }​
    +
    +
    +

    Mendeskripsikan Alias

    Potongan kode berikut ini mendeskripsikan alias tertentu secara detail, termasuk nama koleksi yang telah dialokasikan.

    + +
    # 9.3. Describe aliases​
    +res = client.describe_alias(​
    +    alias="bob"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "alias": "bob",​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.DescribeAliasReq;​
    +import io.milvus.v2.service.utility.response.DescribeAliasResp;​
    +​
    +// 9.3 Describe alias​
    +DescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​
    +    .alias("bob")​
    +    .build();​
    +​
    +DescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​
    +​
    +System.out.println(describeAliasRes);​
    +​
    +// Output:​
    +// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​
    +
    +
    +
    // 9.3 Describe aliases​
    +res = await client.describeAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// {​
    +//   status: {​
    +//     extra_info: {},​
    +//     error_code: 'Success',​
    +//     reason: '',​
    +//     code: 0,​
    +//     retriable: false,​
    +//     detail: ''​
    +//   },​
    +//   db_name: 'default',​
    +//   alias: 'bob',​
    +//   collection: 'customized_setup_2'​
    +// }​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    +

    Mengubah Alias

    Anda dapat mengalokasikan ulang alias yang telah dialokasikan ke koleksi tertentu ke koleksi lain.

    + +
    # 9.4 Reassign aliases to other collections​
    +client.alter_alias(​
    +    collection_name="customized_setup_1",​
    +    alias="alice"​
    +)​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_1",​
    +#     "db_name": "default"​
    +# }​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.AlterAliasReq;​
    +​
    +// 9.4 Reassign alias to other collections​
    +AlterAliasReq alterAliasReq = AlterAliasReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.alterAlias(alterAliasReq);​
    +​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob]​
    +
    +
    +
    // 9.4 Reassign aliases to other collections​
    +res = await client.alterAlias({​
    +    collection_name: "customized_setup_1",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'alice' ]​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob' ]​
    +// ​
    +​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "alice",​
    +#         "collectionName": "customized_setup_1",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-collections.json b/localization/v2.5.x/site/id/userGuide/collections/manage-collections.json new file mode 100644 index 000000000..b9275a7f6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-collections.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Collection Explained​","anchorList":[{"label":"Penjelasan Koleksi","href":"Collection-Explained​","type":1,"isActive":false},{"label":"Koleksi","href":"Collection​","type":2,"isActive":false},{"label":"Skema dan Field","href":"Schema-and-Fields​","type":2,"isActive":false},{"label":"Kunci utama dan Identitas Otomatis","href":"Primary-key-and-AutoId​","type":2,"isActive":false},{"label":"Indeks","href":"Index​","type":2,"isActive":false},{"label":"Entitas","href":"Entity​","type":2,"isActive":false},{"label":"Memuat dan Melepaskan","href":"Load-and-Release​","type":2,"isActive":false},{"label":"Pencarian dan Kueri","href":"Search-and-Query​","type":2,"isActive":false},{"label":"Partisi","href":"Partition​","type":2,"isActive":false},{"label":"Pecahan","href":"Shard​","type":2,"isActive":false},{"label":"Alias","href":"Alias​","type":2,"isActive":false},{"label":"Fungsi","href":"Function​","type":2,"isActive":false},{"label":"Tingkat Konsistensi","href":"Consistency-Level​","type":2,"isActive":false},{"label":"Batasan","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-collections.md b/localization/v2.5.x/site/id/userGuide/collections/manage-collections.md new file mode 100644 index 000000000..5082ac032 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-collections.md @@ -0,0 +1,272 @@ +--- +id: manage-collections.md +title: Penjelasan Koleksi +--- +

    Penjelasan Koleksi

    Di Milvus, Anda dapat membuat beberapa koleksi untuk mengelola data Anda, dan memasukkan data Anda sebagai entitas ke dalam koleksi. Koleksi dan entitas mirip dengan tabel dan record dalam database relasional. Halaman ini membantu anda untuk mempelajari tentang koleksi dan konsep-konsep terkait.

    +

    Koleksi

    Koleksi adalah tabel dua dimensi dengan kolom tetap dan baris yang bervariasi. Setiap kolom mewakili sebuah field, dan setiap baris mewakili sebuah entitas.

    +

    Bagan berikut ini menunjukkan sebuah koleksi dengan delapan kolom dan enam entitas.

    +

    + + Collection explained + Koleksi dijelaskan

    +

    Skema dan Field

    Ketika mendeskripsikan sebuah objek, kita biasanya menyebutkan atributnya, seperti ukuran, berat, dan posisi. Anda dapat menggunakan atribut-atribut ini sebagai field dalam koleksi. Setiap field memiliki berbagai properti yang membatasi, seperti tipe data dan dimensi field vektor. Anda dapat membentuk skema koleksi dengan membuat bidang dan menentukan urutannya. Untuk kemungkinan tipe data yang dapat diterapkan, lihat Penjelasan Skema.

    +

    Anda harus menyertakan semua bidang yang ditentukan skema dalam entitas yang akan disisipkan. Untuk membuat beberapa di antaranya opsional, pertimbangkan

    +
      +
    • Membuatnya dapat dinolkan atau menetapkan nilai default

      +

      Untuk detail tentang cara membuat bidang dapat dinullkan atau menetapkan nilai default, lihat Nullable & Default.

    • +
    • Mengaktifkan bidang dinamis

      +

      Untuk detail tentang cara mengaktifkan dan menggunakan bidang dinamis, lihat Bidang Dinamis.

    • +
    +

    Kunci utama dan Identitas Otomatis

    Mirip dengan field utama dalam database relasional, sebuah koleksi memiliki field utama untuk membedakan suatu entitas dengan entitas lainnya. Setiap nilai dalam field utama bersifat unik secara global dan berhubungan dengan satu entitas tertentu.

    +

    Seperti yang ditunjukkan pada bagan di atas, field bernama id berfungsi sebagai field utama, dan ID 0 pertama berhubungan dengan entitas berjudul Tingkat Kematian Virus Corona Tidak Penting. Tidak akan ada entitas lain yang memiliki field utama 0.

    +

    Bidang utama hanya menerima bilangan bulat atau string. Saat memasukkan entitas, Anda harus menyertakan nilai field utama secara default. Namun, jika Anda telah mengaktifkan AutoId pada saat pembuatan koleksi, Milvus akan menghasilkan nilai-nilai tersebut pada saat penyisipan data. Dalam kasus seperti itu, kecualikan nilai field utama dari entitas yang akan dimasukkan.

    +

    Untuk informasi lebih lanjut, silakan lihat Bidang Utama & AutoID.

    +

    Indeks

    Membuat indeks pada field tertentu dapat meningkatkan efisiensi pencarian. Anda disarankan untuk membuat indeks untuk semua bidang yang diandalkan oleh layanan Anda, di antaranya indeks pada bidang vektor adalah wajib.

    +

    Entitas

    Entitas adalah rekaman data yang memiliki kumpulan bidang yang sama dalam koleksi. Nilai-nilai di semua bidang pada baris yang sama membentuk sebuah entitas.

    +

    Anda dapat memasukkan entitas sebanyak yang Anda butuhkan ke dalam koleksi. Namun, seiring bertambahnya jumlah entitas, ukuran memori yang dibutuhkan juga bertambah, sehingga memengaruhi kinerja pencarian.

    +

    Untuk informasi lebih lanjut, lihat Penjelasan Skema.

    +

    Memuat dan Melepaskan

    Memuat koleksi adalah prasyarat untuk melakukan pencarian kesamaan dan kueri dalam koleksi. Ketika Anda memuat koleksi, Milvus memuat semua berkas indeks dan data mentah di setiap bidang ke dalam memori untuk respons cepat terhadap pencarian dan kueri.

    +

    Pencarian dan kueri adalah operasi yang memakan banyak memori. Untuk menghemat biaya, Anda disarankan untuk melepaskan koleksi yang sedang tidak digunakan.

    +

    Untuk detail lebih lanjut, lihat Memuat & Melepaskan.

    +

    Pencarian dan Kueri

    Setelah Anda membuat indeks dan memuat koleksi, Anda dapat memulai pencarian kemiripan dengan memasukkan satu atau beberapa vektor kueri. Misalnya, ketika menerima representasi vektor kueri Anda yang dibawa dalam permintaan pencarian, Milvus menggunakan jenis metrik yang ditentukan untuk mengukur kemiripan antara vektor kueri dan vektor yang ada di koleksi target sebelum mengembalikan vektor yang secara semantik mirip dengan kueri.

    +

    Anda juga dapat menyertakan pemfilteran metadata dalam penelusuran dan kueri untuk meningkatkan relevansi hasil. Perhatikan bahwa, kondisi pemfilteran metadata bersifat wajib dalam kueri, tetapi opsional dalam penelusuran.

    +

    Untuk detail tentang jenis metrik yang berlaku, lihat Jenis Metrik.

    +

    Untuk informasi lebih lanjut tentang pencarian dan kueri, lihat artikel di bab Pencarian & Perangkingan, di antaranya, fitur-fitur dasar.

    + +

    Selain itu, Milvus juga menyediakan perangkat tambahan untuk meningkatkan kinerja dan efisiensi pencarian. Fitur-fitur ini dinonaktifkan secara default, dan Anda dapat mengaktifkan dan menggunakannya sesuai dengan kebutuhan layanan Anda. Fitur-fitur tersebut adalah

    + +

    Partisi

    Partisi adalah himpunan bagian dari koleksi, yang berbagi himpunan bidang yang sama dengan koleksi induknya, masing-masing berisi himpunan bagian entitas.

    +

    Dengan mengalokasikan entitas ke dalam partisi yang berbeda, Anda dapat membuat grup entitas. Anda dapat melakukan pencarian dan kueri di partisi tertentu agar Milvus mengabaikan entitas di partisi lain, dan meningkatkan efisiensi pencarian.

    +

    Untuk detailnya, lihat Mengelola Partisi.

    +

    Pecahan

    Pecahan adalah irisan horisontal dari sebuah koleksi. Setiap pecahan berhubungan dengan saluran input data. Setiap koleksi memiliki pecahan secara default. Anda dapat mengatur jumlah pecahan yang sesuai saat membuat koleksi berdasarkan keluaran yang diharapkan dan volume data yang akan dimasukkan ke dalam koleksi.

    +

    Untuk detail tentang cara mengatur nomor pecahan, lihat Membuat Koleksi.

    +

    Alias

    Anda dapat membuat nama alias untuk koleksi Anda. Sebuah koleksi dapat memiliki beberapa alias, namun koleksi tidak dapat berbagi alias. Setelah menerima permintaan terhadap sebuah koleksi, Milvus akan mencari lokasi koleksi berdasarkan nama yang diberikan. Jika koleksi dengan nama yang diberikan tidak ada, Milvus akan terus mencari nama yang diberikan sebagai nama alias. Anda dapat menggunakan alias koleksi untuk menyesuaikan kode Anda dengan skenario yang berbeda.

    +

    Untuk lebih jelasnya, lihat Mengelola alias.

    +

    Fungsi

    Anda dapat mengatur fungsi bagi Milvus untuk mendapatkan bidang pada saat pembuatan koleksi. Sebagai contoh, fungsi pencarian teks lengkap menggunakan fungsi yang ditentukan pengguna untuk mendapatkan bidang vektor jarang dari bidang varka tertentu. Untuk informasi lebih lanjut mengenai pencarian teks lengkap, lihat Pencarian Teks Lengkap.

    +

    Tingkat Konsistensi

    Sistem basis data terdistribusi biasanya menggunakan tingkat konsistensi untuk menentukan kesamaan data di seluruh simpul data dan replika. Anda dapat menetapkan tingkat konsistensi terpisah saat membuat koleksi atau melakukan pencarian kesamaan di dalam koleksi. Tingkat konsistensi yang berlaku adalah Strong, Bounded Staleness, Session, dan Eventually.

    +

    Untuk detail tentang tingkat konsistensi ini, lihat Tingkat Konsistensi.

    +

    Batasan

    Untuk batas dan larangan pada koleksi, lihat Batas & Larangan.

    diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.json b/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.json new file mode 100644 index 000000000..525218ea2 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.ListPartitionsReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport java.util.*;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nlet res = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res);​\n​\n// Output​\n// [\"_default\"]​\n\n","import (​\n \"context\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvucclient\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n // handle error​\n}​\n​\ndefer cli.Close(ctx)​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n","client.create_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\", \"partitionA\"]​\n\n","import io.milvus.v2.service.partition.request.CreatePartitionReq;​\n​\nCreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.createPartition(createPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default, partitionA]​\n\n","await client.createPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","import (​\n \"fmt\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nerr = cli.CreatePartition(ctx, client.NewCreatePartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\",​\n# \"partitionA\"​\n# ]​\n# }​\n\n","res = client.has_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# True​\n\n","import io.milvus.v2.service.partition.request.HasPartitionReq;​\n​\nHasPartitionReq hasPartitionReq = HasPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean hasPartitionRes = client.hasPartition(hasPartitionReq);​\nSystem.out.println(hasPartitionRes);​\n​\n// Output:​\n// true​\n\n","res = await client.hasPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.value)​\n​\n// Output​\n// true​\n\n","import (​\n \"fmt\"​\n ​\n \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nresult, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(result)​\n​\n// Output:​\n// true​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"has\": true​\n# }​\n# }​\n\n","client.load_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.LoadPartitionsReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n​\nLoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.loadPartitions(loadPartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// True​\n\n","await client.loadPartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// False​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateNotLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nclient.drop_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.DropPartitionReq;​\nimport io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\nimport io.milvus.v2.service.partition.request.ListPartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nDropPartitionReq dropPartitionReq = DropPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.dropPartition(dropPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nawait client.dropPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\"]​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n"],"headingContent":"Manage Partitions​","anchorList":[{"label":"Mengelola Partisi","href":"Manage-Partitions​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat Daftar Partisi","href":"List-Partitions​","type":2,"isActive":false},{"label":"Membuat Partisi","href":"Create-Partition​","type":2,"isActive":false},{"label":"Memeriksa Partisi Tertentu","href":"Check-for-a-Specific-Partition​","type":2,"isActive":false},{"label":"Memuat dan Melepaskan Partisi","href":"Load-and-Release-Partitions​","type":2,"isActive":false},{"label":"Operasi Data di Dalam Partisi","href":"Data-Operations-Within-Partitions​","type":2,"isActive":false},{"label":"Menghapus Partisi","href":"Drop-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.md b/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.md new file mode 100644 index 000000000..f57b0a86f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/manage-partitions.md @@ -0,0 +1,764 @@ +--- +id: manage-partitions.md +title: Mengelola Partisi +--- +

    Mengelola Partisi

    Partisi adalah bagian dari koleksi. Setiap partisi memiliki struktur data yang sama dengan koleksi induknya, namun hanya berisi sebagian data dalam koleksi tersebut. Halaman ini membantu Anda memahami cara mengelola partisi.

    +

    Gambaran Umum

    Ketika membuat koleksi, Milvus juga membuat sebuah partisi bernama _default di dalam koleksi. Jika Anda tidak akan menambahkan partisi lain, semua entitas yang dimasukkan ke dalam koleksi akan masuk ke dalam partisi default, dan semua pencarian dan kueri juga dilakukan di dalam partisi default.

    +

    Anda dapat menambahkan lebih banyak partisi dan menyisipkan entitas ke dalamnya berdasarkan kriteria tertentu. Kemudian Anda dapat membatasi pencarian dan kueri Anda dalam partisi tertentu, sehingga meningkatkan kinerja pencarian.

    +

    Sebuah koleksi dapat memiliki maksimal 1.024 partisi.

    +
    +

    Fitur Kunci Partisi adalah pengoptimalan pencarian berdasarkan partisi dan memungkinkan Milvus mendistribusikan entitas ke dalam partisi yang berbeda berdasarkan nilai dalam bidang skalar tertentu. Fitur ini membantu mengimplementasikan multi-tenancy berorientasi partisi dan meningkatkan kinerja pencarian.

    +

    Fitur ini tidak akan dibahas pada halaman ini. Untuk mengetahui lebih lanjut, lihat Menggunakan Kunci Partisi.

    +
    +

    Membuat Daftar Partisi

    Ketika membuat koleksi, Milvus juga membuat partisi bernama _default di dalam koleksi. Anda dapat membuat daftar partisi di dalam koleksi sebagai berikut.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import java.util.*;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +let res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res);​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    import (​
    +    "context"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvucclient"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    +

    Membuat Partisi

    Anda dapat menambahkan lebih banyak partisi ke dalam koleksi dan menyisipkan entitas ke dalam partisi-partisi tersebut berdasarkan kriteria tertentu.

    + +
    client.create_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default", "partitionA"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.CreatePartitionReq;​
    +​
    +CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.createPartition(createPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default, partitionA]​
    +
    +
    +
    await client.createPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +err = cli.CreatePartition(ctx, client.NewCreatePartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default",​
    +#         "partitionA"​
    +#     ]​
    +# }​
    +
    +
    +

    Memeriksa Partisi Tertentu

    Cuplikan kode berikut ini menunjukkan bagaimana cara memeriksa apakah sebuah partisi ada di dalam koleksi tertentu.

    + +
    res = client.has_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# True​
    +
    +
    +
    import io.milvus.v2.service.partition.request.HasPartitionReq;​
    +​
    +HasPartitionReq hasPartitionReq = HasPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean hasPartitionRes = client.hasPartition(hasPartitionReq);​
    +System.out.println(hasPartitionRes);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    res = await client.hasPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.value)​
    +​
    +// Output​
    +// true​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +result, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(result)​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#        "has": true​
    +#     }​
    +# }​
    +
    +
    +

    Memuat dan Melepaskan Partisi

    Anda dapat memuat atau melepaskan satu atau beberapa partisi secara terpisah.

    +

    Memuat Partisi

    Anda dapat memuat partisi tertentu secara terpisah dalam sebuah koleksi. Perlu dicatat bahwa status pemuatan koleksi tetap tidak dimuat jika ada partisi yang tidak dimuat di dalam koleksi.

    + +
    client.load_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.LoadPartitionsReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +​
    +LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.loadPartitions(loadPartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// True​
    +
    +
    +
    await client.loadPartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Melepaskan Partisi

    Anda juga dapat melepaskan partisi tertentu.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// False​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Operasi Data di Dalam Partisi

    Menyisipkan dan Menghapus Entitas

    Anda dapat melakukan operasi penyisipan, penambahan, dan penghapusan dalam operasi tertentu. Untuk detailnya, lihat

    +
      +
    • Menyisipkan Entitas ke dalam Partisi

    • +
    • Menambah Entitas ke dalam Partisi

    • +
    • Menghapus Entitas dari Partisi

    • +
    +

    Pencarian dan Kueri

    Anda dapat melakukan pencarian dan kueri di dalam partisi tertentu. Untuk detailnya, lihat

    +
      +
    • Melakukan Pencarian ANN dalam Partisi

    • +
    • Melakukan Pemfilteran Metadata di dalam Partisi

    • +
    +

    Menghapus Partisi

    Anda dapat menghapus partisi yang tidak lagi diperlukan. Sebelum menjatuhkan partisi, pastikan bahwa partisi tersebut telah dilepas.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +client.drop_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.DropPartitionReq;​
    +import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +DropPartitionReq dropPartitionReq = DropPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.dropPartition(dropPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +await client.dropPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/collections/modify-collection.json b/localization/v2.5.x/site/id/userGuide/collections/modify-collection.json new file mode 100644 index 000000000..d65ed79bd --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/modify-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.rename_collection(​\n old_name=\"my_collection\",​\n new_name=\"my_new_collection\"​\n)​\n\n","import io.milvus.v2.service.collection.request.RenameCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nRenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .newCollectionName(\"my_new_collection\")​\n .build();​\n​\nclient.renameCollection(renameCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = await client.renameCollection({​\n oldName: \"my_collection\",​\n newName: \"my_new_collection\"​\n});​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.RenameCollection(ctx, client.NewRenameCollectionOption(\"my_collection\", \"my_new_collection\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"newCollectionName\": \"my_new_collection\"​\n}'​\n\n","from pymilvus import MilvusClient\n\nclient.alter_collection_properties(\n collection_name=\"collection_name\",\n properties = {\"collection.ttl.seconds\": 500}\n)\n","import io.milvus.v2.service.collection.request.AlterCollectionReq;​\nimport java.util.HashMap;​\nimport java.util.Map;​\n​\nMap properties = new HashMap<>();​\nproperties.put(\"collection.ttl.seconds\", \"60\");​\n​\nAlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .properties(properties)​\n .build();​\n​\nclient.alterCollection(alterCollectionReq);​\n\n","res = await client.alterCollection({​\n collection_name: \"my_collection\",​\n properties: {​\n \"collection.ttl.seconds\": 60​\n }​\n})​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.AlterCollection(ctx, client.NewAlterCollectionOption(\"my_collection\").WithProperty(common.CollectionTTLConfigKey, 60))​\nif err != nil {​\n // handle error​\n}​\n\n","# Currently not available for REST\n\n"],"headingContent":"Modify Collection​","anchorList":[{"label":"Memodifikasi Koleksi","href":"Modify-Collection​","type":1,"isActive":false},{"label":"Mengganti Nama Koleksi","href":"Rename-Collection​","type":2,"isActive":false},{"label":"Mengatur TTL Koleksi","href":"Set-Collection-TTL​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/modify-collection.md b/localization/v2.5.x/site/id/userGuide/collections/modify-collection.md new file mode 100644 index 000000000..352d450a0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/modify-collection.md @@ -0,0 +1,213 @@ +--- +id: modify-collection.md +title: Memodifikasi Koleksi +--- +

    Memodifikasi Koleksi

    Anda dapat mengganti nama koleksi atau mengubah pengaturannya. Halaman ini berfokus pada cara mengubah koleksi.

    +

    Mengganti Nama Koleksi

    Anda dapat mengganti nama koleksi sebagai berikut.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.rename_collection(​
    +    old_name="my_collection",​
    +    new_name="my_new_collection"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.RenameCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +RenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .newCollectionName("my_new_collection")​
    +        .build();​
    +​
    +client.renameCollection(renameCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = await client.renameCollection({​
    +    oldName: "my_collection",​
    +    newName: "my_new_collection"​
    +});​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.RenameCollection(ctx, client.NewRenameCollectionOption("my_collection", "my_new_collection"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "newCollectionName": "my_new_collection"​
    +}'​
    +
    +
    +

    Mengatur TTL Koleksi

    Jika sebuah koleksi perlu dihapus untuk periode tertentu, pertimbangkan untuk mengatur Time-To-Live (TTL) dalam hitungan detik. Setelah TTL habis, Milvus akan menghapus entitas-entitas di dalam koleksi. Penghapusan ini bersifat asinkron, yang mengindikasikan bahwa pencarian dan kueri masih mungkin dilakukan sebelum penghapusan selesai.

    +

    Cuplikan kode berikut ini menunjukkan cara mengubah TTL koleksi.

    + +
    from pymilvus import MilvusClient
    +
    +client.alter_collection_properties(
    +  collection_name="collection_name",
    +  properties = {"collection.ttl.seconds": 500}
    +)
    +
    +
    import io.milvus.v2.service.collection.request.AlterCollectionReq;​
    +import java.util.HashMap;​
    +import java.util.Map;​
    +​
    +Map<String, String> properties = new HashMap<>();​
    +properties.put("collection.ttl.seconds", "60");​
    +​
    +AlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .properties(properties)​
    +        .build();​
    +​
    +client.alterCollection(alterCollectionReq);​
    +
    +
    +
    res = await client.alterCollection({​
    +    collection_name: "my_collection",​
    +    properties: {​
    +        "collection.ttl.seconds": 60​
    +    }​
    +})​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.AlterCollection(ctx, client.NewAlterCollectionOption("my_collection").WithProperty(common.CollectionTTLConfigKey, 60))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # Currently not available for REST
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/collections/view-collections.json b/localization/v2.5.x/site/id/userGuide/collections/view-collections.json new file mode 100644 index 000000000..e93528c1c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/view-collections.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_collections()​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.response.ListCollectionsResp;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListCollectionsResp resp = client.listCollections();​\nSystem.out.println(resp.getCollectionNames());​\n\n","import { MilvusClient } from '@zilliz/milvus2-sdk-node';​\n​\nconst client = new MilvusClient({​\n address: 'localhost:19530',​\n token: 'root:Milvus'​\n});​\n​\n​\nconst collections = await client.listCollections();​\nconsole.log(collections);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collectionNames)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}​\n}'​\n\n","[\"quick_setup\"]​\n\n","res = client.describe_collection(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.service.collection.request.DescribeCollectionReq;​\nimport io.milvus.v2.service.collection.response.DescribeCollectionResp;​\n​\nDescribeCollectionReq request = DescribeCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\nDescribeCollectionResp resp = client.describeCollection(request);​\nSystem.out.println(resp);​\n\n","const res = await client.describeCollection({​\n collection_name: \"quick_setup\"​\n});​\n​\nconsole.log(res);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collection)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n\n"],"headingContent":"View Collections​","anchorList":[{"label":"Melihat Koleksi","href":"View-Collections​","type":1,"isActive":false},{"label":"Daftar Koleksi","href":"List-Collections​","type":2,"isActive":false},{"label":"Mendeskripsikan Koleksi","href":"Describe-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/collections/view-collections.md b/localization/v2.5.x/site/id/userGuide/collections/view-collections.md new file mode 100644 index 000000000..02145093d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/collections/view-collections.md @@ -0,0 +1,202 @@ +--- +id: view-collections.md +title: Melihat Koleksi +--- +

    Melihat Koleksi

    Anda dapat memperoleh daftar nama semua koleksi dalam basis data yang sedang tersambung, dan memeriksa rincian koleksi tertentu.

    +

    Daftar Koleksi

    Contoh berikut ini menunjukkan cara mendapatkan daftar nama semua koleksi dalam basis data yang sedang tersambung.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_collections()​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.response.ListCollectionsResp;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListCollectionsResp resp = client.listCollections();​
    +System.out.println(resp.getCollectionNames());​
    +
    +
    +
    import { MilvusClient } from '@zilliz/milvus2-sdk-node';​
    +​
    +const client = new MilvusClient({​
    +    address: 'localhost:19530',​
    +    token: 'root:Milvus'​
    +});​
    +​
    +​
    +const collections = await client.listCollections();​
    +console.log(collections);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collectionNames)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}​
    +}'​
    +
    +
    +

    Jika Anda telah membuat koleksi bernama quick_setup, hasil dari contoh di atas akan serupa dengan yang berikut ini.

    +
    ["quick_setup"]​
    +
    +
    +

    Mendeskripsikan Koleksi

    Anda juga dapat memperoleh detail dari koleksi tertentu. Contoh berikut ini mengasumsikan bahwa Anda telah membuat koleksi bernama quick_setup.

    + +
    res = client.describe_collection(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DescribeCollectionReq;​
    +import io.milvus.v2.service.collection.response.DescribeCollectionResp;​
    +​
    +DescribeCollectionReq request = DescribeCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +DescribeCollectionResp resp = client.describeCollection(request);​
    +System.out.println(resp);​
    +
    +
    +
    const res = await client.describeCollection({​
    +    collection_name: "quick_setup"​
    +});​
    +​
    +console.log(res);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collection)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/data-import/import-data.json b/localization/v2.5.x/site/id/userGuide/data-import/import-data.json new file mode 100644 index 000000000..1b6dd6887 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/data-import/import-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus.bulk_writer import bulk_import\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Bulk-insert data from a set of JSON files already uploaded to the MinIO server\nresp = bulk_import(\n url=url,\n collection_name=\"quick_setup\",\n files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],\n)\n\njob_id = resp.json()['data']['jobId']\nprint(job_id)\n","private static String bulkImport(List> batchFiles) throws InterruptedException {\n MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()\n .collectionName(\"quick_setup\")\n .files(batchFiles)\n .build();\n String bulkImportResult = BulkImport.bulkImport(\"http://localhost:19530\", milvusImportRequest);\n System.out.println(bulkImportResult);\n\n JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);\n String jobId = bulkImportObject.getAsJsonObject(\"data\").get(\"jobId\").getAsString();\n System.out.println(\"Create a bulkInert task, job id: \" + jobId);\n return jobId;\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/create\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"files\": [\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\"\n ],\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\"\n ]\n ],\n \"collectionName\": \"quick_setup\"\n}'\n","[\n \"/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json\"\n],\n","[\n \"/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet\"\n]\n\n","{\n \"code\": 200,\n \"data\": {\n \"jobId\": \"448707763884413158\"\n }\n}\n","import json\nfrom pymilvus.bulk_writer import get_import_progress\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Get bulk-insert job progress\nresp = get_import_progress(\n url=url,\n job_id=\"453265736269038336\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void getImportProgress(String jobId) {\n while (true) {\n System.out.println(\"Wait 5 second to check bulkInsert job state...\");\n try {\n TimeUnit.SECONDS.sleep(5);\n } catch (InterruptedException e) {\n break;\n }\n\n MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()\n .jobId(jobId)\n .build();\n String getImportProgressResult = BulkImport.getImportProgress(\"http://localhost:19530\", request);\n\n JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);\n String state = getImportProgressObject.getAsJsonObject(\"data\").get(\"state\").getAsString();\n String progress = getImportProgressObject.getAsJsonObject(\"data\").get(\"progress\").getAsString();\n if (\"Failed\".equals(state)) {\n String reason = getImportProgressObject.getAsJsonObject(\"data\").get(\"reason\").getAsString();\n System.out.printf(\"The job %s failed, reason: %s%n\", jobId, reason);\n break;\n } else if (\"Completed\".equals(state)) {\n System.out.printf(\"The job %s completed%n\", jobId);\n break;\n } else {\n System.out.printf(\"The job %s is running, state:%s progress:%s%n\", jobId, state, progress);\n }\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n getImportProgress(jobId);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/describe\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"jobId\": \"449839014328146739\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"collectionName\": \"quick_setup\",\n \"completeTime\": \"2024-05-18T02:57:13Z\",\n \"details\": [\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146740 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\\\" \",\n \"fileSize\": 31567874,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 100000\n },\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146741 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\\\" \",\n \"fileSize\": 31517224,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000 \n }\n ],\n \"fileSize\": 63085098,\n \"importedRows\": 200000,\n \"jobId\": \"449839014328146739\",\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000\n }\n}\n","import json\nfrom pymilvus.bulk_writer import list_import_jobs\n\nurl = f\"http://127.0.0.1:19530\"\n\n# List bulk-insert jobs\nresp = list_import_jobs(\n url=url,\n collection_name=\"quick_setup\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void listImportJobs() {\n MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName(\"quick_setup\").build();\n String listImportJobsResult = BulkImport.listImportJobs(\"http://localhost:19530\", listImportJobsRequest);\n System.out.println(listImportJobsResult);\n}\n\npublic static void main(String[] args) throws Exception {\n listImportJobs();\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/list\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"quick_setup\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"records\": [\n {\n \"collectionName\": \"quick_setup\",\n \"jobId\": \"448761313698322011\",\n \"progress\": 50,\n \"state\": \"Importing\"\n }\n ]\n }\n}\n"],"headingContent":"Import data","anchorList":[{"label":"Mengimpor data","href":"Import-data","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Mengimpor data","href":"Import-data","type":2,"isActive":false},{"label":"Memeriksa kemajuan impor","href":"Check-import-progress","type":2,"isActive":false},{"label":"Buat daftar pekerjaan impor","href":"List-Import-Jobs","type":2,"isActive":false},{"label":"Keterbatasan","href":"Limitations","type":2,"isActive":false},{"label":"Kendala","href":"Constraints","type":2,"isActive":false},{"label":"Rekomendasi","href":"Recommendations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/data-import/import-data.md b/localization/v2.5.x/site/id/userGuide/data-import/import-data.md new file mode 100644 index 000000000..0d312825d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/data-import/import-data.md @@ -0,0 +1,401 @@ +--- +id: import-data.md +order: 1 +title: Impor Data +summary: Halaman ini menunjukkan prosedur untuk mengimpor data yang sudah disiapkan. +--- +

    Mengimpor data

    Halaman ini menunjukkan prosedur untuk mengimpor data yang telah disiapkan.

    +

    Sebelum Anda mulai

      +
    • Anda sudah menyiapkan data Anda dan menempatkannya ke dalam bucket Milvus.

      +

      Jika belum, Anda harus menggunakan RemoteBulkWriter untuk menyiapkan data Anda terlebih dahulu, dan memastikan bahwa data yang disiapkan telah ditransfer ke bucket Milvus pada instance MinIO yang dimulai bersama dengan instance Milvus Anda. Untuk detailnya, lihat Menyiapkan Data Sumber.

    • +
    • Anda telah membuat koleksi dengan skema yang Anda gunakan untuk menyiapkan data. Jika belum, lihat Mengelola Koleksi.

    • +
    +
    +

    Cuplikan kode berikut ini membuat koleksi sederhana dengan skema yang diberikan. Untuk informasi lebih lanjut tentang parameter, lihat create_schema() dan create_collection() dalam referensi SDK.

    +
    +
    +

    Cuplikan kode berikut membuat koleksi sederhana dengan skema yang diberikan. Untuk informasi lebih lanjut tentang parameter, lihat createCollection() dalam referensi SDK.

    +
    +

    Mengimpor data

    Untuk mengimpor data yang telah disiapkan, Anda harus membuat pekerjaan impor sebagai berikut:

    + +
    from pymilvus.bulk_writer import bulk_import
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Bulk-insert data from a set of JSON files already uploaded to the MinIO server
    +resp = bulk_import(
    +    url=url,
    +    collection_name="quick_setup",
    +    files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],
    +)
    +
    +job_id = resp.json()['data']['jobId']
    +print(job_id)
    +
    +
    private static String bulkImport(List<List<String>> batchFiles) throws InterruptedException {
    +    MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()
    +            .collectionName("quick_setup")
    +            .files(batchFiles)
    +            .build();
    +    String bulkImportResult = BulkImport.bulkImport("http://localhost:19530", milvusImportRequest);
    +    System.out.println(bulkImportResult);
    +
    +    JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);
    +    String jobId = bulkImportObject.getAsJsonObject("data").get("jobId").getAsString();
    +    System.out.println("Create a bulkInert task, job id: " + jobId);
    +    return jobId;
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/create" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "files": [
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet"
    +        ],
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet"
    +        ]
    +    ],
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    Badan permintaan berisi dua bidang:

    +
      +
    • collectionName

      +

      Nama koleksi target.

    • +
    • files

      +

      Daftar daftar jalur file yang relatif terhadap jalur root dari bucket Milvus pada instans MioIO yang dimulai bersama dengan instans Milvus Anda. Sub-daftar yang mungkin ada adalah sebagai berikut:

      +
        +
      • File JSON

        +

        Jika berkas yang disiapkan dalam format JSON, setiap sub-daftar harus berisi jalur ke satu berkas JSON yang disiapkan.

        +
        [
        +    "/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json"
        +],
        +
      • +
      • File parket

        +

        Jika berkas yang disiapkan dalam format Parquet, setiap sub-daftar harus berisi jalur ke satu berkas parquet yang disiapkan.

        +
        [
        +    "/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet"
        +]
        +
        +
      • +
    • +
    +

    Pengembalian yang mungkin adalah sebagai berikut:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "jobId": "448707763884413158"
    +    }
    +}
    +
    +

    Memeriksa kemajuan impor

    Setelah Anda mendapatkan ID pekerjaan impor, Anda dapat memeriksa kemajuan impor sebagai berikut:

    + +
    import json
    +from pymilvus.bulk_writer import get_import_progress
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Get bulk-insert job progress
    +resp = get_import_progress(
    +    url=url,
    +    job_id="453265736269038336",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void getImportProgress(String jobId) {
    +    while (true) {
    +        System.out.println("Wait 5 second to check bulkInsert job state...");
    +        try {
    +            TimeUnit.SECONDS.sleep(5);
    +        } catch (InterruptedException e) {
    +            break;
    +        }
    +
    +        MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()
    +                .jobId(jobId)
    +                .build();
    +        String getImportProgressResult = BulkImport.getImportProgress("http://localhost:19530", request);
    +
    +        JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);
    +        String state = getImportProgressObject.getAsJsonObject("data").get("state").getAsString();
    +        String progress = getImportProgressObject.getAsJsonObject("data").get("progress").getAsString();
    +        if ("Failed".equals(state)) {
    +            String reason = getImportProgressObject.getAsJsonObject("data").get("reason").getAsString();
    +            System.out.printf("The job %s failed, reason: %s%n", jobId, reason);
    +            break;
    +        } else if ("Completed".equals(state)) {
    +            System.out.printf("The job %s completed%n", jobId);
    +            break;
    +        } else {
    +            System.out.printf("The job %s is running, state:%s progress:%s%n", jobId, state, progress);
    +        }
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +    getImportProgress(jobId);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/describe" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "jobId": "449839014328146739"
    +}'
    +
    +

    Respons yang mungkin muncul adalah sebagai berikut:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "collectionName": "quick_setup",
    +        "completeTime": "2024-05-18T02:57:13Z",
    +        "details": [
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146740 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\" ",
    +                "fileSize": 31567874,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 100000
    +            },
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146741 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\" ",
    +                "fileSize": 31517224,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 200000            
    +            }
    +        ],
    +        "fileSize": 63085098,
    +        "importedRows": 200000,
    +        "jobId": "449839014328146739",
    +        "progress": 100,
    +        "state": "Completed",
    +        "totalRows": 200000
    +    }
    +}
    +
    +

    Buat daftar pekerjaan impor

    Anda dapat membuat daftar semua pekerjaan impor relatif terhadap koleksi tertentu sebagai berikut:

    + +
    import json
    +from pymilvus.bulk_writer import list_import_jobs
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# List bulk-insert jobs
    +resp = list_import_jobs(
    +    url=url,
    +    collection_name="quick_setup",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void listImportJobs() {
    +    MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName("quick_setup").build();
    +    String listImportJobsResult = BulkImport.listImportJobs("http://localhost:19530", listImportJobsRequest);
    +    System.out.println(listImportJobsResult);
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    listImportJobs();
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/list" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    Nilai yang mungkin adalah sebagai berikut:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "records": [
    +            {
    +                "collectionName": "quick_setup",
    +                "jobId": "448761313698322011",
    +                "progress": 50,
    +                "state": "Importing"
    +            }
    +        ]
    +    }
    +}
    +
    +

    Keterbatasan

      +
    • Setiap ukuran file impor tidak boleh melebihi 16 GB.

    • +
    • Jumlah maksimum permintaan impor dibatasi hingga 1024.

    • +
    • Jumlah maksimum file per permintaan impor tidak boleh melebihi 1024.

    • +
    • Hanya satu nama partisi yang dapat ditentukan dalam permintaan impor. Jika tidak ada nama partisi yang ditentukan, data akan dimasukkan ke dalam partisi default. Selain itu, Anda tidak dapat menetapkan nama partisi dalam permintaan impor jika Anda telah menetapkan Kunci Partisi di koleksi target.

    • +
    +

    Kendala

    Sebelum mengimpor data, pastikan Anda telah mengetahui batasan-batasan terkait perilaku Milvus berikut ini:

    +
      +
    • Kendala terkait perilaku Load:

      +
        +
      • Jika koleksi telah dimuat sebelum impor, Anda dapat menggunakan fungsi refresh_load untuk memuat data yang baru diimpor setelah impor selesai.
      • +
    • +
    • Kendala terkait perilaku kueri & pencarian:

      +
        +
      • Sebelum status pekerjaan impor adalah Selesai, data yang baru diimpor dijamin tidak akan terlihat oleh kueri dan pencarian.

      • +
      • Setelah status pekerjaan adalah Selesai,

        +
          +
        • Jika koleksi belum dimuat, Anda dapat menggunakan fungsi load untuk memuat data yang baru diimpor.

        • +
        • Jika koleksi sudah dimuat, Anda dapat memanggil load(is_refresh=True) untuk memuat data yang diimpor.

        • +
      • +
    • +
    • Kendala terkait perilaku penghapusan:

      +
        +
      • Sebelum status pekerjaan impor adalah Selesai, penghapusan tidak dijamin dan mungkin atau mungkin tidak berhasil.

      • +
      • Penghapusan setelah status pekerjaan selesai dijamin akan berhasil.

      • +
    • +
    +

    Rekomendasi

    Kami sangat menyarankan untuk menggunakan fitur impor multi-file, yang memungkinkan Anda mengunggah beberapa file dalam satu permintaan. Metode ini tidak hanya menyederhanakan proses impor, tetapi juga secara signifikan meningkatkan kinerja impor. Sementara itu, dengan mengkonsolidasikan unggahan Anda, Anda dapat mengurangi waktu yang dihabiskan untuk manajemen data dan membuat alur kerja Anda lebih efisien.

    diff --git a/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.json b/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.json new file mode 100644 index 000000000..7d6d063e5 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# You need to work out a collection schema out of your dataset.\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True\n)\n\nDIM = 512\n\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True),\nschema.add_field(field_name=\"bool\", datatype=DataType.BOOL),\nschema.add_field(field_name=\"int8\", datatype=DataType.INT8),\nschema.add_field(field_name=\"int16\", datatype=DataType.INT16),\nschema.add_field(field_name=\"int32\", datatype=DataType.INT32),\nschema.add_field(field_name=\"int64\", datatype=DataType.INT64),\nschema.add_field(field_name=\"float\", datatype=DataType.FLOAT),\nschema.add_field(field_name=\"double\", datatype=DataType.DOUBLE),\nschema.add_field(field_name=\"varchar\", datatype=DataType.VARCHAR, max_length=512),\nschema.add_field(field_name=\"json\", datatype=DataType.JSON),\nschema.add_field(field_name=\"array_str\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)\nschema.add_field(field_name=\"array_int\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)\nschema.add_field(field_name=\"float_vector\", datatype=DataType.FLOAT_VECTOR, dim=DIM),\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=DIM),\nschema.add_field(field_name=\"float16_vector\", datatype=DataType.FLOAT16_VECTOR, dim=DIM),\n# schema.add_field(field_name=\"bfloat16_vector\", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)\n\nschema.verify()\n\nprint(schema)\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\nimport io.milvus.bulkwriter.BulkImport;\nimport io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\nimport io.milvus.bulkwriter.common.clientenum.CloudStorage;\nimport io.milvus.bulkwriter.connect.S3ConnectParam;\nimport io.milvus.bulkwriter.connect.StorageConnectParam;\nimport io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;\nimport io.milvus.bulkwriter.request.import_.MilvusImportRequest;\nimport io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;\nimport io.milvus.common.utils.Float16Utils;\nimport io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.*;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\nprivate static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint(\"http://127.0.0.1:9000\");\nprivate static final String BUCKET_NAME = \"a-bucket\";\nprivate static final String ACCESS_KEY = \"minioadmin\";\nprivate static final String SECRET_KEY = \"minioadmin\";\n\nprivate static final Integer DIM = 512;\nprivate static final Gson GSON_INSTANCE = new Gson();\n\nprivate static CreateCollectionReq.CollectionSchema createSchema() {\n CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(true)\n .build();\n schema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(io.milvus.v2.common.DataType.Int64)\n .isPrimaryKey(Boolean.TRUE)\n .autoID(false)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"bool\")\n .dataType(DataType.Bool)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int8\")\n .dataType(DataType.Int8)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int16\")\n .dataType(DataType.Int16)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int32\")\n .dataType(DataType.Int32)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int64\")\n .dataType(DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float\")\n .dataType(DataType.Float)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"double\")\n .dataType(DataType.Double)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"varchar\")\n .dataType(DataType.VarChar)\n .maxLength(512)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"json\")\n .dataType(io.milvus.v2.common.DataType.JSON)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_int\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_str\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.VarChar)\n .maxLength(128)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float_vector\")\n .dataType(io.milvus.v2.common.DataType.FloatVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"binary_vector\")\n .dataType(io.milvus.v2.common.DataType.BinaryVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float16_vector\")\n .dataType(io.milvus.v2.common.DataType.Float16Vector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"sparse_vector\")\n .dataType(io.milvus.v2.common.DataType.SparseFloatVector)\n .build());\n \n return schema;\n}\n","from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType\n# Use `from pymilvus import LocalBulkWriter, BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = LocalBulkWriter(\n schema=schema,\n local_path='.',\n segment_size=512 * 1024 * 1024, # Default value\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.LocalBulkWriter;\nimport io.milvus.bulkwriter.LocalBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\n\nLocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withLocalPath(\".\")\n .withChunkSize(512 * 1024 * 1024)\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nLocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);\n","from pymilvus.bulk_writer import RemoteBulkWriter\n# Use `from pymilvus import RemoteBulkWriter` \n# when you use pymilvus earlier than 2.4.2 \n\n# Third-party constants\nACCESS_KEY=\"minioadmin\"\nSECRET_KEY=\"minioadmin\"\nBUCKET_NAME=\"a-bucket\"\n\n# Connections parameters to access the remote bucket\nconn = RemoteBulkWriter.S3ConnectParam(\n endpoint=\"localhost:9000\", # the default MinIO service started along with Milvus\n access_key=ACCESS_KEY,\n secret_key=SECRET_KEY,\n bucket_name=BUCKET_NAME,\n secure=False\n)\n\nfrom pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n\nprint('bulk writer created.')\n","private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n","from pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\n\nRemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withConnectParam(storageConnectParam)\n .withChunkSize(512 * 1024 * 1024)\n .withRemotePath(\"/\")\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nRemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);\n","import random, string, json\nimport numpy as np\nimport tensorflow as tf\n\ndef generate_random_str(length=5):\n letters = string.ascii_uppercase\n digits = string.digits\n \n return ''.join(random.choices(letters + digits, k=length))\n\n# optional input for binary vector:\n# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]\n# 2. numpy array of uint8\ndef gen_binary_vector(to_numpy_arr):\n raw_vector = [random.randint(0, 1) for i in range(DIM)]\n if to_numpy_arr:\n return np.packbits(raw_vector, axis=-1)\n return raw_vector\n\n# optional input for float vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float32\ndef gen_float_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=\"float32\")\n return raw_vector\n\n# # optional input for bfloat16 vector:\n# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# # 2. numpy array of bfloat16\n# def gen_bf16_vector(to_numpy_arr):\n# raw_vector = [random.random() for _ in range(DIM)]\n# if to_numpy_arr:\n# return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()\n# return raw_vector\n\n# optional input for float16 vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float16\ndef gen_fp16_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=np.float16)\n return raw_vector\n\n# optional input for sparse vector:\n# only accepts dict like {2: 13.23, 45: 0.54} or {\"indices\": [1, 2], \"values\": [0.1, 0.2]}\n# note: no need to sort the keys\ndef gen_sparse_vector(pair_dict: bool):\n raw_vector = {}\n dim = random.randint(2, 20)\n if pair_dict:\n raw_vector[\"indices\"] = [i for i in range(dim)]\n raw_vector[\"values\"] = [random.random() for _ in range(dim)]\n else:\n for i in range(dim):\n raw_vector[i] = random.random()\n return raw_vector\n\nfor i in range(10000):\n writer.append_row({\n \"id\": np.int64(i),\n \"bool\": True if i % 3 == 0 else False,\n \"int8\": np.int8(i%128),\n \"int16\": np.int16(i%1000),\n \"int32\": np.int32(i%100000),\n \"int64\": np.int64(i),\n \"float\": np.float32(i/3),\n \"double\": np.float64(i/7),\n \"varchar\": f\"varchar_{i}\",\n \"json\": json.dumps({\"dummy\": i, \"ok\": f\"name_{i}\"}),\n \"array_str\": np.array([f\"str_{k}\" for k in range(5)], np.dtype(\"str\")),\n \"array_int\": np.array([k for k in range(10)], np.dtype(\"int64\")),\n \"float_vector\": gen_float_vector(True),\n \"binary_vector\": gen_binary_vector(True),\n \"float16_vector\": gen_fp16_vector(True),\n # \"bfloat16_vector\": gen_bf16_vector(True),\n \"sparse_vector\": gen_sparse_vector(True),\n f\"dynamic_{i}\": i,\n })\n if (i+1)%1000 == 0:\n writer.commit()\n print('committed')\n\nprint(writer.batch_files)\n","private static byte[] genBinaryVector() {\n Random ran = new Random();\n int byteCount = DIM / 8;\n ByteBuffer vector = ByteBuffer.allocate(byteCount);\n for (int i = 0; i < byteCount; ++i) {\n vector.put((byte) ran.nextInt(Byte.MAX_VALUE));\n }\n return vector.array();\n}\n\nprivate static List genFloatVector() {\n Random ran = new Random();\n List vector = new ArrayList<>();\n for (int i = 0; i < DIM; ++i) {\n vector.add(ran.nextFloat());\n }\n return vector;\n}\n\nprivate static byte[] genFloat16Vector() {\n List originalVector = genFloatVector();\n return Float16Utils.f32VectorToFp16Buffer(originalVector).array();\n}\n\nprivate static SortedMap genSparseVector() {\n Random ran = new Random();\n SortedMap sparse = new TreeMap<>();\n int dim = ran.nextInt(18) + 2; // [2, 20)\n for (int i = 0; i < dim; ++i) {\n sparse.put((long)ran.nextInt(1000000), ran.nextFloat());\n }\n return sparse;\n}\n\nprivate static List genStringArray(int length) {\n List arr = new ArrayList<>();\n for (int i = 0; i < length; i++) {\n arr.add(\"str_\" + i);\n }\n return arr;\n}\n\nprivate static List genIntArray(int length) {\n List arr = new ArrayList<>();\n for (long i = 0; i < length; i++) {\n arr.add(i);\n }\n return arr;\n}\n\nprivate static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n\nprivate static List> uploadData() throws Exception {\n CreateCollectionReq.CollectionSchema collectionSchema = createSchema();\n try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {\n for (int i = 0; i < 10000; ++i) {\n JsonObject rowObject = new JsonObject();\n\n rowObject.addProperty(\"id\", i);\n rowObject.addProperty(\"bool\", i % 3 == 0);\n rowObject.addProperty(\"int8\", i % 128);\n rowObject.addProperty(\"int16\", i % 1000);\n rowObject.addProperty(\"int32\", i % 100000);\n rowObject.addProperty(\"int64\", i);\n rowObject.addProperty(\"float\", i / 3);\n rowObject.addProperty(\"double\", i / 7);\n rowObject.addProperty(\"varchar\", \"varchar_\" + i);\n rowObject.addProperty(\"json\", String.format(\"{\\\"dummy\\\": %s, \\\"ok\\\": \\\"name_%s\\\"}\", i, i));\n rowObject.add(\"array_str\", GSON_INSTANCE.toJsonTree(genStringArray(5)));\n rowObject.add(\"array_int\", GSON_INSTANCE.toJsonTree(genIntArray(10)));\n rowObject.add(\"float_vector\", GSON_INSTANCE.toJsonTree(genFloatVector()));\n rowObject.add(\"binary_vector\", GSON_INSTANCE.toJsonTree(genBinaryVector()));\n rowObject.add(\"float16_vector\", GSON_INSTANCE.toJsonTree(genFloat16Vector()));\n rowObject.add(\"sparse_vector\", GSON_INSTANCE.toJsonTree(genSparseVector()));\n rowObject.addProperty(\"dynamic\", \"dynamic_\" + i);\n\n remoteBulkWriter.appendRow(rowObject);\n\n if ((i+1)%1000 == 0) {\n remoteBulkWriter.commit(false);\n }\n }\n\n List> batchFiles = remoteBulkWriter.getBatchFiles();\n System.out.println(batchFiles);\n return batchFiles;\n } catch (Exception e) {\n throw e;\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n}\n","print(writer.batch_files)\n\n# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],\n# ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]\n","// localBulkWriter.getBatchFiles();\nremoteBulkWriter.getBatchFiles();\n\n// \n\n// Close the BulkWriter\ntry {\n localBulkWriter.close();\n remoteBulkWriter.close(); \n} catch (Exception e) {\n // TODO: handle exception\n e.printStackTrace();\n}\n","# JSON\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.json \n\n# Parquet\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.parquet \n"],"headingContent":"Prepare Source Data","anchorList":[{"label":"Menyiapkan Data Sumber","href":"Prepare-Source-Data","type":1,"isActive":false},{"label":"Sebelum Anda mulai","href":"Before-you-start","type":2,"isActive":false},{"label":"Menyiapkan BulkWriter","href":"Set-up-BulkWriter","type":2,"isActive":false},{"label":"Mulai menulis","href":"Start-writing","type":2,"isActive":false},{"label":"Memverifikasi hasil","href":"Verify-the-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.md b/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.md new file mode 100644 index 000000000..4112a2f55 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/data-import/prepare-source-data.md @@ -0,0 +1,633 @@ +--- +id: prepare-source-data.md +order: 0 +title: Menyiapkan Data Sumber +summary: >- + Halaman ini membahas sesuatu yang harus Anda pertimbangkan sebelum Anda mulai + memasukkan data secara massal ke dalam koleksi Anda. +--- +

    Menyiapkan Data Sumber

    Halaman ini membahas sesuatu yang harus Anda pertimbangkan sebelum mulai memasukkan data secara massal ke dalam koleksi Anda.

    +

    Sebelum Anda mulai

    Koleksi target memerlukan pemetaan data sumber ke skema. Diagram di bawah ini menunjukkan bagaimana data sumber yang dapat diterima dipetakan ke skema koleksi target.

    +

    + + Map data to schema + Memetakan data ke skema

    +

    Anda harus memeriksa data Anda dengan cermat dan merancang skema koleksi target yang sesuai.

    +

    Mengambil data JSON pada diagram di atas sebagai contoh, ada dua entitas dalam daftar baris, setiap baris memiliki enam bidang. Skema koleksi secara selektif mencakup empat: id, vektor, skalar_1, dan skalar_2.

    +

    Ada dua hal lagi yang perlu dipertimbangkan ketika mendesain skema:

    +
      +
    • Apakah akan mengaktifkan AutoID

      +

      Bidang id berfungsi sebagai bidang utama koleksi. Untuk membuat field utama bertambah secara otomatis, Anda dapat mengaktifkan AutoID dalam skema. Dalam hal ini, Anda harus mengecualikan field id dari setiap baris dalam data sumber.

    • +
    • Apakah akan mengaktifkan bidang dinamis

      +

      Koleksi target juga dapat menyimpan bidang yang tidak termasuk dalam skema yang telah ditentukan sebelumnya jika skema tersebut mengaktifkan bidang dinamis. Bidang $meta adalah bidang JSON yang dicadangkan untuk menyimpan bidang dinamis dan nilainya dalam pasangan kunci-nilai. Pada diagram di atas, bidang dynamic_field_1 dan dynamic_field_2 serta nilainya akan disimpan sebagai pasangan kunci-nilai dalam bidang $meta.

    • +
    +

    Kode berikut ini menunjukkan cara mengatur skema untuk koleksi yang diilustrasikan dalam diagram di atas.

    +
    +

    Untuk mendapatkan informasi lebih lanjut, lihat create_schema() dan add_field() dalam referensi SDK.

    +
    +
    +

    Untuk mendapatkan informasi lebih lanjut, lihat CollectionSchema dalam referensi SDK.

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# You need to work out a collection schema out of your dataset.
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True
    +)
    +
    +DIM = 512
    +
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True),
    +schema.add_field(field_name="bool", datatype=DataType.BOOL),
    +schema.add_field(field_name="int8", datatype=DataType.INT8),
    +schema.add_field(field_name="int16", datatype=DataType.INT16),
    +schema.add_field(field_name="int32", datatype=DataType.INT32),
    +schema.add_field(field_name="int64", datatype=DataType.INT64),
    +schema.add_field(field_name="float", datatype=DataType.FLOAT),
    +schema.add_field(field_name="double", datatype=DataType.DOUBLE),
    +schema.add_field(field_name="varchar", datatype=DataType.VARCHAR, max_length=512),
    +schema.add_field(field_name="json", datatype=DataType.JSON),
    +schema.add_field(field_name="array_str", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)
    +schema.add_field(field_name="array_int", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)
    +schema.add_field(field_name="float_vector", datatype=DataType.FLOAT_VECTOR, dim=DIM),
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=DIM),
    +schema.add_field(field_name="float16_vector", datatype=DataType.FLOAT16_VECTOR, dim=DIM),
    +# schema.add_field(field_name="bfloat16_vector", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
    +
    +schema.verify()
    +
    +print(schema)
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +import io.milvus.bulkwriter.BulkImport;
    +import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +import io.milvus.bulkwriter.common.clientenum.CloudStorage;
    +import io.milvus.bulkwriter.connect.S3ConnectParam;
    +import io.milvus.bulkwriter.connect.StorageConnectParam;
    +import io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;
    +import io.milvus.bulkwriter.request.import_.MilvusImportRequest;
    +import io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;
    +import io.milvus.common.utils.Float16Utils;
    +import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.*;
    +
    +import java.io.IOException;
    +import java.nio.ByteBuffer;
    +import java.util.*;
    +import java.util.concurrent.TimeUnit;
    +
    +private static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint("http://127.0.0.1:9000");
    +private static final String BUCKET_NAME = "a-bucket";
    +private static final String ACCESS_KEY = "minioadmin";
    +private static final String SECRET_KEY = "minioadmin";
    +
    +private static final Integer DIM = 512;
    +private static final Gson GSON_INSTANCE = new Gson();
    +
    +private static CreateCollectionReq.CollectionSchema createSchema() {
    +    CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(true)
    +        .build();
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("id")
    +            .dataType(io.milvus.v2.common.DataType.Int64)
    +            .isPrimaryKey(Boolean.TRUE)
    +            .autoID(false)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("bool")
    +            .dataType(DataType.Bool)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int8")
    +            .dataType(DataType.Int8)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int16")
    +            .dataType(DataType.Int16)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int32")
    +            .dataType(DataType.Int32)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int64")
    +            .dataType(DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float")
    +            .dataType(DataType.Float)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("double")
    +            .dataType(DataType.Double)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("varchar")
    +            .dataType(DataType.VarChar)
    +            .maxLength(512)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("json")
    +            .dataType(io.milvus.v2.common.DataType.JSON)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_int")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_str")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.VarChar)
    +            .maxLength(128)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float_vector")
    +            .dataType(io.milvus.v2.common.DataType.FloatVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("binary_vector")
    +            .dataType(io.milvus.v2.common.DataType.BinaryVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float16_vector")
    +            .dataType(io.milvus.v2.common.DataType.Float16Vector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("sparse_vector")
    +            .dataType(io.milvus.v2.common.DataType.SparseFloatVector)
    +            .build());
    +    
    +    return schema;
    +}
    +
    +

    Menyiapkan BulkWriter

    BulkWriter adalah alat yang dirancang untuk mengonversi set data mentah menjadi format yang cocok untuk mengimpor melalui RESTful Import API. Alat ini menawarkan dua jenis penulis:

    +
      +
    • LocalBulkWriter: Membaca kumpulan data yang ditentukan dan mengubahnya menjadi format yang mudah digunakan.
    • +
    • RemoteBulkWriter: Melakukan tugas yang sama dengan LocalBulkWriter tetapi juga mentransfer file data yang dikonversi ke ember penyimpanan objek jarak jauh yang ditentukan.
    • +
    +

    RemoteBulkWriter berbeda dengan LocalBulkWriter karena RemoteBulkWriter mentransfer file data yang dikonversi ke ember penyimpanan objek target.

    +

    Menyiapkan LocalBulkWriter

    LocalBulkWriter menambahkan baris dari kumpulan data sumber dan mengomitnya ke file lokal dengan format yang ditentukan.

    + +
    from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType
    +# Use `from pymilvus import LocalBulkWriter, BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = LocalBulkWriter(
    +    schema=schema,
    +    local_path='.',
    +    segment_size=512 * 1024 * 1024, # Default value
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.LocalBulkWriter;
    +import io.milvus.bulkwriter.LocalBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +
    +LocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withLocalPath(".")
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +LocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);
    +
    +
    +

    Ketika membuat LocalBulkWriter, Anda harus:

    +
      +
    • Merujuk skema yang dibuat di schema.
    • +
    • Tetapkan local_path ke direktori keluaran.
    • +
    • Atur file_type ke jenis file keluaran.
    • +
    • Jika dataset Anda berisi sejumlah besar catatan, Anda disarankan untuk menyegmentasikan data dengan mengatur segment_size ke nilai yang tepat.
    • +
    +

    Untuk detail mengenai pengaturan parameter, lihat LocalBulkWriter dalam referensi SDK.

    +
    +
    +

    Ketika membuat LocalBulkWriter, Anda harus:

    +
      +
    • Merujuk skema yang dibuat di CollectionSchema().
    • +
    • Mengatur direktori keluaran di withLocalPath().
    • +
    • Mengatur jenis file keluaran di withFileType().
    • +
    • Jika dataset Anda berisi sejumlah besar catatan, Anda disarankan untuk menyegmentasikan data dengan mengatur withChunkSize() ke nilai yang tepat.
    • +
    +

    Untuk detail tentang pengaturan parameter, lihat LocalBulkWriter di referensi SDK.

    +
    +

    Menyiapkan RemoteBulkWriter

    Alih-alih menambahkan data yang ditambahkan ke berkas lokal, RemoteBulkWriter menambahkannya ke bucket jarak jauh. Oleh karena itu, Anda harus menyiapkan objek ConnectParam sebelum membuat RemoteBulkWriter.

    + +
    from pymilvus.bulk_writer import RemoteBulkWriter
    +# Use `from pymilvus import RemoteBulkWriter` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +# Third-party constants
    +ACCESS_KEY="minioadmin"
    +SECRET_KEY="minioadmin"
    +BUCKET_NAME="a-bucket"
    +
    +# Connections parameters to access the remote bucket
    +conn = RemoteBulkWriter.S3ConnectParam(
    +    endpoint="localhost:9000", # the default MinIO service started along with Milvus
    +    access_key=ACCESS_KEY,
    +    secret_key=SECRET_KEY,
    +    bucket_name=BUCKET_NAME,
    +    secure=False
    +)
    +
    +from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +print('bulk writer created.')
    +
    +
    private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +

    Setelah parameter koneksi siap, Anda bisa mereferensikannya di RemoteBulkWriter sebagai berikut:

    + +
    from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +
    +RemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withConnectParam(storageConnectParam)
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withRemotePath("/")
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +RemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);
    +
    +
    +

    Parameter untuk membuat RemoteBulkWriter hampir sama dengan parameter untuk LocalBulkWriter, kecuali connect_param. Untuk detail tentang pengaturan parameter, lihat RemoteBulkWriter dan ConnectParam dalam referensi SDK.

    +
    +
    +

    Parameter untuk membuat RemoteBulkWriter hampir sama dengan parameter untuk LocalBulkWriter, kecuali StorageConnectParam. Untuk detail pengaturan parameter, lihat RemoteBulkWriter dan StorageConnectParam dalam referensi SDK.

    +
    +

    Mulai menulis

    +

    BulkWriter memiliki dua metode: append_row() menambahkan baris dari kumpulan data sumber, dan commit() mengomit baris yang ditambahkan ke file lokal atau bucket jarak jauh.

    +
    +
    +

    BulkWriter memiliki dua metode: appendRow() menambahkan baris dari kumpulan data sumber, dan commit() mengomit baris yang ditambahkan ke berkas lokal atau remote bucket.

    +
    +

    Untuk tujuan demonstrasi, kode berikut ini menambahkan data yang dibuat secara acak.

    + +
    import random, string, json
    +import numpy as np
    +import tensorflow as tf
    +
    +def generate_random_str(length=5):
    +    letters = string.ascii_uppercase
    +    digits = string.digits
    +    
    +    return ''.join(random.choices(letters + digits, k=length))
    +
    +# optional input for binary vector:
    +# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]
    +# 2. numpy array of uint8
    +def gen_binary_vector(to_numpy_arr):
    +    raw_vector = [random.randint(0, 1) for i in range(DIM)]
    +    if to_numpy_arr:
    +        return np.packbits(raw_vector, axis=-1)
    +    return raw_vector
    +
    +# optional input for float vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float32
    +def gen_float_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype="float32")
    +    return raw_vector
    +
    +# # optional input for bfloat16 vector:
    +# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# # 2. numpy array of bfloat16
    +# def gen_bf16_vector(to_numpy_arr):
    +#     raw_vector = [random.random() for _ in range(DIM)]
    +#     if to_numpy_arr:
    +#         return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()
    +#     return raw_vector
    +
    +# optional input for float16 vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float16
    +def gen_fp16_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype=np.float16)
    +    return raw_vector
    +
    +# optional input for sparse vector:
    +# only accepts dict like {2: 13.23, 45: 0.54} or {"indices": [1, 2], "values": [0.1, 0.2]}
    +# note: no need to sort the keys
    +def gen_sparse_vector(pair_dict: bool):
    +    raw_vector = {}
    +    dim = random.randint(2, 20)
    +    if pair_dict:
    +        raw_vector["indices"] = [i for i in range(dim)]
    +        raw_vector["values"] = [random.random() for _ in range(dim)]
    +    else:
    +        for i in range(dim):
    +            raw_vector[i] = random.random()
    +    return raw_vector
    +
    +for i in range(10000):
    +    writer.append_row({
    +        "id": np.int64(i),
    +        "bool": True if i % 3 == 0 else False,
    +        "int8": np.int8(i%128),
    +        "int16": np.int16(i%1000),
    +        "int32": np.int32(i%100000),
    +        "int64": np.int64(i),
    +        "float": np.float32(i/3),
    +        "double": np.float64(i/7),
    +        "varchar": f"varchar_{i}",
    +        "json": json.dumps({"dummy": i, "ok": f"name_{i}"}),
    +        "array_str": np.array([f"str_{k}" for k in range(5)], np.dtype("str")),
    +        "array_int": np.array([k for k in range(10)], np.dtype("int64")),
    +        "float_vector": gen_float_vector(True),
    +        "binary_vector": gen_binary_vector(True),
    +        "float16_vector": gen_fp16_vector(True),
    +        # "bfloat16_vector": gen_bf16_vector(True),
    +        "sparse_vector": gen_sparse_vector(True),
    +        f"dynamic_{i}": i,
    +    })
    +    if (i+1)%1000 == 0:
    +        writer.commit()
    +        print('committed')
    +
    +print(writer.batch_files)
    +
    +
    private static byte[] genBinaryVector() {
    +    Random ran = new Random();
    +    int byteCount = DIM / 8;
    +    ByteBuffer vector = ByteBuffer.allocate(byteCount);
    +    for (int i = 0; i < byteCount; ++i) {
    +        vector.put((byte) ran.nextInt(Byte.MAX_VALUE));
    +    }
    +    return vector.array();
    +}
    +
    +private static List<Float> genFloatVector() {
    +    Random ran = new Random();
    +    List<Float> vector = new ArrayList<>();
    +    for (int i = 0; i < DIM; ++i) {
    +        vector.add(ran.nextFloat());
    +    }
    +    return vector;
    +}
    +
    +private static byte[] genFloat16Vector() {
    +    List<Float> originalVector = genFloatVector();
    +    return Float16Utils.f32VectorToFp16Buffer(originalVector).array();
    +}
    +
    +private static SortedMap<Long, Float> genSparseVector() {
    +    Random ran = new Random();
    +    SortedMap<Long, Float> sparse = new TreeMap<>();
    +    int dim = ran.nextInt(18) + 2; // [2, 20)
    +    for (int i = 0; i < dim; ++i) {
    +        sparse.put((long)ran.nextInt(1000000), ran.nextFloat());
    +    }
    +    return sparse;
    +}
    +
    +private static List<String> genStringArray(int length) {
    +    List<String> arr = new ArrayList<>();
    +    for (int i = 0; i < length; i++) {
    +        arr.add("str_" + i);
    +    }
    +    return arr;
    +}
    +
    +private static List<Long> genIntArray(int length) {
    +    List<Long> arr = new ArrayList<>();
    +    for (long i = 0; i < length; i++) {
    +        arr.add(i);
    +    }
    +    return arr;
    +}
    +
    +private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +private static List<List<String>> uploadData() throws Exception {
    +    CreateCollectionReq.CollectionSchema collectionSchema = createSchema();
    +    try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {
    +        for (int i = 0; i < 10000; ++i) {
    +            JsonObject rowObject = new JsonObject();
    +
    +            rowObject.addProperty("id", i);
    +            rowObject.addProperty("bool", i % 3 == 0);
    +            rowObject.addProperty("int8", i % 128);
    +            rowObject.addProperty("int16", i % 1000);
    +            rowObject.addProperty("int32", i % 100000);
    +            rowObject.addProperty("int64", i);
    +            rowObject.addProperty("float", i / 3);
    +            rowObject.addProperty("double", i / 7);
    +            rowObject.addProperty("varchar", "varchar_" + i);
    +            rowObject.addProperty("json", String.format("{\"dummy\": %s, \"ok\": \"name_%s\"}", i, i));
    +            rowObject.add("array_str", GSON_INSTANCE.toJsonTree(genStringArray(5)));
    +            rowObject.add("array_int", GSON_INSTANCE.toJsonTree(genIntArray(10)));
    +            rowObject.add("float_vector", GSON_INSTANCE.toJsonTree(genFloatVector()));
    +            rowObject.add("binary_vector", GSON_INSTANCE.toJsonTree(genBinaryVector()));
    +            rowObject.add("float16_vector", GSON_INSTANCE.toJsonTree(genFloat16Vector()));
    +            rowObject.add("sparse_vector", GSON_INSTANCE.toJsonTree(genSparseVector()));
    +            rowObject.addProperty("dynamic", "dynamic_" + i);
    +
    +            remoteBulkWriter.appendRow(rowObject);
    +
    +            if ((i+1)%1000 == 0) {
    +                remoteBulkWriter.commit(false);
    +            }
    +        }
    +
    +        List<List<String>> batchFiles = remoteBulkWriter.getBatchFiles();
    +        System.out.println(batchFiles);
    +        return batchFiles;
    +    } catch (Exception e) {
    +        throw e;
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +}
    +
    +

    Memverifikasi hasil

    +

    Untuk memeriksa hasilnya, Anda dapat memperoleh jalur keluaran yang sebenarnya dengan mencetak properti batch_files milik penulis.

    +
    +
    +

    Untuk memeriksa hasilnya, Anda bisa mendapatkan jalur keluaran yang sebenarnya dengan mencetak metode getBatchFiles() dari penulis.

    +
    + +
    print(writer.batch_files)
    +
    +# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],
    +#  ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]
    +
    +
    // localBulkWriter.getBatchFiles();
    +remoteBulkWriter.getBatchFiles();
    +
    +// 
    +
    +// Close the BulkWriter
    +try {
    +    localBulkWriter.close();
    +    remoteBulkWriter.close();            
    +} catch (Exception e) {
    +    // TODO: handle exception
    +    e.printStackTrace();
    +}
    +
    +

    BulkWriter menghasilkan UUID, membuat sub-folder menggunakan UUID di direktori output yang disediakan, dan menempatkan semua file yang dihasilkan di sub-folder. Klik di sini untuk mengunduh data sampel yang telah disiapkan.

    +

    Struktur folder yang mungkin adalah sebagai berikut:

    +
    # JSON
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.json 
    +
    +# Parquet
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.parquet 
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.json b/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.json new file mode 100644 index 000000000..e7457dc76 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n filter=\"color in ['red_3314', 'purple_7392']\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .filter(\"color in ['red_3314', 'purple_7392']\")​\n .build());​\n​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Delete entities​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n filter: \"color in ['red', 'green']\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 3​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color in [\\\"red_3314\\\", \\\"purple_7392\\\"]\"​\n}'​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n ids=[18, 19]​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19]​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":{}}​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n ids=[18, 19],​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .partitionName(\"partitionA\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19],​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"cost\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Delete Entities​","anchorList":[{"label":"Menghapus Entitas","href":"Delete-Entities​","type":1,"isActive":false},{"label":"Menghapus Entitas dengan Memfilter Kondisi","href":"Delete-Entities-by-Filtering-Conditions​","type":2,"isActive":false},{"label":"Menghapus Entitas dengan Kunci Primer","href":"Delete-Entities-by-Primary-Keys​","type":2,"isActive":false},{"label":"Menghapus Entitas dari Partisi","href":"Delete-Entities-from-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.md b/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.md new file mode 100644 index 000000000..877b980a7 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/delete-entities.md @@ -0,0 +1,257 @@ +--- +id: delete-entities.md +title: Hapus Entitas +--- +

    Menghapus Entitas

    Anda dapat menghapus entitas yang tidak lagi dibutuhkan dengan memfilter kondisi atau primary key-nya.

    +

    Menghapus Entitas dengan Memfilter Kondisi

    Ketika menghapus beberapa entitas yang memiliki beberapa atribut yang sama dalam satu kelompok, Anda dapat menggunakan ekspresi penyaringan. Contoh kode di bawah ini menggunakan operator in untuk menghapus secara massal semua Entitas dengan field warna yang disetel ke nilai merah dan hijau. Anda juga dapat menggunakan operator lain untuk membuat ekspresi filter yang sesuai dengan kebutuhan Anda. Untuk informasi lebih lanjut mengenai ekspresi filter, silakan lihat Pemfilteran Metadata.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    filter="color in ['red_3314', 'purple_7392']"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +ilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .filter("color in ['red_3314', 'purple_7392']")​
    +        .build());​
    +​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Delete entities​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    filter: "color in ['red', 'green']"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 3​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color in [\"red_3314\", \"purple_7392\"]"​
    +}'​
    +
    +
    +

    Menghapus Entitas dengan Kunci Primer

    Dalam banyak kasus, kunci primer mengidentifikasi Entitas secara unik. Anda dapat menghapus Entitas dengan mengatur kunci primernya dalam permintaan hapus. Contoh kode di bawah ini menunjukkan cara menghapus dua entitas dengan kunci primer 18 dan 19.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    ids=[18, 19]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19]​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +## {"code":0,"cost":0,"data":{}}​
    +
    +
    +

    Menghapus Entitas dari Partisi

    Anda juga dapat menghapus entitas yang disimpan dalam partisi tertentu. Cuplikan kode berikut ini mengasumsikan bahwa Anda memiliki partisi bernama PartitionA dalam koleksi Anda.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    ids=[18, 19],​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .partitionName("partitionA")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19],​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "cost": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.json b/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.json new file mode 100644 index 000000000..22d8a79c0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n partition_name=\"partitionA\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_name: \"partitionA\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 10,​\n# 11,​\n# 12,​\n# 13,​\n# 14,​\n# 15,​\n# 16,​\n# 17,​\n# 18,​\n# 19​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Insert Entities​","anchorList":[{"label":"Menyisipkan Entitas","href":"Insert-Entities​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menyisipkan Entitas ke dalam Koleksi","href":"Insert-Entities-into-a-Collection​","type":2,"isActive":false},{"label":"Menyisipkan Entitas ke dalam Partisi","href":"Insert-Entities-into-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.md b/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.md new file mode 100644 index 000000000..06cd39640 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/insert-update-delete.md @@ -0,0 +1,365 @@ +--- +id: insert-update-delete.md +summary: >- + Entitas dalam sebuah koleksi adalah catatan data yang memiliki kumpulan field + yang sama. Nilai-nilai field dalam setiap record data membentuk sebuah + entitas. Halaman ini memperkenalkan cara menyisipkan entitas ke dalam koleksi. +title: Menyisipkan Entitas +--- +

    Menyisipkan Entitas

    Entitas dalam koleksi adalah catatan data yang memiliki kumpulan field yang sama. Nilai-nilai field dalam setiap record data membentuk sebuah entitas. Halaman ini memperkenalkan cara menyisipkan entitas ke dalam koleksi.

    +

    Gambaran Umum

    Di Milvus, Entitas merujuk pada catatan data dalam Koleksi yang berbagi Skema yang sama, dengan data di setiap bidang dalam satu baris yang membentuk Entitas. Oleh karena itu, Entitas dalam Koleksi yang sama memiliki atribut yang sama (seperti nama field, tipe data, dan batasan-batasan lainnya).

    +

    Ketika menyisipkan Entitas ke dalam Koleksi, Entitas yang akan disisipkan hanya bisa berhasil ditambahkan jika berisi semua field yang didefinisikan dalam Skema. Entitas yang disisipkan akan masuk ke dalam Partisi bernama _default sesuai urutan penyisipan. Asalkan Partisi tertentu ada, Anda juga dapat menyisipkan Entitas ke dalam Partisi tersebut dengan menentukan nama Partisi dalam permintaan penyisipan.

    +

    Milvus juga mendukung field dinamis untuk menjaga skalabilitas Koleksi. Ketika field dinamis diaktifkan, Anda dapat menyisipkan field yang tidak didefinisikan di dalam Skema ke dalam Collection. Field dan nilai ini akan disimpan sebagai pasangan key-value dalam sebuah field yang dicadangkan bernama $meta. Untuk informasi lebih lanjut mengenai bidang dinamis, silakan lihat Bidang Dinamis.

    +

    Menyisipkan Entitas ke dalam Koleksi

    Sebelum memasukkan data, Anda perlu mengatur data Anda ke dalam daftar kamus sesuai dengan Skema, dengan setiap kamus mewakili Entitas dan berisi semua bidang yang didefinisikan dalam Skema. Jika Koleksi memiliki field dinamis yang diaktifkan, setiap kamus juga dapat menyertakan field yang tidak didefinisikan dalam Skema.

    +

    Pada bagian ini, Anda akan memasukkan Entitas ke dalam Koleksi yang dibuat dengan cara penyiapan cepat. Koleksi yang dibuat dengan cara ini hanya memiliki dua field, yaitu id dan vektor. Selain itu, Koleksi ini memiliki field dinamis yang diaktifkan, sehingga Entitas dalam kode contoh menyertakan field bernama **warna **yang tidak didefinisikan dalam Skema.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Menyisipkan Entitas ke dalam Partisi

    Anda juga dapat menyisipkan entitas ke dalam partisi tertentu. Cuplikan kode berikut mengasumsikan bahwa Anda memiliki partisi bernama PartitionA dalam koleksi Anda.

    + +
    data=[​
    +    {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    partition_name="partitionA",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_name: "partitionA",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             10,​
    +#             11,​
    +#             12,​
    +#             13,​
    +#             14,​
    +#             15,​
    +#             16,​
    +#             17,​
    +#             18,​
    +#             19​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.json b/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.json new file mode 100644 index 000000000..8165a254b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"},​\n {\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"},​\n {\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"},​\n {\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"},​\n {\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"},​\n {\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"},​\n {\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"},​\n {\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"},​\n {\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"},​\n {\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}​\n]​\n​\nres = client.upsert(​\n collection_name='quick_setup',​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \\\"color\\\": \\\"black_9898\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \\\"color\\\": \\\"red_7319\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \\\"color\\\": \\\"white_6465\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \\\"color\\\": \\\"orange_7580\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \\\"color\\\": \\\"red_3314\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \\\"color\\\": \\\"black_9955\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \\\"color\\\": \\\"yellow_2461\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \\\"color\\\": \\\"white_5015\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \\\"color\\\": \\\"purple_6414\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \\\"color\\\": \\\"brown_7231\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\ndata = [​\n {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: \"black_9898\"},​\n {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: \"red_7319\"},​\n {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: \"white_6465\"},​\n {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: \"orange_7580\"},​\n {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: \"red_3314\"},​\n {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: \"black_9955\"},​\n {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: \"yellow_2461\"},​\n {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: \"white_5015\"},​\n {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: \"purple_6414\"},​\n {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: \"brown_7231\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n]​\n​\nres = client.upsert(​\n collection_name=\"quick_setup\",​\n data=data,​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \\\"color\\\": \\\"black_3651\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \\\"color\\\": \\\"grey_2049\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \\\"color\\\": \\\"blue_6168\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \\\"color\\\": \\\"blue_1672\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \\\"color\\\": \\\"pink_1601\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \\\"color\\\": \\\"yellow_9925\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \\\"color\\\": \\\"orange_9872\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \\\"color\\\": \\\"red_6450\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \\\"color\\\": \\\"purple_7392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \\\"color\\\": \\\"pink_4996\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 6. Upsert data in partitions​\ndata = [​\n {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: \"black_3651\"},​\n {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: \"grey_2049\"},​\n {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: \"blue_6168\"},​\n {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: \"blue_1672\"},​\n {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: \"pink_1601\"},​\n {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: \"yellow_9925\"},​\n {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: \"orange_9872\"},​\n {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: \"red_6450\"},​\n {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: \"purple_7392\"},​\n {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: \"pink_4996\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Upsert Entities​","anchorList":[{"label":"Entitas Upsert","href":"Upsert-Entities​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menyisipkan Entitas ke dalam Koleksi","href":"Upsert-Entity-in-a-Collection​","type":2,"isActive":false},{"label":"Menyisipkan Entitas ke dalam Partisi","href":"Upsert-Entities-in-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.md b/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.md new file mode 100644 index 000000000..30a98f524 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/insert-and-delete/upsert-entities.md @@ -0,0 +1,360 @@ +--- +id: upsert-entities.md +title: Entitas Upsert +--- +

    Entitas Upsert

    Operasi Upsert menggabungkan tindakan memperbarui dan menyisipkan data. Milvus menentukan apakah akan melakukan operasi update atau insert dengan memeriksa apakah kunci utama ada. Bagian ini akan memperkenalkan bagaimana cara melakukan Upsert sebuah Entitas dan perilaku spesifik dari operasi Upsert dalam berbagai skenario.

    +

    Gambaran Umum

    Ketika Anda perlu memperbarui Entitas dalam Koleksi atau tidak yakin apakah akan memperbarui atau menyisipkan, Anda dapat mencoba menggunakan operasi Upsert. Ketika menggunakan operasi ini, sangat penting untuk memastikan bahwa Entitas yang disertakan dalam permintaan Upsert berisi kunci utama; jika tidak, maka akan terjadi kesalahan. Setelah menerima permintaan Upsert, Milvus akan menjalankan proses berikut.

    +
      +
    1. Periksa apakah bidang utama Koleksi telah diaktifkan AutoId.

      +

      a. Jika ya, Milvus akan mengganti kunci utama di Entitas dengan kunci utama yang dibuat secara otomatis dan menyisipkan data.

      +

      b. Jika tidak, Milvus akan menggunakan primary key yang dimiliki oleh Entity untuk memasukkan data.

    2. +
    3. Lakukan operasi hapus berdasarkan nilai primary key dari Entitas yang disertakan di dalam permintaan Upsert.

    4. +
    +

    + + Upsert Entities + Menyisipkan Entitas

    +

    Menyisipkan Entitas ke dalam Koleksi

    Pada bagian ini, Anda akan meng-upsert Entitas ke dalam Koleksi yang dibuat dengan cara penyiapan cepat. Koleksi yang dibuat dengan cara ini hanya memiliki dua field, yaitu id dan vektor. Sebagai tambahan, Koleksi ini memiliki field dinamis yang diaktifkan, sehingga Entitas dalam kode contoh menyertakan field bernama color yang tidak didefinisikan dalam Skema.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_9898"},​
    +    {"id": 1, "vector": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], "color": "red_7319"},​
    +    {"id": 2, "vector": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], "color": "white_6465"},​
    +    {"id": 3, "vector": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], "color": "orange_7580"},​
    +    {"id": 4, "vector": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], "color": "red_3314"},​
    +    {"id": 5, "vector": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], "color": "black_9955"},​
    +    {"id": 6, "vector": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], "color": "yellow_2461"},​
    +    {"id": 7, "vector": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], "color": "white_5015"},​
    +    {"id": 8, "vector": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], "color": "purple_6414"},​
    +    {"id": 9, "vector": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], "color": "brown_7231"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name='quick_setup',​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +data = [​
    +    {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: "black_9898"},​
    +    {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: "red_7319"},​
    +    {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: "white_6465"},​
    +    {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: "orange_7580"},​
    +    {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: "red_3314"},​
    +    {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: "black_9955"},​
    +    {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: "yellow_2461"},​
    +    {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: "white_5015"},​
    +    {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: "purple_6414"},​
    +    {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: "brown_7231"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Menyisipkan Entitas ke dalam Partisi

    Anda juga dapat menyisipkan entitas ke dalam partisi tertentu. Cuplikan kode berikut mengasumsikan bahwa Anda memiliki partisi bernama PartitionA dalam koleksi Anda.

    + +
    data=[​
    +    {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +    {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +    {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +    {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +    {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +    {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +    {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +    {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +    {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +    {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name="quick_setup",​
    +    data=data,​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 6. Upsert data in partitions​
    +data = [​
    +    {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: "black_3651"},​
    +    {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: "grey_2049"},​
    +    {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: "blue_6168"},​
    +    {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: "blue_1672"},​
    +    {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: "pink_1601"},​
    +    {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: "yellow_9925"},​
    +    {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: "orange_9872"},​
    +    {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: "red_6450"},​
    +    {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: "purple_7392"},​
    +    {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: "pink_4996"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +        {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +        {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +        {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +        {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +        {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +        {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +        {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +        {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +        {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.json b/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.json new file mode 100644 index 000000000..fb59e801c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nindex_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​\nindex_params.add_index(​\n field_name=\"category\", # Name of the scalar field to be indexed​\n index_type=\"BITMAP\", # Type of index to be created​\n index_name=\"category_bitmap_index\" # Name of the index to be created​\n)​\n​\nclient.create_index(​\n collection_name=\"my_collection\", # Specify the collection name​\n index_params=index_params​\n)​\n\n"],"headingContent":"BITMAP​","anchorList":[{"label":"BITMAP","href":"BITMAP​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Membuat indeks bitmap","href":"Create-a-bitmap-index","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.md b/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.md new file mode 100644 index 000000000..702e6e28b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/bitmap.md @@ -0,0 +1,125 @@ +--- +id: bitmap.md +title: BITMAP +related_key: bitmap +summary: >- + Pengindeksan Bitmap adalah teknik pengindeksan yang efisien yang dirancang + untuk meningkatkan kinerja kueri pada bidang skalar dengan kardinalitas + rendah. +--- +

    BITMAP

    Pengindeksan Bitmap adalah teknik pengindeksan yang efisien yang dirancang untuk meningkatkan performa kueri pada bidang skalar dengan kardinalitas rendah. Kardinalitas mengacu pada jumlah nilai yang berbeda dalam suatu bidang. Bidang dengan lebih sedikit elemen yang berbeda dianggap memiliki kardinalitas rendah.

    +

    Jenis indeks ini membantu mengurangi waktu pengambilan kueri skalar dengan merepresentasikan nilai bidang dalam format biner yang ringkas dan melakukan operasi bitwise yang efisien. Dibandingkan dengan jenis indeks lainnya, indeks bitmap biasanya memiliki efisiensi ruang yang lebih tinggi dan kecepatan kueri yang lebih cepat saat berurusan dengan bidang dengan kardinalitas rendah.

    +

    Gambaran Umum

    Istilah Bitmap menggabungkan dua kata: Bit dan Peta. Bit mewakili unit data terkecil dalam komputer, yang hanya dapat menyimpan nilai 0 atau 1. Peta, dalam konteks ini, mengacu pada proses mengubah dan mengatur data sesuai dengan nilai apa yang harus diberikan pada 0 dan 1.

    +

    Indeks bitmap terdiri dari dua komponen utama: bitmap dan kunci. Kunci mewakili nilai unik dalam bidang yang diindeks. Untuk setiap nilai unik, ada bitmap yang sesuai. Panjang bitmap ini sama dengan jumlah record dalam koleksi. Setiap bit dalam bitmap berhubungan dengan sebuah record dalam koleksi. Jika nilai bidang yang diindeks dalam sebuah rekaman cocok dengan kunci, bit yang sesuai diset ke 1; jika tidak, bit tersebut diset ke 0.

    +

    Pertimbangkan sebuah koleksi dokumen dengan bidang Kategori dan Publik. Kita ingin mengambil dokumen yang termasuk dalam kategori Teknologi dan terbuka untuk Publik. Dalam kasus ini, kunci untuk indeks bitmap kita adalah Tech dan Public.

    +

    + + Bitmap indexing + Pengindeksan bitmap

    +

    Seperti yang ditunjukkan pada gambar, indeks bitmap untuk Kategori dan Publik adalah.

    +
      +
    • Tech: [1, 0, 1, 0, 0], yang menunjukkan bahwa hanya dokumen ke-1 dan ke-3 yang masuk ke dalam kategori Teknologi.

    • +
    • Publik: [1, 0, 0, 1, 0], yang menunjukkan bahwa hanya dokumen ke-1 dan ke-4 yang terbuka untuk Publik.

    • +
    +

    Untuk menemukan dokumen yang sesuai dengan kedua kriteria tersebut, kita melakukan operasi bitwise AND pada kedua bitmap ini.

    +
      +
    • Teknologi DAN Publik: [1, 0, 0, 0, 0]
    • +
    +

    Bitmap yang dihasilkan [1, 0, 0, 0, 0] mengindikasikan bahwa hanya dokumen pertama(ID 1) yang memenuhi kedua kriteria. Dengan menggunakan indeks bitmap dan operasi bitwise yang efisien, kita dapat dengan cepat mempersempit cakupan pencarian, sehingga tidak perlu memindai seluruh kumpulan data.

    +

    Membuat indeks bitmap

    Untuk membuat indeks bitmap di Milvus, gunakan metode create_index() dan atur parameter index_type ke "BITMAP".

    +
    from pymilvus import MilvusClient​
    +​
    +index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​
    +index_params.add_index(​
    +    field_name="category", # Name of the scalar field to be indexed​
    +    index_type="BITMAP", # Type of index to be created​
    +    index_name="category_bitmap_index" # Name of the index to be created​
    +)​
    +​
    +client.create_index(​
    +    collection_name="my_collection", # Specify the collection name​
    +    index_params=index_params​
    +)​
    +
    +
    +

    Pada contoh ini, kita membuat indeks bitmap pada bidang category dari koleksi my_collection. Metode add_index() digunakan untuk menentukan nama field, tipe indeks, dan nama indeks.

    +

    Setelah indeks bitmap dibuat, Anda dapat menggunakan parameter filter dalam operasi kueri untuk melakukan pemfilteran skalar berdasarkan bidang yang diindeks. Hal ini memungkinkan Anda mempersempit hasil pencarian secara efisien dengan menggunakan indeks bitmap. Untuk informasi lebih lanjut, lihat Pemfilteran Metadata.

    +

    Batasan

      +
    • Indeks bitmap hanya didukung untuk bidang skalar yang bukan merupakan kunci utama.

    • +
    • Tipe data bidang harus merupakan salah satu dari yang berikut ini.

      +
        +
      • BOOL, INT8, INT16, INT32, INT64, VARCHAR

      • +
      • ARRAY (elemen harus salah satu dari: BOOL, INT8, INT16, INT32, INT64, VARCHAR)

      • +
    • +
    • Indeks Bitmap tidak mendukung tipe data berikut ini.

      +
        +
      • FLOAT, DOUBLE: Tipe floating-point tidak kompatibel dengan sifat biner indeks bitmap.

      • +
      • JSON: Tipe data JSON memiliki struktur kompleks yang tidak dapat direpresentasikan secara efisien menggunakan indeks bitmap.

      • +
    • +
    • Indeks bitmap tidak cocok untuk bidang dengan kardinalitas tinggi (yaitu, bidang dengan sejumlah besar nilai yang berbeda).

      +
        +
      • Sebagai pedoman umum, indeks bitmap paling efektif bila kardinalitas bidang kurang dari 500.

      • +
      • Ketika kardinalitas meningkat melebihi ambang batas ini, manfaat kinerja indeks bitmap berkurang, dan overhead penyimpanan menjadi signifikan.

      • +
      • Untuk bidang dengan kardinalitas tinggi, pertimbangkan untuk menggunakan teknik pengindeksan alternatif seperti indeks terbalik, tergantung pada kasus penggunaan dan persyaratan kueri Anda.

      • +
    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.json b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.json new file mode 100644 index 000000000..bc440217e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.json @@ -0,0 +1 @@ +{"codeList":["# Auto indexing\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\nindex_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters\n\nindex_params.add_index(\n field_name=\"scalar_1\", # Name of the scalar field to be indexed\n index_type=\"\", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n index_name=\"default_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"default_index\") // Name of the index to be created\n .indexType(\"\") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"default_index\", // Name of the index to be created\n index_type: \"\" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n})\n","index_params = MilvusClient.prepare_index_params() # Prepare an IndexParams object\n\nindex_params.add_index(\n field_name=\"scalar_2\", # Name of the scalar field to be indexed\n index_type=\"INVERTED\", # Type of index to be created\n index_name=\"inverted_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"inverted_index\") // Name of the index to be created\n .indexType(\"INVERTED\") // Type of index to be created\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"inverted_index\", // Name of the index to be created\n index_type: \"INVERTED\" // Type of index to be created\n})\n","client.list_indexes(\n collection_name=\"test_scalar_index\" # Specify the collection name\n)\n\n# Output:\n# ['default_index','inverted_index']\n","import java.util.List;\nimport io.milvus.v2.service.index.request.ListIndexesReq;\n\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ]\n","res = await client.listIndexes({\n collection_name: 'test_scalar_index'\n})\n\nconsole.log(res.indexes)\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ] \n"],"headingContent":"Index Scalar Fields","anchorList":[{"label":"Bidang Skalar Indeks","href":"Index-Scalar-Fields","type":1,"isActive":false},{"label":"Jenis pengindeksan skalar","href":"Types-of-scalar-indexing","type":2,"isActive":false},{"label":"Pengindeksan otomatis","href":"Auto-indexing","type":2,"isActive":false},{"label":"Pengindeksan khusus","href":"Custom-indexing","type":2,"isActive":false},{"label":"Memverifikasi hasil","href":"Verifying-the-result","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.md b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.md new file mode 100644 index 000000000..62ee2c154 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-scalar-fields.md @@ -0,0 +1,326 @@ +--- +id: index-scalar-fields.md +order: 2 +summary: >- + Panduan ini akan memandu Anda dalam membuat dan mengonfigurasi indeks skalar + untuk bidang seperti bilangan bulat, string, dll. +title: Bidang Skalar Indeks +--- +

    Bidang Skalar Indeks

    Di Milvus, indeks skalar digunakan untuk mempercepat penyaringan metafilter berdasarkan nilai bidang non-vektor tertentu, mirip dengan indeks basis data tradisional. Panduan ini akan memandu Anda dalam membuat dan mengonfigurasi indeks skalar untuk bidang seperti bilangan bulat, string, dll.

    +

    Jenis pengindeksan skalar

      +
    • Pengindeksan otomatis: Milvus secara otomatis menentukan tipe indeks berdasarkan tipe data dari field skalar. Ini cocok bila Anda tidak perlu mengontrol jenis indeks tertentu.

    • +
    • Pengindeksan khusus: Anda menentukan jenis indeks yang tepat, seperti indeks terbalik atau indeks bitmap. Ini memberikan kontrol lebih besar atas pemilihan jenis indeks.

    • +
    +

    Pengindeksan otomatis

    +

    Untuk menggunakan pengindeksan otomatis, hilangkan parameter index_type di add_index()sehingga Milvus dapat menyimpulkan jenis indeks berdasarkan jenis bidang skalar.

    +
    +
    +

    Untuk menggunakan pengindeksan otomatis, hilangkan parameter indexType dalam IndexParamagar Milvus dapat menyimpulkan tipe indeks berdasarkan tipe field skalar.

    +
    +
    +

    Untuk menggunakan pengindeksan otomatis, hilangkan parameter index_type dalam createIndex()sehingga Milvus dapat menyimpulkan tipe indeks berdasarkan tipe field skalar.

    +
    +

    Untuk pemetaan antara tipe data skalar dan algoritme pengindeksan default, lihat Algoritme pengindeksan bidang skalar.

    + +
    # Auto indexing
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +index_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
    +
    +index_params.add_index(
    +    field_name="scalar_1", # Name of the scalar field to be indexed
    +    index_type="", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    index_name="default_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("default_index") // Name of the index to be created
    +    .indexType("") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "default_index", // Name of the index to be created
    +    index_type: "" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +})
    +
    +

    Pengindeksan khusus

    +

    Untuk menggunakan pengindeksan khusus, tentukan jenis indeks tertentu menggunakan parameter index_type di add_index().

    +
    +
    +

    Untuk menggunakan pengindeksan khusus, tentukan jenis indeks tertentu menggunakan parameter indexType di dalam file . IndexParam.

    +
    +
    +

    Untuk menggunakan pengindeksan khusus, tentukan jenis indeks tertentu menggunakan parameter index_type di createIndex().

    +
    +

    Contoh di bawah ini membuat indeks terbalik untuk bidang skalar scalar_2.

    + +
    index_params = MilvusClient.prepare_index_params() #  Prepare an IndexParams object
    +
    +index_params.add_index(
    +    field_name="scalar_2", # Name of the scalar field to be indexed
    +    index_type="INVERTED", # Type of index to be created
    +    index_name="inverted_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("inverted_index") // Name of the index to be created
    +    .indexType("INVERTED") // Type of index to be created
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "inverted_index", // Name of the index to be created
    +    index_type: "INVERTED" // Type of index to be created
    +})
    +
    +
    +

    Metode dan Parameter

    +
      +
    • prepare_index_params ()

      +

      Mempersiapkan objek IndexParams.

    • +
    • add_index()

      +

      Menambahkan konfigurasi indeks ke objek IndexParams.

      +
        +
      • field_name(string)

        +

        Nama bidang skalar yang akan diindeks.

      • +
      • index_type(string):

        +

        Jenis indeks skalar yang akan dibuat. Untuk pengindeksan implisit, biarkan kosong atau hilangkan parameter ini.

        +

        Untuk pengindeksan khusus, nilai yang valid adalah:

        +
          +
        • INVERTED: (Disarankan) Indeks terbalik terdiri dari kamus istilah yang berisi semua kata bertanda yang diurutkan menurut abjad. Untuk detailnya, lihat Indeks Skalar.

        • +
        • STL_SORT: Mengurutkan bidang skalar menggunakan algoritme pengurutan pustaka templat standar. Hanya mendukung bidang numerik (misalnya, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).

        • +
        • Trie: Struktur data pohon untuk pencarian dan pengambilan awalan yang cepat. Mendukung bidang VARCHAR.

        • +
      • +
      • nama_indeks(string)

        +

        Nama indeks skalar yang akan dibuat. Setiap bidang skalar mendukung satu indeks.

      • +
    • +
    • create_index ()

      +

      Membuat indeks dalam koleksi yang ditentukan.

      +
        +
      • nama_koleksi(string)

        +

        Nama koleksi yang akan dibuat indeksnya.

      • +
      • index_params

        +

        Objek IndexParams yang berisi konfigurasi indeks.

      • +
    • +
    +
    +
    +

    Metode dan Parameter

    +
      +
    • IndexParamMempersiapkan objek IndexParam.
        +
      • fieldName(String) Nama bidang skalar yang akan diindeks.
      • +
      • indexName(String) Nama indeks skalar yang akan dibuat. Setiap bidang skalar mendukung satu indeks.
      • +
      • indexType(String) Jenis indeks skalar yang akan dibuat. Untuk pengindeksan implisit, biarkan kosong atau hilangkan parameter ini. Untuk pengindeksan khusus, nilai yang valid adalah:
          +
        • INVERTED: (Disarankan) Indeks terbalik terdiri dari kamus istilah yang berisi semua kata bertanda yang diurutkan menurut abjad. Untuk detailnya, lihat Indeks Skalar.
        • +
        • STL_SORT: Mengurutkan bidang skalar menggunakan algoritme pengurutan pustaka templat standar. Mendukung bidang Boolean dan numerik (misalnya, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).
        • +
        • Trie: Struktur data pohon untuk pencarian dan pengambilan awalan yang cepat. Mendukung bidang VARCHAR.
        • +
      • +
    • +
    • CreateIndexReqMembuat indeks dalam koleksi yang ditentukan.
        +
      • collectionName(String) Nama koleksi tempat indeks dibuat.
      • +
      • indexParams(Daftar) Daftar objek IndexParam yang berisi konfigurasi indeks.
      • +
    • +
    +
    +
    +

    Metode dan Parameter

    +
      +
    • createIndex

      +

      Membuat indeks dalam koleksi yang ditentukan.

      +
        +
      • collection_name(string) Nama koleksi tempat indeks dibuat.
      • +
      • field_name(string) Nama bidang skalar yang akan diindeks.
      • +
      • index_name(string) Nama indeks skalar yang akan dibuat. Setiap bidang skalar mendukung satu indeks.
      • +
      • index_type(string) Jenis indeks skalar yang akan dibuat. Untuk pengindeksan implisit, biarkan kosong atau hilangkan parameter ini. Untuk pengindeksan khusus, nilai yang valid adalah:
          +
        • INVERTED: (Disarankan) Indeks terbalik terdiri dari kamus istilah yang berisi semua kata bertanda yang diurutkan menurut abjad. Untuk detailnya, lihat Indeks Skalar.
        • +
        • STL_SORT: Mengurutkan bidang skalar menggunakan algoritme pengurutan pustaka templat standar. Mendukung bidang Boolean dan numerik (misalnya, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).
        • +
        • Trie: Struktur data pohon untuk pencarian dan pengambilan awalan yang cepat. Mendukung bidang VARCHAR.
        • +
      • +
    • +
    +
    +

    Memverifikasi hasil

    +

    Gunakan metode list_indexes() untuk memverifikasi pembuatan indeks skalar:

    +
    +
    +

    Gunakan metode listIndexes() untuk memverifikasi pembuatan indeks skalar:

    +
    +
    +

    Gunakan metode listIndexes() untuk memverifikasi pembuatan indeks skalar:

    +
    + +
    client.list_indexes(
    +    collection_name="test_scalar_index"  # Specify the collection name
    +)
    +
    +# Output:
    +# ['default_index','inverted_index']
    +
    +
    import java.util.List;
    +import io.milvus.v2.service.index.request.ListIndexesReq;
    +
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("test_scalar_index")  // Specify the collection name
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]
    +
    +
    res = await client.listIndexes({
    +    collection_name: 'test_scalar_index'
    +})
    +
    +console.log(res.indexes)
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]   
    +
    +

    Batasan

      +
    • Saat ini, pengindeksan skalar mendukung tipe data INT8, INT16, INT32, INT64, FLOAT, DOUBLE, BOOL, VARCHAR, dan ARRAY, tetapi tidak mendukung tipe data JSON.
    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.json b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.json new file mode 100644 index 000000000..9c2b18896 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# 1. Set up a Milvus client\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\n# 2. Create schema\n# 2.1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True,\n)\n\n# 2.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)\n\n# 3. Create collection\nclient.create_collection(\n collection_name=\"customized_setup\", \n schema=schema, \n)\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";\n\n// 1. Connect to Milvus server\nConnectConfig connectConfig = ConnectConfig.builder()\n .uri(CLUSTER_ENDPOINT)\n .build();\n\nMilvusClientV2 client = new MilvusClientV2(connectConfig);\n\n// 2. Create a collection\n\n// 2.1 Create schema\nCreateCollectionReq.CollectionSchema schema = client.createSchema();\n\n// 2.2 Add fields to schema\nschema.addField(AddFieldReq.builder().fieldName(\"id\").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());\nschema.addField(AddFieldReq.builder().fieldName(\"vector\").dataType(DataType.FloatVector).dimension(5).build());\n\n// 3 Create a collection without schema and index parameters\nCreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()\n.collectionName(\"customized_setup\")\n.collectionSchema(schema)\n.build();\n\nclient.createCollection(customizedSetupReq);\n","// 1. Set up a Milvus Client\nclient = new MilvusClient({address, token});\n\n// 2. Define fields for the collection\nconst fields = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n autoID: false\n },\n {\n name: \"vector\",\n data_type: DataType.FloatVector,\n dim: 5\n },\n]\n\n// 3. Create a collection\nres = await client.createCollection({\n collection_name: \"customized_setup\",\n fields: fields,\n})\n\nconsole.log(res.error_code) \n\n// Output\n// \n// Success\n// \n","# 4.1. Set up the index parameters\nindex_params = MilvusClient.prepare_index_params()\n\n# 4.2. Add an index on the vector field.\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"IVF_FLAT\",\n index_name=\"vector_index\",\n params={ \"nlist\": 128 }\n)\n\n# 4.3. Create an index file\nclient.create_index(\n collection_name=\"customized_setup\",\n index_params=index_params,\n sync=False # Whether to wait for index creation to complete before returning. Defaults to True.\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\n// 4 Prepare index parameters\n\n// 4.2 Add an index for the vector field \"vector\"\nIndexParam indexParamForVectorField = IndexParam.builder()\n .fieldName(\"vector\")\n .indexName(\"vector_index\")\n .indexType(IndexParam.IndexType.IVF_FLAT)\n .metricType(IndexParam.MetricType.COSINE)\n .extraParams(Map.of(\"nlist\", 128))\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\n// 4.3 Crate an index file\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","// 4. Set up index for the collection\n// 4.1. Set up the index parameters\nres = await client.createIndex({\n collection_name: \"customized_setup\",\n field_name: \"vector\",\n index_type: \"AUTOINDEX\",\n metric_type: \"COSINE\", \n index_name: \"vector_index\",\n params: { \"nlist\": 128 }\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n","# 5. Describe index\nres = client.list_indexes(\n collection_name=\"customized_setup\"\n)\n\nprint(res)\n\n# Output\n#\n# [\n# \"vector_index\",\n# ]\n\nres = client.describe_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n\nprint(res)\n\n# Output\n#\n# {\n# \"index_type\": ,\n# \"metric_type\": \"COSINE\",\n# \"field_name\": \"vector\",\n# \"index_name\": \"vector_index\"\n# }\n","import io.milvus.v2.service.index.request.DescribeIndexReq;\nimport io.milvus.v2.service.index.response.DescribeIndexResp;\n\n// 5. Describe index\n// 5.1 List the index names\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"customized_setup\")\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"vector_index\"\n// ]\n\n// 5.2 Describe an index\nDescribeIndexReq describeIndexReq = DescribeIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nDescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);\n\nSystem.out.println(JSONObject.toJSON(describeIndexResp));\n\n// Output:\n// {\n// \"metricType\": \"COSINE\",\n// \"indexType\": \"AUTOINDEX\",\n// \"fieldName\": \"vector\",\n// \"indexName\": \"vector_index\"\n// }\n","// 5. Describe the index\nres = await client.describeIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(JSON.stringify(res.index_descriptions, null, 2))\n\n// Output\n// \n// [\n// {\n// \"params\": [\n// {\n// \"key\": \"index_type\",\n// \"value\": \"AUTOINDEX\"\n// },\n// {\n// \"key\": \"metric_type\",\n// \"value\": \"COSINE\"\n// }\n// ],\n// \"index_name\": \"vector_index\",\n// \"indexID\": \"449007919953063141\",\n// \"field_name\": \"vector\",\n// \"indexed_rows\": \"0\",\n// \"total_rows\": \"0\",\n// \"state\": \"Finished\",\n// \"index_state_fail_reason\": \"\",\n// \"pending_index_rows\": \"0\"\n// }\n// ]\n// \n","# 6. Drop index\nclient.drop_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n","// 6. Drop index\n\nDropIndexReq dropIndexReq = DropIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nclient.dropIndex(dropIndexReq);\n","// 6. Drop the index\nres = await client.dropIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n"],"headingContent":"Index Vector Fields","anchorList":[{"label":"Mengindeks Bidang Vektor","href":"Index-Vector-Fields","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Persiapan","href":"Preparations","type":2,"isActive":false},{"label":"Mengindeks Koleksi","href":"Index-a-Collection","type":2,"isActive":false},{"label":"Memeriksa Detail Indeks","href":"Check-Index-Details","type":2,"isActive":false},{"label":"Membuang Indeks","href":"Drop-an-Index","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.md b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.md new file mode 100644 index 000000000..e8aa18743 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-vector-fields.md @@ -0,0 +1,593 @@ +--- +id: index-vector-fields.md +order: 1 +summary: >- + Panduan ini memandu Anda melalui operasi dasar dalam membuat dan mengelola + indeks pada bidang vektor dalam koleksi. +title: Mengindeks Bidang Vektor +--- +

    Mengindeks Bidang Vektor

    Panduan ini memandu Anda melalui operasi dasar dalam membuat dan mengelola indeks pada bidang vektor dalam koleksi.

    +

    Gambaran Umum

    Dengan memanfaatkan metadata yang disimpan dalam berkas indeks, Milvus mengatur data Anda dalam struktur khusus, sehingga memudahkan pengambilan informasi yang diminta dengan cepat selama pencarian atau kueri.

    +

    Milvus menyediakan beberapa jenis indeks dan metrik untuk mengurutkan nilai bidang untuk pencarian kemiripan yang efisien. Tabel berikut mencantumkan jenis indeks dan metrik yang didukung untuk berbagai jenis bidang vektor. Saat ini, Milvus mendukung berbagai jenis data vektor, termasuk penyematan floating point (sering dikenal sebagai vektor floating point atau vektor padat), penyematan biner (juga dikenal sebagai vektor biner), dan penyematan jarang (juga dikenal sebagai vektor jarang). Untuk detailnya, lihat Indeks Dalam Memori dan Metrik Kemiripan.

    + +
    + + + + + + + + + + + + + +
    Jenis MetrikJenis Indeks
    • Jarak Euclidean (L2)
    • Produk dalam (IP)
    • Kemiripan kosinus (COSINE)
    • DATAR
    • IVF_FLAT
    • IVF_SQ8
    • IVF_PQ
    • GPU_IVF_FLAT
    • GPU_IVF_PQ
    • HNSW
    • DISKANN
    +
    +
    + + + + + + + + + + + + + +
    Jenis MetrikJenis Indeks
    • Jaccard (JACCARD)
    • Hamming (HAMMING)
    • BIN_FLAT
    • BIN_IVF_FLAT
    +
    +
    + + + + + + + + + + + + + +
    Jenis MetrikJenis Indeks
    IP
    • SPARSE_INVERTED_INDEX
    • SPARSE_WAND
    +
    +

    Direkomendasikan untuk membuat indeks untuk bidang vektor dan bidang skalar yang sering diakses.

    +

    Persiapan

    Seperti yang dijelaskan di Mengelola Koleksi, Milvus secara otomatis membuat indeks dan memuatnya ke dalam memori ketika membuat koleksi jika salah satu dari kondisi berikut ini ditentukan dalam permintaan pembuatan koleksi:

    +
      +
    • Dimensi bidang vektor dan tipe metrik, atau

    • +
    • Skema dan parameter indeks.

    • +
    +

    Cuplikan kode di bawah ini menggunakan kembali kode yang sudah ada untuk membuat koneksi ke instance Milvus dan membuat koleksi tanpa menentukan parameter indeksnya. Dalam kasus ini, koleksi tidak memiliki indeks dan tetap tidak dimuat.

    +
    +

    Untuk mempersiapkan pengindeksan, gunakan MilvusClient untuk menyambung ke server Milvus dan menyiapkan koleksi dengan menggunakan create_schema(), add_field(), dan create_collection().

    +
    +
    +

    Untuk mempersiapkan pengindeksan, gunakan MilvusClientV2 untuk menyambung ke server Milvus dan menyiapkan koleksi dengan menggunakan createSchema(), addField(), , dan createCollection().

    +
    +
    +

    Untuk mempersiapkan pengindeksan, gunakan MilvusClient untuk menyambung ke server Milvus dan menyiapkan koleksi dengan menggunakan createCollection().

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# 1. Set up a Milvus client
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +# 2. Create schema
    +# 2.1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True,
    +)
    +
    +# 2.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
    +
    +# 3. Create collection
    +client.create_collection(
    +    collection_name="customized_setup", 
    +    schema=schema, 
    +)
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +String CLUSTER_ENDPOINT = "http://localhost:19530";
    +
    +// 1. Connect to Milvus server
    +ConnectConfig connectConfig = ConnectConfig.builder()
    +    .uri(CLUSTER_ENDPOINT)
    +    .build();
    +
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);
    +
    +// 2. Create a collection
    +
    +// 2.1 Create schema
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();
    +
    +// 2.2 Add fields to schema
    +schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
    +schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());
    +
    +// 3 Create a collection without schema and index parameters
    +CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
    +.collectionName("customized_setup")
    +.collectionSchema(schema)
    +.build();
    +
    +client.createCollection(customizedSetupReq);
    +
    +
    // 1. Set up a Milvus Client
    +client = new MilvusClient({address, token});
    +
    +// 2. Define fields for the collection
    +const fields = [
    +    {
    +        name: "id",
    +        data_type: DataType.Int64,
    +        is_primary_key: true,
    +        autoID: false
    +    },
    +    {
    +        name: "vector",
    +        data_type: DataType.FloatVector,
    +        dim: 5
    +    },
    +]
    +
    +// 3. Create a collection
    +res = await client.createCollection({
    +    collection_name: "customized_setup",
    +    fields: fields,
    +})
    +
    +console.log(res.error_code)  
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    +

    Mengindeks Koleksi

    +

    Untuk membuat indeks untuk koleksi atau mengindeks koleksi, gunakan prepare_index_params() untuk menyiapkan parameter indeks dan create_index() untuk membuat indeks.

    +
    +
    +

    Untuk membuat indeks untuk koleksi atau mengindeks koleksi, gunakan IndexParam untuk menyiapkan parameter indeks dan createIndex() untuk membuat indeks.

    +
    +
    +

    Untuk membuat indeks untuk koleksi atau mengindeks koleksi, gunakan createIndex().

    +
    + +
    # 4.1. Set up the index parameters
    +index_params = MilvusClient.prepare_index_params()
    +
    +# 4.2. Add an index on the vector field.
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="IVF_FLAT",
    +    index_name="vector_index",
    +    params={ "nlist": 128 }
    +)
    +
    +# 4.3. Create an index file
    +client.create_index(
    +    collection_name="customized_setup",
    +    index_params=index_params,
    +    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +// 4 Prepare index parameters
    +
    +// 4.2 Add an index for the vector field "vector"
    +IndexParam indexParamForVectorField = IndexParam.builder()
    +    .fieldName("vector")
    +    .indexName("vector_index")
    +    .indexType(IndexParam.IndexType.IVF_FLAT)
    +    .metricType(IndexParam.MetricType.COSINE)
    +    .extraParams(Map.of("nlist", 128))
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +// 4.3 Crate an index file
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    // 4. Set up index for the collection
    +// 4.1. Set up the index parameters
    +res = await client.createIndex({
    +    collection_name: "customized_setup",
    +    field_name: "vector",
    +    index_type: "AUTOINDEX",
    +    metric_type: "COSINE",   
    +    index_name: "vector_index",
    +    params: { "nlist": 128 }
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDeskripsi
    field_nameNama file target untuk menerapkan objek ini.
    metric_typeAlgoritme yang digunakan untuk mengukur kemiripan antar vektor. Nilai yang memungkinkan adalah IP, L2, COSINE, JACCARD, HAMMING. Ini hanya tersedia jika bidang yang ditentukan adalah bidang vektor. Untuk informasi lebih lanjut, lihat Indeks yang didukung di Milvus.
    index_typeNama algoritme yang digunakan untuk mengatur data dalam bidang tertentu. Untuk algoritma yang berlaku, lihat Indeks dalam memori dan Indeks pada disk.
    index_nameNama file indeks yang dihasilkan setelah objek ini diterapkan.
    paramsParameter penyetelan untuk jenis indeks yang ditentukan. Untuk detail tentang kunci dan rentang nilai yang mungkin, lihat Indeks Dalam Memori.
    collection_nameNama koleksi yang sudah ada.
    index_paramsObjek IndexParams yang berisi daftar objek IndexParam.
    syncMengontrol bagaimana indeks dibuat terkait dengan permintaan klien. Nilai yang valid:
    • True (default): Klien menunggu hingga indeks selesai dibangun sebelum kembali. Ini berarti Anda tidak akan mendapatkan respons hingga proses selesai.
    • False: Klien segera kembali setelah permintaan diterima dan indeks sedang dibuat di latar belakang. Untuk mengetahui apakah pembuatan indeks telah selesai, gunakan metode describe_index().
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDeskripsi
    fieldNameNama bidang target untuk menerapkan objek IndexParam ini.
    indexNameNama file indeks yang dihasilkan setelah objek ini diterapkan.
    indexTypeNama algoritme yang digunakan untuk menyusun data dalam bidang tertentu. Untuk algoritme yang berlaku, lihat Indeks Dalam Memori dan Indeks Pada Disk.
    metricTypeMetrik jarak yang digunakan untuk indeks. Nilai yang memungkinkan adalah IP, L2, COSINE, JACCARD, HAMMING.
    extraParamsParameter indeks tambahan. Untuk detailnya, lihat Indeks Dalam-memori dan Indeks On-disk.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterDeskripsi
    collection_nameNama koleksi yang sudah ada.
    field_nameNama bidang untuk membuat indeks.
    index_typeJenis indeks yang akan dibuat.
    metric_typeJenis metrik yang digunakan untuk mengukur jarak vektor.
    index_nameNama indeks yang akan dibuat.
    paramsParameter khusus indeks lainnya.
    +
    +

    Catatan

    +

    Saat ini, Anda hanya dapat membuat satu file indeks untuk setiap bidang dalam koleksi.

    +
    +

    Memeriksa Detail Indeks

    Setelah Anda membuat indeks, Anda dapat memeriksa rinciannya.

    +
    +

    Untuk memeriksa rincian indeks, gunakan list_indexes() untuk membuat daftar nama indeks dan describe_index() untuk mendapatkan rincian indeks.

    +
    +
    +

    Untuk memeriksa detail indeks, gunakan describeIndex() untuk mendapatkan detail indeks.

    +
    +
    +

    Untuk memeriksa detail indeks, gunakan describeIndex() untuk mendapatkan detail indeks.

    +
    + +
    # 5. Describe index
    +res = client.list_indexes(
    +    collection_name="customized_setup"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# [
    +#     "vector_index",
    +# ]
    +
    +res = client.describe_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# {
    +#     "index_type": ,
    +#     "metric_type": "COSINE",
    +#     "field_name": "vector",
    +#     "index_name": "vector_index"
    +# }
    +
    +
    import io.milvus.v2.service.index.request.DescribeIndexReq;
    +import io.milvus.v2.service.index.response.DescribeIndexResp;
    +
    +// 5. Describe index
    +// 5.1 List the index names
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("customized_setup")
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "vector_index"
    +// ]
    +
    +// 5.2 Describe an index
    +DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);
    +
    +System.out.println(JSONObject.toJSON(describeIndexResp));
    +
    +// Output:
    +// {
    +//     "metricType": "COSINE",
    +//     "indexType": "AUTOINDEX",
    +//     "fieldName": "vector",
    +//     "indexName": "vector_index"
    +// }
    +
    +
    // 5. Describe the index
    +res = await client.describeIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(JSON.stringify(res.index_descriptions, null, 2))
    +
    +// Output
    +// 
    +// [
    +//   {
    +//     "params": [
    +//       {
    +//         "key": "index_type",
    +//         "value": "AUTOINDEX"
    +//       },
    +//       {
    +//         "key": "metric_type",
    +//         "value": "COSINE"
    +//       }
    +//     ],
    +//     "index_name": "vector_index",
    +//     "indexID": "449007919953063141",
    +//     "field_name": "vector",
    +//     "indexed_rows": "0",
    +//     "total_rows": "0",
    +//     "state": "Finished",
    +//     "index_state_fail_reason": "",
    +//     "pending_index_rows": "0"
    +//   }
    +// ]
    +// 
    +
    +

    Anda dapat memeriksa berkas indeks yang dibuat pada bidang tertentu, dan mengumpulkan statistik jumlah baris yang diindeks menggunakan berkas indeks ini.

    +

    Membuang Indeks

    Anda dapat dengan mudah membuang indeks jika sudah tidak diperlukan lagi.

    +
    +

    Sebelum membuang indeks, pastikan indeks tersebut telah dirilis terlebih dahulu.

    +
    +
    +

    Untuk membuang indeks, gunakan perintah drop_index().

    +
    +
    +

    Untuk menjatuhkan indeks, gunakan dropIndex().

    +
    +
    +

    Untuk menjatuhkan indeks, gunakan dropIndex().

    +
    + +
    # 6. Drop index
    +client.drop_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +
    // 6. Drop index
    +
    +DropIndexReq dropIndexReq = DropIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +client.dropIndex(dropIndexReq);
    +
    +
    // 6. Drop the index
    +res = await client.dropIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.json b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.json new file mode 100644 index 000000000..6730b47c5 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.json @@ -0,0 +1 @@ +{"codeList":["gpu:\n initMemSize: 0 #set the initial memory pool size.\n maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","gpu:\n initMemSize: 2048 #set the initial memory pool size.\n maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_CAGRA\",\n \"params\": {\n 'intermediate_graph_degree': 64,\n 'graph_degree': 32\n }\n}\n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_IVF_FLAT\", # Or GPU_IVF_PQ\n \"params\": {\n \"nlist\": 1024\n }\n}\n","index_params = {\n 'index_type': 'GPU_BRUTE_FORCE',\n 'metric_type': 'L2',\n 'params': {}\n}\n","# Get an existing collection\ncollection = Collection(\"YOUR_COLLECTION_NAME\")\n\ncollection.create_index(\n field_name=\"vector\", # Name of the vector field on which an index is built\n index_params=index_params\n)\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {}\n}\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {\n \"itopk_size\": 128,\n \"search_width\": 4,\n \"min_iterations\": 0,\n \"max_iterations\": 0,\n \"team_size\": 0\n }\n}\n","search_params = {\n \"metric_type\": \"L2\", \n \"params\": {\"nprobe\": 10}\n}\n","# Load data into memory\ncollection.load()\n\ncollection.search(\n data=[[query_vector]], # Your query vector\n anns_field=\"vector\", # Name of the vector field\n param=search_params,\n limit=100 # Number of the results to return\n)\n"],"headingContent":"Index with GPU","anchorList":[{"label":"Indeks dengan GPU","href":"Index-with-GPU","type":1,"isActive":false},{"label":"Mengonfigurasi pengaturan Milvus untuk kontrol memori GPU","href":"Configure-Milvus-settings-for-GPU-memory-control","type":2,"isActive":false},{"label":"Membangun indeks","href":"Build-an-index","type":2,"isActive":false},{"label":"Pencarian","href":"Search","type":2,"isActive":false},{"label":"Batas","href":"Limits","type":2,"isActive":false},{"label":"PERTANYAAN UMUM","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.md b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.md new file mode 100644 index 000000000..8db1ef7c3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage-indexes/index-with-gpu.md @@ -0,0 +1,233 @@ +--- +id: index-with-gpu.md +order: 3 +summary: >- + Panduan ini menjelaskan cara membuat indeks dengan dukungan GPU di Milvus + untuk meningkatkan performa pencarian. +title: Indeks dengan GPU +--- +

    Indeks dengan GPU

    Panduan ini menguraikan langkah-langkah untuk membuat indeks dengan dukungan GPU di Milvus, yang secara signifikan dapat meningkatkan performa pencarian dalam skenario throughput tinggi dan recall tinggi. Untuk detail tentang jenis indeks GPU yang didukung oleh Milvus, lihat Indeks GPU.

    +

    Mengonfigurasi pengaturan Milvus untuk kontrol memori GPU

    Milvus menggunakan kumpulan memori grafis global untuk mengalokasikan memori GPU.

    +

    Ini mendukung dua parameter initMemSize dan maxMemSize dalam file konfigurasi Milvus. Ukuran pool pada awalnya diatur ke initMemSize, dan akan secara otomatis diperluas ke maxMemSize setelah melebihi batas ini.

    +

    Default initMemSize adalah 1/2 dari memori GPU yang tersedia saat Milvus dijalankan, dan default maxMemSize sama dengan semua memori GPU yang tersedia.

    +

    Hingga Milvus 2.4.1 (termasuk versi 2.4.1), Milvus menggunakan kumpulan memori GPU terpadu. Untuk versi sebelum 2.4.1 (termasuk versi 2.4.1), direkomendasikan untuk mengatur kedua nilai tersebut ke 0.

    +
    gpu:
    +  initMemSize: 0 #set the initial memory pool size.
    +  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    Mulai Milvus 2.4.1 dan seterusnya, kumpulan memori GPU hanya digunakan untuk data GPU sementara selama pencarian. Oleh karena itu, disarankan untuk mengaturnya ke 2048 dan 4096.

    +
    gpu:
    +  initMemSize: 2048 #set the initial memory pool size.
    +  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    Membangun indeks

    Contoh berikut ini menunjukkan cara membuat indeks GPU dengan tipe yang berbeda.

    +

    Menyiapkan parameter indeks

    Saat menyiapkan parameter indeks GPU, tentukan index_type, metric_type, dan params:

    +
      +
    • index_type(string): Jenis indeks yang digunakan untuk mempercepat pencarian vektor. Pilihan yang valid termasuk GPU_CAGRA, GPU_IVF_FLAT, GPU_IVF_PQ, dan GPU_BRUTE_FORCE.

    • +
    • metric_type(string): Jenis metrik yang digunakan untuk mengukur kemiripan vektor. Opsi yang valid adalah IP dan L2.

    • +
    • params(dict): Parameter bangunan khusus indeks. Opsi yang valid untuk parameter ini bergantung pada jenis indeks.

    • +
    +

    Berikut adalah contoh konfigurasi untuk berbagai jenis indeks:

    +
      +
    • IndeksGPU_CAGRA

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_CAGRA",
      +    "params": {
      +        'intermediate_graph_degree': 64,
      +        'graph_degree': 32
      +    }
      +}
      +
      +

      Opsi yang mungkin untuk params meliputi:

      +
        +
      • intermediate_graph_degree(int): Mempengaruhi waktu pemanggilan dan pembuatan dengan menentukan derajat grafik sebelum pemangkasan. Nilai yang disarankan adalah 32 atau 64.

      • +
      • graph_degree(int): Mempengaruhi performa pencarian dan pemanggilan dengan mengatur derajat graf setelah pemangkasan. Biasanya, nilai ini adalah setengah dari intermediate_graph_degree. Perbedaan yang lebih besar antara kedua derajat ini menghasilkan waktu pembangunan yang lebih lama. Nilainya harus lebih kecil dari nilai intermediate_graph_degree.

      • +
      • build_algo(string): Memilih algoritma pembuatan graf sebelum pemangkasan. Pilihan yang mungkin:

        +
          +
        • IVF_PQ: Menawarkan kualitas yang lebih tinggi tetapi waktu pembuatan yang lebih lambat.

        • +
        • NN_DESCENT: Menyediakan pembuatan yang lebih cepat dengan potensi penarikan yang lebih rendah.

        • +
      • +
      • cache_dataset_on_device(string, "true" | "false"): Memutuskan apakah akan menyimpan dataset asli dalam memori GPU. Mengaturnya ke "true" akan meningkatkan daya ingat dengan menyempurnakan hasil pencarian, sementara mengaturnya ke "false" akan menghemat memori GPU.

      • +
    • +
    • IndeksGPU_IVF_FLAT atau GPU_IVF_PQ

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ
      +    "params": {
      +        "nlist": 1024
      +    }
      +}
      +
      +

      Opsi parameter identik dengan yang digunakan dalam IVF_FLAT dan IVF_PQ.

    • +
    • IndeksGPU_BRUTE_FORCE

      +
      index_params = {
      +    'index_type': 'GPU_BRUTE_FORCE',
      +    'metric_type': 'L2',
      +    'params': {}
      +}
      +
      +

      Tidak ada konfigurasi params tambahan yang diperlukan.

    • +
    +

    Membangun indeks

    Setelah mengonfigurasi parameter indeks di index_params, panggil metode create_index() untuk membangun indeks.

    +
    # Get an existing collection
    +collection = Collection("YOUR_COLLECTION_NAME")
    +
    +collection.create_index(
    +    field_name="vector", # Name of the vector field on which an index is built
    +    index_params=index_params
    +)
    +
    +

    Setelah Anda membuat indeks GPU, langkah selanjutnya adalah menyiapkan parameter pencarian sebelum melakukan pencarian.

    +

    Menyiapkan parameter pencarian

    Di bawah ini adalah contoh konfigurasi untuk berbagai jenis indeks:

    +
      +
    • IndeksGPU_BRUTE_FORCE

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {}
      +}
      +
      +

      Tidak ada konfigurasi parameter tambahan yang diperlukan.

    • +
    • IndeksGPU_CAGRA

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {
      +        "itopk_size": 128,
      +        "search_width": 4,
      +        "min_iterations": 0,
      +        "max_iterations": 0,
      +        "team_size": 0
      +    }
      +}
      +
      +

      Parameter pencarian utama meliputi:

      +
        +
      • itopk_size: Menentukan ukuran hasil perantara yang disimpan selama pencarian. Nilai yang lebih besar dapat meningkatkan daya ingat dengan mengorbankan kinerja pencarian. Setidaknya harus sama dengan nilai top-k(batas) akhir dan biasanya merupakan pangkat 2 (misalnya, 16, 32, 64, 128).

      • +
      • search_width: Menentukan jumlah titik masuk ke dalam grafik CAGRA selama pencarian. Meningkatkan nilai ini dapat meningkatkan daya ingat tetapi dapat mempengaruhi kinerja pencarian.

      • +
      • min_iterations / max_iterations: Parameter ini mengontrol proses iterasi pencarian. Secara default, keduanya diatur ke 0, dan CAGRA secara otomatis menentukan jumlah iterasi berdasarkan itopk_size dan search_width. Menyesuaikan nilai-nilai ini secara manual dapat membantu menyeimbangkan kinerja dan akurasi.

      • +
      • team_size: Menentukan jumlah thread CUDA yang digunakan untuk menghitung jarak metrik pada GPU. Nilai yang umum adalah pangkat 2 hingga 32 (mis. 2, 4, 8, 16, 32). Ini memiliki dampak kecil pada kinerja pencarian. Nilai defaultnya adalah 0, di mana Milvus secara otomatis memilih team_size berdasarkan dimensi vektor.

      • +
    • +
    • IndeksGPU_IVF_FLAT atau GPU_IVF_PQ

      +
      search_params = {
      +    "metric_type": "L2", 
      +    "params": {"nprobe": 10}
      +}
      +
      +

      Parameter pencarian untuk kedua jenis indeks ini serupa dengan yang digunakan pada IVF_FLAT dan IVF_PQ. Untuk informasi lebih lanjut, lihat Melakukan Pencarian Kemiripan Vektor.

    • +
    +

    Gunakan metode search() untuk melakukan pencarian kemiripan vektor pada indeks GPU.

    +
    # Load data into memory
    +collection.load()
    +
    +collection.search(
    +    data=[[query_vector]], # Your query vector
    +    anns_field="vector", # Name of the vector field
    +    param=search_params,
    +    limit=100 # Number of the results to return
    +)
    +
    +

    Batas

    Saat menggunakan indeks GPU, perhatikan batasan tertentu:

    +
      +
    • Untuk GPU_IVF_FLAT, nilai maksimum untuk batas adalah 1024.

    • +
    • Untuk GPU_IVF_PQ dan GPU_CAGRA, nilai maksimum untuk limit adalah 1024.

    • +
    • Meskipun tidak ada batas yang ditetapkan untuk limit pada GPU_BRUTE_FORCE, disarankan untuk tidak melebihi 4096 untuk menghindari potensi masalah kinerja.

    • +
    • Saat ini, indeks GPU tidak mendukung jarak COSINE. Jika jarak COSINE diperlukan, data harus dinormalisasi terlebih dahulu, lalu jarak inner product (IP) dapat digunakan sebagai pengganti.

    • +
    • Memuat perlindungan OOM untuk indeks GPU tidak sepenuhnya didukung, terlalu banyak data dapat menyebabkan QueryNode macet.

    • +
    • Indeks GPU tidak mendukung fungsi pencarian seperti pencarian rentang dan pencarian pengelompokan.

    • +
    +

    PERTANYAAN UMUM

      +
    • Kapan waktu yang tepat untuk menggunakan indeks GPU?

      +

      Indeks GPU sangat bermanfaat dalam situasi yang menuntut throughput tinggi atau pemanggilan tinggi. Misalnya, saat menangani batch besar, throughput pengindeksan GPU dapat melampaui throughput pengindeksan CPU sebanyak 100 kali lipat. Dalam skenario dengan batch yang lebih kecil, indeks GPU masih secara signifikan mengungguli indeks CPU dalam hal kinerja. Selain itu, jika ada persyaratan untuk penyisipan data yang cepat, menggabungkan GPU dapat mempercepat proses pembuatan indeks secara substansial.

    • +
    • Dalam skenario apa indeks GPU seperti CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT, dan GPU_BRUTE_FORCE paling cocok?

      +

      Indeks CAGRA ideal untuk skenario yang menuntut peningkatan performa, meskipun dengan biaya konsumsi memori yang lebih besar. Untuk lingkungan di mana konservasi memori menjadi prioritas, indeks GPU_IVF_PQ dapat membantu meminimalkan kebutuhan penyimpanan, meskipun hal ini disertai dengan kehilangan presisi yang lebih tinggi. Indeks GPU_IVF_FLAT berfungsi sebagai opsi yang seimbang, menawarkan kompromi antara performa dan penggunaan memori. Terakhir, indeks GPU_BRUTE_FORCE dirancang untuk operasi pencarian yang menyeluruh, menjamin tingkat recall 1 dengan melakukan pencarian traversal.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/manage_databases.json b/localization/v2.5.x/site/id/userGuide/manage_databases.json new file mode 100644 index 000000000..5faa6894a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage_databases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, db\n\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\n\ndatabase = db.create_database(\"my_database\")\n","import io.milvus.client.MilvusServiceClient;\nimport io.milvus.param.ConnectParam;\nimport io.milvus.param.collection.CreateDatabaseParam;\n\n// 1. Connect to Milvus server\nConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n\n// 3. Create a new database\nCreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()\n .withDatabaseName(\"\")\n .build();\n\nR response = client.createDatabase(createDatabaseParam);\n","const address = \"http://localhost:19530\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address });\n\n// 3. Create a database\nres = await client.createDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n\n// {\n// error_code: 'Success',\n// reason: '',\n// code: 0,\n// retriable: false,\n// detail: ''\n// }\n","db.using_database(\"my_database\")\n","// No equivalent method is available.\n","// 4. Activate another database\nres = await client.useDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n","conn = connections.connect(\n host=\"127.0.0.1\",\n port=\"19530\",\n db_name=\"my_database\"\n)\n","ConnectParam connectParam = ConnectParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n","const address = \"http://localhost:19530\";\nconst db_name = \"my_database\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address, db_name });\n","db.list_database()\n\n# Output\n['default', 'my_database']\n","import io.milvus.grpc.ListDatabasesResponse;\nimport io.milvus.param.R;\n\n// 2. List all databases\nR listDatabasesResponse = client.listDatabases();\nSystem.out.println(listDatabasesResponse.getData());\n\n// status {\n// }\n// db_names: \"default\"\n// db_names: \"my_database\"\n// created_timestamp: 1716794498117757990\n// created_timestamp: 1716797196479639477\n","res = await client.listDatabases();\n\nconsole.log(res.db_names);\n\n// [ 'default', 'my_database' ]\n","db.drop_database(\"my_database\")\n\ndb.list_database()\n\n# Output\n['default']\n","import io.milvus.param.collection.DropDatabaseParam;\n\nDropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .build();\n\nresponse = client.dropDatabase(dropDatabaseParam);\n","res = await client.dropDatabase({\n db_name: \"my_database\",\n});\n","from pymilvus import connections, Role\n\n_URI = \"http://localhost:19530\"\n_TOKEN = \"root:Milvus\"\n_DB_NAME = \"default\"\n\n\ndef connect_to_milvus(db_name=\"default\"):\n print(f\"connect to milvus\\n\")\n connections.connect(\n uri=_URI,\n token=_TOKEN,\n db_name=db_name\n )\n","String URI = \"http://localhost:19530\";\nString TOKEN = \"root:Milvus\";\n\npublic class ConnectToMilvus {\n private String _dbName = \"default\";\n\n public newBuilder() {}\n\n public MilvusServiceClient build() {\n ConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(URI)\n .withToken(TOKEN)\n .withDatabaseName(_dbNAME)\n .build();\n\n return new MilvusServiceClient(connectParam);\n }\n\n public newBuilder withDbName(String dbName) {\n this._dbName = dbName;\n return this;\n }\n}\n","const address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\n\nfunction connectToMilvus(dbName = \"default\") {\n const client = new MilvusClient({\n address,\n token,\n dbName,\n });\n\n return client;\n}\n","_ROLE_NAME = \"test_role\"\n_PRIVILEGE_INSERT = \"Insert\"\n\nconnect_to_milvus()\nrole = Role(_ROLE_NAME)\nrole.create()\n\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","String ROLE_NAME = \"test_role\";\nString PRIVILEGE_INSERT = \"Insert\";\n\nMilvusServiceClient client = new ConnectToMilvus().build();\nR response = client.createRole(CreateRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const ROLE_NAME = \"test_role\";\nconst PRIVILEGE_INSERT = \"Insert\";\n\nconst client = connectToMilvus();\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\nconnect_to_milvus(db_name=\"foo\")\n\n# This role will have the insert permission of all collections under foo db,\n# excluding the insert permissions of collections under other dbs\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","// NOTE: please make sure the 'foo' db has been created\nMilvusServiceClient client = new ConnectToMilvus().withDbName(\"foo\").build();\n\n// This role will have the insert permission of all collections under foo db,\n// excluding the insert permissions of collections under other dbs\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const client = connectToMilvus(\"foo\");\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\n\ndb_name = \"foo\"\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\nprint(role.list_grants(db_name=db_name))\nprint(role.list_grant(\"Collection\", \"*\", db_name=db_name))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\n","// NOTE: please make sure the 'foo' db has been created\n\nString dbName = \"foo\";\nMilvusServiceClient client = new ConnectToMilvus().build();\n\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","// The Node.js SDK currently cannot support this case.\n"],"headingContent":"Manage Databases","anchorList":[{"label":"Mengelola Basis Data","href":"Manage-Databases","type":1,"isActive":false},{"label":"Membuat basis data","href":"Create-database","type":2,"isActive":false},{"label":"Menggunakan basis data","href":"Use-a-database","type":2,"isActive":false},{"label":"Membuat daftar basis data","href":"List-databases","type":2,"isActive":false},{"label":"Menghapus basis data","href":"Drop-database","type":2,"isActive":false},{"label":"Menggunakan RBAC dengan basis data","href":"Use-RBAC-with-database","type":2,"isActive":false},{"label":"Apa selanjutnya","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/manage_databases.md b/localization/v2.5.x/site/id/userGuide/manage_databases.md new file mode 100644 index 000000000..44e962bd3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/manage_databases.md @@ -0,0 +1,597 @@ +--- +id: manage_databases.md +title: Mengelola Basis Data +--- +

    Mengelola Basis Data

    Serupa dengan mesin basis data tradisional, Anda juga dapat membuat basis data di Milvus dan mengalokasikan hak istimewa kepada pengguna tertentu untuk mengelolanya. Kemudian pengguna tersebut memiliki hak untuk mengelola koleksi dalam database. Sebuah cluster Milvus mendukung maksimal 64 basis data.

    +
    +

    Cuplikan kode di halaman ini menggunakan modul PyMilvus ORM untuk berinteraksi dengan Milvus. Cuplikan kode dengan MilvusClient SDK yang baru akan segera tersedia.

    +
    +

    Membuat basis data

    +

    Gunakan connect() untuk terhubung ke server Milvus dan create_database() untuk membuat basis data baru:

    +
    +
    +

    Gunakan MilvusClient untuk menyambung ke server Milvus dan createDatabase() untuk membuat database baru:

    +
    +
    +

    Gunakan MilvusClient untuk menyambung ke server Milvus dan createDatabase() untuk membuat basis data baru:

    +
    + +
    from pymilvus import connections, db
    +
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +
    +database = db.create_database("my_database")
    +
    +
    import io.milvus.client.MilvusServiceClient;
    +import io.milvus.param.ConnectParam;
    +import io.milvus.param.collection.CreateDatabaseParam;
    +
    +// 1. Connect to Milvus server
    +ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +// 3. Create a new database
    +CreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()
    +    .withDatabaseName("")
    +    .build();
    +
    +R<RpcStatus> response = client.createDatabase(createDatabaseParam);
    +
    +
    const address = "http://localhost:19530";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address });
    +
    +// 3. Create a database
    +res = await client.createDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +// {
    +//   error_code: 'Success',
    +//   reason: '',
    +//   code: 0,
    +//   retriable: false,
    +//   detail: ''
    +// }
    +
    +

    Cuplikan kode di atas menyambungkan ke basis data default dan membuat basis data baru bernama my_database.

    +

    Menggunakan basis data

    Sebuah klaster Milvus dikirimkan dengan basis data default, bernama 'default'. Koleksi dibuat di dalam basis data default kecuali ditentukan lain.

    +

    Untuk mengubah basis data default, lakukan hal berikut:

    + +
    db.using_database("my_database")
    +
    +
    // No equivalent method is available.
    +
    +
    // 4. Activate another database
    +res = await client.useDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +

    Anda juga dapat mengatur basis data yang akan digunakan saat terhubung ke klaster Milvus sebagai berikut:

    + +
    conn = connections.connect(
    +    host="127.0.0.1",
    +    port="19530",
    +    db_name="my_database"
    +)
    +
    +
    ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +
    const address = "http://localhost:19530";
    +const db_name = "my_database";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address, db_name });
    +
    +

    Membuat daftar basis data

    +

    Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode list_database():

    +
    +
    +

    Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode listDatabases():

    +
    +
    +

    Untuk menemukan semua basis data yang ada di dalam cluster Milvus Anda, gunakan metode listDatabases():

    +
    + +
    db.list_database()
    +
    +# Output
    +['default', 'my_database']
    +
    +
    import io.milvus.grpc.ListDatabasesResponse;
    +import io.milvus.param.R;
    +
    +// 2. List all databases
    +R<ListDatabasesResponse> listDatabasesResponse = client.listDatabases();
    +System.out.println(listDatabasesResponse.getData());
    +
    +// status {
    +// }
    +// db_names: "default"
    +// db_names: "my_database"
    +// created_timestamp: 1716794498117757990
    +// created_timestamp: 1716797196479639477
    +
    +
    res = await client.listDatabases();
    +
    +console.log(res.db_names);
    +
    +// [ 'default', 'my_database' ]
    +
    +

    Menghapus basis data

    Untuk menghapus basis data, Anda harus menghapus semua koleksinya terlebih dahulu. Jika tidak, pelepasan akan gagal.

    +
    +

    Untuk menjatuhkan basis data, gunakan metode drop_database():

    +
    +
    +

    Untuk menjatuhkan basis data, gunakan metode dropDatabase():

    +
    +
    +

    Untuk menjatuhkan basis data, gunakan metode dropDatabase():

    +
    + +
    db.drop_database("my_database")
    +
    +db.list_database()
    +
    +# Output
    +['default']
    +
    +
    import io.milvus.param.collection.DropDatabaseParam;
    +
    +DropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .build();
    +
    +response = client.dropDatabase(dropDatabaseParam);
    +
    +
    res = await client.dropDatabase({
    +    db_name: "my_database",
    +});
    +
    +

    Menggunakan RBAC dengan basis data

    RBAC juga mencakup operasi basis data dan memastikan kompatibilitas ke depan. Kata basis data dalam API Izin (Berikan / Cabut / Daftar Izin) memiliki arti sebagai berikut:

    +
      +
    • Jika koneksi Milvus maupun panggilan API Izin tidak menentukan db_name, basis data mengacu pada basis data default.
    • +
    • Jika koneksi Milvus menentukan db_name, tetapi panggilan API Izin setelahnya tidak, basis data mengacu pada basis data yang namanya ditentukan dalam koneksi Milvus.
    • +
    • Jika panggilan API Izin dilakukan pada koneksi Milvus, dengan atau tanpa db_name yang ditentukan, basis data mengacu pada basis data yang namanya ditentukan dalam panggilan API Izin.
    • +
    +

    Cuplikan kode berikut ini dibagi di antara blok-blok yang terdaftar di bawah ini.

    + +
    from pymilvus import connections, Role
    +
    +_URI = "http://localhost:19530"
    +_TOKEN = "root:Milvus"
    +_DB_NAME = "default"
    +
    +
    +def connect_to_milvus(db_name="default"):
    +    print(f"connect to milvus\n")
    +    connections.connect(
    +        uri=_URI,
    +        token=_TOKEN,
    +        db_name=db_name
    +    )
    +
    +
    String URI = "http://localhost:19530";
    +String TOKEN = "root:Milvus";
    +
    +public class ConnectToMilvus {
    +    private String _dbName = "default";
    +
    +    public newBuilder() {}
    +
    +    public MilvusServiceClient build() {
    +        ConnectParam connectParam = ConnectParam.newBuilder()
    +            .withUri(URI)
    +            .withToken(TOKEN)
    +            .withDatabaseName(_dbNAME)
    +            .build();
    +
    +        return new MilvusServiceClient(connectParam);
    +    }
    +
    +    public newBuilder withDbName(String dbName) {
    +        this._dbName = dbName;
    +        return this;
    +    }
    +}
    +
    +
    const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +
    +function connectToMilvus(dbName = "default") {
    +    const client = new MilvusClient({
    +        address,
    +        token,
    +        dbName,
    +    });
    +
    +    return client;
    +}
    +
    +
      +
    • Jika koneksi Milvus maupun panggilan Permission API tidak menetapkan db_name, basis data merujuk ke basis data default.

      +

      +
      _ROLE_NAME = "test_role"
      +_PRIVILEGE_INSERT = "Insert"
      +
      +connect_to_milvus()
      +role = Role(_ROLE_NAME)
      +role.create()
      +
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      String ROLE_NAME = "test_role";
      +String PRIVILEGE_INSERT = "Insert";
      +
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +R<RpcStatus> response = client.createRole(CreateRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const ROLE_NAME = "test_role";
      +const PRIVILEGE_INSERT = "Insert";
      +
      +const client = connectToMilvus();
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • Jika koneksi Milvus menetapkan db_name, tetapi panggilan API Izin setelahnya tidak, basis data merujuk ke basis data yang namanya ditentukan dalam koneksi Milvus.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +connect_to_milvus(db_name="foo")
      +
      +# This role will have the insert permission of all collections under foo db,
      +# excluding the insert permissions of collections under other dbs
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +MilvusServiceClient client = new ConnectToMilvus().withDbName("foo").build();
      +
      +// This role will have the insert permission of all collections under foo db,
      +// excluding the insert permissions of collections under other dbs
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const client = connectToMilvus("foo");
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • Jika panggilan API Izin dilakukan pada koneksi Milvus, dengan atau tanpa db_name yang ditentukan, basis data merujuk ke basis data yang namanya ditentukan dalam panggilan API Izin.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +
      +db_name = "foo"
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +print(role.list_grants(db_name=db_name))
      +print(role.list_grant("Collection", "*", db_name=db_name))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +
      +String dbName = "foo";
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      // The Node.js SDK currently cannot support this case.
      +
    • +
    +

    Apa selanjutnya

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.json new file mode 100644 index 000000000..b6572c277 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"type\": \"standard\", # Uses the standard built-in analyzer​\n \"stop_words\": [\"a\", \"an\", \"for\"] # Defines a list of common words (stop words) to exclude from tokenization​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"standard\");\nanalyzerParams.put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n","const analyzer_params = {\n \"type\": \"standard\", // Uses the standard built-in analyzer\n \"stop_words\": [\"a\", \"an\", \"for\"] // Defines a list of common words (stop words) to exclude from tokenization\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }'\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stop\",​\n \"stop_words\": [\"a\", \"an\", \"for\"]​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","[\"Vector\", \"Database\", \"Built\", \"for\", \"Scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"whitespace\");\n","const analyzer_params = {\n \"tokenizer\": \"whitespace\",\n};\n","export analyzerParams='{\n \"type\": \"whitespace\"\n }'\n","[\"vector\", \"database\", \"built\", \"for\", \"scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [\"lowercase\"], # Optional: Built-in filter that converts text to lowercase​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\", Collections.singletonList(\"lowercase\"));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\"lowercase\"], // Optional: Built-in filter that converts text to lowercase\n}\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\"lowercase\"]\n}'\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [​\n {​\n \"type\": \"stop\", # Specifies 'stop' as the filter type​\n \"stop_words\": [\"of\", \"to\"], # Customizes stop words for this filter type​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Collections.singletonList(new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\n {\n \"type\": \"stop\", // Specifies 'stop' as the filter type\n \"stop_words\": [\"of\", \"to\"], // Customizes stop words for this filter type\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","from pymilvus import MilvusClient, DataType​\n​\n# Set up a Milvus client​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\"​\n)​\n​\n# Create schema​\nschema = client.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\n# Add fields to schema​\n​\n# Use a built-in analyzer​\nanalyzer_params_built_in = {​\n \"type\": \"english\"​\n}​\n​\n# Add VARCHAR field `title_en`​\nschema.add_field(​\n field_name='title_en', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_built_in,​\n enable_match=True, ​\n)​\n​\n# Configure a custom analyzer​\nanalyzer_params_custom = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\", # Built-in filter​\n {​\n \"type\": \"length\", # Custom filter​\n \"max\": 40​\n },​\n {​\n \"type\": \"stop\", # Custom filter​\n \"stop_words\": [\"of\", \"to\"]​\n }​\n ]​\n}​\n​\n# Add VARCHAR field `title`​\nschema.add_field(​\n field_name='title', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_custom,​\n enable_match=True, ​\n)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n# Add primary field​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\n​\n# Set up index params for vector field​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"embedding\", metric_type=\"COSINE\", index_type=\"AUTOINDEX\")​\n​\n# Create collection with defined schema​\nclient.create_collection(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n schema=schema,​\n index_params=index_params​\n)​\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\n// Set up a Milvus client\nConnectConfig config = ConnectConfig.builder()\n .uri(\"http://localhost:19530\")\n .build();\nMilvusClientV2 client = new MilvusClientV2(config);\n\n// Create schema\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\n// Add fields to schema\n// Use a built-in analyzer\nMap analyzerParamsBuiltin = new HashMap<>();\nanalyzerParamsBuiltin.put(\"type\", \"english\");\n// Add VARCHAR field `title_en`\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title_en\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParamsBuiltin)\n .enableMatch(true)\n .build());\n\n// Configure a custom analyzer\nMap analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"length\");\n put(\"max\", 40);\n }},\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}\n )\n);\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true) // must enable this if you use TextMatch\n .build());\n\n// Add vector field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"embedding\")\n .dataType(DataType.FloatVector)\n .dimension(3)\n .build());\n// Add primary field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\n\n// Set up index params for vector field\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"embedding\")\n .indexType(IndexParam.IndexType.AUTOINDEX)\n .metricType(IndexParam.MetricType.COSINE)\n .build());\n\n// Create collection with defined schema\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\n// Set up a Milvus client\nconst client = new MilvusClient(\"http://localhost:19530\");\n// Use a built-in analyzer for VARCHAR field `title_en`\nconst analyzerParamsBuiltIn = {\n type: \"english\",\n};\n\n// Configure a custom analyzer for VARCHAR field `title`\nconst analyzerParamsCustom = {\n tokenizer: \"standard\",\n filter: [\n \"lowercase\",\n {\n type: \"length\",\n max: 40,\n },\n {\n type: \"stop\",\n stop_words: [\"of\", \"to\"],\n },\n ],\n};\n\n// Create schema\nconst schema = {\n auto_id: true,\n fields: [\n {\n name: \"id\",\n type: DataType.INT64,\n is_primary: true,\n },\n {\n name: \"title_en\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsBuiltIn,\n enable_match: true,\n },\n {\n name: \"title\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsCustom,\n enable_match: true,\n },\n {\n name: \"embedding\",\n data_type: DataType.FLOAT_VECTOR,\n dim: 4,\n },\n ],\n};\n\n// Set up index params for vector field\nconst indexParams = [\n {\n name: \"embedding\",\n metric_type: \"COSINE\",\n index_type: \"AUTOINDEX\",\n },\n];\n\n// Create collection with defined schema\nawait client.createCollection({\n collection_name: \"YOUR_COLLECTION_NAME\",\n schema: schema,\n index_params: indexParams,\n});\n\nconsole.log(\"Collection created successfully!\");\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"title_en\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"title\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\n \"tokenizer\": \"standard\",\n \"filter\":[\n \"lowercase\",\n {\n \"type\":\"length\",\n \"max\":40\n },\n {\n \"type\":\"stop\",\n \"stop_words\":[\"of\",\"to\"]\n }\n ]\n }\n }\n },\n {\n \"fieldName\": \"embedding\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\":3\n }\n }\n ]\n }'\n \nexport indexParams='[\n {\n \"fieldName\": \"embedding\",\n \"metricType\": \"COSINE\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"YOUR_COLLECTION_NAME\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n"],"headingContent":"Analyzer Overview​","anchorList":[{"label":"Gambaran Umum Penganalisis","href":"Analyzer-Overview​","type":1,"isActive":false},{"label":"Anatomi sebuah penganalisis","href":"Anatomy-of-an-analyzer​","type":2,"isActive":false},{"label":"Jenis-jenis penganalisis","href":"Analyzer-types​","type":2,"isActive":false},{"label":"Contoh penggunaan","href":"Example-use​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.md new file mode 100644 index 000000000..a0e0ee74f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer-overview.md @@ -0,0 +1,585 @@ +--- +id: analyzer-overview.md +title: Gambaran Umum Penganalisis +summary: >- + Dalam pemrosesan teks, penganalisis adalah komponen penting yang mengubah teks + mentah menjadi format yang terstruktur dan dapat dicari. Setiap penganalisis + biasanya terdiri dari dua elemen inti: tokenizer dan filter. Bersama-sama, + keduanya mengubah teks masukan menjadi token, menyempurnakan token ini, dan + menyiapkannya untuk pengindeksan dan pengambilan yang efisien. +--- +

    Gambaran Umum Penganalisis

    Dalam pemrosesan teks, penganalisis adalah komponen penting yang mengubah teks mentah menjadi format yang terstruktur dan dapat dicari. Setiap penganalisis biasanya terdiri dari dua elemen inti: tokenizer dan filter. Bersama-sama, keduanya mengubah teks masukan menjadi token, menyempurnakan token ini, dan mempersiapkannya untuk pengindeksan dan pengambilan yang efisien.

    +

    Didukung oleh Tantivy, penganalisis di Milvus dikonfigurasikan selama pembuatan koleksi ketika Anda menambahkan bidang VARCHAR ke skema koleksi. Token yang dihasilkan oleh penganalisis dapat digunakan untuk membuat indeks untuk pencocokan teks atau diubah menjadi sematan jarang untuk pencarian teks lengkap. Untuk informasi lebih lanjut, lihat Pencocokan Teks atau Pencarian Teks Lengkap.

    +
    +

    Penggunaan penganalisis dapat memengaruhi kinerja.

    +
      +
    • Pencarian teks lengkap: Untuk pencarian teks lengkap, saluran DataNode dan QueryNode mengonsumsi data lebih lambat karena harus menunggu tokenisasi selesai. Akibatnya, data yang baru dicerna membutuhkan waktu lebih lama untuk tersedia untuk pencarian.

    • +
    • Pencocokan teks: Untuk pencocokan teks, pembuatan indeks juga lebih lambat karena tokenisasi harus selesai sebelum indeks dapat dibangun.

    • +
    +
    +

    Anatomi sebuah penganalisis

    Penganalisis di Milvus terdiri dari satu tokenizer dan nol atau lebih filter.

    +
      +
    • Tokenizer: Tokenizer memecah teks masukan menjadi unit-unit diskrit yang disebut token. Token-token ini dapat berupa kata atau frasa, tergantung pada jenis tokenizer.

    • +
    • Filter: Filter dapat diterapkan pada token untuk menyempurnakannya lebih lanjut, misalnya, dengan membuatnya menjadi huruf kecil atau menghapus kata-kata umum.

    • +
    +

    Alur kerja di bawah ini menunjukkan bagaimana penganalisis memproses teks.

    +

    analyzer-overview

    +

    Jenis-jenis penganalisis

    Milvus menyediakan dua jenis penganalisis untuk memenuhi kebutuhan pemrosesan teks yang berbeda.

    +
      +
    • Penganalisis bawaan: Ini adalah konfigurasi yang telah ditentukan sebelumnya yang mencakup tugas pemrosesan teks umum dengan pengaturan minimal. Penganalisis bawaan ideal untuk pencarian tujuan umum, karena tidak memerlukan konfigurasi yang rumit.

    • +
    • Penganalisis khusus: Untuk kebutuhan yang lebih canggih, penganalisis khusus memungkinkan Anda untuk menentukan konfigurasi Anda sendiri dengan menentukan tokenizer dan nol atau lebih filter. Tingkat kustomisasi ini sangat berguna untuk kasus penggunaan khusus yang membutuhkan kontrol yang tepat atas pemrosesan teks.

    • +
    +
    +

    Jika Anda menghilangkan konfigurasi penganalisis selama pembuatan koleksi, Milvus menggunakan penganalisis standard untuk semua pemrosesan teks secara default. Untuk detailnya, lihat Standar.

    +
    +

    Penganalisis bawaan

    Penganalisis bawaan di Milvus telah dikonfigurasi sebelumnya dengan tokenizer dan filter tertentu, sehingga Anda dapat langsung menggunakannya tanpa perlu mendefinisikan komponen-komponen ini sendiri. Setiap penganalisis bawaan berfungsi sebagai templat yang mencakup tokenizer dan filter yang telah ditetapkan sebelumnya, dengan parameter opsional untuk penyesuaian.

    +

    Sebagai contoh, untuk menggunakan penganalisis bawaan standard, cukup tentukan namanya standard sebagai type dan secara opsional menyertakan konfigurasi tambahan yang spesifik untuk jenis penganalisis ini, seperti stop_words.

    + +
    analyzer_params = {​
    +    "type": "standard", # Uses the standard built-in analyzer​
    +    "stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "standard");
    +analyzerParams.put("stop_words", Arrays.asList("a", "an", "for"));
    +
    +
    const analyzer_params = {
    +    "type": "standard", // Uses the standard built-in analyzer
    +    "stop_words": ["a", "an", "for"] // Defines a list of common words (stop words) to exclude from tokenization
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "stop_words": ["a", "an", "for"]
    +    }'
    +
    +

    Konfigurasi penganalisis bawaan standard di atas setara dengan menyiapkan penganalisis khusus dengan parameter berikut, di mana opsi tokenizer dan filter secara eksplisit didefinisikan untuk mencapai fungsionalitas yang sama:

    + +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stop",​
    +            "stop_words": ["a", "an", "for"]​
    +        }​
    +    ]​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}));
    +
    +
    const analyzer_params = {
    +    "tokenizer": "standard",
    +    "filter": [
    +        "lowercase",
    +        {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +        }
    +    ]
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "filter":  [
    +       "lowercase",
    +       {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +       }
    +   ]
    +}'
    +
    +

    Milvus menawarkan penganalisis bawaan berikut ini, yang masing-masing dapat digunakan secara langsung dengan menentukan namanya sebagai parameter type.

    +
      +
    • standard: Cocok untuk pemrosesan teks tujuan umum, menerapkan tokenisasi standar dan pemfilteran huruf kecil.

    • +
    • english: Dioptimalkan untuk teks berbahasa Inggris, dengan dukungan untuk stop words dalam bahasa Inggris.

    • +
    • chinese: Khusus untuk memproses teks bahasa Mandarin, termasuk tokenisasi yang diadaptasi untuk struktur bahasa Mandarin.

    • +
    +

    Penganalisis khusus

    Untuk pemrosesan teks yang lebih canggih, penganalisis khusus di Milvus memungkinkan Anda untuk membuat pipeline penanganan teks yang disesuaikan dengan menentukan tokenizer dan filter. Pengaturan ini ideal untuk kasus penggunaan khusus yang membutuhkan kontrol yang tepat.

    +

    Tokenizer

    Tokenizer adalah komponen wajib untuk penganalisis khusus, yang memulai pipeline penganalisis dengan memecah teks input menjadi unit diskrit atau token. Tokenisasi mengikuti aturan khusus, seperti pemisahan dengan spasi atau tanda baca, tergantung pada jenis tokenizer. Proses ini memungkinkan penanganan yang lebih tepat dan independen untuk setiap kata atau frasa.

    +

    Sebagai contoh, tokenizer akan mengubah teks "Vector Database Built for Scale" menjadi token-token yang terpisah.

    +
    ["Vector", "Database", "Built", "for", "Scale"]​
    +
    +

    Contoh menentukan tokenizer.

    + +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "whitespace");
    +
    +
    const analyzer_params = {
    +    "tokenizer": "whitespace",
    +};
    +
    +
    export analyzerParams='{
    +       "type": "whitespace"
    +    }'
    +
    +

    Filter

    Filter adalah komponen opsional yang bekerja pada token yang dihasilkan oleh tokenizer, mengubah atau menyempurnakannya sesuai kebutuhan. Misalnya, setelah menerapkan filter lowercase pada istilah yang diberi token ["Vector", "Database", "Built", "for", "Scale"], hasilnya mungkin seperti ini.

    +
    ["vector", "database", "built", "for", "scale"]​
    +
    +

    Filter dalam penganalisis khusus dapat berupa filter bawaan atau khusus, tergantung pada kebutuhan konfigurasi.

    +
      +
    • Filter bawaan: Telah dikonfigurasi sebelumnya oleh Milvus, yang membutuhkan pengaturan minimal. Anda dapat menggunakan filter ini secara langsung dengan menentukan namanya. Filter di bawah ini adalah filter bawaan untuk penggunaan langsung.

      +
        +
      • lowercase: Mengonversi teks menjadi huruf kecil, memastikan pencocokan yang tidak peka huruf. Untuk detailnya, lihat Huruf Kecil.

      • +
      • asciifolding: Mengonversi karakter non-ASCII menjadi ekuivalen ASCII, menyederhanakan penanganan teks multibahasa. Untuk rinciannya, lihat ASCII folding (Pelipatan ASCII).

      • +
      • alphanumonly: Mempertahankan hanya karakter alfanumerik dengan menghapus karakter lainnya. Untuk rinciannya, lihat Hanya alfanumerik.

      • +
      • cnalphanumonly: Menghapus token yang berisi karakter apa pun selain karakter Cina, huruf Inggris, atau angka. Untuk detailnya, lihat Cnalphanumonly.

      • +
      • cncharonly: Menghapus token yang berisi karakter non-Cina. Untuk detailnya, lihat Cncharonly.

      • +
      +

      Contoh penggunaan filter bawaan:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase​
      +}​
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter", Collections.singletonList("lowercase"));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": ["lowercase"], // Optional: Built-in filter that converts text to lowercase
      +}
      +
      +
      export analyzerParams='{
      +   "type": "standard",
      +   "filter":  ["lowercase"]
      +}'
      +
    • +
    • Filter khusus: Filter khusus memungkinkan konfigurasi khusus. Anda dapat menentukan filter khusus dengan memilih jenis filter yang valid (filter.type) dan menambahkan pengaturan khusus untuk setiap jenis filter. Contoh jenis filter yang mendukung kustomisasi.

      +
        +
      • stop: Menghapus kata-kata umum tertentu dengan menetapkan daftar kata henti (misalnya, "stop_words": ["of", "to"]). Untuk detailnya, lihat Berhenti.

      • +
      • length: Mengecualikan token berdasarkan kriteria panjang, seperti mengatur panjang token maksimum. Untuk detailnya, lihat Panjang.

      • +
      • stemmer: Mengurangi kata ke bentuk dasarnya untuk pencocokan yang lebih fleksibel. Untuk detailnya, lihat Stemmer.

      • +
      +

      Contoh mengonfigurasi filter khusus:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": [​
      +        {​
      +            "type": "stop", # Specifies 'stop' as the filter type​
      +            "stop_words": ["of", "to"], # Customizes stop words for this filter type​
      +        }​
      +    ]​
      +}​
      +
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter",
      +    Collections.singletonList(new HashMap<String, Object>() {{
      +        put("type", "stop");
      +        put("stop_words", Arrays.asList("a", "an", "for"));
      +    }}));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": [
      +        {
      +            "type": "stop", // Specifies 'stop' as the filter type
      +            "stop_words": ["of", "to"], // Customizes stop words for this filter type
      +        }
      +    ]
      +};
      +
      +
      export analyzerParams='{
      +    "type": "standard",
      +    "filter":  [
      +    {
      +            "type": "stop",
      +            "stop_words": ["a", "an", "for"]
      +    }
      +    ]
      +}'
      +
    • +
    +

    Contoh penggunaan

    Dalam contoh ini, kita mendefinisikan skema koleksi dengan bidang vektor untuk penyematan dan dua bidang VARCHAR untuk kemampuan pemrosesan teks. Setiap bidang VARCHAR dikonfigurasikan dengan pengaturan penganalisisnya sendiri untuk menangani kebutuhan pemrosesan yang berbeda.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +# Set up a Milvus client​
    +client = MilvusClient(​
    +    uri="http://localhost:19530"​
    +)​
    +​
    +# Create schema​
    +schema = client.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +# Add fields to schema​
    +​
    +# Use a built-in analyzer​
    +analyzer_params_built_in = {​
    +    "type": "english"​
    +}​
    +​
    +# Add VARCHAR field `title_en`​
    +schema.add_field(​
    +    field_name='title_en', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_built_in,​
    +    enable_match=True, ​
    +)​
    +​
    +# Configure a custom analyzer​
    +analyzer_params_custom = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase", # Built-in filter​
    +        {​
    +            "type": "length", # Custom filter​
    +            "max": 40​
    +        },​
    +        {​
    +            "type": "stop", # Custom filter​
    +            "stop_words": ["of", "to"]​
    +        }​
    +    ]​
    +}​
    +​
    +# Add VARCHAR field `title`​
    +schema.add_field(​
    +    field_name='title', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_custom,​
    +    enable_match=True, ​
    +)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +# Add primary field​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Set up index params for vector field​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")​
    +​
    +# Create collection with defined schema​
    +client.create_collection(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +// Set up a Milvus client
    +ConnectConfig config = ConnectConfig.builder()
    +        .uri("http://localhost:19530")
    +        .build();
    +MilvusClientV2 client = new MilvusClientV2(config);
    +
    +// Create schema
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +// Add fields to schema
    +// Use a built-in analyzer
    +Map<String, Object> analyzerParamsBuiltin = new HashMap<>();
    +analyzerParamsBuiltin.put("type", "english");
    +// Add VARCHAR field `title_en`
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title_en")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParamsBuiltin)
    +        .enableMatch(true)
    +        .build());
    +
    +// Configure a custom analyzer
    +Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "length");
    +                    put("max", 40);
    +                }},
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}
    +        )
    +);
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true) // must enable this if you use TextMatch
    +        .build());
    +
    +// Add vector field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("embedding")
    +        .dataType(DataType.FloatVector)
    +        .dimension(3)
    +        .build());
    +// Add primary field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +
    +// Set up index params for vector field
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("embedding")
    +        .indexType(IndexParam.IndexType.AUTOINDEX)
    +        .metricType(IndexParam.MetricType.COSINE)
    +        .build());
    +
    +// Create collection with defined schema
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +// Set up a Milvus client
    +const client = new MilvusClient("http://localhost:19530");
    +// Use a built-in analyzer for VARCHAR field `title_en`
    +const analyzerParamsBuiltIn = {
    +  type: "english",
    +};
    +
    +// Configure a custom analyzer for VARCHAR field `title`
    +const analyzerParamsCustom = {
    +  tokenizer: "standard",
    +  filter: [
    +    "lowercase",
    +    {
    +      type: "length",
    +      max: 40,
    +    },
    +    {
    +      type: "stop",
    +      stop_words: ["of", "to"],
    +    },
    +  ],
    +};
    +
    +// Create schema
    +const schema = {
    +  auto_id: true,
    +  fields: [
    +    {
    +      name: "id",
    +      type: DataType.INT64,
    +      is_primary: true,
    +    },
    +    {
    +      name: "title_en",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsBuiltIn,
    +      enable_match: true,
    +    },
    +    {
    +      name: "title",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsCustom,
    +      enable_match: true,
    +    },
    +    {
    +      name: "embedding",
    +      data_type: DataType.FLOAT_VECTOR,
    +      dim: 4,
    +    },
    +  ],
    +};
    +
    +// Set up index params for vector field
    +const indexParams = [
    +  {
    +    name: "embedding",
    +    metric_type: "COSINE",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +// Create collection with defined schema
    +await client.createCollection({
    +  collection_name: "YOUR_COLLECTION_NAME",
    +  schema: schema,
    +  index_params: indexParams,
    +});
    +
    +console.log("Collection created successfully!");
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "title_en",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "title",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {
    +                        "tokenizer": "standard",
    +                        "filter":[
    +                            "lowercase",
    +                            {
    +                                "type":"length",
    +                                "max":40
    +                            },
    +                            {
    +                                "type":"stop",
    +                                "stop_words":["of","to"]
    +                            }
    +                        ]
    +                    }
    +                }
    +            },
    +            {
    +                "fieldName": "embedding",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim":3
    +                }
    +            }
    +        ]
    +    }'
    +    
    +export indexParams='[
    +        {
    +            "fieldName": "embedding",
    +            "metricType": "COSINE",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"YOUR_COLLECTION_NAME\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.json new file mode 100644 index 000000000..a2352a75b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n \"filter\": [\"cnalphanumonly\"]​\n}​\n","analyzer_params = {​\n \"type\": \"chinese\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\"]​\n"],"headingContent":"Chinese​","anchorList":[{"label":"Bahasa Mandarin","href":"Chinese​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.md new file mode 100644 index 000000000..2ed8aded6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/chinese-analyzer.md @@ -0,0 +1,50 @@ +--- +id: chinese-analyzer.md +title: Penganalisis Cina +related_key: 'chinese, analyzer' +summary: >- + Penganalisis `bahasa Mandarin` dirancang khusus untuk menangani teks bahasa + Mandarin, memberikan segmentasi dan tokenisasi yang efektif. +--- +

    Bahasa Mandarin

    Penganalisis chinese dirancang khusus untuk menangani teks bahasa Mandarin, menyediakan segmentasi dan tokenisasi yang efektif.

    +

    Definisi

    Penganalisis chinese terdiri dari.

    +
      +
    • Tokenizer: Menggunakan tokenizer jieba untuk menyegmentasikan teks bahasa Mandarin menjadi token berdasarkan kosakata dan konteks. Untuk informasi lebih lanjut, lihat Jieba.

    • +
    • Filter: Menggunakan filter cnalphanumonly untuk menghapus token yang mengandung karakter non-Cina. Untuk informasi lebih lanjut, lihat Cnalphanumonly.

    • +
    +

    Fungsionalitas dari chinese analyzer setara dengan konfigurasi custom analyzer berikut ini.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +    "filter": ["cnalphanumonly"]​
    +}​
    +
    +

    Konfigurasi

    Untuk menerapkan penganalisis chinese ke suatu bidang, cukup setel type ke chinese di analyzer_params.

    +
    analyzer_params = {​
    +    "type": "chinese",​
    +}​
    +
    +
    +

    Penganalisis chinese tidak menerima parameter opsional apa pun.

    +
    +

    Contoh keluaran

    Berikut adalah cara penganalisis chinese memproses teks.

    +

    Teks asli.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["Milvus", "是", "一个", "高性", "性能", "高性能", "可", "扩展", "的", "向量", "数据", "据库", "数据库"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.json new file mode 100644 index 000000000..2130d91f2 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stemmer\",​\n \"language\": \"english\"​\n },{​\n \"type\": \"stop\",​\n \"stop_words\": \"_english_\",​\n }​\n ]​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n \"stop_words\": [\"a\", \"an\", \"the\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"milvus\", \"vector\", \"databas\", \"built\", \"scale\"]​\n"],"headingContent":"English​","anchorList":[{"label":"Bahasa Inggris","href":"English​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.md new file mode 100644 index 000000000..32f533649 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/english-analyzer.md @@ -0,0 +1,74 @@ +--- +id: english-analyzer.md +title: Penganalisis Bahasa Inggris +related_key: 'english, analyzer' +summary: >- + Penganalisis `bahasa Inggris` di Milvus dirancang untuk memproses teks bahasa + Inggris, menerapkan aturan khusus bahasa untuk tokenisasi dan penyaringan. +--- +

    Bahasa Inggris

    Penganalisis english di Milvus dirancang untuk memproses teks bahasa Inggris, menerapkan aturan khusus bahasa untuk tokenisasi dan penyaringan.

    +

    Definisi

    Penganalisis english menggunakan komponen-komponen berikut.

    +
      +
    • Tokenizer: Menggunakan standard tokenizer untuk membagi teks menjadi unit-unit kata yang terpisah.

    • +
    • Filter: Termasuk beberapa filter untuk pemrosesan teks yang komprehensif.

      +
        +
      • lowercase: Mengubah semua token menjadi huruf kecil, sehingga memungkinkan pencarian yang tidak peka huruf.

      • +
      • stemmer: Mengurangi kata menjadi bentuk dasar untuk mendukung pencocokan yang lebih luas (misalnya, "berlari" menjadi "menjalankan").

      • +
      • stop_words: Menghilangkan kata henti bahasa Inggris yang umum untuk fokus pada istilah-istilah kunci dalam teks.

      • +
    • +
    +

    Fungsionalitas dari english analyzer setara dengan konfigurasi penganalisis khusus berikut ini.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stemmer",​
    +            "language": "english"​
    +        },{​
    +            "type": "stop",​
    +            "stop_words": "_english_",​
    +        }​
    +    ]​
    +}​
    +
    +

    Konfigurasi

    Untuk menerapkan penganalisis english ke suatu bidang, cukup setel type ke english di analyzer_params, dan sertakan parameter opsional sesuai kebutuhan.

    +
    analyzer_params = {​
    +    "type": "english",​
    +}​
    +
    +

    Penganalisis english menerima parameter opsional berikut ini:

    +

    Parameter

    +

    Deskripsi

    +

    stop_words

    +

    Larik yang berisi daftar kata henti, yang akan dihapus dari tokenisasi. Setelan default ke _english_, kumpulan kata henti bahasa Inggris yang umum.

    +
    +

    Contoh konfigurasi dengan kata henti khusus.

    +
    analyzer_params = {​
    +    "type": "english",​
    +    "stop_words": ["a", "an", "the"]​
    +}​
    +
    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah bagaimana penganalisis english memproses teks.

    +

    Teks asli.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["milvus", "vector", "databas", "built", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.json new file mode 100644 index 000000000..d86c4ff55 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n \"stop_words\", [\"of\"] # Optional: List of words to exclude from tokenization​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"the\", \"milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"Standar","href":"Standard​","type":1,"isActive":false},{"label":"Definisi","href":"Definition​","type":2,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.md new file mode 100644 index 000000000..d356644b6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/analyzer/standard-analyzer.md @@ -0,0 +1,107 @@ +--- +id: standard-analyzer.md +title: Penganalisis Standar +related_key: 'standard, analyzer' +summary: >- + Penganalisis `standar` adalah penganalisis default di Milvus, yang secara + otomatis diterapkan ke bidang teks jika tidak ada penganalisis yang + ditentukan. Penganalisis ini menggunakan tokenisasi berbasis tata bahasa, + sehingga efektif untuk sebagian besar bahasa. +--- +

    Standar

    Penganalisis standard adalah penganalisis default di Milvus, yang secara otomatis diterapkan pada bidang teks jika tidak ada penganalisis yang ditentukan. Penganalisis ini menggunakan tokenisasi berbasis tata bahasa, sehingga efektif untuk sebagian besar bahasa.

    +

    Definisi

    Penganalisis standard terdiri dari.

    +
      +
    • Tokenizer: Menggunakan tokenizer standard untuk membagi teks menjadi unit kata terpisah berdasarkan aturan tata bahasa. Untuk informasi lebih lanjut, lihat Standar.

    • +
    • Filter: Menggunakan filter lowercase untuk mengubah semua token menjadi huruf kecil, sehingga memungkinkan pencarian yang tidak peka huruf besar/kecil. Untuk informasi lebih lanjut, lihatlowercase filter.

    • +
    +

    Fungsionalitas penganalisis standard setara dengan konfigurasi penganalisis khusus berikut ini.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    Konfigurasi

    Untuk menerapkan penganalisis standard ke suatu bidang, cukup setel type ke standard di analyzer_params, dan sertakan parameter opsional sesuai kebutuhan.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +}​
    +
    +

    Penganalisis standard menerima parameter opsional berikut ini:

    +

    Parameter

    +

    Deskripsi

    +

    stop_words

    +

    Larik yang berisi daftar kata henti, yang akan dihapus dari tokenisasi. Setelan default ke _english_, kumpulan kata henti bahasa Inggris yang umum. Rincian _english_ dapat ditemukan di sini.

    +
    +

    Contoh konfigurasi kata henti khusus.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +    "stop_words", ["of"] # Optional: List of words to exclude from tokenization​
    +}​
    +
    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk informasi lebih lanjut, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah bagaimana penganalisis standard memproses teks.

    +

    Teks asli.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["the", "milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.json new file mode 100644 index 000000000..ed56d2bf5 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"alphanumonly\"],​\n}​\n","\"Milvus 2.0 @ Scale! #AI #Vector_Databasé\"​\n","[\"Milvus\", \"2\", \"0\", \"Scale\", \"AI\", \"Vector\"]​\n"],"headingContent":"Alphanumonly​","anchorList":[{"label":"Hanya alfanumerik","href":"Alphanumonly​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.md new file mode 100644 index 000000000..05f70599f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/alphanumonly-filter.md @@ -0,0 +1,70 @@ +--- +id: alphanumonly-filter.md +title: Filter Khusus Alfanum +summary: >- + Filter `alphanumonly` menghapus token yang berisi karakter non-ASCII, dan + hanya menyimpan istilah alfanumerik. Filter ini berguna untuk memproses teks + yang hanya terdiri dari huruf dan angka dasar, tidak termasuk karakter atau + simbol khusus. +--- +

    Hanya alfanumerik

    Filter alphanumonly menghapus token yang berisi karakter non-ASCII, dan hanya menyimpan istilah alfanumerik. Filter ini berguna untuk memproses teks yang hanya terdiri dari huruf dan angka dasar, tidak termasuk karakter atau simbol khusus.

    +

    Konfigurasi

    Filter alphanumonly sudah ada di dalam Milvus. Untuk menggunakannya, cukup tentukan namanya di bagian filter di dalam analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["alphanumonly"],​
    +}​
    +
    +

    Filter alphanumonly beroperasi berdasarkan ketentuan yang dibuat oleh tokenizer, jadi filter ini harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring alphanumonly memproses teks.

    +

    Teks asli.

    +
    "Milvus 2.0 @ Scale! #AI #Vector_Databasé"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["Milvus", "2", "0", "Scale", "AI", "Vector"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.json new file mode 100644 index 000000000..b985b329b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"asciifolding\"],​\n}​\n","\"Café Möller serves crème brûlée and piñatas.\"​\n","[\"Cafe\", \"Moller\", \"serves\", \"creme\", \"brulee\", \"and\", \"pinatas\"]​\n"],"headingContent":"ASCII folding​","anchorList":[{"label":"Pelipatan ASCII","href":"ASCII-folding​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.md new file mode 100644 index 000000000..470b5ae8b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/ascii-folding-filter.md @@ -0,0 +1,68 @@ +--- +id: ascii-folding-filter.md +title: Pelipatan ASCII +summary: >- + Filter `asciifolding`**** mengonversi karakter di luar blok Unicode Latin + Dasar (127 karakter ASCII pertama) ke dalam ekuivalen ASCII. +--- +

    Pelipatan ASCII

    Filter asciifolding** ** mengubah karakter di luar blok Unicode Latin Dasar (127 karakter ASCII pertama) menjadi ekuivalen ASCII. Sebagai contoh, filter ini mengubah karakter seperti í menjadi i, membuat pemrosesan teks menjadi lebih sederhana dan lebih konsisten, terutama untuk konten multibahasa.

    +

    Konfigurasi

    Filter asciifolding sudah ada di dalam Milvus. Untuk menggunakannya, cukup tentukan namanya di bagian filter di dalam analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["asciifolding"],​
    +}​
    +
    +

    Filter asciifolding beroperasi berdasarkan istilah yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring asciifolding memproses teks.

    +

    Teks asli.

    +
    "Café Möller serves crème brûlée and piñatas."​
    +
    +

    Keluaran yang diharapkan.

    +
    ["Cafe", "Moller", "serves", "creme", "brulee", "and", "pinatas"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json new file mode 100644 index 000000000..5c1c20bfa --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cnalphanumonly\"],​\n}​\n\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"Milvus\", \"是\", \"LF\", \"AI\", \"Data\", \"Foundation\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"Apache\", \"2.0\", \"许可\", \"发布\"]​\n"],"headingContent":"Cnalphanumonly​","anchorList":[{"label":"Cnalphanumonly","href":"Cnalphanumonly​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md new file mode 100644 index 000000000..f39fe49fb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md @@ -0,0 +1,69 @@ +--- +id: cnalphanumonly-filter.md +title: Filter Cnalphanumonly +summary: >- + Filter `cnalphanumonly` menghapus token yang berisi karakter apa pun selain + karakter Cina, huruf Inggris, atau angka. +--- +

    Cnalphanumonly

    Filter cnalphanumonly menghapus token yang berisi karakter apa pun selain karakter Cina, huruf Inggris, atau angka.

    +

    Konfigurasi

    Filter cnalphanumonly sudah ada di dalam Milvus. Untuk menggunakannya, cukup tentukan namanya di bagian filter di dalam analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cnalphanumonly"],​
    +}​
    +
    +
    +

    Filter cnalphanumonly beroperasi berdasarkan ketentuan yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring cnalphanumonly memproses teks.

    +

    Teks asli.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["Milvus", "是", "LF", "AI", "Data", "Foundation", "下", "的", "一个", "开源", "项目", "以", "Apache", "2.0", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.json new file mode 100644 index 000000000..755bc3894 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cncharonly\"],​\n}​\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"是\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"许可\", \"发布\"]​\n"],"headingContent":"Cncharonly​","anchorList":[{"label":"Cncharonly","href":"Cncharonly​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.md new file mode 100644 index 000000000..b07cfc2a7 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/cncharonly-filter.md @@ -0,0 +1,68 @@ +--- +id: cncharonly-filter.md +title: Filter Cncharonly +summary: >- + Filter `cnalphanumonly` menghapus token yang berisi karakter apa pun selain + karakter Cina, huruf Inggris, atau angka. +--- +

    Cncharonly

    Filter cncharonly menghapus token yang mengandung karakter non-Cina. Filter ini berguna ketika Anda hanya ingin fokus pada teks bahasa Mandarin, menyaring token apa pun yang mengandung aksara, angka, atau simbol lain.

    +

    Konfigurasi

    Filter cncharonly sudah ada di dalam Milvus. Untuk menggunakannya, cukup tentukan namanya di bagian filter di dalam analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cncharonly"],​
    +}​
    +
    +

    Filter cncharonly beroperasi berdasarkan ketentuan yang dibuat oleh tokenizer, jadi filter ini harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring cncharonly memproses teks.

    +

    Teks asli.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["是", "下", "的", "一个", "开源", "项目", "以", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.json new file mode 100644 index 000000000..7f74efa2a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"decompounder\", # Specifies the filter type as decompounder​\n \"word_list\": [\"dampf\", \"schiff\", \"fahrt\", \"brot\", \"backen\", \"automat\"],​\n }],​\n}​\n","\"dampfschifffahrt brotbackautomat\"​\n","[\"dampf\", \"schiff\", \"fahrt\", \"brotbackautomat\"]​\n"],"headingContent":"Decompounder​","anchorList":[{"label":"Pengurai","href":"Decompounder​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.md new file mode 100644 index 000000000..ecd73ef02 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/decompounder-filter.md @@ -0,0 +1,79 @@ +--- +id: decompounder-filter.md +title: Filter Pengurai +summary: >- + Filter `decompounder` membagi kata majemuk menjadi komponen-komponen + individual berdasarkan kamus yang ditentukan, sehingga lebih mudah untuk + mencari bagian-bagian dari istilah majemuk. Filter ini sangat berguna untuk + bahasa yang sering menggunakan kata majemuk, seperti bahasa Jerman. +--- +

    Pengurai

    Filter decompounder membagi kata majemuk menjadi beberapa komponen berdasarkan kamus yang ditentukan, sehingga lebih mudah untuk mencari bagian dari istilah majemuk. Filter ini sangat berguna untuk bahasa yang sering menggunakan kata majemuk, seperti bahasa Jerman.

    +

    Konfigurasi

    Filter decompounder adalah filter khusus di Milvus. Untuk menggunakannya, tentukan "type": "decompounder" dalam konfigurasi filter, bersama dengan parameter word_list yang menyediakan kamus komponen kata yang akan dikenali.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "decompounder", # Specifies the filter type as decompounder​
    +        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],​
    +    }],​
    +}​
    +
    +

    Filter decompounder menerima parameter yang dapat dikonfigurasi berikut ini.

    +

    Parameter

    +

    Deskripsi

    +

    word_list

    +

    Daftar komponen kata yang digunakan untuk memisahkan istilah majemuk. Kamus ini menentukan bagaimana kata majemuk diuraikan menjadi istilah individual.

    +
    +

    Filter decompounder beroperasi pada istilah yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring decompounder memproses teks.

    +

    Teks asli.

    +
    "dampfschifffahrt brotbackautomat"​
    +
    +

    Keluaran yang diharapkan (dengan word_list: ["dampf", "schiff", "fahrt", "brot", "backen", "automat"]).

    +
    ["dampf", "schiff", "fahrt", "brotbackautomat"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.json new file mode 100644 index 000000000..9e463e2d3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"length\", # Specifies the filter type as length​\n \"max\": 10, # Sets the maximum token length to 10 characters​\n }],​\n}​\n","\"The length filter allows control over token length requirements for text processing.\"​\n","[\"length\", \"filter\", \"allows\", \"control\", \"over\", \"token\", \"length\", \"for\", \"text\"]​\n"],"headingContent":"Length​","anchorList":[{"label":"Panjang","href":"Length​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.md new file mode 100644 index 000000000..e48de87a0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/length-filter.md @@ -0,0 +1,78 @@ +--- +id: length-filter.md +title: Filter Panjang +summary: >- + Filter `length` menghapus token yang tidak memenuhi persyaratan panjang yang + ditentukan, sehingga Anda dapat mengontrol panjang token yang dipertahankan + selama pemrosesan teks. +--- +

    Panjang

    Filter length menghapus token yang tidak memenuhi persyaratan panjang yang ditentukan, sehingga Anda dapat mengontrol panjang token yang dipertahankan selama pemrosesan teks.

    +

    Konfigurasi

    Filter length adalah filter khusus di Milvus, yang ditentukan dengan mengatur "type": "length" dalam konfigurasi filter. Anda dapat mengonfigurasinya sebagai kamus di dalam analyzer_params untuk menentukan batas panjang.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "length", # Specifies the filter type as length​
    +        "max": 10, # Sets the maximum token length to 10 characters​
    +    }],​
    +}​
    +
    +

    Filter length menerima parameter yang dapat dikonfigurasi berikut ini.

    +

    Parameter

    +

    Deskripsi

    +

    max

    +

    Menetapkan panjang token maksimum. Token yang lebih panjang dari panjang ini akan dihapus.

    +
    +

    Filter length beroperasi pada ketentuan yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring length memproses teks.

    +

    Contoh teks.

    +
    "The length filter allows control over token length requirements for text processing."​
    +
    +

    Keluaran yang diharapkan (dengan max: 10).

    +
    ["length", "filter", "allows", "control", "over", "token", "length", "for", "text"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.json new file mode 100644 index 000000000..80c917a61 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"],​\n}​\n","\"The Lowercase Filter Ensures Uniformity In Text Processing.\"​\n","[\"the\", \"lowercase\", \"filter\", \"ensures\", \"uniformity\", \"in\", \"text\", \"processing\"]​\n"],"headingContent":"Lowercase​","anchorList":[{"label":"Huruf kecil","href":"Lowercase​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.md new file mode 100644 index 000000000..ffd3a1ea9 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/lowercase-filter.md @@ -0,0 +1,68 @@ +--- +id: lowercase-filter.md +title: Filter Huruf Kecil +summary: >- + Filter `huruf kecil` mengubah istilah yang dihasilkan oleh tokenizer menjadi + huruf kecil, sehingga pencarian menjadi tidak peka terhadap huruf. +--- +

    Huruf kecil

    Filter lowercase mengubah istilah yang dihasilkan oleh tokenizer menjadi huruf kecil, sehingga pencarian menjadi tidak peka huruf besar. Misalnya, filter ini dapat mengubah ["High", "Performance", "Vector", "Database"] menjadi ["high", "performance", "vector", "database"].

    +

    Konfigurasi

    Filter lowercase sudah ada di dalam Milvus. Untuk menggunakannya, cukup tentukan namanya di bagian filter di dalam analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"],​
    +}​
    +
    +

    Filter lowercase beroperasi berdasarkan ketentuan yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring lowercase memproses teks.

    +

    Teks asli.

    +
    "The Lowercase Filter Ensures Uniformity In Text Processing."​
    +
    +

    Keluaran yang diharapkan.

    +
    ["the", "lowercase", "filter", "ensures", "uniformity", "in", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.json new file mode 100644 index 000000000..0437ecc98 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stemmer\", # Specifies the filter type as stemmer​\n \"language\": \"english\", # Sets the language for stemming to English​\n }],​\n}​\n","\"running runs looked ran runner\"​\n","[\"run\", \"run\", \"look\", \"ran\", \"runner\"]​\n"],"headingContent":"Stemmer​","anchorList":[{"label":"Stemmer","href":"Stemmer​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.md new file mode 100644 index 000000000..ef8fc9bf4 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stemmer-filter.md @@ -0,0 +1,78 @@ +--- +id: stemmer-filter.md +title: Filter Stemmer +summary: >- + Filter `stemmer` mengurangi kata menjadi bentuk dasar atau akarnya (dikenal + sebagai stemming), sehingga lebih mudah untuk mencocokkan kata-kata dengan + arti yang sama di berbagai infleksi. +--- +

    Stemmer

    Filter stemmer mengurangi kata menjadi bentuk dasar atau akarnya (dikenal sebagai stemming), sehingga lebih mudah mencocokkan kata dengan arti yang sama di berbagai infleksi. Filter stemmer mendukung berbagai bahasa, memungkinkan pencarian dan pengindeksan yang efektif dalam berbagai konteks bahasa.

    +

    Konfigurasi

    Filter stemmer adalah filter khusus di Milvus. Untuk menggunakannya, tentukan "type": "stemmer" dalam konfigurasi filter, bersama dengan parameter language untuk memilih bahasa yang diinginkan untuk stemming.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stemmer", # Specifies the filter type as stemmer​
    +        "language": "english", # Sets the language for stemming to English​
    +    }],​
    +}​
    +
    +

    Filter stemmer menerima parameter yang dapat dikonfigurasi berikut ini.

    +

    Parameter

    +

    Deskripsi

    +

    language

    +

    Menentukan bahasa untuk proses stemming. Bahasa yang didukung meliputi: "arabic", "danish", "dutch", "english", "finnish", "french", "german", , "greek", "hungarian", "italian", "norwegian", "portuguese", "romanian", "russian", "spanish", "swedish", "tamil", "turkish"

    +
    +

    Filter stemmer beroperasi pada istilah yang dihasilkan oleh tokenizer, sehingga harus digunakan dalam kombinasi dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring stemmer memproses teks.

    +

    Teks asli.

    +
    "running runs looked ran runner"​
    +
    +

    Keluaran yang diharapkan (dengan language: "english").

    +
    ["run", "run", "look", "ran", "runner"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.json new file mode 100644 index 000000000..3d330c1a8 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stop\", # Specifies the filter type as stop​\n \"stop_words\": [\"of\", \"to\", \"_english_\"], # Defines custom stop words and includes the English stop word list​\n }],​\n}​\n","\"The stop filter allows control over common stop words for text processing.\"​\n","[\"The\", \"stop\", \"filter\", \"allows\", \"control\", \"common\", \"stop\", \"words\", \"text\", \"processing\"]​\n"],"headingContent":"Stop​","anchorList":[{"label":"Berhenti","href":"Stop​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.md new file mode 100644 index 000000000..8757df262 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/filter/stop-filter.md @@ -0,0 +1,78 @@ +--- +id: stop-filter.md +title: Hentikan Filter +summary: >- + Filter `stop` menghapus kata henti yang ditentukan dari teks yang ditandai, + membantu menghilangkan kata-kata umum yang kurang bermakna. Anda dapat + mengonfigurasi daftar kata henti menggunakan parameter `stop_words`. +--- +

    Berhenti

    Filter stop menghapus kata henti yang ditentukan dari teks yang diberi tanda, sehingga membantu menghilangkan kata-kata umum yang kurang bermakna. Anda dapat mengonfigurasi daftar kata henti menggunakan parameter stop_words.

    +

    Konfigurasi

    Filter length adalah filter khusus di Milvus. Untuk menggunakannya, tentukan "type": "stop" dalam konfigurasi filter, bersama dengan parameter stop_words yang menyediakan daftar stop words.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stop", # Specifies the filter type as stop​
    +        "stop_words": ["of", "to", "_english_"], # Defines custom stop words and includes the English stop word list​
    +    }],​
    +}​
    +
    +

    Filter stop menerima parameter yang dapat dikonfigurasi berikut ini.

    +

    Parameter

    +

    Deskripsi

    +

    stop_words

    +

    Daftar kata yang akan dihapus dari tokenisasi. Secara default, daftar _english_ yang telah ditetapkan sebelumnya, yang berisi kata henti bahasa Inggris yang umum, digunakan. Rincian _english_ dapat ditemukan di sini.

    +
    +

    Filter stop beroperasi pada istilah yang dihasilkan oleh tokenizer, sehingga harus digunakan bersama dengan tokenizer.

    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana penyaring stop memproses teks.

    +

    Teks asli.

    +
    "The stop filter allows control over common stop words for text processing."​
    +
    +

    Keluaran yang diharapkan (dengan stop_words: ["the", "over", "_english_"]).

    +
    ["The", "stop", "filter", "allows", "control", "common", "stop", "words", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json new file mode 100644 index 000000000..96e279495 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \" \", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"、\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\", \"!\"]​\n"],"headingContent":"Jieba​","anchorList":[{"label":"Jieba","href":"Jieba​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md new file mode 100644 index 000000000..723bf18c3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md @@ -0,0 +1,66 @@ +--- +id: jieba-tokenizer.md +title: Jieba Tokenizer +summary: >- + Tokenizer `jieba` memproses teks bahasa Mandarin dengan memecahnya menjadi + beberapa kata. +--- +

    Jieba

    Tokenizer jieba memproses teks bahasa Mandarin dengan memecahnya menjadi beberapa komponen kata.

    +

    Konfigurasi

    Untuk mengonfigurasi penganalisis menggunakan jieba tokenizer, setel tokenizer ke jieba di analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +}​
    +
    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR saat mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana tokenizer jieba memproses teks.

    +

    Teks asli.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["Milvus", " ", "是", "一个", "高性", "性能", "高性能", "、", "可", "扩展", "的", "向量", "数据", "据库", "数据库", "!"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json new file mode 100644 index 000000000..6b0dacbf3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n}​\n\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"Standar","href":"Standard​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md new file mode 100644 index 000000000..89c10c5d3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md @@ -0,0 +1,77 @@ +--- +id: standard-tokenizer.md +title: Tokenizer Standar +summary: >- + Tokenizer `standar` di Milvus membagi teks berdasarkan spasi dan tanda baca, + sehingga cocok untuk sebagian besar bahasa. +--- +

    Standar

    Tokenizer standard di Milvus membagi teks berdasarkan spasi dan tanda baca, sehingga cocok untuk sebagian besar bahasa.

    +

    Konfigurasi

    Untuk mengonfigurasi penganalisis menggunakan tokenizer standard, setel tokenizer ke standard di analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +}​
    +
    +
    +

    Tokenizer standard dapat bekerja bersama dengan satu atau beberapa filter. Sebagai contoh, kode berikut ini mendefinisikan penganalisis yang menggunakan tokenizer standard dan filter lowercase.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +
    +
    +

    Untuk pengaturan yang lebih sederhana, Anda dapat memilih untuk menggunakan filter standard analyzeryang menggabungkan tokenizer standard dengan filter lowercase filter.

    +
    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana tokenizer standard memproses teks.

    +

    Teks asli.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json new file mode 100644 index 000000000..5d296c38c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n \"filter\": [\"lowercase\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale!\"]​\n"],"headingContent":"Whitespace​","anchorList":[{"label":"Spasi","href":"Whitespace​","type":1,"isActive":false},{"label":"Konfigurasi","href":"Configuration​","type":2,"isActive":false},{"label":"Contoh keluaran","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md new file mode 100644 index 000000000..7b026a823 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md @@ -0,0 +1,72 @@ +--- +id: whitespace-tokenizer.md +title: Tokenizer spasi kosong +summary: >- + Pembeda `spasi` membagi teks menjadi beberapa istilah setiap kali ada spasi di + antara kata-kata. +--- +

    Spasi

    Tokenizer whitespace membagi teks menjadi beberapa istilah setiap kali ada spasi di antara kata-kata.

    +

    Konfigurasi

    Untuk mengonfigurasi penganalisis menggunakan tokenizer whitespace, setel tokenizer ke whitespace di analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +

    Tokenizer spasi dapat bekerja bersama dengan satu atau beberapa filter. Sebagai contoh, kode berikut ini mendefinisikan penganalisis yang menggunakan tokenizer whitespace dan lowercase filter:

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    Setelah mendefinisikan analyzer_params, Anda dapat menerapkannya ke bidang VARCHAR ketika mendefinisikan skema koleksi. Hal ini memungkinkan Milvus untuk memproses teks dalam bidang tersebut menggunakan penganalisis yang ditentukan untuk tokenisasi dan pemfilteran yang efisien. Untuk detailnya, lihat Contoh penggunaan.

    +

    Contoh keluaran

    Berikut adalah contoh bagaimana tokenizer whitespace memproses teks.

    +

    Teks asli.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Keluaran yang diharapkan.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale!"]​
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/array_data_type.json b/localization/v2.5.x/site/id/userGuide/schema/array_data_type.json new file mode 100644 index 000000000..8631dba47 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/array_data_type.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3]​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\n# Add an Array field with elements of type VARCHAR​\nschema.add_field(field_name=\"tags\", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​\n# Add an Array field with elements of type INT64​\nschema.add_field(field_name=\"ratings\", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​\n​\n# Add primary field​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"tags\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(10)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"ratings\")​\n .dataType(DataType.Array)​\n .elementType(DataType.Int64)​\n .maxCapacity(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"tags\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 10,​\n max_length: 65535​\n },​\n {​\n name: \"rating\",​\n data_type: DataType.Array,​\n element_type: DataType.Int64,​\n max_capacity: 5,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export arrayField1='{​\n \"fieldName\": \"tags\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 10,​\n \"max_length\": 100​\n }​\n}'​\n​\nexport arrayField2='{​\n \"fieldName\": \"ratings\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"Int64\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 5​\n }​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $arrayField1,​\n $arrayField2,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","# Prepare index parameters​\nindex_params = client.prepare_index_params() # Prepare IndexParams object​\n​\nindex_params.add_index(​\n field_name=\"tags\", # Name of the Array field to index​\n index_type=\"AUTOINDEX\", # Index type​\n index_name=\"inverted_index\" # Index name​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"tags\")​\n .indexName(\"inverted_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'inverted_index',​\n field_name: 'tags',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, such as L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n"," indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_array_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_array_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_array_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_array_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n]​\n​\nclient.insert(​\n collection_name=\"my_array_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"pop\\\", \\\"rock\\\", \\\"classic\\\"], \\\"ratings\\\": [5, 4, 3], \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"jazz\\\", \\\"blues\\\"], \\\"ratings\\\": [4, 5], \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"electronic\\\", \\\"dance\\\"], \\\"ratings\\\": [3, 3, 4], \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_array_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n];​\n​\nclient.insert({​\n collection_name: \"my_array_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n } ​\n ],​\n \"collectionName\": \"my_array_collection\"​\n}'​\n\n","filter = 'ratings[0] < 4'​\n​\nres = client.query(​\n collection_name=\"my_array_collection\",​\n filter=filter,​\n output_fields=[\"tags\", \"ratings\", \"embedding\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"ratings[0] < 4\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_array_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​\n\n","client.query({​\n collection_name: 'my_array_collection',​\n filter: 'ratings[0] < 4',​\n output_fields: ['tags', 'ratings', 'embedding']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"filter\": \"ratings[0] < 4\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"embedding\":[0.67,0.45,0.89],\"pk\":3,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[3,3,4]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"electronic\",\"dance\"]}}}}]}​\n\n","filter = 'tags[0] == \"pop\"'​\n​\nres = client.search(​\n collection_name=\"my_array_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"tags\", \"ratings\", \"embedding\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"tags[0] == \\\"pop\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_array_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_array_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['tags', 'ratings', 'embdding'],​\n filter: 'tags[0] == \"pop\"'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"filter\": \"tags[0] == \\\"pop\\\"\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"embedding\":[0.12,0.34,0.56],\"id\":1,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[5,4,3]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"pop\",\"rock\",\"classic\"]}}}}]}​\n\n"],"headingContent":"Array Field​","anchorList":[{"label":"Bidang Array","href":"Array-Field​","type":1,"isActive":false},{"label":"Menambahkan bidang Array","href":"Add-Array-field​","type":2,"isActive":false},{"label":"Mengatur parameter indeks","href":"Set-index-params​","type":2,"isActive":false},{"label":"Membuat koleksi","href":"Create-collection​","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data​","type":2,"isActive":false},{"label":"Pencarian dan kueri","href":"Search-and-query​","type":2,"isActive":false},{"label":"Batasan","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/array_data_type.md b/localization/v2.5.x/site/id/userGuide/schema/array_data_type.md new file mode 100644 index 000000000..a7e497520 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/array_data_type.md @@ -0,0 +1,631 @@ +--- +id: array_data_type.md +title: Bidang Array +summary: >- + Tipe Array digunakan untuk menyimpan bidang yang berisi beberapa nilai dengan + tipe data yang sama. Tipe ini menyediakan cara yang fleksibel untuk menyimpan + atribut dengan banyak elemen, sehingga sangat berguna dalam skenario di mana + sekumpulan data terkait perlu disimpan. Di Milvus, Anda dapat menyimpan bidang + Array bersama data vektor, sehingga memungkinkan kueri yang lebih kompleks dan + persyaratan pemfilteran. +--- +

    Bidang Array

    Tipe Array digunakan untuk menyimpan bidang yang berisi beberapa nilai dengan tipe data yang sama. Tipe ini menyediakan cara yang fleksibel untuk menyimpan atribut dengan banyak elemen, sehingga sangat berguna dalam skenario di mana sekumpulan data terkait perlu disimpan. Di Milvus, Anda dapat menyimpan bidang Array di samping data vektor, sehingga memungkinkan kueri yang lebih kompleks dan persyaratan pemfilteran.

    +

    Sebagai contoh, dalam sistem rekomendasi musik, bidang Array dapat menyimpan daftar tag untuk sebuah lagu; dalam analisis perilaku pengguna, bidang ini dapat menyimpan peringkat pengguna untuk lagu. Di bawah ini adalah contoh bidang Array yang khas.

    +
    {​
    +  "tags": ["pop", "rock", "classic"],​
    +  "ratings": [5, 4, 3]​
    +}​
    +
    +
    +

    Dalam contoh ini, tags dan ratings keduanya adalah bidang Array. Bidang tags adalah larik string yang mewakili genre lagu seperti pop, rock, dan klasik, sedangkan bidang ratings adalah larik bilangan bulat yang mewakili peringkat pengguna untuk lagu tersebut, mulai dari 1 hingga 5. Bidang Array ini menyediakan cara yang fleksibel untuk menyimpan data multi-nilai, sehingga lebih mudah untuk melakukan analisis terperinci selama kueri dan pemfilteran.

    +

    Menambahkan bidang Array

    Untuk menggunakan bidang Array di Milvus, tentukan jenis bidang yang relevan saat membuat skema koleksi. Proses ini meliputi.

    +
      +
    1. Mengatur datatype ke tipe data Array yang didukung, ARRAY.

    2. +
    3. Menggunakan parameter element_type untuk menentukan tipe data dari elemen-elemen di dalam larik. Ini bisa berupa tipe data skalar apa pun yang didukung oleh Milvus, seperti VARCHAR atau INT64. Semua elemen dalam Larik yang sama harus memiliki tipe data yang sama.

    4. +
    5. Menggunakan parameter max_capacity untuk mendefinisikan kapasitas maksimum larik, yaitu jumlah maksimum elemen yang dapat ditampung.

    6. +
    +

    Berikut ini cara mendefinisikan skema koleksi yang menyertakan bidang Array.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +# Add an Array field with elements of type VARCHAR​
    +schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​
    +# Add an Array field with elements of type INT64​
    +schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​
    +​
    +# Add primary field​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("tags")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(10)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("ratings")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.Int64)​
    +        .maxCapacity(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "tags",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 10,​
    +    max_length: 65535​
    +  },​
    +  {​
    +    name: "rating",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.Int64,​
    +    max_capacity: 5,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export arrayField1='{​
    +    "fieldName": "tags",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_capacity": 10,​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export arrayField2='{​
    +    "fieldName": "ratings",​
    +    "dataType": "Array",​
    +    "elementDataType": "Int64",​
    +    "elementTypeParams": {​
    +        "max_capacity": 5​
    +    }​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $arrayField1,​
    +        $arrayField2,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Dalam contoh ini.

    +
      +
    • tags adalah larik string dengan element_type disetel ke VARCHAR, yang mengindikasikan bahwa elemen dalam larik harus berupa string. max_capacity disetel ke 10, yang berarti larik dapat berisi hingga 10 elemen.

    • +
    • ratings adalah larik bilangan bulat dengan element_type diatur ke INT64, yang menunjukkan bahwa elemen harus berupa bilangan bulat. max_capacity diatur ke 5, yang memungkinkan hingga 5 peringkat.

    • +
    • Kami juga menambahkan bidang kunci utama pk dan bidang vektor embedding.

    • +
    +
    +

    Bidang utama dan bidang vektor wajib ada saat Anda membuat koleksi. Bidang utama mengidentifikasi setiap entitas secara unik, sedangkan bidang vektor sangat penting untuk pencarian kemiripan. Untuk lebih jelasnya, lihat Bidang Utama & AutoID, Vektor Padat, Vektor Biner, atau Vektor Jarang.

    +
    +

    Mengatur parameter indeks

    Menetapkan parameter indeks untuk bidang Array bersifat opsional, namun dapat meningkatkan efisiensi pencarian secara signifikan.

    +

    Pada contoh berikut, kita membuat AUTOINDEX untuk field tags, yang berarti Milvus akan secara otomatis membuat indeks skalar yang sesuai berdasarkan tipe data.

    + +
    # Prepare index parameters​
    +index_params = client.prepare_index_params()  # Prepare IndexParams object​
    +​
    +index_params.add_index(​
    +    field_name="tags",  # Name of the Array field to index​
    +    index_type="AUTOINDEX",  # Index type​
    +    index_name="inverted_index"  # Index name​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("tags")​
    +        .indexName("inverted_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'inverted_index',​
    +    field_name: 'tags',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Selain AUTOINDEX, Anda dapat menentukan jenis indeks skalar lain seperti INVERTED atau BITMAP. Untuk jenis indeks yang didukung, lihat Indeks Skalar.

    +

    Selain itu, Anda harus membuat indeks untuk bidang vektor sebelum membuat koleksi. Dalam contoh ini, kita menggunakan AUTOINDEX untuk menyederhanakan penyiapan indeks vektor.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, such as L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
     indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Membuat koleksi

    Gunakan skema dan parameter indeks yang ditentukan untuk membuat koleksi.

    + +
    client.create_collection(​
    +    collection_name="my_array_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_array_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_array_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan data

    Setelah membuat koleksi, Anda dapat menyisipkan data yang menyertakan bidang Array.

    + +
    data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_array_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"tags\": [\"pop\", \"rock\", \"classic\"], \"ratings\": [5, 4, 3], \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"jazz\", \"blues\"], \"ratings\": [4, 5], \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"electronic\", \"dance\"], \"ratings\": [3, 3, 4], \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_array_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }       ​
    +    ],​
    +    "collectionName": "my_array_collection"​
    +}'​
    +
    +
    +

    Dalam contoh ini.

    +
      +
    • Setiap entri data mencakup bidang utama (pk), sedangkan tags dan ratings adalah bidang Array yang digunakan untuk menyimpan tag dan peringkat.

    • +
    • embedding adalah bidang vektor 3 dimensi yang digunakan untuk pencarian kemiripan vektor.

    • +
    +

    Pencarian dan kueri

    Bidang larik memungkinkan pemfilteran skalar selama pencarian, meningkatkan kemampuan pencarian vektor Milvus. Anda dapat membuat kueri berdasarkan properti bidang Array di samping pencarian kemiripan vektor.

    +

    Menyaring kueri

    Anda dapat memfilter data berdasarkan properti bidang Array, seperti mengakses elemen tertentu atau memeriksa apakah elemen array memenuhi kondisi tertentu.

    + +
    filter = 'ratings[0] < 4'​
    +​
    +res = client.query(​
    +    collection_name="my_array_collection",​
    +    filter=filter,​
    +    output_fields=["tags", "ratings", "embedding"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "ratings[0] < 4";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_array_collection',​
    +    filter: 'ratings[0] < 4',​
    +    output_fields: ['tags', 'ratings', 'embedding']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "filter": "ratings[0] < 4",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"embedding":[0.67,0.45,0.89],"pk":3,"ratings":{"Data":{"LongData":{"data":[3,3,4]}}},"tags":{"Data":{"StringData":{"data":["electronic","dance"]}}}}]}​
    +
    +
    +

    Dalam kueri ini, Milvus menyaring entitas yang elemen pertama larik ratings kurang dari 4, dan mengembalikan entitas yang sesuai dengan kondisi tersebut.

    +

    Pencarian vektor dengan pemfilteran Array

    Dengan menggabungkan kemiripan vektor dengan pemfilteran Array, Anda dapat memastikan bahwa data yang diambil tidak hanya mirip secara semantik tetapi juga memenuhi kondisi tertentu, sehingga hasil pencarian lebih akurat dan selaras dengan kebutuhan bisnis.

    + +
    filter = 'tags[0] == "pop"'​
    +​
    +res = client.search(​
    +    collection_name="my_array_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["tags", "ratings", "embedding"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "tags[0] == \"pop\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_array_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['tags', 'ratings', 'embdding'],​
    +    filter: 'tags[0] == "pop"'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "filter": "tags[0] == \"pop\"",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"distance":-0.24793813,"embedding":[0.12,0.34,0.56],"id":1,"ratings":{"Data":{"LongData":{"data":[5,4,3]}}},"tags":{"Data":{"StringData":{"data":["pop","rock","classic"]}}}}]}​
    +
    +
    +

    Dalam contoh ini, Milvus mengembalikan 5 entitas teratas yang paling mirip dengan vektor kueri, dengan elemen pertama larik tags adalah "pop".

    +

    Selain itu, Milvus mendukung operator pemfilteran Array tingkat lanjut seperti ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY, dan ARRAY_LENGTH untuk lebih meningkatkan kemampuan kueri. Untuk lebih jelasnya, lihat Pemfilteran Metadata.

    +

    Batasan

      +
    • Tipe Data: Semua elemen dalam bidang Array harus memiliki tipe data yang sama, seperti yang ditentukan oleh element_type.

    • +
    • Kapasitas Larik: Jumlah elemen dalam bidang Array harus kurang dari atau sama dengan kapasitas maksimum yang ditentukan saat Array dibuat, seperti yang ditentukan oleh max_capacity.

    • +
    • Penanganan String: Nilai string dalam bidang Array disimpan apa adanya, tanpa pelarian atau konversi semantik. Misalnya, 'a"b', "a'b", 'a\'b', dan "a\"b" disimpan seperti yang dimasukkan, sedangkan 'a'b' dan "a"b" dianggap sebagai nilai yang tidak valid.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/binary-vector.json b/localization/v2.5.x/site/id/userGuide/schema/binary-vector.json new file mode 100644 index 000000000..b46bc1434 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/binary-vector.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=128)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"binary_vector\")​\n .dataType(DataType.BinaryVector)​\n .dimension(128)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"binary vector\",​\n data_type: DataType.BinaryVector,​\n dim: 128,​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"binary_vector\",​\n \"dataType\": \"BinaryVector\",​\n \"elementTypeParams\": {​\n \"dim\": 128​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ],​\n \\\"enableDynamicField\\\": true​\n}\"​\n​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"binary_vector\",​\n index_name=\"binary_vector_index\",​\n index_type=\"BIN_IVF_FLAT\",​\n metric_type=\"HAMMING\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexParams = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexParams.add(IndexParam.builder()​\n .fieldName(\"binary_vector\")​\n .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​\n .metricType(IndexParam.MetricType.HAMMING)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n indexName: \"binary_vector_index\",​\n field_name: \"binary_vector\",​\n metric_type: MetricType.HAMMING,​\n index_type: IndexType.BIN_IVF_FLAT,​\n params: {​\n nlist: 128,​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"binary_vector\",​\n \"metricType\": \"HAMMING\",​\n \"indexName\": \"binary_vector_index\",​\n \"indexType\": \"BIN_IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_binary_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","def convert_bool_list_to_bytes(bool_list):​\n if len(bool_list) % 8 != 0:​\n raise ValueError(\"The length of a boolean list must be a multiple of 8\")​\n​\n byte_array = bytearray(len(bool_list) // 8)​\n for i, bit in enumerate(bool_list):​\n if bit == 1:​\n index = i // 8​\n shift = i % 8​\n byte_array[index] |= (1 << shift)​\n return bytes(byte_array)​\n​\n​\nbool_vectors = [​\n [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​\n [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​\n]​\n​\ndata = [{\"binary_vector\": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​\n​\nclient.insert(​\n collection_name=\"my_binary_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nprivate static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​\n byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​\n for (int i = 0; i < booleanArray.length; i++) {​\n if (booleanArray[i]) {​\n int index = i / Byte.SIZE;​\n int shift = i % Byte.SIZE;​\n byteArray[index] |= (byte) (1 << shift);​\n }​\n }​\n​\n return byteArray;​\n}​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n{​\n boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_binary_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"data\\\": $data,​\n \\\"collectionName\\\": \\\"my_binary_collection\\\"​\n}\"​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​\nquery_vector = convert_bool_list_to_bytes(query_bool_list)​\n​\nres = client.search(​\n collection_name=\"my_binary_collection\",​\n data=[query_vector],​\n anns_field=\"binary_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.BinaryVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nboolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\nBinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"binary_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\n System.out.println(searchR.getSearchResults());​\n ​\n // Output​\n //​\n // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​\n\n","query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​\n​\nclient.search({​\n collection_name: 'my_binary_collection',​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","export searchParams='{​\n \"params\":{\"nprobe\":10}​\n }'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"data\\\": $data,​\n \\\"annsField\\\": \\\"binary_vector\\\",​\n \\\"limit\\\": 5,​\n \\\"searchParams\\\":$searchParams,​\n \\\"outputFields\\\": [\\\"pk\\\"]​\n}\"​\n\n"],"headingContent":"Binary Vector​","anchorList":[{"label":"Binary Vector​","href":"Binary-Vector​","type":1,"isActive":false},{"label":"Overview​","href":"Overview​","type":2,"isActive":false},{"label":"Use binary vectors in Milvus​","href":"Use-binary-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/binary-vector.md b/localization/v2.5.x/site/id/userGuide/schema/binary-vector.md new file mode 100644 index 000000000..b792a3cc6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/binary-vector.md @@ -0,0 +1,474 @@ +--- +id: binary-vector.md +title: Binary Vector​ +summary: >- + Vektor biner adalah bentuk khusus representasi data yang mengubah vektor + floating-point berdimensi tinggi tradisional menjadi vektor biner yang hanya + berisi 0 dan 1. Transformasi ini tidak hanya memadatkan ukuran vektor tetapi + juga mengurangi biaya penyimpanan dan komputasi dengan tetap mempertahankan + informasi semantik. Ketika ketepatan untuk fitur yang tidak penting tidak + diperlukan, vektor biner dapat secara efektif mempertahankan sebagian besar + integritas dan kegunaan vektor floating-point asli. +--- +

    Binary Vector​

    Binary vectors are a special form of data representation that convert traditional high-dimensional floating-point vectors into binary vectors containing only 0s and 1s. This transformation not only compresses the size of the vector but also reduces storage and computational costs while retaining semantic information. When precision for non-critical features is not essential, binary vectors can effectively maintain most of the integrity and utility of the original floating-point vectors.​

    +

    Binary vectors have a wide range of applications, particularly in situations where computational efficiency and storage optimization are crucial. In large-scale AI systems, such as search engines or recommendation systems, real-time processing of massive amounts of data is key. By reducing the size of the vectors, binary vectors help lower latency and computational costs without significantly sacrificing accuracy. Additionally, binary vectors are useful in resource-constrained environments, such as mobile devices and embedded systems, where memory and processing power are limited. Through the use of binary vectors, complex AI functions can be implemented in these restricted settings while maintaining high performance.​

    +

    Overview​

    Binary vectors are a method of encoding complex objects (like images, text, or audio) into fixed-length binary values. In Milvus, binary vectors are typically represented as bit arrays or byte arrays. For example, an 8-dimensional binary vector can be represented as [1, 0, 1, 1, 0, 0, 1, 0].​

    +

    The diagram below shows how binary vectors represent the presence of keywords in text content. In this example, a 10-dimensional binary vector is used to represent two different texts (Text 1 and Text 2), where each dimension corresponds to a word in the vocabulary: 1 indicates the presence of the word in the text, while 0 indicates its absence.​

    +

    + + Binary vector representation of text content + Binary vector representation of text content + +

    +

    Binary vectors have the following characteristics:​

    +
      +
    • Efficient Storage: Each dimension requires only 1 bit of storage, significantly reducing storage space.​

    • +
    • Fast Computation: Similarity between vectors can be quickly calculated using bitwise operations like XOR.​

    • +
    • Fixed Length: The length of the vector remains constant regardless of the original text length, making indexing and retrieval easier.​

    • +
    • Simple and Intuitive: Directly reflects the presence of keywords, making it suitable for certain specialized retrieval tasks.​

    • +
    +

    Binary vectors can be generated through various methods. In text processing, predefined vocabularies can be used to set corresponding bits based on word presence. For image processing, perceptual hashing algorithms (like pHash) can generate binary features of images. In machine learning applications, model outputs can be binarized to obtain binary vector representations.​

    +

    After binary vectorization, the data can be stored in Milvus for management and vector retrieval. The diagram below shows the basic process.​

    +

    + + Use binary vectors in Milvus + Use binary vectors in Milvus + +

    +
    +

    Although binary vectors excel in specific scenarios, they have limitations in their expressive capability, making it difficult to capture complex semantic relationships. Therefore, in real-world scenarios, binary vectors are often used alongside other vector types to balance efficiency and expressiveness. For more information, refer to ​Dense Vector and ​Sparse Vector.​

    +
    +

    Use binary vectors in Milvus​

    Add vector field​

    To use binary vectors in Milvus, first define a vector field for storing binary vectors when creating a collection. This process includes:​

    +
      +
    1. Setting datatype to the supported binary vector data type, i.e., BINARY_VECTOR.​

    2. +
    3. Specifying the vector’s dimensions using the dim parameter. Note that dim must be a multiple of 8 as binary vectors must be converted into a byte array when inserting. Every 8 boolean values (0 or 1) will be packed into 1 byte. For example, if dim=128, a 16-byte array is required for insertion.​

    4. +
    +
    + Python + Java + Node.js + Go + cURL +
    +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("binary_vector")​
    +        .dataType(DataType.BinaryVector)​
    +        .dimension(128)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "binary vector",​
    +  data_type: DataType.BinaryVector,​
    +  dim: 128,​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "binary_vector",​
    +    "dataType": "BinaryVector",​
    +    "elementTypeParams": {​
    +        "dim": 128​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ],​
    +    \"enableDynamicField\": true​
    +}"​
    +​
    +
    +
    +

    In this example, a vector field named binary_vector is added for storing binary vectors. The data type of this field is BINARY_VECTOR, with a dimension of 128.​

    +

    Set index params for vector field​

    To speed up searches, an index must be created for the binary vector field. Indexing can significantly enhance the retrieval efficiency of large-scale vector data.​

    +
    + Python + Java + Node.js + Go + cURL +
    +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="binary_vector",​
    +    index_name="binary_vector_index",​
    +    index_type="BIN_IVF_FLAT",​
    +    metric_type="HAMMING",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexParams.add(IndexParam.builder()​
    +        .fieldName("binary_vector")​
    +        .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.HAMMING)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +  indexName: "binary_vector_index",​
    +  field_name: "binary_vector",​
    +  metric_type: MetricType.HAMMING,​
    +  index_type: IndexType.BIN_IVF_FLAT,​
    +  params: {​
    +    nlist: 128,​
    +  },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "binary_vector",​
    +            "metricType": "HAMMING",​
    +            "indexName": "binary_vector_index",​
    +            "indexType": "BIN_IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    In the example above, an index named binary_vector_index is created for the binary_vector field, using the BIN_IVF_FLAT index type. The metric_type is set to HAMMING, indicating that Hamming distance is used for similarity measurement.​

    +

    Besides BIN_IVF_FLAT, Milvus supports other index types for binary vectors. For more details, refer to ​Binary Vector Indexes. Additionally, Milvus supports other similarity metrics for binary vectors. For more information, refer to ​Metric Types.​

    +

    Create collection​

    Once the binary vector and index settings are complete, create a collection that contains binary vectors. The example below uses the create_collection method to create a collection named my_binary_collection.​

    +
    + Python + Java + Node.js + Go + cURL +
    +
    client.create_collection(​
    +    collection_name="my_binary_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Insert data​

    After creating the collection, use the insert method to add data containing binary vectors. Note that binary vectors should be provided in the form of a byte array, where each byte represents 8 boolean values.​

    +

    For example, for a 128-dimensional binary vector, a 16-byte array is required (since 128 bits ÷ 8 bits/byte = 16 bytes). Below is an example code for inserting data:​

    +
    + Python + Java + Node.js + Go + cURL +
    +
    def convert_bool_list_to_bytes(bool_list):​
    +    if len(bool_list) % 8 != 0:​
    +        raise ValueError("The length of a boolean list must be a multiple of 8")​
    +​
    +    byte_array = bytearray(len(bool_list) // 8)​
    +    for i, bit in enumerate(bool_list):​
    +        if bit == 1:​
    +            index = i // 8​
    +            shift = i % 8​
    +            byte_array[index] |= (1 << shift)​
    +    return bytes(byte_array)​
    +​
    +​
    +bool_vectors = [​
    +    [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​
    +    [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​
    +]​
    +​
    +data = [{"binary_vector": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​
    +​
    +client.insert(​
    +    collection_name="my_binary_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +private static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​
    +    byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​
    +    for (int i = 0; i < booleanArray.length; i++) {​
    +        if (booleanArray[i]) {​
    +            int index = i / Byte.SIZE;​
    +            int shift = i % Byte.SIZE;​
    +            byteArray[index] |= (byte) (1 << shift);​
    +        }​
    +    }​
    +​
    +    return byteArray;​
    +}​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +{​
    +    boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_binary_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"data\": $data,​
    +    \"collectionName\": \"my_binary_collection\"​
    +}"​
    +
    +
    +

    Perform similarity search​

    Similarity search is one of the core features of Milvus, allowing you to quickly find data that is most similar to a query vector based on the distance between vectors. To perform a similarity search using binary vectors, prepare the query vector and search parameters, then call the search method.​

    +

    During search operations, binary vectors must also be provided in the form of a byte array. Ensure that the dimensionality of the query vector matches the dimension specified when defining dim and that every 8 boolean values are converted into 1 byte.​

    +
    + Python + Java + Node.js + Go + cURL +
    +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​
    +query_vector = convert_bool_list_to_bytes(query_bool_list)​
    +​
    +res = client.search(​
    +    collection_name="my_binary_collection",​
    +    data=[query_vector],​
    +    anns_field="binary_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.BinaryVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +BinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("binary_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    + System.out.println(searchR.getSearchResults());​
    + ​
    + // Output​
    + //​
    + // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​
    +
    +
    +
    query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​
    +​
    +client.search({​
    +    collection_name: 'my_binary_collection',​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    export searchParams='{​
    +        "params":{"nprobe":10}​
    +    }'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"data\": $data,​
    +    \"annsField\": \"binary_vector\",​
    +    \"limit\": 5,​
    +    \"searchParams\":$searchParams,​
    +    \"outputFields\": [\"pk\"]​
    +}"​
    +
    +
    +

    For more information on similarity search parameters, refer to ​Basic ANN Search.​

    +

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/dense-vector.json b/localization/v2.5.x/site/id/userGuide/schema/dense-vector.json new file mode 100644 index 000000000..09afaf1e3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/dense-vector.json @@ -0,0 +1 @@ +{"codeList":["[​\n -0.013052909,​\n 0.020387933,​\n -0.007869,​\n -0.11111383,​\n -0.030188112,​\n -0.0053388323,​\n 0.0010654867,​\n 0.072027855,​\n // ... more dimensions​\n]​\n​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=4)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(4)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"dense_vector\",​\n data_type: DataType.FloatVector,​\n dim: 128,​\n});​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"dense_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 4​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"dense_vector\",​\n index_name=\"dense_vector_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"dense_vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n index_name: 'dense_vector_index',​\n field_name: 'dense_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.IVF_FLAT,​\n params: {​\n nlist: 128​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_vector_index\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_dense_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_dense_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.7]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.8]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_dense_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.1, 0.2, 0.3, 0.4]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.2, 0.3, 0.4, 0.5]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { dense_vector: [0.1, 0.2, 0.3, 0.7] },​\n { dense_vector: [0.2, 0.3, 0.4, 0.8] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_dense_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.4]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.5]} ​\n ],​\n \"collectionName\": \"my_dense_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572531\",\"453577185629572532\"]}}​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_vector = [0.1, 0.2, 0.3, 0.7]​\n​\nres = client.search(​\n collection_name=\"my_dense_collection\",​\n data=[query_vector],​\n anns_field=\"dense_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"dense_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​\n\n","query_vector = [0.1, 0.2, 0.3, 0.7];​\n​\nclient.search({​\n collection_name: my_dense_collection,​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dense_collection\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.7]​\n ],​\n \"annsField\": \"dense_vector\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.55,\"id\":\"453577185629572532\",\"pk\":\"453577185629572532\"},{\"distance\":0.42,\"id\":\"453577185629572531\",\"pk\":\"453577185629572531\"}]}​\n\n"],"headingContent":"Dense Vector​","anchorList":[{"label":"Vektor Padat","href":"Dense-Vector​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menggunakan vektor padat di Milvus","href":"Use-dense-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/dense-vector.md b/localization/v2.5.x/site/id/userGuide/schema/dense-vector.md new file mode 100644 index 000000000..181af76e0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/dense-vector.md @@ -0,0 +1,434 @@ +--- +id: dense-vector.md +title: Vektor Padat +summary: >- + Vektor padat adalah representasi data numerik yang banyak digunakan dalam + pembelajaran mesin dan analisis data. Vektor padat terdiri dari larik dengan + bilangan real, di mana sebagian besar atau semua elemennya bukan nol. + Dibandingkan dengan vektor jarang, vektor padat mengandung lebih banyak + informasi pada tingkat dimensi yang sama, karena setiap dimensi memiliki nilai + yang berarti. Representasi ini dapat secara efektif menangkap pola dan + hubungan yang kompleks, membuat data lebih mudah dianalisis dan diproses dalam + ruang dimensi tinggi. Vektor padat biasanya memiliki jumlah dimensi yang + tetap, mulai dari beberapa lusin hingga beberapa ratus atau bahkan ribuan, + tergantung pada aplikasi dan persyaratan tertentu. +--- +

    Vektor Padat

    Vektor padat adalah representasi data numerik yang banyak digunakan dalam pembelajaran mesin dan analisis data. Vektor padat terdiri dari larik dengan bilangan real, di mana sebagian besar atau semua elemennya bukan nol. Dibandingkan dengan vektor jarang, vektor padat mengandung lebih banyak informasi pada tingkat dimensi yang sama, karena setiap dimensi memiliki nilai yang berarti. Representasi ini dapat secara efektif menangkap pola dan hubungan yang kompleks, membuat data lebih mudah dianalisis dan diproses dalam ruang dimensi tinggi. Vektor padat biasanya memiliki jumlah dimensi yang tetap, mulai dari beberapa lusin hingga beberapa ratus atau bahkan ribuan, tergantung pada aplikasi dan persyaratan tertentu.

    +

    Vektor padat terutama digunakan dalam skenario yang membutuhkan pemahaman semantik data, seperti pencarian semantik dan sistem rekomendasi. Dalam pencarian semantik, vektor padat membantu menangkap hubungan yang mendasari antara kueri dan dokumen, sehingga meningkatkan relevansi hasil pencarian. Dalam sistem rekomendasi, vektor padat membantu mengidentifikasi kemiripan antara pengguna dan item, menawarkan saran yang lebih personal.

    +

    Gambaran Umum

    Vektor padat biasanya direpresentasikan sebagai larik angka floating-point dengan panjang tetap, seperti [0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5]. Dimensi vektor ini biasanya berkisar antara ratusan hingga ribuan, seperti 128, 256, 768, atau 1024. Setiap dimensi menangkap fitur semantik tertentu dari suatu objek, sehingga dapat diterapkan pada berbagai skenario melalui perhitungan kemiripan.

    +

    + + Dense vectors in 2D space + Vektor padat dalam ruang 2D

    +

    Gambar di atas mengilustrasikan representasi vektor padat dalam ruang 2D. Meskipun vektor padat dalam aplikasi dunia nyata sering kali memiliki dimensi yang jauh lebih tinggi, ilustrasi 2D ini secara efektif menyampaikan beberapa konsep utama.

    +
      +
    • Representasi Multidimensi: Setiap titik mewakili objek konseptual (seperti Milvus, basis data vektor, sistem pencarian, dll.), dengan posisinya ditentukan oleh nilai dimensinya.

    • +
    • Hubungan Semantik: Jarak antara titik-titik mencerminkan kemiripan semantik antara konsep-konsep. Titik-titik yang lebih dekat menunjukkan konsep-konsep yang lebih terkait secara semantik.

    • +
    • Efek Pengelompokan: Konsep-konsep yang terkait (seperti Milvus, basis data vektor, dan sistem pencarian) diposisikan berdekatan satu sama lain di dalam ruang, membentuk sebuah klaster semantik.

    • +
    +

    Di bawah ini adalah contoh vektor padat nyata yang mewakili teks "Milvus is an efficient vector database".

    +
    [​
    +    -0.013052909,​
    +    0.020387933,​
    +    -0.007869,​
    +    -0.11111383,​
    +    -0.030188112,​
    +    -0.0053388323,​
    +    0.0010654867,​
    +    0.072027855,​
    +    // ... more dimensions​
    +]​
    +​
    +
    +
    +

    Vektor padat dapat dihasilkan dengan menggunakan berbagai model penyematan, seperti model CNN (seperti ResNet, VGG) untuk gambar dan model bahasa (seperti BERT, Word2Vec) untuk teks. Model-model ini mengubah data mentah menjadi titik-titik dalam ruang dimensi tinggi, menangkap fitur semantik data. Selain itu, Milvus menawarkan metode yang mudah digunakan untuk membantu pengguna menghasilkan dan memproses vektor yang padat, seperti yang dijelaskan dalam Embeddings.

    +

    Setelah data menjadi vektor, data tersebut dapat disimpan di Milvus untuk pengelolaan dan pengambilan vektor. Diagram di bawah ini menunjukkan proses dasarnya.

    +

    + + Use dense vecctors in Milvus + Menggunakan vektor padat di Milvus

    +
    +

    Selain vektor padat, Milvus juga mendukung vektor jarang dan vektor biner. Vektor jarang cocok untuk pencocokan yang tepat berdasarkan istilah tertentu, seperti pencarian kata kunci dan pencocokan istilah, sedangkan vektor biner biasanya digunakan untuk menangani data binari secara efisien, seperti pencocokan pola gambar dan aplikasi hashing tertentu. Untuk informasi lebih lanjut, lihat Vektor Biner dan Vektor Jarang.

    +
    +

    Menggunakan vektor padat di Milvus

    Menambahkan bidang vektor

    Untuk menggunakan vektor padat di Milvus, pertama-tama tentukan bidang vektor untuk menyimpan vektor padat saat membuat koleksi. Proses ini meliputi.

    +
      +
    1. Mengatur datatype ke tipe data vektor padat yang didukung. Untuk tipe data vektor padat yang didukung, lihat Tipe Data.

    2. +
    3. Menentukan dimensi vektor padat menggunakan parameter dim.

    4. +
    +

    Pada contoh di bawah ini, kami menambahkan bidang vektor bernama dense_vector untuk menyimpan vektor padat. Tipe data field tersebut adalah FLOAT_VECTOR, dengan dimensi 4.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(4)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "dense_vector",​
    +  data_type: DataType.FloatVector,​
    +  dim: 128,​
    +});​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "dense_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 4​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Tipe data yang didukung untuk bidang vektor padat:

    + + + + + + + + + +
    TipeDeskripsi
    FLOAT_VECTORMenyimpan bilangan floating-point 32-bit, yang biasa digunakan untuk merepresentasikan bilangan riil dalam komputasi ilmiah dan pembelajaran mesin. Ideal untuk skenario yang membutuhkan presisi tinggi, seperti membedakan vektor yang serupa.
    FLOAT16_VECTORMenyimpan angka floating-point setengah presisi 16-bit, digunakan untuk pembelajaran mendalam dan perhitungan GPU. Menghemat ruang penyimpanan dalam skenario di mana presisi tidak terlalu penting, seperti pada fase pemanggilan kembali dengan presisi rendah pada sistem rekomendasi.
    BFLOAT16_VECTORMenyimpan angka Brain Floating Point (bfloat16) 16-bit, menawarkan rentang eksponen yang sama dengan Float32 tetapi dengan presisi yang lebih rendah. Cocok untuk skenario yang perlu memproses vektor dalam jumlah besar dengan cepat, seperti pengambilan gambar berskala besar.
    +

    Tetapkan parameter indeks untuk bidang vektor

    Untuk mempercepat pencarian semantik, indeks harus dibuat untuk bidang vektor. Pengindeksan dapat secara signifikan meningkatkan efisiensi pengambilan data vektor berskala besar.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="dense_vector",​
    +    index_name="dense_vector_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("dense_vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +    index_name: 'dense_vector_index',​
    +    field_name: 'dense_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.IVF_FLAT,​
    +    params: {​
    +      nlist: 128​
    +    },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense_vector",​
    +            "metricType": "IP",​
    +            "indexName": "dense_vector_index",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    Pada contoh di atas, sebuah indeks bernama dense_vector_index dibuat untuk bidang dense_vector menggunakan jenis indeks IVF_FLAT. metric_type disetel ke IP, yang menunjukkan bahwa inner product akan digunakan sebagai metrik jarak.

    +

    Milvus juga mendukung tipe indeks lainnya. Untuk lebih jelasnya, lihat Floating Vector Indexes. Selain itu, Milvus juga mendukung jenis metrik lainnya. Untuk informasi lebih lanjut, lihat Jenis Metrik.

    +

    Membuat koleksi

    Setelah pengaturan vektor padat dan param indeks selesai, Anda dapat membuat koleksi yang berisi vektor padat. Contoh di bawah ini menggunakan metode create_collection untuk membuat koleksi bernama my_dense_collection.

    + +
    client.create_collection(​
    +    collection_name="my_dense_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_dense_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Memasukkan data

    Setelah membuat koleksi, gunakan metode insert untuk menambahkan data yang berisi vektor padat. Pastikan bahwa dimensi vektor padat yang dimasukkan sesuai dengan nilai dim yang ditentukan saat menambahkan bidang vektor padat.

    + +
    data = [​
    +    {"dense_vector": [0.1, 0.2, 0.3, 0.7]},​
    +    {"dense_vector": [0.2, 0.3, 0.4, 0.8]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_dense_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.1, 0.2, 0.3, 0.4]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.2, 0.3, 0.4, 0.5]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { dense_vector: [0.1, 0.2, 0.3, 0.7] },​
    +  { dense_vector: [0.2, 0.3, 0.4, 0.8] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_dense_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"dense_vector": [0.1, 0.2, 0.3, 0.4]},​
    +        {"dense_vector": [0.2, 0.3, 0.4, 0.5]}        ​
    +    ],​
    +    "collectionName": "my_dense_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572531","453577185629572532"]}}​
    +
    +
    +

    Lakukan pencarian kemiripan

    Pencarian semantik berdasarkan vektor padat adalah salah satu fitur inti Milvus, memungkinkan Anda untuk dengan cepat menemukan data yang paling mirip dengan vektor kueri berdasarkan jarak antar vektor. Untuk melakukan pencarian kemiripan, siapkan vektor kueri dan parameter pencarian, lalu panggil metode search.

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_vector = [0.1, 0.2, 0.3, 0.7]​
    +​
    +res = client.search(​
    +    collection_name="my_dense_collection",​
    +    data=[query_vector],​
    +    anns_field="dense_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("dense_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​
    +
    +
    +
    query_vector = [0.1, 0.2, 0.3, 0.7];​
    +​
    +client.search({​
    +    collection_name: my_dense_collection,​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dense_collection",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.7]​
    +    ],​
    +    "annsField": "dense_vector",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.55,"id":"453577185629572532","pk":"453577185629572532"},{"distance":0.42,"id":"453577185629572531","pk":"453577185629572531"}]}​
    +
    +
    +

    Untuk informasi lebih lanjut tentang parameter pencarian kemiripan, lihat Pencarian ANN Dasar.

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.json b/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.json new file mode 100644 index 000000000..31810ce3e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient= MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.create_collection(​\n collection_name=\"my_dynamic_collection\",​\n dimension=5,​\n # highlight-next-line​\n enable_dynamic_field=True​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .dimension(5)​\n // highlight-next-line​\n .enableDynamicField(true)​\n .build()​\nclient.createCollection(createCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new Client({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: \"customized_setup_2\",​\n schema: schema,​\n // highlight-next-line​\n enable_dynamic_field: true​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"dimension\": 5,​\n \"enableDynamicField\": true​\n}'​\n\n","[​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n\n","data=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"my_dynamic_collection\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n ​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"my_dynamic_collection\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_dynamic_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\"',​\n output_fields=[\"color\"]​\n # highlight-end​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(queryVector))​\n .outputFields(Collections.singletonList(\"color\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .topK(5)​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​\n​\n\n","const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: \"color like \\\"red%\\\"\",​\n output_fields: [\"color\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"distance\":0.6290165,\"id\":1},{\"color\":\"red_4794\",\"distance\":0.5975797,\"id\":4},{\"color\":\"red_9392\",\"distance\":-0.24996185,\"id\":6}]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Dynamic Field​","anchorList":[{"label":"Bidang Dinamis","href":"Dynamic-Field​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Mengaktifkan bidang dinamis","href":"Enable-dynamic-field​","type":2,"isActive":false},{"label":"Menggunakan bidang dinamis","href":"Use-dynamic-field​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.md b/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.md new file mode 100644 index 000000000..fae181b65 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/enable-dynamic-field.md @@ -0,0 +1,382 @@ +--- +id: enable-dynamic-field.md +title: Aktifkan Bidang Dinamis +summary: >- + Semua field yang didefinisikan dalam skema koleksi harus disertakan dalam + entitas yang akan disisipkan. Jika Anda ingin beberapa bidang menjadi + opsional, pertimbangkan untuk mengaktifkan bidang dinamis. Topik ini + menjelaskan cara mengaktifkan dan menggunakan bidang dinamis. +--- +

    Bidang Dinamis

    Semua field yang didefinisikan dalam skema koleksi harus disertakan dalam entitas yang akan disisipkan. Jika Anda ingin beberapa bidang menjadi opsional, pertimbangkan untuk mengaktifkan bidang dinamis. Topik ini menjelaskan cara mengaktifkan dan menggunakan bidang dinamis.

    +

    Gambaran Umum

    Di Milvus, Anda dapat membuat skema koleksi dengan mengatur nama dan tipe data untuk setiap field di dalam koleksi. Ketika Anda menambahkan field ke dalam skema, pastikan bahwa field tersebut sudah termasuk dalam entitas yang ingin Anda masukkan. Jika Anda ingin beberapa field menjadi opsional, mengaktifkan field dinamis adalah salah satu pilihan.

    +

    Bidang dinamis adalah bidang yang dicadangkan bernama $meta, yang bertipe JavaScript Object Notation (JSON). Setiap field dalam entitas yang tidak didefinisikan dalam skema akan disimpan dalam field JSON yang dicadangkan ini sebagai pasangan kunci-nilai.

    +

    Untuk koleksi dengan bidang dinamis yang diaktifkan, Anda dapat menggunakan kunci dalam bidang dinamis untuk pemfilteran skalar, sama seperti yang Anda lakukan dengan bidang yang secara eksplisit didefinisikan dalam skema.

    +

    Mengaktifkan bidang dinamis

    Koleksi yang dibuat menggunakan metode yang dijelaskan di Membuat Koleksi Seketika memiliki bidang dinamis yang diaktifkan secara default. Anda juga dapat mengaktifkan bidang dinamis secara manual ketika membuat koleksi dengan pengaturan khusus.

    + +
    from pymilvus import MilvusClient​
    +​
    +client= MilvusClient(uri="http://localhost:19530")​
    +​
    +client.create_collection(​
    +    collection_name="my_dynamic_collection",​
    +    dimension=5,​
    +    # highlight-next-line​
    +    enable_dynamic_field=True​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +    .collectionName("my_dynamic_collection")​
    +    .dimension(5)​
    +    // highlight-next-line​
    +    .enableDynamicField(true)​
    +    .build()​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new Client({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    enable_dynamic_field: true​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "dimension": 5,​
    +    "enableDynamicField": true​
    +}'​
    +
    +
    +

    Menggunakan bidang dinamis

    Ketika bidang dinamis diaktifkan di dalam koleksi Anda, semua bidang dan nilainya yang tidak didefinisikan di dalam skema akan disimpan sebagai pasangan nilai-kunci di dalam bidang dinamis.

    +

    Sebagai contoh, misalkan skema koleksi Anda hanya mendefinisikan dua field, bernama id dan vector, dengan field dinamis diaktifkan. Sekarang, masukkan kumpulan data berikut ke dalam koleksi ini.

    +
    [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +
    +
    +

    Kumpulan data di atas berisi 10 entitas, masing-masing termasuk bidang id, vector, dan color. Di sini, bidang color tidak didefinisikan dalam skema. Karena koleksi ini memiliki bidang dinamis yang diaktifkan, bidang color akan disimpan sebagai pasangan nilai-kunci di dalam bidang dinamis.

    +

    Menyisipkan data

    Kode berikut ini menunjukkan cara memasukkan kumpulan data ke dalam koleksi.

    + +
    data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="my_dynamic_collection",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +   ​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "my_dynamic_collection"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Kueri dan pencarian dengan bidang dinamis

    Milvus mendukung penggunaan ekspresi filter selama kueri dan pencarian, sehingga Anda dapat menentukan bidang mana yang akan disertakan dalam hasil. Contoh berikut ini menunjukkan cara melakukan kueri dan pencarian menggunakan bidang color, yang tidak didefinisikan dalam skema, dengan menggunakan bidang dinamis.

    + +
    query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_dynamic_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%"',​
    +    output_fields=["color"]​
    +    # highlight-end​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(queryVector))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .filter("color like \"red%\"")​
    +        .topK(5)​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​
    +​
    +
    +
    +
    const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: "color like \"red%\"",​
    +    output_fields: ["color"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"color":"red_7025","distance":0.6290165,"id":1},{"color":"red_4794","distance":0.5975797,"id":4},{"color":"red_9392","distance":-0.24996185,"id":6}]}​
    +
    +
    +

    Pada ekspresi filter yang digunakan pada contoh kode di atas, color like "red%" and likes > 50, ketentuannya menetapkan bahwa nilai bidang color harus dimulai dengan "merah". Pada contoh data, hanya ada dua entitas yang memenuhi kondisi ini. Dengan demikian, ketika limit (topK) disetel ke 3 atau kurang, kedua entitas ini akan dikembalikan.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.json b/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.json new file mode 100644 index 000000000..a6f711f41 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri='http://localhost:19530')​\n​\n# Define collection schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, nullable=True) # Nullable field​\n​\n# Set index params​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\n# Create collection​\nclient.create_collection(collection_name=\"user_profiles_null\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .isNullable(true)​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_null\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.Int64, dim: 5 },​\n​\n { name: \"age\", data_type: DataType.FloatVector, nullable: true },​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.AUTOINDEX,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport nullField='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"nullable\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $nullField​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_null\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": None},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}​\n]​\n​\nclient.insert(collection_name=\"user_profiles_null\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6], \\\"age\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​\n { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​\n { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_null\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]} ​\n ],​\n \"collectionName\": \"user_profiles_null\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_null\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n limit=2,​\n search_params={\"params\": {\"nprobe\": 16}},​\n output_fields=[\"id\", \"age\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .topK(2)​\n .searchParams(params)​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​\n\n","client.search({​\n collection_name: 'user_profiles_null',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id'],​\n filter: '25 <= age <= 35',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"data\": [​\n [0.1, -0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n#{\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"distance\":0.16000001,\"id\":1},{\"age\":null,\"distance\":0.28999996,\"id\":2},{\"age\":null,\"distance\":0.52000004,\"id\":3}]}​\n\n","# Reviewing previously inserted data:​\n# {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30}​\n# {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129], \"age\": None}​\n# {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": None} # Omitted age column is treated as None​\n​\nresults = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"age >= 0\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [​\n# {\"id\": 1, \"age\": 30}​\n# ]​\n# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"age >= 0\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=1, age=30})]​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"age >= 0\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"filter\": \"age >= 0\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1}]}​\n\n","null_results = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [{\"id\": 2, \"age\": None}, {\"id\": 3, \"age\": None}]​\n\n","QueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .limit(10)​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"expr\": \"\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1},{\"age\":null,\"id\":2},{\"age\":null,\"id\":3}]}​\n\n","schema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, default_value=18)​\nschema.add_field(field_name=\"status\", datatype=DataType.VARCHAR, default_value=\"active\", max_length=10)​\n​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\nclient.create_collection(collection_name=\"user_profiles_default\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .defaultValue(18L)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"status\")​\n .dataType(DataType.VarChar)​\n .maxLength(10)​\n .defaultValue(\"active\")​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_default\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.FloatVector, dim: 5 },​\n { name: \"age\", data_type: DataType.Int64, default_value: 18 },​\n { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.IVF_FLAT,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport defaultValueField1='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"defaultValue\": 18​\n}'​\n​\nexport defaultValueField2='{​\n \"fieldName\": \"status\",​\n \"dataType\": \"VarChar\",​\n \"defaultValue\": \"active\",​\n \"elementTypeParams\": {​\n \"max_length\": 10​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $defaultValueField1,​\n $defaultValueField2​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_default\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129]},\n {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": 25, \"status\": None}, \n {\"id\": 4, \"vector\": [0.4, 0.5, ..., 0.131], \"age\": None, \"status\": \"inactive\"} \n]​\n​\nclient.insert(collection_name=\"user_profiles_default\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30, \\\"status\\\": \\\"premium\\\"}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7], \\\"age\\\": 25, \\\"status\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4, 0.5, 0.6, 0.7, 0.8], \\\"age\\\": null, \\\"status\\\": \\\"inactive\\\"}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_default\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n ],​\n \"collectionName\": \"user_profiles_default\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_default\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n search_params={\"params\": {\"nprobe\": 16}},​\n filter=\"age == 18\", # 18 is the default value of the `age` field​\n limit=10,​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .searchParams(params)​\n .filter(\"age == 18\")​\n .topK(10)​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​\n\n","client.search({​\n collection_name: 'user_profiles_default',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id', 'status'],​\n filter: 'age == 18',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"distance\":0.050000004,\"id\":2,\"status\":\"active\"},{\"age\":18,\"distance\":0.45000002,\"id\":4,\"status\":\"inactive\"}]}​\n\n","# Query all entities where `age` equals the default value (18)​\ndefault_age_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter=\"age == 18\",​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\n# Query all entities where `status` equals the default value (\"active\")​\ndefault_status_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter='status == \"active\"',​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp ageResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"age == 18\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(ageResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​\n​\nQueryResp statusResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"status == \\\"active\\\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(statusResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​\n\n","// Query all entities where `age` equals the default value (18)​\nconst default_age_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: \"age == 18\",​\n output_fields: [\"id\", \"age\", \"status\"]​\n);​\n// Query all entities where `status` equals the default value (\"active\")​\nconst default_status_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: 'status == \"active\"',​\n output_fields: [\"id\", \"age\", \"status\"]​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":18,\"id\":4,\"status\":\"inactive\"}]}​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"status == \\\"active\\\"\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":25,\"id\":3,\"status\":\"active\"}]}​\n\n"],"headingContent":"Nullable & Default​","anchorList":[{"label":"Dapat dinolkan & Default","href":"Nullable--Default​","type":1,"isActive":false},{"label":"Batas","href":"Limits","type":2,"isActive":false},{"label":"Atribut yang dapat dinolkan","href":"Nullable-attribute","type":2,"isActive":false},{"label":"Nilai default","href":"Default-values​","type":2,"isActive":false},{"label":"Aturan yang berlaku","href":"Applicable-rules","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.md b/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.md new file mode 100644 index 000000000..c4bb0618f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/nullable-and-default.md @@ -0,0 +1,878 @@ +--- +id: nullable-and-default.md +title: Dapat dinolkan & Default +related_key: 'nullable, default' +summary: >- + Milvus memungkinkan Anda untuk mengatur atribut `nullable` dan nilai default + untuk field skalar, kecuali field utama. Untuk field yang ditandai sebagai + nullable=True, Anda dapat melewatkan field tersebut ketika memasukkan data, + atau mengaturnya secara langsung ke nilai nol, dan sistem akan + memperlakukannya sebagai nol tanpa menyebabkan kesalahan. +--- +

    Dapat dinolkan & Default

    Milvus memungkinkan Anda untuk mengatur atribut nullable dan nilai default untuk field skalar, kecuali field utama. Untuk field yang ditandai sebagai nullable=True, Anda dapat melewatkan field tersebut ketika memasukkan data, atau mengaturnya secara langsung ke nilai nol, dan sistem akan memperlakukannya sebagai nilai nol tanpa menyebabkan kesalahan. Ketika sebuah field memiliki nilai default, sistem akan secara otomatis menerapkan nilai ini jika tidak ada data yang ditentukan untuk field tersebut selama penyisipan.

    +

    Nilai default dan atribut yang dapat dinolkan menyederhanakan migrasi data dari sistem basis data lain ke Milvus dengan mengizinkan penanganan kumpulan data dengan nilai nol dan mempertahankan pengaturan nilai default. Ketika membuat koleksi, Anda juga dapat mengaktifkan nullable atau mengatur nilai default untuk field yang nilainya tidak pasti.

    +

    Batas

      +
    • Hanya bidang skalar, tidak termasuk bidang utama, yang mendukung nilai default dan atribut nullable.

    • +
    • Bidang JSON dan Array tidak mendukung nilai default.

    • +
    • Nilai default atau atribut nullable hanya dapat dikonfigurasikan selama pembuatan koleksi dan tidak dapat dimodifikasi setelahnya.

    • +
    • Bidang skalar dengan atribut nullable yang diaktifkan tidak dapat digunakan sebagai group_by_field di Pencarian Pengelompokan. Untuk informasi lebih lanjut tentang pengelompokan pencarian, lihat Mengelompokkan Pencarian.

    • +
    • Bidang yang ditandai sebagai nullable tidak dapat digunakan sebagai kunci partisi. Untuk informasi lebih lanjut tentang kunci partisi, lihat Menggunakan Kunci Partisi.

    • +
    • Saat membuat indeks pada bidang skalar dengan atribut nullable diaktifkan, nilai nol akan dikecualikan dari indeks.

    • +
    +

    Atribut yang dapat dinolkan

    Atribut nullable memungkinkan Anda menyimpan nilai null dalam koleksi, sehingga memberikan fleksibilitas saat menangani data yang tidak diketahui.

    +

    Mengatur atribut yang dapat dinolkan

    Saat membuat koleksi, gunakan nullable=True untuk menetapkan bidang yang dapat dinullkan (defaultnya adalah False). Contoh berikut ini membuat koleksi bernama user_profiles_null dan menetapkan bidang age sebagai nullable.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri='http://localhost:19530')​
    +​
    +# Define collection schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True) # Nullable field​
    +​
    +# Set index params​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +# Create collection​
    +client.create_collection(collection_name="user_profiles_null", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .isNullable(true)​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_null",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.Int64, dim: 5 },​
    +​
    +    { name: "age", data_type: DataType.FloatVector, nullable: true },​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.AUTOINDEX,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export nullField='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "nullable": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $nullField​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_null\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan entitas

    Ketika Anda memasukkan data ke dalam bidang yang dapat dinullkan, masukkan null atau hilangkan bidang ini secara langsung.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": None},​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]}​
    +]​
    +​
    +client.insert(collection_name="user_profiles_null", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​
    +  { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​
    +  { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_null",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": null}, ​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]} ​
    +    ],​
    +    "collectionName": "user_profiles_null"​
    +}'​
    +
    +
    +

    Penelusuran dan kueri dengan nilai null

    Saat menggunakan metode search, jika sebuah bidang berisi nilai null, hasil pencarian akan mengembalikan bidang tersebut sebagai null.

    + +
    res = client.search(​
    +    collection_name="user_profiles_null",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    limit=2,​
    +    search_params={"params": {"nprobe": 16}},​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .topK(2)​
    +        .searchParams(params)​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_null',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id'],​
    +    filter: '25 <= age <= 35',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "data": [​
    +        [0.1, -0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +#{"code":0,"cost":0,"data":[{"age":30,"distance":0.16000001,"id":1},{"age":null,"distance":0.28999996,"id":2},{"age":null,"distance":0.52000004,"id":3}]}​
    +
    +
    +

    Ketika Anda menggunakan metode query untuk pemfilteran skalar, hasil pemfilteran untuk nilai null akan bernilai salah, yang mengindikasikan bahwa nilai tersebut tidak akan dipilih.

    + +
    # Reviewing previously inserted data:​
    +# {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30}​
    +# {"id": 2, "vector": [0.2, 0.3, ..., 0.129], "age": None}​
    +# {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": None}  # Omitted age  column is treated as None​
    +​
    +results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="age >= 0",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [​
    +#     {"id": 1, "age": 30}​
    +# ]​
    +# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("age >= 0")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=1, age=30})]​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "age >= 0",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "filter": "age >= 0",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1}]}​
    +
    +
    +

    Untuk meng-query entitas dengan nilai null, gunakan ekspresi kosong "".

    + +
    null_results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [{"id": 2, "age": None}, {"id": 3, "age": None}]​
    +
    +
    +
    QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .limit(10)​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "expr": "",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1},{"age":null,"id":2},{"age":null,"id":3}]}​
    +
    +
    +

    Nilai default

    Nilai default adalah nilai yang telah ditetapkan sebelumnya yang ditetapkan ke bidang skalar. Jika Anda tidak memberikan nilai untuk bidang dengan nilai default selama penyisipan, sistem secara otomatis menggunakan nilai default.

    +

    Mengatur nilai default

    Saat membuat koleksi, gunakan parameter default_value untuk menentukan nilai default untuk suatu bidang. Contoh berikut ini menunjukkan cara menetapkan nilai default dari age menjadi 18 dan status menjadi "active".

    + +
    schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)​
    +schema.add_field(field_name="status", datatype=DataType.VARCHAR, default_value="active", max_length=10)​
    +​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +client.create_collection(collection_name="user_profiles_default", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .defaultValue(18L)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("status")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(10)​
    +        .defaultValue("active")​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_default",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.FloatVector, dim: 5 },​
    +    { name: "age", data_type: DataType.Int64, default_value: 18 },​
    +    { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.IVF_FLAT,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export defaultValueField1='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "defaultValue": 18​
    +}'​
    +​
    +export defaultValueField2='{​
    +    "fieldName": "status",​
    +    "dataType": "VarChar",​
    +    "defaultValue": "active",​
    +    "elementTypeParams": {​
    +        "max_length": 10​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $defaultValueField1,​
    +        $defaultValueField2​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_default\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan entitas

    Saat memasukkan data, jika Anda menghilangkan bidang dengan nilai default atau mengatur nilainya menjadi nol, sistem akan menggunakan nilai default.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, ..., 0.129]},
    +    {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": 25, "status": None}, 
    +    {"id": 4, "vector": [0.4, 0.5, ..., 0.131], "age": None, "status": "inactive"} 
    +]​
    +​
    +client.insert(collection_name="user_profiles_default", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +    {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}  ​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_default",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]},​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +        {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}      ​
    +    ],​
    +    "collectionName": "user_profiles_default"​
    +}'​
    +
    +
    +
    +

    Untuk informasi lebih lanjut tentang bagaimana pengaturan nilai nol dan nilai default berlaku, lihat Aturan yang berlaku.

    +
    +

    Pencarian dan kueri dengan nilai default

    Entitas yang berisi nilai default diperlakukan sama seperti entitas lain selama pencarian vektor dan pemfilteran skalar. Anda dapat menyertakan nilai default sebagai bagian dari operasi search dan query.

    +

    Sebagai contoh, dalam operasi search, entitas dengan age yang disetel ke nilai default 18 akan disertakan dalam hasil.

    + +
    res = client.search(​
    +    collection_name="user_profiles_default",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    search_params={"params": {"nprobe": 16}},​
    +    filter="age == 18",  # 18 is the default value of the `age` field​
    +    limit=10,​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .searchParams(params)​
    +        .filter("age == 18")​
    +        .topK(10)​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_default',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id', 'status'],​
    +    filter: 'age == 18',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"distance":0.050000004,"id":2,"status":"active"},{"age":18,"distance":0.45000002,"id":4,"status":"inactive"}]}​
    +
    +
    +

    Dalam operasi query, Anda dapat mencocokkan atau memfilter dengan nilai default secara langsung.

    + +
    # Query all entities where `age` equals the default value (18)​
    +default_age_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter="age == 18",​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +# Query all entities where `status` equals the default value ("active")​
    +default_status_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter='status == "active"',​
    +    output_fields=["id", "age", "status"]​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp ageResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("age == 18")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(ageResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​
    +​
    +QueryResp statusResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("status == \"active\"")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(statusResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​
    +
    +
    +
    // Query all entities where `age` equals the default value (18)​
    +const default_age_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: "age == 18",​
    +    output_fields: ["id", "age", "status"]​
    +);​
    +// Query all entities where `status` equals the default value ("active")​
    +const default_status_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: 'status == "active"',​
    +    output_fields: ["id", "age", "status"]​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":18,"id":4,"status":"inactive"}]}​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "status == \"active\"",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":25,"id":3,"status":"active"}]}​
    +
    +
    +

    Aturan yang berlaku

    Tabel berikut ini merangkum perilaku kolom yang dapat dinolkan dan nilai default di bawah kombinasi konfigurasi yang berbeda. Aturan-aturan ini menentukan bagaimana Milvus menangani data ketika mencoba memasukkan nilai null atau jika nilai kolom tidak disediakan.

    + + + + + + + + + + + +
    NullableNilai DefaultTipe Nilai DefaultMasukan PenggunaHasilContoh
    Tidak ada/nullTidak ada/nullMenggunakan nilai default
    • Bidang: age
    • Nilai default: 18
    • Masukan pengguna: null
    • Hasil: disimpan sebagai 18
    -Tidak ada/nullDisimpan sebagai null
    • Bidang:
    • middle_name
    • Nilai default: -
    • Masukan
    • pengguna
    • : null
    • Hasil: disimpan sebagai null
    Bukan nullTidak ada/nullMenggunakan nilai default
    • Bidang:
    • status
    • Nilai default:
    • "active"
    • Masukan pengguna: null
    • Hasil: disimpan sebagai "active"
    -Tidak ada/nullMelemparkan kesalahan
    • Bidang:
    • email
    • Nilai default: -
    • Masukan
    • pengguna
    • : null
    • Hasil: Operasi ditolak, sistem melemparkan kesalahan
    NullTidak ada/nullMelemparkan kesalahan
    • Bidang:
    • username
    • Nilai default: null
    • Masukan
    • pengguna
    • : null
    • Hasil: Operasi ditolak, sistem melemparkan kesalahan
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/number.json b/localization/v2.5.x/site/id/userGuide/schema/number.json new file mode 100644 index 000000000..8adb533b1 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/number.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64)​\nschema.add_field(field_name=\"price\", datatype=DataType.FLOAT)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"price\")​\n .dataType(DataType.Float)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"age\",​\n data_type: DataType.Int64,​\n },​\n {​\n name: \"price\",​\n data_type: DataType.Float,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n​\n\n","export int64Field='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport floatField='{​\n \"fieldName\": \"price\",​\n \"dataType\": \"Float\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $int64Field,​\n $floatField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"age\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"inverted_index\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"age\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n​\n\n","const indexParams = {​\n index_name: 'inverted_index',​\n field_name: 'age',​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","import { IndexType } from \"@zilliz/milvus2-sdk-node\";​\nconst indexParams = [​\n {​\n field_name: \"age\",​\n index_name: \"inverted_index\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n {​\n field_name: \"embedding\",​\n metric_type: \"COSINE\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n];​\n​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_scalar_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_scalar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_scalar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"age\\\": 25, \\\"price\\\": 99.99, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 30, \\\"price\\\": 149.50, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 35, \\\"price\\\": 199.99, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​\n { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​\n { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_scalar_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_scalar_collection\"​\n}'​\n\n","filter = \"30 <= age <= 40\"​\n​\nres = client.query(​\n collection_name=\"my_scalar_collection\",​\n filter=filter,​\n output_fields=[\"age\",\"price\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'age': 30, 'price': np.float32(149.5), 'pk': 2}\", \"{'age': 35, 'price': np.float32(199.99), 'pk': 3}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"30 <= age <= 40\";​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .build());​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: '30 <= age <= 40',​\n output_fields: ['age', 'price']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"filter\": \"30 <= age <= 40\",​\n \"outputFields\": [\"age\",\"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"pk\":2,\"price\":149.5},{\"age\":35,\"pk\":3,\"price\":199.99}]}​\n\n","filter = \"25 <= age <= 35\"​\n​\nres = client.search(​\n collection_name=\"my_scalar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"age\",\"price\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"25 <= age <= 35\";​\n​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_scalar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['age', 'price'],​\n filter: '25 <= age <= 35'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"outputFields\": [\"age\", \"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":35,\"distance\":-0.19054288,\"id\":3,\"price\":199.99},{\"age\":30,\"distance\":-0.20163085,\"id\":2,\"price\":149.5},{\"age\":25,\"distance\":-0.2364331,\"id\":1,\"price\":99.99}]}​\n\n"],"headingContent":"Number Field​","anchorList":[{"label":"Bidang Angka","href":"Number-Field​","type":1,"isActive":false},{"label":"Jenis bidang angka yang didukung","href":"Supported-number-field-types​","type":2,"isActive":false},{"label":"Menambahkan bidang angka","href":"Add-number-field​","type":2,"isActive":false},{"label":"Mengatur parameter indeks","href":"Set-index-params​","type":2,"isActive":false},{"label":"Membuat koleksi","href":"Create-collection​","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data​","type":2,"isActive":false},{"label":"Pencarian dan kueri","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/number.md b/localization/v2.5.x/site/id/userGuide/schema/number.md new file mode 100644 index 000000000..719be5f4e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/number.md @@ -0,0 +1,568 @@ +--- +id: number.md +title: Bidang Angka +related_key: 'number, integer, float, double' +summary: >- + Bidang angka digunakan untuk menyimpan data numerik non-vektor di Milvus. + Bidang ini biasanya digunakan untuk mendeskripsikan informasi tambahan yang + terkait dengan data vektor, seperti usia, harga, dll. Dengan menggunakan data + ini, Anda dapat mendeskripsikan vektor dengan lebih baik dan meningkatkan + efisiensi pemfilteran data dan kueri bersyarat. +--- +

    Bidang Angka

    Bidang angka digunakan untuk menyimpan data numerik non-vektor di Milvus. Field ini biasanya digunakan untuk mendeskripsikan informasi tambahan yang berhubungan dengan data vektor, seperti usia, harga, dll. Dengan menggunakan data ini, Anda dapat mendeskripsikan vektor dengan lebih baik dan meningkatkan efisiensi pemfilteran data dan kueri bersyarat.

    +

    Bidang angka sangat berguna dalam banyak skenario. Misalnya, dalam rekomendasi e-commerce, bidang harga dapat digunakan untuk penyaringan; dalam analisis profil pengguna, rentang usia dapat membantu menyempurnakan hasil. Dikombinasikan dengan data vektor, kolom angka dapat membantu sistem menyediakan pencarian kemiripan sekaligus memenuhi kebutuhan pengguna yang dipersonalisasi dengan lebih tepat.

    +

    Jenis bidang angka yang didukung

    Milvus mendukung berbagai jenis bidang angka untuk memenuhi kebutuhan penyimpanan data dan kueri yang berbeda.

    +

    Jenis

    +

    Deskripsi

    +

    BOOL

    +

    Tipe Boolean untuk menyimpan true atau false, cocok untuk menggambarkan status biner.

    +

    INT8

    +

    Bilangan bulat 8-bit, cocok untuk menyimpan data bilangan bulat dengan rentang kecil.

    +

    INT16

    +

    Bilangan bulat 16-bit, untuk data bilangan bulat jarak menengah.

    +

    INT32

    +

    Bilangan bulat 32-bit, ideal untuk penyimpanan data bilangan bulat umum seperti jumlah produk atau ID pengguna.

    +

    INT64

    +

    Bilangan bulat 64-bit, cocok untuk menyimpan data jarak jauh seperti stempel waktu atau pengenal.

    +

    FLOAT

    +

    Angka floating-point 32-bit, untuk data yang membutuhkan presisi umum, seperti peringkat atau suhu.

    +

    DOUBLE

    +

    Angka floating-point presisi ganda 64-bit, untuk data dengan presisi tinggi seperti informasi keuangan atau perhitungan ilmiah.

    +
    +

    Menambahkan bidang angka

    Untuk menggunakan bidang angka di Milvus, tentukan bidang yang relevan dalam skema koleksi, atur datatype ke jenis yang didukung seperti BOOL atau INT8. Untuk daftar lengkap jenis bidang angka yang didukung, lihat Jenis bidang angka yang didukung.

    +

    Contoh berikut ini menunjukkan cara mendefinisikan skema yang menyertakan bidang angka age dan price.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="age", datatype=DataType.INT64)​
    +schema.add_field(field_name="price", datatype=DataType.FLOAT)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("price")​
    +        .dataType(DataType.Float)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "age",​
    +    data_type: DataType.Int64,​
    +  },​
    +  {​
    +    name: "price",​
    +    data_type: DataType.Float,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export floatField='{​
    +    "fieldName": "price",​
    +    "dataType": "Float"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $int64Field,​
    +        $floatField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +
    +

    Bidang utama dan bidang vektor wajib ada saat Anda membuat koleksi. Field utama mengidentifikasi setiap entitas secara unik, sedangkan field vektor sangat penting untuk pencarian kemiripan. Untuk lebih jelasnya, lihat Bidang Utama & AutoID, Vektor Padat, Vektor Biner, atau Vektor Jarang.

    +
    +

    Mengatur parameter indeks

    Menetapkan parameter indeks untuk bidang angka bersifat opsional, namun dapat meningkatkan efisiensi pencarian secara signifikan.

    +

    Pada contoh berikut, kami membuat AUTOINDEX untuk bidang angka age, yang memungkinkan Milvus secara otomatis membuat indeks yang sesuai berdasarkan tipe data. Untuk informasi lebih lanjut, lihat AUTOINDEX.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="age",​
    +    index_type="AUTOINDEX",​
    +    index_name="inverted_index"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("age")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'inverted_index',​
    +    field_name: 'age',​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Selain AUTOINDEX, Anda dapat menentukan jenis indeks bidang angka lainnya. Untuk jenis indeks yang didukung, lihat Indeks Skalar.

    +

    Selain itu, sebelum membuat koleksi, Anda harus membuat indeks untuk bidang vektor. Dalam contoh ini, kita menggunakan AUTOINDEX untuk menyederhanakan pengaturan indeks vektor.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    import { IndexType } from "@zilliz/milvus2-sdk-node";​
    +const indexParams = [​
    +  {​
    +    field_name: "age",​
    +    index_name: "inverted_index",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +  {​
    +    field_name: "embedding",​
    +    metric_type: "COSINE",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +];​
    +​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Membuat koleksi

    Setelah skema dan indeks ditentukan, Anda dapat membuat koleksi yang menyertakan field angka.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_scalar_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_scalar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan data

    Setelah membuat koleksi, Anda dapat menyisipkan data yang memiliki field angka.

    + +
    data = [​
    +    {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_scalar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​
    +  { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​
    +  { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_scalar_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +        {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +        {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_scalar_collection"​
    +}'​
    +
    +
    +

    Pada contoh ini, kita memasukkan data yang mencakup age, price, pk (field utama), dan representasi vektor (embedding). Untuk memastikan bahwa data yang disisipkan sesuai dengan bidang yang didefinisikan dalam skema, disarankan untuk memeriksa tipe data terlebih dahulu untuk menghindari kesalahan.

    +

    Jika Anda menetapkan enable_dynamic_fields=True ketika mendefinisikan skema, Milvus mengizinkan Anda untuk menyisipkan bidang angka yang tidak didefinisikan sebelumnya. Namun, perlu diingat bahwa hal ini dapat meningkatkan kompleksitas kueri dan manajemen, yang berpotensi mempengaruhi kinerja. Untuk informasi lebih lanjut, lihat Bidang Dinamis.

    +

    Pencarian dan kueri

    Setelah menambahkan bidang angka, Anda dapat menggunakannya untuk pemfilteran dalam operasi pencarian dan kueri untuk mendapatkan hasil pencarian yang lebih tepat.

    +

    Menyaring kueri

    Setelah menambahkan bidang angka, Anda dapat menggunakannya untuk pemfilteran dalam kueri. Misalnya, Anda dapat melakukan kueri untuk semua entitas di mana age berada di antara 30 dan 40.

    + +
    filter = "30 <= age <= 40"​
    +​
    +res = client.query(​
    +    collection_name="my_scalar_collection",​
    +    filter=filter,​
    +    output_fields=["age","price"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'age': 30, 'price': np.float32(149.5), 'pk': 2}", "{'age': 35, 'price': np.float32(199.99), 'pk': 3}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "30 <= age <= 40";​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .build());​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: '30 <= age <= 40',​
    +    output_fields: ['age', 'price']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "filter": "30 <= age <= 40",​
    +    "outputFields": ["age","price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":30,"pk":2,"price":149.5},{"age":35,"pk":3,"price":199.99}]}​
    +
    +
    +

    Ekspresi kueri ini mengembalikan semua entitas yang cocok dan mengeluarkan bidang age dan price. Untuk informasi lebih lanjut tentang kueri penyaringan, lihat Pemfilteran Metadata.

    +

    Pencarian vektor dengan pemfilteran angka

    Selain pemfilteran bidang angka dasar, Anda dapat menggabungkan pencarian kemiripan vektor dengan pemfilteran bidang angka. Sebagai contoh, kode berikut ini menunjukkan cara menambahkan penyaring bidang angka ke pencarian vektor.

    + +
    filter = "25 <= age <= 35"​
    +​
    +res = client.search(​
    +    collection_name="my_scalar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["age","price"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "25 <= age <= 35";​
    +​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_scalar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['age', 'price'],​
    +    filter: '25 <= age <= 35'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "outputFields": ["age", "price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":35,"distance":-0.19054288,"id":3,"price":199.99},{"age":30,"distance":-0.20163085,"id":2,"price":149.5},{"age":25,"distance":-0.2364331,"id":1,"price":99.99}]}​
    +
    +
    +

    Dalam contoh ini, pertama-tama kita mendefinisikan vektor kueri dan menambahkan kondisi filter 25 <= age <= 35 selama pencarian. Hal ini memastikan bahwa hasil pencarian tidak hanya mirip dengan vektor kueri tetapi juga memenuhi rentang usia yang ditentukan. Untuk informasi lebih lanjut, lihat Pemfilteran Metadata.

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/primary-field.json b/localization/v2.5.x/site/id/userGuide/schema/primary-field.json new file mode 100644 index 000000000..ffd45c29d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/primary-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n​\nschema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n // highlight-end​\n .build());​\n);​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"pk\",​\n description: \"ID field\",​\n data_type: DataType.VARCHAR,​\n is_primary_key: true,​\n max_length: 100,​\n },​\n];​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.VARCHAR,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n max_length=512,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.VarChar)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(512)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.VarChar,​\n // highlight-start​\n is_primary_key: true,​\n autoID: true,​\n maxLength: 512​\n // highlight-end​\n});​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ],​\n \\\"params\\\": {​\n \\\"max_length\\\": 512​\n }​\n}\"​\n\n"],"headingContent":"Primary Field & AutoID​","anchorList":[{"label":"Bidang Utama & AutoID","href":"Primary-Field--AutoID​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menggunakan Kunci Primer Int64","href":"Use-Int64-Primary-Keys​","type":2,"isActive":false},{"label":"Menggunakan Kunci Primer VarChar","href":"Use-VarChar-Primary-Keys​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/primary-field.md b/localization/v2.5.x/site/id/userGuide/schema/primary-field.md new file mode 100644 index 000000000..206398715 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/primary-field.md @@ -0,0 +1,196 @@ +--- +id: primary-field.md +title: Bidang Utama & AutoID +summary: >- + Field utama secara unik mengidentifikasi sebuah entitas. Halaman ini + memperkenalkan cara menambahkan field utama dari dua tipe data yang berbeda + dan cara mengaktifkan Milvus untuk mengalokasikan nilai field utama secara + otomatis. +--- +

    Bidang Utama & AutoID

    Field utama mengidentifikasi sebuah entitas secara unik. Halaman ini memperkenalkan cara menambahkan field utama dari dua tipe data yang berbeda dan cara mengaktifkan Milvus untuk mengalokasikan nilai field utama secara otomatis.

    +

    Gambaran Umum

    Dalam sebuah koleksi, kunci utama dari setiap entitas harus unik secara global. Ketika menambahkan field utama, Anda harus secara eksplisit mengatur tipe datanya ke VARCHAR atau INT64. Mengatur tipe data ke INT64 menunjukkan bahwa kunci utama harus berupa bilangan bulat yang mirip dengan 12345; Mengatur tipe data ke VARCHAR menunjukkan bahwa kunci utama harus berupa string yang mirip dengan my_entity_1234.

    +

    Anda juga dapat mengaktifkan AutoID untuk membuat Milvus secara otomatis mengalokasikan kunci primer untuk entitas yang masuk. Setelah Anda mengaktifkan AutoID di koleksi Anda, jangan sertakan kunci primer saat memasukkan entitas.

    +

    Field utama dalam koleksi tidak memiliki nilai default dan tidak boleh bernilai nol.

    +

    Menggunakan Kunci Primer Int64

    Untuk menggunakan kunci primer bertipe Int64, Anda perlu mengatur datatype ke DataType.INT64 dan mengatur is_primary ke true. Jika Anda juga membutuhkan Milvus untuk mengalokasikan kunci primer untuk entitas yang masuk, atur juga auto_id ke true.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +​
    +schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        // highlight-end​
    +        .build());​
    +);​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "pk",​
    +    description: "ID field",​
    +    data_type: DataType.VARCHAR,​
    +    is_primary_key: true,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}"​
    +
    +
    +

    Menggunakan Kunci Primer VarChar

    Untuk menggunakan kunci primer VarChar, selain mengubah nilai parameter data_type menjadi DataType.VARCHAR, Anda juga perlu mengatur parameter max_length untuk field tersebut.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    max_length=512,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(512)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.VarChar,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: true,​
    +    maxLength: 512​
    +    // highlight-end​
    +});​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ],​
    +    \"params\": {​
    +        \"max_length\": 512​
    +    }​
    +}"​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.json b/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.json new file mode 100644 index 000000000..29bf30d8e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\ncollection_name = \"my_collection\"​\n​\n# client = MilvusClient(uri=\"http://localhost:19530\")​\nclient = MilvusClient(uri=\"./milvus_demo.db\")​\n​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n)​\n​\nschema.add_field(field_name=\"article_id\", datatype=DataType.INT64, is_primary=True, description=\"article id\")​\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=200, description=\"article title\")​\nschema.add_field(field_name=\"author_info\", datatype=DataType.JSON, description=\"author information\")​\nschema.add_field(field_name=\"publish_ts\", datatype=DataType.INT32, description=\"publish timestamp\")​\nschema.add_field(field_name=\"image_url\", datatype=DataType.VARCHAR, max_length=500, description=\"image URL\")​\nschema.add_field(field_name=\"image_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"image vector\")​\nschema.add_field(field_name=\"summary\", datatype=DataType.VARCHAR, max_length=1000, description=\"article summary\")​\nschema.add_field(field_name=\"summary_dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"summary dense vector\")​\nschema.add_field(field_name=\"summary_sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR, description=\"summary sparse vector\")​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"image_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_dense_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_sparse_vector\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"publish_ts\",​\n index_type=\"INVERTED\",​\n)​\n\n","client.create_collection(​\n collection_name=collection_name,​\n schema=schema,​\n index_params=index_params,​\n)​\n\n","collection_desc = client.describe_collection(​\n collection_name=collection_name​\n)​\nprint(collection_desc)​\n\n"],"headingContent":"Schema Design Hands-On​","anchorList":[{"label":"Desain Skema Secara Langsung","href":"Schema-Design-Hands-On​","type":1,"isActive":false},{"label":"Contoh: Pencarian Berita","href":"An-Example-News-Search​","type":1,"isActive":false},{"label":"Cara Menerapkan Contoh Skema","href":"How-to-Implement-the-Example-Schema​","type":1,"isActive":false},{"label":"Membuat Skema","href":"Create-Schema​","type":2,"isActive":false},{"label":"Menentukan Indeks","href":"Define-Index​","type":2,"isActive":false},{"label":"Membuat Koleksi","href":"Create-Collection​","type":2,"isActive":false},{"label":"Pertimbangan lain","href":"Other-Considerations​","type":1,"isActive":false},{"label":"Memuat Indeks","href":"Loading-Index​","type":2,"isActive":false},{"label":"Bagaimana Mendefinisikan Model Data Untuk Multi-penyewaan","href":"How-to-Define-Data-Model-For-Multi-tenancy​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.md b/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.md new file mode 100644 index 000000000..fcee71f0a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/schema-hands-on.md @@ -0,0 +1,271 @@ +--- +id: schema-hands-on.md +title: Desain Skema Secara Langsung +summary: >- + Milvus mendukung pendefinisian model data melalui skema koleksi. Koleksi + mengatur data yang tidak terstruktur seperti teks dan gambar, bersama dengan + representasi vektornya, termasuk vektor padat dan vektor jarang dalam berbagai + presisi yang digunakan untuk pencarian semantik. Selain itu, Milvus mendukung + penyimpanan dan penyaringan tipe data non-vektor yang disebut "Skalar". + Tipe-tipe skalar termasuk BOOL, INT8/16/32/64, FLOAT/DOUBLE, VARCHAR, JSON, + dan Array. +--- +

    Desain Skema Secara Langsung

    Sistem Information Retrieval (IR), yang juga dikenal sebagai pencarian, sangat penting untuk berbagai aplikasi AI seperti Retrieval-augmented generation (RAG), pencarian gambar, dan rekomendasi produk. Langkah pertama dalam mengembangkan sistem IR adalah mendesain model data, yang melibatkan analisis kebutuhan bisnis, menentukan cara mengatur informasi, dan mengindeks data agar dapat dicari secara semantik.

    +

    Milvus mendukung pendefinisian model data melalui skema koleksi. Koleksi mengatur data yang tidak terstruktur seperti teks dan gambar, bersama dengan representasi vektornya, termasuk vektor padat dan vektor jarang dalam berbagai presisi yang digunakan untuk pencarian semantik. Selain itu, Milvus mendukung penyimpanan dan penyaringan tipe data non-vektor yang disebut "Skalar". Tipe-tipe skalar termasuk BOOL, INT8/16/32/64, FLOAT/DOUBLE, VARCHAR, JSON, dan Array.

    +

    + + Example data schema designed for searching news article + Contoh skema data yang dirancang untuk mencari artikel berita

    +

    Desain model data dari sistem pencarian melibatkan analisis kebutuhan bisnis dan abstraksi informasi ke dalam model data yang diekspresikan dengan skema. Misalnya, untuk mencari sebuah teks, teks tersebut harus "diindeks" dengan mengubah string literal menjadi vektor melalui "penyematan", sehingga memungkinkan pencarian vektor. Di luar persyaratan dasar ini, mungkin perlu untuk menyimpan properti lain seperti stempel waktu publikasi dan penulis. Metadata ini memungkinkan pencarian semantik disempurnakan melalui penyaringan, sehingga hanya menampilkan teks yang diterbitkan setelah tanggal tertentu atau oleh pengarang tertentu. Metadata ini mungkin juga perlu diambil bersama dengan teks utama, untuk menampilkan hasil pencarian dalam aplikasi. Untuk mengatur potongan-potongan teks ini, masing-masing harus diberi pengenal unik, yang dinyatakan sebagai bilangan bulat atau string. Elemen-elemen ini sangat penting untuk mencapai logika pencarian yang canggih.

    +

    Skema yang dirancang dengan baik sangat penting karena skema ini mengabstraksikan model data dan memutuskan apakah tujuan bisnis dapat dicapai melalui pencarian. Selain itu, karena setiap baris data yang dimasukkan ke dalam koleksi harus mengikuti skema, hal ini sangat membantu untuk menjaga konsistensi data dan kualitas jangka panjang. Dari perspektif teknis, skema yang terdefinisi dengan baik akan menghasilkan penyimpanan data kolom yang terorganisir dengan baik dan struktur indeks yang lebih bersih, yang dapat meningkatkan kinerja pencarian.

    +

    Contoh: Pencarian Berita

    Katakanlah kita ingin membangun pencarian untuk situs web berita dan kita memiliki korpus berita dengan teks, gambar mini, dan metadata lainnya. Pertama, kita perlu menganalisis bagaimana kita ingin memanfaatkan data tersebut untuk mendukung kebutuhan bisnis pencarian. Bayangkan kebutuhannya adalah mengambil berita berdasarkan gambar thumbnail dan ringkasan konten, dan mengambil metadata seperti info penulis dan waktu penerbitan sebagai kriteria untuk memfilter hasil pencarian. Persyaratan ini dapat dibagi lagi menjadi beberapa bagian.

    +
      +
    • Untuk mencari gambar melalui teks, kita dapat menyematkan gambar ke dalam vektor melalui model penyematan multimodal yang dapat memetakan data teks dan gambar ke dalam ruang laten yang sama.

    • +
    • Teks ringkasan artikel disematkan ke dalam vektor melalui model penyematan teks.

    • +
    • Untuk memfilter berdasarkan waktu penerbitan, tanggal disimpan sebagai bidang skalar dan indeks diperlukan untuk bidang skalar untuk penyaringan yang efisien. Struktur data lain yang lebih kompleks seperti JSON dapat disimpan dalam bentuk skalar dan pencarian yang difilter dilakukan pada isinya (pengindeksan JSON adalah fitur yang akan datang).

    • +
    • Untuk mengambil byte thumbnail gambar dan merendernya pada halaman hasil pencarian, url gambar juga disimpan. Demikian pula untuk teks ringkasan dan judul. (Sebagai alternatif, kita dapat menyimpan data file teks dan gambar mentah sebagai bidang skalar jika diperlukan).

    • +
    • Untuk meningkatkan hasil pencarian pada teks ringkasan, kami merancang pendekatan pencarian hybrid. Untuk satu jalur pencarian, kami menggunakan model penyisipan biasa untuk menghasilkan vektor padat dari teks, seperti text-embedding-3-large milik OpenAI atau sumber terbuka bge-large-en-v1.5. Model-model ini bagus dalam merepresentasikan keseluruhan semantik teks. Cara lainnya adalah dengan menggunakan model penyematan jarang seperti BM25 atau SPLADE untuk menghasilkan vektor yang jarang, menyerupai pencarian teks lengkap yang baik dalam memahami detail dan konsep individual dalam teks. Milvus mendukung penggunaan keduanya dalam pengumpulan data yang sama berkat fitur multi-vektornya. Pencarian pada beberapa vektor dapat dilakukan dalam satu operasi hybrid_search().

    • +
    • Terakhir, kita juga membutuhkan kolom ID untuk mengidentifikasi setiap halaman berita, yang secara resmi disebut sebagai "entitas" dalam terminologi Milvus. Bidang ini digunakan sebagai kunci utama (atau disingkat "pk").

    • +
    +

    Nama Field

    +

    article_id (Kunci Utama)

    +

    judul

    +

    author_info

    +

    publish_ts

    +

    image_url

    +

    image_vector

    +

    ringkasan

    +

    ringkasan_vektor_padat

    +

    ringkasan_ringkasan_jarang_vektor

    +

    Tipe

    +

    INT64

    +

    VARCHAR

    +

    JSON

    +

    INT32

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    VEKTOR FLOAT_JARANG

    +

    Indeks Kebutuhan

    +

    N

    +

    N

    +

    N (Dukungan segera hadir)

    +

    Y

    +

    N

    +

    Y

    +

    N

    +

    Y

    +

    Y

    +
    +

    Cara Menerapkan Contoh Skema

    Membuat Skema

    Pertama, kita membuat instance klien Milvus, yang dapat digunakan untuk terhubung ke server Milvus dan mengelola koleksi dan data.

    +

    Untuk menyiapkan skema, kita menggunakan create_schema() untuk membuat objek skema dan add_field() untuk menambahkan field ke skema.

    +
    from pymilvus import MilvusClient, DataType​
    +​
    +collection_name = "my_collection"​
    +​
    +# client = MilvusClient(uri="http://localhost:19530")​
    +client = MilvusClient(uri="./milvus_demo.db")​
    +​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +)​
    +​
    +schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, description="article id")​
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200, description="article title")​
    +schema.add_field(field_name="author_info", datatype=DataType.JSON, description="author information")​
    +schema.add_field(field_name="publish_ts", datatype=DataType.INT32, description="publish timestamp")​
    +schema.add_field(field_name="image_url", datatype=DataType.VARCHAR,  max_length=500, description="image URL")​
    +schema.add_field(field_name="image_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="image vector")​
    +schema.add_field(field_name="summary", datatype=DataType.VARCHAR, max_length=1000, description="article summary")​
    +schema.add_field(field_name="summary_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="summary dense vector")​
    +schema.add_field(field_name="summary_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="summary sparse vector")​
    +
    +
    +

    Anda mungkin melihat argumen uri di MilvusClient, yang digunakan untuk menghubungkan ke server Milvus. Anda dapat mengatur argumen sebagai berikut.

    +
      +
    • Jika Anda hanya membutuhkan basis data vektor lokal untuk data skala kecil atau pembuatan prototipe, mengatur uri sebagai file lokal, misalnya./milvus.db, adalah metode yang paling mudah, karena secara otomatis menggunakan Milvus Lite untuk menyimpan semua data dalam file ini.

    • +
    • Jika Anda memiliki data berskala besar, misalnya lebih dari satu juta vektor, Anda dapat menyiapkan server Milvus yang lebih berkinerja tinggi di Docker atau Kubernetes. Dalam pengaturan ini, gunakan alamat dan port server sebagai uri Anda, misalnyahttp://localhost:19530. Jika Anda mengaktifkan fitur autentikasi di Milvus, gunakan "<nama_user Anda>:<kata sandi Anda>" sebagai token, jika tidak, jangan setel token.

    • +
    • Jika Anda menggunakan Zilliz Cloud, layanan cloud yang dikelola sepenuhnya untuk Milvus, sesuaikan uri dan token, yang sesuai dengan Public Endpoint dan API key di Zilliz Cloud.

    • +
    +

    Sedangkan untuk auto_id di MilvusClient.create_schema, AutoID adalah atribut dari bidang utama yang menentukan apakah akan mengaktifkan kenaikan otomatis untuk bidang utama. Karena kami menetapkan fieldarticle_id sebagai kunci utama dan ingin menambahkan id artikel secara manual, kami menetapkan auto_id False untuk menonaktifkan fitur ini.

    +

    Setelah menambahkan semua field ke objek skema, objek skema kita setuju dengan entri pada tabel di atas.

    +

    Menentukan Indeks

    Setelah mendefinisikan skema dengan berbagai bidang, termasuk metadata dan bidang vektor untuk data gambar dan ringkasan, langkah selanjutnya adalah menyiapkan parameter indeks. Pengindeksan sangat penting untuk mengoptimalkan pencarian dan pengambilan vektor, untuk memastikan kinerja kueri yang efisien. Pada bagian berikut, kita akan menentukan parameter indeks untuk bidang vektor dan skalar yang ditentukan dalam koleksi.

    +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="image_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_dense_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_sparse_vector",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="publish_ts",​
    +    index_type="INVERTED",​
    +)​
    +
    +
    +

    Setelah parameter indeks diatur dan diterapkan, Milvus dioptimalkan untuk menangani kueri yang kompleks pada data vektor dan skalar. Pengindeksan ini meningkatkan kinerja dan keakuratan pencarian kemiripan di dalam koleksi, sehingga memungkinkan pengambilan artikel secara efisien berdasarkan vektor gambar dan vektor ringkasan. Dengan memanfaatkan fitur AUTOINDEX untuk vektor padat, fitur SPARSE_INVERTED_INDEX untuk vektor jarang dan INVERTED_INDEX untuk skalar, Milvus dapat dengan cepat mengidentifikasi dan mengembalikan hasil yang paling relevan, sehingga secara signifikan meningkatkan pengalaman pengguna secara keseluruhan dan efektivitas proses pencarian data.

    +

    Ada banyak jenis indeks dan metrik. Untuk informasi lebih lanjut tentang mereka, Anda dapat merujuk ke jenis indeks Milvus dan jenis metrik Milvus.

    +

    Membuat Koleksi

    Dengan skema dan indeks yang telah ditentukan, kita membuat "collection" dengan parameter-parameter tersebut. Koleksi untuk Milvus adalah seperti sebuah tabel untuk DB relasional.

    +
    client.create_collection(​
    +    collection_name=collection_name,​
    +    schema=schema,​
    +    index_params=index_params,​
    +)​
    +
    +
    +

    Kita dapat memverifikasi bahwa koleksi telah berhasil dibuat dengan mendeskripsikan koleksi tersebut.

    +
    collection_desc = client.describe_collection(​
    +    collection_name=collection_name​
    +)​
    +print(collection_desc)​
    +
    +
    +

    Pertimbangan lain

    Memuat Indeks

    Ketika membuat koleksi di Milvus, Anda dapat memilih untuk memuat indeks dengan segera atau menundanya sampai setelah memasukkan beberapa data secara massal. Biasanya, Anda tidak perlu membuat pilihan eksplisit mengenai hal ini, karena contoh di atas menunjukkan bahwa indeks secara otomatis dibuat untuk setiap data yang di-ingest langsung setelah pembuatan koleksi. Hal ini memungkinkan pencarian data yang telah di-entry dapat dilakukan dengan segera. Namun, jika Anda memiliki sisipan massal yang besar setelah pembuatan koleksi dan tidak perlu mencari data apa pun hingga titik tertentu, Anda dapat menunda pembuatan indeks dengan menghilangkan index_params dalam pembuatan koleksi dan membangun indeks dengan memanggil load secara eksplisit setelah meng-insert semua data. Cara ini lebih efisien untuk membangun indeks pada koleksi yang besar, tetapi tidak ada pencarian yang dapat dilakukan sampai memanggil load().

    +

    Bagaimana Mendefinisikan Model Data Untuk Multi-penyewaan

    Konsep beberapa penyewa biasanya digunakan dalam skenario di mana satu aplikasi perangkat lunak atau layanan perlu melayani beberapa pengguna atau organisasi independen, masing-masing dengan lingkungan yang terisolasi. Hal ini sering terlihat pada komputasi awan, aplikasi SaaS (Software as a Service), dan sistem basis data. Sebagai contoh, layanan penyimpanan cloud dapat menggunakan multi-tenancy untuk memungkinkan perusahaan yang berbeda untuk menyimpan dan mengelola data mereka secara terpisah sambil berbagi infrastruktur yang sama. Pendekatan ini memaksimalkan pemanfaatan sumber daya dan efisiensi sambil memastikan keamanan dan privasi data untuk setiap penyewa.

    +

    Cara termudah untuk membedakan penyewa adalah dengan mengisolasi data dan sumber daya mereka satu sama lain. Setiap penyewa memiliki akses eksklusif ke sumber daya tertentu atau berbagi sumber daya dengan yang lain untuk mengelola entitas Milvus seperti basis data, koleksi, dan partisi. Ada metode khusus yang selaras dengan entitas-entitas ini untuk mengimplementasikan multi-tenancy Milvus. Anda dapat merujuk ke halaman multi-tenancy Milvus untuk informasi lebih lanjut.

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/schema.json b/localization/v2.5.x/site/id/userGuide/schema/schema.json new file mode 100644 index 000000000..e3f3426d3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = []​\n\n","export schema='{​\n \"fields\": []​\n}'​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=False,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(false)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n // highlight-start​\n is_primary_key: true,​\n autoID: false​\n // highlight-end​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema='{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}'​\n\n","schema.add_field(​\n field_name=\"my_vector\",​\n datatype=DataType.FLOAT_VECTOR,​\n # highlight-next-line​\n dim=5​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n // highlight-next-line​\n .dimension(5)​\n .build());​\n\n","schema.push({​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n // highlight-next-line​\n dim: 5​\n});​\n\n","export vectorField='{​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_varchar\",​\n datatype=DataType.VARCHAR,​\n # highlight-next-line​\n max_length=512​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n // highlight-next-line​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n // highlight-next-line​\n max_length: 512​\n});​\n\n","export varCharField='{​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 256​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_int64\",​\n datatype=DataType.INT64,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_int64\")​\n .dataType(DataType.Int64)​\n .build());​\n\n","schema.push({​\n name: \"my_int64\",​\n data_type: DataType.Int64,​\n});​\n\n","export int64Field='{​\n \"fieldName\": \"my_int64\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_bool\",​\n datatype=DataType.BOOL,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_bool\")​\n .dataType(DataType.Bool)​\n .build());​\n\n","schema.push({​\n name: \"my_bool\",​\n data_type: DataType.Boolean,​\n});​\n\n","export boolField='{​\n \"fieldName\": \"my_bool\",​\n \"dataType\": \"Boolean\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_json\",​\n datatype=DataType.JSON,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_json\")​\n .dataType(DataType.JSON)​\n .build());​\n\n","schema.push({​\n name: \"my_json\",​\n data_type: DataType.JSON,​\n});​\n\n","export jsonField='{​\n \"fieldName\": \"my_json\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_array\",​\n datatype=DataType.ARRAY,​\n element_type=DataType.VARCHAR,​\n max_capacity=5,​\n max_length=512,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_array\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(5)​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_array\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 5,​\n max_length: 512​\n});​\n\n","export arrayField='{​\n \"fieldName\": \"my_array\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField,​\n $arrayField​\n ]​\n}\"​\n\n"],"headingContent":"Schema Explained​","anchorList":[{"label":"Penjelasan Skema","href":"Schema-Explained​","type":1,"isActive":false},{"label":"Gambaran umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat Skema","href":"Create-Schema​","type":2,"isActive":false},{"label":"Menambahkan Field Utama","href":"Add-Primary-Field​","type":2,"isActive":false},{"label":"Menambahkan Bidang Vektor","href":"Add-Vector-Fields​","type":2,"isActive":false},{"label":"Menambahkan Bidang Skalar","href":"Add-Scalar-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/schema.md b/localization/v2.5.x/site/id/userGuide/schema/schema.md new file mode 100644 index 000000000..1c7c5fdfc --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/schema.md @@ -0,0 +1,453 @@ +--- +id: schema.md +title: Penjelasan Skema +summary: >- + Skema mendefinisikan struktur data koleksi. Sebelum membuat koleksi, Anda + perlu membuat desain skemanya. Halaman ini membantu Anda memahami skema + koleksi dan merancang contoh skema sendiri. +--- +

    Penjelasan Skema

    Skema mendefinisikan struktur data koleksi. Sebelum membuat koleksi, Anda perlu membuat desain skemanya. Halaman ini membantu Anda memahami skema koleksi dan merancang contoh skema sendiri.

    +

    Gambaran umum

    Di Milvus, skema koleksi menyusun sebuah tabel di dalam basis data relasional, yang mendefinisikan bagaimana Milvus mengatur data di dalam koleksi.

    +

    Skema yang dirancang dengan baik sangat penting karena skema ini mengabstraksikan model data dan memutuskan apakah Anda dapat mencapai tujuan bisnis melalui pencarian. Selain itu, karena setiap baris data yang dimasukkan ke dalam koleksi harus mengikuti skema, hal ini membantu menjaga konsistensi data dan kualitas jangka panjang. Dari perspektif teknis, skema yang terdefinisi dengan baik akan menghasilkan penyimpanan data kolom yang terorganisir dengan baik dan struktur indeks yang lebih bersih, sehingga meningkatkan kinerja pencarian.

    +

    Skema koleksi memiliki kunci utama, maksimal empat bidang vektor, dan beberapa bidang skalar. Diagram berikut ini mengilustrasikan cara memetakan artikel ke daftar ruas skema.

    +

    + + Schema design + Rancangan skema

    +

    Desain model data dari sistem pencarian melibatkan analisis kebutuhan bisnis dan abstraksi informasi ke dalam model data yang diekspresikan dengan skema. Misalnya, pencarian sepotong teks harus "diindeks" dengan mengubah string literal menjadi vektor melalui "penyematan" dan memungkinkan pencarian vektor. Di luar persyaratan penting ini, menyimpan properti lain seperti stempel waktu publikasi dan penulis mungkin diperlukan. Metadata ini memungkinkan pencarian semantik disempurnakan melalui penyaringan, yang hanya mengembalikan teks yang diterbitkan setelah tanggal tertentu atau oleh penulis tertentu. Anda juga dapat mengambil skalar ini dengan teks utama untuk merender hasil pencarian dalam aplikasi. Masing-masing harus diberi pengenal unik untuk mengatur potongan-potongan teks ini, yang dinyatakan sebagai bilangan bulat atau string. Elemen-elemen ini sangat penting untuk mencapai logika pencarian yang canggih.

    +

    Lihat Panduan Praktis Desain Skema untuk mengetahui cara membuat skema yang dirancang dengan baik.

    +

    Membuat Skema

    Cuplikan kode berikut ini mendemonstrasikan cara membuat skema.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = []​
    +
    +
    +
    export schema='{​
    +    "fields": []​
    +}'​
    +
    +
    +

    Menambahkan Field Utama

    Bidang utama dalam koleksi mengidentifikasi entitas secara unik. Field ini hanya menerima nilai Int64 atau VarChar. Cuplikan kode berikut ini menunjukkan bagaimana cara menambahkan field utama.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=False,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.Int64,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: false​
    +    // highlight-end​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema='{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}'​
    +
    +
    +

    Ketika menambahkan bidang, Anda dapat secara eksplisit mengklarifikasi bidang tersebut sebagai bidang utama dengan menyetel properti is_primary ke True. Bidang utama menerima nilai Int64 secara default. Dalam kasus ini, nilai field utama harus berupa bilangan bulat yang mirip dengan 12345. Jika Anda memilih untuk menggunakan nilai VarChar di field utama, nilainya harus berupa string yang mirip dengan my_entity_1234.

    +

    Anda juga dapat mengatur properti autoId ke True untuk membuat Milvus secara otomatis mengalokasikan nilai field utama pada saat penyisipan data.

    +

    Untuk detailnya, lihat Bidang Utama & AutoID.

    +

    Menambahkan Bidang Vektor

    Bidang vektor menerima berbagai penyematan vektor yang jarang dan padat. Di Milvus, Anda dapat menambahkan empat bidang vektor ke sebuah koleksi. Cuplikan kode berikut ini mendemonstrasikan bagaimana cara menambahkan bidang vektor.

    + +
    schema.add_field(​
    +    field_name="my_vector",​
    +    datatype=DataType.FLOAT_VECTOR,​
    +    # highlight-next-line
    +    dim=5​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        // highlight-next-line​
    +        .dimension(5)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_vector",​
    +    data_type: DataType.FloatVector,​
    +    // highlight-next-line​
    +    dim: 5​
    +});​
    +
    +
    +
    export vectorField='{​
    +    "fieldName": "my_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Parameter dim pada potongan kode di atas menunjukkan dimensi embedding vektor yang akan ditampung dalam bidang vektor. Nilai FLOAT_VECTOR menunjukkan bahwa bidang vektor menyimpan daftar angka mengambang 32-bit, yang biasanya digunakan untuk merepresentasikan antilogaritma. Selain itu, Milvus juga mendukung jenis-jenis penyematan vektor berikut ini.

    +
      +
    • FLOAT16_VECTOR

      +

      Bidang vektor jenis ini menyimpan daftar angka mengambang setengah presisi 16-bit dan biasanya berlaku untuk skenario pembelajaran mendalam atau komputasi berbasis GPU yang dibatasi memori atau bandwidth.

    • +
    • BFLOAT16_VECTOR

      +

      Bidang vektor jenis ini menyimpan daftar angka floating-point 16-bit yang memiliki presisi lebih rendah namun memiliki rentang eksponen yang sama dengan Float32. Jenis data ini biasanya digunakan dalam skenario pembelajaran mendalam, karena mengurangi penggunaan memori tanpa memengaruhi akurasi secara signifikan.

    • +
    • BINARY_VECTOR

      +

      Bidang vektor jenis ini menyimpan daftar 0 dan 1. Mereka berfungsi sebagai fitur ringkas untuk merepresentasikan data dalam pemrosesan gambar dan skenario pengambilan informasi.

    • +
    • SPARSE_FLOAT_VECTOR

      +

      Bidang vektor jenis ini menyimpan daftar angka bukan nol dan nomor urutnya untuk mewakili penyematan vektor yang jarang.

    • +
    +

    Menambahkan Bidang Skalar

    Dalam kasus yang umum, Anda dapat menggunakan bidang skalar untuk menyimpan metadata dari sematan vektor yang disimpan di Milvus, dan melakukan pencarian JST dengan pemfilteran metadata untuk meningkatkan ketepatan hasil pencarian. Milvus mendukung berbagai jenis bidang skalar, termasuk VarChar, Boolean, Int, Float, Double, Array, dan JSON.

    +

    Menambahkan Bidang String

    Di Milvus, Anda dapat menggunakan field VarChar untuk menyimpan string. Untuk mengetahui lebih lanjut mengenai bidang VarChar, lihat Bidang String.

    + +
    schema.add_field(​
    +    field_name="my_varchar",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-next-line
    +    max_length=512​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-next-line​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_varchar",​
    +    data_type: DataType.VarChar,​
    +    // highlight-next-line​
    +    max_length: 512​
    +});​
    +
    +
    +
    export varCharField='{​
    +    "fieldName": "my_varchar",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 256​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField​
    +    ]​
    +}"​
    +
    +
    +

    Menambahkan Bidang Angka

    Jenis-jenis angka yang didukung oleh Milvus adalah Int8, Int16, Int32, Int64, Float, dan Double. Untuk informasi lebih lanjut tentang bidang angka, lihat Bidang Angka.

    + +
    schema.add_field(​
    +    field_name="my_int64",​
    +    datatype=DataType.INT64,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_int64")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_int64",​
    +    data_type: DataType.Int64,​
    +});​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "my_int64",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field​
    +    ]​
    +}"​
    +
    +
    +

    Menambahkan Bidang Boolean

    Milvus mendukung field boolean. Cuplikan kode berikut ini mendemonstrasikan bagaimana cara menambahkan field boolean.

    + +
    schema.add_field(​
    +    field_name="my_bool",​
    +    datatype=DataType.BOOL,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_bool")​
    +        .dataType(DataType.Bool)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_bool",​
    +    data_type: DataType.Boolean,​
    +});​
    +
    +
    +
    export boolField='{​
    +    "fieldName": "my_bool",​
    +    "dataType": "Boolean"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField​
    +    ]​
    +}"​
    +
    +
    +

    Menambahkan bidang JSON

    Bidang JSON biasanya menyimpan data JSON setengah terstruktur. Untuk mengetahui lebih lanjut tentang bidang JSON, lihat Bidang JSON.

    + +
    schema.add_field(​
    +    field_name="my_json",​
    +    datatype=DataType.JSON,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_json")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_json",​
    +    data_type: DataType.JSON,​
    +});​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "my_json",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField​
    +    ]​
    +}"​
    +
    +
    +

    Menambahkan Bidang Array

    Bidang array menyimpan daftar elemen. Tipe data dari semua elemen di dalam bidang array harus sama. Untuk informasi lebih lanjut tentang bidang array, lihat Bidang Array.

    + +
    schema.add_field(​
    +    field_name="my_array",​
    +    datatype=DataType.ARRAY,​
    +    element_type=DataType.VARCHAR,​
    +    max_capacity=5,​
    +    max_length=512,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_array")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(5)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_array",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 5,​
    +    max_length: 512​
    +});​
    +
    +
    +
    export arrayField='{​
    +    "fieldName": "my_array",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 512​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField,​
    +        $arrayField​
    +    ]​
    +}"​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.json b/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.json new file mode 100644 index 000000000..be2503fa8 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.json @@ -0,0 +1 @@ +{"codeList":["from scipy.sparse import csr_matrix​\n​\n# Create a sparse matrix​\nrow = [0, 0, 1, 2, 2, 2]​\ncol = [0, 2, 2, 0, 1, 2]​\ndata = [1, 2, 3, 4, 5, 6]​\nsparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​\n​\n# Represent sparse vector using the sparse matrix​\nsparse_vector = sparse_matrix.getrow(0)​\n\n","# Represent sparse vector using a dictionary​\nsparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​\n\n","SortedMap sparseVector = new TreeMap<>();​\nsparseVector.put(1L, 0.5f);​\nsparseVector.put(100L, 0.3f);​\nsparseVector.put(500L, 0.8f);​\nsparseVector.put(1024L, 0.2f);​\nsparseVector.put(5000L, 0.6f);​\n\n","# Represent sparse vector using a list of tuples​\nsparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.drop_collection(collection_name=\"my_sparse_collection\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse_vector\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"sparse_vector\",​\n data_type: DataType.SparseFloatVector,​\n }​\n];​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"sparse_vector\",​\n \"dataType\": \"SparseFloatVector\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse_vector\",​\n index_name=\"sparse_inverted_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n params={\"drop_ratio_build\": 0.2},​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"drop_ratio_build\", 0.2);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"sparse_vector\")​\n .indexName(\"sparse_inverted_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","const indexParams = await client.createIndex({​\n index_name: 'sparse_inverted_index',​\n field_name: 'sparse_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.SPARSE_WAND,​\n params: {​\n drop_ratio_build: 0.2,​\n },​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"sparse_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_inverted_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\",​\n \"params\":{\"drop_ratio_build\": 0.2}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_sparse_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_sparse_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_sparse_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","sparse_vectors = [​\n {\"sparse_vector\": {1: 0.5, 100: 0.3, 500: 0.8}},​\n {\"sparse_vector\": {10: 0.1, 200: 0.7, 1000: 0.9}},​\n]​\n​\nclient.insert(​\n collection_name=\"my_sparse_collection\",​\n data=sparse_vectors​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(1L, 0.5f);​\n sparse.put(100L, 0.3f);​\n sparse.put(500L, 0.8f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(10L, 0.1f);​\n sparse.put(200L, 0.7f);​\n sparse.put(1000L, 0.9f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { sparse_vector: { \"1\": 0.5, \"100\": 0.3, \"500\": 0.8 } },​\n { sparse_vector: { \"10\": 0.1, \"200\": 0.7, \"1000\": 0.9 } },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"sparse_vector\": {\"1\": 0.5, \"100\": 0.3, \"500\": 0.8}},​\n {\"sparse_vector\": {\"10\": 0.1, \"200\": 0.7, \"1000\": 0.9}} ​\n ],​\n \"collectionName\": \"my_sparse_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572534\",\"453577185629572535\"]}}​\n\n","# Prepare search parameters​\nsearch_params = {​\n \"params\": {\"drop_ratio_search\": 0.2}, # Additional optional search parameters​\n}​\n​\n# Prepare the query vector​\nquery_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​\n\n","res = client.search(​\n collection_name=\"my_sparse_collection\",​\n data=query_vector,​\n limit=3,​\n output_fields=[\"pk\"],​\n search_params=search_params,​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"drop_ratio_search\", 0.2);​\n​\nSortedMap sparse = new TreeMap<>();​\nsparse.put(10L, 0.1f);​\nsparse.put(200L, 0.7f);​\nsparse.put(1000L, 0.9f);​\n​\nSparseFloatVec queryVector = new SparseFloatVec(sparse);​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"sparse_vector\")​\n .searchParams(searchParams)​\n .topK(3)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​\n\n","client.search({​\n collection_name: 'my_sparse_collection',​\n data: {1: 0.2, 50: 0.4, 1000: 0.7},​\n limit: 3,​\n output_fields: ['pk'],​\n params: {​\n drop_ratio_search: 0.2​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_sparse_collection\",​\n \"data\": [​\n {\"1\": 0.2, \"50\": 0.4, \"1000\": 0.7}​\n ],​\n \"annsField\": \"sparse_vector\",​\n \"limit\": 3,​\n \"searchParams\":{​\n \"params\":{\"drop_ratio_search\": 0.2}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.63,\"id\":\"453577185629572535\",\"pk\":\"453577185629572535\"},{\"distance\":0.1,\"id\":\"453577185629572534\",\"pk\":\"453577185629572534\"}]}​\n\n"],"headingContent":"Sparse Vector​","anchorList":[{"label":"Vektor Jarang","href":"Sparse-Vector​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menggunakan vektor jarang di Milvus","href":"Use-sparse-vectors-in-Milvus​","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false},{"label":"PERTANYAAN UMUM","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.md b/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.md new file mode 100644 index 000000000..c0e9f8a1d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/sparse_vector.md @@ -0,0 +1,537 @@ +--- +id: sparse_vector.md +title: Vektor Jarang +summary: >- + Vektor jarang adalah metode representasi data yang penting dalam pencarian + informasi dan pemrosesan bahasa alami. Meskipun vektor padat populer karena + kemampuan pemahaman semantiknya yang sangat baik, vektor jarang sering kali + memberikan hasil yang lebih akurat dalam hal aplikasi yang memerlukan + pencocokan kata kunci atau frasa yang tepat. +--- +

    Vektor Jarang

    Vektor jarang adalah metode representasi data yang penting dalam pencarian informasi dan pemrosesan bahasa alami. Meskipun vektor padat populer karena kemampuan pemahaman semantiknya yang sangat baik, vektor jarang sering kali memberikan hasil yang lebih akurat dalam hal aplikasi yang memerlukan pencocokan kata kunci atau frasa yang tepat.

    +

    Gambaran Umum

    Vektor jarang adalah representasi khusus dari vektor dimensi tinggi di mana sebagian besar elemen bernilai nol, dan hanya beberapa dimensi yang memiliki nilai bukan nol. Karakteristik ini membuat vektor jarang sangat efektif dalam menangani data berskala besar, berdimensi tinggi, tetapi jarang. Aplikasi yang umum meliputi.

    +
      +
    • Analisis Teks: Merepresentasikan dokumen sebagai vektor kantong kata, di mana setiap dimensi berhubungan dengan sebuah kata, dan hanya kata-kata yang muncul dalam dokumen yang memiliki nilai bukan nol.

    • +
    • Sistem Rekomendasi: Matriks interaksi pengguna dan item, di mana setiap dimensi mewakili peringkat pengguna untuk item tertentu, dengan sebagian besar pengguna hanya berinteraksi dengan beberapa item.

    • +
    • Pemrosesan Gambar: Representasi fitur lokal, yang hanya berfokus pada titik-titik penting dalam gambar, menghasilkan vektor jarang berdimensi tinggi.

    • +
    +

    Seperti yang ditunjukkan pada diagram di bawah ini, vektor padat biasanya direpresentasikan sebagai larik kontinu di mana setiap posisi memiliki nilai (misalnya, [0.3, 0.8, 0.2, 0.3, 0.1]). Sebaliknya, vektor jarang hanya menyimpan elemen non-nol dan indeksnya, yang sering direpresentasikan sebagai pasangan kunci-nilai (misalnya, [{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}]). Representasi ini secara signifikan mengurangi ruang penyimpanan dan meningkatkan efisiensi komputasi, terutama ketika berurusan dengan data berdimensi sangat tinggi (misalnya, 10.000 dimensi).

    +

    + + Spare vector representation + Representasi vektor jarang

    +

    Vektor jarang dapat dihasilkan dengan menggunakan berbagai metode, seperti TF-IDF (Term Frequency-Inverse Document Frequency) dan BM25 dalam pemrosesan teks. Selain itu, Milvus menawarkan metode yang mudah digunakan untuk membantu menghasilkan dan memproses vektor jarang. Untuk detailnya, lihat Penyematan.

    +

    Untuk data teks, Milvus juga menyediakan kemampuan pencarian teks lengkap, sehingga Anda dapat melakukan pencarian vektor secara langsung pada data teks mentah tanpa menggunakan model penyematan eksternal untuk menghasilkan vektor jarang. Untuk informasi lebih lanjut, lihat Pencarian Teks Lengkap.

    +

    Setelah vektorisasi, data dapat disimpan di Milvus untuk pengelolaan dan pengambilan vektor. Diagram di bawah ini mengilustrasikan proses dasarnya.

    +

    + + Use sparse vector in Milvus + Menggunakan vektor jarang di Milvus

    +
    +

    Selain vektor jarang, Milvus juga mendukung vektor padat dan vektor biner. Vektor padat ideal untuk menangkap hubungan semantik yang dalam, sementara vektor biner unggul dalam skenario seperti perbandingan kemiripan cepat dan deduplikasi konten. Untuk informasi lebih lanjut, lihat Vektor Padat dan Vektor Biner.

    +
    +

    Menggunakan vektor jarang di Milvus

    Milvus mendukung representasi vektor jarang dalam salah satu format berikut.

    +
      +
    • Matriks jarang (menggunakan kelas scipy.sparse )

      +

      +
      from scipy.sparse import csr_matrix​
      +​
      +# Create a sparse matrix​
      +row = [0, 0, 1, 2, 2, 2]​
      +col = [0, 2, 2, 0, 1, 2]​
      +data = [1, 2, 3, 4, 5, 6]​
      +sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​
      +​
      +# Represent sparse vector using the sparse matrix​
      +sparse_vector = sparse_matrix.getrow(0)​
      +
      +
    • +
    • Daftar Kamus (diformat sebagai {dimension_index: value, ...})

      +

      +
      # Represent sparse vector using a dictionary​
      +sparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​
      +
      +
      +
      SortedMap<Long, Float> sparseVector = new TreeMap<>();​
      +sparseVector.put(1L, 0.5f);​
      +sparseVector.put(100L, 0.3f);​
      +sparseVector.put(500L, 0.8f);​
      +sparseVector.put(1024L, 0.2f);​
      +sparseVector.put(5000L, 0.6f);​
      +
      +
    • +
    • Daftar Iterator Tuple (diformat sebagai [(dimension_index, value)])

      +

      +
      # Represent sparse vector using a list of tuples​
      +sparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​
      +
      +
    • +
    +

    Menambahkan bidang vektor

    Untuk menggunakan vektor jarang di Milvus, tentukan sebuah bidang untuk menyimpan vektor jarang saat membuat koleksi. Proses ini meliputi.

    +
      +
    1. Mengatur datatype ke tipe data vektor jarang yang didukung, SPARSE_FLOAT_VECTOR.

    2. +
    3. Tidak perlu menentukan dimensi.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +client.drop_collection(collection_name="my_sparse_collection")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse_vector")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "sparse_vector",​
    +    data_type: DataType.SparseFloatVector,​
    +  }​
    +];​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "sparse_vector",​
    +    "dataType": "SparseFloatVector"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Pada contoh ini, bidang vektor bernama sparse_vector ditambahkan untuk menyimpan vektor jarang. Tipe data dari field ini adalah SPARSE_FLOAT_VECTOR.

    +

    Mengatur parameter indeks untuk bidang vektor

    Proses pembuatan indeks untuk vektor jarang mirip dengan proses pembuatan indeks untuk vektor padat, tetapi dengan perbedaan pada tipe indeks yang ditentukan (index_type), metrik jarak (metric_type), dan parameter indeks (params).

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse_vector",​
    +    index_name="sparse_inverted_index",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +    params={"drop_ratio_build": 0.2},​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("drop_ratio_build", 0.2);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("sparse_vector")​
    +        .indexName("sparse_inverted_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    const indexParams = await client.createIndex({​
    +    index_name: 'sparse_inverted_index',​
    +    field_name: 'sparse_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.SPARSE_WAND,​
    +    params: {​
    +      drop_ratio_build: 0.2,​
    +    },​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "sparse_vector",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_inverted_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX",​
    +            "params":{"drop_ratio_build": 0.2}​
    +        }​
    +    ]'​
    +
    +
    +

    Pada contoh di atas.

    +
      +
    • Sebuah indeks bertipe SPARSE_INVERTED_INDEX dibuat untuk vektor jarang. Untuk vektor yang jarang, Anda dapat menentukan SPARSE_INVERTED_INDEX atau SPARSE_WAND. Untuk detailnya, lihat Indeks Vektor Jarang.

    • +
    • Untuk vektor jarang, metric_type hanya mendukung IP (Inner Product), yang digunakan untuk mengukur kemiripan antara dua vektor jarang. Untuk informasi lebih lanjut tentang kemiripan, lihat Jenis Metrik.

    • +
    • drop_ratio_build adalah parameter indeks opsional khusus untuk vektor jarang. Parameter ini mengontrol proporsi nilai vektor kecil yang dikecualikan selama pembuatan indeks. Misalnya, dengan {"drop_ratio_build": 0.2}, 20% nilai vektor terkecil akan dikecualikan selama pembuatan indeks, sehingga mengurangi upaya komputasi selama pencarian.

    • +
    +

    Membuat koleksi

    Setelah pengaturan vektor jarang dan indeks selesai, Anda dapat membuat koleksi yang berisi vektor jarang. Contoh di bawah ini menggunakan metode create_collection untuk membuat koleksi bernama my_sparse_collection.

    + +
    client.create_collection(​
    +    collection_name="my_sparse_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_sparse_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_sparse_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan data

    Setelah membuat koleksi, masukkan data yang berisi vektor jarang.

    + +
    sparse_vectors = [​
    +    {"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}},​
    +    {"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_sparse_collection",​
    +    data=sparse_vectors​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(1L, 0.5f);​
    +    sparse.put(100L, 0.3f);​
    +    sparse.put(500L, 0.8f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(10L, 0.1f);​
    +    sparse.put(200L, 0.7f);​
    +    sparse.put(1000L, 0.9f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { sparse_vector: { "1": 0.5, "100": 0.3, "500": 0.8 } },​
    +  { sparse_vector: { "10": 0.1, "200": 0.7, "1000": 0.9 } },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"sparse_vector": {"1": 0.5, "100": 0.3, "500": 0.8}},​
    +        {"sparse_vector": {"10": 0.1, "200": 0.7, "1000": 0.9}}        ​
    +    ],​
    +    "collectionName": "my_sparse_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572534","453577185629572535"]}}​
    +
    +
    +

    Melakukan pencarian kemiripan

    Untuk melakukan pencarian kemiripan menggunakan vektor jarang, siapkan vektor kueri dan parameter pencarian.

    + +
    # Prepare search parameters​
    +search_params = {​
    +    "params": {"drop_ratio_search": 0.2},  # Additional optional search parameters​
    +}​
    +​
    +# Prepare the query vector​
    +query_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​
    +
    +
    +

    Dalam contoh ini, drop_ratio_search adalah parameter opsional khusus untuk vektor jarang, yang memungkinkan penyesuaian nilai kecil dalam vektor kueri selama pencarian. Misalnya, dengan {"drop_ratio_search": 0.2}, 20% nilai terkecil dalam vektor kueri akan diabaikan selama pencarian.

    +

    Kemudian, jalankan pencarian kemiripan menggunakan metode search.

    + +
    res = client.search(​
    +    collection_name="my_sparse_collection",​
    +    data=query_vector,​
    +    limit=3,​
    +    output_fields=["pk"],​
    +    search_params=search_params,​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("drop_ratio_search", 0.2);​
    +​
    +SortedMap<Long, Float> sparse = new TreeMap<>();​
    +sparse.put(10L, 0.1f);​
    +sparse.put(200L, 0.7f);​
    +sparse.put(1000L, 0.9f);​
    +​
    +SparseFloatVec queryVector = new SparseFloatVec(sparse);​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("sparse_vector")​
    +        .searchParams(searchParams)​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_sparse_collection',​
    +    data: {1: 0.2, 50: 0.4, 1000: 0.7},​
    +    limit: 3,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        drop_ratio_search: 0.2​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_sparse_collection",​
    +    "data": [​
    +        {"1": 0.2, "50": 0.4, "1000": 0.7}​
    +    ],​
    +    "annsField": "sparse_vector",​
    +    "limit": 3,​
    +    "searchParams":{​
    +        "params":{"drop_ratio_search": 0.2}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.63,"id":"453577185629572535","pk":"453577185629572535"},{"distance":0.1,"id":"453577185629572534","pk":"453577185629572534"}]}​
    +
    +
    +

    Untuk informasi lebih lanjut tentang parameter pencarian kemiripan, lihat Pencarian ANN Dasar.

    +

    Batasan

    Ketika menggunakan vektor jarang di Milvus, pertimbangkan batasan-batasan berikut:

    +
      +
    • Saat ini, hanya metrik jarak IP dan BM25 (untuk pencarian teks lengkap) yang didukung untuk vektor jarang. Dimensi vektor jarang yang tinggi membuat L2 dan jarak kosinus tidak praktis.

    • +
    • Untuk bidang vektor jarang, hanya jenis indeks SPARSE_INVERTED_INDEX dan SPARSE_WAND yang didukung.

    • +
    • Tipe data yang didukung untuk vektor jarang:

      +
        +
      • Bagian dimensi harus berupa bilangan bulat 32-bit yang tidak ditandatangani;
      • +
      • Bagian nilai dapat berupa angka floating-point 32-bit non-negatif.
      • +
    • +
    • Vektor jarang harus memenuhi persyaratan berikut untuk penyisipan dan pencarian:

      +
        +
      • Setidaknya satu nilai dalam vektor bukan nol;
      • +
      • Indeks vektor tidak bernilai negatif.
      • +
    • +
    +

    PERTANYAAN UMUM

      +
    • Dapatkah Anda menjelaskan perbedaan antara SPARSE_INVERTED_INDEX dan SPARSE_WAND, dan bagaimana cara memilih di antara keduanya?

      +

      SPARSE_INVERTED_INDEX adalah indeks terbalik tradisional, sedangkan SPARSE_WAND menggunakan algoritme Weak-AND untuk mengurangi jumlah evaluasi jarak IP penuh selama pencarian. SPARSE_WAND biasanya lebih cepat, tetapi kinerjanya dapat menurun dengan meningkatnya kepadatan vektor. Untuk memilih di antara keduanya, lakukan eksperimen dan tolok ukur berdasarkan dataset dan kasus penggunaan spesifik Anda.

    • +
    • Bagaimana cara memilih parameter drop_ratio_build dan drop_ratio_search?

      +

      Pilihan drop_ratio_build dan drop_ratio_search bergantung pada karakteristik data Anda dan kebutuhan Anda untuk latensi/throughput dan akurasi pencarian.

    • +
    • Dapatkah dimensi embedding yang jarang berupa nilai diskrit dalam ruang uint32?

      +

      Ya, dengan satu pengecualian. Dimensi sematan jarang dapat berupa nilai apa pun dalam kisaran [0, maximum of uint32). Ini berarti Anda tidak dapat menggunakan nilai maksimum uint32.

    • +
    • Apakah pencarian pada ruas yang sedang tumbuh dilakukan melalui indeks atau dengan brute force?

      +

      Pencarian pada segmen yang sedang tumbuh dilakukan melalui indeks dengan tipe yang sama dengan indeks segmen yang disegel. Untuk segmen baru yang sedang tumbuh sebelum indeks dibangun, pencarian brute force digunakan.

    • +
    • Apakah mungkin untuk memiliki vektor yang jarang dan padat dalam satu koleksi?

      +

      Ya, dengan dukungan beberapa jenis vektor, Anda dapat membuat koleksi dengan kolom vektor yang jarang dan padat dan melakukan pencarian hibrida di dalamnya.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/schema/string.json b/localization/v2.5.x/site/id/userGuide/schema/string.json new file mode 100644 index 000000000..41350739b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/string.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\n# define schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"varchar_field1\", datatype=DataType.VARCHAR, max_length=100)​\nschema.add_field(field_name=\"varchar_field2\", datatype=DataType.VARCHAR, max_length=200)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field1\")​\n .dataType(DataType.VarChar)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field2\")​\n .dataType(DataType.VarChar)​\n .maxLength(200)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"varchar_field2\",​\n data_type: DataType.VarChar,​\n max_length: 200,​\n },​\n {​\n name: \"varchar_field1\",​\n data_type: DataType.VarChar,​\n max_length: 100,​\n },​\n];​\n\n","export varcharField1='{​\n \"fieldName\": \"varchar_field1\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport varcharField2='{​\n \"fieldName\": \"varchar_field2\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 200​\n }​\n}'​\n​\nexport primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $varcharField1,​\n $varcharField2,​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"varchar_field1\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"varchar_index\"​\n)​\n\n","​\nimport io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"varchar_field1\")​\n .indexName(\"varchar_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'varchar_index',​\n field_name: 'varchar_field1',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metric_type: MetricType.COSINE,​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_varchar_collection\",​\n schema: schema,​\n index_params: index_params​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_varchar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n## {\"code\":0,\"data\":{}}​\n\n","data = [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_varchar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product A\\\", \\\"varchar_field2\\\": \\\"High quality product\\\", \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product B\\\", \\\"varchar_field2\\\": \\\"Affordable price\\\", \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product C\\\", \\\"varchar_field2\\\": \\\"Best seller\\\", \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n varchar_field1: \"Product A\",​\n varchar_field2: \"High quality product\",​\n pk: 1,​\n embedding: [0.1, 0.2, 0.3],​\n },​\n {​\n varchar_field1: \"Product B\",​\n varchar_field2: \"Affordable price\",​\n pk: 2,​\n embedding: [0.4, 0.5, 0.6],​\n },​\n {​\n varchar_field1: \"Product C\",​\n varchar_field2: \"Best seller\",​\n pk: 3,​\n embedding: [0.7, 0.8, 0.9],​\n },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_varchar_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":3,\"insertIds\":[1,2,3]}}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.query(​\n collection_name=\"my_varchar_collection\",​\n filter=filter,​\n output_fields=[\"varchar_field1\", \"varchar_field2\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​\n\n","client.query({​\n collection_name: 'my_varchar_collection',​\n filter: 'varchar_field1 == \"Product A\"',​\n output_fields: ['varchar_field1', 'varchar_field2']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\",​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"]​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":[{\"pk\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.search(​\n collection_name=\"my_varchar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"varchar_field1\", \"varchar_field2\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_varchar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['varchar_field1', 'varchar_field2'],​\n filter: 'varchar_field1 == \"Product A\"'​\n params: {​\n nprobe:10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"],​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.2364331,\"id\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n"],"headingContent":"String Field​","anchorList":[{"label":"Bidang String","href":"String-Field​","type":1,"isActive":false},{"label":"Menambahkan bidang VARCHAR","href":"Add-VARCHAR-field​","type":2,"isActive":false},{"label":"Mengatur parameter indeks","href":"Set-index-params​","type":2,"isActive":false},{"label":"Membuat koleksi","href":"Create-collection​","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data​","type":2,"isActive":false},{"label":"Pencarian dan kueri","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/string.md b/localization/v2.5.x/site/id/userGuide/schema/string.md new file mode 100644 index 000000000..c35246a10 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/string.md @@ -0,0 +1,561 @@ +--- +id: string.md +title: Bidang String +summary: >- + Di Milvus, VARCHAR adalah tipe data yang digunakan untuk menyimpan data tipe + string, cocok untuk menyimpan string dengan panjang variabel. Tipe ini dapat + menyimpan string dengan karakter tunggal dan multi-byte, dengan panjang + maksimum hingga 65.535 karakter. Saat mendefinisikan bidang VARCHAR, Anda juga + harus menentukan parameter panjang maksimum max_length. Tipe string VARCHAR + menawarkan cara yang efisien dan fleksibel untuk menyimpan dan mengelola data + teks, sehingga ideal untuk aplikasi yang menangani string dengan panjang yang + bervariasi. +--- +

    Bidang String

    Di Milvus, VARCHAR adalah tipe data yang digunakan untuk menyimpan data tipe string, cocok untuk menyimpan string dengan panjang variabel. Tipe data ini dapat menyimpan string dengan karakter tunggal dan multi-byte, dengan panjang maksimum hingga 65.535 karakter. Saat mendefinisikan bidang VARCHAR, Anda juga harus menentukan parameter panjang maksimum max_length. Tipe string VARCHAR menawarkan cara yang efisien dan fleksibel untuk menyimpan dan mengelola data teks, sehingga ideal untuk aplikasi yang menangani string dengan panjang yang bervariasi.

    +

    Menambahkan bidang VARCHAR

    Untuk menggunakan data string di Milvus, tentukan bidang VARCHAR saat membuat koleksi. Proses ini meliputi.

    +
      +
    1. Menetapkan datatype ke tipe data string yang didukung, misalnya, VARCHAR.

    2. +
    3. Menentukan panjang maksimum tipe string menggunakan parameter max_length, yang tidak boleh melebihi 60.535 karakter.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +# define schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="varchar_field1", datatype=DataType.VARCHAR, max_length=100)​
    +schema.add_field(field_name="varchar_field2", datatype=DataType.VARCHAR, max_length=200)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field1")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field2")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(200)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "varchar_field2",​
    +    data_type: DataType.VarChar,​
    +    max_length: 200,​
    +  },​
    +  {​
    +    name: "varchar_field1",​
    +    data_type: DataType.VarChar,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    export varcharField1='{​
    +    "fieldName": "varchar_field1",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export varcharField2='{​
    +    "fieldName": "varchar_field2",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 200​
    +    }​
    +}'​
    +​
    +export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $varcharField1,​
    +        $varcharField2,​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Dalam contoh ini, kita menambahkan dua bidang VARCHAR: varchar_field1 dan varchar_field2, dengan panjang maksimum yang ditetapkan masing-masing 100 dan 200 karakter. Disarankan untuk menetapkan max_length berdasarkan karakteristik data Anda untuk memastikan bahwa field tersebut dapat menampung data terpanjang sekaligus menghindari alokasi ruang yang berlebihan. Selain itu, kami telah menambahkan bidang utama pk dan bidang vektor embedding.

    +
    +

    Bidang utama dan bidang vektor wajib diisi ketika Anda membuat koleksi. Field utama mengidentifikasi secara unik setiap entitas, sedangkan field vektor sangat penting untuk pencarian kesamaan. Untuk lebih jelasnya, lihat Bidang Utama & AutoID, Vektor Padat, Vektor Biner, atau Vektor Jarang.

    +
    +

    Mengatur parameter indeks

    Menetapkan parameter indeks untuk bidang VARCHAR bersifat opsional, tetapi dapat meningkatkan efisiensi pencarian secara signifikan.

    +

    Pada contoh berikut, kita membuat AUTOINDEX untuk varchar_field1, yang berarti Milvus akan secara otomatis membuat indeks yang sesuai berdasarkan tipe data. Untuk informasi lebih lanjut, lihat AUTOINDEX.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="varchar_field1",​
    +    index_type="AUTOINDEX",​
    +    index_name="varchar_index"​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("varchar_field1")​
    +        .indexName("varchar_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'varchar_index',​
    +    field_name: 'varchar_field1',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Selain AUTOINDEX, Anda dapat menentukan jenis indeks skalar lainnya, seperti INVERTED atau BITMAP. Untuk jenis indeks yang didukung, lihat Indeks Skalar.

    +

    Selain itu, sebelum membuat koleksi, Anda harus membuat indeks untuk bidang vektor. Dalam contoh ini, kita menggunakan AUTOINDEX untuk menyederhanakan pengaturan indeks vektor.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metric_type: MetricType.COSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Membuat koleksi

    Setelah skema dan indeks ditentukan, Anda dapat membuat koleksi yang menyertakan bidang string.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_varchar_collection",​
    +    schema: schema,​
    +    index_params: index_params​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_varchar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +## {"code":0,"data":{}}​
    +
    +
    +

    Menyisipkan data

    Setelah membuat koleksi, Anda dapat menyisipkan data yang menyertakan bidang string.

    + +
    data = [​
    +    {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_varchar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +    varchar_field1: "Product A",​
    +    varchar_field2: "High quality product",​
    +    pk: 1,​
    +    embedding: [0.1, 0.2, 0.3],​
    +  },​
    +  {​
    +    varchar_field1: "Product B",​
    +    varchar_field2: "Affordable price",​
    +    pk: 2,​
    +    embedding: [0.4, 0.5, 0.6],​
    +  },​
    +  {​
    +    varchar_field1: "Product C",​
    +    varchar_field2: "Best seller",​
    +    pk: 3,​
    +    embedding: [0.7, 0.8, 0.9],​
    +  },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_varchar_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":3,"insertIds":[1,2,3]}}​
    +
    +
    +

    Pada contoh ini, kita menyisipkan data yang mencakup bidang VARCHAR (varchar_field1 dan varchar_field2), bidang utama (pk), dan representasi vektor (embedding). Untuk memastikan bahwa data yang disisipkan sesuai dengan bidang yang didefinisikan dalam skema, disarankan untuk memeriksa tipe data terlebih dahulu untuk menghindari kesalahan penyisipan.

    +

    Jika Anda menetapkan enable_dynamic_fields=True ketika mendefinisikan skema, Milvus memungkinkan Anda untuk menyisipkan field string yang tidak didefinisikan sebelumnya. Namun, perlu diingat bahwa hal ini dapat meningkatkan kompleksitas kueri dan manajemen, yang berpotensi mempengaruhi kinerja. Untuk informasi lebih lanjut, lihat Bidang Dinamis.

    +

    Pencarian dan kueri

    Setelah menambahkan bidang string, Anda dapat menggunakannya untuk pemfilteran dalam operasi pencarian dan kueri, untuk mendapatkan hasil pencarian yang lebih tepat.

    +

    Menyaring kueri

    Setelah menambahkan bidang string, Anda dapat memfilter hasil menggunakan bidang ini dalam kueri. Sebagai contoh, Anda dapat melakukan kueri terhadap semua entitas di mana varchar_field1 sama dengan "Product A".

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.query(​
    +    collection_name="my_varchar_collection",​
    +    filter=filter,​
    +    output_fields=["varchar_field1", "varchar_field2"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_varchar_collection',​
    +    filter: 'varchar_field1 == "Product A"',​
    +    output_fields: ['varchar_field1', 'varchar_field2']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "filter": "varchar_field1 == \"Product A\"",​
    +    "outputFields": ["varchar_field1", "varchar_field2"]​
    +}'​
    +## {"code":0,"cost":0,"data":[{"pk":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    Ekspresi kueri ini mengembalikan semua entitas yang cocok dan mengeluarkan bidang varchar_field1 dan varchar_field2. Untuk informasi lebih lanjut tentang kueri penyaringan, lihat Pemfilteran Metadata.

    +

    Pencarian vektor dengan pemfilteran string

    Selain pemfilteran bidang skalar dasar, Anda dapat menggabungkan pencarian kemiripan vektor dengan pemfilteran bidang skalar. Sebagai contoh, kode berikut ini menunjukkan cara menambahkan penyaring bidang skalar ke pencarian vektor.

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.search(​
    +    collection_name="my_varchar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["varchar_field1", "varchar_field2"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_varchar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['varchar_field1', 'varchar_field2'],​
    +    filter: 'varchar_field1 == "Product A"'​
    +    params: {​
    +       nprobe:10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["varchar_field1", "varchar_field2"],​
    +    "filter": "varchar_field1 == \"Product A\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.2364331,"id":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    Dalam contoh ini, pertama-tama kita mendefinisikan vektor kueri dan menambahkan kondisi filter varchar_field1 == "Product A" selama pencarian. Hal ini memastikan bahwa hasil pencarian tidak hanya mirip dengan vektor kueri tetapi juga cocok dengan kondisi filter string yang ditentukan. Untuk informasi lebih lanjut, lihat Pemfilteran Metadata.

    diff --git a/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.json b/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.json new file mode 100644 index 000000000..0038ef465 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"category\": \"electronics\",​\n \"price\": 99.99,​\n \"brand\": \"BrandA\"​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"metadata\")​\n .dataType(DataType.JSON)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export jsonField='{​\n \"fieldName\": \"metadata\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $jsonField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","​\nindex_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","const indexParams = {​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metricType: MetricType.CONSINE,​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_json_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_json_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_json_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_json_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# Data to be inserted​\ndata = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\n# Insert data into the collection​\nclient.insert(​\n collection_name=\"your_collection_name\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"home_appliances\\\", \\\"price\\\": 249.99, \\\"brand\\\": \\\"BrandB\\\"}, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"furniture\\\", \\\"price\\\": 399.99, \\\"brand\\\": \\\"BrandC\\\"}, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_json_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\nclient.insert({​\n collection_name: \"my_json_collection\",​\n data: data​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n } ​\n ],​\n \"collectionName\": \"my_json_collection\"​\n}'​\n\n","filter = 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150'​\n​\nres = client.query(​\n collection_name=\"my_json_collection\",​\n filter=filter,​\n output_fields=[\"metadata\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_json_collection\")​\n .filter(filter)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}, pk=1})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n output_fields: ['metadata']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"filter\": \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\",​\n \"outputFields\": [\"metadata\"]​\n}'​\n{\"code\":0,\"cost\":0,\"data\":[{\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\",\"pk\":1}]}​\n\n","filter = 'metadata[\"brand\"] == \"BrandA\"'​\n​\nres = client.search(​\n collection_name=\"my_json_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"metadata\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_json_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_json_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['metadata'],​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"metadata\"],​\n \"filter\": \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"id\":1,\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\"}]}​\n\n"],"headingContent":"JSON Field​","anchorList":[{"label":"Bidang JSON","href":"JSON-Field​","type":1,"isActive":false},{"label":"Menambahkan bidang JSON","href":"Add-JSON-field​","type":2,"isActive":false},{"label":"Membuat koleksi","href":"Create-collection​","type":2,"isActive":false},{"label":"Menyisipkan data","href":"Insert-data​","type":2,"isActive":false},{"label":"Pencarian dan kueri","href":"Search-and-query​","type":2,"isActive":false},{"label":"Batasan","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.md b/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.md new file mode 100644 index 000000000..a11cebdcb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/schema/use-json-fields.md @@ -0,0 +1,525 @@ +--- +id: use-json-fields.md +title: Gunakan Bidang JSON +summary: >- + JSON (JavaScript Object Notation) adalah format pertukaran data ringan yang + menyediakan cara yang fleksibel untuk menyimpan dan menanyakan struktur data + yang kompleks. Di Milvus, Anda dapat menyimpan informasi terstruktur tambahan + di samping data vektor menggunakan bidang JSON, sehingga memungkinkan + pencarian dan kueri tingkat lanjut yang menggabungkan kemiripan vektor dengan + pemfilteran terstruktur. +--- +

    Bidang JSON

    JSON (JavaScript Object Notation) adalah format pertukaran data ringan yang menyediakan cara yang fleksibel untuk menyimpan dan menanyakan struktur data yang kompleks. Di Milvus, Anda dapat menyimpan informasi terstruktur tambahan di samping data vektor menggunakan bidang JSON, sehingga memungkinkan pencarian dan kueri tingkat lanjut yang menggabungkan kemiripan vektor dengan pemfilteran terstruktur.

    +

    Bidang JSON ideal untuk aplikasi yang memerlukan metadata untuk mengoptimalkan hasil pencarian. Misalnya, dalam e-commerce, vektor produk dapat ditingkatkan dengan atribut seperti kategori, harga, dan merek. Dalam sistem rekomendasi, vektor pengguna dapat digabungkan dengan preferensi dan informasi demografis. Di bawah ini adalah contoh bidang JSON yang umum.

    +
    {​
    +  "category": "electronics",​
    +  "price": 99.99,​
    +  "brand": "BrandA"​
    +}​
    +
    +
    +

    Menambahkan bidang JSON

    Untuk menggunakan bidang JSON di Milvus, tentukan jenis bidang yang relevan dalam skema koleksi, atur datatype ke jenis JSON yang didukung, misalnya, JSON.

    +

    Berikut ini cara mendefinisikan skema koleksi yang menyertakan bidang JSON.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("metadata")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "metadata",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $jsonField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Dalam contoh ini, kita menambahkan bidang JSON bernama metadata untuk menyimpan metadata tambahan yang terkait dengan data vektor, seperti kategori produk, harga, dan informasi merek.

    +
    +

    Bidang utama dan bidang vektor wajib ada saat Anda membuat koleksi. Bidang utama mengidentifikasi setiap entitas secara unik, sedangkan bidang vektor sangat penting untuk pencarian kemiripan. Untuk lebih jelasnya, lihat Bidang Utama & AutoID, Vektor Padat, Vektor Biner, atau Vektor Jarang.

    +
    +

    Membuat koleksi

    Ketika membuat koleksi, Anda harus membuat indeks untuk bidang vektor untuk memastikan kinerja pengambilan. Dalam contoh ini, kami menggunakan AUTOINDEX untuk menyederhanakan penyiapan indeks. Untuk lebih jelasnya, lihat AUTOINDEX.

    + +
    ​
    +index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metricType: MetricType.CONSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Gunakan skema yang ditentukan dan parameter indeks untuk membuat koleksi.

    + +
    client.create_collection(​
    +    collection_name="my_json_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_json_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_json_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Menyisipkan data

    Setelah membuat koleksi, Anda dapat menyisipkan data yang menyertakan bidang JSON.

    + +
    # Data to be inserted​
    +data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +# Insert data into the collection​
    +client.insert(​
    +    collection_name="your_collection_name",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"}, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"}, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +client.insert({​
    +    collection_name: "my_json_collection",​
    +    data: data​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +            "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +            "pk": 1,​
    +            "embedding": [0.12, 0.34, 0.56]​
    +        },​
    +        {​
    +            "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +            "pk": 2,​
    +            "embedding": [0.56, 0.78, 0.90]​
    +        },​
    +        {​
    +            "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +            "pk": 3,​
    +            "embedding": [0.91, 0.18, 0.23]​
    +        }       ​
    +    ],​
    +    "collectionName": "my_json_collection"​
    +}'​
    +
    +
    +

    Dalam contoh ini.

    +
      +
    • Setiap entri data mencakup bidang utama (pk), metadata sebagai bidang JSON untuk menyimpan informasi seperti kategori produk, harga, dan merek.

    • +
    • embedding adalah bidang vektor 3 dimensi yang digunakan untuk pencarian kemiripan vektor.

    • +
    +

    Pencarian dan kueri

    Bidang JSON memungkinkan pemfilteran skalar selama pencarian, meningkatkan kemampuan pencarian vektor Milvus. Anda dapat membuat kueri berdasarkan properti JSON di samping kemiripan vektor.

    +

    Menyaring kueri

    Anda dapat memfilter data berdasarkan properti JSON, seperti mencocokkan nilai tertentu atau memeriksa apakah suatu angka berada dalam rentang tertentu.

    + +
    filter = 'metadata["category"] == "electronics" and metadata["price"] < 150'​
    +​
    +res = client.query(​
    +    collection_name="my_json_collection",​
    +    filter=filter,​
    +    output_fields=["metadata"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .filter(filter)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +    output_fields: ['metadata']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "filter": "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150",​
    +    "outputFields": ["metadata"]​
    +}'​
    +{"code":0,"cost":0,"data":[{"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}","pk":1}]}​
    +
    +
    +

    Pada kueri di atas, Milvus menyaring entitas dengan bidang metadata yang memiliki kategori "electronics" dan harga di bawah 150, dan mengembalikan entitas yang sesuai dengan kriteria ini.

    +

    Pencarian vektor dengan pemfilteran JSON

    Dengan menggabungkan kemiripan vektor dengan pemfilteran JSON, Anda dapat memastikan bahwa data yang diambil tidak hanya cocok secara semantik tetapi juga memenuhi kondisi bisnis tertentu, sehingga hasil pencarian lebih tepat dan selaras dengan kebutuhan pengguna.

    + +
    filter = 'metadata["brand"] == "BrandA"'​
    +​
    +res = client.search(​
    +    collection_name="my_json_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["metadata"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "metadata[\"brand\"] == \"BrandA\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_json_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['metadata'],​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["metadata"],​
    +    "filter": "metadata[\"brand\"] == \"BrandA\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.24793813,"id":1,"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}"}]}​
    +
    +
    +

    Dalam contoh ini, Milvus mengembalikan 5 entitas teratas yang paling mirip dengan vektor kueri, dengan bidang metadata yang berisi merek "BrandA".

    +

    Selain itu, Milvus mendukung operator pemfilteran JSON tingkat lanjut seperti JSON_CONTAINS, JSON_CONTAINS_ALL, dan JSON_CONTAINS_ANY, yang dapat meningkatkan kemampuan kueri lebih lanjut. Untuk lebih jelasnya, lihat Pemfilteran Metadata.

    +

    Batasan

      +
    • Batasan Pengindeksan: Karena kompleksitas struktur data, pengindeksan bidang JSON tidak didukung.

    • +
    • Pencocokan Tipe Data: Jika nilai kunci bidang JSON berupa bilangan bulat atau titik mengambang, nilai tersebut hanya dapat dibandingkan dengan kunci bilangan bulat atau mengambang lainnya atau bidang INT32/64 atau FLOAT32/64. Jika nilai kunci berupa string (VARCHAR), maka hanya dapat dibandingkan dengan kunci string lainnya.

    • +
    • Batasan Penamaan: Ketika menamai kunci JSON, disarankan untuk hanya menggunakan huruf, karakter numerik, dan garis bawah, karena karakter lain dapat menyebabkan masalah saat pemfilteran atau pencarian.

    • +
    • Menangani Nilai String: Untuk nilai string (VARCHAR), Milvus menyimpan string bidang JSON apa adanya tanpa konversi semantik. Sebagai contoh 'a"b', "a'b", 'a\\'b', dan "a\\"b" disimpan seperti yang dimasukkan; namun, 'a'b' dan "a"b" dianggap tidak valid.

    • +
    • Menangani Kamus Bersarang: Setiap kamus bertingkat dalam nilai bidang JSON diperlakukan sebagai string.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.json b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.json new file mode 100644 index 000000000..17fe776d8 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​\n\n","filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_LENGTH(history_temperatures) < 10'​\n\n"],"headingContent":"ARRAY Operators​","anchorList":[{"label":"Operator ARRAY","href":"ARRAY-Operators​","type":1,"isActive":false},{"label":"Operator ARRAY yang Tersedia","href":"Available-ARRAY-Operators​","type":2,"isActive":false},{"label":"ARRAY_CONTAINS","href":"ARRAYCONTAINS​","type":2,"isActive":false},{"label":"LARIK_MENGANDUNG_SEMUA","href":"ARRAYCONTAINSALL​","type":2,"isActive":false},{"label":"LARIK_BERISI_APA SAJA","href":"ARRAYCONTAINSANY​","type":2,"isActive":false},{"label":"ARRAY_LENGTH","href":"ARRAYLENGTH​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.md b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.md new file mode 100644 index 000000000..647646ff5 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/array-operators.md @@ -0,0 +1,137 @@ +--- +id: array-operators.md +summary: >- + Milvus menyediakan operator yang kuat untuk melakukan kueri terhadap bidang + larik, yang memungkinkan Anda untuk memfilter dan mengambil entitas + berdasarkan isi larik. +title: Operator Array +--- +

    Operator ARRAY

    Milvus menyediakan operator yang kuat untuk melakukan kueri terhadap bidang larik, yang memungkinkan Anda untuk memfilter dan mengambil entitas berdasarkan isi larik.

    +
    +

    Semua elemen dalam larik harus memiliki tipe yang sama, dan struktur bersarang dalam larik diperlakukan sebagai string biasa. Oleh karena itu, saat bekerja dengan bidang ARRAY, disarankan untuk menghindari penumpukan yang terlalu dalam dan memastikan bahwa struktur data Anda serata mungkin untuk kinerja yang optimal.

    +
    +

    Operator ARRAY yang Tersedia

    Operator ARRAY memungkinkan untuk melakukan kueri bidang array yang halus di Milvus. Operator-operator ini adalah.

    + +

    ARRAY_CONTAINS

    Operator ARRAY_CONTAINS memeriksa apakah elemen tertentu ada dalam bidang larik. Operator ini berguna saat Anda ingin menemukan entitas di mana elemen tertentu ada dalam larik.

    +

    Contoh

    +

    Misalkan Anda memiliki bidang larik history_temperatures, yang berisi suhu terendah yang tercatat untuk tahun yang berbeda. Untuk menemukan semua entitas di mana larik berisi nilai 23, Anda dapat menggunakan ekspresi filter berikut.

    +
    filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​
    +
    +
    +

    Ini akan mengembalikan semua entitas di mana larik history_temperatures berisi nilai 23.

    +

    LARIK_MENGANDUNG_SEMUA

    Operator ARRAY_CONTAINS_ALL memastikan bahwa semua elemen dari daftar yang ditentukan ada dalam bidang larik. Operator ini berguna ketika Anda ingin mencocokkan entitas yang berisi beberapa nilai dalam larik.

    +

    Contoh

    +

    Jika Anda ingin menemukan semua entitas di mana larik history_temperatures berisi 23 dan 24, Anda dapat menggunakan.

    +
    filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​
    +
    +
    +

    Ini akan mengembalikan semua entitas di mana larik history_temperatures berisi kedua nilai yang ditentukan.

    +

    LARIK_BERISI_APA SAJA

    Operator ARRAY_CONTAINS_ANY memeriksa apakah ada elemen dari daftar yang ditentukan yang ada dalam bidang larik. Ini berguna saat Anda ingin mencocokkan entitas yang mengandung setidaknya satu dari nilai yang ditentukan dalam larik.

    +

    Contoh

    +

    Untuk menemukan semua entitas di mana larik history_temperatures berisi 23 atau 24, Anda dapat menggunakan.

    +
    filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​
    +
    +
    +

    Ini akan mengembalikan semua entitas di mana larik history_temperatures berisi setidaknya salah satu nilai 23 atau 24.

    +

    ARRAY_LENGTH

    Operator ARRAY_LENGTH memungkinkan Anda untuk memfilter entitas berdasarkan jumlah elemen dalam bidang larik. Hal ini berguna saat Anda perlu menemukan entitas dengan larik dengan panjang tertentu.

    +

    Contoh

    +

    Jika Anda ingin menemukan semua entitas di mana larik history_temperatures memiliki kurang dari 10 elemen, Anda dapat menggunakan.

    +
    filter = 'ARRAY_LENGTH(history_temperatures) < 10'​
    +
    +
    +

    Ini akan mengembalikan semua entitas di mana larik history_temperatures memiliki kurang dari 10 elemen.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.json b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.json new file mode 100644 index 000000000..ced9feae9 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'status == \"active\"'​\n\n","filter = 'status != \"inactive\"'​\n\n","filter = 'age > 30'​\n\n","filter = 'price < 100'​\n\n","filter = 'rating >= 4'​\n\n","filter = 'discount <= 10'​\n\n","filter = 'color in [\"red\", \"green\", \"blue\"]'​\n\n","filter = 'name LIKE \"Prod%\"'​\n\n","filter = 'name LIKE \"%XYZ\"'​\n\n","filter = 'name LIKE \"%Pro%\"'​\n\n","filter = 'total == base_price + tax'​\n\n","filter = 'quantity - quantity_sold > 50'​\n\n","filter = 'price * quantity > 1000'​\n\n","filter = 'total_price / quantity < 50'​\n\n","filter = 'id % 2 == 0'​\n\n","filter = 'price ** 2 > 1000'​\n\n","filter = 'price > 100 AND stock > 50'​\n\n","filter = 'color == \"red\" OR color == \"blue\"'​\n\n","filter = 'NOT color == \"green\"'​\n\n","filter = 'product[\"price\"] > 1000'​\n\n","filter = 'history_temperatures[0] > 30'​\n\n"],"headingContent":"Basic Operators​","anchorList":[{"label":"Operator Dasar","href":"Basic-Operators​","type":1,"isActive":false},{"label":"Operator perbandingan","href":"Comparison-operators​","type":2,"isActive":false},{"label":"Operator rentang","href":"Range-operators​","type":2,"isActive":false},{"label":"Operator Aritmatika","href":"Arithmetic-Operators​","type":2,"isActive":false},{"label":"Operator Logika","href":"Logical-Operators​","type":2,"isActive":false},{"label":"Tips Menggunakan Operator Dasar dengan Bidang JSON dan ARRAY","href":"Tips-on-Using-Basic-Operators-with-JSON-and-ARRAY-Fields​","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.md b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.md new file mode 100644 index 000000000..52e39c244 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/basic-operators.md @@ -0,0 +1,237 @@ +--- +id: basic-operators.md +summary: >- + Milvus menyediakan serangkaian operator dasar yang kaya untuk membantu Anda + memfilter dan menanyakan data secara efisien. Operator-operator ini + memungkinkan Anda untuk mempersempit kondisi pencarian Anda berdasarkan bidang + skalar, perhitungan numerik, kondisi logika, dan banyak lagi. Memahami cara + menggunakan operator-operator ini sangat penting untuk membuat kueri yang + tepat dan memaksimalkan efisiensi pencarian Anda. +title: Operator Dasar +--- +

    Operator Dasar

    Milvus menyediakan serangkaian operator dasar yang kaya untuk membantu Anda memfilter dan menanyakan data secara efisien. Operator-operator ini memungkinkan Anda untuk mempersempit kondisi pencarian Anda berdasarkan bidang skalar, perhitungan numerik, kondisi logika, dan banyak lagi. Memahami cara menggunakan operator-operator ini sangat penting untuk membuat kueri yang tepat dan memaksimalkan efisiensi pencarian Anda.

    +

    Operator perbandingan

    Operator perbandingan digunakan untuk memfilter data berdasarkan persamaan, ketidaksamaan, atau ukuran. Operator ini dapat digunakan untuk bidang numerik, teks, dan tanggal.

    +

    Operator Perbandingan yang Didukung.

      +
    • == (Sama dengan)

    • +
    • != (Tidak sama dengan)

    • +
    • > (Lebih besar dari)

    • +
    • < (Kurang dari)

    • +
    • >= (Lebih besar dari atau sama dengan)

    • +
    • <= (Kurang dari atau sama dengan)

    • +
    +

    Contoh 1: Memfilter dengan Sama Dengan (==)

    Asumsikan Anda memiliki sebuah bidang bernama status dan Anda ingin menemukan semua entitas di mana status "aktif". Anda dapat menggunakan operator penyetaraan ==.

    +
    filter = 'status == "active"'​
    +
    +
    +

    Contoh 2: Memfilter dengan Tidak Sama Dengan (!=)

    Untuk menemukan entitas di mana status tidak "tidak aktif".

    +
    filter = 'status != "inactive"'​
    +
    +
    +

    Contoh 3: Memfilter dengan Lebih Besar Dari (>)

    Jika Anda ingin menemukan semua entitas dengan age lebih besar dari 30.

    +
    filter = 'age > 30'​
    +
    +
    +

    Contoh 4: Memfilter dengan Kurang Dari (<)

    Untuk menemukan entitas dengan price kurang dari 100.

    +
    filter = 'price < 100'​
    +
    +
    +

    Contoh 5: Memfilter dengan Lebih Besar Dari atau Sama Dengan (>=)

    Jika Anda ingin menemukan semua entitas dengan rating lebih besar dari atau sama dengan 4.

    +
    filter = 'rating >= 4'​
    +
    +
    +

    Contoh 6: Memfilter dengan Kurang Dari atau Sama Dengan (<=)

    Untuk menemukan entitas dengan discount kurang dari atau sama dengan 10%.

    +
    filter = 'discount <= 10'​
    +
    +
    +

    Operator rentang

    Operator rentang membantu memfilter data berdasarkan set atau rentang nilai tertentu.

    +

    Operator Rentang yang Didukung.

      +
    • IN: Digunakan untuk mencocokkan nilai dalam set atau rentang tertentu.

    • +
    • LIKE: Digunakan untuk mencocokkan pola (sebagian besar untuk bidang teks).

    • +
    +

    Contoh 1: Menggunakan IN untuk Mencocokkan Beberapa Nilai

    Jika Anda ingin menemukan semua entitas di mana color adalah "merah", "hijau", atau "biru".

    +
    filter = 'color in ["red", "green", "blue"]'​
    +
    +
    +

    Ini berguna ketika Anda ingin memeriksa keanggotaan dalam daftar nilai.

    +

    Contoh 2: Menggunakan LIKE untuk Pencocokan Pola

    Operator LIKE digunakan untuk pencocokan pola dalam bidang string. Operator ini dapat mencocokkan substring di berbagai posisi dalam teks: sebagai awalan, akhiran, atau akhiran. Operator LIKE menggunakan simbol % sebagai wildcard, yang dapat mencocokkan sejumlah karakter (termasuk nol).

    +

    Pencocokan Awalan (Dimulai dengan)

    Untuk melakukan pencocokan awalan, di mana string dimulai dengan pola tertentu, Anda dapat menempatkan pola di awal dan menggunakan % untuk mencocokkan karakter apa pun yang mengikutinya. Misalnya, untuk menemukan semua produk yang name -nya dimulai dengan "Prod".

    +
    filter = 'name LIKE "Prod%"'​
    +
    +
    +

    Ini akan mencocokkan semua produk yang namanya dimulai dengan "Prod", seperti "Produk A", "Produk B", dll.

    +

    Pencocokan Akhiran (Berakhiran dengan)

    Untuk pencocokan akhiran, di mana string diakhiri dengan pola tertentu, letakkan simbol % di awal pola. Misalnya, untuk menemukan semua produk yang name -nya diakhiri dengan "XYZ".

    +
    filter = 'name LIKE "%XYZ"'​
    +
    +
    +

    Ini akan mencocokkan semua produk yang namanya diakhiri dengan "XYZ", seperti "ProductXYZ", "SampleXYZ", dll.

    +

    Pencocokan Infiks (Berisi)

    Untuk melakukan pencocokan infix, di mana pola dapat muncul di mana saja dalam string, Anda dapat menempatkan simbol % di awal dan akhir pola. Misalnya, untuk menemukan semua produk yang name -nya mengandung kata "Pro".

    +
    filter = 'name LIKE "%Pro%"'​
    +
    +
    +

    Ini akan mencocokkan semua produk yang namanya mengandung substring "Pro", seperti "Produk", "ProLine", atau "SuperPro".

    +

    Operator Aritmatika

    Operator aritmatika memungkinkan Anda untuk membuat kondisi berdasarkan perhitungan yang melibatkan bidang numerik.

    +

    Operator Aritmatika yang Didukung.

      +
    • + (Penambahan)

    • +
    • - (Pengurangan)

    • +
    • * (Perkalian)

    • +
    • / (Pembagian)

    • +
    • % (Modulus)

    • +
    • ** (Eksponensial)

    • +
    +

    Contoh 1: Menggunakan Penjumlahan (+)

    Untuk menemukan entitas di mana harga total adalah jumlah dari base_price dan tax.

    +
    filter = 'total == base_price + tax'​
    +
    +
    +

    Contoh 2: Menggunakan Pengurangan (-)

    Untuk menemukan entitas di mana quantity lebih besar dari 50 dan quantity_sold kurang dari 30.

    +
    filter = 'quantity - quantity_sold > 50'​
    +
    +
    +

    Contoh 3: Menggunakan Perkalian (*)

    Untuk menemukan entitas di mana price lebih besar dari 100 dan quantity lebih besar dari 10, dikalikan.

    +
    filter = 'price * quantity > 1000'​
    +
    +
    +

    Contoh 4: Menggunakan Pembagian (/)

    Untuk mencari hasil bagi di mana total_price dibagi dengan quantity kurang dari 50.

    +
    filter = 'total_price / quantity < 50'​
    +
    +
    +

    Contoh 5: Menggunakan Modulus (%)

    Untuk menemukan entitas di mana id adalah bilangan genap (yaitu, habis dibagi 2).

    +
    filter = 'id % 2 == 0'​
    +
    +
    +

    Contoh 6: Menggunakan Eksponensial (**)

    Untuk menemukan entitas di mana price yang dipangkatkan dengan pangkat 2 lebih besar dari 1000.

    +
    filter = 'price ** 2 > 1000'​
    +
    +
    +

    Operator Logika

    Operator logika digunakan untuk menggabungkan beberapa kondisi ke dalam ekspresi filter yang lebih kompleks. Operator ini termasuk AND, OR, dan NOT.

    +

    Operator Logika yang didukung.

      +
    • AND: Menggabungkan beberapa kondisi yang semuanya harus benar.

    • +
    • OR: Menggabungkan kondisi di mana setidaknya satu kondisi harus benar.

    • +
    • NOT: Meniadakan sebuah kondisi.

    • +
    +

    Contoh 1: Menggunakan AND untuk Menggabungkan Kondisi

    Untuk menemukan semua produk di mana price lebih besar dari 100 dan stock lebih besar dari 50.

    +
    filter = 'price > 100 AND stock > 50'​
    +
    +
    +

    Contoh 2: Menggunakan OR untuk Menggabungkan Kondisi

    Untuk menemukan semua produk di mana color adalah "merah" atau "biru".

    +
    filter = 'color == "red" OR color == "blue"'​
    +
    +
    +

    Contoh 3: Menggunakan NOT untuk Mengecualikan Kondisi

    Untuk menemukan semua produk di mana color tidak berwarna "hijau".

    +
    filter = 'NOT color == "green"'​
    +
    +
    +

    Tips Menggunakan Operator Dasar dengan Bidang JSON dan ARRAY

    Meskipun operator dasar di Milvus bersifat serbaguna dan dapat diterapkan pada bidang skalar, operator ini juga dapat digunakan secara efektif dengan kunci dan indeks di bidang JSON dan ARRAY.

    +

    Sebagai contoh, jika Anda memiliki bidang product yang berisi beberapa kunci seperti price, model, dan tags, selalu rujuk kunci secara langsung.

    +
    filter = 'product["price"] > 1000'​
    +
    +
    +

    Untuk menemukan catatan di mana suhu pertama dalam larik suhu yang direkam melebihi nilai tertentu, gunakan.

    +
    filter = 'history_temperatures[0] > 30'​
    +
    +
    +

    Kesimpulan

    Milvus menawarkan berbagai operator dasar yang memberikan fleksibilitas dalam memfilter dan menanyakan data Anda. Dengan menggabungkan operator perbandingan, rentang, aritmatika, dan logika, Anda dapat membuat ekspresi filter yang kuat untuk mempersempit hasil pencarian dan mengambil data yang Anda butuhkan secara efisien.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.json b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.json new file mode 100644 index 000000000..e8ed8aa87 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.json @@ -0,0 +1 @@ +{"codeList":["filter='color in [\"red\", \"green\", \"blue\"]'​\n\n","filter='product[\"model\"] == \"JSN-087\" and product[\"price\"] < 1850'​\n\n","filter='history_temperatures[10] > 23'​\n\n","filter = \"age > 25 and city in ['北京', '上海']\"​\n\n","filter = \"age > {age} and city in {city}\",​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter='json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n","filter=\"ARRAY_CONTAINS(history_temperatures, 23)\"​\n\n","filter=\"ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_LENGTH(history_temperatures) < 10\"​\n\n"],"headingContent":"Filtering Explained​","anchorList":[{"label":"Penjelasan Pemfilteran","href":"Filtering-Explained​","type":1,"isActive":false},{"label":"Operator dasar","href":"Basic-operators​","type":2,"isActive":false},{"label":"Templat ekspresi penyaringan","href":"Filter-expression-templates​","type":2,"isActive":false},{"label":"Operator khusus tipe data","href":"Data-type-specific-operators​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.md b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.md new file mode 100644 index 000000000..17277e3b4 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/boolean.md @@ -0,0 +1,148 @@ +--- +id: boolean.md +summary: >- + Milvus menyediakan kemampuan penyaringan yang kuat yang memungkinkan kueri + yang tepat untuk data Anda. Ekspresi filter memungkinkan Anda untuk + menargetkan bidang skalar tertentu dan menyaring hasil pencarian dengan + kondisi yang berbeda. Panduan ini menjelaskan bagaimana menggunakan ekspresi + filter di Milvus, dengan contoh-contoh yang difokuskan pada operasi kueri. + Anda juga dapat menerapkan filter-filter ini dalam permintaan pencarian dan + penghapusan. +title: Penjelasan Pemfilteran +--- +

    Penjelasan Pemfilteran

    Milvus menyediakan kemampuan pemfilteran yang kuat yang memungkinkan kueri yang tepat untuk data Anda. Ekspresi penyaringan memungkinkan Anda untuk menargetkan bidang skalar tertentu dan mempersempit hasil pencarian dengan kondisi yang berbeda. Panduan ini menjelaskan cara menggunakan ekspresi filter di Milvus, dengan contoh-contoh yang difokuskan pada operasi kueri. Anda juga dapat menerapkan filter ini dalam permintaan pencarian dan penghapusan.

    +

    Operator dasar

    Milvus mendukung beberapa operator dasar untuk memfilter data.

    +
      +
    • Operator Perbandingan: == != , >, <, >=, dan <= memungkinkan pemfilteran berdasarkan bidang numerik, teks, atau tanggal.

    • +
    • Filter Rentang: IN dan LIKE membantu mencocokkan rentang atau kumpulan nilai tertentu.

    • +
    • Operator Aritmatika: +, -, *, /, %, dan `` digunakan untuk perhitungan yang melibatkan bidang numerik.

    • +
    • Operator Logika: AND, OR, dan NOT atau '&&', '||', '~', '!' menggabungkan beberapa kondisi ke dalam ekspresi yang kompleks.

    • +
    +

    Contoh: Memfilter berdasarkan Warna

    Untuk menemukan entitas dengan warna primer (merah, hijau, atau biru) dalam bidang skalar color, gunakan ekspresi filter berikut.

    +
    filter='color in ["red", "green", "blue"]'​
    +
    +
    +

    Contoh: Memfilter Bidang JSON

    Milvus mengizinkan referensi kunci dalam bidang JSON. Misalnya, jika Anda memiliki bidang JSON product dengan kunci price dan model, dan ingin menemukan produk dengan model dan harga tertentu yang lebih rendah dari 1.850, gunakan ekspresi filter ini.

    +
    filter='product["model"] == "JSN-087" and product["price"] < 1850'​
    +
    +
    +

    Contoh: Memfilter Bidang Array

    Jika Anda memiliki bidang larik history_temperatures yang berisi catatan suhu, dan ingin menemukan observatorium yang mencatat suhu ke-10 melebihi 23°C, gunakan ekspresi ini.

    +
    filter='history_temperatures[10] > 23'​
    +
    +
    +

    Untuk informasi lebih lanjut mengenai operator dasar ini, lihat Operator Dasar.

    +

    Templat ekspresi penyaringan

    Ketika memfilter menggunakan karakter CJK, pemrosesan dapat menjadi lebih kompleks karena set karakter yang lebih besar dan perbedaan pengodean. Hal ini dapat mengakibatkan kinerja yang lebih lambat, terutama dengan operator IN.

    +

    Milvus memperkenalkan templat ekspresi filter untuk mengoptimalkan kinerja saat bekerja dengan karakter CJK. Dengan memisahkan nilai dinamis dari ekspresi filter, mesin kueri menangani penyisipan parameter dengan lebih efisien.

    +

    Contoh

    Untuk menemukan individu yang berusia di atas 25 tahun yang tinggal di "北京" (Beijing) atau "上海" (Shanghai), gunakan ekspresi templat berikut.

    +
    filter = "age > 25 and city in ['北京', '上海']"​
    +
    +
    +

    Untuk meningkatkan kinerja, gunakan variasi ini dengan parameter.

    +
    filter = "age > {age} and city in {city}",​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    Pendekatan ini mengurangi overhead penguraian dan meningkatkan kecepatan kueri. Untuk informasi lebih lanjut, lihat Filter Templating.

    +

    Operator khusus tipe data

    Milvus menyediakan operator pemfilteran tingkat lanjut untuk tipe data tertentu, seperti bidang JSON, ARRAY, dan VARCHAR.

    +

    Operator khusus bidang JSON

    Milvus menawarkan operator tingkat lanjut untuk menanyakan bidang JSON, memungkinkan pemfilteran yang tepat dalam struktur JSON yang kompleks.

    +

    JSON_CONTAINS(identifier, jsonExpr): Memeriksa apakah sebuah ekspresi JSON ada di dalam field.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains(tags, "sale")'​
    +
    +
    +

    JSON_CONTAINS_ALL(identifier, jsonExpr): Memastikan semua elemen dari ekspresi JSON ada.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter='json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    JSON_CONTAINS_ANY(identifier, jsonExpr): Memfilter entitas yang setidaknya memiliki satu elemen dalam ekspresi JSON.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    Untuk detail lebih lanjut tentang operator JSON, lihat Operator JSON.

    +

    Operator khusus bidang ARRAY

    Milvus menyediakan operator pemfilteran tingkat lanjut untuk bidang larik, seperti ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY, dan ARRAY_LENGTH, yang memungkinkan kontrol yang lebih baik atas data larik.

    +

    ARRAY_CONTAINS: Memfilter entitas yang mengandung elemen tertentu.

    +
    filter="ARRAY_CONTAINS(history_temperatures, 23)"​
    +
    +
    +

    ARRAY_CONTAINS_ALL: Memfilter entitas di mana semua elemen dalam daftar ada.

    +
    filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_CONTAINS_ANY: Menyaring entitas yang berisi elemen apa pun dari daftar.

    +
    filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_LENGTH: Memfilter berdasarkan panjang larik.

    +
    filter="ARRAY_LENGTH(history_temperatures) < 10"​
    +
    +
    +

    Untuk detail lebih lanjut tentang operator larik, lihat Operator Larik.

    +

    Operator khusus bidang VARCHAR

    Operator Text_Match memungkinkan pengambilan dokumen yang tepat berdasarkan istilah kueri tertentu. Operator ini sangat berguna untuk pencarian terfilter yang menggabungkan filter skalar dengan pencarian kemiripan vektor. Tidak seperti pencarian semantik, Pencocokan Teks berfokus pada kemunculan istilah yang tepat.

    +

    Milvus menggunakan Tantivy untuk mendukung pengindeksan terbalik dan pencarian teks berbasis istilah. Prosesnya melibatkan.

    +
      +
    1. Penganalisis: Memberi tanda dan memproses teks masukan.

    2. +
    3. Pengindeksan: Membuat indeks terbalik yang memetakan token unik ke dokumen.

    4. +
    +

    Untuk lebih jelasnya, lihat Pencocokan Teks.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.json b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.json new file mode 100644 index 000000000..0b9517a78 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.json @@ -0,0 +1 @@ +{"codeList":["filter = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.search(​\n \"hello_milvus\",​\n vectors[:nq],​\n filter=expr,​\n limit=10,​\n output_fields=[\"age\", \"city\"],​\n search_params={\"metric_type\": \"COSINE\", \"params\": {\"search_list\": 100}},​\n filter_params=filter_params,​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.query(​\n \"hello_milvus\",​\n filter=expr,​\n output_fields=[\"age\", \"city\"],​\n filter_params=filter_params​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.delete(​\n \"hello_milvus\",​\n filter=expr,​\n filter_params=filter_params​\n)​\n\n"],"headingContent":"Filter Templating​","anchorList":[{"label":"Templating Filter","href":"Filter-Templating​","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview​","type":2,"isActive":false},{"label":"Operasi Pencarian","href":"Search-Operations​","type":2,"isActive":false},{"label":"Operasi Kueri","href":"Query-Operations​","type":2,"isActive":false},{"label":"Operasi Penghapusan","href":"Delete-Operations​","type":2,"isActive":false},{"label":"Kesimpulan","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.md b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.md new file mode 100644 index 000000000..a5242f9e8 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/filtering-templating.md @@ -0,0 +1,155 @@ +--- +id: filtering-templating.md +summary: >- + Dalam Milvus, ekspresi filter yang kompleks dengan banyak elemen, terutama + yang melibatkan karakter non-ASCII seperti karakter CJK, dapat secara + signifikan mempengaruhi kinerja kueri. Untuk mengatasi hal ini, Milvus + memperkenalkan mekanisme templating ekspresi filter yang dirancang untuk + meningkatkan efisiensi dengan mengurangi waktu yang dihabiskan untuk mengurai + ekspresi kompleks. Halaman ini menjelaskan penggunaan templating ekspresi + filter dalam operasi pencarian, kueri, dan hapus. +title: Penyaringan Templating +--- +

    Templating Filter

    Dalam Milvus, ekspresi filter yang kompleks dengan banyak elemen, terutama yang melibatkan karakter non-ASCII seperti karakter CJK, dapat secara signifikan mempengaruhi kinerja kueri. Untuk mengatasi hal ini, Milvus memperkenalkan mekanisme templating ekspresi filter yang dirancang untuk meningkatkan efisiensi dengan mengurangi waktu yang dihabiskan untuk mengurai ekspresi kompleks. Halaman ini menjelaskan penggunaan templating ekspresi filter dalam operasi pencarian, kueri, dan hapus.

    +

    Ikhtisar

    Templat ekspresi filter memungkinkan Anda membuat ekspresi filter dengan penampung, yang dapat diganti secara dinamis dengan nilai selama eksekusi kueri. Dengan menggunakan templating, Anda dapat menghindari penyematan larik besar atau ekspresi kompleks secara langsung ke dalam filter, sehingga mengurangi waktu penguraian dan meningkatkan kinerja kueri.

    +

    Katakanlah Anda memiliki ekspresi filter yang melibatkan dua bidang, age dan city, dan Anda ingin menemukan semua orang yang usianya lebih besar dari 25 tahun dan tinggal di "北京" (Beijing) atau "上海" (Shanghai). Alih-alih secara langsung menyematkan nilai dalam ekspresi filter, Anda dapat menggunakan templat.

    +
    filter = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    Di sini, {age} dan {city} adalah placeholder yang akan diganti dengan nilai aktual di filter_params ketika kueri dijalankan.

    +

    Menggunakan templating ekspresi filter di Milvus memiliki beberapa keuntungan utama.

    +
      +
    • Mengurangi Waktu Penguraian: Dengan mengganti ekspresi filter yang besar atau kompleks dengan placeholder, sistem menghabiskan lebih sedikit waktu untuk mengurai dan memproses filter.

    • +
    • Peningkatan Kinerja Kueri: Dengan berkurangnya waktu penguraian, performa kueri meningkat, sehingga menghasilkan QPS yang lebih tinggi dan waktu respons yang lebih cepat.

    • +
    • Skalabilitas: Seiring bertambahnya set data Anda dan ekspresi filter menjadi lebih kompleks, templating memastikan kinerja tetap efisien dan dapat diskalakan.

    • +
    +

    Operasi Pencarian

    Untuk operasi pencarian di Milvus, ekspresi filter digunakan untuk mendefinisikan kondisi pemfilteran, dan parameter filter_params digunakan untuk menentukan nilai untuk penampung. Kamus filter_params berisi nilai-nilai dinamis yang akan digunakan Milvus untuk menggantikan ekspresi penyaringan.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.search(​
    +    "hello_milvus",​
    +    vectors[:nq],​
    +    filter=expr,​
    +    limit=10,​
    +    output_fields=["age", "city"],​
    +    search_params={"metric_type": "COSINE", "params": {"search_list": 100}},​
    +    filter_params=filter_params,​
    +)​
    +
    +
    +

    Dalam contoh ini, Milvus akan secara dinamis mengganti {age} dengan 25 dan {city} dengan ["北京", "上海"] ketika menjalankan pencarian.

    +

    Operasi Kueri

    Mekanisme templating yang sama dapat diterapkan pada operasi kueri di Milvus. Pada fungsi query, Anda mendefinisikan ekspresi filter dan menggunakan filter_params untuk menentukan nilai yang akan diganti.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.query(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    output_fields=["age", "city"],​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    Dengan menggunakan filter_params, Milvus secara efisien menangani penyisipan nilai secara dinamis, sehingga meningkatkan kecepatan eksekusi kueri.

    +

    Operasi Penghapusan

    Anda juga dapat menggunakan templating ekspresi filter dalam operasi penghapusan. Mirip dengan pencarian dan kueri, ekspresi filter mendefinisikan kondisi, dan filter_params menyediakan nilai dinamis untuk placeholder.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.delete(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    Pendekatan ini meningkatkan kinerja operasi penghapusan, terutama saat menangani kondisi filter yang kompleks.

    +

    Kesimpulan

    Templating ekspresi filter adalah alat yang penting untuk mengoptimalkan kinerja kueri di Milvus. Dengan menggunakan placeholder dan kamus filter_params, Anda dapat secara signifikan mengurangi waktu yang dihabiskan untuk mem-parsing ekspresi filter yang kompleks. Hal ini akan menghasilkan eksekusi kueri yang lebih cepat dan kinerja yang lebih baik secara keseluruhan.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.json b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.json new file mode 100644 index 000000000..a793e8710 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.json @@ -0,0 +1 @@ +{"codeList":["# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter = 'json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n"],"headingContent":"JSON Operators​","anchorList":[{"label":"Operator JSON","href":"JSON-Operators​","type":1,"isActive":false},{"label":"Operator JSON yang Tersedia","href":"Available-JSON-Operators​","type":2,"isActive":false},{"label":"JSON_CONTAINS","href":"JSONCONTAINS​","type":2,"isActive":false},{"label":"JSON_CONTAINS_ALL","href":"JSONCONTAINSALL​","type":2,"isActive":false},{"label":"JSON_COTAINS_ANY","href":"JSONCOTAINSANY​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.md b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.md new file mode 100644 index 000000000..a3551a2a4 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/boolean/json-operators.md @@ -0,0 +1,122 @@ +--- +id: json-operators.md +summary: >- + Milvus mendukung operator tingkat lanjut untuk melakukan kueri dan memfilter + bidang JSON, menjadikannya sempurna untuk mengelola data yang kompleks dan + terstruktur. Operator-operator ini memungkinkan kueri yang sangat efektif pada + dokumen JSON, memungkinkan Anda untuk mengambil entitas berdasarkan elemen, + nilai, atau kondisi tertentu di dalam bidang JSON. Bagian ini akan memandu + Anda dalam menggunakan operator khusus JSON di Milvus, dengan memberikan + contoh-contoh praktis untuk mengilustrasikan fungsionalitasnya. +title: Operator JSON +--- +

    Operator JSON

    Milvus mendukung operator tingkat lanjut untuk melakukan kueri dan memfilter bidang JSON, menjadikannya sempurna untuk mengelola data yang kompleks dan terstruktur. Operator-operator ini memungkinkan kueri yang sangat efektif untuk dokumen JSON, memungkinkan Anda untuk mengambil entitas berdasarkan elemen, nilai, atau kondisi tertentu di dalam bidang JSON. Bagian ini akan memandu Anda dalam menggunakan operator khusus JSON di Milvus, dengan memberikan contoh-contoh praktis untuk mengilustrasikan fungsionalitasnya.

    +
    +

    Field JSON tidak dapat menangani struktur bersarang yang kompleks dan memperlakukan semua struktur bersarang sebagai string biasa. Oleh karena itu, ketika bekerja dengan bidang JSON, disarankan untuk menghindari penumpukan yang terlalu dalam dan memastikan bahwa struktur data Anda serata mungkin untuk kinerja yang optimal.

    +
    +

    Operator JSON yang Tersedia

    Milvus menyediakan beberapa operator JSON yang kuat untuk membantu memfilter dan meminta data JSON, dan operator-operator tersebut adalah.

    + +

    Mari kita jelajahi operator ini dengan contoh untuk melihat bagaimana operator ini dapat diterapkan dalam skenario dunia nyata.

    +

    JSON_CONTAINS

    Operator json_contains memeriksa apakah elemen atau sub-larik tertentu ada di dalam bidang JSON. Operator ini berguna ketika Anda ingin memastikan bahwa larik atau objek JSON berisi nilai tertentu.

    +

    Contoh

    +

    Bayangkan Anda memiliki koleksi produk, masing-masing dengan bidang tags yang berisi larik JSON berisi string, seperti ["electronics", "sale", "new"]. Anda ingin memfilter produk yang memiliki tag "sale".

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains(tags, "sale")'​
    +
    +
    +

    Dalam contoh ini, Milvus akan mengembalikan semua produk yang bidang tags berisi elemen "sale".

    +

    JSON_CONTAINS_ALL

    Operator json_contains_all memastikan bahwa semua elemen dari ekspresi JSON yang ditentukan ada di bidang target. Operator ini sangat berguna ketika Anda perlu mencocokkan beberapa nilai dalam larik JSON.

    +

    Contoh

    +

    Melanjutkan skenario tag produk, jika Anda ingin menemukan semua produk yang memiliki tag "electronics", "sale", dan "new", Anda dapat menggunakan operator json_contains_all.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter = 'json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    Kueri ini akan mengembalikan semua produk yang larik tags berisi ketiga elemen yang ditentukan: "electronics", "sale", dan "new".

    +

    JSON_COTAINS_ANY

    Operator json_contains_any menyaring entitas di mana setidaknya satu anggota ekspresi JSON ada di dalam bidang. Ini berguna ketika Anda ingin mencocokkan entitas berdasarkan salah satu dari beberapa nilai yang mungkin.

    +

    Contoh

    +

    Katakanlah Anda ingin memfilter produk yang memiliki setidaknya salah satu tag "electronics", "sale", atau "new". Anda dapat menggunakan operator json_contains_any untuk mencapai hal ini.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    Dalam hal ini, Milvus akan mengembalikan semua produk yang memiliki setidaknya salah satu tag dalam daftar ["electronics", "new", "clearance"]. Meskipun sebuah produk hanya memiliki salah satu dari tag tersebut, produk tersebut akan disertakan dalam hasil pencarian.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.json b/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.json new file mode 100644 index 000000000..31af9b765 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.json @@ -0,0 +1 @@ +{"codeList":["dataCoord:\n compaction:\n clustering:\n enable: true \n autoEnable: false \n triggerInterval: 600 \n minInterval: 3600 \n maxInterval: 259200 \n newDataSizeThreshold: 512m \n timeout: 7200\n \nqueryNode:\n enableSegmentPrune: true \n\ndatanode:\n clusteringCompaction:\n memoryBufferRatio: 0.1 \n workPoolSize: 8 \ncommon:\n usePartitionKeyAsClusteringKey: true \n","default_fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n FieldSchema(name=\"key\", dtype=DataType.INT64, is_clustering_key=True),\n FieldSchema(name=\"var\", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),\n FieldSchema(name=\"embeddings\", dtype=DataType.FLOAT_VECTOR, dim=dim)\n]\n\ndefault_schema = CollectionSchema(\n fields=default_fields, \n description=\"test clustering-key collection\"\n)\n\ncoll1 = Collection(name=\"clustering_test\", schema=default_schema)\n","coll1.compact(is_clustering=True)\ncoll1.get_compaction_state(is_clustering=True)\ncoll1.wait_for_compaction_completed(is_clustering=True)\n"],"headingContent":"Clustering Compaction","anchorList":[{"label":"Pemadatan Pengelompokan","href":"Clustering-Compaction","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview","type":2,"isActive":false},{"label":"Gunakan Pemadatan Pengelompokan","href":"Use-Clustering-Compaction","type":2,"isActive":false},{"label":"Memicu Pemadatan Pengelompokan","href":"Trigger-Clustering-Compaction","type":2,"isActive":false},{"label":"Praktik terbaik","href":"Best-practices","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.md b/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.md new file mode 100644 index 000000000..f9f6a9e0a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/clustering-compaction.md @@ -0,0 +1,273 @@ +--- +id: clustering-compaction.md +title: Pemadatan Pengelompokan +related_key: 'clustering, compaction' +summary: >- + Pemadatan pengelompokan dirancang untuk meningkatkan kinerja pencarian dan + mengurangi biaya dalam koleksi besar. Panduan ini akan membantu Anda memahami + pemadatan pengelompokan dan bagaimana fitur ini dapat meningkatkan kinerja + pencarian. +--- +

    Pemadatan Pengelompokan

    Pemadatan pengelompokan dirancang untuk meningkatkan kinerja pencarian dan mengurangi biaya dalam koleksi yang besar. Panduan ini akan membantu Anda memahami pemadatan pengelompokan dan bagaimana fitur ini dapat meningkatkan kinerja pencarian.

    +

    Ikhtisar

    Milvus menyimpan entitas yang masuk dalam segmen di dalam koleksi dan menutup segmen jika sudah penuh. Jika hal ini terjadi, sebuah segmen baru dibuat untuk mengakomodasi entitas tambahan. Akibatnya, entitas didistribusikan secara acak di seluruh segmen. Distribusi ini mengharuskan Milvus untuk mencari beberapa segmen untuk menemukan tetangga terdekat dengan vektor kueri yang diberikan.

    +

    + + Without clustering Compaction + Tanpa Pemadatan Pengelompokan

    +

    Jika Milvus dapat mendistribusikan entitas di antara segmen berdasarkan nilai di bidang tertentu, cakupan pencarian dapat dibatasi dalam satu segmen, sehingga meningkatkan kinerja pencarian.

    +

    Pemadatan Clustering adalah fitur di Milvus yang mendistribusikan kembali entitas di antara segmen dalam koleksi berdasarkan nilai dalam bidang skalar. Untuk mengaktifkan fitur ini, pertama-tama Anda harus memilih sebuah bidang skalar sebagai kunci pengelompokan. Hal ini memungkinkan Milvus untuk mendistribusikan ulang entitas ke dalam segmen ketika nilai kunci pengelompokannya berada dalam rentang tertentu. Ketika Anda memicu pemadatan pengelompokan, Milvus membuat/memperbaharui indeks global yang disebut PartitionStats, yang mencatat hubungan pemetaan antara segmen dan nilai kunci pengelompokan.

    +

    + + With Clustering Compaction + Dengan Pemadatan Pengelompokan

    +

    Dengan menggunakan PartitionStats sebagai referensi, Milvus dapat memangkas data yang tidak relevan setelah menerima permintaan pencarian/kueri yang membawa nilai kunci pengelompokan dan membatasi cakupan pencarian dalam pemetaan segmen ke nilai tersebut, sehingga meningkatkan kinerja pencarian. Untuk detail tentang peningkatan kinerja, lihat Tes tolok ukur.

    +

    Gunakan Pemadatan Pengelompokan

    Fitur Pemadatan Klaster di Milvus sangat mudah dikonfigurasi. Anda dapat memilih untuk memicunya secara manual atau mengaturnya untuk dipicu secara otomatis pada interval tertentu oleh Milvus. Untuk mengaktifkan pemadatan pengelompokan, lakukan hal berikut:

    +

    Konfigurasi Global

    Anda perlu memodifikasi file konfigurasi Milvus Anda seperti yang ditunjukkan di bawah ini.

    +
    dataCoord:
    +  compaction:
    +    clustering:
    +      enable: true 
    +      autoEnable: false 
    +      triggerInterval: 600 
    +      minInterval: 3600 
    +      maxInterval: 259200 
    +      newDataSizeThreshold: 512m 
    +      timeout: 7200
    +     
    +queryNode:
    +  enableSegmentPrune: true 
    +
    +datanode:
    +  clusteringCompaction:
    +    memoryBufferRatio: 0.1 
    +    workPoolSize: 8  
    +common:
    +  usePartitionKeyAsClusteringKey: true 
    +
    +
      +
    • dataCoord.compaction.clustering

      + + + + + + + + + + + + + +
      Item KonfigurasiDeskripsiNilai Default
      enableMenentukan apakah akan mengaktifkan pemadatan pengelompokan.
      Setel ini ke true jika Anda perlu mengaktifkan fitur ini untuk setiap koleksi yang memiliki kunci pengelompokan.
      false
      autoEnableMenentukan apakah akan mengaktifkan pemadatan yang dipicu secara otomatis.
      Mengatur ini ke true mengindikasikan bahwa Milvus akan memadatkan koleksi yang memiliki kunci pengelompokan pada interval yang ditentukan.
      false
      triggerIntervalMenentukan interval dalam milidetik saat Milvus memulai pemadatan pengelompokan.
      Parameter ini hanya berlaku jika autoEnable diatur ke true.
      -
      minIntervalMenentukan interval minimum dalam detik.
      Parameter ini hanya berlaku jika autoEnable diatur ke true.
      Mengaturnya ke bilangan bulat yang lebih besar dari triggerInterval akan membantu menghindari pemadatan berulang dalam waktu singkat.
      -
      maxIntervalMenentukan interval maksimum dalam detik.
      Parameter ini hanya berlaku jika autoEnable diatur ke true.
      Ketika Milvus mendeteksi bahwa sebuah koleksi belum dipadatkan secara klaster untuk durasi yang lebih lama dari nilai ini, maka Milvus akan memaksa pemadatan klaster.
      -
      newDataSizeThresholdMenentukan ambang batas atas untuk memicu pemadatan pengelompokan.
      Parameter ini hanya berlaku jika autoEnable disetel ke true.
      Setelah Milvus mendeteksi bahwa volume data dalam koleksi melebihi nilai ini, Milvus akan memulai proses pemadatan pengelompokan.
      -
      timeoutMenentukan durasi batas waktu untuk pemadatan pengelompokan.
      Pemadatan clustering akan gagal jika waktu eksekusinya melebihi nilai ini.
      -
      +
    • +
    • queryNode

      + + + + + + + +
      Item KonfigurasiDeskripsiNilai Default
      enableSegmentPruneMenentukan apakah Milvus memangkas data dengan merujuk ke PartitionStats saat menerima permintaan pencarian/kueri.
      Mengatur ini ke true memungkinkan Milvus memangkas data yang tidak relevan dari segmen selama permintaan pencarian/kueri.
      false
      +
    • +
    • dataNode.clusteringCompaction

      + + + + + + + + +
      Item KonfigurasiDeskripsiNilai Default
      memoryBufferRatioMenentukan rasio buffer memori untuk tugas pemadatan pengelompokan.
      Milvus akan memangkas data ketika ukuran data melebihi ukuran buffer yang dialokasikan yang dihitung menggunakan rasio ini.
      -
      workPoolSizeMenentukan ukuran kumpulan pekerja untuk tugas pemadatan pengelompokan.-
      +
    • +
    • common

      + + + + + + + +
      Item KonfigurasiDeskripsiNilai Default
      usePartitionKeyAsClusteringKeyMenentukan apakah akan menggunakan kunci partisi dalam koleksi sebagai kunci pengelompokan.
      Mengatur ini ke true mengindikasikan bahwa kunci partisi digunakan sebagai kunci pengelompokan.
      Anda selalu dapat mengganti pengaturan ini dalam koleksi dengan mengatur kunci pengelompokan secara eksplisit.
      false
      +
    • +
    +

    Untuk menerapkan perubahan di atas pada kluster Milvus Anda, silakan ikuti langkah-langkah di Konfigurasi Milvus dengan Helm dan Konfigurasi Milvus dengan Operator Milvus.

    +

    Konfigurasi Koleksi

    Untuk pemadatan klaster dalam koleksi tertentu, Anda harus memilih sebuah bidang skalar dari koleksi sebagai kunci klaster.

    +
    default_fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +    FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
    +    FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
    +    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
    +]
    +
    +default_schema = CollectionSchema(
    +    fields=default_fields, 
    +    description="test clustering-key collection"
    +)
    +
    +coll1 = Collection(name="clustering_test", schema=default_schema)
    +
    +
    +

    Anda dapat menggunakan bidang skalar dari tipe data berikut ini sebagai kunci pengelompokan: Int8, Int16, Int32, Int64, Float, Double, dan VarChar.

    +
    +

    Memicu Pemadatan Pengelompokan

    Jika Anda telah mengaktifkan pemadatan pengelompokan otomatis, Milvus secara otomatis memicu pemadatan pada interval yang ditentukan. Atau, Anda dapat memicu pemadatan secara manual sebagai berikut:

    +
    coll1.compact(is_clustering=True)
    +coll1.get_compaction_state(is_clustering=True)
    +coll1.wait_for_compaction_completed(is_clustering=True)
    +
    +

    Uji Tolok Ukur

    Volume data dan pola kueri yang digabungkan menentukan peningkatan kinerja yang dapat dihasilkan oleh pemadatan klaster. Uji tolok ukur internal menunjukkan bahwa pemadatan pengelompokan menghasilkan peningkatan hingga 25 kali lipat dalam kueri per detik (QPS).

    +

    Uji tolok ukur dilakukan pada koleksi yang berisi entitas dari kumpulan data LAION sebanyak 20 juta, 768 dimensi dengan bidang kunci yang ditetapkan sebagai kunci pengelompokan. Setelah pemadatan clustering dipicu dalam koleksi, pencarian secara bersamaan dikirim hingga penggunaan CPU mencapai level tertinggi.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Filter PencarianRasio PemangkasanLatensi (ms)QPS (permintaan / s)
    Rata-rataMinMaksMedianTP99
    Tidak ada0%168567222941710229117.75
    kunci > 200 dan kunci < 80040.2%10454718281085161728.38
    kunci > 200 dan kunci < 60059.8%829451483882130335.78
    kunci > 200 dan kunci < 40079.5%55010098558489854.00
    kunci == 100099%6824127370246431.41
    +

    Ketika rentang pencarian menyempit dalam filter pencarian, rasio pemangkasan meningkat. Ini berarti lebih banyak entitas yang dilewati selama proses pencarian. Ketika membandingkan statistik di baris pertama dan terakhir, Anda dapat melihat bahwa pencarian tanpa pemadatan pengelompokan memerlukan pemindaian seluruh koleksi. Di sisi lain, pencarian dengan pemadatan pengelompokan menggunakan kunci tertentu dapat mencapai peningkatan hingga 25 kali lipat.

    +

    Praktik terbaik

    Berikut ini beberapa kiat agar Anda dapat menggunakan pemadatan pengelompokan secara efisien:

    +
      +
    • Aktifkan ini untuk koleksi dengan volume data yang besar. Performa pencarian meningkat dengan volume data yang lebih besar dalam koleksi. Ini adalah pilihan yang baik untuk mengaktifkan fitur ini untuk koleksi dengan lebih dari 1 juta entitas.

    • +
    • Pilih kunci pengelompokan yang tepat: Anda dapat menggunakan bidang skalar yang biasa digunakan sebagai kondisi pemfilteran sebagai kunci pengelompokan. Untuk koleksi yang menyimpan data dari beberapa penyewa, Anda dapat menggunakan bidang yang membedakan satu penyewa dengan penyewa lainnya sebagai kunci pengelompokan.

    • +
    • Gunakan kunci partisi sebagai kunci pengelompokan. Anda dapat mengatur common.usePartitionKeyAsClusteringKey ke true jika Anda ingin mengaktifkan fitur ini untuk semua koleksi di instance Milvus Anda atau jika Anda masih menghadapi masalah kinerja dalam koleksi besar dengan kunci partisi. Dengan demikian, Anda akan memiliki kunci pengelompokan dan kunci partisi ketika Anda memilih sebuah field skalar dalam koleksi sebagai kunci partisi.

      +

      Perhatikan bahwa pengaturan ini tidak menghalangi Anda untuk memilih bidang skalar lain sebagai kunci pengelompokan. Kunci pengelompokan yang ditetapkan secara eksplisit selalu diutamakan.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.json b/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.json new file mode 100644 index 000000000..0f1b39616 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.json @@ -0,0 +1 @@ +{"codeList":["client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Strong\",​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n // highlight-next​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isClusteringKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n​\nexport params='{​\n \"consistencyLevel\": \"Strong\"​\n}'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","res = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-start​\n consistency_level=\"Bounded\",​\n # highlight-next​\n)​\n\n","SearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .searchParams(params)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"limit\": 3,​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n\n","res = client.query(​\n collection_name=\"my_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3,​\n # highlight-start​\n consistency_level=\"Eventually\",​\n # highlight-next​\n)​\n\n","QueryReq queryReq = QueryReq.builder()​\n .collectionName(\"my_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .consistencyLevel(ConsistencyLevel.EVENTUALLY)​\n .build();​\n ​\n QueryResp getResp = client.query(queryReq);​\n\n"],"headingContent":"Consistency Level​","anchorList":[{"label":"Tingkat Konsistensi","href":"Consistency-Level​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Mengatur Tingkat Konsistensi","href":"Set-Consistency-Level​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.md b/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.md new file mode 100644 index 000000000..50fc0055b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/consistency.md @@ -0,0 +1,211 @@ +--- +id: consistency.md +summary: Pelajari tentang empat tingkat konsistensi dalam Milvus. +title: Konsistensi +--- +

    Tingkat Konsistensi

    Sebagai basis data vektor terdistribusi, Milvus menawarkan beberapa tingkat konsistensi untuk memastikan bahwa setiap node atau replika dapat mengakses data yang sama selama operasi baca dan tulis. Saat ini, tingkat konsistensi yang didukung meliputi Strong, Bounded, Eventually, dan Session, dengan Bounded sebagai tingkat konsistensi default yang digunakan.

    +

    Gambaran Umum

    Milvus adalah sebuah sistem yang memisahkan penyimpanan dan komputasi. Dalam sistem ini, DataNodes bertanggung jawab atas persistensi data dan pada akhirnya menyimpannya dalam penyimpanan objek terdistribusi seperti MinIO/S3. QueryNodes menangani tugas-tugas komputasi seperti Pencarian. Tugas-tugas ini melibatkan pemrosesan data batch dan data streaming. Sederhananya, data batch dapat dipahami sebagai data yang telah disimpan dalam penyimpanan objek sementara data streaming mengacu pada data yang belum disimpan dalam penyimpanan objek. Karena latensi jaringan, QueryNode sering kali tidak menyimpan data streaming terbaru. Tanpa perlindungan tambahan, melakukan Pencarian secara langsung pada data streaming dapat mengakibatkan hilangnya banyak titik data yang tidak tersimpan, sehingga mempengaruhi akurasi hasil pencarian.

    +

    Milvus adalah sebuah sistem yang memisahkan penyimpanan dan komputasi. Dalam sistem ini, DataNodes bertanggung jawab atas persistensi data dan pada akhirnya menyimpannya dalam penyimpanan objek terdistribusi seperti MinIO/S3. QueryNodes menangani tugas-tugas komputasi seperti Pencarian. Tugas-tugas ini melibatkan pemrosesan data batch dan data streaming. Secara sederhana, data batch dapat dipahami sebagai data yang telah disimpan dalam penyimpanan objek, sedangkan data streaming mengacu pada data yang belum disimpan dalam penyimpanan objek. Karena latensi jaringan, QueryNode sering kali tidak menyimpan data streaming terbaru. Tanpa perlindungan tambahan, melakukan Pencarian secara langsung pada data streaming dapat mengakibatkan hilangnya banyak titik data yang belum tersimpan, sehingga memengaruhi keakuratan hasil pencarian.

    +

    + + Batch data and streaming data + Data batch dan data streaming

    +

    Seperti yang ditunjukkan pada gambar di atas, QueryNode dapat menerima data streaming dan data batch secara bersamaan setelah menerima permintaan Pencarian. Namun, karena latensi jaringan, data streaming yang diperoleh QueryNodes mungkin tidak lengkap.

    +

    Untuk mengatasi masalah ini, Milvus memberi stempel waktu pada setiap catatan dalam antrean data dan secara terus menerus memasukkan stempel waktu sinkronisasi ke dalam antrean data. Setiap kali cap waktu sinkronisasi (syncTs) diterima, QueryNodes menetapkannya sebagai ServiceTime, yang berarti bahwa QueryNodes dapat melihat semua data sebelum Service Time tersebut. Berdasarkan ServiceTime, Milvus dapat memberikan stempel waktu jaminan (GuaranteeTs) untuk memenuhi kebutuhan pengguna yang berbeda untuk konsistensi dan ketersediaan. Pengguna dapat memberi tahu QueryNodes tentang kebutuhan untuk memasukkan data sebelum titik waktu tertentu dalam cakupan pencarian dengan menentukan GuaranteeTs dalam permintaan Pencarian mereka.

    +

    + + ServiceTime and GuaranteeTs + ServiceTime dan GuaranteeTs

    +

    Seperti yang ditunjukkan pada gambar di atas, jika GuaranteeTs kurang dari ServiceTime, itu berarti bahwa semua data sebelum titik waktu yang ditentukan telah sepenuhnya ditulis ke disk, yang memungkinkan QueryNodes untuk segera melakukan operasi Pencarian. Ketika GuaranteeTs lebih besar dari ServiceTime, QueryNodes harus menunggu sampai ServiceTime melebihi GuaranteeTs sebelum dapat menjalankan operasi Pencarian.

    +

    Pengguna harus membuat trade-off antara akurasi kueri dan latensi kueri. Jika pengguna memiliki persyaratan konsistensi yang tinggi dan tidak sensitif terhadap latensi kueri, mereka dapat mengatur GuaranteeTs ke nilai sebesar mungkin; jika pengguna ingin menerima hasil pencarian dengan cepat dan lebih toleran terhadap akurasi kueri, maka GuaranteeTs dapat diatur ke nilai yang lebih kecil.

    +

    + + Consistency Levels Illustrated + Ilustrasi Tingkat Konsistensi

    +

    Milvus menyediakan empat jenis tingkat konsistensi dengan nilai GuaranteeT yang berbeda.

    +
      +
    • Kuat

      +

      Cap waktu terbaru digunakan sebagai GuaranteeTs, dan QueryNode harus menunggu hingga ServiceTime memenuhi GuaranteeTs sebelum mengeksekusi permintaan Pencarian.

    • +
    • Akhirnya

      +

      GuaranteeTs disetel ke nilai yang sangat kecil, seperti 1, untuk menghindari pemeriksaan konsistensi sehingga QueryNode dapat segera mengeksekusi permintaan Pencarian pada semua data batch.

    • +
    • Keusangan Terbatas

      +

      JaminanTs diatur ke titik waktu yang lebih awal dari stempel waktu terbaru untuk membuat QueryNode melakukan pencarian dengan toleransi kehilangan data tertentu.

    • +
    • Sesi

      +

      Titik waktu terakhir di mana klien memasukkan data digunakan sebagai JaminanTs sehingga QueryNodes dapat melakukan pencarian pada semua data yang dimasukkan oleh klien.

    • +
    +

    Milvus menggunakan Bounded Staleness sebagai tingkat konsistensi default. Jika GuaranteeTs tidak ditentukan, maka ServiceTime terakhir digunakan sebagai GuaranteeTs.

    +

    Mengatur Tingkat Konsistensi

    Anda dapat mengatur tingkat konsistensi yang berbeda saat membuat koleksi serta melakukan pencarian dan kueri.

    +

    Mengatur Tingkat Konsistensi saat Membuat Koleksi

    Saat membuat koleksi, Anda dapat mengatur tingkat konsistensi untuk pencarian dan kueri di dalam koleksi. Contoh kode berikut ini menetapkan tingkat konsistensi ke Strong.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Strong",​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .collectionSchema(schema)​
    +        // highlight-next​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isClusteringKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +​
    +export params='{​
    +    "consistencyLevel": "Strong"​
    +}'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_collection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Nilai yang mungkin untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

    +

    Mengatur Tingkat Konsistensi dalam Pencarian

    Anda selalu dapat mengubah tingkat konsistensi untuk pencarian tertentu. Contoh kode berikut ini menetapkan tingkat konsistensi kembali ke Bounded. Perubahan ini hanya berlaku untuk permintaan pencarian saat ini.

    + +
    res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-start​
    +    consistency_level="Bounded",​
    +    # highlight-next​
    +)​
    +
    +
    +
    SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .searchParams(params)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "limit": 3,​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +
    +
    +

    Parameter ini juga tersedia di pencarian hibrida dan iterator pencarian. Nilai yang memungkinkan untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

    +

    Mengatur Tingkat Konsistensi dalam Kueri

    Anda selalu dapat mengubah tingkat konsistensi untuk pencarian tertentu. Contoh kode berikut ini menetapkan tingkat konsistensi ke Akhirnya. Pengaturan ini hanya berlaku untuk permintaan kueri saat ini.

    + +
    res = client.query(​
    +    collection_name="my_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3,​
    +    # highlight-start​
    +    consistency_level="Eventually",​
    +    # highlight-next​
    +)​
    +
    +
    +
    QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("my_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .consistencyLevel(ConsistencyLevel.EVENTUALLY)​
    +        .build();​
    +        ​
    + QueryResp getResp = client.query(queryReq);​
    +
    +
    +

    Parameter ini juga tersedia di pengulang kueri. Nilai yang mungkin untuk parameter consistency_level adalah Strong, Bounded, Eventually, dan Session.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.json new file mode 100644 index 000000000..dff2abf42 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\", \"likes\": 165},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\", \"likes\": 25},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\", \"likes\": 764},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\", \"likes\": 234},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\", \"likes\": 122},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\", \"likes\": 12},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\", \"likes\": 58},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\", \"likes\": 775},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\", \"likes\": 876},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\", \"likes\": 765}​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\" and likes > 50',​\n output_fields=[\"color\", \"likes\"]​\n # highlight-end​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"filtered_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .filter(\"color like \\\"red%\\\" and likes > 50\")​\n .outputFields(Arrays.asList(\"color\", \"likes\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​\n\n","import (​\n \"context\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_filter() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"filtered_search_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithFilter(`color like \"red%\" and likes > 50`).WithOutputFields(\"color\", \"likes\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nconst res = await client.search({​\n collection_name: \"filtered_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: 'color like \"red%\" and likes > 50',​\n output_fields: [\"color\", \"likes\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\", \"likes\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Filtered Search​","anchorList":[{"label":"Pencarian yang Difilter","href":"Filtered-Search​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Contoh","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.md new file mode 100644 index 000000000..3652218bc --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/filtered-search.md @@ -0,0 +1,258 @@ +--- +id: filtered-search.md +title: Pencarian yang Difilter +related_key: 'ann search, filtered search' +summary: >- + Pencarian ANN menemukan penyematan vektor yang paling mirip dengan penyematan + vektor yang ditentukan. Namun, hasil pencarian mungkin tidak selalu benar. + Anda dapat menyertakan kondisi pemfilteran dalam permintaan pencarian sehingga + Milvus melakukan pemfilteran metadata sebelum melakukan pencarian ANN, + sehingga mengurangi cakupan pencarian dari seluruh koleksi menjadi hanya + entitas yang sesuai dengan kondisi pemfilteran yang ditentukan. +--- +

    Pencarian yang Difilter

    Pencarian ANN menemukan penyematan vektor yang paling mirip dengan penyematan vektor yang ditentukan. Namun, hasil pencarian mungkin tidak selalu benar. Anda dapat menyertakan kondisi pemfilteran dalam permintaan pencarian sehingga Milvus melakukan pemfilteran metadata sebelum melakukan pencarian ANN, sehingga mengurangi cakupan pencarian dari seluruh koleksi menjadi hanya entitas yang sesuai dengan kondisi pemfilteran yang ditentukan.

    +

    Gambaran Umum

    Jika sebuah koleksi berisi penyematan vektor dan metadatanya, Anda dapat memfilter metadata sebelum melakukan pencarian ANN untuk meningkatkan relevansi hasil pencarian. Setelah Milvus menerima permintaan pencarian yang mengandung kondisi pemfilteran, Milvus akan membatasi cakupan pencarian di dalam entitas yang sesuai dengan kondisi pemfilteran yang ditentukan.

    +

    + + Filtered search + Pencarian yang difilter

    +

    Seperti yang ditunjukkan pada diagram di atas, permintaan pencarian membawa chunk like % red % sebagai kondisi pemfilteran, yang menunjukkan bahwa Milvus harus melakukan pencarian ANN di dalam semua entitas yang memiliki kata red di bidang chunk. Secara khusus, Milvus melakukan hal berikut.

    +
      +
    • Menyaring entitas yang sesuai dengan kondisi penyaringan yang dibawa dalam permintaan pencarian.

    • +
    • Melakukan pencarian ANN di dalam entitas yang difilter.

    • +
    • Mengembalikan entitas top-K.

    • +
    +

    Contoh

    Bagian ini mendemonstrasikan cara melakukan pencarian yang difilter. Cuplikan kode di bagian ini mengasumsikan Anda telah memiliki entitas berikut dalam koleksi Anda. Setiap entitas memiliki empat bidang, yaitu id, vektor, warna, dan suka.

    +
    [​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025", "likes": 25},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781", "likes": 764},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298", "likes": 234},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794", "likes": 122},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222", "likes": 12},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392", "likes": 58},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510", "likes": 775},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381", "likes": 876},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976", "likes": 765}​
    +]​
    +
    +
    +

    Permintaan pencarian pada potongan kode berikut ini membawa sebuah kondisi pemfilteran dan beberapa field keluaran.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%" and likes > 50',​
    +    output_fields=["color", "likes"]​
    +    # highlight-end​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("filtered_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .filter("color like \"red%\" and likes > 50")​
    +        .outputFields(Arrays.asList("color", "likes"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​
    +
    +
    +
    import (​
    +    "context"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_filter() {​
    +        ctx, cancel := context.WithCancel(context.Background())​
    +        defer cancel()​
    +​
    +        milvusAddr := "127.0.0.1:19530"​
    +        token := "root:Milvus"​
    +​
    +        cli, err := client.New(ctx, &client.ClientConfig{​
    +                Address: milvusAddr,​
    +                APIKey:  token,​
    +        })​
    +        if err != nil {​
    +                log.Fatal("failed to connect to milvus server: ", err.Error())​
    +        }​
    +​
    +        defer cli.Close(ctx)​
    +​
    +        queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +        resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +                "filtered_search_collection", // collectionName​
    +                3,             // limit​
    +                []entity.Vector{entity.FloatVector(queryVector)},​
    +        ).WithFilter(`color like "red%" and likes > 50`).WithOutputFields("color", "likes"))​
    +        if err != nil {​
    +                log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +        }​
    +​
    +        for _, resultSet := range resultSets {​
    +                log.Println("IDs: ", resultSet.IDs)​
    +                log.Println("Scores: ", resultSet.Scores)​
    +        }​
    +        // Output:​
    +        // IDs:​
    +        // Scores:​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +const res = await client.search({​
    +    collection_name: "filtered_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: 'color like "red%" and likes > 50',​
    +    output_fields: ["color", "likes"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "outputFields": ["color", "likes"]​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    Kondisi pemfilteran yang dibawa dalam permintaan pencarian berbunyi color like "red%" and likes > 50. Ia menggunakan operator and untuk menyertakan dua kondisi: kondisi pertama meminta entitas yang memiliki nilai yang dimulai dengan red pada kolom color, dan kondisi kedua meminta entitas dengan nilai yang lebih besar dari 50 pada kolom likes. Hanya ada dua entitas yang memenuhi persyaratan ini. Dengan setelan top-K ke 3, Milvus akan menghitung jarak antara dua entitas ini ke vektor kueri dan mengembalikannya sebagai hasil pencarian.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    Untuk informasi lebih lanjut tentang operator yang dapat Anda gunakan dalam pemfilteran metadata, lihat Pemfilteran Metadata.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.json new file mode 100644 index 000000000..acbf3e124 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType, Function, FunctionType​\n\nclient = MilvusClient(uri=\"http://localhost:19530\")\n​\nschema = client.create_schema()​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True, auto_id=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .build();\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"sparse\")\n .dataType(DataType.SparseFloatVector)\n .build());\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\nconst schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n\nconsole.log(res.results)\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n","bm25_function = Function(​\n name=\"text_bm25_emb\", # Function name​\n input_field_names=[\"text\"], # Name of the VARCHAR field containing raw text data​\n output_field_names=[\"sparse\"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​\n function_type=FunctionType.BM25,​\n)​\n​\nschema.add_function(bm25_function)​\n\n","import io.milvus.common.clientenum.FunctionType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq.Function;\n\nimport java.util.*;\n\nschema.addFunction(Function.builder()\n .functionType(FunctionType.BM25)\n .name(\"text_bm25_emb\")\n .inputFieldNames(Collections.singletonList(\"text\"))\n .outputFieldNames(Collections.singletonList(\"vector\"))\n .build());\n","const functions = [\n {\n name: 'text_bm25_emb',\n description: 'bm25 function',\n type: FunctionType.BM25,\n input_field_names: ['text'],\n output_field_names: ['vector'],\n params: {},\n },\n];\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ],\n \"functions\": [\n {\n \"name\": \"text_bm25_emb\",\n \"type\": \"BM25\",\n \"inputFieldNames\": [\"text\"],\n \"outputFieldNames\": [\"sparse\"],\n \"params\": {}\n }\n ]\n }'\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_type=\"AUTOINDEX\", ​\n metric_type=\"BM25\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;\n\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"sparse\")\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)\n .metricType(IndexParam.MetricType.BM25)\n .build());\n","const index_params = [\n {\n field_name: \"sparse\",\n metric_type: \"BM25\",\n index_type: \"AUTOINDEX\",\n },\n];\n","export indexParams='[\n {\n \"fieldName\": \"sparse\",\n \"metricType\": \"BM25\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n","client.create_collection(​\n collection_name='demo', ​\n schema=schema, ​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"demo\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","await client.create_collection(\n collection_name: 'demo', \n schema: schema, \n index_params: index_params,\n functions: functions\n);\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"demo\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n","client.insert('demo', [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n])\n\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\n\nimport io.milvus.v2.service.vector.request.InsertReq;\n\nGson gson = new Gson();\nList rows = Arrays.asList(\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval is a field of study.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval focuses on finding relevant information in large datasets.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"data mining and information retrieval overlap in research.\\\"}\", JsonObject.class)\n);\n\nclient.insert(InsertReq.builder()\n .collectionName(\"demo\")\n .data(rows)\n .build());\n","await client.insert({\ncollection_name: 'demo', \ndata: [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n]);\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"data\": [\n {\"text\": \"information retrieval is a field of study.\"},\n {\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"},\n {\"text\": \"data mining and information retrieval overlap in research.\"} \n ],\n \"collectionName\": \"demo\"\n}'\n","search_params = {​\n 'params': {'drop_ratio_search': 0.2},​\n}​\n​\nclient.search(​\n collection_name='demo', ​\n data=['whats the focus of information retrieval?'],​\n anns_field='sparse',​\n limit=3,​\n search_params=search_params​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq;\nimport io.milvus.v2.service.vector.request.data.EmbeddedText;\nimport io.milvus.v2.service.vector.response.SearchResp;\n\nMap searchParams = new HashMap<>();\nsearchParams.put(\"drop_ratio_search\", 0.2);\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"demo\")\n .data(Collections.singletonList(new EmbeddedText(\"whats the focus of information retrieval?\")))\n .annsField(\"sparse\")\n .topK(3)\n .searchParams(searchParams)\n .outputFields(Collections.singletonList(\"text\"))\n .build());\n","await client.search(\n collection_name: 'demo', \n data: ['whats the focus of information retrieval?'],\n anns_field: 'sparse',\n limit: 3,\n params: {'drop_ratio_search': 0.2},\n)\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"demo\",\n \"data\": [\n \"whats the focus of information retrieval?\"\n ],\n \"annsField\": \"sparse\",\n \"limit\": 3,\n \"outputFields\": [\n \"text\"\n ],\n \"searchParams\":{\n \"params\":{\n \"drop_ratio_search\":0.2\n }\n }\n}'\n"],"headingContent":"Full Text Search​","anchorList":[{"label":"Pencarian Teks Lengkap","href":"Full-Text-Search​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Membuat koleksi untuk pencarian teks lengkap","href":"Create-a-collection-for-full-text-search​","type":2,"isActive":false},{"label":"Memasukkan data teks","href":"Insert-text-data","type":2,"isActive":false},{"label":"Melakukan pencarian teks lengkap","href":"Perform-full-text-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.md new file mode 100644 index 000000000..71540364c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/full-text-search.md @@ -0,0 +1,501 @@ +--- +id: full-text-search.md +title: Pencarian Teks Lengkap +related_key: 'full, text, search' +summary: >- + Pencarian teks lengkap adalah fitur yang mengambil dokumen yang mengandung + istilah atau frasa tertentu dalam kumpulan data teks, kemudian memberi + peringkat hasil berdasarkan relevansi. +--- +

    Pencarian Teks Lengkap

    Pencarian teks lengkap adalah fitur yang mengambil dokumen yang mengandung istilah atau frasa tertentu dalam kumpulan data teks, lalu memberi peringkat hasil berdasarkan relevansi. Fitur ini mengatasi keterbatasan pencarian semantik, yang mungkin mengabaikan istilah yang tepat, sehingga memastikan Anda menerima hasil yang paling akurat dan relevan secara kontekstual. Selain itu, fitur ini menyederhanakan pencarian vektor dengan menerima input teks mentah, secara otomatis mengubah data teks Anda menjadi sematan yang jarang tanpa perlu membuat sematan vektor secara manual.

    +

    Dengan menggunakan algoritme BM25 untuk penilaian relevansi, fitur ini sangat berharga dalam skenario retrieval-augmented generation (RAG), yang memprioritaskan dokumen yang sangat cocok dengan istilah pencarian tertentu.

    +
    +
      +
    • Dengan mengintegrasikan pencarian teks lengkap dengan pencarian vektor padat berbasis semantik, Anda dapat meningkatkan akurasi dan relevansi hasil pencarian. Untuk informasi lebih lanjut, lihat Pencarian Hibrida.
    • +
    • Pencarian teks lengkap tersedia di Milvus Standalone dan Milvus Distributed tetapi tidak tersedia di Milvus Lite, meskipun menambahkannya ke Milvus Lite ada di peta jalan.
    • +
    +
    +

    Gambaran Umum

    Pencarian teks lengkap menyederhanakan proses pencarian berbasis teks dengan menghilangkan kebutuhan untuk penyematan manual. Fitur ini beroperasi melalui alur kerja berikut.

    +
      +
    1. Masukan teks: Anda memasukkan dokumen teks mentah atau memberikan teks kueri tanpa perlu menyematkannya secara manual.

    2. +
    3. Analisis teks: Milvus menggunakan penganalisis untuk memberi tanda pada teks masukan menjadi istilah individual yang dapat dicari. Untuk informasi lebih lanjut tentang penganalisis, lihat Ikhtisar Penganalisis.

    4. +
    5. Pemrosesan fungsi: Fungsi bawaan menerima istilah yang diberi token dan mengubahnya menjadi representasi vektor yang jarang.

    6. +
    7. Penyimpanan koleksi: Milvus menyimpan penyematan yang jarang ini dalam koleksi untuk pengambilan yang efisien.

    8. +
    9. Penilaian BM25: Selama pencarian, Milvus menerapkan algoritme BM25 untuk menghitung skor untuk dokumen yang tersimpan dan memberi peringkat hasil yang cocok berdasarkan relevansinya dengan teks kueri.

    10. +
    +

    + + Full text search + Pencarian teks lengkap

    +

    Untuk menggunakan pencarian teks lengkap, ikuti langkah-langkah utama berikut.

    +
      +
    1. Buat koleksi: Siapkan koleksi dengan bidang yang diperlukan dan tentukan fungsi untuk mengubah teks mentah menjadi sematan jarang.

    2. +
    3. Memasukkan data: Memasukkan dokumen teks mentah Anda ke dalam koleksi.

    4. +
    5. Melakukan pencarian: Gunakan teks kueri untuk mencari di dalam koleksi Anda dan mengambil hasil yang relevan.

    6. +
    +

    Membuat koleksi untuk pencarian teks lengkap

    Untuk mengaktifkan pencarian teks lengkap, buat koleksi dengan skema tertentu. Skema ini harus menyertakan tiga bidang yang diperlukan.

    +
      +
    • Bidang utama yang secara unik mengidentifikasi setiap entitas dalam koleksi.

    • +
    • Bidang VARCHAR yang menyimpan dokumen teks mentah, dengan atribut enable_analyzer yang disetel ke True. Hal ini memungkinkan Milvus menandai teks ke dalam istilah-istilah tertentu untuk pemrosesan fungsi.

    • +
    • Sebuah bidang SPARSE_FLOAT_VECTOR yang disediakan untuk menyimpan sematan yang jarang yang secara otomatis akan dibuat oleh Milvus untuk bidang VARCHAR.

    • +
    +

    Tentukan skema koleksi

    Pertama, buat skema dan tambahkan bidang-bidang yang diperlukan.

    + +
    from pymilvus import MilvusClient, DataType, Function, FunctionType​
    +
    +client = MilvusClient(uri="http://localhost:19530")
    +​
    +schema = client.create_schema()​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .build();
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("sparse")
    +        .dataType(DataType.SparseFloatVector)
    +        .build());
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +console.log(res.results)
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +

    Dalam konfigurasi ini.

    +
      +
    • id: berfungsi sebagai kunci utama dan secara otomatis dibuat dengan auto_id=True.

    • +
    • text: menyimpan data teks mentah Anda untuk operasi pencarian teks lengkap. Tipe datanya harus VARCHAR, karena VARCHAR adalah tipe data string Milvus untuk penyimpanan teks. Atur enable_analyzer=True untuk mengizinkan Milvus melakukan tokenisasi teks. Secara default, Milvus menggunakan penganalisis standar untuk analisis teks. Untuk mengonfigurasi penganalisis yang berbeda, lihat Ikhtisar.

    • +
    • sparsebidang vektor yang disediakan untuk menyimpan sematan jarang yang dihasilkan secara internal untuk operasi pencarian teks lengkap. Tipe data harus SPARSE_FLOAT_VECTOR.

    • +
    +

    Sekarang, tentukan fungsi yang akan mengubah teks Anda menjadi representasi vektor yang jarang dan kemudian tambahkan ke skema.

    + +
    bm25_function = Function(​
    +    name="text_bm25_emb", # Function name​
    +    input_field_names=["text"], # Name of the VARCHAR field containing raw text data​
    +    output_field_names=["sparse"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​
    +    function_type=FunctionType.BM25,​
    +)​
    +​
    +schema.add_function(bm25_function)​
    +
    +
    +
    import io.milvus.common.clientenum.FunctionType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq.Function;
    +
    +import java.util.*;
    +
    +schema.addFunction(Function.builder()
    +        .functionType(FunctionType.BM25)
    +        .name("text_bm25_emb")
    +        .inputFieldNames(Collections.singletonList("text"))
    +        .outputFieldNames(Collections.singletonList("vector"))
    +        .build());
    +
    +
    const functions = [
    +    {
    +      name: 'text_bm25_emb',
    +      description: 'bm25 function',
    +      type: FunctionType.BM25,
    +      input_field_names: ['text'],
    +      output_field_names: ['vector'],
    +      params: {},
    +    },
    +];
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ],
    +        "functions": [
    +            {
    +                "name": "text_bm25_emb",
    +                "type": "BM25",
    +                "inputFieldNames": ["text"],
    +                "outputFieldNames": ["sparse"],
    +                "params": {}
    +            }
    +        ]
    +    }'
    +
    +

    Parameter

    +

    Deskripsi

    +

    name

    +

    +

    Nama fungsi. Fungsi ini mengubah teks mentah Anda dari bidang text menjadi vektor yang dapat dicari yang akan disimpan di bidang sparse.

    +

    input_field_names

    +

    Nama bidang VARCHAR yang memerlukan konversi teks ke vektor jarang. Untuk FunctionType.BM25, parameter ini hanya menerima satu nama bidang.

    +

    output_field_names

    +

    Nama bidang di mana vektor jarang yang dihasilkan secara internal akan disimpan. Untuk FunctionType.BM25, parameter ini hanya menerima satu nama bidang.

    +

    function_type

    +

    Jenis fungsi yang akan digunakan. Tetapkan nilainya ke FunctionType.BM25.

    +
    +
    +

    Untuk koleksi dengan beberapa bidang VARCHAR yang memerlukan konversi teks-ke-vektor jarang, tambahkan fungsi terpisah ke skema koleksi, pastikan setiap fungsi memiliki nama unik dan nilai output_field_names.

    +
    +

    Mengonfigurasi indeks

    Setelah mendefinisikan skema dengan bidang yang diperlukan dan fungsi bawaan, siapkan indeks untuk koleksi Anda. Untuk menyederhanakan proses ini, gunakan AUTOINDEX sebagai index_type, sebuah opsi yang memungkinkan Milvus untuk memilih dan mengonfigurasi jenis indeks yang paling sesuai berdasarkan struktur data Anda.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_type="AUTOINDEX", ​
    +    metric_type="BM25"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;
    +
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("sparse")
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)
    +        .metricType(IndexParam.MetricType.BM25)
    +        .build());
    +
    +
    const index_params = [
    +  {
    +    field_name: "sparse",
    +    metric_type: "BM25",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +
    export indexParams='[
    +        {
    +            "fieldName": "sparse",
    +            "metricType": "BM25",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +

    Parameter

    +

    Deskripsi

    +

    field_name

    +

    Nama bidang vektor yang akan diindeks. Untuk pencarian teks lengkap, ini harus menjadi bidang yang menyimpan vektor jarang yang dihasilkan. Dalam contoh ini, tetapkan nilainya ke sparse.

    +

    index_type

    +

    Jenis indeks yang akan dibuat. AUTOINDEX memungkinkan Milvus mengoptimalkan pengaturan indeks secara otomatis. Jika Anda membutuhkan kontrol lebih besar atas pengaturan indeks Anda, Anda dapat memilih dari berbagai jenis indeks yang tersedia untuk vektor jarang di Milvus. Untuk informasi lebih lanjut, lihat Indeks yang didukung di Milvus.

    +

    metric_type

    +

    Nilai untuk parameter ini harus diatur ke BM25 khusus untuk fungsionalitas pencarian teks lengkap.

    +
    +

    Membuat koleksi

    Sekarang buatlah koleksi menggunakan skema dan parameter indeks yang telah ditentukan.

    + +
    client.create_collection(​
    +    collection_name='demo', ​
    +    schema=schema, ​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("demo")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    await client.create_collection(
    +    collection_name: 'demo', 
    +    schema: schema, 
    +    index_params: index_params,
    +    functions: functions
    +);
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"demo\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    +

    Memasukkan data teks

    Setelah menyiapkan koleksi dan indeks, Anda siap memasukkan data teks. Dalam proses ini, Anda hanya perlu menyediakan teks mentah. Fungsi bawaan yang telah kita definisikan sebelumnya secara otomatis menghasilkan vektor jarang yang sesuai untuk setiap entri teks.

    + +
    client.insert('demo', [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +])
    +
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +
    +import io.milvus.v2.service.vector.request.InsertReq;
    +
    +Gson gson = new Gson();
    +List<JsonObject> rows = Arrays.asList(
    +        gson.fromJson("{\"text\": \"information retrieval is a field of study.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"data mining and information retrieval overlap in research.\"}", JsonObject.class)
    +);
    +
    +client.insert(InsertReq.builder()
    +        .collectionName("demo")
    +        .data(rows)
    +        .build());
    +
    +
    await client.insert({
    +collection_name: 'demo', 
    +data: [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +]);
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "data": [
    +        {"text": "information retrieval is a field of study."},
    +        {"text": "information retrieval focuses on finding relevant information in large datasets."},
    +        {"text": "data mining and information retrieval overlap in research."}       
    +    ],
    +    "collectionName": "demo"
    +}'
    +
    +

    Setelah Anda memasukkan data ke dalam koleksi Anda, Anda dapat melakukan pencarian teks lengkap menggunakan kueri teks mentah. Milvus secara otomatis mengubah kueri Anda menjadi vektor yang jarang dan mengurutkan hasil pencarian yang cocok menggunakan algoritme BM25, dan kemudian mengembalikan hasil topK (limit).

    + +
    search_params = {​
    +    'params': {'drop_ratio_search': 0.2},​
    +}​
    +​
    +client.search(​
    +    collection_name='demo', ​
    +    data=['whats the focus of information retrieval?'],​
    +    anns_field='sparse',​
    +    limit=3,​
    +    search_params=search_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;
    +import io.milvus.v2.service.vector.request.data.EmbeddedText;
    +import io.milvus.v2.service.vector.response.SearchResp;
    +
    +Map<String,Object> searchParams = new HashMap<>();
    +searchParams.put("drop_ratio_search", 0.2);
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("demo")
    +        .data(Collections.singletonList(new EmbeddedText("whats the focus of information retrieval?")))
    +        .annsField("sparse")
    +        .topK(3)
    +        .searchParams(searchParams)
    +        .outputFields(Collections.singletonList("text"))
    +        .build());
    +
    +
    await client.search(
    +    collection_name: 'demo', 
    +    data: ['whats the focus of information retrieval?'],
    +    anns_field: 'sparse',
    +    limit: 3,
    +    params: {'drop_ratio_search': 0.2},
    +)
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "demo",
    +    "data": [
    +        "whats the focus of information retrieval?"
    +    ],
    +    "annsField": "sparse",
    +    "limit": 3,
    +    "outputFields": [
    +        "text"
    +    ],
    +    "searchParams":{
    +        "params":{
    +            "drop_ratio_search":0.2
    +        }
    +    }
    +}'
    +
    +

    Parameter

    +

    Deskripsi

    +

    search_params

    +

    Kamus yang berisi parameter pencarian.

    +

    params.drop_ratio_search

    +

    Proporsi istilah berfrekuensi rendah yang akan diabaikan selama pencarian. Untuk detailnya, lihat Vektor Jarang.

    +

    data

    +

    Teks kueri mentah.

    +

    anns_field

    +

    Nama bidang yang berisi vektor jarang yang dibuat secara internal.

    +

    limit

    +

    Jumlah maksimum kecocokan teratas yang akan dikembalikan.

    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.json b/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.json new file mode 100644 index 000000000..ab70aaa1c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"},​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.GetReq​\nimport io.milvus.v2.service.vector.request.GetResp​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nGetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .ids(Arrays.asList(0, 1, 2))​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\nList results = getResp.getGetResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.get({​\n collection_name=\"query_collection\",​\n ids=[0,1,2],​\n output_fields=[\"vector\", \"color\"]​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"pink_8682\",\"id\":0,\"vector\":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"orange_6781\",\"id\":2,\"vector\":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n\n","​\nimport io.milvus.v2.service.vector.request.QueryReq​\nimport io.milvus.v2.service.vector.request.QueryResp​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\nList results = getResp.getQueryResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​\n// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nfunc ExampleClient_Query_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n resultSet, err := cli.Query(ctx, client.NewQueryOption(\"query_collection\").​\n WithFilter(`color like \"red%\"`).​\n WithOutputFields(\"vector\", \"color\").​\n WithLimit(3))​\n​\n fmt.Println(resultSet.GetColumn(\"color\"))​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.query({​\n collection_name=\"quick_setup\",​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n#{\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"red_4794\",\"id\":4,\"vector\":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{\"color\":\"red_9392\",\"id\":6,\"vector\":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​\n\n","from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","import io.milvus.orm.iterator.QueryIterator;​\nimport io.milvus.response.QueryResultsWrapper;​\nimport io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.QueryIteratorReq;​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n​\nwhile (true) {​\n List res = queryIterator.next();​\n if (res.isEmpty()) {​\n queryIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n​\n// Output​\n// [color:red_7025, id:1]​\n// [color:red_4794, id:4]​\n// [color:red_9392, id:6]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","# Currently not available\n\n","from pymilvus import MilvusClient​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nfrom pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n​\n# 使用 QueryIterator​\nfrom pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","GetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionName(\"partitionA\")​\n .ids(Arrays.asList(10, 11, 12))​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Collections.singletonList(\"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 使用 Get 方法​\nvar res = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 使用 Query 方法​\nres = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 暂不支持使用 QueryIterator​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n partition_names: ['partitionA'],​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['vector', 'color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\n# 使用 Get 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# 使用 Query 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"],​\n \"id\": [0, 1, 2]​\n}'​\n\n"],"headingContent":"Query​","anchorList":[{"label":"Kueri","href":"Query​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Menggunakan Dapatkan","href":"Use-Get​","type":2,"isActive":false},{"label":"Menggunakan Query","href":"Use-Query​","type":2,"isActive":false},{"label":"Menggunakan QueryIterator","href":"Use-QueryIterator​","type":2,"isActive":false},{"label":"Kueri dalam Partisi","href":"Queries-in-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.md b/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.md new file mode 100644 index 000000000..1e9ac7e16 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/get-and-scalar-query.md @@ -0,0 +1,587 @@ +--- +id: get-and-scalar-query.md +summary: >- + Selain pencarian ANN, Milvus juga mendukung pemfilteran metadata melalui + kueri. Halaman ini memperkenalkan cara menggunakan Query, Get, dan + QueryIterators untuk melakukan penyaringan metadata. +title: Pertanyaan +--- +

    Kueri

    Selain pencarian ANN, Milvus juga mendukung pemfilteran metadata melalui kueri. Halaman ini memperkenalkan cara menggunakan Query, Get, dan QueryIterator untuk melakukan penyaringan metadata.

    +

    Gambaran Umum

    Koleksi dapat menyimpan berbagai jenis bidang skalar. Anda dapat membuat Milvus memfilter Entitas berdasarkan satu atau beberapa field skalar. Milvus menawarkan tiga jenis kueri: Query, Get, dan QueryIterator. Tabel di bawah ini membandingkan ketiga jenis kueri ini.

    +

    +

    Dapatkan

    +

    Query

    +

    QueryIterator

    +

    Skenario yang berlaku

    +

    Untuk menemukan entitas yang memiliki kunci utama yang ditentukan.

    +

    +

    Untuk menemukan semua atau sejumlah entitas tertentu yang memenuhi kondisi pemfilteran kustom

    +

    Untuk menemukan semua entitas yang memenuhi kondisi pemfilteran khusus dalam kueri berpaginasi.

    +

    Metode pemfilteran

    +

    Dengan kunci primer

    +

    Dengan memfilter ekspresi.

    +

    Dengan memfilter ekspresi.

    +

    Parameter wajib

    +
    • Nama koleksi

    • +
    • Kunci primer

    +

    +
    • Nama koleksi

    • +
    • Memfilter ekspresi

    +
    • Nama koleksi

    • +
    • Ekspresi pemfilteran

    • +
    • Jumlah entitas yang akan dikembalikan per kueri

    +

    Parameter opsional

    +
    • Nama partisi

    • +
    • Bidang keluaran

    +
    • Nama partisi

    • +
    • Jumlah entitas yang akan dikembalikan

    • +
    • Bidang keluaran

    +
    • Nama partisi

    • +
    • Jumlah entitas yang akan dikembalikan secara total

    • +
    • Bidang keluaran

    +

    Pengembalian

    +

    Mengembalikan entitas yang menyimpan kunci utama yang ditentukan dalam koleksi atau partisi yang ditentukan.

    +

    Mengembalikan semua atau sejumlah entitas tertentu yang memenuhi kondisi pemfilteran khusus dalam koleksi atau partisi yang ditentukan.

    +

    Mengembalikan semua entitas yang memenuhi kondisi pemfilteran khusus dalam koleksi atau partisi yang ditentukan melalui kueri ber-halaman.

    +
    +

    Untuk mengetahui lebih lanjut tentang pemfilteran metadata, lihat Pemfilteran Metadata.

    +

    Menggunakan Dapatkan

    Ketika Anda perlu mencari entitas berdasarkan kunci utamanya, Anda dapat menggunakan metode Get. Contoh kode berikut ini mengasumsikan bahwa ada tiga bidang bernama id, vector, dan color dalam koleksi Anda dan mengembalikan entitas dengan kunci primer 1, 2, dan 3.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},​
    +]​
    +
    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.GetReq​
    +import io.milvus.v2.service.vector.request.GetResp​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +        ​
    +GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .ids(Arrays.asList(0, 1, 2))​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getGetResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.get({​
    +    collection_name="query_collection",​
    +    ids=[0,1,2],​
    +    output_fields=["vector", "color"]​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"color":"pink_8682","id":0,"vector":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"orange_6781","id":2,"vector":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​
    +
    +
    +

    Menggunakan Query

    Ketika Anda perlu menemukan entitas dengan kondisi pemfilteran khusus, gunakan metode Query. Contoh kode berikut ini mengasumsikan ada tiga bidang bernama id, vector, dan color dan mengembalikan jumlah entitas yang ditentukan yang memiliki nilai color yang dimulai dengan red.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.service.vector.request.QueryReq​
    +import io.milvus.v2.service.vector.request.QueryResp​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getQueryResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​
    +// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +func ExampleClient_Query_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    resultSet, err := cli.Query(ctx, client.NewQueryOption("query_collection").​
    +        WithFilter(`color like "red%"`).​
    +        WithOutputFields("vector", "color").​
    +        WithLimit(3))​
    +​
    +    fmt.Println(resultSet.GetColumn("color"))​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.query({​
    +    collection_name="quick_setup",​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +#{"code":0,"cost":0,"data":[{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"red_4794","id":4,"vector":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{"color":"red_9392","id":6,"vector":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​
    +
    +
    +

    Menggunakan QueryIterator

    Ketika Anda perlu menemukan entitas dengan kondisi pemfilteran khusus melalui kueri berpaginasi, buat QueryIterator dan gunakan metode next() untuk mengulang semua entitas untuk menemukan entitas yang memenuhi kondisi pemfilteran. Contoh kode berikut ini mengasumsikan bahwa ada tiga field bernama id, vector, dan color dan mengembalikan semua entitas yang memiliki nilai color yang dimulai dengan red.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    import io.milvus.orm.iterator.QueryIterator;​
    +import io.milvus.response.QueryResultsWrapper;​
    +import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.QueryIteratorReq;​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = queryIterator.next();​
    +    if (res.isEmpty()) {​
    +        queryIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +​
    +// Output​
    +// [color:red_7025, id:1]​
    +// [color:red_4794, id:4]​
    +// [color:red_9392, id:6]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    # Currently not available
    +
    +
    +

    Kueri dalam Partisi

    Anda juga dapat melakukan kueri dalam satu atau beberapa partisi dengan menyertakan nama partisi dalam permintaan Get, Query, atau QueryIterator. Contoh kode berikut ini mengasumsikan bahwa ada partisi bernama PartitionA dalam koleksi.

    + +
    from pymilvus import MilvusClient​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +​
    +# 使用 QueryIterator​
    +from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionName("partitionA")​
    +        .ids(Arrays.asList(10, 11, 12))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Collections.singletonList("color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 使用 Get 方法​
    +var res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 使用 Query 方法​
    +res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 暂不支持使用 QueryIterator​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  partition_names: ['partitionA'],​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['vector', 'color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +# 使用 Get 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# 使用 Query 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"],​
    +    "id": [0, 1, 2]​
    +}'​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.json new file mode 100644 index 000000000..2352c8992 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"chunk\": \"pink_8682\", \"docId\": 1},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"chunk\": \"red_7025\", \"docId\": 5},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"chunk\": \"orange_6781\", \"docId\": 2},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"chunk\": \"pink_9298\", \"docId\": 3},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"chunk\": \"red_4794\", \"docId\": 3},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"chunk\": \"yellow_4222\", \"docId\": 4},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"chunk\": \"red_9392\", \"docId\": 1},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"chunk\": \"grey_8510\", \"docId\": 2},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"chunk\": \"white_9381\", \"docId\": 5},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"chunk\": \"purple_4976\", \"docId\": 3},​\n]​\n​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vectors = [​\n [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​\n​\n# Group search results​\nres = client.search(​\n collection_name=\"group_search_collection\",​\n data=query_vectors,​\n limit=3,​\n group_by_field=\"docId\",​\n output_fields=[\"docId\"]​\n)​\n​\n# Retrieve the values in the `docId` column​\ndoc_ids = [result['entity']['docId'] for result in res[0]]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .groupByFieldName(\"docId\")​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n\n","// nolint​\nfunc ExampleClient_Search_grouping() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithGroupByField(\"docId\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n // highlight-start​\n group_by_field: \"docId\"​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"groupingField\": \"docId\",​\n \"outputFields\": [\"docId\"]​\n}'​\n\n","# Group search results​\n​\nres = client.search(​\n collection_name=\"group_search_collection\", ​\n data=query_vectors, # Query vector\n limit=5, # Top K results​ to return​\n group_by_field=\"docId\", # Group by docId​\n group_size=2, # Return 2 entities per group​\n strict_group_size=True, # Ensure each group has 2 entities​\n output_fields=[\"docId\"]​\n)​\n\n","FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .groupByFieldName(\"docId\")​\n .groupSize(2)​\n .strictGroupSize(true)​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n group_by_field: \"docId\",​\n // highlight-start​\n group_size: 2,​\n strict_group_size: true​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"groupingField\": \"docId\",​\n \"groupSize\":2,​\n \"strictGroupSize\":true,​\n \"outputFields\": [\"docId\"]​\n}'​\n\n"],"headingContent":"Grouping Search​","anchorList":[{"label":"Pencarian Pengelompokan","href":"Grouping-Search​","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview​","type":2,"isActive":false},{"label":"Melakukan Pencarian Pengelompokan","href":"Perform-Grouping-Search​","type":2,"isActive":false},{"label":"Mengonfigurasi ukuran grup","href":"Configure-group-size​","type":2,"isActive":false},{"label":"Pertimbangan","href":"Considerations​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.md new file mode 100644 index 000000000..0fc24086a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/grouping-search.md @@ -0,0 +1,367 @@ +--- +id: grouping-search.md +summary: >- + Pencarian pengelompokan memungkinkan Milvus untuk mengelompokkan hasil + pencarian berdasarkan nilai dalam bidang tertentu untuk mengumpulkan data pada + tingkat yang lebih tinggi. Sebagai contoh, Anda dapat menggunakan pencarian + ANN dasar untuk menemukan buku yang mirip dengan buku yang sedang dicari, + tetapi Anda dapat menggunakan pencarian pengelompokan untuk menemukan kategori + buku yang mungkin melibatkan topik-topik yang dibahas dalam buku tersebut. + Topik ini menjelaskan cara menggunakan Pencarian Pengelompokan bersama dengan + pertimbangan utama. +title: Pencarian Pengelompokan +--- +

    Pencarian Pengelompokan

    Pencarian pengelompokan memungkinkan Milvus mengelompokkan hasil pencarian berdasarkan nilai dalam bidang tertentu untuk mengumpulkan data pada tingkat yang lebih tinggi. Sebagai contoh, Anda dapat menggunakan pencarian ANN dasar untuk menemukan buku yang mirip dengan buku yang sedang dicari, tetapi Anda dapat menggunakan pencarian pengelompokan untuk menemukan kategori buku yang mungkin melibatkan topik-topik yang dibahas dalam buku tersebut. Topik ini menjelaskan cara menggunakan Pencarian Pengelompokan bersama dengan pertimbangan-pertimbangan utama.

    +

    Ikhtisar

    Ketika entitas dalam hasil pencarian memiliki nilai yang sama dalam bidang skalar, hal ini mengindikasikan bahwa entitas tersebut memiliki kemiripan dalam atribut tertentu, yang dapat berdampak negatif pada hasil pencarian.

    +

    Anggaplah sebuah koleksi menyimpan beberapa dokumen (dilambangkan dengan docId). Untuk mempertahankan informasi semantik sebanyak mungkin saat mengubah dokumen menjadi vektor, setiap dokumen dipecah menjadi paragraf yang lebih kecil dan mudah diatur (atau potongan) dan disimpan sebagai entitas terpisah. Meskipun dokumen dibagi menjadi beberapa bagian yang lebih kecil, pengguna sering kali masih tertarik untuk mengidentifikasi dokumen mana yang paling relevan dengan kebutuhan mereka.

    +

    + + ANN Search + Pencarian ANN

    +

    Ketika melakukan pencarian Approximate Nearest Neighbor (ANN) pada koleksi seperti itu, hasil pencarian dapat mencakup beberapa paragraf dari dokumen yang sama, sehingga berpotensi menyebabkan dokumen lain terlewatkan, yang mungkin tidak sesuai dengan kasus penggunaan yang diinginkan.

    +

    + + Grouping Search + Mengelompokkan Pencarian

    +

    Untuk meningkatkan keragaman hasil pencarian, Anda dapat menambahkan parameter group_by_field dalam permintaan pencarian untuk mengaktifkan Pencarian Pengelompokan. Seperti yang ditunjukkan pada diagram, Anda dapat mengatur group_by_field ke docId. Setelah menerima permintaan ini, Milvus akan.

    +
      +
    • Melakukan pencarian ANN berdasarkan vektor kueri yang disediakan untuk menemukan semua entitas yang paling mirip dengan kueri.

    • +
    • Mengelompokkan hasil pencarian berdasarkan group_by_field yang ditentukan, seperti docId.

    • +
    • Mengembalikan hasil teratas untuk setiap kelompok, seperti yang ditentukan oleh parameter limit, dengan entitas yang paling mirip dari setiap kelompok.

    • +
    +
    +

    Secara default, Pencarian Pengelompokan hanya mengembalikan satu entitas per grup. Jika Anda ingin menambah jumlah hasil yang dikembalikan per grup, Anda dapat mengontrolnya dengan parameter group_size dan strict_group_size.

    +
    +

    Melakukan Pencarian Pengelompokan

    Bagian ini memberikan contoh kode untuk mendemonstrasikan penggunaan Pencarian Pengelompokan. Contoh berikut ini mengasumsikan koleksi mencakup bidang untuk id, vector, chunk, dan docId.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "chunk": "pink_8682", "docId": 1},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "chunk": "red_7025", "docId": 5},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "chunk": "orange_6781", "docId": 2},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "chunk": "pink_9298", "docId": 3},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "chunk": "red_4794", "docId": 3},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "chunk": "yellow_4222", "docId": 4},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "chunk": "red_9392", "docId": 1},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "chunk": "grey_8510", "docId": 2},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "chunk": "white_9381", "docId": 5},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "chunk": "purple_4976", "docId": 3},​
    +]​
    +​
    +
    +
    +

    Dalam permintaan pencarian, setel group_by_field dan output_fields ke docId. Milvus akan mengelompokkan hasil berdasarkan bidang yang ditentukan dan mengembalikan entitas yang paling mirip dari setiap kelompok, termasuk nilai docId untuk setiap entitas yang dikembalikan.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vectors = [​
    +    [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​
    +​
    +# Group search results​
    +res = client.search(​
    +    collection_name="group_search_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +    group_by_field="docId",​
    +    output_fields=["docId"]​
    +)​
    +​
    +# Retrieve the values in the `docId` column​
    +doc_ids = [result['entity']['docId'] for result in res[0]]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .groupByFieldName("docId")​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +
    +
    +
    // nolint​
    +func ExampleClient_Search_grouping() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,               // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ).WithGroupByField("docId"))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    // highlight-start​
    +    group_by_field: "docId"​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "groupingField": "docId",​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    Pada permintaan di atas, limit=3 menunjukkan bahwa sistem akan mengembalikan hasil pencarian dari tiga kelompok, dengan masing-masing kelompok berisi satu entitas yang paling mirip dengan vektor kueri.

    +

    Mengonfigurasi ukuran grup

    Secara default, Pencarian Pengelompokan hanya mengembalikan satu entitas per grup. Jika Anda menginginkan beberapa hasil per grup, sesuaikan parameter group_size dan strict_group_size.

    + +
    # Group search results​
    +​
    +res = client.search(​
    +    collection_name="group_search_collection", ​
    +    data=query_vectors, # Query vector
    +    limit=5, # Top K results​ to return​
    +    group_by_field="docId", # Group by docId​
    +    group_size=2, # Return 2 entities per group​
    +    strict_group_size=True, # Ensure each group has 2 entities​
    +    output_fields=["docId"]​
    +)​
    +
    +
    +
    FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .groupByFieldName("docId")​
    +        .groupSize(2)​
    +        .strictGroupSize(true)​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    group_by_field: "docId",​
    +    // highlight-start​
    +    group_size: 2,​
    +    strict_group_size: true​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "groupingField": "docId",​
    +    "groupSize":2,​
    +    "strictGroupSize":true,​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    Dalam contoh di atas.

    +
      +
    • group_size: Menentukan jumlah entitas yang diinginkan untuk dikembalikan per grup. Sebagai contoh, pengaturan group_size=2 berarti setiap grup (atau setiap docId) idealnya mengembalikan dua paragraf (atau potongan) yang paling mirip. Jika group_size tidak disetel, sistem secara default mengembalikan satu hasil per grup.

    • +
    • strict_group_size: Parameter boolean ini mengontrol apakah sistem harus secara ketat menerapkan hitungan yang ditetapkan oleh group_size. Ketika strict_group_size=True, sistem akan berusaha memasukkan jumlah entitas yang tepat yang ditentukan oleh group_size dalam setiap grup (misalnya, dua paragraf), kecuali jika tidak ada cukup data dalam grup tersebut. Secara default (strict_group_size=False), sistem akan memprioritaskan untuk memenuhi jumlah grup yang ditentukan oleh parameter limit, daripada memastikan setiap grup berisi entitas group_size. Pendekatan ini umumnya lebih efisien dalam kasus-kasus di mana distribusi data tidak merata.

    • +
    +

    Untuk detail parameter tambahan, lihat search().

    +

    Pertimbangan

      +
    • Jumlah kelompok: Parameter limit mengontrol jumlah grup dari mana hasil pencarian dikembalikan, dan bukannya jumlah spesifik entitas dalam setiap grup. Menetapkan limit yang sesuai membantu mengontrol keragaman pencarian dan kinerja kueri. Mengurangi limit dapat mengurangi biaya komputasi jika data terdistribusi secara padat atau kinerja menjadi perhatian.

    • +
    • Entitas per grup: Parameter group_size mengontrol jumlah entitas yang dikembalikan per grup. Menyesuaikan group_size berdasarkan kasus penggunaan Anda dapat meningkatkan kekayaan hasil pencarian. Namun, jika data tidak terdistribusi secara merata, beberapa grup mungkin mengembalikan lebih sedikit entitas daripada yang ditentukan oleh group_size, terutama dalam skenario data terbatas.

    • +
    • Ukuran kelompok yang ketat: Ketika strict_group_size=True, sistem akan berusaha mengembalikan jumlah entitas yang ditentukan (group_size) untuk setiap grup, kecuali jika tidak ada cukup data dalam grup tersebut. Pengaturan ini memastikan jumlah entitas yang konsisten per grup, tetapi dapat menyebabkan penurunan kinerja dengan distribusi data yang tidak merata atau sumber daya yang terbatas. Jika jumlah entitas yang ketat tidak diperlukan, pengaturan strict_group_size=False dapat meningkatkan kecepatan kueri.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.json b/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.json new file mode 100644 index 000000000..4a7c8be9a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True, # Whether to enable text analysis for this field​\n enable_match=True # Whether to enable text match​\n)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n\n","analyzer_params={​\n \"type\": \"english\"​\n}​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=200, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params,​\n enable_match=True, ​\n)​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"english\");\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(200)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n analyzer_params: { type: 'english' },\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 200,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"my_vector\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\": \"5\"\n }\n }\n ]\n }'\n\n","TEXT_MATCH(field_name, text)​\n\n","filter = \"TEXT_MATCH(text, 'machine deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine deep')\";\n","export filter=\"\\\"TEXT_MATCH(text, 'machine deep')\\\"\"\n","filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"\n","export filter=\"\\\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\\\"\"\n","filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\"\n","String filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","const filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","export filter=\"\\\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\\\"\"\n","# Match entities with `keyword1` or `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1 keyword2')\"​\n​\n# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​\nresult = MilvusClient.search(​\n collection_name=\"YOUR_COLLECTION_NAME\", # Your collection name​\n anns_field=\"embeddings\", # Vector field name​\n data=[query_vector], # Query vector​\n filter=filter,​\n search_params={\"params\": {\"nprobe\": 10}},​\n limit=10, # Max. number of results to return​\n output_fields=[\"id\", \"text\"] # Fields to return​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .annsField(\"embeddings\")\n .data(Collections.singletonList(queryVector)))\n .filter(filter)\n .topK(10)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build());\n","// Match entities with `keyword1` or `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\n// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field\nconst result = await client.search(\n collection_name: \"YOUR_COLLECTION_NAME\", // Your collection name\n anns_field: \"embeddings\", // Vector field name\n data: [query_vector], // Query vector\n filter: filter,\n params: {\"nprobe\": 10},\n limit: 10, // Max. number of results to return\n output_fields: [\"id\", \"text\"] //Fields to return\n);\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1 keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"annsField\": \"my_vector\",\n \"data\": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],\n \"filter\": '\"$filter\"',\n \"searchParams\": {\n \"params\": {\n \"nprobe\": 10\n }\n },\n \"limit\": 3,\n \"outputFields\": [\"text\",\"id\"]\n}'\n","# Match entities with both `keyword1` and `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\"​\n​\nresult = MilvusClient.query(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n filter=filter, ​\n output_fields=[\"id\", \"text\"]​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nQueryResp queryResp = client.query(QueryReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .filter(filter)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build()\n);\n","// Match entities with both `keyword1` and `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nconst result = await client.query(\n collection_name: \"YOUR_COLLECTION_NAME\",\n filter: filter, \n output_fields: [\"id\", \"text\"]\n)\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"filter\": '\"$filter\"',\n \"outputFields\": [\"id\", \"text\"]\n}'\n"],"headingContent":"Text Match​","anchorList":[{"label":"Pencocokan Teks","href":"Text-Match​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Mengaktifkan pencocokan teks","href":"Enable-text-match","type":2,"isActive":false},{"label":"Menggunakan pencocokan teks","href":"Use-text-match","type":2,"isActive":false},{"label":"Pertimbangan","href":"Considerations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.md b/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.md new file mode 100644 index 000000000..03d0e2a86 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/keyword-match.md @@ -0,0 +1,431 @@ +--- +id: keyword-match.md +summary: >- + Pencocokan teks di Milvus memungkinkan pencarian dokumen yang tepat + berdasarkan istilah tertentu. Fitur ini terutama digunakan untuk pencarian + yang difilter untuk memenuhi kondisi tertentu dan dapat menggabungkan + pemfilteran skalar untuk menyempurnakan hasil kueri, sehingga memungkinkan + pencarian kemiripan dalam vektor yang memenuhi kriteria skalar. +title: Pencocokan Teks +--- +

    Pencocokan Teks

    Pencocokan teks di Milvus memungkinkan pencarian dokumen yang tepat berdasarkan istilah tertentu. Fitur ini terutama digunakan untuk pencarian yang difilter untuk memenuhi kondisi tertentu dan dapat menggabungkan pemfilteran skalar untuk menyaring hasil kueri, sehingga memungkinkan pencarian kemiripan dalam vektor yang memenuhi kriteria skalar.

    +
    +

    Pencocokan teks berfokus pada pencarian kemunculan yang tepat dari istilah kueri, tanpa menilai relevansi dokumen yang dicocokkan. Jika Anda ingin mengambil dokumen yang paling relevan berdasarkan makna semantik dan pentingnya istilah kueri, kami sarankan Anda menggunakan Pencarian Teks Lengkap.

    +
    +

    Gambaran Umum

    Milvus mengintegrasikan Tantivy untuk mendukung indeks terbalik yang mendasarinya dan pencarian teks berbasis istilah. Untuk setiap entri teks, Milvus mengindeksnya dengan mengikuti prosedur.

    +
      +
    1. Penganalisis: Penganalisis memproses teks masukan dengan menokenya menjadi kata-kata individual, atau token, dan kemudian menerapkan filter sesuai kebutuhan. Hal ini memungkinkan Milvus untuk membangun indeks berdasarkan token-token ini.

    2. +
    3. Pengindeksan: Setelah analisis teks, Milvus membuat indeks terbalik yang memetakan setiap token unik ke dokumen yang mengandungnya.

    4. +
    +

    Ketika pengguna melakukan pencocokan teks, indeks terbalik digunakan untuk mengambil semua dokumen yang mengandung istilah dengan cepat. Hal ini jauh lebih cepat daripada memindai setiap dokumen satu per satu.

    +

    + + Text Match + Pencocokan Teks

    +

    Mengaktifkan pencocokan teks

    Pencocokan teks bekerja pada tipe bidang VARCHAR, yang pada dasarnya adalah tipe data string di Milvus. Untuk mengaktifkan pencocokan teks, setel enable_analyzer dan enable_match ke True, lalu secara opsional konfigurasikan penganalisis untuk analisis teks ketika menentukan skema koleksi Anda.

    +

    Tetapkan enable_analyzer dan enable_match

    Untuk mengaktifkan pencocokan teks untuk bidang VARCHAR tertentu, setel parameter enable_analyzer dan enable_match ke True saat menentukan skema bidang. Ini menginstruksikan Milvus untuk melakukan tokenisasi teks dan membuat indeks terbalik untuk bidang yang ditentukan, sehingga memungkinkan pencocokan teks yang cepat dan efisien.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True, # Whether to enable text analysis for this field​
    +    enable_match=True # Whether to enable text match​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +
    +

    Opsional: Mengonfigurasi penganalisis

    Performa dan keakuratan pencocokan teks bergantung pada penganalisis yang dipilih. Penganalisis yang berbeda disesuaikan dengan berbagai bahasa dan struktur teks, sehingga memilih yang tepat dapat secara signifikan memengaruhi hasil pencarian untuk kasus penggunaan spesifik Anda.

    +

    Secara default, Milvus menggunakan standard analyzer, yang menandai teks berdasarkan spasi dan tanda baca, menghapus token yang lebih panjang dari 40 karakter, dan mengubah teks menjadi huruf kecil. Tidak ada parameter tambahan yang diperlukan untuk menerapkan pengaturan default ini. Untuk informasi lebih lanjut, lihat Standar.

    +

    Jika diperlukan penganalisis yang berbeda, Anda dapat mengonfigurasinya menggunakan parameter analyzer_params. Misalnya, untuk menerapkan penganalisis english untuk memproses teks bahasa Inggris.

    + +
    analyzer_params={​
    +    "type": "english"​
    +}​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=200, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params,​
    +    enable_match=True, ​
    +)​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "english");
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(200)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +    analyzer_params: { type: 'english' },
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 200,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "my_vector",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim": "5"
    +                }
    +            }
    +        ]
    +    }'
    +
    +
    +

    Milvus juga menyediakan berbagai penganalisis lain yang cocok untuk berbagai bahasa dan skenario. Untuk lebih jelasnya, lihat Ikhtisar.

    +

    Menggunakan pencocokan teks

    Setelah Anda mengaktifkan pencocokan teks untuk bidang VARCHAR di skema koleksi Anda, Anda dapat melakukan pencocokan teks menggunakan ekspresi TEXT_MATCH.

    +

    Sintaks ekspresi TEXT_MATCH

    Ekspresi TEXT_MATCH digunakan untuk menentukan bidang dan istilah yang akan dicari. Sintaksnya adalah sebagai berikut.

    +
    TEXT_MATCH(field_name, text)​
    +
    +
    +
      +
    • field_name: Nama bidang VARCHAR yang akan dicari.

    • +
    • text: Istilah yang akan dicari. Beberapa istilah dapat dipisahkan dengan spasi atau pembatas lain yang sesuai berdasarkan bahasa dan penganalisis yang dikonfigurasi.

    • +
    +

    Secara default, TEXT_MATCH menggunakan logika pencocokan OR, yang berarti akan mengembalikan dokumen yang mengandung salah satu istilah yang ditentukan. Sebagai contoh, untuk mencari dokumen yang mengandung istilah machine atau deep di bidang text, gunakan ekspresi berikut.

    + +
    filter = "TEXT_MATCH(text, 'machine deep')"​
    +
    +
    String filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    const filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    export filter="\"TEXT_MATCH(text, 'machine deep')\""
    +
    +

    Anda juga dapat menggabungkan beberapa ekspresi TEXT_MATCH menggunakan operator logika untuk melakukan pencocokan AND.

    +
      +
    • Untuk mencari dokumen yang mengandung machine dan deep di bidang text, gunakan ekspresi berikut.

      +

      +
      filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"​
      +
      +
      String filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')";
      +
      +
      const filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
      +
      +
      export filter="\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\""
      +
    • +
    • Untuk mencari dokumen yang mengandung machine dan learning tetapi tanpa deep di bidang text, gunakan ekspresi berikut:

      +

      +
      filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"
      +
      +
      String filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      const filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      export filter="\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\""
      +
    • +
    +

    Mencari dengan pencocokan teks

    Pencocokan teks dapat digunakan bersama dengan pencarian kemiripan vektor untuk mempersempit cakupan pencarian dan meningkatkan kinerja pencarian. Dengan memfilter koleksi menggunakan pencocokan teks sebelum pencarian kemiripan vektor, Anda dapat mengurangi jumlah dokumen yang perlu dicari, sehingga menghasilkan waktu kueri yang lebih cepat.

    +

    Dalam contoh ini, ekspresi filter memfilter hasil pencarian untuk hanya menyertakan dokumen yang cocok dengan istilah yang ditentukan keyword1 atau keyword2. Pencarian kemiripan vektor kemudian dilakukan pada subset dokumen yang telah difilter ini.

    + +
    # Match entities with `keyword1` or `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1 keyword2')"​
    +​
    +# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​
    +result = MilvusClient.search(​
    +    collection_name="YOUR_COLLECTION_NAME", # Your collection name​
    +    anns_field="embeddings", # Vector field name​
    +    data=[query_vector], # Query vector​
    +    filter=filter,​
    +    search_params={"params": {"nprobe": 10}},​
    +    limit=10, # Max. number of results to return​
    +    output_fields=["id", "text"] # Fields to return​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .annsField("embeddings")
    +        .data(Collections.singletonList(queryVector)))
    +        .filter(filter)
    +        .topK(10)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build());
    +
    +
    // Match entities with `keyword1` or `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
    +const result = await client.search(
    +    collection_name: "YOUR_COLLECTION_NAME", // Your collection name
    +    anns_field: "embeddings", // Vector field name
    +    data: [query_vector], // Query vector
    +    filter: filter,
    +    params: {"nprobe": 10},
    +    limit: 10, // Max. number of results to return
    +    output_fields: ["id", "text"] //Fields to return
    +);
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1 keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "annsField": "my_vector",
    +    "data": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],
    +    "filter": '"$filter"',
    +    "searchParams": {
    +        "params": {
    +            "nprobe": 10
    +        }
    +    },
    +    "limit": 3,
    +    "outputFields": ["text","id"]
    +}'
    +
    +

    Kueri dengan pencocokan teks

    Pencocokan teks juga dapat digunakan untuk pemfilteran skalar dalam operasi kueri. Dengan menetapkan ekspresi TEXT_MATCH dalam parameter expr dari metode query(), Anda dapat mengambil dokumen yang cocok dengan istilah yang diberikan.

    +

    Contoh di bawah ini mengambil dokumen di mana bidang text berisi kedua istilah keyword1 dan keyword2.

    + +
    # Match entities with both `keyword1` and `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"​
    +​
    +result = MilvusClient.query(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    filter=filter, ​
    +    output_fields=["id", "text"]​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +QueryResp queryResp = client.query(QueryReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .filter(filter)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build()
    +);
    +
    +
    // Match entities with both `keyword1` and `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +const result = await client.query(
    +    collection_name: "YOUR_COLLECTION_NAME",
    +    filter: filter, 
    +    output_fields: ["id", "text"]
    +)
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "filter": '"$filter"',
    +    "outputFields": ["id", "text"]
    +}'
    +
    +

    Pertimbangan

      +
    • Mengaktifkan pencocokan teks untuk suatu bidang akan memicu pembuatan indeks terbalik, yang menghabiskan sumber daya penyimpanan. Pertimbangkan dampak penyimpanan ketika memutuskan untuk mengaktifkan fitur ini, karena bervariasi berdasarkan ukuran teks, token unik, dan penganalisis yang digunakan.

    • +
    • Setelah Anda mendefinisikan penganalisis dalam skema Anda, pengaturannya menjadi permanen untuk koleksi tersebut. Jika Anda memutuskan bahwa penganalisis yang berbeda lebih sesuai dengan kebutuhan Anda, Anda dapat mempertimbangkan untuk menghapus koleksi yang ada dan membuat koleksi baru dengan konfigurasi penganalisis yang diinginkan.

    • +
    • Aturan pelarian dalam ekspresi filter:

      +
        +
      • Karakter yang diapit oleh tanda kutip ganda atau tanda kutip tunggal di dalam ekspresi ditafsirkan sebagai konstanta string. Jika konstanta string menyertakan karakter escape, karakter escape harus direpresentasikan dengan urutan escape. Misalnya, gunakan \\ untuk mewakili \, \\t untuk mewakili tab \t, dan \\n untuk mewakili baris baru.
      • +
      • Jika konstanta string diapit oleh tanda kutip tunggal, tanda kutip tunggal dalam konstanta tersebut harus direpresentasikan sebagai \\' sedangkan tanda kutip ganda dapat direpresentasikan sebagai " atau \\". Contoh: 'It\\'s milvus'.
      • +
      • Jika konstanta string diapit oleh tanda kutip ganda, tanda kutip ganda di dalam konstanta harus direpresentasikan sebagai \\" sedangkan tanda kutip tunggal dapat direpresentasikan sebagai ' atau \\'. Contoh: "He said \\"Hi\\"".
      • +
    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/metric.json b/localization/v2.5.x/site/id/userGuide/search-query-get/metric.json new file mode 100644 index 000000000..e2b73f3b4 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/metric.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Metric Types​","anchorList":[{"label":"Jenis Metrik","href":"Metric-Types​","type":1,"isActive":false},{"label":"Jarak Euclidean (L2)","href":"Euclidean-distance-L2​","type":2,"isActive":false},{"label":"Produk dalam (IP)","href":"Inner-product-IP​","type":2,"isActive":false},{"label":"Kesamaan kosinus","href":"Cosine-similarity-​","type":2,"isActive":false},{"label":"Jarak JACCARD","href":"JACCARD-distance​","type":2,"isActive":false},{"label":"Jarak HAMMING","href":"HAMMING-distance​","type":2,"isActive":false},{"label":"Kesamaan BM25","href":"BM25-similarity​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/metric.md b/localization/v2.5.x/site/id/userGuide/search-query-get/metric.md new file mode 100644 index 000000000..08fddc4cb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/metric.md @@ -0,0 +1,252 @@ +--- +id: metric.md +summary: >- + Metrik kemiripan digunakan untuk mengukur kemiripan di antara vektor. Memilih + metrik jarak yang tepat dapat membantu meningkatkan kinerja klasifikasi dan + pengelompokan secara signifikan. +title: Jenis Metrik +--- +

    Jenis Metrik

    Metrik kemiripan digunakan untuk mengukur kemiripan di antara vektor. Memilih metrik jarak yang tepat dapat membantu meningkatkan kinerja klasifikasi dan pengelompokan secara signifikan.

    +

    Saat ini, Milvus mendukung jenis-jenis metrik kemiripan berikut ini: Jarak Euclidean (L2), Inner Product (IP), Cosine Similarity (COSINE), JACCARD, HAMMING, dan BM25 (dirancang khusus untuk pencarian teks lengkap pada vektor yang jarang).

    +

    Tabel di bawah ini merangkum pemetaan antara berbagai jenis bidang dan jenis metrik yang sesuai.

    +

    Jenis Bidang

    +

    Rentang Dimensi

    +

    Jenis Metrik yang Didukung

    +

    Jenis Metrik Default

    +

    FLOAT_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    COSINE

    +

    FLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    +

    COSINE

    +

    BFLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    COSINE

    +

    SPARSE_FLOAT_VECTOR

    +

    Tidak perlu menentukan dimensi.

    +

    IP, BM25 (hanya digunakan untuk pencarian teks lengkap)

    +

    IP

    +

    BINARY_VECTOR

    +

    8-32,768*8

    +

    +

    HAMMING, JACCARD

    +

    HAMMING

    +
    +
    +
      +
    • Untuk bidang vektor dengan tipe SPARSE_FLOAT_VECTOR, gunakan tipe metrik BM25 hanya saat melakukan pencarian teks lengkap. Untuk informasi lebih lanjut, lihat Pencarian Teks Lengkap.

    • +
    • Untuk bidang vektor jenis BINARY_VECTOR, nilai dimensi (dim) harus kelipatan 8.

    • +
    +
    +

    Tabel di bawah ini merangkum karakteristik nilai jarak kemiripan dari semua jenis metrik yang didukung dan kisaran nilainya.

    +

    Jenis Metrik

    +

    Karakteristik Nilai Jarak Kemiripan

    +

    Rentang Nilai Jarak Kemiripan

    +

    L2

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

    +

    [0, ∞)

    +

    IP

    +

    Nilai yang lebih besar menunjukkan kemiripan yang lebih besar.

    +

    [-1, 1]

    +

    COSINE

    +

    Nilai yang lebih besar menunjukkan kemiripan yang lebih besar.

    +

    [-1, 1]

    +

    JACCARD

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

    +

    [0, 1]

    +

    HAMMING

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih besar.

    +

    [0, dim(vektor)]

    +

    BM25

    +

    Nilai relevansi berdasarkan frekuensi term, frekuensi dokumen terbalik, dan normalisasi dokumen.

    +

    [0, ∞)

    +

    +
    +

    Jarak Euclidean (L2)

    Pada dasarnya, jarak Euclidean mengukur panjang segmen yang menghubungkan 2 titik.

    +

    Rumus untuk jarak Euclidean adalah sebagai berikut.

    +

    + + Euclidean distance formula + Rumus jarak Euclidean

    +

    di mana a = (a0, a1, ...,an-1) dan b = (b0, b1, ..., bn-1) adalah dua titik dalam ruang Euclidean n-dimensi.

    +

    Ini adalah metrik jarak yang paling umum digunakan dan sangat berguna ketika datanya kontinu.

    +
    +

    Milvus hanya menghitung nilai sebelum menerapkan akar kuadrat ketika jarak Euclidean dipilih sebagai metrik jarak.

    +
    +

    Produk dalam (IP)

    Jarak IP antara dua penyematan didefinisikan sebagai berikut.

    +

    + + Inner product formula + Rumus hasil kali dalam

    +

    IP lebih berguna jika Anda perlu membandingkan data yang tidak dinormalisasi atau ketika Anda peduli dengan besaran dan sudut.

    +
    +

    Jika Anda menggunakan IP untuk menghitung kemiripan antara embedding, Anda harus menormalkan embedding Anda. Setelah normalisasi, hasil kali dalam sama dengan kemiripan kosinus.

    +
    +

    Misalkan X' dinormalisasi dari penyematan X.

    +

    + + Normalized inner product formula + Rumus hasil kali dalam yang dinormalisasi

    +

    Korelasi antara kedua embedding adalah sebagai berikut.

    +

    + + Correlation between embeddings + Korelasi antara penyematan

    +

    Kesamaan kosinus

    Kemiripan kosinus menggunakan kosinus dari sudut antara dua set vektor untuk mengukur seberapa mirip mereka. Anda dapat membayangkan dua set vektor sebagai segmen garis yang dimulai dari titik yang sama, seperti [0,0,...], tetapi mengarah ke arah yang berbeda.

    +

    Untuk menghitung kemiripan kosinus antara dua set vektor A = (a0, a1,...,an-1) dan B = (b0, b1,..., bn-1), gunakan rumus berikut.

    +

    + + Cosine similarity formula + Rumus kesamaan kosinus

    +

    Kesamaan kosinus selalu berada dalam interval [-1, 1]. Sebagai contoh, dua vektor proporsional memiliki kemiripan kosinus 1, dua vektor ortogonal memiliki kemiripan 0, dan dua vektor yang berlawanan memiliki kemiripan -1. Semakin besar kosinus, semakin kecil sudut antara dua vektor, yang menunjukkan bahwa kedua vektor tersebut semakin mirip satu sama lain.

    +

    Dengan mengurangkan kemiripan kosinusnya dari 1, Anda bisa mendapatkan jarak kosinus antara dua vektor.

    +

    Jarak JACCARD

    Koefisien kemiripan JACCARD mengukur kemiripan antara dua set sampel dan didefinisikan sebagai kardinalitas perpotongan set yang ditentukan dibagi dengan kardinalitas penyatuannya. Ini hanya dapat diterapkan pada set sampel yang terbatas.

    +

    + + JACCARD similarity coefficient formula + Rumus koefisien kemiripan JACCARD

    +

    Jarak JACCARD mengukur ketidaksamaan antara kumpulan data dan diperoleh dengan mengurangi koefisien kemiripan JACCARD dari 1. Untuk variabel biner, jarak JACCARD setara dengan koefisien Tanimoto.

    +

    + + JACCARD distance formula + Rumus jarak JACCARD

    +

    Jarak HAMMING

    Jarak HAMMING mengukur string data biner. Jarak antara dua string dengan panjang yang sama adalah jumlah posisi bit di mana bit-bitnya berbeda.

    +

    Sebagai contoh, misalkan ada dua string, 1101 1001 dan 1001 1101.

    +

    11011001 ⊕ 10011101 = 01000100. Karena ini mengandung dua 1, maka jarak HAMMING, d (11011001, 10011101) = 2.

    +

    Kesamaan BM25

    BM25 adalah metode pengukuran relevansi teks yang banyak digunakan, yang dirancang khusus untuk pencarian teks lengkap. Metode ini menggabungkan tiga faktor kunci berikut.

    +
      +
    • Frekuensi Istilah (TF): Mengukur seberapa sering sebuah istilah muncul dalam sebuah dokumen. Meskipun frekuensi yang lebih tinggi sering kali menunjukkan kepentingan yang lebih besar, BM25 menggunakan parameter saturasi k1 untuk mencegah istilah yang terlalu sering muncul mendominasi skor relevansi.

    • +
    • Frekuensi Dokumen Terbalik (Inverse Document Frequency/IDF): Mencerminkan pentingnya sebuah istilah di seluruh corpus. Istilah yang muncul di lebih sedikit dokumen menerima nilai IDF yang lebih tinggi, yang mengindikasikan kontribusi yang lebih besar terhadap relevansi.

    • +
    • Normalisasi Panjang Dokumen: Dokumen yang lebih panjang cenderung mendapat nilai lebih tinggi karena mengandung lebih banyak istilah. BM25 mengurangi bias ini dengan menormalkan panjang dokumen, dengan parameter b yang mengontrol kekuatan normalisasi ini.

    • +
    +

    Skor BM25 dihitung sebagai berikut.

    +

    + + BM25 similarity formula + Rumus kesamaan BM25

    +

    Deskripsi parameter.

    +
      +
    • ​Q: Teks kueri yang disediakan oleh pengguna.

    • +
    • ​D: Dokumen yang sedang dievaluasi.

    • +
    • ​TF(qi​,D): Frekuensi term, merepresentasikan seberapa sering term ​qi muncul dalam dokumen ​D.

    • +
    • ​IDF(qi​): Inverse document frequency, dihitung sebagai.

      +

      + + IDF formula + Rumus IDF

      +

      di mana ​N adalah jumlah total dokumen dalam korpus, dan ​n(qi​) adalah jumlah dokumen yang mengandung term qi.

    • +
    • ​∣D∣: Panjang dokumen ​D (jumlah total term).

    • +
    • ​avgdl: Panjang rata-rata dari semua dokumen dalam korpus.

    • +
    • ​k1​: Mengontrol pengaruh frekuensi term pada skor. Nilai yang lebih tinggi meningkatkan pentingnya frekuensi term. Kisaran tipikal adalah [1.2, 2.0], sementara Milvus memungkinkan kisaran [0, 3].

    • +
    • ​b: Mengontrol tingkat normalisasi panjang, mulai dari 0 hingga 1. Bila nilainya 0, tidak ada normalisasi yang diterapkan; bila nilainya 1, normalisasi penuh diterapkan.

    • +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.json b/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.json new file mode 100644 index 000000000..4979f67bb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.json @@ -0,0 +1 @@ +{"codeList":["# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n # Set memory mapping property for whole cluster\n mmapEnabled: false | true\n # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. \n mmapDirPath: any/valid/path \n....\n","# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n vectorField: false # Enable mmap for loading vector data\n vectorIndex: false # Enable mmap for loading vector index\n scalarField: false # Enable mmap for loading scalar data\n scalarIndex: false # Enable mmap for loading scalar index\n....\n","# Get existing collection\ncollection = Collection(\"test_collection\") # Replace with your collection name\n\n# Set memory mapping property to True or Flase\ncollection.set_properties({'mmap.enabled': True})\n","schema = MilvusClient.create_schema()\n\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)\n","collection.alter_index(\n index_name=\"vector_index\", # Replace with your vector index name\n extra_params={\"mmap.enabled\": True} # Enable memory mapping for index\n)\n","# new-values.yaml\nextraConfigFiles:\n user.yaml: |+\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \nhelm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# patch.yaml\nspec:\n config:\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \n kubectl patch milvus --patch-file patch.yaml\n","# A new installation script is provided to enable mmap-related settings.\n"],"headingContent":"MMap-enabled Data Storage","anchorList":[{"label":"Penyimpanan Data yang mendukung MMap","href":"MMap-enabled-Data-Storage","type":1,"isActive":false},{"label":"Mengonfigurasi pemetaan memori","href":"Configure-memory-mapping","type":2,"isActive":false},{"label":"Menyesuaikan jalur penyimpanan dalam penerapan yang berbeda","href":"Customize-storage-path-in-different-deployments","type":2,"isActive":false},{"label":"Batas","href":"Limits","type":2,"isActive":false},{"label":"PERTANYAAN UMUM","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.md b/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.md new file mode 100644 index 000000000..7ea4570b6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/mmap.md @@ -0,0 +1,190 @@ +--- +id: mmap.md +summary: MMap memungkinkan lebih banyak data dalam satu node. +title: Penyimpanan Data yang mendukung MMap +--- +

    Penyimpanan Data yang mendukung MMap

    Dalam Milvus, file yang dipetakan memori memungkinkan pemetaan langsung konten file ke dalam memori. Fitur ini meningkatkan efisiensi memori, khususnya dalam situasi di mana memori yang tersedia terbatas tetapi pemuatan data secara lengkap tidak memungkinkan. Mekanisme pengoptimalan ini dapat meningkatkan kapasitas data sekaligus memastikan kinerja hingga batas tertentu; namun, ketika jumlah data melebihi memori terlalu banyak, kinerja pencarian dan kueri dapat mengalami penurunan yang serius, jadi pilihlah untuk mengaktifkan atau menonaktifkan fitur ini sebagaimana mestinya.

    +

    Mengonfigurasi pemetaan memori

    Dimulai dengan Milvus 2.4, Anda memiliki fleksibilitas untuk menyesuaikan file konfigurasi statis untuk mengonfigurasi pengaturan pemetaan memori default untuk seluruh cluster sebelum penerapan. Selain itu, ada opsi bagi Anda untuk mengubah parameter secara dinamis untuk menyempurnakan pengaturan pemetaan memori di tingkat cluster dan indeks. Ke depannya, pembaruan di masa mendatang akan memperluas kemampuan pemetaan memori untuk menyertakan konfigurasi tingkat bidang.

    +

    Sebelum penerapan cluster: konfigurasi global

    Sebelum Anda menerapkan cluster, pengaturan tingkat cluster menerapkan pemetaan memori di seluruh cluster. Hal ini memastikan semua objek baru akan secara otomatis mematuhi konfigurasi ini. Penting untuk diperhatikan bahwa memodifikasi pengaturan ini memerlukan pengaktifan ulang cluster agar efektif.

    +

    Untuk menyesuaikan pengaturan pemetaan memori cluster Anda, edit file configs/milvus.yaml. Di dalam berkas ini, Anda dapat menentukan apakah akan mengaktifkan pemetaan memori secara default dan menentukan jalur direktori untuk menyimpan berkas yang dipetakan memori. Jika jalur (mmapDirPath) tidak ditentukan, sistem secara default akan menyimpan file yang dipetakan memori di {localStorage.path}/mmap. Untuk informasi lebih lanjut, lihat Konfigurasi terkait Penyimpanan Lokal.

    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    # Set memory mapping property for whole cluster
    +    mmapEnabled: false | true
    +    # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. 
    +    mmapDirPath: any/valid/path 
    +....
    +
    +

    Setelah 2.4.10, konfigurasi queryNode.mmap.mmapEnabled dibagi menjadi empat bidang terpisah di bawah ini, dan semua defaultnya adalah false:

    +
      +
    • queryNode.mmap.vectorField, mengontrol apakah data vektor adalah mmap;
    • +
    • queryNode.mmap.vectorIndex, mengontrol apakah indeks vektor adalah mmap;
    • +
    • queryNode.mmap.scalarField, mengontrol apakah data skalar adalah mmap;
    • +
    • queryNode.mmap.scalarIndex, mengontrol apakah indeks skalar adalah mmap;
    • +
    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    vectorField: false # Enable mmap for loading vector data
    +    vectorIndex: false # Enable mmap for loading vector index
    +    scalarField: false # Enable mmap for loading scalar data
    +    scalarIndex: false # Enable mmap for loading scalar index
    +....
    +
    +

    Selain itu, hanya indeks vektor dan data vektor mmap yang dapat diaktifkan dan dinonaktifkan untuk sebuah koleksi secara terpisah, tetapi tidak untuk koleksi lainnya.

    +

    Kompatibilitas: Jika konfigurasi asli queryNode.mmap.mmapEnabled diatur ke true, konfigurasi yang baru ditambahkan akan diatur ke true saat ini. Jika queryNode.mmap.mmapEnabled diatur ke false, jika konfigurasi baru diatur ke true, nilai akhir akan menjadi true.

    +

    Selama operasi cluster: konfigurasi dinamis

    Selama waktu kerja cluster, Anda dapat menyesuaikan pengaturan pemetaan memori secara dinamis pada tingkat koleksi atau indeks.

    +

    Pada tingkat koleksi, pemetaan memori diterapkan pada semua data mentah yang tidak diindeks di dalam koleksi, tidak termasuk kunci utama, stempel waktu, dan ID baris. Pendekatan ini sangat cocok untuk manajemen komprehensif kumpulan data yang besar.

    +

    Untuk penyesuaian dinamis pada pengaturan pemetaan memori dalam koleksi, gunakan metode set_properties(). Di sini, Anda dapat mengalihkan mmap.enabled antara True atau False sesuai kebutuhan.

    +
    # Get existing collection
    +collection = Collection("test_collection") # Replace with your collection name
    +
    +# Set memory mapping property to True or Flase
    +collection.set_properties({'mmap.enabled': True})
    +
    +

    Setelah 2.4.10, pengaturan pemetaan memori dalam koleksi, gunakan metode add_field. Di sini, Anda dapat mengganti mmap_enabled antara True atau False sesuai kebutuhan.

    +
    schema = MilvusClient.create_schema()
    +
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
    +
    +

    Untuk pengaturan tingkat indeks, pemetaan memori dapat diterapkan secara khusus pada indeks vektor tanpa mempengaruhi tipe data lainnya. Fitur ini sangat berharga untuk koleksi yang memerlukan kinerja yang dioptimalkan untuk pencarian vektor.

    +

    Untuk mengaktifkan atau menonaktifkan pemetaan memori untuk indeks dalam koleksi, panggil metode alter_index(), tentukan nama indeks target di index_name dan atur mmap.enabled ke True atau False.

    +
    collection.alter_index(
    +    index_name="vector_index", # Replace with your vector index name
    +    extra_params={"mmap.enabled": True} # Enable memory mapping for index
    +)
    +
    +

    Menyesuaikan jalur penyimpanan dalam penerapan yang berbeda

    File yang dipetakan secara default ke direktori /mmap di dalam localStorage.path. Berikut ini cara menyesuaikan pengaturan ini di berbagai metode penyebaran:

    +
      +
    • Untuk Milvus yang diinstal menggunakan Helm Chart:
    • +
    +
    # new-values.yaml
    +extraConfigFiles:
    +   user.yaml: |+
    +      queryNode:
    +         mmap:
    +           mmapEnabled: true
    +           mmapDirPath: any/valid/path
    +        
    +helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
      +
    • Untuk Milvus yang diinstal menggunakan Milvus Operator:
    • +
    +
    # patch.yaml
    +spec:
    +  config:
    +    queryNode:
    +      mmap:
    +        mmapEnabled: true
    +        mmapDirPath: any/valid/path
    +      
    + kubectl patch milvus <milvus-name> --patch-file patch.yaml
    +
    +
      +
    • Untuk Milvus yang diinstal menggunakan Docker:
    • +
    +
    # A new installation script is provided to enable mmap-related settings.
    +
    +

    Batas

      +
    • Pemetaan memori tidak dapat diaktifkan untuk koleksi yang dimuat, pastikan koleksi telah dirilis sebelum mengaktifkan pemetaan memori.

    • +
    • Pemetaan memori tidak didukung untuk indeks DiskANN atau indeks kelas GPU.

    • +
    +

    PERTANYAAN UMUM

      +
    • Dalam skenario apa saja yang disarankan untuk mengaktifkan pemetaan memori? Apa saja trade-off setelah mengaktifkan fitur ini?

      +

      Pemetaan memori direkomendasikan ketika memori terbatas atau ketika persyaratan kinerja sedang. Mengaktifkan fitur ini akan meningkatkan kapasitas pemuatan data. Misalnya, dengan konfigurasi 2 CPU dan memori 8 GB, mengaktifkan pemetaan memori dapat memungkinkan pemuatan data hingga 4 kali lebih banyak dibandingkan dengan tidak mengaktifkannya. Dampaknya pada performa bervariasi:

      +
        +
      • Dengan memori yang cukup, performa yang diharapkan serupa dengan performa yang hanya menggunakan memori.

      • +
      • Dengan memori yang tidak mencukupi, kinerja yang diharapkan dapat menurun.

      • +
    • +
    • Apa hubungan antara konfigurasi tingkat koleksi dan tingkat indeks?

      +

      Collection-level dan index-level bukanlah hubungan yang inklusif, collection-level mengontrol apakah data asli diaktifkan mmap atau tidak, sedangkan index-level hanya untuk indeks vektor.

    • +
    • Apakah ada jenis indeks yang direkomendasikan untuk pemetaan memori?

      +

      Ya, HNSW direkomendasikan untuk mengaktifkan mmap. Kami telah menguji indeks seri HNSW, IVF_FLAT, IVF_PQ/SQ sebelumnya, kinerja indeks seri IVF menurun drastis, sedangkan penurunan kinerja dengan mengaktifkan mmap untuk indeks HNSW masih sesuai dengan ekspektasi.

    • +
    • Jenis penyimpanan lokal seperti apa yang diperlukan untuk pemetaan memori?

      +

      Disk berkualitas tinggi akan meningkatkan performa, dengan drive NVMe sebagai opsi yang lebih disukai.

    • +
    • Apakah data skalar dapat dipetakan ke dalam memori?

      +

      Pemetaan memori dapat diterapkan pada data skalar, tetapi tidak dapat diterapkan pada indeks yang dibangun di atas bidang skalar.

    • +
    • Bagaimana prioritas ditentukan untuk konfigurasi pemetaan memori di berbagai level?

      +

      Dalam Milvus, ketika konfigurasi pemetaan memori secara eksplisit ditentukan di berbagai tingkat, konfigurasi tingkat indeks dan tingkat koleksi memiliki prioritas tertinggi, yang kemudian diikuti oleh konfigurasi tingkat kluster.

    • +
    • Jika saya meng-upgrade dari Milvus 2.3 dan telah mengonfigurasi jalur direktori pemetaan memori, apa yang akan terjadi?

      +

      Jika Anda mengupgrade dari Milvus 2.3 dan telah mengkonfigurasi jalur direktori pemetaan memori (mmapDirPath), konfigurasi Anda akan dipertahankan, dan pengaturan default untuk pemetaan memori yang diaktifkan (mmapEnabled) adalah true. Penting untuk memigrasikan metadata untuk menyinkronkan konfigurasi file pemetaan memori yang ada. Untuk detail lebih lanjut, lihat Memigrasi metadata.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.json new file mode 100644 index 000000000..82e4969a1 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.json @@ -0,0 +1 @@ +{"codeList":["# Create a collection in customized setup mode​\nfrom pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n# Add fields to schema​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(field_name=\"dense\", datatype=DataType.FLOAT_VECTOR, dim=5)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"text\")​\n .dataType(DataType.VarChar)​\n .maxLength(1000)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense\")​\n .dataType(DataType.FloatVector)​\n .dimension(768)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","// WIP​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// Create a collection in customized setup mode​\n// Define fields​\nconst fields = [​\n {​\n name: \"id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"text\",​\n data_type: DataType.VarChar,​\n max_length: 1000​\n },​\n {​\n name: \"sparse\",​\n data_type: DataType.SPARSE_FLOAT_VECTOR​\n },​\n {​\n name: \"dense\",​\n data_type: DataType.FloatVector,​\n dim: 768​\n }​\n]​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": true,​\n \"fields\": [​\n {​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"text\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 1000​\n }​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"dataType\": \"SparseFloatVector\"​\n },​\n {​\n \"fieldName\": \"dense\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"768\"​\n }​\n }​\n ]​\n }'​\n\n","from pymilvus import MilvusClient​\n​\n# Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# Add indexes​\nindex_params.add_index(​\n field_name=\"dense\",​\n index_name=\"dense_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128},​\n)​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_name=\"sparse_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\", # Index type for sparse vectors​\n metric_type=\"IP\", # Currently, only IP (Inner Product) is supported for sparse vectors​\n params={\"drop_ratio_build\": 0.2}, # The ratio of small vector values to be dropped during indexing​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nMap denseParams = new HashMap<>();​\ndenseParams.put(\"nlist\", 128);​\nIndexParam indexParamForDenseField = IndexParam.builder()​\n .fieldName(\"dense\")​\n .indexName(\"dense_index\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(denseParams)​\n .build();​\n​\nMap sparseParams = new HashMap<>();​\nsparseParams.put(\"drop_ratio_build\", 0.2);​\nIndexParam indexParamForSparseField = IndexParam.builder()​\n .fieldName(\"sparse\")​\n .indexName(\"sparse_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(sparseParams)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForDenseField);​\nindexParams.add(indexParamForSparseField);​\n\n","const index_params = [{​\n field_name: \"dense\",​\n index_type: \"IVF_FLAT\",​\n metric_type: \"IP\"​\n},{​\n field_name: \"sparse\",​\n index_type: \"SPARSE_INVERTED_INDEX\",​\n metric_type: \"IP\"​\n}]​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_index\",​\n \"indexType\":\"IVF_FLAT\",​\n \"params\":{\"nlist\":128}​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\"​\n }​\n ]'​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_collection(​\n collection_name=\"hybrid_search_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","res = await client.createCollection({​\n collection_name: \"hybrid_search_collection\",​\n fields: fields,​\n index_params: index_params,​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","from pymilvus import MilvusClient​\n​\ndata=[​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n​\nres = client.insert(​\n collection_name=\"hybrid_search_collection\",​\n data=data​\n)​\n​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\n​\nGson gson = new Gson();​\nJsonObject row1 = new JsonObject();​\nrow1.addProperty(\"id\", 1);​\nrow1.addProperty(\"text\", \"Artificial intelligence was founded as an academic discipline in 1956.\");​\nrow1.add(\"dense\", gson.toJsonTree(dense1));​\nrow1.add(\"sparse\", gson.toJsonTree(sparse1));​\n​\nJsonObject row2 = new JsonObject();​\nrow2.addProperty(\"id\", 2);​\nrow2.addProperty(\"text\", \"Alan Turing was the first person to conduct substantial research in AI.\");​\nrow2.add(\"dense\", gson.toJsonTree(dense2));​\nrow2.add(\"sparse\", gson.toJsonTree(sparse2));​\n​\nJsonObject row3 = new JsonObject();​\nrow3.addProperty(\"id\", 3);​\nrow3.addProperty(\"text\", \"Born in Maida Vale, London, Turing was raised in southern England.\");​\nrow3.add(\"dense\", gson.toJsonTree(dense3));​\nrow3.add(\"sparse\", gson.toJsonTree(sparse3));​\n​\nList data = Arrays.asList(row1, row2, row3);​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nvar data = [​\n {id: 0, text: \"Artificial intelligence was founded as an academic discipline in 1956.\", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​\n {id: 1, text: \"Alan Turing was the first person to conduct substantial research in AI.\", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​\n {id: 2, text: \"Born in Maida Vale, London, Turing was raised in southern England.\" , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"hybrid_search_collection\",​\n data: data,​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{\"9637\": 0.30856525997853057, \"4399\": 0.19771651149001523}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{\"6959\": 0.31025067641541815, \"1729\": 0.8265339135915016}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{\"1220\": 0.15303302147479103, \"7335\": 0.9436728846033107}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n ],​\n \"collectionName\": \"hybrid_search_collection\"​\n}'​\n\n","from pymilvus import AnnSearchRequest​\n​\nquery_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nsearch_param_1 = {​\n \"data\": [query_dense_vector],​\n \"anns_field\": \"dense\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2​\n}​\nrequest_1 = AnnSearchRequest(**search_param_1)​\n​\nquery_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​\nsearch_param_2 = {​\n \"data\": [query_sparse_vector],​\n \"anns_field\": \"sparse\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2​\n}​\nrequest_2 = AnnSearchRequest(**search_param_2)​\n​\nreqs = [request_1, request_2]​\n​\n\n","import io.milvus.v2.service.vector.request.AnnSearchReq;​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\n​\nfloat[] dense = new float[]{-0.0475336798f, 0.0521207601f, 0.0904406682f, ...};​\nSortedMap sparse = new TreeMap() {{​\n put(3573L, 0.34701499f);​\n put(5263L, 0.263937551f);​\n ...​\n}};​\n​\n​\nList queryDenseVectors = Collections.singletonList(new FloatVec(dense));​\nList querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​\n​\nList searchRequests = new ArrayList<>();​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"dense\")​\n .vectors(queryDenseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"nprobe\\\": 10}\")​\n .topK(2)​\n .build());​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"sparse\")​\n .vectors(querySparseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"drop_ratio_build\\\": 0.2}\")​\n .topK(2)​\n .build());​\n\n","const search_param_1 = {​\n \"data\": query_vector, ​\n \"anns_field\": \"dense\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n​\nconst search_param_2 = {​\n \"data\": query_sparse_vector, ​\n \"anns_field\": \"sparse\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n\n","export req='[​\n {​\n \"data\": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​\n \"annsField\": \"dense\",​\n \"params\": {​\n \"params\": {​\n \"nprobe\": 10​\n }​\n },​\n \"limit\": 2​\n },​\n {​\n \"data\": [{\"3573\": 0.34701499565746674}, {\"5263\": 0.2639375518635271}],​\n \"annsField\": \"sparse\",​\n \"params\": {​\n \"params\": {​\n \"drop_ratio_build\": 0.2​\n }​\n },​\n \"limit\": 2​\n }​\n ]'​\n\n","from pymilvus import WeightedRanker​\n​\nrerank= WeightedRanker(0.8, 0.3) ​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.WeightedRanker;​\n​\nBaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = WeightedRanker(0.8, 0.3);​\n\n","export rerank='{​\n \"strategy\": \"ws\",​\n \"params\": {\"weights\": [0.8,0.3]}​\n }'​\n\n","from pymilvus import RRFRanker​\n​\nranker = RRFRanker(100)​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.RRFRanker;​\n​\nBaseRanker reranker = new RRFRanker(100);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = RRFRanker(\"100\");​\n\n","export rerank='{​\n \"strategy\": \"rrf\",​\n \"params\": { \"k\": 100}​\n }'​\n\n","from pymilvus import MilvusClient​\n​\nres = client.hybrid_search(​\n collection_name=\"hybrid_search_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n limit=2​\n)​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.HybridSearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nHybridSearchReq hybridSearchReq = HybridSearchReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .searchRequests(searchRequests)​\n .ranker(reranker)​\n .topK(2)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.hybridSearch(hybridSearchReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.loadCollection({​\n collection_name: \"hybrid_search_collection\"​\n})​\n​\nimport { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​\n​\nconst search = await client.search({​\n collection_name: \"hybrid_search_collection\",​\n data: [search_param_1, search_param_2],​\n limit: 2,​\n rerank: RRFRanker(100)​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"search\\\": ${req},​\n \\\"rerank\\\": {​\n \\\"strategy\\\":\\\"rrf\\\",​\n \\\"params\\\": {​\n \\\"k\\\": 10​\n }​\n },​\n \\\"limit\\\": 3,​\n \\\"outputFields\\\": [​\n \\\"user_id\\\",​\n \\\"word_count\\\",​\n \\\"book_describe\\\"​\n ]​\n}\"​\n\n","[\"['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']\"]​\n\n"],"headingContent":"Hybrid Search​","anchorList":[{"label":"Pencarian Hibrida","href":"Hybrid-Search​","type":1,"isActive":false},{"label":"Skenario","href":"Scenarios​","type":2,"isActive":false},{"label":"Alur kerja","href":"Workflow​","type":2,"isActive":false},{"label":"Contoh","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.md new file mode 100644 index 000000000..78a76dda6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/multi-vector-search.md @@ -0,0 +1,683 @@ +--- +id: multi-vector-search.md +order: 2 +summary: >- + Panduan ini mendemonstrasikan cara melakukan pencarian hybrid di Milvus dan + memahami pemeringkatan hasil. +title: Pencarian Hibrida +--- +

    Pencarian Hibrida

    Pencarian Hibrida mengacu pada metode pencarian yang melakukan beberapa pencarian ANN secara bersamaan, memberi peringkat ulang beberapa set hasil dari pencarian ANN ini, dan pada akhirnya mengembalikan satu set hasil. Menggunakan Pencarian Hibrida dapat meningkatkan akurasi pencarian. Zilliz mendukung melakukan Pencarian Hibrida pada koleksi dengan beberapa bidang vektor.

    +

    Pencarian Hibrida paling sering digunakan dalam skenario yang mencakup pencarian vektor yang jarang dan pencarian multimodal. Panduan ini akan mendemonstrasikan cara melakukan Pencarian Hibrida di Zilliz dengan contoh spesifik.

    +

    Skenario

    Pencarian Hibrida cocok untuk dua skenario berikut.

    +

    Pencarian Vektor Jarang-Padat

    Jenis vektor yang berbeda dapat merepresentasikan informasi yang berbeda, dan menggunakan berbagai model penyematan dapat merepresentasikan fitur dan aspek data yang berbeda secara lebih komprehensif. Sebagai contoh, menggunakan model penyematan yang berbeda untuk kalimat yang sama dapat menghasilkan vektor padat untuk mewakili makna semantik dan vektor jarang untuk mewakili frekuensi kata dalam kalimat.

    +
      +
    • Vektor jarang: Vektor jarang dicirikan oleh dimensi vektor yang tinggi dan adanya beberapa nilai yang bukan nol. Struktur ini membuatnya sangat cocok untuk aplikasi pencarian informasi tradisional. Dalam banyak kasus, jumlah dimensi yang digunakan dalam vektor jarang sesuai dengan token yang berbeda di satu atau lebih bahasa. Setiap dimensi diberi nilai yang menunjukkan tingkat kepentingan relatif token tersebut dalam dokumen. Tata letak ini terbukti menguntungkan untuk tugas-tugas yang melibatkan pencocokan teks.

    • +
    • Vektor padat: Vektor padat adalah penyematan yang berasal dari jaringan saraf. Ketika disusun dalam larik yang teratur, vektor-vektor ini menangkap esensi semantik dari teks masukan. Perhatikan bahwa vektor padat tidak terbatas pada pemrosesan teks; vektor padat juga digunakan secara luas dalam visi komputer untuk merepresentasikan semantik data visual. Vektor padat ini, biasanya dihasilkan oleh model penyematan teks, dicirikan oleh sebagian besar atau semua elemen yang tidak nol. Dengan demikian, vektor padat sangat efektif untuk aplikasi pencarian semantik, karena dapat mengembalikan hasil yang paling mirip berdasarkan jarak vektor meskipun tidak ada kecocokan teks yang tepat. Kemampuan ini memungkinkan hasil pencarian yang lebih bernuansa dan sadar konteks, sering kali menangkap hubungan antar konsep yang mungkin terlewatkan oleh pendekatan berbasis kata kunci.

    • +
    +

    Untuk lebih jelasnya, lihat Vektor Jarang dan Vektor Padat.

    +

    Pencarian Multimodal

    Pencarian multimodal mengacu pada pencarian kemiripan data yang tidak terstruktur di berbagai modalitas (seperti gambar, video, audio, teks, dll.). Misalnya, seseorang dapat direpresentasikan dengan menggunakan berbagai modalitas data seperti sidik jari, rekaman suara, dan fitur wajah. Pencarian Hibrida mendukung beberapa pencarian secara bersamaan. Misalnya mencari seseorang dengan sidik jari dan sidik suara yang mirip.

    +

    Alur kerja

    Alur kerja utama untuk melakukan Pencarian Hibrida adalah sebagai berikut.

    +
      +
    1. Hasilkan vektor padat melalui model penyisipan seperti BERT dan Transformers.

    2. +
    3. Menghasilkan vektor yang jarang melalui model embedding seperti BM25, BGE-M3, SPLADE, dll.

    4. +
    5. Buat koleksi di Zilliz dan tentukan skema koleksi yang mencakup bidang vektor padat dan jarang.

    6. +
    7. Masukkan vektor jarang-padat ke dalam koleksi yang baru saja dibuat pada langkah sebelumnya.

    8. +
    9. Lakukan Pencarian Hibrida: Pencarian ANN pada vektor padat akan mengembalikan satu set hasil K teratas yang paling mirip, dan pencocokan teks pada vektor jarang juga akan mengembalikan satu set hasil K teratas.

    10. +
    11. Normalisasi: Menormalkan skor dari dua set hasil top-K, mengubah skor menjadi rentang antara [0,1].

    12. +
    13. Pilih strategi pemeringkatan ulang yang sesuai untuk menggabungkan dan memeringkat ulang dua set hasil top-K dan pada akhirnya mengembalikan satu set hasil top-K terakhir.

    14. +
    +

    + + Hybrid Search Workflow + Alur Kerja Pencarian Hibrida

    +

    Contoh

    Bagian ini akan menggunakan contoh spesifik untuk mengilustrasikan cara melakukan Pencarian Hibrida pada vektor yang jarang-jarang untuk meningkatkan akurasi pencarian teks.

    +

    Membuat koleksi dengan beberapa bidang vektor

    Proses membuat koleksi mencakup tiga bagian: menentukan skema koleksi, mengonfigurasi parameter indeks, dan membuat koleksi.

    +

    Menentukan skema

    Dalam contoh ini, beberapa bidang vektor perlu ditentukan dalam skema koleksi. Saat ini, setiap koleksi dapat menyertakan hingga 4 bidang vektor secara default. Namun Anda juga dapat memodifikasi nilai proxy.maxVectorFieldNum untuk menyertakan hingga 10 bidang vektor dalam koleksi sesuai kebutuhan.

    +

    Contoh berikut ini mendefinisikan skema koleksi, di mana dense dan sparse adalah dua bidang vektor.

    +
      +
    • id: Bidang ini berfungsi sebagai kunci utama untuk menyimpan ID teks. Tipe data dari field ini adalah INT64.

    • +
    • text: Bidang ini digunakan untuk menyimpan konten tekstual. Tipe data dari field ini adalah VARCHAR, dengan panjang maksimum 1000 karakter.

    • +
    • dense: Field ini digunakan untuk menyimpan vektor padat dari teks. Tipe data dari field ini adalah FLOAT_VECTOR, dengan dimensi vektor 768.

    • +
    • sparse: Field ini digunakan untuk menyimpan vektor jarang dari teks. Tipe data dari field ini adalah SPARSE_FLOAT_VECTOR.

    • +
    + +
    # Create a collection in customized setup mode​
    +from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +# Add fields to schema​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field(field_name="dense", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("text")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(1000)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(768)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    // WIP​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// Create a collection in customized setup mode​
    +// Define fields​
    +const fields = [​
    +    {​
    +        name: "id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "text",​
    +        data_type: DataType.VarChar,​
    +        max_length: 1000​
    +    },​
    +    {​
    +        name: "sparse",​
    +        data_type: DataType.SPARSE_FLOAT_VECTOR​
    +    },​
    +    {​
    +        name: "dense",​
    +        data_type: DataType.FloatVector,​
    +        dim: 768​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": true,​
    +        "fields": [​
    +            {​
    +                "fieldName": "id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "text",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 1000​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "sparse",​
    +                "dataType": "SparseFloatVector"​
    +            },​
    +            {​
    +                "fieldName": "dense",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "768"​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    Selama pencarian vektor jarang, Anda dapat menyederhanakan proses pembuatan vektor sematan jarang dengan memanfaatkan kemampuan Pencarian Teks Lengkap. Untuk lebih jelasnya, lihat Pencarian Teks Lengkap.

    +

    Membuat indeks

    Setelah menentukan skema koleksi, Anda perlu menyiapkan indeks vektor dan metrik kemiripan. Dalam contoh ini, indeks IVF_FLAT dibuat untuk bidang vektor padat dense, dan indeks SPARSE_INVERTED_INDEX dibuat untuk bidang vektor jarang sparse. Untuk mempelajari jenis-jenis indeks yang didukung, lihat Penjelasan Indeks.

    + +
    from pymilvus import MilvusClient​
    +​
    +# Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# Add indexes​
    +index_params.add_index(​
    +    field_name="dense",​
    +    index_name="dense_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128},​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_name="sparse_index",​
    +    index_type="SPARSE_INVERTED_INDEX",  # Index type for sparse vectors​
    +    metric_type="IP",  # Currently, only IP (Inner Product) is supported for sparse vectors​
    +    params={"drop_ratio_build": 0.2},  # The ratio of small vector values to be dropped during indexing​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +Map<String, Object> denseParams = new HashMap<>();​
    +denseParams.put("nlist", 128);​
    +IndexParam indexParamForDenseField = IndexParam.builder()​
    +        .fieldName("dense")​
    +        .indexName("dense_index")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(denseParams)​
    +        .build();​
    +​
    +Map<String, Object> sparseParams = new HashMap<>();​
    +sparseParams.put("drop_ratio_build", 0.2);​
    +IndexParam indexParamForSparseField = IndexParam.builder()​
    +        .fieldName("sparse")​
    +        .indexName("sparse_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(sparseParams)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForDenseField);​
    +indexParams.add(indexParamForSparseField);​
    +
    +
    +
    const index_params = [{​
    +    field_name: "dense",​
    +    index_type: "IVF_FLAT",​
    +    metric_type: "IP"​
    +},{​
    +    field_name: "sparse",​
    +    index_type: "SPARSE_INVERTED_INDEX",​
    +    metric_type: "IP"​
    +}]​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense",​
    +            "metricType": "IP",​
    +            "indexName": "dense_index",​
    +            "indexType":"IVF_FLAT",​
    +            "params":{"nlist":128}​
    +        },​
    +        {​
    +            "fieldName": "sparse",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Membuat koleksi

    Buat koleksi bernama demo dengan skema koleksi dan indeks yang telah dikonfigurasi dalam dua langkah sebelumnya.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_collection(​
    +    collection_name="hybrid_search_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    res = await client.createCollection({​
    +    collection_name: "hybrid_search_collection",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Masukkan data

    Masukkan vektor-vektor yang jarang-jarang ke dalam koleksi demo.

    + +
    from pymilvus import MilvusClient​
    +​
    +data=[​
    +    {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +    {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +    {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +​
    +res = client.insert(​
    +    collection_name="hybrid_search_collection",​
    +    data=data​
    +)​
    +​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +​
    +Gson gson = new Gson();​
    +JsonObject row1 = new JsonObject();​
    +row1.addProperty("id", 1);​
    +row1.addProperty("text", "Artificial intelligence was founded as an academic discipline in 1956.");​
    +row1.add("dense", gson.toJsonTree(dense1));​
    +row1.add("sparse", gson.toJsonTree(sparse1));​
    +​
    +JsonObject row2 = new JsonObject();​
    +row2.addProperty("id", 2);​
    +row2.addProperty("text", "Alan Turing was the first person to conduct substantial research in AI.");​
    +row2.add("dense", gson.toJsonTree(dense2));​
    +row2.add("sparse", gson.toJsonTree(sparse2));​
    +​
    +JsonObject row3 = new JsonObject();​
    +row3.addProperty("id", 3);​
    +row3.addProperty("text", "Born in Maida Vale, London, Turing was raised in southern England.");​
    +row3.add("dense", gson.toJsonTree(dense3));​
    +row3.add("sparse", gson.toJsonTree(sparse3));​
    +​
    +List<JsonObject> data = Arrays.asList(row1, row2, row3);​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +var data = [​
    +    {id: 0, text: "Artificial intelligence was founded as an academic discipline in 1956.", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​
    +    {id: 1, text: "Alan Turing was the first person to conduct substantial research in AI.", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​
    +    {id: 2, text: "Born in Maida Vale, London, Turing was raised in southern England." , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]}       ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "hybrid_search_collection",​
    +    data: data,​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{"9637": 0.30856525997853057, "4399": 0.19771651149001523}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +        {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{"6959": 0.31025067641541815, "1729": 0.8265339135915016}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +        {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{"1220": 0.15303302147479103, "7335": 0.9436728846033107}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +    ],​
    +    "collectionName": "hybrid_search_collection"​
    +}'​
    +
    +
    +

    Membuat beberapa instance AnnSearchRequest

    Pencarian Hibrida diimplementasikan dengan membuat beberapa AnnSearchRequest dalam fungsi hybrid_search(), di mana setiap AnnSearchRequest merepresentasikan permintaan pencarian ANN dasar untuk bidang vektor tertentu. Oleh karena itu, sebelum melakukan Pencarian Hibrida, perlu untuk membuat AnnSearchRequest untuk setiap bidang vektor.

    +
    +

    Dalam Pencarian Hibrida, setiap AnnSearchRequest hanya mendukung satu vektor kueri.

    +
    +

    Misalkan teks kueri "Siapa yang memulai penelitian AI?" telah dikonversi menjadi vektor jarang dan padat. Berdasarkan hal ini, dua permintaan pencarian AnnSearchRequest dibuat untuk bidang vektor sparse dan dense, seperti yang ditunjukkan pada contoh berikut.

    + +
    from pymilvus import AnnSearchRequest​
    +​
    +query_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +search_param_1 = {​
    +    "data": [query_dense_vector],​
    +    "anns_field": "dense",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2​
    +}​
    +request_1 = AnnSearchRequest(**search_param_1)​
    +​
    +query_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​
    +search_param_2 = {​
    +    "data": [query_sparse_vector],​
    +    "anns_field": "sparse",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2​
    +}​
    +request_2 = AnnSearchRequest(**search_param_2)​
    +​
    +reqs = [request_1, request_2]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.AnnSearchReq;​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +​
    +float[] dense = new float[]{-0.0475336798f,  0.0521207601f,  0.0904406682f, ...};​
    +SortedMap<Long, Float> sparse = new TreeMap<Long, Float>() {{​
    +    put(3573L, 0.34701499f);​
    +    put(5263L, 0.263937551f);​
    +    ...​
    +}};​
    +​
    +​
    +List<BaseVector> queryDenseVectors = Collections.singletonList(new FloatVec(dense));​
    +List<BaseVector> querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​
    +​
    +List<AnnSearchReq> searchRequests = new ArrayList<>();​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("dense")​
    +        .vectors(queryDenseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"nprobe\": 10}")​
    +        .topK(2)​
    +        .build());​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("sparse")​
    +        .vectors(querySparseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"drop_ratio_build\": 0.2}")​
    +        .topK(2)​
    +        .build());​
    +
    +
    +
    const search_param_1 = {​
    +    "data": query_vector, ​
    +    "anns_field": "dense", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +​
    +const search_param_2 = {​
    +    "data": query_sparse_vector, ​
    +    "anns_field": "sparse", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +
    +
    +
    export req='[​
    +    {​
    +        "data": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​
    +        "annsField": "dense",​
    +        "params": {​
    +            "params": {​
    +                "nprobe": 10​
    +             }​
    +        },​
    +        "limit": 2​
    +    },​
    +    {​
    +        "data": [{"3573": 0.34701499565746674}, {"5263": 0.2639375518635271}],​
    +        "annsField": "sparse",​
    +        "params": {​
    +            "params": {​
    +                "drop_ratio_build": 0.2​
    +             }​
    +        },​
    +        "limit": 2​
    +    }​
    + ]'​
    +
    +
    +

    Karena parameter limit disetel ke 2, maka setiap AnnSearchRequest mengembalikan 2 hasil pencarian. Dalam contoh ini, 2 AnnSearchRequest dibuat, oleh karena itu total 4 hasil pencarian akan dikembalikan.

    +

    Mengonfigurasi strategi perankingan ulang

    Untuk menggabungkan dan memberi peringkat ulang dua set hasil pencarian ANN, Anda perlu memilih strategi perangkingan ulang yang sesuai. Zilliz mendukung dua jenis strategi pemeringkatan ulang: WeightedRanker dan RRFRanker. Saat memilih strategi perankingan ulang, satu hal yang perlu dipertimbangkan adalah apakah ada penekanan untuk satu atau lebih pencarian ANN dasar pada bidang vektor.

    +
      +
    • WeightedRanker: Strategi ini direkomendasikan jika Anda membutuhkan hasil untuk menekankan bidang vektor tertentu. WeightedRanker memungkinkan Anda untuk memberikan bobot yang lebih tinggi pada bidang vektor tertentu, sehingga lebih menekankannya. Misalnya, dalam pencarian multimodal, deskripsi tekstual dari sebuah gambar mungkin dianggap lebih penting daripada warna pada gambar tersebut.

    • +
    • RRFRanker (Reciprocal Rank Fusion Ranker): Strategi ini direkomendasikan apabila tidak ada penekanan khusus. RRF secara efektif dapat menyeimbangkan pentingnya setiap bidang vektor.

    • +
    +

    Untuk detail lebih lanjut tentang mekanisme kedua strategi pemeringkatan ulang ini, lihat Pemeringkatan Ulang.

    +

    Dua contoh berikut ini menunjukkan cara menggunakan strategi perangkingan ulang WeightedRanker dan RRFRanker.

    +
      +
    1. Contoh 1: Menggunakan WeightedRanker

      +

      Saat menggunakan strategi WeightedRanker, Anda perlu memasukkan nilai bobot ke dalam fungsi WeightedRanker. Jumlah pencarian ANN dasar dalam Pencarian Hibrida sesuai dengan jumlah nilai yang perlu dimasukkan. Nilai input harus berada dalam rentang [0,1], dengan nilai yang lebih dekat ke 1 menunjukkan kepentingan yang lebih besar.

      +

      +
      from pymilvus import WeightedRanker​
      +​
      +rerank= WeightedRanker(0.8, 0.3) ​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.WeightedRanker;​
      +​
      +BaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = WeightedRanker(0.8, 0.3);​
      +
      +
      +
      export rerank='{​
      +        "strategy": "ws",​
      +        "params": {"weights": [0.8,0.3]}​
      +    }'​
      +
      +
    2. +
    3. Contoh 2: Menggunakan RRFRanker

      +

      Ketika menggunakan strategi RRFRanker, Anda perlu memasukkan nilai parameter k ke dalam RRFRanker. Nilai default dari k adalah 60. Parameter ini membantu menentukan bagaimana peringkat digabungkan dari pencarian ANN yang berbeda, yang bertujuan untuk menyeimbangkan dan memadukan kepentingan di semua pencarian.

      +

      +
      from pymilvus import RRFRanker​
      +​
      +ranker = RRFRanker(100)​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.RRFRanker;​
      +​
      +BaseRanker reranker = new RRFRanker(100);​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = RRFRanker("100");​
      +
      +
      +
      export rerank='{​
      +        "strategy": "rrf",​
      +        "params": { "k": 100}​
      +    }'​
      +
      +
    4. +
    +

    Melakukan Pencarian Hibrida

    Sebelum melakukan Pencarian Hibrida, koleksi harus dimuat ke dalam memori. Jika ada bidang vektor dalam koleksi yang tidak memiliki indeks atau tidak dimuat, kesalahan akan terjadi saat memanggil metode Pencarian Hibrida.

    + +
    from pymilvus import MilvusClient​
    +​
    +res = client.hybrid_search(​
    +    collection_name="hybrid_search_collection",​
    +    reqs=reqs,​
    +    ranker=ranker,​
    +    limit=2​
    +)​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.HybridSearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +HybridSearchReq hybridSearchReq = HybridSearchReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .searchRequests(searchRequests)​
    +        .ranker(reranker)​
    +        .topK(2)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.hybridSearch(hybridSearchReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.loadCollection({​
    +    collection_name: "hybrid_search_collection"​
    +})​
    +​
    +import { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​
    +​
    +const search = await client.search({​
    +  collection_name: "hybrid_search_collection",​
    +  data: [search_param_1, search_param_2],​
    +  limit: 2,​
    +  rerank: RRFRanker(100)​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"search\": ${req},​
    +    \"rerank\": {​
    +        \"strategy\":\"rrf\",​
    +        \"params\": {​
    +            \"k\": 10​
    +        }​
    +    },​
    +    \"limit\": 3,​
    +    \"outputFields\": [​
    +        \"user_id\",​
    +        \"word_count\",​
    +        \"book_describe\"​
    +    ]​
    +}"​
    +
    +
    +

    Berikut ini adalah keluarannya.

    +
    ["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]​
    +
    +
    +

    Karena limit=2 ditentukan dalam Pencarian Hibrida, Zilliz akan memberi peringkat ulang empat hasil pencarian dari langkah 3 dan pada akhirnya hanya mengembalikan 2 hasil pencarian yang paling mirip.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.json new file mode 100644 index 000000000..9d1f527d6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={​\n # highlight-start​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n # highlight-end​\n }​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"radius\", 0.4);​\nextraParams.put(\"range_filter\", 0.6);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"range_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .searchParams(extraParams)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​\n\n","// TODO ​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"range_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n params: {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"searchParams\": {​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n }​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n"],"headingContent":"Range Search​","anchorList":[{"label":"Pencarian Rentang","href":"Range-Search​","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview​","type":2,"isActive":false},{"label":"Contoh","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.md new file mode 100644 index 000000000..2d73c2d16 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/range-search.md @@ -0,0 +1,214 @@ +--- +id: range-search.md +summary: >- + Pencarian rentang meningkatkan relevansi hasil pencarian dengan membatasi + jarak atau skor entitas yang dikembalikan dalam rentang tertentu. Halaman ini + membantu Anda memahami apa itu pencarian rentang dan prosedur untuk melakukan + pencarian rentang. +title: Pencarian Rentang +--- +

    Pencarian Rentang

    Pencarian rentang meningkatkan relevansi hasil pencarian dengan membatasi jarak atau skor entitas yang dikembalikan dalam rentang tertentu. Halaman ini membantu Anda memahami apa itu pencarian rentang dan prosedur untuk melakukan pencarian rentang.

    +

    Ikhtisar

    Saat menjalankan permintaan Pencarian Rentang, Milvus menggunakan vektor yang paling mirip dengan vektor kueri dari hasil Pencarian ANN sebagai pusat, dengan radius yang ditentukan dalam permintaan Pencarian sebagai radius lingkaran luar, dan range_filter sebagai radius lingkaran dalam untuk menggambar dua lingkaran konsentris. Semua vektor dengan nilai kemiripan yang berada di dalam wilayah lingkaran yang dibentuk oleh dua lingkaran konsentris ini akan dikembalikan. Di sini, range_filter dapat diatur ke 0, yang mengindikasikan bahwa semua entitas yang berada di dalam nilai kemiripan yang ditentukan (radius) akan dikembalikan.

    +

    + + Range search + Pencarian rentang

    +

    Diagram di atas menunjukkan bahwa permintaan pencarian rentang membawa dua parameter: radius dan range_filter. Setelah menerima permintaan pencarian rentang, Milvus melakukan hal berikut.

    +
      +
    • Gunakan jenis metrik yang ditentukan(COSINE) untuk menemukan semua sematan vektor yang paling mirip dengan vektor kueri.

    • +
    • Saring sematan vektor yang jarak atau nilainya ke vektor kueri berada dalam rentang yang ditentukan oleh parameter radius dan range_filter.

    • +
    • Kembalikan entitas-K teratas dari yang difilter.

    • +
    +

    Cara mengatur radius dan range_filter bervariasi sesuai dengan jenis metrik pencarian. Tabel berikut mencantumkan persyaratan untuk mengatur kedua parameter ini dengan jenis metrik yang berbeda.

    +

    Jenis Metrik

    +

    Denotasi

    +

    Persyaratan untuk Mengatur radius dan range_filter

    +

    L2

    +

    Jarak L2 yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa

    +

    range_filter <= jarak < radius

    +

    IP

    +

    Jarak IP yang lebih besar menunjukkan kemiripan yang lebih tinggi.

    +

    Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa

    +

    radius < jarak <= range_filter

    +

    COSINE

    +

    Jarak COSINE yang lebih besar menunjukkan kemiripan yang lebih tinggi.

    +

    Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa

    +

    radius < jarak <= range_filter

    +

    JACCARD

    +

    Jarak Jaccard yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    +

    Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa

    +

    range_filter <= jarak < radius

    +

    HAMMING

    +

    Jarak Hamming yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    Untuk mengabaikan penyematan vektor yang paling mirip, pastikan bahwa

    +

    range_filter <= jarak < radius

    +
    +

    Contoh

    Bagian ini mendemonstrasikan cara melakukan pencarian rentang. Permintaan pencarian dalam cuplikan kode berikut ini tidak membawa jenis metrik, yang menunjukkan jenis metrik default COSINE berlaku. Dalam kasus ini, pastikan bahwa nilai radius lebih kecil dari nilai range_filter.

    +

    Pada potongan kode berikut ini, setel radius ke 0.4 dan range_filter ke 0.6 sehingga Milvus mengembalikan semua entitas yang jarak atau nilainya ke vektor kueri berada di antara 0,4 hingga 0,6.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={​
    +        # highlight-start​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +        # highlight-end​
    +    }​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    + io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("radius", 0.4);​
    +extraParams.put("range_filter", 0.6);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("range_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .searchParams(extraParams)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​
    +
    +
    +
    // TODO ​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "range_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    params: {​
    +        "radius": 0.4,​
    +        "range_filter": 0.6​
    +    }​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "searchParams": {​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +    }​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.json b/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.json new file mode 100644 index 000000000..a779b485c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import WeightedRanker\n\n# Use WeightedRanker to combine results with specified weights\nrerank = WeightedRanker(0.8, 0.8, 0.7) \n","from pymilvus import RRFRanker\n\n# Default k value is 60\nranker = RRFRanker()\n\n# Or specify k value\nranker = RRFRanker(k=100)\n"],"headingContent":"Reranking","anchorList":[{"label":"Pemeringkatan ulang","href":"Reranking","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Penilaian Tertimbang (WeightedRanker)","href":"Weighted-Scoring-WeightedRanker","type":2,"isActive":false},{"label":"Reciprocal Rank Fusion (RRFRanker)","href":"Reciprocal-Rank-Fusion-RRFRanker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.md b/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.md new file mode 100644 index 000000000..5d52c1fe0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/reranking.md @@ -0,0 +1,122 @@ +--- +id: reranking.md +summary: >- + Topik ini mencakup proses pemeringkatan ulang, menjelaskan pentingnya dan + implementasi dua metode pemeringkatan ulang. +title: Pemeringkatan ulang +--- +

    Pemeringkatan ulang

    Milvus memungkinkan kemampuan pencarian hibrida menggunakan API hybrid_search(), yang menggabungkan strategi perangkingan ulang yang canggih untuk menyaring hasil pencarian dari beberapa contoh AnnSearchRequest. Topik ini mencakup proses perankingan ulang, menjelaskan pentingnya dan implementasi strategi perankingan ulang yang berbeda di Milvus.

    +

    Gambaran Umum

    Gambar berikut mengilustrasikan eksekusi pencarian hybrid di Milvus dan menyoroti peran perangkingan ulang dalam prosesnya.

    +

    reranking_process

    +

    Perangkingan ulang dalam pencarian hybrid adalah langkah penting yang mengkonsolidasikan hasil dari beberapa bidang vektor, memastikan hasil akhir relevan dan diprioritaskan secara akurat. Saat ini, Milvus menawarkan strategi perankingan ulang ini:

    +
      +
    • WeightedRanker: Pendekatan ini menggabungkan hasil dengan menghitung rata-rata tertimbang skor (atau jarak vektor) dari pencarian vektor yang berbeda. Pendekatan ini memberikan bobot berdasarkan signifikansi setiap bidang vektor.

    • +
    • RRFRanker: Strategi ini menggabungkan hasil berdasarkan peringkat mereka di kolom vektor yang berbeda.

    • +
    +

    Penilaian Tertimbang (WeightedRanker)

    Strategi WeightedRanker memberikan bobot yang berbeda untuk hasil dari setiap rute pencarian vektor berdasarkan signifikansi setiap bidang vektor. Strategi pemeringkatan ulang ini diterapkan ketika signifikansi setiap bidang vektor bervariasi, sehingga Anda dapat menekankan bidang vektor tertentu di atas bidang vektor lainnya dengan memberikan bobot yang lebih tinggi. Sebagai contoh, dalam pencarian multimodal, deskripsi teks mungkin dianggap lebih penting daripada distribusi warna pada gambar.

    +

    Proses dasar WeightedRanker adalah sebagai berikut:

    +
      +
    • Kumpulkan Skor Selama Pengambilan: Mengumpulkan hasil dan skornya dari berbagai rute pengambilan vektor.

    • +
    • Normalisasi Skor: Menormalkan skor dari setiap rute ke rentang [0,1], di mana nilai yang mendekati 1 menunjukkan relevansi yang lebih tinggi. Normalisasi ini sangat penting karena distribusi skor bervariasi dengan jenis metrik yang berbeda. Sebagai contoh, jarak untuk IP berkisar dari [-∞,+∞], sedangkan jarak untuk L2 berkisar dari [0,+∞]. Milvus menggunakan fungsi arctan, yang mengubah nilai ke rentang [0,1] untuk memberikan dasar standar untuk berbagai jenis metrik.

      +

      arctan-function

    • +
    • Alokasi Bobot: Menetapkan bobot w𝑖 untuk setiap rute pengambilan vektor. Pengguna menentukan bobot, yang mencerminkan keandalan, akurasi, atau metrik terkait lainnya dari sumber data. Setiap bobot berkisar dari [0,1].

    • +
    • Penggabungan Skor: Menghitung rata-rata tertimbang dari skor yang dinormalisasi untuk mendapatkan skor akhir. Hasilnya kemudian diberi peringkat berdasarkan skor tertinggi hingga terendah untuk menghasilkan hasil akhir yang diurutkan.

    • +
    +

    + + weighted-reranker + perangking-tertimbang

    +

    Untuk menggunakan strategi ini, terapkan sebuah contoh WeightedRanker dan tetapkan nilai bobot dengan memasukkan sejumlah argumen numerik.

    +
    from pymilvus import WeightedRanker
    +
    +# Use WeightedRanker to combine results with specified weights
    +rerank = WeightedRanker(0.8, 0.8, 0.7) 
    +
    +

    Perhatikan bahwa:

    +
      +
    • Setiap nilai bobot berkisar dari 0 (paling tidak penting) hingga 1 (paling penting), yang memengaruhi skor agregat akhir.

    • +
    • Jumlah total nilai bobot yang disediakan di WeightedRanker harus sama dengan jumlah instance AnnSearchRequest yang telah Anda buat sebelumnya.

    • +
    • Perlu dicatat bahwa karena pengukuran yang berbeda dari jenis metrik yang berbeda, kami menormalkan jarak hasil penarikan sehingga berada pada interval [0,1], di mana 0 berarti berbeda dan 1 berarti serupa. Skor akhir adalah jumlah dari nilai bobot dan jarak.

    • +
    +

    Reciprocal Rank Fusion (RRFRanker)

    RRF adalah metode fusi data yang menggabungkan daftar peringkat berdasarkan kebalikan dari peringkat mereka. Ini adalah cara yang efektif untuk menyeimbangkan pengaruh setiap bidang vektor, terutama ketika tidak ada prioritas yang jelas tentang kepentingan. Strategi ini biasanya digunakan ketika Anda ingin memberikan pertimbangan yang sama pada semua bidang vektor atau ketika ada ketidakpastian tentang kepentingan relatif setiap bidang.

    +

    Proses dasar RRF adalah sebagai berikut:

    +
      +
    • Kumpulkan Peringkat Selama Pengambilan: Pengambil di beberapa bidang vektor mengambil dan mengurutkan hasil.

    • +
    • Penggabungan Peringkat: Algoritme RRF menimbang dan menggabungkan peringkat dari setiap retriever. Rumusnya adalah sebagai berikut:

      +

      + + rrf-ranker + rrf-ranker

      +

      Di sini, 𝑁 mewakili jumlah rute pengambilan yang berbeda, rank𝑖(𝑑) adalah posisi peringkat dokumen yang diambil 𝑑 oleh retriever ke-𝑖, dan 𝑘 adalah parameter perataan, biasanya ditetapkan ke 60.

    • +
    • Pemeringkatan Komprehensif: Beri peringkat ulang hasil yang diambil berdasarkan skor gabungan untuk menghasilkan hasil akhir.

    • +
    +

    Untuk menggunakan strategi ini, gunakan contoh RRFRanker.

    +
    from pymilvus import RRFRanker
    +
    +# Default k value is 60
    +ranker = RRFRanker()
    +
    +# Or specify k value
    +ranker = RRFRanker(k=100)
    +
    +

    RRF memungkinkan menyeimbangkan pengaruh di seluruh bidang tanpa menentukan bobot secara eksplisit. Kecocokan teratas yang disepakati oleh beberapa bidang akan diprioritaskan dalam peringkat akhir.

    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.json b/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.json new file mode 100644 index 000000000..b35e8e5de --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n anns_field=\"vector\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"}​\n)​\n​\nfor hits in res:​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 7. Search with multiple vectors​\n# 7.1. Prepare query vectors​\nquery_vectors = [​\n [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​\n [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​\n]​\n​\n# 7.2. Start search​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# Output​\n#​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ],​\n# [​\n# {​\n# \"id\": 730,​\n# \"distance\": 0.04431751370429993,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 333,​\n# \"distance\": 0.04231833666563034,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 232,​\n# \"distance\": 0.04221535101532936,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nList queryVectors = Arrays.asList(​\n new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​\n new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​\n);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(queryVectors)​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​\n// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​\n// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​\n// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​\n\n","// 7. Search with multiple vectors​\nconst query_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n vectors: query_vectors,​\n limit: 5,​\n})​\n​\nconsole.log(res.results)​\n​\n// Output​\n// ​\n// [​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ],​\n// [​\n// { score: 0.04431751370429993, id: '730' },​\n// { score: 0.04231833666563034, id: '333' },​\n// { score: 0.04221535101532936, id: '232' },​\n// ]​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ],​\n# [​\n# {​\n# \"distance\": 0.04431751370429993,​\n# \"id\": 730​\n# },​\n# {​\n# \"distance\": 0.04231833666563034,​\n# \"id\": 333​\n# },​\n# {​\n# \"distance\": 0.04221535101532936,​\n# \"id\": 232​\n# }​\n# ]​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n data=[query_vector],​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​\n// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​\n// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_names: [\"partitionA\"],​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"],​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-next-line​\n output_fields=[\"color\"]​\n)​\n​\nprint(res)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {​\n# \"color\": \"orange_6781\"​\n# }​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {​\n# \"color\": \"red_4794\"​\n# }​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {​\n# \"color\": \"grey_8510\"​\n# }​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n // highlight-next-line​\n output_fields: [\"color\"]​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551', entity: {\"color\": \"orange_6781\"}},​\n// { score: 0.0800950899720192, id: '296' entity: {\"color\": \"red_4794\"}},​\n// { score: 0.07794742286205292, id: '43' entity: {\"color\": \"grey_8510\"}}​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551,​\n# \"color\": \"orange_6781\"​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296,​\n# \"color\": \"red_4794\"​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# \"color\": \"grey_8510\"​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={​\n \"metric_type\": \"IP\", ​\n # highlight-next-line​\n \"offset\": 10 # The records to skip​\n }​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .offset(10)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​\n// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​\n// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return,​\n // highlight-next-line​\n offset: 10 // The record to skip.​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"offset\": 10​\n}'​\n\n"],"headingContent":"Ba​sic ANN Search","anchorList":[{"label":"Pencarian ANN Dasar","href":"Ba​sic-ANN-Search","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Pencarian Vektor Tunggal","href":"Single-Vector-Search​","type":2,"isActive":false},{"label":"Pencarian Vektor Massal","href":"Bulk-Vector-Search​","type":2,"isActive":false},{"label":"Pencarian ANN dalam Partisi","href":"ANN-Search-in-Partition​","type":2,"isActive":false},{"label":"Gunakan Bidang Keluaran","href":"Use-Output-Fields​","type":2,"isActive":false},{"label":"Gunakan Batas dan Offset","href":"Use-Limit-and-Offset​","type":2,"isActive":false},{"label":"Meningkatkan Pencarian ANN","href":"Enhancing-ANN-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.md b/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.md new file mode 100644 index 000000000..5d2fc2491 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/single-vector-search.md @@ -0,0 +1,919 @@ +--- +id: single-vector-search.md +order: 1 +summary: >- + Artikel ini menjelaskan cara mencari vektor dalam koleksi Milvus menggunakan + vektor kueri tunggal. +title: Pencarian ANN Dasar +--- +

    Pencarian ANN Dasar

    Berdasarkan file indeks yang merekam urutan penyematan vektor yang diurutkan, pencarian Approximate Nearest Neighbor (ANN) menemukan subkumpulan penyematan vektor berdasarkan vektor kueri yang dibawa dalam permintaan pencarian yang diterima, membandingkan vektor kueri dengan vektor yang ada di subkelompok, dan mengembalikan hasil yang paling mirip. Dengan pencarian ANN, Milvus memberikan pengalaman pencarian yang efisien. Halaman ini membantu Anda mempelajari cara melakukan pencarian ANN dasar.

    +

    Gambaran Umum

    ANN dan pencarian k-Nearest Neighbors (kNN) adalah metode yang umum digunakan dalam pencarian kemiripan vektor. Dalam pencarian kNN, Anda harus membandingkan semua vektor dalam ruang vektor dengan vektor kueri yang dibawa dalam permintaan pencarian sebelum mencari yang paling mirip, yang memakan waktu dan sumber daya.

    +

    Tidak seperti pencarian kNN, algoritme pencarian ANN meminta file indeks yang mencatat urutan penyematan vektor yang diurutkan. Ketika permintaan pencarian masuk, Anda dapat menggunakan file indeks sebagai referensi untuk dengan cepat menemukan subkelompok yang mungkin berisi sematan vektor yang paling mirip dengan vektor kueri. Kemudian, Anda dapat menggunakan jenis metrik yang ditentukan untuk mengukur kemiripan antara vektor kueri dan vektor dalam subkelompok, mengurutkan anggota kelompok berdasarkan kemiripan dengan vektor kueri, dan mencari anggota kelompok K teratas.

    +

    Pencarian ANN bergantung pada indeks yang dibuat sebelumnya, dan throughput pencarian, penggunaan memori, serta ketepatan pencarian dapat bervariasi sesuai dengan jenis indeks yang Anda pilih. Anda perlu menyeimbangkan kinerja pencarian dan ketepatan.

    +

    Untuk mengurangi kurva pembelajaran, Milvus menyediakan AUTOINDEX. Dengan AUTOINDEX, Milvus dapat menganalisis distribusi data dalam koleksi Anda saat membangun indeks dan menetapkan parameter indeks yang paling optimal berdasarkan analisis untuk menyeimbangkan kinerja pencarian dan ketepatan.

    +

    Untuk detail tentang AUTOINDEX dan jenis metrik yang berlaku, lihat AUTOINDEX dan Jenis Metrik. Di bagian ini, Anda akan menemukan informasi terperinci tentang topik-topik berikut.

    + +

    Pencarian Vektor Tunggal

    Dalam pencarian ANN, pencarian vektor tunggal mengacu pada pencarian yang hanya melibatkan satu vektor kueri. Berdasarkan indeks yang telah dibuat sebelumnya dan jenis metrik yang dibawa dalam permintaan pencarian, Milvus akan menemukan vektor K teratas yang paling mirip dengan vektor kueri.

    +

    Pada bagian ini, Anda akan belajar bagaimana melakukan pencarian vektor tunggal. Cuplikan kode mengasumsikan Anda telah membuat koleksi dengan cara penyiapan cepat. Permintaan pencarian membawa satu vektor kueri dan meminta Milvus menggunakan Inner Product (IP) untuk menghitung kemiripan antara vektor kueri dan vektor di dalam koleksi dan mengembalikan tiga vektor yang paling mirip.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    anns_field="vector",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"}​
    +)​
    +​
    +for hits in res:​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +    ​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,             // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Milvus mengurutkan hasil pencarian berdasarkan nilai kemiripannya dengan vektor kueri dalam urutan menurun. Skor kemiripan juga disebut sebagai jarak ke vektor kueri, dan rentang nilainya bervariasi dengan jenis metrik yang digunakan.

    +

    Tabel berikut mencantumkan jenis metrik yang berlaku dan rentang jarak yang sesuai.

    +

    Jenis Metrik

    +

    Karakteristik

    +

    Rentang Jarak

    +

    L2

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    [0, ∞)

    +

    IP

    +

    Nilai yang lebih besar menunjukkan kemiripan yang lebih tinggi.

    +

    [-1, 1]

    +

    COSINE

    +

    Nilai yang lebih besar menunjukkan kemiripan yang lebih tinggi.

    +

    [-1, 1]

    +

    JACCARD

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    [0, 1]

    +

    HAMMING

    +

    Nilai yang lebih kecil menunjukkan kemiripan yang lebih tinggi.

    +

    [0, redup(vektor)]

    +
    +

    Pencarian Vektor Massal

    Demikian pula, Anda dapat menyertakan beberapa vektor kueri dalam permintaan pencarian. Milvus akan melakukan pencarian ANN untuk vektor kueri secara paralel dan mengembalikan dua set hasil.

    + +
    # 7. Search with multiple vectors​
    +# 7.1. Prepare query vectors​
    +query_vectors = [​
    +    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​
    +    [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​
    +]​
    +​
    +# 7.2. Start search​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# Output​
    +#​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ],​
    +#     [​
    +#         {​
    +#             "id": 730,​
    +#             "distance": 0.04431751370429993,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 333,​
    +#             "distance": 0.04231833666563034,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 232,​
    +#             "distance": 0.04221535101532936,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +List<BaseVector> queryVectors = Arrays.asList(​
    +        new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​
    +        new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​
    +);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(queryVectors)​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​
    +// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​
    +// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​
    +// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​
    +
    +
    +
    // 7. Search with multiple vectors​
    +const query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​
    +    [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    vectors: query_vectors,​
    +    limit: 5,​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// Output​
    +// ​
    +// [​
    +//   [​
    +//     { score: 0.08821295201778412, id: '551' },​
    +//     { score: 0.0800950899720192, id: '296' },​
    +//     { score: 0.07794742286205292, id: '43' }​
    +//   ],​
    +//   [​
    +//     { score: 0.04431751370429993, id: '730' },​
    +//     { score: 0.04231833666563034, id: '333' },​
    +//     { score: 0.04221535101532936, id: '232' },​
    +//   ]​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +        [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         [​
    +#           {​
    +#               "distance": 0.08821295201778412,​
    +#               "id": 551​
    +#           },​
    +#           {​
    +#               "distance": 0.0800950899720192,​
    +#               "id": 296​
    +#           },​
    +#           {​
    +#               "distance": 0.07794742286205292,​
    +#               "id": 43​
    +#           }​
    +#         ],​
    +#         [​
    +#           {​
    +#               "distance": 0.04431751370429993,​
    +#               "id": 730​
    +#           },​
    +#           {​
    +#               "distance": 0.04231833666563034,​
    +#               "id": 333​
    +#           },​
    +#           {​
    +#               "distance": 0.04221535101532936,​
    +#               "id": 232​
    +#           }​
    +#        ]​
    +#     ]​
    +# }​
    +
    +
    +

    Pencarian ANN dalam Partisi

    Misalkan Anda telah membuat beberapa partisi dalam koleksi, dan Anda dapat mempersempit cakupan pencarian ke sejumlah partisi tertentu. Dalam hal ini, Anda dapat menyertakan nama partisi target dalam permintaan pencarian untuk membatasi cakupan pencarian dalam partisi yang ditentukan. Mengurangi jumlah partisi yang terlibat dalam pencarian akan meningkatkan kinerja pencarian.

    +

    Cuplikan kode berikut ini mengasumsikan partisi bernama PartitionA dalam koleksi Anda.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    data=[query_vector],​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​
    +// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​
    +// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_names: ["partitionA"],​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"],​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Gunakan Bidang Keluaran

    Dalam hasil pencarian, Milvus menyertakan nilai bidang utama dan jarak/skor kemiripan dari entitas yang mengandung sematan vektor K teratas secara default. Anda dapat menyertakan nama bidang target dalam permintaan pencarian sebagai bidang keluaran untuk membuat hasil pencarian membawa nilai dari bidang lain dalam entitas ini.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-next-line​
    +    output_fields=["color"]​
    +)​
    +​
    +print(res)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {​
    +#                 "color": "orange_6781"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {​
    +#                 "color": "red_4794"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {​
    +#                 "color": "grey_8510"​
    +#             }​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +    // highlight-next-line​
    +    output_fields: ["color"]​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551', entity: {"color": "orange_6781"}},​
    +//   { score: 0.0800950899720192, id: '296' entity: {"color": "red_4794"}},​
    +//   { score: 0.07794742286205292, id: '43' entity: {"color": "grey_8510"}}​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551,​
    +#             "color": "orange_6781"​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296,​
    +#             "color": "red_4794"​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#             "color": "grey_8510"​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Gunakan Batas dan Offset

    Anda mungkin memperhatikan bahwa parameter limit yang dibawa dalam permintaan pencarian menentukan jumlah entitas yang akan disertakan dalam hasil pencarian. Parameter ini menentukan jumlah maksimum entitas yang akan dikembalikan dalam satu pencarian, dan biasanya disebut top-K.

    +

    Jika Anda ingin melakukan kueri berpaginasi, Anda dapat menggunakan perulangan untuk mengirim beberapa permintaan Pencarian, dengan parameter Batas dan Offset yang dibawa dalam setiap permintaan kueri. Secara khusus, Anda dapat mengatur parameter Limit ke jumlah Entitas yang ingin Anda sertakan dalam hasil kueri saat ini, dan mengatur Offset ke jumlah total Entitas yang telah dikembalikan.

    +

    Tabel di bawah ini menguraikan cara mengatur parameter Limit dan Offset untuk kueri berpaginasi saat mengembalikan 100 Entitas sekaligus.

    +

    Kueri

    +

    Entitas yang akan dikembalikan per kueri

    +

    Entitas yang telah dikembalikan secara total

    +

    Kueri pertama

    +

    100

    +

    0

    +

    Kueri kedua

    +

    100

    +

    100

    +

    Kueri ke-3

    +

    100

    +

    200

    +

    Kueri ke-n

    +

    100

    +

    100 x (n-1)

    +
    +

    Perhatikan bahwa, jumlah dari limit dan offset dalam satu pencarian ANN harus kurang dari 16.384.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={​
    +        "metric_type": "IP", ​
    +        # highlight-next-line​
    +        "offset": 10 # The records to skip​
    +    }​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .offset(10)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​
    +// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​
    +// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return,​
    +    // highlight-next-line​
    +    offset: 10 // The record to skip.​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "offset": 10​
    +}'​
    +
    +
    +

    Meningkatkan Pencarian ANN

    AUTOINDEX meratakan kurva pembelajaran pencarian ANN. Namun, hasil pencarian mungkin tidak selalu benar seiring dengan meningkatnya top-K. Dengan mengurangi cakupan pencarian, meningkatkan relevansi hasil pencarian, dan mendiversifikasi hasil pencarian, Milvus melakukan peningkatan pencarian berikut ini.

    +
      +
    • Pencarian yang Difilter

      +

      Anda dapat menyertakan kondisi pemfilteran dalam permintaan pencarian sehingga Milvus melakukan pemfilteran metadata sebelum melakukan pencarian ANN, mengurangi cakupan pencarian dari seluruh koleksi menjadi hanya entitas yang sesuai dengan kondisi pemfilteran yang ditentukan.

      +

      Untuk mengetahui lebih lanjut tentang pemfilteran metadata dan kondisi pemfilteran, lihat Pencarian yang Difilter dan Pemfilteran Metadata.

    • +
    • Pencarian Rentang

      +

      Anda dapat meningkatkan relevansi hasil pencarian dengan membatasi jarak atau skor entitas yang dikembalikan dalam rentang tertentu. Di Milvus, pencarian rentang melibatkan gambar dua lingkaran konsentris dengan penyematan vektor yang paling mirip dengan vektor kueri sebagai pusatnya. Permintaan pencarian menentukan jari-jari kedua lingkaran, dan Milvus mengembalikan semua sematan vektor yang berada di dalam lingkaran luar tetapi tidak di dalam lingkaran dalam.

      +

      Untuk mengetahui lebih lanjut tentang pencarian rentang, lihat Pencarian Rentang.

    • +
    • Pencarian Pengelompokan

      +

      Jika entitas yang dikembalikan memiliki nilai yang sama di bidang tertentu, hasil pencarian mungkin tidak mewakili distribusi semua sematan vektor di ruang vektor. Untuk mendiversifikasi hasil pencarian, pertimbangkan untuk menggunakan pencarian pengelompokan.

      +

      Untuk mengetahui lebih lanjut tentang pencarian pengelompokan, lihat Pencarian Pengelompokan.

    • +
    • Pencarian Hibrida

      +

      Sebuah koleksi dapat mencakup hingga empat bidang vektor untuk menyimpan penyematan vektor yang dihasilkan menggunakan model penyematan yang berbeda. Dengan demikian, Anda dapat menggunakan pencarian hibrida untuk memberi peringkat ulang hasil pencarian dari bidang vektor ini, sehingga meningkatkan tingkat penemuan kembali.

      +

      Untuk mengetahui lebih lanjut tentang pencarian hibrida, lihat Pencarian Hibrida.

    • +
    • Iterator Pencarian

      +

      Satu pencarian ANN mengembalikan maksimal 16.384 entitas. Pertimbangkan untuk menggunakan iterator pencarian jika Anda membutuhkan lebih banyak entitas untuk dikembalikan dalam satu pencarian.

      +

      Untuk detail tentang iterator pencarian, lihat Iterator Pencarian.

    • +
    • Pencarian Teks Lengkap

      +

      Pencarian teks lengkap adalah fitur yang mengambil dokumen yang mengandung istilah atau frasa tertentu dalam kumpulan data teks, lalu memberi peringkat hasil berdasarkan relevansi. Fitur ini mengatasi keterbatasan pencarian semantik, yang mungkin mengabaikan istilah yang tepat, sehingga memastikan Anda menerima hasil yang paling akurat dan relevan secara kontekstual. Selain itu, fitur ini menyederhanakan pencarian vektor dengan menerima input teks mentah, secara otomatis mengubah data teks Anda menjadi sematan yang jarang tanpa perlu membuat sematan vektor secara manual.

      +

      Untuk detail tentang pencarian teks lengkap, lihat Pencarian Teks Lengkap.

    • +
    • Pencocokan Teks

      +

      Pencocokan teks di Milvus memungkinkan pengambilan dokumen yang tepat berdasarkan istilah tertentu. Fitur ini terutama digunakan untuk pencarian yang difilter untuk memenuhi kondisi tertentu dan dapat menggabungkan pemfilteran skalar untuk menyempurnakan hasil kueri, sehingga memungkinkan pencarian kemiripan di dalam vektor yang memenuhi kriteria skalar.

      +

      Untuk detail tentang pencocokan teks, lihat Pencocokan Teks.

    • +
    • Gunakan Kunci Partisi

      +

      Melibatkan beberapa bidang skalar dalam pemfilteran metadata dan menggunakan kondisi pemfilteran yang agak rumit dapat memengaruhi efisiensi pencarian. Setelah Anda menetapkan bidang skalar sebagai kunci partisi dan menggunakan kondisi pemfilteran yang melibatkan kunci partisi dalam permintaan pencarian, hal ini dapat membantu membatasi cakupan pencarian di dalam partisi yang sesuai dengan nilai kunci partisi yang ditentukan.

      +

      Untuk detail tentang kunci partisi, lihat Menggunakan Kunci Partisi.

    • +
    • Gunakan mmap

      +

      Di Milvus, file yang dipetakan memori memungkinkan pemetaan langsung konten file ke dalam memori. Fitur ini meningkatkan efisiensi memori, khususnya dalam situasi di mana memori yang tersedia terbatas namun pemuatan data secara lengkap tidak memungkinkan. Mekanisme pengoptimalan ini dapat meningkatkan kapasitas data sekaligus memastikan performa hingga batas tertentu; namun, apabila jumlah data melebihi memori, performa pencarian dan kueri dapat mengalami penurunan yang serius, jadi pilihlah untuk mengaktifkan atau menonaktifkan fitur ini sebagaimana mestinya.

      +

      Untuk detail tentang pengaturan mmap, lihat Menggunakan mmap.

    • +
    • Pemadatan Pengelompokan

      +

      Pemadatan pengelompokan dirancang untuk meningkatkan kinerja pencarian dan mengurangi biaya dalam koleksi yang besar. Panduan ini akan membantu Anda memahami pemadatan pengelompokan dan bagaimana fitur ini dapat meningkatkan kinerja pencarian.

      +

      Untuk detail tentang pemadatan pengelompokan, lihat Pemadatan Pengelompokan.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.json b/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.json new file mode 100644 index 000000000..fc30cf63a --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nschema = client.create_schema()​\n​\n# Add the partition key​\nschema.add_field(​\n field_name=\"my_varchar\", ​\n datatype=DataType.VARCHAR, ​\n max_length=512,​\n # highlight-next-line​\n is_partition_key=True,​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\n// Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// Add the partition key​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n // highlight-next-line​\n .isPartitionKey(true)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512,​\n // highlight-next-line​\n is_partition_key: true​\n }​\n]​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isPartitionKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next-line​\n num_partitions=1024​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n .numPartitions(1024)​\n .build();​\n client.createCollection(createCollectionReq);​\n\n","await client.create_collection({​\n collection_name: \"my_collection\",​\n schema: schema,​\n num_partitions: 1024​\n})​\n\n","export params='{​\n \"partitionsNum\": 1024​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"myCollection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# Filter based on a single partition key value, or​\nfilter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nfilter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","// Filter based on a single partition key value, or​\nString filter = \"partition_key == 'x' && \";​\n​\n// Filter based on multiple partition key values​\nString filter = \"partition_key in ['x', 'y', 'z'] && \";​\n\n","// Filter based on a single partition key value, or​\nconst filter = 'partition_key == \"x\" && '​\n​\n// Filter based on multiple partition key values​\nconst filter = 'partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","# Filter based on a single partition key value, or​\nexport filter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nexport filter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n"],"headingContent":"Use Partition Key​","anchorList":[{"label":"Gunakan Kunci Partisi","href":"Use-Partition-Key​","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview​","type":2,"isActive":false},{"label":"Gunakan Kunci Partisi","href":"Use-Partition-Key​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.md b/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.md new file mode 100644 index 000000000..0aff1f83b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/use-partition-key.md @@ -0,0 +1,245 @@ +--- +id: use-partition-key.md +title: Gunakan Kunci Partisi +--- +

    Gunakan Kunci Partisi

    Kunci Partisi adalah solusi pengoptimalan pencarian berdasarkan partisi. Dengan menetapkan bidang skalar tertentu sebagai Kunci Partisi dan menentukan kondisi pemfilteran berdasarkan Kunci Partisi selama pencarian, cakupan pencarian dapat dipersempit menjadi beberapa partisi, sehingga meningkatkan efisiensi pencarian. Artikel ini akan memperkenalkan cara menggunakan Kunci Partisi dan pertimbangan terkait.

    +

    Gambaran Umum

    Di Milvus, Anda dapat menggunakan partisi untuk mengimplementasikan pemisahan data dan meningkatkan performa pencarian dengan membatasi cakupan pencarian ke partisi tertentu. Jika Anda memilih untuk mengelola partisi secara manual, Anda dapat membuat maksimal 1.024 partisi dalam koleksi, dan menyisipkan entitas ke dalam partisi-partisi ini berdasarkan aturan tertentu sehingga Anda dapat mempersempit cakupan pencarian dengan membatasi pencarian dalam sejumlah partisi tertentu.

    +

    Milvus memperkenalkan Kunci Partisi agar Anda dapat menggunakan kembali partisi dalam pemisahan data untuk mengatasi batas jumlah partisi yang dapat Anda buat dalam koleksi. Ketika membuat koleksi, Anda dapat menggunakan bidang skalar sebagai Kunci Partisi. Setelah koleksi siap, Milvus akan membuat sejumlah partisi di dalam koleksi dengan masing-masing partisi yang sesuai dengan rentang nilai dalam Kunci Partisi. Setelah menerima entitas yang dimasukkan, Milvus menyimpannya ke dalam partisi yang berbeda berdasarkan nilai Kunci Partisi.

    +

    + + Partition v.s. Partition Key + Partisi vs Kunci Partisi

    +

    Gambar berikut mengilustrasikan bagaimana Milvus memproses permintaan pencarian dalam koleksi dengan atau tanpa fitur Kunci Partisi diaktifkan.

    +
      +
    • Jika Kunci Partisi dinonaktifkan, Milvus akan mencari entitas yang paling mirip dengan vektor kueri di dalam koleksi. Anda dapat mempersempit cakupan pencarian jika Anda tahu partisi mana yang berisi hasil yang paling relevan.

    • +
    • Jika Kunci Partisi diaktifkan, Milvus menentukan cakupan pencarian berdasarkan nilai Kunci Partisi yang ditentukan dalam filter pencarian dan hanya memindai entitas di dalam partisi yang cocok.

    • +
    +

    + + With or Without Partition Key + Dengan atau Tanpa Kunci Partisi

    +

    Menggunakan Kunci Partisi

    Untuk menggunakan Kunci Partisi, Anda perlu

    +
      +
    • Mengatur Kunci Partisi.

    • +
    • Mengatur jumlah partisi yang akan dibuat (Opsional), dan

    • +
    • Buat kondisi pemfilteran berdasarkan Kunci Partisi.

    • +
    +

    Mengatur Kunci Partisi

    Untuk menetapkan bidang skalar sebagai Kunci Partisi, Anda perlu menyetel atribut is_partition_key ke true saat Anda menambahkan bidang skalar.

    + +
    from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +schema = client.create_schema()​
    +​
    +# Add the partition key​
    +schema.add_field(​
    +    field_name="my_varchar", ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=512,​
    +    # highlight-next-line​
    +    is_partition_key=True,​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +// Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// Add the partition key​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        // highlight-next-line​
    +        .isPartitionKey(true)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512,​
    +        // highlight-next-line​
    +        is_partition_key: true​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isPartitionKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    Mengatur Nomor Partisi

    Ketika Anda menetapkan sebuah bidang skalar dalam koleksi sebagai Kunci Partisi, Milvus secara otomatis membuat 16 partisi dalam koleksi tersebut. Setelah menerima sebuah entitas, Milvus memilih partisi berdasarkan nilai Partition Key dari entitas tersebut dan menyimpan entitas di dalam partisi tersebut, yang mengakibatkan beberapa atau semua partisi menyimpan entitas dengan nilai Partition Key yang berbeda.

    +

    Anda juga dapat menentukan jumlah partisi yang akan dibuat bersama dengan koleksi. Ini hanya berlaku jika Anda memiliki bidang skalar yang ditetapkan sebagai Kunci Partisi.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_partitions=1024​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +                .collectionName("my_collection")​
    +                .collectionSchema(schema)​
    +                .numPartitions(1024)​
    +                .build();​
    +        client.createCollection(createCollectionReq);​
    +
    +
    +
    await client.create_collection({​
    +    collection_name: "my_collection",​
    +    schema: schema,​
    +    num_partitions: 1024​
    +})​
    +
    +
    +
    export params='{​
    +    "partitionsNum": 1024​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"myCollection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Membuat Kondisi Pemfilteran

    Ketika melakukan pencarian ANN dalam koleksi dengan fitur Partition Key diaktifkan, Anda perlu menyertakan ekspresi pemfilteran yang melibatkan Partition Key dalam permintaan pencarian. Dalam ekspresi pemfilteran, Anda dapat membatasi nilai Partition Key dalam rentang tertentu sehingga Milvus membatasi cakupan pencarian dalam partisi yang sesuai.

    +

    Contoh berikut ini menunjukkan pemfilteran berbasis Kunci Partisi berdasarkan nilai Kunci Partisi tertentu dan sekumpulan nilai Kunci Partisi.

    + +
    # Filter based on a single partition key value, or​
    +filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +String filter = "partition_key == 'x' && <other conditions>";​
    +​
    +// Filter based on multiple partition key values​
    +String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +const filter = 'partition_key == "x" && <other conditions>'​
    +​
    +// Filter based on multiple partition key values​
    +const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    # Filter based on a single partition key value, or​
    +export filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +export filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.json b/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.json new file mode 100644 index 000000000..0d0c087fb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create iterator​\nquery_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​\n​\ncollection = Collection(\"iterator_collection\")​\n​\niterator = collection.search_iterator(​\n data=query_vectors,​\n anns_field=\"vector\",​\n param={\"metric_type\": \"L2\", \"params\": {\"nprobe\": 16}},​\n # highlight-next-line​\n batch_size=50,​\n output_fields=[\"color\"],​\n # highlight-next-line​\n limit=20000​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.orm.iterator.SearchIterator;​\nimport io.milvus.v2.common.IndexParam.MetricType;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​\n .collectionName(\"iterator_collection\")​\n .vectors(Collections.singletonList(queryVector))​\n .vectorFieldName(\"vector\")​\n .batchSize(500L)​\n .outputFields(Lists.newArrayList(\"color\"))​\n .topK(20000)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","results = []​\n​\nwhile True:​\n # highlight-next-line​\n result = iterator.next()​\n if not result:​\n # highlight-next-line​\n iterator.close()​\n break​\n ​\n for hit in result:​\n results.append(hit.to_dict())​\n\n","import io.milvus.response.QueryResultsWrapper;​\n​\nwhile (true) {​\n List res = searchIterator.next();​\n if (res.isEmpty()) {​\n searchIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n\n"],"headingContent":"Search Iterator​","anchorList":[{"label":"Iterator Pencarian","href":"Search-Iterator​","type":1,"isActive":false},{"label":"Ikhtisar","href":"Overview​","type":2,"isActive":false},{"label":"Membuat SearchIterator","href":"Create-SearchIterator​","type":2,"isActive":false},{"label":"Menggunakan SearchIterator","href":"Use-SearchIterator​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.md b/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.md new file mode 100644 index 000000000..f62fc2deb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/search-query-get/with-iterators.md @@ -0,0 +1,163 @@ +--- +id: with-iterators.md +order: 4 +summary: >- + Milvus menyediakan iterator pencarian dan kueri untuk mengulangi hasil dengan + volume entitas yang besar. +title: Dengan Iterator +--- +

    Iterator Pencarian

    Pencarian ANN memiliki batas maksimum jumlah entitas yang dapat dipanggil dalam satu kueri, dan hanya dengan menggunakan Pencarian ANN dasar mungkin tidak dapat memenuhi permintaan pencarian berskala besar. Untuk permintaan Pencarian ANN di mana topK melebihi 16.384, disarankan untuk mempertimbangkan menggunakan SearchIterator. Bagian ini akan memperkenalkan cara menggunakan SearchIterator dan pertimbangan terkait.

    +

    Ikhtisar

    Permintaan Pencarian mengembalikan hasil pencarian, sementara SearchIterator mengembalikan iterator. Anda bisa memanggil metode next() dari iterator ini untuk mendapatkan hasil pencarian.

    +

    Secara khusus, Anda dapat menggunakan SearchIterator sebagai berikut.

    +
      +
    1. Buat SearchIterator dan tetapkan jumlah entitas yang akan dikembalikan per permintaan pencarian dan jumlah total entitas yang akan dikembalikan.

    2. +
    3. Panggil metode next() dari SearchIterator dalam satu perulangan untuk mendapatkan hasil pencarian dengan cara berpigura.

    4. +
    5. Panggil metode close() dari iterator untuk mengakhiri perulangan jika metode next() mengembalikan hasil kosong.

    6. +
    +

    Membuat SearchIterator

    Cuplikan kode berikut ini menunjukkan cara membuat SearchIterator.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create iterator​
    +query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​
    +​
    +collection = Collection("iterator_collection")​
    +​
    +iterator = collection.search_iterator(​
    +    data=query_vectors,​
    +    anns_field="vector",​
    +    param={"metric_type": "L2", "params": {"nprobe": 16}},​
    +    # highlight-next-line
    +    batch_size=50,​
    +    output_fields=["color"],​
    +    # highlight-next-line
    +    limit=20000​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.orm.iterator.SearchIterator;​
    +import io.milvus.v2.common.IndexParam.MetricType;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​
    +        .collectionName("iterator_collection")​
    +        .vectors(Collections.singletonList(queryVector))​
    +        .vectorFieldName("vector")​
    +        .batchSize(500L)​
    +        .outputFields(Lists.newArrayList("color"))​
    +        .topK(20000)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +

    Pada contoh di atas, Anda telah mengatur jumlah entitas yang akan dikembalikan per pencarian(batch_size/batchSize) menjadi 50, dan jumlah total entitas yang akan dikembalikan(topK) menjadi 20.000.

    +

    Menggunakan SearchIterator

    Setelah SearchIterator siap, Anda dapat memanggil metode next() untuk mendapatkan hasil pencarian dengan cara yang berurutan.

    + +
    results = []​
    +​
    +while True:​
    +    # highlight-next-line​
    +    result = iterator.next()​
    +    if not result:​
    +        # highlight-next-line​
    +        iterator.close()​
    +        break​
    +    ​
    +    for hit in result:​
    +        results.append(hit.to_dict())​
    +
    +
    +
    import io.milvus.response.QueryResultsWrapper;​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = searchIterator.next();​
    +    if (res.isEmpty()) {​
    +        searchIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +
    +
    +

    Pada contoh kode di atas, Anda telah membuat perulangan tak terbatas dan memanggil metode next() di dalam perulangan untuk menyimpan hasil pencarian di sebuah variabel dan menutup iterator ketika next() tidak menghasilkan apa-apa.

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.json b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.json new file mode 100644 index 000000000..58d27e03b --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo install github.com/milvus-io/birdwatcher\n","go run main.go\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo build -o birdwatcher main.go\n","./birdwatcher\n","wget -O birdwatcher.tar.gz \\\nhttps://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher__.tar.gz\n","tar -xvzf birdwatcher.tar.gz\n./birdwatcher\n","apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: birdwatcher\nspec:\n selector:\n matchLabels:\n app: birdwatcher\n template:\n metadata:\n labels:\n app: birdwatcher\n spec:\n containers:\n - name: birdwatcher\n image: milvusdb/birdwatcher\n resources:\n limits:\n memory: \"128Mi\"\n cpu: \"500m\"\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ndocker build -t milvusdb/birdwatcher .\n","...\n - name: birdwatcher\n image: milvusdb/birdwatcher\n imagePullPolicy: Never\n...\n","kubectl apply -f deployment.yml\n"],"headingContent":"Install Birdwatcher","anchorList":[{"label":"Menginstal Birdwatcher","href":"Install-Birdwatcher","type":1,"isActive":false},{"label":"Instalasi lokal","href":"Local-install","type":2,"isActive":false},{"label":"Instal sebagai pod Kubernetes","href":"Install-as-a-Kubernetes-pod","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.md b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.md new file mode 100644 index 000000000..0a5feeaa6 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_install_guides.md @@ -0,0 +1,118 @@ +--- +id: birdwatcher_install_guides.md +summary: Pelajari cara menginstal Birdwatch untuk men-debug Milvus. +title: Menginstal Birdwatcher +--- +

    Menginstal Birdwatcher

    Halaman ini menunjukkan cara menginstal Birdwatcher.

    +

    Instalasi lokal

    Jika Anda telah menginstal Milvus Standalone menggunakan docker, Anda sebaiknya mengunduh dan menginstal biner yang telah dibangun, menginstal Birdwatcher sebagai modul Go biasa, atau membangun Birdwatcher dari sumbernya.

    +
      +
    • Instal sebagai modul Go biasa.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go install github.com/milvus-io/birdwatcher
      +
      +

      Kemudian Anda dapat menjalankan Birdwatcher sebagai berikut:

      +
      go run main.go
      +
    • +
    • Membangunnya dari sumbernya.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go build -o birdwatcher main.go
      +
      +

      Kemudian Anda dapat menjalankan Birdwatcher sebagai berikut:

      +
      ./birdwatcher
      +
    • +
    • Mengunduh biner yang sudah dibangun

      +

      Pertama, buka halaman rilis terbaru, dan temukan biner yang sudah disiapkan.

      +
      wget -O birdwatcher.tar.gz \
      +https://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher_<os>_<arch>.tar.gz
      +
      +

      Kemudian Anda dapat mendekompresi tarball dan menggunakan Birdwatcher sebagai berikut:

      +
      tar -xvzf birdwatcher.tar.gz
      +./birdwatcher
      +
    • +
    +

    Instal sebagai pod Kubernetes

    Jika Anda telah menginstal Milvus Standalone menggunakan grafik Helm atau Milvus Operator atau Milvus Cluster menggunakan grafik Helm atau Milvus Operator, Anda disarankan untuk menginstal Birdwatcher sebagai pod Kubernetes.

    +

    Siapkan deployment.yml

    apiVersion: apps/v1
    +kind: Deployment
    +metadata:
    +  name: birdwatcher
    +spec:
    +  selector:
    +    matchLabels:
    +      app: birdwatcher
    +  template:
    +    metadata:
    +      labels:
    +        app: birdwatcher
    +    spec:
    +      containers:
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        resources:
    +          limits:
    +            memory: "128Mi"
    +            cpu: "500m"
    +
    +
    +

    Jika citra yang tersedia di DockerHub bukan yang terbaru, Anda dapat membangun citra Birdwatcher menggunakan Dockerfile yang disediakan dengan kode sumber sebagai berikut:

    +
    git clone https://github.com/milvus-io/birdwatcher.git
    +cd birdwatcher
    +docker build -t milvusdb/birdwatcher .
    +
    +

    Untuk men-deploy citra yang dibangun secara lokal, Anda perlu menambahkan imagePullPolicy ke spesifikasi di atas dan mengaturnya ke Never.

    +
    ...
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        imagePullPolicy: Never
    +...
    +
    +
    +

    Menerapkan deployment.yml

    Simpan YAML di atas dalam sebuah berkas dan beri nama deployment.yml, dan jalankan perintah berikut

    +
    kubectl apply -f deployment.yml
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.json b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.json new file mode 100644 index 000000000..258e668b9 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Birdwatcher","anchorList":[{"label":"Pengamat burung","href":"Birdwatcher","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisite","type":2,"isActive":false},{"label":"Arsitektur","href":"Architecture","type":2,"isActive":false},{"label":"Rilis terbaru","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.md b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.md new file mode 100644 index 000000000..7cdc8d50e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_overview.md @@ -0,0 +1,77 @@ +--- +id: birdwatcher_overview.md +summary: >- + Birdwatcher adalah alat debug untuk Milvus 2.x. Alat ini terhubung ke etcd dan + memeriksa status sistem Milvus. +title: Pengamat burung +--- +

    Pengamat burung

    Milvus adalah basis data vektor tanpa nama yang memisahkan pembacaan dan penulisan dan menjadikan etcd sebagai sumber tunggal state. Semua koordinator harus meminta status dari etcd sebelum mereka dapat membuat perubahan apapun. Ketika pengguna perlu memeriksa atau membersihkan state, mereka membutuhkan alat untuk berkomunikasi dengan etcd. Di sinilah Birdwatcher hadir.

    +

    Birdwatcher adalah alat debugging untuk Milvus. Dengan menggunakannya untuk terhubung ke etcd, Anda dapat memeriksa status sistem Milvus Anda atau mengkonfigurasinya dengan cepat.

    +

    Prasyarat

    +

    Arsitektur

    + + Birdwatcher architecture + Arsitektur Pengamat Burung

    +

    Rilis terbaru

    Rilis v1.0.2

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.json b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.json new file mode 100644 index 000000000..d8201addb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.json @@ -0,0 +1 @@ +{"codeList":["./birdwatcher\n","Offline >\n","Offline > connect\nMilvus(by-dev) >\n","kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'\n","kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh\n","Offline > connect --etcd ${ETCD_IP_ADDR}:2379\nMilvus(by-dev)\n","Offline > connect --rootPath my-release\nMilvus(my-release) >\n","Offline > connect --dry\nusing dry mode, ignore rootPath and metaPath\nEtcd(127.0.0.1:2379) > find-milvus\n1 candidates found:\nmy-release\nEtcd(127.0.0.1:2379) > use my-release\nMilvus(my-release) >\n","Milvus(my-release) > show -h\nUsage:\n show [command]\n\nAvailable Commands:\n alias list alias meta info\n channel-watch display channel watching info from data coord meta store\n checkpoint list checkpoint collection vchannels\n collection-history display collection change history\n collection-loaded display information of loaded collection from querycoord\n collections list current available collection from RootCoord\n config-etcd list configuations set by etcd source\n configurations iterate all online components and inspect configuration\n current-version \n database display Database info from rootcoord meta\n index \n partition list partitions of provided collection\n querycoord-channel display querynode information from querycoord cluster\n querycoord-cluster display querynode information from querycoord cluster\n querycoord-task display task information from querycoord\n replica list current replica information from QueryCoord\n segment display segment information from data coord meta store\n segment-index display segment index information\n segment-loaded display segment information from querycoordv1 meta\n segment-loaded-grpc list segments loaded information\n session list online milvus components\n\nFlags:\n -h, --help help for show\n\nUse \" show [command] --help\" for more information about a command.\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n","Milvus(by-dev) > show database\n=============================\nID: 1 Name: default\nTenantID: State: DatabaseCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show collections\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n--- Total collections: 1 Matched collections: 1\n--- Total channel: 1 Healthy collections: 1\n================================================================================\n","Milvus(by-dev) > show collection-history --id 443407225551410746\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n","Milvus(by-dev) > show collection-loaded\nVersion: [>= 2.2.0] CollectionID: 443407225551410746\nReplicaNumber: 1 LoadStatus: Loaded\n--- Collections Loaded: 1\n","Milvus(by-dev) > show checkpoint --collection 443407225551410746\nvchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint\n","Milvus(by-dev) > show index\n*************2.1.x***************\n*************2.2.x***************\n==================================================================\nIndex ID: 443407225551410801 Index Name: _default_idx_102 CollectionID:443407225551410746\nCreate Time: 2023-08-08 09:27:19.139 +0000 Deleted: false\nIndex Type: HNSW Metric Type: L2\nIndex Params: \n==================================================================\n","Milvus(by-dev) > show partition --collection 443407225551410746\nParition ID: 443407225551410747 Name: _default State: PartitionCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show channel-watch\n=============================\nkey: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0\nChannel Name:by-dev-rootcoord-dml_0_443407225551410746v0 WatchState: WatchSuccess\nChannel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000\nStart Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000\nUnflushed segments: []\nFlushed segments: []\nDropped segments: []\n--- Total Channels: 1\n","Milvus(by-dev) > show replica\n================================================================================\nReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0\nAll Nodes:[2]\n","SegmentID: 443407225551610865 State: Flushed, Row Count:5979\n--- Growing: 0, Sealed: 0, Flushed: 1\n--- Total Segments: 1, row count: 5979\n","Milvus(by-dev) > show segment-loaded-grpc\n===========\nServerID 2\nChannel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937\nLeader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0\nGrowing segments number: 0 , ids: []\nSegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0\nSealed segments number: 1 \n","Milvus(by-dev) > show configurations\nclient nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nComponent rootcoord-1\nrootcoord.importtaskexpiration: 900\nrootcoord.enableactivestandby: false\nrootcoord.importtaskretention: 86400\nrootcoord.maxpartitionnum: 4096\nrootcoord.dmlchannelnum: 16\nrootcoord.minsegmentsizetoenableindex: 1024\nrootcoord.port: 53100\nrootcoord.address: localhost\nrootcoord.maxdatabasenum: 64\nComponent datacoord-3\n...\nquerynode.gracefulstoptimeout: 30\nquerynode.cache.enabled: true\nquerynode.cache.memorylimit: 2147483648\nquerynode.scheduler.maxreadconcurrentratio: 2\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n\nMilvus(by-dev) > visit querycoord 7\nQueryCoord-7(10.244.0.8:19531) > configuration\nKey: querycoord.enableactivestandby, Value: false\nKey: querycoord.channeltasktimeout, Value: 60000\nKey: querycoord.overloadedmemorythresholdpercentage, Value: 90\nKey: querycoord.distpullinterval, Value: 500\nKey: querycoord.checkinterval, Value: 10000\nKey: querycoord.checkhandoffinterval, Value: 5000\nKey: querycoord.taskexecutioncap, Value: 256\nKey: querycoord.taskmergecap, Value: 8\nKey: querycoord.autohandoff, Value: true\nKey: querycoord.address, Value: localhost\nKey: querycoord.port, Value: 19531\nKey: querycoord.memoryusagemaxdifferencepercentage, Value: 30\nKey: querycoord.refreshtargetsintervalseconds, Value: 300\nKey: querycoord.balanceintervalseconds, Value: 60\nKey: querycoord.loadtimeoutseconds, Value: 1800\nKey: querycoord.globalrowcountfactor, Value: 0.1\nKey: querycoord.scoreunbalancetolerationfactor, Value: 0.05\nKey: querycoord.reverseunbalancetolerationfactor, Value: 1.3\nKey: querycoord.balancer, Value: ScoreBasedBalancer\nKey: querycoord.autobalance, Value: true\nKey: querycoord.segmenttasktimeout, Value: 120000\n","Milvus(my-release) > backup\nBacking up ... 100%(2452/2451)\nbackup etcd for prefix done\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nbackup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz\n","Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747\nPK 110 found on segment 442844725212299830\nField id, value: &{long_data: }\nField title, value: &{string_data: }\nField title_vector, value: &{dim:768 float_vector: }\nField article_meta, value: &{json_data: }\n","Milvus(by-dev) > probe query\nprobing collection 442682158191982314\nFound vector field vector(103) with dim[384], indexID: 442682158191990455\nfailed to generated mock request probing index type IVF_FLAT not supported yet\nprobing collection 442844725212086932\nFound vector field title_vector(102) with dim[768], indexID: 442844725212086936\nShard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.\nprobing collection 442844725212299747\nFound vector field title_vector(102) with dim[768], indexID: 442844725212299751\nShard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.\nprobing collection 443294505839900248\nFound vector field vector(101) with dim[256], indexID: 443294505839900251\nShard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.\n"],"headingContent":"Use Birdwatcher","anchorList":[{"label":"Menggunakan Birdwatcher","href":"Use-Birdwatcher","type":1,"isActive":false},{"label":"Memulai Birdwatcher","href":"Start-Birdwatcher","type":2,"isActive":false},{"label":"Hubungkan ke etcd","href":"Connect-to-etcd","type":2,"isActive":false},{"label":"Memeriksa status Milvus","href":"Check-Milvus-status","type":2,"isActive":false},{"label":"Metrik cadangan","href":"Backup-metrics","type":2,"isActive":false},{"label":"Memeriksa koleksi","href":"Probe-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.md b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.md new file mode 100644 index 000000000..9e937b461 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/birdwatcher_usage_guides.md @@ -0,0 +1,406 @@ +--- +id: birdwatcher_usage_guides.md +summary: Pelajari cara menggunakan Birdwatch untuk men-debug Milvus. +title: Menggunakan Birdwatcher +--- +

    Menggunakan Birdwatcher

    Panduan ini memandu Anda tentang cara menggunakan Birdwatcher untuk memeriksa status Milvus Anda dan mengkonfigurasinya dengan cepat.

    +

    Memulai Birdwatcher

    Birdwatcher adalah alat bantu baris perintah, Anda dapat memulainya sebagai berikut:

    +
    ./birdwatcher
    +
    +

    Kemudian Anda akan disambut dengan perintah berikut:

    +
    Offline >
    +
    +

    Hubungkan ke etcd

    Anda harus menggunakan Birdwatcher untuk terhubung ke etcd sebelum melakukan operasi lainnya.

    +
      +
    • Hubungkan dengan pengaturan default

      +
      Offline > connect
      +Milvus(by-dev) >
      +
    • +
    • Hubungkan dari Birdwatcher dalam sebuah pod

      +

      Jika Anda memilih untuk menjalankan Birdwatcher di dalam pod Kubernetes, Anda harus terlebih dahulu mendapatkan alamat IP etcd sebagai berikut:

      +
      kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'
      +
      +

      Kemudian akses cangkang pod.

      +
      kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh
      +
      +

      Terakhir, gunakan alamat IP yang dikembalikan untuk menyambung ke etcd sebagai berikut:

      +
      Offline > connect --etcd ${ETCD_IP_ADDR}:2379
      +Milvus(by-dev)
      +
    • +
    • Sambungkan dengan jalur root yang berbeda

      +

      Jika jalur root Milvus Anda berbeda dari by-dev dan Anda diminta untuk melaporkan kesalahan tentang jalur root yang salah, Anda dapat menyambung ke etcd sebagai berikut:

      +
      Offline > connect --rootPath my-release
      +Milvus(my-release) >
      +
      +

      Jika anda tidak mengetahui jalur root Milvus anda, sambungkan ke etcd sebagai berikut:

      +
      Offline > connect --dry
      +using dry mode, ignore rootPath and metaPath
      +Etcd(127.0.0.1:2379) > find-milvus
      +1 candidates found:
      +my-release
      +Etcd(127.0.0.1:2379) > use my-release
      +Milvus(my-release) >
      +
    • +
    +

    Memeriksa status Milvus

    Anda dapat menggunakan perintah show untuk memeriksa status Milvus.

    +
    Milvus(my-release) > show -h
    +Usage:
    +   show [command]
    +
    +Available Commands:
    +  alias               list alias meta info
    +  channel-watch       display channel watching info from data coord meta store
    +  checkpoint          list checkpoint collection vchannels
    +  collection-history  display collection change history
    +  collection-loaded   display information of loaded collection from querycoord
    +  collections         list current available collection from RootCoord
    +  config-etcd         list configuations set by etcd source
    +  configurations      iterate all online components and inspect configuration
    +  current-version     
    +  database            display Database info from rootcoord meta
    +  index               
    +  partition           list partitions of provided collection
    +  querycoord-channel  display querynode information from querycoord cluster
    +  querycoord-cluster  display querynode information from querycoord cluster
    +  querycoord-task     display task information from querycoord
    +  replica             list current replica information from QueryCoord
    +  segment             display segment information from data coord meta store
    +  segment-index       display segment index information
    +  segment-loaded      display segment information from querycoordv1 meta
    +  segment-loaded-grpc list segments loaded information
    +  session             list online milvus components
    +
    +Flags:
    +  -h, --help   help for show
    +
    +Use " show [command] --help" for more information about a command.
    +
    +

    Membuat daftar sesi

    Untuk membuat daftar sesi yang terkait dengan berbagai komponen di Milvus:

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +

    Pada keluaran perintah, setiap entri sesi yang didaftarkan oleh show session berhubungan dengan simpul atau layanan yang saat ini aktif dan terdaftar di etcd.

    +

    Memeriksa basis data dan koleksi

    Anda dapat membuat daftar semua basis data dan koleksi.

    +
      +
    • Membuat daftar basis data

      +

      Pada keluaran perintah, Anda dapat menemukan informasi tentang setiap basis data.

      +
      Milvus(by-dev) > show database
      +=============================
      +ID: 1   Name: default
      +TenantID:        State: DatabaseCreated
      +--- Total Database(s): 1
      +
    • +
    • Daftar koleksi

      +

      Pada keluaran perintah, Anda dapat menemukan informasi rinci tentang setiap koleksi.

      +
      Milvus(by-dev) > show collections
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +--- Total collections:  1        Matched collections:  1
      +--- Total channel: 1     Healthy collections: 1
      +================================================================================
      +
    • +
    • Melihat koleksi tertentu

      +

      Anda dapat melihat koleksi tertentu dengan menentukan ID-nya.

      +
      Milvus(by-dev) > show collection-history --id 443407225551410746
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +
    • +
    • Melihat semua koleksi yang dimuat

      +

      Anda dapat meminta Birdwatcher memfilter semua koleksi yang dimuat.

      +
      Milvus(by-dev) > show collection-loaded
      +Version: [>= 2.2.0]     CollectionID: 443407225551410746
      +ReplicaNumber: 1        LoadStatus: Loaded
      +--- Collections Loaded: 1
      +
    • +
    • Membuat daftar semua pos pemeriksaan saluran dari sebuah koleksi

      +

      Anda dapat meminta Birdwatcher membuat daftar semua pos pemeriksaan dari koleksi tertentu.

      +
      Milvus(by-dev) > show checkpoint --collection 443407225551410746
      +vchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint
      +
    • +
    +

    Memeriksa detail indeks

    Jalankan perintah berikut untuk membuat daftar semua file indeks secara detail.

    +
    Milvus(by-dev) > show index
    +*************2.1.x***************
    +*************2.2.x***************
    +==================================================================
    +Index ID: 443407225551410801    Index Name: _default_idx_102    CollectionID:443407225551410746
    +Create Time: 2023-08-08 09:27:19.139 +0000      Deleted: false
    +Index Type: HNSW        Metric Type: L2
    +Index Params: 
    +==================================================================
    +
    +

    Membuat daftar partisi

    Jalankan perintah berikut untuk membuat daftar semua partisi dalam koleksi tertentu.

    +
    Milvus(by-dev) > show partition --collection 443407225551410746
    +Parition ID: 443407225551410747 Name: _default  State: PartitionCreated
    +--- Total Database(s): 1
    +
    +

    Memeriksa status saluran

    Jalankan perintah berikut untuk melihat status saluran

    +
    Milvus(by-dev) > show channel-watch
    +=============================
    +key: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0
    +Channel Name:by-dev-rootcoord-dml_0_443407225551410746v0         WatchState: WatchSuccess
    +Channel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000
    +Start Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000
    +Unflushed segments: []
    +Flushed segments: []
    +Dropped segments: []
    +--- Total Channels: 1
    +
    +

    Buat daftar semua replika dan segmen

      +
    • Membuat daftar semua replika

      +

      Jalankan perintah berikut untuk membuat daftar semua replika dan koleksi terkait.

      +
      Milvus(by-dev) > show replica
      +================================================================================
      +ReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0
      +All Nodes:[2]
      +
    • +
    • Daftar semua segmen

      +

      Jalankan perintah berikut untuk membuat daftar semua segmen dan statusnya

      +
      SegmentID: 443407225551610865 State: Flushed, Row Count:5979
      +--- Growing: 0, Sealed: 0, Flushed: 1
      +--- Total Segments: 1, row count: 5979
      +
      +

      Jalankan perintah berikut untuk membuat daftar semua segmen yang dimuat secara detail. Untuk Milvus 2.1.x, gunakan show segment-loaded.

      +
      Milvus(by-dev) > show segment-loaded-grpc
      +===========
      +ServerID 2
      +Channel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937
      +Leader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Growing segments number: 0 , ids: []
      +SegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Sealed segments number: 1    
      +
    • +
    +

    Konfigurasi daftar

    Anda dapat meminta Birdwatcher membuat daftar konfigurasi saat ini dari setiap komponen Milvus.

    +
    Milvus(by-dev) > show configurations
    +client nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Component rootcoord-1
    +rootcoord.importtaskexpiration: 900
    +rootcoord.enableactivestandby: false
    +rootcoord.importtaskretention: 86400
    +rootcoord.maxpartitionnum: 4096
    +rootcoord.dmlchannelnum: 16
    +rootcoord.minsegmentsizetoenableindex: 1024
    +rootcoord.port: 53100
    +rootcoord.address: localhost
    +rootcoord.maxdatabasenum: 64
    +Component datacoord-3
    +...
    +querynode.gracefulstoptimeout: 30
    +querynode.cache.enabled: true
    +querynode.cache.memorylimit: 2147483648
    +querynode.scheduler.maxreadconcurrentratio: 2
    +
    +

    Sebagai alternatif, Anda dapat mengunjungi setiap komponen Milvus untuk menemukan konfigurasinya. Berikut ini menunjukkan cara membuat daftar konfigurasi QueryCoord dengan ID 7.

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +Milvus(by-dev) > visit querycoord 7
    +QueryCoord-7(10.244.0.8:19531) > configuration
    +Key: querycoord.enableactivestandby, Value: false
    +Key: querycoord.channeltasktimeout, Value: 60000
    +Key: querycoord.overloadedmemorythresholdpercentage, Value: 90
    +Key: querycoord.distpullinterval, Value: 500
    +Key: querycoord.checkinterval, Value: 10000
    +Key: querycoord.checkhandoffinterval, Value: 5000
    +Key: querycoord.taskexecutioncap, Value: 256
    +Key: querycoord.taskmergecap, Value: 8
    +Key: querycoord.autohandoff, Value: true
    +Key: querycoord.address, Value: localhost
    +Key: querycoord.port, Value: 19531
    +Key: querycoord.memoryusagemaxdifferencepercentage, Value: 30
    +Key: querycoord.refreshtargetsintervalseconds, Value: 300
    +Key: querycoord.balanceintervalseconds, Value: 60
    +Key: querycoord.loadtimeoutseconds, Value: 1800
    +Key: querycoord.globalrowcountfactor, Value: 0.1
    +Key: querycoord.scoreunbalancetolerationfactor, Value: 0.05
    +Key: querycoord.reverseunbalancetolerationfactor, Value: 1.3
    +Key: querycoord.balancer, Value: ScoreBasedBalancer
    +Key: querycoord.autobalance, Value: true
    +Key: querycoord.segmenttasktimeout, Value: 120000
    +
    +

    Metrik cadangan

    Anda dapat membuat cadangan metrik dari semua komponen di Birdwatcher

    +
    Milvus(my-release) > backup
    +Backing up ... 100%(2452/2451)
    +backup etcd for prefix  done
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +backup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz
    +
    +

    Kemudian Anda dapat memeriksa file tersebut di direktori tempat Anda memulai Birdwatcher.

    +

    Memeriksa koleksi

    Anda dapat meminta Birdwatcher menyelidiki status koleksi yang dimuat dengan kunci utama atau kueri tiruan yang ditentukan.

    +

    Memeriksa koleksi dengan kunci utama yang diketahui

    Pada perintah probe, Anda harus menentukan kunci utama menggunakan bendera pk, dan ID koleksi menggunakan bendera collection.

    +
    Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747
    +PK 110 found on segment 442844725212299830
    +Field id, value: &{long_data:<data:110 > }
    +Field title, value: &{string_data:<data:"Human Resources Datafication" > }
    +Field title_vector, value: &{dim:768 float_vector:<data:0.022454707 data:0.007861045 data:0.0063843643 data:0.024065714 data:0.013782166 data:0.018483251 data:-0.026526336 ... data:-0.06579628 data:0.00033906146 data:0.030992996 data:-0.028134001 data:-0.01311325 data:0.012471594 > }
    +Field article_meta, value: &{json_data:<data:"{\"link\":\"https:\\/\\/towardsdatascience.com\\/human-resources-datafication-d44c8f7cb365\",\"reading_time\":6,\"publication\":\"Towards Data Science\",\"claps\":256,\"responses\":0}" > }
    +
    +

    Memeriksa semua koleksi dengan kueri tiruan

    Anda juga dapat meminta Birdwatcher menelusuri semua koleksi dengan kueri tiruan.

    +
    Milvus(by-dev) > probe query
    +probing collection 442682158191982314
    +Found vector field vector(103) with dim[384], indexID: 442682158191990455
    +failed to generated mock request probing index type IVF_FLAT not supported yet
    +probing collection 442844725212086932
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212086936
    +Shard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.
    +probing collection 442844725212299747
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212299751
    +Shard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.
    +probing collection 443294505839900248
    +Found vector field vector(101) with dim[256], indexID: 443294505839900251
    +Shard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/cli_commands.json b/localization/v2.5.x/site/id/userGuide/tools/cli_commands.json new file mode 100644 index 000000000..4a987806c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/cli_commands.json @@ -0,0 +1 @@ +{"codeList":["clear\n","connect [-uri (text)] [-t (text)]\n","milvus_cli > connect -uri http://127.0.0.1:19530\n","create database -db (text)\n","milvus_cli > create database -db testdb\n","use database -db (text)\n","milvus_cli > use database -db testdb\n","list databases\n","milvus_cli > list databases\n","delete database -db (text)\n","milvus_cli > delete database -db testdb\n","create user -u (text) -p (text)\n","milvus_cli > create user -u zilliz -p zilliz\n","create role -r (text)\n","milvus_cli > create role -r role1\n","create alias -c (text) -a (text) [-A]\n","milvus_cli > create alias -c car -a carAlias1\n","milvus_cli > create alias -c car2 -A -a carAlias1\n","create collection -c (text) -f (text) -p (text) [-a] [-d (text)]\n","## For array field: --schema-field support :::(:if Varchar)\n\nmilvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'\n","create partition -c (text) -p (text) [-d (text)]\n","milvus_cli > create partition -c car -p new_partition -d test_add_partition\n","create index\n","milvus_cli > create index\n\nCollection name (car, car2): car2\n\nThe name of the field to create an index for (vector): vector\n\nIndex name: vectorIndex\n\n# Default is ''\nIndex type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT\n\n# Default is ''\nIndex metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:\n\nTimeout []:\n","delete user -u (text)\n","milvus_cli > delete user -u zilliz\n","delete role -r (text)\n","milvus_cli > delete role -r role1\n","delete alias -a (text)\n","delete collection -c (text)\n","milvus_cli > delete collection -c car\n","delete entities -c (text) -p (text)\n","milvus_cli > delete entities -c car\n\nThe expression to specify entities to be deleted, such as \"film_id in [ 0, 1 ]\": film_id in [ 0, 1 ]\n\nYou are trying to delete the entities of collection. This action cannot be undone!\n\nDo you want to continue? [y/N]: y\n","delete partition -c (text) -p (text)\n","milvus_cli > delete partition -c car -p new_partition\n","delete index -c (text) -in (text)\n","milvus_cli > delete index -c car -in indexName\n","grant role -r role1 -u user1\n","grant privilege\n","grant role -r role1 -u user1\n","revoke privilege\n","show collection -c (text)\n","milvus_cli > show collection -c test_collection_insert\n","show partition -c (text) -p (text)\n","milvus_cli > show partition -c test_collection_insert -p _default\n","show index -c (text) -in (text)\n","milvus_cli > show index -c test_collection -in index_name\n","exit\n","help \n","import -c (text)[-p (text)] \n","milvus_cli > import -c car 'examples/import_csv/vectors.csv'\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-\nio/milvus_cli/main/examples/import_csv/vectors.csv'\n\nReading file from remote URL.\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","list users\n","list roles\n","milvus_cli > list roles\n","milvus_cli > list grants -r role1 -o object1 -t Collection\n","list collections\n","list indexes -c (text)\n","list partitions -c (text)\n","load -c (text) [-p (text)]\n","query\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id in [ 428960801420883491, 428960801420883492,\n428960801420883493 ]\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: color, brand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id > 428960801420883491\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: id, color,\nbrand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","release -c (text) [-p (text)]\n","search\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file\nout headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):\n [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, car2): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []:\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []:\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","list connections\n","show index_progress -c (text) [-i (text)]\n","show loading_progress -c (text) [-p (text)]\n","version\n","$ milvus_cli --version\nMilvus_CLI v0.4.0\n"],"headingContent":"Milvus_CLI Command Reference","anchorList":[{"label":"Referensi Perintah Milvus_CLI","href":"MilvusCLI-Command-Reference","type":1,"isActive":false},{"label":"clear","href":"clear","type":2,"isActive":false},{"label":"connect","href":"connect","type":2,"isActive":false},{"label":"membuat Basis Data","href":"create-Database","type":2,"isActive":false},{"label":"menggunakan Database","href":"use-Database","type":2,"isActive":false},{"label":"Daftar Basis Data","href":"list-Databases","type":2,"isActive":false},{"label":"hapus Database","href":"delete-Database","type":2,"isActive":false},{"label":"membuat pengguna","href":"create-user","type":2,"isActive":false},{"label":"membuat peran","href":"create-role","type":2,"isActive":false},{"label":"create alias","href":"create-alias","type":2,"isActive":false},{"label":"membuat koleksi","href":"create-collection","type":2,"isActive":false},{"label":"create partition","href":"create-partition","type":2,"isActive":false},{"label":"create index","href":"create-index","type":2,"isActive":false},{"label":"hapus pengguna","href":"delete-user","type":2,"isActive":false},{"label":"hapus peran","href":"delete-role","type":2,"isActive":false},{"label":"delete alias","href":"delete-alias","type":2,"isActive":false},{"label":"hapus koleksi","href":"delete-collection","type":2,"isActive":false},{"label":"hapus entitas","href":"delete-entities","type":2,"isActive":false},{"label":"delete partition","href":"delete-partition","type":2,"isActive":false},{"label":"delete index","href":"delete-index","type":2,"isActive":false},{"label":"berikan peran","href":"grant-role","type":2,"isActive":false},{"label":"grant privilege","href":"grant-privilege","type":2,"isActive":false},{"label":"revoke role","href":"revoke-role","type":2,"isActive":false},{"label":"mencabut hak istimewa","href":"revoke-privilege","type":2,"isActive":false},{"label":"show collection","href":"show-collection","type":2,"isActive":false},{"label":"show partition","href":"show-partition","type":2,"isActive":false},{"label":"show index","href":"show-index","type":2,"isActive":false},{"label":"exit","href":"exit","type":2,"isActive":false},{"label":"help","href":"help","type":2,"isActive":false},{"label":"impor","href":"import","type":2,"isActive":false},{"label":"daftar pengguna","href":"list-users","type":2,"isActive":false},{"label":"Daftar peran","href":"List-roles","type":2,"isActive":false},{"label":"Daftar hibah","href":"List-grants","type":2,"isActive":false},{"label":"daftar koleksi","href":"list-collections","type":2,"isActive":false},{"label":"daftar indeks","href":"list-indexes","type":2,"isActive":false},{"label":"daftar partisi","href":"list-partitions","type":2,"isActive":false},{"label":"load","href":"load","type":2,"isActive":false},{"label":"query","href":"query","type":2,"isActive":false},{"label":"release","href":"release","type":2,"isActive":false},{"label":"search","href":"search","type":2,"isActive":false},{"label":"daftar koneksi","href":"list-connection","type":2,"isActive":false},{"label":"show index_progress","href":"show-indexprogress","type":2,"isActive":false},{"label":"show loading_progress","href":"show-loadingprogress","type":2,"isActive":false},{"label":"version","href":"version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/cli_commands.md b/localization/v2.5.x/site/id/userGuide/tools/cli_commands.md new file mode 100644 index 000000000..a043ce8fb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/cli_commands.md @@ -0,0 +1,1530 @@ +--- +id: cli_commands.md +summary: Berinteraksi dengan Milvus menggunakan perintah. +title: Referensi Perintah Milvus_CLI +--- +

    Referensi Perintah Milvus_CLI

    Milvus Command-Line Interface (CLI) adalah alat bantu baris perintah yang mendukung koneksi basis data, operasi data, serta impor dan ekspor data.

    +

    Topik ini memperkenalkan semua perintah yang didukung dan opsi yang sesuai. Beberapa contoh juga disertakan untuk referensi Anda.

    +

    clear

    Membersihkan layar.

    +

    Sintaks

    +
    clear
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    connect

    Menghubungkan ke Milvus.

    +

    Sintaks

    +
    connect [-uri (text)] [-t (text)]
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -uri-uri(Opsional) Nama uri. Standarnya adalah "http://127.0.0.1:19530".
    -t-token(Opsional) Apikey awan zilliz atau username:password. Standarnya adalah Tidak ada.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > connect -uri http://127.0.0.1:19530
    +
    +

    membuat Basis Data

    Membuat Basis Data di Milvus

    +

    Sintaks

    +
    create database -db (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -db-database[Wajib] Nama basis data dalam milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh 1

    Contoh berikut ini membuat basis data testdb di milvus.

    +
    milvus_cli > create database -db testdb
    +
    +

    menggunakan Database

    Menggunakan Basis Data di Milvus

    +

    Sintaks

    +
    use database -db (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -db-database[Wajib] Nama basis data dalam milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh 1

    Contoh berikut ini menggunakan basis data testdb di milvus.

    +
    milvus_cli > use database -db testdb
    +
    +

    Daftar Basis Data

    Membuat daftar basis data di Milvus

    +

    Sintaks

    +
    list databases
    +
    +

    Contoh

    Contoh 1

    Contoh berikut ini berisi daftar database yang ada di milvus.

    +
    milvus_cli > list databases
    +
    +

    hapus Database

    Menghapus Basis Data di Milvus

    +

    Sintaks

    +
    delete database -db (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -db-database[Wajib] Nama basis data dalam milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh 1

    Contoh berikut ini menghapus basis data testdb di milvus.

    +
    milvus_cli > delete database -db testdb
    +
    +

    membuat pengguna

    Membuat pengguna di Milvus

    +

    Sintaks

    +
    create user -u (text) -p (text)
    +
    +

    Pilihan

    + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -p-kata sandiKata sandi pengguna dalam milvus. Standarnya adalah "Tidak ada".
    -u-usernameNama pengguna dalam milvus. Standarnya adalah "Tidak ada".
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh 1

    Contoh berikut ini membuat pengguna zilliz dan kata sandi zilliz di milvus.

    +
    milvus_cli > create user -u zilliz -p zilliz
    +
    +

    membuat peran

    Membuat peran di Milvus

    +

    Sintaks

    +
    create role -r (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -r-nama peranNama peran dari peran milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh 1

    Contoh berikut ini membuat peran role1 di milvus.

    +
    milvus_cli > create role -r role1
    +
    +

    create alias

    Menentukan alias unik untuk sebuah koleksi.

    +
    Sebuah koleksi bisa memiliki beberapa alias. Namun, sebuah alias berhubungan dengan maksimal satu koleksi.
    +

    Sintaks

    +
    create alias -c (text) -a (text) [-A]
    +
    +

    Pilihan

    + + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -a-alias-nameNama alias.
    -A-alter(Opsional) Menandai untuk mentransfer alias ke koleksi tertentu.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +

    Contoh 1

    +

    Contoh berikut ini membuat alias carAlias1 dan carAlias2 untuk koleksi car.

    +
    milvus_cli > create alias -c car -a carAlias1
    +
    +

    Contoh 2

    +
    Contoh 2 didasarkan pada Contoh 1.
    +

    Contoh berikut ini memindahkan alias carAlias1 dari koleksi car ke koleksi car2.

    +
    milvus_cli > create alias -c car2 -A -a carAlias1
    +
    +

    membuat koleksi

    Membuat sebuah koleksi.

    +

    Sintaks

    +
    create collection -c (text) -f (text) -p (text) [-a] [-d (text)]
    +
    +

    Opsi

    + + + + + + + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -f-schema-field(Beberapa) Skema bidang dalam format <fieldName>:<dataType>:<dimOfVector/desc>.
    -p-schema-primary-fieldNama bidang kunci utama.
    -a-schema-auto-id(Opsional) Bendera untuk menghasilkan ID secara otomatis.
    -desc-schema-description(Opsional) Deskripsi koleksi.
    -level-tingkat-konsistensi(Opsional) Tingkat konsistensi: Terikat, Sesi, Kuat, Akhirnya.
    -d-is-dynamic(Opsional) Skema koleksi mendukung bidang dinamis atau tidak.
    -s-shards-num(Opsional) Nomor pecahan
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    ## For array field: --schema-field support <fieldName>:<dataType>:<maxCapacity>:<elementDataType>(:<maxLength>if Varchar)
    +
    +milvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'
    +
    +

    create partition

    Membuat partisi.

    +

    Sintaks

    +
    create partition -c (text) -p (text) [-d (text)]
    +
    +

    Pilihan

    + + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -p-partitionNama partisi.
    -d-deskripsi(Opsional) Deskripsi partisi.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > create partition -c car -p new_partition -d test_add_partition
    +
    +

    create index

    Membuat indeks untuk sebuah bidang.

    +
    Saat ini, sebuah koleksi mendukung maksimal satu indeks.
    +

    Sintaks

    +
    create index
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +

    Untuk membuat indeks untuk suatu bidang dan diminta untuk memasukkan input yang diperlukan:

    +
    milvus_cli > create index
    +
    +Collection name (car, car2): car2
    +
    +The name of the field to create an index for (vector): vector
    +
    +Index name: vectorIndex
    +
    +# Default is ''
    +Index type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT
    +
    +# Default is ''
    +Index metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:
    +
    +Timeout []:
    +
    +

    hapus pengguna

    Menghapus pengguna

    +

    Sintaks

    delete user -u (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -u-nama penggunaNama pengguna.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    milvus_cli > delete user -u zilliz
    +
    +

    hapus peran

    Menghapus peran di Milvus

    +

    Sintaks

    +
    delete role -r (text)
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -r-nama peranNama peran dari peran milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    Contoh berikut ini menghapus peran role1 di milvus.

    +
    milvus_cli > delete role -r role1
    +
    +

    delete alias

    Menghapus alias.

    +

    Sintaks

    +
    delete alias -a (text)
    +
    +

    Opsi

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -a-nama-aliasNama alias.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    hapus koleksi

    Menghapus koleksi.

    +

    Sintaks

    +
    delete collection -c (text)
    +
    +

    Pilihan

    + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi yang akan dihapus.
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > delete collection -c car
    +
    +

    hapus entitas

    Menghapus entitas.

    +

    Sintaks

    +
    delete entities -c (text) -p (text)
    +
    +

    Opsi

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi tempat entitas yang akan dihapus berada.
    -p-partisi(Opsional) Nama partisi yang akan dihapus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > delete entities -c car
    +
    +The expression to specify entities to be deleted, such as "film_id in [ 0, 1 ]": film_id in [ 0, 1 ]
    +
    +You are trying to delete the entities of collection. This action cannot be undone!
    +
    +Do you want to continue? [y/N]: y
    +
    +

    delete partition

    Menghapus partisi.

    +

    Sintaks

    +
    delete partition -c (text) -p (text)
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi tempat partisi yang akan dihapus berada.
    -p-partitionNama partisi yang akan dihapus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > delete partition -c car -p new_partition
    +
    +

    delete index

    Menghapus indeks dan file indeks yang terkait.

    +
    Saat ini, sebuah koleksi mendukung maksimal satu indeks.
    +

    Sintaks

    +
    delete index -c (text) -in (text)
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -in-nama-indeksNama nama indeks.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > delete index -c car -in indexName
    +
    +

    berikan peran

    Memberikan peran kepada pengguna

    +

    Sintaks

    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -r-nama peranNama peran dari peran milvus.
    -u-nama penggunaNama pengguna dari pengguna milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    grant role -r role1 -u user1
    +
    +

    grant privilege

    Menetapkan hak istimewa ke sebuah peran.

    +

    Sintaks

    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    grant privilege
    +
    +

    revoke role

    Mencabut peran yang ditetapkan untuk pengguna.

    +

    Sintaks

    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -r-nama peranNama peran dari peran milvus.
    -u-nama penggunaNama pengguna dari pengguna milvus.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    grant role -r role1 -u user1
    +
    +

    mencabut hak istimewa

    Mencabut hak istimewa yang telah ditetapkan ke suatu peran.

    +

    Sintaks

    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    revoke privilege
    +
    +

    show collection

    Menampilkan informasi rinci dari sebuah koleksi.

    +

    Sintaks

    +
    show collection -c (text)
    +
    +

    Pilihan

    + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > show collection -c test_collection_insert
    +
    +

    show partition

    Menampilkan informasi rinci dari sebuah partisi.

    +

    Sintaks

    +
    show partition -c (text) -p (text)
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi yang menjadi milik partisi.
    -p-partitionNama partisi.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +
    milvus_cli > show partition -c test_collection_insert -p _default
    +
    +

    show index

    Menampilkan informasi rinci dari sebuah indeks.

    +

    Sintaks

    +
    show index -c (text) -in (text)
    +
    +

    Pilihan

    + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -in-nama-indeksNama indeks.
    +

    | --help | n/a | Menampilkan bantuan untuk menggunakan perintah. |

    +

    Contoh

    +
    milvus_cli > show index -c test_collection -in index_name
    +
    +

    exit

    Menutup jendela baris perintah.

    +

    Sintaks

    +
    exit
    +
    +

    Opsi

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    help

    Menampilkan bantuan untuk menggunakan perintah.

    +

    Sintaks

    +
    help <command>
    +
    +

    Perintah

    + + + + + + + + + + + + + + + + + + + + + + + + +
    PerintahKeterangan
    clearMembersihkan layar.
    connectMenyambungkan ke Milvus.
    createMembuat koleksi, basis data, partisi, pengguna, peran, dan indeks.
    grantMemberikan peran, hak istimewa.
    revokeMencabut peran, hak istimewa .
    deleteMenghapus koleksi, basis data, partisi, alias, pengguna, peran, atau indeks.
    exitMenutup jendela baris perintah.
    helpMenampilkan bantuan untuk menggunakan perintah.
    insertMengimpor data ke dalam partisi.
    listMembuat daftar koleksi, basis data, partisi, pengguna, peran, hibah, atau indeks.
    loadMemuat koleksi atau partisi.
    queryMenampilkan hasil kueri yang cocok dengan semua kriteria yang Anda masukkan.
    releaseMelepaskan koleksi atau partisi.
    searchMelakukan pencarian kemiripan vektor atau pencarian gabungan.
    showMenampilkan koneksi, basis data, koleksi, progres pemuatan, atau progres indeks.
    renameMengganti nama koleksi
    useGunakan basis data
    versiMenampilkan versi Milvus_CLI.
    +

    impor

    Mengimpor data lokal atau jarak jauh ke dalam sebuah partisi.

    +

    Sintaks

    +
    import -c (text)[-p (text)] <file_path>
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi tempat data disisipkan.
    -p-partisi(Opsional) Nama partisi tempat data disisipkan. Tidak melewatkan opsi partisi ini mengindikasikan memilih partisi "_default".
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh 1

    +Contoh berikut ini mengimpor file CSV lokal.

    +
    milvus_cli > import -c car 'examples/import_csv/vectors.csv'
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    Contoh 2

    +Contoh berikut ini mengimpor file CSV jarak jauh.

    +
    milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-
    +io/milvus_cli/main/examples/import_csv/vectors.csv'
    +
    +Reading file from remote URL.
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    daftar pengguna

    Mencantumkan semua pengguna.

    +

    Sintaks

    list users
    +
    +

    Opsi

    Opsi | Opsi | Nama lengkap | Deskripsi | | --help | n/a | Menampilkan bantuan untuk menggunakan perintah. |

    +

    Daftar peran

    Membuat daftar peran di Milvus

    +

    Sintaks

    +
    list roles
    +
    +

    Opsi

    + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    milvus_cli > list roles
    +
    +

    Daftar hibah

    Membuat daftar hibah di Milvus

    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -r-nama peranNama peran dari peran milvus.
    -o-objectNameNama objek dari objek milvus.
    -t-objectTypeGlobal, Koleksi atau Pengguna.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    milvus_cli > list grants -r role1 -o object1 -t Collection
    +
    +

    daftar koleksi

    Mencantumkan semua koleksi.

    +

    Sintaks

    +
    list collections
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    daftar indeks

    Mencantumkan semua indeks untuk sebuah koleksi.

    +
    Saat ini, sebuah koleksi mendukung maksimal satu indeks.
    +

    Sintaks

    +
    list indexes -c (text)
    +
    +

    Pilihan

    + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    daftar partisi

    Mencantumkan semua partisi dari sebuah koleksi.

    +

    Sintaks

    +
    list partitions -c (text)
    +
    +

    Pilihan

    + + + + + + + + +
    PilihanNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi.
    -bantuann/aMenampilkan bantuan untuk menggunakan perintah.
    +

    load

    Memuat koleksi atau partisi dari ruang hard drive ke dalam RAM.

    +

    Sintaks

    +
    load -c (text) [-p (text)]
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi yang menjadi milik partisi.
    -p-partisi(Opsional/Banyak) Nama partisi.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    query

    Menampilkan hasil kueri yang cocok dengan semua kriteria yang Anda masukkan.

    +

    Sintaks

    +
    query
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Contoh

    +

    Contoh 1

    +

    Untuk melakukan kueri dan diminta untuk memasukkan input yang diperlukan:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id in [ 428960801420883491, 428960801420883492,
    +428960801420883493 ]
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: color, brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    Contoh 2

    +

    Untuk melakukan kueri dan meminta masukan yang diperlukan:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id > 428960801420883491
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: id, color,
    +brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    release

    Melepaskan koleksi atau partisi dari RAM.

    +

    Sintaks

    +
    release -c (text) [-p (text)]
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi yang menjadi milik partisi.
    -p-partisi(Opsional/Banyak) Nama partisi.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    Melakukan pencarian kemiripan vektor atau pencarian hibrida.

    +

    +
    search
    +
    +

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    +

    +

    Untuk melakukan pencarian pada file csv dan diminta untuk memasukkan input yang diperlukan:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file
    +out headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    Untuk melakukan pencarian pada koleksi yang diindeks dan meminta masukan yang diperlukan:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):
    +    [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    Untuk melakukan pencarian pada koleksi yang tidak diindeks dan diminta untuk memasukkan input yang diperlukan:

    +
    milvus_cli > search
    +
    +Collection name (car, car2): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []:
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []:
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    daftar koneksi

    Buat daftar koneksi.

    +

    Sintaks

    +
    list connections
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +

    show index_progress

    Menampilkan kemajuan pengindeksan entitas.

    +

    Sintaks

    +
    show index_progress -c (text) [-i (text)]
    +
    +

    Opsi

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi tempat entitas berada.
    -i-index(Opsional) Nama indeks.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    show loading_progress

    Menampilkan kemajuan pemuatan koleksi.

    +

    Sintaks

    +
    show loading_progress -c (text) [-p (text)]
    +
    +

    Pilihan

    + + + + + + + + + +
    OpsiNama lengkapDeskripsi
    -c-nama-koleksiNama koleksi tempat entitas berada.
    -p-partisi(Opsional/Banyak) Nama partisi pemuatan.
    -helpn/aMenampilkan bantuan untuk menggunakan perintah.
    +

    version

    Menampilkan versi dari Milvus_CLI.

    +

    Sintaks

    +
    version
    +
    +

    Pilihan

    + + + + + + + +
    OpsiNama lengkapDeskripsi
    -bantun/aMenampilkan bantuan untuk menggunakan perintah.
    +
    Anda juga dapat memeriksa versi Milvus_CLI pada sebuah shell seperti yang ditunjukkan pada contoh berikut. Pada kasus ini, milvus_cli --version bertindak sebagai perintah.
    +

    Contoh

    +
    $ milvus_cli --version
    +Milvus_CLI v0.4.0
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/cli_overview.json b/localization/v2.5.x/site/id/userGuide/tools/cli_overview.json new file mode 100644 index 000000000..3b33aa132 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/cli_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Command-Line Interface","anchorList":[{"label":"Antarmuka Baris Perintah Milvus","href":"Milvus-Command-Line-Interface","type":1,"isActive":false},{"label":"Versi yang direkomendasikan","href":"Recommended-version","type":2,"isActive":false},{"label":"Versi saat ini","href":"Current-version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/cli_overview.md b/localization/v2.5.x/site/id/userGuide/tools/cli_overview.md new file mode 100644 index 000000000..927f8ad39 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/cli_overview.md @@ -0,0 +1,78 @@ +--- +id: cli_overview.md +summary: >- + Milvus Command-Line Interface (CLI) adalah alat bantu baris perintah yang + mendukung koneksi basis data, operasi data, serta impor dan ekspor data. +title: Antarmuka Baris Perintah Milvus +--- +

    Antarmuka Baris Perintah Milvus

    Milvus Command-Line Interface (CLI) adalah alat bantu baris perintah yang mendukung koneksi basis data, operasi data, serta impor dan ekspor data. Berdasarkan Milvus Python SDK, alat ini memungkinkan eksekusi perintah melalui terminal menggunakan prompt baris perintah interaktif.

    +

    Pada tabel berikut, Anda dapat menemukan versi PyMilvus dan Milvus_CLI yang direkomendasikan sesuai dengan versi Milvus yang Anda gunakan.

    + + + + + + + + + + + + + + + + + + + + + +
    MilvusPyMilvusMilvus_CLI
    1.0.x1.0.1x
    1.1.x1.1.2x
    2.0.0-RC12.0.0rc1x
    2.0.0-RC22.0.0rc20.1.3
    2.0.0-RC42.0.0rc40.1.4
    2.0.0-RC52.0.0rc50.1.5
    2.0.0-RC62.0.0rc60.1.6
    2.0.0-RC72.0.0rc70.1.7
    2.0.0-RC82.0.0rc80.1.8
    2.0.0-RC92.0.0rc90.1.9
    2.1.02.1.00.3.0
    2.2.x2.2.x0.4.0
    2.3.x2.3.x0.4.2
    2.4.x2.4.x1.0.0
    2.4.x2.4.x1.0.1
    +
    Milvus 2.0.0-RC7 dan yang lebih baru tidak kompatibel dengan 2.0.0-RC6 dan yang lebih lama karena adanya perubahan pada format penyimpanan.
    +

    Versi saat ini

    Versi Milvus_CLI saat ini adalah 1.0.1. Untuk menemukan versi yang terinstal dan melihat apakah Anda perlu melakukan update, jalankan milvus_cli --version.

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/install_cli.json b/localization/v2.5.x/site/id/userGuide/tools/install_cli.json new file mode 100644 index 000000000..55ab93a58 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/install_cli.json @@ -0,0 +1 @@ +{"codeList":["pip install milvus-cli\n","$ docker run -it zilliz/milvus_cli:latest\n","git clone https://github.com/zilliztech/milvus_cli.git\n","cd milvus_cli\n","python -m pip install --editable .\n"],"headingContent":"Install Milvus_CLI","anchorList":[{"label":"Menginstal Milvus_CLI","href":"Install-MilvusCLI","type":1,"isActive":false},{"label":"Menginstal dari PyPI","href":"Install-from-PyPI","type":2,"isActive":false},{"label":"Menginstal dengan Docker","href":"Install-with-Docker","type":2,"isActive":false},{"label":"Menginstal dari kode sumber","href":"Install-from-source-code","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/install_cli.md b/localization/v2.5.x/site/id/userGuide/tools/install_cli.md new file mode 100644 index 000000000..59906426f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/install_cli.md @@ -0,0 +1,100 @@ +--- +id: install_cli.md +summary: Pelajari cara menginstal Milvus_CLI. +title: Menginstal Milvus_CLI +--- +

    Menginstal Milvus_CLI

    Topik ini menjelaskan cara menginstal Milvus_CLI.

    +

    Menginstal dari PyPI

    Anda dapat menginstal Milvus_CLI dari PyPI.

    +

    Prasyarat

    +

    Menginstal melalui pip

    Jalankan perintah berikut untuk menginstal Milvus_CLI.

    +
    pip install milvus-cli
    +
    +

    Menginstal dengan Docker

    Anda dapat menginstal Milvus_CLI dengan docker.

    +

    Prasyarat

    Docker 19.03 atau yang lebih baru diperlukan.

    +

    Instal berdasarkan citra Docker

    $ docker run -it zilliz/milvus_cli:latest
    +
    +

    Menginstal dari kode sumber

      +
    1. Jalankan perintah berikut untuk mengunduh repositori milvus_cli.
    2. +
    +
    git clone https://github.com/zilliztech/milvus_cli.git
    +
    +
      +
    1. Jalankan perintah berikut untuk masuk ke folder milvus_cli.
    2. +
    +
    cd milvus_cli
    +
    +
      +
    1. Jalankan perintah berikut untuk menginstal Milvus_CLI.
    2. +
    +
    python -m pip install --editable .
    +
    +

    Sebagai alternatif, Anda dapat menginstal Milvus_CLI dari tarball terkompresi (file.tar.gz ). Unduh tarball dan jalankan python -m pip install milvus_cli-<version>.tar.gz.

    +

    Menginstal dari sebuah file .exe

    Metode instalasi ini hanya berlaku untuk Windows.
    +

    Unduh file .exe dari GitHub dan jalankan untuk menginstal Milvus_CLI. Jika berhasil, milvus_cli-<version>.exe akan muncul seperti yang ditunjukkan pada gambar berikut.

    +

    + + Milvus_CLI + Milvus_CLI

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json new file mode 100644 index 000000000..de76b356e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across Buckets","anchorList":[{"label":"Migrasi Antar Instance Lintas Bucket","href":"Migrate-Between-Instances-Across-Buckets","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat**","href":"Prerequisites","type":2,"isActive":false},{"label":"Mencadangkan koleksi dari milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Kembalikan cadangan ke milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md new file mode 100644 index 000000000..f0d2538ff --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md @@ -0,0 +1,203 @@ +--- +id: cross-bucket-backup-and-restore.md +summary: >- + Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan + mengembalikannya ke instans lainnya +title: Migrasi Antar Instance Lintas Bucket +--- +

    Migrasi Antar Instance Lintas Bucket

    Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan mengembalikannya ke instans lainnya, dengan masing-masing instans menggunakan bucket yang berbeda di dalam penyimpanan objek yang sama.

    +

    Gambaran Umum

    Diagram di bawah ini mengilustrasikan proses pencadangan dan pemulihan menggunakan bucket yang berbeda dalam penyimpanan objek yang sama.

    +

    + + cross-bucket-backup-and-restore.png + pencadangan-dan-pemulihan-silang-bucket.png

    +

    Asumsikan kita memiliki dua contoh Milvus, milvus_A dan milvus_B, keduanya menggunakan mesin penyimpanan MinIO default untuk penyimpanan objek. Kedua contoh ini menggunakan bucket yang berbeda, yaitu bucket_A dan bucket_B dalam penyimpanan objek yang sama. Dalam contoh ini, tujuan kita adalah menyelesaikan tugas-tugas berikut:

    +
      +
    1. Buat cadangan (my_backup) untuk koleksi coll di bucket_A dan simpan cadangan di bucket_B.

    2. +
    3. Di bucket_B, pulihkan dari cadangan dan beri nama koleksi yang dipulihkan coll_bak.

    4. +
    +

    Prasyarat**

      +
    • Pastikan alat milvus-backup telah diinstal.

    • +
    • Biasakan diri Anda dengan mengonfigurasi pengaturan penyimpanan objek Milvus. Untuk detailnya, lihat Penyimpanan Objek.

    • +
    +

    Mencadangkan koleksi dari milvus_A

    Langkah 1: Siapkan konfigurasi

    Masuk ke direktori proyek milvus-backup dan buat direktori bernama configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Unduh berkas konfigurasi pencadangan backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Struktur berkas terlihat seperti ini:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Langkah 2: Edit file konfigurasi

    Ubah file backup.yaml untuk mengatur konfigurasi yang sesuai untukmilvus_A:

    +
      +
    • Konfigurasi koneksi

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: Alamat IP atau nama host server milvus_A.

      • +
      • milvus.port: Port TCP yang didengarkan server Milvus (default 19530).

      • +
    • +
    • Konfigurasi penyimpanan (pengaturan MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: localhost # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: Nama bucket yang digunakan untuk penyimpanan data di milvus_A. Dalam contoh ini, diatur ke bucket_A.

    • +
    • minio.rootPath: Jalur root di dalam bucket tempat data dari milvus_A disimpan. Dalam contoh ini, atur ke files.

    • +
    • minio.backupBucketName: Nama bucket yang digunakan untuk penyimpanan cadangan dimilvus_B. Dalam contoh ini, milvus_A dan milvus_B menggunakan bucket yang berbeda. Oleh karena itu, atur ke bucket_B.

    • +
    • minio.backupRootPath: Jalur root di dalam bucket yang ditetapkan untuk menyimpan file cadangan di milvus_B. Dalam contoh ini, atur ke backup.

    • +
    +

    Langkah 3: Buat cadangan

    Setelah backup.yaml disimpan, buat cadangan bernama my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Perintah ini membuat cadangan bucket_B/backup/my_backup di penyimpanan objek untuk koleksi coll.

    +

    Kembalikan cadangan ke milvus_B

    Langkah 1: Konfigurasikan pengaturan pemulihan

    Ulangi langkah 2 untuk memodifikasi konfigurasi untuk pemulihan ke milvus_B, memastikan minio.bucketName diatur ke bucket_B.

    +

    Berikut ini contoh konfigurasi:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +...
    +
    +

    Langkah 2: Pulihkan cadangan

    Pulihkan cadangan ke milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Perintah ini mengembalikan cadangan ke dalam koleksi baru bernama coll_bak di milvus_B, dengan data yang disimpan di bucket_B/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json new file mode 100644 index 000000000..aa1d8409f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","# configure a Minio host\nmc alias set my_minio https:// \n","# List the available buckets\nmc ls my_minio\n","# Download a bucket recursively\nmc cp --recursive my_minio/ \n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across S3 Environments","anchorList":[{"label":"Migrasi Antar Instance di Seluruh Lingkungan S3","href":"Migrate-Between-Instances-Across-S3-Environments","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mencadangkan koleksi dari milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Transfer cadangan secara manual ke milvus_B","href":"Manually-transfer-the-backup-to-milvusB","type":2,"isActive":false},{"label":"Memulihkan dari cadangan ke milvus_B","href":"Restore-from-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md new file mode 100644 index 000000000..777faed2e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md @@ -0,0 +1,246 @@ +--- +id: multi-storage-backup-and-restore.md +summary: >- + Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan + mengembalikannya ke instans lainnya +title: Migrasi Antar Instance di Seluruh Lingkungan S3 +--- +

    Migrasi Antar Instance di Seluruh Lingkungan S3

    Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan mengembalikannya ke instans lain, dengan masing-masing instans menggunakan penyimpanan objek yang berbeda.

    +

    Gambaran Umum

    Diagram di bawah ini mengilustrasikan proses pencadangan dan pemulihan menggunakan penyimpanan objek yang berbeda.

    +

    + + multi-storage-backup-and-restore.png + pencadangan-dan-pemulihan multi-penyimpanan.png

    +

    Asumsikan kita memiliki dua instance Milvus, milvus_A dan milvus_B, yang menggunakan penyimpanan objek yang berbeda. Dalam contoh ini, tujuan kita adalah menyelesaikan tugas-tugas berikut:

    +
      +
    1. Membuat cadangan (my_backup) untuk koleksi coll di bucket_A dari penyimpanan objekmilvus_A.

    2. +
    3. Mentransfer cadangan my_backup ke bucket_B dari penyimpanan objek milvus_B.

    4. +
    +

    Di bucket_B, pulihkan dari cadangan dan beri nama koleksi yang dipulihkan coll_bak.

    +

    Prasyarat

      +
    • Pastikan alat milvus-backup sudah terpasang.

    • +
    • Biasakan diri Anda dengan mengonfigurasi pengaturan penyimpanan objek Milvus. Untuk detailnya, lihat Penyimpanan Objek.

    • +
    +

    Mencadangkan koleksi dari milvus_A

    Langkah 1: Siapkan konfigurasi

    Masuk ke direktori proyek milvus-backup dan buat direktori bernama configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Unduh berkas konfigurasi pencadangan backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Struktur berkas terlihat seperti ini:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Langkah 2: Mengedit berkas konfigurasi

    Ubah berkas backup.yaml untuk mengatur konfigurasi yang sesuai untuk milvus_A:

    +
      +
    • Konfigurasi koneksi

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: Alamat IP atau nama host dari server milvus_A.

      • +
      • milvus.port: Port TCP yang didengarkan server Milvus (default 19530).

      • +
    • +
    • Konfigurasi penyimpanan (pengaturan MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: minio_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: Nama bucket yang digunakan untuk penyimpanan data di milvus_A. Dalam contoh ini, diatur ke bucket_A.

    • +
    • minio.rootPath: Jalur root di dalam bucket tempat data dari milvus_A disimpan. Dalam contoh ini, setel ke files.

    • +
    • minio.backupBucketName: Nama ember yang digunakan untuk penyimpanan cadangan. Dalam contoh ini, diatur ke bucket_A.

    • +
    • minio.backupRootPath: Jalur root di dalam bucket yang ditetapkan untuk menyimpan file cadangan di milvus_B. Dalam contoh ini, atur ke backup.

    • +
    +

    Langkah 3: Membuat cadangan

    Setelah backup.yaml disimpan, buat cadangan bernama my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Perintah ini membuat cadangan bucket_A/backup/my_backup dalam penyimpanan objek milvus_A.

    +

    Transfer cadangan secara manual ke milvus_B

    Karena milvus_A dan milvus_B menggunakan penyimpanan objek yang berbeda, Anda perlu mengunduh cadangan secara manual dari penyimpanan milvus_A dan mengunggahnya ke penyimpananmilvus_B.

    +

    Menggunakan konsol MinIO

    +
      +
    1. Masuk ke konsol MinIO.

    2. +
    3. Cari bucket yang ditentukan di minio.address untuk milvus_A.

    4. +
    5. Pilih file cadangan di dalam bucket.

    6. +
    7. Klik Unduh untuk mengunduh berkas ke mesin Anda.

    8. +
    +

    Menggunakan klien mc

    +

    Sebagai alternatif, Anda dapat menggunakan klien mc untuk mengunduh file cadangan:

    +
      +
    1. Konfigurasikan host MinIO:
    2. +
    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +
      +
    1. Buat daftar bucket yang tersedia:
    2. +
    +
    # List the available buckets
    +mc ls my_minio
    +
    +
      +
    1. Unduh bucket secara rekursif:
    2. +
    +
    # Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    Setelah file cadangan diunduh, Anda dapat mengunggahnya ke penyimpanan objek yang digunakan oleh milvus_B untuk pemulihan di masa mendatang. Atau, Anda dapat mengunggah cadangan ke Zilliz Cloud untuk membuat basis data vektor terkelola dengan data Anda. Untuk detailnya, lihat Migrasi dari Milvus ke Zilliz Cloud.

    +

    Memulihkan dari cadangan ke milvus_B

    Langkah 1: Mengonfigurasi pengaturan pemulihan

    Ulangi langkah 2 untuk memodifikasi konfigurasi untuk pemulihan ke milvus_B, memastikan minio.bucketName diatur ke bucket_B.

    +

    Berikut ini contoh konfigurasinya:

    +
    # milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: minio_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    Langkah 2: Pulihkan dari cadangan

    Pulihkan cadangan ke milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Perintah ini mengembalikan cadangan ke dalam koleksi baru bernama coll_bak dimilvus_B, dengan data yang disimpan di bucket_B/files/insert_log/[ID of new collection] dalam penyimpanan objek milvus_B.

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json new file mode 100644 index 000000000..1fb1d7108 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_A\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_B\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n ...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances in One Bucket (Different Root Paths)","anchorList":[{"label":"Migrasi Antar Instance dalam Satu Bucket (Jalur Root yang Berbeda)","href":"Migrate-Between-Instances-in-One-Bucket-Different-Root-Paths","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mencadangkan koleksi dari milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Kembalikan cadangan ke milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md new file mode 100644 index 000000000..904108b5f --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md @@ -0,0 +1,199 @@ +--- +id: shared-bucket-backup-and-restore.md +summary: >- + Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan + mengembalikannya ke instans lain saat menggunakan bucket bersama untuk + penyimpanan objek +title: Migrasi Antar Instance dalam Satu Bucket (Jalur Root yang Berbeda) +--- +

    Migrasi Antar Instance dalam Satu Bucket (Jalur Root yang Berbeda)

    Topik ini merinci proses mencadangkan koleksi dari satu instans Milvus dan mengembalikannya ke instans lain saat menggunakan bucket bersama untuk penyimpanan objek, dengan jalur root yang berbeda untuk setiap instans.

    +

    Gambaran Umum

    Diagram di bawah ini mengilustrasikan proses pencadangan dan pemulihan menggunakan shared bucket.

    +

    + + shared-bucket-backup-and-restore.png + shared-bucket-backup-and-restore.png

    +

    Asumsikan kita memiliki instance Milvus, milvus_A dan milvus_B, keduanya menggunakan mesin penyimpanan MinIO default untuk penyimpanan objek. Kedua contoh ini berbagi bucket yang sama, bucket_A, tetapi menyimpan datanya di jalur root yang berbeda: files_A untuk milvus_A dan files_B untuk milvus_B. Pada contoh ini, tujuan kita adalah menyelesaikan tugas-tugas berikut:

    +
      +
    1. Membuat cadangan (my_backup) untuk koleksi coll yang disimpan di bawah jalurfiles_A untuk milvus_A.

    2. +
    3. Pulihkan dari cadangan dan simpan ke files_B untuk milvus_B.

    4. +
    +

    Prasyarat

      +
    • Pastikan alat milvus-backup sudah terpasang.

    • +
    • Biasakan diri Anda dengan mengonfigurasi pengaturan penyimpanan objek Milvus. Untuk detailnya, lihat Penyimpanan Objek.

    • +
    +

    Mencadangkan koleksi dari milvus_A

    Langkah 1: Siapkan konfigurasi

    Masuk ke direktori proyek milvus-backup dan buat direktori bernama configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Unduh file konfigurasi pencadangan backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Struktur file terlihat seperti ini:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Langkah 2: Edit file konfigurasi

    Ubah file backup.yaml untuk mengatur konfigurasi yang sesuai untukmilvus_A:

    +
      +
    • Konfigurasi koneksi

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: Alamat IP atau nama host server milvus_A.

      • +
      • milvus.port: Port TCP yang didengarkan server Milvus (default 19530).

      • +
    • +
    • Konfigurasi penyimpanan (pengaturan MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: milvus_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files_A" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
      +
        +
      • minio.bucketName: Nama bucket yang digunakan untuk penyimpanan milvus_A. Dalam contoh ini, diatur ke bucket_A.

      • +
      • minio.rootPath: Jalur root di dalam bucket tempat data dari milvus_A disimpan. Dalam contoh ini, setel ke files_A.

      • +
      • minio.backupBucketName: Nama bucket yang digunakan untuk penyimpanan. Pada contoh ini, milvus_A dan milvus_B berbagi bucket. Oleh karena itu, setel kebucket_A.

      • +
      • minio.backupRootPath: Jalur root di dalam bucket yang ditetapkan untuk menyimpan file cadangan di milvus_B. Dalam contoh ini, gunakan jalur yang berbeda dari milvus_A. Oleh karena itu, atur ke backup.

      • +
    • +
    +

    Langkah 3: Buat cadangan

    Setelah backup.yaml disimpan, buat cadangan bernama my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Perintah ini akan membuat cadangan bucket_A/backup/my_backup di penyimpanan objek untuk koleksi coll.

    +

    Kembalikan cadangan ke milvus_B

    Langkah 1: Konfigurasikan pengaturan pemulihan

    Ulangi langkah 2 untuk memodifikasi konfigurasi untuk pemulihan ke milvus_B, memastikan minio.bucketName diatur ke bucket_A dan minio.rootPath ke files_B untuk membedakan lokasi penyimpanan di antara dua instans.

    +

    Berikut ini contoh konfigurasinya:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: milvus_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files_B" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +  ...
    +
    +

    Langkah 2: Pulihkan cadangan

    Pulihkan cadangan ke milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Perintah ini mengembalikan cadangan ke dalam koleksi baru bernama coll_bak di milvus_B, dengan data yang disimpan di bucket_A/files_B/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json new file mode 100644 index 000000000..a52252490 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Backup and Restore in One Instance","anchorList":[{"label":"Mencadangkan dan Memulihkan dalam Satu Instance","href":"Backup-and-Restore-in-One-Instance","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Mencadangkan koleksi","href":"Back-up-the-collection","type":2,"isActive":false},{"label":"Pulihkan dari cadangan di dalam milvus_A","href":"Restore-from-the-backup-within-milvusA","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md new file mode 100644 index 000000000..d4c0077bb --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md @@ -0,0 +1,142 @@ +--- +id: single-instance-backup-and-restore.md +summary: >- + Topik ini merinci proses mencadangkan koleksi dan memulihkannya dari cadangan + dalam instance Milvus yang sama +title: Mencadangkan dan Memulihkan dalam Satu Instance +--- +

    Mencadangkan dan Memulihkan dalam Satu Instance

    Topik ini merinci proses mencadangkan koleksi dan memulihkannya dari cadangan dalam instance Milvus yang sama.

    +

    Gambaran Umum

    Diagram di bawah ini mengilustrasikan proses pencadangan dan pemulihan dalam satu instans Milvus.

    +

    + + single-instance-backup-and-restore.png + pencadangan-dan-pemulihan-dalam-satu-instansi.png

    +

    Asumsikan kita memiliki sebuah instans Milvus, milvus_A, menggunakan sebuah bucket bernamabucket_A untuk penyimpanan data. Dalam contoh ini, tujuan kita adalah menyelesaikan tugas-tugas berikut:

    +
      +
    1. Buat cadangan (my_backup) untuk koleksi coll di bucket_A.

    2. +
    3. Memulihkan dari cadangan dan menamai koleksi yang dipulihkan coll_bak.

    4. +
    +

    Prasyarat

      +
    • Pastikan alat milvus-backup sudah terpasang.

    • +
    • Biasakan diri Anda dengan mengonfigurasi pengaturan penyimpanan objek Milvus. Untuk detailnya, lihat Penyimpanan Objek.

    • +
    +

    Mencadangkan koleksi

    Langkah 1: Siapkan konfigurasi

    Masuk ke direktori proyek milvus-backup dan buat direktori bernama configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Unduh file konfigurasi pencadangan backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Struktur file terlihat seperti ini:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Langkah 2: Edit file konfigurasi

    Ubah file backup.yaml untuk mengatur konfigurasi yang sesuai untukmilvus_A. Di bawah ini adalah contoh konfigurasi penyimpanan:

    +
    # Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    Langkah 3: Buat cadangan

    Setelah backup.yaml disimpan, buat cadangan bernama my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Perintah ini membuat cadangan bucket_A/backup/my_backup dalam penyimpanan objek milvus_A.

    +

    Pulihkan dari cadangan di dalam milvus_A

    Setelah cadangan dibuat, Anda dapat memulihkan dari cadangan tersebut menggunakan perintah di bawah ini:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Perintah ini memulihkan dari cadangan dan membuat koleksi baru bernama coll_bak di milvus_A, dengan data yang disimpan di bucket_A/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.json new file mode 100644 index 000000000..74c087c38 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","./milvus-backup server\n","./milvus-backup server -p 443\n","python example/prepare_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/create' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"backup_name\": \"my_backup\",\n \"collection_names\": [\n \"hello_milvus\"\n ]\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/list' \\\n--header 'Content-Type: application/json'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=&backup_name=my_backup' \\\n--header 'Content-Type: application/json'\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"_recover\",\n \"backup_name\":\"my_backup\"\n}'\n","python example/clean_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"\",\n \"backup_name\":\"my_backup\"\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=' \\\n--header 'Content-Type: application/json'\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using APIs","anchorList":[{"label":"Cadangkan dan Pulihkan Data Menggunakan API","href":"Back-up-and-Restore-Data-Using-APIs","type":1,"isActive":false},{"label":"Mendapatkan Cadangan Milvus","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"Siapkan berkas konfigurasi","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"Memulai server API","href":"Start-up-the-API-server","type":2,"isActive":false},{"label":"Menyiapkan data","href":"Prepare-data","type":2,"isActive":false},{"label":"Mencadangkan data","href":"Back-up-data","type":2,"isActive":false},{"label":"Memulihkan data","href":"Restore-data","type":2,"isActive":false},{"label":"Memverifikasi data yang dipulihkan","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.md new file mode 100644 index 000000000..9a5446281 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_api.md @@ -0,0 +1,230 @@ +--- +id: milvus_backup_api.md +summary: Pelajari cara menggunakan Milvus Backup melalui API +title: Cadangkan dan Pulihkan Data Menggunakan API +--- +

    Cadangkan dan Pulihkan Data Menggunakan API

    Milvus Backup menyediakan fitur backup dan restore data untuk memastikan keamanan data Milvus Anda.

    +

    Mendapatkan Cadangan Milvus

    Anda bisa mengunduh biner yang telah dikompilasi atau membangun dari sumbernya.

    +

    Untuk mengunduh biner yang telah dikompilasi, buka halaman rilis, di mana Anda dapat menemukan semua rilis resmi. Ingat, selalu gunakan biner dalam rilis yang ditandai sebagai Terbaru.

    +

    Untuk mengkompilasi dari sumbernya, lakukan hal berikut:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    Siapkan berkas konfigurasi

    Unduh contoh berkas konfigurasi dan sesuaikan dengan kebutuhan Anda.

    +

    Kemudian buat sebuah folder di samping berkas biner Milvus Backup yang telah diunduh atau dibuat, beri nama folder tersebut configs, dan letakkan berkas konfigurasi di dalam folder configs.

    +

    Struktur folder Anda seharusnya mirip dengan yang berikut ini:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    Karena Milvus Backup tidak dapat mencadangkan data Anda ke jalur lokal, pastikan pengaturan Minio sudah benar saat menyesuaikan file konfigurasi.

    +
    +

    Nama bucket Minio default bervariasi sesuai dengan cara Anda menginstal Milvus. Ketika membuat perubahan pada pengaturan Minio, lihat tabel berikut.

    + + + + + + + + +
    bidangPenulisan DockerHelm / Operator Milvus
    bucketNamea-bucketmilvus-bucket
    rootPathberkasberkas
    +
    +

    Memulai server API

    Kemudian Anda dapat memulai server API sebagai berikut:

    +
    ./milvus-backup server
    +
    +

    Server API mendengarkan pada port 8080 secara default. Anda dapat mengubahnya dengan menjalankannya dengan bendera -p. Untuk memulai server API yang mendengarkan pada port 443, lakukan hal berikut:

    +
    ./milvus-backup server -p 443
    +
    +

    Anda dapat mengakses Swagger UI menggunakan http://localhost:/api/v1/docs/index.html.

    +

    Menyiapkan data

    Jika Anda menjalankan instans Milvus lokal kosong yang mendengarkan pada port default 19530, gunakan contoh skrip Python untuk menghasilkan beberapa data dalam instans Anda. Jangan ragu untuk membuat perubahan yang diperlukan pada skrip agar sesuai dengan kebutuhan Anda.

    +

    Dapatkan skripnya. Kemudian jalankan skrip untuk menghasilkan data. Pastikan bahwa PyMilvus, SDK Python Milvus resmi, telah terinstal.

    +
    python example/prepare_data.py
    +
    +

    Langkah ini bersifat opsional. Jika Anda melewatkan langkah ini, pastikan bahwa Anda sudah memiliki beberapa data dalam instance Milvus Anda.

    +

    Mencadangkan data

    +

    Perhatikan bahwa menjalankan Milvus Backup terhadap instans Milvus biasanya tidak akan memengaruhi jalannya instans. Instance Milvus Anda akan berfungsi penuh selama pencadangan atau pemulihan.

    +

    Jalankan perintah berikut untuk membuat cadangan. Ubah collection_names dan backup_name jika perlu.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/create' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +  "async": true,
    +  "backup_name": "my_backup",
    +  "collection_names": [
    +    "hello_milvus"
    +  ]
    +}'
    +
    +

    Setelah perintah dijalankan, Anda dapat membuat daftar cadangan dalam bucket yang ditentukan dalam pengaturan Minio sebagai berikut:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/list' \
    +--header 'Content-Type: application/json'
    +
    +

    Dan unduh file cadangan sebagai berikut:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=<test_backup_id>&backup_name=my_backup' \
    +--header 'Content-Type: application/json'
    +
    +

    Saat menjalankan perintah di atas, ubah backup_id dan backup_name ke yang dikembalikan oleh API daftar.

    +

    Sekarang, Anda dapat menyimpan file cadangan ke tempat yang aman untuk pemulihan di masa mendatang, atau mengunggahnya ke Zilliz Cloud untuk membuat database vektor terkelola dengan data Anda. Untuk detailnya, lihat Migrasi dari Milvus ke Zilliz Cloud.

    +

    Memulihkan data

    +

    Anda dapat memanggil perintah API restore dengan opsi collection_suffix untuk membuat koleksi baru dengan memulihkan data dari cadangan. Ubah collection_names dan backup_name jika perlu.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "_recover",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    Opsi collection_suffix memungkinkan Anda untuk mengatur akhiran untuk koleksi baru yang akan dibuat. Perintah di atas akan membuat koleksi baru bernama hello_milvus_recover di dalam instans Milvus Anda.

    +

    Jika Anda lebih suka memulihkan koleksi yang dicadangkan tanpa mengubah namanya, hapus koleksi sebelum memulihkannya dari cadangan. Anda sekarang dapat membersihkan data yang dihasilkan di Siapkan data dengan menjalankan perintah berikut.

    +
    python example/clean_data.py
    +
    +

    Kemudian jalankan perintah berikut untuk memulihkan data dari cadangan.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    Proses pemulihan dapat memakan waktu, tergantung pada ukuran data yang akan dipulihkan. Oleh karena itu, semua tugas pemulihan berjalan secara asinkron. Anda dapat memeriksa status tugas pemulihan dengan menjalankannya:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=<test_restore_id>' \
    +--header 'Content-Type: application/json'
    +
    +

    Ingatlah untuk mengubah test_restore_id ke yang dipulihkan oleh API pemulihan.

    +

    Memverifikasi data yang dipulihkan

    Setelah pemulihan selesai, Anda dapat memverifikasi data yang dipulihkan dengan mengindeks koleksi yang dipulihkan sebagai berikut:

    +
    python example/verify_data.py
    +
    +

    Perhatikan bahwa skrip di atas mengasumsikan bahwa Anda telah menjalankan perintah restore dengan bendera -s dan akhiran disetel ke -recover. Jangan ragu untuk membuat perubahan yang diperlukan pada skrip agar sesuai dengan kebutuhan Anda.

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.json new file mode 100644 index 000000000..4a157de48 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","python example/prepare_data.py\n","./milvus-backup create -n \n","# configure a Minio host\nmc alias set my_minio https:// \n\n# List the available buckets\nmc ls my_minio\n\n# Download a bucket recursively\nmc cp --recursive my_minio/ \n","./milvus-backup restore -n my_backup -s _recover\n","python example/clean_data.py\n","./milvus-backup restore -n my_backup\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using Commands","anchorList":[{"label":"Mencadangkan dan Memulihkan Data Menggunakan Perintah","href":"Back-up-and-Restore-Data-Using-Commands","type":1,"isActive":false},{"label":"Mendapatkan Cadangan Milvus","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"Siapkan berkas konfigurasi","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"Menyiapkan data","href":"Prepare-data","type":2,"isActive":false},{"label":"Mencadangkan data","href":"Back-up-data","type":2,"isActive":false},{"label":"Memulihkan data","href":"Restore-data","type":2,"isActive":false},{"label":"Verifikasi data yang dipulihkan","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.md new file mode 100644 index 000000000..4274166d3 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_cli.md @@ -0,0 +1,180 @@ +--- +id: milvus_backup_cli.md +summary: Pelajari cara menggunakan Milvus Backup melalui CLI +title: Mencadangkan dan Memulihkan Data Menggunakan Perintah +--- +

    Mencadangkan dan Memulihkan Data Menggunakan Perintah

    Milvus Backup menyediakan fitur pencadangan dan pemulihan data untuk memastikan keamanan data Milvus Anda.

    +

    Mendapatkan Cadangan Milvus

    Anda bisa mengunduh biner yang telah dikompilasi atau membangun dari sumbernya.

    +

    Untuk mengunduh biner yang telah dikompilasi, buka halaman rilis, di mana Anda dapat menemukan semua rilis resmi. Ingat, selalu gunakan biner dalam rilis yang ditandai sebagai Terbaru.

    +

    Untuk mengkompilasi dari sumbernya, lakukan hal berikut:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    Siapkan berkas konfigurasi

    Unduh contoh berkas konfigurasi dan sesuaikan dengan kebutuhan Anda.

    +

    Kemudian buat sebuah folder di samping berkas biner Milvus Backup yang telah diunduh atau dibuat, beri nama folder tersebut configs, dan letakkan berkas konfigurasi di dalam folder configs.

    +

    Struktur folder Anda seharusnya mirip dengan yang berikut ini:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    Karena Milvus Backup tidak dapat mencadangkan data Anda ke jalur lokal, pastikan pengaturan Minio sudah benar saat menyesuaikan file konfigurasi.

    +
    +

    Nama bucket Minio default bervariasi sesuai dengan cara Anda menginstal Milvus. Ketika membuat perubahan pada pengaturan Minio, lihat tabel berikut.

    + + + + + + + + +
    bidangPenulisan DockerHelm / Operator Milvus
    bucketNamea-bucketmilvus-bucket
    rootPathberkasfile
    +
    +

    Menyiapkan data

    Jika Anda menjalankan instans Milvus lokal kosong pada port default, gunakan contoh skrip Python untuk menghasilkan beberapa data dalam instans Anda. Jangan ragu untuk membuat perubahan yang diperlukan pada skrip agar sesuai dengan kebutuhan Anda.

    +

    Dapatkan skripnya. Kemudian jalankan skrip untuk menghasilkan data. Pastikan bahwa PyMilvus, SDK Python Milvus resmi, telah terinstal.

    +
    python example/prepare_data.py
    +
    +

    Langkah ini bersifat opsional. Jika Anda melewatkan langkah ini, pastikan bahwa Anda sudah memiliki beberapa data dalam instance Milvus Anda.

    +

    Mencadangkan data

    Perhatikan bahwa menjalankan Milvus Backup terhadap instans Milvus biasanya tidak akan memengaruhi jalannya instans. Instance Milvus Anda akan berfungsi penuh selama pencadangan atau pemulihan.

    +
    +

    Jalankan perintah berikut untuk membuat cadangan.

    +
    ./milvus-backup create -n <backup_name>
    +
    +

    Setelah perintah dijalankan, Anda dapat memeriksa file cadangan dalam bucket yang ditentukan dalam pengaturan Minio. Secara khusus, Anda dapat mengunduhnya menggunakan Minio Console atau klien mc.

    +

    Untuk mengunduh dari Minio Console, masuk ke Minio Console, cari bucket yang ditentukan di minio.address, pilih file di dalam bucket, dan klik Download untuk mengunduhnya.

    +

    Jika Anda lebih memilih klien mc, lakukan hal berikut:

    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +# List the available buckets
    +mc ls my_minio
    +
    +# Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    Sekarang, Anda dapat menyimpan file cadangan ke tempat yang aman untuk pemulihan di masa mendatang, atau mengunggahnya ke Zilliz Cloud untuk membuat database vektor terkelola dengan data Anda. Untuk detailnya, lihat Migrasi dari Milvus ke Zilliz Cloud.

    +

    Memulihkan data

    +

    Anda dapat menjalankan perintah restore dengan bendera -s untuk membuat koleksi baru dengan memulihkan data dari cadangan:

    +
    ./milvus-backup restore -n my_backup -s _recover
    +
    +

    Bendera -s memungkinkan Anda untuk mengatur akhiran untuk koleksi baru yang akan dibuat. Perintah di atas akan membuat koleksi baru bernama hello_milvus_recover di dalam instans Milvus Anda.

    +

    Jika Anda lebih suka memulihkan koleksi yang dicadangkan tanpa mengubah namanya, hapus koleksi sebelum memulihkannya dari cadangan. Anda sekarang dapat membersihkan data yang dihasilkan di Siapkan data dengan menjalankan perintah berikut.

    +
    python example/clean_data.py
    +
    +

    Kemudian jalankan perintah berikut untuk memulihkan data dari cadangan.

    +
    ./milvus-backup restore -n my_backup
    +
    +

    Verifikasi data yang dipulihkan

    Setelah pemulihan selesai, Anda dapat memverifikasi data yang dipulihkan dengan mengindeks koleksi yang dipulihkan sebagai berikut:

    +
    python example/verify_data.py
    +
    +

    Perhatikan bahwa skrip di atas mengasumsikan bahwa Anda telah menjalankan perintah restore dengan bendera -s dan akhiran diatur ke -recover. Jangan ragu untuk membuat perubahan yang diperlukan pada skrip agar sesuai dengan kebutuhan Anda.

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.json new file mode 100644 index 000000000..f27fba055 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Backup","anchorList":[{"label":"Cadangan Milvus","href":"Milvus-Backup","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Arsitektur","href":"Architecture","type":2,"isActive":false},{"label":"Rilis terbaru","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.md new file mode 100644 index 000000000..69f00ad4e --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-backup/milvus_backup_overview.md @@ -0,0 +1,83 @@ +--- +id: milvus_backup_overview.md +summary: >- + Milvus-Backup adalah alat yang memungkinkan pengguna untuk membuat cadangan + dan memulihkan data Milvus. +title: Cadangan Milvus +--- +

    Cadangan Milvus

    Milvus Backup adalah alat yang memungkinkan pengguna untuk mencadangkan dan memulihkan data Milvus. Alat ini menyediakan CLI dan API untuk menyesuaikan diri dengan skenario aplikasi yang berbeda.

    +

    Prasyarat

    Sebelum mulai menggunakan Milvus Backup, pastikan bahwa

    +
      +
    • Sistem operasi yang digunakan adalah CentOS 7.5+ atau Ubuntu LTS 18.04+,
    • +
    • Versi Go adalah 1.20.2 atau yang lebih baru.
    • +
    +

    Arsitektur

    + + Milvus Backup architecture + Arsitektur Milvus Backup

    +

    Milvus Backup memfasilitasi pencadangan dan pemulihan metadata, segmen, dan data di seluruh instance Milvus. Ini menyediakan antarmuka northbound, seperti CLI, API, dan modul Go berbasis gRPC, untuk manipulasi proses pencadangan dan pemulihan yang fleksibel.

    +

    Milvus Backup membaca metadata koleksi dan segmen dari instance Milvus sumber untuk membuat cadangan. Kemudian menyalin data koleksi dari jalur root instance Milvus sumber dan menyimpan data yang disalin ke dalam jalur root cadangan.

    +

    Untuk memulihkan dari cadangan, Milvus Backup membuat koleksi baru di contoh Milvus target berdasarkan metadata koleksi dan informasi segmen dalam cadangan. Kemudian menyalin data cadangan dari jalur root cadangan ke jalur root instance target.

    +

    Rilis terbaru

    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.json new file mode 100644 index 000000000..772aade65 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Monitoring","anchorList":[{"label":"Pemantauan","href":"Monitoring","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.md new file mode 100644 index 000000000..34532f12c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/cdc-monitoring.md @@ -0,0 +1,44 @@ +--- +id: cdc-monitoring.md +order: 4 +summary: >- + Milvus-CDC menyediakan kemampuan pemantauan yang komprehensif melalui dasbor + Grafana. +title: Pemantauan +--- +

    Pemantauan

    Milvus-CDC menyediakan kemampuan pemantauan yang komprehensif melalui dasbor Grafana, yang memungkinkan Anda memvisualisasikan metrik-metrik utama dan memastikan kelancaran tugas-tugas Change Data Capture (CDC) dan kesehatan server Anda.

    +

    Metrik untuk tugas CDC

    Untuk memulai, impor file cdc-grafana.json ke Grafana. Ini akan menambahkan dasbor yang dirancang khusus untuk memantau status tugas CDC.

    +

    Ikhtisar Dasbor CDC Grafana:

    +

    + + milvus-cdc-dashboard + milvus-cdc-dashboard

    +

    Penjelasan Metrik Utama:

    +
      +
    • Tugas: Jumlah tugas CDC dalam berbagai status, termasuk Inisial, Berjalan, dan Dijeda.

    • +
    • Total Permintaan: Jumlah total permintaan yang diterima oleh Milvus-CDC.

    • +
    • Keberhasilan Permintaan: Jumlah permintaan yang berhasil diterima oleh Milvus-CDC.

    • +
    • task num: Jumlah tugas dalam status Inisial, Jeda, dan Berjalan dari waktu ke waktu.

    • +
    • task state: Status dari masing-masing tugas.

    • +
    • jumlah permintaan: Jumlah permintaan yang berhasil dan total permintaan

    • +
    • latensi permintaan: Latensi permintaan melalui p99, rata-rata, dan statistik lainnya.

    • +
    • kecepatan data replikasi: Kecepatan data replikasi untuk operasi baca/tulis

    • +
    • replicate tt lag: Jeda waktu replikasi untuk operasi baca/tulis.

    • +
    • api execute count: Berapa kali API Milvus-CDC yang berbeda dieksekusi.

    • +
    • center ts: Stempel waktu untuk tugas baca/tulis.

    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.json new file mode 100644 index 000000000..f17b76797 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/zilliztech/milvus-cdc.git\n\ncd milvus-cdc/server/configs\n","# cdc meta data config\nmetaStoreConfig:\n # the metastore type, available value: etcd, mysql\n storeType: etcd\n # etcd address\n etcdEndpoints:\n - localhost:2379\n # mysql connection address\n # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8\n # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy\n rootPath: cdc\n","# milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.\nsourceConfig:\n # etcd config\n etcdAddress:\n - localhost:2379\n etcdRootPath: by-dev\n etcdMetaSubPath: meta\n # default partition name\n defaultPartitionName: _default\n # read buffer length, mainly used for buffering if writing data to milvus-target is slow.\n readChanLen: 10\n replicateChan: by-dev-replicate-msg\n # milvus-source mq config, which is pulsar or kafka\n pulsar:\n address: pulsar://localhost:6650\n webAddress: localhost:80\n maxMessageSize: 5242880\n tenant: public\n namespace: default\n# authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken\n# authParams: token:xxx\n# kafka:\n# address: 127.0.0.1:9092\n","make build\n","bash build_image.sh\n","# dir tree\n.\n├── milvus-cdc # build from source code or download from release page\n├── configs\n│ └── cdc.yaml # config for cdc and source milvus\n\n# start milvus cdc\n./milvus-cdc server\n","docker compose up -d\n"],"headingContent":"Deploy CDC Server","anchorList":[{"label":"Menyebarkan Server CDC","href":"Deploy-CDC-Server","type":1,"isActive":false},{"label":"Prasyarat","href":"Prerequisites","type":2,"isActive":false},{"label":"Langkah-langkah","href":"Steps","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.md new file mode 100644 index 000000000..b8ec2a9e0 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/deploy-cdc-server.md @@ -0,0 +1,156 @@ +--- +id: deploy-cdc-server.md +order: 2 +summary: >- + Panduan ini menyediakan proses langkah demi langkah untuk menerapkan server + Milvus-CDC. +title: Menyebarkan Server CDC +--- +

    Menyebarkan Server CDC

    Panduan ini menyediakan proses langkah demi langkah untuk menerapkan server Milvus-CDC.

    +

    Prasyarat

    Pastikan kondisi berikut ini terpenuhi sebelum menggunakan server Milvus-CDC:

    +
      +
    • Instance Milvus: Milvus sumber dan setidaknya satu Milvus target harus diterapkan dan beroperasi.

      +
        +
      • Versi Milvus sumber dan target harus 2.3.2 atau lebih tinggi, sebaiknya 2.4.x. Kami menyarankan untuk menggunakan versi yang sama untuk Milvus sumber dan target untuk memastikan kompatibilitas.

      • +
      • Atur konfigurasi common.ttMsgEnabled dari Milvus target ke false.

      • +
      • Konfigurasikan Milvus sumber dan target dengan pengaturan meta dan penyimpanan pesan yang berbeda untuk mencegah konflik. Sebagai contoh, hindari penggunaan konfigurasi etcd dan rootPath yang sama, serta layanan Pulsar dan chanNamePrefix yang sama di beberapa instans Milvus.

      • +
    • +
    • Metastore: Siapkan basis data etcd atau MySQL untuk metastore Milvus-CDC.

    • +
    +

    Langkah-langkah

    Dapatkan berkas konfigurasi Milvus-CDC

    Kloning repo Milvus-CDC dan arahkan ke direktori milvus-cdc/server/configs untuk mengakses berkas konfigurasi cdc.yaml.

    +
    git clone https://github.com/zilliztech/milvus-cdc.git
    +
    +cd milvus-cdc/server/configs
    +
    +

    Mengedit berkas konfigurasi

    Di direktori milvus-cdc/server/configs, ubah berkas cdc.yaml untuk menyesuaikan konfigurasi yang terkait dengan metastore Milvus-CDC dan detail koneksi Milvus sumber.

    +
      +
    • Konfigurasi Metastore:

      +
        +
      • metaStoreConfig.storeType: Jenis metastore untuk Milvus-CDC. Nilai yang mungkin adalah etcd atau mysql.

      • +
      • metaStoreConfig.etcdEndpoints: Alamat untuk menyambung ke etcd Milvus-CDC. Diperlukan jika storeType diatur ke etcd.

      • +
      • metaStoreConfig.mysqlSourceUrl: Alamat koneksi database MySQL untuk server Milvus-CDC. Diperlukan jika storeType diatur ke mysql.

      • +
      • metaStoreConfig.rootPath: Jalur root dari metastore Milvus-CDC. Konfigurasi ini memungkinkan multi-tenancy, yang memungkinkan beberapa layanan CDC untuk menggunakan instance etcd atau MySQL yang sama sembari mencapai isolasi melalui jalur root yang berbeda.

      • +
      +

      Contoh konfigurasi:

      +
      # cdc meta data config
      +metaStoreConfig:
      +  # the metastore type, available value: etcd, mysql
      +  storeType: etcd
      +  # etcd address
      +  etcdEndpoints:
      +    - localhost:2379
      +  # mysql connection address
      +  # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8
      +  # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy
      +  rootPath: cdc
      +
    • +
    • Konfigurasi Milvus Sumber:

      +

      Tentukan detail koneksi Milvus sumber, termasuk etcd dan penyimpanan pesan, untuk membuat koneksi antara server Milvus-CDC dan Milvus sumber.

      +
        +
      • sourceConfig.etcdAddress: Alamat untuk menyambung ke etcd Milvus sumber. Untuk informasi lebih lanjut, lihat Konfigurasi terkait etcd.

      • +
      • sourceConfig.etcdRootPath: Awalan root dari kunci di mana Milvus sumber menyimpan data dalam etcd. Nilainya dapat bervariasi berdasarkan metode penyebaran instans Milvus:

        +
          +
        • Helm atau Docker Compose: Defaultnya adalah by-dev.

        • +
        • Operator: Defaultnya adalah <release_name>.

        • +
      • +
      • replicateChan: nama saluran replikasi milvus, yaitu {msgChannel.chanNamePrefix.cluster}/{msgChannel.chanNamePrefix.replicateMsg} dalam berkas milvus.yaml

      • +
      • sourceConfig.pulsar: Konfigurasi pulsar untuk Milvus sumber. Jika Milvus sumber menggunakan Kafka untuk penyimpanan pesan, hapus semua konfigurasi yang berhubungan dengan Pulsar. Untuk informasi lebih lanjut, lihat Konfigurasi yang berhubungan dengan Pulsar.

      • +
      • sourceConfig.kafka.address: Alamat Kafka untuk Milvus sumber. Hapus konfigurasi ini jika Milvus sumber menggunakan Kafka untuk penyimpanan pesan.

      • +
    • +
    +

    Contoh konfigurasi:

    +
    # milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.
    +sourceConfig:
    +  # etcd config
    +  etcdAddress:
    +    - localhost:2379
    +  etcdRootPath: by-dev
    +  etcdMetaSubPath: meta
    +  # default partition name
    +  defaultPartitionName: _default
    +  # read buffer length, mainly used for buffering if writing data to milvus-target is slow.
    +  readChanLen: 10
    +  replicateChan: by-dev-replicate-msg
    +  # milvus-source mq config, which is pulsar or kafka
    +  pulsar:
    +    address: pulsar://localhost:6650
    +    webAddress: localhost:80
    +    maxMessageSize: 5242880
    +    tenant: public
    +    namespace: default
    +#    authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken
    +#    authParams: token:xxx
    +#  kafka:
    +#    address: 127.0.0.1:9092
    +
    +

    Mengkompilasi server Milvus-CDC

    Setelah menyimpan berkas cdc.yaml, arahkan ke direktori milvus-cdc dan jalankan salah satu perintah berikut untuk mengkompilasi server:

    +
      +
    • Untuk berkas biner:

      +
      make build
      +
    • +
    • Untuk citra Docker:

      +
      bash build_image.sh
      +
      +

      Untuk citra Docker, pasang berkas yang telah dikompilasi ke /app/server/configs/cdc.yaml di dalam kontainer.

    • +
    +

    Memulai server

      +
    • Menggunakan biner

      +

      Arahkan ke direktori yang berisi berkas biner milvus-cdc dan direktori configs dengan berkas cdc.yaml, lalu mulai server:

      +
      # dir tree
      +.
      +├── milvus-cdc # build from source code or download from release page
      +├── configs
      +│   └── cdc.yaml # config for cdc and source milvus
      +
      +# start milvus cdc
      +./milvus-cdc server
      +
    • +
    • Menggunakan Docker Compose:

      +
      docker compose up -d
      +
    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.json new file mode 100644 index 000000000..2b33cd15d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.json @@ -0,0 +1 @@ +{"codeList":["curl -X POST http:_//localhost:8444/cdc \\\n-H \"Content-Type: application/json\" \\\n-d '{\n \"request_type\": \"create\",\n \"request_data\": {\n \"milvus_connect_param\": {\n \"uri\": \"http://localhost:19530\",\n \"token\":\"root:Milvus\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ]\n }\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"task_id\":\"xxxx\"\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\": \"list\"\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"tasks\": [\n {\n \"task_id\": \"xxxxx\",\n \"milvus_connect_param\": {\n \"uri\":\"http://localhost:19530\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"state\": \"Running\"\n }\n ]\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"pause\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"resume\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"get\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"Task\": {\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"milvus_connect_param\": {\n \"connect_timeout\": 10,\n \"uri\":\"http://localhost:19530\"\n },\n \"state\": \"Running\",\n \"task_id\": \"xxxx\"\n }\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"delete\",\n \"request_data\": {\n \"task_id\": \"30d1e325df604ebb99e14c2a335a1421\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n"],"headingContent":"Manage CDC Tasks","anchorList":[{"label":"Mengelola Tugas CDC","href":"Manage-CDC-Tasks","type":1,"isActive":false},{"label":"Membuat tugas","href":"Create-a-task","type":2,"isActive":false},{"label":"Membuat daftar tugas","href":"List-tasks","type":2,"isActive":false},{"label":"Menjeda tugas","href":"Pause-a-task","type":2,"isActive":false},{"label":"Melanjutkan tugas","href":"Resume-a-task","type":2,"isActive":false},{"label":"Mengambil detail tugas","href":"Retrieve-task-details","type":2,"isActive":false},{"label":"Menghapus tugas","href":"Delete-a-task","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.md new file mode 100644 index 000000000..cadbcdb7c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/manage-cdc-tasks.md @@ -0,0 +1,275 @@ +--- +id: manage-cdc-tasks.md +order: 3 +summary: >- + Tugas Capture Data Change (CDC) memungkinkan sinkronisasi data dari contoh + Milvus sumber ke contoh Milvus target. +title: Mengelola Tugas CDC +--- +

    Mengelola Tugas CDC

    Tugas Capture Data Change (CDC) memungkinkan sinkronisasi data dari instance Milvus sumber ke instance Milvus target. Tugas ini memonitor log operasi dari sumber dan mereplikasi perubahan data seperti penyisipan, penghapusan, dan operasi indeks ke target secara real-time. Hal ini memfasilitasi pemulihan bencana secara real-time atau penyeimbangan beban aktif-aktif di antara penerapan Milvus.

    +

    Panduan ini mencakup cara mengelola tugas CDC, termasuk membuat, menjeda, melanjutkan, mengambil detail, mencantumkan, dan menghapus melalui permintaan HTTP.

    +

    Membuat tugas

    Membuat tugas CDC memungkinkan operasi perubahan data di Milvus sumber disinkronkan ke Milvus target.

    +

    Untuk membuat tugas CDC:

    +
    curl -X POST http:_//localhost:8444/cdc \
    +-H "Content-Type: application/json" \
    +-d '{
    +  "request_type": "create",
    +  "request_data": {
    +    "milvus_connect_param": {
    +      "uri": "http://localhost:19530",
    +      "token":"root:Milvus",
    +      "connect_timeout": 10
    +    },
    +    "collection_infos": [
    +      {
    +        "name": "*"
    +      }
    +    ]
    +  }
    +}'
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Parameter:

    +
      +
    • milvus_connect_param: Parameter koneksi Milvus target.

      +
        +
      • host: Nama host atau alamat IP server Milvus.

      • +
      • port: Nomor port yang didengarkan oleh server Milvus.

      • +
      • username: Nama pengguna untuk mengautentikasi dengan server Milvus.

      • +
      • password: Kata sandi untuk mengautentikasi dengan server Milvus.

      • +
      • enable_tls: Apakah akan menggunakan enkripsi TLS/SSL untuk koneksi.

      • +
      • connect_timeout: Periode batas waktu dalam detik untuk membangun koneksi.

      • +
    • +
    • collection_infos: Koleksi yang akan disinkronkan. Saat ini, hanya tanda bintang(*) yang didukung, karena Milvus-CDC melakukan sinkronisasi di tingkat kluster, bukan koleksi individual.

    • +
    +

    Tanggapan yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "task_id":"xxxx"
    +  }
    +}
    +
    +

    Membuat daftar tugas

    Untuk mencantumkan semua tugas CDC yang dibuat:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type": "list"
    +}' http://localhost:8444/cdc
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Tanggapan yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "tasks": [
    +      {
    +        "task_id": "xxxxx",
    +        "milvus_connect_param": {
    +          "uri":"http://localhost:19530",
    +          "connect_timeout": 10
    +        },
    +        "collection_infos": [
    +          {
    +            "name": "*"
    +          }
    +        ],
    +        "state": "Running"
    +      }
    +    ]
    +  }
    +}
    +
    +

    Menjeda tugas

    Untuk menjeda tugas CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"pause",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Parameter:

    +
      +
    • task_id: ID tugas CDC yang akan dijeda.
    • +
    +

    Respons yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    Melanjutkan tugas

    Untuk melanjutkan tugas CDC yang dijeda:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"resume",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Parameter:

    +
      +
    • task_id: ID tugas CDC yang akan dilanjutkan.
    • +
    +

    Respons yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    Mengambil detail tugas

    Untuk mengambil detail tugas CDC tertentu:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"get",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Parameter

    +
      +
    • task_id: ID tugas CDC yang akan ditanyakan.
    • +
    +

    Respons yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "Task": {
    +      "collection_infos": [
    +        {
    +          "name": "*"
    +        }
    +      ],
    +      "milvus_connect_param": {
    +        "connect_timeout": 10,
    +        "uri":"http://localhost:19530"
    +      },
    +      "state": "Running",
    +      "task_id": "xxxx"
    +    }
    +  }
    +}
    +
    +

    Menghapus tugas

    Untuk menghapus tugas CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"delete",
    +  "request_data": {
    +    "task_id": "30d1e325df604ebb99e14c2a335a1421"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Ganti localhost dengan alamat IP server Milvus target.

    +

    Parameter:

    +
      +
    • task_id: ID tugas CDC yang akan dihapus.
    • +
    +

    Tanggapan yang diharapkan:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.json new file mode 100644 index 000000000..243307f8c --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview","anchorList":[{"label":"Gambaran Umum","href":"Overview","type":1,"isActive":false},{"label":"Kemampuan utama","href":"Key-capabilities","type":2,"isActive":false},{"label":"Arsitektur","href":"Architecture","type":2,"isActive":false},{"label":"Alur kerja","href":"Workflow","type":2,"isActive":false},{"label":"Batasan","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.md new file mode 100644 index 000000000..11461de9d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-cdc/milvus-cdc-overview.md @@ -0,0 +1,125 @@ +--- +id: milvus-cdc-overview.md +order: 1 +summary: >- + Milvus-CDC adalah alat bantu yang mudah digunakan yang dapat menangkap dan + menyinkronkan data tambahan dalam instance Milvus. +title: Gambaran Umum CDC +--- +

    Gambaran Umum

    Milvus-CDC adalah alat yang mudah digunakan yang dapat menangkap dan menyinkronkan data tambahan dalam instance Milvus. Alat ini memastikan keandalan data bisnis dengan mentransfernya secara mulus antara instance sumber dan target, sehingga memungkinkan pencadangan inkremental yang mudah dan pemulihan bencana.

    +

    Kemampuan utama

      +
    • Sinkronisasi Data Berurutan: Memastikan integritas dan konsistensi data dengan menyinkronkan perubahan data secara berurutan di antara instance Milvus.

    • +
    • Replikasi Data Tambahan: Mereplikasi data tambahan, termasuk penyisipan dan penghapusan, dari Milvus sumber ke Milvus target, menawarkan penyimpanan yang persisten.

    • +
    • Manajemen Tugas CDC: Memungkinkan pengelolaan tugas CDC melalui permintaan OpenAPI, termasuk membuat, menanyakan status, dan menghapus tugas CDC.

    • +
    +

    Selain itu, kami berencana untuk memperluas kemampuan kami untuk menyertakan dukungan untuk integrasi dengan sistem pemrosesan aliran di masa depan.

    +

    Arsitektur

    Milvus-CDC mengadopsi arsitektur dengan dua komponen utama - server HTTP yang mengelola tugas dan metadata, dan corelib yang menyinkronkan eksekusi tugas dengan pembaca yang memperoleh data dari instance Milvus sumber dan penulis yang mengirimkan data yang telah diproses ke instance Milvus target.

    +

    + + milvus-cdc-architecture + arsitektur milvus-cdc

    +

    Dalam diagram sebelumnya,

    +
      +
    • Server HTTP: Menangani permintaan pengguna, menjalankan tugas, dan memelihara metadata. Server ini berfungsi sebagai bidang kontrol untuk orkestrasi tugas dalam sistem Milvus-CDC.

    • +
    • Corelib: Bertanggung jawab atas sinkronisasi tugas yang sebenarnya. Ini mencakup komponen pembaca yang mengambil informasi dari sumber Milvus's etcd dan antrean pesan (MQ), dan komponen penulis yang menerjemahkan pesan dari MQ ke dalam parameter API untuk sistem Milvus dan mengirimkan permintaan ini ke Milvus target untuk menyelesaikan proses sinkronisasi.

    • +
    +

    Alur kerja

    Alur pemrosesan data Milvus-CDC melibatkan langkah-langkah berikut:

    +
      +
    1. Pembuatan tugas: Pengguna memulai tugas CDC melalui permintaan HTTP.

    2. +
    3. Pengambilan metadata: Sistem mengambil metadata khusus koleksi dari sumber etcd Milvus, termasuk informasi saluran dan pos pemeriksaan untuk koleksi tersebut.

    4. +
    5. Koneksi MQ: Dengan metadata yang ada, sistem terhubung ke MQ untuk mulai berlangganan aliran data.

    6. +
    7. Pemrosesan data: Data dari MQ dibaca, diuraikan, dan diteruskan menggunakan Go SDK atau diproses untuk mereplikasi operasi yang dilakukan di sumber Milvus.

    8. +
    +

    + + milvus-cdc-workflow + milvus-cdc-alur kerja

    +

    Batasan

      +
    • Sinkronisasi Data Tambahan: Untuk saat ini, Milvus-CDC dirancang untuk menyinkronkan hanya data tambahan. Jika bisnis Anda memerlukan pencadangan data penuh, silakan hubungi kami untuk mendapatkan bantuan.

    • +
    • Cakupan Sinkronisasi: Saat ini, Milvus-CDC dapat menyinkronkan data di tingkat cluster. Kami sedang berupaya menambahkan dukungan untuk sinkronisasi data tingkat koleksi dalam rilis mendatang.

    • +
    • Permintaan API yang didukung: Milvus-CDC saat ini mendukung permintaan API berikut ini. Kami berencana untuk memperluas dukungan untuk permintaan tambahan di rilis mendatang:

      +
        +
      • Membuat/Menghapus Koleksi

      • +
      • Menyisipkan/Menghapus/Memasang

      • +
      • Membuat/Menghapus Partisi

      • +
      • Membuat/Menghapus Indeks

      • +
      • Memuat/Melepas/Menyiram

      • +
      • Memuat/Melepaskan Partisi

      • +
      • Membuat/Menghapus Basis Data

      • +
    • +
    diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.json b/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.json new file mode 100644 index 000000000..99c906d0d --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.json @@ -0,0 +1 @@ +{"codeList":["http://${MILVUS_PROXY_IP}:9091/webui\n"],"headingContent":"Milvus WebUI","anchorList":[{"label":"Milvus WebUI","href":"Milvus-WebUI","type":1,"isActive":false},{"label":"Gambaran Umum","href":"Overview","type":2,"isActive":false},{"label":"Fitur","href":"Features","type":2,"isActive":false},{"label":"Beranda","href":"Home","type":2,"isActive":false},{"label":"Koleksi","href":"Collections","type":2,"isActive":false},{"label":"Query","href":"Query","type":2,"isActive":false},{"label":"Data","href":"Data","type":2,"isActive":false},{"label":"Tugas","href":"Tasks","type":2,"isActive":false},{"label":"Permintaan lambat","href":"Slow-requests","type":2,"isActive":false},{"label":"Konfigurasi","href":"Configurations","type":2,"isActive":false},{"label":"Alat","href":"Tools","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.md b/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.md new file mode 100644 index 000000000..7b9e73ea1 --- /dev/null +++ b/localization/v2.5.x/site/id/userGuide/tools/milvus-webui.md @@ -0,0 +1,290 @@ +--- +id: milvus-webui.md +summary: >- + Milvus Web UI adalah alat manajemen grafis untuk Milvus. Alat ini meningkatkan + kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda + dapat +title: Milvus WebUI +--- +

    Milvus WebUI

    Milvus Web UI adalah alat manajemen grafis untuk Milvus. Alat ini meningkatkan kemampuan pengamatan sistem dengan antarmuka yang sederhana dan intuitif. Anda dapat menggunakan Milvus Web UI untuk mengamati statistik dan metrik komponen dan ketergantungan Milvus, memeriksa detail basis data dan koleksi, dan membuat daftar konfigurasi Milvus yang terperinci.

    +

    Gambaran Umum

    Milvus Web UI berbeda dengan Birdwatcher dan Attu karena Milvus Web UI merupakan alat bawaan untuk menyediakan pengamatan sistem secara keseluruhan dengan antarmuka yang sederhana dan intuitif.

    +

    Tabel berikut ini membandingkan fitur-fitur Milvus Web UI dan Birdwatcher/Attu:

    + + + + + + + + + + + + +
    FiturMilvus Web UIPengamat BurungAttu
    Bentuk operasionalGUICLIGUI
    Target penggunaPemelihara, pengembangPemeliharaPengembang
    InstalasiBawaan bawaanAlat yang berdiri sendiriAlat yang berdiri sendiri
    KetergantunganMilvusMilvus / etcdMilvus
    Fungsi UtamaLingkungan runtime, detail basis data/koleksi, segmen, saluran, tugas, dan permintaan kueri yang lambatPemeriksaan metadata dan eksekusi API MilvusManajemen basis data dan tugas-tugas operasional
    Tersedia sejakv2.5.0v2.0.0v0.1.8
    +

    Sejak v2.5.0, Anda dapat mengakses Milvus Web UI menggunakan URL berikut ini pada instance Milvus yang sedang berjalan:

    +
    http://${MILVUS_PROXY_IP}:9091/webui
    +
    +

    Fitur

    Milvus Web UI menyediakan fitur-fitur berikut ini:

    +

    + + Milvus Web UI overview + Gambaran umum Milvus Web UI

    +
      +
    • Beranda

      +

      Anda dapat menemukan informasi tentang instance Milvus yang sedang berjalan, komponen, klien yang terhubung, dan dependensi.

    • +
    • Koleksi

      +

      Anda dapat melihat daftar database dan koleksi yang sedang berjalan di Milvus dan memeriksa detailnya.

    • +
    • Query

      +

      Anda dapat melihat statistik yang dikumpulkan dari node kueri dan koordinator kueri dalam hal segmen, saluran, replika, dan grup sumber daya.

    • +
    • Data

      +

      Anda dapat melihat statistik yang dikumpulkan dari node data dalam hal segmen dan saluran.

    • +
    • Tugas

      +

      Anda dapat melihat daftar tugas yang berjalan di Milvus, termasuk tugas penjadwal Querycoord, tugas pemadatan, tugas pembuatan indeks, tugas impor, dan tugas sinkronisasi data.

    • +
    • Permintaan lambat

      +

      Anda dapat melihat daftar permintaan lambat di Milvus, termasuk jenis permintaan, durasi permintaan, dan parameter permintaan.

    • +
    • Konfigurasi

      +

      Anda dapat melihat daftar konfigurasi Milvus dan nilainya.

    • +
    • Alat

      +

      Anda dapat mengakses dua alat bawaan, pprof dan alat visualisasi data Milvus, dari UI Web.

    • +
    +

    Beranda

    Pada halaman Beranda, Anda dapat menemukan informasi berikut:

    +

    + + Milvus Web UI Home + Beranda UI Web Milvus

    +
      +
    • Informasi sistem: Melihat informasi sistem, termasuk informasi tentang mode penerapan, gambar yang digunakan dalam penerapan, dan informasi terkait.

    • +
    • Informasi Komponen: Melihat status dan metrik komponen di Milvus, termasuk status dan metrik node kueri, node data, node indeks, koordinator, dan proksi.

    • +
    • Klien yang terhubung: Melihat klien yang terhubung dan informasinya, termasuk jenis dan versi SDK, nama pengguna, dan riwayat akses mereka.

    • +
    • Ketergantungan sistem: Melihat status dan metrik ketergantungan Milvus, termasuk status dan metrik meta store, antrean pesan, dan penyimpanan objek.

    • +
    +

    Koleksi

    Pada halaman Koleksi, Anda dapat melihat daftar basis data dan koleksi yang ada di Milvus saat ini dan memeriksa detailnya.

    +

    + + Milvus Web UI Collections + Koleksi UI Web Milvus

    +
      +
    • Database: Melihat daftar database yang saat ini ada di Milvus dan detailnya.

    • +
    • Koleksi: Melihat daftar koleksi di setiap basis data dan rinciannya.

      +

      Anda dapat mengklik sebuah koleksi untuk melihat detailnya, termasuk jumlah field, partisi, indeks, dan informasi lainnya secara rinci.

      +

      + + Milvus Web UI Collection Details + Detail Koleksi UI Web Milvus

    • +
    +

    Query

    + + Milvus Web UI Query Page + Halaman Kueri Milvus Web UI

    +
      +
    • Segmen: Melihat daftar segmen dan detailnya, termasuk ID segmen, koleksi yang sesuai, status, ukuran, dll.

    • +
    • Saluran: Melihat daftar saluran dan detailnya, termasuk nama saluran, koleksi yang sesuai, dll.

    • +
    • Replika: Melihat daftar replika dan detailnya, termasuk ID replika, koleksi yang sesuai, dll.

    • +
    • Grup sumber daya: Melihat daftar grup sumber daya dan detailnya, termasuk nama grup sumber daya, jumlah node kueri dalam grup, dan konfigurasinya, dll.

    • +
    +

    Data

    + + Milvus Web UI Data Page + Halaman Data UI Web Milvus

    +
      +
    • Segmen: Melihat daftar segmen dari node/koordinator data dan detailnya, termasuk ID segmen, koleksi yang sesuai, status, ukuran, dll.

    • +
    • Saluran: Melihat daftar saluran dari node/koordinator data dan detailnya, termasuk nama saluran, koleksi yang sesuai, dll.

    • +
    +

    Tugas

    + + Milvus Web UI Tasks Page + Halaman Tugas UI Web Milvus

    +
      +
    • Tugas: Melihat daftar tugas yang sedang berjalan di Milvus, termasuk jenis tugas, status, dan tindakan.

      +
        +
      • Tugas QueryCoord: Melihat semua tugas penjadwal QueryCoord, termasuk penyeimbang, pemeriksa indeks/segmen/saluran/pemimpin dalam 15 menit terakhir.

      • +
      • Tugas Pemadatan: Melihat semua tugas pemadatan dari koordinator data dalam 15 menit terakhir.

      • +
      • Tugas Pembuatan Indeks: Melihat semua tugas pembuatan indeks dari koordinator data dalam 30 menit terakhir.

      • +
      • Tugas Impor: Melihat semua tugas impor dari koordinator data dalam 30 menit terakhir.

      • +
      • Tugas Sinkronisasi Data: Melihat semua tugas sinkronisasi data dari node data dalam 15 menit terakhir.

      • +
    • +
    +

    Permintaan lambat

    + + Milvus Web UI Slow Requests Page + Halaman Permintaan Lambat UI Web Milvus

    +
      +
    • Permintaan lambat: Permintaan lambat adalah pencarian atau kueri yang memiliki latensi lebih lama dari nilai proxy.slowQuerySpanInSeconds yang ditentukan dalam konfigurasi. Daftar permintaan lambat menampilkan semua permintaan lambat dalam 15 menit terakhir.
    • +
    +

    Konfigurasi

    + + Milvus Web UI Configurations Page + Halaman Konfigurasi UI Web Milvus

    +
      +
    • Konfigurasi: Melihat daftar konfigurasi runtime Milvus dan nilainya.
    • +
    +

    Alat

      +
    • pprof: Mengakses alat pprof untuk membuat profil dan men-debug Milvus.

    • +
    • Alat visualisasi data Milvus: Mengakses alat visualisasi data Milvus untuk memvisualisasikan data dalam Milvus.

    • +
    diff --git a/localization/v2.5.x/site/ru/about/comparison.json b/localization/v2.5.x/site/ru/about/comparison.json new file mode 100644 index 000000000..d9b66f61c --- /dev/null +++ b/localization/v2.5.x/site/ru/about/comparison.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Comparing Milvus with Alternatives","anchorList":[{"label":"Сравнение Milvus с альтернативами","href":"Comparing-Milvus-with-Alternatives","type":1,"isActive":false},{"label":"Основные характеристики Milvus","href":"Milvus-highlights","type":2,"isActive":false},{"label":"Общее сравнение","href":"Overall-comparison","type":2,"isActive":false},{"label":"Сравнение терминологии","href":"Terminology-comparison","type":2,"isActive":false},{"label":"Сравнение возможностей","href":"Capability-comparison","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/about/comparison.md b/localization/v2.5.x/site/ru/about/comparison.md new file mode 100644 index 000000000..223d38370 --- /dev/null +++ b/localization/v2.5.x/site/ru/about/comparison.md @@ -0,0 +1,161 @@ +--- +id: comparison.md +title: Сравнение +summary: >- + В этой статье проводится сравнение Milvus с другими решениями для векторного + поиска. +--- +

    Сравнение Milvus с альтернативами

    При изучении различных вариантов векторных баз данных это полное руководство поможет вам понять уникальные особенности Milvus и выбрать базу данных, которая наилучшим образом соответствует вашим потребностям. Примечательно, что Milvus является ведущей векторной базой данных с открытым исходным кодом, а Zilliz Cloud предлагает полностью управляемый сервис Milvus. Чтобы объективно оценить Milvus в сравнении с конкурентами, воспользуйтесь инструментами сравнения для анализа показателей производительности.

    +

    Основные характеристики Milvus

      +
    • Функциональность: Milvus выходит за рамки базового поиска векторного сходства, поддерживая такие расширенные функции, как разреженный вектор, объемный вектор, фильтрованный поиск и гибридные возможности поиска.

    • +
    • Гибкость: Milvus поддерживает различные режимы развертывания и множество SDK, и все это в рамках надежной, интегрированной экосистемы.

    • +
    • Производительность: Milvus гарантирует обработку в реальном времени с высокой пропускной способностью и низкой задержкой благодаря оптимизированным алгоритмам индексирования, таким как HNSW и DiskANN, а также усовершенствованному GPU-ускорению.

    • +
    • Масштабируемость: Созданная на заказ распределенная архитектура легко масштабируется, позволяя обрабатывать любые данные - от небольших наборов данных до коллекций, превышающих 10 миллиардов векторов.

    • +
    +

    Общее сравнение

    Для сравнения Milvus и Pinecone, двух решений для векторных баз данных, в следующей таблице приведены различия по различным характеристикам.

    + + + + + + + + + + + + + +
    ХарактеристикаPineconeMilvusПримечания
    Режимы развертыванияТолько SaaSMilvus Lite, On-prem Standalone & Cluster, Zilliz Cloud Saas & BYOCMilvus предлагает большую гибкость в режимах развертывания.
    Поддерживаемые SDKPython, JavaScript/TypeScriptPython, Java, NodeJS, Go, Restful API, C#, RustMilvus поддерживает более широкий спектр языков программирования.
    Статус с открытым исходным кодомЗакрытоОткрытый исходный кодMilvus - популярная векторная база данных с открытым исходным кодом.
    МасштабируемостьТолько масштабирование вверх/внизМасштабирование наружу/внутрь и масштабирование вверх/внизMilvus имеет распределенную архитектуру для повышения масштабируемости.
    ДоступностьАрхитектура на основе модулей в доступных зонахОбход отказа в доступных зонах и межрегиональная HAMilvus CDC (Change Data Capture) обеспечивает основной/резервный режимы для повышения доступности.
    Стоимость (в долларах за миллион запросов)От 0,178 долл. для среднего набора данных, 1,222 долл. для большого набора данных.Zilliz Cloud - от 0,148 долл. для среднего набора данных, 0,635 долл. для большого набора данных; доступна бесплатная версия.См. отчет "Рейтинг стоимости".
    Ускорение на GPUНе поддерживаетсяПоддержка NVIDIA GPUУскорение GPU значительно повышает производительность, часто на порядки.
    +

    Сравнение терминологии

    Несмотря на то что обе системы выполняют схожие функции векторных баз данных, в терминологии Milvus и Pinecone наблюдаются небольшие различия. Ниже приводится подробное сравнение терминологии.

    + + + + + + + + + + + + +
    PineconeMilvusПримечания
    ИндексКоллекцияВ Pinecone индекс служит организационной единицей для хранения и управления векторами одинакового размера, и этот индекс тесно интегрирован с аппаратным обеспечением, известным как стручки. В отличие от этого, коллекции Milvus служат аналогичной цели, но позволяют работать с несколькими коллекциями в рамках одного экземпляра.
    КоллекцияРезервное копированиеВ Pinecone коллекция - это, по сути, статичный снимок индекса, который используется в основном для резервного копирования и не может быть запрошен. В Milvus эквивалентная функция для создания резервных копий более прозрачна и имеет простое название.
    Пространство именКлюч разделаПространства имен позволяют разделить векторы в индексе на подмножества. Milvus предоставляет несколько методов, таких как partition или partition key, для обеспечения эффективной изоляции данных в коллекции.
    МетаданныеСкалярное полеРабота с метаданными в Pinecone основана на парах ключ-значение, в то время как Milvus позволяет создавать сложные скалярные поля, включая стандартные типы данных и динамические поля JSON.
    ЗапросПоискНазвание метода, используемого для поиска ближайших соседей для заданного вектора, возможно, с применением дополнительных фильтров.
    НедоступноИтераторВ Pinecone отсутствует функция итерации по всем векторам в индексе. В Milvus появились методы Search Iterator и Query Iterator, расширяющие возможности поиска данных в различных наборах данных.
    +

    Сравнение возможностей

    + + + + + + + + + + + + +
    ВозможностиPineconeMilvus
    Режимы развертыванияТолько SaaSMilvus Lite, On-prem Standalone & Cluster, Zilliz Cloud Saas & BYOC
    Функции встраиванияНедоступноПоддержка с помощью pymilvus[model].
    Типы данныхСтрока, Число, Bool, Список строкString, VarChar, Number (Int, Float, Double), Bool, Array, JSON, Float Vector, Binary Vector, BFloat16, Float16, Sparse Vector
    Метрические и индексные типыCos, Dot, Euclidean
    P-семейство, S-семейство.
    Косинус, IP (Dot), L2 (Euclidean), Hamming, Jaccard
    FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, HNSW, SCANN, GPU Indexes
    Дизайн схемыГибкий режимГибкий режим, строгий режим
    Множественные векторные поляN/AМноговекторный и гибридный поиск
    ИнструментыНаборы данных, текстовые утилиты, коннектор sparkAttu, Birdwatcher, Backup, CLI, CDC, коннекторы для Spark и Kafka.
    +

    Основные сведения

      +
    • Режимы развертывания: Milvus предлагает различные варианты развертывания, включая локальное развертывание, Docker, Kubernetes на местах, Cloud SaaS и Bring Your Own Cloud (BYOC) для предприятий, в то время как Pinecone ограничивается SaaS-развертыванием.

    • +
    • Функции встраивания: Milvus поддерживает дополнительные библиотеки встраивания, позволяющие напрямую использовать модели встраивания для преобразования исходных данных в векторы.

    • +
    • Типы данных: Milvus поддерживает более широкий спектр типов данных, чем Pinecone, включая массивы и JSON. Pinecone поддерживает только плоскую структуру метаданных со строками, числами, булевыми числами или списками строк в качестве значений, в то время как Milvus может работать с любым объектом JSON, включая вложенные структуры внутри поля JSON. Pinecone ограничивает размер метаданных до 40 КБ на вектор.

    • +
    • Типы метрик и индексов: Milvus поддерживает широкий выбор типов метрик и индексов для различных случаев использования, в то время как Pinecone имеет более ограниченный выбор. В Milvus индекс для вектора является обязательным, но для упрощения процесса настройки доступна опция AUTO_INDEX.

    • +
    • Разработка схем: Milvus предлагает гибкие режимы create_collection для разработки схемы, включая быструю настройку с динамической схемой для работы без схемы, как в Pinecone, и индивидуальную настройку с предопределенными полями схемы и индексами, как в реляционной системе управления базами данных (RDBMS).

    • +
    • Множественные векторные поля: Milvus позволяет хранить несколько векторных полей в одной коллекции, которые могут быть как разреженными, так и плотными и иметь разную размерность. Pinecone не предлагает подобной возможности.

    • +
    • Инструменты: Milvus предлагает более широкий выбор инструментов для управления и использования баз данных, таких как Attu, Birdwatcher, Backup, CLI, CDC и коннектор Spark и Kafka.

    • +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/about/limitations.json b/localization/v2.5.x/site/ru/about/limitations.json new file mode 100644 index 000000000..221990e63 --- /dev/null +++ b/localization/v2.5.x/site/ru/about/limitations.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Limits","anchorList":[{"label":"Пределы Milvus","href":"Milvus-Limits","type":1,"isActive":false},{"label":"Длина имени ресурса","href":"Length-of-a-resource-name","type":2,"isActive":false},{"label":"Правила именования","href":"Naming-rules","type":2,"isActive":false},{"label":"Количество ресурсов","href":"Number-of-resources","type":2,"isActive":false},{"label":"Количество ресурсов в коллекции","href":"Number-of-resources-in-a-collection","type":2,"isActive":false},{"label":"Длина строки","href":"Length-of-a-string","type":2,"isActive":false},{"label":"Размеры вектора","href":"Dimensions-of-a-vector","type":2,"isActive":false},{"label":"Ввод и вывод для RPC","href":"Input-and-Output-per-RPC","type":2,"isActive":false},{"label":"Ограничения на загрузку","href":"Load-limits","type":2,"isActive":false},{"label":"Ограничения на поиск","href":"Search-limits","type":2,"isActive":false},{"label":"Ограничения индексов для различных типов поиска","href":"Index-limits-on-different-search-types","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/about/limitations.md b/localization/v2.5.x/site/ru/about/limitations.md new file mode 100644 index 000000000..ee8e43a0b --- /dev/null +++ b/localization/v2.5.x/site/ru/about/limitations.md @@ -0,0 +1,260 @@ +--- +id: limitations.md +title: Пределы Milvus +related_key: Limitations +summary: Узнайте об ограничениях при использовании Milvus. +--- +

    Пределы Milvus

    Milvus стремится предоставить лучшие векторные базы данных для работы приложений искусственного интеллекта и поиска векторного сходства. Однако команда постоянно работает над тем, чтобы добавить больше функций и лучших утилит для улучшения работы пользователей. На этой странице перечислены некоторые известные ограничения, с которыми пользователи могут столкнуться при использовании Milvus.

    +

    Длина имени ресурса

    + + + + + + + + + +
    РесурсОграничение
    Коллекция255 символов
    Поле255 символов
    Индекс255 символов
    Раздел255 символов
    +

    Правила именования

    Имя ресурса может содержать цифры, буквы и символы подчеркивания (_). Имя ресурса должно начинаться с буквы или символа подчеркивания (_).

    +

    Количество ресурсов

    + + + + + + + +
    РесурсЛимит
    Коллекция65,536
    Подключение / прокси65,536
    +

    Количество ресурсов в коллекции

    + + + + + + + + + + +
    РесурсЛимит
    Раздел1,024
    Осколок16
    Поле64
    Индекс1
    Сущностьнеограниченно
    +

    Длина строки

    + + + + + + +
    Тип данныхОграничение
    VARCHAR65,535
    +

    Размеры вектора

    + + + + + + +
    СвойствоLimit
    Размерность32,768
    +

    Ввод и вывод для RPC

    + + + + + + + + +
    ОперацияПредел
    Вставка64 МБ
    Поиск64 МБ
    Запрос64 МБ
    +

    Ограничения на загрузку

    В текущей версии загружаемые данные должны составлять менее 90% от общего объема памяти всех узлов запроса, чтобы зарезервировать ресурсы памяти для механизма выполнения.

    +

    Ограничения на поиск

    + + + + + + + +
    ВекторыОграничение
    topk (количество возвращаемых наиболее похожих результатов)16,384
    nq (количество поисковых запросов)16,384
    +

    Ограничения индексов для различных типов поиска

    В следующей таблице представлен обзор поддержки различных моделей поиска в индексах разных типов.

    + + + + + + + + + + + + + + + + + +
    HNSWDISKANNFLATIVF_FLATIVF_SQ8IVF_PQSCANNGPU_IFV_FLATGPU_IVF_PQGPU_CAGRAGPU_BRUTE_FORCEРАЗРЕЖЕННЫЙ_ИНВЕРТИРОВАННЫЙ_ИНДЕКСSPARSE_WANDBIN_FLATBIN_IVF_FLAT
    Основной поискДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Поиск разделовДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Базовый поиск с получением исходных данныхДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Базовый поиск с пагинациейДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Фильтрованный поискДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Поиск по диапазонуДаДаДаДаДаДаДаНетНетНетНетНетНетДаДа
    Поиск по группамДаНетДаДаНетНетНетНетНетНетНетНетНетНетНет
    Поиск с помощью итератораДаДаДаДаДаДаДаНетНетНетНетНетНетНетНет
    Гибридный поискДаДаДаДаДаДаДаДаДаДаДаДа (только RRFRanker)Да (только RRFRanker)ДаДа
    Запрос/получениеДаДаДаДаДаДаДаДаДаДаДаДаДаДаДа
    Запрос с итераторомДаДаДаДаДаДаДаНетНетНетНетДаДаДаДа
    diff --git a/localization/v2.5.x/site/ru/about/milvus_adopters.json b/localization/v2.5.x/site/ru/about/milvus_adopters.json new file mode 100644 index 000000000..13308c93e --- /dev/null +++ b/localization/v2.5.x/site/ru/about/milvus_adopters.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Adopters","anchorList":[{"label":"Приверженцы Milvus","href":"Milvus-Adopters","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/about/milvus_adopters.md b/localization/v2.5.x/site/ru/about/milvus_adopters.md new file mode 100644 index 000000000..07b83bd14 --- /dev/null +++ b/localization/v2.5.x/site/ru/about/milvus_adopters.md @@ -0,0 +1,27 @@ +--- +id: milvus_adopters.md +title: Приверженцы Milvus +related_key: Milvus adopters +summary: 'Узнайте о компаниях, которые используют Milvus в производственных приложениях.' +--- +

    Приверженцы Milvus

    Milvus является ведущей векторной базой данных среди корпоративных пользователей, ее одобрили такие известные компании, как Nvidia, Roblox, AT&T и другие. Ниже приведен список предприятий, которые успешно интегрировали Milvus в свои приложения.

    +

    + + Milvus Adopters + Приверженцы Milvus

    +

    Посетите нашу страницу с примерами использования Milvus, чтобы узнать, как лидеры отрасли используют Milvus для повышения мощности своих приложений искусственного интеллекта и ускорения роста бизнеса.

    diff --git a/localization/v2.5.x/site/ru/about/overview.json b/localization/v2.5.x/site/ru/about/overview.json new file mode 100644 index 000000000..04dc1354e --- /dev/null +++ b/localization/v2.5.x/site/ru/about/overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"What is Milvus?","anchorList":[{"label":"Что такое Milvus?","href":"What-is-Milvus","type":1,"isActive":false},{"label":"Неструктурированные данные, эмбеддинги и Milvus","href":"Unstructured-Data-Embeddings-and-Milvus","type":2,"isActive":false},{"label":"Что делает Milvus таким быстрым?","href":"What-Makes-Milvus-so-Fast","type":2,"isActive":false},{"label":"Что делает Milvus таким масштабируемым","href":"What-Makes-Milvus-so-Scalable","type":2,"isActive":false},{"label":"Типы поиска, поддерживаемые Milvus","href":"Types-of-Searches-Supported-by-Milvus","type":2,"isActive":false},{"label":"Широкий набор функций","href":"Comprehensive-Feature-Set","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/about/overview.md b/localization/v2.5.x/site/ru/about/overview.md new file mode 100644 index 000000000..a746d955f --- /dev/null +++ b/localization/v2.5.x/site/ru/about/overview.md @@ -0,0 +1,179 @@ +--- +id: overview.md +title: Что такое Милвус +related_key: Milvus Overview +summary: >- + Milvus - это высокопроизводительная и масштабируемая векторная база данных, + которая эффективно работает в самых разных средах, от ноутбука до + крупномасштабных распределенных систем. Она доступна как в виде программного + обеспечения с открытым исходным кодом, так и в виде облачного сервиса. +--- +

    Что такое Milvus?

    Milvus - это высокопроизводительная и масштабируемая векторная база данных, которая эффективно работает в самых разных средах, от ноутбука до крупномасштабных распределенных систем. Она доступна как в виде программного обеспечения с открытым исходным кодом, так и в виде облачного сервиса.

    +

    Milvus - это проект с открытым исходным кодом в рамках LF AI & Data Foundation, распространяемый под лицензией Apache 2.0. Большинство участников проекта - эксперты из сообщества высокопроизводительных вычислений (HPC), специализирующиеся на создании крупномасштабных систем и оптимизации кода с учетом аппаратного обеспечения. Среди основных участников - специалисты из Zilliz, ARM, NVIDIA, AMD, Intel, Meta, IBM, Salesforce, Alibaba и Microsoft.

    +

    Неструктурированные данные, эмбеддинги и Milvus

    Неструктурированные данные, такие как текст, изображения и аудио, различаются по формату и несут в себе богатую семантику, что делает их сложными для анализа. Чтобы справиться с этой сложностью, используются эмбеддинги, преобразующие неструктурированные данные в числовые векторы, отражающие их основные характеристики. Затем эти векторы хранятся в векторной базе данных, обеспечивая быстрый и масштабируемый поиск и анализ.

    +

    Milvus предлагает надежные возможности моделирования данных, позволяющие организовать неструктурированные или мультимодальные данные в структурированные коллекции. Он поддерживает широкий спектр типов данных для моделирования различных атрибутов, включая распространенные числовые и символьные типы, различные векторные типы, массивы, наборы и JSON, избавляя вас от необходимости поддерживать несколько систем баз данных.

    +

    + + Untructured data, embeddings, and Milvus + Неструктурированные данные, вкрапления и Milvus

    +

    Milvus предлагает три режима развертывания, охватывающие широкий диапазон масштабов данных - от локального прототипирования в Jupyter Notebooks до массивных кластеров Kubernetes, управляющих десятками миллиардов векторов:

    +
      +
    • Milvus Lite - это библиотека на языке Python, которая может быть легко интегрирована в ваши приложения. Являясь облегченной версией Milvus, она идеально подходит для быстрого создания прототипов в Jupyter Notebooks или для работы на устройствах с ограниченными ресурсами. Узнайте больше.
    • +
    • Milvus Standalone - это серверное развертывание на одной машине, все компоненты которого собраны в единый образ Docker для удобного развертывания. Узнайте больше.
    • +
    • Milvus Distributed может быть развернут на кластерах Kubernetes. Это облачная нативная архитектура, предназначенная для миллиардных и даже более масштабных сценариев. Эта архитектура обеспечивает избыточность критически важных компонентов. Узнайте больше.
    • +
    +

    Что делает Milvus таким быстрым?

    Milvus с самого начала разрабатывалась как высокоэффективная система векторных баз данных. В большинстве случаев Milvus превосходит другие векторные базы данных в 2-5 раз (см. результаты VectorDBBench). Такая высокая производительность является результатом нескольких ключевых конструкторских решений:

    +

    Оптимизация с учетом аппаратного обеспечения: Чтобы Milvus мог работать в различных аппаратных средах, мы оптимизировали его производительность специально для многих аппаратных архитектур и платформ, включая AVX512, SIMD, GPU и NVMe SSD.

    +

    Передовые алгоритмы поиска: Milvus поддерживает широкий спектр алгоритмов индексации/поиска в памяти и на диске, включая IVF, HNSW, DiskANN и другие, и все они были глубоко оптимизированы. По сравнению с такими популярными реализациями, как FAISS и HNSWLib, Milvus обеспечивает производительность на 30-70 % выше.

    +

    Поисковая система на C++: Более 80 % производительности векторной базы данных определяется ее поисковой системой. Milvus использует C++ для этого критически важного компонента благодаря высокой производительности, низкоуровневой оптимизации и эффективному управлению ресурсами. Что особенно важно, Milvus интегрирует многочисленные оптимизации кода с учетом аппаратного обеспечения, начиная с векторизации на уровне ассемблера и заканчивая многопоточным распараллеливанием и планированием, чтобы полностью использовать возможности оборудования.

    +

    Ориентированность на столбцы: Milvus - это векторная система баз данных, ориентированная на столбцы. Основные преимущества заключаются в шаблонах доступа к данным. При выполнении запросов база данных, ориентированная на столбцы, считывает только конкретные поля, участвующие в запросе, а не целые строки, что значительно сокращает объем обрабатываемых данных. Кроме того, операции над данными в столбцах могут быть легко векторизованы, что позволяет применять операции сразу ко всем столбцам, что еще больше повышает производительность.

    +

    Что делает Milvus таким масштабируемым

    В 2022 году Milvus поддерживал миллиардные векторы, а в 2023 году - десятки миллиардов с неизменной стабильностью, обеспечивая работу масштабных сценариев для более чем 300 крупных предприятий, включая Salesforce, PayPal, Shopee, Airbnb, eBay, NVIDIA, IBM, AT&T, LINE, ROBLOX, Inflection и др.

    +

    Облачная нативная архитектура Milvus с высокой степенью развязки обеспечивает непрерывное расширение системы по мере роста данных:

    +

    + + Highly decoupled system architecture of Milvus + Архитектура системы Milvus с высокой степенью разделения

    +

    Сама система Milvus полностью статична, поэтому ее можно легко масштабировать с помощью Kubernetes или публичных облаков. Кроме того, компоненты Milvus хорошо развязаны, а три наиболее важные задачи - поиск, вставка данных и индексирование/уплотнение - спроектированы как легко распараллеливаемые процессы с разделенной сложной логикой. Это гарантирует, что соответствующий узел запроса, узел данных и узел индекса могут масштабироваться как вверх, так и вниз независимо друг от друга, оптимизируя производительность и экономическую эффективность.

    +

    Типы поиска, поддерживаемые Milvus

    Milvus поддерживает различные типы поисковых функций для удовлетворения требований различных сценариев использования:

    +
      +
    • ANN Search: Находит K векторов, наиболее близких к вектору вашего запроса.
    • +
    • Фильтрующий поиск: Выполняет ANN-поиск при заданных условиях фильтрации.
    • +
    • Поиск в диапазоне: Находит векторы в заданном радиусе от вектора запроса.
    • +
    • Гибридный поиск: Проводит ANN-поиск на основе нескольких векторных полей.
    • +
    • Полнотекстовый поиск: Полнотекстовый поиск на основе BM25.
    • +
    • Реранжирование: Корректирует порядок результатов поиска на основе дополнительных критериев или вторичного алгоритма, уточняя первоначальные результаты ANN-поиска.
    • +
    • Fetch (поиск): Получение данных по их первичным ключам.
    • +
    • Запрос: Получение данных с помощью определенных выражений.
    • +
    +

    Широкий набор функций

    В дополнение к ключевым функциям поиска, упомянутым выше, Milvus также предоставляет набор функций, реализованных вокруг ANN-поиска, чтобы вы могли полностью использовать его возможности.

    +

    API и SDK

      +
    • RESTful API (официальный)
    • +
    • PyMilvus (Python SDK) (официальный)
    • +
    • Go SDK (официальный)
    • +
    • Java SDK (официальный)
    • +
    • Node.js (JavaScript) SDK (официальный)
    • +
    • C# (предоставлен компанией Microsoft)
    • +
    +

    Расширенные типы данных

    Помимо примитивных типов данных, Milvus поддерживает различные расширенные типы данных и соответствующие им метрики расстояния.

    + +

    Ускорение

      +
    • Алгоритмы поиска Milvus поддерживает набор настраиваемых алгоритмов индексирования и поиска. Подробнее см. в разделах Индекс в памяти, Индекс на диске и Индекс на GPU.

    • +
    • Разделы и ключи разделов Разделы - это подразделы коллекции Milvus. Для повышения производительности поиска можно выбрать скалярное поле в качестве ключа раздела. Подробнее см. в разделах Управление разделами и Использование ключа раздела.

    • +
    • Настраиваемая модель согласованности Согласованность обеспечивает одинаковое представление данных на каждом узле или реплике Milvus при записи или чтении данных в определенный момент времени. Вы можете легко настроить уровень согласованности при выполнении поиска ANN в Milvus. Подробнее см. в разделе Согласованность.

    • +
    • Импорт данных с высокой производительностью Чтобы импортировать в Milvus большой объем данных вместо того, чтобы вставлять их один за другим, воспользуйтесь нашими инструментами импорта данных с высокой производительностью. Подробности см. в разделах Подготовка исходных данных и Импорт данных.

    • +
    • Поддержка многопользовательской работы В Milvus реализовано множество функций, ориентированных на сценарии многопользовательской работы, включая Partition Key, Clustering Key и другие. Подробнее см. в разделе Стратегии многопользовательской работы.

    • +
    +

    Безопасность и авторизация

      +
    • Настраиваемая модель согласованности Согласованность обеспечивает одинаковое представление данных на каждом узле или реплике Milvus при записи или чтении данных в определенный момент времени. Вы можете легко настроить уровень согласованности при выполнении поиска ANN в Milvus. Подробнее см. в разделе Согласованность.

    • +
    • Изоляция данных и контроль ресурсов Для сценариев с несколькими арендаторами изоляция данных является основным требованием безопасности. В Milvus реализовано несколько функций для решения ваших проблем с безопасностью. Подробнее см. в разделе Управление группами ресурсов и уплотнение кластеризации.

    • +
    +

    Интеграции искусственного интеллекта

      +
    • Интеграции моделей встраивания Модели встраивания преобразуют неструктурированные данные в их числовое представление в высокоразмерном пространстве данных, чтобы вы могли хранить их в Milvus. В настоящее время PyMilvus, SDK для Python, интегрирует несколько моделей встраивания, чтобы вы могли быстро подготовить свои данные к векторным встраиваниям. Подробнее см. в разделе Обзор встраивания.

    • +
    • Интеграция моделей реранжирования В сфере информационного поиска и генеративного ИИ реранжировщик является важным инструментом, который оптимизирует порядок результатов первоначального поиска. PyMilvus также интегрирует несколько моделей реранкинга для оптимизации порядка результатов, возвращаемых при первоначальном поиске. Подробнее см. в разделе Обзор реранкеров.

    • +
    • LangChain и другие интеграции с инструментами искусственного интеллекта В эпоху GenAI такие инструменты, как LangChain, привлекают большое внимание разработчиков приложений. Как основной компонент, Milvus обычно служит хранилищем векторов в таких инструментах. Чтобы узнать, как интегрировать Milvus в ваши любимые инструменты искусственного интеллекта, обратитесь к нашим разделам "Интеграции" и "Учебники".

    • +
    +

    Инструменты и экосистема

      +
    • Attu Attu - это универсальный интуитивно понятный графический интерфейс, который поможет вам управлять Milvus и данными, которые он хранит. Подробности см. в репозитории Attu.

    • +
    • Birdwatcher Birdwatcher - это отладочный инструмент для Milvus. Используя его для подключения к etcd, вы можете проверять состояние системы Milvus или настраивать ее на лету. Для получения подробной информации обратитесь к разделу BirdWatcher.

    • +
    • Интеграции Promethus и Grafana Prometheus - это набор инструментов для мониторинга и оповещения систем Kubernetes с открытым исходным кодом. Grafana - это стек визуализации с открытым исходным кодом, который может подключаться ко всем источникам данных. Вы можете использовать Promethus и Grafana в качестве поставщика услуг мониторинга для визуального контроля производительности распределенного Milvus. Подробнее см. в разделе Развертывание служб мониторинга.

    • +
    • Milvus Backup Milvus Backup - это инструмент, позволяющий пользователям создавать резервные копии и восстанавливать данные Milvus. Он предоставляет как CLI, так и API, чтобы вписаться в различные сценарии применения. Более подробную информацию см. в разделе Milvus Backup.

    • +
    • Milvus Capture Data Change (CDC) Milvus-CDC может захватывать и синхронизировать инкрементные данные в экземплярах Milvus и обеспечивает надежность бизнес-данных, беспрепятственно перенося их между исходным и целевым экземплярами, что позволяет легко выполнять инкрементное резервное копирование и аварийное восстановление. Подробную информацию см. в разделе Milvus CDC.

    • +
    • Коннекторы Milvus Компания Milvus разработала набор коннекторов для беспрепятственной интеграции Milvus со сторонними инструментами, такими как Apache Spark. В настоящее время вы можете использовать наш коннектор Spark для передачи данных Milvus в Apache Spark для машинного обучения. Подробности см. в разделе Spark-Milvus Connector.

    • +
    • Vector Transmission Services (VTS) Milvus предоставляет набор инструментов для передачи данных между экземпляром Milvus и множеством источников данных, включая кластеры Zilliz, Elasticsearch, Postgres (PgVector) и другой экземпляр Milvus. Подробнее см. в разделе Миграции.

    • +
    diff --git a/localization/v2.5.x/site/ru/about/roadmap.json b/localization/v2.5.x/site/ru/about/roadmap.json new file mode 100644 index 000000000..5db161372 --- /dev/null +++ b/localization/v2.5.x/site/ru/about/roadmap.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Roadmap","anchorList":[{"label":"Дорожная карта Milvus","href":"Milvus-Roadmap","type":1,"isActive":false},{"label":"Дорожная карта","href":"Roadmap","type":2,"isActive":false},{"label":"Как внести свой вклад","href":"How-to-contribute","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/about/roadmap.md b/localization/v2.5.x/site/ru/about/roadmap.md new file mode 100644 index 000000000..ea52c4f07 --- /dev/null +++ b/localization/v2.5.x/site/ru/about/roadmap.md @@ -0,0 +1,110 @@ +--- +id: roadmap.md +title: Дорожная карта Milvus +related_key: Milvus roadmap +summary: >- + Milvus - это векторная база данных с открытым исходным кодом, созданная для + работы приложений искусственного интеллекта. Вот наша дорожная карта, по + которой мы будем развиваться. +--- +

    Дорожная карта Milvus

    Добро пожаловать в дорожную карту Milvus! Присоединяйтесь к нам в нашем непрерывном путешествии по улучшению и развитию Milvus. Мы рады поделиться с вами нашими достижениями, планами на будущее и видением того, что ждет нас впереди. Наша дорожная карта - это не просто список предстоящих функций, она отражает нашу приверженность инновациям и стремление работать с сообществом. Мы приглашаем вас ознакомиться с нашей дорожной картой, оставить свой отзыв и помочь сформировать будущее Milvus!

    +

    Дорожная карта

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    КатегорияMilvus 2.5.0 (достигнуто в последних выпусках)Следующий релиз (середина CY25)Будущая дорожная карта (в течение 1 года)
    Обработка неструктурированных данных на основе ИИ
    Расширение возможностей обработки и анализа неструктурированных данных с использованием моделей ИИ и передовых технологий.
    Полнотекстовый поиск
    Поддержка полнотекстового поиска с помощью Sparse-BM25. Новый API принимает текст на вход и автоматически генерирует разреженный вектор внутри Milvus

    Sparse Vector(GA)
    Поддержка эффективного метода хранения и индексации разреженного вектора.
    Ввод и вывод данных
    Поддержка основных модельных сервисов для ввода исходных данных

    Расширенный реранкер
    Поддержка реранкеров на основе модели и пользовательской функции оценки

    Улучшение JSON
    Индексация и парсинг JSON для ускорения обработки.
    Ввод и вывод исходных данных
    Поддержка Blob и url ссылок для обработки исходных данных

    Поддержка большего количества типов данных
    например, Datetime, Map, GIS

    Поддержка тензоров
    Поддержка списка векторов, типичных для использования, таких как Colbert, Copali и т.д.
    Качество и производительность поиска
    Предоставление точных, релевантных и быстрых результатов за счет оптимизации архитектуры, алгоритмов и API.
    Функция сопоставления текста
    Быстрая фильтрация ключевых слов/токенов в тексте/varchar

    Улучшение поиска по группам
    Внедрение group_size и добавление поддержки group by в гибридном поиске

    Растровый индекс и инвертированный индекс
    Ускорение фильтрации по тегам.
    Advanced Match
    Например, Match Phrase, Fuzzy Match и другие токенизаторы

    Агрегации
    Скалярные агрегации полей, например, min, max, count, distinct.
    Частичное обновление
    Поддержка обновления значения конкретного поля

    Возможность сортировки
    Сортировка по скалярным полям во время выполнения

    Поддержка кластеризации данных
    Совместное расположение данных.
    Богатый функционал и управление
    Удобные для разработчиков и надежные функции управления данными
    Поддержка CSV файлов при импорте данных
    Bulkinsert поддерживает формат CSV

    Поддержка Null и Default Value
    Типы Nullи Default упрощают импорт данных из других СУБД

    Milvus WebUI (Beta)
    Визуальные инструменты управления для DBA.
    Дедупликация первичных ключей
    С помощью глобального индекса pk

    Изменение схемы в режиме онлайн
    Например, добавление/удаление поля, изменение длины varchar

    Версионирование и восстановление данных
    Поддержка версионирования данных по снимкам.
    Rust и C++ SDK
    Поддержка большего числа клиентов

    Поддержка UDF
    Определяемая пользователем функция
    Экономическая эффективность и ахитектура
    Современные системы, приоритет стабильности, экономичности и масштабируемости.
    Загрузка по полю
    Выбор части коллекции для загрузки

    Оптимизация памяти
    Снижение OOM и повышение нагрузки

    Потоковый узел (Beta)
    Обеспечение глобальной согласованности и решение проблемы узкого места в производительности корневого координатора

    Формат хранения V2 (Beta)
    Универсальный дизайн форматов и основа для доступа к данным на основе диска

    Кластеризация уплотнения
    Перераспределение данных на основе конфигурации для ускорения чтения.
    Ленивая загрузка
    Загрузка может быть инициирована первой операцией чтения без явного вызова load()

    Многоуровневоехранение
    Поддержка горячего и холодного хранения для оптимизации затрат

    Освобождение по полям
    Освобождение части коллекции для сокращения использования памяти

    Потоковый узел (GA)
    Обработка потоковых данных и упрощение архитектуры.
    Устранение зависимостей
    Уменьшение или устранение зависимостей от внешних компонентов, таких как pulsar, etcd

    Слияние логики коорд в MixCoord
    Упрощение архитектуры
    +
      +
    • Наша дорожная карта обычно состоит из трех частей: самый последний релиз, следующий предстоящий релиз и среднесрочная и долгосрочная перспектива на ближайший год.
    • +
    • По мере продвижения мы постоянно учимся и время от времени корректируем наш фокус, добавляя или убирая элементы по мере необходимости.
    • +
    • Эти планы являются ориентировочными и могут меняться в зависимости от подписки на услуги.
    • +
    • Мы неуклонно придерживаемся нашей дорожной карты, а наши заметки о релизах служат в качестве справочного материала.
    • +
    +

    Как внести свой вклад

    Будучи проектом с открытым исходным кодом, Milvus процветает благодаря вкладу сообщества. Вот как вы можете стать частью нашего пути.

    +

    Поделиться отзывами

      +
    • Сообщайте о проблемах: Столкнулись с ошибкой или у вас есть предложение? Откройте проблему на нашей странице GitHub.

    • +
    • Предложения по функциям: У вас есть идеи по поводу новых функций или улучшений? Мы будем рады их услышать!

    • +
    +

    Вклад в код

      +
    • Pull requests: Вносите свой вклад непосредственно в нашу кодовую базу. Будь то исправление ошибок, добавление функций или улучшение документации - ваш вклад приветствуется.

    • +
    • Руководство по разработке: Ознакомьтесь с нашим руководством для разработчиков, чтобы узнать о правилах внесения вклада в код.

    • +
    +

    Распространяйте информацию

      +
    • Социальный обмен: Любите Milvus? Поделитесь своими примерами использования и опытом в социальных сетях и технических блогах.

    • +
    • Отметьте нас на GitHub: Выразите свою поддержку, отметив звездой наш репозиторий на GitHub.

    • +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/allocate.json b/localization/v2.5.x/site/ru/adminGuide/allocate.json new file mode 100644 index 000000000..c5be1b6cd --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/allocate.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi\n","helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi\n","dataNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\nqueryNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\n","helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml\n"],"headingContent":"Allocate Resources on Kubernetes","anchorList":[{"label":"Распределение ресурсов на Kubernetes","href":"Allocate-Resources-on-Kubernetes","type":1,"isActive":false},{"label":"1. Просмотр доступных ресурсов","href":"1-View-available-resources","type":2,"isActive":false},{"label":"2. Распределить ресурсы","href":"2-Allocate-resources","type":2,"isActive":false},{"label":"3. Применить конфигурации","href":"3-Apply-configurations","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/allocate.md b/localization/v2.5.x/site/ru/adminGuide/allocate.md new file mode 100644 index 000000000..bf1b2a561 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/allocate.md @@ -0,0 +1,141 @@ +--- +id: allocate.md +title: Выделение ресурсов для Milvus на Kubernetes +summary: 'Узнайте, как выделять ресурсы для Milvus на Kubernetes.' +--- +

    Распределение ресурсов на Kubernetes

    В этой теме описывается, как выделять ресурсы для кластера Milvus в Kubernetes.

    +

    Как правило, ресурсы, которые вы выделяете кластеру Milvus в производстве, должны быть пропорциональны рабочей нагрузке машины. При выделении ресурсов следует также учитывать тип машины. Хотя конфигурацию можно обновить во время работы кластера, мы рекомендуем установить значения перед развертыванием кластера.

    +
    +

    Информацию о том, как распределять ресурсы с помощью Milvus Operator, см. в разделе Распределение ресурсов с помощью Milvus Operator.

    +
    +

    1. Просмотр доступных ресурсов

    Запустите kubectl describe nodes, чтобы просмотреть доступные ресурсы на экземплярах, которые вы выделили.

    +

    2. Распределить ресурсы

    Используйте Helm для выделения ресурсов процессора и памяти компонентам Milvus.

    +
    +Использование Helm для обновления ресурсов приведет к тому, что запущенные капсулы будут выполнять скользящее обновление.
    +

    Существует два способа выделения ресурсов:

    + +

    Распределение ресурсов с помощью команд

    Вам необходимо установить переменные ресурсов для каждого компонента Milvus, если вы используете --set для обновления конфигураций ресурсов.

    + +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi
    +
    +
    +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi
    +
    +
    +

    Распределение ресурсов с помощью конфигурационного файла

    Вы также можете распределить ресурсы процессора и памяти, указав параметры resources.requests и resources.limits в файле resources.yaml.

    +
    dataNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +queryNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +
    +

    3. Применить конфигурации

    Выполните следующую команду, чтобы применить новые конфигурации к кластеру Milvus.

    +
    helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml
    +
    +
    +Если параметр resources.limits не указан, поды будут потреблять все доступные ресурсы процессора и памяти. Поэтому убедитесь, что указаны resources.requests и resources.limits, чтобы избежать перераспределения ресурсов, когда другие задачи, выполняющиеся на том же экземпляре, требуют большего потребления памяти.
    +

    Дополнительные сведения об управлении ресурсами см. в документации Kubernetes.

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/authenticate.json b/localization/v2.5.x/site/ru/adminGuide/authenticate.json new file mode 100644 index 000000000..24e7a5356 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/authenticate.json @@ -0,0 +1 @@ +{"codeList":["...\ncommon:\n...\n security:\n authorizationEnabled: true\n...\n","...\nextraConfigFiles:\n user.yaml: |+\n common:\n security:\n authorizationEnabled: true\n...\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n common:\n security:\n authorizationEnabled: true\n","# use default `root` user to connect to Milvus\n\nfrom pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri='http://localhost:19530', # replace with your own Milvus server address\n token=\"root:Milvus\"\n) \n","# create a user\nclient.create_user(\n user_name=\"user_1\",\n password=\"P@ssw0rd\",\n)\n\n# verify the user has been created\n\nclient.describe_user(\"user_1\")\n\n# output\n# {'user_name': 'user_1', 'roles': ()}\n","# connect to milvus with the newly created user\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"user_1:P@ssw0rd\"\n)\n","# update password\n\nclient.update_password(\n user_name=\"user_1\",\n old_password=\"P@ssw0rd\",\n new_password=\"P@ssw0rd123\"\n)\n","common:\n security:\n superUsers: root, foo\n","client.drop_user(user_name=\"user_1\")\n","# list all users\n\nclient.list_users()\n"],"headingContent":"Authenticate User Access","anchorList":[{"label":"Аутентификация доступа пользователей","href":"Authenticate-User-Access","type":1,"isActive":false},{"label":"Включение аутентификации пользователей","href":"Enable-user-authentication","type":2,"isActive":false},{"label":"Подключение к Milvus с помощью аутентификации","href":"Connect-to-Milvus-with-authentication","type":2,"isActive":false},{"label":"Создайте нового пользователя","href":"Create-a-new-user","type":2,"isActive":false},{"label":"Подключение к Milvus с новым пользователем","href":"Connect-to-Milvus-with-a-new-user","type":2,"isActive":false},{"label":"Обновить пароль пользователя","href":"Update-user-password","type":2,"isActive":false},{"label":"Удаление пользователя","href":"Drop-a-user","type":2,"isActive":false},{"label":"Список всех пользователей","href":"List-all-users","type":2,"isActive":false},{"label":"Ограничения","href":"Limitations","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/authenticate.md b/localization/v2.5.x/site/ru/adminGuide/authenticate.md new file mode 100644 index 000000000..8ff536459 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/authenticate.md @@ -0,0 +1,277 @@ +--- +id: authenticate.md +summary: 'Узнайте, как управлять аутентификацией пользователей в Milvus.' +title: Аутентификация доступа пользователей +--- +

    Аутентификация доступа пользователей

    В этом руководстве описано, как управлять аутентификацией пользователей в Milvus, включая включение аутентификации, подключение в качестве пользователя и изменение учетных данных пользователя.

    +
    +
      +
    • TLS и аутентификация пользователей - это два разных подхода к безопасности. Если в системе Milvus включена и аутентификация пользователя, и TLS, необходимо указать имя пользователя, пароль и путь к файлу сертификата. Информацию о том, как включить TLS, см. в разделе Шифрование при передаче.

    • +
    • Фрагменты кода на этой странице используют новый MilvusClient (Python) для взаимодействия с Milvus. Новые SDK MilvusClient для других языков будут выпущены в будущих обновлениях.

    • +
    +
    +

    Включение аутентификации пользователей

    +
    +

    Чтобы включить аутентификацию пользователей для вашего сервера Milvus, установите значение common.security.authorizationEnabled в true в файле конфигурации Milvus milvus.yaml. Дополнительные сведения о конфигурациях см. в разделе Настройка Milvus с помощью Docker Compose.

    +
    ...
    +common:
    +...
    +  security:
    +    authorizationEnabled: true
    +...
    +
    +
    +
    +

    Чтобы включить аутентификацию пользователей для сервера Milvus, установите значение authorizationEnabled в true в файле конфигурации Milvus values.yaml. Дополнительные сведения о конфигурациях см. в разделе Настройка Milvus с помощью Helm Charts.

    +
    ...
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        authorizationEnabled: true
    +...
    +
    +
    +
    +

    Чтобы включить аутентификацию, установите spec.common.security.authorizationEnabled на true в Milvus CRD. Дополнительные сведения о Milvus CRD см. в разделе Настройка Milvus с помощью Milvus Operator.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  config:
    +    common:
    +      security:
    +        authorizationEnabled: true
    +
    +
    +

    Подключение к Milvus с помощью аутентификации

    После включения аутентификации вам нужно подключиться к Milvus, используя имя пользователя и пароль. По умолчанию при запуске Milvus создается пользователь root с паролем Milvus. Ниже приведен пример подключения к Milvus с включенной аутентификацией с использованием пользователя по умолчанию root:

    +
    # use default `root` user to connect to Milvus
    +
    +from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri='http://localhost:19530', # replace with your own Milvus server address
    +    token="root:Milvus"
    +) 
    +
    +
    +Если при подключении к Milvus с включенной аутентификацией вы не предоставите действительный токен, вы получите ошибку gRPC.
    +

    Создайте нового пользователя

    После подключения в качестве пользователя по умолчанию root вы можете создать и аутентифицировать нового пользователя следующим образом:

    +
    # create a user
    +client.create_user(
    +    user_name="user_1",
    +    password="P@ssw0rd",
    +)
    +
    +# verify the user has been created
    +
    +client.describe_user("user_1")
    +
    +# output
    +# {'user_name': 'user_1', 'roles': ()}
    +
    +

    Для получения дополнительной информации о создании пользователей см. create_user().

    +

    Подключение к Milvus с новым пользователем

    Подключитесь, используя учетные данные только что созданного пользователя:

    +
    # connect to milvus with the newly created user
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="user_1:P@ssw0rd"
    +)
    +
    +

    Обновить пароль пользователя

    Измените пароль существующего пользователя с помощью следующего кода:

    +
    # update password
    +
    +client.update_password(
    +    user_name="user_1",
    +    old_password="P@ssw0rd",
    +    new_password="P@ssw0rd123"
    +)
    +
    +

    Дополнительные сведения об обновлении паролей пользователей см. в функции update_password().

    +

    Если вы забыли старый пароль, Milvus предоставляет элемент конфигурации, который позволяет назначить определенных пользователей суперпользователями. Это избавит вас от необходимости вводить старый пароль при восстановлении пароля.

    +

    По умолчанию поле common.security.superUsers в конфигурационном файле Milvus пустое, что означает, что все пользователи должны указывать старый пароль при сбросе пароля. Однако вы можете назначить определенных пользователей суперпользователями, которым не нужно указывать старый пароль. В приведенном ниже фрагменте root и foo обозначены как суперпользователи.

    +

    Вы должны добавить приведенный ниже элемент конфигурации в файл конфигурации Milvus, который управляет работой вашего экземпляра Milvus.

    +
    common:
    +    security:
    +        superUsers: root, foo
    +
    +

    Удаление пользователя

    Чтобы удалить пользователя, воспользуйтесь методом drop_user().

    +
    client.drop_user(user_name="user_1")
    +
    +
    +Чтобы сбросить пользователя, вы не должны быть пользователем, которого сбрасывают. В противном случае будет выдана ошибка.
    +

    Список всех пользователей

    Вывести список всех пользователей.

    +
    # list all users
    +
    +client.list_users()
    +
    +

    Ограничения

      +
    1. Имя пользователя не должно быть пустым и не должно превышать 32 символов. Оно должно начинаться с буквы и содержать только символы подчеркивания, буквы или цифры.
    2. +
    3. Пароль должен состоять не менее чем из 6 символов и не должен превышать 256 символов.
    4. +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/chunk_cache.json b/localization/v2.5.x/site/ru/adminGuide/chunk_cache.json new file mode 100644 index 000000000..3b1f17224 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/chunk_cache.json @@ -0,0 +1 @@ +{"codeList":["queryNode:\n cache:\n warmup: async\n"],"headingContent":"Configure Chunk Cache","anchorList":[{"label":"Настройка кэш-памяти","href":"Configure-Chunk-Cache","type":1,"isActive":false},{"label":"Справочная информация","href":"Background","type":2,"isActive":false},{"label":"Настройка кэш-памяти","href":"Configure-Chunk-Cache","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/chunk_cache.md b/localization/v2.5.x/site/ru/adminGuide/chunk_cache.md new file mode 100644 index 000000000..7120f7dec --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/chunk_cache.md @@ -0,0 +1,77 @@ +--- +id: chunk_cache.md +title: Настройка кэш-памяти +--- +

    Настройка кэш-памяти

    Механизм chunk cache позволяет Milvus предварительно загружать данные в кэш на локальном жестком диске узлов запроса до того, как они понадобятся. Этот механизм значительно повышает производительность поиска векторов за счет сокращения времени, необходимого для загрузки данных с диска в память.

    +

    Справочная информация

    Перед выполнением запросов для получения векторов Milvus необходимо загрузить данные из объектного хранилища в кэш-память на локальном жестком диске узлов запроса. Этот процесс занимает много времени. Пока все данные не загружены, Milvus может отвечать на некоторые запросы на получение векторов с задержкой.

    +

    Чтобы повысить производительность запросов, Milvus предоставляет механизм кэширования чанков для предварительной загрузки данных из объектного хранилища в кэш на локальном жестком диске до того, как они понадобятся. Когда поступает запрос, Segcore сначала проверяет, находятся ли данные в кэше, а не в объектном хранилище. Если данные находятся в кэше, Segcore может быстро извлечь их из кэша и вернуть результат клиенту.

    +

    Настройка кэша чанков

    В этом руководстве приведены инструкции по настройке механизма кэширования чанков для экземпляра Milvus. Конфигурация зависит от способа установки экземпляра Milvus.

    +
      +
    • Для экземпляров Milvus, установленных с помощью Helm Charts

      +

      Добавьте конфигурацию в файл values.yaml в разделе config. Подробнее см. в разделе Настройка Milvus с помощью Helm Charts.

    • +
    • Для экземпляров Milvus, установленных с помощью Docker Compose

      +

      Добавьте конфигурацию в файл milvus.yaml, который вы использовали для запуска экземпляра Milvus. Подробнее см. в разделе Настройка Milvus с помощью Docker Compose.

    • +
    • Для экземпляров Milvus, установленных с помощью Operator

      +

      Добавьте конфигурацию в раздел spec.components пользовательского ресурса Milvus. Подробнее см. в разделе Настройка Milvus с помощью Operator.

    • +
    +

    Параметры конфигурации

    queryNode:
    +    cache:
    +        warmup: async
    +
    +

    Параметр warmup определяет, будет ли Milvus предварительно загружать данные из хранилища объектов в кэш на локальном жестком диске узлов запросов до того, как они понадобятся. По умолчанию этот параметр принимает значение disable. Возможные варианты следующие:

    +
      +
    • async: Milvus предварительно загружает данные асинхронно в фоновом режиме, что не влияет на время, необходимое для загрузки коллекции. Тем не менее, пользователи могут испытывать задержку при получении векторов в течение короткого периода времени после завершения процесса загрузки. Эта опция используется по умолчанию.
    • +
    • sync: Milvus предварительно загружает данные синхронно, что может повлиять на время загрузки коллекции. Однако пользователи могут выполнять запросы сразу после завершения процесса загрузки без какой-либо задержки.
    • +
    • disable: Milvus не выполняет предварительную загрузку данных в кэш памяти.
    • +
    +

    Обратите внимание, что настройки кэша чанков также применяются при вставке новых данных в коллекции или перестройке индексов коллекций.

    +

    ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

      +
    • Как я могу определить, правильно ли работает механизм кэширования чанков?

      +

      Рекомендуется проверить задержку запроса на поиск или запрос после загрузки коллекции. Если задержка значительно выше ожидаемой (например, несколько секунд), это может указывать на то, что механизм кэширования чанков все еще работает.

      +

      Если задержка запроса остается высокой в течение длительного времени. Вы можете проверить пропускную способность хранилища объектов, чтобы убедиться, что кэш чанков все еще работает. В нормальных случаях работающий кэш будет генерировать высокую пропускную способность объектного хранилища. В качестве альтернативы можно просто попробовать кэш чанков в режиме sync.

    • +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.json b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.json new file mode 100644 index 000000000..ad994c941 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.json @@ -0,0 +1 @@ +{"codeList":["variable \"index_count\" {\n description = \"Amount of index instances to run\"\n type = number\n default = 5\n}\n","variable \"index_ec2_type\" {\n description = \"Which server type\"\n type = string\n default = \"c5.2xlarge\"\n}\n","variable \"key_name\" {\n description = \"Which aws key to use for access into instances, needs to be uploaded already\"\n type = string\n default = \"\"\n}\n\nvariable \"my_ip\" {\n description = \"my_ip for security group. used so that ansible and terraform can ssh in\"\n type = string\n default = \"x.x.x.x/32\"\n}\n","provider \"aws\" {\n profile = \"default\"\n region = \"us-east-2\"\n}\n","resource \"aws_security_group\" \"cluster_sg\" {\n name = \"cluster_sg\"\n description = \"Allows only me to access\"\n vpc_id = aws_vpc.cluster_vpc.id\n\n ingress {\n description = \"All ports from my IP\"\n from_port = 0\n to_port = 65535\n protocol = \"tcp\"\n cidr_blocks = [var.my_ip]\n }\n\n ingress {\n description = \"Full subnet communication\"\n from_port = 0\n to_port = 65535\n protocol = \"all\"\n self = true\n }\n\n egress {\n from_port = 0\n to_port = 0\n protocol = \"-1\"\n cidr_blocks = [\"0.0.0.0/0\"]\n ipv6_cidr_blocks = [\"::/0\"]\n }\n\n tags = {\n Name = \"cluster_sg\"\n }\n}\n","resource \"aws_vpc\" \"cluster_vpc\" {\n cidr_block = \"10.0.0.0/24\"\n tags = {\n Name = \"cluster_vpc\"\n }\n}\n\nresource \"aws_internet_gateway\" \"cluster_gateway\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n tags = {\n Name = \"cluster_gateway\"\n }\n}\n","resource \"aws_subnet\" \"cluster_subnet\" {\n vpc_id = aws_vpc.cluster_vpc.id\n cidr_block = \"10.0.0.0/24\"\n map_public_ip_on_launch = true\n\n tags = {\n Name = \"cluster_subnet\"\n }\n}\n\nresource \"aws_route_table\" \"cluster_subnet_gateway_route\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n route {\n cidr_block = \"0.0.0.0/0\"\n gateway_id = aws_internet_gateway.cluster_gateway.id\n }\n\n tags = {\n Name = \"cluster_subnet_gateway_route\"\n }\n}\n\nresource \"aws_route_table_association\" \"cluster_subnet_add_gateway\" {\n subnet_id = aws_subnet.cluster_subnet.id\n route_table_id = aws_route_table.cluster_subnet_gateway_route.id\n}\n\n","resource \"aws_instance\" \"minio_node\" {\n count = var.minio_count\n ami = \"ami-0d8d212151031f51c\"\n instance_type = var.minio_ec2_type\n key_name = var.key_name\n subnet_id = aws_subnet.cluster_subnet.id \n vpc_security_group_ids = [aws_security_group.cluster_sg.id]\n\n root_block_device {\n volume_type = \"gp2\"\n volume_size = 1000\n }\n \n tags = {\n Name = \"minio-${count.index + 1}\"\n }\n}\n","git clone https://github.com/milvus-io/milvus.git\n","$ cd ./milvus/deployments/docker/cluster-distributed-deployment\n","[dockernodes] #Add docker host names.\ndockernode01\ndockernode02\ndockernode03\n\n[admin] #Add Ansible controller name.\nansible-controller\n\n[coords] #Add the host names of Milvus coordinators.\n; Take note the IP of this host VM, and replace 10.170.0.17 with it.\ndockernode01\n\n[nodes] #Add the host names of Milvus nodes.\ndockernode02\n\n[dependencies] #Add the host names of Milvus dependencies.\n; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. \n; Take note the IP of this host VM, and replace 10.170.0.19 with it.\ndockernode03\n\n[docker:children]\ndockernodes\ncoords\nnodes\ndependencies\n\n[docker:vars]\nansible_python_interpreter= /usr/bin/python3\nStrictHostKeyChecking= no\n\n; Setup variables to control what type of network to use when creating containers.\ndependencies_network= host\nnodes_network= host\n\n; Setup varibale to control what version of Milvus image to use.\nimage= milvusdb/milvus-dev:master-20220412-4781db8a\n\n; Setup static IP addresses of the docker hosts as variable for container environment variable config.\n; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM\n; on which the etcd, minio, pulsar, coordinators will be hosted.\netcd_ip= 10.170.0.19\nminio_ip= 10.170.0.19\npulsar_ip= 10.170.0.19\ncoords_ip= 10.170.0.17\n\n; Setup container environment which later will be used in container creation.\nETCD_ENDPOINTS= {{etcd_ip}}:2379 \nMINIO_ADDRESS= {{minio_ip}}:9000\nPULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650\nQUERY_COORD_ADDRESS= {{coords_ip}}:19531\nDATA_COORD_ADDRESS= {{coords_ip}}:13333\nROOT_COORD_ADDRESS= {{coords_ip}}:53100\nINDEX_COORD_ADDRESS= {{coords_ip}}:31000\n","[defaults]\nhost_key_checking = False\ninventory = inventory.ini # Specify the Inventory file\nprivate_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host\n","---\n- name: setup pre-requisites # Install prerequisite\n hosts: all\n become: yes\n become_user: root\n roles:\n - install-modules\n - configure-hosts-file\n\n- name: install docker\n become: yes\n become_user: root\n hosts: dockernodes\n roles:\n - docker-installation\n","$ ansible all -m ping\n","dockernode01 | SUCCESS => {\n\"changed\": false,\n\"ping\": \"pong\"\n}\nansible-controller | SUCCESS => {\n \"ansible_facts\": {\n \"discovered_interpreter_python\": \"/usr/bin/python3\"\n },\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode03 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode02 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\n","$ ansible-playbook deploy-docker.yml --syntax-check\n","playbook: deploy-docker.yml\n","$ ansible-playbook deploy-docker.yml\n","TASK [docker-installation : Install Docker-CE] *******************************************************************\nok: [dockernode01]\nok: [dockernode03]\nok: [dockernode02]\n\nTASK [docker-installation : Install python3-docker] **************************************************************\nok: [dockernode01]\nok: [dockernode02]\nok: [dockernode03]\n\nTASK [docker-installation : Install docker-compose python3 library] **********************************************\nchanged: [dockernode01]\nchanged: [dockernode03]\nchanged: [dockernode02]\n\nPLAY RECAP *******************************************************************************************************\nansible-controller : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n","$ docker -v\n","$ sudo docker -v\n","Docker version 20.10.14, build a224086\n","$ docker ps\n","$ ansible-playbook deploy-milvus.yml --syntax-check\n","playbook: deploy-milvus.yml\n","$ ansible-playbook deploy-milvus.yml\n","PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode03]\n\nTASK [etcd] *******************************************************************************************************\nchanged: [dockernode03]\n\nTASK [pulsar] *****************************************************************************************************\nchanged: [dockernode03]\n\nTASK [minio] ******************************************************************************************************\nchanged: [dockernode03]\n\nPLAY [Create milvus nodes] ****************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode02]\n\nTASK [querynode] **************************************************************************************************\nchanged: [dockernode02]\n\nTASK [datanode] ***************************************************************************************************\nchanged: [dockernode02]\n\nTASK [indexnode] **************************************************************************************************\nchanged: [dockernode02]\n\nPLAY [Create milvus coords] ***************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode01]\n\nTASK [rootcoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [datacoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [querycoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [indexcoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [proxy] ******************************************************************************************************\nchanged: [dockernode01]\n\nPLAY RECAP ********************************************************************************************************\ndockernode01 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n"],"headingContent":"(Deprecated) Deploy a Milvus Cluster on EC2","anchorList":[{"label":"(Утратил силу) Развертывание кластера Milvus на EC2","href":"Deprecated-Deploy-a-Milvus-Cluster-on-EC2","type":1,"isActive":false},{"label":"Создание кластера Milvus","href":"Provision-a-Milvus-cluster","type":2,"isActive":false},{"label":"Запуск кластера Milvus","href":"Start-the-Milvus-cluster","type":2,"isActive":false},{"label":"Остановка узлов","href":"Stop-nodes","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.md b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.md new file mode 100644 index 000000000..bddeb2a4e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws.md @@ -0,0 +1,494 @@ +--- +id: aws.md +title: Развертывание кластера Milvus на EC2 +related_key: cluster +summary: 'Узнайте, как развернуть кластер Milvus на AWS EC2.' +--- +

    (Утратил силу) Развертывание кластера Milvus на EC2

    В этой теме описывается, как развернуть кластер Milvus на Amazon EC2 с помощью Terraform и Ansible.

    +
    +

    Эта тема устарела и скоро будет удалена. Вместо нее рекомендуем обратиться к разделу Развертывание кластера Milvus на EKS.

    +
    +

    Создание кластера Milvus

    В этом разделе описывается, как использовать Terraform для создания кластера Milvus.

    +

    Terraform - это программный инструмент "инфраструктура как код" (IaC). С помощью Terraform вы можете создавать инфраструктуру, используя декларативные файлы конфигурации.

    +

    Необходимые условия

      +
    • Установите и настройте Terraform

    • +
    • Установка и настройка AWS CLI

    • +
    +

    Подготовьте конфигурацию

    Шаблонные файлы конфигурации можно скачать на Google Drive.

    +
      +
    • main.tf

      +

      Этот файл содержит конфигурацию для инициализации кластера Milvus.

    • +
    • variables.tf

      +

      Этот файл позволяет быстро редактировать переменные, используемые для настройки или обновления кластера Milvus.

    • +
    • output.tf и inventory.tmpl

      +

      В этих файлах хранятся метаданные кластера Milvus. Метаданные, используемые в этой теме, - это public_ip для каждого экземпляра узла, private_ip для каждого экземпляра узла и все идентификаторы экземпляров EC2.

    • +
    +

    Подготовка переменных.tf

    В этом разделе описывается конфигурация, которую содержит файл variables.tf.

    +
      +
    • Количество узлов

      +

      В следующем шаблоне объявлена переменная index_count, используемая для установки количества узлов индекса.

      +
      Значение index_count должно быть больше или равно единице.
      +
      variable "index_count" {
      +  description = "Amount of index instances to run"
      +  type        = number
      +  default     = 5
      +}
      +
    • +
    • Тип экземпляра для типа узла

      +

      Следующий шаблон объявляет переменную index_ec2_type, используемую для задания типа экземпляра для индексных узлов.

      +
      variable "index_ec2_type" {
      +  description = "Which server type"
      +  type        = string
      +  default     = "c5.2xlarge"
      +}
      +
    • +
    • Разрешение доступа

      +

      В следующем шаблоне объявлены переменная key_name и переменная my_ip. Переменная key_name представляет ключ доступа AWS. Переменная my_ip представляет диапазон IP-адресов для группы безопасности.

      +
      variable "key_name" {
      +  description = "Which aws key to use for access into instances, needs to be uploaded already"
      +  type        = string
      +  default     = ""
      +}
      +
      +variable "my_ip" {
      +  description = "my_ip for security group. used so that ansible and terraform can ssh in"
      +  type        = string
      +  default     = "x.x.x.x/32"
      +}
      +
    • +
    +

    Подготовка файла main.tf

    В этом разделе описаны конфигурации, которые содержит файл main.tf.

    +
      +
    • Облачный провайдер и регион

      +

      В следующем шаблоне используется регион us-east-2. Дополнительные сведения см. в разделе Доступные регионы.

      +
      provider "aws" {
      +  profile = "default"
      +  region  = "us-east-2"
      +}
      +
    • +
    • Группа безопасности

      +

      В следующем шаблоне объявлена группа безопасности, которая разрешает входящий трафик из диапазона адресов CIDR, представленного в my_ip, объявленном в variables.tf.

      +
      resource "aws_security_group" "cluster_sg" {
      +  name        = "cluster_sg"
      +  description = "Allows only me to access"
      +  vpc_id      = aws_vpc.cluster_vpc.id
      +
      +  ingress {
      +    description      = "All ports from my IP"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "tcp"
      +    cidr_blocks      = [var.my_ip]
      +  }
      +
      +  ingress {
      +    description      = "Full subnet communication"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "all"
      +    self             = true
      +  }
      +
      +  egress {
      +    from_port        = 0
      +    to_port          = 0
      +    protocol         = "-1"
      +    cidr_blocks      = ["0.0.0.0/0"]
      +    ipv6_cidr_blocks = ["::/0"]
      +  }
      +
      +  tags = {
      +    Name = "cluster_sg"
      +  }
      +}
      +
    • +
    • VPC

      +

      Следующий шаблон определяет VPC с блоком CIDR 10.0.0.0/24 на кластере Milvus.

      +
      resource "aws_vpc" "cluster_vpc" {
      +  cidr_block = "10.0.0.0/24"
      +  tags = {
      +    Name = "cluster_vpc"
      +  }
      +}
      +
      +resource "aws_internet_gateway" "cluster_gateway" {
      +  vpc_id = aws_vpc.cluster_vpc.id
      +
      +  tags = {
      +    Name = "cluster_gateway"
      +  }
      +}
      +
    • +
    • Подсети (необязательно)

      +

      В следующем шаблоне объявляется подсеть, трафик которой направляется на интернет-шлюз. В этом случае размер CIDR-блока подсети равен размеру CIDR-блока VPC.

      +
      resource "aws_subnet" "cluster_subnet" {
      +  vpc_id                  = aws_vpc.cluster_vpc.id
      +  cidr_block              = "10.0.0.0/24"
      +  map_public_ip_on_launch = true
      +
      +  tags = {
      +    Name = "cluster_subnet"
      +  }
      +}
      +
      +resource "aws_route_table" "cluster_subnet_gateway_route" {
      +  vpc_id       = aws_vpc.cluster_vpc.id
      +
      +  route {
      +    cidr_block = "0.0.0.0/0"
      +    gateway_id = aws_internet_gateway.cluster_gateway.id
      +  }
      +
      +  tags = {
      +    Name = "cluster_subnet_gateway_route"
      +  }
      +}
      +
      +resource "aws_route_table_association" "cluster_subnet_add_gateway" {
      +  subnet_id      = aws_subnet.cluster_subnet.id
      +  route_table_id = aws_route_table.cluster_subnet_gateway_route.id
      +}
      +
      +
    • +
    • Экземпляры узлов (узлы)

      +

      Следующий шаблон объявляет экземпляр узла MinIO. В файле шаблона main.tf объявлены узлы 11 типов узлов. Для некоторых типов узлов необходимо установить root_block_device. Дополнительные сведения см. в разделах EBS, Ephemeral и Root Block Devices.

      +
      resource "aws_instance" "minio_node" {
      +  count         = var.minio_count
      +  ami           = "ami-0d8d212151031f51c"
      +  instance_type = var.minio_ec2_type
      +  key_name      = var.key_name
      +  subnet_id     = aws_subnet.cluster_subnet.id 
      +  vpc_security_group_ids = [aws_security_group.cluster_sg.id]
      +
      +  root_block_device {
      +    volume_type = "gp2"
      +    volume_size = 1000
      +  }
      +  
      +  tags = {
      +    Name = "minio-${count.index + 1}"
      +  }
      +}
      +
    • +
    +

    Применение конфигурации

      +
    1. Откройте терминал и перейдите в папку, в которой хранится main.tf.

    2. +
    3. Чтобы инициализировать конфигурацию, выполните команду terraform init.

    4. +
    5. Чтобы применить конфигурацию, запустите terraform apply и введите yes, когда появится запрос.

    6. +
    +

    Теперь вы создали кластер Milvus с помощью Terraform.

    +

    Запуск кластера Milvus

    В этом разделе описывается, как с помощью Ansible запустить созданный вами кластер Milvus.

    +

    Ansible - это инструмент управления конфигурацией, используемый для автоматизации предоставления облака и управления конфигурацией.

    +

    Необходимые условия

    +

    Загрузите учебник Ansible Milvus node deployment Playbook

    Клонируйте репозиторий Milvus с GitHub, чтобы загрузить учебник Ansible Milvus node deployment Playbook.

    +
    git clone https://github.com/milvus-io/milvus.git
    +
    +

    Настройте файлы установки

    Файлы inventory.ini и ansible.cfg используются для управления переменными окружения и методами проверки входа в систему в плейбуке Ansible. В файле inventory.ini секция dockernodes определяет все серверы движков docker. Секция ansible.cfg определяет все серверы координаторов Milvus. В секции node определены все серверы узлов Milvus.

    +

    Укажите локальный путь к Playbook и настройте файлы установки.

    +
    $ cd ./milvus/deployments/docker/cluster-distributed-deployment
    +
    +

    inventory.ini

    Настройте inventory.ini для разделения узлов на группы в соответствии с их ролями в системе Milvus.

    +

    Добавьте имена хостов, определите группу docker и vars.

    +
    [dockernodes] #Add docker host names.
    +dockernode01
    +dockernode02
    +dockernode03
    +
    +[admin] #Add Ansible controller name.
    +ansible-controller
    +
    +[coords] #Add the host names of Milvus coordinators.
    +; Take note the IP of this host VM, and replace 10.170.0.17 with it.
    +dockernode01
    +
    +[nodes] #Add the host names of Milvus nodes.
    +dockernode02
    +
    +[dependencies] #Add the host names of Milvus dependencies.
    +; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. 
    +; Take note the IP of this host VM, and replace 10.170.0.19 with it.
    +dockernode03
    +
    +[docker:children]
    +dockernodes
    +coords
    +nodes
    +dependencies
    +
    +[docker:vars]
    +ansible_python_interpreter= /usr/bin/python3
    +StrictHostKeyChecking= no
    +
    +; Setup variables to control what type of network to use when creating containers.
    +dependencies_network= host
    +nodes_network= host
    +
    +; Setup varibale to control what version of Milvus image to use.
    +image= milvusdb/milvus-dev:master-20220412-4781db8a
    +
    +; Setup static IP addresses of the docker hosts as variable for container environment variable config.
    +; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
    +; on which the etcd, minio, pulsar, coordinators will be hosted.
    +etcd_ip= 10.170.0.19
    +minio_ip= 10.170.0.19
    +pulsar_ip= 10.170.0.19
    +coords_ip= 10.170.0.17
    +
    +; Setup container environment which later will be used in container creation.
    +ETCD_ENDPOINTS= {{etcd_ip}}:2379 
    +MINIO_ADDRESS= {{minio_ip}}:9000
    +PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
    +QUERY_COORD_ADDRESS= {{coords_ip}}:19531
    +DATA_COORD_ADDRESS= {{coords_ip}}:13333
    +ROOT_COORD_ADDRESS= {{coords_ip}}:53100
    +INDEX_COORD_ADDRESS= {{coords_ip}}:31000
    +
    +

    ansible.cfg

    ansible.cfg контролирует действия плейбука, например, SSH-ключ и т. д. Не задавайте парольную фразу через SSH-ключ на хостах docker. В противном случае подключение Ansible по SSH будет неудачным. Мы рекомендуем задать одно и то же имя пользователя и SSH-ключ на трех хостах и настроить новую учетную запись пользователя на выполнение sudo без пароля. В противном случае вы будете получать ошибки о том, что имя пользователя не соответствует паролю или вам не предоставлены повышенные привилегии при запуске плейбука Ansible.

    +
    [defaults]
    +host_key_checking = False
    +inventory = inventory.ini # Specify the Inventory file
    +private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host
    +
    +

    deploy-docker.yml

    deploy-docker.yml определяет задачи при установке Docker. Подробности смотрите в комментариях к коду в файле.

    +
    ---
    +- name: setup pre-requisites # Install prerequisite
    +  hosts: all
    +  become: yes
    +  become_user: root
    +  roles:
    +    - install-modules
    +    - configure-hosts-file
    +
    +- name: install docker
    +  become: yes
    +  become_user: root
    +  hosts: dockernodes
    +  roles:
    +    - docker-installation
    +
    +

    Проверка подключения к Ansible

    Проверьте подключение к Ansible.

    +
    $ ansible all -m ping
    +
    +

    Добавьте в команду -i, чтобы указать путь к файлу инвентаризации, если вы не указали его в ansible.cfg, иначе Ansible использует /etc/ansible/hosts.

    +

    Терминал выдает следующее сообщение:

    +
    dockernode01 | SUCCESS => {
    +"changed": false,
    +"ping": "pong"
    +}
    +ansible-controller | SUCCESS => {
    +    "ansible_facts": {
    +        "discovered_interpreter_python": "/usr/bin/python3"
    +    },
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode03 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode02 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +
    +

    Проверка синтаксиса плейбука

    Проверьте синтаксис Playbook.

    +
    $ ansible-playbook deploy-docker.yml --syntax-check
    +
    +

    Обычно терминал выдает следующее сообщение:

    +
    playbook: deploy-docker.yml
    +
    +

    Установить Docker

    Установите Docker с помощью Playbook.

    +
    $ ansible-playbook deploy-docker.yml
    +
    +

    Если Docker успешно установлен на трех хостах, терминал выдает следующее сообщение:

    +
    TASK [docker-installation : Install Docker-CE] *******************************************************************
    +ok: [dockernode01]
    +ok: [dockernode03]
    +ok: [dockernode02]
    +
    +TASK [docker-installation : Install python3-docker] **************************************************************
    +ok: [dockernode01]
    +ok: [dockernode02]
    +ok: [dockernode03]
    +
    +TASK [docker-installation : Install docker-compose python3 library] **********************************************
    +changed: [dockernode01]
    +changed: [dockernode03]
    +changed: [dockernode02]
    +
    +PLAY RECAP *******************************************************************************************************
    +ansible-controller         : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode01               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    Проверить установку

    Войдите на три хоста с помощью SSH-ключа и проверьте установку на хостах.

    +
      +
    • Для корневого хоста:
    • +
    +
    $ docker -v
    +
    +
      +
    • Для хостов, не являющихся root-хостами:
    • +
    +
    $ sudo docker -v
    +
    +

    Обычно терминал выдает следующее сообщение:

    +
    Docker version 20.10.14, build a224086
    +
    +

    Проверьте состояние работы контейнеров.

    +
    $ docker ps
    +
    +

    Проверьте синтаксис

    Проверьте синтаксис deploy-milvus.yml.

    +
    $ ansible-playbook deploy-milvus.yml --syntax-check
    +
    +

    Обычно терминал выдает следующее:

    +
    playbook: deploy-milvus.yml
    +
    +

    Создать контейнер Milvus

    Задачи по созданию контейнера Milvus определены в deploy-milvus.yml.

    +
    $ ansible-playbook deploy-milvus.yml
    +
    +

    Терминал возвращается:

    +
    PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode03]
    +
    +TASK [etcd] *******************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [pulsar] *****************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [minio] ******************************************************************************************************
    +changed: [dockernode03]
    +
    +PLAY [Create milvus nodes] ****************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode02]
    +
    +TASK [querynode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [datanode] ***************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [indexnode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +PLAY [Create milvus coords] ***************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode01]
    +
    +TASK [rootcoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [datacoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [querycoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [indexcoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [proxy] ******************************************************************************************************
    +changed: [dockernode01]
    +
    +PLAY RECAP ********************************************************************************************************
    +dockernode01               : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    Теперь у вас есть Milvus, развернутый на трех узлах.

    +

    Остановка узлов

    Вы можете остановить все узлы после того, как вам больше не нужен кластер Milvus.

    +
    Убедитесь, что двоичный файл terraform доступен на вашем компьютере PATH.
    +
      +
    1. Запустите terraform destroy и введите yes, когда появится запрос.

    2. +
    3. В случае успеха все экземпляры узлов будут остановлены.

    4. +
    +

    Что дальше

    Если вы хотите узнать, как развернуть Milvus в других облаках:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.json b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.json new file mode 100644 index 000000000..ec081d7a3 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP\n","# If the import-certificate command is successful, it returns the arn of the imported certificate.\naws acm import-certificate --certificate fileb://Certificate.pem \\\n --certificate-chain fileb://CertificateChain.pem \\\n --private-key fileb://PrivateKey.pem \n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n namespace: milvus\n name: milvus-demo\n annotations:\n alb.ingress.kubernetes.io/scheme: internet-facing\n alb.ingress.kubernetes.io/backend-protocol-version: GRPC\n alb.ingress.kubernetes.io/target-type: ip\n alb.ingress.kubernetes.io/listen-ports: '[{\"HTTPS\":443}]'\n alb.ingress.kubernetes.io/certificate-arn: \"arn:aws:acm:region:account-id:certificate/certificate-id\"\n\nspec:\n ingressClassName: alb\n rules:\n - host: milvus-demo.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: milvus-demo\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmilvus-demo alb milvus-demo.milvus.io k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com 80 10m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\nconnections.connect(\"default\", host=\"k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com\", port=\"443\", secure=True, server_name=\"milvus-demo.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on AWS","anchorList":[{"label":"Настройка балансировщика нагрузки Layer-7 для Milvus на AWS","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-AWS","type":1,"isActive":false},{"label":"Проверка соединения через балансировщик нагрузки Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.md b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.md new file mode 100644 index 000000000..60aa7d3a7 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/aws_layer7.md @@ -0,0 +1,109 @@ +--- +id: aws_layer7.md +title: Настройка балансировщика нагрузки Layer-7 для Milvus на AWS +related_key: cluster +summary: >- + Узнайте, как развернуть кластер Milvus за балансировщиком нагрузки Layer-7 на + AWS. +--- +

    Настройка балансировщика нагрузки Layer-7 для Milvus на AWS

    По сравнению с балансировщиком нагрузки уровня 4, балансировщик нагрузки уровня 7 предлагает интеллектуальную балансировку нагрузки и возможности кэширования и является отличным выбором для облачных нативных сервисов.

    +

    В этом руководстве вы узнаете, как настроить балансировщик нагрузки уровня 7 для кластера Milvus, уже работающего за балансировщиком нагрузки уровня 4.

    +

    Перед началом работы

    +

    Настройка конфигураций Milvus

    В этом руководстве предполагается, что вы уже развернули кластер Milvus за балансировщиком нагрузки Layer-4 на AWS.

    +

    Перед настройкой балансировщика нагрузки Layer-7 для этого кластера Milvus выполните следующую команду, чтобы удалить балансировщик нагрузки Layer-4.

    +
    helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP
    +
    +

    Подготовьте сертификаты TLS

    Для работы TLS требуются сертификаты. Мы используем ACM для управления сертификатами, и нам нужно импортировать существующий сертификат в ACM. Обратитесь к разделу Импорт сертификата. Ниже приведен пример.

    +
    # If the import-certificate command is successful, it returns the arn of the imported certificate.
    +aws acm import-certificate --certificate fileb://Certificate.pem \
    +      --certificate-chain fileb://CertificateChain.pem \
    +      --private-key fileb://PrivateKey.pem  
    +
    +

    Создание входного файла для генерации балансировщика нагрузки уровня 7

    Подготовьте файл ingress следующим образом и назовите его ingress.yaml. Замените arn и host сертификата на свои собственные.

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  namespace: milvus
    +  name: milvus-demo
    +  annotations:
    +    alb.ingress.kubernetes.io/scheme: internet-facing
    +    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
    +    alb.ingress.kubernetes.io/target-type: ip
    +    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    +    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:region:account-id:certificate/certificate-id"
    +
    +spec:
    +  ingressClassName: alb
    +  rules:
    +    - host: milvus-demo.milvus.io
    +      http:
    +        paths:
    +        - path: /
    +          pathType: Prefix
    +          backend:
    +            service:
    +              name: milvus-demo
    +              port:
    +                number: 19530
    +
    +

    Затем вы можете создать Ingress, применив этот файл к кластеру EKS.

    +
    kubectl apply -f ingress.yaml
    +
    +

    Теперь подождите, пока AWS настроит балансировщик нагрузки Layer-7. Вы можете проверить прогресс, выполнив команду

    +
    kubectl -f ingress.yaml get -w
    +
    +

    Результат должен быть похож на следующий:

    +
    NAME          CLASS   HOSTS                   ADDRESS                                                                PORTS   AGE
    +milvus-demo   alb     milvus-demo.milvus.io   k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com   80      10m
    +
    +

    Как только в поле ADDRESS появится адрес, балансировщик нагрузки Layer-7 будет готов к использованию.

    +

    Проверка соединения через балансировщик нагрузки Layer-7

    В этом руководстве используется PyMilvus для проверки соединения с сервисом Milvus за балансировщиком нагрузки Layer-7, который мы только что создали. Подробные шаги описаны здесь.

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +connections.connect("default", host="k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com", port="443", secure=True, server_name="milvus-demo.milvus.io")
    +
    +
    +
      +
    • Хост и имя_сервера должны быть заменены на ваши собственные.
    • +
    • Если вы настроили DNS-запись для сопоставления доменного имени с alb, замените host на доменное имя и опустите server_name.
    • +
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.json b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.json new file mode 100644 index 000000000..9d78840c0 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.json @@ -0,0 +1 @@ +{"codeList":["{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"S3BucketManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:CreateBucket\",\n \"s3:PutBucketAcl\",\n \"s3:PutBucketOwnershipControls\",\n \"s3:DeleteBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::milvus-bucket-*\"\n ]\n }\n ]\n}\n","{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"IAMPolicyManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iam:CreatePolicy\",\n \"iam:DeletePolicy\"\n ],\n \"Resource\": \"arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite\"\n }\n ]\n} \n","milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","aws iam attach-user-policy --user-name --policy-arn \"arn:aws:iam:::policy/MilvusS3ReadWrite\"\n","apiVersion: eksctl.io/v1alpha5\nkind: ClusterConfig\n\nmetadata:\n name: 'milvus-eks-cluster'\n region: 'us-east-2'\n version: \"1.27\"\n\niam:\n withOIDC: true\n\n serviceAccounts:\n - metadata:\n name: aws-load-balancer-controller\n namespace: kube-system\n wellKnownPolicies:\n awsLoadBalancerController: true\n\nmanagedNodeGroups:\n - name: milvus-node-group\n labels: { role: milvus }\n instanceType: m6i.4xlarge\n desiredCapacity: 3\n privateNetworking: true\n \naddons:\n- name: vpc-cni\n version: latest\n attachPolicyARNs:\n - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy\n- name: coredns\n version: latest\n- name: kube-proxy\n version: latest\n- name: aws-ebs-csi-driver\n version: latest\n wellKnownPolicies:\n ebsCSIController: true\n","eksctl create cluster -f eks_cluster.yaml\n","aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'\n","kubectl cluster-info\n\nkubectl get nodes -A -o wide\n","cat <\"\n useIAM: false\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n accessKey: \"\"\n secretKey: \"\"\n region: \"us-east-2\"\n\n# HA Configurations\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n","kubectl get pods -n milvus\n","kubectl get svc -n milvus\n","wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py\n","python3 hello_milvus.py\n","=== start connecting to Milvus ===\n\nDoes collection hello_milvus exist in Milvus: False\n\n=== Create collection `hello_milvus` ===\n\n\n=== Start inserting entities ===\n\nNumber of entities in Milvus: 3000\n\n=== Start Creating index IVF_FLAT ===\n\n\n=== Start loading ===\n\n\n=== Start searching based on vector similarity ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561\nhit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304\nhit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482\nhit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nsearch latency = 0.4693s\n\n=== Start querying with `random > 0.5` ===\n\nquery result:\n-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}\nsearch latency = 0.9407s\nquery pagination(limit=4):\n [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\nquery pagination(offset=1, limit=3):\n [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\n\n=== Start hybrid searching with `random > 0.5` ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661\nhit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nhit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499\nhit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955\nsearch latency = 0.4652s\n\n=== Start deleting with expr `pk in [\"0\" , \"1\"]` ===\n\nquery before delete by expr=`pk in [\"0\" , \"1\"]` -> result:\n-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}\n-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}\n\nquery after delete by expr=`pk in [\"0\" , \"1\"]` -> result: []\n\n\n=== Drop collection `hello_milvus` ===\n","helm uninstall milvus-demo -n milvus\n","eksctl delete cluster --name milvus-eks-cluster --region us-east-2\n","aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive\n\naws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2\n\naws iam detach-user-policy --user-name --policy-arn \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\"\n\naws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\n"],"headingContent":"Deploy a Milvus Cluster on EKS","anchorList":[{"label":"Развертывание кластера Milvus на EKS","href":"Deploy-a-Milvus-Cluster-on-EKS","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка ресурсов AWS","href":"Set-up-AWS-Resources","type":2,"isActive":false},{"label":"Создайте класс хранилища","href":"Create-a-StorageClass","type":2,"isActive":false},{"label":"Развертывание Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Проверка установки","href":"Verify-the-installation","type":2,"isActive":false},{"label":"Очистка работает","href":"Clean-up-works","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.md b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.md new file mode 100644 index 000000000..9fa4b1a16 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/eks.md @@ -0,0 +1,518 @@ +--- +id: eks.md +title: Развертывание кластера Milvus на EKS +related_key: cluster +summary: 'Узнайте, как развернуть кластер Milvus на EKS.' +--- +

    Развертывание кластера Milvus на EKS

    В этой теме описывается развертывание кластера Milvus на Amazon EKS.

    +

    Необходимые условия

      +
    • У вас установлен AWS CLI на локальном компьютере или на Amazon EC2, который будет служить конечной точкой для выполнения операций, описанных в этом документе. Для Amazon Linux 2 или Amazon Linux 2023 инструменты AWS CLI уже установлены. Чтобы установить AWS CLi на локальный компьютер. См. раздел Как установить AWS CLI.
    • +
    • Вы установили Kubernetes и инструменты EKS на предпочтительное устройство конечной точки, в том числе:
    • +
    • Разрешения AWS IAM были предоставлены должным образом. У используемого вами принципала безопасности IAM должно быть разрешение на использование ролей Amazon EKS IAM, ролей, связанных с сервисами, AWS CloudFormation, VPC и других соответствующих ресурсов. Вы можете воспользоваться одним из следующих способов предоставления принципалу соответствующих разрешений.
        +
      • (Не рекомендуется) Просто установите политику ассоциации пользователя/роли, которую вы использовали, на управляемую политику AWS AdministratorAccess.
      • +
      • (Настоятельно рекомендуется) Чтобы реализовать принцип наименьших привилегий, сделайте следующее:
          +
        • Чтобы настроить разрешение для eksctl, обратитесь к разделу Минимальное разрешение для eksctl.

        • +
        • Чтобы настроить разрешение на создание/удаление ведер AWS S3, обратитесь к следующим настройкам разрешения:

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "S3BucketManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "s3:CreateBucket",
          +        "s3:PutBucketAcl",
          +        "s3:PutBucketOwnershipControls",
          +        "s3:DeleteBucket"
          +      ],
          +      "Resource": [
          +        "arn:aws:s3:::milvus-bucket-*"
          +      ]
          +    }
          +  ]
          +}
          +
        • +
        • Чтобы настроить разрешения на создание/удаление политик IAM, обратитесь к следующим настройкам разрешений. Замените YOUR_ACCOUNT_ID на свой собственный.

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "IAMPolicyManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "iam:CreatePolicy",
          +        "iam:DeletePolicy"
          +      ],
          +      "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite"
          +    }
          +  ]
          +}    
          +
        • +
      • +
    • +
    +

    Настройка ресурсов AWS

    Вы можете настроить необходимые ресурсы AWS, включая ведро AWS S3 и кластер EKS, используя AWS Management Console, AWS CLI или инструменты IaC, такие как Terraform. В этом документе для демонстрации настройки ресурсов AWS предпочтительно использовать AWS CLI.

    +

    Создание ведра Amazon S3

      +
    • Создайте ведро AWS S3.

      +

      Ознакомьтесь с правилами именования ведер и соблюдайте правила именования при присвоении имени ведру AWS S3.

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • Создайте политику IAM для чтения и записи объектов в созданном выше ведре. Замените имя ведра на свое собственное.

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:GetObject",
      +        "s3:PutObject",
      +        "s3:ListBucket",
      +        "s3:DeleteObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>",
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • Прикрепите политику к своему пользователю AWS.

      +
      aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
      +
    • +
    +

    Создание кластера Amazon EKS

      +
    • Подготовьте файл конфигурации кластера следующим образом и назовите его eks_cluster.yaml.

      +
      apiVersion: eksctl.io/v1alpha5
      +kind: ClusterConfig
      +
      +metadata:
      +  name: 'milvus-eks-cluster'
      +  region: 'us-east-2'
      +  version: "1.27"
      +
      +iam:
      +  withOIDC: true
      +
      +  serviceAccounts:
      +  - metadata:
      +      name: aws-load-balancer-controller
      +      namespace: kube-system
      +    wellKnownPolicies:
      +      awsLoadBalancerController: true
      +
      +managedNodeGroups:
      +  - name: milvus-node-group
      +    labels: { role: milvus }
      +    instanceType: m6i.4xlarge
      +    desiredCapacity: 3
      +    privateNetworking: true
      +    
      +addons:
      +- name: vpc-cni
      +  version: latest
      +  attachPolicyARNs:
      +    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
      +- name: coredns
      +  version: latest
      +- name: kube-proxy
      +  version: latest
      +- name: aws-ebs-csi-driver
      +  version: latest
      +  wellKnownPolicies:
      +    ebsCSIController: true
      +
    • +
    • Выполните следующую команду для создания кластера EKS.

      +
      eksctl create cluster -f eks_cluster.yaml
      +
    • +
    • Получите файл kubeconfig.

      +
      aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
      +
    • +
    • Проверьте кластер EKS.

      +
      kubectl cluster-info
      +
      +kubectl get nodes -A -o wide
      +
    • +
    +

    Создайте класс хранилища

    Milvus использует etcd в качестве метахранилища и должен полагаться на gp3 StorageClass для создания и управления PVC.

    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: storage.k8s.io/v1
    +kind: StorageClass
    +metadata:
    +  name: ebs-gp3-sc
    +  annotations:
    +    storageclass.kubernetes.io/is-default-class: "true"
    +provisioner: ebs.csi.aws.com
    +volumeBindingMode: WaitForFirstConsumer
    +parameters:
    +  type: gp3
    +EOF
    +
    +

    Установите оригинальный класс хранения gp2 StorageClass в значение не по умолчанию.

    +
    kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    +
    +

    Установите контроллер AWS LoadBalancer

      +
    • Добавьте репо Helm chars.

      +
      helm repo add eks https://aws.github.io/eks-charts
      +helm repo update
      +
    • +
    • Установите контроллер балансировщика нагрузки AWS.

      +
      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
      +  -n kube-system \
      +  --set clusterName='milvus-eks-cluster' \
      +  --set serviceAccount.create=false \
      +  --set serviceAccount.name=aws-load-balancer-controller 
      +
    • +
    • Проверьте установку

      +
      kubectl get deployment -n kube-system aws-load-balancer-controller
      +
    • +
    +

    Развертывание Milvus

    В этом руководстве мы будем использовать диаграммы Milvus Helm Charts для развертывания кластера Milvus. Графики можно найти здесь.

    +
      +
    • Добавьте репо Milvus Helm Chart.

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm/
      +helm repo update
      +
    • +
    • Подготовьте файл конфигурации Milvus milvus.yaml, а также замените <bucket-name> <s3-access-key> <s3-secret-key> на свой собственный.

      +

      +
        +
      • Чтобы настроить HA для вашего Milvus, обратитесь к этому калькулятору для получения дополнительной информации. Вы можете загрузить соответствующие конфигурации прямо из калькулятора, и вам следует удалить конфигурации, связанные с MinIO.
      • +
      • Чтобы реализовать многократное развертывание координаторов, установите xxCoordinator.activeStandby.enabled на true.
      • +
      +

      +
      cluster:
      +  enabled: true
      +
      +service:
      +  type: LoadBalancer
      +  port: 19530
      +  annotations: 
      +    service.beta.kubernetes.io/aws-load-balancer-type: external
      +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
      +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
      +
      +minio:
      +  enabled: false
      +
      +externalS3:
      +  enabled: true
      +  host: "s3.us-east-2.amazonaws.com"
      +  port: "443"
      +  useSSL: true
      +  bucketName: "<bucket-name>"
      +  useIAM: false
      +  cloudProvider: "aws"
      +  iamEndpoint: ""
      +  accessKey: "<s3-access-key>"
      +  secretKey: "<s3-secret-key>"
      +  region: "us-east-2"
      +
      +# HA Configurations
      +rootCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi
      +
      +indexCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +queryCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +dataCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +proxy:
      +  replicas: 2
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi  
      +
    • +
    • Установите Milvus.

      +
      helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
      +
    • +
    • Подождите, пока все стручки не будут Running.

      +
      kubectl get pods -n milvus
      +
      +

      +

      Helm не поддерживает планирование порядка создания сервисов. Вполне нормально, что бизнес-подсистемы перезапускаются один или два раза, прежде чем etcd и pulsar будут запущены на ранней стадии.

      +

    • +
    • Получите адрес службы Milvus.

      +
      kubectl get svc -n milvus
      +
    • +
    +

    Проверка установки

    Для проверки установки вы можете следовать приведенному ниже простому руководству. Для получения более подробной информации обратитесь к этому примеру.

    +
      +
    • Загрузите код примера.

      +
      wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
      +
    • +
    • Измените аргумент host в коде примера на адрес службы Milvus, указанный выше.

    • +
    +
    ```python
    +...
    +connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
    +...
    +```
    +
    +
      +
    • Запустите код примера.

      +
      python3 hello_milvus.py
      +
      +

      Результат должен быть похож на следующий:

      +
      === start connecting to Milvus     ===
      +
      +Does collection hello_milvus exist in Milvus: False
      +
      +=== Create collection `hello_milvus` ===
      +
      +
      +=== Start inserting entities       ===
      +
      +Number of entities in Milvus: 3000
      +
      +=== Start Creating index IVF_FLAT  ===
      +
      +
      +=== Start loading                  ===
      +
      +
      +=== Start searching based on vector similarity ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561
      +hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304
      +hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
      +hit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +search latency = 0.4693s
      +
      +=== Start querying with `random > 0.5` ===
      +
      +query result:
      +-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}
      +search latency = 0.9407s
      +query pagination(limit=4):
      +        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +query pagination(offset=1, limit=3):
      +        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +
      +=== Start hybrid searching with `random > 0.5` ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661
      +hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +hit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499
      +hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955
      +search latency = 0.4652s
      +
      +=== Start deleting with expr `pk in ["0" , "1"]` ===
      +
      +query before delete by expr=`pk in ["0" , "1"]` -> result:
      +-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}
      +-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}
      +
      +query after delete by expr=`pk in ["0" , "1"]` -> result: []
      +
      +
      +=== Drop collection `hello_milvus` ===
      +
    • +
    +

    Очистка работает

    Если вам необходимо восстановить среду, удалите Milvus, уничтожьте кластер EKS и удалите ведра AWS S3 и связанные с ними политики IAM.

    +
      +
    • Удалите Milvus.

      +
      helm uninstall milvus-demo -n milvus
      +
    • +
    • Уничтожьте кластер EKS.

      +
      eksctl delete cluster --name milvus-eks-cluster --region us-east-2
      +
    • +
    • Удалите ведро AWS S3 и связанные с ним политики IAM.

      +

      Замените имя ведра и ARN политики на свои собственные.

      +
      aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive
      +
      +aws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2
      +
      +aws iam detach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite"
      +
      +aws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
      +
    • +
    +

    Что дальше

    Если вы хотите узнать, как развернуть Milvus в других облаках:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.json b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.json new file mode 100644 index 000000000..716273f87 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.json @@ -0,0 +1 @@ +{"codeList":["milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:PutObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \\\n --attach-policy-arn arn:aws:iam:::policy/MilvusS3ReadWrite --approve\n","aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument\n# An example output is as follows\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Federated\": \"arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE\"\n },\n \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n \"Condition\": {\n \"StringEquals\": {\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub\": \"system:serviceaccount:default:my-service-account\",\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud\": \"sts.amazonaws.com\"\n }\n }\n }\n ]\n}\n","aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text\n# An example output is as follows\narn:aws:iam::12345678901:policy/MilvusS3ReadWrite\n","export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\naws iam get-policy --policy-arn $policy_arn\n# An example output is as follows\n{\n \"Policy\": {\n \"PolicyName\": \"MilvusS3ReadWrite\",\n \"PolicyId\": \"EXAMPLEBIOWGLDEXAMPLE\",\n \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n \"Path\": \"/\",\n \"DefaultVersionId\": \"v2\",\n [...]\n }\n}\n","aws iam get-policy-version --policy-arn $policy_arn --version-id v2\n# An example output is as follows\n{\n \"PolicyVersion\": {\n \"Document\": {\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n },\n [...]\n }\n}\n","kubectl describe serviceaccount milvus-s3-access-sa -n milvus\n# An example output is as follows\nName: milvus-s3-access-sa\nNamespace: milvus\nLabels: app.kubernetes.io/managed-by=eksctl\nAnnotations: eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa\n[...]\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n port: 19530\n annotations: \n service.beta.kubernetes.io/aws-load-balancer-type: external\n service.beta.kubernetes.io/aws-load-balancer-name: milvus-service\n service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing\n service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip\n\nserviceAccount:\n create: false\n name: milvus-s3-access-sa\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: \"s3.us-east-2.amazonaws.com\"\n port: \"443\"\n useSSL: true\n bucketName: \"\"\n useIAM: true\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n"],"headingContent":"Configure S3 Access by IAM Role","anchorList":[{"label":"Настройка доступа к S3 по ролям IAM","href":"Configure-S3-Access-by-IAM-Role","type":1,"isActive":false},{"label":"Перед началом работы","href":"Before-you-start","type":2,"isActive":false},{"label":"Привязка роли IAM к учетной записи службы Kubernetes","href":"Associate-an-IAM-role-with-a-Kubernetes-service-account","type":2,"isActive":false},{"label":"Проверьте настройку роли и учетной записи службы.","href":"Verify-the-role-and-service-account-setup","type":2,"isActive":false},{"label":"Развертывание Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Проверьте установку","href":"Verify-the-installation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.md b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.md new file mode 100644 index 000000000..7043a37b8 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/aws/s3.md @@ -0,0 +1,341 @@ +--- +id: s3.md +title: Настройка доступа к S3 по ролям IAM +related_key: 's3, storage, iam' +summary: 'Узнайте, как настроить s3 с помощью ролей IAM.' +--- +

    Настройка доступа к S3 по ролям IAM

    В этой теме рассказывается о том, как настроить доступ к s3 по ролям IAM при установке Milvus с помощью helm. Для получения дополнительной информации см. раздел "Роли IAM".

    +

    Перед началом работы

    +

    Привязка роли IAM к учетной записи службы Kubernetes

      +
    • Создайте ведро AWS S3.

      +

      Ознакомьтесь с правилами именования ведер и соблюдайте правила именования при присвоении имени ведру AWS S3.

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • Создайте политику IAM для чтения и записи объектов в созданном выше ведре. Замените имя ведра на свое собственное.

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:ListBucket"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>"
      +      ]
      +    },
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:DeleteObject",
      +        "s3:GetObject",
      +        "s3:PutObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • Создайте IAM-роль и свяжите ее с учетной записью службы Kubernetes. Замените your-account-id на идентификатор вашей учетной записи.

    • +
    +
    eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \
    +    --attach-policy-arn arn:aws:iam::<your-account-id>:policy/MilvusS3ReadWrite --approve
    +
    +

    Проверьте настройку роли и учетной записи службы.

    Обратитесь к разделу "Роли IAM".

    +
      +
    • Убедитесь, что политика доверия роли IAM настроена правильно.
    • +
    +
    aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument
    +# An example output is as follows
    +{
    +    "Version": "2012-10-17",
    +    "Statement": [
    +        {
    +            "Effect": "Allow",
    +            "Principal": {
    +                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
    +            },
    +            "Action": "sts:AssumeRoleWithWebIdentity",
    +            "Condition": {
    +                "StringEquals": {
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
    +                }
    +            }
    +        }
    +    ]
    +}
    +
    +
      +
    • Убедитесь, что политика, которую вы прикрепили к роли на предыдущем шаге, прикреплена к роли.
    • +
    +
    aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text
    +# An example output is as follows
    +arn:aws:iam::12345678901:policy/MilvusS3ReadWrite
    +
    +
      +
    • Просмотрите версию политики по умолчанию.
    • +
    +
    export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
    +aws iam get-policy --policy-arn $policy_arn
    +# An example output is as follows
    +{
    +    "Policy": {
    +        "PolicyName": "MilvusS3ReadWrite",
    +        "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
    +        "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
    +        "Path": "/",
    +        "DefaultVersionId": "v2",
    +        [...]
    +    }
    +}
    +
    +
      +
    • Просмотрите содержимое политики, чтобы убедиться, что политика включает все разрешения, которые нужны вашему боду. Если необходимо, замените 1 в следующей команде на версию, которая была получена в предыдущем выводе.
    • +
    +
    aws iam get-policy-version --policy-arn $policy_arn --version-id v2
    +# An example output is as follows
    +{
    +    "PolicyVersion": {
    +        "Document": {
    +            "Version": "2012-10-17",
    +            "Statement": [
    +                {
    +                    "Effect": "Allow",
    +                    "Action": [
    +                        "s3:GetObject",
    +                        "s3:PutObject",
    +                        "s3:ListBucket",
    +                        "s3:DeleteObject"
    +                    ],
    +                    "Resource": [
    +                        "arn:aws:s3:::<bucket-name>",
    +                        "arn:aws:s3:::<bucket-name>/*"
    +                    ]
    +                }
    +            ]
    +        },
    +        [...]
    +    }
    +}
    +
    +
      +
    • Убедитесь, что учетная запись службы Kubernetes аннотирована ролью.
    • +
    +
    kubectl describe serviceaccount milvus-s3-access-sa -n milvus
    +# An example output is as follows
    +Name:                milvus-s3-access-sa
    +Namespace:           milvus
    +Labels:              app.kubernetes.io/managed-by=eksctl
    +Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa
    +[...]
    +
    +

    Развертывание Milvus

    В этом руководстве мы будем использовать диаграммы Milvus Helm для развертывания кластера Milvus. Графики можно найти здесь.

    +
      +
    • Добавьте репо Milvus Helm Chart.
    • +
    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +
    +
      +
    • Подготовьте файл конфигурации Milvus milvus.yaml, заменив <bucket-name> на имя созданного выше ведра.
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +  port: 19530
    +  annotations: 
    +    service.beta.kubernetes.io/aws-load-balancer-type: external
    +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
    +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-s3-access-sa
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: "s3.us-east-2.amazonaws.com"
    +  port: "443"
    +  useSSL: true
    +  bucketName: "<bucket-name>"
    +  useIAM: true
    +  cloudProvider: "aws"
    +  iamEndpoint: ""
    +
    +rootCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi
    +
    +indexCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +queryCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +dataCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +proxy:
    +  replicas: 2
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi  
    +
    +
      +
    • Установите Milvus.
    • +
    +
    helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml
    +
    +

    Проверьте установку

    Обратитесь к разделу Проверка установки.

    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/azure/abs.json b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/abs.json new file mode 100644 index 000000000..e2a517c5a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/abs.json @@ -0,0 +1 @@ +{"codeList":["export RESOURCE_GROUP=\"\"\nexport AKS_CLUSTER=\"\" \nexport SUB_ID=\"\"\nexport USER_ASSIGNED_IDENTITY_NAME=\"workload-identity\"\nexport SERVICE_ACCOUNT_NAME=\"milvus-abs-access-sa\"\nexport STORAGE_ACCOUNT_NAME=\"milvustesting1\"\nexport CONTAINER_NAME=\"testmilvus\"\nexport LOCATION=\"\"\nexport SERVICE_ACCOUNT_NAMESPACE=\"default\"\n","az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity\n","export SERVICE_ACCOUNT_ISSUER=\"$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)\"\n","az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}\n\n","az identity create --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\"\nexport USER_ASSIGNED_IDENTITY_CLIENT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'clientId' -otsv)\"\nexport USER_ASSIGNED_IDENTITY_OBJECT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'principalId' -otsv)\"\naz role assignment create --role \"Storage Blob Data Contributor\" --assignee \"${USER_ASSIGNED_IDENTITY_OBJECT_ID}\" --scope \"/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}\"\n\n","cat <Настройка доступа к хранилищу Blob Storage по идентификатору рабочей нагрузки

    В этой теме рассказывается о том, как настроить доступ к Azure Blob Storage по Workload Identity при установке Milvus с помощью helm. Для получения дополнительной информации см. раздел Workload Identity.

    +

    Настройте приложения для использования Workload Identity

      +
    • Установите среду.
    • +
    +
    export RESOURCE_GROUP="<your resource group>"
    +export AKS_CLUSTER="<your aks cluster name>" 
    +export SUB_ID="<your Subscription ID>"
    +export USER_ASSIGNED_IDENTITY_NAME="workload-identity"
    +export SERVICE_ACCOUNT_NAME="milvus-abs-access-sa"
    +export STORAGE_ACCOUNT_NAME="milvustesting1"
    +export CONTAINER_NAME="testmilvus"
    +export LOCATION="<your location>"
    +export SERVICE_ACCOUNT_NAMESPACE="default"
    +
    +
      +
    • Обновите кластер AKS с помощью OIDC Issuer и Workload Identity.
    • +
    +
    az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity
    +
    +
      +
    • Получите URL-адрес эмитента OIDC.
    • +
    +
    export SERVICE_ACCOUNT_ISSUER="$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)"
    +
    +
      +
    • Создайте учетную запись хранилища и контейнер.
    • +
    +
    az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}
    +
    +
    +
      +
    • Создайте управляемую идентификацию пользователя и назначьте роль.
    • +
    +
    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"
    +export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'clientId' -otsv)"
    +export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'principalId' -otsv)"
    +az role assignment create --role "Storage Blob Data Contributor" --assignee "${USER_ASSIGNED_IDENTITY_OBJECT_ID}" --scope "/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}"
    +
    +
    +
      +
    • Создайте учетную запись службы.
    • +
    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ServiceAccount
    +metadata:
    +  annotations:
    +    azure.workload.identity/client-id: ${USER_ASSIGNED_IDENTITY_CLIENT_ID}
    +  name: ${SERVICE_ACCOUNT_NAME}
    +EOF
    +
    +
      +
    • Установите федеративные идентификационные полномочия между идентификатором и эмитентом и субъектом учетной записи службы.
    • +
    +
    az identity federated-credential create \
    +  --name "kubernetes-federated-credential" \
    +  --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
    +  --resource-group "${RESOURCE_GROUP}" \
    +  --issuer "${SERVICE_ACCOUNT_ISSUER}" \
    +  --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
    +
    +

    Развертывание Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    содержимое файла values.yaml:

    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +labels:
    +  azure.workload.identity/use: "true"
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-abs-access-sa # SERVICE_ACCOUNT_NAME
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # CONTAINER_NAME
    +  cloudProvider: azure
    +  useSSL: true
    +  useIAM: true
    +  accessKey: "milvustesting1" # STORAGE_ACCOUNT_NAME
    +  secretKey: ""
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.json b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.json new file mode 100644 index 000000000..08a6649e6 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.json @@ -0,0 +1 @@ +{"codeList":["az account set --subscription EXAMPLE-SUBSCRIPTION-ID\n","az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME\n","az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n testmilvus --account-name milvustesting1\n","az storage account keys list --account-name milvustesting2\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nextraConfigFiles:\n user.yaml: |+\n common:\n storageType: remote\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: core.windows.net\n port: 443\n rootPath: my-release\n bucketName: testmilvus # the storage account container name\n cloudProvider: azure\n useSSL: true\n accessKey: \"milvustesting1\" # the storage account name\n secretKey: \"\" \n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy Milvus on Azure with AKS","anchorList":[{"label":"Развертывание Milvus в Azure с помощью AKS","href":"Deploy-Milvus-on-Azure-with-AKS","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Требования к программному обеспечению","href":"Software-requirements","type":2,"isActive":false},{"label":"Создание кластера Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"Подключение к кластеру","href":"Connect-to-the-cluster","type":2,"isActive":false},{"label":"Настройка подписки и учетных данных","href":"Set-a-subscription-and-credentials","type":2,"isActive":false},{"label":"Использование Azure Blob Storage в качестве внешнего хранилища объектов","href":"Using-Azure-Blob-Storage-as-external-object-storage","type":2,"isActive":false},{"label":"Развертывание Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Проверка развертывания","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"Hello Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.md b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.md new file mode 100644 index 000000000..5c9d58dee --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/azure.md @@ -0,0 +1,299 @@ +--- +id: azure.md +title: Развертывание Milvus в Microsoft Azure с помощью Kubernetes +related_key: cluster +summary: 'Узнайте, как развернуть кластер Milvus в Azure.' +--- +

    Развертывание Milvus в Azure с помощью AKS

    В этой теме описывается, как предоставить и создать кластер с помощью Azure Kubernetes Service (AKS) и портала Azure.

    +

    Предварительные условия

    Убедитесь, что ваш проект Azure настроен должным образом и у вас есть доступ к ресурсам, которые вы хотите использовать. Обратитесь к администраторам, если вы не уверены в своих правах доступа.

    +

    Требования к программному обеспечению

    +

    В качестве альтернативы можно использовать Cloud Shell, в которой предустановлены Azure CLI, kubectl и Helm.

    +
    После установки Azure CLI убедитесь, что вы правильно аутентифицированы.
    +

    Создание кластера Kubernetes

      +
    1. Войдите на портал Azure.
    2. +
    3. В меню портала Azure или на главной странице выберите Создать ресурс.
    4. +
    5. Выберите Контейнеры > Служба Kubernetes.
    6. +
    7. На странице Основы настройте следующие параметры:
    8. +
    +
      +
    • Сведения о проекте:

      +
        +
      • Подписка: Обратитесь к администратору Azure вашей организации, чтобы определить, какую подписку следует использовать.

        +
          +
        • Группа ресурсов: Обратитесь к администратору Azure вашей организации, чтобы определить, какую группу ресурсов следует использовать.
        • +
      • +
    • +
    • Сведения о кластере:

      +
        +
      • Имя кластера Kubernetes: введите имя кластера.

      • +
      • Регион: Выберите регион.

      • +
      • Зоны доступности: Выберите необходимые зоны доступности. Для производственных кластеров рекомендуется выбирать несколько зон доступности.

      • +
    • +
    • Основной пул узлов:

      +
        +
      • Размер узла: Мы рекомендуем выбирать виртуальные машины с минимальным объемом оперативной памяти 16 ГБ, но вы можете выбрать размер виртуальной машины по своему усмотрению.

      • +
      • Метод масштабирования: Выберите метод масштабирования.

      • +
      • Диапазон количества узлов: Выберите диапазон для количества узлов.

      • +
    • +
    • Пулы узлов:

      +
        +
      • Включить виртуальные узлы: Установите флажок, чтобы включить виртуальные узлы.

      • +
      • Включить наборы масштабирования виртуальных машин: Рекомендуется выбрать enabled.

      • +
    • +
    • Networking:

      +
        +
      • Настройка сети: Рекомендуется выбрать Kubenet.

      • +
      • Префикс имени DNS: Введите префикс имени DNS.

      • +
      • Маршрутизация трафика:

        +
          +
        • Балансировщик нагрузки: Standard.

        • +
        • Маршрутизация HTTP-приложений: Не требуется.

        • +
      • +
    • +
    +
      +
    1. После настройки параметров нажмите Обзор + создать, а затем Создать, когда проверка завершится. Создание кластера займет несколько минут.
    2. +
    +

    Подключение к кластеру

      +
    1. Перейдите к кластеру, который вы создали в сервисах Kubernetes, и щелкните его.
    2. +
    3. На панели навигации слева нажмите Overview.
    4. +
    5. На появившейся странице Обзор нажмите Подключиться, чтобы просмотреть группу ресурсов и подписку.
    6. +
    +

    Настройка подписки и учетных данных

    Вы можете использовать Azure Cloud Shell для выполнения следующих процедур.
    +
      +
    1. Выполните следующую команду, чтобы установить подписку.
    2. +
    +
    az account set --subscription EXAMPLE-SUBSCRIPTION-ID
    +
    +
      +
    1. Выполните следующую команду, чтобы загрузить учетные данные и настроить Kubernetes CLI на их использование.
    2. +
    +
    az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME
    +
    +
    +Используйте ту же оболочку для следующих процедур. Если вы переключитесь на другую оболочку, выполните предыдущие команды снова.
    +

    Использование Azure Blob Storage в качестве внешнего хранилища объектов

    Azure Blob Storage - это версия AWS Simple Storage Service (S3) в Azure.

    +
      +
    • Создайте учетную запись хранилища и контейнер
    • +
    +
    az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n testmilvus --account-name milvustesting1
    +
    +
      +
    • Получите секретный ключ, используйте первое значение
    • +
    +
    az storage account keys list --account-name milvustesting2
    +
    +
      +
    • Добавьте файл values.yaml
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # the storage account container name
    +  cloudProvider: azure
    +  useSSL: true
    +  accessKey: "milvustesting1" # the storage account name
    +  secretKey: "<secret-key>" 
    +
    +

    Развертывание Milvus

    Теперь кластер Kubernetes готов. Давайте развернем Milvus прямо сейчас.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    В предыдущих командах мы добавляем репо графиков Milvus Helm локально и обновляем репо для получения последних графиков. Затем мы устанавливаем экземпляр Milvus и называем его my-release.

    +

    Обратите внимание на значение config service.type, которое указывает на то, что мы хотим открыть экземпляр Milvus через балансировщик нагрузки Layer-4.

    +

    Проверка развертывания

    Когда все поды запущены, выполните следующую команду, чтобы получить внешний IP-адрес.

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    Hello Milvus

    Пожалуйста, обратитесь к Hello Milvus, измените значение host на внешний IP-адрес, а затем запустите код.

    +

    Что дальше

    Если вы хотите узнать, как развернуть Milvus в других облаках:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.json b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.json new file mode 100644 index 000000000..f270a66c0 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.json @@ -0,0 +1 @@ +{"codeList":["export DNS_LABEL=\"milvustest\" # Your DNS label must be unique within its Azure location.\nexport NAMESPACE=\"ingress-basic\"\n","helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\nhelm repo update\nhelm install ingress-nginx ingress-nginx/ingress-nginx \\\n --create-namespace \\\n --namespace $NAMESPACE \\\n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-dns-label-name\"=$DNS_LABEL \\ \n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path\"=/healthz\n","kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller\n","# Public IP address of your ingress controller\nIP=\"MY_EXTERNAL_IP\"\n\n# Get the resource-id of the public IP\nPUBLICIPID=$(az network public-ip list --query \"[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]\" --output tsv)\n\n# Update public IP address with DNS name\naz network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL\n\n# Display the FQDN\naz network public-ip show --ids $PUBLICIPID --query \"[dnsSettings.fqdn]\" --output tsv\n# sample output: milvustest.eastus2.cloudapp.azure.com\n","helm repo add jetstack https://charts.jetstack.io\nhelm repo update\nhelm install cert-manager jetstack/cert-manager \\\n --namespace $NAMESPACE \\\n --set installCRDs=true\n","apiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt\nspec:\n acme:\n server: https://acme-v02.api.letsencrypt.org/directory\n email: MY_EMAIL_ADDRESS\n privateKeySecretRef:\n name: letsencrypt\n solvers:\n - http01:\n ingress:\n class: nginx\n","kubectl apply -f cluster-issuer.yaml\n","kubectl apply -f ingress.yaml\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n annotations:\n cert-manager.io/cluster-issuer: letsencrypt\n nginx.ingress.kubernetes.io/backend-protocol: GRPC\n nginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n nginx.ingress.kubernetes.io/proxy-body-size: 2048m\nspec:\n ingressClassName: nginx\n tls:\n - hosts:\n - milvustest.eastus2.cloudapp.azure.com # the FQDN\n secretName: tls-secret\n rules:\n - host: milvustest.eastus2.cloudapp.azure.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl get certificate \nNAME READY SECRET AGE\ntls-secret True tls-secret 8m7s\nkubectl get ingress\nNAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus nginx milvustest.eastus2.cloudapp.azure.com EXTERNAL-IP 80, 443 8m15s\n","connections.connect(\"default\",uri=\"https://milvustest.eastus2.cloudapp.azure.com:443\") \n"],"headingContent":"Configure ingress nginx with Milvus","anchorList":[{"label":"Настройка входящего nginx с помощью Milvus","href":"Configure-ingress-nginx-with-Milvus","type":1,"isActive":false},{"label":"Настройка входящего nginx","href":"Configure-ingress-nginx","type":2,"isActive":false},{"label":"Установите cert-manager","href":"Install-cert-manager","type":2,"isActive":false},{"label":"Создайте кластерный эмитент CA","href":"Create-a-CA-cluster-issuer","type":2,"isActive":false},{"label":"Развертывание Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Создайте ингресс-маршрут Milvus","href":"Create-Milvus-ingress-route","type":2,"isActive":false},{"label":"Verify","href":"Verify","type":2,"isActive":false},{"label":"Привет Milvus","href":"Hello-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.md b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.md new file mode 100644 index 000000000..f29f82b19 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/azure/ingress.md @@ -0,0 +1,235 @@ +--- +id: ingress.md +title: Настройка входящего nginx с помощью Milvus +related_key: ingress nginx +summary: 'Узнайте, как настроить ingress nginx с помощью Milvus.' +--- +

    Настройка входящего nginx с помощью Milvus

    В этой теме рассказывается о том, как настроить ingress nginx с помощью Milvus. Для получения более подробной информации обратитесь к разделу ingress-nginx.

    +

    Настройка входящего nginx

      +
    • Установите env.
    • +
    +
    export DNS_LABEL="milvustest" # Your DNS label must be unique within its Azure location.
    +export NAMESPACE="ingress-basic"
    +
    +
      +
    • Установить ingress nginx
    • +
    +
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    +helm repo update
    +helm install ingress-nginx ingress-nginx/ingress-nginx \
    +    --create-namespace \
    +    --namespace $NAMESPACE \
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \  
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
    +
    +
      +
    • Получить внешний IP-адрес.
    • +
    +
    kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller
    +
    +
      +
    • Настройте FQDN для вашего ингресс-контроллера.
    • +
    +
    # Public IP address of your ingress controller
    +IP="MY_EXTERNAL_IP"
    +
    +# Get the resource-id of the public IP
    +PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
    +
    +# Update public IP address with DNS name
    +az network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL
    +
    +# Display the FQDN
    +az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    +# sample output: milvustest.eastus2.cloudapp.azure.com
    +
    +

    Установите cert-manager

    helm repo add jetstack https://charts.jetstack.io
    +helm repo update
    +helm install cert-manager jetstack/cert-manager \
    +    --namespace $NAMESPACE \
    +    --set installCRDs=true
    +
    +

    Создайте кластерный эмитент CA

      +
    • Создайте кластерный эмитент, например cluster-issuer.yaml, используя следующий пример манифеста. Замените MY_EMAIL_ADDRESS на действительный адрес вашей организации.
    • +
    +
    apiVersion: cert-manager.io/v1
    +kind: ClusterIssuer
    +metadata:
    +  name: letsencrypt
    +spec:
    +  acme:
    +    server: https://acme-v02.api.letsencrypt.org/directory
    +    email: MY_EMAIL_ADDRESS
    +    privateKeySecretRef:
    +      name: letsencrypt
    +    solvers:
    +    - http01:
    +        ingress:
    +          class: nginx
    +
    +
      +
    • Примените эмитент с помощью команды kubectl apply.
    • +
    +
    kubectl apply -f cluster-issuer.yaml
    +
    +

    Развертывание Milvus

    обратитесь к Azure, обратите внимание на значение config service.type, его нужно изменить на ClusterIP.

    +

    Создайте ингресс-маршрут Milvus

    kubectl apply -f ingress.yaml
    +
    +

    содержимое ingress.yaml:

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  name: my-release-milvus
    +  annotations:
    +    cert-manager.io/cluster-issuer: letsencrypt
    +    nginx.ingress.kubernetes.io/backend-protocol: GRPC
    +    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    +    nginx.ingress.kubernetes.io/proxy-body-size: 2048m
    +spec:
    +  ingressClassName: nginx
    +  tls:
    +  - hosts:
    +    - milvustest.eastus2.cloudapp.azure.com # the FQDN
    +    secretName: tls-secret
    +  rules:
    +    - host: milvustest.eastus2.cloudapp.azure.com
    +      http:
    +        paths:
    +          - path: /
    +            pathType: Prefix
    +            backend:
    +              service:
    +                name: my-release-milvus
    +                port:
    +                  number: 19530
    +
    +

    Verify

    kubectl get certificate 
    +NAME         READY   SECRET       AGE
    +tls-secret   True    tls-secret   8m7s
    +kubectl get ingress
    +NAME                CLASS   HOSTS                                   ADDRESS        PORTS     AGE
    +my-release-milvus   nginx   milvustest.eastus2.cloudapp.azure.com   EXTERNAL-IP   80, 443   8m15s
    +
    +

    Привет Milvus

    Пожалуйста, обратитесь к Hello Milvus, измените uri args, затем запустите код.

    +
    connections.connect("default",uri="https://milvustest.eastus2.cloudapp.azure.com:443") 
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.json b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.json new file mode 100644 index 000000000..a13d3844c --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.json @@ -0,0 +1 @@ +{"codeList":["gcloud compute networks create milvus-network \\\n --project=milvus-testing-nonprod \\\n --subnet-mode=auto \\\n --mtu=1460 \\\n --bgp-routing-mode=regional\n","gcloud compute firewall-rules create milvus-network-allow-icmp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows ICMP connections from any source to any instance on the network.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=icmp\n\ngcloud compute firewall-rules create milvus-network-allow-internal \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows connections from any source in the network IP range to any instance on the network using all protocols.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=10.128.0.0/9 \\\n --action=ALLOW --rules=all\n\ngcloud compute firewall-rules create milvus-network-allow-rdp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows RDP connections from any source to any instance on the network using port 3389.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:3389\n\ngcloud compute firewall-rules create milvus-network-allow-ssh \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows TCP connections from any source to any instance on the network using port 22.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:22\n","gcloud compute firewall-rules create allow-milvus-in \\\n --project=milvus-testing-nonprod \\\n --description=\"Allow ingress traffic for Milvus on port 19530\" \\\n --direction=INGRESS \\\n --priority=1000 \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --action=ALLOW \\\n --rules=tcp:19530 \\\n --source-ranges=0.0.0.0/0\n","gcloud container clusters create \"milvus-cluster-1\" \\\n --project \"milvus-testing-nonprod\" \\\n --zone \"us-west1-a\" \\\n --workload-pool \"milvus-testing-nonprod.svc.id.goog\" \\\n --no-enable-basic-auth \\\n --cluster-version \"1.28.10-gke.1075001\" \\\n --release-channel \"regular\" \\\n --machine-type \"c2-standard-4\" \\\n --image-type \"COS_CONTAINERD\" \\\n --disk-type \"pd-standard\" \\\n --disk-size \"100\" \\\n --max-pods-per-node \"110\" \\\n --num-nodes \"3\" \\\n --enable-ip-alias \\\n --network \"projects/milvus-testing-nonprod/global/networks/milvus-network\" \\\n --subnetwork \"projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network\"\n","gcloud container clusters get-credentials milvus-cluster-1 --zone \"us-west1-a\"\n","gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n accessKey: \"\"\n secretKey: \"\"\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy a Milvus Cluster on GKE","anchorList":[{"label":"Развертывание кластера Milvus на GKE","href":"Deploy-a-Milvus-Cluster-on-GKE","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-start","type":2,"isActive":false},{"label":"Настройка сети","href":"Set-up-the-network","type":2,"isActive":false},{"label":"Создание кластера Kubernetes","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"Использование облачного хранилища Google (GCS) в качестве внешнего хранилища объектов","href":"Use-Google-Cloud-Storage-GCS-as-external-object-storage","type":2,"isActive":false},{"label":"Развертывание Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Проверка развертывания","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"Hello Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.md b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.md new file mode 100644 index 000000000..bad621738 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp.md @@ -0,0 +1,287 @@ +--- +id: gcp.md +title: Развертывание кластера Milvus на GKE +related_key: cluster +summary: 'Узнайте, как развернуть кластер Milvus на GKE.' +--- +

    Развертывание кластера Milvus на GKE

    Milvus - это облачная векторная база данных, которая может быть развернута в различных облачных средах. В этом руководстве вы узнаете все подробности о настройке Milvus на Google Cloud Platform (GCP).

    +

    + + Deploy a Milvus cluster on GCP + Развертывание кластера Milvus на GCP

    +

    Прежде чем начать

    Чтобы развернуть Milvus на GCP, убедитесь, что

    + +

    Настройка сети

    Чтобы обеспечить безопасность Milvus, необходимо создать логически изолированную виртуальную сеть в проекте GCP. Следующая команда создает VPC.

    +
    gcloud compute networks create milvus-network \
    +    --project=milvus-testing-nonprod \
    +    --subnet-mode=auto \
    +    --mtu=1460 \
    +    --bgp-routing-mode=regional
    +
    +

    Чтобы облегчить работу, вам также нужно настроить несколько правил брандмауэра, чтобы разрешить внешний трафик по ICMP, RDP и SSH, а также трафик внутри VPC.

    +
    gcloud compute firewall-rules create milvus-network-allow-icmp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows ICMP connections from any source to any instance on the network." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=icmp
    +
    +gcloud compute firewall-rules create milvus-network-allow-internal \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows connections from any source in the network IP range to any instance on the network using all protocols." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=10.128.0.0/9 \
    +    --action=ALLOW --rules=all
    +
    +gcloud compute firewall-rules create milvus-network-allow-rdp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows RDP connections from any source to any instance on the network using port 3389." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:3389
    +
    +gcloud compute firewall-rules create milvus-network-allow-ssh \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows TCP connections from any source to any instance on the network using port 22." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:22
    +
    +

    Наконец, нужно разрешить входящий трафик для экземпляра Milvus, который мы создадим позже, на порт 19530.

    +
    gcloud compute firewall-rules create allow-milvus-in \
    +    --project=milvus-testing-nonprod  \
    +    --description="Allow ingress traffic for Milvus on port 19530" \
    +    --direction=INGRESS \
    +    --priority=1000 \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --action=ALLOW \
    +    --rules=tcp:19530 \
    +    --source-ranges=0.0.0.0/0
    +
    +

    Создание кластера Kubernetes

    В этом руководстве мы будем использовать службу Google Kubernetes Engine (GKE) для создания кластера Kubernetes с двумя узлами в зоне us-west1-a. Каждый узел представляет собой виртуальную машину e2-standard-4 Compute Engine под управлением образа COS_CONTAINERD.

    +
    +

    Для обеспечения стабильности сервиса рекомендуется использовать машины с минимальным объемом памяти 16 ГБ.

    +
    +
    gcloud container clusters create "milvus-cluster-1" \
    +    --project "milvus-testing-nonprod" \
    +    --zone "us-west1-a" \
    +    --workload-pool "milvus-testing-nonprod.svc.id.goog" \
    +    --no-enable-basic-auth \
    +    --cluster-version "1.28.10-gke.1075001" \
    +    --release-channel "regular" \
    +    --machine-type "c2-standard-4" \
    +    --image-type "COS_CONTAINERD" \
    +    --disk-type "pd-standard" \
    +    --disk-size "100" \
    +    --max-pods-per-node "110" \
    +    --num-nodes "3" \
    +    --enable-ip-alias \
    +    --network "projects/milvus-testing-nonprod/global/networks/milvus-network" \
    +    --subnetwork "projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network"
    +
    +

    На запуск кластера Kubernetes уйдет несколько минут. Как только кластер будет готов, выполните следующую команду, чтобы получить его учетные данные и запустить команды kubectl в терминале для удаленного взаимодействия с кластером.

    +
    gcloud container clusters get-credentials milvus-cluster-1 --zone "us-west1-a"
    +
    +

    Использование облачного хранилища Google (GCS) в качестве внешнего хранилища объектов

      +
    • Создайте ведро.
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • Сгенерируйте ключ доступа пользователя и секретный ключ, для этого перейдите на страницу хранилища вашего проекта. В левой боковой панели панели инструментов нажмите Google Cloud Storage, а затем Settings. Выберите вкладку INTEROPERABILITY. Если вы еще не включили эту функцию, нажмите на Interoperable Access. Затем нажмите кнопку CREATE A KEY, чтобы создать ключ.
    • +
    +

    + + GCP Access keys for your user account + Ключи доступа к GCP для вашей учетной записи пользователя

    +
      +
    • Добавьте файл values.yaml
    • +
    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    accessKey: "<access-key>"
    +    secretKey: "<secret-key>"
    +
    +

    Развертывание Milvus

    Теперь кластер Kubernetes готов. Давайте развернем Milvus прямо сейчас.

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    В предыдущих командах мы добавляем репо графиков Milvus Helm локально и обновляем репо для получения последних графиков. Затем мы устанавливаем экземпляр Milvus и называем его my-release.

    +

    Обратите внимание на значение config service.type, которое указывает на то, что мы хотим открыть экземпляр Milvus через балансировщик нагрузки Layer-4.

    +

    Если вы хотите использовать экземпляр Milvus через балансировщик нагрузки уровня 7, прочтите эту статью.

    +

    Проверка развертывания

    Когда все стручки запущены, выполните следующую команду, чтобы получить внешний IP-адрес.

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    Hello Milvus

    Обратитесь к Hello Milvus, измените значение host на внешний IP-адрес, а затем запустите код.

    +

    Что дальше

    Если вы хотите узнать, как развернуть Milvus в других облаках:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.json b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.json new file mode 100644 index 000000000..4875d2013 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --set service.type=ClusterIP\n","helm upgrade my-release milvus/milvus -f tls.yaml\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n tlsMode: 1\n","apiVersion: cloud.google.com/v1\nkind: BackendConfig\nmetadata:\n name: my-release-backendconfig\n namespace: default\nspec:\n healthCheck:\n port: 9091\n requestPath: /healthz\n type: HTTP\n","kubectl apply -f backendconfig.yaml\n","kubectl annotate service my-release-milvus \\\n cloud.google.com/app-protocols='{\"milvus\":\"HTTP2\"}' \\\n cloud.google.com/backend-config='{\"default\": \"my-release-backendconfig\"}' \\\n cloud.google.com/neg='{\"ingress\": true}' --overwrite\n","# Generates a tls.key.\nopenssl genrsa -out tls.key 2048\n\n# Creates a certificate and signs it with the preceding key.\nopenssl req -new -key tls.key -out tls.csr \\\n -subj \"/CN=my-release.milvus.io\"\n\nopenssl x509 -req -days 99999 -in tls.csr -signkey tls.key \\\n -out tls.crt\n","kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key\n","apiVersion: networking.gke.io/v1\nkind: ManagedCertificate\nmetadata:\n name: my-release-milvus-tls\nspec:\n domains:\n - my-release.milvus.io\n","kubectl apply -f ./managed-crt.yaml\n","kubectl get -f ./managed-crt.yaml -o yaml -w\n","status:\n certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e\n certificateStatus: Provisioning\n domainStatus:\n - domain: my-release.milvus.io\n status: Provisioning\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\nspec:\n tls:\n - hosts:\n - my-release.milvus.io\n secretName: my-release-milvus-tls\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\n annotations:\n networking.gke.io/managed-certificates: \"my-release-milvus-tls\"\nspec:\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ./config/samples/ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus my-release.milvus.io 80 4s\nmy-release-milvus my-release.milvus.io 34.111.144.65 80, 443 41m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", server_pem_path=\"tls.crt\", secure=True, server_name=\"my-release.milvus.io\")\n\n# For Google-managed certificates, there is not need to do so.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", secure=True, server_name=\"my-release.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on GCP","anchorList":[{"label":"Настройка балансировщика нагрузки Layer-7 для Milvus на GCP","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-GCP","type":1,"isActive":false},{"label":"Проверка соединения через балансировщик нагрузки Layer-7","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.md b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.md new file mode 100644 index 000000000..652f615fc --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcp_layer7.md @@ -0,0 +1,215 @@ +--- +id: gcp_layer7.md +title: Настройка балансировщика нагрузки Layer-7 для Milvus на GCP +related_key: cluster +summary: >- + Узнайте, как развернуть кластер Milvus за балансировщиком нагрузки Layer-7 на + GCP. +--- +

    Настройка балансировщика нагрузки Layer-7 для Milvus на GCP

    По сравнению с балансировщиком нагрузки уровня 4, балансировщик нагрузки уровня 7 предлагает интеллектуальную балансировку нагрузки и возможности кэширования и является отличным выбором для облачных нативных сервисов.

    +

    В этом руководстве вы узнаете, как настроить балансировщик нагрузки уровня 7 для кластера Milvus, уже работающего за балансировщиком нагрузки уровня 4.

    +

    Перед началом работы

    +

    Настройка конфигураций Milvus

    Это руководство предполагает, что вы уже развернули кластер Milvus за балансировщиком нагрузки Layer-4 на GCP.

    +

    Перед настройкой балансировщика нагрузки Layer-7 для этого кластера Milvus выполните следующую команду, чтобы удалить балансировщик нагрузки Layer-4.

    +
    helm upgrade my-release milvus/milvus --set service.type=ClusterIP
    +
    +

    Как внутренняя служба балансировщика нагрузки Layer-7, Milvus должен отвечать определенным требованиям к шифрованию, чтобы он мог понимать HTTP/2-запросы от балансировщика нагрузки. Поэтому вам необходимо включить TLS на кластере Milvus следующим образом.

    +
    helm upgrade my-release milvus/milvus -f tls.yaml
    +
    +

    содержимое tls.yaml:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        tlsMode: 1
    +
    +

    Настройка конечной точки проверки работоспособности

    Чтобы обеспечить доступность сервиса, балансировка нагрузки Layer-7 на GCP требует проверки состояния здоровья внутреннего сервиса. Поэтому нам нужно создать BackendConfig, чтобы обернуть конечную точку проверки состояния здоровья, и связать BackendConfig с сервисом Milvus с помощью аннотаций.

    +

    Следующий фрагмент представляет собой настройки BackendConfig. Сохраните его как backendconfig.yaml для последующего использования.

    +
    apiVersion: cloud.google.com/v1
    +kind: BackendConfig
    +metadata:
    +  name: my-release-backendconfig
    +  namespace: default
    +spec:
    +  healthCheck:
    +    port: 9091
    +    requestPath: /healthz
    +    type: HTTP
    +
    +

    Затем выполните следующую команду для создания конечной точки проверки здоровья.

    +
    kubectl apply -f backendconfig.yaml
    +
    +

    Наконец, обновите аннотации службы Milvus, чтобы попросить балансировщик нагрузки Layer-7, который мы создадим позже, выполнять проверку здоровья с помощью только что созданной конечной точки.

    +
    kubectl annotate service my-release-milvus \
    +    cloud.google.com/app-protocols='{"milvus":"HTTP2"}' \
    +    cloud.google.com/backend-config='{"default": "my-release-backendconfig"}' \
    +    cloud.google.com/neg='{"ingress": true}' --overwrite
    +
    +
    +
      +
    • Что касается первой аннотации,

      +

      Milvus является родным для gRPC, который построен на HTTP/2. Поэтому мы можем использовать HTTP/2 в качестве протокола связи между балансировщиком нагрузки Layer-7 и Milvus.

    • +
    • Что касается второй аннотации,

      +

      Milvus предлагает только конечную точку проверки здоровья через gRPC и HTTP/1. Нам нужно настроить BackendConfig для обертывания конечной точки проверки здоровья и связать ее с сервисом Milvus, чтобы балансировщик нагрузки Layer-7 запрашивал эту конечную точку о состоянии здоровья Milvus.

    • +
    • Что касается третьей аннотации,

      +

      В ней предлагается создать группу конечных точек сети (NEG) после создания ингресса. Когда NEG используются с GKE Ingress, контроллер Ingress облегчает создание всех аспектов балансировщика нагрузки. Сюда входит создание виртуального IP-адреса, правил переадресации, проверок работоспособности, правил брандмауэра и т. д. Подробности см. в документах Google Cloud.

    • +
    +
    +

    Подготовьте сертификаты TLS

    Для работы TLS требуются сертификаты. Существует два способа создания сертификатов: самоуправляемый и управляемый Google.

    +

    В этом руководстве используется my-release.milvus.io в качестве доменного имени для доступа к нашему сервису Milvus.

    +

    Создание самоуправляемых сертификатов

    Выполните следующие команды для создания сертификата.

    +
    # Generates a tls.key.
    +openssl genrsa -out tls.key 2048
    +
    +# Creates a certificate and signs it with the preceding key.
    +openssl req -new -key tls.key -out tls.csr \
    +    -subj "/CN=my-release.milvus.io"
    +
    +openssl x509 -req -days 99999 -in tls.csr -signkey tls.key \
    +    -out tls.crt
    +
    +

    Затем создайте секрет в кластере GKE с этими файлами для последующего использования.

    +
    kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
    +
    +

    Создание управляемых сертификатов Google

    Следующий фрагмент представляет собой настройку ManagedCertificate. Сохраните его как managed-crt.yaml для последующего использования.

    +
    apiVersion: networking.gke.io/v1
    +kind: ManagedCertificate
    +metadata:
    +  name: my-release-milvus-tls
    +spec:
    +  domains:
    +    - my-release.milvus.io
    +
    +

    Создайте управляемый сертификат, применив настройку к кластеру GKE следующим образом:

    +
    kubectl apply -f ./managed-crt.yaml
    +
    +

    Это может занять некоторое время. Вы можете проверить прогресс, выполнив команду

    +
    kubectl get -f ./managed-crt.yaml -o yaml -w
    +
    +

    Результат должен быть похож на следующий:

    +
    status:
    +  certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
    +  certificateStatus: Provisioning
    +  domainStatus:
    +  - domain: my-release.milvus.io
    +    status: Provisioning
    +
    +

    Как только certificateStatus станет активным, вы будете готовы к настройке балансировщика нагрузки.

    +

    Создание ингресса для генерации балансировщика нагрузки уровня 7

    Создайте YAML-файл с одним из следующих фрагментов.

    +
      +
    • Использование самоуправляемых сертификатов

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +spec:
      +  tls:
      +  - hosts:
      +    - my-release.milvus.io
      +    secretName: my-release-milvus-tls
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    • Использование управляемых Google сертификатов

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +  annotations:
      +    networking.gke.io/managed-certificates: "my-release-milvus-tls"
      +spec:
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    +

    Затем вы можете создать Ingress, применив этот файл к кластеру GKE.

    +
    kubectl apply -f ingress.yaml
    +
    +

    Теперь подождите, пока Google настроит балансировщик нагрузки Layer-7. Вы можете проверить прогресс, выполнив команду

    +
    kubectl  -f ./config/samples/ingress.yaml get -w
    +
    +

    Результат должен быть похож на следующий:

    +
    NAME                CLASS    HOSTS                  ADDRESS   PORTS   AGE
    +my-release-milvus   <none>   my-release.milvus.io             80      4s
    +my-release-milvus   <none>   my-release.milvus.io   34.111.144.65   80, 443   41m
    +
    +

    Как только в поле ADDRESS появится IP-адрес, балансировщик нагрузки Layer-7 будет готов к работе. В приведенном выше выводе отображаются оба порта - 80 и 443. Помните, что для вашего же блага всегда следует использовать порт 443.

    +

    Проверка соединения через балансировщик нагрузки Layer-7

    В этом руководстве используется PyMilvus для проверки соединения с сервисом Milvus за балансировщиком нагрузки Layer-7, который мы только что создали. Подробные шаги описаны здесь.

    +

    Обратите внимание, что параметры соединения зависят от выбранного вами способа управления сертификатами в Prepare TLS certificates.

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.
    +connections.connect("default", host="34.111.144.65", port="443", server_pem_path="tls.crt", secure=True, server_name="my-release.milvus.io")
    +
    +# For Google-managed certificates, there is not need to do so.
    +connections.connect("default", host="34.111.144.65", port="443", secure=True, server_name="my-release.milvus.io")
    +
    +
    +
      +
    • IP-адрес и номер порта в параметрах host и port должны совпадать с теми, что указаны в конце раздела Create an Ingress to generate a Layer-7 Load Balancer.
    • +
    • Если вы настроили DNS-запись для сопоставления доменного имени с IP-адресом хоста, замените IP-адрес в host на доменное имя и опустите server_name.
    • +
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.json b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.json new file mode 100644 index 000000000..834373662 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.json @@ -0,0 +1 @@ +{"codeList":["gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","kubectl create serviceaccount milvus-gcs-access-sa\n","gcloud iam service-accounts create milvus-gcs-access-sa \\\n --project=milvus-testing-nonprod\n","gcloud projects add-iam-policy-binding milvus-testing-nonprod \\\n --member \"serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\" \\\n --role \"roles/storage.admin\" \\\n --condition='title=milvus-testing-nonprod,expression=resource.service == \"storage.googleapis.com\" && resource.name.startsWith(\"projects/_/buckets/milvus-testing-nonprod\")'\n","gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \\\n --role \"roles/iam.workloadIdentityUser\" \\\n --member \"serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]\"\n","kubectl annotate serviceaccount milvus-gcs-access-sa \\\n --namespace default \\\n iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\n","curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email\n","helm install -f values.yaml my-release milvus/milvus\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nserviceAccount:\n create: false\n name: milvus-gcs-access-sa\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n useIAM: true\n"],"headingContent":"Configure GCS Access by Workload Identity","anchorList":[{"label":"Настройка доступа к GCS по идентификатору рабочей нагрузки","href":"Configure-GCS-Access-by-Workload-Identity","type":1,"isActive":false},{"label":"Перед началом работы","href":"Before-you-start","type":2,"isActive":false},{"label":"Настройка приложений для использования Workload Identity","href":"Configure-applications-to-use-Workload-Identity","type":2,"isActive":false},{"label":"Проверьте настройку Workload Identity","href":"Verify-the-Workload-Identity-setup","type":2,"isActive":false},{"label":"Разверните Milvus","href":"Deploy-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.md b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.md new file mode 100644 index 000000000..26c0f5341 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/gcp/gcs.md @@ -0,0 +1,151 @@ +--- +id: gcs.md +title: Настройка доступа к GCS по идентификатору рабочей нагрузки +related_key: 'gcs, storage, workload identity, iam' +summary: 'Узнайте, как настроить gcs с помощью Workload Identity.' +--- +

    Настройка доступа к GCS по идентификатору рабочей нагрузки

    В этой теме рассказывается о том, как настроить доступ к gcs по Workload Identity при установке Milvus с помощью helm. Для получения дополнительной информации см. раздел Workload Identity.

    +

    Перед началом работы

    Включите Workload Identity на кластерах и пулах узлов с помощью Google Cloud CLI или консоли Google Cloud. Workload Identity должна быть включена на уровне кластера, прежде чем вы сможете включить Workload Identity на пулах узлов.

    +

    Настройка приложений для использования Workload Identity

      +
    • Создайте ведро.
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • Создайте учетную запись службы Kubernetes для использования приложением.
    • +
    +
    kubectl create serviceaccount milvus-gcs-access-sa
    +
    +
      +
    • Создайте учетную запись службы IAM для приложения или используйте существующую учетную запись службы IAM. Вы можете использовать любую учетную запись службы IAM в любом проекте вашей организации.
    • +
    +
    gcloud iam service-accounts create milvus-gcs-access-sa \
    +    --project=milvus-testing-nonprod
    +
    +
      +
    • Убедитесь, что в учетной записи службы IAM есть необходимые роли. Дополнительные роли можно предоставить с помощью следующей команды:
    • +
    +
    gcloud projects add-iam-policy-binding milvus-testing-nonprod \
    +    --member "serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com" \
    +    --role "roles/storage.admin" \
    +    --condition='title=milvus-testing-nonprod,expression=resource.service == "storage.googleapis.com" && resource.name.startsWith("projects/_/buckets/milvus-testing-nonprod")'
    +
    +
      +
    • Разрешите учетной записи службы Kubernetes имперсонифицировать учетную запись службы IAM, добавив привязку политики IAM между двумя учетными записями службы. Эта привязка позволяет учетной записи службы Kubernetes действовать в качестве учетной записи службы IAM.
    • +
    +
    gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \
    +    --role "roles/iam.workloadIdentityUser" \
    +    --member "serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]"
    +
    +
      +
    • Укажите в аннотации к учетной записи службы Kubernetes адрес электронной почты учетной записи службы IAM.
    • +
    +
    kubectl annotate serviceaccount milvus-gcs-access-sa \
    +    --namespace default \
    +    iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com
    +
    +

    Проверьте настройку Workload Identity

    Обратитесь к разделу Workload Identity. Выполните следующую команду внутри бода:

    +
    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
    +
    +

    Если результат milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com, все в порядке.

    +

    Разверните Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    содержимое файла values.yaml:

    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +serviceAccount:
    +    create: false
    +    name: milvus-gcs-access-sa
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    useIAM: true
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.json b/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.json new file mode 100644 index 000000000..52bafb465 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.json @@ -0,0 +1 @@ +{"codeList":["# milvus-operator-certificate.yaml\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n name: milvus-operator-serving-cert\n namespace: milvus-operator\nspec:\n dnsNames:\n - milvus-operator-webhook-service.milvus-operator.svc\n - milvus-operator-webhook-service.milvus-operator.svc.cluster.local\n issuerRef:\n kind: Issuer\n name: milvus-operator-selfsigned-issuer\n secretName: milvus-operator-webhook-cert\n---\napiVersion: cert-manager.io/v1\nkind: Issuer\nmetadata:\n name: milvus-operator-selfsigned-issuer\n namespace: milvus-operator\nspec:\n selfSigned: {}\n","kubectl apply -f milvus-operator-certificate.yaml\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update milvus-operator\n","helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator\n"],"headingContent":"Deploy a Milvus Cluster on OpenShift","anchorList":[{"label":"Развертывание кластера Milvus на OpenShift","href":"Deploy-a-Milvus-Cluster-on-OpenShift","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Шаг 1: Установите Cert Manager","href":"Step-1-Install-Cert-Manager","type":2,"isActive":false},{"label":"Шаг 2: Выпуск самоподписного сертификата для Milvus Operator","href":"Step-2-Issue-a-Self-Signed-Certificate-for-Milvus-Operator","type":2,"isActive":false},{"label":"Шаг 3: Установите Milvus Operator","href":"Step-3-Install-Milvus-Operator","type":2,"isActive":false},{"label":"Шаг 4: Развертывание Milvus","href":"Step-4-Deploy-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-Next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.md b/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.md new file mode 100644 index 000000000..4d24fe45a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/clouds/openshift/openshift.md @@ -0,0 +1,183 @@ +--- +id: openshift.md +title: Развертывание кластера Milvus на OpenShift +related_key: cluster +summary: 'Узнайте, как развернуть кластер Milvus на OpenShift.' +--- +

    Развертывание кластера Milvus на OpenShift

    В этой теме представлено пошаговое руководство по развертыванию Milvus на OpenShift.

    +

    Предварительные условия

    Прежде чем начать процесс развертывания, убедитесь, что у вас есть:

    +
      +
    • Работающий кластер OpenShift.
    • +
    • Доступ к кластеру OpenShift с достаточными привилегиями (рольcluster-admin или эквивалентная).
    • +
    • Доступ к веб-консоли OpenShift Container Platform.
    • +
    +

    Шаг 1: Установите Cert Manager

    Cert Manager необходим для управления TLS-сертификатами для Milvus Operator.

    +
      +
    1. Найдите подходящую версию cert-manager для вашей версии OpenShift: Cert Manager Releases.

    2. +
    3. Установите Cert Manager, следуя официальному руководству: Cert Manager Installation.

    4. +
    5. Убедитесь, что Cert Manager работает:

      +
        +
      1. В консоли openshift перейдите в Workloads > Pods. Выберите проект cert-manager.

        +

        + + cert-manager-1 + cert-manager-1

      2. +
      3. Убедитесь, что все подсистемы готовы. Например, на изображении ниже видно, что подсистемы еще запускаются. Подождите, пока все эти подсистемы не будут готовы.

        +

        + + cert-manager-2 + cert-manager-2

      4. +
    6. +
    +

    Шаг 2: Выпуск самоподписного сертификата для Milvus Operator

    Убедитесь, что вы вошли в систему под именем kubeadmin или обладаете эквивалентными привилегиями.

    +
      +
    1. Создайте следующий файл манифеста с именем milvus-operator-certificate.yaml:

      +
      # milvus-operator-certificate.yaml
      +apiVersion: cert-manager.io/v1
      +kind: Certificate
      +metadata:
      +  name: milvus-operator-serving-cert
      +  namespace: milvus-operator
      +spec:
      +  dnsNames:
      +  - milvus-operator-webhook-service.milvus-operator.svc
      +  - milvus-operator-webhook-service.milvus-operator.svc.cluster.local
      +  issuerRef:
      +    kind: Issuer
      +    name: milvus-operator-selfsigned-issuer
      +  secretName: milvus-operator-webhook-cert
      +---
      +apiVersion: cert-manager.io/v1
      +kind: Issuer
      +metadata:
      +  name: milvus-operator-selfsigned-issuer
      +  namespace: milvus-operator
      +spec:
      +  selfSigned: {}
      +
    2. +
    3. Примените файл:

      +
      kubectl apply -f milvus-operator-certificate.yaml
      +
    4. +
    +

    Шаг 3: Установите Milvus Operator

    Теперь вы можете приступить к установке Milvus Operator. Рекомендуется использовать Helm для установки Milvus Operator, чтобы упростить процесс настройки.

    +
      +
    1. Добавьте репозиторий Milvus Operator Helm:

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/
      +helm repo update milvus-operator
      +
    2. +
    3. Install Milvus Operator:

      +
      helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator
      +
    4. +
    +

    Шаг 4: Развертывание Milvus

    Следуйте остальной части руководства на сайте документации Milvus: Deploy Milvus.

    +

    Что дальше

    Если вы хотите узнать, как развернуть Milvus в других облаках:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.json b/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.json new file mode 100644 index 000000000..4f1e1d4f0 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl create namespace observability\n$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability\n","$ kubectl get deployment jaeger-operator -n observability\n\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\njaeger-operator 1 1 1 1 48s\n","apiVersion: jaegertracing.io/v1\nkind: Jaeger\nmetadata:\n name: jaeger\n","$ kubectl apply -f simplest.yaml\n","$ kubectl get jaegers\n\nNAME STATUS VERSION STRATEGY STORAGE AGE\njaeger Running 1.62.0 allinone memory 13s\n","extraConfigFiles:\n user.yaml: |+\n trace:\n exporter: jaeger\n sampleFraction: 1\n jaeger:\n url: \"http://jaeger-collector:14268/api/traces\"\n","$ helm repo add zilliztech https://zilliztech.github.io/milvus-helm\n$ helm repo update\n$ helm upgrade --install -f values.yaml my-release milvus/milvus\n","$ helm upgrade my-release -f values.yaml milvus/milvus\n","$ kubectl get ingress\n\nNAME CLASS HOSTS ADDRESS PORTS AGE\njaeger-query * 192.168.122.34 80 14m\n"],"headingContent":"Configure Trace","anchorList":[{"label":"Настройка трассировки","href":"Configure-Trace","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Деплой Jaeger","href":"Deply-Jaeger","type":2,"isActive":false},{"label":"Установите Milvus с помощью Helm Chart","href":"Install-Milvus-with-Helm-Chart","type":2,"isActive":false},{"label":"Просмотр трасс","href":"View-Traces","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.md b/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.md new file mode 100644 index 000000000..bc45a3773 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/config_jaeger_tracing.md @@ -0,0 +1,148 @@ +--- +id: config_jaeger_tracing.md +title: Настройка трассировки +related_key: 'Jaeger, Milvus, Trace' +summary: >- + В этом руководстве приведены инструкции по настройке Jaeger для сбора трасс + для Milvus. +--- +

    Настройка трассировки

    В этом руководстве приведены инструкции по настройке Jaeger для сбора трасс для Milvus.

    +

    Предварительные условия

      +
    • Вы установили необходимые инструменты, включая Helm и Kubectl.
    • +
    • Должен быть установлен Cert-manager версии 1.6.1 или выше. Руководство по установке можно найти здесь.
    • +
    +

    Деплой Jaeger

    Jaeger - это платформа распределенной трассировки, выпущенная с открытым исходным кодом компанией Uber Technologies.

    +

    1. Установка оператора Jaeger на Kubernetes

    Чтобы установить оператор, выполните команду :

    +
    $ kubectl create namespace observability
    +$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability
    +
    +

    На этом этапе должно быть доступно развертывание jaeger-operator. Вы можете просмотреть его, выполнив следующую команду:

    +
    $ kubectl get deployment jaeger-operator -n observability
    +
    +NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    +jaeger-operator   1         1         1            1           48s
    +
    +

    2. Развертывание Jaeger

    Самый простой способ создать экземпляр Jaeger - это создать YAML-файл, как показано в следующем примере. Это позволит установить стратегию AllInOne по умолчанию, которая развертывает образ "все в одном" (объединяющий jaeger-agent, jaeger-collector, jaeger-query и Jaeger UI) в одной капсуле, по умолчанию использующей хранилище in-memory.

    +

    Если вы хотите хранить трассы в течение длительного времени, обратитесь к production-strategy.

    +
    apiVersion: jaegertracing.io/v1
    +kind: Jaeger
    +metadata:
    +  name: jaeger
    +
    +

    Затем YAML-файл можно использовать с помощью kubectl:

    +
    $ kubectl apply -f simplest.yaml
    +
    +

    Через несколько секунд будет доступен новый in-memory all-in-one экземпляр Jaeger, подходящий для быстрых демонстраций и целей разработки. Чтобы проверить, какие экземпляры были созданы, перечислите объекты jaeger:

    +
    $ kubectl get jaegers
    +
    +NAME     STATUS    VERSION   STRATEGY   STORAGE   AGE
    +jaeger   Running   1.62.0    allinone   memory    13s
    +
    +

    Установите Milvus с помощью Helm Chart

    Вы можете установить или обновить Milvus с Helm Chart с помощью следующих настроек:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    trace:
    +      exporter: jaeger
    +      sampleFraction: 1
    +      jaeger:
    +        url: "http://jaeger-collector:14268/api/traces"
    +
    +

    Чтобы применить вышеуказанные настройки к новому развертыванию Milvus, можно выполнить следующую команду:

    +
    $ helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +$ helm repo update
    +$ helm upgrade --install -f values.yaml my-release milvus/milvus
    +
    +

    Чтобы применить вышеуказанные настройки к существующему развертыванию Milvus, можно выполнить следующую команду:

    +
    $ helm upgrade my-release -f values.yaml milvus/milvus
    +
    +

    Просмотр трасс

    После развертывания Jaeger и Milvus с помощью Helm Chart вход в систему был включен с помощью dfault. Вы можете просмотреть ингресс, выполнив следующую команду:

    +
    $ kubectl get ingress
    +
    +NAME           CLASS    HOSTS   ADDRESS         PORTS   AGE
    +jaeger-query   <none>   *       192.168.122.34  80      14m
    +
    +

    После того как ингресс доступен, вы можете получить доступ к пользовательскому интерфейсу Jaeger, перейдя по адресу http://${ADDRESS}. Замените ${ADDRESS} на фактический IP-адрес ингресса.

    +

    На следующем снимке экрана показан пользовательский интерфейс Jaeger с трассировками Milvus во время операции поиска и операции сбора нагрузки:

    +

    + + Trace Search Request + Трассировка запроса на поиск

    +

    + + Trace Load Collection Request + Трассировка запроса на сбор нагрузки

    diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-docker.json b/localization/v2.5.x/site/ru/adminGuide/configure-docker.json new file mode 100644 index 000000000..b0a7af5ac --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-docker.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml\n","# For Milvus standalone\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n","...\n standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.2.13\n command: [\"milvus\", \"run\", \"standalone\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml # Map the local path to the container path\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n...\n","$ sudo docker compose up -d\n"],"headingContent":"Configure Milvus with Docker Compose","anchorList":[{"label":"Настройка Milvus с помощью Docker Compose","href":"Configure-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"Скачайте файл конфигурации","href":"Download-a-configuration-file","type":2,"isActive":false},{"label":"Изменение файла конфигурации","href":"Modify-the-configuration-file","type":2,"isActive":false},{"label":"Скачайте установочный файл","href":"Download-an-installation-file","type":2,"isActive":false},{"label":"Измените установочный файл","href":"Modify-the-installation-file","type":2,"isActive":false},{"label":"Запуск Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-docker.md b/localization/v2.5.x/site/ru/adminGuide/configure-docker.md new file mode 100644 index 000000000..48d7c4a9a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-docker.md @@ -0,0 +1,296 @@ +--- +id: configure-docker.md +label: Docker Compose +related_key: configure +summary: Настройте Milvus с помощью Docker Compose. +title: Настройка Milvus с помощью Docker Compose +--- +

    Настройка Milvus с помощью Docker Compose

    В этой теме описывается настройка компонентов Milvus и его сторонних зависимостей с помощью Docker Compose.

    +
    +В текущем выпуске все параметры вступают в силу только после перезапуска Milvus.
    +

    Скачайте файл конфигурации

    Загрузите milvus.yaml напрямую или с помощью следующей команды.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml
    +
    +

    Изменение файла конфигурации

    Настройте ваш экземпляр Milvus в соответствии со сценариями работы приложения, изменив соответствующие параметры в файле milvus.yaml.

    +

    Дополнительные сведения о каждом параметре см. в следующих ссылках.

    +

    Отсортировано по:

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазначениеПараметры
    Настройка производительности + +
    Данные и метаданные + +
    Администрирование + +
    Квоты и лимиты + +
    +
    +

    Скачайте установочный файл

    Скачайте установочный файл для Milvus standalone и сохраните его как docker-compose.yml.

    +

    Вы также можете просто выполнить следующую команду.

    +
    # For Milvus standalone
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +

    Измените установочный файл

    В разделе docker-compose.yml добавьте раздел volumes под каждым разделом milvus-standalone.

    +

    Сопоставьте локальный путь к вашему файлу milvus.yaml с соответствующими путями докер-контейнера к конфигурационным файлам /milvus/configs/milvus.yaml во всех секциях volumes.

    +
    ...
    +  standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:v2.2.13
    +    command: ["milvus", "run", "standalone"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml   # Map the local path to the container path
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +    ports:
    +      - "19530:19530"
    +      - "9091:9091"
    +    depends_on:
    +      - "etcd"
    +      - "minio"
    +...
    +
    +
    +Данные хранятся в папке /volumes в соответствии с конфигурацией по умолчанию в docker-compose.yml. Чтобы изменить папку для хранения данных, отредактируйте docker-compose.yml или запустите $ export DOCKER_VOLUME_DIRECTORY=.
    +

    Запуск Milvus

    Закончив изменение файла конфигурации и файла установки, вы можете запустить Milvus.

    +
    $ sudo docker compose up -d
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-helm.json b/localization/v2.5.x/site/ru/adminGuide/configure-helm.json new file mode 100644 index 000000000..843fca35c --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-helm.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml\n","# Extra configs for milvus.yaml\n# If set, this config will merge into milvus.yaml\n# Please follow the config structure in the milvus.yaml\n# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml\n# Note: this config will be the top priority which will override the config\n# in the image and helm chart.\nextraConfigFiles:\n user.yaml: |+\n # For example to set the graceful time for query nodes\n # queryNodes:\n # gracefulTime: 10\n","$ helm upgrade my-release milvus/milvus -f values.yaml\n","$ helm show values milvus/milvus\n","# For instance, upgrade the Milvus cluster with compaction disabled\n$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false\n"],"headingContent":"Configure Milvus with Helm Charts","anchorList":[{"label":"Настройка Milvus с помощью Helm Charts","href":"Configure-Milvus-with-Helm-Charts","type":1,"isActive":false},{"label":"Настройка Milvus через файл конфигурации","href":"Configure-Milvus-via-configuration-file","type":2,"isActive":false},{"label":"Настройка Milvus через командную строку","href":"Configure-Milvus-via-command-line","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-helm.md b/localization/v2.5.x/site/ru/adminGuide/configure-helm.md new file mode 100644 index 000000000..31f973fc7 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-helm.md @@ -0,0 +1,250 @@ +--- +id: configure-helm.md +label: Helm +related_key: configure +summary: Настройте Milvus с помощью Helm Charts. +title: Настройка Milvus с помощью Helm Charts +--- +

    Настройка Milvus с помощью Helm Charts

    В этой теме описывается настройка компонентов Milvus и его сторонних зависимостей с помощью Helm Charts.

    +
    +В текущем выпуске все параметры вступают в силу только после перезапуска Milvus.
    +

    Настройка Milvus через файл конфигурации

    Вы можете настроить Milvus с помощью файла конфигурации values.yaml.

    +

    Загрузить файл конфигурации

    Загрузите файл values.yaml напрямую или с помощью следующей команды.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml
    +
    +

    Изменение файла конфигурации

    Настройте экземпляр Milvus в соответствии с вашими сценариями применения, изменив соответствующие параметры в файле values.yaml.

    +

    В частности, найдите extraConfigFiles в values.yaml и поместите свои конфигурации в этот раздел следующим образом:

    +
    # Extra configs for milvus.yaml
    +# If set, this config will merge into milvus.yaml
    +# Please follow the config structure in the milvus.yaml
    +# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml
    +# Note: this config will be the top priority which will override the config
    +# in the image and helm chart.
    +extraConfigFiles:
    +  user.yaml: |+
    +    #    For example to set the graceful time for query nodes
    +    #    queryNodes:
    +    #      gracefulTime: 10
    +
    +

    Дополнительные сведения о каждом параметре см. в следующих ссылках.

    +

    Отсортировано по:

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазначениеПараметры
    Настройка производительности + +
    Данные и метаданные + +
    Администрирование + +
    Квоты и лимиты + +
    +
    +

    Другие параметры, специфичные для установки Kubernetes, см. в разделе Конфигурация Milvus Helm Chart.

    +

    Запуск Milvus

    Закончив модификацию файла конфигурации, вы можете запустить Milvus с помощью этого файла.

    +
    $ helm upgrade my-release milvus/milvus -f values.yaml
    +
    +

    Настройка Milvus через командную строку

    Кроме того, вы можете обновить конфигурацию Milvus непосредственно с помощью команды Helm.

    +

    Проверка настраиваемых параметров

    Перед обновлением можно проверить настраиваемые параметры с помощью диаграмм Helm.

    +
    $ helm show values milvus/milvus
    +
    +

    Запуск Milvus

    Настройте и запустите Milvus, добавив --values или --set в команду обновления.

    +
    # For instance, upgrade the Milvus cluster with compaction disabled
    +$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.json b/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.json new file mode 100644 index 000000000..d903e0a5a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.json @@ -0,0 +1 @@ +{"codeList":["$ lsblk | grep nvme\nnvme0n1 259:0 0 250.0G 0 disk \nnvme1n1 259:1 0 250.0G 0 disk \n","MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"==MYBOUNDARY==\"\n\n--==MYBOUNDARY==\nContent-Type: text/x-shellscript; charset=\"us-ascii\"\n\n#!/bin/bash\necho \"Running custom user data script\"\nif ( lsblk | fgrep -q nvme1n1 ); then\n mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker\n mkfs.xfs /dev/nvme1n1\n mount /dev/nvme1n1 /mnt/data\n chmod 0755 /mnt/data\n mv /var/lib/kubelet /mnt/data/\n mv /var/lib/docker /mnt/data/\n ln -sf /mnt/data/kubelet /var/lib/kubelet\n ln -sf /mnt/data/docker /var/lib/docker\n UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')\n echo \"UUID=$UUID /mnt/data xfs defaults,noatime 1 1\" >> /etc/fstab\nfi\necho 10485760 > /proc/sys/fs/aio-max-nr\n\n--==MYBOUNDARY==--\n","gcloud container node-pools create ${POOL_NAME} \\\n --cluster=${CLUSTER_NAME} \\\n --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \\\n --machine-type=${MACHINE_TYPE}\n","mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1\nmdadm -Ds > /etc/mdadm/mdadm.conf \nupdate-initramfs -u\n\nmkfs.xfs /dev/md0\nmkdir -p /var/lib/kubelet\necho '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab\nmount -a\n","#!/bin/bash\necho \"nvme init start...\"\nmkfs.xfs /dev/nvme0n1\nmkdir -p /mnt/data\necho '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab\nmount -a\n\nmkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods\nmkdir -p /var/lib/kubelet /var/lib/containerd /var/log/pods\n\necho '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab\nmount -a\n\necho \"nvme init end...\"\n","sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state\nsudo vim /etc/containerd/config.toml\n","[plugins.\"io.containerd.grpc.v1.cri\".containerd]\nsnapshotter = \"overlayfs\"\nroot = \"/mnt/nvme/containerd\"\nstate = \"/mnt/nvme/containerd/state\"\n","sudo systemctl restart containerd\n","kubectl create -f ubuntu.yaml\n","apiVersion: v1\nkind: Pod\nmetadata:\nname: ubuntu\nspec:\ncontainers:\n- name: ubuntu\n image: ubuntu:latest\n command: [\"sleep\", \"86400\"]\n volumeMounts:\n - name: data-volume\n mountPath: /data\nvolumes:\n - name: data-volume\n emptyDir: {}\n","# enter the container\nkubectl exec pod/ubuntu -it bash\n\n# in container\napt-get update\napt-get install fio -y\n\n# change to the mounted dir\ncd /data\n\n# write 10GB\nfio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test\n\n# verify the read speed\n# compare with the disk performance indicators provided by various cloud providers.\nfio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly\n","Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]\niops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024\nread: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)\n slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96\n clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13\n lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74\n clat percentiles (usec):\n | 1.00th=[ 69], 5.00th=[ 79], 10.00th=[ 85], 20.00th=[ 95],\n | 30.00th=[ 106], 40.00th=[ 123], 50.00th=[ 149], 60.00th=[ 11469],\n | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],\n | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],\n | 99.99th=[767558]\nbw ( MiB/s): min= 236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591\niops : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591\nlat (usec) : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%\nlat (usec) : 1000=0.08%\nlat (msec) : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%\nlat (msec) : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%\nlat (msec) : 2000=0.01%\ncpu : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665\nIO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%\n submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%\n complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%\n issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0\n latency : target=0, window=0, percentile=100.00%, depth=64\n","...\nspec:\n components:\n queryNode:\n volumeMounts:\n - mountPath: /var/lib/milvus/data\n name: data\n volumes:\n - emptyDir:\n name: data\n"],"headingContent":"Configure Milvus QueryNode with Local Disk","anchorList":[{"label":"Настройка Milvus QueryNode с локальным диском","href":"Configure-Milvus-QueryNode-with-Local-Disk","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Настройка Kubernetes на использование локального диска","href":"Configure-Kubernetes-to-use-local-disk","type":2,"isActive":false},{"label":"Проверка производительности диска","href":"Verify-disk-performance","type":2,"isActive":false},{"label":"Развертывание Milvus Distributed","href":"Deploy-Milvus-Distributed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.md b/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.md new file mode 100644 index 000000000..9583dacec --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure-querynode-localdisk.md @@ -0,0 +1,282 @@ +--- +id: configure-querynode-localdisk.md +title: Настройка Milvus QueryNode с локальным диском +related_key: 'querynode, query node, local disk' +summary: 'Узнайте, как настроить Milvus QueryNode на использование локального диска.' +--- +

    Настройка Milvus QueryNode с локальным диском

    В этой статье описывается, как настроить Milvus QueryNode на использование локального дискового хранилища.

    +

    Обзор

    Milvus - это векторная база данных, ориентированная на ИИ и предназначенная для эффективного хранения и извлечения огромных объемов векторных данных. Она идеально подходит для таких задач, как анализ изображений и видео, обработка естественного языка и рекомендательные системы. Для обеспечения оптимальной производительности очень важно минимизировать задержку чтения данных с диска. Для предотвращения задержек и поддержания стабильности системы настоятельно рекомендуется использовать локальные твердотельные накопители NVMe.

    +

    Ключевые функции локального дискового хранилища включают в себя:

    +
      +
    • Кэш чанков: Предварительная загрузка данных в локальный дисковый кэш для ускорения поиска.
    • +
    • MMap: Сопоставление содержимого файлов непосредственно в память для повышения эффективности использования памяти.
    • +
    • Индекс DiskANN: Требует дискового хранилища для эффективного управления индексами.
    • +
    +

    В этой статье мы сосредоточимся на развертывании Milvus Distributed на облачных платформах и на том, как настроить QueryNode на использование дискового хранилища NVMe. В следующей таблице перечислены рекомендуемые типы машин различных облачных провайдеров.

    + + + + + + + + + + + +
    Облачный провайдерТип машины
    AWSСерия R6id
    GCPСерия N2
    AzureСерия Lsv3
    Alibaba Cloudсерия i3
    Tencent CloudСерия IT5
    +

    Эти типы машин обеспечивают дисковое хранилище NVMe. Вы можете использовать команду lsblk для экземпляров этих типов машин, чтобы проверить, есть ли у них дисковое хранилище NVMe. Если да, то можно переходить к следующему шагу.

    +
    $ lsblk | grep nvme
    +nvme0n1     259:0    0 250.0G  0 disk 
    +nvme1n1     259:1    0 250.0G  0 disk 
    +
    +

    Настройка Kubernetes на использование локального диска

    Чтобы настроить QueryNode в Milvus Distributed на использование NVMe-диска, необходимо настроить рабочие узлы целевых кластеров Kubernetes на хранение контейнеров и образов на NVMe-диске. Процедура настройки зависит от облачных провайдеров.

    +

    AWS

    При использовании Amazon EKS вы можете настроить управляемые узлы с помощью шаблонов запуска, в которых можно указать параметры конфигурации для групп узлов. Ниже приведен пример монтирования NVMe-диска на рабочих узлах кластера Amazon EKS:

    +
    MIME-Version: 1.0
    +Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
    +
    +--==MYBOUNDARY==
    +Content-Type: text/x-shellscript; charset="us-ascii"
    +
    +#!/bin/bash
    +echo "Running custom user data script"
    +if ( lsblk | fgrep -q nvme1n1 ); then
    +    mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker
    +    mkfs.xfs /dev/nvme1n1
    +    mount /dev/nvme1n1 /mnt/data
    +    chmod 0755 /mnt/data
    +    mv /var/lib/kubelet /mnt/data/
    +    mv /var/lib/docker /mnt/data/
    +    ln -sf /mnt/data/kubelet /var/lib/kubelet
    +    ln -sf /mnt/data/docker /var/lib/docker
    +    UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')
    +    echo "UUID=$UUID     /mnt/data   xfs    defaults,noatime  1   1" >> /etc/fstab
    +fi
    +echo 10485760 > /proc/sys/fs/aio-max-nr
    +
    +--==MYBOUNDARY==--
    +
    +
    +

    В приведенном выше примере мы предполагаем, что NVMe-диск имеет адрес /dev/nvme1n1. Вам необходимо изменить сценарий в соответствии с вашей конкретной конфигурацией.

    +
    +

    Подробнее см. в разделе Настройка управляемых узлов с помощью шаблонов запуска.

    +

    GCP

    Чтобы создать хранилище Local SSD на кластерах Google Kubernetes Engine (GKE) и настроить рабочие нагрузки на потребление данных из эфемерного хранилища Local SSD, подключенного к узлам кластера, выполните следующую команду:

    +
    gcloud container node-pools create ${POOL_NAME} \
    +    --cluster=${CLUSTER_NAME} \
    +    --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \
    +    --machine-type=${MACHINE_TYPE}
    +
    +

    Подробнее см. в разделе Предоставление локального SSD-хранилища на GKE.

    +

    Azure

    Чтобы создать набор масштабирования виртуальных машин (VMSS) с локальным дисковым хранилищем NVMe, необходимо передать пользовательские данные экземплярам ВМ. Ниже приведен пример подключения NVMe-диска к экземплярам ВМ в VMSS:

    +
    mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1
    +mdadm -Ds > /etc/mdadm/mdadm.conf 
    +update-initramfs -u
    +
    +mkfs.xfs /dev/md0
    +mkdir -p /var/lib/kubelet
    +echo '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +
    +

    В приведенном выше примере предполагается, что NVMe-диски - это /dev/nvme0n1 и /dev/nvme1n1. Вам необходимо изменить сценарий в соответствии с конкретной конфигурацией.

    +
    +

    Alibaba Cloud и TecentCloud

    Чтобы создать пул узлов, использующий тома Local SSD, нам нужно передать пользовательские данные. Ниже приведен пример пользовательских данных.

    +
    #!/bin/bash
    +echo "nvme init start..."
    +mkfs.xfs /dev/nvme0n1
    +mkdir -p /mnt/data
    +echo '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +mkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods
    +mkdir -p  /var/lib/kubelet /var/lib/containerd /var/log/pods
    +
    +echo '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab
    +mount -a
    +
    +echo "nvme init end..."
    +
    +
    +

    В приведенном выше примере мы предполагаем, что NVMe-диск - это /dev/nvme0n1. Вам необходимо изменить сценарий в соответствии с вашей конкретной конфигурацией.

    +
    +

    Собственный IDC

    Если вы используете собственную IDC и хотите настроить контейнеры на использование файловой системы на только что смонтированном NVMe-диске по умолчанию в containerd, выполните следующие действия:

    +
      +
    • Смонтируйте NVMe-диски.

      +

      Убедитесь, что NVMe-диск правильно смонтирован на хост-машине. Вы можете смонтировать его в каталог по своему выбору. Например, если вы монтируете его в /mnt/nvme, убедитесь, что он правильно установлен и вы можете увидеть диск, доступный по адресу /mnt/nvme, запустив lsblk или df -h.

    • +
    • Обновите конфигурацию containerd.

      +

      Измените конфигурацию containerd, чтобы использовать новое монтирование в качестве корневого каталога для хранения контейнеров.

      +
      sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state
      +sudo vim /etc/containerd/config.toml
      +
      +

      Найдите раздел [plugins."io.containerd.grpc.v1.cri".containerd] и измените настройки snapshotter и root следующим образом:.

      +
      [plugins."io.containerd.grpc.v1.cri".containerd]
      +snapshotter = "overlayfs"
      +root = "/mnt/nvme/containerd"
      +state = "/mnt/nvme/containerd/state"
      +
    • +
    • Перезапустите containerd.

      +

      Перезапустите службу containerd, чтобы применить изменения.

      +
      sudo systemctl restart containerd
      +
    • +
    +

    Проверка производительности диска

    Рекомендуется проверить производительность диска с помощью Fio- популярного инструмента для бенчмаркинга производительности дисков. Ниже приведен пример запуска Fio для проверки производительности диска.

    +
      +
    • Разверните тестовую капсулу на узле с NVMe-диском.

      +
      kubectl create -f ubuntu.yaml
      +
      +

      Файл ubuntu.yaml выглядит следующим образом:

      +
      apiVersion: v1
      +kind: Pod
      +metadata:
      +name: ubuntu
      +spec:
      +containers:
      +- name: ubuntu
      +    image: ubuntu:latest
      +    command: ["sleep", "86400"]
      +    volumeMounts:
      +    - name: data-volume
      +        mountPath: /data
      +volumes:
      +    - name: data-volume
      +    emptyDir: {}
      +
    • +
    • Запустите Fio для проверки производительности диска.

      +
      # enter the container
      +kubectl exec pod/ubuntu -it bash
      +
      +# in container
      +apt-get update
      +apt-get install fio -y
      +
      +# change to the mounted dir
      +cd /data
      +
      +# write 10GB
      +fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test
      +
      +# verify the read speed
      +# compare with the disk performance indicators provided by various cloud providers.
      +fio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1  --readonly
      +
      +

      Результат должен выглядеть следующим образом:

      +
      Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]
      +iops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024
      +read: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)
      +    slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96
      +    clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13
      +    lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74
      +    clat percentiles (usec):
      +    |  1.00th=[    69],  5.00th=[    79], 10.00th=[    85], 20.00th=[    95],
      +    | 30.00th=[   106], 40.00th=[   123], 50.00th=[   149], 60.00th=[ 11469],
      +    | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],
      +    | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],
      +    | 99.99th=[767558]
      +bw (  MiB/s): min=  236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591
      +iops        : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591
      +lat (usec)   : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%
      +lat (usec)   : 1000=0.08%
      +lat (msec)   : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%
      +lat (msec)   : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%
      +lat (msec)   : 2000=0.01%
      +cpu          : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665
      +IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
      +    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
      +    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
      +    issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0
      +    latency   : target=0, window=0, percentile=100.00%, depth=64
      +
    • +
    +

    Развертывание Milvus Distributed

    После того как результаты проверки будут удовлетворительными, можно развернуть Milvus Distributed, выполнив следующие шаги:

    +

    Советы по развертыванию Milvus Distributed с помощью Helm

    Подкад QueryNode по умолчанию использует NVMe-диски в качестве томов EmptyDir. Для обеспечения оптимальной производительности рекомендуется монтировать NVMe-диски на /var/lib/milvus/data внутри подкад QueryNode.

    +

    Подробнее о том, как развернуть Milvus Distributed с помощью Helm, читайте в разделе Запуск Milvus в Kubernetes с помощью Helm.

    +

    Советы по развертыванию Milvus Distributed с помощью Milvus Operator

    Milvus Operator автоматически настраивает подкад QueryNode на использование NVMe-дисков в качестве томов EmptyDir. Рекомендуется добавить следующие конфигурации в пользовательский ресурс MilvusCluster:

    +
    ...
    +spec:
    +  components:
    +    queryNode:
    +      volumeMounts:
    +      - mountPath: /var/lib/milvus/data
    +        name: data
    +      volumes:
    +      - emptyDir:
    +        name: data
    +
    +

    Это обеспечит использование стручком QueryNode NVMe-диска в качестве тома данных. Подробнее о том, как развернуть Milvus Distributed с помощью Milvus Operator, читайте в разделе Запуск Milvus в Kubernetes с помощью Milvus Operator.

    diff --git a/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.json b/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.json new file mode 100644 index 000000000..f17c32ebe --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.json @@ -0,0 +1 @@ +{"codeList":["proxy:\n accessLog:\n enable: true\n # If `filename` is emtpy, logs will be printed to stdout.\n filename: \"\"\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\" # Name of the access log file\n localPath: \"/var/logs/milvus\" # Local file path where the access log file is stored\n maxSize: 500 # Max size for each single access log file. Unit: MB\n rotatedTime: 24 # Time interval for log rotation. Unit: seconds\n maxBackups: 7 # Max number of sealed access log files that can be retained\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n maxSize: 500\n rotatedTime: 24 \n maxBackups: 7\n minioEnable: true\n remotePath: \"/milvus/logs/access_logs\"\n remoteMaxTime: 0\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n # Define custom formatters for access logs with format and applicable methods\n formatters:\n # The `base` formatter applies to all methods by default\n # The `base` formatter does not require specific method association\n base: \n # Format string; an empty string means no log output\n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]\"\n # Custom formatter for specific methods (e.g., Query, Search)\n query: \n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]\"\n # Specify the methods to which this custom formatter applies\n methods: [\"Query\", \"Search\"]\n"],"headingContent":"Configure Access Logs","anchorList":[{"label":"Настройка журналов доступа","href":"Configure-Access-Logs","type":1,"isActive":false},{"label":"Варианты конфигурации","href":"Configuration-options","type":2,"isActive":false},{"label":"Настройка форматера","href":"Formatter-config","type":2,"isActive":false},{"label":"Ссылка: Поддерживаемые метрики","href":"Reference-Supported-metrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.md b/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.md new file mode 100644 index 000000000..67d48fed3 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure_access_logs.md @@ -0,0 +1,175 @@ +--- +id: configure_access_logs.md +title: Настройка журналов доступа +--- +

    Настройка журналов доступа

    Функция журнала доступа в Milvus позволяет менеджерам серверов записывать и анализировать поведение пользователей при доступе, помогая понять такие аспекты, как частота успешных запросов и причины отказов.

    +

    В этом руководстве приведены подробные инструкции по настройке журналов доступа в Milvus.

    +

    Конфигурация журналов доступа зависит от метода установки Milvus:

    + +

    Варианты конфигурации

    Выберите один из трех вариантов конфигурации в зависимости от ваших потребностей:

    +
      +
    • Базовая конфигурация: Для общих целей.
    • +
    • Конфигурация для файлов журналов локального доступа: Для локального хранения журналов.
    • +
    • Конфигурация для загрузки локальных журналов доступа в MinIO: Для облачного хранения и резервного копирования.
    • +
    +

    Базовая конфигурация

    Базовая конфигурация включает в себя включение журналов доступа и определение имени файла журнала или использование stdout.

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    # If `filename` is emtpy, logs will be printed to stdout.
    +    filename: ""
    +    # Additional formatter configurations...
    +
    +
      +
    • proxy.accessLog.enable: Включать ли функцию журнала доступа. По умолчанию false.
    • +
    • proxy.accessLog.filename: Имя файла журнала доступа. Если оставить этот параметр пустым, журналы доступа будут выводиться в stdout.
    • +
    +

    Настройка локальных файлов журнала доступа

    Настройка локального хранения файлов журнала доступа с параметрами, включающими путь к локальному файлу, размер файла и интервал ротации:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt" # Name of the access log file
    +    localPath: "/var/logs/milvus" # Local file path where the access log file is stored
    +    maxSize: 500 # Max size for each single access log file. Unit: MB
    +    rotatedTime: 24 # Time interval for log rotation. Unit: seconds
    +    maxBackups: 7 # Max number of sealed access log files that can be retained
    +    # Additional formatter configurations...
    +
    +

    Эти параметры задаются, если filename не пуст.

    +
      +
    • proxy.accessLog.localPath: Путь к локальному файлу, где хранится файл журнала доступа.
    • +
    • proxy.accessLog.maxSize: : Максимальный размер в МБ, допустимый для одного файла журнала доступа. Если размер файла журнала достигнет этого предела, будет запущен процесс ротации. Этот процесс запечатывает текущий файл журнала доступа, создает новый файл журнала и очищает содержимое исходного файла журнала.
    • +
    • proxy.accessLog.rotatedTime: Максимальный интервал времени в секундах, допустимый для ротации одного файла журнала доступа. По достижении указанного интервала времени запускается процесс ротации, в результате которого создается новый файл журнала доступа и запечатывается предыдущий.
    • +
    • proxy.accessLog.maxBackups: Максимальное количество опечатанных файлов журнала доступа, которое может быть сохранено. Если количество опечатанных файлов журнала доступа превысит этот предел, самый старый из них будет удален.
    • +
    +

    Настройка выгрузки локальных файлов журналов доступа в MinIO

    Включите и настройте параметры для загрузки локальных файлов журналов доступа в MinIO:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    maxSize: 500
    +    rotatedTime: 24 
    +    maxBackups: 7
    +    minioEnable: true
    +    remotePath: "/milvus/logs/access_logs"
    +    remoteMaxTime: 0
    +    # Additional formatter configurations...
    +
    +

    При настройке параметров MinIO убедитесь, что вы установили либо maxSize, либо rotatedTime. Невыполнение этого требования может привести к неудачной загрузке локальных файлов журнала доступа в MinIO.

    +
      +
    • proxy.accessLog.minioEnable: Загружать ли локальные файлы журналов доступа в MinIO. По умолчанию false.
    • +
    • proxy.accessLog.remotePath: Путь к хранилищу объектов для загрузки файлов журналов доступа.
    • +
    • proxy.accessLog.remoteMaxTime: : Интервал времени, допустимый для загрузки файлов журнала доступа. Если время загрузки файла журнала превышает этот интервал, файл будет удален. Установка значения 0 отключает эту функцию.
    • +
    +

    Настройка форматера

    По умолчанию для всех методов используется формат журнала base, который не требует специальных ассоциаций методов. Однако, если вы хотите настроить вывод журнала для определенных методов, вы можете определить собственный формат журнала и применить его к связанным методам.

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    # Define custom formatters for access logs with format and applicable methods
    +    formatters:
    +      # The `base` formatter applies to all methods by default
    +      # The `base` formatter does not require specific method association
    +      base: 
    +        # Format string; an empty string means no log output
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]"
    +      # Custom formatter for specific methods (e.g., Query, Search)
    +      query: 
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]"
    +        # Specify the methods to which this custom formatter applies
    +        methods: ["Query", "Search"]
    +
    +
      +
    • proxy.accessLog.<formatter_name>.format: Определяет формат журнала с динамическими метриками. Дополнительные сведения см. в разделе Поддерживаемые метрики.
    • +
    • proxy.accessLog.<formatter_name>.methods: Перечисляет операции Milvus, использующие данный формат. Чтобы получить имена методов, см. раздел MilvusService в разделе Методы Milvus.
    • +
    +

    Ссылка: Поддерживаемые метрики

    + + + + + + + + + + + + + + + + + + + + + + +
    Метрика ИмяОписание
    $method_nameИмя метода
    $method_statusСтатус доступа: OK или Fail
    $method_exprВыражение, используемое для операций запроса, поиска или удаления
    $trace_idИдентификатор трассировки, связанный с доступом
    $user_addrIP-адрес пользователя
    $user_nameИмя пользователя
    $response_sizeРазмер данных ответа
    $error_codeКод ошибки, характерный для Milvus
    $error_msgПодробное сообщение об ошибке
    $database_nameИмя целевой базы данных Milvus
    $collection_nameИмя целевой коллекции Milvus
    $partition_nameИмя или имена целевого раздела (разделов) Milvus
    $time_costВремя, затраченное на завершение доступа
    $time_nowВремя, в которое печатается журнал доступа (обычно эквивалентно $time_end)
    $time_startВремя начала доступа
    $time_endВремя окончания доступа
    $sdk_versionВерсия Milvus SDK, используемая пользователем
    diff --git a/localization/v2.5.x/site/ru/adminGuide/configure_operator.json b/localization/v2.5.x/site/ru/adminGuide/configure_operator.json new file mode 100644 index 000000000..cdb9aefce --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n nodeSelector: {}\n tolerations: {}\n env: {}\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n","kubectl apply -f milvuscluster_resource.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n rootCoord: \n replicas: 1\n port: 8080\n resources:\n limits:\n cpu: '6'\n memory: '10Gi'\n dataCoord: {}\n queryCoord: {}\n indexCoord: {}\n dataNode: {}\n indexNode: {}\n queryNode: {}\n proxy:\n replicas: 1\n serviceType: ClusterIP\n resources:\n limits:\n cpu: '2'\n memory: 4Gi\n requests:\n cpu: 100m\n memory: 128Mi\n config: {}\n dependencies: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Milvus with Milvus Operator","anchorList":[{"label":"Настройка Milvus с помощью Milvus Operator","href":"Configure-Milvus-with-Milvus-Operator","type":1,"isActive":false},{"label":"Настройка глобальных ресурсов","href":"Configure-global-resources","type":2,"isActive":false},{"label":"Настройка частных ресурсов","href":"Configure-private-resources","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/configure_operator.md b/localization/v2.5.x/site/ru/adminGuide/configure_operator.md new file mode 100644 index 000000000..13bc9180a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/configure_operator.md @@ -0,0 +1,336 @@ +--- +id: configure_operator.md +label: Milvus Operator +related_key: Milvus Operator +summary: 'Узнайте, как настроить Milvus с помощью Milvus Operator.' +title: Настройка Milvus с помощью Milvus Operator +--- +

    Настройка Milvus с помощью Milvus Operator

    В производственной среде вам необходимо распределить ресурсы между кластером Milvus в зависимости от типа машины и рабочей нагрузки. Вы можете настроить конфигурацию во время развертывания или обновить ее во время работы кластера.

    +

    В этой теме рассказывается о том, как настроить кластер Milvus при его установке с помощью Milvus Operator.

    +

    В этой теме предполагается, что вы развернули Milvus Operator. Дополнительные сведения см. в разделе Развертывание Milvus Operator.

    +

    Настройка кластера Milvus с помощью Milvus Operator включает в себя:

    +
      +
    • Глобальные конфигурации ресурсов
    • +
    • Конфигурации частных ресурсов
    • +
    +
    +Конфигурации частных ресурсов будут перезаписывать конфигурации глобальных ресурсов. Если вы настроите ресурсы глобально и одновременно укажете частный ресурс определенного компонента, компонент будет отдавать приоритет и отвечать на частные конфигурации в первую очередь.
    +

    Настройка глобальных ресурсов

    При использовании Milvus Operator для запуска кластера Milvus необходимо указать файл конфигурации. В приведенном здесь примере используется файл конфигурации по умолчанию.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Детали конфигурационного файла приведены ниже:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    Поле spec.components включает в себя как глобальную, так и частную конфигурацию ресурсов всех компонентов Milvus. Ниже перечислены четыре часто используемых поля для настройки глобального ресурса.

    +
      +
    • image: Используемый образ Milvus docker.
    • +
    • resources: Вычислительные ресурсы, выделенные каждому компоненту.
    • +
    • tolerations и nodeSelector: Правила планирования для каждого компонента Milvus в кластере K8s. Дополнительные сведения см. в разделах "Допуски" и "Селектор узла".
    • +
    • env: Переменные окружения.
    • +
    +

    Если вы хотите настроить дополнительные поля, см. документацию здесь.

    +

    Чтобы настроить глобальный ресурс для кластера Milvus, создайте файл milvuscluster_resource.yaml.

    +

    Пример

    В следующем примере настраивается глобальный ресурс для кластера Milvus.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    nodeSelector: {}
    +    tolerations: {}
    +    env: {}
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +
    +

    Выполните следующую команду, чтобы применить новые конфигурации:

    +
    kubectl apply -f milvuscluster_resource.yaml
    +
    +
    +Ресурсы кластера будут обновлены в соответствии с файлом конфигурации, если в кластере K8s есть кластер Milvus с именем my-release. В противном случае будет создан новый кластер Milvus.
    +

    Настройка частных ресурсов

    Первоначально в Milvus 2.0 кластер Milvus включал семь компонентов: прокси, корневой коорд, коорд данных, коорд запросов, индексный узел, узел данных и узел запросов. Однако вместе с Milvus 2.1.0 был выпущен новый компонент, mix coord. Mix coord включает в себя все компоненты координатора. Поэтому запуск mix coord означает, что вам не нужно устанавливать и запускать другие координаторы, включая root coord, data coord и query coord.

    +

    Общие поля, используемые для настройки каждого компонента, включают:

    +
      +
    • replica: : Количество реплик каждого компонента.
    • +
    • port: : Номер порта прослушивания каждого компонента.
    • +
    • Четыре часто используемых поля в глобальной конфигурации ресурсов: image, env, nodeSelector, tolerations, resources (см. выше). Чтобы узнать больше настраиваемых полей, щелкните на каждом компоненте в этой документации.
    • +
    +
    +Кроме того, при настройке прокси есть дополнительное поле `serviceType`. Это поле определяет тип сервиса, который Milvus предоставляет в кластере K8s.
    +

    Чтобы настроить ресурсы для конкретного компонента, сначала добавьте имя компонента в поле spec.componets, а затем настройте его личные ресурсы.

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    НазначениеПараметры
    Настройка производительности + +
    Данные и метаданные + +
    Администрирование + +
    Квоты и лимиты + +
    +
    +

    Пример

    В приведенном ниже примере в файле milvuscluster.yaml настраиваются реплики и вычислительные ресурсы прокси и датанода.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +    rootCoord: 
    +      replicas: 1
    +      port: 8080
    +      resources:
    +        limits:
    +          cpu: '6'
    +          memory: '10Gi'
    +    dataCoord: {}
    +    queryCoord: {}
    +    indexCoord: {}
    +    dataNode: {}
    +    indexNode: {}
    +    queryNode: {}
    +    proxy:
    +      replicas: 1
    +      serviceType: ClusterIP
    +      resources:
    +        limits:
    +          cpu: '2'
    +          memory: 4Gi
    +        requests:
    +          cpu: 100m
    +          memory: 128Mi
    +  config: {}
    +  dependencies: {}
    +
    +
    +В этом примере настраиваются не только глобальные ресурсы, но и частные вычислительные ресурсы для root coord и proxy. При использовании этого файла конфигурации для запуска кластера Milvus конфигурация частных ресурсов будет применена к root coord и proxy, в то время как остальные компоненты будут следовать конфигурации глобальных ресурсов.
    +

    Выполните следующую команду, чтобы применить новые конфигурации:

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.json b/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.json new file mode 100644 index 000000000..723a9697d --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.json @@ -0,0 +1 @@ +{"codeList":["version: '3'\nservices:\n zookeeper:\n image: wurstmeister/zookeeper:latest\n container_name: zookeeper\n ports:\n - 2181:2181\n restart: always\n\n kafka:\n image: wurstmeister/kafka:latest\n container_name: kafka\n ports:\n - 9092:9092\n environment:\n - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\n - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092\n - KAFKA_LISTENERS=PLAINTEXT://:9092\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n restart: always\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9092\"\n saslUsername:\n saslPassword:\n saslMechanisms:\n securityProtocol:\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: \n tlsKey:\n tlsCACert:\n tlsKeyPassword:\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n ports:\n - 2181:2181\n\n kafka:\n image: confluentinc/cp-kafka:latest\n container_name: kafka\n depends_on:\n - zookeeper\n ports:\n - 9092:9092\n - 9093:9093\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","KafkaServer {\n org.apache.kafka.common.security.plain.PlainLoginModule required\n username=\"kafka\"\n password=\"pass123\"\n user_kafka=\"pass123\";\n};\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_PLAINTEXT\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: # path to client's public key\n tlsKey: # path to client's private key\n tlsCACert: # file or directory path to CA certificate\n tlsKeyPassword: # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","#!/bin/bash\n#\n#\n# This scripts generates:\n# - root CA certificate\n# - server certificate and keystore\n# - client keys\n#\n# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka\n#\n\n\nif [[ \"$1\" == \"-k\" ]]; then\n USE_KEYTOOL=1\n shift\nelse\n USE_KEYTOOL=0\nfi\n\nOP=\"$1\"\nCA_CERT=\"$2\"\nPFX=\"$3\"\nHOST=\"$4\"\n\nC=NN\nST=NN\nL=NN\nO=NN\nOU=NN\nCN=\"kafka-ssl\"\n \n\n# Password\nPASS=\"abcdefgh\"\n\n# Cert validity, in days\nVALIDITY=365\n\nset -e\n\nexport LC_ALL=C\n\nif [[ $OP == \"ca\" && ! -z \"$CA_CERT\" && ! -z \"$3\" ]]; then\n CN=\"$3\"\n openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin \"pass:$PASS\" -passout \"pass:$PASS\" < \"\n echo \" $0 [-k] server|client \"\n echo \"\"\n echo \" -k = Use keytool/Java Keystore, else standard SSL keys\"\n exit 1\nfi\n","$ ./gen-ssl-certs.sh ca ca-cert kafka-ssl\n","$ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl\n","$ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client\n","$ ls -l my_secrets\ntotal 12\n-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert\n-rw------- 1 1.9K Feb 26 11:53 ca-cert.key\n-rw-rw-r-- 1 41 Feb 26 11:54 ca-cert.srl\n-rw-rw-r-- 1 9 Feb 26 12:08 cert_creds\n-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed\n-rw------- 1 1.8K Feb 26 11:54 kafka_client.key\n-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem\n-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req\n-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: \n saslPassword: \n saslMechanisms: \n securityProtocol: SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SASL_SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n"],"headingContent":"Connecting to Kafka with SASL/SSL","anchorList":[{"label":"Подключение к Kafka с помощью SASL/SSL","href":"Connecting-to-Kafka-with-SASLSSL","type":1,"isActive":false},{"label":"Подключение Milvus к Kafka без SASL/SSL","href":"Connect-Milvus-to-Kafka-Without-SASLSSL","type":2,"isActive":false},{"label":"Подключение Milus к Kafka с помощью SASL/PLAIN Alone","href":"Connect-Milus-to-Kafka-with-SASLPLAIN-Alone","type":2,"isActive":false},{"label":"Подключение Milvus к Kafka с помощью SSL Alone","href":"Connect-Milvus-to-Kafka-with-SSL-Alone","type":2,"isActive":false},{"label":"Подключение Milvus к Kafka с помощью SASL/PLAIN и SSL","href":"Connect-Milvus-to-Kafka-with-SASLPLAIN-and-SSL","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.md b/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.md new file mode 100644 index 000000000..8e19e4692 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/connect_kafka_ssl.md @@ -0,0 +1,619 @@ +--- +id: connect_kafka_ssl.md +title: Подключение к Kafka с помощью SASL/SSL +related_key: 'kafka, sasl, tls' +summary: >- + В этом руководстве перечислены несколько способов подключения Milvus к Kafka, + от самого простого без SASL/SSL до полностью защищенного с SASL/SSL. +--- +

    Подключение к Kafka с помощью SASL/SSL

    В этом руководстве перечислены несколько способов подключения Milvus к Kafka, от самого простого без SASL/SSL до полностью защищенного с SASL/SSL.

    +

    Подключение Milvus к Kafka без SASL/SSL

    Чтобы запустить Milvus и Kafka без SASL/SSL, вы отключаете аутентификацию и шифрование как для Kafka, так и для Milvus. Используйте их только в доверенной среде.

    +

    1. Запуск службы Kafka без SASL/SSL

    Вы можете использовать следующий файл docker-compose.yaml для запуска службы Kafka без SASL/SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: wurstmeister/zookeeper:latest
    +    container_name: zookeeper
    +    ports:
    +      - 2181:2181
    +    restart: always
    +
    +  kafka:
    +    image: wurstmeister/kafka:latest
    +    container_name: kafka
    +    ports:
    +      - 9092:9092
    +    environment:
    +      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
    +      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
    +      - KAFKA_LISTENERS=PLAINTEXT://:9092
    +    volumes:
    +      - /var/run/docker.sock:/var/run/docker.sock
    +    restart: always
    +
    +

    Затем вы можете запустить службу Kafka с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    2. Запустите Milvus и подключитесь к Kafka

    После запуска службы Kafka можно запустить Milvus и подключиться к ней. Используйте следующий файл docker-compose.yaml для запуска Milvus и подключения к Kafka без SASL/SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    Используйте следующую команду для загрузки шаблона файла конфигурации Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    И установите следующие параметры:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9092"
    +  saslUsername:
    +  saslPassword:
    +  saslMechanisms:
    +  securityProtocol:
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: 
    +    tlsKey:
    +    tlsCACert:
    +    tlsKeyPassword:
    +
    +

    Затем вы можете запустить Milvus с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    Подключение Milus к Kafka с помощью SASL/PLAIN Alone

    Чтобы запустить Kafka с аутентификацией SASL/PLAIN, необходимо добавить файл kafka_server_jass.conf с соответствующими настройками.

    +

    1. Запустите службу Kafka с помощью SASL/PLAIN

    Поместите следующие файлы docker-compose.yaml и kafka_server_jaas.conf в один каталог.

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    environment:
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +    ports:
    +      - 2181:2181
    +
    +  kafka:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka
    +    depends_on:
    +      - zookeeper
    +    ports:
    +      - 9092:9092
    +      - 9093:9093
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    В файле kafka_server_jass.conf задайте следующие параметры:

    +
    KafkaServer {
    +    org.apache.kafka.common.security.plain.PlainLoginModule required
    +    username="kafka"
    +    password="pass123"
    +    user_kafka="pass123";
    +};
    +
    +

    Затем вы можете запустить службу Kafka с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    2. Запуск Milvus и подключение к Kafka

    После запуска службы Kafka можно запустить Milvus и подключиться к ней. Используйте следующий файл docker-compose.yaml для запуска Milvus и подключения к Kafka с помощью SASL/PLAIN:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    Используйте следующую команду для загрузки шаблона файла конфигурации Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    И установите следующие параметры:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_PLAINTEXT
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: # path to client's public key
    +    tlsKey: # path to client's private key
    +    tlsCACert: # file or directory path to CA certificate
    +    tlsKeyPassword: # private key passphrase for use with private key, if any
    +
    +

    Затем вы можете запустить Milvus с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    Подключение Milvus к Kafka с помощью SSL Alone

    Чтобы запустить Kafka с SSL-аутентификацией, вам нужно получить несколько файлов сертификатов или сгенерировать самоподписанные. В этом примере мы используем самоподписанные сертификаты.

    +

    1. Создание самоподписных сертификатов

    Создайте папку с именем my_secrets, добавьте в нее bash-скрипт с именем gen-ssl-certs.sh и вставьте в него следующее содержимое:

    +
    #!/bin/bash
    +#
    +#
    +# This scripts generates:
    +#  - root CA certificate
    +#  - server certificate and keystore
    +#  - client keys
    +#
    +# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka
    +#
    +
    +
    +if [[ "$1" == "-k" ]]; then
    +    USE_KEYTOOL=1
    +    shift
    +else
    +    USE_KEYTOOL=0
    +fi
    +
    +OP="$1"
    +CA_CERT="$2"
    +PFX="$3"
    +HOST="$4"
    +
    +C=NN
    +ST=NN
    +L=NN
    +O=NN
    +OU=NN
    +CN="kafka-ssl"
    + 
    +
    +# Password
    +PASS="abcdefgh"
    +
    +# Cert validity, in days
    +VALIDITY=365
    +
    +set -e
    +
    +export LC_ALL=C
    +
    +if [[ $OP == "ca" && ! -z "$CA_CERT" && ! -z "$3" ]]; then
    +    CN="$3"
    +    openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin "pass:$PASS" -passout "pass:$PASS" <<EOF
    +${C}
    +${ST}
    +${L}
    +${O}
    +${OU}
    +${CN}
    +$USER@${CN}
    +.
    +.
    +EOF
    +
    +
    +
    +elif [[ $OP == "server" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    #Step 1
    +    echo "############ Generating key"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        
    +    #Step 2
    +    echo "############ Adding CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    #Step 3
    +    echo "############ Export certificate"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +    echo "############ Sign certificate"
    +    openssl x509 -req -CA $CA_CERT -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin "pass:$PASS"
    +    
    +    
    +    echo "############ Import CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    echo "############ Import signed CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -import -file ${PFX}cert-signed    
    +
    +    
    +elif [[ $OP == "client" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    if [[ $USE_KEYTOOL == 1 ]]; then
    +        echo "############ Creating client truststore"
    +
    +        [[ -f ${PFX}client.truststore.jks ]] || keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +
    +        echo "############ Generating key"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        echo "########### Export certificate"
    +        keytool -storepass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +        echo "########### Sign certificate"
    +        openssl x509 -req -CA ${CA_CERT} -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASS        
    +
    +        echo "########### Import CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias CARoot -import -file ${CA_CERT} <<EOF
    +yes
    +EOF
    +
    +        echo "########### Import signed CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -import -file ${PFX}cert-signed
    +
    +    else
    +        # Standard OpenSSL keys
    +        echo "############ Generating key"
    +        openssl genrsa -des3 -passout "pass:$PASS" -out ${PFX}client.key 2048 
    +        
    +        echo "############ Generating request"
    +        openssl req -passin "pass:$PASS" -passout "pass:$PASS" -key ${PFX}client.key -new -out ${PFX}client.req \
    +                <<EOF
    +$C
    +$ST
    +$L
    +$O
    +$OU
    +$CN
    +.
    +$PASS
    +.
    +EOF
    +
    +        echo "########### Signing key"
    +        openssl x509 -req -passin "pass:$PASS" -in ${PFX}client.req -CA $CA_CERT -CAkey ${CA_CERT}.key -CAcreateserial -out ${PFX}client.pem -days $VALIDITY
    +
    +    fi
    +
    +    
    +    
    +
    +else
    +    echo "Usage: $0 ca <ca-cert-file> <CN>"
    +    echo "       $0 [-k] server|client <ca-cert-file> <file_prefix> <hostname>"
    +    echo ""
    +    echo "       -k = Use keytool/Java Keystore, else standard SSL keys"
    +    exit 1
    +fi
    +
    +

    В приведенном выше скрипте используется пароль по умолчанию abcdefgh. Чтобы изменить пароль, создайте текстовый файл с именем cert_creds и введите пароль в первую строку.

    +

    Затем выполните следующую команду для генерации сертификатов:

    +
      +
    • Сгенерировать сертификат ЦС:

      +

      Ниже предполагается, что файл сертификата ЦС имеет имя ca-cert, а имя хоста брокера - kafka-ssl:

      +
      $ ./gen-ssl-certs.sh ca ca-cert kafka-ssl
      +
    • +
    • Сгенерировать сертификат сервера и хранилище ключей:

      +

      Ниже предполагается, что файл сертификата CA имеет имя ca-cert, префикс для всех выходных файлов - kafka_, а имя хоста брокера - kafka-ssl:

      +
      $ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl
      +
    • +
    • Сгенерируйте клиентские ключи:

      +

      Ниже предполагается, что файл сертификата CA имеет имя ca-cert, префикс для всех выходных файлов - kafka_, а имя клиента - kafka-client:

      +
      $ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client
      +
    • +
    +

    После генерации всех необходимых сертификатов в папке my_secrets появятся следующие файлы:

    +
    $ ls -l my_secrets
    +total 12
    +-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert
    +-rw------- 1 1.9K Feb 26 11:53 ca-cert.key
    +-rw-rw-r-- 1   41 Feb 26 11:54 ca-cert.srl
    +-rw-rw-r-- 1    9 Feb 26 12:08 cert_creds
    +-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed
    +-rw------- 1 1.8K Feb 26 11:54 kafka_client.key
    +-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem
    +-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req
    +-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks
    +
    +

    2. Запуск службы Kafka с SSL

    Используйте следующий файл docker-compose.yaml для запуска службы Kafka с SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +
    +

    Затем запустите службу Kafka с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    3. Запустите Milvus и подключитесь к Kafka с помощью SSL

    После запуска службы Kafka можно запустить Milvus и подключиться к ней. Используйте следующий файл docker-compose.yaml для запуска Milvus и подключения к Kafka с помощью SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    Используйте следующую команду для загрузки шаблона файла конфигурации Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    И установите следующие параметры:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: 
    +  saslPassword: 
    +  saslMechanisms: 
    +  securityProtocol: SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    +

    Затем запустите Milvus с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    Подключение Milvus к Kafka с помощью SASL/PLAIN и SSL

    Чтобы подключить Milvus к Kafka с помощью SASL/PLAIN и SSL, вам нужно повторить шаги, описанные в разделах Подключение Milus к Kafka с помощью SASL/PLAIN в одиночку и Подключение Milus к Kafka с помощью SSL в одиночку.

    +

    1. Запустите службу Kafka с помощью SASL/PLAIN и SSL

    Используйте файл kafka_server_jass.conf, упомянутый в Connect Milus to Kafka with SASL/PLAIN Alone, и папку my_secrets, созданную в Connect Milus to Kafka with SSL Alone, чтобы запустить службу Kafka с SASL/PLAIN и SSL.

    +

    Следующий файл docker-compose.yaml можно использовать для запуска службы Kafka с SASL/PLAIN и SSL:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SASL_SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    Затем запустите службу Kafka с помощью следующей команды:

    +
    $ docker compose up -d
    +
    +

    2. Запустите Milvus и подключитесь к Kafka с помощью SASL/PLAIN и SSL

    После запуска службы Kafka можно запустить Milvus и подключиться к ней. Используйте следующий файл docker-compose.yaml для запуска Milvus и подключения к Kafka с помощью SASL/PLAIN и SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +    
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    Используйте следующую команду для загрузки шаблона файла конфигурации Milvus:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    И установите следующие параметры:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.json b/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.json new file mode 100644 index 000000000..78c976185 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.json @@ -0,0 +1 @@ +{"codeList":["etcd:\n endpoints:\n - localhost:2379\n rootPath: by-dev # The root path where data are stored in etcd\n metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath\n kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath\n log:\n # path is one of:\n # - \"default\" as os.Stderr,\n # - \"stderr\" as os.Stderr,\n # - \"stdout\" as os.Stdout,\n # - file path to append server logs to.\n # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log\n path: stdout\n level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.\n use:\n # please adjust in embedded Milvus: true\n embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).\n data:\n # Embedded Etcd only.\n # please adjust in embedded Milvus: /tmp/milvus/etcdData/\n dir: default.etcd\n","docker compose up\n","etcd:\n enabled: false\n","externalEtcd:\n enabled: true\n ## the endpoints of the external etcd\n endpoints:\n - :2379\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={:2379}\n"],"headingContent":"Configure Meta Storage with Docker Compose or Helm","anchorList":[{"label":"Настройка метахранилища с помощью Docker Compose или Helm","href":"Configure-Meta-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Настройка etcd с помощью Docker Compose","href":"Configure-etcd-with-Docker-Compose","type":2,"isActive":false},{"label":"Настройка etcd на K8s","href":"Configure-etcd-on-K8s","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.md b/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.md new file mode 100644 index 000000000..d0dd944a3 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_etcd.md @@ -0,0 +1,136 @@ +--- +id: deploy_etcd.md +title: Настройка метахранилища с помощью Docker Compose или Helm +related_key: 'S3, storage' +summary: 'Узнайте, как настроить метахранилище для Milvus с помощью Docker Compose/Helm.' +--- +

    Настройка метахранилища с помощью Docker Compose или Helm

    Milvus использует etcd для хранения метаданных. В этой теме рассказывается о том, как настроить etcd с помощью Docker Compose или Helm.

    +

    Настройка etcd с помощью Docker Compose

    1. Настройка etcd

    Чтобы настроить etcd с помощью Docker Compose, укажите значения для секции etcd в файле milvus.yaml по пути milvus/configs.

    +
    etcd:
    +  endpoints:
    +    - localhost:2379
    +  rootPath: by-dev # The root path where data are stored in etcd
    +  metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
    +  kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
    +  log:
    +    # path is one of:
    +    #  - "default" as os.Stderr,
    +    #  - "stderr" as os.Stderr,
    +    #  - "stdout" as os.Stdout,
    +    #  - file path to append server logs to.
    +    # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
    +    path: stdout
    +    level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
    +  use:
    +    # please adjust in embedded Milvus: true
    +    embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).
    +  data:
    +    # Embedded Etcd only.
    +    # please adjust in embedded Milvus: /tmp/milvus/etcdData/
    +    dir: default.etcd
    +
    +

    Дополнительные сведения см. в разделе Конфигурации, связанные с etcd.

    +

    2. Запустите Milvus

    Выполните следующую команду, чтобы запустить Milvus, который использует конфигурации etcd.

    +
    docker compose up
    +
    +
    Конфигурации вступают в силу только после запуска Milvus. Дополнительные сведения см. в разделе Запуск Milvus.
    +

    Настройка etcd на K8s

    Для кластеров Milvus на K8s можно настроить etcd в той же команде, которая запускает Milvus. Также можно настроить etcd с помощью файла values.yml по пути /charts/milvus в репозитории milvus-helm перед запуском Milvus.

    +

    В следующей таблице перечислены ключи для настройки etcd в файле YAML.

    + + + + + + + + + +
    КлючОписаниеЗначение
    etcd.enabledВключает или отключает etcd.true/false
    externalEtcd.enabledВключает или отключает внешние etcd.true/false
    externalEtcd.endpointsКонечная точка для доступа к etcd.
    +

    Использование файла YAML

      +
    1. Настройте секцию etcd, используя значения из файла values.yaml.
    2. +
    +
    etcd:
    +  enabled: false
    +
    +
      +
    1. Сконфигурируйте секцию externaletcd, используя значения из файла values.yaml.
    2. +
    +
    externalEtcd:
    +  enabled: true
    +  ## the endpoints of the external etcd
    +  endpoints:
    +    - <your_etcd_IP>:2379
    +
    +
      +
    1. После настройки предыдущих разделов и сохранения файла values.yaml выполните следующую команду, чтобы установить Milvus, использующий конфигурации etcd.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Использование команды

    Чтобы установить Milvus и настроить etcd, выполните следующую команду, используя ваши значения.

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={<your_etcd_IP>:2379}
    +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Docker Compose или Helm:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.json b/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.json new file mode 100644 index 000000000..bbb4ff2bf --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.json @@ -0,0 +1 @@ +{"codeList":["pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of pulsar\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n","docker compose up\n","extraConfigFiles:\n user.yaml: |+\n pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of Pulsar\n webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n tenant: public\n namespace: default \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n kafka:\n brokerList:\n - :\n saslUsername:\n saslPassword:\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n rocksmq:\n # The path where the message is stored in rocksmq\n # please adjust in embedded Milvus: /tmp/milvus/rdb_data\n path: /var/lib/milvus/rdb_data\n lrucacheratio: 0.06 # rocksdb cache memory ratio\n rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq\n retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.\n retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.\n compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data\n # compaction compression type, only support use 0,7.\n # 0 means not compress, 7 will use zstd\n # len of types means num of rocksdb level.\n compressionTypes: [0, 0, 7, 7, 7] \n","extraConfigFiles:\n user.yaml: |+\n mq:\n type: natsmq\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n"],"headingContent":"Configure Message Storage with Docker Compose or Helm","anchorList":[{"label":"Настройте хранилище сообщений с помощью Docker Compose или Helm","href":"Configure-Message-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Настройка Pulsar с помощью Docker Compose","href":"Configure-Pulsar-with-Docker-Compose","type":2,"isActive":false},{"label":"Настройка Pulsar с помощью Helm","href":"Configure-Pulsar-with-Helm","type":2,"isActive":false},{"label":"Настройка Kafka с помощью Helm","href":"Configure-Kafka-with-Helm","type":2,"isActive":false},{"label":"Настройка RocksMQ с помощью Helm","href":"Configure-RocksMQ-with-Helm","type":2,"isActive":false},{"label":"Настройка NATS с помощью Helm","href":"Configure-NATS-with-Helm","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.md b/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.md new file mode 100644 index 000000000..980d38723 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_pulsar.md @@ -0,0 +1,240 @@ +--- +id: deploy_pulsar.md +title: Настройте хранилище сообщений с помощью Docker Compose или Helm +related_key: 'Pulsar, storage' +summary: 'Узнайте, как настроить хранение сообщений с помощью Docker Compose или Helm.' +--- +

    Настройте хранилище сообщений с помощью Docker Compose или Helm

    Milvus использует Pulsar или Kafka для управления журналами последних изменений, вывода потоковых журналов и обеспечения подписки на журналы. Pulsar является системой хранения сообщений по умолчанию. В этой теме рассказывается о том, как настроить хранилище сообщений с помощью Docker Compose или Helm.

    +

    Вы можете настроить Pulsar с помощью Docker Compose или на K8s и сконфигурировать Kafka на K8s.

    +

    Настройка Pulsar с помощью Docker Compose

    1. Настройка Pulsar

    Чтобы настроить Pulsar с помощью Docker Compose, укажите значения для секции pulsar в файле milvus.yaml по пути milvus/configs.

    +
    pulsar:
    +  address: localhost # Address of pulsar
    +  port: 6650 # Port of pulsar
    +  maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +
    +

    Дополнительные сведения см. в разделе Конфигурации, связанные с Pulsar.

    +

    2. Запустите Milvus

    Выполните следующую команду, чтобы запустить Milvus, использующий конфигурации Pulsar.

    +
    docker compose up
    +
    +
    Конфигурации вступают в силу только после запуска Milvus. Дополнительные сведения см. в разделе Запуск Milvus.
    +

    Настройка Pulsar с помощью Helm

    Для кластеров Milvus на K8s можно настроить Pulsar в той же команде, которая запускает Milvus. В качестве альтернативы можно настроить Pulsar с помощью файла values.yml по пути /charts/milvus в репозитории milvus-helm перед запуском Milvus.

    +

    Подробнее о том, как настроить Milvus с помощью Helm, см. в разделе Настройка Milvus с помощью Helm Charts. Подробные сведения об элементах конфигурации, связанных с Pulsar, см. в разделе Конфигурации, связанные с Pulsar.|

    +

    Использование файла YAML

      +
    1. Настройте секцию externalConfigFiles в файле values.yaml.
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    pulsar:
    +      address: localhost # Address of pulsar
    +      port: 6650 # Port of Pulsar
    +      webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080
    +      maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +      tenant: public
    +      namespace: default    
    +
    +
      +
    1. После настройки предыдущих разделов и сохранения файла values.yaml выполните следующую команду для установки Milvus, который использует конфигурации Pulsar.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Настройка Kafka с помощью Helm

    Для кластеров Milvus на K8s вы можете настроить Kafka в той же команде, которая запускает Milvus. В качестве альтернативы можно настроить Kafka с помощью файла values.yml по пути /charts/milvus в репозитории milvus-helm перед запуском Milvus.

    +

    Подробнее о том, как настроить Milvus с помощью Helm, см. в разделе Настройка Milvus с помощью диаграмм Helm. Подробные сведения об элементах конфигурации, связанных с Pulsar, см. в разделе Конфигурации, связанные с Pulsar.

    +

    Использование файла YAML

      +
    1. Настройте раздел externalConfigFiles в файле values.yaml, если вы хотите использовать Kafka в качестве системы хранения сообщений.
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    kafka:
    +      brokerList:
    +        -  <your_kafka_address>:<your_kafka_port>
    +      saslUsername:
    +      saslPassword:
    +      saslMechanisms: PLAIN
    +      securityProtocol: SASL_SSL    
    +
    +
      +
    1. После настройки предыдущих разделов и сохранения файла values.yaml выполните следующую команду, чтобы установить Milvus, использующий конфигурации Kafka.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Настройка RocksMQ с помощью Helm

    Автономный Milvus использует RocksMQ в качестве хранилища сообщений по умолчанию. Подробные шаги по настройке Milvus с помощью Helm см. в разделе Настройка Milvus с помощью диаграмм Helm. Подробные сведения об элементах конфигурации, связанных с RocksMQ, см. в разделе Конфигурации, связанные с RocksMQ.

    +
      +
    • Если вы запустили Milvus с RocksMQ и хотите изменить его настройки, вы можете запустить helm upgrade -f с измененными настройками в следующем YAML-файле.

    • +
    • Если вы установили автономный Milvus с помощью Helm с хранилищем сообщений, отличным от RocksMQ, и хотите изменить его обратно на RocksMQ, запустите helm upgrade -f со следующим YAML-файлом после того, как вы промоете все коллекции и остановите Milvus.

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    rocksmq:
    +      # The path where the message is stored in rocksmq
    +      # please adjust in embedded Milvus: /tmp/milvus/rdb_data
    +      path: /var/lib/milvus/rdb_data
    +      lrucacheratio: 0.06 # rocksdb cache memory ratio
    +      rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq
    +      retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.
    +      retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.
    +      compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data
    +      # compaction compression type, only support use 0,7.
    +      # 0 means not compress, 7 will use zstd
    +      # len of types means num of rocksdb level.
    +      compressionTypes: [0, 0, 7, 7, 7]    
    +
    +
    +

    Менять хранилище сообщений не рекомендуется. Если вы хотите это сделать, остановите все операции DDL, затем вызовите API FlushAll для промывки всех коллекций и, наконец, остановите Milvus до того, как вы действительно измените хранилище сообщений.

    +
    +

    Настройка NATS с помощью Helm

    NATS - это экспериментальное хранилище сообщений, альтернативное RocksMQ. Подробные шаги по настройке Milvus с помощью Helm см. в разделе Настройка Milvus с помощью диаграмм Helm. Подробные сведения о конфигурационных элементах, связанных с RocksMQ, см. в разделе Конфигурации, связанные с NATS.

    +
      +
    • Если вы запустили Milvus с NATS и хотите изменить его настройки, вы можете запустить helm upgrade -f с измененными настройками в следующем YAML-файле.

    • +
    • Если вы установили Milvus standalone с хранилищем сообщений, отличным от NATS, и хотите изменить его на NATS, запустите helm upgrade -f со следующим YAML-файлом после того, как вы промыли все коллекции и остановили Milvus.

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    mq:
    +      type: natsmq
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +
    +
    +

    Выбор между RocksMQ и NATS?

    +

    RockMQ использует CGO для взаимодействия с RocksDB и самостоятельно управляет памятью, в то время как NATS, встроенный в Milvus, делегирует управление памятью сборщику мусора (GC) Go.

    +

    В сценарии, когда пакет данных меньше 64 кб, RocksDB превосходит по использованию памяти, загрузке процессора и времени отклика. С другой стороны, если пакет данных больше 64 кб, NATS превосходит по времени отклика при достаточном объеме памяти и идеальном планировании GC.

    +

    В настоящее время рекомендуется использовать NATS только для экспериментов.

    +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Docker Compose или Helm:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_s3.json b/localization/v2.5.x/site/ru/adminGuide/deploy_s3.json new file mode 100644 index 000000000..a4133922c --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_s3.json @@ -0,0 +1 @@ +{"codeList":["minio:\n address: \n port: \n accessKeyID: \n secretAccessKey: \n useSSL: \n bucketName: \"\"\n","docker compose up\n","minio:\n enabled: false\n","externalS3:\n enabled: true\n host: \"\"\n port: \"\"\n accessKey: \"\"\n secretKey: \"\"\n useSSL: \n bucketName: \"\"\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host= --set externalS3.port= --set externalS3.accessKey= --set externalS3.secretKey= --set externalS3.bucketName=\n"],"headingContent":"Configure Object Storage with Docker Compose or Helm","anchorList":[{"label":"Настройка объектного хранилища с помощью Docker Compose или Helm","href":"Configure-Object-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"Настройка S3 с помощью Docker Compose","href":"Configure-S3-with-Docker-Compose","type":2,"isActive":false},{"label":"Настройка S3 на K8s","href":"Configure-S3-on-K8s","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/deploy_s3.md b/localization/v2.5.x/site/ru/adminGuide/deploy_s3.md new file mode 100644 index 000000000..2042c0c94 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/deploy_s3.md @@ -0,0 +1,134 @@ +--- +id: deploy_s3.md +title: Настройка объектного хранилища с помощью Docker Compose или Helm +related_key: 'S3, storage' +summary: >- + Узнайте, как настроить хранилище S3 для Milvus с помощью Docker Compose или + Helm. +--- +

    Настройка объектного хранилища с помощью Docker Compose или Helm

    По умолчанию Milvus использует MinIO для хранения объектов, но он также поддерживает использование Amazon Simple Storage Service (S3) в качестве постоянного хранилища объектов для файлов журналов и индексов. В этой теме описывается, как настроить S3 для Milvus. Вы можете пропустить эту тему, если вам достаточно MinIO.

    +

    Вы можете настроить S3 с помощью Docker Compose или на K8s.

    +

    Настройка S3 с помощью Docker Compose

    1. Настроить S3

    MinIO совместим с S3. Чтобы настроить S3 с помощью Docker Compose, укажите значения для секции minio в файле milvus.yaml по пути milvus/configs.

    +
    minio:
    +  address: <your_s3_endpoint>
    +  port: <your_s3_port>
    +  accessKeyID: <your_s3_access_key_id>
    +  secretAccessKey: <your_s3_secret_access_key>
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +

    Дополнительные сведения см. в разделе Конфигурации MinIO/S3.

    +

    2. Доработка docker-compose.yaml

    Вы также удалите переменную окружения MINIO_ADDRESS для службы milvus по адресу docker-compose.yaml. По умолчанию milvus будет использовать локальный minio вместо внешнего S3.

    +

    3. Запустите Milvus

    Выполните следующую команду, чтобы запустить Milvus, который использует конфигурации S3.

    +
    docker compose up
    +
    +
    Конфигурации вступают в силу только после запуска Milvus. Дополнительные сведения см. в разделе Запуск Milvus.
    +

    Настройка S3 на K8s

    Для кластеров Milvus на K8s можно настроить S3 в той же команде, которая запускает Milvus. В качестве альтернативы можно настроить S3 с помощью файла values.yml по пути /charts/milvus в репозитории milvus-helm перед запуском Milvus.

    +

    В следующей таблице перечислены ключи для настройки S3 в файле YAML.

    + + + + + + + + + + + + + + + +
    КлючОписаниеЗначение
    minio.enabledВключает или отключает MinIO.true/false
    externalS3.enabledВключает или отключает S3.true/false
    externalS3.hostКонечная точка для доступа к S3.
    externalS3.portПорт для доступа к S3.
    externalS3.rootPathКорневой путь к хранилищу S3.По умолчанию - строка emtpy.
    externalS3.accessKeyИдентификатор ключа доступа для S3.
    externalS3.secretKeyСекретный ключ доступа для S3.
    externalS3.bucketNameИмя ведра S3.
    externalS3.useSSLИспользовать ли SSL при подключенииЗначения по умолчанию false
    +

    Использование файла YAML

      +
    1. Настройте секцию minio в файле values.yaml.
    2. +
    +
    minio:
    +  enabled: false
    +
    +
      +
    1. Настройте секцию externalS3, используя значения из файла values.yaml.
    2. +
    +
    externalS3:
    +  enabled: true
    +  host: "<your_s3_endpoint>"
    +  port: "<your_s3_port>"
    +  accessKey: "<your_s3_access_key_id>"
    +  secretKey: "<your_s3_secret_key>"
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +
      +
    1. После настройки предыдущих разделов и сохранения файла values.yaml выполните следующую команду, чтобы установить Milvus, использующий конфигурации S3.
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    Использование команды

    Чтобы установить Milvus и настроить S3, выполните следующую команду, используя ваши значения.

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true  --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host=<your_s3_endpoint> --set externalS3.port=<your_s3_port> --set externalS3.accessKey=<your_s3_access_key_id> --set externalS3.secretKey=<your_s3_secret_key> --set externalS3.bucketName=<your_bucket_name>
    +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Docker Compose или Helm:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.json b/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.json new file mode 100644 index 000000000..5ff0d75ae --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create a user​\nclient.drop_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.client.ConnectConfig​\nimport io.milvus.v2.client.MilvusClientV2​\nimport io.milvus.v2.service.rbac.request.DropUserReq​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropUserReq dropUserReq = DropUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nclient.dropUser(dropUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.deleteUser({​\n username: 'user_1'​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","import io.milvus.v2.service.rbac.request.listUsersReq​\n​\nList resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listUsers()​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root']​\n\n","from pymilvus import MilvusClient​\n​\nclient.drop_role(role_name=\"role_a\")​\n\n","import io.milvus.v2.service.rbac.request.DropRoleReq​\n​\nDropRoleReq dropRoleReq = DropRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\nclient.dropRole(dropRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.dropRole({​\n roleName: 'role_a',​\n })​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List resp = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listRoles(​\n includeUserInfo: True​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin']​\n\n"],"headingContent":"Drop Users & Roles​","anchorList":[{"label":"Удаление пользователей и ролей","href":"Drop-Users--Roles​","type":1,"isActive":false},{"label":"Удаление пользователя","href":"Drop-a-user​","type":2,"isActive":false},{"label":"Сброс роли","href":"Drop-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.md b/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.md new file mode 100644 index 000000000..afc41aeec --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/drop_users_roles.md @@ -0,0 +1,205 @@ +--- +id: drop_users_roles.md +related_key: enable RBAC +summary: >- + Для обеспечения безопасности данных рекомендуется удалять пользователей и + роли, которые больше не используются. В этом руководстве описано, как удалять + пользователей и роли. +title: Удаление пользователей и ролей +--- +

    Удаление пользователей и ролей

    Для обеспечения безопасности данных рекомендуется удалять пользователей и роли, которые больше не используются. В этом руководстве описано, как удалять пользователей и роли.

    +

    Удаление пользователя

    В следующем примере показано, как удалить пользователя user_1.

    +
    +

    Пользователь root не может быть удален.

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create a user​
    +client.drop_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig​
    +import io.milvus.v2.client.MilvusClientV2​
    +import io.milvus.v2.service.rbac.request.DropUserReq​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropUserReq dropUserReq = DropUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +client.dropUser(dropUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.deleteUser({​
    +    username: 'user_1'​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    После того как пользователь будет удален, вы можете вывести список всех существующих пользователей, чтобы проверить, успешно ли прошла операция удаления.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.listUsersReq​
    +​
    +List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listUsers()​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Ниже приведен пример вывода. В списке нет ни одного user_1. Операция удаления прошла успешно.

    +
    ['root']​
    +
    +
    +

    Сброс роли

    В следующем примере показано, как сбросить роль role_a.

    +
    +

    Встроенная роль admin не может быть сброшена.

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.drop_role(role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropRoleReq​
    +​
    +DropRoleReq dropRoleReq = DropRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +client.dropRole(dropRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.dropRole({​
    +   roleName: 'role_a',​
    + })​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    После того как роль сброшена, вы можете перечислить все существующие роли, чтобы проверить, успешно ли прошла операция сброса.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> resp = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listRoles(​
    +    includeUserInfo: True​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Ниже приведен пример вывода. В списке нет ни одной роли role_a. Операция сброса прошла успешно.

    +
    ['admin']​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/dynamic_config.json b/localization/v2.5.x/site/ru/adminGuide/dynamic_config.json new file mode 100644 index 000000000..4522ccaea --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/dynamic_config.json @@ -0,0 +1 @@ +{"codeList":["$ etcdctl put by-dev/config/proxy/minPasswordLength 8\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl del by-dev/config/proxy/minPasswordLength \n# or \n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl get --prefix by-dev/config\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd\"\n","Offline > connect --etcd ip:port \nMilvus(by-dev) > show session # List all nodes with their server ID\nMilvus(by-dev) > visit querycoord 1 # Visit a node by server ID\nQueryCoord-1(ip:port) > configuration # List the configuration of the node\n"],"headingContent":"Configure Milvus on the Fly","anchorList":[{"label":"Настройка Milvus на лету","href":"Configure-Milvus-on-the-Fly","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-start","type":2,"isActive":false},{"label":"Изменение конфигураций","href":"Change-configurations","type":2,"isActive":false},{"label":"Откат конфигураций","href":"Roll-back-configurations","type":2,"isActive":false},{"label":"Просмотр конфигураций","href":"View-configurations","type":2,"isActive":false},{"label":"Применимые элементы конфигурации","href":"Applicable-configuration-items","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/dynamic_config.md b/localization/v2.5.x/site/ru/adminGuide/dynamic_config.md new file mode 100644 index 000000000..70e2b5194 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/dynamic_config.md @@ -0,0 +1,208 @@ +--- +id: dynamic_config.md +related_key: configure +summary: Узнайте о динамической конфигурации Milvus. +title: Настройка Milvus на лету +--- +

    Настройка Milvus на лету

    Milvus позволяет изменять некоторые конфигурации "на лету".

    +

    Прежде чем начать

    Вам необходимо убедиться, что:

    +
      +
    • У вас установлен Birdwatcher. Подробнее см. в разделе Установка Birdwatcher,
    • +
    • У вас установлен etcdctl. Подробнее см. в разделе Взаимодействие с etcd, или
    • +
    • У вас установлены другие клиенты etcd, например, клиент Python.
    • +
    +
    +
      +
    • В примерах этого руководства значение proxy.minPasswordLength заменено на 8. Вы можете заменить эти ключи на подходящие, перечисленные в разделе Применяемые элементы конфигурации.
    • +
    • В примерах этого руководства предполагается, что корневой путь вашего Milvus - by-dev. Все конфигурации перечислены по пути by-dev/config. Корневой путь Milvus зависит от способа установки. Для экземпляров, установленных с помощью диаграмм Helm, корневой путь по умолчанию равен by-dev. Если вы не знаете корневой путь, обратитесь к разделу Подключение к etcd.
    • +
    +
    +

    Изменение конфигураций

    В Milvus значение proxy.minPasswordLength по умолчанию установлено на 6. Чтобы изменить это значение, вы можете сделать следующее:

    +
    $ etcdctl put by-dev/config/proxy/minPasswordLength 8
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8"
    +
    +

    Затем вы можете проверить конфигурацию следующим образом:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    Откат конфигураций

    Milvus также позволяет откатить конфигурацию, если измененное значение больше не подходит.

    +
    $ etcdctl del by-dev/config/proxy/minPasswordLength 
    +# or 
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength"
    +
    +

    Затем вы можете проверить конфигурации следующим образом:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    Просмотр конфигураций

    Вместо просмотра значения конкретного элемента конфигурации можно также вывести список всех элементов.

    +
    $ etcdctl get --prefix by-dev/config
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd"
    +
    +

    Чтобы просмотреть конфигурации определенного узла:

    +
    Offline > connect --etcd ip:port 
    +Milvus(by-dev) > show session          # List all nodes with their server ID
    +Milvus(by-dev) > visit querycoord 1    # Visit a node by server ID
    +QueryCoord-1(ip:port) > configuration  # List the configuration of the node
    +
    +

    Применимые элементы конфигурации

    В настоящее время можно изменять следующие элементы конфигурации "на лету".

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Элемент конфигурацииЗначение по умолчанию
    pulsar.maxMessageSize5242880
    common.retentionDuration86400
    common.entityExpiration-1
    common.gracefulTime5000
    common.gracefulStopTimeout30
    quotaAndLimits.ddl.enabledFALSE
    quotaAndLimits.indexRate.enabledFALSE
    quotaAndLimits.flushRate.enabledFALSE
    quotaAndLimits.compactionRate.enabledFALSE
    quotaAndLimits.dml.enabledFALSE
    quotaAndLimits.dql.enabledFALSE
    quotaAndLimits.limits.collection.maxNum64
    quotaAndLimits.limitWriting.forceDenyFALSE
    quotaAndLimits.limitWriting.ttProtection.enabledFALSE
    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay9223372036854775807
    quotaAndLimits.limitWriting.memProtection.enabledTRUE
    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel0.85
    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel0.95
    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel0.85
    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel0.95
    quotaAndLimits.limitWriting.diskProtection.enabledTRUE
    quotaAndLimits.limitWriting.diskProtection.diskQuota+INF
    quotaAndLimits.limitReading.forceDenyFALSE
    quotaAndLimits.limitReading.queueProtection.enabledFALSE
    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold9223372036854775807
    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold+INF
    quotaAndLimits.limitReading.resultProtection.enabledFALSE
    quotaAndLimits.limitReading.resultProtection.maxReadResultRate+INF
    quotaAndLimits.limitReading.coolOffSpeed0.9
    autoIndex.enableFALSE
    autoIndex.params.build""
    autoIndex.params.extra""
    autoIndex.params.search""
    proxy.maxNameLength255
    proxy.maxUsernameLength32
    proxy.minPasswordLength6
    proxy.maxPasswordLength256
    proxy.maxFieldNum64
    proxy.maxShardNum256
    proxy.maxDimension32768
    proxy.maxUserNum100
    proxy.maxRoleNum10
    queryNode.enableDiskTRUE
    dataCoord.segment.diskSegmentMaxSize2048
    dataCoord.compaction.enableAutoCompactionTRUE
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/grant_privileges.json b/localization/v2.5.x/site/ru/adminGuide/grant_privileges.json new file mode 100644 index 000000000..c086e7f11 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/grant_privileges.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"privilege_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\n\nawait milvusClient.grantPrivilege({\n roleName: 'role_a',\n object: 'Collection', \n objectName: 'collection_01',\n privilegeName: 'Search'\n });\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"privilege_group_1\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n","from pymilvus import MilvusClient\n\nclient.describe_role(role_name=\"role_a\")\n","import io.milvus.v2.service.rbac.response.DescribeRoleResp;\nimport io.milvus.v2.service.rbac.request.DescribeRoleReq\n\nDescribeRoleReq describeRoleReq = DescribeRoleReq.builder()\n .roleName(\"role_a\")\n .build();\nDescribeRoleResp resp = client.describeRole(describeRoleReq);\nList infos = resp.getGrantInfos();\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.ListRoles(context.Background())\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nawait milvusClient.describeRole({roleName: 'role_a'});\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\"\n}'\n","{\n \"role\": \"role_a\",\n \"privileges\": [\n {\n \"collection_name\": \"collection_01\",\n \"db_name\": \"default\",\n \"role_name\": \"role_a\",\n \"privilege\": \"Search\",\n \"grantor_name\": \"root\"\n },\n \"privilege_group_1\"\n ]\n}\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"privielge_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n"],"headingContent":"Grant Privilege or Privilege Group to Roles​","anchorList":[{"label":"Предоставление привилегий или групп привилегий ролям","href":"Grant-Privilege-or-Privilege-Group-to-Roles​","type":1,"isActive":false},{"label":"Предоставление привилегии или группы привилегий роли","href":"Grant-a-privilege-or-a-privilege-group-to-a-role​","type":2,"isActive":false},{"label":"Описать роль","href":"Describe-a-role","type":2,"isActive":false},{"label":"Отмена привилегии или группы привилегий у роли","href":"Revoke-a-privilege-or-a-privilege-group-from-a-role","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/grant_privileges.md b/localization/v2.5.x/site/ru/adminGuide/grant_privileges.md new file mode 100644 index 000000000..65086682a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/grant_privileges.md @@ -0,0 +1,542 @@ +--- +id: grant_privileges.md +related_key: enable RBAC +summary: >- + После создания роли вы можете назначить ей привилегии. В этом руководстве + описано, как предоставлять привилегии или группы привилегий роли. +title: Предоставление привилегий или групп привилегий ролям +--- +

    Предоставление привилегий или групп привилегий ролям

    После создания роли вы можете предоставить ей привилегии. В этом руководстве описано, как предоставлять привилегии или группы привилегий роли.

    +

    Предоставление привилегии или группы привилегий роли

    В Milvus 2.5 представлена новая версия API, которая упрощает операцию предоставления привилегий. Вам больше не нужно искать тип объекта при предоставлении привилегии роли. Ниже перечислены параметры и соответствующие пояснения.

    +
      +
    • Имя_роли: имя целевой роли, которой необходимо предоставить привилегию(и) или группу(ы) привилегий.

    • +
    • Ресурс: Целевой ресурс привилегии, которым может быть конкретный экземпляр, база данных или коллекция. В следующей таблице объясняется, как указать ресурс в методе client.grantV2().

    • +
    +

    Уровень

    +

    Ресурс

    +

    Метод предоставления

    +

    Примечания

    +

    Коллекция

    +

    +

    Конкретная коллекция

    +

    +

    client.grant_privilege_v2(role_name="roleA", privilege="CollectionAdmin", collection_name="col1", db_name="db1")

    +

    Введите имя целевой коллекции и имя базы данных, к которой принадлежит целевая коллекция.

    +

    +

    Все коллекции под определенной базой данных

    +

    client.grant_privilege_v2(role_name="roleA", privilege="CollectionAdmin", collection_name="*", db_name="db1")

    +

    Введите имя целевой базы данных и подстановочный знак `*` в качестве имени коллекции.

    +

    **База данных**

    +

    Определенная база данных

    +

    client.grant_privilege_v2(role_name="roleA", privilege="DatabaseAdmin", collection_name="*", db_name="db1")

    +

    Введите имя целевой базы данных и подстановочный знак `*` в качестве имени коллекции.

    +

    +

    Все базы данных под текущим экземпляром

    +

    client.grant_privilege_v2(role_name="roleA", privilege="DatabaseAdmin", collection_name="*", db_name="*")

    +

    Введите `*` в качестве имени базы данных и `*` в качестве имени коллекции.

    +

    **Instance**

    +

    Текущий экземпляр

    +

    client.grant_privilege_v2(role_name="roleA", privilege="ClusterAdmin", collection_name="*", db_name="*")

    +

    Введите `*` в качестве имени базы данных и `*` в качестве имени коллекции.

    +
    +
      +
    • Привилегия: Конкретная привилегия или группа привилегий, которые необходимо предоставить роли. В настоящее время Milvus предоставляет 56 типов привилегий, которые вы можете назначить. В таблице ниже перечислены привилегии в Milvus.

      +

      +

      Колонка типа в таблице ниже является пользовательской для облегчения быстрого поиска привилегий и используется только для классификации. При назначении привилегий вам не нужно разбираться в типах. Вам просто нужно ввести соответствующие привилегии.

      +

    • +
    +

    **Тип **

    +

    **Привилегия**

    +

    **Описание**

    +

    **Релевантное описание API на стороне клиента**.

    +

    Привилегии базы данных

    +

    ListDatabases

    +

    Просмотр всех баз данных в текущем экземпляре

    +

    [ListDatabases](https://milvus.io/docs/manage_databases.md)

    +

    DescribeDatabase

    +

    Просмотр сведений о базе данных

    +

    [DescribeDatabase](https://milvus.io/docs/manage_databases.md)

    +

    Создать базу данных

    +

    Создать базу данных

    +

    [CreateDatabase](https://milvus.io/docs/manage_databases.md)

    +

    DropDatabase

    +

    Сбросить базу данных

    +

    [DropDatabase](https://milvus.io/docs/manage_databases.md)

    +

    AlterDatabase

    +

    Изменение свойств базы данных

    +

    [AlterDatabase](https://milvus.io/docs/manage_databases.md)

    +

    Привилегии коллекции

    +

    +

    GetFlushState

    +

    Проверка состояния операции промывки коллекции

    +

    [GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    GetLoadState

    +

    Проверка состояния загрузки коллекции

    +

    [GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    GetLoadingProgress

    +

    Проверка прогресса загрузки коллекции

    +

    [GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)

    +

    ShowCollections

    +

    Просмотр всех коллекций с привилегиями коллекции

    +

    [ShowCollections](https://milvus.io/docs/view-collections.md)

    +

    ListAliases

    +

    Просмотр всех псевдонимов коллекции

    +

    [ListAliases](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/list_aliases.md)

    +

    DescribeCollection

    +

    Просмотр подробной информации о коллекции

    +

    [DescribeCollection](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_collection.md)

    +

    DescribeAlias

    +

    Просмотр сведений о псевдониме

    +

    [DescribeAlias](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_alias.md)

    +

    GetStatistics

    +

    Получение статистики коллекции (например, количество сущностей в коллекции)

    +

    [GetCollectionStatistics](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/get_collection_stats.md)

    +

    CreateCollection

    +

    Создать коллекцию

    +

    [CreateCollection](https://milvus.io/docs/create-collection.md)

    +

    DropCollection

    +

    Сбросить коллекцию

    +

    [DropCollection](https://milvus.io/docs/drop-collection.md)

    +

    Загрузить

    +

    Загрузить коллекцию

    +

    [LoadCollection](https://milvus.io/docs/load-and-release.md)/[GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)/[GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    Освободить

    +

    Освободить коллекцию

    +

    [ReleaseCollection](https://milvus.io/docs/load-and-release.md)

    +

    Промыть

    +

    +

    Сохраняет все сущности в коллекции в запечатанном сегменте. Любая сущность, вставленная после операции flush, будет сохранена в новом сегменте.

    +

    [Flush](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)/[GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    Уплотнение

    +

    Ручной запуск уплотнения

    +

    [Compact](https://milvus.io/docs/v2.0.x/compact_data.md)

    +

    RenameCollection

    +

    Переименовать коллекцию

    +

    [RenameCollection](https://milvus.io/docs/modify-collection.md)

    +

    CreateAlias

    +

    Создать псевдоним для коллекции

    +

    [CreateAlias](https://milvus.io/docs/manage-aliases.md)

    +

    DropAlias

    +

    Удалить псевдоним коллекции

    +

    [DropAlias](https://milvus.io/docs/manage-aliases.md)

    +

    FlushAll

    +

    Промыть все коллекции в базе данных

    +

    [FlushAll](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/flush_all.md)

    +

    Привилегии разделов

    +

    HasPartition

    +

    Проверяет, существует ли раздел.

    +

    [HasPartition](https://milvus.io/docs/manage-partitions.md)

    +

    ShowPartitions

    +

    Просмотр всех разделов в коллекции

    +

    [ShowPartitions](https://milvus.io/docs/manage-partitions.md)

    +

    CreatePartition

    +

    Создать раздел

    +

    [CreatePartition](https://milvus.io/docs/manage-partitions.md)

    +

    DropPartition

    +

    Удалить раздел

    +

    [DropPartition](https://milvus.io/docs/manage-partitions.md)

    +

    Привилегии индекса

    +

    IndexDetail

    +

    Просмотр сведений об индексе

    +

    +

    [DescribeIndex/GetIndexState/GetIndexBuildProgress](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    CreateIndex

    +

    Создать индекс

    +

    [CreateIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    DropIndex

    +

    Удалить индекс

    +

    [DropIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    Привилегии управления ресурсами

    +

    +

    LoadBalance

    +

    Достичь баланса нагрузки

    +

    [LoadBalance](https://milvus.io/docs/resource_group.md)

    +

    CreateResourceGroup

    +

    Создание группы ресурсов

    +

    [CreateResourceGroup](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/create_resource_group.md)

    +

    DropResourceGroup

    +

    Сбросить группу ресурсов

    +

    [DropResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    UpdateResourceGroups

    +

    Обновить группу ресурсов

    +

    [UpdateResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    Описать группу ресурсов [DescribeResourceGroup]()

    +

    Просмотр сведений о группе ресурсов

    +

    [DescribeResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    ListResourceGroups

    +

    Просмотр всех групп ресурсов текущего экземпляра

    +

    [ListResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    TransferNode

    +

    Передача узлов между группами ресурсов

    +

    [TransferNode](https://milvus.io/docs/resource_group.md)

    +

    TransferReplica

    +

    Передача реплик между группами ресурсов

    +

    [TransferReplica](https://milvus.io/docs/resource_group.md)

    +

    BackupRBAC

    +

    Создание резервной копии всех операций, связанных с RBAC, в текущем экземпляре

    +

    BackupRBAC

    +

    RestoreRBAC

    +

    Восстановление резервной копии всех операций, связанных с RBAC, в текущем экземпляре

    +

    RestoreRBAC

    +

    Привилегии сущности

    +

    +

    Запрос

    +

    Выполнить запрос

    +

    [Query](https://milvus.io/docs/get-and-scalar-query.md)

    +

    Поиск

    +

    Провести поиск

    +

    [Поиск](https://milvus.io/docs/single-vector-search.md)

    +

    Вставить

    +

    Вставить объекты

    +

    [Вставить](https://milvus.io/docs/insert-update-delete.md)

    +

    Удалить

    +

    Удалить сущности

    +

    [Delete](https://milvus.io/docs/delete-entities.md)

    +

    Upsert

    +

    Upsert entities

    +

    [Upsert](https://milvus.io/docs/upsert-entities.md)

    +

    Импорт

    +

    Массовая вставка или импорт сущностей

    +

    [BulkInsert/Import](https://milvus.io/docs/import-data.md)

    +

    Привилегии RBAC

    +

    CreateOwnership

    +

    Создание пользователя или роли

    +

    [CreateUser/CreateRole](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    UpdateUser

    +

    Обновление пароля пользователя

    +

    [UpdateCredential](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    DropOwnership

    +

    Удалить пароль пользователя или роль

    +

    [DeleteCredential/DropRole](https://zilliverse.feishu.cn/wiki/OqZnwJHrJilLPukfvp5cSgnmnTh)

    +

    SelectOwnership

    +

    Просмотр всех пользователей, которым предоставлена определенная роль

    +

    [SelectRole/SelectGrant](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    ManageOwnership

    +

    Управление пользователем или ролью или предоставление роли пользователю

    +

    [OperateUserRole/OperatePrivilege/OperatePrivilegeV2](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    SelectUser

    +

    Просмотр всех ролей, предоставленных пользователю

    +

    [SelectUser](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    CreatePrivilegeGroup

    +

    Создать группу привилегий

    +

    [CreatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    DropPrivilegeGroup

    +

    Удалить группу привилегий

    +

    [DropPrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    ListPrivilegeGroups

    +

    Просмотр всех групп привилегий в текущем экземпляре

    +

    [ListPrivilegeGroups](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    OperatePrivilegeGroup

    +

    Добавление привилегий в группу привилегий или удаление привилегий из нее

    +

    [OperatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +
    +

    В следующем примере показано, как предоставить привилегию PrivilegeSearch на collection_01 в базе данных по умолчанию, а также группу привилегий с именем privilege_group_1 роли role_a.

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "privilege_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +
    +await milvusClient.grantPrivilege({
    +   roleName: 'role_a',
    +   object: 'Collection', 
    +   objectName: 'collection_01',
    +   privilegeName: 'Search'
    + });
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "privilege_group_1",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    +

    Описать роль

    Следующий пример демонстрирует, как просмотреть привилегии, предоставленные роли role_a, используя метод describe_role.

    + +
    from pymilvus import MilvusClient
    +
    +client.describe_role(role_name="role_a")
    +
    +
    import io.milvus.v2.service.rbac.response.DescribeRoleResp;
    +import io.milvus.v2.service.rbac.request.DescribeRoleReq
    +
    +DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
    +        .roleName("role_a")
    +        .build();
    +DescribeRoleResp resp = client.describeRole(describeRoleReq);
    +List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.ListRoles(context.Background())
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +await milvusClient.describeRole({roleName: 'role_a'});
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a"
    +}'
    +
    +

    Ниже приведен пример вывода.

    +
    {
    +     "role": "role_a",
    +     "privileges": [
    +         {
    +             "collection_name": "collection_01",
    +             "db_name": "default",
    +             "role_name": "role_a",
    +             "privilege": "Search",
    +             "grantor_name": "root"
    +         },
    +         "privilege_group_1"
    +     ]
    +}
    +
    +

    Отмена привилегии или группы привилегий у роли

    В следующем примере показано, как отозвать привилегию PrivilegeSearch на collection_01 в базе данных по умолчанию, а также группу привилегий privilege_group_1, которые были предоставлены роли role_a.

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "privielge_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/grant_roles.json b/localization/v2.5.x/site/ru/adminGuide/grant_roles.json new file mode 100644 index 000000000..4b3e98a75 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/grant_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.grant_role(user_name=\"user_1\", role_name=\"role_a\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.GrantRoleReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nGrantRoleReq grantRoleReq = GrantRoleReq.builder()​\n .roleName(\"role_a\")​\n .userName(\"user_1\")​\n .build();​\nclient.grantRole(grantRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.grantRole({​\n username: 'user_1',​\n roleName: 'role_a'​\n })​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\",​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.describe_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.service.rbac.request.DescribeUserReq;​\nimport io.milvus.v2.service.rbac.response.DescribeUserResp;​\n​\nDescribeUserReq describeUserReq = DescribeUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nDescribeUserResp describeUserResp = client.describeUser(describeUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.describeUser({username: 'user_1'})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","{'user_name': 'user_1', 'roles': 'role_a'}​\n\n","from pymilvus import MilvusClient​\n​\nclient.revoke_role(​\n user_name='user_1',​\n role_name='role_a'​\n)​\n\n","import io.milvus.v2.service.rbac.request.RevokeRoleReq;​\n​\nclient.revokeRole(RevokeRoleReq.builder()​\n .userName(\"user_1\")​\n .roleName(\"role_a\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"roleName\": \"role_a\"​\n}'​\n\n"],"headingContent":"Grant Roles to Users​","anchorList":[{"label":"Предоставление ролей пользователям","href":"Grant-Roles-to-Users​","type":1,"isActive":false},{"label":"Предоставление роли пользователю","href":"Grant-a-role-to-a-user​","type":2,"isActive":false},{"label":"Описать пользователя","href":"Describe-user​","type":2,"isActive":false},{"label":"Отмена роли","href":"Revoke-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/grant_roles.md b/localization/v2.5.x/site/ru/adminGuide/grant_roles.md new file mode 100644 index 000000000..b4a037f2b --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/grant_roles.md @@ -0,0 +1,204 @@ +--- +id: grant_roles.md +related_key: enable RBAC +summary: >- + После создания роли и предоставления ей привилегий вы можете предоставить роль + пользователям, чтобы они могли получать доступ к ресурсам и выполнять + действия, определенные ролью. Вы можете предоставить несколько ролей одному + пользователю или предоставить одну роль нескольким пользователям. В этом + руководстве описано, как предоставлять роли пользователям. +title: Предоставление ролей пользователям +--- +

    Предоставление ролей пользователям

    После создания роли и предоставления ей привилегий вы можете предоставить роль пользователям, чтобы они могли получать доступ к ресурсам и выполнять действия, определенные ролью. Вы можете предоставить несколько ролей одному пользователю или предоставить одну роль нескольким пользователям. В этом руководстве описано, как назначать роли пользователям.

    +

    Встроенному пользователю root в Milvus уже присвоена роль admin, которая обладает всеми привилегиями. Вам не нужно назначать ему другие роли.

    +

    Предоставление роли пользователю

    В следующем примере показано, как предоставить роль role_a пользователю user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.grant_role(user_name="user_1", role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.GrantRoleReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +GrantRoleReq grantRoleReq = GrantRoleReq.builder()​
    +        .roleName("role_a")​
    +        .userName("user_1")​
    +        .build();​
    +client.grantRole(grantRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.grantRole({​
    +   username: 'user_1',​
    +   roleName: 'role_a'​
    + })​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a",​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    Описать пользователя

    После предоставления роли пользователю вы можете проверить, успешно ли прошла операция предоставления, с помощью метода describe_user().

    +

    Следующий пример демонстрирует, как проверить роль(и) пользователя user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.describe_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DescribeUserReq;​
    +import io.milvus.v2.service.rbac.response.DescribeUserResp;​
    +​
    +DescribeUserReq describeUserReq = DescribeUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +DescribeUserResp describeUserResp = client.describeUser(describeUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.describeUser({username: 'user_1'})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    Ниже приведен пример вывода.

    +
    {'user_name': 'user_1', 'roles': 'role_a'}​
    +
    +
    +

    Отмена роли

    Вы также можете отозвать роль, которая была назначена пользователю.

    +

    В следующем примере показано, как отозвать роль role_a, назначенную пользователю user_1.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.revoke_role(​
    +    user_name='user_1',​
    +    role_name='role_a'​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RevokeRoleReq;​
    +​
    +client.revokeRole(RevokeRoleReq.builder()​
    +        .userName("user_1")​
    +        .roleName("role_a")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.json b/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.json new file mode 100644 index 000000000..74f86c4dd --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.json @@ -0,0 +1 @@ +{"codeList":["rootCoord:\n maxGeneralCapacity: 65536\n","60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960\n","failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:\n"],"headingContent":"Limit Collection Counts","anchorList":[{"label":"Ограничение количества коллекций","href":"Limit-Collection-Counts","type":1,"isActive":false},{"label":"Параметры конфигурации","href":"Configuration-options","type":2,"isActive":false},{"label":"Расчет количества коллекций","href":"Calculating-the-number-of-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.md b/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.md new file mode 100644 index 000000000..2b722133b --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/limit_collection_counts.md @@ -0,0 +1,72 @@ +--- +id: limit_collection_counts.md +title: Установите лимиты на количество коллекций +--- +

    Ограничение количества коллекций

    Экземпляр Milvus допускает до 65 536 коллекций. Однако слишком большое количество коллекций может привести к проблемам с производительностью. Поэтому рекомендуется ограничить количество коллекций, создаваемых в экземпляре Milvus.

    +

    В этом руководстве приведены инструкции по установке ограничений на количество коллекций в экземпляре Milvus.

    +

    Конфигурация зависит от способа установки экземпляра Milvus.

    +
      +
    • Для экземпляров Milvus, установленных с помощью Helm Charts

      +

      Добавьте конфигурацию в файл values.yaml в разделе config. Подробнее см. в разделе Настройка Milvus с помощью Helm Charts.

    • +
    • Для экземпляров Milvus, установленных с помощью Docker Compose

      +

      Добавьте конфигурацию в файл milvus.yaml, который вы использовали для запуска экземпляра Milvus. Подробнее см. в разделе Настройка Milvus с помощью Docker Compose.

    • +
    • Для экземпляров Milvus, установленных с помощью Operator

      +

      Добавьте конфигурацию в раздел spec.components пользовательского ресурса Milvus. Подробнее см. в разделе Настройка Milvus с помощью Operator.

    • +
    +

    Параметры конфигурации

    rootCoord:
    +    maxGeneralCapacity: 65536
    +
    +

    Параметр maxGeneralCapacity задает максимальное количество коллекций, которое может содержать текущий экземпляр Milvus. Значение по умолчанию - 65536.

    +

    Расчет количества коллекций

    В коллекции можно создать несколько шардов и разделов. Осколки - это логические единицы, используемые для распределения операций записи данных между несколькими узлами данных. Разделы - это логические единицы, используемые для повышения эффективности поиска данных путем загрузки только подмножества данных коллекции. При подсчете количества коллекций в текущем экземпляре Milvus необходимо также подсчитать количество шардов и разделов.

    +

    Например, предположим, что вы уже создали 100 коллекций, в 60 из которых есть 2 шарда и 4 раздела, а в остальных 40 коллекциях - 1 шард и 12 разделов. Общее количество единиц коллекции (вычисляется как shards × partitions) можно определить следующим образом:

    +
    60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960
    +
    +

    В данном примере рассчитанное общее количество коллекций, равное 960, представляет собой текущее использование. Параметр maxGeneralCapacity определяет максимальное количество единиц коллекции, которое может поддерживать экземпляр, по умолчанию он установлен на 65536. Это означает, что экземпляр может поддерживать до 65 536 единиц сбора. Если общее количество превысит этот предел, система выдаст следующее сообщение об ошибке:

    +
    failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:
    +
    +

    Чтобы избежать этой ошибки, можно либо уменьшить количество осколков или разделов в существующих или новых коллекциях, либо удалить некоторые коллекции, либо увеличить значение maxGeneralCapacity.

    diff --git a/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.json b/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.json new file mode 100644 index 000000000..f29293135 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: \n msgStreamType: 'natsmq'\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n pulsar: # Optional\n # Whether (=true) to use an existed external pulsar as specified in the field endpoints or \n # (=false) create a new pulsar inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external pulsar endpoints if external=true\n endpoints:\n - 192.168.1.1:6650\n components: {}\n config: {} \n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n pulsar:\n inCluster:\n values:\n components:\n autorecovery: false\n zookeeper:\n replicaCount: 1\n bookkeeper:\n replicaCount: 1\n resoureces:\n limit:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n broker:\n replicaCount: 1\n configData:\n ## Enable `autoSkipNonRecoverableData` since bookkeeper is running\n ## without persistence\n autoSkipNonRecoverableData: \"true\"\n managedLedgerDefaultEnsembleSize: \"1\"\n managedLedgerDefaultWriteQuorum: \"1\"\n managedLedgerDefaultAckQuorum: \"1\"\n proxy:\n replicaCount: 1\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n config:\n kafka:\n # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL \n securityProtocol: PLAINTEXT\n # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512\n saslMechanisms: PLAIN\n saslUsername: \"\"\n saslPassword: \"\"\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n msgStreamType: \"kafka\"\n kafka:\n external: true\n brokerList: \n - \"kafkaBrokerAddr1:9092\"\n - \"kafkaBrokerAddr2:9092\"\n # ...\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec: \n dependencies:\n msgStreamType: \"kafka\"\n kafka:\n inCluster: \n values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka\n components: {}\n config: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Message Storage with Milvus Operator","anchorList":[{"label":"Настройка хранилища сообщений в Milvus Operator","href":"Configure-Message-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":2,"isActive":false},{"label":"Настройка RocksMQ","href":"Configure-RocksMQ","type":2,"isActive":false},{"label":"Настройка NATS","href":"Configure-NATS","type":2,"isActive":false},{"label":"Настройка Pulsar","href":"Configure-Pulsar","type":2,"isActive":false},{"label":"Настройка Kafka","href":"Configure-Kafka","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.md b/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.md new file mode 100644 index 000000000..2d7f8530e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/message_storage_operator.md @@ -0,0 +1,348 @@ +--- +id: message_storage_operator.md +title: Настройка хранилища сообщений в Milvus Operator +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 'Узнайте, как настроить хранение сообщений с помощью Milvus Operator.' +--- +

    Настройка хранилища сообщений в Milvus Operator

    Milvus использует RocksMQ, Pulsar или Kafka для управления журналами последних изменений, вывода потоковых журналов и предоставления подписок на журналы. В этой теме описывается настройка зависимостей хранилища сообщений при установке Milvus с Milvus Operator. Дополнительные сведения см. в разделе Настройка хранилища сообщений с Milvus Operator в репозитории Milvus Operator.

    +

    В этой теме предполагается, что вы развернули Milvus Operator.

    +
    Дополнительные сведения см. в разделе Развертывание Milvus Operator.
    +

    Вам нужно указать файл конфигурации для использования Milvus Operator для запуска кластера Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Для настройки сторонних зависимостей достаточно отредактировать шаблон кода в milvus_cluster_default.yaml. В следующих разделах описывается настройка объектного хранилища, etcd и Pulsar соответственно.

    +

    Прежде чем начать

    В таблице ниже показано, поддерживаются ли RocksMQ, NATS, Pulsar и Kafka в автономном и кластерном режиме Milvus.

    + + + + + + + + +
    RocksMQNATSPulsarKafka
    Автономный режим✔️✔️✔️✔️
    Кластерный режим✖️✖️✔️✔️
    +

    Существуют и другие ограничения на указание хранилища сообщений:

    +
      +
    • Поддерживается только одно хранилище сообщений для одного экземпляра Milvus. Однако у нас сохраняется обратная совместимость с несколькими хранилищами сообщений, установленными для одного экземпляра. Приоритет следующий:
        +
      • автономный режим: RocksMQ (по умолчанию) > Pulsar > Kafka
      • +
      • кластерный режим: Pulsar (по умолчанию) > Kafka
      • +
      • Наборы, представленные в версии 2.3, не участвуют в этих правилах приоритета в целях обратной совместимости.
      • +
    • +
    • Хранилище сообщений не может быть изменено во время работы системы Milvus.
    • +
    • Поддерживается только версия Kafka 2.x или 3.x.
    • +
    +

    Настройка RocksMQ

    RocksMQ - это хранилище сообщений по умолчанию в автономной системе Milvus.

    +
    +

    В настоящее время настроить RocksMQ в качестве хранилища сообщений для Milvus standalone можно только с помощью Milvus Operator.

    +
    +

    Пример

    В следующем примере настраивается служба RocksMQ.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    Настройка NATS

    NATS - это альтернативное хранилище сообщений для NATS.

    +

    Пример

    В следующем примере настроена служба NATS.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: 
    +    msgStreamType: 'natsmq'
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +  components: {}
    +  config: {}
    +
    +

    Чтобы перенести хранилище сообщений с RocksMQ на NATS, сделайте следующее:

    +
      +
    1. Остановите все операции DDL.

    2. +
    3. Вызовите API FlushAll, а затем остановите Milvus после завершения выполнения вызова API.

    4. +
    5. Измените msgStreamType на natsmq и внесите необходимые изменения в настройки NATS на spec.dependencies.natsmq.

    6. +
    7. Снова запустите Milvus и проверьте:

      +
        +
      • В журналах присутствует запись с текстом mqType=natsmq.
      • +
      • Каталог с именем jetstream присутствует в каталоге, указанном в spec.dependencies.natsmq.server.storeDir.
      • +
    8. +
    9. (Необязательно) Создайте резервную копию и очистите файлы данных в каталоге хранения RocksMQ.

    10. +
    +
    +

    Выбор между RocksMQ и NATS?

    +

    RocksMQ использует CGO для взаимодействия с RocksDB и самостоятельно управляет памятью, в то время как NATS, встроенный в Milvus, делегирует управление памятью сборщику мусора (GC) Go.

    +

    В сценарии, когда пакет данных меньше 64 кб, RocksDB превосходит по использованию памяти, загрузке процессора и времени отклика. С другой стороны, если пакет данных больше 64 кб, NATS превосходит по времени отклика при достаточном объеме памяти и идеальном планировании GC.

    +

    В настоящее время рекомендуется использовать NATS только для экспериментов.

    +
    +

    Настройка Pulsar

    Pulsar управляет журналами последних изменений, выводит потоковые журналы и обеспечивает подписку на журналы. Настройка Pulsar для хранения сообщений поддерживается как в автономном Milvus, так и в кластере Milvus. Однако в Milvus Operator вы можете настроить Pulsar в качестве хранилища сообщений только для кластера Milvus. Для настройки Pulsar добавьте необходимые поля в поле spec.dependencies.pulsar.

    +

    pulsar Поддерживаются external и inCluster.

    +

    Внешний Pulsar

    external указывает на использование внешней службы Pulsar. Поля, используемые для настройки внешней службы Pulsar, включают:

    +
      +
    • external: Значение true указывает на то, что Milvus использует внешнюю службу Pulsar.
    • +
    • endpoints: Конечные точки Pulsar.
    • +
    +

    Пример

    В следующем примере настраивается внешняя служба Pulsar.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    pulsar: # Optional
    +      # Whether (=true) to use an existed external pulsar as specified in the field endpoints or 
    +      # (=false) create a new pulsar inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external pulsar endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:6650
    +  components: {}
    +  config: {}           
    +
    +

    Внутренний Pulsar

    inCluster указывает, что при запуске кластера Milvus в нем автоматически запускается служба Pulsar.

    +

    Пример

    В следующем примере настраивается внутренняя служба Pulsar.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    pulsar:
    +      inCluster:
    +        values:
    +          components:
    +            autorecovery: false
    +          zookeeper:
    +            replicaCount: 1
    +          bookkeeper:
    +            replicaCount: 1
    +            resoureces:
    +              limit:
    +                cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +          broker:
    +            replicaCount: 1
    +            configData:
    +              ## Enable `autoSkipNonRecoverableData` since bookkeeper is running
    +              ## without persistence
    +              autoSkipNonRecoverableData: "true"
    +              managedLedgerDefaultEnsembleSize: "1"
    +              managedLedgerDefaultWriteQuorum: "1"
    +              managedLedgerDefaultAckQuorum: "1"
    +          proxy:
    +            replicaCount: 1
    +  components: {}
    +  config: {}            
    +
    +
    В этом примере указывается количество реплик каждого компонента Pulsar, вычислительные ресурсы Pulsar BookKeeper и другие конфигурации.
    +
    Полный набор элементов конфигурации для настройки внутреннего сервиса Pulsar находится в values.yaml. Добавьте необходимые элементы конфигурации в файл pulsar.inCluster.values, как показано в предыдущем примере.
    +

    Предполагая, что файл конфигурации имеет имя milvuscluster.yaml, выполните следующую команду, чтобы применить конфигурацию.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Настройка Kafka

    Pulsar - это хранилище сообщений по умолчанию в кластере Milvus. Если вы хотите использовать Kafka, добавьте необязательное поле msgStreamType для настройки Kafka.

    +

    kafka Поддерживаются external и inCluster.

    +

    Внешняя Kafka

    external указывает на использование внешней службы Kafka.

    +

    Поля, используемые для настройки внешнего сервиса Kafka, включают:

    +
      +
    • external: Значение true указывает на то, что Milvus использует внешнюю службу Kafka.
    • +
    • brokerList: Список брокеров для отправки сообщений.
    • +
    +

    Пример

    В следующем примере настраивается внешний сервис Kafka.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  config:
    +    kafka:
    +      # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL 
    +      securityProtocol: PLAINTEXT
    +      # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512
    +      saslMechanisms: PLAIN
    +      saslUsername: ""
    +      saslPassword: ""
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    msgStreamType: "kafka"
    +    kafka:
    +      external: true
    +      brokerList: 
    +        - "kafkaBrokerAddr1:9092"
    +        - "kafkaBrokerAddr2:9092"
    +        # ...
    +
    +
    +

    Конфигурации SASL поддерживаются в версии оператора v0.8.5 или выше.

    +
    +

    Внутренний Kafka

    inCluster указывает, что при запуске кластера Milvus в нем автоматически запускается служба Kafka.

    +

    Пример

    В следующем примере настраивается внутренняя служба Kafka.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec: 
    +  dependencies:
    +    msgStreamType: "kafka"
    +    kafka:
    +      inCluster: 
    +        values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka
    +  components: {}
    +  config: {}
    +
    +

    Полный список элементов конфигурации для настройки внутренней службы Kafka можно найти здесь. Добавьте необходимые элементы конфигурации по адресу kafka.inCluster.values.

    +

    Предполагая, что файл конфигурации имеет имя milvuscluster.yaml, выполните следующую команду, чтобы применить конфигурацию.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Milvus Operator:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.json b/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.json new file mode 100644 index 000000000..d7c8e60ec --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","kind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n etcd: # Optional\n # Whether (=true) to use an existed external etcd as specified in the field endpoints or \n # (=false) create a new etcd inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external etcd endpoints if external=true\n endpoints:\n - 192.168.1.1:2379\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n etcd:\n inCluster:\n values:\n replicaCount: 5\n resources:\n limits: \n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Meta Storage with Milvus Operator","anchorList":[{"label":"Настройка хранения метаданных с помощью Milvus Operator","href":"Configure-Meta-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Настройка etcd","href":"Configure-etcd","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.md b/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.md new file mode 100644 index 000000000..0920f57ca --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/meta_storage_operator.md @@ -0,0 +1,117 @@ +--- +id: meta_storage_operator.md +title: Настройка хранения метаданных с помощью Milvus Operator +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 'Узнайте, как настроить метахранилище с помощью Milvus Operator.' +--- +

    Настройка хранения метаданных с помощью Milvus Operator

    Milvus использует etcd для хранения метаданных. В этой теме рассказывается о том, как настроить зависимость от метахранилища при установке Milvus с Milvus Operator. Для получения дополнительной информации см. раздел Настройка метахранилища с Milvus Operator в репозитории Milvus Operator.

    +

    В этой теме предполагается, что вы развернули Milvus Operator.

    +
    Дополнительные сведения см. в разделе Развертывание Milvus Operator.
    +

    Вам нужно указать файл конфигурации для использования Milvus Operator для запуска кластера Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Для настройки сторонних зависимостей достаточно отредактировать шаблон кода в milvus_cluster_default.yaml. В следующих разделах описывается настройка объектного хранилища, etcd и Pulsar соответственно.

    +

    Настройка etcd

    Добавьте необходимые поля в разделе spec.dependencies.etcd, чтобы настроить etcd.

    +

    etcd поддерживает external и inCluster.

    +

    Поля, используемые для настройки внешней службы etcd, включают:

    +
      +
    • external: Значение true указывает на то, что Milvus использует внешнюю службу etcd.
    • +
    • endpoints: Конечные точки etcd.
    • +
    +

    Внешний etcd

    Пример

    В следующем примере настраивается внешняя служба etcd.

    +
    kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    etcd: # Optional
    +      # Whether (=true) to use an existed external etcd as specified in the field endpoints or 
    +      # (=false) create a new etcd inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external etcd endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:2379
    +  components: {}
    +  config: {}
    +
    +

    Внутренний etcd

    inCluster указывает, что при запуске кластера Milvus в нем автоматически запускается служба etcd.

    +

    Пример

    В следующем примере настраивается внутренняя служба etcd.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    etcd:
    +      inCluster:
    +        values:
    +          replicaCount: 5
    +          resources:
    +            limits: 
    +              cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +  components: {}
    +  config: {}              
    +
    +
    В предыдущем примере указано количество реплик 5 и ограничены вычислительные ресурсы для etcd.
    +
    Полный набор элементов конфигурации для настройки внутренней службы etcd находится в файле values.yaml. Добавьте необходимые элементы конфигурации в файл etcd.inCluster.values, как показано в предыдущем примере.
    +

    Предполагая, что файл конфигурации имеет имя milvuscluster.yaml, выполните следующую команду, чтобы применить конфигурацию.

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Milvus Operator:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/alert.json b/localization/v2.5.x/site/ru/adminGuide/monitor/alert.json new file mode 100644 index 000000000..20d8f9254 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/alert.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Create an Alert for Milvus Services","anchorList":[{"label":"Создание оповещения для служб Milvus","href":"Create-an-Alert-for-Milvus-Services","type":1,"isActive":false},{"label":"Сценарии создания оповещений","href":"Scenarios-for-creating-alerts","type":2,"isActive":false},{"label":"Настройка оповещений","href":"Set-up-alerts","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/alert.md b/localization/v2.5.x/site/ru/adminGuide/monitor/alert.md new file mode 100644 index 000000000..0fab51994 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/alert.md @@ -0,0 +1,132 @@ +--- +id: alert.md +title: Создать оповещение +related_key: monitor and alert. +summary: 'Узнайте, как создать оповещение для сервисов Milvus в Grafana.' +--- +

    Создание оповещения для служб Milvus

    В этой теме представлен механизм оповещений для служб Milvus и объясняется, зачем, когда и как создавать оповещения в Milvus.

    +

    Создавая оповещения, вы можете получать уведомления, когда значение определенной метрики превышает заданный вами порог.

    +

    Например, вы создаете оповещение и устанавливаете 80 МБ в качестве максимального значения для использования памяти компонентами Milvus. Если фактическое использование превышает заданное число, вы будете получать предупреждения с напоминанием о том, что использование памяти компонентом Milvus превысило 80 МБ. Получив предупреждение, вы сможете соответствующим образом скорректировать распределение ресурсов и своевременно обеспечить доступность сервиса.

    +

    Сценарии создания оповещений

    Ниже перечислены распространенные сценарии, для которых необходимо создать оповещение.

    +
      +
    • Слишком высокое использование процессора или памяти компонентами Milvus.
    • +
    • В подкадах компонентов Milvus не хватает дискового пространства.
    • +
    • Подсистемы компонентов Milvus слишком часто перезапускаются.
    • +
    +

    Для настройки оповещений доступны следующие метрики:

    + + + + + + + + + + + +
    МетрикаОписаниеЕдиница измерения
    Использование ЦПИспользование процессора компонентами Milvus, которое отображается временем работы процессора.Секунда
    ПамятьРесурсы памяти, потребляемые компонентами Milvus.МБ
    ГороутиныПараллельно выполняемые действия на языке GO./
    Потоки ОСНити, или легкие процессы в операционной системе./
    Process Opened FdsТекущее количество используемых дескрипторов файлов./
    +

    Настройка оповещений

    В данном руководстве рассматривается пример создания оповещения об использовании памяти компонентами Milvus. Для создания других типов оповещений, пожалуйста, настройте свои команды соответствующим образом. Если в процессе работы у вас возникнут какие-либо проблемы, не стесняйтесь спрашивать на форуме Milvus или начинать обсуждение в Slack.

    +

    Предварительные условия

    В этом руководстве предполагается, что у вас установлена и настроена Grafana. Если нет, рекомендуем прочитать руководство по мониторингу.

    +

    1. Добавьте новый запрос

    Чтобы добавить оповещение об использовании памяти компонентами Milvus, отредактируйте панель Memory. Затем добавьте новый запрос с метрикой: process_resident_memory_bytes{app_kubernetes_io_name="milvus", app_kubernetes_io_instance=~"my-release", namespace="default"}

    +

    + + Alert_metric + Alert_metric

    +

    2. Сохраните приборную панель

    Сохраните приборную панель и подождите несколько минут, чтобы увидеть оповещение.

    +

    + + Alert_dashboard + Alert_dashboard

    +

    Запрос оповещения Grafana не поддерживает шаблонные переменные. Поэтому необходимо добавить второй запрос без шаблонных переменных в метках. По умолчанию второй запрос называется "A". Вы можете переименовать его, нажав на выпадающий список.

    +

    + + Alert_query + Запрос_оповещения

    +

    3. Добавление уведомлений о тревоге

    Чтобы получать уведомления о тревогах, добавьте "канал уведомлений". Затем укажите канал в поле "Отправить на".

    +

    + + Alert_notification + Alert_notification

    +

    Если оповещение успешно создано и сработало, вы получите уведомление, как показано на скриншоте ниже.

    +

    + + Notification_message + Уведомление_сообщение

    +

    Чтобы удалить оповещение, перейдите на панель "Оповещение" и нажмите кнопку "Удалить".

    +

    + + Delete_alert + Удалить_оповещение

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.json b/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.json new file mode 100644 index 000000000..3801e5601 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.json @@ -0,0 +1 @@ +{"codeList":["helm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n\nminio:\n enabled: true\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n storage:\n bucketNames:\n chunks: loki-chunks\n ruler: loki-ruler\n admin: loki-admin\n type: 's3'\n s3:\n endpoint: s3.us-west-2.amazonaws.com\n region: us-west-2\n secretAccessKey: \n accessKeyId: \n","kubectl create ns loki\nhelm install --values loki.yaml loki grafana/loki -n loki\n","config:\n clients:\n - url: http://loki-gateway/loki/api/v1/push\n","helm install --values promtail.yaml promtail grafana/promtail -n loki\n","kubectl create ns monitoring\nhelm install my-grafana grafana/grafana --namespace monitoring\n","kubectl get secret --namespace monitoring my-grafana -o jsonpath=\"{.data.admin-password}\" | base64 --decode ; echo\n","export POD_NAME=$(kubectl get pods --namespace monitoring -l \"app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana\" -o jsonpath=\"{.items[0].metadata.name}\")\nkubectl --namespace monitoring port-forward $POD_NAME 3000\n"],"headingContent":"Configure Grafana Loki","anchorList":[{"label":"Настройка Grafana Loki","href":"Configure-Grafana-Loki","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Развертывание Loki","href":"Deploy-Loki","type":2,"isActive":false},{"label":"Развернуть Promtail","href":"Deploy-Promtail","type":2,"isActive":false},{"label":"Запрос журналов с помощью Grafana","href":"Query-Logs-with-Grafana","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.md b/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.md new file mode 100644 index 000000000..1ef4c4e2c --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/configure_grafana_loki.md @@ -0,0 +1,174 @@ +--- +id: configure_grafana_loki.md +title: Настройка Grafana Loki +summary: >- + В этой теме описано, как собирать журналы с помощью Loki и запрашивать журналы + для кластера Milvus с помощью Grafana. +--- +

    Настройка Grafana Loki

    В этом руководстве приведены инструкции по настройке Loki для сбора журналов и Grafana для запроса и отображения журналов для кластера Milvus.

    +

    В этом руководстве вы узнаете, как:

    +
      +
    • Развертывать Loki и Promtail на кластере Milvus с помощью Helm.
    • +
    • Настраивать объектное хранилище для Loki.
    • +
    • Запрашивать журналы с помощью Grafana.
    • +
    +

    Необходимые условия

    +

    Развертывание Loki

    Loki - это система агрегации логов, созданная по мотивам Prometheus. Разверните Loki с помощью Helm для сбора логов с вашего кластера Milvus.

    +

    1. Добавьте репозиторий диаграмм Grafana в Helm

    Добавьте репозиторий графиков Grafana в Helm и обновите его:

    +
    helm repo add grafana https://grafana.github.io/helm-charts
    +helm repo update
    +
    +

    2. Настройте хранилище объектов для Loki

    Выберите один из следующих вариантов хранения и создайте файл конфигурации loki.yaml:

    +
      +
    • Вариант 1: Использование MinIO для хранения данных

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +
      +minio:
      +  enabled: true
      +
    • +
    • Вариант 2: Использование AWS S3 для хранения данных.

      +

      В следующем примере замените <accessKey> и <keyId> на собственный ключ доступа и идентификатор S3, s3.endpoint - на конечную точку S3, а s3.region - на регион S3.

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +  storage:
      +    bucketNames:
      +      chunks: loki-chunks
      +      ruler: loki-ruler
      +      admin: loki-admin
      +    type: 's3'
      +    s3:
      +      endpoint: s3.us-west-2.amazonaws.com
      +      region: us-west-2
      +      secretAccessKey: <accessKey>
      +      accessKeyId: <keyId>
      +
    • +
    +

    3. Установите Loki

    Выполните следующие команды для установки Loki:

    +
    kubectl create ns loki
    +helm install --values loki.yaml loki grafana/loki -n loki
    +
    +

    Развернуть Promtail

    Promtail - это агент сбора логов для Loki. Он считывает журналы из капсул Milvus и отправляет их в Loki.

    +

    1. Создание конфигурации Promtail

    Создайте файл конфигурации promtail.yaml:

    +
    config:
    +  clients:
    +    - url: http://loki-gateway/loki/api/v1/push
    +
    +

    2. Установить Promtail

    Установите Promtail с помощью Helm:

    +
    helm install  --values promtail.yaml promtail grafana/promtail -n loki
    +
    +

    Запрос журналов с помощью Grafana

    Разверните Grafana и настройте ее на подключение к Loki для запроса журналов.

    +

    1. Развертывание Grafana

    Установите Grafana с помощью следующих команд:

    +
    kubectl create ns monitoring
    +helm install my-grafana grafana/grafana --namespace monitoring
    +
    +

    Прежде чем получить доступ к Grafana, необходимо получить пароль admin:

    +
    kubectl get secret --namespace monitoring my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    +
    +

    Затем перенаправьте порт Grafana на вашу локальную машину:

    +
    export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana" -o jsonpath="{.items[0].metadata.name}")
    +kubectl --namespace monitoring port-forward $POD_NAME 3000
    +
    +

    2. Добавьте Loki в качестве источника данных в Grafana

    После запуска Grafana необходимо добавить Loki в качестве источника данных для запроса журналов.

    +
      +
    1. Откройте веб-браузер и перейдите по адресу 127.0.0.1:3000. Войдите в систему, используя имя пользователя admin и пароль, полученный ранее.
    2. +
    3. В левом боковом меню выберите Подключения > Добавить новое подключение.
    4. +
    5. На появившейся странице выберите Loki в качестве типа источника данных. Вы можете ввести loki в строке поиска, чтобы найти источник данных.
    6. +
    7. В настройках источника данных Loki укажите Имя и URL, а затем нажмите Сохранить и проверить.
    8. +
    +

    + + DataSource + Источник данных

    +

    3. Запрос журналов Milvus

    После добавления Loki в качестве источника данных сделайте запрос к журналам Milvus в Grafana:

    +
      +
    1. В левом боковом меню нажмите Explore.
    2. +
    3. В левом верхнем углу страницы выберите источник данных loki.
    4. +
    5. С помощью браузера Label выберите метки и запросите журналы.
    6. +
    +

    + + Query + Запрос

    diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.json b/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.json new file mode 100644 index 000000000..5d0662ac2 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Metrics Dashboard","anchorList":[{"label":"Приборная панель метрик Milvus","href":"Milvus-Metrics-Dashboard","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.md b/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.md new file mode 100644 index 000000000..110efe1e5 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/metrics_dashboard.md @@ -0,0 +1,198 @@ +--- +id: metrics_dashboard.md +title: Приборная панель метрик Milvus +summary: >- + В этой теме рассказывается о показателях мониторинга, отображаемых на панели + Milvus Dashboard. +--- +

    Приборная панель метрик Milvus

    Во время работы Milvus выводит список подробных метрик с временными рядами. Для визуализации метрик можно использовать Prometheus и Grafana. В этой теме представлены метрики мониторинга, отображаемые в Grafana Milvus Dashboard.

    +

    Единицей времени в этой теме являются миллисекунды. А "99-й процентиль" в этой теме означает, что 99 процентов времени статистика контролируется в пределах определенного значения.

    +

    Для понимания метрик Prometheus мы рекомендуем сначала прочитать обзор фреймворка мониторинга Milvus.

    +

    Прокси

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Скорость подсчета поисковых векторовСреднее количество векторов, запрашиваемых в секунду каждым прокси в течение последних двух минут.sum(increase(milvus_proxy_search_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_search_vectors_countНакопленное количество запрошенных векторов.
    Insert Vector Count RateСреднее количество векторов, вставленных в секунду каждым прокси в течение последних двух минут.sum(increase(milvus_proxy_insert_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_insert_vectors_countНакопленное количество вставленных векторов.
    Латентность поискаСредняя задержка и 99-й процентиль задержки получения запросов на поиск и запрос каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_latencyЗадержка запросов на поиск и запросы.
    Задержка поиска коллекцииСредняя задержка и 99-й процентиль задержки получения запросов поиска и запросов к определенной коллекции каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    avg:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sumВремя ожидания запросов поиска и запросов к определенной коллекции
    Мутационная задержкаСредняя задержка и 99-й процентиль задержки получения запросов на мутацию каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_mutation_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_latency_sumЗадержка запросов на мутацию.
    Латентность мутации коллекцииСредняя задержка и 99-й процентиль задержки получения запросов мутации к определенной коллекции каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    avg:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sumЗадержка запросов мутации к определенной коллекции
    Задержка ожидания результатов поискаСредняя задержка и 99-й процентиль задержки между отправкой запросов поиска и запросов и получением результатов прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_wait_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_wait_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_wait_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_wait_result_latencyЗадержка между отправкой запросов на поиск и получение результатов.
    Уменьшить задержку результатов поискаСредняя задержка и 99-й процентиль задержки агрегирования результатов поиска и запросов через прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_reduce_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_reduce_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_reduce_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_reduce_result_latencyЗадержка объединения результатов поиска и запросов, возвращаемых каждым узлом запроса.
    Задержка декодирования результатов поискаСредняя задержка и 99-й процентиль задержки декодирования результатов поиска и запросов по прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_decode_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_decode_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_decode_resultlatency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_decode_result_latencyЗадержка декодирования каждого результата поиска и запроса.
    Msg Stream Object NumСреднее, максимальное и минимальное количество объектов msgstream, созданных каждым прокси на соответствующей физической теме за последние две минуты.avg(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_msgstream_obj_numКоличество объектов msgstream, созданных в каждой физической теме.
    Задержка отправки мутацийСредняя задержка и 99-й процентиль задержки отправки запросов на вставку или удаление каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_send_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_mutation_send_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_send_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_send_latencyЗадержка отправки запросов на вставку или удаление.
    Скорость попадания в кэшСредний показатель попадания в кэш операций, включая GeCollectionID, GetCollectionInfo и GetCollectionSchema в секунду в течение последних двух минут.sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", cache_state="hit"}[2m])/120) by(cache_name, pod, node_id) / sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(cache_name, pod, node_id)milvus_proxy_cache_hit_countСтатистика попаданий и отказов для каждой операции чтения кэша.
    Задержка обновления кэшаСредняя задержка и 99-й процентиль задержки обновления кэша по прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_cache_update_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_cache_update_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_cache_update_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_cache_update_latencyЗадержка обновления кэша каждый раз.
    Время синхронизацииСреднее, максимальное и минимальное количество эпохального времени, синхронизированного каждым прокси в соответствующем физическом канале.avg(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_sync_epoch_timeВремя эпохи каждого физического канала (время Unix, миллисекунды, прошедшие с 1 января 1970 года).
    По умолчанию существует ChannelName, не относящийся к физическим каналам.
    Применить задержку PKСредняя задержка и 99-й процентиль задержки применения первичного ключа каждым прокси за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_pk_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_pk_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_pk_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_pk_latencyЗадержка применения первичного ключа.
    Задержка применения временной меткиСредняя задержка и 99-й процентиль задержки применения временной метки каждым прокси в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_timestamp_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_timestamp_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_timestamp_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_timestamp_latencyЗадержка применения временной метки.
    Коэффициент успешности запросовКоличество успешных запросов, полученных в секунду каждым прокси, с подробной разбивкой по типам запросов. Возможные типы запросов: DescribeCollection, DescribeIndex, GetCollectionStatistics, HasCollection, Search, Query, ShowPartitions, Insert и т. д.
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="success"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countКоличество всех типов полученных запросов
    Частота неудачных запросовКоличество неудачных запросов, полученных в секунду каждым прокси, с подробной разбивкой по каждому типу запросов. Возможные типы запросов: DescribeCollection, DescribeIndex, GetCollectionStatistics, HasCollection, Search, Query, ShowPartitions, Insert и т. д.
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="fail"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_countКоличество всех типов полученных запросов
    Латентность запросаСредняя задержка и 99-й процентиль задержки всех типов принимаемых запросов каждым прокси-серверомp99:
    histogram_quantile(0.99, sum by (le, pod, node_id, function_name) (rate(milvus_proxy_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name) / sum(increase(milvus_proxy_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name)
    milvus_proxy_req_latencyЗадержка всех типов запросов на получение
    Количество байт запросов на вставку/удалениеКоличество байт запросов на вставку и удаление, полученных прокси в секунду за последние две минуты.sum(increase(milvus_proxy_receive_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_receive_bytes_countКоличество запросов на вставку и удаление.
    Скорость отправки байтовКоличество байт в секунду, отправленных обратно клиенту, когда каждый прокси отвечает на запросы поиска и запросов в течение последних двух минут.sum(increase(milvus_proxy_send_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_send_bytes_countКоличество байт, отправленных обратно клиенту, пока каждый прокси отвечает на запросы поиска и запросов.
    +

    +

    Корневой координатор

    + + + + + + + + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Количество прокси-узловКоличество созданных прокси.sum(milvus_rootcoord_proxy_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_proxy_numКоличество прокси-узлов.
    Sync TimeСреднее, максимальное и минимальное количество эпохального времени, синхронизированного каждым корневым коордом в каждом физическом канале (PChannel).avg(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_sync_epoch_timeВремя эпохи каждого физического канала (время Unix, миллисекунды, прошедшие с 1 января 1970 года).
    Скорость выполнения DDL-запросовСостояние и количество DDL-запросов в секунду в течение последних двух минут.sum(increase(milvus_rootcoord_ddl_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, function_name)milvus_rootcoord_ddl_req_countОбщее количество DDL-запросов, включая CreateCollection, DescribeCollection, DescribeSegments, HasCollection, ShowCollections, ShowPartitions и ShowSegments.
    Латентность DDL-запросовСредняя задержка и 99-й процентиль задержки DDL-запросов за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, function_name) (rate(milvus_rootcoord_ddl_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_rootcoord_ddl_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name) / sum(increase(milvus_rootcoord_ddl_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name)
    milvus_rootcoord_ddl_req_latencyЗадержка всех типов DDL-запросов.
    Sync Timetick LatencyСредняя задержка и 99-й процентиль времени, использованного root coord для синхронизации всех временных меток с PChannel в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_rootcoord_sync_timetick_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_rootcoord_sync_timetick_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_rootcoord_sync_timetick_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_rootcoord_sync_timetick_latencyвремя, использованное корневым координатором для синхронизации всех временных меток с PChannel.
    Скорость распределения идентификаторовКоличество идентификаторов, присваиваемых корневым коордом в секунду в течение последних двух минут.sum(increase(milvus_rootcoord_id_alloc_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120)milvus_rootcoord_id_alloc_countНакопленное количество идентификаторов, присвоенных корневым коордом.
    Временная меткаПоследняя временная метка корневого коорда.milvus_rootcoord_timestamp{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestampПоследняя временная метка корневого координатора.
    Сохраненные временные меткиПредварительно назначенные временные метки, которые root coord сохраняет в метахранилище.milvus_rootcoord_timestamp_saved{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestamp_savedПредварительно назначенные временные метки, которые root coord сохраняет в метахранилище.
    Временные метки назначаются на 3 секунды раньше. Временная метка обновляется и сохраняется в метахранилище каждые 50 миллисекунд.
    Количество коллекцийОбщее количество коллекций.sum(milvus_rootcoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_collection_numОбщее количество коллекций, существующих в Milvus на данный момент.
    Partition NumОбщее количество разделов.sum(milvus_rootcoord_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_partition_numОбщее количество разделов, существующих в Milvus на данный момент.
    DML Channel NumОбщее количество каналов DML.sum(milvus_rootcoord_dml_channel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_dml_channel_numОбщее количество каналов DML, существующих в Milvus в настоящее время.
    Msgstream NumОбщее количество msgstreams.sum(milvus_rootcoord_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_msgstream_obj_numОбщее количество msgstreams в Milvus на данный момент.
    Credential NumОбщее количество учетных данных.sum(milvus_rootcoord_credential_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_credential_numОбщее количество учетных данных в Milvus на данный момент.
    Задержка временного тикаСумма максимальной временной задержки тиков графиков потока на всех DataNodes и QueryNodes.sum(milvus_rootcoord_time_tick_delay{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_time_tick_delayМаксимальная временная задержка тиков графиков потока на каждом DataNode и QueryNode.
    +

    +

    Координатор запросов

    + + + + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Collection Loaded NumКоличество коллекций, которые в данный момент загружены в память.sum(milvus_querycoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_collection_numКоличество коллекций, которые в данный момент загружены Milvus.
    Entity Loaded NumКоличество сущностей, загруженных в память в данный момент.sum(milvus_querycoord_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_entitiy_numКоличество сущностей, загруженных Milvus в данный момент.
    Скорость запросов на загрузкуКоличество запросов на загрузку в секунду за последние две минуты.sum(increase(milvus_querycoord_load_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])120) by (status)milvus_querycoord_load_req_countНакопленное количество запросов на загрузку.
    Скорость запросов на освобождениеКоличество запросов на освобождение в секунду в течение последних двух минут.sum(increase(milvus_querycoord_release_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_querycoord_release_req_countНакопленное количество запросов на освобождение.
    Латентность запросов нагрузкиСредняя задержка и 99-й процентиль задержки запросов нагрузки за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_load_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_load_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_load_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_load_latencyВремя, затраченное на выполнение запроса на нагрузку.
    Задержка запроса на освобождениеСредняя задержка и 99-й процентиль задержки запросов на освобождение в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_release_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_release_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_release_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_release_latencyВремя, затраченное на завершение запроса на освобождение.
    Задача поднагрузкиКоличество задач подзагрузки.sum(milvus_querycoord_child_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_child_task_numКоличество подзадач нагрузки.
    Коорд запроса разбивает запрос нагрузки на несколько подзадач.
    Родительское задание нагрузкиКоличество родительских заданий нагрузки.sum(milvus_querycoord_parent_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_parent_task_numКоличество подзадач.
    Каждый запрос нагрузки соответствует родительской задаче в очереди задач.
    Латентность подзадач нагрузкиСредняя задержка и 99-й процентиль задержки задачи подзагрузки за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_child_task_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_child_task_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_child_task_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) namespace"}[2m])))
    milvus_querycoord_child_task_latencyВремя ожидания завершения задачи подзагрузки.
    Query Node NumКоличество узлов запроса, управляемых коорд. запросом.sum(milvus_querycoord_querynode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_querynode_numКоличество узлов запроса, управляемых координатором запроса.
    +

    +

    Узел запроса

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Collection Loaded NumКоличество коллекций, загруженных в память каждым узлом запроса.sum(milvus_querynode_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_collection_numКоличество коллекций, загруженных каждым узлом запроса.
    Partition Loaded NumКоличество разделов, загруженных в память каждым узлом запроса.sum(milvus_querynode_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_partition_numКоличество разделов, загруженных каждым узлом запроса.
    Segment Loaded NumКоличество сегментов, загруженных в память каждым узлом запроса.sum(milvus_querynode_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_segment_numКоличество сегментов, загруженных каждым узлом запроса.
    Queryable Entity NumКоличество сущностей, доступных для запроса и поиска, на каждом узле запроса.sum(milvus_querynode_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_entity_numКоличество сущностей, доступных для запроса и поиска, на каждом узле запроса.
    Виртуальный канал DMLКоличество виртуальных каналов DML, просматриваемых каждым узлом запроса.sum(milvus_querynode_dml_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_dml_vchannel_numКоличество виртуальных каналов DML, просматриваемых каждым узлом запроса.
    Виртуальный дельта-каналКоличество дельта-каналов, просматриваемых каждым узлом запроса.sum(milvus_querynode_delta_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_delta_vchannel_numКоличество дельта-каналов, просматриваемых каждым узлом запроса.
    Количество потребителейКоличество потребителей в каждом узле запроса.sum(milvus_querynode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_consumer_numКоличество потребителей в каждом узле запроса.
    Количество поисковых запросовОбщее количество запросов на поиск и запрос, полученных в секунду каждым узлом запроса, и количество успешных запросов на поиск и запрос за последние две минуты.sum(increase(milvus_querynode_sq_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (query_type, status, pod, node_id)milvus_querynode_sq_req_countНакопленное количество запросов поиска и запросов.
    Латентность поисковых запросовСредняя задержка и 99-й процентиль времени, затраченного на поиск и запросы каждым узлом запроса в течение последних двух минут.
    На этой панели отображается задержка запросов поиска и запросов, статус которых "успех" или "итог".
    p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_sq_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_req_latencyЗадержка поисковых запросов узла запроса.
    Латентность поиска в очередиСредняя задержка и 99-й процентиль задержки запросов поиска и запросов в очереди за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_queue_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_queue_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_queue_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_queue_latencyЗадержка запросов поиска и запросов, полученных узлом запроса.
    Латентность поискового сегментаСредняя задержка и 99-й процентиль времени, затраченного узлом запроса на поиск и запрос сегмента в течение последних двух минут.
    Статус сегмента может быть закрытым или растущим.
    p99:
    histogram_quantile(0.99, sum by (le, query_type, segment_state, pod, node_id) (rate(milvus_querynode_sq_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state) / sum(increase(milvus_querynode_sq_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state)
    milvus_querynode_sq_segment_latencyВремя, затрачиваемое узлом запроса на поиск и запрос каждого сегмента.
    Задержка запроса сегментаСредняя задержка и 99-й процентиль времени, затраченного каждым узлом запроса на поиск и запрос в сегменте за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_querynode_sq_core_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_core_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_core_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_core_latencyВремя, затрачиваемое каждым узлом запроса на поиск и запрос в segcore.
    Латентность уменьшения поискаСредняя задержка и 99-й процентиль времени, использованного каждым узлом запроса на этапе уменьшения поиска или запроса в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_reduce_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_reduce_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_reduce_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_reduce_latencyВремя, затрачиваемое каждым запросом на этапе уменьшения.
    Латентность сегмента нагрузкиСредняя задержка и 99-й процентиль времени, затрачиваемого каждым узлом запроса на загрузку сегмента за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_load_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_load_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_load_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketВремя, затрачиваемое каждым узлом запроса на загрузку сегмента.
    Flowgraph NumКоличество графов потока в каждом узле запроса.sum(milvus_querynode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_flowgraph_numКоличество графов потока в каждом узле запроса.
    Длина очереди нерешенных задач чтенияДлина очереди неразрешенных запросов на чтение в каждом узле запроса.sum(milvus_querynode_read_task_unsolved_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_unsolved_lenДлина очереди неразрешенных запросов на чтение.
    Длина готовой задачи чтенияДлина очереди запросов на чтение, которые должны быть выполнены в каждом узле запроса.sum(milvus_querynode_read_task_ready_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_ready_lenДлина очереди запросов на чтение, подлежащих выполнению.
    Parallel Read Task NumКоличество параллельных запросов на чтение, выполняемых в настоящее время в каждом узле запроса.sum(milvus_querynode_read_task_concurrency{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_concurrencyКоличество параллельных запросов на чтение, выполняемых в данный момент.
    Оценка использования ЦПИспользование ЦП каждым узлом запроса, оцененное планировщиком.sum(milvus_querynode_estimate_cpu_usage{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_estimate_cpu_usageИспользование процессора каждым узлом запроса, оцененное планировщиком.
    Если значение равно 100, это означает, что используется целый виртуальный процессор (vCPU).
    Размер группы поискаСреднее число и 99-й процентиль размера группы поиска (т. е. общее число исходных поисковых запросов в совокупности поисковых запросов, выполняемых каждым узлом запроса) за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketКоличество оригинальных поисковых задач среди объединенных поисковых задач из разных ведер (т. е. размер поисковой группы).
    Поиск NQСреднее число и 99-й процентиль количества запросов (NQ), выполненных каждым узлом запроса в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketКоличество запросов (NQ) поисковых запросов.
    Группа поиска NQСреднее число и 99-й процентиль NQ поисковых запросов, объединенных и выполненных каждым узлом запроса в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_nq_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_nq_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_nq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketNQ поисковых запросов, объединенных из разных ведер.
    Search Top_KСреднее число и 99-й процентиль Top_K поисковых запросов, выполненных каждым узлом запроса за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketЧисло Top_K поисковых запросов.
    Поисковая группа Top_KСреднее число и 99-й процентиль Top_K поисковых запросов, объединенных и выполненных каждым узлом запроса за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucketTop_K поисковых запросов, объединенных из разных ведер.
    Количество вытесненных запросов на чтениеКоличество запросов на чтение, отклоненных в секунду каждым узлом запроса в течение последних двух минут.sum(increase(milvus_querynode_read_evicted_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_querynode_sq_req_countНакопленное количество запросов на чтение, отклоненных узлом запроса из-за ограничения трафика.
    +

    +

    Координатор данных

    + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Data Node NumКоличество узлов данных, управляемых data coord.sum(milvus_datacoord_datanode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_datanode_numКоличество узлов данных, управляемых координатором данных.
    Segment NumКоличество всех типов сегментов, записанных в метаданных data coord.sum(milvus_datacoord_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (segment_state)milvus_datacoord_segment_numКоличество всех типов сегментов, записанных в метаданных data coord.
    Типы сегментов включают: сброшенные, смытые, промытые, растущие и запечатанные.
    Количество коллекцийКоличество коллекций, записанных в метаданные по коорд. данным.sum(milvus_datacoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_collection_numКоличество коллекций, записанных в метаданных по коорд. данным.
    Stored RowsНакопленное количество строк валидных и промытых данных в коорд. данных.sum(milvus_datacoord_stored_rows_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_rows_numНакопленное количество строк валидных и смытых данных в коорд. данных.
    Stored Rows RateСреднее количество строк, выгружаемых в секунду в течение последних двух минут.sum(increase(milvus_datacoord_stored_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_datacoord_stored_rows_countНакопленное количество строк, промытых в data coord.
    Время синхронизацииСреднее, максимальное и минимальное количество эпохального времени синхронизации данных в каждом физическом канале.avg(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_sync_epoch_timeВремя эпохи каждого физического канала (время Unix, миллисекунды, прошедшие с 1 января 1970 года).
    Размер хранимого бинлогаОбщий размер хранимого бинлога.sum(milvus_datacoord_stored_binlog_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_binlog_sizeОбщий размер бинлога, хранящегося в Milvus.
    +

    +

    Узел данных

    + + + + + + + + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Flowgraph NumКоличество объектов flowgraph, соответствующих каждому узлу данных.sum(milvus_datanode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_flowgraph_numКоличество объектов flowgraph.
    Каждый шард в коллекции соответствует объекту flowgraph.
    Скорость потребления строк сообщенийКоличество строк потоковых сообщений, потребляемых в секунду каждым узлом данных в течение последних двух минут.sum(increase(milvus_datanode_msg_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_msg_rows_countКоличество потребленных строк потоковых сообщений.
    В настоящее время потоковые сообщения, подсчитываемые по узлам данных, включают только сообщения о вставке и удалении.
    Скорость передачи данных при промывкеРазмер каждого смываемого сообщения, регистрируемого в секунду каждым узлом данных в течение последних двух минут.sum(increase(milvus_datanode_flushed_data_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_flushed_data_sizeРазмер каждого переданного сообщения.
    В настоящее время потоковые сообщения, подсчитанные по узлам данных, включают только сообщения о вставке и удалении.
    Num потребителейКоличество потребителей, созданных на каждом узле данных.sum(milvus_datanode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_consumer_numКоличество потребителей, созданных на каждом узле данных.
    Каждый поток соответствует одному потребителю.
    Producer NumКоличество производителей, созданных на каждом узле данных.sum(milvus_datanode_producer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_producer_numКоличество потребителей, созданных на каждом узле данных.
    Каждому осколку в коллекции соответствует производитель дельта-канала и производитель канала timetick.
    Время синхронизацииСреднее, максимальное и минимальное количество времени эпохи, синхронизированное каждым узлом данных во всех физических темах.avg(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_sync_epoch_timeВремя эпохи (время Unix, миллисекунды, прошедшие с 1 января 1970 года) каждой физической темы на узле данных.
    Число непромытых сегментовКоличество непромытых сегментов, созданных на каждом узле данных.sum(milvus_datanode_unflushed_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_unflushed_segment_numКоличество непромытых сегментов, созданных на каждом узле данных.
    Encode Buffer LatencyСредняя задержка и 99-й процентиль времени, затраченного на кодирование буфера каждым узлом данных за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_encode_buffer_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_encode_buffer_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_encode_buffer_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_encode_buffer_latencyВремя, затрачиваемое каждым узлом данных на кодирование буфера.
    Задержка сохранения данныхСредняя задержка и 99-й процентиль времени, затраченного на запись буфера в слой хранения каждым узлом данных за последние две минуты.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_save_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_save_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_save_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_save_latencyВремя, затрачиваемое каждым узлом данных на запись буфера в слой хранения.
    Частота операций промывкиКоличество раз, которое каждый узел данных промывает буфер в секунду в течение последних двух минут.sum(increase(milvus_datanode_flush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_buffer_op_countНакопленное количество раз, когда узел данных промывает буфер.
    Скорость работы автопромывкиКоличество раз автопромывки буфера каждым узлом данных в секунду за последние две минуты.sum(increase(milvus_datanode_autoflush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_autoflush_buffer_op_countНакопленное количество раз автоматической очистки буфера узлом данных.
    Скорость запроса на промывкуКоличество раз, когда каждый узел данных получает запрос на промывку буфера в секунду за последние две минуты.sum(increase(milvus_datanode_flush_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_req_countНакопленное количество раз, когда узел данных получает запрос на промывку от координатора данных.
    Латентность уплотненияСредняя задержка и 99-й процентиль времени, затрачиваемого каждым узлом данных на выполнение задачи уплотнения в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_compaction_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_datanode_compaction_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_compaction_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_compaction_latencyВремя, необходимое каждому узлу данных для выполнения задачи уплотнения.
    +

    +

    Индексный координатор

    + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Index Request RateСреднее количество запросов на построение индекса, полученных в секунду за последние две минуты.sum(increase(milvus_indexcoord_indexreq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_indexcoord_indexreq_countКоличество полученных запросов на построение индекса.
    Index Task CountКоличество всех задач индексирования, записанных в метаданных индекса.sum(milvus_indexcoord_indextask_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (index_task_status)milvus_indexcoord_indextask_countКоличество всех задач индексирования, записанных в метаданных индекса.
    Index Node NumКоличество управляемых индексных узлов.sum(milvus_indexcoord_indexnode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_indexcoord_indexnode_numКоличество управляемых индексных узлов.
    +

    +

    Индексный узел

    + + + + + + + + + + + + +
    ПанельОписание панелиPromQL (язык запросов Prometheus)Используемые метрики MilvusОписание метрик Milvus
    Index Task RateСреднее количество заданий на построение индекса, получаемых каждым индексным узлом в секунду в течение последних двух минут.sum(increase(milvus_indexnode_index_task_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_indexnode_index_task_countКоличество полученных заданий на построение индекса.
    Латентность поля загрузкиСредняя задержка и 99-й процентиль времени, затраченного каждым индексным узлом на загрузку данных сегментного поля каждый раз в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_load_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_load_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_load_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_load_field_latencyВремя, затраченное индексным узлом на загрузку данных сегментного поля.
    Задержка декодирования поляСредняя задержка и 99-й процентиль времени, использованного каждым индексным узлом для кодирования данных поля каждый раз в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_decode_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_decode_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_decode_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_decode_field_latencyВремя, затраченное на декодирование полевых данных.
    Задержка построения индексаСредняя задержка и 99-й процентиль времени, использованного каждым индексным узлом для построения индексов в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_build_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_build_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_build_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_build_index_latencyВремя, затраченное на создание индексов.
    Латентность индекса кодированияСредняя задержка и 99-й процентиль времени, использованного каждым индексным узлом для кодирования индексных файлов в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_encode_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_encode_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_encode_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_encode_index_latencyВремя, затраченное на кодирование индексных файлов.
    Задержка сохранения индексаСредняя задержка и 99-й процентиль времени, использованного каждым индексным узлом для сохранения индексных файлов в течение последних двух минут.p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_save_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_save_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_save_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_save_index_latencyВремя, затраченное на сохранение индексных файлов.
    +

    diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.json b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.json new file mode 100644 index 000000000..70e412ef2 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/prometheus-operator/kube-prometheus.git\n$ cd kube-prometheus\n$ kubectl apply --server-side -f manifests/setup\n$ kubectl wait \\\n --for condition=Established \\\n --all CustomResourceDefinition \\\n --namespace=monitoring\n$ kubectl apply -f manifests/\n","kubectl patch clusterrole prometheus-k8s --type=json -p='[{\"op\": \"add\", \"path\": \"/rules/-\", \"value\": {\"apiGroups\": [\"\"], \"resources\": [\"pods\", \"services\", \"endpoints\"], \"verbs\": [\"get\", \"watch\", \"list\"]}}]'\n","$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090\n$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000\n","$ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values\n","$ kubectl get servicemonitor\n","NAME AGE\nmy-release-milvus 54s\n"],"headingContent":"Deploying Monitoring Services on Kubernetes","anchorList":[{"label":"Развертывание служб мониторинга на Kubernetes","href":"Deploying-Monitoring-Services-on-Kubernetes","type":1,"isActive":false},{"label":"Мониторинг метрик с помощью Prometheus","href":"Monitor-metrics-with-Prometheus","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Развертывание служб мониторинга на Kubernetes","href":"Deploy-monitoring-services-on-Kubernetes","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.md b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.md new file mode 100644 index 000000000..7688bf31e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor.md @@ -0,0 +1,136 @@ +--- +id: monitor.md +title: Развертывание служб мониторинга +related_key: 'monitor, alert' +summary: >- + Узнайте, как развернуть службы мониторинга для кластера Milvus с помощью + Prometheus. +--- +

    Развертывание служб мониторинга на Kubernetes

    В этой теме описывается, как использовать Prometheus для развертывания служб мониторинга для кластера Milvus на Kubernetes.

    +

    Мониторинг метрик с помощью Prometheus

    Метрики - это индикаторы, предоставляющие информацию о состоянии работы вашей системы. Например, с помощью метрик вы можете понять, сколько памяти или ресурсов процессора потребляет узел данных в Milvus. Знание производительности и состояния компонентов вашего кластера Milvus позволяет вам быть хорошо информированным, а значит, принимать лучшие решения и своевременно корректировать распределение ресурсов.

    +

    Обычно метрики хранятся в базе данных временных рядов (TSDB), например в Prometheus, и метрики записываются с меткой времени. В случае мониторинга служб Milvus вы можете использовать Prometheus для получения данных из конечных точек, установленных экспортерами. Затем Prometheus экспортирует метрики каждого компонента Milvus по адресу http://<component-host>:9091/metrics.

    +

    Однако у вас может быть несколько реплик для одного компонента, что делает ручную настройку Prometheus слишком сложной. Поэтому вы можете использовать Prometheus Operator, расширение для Kubernetes, для автоматического и эффективного управления экземплярами мониторинга Prometheus. Использование Prometheus Operator избавит вас от необходимости вручную добавлять метрические цели и поставщиков услуг.

    +

    ServiceMonitor Custom Resource Definition (CRD) позволяет декларативно определить, как отслеживается динамический набор сервисов. Оно также позволяет выбирать сервисы для мониторинга с нужной конфигурацией с помощью выбора меток. С помощью Prometheus Operator можно ввести соглашения, определяющие способ отображения метрик. Новые службы могут быть автоматически обнаружены в соответствии с установленными соглашениями без необходимости ручной перенастройки.

    +

    Следующее изображение иллюстрирует рабочий процесс Prometheus.

    +

    + + Prometheus_architecture + Архитектура Prometheus

    +

    Предварительные условия

    В этом руководстве используется kube-prometheus, чтобы избавить вас от необходимости устанавливать и вручную настраивать каждый компонент мониторинга и оповещения.

    +

    Kube-prometheus собирает манифесты Kubernetes, приборные панели Grafana и правила Prometheus в сочетании с документацией и скриптами.

    +

    Перед развертыванием служб мониторинга необходимо создать стек мониторинга, используя конфигурацию в каталоге kube-prometheus manifests.

    +
    $ git clone https://github.com/prometheus-operator/kube-prometheus.git
    +$ cd kube-prometheus
    +$ kubectl apply --server-side -f manifests/setup
    +$ kubectl wait \
    +        --for condition=Established \
    +        --all CustomResourceDefinition \
    +        --namespace=monitoring
    +$ kubectl apply -f manifests/
    +
    +
    +Кластерроль по умолчанию prometheus-k8s не может перехватывать метрики milvus, необходимо внести исправления:
    +
    kubectl patch clusterrole prometheus-k8s --type=json -p='[{"op": "add", "path": "/rules/-", "value": {"apiGroups": [""], "resources": ["pods", "services", "endpoints"], "verbs": ["get", "watch", "list"]}}]'
    +
    +

    Чтобы удалить стек, выполните команду kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup.

    +

    Развертывание служб мониторинга на Kubernetes

    1. Получите доступ к панелям мониторинга

    Перенаправьте службу Prometheus на порт 9090, а службу Grafana - на порт 3000.

    +
    $ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090
    +$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000
    +
    +

    2. Включите ServiceMonitor

    По умолчанию ServiceMonitor не включен в Milvus Helm. После установки Prometheus Operator в кластере Kubernetes вы можете включить его, добавив параметр metrics.serviceMonitor.enabled=true.

    +
    $ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values
    +
    +

    Когда установка завершится, используйте kubectl для проверки ресурса ServiceMonitor.

    +
    $ kubectl get servicemonitor
    +
    +
    NAME                           AGE
    +my-release-milvus              54s
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.json b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.json new file mode 100644 index 000000000..617ae891d --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus monitoring framework overview","anchorList":[{"label":"Обзор системы мониторинга Milvus","href":"Milvus-monitoring-framework-overview","type":1,"isActive":false},{"label":"Prometheus в Milvus","href":"Prometheus-in-Milvus","type":2,"isActive":false},{"label":"Grafana в Milvus","href":"Grafana-in-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.md b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.md new file mode 100644 index 000000000..4e908297e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/monitor_overview.md @@ -0,0 +1,113 @@ +--- +id: monitor_overview.md +title: Обзор монитора +related_key: 'monitor, alert' +summary: >- + Узнайте, как Prometheus и Grafana используются в Milvus для мониторинга и + оповещения. +--- +

    Обзор системы мониторинга Milvus

    В этой теме рассказывается о том, как Milvus использует Prometheus для мониторинга показателей и Grafana для визуализации показателей и создания оповещений.

    +

    Prometheus в Milvus

    Prometheus - это набор инструментов мониторинга и оповещения с открытым исходным кодом для реализации Kubernetes. Он собирает и хранит метрики в виде временных рядов. Это означает, что метрики хранятся с временными метками при записи, а также с дополнительными парами ключ-значение, называемыми метками.

    +

    В настоящее время Milvus использует следующие компоненты Prometheus:

    +
      +
    • Конечная точка Prometheus для получения данных из конечных точек, установленных экспортерами.
    • +
    • Оператор Prometheus для эффективного управления экземплярами мониторинга Prometheus.
    • +
    • Kube-prometheus для обеспечения простого в управлении сквозного мониторинга кластера Kubernetes.
    • +
    +

    Имена метрик

    Правильное имя метрики в Prometheus состоит из трех элементов: пространства имен, подсистемы и имени. Эти три элемента соединяются символом "_".

    +

    Пространство имен метрик Milvus, отслеживаемых Prometheus, - "milvus". В зависимости от роли, к которой принадлежит метрика, ее подсистема должна быть одной из следующих восьми ролей: "rootcoord", "proxy", "querycoord", "querynode", "indexcoord", "indexnode", "datacoord", "datanode".

    +

    Например, метрика Milvus, которая подсчитывает общее количество запрошенных векторов, называется milvus_proxy_search_vectors_count.

    +

    Типы метрик

    Prometheus поддерживает четыре типа метрик:

    +
      +
    • Счетчик: тип кумулятивной метрики, значение которой может только увеличиваться или обнуляться при перезапуске.
    • +
    • Манометр: тип метрики, значение которой может как увеличиваться, так и уменьшаться.
    • +
    • Гистограмма: тип метрик, которые подсчитываются на основе настраиваемых бакетов. Частым примером является длительность запроса.
    • +
    • Сводка: тип метрики, похожий на гистограмму, который вычисляет настраиваемые квантили в скользящем временном окне.
    • +
    +

    Метки метрик

    Prometheus различает выборки с одинаковыми именами метрик путем их маркировки. Метка - это определенный атрибут метрики. Метрики с одинаковыми именами должны иметь одинаковое значение для поля variable_labels. В следующей таблице перечислены названия и значения общих меток метрик Milvus.

    + + + + + + + + + + + + + + + + + +
    Имя меткиОпределениеЗначения
    "node_id"Уникальный идентификатор роли.Глобально уникальный идентификатор, генерируемый milvus.
    "status"Статус обработанной операции или запроса."abandon", "success" или "fail".
    "query_type"Тип запроса на чтение."поиск" или "запрос".
    "msg_type"Тип сообщений."вставка", "удаление", "поиск" или "запрос".
    "segment_state"Статус сегмента."Запечатан", "растет", "промыт", "промывка", "сброшен" или "импортируется".
    "cache_state"Состояние кэшированного объекта."Попадание" или "Промах".
    "имя_кэша"Имя кэшированного объекта. Эта метка используется вместе с меткой "cache_state".Например, "CollectionID", "Schema" и т. д.
    "имя_канала"Физические темы в хранилище сообщений (Pulsar или Kafka).Например, "by-dev-rootcoord-dml_0", "by-dev-rootcoord-dml_255" и т. д.
    "имя_функции"Имя функции, которая обрабатывает определенные запросы.Например, "CreateCollection", "CreatePartition", "CreateIndex" и т. д.
    "имя_пользователя"Имя пользователя, используемое для аутентификации.Имя пользователя по вашему усмотрению.
    "index_task_status"Статус индексной задачи в метахранилище."Невыполненная", "в процессе выполнения", "неудачная", "завершена" или "переработана".
    +

    Grafana в Milvus

    Grafana - это стек визуализации с открытым исходным кодом, который может подключаться ко всем источникам данных. Выводя метрики, он помогает пользователям понимать, анализировать и контролировать массивные данные.

    +

    Milvus использует настраиваемые панели Grafana для визуализации метрик.

    +

    Что дальше

    После изучения базового рабочего процесса мониторинга и оповещения вы узнаете:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.json b/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.json new file mode 100644 index 000000000..fd27ca837 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.json @@ -0,0 +1 @@ +{"codeList":["wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json\n"],"headingContent":"Visualize Milvus Metrics in Grafana","anchorList":[{"label":"Визуализация метрик Milvus в Grafana","href":"Visualize-Milvus-Metrics-in-Grafana","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Визуализация метрик с помощью Grafana","href":"Visualize-metrics-using-Grafana","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.md b/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.md new file mode 100644 index 000000000..8c5fc9821 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/monitor/visualize.md @@ -0,0 +1,100 @@ +--- +id: visualize.md +title: Визуализация показателей +related_key: 'monitor, alert' +summary: 'Узнайте, как визуализировать метрики Milvus в Grafana.' +--- +

    Визуализация метрик Milvus в Grafana

    В этой теме описывается, как визуализировать метрики Milvus с помощью Grafana.

    +

    Как описано в руководстве по мониторингу, метрики содержат полезную информацию, например, о том, сколько памяти используется конкретным компонентом Milvus. Мониторинг метрик помогает лучше понять производительность Milvus и состояние его работы, чтобы своевременно корректировать распределение ресурсов.

    +

    Визуализация - это график, показывающий изменение использования ресурсов во времени, что позволяет быстро увидеть и заметить изменения в использовании ресурсов, особенно когда происходит какое-либо событие.

    +

    В этом руководстве используется Grafana, платформа с открытым исходным кодом для аналитики временных рядов, для визуализации различных показателей производительности кластера Milvus, развернутого на Kubernetes (K8s).

    +

    Необходимые условия

      +
    • Вы установили кластер Milvus на K8s).
    • +
    • Вам необходимо настроить Prometheus на мониторинг и сбор метрик, прежде чем использовать Grafana для визуализации метрик. Если настройка прошла успешно, вы можете получить доступ к Grafana по адресу http://localhost:3000. Также вы можете получить доступ к Grafana, используя стандартный адрес Grafana user:password admin:admin .
    • +
    +

    Визуализация метрик с помощью Grafana

    1. Скачайте и импортируйте дашборд

    Загрузите и импортируйте дашборд Milvus из файла JSON.

    +
    wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json
    +
    +

    + + Download_and_import + Загрузить_и_импортировать

    +

    2. Просмотр метрик

    Выберите экземпляр Milvus, который вы хотите отслеживать. После этого вы увидите панель компонентов Milvus.

    +

    + + Select_instance + Выбрать_экземпляр

    +

    + + Grafana_panel + Grafana_panel

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.json b/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.json new file mode 100644 index 000000000..db40cf0d0 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n storage:\n inCluster:\n values:\n mode: standalone\n resources:\n requests:\n memory: 100Mi\n deletionPolicy: Delete # Delete | Retain, default: Retain\n pvcDeletion: true # default: false\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-s3-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n # your bucket name\n bucketName: \n # Optional, config the prefix of the bucket milvus will use\n rootPath: milvus/my-release\n useSSL: true\n dependencies:\n storage:\n # enable external object storage\n external: true\n type: S3 # MinIO | S3\n # the endpoint of AWS S3\n endpoint: s3.amazonaws.com:443\n # the secret storing the access key and secret key\n secretRef: \"my-release-s3-secret\"\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n eks.amazonaws.com/role-arn: \n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n # enable AssumeRole\n useIAM: true\n # Omit other fields ...\n dependencies:\n storage:\n # Omit other fields ...\n # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect\n endpoint: s3..amazonaws.com:443\n secretRef: \"\" # we don't need to specify the secret here\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-gcp-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n cloudProvider: gcp\n dependencies:\n storage:\n # Omit other fields ...\n endpoint: storage.googleapis.com:443\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n iam.gke.io/gcp-service-account: \n","labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n cloudProvider: gcp\n # enable AssumeRole\n useIAM: true\n # Omit other fields ... \n"],"headingContent":"Configure Object Storage with Milvus Operator","anchorList":[{"label":"Настройка объектного хранилища с помощью Milvus Operator","href":"Configure-Object-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"Настройка хранилища объектов","href":"Configure-object-storage","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.md b/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.md new file mode 100644 index 000000000..a3455fe21 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/object_storage_operator.md @@ -0,0 +1,230 @@ +--- +id: object_storage_operator.md +title: Настройка объектного хранилища с помощью Milvus Operator +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 'Узнайте, как настроить объектное хранилище с помощью Milvus Operator.' +--- +

    Настройка объектного хранилища с помощью Milvus Operator

    Milvus использует MinIO или S3 в качестве объектного хранилища для сохранения крупных файлов, таких как индексные файлы и двоичные журналы. В этой теме описывается настройка зависимостей объектного хранилища при установке Milvus с Milvus Operator. Дополнительные сведения см. в разделе Настройка объектного хранилища с Milvus Operator в репозитории Milvus Operator.

    +

    В этой теме предполагается, что вы развернули Milvus Operator.

    +
    Дополнительные сведения см. в разделе Развертывание Milvus Operator.
    +

    Вам нужно указать файл конфигурации для использования Milvus Operator для запуска кластера Milvus.

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Для настройки сторонних зависимостей достаточно отредактировать шаблон кода в milvus_cluster_default.yaml. В следующих разделах описывается настройка объектного хранилища, etcd и Pulsar соответственно.

    +

    Настройка хранилища объектов

    Кластер Milvus использует MinIO или S3 в качестве объектного хранилища для хранения больших файлов, таких как индексные файлы и двоичные журналы. Добавьте необходимые поля в поле spec.dependencies.storage для настройки объектного хранилища, возможные варианты: external и inCluster.

    +

    Внутреннее хранилище объектов

    По умолчанию Milvus Operator развертывает внутрикластерное MinIO для Milvus. Ниже приведен пример конфигурации, демонстрирующий использование этого MinIO в качестве внутреннего хранилища объектов.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    storage:
    +      inCluster:
    +        values:
    +          mode: standalone
    +          resources:
    +            requests:
    +              memory: 100Mi
    +        deletionPolicy: Delete # Delete | Retain, default: Retain
    +        pvcDeletion: true # default: false
    +
    +

    После применения вышеуказанной конфигурации внутрикластерное MinIO будет работать в автономном режиме с ограничением памяти до 100Mi. Обратите внимание, что

    +
      +
    • Поле deletionPolicy определяет политику удаления для in-cluster MinIO. По умолчанию оно принимает значение Delete, а в качестве альтернативного варианта может использоваться Retain.

      +
        +
      • Delete указывает, что внутрикластерное хранилище объектов удаляется при остановке экземпляра Milvus.
      • +
      • Retain указывает, что внутрикластерное хранилище объектов сохраняется в качестве службы зависимостей для последующих запусков экземпляра Milvus.
      • +
    • +
    • Поле pvcDeletion указывает, удалять ли PVC (Persistent Volume Claim) при удалении внутрикластерного MinIO.

    • +
    +

    Поля в разделе inCluster.values такие же, как в Milvus Helm Chart, и вы можете найти их здесь.

    +

    Внешнее хранилище объектов

    Использование external в файле YAML шаблона указывает на использование внешней службы хранения объектов. Чтобы использовать внешнее хранилище объектов, необходимо правильно задать поля spec.dependencies.storage и spec.config.minio в Milvus CRD.

    +

    Использование Amazon Web Service (AWS) S3 в качестве внешнего хранилища объектов

      +
    • Настройте доступ к AWS S3 по AK/SK

      +

      Доступ к ведру S3 обычно осуществляется с помощью пары ключей доступа и секретного ключа доступа. Вы можете создать объект Secret для их хранения в Kubernetes следующим образом:

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-s3-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      Затем можно настроить ведро AWS S3 в качестве внешнего хранилища объектов:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      # your bucket name
      +      bucketName: <my-bucket>
      +      # Optional, config the prefix of the bucket milvus will use
      +      rootPath: milvus/my-release
      +      useSSL: true
      +  dependencies:
      +    storage:
      +      # enable external object storage
      +      external: true
      +      type: S3 # MinIO | S3
      +      # the endpoint of AWS S3
      +      endpoint: s3.amazonaws.com:443
      +      # the secret storing the access key and secret key
      +      secretRef: "my-release-s3-secret"
      +
    • +
    • Configure AWS S3 Access by AssumeRole

      +

      В качестве альтернативы, вы можете заставить Milvus получить доступ к вашему ведру AWS S3, используя AssumeRole, так что будут задействованы только временные учетные данные, а не ваш реальный AK/SK.

      +

      Если вы предпочитаете именно этот вариант, вам нужно подготовить роль в консоли AWS и получить ее ARN, который обычно имеет вид arn:aws:iam::<your account id>:role/<role-name>.

      +

      Затем создайте объект ServiceAccount для его хранения в Kubernetes следующим образом:

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    eks.amazonaws.com/role-arn: <my-role-arn>
      +
      +

      Когда все готово, ссылайтесь на вышеупомянутый ServiceAccount в YAML-файле шаблона и установите spec.config.minio.useIAM на true, чтобы включить AssumeRole.

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect
      +      endpoint: s3.<my-bucket-region>.amazonaws.com:443
      +      secretRef: "" # we don't need to specify the secret here
      +
    • +
    +

    Использование облачного хранилища Google (GCS) в качестве внешнего хранилища объектов

    Объектное хранилище AWS S3 - не единственный выбор. Вы также можете использовать службу хранения объектов других провайдеров публичных облаков, например Google Cloud.

    +
      +
    • Настройка доступа к GCS с помощью AK/SK

      +

      Конфигурация в основном аналогична настройке при использовании AWS S3. Вам по-прежнему нужно создать объект Secret для хранения учетных данных в Kubernetes.

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-gcp-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      Затем нужно только изменить endpoint на storage.googleapis.com:443 и установить spec.config.minio.cloudProvider на gcp, как показано ниже:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      endpoint: storage.googleapis.com:443
      +
    • +
    • Настройка доступа к GCS по AssumeRole

      +

      Подобно AWS S3, вы также можете использовать Workload Identity для доступа к GCS с временными учетными данными, если вы используете GKE в качестве кластера Kubernetes.

      +

      Аннотация ServiceAccount отличается от аннотации AWS EKS. Вам нужно указать имя учетной записи службы GCP вместо ARN роли.

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    iam.gke.io/gcp-service-account: <my-gcp-service-account-name>
      +
      +

      Затем вы можете настроить свой экземпляр Milvus на использование вышеуказанного ServiceAccount и включить AssumeRole, установив spec.config.minio.useIAM на true, как показано ниже:

      +
      labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...  
      +
    • +
    +

    Что дальше

    Узнайте, как настроить другие зависимости Milvus с помощью Milvus Operator:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/privilege_group.json b/localization/v2.5.x/site/ru/adminGuide/privilege_group.json new file mode 100644 index 000000000..05a8b3d2a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/privilege_group.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\nclient.create_privileg_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​\n​\nclient.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.CreatePrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​\n\n","import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​\n​\nclient.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Arrays.asList(\"Query\", \"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.AddPrivilegesToGroup(context.Background(), \"privilege_group_1\", []string{\"Query\", \"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Query\", \"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​\n\n","import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​\n​\nclient.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Collections.singletonList(\"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.RemovePrivilegesFromGroup(context.Background(), \"privilege_group_1\", []string{\"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.list_privilege_groups()​\n\n","import io.milvus.v2.service.rbac.PrivilegeGroup;​\nimport io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​\nimport io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​\n​\nListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​\n .build());​\nList groups = resp.getPrivilegeGroups();​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.ListPrivilegeGroups(context.Background())​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","PrivilegeGroupItem: , ​\n\n","from pymilvus import MilvusClient​\nclient.drop_privilege_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​\n​\nclient.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.DropPrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n"],"headingContent":"Create Privilege Group​","anchorList":[{"label":"Создание группы привилегий","href":"Create-Privilege-Group​","type":1,"isActive":false},{"label":"Группа привилегий по сравнению с привилегиями","href":"Privilege-group-vs-privileges​","type":2,"isActive":false},{"label":"Встроенные группы привилегий","href":"Built-in-privilege-groups​","type":2,"isActive":false},{"label":"Процедуры","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/privilege_group.md b/localization/v2.5.x/site/ru/adminGuide/privilege_group.md new file mode 100644 index 000000000..009fb3f63 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/privilege_group.md @@ -0,0 +1,491 @@ +--- +id: privilege_group.md +related_key: enable RBAC +summary: >- + Чтобы упростить процесс предоставления привилегий, рекомендуется объединить + несколько привилегий в группу привилегий. +title: Создание группы привилегий +--- +

    Создание группы привилегий

    Чтобы упростить процесс предоставления привилегий, рекомендуется объединить несколько привилегий в группу привилегий.

    +

    Группа привилегий по сравнению с привилегиями

    Группа привилегий состоит из нескольких привилегий.

    +

    + + Privilege group illustrated + Иллюстрация группы привилегий

    +

    Как показано на рисунке выше, предположим, что вам нужно предоставить три различные привилегии для роли.

    +
      +
    • Если вы не используете группу привилегий, вам нужно предоставить привилегии три раза.

    • +
    • Если вы используете группу привилегий, вам нужно только создать группу привилегий, добавить три привилегии в эту группу привилегий и предоставить группу привилегий роли A.

    • +
    +

    Используя группу привилегий, вы можете предоставить роли несколько привилегий в совокупности.

    +

    Встроенные группы привилегий

    Для простоты использования Milvus предоставляет в общей сложности 9 встроенных привилегий на уровне коллекции, базы данных и экземпляра: COLL_RO, COLL_RW, COLL_ADMIN, DB_RO, DB_RW, DB_Admin, Cluster_RO, Cluster_RW и Cluster_Admin.

    +
    +

    Три уровня встроенных групп привилегий не имеют каскадной зависимости. Установка группы привилегий на уровне экземпляра не приводит к автоматическому установлению разрешений для всех баз данных и коллекций под этим экземпляром. Привилегии на уровне баз данных и коллекций необходимо устанавливать вручную.

    +
    +

    В следующих таблицах описаны привилегии, включенные в каждую из встроенных групп привилегий.

    +

    Уровень коллекции

      +
    • COLL_RO: включает привилегии на чтение данных коллекции

    • +
    • COLL_RW: включает привилегии на чтение и запись данных коллекции

    • +
    • COLL_ADMIN: включает привилегии на чтение и запись данных коллекции и управление коллекциями.

    • +
    +

    В таблице ниже перечислены конкретные привилегии, включенные в три встроенные группы привилегий на уровне коллекции.

    +

    **Привилегия**

    +

    **CollectionReadOnly**

    +

    **CollectionReadWrite**

    +

    **CollectionAdmin**

    +

    Запрос

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    Поиск

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    IndexDetail

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetFlushState

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetLoadState

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetLoadingProgress

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    HasPartition

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    ShowPartitions

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    ListAliases

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    DescribeCollection

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    DescribeAlias

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetStatistics

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    CreateIndex

    +

    +

    ✔️

    +

    ✔️

    +

    DropIndex

    +

    +

    ✔️

    +

    ✔️

    +

    CreatePartition

    +

    +

    ✔️

    +

    ✔️

    +

    DropPartition

    +

    +

    ✔️

    +

    ✔️

    +

    Загрузить

    +

    +

    ✔️

    +

    ✔️

    +

    Освобождение

    +

    +

    ✔️

    +

    ✔️

    +

    Вставить

    +

    +

    ✔️

    +

    ✔️

    +

    Удалить

    +

    +

    ✔️

    +

    ✔️

    +

    Upsert

    +

    +

    ✔️

    +

    ✔️

    +

    Импорт

    +

    +

    ✔️

    +

    ✔️

    +

    Промывка

    +

    +

    ✔️

    +

    ✔️

    +

    Уплотнение

    +

    +

    ✔️

    +

    ✔️

    +

    LoadBalance

    +

    +

    ✔️

    +

    ✔️

    +

    CreateAlias

    +

    +

    +

    ✔️

    +

    DropAlias

    +

    +

    +

    ✔️

    +
    +

    Уровень базы данных

      +
    • DB_RO: включает привилегии на чтение данных базы данных

    • +
    • DB_RW: включает привилегии на чтение и запись данных базы данных

    • +
    • DB_Admin: включает привилегии на чтение и запись данных базы данных и управление базами данных.

    • +
    +

    В следующей таблице перечислены конкретные привилегии, включенные в три встроенные группы привилегий на уровне базы данных.

    +

    **Привилегия**

    +

    **DatabaseReadOnly**

    +

    **DatabaseReadWrite**

    +

    **Администратор базы данных**

    +

    ShowCollections

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    Описать базу данных

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    CreateCollection

    +

    +

    +

    ✔️

    +

    DropCollection

    +

    +

    +

    ✔️

    +

    AlterDatabase

    +

    +

    ✔️

    +

    ✔️

    +
    +

    Уровень кластера

      +
    • Cluster_RO: включает привилегии на чтение данных экземпляра

    • +
    • Cluster_RW: включает привилегии на чтение и запись данных экземпляра

    • +
    • Cluster_Admin: включает привилегии на чтение и запись данных экземпляра и управление экземплярами.

    • +
    +

    В таблице ниже перечислены конкретные привилегии, включенные в три встроенные группы привилегий на уровне экземпляра.

    +

    **Привилегия**

    +

    **ClusterReadOnly**

    +

    **ClusterReadWrite**

    +

    **ClusterAdmin**

    +

    ListDatabases

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    ПереименоватьКоллекцию

    +

    +

    +

    ✔️

    +

    CreateOwnership

    +

    +

    +

    ✔️

    +

    UpdateUser

    +

    +

    +

    ✔️

    +

    DropOwnership

    +

    +

    +

    ✔️

    +

    SelectOwnership

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    ManageOwnership

    +

    +

    +

    ✔️

    +

    SelectUser

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    BackupRBAC

    +

    +

    +

    ✔️

    +

    RestoreRBAC

    +

    +

    +

    ✔️

    +

    CreateResourceGroup

    +

    +

    +

    ✔️

    +

    DropResourceGroup

    +

    +

    +

    ✔️

    +

    UpdateResourceGroups

    +

    +

    ✔️

    +

    ✔️

    +

    DescribeResourceGroup

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    ListResourceGroups

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    TransferNode

    +

    +

    ✔️

    +

    ✔️

    +

    TransferReplica

    +

    +

    ✔️

    +

    ✔️

    +

    Создать базу данных

    +

    +

    +

    ✔️

    +

    DropDatabase

    +

    +

    +

    ✔️

    +

    FlushAll

    +

    +

    ✔️

    +

    ✔️

    +

    CreatePrivilegeGroup

    +

    +

    +

    ✔️

    +

    DropPrivilegeGroup

    +

    +

    +

    ✔️

    +

    ListPrivilegeGroups

    +

    +

    +

    ✔️

    +

    OperatePrivilegeGroup

    +

    +

    +

    ✔️

    +
    +

    Процедуры

    Вы можете создать группу привилегий, а затем добавить привилегии в группу привилегий.

    +

    Создание группы привилегий

    В следующем примере показано, как создать группу привилегий с именем privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.create_privileg_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​
    +​
    +client.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.CreatePrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    +

    Добавление привилегий в группу привилегий

    В следующем примере показано, как добавить привилегии PrivilegeBackupRBAC и PrivilegeRestoreRBAC в только что созданную группу привилегий privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​
    +​
    +client.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Arrays.asList("Query", "Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.AddPrivilegesToGroup(context.Background(), "privilege_group_1", []string{"Query", "Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Query", "Search"]​
    +}'​
    +
    +
    +

    Удаление привилегий из группы привилегий

    В следующем примере показано, как удалить привилегию PrivilegeRestoreRBAC из группы привилегий privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​
    +​
    +client.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Collections.singletonList("Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.RemovePrivilegesFromGroup(context.Background(), "privilege_group_1", []string{"Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Search"]​
    +}'​
    +
    +
    +

    Список групп привилегий

    Следующий пример демонстрирует, как перечислить все существующие группы привилегий.

    + +
    from pymilvus import MilvusClient​
    +client.list_privilege_groups()​
    +
    +
    +
    import io.milvus.v2.service.rbac.PrivilegeGroup;​
    +import io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​
    +import io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​
    +​
    +ListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​
    +        .build());​
    +List<PrivilegeGroup> groups = resp.getPrivilegeGroups();​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.ListPrivilegeGroups(context.Background())​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Ниже приведен пример вывода.

    +
    PrivilegeGroupItem: <privilege_group:privilege_group_1>, <privileges:('Search', 'Query')>​
    +
    +
    +

    Сбросить группу привилегий

    В следующем примере показано, как удалить группу привилегий privilege_group_1.

    + +
    from pymilvus import MilvusClient​
    +client.drop_privilege_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​
    +​
    +client.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.DropPrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/rbac.json b/localization/v2.5.x/site/ru/adminGuide/rbac.json new file mode 100644 index 000000000..171009819 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/rbac.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"RBAC Explained​","anchorList":[{"label":"Объяснение RBAC","href":"RBAC-Explained​","type":1,"isActive":false},{"label":"Основные понятия RBAC","href":"RBAC-key-concepts​","type":2,"isActive":false},{"label":"Процедуры","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/rbac.md b/localization/v2.5.x/site/ru/adminGuide/rbac.md new file mode 100644 index 000000000..c2b0f0727 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/rbac.md @@ -0,0 +1,78 @@ +--- +id: rbac.md +related_key: enable RBAC +summary: >- + RBAC (Role-Based Access Control) - это метод управления доступом, основанный + на ролях. С помощью RBAC можно точно контролировать операции, которые могут + выполнять пользователи на уровне коллекции, базы данных и экземпляра, что + повышает безопасность данных. +title: Объяснение RBAC +--- +

    Объяснение RBAC

    RBAC (Role-Based Access Control) - это метод управления доступом, основанный на ролях. С помощью RBAC можно точно контролировать операции, которые могут выполнять пользователи на уровне коллекции, базы данных и экземпляра, что повышает безопасность данных.

    +

    В отличие от традиционных моделей управления доступом пользователей, RBAC вводит понятие ролей. В модели RBAC вы предоставляете привилегии ролям, а затем наделяете этими ролями пользователей. Затем пользователи могут получать привилегии.

    +

    Модель RBAC позволяет повысить эффективность управления контролем доступа. Например, если нескольким пользователям требуется один и тот же набор привилегий, вам не нужно вручную устанавливать привилегии для каждого пользователя. Вместо этого можно создать роль и назначить ее пользователям. Если вы хотите изменить привилегии этих пользователей, вы можете просто изменить привилегии роли, и изменение будет применено ко всем пользователям с этой ролью.

    +

    Основные понятия RBAC

    + + Users, roles, and privileges + Пользователи, роли и привилегии

    +

    В модели RBAC есть четыре основных компонента.

    +
      +
    • **Ресурс: **Сущность ресурса, к которой можно получить доступ. В Milvus существует три уровня ресурсов - экземпляр, база данных и коллекция.

    • +
    • **Привилегия: **Празрешение на выполнение определенных операций с ресурсами Milvus (например, создание коллекций, вставка данных и т. д.).

    • +
    • **Группа привилегий: **Группа, состоящая из нескольких привилегий.

    • +
    • **Роль: **Роль состоит из двух частей - привилегий и ресурсов. Привилегии определяют тип операций, которые может выполнять роль, а ресурсы определяют целевые ресурсы, на которых могут выполняться операции. Например, роль администратора базы данных может выполнять операции чтения, записи и управления определенными базами данных.

    • +
    • **Пользователь: ** Пользователь - это человек, который использует Milvus. Каждый пользователь имеет уникальный идентификатор и получает роль или несколько ролей.

    • +
    +

    Процедуры

    Чтобы обеспечить контроль доступа с помощью RBAC, необходимо выполнить следующие шаги.

    +
      +
    1. Создайте пользователя: Помимо пользователей по умолчанию root в Milvus, вы можете создавать новых пользователей и устанавливать пароли для защиты данных.

    2. +
    3. Создайте роль: Вы можете создавать настраиваемые роли в соответствии с вашими потребностями. Конкретные возможности роли определяются ее привилегиями.

    4. +
    5. Создать группу привилегий: Объедините несколько привилегий в одну группу привилегий, чтобы упростить процесс предоставления привилегий роли.

    6. +
    7. Предоставление привилегий или групп привилегий роли: Определите возможности роли, предоставив ей привилегии или группы привилегий.

    8. +
    9. Предоставлять роли пользователям: Предоставьте пользователям роли с определенными привилегиями, чтобы пользователи могли пользоваться привилегиями роли. Одна роль может быть предоставлена нескольким пользователям.

    10. +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/resource_group.json b/localization/v2.5.x/site/ru/adminGuide/resource_group.json new file mode 100644 index 000000000..02299760d --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/resource_group.json @@ -0,0 +1 @@ +{"codeList":["{\n \"requests\": { \"nodeNum\": 1 },\n \"limits\": { \"nodeNum\": 1 },\n \"transfer_from\": [{ \"resource_group\": \"rg1\" }],\n \"transfer_to\": [{ \"resource_group\": \"rg2\" }]\n}\n","import pymilvus\n\n# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).\nname = \"rg\"\nnode_num = 0\n\n# create a resource group that exactly hold no query node.\ntry:\n utility.create_resource_group(name, config=utility.ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n ), using='default')\n print(f\"Succeeded in creating resource group {name}.\")\nexcept Exception:\n print(\"Failed to create the resource group.\")\n","rgs = utility.list_resource_groups(using='default')\nprint(f\"Resource group list: {rgs}\")\n\n# Resource group list: ['__default_resource_group', 'rg']\n","info = utility.describe_resource_group(name, using=\"default\")\nprint(f\"Resource group description: {info}\")\n\n# Resource group description: \n# , // string, rg name\n# , // int, num_node which has been transfer to this rg\n# , // int, available node_num, some node may shutdown\n# , // map[string]int, from collection_name to loaded replica of each collecion in this rg\n# , // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg \n# . // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg\n","source = '__default_resource_group'\ntarget = 'rg'\nexpected_num_nodes_in_default = 0\nexpected_num_nodes_in_rg = 1\n\ntry:\n utility.update_resource_groups({\n source: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_default},\n limits={\"node_num\": expected_num_nodes_in_default},\n ),\n target: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_rg},\n limits={\"node_num\": expected_num_nodes_in_rg},\n )\n }, using=\"default\")\n print(f\"Succeeded in move 1 node(s) from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving nodes.\")\n\n# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.\n","from pymilvus import Collection\n\ncollection = Collection('demo')\n\n# Milvus loads the collection to the default resource group.\ncollection.load(replica_number=2)\n\n# Or, you can ask Milvus load the collection to the desired resource group.\n# make sure that query nodes num should be greater or equal to replica_number\nresource_groups = ['rg']\ncollection.load(replica_number=2, _resource_groups=resource_groups) \n","collection = Collection(\"Books\")\n\n# Use the load method of a collection to load one of its partition\ncollection.load([\"Novels\"], replica_number=2, _resource_groups=resource_groups)\n\n# Or, you can use the load method of a partition directly\npartition = Partition(collection, \"Novels\")\npartition.load(replica_number=2, _resource_groups=resource_groups)\n","source = '__default_resource_group'\ntarget = 'rg'\ncollection_name = 'c'\nnum_replicas = 1\n\ntry:\n utility.transfer_replica(source, target, collection_name, num_replicas, using=\"default\")\n print(f\"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving replicas.\")\n\n# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.\n","try:\n utility.update_resource_groups({\n \"rg\": utility.ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n ),\n }, using=\"default\")\n utility.drop_resource_group(\"rg\", using=\"default\")\n print(f\"Succeeded in dropping {source}.\")\nexcept Exception:\n print(f\"Something went wrong while dropping {source}.\")\n","from pymilvus import utility\nfrom pymilvus.client.types import ResourceGroupConfig\n\n_PENDING_NODES_RESOURCE_GROUP=\"__pending_nodes\"\n\ndef init_cluster(node_num: int):\n print(f\"Init cluster with {node_num} nodes, all nodes will be put in default resource group\")\n # create a pending resource group, which can used to hold the pending nodes that do not hold any data.\n utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(\n requests={\"node_num\": 0}, # this resource group can hold 0 nodes, no data will be load on it.\n limits={\"node_num\": 10000}, # this resource group can hold at most 10000 nodes \n ))\n\n # update default resource group, which can used to hold the nodes that all initial node in it.\n utility.update_resource_groups({\n \"__default_resource_group\": ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.\n )})\n utility.create_resource_group(name=\"rg1\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n utility.create_resource_group(name=\"rg2\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n\ninit_cluster(1)\n","\ndef scale_to(node_num: int):\n # scale the querynode number in Milvus into node_num.\n pass\n","# scale rg1 into 3 nodes, rg2 into 1 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 3},\n limits={\"node_num\": 3},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n \"rg2\": ResourceGroupConfig(\n requests={\"node_num\": 1},\n limits={\"node_num\": 1},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\nscale_to(5)\n# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.\n","# scale rg1 from 3 nodes into 2 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 2},\n limits={\"node_num\": 2},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\n\n# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.\nscale_to(4)\n# scale the node in __pending_nodes\n"],"headingContent":"Manage Resource Groups","anchorList":[{"label":"Управление группами ресурсов","href":"Manage-Resource-Groups","type":1,"isActive":false},{"label":"Что такое группа ресурсов","href":"What-is-a-resource-group","type":2,"isActive":false},{"label":"Понятия группы ресурсов","href":"Concepts-of-resource-group","type":2,"isActive":false},{"label":"Использование декларативного api для управления группой ресурсов","href":"Use-declarative-api-to-manage-resource-group","type":2,"isActive":false},{"label":"Хорошая практика для управления масштабированием кластера","href":"A-good-practice-to-manage-cluster-scaling","type":2,"isActive":false},{"label":"Как группы ресурсов взаимодействуют с несколькими репликами","href":"How-resource-groups-interacts-with-multiple-replicas","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/resource_group.md b/localization/v2.5.x/site/ru/adminGuide/resource_group.md new file mode 100644 index 000000000..12bb4f5dc --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/resource_group.md @@ -0,0 +1,353 @@ +--- +id: resource_group.md +related_key: Manage Resource Groups +summary: 'Узнайте, как управлять группами ресурсов.' +title: Управление группами ресурсов +--- +

    Управление группами ресурсов

    В Milvus можно использовать группу ресурсов, чтобы физически изолировать определенные узлы запросов от других. В этом руководстве рассказывается о том, как создавать и управлять пользовательскими группами ресурсов, а также перемещать узлы между ними.

    +

    Что такое группа ресурсов

    Группа ресурсов может содержать несколько или все узлы запросов в кластере Milvus. Вы решаете, как распределить узлы запросов между группами ресурсов, исходя из того, что для вас наиболее целесообразно. Например, в сценарии с несколькими коллекциями можно выделить соответствующее количество узлов запросов для каждой группы ресурсов и загрузить коллекции в разные группы ресурсов, чтобы операции внутри каждой коллекции были физически независимы от операций в других коллекциях.

    +

    Обратите внимание, что экземпляр Milvus поддерживает ресурсную группу по умолчанию для хранения всех узлов запросов при запуске и называет ее __default_resource_group.

    +

    Начиная с версии 2.4.1, Milvus предоставляет декларативный API групп ресурсов, в то время как старый API групп ресурсов был устаревшим. Новый декларативный API позволяет пользователям достичь идемпотентности, чтобы упростить вторичную разработку в облачных нативных средах.

    +

    Понятия группы ресурсов

    Группа ресурсов описывается конфигурацией группы ресурсов:

    +
    {
    +    "requests": { "nodeNum": 1 },
    +    "limits": { "nodeNum": 1 },
    +    "transfer_from": [{ "resource_group": "rg1" }],
    +    "transfer_to": [{ "resource_group": "rg2" }]
    +}
    +
    +
      +
    • Атрибут requests определяет условия, которым должна удовлетворять группа ресурсов.
    • +
    • Атрибут limits определяет максимальные ограничения для группы ресурсов.
    • +
    • Атрибуты transfer_from и transfer_to описывают, из каких групп ресурсов группа ресурсов должна предпочтительно получать ресурсы и в какие группы ресурсов она должна передавать ресурсы, соответственно.
    • +
    +

    При изменении конфигурации группы ресурсов Milvus будет максимально корректировать текущие ресурсы узла запроса в соответствии с новой конфигурацией, гарантируя, что все группы ресурсов в конечном итоге удовлетворят следующему условию:

    +

    .requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.

    +

    За исключением следующих случаев:

    +
      +
    • Когда количество QueryNodes в кластере Milvus недостаточно, т.е. NumOfQueryNode < sum(.requests.nodeNum), всегда будут существовать группы ресурсов без достаточного количества QueryNodes.
    • +
    • Когда количество QueryNodes в кластере Milvus избыточно, т.е. NumOfQueryNode > sum(.limits.nodeNum), избыточные QueryNodes всегда будут размещаться в __default_resource_group первыми.
    • +
    +

    Конечно, если количество QueryNodes в кластере изменится, Milvus будет постоянно пытаться подстроиться под конечные условия. Поэтому можно сначала применить изменения в конфигурации группы ресурсов, а затем выполнить масштабирование QueryNode.

    +

    Использование декларативного api для управления группой ресурсов

    +

    Все примеры кода на этой странице приведены в версии PyMilvus 2.5.3. Перед их выполнением обновите свою установку PyMilvus.

    +
    +
      +
    1. Создайте группу ресурсов.

      +

      Чтобы создать группу ресурсов, выполните следующие действия после подключения к экземпляру Milvus. В следующем фрагменте предполагается, что default - это псевдоним вашего соединения с Milvus.

      +
      import pymilvus
      +
      +# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).
      +name = "rg"
      +node_num = 0
      +
      +# create a resource group that exactly hold no query node.
      +try:
      +    utility.create_resource_group(name, config=utility.ResourceGroupConfig(
      +        requests={"node_num": node_num},
      +        limits={"node_num": node_num},
      +    ), using='default')
      +    print(f"Succeeded in creating resource group {name}.")
      +except Exception:
      +    print("Failed to create the resource group.")
      +
    2. +
    3. Список групп ресурсов.

      +

      Создав группу ресурсов, вы можете увидеть ее в списке групп ресурсов.

      +

      Чтобы просмотреть список групп ресурсов в экземпляре Milvus, выполните следующие действия:

      +
      rgs = utility.list_resource_groups(using='default')
      +print(f"Resource group list: {rgs}")
      +
      +# Resource group list: ['__default_resource_group', 'rg']
      +
    4. +
    5. Опишите группу ресурсов.

      +

      Вы можете попросить Milvus описать группу ресурсов в концерне следующим образом:

      +
      info = utility.describe_resource_group(name, using="default")
      +print(f"Resource group description: {info}")
      +
      +# Resource group description: 
      +#        <name:"rg">,           // string, rg name
      +#        <capacity:1>,            // int, num_node which has been transfer to this rg
      +#        <num_available_node:0>,  // int, available node_num, some node may shutdown
      +#        <num_loaded_replica:{}>, // map[string]int, from collection_name to loaded replica of each collecion in this rg
      +#        <num_outgoing_node:{}>,  // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg 
      +#        <num_incoming_node:{}>.  // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg
      +
    6. +
    7. Передача узлов между группами ресурсов.

      +

      Вы можете заметить, что в описанной группе ресурсов еще нет ни одного узла запроса. Переместите несколько узлов из стандартной группы ресурсов в создаваемую следующим образом: предположим, что в настоящее время в __default_resource_group кластера находится 1 узел запросов, и мы хотим перенести один узел в созданную rg.update_resource_groups обеспечивает атомарность при многократном изменении конфигурации, поэтому никакие промежуточные состояния не будут видны Milvus.

      +
      source = '__default_resource_group'
      +target = 'rg'
      +expected_num_nodes_in_default = 0
      +expected_num_nodes_in_rg = 1
      +
      +try:
      +    utility.update_resource_groups({
      +        source: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_default},
      +            limits={"node_num": expected_num_nodes_in_default},
      +        ),
      +        target: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_rg},
      +            limits={"node_num": expected_num_nodes_in_rg},
      +        )
      +    }, using="default")
      +    print(f"Succeeded in move 1 node(s) from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving nodes.")
      +
      +# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.
      +
    8. +
    9. Загрузка коллекций и разделов в группу ресурсов.

      +

      Как только в группе ресурсов появятся узлы запросов, можно загружать коллекции в эту группу ресурсов. В следующем фрагменте предполагается, что коллекция с именем demo уже существует.

      +
      from pymilvus import Collection
      +
      +collection = Collection('demo')
      +
      +# Milvus loads the collection to the default resource group.
      +collection.load(replica_number=2)
      +
      +# Or, you can ask Milvus load the collection to the desired resource group.
      +# make sure that query nodes num should be greater or equal to replica_number
      +resource_groups = ['rg']
      +collection.load(replica_number=2, _resource_groups=resource_groups) 
      +
      +

      Также можно просто загрузить раздел в группу ресурсов, а его реплики распределить между несколькими группами ресурсов. В следующем фрагменте предполагается, что коллекция с именем Books уже существует и в ней есть раздел с именем Novels.

      +
      collection = Collection("Books")
      +
      +# Use the load method of a collection to load one of its partition
      +collection.load(["Novels"], replica_number=2, _resource_groups=resource_groups)
      +
      +# Or, you can use the load method of a partition directly
      +partition = Partition(collection, "Novels")
      +partition.load(replica_number=2, _resource_groups=resource_groups)
      +
      +

      Обратите внимание, что _resource_groups - необязательный параметр, и если его не указывать, Milvus загрузит реплики на узлы запросов в группе ресурсов по умолчанию.

      +

      Чтобы Milus загружал каждую реплику коллекции в отдельную группу ресурсов, убедитесь, что количество групп ресурсов равно количеству реплик.

    10. +
    11. Передача реплик между группами ресурсов.

      +

      Milvus использует реплики для балансировки нагрузки между сегментами, распределенными по нескольким узлам запросов. Вы можете переместить определенные реплики коллекции из одной группы ресурсов в другую следующим образом:

      +
      source = '__default_resource_group'
      +target = 'rg'
      +collection_name = 'c'
      +num_replicas = 1
      +
      +try:
      +    utility.transfer_replica(source, target, collection_name, num_replicas, using="default")
      +    print(f"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving replicas.")
      +
      +# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.
      +
    12. +
    13. Сбросить группу ресурсов.

      +

      Вы можете отказаться от группы ресурсов, в которой нет узла запроса (limits.node_num = 0), в любое время. В этом руководстве группа ресурсов rg теперь имеет один узел запроса. Сначала необходимо изменить конфигурацию limits.node_num группы ресурсов на нулевую.

      +
      try:
      +    utility.update_resource_groups({
      +        "rg": utility.ResourceGroupConfig(
      +            requests={"node_num": 0},
      +            limits={"node_num": 0},
      +        ),
      +    }, using="default")
      +    utility.drop_resource_group("rg", using="default")
      +    print(f"Succeeded in dropping {source}.")
      +except Exception:
      +    print(f"Something went wrong while dropping {source}.")
      +
    14. +
    +

    Для получения более подробной информации обратитесь к соответствующим примерам в pymilvus.

    +

    Хорошая практика для управления масштабированием кластера

    В настоящее время Milvus не может самостоятельно масштабироваться в облачных средах. Однако, используя Declarative Resource Group API в сочетании с контейнерной оркестровкой, Milvus может легко добиться изоляции ресурсов и управления ими для QueryNodes. Вот примерная практика управления QueryNodes в облачной среде:

    +
      +
    1. По умолчанию Milvus создает __default_resource_group. Эта группа ресурсов не может быть удалена, а также служит группой ресурсов загрузки по умолчанию для всех коллекций, и к ней всегда назначаются избыточные QueryNodes. Поэтому мы можем создать ожидающую группу ресурсов для хранения неиспользуемых ресурсов QueryNode, предотвращая занятие ресурсов QueryNode группой __default_resource_group.

      +

      Кроме того, если мы строго соблюдаем ограничение sum(.requests.nodeNum) <= queryNodeNum, мы можем точно контролировать распределение QueryNodes в кластере. Предположим, что в настоящее время в кластере есть только один QueryNode, и инициализируем кластер. Вот пример настройки:

      +
      from pymilvus import utility
      +from pymilvus.client.types import ResourceGroupConfig
      +
      +_PENDING_NODES_RESOURCE_GROUP="__pending_nodes"
      +
      +def init_cluster(node_num: int):
      +    print(f"Init cluster with {node_num} nodes, all nodes will be put in default resource group")
      +    # create a pending resource group, which can used to hold the pending nodes that do not hold any data.
      +    utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(
      +        requests={"node_num": 0}, # this resource group can hold 0 nodes, no data will be load on it.
      +        limits={"node_num": 10000}, # this resource group can hold at most 10000 nodes 
      +    ))
      +
      +    # update default resource group, which can used to hold the nodes that all initial node in it.
      +    utility.update_resource_groups({
      +        "__default_resource_group": ResourceGroupConfig(
      +            requests={"node_num": node_num},
      +            limits={"node_num": node_num},
      +            transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.
      +            transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.
      +        )})
      +    utility.create_resource_group(name="rg1", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +    utility.create_resource_group(name="rg2", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +
      +init_cluster(1)
      +
      +

      Используя приведенный выше код примера, мы создаем группу ресурсов с именем __pending_nodes для хранения дополнительных QueryNodes. Мы также создаем две пользовательские группы ресурсов с именами rg1 и rg2. Кроме того, мы убеждаемся, что для другой группы ресурсов приоритетным является восстановление недостающих или избыточных QueryNodes из __pending_nodes.

    2. +
    3. Масштабирование кластера

      +

      Предположим, что у нас есть следующая функция масштабирования:

      +
      
      +def scale_to(node_num: int):
      +    # scale the querynode number in Milvus into node_num.
      +    pass
      +
      +

      Мы можем использовать API для масштабирования определенной группы ресурсов до заданного количества QueryNodes, не затрагивая другие группы ресурсов.

      +
      # scale rg1 into 3 nodes, rg2 into 1 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 3},
      +        limits={"node_num": 3},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +    "rg2": ResourceGroupConfig(
      +        requests={"node_num": 1},
      +        limits={"node_num": 1},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +scale_to(5)
      +# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.
      +
    4. +
    5. Масштабирование кластера

      +

      Аналогично, мы можем установить правила масштабирования, которые определяют приоритет выбора QueryNodes из группы ресурсов __pending_nodes. Эту информацию можно получить через describe_resource_group API. Достижение цели масштабирования в заданной группе ресурсов.

      +
      # scale rg1 from 3 nodes into 2 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 2},
      +        limits={"node_num": 2},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +
      +# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.
      +scale_to(4)
      +# scale the node in __pending_nodes
      +
    6. +
    +

    Как группы ресурсов взаимодействуют с несколькими репликами

      +
    • Реплики одной коллекции и группы ресурсов имеют отношение N к N.
    • +
    • Когда несколько реплик одной коллекции загружаются в одну ресурсную группу, QueryNodes этой ресурсной группы равномерно распределяются между репликами, гарантируя, что разница в количестве QueryNodes у каждой реплики не превышает 1.
    • +
    +

    Что дальше

    Чтобы развернуть многопользовательский экземпляр Milvus, прочтите следующее:

    + diff --git a/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.json b/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.json new file mode 100644 index 000000000..0f53db5f2 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.json @@ -0,0 +1 @@ +{"codeList":["# new-values.yaml\nminio:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yam;\nminio:\n zones: 2\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n resources:\n limits:\n cpu: 2\n memory: 12Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n replicaCount: 4\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n broker:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","pulsar:\n bookkeeper:\n volumes:\n journal:\n size: 20Gi\n storageClassName: gp3\n","# new-values.yaml\npulsar:\n broker:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n replicaCount: 5\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n"],"headingContent":"Scale Milvus Dependencies","anchorList":[{"label":"Зависимости для масштабирования Milvus","href":"Scale-Milvus-Dependencies","type":1,"isActive":false},{"label":"Масштабирование MinIO","href":"Scale-MinIO","type":2,"isActive":false},{"label":"Kafka","href":"Kafka","type":2,"isActive":false},{"label":"Добавьте дополнительный пул брокеров Kafka (рекомендуется)","href":"Add-an-extra-Kafka-broker-pool-Recommended","type":2,"isActive":false},{"label":"Pulsar","href":"Pulsar","type":2,"isActive":false},{"label":"Увеличение ресурсов на один брокерский подиум Pulsar","href":"Increase-resources-per-Pulsar-broker-pod","type":2,"isActive":false},{"label":"Увеличить количество ресурсов на одну капсулу букмекера Pulsar","href":"Increase-resources-per-Pulsar-bookie-pod","type":2,"isActive":false},{"label":"etcd","href":"etcd","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.md b/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.md new file mode 100644 index 000000000..db76e09ee --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/scale-dependencies.md @@ -0,0 +1,252 @@ +--- +id: scale-dependencies.md +title: Зависимости от масштаба +--- +

    Зависимости для масштабирования Milvus

    Milvus зависит от различных зависимостей, таких как MinIO, Kafka, Pulsar и etcd. Масштабирование этих компонентов может повысить адаптивность Milvus к различным требованиям.

    + +

    Масштабирование MinIO

    Увеличение ресурсов на одну капсулу MinIO

    MinIO, система хранения объектов, используемая Milvus, может увеличить ресурсы процессора и памяти для каждого стручка.

    +
    # new-values.yaml
    +minio:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Вы также можете увеличить дисковую емкость кластера MioIO, вручную изменив значение spec.resources.requests.storage для каждого MioIO Persistent Volume Claim (PVC). Обратите внимание, что класс хранения по умолчанию должен позволять расширение тома.

    +

    Рекомендуется добавить дополнительный пул серверов MioIO для экземпляра Milvus.

    +
    # new-values.yam;
    +minio:
    +  zones: 2
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Это добавит дополнительный пул серверов в ваш кластер MinIO, что позволит Milvus записывать данные в пул серверов MinIO на основе свободного дискового пространства каждого пула серверов. Например, если группа из трех пулов имеет в общей сложности 10 ТБ свободного пространства, распределенного между пулами следующим образом:

    + + + + + + + + + +
    Свободное пространствоВозможность записи
    Пул A3 Тб30% (3/10)
    Пул B2 ТиБ20% (2/10)
    Пул C5 ТиБ50% (5/10)
    +
    +

    MinIO не производит автоматическую ребалансировку объектов в новых пулах серверов. При необходимости вы можете вручную инициировать процедуру ребалансировки с помощью mc admin rebalance.

    +
    +

    Kafka

    Увеличение ресурсов для каждого стручка брокера Kafka

    Увеличьте пропускную способность брокера Kafka, настроив ресурсы процессора и памяти для каждого пода брокера.

    +
    # new-values.yaml
    +kafka:
    +  resources:
    +     limits:
    +        cpu: 2
    +        memory: 12Gi
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Вы также можете увеличить емкость диска для кластера Kafka, вручную изменив значение spec.resources.requests.storage для каждого Kafka Persistent Volume Claim (PVC). Убедитесь, что класс хранения по умолчанию позволяет увеличить объем.

    +

    Рекомендуется добавить дополнительный пул серверов Kafka для экземпляра Milvus.

    +
    # new-values.yaml
    +kafka:
    +  replicaCount: 4
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Это добавит дополнительный брокер в ваш кластер Kafka.

    +
    +

    Kafka не производит автоматическую ребалансировку тем между всеми брокерами. При необходимости вручную перебалансируйте темы/разделы между всеми брокерами Kafka с помощью bin/kafka-reassign-partitions.sh после входа в каждый стручок брокера Kafka.

    +
    +

    Pulsar

    Pulsar разделяет вычисления и хранение. Вы можете независимо увеличивать емкость брокеров Pulsar (вычисления) и букридеров Pulsar (хранение).

    +

    Увеличение ресурсов на один брокерский подиум Pulsar

    # new-values.yaml
    +pulsar:
    +  broker:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Увеличить количество ресурсов на одну капсулу букмекера Pulsar

    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Вы также можете увеличить дисковую емкость кластера Pulsar, вручную изменив значение spec.resources.requests.storage для Persistent Volume Claim (PVC) каждого брокера Pulsar. Обратите внимание, что класс хранения по умолчанию должен допускать расширение тома.

    +

    Капсула букмекера Pulsar имеет два типа хранилища: journal и legers. Для хранилища типа journal в качестве класса хранилища следует использовать ssd или gp3. Вот пример указания класса хранилища для журнала pulsar.

    +
    pulsar:
    +  bookkeeper:
    +    volumes:
    +      journal:
    +        size: 20Gi
    +        storageClassName: gp3
    +
    +

    Добавьте дополнительный брокерский стручок Pulsar

    # new-values.yaml
    +pulsar:
    +  broker:
    +    replicaCount: 3
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    replicaCount: 3
    +
    +

    После сохранения файла примените изменения следующей командой:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    etcd

    # new-values.yaml
    +etcd:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    После сохранения файла примените изменения следующей командой:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    Добавить дополнительные etcd-подсистемы

    Общее количество etcd-подов должно быть нечетным.

    +
    # new-values.yaml
    +etcd:
    +  replicaCount: 5
    +
    +

    После сохранения файла примените изменения с помощью следующей команды:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/scaleout.json b/localization/v2.5.x/site/ru/adminGuide/scaleout.json new file mode 100644 index 000000000..c626661f6 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/scaleout.json @@ -0,0 +1 @@ +{"codeList":["NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 1m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 1m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 1m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 1m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 1m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 1m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 1m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 1m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 1m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 1m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 1m \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-czq9f 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-jcdcn 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n"],"headingContent":"Scale a Milvus Cluster","anchorList":[{"label":"Масштабирование кластера Milvus","href":"Scale-a-Milvus-Cluster","type":1,"isActive":false},{"label":"Что такое горизонтальное масштабирование?","href":"What-is-horizontal-scaling","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Масштабирование кластера Milvus","href":"Scale-a-Milvus-cluster","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/scaleout.md b/localization/v2.5.x/site/ru/adminGuide/scaleout.md new file mode 100644 index 000000000..e5b821a91 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/scaleout.md @@ -0,0 +1,183 @@ +--- +id: scaleout.md +related_key: scale Milvus cluster +summary: >- + Узнайте, как вручную или автоматически расширять и масштабировать кластер + Milvus. +title: Масштабирование кластера Milvus +--- +

    Масштабирование кластера Milvus

    Milvus поддерживает горизонтальное масштабирование своих компонентов. Это означает, что вы можете увеличивать или уменьшать количество рабочих узлов каждого типа в зависимости от ваших потребностей.

    +

    В этой теме описывается, как масштабировать и расширять кластер Milvus. Мы предполагаем, что перед масштабированием вы уже установили кластер Milvus. Кроме того, мы рекомендуем ознакомиться с архитектурой Milvus до начала работы.

    +

    В этом руководстве в качестве примера рассматривается масштабирование трех узлов запросов. Чтобы масштабировать узлы других типов, замените queryNode на соответствующий тип узла в командной строке.

    +
    +

    Информацию о том, как масштабировать кластер с помощью Milvus Operator, см. в разделе Масштабирование кластера с помощью Milvus Operator.

    +
    +

    Что такое горизонтальное масштабирование?

    Горизонтальное масштабирование включает в себя масштабирование наружу и масштабирование внутрь.

    +

    Масштабирование наружу

    Под масштабированием понимается увеличение количества узлов в кластере. В отличие от увеличения масштаба, при масштабировании не требуется выделять больше ресурсов на один узел кластера. Вместо этого масштабирование расширяет кластер по горизонтали за счет добавления новых узлов.

    +

    + + Scaleout + Scaleout

    +

    + + Scaleup + Scaleup

    +

    Согласно архитектуре Milvus, рабочие узлы без статических данных включают узел запросов, узел данных, индексный узел и прокси. Поэтому вы можете масштабировать эти типы узлов в соответствии с вашими бизнес-потребностями и сценариями работы приложений. Масштабировать кластер Milvus можно как вручную, так и автоматически.

    +

    Как правило, масштабирование созданного вами кластера Milvus требуется в случае его чрезмерной загрузки. Ниже перечислены типичные ситуации, в которых может потребоваться масштабирование кластера Milvus:

    +
      +
    • Использование процессора и памяти в течение некоторого времени остается высоким.
    • +
    • Пропускная способность запросов становится выше.
    • +
    • Требуется более высокая скорость индексирования.
    • +
    • Необходимо обрабатывать большие объемы данных.
    • +
    • Необходимо обеспечить высокую доступность сервиса Milvus.
    • +
    +

    Масштабирование внутрь

    Масштабирование означает уменьшение количества узлов в кластере. Как правило, масштабирование созданного вами кластера Milvus необходимо, если он недостаточно используется. Ниже перечислены типичные ситуации, когда необходимо масштабировать кластер Milvus:

    +
      +
    • В течение определенного периода времени процессор и память используются слабо.
    • +
    • Пропускная способность запросов становится ниже.
    • +
    • Более высокая скорость индексирования не требуется.
    • +
    • Размер обрабатываемого набора данных невелик.
    • +
    +
    +Мы не рекомендуем резко уменьшать количество рабочих узлов. Например, если в кластере пять узлов данных, мы рекомендуем сокращать по одному узлу данных за раз, чтобы обеспечить доступность сервиса. Если сервис доступен после первой попытки масштабирования, можно продолжить дальнейшее сокращение числа узлов данных.
    +

    Предварительные условия

    Запустите kubectl get pods, чтобы получить список компонентов и их рабочее состояние в созданном вами кластере Milvus.

    +
    NAME                                            READY   STATUS       RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running      0          1m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running      0          1m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running      0          1m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running      0          1m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running      0          1m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running      0          1m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running      0          1m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running      0          1m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running      0          1m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running      0          1m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running      0          1m 
    +
    +
    +Milvus поддерживает только добавление рабочих узлов и не поддерживает добавление компонентов координатора.
    +

    Масштабирование кластера Milvus

    Масштабировать кластер Milvus можно как вручную, так и автоматически. Если включено автомасштабирование, кластер Milvus будет автоматически сжиматься или расширяться, когда потребление ресурсов процессора и памяти достигнет заданного вами значения.

    +

    В настоящее время Milvus 2.1.0 поддерживает только ручное масштабирование.

    +

    Масштабирование

    Запустите helm upgrade my-release milvus/milvus --set queryNode.replicas=3 --reuse-values, чтобы вручную уменьшить масштаб узла запросов.

    +

    В случае успеха на узел запросов будут добавлены три запущенные капсулы, как показано в следующем примере.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-czq9f    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-jcdcn    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    Масштабирование внутрь

    Выполните команду helm upgrade my-release milvus/milvus --set queryNode.replicas=1 --reuse-values, чтобы увеличить масштаб узла запросов.

    +

    В случае успеха три работающих стручка на узле запросов будут уменьшены до одного, как показано в следующем примере.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/tls.json b/localization/v2.5.x/site/ru/adminGuide/tls.json new file mode 100644 index 000000000..6b4a621fc --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/tls.json @@ -0,0 +1 @@ +{"codeList":["openssl version\n","sudo apt install openssl\n","mkdir cert && cd cert\ntouch gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out ca.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# create a new ca certificate\nopenssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n","chmod +x gen.sh\n./gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n","chmod +x renew.sh\n./renew.sh\n","proxy:\n http:\n # for now milvus do not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \ntls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n tlsMode: 1\n","internaltls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n internaltlsEnabled: true \n","├── docker-compose.yml\n├── milvus.yaml\n└── tls\n ├── server.pem\n ├── server.key\n └── ca.pem\n"," standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:latest\n command: [\"milvus\", \"run\", \"standalone\"]\n security_opt:\n - seccomp:unconfined\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","sudo docker compose up -d\n","├── milvus.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost # the CommonName in your certificates\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","kubectl create -f milvus.yaml\n","├── values.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","extraConfigFiles:\n user.yaml: |+\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS\n # Configure tls certificates path for external service\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update milvus\nhelm install my-release milvus/milvus -f values.yaml\n","[...date time...] [INFO] [utils/util.go:56] [\"Internal TLS Enabled\"] [value=true]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n server_pem_path=\"path_to/server.pem\",\n server_name=\"localhost\"\n)\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n client_pem_path=\"path_to/client.pem\",\n client_key_path=\"path_to/client.key\",\n ca_pem_path=\"path_to/ca.pem\",\n server_name=\"localhost\"\n)\n","curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n","curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n"],"headingContent":"Encryption in Transit","anchorList":[{"label":"Шифрование в пути","href":"Encryption-in-Transit","type":1,"isActive":false},{"label":"Создание собственного сертификата","href":"Create-your-own-certificate","type":2,"isActive":false},{"label":"Настройка сервера Milvus с TLS","href":"Set-up-a-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"Проверка включения внутреннего TLS","href":"Verify-Internal-TLS-enabled","type":2,"isActive":false},{"label":"Connect to the Milvus server with TLS","href":"Connect-to-the-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"Подключение к RESTful-серверу Milvus с помощью TLS","href":"Connect-to-the-Milvus-RESTful-server-with-TLS","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/tls.md b/localization/v2.5.x/site/ru/adminGuide/tls.md new file mode 100644 index 000000000..2b078ab15 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/tls.md @@ -0,0 +1,449 @@ +--- +id: tls.md +title: Шифрование в пути +summary: 'Узнайте, как включить TLS-прокси в Milvus.' +--- +

    Шифрование в пути

    TLS (Transport Layer Security) - это протокол шифрования, обеспечивающий безопасность связи. Milvus proxy использует TLS для односторонней и двусторонней аутентификации.

    +

    В этой теме описывается, как включить TLS в Milvus proxy для gRPC и RESTful трафика.

    +
    +

    TLS и аутентификация пользователя - это два разных подхода к безопасности. Если вы включили аутентификацию пользователя и TLS в своей системе Milvus, вам нужно будет указать имя пользователя, пароль и путь к файлу сертификата. Информацию о том, как включить аутентификацию пользователей, см. в разделе Аутентификация доступа пользователей.

    +
    +

    Создание собственного сертификата

    Необходимые условия

    Убедитесь, что OpenSSL установлен. Если он не установлен, сначала соберите и установите OpenSSL.

    +
    openssl version
    +
    +

    Если OpenSSL не установлен. В Ubuntu его можно установить с помощью следующей команды.

    +
    sudo apt install openssl
    +
    +

    Создайте файлы

      +
    1. Создайте файл gen.sh.
    2. +
    +
    mkdir cert && cd cert
    +touch gen.sh
    +
    +
      +
    1. Скопируйте следующий скрипт в папку gen.sh.
    2. +
    +

    Необходимо настроить CommonName в файле gen.sh. CommonName означает имя сервера, которое клиент должен указать при подключении.

    +

    gen.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out ca.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# create a new ca certificate
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +
    +

    +

    Переменные в файле gen.sh имеют решающее значение для процесса создания файла запроса на подписание сертификата. Первые пять переменных - это основная информация о подписи, включая страну, штат, местоположение, организацию, подразделение организации. При настройке CommonName необходимо соблюдать осторожность, поскольку эта информация будет проверяться во время взаимодействия клиента и сервера.

    +

    Запустите файл gen.sh для создания сертификата

    Запустите файл gen.sh для создания сертификата.

    +
    chmod +x gen.sh
    +./gen.sh
    +
    +

    Будут созданы следующие семь файлов: ca.key, ca.pem, ca.srl, server.key, server.pem, client.key, client.pem.

    +

    Обязательно сохраните файлы ca.key, ca.pem, ca.srl, чтобы впоследствии обновить сертификаты. Файлы server.key и server.pem используются сервером, а файлы client.key и client.pem - клиентом.

    +

    Обновление сертификатов (необязательно)

    Если вы хотите обновить сертификаты в некоторых случаях, например, если срок их действия скоро истечет, вы можете использовать следующий скрипт.

    +

    В рабочем каталоге должны находиться файлы ca.key, ca.pem, ca.srl.

    +

    renew.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +

    +

    Запустите файл renew.sh для создания сертификата.

    +
    chmod +x renew.sh
    +./renew.sh
    +
    +

    Настройка сервера Milvus с TLS

    В этом разделе описаны шаги по настройке сервера Milvus с шифрованием TLS.

    +

    Настройка для Docker Compose

    1. Измените конфигурацию сервера Milvus

    Чтобы включить внешний TLS, добавьте следующие конфигурации в файл milvus.yaml:

    +
    proxy:
    +  http:
    +    # for now milvus do not support config restful on same port with grpc
    +    # so we set to 8080, grpc will still use 19530
    +    port: 8080 
    +tls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    tlsMode: 1
    +
    +

    Параметры:

    +
      +
    • serverPemPath: Путь к файлу сертификата сервера.
    • +
    • serverKeyPath: : Путь к файлу ключа сервера.
    • +
    • caPemPath: Путь к файлу сертификата центра сертификации.
    • +
    • tlsMode: Режим TLS для внешнего сервиса. Допустимые значения:
        +
      • 1: Односторонняя аутентификация, при которой только сервер требует сертификат, а клиент его проверяет. Для этого режима требуются server.pem и server.key со стороны сервера и server.pem со стороны клиента.
      • +
      • 2: Двусторонняя аутентификация, когда и серверу, и клиенту требуются сертификаты для установления безопасного соединения. Для этого режима требуются server.pem, server.key и ca.pem со стороны сервера и client.pem, client.key и ca.pem со стороны клиента.
      • +
    • +
    +

    Чтобы включить внутренний TLS, добавьте следующие конфигурации в файл milvus.yaml:

    +
    internaltls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    internaltlsEnabled: true 
    +
    +

    Параметры:

    +
      +
    • serverPemPath: Путь к файлу сертификата сервера.
    • +
    • serverKeyPath: : Путь к файлу ключа сервера.
    • +
    • caPemPath: Путь к файлу сертификата центра сертификации.
    • +
    • internaltlsEnabled: Включать ли внутренний TLS. На данный момент поддерживается только односторонний tls.
    • +
    +

    2. Соотнесите файлы сертификатов с контейнером

    Подготовьте файлы сертификатов

    Создайте новую папку с именем tls в том же каталоге, что и docker-compose.yaml. Скопируйте файлы server.pem, server.key и ca.pem в папку tls. Поместите их в структуру каталогов следующим образом:

    +
    ├── docker-compose.yml
    +├── milvus.yaml
    +└── tls
    +     ├── server.pem
    +     ├── server.key
    +     └── ca.pem
    +
    +

    Обновление конфигурации Docker Compose

    Отредактируйте файл docker-compose.yaml, чтобы указать пути к файлам сертификатов внутри контейнера, как показано ниже:

    +
      standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:latest
    +    command: ["milvus", "run", "standalone"]
    +    security_opt:
    +    - seccomp:unconfined
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +
    Развертывание Milvus с помощью Docker Compose

    Выполните следующую команду для развертывания Milvus:

    +
    sudo docker compose up -d
    +
    +

    Setup for Milvus Operator

    Поместите файлы сертификатов в рабочий каталог. Структура каталога должна выглядеть следующим образом:

    +
    ├── milvus.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    Создайте секрет с файлами сертификатов:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    Чтобы включить внешний TLS, добавьте следующие конфигурации в файл milvus.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    Чтобы включить внутренний TLS, добавьте следующие конфигурации в файл milvus.yaml:

    +

    Не забудьте заменить поле internaltls.sni на CommonName в ваших сертификатах.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost # the CommonName in your certificates
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    создайте Milvus CR:

    +
    kubectl create -f milvus.yaml
    +
    +

    настройка для Milvus Helm

    Поместите файлы сертификатов в рабочий каталог. Структура каталога должна выглядеть следующим образом:

    +
    ├── values.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    Создайте секрет с файлами сертификатов:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    Чтобы включить внешний TLS, добавьте следующие конфигурации в файл values.yaml:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS
    +    # Configure tls certificates path for external service
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    Чтобы включить внутренний TLS, добавьте следующие конфигурации в файл values.yaml:

    +

    Не забудьте заменить поле internaltls.sni на CommonName в ваших сертификатах.

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    Создайте выпуск milvus:

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update milvus
    +helm install my-release milvus/milvus -f values.yaml
    +
    +

    Проверка включения внутреннего TLS

    Проверить внутренний TLS напрямую довольно сложно. Вы можете проверить журнал Milvus, чтобы узнать, включен ли внутренний TLS.

    +

    В журнале Milvus вы должны увидеть следующее сообщение, если внутренний TLS включен:

    +
    [...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
    +
    +

    Connect to the Milvus server with TLS

    Для взаимодействия с SDK используйте следующие настройки в зависимости от режима TLS.

    +

    Одностороннее TLS-соединение

    Укажите путь к server.pem и убедитесь, что server_name совпадает с CommonName, указанным в сертификате.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    server_pem_path="path_to/server.pem",
    +    server_name="localhost"
    +)
    +
    +

    Двустороннее TLS-соединение

    Укажите пути к client.pem, client.key и ca.pem и убедитесь, что server_name соответствует CommonName, указанному в сертификате.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    client_pem_path="path_to/client.pem",
    +    client_key_path="path_to/client.key",
    +    ca_pem_path="path_to/ca.pem",
    +    server_name="localhost"
    +)
    +
    +

    Дополнительные сведения см. в файлах example_tls1.py и example_tls2.py.

    +

    Подключение к RESTful-серверу Milvus с помощью TLS

    Для RESTful API можно проверить TLS с помощью команды curl.

    +

    Одностороннее TLS-соединение

    curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    +

    Двустороннее TLS-соединение

    curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.json b/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.json new file mode 100644 index 000000000..642cf29aa --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.json @@ -0,0 +1 @@ +{"codeList":["kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​\n","[1] 8116​\nForwarding from 127.0.0.1:9091 -> 9091​\n\n","pid=8116​\n\n","curl 127.0.0.1:9091/api/v1/collections \\​\n|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\\​\n|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \\​\n> flushing_segments.json​\ncat flushing_segments.json​\n\n","{​\n \"segmentIDs\": [​\n 454097953998181000,​\n 454097953999383600,​\n 454097953998180800​\n ]​\n}​\n\n","cat flushing_segments.json| curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​\n\n","{\"status\":{},\"flushed\":true}​\n\n","kill $pid​\n\n","[1] + 8116 terminated kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 ​\n\n","helm -n default get values my-release -o yaml > values.yaml​\ncat values.yaml​\n\n","helm -n default uninstall my-release​\n\n","These resources were kept due to the resource policy:​\n[PersistentVolumeClaim] my-release-minio​\n​\nrelease \"my-release\" uninstalled​\n\n","kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​\nkubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​\necho \"Volume Claims:\"​\ncat pulsar-pvcs.txt​\necho \"Volumes:\"​\ncat pulsar-pvs.txt​\n\n","Volume Claims:​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​\nmy-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​\nVolumes:​\npvc-f590a4de-df31-4ca8-a424-007eac3c619a​\npvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​\npvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​\npvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​\npvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​\n\n","cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","persistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0\" deleted​\n\n","cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","Error from server (NotFound): persistentvolumeclaims \"pvc-f590a4de-df31-4ca8-a424-007eac3c619a\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a\" not found​\n\n","kubectl -n default get milvus my-release -o yaml > milvus.yaml​\nhead milvus.yaml -n 20​\n\n","apiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations:​\n milvus.io/dependency-values-merged: \"true\"​\n milvus.io/pod-service-label-added: \"true\"​\n milvus.io/querynode-current-group-id: \"0\"​\n creationTimestamp: \"2024-11-22T08:06:59Z\"​\n finalizers:​\n - milvus.milvus.io/finalizer​\n generation: 3​\n labels:​\n app: milvus​\n milvus.io/operator-version: 1.1.2​\nname: my-release​\nnamespace: default​\nresourceVersion: \"692217324\"​\nuid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​\nspec:​\n components:​\n\n","# a patch to retain etcd & storage data and delete pulsar data while delete milvus​\nspec:​\n dependencies:​\n etcd:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n storage:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n pulsar:​\n inCluster:​\n deletionPolicy: Delete​\n pvcDeletion: true​\n\n","kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​\n\n","milvus.milvus.io/my-release patched​\n\n","kubectl -n default delete milvus my-release --wait=false​\nkubectl -n default get milvus my-release​\nkubectl -n default delete milvus my-release --wait=true​\n\n","milvus.milvus.io \"my-release\" deleted​\nNAME MODE STATUS UPDATED AGE​\nmy-release cluster Deleting True 41m​\nmilvus.milvus.io \"my-release\" deleted​\n\n","kubectl -n default get milvus my-release​\n\n","No resources found in default namespace.​\n\n","# change the following:​\npulsar:​\n enabled: false # set to false​\n # you may also clean up rest fields under pulsar field​\n # it's ok to keep them though.​\npulsarv3:​\n enabled: true​\n # append other values for pulsar v3 chart if needs​\n\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm​\nhelm repo update zilliztech​\n\n","\"zilliztech\" already exists with the same configuration, skipping​\nHang tight while we grab the latest from your chart repositories...​\n...Successfully got an update from the \"zilliztech\" chart repository​\nUpdate Complete. ⎈Happy Helming!⎈​\n\n","helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​\n\n","NAME: my-release​\nLAST DEPLOYED: Fri Nov 22 15:31:27 2024​\nNAMESPACE: default​\nSTATUS: deployed​\nREVISION: 1​\nTEST SUITE: None​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 4m3s​\nmy-release-milvus-datanode-56487bc4bc-s6mbd 1/1 Running 0 4m5s​\nmy-release-milvus-indexnode-6476894d6-rv85d 1/1 Running 0 4m5s​\nmy-release-milvus-mixcoord-6d8875cb9c-67fcq 1/1 Running 0 4m4s​\nmy-release-milvus-proxy-7bc45d57c5-2qf8m 1/1 Running 0 4m4s​\nmy-release-milvus-querynode-77465747b-kt7f4 1/1 Running 0 4m4s​\nmy-release-minio-684ff4f5df-pnc97 1/1 Running 0 4m5s​\nmy-release-pulsarv3-bookie-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-1 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-2 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-init-6z4tk 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-broker-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-broker-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-pulsar-init-wvqpc 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-recovery-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-zookeeper-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-2 1/1 Running 0 4m2s​\n\n","# change the followings fields:​\napiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations: null # this field should be removed or set to null​\n resourceVersion: null # this field should be removed or set to null​\n uid: null # this field should be removed or set to null​\nspec:​\n dependencies:​\n pulsar:​\n inCluster:​\n chartVersion: pulsar-v3​\n # delete all previous values for pulsar v2 and set it to null.​\n # you may add additional values here for pulsar v3 if you're sure about it.​\n values: null​\n\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​\nhelm repo update milvus-operator​\nhelm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​\n\n","kubectl create -f milvus.yaml​\n\n","milvus.milvus.io/my-release created​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 65m​\nmy-release-milvus-datanode-57fd59ff58-5mdrk 1/1 Running 0 93s​\nmy-release-milvus-indexnode-67867c6b9b-4wsbw 1/1 Running 0 93s​\nmy-release-milvus-mixcoord-797849f9bb-sf8z5 1/1 Running 0 93s​\nmy-release-milvus-proxy-5d5bf98445-c55m6 1/1 Running 0 93s​\nmy-release-milvus-querynode-0-64797f5c9-lw4rh 1/1 Running 0 92s​\nmy-release-minio-79476ccb49-zvt2h 1/1 Running 0 65m​\nmy-release-pulsar-bookie-0 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-1 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-2 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-init-v8fdj 0/1 Completed 0 5m11s​\nmy-release-pulsar-broker-0 1/1 Running 0 5m11s​\nmy-release-pulsar-broker-1 1/1 Running 0 5m10s​\nmy-release-pulsar-proxy-0 1/1 Running 0 5m11s​\nmy-release-pulsar-proxy-1 1/1 Running 0 5m10s​\nmy-release-pulsar-pulsar-init-5lhx7 0/1 Completed 0 5m11s​\nmy-release-pulsar-recovery-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-1 1/1 Running 0 5m10s​\nmy-release-pulsar-zookeeper-2 1/1 Running 0 5m10s​\n\n"],"headingContent":"Upgrading Pulsar ​","anchorList":[{"label":"Обновление Pulsar","href":"Upgrading-Pulsar-​","type":1,"isActive":false},{"label":"Дорожная карта","href":"Roadmap","type":2,"isActive":false},{"label":"Процедуры","href":"Procedures","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.md b/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.md new file mode 100644 index 000000000..ef9cdad11 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade-pulsar-v3.md @@ -0,0 +1,427 @@ +--- +id: upgrade-pulsar-v3.md +related_key: upgrade pulsar v3 +summary: >- + Узнайте, как обновить Pulsar с V2 до V3 в Milvus, чтобы вы могли использовать + последнюю версию Milvus v2.5.x. +title: Улучшите Пульсар в Мильвусе с V2 до V3 +--- +

    Обновление Pulsar

    В этой статье описывается процедура обновления компонента Pulsar с V2 до V3, если у вас уже есть рабочее развертывание Milvus с Pulsar V2.

    +

    Начиная с Milvus v2.5, milvus-helm и milvus-operator будут использовать Pulsar V3 по умолчанию, чтобы исправить некоторые ошибки и уязвимости безопасности. Хотя Milvus 2.5 совместим с Pulsar 2.x, обновление до Pulsar V3 необязательно. Для повышения стабильности и производительности мы рекомендуем обновиться до Pulsar V3.

    +

    Если вы предпочитаете использовать Pulsar V2 с Milvus v2.5.x, читайте раздел Использование Pulsar V2 с Milvus v2.5.x.

    +
    +
      +
    1. Процесс обновления требует кратковременного отключения сервиса (обычно занимает от нескольких минут до более чем десяти минут, в зависимости от объема данных).

    2. +
    3. Перед операцией необходимо остановить запись данных в Milvus всеми запущенными клиентами. В противном случае записанные данные могут быть потеряны.

    4. +
    5. В этой статье предполагается, что Milvus установлен в пространстве имен default и имеет имя my-release. Пожалуйста, измените параметры на свои пространство имен и имя релиза при выполнении команд, скопированных с этой страницы.

    6. +
    7. Убедитесь, что ваша рабочая среда имеет права на вышеупомянутое пространство имен в кластере Kubernetes и что установлены следующие команды.

      +

      a. kubectl >= 1.20

      +

      b. helm >= 3.14.0

      +

      c. cat, grep, awk для операций манипулирования строками

      +

      d. curl или Attu v2.4+ для взаимодействия с API управления milvus.

    8. +
    +
    +

    Дорожная карта

    Процесс обновления включает следующие шаги:

    +
      +
    1. Сохраните данные, не потребляемые в pulsar.

    2. +
    3. Остановите Milvus и удалите pulsar V2.

    4. +
    5. Запустите Pulsar V3 и Milvus.

    6. +
    +

    Процедуры

    В этом разделе подробно описаны процедуры обновления Pulsar с V2 до V3 в Milvus.

    +

    Сохранение данных, не использованных в Pulsar

    На этом этапе необходимо убедиться, что существующие данные в Pulsar были сохранены в службе хранения объектов. Существует два подхода, и вы можете выбрать тот, который соответствует вашим потребностям.

    +

    Подход 1: использование Attu

    Если в вашем рабочем развертывании Milvus имеется лишь небольшое количество коллекций с небольшим количеством сегментов, вы можете использовать Attu для сохранения данных в службе хранения объектов.

    +
      +
    1. Выберите все коллекции во всех базах данных, перейдите на панель Segments, нажмите кнопку Flush.

      +

      + + Segment panel of a collection + Панель сегментов коллекции

    2. +
    3. Затем во всплывающем окне снова нажмите кнопку Flush.

      +

      + + Data flush prompt in Attu + Запрос на промывку данных в Attu

    4. +
    5. Затем подождите, пока все состояния постоянных сегментов коллекций не станут Flushed.

      +

      + + View data flush status in Attu + Просмотр состояния промывки данных в Attu

    6. +
    +

    Подход 2: Использование API управления

      +
    1. Проксируйте порт 9091 прокси-сервера Milvus на локальный хост для последующих операций.

      +
      kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​
      +
      +

      Выход.

      +
      [1] 8116​
      +Forwarding from 127.0.0.1:9091 -> 9091​
      +
      +
    2. +
    3. Сохранить Pid для последующей очистки.

      +
      pid=8116​
      +
      +
    4. +
    5. Запустить действие по сохранению всех вставленных данных из Pulsar в Ojbect Storage.

      +
      curl 127.0.0.1:9091/api/v1/collections \​
      +|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\​
      +|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \​
      +> flushing_segments.json​
      +cat flushing_segments.json​
      +
      +
      +

      Выход.

      +
      {​
      +  "segmentIDs": [​
      +    454097953998181000,​
      +    454097953999383600,​
      +    454097953998180800​
      +  ]​
      +}​
      +
      +
    6. +
    7. Проверить все сегменты (All segments flushed).

      +
      cat flushing_segments.json|  curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​
      +
      +
      +

      По окончании вы должны увидеть следующее сообщение

      +
      {"status":{},"flushed":true}​
      +
      +
    8. +
    9. Остановите фоновый процесс kubectl port-forward.

      +
      kill $pid​
      +
      +
      +

      Выходные данные.

      +
      [1]  + 8116 terminated  kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091                      ​
      +
      +
    10. +
    +

    Остановка Milvus и удаление Pulsar V2

    На этом шаге вам нужно остановить Milvus pod и удалить развертывание Pulsar V2. Здесь есть два отдельных раздела:

    + +

    Удаление Pulsar V2 с помощью Helm

    Если вы установили Milvus с помощью диаграммы Milvus Helm, выполните следующие действия, чтобы остановить Milvus pod и удалить развертывание Pulsar V2.

    +
      +
    1. Сохраните текущие значения релиза Milvus на values.yaml для последующего восстановления.

      +
      helm -n default get values my-release -o yaml > values.yaml​
      +cat values.yaml​
      +
      +
    2. +
    3. Используйте команду для остановки Milvus и всех зависимостей. Не беспокойтесь о томах данных, они будут сохранены по умолчанию.

      +
      helm -n default uninstall my-release​
      +
      +
      +

      Выход

      +
      These resources were kept due to the resource policy:​
      +[PersistentVolumeClaim] my-release-minio​
      +​
      +release "my-release" uninstalled​
      +
      +
    4. +
    5. Список pulsar PVCs & PVs (Persistent Volume Claims & Persistent Volume) должен быть очищен

      +
      kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​
      +kubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​
      +echo "Volume Claims:"​
      +cat pulsar-pvcs.txt​
      +echo "Volumes:"​
      +cat pulsar-pvs.txt​
      +
      +
      +

      Выход

      +
      Volume Claims:​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​
      +my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​
      +Volumes:​
      +pvc-f590a4de-df31-4ca8-a424-007eac3c619a​
      +pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​
      +pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​
      +pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​
      +pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​
      +
      +
    6. +
    7. Проверьте, все ли PVC в списке pulsar-pvcs.txt предназначены для Pulsar. Убедившись, что ошибки нет, удалите PVC.

      +
      cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      Выход.

      +
      persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0" deleted​
      +
      +
    8. +
    9. (Необязательно) В зависимости от класса хранилища, предоставляющего PVC, вам может потребоваться вручную удалить PV.

      +
      cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      Ничего страшного, если он выдает ошибку NotFound. Он уже удален контроллерами kubernetes.

      +
      Error from server (NotFound): persistentvolumeclaims "pvc-f590a4de-df31-4ca8-a424-007eac3c619a" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a" not found​
      +
      +
    10. +
    +

    Удаление Pulsar V2 с помощью Milvus Operator

    Если вы установили Milvus с помощью Milvus Operator, выполните следующие шаги, чтобы остановить Milvus pod и удалить развертывание Pulsar V2.

    +
      +
    1. Сохраните текущий манифест Milvus на milvus.yaml для последующего использования.

      +
      kubectl -n default get milvus my-release -o yaml > milvus.yaml​
      +head milvus.yaml -n 20​
      +
      +
      +

      Выход.

      +
      apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations:​
      +    milvus.io/dependency-values-merged: "true"​
      +    milvus.io/pod-service-label-added: "true"​
      +    milvus.io/querynode-current-group-id: "0"​
      +  creationTimestamp: "2024-11-22T08:06:59Z"​
      +  finalizers:​
      +  - milvus.milvus.io/finalizer​
      +  generation: 3​
      +  labels:​
      +    app: milvus​
      +    milvus.io/operator-version: 1.1.2​
      +name: my-release​
      +namespace: default​
      +resourceVersion: "692217324"​
      +uid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​
      +spec:​
      +  components:​
      +
      +
    2. +
    3. Создайте файл patch.yaml со следующим содержимым.

      +
      # a patch to retain etcd & storage data and delete pulsar data while delete milvus​
      +spec:​
      +  dependencies:​
      +    etcd:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    storage:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    pulsar:​
      +      inCluster:​
      +        deletionPolicy: Delete​
      +        pvcDeletion: true​
      +
      +
    4. +
    5. Используйте kubectl patch для сохранения данных etcd и хранилища и удаления данных pulsar при удалении milvus.

      +
      kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​
      +
      +
      +

      Выход.

      +
      milvus.milvus.io/my-release patched​
      +
      +
    6. +
    7. Остановите Milvus и удалите данные пульсара V2. Не беспокойтесь о томах данных etcd и объектного хранилища, они будут сохранены по умолчанию.

      +
      kubectl -n default delete milvus my-release --wait=false​
      +kubectl -n default get milvus my-release​
      +kubectl -n default delete milvus my-release --wait=true​
      +
      +
      +

      Выход: Обратите внимание, что на изящную остановку milvus и удаление томов pulsar оператором может уйти несколько минут.

      +
      milvus.milvus.io "my-release" deleted​
      +NAME         MODE      STATUS     UPDATED   AGE​
      +my-release   cluster   Deleting   True      41m​
      +milvus.milvus.io "my-release" deleted​
      +
      +
      +

      Дождитесь окончания выполнения команды.

    8. +
    9. Проверьте еще раз, чтобы убедиться, что ресурс Milvus исчез.

      +
      kubectl -n default get milvus my-release​
      +
      +
      +

      Вывод должен быть таким.

      +
      No resources found in default namespace.​
      +
      +
    10. +
    +

    Запуск Pulsar V3 и Milvus

    На этом шаге необходимо запустить капсулы Pulsar V3 и Milvus. Здесь есть два отдельных раздела:

    +
      +
    • Для пользователя Helm

      +

      Если вы установили Milvus с помощью схемы Milvus Helm, перейдите к разделу For Helm User.

    • +
    • Для пользователей Milvus Operator

      +

      Если вы установили Milvus с помощью Milvus Operator, перейдите к разделу Для пользователей Milvus Operator.

    • +
    +

    Запустите Pulsar V3 и используйте Helm

      +
    1. Отредактируйте values.yaml, сохраненный на предыдущем шаге.

      +
      # change the following:​
      +pulsar:​
      +  enabled: false # set to false​
      +  # you may also clean up rest fields under pulsar field​
      +  # it's ok to keep them though.​
      +pulsarv3:​
      +  enabled: true​
      +  # append other values for pulsar v3 chart if needs​
      +
      +
    2. +
    3. Обновите локальное репо Helm

      +
      helm repo add zilliztech https://zilliztech.github.io/milvus-helm​
      +helm repo update zilliztech​
      +
      +
      +

      Выведите .

      +
      "zilliztech" already exists with the same configuration, skipping​
      +Hang tight while we grab the latest from your chart repositories...​
      +...Successfully got an update from the "zilliztech" chart repository​
      +Update Complete. ⎈Happy Helming!⎈​
      +
      +
    4. +
    5. Установите релиз milvus с новейшей версией карты helm, используя отредактированный values.yaml.

      +
      helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​
      +
      +
      +

      Выход

      +
      NAME: my-release​
      +LAST DEPLOYED: Fri Nov 22 15:31:27 2024​
      +NAMESPACE: default​
      +STATUS: deployed​
      +REVISION: 1​
      +TEST SUITE: None​
      +
      +
    6. +
    7. Проверьте стручки, чтобы убедиться, что все они были запланированы и запущены с помощью kubectl -n default get pods.

      +

      Может потребоваться несколько минут, чтобы все капсулы запустились.

      +

      Выходные данные выглядят следующим образом.

      +
      NAME                                          READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                             1/1     Running     0          4m3s​
      +my-release-milvus-datanode-56487bc4bc-s6mbd   1/1     Running     0          4m5s​
      +my-release-milvus-indexnode-6476894d6-rv85d   1/1     Running     0          4m5s​
      +my-release-milvus-mixcoord-6d8875cb9c-67fcq   1/1     Running     0          4m4s​
      +my-release-milvus-proxy-7bc45d57c5-2qf8m      1/1     Running     0          4m4s​
      +my-release-milvus-querynode-77465747b-kt7f4   1/1     Running     0          4m4s​
      +my-release-minio-684ff4f5df-pnc97             1/1     Running     0          4m5s​
      +my-release-pulsarv3-bookie-0                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-1                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-2                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-init-6z4tk         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-broker-0                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-broker-1                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-0                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-1                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-pulsar-init-wvqpc         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-recovery-0                1/1     Running     0          4m3s​
      +my-release-pulsarv3-zookeeper-0               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-1               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-2               1/1     Running     0          4m2s​
      +
      +
    8. +
    +

    Запуск Pulsar V3 и использование Milvus Operator

      +
    1. Отредактируйте файл milvus.yaml, сохраненный на предыдущем шаге.

      +
      # change the followings fields:​
      +apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations: null # this field should be removed or set to null​
      +  resourceVersion: null # this field should be removed or set to null​
      +  uid: null # this field should be removed or set to null​
      +spec:​
      +  dependencies:​
      +    pulsar:​
      +      inCluster:​
      +        chartVersion: pulsar-v3​
      +        # delete all previous values for pulsar v2 and set it to null.​
      +        # you may add additional values here for pulsar v3 if you're sure about it.​
      +        values: null​
      +
      +
    2. +
    3. Убедитесь, что ваш Milvus Operator обновлен до версии v1.1.2 или более поздней.

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​
      +helm repo update milvus-operator​
      +helm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​
      +
      +
      +

      Используйте команду для запуска milvus с помощью pulsar v3

      +
      kubectl create -f milvus.yaml​
      +
      +
      +

      Выведите

      +
      milvus.milvus.io/my-release created​
      +
      +
    4. +
    5. Проверьте, все ли капсулы были запланированы и запущены с помощью kubectl -n default get pods.

      +

      Запуск всех стручков может занять несколько минут.

      +

      Выходные данные выглядят следующим образом.

      +
      NAME                                            READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                               1/1     Running     0          65m​
      +my-release-milvus-datanode-57fd59ff58-5mdrk     1/1     Running     0          93s​
      +my-release-milvus-indexnode-67867c6b9b-4wsbw    1/1     Running     0          93s​
      +my-release-milvus-mixcoord-797849f9bb-sf8z5     1/1     Running     0          93s​
      +my-release-milvus-proxy-5d5bf98445-c55m6        1/1     Running     0          93s​
      +my-release-milvus-querynode-0-64797f5c9-lw4rh   1/1     Running     0          92s​
      +my-release-minio-79476ccb49-zvt2h               1/1     Running     0          65m​
      +my-release-pulsar-bookie-0                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-2                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-init-v8fdj             0/1     Completed   0          5m11s​
      +my-release-pulsar-broker-0                      1/1     Running     0          5m11s​
      +my-release-pulsar-broker-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-proxy-0                       1/1     Running     0          5m11s​
      +my-release-pulsar-proxy-1                       1/1     Running     0          5m10s​
      +my-release-pulsar-pulsar-init-5lhx7             0/1     Completed   0          5m11s​
      +my-release-pulsar-recovery-0                    1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-0                   1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-1                   1/1     Running     0          5m10s​
      +my-release-pulsar-zookeeper-2                   1/1     Running     0          5m10s​
      +
      +
    6. +
    +

    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.json new file mode 100644 index 000000000..3ae5b10fe --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nrootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.5.3\n...\nproxy:\n container_name: milvus-proxy\n image: milvusdb/milvus:v2.5.3\n...\nquerycoord:\n container_name: milvus-querycoord\n image: milvusdb/milvus:v2.5.3 \n...\nquerynode:\n container_name: milvus-querynode\n image: milvusdb/milvus:v2.5.3\n...\nindexcoord:\n container_name: milvus-indexcoord\n image: milvusdb/milvus:v2.5.3\n...\nindexnode:\n container_name: milvus-indexnode\n image: milvusdb/milvus:v2.5.3 \n...\ndatacoord:\n container_name: milvus-datacoord\n image: milvusdb/milvus:v2.5.3 \n...\ndatanode:\n container_name: milvus-datanode\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","Update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Cluster with Docker Compose","anchorList":[{"label":"Обновление кластера Milvus с помощью Docker Compose","href":"Upgrade-Milvus-Cluster-with-Docker-Compose","type":1,"isActive":false},{"label":"Обновление Milvus путем изменения его образа","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.md new file mode 100644 index 000000000..fa881d56f --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-docker.md @@ -0,0 +1,154 @@ +--- +id: upgrade_milvus_cluster-docker.md +summary: 'Узнайте, как обновить кластер Milvus с помощью Docker Compose.' +title: Обновление кластера Milvus с помощью Docker Compose +--- + +

    Обновление кластера Milvus с помощью Docker Compose

    В этой теме описывается, как обновить Milvus с помощью Docker Compose.

    +

    В обычных случаях вы можете обновить Milvus, изменив его образ. Однако перед обновлением с версии 2.1.x до версии 2.5.3 необходимо перенести метаданные.

    +

    Обновление Milvus путем изменения его образа

    В обычных случаях вы можете обновить Milvus следующим образом:

    +
      +
    1. Измените теги изображения Milvus в docker-compose.yaml.

      +

      Обратите внимание, что вам нужно изменить теги образов для прокси, всех координаторов и всех рабочих узлов.

      +
      ...
      +rootcoord:
      +  container_name: milvus-rootcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +proxy:
      +  container_name: milvus-proxy
      +  image: milvusdb/milvus:v2.5.3
      +...
      +querycoord:
      +  container_name: milvus-querycoord
      +  image: milvusdb/milvus:v2.5.3  
      +...
      +querynode:
      +  container_name: milvus-querynode
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexcoord:
      +  container_name: milvus-indexcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexnode:
      +  container_name: milvus-indexnode
      +  image: milvusdb/milvus:v2.5.3 
      +...
      +datacoord:
      +  container_name: milvus-datacoord
      +  image: milvusdb/milvus:v2.5.3   
      +...
      +datanode:
      +  container_name: milvus-datanode
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. Для выполнения обновления выполните следующие команды.

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    Перенос метаданных

      +
    1. Остановите все компоненты Milvus.

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. Подготовьте конфигурационный файл migrate.yaml для миграции метаданных.

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. Запустите контейнер миграции.

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. Снова запустите компоненты Milvus с новым образом Milvus.

      +
      Update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.json new file mode 100644 index 000000000..6c6781001 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update zilliztech\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update zilliztech\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nnew-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4 \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 21m\nmy-release-etcd-1 1/1 Running 0 21m\nmy-release-etcd-2 1/1 Running 0 21m\nmy-release-milvus-datacoord-664c58798d-fl75s 1/1 Running 0 21m\nmy-release-milvus-datanode-5f75686c55-xfg2r 1/1 Running 0 21m\nmy-release-milvus-indexcoord-5f98b97589-2l48r 1/1 Running 0 21m\nmy-release-milvus-indexnode-857b4ddf98-vmd75 1/1 Running 0 21m\nmy-release-milvus-proxy-6c548f787f-scspp 1/1 Running 0 21m\nmy-release-milvus-querycoord-c454f44cd-dwmwq 1/1 Running 0 21m\nmy-release-milvus-querynode-76bb4946d-lbrz6 1/1 Running 0 21m\nmy-release-milvus-rootcoord-7764c5b686-62msm 1/1 Running 0 21m\nmy-release-minio-0 1/1 Running 0 21m\nmy-release-minio-1 1/1 Running 0 21m\nmy-release-minio-2 1/1 Running 0 21m\nmy-release-minio-3 1/1 Running 0 21m\nmy-release-pulsar-bookie-0 1/1 Running 0 21m\nmy-release-pulsar-bookie-1 1/1 Running 0 21m\nmy-release-pulsar-bookie-2 1/1 Running 0 21m\nmy-release-pulsar-bookie-init-tjxpj 0/1 Completed 0 21m\nmy-release-pulsar-broker-0 1/1 Running 0 21m\nmy-release-pulsar-proxy-0 1/1 Running 0 21m\nmy-release-pulsar-pulsar-init-c8vvc 0/1 Completed 0 21m\nmy-release-pulsar-recovery-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 20m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 20m\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0\n"],"headingContent":"Upgrade Milvus Cluster with Helm Chart","anchorList":[{"label":"Обновление кластера Milvus с помощью диаграмм Helm","href":"Upgrade-Milvus-Cluster-with-Helm-Chart","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Проверка диаграммы Milvus Helm","href":"Check-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"Проведение скользящего обновления","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Обновление Milvus с помощью Helm","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.md new file mode 100644 index 000000000..9afeb9f5f --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-helm.md @@ -0,0 +1,281 @@ +--- +id: upgrade_milvus_cluster-helm.md +label: Helm +order: 1 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: 'Узнайте, как обновить кластер Milvus с помощью Helm Chart.' +title: Обновление кластера Milvus с помощью диаграмм Helm +--- + +

    Обновление кластера Milvus с помощью диаграмм Helm

    В этом руководстве описано, как обновить кластер Milvus с помощью диаграмм Milvus Helm.

    +

    Необходимые условия

      +
    • Версия Helm >= 3.14.0
    • +
    • Версия Kubernetes >= 1.20.0
    • +
    +
    +

    Начиная с версии Milvus-Helm chart 4.2.21, мы ввели зависимость от графика pulsar-v3.x. Для обратной совместимости, пожалуйста, обновите ваш helm до версии 3.14 или более поздней, и не забудьте добавить опцию --reset-then-reuse-values при каждом использовании helm upgrade.

    +
    +

    Проверка диаграммы Milvus Helm

    Выполните следующие команды для проверки новых версий Milvus.

    +
    $ helm repo update zilliztech
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    Репозиторий Milvus Helm Charts по адресу https://milvus-io.github.io/milvus-helm/ был заархивирован, и вы можете получать дальнейшие обновления с https://zilliztech.github.io/milvus-helm/ следующим образом:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    Архивное хранилище по-прежнему доступно для диаграмм до версии 4.0.31. Для более поздних выпусков используйте новое репо.

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    Вы можете выбрать путь обновления для своего Milvus следующим образом:

    +
    - [Провести скользящее обновление](#conduct-a-rolling-upgrade) с Milvus v2.2.3 и более поздних выпусков до v2.5.3.
    + +
    +

    Проведение скользящего обновления

    Начиная с Milvus 2.2.3, вы можете настроить координаторы Milvus на работу в режиме активного ожидания и включить для них функцию скользящего обновления, чтобы Milvus мог отвечать на входящие запросы во время обновления координаторов. В предыдущих выпусках координаторы должны были удаляться, а затем создаваться во время обновления, что могло привести к некоторому простою службы.

    +

    Скользящие обновления требуют, чтобы координаторы работали в режиме активного ожидания. Вы можете использовать предоставленный нами сценарий для настройки координаторов на работу в режиме активного резерва и запуска скользящего обновления.

    +

    Основываясь на возможностях скользящего обновления, предоставляемых Kubernetes, приведенный выше сценарий обеспечивает упорядоченное обновление развертываний в соответствии с их зависимостями. Кроме того, Milvus реализует механизм, гарантирующий, что его компоненты останутся совместимыми с теми, которые зависят от них во время обновления, что значительно сокращает потенциальное время простоя сервисов.

    +

    Этот сценарий применяется только для обновления Milvus, установленного вместе с Helm. В следующей таблице перечислены флаги команд, доступные в сценариях.

    + + + + + + + + + + + +
    ПараметрыОписаниеЗначение по умолчаниюТребуется
    iИмя экземпляра MilvusNoneTrue
    nПространство имен, в котором установлен MilvusdefaultЛожь
    tЦелевая версия MilvusNoneTrue
    wНовый тег изображения Milvusmilvusdb/milvus:v2.2.3True
    oОперацияupdateЛожь
    +

    После того как вы убедились, что все развертывания в экземпляре Milvus находятся в нормальном состоянии. Вы можете выполнить следующую команду для обновления экземпляра Milvus до версии 2.5.3.

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. Сценарий жестко кодирует порядок обновления развертываний и не может быть изменен.
    2. +
    3. Сценарий использует kubectl patch для обновления развертываний и kubectl rollout status для отслеживания их состояния.
    4. +
    5. Скрипт использует kubectl patch для обновления метки app.kubernetes.io/version развертываний на метку, указанную после флага -t в команде.
    6. +
    +
    +
    +

    Обновление Milvus с помощью Helm

    Чтобы обновить Milvus с минорного выпуска до v2.2.3 до последней версии, выполните следующие команды:

    +
    helm repo update zilliztech
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    Используйте версию диаграммы Helm в предыдущей команде. Подробнее о том, как получить версию диаграммы Helm, см. в разделе Проверка версии Milvus.

    +

    Перенос метаданных

    Начиная с Milvus 2.2.0, метаданные несовместимы с метаданными предыдущих выпусков. Следующие примеры фрагментов предполагают обновление с Milvus 2.1.4 до Milvus 2.2.0.

    +

    1. Проверьте версию Milvus

    Запустите $ helm list, чтобы проверить версию приложения Milvus. Вы можете видеть, что APP VERSION - это 2.1.4.

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION    
    +new-release         default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4 
    +
    +

    2. Проверьте запущенные подсистемы

    Запустите $ kubectl get pods, чтобы проверить запущенные подсистемы. Вы можете увидеть следующий результат.

    +
    NAME                                             READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          21m
    +my-release-etcd-1                               1/1     Running     0          21m
    +my-release-etcd-2                               1/1     Running     0          21m
    +my-release-milvus-datacoord-664c58798d-fl75s    1/1     Running     0          21m
    +my-release-milvus-datanode-5f75686c55-xfg2r     1/1     Running     0          21m
    +my-release-milvus-indexcoord-5f98b97589-2l48r   1/1     Running     0          21m
    +my-release-milvus-indexnode-857b4ddf98-vmd75    1/1     Running     0          21m
    +my-release-milvus-proxy-6c548f787f-scspp        1/1     Running     0          21m
    +my-release-milvus-querycoord-c454f44cd-dwmwq    1/1     Running     0          21m
    +my-release-milvus-querynode-76bb4946d-lbrz6     1/1     Running     0          21m
    +my-release-milvus-rootcoord-7764c5b686-62msm    1/1     Running     0          21m
    +my-release-minio-0                              1/1     Running     0          21m
    +my-release-minio-1                              1/1     Running     0          21m
    +my-release-minio-2                              1/1     Running     0          21m
    +my-release-minio-3                              1/1     Running     0          21m
    +my-release-pulsar-bookie-0                      1/1     Running     0          21m
    +my-release-pulsar-bookie-1                      1/1     Running     0          21m
    +my-release-pulsar-bookie-2                      1/1     Running     0          21m
    +my-release-pulsar-bookie-init-tjxpj             0/1     Completed   0          21m
    +my-release-pulsar-broker-0                      1/1     Running     0          21m
    +my-release-pulsar-proxy-0                       1/1     Running     0          21m
    +my-release-pulsar-pulsar-init-c8vvc             0/1     Completed   0          21m
    +my-release-pulsar-recovery-0                    1/1     Running     0          21m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          21m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          20m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          20m
    +
    +

    3. Проверьте тег изображения

    Проверьте тег образа для стручка my-release-milvus-proxy-6c548f787f-scspp. Вы можете увидеть, что релиз вашего кластера Milvus - v2.1.4.

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4. Перенесите метаданные

    Основным изменением в Milvus 2.2 является структура метаданных сегментных индексов. Поэтому при обновлении Milvus с v2.1.x до v2.2.0 необходимо использовать Helm для миграции метаданных. Ниже приведен сценарий для безопасной миграции метаданных.

    +

    Этот сценарий применим только к Milvus, установленному на кластере K8s. Если в процессе произойдет ошибка, сначала откатитесь к предыдущей версии с помощью операции отката.

    +

    В следующей таблице перечислены операции, которые можно выполнить для миграции метаданных.

    + + + + + + + + + + + + + + + + + +
    ПараметрыОписаниеЗначение по умолчаниюТребуется
    iИмя экземпляра Milvus.NoneTrue
    nПространство имен, в котором установлен Milvus.defaultFalse
    sИсходная версия Milvus.NoneTrue
    tЦелевая версия Milvus.NoneTrue
    rКорневой путь метафайла Milvus.by-devFalse
    wНовый тег изображения Milvus.milvusdb/milvus:v2.2.0False
    mТег изображения миграции мета.milvusdb/meta-migration:v2.2.0False
    oОперация мета-миграции.migrateFalse
    dУдалять ли капсулу миграции после завершения миграции.falseЛожь
    cКласс хранения для pvc мета-миграции.default storage classFalse
    eЭнпоинт etcd, используемый milvus.etcd svc installed with milvusFalse
    +

    1. Миграция метаданных

      +
    1. Загрузите сценарий миграции.
    2. +
    3. Остановите компоненты Milvus. Любой живой сеанс в Milvus etcd может привести к сбою миграции.
    4. +
    5. Создайте резервную копию метаданных Milvus.
    6. +
    7. Перенесите метаданные Milvus.
    8. +
    9. Запустите компоненты Milvus с новым образом.
    10. +
    +

    2. Обновление Milvus с версии 2.1.x до 2.2.0

    Следующие команды предполагают, что вы обновляете Milvus с v2.1.4 до 2.2.0. Измените их на версии, соответствующие вашим потребностям.

    +
      +
    1. Укажите имя экземпляра Milvus, исходную версию Milvus и целевую версию Milvus.

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.2.0
      +
    2. +
    3. Укажите пространство имен с помощью -n, если ваш Milvus установлен не в пространстве имен K8s по умолчанию.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0
      +
    4. +
    5. Укажите корневой путь с помощью -r, если ваш Milvus установлен с пользовательским rootpath.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev
      +
    6. +
    7. Укажите тег изображения с помощью -w, если ваш Milvus установлен с пользовательским image.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0
      +
    8. +
    9. Установите -d true, если вы хотите автоматически удалить миграционную капсулу после завершения миграции.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true
      +
    10. +
    11. Откатитесь и выполните миграцию заново, если миграция не удалась.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0
      +
    12. +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.json new file mode 100644 index 000000000..6f6956b8d --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Cluster with Milvus Operator","anchorList":[{"label":"Обновление кластера Milvus с помощью Milvus Operator","href":"Upgrade-Milvus-Cluster-with-Milvus-Operator","type":1,"isActive":false},{"label":"Обновление оператора Milvus","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"Проведение скользящего обновления","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Обновление Milvus путем изменения его образа","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.md new file mode 100644 index 000000000..b98108f23 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_cluster-operator.md @@ -0,0 +1,179 @@ +--- +id: upgrade_milvus_cluster-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: 'Узнайте, как обновить кластер Milvus с помощью Milvus Operator.' +title: Обновление кластера Milvus с помощью Milvus Operator +--- + +

    Обновление кластера Milvus с помощью Milvus Operator

    В этом руководстве описано, как обновить кластер Milvus с помощью Milvus Operator.

    +

    Обновление оператора Milvus

    Выполните следующую команду, чтобы обновить версию вашего Milvus Operator до v1.0.1.

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    После обновления оператора Milvus до последней версии у вас будут следующие возможности:

    + +

    Проведение скользящего обновления

    Начиная с Milvus 2.2.3, вы можете настроить координаторы Milvus на работу в режиме активного ожидания и включить для них функцию скользящего обновления, чтобы Milvus мог отвечать на входящие запросы во время обновления координаторов. В предыдущих выпусках координаторы должны были удаляться, а затем создаваться во время обновления, что могло привести к определенным простоям в работе службы.

    +

    Основываясь на возможностях скользящего обновления, предоставляемых Kubernetes, оператор Milvus обеспечивает упорядоченное обновление развертываний в соответствии с их зависимостями. Кроме того, Milvus реализует механизм, гарантирующий, что его компоненты останутся совместимыми с теми, которые зависят от них во время обновления, что значительно сокращает потенциальное время простоя сервиса.

    +

    По умолчанию функция скользящего обновления отключена. Вам необходимо явно включить ее через конфигурационный файл.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    В приведенном выше файле конфигурации установите spec.components.enableRollingUpdate на true и установите spec.components.image на нужную версию Milvus.

    +

    По умолчанию Milvus выполняет обновление координаторов в упорядоченном порядке, заменяя образы капсул координаторов один за другим. Чтобы сократить время обновления, установите spec.components.imageUpdateMode на all, чтобы Milvus заменял все образы стручков одновременно.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Вы можете установить spec.components.imageUpdateMode на rollingDowngrade, чтобы Milvus заменял образы координаторов более низкой версией.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-old-version>
    +
    +

    Затем сохраните свою конфигурацию в виде YAML-файла (например, milvusupgrade.yml) и подключите этот файл конфигурации к экземпляру Milvus следующим образом:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    Обновление Milvus путем изменения его образа

    В обычных случаях вы можете просто обновить свой Milvus до последней версии, изменив его образ. Однако учтите, что при обновлении Milvus таким способом будет наблюдаться определенное время простоя.

    +

    Создайте конфигурационный файл следующим образом и сохраните его под именем milvusupgrade.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    Затем выполните следующие действия, чтобы выполнить обновление:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    Перенос метаданных

    Начиная с Milvus 2.2.0, метаданные несовместимы с метаданными предыдущих выпусков. Следующие фрагменты примеров предполагают обновление с Milvus 2.1.4 до Milvus 2.5.3.

    +

    1. Создание файла .yaml для миграции метаданных

    Создайте файл миграции метаданных. Ниже приведен пример. В файле конфигурации необходимо указать name, sourceVersion и targetVersion. Следующий пример устанавливает name в my-release-upgrade, sourceVersion в v2.1.4, а targetVersion в v2.5.3. Это означает, что ваш кластер Milvus будет обновлен с версии 2.1.4 до версии 2.5.3.

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2. Примените новую конфигурацию

    Выполните следующую команду, чтобы создать новую конфигурацию.

    +
    $ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml
    +
    +

    3. Проверьте состояние миграции метаданных

    Выполните следующую команду, чтобы проверить статус миграции метаданных.

    +
    kubectl describe milvus release-name
    +
    +

    Статус ready в выводе означает, что миграция метаданных прошла успешно.

    +

    Также можно выполнить команду kubectl get pod, чтобы проверить все поды. Если все капсулы имеют статус ready, миграция метаданных выполнена успешно.

    +

    4. Удалить my-release-upgrade

    После успешного обновления удалите my-release-upgrade в YAML-файле.

    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.json new file mode 100644 index 000000000..21cc9a183 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nstandalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","// Run the following only after update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Standalone with Docker Compose","anchorList":[{"label":"Обновление автономного Milvus с помощью Docker Compose","href":"Upgrade-Milvus-Standalone-with-Docker-Compose","type":1,"isActive":false},{"label":"Обновление Milvus путем изменения его образа","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.md new file mode 100644 index 000000000..ab7258a7a --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-docker.md @@ -0,0 +1,132 @@ +--- +id: upgrade_milvus_standalone-docker.md +label: Docker Compose +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 'Узнайте, как обновить автономный Milvus с помощью Docker Compose.' +title: Обновление автономного Milvus с помощью Docker Compose +--- + +

    Обновление автономного Milvus с помощью Docker Compose

    В этой теме описывается, как обновить Milvus с помощью Docker Compose.

    +

    В обычных случаях вы можете обновить Milvus, изменив его образ. Однако перед обновлением с v2.1.x до v2.5.3 необходимо перенести метаданные.

    +
    +

    По соображениям безопасности Milvus обновляет свой MinIO до RELEASE.2023-03-20T20-16-18Z с выходом v2.2.5. Перед любым обновлением с предыдущих выпусков Milvus Standalone, установленных с помощью Docker Compose, необходимо создать одноузловое однодисковое развертывание MinIO и перенести существующие настройки и содержимое MinIO в новое развертывание. Подробности см. в этом руководстве.

    +
    +

    Обновление Milvus путем изменения его образа

    В обычных случаях вы можете обновить Milvus следующим образом:

    +
      +
    1. Измените тег образа Milvus в docker-compose.yaml.

      +
      ...
      +standalone:
      +  container_name: milvus-standalone
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. Для выполнения обновления выполните следующие команды.

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    Перенос метаданных

      +
    1. Остановите все компоненты Milvus.

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. Подготовьте конфигурационный файл migration.yaml для миграции метаданных.

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. Запустите контейнер миграции.

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. Снова запустите компоненты Milvus с новым образом Milvus.

      +
      // Run the following only after update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.json new file mode 100644 index 000000000..e230f344e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update zilliztech\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update\nhelm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nmy-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 84s\nmy-release-milvus-standalone-75c599fffc-6rwlj 1/1 Running 0 84s\nmy-release-minio-744dd9586f-qngzv 1/1 Running 0 84s\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3\n"],"headingContent":"Upgrade Milvus Standalone with Helm Chart","anchorList":[{"label":"Обновление автономного Milvus с помощью диаграмм Helm","href":"Upgrade-Milvus-Standalone-with-Helm-Chart","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Проверка версии Milvus","href":"Check-the-Milvus-version","type":2,"isActive":false},{"label":"Проведение скользящего обновления","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Обновление Milvus с помощью Helm","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.md new file mode 100644 index 000000000..9ffa3a0ee --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-helm.md @@ -0,0 +1,259 @@ +--- +id: upgrade_milvus_standalone-helm.md +label: Helm +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 'Узнайте, как обновить автономный Milvus с помощью Helm Chart.' +title: Обновление автономного Milvus с помощью диаграмм Helm +--- + +

    Обновление автономного Milvus с помощью диаграмм Helm

    В этом руководстве описано, как обновить автономный Milvus с помощью диаграмм Milvus Helm.

    +

    Необходимые условия

      +
    • Версия Helm >= 3.14.0
    • +
    • Версия Kubernetes >= 1.20.0
    • +
    +
    +

    Начиная с версии Milvus-Helm chart 4.2.21, мы ввели зависимость от графика pulsar-v3.x. Для обратной совместимости, пожалуйста, обновите ваш helm до версии 3.14 или более поздней, и не забудьте добавить опцию --reset-then-reuse-values при использовании helm upgrade.

    +
    +

    Проверка версии Milvus

    Выполните следующие команды для проверки новых версий Milvus.

    +
    $ helm repo update
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    Репо Milvus Helm Charts по адресу https://milvus-io.github.io/milvus-helm/ было заархивировано, и вы можете получать дальнейшие обновления с https://zilliztech.github.io/milvus-helm/ следующим образом:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update zilliztech
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    Архивное хранилище по-прежнему доступно для диаграмм до версии 4.0.31. Для более поздних выпусков используйте новое репо.

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    Вы можете выбрать путь обновления для своего Milvus следующим образом:

    +
    - [Провести скользящее обновление](#conduct-a-rolling-upgrade) с Milvus v2.2.3 и более поздних выпусков до v2.5.3.
    + +
    +

    Проведение скользящего обновления

    Начиная с Milvus 2.2.3, вы можете настроить координаторы Milvus на работу в режиме активного ожидания и включить для них функцию скользящего обновления, чтобы Milvus мог отвечать на входящие запросы во время обновления координаторов. В предыдущих выпусках координаторы должны были удаляться, а затем создаваться во время обновления, что могло привести к некоторому простою службы.

    +

    Скользящие обновления требуют, чтобы координаторы работали в режиме активного ожидания. Вы можете использовать предоставленный нами сценарий для настройки координаторов на работу в режиме активного резерва и запуска скользящего обновления.

    +

    Основываясь на возможностях скользящего обновления, предоставляемых Kubernetes, приведенный выше сценарий обеспечивает упорядоченное обновление развертываний в соответствии с их зависимостями. Кроме того, Milvus реализует механизм, гарантирующий, что его компоненты останутся совместимыми с теми, которые зависят от них во время обновления, что значительно сокращает потенциальное время простоя сервисов.

    +

    Этот сценарий применяется только для обновления Milvus, установленного вместе с Helm. В следующей таблице перечислены флаги команд, доступные в сценариях.

    + + + + + + + + + + + +
    ПараметрыОписаниеЗначение по умолчаниюТребуется
    iИмя экземпляра MilvusNoneTrue
    nПространство имен, в котором установлен MilvusdefaultЛожь
    tЦелевая версия MilvusNoneTrue
    wНовый тег изображения Milvusmilvusdb/milvus:v2.2.3True
    oОперацияupdateЛожь
    +

    После того как вы убедились, что все развертывания в экземпляре Milvus находятся в нормальном состоянии. Вы можете выполнить следующую команду для обновления экземпляра Milvus до версии 2.5.3.

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. Сценарий не применяется к экземпляру Milvus, установленному вместе с RocksMQ.
    2. +
    3. Сценарий жестко кодирует порядок обновления развертываний и не может быть изменен.
    4. +
    5. Сценарий использует kubectl patch для обновления развертываний и kubectl rollout status для отслеживания их состояния.
    6. +
    7. Сценарий использует kubectl patch для обновления метки app.kubernetes.io/version развертывания на метку, указанную после флага -t в команде.
    8. +
    +
    +
    +

    Обновление Milvus с помощью Helm

    Чтобы обновить Milvus с минорного выпуска до v2.2.3 до последней версии, выполните следующие команды:

    +
    helm repo update
    +helm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    Используйте версию диаграммы Helm в предыдущей команде. Подробнее о том, как получить версию диаграммы Helm, см. в разделе Проверка версии Milvus.

    +

    Перенос метаданных

    Начиная с Milvus 2.2.0, метаданные несовместимы с метаданными предыдущих выпусков. Следующие примеры фрагментов предполагают обновление с Milvus 2.1.4 до Milvus 2.2.0.

    +

    1. Проверьте версию Milvus

    Запустите $ helm list, чтобы проверить версию приложения Milvus. Вы можете видеть, что APP VERSION - это 2.1.4.

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION     
    +my-release          default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4
    +
    +

    2. Проверьте запущенные подсистемы

    Запустите $ kubectl get pods, чтобы проверить запущенные подсистемы. Вы можете увидеть следующий результат.

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          84s
    +my-release-milvus-standalone-75c599fffc-6rwlj   1/1     Running   0          84s
    +my-release-minio-744dd9586f-qngzv               1/1     Running   0          84s
    +
    +

    3. Проверьте тег изображения

    Проверьте тег образа для стручка my-release-milvus-proxy-6c548f787f-scspp. Вы можете увидеть, что релиз вашего кластера Milvus - v2.1.4.

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4. Перенесите метаданные

    Основным изменением в Milvus 2.2 является структура метаданных сегментных индексов. Поэтому при обновлении Milvus с v2.1.x до v2.2.0 необходимо использовать Helm для миграции метаданных. Ниже приведен сценарий для безопасной миграции метаданных.

    +

    Этот сценарий применим только к Milvus, установленному на кластере K8s. Если в процессе произойдет ошибка, сначала откатитесь к предыдущей версии с помощью операции отката.

    +

    В следующей таблице перечислены операции, которые можно выполнить для миграции метаданных.

    + + + + + + + + + + + + + + + + + +
    ПараметрыОписаниеЗначение по умолчаниюТребуется
    iИмя экземпляра Milvus.NoneTrue
    nПространство имен, в котором установлен Milvus.defaultFalse
    sИсходная версия Milvus.NoneTrue
    tЦелевая версия Milvus.NoneTrue
    rКорневой путь метафайла Milvus.by-devFalse
    wНовый тег изображения Milvus.milvusdb/milvus:v2.2.0False
    mТег изображения миграции мета.milvusdb/meta-migration:v2.2.0False
    oОперация мета-миграции.migrateFalse
    dУдалять ли капсулу миграции после завершения миграции.falseЛожь
    cКласс хранения для pvc мета-миграции.default storage classFalse
    eЭнпоинт etcd, используемый milvus.etcd svc installed with milvusFalse
    +

    1. Миграция метаданных

      +
    1. Загрузите сценарий миграции.
    2. +
    3. Остановите компоненты Milvus. Любой живой сеанс в Milvus etcd может привести к сбою миграции.
    4. +
    5. Создайте резервную копию метаданных Milvus.
    6. +
    7. Перенесите метаданные Milvus.
    8. +
    9. Запустите компоненты Milvus с новым образом.
    10. +
    +

    2. Обновление Milvus с версии 2.1.x до 2.5.3

    Следующие команды предполагают, что вы обновили Milvus с v2.1.4 до 2.5.3. Измените их на версии, соответствующие вашим потребностям.

    +
      +
    1. Укажите имя экземпляра Milvus, исходную версию Milvus и целевую версию Milvus.

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.5.3
      +
    2. +
    3. Укажите пространство имен с помощью -n, если ваш Milvus установлен не в пространстве имен K8s по умолчанию.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3
      +
    4. +
    5. Укажите корневой путь с помощью -r, если ваш Milvus установлен с пользовательским rootpath.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev
      +
    6. +
    7. Укажите тег изображения с помощью -w, если ваш Milvus установлен с пользовательским image.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3
      +
    8. +
    9. Установите -d true, если вы хотите автоматически удалить миграционную капсулу после завершения миграции.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true
      +
    10. +
    11. Откатитесь и выполните миграцию снова, если миграция не удалась.

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3
      +
    12. +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.json b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.json new file mode 100644 index 000000000..db41d1a69 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nlabels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Standalone with Milvus Operator","anchorList":[{"label":"Обновление автономного Milvus с помощью Milvus Operator","href":"Upgrade-Milvus-Standalone-with-Milvus-Operator","type":1,"isActive":false},{"label":"Обновление оператора Milvus","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"Проведение скользящего обновления","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"Обновление Milvus путем изменения его образа","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"Перенос метаданных","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.md b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.md new file mode 100644 index 000000000..c3209e185 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/upgrade_milvus_standalone-operator.md @@ -0,0 +1,181 @@ +--- +id: upgrade_milvus_standalone-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 'Узнайте, как обновить Milvus standalone с помощью Milvus operator.' +title: Обновление автономного Milvus с помощью Milvus Operator +--- + +

    Обновление автономного Milvus с помощью Milvus Operator

    В этом руководстве описано, как обновить автономный Milvus с помощью Milvus Operator.

    +

    Обновление оператора Milvus

    Выполните следующую команду, чтобы обновить версию оператора Milvus до v1.0.1.

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    После обновления оператора Milvus до последней версии у вас будут следующие возможности:

    + +

    Проведение скользящего обновления

    Начиная с Milvus 2.2.3, вы можете настроить координаторы Milvus на работу в режиме активного ожидания и включить для них функцию скользящего обновления, чтобы Milvus мог отвечать на входящие запросы во время обновления координаторов. В предыдущих выпусках координаторы должны были удаляться, а затем создаваться во время обновления, что могло привести к некоторому простою службы.

    +

    Основываясь на возможностях скользящего обновления, предоставляемых Kubernetes, оператор Milvus обеспечивает упорядоченное обновление развертываний в соответствии с их зависимостями. Кроме того, Milvus реализует механизм, гарантирующий, что его компоненты останутся совместимыми с теми, которые зависят от них во время обновления, что значительно сокращает потенциальное время простоя сервиса.

    +

    По умолчанию функция скользящего обновления отключена. Вам необходимо явно включить ее через конфигурационный файл.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    В приведенном выше файле конфигурации установите spec.components.enableRollingUpdate на true и установите spec.components.image на нужную версию Milvus.

    +

    По умолчанию Milvus выполняет скользящее обновление координаторов в упорядоченном порядке, в котором он заменяет образы капсул координаторов один за другим. Чтобы сократить время обновления, установите spec.components.imageUpdateMode на all, чтобы Milvus заменял все образы стручков одновременно.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    Вы можете установить spec.components.imageUpdateMode на rollingDowngrade, чтобы Milvus заменял образы координаторов более низкой версией.

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-older-version>
    +
    +

    Затем сохраните свою конфигурацию в виде YAML-файла (например, milvusupgrade.yml) и подключите этот файл конфигурации к экземпляру Milvus следующим образом:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    Обновление Milvus путем изменения его образа

    В обычных случаях вы можете просто обновить свой Milvus до последней версии, изменив его образ. Однако учтите, что при обновлении Milvus таким способом будет наблюдаться определенное время простоя.

    +

    Создайте конфигурационный файл следующим образом и сохраните его под именем milvusupgrade.yaml:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +    name: my-release
    +labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    Затем выполните следующие действия, чтобы выполнить обновление:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    Перенос метаданных

    Начиная с Milvus 2.2.0, метаданные несовместимы с метаданными предыдущих выпусков. Следующие фрагменты примеров предполагают обновление с Milvus 2.1.4 до Milvus v2.5.3.

    +

    1. Создание файла .yaml для миграции метаданных

    Создайте файл миграции метаданных. Ниже приведен пример. В файле конфигурации необходимо указать name, sourceVersion и targetVersion. В следующем примере name устанавливается на my-release-upgrade, sourceVersion - на v2.1.4, а targetVersion - на v2.5.3. Это означает, что ваш экземпляр Milvus будет обновлен с версии 2.1.4 до версии 2.5.3.

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2. Примените новую конфигурацию

    Выполните следующую команду, чтобы применить новую конфигурацию.

    +
    $ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml
    +
    +

    3. Проверьте состояние миграции метаданных

    Выполните следующую команду, чтобы проверить статус миграции метаданных.

    +
    kubectl describe milvus release-name
    +
    +

    Статус ready в выводе означает, что миграция метаданных прошла успешно.

    +

    Также можно выполнить команду kubectl get pod, чтобы проверить все поды. Если все капсулы имеют статус ready, миграция метаданных выполнена успешно.

    +

    4. Удалить my-release-upgrade

    После успешного обновления удалите my-release-upgrade в YAML-файле.

    diff --git a/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.json b/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.json new file mode 100644 index 000000000..f20e43d3e --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.json @@ -0,0 +1 @@ +{"codeList":["namespace=default\nrelease=my-release\nhelm -n ${namespace} get values ${release} -o yaml > values.yaml\ncat values.yaml\n","# ... omit existing values\npulsar:\n enabled: true\npulsarv3:\n enabled: false\nimage:\n all:\n repository: milvusdb/milvus\n tag: v2.5.0-beta \n","helm repo add milvus https://zilliztech.github.io/milvus-helm\nhelm repo update milvus\n","helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml\n","wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n namespace: default\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies:\n pulsar:\n inCluster:\n chartVersion: pulsar-v2\n","kubectl apply -f milvus_cluster_default.yaml\n","helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false\n","pulsar:\n enabled: true\npulsarv3:\n enabled: false\n","helm install my-release milvus/milvus -f values.yaml\n"],"headingContent":"Use Pulsar v2 with Milvus v2.5.x","anchorList":[{"label":"Использование Pulsar v2 с Milvus v2.5.x","href":"Use-Pulsar-v2-with-Milvus-v25x","type":1,"isActive":false},{"label":"Продолжение использования Pulsar v2 при обновлении Milvus v2.5.x","href":"Continue-using-Pulsar-v2-while-upgrading-Milvus-v25x","type":2,"isActive":false},{"label":"Создание нового экземпляра Milvus с помощью Pulsar v2","href":"Creating-a-new-Milvus-instance-with-Pulsar-v2","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.md b/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.md new file mode 100644 index 000000000..9204ef310 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/use-pulsar-v2.md @@ -0,0 +1,139 @@ +--- +id: use-pulsar-v2.md +related_key: use pulsar v2 with milvus v2.5.x +summary: >- + Milvus рекомендует обновить Pulsar до версии 3 для Milvus v2.5.x. Однако если + вы предпочитаете использовать Pulsar v2, в этой статье мы расскажем вам о том, + как продолжить работу с Pulsar v2 в Milvus v2.5.x. +title: Использование Pulsar v2 с Milvus v2.5.x +--- +

    Использование Pulsar v2 с Milvus v2.5.x

    Milvus рекомендует вам обновить Pulsar до версии 3 для работы с Milvus v2.5.x. Подробности см. в разделе Обновление Pulsar. Однако если вы предпочитаете использовать Pulsar v2 с Milvus v2.5.x, в этой статье мы расскажем вам о том, как запустить Milvus v2.5.x с Pulsar v2.

    +

    Если у вас уже есть работающий экземпляр Milvus и вы хотите обновить его до версии 2.5.x, но при этом продолжать использовать Pulsar v2, вы можете выполнить шаги, описанные на этой странице.

    +

    Продолжение использования Pulsar v2 при обновлении Milvus v2.5.x

    В этом разделе описаны шаги по продолжению использования Pulsar v2 при обновлении запущенного экземпляра Milvus до Milvus v2.5.x.

    +

    Для пользователей Milvus Operator

    Milvus Operator по умолчанию совместим с обновлениями Pulsar v2. Вы можете обновить свой экземпляр Milvus до версии 2.5.x, обратившись к разделу Обновление кластера Milvus с помощью Milvus Operator.

    +

    После завершения обновления вы сможете продолжить использовать Pulsar v2 с экземпляром Milvus.

    +

    Для пользователей Helm

    Перед обновлением убедитесь, что

    +
      +
    • Ваша версия Helm выше v3.12, рекомендуется использовать последнюю версию.

      +

      Для получения дополнительной информации см. раздел Установка Helm.

    • +
    • Ваша версия Kubernetes выше v1.20.

    • +
    +

    Операции, описанные в этой статье, предполагают, что:

    +
      +
    • Milvus был установлен в пространстве имен default.

    • +
    • Название релиза Milvus - my-release.

    • +
    +

    Перед обновлением Milvus необходимо изменить файл values.yaml, чтобы указать версию Pulsar как v2. Для этого необходимо выполнить следующие действия:

    +
      +
    1. Получите текущий файл values.yaml вашего экземпляра Milvus.

      +
      namespace=default
      +release=my-release
      +helm -n ${namespace} get values ${release} -o yaml > values.yaml
      +cat values.yaml
      +
    2. +
    3. Отредактируйте файл values.yaml, чтобы указать версию Pulsar как v2.

      +
      # ... omit existing values
      +pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +image:
      +  all:
      +    repository: milvusdb/milvus
      +    tag: v2.5.0-beta 
      +
      +

      Для image измените tag на желаемую версию Milvus (например, v2.5.0-beta).

    4. +
    5. Обновите таблицу Milvus Helm.

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm
      +helm repo update milvus
      +
    6. +
    7. Обновление экземпляра Milvus.

      +
      helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml
      +
    8. +
    +

    Создание нового экземпляра Milvus с помощью Pulsar v2

    В этом разделе описаны шаги по созданию нового экземпляра Milvus с помощью Pulsar v2.

    +

    Для пользователей Milvus Operator

    Перед развертыванием Milvus v2.5.x необходимо загрузить и отредактировать файл Milvus Customer Resource Definition (CRD). Подробнее о том, как установить Milvus с помощью Milvus Operator, читайте в разделе Установка кластера Milvus с помощью Milvus Operator.

    +
      +
    1. Загрузите файл CRD.

      +
      wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
      +
    2. +
    3. Отредактируйте файл milvus_cluster_default.yaml, чтобы указать версию Pulsar как v2.

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  namespace: default
      +  labels:
      +    app: milvus
      +spec:
      +  mode: cluster
      +  dependencies:
      +    pulsar:
      +      inCluster:
      +        chartVersion: pulsar-v2
      +
      +

      Для dependencies измените pulsar.inCluster.chartVersion на pulsar-v2.

    4. +
    5. Продолжите шаги в разделе "Установка Milvus Cluster с Milvus Operator", чтобы развернуть Milvus v2.5.x с Pulsar v2, используя отредактированный CRD-файл.

      +
      kubectl apply -f milvus_cluster_default.yaml
      +
    6. +
    +

    Для пользователей Helm

    Перед развертыванием Milvus v2.5.x можно либо подготовить файл values.yaml, либо использовать встроенные параметры для указания версии Pulsar. Подробнее о том, как установить Milvus с помощью Helm, см. в разделе Установка кластера Milvus с помощью Helm.

    +
      +
    • Используйте встроенные параметры, чтобы указать версию Pulsar как v2.

      +
      helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false
      +
    • +
    • Используйте файл values.yaml, чтобы указать версию Pulsar как v2.

      +
      pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +
      +

      Затем разверните Milvus v2.5.x с Pulsar v2 с помощью файла values.yaml.

      +
      helm install my-release milvus/milvus -f values.yaml
      +
    • +
    diff --git a/localization/v2.5.x/site/ru/adminGuide/users_and_roles.json b/localization/v2.5.x/site/ru/adminGuide/users_and_roles.json new file mode 100644 index 000000000..20b527aa3 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/users_and_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.create_user(user_name=\"user_1\", password=\"P@ssw0rd\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.CreateUserReq;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nCreateUserReq createUserReq = CreateUserReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .build();​\n ​\nclient.createUser(createUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nawait milvusClient.createUser({​\n username: 'user_1',​\n password: 'P@ssw0rd',​\n });​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.update_password(​\n user_name=\"user_1\",​\n old_password=\"P@ssw0rd\",​\n new_password=\"NewP@ssw0rd\"​\n)​\n\n","import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​\n​\nUpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .newPassword(\"NewP@ssw0rd\")​\n .build();​\nclient.updatePassword(updatePasswordReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.updateUser({​\n username: 'user_1',​\n newPassword: 'P@ssw0rd',​\n oldPassword: 'NewP@ssw0rd',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"newPassword\": \"P@ssw0rd!\",​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","List resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listUsers();​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root', 'user_1']​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_role(role_name=\"role_a\")​\nimport io.milvus.v2.service.rbac.request.CreateRoleReq;​\n\n","CreateRoleReq createRoleReq = CreateRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\n ​\n\n","client.createRole(createRoleReq);​\nconst { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.createRole({​\n roleName: 'role_a',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List roles = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listRoles(​\n includeUserInfo: True​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin', 'role_a']​\n\n"],"headingContent":"Create Users & Roles​","anchorList":[{"label":"Создание пользователей и ролей","href":"Create-Users--Roles​","type":1,"isActive":false},{"label":"Пользователь","href":"User​","type":2,"isActive":false},{"label":"Роль","href":"Role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/adminGuide/users_and_roles.md b/localization/v2.5.x/site/ru/adminGuide/users_and_roles.md new file mode 100644 index 000000000..96e607685 --- /dev/null +++ b/localization/v2.5.x/site/ru/adminGuide/users_and_roles.md @@ -0,0 +1,261 @@ +--- +id: users_and_roles.md +related_key: 'users, roles' +summary: >- + Milvus обеспечивает тонкий контроль доступа с помощью RBAC. Вы можете начать с + создания пользователей и ролей, затем назначить привилегии или группы + привилегий для ролей и, наконец, управлять контролем доступа, предоставляя + роли пользователям. Этот метод обеспечивает эффективность и безопасность + управления доступом. На этой странице описано, как создавать пользователей и + роли в Milvus. +title: Создание пользователей и ролей +--- +

    Создание пользователей и ролей

    Milvus обеспечивает тонкий контроль доступа с помощью RBAC. Вы можете начать с создания пользователей и ролей, затем назначить привилегии или группы привилегий для ролей и, наконец, управлять контролем доступа, предоставляя роли пользователям. Этот метод обеспечивает эффективность и безопасность управления доступом. На этой странице описано, как создавать пользователей и роли в Milvus.

    +

    Пользователь

    После инициализации экземпляра Milvus автоматически создается корневой пользователь для аутентификации при первом подключении к Milvus. Имя пользователя root - root, а пароль - Milvus. Роль root-пользователя по умолчанию - admin, которая имеет доступ ко всем ресурсам. Для обеспечения безопасности данных, пожалуйста, храните учетные данные корневого пользователя в безопасности, чтобы предотвратить несанкционированный доступ.

    +

    Для повседневной работы мы рекомендуем создавать пользователей, а не использовать root-пользователя.

    +

    Создание пользователя

    В следующем примере показано, как создать пользователя с именем пользователя user_1 и паролем P@ssw0rd. Имя пользователя и пароль для него должны соответствовать следующим правилам.

    +
      +
    • Имя пользователя: должно начинаться с буквы и может содержать только заглавные или строчные буквы, цифры и знаки подчеркивания.

    • +
    • Пароль: должен состоять из 8-64 символов и включать три из следующих: заглавные буквы, строчные буквы, цифры и специальные символы.

    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.create_user(user_name="user_1", password="P@ssw0rd")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.CreateUserReq;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +CreateUserReq createUserReq = CreateUserReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .build();​
    +        ​
    +client.createUser(createUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +await milvusClient.createUser({​
    +   username: 'user_1',​
    +   password: 'P@ssw0rd',​
    + });​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    Обновление пароля

    После создания пользователя вы можете обновить пароль, если забыли его.

    +

    Новый пароль также должен соответствовать следующему правилу.

    +
      +
    • Должен состоять из 8-64 символов и включать три из следующих: заглавные буквы, строчные буквы, цифры и специальные символы.
    • +
    +

    В следующем примере показано, как обновить пароль для пользователя user_1 до NewP@ssw0rd.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.update_password(​
    +    user_name="user_1",​
    +    old_password="P@ssw0rd",​
    +    new_password="NewP@ssw0rd"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​
    +​
    +UpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .newPassword("NewP@ssw0rd")​
    +        .build();​
    +client.updatePassword(updatePasswordReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.updateUser({​
    +   username: 'user_1',​
    +   newPassword: 'P@ssw0rd',​
    +   oldPassword: 'NewP@ssw0rd',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "newPassword": "P@ssw0rd!",​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    Список пользователей

    После создания нескольких пользователей вы можете составить список и просмотреть всех существующих пользователей.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listUsers();​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Ниже приведен пример вывода. root - это пользователь по умолчанию, автоматически созданный в Milvus. user_1 - это новый пользователь, который только что был создан.

    +
    ['root', 'user_1']​
    +
    +
    +

    Роль

    Milvus предоставляет встроенную роль admin, которая представляет собой роль администратора, имеющего доступ к ресурсам всех экземпляров и привилегии для всех операций. Для более тонкого управления доступом и повышения безопасности данных рекомендуется создавать собственные роли в соответствии с вашими потребностями.

    +

    Создание роли

    В следующем примере показано, как создать роль с именем role_a.

    +

    Имя роли должно соответствовать следующему правилу.

    +
      +
    • Должно начинаться с буквы и может включать только прописные или строчные буквы, цифры и символы подчеркивания."
    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_role(role_name="role_a")​
    +import io.milvus.v2.service.rbac.request.CreateRoleReq;​
    +
    +
    +
    CreateRoleReq createRoleReq = CreateRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +       ​
    +
    +
    +
    client.createRole(createRoleReq);​
    +const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.createRole({​
    +   roleName: 'role_a',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    Список ролей

    После создания нескольких ролей вы можете перечислить и просмотреть все существующие роли.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> roles = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listRoles(​
    +    includeUserInfo: True​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    Ниже приведен пример вывода. admin - это роль по умолчанию в Milvus. role_a - это новая роль, которая только что была создана.

    +
    ['admin', 'role_a']​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.json b/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.json new file mode 100644 index 000000000..c8761f540 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\nbge_m3_ef = BGEM3EmbeddingFunction(\n model_name='BAAI/bge-m3', # Specify the model name\n device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = bge_m3_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense document dim:\", bge_m3_ef.dim[\"dense\"], docs_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse document dim:\", bge_m3_ef.dim[\"sparse\"], list(docs_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02505937, -0.00142193, 0.04015467, ..., -0.02094924,\n 0.02623661, 0.00324098], dtype=float32), array([ 0.00118463, 0.00649292, -0.00735763, ..., -0.01446293,\n 0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 , 0.0009811 , ..., -0.02559666,\n 0.08084674, 0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type ''\n with 43 stored elements in Compressed Sparse Row format>}\nDense document dim: 1024 (1024,)\nSparse document dim: 250002 (1, 250002)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bge_m3_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense query dim:\", bge_m3_ef.dim[\"dense\"], query_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse query dim:\", bge_m3_ef.dim[\"sparse\"], list(query_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02024024, -0.01514386, 0.02380808, ..., 0.00234648,\n -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,\n 0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type ''\n with 14 stored elements in Compressed Sparse Row format>}\nDense query dim: 1024 (1024,)\nSparse query dim: 250002 (1, 250002)\n"],"headingContent":"BGE M3","anchorList":[{"label":"BGE M3","href":"BGE-M3","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.md b/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.md new file mode 100644 index 000000000..1d540fcf5 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-bgm-m3.md @@ -0,0 +1,93 @@ +--- +id: embed-with-bgm-m3.md +order: 4 +summary: >- + BGE-M3 назван так за свои возможности в области многоязычия, + многофункциональности и многогранности. +title: BGE M3 +--- +

    BGE M3

    BGE-M3 назван так за свои возможности в области многоязычия, многофункциональности и многогранности. Способный поддерживать более 100 языков, BGE-M3 устанавливает новые стандарты в задачах мультиязычного и кросс-язычного поиска. Его уникальная способность выполнять плотный поиск, многовекторный поиск и разреженный поиск в рамках одной структуры делает его идеальным выбором для широкого спектра приложений информационного поиска (IR).

    +

    Milvus интегрируется с моделью BGE M3 с помощью класса BGEM3EmbeddingFunction. Этот класс обрабатывает вычисления вкраплений и возвращает их в формате, совместимом с Milvus, для индексирования и поиска. Для использования этой функции необходимо установить FlagEmbedding.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте функцию BGEM3EmbeddingFunction:

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(
    +    model_name='BAAI/bge-m3', # Specify the model name
    +    device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +    use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.
    +)
    +
    +

    Параметры:

    +
      +
    • имя_модели(строка)

      +

      Имя модели, которую следует использовать для кодирования. По умолчанию используется значение BAAI/bge-m3.

    • +
    • устройство(строка)

      +

      Используемое устройство, с cpu для CPU и cuda:n для n-го GPU-устройства.

    • +
    • use_fp16(bool)

      +

      Использовать ли 16-битную точность вычислений с плавающей точкой (fp16). Укажите False, если устройство - cpu.

    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = bge_m3_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense document dim:", bge_m3_ef.dim["dense"], docs_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse document dim:", bge_m3_ef.dim["sparse"], list(docs_embeddings["sparse"])[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: {'dense': [array([-0.02505937, -0.00142193,  0.04015467, ..., -0.02094924,
    +        0.02623661,  0.00324098], dtype=float32), array([ 0.00118463,  0.00649292, -0.00735763, ..., -0.01446293,
    +        0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 ,  0.0009811 , ..., -0.02559666,
    +        0.08084674,  0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 43 stored elements in Compressed Sparse Row format>}
    +Dense document dim: 1024 (1024,)
    +Sparse document dim: 250002 (1, 250002)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bge_m3_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense query dim:", bge_m3_ef.dim["dense"], query_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse query dim:", bge_m3_ef.dim["sparse"], list(query_embeddings["sparse"])[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: {'dense': [array([-0.02024024, -0.01514386,  0.02380808, ...,  0.00234648,
    +       -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,
    +        0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 14 stored elements in Compressed Sparse Row format>}
    +Dense query dim: 1024 (1024,)
    +Sparse query dim: 250002 (1, 250002)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.json b/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.json new file mode 100644 index 000000000..04ac93b04 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer\nfrom pymilvus.model.sparse import BM25EmbeddingFunction\n\n# there are some built-in analyzers for several languages, now we use 'en' for English.\nanalyzer = build_default_analyzer(language=\"en\")\n\ncorpus = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\n# analyzer can tokenize the text into tokens\ntokens = analyzer(corpus[0])\nprint(\"tokens:\", tokens)\n","tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']\n","# Use the analyzer to instantiate the BM25EmbeddingFunction\nbm25_ef = BM25EmbeddingFunction(analyzer)\n\n# Fit the model on the corpus to get the statstics of the corpus\nbm25_ef.fit(corpus)\n","docs = [\n \"The field of artificial intelligence was established as an academic subject in 1956.\",\n \"Alan Turing was the pioneer in conducting significant research in artificial intelligence.\",\n \"Originating in Maida Vale, London, Turing grew up in the southern regions of England.\",\n \"In 1956, artificial intelligence emerged as a scholarly field.\",\n \"Turing, originally from Maida Vale, London, was brought up in the south of England.\"\n]\n\n# Create embeddings for the documents\ndocs_embeddings = bm25_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 0) 1.0208816705336425\n (0, 1) 1.0208816705336425\n (0, 3) 1.0208816705336425\n...\n (4, 16) 0.9606986899563318\n (4, 17) 0.9606986899563318\n (4, 20) 0.9606986899563318\nSparse dim: 21 (1, 21)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bm25_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 0) 0.5108256237659907\n (0, 1) 0.5108256237659907\n (0, 2) 0.5108256237659907\n (1, 6) 0.5108256237659907\n (1, 7) 0.11554389108992644\n (1, 14) 0.5108256237659907\nSparse dim: 21 (1, 21)\n"],"headingContent":"BM25","anchorList":[{"label":"BM25","href":"BM25","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.md b/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.md new file mode 100644 index 000000000..51862fe49 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-bm25.md @@ -0,0 +1,112 @@ +--- +id: embed-with-bm25.md +order: 5 +summary: >- + BM25 - это функция ранжирования, используемая в информационном поиске для + оценки релевантности документов заданному поисковому запросу. +title: BM25 +--- +

    BM25

    BM25 - это функция ранжирования, используемая в информационном поиске для оценки релевантности документов заданному поисковому запросу. Она расширяет базовый подход, основанный на частоте терминов, путем включения нормализации длины документа и насыщения частоты терминов. BM25 может генерировать разреженные вкрапления, представляя документы как векторы оценок важности терминов, что позволяет эффективно осуществлять поиск и ранжирование в разреженных векторных пространствах.

    +

    Milvus интегрируется с моделью BM25 с помощью класса BM25EmbeddingFunction. Этот класс обрабатывает вычисления вкраплений и возвращает их в формате, совместимом с Milvus, для индексации и поиска. Важной частью этого процесса является создание анализатора для токенизации.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Чтобы легко создать токенизатор, Milvus предлагает анализатор по умолчанию, который требует только указания языка текста.

    +

    Пример:

    +
    from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
    +from pymilvus.model.sparse import BM25EmbeddingFunction
    +
    +# there are some built-in analyzers for several languages, now we use 'en' for English.
    +analyzer = build_default_analyzer(language="en")
    +
    +corpus = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +# analyzer can tokenize the text into tokens
    +tokens = analyzer(corpus[0])
    +print("tokens:", tokens)
    +
    +

    Параметры:

    +
      +
    • language(string)

      +

      Язык текста, который будет подвергнут токенизации. Возможные варианты: en (английский), de (немецкий), fr (французский), ru (русский), sp (испанский), it (итальянский), pt (португальский), zh (китайский), jp (японский), kr (корейский).

    • +
    +

    Ожидаемый результат похож на следующий:

    +
    tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
    +
    +

    Алгоритм BM25 обрабатывает текст, сначала разбивая его на лексемы с помощью встроенного анализатора, как показано на примере таких лексем английского языка, как 'artifici', 'intellig' и 'academ'. Затем он собирает статистику по этим лексемам, оценивая их частоту и распределение по документам. Ядро BM25 рассчитывает балл релевантности каждой лексемы в зависимости от ее важности, при этом более редкие лексемы получают более высокие баллы. Этот лаконичный процесс позволяет эффективно ранжировать документы по релевантности запросу.

    +

    Чтобы собрать статистику по корпусу, используйте метод fit():

    +
    # Use the analyzer to instantiate the BM25EmbeddingFunction
    +bm25_ef = BM25EmbeddingFunction(analyzer)
    +
    +# Fit the model on the corpus to get the statstics of the corpus
    +bm25_ef.fit(corpus)
    +
    +

    Затем используйте метод encode_documents() для создания вкраплений для документов:

    +
    docs = [
    +    "The field of artificial intelligence was established as an academic subject in 1956.",
    +    "Alan Turing was the pioneer in conducting significant research in artificial intelligence.",
    +    "Originating in Maida Vale, London, Turing grew up in the southern regions of England.",
    +    "In 1956, artificial intelligence emerged as a scholarly field.",
    +    "Turing, originally from Maida Vale, London, was brought up in the south of England."
    +]
    +
    +# Create embeddings for the documents
    +docs_embeddings = bm25_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    Ожидаемый результат будет выглядеть следующим образом:

    +
    Embeddings:   (0, 0)        1.0208816705336425
    +  (0, 1)        1.0208816705336425
    +  (0, 3)        1.0208816705336425
    +...
    +  (4, 16)        0.9606986899563318
    +  (4, 17)        0.9606986899563318
    +  (4, 20)        0.9606986899563318
    +Sparse dim: 21 (1, 21)
    +
    +

    Чтобы создать вкрапления для запросов, используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bm25_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings:   (0, 0)        0.5108256237659907
    +  (0, 1)        0.5108256237659907
    +  (0, 2)        0.5108256237659907
    +  (1, 6)        0.5108256237659907
    +  (1, 7)        0.11554389108992644
    +  (1, 14)        0.5108256237659907
    +Sparse dim: 21 (1, 21)
    +
    +

    Примечания:

    +

    При использовании BM25EmbeddingFunction следует учитывать, что операции encoding_queries() и encoding_documents() математически не могут быть взаимозаменяемы. Поэтому не существует реализации bm25_ef(texts).

    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.json b/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.json new file mode 100644 index 000000000..3ce35a476 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import CohereEmbeddingFunction\n\ncohere_ef = CohereEmbeddingFunction(\n model_name=\"embed-english-light-v3.0\",\n api_key=\"YOUR_COHERE_API_KEY\",\n input_type=\"search_document\",\n embedding_types=[\"float\"]\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = cohere_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", cohere_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 3.43322754e-02, 1.16252899e-03, -5.25207520e-02, 1.32846832e-03,\n -6.80541992e-02, 6.10961914e-02, -7.06176758e-02, 1.48925781e-01,\n 1.54174805e-01, 1.98516846e-02, 2.43835449e-02, 3.55224609e-02,\n 1.82952881e-02, 7.57446289e-02, -2.40783691e-02, 4.40063477e-02,\n...\n 0.06359863, -0.01971436, -0.02253723, 0.00354195, 0.00222015,\n 0.00184727, 0.03408813, -0.00777817, 0.04919434, 0.01519775,\n -0.02862549, 0.04760742, -0.07891846, 0.0124054 ], dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = cohere_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", cohere_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-1.33361816e-02, 9.79423523e-04, -7.28759766e-02, -1.93786621e-02,\n -9.71679688e-02, 4.34875488e-02, -9.81445312e-02, 1.16882324e-01,\n 5.89904785e-02, -4.19921875e-02, 4.95910645e-02, 5.83496094e-02,\n 3.47595215e-02, -5.87463379e-03, -7.30514526e-03, 2.92816162e-02,\n...\n 0.00749969, -0.01192474, 0.02719116, 0.03347778, 0.07696533,\n 0.01409149, 0.00964355, -0.01681519, -0.0073204 , 0.00043154,\n -0.04577637, 0.03591919, -0.02807617, -0.04812622], dtype=float32)]\nDim 384 (384,)\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.md b/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.md new file mode 100644 index 000000000..82ae5b14b --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-cohere.md @@ -0,0 +1,106 @@ +--- +id: embed-with-cohere.md +order: 9 +summary: >- + В этой статье описывается, как использовать функцию CohereEmbeddingFunction + для кодирования документов и запросов с помощью модели встраивания Cohere. +title: Embed Cohere +--- +

    Cohere

    Модели встраивания Cohere используются для создания текстовых вкраплений, которые представляют собой списки чисел с плавающей точкой, отражающих семантическую информацию о тексте. Эти вкрапления можно использовать для таких задач, как классификация текста и семантический поиск.

    +

    Milvus интегрируется с моделями вкраплений Cohere с помощью класса CohereEmbeddingFunction. Этот класс обрабатывает вычисления вкраплений и возвращает их в формате, совместимом с Milvus для индексирования и поиска.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте класс CohereEmbeddingFunction:

    +
    from pymilvus.model.dense import CohereEmbeddingFunction
    +
    +cohere_ef = CohereEmbeddingFunction(
    +    model_name="embed-english-light-v3.0",
    +    api_key="YOUR_COHERE_API_KEY",
    +    input_type="search_document",
    +    embedding_types=["float"]
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели встраивания Cohere, которую следует использовать для кодирования. Вы можете указать любое из доступных имен моделей встраивания Cohere, например embed-english-v3.0, embed-multilingual-v3.0, и т. д. Если оставить этот параметр неуказанным, будет использоваться embed-english-light-v3.0. Список доступных моделей см. в разделе Embed.

    • +
    • api_key (string)

      +

      Ключ API для доступа к API Cohere.

    • +
    • input_type (строка)

      +

      Тип входных данных, передаваемых модели. Требуется для встраивания моделей v3 и выше.

      +
        +
      • "search_document": Используется для вкраплений, хранящихся в векторной базе данных для поиска.
      • +
      • "search_query": Используется для встраивания поисковых запросов, выполняемых по векторной БД для поиска релевантных документов.
      • +
      • "classification": : Используется для вкраплений, пропущенных через текстовый классификатор.
      • +
      • "clustering": Используется для вкраплений, пропущенных через алгоритм кластеризации.
      • +
    • +
    • embedding_types (Список[str])

      +

      Тип вкраплений, которые вы хотите получить в ответ. Не требуется, и по умолчанию используется None, который возвращает тип ответа Embed Floats. В настоящее время для этого параметра можно указать только одно значение. Возможные значения:

      +
        +
      • "float": Используйте этот параметр, если хотите получить обратно стандартные вкрапления поплавков. Действует для всех моделей.
      • +
      • "binary": Используйте это значение, если вы хотите получить подписанные бинарные вложения. Действует только для моделей v3.
      • +
      • "ubinary": Используйте это, когда хотите получить беззнаковые двоичные вкрапления. Действителен только для моделей v3.
      • +
    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = cohere_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", cohere_ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([ 3.43322754e-02,  1.16252899e-03, -5.25207520e-02,  1.32846832e-03,
    +       -6.80541992e-02,  6.10961914e-02, -7.06176758e-02,  1.48925781e-01,
    +        1.54174805e-01,  1.98516846e-02,  2.43835449e-02,  3.55224609e-02,
    +        1.82952881e-02,  7.57446289e-02, -2.40783691e-02,  4.40063477e-02,
    +...
    +        0.06359863, -0.01971436, -0.02253723,  0.00354195,  0.00222015,
    +        0.00184727,  0.03408813, -0.00777817,  0.04919434,  0.01519775,
    +       -0.02862549,  0.04760742, -0.07891846,  0.0124054 ], dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = cohere_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", cohere_ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([-1.33361816e-02,  9.79423523e-04, -7.28759766e-02, -1.93786621e-02,
    +       -9.71679688e-02,  4.34875488e-02, -9.81445312e-02,  1.16882324e-01,
    +        5.89904785e-02, -4.19921875e-02,  4.95910645e-02,  5.83496094e-02,
    +        3.47595215e-02, -5.87463379e-03, -7.30514526e-03,  2.92816162e-02,
    +...
    +        0.00749969, -0.01192474,  0.02719116,  0.03347778,  0.07696533,
    +        0.01409149,  0.00964355, -0.01681519, -0.0073204 ,  0.00043154,
    +       -0.04577637,  0.03591919, -0.02807617, -0.04812622], dtype=float32)]
    +Dim 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.json b/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.json new file mode 100644 index 000000000..a78c3e862 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import InstructorEmbeddingFunction\n\nef = InstructorEmbeddingFunction(\n model_name=\"hkunlp/instructor-xl\", # Defaults to `hkunlp/instructor-xl`\n query_instruction=\"Represent the question for retrieval:\",\n doc_instruction=\"Represent the document for retrieval:\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,\n -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,\n -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,\n -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,\n ...\n -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,\n 6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],\n dtype=float32)]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,\n -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,\n -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,\n -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,\n ...\n 7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,\n 1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],\n dtype=float32)]\nDim 768 (768,)\n"],"headingContent":"Instructor","anchorList":[{"label":"Instructor","href":"Instructor","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.md b/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.md new file mode 100644 index 000000000..2cc5c1e70 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-instructor.md @@ -0,0 +1,93 @@ +--- +id: embed-with-instructor.md +order: 10 +summary: >- + В этой статье описывается, как использовать функцию + InstructorEmbeddingFunction для кодирования документов и запросов с помощью + модели встраивания Instructor. +title: Instructor +--- +

    Instructor

    Instructor - это модель встраивания текста, которая может генерировать встраивания текста для любых задач (например, классификация, поиск, кластеризация, оценка текста и т.д.) и областей (например, наука, финансы и т.д.), просто предоставляя инструкцию к задаче, без какой-либо настройки.

    +

    Milvus интегрируется с моделями встраивания Instructor через класс InstructorEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью моделей встраивания Instructor и возвращает встраивания в виде плотных векторов, совместимых с индексацией Milvus.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте InstructorEmbeddingFunction:

    +
    from pymilvus.model.dense import InstructorEmbeddingFunction
    +
    +ef = InstructorEmbeddingFunction(
    +    model_name="hkunlp/instructor-xl", # Defaults to `hkunlp/instructor-xl`
    +    query_instruction="Represent the question for retrieval:",
    +    doc_instruction="Represent the document for retrieval:"
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели встраивания Mistral AI, которую следует использовать для кодирования. По умолчанию используется значение hkunlp/instructor-xl. Дополнительные сведения см. в разделе Список моделей.

    • +
    • query_instruction (строка)

      +

      Указание для конкретной задачи, которое направляет модель на то, как генерировать вложение для запроса или вопроса.

    • +
    • doc_instruction (строка)

      +

      Инструкция, которая направляет модель на создание вкраплений для документа.

    • +
    +

    Для создания вкраплений для документов используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,
    +       -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,
    +       -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,
    +       -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,
    +       ...
    +       -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,
    +        6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],
    +      dtype=float32)]
    +Dim: 768 (768,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет следующим:

    +
    Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,
    +       -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,
    +       -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,
    +       -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,
    +       ...
    +        7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,
    +        1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],
    +      dtype=float32)]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-jina.json b/localization/v2.5.x/site/ru/embeddings/embed-with-jina.json new file mode 100644 index 000000000..4cee744ff --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINAAI_API_KEY, # Provide your Jina AI API key\n task=\"retrieval.passage\", # Specify the task\n dimensions=1024, # Defaults to 1024\n)\n","\n```python\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = jina_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", jina_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([9.80641991e-02, -8.51697400e-02, 7.36531913e-02, 1.42558888e-02,\n -2.23589484e-02, 1.68494112e-03, -3.50753777e-02, -3.11530549e-02,\n -3.26012149e-02, 5.04568312e-03, 3.69836427e-02, 3.48948985e-02,\n 8.19722563e-03, 5.88679723e-02, -6.71099266e-03, -1.82369724e-02,\n...\n 2.48654783e-02, 3.43279652e-02, -1.66154150e-02, -9.90478322e-03,\n -2.96043139e-03, -8.57473817e-03, -7.39028037e-04, 6.25024503e-03,\n -1.08831357e-02, -4.00776342e-02, 3.25369164e-02, -1.42691191e-03])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = jina_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", jina_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([8.79201014e-03, 1.47551354e-02, 4.02722731e-02, -2.52991207e-02,\n 1.12719582e-02, 3.75947170e-02, 3.97946090e-02, -7.36681819e-02,\n -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,\n 5.26071340e-02, 6.75181448e-02, 3.92445624e-02, -1.40817231e-02,\n...\n 8.81703943e-03, 4.24629413e-02, -2.32944116e-02, -2.05193572e-02,\n -3.22035812e-02, 2.81896023e-03, 3.85326855e-02, 3.64372656e-02,\n -1.65050142e-02, -4.26847413e-02, 2.02664156e-02, -1.72684863e-02])]\nDim 1024 (1024,)\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINA_API_KEY, # Provide your Jina AI API key\n task=\"text-matching\",\n dimensions=1024, # Defaults to 1024\n)\n\ntexts = [\n \"Follow the white rabbit.\", # English\n \"Sigue al conejo blanco.\", # Spanish\n \"Suis le lapin blanc.\", # French\n \"跟着白兔走。\", # Chinese\n \"اتبع الأرنب الأبيض.\", # Arabic\n \"Folge dem weißen Kaninchen.\", # German\n]\n\nembeddings = jina_ef(texts)\n\n# Compute similarities\nprint(embeddings[0] @ embeddings[1].T)\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-jina.md b/localization/v2.5.x/site/ru/embeddings/embed-with-jina.md new file mode 100644 index 000000000..e4a0e502a --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-jina.md @@ -0,0 +1,130 @@ +--- +id: embed-with-jina.md +order: 8 +summary: >- + В этой статье описывается, как использовать функцию JinaEmbeddingFunction для + кодирования документов и запросов с помощью модели встраивания Jina AI. +title: Jina AI - Embed +--- +

    Jina AI

    Модели встраивания Jina AI - это высокопроизводительные модели встраивания текста, которые могут переводить текстовые данные в числовые представления, передавая семантику текста. Эти модели отлично подходят для таких задач, как плотный поиск, семантическое сходство текстов и многоязычное понимание.

    +

    Milvus интегрируется с моделями встраивания Jina AI через класс JinaEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью моделей встраивания Jina AI и возвращает вложения в виде плотных векторов, совместимых с индексацией Milvus. Чтобы воспользоваться этой функцией, получите API-ключ от Jina AI.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте JinaEmbeddingFunction:

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINAAI_API_KEY, # Provide your Jina AI API key
    +    task="retrieval.passage", # Specify the task
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели встраивания Jina AI, которую следует использовать для кодирования. Вы можете указать любое из доступных имен моделей встраивания Jina AI, например jina-embeddings-v3, jina-embeddings-v2-base-en, и т. д. Если оставить этот параметр неуказанным, будет использоваться jina-embeddings-v3. Список доступных моделей см. в разделе Jina Embeddings.

    • +
    • api_key (string)

      +

      Ключ API для доступа к API Jina AI.

    • +
    • task (строка)

      +

      Тип входных данных, передаваемых модели. Требуется для моделей встраивания v3 и выше.

      +
        +
      • "retrieval.passage": Используется для кодирования больших документов в задачах поиска на этапе индексирования.
      • +
      • "retrieval.query": Используется для кодирования пользовательских запросов или вопросов в задачах поиска.
      • +
      • "classification": : Используется для кодирования текста в задачах классификации текстов.
      • +
      • "text-matching": : Используется для кодирования текста при сопоставлении по сходству, например для измерения сходства между двумя предложениями.
      • +
      • "clustering": Используется для задач кластеризации или ранжирования.
      • +
    • +
    • dimensions (int)

      +

      Количество размерностей, которые должны иметь результирующие выходные вкрапления. По умолчанию 1024. Поддерживается только для моделей вкраплений v3 и выше.

    • +
    • late_chunking (bool)

      +

      Этот параметр определяет, использовать ли новый метод разбиения на части, представленный Jina AI в прошлом месяце, для кодирования пакета предложений. По умолчанию установлено значение False. Если установить значение True, Jina AI API объединит все предложения в поле ввода и передаст их в модель как единую строку. Внутри модель встраивает эту длинную конкатенированную строку, а затем выполняет поздний чанкинг, возвращая список вкраплений, соответствующий размеру входного списка.

    • +
    +

    Для создания вкраплений для документов используйте метод encode_documents(). Этот метод предназначен для создания вкраплений документов в задачах асимметричного поиска, таких как индексирование документов для задач поиска или рекомендаций. В качестве задания в этом методе используется retrieval.passage.

    +
    
    +```python
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = jina_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", jina_ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([9.80641991e-02, -8.51697400e-02,  7.36531913e-02,  1.42558888e-02,
    +       -2.23589484e-02,  1.68494112e-03, -3.50753777e-02, -3.11530549e-02,
    +       -3.26012149e-02,  5.04568312e-03,  3.69836427e-02,  3.48948985e-02,
    +        8.19722563e-03,  5.88679723e-02, -6.71099266e-03, -1.82369724e-02,
    +...
    +        2.48654783e-02,  3.43279652e-02, -1.66154150e-02, -9.90478322e-03,
    +       -2.96043139e-03, -8.57473817e-03, -7.39028037e-04,  6.25024503e-03,
    +       -1.08831357e-02, -4.00776342e-02,  3.25369164e-02, -1.42691191e-03])]
    +Dim: 1024 (1024,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries(). Этот метод предназначен для встраивания запросов в асимметричные задачи поиска, такие как поисковые запросы или вопросы. В качестве задания в этом методе используется retrieval.query.

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = jina_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", jina_ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([8.79201014e-03,  1.47551354e-02,  4.02722731e-02, -2.52991207e-02,
    +        1.12719582e-02,  3.75947170e-02,  3.97946090e-02, -7.36681819e-02,
    +       -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,
    +        5.26071340e-02,  6.75181448e-02,  3.92445624e-02, -1.40817231e-02,
    +...
    +        8.81703943e-03,  4.24629413e-02, -2.32944116e-02, -2.05193572e-02,
    +       -3.22035812e-02,  2.81896023e-03,  3.85326855e-02,  3.64372656e-02,
    +       -1.65050142e-02, -4.26847413e-02,  2.02664156e-02, -1.72684863e-02])]
    +Dim 1024 (1024,)
    +
    +

    Для создания вкраплений входов для сопоставления по сходству (например, в задачах STS или симметричного поиска), классификации текстов, кластеризации или ранжирования используйте соответствующее значение параметра task при инстанцировании класса JinaEmbeddingFunction.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINA_API_KEY, # Provide your Jina AI API key
    +    task="text-matching",
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +texts = [
    +    "Follow the white rabbit.",  # English
    +    "Sigue al conejo blanco.",  # Spanish
    +    "Suis le lapin blanc.",  # French
    +    "跟着白兔走。",  # Chinese
    +    "اتبع الأرنب الأبيض.",  # Arabic
    +    "Folge dem weißen Kaninchen.",  # German
    +]
    +
    +embeddings = jina_ef(texts)
    +
    +# Compute similarities
    +print(embeddings[0] @ embeddings[1].T)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.json b/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.json new file mode 100644 index 000000000..c951e2997 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import MGTEEmbeddingFunction\n\nef = MGTEEmbeddingFunction(\n model_name=\"Alibaba-NLP/gte-multilingual-base\", # Defaults to `Alibaba-NLP/gte-multilingual-base`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of embeddings\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,\n 1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,\n 2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,\n 6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,\n ...\n 2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,\n 6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,\n 1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,\n -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,\n 8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,\n ...\n 3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,\n 7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n"],"headingContent":"mGTE","anchorList":[{"label":"mGTE","href":"mGTE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.md b/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.md new file mode 100644 index 000000000..f4eeb376a --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-mgte.md @@ -0,0 +1,90 @@ +--- +id: embed-with-mgte.md +order: 13 +summary: >- + В этой статье описывается, как использовать функцию MGTEEmbeddingFunction для + кодирования документов и запросов с помощью модели встраивания mGTE. +title: mGTE +--- +

    mGTE

    mGTE - это многоязычная модель представления текста и модель реранжирования для задач текстового поиска.

    +

    Milvus интегрируется с моделью встраивания mGTE через класс MGTEEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью модели встраивания mGTE и возвращает вложения в виде плотных и разреженных векторов, совместимых с индексацией Milvus.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте MGTEEmbeddingFunction:

    +
    from pymilvus.model.hybrid import MGTEEmbeddingFunction
    +
    +ef = MGTEEmbeddingFunction(
    +    model_name="Alibaba-NLP/gte-multilingual-base", # Defaults to `Alibaba-NLP/gte-multilingual-base`
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели встраивания mGTE, которую следует использовать для кодирования. По умолчанию используется значение Alibaba-NLP/gte-multilingual-base.

    • +
    +

    Для создания вкраплений для документов используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of embeddings
    +print(ef.dim)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,
    +        1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,
    +        2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,
    +        6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,
    +        ...
    +        2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,
    +        6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 41 stored elements and shape (3, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print(ef.dim)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,
    +        1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,
    +       -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,
    +        8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,
    +        ...
    +        3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,
    +        7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 13 stored elements and shape (2, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.json b/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.json new file mode 100644 index 000000000..77004b3fc --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import MistralAIEmbeddingFunction\n\nef = MistralAIEmbeddingFunction(\n model_name=\"mistral-embed\", # Defaults to `mistral-embed`\n api_key=\"MISTRAL_API_KEY\" # Provide your Mistral AI API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,\n 0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,\n 0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,\n 0.03634644, -0.01802063])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,\n 0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,\n 0.03582764, 0.00366592])]\nDim 1024 (1024,)\n"],"headingContent":"Mistral AI","anchorList":[{"label":"Mistral AI","href":"Mistral-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.md b/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.md new file mode 100644 index 000000000..cb04fe634 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-mistral-ai.md @@ -0,0 +1,80 @@ +--- +id: embed-with-mistral-ai.md +order: 11 +summary: >- + В этой статье описывается, как использовать функцию MistralAIEmbeddingFunction + для кодирования документов и запросов с помощью модели встраивания Mistral AI. +title: Mistral AI +--- +

    Mistral AI

    Модели встраиванияMistral AI- это модели встраивания текста, предназначенные для преобразования текстовых данных в плотные числовые векторы, эффективно передающие глубинный смысл текста. Эти модели оптимизированы для таких задач, как семантический поиск, понимание естественного языка и контекстно-зависимые приложения, что делает их подходящими для широкого спектра решений на базе ИИ.

    +

    Milvus интегрируется с моделями встраивания Mistral AI через класс MistralAIEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью моделей встраивания Mistral AI и возвращает вложения в виде плотных векторов, совместимых с индексацией Milvus. Чтобы воспользоваться этой функцией, получите API-ключ от Mistral AI.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте функцию MistralAIEmbeddingFunction:

    +
    from pymilvus.model.dense import MistralAIEmbeddingFunction
    +
    +ef = MistralAIEmbeddingFunction(
    +    model_name="mistral-embed", # Defaults to `mistral-embed`
    +    api_key="MISTRAL_API_KEY" # Provide your Mistral AI API key
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели встраивания Mistral AI, которую следует использовать для кодирования. По умолчанию используется значение mistral-embed. Дополнительную информацию см. в разделе "Встраивание".

    • +
    • api_key (строка)

      +

      Ключ API для доступа к API Mistral AI.

    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,
    +       0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,
    +       0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,
    +       0.03634644, -0.01802063])]
    +Dim: 1024 (1024,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,
    +       0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,
    +       0.03582764, 0.00366592])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.json b/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.json new file mode 100644 index 000000000..cc09bcb43 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","# Before accessing the Nomic Atlas API, configure your Nomic API token\nimport nomic\nnomic.login('YOUR_NOMIC_API_KEY')\n\n# Import Nomic embedding function\nfrom pymilvus.model.dense import NomicEmbeddingFunction\n\nef = NomicEmbeddingFunction(\n model_name=\"nomic-embed-text-v1.5\", # Defaults to `mistral-embed`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,\n 6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,\n 3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,\n ...\n -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,\n -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,\n -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,\n 7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,\n -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,\n ...\n 7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,\n -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,\n -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]\nDim 768 (768,)\n"],"headingContent":"Nomic","anchorList":[{"label":"Nomic","href":"Nomic","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.md b/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.md new file mode 100644 index 000000000..b0addfbc9 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-nomic.md @@ -0,0 +1,89 @@ +--- +id: embed-with-nomic.md +order: 12 +summary: >- + В этой статье описывается, как использовать NomicEmbeddingFunction для + кодирования документов и запросов с помощью модели встраивания Nomic. +title: Nomic +--- +

    Nomic

    МоделиNomic - это серия передовых решений для встраивания текста и изображений, разработанных компанией Nomic AI и предназначенных для преобразования различных форм данных в плотные числовые векторы, передающие их семантический смысл.

    +

    Milvus интегрируется с моделями встраивания Nomic через класс NomicEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с использованием моделей встраивания Nomic и возвращает встраивания в виде плотных векторов, совместимых с индексированием Milvus. Чтобы воспользоваться этой функцией, получите API-ключ от Nomic Atlas.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте NomicEmbeddingFunction:

    +
    # Before accessing the Nomic Atlas API, configure your Nomic API token
    +import nomic
    +nomic.login('YOUR_NOMIC_API_KEY')
    +
    +# Import Nomic embedding function
    +from pymilvus.model.dense import NomicEmbeddingFunction
    +
    +ef = NomicEmbeddingFunction(
    +    model_name="nomic-embed-text-v1.5", # Defaults to `mistral-embed`
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (string)

      +

      Имя модели встраивания Nomic, которую следует использовать для кодирования. По умолчанию используется значение nomic-embed-text-v1.5. Для получения дополнительной информации обратитесь к официальной документации Nomic.

    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,
    +        6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,
    +        3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,
    +        ...
    +       -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,
    +       -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,
    +       -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]
    +Dim: 768 (768,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,
    +        7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,
    +       -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,
    +        ...
    +        7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,
    +       -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,
    +       -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-openai.json b/localization/v2.5.x/site/ru/embeddings/embed-with-openai.json new file mode 100644 index 000000000..abcf3721e --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nopenai_ef = model.dense.OpenAIEmbeddingFunction(\n model_name='text-embedding-3-large', # Specify the model name\n api_key='YOUR_API_KEY', # Provide your OpenAI API key\n dimensions=512 # Set the embedding dimensionality\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = openai_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", openai_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,\n 4.23139781e-02, -6.64533582e-03, 4.21088142e-03, 1.04644023e-01,\n 5.10009527e-02, 5.32827862e-02, -3.26061808e-02, -3.66494283e-02,\n...\n -8.93232748e-02, 6.68255147e-03, 3.55093405e-02, -5.09071983e-02,\n 3.74144339e-03, 4.72541340e-02, 2.11916920e-02, 1.00753829e-02,\n -5.76633997e-02, 9.68257990e-03, 4.62721288e-02, -4.33261096e-02])]\nDim: 512 (512,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = openai_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim\", openai_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033, 0.01635982,\n -0.03169853, -0.0033602 , 0.09047844, 0.00030747, 0.11853652,\n -0.02870182, -0.01526102, 0.05505067, 0.00993909, -0.07165466,\n...\n -9.78106782e-02, -2.22669560e-02, 1.21873049e-02, -4.83198799e-02,\n 5.32377362e-02, -1.90469325e-02, 5.62430918e-02, 1.02650477e-02,\n -6.21757433e-02, 7.88027793e-02, 4.91846527e-04, -1.51633881e-02])]\nDim 512 (512,)\n"],"headingContent":"OpenAI","anchorList":[{"label":"OpenAI","href":"OpenAI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-openai.md b/localization/v2.5.x/site/ru/embeddings/embed-with-openai.md new file mode 100644 index 000000000..626e7a896 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-openai.md @@ -0,0 +1,89 @@ +--- +id: embed-with-openai.md +order: 2 +summary: Milvus интегрируется с моделями OpenAI через класс OpenAIEmbeddingFunction. +title: OpenAI +--- +

    OpenAI

    Milvus интегрируется с моделями OpenAI с помощью класса OpenAIEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью предварительно обученных моделей OpenAI и возврата вкраплений в виде плотных векторов, совместимых с индексацией Milvus. Чтобы воспользоваться этой функциональностью, получите API-ключ от OpenAI, создав аккаунт на их платформе.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте OpenAIEmbeddingFunction:

    +
    from pymilvus import model
    +
    +openai_ef = model.dense.OpenAIEmbeddingFunction(
    +    model_name='text-embedding-3-large', # Specify the model name
    +    api_key='YOUR_API_KEY', # Provide your OpenAI API key
    +    dimensions=512 # Set the embedding dimensionality
    +)
    +
    +

    Параметры:

    +
      +
    • имя_модели(строка)

      +

      Имя модели OpenAI, которую следует использовать для кодирования. Возможные варианты: text-embedding-3-small, text-embedding-3-large и text-embedding-ada-002 (по умолчанию).

    • +
    • api_key(строка)

      +

      Ключ API для доступа к API OpenAI.

    • +
    • dimensions(int)

      +

      Количество размеров, которые должны иметь результирующие выходные вкрапления. Поддерживается только в моделях text-embedding-3 и более поздних.

    • +
    +

    Для создания вкраплений для документов используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = openai_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", openai_ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,
    +        4.23139781e-02, -6.64533582e-03,  4.21088142e-03,  1.04644023e-01,
    +        5.10009527e-02,  5.32827862e-02, -3.26061808e-02, -3.66494283e-02,
    +...
    +       -8.93232748e-02,  6.68255147e-03,  3.55093405e-02, -5.09071983e-02,
    +        3.74144339e-03,  4.72541340e-02,  2.11916920e-02,  1.00753829e-02,
    +       -5.76633997e-02,  9.68257990e-03,  4.62721288e-02, -4.33261096e-02])]
    +Dim: 512 (512,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = openai_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim", openai_ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033,  0.01635982,
    +       -0.03169853, -0.0033602 ,  0.09047844,  0.00030747,  0.11853652,
    +       -0.02870182, -0.01526102,  0.05505067,  0.00993909, -0.07165466,
    +...
    +       -9.78106782e-02, -2.22669560e-02,  1.21873049e-02, -4.83198799e-02,
    +        5.32377362e-02, -1.90469325e-02,  5.62430918e-02,  1.02650477e-02,
    +       -6.21757433e-02,  7.88027793e-02,  4.91846527e-04, -1.51633881e-02])]
    +Dim 512 (512,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.json b/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.json new file mode 100644 index 000000000..f6579139b --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(\n model_name='all-MiniLM-L6-v2', # Specify the model name\n device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = sentence_transformer_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = sentence_transformer_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-2.52114702e-02, -5.29330298e-02, 1.14570223e-02, 1.95571519e-02,\n -2.46500354e-02, -2.66519729e-02, -8.48201662e-03, 2.82961670e-02,\n -3.65092754e-02, 7.50745758e-02, 4.28900979e-02, 7.18822703e-02,\n...\n -6.76431581e-02, -6.45996556e-02, -4.67132553e-02, 4.78532910e-02,\n -2.31596199e-03, 4.13446948e-02, 1.06935494e-01, -1.08258888e-01],\n dtype=float32)]\nDim: 384 (384,)\n"],"headingContent":"Sentence Transformers","anchorList":[{"label":"Трансформаторы предложений","href":"Sentence-Transformers","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.md b/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.md new file mode 100644 index 000000000..1170d5f34 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-sentence-transform.md @@ -0,0 +1,88 @@ +--- +id: embed-with-sentence-transform.md +order: 3 +summary: >- + В этой статье показано, как использовать Sentence Transformers в Milvus для + кодирования документов и запросов в плотные векторы. +title: Трансформаторы предложений +--- +

    Трансформаторы предложений

    Milvus интегрируется с предварительно обученными моделями Sentence Transformer с помощью класса SentenceTransformerEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с помощью предварительно обученных моделей Sentence Transformer и возвращает вкрапления в виде плотных векторов, совместимых с индексацией Milvus.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте SentenceTransformerEmbeddingFunction:

    +
    from pymilvus import model
    +
    +sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
    +    model_name='all-MiniLM-L6-v2', # Specify the model name
    +    device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Параметры:

    +
      +
    • имя_модели(строка)

      +

      Имя модели Sentence Transformer, которую следует использовать для кодирования. По умолчанию используется значение all-MiniLM-L6-v2. Вы можете использовать любую из предварительно обученных моделей Sentence Transformers. Список доступных моделей см. в разделе Предварительно обученные модели.

    • +
    • устройство(строка)

      +

      Используемое устройство: cpu для CPU и cuda:n для n-го устройства GPU.

    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = sentence_transformer_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = sentence_transformer_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([-2.52114702e-02, -5.29330298e-02,  1.14570223e-02,  1.95571519e-02,
    +       -2.46500354e-02, -2.66519729e-02, -8.48201662e-03,  2.82961670e-02,
    +       -3.65092754e-02,  7.50745758e-02,  4.28900979e-02,  7.18822703e-02,
    +...
    +       -6.76431581e-02, -6.45996556e-02, -4.67132553e-02,  4.78532910e-02,
    +       -2.31596199e-03,  4.13446948e-02,  1.06935494e-01, -1.08258888e-01],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-splade.json b/localization/v2.5.x/site/ru/embeddings/embed-with-splade.json new file mode 100644 index 000000000..06db0bdf6 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-splade.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsplade_ef = model.sparse.SpladeEmbeddingFunction(\n model_name=\"naver/splade-cocondenser-selfdistil\", \n device=\"cpu\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = splade_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6392706036567688\n (0, 2034) 0.024093208834528923\n (0, 2082) 0.3230178654193878\n...\n (2, 23602) 0.5671860575675964\n (2, 26757) 0.5770265460014343\n (2, 28639) 3.1990697383880615\nSparse dim: 30522 (1, 30522)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = splade_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6353746056556702\n (0, 2194) 0.015553371049463749\n (0, 2301) 0.2756537199020386\n...\n (1, 18522) 0.1282549500465393\n (1, 23602) 0.13133203983306885\n (1, 28639) 2.8150033950805664\nSparse dim: 30522 (1, 30522)\n"],"headingContent":"SPLADE","anchorList":[{"label":"SPLADE","href":"SPLADE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-splade.md b/localization/v2.5.x/site/ru/embeddings/embed-with-splade.md new file mode 100644 index 000000000..a31c51ec9 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-splade.md @@ -0,0 +1,89 @@ +--- +id: embed-with-splade.md +order: 6 +summary: >- + В этой статье описывается, как использовать функцию SpladeEmbeddingFunction + для кодирования документов и запросов с помощью модели SPLADE. +title: SPLADE +--- +

    SPLADE

    SPLADE embedding - это модель, которая предлагает очень разреженные представления для документов и запросов, наследуя желаемые свойства от моделей bag-of-words (BOW), такие как точное соответствие терминов и эффективность.

    +

    Milvus интегрируется с моделью SPLADE через класс SpladeEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов и возврата вкраплений в виде разреженных векторов, совместимых с индексацией Milvus.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Чтобы инстанцировать SpladeEmbeddingFunction, используйте команду:

    +
    from pymilvus import model
    +
    +splade_ef = model.sparse.SpladeEmbeddingFunction(
    +    model_name="naver/splade-cocondenser-selfdistil", 
    +    device="cpu"
    +)
    +
    +

    Параметры:

    +
      +
    • имя_модели(строка)

      +

      Имя модели SPLADE, которую следует использовать для кодирования. Возможные варианты: naver/splade-cocondenser-ensembledistil (по умолчанию), naver/splade_v2_max, naver/splade_v2_distil и naver/splade-cocondenser-selfdistil. Дополнительные сведения см. в разделе Игра с моделями.

    • +
    • устройство(строка)

      +

      Используемое устройство, с cpu для CPU и cuda:n для n-го устройства GPU.

    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = splade_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Embeddings:   (0, 2001) 0.6392706036567688
    +  (0, 2034) 0.024093208834528923
    +  (0, 2082) 0.3230178654193878
    +...
    +  (2, 23602)    0.5671860575675964
    +  (2, 26757)    0.5770265460014343
    +  (2, 28639)    3.1990697383880615
    +Sparse dim: 30522 (1, 30522)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = splade_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings:   (0, 2001)        0.6353746056556702
    +  (0, 2194)        0.015553371049463749
    +  (0, 2301)        0.2756537199020386
    +...
    +  (1, 18522)        0.1282549500465393
    +  (1, 23602)        0.13133203983306885
    +  (1, 28639)        2.8150033950805664
    +Sparse dim: 30522 (1, 30522)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.json b/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.json new file mode 100644 index 000000000..ba7547304 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import VoyageEmbeddingFunction\n\nvoyage_ef = VoyageEmbeddingFunction(\n model_name=\"voyage-3\", # Defaults to `voyage-3`\n api_key=VOYAGE_API_KEY # Provide your Voyage API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = voyage_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", voyage_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,\n 0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,\n 0.03349845, 0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,\n 0.07658645, 0.03064499])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = voyage_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", voyage_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,\n 0.04493361, 0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,\n 0.05706626, 0.0263358 ])]\nDim 1024 (1024,)\n"],"headingContent":"Voyage","anchorList":[{"label":"Voyage","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.md b/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.md new file mode 100644 index 000000000..a5d819498 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embed-with-voyage.md @@ -0,0 +1,77 @@ +--- +id: embed-with-voyage.md +order: 7 +summary: >- + В этой статье описывается, как использовать функцию VoyageEmbeddingFunction + для кодирования документов и запросов с помощью модели Voyage. +title: Embed Voyage +--- +

    Voyage

    Milvus интегрируется с моделями Voyage с помощью класса VoyageEmbeddingFunction. Этот класс предоставляет методы для кодирования документов и запросов с использованием моделей Voyage и возврата вкраплений в виде плотных векторов, совместимых с индексацией Milvus. Чтобы воспользоваться этой функцией, получите API-ключ от Voyage, создав учетную запись на их платформе.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте VoyageEmbeddingFunction:

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +
    +voyage_ef = VoyageEmbeddingFunction(
    +    model_name="voyage-3", # Defaults to `voyage-3`
    +    api_key=VOYAGE_API_KEY # Provide your Voyage API key
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (string) Имя модели Voyage, которую необходимо использовать для кодирования. Вы можете указать любое из доступных имен моделей Voyage, например, voyage-3-lite, voyage-finance-2, и т. д. Если оставить этот параметр неуказанным, будет использоваться модель voyage-3. Список доступных моделей см. в официальной документации Voyage.
    • +
    • api_key (строка) API-ключ для доступа к API Voyage. Информацию о том, как создать API-ключ, см. в разделе API-ключ и Python-клиент.
    • +
    +

    Чтобы создать вкрапления для документов, используйте метод encode_documents():

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = voyage_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", voyage_ef.dim, docs_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,
    +        0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,
    +        0.03349845,  0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,
    +        0.07658645,  0.03064499])]
    +Dim: 1024 (1024,)
    +
    +

    Для создания вкраплений для запросов используйте метод encode_queries():

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = voyage_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", voyage_ef.dim, query_embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,
    +        0.04493361,  0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,
    +        0.05706626,  0.0263358 ])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/ru/embeddings/embeddings.json b/localization/v2.5.x/site/ru/embeddings/embeddings.json new file mode 100644 index 000000000..70affd878 --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embeddings.json @@ -0,0 +1 @@ +{"codeList":["pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# This will download \"all-MiniLM-L6-v2\", a light weight model.\nef = model.DefaultEmbeddingFunction()\n\n# Data from which embeddings are to be generated \ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nembeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import (\n utility,\n FieldSchema, CollectionSchema, DataType,\n Collection, AnnSearchRequest, RRFRanker, connections,\n)\n","# 1. prepare a small corpus to search\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\nquery = \"Who started AI research?\"\n\n# BGE-M3 model can embed texts as dense and sparse vectors.\n# It is included in the optional `model` module in pymilvus, to install it,\n# simply run \"pip install pymilvus[model]\".\n\nbge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\n\ndocs_embeddings = bge_m3_ef(docs)\nquery_embeddings = bge_m3_ef([query])\n"],"headingContent":"Embedding Overview","anchorList":[{"label":"Обзор встраивания","href":"Embedding-Overview","type":1,"isActive":false},{"label":"Пример 1: Использование функции встраивания по умолчанию для генерации плотных векторов","href":"Example-1-Use-default-embedding-function-to-generate-dense-vectors","type":2,"isActive":false},{"label":"Пример 2: Генерация плотных и разреженных векторов за один вызов с помощью модели BGE M3","href":"Example-2-Generate-dense-and-sparse-vectors-in-one-call-with-BGE-M3-model","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/embeddings/embeddings.md b/localization/v2.5.x/site/ru/embeddings/embeddings.md new file mode 100644 index 000000000..95b65705f --- /dev/null +++ b/localization/v2.5.x/site/ru/embeddings/embeddings.md @@ -0,0 +1,143 @@ +--- +id: embeddings.md +order: 1 +summary: 'Узнайте, как генерировать вкрапления для ваших данных.' +title: Обзор встраивания +--- +

    Обзор встраивания

    Встраивание - это концепция машинного обучения для отображения данных в высокоразмерном пространстве, где данные с похожей семантикой располагаются близко друг к другу. Обычно это глубокая нейронная сеть из семейства BERT или других трансформаторов, модель встраивания может эффективно представлять семантику текста, изображений и других типов данных с помощью ряда чисел, известных как векторы. Ключевой особенностью этих моделей является то, что математическое расстояние между векторами в высокоразмерном пространстве может указывать на сходство семантики исходного текста или изображения. Это свойство открывает множество возможностей для поиска информации, таких как веб-поисковые системы Google и Bing, поиск товаров и рекомендаций на сайтах электронной коммерции, а также недавно популярная парадигма Retrieval Augmented Generation (RAG) в генеративном ИИ.

    +

    Существует две основные категории вкраплений, каждая из которых дает свой тип вектора:

    +
      +
    • Плотное встраивание: Большинство моделей встраивания представляют информацию в виде вектора с плавающей точкой, имеющего от сотен до тысяч измерений. Выходные данные называются "плотными" векторами, поскольку большинство измерений имеют ненулевые значения. Например, популярная модель встраивания с открытым исходным кодом BAAI/bge-base-en-v1.5 выводит векторы из 768 чисел с плавающей точкой (768-dimension float vector).

    • +
    • Разреженное встраивание: В отличие от этого, выходные векторы разреженных вкраплений имеют большинство размерностей, равных нулю, а именно "разреженные" векторы. Эти векторы часто имеют гораздо большую размерность (десятки тысяч и более), которая определяется размером словаря лексем. Разреженные векторы могут быть сгенерированы глубокими нейронными сетями или статистическим анализом текстовых корпораций. Благодаря своей интерпретируемости и лучшим возможностям обобщения за пределы области, разреженные вкрапления все чаще используются разработчиками в качестве дополнения к плотным вкраплениям.

    • +
    +

    Milvus - это векторная база данных, предназначенная для управления, хранения и поиска векторных данных. Благодаря интеграции основных моделей встраивания и ранжирования вы можете легко преобразовать исходный текст в векторы, пригодные для поиска, или ранжировать результаты с помощью мощных моделей для получения более точных результатов RAG. Эта интеграция упрощает преобразование текста и устраняет необходимость в дополнительных компонентах встраивания или ранжирования, тем самым упрощая разработку и проверку RAG.

    +

    Чтобы увидеть, как создаются вкрапления в действии, обратитесь к разделу Использование модели PyMilvus для генерации вкраплений текста.

    + + + + + + + + + + + + + + + + + +
    Функция встраиванияТипAPI или открытый источник
    openaiПлотныйAPI
    преобразователь предложенийПлотныйОткрытый источник
    SpladeSparseОткрытый источник
    bge-m3ГибридОткрытый ресурс
    voyageaiПлотныйAPI
    jinaПлотныйAPI
    cohereПлотныйAPI
    ИнструкторDenseОткрытый ресурс
    Мистраль ИИDenseAPI
    NomicПлотныйAPI
    mGTEГибридОткрытый ресурс
    +

    Пример 1: Использование функции встраивания по умолчанию для генерации плотных векторов

    Чтобы использовать функции встраивания в Milvus, сначала установите клиентскую библиотеку PyMilvus с подпакетом model, который содержит все утилиты для генерации встраивания.

    +
    pip install "pymilvus[model]"
    +
    +

    Подпакет model поддерживает различные модели встраивания, от OpenAI, Sentence Transformers, BGE M3 до предварительно обученных моделей SPLADE. Для простоты в данном примере используется DefaultEmbeddingFunction, который представляет собой модель трансформатора предложений All-MiniLM-L6-v2. Модель занимает около 70 МБ и будет загружена при первом использовании:

    +
    from pymilvus import model
    +
    +# This will download "all-MiniLM-L6-v2", a light weight model.
    +ef = model.DefaultEmbeddingFunction()
    +
    +# Data from which embeddings are to be generated 
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, embeddings[0].shape)
    +
    +

    Ожидаемый результат похож на следующий:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    Пример 2: Генерация плотных и разреженных векторов за один вызов с помощью модели BGE M3

    В этом примере мы используем гибридную модель BGE M3 для встраивания текста в плотные и разреженные векторы и использования их для извлечения релевантных документов. Общие действия выглядят следующим образом:

    +
      +
    1. Встраивание текста в плотные и разреженные векторы с помощью модели BGE-M3;

    2. +
    3. Создание коллекции Milvus для хранения плотных и разреженных векторов;

    4. +
    5. Вставка данных в Milvus;

    6. +
    7. Поиск и проверка результатов.

    8. +
    +

    Сначала нам нужно установить необходимые зависимости.

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import (
    +    utility,
    +    FieldSchema, CollectionSchema, DataType,
    +    Collection, AnnSearchRequest, RRFRanker, connections,
    +)
    +
    +

    Используйте BGE M3 для кодирования документов и запросов для поиска по вставке.

    +
    # 1. prepare a small corpus to search
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +query = "Who started AI research?"
    +
    +# BGE-M3 model can embed texts as dense and sparse vectors.
    +# It is included in the optional `model` module in pymilvus, to install it,
    +# simply run "pip install pymilvus[model]".
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +
    +docs_embeddings = bge_m3_ef(docs)
    +query_embeddings = bge_m3_ef([query])
    +
    diff --git a/localization/v2.5.x/site/ru/faq/operational_faq.json b/localization/v2.5.x/site/ru/faq/operational_faq.json new file mode 100644 index 000000000..2049370d8 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/operational_faq.json @@ -0,0 +1 @@ +{"codeList":["{\n \"registry-mirrors\": [\"https://registry.docker-cn.com\"]\n}\n","$ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512\n","pip install pymilvus>=2.4.2\n","# Python Example: result of len() str cannot be used as \"max-length\" in Milvus \n>>> s = \"你好,世界!\"\n>>> len(s) # Number of characters of s.\n6\n>>> len(bytes(s, \"utf-8\")) # Size in bytes of s, max-length in Milvus.\n18\n","pip install pymilvus>=2.4.2\n"],"headingContent":"Operational FAQ","anchorList":[{"label":"Часто задаваемые вопросы по эксплуатации","href":"Operational-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/faq/operational_faq.md b/localization/v2.5.x/site/ru/faq/operational_faq.md new file mode 100644 index 000000000..a57530027 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/operational_faq.md @@ -0,0 +1,107 @@ +--- +id: operational_faq.md +summary: Найдите ответы на часто задаваемые вопросы о работе в Милвусе. +title: Часто задаваемые вопросы по эксплуатации +--- +

    Часто задаваемые вопросы по эксплуатации

    Что делать, если мне не удалось извлечь образ Milvus Docker из Docker Hub?

    Если вам не удалось извлечь образ Milvus Docker из Docker Hub, попробуйте добавить другие зеркала реестра.

    +

    Пользователи из материкового Китая могут добавить URL "https://registry.docker-cn.com" в массив registry-mirrors в файле /etc.docker/daemon.json.

    +
    {
    +  "registry-mirrors": ["https://registry.docker-cn.com"]
    +}
    +
    +

    Является ли Docker единственным способом установки и запуска Milvus?

    Docker - это эффективный способ развертывания Milvus, но не единственный. Вы также можете развернуть Milvus из исходного кода. Для этого требуется Ubuntu (18.04 или выше) или CentOS (7 или выше). Дополнительные сведения см. в разделе "Сборка Milvus из исходного кода".

    +

    Какие основные факторы влияют на отзыв?

    На отзыв в основном влияют тип индекса и параметры поиска.

    +

    Для FLAT-индекса Milvus выполняет исчерпывающее сканирование внутри коллекции со 100-процентным возвратом.

    +

    Для индексов IVF параметр nprobe определяет объем поиска в коллекции. Увеличение параметра nprobe увеличивает долю искомых векторов и возврат, но снижает производительность запроса.

    +

    Для индекса HNSW параметр ef определяет широту поиска в графе. Увеличение ef увеличивает количество искомых точек на графе и запоминание, но снижает производительность запроса.

    +

    Дополнительные сведения см. в разделе Векторное индексирование.

    +

    Почему мои изменения в конфигурационных файлах не вступили в силу?

    Milvus не поддерживает изменение конфигурационных файлов во время выполнения. Чтобы изменения в файлах конфигурации вступили в силу, необходимо перезапустить Milvus Docker.

    +

    Как узнать, что Milvus успешно запустился?

    Если Milvus запущен с помощью Docker Compose, запустите docker ps, чтобы посмотреть, сколько контейнеров Docker запущено, и проверить, правильно ли запущены службы Milvus.

    +

    Для автономного Milvus вы должны наблюдать как минимум три запущенных Docker-контейнера, один из которых - служба Milvus, а два других - служба управления и хранения etcd. Для получения дополнительной информации см. раздел Установка Milvus Standalone.

    +

    Почему время в файлах журнала отличается от системного времени?

    Разница во времени обычно связана с тем, что хост-машина не использует универсальное координированное время (UTC).

    +

    В файлах журнала внутри образа Docker по умолчанию используется UTC. Если на вашей хост-машине не используется UTC, может возникнуть такая проблема.

    +

    Как узнать, поддерживает ли мой процессор Milvus?

    Вычислительные операции Milvus зависят от поддержки процессором набора инструкций расширения SIMD (Single Instruction, Multiple Data). Поддержка вашим процессором набора инструкций расширения SIMD имеет решающее значение для построения индексов и поиска векторного сходства в Milvus. Убедитесь, что ваш процессор поддерживает хотя бы один из следующих наборов инструкций SIMD:

    +
      +
    • SSE4.2
    • +
    • AVX
    • +
    • AVX2
    • +
    • AVX512
    • +
    +

    Выполните команду lscpu, чтобы проверить, поддерживает ли ваш процессор указанные выше наборы SIMD-инструкций:

    +
    $ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512
    +
    +

    Почему Milvus возвращает illegal instruction при запуске?

    Milvus требует, чтобы ваш процессор поддерживал набор SIMD-инструкций: SSE4.2, AVX, AVX2 или AVX512. Для нормальной работы Milvus процессор должен поддерживать хотя бы одну из них. Ошибка illegal instruction, возвращаемая при запуске, указывает на то, что ваш процессор не поддерживает ни один из четырех вышеперечисленных наборов инструкций.

    +

    См. раздел Поддержка процессором набора инструкций SIMD.

    +

    Могу ли я установить Milvus на Windows?

    Да. Вы можете установить Milvus на Windows, скомпилировав его из исходного кода или из бинарного пакета.

    +

    О том, как установить Milvus на Windows, читайте в разделе Запуск Milvus на Windows.

    +

    Я получил ошибку при установке pymilvus на Windows. Что мне делать?

    Не рекомендуется устанавливать PyMilvus на Windows. Но если вам нужно установить PyMilvus на Windows, но вы получили ошибку, попробуйте установить его в среде Conda. Дополнительные сведения о том, как установить PyMilvus в среду Conda, см. в разделе Установка Milvus SDK.

    +

    Могу ли я установить Milvus, отключившись от Интернета?

    Да. Вы можете установить Milvus в автономном окружении. Дополнительные сведения см. в разделе Установка Milvus в автономном режиме.

    +

    Где я могу найти журналы, сгенерированные Milvus?

    По умолчанию журнал Milvus печатается в stout (стандартный вывод) и stderr (стандартная ошибка), однако мы настоятельно рекомендуем перенаправлять журнал на постоянный том в производстве. Для этого обновите log.file.rootPath в milvus.yaml. Если вы развертываете Milvus с графиком milvus-helm, вам также необходимо сначала включить персистентность журнала через --set log.persistence.enabled=true.

    +

    Если вы не меняли конфигурацию, то найти журнал можно с помощью kubectl logs <pod-name> или docker logs CONTAINER.

    +

    Могу ли я создать индекс для сегмента перед вставкой в него данных?

    Да, можно. Но мы рекомендуем вставлять данные партиями, каждая из которых не должна превышать 256 МБ, перед индексацией каждого сегмента.

    +

    Могу ли я использовать один экземпляр etcd совместно с несколькими экземплярами Milvus?

    Да, вы можете использовать один экземпляр etcd совместно с несколькими экземплярами Milvus. Для этого вам нужно изменить etcd.rootPath на отдельное значение для каждого экземпляра Milvus в конфигурационных файлах каждого из них перед их запуском.

    +

    Могу ли я разделить экземпляр Pulsar между несколькими экземплярами Milvus?

    Да, вы можете использовать один экземпляр Pulsar совместно с несколькими экземплярами Milvus. Для этого вы можете

    +
      +
    • Если на экземпляре Pulsar включена многопользовательская среда, выделите для каждого экземпляра Milvus отдельного арендатора или пространство имен. Для этого перед запуском необходимо изменить pulsar.tenant или pulsar.namespace в конфигурационных файлах экземпляров Milvus на уникальное значение для каждого из них.
    • +
    • Если вы не планируете включать многопользовательский режим на экземпляре Pulsar, перед запуском следует изменить msgChannel.chanNamePrefix.cluster в конфигурационных файлах экземпляров Milvus на уникальное значение для каждого из них.
    • +
    +

    Могу ли я разделить экземпляр MinIO между несколькими экземплярами Milvus?

    Да, вы можете разделить экземпляр MinIO между несколькими экземплярами Milvus. Для этого вам нужно изменить minio.rootPath на уникальное значение для каждого экземпляра Milvus в конфигурационных файлах каждого из них перед запуском.

    +

    Как мне справиться с сообщением об ошибке pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>?

    Сообщение об ошибке Illegal uri [example.db] указывает на то, что вы пытаетесь подключиться к Milvus Lite, используя более раннюю версию PyMilvus, которая не поддерживает этот тип соединения. Чтобы решить эту проблему, обновите свою установку PyMilvus как минимум до версии 2.4.2, которая включает поддержку подключения к Milvus Lite.

    +

    Обновить PyMilvus можно с помощью следующей команды:

    +
    pip install pymilvus>=2.4.2
    +
    +

    Почему я получаю меньше результатов, чем limit, которые я задал в своем поиске/запросе?

    Есть несколько причин, по которым вы можете получить меньше результатов, чем указанный вами limit:

    +
      +
    • Ограниченные данные: В коллекции может быть недостаточно сущностей, чтобы выполнить запрошенный вами лимит. Если общее количество сущностей в коллекции меньше установленного лимита, вы, естественно, получите меньше результатов.

    • +
    • Дублирование первичных ключей: Milvus отдает приоритет определенным сущностям, когда во время поиска встречаются дубликаты первичных ключей. Это поведение зависит от типа поиска:

    • +
    • Запрос (точное совпадение): Milvus выбирает последнюю сущность с совпадающим PK. ANN Search: Milvus выбирает сущность с наибольшим показателем сходства, даже если сущности имеют одинаковый PK. Такая расстановка приоритетов может привести к получению меньшего количества уникальных результатов, чем предел, если в вашей коллекции много дублирующихся первичных ключей.

    • +
    • Недостаточное количество совпадений: Выражения фильтрации поиска могут быть слишком строгими, в результате чего меньшее количество сущностей соответствует порогу сходства. Если условия поиска слишком строгие, то совпадет недостаточно сущностей, что приведет к меньшему количеству результатов, чем ожидалось.

    • +
    +

    MilvusClient("milvus_demo.db") gives an error: ModuleNotFoundError: No module named 'milvus_lite'. Что вызывает эту ошибку и как ее решить?

    Эта ошибка возникает при попытке использовать Milvus Lite на платформе Windows. Milvus Lite в основном разработан для Linux и может не иметь встроенной поддержки Windows.

    +

    Решение заключается в использовании среды Linux:

    +
      +
    • Используйте операционную систему на базе Linux или виртуальную машину для запуска Milvus Lite.
    • +
    • Такой подход обеспечит совместимость с зависимостями и функциональностью библиотеки.
    • +
    +

    Что такое ошибки "длина превышает максимальную" в Milvus, и как их понять и устранить?

    Ошибки "Длина превышает максимальную длину" в Milvus возникают, когда размер элемента данных превышает максимально допустимый размер для коллекции или поля. Вот несколько примеров и объяснений:

    +
      +
    • Ошибка поля JSON: <MilvusException: (code=1100, message=the length (398324) of json field (metadata) exceeds max length (65536): expected=valid length json string, actual=length exceeds max length: invalid parameter)>

    • +
    • Ошибка длины строки: <ParamError: (code=1, message=invalid input, length of string exceeds max length. length: 74238, max length: 60535)>

    • +
    • Ошибка поля VarChar: <MilvusException: (code=1100, message=the length (60540) of 0th VarChar paragraph exceeds max length (0)%!(EXTRA int64=60535): invalid parameter)>

    • +
    +

    Чтобы понять и устранить эти ошибки:

    +
      +
    • Поймите, что len(str) в Python обозначает количество символов, а не размер в байтах.
    • +
    • Для строковых типов данных, таких как VARCHAR и JSON, используйте len(bytes(str, encoding='utf-8')) для определения фактического размера в байтах, что и используется Milvus для "max-length".
    • +
    +

    Пример на языке Python:

    +
    # Python Example: result of len() str cannot be used as "max-length" in Milvus 
    +>>> s = "你好,世界!"
    +>>> len(s) # Number of characters of s.
    +6
    +>>> len(bytes(s, "utf-8")) # Size in bytes of s, max-length in Milvus.
    +18
    +
    +

    pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>. Что вызывает эту ошибку и как ее решить?

    Эта ошибка указывает на то, что вы пытаетесь подключиться к Milvus Lite, используя более раннюю версию pymilvus, которая не поддерживает его. Чтобы решить эту проблему, обновите свою установку pymilvus, по крайней мере, до версии 2.4.2. Эта версия поддерживает подключение к Milvus Lite. Для обновления используйте следующую команду:

    +
    pip install pymilvus>=2.4.2
    +
    +

    У вас остались вопросы?

    Вы можете:

    +
      +
    • Ознакомиться с Milvus на GitHub. Не стесняйтесь задавать вопросы, делиться идеями и помогать другим.
    • +
    • Присоединяйтесь к нашему форуму Milvus или каналу Slack, чтобы получить поддержку и взаимодействовать с нашим сообществом разработчиков с открытым исходным кодом.
    • +
    diff --git a/localization/v2.5.x/site/ru/faq/performance_faq.json b/localization/v2.5.x/site/ru/faq/performance_faq.json new file mode 100644 index 000000000..bd72ae4be --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/performance_faq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Performance FAQ","anchorList":[{"label":"FAQ по производительности","href":"Performance-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/faq/performance_faq.md b/localization/v2.5.x/site/ru/faq/performance_faq.md new file mode 100644 index 000000000..1393d9815 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/performance_faq.md @@ -0,0 +1,52 @@ +--- +id: performance_faq.md +summary: >- + Найдите ответы на часто задаваемые вопросы о производительности поиска, + улучшении производительности и других проблемах, связанных с + производительностью. +title: FAQ по производительности +--- +

    FAQ по производительности

    Как установить nlist и nprobe для индексов ЭКО?

    Настройка nlist зависит от конкретного сценария. Как правило, рекомендуемое значение nlist равно 4 × sqrt(n), где n - общее количество сущностей в сегменте.

    +

    Размер каждого сегмента определяется параметром datacoord.segment.maxSize, который по умолчанию установлен на 512 МБ. Общее количество сущностей в сегменте n можно определить, разделив datacoord.segment.maxSize на размер каждой сущности.

    +

    Настройка параметра nprobe зависит от набора данных и сценария и предполагает компромисс между точностью и производительностью запроса. Мы рекомендуем найти идеальное значение путем многократных экспериментов.

    +

    На следующих диаграммах представлены результаты теста, проведенного на наборе данных sift50m и индексе IVF_SQ8, в котором сравниваются показатели запоминания и производительности запросов для различных пар nlist/nprobe.

    +

    + + Accuracy test + Тест на точность Performance testТест на производительность

    +

    Почему на небольших наборах данных запросы иногда выполняются дольше?

    Операции запроса выполняются на сегментах. Индексы сокращают время, необходимое для запроса сегмента. Если сегмент не проиндексирован, Milvus прибегает к грубому поиску по исходным данным, что резко увеличивает время запроса.

    +

    Таким образом, запрос к небольшому набору данных (коллекции) обычно занимает больше времени, поскольку индекс не был создан. Это происходит потому, что размеры ее сегментов не достигли порога построения индекса, установленного на rootCoord.minSegmentSizeToEnableindex. Вызовите create_index(), чтобы заставить Milvus индексировать сегменты, которые достигли порога, но еще не были автоматически проиндексированы, что значительно повысит производительность запросов.

    +

    Какие факторы влияют на использование процессора?

    Использование ЦП увеличивается, когда Milvus строит индексы или выполняет запросы. В целом построение индексов требует больших затрат ЦП, за исключением использования Annoy, который работает в один поток.

    +

    При выполнении запросов на использование ЦП влияют nq и nprobe. Когда nq и nprobe невелики, параллелизм незначителен и загрузка процессора остается низкой.

    +

    Влияет ли одновременная вставка данных и поиск на производительность запросов?

    Операции вставки не требуют больших затрат ЦП. Однако, поскольку новые сегменты могут не достигнуть порога для построения индекса, Milvus прибегает к поиску методом грубой силы, что значительно влияет на производительность запроса.

    +

    Параметр rootcoord.minSegmentSizeToEnableIndex определяет порог построения индекса для сегмента и по умолчанию установлен на 1024 строки. Дополнительные сведения см. в разделе Конфигурация системы.

    +

    Может ли индексирование поля VARCHAR повысить скорость удаления?

    Индексирование поля VARCHAR может ускорить операции "Удаление по выражению", но только при определенных условиях:

    +
      +
    • ИНВЕРТИРОВАННЫЙ индекс: Этот индекс помогает при использовании IN или == выражений для полей VARCHAR, не являющихся первичными ключами.
    • +
    • Тройной индекс: Этот индекс помогает при префиксных запросах (например, LIKE prefix%) на непервичных полях VARCHAR.
    • +
    +

    Однако индексирование поля VARCHAR не ускоряет работу:

    +
      +
    • Удаление по идентификаторам: Когда поле VARCHAR является первичным ключом.
    • +
    • Несвязанные выражения: Когда поле VARCHAR не является частью выражения удаления.
    • +
    +

    У вас остались вопросы?

    Вы можете:

    +
      +
    • Проверить Milvus на GitHub. Не стесняйтесь задавать вопросы, делиться идеями и помогать другим.
    • +
    • Присоединяйтесь к нашему каналу Slack, чтобы найти поддержку и взаимодействовать с нашим сообществом разработчиков с открытым исходным кодом.
    • +
    diff --git a/localization/v2.5.x/site/ru/faq/product_faq.json b/localization/v2.5.x/site/ru/faq/product_faq.json new file mode 100644 index 000000000..a154e6a22 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/product_faq.json @@ -0,0 +1 @@ +{"codeList":["60 * 2 * 4 + 40 * 1 * 12 = 960\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n"],"headingContent":"Product FAQ","anchorList":[{"label":"Часто задаваемые вопросы о продукте","href":"Product-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/faq/product_faq.md b/localization/v2.5.x/site/ru/faq/product_faq.md new file mode 100644 index 000000000..c795cea84 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/product_faq.md @@ -0,0 +1,102 @@ +--- +id: product_faq.md +summary: >- + Найдите ответы на часто задаваемые вопросы о самой передовой в мире базе + данных векторов. +title: Часто задаваемые вопросы о продукте +--- +

    Часто задаваемые вопросы о продукте

    Сколько стоит Milvus?

    Milvus - это 100% бесплатный проект с открытым исходным кодом.

    +

    Пожалуйста, придерживайтесь лицензии Apache License 2.0 при использовании Milvus для производства или распространения.

    +

    Компания Zilliz, стоящая за Milvus, также предлагает полностью управляемую облачную версию платформы для тех, кто не хочет создавать и поддерживать свой собственный распределенный экземпляр. Zilliz Cloud автоматически поддерживает надежность данных и позволяет пользователям платить только за то, что они используют.

    +

    Поддерживает ли Milvus архитектуры, отличные от x86?

    Milvus нельзя установить или запустить на платформах, не поддерживающих архитектуру x86.

    +

    Для работы Milvus ваш процессор должен поддерживать один из следующих наборов инструкций: SSE4.2, AVX, AVX2, AVX512. Это все наборы SIMD-инструкций, предназначенные для x86.

    +

    Где Milvus хранит данные?

    Milvus имеет дело с двумя типами данных - вставленными данными и метаданными.

    +

    Вставленные данные, включая векторные данные, скалярные данные и специфическую схему коллекции, хранятся в постоянном хранилище в виде инкрементного журнала. Milvus поддерживает множество бэкендов объектных хранилищ, включая MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS и Tencent Cloud Object Storage (COS).

    +

    Метаданные генерируются внутри Milvus. Каждый модуль Milvus имеет свои собственные метаданные, которые хранятся в etcd.

    +

    Почему в etcd нет векторных данных?

    В etcd хранятся метаданные модуля Milvus; в MinIO хранятся сущности.

    +

    Поддерживает ли Milvus одновременную вставку и поиск данных?

    Да. Операции вставки и запросы обрабатываются двумя отдельными модулями, которые взаимно независимы. С точки зрения клиента, операция вставки завершается, когда вставленные данные попадают в очередь сообщений. Однако вставленные данные не доступны для поиска до тех пор, пока они не будут загружены в узел запроса. Если размер сегмента не достигает порога построения индекса (512 МБ по умолчанию), Milvus прибегает к грубому поиску, и производительность запросов может снизиться.

    +

    Можно ли вставлять в Milvus векторы с дублирующимися первичными ключами?

    Да. Milvus не проверяет, являются ли первичные ключи векторов дубликатами.

    +

    При вставке векторов с дублирующимися первичными ключами Milvus рассматривает это как операцию обновления?

    Нет. В настоящее время Milvus не поддерживает операции обновления и не проверяет, являются ли первичные ключи сущностей дубликатами. Вы отвечаете за то, чтобы первичные ключи сущностей были уникальными, и если это не так, то Milvus может содержать несколько сущностей с дублирующимися первичными ключами.

    +

    В этом случае неизвестно, какая копия данных будет возвращена при запросе. Это ограничение будет исправлено в будущих релизах.

    +

    Какова максимальная длина самоопределяемых первичных ключей сущностей?

    Первичные ключи сущностей должны быть неотрицательными 64-битными целыми числами.

    +

    Какой максимальный объем данных может быть добавлен за одну операцию вставки?

    Размер операции вставки не должен превышать 1 024 МБ. Это ограничение, накладываемое gRPC.

    +

    Влияет ли размер коллекции на производительность запроса при поиске в определенном разделе?

    Нет. Если разделы для поиска указаны, Milvus выполняет поиск только в указанных разделах.

    +

    Это зависит от того, какие данные нужны для поиска. Перед поиском необходимо загрузить все разделы, которые могут появиться в результатах поиска.

    +
      +
    • Например, если вы хотите найти только определенный раздел (разделы), вам не нужно загружать все разделы. Вызовите load_partition(), чтобы загрузить нужный раздел (разделы) , а затем укажите раздел (разделы) в вызове метода search().
    • +
    • Если вы хотите выполнить поиск во всех разделах, вызовите load_collection(), чтобы загрузить всю коллекцию, включая все разделы.
    • +
    • Если вы не загрузите коллекцию или конкретный раздел(ы) перед поиском, Milvus вернет ошибку.
    • +
    +

    Можно ли создавать индексы после вставки векторов?

    Да. Если ранее для коллекции был создан индекс по адресу create_index(), Milvus автоматически создаст индекс для последующих вставленных векторов. Однако Milvus не строит индекс до тех пор, пока вновь вставленные векторы не заполнят весь сегмент, а вновь созданный индексный файл не будет отделен от предыдущего.

    +

    Чем отличаются индексы FLAT и IVF_FLAT?

    Индекс IVF_FLAT делит векторное пространство на кластеры списка. При значении списка по умолчанию 16 384, Milvus сравнивает расстояния между целевым вектором и центроидами всех 16 384 кластеров, чтобы вернуть ближайшие кластеры. Затем Milvus сравнивает расстояния между целевым вектором и векторами в выбранных кластерах, чтобы получить ближайшие векторы. В отличие от IVF_FLAT, FLAT напрямую сравнивает расстояния между целевым вектором и каждым другим вектором.

    +

    Когда общее количество векторов приблизительно равно nlist, между IVF_FLAT и FLAT существует небольшое расстояние с точки зрения требований к вычислениям и производительности поиска. Однако когда число векторов превышает nlist в два и более раз, IVF_FLAT начинает демонстрировать преимущества в производительности.

    +

    Дополнительные сведения см. в разделе "Векторный индекс".

    +

    Как Milvus промывает данные?

    Milvus возвращает успешный результат, когда вставленные данные попадают в очередь сообщений. Однако данные еще не выгружены на диск. Затем узел данных Milvus записывает данные в очереди сообщений в постоянное хранилище в виде инкрементных журналов. Если вызвать flush(), то узел данных будет вынужден немедленно записать все данные в очереди сообщений в постоянное хранилище.

    +

    Что такое нормализация? Зачем нужна нормализация?

    Нормализация - это процесс преобразования вектора таким образом, чтобы его норма была равна 1. Если для вычисления сходства векторов используется внутреннее произведение, векторы должны быть нормализованы. После нормализации внутреннее произведение равно косинусному сходству.

    +

    Более подробную информацию см. в Википедии.

    +

    Почему евклидово расстояние (L2) и внутреннее произведение (IP) дают разные результаты?

    Для нормализованных векторов евклидово расстояние (L2) математически эквивалентно внутреннему произведению (IP). Если эти метрики сходства дают разные результаты, проверьте, нормализованы ли ваши векторы.

    +

    Существует ли ограничение на общее количество коллекций и разделов в Milvus?

    Да. Вы можете создать до 65 535 коллекций в экземпляре Milvus. При подсчете количества существующих коллекций Milvus учитывает все коллекции, в которых есть осколки и разделы.

    +

    Например, предположим, что вы уже создали 100 коллекций, в 60 из которых есть 2 шарда и 4 раздела, а в остальных 40 коллекциях - 1 шард и 12 разделов. Текущее количество коллекций можно вычислить так:

    +
    60 * 2 * 4 + 40 * 1 * 12 = 960
    +
    +

    Почему при поиске векторов по адресу topk я получаю меньше k векторов?

    Среди индексов, которые поддерживает Milvus, IVF_FLAT и IVF_SQ8 реализуют метод кластеризации k-means. Пространство данных делится на кластеры nlist, и вставленные векторы распределяются по этим кластерам. Затем Milvus выбирает ближайшие кластеры nprobe и сравнивает расстояния между целевым вектором и всеми векторами в выбранных кластерах, получая окончательные результаты.

    +

    Если nlist и topk велики, а nprobe мало, количество векторов в кластерах nprobe может быть меньше, чем k. Поэтому при поиске ближайших векторов topk количество возвращаемых векторов будет меньше, чем k.

    +

    Чтобы избежать этого, попробуйте задать nprobe больше, а nlist и k меньше.

    +

    Дополнительные сведения см. в разделе Индекс вектора.

    +

    Какая максимальная размерность вектора поддерживается в Milvus?

    По умолчанию Milvus может управлять векторами с размерностью до 32 768. Вы можете увеличить значение Proxy.maxDimension, чтобы позволить вектору иметь большую размерность.

    +

    Поддерживает ли Milvus процессор Apple M1?

    Текущий выпуск Milvus не поддерживает процессор Apple M1 напрямую. После выхода Milvus 2.3 Milvus будет предоставлять Docker-образы для архитектуры ARM64.

    +

    Какие типы данных поддерживает Milvus для поля первичного ключа?

    В текущем выпуске Milvus поддерживает INT64 и string.

    +

    Является ли Milvus масштабируемым?

    Да. Вы можете развернуть кластер Milvus с несколькими узлами с помощью Helm Chart на Kubernetes. Дополнительные инструкции см. в руководстве по масштабированию.

    +

    Что такое растущий сегмент и уплотненный сегмент?

    Когда поступает запрос на поиск, Milvus ищет как инкрементные, так и исторические данные. Инкрементные данные - это недавние обновления, они хранятся в растущих сегментах, которые буферизируются в памяти до того, как они достигнут порога для сохранения в объектном хранилище, и для них строится более эффективный индекс, а исторические данные - это обновления, произошедшие некоторое время назад. Они находятся в запечатанных сегментах, которые были сохранены в объектном хранилище. Инкрементные и исторические данные вместе составляют весь набор данных для поиска. Такая конструкция делает любые данные, поступающие в Milvus, доступными для мгновенного поиска. Для Milvus Distributed существуют более сложные факторы, которые решают, когда только что поступившая запись может появиться в результатах поиска. Подробнее об этом можно узнать на уровнях согласованности.

    +

    Да. При запросах по одной и той же коллекции Milvus выполняет одновременный поиск в инкрементных и исторических данных. Однако запросы к разным коллекциям выполняются последовательно. В то время как исторические данные могут представлять собой чрезвычайно огромный набор данных, поиск по историческим данным занимает относительно больше времени и, по сути, выполняется последовательно.

    +

    Почему данные в MinIO сохраняются после удаления соответствующей коллекции?

    Данные в MinIO сохраняются в течение определенного периода времени для удобства отката данных.

    +

    Поддерживает ли Milvus движки сообщений, отличные от Pulsar?

    Да. Kafka поддерживается в версии Milvus 2.1.0.

    +

    В чем разница между поиском и запросом?

    В Milvus поиск по векторному сходству извлекает векторы на основе расчета сходства и ускорения векторного индекса. В отличие от поиска по векторному сходству, векторный запрос извлекает векторы с помощью скалярной фильтрации на основе булева выражения. Булево выражение фильтрует скалярные поля или поле первичного ключа и извлекает все результаты, соответствующие фильтрам. В запросе не задействованы ни метрика сходства, ни индекс вектора.

    +

    Почему в Milvus векторное значение float имеет точность 7 десятичных цифр?

    Milvus поддерживает хранение векторов в виде массивов Float32. Значение Float32 имеет точность 7 десятичных цифр. Даже если значение Float64, например 1.3476964684980388, Milvus сохраняет его как 1.347696. Поэтому, когда вы получаете такой вектор из Milvus, точность значения Float64 теряется.

    +

    Как Milvus работает с типами векторных данных и точностью?

    Milvus поддерживает векторные типы Binary, Float32, Float16 и BFloat16.

    +
      +
    • Двоичные векторы: Хранят двоичные данные в виде последовательностей 0 и 1, используются в обработке изображений и поиске информации.
    • +
    • Векторы Float32: По умолчанию хранятся с точностью около 7 десятичных цифр. Даже значения Float64 хранятся с точностью Float32, что приводит к возможной потере точности при их извлечении.
    • +
    • Векторы Float16 и BFloat16: Предлагают меньшую точность и меньшее использование памяти. Float16 подходит для приложений с ограниченной пропускной способностью и памятью, в то время как BFloat16 балансирует между дальностью и эффективностью, обычно используется в глубоком обучении для снижения вычислительных требований без существенного влияния на точность.
    • +
    +

    Поддерживает ли Milvus указание значений по умолчанию для скалярных или векторных полей?

    В настоящее время Milvus 2.4.x не поддерживает указание значений по умолчанию для скалярных или векторных полей. Эта функция запланирована на будущие релизы.

    +

    Освобождается ли место в хранилище сразу после удаления данных в Milvus?

    Нет, место в хранилище не освобождается сразу после удаления данных в Milvus. Хотя при удалении данных сущности помечаются как "логически удаленные", фактическое пространство может быть освобождено не сразу. Вот почему:

    +
      +
    • Компактирование: Milvus автоматически уплотняет данные в фоновом режиме. Этот процесс объединяет меньшие сегменты данных в большие и удаляет логически удаленные данные (сущности, помеченные для удаления) или данные, время жизни которых истекло (TTL). Однако при уплотнении создаются новые сегменты, а старые помечаются как "Удаленные".
    • +
    • Сборка мусора: Отдельный процесс, называемый сборкой мусора (GC), периодически удаляет эти сегменты "Dropped", освобождая занимаемое ими место в хранилище. Это обеспечивает эффективное использование хранилища, но может вызвать небольшую задержку между удалением и освобождением места.
    • +
    +

    Могу ли я увидеть вставленные, удаленные или поднятые данные сразу после операции, не дожидаясь промывки?

    Да, в Milvus видимость данных не связана напрямую с операциями промывки благодаря архитектуре дезагрегации хранилища и вычислений. Вы можете управлять читаемостью данных с помощью уровней согласованности.

    +

    При выборе уровня согласованности учитывайте компромисс между согласованностью и производительностью. Для операций, требующих немедленной видимости, используйте уровень согласованности "Strong". Для более быстрой записи приоритет отдавайте более слабой согласованности (данные могут быть видны не сразу). Дополнительные сведения см. в разделе Согласованность.

    +

    После включения функции ключа раздела какое значение по умолчанию имеет num_partitions в Milvus и почему?

    Когда функция ключа раздела включена, значение по умолчанию num_partitions в Milvus устанавливается на 16. Это значение по умолчанию выбрано из соображений стабильности и производительности. При необходимости вы можете изменить значение num_partitions, указав его в функции create_collection.

    +

    Существует ли ограничение на максимальную длину выражений скалярной фильтрации?

    Да, максимальная длина скалярного фильтрующего выражения ограничивается пределом передачи RPC, который задается в файле конфигурации milvus.yaml. В частности, ограничение задается параметром serverMaxRecvSize в разделе прокси:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    По умолчанию максимальный размер каждого RPC-запроса составляет 64 МБ. Поэтому для успешной обработки длина фильтрующего выражения должна быть меньше этого предела.

    +

    При выполнении массового векторного поиска сколько векторов можно указать одновременно? Существует ли ограничение?

    Да, количество векторов, которые можно указать при массовом векторном поиске, ограничено размером RPC-передачи, определенным в конфигурационном файле milvus.yaml. Этот предел определяется параметром serverMaxRecvSize в разделе прокси:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    По умолчанию максимальный размер каждого RPC-запроса составляет 64 МБ. Поэтому для успешного выполнения запроса общий размер входных векторов, включая их размерные данные и метаданные, должен быть меньше этого предела.

    +

    У вас остались вопросы?

    Вы можете:

    +
      +
    • Ознакомьтесь с Milvus на GitHub. Вы можете задавать вопросы, делиться идеями и помогать другим.
    • +
    • Присоединяйтесь к нашему сообществу Slack, чтобы найти поддержку и участвовать в работе сообщества разработчиков с открытым исходным кодом.
    • +
    diff --git a/localization/v2.5.x/site/ru/faq/troubleshooting.json b/localization/v2.5.x/site/ru/faq/troubleshooting.json new file mode 100644 index 000000000..2a67ec211 --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/troubleshooting.json @@ -0,0 +1 @@ +{"codeList":["$ docker logs \n","kubectl scale sts --replicas=1\n# delete the pvc for etcd-1 and etcd-2\nkubectl scale sts --replicas=3\n","kubectl kubectl scale sts --replicas=0\n# delete the pvc for etcd-0, etcd-1, etcd-2\nkubectl kubectl scale sts --replicas=1\n# restore the backup data\n"],"headingContent":"Troubleshooting","anchorList":[{"label":"Устранение неполадок","href":"Troubleshooting","type":1,"isActive":false},{"label":"Проблемы загрузки","href":"Boot-issues","type":2,"isActive":false},{"label":"Проблемы во время выполнения","href":"Runtime-issues","type":2,"isActive":false},{"label":"Проблемы API","href":"API-issues","type":2,"isActive":false},{"label":"Проблемы сбоя etcd","href":"etcd-crash-issues","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/faq/troubleshooting.md b/localization/v2.5.x/site/ru/faq/troubleshooting.md new file mode 100644 index 000000000..7f13a6c2f --- /dev/null +++ b/localization/v2.5.x/site/ru/faq/troubleshooting.md @@ -0,0 +1,114 @@ +--- +id: troubleshooting.md +summary: >- + Узнайте о типичных проблемах, с которыми вы можете столкнуться при работе с + Milvus, и о том, как их решить. +title: Устранение неполадок +--- +

    Устранение неполадок

    На этой странице перечислены общие проблемы, которые могут возникнуть при работе Milvus, а также возможные советы по их устранению. Проблемы на этой странице делятся на следующие категории:

    + +

    Проблемы загрузки

    Ошибки загрузки обычно фатальны. Выполните следующую команду, чтобы просмотреть подробную информацию об ошибке:

    +
    $ docker logs <your milvus container id>
    +
    +

    Проблемы во время выполнения

    Ошибки, возникающие во время выполнения, могут привести к сбоям в работе службы. Чтобы устранить эту проблему, проверьте совместимость между сервером и клиентом, прежде чем двигаться дальше.

    +

    Проблемы API

    Эти проблемы возникают во время вызовов методов API между сервером Milvus и вашим клиентом. Они будут возвращены клиенту синхронно или асинхронно.

    +

    Проблемы сбоя etcd

    1. etcd pod pending

    Кластер etcd по умолчанию использует pvc. StorageClass должен быть предварительно сконфигурирован для кластера Kubernetes.

    +

    2. Авария etcd pod

    Когда etcd pod терпит крах с Error: bad member ID arg (strconv.ParseUint: parsing "": invalid syntax), expecting ID in Hex, вы можете войти в этот pod и удалить файл /bitnami/etcd/data/member_id.

    +

    3. Несколько стручков продолжают аварийно завершаться, в то время как etcd-0 все еще запущен.

    Вы можете выполнить следующий код, если несколько стручков продолжают падать, пока etcd-0 все еще запущен.

    +
    kubectl scale sts <etcd-sts> --replicas=1
    +# delete the pvc for etcd-1 and etcd-2
    +kubectl scale sts <etcd-sts> --replicas=3
    +
    +

    4. Все капсулы аварийно завершают работу

    Если все капсулы аварийно завершают работу, попробуйте скопировать файл /bitnami/etcd/data/member/snap/db. Используйте https://github.com/etcd-io/bbolt для изменения данных базы данных.

    +

    Все метаданные Milvus хранятся в ведре key. Создайте резервную копию данных в этом ведре и выполните следующие команды. Обратите внимание, что данные префикса в файле by-dev/meta/session не требуют резервного копирования.

    +
    kubectl kubectl scale sts <etcd-sts> --replicas=0
    +# delete the pvc for etcd-0, etcd-1, etcd-2
    +kubectl kubectl scale sts <etcd-sts> --replicas=1
    +# restore the backup data
    +
    +


    +

    Если вам нужна помощь в решении проблемы, не стесняйтесь:

    +
      +
    • Присоединяйтесь к нашему каналу Slack и обратитесь за поддержкой к команде Milvus.
    • +
    • Оформитепроблему на GitHub с подробным описанием вашей проблемы.
    • +
    diff --git a/localization/v2.5.x/site/ru/getstarted/install-overview.json b/localization/v2.5.x/site/ru/getstarted/install-overview.json new file mode 100644 index 000000000..516164482 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview of Milvus Deployment Options","anchorList":[{"label":"Обзор вариантов развертывания Milvus","href":"Overview-of-Milvus-Deployment-Options","type":1,"isActive":false},{"label":"Milvus Lite","href":"Milvus-Lite","type":2,"isActive":false},{"label":"Milvus Standalone","href":"Milvus-Standalone","type":2,"isActive":false},{"label":"Milvus Distributed","href":"Milvus-Distributed","type":2,"isActive":false},{"label":"Выберите правильный способ развертывания для вашего случая использования","href":"Choose-the-Right-Deployment-for-Your-Use-Case","type":2,"isActive":false},{"label":"Сравнение по функциональным возможностям","href":"Comparison-on-functionalities","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/install-overview.md b/localization/v2.5.x/site/ru/getstarted/install-overview.md new file mode 100644 index 000000000..1b8a0f450 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install-overview.md @@ -0,0 +1,140 @@ +--- +id: install-overview.md +summary: >- + Milvus - это высокопроизводительная, масштабируемая векторная база данных. Она + поддерживает различные варианты использования, от демо-версий, выполняемых + локально в Jupyter Notebooks, до масштабных кластеров Kubernetes, + обрабатывающих десятки миллиардов векторов. В настоящее время существует три + варианта развертывания Milvus: Milvus Lite, Milvus Standalone и Milvus + Distributed. +title: Обзор вариантов развертывания Milvus +--- +

    Обзор вариантов развертывания Milvus

    Milvus - это высокопроизводительная, масштабируемая векторная база данных. Она поддерживает различные варианты использования, от демо-версий, выполняемых локально в Jupyter Notebooks, до масштабных кластеров Kubernetes, обрабатывающих десятки миллиардов векторов. В настоящее время существует три варианта развертывания Milvus: Milvus Lite, Milvus Standalone и Milvus Distributed.

    +

    Milvus Lite

    Milvus Lite - это библиотека Python, которая может быть импортирована в ваши приложения. Являясь облегченной версией Milvus, она идеально подходит для быстрого создания прототипов в Jupyter Notebooks или для работы на смарт-устройствах с ограниченными ресурсами. Milvus Lite поддерживает те же API, что и другие версии Milvus. Код на стороне клиента, взаимодействующий с Milvus Lite, может также работать с экземплярами Milvus в других режимах развертывания.

    +

    Чтобы интегрировать Milvus Lite в свои приложения, запустите pip install pymilvus для его установки и используйте оператор MilvusClient("./demo.db") для инстанцирования векторной базы данных с локальным файлом, в котором хранятся все данные. Более подробную информацию см. в разделе Запуск Milvus Lite.

    +

    Milvus Standalone

    Milvus Standalone - это серверное развертывание на одной машине. Все компоненты Milvus Standalone упакованы в один образ Docker, что делает развертывание удобным. Если у вас есть производственная рабочая нагрузка, но вы предпочитаете не использовать Kubernetes, запуск Milvus Standalone на одной машине с достаточным количеством памяти будет хорошим вариантом. Кроме того, Milvus Standalone поддерживает высокую доступность за счет репликации master-slave.

    +

    Milvus Distributed

    Milvus Distributed может быть развернут на кластерах Kubernetes. Это развертывание имеет облачную нативную архитектуру, в которой загрузка и поисковые запросы обрабатываются отдельно на изолированных узлах, что обеспечивает резервирование критически важных компонентов. Она обеспечивает высочайшую масштабируемость и доступность, а также гибкость в настройке выделенных ресурсов для каждого компонента. Milvus Distributed - лучший выбор для корпоративных пользователей, использующих крупные системы векторного поиска в производстве.

    +

    Выберите правильный способ развертывания для вашего случая использования

    Выбор режима развертывания обычно зависит от стадии разработки вашего приложения:

    +
      +
    • Для быстрого прототипирования

      +

      Если вы хотите быстро создать что-то в качестве прототипа или в целях обучения, например, демонстрационные версии Retrieval Augmented Generation (RAG), чат-боты AI, мультимодальный поиск, вам подойдет Milvus Lite или комбинация Milvus Lite и Milvus Standalone. Вы можете использовать Milvus Lite в блокнотах для быстрого создания прототипов и изучения различных подходов, например, различных стратегий разбиения на части в RAG. Возможно, вы захотите развернуть приложение, созданное с помощью Milvus Lite, в небольшом производстве для обслуживания реальных пользователей или проверить идею на больших наборах данных, скажем, более чем на нескольких миллионах векторов. В этом случае подойдет Milvus Standalone. Логика приложения для Milvus Lite может быть общей, поскольку все развертывания Milvus имеют один и тот же API на стороне клиента. Данные, хранящиеся в Milvus Lite, также можно перенести в Milvus Standalone с помощью инструмента командной строки.

    • +
    • Развертывание на малых производствах

      +

      Для производства на ранних стадиях, когда проект все еще ищет соответствие продукта рынку и гибкость важнее масштабируемости, Milvus Standalone - лучший выбор. При достаточном количестве машинных ресурсов он может масштабироваться до 100 млн векторов и при этом требует гораздо меньше DevOps, чем поддержка кластера K8s.

    • +
    • Крупномасштабное производственное развертывание

      +

      Когда ваш бизнес быстро растет, а объем данных превышает возможности одного сервера, пора задуматься о Milvus Distributed. Вы можете продолжать использовать Milvus Standalone для dev- или staging-среды для удобства, а также управлять кластером K8s, на котором работает Milvus Distributed. Это позволит вам работать с десятками миллиардов векторов, а также обеспечит гибкость в настройке размера узла для конкретной рабочей нагрузки, например, для случаев с высоким уровнем чтения и редкой записи или с высоким уровнем записи и низким уровнем чтения.

    • +
    • Локальный поиск на граничных устройствах

      +

      Для поиска в частных или конфиденциальных данных на граничных устройствах вы можете развернуть Milvus Lite на устройстве, не прибегая к облачной службе для поиска текста или изображений. Это подходит для таких случаев, как поиск по собственным документам или обнаружение объектов на устройстве.

    • +
    +

    Выбор способа развертывания Milvus зависит от стадии и масштаба вашего проекта. Milvus представляет собой гибкое и мощное решение для различных потребностей, от быстрого создания прототипа до развертывания на крупном предприятии.

    +
      +
    • Milvus Lite рекомендуется для небольших наборов данных, до нескольких миллионов векторов.
    • +
    • Milvus Standalone подходит для средних наборов данных, масштабируемых до 100 миллионов векторов.
    • +
    • Milvus Distributed предназначен для крупномасштабных развертываний и способен обрабатывать наборы данных от 100 миллионов до десятков миллиардов векторов.
    • +
    +

    + + Select deployment option for your use case + Выберите вариант развертывания для вашего случая использования

    +

    Сравнение по функциональным возможностям

    + + + + + + + + + + + +
    ФункциональностьMilvus LiteMilvus StandaloneMilvus Distributed
    SDK / Клиентский лирариPython
    gRPC
    Python
    Go
    Java
    Node.js
    C#
    RESTful
    Python
    Java
    Go
    Node.js
    C#
    RESTful
    Типы данныхПлотный вектор
    Разрозненный вектор
    Двоичный вектор
    Булево
    Целое число
    Плавающая точка
    ВарЧар
    Массив
    JSON
    Плотный вектор
    Разрозненный вектор
    Двоичный вектор
    Булево
    Целое число
    Плавающая точка
    VarChar
    Массив
    JSON
    Плотный вектор
    Разреженный вектор
    Двоичный вектор
    Булево
    Целое число
    Плавающая точка
    VarChar
    Массив
    JSON
    Возможности поискаВекторный поиск (ANN Search)
    Фильтрация метаданных
    Поиск по диапазону
    Скалярный запрос
    Получение сущностей по первичному ключу
    Гибридный поиск
    Векторный поиск (ANN Search)
    Фильтрация метаданных
    Поиск по диапазону
    Скалярный запрос
    Получение сущностей по первичному ключу
    Гибридный поиск
    Векторный поиск (ANN Search)
    Фильтрация метаданных
    Поиск по диапазону
    Скалярный запрос
    Получение сущностей по первичному ключу
    Гибридный поиск
    CRUD-операции✔️✔️✔️
    Расширенное управление даннымиN/AКонтроль доступа
    Раздел
    Ключ раздела
    Контроль доступа
    Раздел
    Ключ раздела
    Группировка физических ресурсов
    Уровни согласованностиСильныйСильный
    Ограниченная стабильность
    Сессия
    Эвентуальный
    Сильный
    Ограниченная стабильность
    Сессия
    Эвентуальный
    diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.json b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.json new file mode 100644 index 000000000..3ae2128dc --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.json @@ -0,0 +1 @@ +{"codeList":["$ go get -u github.com/milvus-io/milvus-sdk-go/v2\n"],"headingContent":"Install Milvus Go SDK","anchorList":[{"label":"Установка Milvus Go SDK","href":"Install-Milvus-Go-SDK","type":1,"isActive":false},{"label":"Требование","href":"Requirement","type":2,"isActive":false},{"label":"Установите Milvus GO SDK","href":"Install-Milvus-GO-SDK","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.md b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.md new file mode 100644 index 000000000..8ee2fc861 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-go.md @@ -0,0 +1,83 @@ +--- +id: install-go.md +label: Install GO SDK +related_key: SDK +summary: 'Узнайте, как установить GO SDK от Milvus.' +title: Установка Milvus Go SDK +--- +

    Установка Milvus Go SDK

    В этой теме описывается, как установить Milvus Go SDK для Milvus.

    +

    Текущая версия Milvus поддерживает SDK на языках Python, Node.js, GO и Java.

    +

    Требование

    Требуется GO (1.17 или более поздняя версия).

    +

    Установите Milvus GO SDK

    Установите Milvus GO SDK и зависимости с помощью go get.

    +
    $ go get -u github.com/milvus-io/milvus-sdk-go/v2
    +
    +

    Что дальше

    Установив Milvus GO SDK, вы сможете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.json b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.json new file mode 100644 index 000000000..3548b6890 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.json @@ -0,0 +1 @@ +{"codeList":["\n io.milvus\n milvus-sdk-java\n 2.5.4\n\n","implementation 'io.milvus:milvus-sdk-java:2.5.4'\n"],"headingContent":"Install Milvus Java SDK","anchorList":[{"label":"Установка Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":1,"isActive":false},{"label":"Требование","href":"Requirement","type":2,"isActive":false},{"label":"Установка Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.md b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.md new file mode 100644 index 000000000..7a354c6a1 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-java.md @@ -0,0 +1,100 @@ +--- +id: install-java.md +label: Install Java SDK +related_key: SDK +summary: 'Узнайте, как установить Java SDK для Milvus.' +title: Установка Milvus Java SDK +--- +

    Установка Milvus Java SDK

    В этой теме описывается, как установить Milvus Java SDK для Milvus.

    +

    Текущая версия Milvus поддерживает SDK на языках Python, Node.js, GO и Java.

    +

    Требование

      +
    • Java (8 или более поздняя версия)
    • +
    • Apache Maven или Gradle/Grails
    • +
    +

    Установите Milvus Java SDK

    Выполните следующую команду для установки Milvus Java SDK.

    +
      +
    • Apache Maven
    • +
    +
    <dependency>
    +    <groupId>io.milvus</groupId>
    +    <artifactId>milvus-sdk-java</artifactId>
    +    <version>2.5.4</version>
    +</dependency>
    +
    +
      +
    • Gradle/Grails
    • +
    +
    implementation 'io.milvus:milvus-sdk-java:2.5.4'
    +
    +

    Что дальше

    Установив Milvus Java SDK, вы сможете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.json b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.json new file mode 100644 index 000000000..784bef241 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.json @@ -0,0 +1 @@ +{"codeList":["npm install @zilliz/milvus2-sdk-node\n# or ...\nyarn add @zilliz/milvus2-sdk-node\n"],"headingContent":"Install Milvus Nodejs SDK","anchorList":[{"label":"Установка Milvus Nodejs SDK","href":"Install-Milvus-Nodejs-SDK","type":1,"isActive":false},{"label":"Совместимость","href":"Compatibility","type":2,"isActive":false},{"label":"Требования","href":"Requirement","type":2,"isActive":false},{"label":"Установка","href":"Installation","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.md b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.md new file mode 100644 index 000000000..691218828 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-node.md @@ -0,0 +1,118 @@ +--- +id: install-node.md +label: Install Node.js SDK +related_key: SDK +summary: 'Узнайте, как установить Node.js SDK от Milvus.' +title: Установка Milvus Nodejs SDK +--- +

    Установка Milvus Nodejs SDK

    В этой теме описывается, как установить Milvus Node.js SDK для Milvus.

    +

    Совместимость

    В следующей подборке показаны версии Milvus и рекомендуемые версии @zilliz/milvus2-sdk-node:

    + + + + + + + + + + + + + +
    Версия MilvusРекомендуемая версия @zilliz/milvus2-sdk-node
    2.5.xпоследняя
    2.4.x2.4.10
    2.3.x2.3.5
    2.2.x2.2.x
    2.1.x2.1.x
    2.0.12.0.0, 2.0.1
    2.0.02.0.0
    +

    Требования

    Node.js v18+

    +

    Установка

    Рекомендуемый способ начать использовать клиент Milvus node.js - это использовать npm (менеджер пакетов Node) для установки зависимости в ваш проект.

    +
    npm install @zilliz/milvus2-sdk-node
    +# or ...
    +yarn add @zilliz/milvus2-sdk-node
    +
    +

    Это загрузит Milvus node.js sdk и добавит запись о зависимости в ваш файл package.json.

    +

    Что дальше

    Установив Milvus Node.js SDK, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.json b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.json new file mode 100644 index 000000000..bb023b2a8 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.json @@ -0,0 +1 @@ +{"codeList":["$ python3 -m pip install pymilvus==2.5.3\n","$ python3 -c \"from pymilvus import Collection\"\n"],"headingContent":"Install Milvus Python SDK","anchorList":[{"label":"Установка Milvus Python SDK","href":"Install-Milvus-Python-SDK","type":1,"isActive":false},{"label":"Требования","href":"Requirements","type":2,"isActive":false},{"label":"Установка PyMilvus с помощью pip","href":"Install-PyMilvus-via-pip","type":2,"isActive":false},{"label":"Проверка установки","href":"Verify-installation","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.md b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.md new file mode 100644 index 000000000..60c8d0052 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/install_SDKs/install-pymilvus.md @@ -0,0 +1,109 @@ +--- +id: install-pymilvus.md +label: Install PyMilvus +related_key: SDK +summary: 'Узнайте, как установить Python SDK для Milvus.' +title: Установка Milvus Python SDK +--- +

    Установка Milvus Python SDK

    В этой теме описывается, как установить Milvus python SDK pymilvus для Milvus.

    +

    Текущая версия Milvus поддерживает SDK на языках Python, Node.js, GO и Java.

    +

    Требования

      +
    • Требуется Python 3.7 или более поздняя версия.
    • +
    • Установлен Google protobuf. Вы можете установить его с помощью команды pip3 install protobuf==3.20.0.
    • +
    • Установлен пакет grpcio-tools. Вы можете установить его с помощью команды pip3 install grpcio-tools.
    • +
    +

    Установка PyMilvus с помощью pip

    PyMilvus доступен в индексе пакетов Python.

    +
    +Рекомендуется установить версию PyMilvus, соответствующую версии установленного вами сервера Milvus. Для получения дополнительной информации см. раздел Информация о выпуске.
    +
    $ python3 -m pip install pymilvus==2.5.3
    +
    +

    Проверка установки

    Если PyMilvus установлен правильно, то при выполнении следующей команды не возникнет исключения.

    +
    $ python3 -c "from pymilvus import Collection"
    +
    +

    Что дальше

    Установив PyMilvus, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/milvus_lite.json b/localization/v2.5.x/site/ru/getstarted/milvus_lite.json new file mode 100644 index 000000000..b8e67c53e --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/milvus_lite.json @@ -0,0 +1 @@ +{"codeList":["pip install -U pymilvus\n","from pymilvus import MilvusClient\nclient = MilvusClient(\"./milvus_demo.db\")\n","from pymilvus import MilvusClient\nimport numpy as np\n\nclient = MilvusClient(\"./milvus_demo.db\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=384 # The vectors we will use in this demo has 384 dimensions\n)\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# For illustration, here we use fake vectors with random numbers (384 dimension).\n\nvectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]\ndata = [ {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"} for i in range(len(vectors)) ]\nres = client.insert(\n collection_name=\"demo_collection\",\n data=data\n)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=[vectors[0]],\n filter=\"subject == 'history'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# a query that retrieves all entities matching filter expressions.\nres = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# delete\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n)\nprint(res)\n","# Install\npip install -U \"pymilvus[bulk_writer]\"\n\nmilvus-lite dump -h\n\nusage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]\n\noptional arguments:\n -h, --help show this help message and exit\n -d DB_FILE, --db-file DB_FILE\n milvus lite db file\n -c COLLECTION, --collection COLLECTION\n collection that need to be dumped\n -p PATH, --path PATH dump file storage dir\n","milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir\n# ./milvus_demo.db: milvus lite db file\n# demo_collection: collection that need to be dumped\n#./data_dir : dump file storage dir\n"],"headingContent":"Run Milvus Lite Locally","anchorList":[{"label":"Запуск Milvus Lite локально","href":"Run-Milvus-Lite-Locally","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка Milvus Lite","href":"Set-up-Milvus-Lite","type":2,"isActive":false},{"label":"Подключение к Milvus Lite","href":"Connect-to-Milvus-Lite","type":2,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"Перенос данных из Milvus Lite","href":"Migrating-data-from-Milvus-Lite","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/milvus_lite.md b/localization/v2.5.x/site/ru/getstarted/milvus_lite.md new file mode 100644 index 000000000..5516a7973 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/milvus_lite.md @@ -0,0 +1,412 @@ +--- +id: milvus_lite.md +summary: Начните работу с Milvus Lite. +title: Запуск Milvus Lite локально +--- +

    Запуск Milvus Lite локально

    На этой странице показано, как запустить Milvus локально с помощью Milvus Lite. Milvus Lite - это облегченная версия Milvus, векторной базы данных с открытым исходным кодом, которая обеспечивает работу приложений искусственного интеллекта с векторными вкраплениями и поиском сходства.

    +

    Обзор

    Milvus Lite может быть импортирован в ваше Python-приложение, обеспечивая основную функциональность векторного поиска Milvus. Milvus Lite уже включен в Python SDK Milvus. Его можно просто развернуть с помощью pip install pymilvus.

    +

    С Milvus Lite вы можете начать создавать ИИ-приложение с векторным поиском сходства в течение нескольких минут! Milvus Lite подходит для работы в следующих средах:

    +
      +
    • Jupyter Notebook / Google Colab
    • +
    • Ноутбуки
    • +
    • Граничные устройства
    • +
    +

    Milvus Lite использует тот же API, что и Milvus Standalone и Distributed, и охватывает большинство функций, таких как сохранение и управление векторными данными, векторные CRUD-операции, поиск по разреженным и плотным векторам, фильтрация метаданных, мультивекторный и гибридный_поиск. Вместе они обеспечивают согласованную работу в различных типах сред, от пограничных устройств до кластеров в облаке, и подходят для сценариев использования разного размера. Используя один и тот же код на стороне клиента, вы можете запускать приложения GenAI с Milvus Lite на ноутбуке или Jupyter Notebook, Milvus Standalone в контейнере Docker или Milvus Distributed на огромном кластере Kubernetes, обслуживающем миллиарды векторов в производстве.

    +

    Необходимые условия

    В настоящее время Milvus Lite поддерживает следующие среды:

    +
      +
    • Ubuntu >= 20.04 (x86_64 и arm64)
    • +
    • MacOS >= 11.0 (Apple Silicon M1/M2 и x86_64)
    • +
    +

    Обратите внимание, что Milvus Lite подходит только для небольших случаев использования векторного поиска. Для крупномасштабных задач мы рекомендуем использовать Milvus Standalone или Milvus Distributed. Вы также можете рассмотреть вариант полностью управляемого Milvus на Zilliz Cloud.

    +

    Настройка Milvus Lite

    pip install -U pymilvus
    +
    +

    Мы рекомендуем использовать pymilvus. Поскольку milvus-lite включен в pymilvus версии 2.4.2 или выше, вы можете pip install с -U для принудительного обновления до последней версии, и milvus-lite будет установлен автоматически.

    +

    Если вы хотите явно установить пакет milvus-lite, или вы установили старую версию milvus-lite и хотите ее обновить, вы можете сделать это с помощью pip install -U milvus-lite.

    +

    Подключение к Milvus Lite

    В pymilvus укажите локальное имя файла в качестве параметра uri MilvusClient для использования Milvus Lite.

    +
    from pymilvus import MilvusClient
    +client = MilvusClient("./milvus_demo.db")
    +
    +

    После выполнения приведенного выше фрагмента кода в текущей папке будет создан файл базы данных с именем milvus_demo.db.

    +
    +

    ПРИМЕЧАНИЕ: Обратите внимание, что тот же самый API также применим к Milvus Standalone, Milvus Distributed и Zilliz Cloud, единственное различие заключается в замене локального имени файла на конечную точку удаленного сервера и учетные данные, напримерclient = MilvusClient(uri="http://localhost:19530", token="username:password").

    +
    +

    Примеры

    Ниже приведен простой демонстрационный пример использования Milvus Lite для текстового поиска. Есть и более подробные примеры использования Milvus Lite для создания приложений, таких как RAG, поиск изображений, а также использование Milvus Lite в популярных фреймворках RAG, таких как LangChain и LlamaIndex!

    +
    from pymilvus import MilvusClient
    +import numpy as np
    +
    +client = MilvusClient("./milvus_demo.db")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=384  # The vectors we will use in this demo has 384 dimensions
    +)
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# For illustration, here we use fake vectors with random numbers (384 dimension).
    +
    +vectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]
    +data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ]
    +res = client.insert(
    +    collection_name="demo_collection",
    +    data=data
    +)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=[vectors[0]],
    +    filter="subject == 'history'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# a query that retrieves all entities matching filter expressions.
    +res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# delete
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +)
    +print(res)
    +
    +

    Ограничения

    При использовании Milvus Lite обратите внимание, что некоторые функции не поддерживаются. В следующих таблицах приведены ограничения на использование Milvus Lite.

    +

    Коллекция

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Метод/параметрПоддерживается в Milvus Lite
    create_collection()Поддержка с ограниченными параметрами
    collection_nameY
    dimensionY
    primary_field_nameY
    id_typeY
    vector_field_nameY
    metric_typeY
    auto_idY
    schemaY
    index_paramsY
    enable_dynamic_fieldY
    num_shardsN
    partition_key_fieldN
    num_partitionsN
    consistency_levelN (Поддерживается только Strong; любая конфигурация будет рассматриваться как Strong).
    get_collection_stats()Поддерживает получение статистики коллекции.
    collection_nameY
    timeoutY
    describe_collection()num_shards, consistency_level и collection_id в ответе недействительны.
    timeoutY
    has_collection()Поддерживает проверку существования коллекции.
    collection_nameY
    timeoutY
    list_collections()Поддерживает вывод списка всех коллекций.
    drop_collection()Поддерживает сброс коллекции.
    collection_nameY
    timeoutY
    переименовать_коллекцию()Переименование коллекции не поддерживается.
    +

    Поле и схема

    + + + + + + + + + + + + + + + + + + + +
    Метод / параметрПоддерживается в Milvus Lite
    create_schema()Поддержка с ограниченными параметрами
    auto_idY
    enable_dynamic_fieldY
    primary_fieldY
    partition_key_fieldN
    add_field()Поддержка с ограниченными параметрами
    field_nameY
    datatypeY
    is_primaryY
    max_lengthY
    element_typeY
    max_capacityY
    dimY
    is_partition_keyN
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Метод / параметрПоддерживается в Milvus Lite
    поиск()Поддержка с ограниченными параметрами
    collection_nameY
    dataY
    filterY
    limitY
    output_fieldsY
    search_paramsY
    timeoutY
    partition_namesN
    anns_fieldY
    query()Поддержка ограниченных параметров
    collection_nameY
    filterY
    output_fieldsY
    timeoutY
    idsY
    partition_namesN
    get()Поддержка с ограниченными параметрами
    collection_nameY
    idsY
    output_fieldsY
    timeoutY
    partition_namesN
    delete()Поддержка с ограниченными параметрами
    collection_nameY
    idsY
    timeoutY
    filterY
    partition_nameN
    insert()Поддержка с ограниченными параметрами
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    upsert()Поддержка с ограниченными параметрами
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    +

    Загрузка и освобождение

    + + + + + + + + + + + + + + +
    Метод / параметрПоддерживается в Milvus Lite
    load_collection()Y
    collection_nameY
    timeoutY
    release_collection()Y
    collection_nameY
    timeoutY
    get_load_state()Получение состояния загрузки не поддерживается.
    refresh_load()Загрузка выгруженных данных загруженной коллекции не поддерживается.
    close()Y
    +

    Индекс

    + + + + + + + + + + + + + + + + + + + +
    Метод / параметрПоддерживается в Milvus Lite
    list_indexes()Поддерживается перечисление индексов.
    collection_nameY
    field_nameY
    create_index()Поддерживается только тип индекса FLAT.
    index_paramsY
    timeoutY
    drop_index()Поддерживается сбрасывание индексов.
    collection_nameY
    index_nameY
    timeoutY
    describe_index()Поддерживается описание индексов.
    collection_nameY
    index_nameY
    timeoutY
    +

    Типы векторных индексов

    Milvus Lite поддерживает только тип индекса FLAT. Он использует тип FLAT независимо от указанного типа индекса в коллекции.

    +

    Особенности поиска

    Milvus Lite поддерживает разреженный векторный, многовекторный и гибридный поиск.

    +

    Раздел

    Milvus Lite не поддерживает разделы и методы, связанные с разделами.

    +

    Пользователи и роли

    Milvus Lite не поддерживает пользователей и роли, а также связанные с ними методы.

    +

    Псевдоним

    Milvus Lite не поддерживает псевдонимы и методы, связанные с псевдонимами.

    +

    Перенос данных из Milvus Lite

    Все данные, хранящиеся в Milvus Lite, можно легко экспортировать и загрузить в другие типы развертывания Milvus, такие как Milvus Standalone на Docker, Milvus Distributed на K8s или полностью управляемый Milvus на Zilliz Cloud.

    +

    Milvus Lite - это инструмент командной строки, который позволяет сбрасывать данные в json-файл, который можно импортировать в milvus и Zilliz Cloud(полностью управляемый облачный сервис для Milvus). Команда milvus-lite будет установлена вместе с пакетом milvus-lite python.

    +
    # Install
    +pip install -U "pymilvus[bulk_writer]"
    +
    +milvus-lite dump -h
    +
    +usage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]
    +
    +optional arguments:
    +  -h, --help            show this help message and exit
    +  -d DB_FILE, --db-file DB_FILE
    +                        milvus lite db file
    +  -c COLLECTION, --collection COLLECTION
    +                        collection that need to be dumped
    +  -p PATH, --path PATH  dump file storage dir
    +
    +

    В следующем примере выгружаются все данные из коллекции demo_collection, которые хранятся в ./milvus_demo.db (файл базы данных Milvus Lite).

    +

    Для экспорта данных:

    +
    milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
    +# ./milvus_demo.db: milvus lite db file
    +# demo_collection: collection that need to be dumped
    +#./data_dir : dump file storage dir
    +
    +

    С помощью файла дампа вы можете загрузить данные в Zilliz Cloud через Data Import или загрузить данные на серверы Milvus через Bulk Insert.

    +

    Что дальше

    Подключившись к Milvus Lite, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/quickstart.json b/localization/v2.5.x/site/ru/getstarted/quickstart.json new file mode 100644 index 000000000..0632fecce --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/quickstart.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","if client.has_collection(collection_name=\"demo_collection\"):\n client.drop_collection(collection_name=\"demo_collection\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=768, # The vectors we will use in this demo has 768 dimensions\n)\n","$ pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# If connection to https://huggingface.co/ failed, uncomment the following path\n# import os\n# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n\n# This will download a small embedding model \"paraphrase-albert-small-v2\" (~50MB).\nembedding_fn = model.DefaultEmbeddingFunction()\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = embedding_fn.encode_documents(docs)\n# The output vector has 768 dimensions, matching the collection that we just created.\nprint(\"Dim:\", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)\n\n# Each entity has id, vector representation, raw text, and a subject label that we use\n# to demo metadata filtering later.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Dim: 768 (768,)\nData has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","import random\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# Use fake representation with random vectors (768 dimension).\nvectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","res = client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res)\n","{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}\n","query_vectors = embedding_fn.encode_queries([\"Who is Alan Turing?\"])\n# If you don't have the embedding function you can use a fake vector to finish the demo:\n# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]\n\nres = client.search(\n collection_name=\"demo_collection\", # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nprint(res)\n","data: [\"[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]\"] , extra_info: {'cost': 0}\n","# Insert more docs in another subject.\ndocs = [\n \"Machine learning has been used for drug design.\",\n \"Computational synthesis with AI algorithms predicts molecular properties.\",\n \"DDR1 is involved in cancers and fibrosis.\",\n]\nvectors = embedding_fn.encode_documents(docs)\ndata = [\n {\"id\": 3 + i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"biology\"}\n for i in range(len(vectors))\n]\n\nclient.insert(collection_name=\"demo_collection\", data=data)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=embedding_fn.encode_queries([\"tell me AI related information\"]),\n filter=\"subject == 'biology'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\n\nprint(res)\n","data: [\"[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]\"] , extra_info: {'cost': 0}\n","res = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\n","res = client.query(\n collection_name=\"demo_collection\",\n ids=[0, 2],\n output_fields=[\"vector\", \"text\", \"subject\"],\n)\n","# Delete entities by primary key\nres = client.delete(collection_name=\"demo_collection\", ids=[0, 2])\n\nprint(res)\n\n# Delete entities by a filter expression\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'biology'\",\n)\n\nprint(res)\n","[0, 2]\n[3, 4, 5]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","# Drop collection\nclient.drop_collection(collection_name=\"demo_collection\")\n","client = MilvusClient(uri=\"http://localhost:19530\", token=\"root:Milvus\")\n"],"headingContent":"Quickstart with Milvus Lite","anchorList":[{"label":"Быстрый старт с Milvus Lite","href":"Quickstart-with-Milvus-Lite","type":1,"isActive":false},{"label":"Установка Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Настройка базы данных векторов","href":"Set-Up-Vector-Database","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-a-Collection","type":2,"isActive":false},{"label":"Подготовка данных","href":"Prepare-Data","type":2,"isActive":false},{"label":"Представление текста с помощью векторов","href":"Represent-text-with-vectors","type":2,"isActive":false},{"label":"[Альтернатива] Использовать фальшивое представление со случайными векторами","href":"Alternatively-Use-fake-representation-with-random-vectors","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-Data","type":2,"isActive":false},{"label":"Семантический поиск","href":"Semantic-Search","type":2,"isActive":false},{"label":"Векторный поиск с фильтрацией метаданных","href":"Vector-Search-with-Metadata-Filtering","type":2,"isActive":false},{"label":"Удалить сущности","href":"Delete-Entities","type":2,"isActive":false},{"label":"Загрузка существующих данных","href":"Load-Existing-Data","type":2,"isActive":false},{"label":"Удаление коллекции","href":"Drop-the-collection","type":2,"isActive":false},{"label":"Подробнее","href":"Learn-More","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/quickstart.md b/localization/v2.5.x/site/ru/getstarted/quickstart.md new file mode 100644 index 000000000..babc4f344 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/quickstart.md @@ -0,0 +1,408 @@ +--- +id: quickstart.md +summary: Начните работать с Milvus. +title: Быстрый старт +--- +

    Быстрый старт с Milvus Lite

    Open In Colab +GitHub Repository

    +

    Векторы, формат выходных данных нейросетевых моделей, могут эффективно кодировать информацию и играть ключевую роль в таких приложениях ИИ, как база знаний, семантический поиск, поиск с расширенной генерацией (Retrieval Augmented Generation, RAG) и других.

    +

    Milvus - это векторная база данных с открытым исходным кодом, которая подходит для ИИ-приложений любого масштаба - от запуска демонстрационного чатбота в Jupyter notebook до создания веб-поиска, обслуживающего миллиарды пользователей. В этом руководстве мы расскажем вам, как установить Milvus локально за несколько минут и использовать клиентскую библиотеку Python для генерации, хранения и поиска векторов.

    +

    Установка Milvus

    В этом руководстве мы используем Milvus Lite, библиотеку python, включенную в pymilvus, которая может быть встроена в клиентское приложение. Milvus также поддерживает развертывание в Docker и Kubernetes для использования в производстве.

    +

    Перед началом работы убедитесь, что в локальном окружении доступен Python 3.8+. Установите pymilvus, который содержит клиентскую библиотеку python и Milvus Lite:

    +
    $ pip install -U pymilvus
    +
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения. (Нажмите на меню "Время выполнения" в верхней части экрана и выберите "Перезапустить сессию" из выпадающего меню).

    +
    +
    +

    Настройка базы данных векторов

    Чтобы создать локальную векторную базу данных Milvus, просто создайте MilvusClient, указав имя файла для хранения всех данных, например "milvus_demo.db".

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    Создание коллекции

    В Milvus нам нужна коллекция для хранения векторов и связанных с ними метаданных. Ее можно представить себе как таблицу в традиционных базах данных SQL. При создании коллекции вы можете определить параметры схемы и индекса, чтобы настроить такие характеристики вектора, как размерность, типы индексов и метрики удаленности. Существуют также сложные концепции оптимизации индекса для повышения производительности векторного поиска. Пока давайте остановимся на основных принципах и будем использовать значение по умолчанию для всего, что возможно. Как минимум, вам нужно задать только имя коллекции и размерность векторного поля коллекции.

    +
    if client.has_collection(collection_name="demo_collection"):
    +    client.drop_collection(collection_name="demo_collection")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=768,  # The vectors we will use in this demo has 768 dimensions
    +)
    +
    +

    В приведенной выше схеме,

    +
      +
    • Первичный ключ и векторные поля имеют имена по умолчанию ("id" и "vector").
    • +
    • Тип метрики (определение векторного расстояния) установлен в значение по умолчанию(COSINE).
    • +
    • Поле первичного ключа принимает целые числа и не увеличивается автоматически (то есть не используется функция auto-id). Также можно формально определить схему коллекции, следуя этой инструкции.
    • +
    +

    Подготовка данных

    В этом руководстве мы используем векторы для выполнения семантического поиска по тексту. Нам необходимо сгенерировать векторы для текста, загрузив модели встраивания. Это можно легко сделать с помощью утилитных функций из библиотеки pymilvus[model].

    +

    Представление текста с помощью векторов

    Сначала установите библиотеку моделей. Этот пакет включает в себя основные инструменты ML, такие как PyTorch. Загрузка пакета может занять некоторое время, если в вашем локальном окружении никогда не устанавливался PyTorch.

    +
    $ pip install "pymilvus[model]"
    +
    +

    Сгенерируйте векторные вкрапления с помощью модели по умолчанию. Milvus ожидает, что данные будут представлены в виде списка словарей, где каждый словарь представляет запись данных, называемую сущностью.

    +
    from pymilvus import model
    +
    +# If connection to https://huggingface.co/ failed, uncomment the following path
    +# import os
    +# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    +
    +# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
    +embedding_fn = model.DefaultEmbeddingFunction()
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = embedding_fn.encode_documents(docs)
    +# The output vector has 768 dimensions, matching the collection that we just created.
    +print("Dim:", embedding_fn.dim, vectors[0].shape)  # Dim: 768 (768,)
    +
    +# Each entity has id, vector representation, raw text, and a subject label that we use
    +# to demo metadata filtering later.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Dim: 768 (768,)
    +Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    [Альтернатива] Использовать фальшивое представление со случайными векторами

    Если вы не смогли загрузить модель из-за проблем с сетью, в качестве обходного пути вы можете использовать случайные векторы для представления текста и все равно завершить пример. Только учтите, что результат поиска не будет отражать семантическое сходство, так как векторы будут фальшивыми.

    +
    import random
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# Use fake representation with random vectors (768 dimension).
    +vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    Вставка данных

    Давайте вставим данные в коллекцию:

    +
    res = client.insert(collection_name="demo_collection", data=data)
    +
    +print(res)
    +
    +
    {'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
    +
    +

    Теперь мы можем выполнять семантический поиск, представляя текст поискового запроса в виде вектора, и проводить поиск по векторному сходству на Milvus.

    +

    Milvus принимает один или несколько запросов на векторный поиск одновременно. Значением переменной query_vectors является список векторов, где каждый вектор - это массив чисел с плавающей точкой.

    +
    query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
    +# If you don't have the embedding function you can use a fake vector to finish the demo:
    +# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
    +
    +res = client.search(
    +    collection_name="demo_collection",  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
    +
    +

    На выходе получается список результатов, каждый из которых соответствует запросу на векторный поиск. Каждый запрос содержит список результатов, где каждый результат содержит первичный ключ сущности, расстояние до вектора запроса и данные о сущности с указанными output_fields.

    +

    Векторный поиск с фильтрацией метаданных

    Вы также можете осуществлять векторный поиск с учетом значений метаданных (в Milvus они называются "скалярными" полями, поскольку скалярные относятся к невекторным данным). Это делается с помощью выражения фильтра, задающего определенные критерии. Рассмотрим поиск и фильтрацию с помощью поля subject в следующем примере.

    +
    # Insert more docs in another subject.
    +docs = [
    +    "Machine learning has been used for drug design.",
    +    "Computational synthesis with AI algorithms predicts molecular properties.",
    +    "DDR1 is involved in cancers and fibrosis.",
    +]
    +vectors = embedding_fn.encode_documents(docs)
    +data = [
    +    {"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
    +    for i in range(len(vectors))
    +]
    +
    +client.insert(collection_name="demo_collection", data=data)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=embedding_fn.encode_queries(["tell me AI related information"]),
    +    filter="subject == 'biology'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
    +
    +

    По умолчанию скалярные поля не индексируются. Если вам нужно выполнить поиск с фильтрацией метаданных в большом наборе данных, вы можете рассмотреть возможность использования фиксированной схемы, а также включить индекс для повышения производительности поиска.

    +

    Помимо векторного поиска, вы можете выполнять и другие типы поиска:

    +

    Запрос

    Запрос() - это операция, которая извлекает все сущности, соответствующие какому-либо критерию, например выражению фильтра или совпадению некоторых идентификаторов.

    +

    Например, поиск всех сущностей, скалярное поле которых имеет определенное значение:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +
    +

    Прямое получение сущностей по первичному ключу:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    ids=[0, 2],
    +    output_fields=["vector", "text", "subject"],
    +)
    +
    +

    Удалить сущности

    Если вы хотите очистить данные, вы можете удалить сущности, указав первичный ключ, или удалить все сущности, соответствующие определенному выражению фильтра.

    +
    # Delete entities by primary key
    +res = client.delete(collection_name="demo_collection", ids=[0, 2])
    +
    +print(res)
    +
    +# Delete entities by a filter expression
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'biology'",
    +)
    +
    +print(res)
    +
    +
    [0, 2]
    +[3, 4, 5]
    +
    +

    Загрузка существующих данных

    Поскольку все данные Milvus Lite хранятся в локальном файле, вы можете загрузить все данные в память даже после завершения работы программы, создав MilvusClient с существующим файлом. Например, это позволит восстановить коллекции из файла "milvus_demo.db" и продолжить запись данных в него.

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    Удаление коллекции

    Если вы хотите удалить все данные в коллекции, вы можете сбросить коллекцию с помощью команды

    +
    # Drop collection
    +client.drop_collection(collection_name="demo_collection")
    +
    +

    Подробнее

    Milvus Lite отлично подходит для начала работы с локальной программой на python. Если у вас большие объемы данных или вы хотите использовать Milvus в производстве, вы можете узнать о развертывании Milvus на Docker и Kubernetes. Все режимы развертывания Milvus используют один и тот же API, поэтому при переходе к другому режиму развертывания код на стороне клиента не придется сильно менять. Просто укажите URI и токен сервера Milvus, развернутого в любом месте:

    +
    client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
    +
    +

    Milvus предоставляет API REST и gRPC, а также клиентские библиотеки на таких языках, как Python, Java, Go, C# и Node.js.

    diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.json new file mode 100644 index 000000000..c2aeafded --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.json @@ -0,0 +1 @@ +{"codeList":["# Download the configuration file\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n\n# Start Milvus\n$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker-compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n"],"headingContent":"Run Milvus with Docker Compose (Linux)","anchorList":[{"label":"Запуск Milvus с помощью Docker Compose (Linux)","href":"Run-Milvus-with-Docker-Compose-Linux","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установите Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Остановка и удаление Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.md new file mode 100644 index 000000000..16ee0a7a8 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker-compose.md @@ -0,0 +1,155 @@ +--- +id: install_standalone-docker-compose.md +label: Docker Compose +related_key: Docker Compose +summary: 'Узнайте, как установить Milvus в автономном режиме с помощью Docker Compose.' +title: Запуск Milvus с помощью Docker Compose (Linux) +--- +

    Запуск Milvus с помощью Docker Compose (Linux)

    На этой странице показано, как запустить экземпляр Milvus в Docker с помощью Docker Compose.

    +

    Необходимые условия

    +

    Установите Milvus

    Milvus предоставляет конфигурационный файл Docker Compose в репозитории Milvus. Чтобы установить Milvus с помощью Docker Compose, просто выполните команду

    +
    # Download the configuration file
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +# Start Milvus
    +$ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +
      +
    • Если вам не удалось выполнить приведенную выше команду, проверьте, установлен ли в вашей системе Docker Compose V1. Если это так, рекомендуем перейти на Docker Compose V2 в соответствии с примечаниями на этой странице.

    • +
    • Если у вас возникнут проблемы с извлечением образа, свяжитесь с нами по адресу community@zilliz.com, сообщив подробности проблемы, и мы окажем вам необходимую поддержку.

    • +
    +
    +

    После запуска Milvus,

    +
      +
    • Контейнеры с именами milvus-standalone, milvus-minio и milvus-etcd работают.
        +
      • Контейнер milvus-etcd не открывает никаких портов для хоста и сопоставляет свои данные с томами/etcd в текущей папке.
      • +
      • Контейнер milvus-minio обслуживает порты 9090 и 9091 локально, используя стандартные учетные данные аутентификации, и сопоставляет свои данные с томами/minio в текущей папке.
      • +
      • Контейнер milvus-standalone обслуживает порты 19530 локально с настройками по умолчанию и сопоставляет свои данные с томами/milvus в текущей папке.
      • +
    • +
    +

    Проверить работоспособность контейнеров можно с помощью следующей команды:

    +
    $ sudo docker-compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    Вы также можете зайти в Milvus WebUI по адресу http://127.0.0.1:9091/webui/, чтобы узнать больше о вашем экземпляре Milvus. Для получения подробной информации см. раздел Milvus WebUI.

    +

    Остановка и удаление Milvus

    Остановить и удалить этот контейнер можно следующим образом.

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.json new file mode 100644 index 000000000..c07f1c2ed --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["# Download the installation script\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh\n\n# Start the Docker container\n$ bash standalone_embed.sh start\n","# Stop Milvus\n$ bash standalone_embed.sh stop\n\n# Delete Milvus data\n$ bash standalone_embed.sh delete\n","# upgrade Milvus\n$ bash standalone_embed.sh upgrade\n"],"headingContent":"Run Milvus in Docker (Linux)","anchorList":[{"label":"Запуск Milvus в Docker (Linux)","href":"Run-Milvus-in-Docker-Linux","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установка Milvus в Docker","href":"Install-Milvus-in-Docker","type":2,"isActive":false},{"label":"Остановка и удаление Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.md new file mode 100644 index 000000000..9babd248a --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-docker.md @@ -0,0 +1,142 @@ +--- +id: install_standalone-docker.md +label: Docker +related_key: Docker +summary: 'Узнайте, как установить Milvus в автономном режиме с помощью Docker.' +title: Запуск Milvus в Docker (Linux) +--- +

    Запуск Milvus в Docker (Linux)

    На этой странице показано, как запустить экземпляр Milvus в Docker.

    +

    Необходимые условия

    +

    Установка Milvus в Docker

    Milvus предоставляет сценарий установки для установки в качестве контейнера docker. Сценарий доступен в репозитории Milvus. Чтобы установить Milvus в Docker, просто выполните команду

    +
    # Download the installation script
    +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
    +
    +# Start the Docker container
    +$ bash standalone_embed.sh start
    +
    +
    +

    Если у вас возникнут проблемы с извлечением образа, напишите нам по адресу community@zilliz.com с подробным описанием проблемы, и мы окажем вам необходимую поддержку.

    +
    +

    После запуска сценария установки:

    +
      +
    • Контейнер docker с именем milvus был запущен на порту 19530.
    • +
    • Встроенный etcd установлен вместе с Milvus в том же контейнере и работает на порту 2379. Его конфигурационный файл отображается на embedEtcd.yaml в текущей папке.
    • +
    • Чтобы изменить конфигурацию Milvus по умолчанию, добавьте свои настройки в файл user.yaml в текущей папке, а затем перезапустите службу.
    • +
    • Том данных Milvus отображается на volumes/milvus в текущей папке.
    • +
    +

    Вы можете получить доступ к Milvus WebUI по адресу http://127.0.0.1:9091/webui/, чтобы узнать больше о вашем экземпляре Milvus. Для получения подробной информации см. раздел Milvus WebUI.

    +

    Остановка и удаление Milvus

    Остановить и удалить этот контейнер можно следующим образом.

    +
    # Stop Milvus
    +$ bash standalone_embed.sh stop
    +
    +# Delete Milvus data
    +$ bash standalone_embed.sh delete
    +
    +

    Обновить Milvus до последней версии можно следующим образом.

    +
    # upgrade Milvus
    +$ bash standalone_embed.sh upgrade
    +
    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.json new file mode 100644 index 000000000..97cc07abb --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.json @@ -0,0 +1 @@ +{"codeList":["C:\\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​\n\n","C:\\>standalone.bat start​\nWait for Milvus starting...​\nStart successfully.​\nTo change the default Milvus configuration, edit user.yaml and restart the service.​\n\n","# Stop Milvus​\nC:\\>standalone.bat stop​\nStop successfully.​\n​\n# Delete Milvus container​\nC:\\>standalone.bat delete​\nDelete Milvus container successfully. # Container has been removed.​\nDelete successfully. # Data has been removed.​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","# Download the installation script​\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​\n​\n# Start the Docker container​\n$ bash standalone_embed.sh start​\n\n","$ bash standalone_embed.sh start​\nWait for Milvus Starting...​\nStart successfully.​\nTo change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​\n\n","# Stop Milvus​\n$ bash standalone_embed.sh stop​\nStop successfully.​\n​\n# Delete Milvus data​\n$ bash standalone_embed.sh stop​\nDelete Milvus container successfully.​\nDelete successfully.​\n\n","# Download the configuration file and rename it as docker-compose.yml​\nC:\\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​\n​\n# Start Milvus​\nC:\\>docker compose up -d​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","$ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​\n\n","$ sudo docker compose up -d​\n​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>net start com.docker.service​\nThe Docker for Windows Service service is starting.​\nThe Docker for Windows Service service was started successfully.​\n\n","C:\\>wsl --update​\nChecking for updates.​\nThe most recent version of Windows Subsystem for Linux is already installed.​\n\n","C:\\>cd \"C:\\Program Files\\Docker\\Docker\"​\nC:\\Program Files\\Docker\\Docker>.\\DockerCli.exe -SwitchDaemon​\nSwitching to windows engine: Post \"http://ipc/engine/switch\": open \\\\.\\pipe\\dockerBackendApiServer: The system cannot find the file specified.​\n\n"],"headingContent":"Run Milvus in Docker (Windows)","anchorList":[{"label":"Запуск Milvus в Docker (Windows)","href":"Run-Milvus-in-Docker-Windows","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites​","type":2,"isActive":false},{"label":"Запуск Milvus в Docker","href":"Run-Milvus-in-Docker​","type":2,"isActive":false},{"label":"Запуск Milvus с помощью Docker Compose","href":"Run-Milvus-with-Docker-Compose​","type":2,"isActive":false},{"label":"Вопросы и ответы","href":"FAQs​","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.md new file mode 100644 index 000000000..89acaa120 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/install_standalone-windows.md @@ -0,0 +1,303 @@ +--- +id: install_standalone-windows.md +label: Docker +related_key: Docker +summary: >- + Узнайте, как установить Milvus в автономном режиме с помощью Docker Desktop + для Windows. +title: Запуск Milvus в Docker (Linux) +--- +

    Запуск Milvus в Docker (Windows)

    На этой странице показано, как запустить Milvus под Windows с помощью Docker Desktop for Windows.

    +

    Необходимые условия

    +

    Запуск Milvus в Docker

    Для установки Milvus в качестве контейнера Docker предусмотрен сценарий установки. После установки Docker Desktop на Microsoft Windows вы можете получить доступ к Docker CLI из PowerShell или Windows Command Prompt в режиме администратора и из WSL 2.

    +

    Из PowerShell или Windows Command Prompt

    Если вы лучше знакомы с PowerShell или Windows Command Prompt, командная строка выглядит следующим образом.

    +
      +
    1. Откройте Docker Desktop в режиме администратора, щелкнув правой кнопкой мыши и выбрав пункт "Запуск от имени администратора".

    2. +
    3. Загрузите сценарий установки и сохраните его как standalone.bat.

      +
      C:\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​
      +
      +
    4. +
    5. Запустите загруженный сценарий, чтобы запустить Milvus в качестве контейнера Docker.

      +
      C:\>standalone.bat start​
      +Wait for Milvus starting...​
      +Start successfully.​
      +To change the default Milvus configuration, edit user.yaml and restart the service.​
      +
      +
      +

      После запуска сценария установки.

      +
        +
      • Контейнер docker с именем milvus-standalone был запущен на порту 19530.

      • +
      • Встроенный etcd установлен вместе с Milvus в том же контейнере и работает на порту 2379. Его конфигурационный файл сопоставлен с embedEtcd.yaml в текущей папке.

      • +
      • Том данных Milvus отображается на volumes/milvus в текущей папке.

      • +
      +

      Для управления контейнером Milvus и сохраненными данными можно использовать следующие команды.

      +
      # Stop Milvus​
      +C:\>standalone.bat stop​
      +Stop successfully.​
      +​
      +# Delete Milvus container​
      +C:\>standalone.bat delete​
      +Delete Milvus container successfully. # Container has been removed.​
      +Delete successfully. # Data has been removed.​
      +
      +
    6. +
    +

    Из WSL 2

    Если вы предпочитаете запускать Milvus с помощью команд Linux и сценариев оболочки в Windows, убедитесь, что у вас уже установлена команда WSL 2. Для получения подробной информации об установке команды WSL 2 можно обратиться к этой статье Microsoft.

    +
      +
    1. Запустите WSL 2.

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. Загрузите сценарий установки

      +
      # Download the installation script​
      +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​
      +​
      +# Start the Docker container​
      +$ bash standalone_embed.sh start​
      +
      +
    4. +
    5. Запустите Milvus в качестве контейнера docker.

      +
      $ bash standalone_embed.sh start​
      +Wait for Milvus Starting...​
      +Start successfully.​
      +To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​
      +
      +
      +

      Для управления контейнером Milvus и хранящимися в нем данными можно использовать следующие команды.

      +
      # Stop Milvus​
      +$ bash standalone_embed.sh stop​
      +Stop successfully.​
      +​
      +# Delete Milvus data​
      +$ bash standalone_embed.sh stop​
      +Delete Milvus container successfully.​
      +Delete successfully.​
      +
      +
    6. +
    +

    Запуск Milvus с помощью Docker Compose

    После установки Docker Desktop на Microsoft Windows вы можете получить доступ к Docker CLI из PowerShell или Windows Command Prompt в режиме администратора. Для запуска Milvus можно запустить Docker Compose либо в PowerShell, либо в Windows Command Prompt, либо в WSL 2.

    +

    Из PowerShell или Windows Command Prompt

      +
    1. Откройте Docker Desktop в режиме администратора, щелкнув правой кнопкой мыши и выбрав пункт "Запуск от имени администратора".

    2. +
    3. Выполните следующие команды в PowerShell или Windows Command Prompt, чтобы загрузить файл конфигурации Docker Compose для Milvus Standalone и запустить Milvus.

      +
      # Download the configuration file and rename it as docker-compose.yml​
      +C:\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​
      +​
      +# Start Milvus​
      +C:\>docker compose up -d​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
      +

      В зависимости от вашего сетевого подключения загрузка образов для установки Milvus может занять некоторое время. Когда контейнеры с именами milvus-standalone, milvus-minio и milvus-etcd будут запущены, вы сможете убедиться, что

      +
        +
      • Контейнер milvus-etcd не открывает никаких портов для хоста и сопоставляет свои данные с томами/etcd в текущей папке.

      • +
      • Контейнер milvus-minio обслуживает порты 9090 и 9091 локально, используя стандартные учетные данные аутентификации, и сопоставляет свои данные с томами/minio в текущей папке.

      • +
      • Контейнер milvus-standalone обслуживает порты 19530 локально с настройками по умолчанию и сопоставляет свои данные с томами/milvus в текущей папке.

      • +
    4. +
    +

    Вы также можете вызвать Linux-версию команд Docker Compose, если у вас установлена WSL 2.

    +

    Из WSL 2

    Процедура аналогична использованию Docker Compose для установки Milvus в системах Linux.

    +
      +
    1. Запустите WSL 2.

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. Загрузите файл конфигурации Milvus.

      +
      $ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​
      +
      +
    4. +
    5. Запустите Milvus.

      +
      $ sudo docker compose up -d​
      +​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
    6. +
    +

    Вопросы и ответы

    Как справиться с ошибкой Docker Engine stopped?

    После установки Docker Desktop в Windows вы можете столкнуться с ошибкой Docker Engine stopped, если ваш компьютер не настроен должным образом. В этом случае вам может потребоваться выполнить следующие проверки.

    +
      +
    1. Проверьте, включена ли виртуализация.

      +

      Проверить, включена ли виртуализация, можно на вкладке "Производительность" в диспетчере задач.

      +

      + + Virtualization in Task Manager + Виртуализация в диспетчере задач

      +

      Если виртуализация отключена, вам может потребоваться проверить настройки BIOS в прошивке материнской платы. Способ включения виртуализации в настройках BIOS различается у разных производителей материнских плат. Например, для материнской платы ASUS вы можете обратиться к этой статье о включении виртуализации.

      +

      Затем необходимо перезагрузить компьютер и включить Hyper-V. Подробности см. в этой статье Microsoft.

    2. +
    3. Проверьте, запущена ли служба Docker Desktop Service.

      +

      Чтобы запустить службу Docker Desktop Service, можно выполнить следующую команду.

      +
      C:\>net start com.docker.service​
      +The Docker for Windows Service service is starting.​
      +The Docker for Windows Service service was started successfully.​
      +
      +
    4. +
    5. Проверьте, правильно ли установлена WSL.

      +

      Можно выполнить следующую команду для установки или обновления команды WSL 2.

      +
      C:\>wsl --update​
      +Checking for updates.​
      +The most recent version of Windows Subsystem for Linux is already installed.​
      +
      +
    6. +
    7. Проверьте, запущен ли демон Docker Daemon.

      +

      Необходимо перейти в каталог установки Docker Desktop и выполнить команду .\DockerCli.exe -SwitchDaemon, чтобы запустить Docker Daemon.

      +
      C:\>cd "C:\Program Files\Docker\Docker"​
      +C:\Program Files\Docker\Docker>.\DockerCli.exe -SwitchDaemon​
      +Switching to windows engine: Post "http://ipc/engine/switch": open \\.\pipe\dockerBackendApiServer: The system cannot find the file specified.​
      +
      +
    8. +
    9. Проверьте, запустили ли вы Docker Desktop в режиме администратора.

      +

      Убедитесь, что вы запустили Docker Desktop в режиме администратора. Для этого щелкните правой кнопкой мыши на Docker Desktop и выберите Запуск от имени администратора.

      +

      + + Start Docker Desktop as Administrator + Запуск Docker Desktop от имени администратора

    10. +
    +

    Если вы столкнулись с проблемами, связанными с WSL, при запуске Milvus из WSL 2, вам может понадобиться проверить, настроен ли Docker Desktop на использование движка на базе WSL 2, как показано ниже.

    +
      +
    1. Убедитесь, что в разделе "Настройки" > "Общие" установлен флажок "Использовать движок на базе WSL 2".

      +

      + + Use the WSL 2 based engine in Docker Desktop Settings + Использовать движок на базе WSL 2 в настройках Docker Desktop

    2. +
    3. Выберите из установленных дистрибутивов WSL 2 тот, для которого вы хотите включить интеграцию с Docker, перейдя в меню: Настройки > Ресурсы > Интеграция WSL.

      +

      + + Select WSL 2 distributions in Docker Desktop Settings + Выберите дистрибутивы WSL 2 в настройках Docker Desktop .

    4. +
    +

    + + Read config failed error prompt in Milvus startup + Ошибка чтения конфигурации при запуске Milvus

    +

    Чтобы справиться с ошибкой "Read config failed", возникающей при запуске Milvus, необходимо проверить, правильно ли смонтирован том в контейнере Milvus. Если том правильно смонтирован в контейнер, вы можете использовать команду docker exec, чтобы зайти в контейнер и перечислить папку /milvus/configs следующим образом.

    +

    + + List Milvus config files + Список файлов конфигурации Milvus

    +

    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.json new file mode 100644 index 000000000..ad268be46 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n"],"headingContent":"Requirements for Installing Milvus with Docker Compose","anchorList":[{"label":"Требования к установке Milvus с помощью Docker Compose","href":"Requirements-for-Installing-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"Требования к оборудованию","href":"Hardware-requirements","type":2,"isActive":false},{"label":"Требования к программному обеспечению","href":"Software-requirements","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.md new file mode 100644 index 000000000..fb928b702 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-docker/prerequisite-docker.md @@ -0,0 +1,113 @@ +--- +id: prerequisite-docker.md +label: Docker requirements +related_key: Docker +summary: >- + Узнайте о необходимых подготовительных мероприятиях перед установкой Milvus с + помощью Docker Compose. +title: Требования к установке Milvus с помощью Docker Compose +--- +

    Требования к установке Milvus с помощью Docker Compose

    Перед установкой экземпляра Milvus проверьте свое оборудование и программное обеспечение, чтобы убедиться, что они соответствуют требованиям.

    +

    Требования к оборудованию

    + + + + + + + + + +
    КомпонентТребованиеРекомендацияПримечание
    ПРОЦЕССОР
    • Процессор Intel 2-го поколения Core или выше
    • Apple Silicon
    • Автономный: 4 ядра или более
    • Кластер: 8 ядер и более
    Набор инструкций процессора
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Поиск векторного сходства и построение индексов в Milvus требуют поддержки процессором наборов расширений "одна инструкция - несколько данных" (SIMD). Убедитесь, что процессор поддерживает хотя бы одно из перечисленных расширений SIMD. Дополнительные сведения см. в разделе "Процессоры с AVX".
    ОПЕРАТИВНАЯ ПАМЯТЬ
    • Автономный: 8 Гб
    • Кластер: 32G
    • Автономная: 16 Гб
    • Кластер: 128G
    Объем оперативной памяти зависит от объема данных.
    Жесткий дискТвердотельный накопитель SATA 3.0 или вышеТвердотельный накопитель NVMe или вышеОбъем жесткого диска зависит от объема данных.
    +

    Требования к программному обеспечению

    + + + + + + + + +
    Операционная системаПрограммное обеспечениеПримечание
    macOS 10.14 или более поздняя версияРабочий стол DockerУстановите виртуальную машину Docker (VM) так, чтобы она использовала минимум 2 виртуальных процессора (vCPU) и 8 ГБ начальной памяти. В противном случае установка может завершиться неудачей.
    Дополнительные сведения см. в разделе Установка Docker Desktop на Mac.
    Платформы Linux
    • Docker 19.03 или более поздняя версия
    • Docker Compose 1.25.1 или более поздней версии.
    Дополнительные сведения см. в разделах Установка Docker Engine и Установка Docker Compose.
    Windows с включенным WSL 2Рабочий стол DockerМы рекомендуем хранить исходный код и другие данные, привязанные к контейнерам Linux, в файловой системе Linux, а не в файловой системе Windows.
    Дополнительную информацию см. в разделе Установка Docker Desktop на Windows с бэкендом WSL 2.
    +

    Следующие зависимости будут получены и настроены автоматически при установке Milvus Standalone с помощью сценария Docker или конфигурации Docker Compose:

    + + + + + + + + + +
    Программное обеспечениеВерсияПримечание
    etcd3.5.0См. дополнительные требования к диску.
    MinIORELEASE.2023-03-20T20-16-18Z
    Pulsar2.8.2
    +

    Дополнительные требования к диску

    Производительность дисков очень важна для работы etcd. Настоятельно рекомендуется использовать локальные NVMe SSD. Более медленный отклик диска может привести к частым выборам кластера, что в конечном итоге приведет к деградации сервиса etcd.

    +

    Чтобы проверить, соответствует ли ваш диск требованиям, используйте fio.

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    В идеале ваш диск должен достигать более 500 IOPS и менее 10 мс для 99-го процентиля задержки fsync. Более подробные требования можно найти в документации по etcd.

    +

    Что дальше

    Если ваше оборудование и программное обеспечение соответствуют вышеуказанным требованиям, вы можете

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json new file mode 100644 index 000000000..b35b86503 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nstandalone:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datacoord-6fd4bd885c-gkzwx 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexcoord-5bfcf6bdd8-nmh5l 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querycoord-579cd79455-xht5n 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-milvus-rootcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 30s\nmy-release-milvus-standalone-54c4f88cb9-f84pf 1/1 Running 0 30s\nmy-release-minio-5564fbbddc-mz7f5 1/1 Running 0 30s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus with GPU Support Using Helm Chart","anchorList":[{"label":"Запуск Milvus с поддержкой GPU с помощью Helm Chart","href":"Run-Milvus-with-GPU-Support-Using-Helm-Chart","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установите Helm Chart для Milvus","href":"Install-Helm-Chart-for-Milvus","type":2,"isActive":false},{"label":"Запуск Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"Доступ к Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Удаление Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md new file mode 100644 index 000000000..c319e096e --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md @@ -0,0 +1,378 @@ +--- +id: install_cluster-helm-gpu.md +label: Cluster (Helm) +related_key: Kubernetes +summary: 'Узнайте, как установить кластер Milvus на Kubernetes.' +title: Запуск Milvus с поддержкой GPU с помощью Helm Chart +--- +

    Запуск Milvus с поддержкой GPU с помощью Helm Chart

    На этой странице показано, как запустить экземпляр Milvus с поддержкой GPU с помощью Helm Chart.

    +

    Обзор

    Helm использует формат упаковки, называемый диаграммами. Диаграмма - это набор файлов, описывающих связанный набор ресурсов Kubernetes. Milvus предоставляет набор диаграмм, чтобы помочь вам развернуть зависимости и компоненты Milvus. Milvus Helm Chart - это решение, которое обеспечивает развертывание Milvus на кластере Kubernetes (K8s) с помощью менеджера пакетов Helm.

    +

    Необходимые условия

    +
    +

    Если у вас возникнут проблемы с установкой образа, свяжитесь с нами по адресу community@zilliz.com и подробно опишите проблему, и мы окажем вам необходимую поддержку.

    +
    +

    Установите Helm Chart для Milvus

    Helm - это менеджер пакетов K8s, который поможет вам быстро развернуть Milvus.

    +
      +
    1. Добавьте репозиторий Milvus Helm.
    2. +
    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    Репозиторий Milvus Helm Charts по адресу https://milvus-io.github.io/milvus-helm/ был заархивирован, и вы можете получать дальнейшие обновления по адресу https://zilliztech.github.io/milvus-helm/ следующим образом:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    Архивное хранилище по-прежнему доступно для графиков до версии 4.0.31. Для более поздних выпусков используйте новое репо.

    +
    +
      +
    1. Обновление графиков локально.
    2. +
    +
    $ helm repo update
    +
    +

    Запуск Milvus

    После установки диаграммы Helm вы можете запустить Milvus на Kubernetes. В этом разделе мы расскажем вам о том, как запустить Milvus с поддержкой GPU.

    +

    Вы должны запустить Milvus с помощью Helm, указав имя релиза, диаграмму и параметры, которые вы хотите изменить. В этом руководстве мы используем my-release в качестве имени релиза. Чтобы использовать другое имя релиза, замените my-release в следующих командах на то, которое вы используете.

    +

    Milvus позволяет назначить Milvus одно или несколько GPU-устройств.

    +

    1. Назначение одного устройства GPU

    Milvus с поддержкой GPU позволяет назначить одно или несколько GPU-устройств.

    +
      +
    • Кластер Milvus

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
    • +
    • Автономный Milvus

      +
      cat <<EOF > custom-values.yaml
      +standalone:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2. Назначение нескольких устройств GPU

    Помимо одного GPU-устройства, вы можете назначить Milvus несколько GPU-устройств.

    +
      +
    • Кластер Milvus

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      В приведенной выше конфигурации indexNode и queryNode используют два GPU совместно. Чтобы назначить разные GPU для indexNode и queryNode, можно соответствующим образом изменить конфигурацию, задав в конфигурационном файле extraEnv следующие параметры:

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
      +
      +
        +
      • Имя релиза должно содержать только буквы, цифры и тире. Точки в имени релиза не допускаются.
      • +
      • Командная строка по умолчанию устанавливает кластерную версию Milvus при установке Milvus с Helm. При самостоятельной установке Milvus требуется дополнительная настройка.
      • +
      • Согласно руководству Kuberenetes по миграции устаревших API, версия API policy/v1beta1 для PodDisruptionBudget больше не обслуживается начиная с версии 1.25. Вам предлагается перевести манифесты и API-клиенты на использование версии API policy/v1.
        В качестве обходного пути для пользователей, которые все еще используют API-версию PodDisruptionBudget policy/v1beta1 на Kuberenetes v1.25 и более поздних версиях, вы можете выполнить следующую команду для установки Milvus:
        . helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
      • +
      • Дополнительные сведения см. в разделах Milvus Helm Chart и Helm.
      • +
      +
      +
    • +
    • Автономный Milvus

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      В приведенной выше конфигурации indexNode и queryNode совместно используют два GPU. Чтобы назначить разные GPU для indexNode и queryNode, можно соответствующим образом изменить конфигурацию, задав extraEnv в файле конфигурации следующим образом:

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2. Проверка состояния Milvus

    Выполните следующую команду, чтобы проверить состояние Milvus:

    +
    $ kubectl get pods
    +
    +

    После запуска Milvus в столбце READY отображается 1/1 для всех стручков.

    +
      +
    • Кластер Milvus

      +
      NAME                                             READY  STATUS   RESTARTS  AGE
      +my-release-etcd-0                                1/1    Running   0        3m23s
      +my-release-etcd-1                                1/1    Running   0        3m23s
      +my-release-etcd-2                                1/1    Running   0        3m23s
      +my-release-milvus-datacoord-6fd4bd885c-gkzwx     1/1    Running   0        3m23s
      +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
      +my-release-milvus-indexcoord-5bfcf6bdd8-nmh5l    1/1    Running   0        3m23s
      +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
      +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
      +my-release-milvus-querycoord-579cd79455-xht5n    1/1    Running   0        3m24s
      +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
      +my-release-milvus-rootcoord-7fb9488465-dmbbj     1/1    Running   0        3m23s
      +my-release-minio-0                               1/1    Running   0        3m23s
      +my-release-minio-1                               1/1    Running   0        3m23s
      +my-release-minio-2                               1/1    Running   0        3m23s
      +my-release-minio-3                               1/1    Running   0        3m23s
      +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
      +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
      +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
      +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
      +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
      +
    • +
    • Автономный Milvus

      +
      NAME                                               READY   STATUS      RESTARTS   AGE
      +my-release-etcd-0                                  1/1     Running     0          30s
      +my-release-milvus-standalone-54c4f88cb9-f84pf      1/1     Running     0          30s
      +my-release-minio-5564fbbddc-mz7f5                  1/1     Running     0          30s
      +
    • +
    +

    3. Перенаправьте локальный порт на Milvus

    Проверьте, какой локальный порт прослушивает сервер Milvus. Замените имя стручка на свое собственное.

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Затем выполните следующую команду, чтобы перенаправить локальный порт на порт, на котором работает Milvus.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    По желанию вы можете использовать :19530 вместо 27017:19530 в приведенной выше команде, чтобы kubectl выделил локальный порт для вас, и вам не пришлось бы управлять конфликтами портов.

    +

    По умолчанию переадресация портов в kubectl прослушивает только localhost. Используйте флаг address, если хотите, чтобы Milvus слушал выбранный или все IP-адреса. Следующая команда заставляет port-forward слушать все IP-адреса на хост-машине.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Теперь вы можете подключиться к Milvus, используя перенаправленный порт.

    +

    Доступ к Milvus WebUI

    Milvus поставляется со встроенным GUI-инструментом Milvus WebUI, доступ к которому можно получить через браузер. Milvus Web UI улучшает наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. С помощью Milvus Web UI можно просматривать статистику и метрики компонентов и зависимостей Milvus, проверять детали баз данных и коллекций, а также выводить список подробных конфигураций Milvus. Подробные сведения о Milvus Web UI см. в разделе Milvus WebUI.

    +

    Чтобы включить доступ к Milvus Web UI, вам нужно перенаправить порт прокси-под на локальный порт.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Теперь вы можете получить доступ к Milvus Web UI по адресу http://localhost:27018.

    +

    Удаление Milvus

    Выполните следующую команду, чтобы удалить Milvus.

    +
    $ helm uninstall my-release
    +
    +

    Что дальше

    Установив Milvus, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json new file mode 100644 index 000000000..44e5b0c42 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: [\"0\"]\n...\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: ['0', '1']\n...\n","$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","$ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone\n","$ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n","docker cp :/milvus/configs/milvus.yaml milvus.yaml\n","vim milvus.yaml\n","...\ngpu:\n initMemSize: 0\n maxMemSize: 0\n...\n","docker cp milvus.yaml :/milvus/configs/milvus.yaml\n","docker stop \ndocker start \n"],"headingContent":"Run Milvus with GPU Support Using Docker Compose","anchorList":[{"label":"Запуск Milvus с поддержкой GPU с помощью Docker Compose","href":"Run-Milvus-with-GPU-Support-Using-Docker-Compose","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установка Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"Настройка пула памяти","href":"Configure-memory-pool","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md new file mode 100644 index 000000000..62bb3f55a --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md @@ -0,0 +1,224 @@ +--- +id: install_standalone-docker-compose-gpu.md +label: Standalone (Docker Compose) +related_key: Kubernetes +summary: 'Узнайте, как установить кластер Milvus на Kubernetes.' +title: Запуск Milvus с поддержкой GPU с помощью Docker Compose +--- +

    Запуск Milvus с поддержкой GPU с помощью Docker Compose

    На этой странице показано, как запустить экземпляр Milvus с поддержкой GPU с помощью Docker Compose.

    +

    Необходимые условия

    +
    +

    Если у вас возникнут проблемы с запуском образа, свяжитесь с нами по адресу community@zilliz.com и подробно расскажите о проблеме, и мы окажем вам необходимую поддержку.

    +
    +

    Установка Milvus

    Чтобы установить Milvus с поддержкой GPU с помощью Docker Compose, выполните следующие действия.

    +

    1. Загрузите и настройте YAML-файл

    Скачайте milvus-standalone-docker-compose-gpu.yml и сохраните его как docker-compose.yml вручную или с помощью следующей команды.

    +
    $ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml
    +
    +

    В YAML-файле необходимо внести некоторые изменения в переменные окружения автономной службы:

    +
      +
    • Чтобы назначить конкретное GPU-устройство для Milvus, найдите поле deploy.resources.reservations.devices[0].devices_ids в определении сервиса standalone и замените его значение на ID нужного GPU. Для определения идентификатора GPU-устройства можно использовать инструмент nvidia-smi, входящий в состав драйверов дисплея NVIDIA GPU. Milvus поддерживает несколько устройств GPU.
    • +
    +

    Назначьте Milvus одно устройство GPU:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ["0"]
    +...
    +
    +

    Назначить несколько устройств GPU для Milvus:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ['0', '1']
    +...
    +
    +

    2. Запустите Milvus

    В директории, содержащей файл docker-compose.yml, запустите Milvus, выполнив команду:

    +
    $ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +

    Если вам не удалось выполнить вышеуказанную команду, проверьте, установлен ли в вашей системе Docker Compose V1. Если это так, рекомендуем перейти на Docker Compose V2 в соответствии с примечаниями на этой странице.

    +
    +

    После запуска Milvus,

    +
      +
    • Появились контейнеры с именами milvus-standalone, milvus-minio и milvus-etcd.
        +
      • Контейнер milvus-etcd не открывает никаких портов для хоста и сопоставляет свои данные с томами/etcd в текущей папке.
      • +
      • Контейнер milvus-minio обслуживает порты 9090 и 9091 локально, используя стандартные учетные данные аутентификации, и сопоставляет свои данные с томами/minio в текущей папке.
      • +
      • Контейнер milvus-standalone обслуживает порты 19530 локально с настройками по умолчанию и сопоставляет свои данные с томами/milvus в текущей папке.
      • +
    • +
    +

    Проверить работоспособность контейнеров можно с помощью следующей команды:

    +
    $ sudo docker compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    Вы также можете зайти в Milvus WebUI по адресу http://127.0.0.1:9091/webui/, чтобы узнать больше о вашем экземпляре Milvus. Для получения подробной информации см. раздел Milvus WebUI.

    +

    Если в файле docker-compose.yml вы назначили несколько GPU-устройств для Milvus, вы можете указать, какое GPU-устройство будет видимым или доступным для использования.

    +

    Сделайте GPU-устройство 0 видимым для Milvus:

    +
    $ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone
    +
    +

    Сделать GPU-устройства 0 и 1 видимыми для Milvus:

    +
    $ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone
    +
    +

    Остановить и удалить этот контейнер можно следующим образом.

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    Настройка пула памяти

    После запуска Milvus вы можете настроить пул памяти, изменив параметры initMemSize и maxMemSize в файле milvus.yaml.

    +
    +

    Файл milvus.yaml находится в каталоге /milvus/configs/ внутри контейнера Milvus.

    +
    +

    Чтобы настроить пул памяти, измените параметры initMemSize и maxMemSize в файле milvus.yaml следующим образом.

    +
      +
    1. Используйте следующую команду, чтобы скопировать milvus.yaml из контейнера Milvus на локальную машину. Замените <milvus_container_id> на реальный идентификатор контейнера Milvus.

      +
      docker cp <milvus_container_id>:/milvus/configs/milvus.yaml milvus.yaml
      +
    2. +
    3. Откройте скопированный файл milvus.yaml в удобном для вас текстовом редакторе. Например, с помощью vim:

      +
      vim milvus.yaml
      +
    4. +
    5. Отредактируйте настройки initMemSize и maxMemSize по мере необходимости и сохраните изменения:

      +
      ...
      +gpu:
      +  initMemSize: 0
      +  maxMemSize: 0
      +...
      +
      +
        +
      • initMemSize: Начальный размер пула памяти. По умолчанию 1024.
      • +
      • maxMemSize: Максимальный размер пула памяти. По умолчанию 2048.
      • +
    6. +
    7. Используйте следующую команду, чтобы скопировать измененный файл milvus.yaml обратно в контейнер Milvus. Замените <milvus_container_id> на реальный идентификатор контейнера Milvus.

      +
      docker cp milvus.yaml <milvus_container_id>:/milvus/configs/milvus.yaml
      +
    8. +
    9. Перезапустите контейнер Milvus, чтобы применить изменения:

      +
      docker stop <milvus_container_id>
      +docker start <milvus_container_id>
      +
    10. +
    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.json new file mode 100644 index 000000000..359e04e20 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545\n","$ modinfo nvidia | grep \"^version\"\nversion: 545.29.06\n","$ minikube start\n","$ kubectl cluster-info\n"," $ kubectl describe node \n\n Capacity:\n ...\n nvidia.com/gpu: 4\n ...\n Allocatable:\n ...\n nvidia.com/gpu: 4\n ...\n ``` \n"],"headingContent":"Requirements for Installing Milvus with GPU","anchorList":[{"label":"Требования для установки Milvus с GPU","href":"Requirements-for-Installing-Milvus-with-GPU","type":1,"isActive":false},{"label":"Вычислительная способность","href":"Compute-capability","type":2,"isActive":false},{"label":"Драйвер NVIDIA","href":"NVIDIA-driver","type":2,"isActive":false},{"label":"Требования к программному обеспечению","href":"Software-requirements","type":2,"isActive":false},{"label":"Вопросы и ответы","href":"FAQs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.md new file mode 100644 index 000000000..48cbd479a --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-gpu/prerequisite-gpu.md @@ -0,0 +1,149 @@ +--- +id: prerequisite-gpu.md +label: GPU requirements +related_key: GPU +summary: Перед установкой Milvus с GPU проведите необходимую подготовку. +title: Требования для установки Milvus с GPU +--- +

    Требования для установки Milvus с GPU

    На этой странице перечислены требования к аппаратному и программному обеспечению для установки Milvus с поддержкой GPU.

    +

    Вычислительная способность

    Вычислительная способность вашего GPU-устройства должна быть одной из следующих: 6.0, 7.0, 7.5, 8.0, 8.6, 9.0.

    +

    Чтобы проверить, соответствует ли ваше GPU-устройство этому требованию, проверьте Your GPU Compute Capability на сайте разработчика NVIDIA.

    +

    Драйвер NVIDIA

    Драйвер NVIDIA для вашего GPU-устройства должен быть установлен в одном из поддерживаемых дистрибутивов Linux, а набор инструментов NVIDIA Container Toolkit должен быть установлен в соответствии с этим руководством.

    +

    Для пользователей Ubuntu 22.04 вы можете установить драйвер и набор инструментов для контейнеров с помощью следующих команд:

    +
    $ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545
    +
    +

    Для пользователей других ОС обратитесь к официальному руководству по установке.

    +

    Проверить правильность установки драйвера можно, выполнив следующую команду:

    +
    $ modinfo nvidia | grep "^version"
    +version:        545.29.06
    +
    +

    Рекомендуется использовать драйверы версии 545 и выше.

    +

    Требования к программному обеспечению

    Кластер Kubernetes рекомендуется запускать на платформах Linux.

    +
      +
    • kubectl - это инструмент командной строки для Kubernetes. Используйте версию kubectl, которая находится в пределах одного минорного различия версий для вашего кластера. Использование последней версии kubectl поможет избежать непредвиденных проблем.
    • +
    • minikube необходим при локальном запуске кластера Kubernetes. minikube требует наличия Docker в качестве зависимости. Убедитесь, что вы установили Docker перед установкой Milvus с помощью Helm. Дополнительные сведения см. в разделе Получить Docker.
    • +
    + + + + + + + +
    Операционная системаПрограммное обеспечениеПримечание
    Платформы Linux
    • Kubernetes 1.16 или более поздняя версия
    • kubectl
    • Helm 3.0.0 или более поздняя версия
    • minikube (для автономного Milvus)
    • Docker 19.03 или более поздней версии (для автономного Milvus)
    Дополнительные сведения см. в документации Helm.
    +

    Вопросы и ответы

    Как я могу запустить кластер K8s локально для тестирования?

    Вы можете использовать такие инструменты, как minikube, kind и Kubeadm, для быстрой локальной настройки кластера Kubernetes. В следующей процедуре в качестве примера используется minikube.

    +
      +
    1. Загрузите minikube
    2. +
    +

    Перейдите на страницу Get Started, проверьте, выполнены ли условия, перечисленные в разделе What you'll need, нажмите на кнопки, описывающие вашу целевую платформу, и скопируйте команды для загрузки и установки бинарного файла.

    +
      +
    1. Запуск кластера K8s с помощью minikube
    2. +
    +
    $ minikube start
    +
    +
      +
    1. Проверка состояния кластера K8s
    2. +
    +

    Вы можете проверить состояние установленного кластера K8s с помощью следующей команды.

    +
    $ kubectl cluster-info
    +
    +
    +

    Убедитесь, что вы можете получить доступ к кластеру K8s через kubectl. Если вы не установили kubectl локально, смотрите раздел Использование kubectl внутри minikube.

    +
    +

    Как запустить кластер K8s с рабочими узлами на GPU?

    Если вы предпочитаете использовать рабочие узлы с поддержкой GPU, вы можете выполнить следующие шаги, чтобы создать кластер K8s с рабочими узлами на GPU. Мы рекомендуем установить Milvus на кластер K8s с рабочими узлами на GPU и использовать класс хранения по умолчанию.

    +
      +
    1. Подготовьте рабочие узлы с GPU
    2. +
    +

    Чтобы использовать рабочие узлы с поддержкой GPU, выполните действия, описанные в разделе Подготовка узлов с GPU.

    +
      +
    1. Включите поддержку GPU на K8s
    2. +
    +

    Разверните плагин nvidia-device-plugin с помощью Helm, выполнив следующие шаги.

    +

    После настройки просмотрите ресурсы GPU с помощью следующей команды. Замените <gpu-worker-node> на фактическое имя узла.

    +
      $ kubectl describe node <gpu-worker-node>
    +
    +  Capacity:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  Allocatable:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  ```  
    +
    diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.json new file mode 100644 index 000000000..151b421d2 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm/\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","$ helm install my-release milvus/milvus\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-mixcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm template my-release milvus/milvus > milvus_manifest.yaml\n","$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt\n$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py\n","$ pip3 install -r requirements.txt\n$ python3 save_image.py --manifest milvus_manifest.yaml\n","$ for image in $(find . -type f -name \"*.tar.gz\") ; do gunzip -c $image | docker load; done\n","$ kubectl apply -f milvus_manifest.yaml\n","$ helm repo update\n$ helm upgrade my-release zilliztech/milvus\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus in Kubernetes with Helm","anchorList":[{"label":"Запуск Milvus в Kubernetes с помощью Helm","href":"Run-Milvus-in-Kubernetes-with-Helm","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установка Milvus Helm Chart","href":"Install-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"Онлайн-установка","href":"Online-install","type":2,"isActive":false},{"label":"Доступ к Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Доступ к Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Автономная установка","href":"Offline-install","type":2,"isActive":false},{"label":"Обновление запущенного кластера Milvus","href":"Upgrade-running-Milvus-cluster","type":2,"isActive":false},{"label":"Деинсталляция Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.md new file mode 100644 index 000000000..649730bd8 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-helm.md @@ -0,0 +1,335 @@ +--- +id: install_cluster-helm.md +label: Helm +related_key: Kubernetes +summary: 'Узнайте, как установить кластер Milvus на Kubernetes.' +title: Установите кластер Milvus с помощью Helm +--- +

    Запуск Milvus в Kubernetes с помощью Helm

    На этой странице показано, как запустить экземпляр Milvus в Kubernetes с помощью диаграмм Milvus Helm.

    +

    Обзор

    Helm использует формат упаковки, называемый диаграммами. Диаграмма - это набор файлов, которые описывают связанный набор ресурсов Kubernetes. Milvus предоставляет набор диаграмм, чтобы помочь вам развернуть зависимости и компоненты Milvus.

    +

    Необходимые условия

    +
    +

    Если у вас возникнут проблемы с установкой образа, свяжитесь с нами по адресу community@zilliz.com и подробно расскажите о проблеме, и мы окажем вам необходимую поддержку.

    +
    +

    Установка Milvus Helm Chart

    Перед установкой Milvus Helm Charts необходимо добавить репозиторий Milvus Helm.

    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    Репозиторий Milvus Helm Charts по адресу https://github.com/milvus-io/milvus-helm был заархивирован, и вы можете получать дальнейшие обновления с https://github.com/zilliztech/milvus-helm следующим образом:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    Архивное хранилище по-прежнему доступно для графиков до версии 4.0.31. Для более поздних выпусков используйте новое репо.

    +
    +

    Затем извлеките графики Milvus из репозитория следующим образом:

    +
    $ helm repo update
    +
    +

    Вы всегда можете выполнить эту команду, чтобы получить последние диаграммы Milvus Helm.

    +

    Онлайн-установка

    1. Разверните кластер Milvus

    После установки диаграммы Helm вы можете запустить Milvus на Kubernetes. В этом разделе мы рассмотрим шаги по запуску Milvus.

    +
    $ helm install my-release milvus/milvus
    +
    +

    В приведенной выше команде my-release - это название релиза, а milvus/milvus - локально установленный репозиторий графика. Чтобы использовать другое имя, замените my-release на то, которое вы считаете нужным.

    +

    Приведенная выше команда развертывает кластер Milvus с его компонентами и зависимостями, используя конфигурации по умолчанию. Чтобы настроить эти параметры, мы рекомендуем использовать Milvus Sizing Tool для настройки конфигураций на основе фактического объема данных, а затем загрузить соответствующий YAML-файл. Чтобы узнать больше о параметрах конфигурации, обратитесь к разделу Контрольный список конфигураций системы Milvus.

    +
    +
      +
    • Название релиза должно содержать только буквы, цифры и тире. Точки в имени релиза не допускаются.
    • +
    • Командная строка по умолчанию устанавливает кластерную версию Milvus при установке Milvus с Helm. При самостоятельной установке Milvus требуется дополнительная настройка.
    • +
    • Согласно руководству по миграции устаревших API в Kubernetes, версия API policy/v1beta1 для PodDisruptionBudget больше не обслуживается, начиная с версии 1.25. Вам предлагается перевести манифесты и API-клиенты на использование версии API policy/v1.
      В качестве обходного пути для пользователей, которые все еще используют API-версию PodDisruptionBudget policy/v1beta1 на Kubernetes v1.25 и более поздних версиях, вы можете выполнить следующую команду для установки Milvus:
      . helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
    • +
    • Дополнительные сведения см. в разделах Milvus Helm Chart и Helm.
    • +
    +
    +

    2. Проверка состояния кластера Milvus

    Выполните следующую команду, чтобы проверить состояние всех стручков в вашем кластере Milvus.

    +
    $ kubectl get pods
    +
    +

    Если все подсистемы запущены, результат выполнения команды должен быть похож на следующий:

    +
    NAME                                             READY  STATUS   RESTARTS  AGE
    +my-release-etcd-0                                1/1    Running   0        3m23s
    +my-release-etcd-1                                1/1    Running   0        3m23s
    +my-release-etcd-2                                1/1    Running   0        3m23s
    +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
    +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
    +my-release-milvus-mixcoord-7fb9488465-dmbbj      1/1    Running   0        3m23s
    +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
    +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
    +my-release-minio-0                               1/1    Running   0        3m23s
    +my-release-minio-1                               1/1    Running   0        3m23s
    +my-release-minio-2                               1/1    Running   0        3m23s
    +my-release-minio-3                               1/1    Running   0        3m23s
    +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
    +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
    +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
    +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
    +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
    +
    +

    Вы также можете получить доступ к Milvus WebUI по адресу http://127.0.0.1:9091/webui/, чтобы узнать больше о вашем экземпляре Milvus. Для получения подробной информации см. раздел Milvus WebUI.

    +

    3. Перенаправление локального порта в Milvus

    Выполните следующую команду, чтобы узнать порт, на котором работает ваш кластер Milvus.

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Результат показывает, что экземпляр Milvus обслуживается на порту по умолчанию 19530.

    +
    +

    Если вы развернули Milvus в автономном режиме, измените имя стручка с my-release-milvus-proxy-xxxxxxxxxx-xxxxx на my-release-milvus-xxxxxxxxxx-xxxxx.

    +
    +

    Затем выполните следующую команду, чтобы перенаправить локальный порт на порт, на котором работает Milvus.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    По желанию вы можете использовать :19530 вместо 27017:19530 в приведенной выше команде, чтобы kubectl выделил локальный порт для вас, и вам не пришлось бы управлять конфликтами портов.

    +

    По умолчанию переадресация портов в kubectl прослушивает только localhost. Используйте флаг address, если хотите, чтобы Milvus слушал выбранный или все IP-адреса. Следующая команда заставляет port-forward слушать все IP-адреса на хост-машине.

    +

    Теперь вы можете подключиться к Milvus, используя перенаправленный порт.

    +

    Доступ к Milvus WebUI

    Milvus поставляется со встроенным GUI-инструментом Milvus WebUI, доступ к которому можно получить через браузер. Milvus Web UI улучшает наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. С помощью Milvus Web UI можно просматривать статистику и метрики компонентов и зависимостей Milvus, проверять детали баз данных и коллекций, а также выводить список подробных конфигураций Milvus. Подробные сведения о Milvus Web UI см. в разделе Milvus WebUI.

    +

    Чтобы включить доступ к Milvus Web UI, вам нужно перенаправить порт прокси-под на локальный порт.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Теперь вы можете получить доступ к Milvus Web UI по адресу http://localhost:27018.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Теперь вы можете подключиться к Milvus, используя перенаправленный порт.

    +

    Доступ к Milvus WebUI

    Milvus поставляется со встроенным GUI-инструментом Milvus WebUI, доступ к которому можно получить через браузер. Milvus Web UI улучшает наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. С помощью Milvus Web UI можно просматривать статистику и метрики компонентов и зависимостей Milvus, проверять детали баз данных и коллекций, а также выводить список подробных конфигураций Milvus. Подробные сведения о Milvus Web UI см. в разделе Milvus WebUI.

    +

    Чтобы включить доступ к Milvus Web UI, вам нужно перенаправить порт прокси-под на локальный порт.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Теперь вы можете получить доступ к Milvus Web UI по адресу http://localhost:27018.

    +

    Автономная установка

    Если вы находитесь в среде с ограниченными сетевыми возможностями, выполните процедуру, описанную в этом разделе, чтобы запустить кластер Milvus.

    +

    1. Получите манифест Milvus

    Выполните следующую команду, чтобы получить манифест Milvus.

    +
    $ helm template my-release milvus/milvus > milvus_manifest.yaml
    +
    +

    Приведенная выше команда создает шаблоны графиков для кластера Milvus и сохраняет результаты в файле манифеста с именем milvus_manifest.yaml. Используя этот манифест, вы можете установить кластер Milvus с его компонентами и зависимостями в отдельных капсулах.

    +
    +
      +
    • Для установки экземпляра Milvus в автономном режиме, когда все компоненты Milvus содержатся в одном подкате, следует запустить helm template my-release --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false milvus/milvus > milvus_manifest.yaml, чтобы вывести шаблоны графиков для экземпляра Milvus в автономном режиме.
    • +
    • Чтобы изменить конфигурацию Milvus, загрузите value.yaml шаблон, поместите в него нужные настройки и используйте helm template -f values.yaml my-release milvus/milvus > milvus_manifest.yaml для рендеринга манифеста в соответствии с ними.
    • +
    +
    +

    2. Скачайте скрипт извлечения изображений

    Скрипт извлечения изображений разработан на языке Python. Вы должны загрузить скрипт вместе с его зависимостями в файле requirement.txt.

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt
    +$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py
    +
    +

    3. Извлечение и сохранение изображений

    Выполните следующую команду, чтобы извлечь и сохранить нужные изображения.

    +
    $ pip3 install -r requirements.txt
    +$ python3 save_image.py --manifest milvus_manifest.yaml
    +
    +

    Изображения будут извлечены в подпапку с именем images в текущем каталоге.

    +

    4. Загрузка изображений

    Теперь вы можете загрузить образы на хосты в среде с сетевыми ограничениями следующим образом:

    +
    $ for image in $(find . -type f -name "*.tar.gz") ; do gunzip -c $image | docker load; done
    +
    +

    5. Развертывание Milvus

    $ kubectl apply -f milvus_manifest.yaml
    +
    +

    До этого момента вы можете выполнить шаги 2 и 3 онлайн-установки, чтобы проверить состояние кластера и перенаправить локальный порт на Milvus.

    +

    Обновление запущенного кластера Milvus

    Выполните следующую команду, чтобы обновить работающий кластер Milvus до последней версии:

    +
    $ helm repo update
    +$ helm upgrade my-release zilliztech/milvus
    +
    +

    Деинсталляция Milvus

    Выполните следующую команду, чтобы удалить Milvus.

    +
    $ helm uninstall my-release
    +
    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json new file mode 100644 index 000000000..5800b743b --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml\n","customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created\nnamespace/cert-manager created\nserviceaccount/cert-manager-cainjector created\n...\nservice/cert-manager created\nservice/cert-manager-webhook created\ndeployment.apps/cert-manager-cainjector created\ndeployment.apps/cert-manager created\ndeployment.apps/cert-manager-webhook created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\n","$ kubectl get pods -n cert-manager\n\nNAME READY STATUS RESTARTS AGE\ncert-manager-848f547974-gccz8 1/1 Running 0 70s\ncert-manager-cainjector-54f4cc6b5-dpj84 1/1 Running 0 70s\ncert-manager-webhook-7c9588c76-tqncn 1/1 Running 0 70s\n","$ helm install milvus-operator \\\n -n milvus-operator --create-namespace \\\n --wait --wait-for-jobs \\\n https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz\n","NAME: milvus-operator\nLAST DEPLOYED: Thu Jul 7 13:18:40 2022\nNAMESPACE: milvus-operator\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nMilvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed\nIf Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`\nFull Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md\nQuick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`\nMore samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples\nCRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml\n","namespace/milvus-operator created\ncustomresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created\nserviceaccount/milvus-operator-controller-manager created\nrole.rbac.authorization.k8s.io/milvus-operator-leader-election-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created\nrolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created\nconfigmap/milvus-operator-manager-config created\nservice/milvus-operator-controller-manager-metrics-service created\nservice/milvus-operator-webhook-service created\ndeployment.apps/milvus-operator-controller-manager created\ncertificate.cert-manager.io/milvus-operator-serving-cert created\nissuer.cert-manager.io/milvus-operator-selfsigned-issuer created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created\n","$ kubectl get pods -n milvus-operator\n\nNAME READY STATUS RESTARTS AGE\nmilvus-operator-5fd77b87dc-msrk4 1/1 Running 0 46s\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","$ kubectl get milvus my-release -o yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n...\nstatus:\n conditions:\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n reason: StorageReady\n status: \"True\"\n type: StorageReady\n - lastTransitionTime: \"2021-11-02T06:06:23Z\"\n message: Pulsar is ready\n reason: PulsarReady\n status: \"True\"\n type: PulsarReady\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n message: Etcd endpoints is healthy\n reason: EtcdReady\n status: \"True\"\n type: EtcdReady\n - lastTransitionTime: \"2021-11-02T06:12:36Z\"\n message: All Milvus components are healthy\n reason: MilvusClusterHealthy\n status: \"True\"\n type: MilvusReady\n endpoint: my-release-milvus.default:19530\n status: Healthy\n","$ kubectl get pods\n\nNAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 14m\nmy-release-etcd-1 1/1 Running 0 14m\nmy-release-etcd-2 1/1 Running 0 14m\nmy-release-milvus-datanode-5c686bd65-wxtmf 1/1 Running 0 6m\nmy-release-milvus-indexnode-5b9787b54-xclbx 1/1 Running 0 6m\nmy-release-milvus-proxy-84f67cdb7f-pg6wf 1/1 Running 0 6m\nmy-release-milvus-querynode-5bcb59f6-nhqqw 1/1 Running 0 6m\nmy-release-milvus-mixcoord-fdcccfc84-9964g 1/1 Running 0 6m\nmy-release-minio-0 1/1 Running 0 14m\nmy-release-minio-1 1/1 Running 0 14m\nmy-release-minio-2 1/1 Running 0 14m\nmy-release-minio-3 1/1 Running 0 14m\nmy-release-pulsar-bookie-0 1/1 Running 0 14m\nmy-release-pulsar-bookie-1 1/1 Running 0 14m\nmy-release-pulsar-bookie-init-h6tfz 0/1 Completed 0 14m\nmy-release-pulsar-broker-0 1/1 Running 0 14m\nmy-release-pulsar-broker-1 1/1 Running 0 14m\nmy-release-pulsar-proxy-0 1/1 Running 0 14m\nmy-release-pulsar-proxy-1 1/1 Running 0 14m\nmy-release-pulsar-pulsar-init-d2t56 0/1 Completed 0 14m\nmy-release-pulsar-recovery-0 1/1 Running 0 14m\nmy-release-pulsar-toolset-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 13m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 13m\n","$ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl delete milvus my-release\n","$ helm -n milvus-operator uninstall milvus-operator\n","$ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml\n"],"headingContent":"Run Milvus in Kubernetes with Milvus Operator","anchorList":[{"label":"Запуск Milvus в Kubernetes с помощью Milvus Operator","href":"Run-Milvus-in-Kubernetes-with-Milvus-Operator","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Установка Milvus Operator","href":"Install-Milvus-Operator","type":2,"isActive":false},{"label":"Развернуть Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"Доступ к Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"Удаление Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"Деинсталляция Milvus Operator","href":"Uninstall-Milvus-Operator","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md new file mode 100644 index 000000000..846a50624 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md @@ -0,0 +1,392 @@ +--- +id: install_cluster-milvusoperator.md +label: Milvus Operator +related_key: Kubernetes +summary: 'Узнайте, как установить кластер Milvus на Kubernetes с помощью Milvus Operator' +title: Установите Milvus Cluster с помощью Milvus Operator +--- +

    Запуск Milvus в Kubernetes с помощью Milvus Operator

    На этой странице показано, как запустить экземпляр Milvus в Kubernetes с помощью Milvus Operator.

    +

    Обзор

    Milvus Operator - это решение, которое помогает развернуть и управлять полным стеком сервисов Milvus в целевых кластерах Kubernetes (K8s). Стек включает в себя все компоненты Milvus и соответствующие зависимости, такие как etcd, Pulsar и MinIO.

    +

    Необходимые условия

      +
    • Создайте кластер K8s.

    • +
    • Установите StorageClass. Проверить установленный StorageClass можно следующим образом.

      +
      $ kubectl get sc
      +
      +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
      +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
      +
    • +
    • Перед установкой проверьте требования к оборудованию и программному обеспечению.

    • +
    • Перед установкой Milvus рекомендуется использовать Milvus Sizing Tool для оценки требований к оборудованию в зависимости от объема данных. Это поможет обеспечить оптимальную производительность и распределение ресурсов при установке Milvus.

    • +
    +
    +

    Если у вас возникнут проблемы с установкой образа, свяжитесь с нами по адресу community@zilliz.com и подробно расскажите о проблеме, и мы окажем вам необходимую поддержку.

    +
    +

    Установка Milvus Operator

    Milvus Operator определяет пользовательские ресурсы кластера Milvus поверх Kubernetes Custom Resources. Когда пользовательские ресурсы определены, вы можете использовать API K8s в декларативном виде и управлять стеком развертывания Milvus для обеспечения его масштабируемости и высокой доступности.

    +

    1. Установите cert-manager

    Milvus Operator использует cert-manager, чтобы предоставить сертификат для сервера веб-хуков.

    +
    + +
    +

    Выполните следующую команду для установки cert-manager.

    +
    $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
    +
    +

    После завершения процесса установки вы увидите вывод, похожий на следующий.

    +
    customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
    +namespace/cert-manager created
    +serviceaccount/cert-manager-cainjector created
    +...
    +service/cert-manager created
    +service/cert-manager-webhook created
    +deployment.apps/cert-manager-cainjector created
    +deployment.apps/cert-manager created
    +deployment.apps/cert-manager-webhook created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +
    +

    Проверить, запущены ли капсулы cert-manager, можно следующим образом:

    +
    $ kubectl get pods -n cert-manager
    +
    +NAME                                      READY   STATUS    RESTARTS   AGE
    +cert-manager-848f547974-gccz8             1/1     Running   0          70s
    +cert-manager-cainjector-54f4cc6b5-dpj84   1/1     Running   0          70s
    +cert-manager-webhook-7c9588c76-tqncn      1/1     Running   0          70s
    +
    +

    2. Установите Milvus Operator

    Вы можете установить Milvus Operator одним из следующих способов:

    + +

    Установка с помощью Helm

    Выполните следующую команду, чтобы установить Milvus Operator с помощью Helm.

    +
    $ helm install milvus-operator \
    +  -n milvus-operator --create-namespace \
    +  --wait --wait-for-jobs \
    +  https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz
    +
    +

    По окончании процесса установки вы увидите вывод, похожий на следующий.

    +
    NAME: milvus-operator
    +LAST DEPLOYED: Thu Jul  7 13:18:40 2022
    +NAMESPACE: milvus-operator
    +STATUS: deployed
    +REVISION: 1
    +TEST SUITE: None
    +NOTES:
    +Milvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed
    +If Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`
    +Full Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md
    +Quick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`
    +More samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples
    +CRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD
    +
    +

    Установка с помощью kubectl

    Выполните следующую команду для установки Milvus Operator с помощью kubectl.

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
    +
    +

    После завершения процесса установки вы увидите результат, аналогичный следующему.

    +
    namespace/milvus-operator created
    +customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
    +serviceaccount/milvus-operator-controller-manager created
    +role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created
    +rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created
    +configmap/milvus-operator-manager-config created
    +service/milvus-operator-controller-manager-metrics-service created
    +service/milvus-operator-webhook-service created
    +deployment.apps/milvus-operator-controller-manager created
    +certificate.cert-manager.io/milvus-operator-serving-cert created
    +issuer.cert-manager.io/milvus-operator-selfsigned-issuer created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created
    +
    +

    Проверить, запущена ли капсула Milvus Operator, можно следующим образом:

    +
    $ kubectl get pods -n milvus-operator
    +
    +NAME                               READY   STATUS    RESTARTS   AGE
    +milvus-operator-5fd77b87dc-msrk4   1/1     Running   0          46s
    +
    +

    Развернуть Milvus

    1. Развертывание кластера Milvus

    После того как капсула Milvus Operator запущена, вы можете развернуть кластер Milvus следующим образом.

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    Приведенная выше команда развертывает кластер Milvus с его компонентами и зависимостями в отдельных подкадах с использованием конфигураций по умолчанию. Чтобы настроить эти параметры, мы рекомендуем использовать Milvus Sizing Tool для корректировки конфигураций на основе фактического объема данных, а затем загрузить соответствующий YAML-файл. Чтобы узнать больше о параметрах конфигурации, обратитесь к разделу Контрольный список конфигураций системы Milvus.

    +
    +
      +
    • Название релиза должно содержать только буквы, цифры и тире. Точки в имени релиза не допускаются.
    • +
    • Вы также можете развернуть экземпляр Milvus в автономном режиме, когда все его компоненты находятся в одной капсуле. Для этого измените URL-адрес файла конфигурации в приведенной выше команде на https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_default.yaml
    • +
    +
    +

    2. Проверка состояния кластера Milvus

    Выполните следующую команду, чтобы проверить состояние кластера Milvus.

    +
    $ kubectl get milvus my-release -o yaml
    +
    +

    Когда ваш кластер Milvus будет готов, результат выполнения вышеуказанной команды должен быть похож на следующий. Если поле status.status остается Unhealthy, ваш кластер Milvus все еще находится в процессе создания.

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +...
    +status:
    +  conditions:
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    reason: StorageReady
    +    status: "True"
    +    type: StorageReady
    +  - lastTransitionTime: "2021-11-02T06:06:23Z"
    +    message: Pulsar is ready
    +    reason: PulsarReady
    +    status: "True"
    +    type: PulsarReady
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    message: Etcd endpoints is healthy
    +    reason: EtcdReady
    +    status: "True"
    +    type: EtcdReady
    +  - lastTransitionTime: "2021-11-02T06:12:36Z"
    +    message: All Milvus components are healthy
    +    reason: MilvusClusterHealthy
    +    status: "True"
    +    type: MilvusReady
    +  endpoint: my-release-milvus.default:19530
    +  status: Healthy
    +
    +

    Milvus Operator создает зависимости Milvus, такие как etcd, Pulsar и MinIO, а затем компоненты Milvus, такие как прокси, координаторы и узлы.

    +

    Когда ваш кластер Milvus будет готов, состояние всех стручков в кластере Milvus должно быть примерно таким, как показано ниже.

    +
    $ kubectl get pods
    +
    +NAME                                            READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          14m
    +my-release-etcd-1                               1/1     Running     0          14m
    +my-release-etcd-2                               1/1     Running     0          14m
    +my-release-milvus-datanode-5c686bd65-wxtmf      1/1     Running     0          6m
    +my-release-milvus-indexnode-5b9787b54-xclbx     1/1     Running     0          6m
    +my-release-milvus-proxy-84f67cdb7f-pg6wf        1/1     Running     0          6m
    +my-release-milvus-querynode-5bcb59f6-nhqqw      1/1     Running     0          6m
    +my-release-milvus-mixcoord-fdcccfc84-9964g      1/1     Running     0          6m
    +my-release-minio-0                              1/1     Running     0          14m
    +my-release-minio-1                              1/1     Running     0          14m
    +my-release-minio-2                              1/1     Running     0          14m
    +my-release-minio-3                              1/1     Running     0          14m
    +my-release-pulsar-bookie-0                      1/1     Running     0          14m
    +my-release-pulsar-bookie-1                      1/1     Running     0          14m
    +my-release-pulsar-bookie-init-h6tfz             0/1     Completed   0          14m
    +my-release-pulsar-broker-0                      1/1     Running     0          14m
    +my-release-pulsar-broker-1                      1/1     Running     0          14m
    +my-release-pulsar-proxy-0                       1/1     Running     0          14m
    +my-release-pulsar-proxy-1                       1/1     Running     0          14m
    +my-release-pulsar-pulsar-init-d2t56             0/1     Completed   0          14m
    +my-release-pulsar-recovery-0                    1/1     Running     0          14m
    +my-release-pulsar-toolset-0                     1/1     Running     0          14m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          14m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          13m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          13m
    +
    +

    3. Перенаправьте локальный порт в Milvus

    Выполните следующую команду, чтобы узнать порт, через который работает ваш кластер Milvus.

    +
    $ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    Результат показывает, что экземпляр Milvus обслуживается на порту по умолчанию 19530.

    +
    +

    Если вы развернули Milvus в автономном режиме, измените имя стручка с my-release-milvus-proxy-xxxxxxxxxx-xxxxx на my-release-milvus-xxxxxxxxxx-xxxxx.

    +
    +

    Затем выполните следующую команду, чтобы перенаправить локальный порт на порт, на котором работает Milvus.

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    По желанию вы можете использовать :19530 вместо 27017:19530 в приведенной выше команде, чтобы kubectl выделил локальный порт для вас, и вам не пришлось бы управлять конфликтами портов.

    +

    По умолчанию переадресация портов в kubectl прослушивает только localhost. Используйте флаг address, если хотите, чтобы Milvus слушал выбранный или все IP-адреса. Следующая команда заставляет port-forward слушать все IP-адреса на хост-машине.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    Теперь вы можете подключиться к Milvus, используя перенаправленный порт.

    +

    Доступ к Milvus WebUI

    Milvus поставляется со встроенным GUI-инструментом Milvus WebUI, доступ к которому можно получить через браузер. Milvus Web UI улучшает наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. С помощью Milvus Web UI можно просматривать статистику и метрики компонентов и зависимостей Milvus, проверять детали баз данных и коллекций, а также выводить список подробных конфигураций Milvus. Подробные сведения о Milvus Web UI см. в разделе Milvus WebUI.

    +

    Чтобы включить доступ к Milvus Web UI, вам нужно перенаправить порт прокси-под на локальный порт.

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    Теперь вы можете получить доступ к Milvus Web UI по адресу http://localhost:27018.

    +

    Удаление Milvus

    Выполните следующую команду, чтобы удалить кластер Milvus.

    +
    $ kubectl delete milvus my-release
    +
    +
    +
      +
    • При удалении кластера Milvus с использованием конфигурации по умолчанию такие зависимости, как etcd, Pulsar и MinIO, не удаляются. Поэтому в следующий раз при установке того же экземпляра кластера Milvus эти зависимости будут использоваться снова.
    • +
    • Чтобы удалить зависимости и частные виртуальные облака (PVC) вместе с кластером Milvus, см. файл конфигурации.
    • +
    +
    +

    Деинсталляция Milvus Operator

    Существует также два способа удаления Milvus Operator.

    + +

    Деинсталляция с помощью Helm

    $ helm -n milvus-operator uninstall milvus-operator
    +
    +

    Деинсталляция с помощью kubectl

    $ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml
    +
    +

    Что дальше

    Установив Milvus в Docker, вы можете:

    + diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.json b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.json new file mode 100644 index 000000000..c8a83f758 --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n","$ minikube start\n","$ kubectl cluster-info\n"],"headingContent":"Requirements for running Milvus on Kubernetes","anchorList":[{"label":"Требования для запуска Milvus на Kubernetes","href":"Requirements-for-running-Milvus-on-Kubernetes","type":1,"isActive":false},{"label":"Требования к оборудованию","href":"Hardware-requirements","type":2,"isActive":false},{"label":"Требования к программному обеспечению","href":"Software-requirements","type":2,"isActive":false},{"label":"Вопросы и ответы","href":"FAQs","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.md b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.md new file mode 100644 index 000000000..48d1fad6e --- /dev/null +++ b/localization/v2.5.x/site/ru/getstarted/run-milvus-k8s/prerequisite-helm.md @@ -0,0 +1,150 @@ +--- +id: prerequisite-helm.md +label: Install on Kubernetes +related_key: Kubernetes +summary: >- + Узнайте о необходимых подготовительных мероприятиях перед установкой Milvus с + Helm. +title: Требования для запуска Milvus на Kubernetes +--- +

    Требования для запуска Milvus на Kubernetes

    На этой странице перечислены требования к аппаратному и программному обеспечению для запуска Milvus.

    +

    Требования к оборудованию

    + + + + + + + + + +
    КомпонентТребованиеРекомендацияПримечание
    ПРОЦЕССОР
    • Процессор Intel 2-го поколения Core или выше
    • Apple Silicon
    • Автономный: 4 ядра или более
    • Кластер: 8 ядер и более
    Набор инструкций процессора
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Поиск векторного сходства и построение индексов в Milvus требуют поддержки процессором наборов расширений "одна инструкция - несколько данных" (SIMD). Убедитесь, что процессор поддерживает хотя бы одно из перечисленных расширений SIMD. Дополнительные сведения см. в разделе "Процессоры с AVX".
    ОПЕРАТИВНАЯ ПАМЯТЬ
    • Автономный: 8 Гб
    • Кластер: 32G
    • Автономная: 16 Гб
    • Кластер: 128G
    Объем оперативной памяти зависит от объема данных.
    Жесткий дискТвердотельный накопитель SATA 3.0 или CloudStorageNVMe SSD или вышеОбъем жесткого диска зависит от объема данных.
    +

    Требования к программному обеспечению

    Рекомендуется запускать кластер Kubernetes на платформах Linux.

    +

    kubectl - это инструмент командной строки для Kubernetes. Используйте версию kubectl, которая не отличается от версии вашего кластера. Использование последней версии kubectl поможет избежать непредвиденных проблем.

    +

    minikube необходим при локальном запуске кластера Kubernetes. minikube требует наличия Docker в качестве зависимости. Убедитесь, что вы установили Docker перед установкой Milvus с помощью Helm. Дополнительные сведения см. в разделе Получить Docker.

    + + + + + + + +
    Операционная системаПрограммное обеспечениеПримечание
    Платформы Linux
    • Kubernetes 1.16 или более поздняя версия
    • kubectl
    • Helm 3.0.0 или более поздняя версия
    • minikube (для автономного Milvus)
    • Docker 19.03 или более поздней версии (для автономного Milvus)
    Дополнительную информацию см. в документации Helm.
    + + + + + + + + + +
    Программное обеспечениеВерсияПримечание
    etcd3.5.0См. дополнительные требования к диску.
    MinIORELEASE.2023-03-20T20-16-18Z
    Pulsar2.8.2
    +

    Дополнительные требования к диску

    Производительность дисков очень важна для работы etcd. Настоятельно рекомендуется использовать локальные NVMe SSD. Более медленный отклик диска может привести к частым выборам кластера, что в конечном итоге приведет к деградации сервиса etcd.

    +

    Чтобы проверить, соответствует ли ваш диск требованиям, используйте fio.

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    В идеале ваш диск должен достигать более 500 IOPS и менее 10 мс для 99-й процентильной задержки fsync. Более подробные требования можно найти в документации etcd.

    +

    Вопросы и ответы

    Как я могу запустить кластер K8s локально для тестирования?

    Вы можете использовать такие инструменты, как minikube, kind и Kubeadm, для быстрой локальной настройки кластера Kubernetes. В следующей процедуре в качестве примера используется minikube.

    +
      +
    1. Загрузите minikube
    2. +
    +

    Перейдите на страницу Get Started, проверьте, выполнены ли условия, перечисленные в разделе What you'll need, нажмите на кнопки, описывающие вашу целевую платформу, и скопируйте команды для загрузки и установки бинарного файла.

    +
      +
    1. Запуск кластера K8s с помощью minikube
    2. +
    +
    $ minikube start
    +
    +
      +
    1. Проверка состояния кластера K8s
    2. +
    +

    Вы можете проверить состояние установленного кластера K8s с помощью следующей команды.

    +
    $ kubectl cluster-info
    +
    +
    +

    Убедитесь, что вы можете получить доступ к кластеру K8s через kubectl. Если вы не установили kubectl локально, смотрите раздел Использование kubectl внутри minikube.

    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/home/home.json b/localization/v2.5.x/site/ru/home/home.json new file mode 100644 index 000000000..e354f8a4e --- /dev/null +++ b/localization/v2.5.x/site/ru/home/home.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"","anchorList":[{"label":"Начать","href":"Get-Started","type":2,"isActive":false},{"label":"Рекомендуемые статьи","href":"Recommended-articles","type":2,"isActive":false},{"label":"Что нового в документации","href":"Whats-new-in-docs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/home/home.md b/localization/v2.5.x/site/ru/home/home.md new file mode 100644 index 000000000..358a99aad --- /dev/null +++ b/localization/v2.5.x/site/ru/home/home.md @@ -0,0 +1,122 @@ +--- +id: home.md +--- +
    +

    +Добро пожаловать в Milvus Docs!

    +

    +Здесь вы узнаете, что такое Milvus, а также как установить, использовать и развернуть Milvus для создания приложения в соответствии с потребностями вашего бизнеса.

    +
    +
    +
    +

    Попробуйте управляемый Milvus бесплатно!

    +

    Zilliz Cloud не требует особых усилий, работает на базе Milvus и в 10 раз быстрее.

    +
    + +
    +

    Начать

    +
    + + icon +

    Узнайте, как установить Milvus с помощью Docker Compose или на Kubernetes.

    +
    +
    + + icon +

    Узнайте, как быстро запустить Milvus с помощью примера кода.

    +
    +
    + + icon +

    + Узнайте, как создавать приложения для поиска векторного сходства с помощью Milvus.

    +
    +
    + +
    +

    Что нового в документации

    Ноябрь 2024 - Выпуск Milvus 2.5.0

    + +
    diff --git a/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.json b/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.json new file mode 100644 index 000000000..5ba3001b6 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/HydroXai/pii-masker-v1.git\n$ cd pii-masker-v1/pii-masker\n","$ pip install --upgrade pymilvus openai requests tqdm dataset\n","$ export OPENAI_API_KEY=sk-***********\n","text_lines = [\n \"Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16\",\n \"Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.\",\n \"In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.\",\n \"Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.\",\n]\n","from model import PIIMasker\n\nmasker = PIIMasker()\n","masked_results = []\nfor full_text in text_lines:\n masked_text, _ = masker.mask_pii(full_text)\n masked_results.append(masked_text)\n\nfor res in masked_results:\n print(res + \"\\n\")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(masked_results, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"What was the office address of Hiroshi's partner from Munich?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=1, # Return top 1 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say \"I don't know\".\nAI:\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus + PII Masker","anchorList":[{"label":"Построение RAG с помощью Milvus + PII Masker","href":"Build-RAG-with-Milvus-+-PII-Masker","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.md b/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.md new file mode 100644 index 000000000..dbae39664 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/RAG_with_pii_and_milvus.md @@ -0,0 +1,242 @@ +--- +id: RAG_with_pii_and_milvus.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер RAG + (Retrieval-Augmented Generation) с помощью Milvus и PII Masker. +title: Построение RAG с помощью Milvus + PII Masker +--- +

    Построение RAG с помощью Milvus + PII Masker

    PII (Personally Identifiable Information) - это тип конфиденциальных данных, которые могут быть использованы для идентификации личности.

    +

    PII Masker, разработанный компанией HydroX AI, - это передовой инструмент с открытым исходным кодом, предназначенный для защиты конфиденциальных данных с помощью передовых моделей искусственного интеллекта. Если вы работаете с данными клиентов, проводите анализ данных или обеспечиваете соответствие нормам конфиденциальности, PII Masker - это надежное и масштабируемое решение для защиты вашей информации.

    +

    В этом руководстве мы покажем, как использовать PII Masker вместе с Milvus для защиты конфиденциальных данных в приложениях RAG (Retrieval-Augmented Generation). Объединив сильные стороны возможностей маскировки данных PII Masker с эффективным извлечением данных Milvus, вы сможете создавать безопасные, соответствующие требованиям конфиденциальности конвейеры для уверенной работы с конфиденциальной информацией. Такой подход гарантирует, что ваши приложения будут соответствовать стандартам конфиденциальности и эффективно защищать данные пользователей.

    +

    Подготовка

    Начало работы с PII Masker

    Следуйте руководству по установке PII Masker, чтобы установить необходимые зависимости и загрузить модель. Вот простое руководство:

    +
    $ git clone https://github.com/HydroXai/pii-masker-v1.git
    +$ cd pii-masker-v1/pii-masker
    +
    +

    Загрузите модель с сайтаhttps://huggingface.co/hydroxai/pii_model_weight, а затем замените ее файлами в: pii-masker/output_model/deberta3base_1024/

    +

    Зависимости и окружение

    $ pip install --upgrade pymilvus openai requests tqdm dataset
    +
    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    $ export OPENAI_API_KEY=sk-***********
    +
    +

    Затем вы можете создать блокнот python или jupyter для выполнения следующего кода.

    +

    Подготовка данных

    Давайте сгенерируем несколько фальшивых строк, содержащих PII-информацию, для тестирования или демонстрации.

    +
    text_lines = [
    +    "Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16",
    +    "Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.",
    +    "In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.",
    +    "Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.",
    +]
    +
    +

    Маскируем данные с помощью PIIMasker

    Инициализируем объект PIIMasker и загрузим модель.

    +
    from model import PIIMasker
    +
    +masker = PIIMasker()
    +
    +

    Затем мы маскируем PII из списка текстовых строк и выводим результаты маскирования.

    +
    masked_results = []
    +for full_text in text_lines:
    +    masked_text, _ = masker.mask_pii(full_text)
    +    masked_results.append(masked_text)
    +
    +for res in masked_results:
    +    print(res + "\n")
    +
    +
    Alice [B-NAME] , a resident of Dublin Ireland attended flower festival at Hyde Park on May 15 2023 [B-PHONE_NUM] She entered the park noon using her digital passport number 23 [B-ID_NUM] [B-NAME] afternoon admiring various flowers and plants attending gardening workshop having light snack one food stalls While there she met another visitor Mr Thompson who was visiting from London They exchanged tips shared contact information : ' s address 492 [I-STREET_ADDRESS] his cell phone + [B-PHONE_NUM] [B-NAME] details home Ranch [B-STREET_ADDRESS]
    +
    +Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]
    +
    +In an online forum discussion about culinary exchanges around the world [I-STREET_ADDRESS] several participants shared their experiences [I-STREET_ADDRESS] One user Male with email 2022 [B-EMAIL] his insights He mentioned ID code 1 [B-ID_NUM] [I-PHONE_NUM] reference number L [B-ID_NUM] residing in Italy but originally from Australia provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 456 [I-STREET_ADDRESS]
    +
    +Another user joined the conversation on topic of international volunteering opportunities . Identified as Female , she used email 2023 [B-EMAIL] share her story She noted 98 [B-ID_NUM] [I-PHONE_NUM] M [B-ID_NUM] residing in Germany but originally from Brazil provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 789 [I-STREET_ADDRESS] DE 10 178
    +
    +

    Подготовка модели для встраивания

    Мы инициализируем клиент OpenAI, чтобы подготовить модель встраивания.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Определим функцию для генерации текстовых вкраплений с помощью клиента OpenAI. В качестве примера мы используем модель text-embedding-3-small.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовое вкрапление и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    Загрузка данных в Milvus

    Создаем коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по строкам маскированного текста, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(masked_results, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 4/4 [00:01<00:00,  2.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 4, 'ids': [0, 1, 2, 3], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Зададим вопрос о документах.

    +
    question = "What was the office address of Hiroshi's partner from Munich?"
    +
    +

    Выполним поиск вопроса в коллекции и получим семантический топ-1.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=1,  # Return top 1 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Посмотрим на результаты поиска по запросу

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        "Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]",
    +        0.6544462442398071
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage.

    +

    Примечание: мы говорим LLM, что если в фрагментах нет полезной информации, просто скажите "Я не знаю".

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say "I don't know".
    +AI:
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте OpenAI ChatGPT для генерации ответа на основе подсказок.

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-4o-mini",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    I don't know.
    +
    +

    Здесь мы видим, что, поскольку мы заменили PII масками, LLM не может получить информацию PII в контексте. Таким образом, он отвечает: "Я не знаю". Таким образом, мы можем эффективно защитить конфиденциальность пользователей.

    diff --git a/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.json b/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.json new file mode 100644 index 000000000..680af0f65 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0\n","import os\nfrom getpass import getpass\n\nos.environ[\"APIFY_API_TOKEN\"] = getpass(\"Enter YOUR APIFY_API_TOKEN\")\nos.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter YOUR OPENAI_API_KEY\")\n","os.environ[\"MILVUS_URI\"] = getpass(\"Enter YOUR MILVUS_URI\")\nos.environ[\"MILVUS_TOKEN\"] = getpass(\"Enter YOUR MILVUS_TOKEN\")\n\nMILVUS_COLLECTION_NAME = \"apify\"\n","from apify_client import ApifyClient\n\nclient = ApifyClient(os.getenv(\"APIFY_API_TOKEN\"))\n\nactor_id = \"apify/website-content-crawler\"\nrun_input = {\n \"crawlerType\": \"cheerio\",\n \"maxCrawlPages\": 10,\n \"startUrls\": [{\"url\": \"https://milvus.io/\"}, {\"url\": \"https://zilliz.com/\"}],\n}\n\nactor_call = client.actor(actor_id).call(run_input=run_input)\n","dataset_id = actor_call[\"defaultDatasetId\"]\ndataset_id\n","item = client.dataset(dataset_id).list_items(limit=1).items\nitem[0].get(\"text\")\n","milvus_integration_inputs = {\n \"milvusUri\": os.getenv(\"MILVUS_URI\"),\n \"milvusToken\": os.getenv(\"MILVUS_TOKEN\"),\n \"milvusCollectionName\": MILVUS_COLLECTION_NAME,\n \"datasetFields\": [\"text\", \"metadata.title\"],\n \"datasetId\": actor_call[\"defaultDatasetId\"],\n \"performChunking\": True,\n \"embeddingsApiKey\": os.getenv(\"OPENAI_API_KEY\"),\n \"embeddingsProvider\": \"OpenAI\",\n}\n","actor_call = client.actor(\"apify/milvus-integration\").call(\n run_input=milvus_integration_inputs\n)\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.vectorstores import Milvus\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n\nvectorstore = Milvus(\n connection_args={\n \"uri\": os.getenv(\"MILVUS_URI\"),\n \"token\": os.getenv(\"MILVUS_TOKEN\"),\n },\n embedding_function=embeddings,\n collection_name=MILVUS_COLLECTION_NAME,\n)\n\nprompt = PromptTemplate(\n input_variables=[\"context\", \"question\"],\n template=\"Use the following pieces of retrieved context to answer the question. If you don't know the answer, \"\n \"just say that you don't know. \\nQuestion: {question} \\nContext: {context} \\nAnswer:\",\n)\n\n\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n\n\nrag_chain = (\n {\n \"context\": vectorstore.as_retriever() | format_docs,\n \"question\": RunnablePassthrough(),\n }\n | prompt\n | ChatOpenAI(model=\"gpt-4o-mini\")\n | StrOutputParser()\n)\n","question = \"What is Milvus database?\"\n\nrag_chain.invoke(question)\n"],"headingContent":"Retrieval-Augmented Generation: Crawling Websites with Apify and Saving Data to Milvus for Question Answering","anchorList":[{"label":"Генерация с дополненным извлечением: Создание веб-сайтов с помощью Apify и сохранение данных в Milvus для ответов на вопросы","href":"Retrieval-Augmented-Generation-Crawling-Websites-with-Apify-and-Saving-Data-to-Milvus-for-Question-Answering","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":1,"isActive":false},{"label":"Установите зависимости","href":"Install-dependencies","type":2,"isActive":false},{"label":"Настройка ключей Apify и Open API","href":"Set-up-Apify-and-Open-API-keys","type":2,"isActive":false},{"label":"Настройка URI, токена и имени коллекции Milvus/Zilliz","href":"Set-up-MilvusZilliz-URI-token-and-collection-name","type":2,"isActive":false},{"label":"Использование Website Content Crawler для сканирования текстового контента с Milvus.io","href":"Using-the-Website-Content-Crawler-to-scrape-text-content-from-Milvusio","type":2,"isActive":false},{"label":"Поиск и генеративный конвейер LLM","href":"Retrieval-and-LLM-generative-pipeline","type":1,"isActive":false},{"label":"Заключение","href":"Conclusion","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.md b/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.md new file mode 100644 index 000000000..33bfd45cf --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/apify_milvus_rag.md @@ -0,0 +1,267 @@ +--- +id: apify_milvus_rag.md +summary: >- + В этом руководстве рассказывается о том, как просматривать веб-сайты с помощью + Apify's Website Content Crawler и сохранять данные в векторной базе + Milvus/Zilliz, чтобы впоследствии использовать их для ответов на вопросы. +title: >- + Генерация с дополненным извлечением: Создание веб-сайтов с помощью Apify и + сохранение данных в Milvus для ответов на вопросы +--- +

    Генерация с дополненным извлечением: Создание веб-сайтов с помощью Apify и сохранение данных в Milvus для ответов на вопросы

    Open In Colab

    +

    В этом уроке рассказывается о том, как с помощью Apify's Website Content Crawler просматривать веб-сайты и сохранять данные в векторной базе Milvus/Zilliz, чтобы затем использовать их для ответов на вопросы.

    +

    Apify - это платформа для веб-скреппинга и извлечения данных, которая предлагает рынок приложений с более чем двумя тысячами готовых облачных инструментов, известных как Actors. Эти инструменты идеально подходят для таких случаев, как извлечение структурированных данных с сайтов электронной коммерции, социальных сетей, поисковых систем, онлайн-карт и т. д.

    +

    Например, инструмент Website Content Crawler Actor может глубоко просмотреть веб-сайты, очистить их HTML, удалив модальные окна cookie, нижний колонтитул или навигацию, а затем преобразовать HTML в Markdown.

    +

    Интеграция Apify для Milvus/Zilliz позволяет легко загружать данные из Интернета в векторную базу данных.

    +

    Прежде чем начать

    Прежде чем приступить к работе с этим блокнотом, убедитесь, что у вас есть следующее:

    + +

    Установите зависимости

    $ pip install --upgrade --quiet  apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
    +
    +

    Настройка ключей Apify и Open API

    import os
    +from getpass import getpass
    +
    +os.environ["APIFY_API_TOKEN"] = getpass("Enter YOUR APIFY_API_TOKEN")
    +os.environ["OPENAI_API_KEY"] = getpass("Enter YOUR OPENAI_API_KEY")
    +
    +
    Enter YOUR APIFY_API_TOKEN··········
    +Enter YOUR OPENAI_API_KEY··········
    +
    +

    Настройка URI, токена и имени коллекции Milvus/Zilliz

    Для настройки клиента вам понадобятся URI и токен вашего Milvus/Zilliz.

    +
      +
    • Если вы самостоятельно развернули сервер Milvus на Docker или Kubernetes, используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае оставьте токен пустой строкой.
    • +
    • Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +

    Обратите внимание, что коллекция не обязательно должна существовать заранее. Она будет создана автоматически при загрузке данных в базу.

    +
    os.environ["MILVUS_URI"] = getpass("Enter YOUR MILVUS_URI")
    +os.environ["MILVUS_TOKEN"] = getpass("Enter YOUR MILVUS_TOKEN")
    +
    +MILVUS_COLLECTION_NAME = "apify"
    +
    +
    Enter YOUR MILVUS_URI··········
    +Enter YOUR MILVUS_TOKEN··········
    +
    +

    Использование Website Content Crawler для сканирования текстового контента с Milvus.io

    Далее мы будем использовать Website Content Crawler с Apify Python SDK. Начнем с определения actor_id и run_input, а затем укажем информацию, которая будет сохранена в векторной базе данных.

    +

    actor_id="apify/website-content-crawler" - это идентификатор для Website Content Crawler. Поведение краулера можно полностью контролировать с помощью параметров run_input (подробнее см. на странице ввода ). В этом примере мы будем просматривать документацию Milvus, которая не требует отрисовки JavaScript. Поэтому мы зададим crawlerType=cheerio, определим startUrls и ограничим количество просматриваемых страниц, задав maxCrawlPages=10.

    +
    from apify_client import ApifyClient
    +
    +client = ApifyClient(os.getenv("APIFY_API_TOKEN"))
    +
    +actor_id = "apify/website-content-crawler"
    +run_input = {
    +    "crawlerType": "cheerio",
    +    "maxCrawlPages": 10,
    +    "startUrls": [{"url": "https://milvus.io/"}, {"url": "https://zilliz.com/"}],
    +}
    +
    +actor_call = client.actor(actor_id).call(run_input=run_input)
    +
    +

    Website Content Crawler будет тщательно просматривать сайт, пока не достигнет заданного предела, установленного в maxCrawlPages. Собранные данные будут храниться в Dataset на платформе Apify. Чтобы получить доступ к этим данным и проанализировать их, вы можете воспользоваться функцией defaultDatasetId

    +
    dataset_id = actor_call["defaultDatasetId"]
    +dataset_id
    +
    +
    'P9dLFfeJAljlePWnz'
    +
    +

    Следующий код получает данные из Apify Dataset и отображает первый отсканированный сайт.

    +
    item = client.dataset(dataset_id).list_items(limit=1).items
    +item[0].get("text")
    +
    +
    'The High-Performance Vector Database Built for Scale\nStart running Milvus in seconds\nfrom pymilvus import MilvusClient client = MilvusClient("milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=5 )\nDeployment Options to Match Your Unique Journey\nMilvus Lite\nLightweight, easy to start\nVectorDB-as-a-library runs in notebooks/ laptops with a pip install\nBest for learning and prototyping\nMilvus Standalone\nRobust, single-machine deployment\nComplete vector database for production or testing\nIdeal for datasets with up to millions of vectors\nMilvus Distributed\nScalable, enterprise-grade solution\nHighly reliable and distributed vector database with comprehensive toolkit\nScale horizontally to handle billions of vectors\nZilliz Cloud\nFully managed with minimal operations\nAvailable in both serverless and dedicated cluster\nSaaS and BYOC options for different security and compliance requirements\nTry Free\nLearn more about different Milvus deployment models\nLoved by GenAI developers\nBased on our research, Milvus was selected as the vector database of choice (over Chroma and Pinecone). Milvus is an open-source vector database designed specifically for similarity search on massive datasets of high-dimensional vectors.\nWith its focus on efficient vector similarity search, Milvus empowers you to build robust and scalable image retrieval systems. Whether you’re managing a personal photo library or developing a commercial image search application, Milvus offers a powerful foundation for unlocking the hidden potential within your image collections.\nBhargav Mankad\nSenior Solution Architect\nMilvus is a powerful vector database tailored for processing and searching extensive vector data. It stands out for its high performance and scalability, rendering it perfect for machine learning, deep learning, similarity search tasks, and recommendation systems.\nIgor Gorbenko\nBig Data Architect\nStart building your GenAI app now\nGuided with notebooks developed by us and our community\nRAG\nTry Now\nImage Search\nTry Now\nMultimodal Search\nTry Now\nUnstructured Data Meetups\nJoin a Community of Passionate Developers and Engineers Dedicated to Gen AI.\nRSVP now\nWhy Developers Prefer Milvus for Vector Databases\nScale as needed\nElastic scaling to tens of billions of vectors with distributed architecture.\nBlazing fast\nRetrieve data quickly and accurately with Global Index, regardless of scale.\nReusable Code\nWrite once, and deploy with one line of code into the production environment.\nFeature-rich\nMetadata filtering, hybrid search, multi-vector and more.\nWant to learn more about Milvus? View our documentation\nJoin the community of developers building GenAI apps with Milvus, now with over 25 million downloads\nGet Milvus Updates\nSubscribe to get updates on the latest Milvus releases, tutorials and training from Zilliz, the creator and key maintainer of Milvus.'
    +
    +

    Для загрузки данных в базу Milvus мы используем интеграцию Apify Milvus. Сначала нам нужно настроить параметры для базы данных Milvus. Затем мы выбираем поля (datasetFields), которые хотим сохранить в базе данных. В примере ниже мы сохраняем поле text и metadata.title.

    +
    milvus_integration_inputs = {
    +    "milvusUri": os.getenv("MILVUS_URI"),
    +    "milvusToken": os.getenv("MILVUS_TOKEN"),
    +    "milvusCollectionName": MILVUS_COLLECTION_NAME,
    +    "datasetFields": ["text", "metadata.title"],
    +    "datasetId": actor_call["defaultDatasetId"],
    +    "performChunking": True,
    +    "embeddingsApiKey": os.getenv("OPENAI_API_KEY"),
    +    "embeddingsProvider": "OpenAI",
    +}
    +
    +

    Теперь вызовем apify/milvus-integration для сохранения данных.

    +
    actor_call = client.actor("apify/milvus-integration").call(
    +    run_input=milvus_integration_inputs
    +)
    +
    +

    Теперь все отсканированные данные хранятся в базе данных Milvus и готовы к поиску и ответам на вопросы.

    +

    Поиск и генеративный конвейер LLM

    Далее мы определим конвейер поиска и дополнения с помощью Langchain. Конвейер работает в два этапа:

    +
      +
    • Векторное хранилище (Milvus): Langchain извлекает релевантные документы из Milvus, сопоставляя вкрапления запроса с вкраплениями хранящихся документов.
    • +
    • Ответ LLM: Полученные документы обеспечивают контекст для LLM (например, GPT-4), чтобы сгенерировать обоснованный ответ.
    • +
    +

    Более подробную информацию о цепочке RAG можно найти в документации Langchain.

    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.vectorstores import Milvus
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +vectorstore = Milvus(
    +    connection_args={
    +        "uri": os.getenv("MILVUS_URI"),
    +        "token": os.getenv("MILVUS_TOKEN"),
    +    },
    +    embedding_function=embeddings,
    +    collection_name=MILVUS_COLLECTION_NAME,
    +)
    +
    +prompt = PromptTemplate(
    +    input_variables=["context", "question"],
    +    template="Use the following pieces of retrieved context to answer the question. If you don't know the answer, "
    +    "just say that you don't know. \nQuestion: {question} \nContext: {context} \nAnswer:",
    +)
    +
    +
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +
    +rag_chain = (
    +    {
    +        "context": vectorstore.as_retriever() | format_docs,
    +        "question": RunnablePassthrough(),
    +    }
    +    | prompt
    +    | ChatOpenAI(model="gpt-4o-mini")
    +    | StrOutputParser()
    +)
    +
    +

    Как только мы получили данные в базе данных, мы можем начать задавать вопросы.

    +
    +
    question = "What is Milvus database?"
    +
    +rag_chain.invoke(question)
    +
    +
    'Milvus is an open-source vector database specifically designed for billion-scale vector similarity search. It facilitates efficient management and querying of vector data, which is essential for applications involving unstructured data, such as AI and machine learning. Milvus allows users to perform operations like CRUD (Create, Read, Update, Delete) and vector searches, making it a powerful tool for handling large datasets.'
    +
    +

    Заключение

    В этом руководстве мы продемонстрировали, как с помощью Apify можно просматривать содержимое веб-сайтов, хранить данные в векторной базе данных Milvus и использовать конвейер с расширенным поиском для выполнения задач, связанных с ответами на вопросы. Комбинируя возможности Apify по скраппингу веб-сайтов с Milvus/Zilliz для хранения векторов и Langchain для языковых моделей, вы можете создавать высокоэффективные информационно-поисковые системы.

    +

    Для улучшения сбора и обновления данных в базе интеграция с Apify предлагает инкрементное обновление, при котором обновляются только новые или измененные данные на основе контрольных сумм. Кроме того, она может автоматически удалять устаревшие данные, которые не были просмотрены в течение определенного времени. Эти функции помогают оптимизировать базу данных векторов и обеспечивают эффективность и актуальность конвейера с расширенным поиском при минимальных затратах ручного труда.

    +

    Для получения более подробной информации об интеграции Apify-Milvus обратитесь к документации Apify Milvus и файлу README интеграции.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.json new file mode 100644 index 000000000..e8da3ef02 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus git+https://github.com/topoteretes/cognee.git\n","import os\n\nimport cognee\n\ncognee.config.set_llm_api_key(\"YOUR_OPENAI_API_KEY\")\n\n\nos.environ[\"VECTOR_DB_PROVIDER\"] = \"milvus\"\nos.environ[\"VECTOR_DB_URL\"] = \"./milvus.db\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","await cognee.add(data=text_lines, dataset_name=\"milvus_faq\")\nawait cognee.cognify()\n\n# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\\n\\nYes. When ...\n# ...\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)\n\nprint(search_results[0])\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)\n","def format_and_print(data):\n print(\"ID:\", data[\"id\"])\n print(\"\\nText:\\n\")\n paragraphs = data[\"text\"].split(\"\\n\\n\")\n for paragraph in paragraphs:\n print(paragraph.strip())\n print()\n\n\nformat_and_print(search_results[0])\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","# We only use one line of text as the dataset, which simplifies the output later\ntext = \"\"\"\n Natural language processing (NLP) is an interdisciplinary\n subfield of computer science and information retrieval.\n \"\"\"\n\nawait cognee.add(text)\nawait cognee.cognify()\n","query_text = \"Tell me about NLP\"\nsearch_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)\n\nfor result_text in search_results:\n print(result_text)\n\n# Example output:\n# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})\n# (...)\n#\n# It represents nodes and relationships in the knowledge graph:\n# - The first element is the source node (e.g., 'natural language processing').\n# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').\n# - The third element is the target node (e.g., 'computer science').\n"],"headingContent":"","anchorList":[{"label":"Сборка RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.md new file mode 100644 index 000000000..094a2eb13 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_cognee.md @@ -0,0 +1,159 @@ +--- +id: build_RAG_with_milvus_and_cognee.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер RAG + (Retrieval-Augmented Generation) с помощью Milvus и Cognee. +title: Построение RAG с помощью Milvus и Cognee +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Создайте RAG с помощью Milvus и Cognee

    Cognee - это платформа, ориентированная на разработчиков, которая упрощает разработку приложений искусственного интеллекта с помощью масштабируемых модульных конвейеров ECL (Extract, Cognify, Load). Благодаря бесшовной интеграции с Milvus, Cognee обеспечивает эффективное подключение и извлечение разговоров, документов и транскрипций, сокращая количество галлюцинаций и оптимизируя операционные расходы.

    +

    Благодаря поддержке таких векторных хранилищ, как Milvus, баз данных графов и LLM, Cognee предоставляет гибкую и настраиваемую основу для создания систем с расширенным поиском (RAG). Его готовая к производству архитектура обеспечивает повышенную точность и эффективность приложений, основанных на искусственном интеллекте.

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и Cognee.

    +
    $ pip install pymilvus git+https://github.com/topoteretes/cognee.git
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    По умолчанию в этом примере в качестве LLM используется OpenAI. Вам необходимо подготовить api ключ и задать его в функции config set_llm_api_key().

    +

    Чтобы настроить Milvus в качестве базы данных векторов, установите VECTOR_DB_PROVIDER на milvus и укажите VECTOR_DB_URL и VECTOR_DB_KEY. Поскольку в этом демо мы используем Milvus Lite для хранения данных, необходимо указать только VECTOR_DB_URL.

    +
    import os
    +
    +import cognee
    +
    +cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
    +
    +
    +os.environ["VECTOR_DB_PROVIDER"] = "milvus"
    +os.environ["VECTOR_DB_URL"] = "./milvus.db"
    +
    +
    +

    Что касается переменных окружения VECTOR_DB_URL и VECTOR_DB_KEY:

    +
      +
    • Установка VECTOR_DB_URL в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве VECTOR_DB_URL.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте VECTOR_DB_URL и VECTOR_DB_KEY, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +

    +

    Подготовьте данные

    Мы используем страницы FAQ из документации Milvus 2.4.x в качестве частных знаний в нашей RAG, которая является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Сборка RAG

    Сброс данных Cognee

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    Теперь, когда все готово, мы можем добавить наш набор данных и обработать его в граф знаний.

    +

    Добавление данных и обработка Cognifying

    await cognee.add(data=text_lines, dataset_name="milvus_faq")
    +await cognee.cognify()
    +
    +# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
    +# ...
    +
    +

    Метод add загружает набор данных (Milvus FAQs) в Cognee, а метод cognify обрабатывает данные для извлечения сущностей, связей и обобщений, создавая граф знаний.

    +

    Запрос сводок

    Теперь, когда данные обработаны, давайте сделаем запрос к графу знаний.

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
    +
    +print(search_results[0])
    +
    +
    {'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
    +
    +

    Этот запрос ищет в графе знаний резюме, связанное с текстом запроса, и выводит наиболее связанного кандидата.

    +

    Запрос по фрагментам

    Сводки предлагают высокоуровневые сведения, но для получения более детальной информации мы можем запросить определенные фрагменты данных непосредственно из обработанного набора данных. Эти фрагменты получены из исходных данных, которые были добавлены и проанализированы во время создания графа знаний.

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
    +
    +

    Давайте отформатируем и отобразим их для лучшей читабельности!

    +
    def format_and_print(data):
    +    print("ID:", data["id"])
    +    print("\nText:\n")
    +    paragraphs = data["text"].split("\n\n")
    +    for paragraph in paragraphs:
    +        print(paragraph.strip())
    +        print()
    +
    +
    +format_and_print(search_results[0])
    +
    +
    ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
    +
    +Text:
    +
    +Where does Milvus store data?
    +
    +Milvus deals with two types of data, inserted data and metadata.
    +
    +Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
    +
    +Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
    +
    +###
    +
    +

    На предыдущих этапах мы запрашивали набор данных Milvus FAQ для получения как сводок, так и конкретных фрагментов данных. Хотя это позволило получить подробные сведения и детализированную информацию, набор данных был большим, что затрудняло четкое отображение зависимостей в графе знаний.

    +

    Чтобы решить эту проблему, мы перезагрузим среду Cognee и будем работать с меньшим, более узким набором данных. Это позволит нам лучше продемонстрировать взаимосвязи и зависимости, выявленные в процессе познания. Упростив данные, мы сможем наглядно увидеть, как Cognee организует и структурирует информацию в графе знаний.

    +

    Перезагрузка Cognee

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    Добавление сфокусированного набора данных

    Здесь добавляется и обрабатывается меньший набор данных, содержащий всего одну строку текста, чтобы обеспечить сфокусированный и легко интерпретируемый граф знаний.

    +
    # We only use one line of text as the dataset, which simplifies the output later
    +text = """
    +    Natural language processing (NLP) is an interdisciplinary
    +    subfield of computer science and information retrieval.
    +    """
    +
    +await cognee.add(text)
    +await cognee.cognify()
    +
    +

    Запрос для получения информации

    Сосредоточившись на этом меньшем наборе данных, мы можем четко проанализировать взаимосвязи и структуру графа знаний.

    +
    query_text = "Tell me about NLP"
    +search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
    +
    +for result_text in search_results:
    +    print(result_text)
    +
    +# Example output:
    +# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
    +# (...)
    +#
    +# It represents nodes and relationships in the knowledge graph:
    +# - The first element is the source node (e.g., 'natural language processing').
    +# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
    +# - The third element is the target node (e.g., 'computer science').
    +
    +

    Этот вывод представляет собой результаты запроса к графу знаний, показывая сущности (узлы) и их взаимосвязи (ребра), извлеченные из обработанного набора данных. Каждый кортеж включает исходную сущность, тип связи и целевую сущность, а также метаданные, такие как уникальные идентификаторы, описания и временные метки. Граф выделяет ключевые понятия и их семантические связи, обеспечивая структурированное понимание набора данных.

    +

    Поздравляем, вы узнали о базовом использовании cognee с Milvus. Если вы хотите узнать о более продвинутом использовании cognee, пожалуйста, обратитесь к его официальной странице.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.json new file mode 100644 index 000000000..0bbc68b68 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"DEEPSEEK_API_KEY\"] = \"***********\"\n","! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\ndeepseek_client = OpenAI(\n api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n base_url=\"https://api.deepseek.com\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = deepseek_client.chat.completions.create(\n model=\"deepseek-chat\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and DeepSeek","anchorList":[{"label":"Создайте RAG с помощью Milvus и DeepSeek","href":"Build-RAG-with-Milvus-and-DeepSeek","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.md new file mode 100644 index 000000000..c48f145c5 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_deepseek.md @@ -0,0 +1,247 @@ +--- +id: build_RAG_with_milvus_and_deepseek.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер Retrieval-Augmented + Generation (RAG) с помощью Milvus и DeepSeek. +title: Создайте RAG с помощью Milvus и DeepSeek +--- +

    Создайте RAG с помощью Milvus и DeepSeek

    Open In Colab +GitHub Repository

    +

    DeepSeek позволяет разработчикам создавать и масштабировать приложения ИИ с высокопроизводительными языковыми моделями. Он предлагает эффективные выводы, гибкие API и передовые архитектуры Mixture-of-Experts (MoE) для надежных задач рассуждения и поиска.

    +

    В этом руководстве мы покажем вам, как построить конвейер Retrieval-Augmented Generation (RAG) с помощью Milvus и DeepSeek.

    +

    Подготовка

    Зависимости и окружение

    ! pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    DeepSeek использует API в стиле OpenAI. Вы можете зайти на его официальный сайт и подготовить api ключ DEEPSEEK_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["DEEPSEEK_API_KEY"] = "***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватного знания в нашем RAG, который является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    ! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка LLM и модели встраивания

    DeepSeek использует API в стиле OpenAI, и вы можете использовать этот же API с небольшими изменениями для вызова LLM.

    +
    from openai import OpenAI
    +
    +deepseek_client = OpenAI(
    +    api_key=os.environ["DEEPSEEK_API_KEY"],
    +    base_url="https://api.deepseek.com",
    +)
    +
    +

    Определите модель встраивания для генерации текстовых вкраплений с помощью milvus_model. В качестве примера мы используем модель DefaultEmbeddingFunction, которая представляет собой предварительно обученную и легкую модель встраивания.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    Сгенерируйте тестовый эмбеддинг и выведите его размерность и первые несколько элементов.

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings:   0%|          | 0/72 [00:00<?, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 246522.36it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана с полученными документами из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте модель deepseek-chat, предоставленную DeepSeek, чтобы сгенерировать ответ на основе подсказок.

    +
    response = deepseek_client.chat.completions.create(
    +    model="deepseek-chat",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +1. **Inserted Data**: This includes vector data, scalar data, and collection-specific schema. The inserted data is stored in persistent storage as incremental logs. Milvus supports various object storage backends for this purpose, such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +2. **Metadata**: Metadata is generated within Milvus and is specific to each Milvus module. This metadata is stored in etcd, a distributed key-value store.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and Milvus returns success at this stage. The data is then written to persistent storage as incremental logs by the data node. If the `flush()` function is called, the data node is forced to write all data in the message queue to persistent storage immediately.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и DeepSeek.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.json new file mode 100644 index 000000000..0ed1b7791 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"FIREWORKS_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nfireworks_client = OpenAI(\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n base_url=\"https://api.fireworks.ai/inference/v1\",\n)\n","def emb_text(text):\n return (\n fireworks_client.embeddings.create(\n input=text, model=\"nomic-ai/nomic-embed-text-v1.5\"\n )\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = fireworks_client.chat.completions.create(\n model=\"accounts/fireworks/models/llama-v3p1-405b-instruct\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Fireworks AI","anchorList":[{"label":"Создайте RAG с помощью Milvus и Fireworks AI","href":"Build-RAG-with-Milvus-and-Fireworks-AI","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.md new file mode 100644 index 000000000..3091104ca --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_fireworks.md @@ -0,0 +1,248 @@ +--- +id: build_RAG_with_milvus_and_fireworks.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер RAG + (Retrieval-Augmented Generation) с помощью Milvus и Fireworks AI. +title: Создайте RAG с помощью Milvus и Fireworks AI +--- +

    Создайте RAG с помощью Milvus и Fireworks AI

    +Open In Colab + + +GitHub Repository +

    +

    Fireworks AI - это платформа для генеративных выводов ИИ, обеспечивающая лучшую в отрасли скорость и готовность к производству для запуска и настройки моделей. Fireworks AI предоставляет различные услуги генеративного ИИ, включая бессерверные модели, развертывание по требованию и возможности тонкой настройки. Он предлагает комплексную среду для развертывания различных моделей ИИ, включая большие языковые модели (LLM) и модели встраивания. Fireworks AI объединяет множество моделей, позволяя пользователям легко получать доступ к этим ресурсам и использовать их без необходимости создания обширной инфраструктуры.

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и Fireworks AI.

    +

    Подготовка

    Зависимости и окружение

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Fireworks AI позволяет использовать API в стиле OpenAI. Вы можете зайти на его официальный сайт и подготовить api ключ FIREWORKS_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["FIREWORKS_API_KEY"] = "***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватного знания в нашем RAG, который является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка LLM и модели встраивания

    Мы инициализируем клиент для подготовки LLM и модели встраивания. Fireworks AI позволяет использовать API в стиле OpenAI, и вы можете использовать этот же API с небольшими изменениями для вызова модели встраивания и LLM.

    +
    from openai import OpenAI
    +
    +fireworks_client = OpenAI(
    +    api_key=os.environ["FIREWORKS_API_KEY"],
    +    base_url="https://api.fireworks.ai/inference/v1",
    +)
    +
    +

    Определите функцию для генерации текстовых вкраплений с помощью клиента. В качестве примера мы используем модель nomic-ai/nomic-embed-text-v1.5.

    +
    def emb_text(text):
    +    return (
    +        fireworks_client.embeddings.create(
    +            input=text, model="nomic-ai/nomic-embed-text-v1.5"
    +        )
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовое вкрапление и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[0.04815673828125, 0.0261993408203125, -0.1749267578125, -0.03131103515625, 0.068115234375, -0.00621795654296875, 0.03955078125, -0.0210723876953125, 0.039703369140625, -0.0286102294921875]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:28<00:00,  2.51it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8334928750991821
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.746377170085907
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7328270673751831
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана с полученными документами из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте модель llama-v3p1-405b-instruct, предоставленную Fireworks, чтобы сгенерировать ответ на основе подсказок.

    +
    response = fireworks_client.chat.completions.create(
    +    model="accounts/fireworks/models/llama-v3p1-405b-instruct",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    According to the provided context, Milvus stores data in two ways:
    +
    +1. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. This can be done using multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +2. Metadata, which are generated within Milvus, are stored in etcd, with each Milvus module having its own metadata.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and then written to persistent storage as incremental logs by the data node. The `flush()` function can be used to force the data node to write all data in the message queue to persistent storage immediately.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и Fireworks AI.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.json new file mode 100644 index 000000000..347e0f016 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus google-generativeai requests tqdm\n","import os\n\nos.environ[\"GEMINI_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","import google.generativeai as genai\n\ngenai.configure(api_key=os.environ[\"GEMINI_API_KEY\"])\n\ngemini_model = genai.GenerativeModel(\"gemini-1.5-flash\")\n\nresponse = gemini_model.generate_content(\"who are you\")\nprint(response.text)\n","test_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=[\"This is a test1\", \"This is a test2\"]\n)[\"embedding\"]\n\nembedding_dim = len(test_embeddings[0])\nprint(embedding_dim)\nprint(test_embeddings[0][:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=text_lines\n)[\"embedding\"]\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","question_embedding = genai.embed_content(\n model=\"models/text-embedding-004\", content=question\n)[\"embedding\"]\n\nsearch_res = milvus_client.search(\n collection_name=collection_name,\n data=[question_embedding],\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","gemini_model = genai.GenerativeModel(\n \"gemini-1.5-flash\", system_instruction=SYSTEM_PROMPT\n)\nresponse = gemini_model.generate_content(USER_PROMPT)\nprint(response.text)\n"],"headingContent":"Build RAG with Milvus and Gemini","anchorList":[{"label":"Создайте RAG с помощью Milvus и Gemini","href":"Build-RAG-with-Milvus-and-Gemini","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.md new file mode 100644 index 000000000..d9e9227d4 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_gemini.md @@ -0,0 +1,246 @@ +--- +id: build_RAG_with_milvus_and_gemini.md +summary: >- + В этом уроке мы покажем вам, как построить конвейер RAG (Retrieval-Augmented + Generation) с помощью Milvus и Gemini. Мы будем использовать модель Gemini для + генерации текста на основе заданного запроса. Мы также будем использовать + Milvus для хранения и получения сгенерированного текста. +title: Создайте RAG с помощью Milvus и Gemini +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Создайте RAG с помощью Milvus и Gemini

    API Gemini и Google AI Studio помогут вам начать работу с новейшими моделями Google и воплотить свои идеи в масштабируемых приложениях. Gemini предоставляет доступ к таким мощным языковым моделям, как Gemini-1.5-Flash, Gemini-1.5-Flash-8B и Gemini-1.5-Pro, для решения таких задач, как генерация текста, обработка документов, зрение, анализ аудио и многое другое. API позволяет вводить длинные контексты с миллионами лексем, точно настраивать модели для конкретных задач, генерировать структурированные результаты, такие как JSON, и использовать такие возможности, как семантический поиск и выполнение кода.

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и Gemini. Мы будем использовать модель Gemini для генерации текста на основе заданного запроса. Мы также будем использовать Milvus для хранения и извлечения сгенерированного текста.

    +

    Подготовка

    Зависимости и окружение

    $ pip install --upgrade pymilvus google-generativeai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (щелкните на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Сначала необходимо войти в платформу Google AI Studio и подготовить api ключ GEMINI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["GEMINI_API_KEY"] = "***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватных знаний в нашем RAG, что является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка LLM и модели встраивания

    В качестве LLM мы используем gemini-1.5-flash, а в качестве модели встраивания - text-embedding-004.

    +

    Давайте попробуем сгенерировать тестовый ответ из LLM:

    +
    import google.generativeai as genai
    +
    +genai.configure(api_key=os.environ["GEMINI_API_KEY"])
    +
    +gemini_model = genai.GenerativeModel("gemini-1.5-flash")
    +
    +response = gemini_model.generate_content("who are you")
    +print(response.text)
    +
    +
    I am a large language model, trained by Google.  I am an AI and don't have a personal identity or consciousness.  My purpose is to process information and respond to a wide range of prompts and questions in a helpful and informative way.
    +
    +

    Сгенерируйте тестовый эмбеддинг и выведите его размерность и первые несколько элементов.

    +
    test_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=["This is a test1", "This is a test2"]
    +)["embedding"]
    +
    +embedding_dim = len(test_embeddings[0])
    +print(embedding_dim)
    +print(test_embeddings[0][:10])
    +
    +
    768
    +[0.013588584, -0.004361838, -0.08481652, -0.039724775, 0.04723794, -0.0051557426, 0.026071774, 0.045514572, -0.016867816, 0.039378334]
    +
    +

    Загрузка данных в Milvus

    Создать коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=text_lines
    +)["embedding"]
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 468201.38it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    question_embedding = genai.embed_content(
    +    model="models/text-embedding-004", content=question
    +)["embedding"]
    +
    +search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[question_embedding],
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8048275113105774
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7574886679649353
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7453608512878418
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана из документов, полученных из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте Gemini для генерации ответа на основе подсказок.

    +
    gemini_model = genai.GenerativeModel(
    +    "gemini-1.5-flash", system_instruction=SYSTEM_PROMPT
    +)
    +response = gemini_model.generate_content(USER_PROMPT)
    +print(response.text)
    +
    +
    Milvus stores data in two ways:  Inserted data (vector data, scalar data, and collection-specific schema) is stored as an incremental log in persistent storage using object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.  Metadata, generated by each Milvus module, is stored in etcd.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и Gemini.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.json new file mode 100644 index 000000000..48ec073df --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"LEPTONAI_TOKEN\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nlepton_client = OpenAI(\n api_key=os.environ[\"LEPTONAI_TOKEN\"],\n base_url=\"https://mistral-7b.lepton.run/api/v1/\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = lepton_client.chat.completions.create(\n model=\"mistral-7b\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Lepton AI","anchorList":[{"label":"Создайте RAG с помощью Milvus и Lepton AI","href":"Build-RAG-with-Milvus-and-Lepton-AI","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.md new file mode 100644 index 000000000..64fa408e6 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_lepton.md @@ -0,0 +1,243 @@ +--- +id: build_RAG_with_milvus_and_lepton.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер RAG + (Retrieval-Augmented Generation) с помощью Milvus и Lepton AI. +title: Создайте RAG с помощью Milvus и Lepton AI +--- +

    Создайте RAG с помощью Milvus и Lepton AI

    +Open In Colab + + +GitHub Repository +

    +

    Lepton AI позволяет разработчикам и предприятиям эффективно запускать приложения ИИ в считанные минуты и в масштабах, готовых к производству. Lepton AI позволяет создавать модели на языке Python, отлаживать и тестировать модели локально, развертывать их в облаке одной командой и использовать модели в любом приложении с помощью простого и гибкого API. Он предоставляет комплексную среду для развертывания различных моделей ИИ, включая большие языковые модели (LLM) и диффузионные модели, без необходимости создания обширной инфраструктуры.

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и Lepton AI.

    +

    Подготовка

    Зависимости и окружение

    $ pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Lepton позволяет использовать API в стиле OpenAI. Вы можете зайти на его официальный сайт и подготовить api ключ LEPTONAI_TOKEN в качестве переменной окружения.

    +
    import os
    +
    +os.environ["LEPTONAI_TOKEN"] = "***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватного знания в нашем RAG, который является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка LLM и модели встраивания

    Lepton использует API в стиле OpenAI, и вы можете использовать тот же API с небольшими изменениями для вызова LLM.

    +
    from openai import OpenAI
    +
    +lepton_client = OpenAI(
    +    api_key=os.environ["LEPTONAI_TOKEN"],
    +    base_url="https://mistral-7b.lepton.run/api/v1/",
    +)
    +
    +

    Определите модель встраивания для генерации текстовых вкраплений с помощью milvus_model. В качестве примера мы используем модель DefaultEmbeddingFunction, которая является предварительно обученной и легкой моделью встраивания.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    Сгенерируйте тестовый эмбеддинг и выведите его размерность и первые несколько элементов.

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 1090216.20it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана с полученными документами из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте модель mistral-7b, предоставленную Lepton AI, чтобы сгенерировать ответ на основе подсказок.

    +
    response = lepton_client.chat.completions.create(
    +    model="mistral-7b",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Inserted data in Milvus, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and stored in etcd.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и Lepton AI.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.json new file mode 100644 index 000000000..300ba1d36 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus ollama\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","! ollama pull mxbai-embed-large\n","! ollama pull llama3.2\n","import ollama\n\n\ndef emb_text(text):\n response = ollama.embeddings(model=\"mxbai-embed-large\", prompt=text)\n return response[\"embedding\"]\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","from ollama import chat\nfrom ollama import ChatResponse\n\nresponse: ChatResponse = chat(\n model=\"llama3.2\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response[\"message\"][\"content\"])\n"],"headingContent":"Build RAG with Milvus and Ollama","anchorList":[{"label":"Создайте RAG с помощью Milvus и Ollama","href":"Build-RAG-with-Milvus-and-Ollama","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.md new file mode 100644 index 000000000..05332e612 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_ollama.md @@ -0,0 +1,282 @@ +--- +id: build_RAG_with_milvus_and_ollama.md +summary: >- + В этом руководстве мы покажем вам, как использовать возможности Ollama и + Milvus для эффективного и безопасного построения конвейера RAG + (Retrieval-Augmented Generation). +title: Создайте RAG с помощью Milvus и Ollama +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Создайте RAG с помощью Milvus и Ollama

    Ollama - это платформа с открытым исходным кодом, которая упрощает запуск и настройку больших языковых моделей (LLM) на локальном уровне. Она обеспечивает удобство использования без облачных вычислений, позволяя легко загружать модели, устанавливать их и взаимодействовать с ними, не требуя продвинутых технических навыков. Благодаря растущей библиотеке предварительно обученных LLM - от общего назначения до специфических для конкретной области - Allama позволяет легко управлять моделями и настраивать их для различных приложений. Она обеспечивает конфиденциальность данных и гибкость, позволяя пользователям точно настраивать, оптимизировать и внедрять решения на основе ИИ исключительно на своих машинах.

    +

    В этом руководстве мы покажем вам, как использовать Ollama и Milvus для эффективного и безопасного построения конвейера RAG (Retrieval-Augmented Generation).

    +

    Подготовка

    Зависимости и окружение

    $ pip install pymilvus ollama
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве частных знаний в нашем RAG, что является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +
    --2024-11-26 21:47:19--  https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +Resolving github.com (github.com)... 140.82.112.4
    +Connecting to github.com (github.com)|140.82.112.4|:443... connected.
    +HTTP request sent, awaiting response... 302 Found
    +Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream [following]
    +--2024-11-26 21:47:20--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream
    +Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ...
    +Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
    +HTTP request sent, awaiting response... 200 OK
    +Length: 613094 (599K) [application/octet-stream]
    +Saving to: ‘milvus_docs_2.4.x_en.zip’
    +
    +milvus_docs_2.4.x_e 100%[===================>] 598.72K  1.20MB/s    in 0.5s    
    +
    +2024-11-26 21:47:20 (1.20 MB/s) - ‘milvus_docs_2.4.x_en.zip’ saved [613094/613094]
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка модели LLM и встраивания

    Ollama поддерживает несколько моделей как для задач на основе LLM, так и для генерации вкраплений, что упрощает разработку приложений для генерации с расширением поиска (RAG). Для этой установки:

    +
      +
    • Мы будем использовать Llama 3.2 (3B) в качестве LLM для задач генерации текста.
    • +
    • Для генерации вкраплений мы будем использовать mxbai-embed-large, модель с 334M параметрами, оптимизированную для семантического сходства.
    • +
    +

    Прежде чем приступить к работе, убедитесь, что обе модели локально подтянуты:

    +
    ! ollama pull mxbai-embed-large
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling 819c2adf5ce6... 100% ▕████████████████▏ 669 MB                         
    +pulling c71d239df917... 100% ▕████████████████▏  11 KB                         
    +pulling b837481ff855... 100% ▕████████████████▏   16 B                         
    +pulling 38badd946f91... 100% ▕████████████████▏  408 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +
    ! ollama pull llama3.2
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling dde5aa3fc5ff... 100% ▕████████████████▏ 2.0 GB                         
    +pulling 966de95ca8a6... 100% ▕████████████████▏ 1.4 KB                         
    +pulling fcc5a6bec9da... 100% ▕████████████████▏ 7.7 KB                         
    +pulling a70ff7e570d9... 100% ▕████████████████▏ 6.0 KB                         
    +pulling 56bb8bd477a5... 100% ▕████████████████▏   96 B                         
    +pulling 34bb5ab01051... 100% ▕████████████████▏  561 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +

    Когда эти модели готовы, мы можем приступить к реализации рабочих процессов генерации на основе LLM и поиска на основе вкраплений.

    +
    import ollama
    +
    +
    +def emb_text(text):
    +    response = ollama.embeddings(model="mxbai-embed-large", prompt=text)
    +    return response["embedding"]
    +
    +

    Сгенерируйте тестовый эмбеддинг и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.23276396095752716, 0.4257211685180664, 0.19724100828170776, 0.46120673418045044, -0.46039995551109314, -0.1413791924715042, -0.18261606991291046, -0.07602324336767197, 0.39991313219070435, 0.8337644338607788]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:03<00:00, 22.56it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        231.9398193359375
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        226.48316955566406
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        210.60745239257812
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана с полученными документами из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте модель llama3.2, предоставленную Ollama, чтобы сгенерировать ответ на основе подсказок.

    +
    from ollama import chat
    +from ollama import ChatResponse
    +
    +response: ChatResponse = chat(
    +    model="llama3.2",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response["message"]["content"])
    +
    +
    According to the provided context, data in Milvus is stored in two types:
    +
    +1. **Inserted data**: Storing data in persistent storage as incremental log. It supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +
    +2. **Metadata**: Generated within Milvus and stored in etcd.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и Ollama.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.json b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.json new file mode 100644 index 000000000..5547cb9f2 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"SILICON_FLOW_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nsiliconflow_client = OpenAI(\n api_key=os.environ[\"SILICON_FLOW_API_KEY\"], base_url=\"https://api.siliconflow.cn/v1\"\n)\n","def emb_text(text):\n return (\n siliconflow_client.embeddings.create(input=text, model=\"BAAI/bge-large-en-v1.5\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = siliconflow_client.chat.completions.create(\n model=\"deepseek-ai/DeepSeek-V2.5\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and SiliconFlow","anchorList":[{"label":"Создайте RAG с помощью Milvus и SiliconFlow","href":"Build-RAG-with-Milvus-and-SiliconFlow","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.md b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.md new file mode 100644 index 000000000..25c19262f --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_RAG_with_milvus_and_siliconflow.md @@ -0,0 +1,244 @@ +--- +id: build_RAG_with_milvus_and_siliconflow.md +summary: >- + В этом руководстве мы покажем вам, как построить конвейер RAG + (Retrieval-Augmented Generation) с помощью Milvus и SiliconFlow. +title: Создайте RAG с помощью Milvus и SiliconFlow +--- +

    Создайте RAG с помощью Milvus и SiliconFlow

    +Open In Colab + + +GitHub Repository +

    +

    SiliconFlow стремится создать масштабируемую, стандартизированную и высокопроизводительную инфраструктурную платформу ИИ. SiliconCloud - одно из флагманских предложений SiliconFlow, описываемое как платформа "модель как услуга" (MaaS). Она предоставляет комплексную среду для развертывания различных моделей ИИ, включая большие языковые модели (LLM) и модели встраивания. SiliconCloud объединяет множество моделей с открытым исходным кодом, позволяя пользователям легко получать доступ к этим ресурсам и использовать их без необходимости создания обширной инфраструктуры.

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и SiliconFlow.

    +

    Подготовка

    Зависимости и окружение

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    SiliconFlow позволяет использовать API в стиле OpenAI. Вы можете зайти на его официальный сайт и подготовить api ключ SILICON_FLOW_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["SILICON_FLOW_API_KEY"] = "***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватного знания в нашем RAG, который является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка модели встраивания

    Мы инициализируем клиента, чтобы подготовить модель встраивания. SiliconFlow позволяет использовать API в стиле OpenAI, и вы можете использовать этот же API с небольшими изменениями для вызова модели встраивания и LLM.

    +
    from openai import OpenAI
    +
    +siliconflow_client = OpenAI(
    +    api_key=os.environ["SILICON_FLOW_API_KEY"], base_url="https://api.siliconflow.cn/v1"
    +)
    +
    +

    Определите функцию для генерации текстовых вкраплений с помощью клиента. В качестве примера мы используем модель BAAI/bge-large-en-v1.5.

    +
    def emb_text(text):
    +    return (
    +        siliconflow_client.embeddings.create(input=text, model="BAAI/bge-large-en-v1.5")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовое вкрапление и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.011475468054413795, 0.02982141077518463, 0.0038535362109541893, 0.035921916365623474, -0.0159175843000412, -0.014918108470737934, -0.018094222992658615, -0.002937349723652005, 0.030917132273316383, 0.03390815854072571]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:04<00:00, 16.97it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.833885133266449
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.812842607498169
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7714196443557739
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана с полученными документами из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте модель deepseek-ai/DeepSeek-V2.5, предоставленную SiliconCloud, чтобы сгенерировать ответ на основе подсказок.

    +
    response = siliconflow_client.chat.completions.create(
    +    model="deepseek-ai/DeepSeek-V2.5",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +- **Inserted Data**: This includes vector data, scalar data, and collection-specific schema, which are stored in persistent storage as incremental logs. Milvus supports various object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +- **Metadata**: This is generated within Milvus, with each module having its own metadata stored in etcd, a distributed key-value store.
    +
    +

    Отлично! Мы успешно построили конвейер RAG с помощью Milvus и SiliconFlow.

    diff --git a/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.json b/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.json new file mode 100644 index 000000000..325b22f63 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt update\n$ sudo apt install python-is-python3 python3-pip python3-venv -y\n","$ python -m venv venv\n$ source venv/bin/activate\n","$ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(\n uri=\"\", token=\"\"\n)\n\ncollection_name = \"my_rag_collection\"\n\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=384,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from langchain_huggingface import HuggingFaceEmbeddings\n\nembedding_model = HuggingFaceEmbeddings(model_name=\"all-MiniLM-L6-v2\")\n","from tqdm import tqdm\n\ndata = []\n\ntext_embeddings = embedding_model.embed_documents(text_lines)\n\nfor i, (line, embedding) in enumerate(\n tqdm(zip(text_lines, text_embeddings), desc=\"Creating embeddings\")\n):\n data.append({\"id\": i, \"vector\": embedding, \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","$ sudo apt install make cmake -y\n$ sudo apt install gcc g++ -y\n$ sudo apt install build-essential -y\n","$ git clone https://github.com/ggerganov/llama.cpp\n","$ cd llama.cpp\n$ make GGML_NO_LLAMAFILE=1 -j$(nproc)\n","$ ./llama-cli -h\n","$ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False\n","$ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8\n","$ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536 --port 8080\n","from openai import OpenAI\n\nllm_client = OpenAI(base_url=\"http://localhost:8080/v1\", api_key=\"no-key\")\n","test_embedding = embedding_model.embed_query(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n embedding_model.embed_query(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","response = llm_client.chat.completions.create(\n model=\"not-used\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n\n"],"headingContent":"Build RAG on Arm Architecture","anchorList":[{"label":"Построение RAG на архитектуре Arm","href":"Build-RAG-on-Arm-Architecture","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisite","type":2,"isActive":false},{"label":"Автономная загрузка данных","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"Запуск сервиса LLM на платформе Arm","href":"Launch-LLM-Service-on-Arm","type":2,"isActive":false},{"label":"Онлайн RAG","href":"Online-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.md b/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.md new file mode 100644 index 000000000..3041b9087 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/build_rag_on_arm.md @@ -0,0 +1,302 @@ +--- +id: build_rag_on_arm.md +summary: >- + В этом руководстве вы узнаете, как создать приложение Retrieval-Augmented + Generation (RAG) на инфраструктуре на базе Arm. Для хранения векторов мы + используем Zilliz Cloud, полностью управляемую векторную базу данных Milvus. + Zilliz Cloud доступна в таких крупных облаках, как AWS, GCP и Azure. В данной + демонстрации мы используем Zilliz Cloud, развернутый на AWS с помощью машин + Arm. Для LLM мы используем модель Llama-3.1-8B на процессоре сервера AWS на + базе Arm, используя llama.cpp. +title: Построение RAG на архитектуре Arm +--- +

    Построение RAG на архитектуре Arm

    ПроцессорыArm активно используются в широком спектре приложений, включая традиционные задачи машинного обучения (ML) и искусственного интеллекта (AI).

    +

    В этом руководстве вы узнаете, как построить приложение Retrieval-Augmented Generation (RAG) на инфраструктуре на базе Arm. Для хранения векторов мы используем Zilliz Cloud, полностью управляемую векторную базу данных Milvus. Zilliz Cloud доступна в таких крупных облаках, как AWS, GCP и Azure. В данной демонстрации мы используем Zilliz Cloud, развернутый на AWS с помощью машин Arm. Для LLM мы используем модель Llama-3.1-8B на процессоре сервера AWS на базе Arm с помощью llama.cpp.

    +

    Необходимые условия

    Для выполнения этого примера мы рекомендуем использовать AWS Graviton, который обеспечивает экономически эффективный способ запуска рабочих нагрузок ML на серверах на базе Arm. Этот ноутбук был протестирован на экземпляре AWS Graviton3 c7g.2xlarge с системой Ubuntu 22.04 LTS.

    +

    Для выполнения этого примера вам потребуется не менее четырех ядер и 8 ГБ оперативной памяти. Настройте дисковое хранилище объемом не менее 32 ГБ. Мы рекомендуем использовать экземпляр с такими же или лучшими характеристиками.

    +

    После запуска экземпляра подключитесь к нему и выполните следующие команды для подготовки среды.

    +

    Установите python на сервер:

    +
    $ sudo apt update
    +$ sudo apt install python-is-python3 python3-pip python3-venv -y
    +
    +

    Создайте и активируйте виртуальную среду:

    +
    $ python -m venv venv
    +$ source venv/bin/activate
    +
    +

    Установите необходимые зависимости python:

    +
    $ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm
    +
    +

    Автономная загрузка данных

    Создание коллекции

    Для хранения и получения векторных данных мы используем облако Zilliz Cloud, развернутое на AWS, с машинами на базе Arm. Чтобы быстро начать, просто бесплатно зарегистрируйте учетную запись на Zilliz Cloud.

    +
    +

    В дополнение к Zilliz Cloud можно использовать и самостоятельный хостинг Milvus (более сложный в настройке). Мы также можем развернуть Milvus Standalone и Kubernetes на машинах на базе ARM. Более подробную информацию об установке Milvus можно найти в документации по установке.

    +
    +

    Мы задаем uri и token в качестве публичной конечной точки и Api ключа в Zilliz Cloud.

    +
    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(
    +    uri="<your_zilliz_public_endpoint>", token="<your_zilliz_api_key>"
    +)
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создаем новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=384,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    В качестве типа метрики по умолчанию мы используем внутреннее произведение расстояний. Для получения дополнительной информации о типах расстояний вы можете обратиться к странице Метрики сходства.

    +

    Подготовка данных

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве частных знаний в нашей RAG, которая является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Вставка данных

    Мы подготовили простую, но эффективную модель встраивания all-MiniLM-L6-v2, которая может преобразовывать текст в векторы встраивания.

    +
    from langchain_huggingface import HuggingFaceEmbeddings
    +
    +embedding_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
    +
    +

    Итерация по строкам текста, создание вкраплений, а затем вставка данных в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, которое на высоком уровне может рассматриваться как обычное поле.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +text_embeddings = embedding_model.embed_documents(text_lines)
    +
    +for i, (line, embedding) in enumerate(
    +    tqdm(zip(text_lines, text_embeddings), desc="Creating embeddings")
    +):
    +    data.append({"id": i, "vector": embedding, "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 72/72 [00:18<00:00,  3.91it/s]
    +
    +

    Запуск сервиса LLM на платформе Arm

    В этом разделе мы создадим и запустим сервис llama.cpp на процессоре на базе Arm.

    +

    Модель Llama 3.1 и llama.cpp

    Модель Llama-3.1-8B от Meta относится к семейству моделей Llama 3.1 и является бесплатной для использования в исследовательских и коммерческих целях. Прежде чем использовать модель, посетите сайт Llama и заполните форму для запроса доступа.

    +

    llama.cpp - это проект с открытым исходным кодом на языке C/C++, который обеспечивает эффективный вывод LLM на различном оборудовании - как локально, так и в облаке. Вы можете удобно разместить модель Llama 3.1 с помощью llama.cpp.

    +

    Загрузите и соберите llama.cpp

    Выполните следующие команды, чтобы установить make, cmake, gcc, g++ и другие инструменты, необходимые для сборки llama.cpp из исходного кода:

    +
    $ sudo apt install make cmake -y
    +$ sudo apt install gcc g++ -y
    +$ sudo apt install build-essential -y
    +
    +

    Теперь вы готовы приступить к сборке llama.cpp.

    +

    Клонируйте репозиторий исходных текстов для llama.cpp:

    +
    $ git clone https://github.com/ggerganov/llama.cpp
    +
    +

    По умолчанию llama.cpp собирается только для CPU в Linux и Windows. Вам не нужно предоставлять никаких дополнительных переключателей, чтобы собрать его для процессора Arm, на котором вы его запускаете.

    +

    Запустите make для сборки:

    +
    $ cd llama.cpp
    +$ make GGML_NO_LLAMAFILE=1 -j$(nproc)
    +
    +

    Проверьте правильность сборки llama.cpp, выполнив команду help:

    +
    $ ./llama-cli -h
    +
    +

    Если llama.cpp был собран правильно, вы увидите отображение опции help. Выходной фрагмент выглядит следующим образом:

    +
    example usage:
    +
    +    text generation:     ./llama-cli -m your_model.gguf -p "I believe the meaning of life is" -n 128
    +
    +    chat (conversation): ./llama-cli -m your_model.gguf -p "You are a helpful assistant" -cnv
    +
    +

    Теперь вы можете загрузить модель с помощью huggingface cli:

    +
    $ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False
    +
    +

    Формат модели GGUF, представленный командой llama.cpp, использует сжатие и квантование для уменьшения точности весов до 4-битных целых чисел, что значительно снижает требования к вычислительным ресурсам и памяти и делает процессоры Arm CPU эффективными для вывода LLM.

    +

    Переквантование весов модели

    Для повторного квантования выполните команду

    +
    $ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8
    +
    +

    В результате будет создан новый файл dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf, содержащий перенастроенные веса, которые позволяют llama-cli использовать SVE 256 и поддержку MATMUL_INT8.

    +
    +

    Эта реквантизация оптимальна именно для Гравитона3. Для Гравитона2 оптимальная реквантизация должна быть выполнена в формате Q4_0_4_4, а для Гравитона4 наиболее подходящим для реквантизации является формат Q4_0_4_8.

    +
    +

    Запуск службы LLM

    Вы можете использовать серверную программу llama.cpp и отправлять запросы через OpenAI-совместимый API. Это позволяет разрабатывать приложения, которые многократно взаимодействуют с LLM без необходимости многократно запускать и останавливать его. Кроме того, вы можете получить доступ к серверу с другой машины, на которой LLM размещен по сети.

    +

    Запустите сервер из командной строки, и он будет слушать порт 8080:

    +
    $ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536  --port 8080
    +
    +
    'main: server is listening on 127.0.0.1:8080 - starting the main loop
    +
    +

    Вы также можете настроить параметры запущенного LLM, чтобы адаптировать его к оборудованию вашего сервера для достижения идеальной производительности. Дополнительные сведения о параметрах см. в команде llama-server --help.

    +

    Если вам сложно выполнить этот шаг, вы можете обратиться к официальным документам для получения дополнительной информации.

    +

    Вы запустили службу LLM на вашем процессоре на базе Arm. Далее мы напрямую взаимодействуем с сервисом с помощью OpenAI SDK.

    +

    Онлайн RAG

    Клиент LLM и модель встраивания

    Мы инициализируем LLM-клиент и подготовим модель встраивания.

    +

    Для LLM мы используем OpenAI SDK, чтобы запросить запущенный ранее сервис Llama. Нам не нужно использовать какой-либо API-ключ, потому что на самом деле это наш локальный сервис llama.cpp.

    +
    from openai import OpenAI
    +
    +llm_client = OpenAI(base_url="http://localhost:8080/v1", api_key="no-key")
    +
    +

    Сгенерируйте тестовое вложение и выведите его размерность и первые несколько элементов.

    +
    test_embedding = embedding_model.embed_query("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    384
    +[0.03061249852180481, 0.013831384479999542, -0.02084377221763134, 0.016327863559126854, -0.010231520049273968, -0.0479842908680439, -0.017313342541456223, 0.03728749603033066, 0.04588735103607178, 0.034405000507831573]
    +
    +

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантические топ-3 совпадения.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        embedding_model.embed_query(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6488019824028015
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5974207520484924
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5833579301834106
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +
    Define system and user prompts for the Language Model. This prompt is assembled with the retrieved documents from Milvus.
    +
    +SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте LLM для создания ответа на основе подсказок. Мы установили параметр model в значение not-used, поскольку он является избыточным параметром для службы llama.cpp.

    +
    response = llm_client.chat.completions.create(
    +    model="not-used",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    +
    Milvus stores data in two types: inserted data and metadata. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and each Milvus module has its own metadata that are stored in etcd.
    +
    +

    Поздравляем! Вы создали приложение RAG на базе инфраструктуры Arm.

    diff --git a/localization/v2.5.x/site/ru/integrations/dify_with_milvus.json b/localization/v2.5.x/site/ru/integrations/dify_with_milvus.json new file mode 100644 index 000000000..febb319cf --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/dify_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/langgenius/dify.git\n","cd dify/docker\n","cp .env.example .env\n","VECTOR_STORE=milvus\n","MILVUS_URI=xxx\nMILVUS_TOKEN=xxx\n","docker compose up -d\n","docker compose up -d\n"],"headingContent":"Deploying Dify with Milvus","anchorList":[{"label":"Развертывание Dify с помощью Milvus","href":"Deploying-Dify-with-Milvus","type":1,"isActive":false},{"label":"Клонирование репозитория","href":"Clone-the-Repository","type":2,"isActive":false},{"label":"Установите переменные окружения","href":"Set-the-Environment-Variables","type":2,"isActive":false},{"label":"Запуск контейнеров Docker","href":"Start-the-Docker-Containers","type":2,"isActive":false},{"label":"Войдите в систему Dify","href":"Log-in-to-Dify","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/dify_with_milvus.md b/localization/v2.5.x/site/ru/integrations/dify_with_milvus.md new file mode 100644 index 000000000..2a4db0f56 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/dify_with_milvus.md @@ -0,0 +1,111 @@ +--- +id: dify_with_milvus.md +summary: >- + В этом руководстве мы покажем вам, как развернуть Dify с Milvus, чтобы + обеспечить эффективный поиск и механизм RAG. +title: Развертывание Dify с помощью Milvus +--- +

    Развертывание Dify с помощью Milvus

    Dify - это платформа с открытым исходным кодом, предназначенная для упрощения создания приложений искусственного интеллекта путем объединения Backend-as-a-Service с LLMOps. Она поддерживает основные LLM, предлагает интуитивно понятный интерфейс оперативной оркестровки, высококачественные RAG-движки и гибкую структуру агентов ИИ. Благодаря низкокодовым рабочим процессам, простым в использовании интерфейсам и API, Dify позволяет разработчикам и нетехническим пользователям сосредоточиться на создании инновационных, реальных ИИ-решений, не сталкиваясь со сложностями.

    +

    В этом руководстве мы покажем вам, как развернуть Dify с Milvus, чтобы обеспечить эффективный поиск и RAG-движок.

    +

    Клонирование репозитория

    Клонируйте исходный код Dify на свою локальную машину:

    +
    git clone https://github.com/langgenius/dify.git
    +
    +

    Установите переменные окружения

    Перейдите в каталог Docker в исходном коде Dify.

    +
    cd dify/docker
    +
    +

    Скопируйте файл конфигурации окружения

    +
    cp .env.example .env
    +
    +

    Измените значение VECTOR_STORE в файле .env.

    +
    VECTOR_STORE=milvus
    +
    +

    Измените конфигурацию Milvus в файле .env.

    +
    MILVUS_URI=xxx
    +MILVUS_TOKEN=xxx
    +
    +

    В этой настройке используйте внешний URI сервера, напримерhttp://172.16.16.16:19530, в качестве MILVUS_URI.

    +

    Для MILVUS_TOKEN, если вы не установили токен для вашего сервера Milvus, вы можете установить пустую строку, как MILVUS_TOKEN=, в противном случае вам нужно установить его на ваш токен Milvus. Для получения дополнительной информации о том, как установить токен в Milvus, вы можете обратиться к странице аутентификации.

    +

    Запуск контейнеров Docker

    Выберите соответствующую команду для запуска контейнеров в зависимости от версии Docker Compose в вашей системе. Вы можете использовать команду $ docker compose version для проверки версии, а также обратиться к документации Docker для получения дополнительной информации:

    +

    Если у вас Docker Compose V2, используйте следующую команду:

    +
    docker compose up -d
    +
    +

    Если у вас Docker Compose V1, используйте следующую команду:

    +
    docker compose up -d
    +
    +

    Войдите в систему Dify

    Откройте браузер и перейдите на страницу установки Dify, здесь вы можете установить учетную запись администратора:http://localhost/install, а затем войти на главную страницу Dify для дальнейшего использования.

    +

    Для дальнейшего использования и руководства, пожалуйста, обратитесь к документации Dify.

    diff --git a/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.json b/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.json new file mode 100644 index 000000000..20847c9c3 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas deepeval\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from deepeval.metrics import (\n ContextualPrecisionMetric,\n ContextualRecallMetric,\n ContextualRelevancyMetric,\n)\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\ncontextual_precision = ContextualPrecisionMetric()\ncontextual_recall = ContextualRecallMetric()\ncontextual_relevancy = ContextualRelevancyMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[contextual_precision, contextual_recall, contextual_relevancy],\n print_results=False, # Change to True to see detailed metric results\n)\n","from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\nanswer_relevancy = AnswerRelevancyMetric()\nfaithfulness = FaithfulnessMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[answer_relevancy, faithfulness],\n print_results=False, # Change to True to see detailed metric results\n)\n"],"headingContent":"Evaluation with DeepEval","anchorList":[{"label":"Оценка с помощью DeepEval","href":"Evaluation-with-DeepEval","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Определение конвейера RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Запустите конвейер RAG и получите результаты","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Оценка ретривера","href":"Evaluating-Retriever","type":2,"isActive":false},{"label":"Оценка генерации","href":"Evaluating-Generation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.md b/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.md new file mode 100644 index 000000000..8acf75c46 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/evaluation_with_deepeval.md @@ -0,0 +1,434 @@ +--- +id: evaluation_with_deepeval.md +summary: >- + В этом руководстве показано, как использовать DeepEval для оценки конвейера + Retrieval-Augmented Generation (RAG), построенного на базе Milvus. +title: Оценка с помощью DeepEval +--- +

    Оценка с помощью DeepEval

    Open In Colab +GitHub Repository

    +

    Это руководство демонстрирует, как использовать DeepEval для оценки конвейера Retrieval-Augmented Generation (RAG), построенного на базе Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает релевантные документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    DeepEval - это фреймворк, который помогает оценивать конвейеры RAG. Существуют инструменты и фреймворки, которые помогают создавать такие конвейеры, но оценить их и определить количественную производительность может быть непросто. Именно здесь на помощь приходит DeepEval.

    +

    Предварительные условия

    Прежде чем запускать этот блокнот, убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas deepeval
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вам следует подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    Определение конвейера RAG

    Мы определим класс RAG, использующий Milvus в качестве векторного хранилища и OpenAI в качестве LLM. Класс содержит метод load, который загружает текстовые данные в Milvus, метод retrieve, который извлекает наиболее похожие на заданный вопрос текстовые данные, и метод answer, который отвечает на заданный вопрос с помощью извлеченных знаний.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Инициализируем класс RAG с клиентами OpenAI и Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Запустите конвейер RAG и получите результаты

    Мы используем руководство по разработке Milvus в качестве приватного знания в нашем RAG, которое является хорошим источником данных для простого конвейера RAG.

    +

    Скачайте его и загрузите в конвейер RAG.

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:20<00:00,  2.26it/s]
    +
    +

    Определим вопрос запроса о содержании документации руководства по разработке. А затем воспользуемся методом answer, чтобы получить ответ и извлеченные контекстные тексты.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is as follows:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Теперь подготовим несколько вопросов с соответствующими им ответами. Мы получим ответы и контексты из нашего конвейера RAG.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.06s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    вопросконтекстыответобоснованная_истина
    0Что такое спецификация требований к оборудованию...[Требования к аппаратному обеспечению\n\nСледующая специф...Спецификация требований к аппаратному обеспечению для бу...Если вы хотите собрать Milvus и запустить его из источн...
    1Какой язык программирования используется для написа...[CMake & Conan\n\nБиблиотека алгоритмов Mil...Язык программирования, используемый для написания Knowher...Язык программирования, используемый для написания Knowher...
    2Что необходимо убедиться перед запуском кода, покрыв...[Покрытие кода\n\nПеред отправкой вашего pull ...Перед запуском покрытия кода следует убедиться, что...Перед выполнением покрытия кода, вы должны сделать ...
    +
    +

    Оценка ретривера

    При оценке ретривера в системах с большими языковыми моделями (LLM) очень важно оценить следующее:

    +
      +
    1. Релевантность ранжирования: Насколько эффективно ретривер отдает предпочтение релевантной информации перед нерелевантной.

    2. +
    3. Контекстный поиск: Способность улавливать и извлекать контекстуально релевантную информацию на основе входных данных.

    4. +
    5. Баланс: Насколько хорошо ретривер управляет размером текстового фрагмента и объемом поиска, чтобы свести к минимуму нерелевантность.

    6. +
    +

    В совокупности эти факторы дают полное представление о том, как ретривер расставляет приоритеты, захватывает и представляет наиболее полезную информацию.

    +
    from deepeval.metrics import (
    +    ContextualPrecisionMetric,
    +    ContextualRecallMetric,
    +    ContextualRelevancyMetric,
    +)
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +contextual_precision = ContextualPrecisionMetric()
    +contextual_recall = ContextualRecallMetric()
    +contextual_relevancy = ContextualRelevancyMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[contextual_precision, contextual_recall, contextual_relevancy],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/deepeval/__init__.py:49: UserWarning: You are using deepeval version 1.1.6, however version 1.2.2 is available. You should consider upgrading via the "pip install --upgrade deepeval" command.
    +  warnings.warn(
    +
    +
    ✨ Вы используете новейшую метрику контекстной точности DeepEval! (используется gpt-4o, strict=False, async_mode=True)...
    +
    ✨ Вы используете последнюю версию метрики Contextual Recall от DeepEval! (использование gpt-4o, strict=False, async_mode=True)...
    +
    ✨ Вы выполняете последнюю метрику контекстной релевантности DeepEval! (использование gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.91s/test case]
    +
    +
     Тесты завершены 🎉! Запустите 'deepeval login' для просмотра результатов оценки на Confident AI. 
    +‼️ ПРИМЕЧАНИЕ: Вы также можете запустить оценку ВСЕХ метрик deepeval непосредственно на Confident AI.
    +

    Оценка генерации

    Чтобы оценить качество генерируемых результатов в больших языковых моделях (LLM), важно сосредоточиться на двух ключевых аспектах:

    +
      +
    1. Релевантность: Оцените, насколько эффективно подсказка направляет LLM на генерацию полезных и контекстуально подходящих ответов.

    2. +
    3. Верность: Измерьте точность результатов, чтобы убедиться, что модель выдает информацию, которая является фактологически верной и не содержит галлюцинаций или противоречий. Генерируемый контент должен соответствовать фактической информации, предоставленной в контексте поиска.

    4. +
    +

    Все эти факторы в совокупности обеспечивают актуальность и надежность результатов.

    +
    from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +answer_relevancy = AnswerRelevancyMetric()
    +faithfulness = FaithfulnessMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[answer_relevancy, faithfulness],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    ✨ Вы используете новейшую метрику релевантности ответов DeepEval! (использование gpt-4o, strict=False, async_mode=True)...
    +
    ✨ Вы запускаете последнюю метрику верности ответов DeepEval! (использование gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.97s/test case]
    +
    +
     Тесты завершены 🎉! Запустите 'deepeval login' для просмотра результатов оценки на Confident AI. 
    +‼️ ПРИМЕЧАНИЕ: Вы также можете запустить оценку ВСЕХ метрик deepeval непосредственно на Confident AI.
    diff --git a/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.json b/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.json new file mode 100644 index 000000000..5a888b4b5 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas \"arize-phoenix>=4.29.0\" nest_asyncio\n","import os\n\n# os.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","import phoenix as px\nfrom phoenix.trace.openai import OpenAIInstrumentor\n\n# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:\nsession = px.launch_app()\n\n# Initialize OpenAI auto-instrumentation\nOpenAIInstrumentor().instrument()\n","import nest_asyncio\n\nfrom phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals\n\nnest_asyncio.apply() # This is needed for concurrency in notebook environments\n\n# Set your OpenAI API key\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Define your evaluators\nhallucination_evaluator = HallucinationEvaluator(eval_model)\nqa_evaluator = QAEvaluator(eval_model)\n\n# We have to make some minor changes to our dataframe to use the column names expected by our evaluators\n# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'\n# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'\ndf[\"context\"] = df[\"contexts\"]\ndf[\"reference\"] = df[\"contexts\"]\ndf.rename(columns={\"question\": \"input\", \"answer\": \"output\"}, inplace=True)\nassert all(\n column in df.columns for column in [\"output\", \"input\", \"context\", \"reference\"]\n)\n\n# Run the evaluators, each evaluator will return a dataframe with evaluation results\n# We upload the evaluation results to Phoenix in the next step\nhallucination_eval_df, qa_eval_df = run_evals(\n dataframe=df,\n evaluators=[hallucination_evaluator, qa_evaluator],\n provide_explanation=True,\n)\n","results_df = df.copy()\nresults_df[\"hallucination_eval\"] = hallucination_eval_df[\"label\"]\nresults_df[\"hallucination_explanation\"] = hallucination_eval_df[\"explanation\"]\nresults_df[\"qa_eval\"] = qa_eval_df[\"label\"]\nresults_df[\"qa_explanation\"] = qa_eval_df[\"explanation\"]\nresults_df.head()\n"],"headingContent":"Evaluation with Arize Pheonix","anchorList":[{"label":"Оценка с помощью Arize Pheonix","href":"Evaluation-with-Arize-Pheonix","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Определение конвейера RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Запустите конвейер RAG и получите результаты","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Оценка с помощью Arize Phoenix","href":"Evaluation-with-Arize-Phoenix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.md b/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.md new file mode 100644 index 000000000..fd7787a2e --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/evaluation_with_phoenix.md @@ -0,0 +1,474 @@ +--- +id: evaluation_with_phoenix.md +summary: >- + В этом руководстве показано, как использовать Arize Pheonix для оценки + конвейера Retrieval-Augmented Generation (RAG), построенного на базе Milvus. +title: Оценка с помощью Arize Pheonix +--- +

    Оценка с помощью Arize Pheonix

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как использовать Arize Pheonix для оценки конвейера Retrieval-Augmented Generation (RAG), построенного на базе Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает релевантные документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    Arize Pheonix - это фреймворк, который помогает оценить конвейеры RAG. Существуют инструменты и фреймворки, которые помогают создавать такие конвейеры, но оценить их и определить количественную производительность может быть непросто. Именно здесь на помощь приходит Arize Pheonix.

    +

    Предварительные условия

    Прежде чем запускать этот блокнот, убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas "arize-phoenix>=4.29.0" nest_asyncio
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +# os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    Определение конвейера RAG

    Мы определим класс RAG, использующий Milvus в качестве векторного хранилища и OpenAI в качестве LLM. Класс содержит метод load, который загружает текстовые данные в Milvus, метод retrieve, который извлекает наиболее похожие на заданный вопрос текстовые данные, и метод answer, который отвечает на заданный вопрос с помощью извлеченных знаний.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Инициализируем класс RAG с клиентами OpenAI и Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Запустите конвейер RAG и получите результаты

    Мы используем руководство по разработке Milvus в качестве приватного знания в нашем RAG, которое является хорошим источником данных для простого конвейера RAG.

    +

    Скачайте его и загрузите в конвейер RAG.

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:12<00:00,  3.84it/s]
    +
    +

    Определим вопрос запроса о содержании документации руководства по разработке. А затем воспользуемся методом answer, чтобы получить ответ и извлеченные контекстные тексты.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code are:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Теперь подготовим несколько вопросов с соответствующими им ответами. Мы получим ответы и контексты из нашего конвейера RAG.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.04s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    вопросконтекстыответобоснованная_истина
    0Что такое спецификация требований к оборудованию...[Требования к аппаратному обеспечению\n\nСледующая специф...Спецификация требований к аппаратному обеспечению для бу...Если вы хотите собрать Milvus и запустить его из источн...
    1Какой язык программирования используется для написа...[CMake & Conan\n\nБиблиотека алгоритмов Mil...Язык программирования, используемый для написания Knowher...Язык программирования, используемый для написания Knowher...
    2Что необходимо убедиться перед запуском кода, покрыв...[Покрытие кода\n\nПеред отправкой вашего pull ...Перед запуском покрытия кода следует убедиться, что...Перед выполнением покрытия кода необходимо сделать ...
    +
    +

    Оценка с помощью Arize Phoenix

    Мы используем Arize Phoenix для оценки нашего конвейера поиска-дополнения (RAG), фокусируясь на двух ключевых метриках:

    +
      +
    • Оценка галлюцинаций: Определяет, является ли содержимое фактическим или галлюцинаторным (информация, не основанная на контексте), обеспечивая целостность данных.

      +
        +
      • Объяснение галлюцинации: Объясняет, почему ответ является фактическим или нет.
      • +
    • +
    • Оценка качества: Оценивает точность ответов модели на входные запросы.

      +
        +
      • Объяснение QA: Подробно объясняет, почему ответ является правильным или неправильным.
      • +
    • +
    +

    Обзор трассировки Phoenix

    Phoenix обеспечивает OTEL-совместимую трассировку для LLM-приложений, с интеграцией таких фреймворков, как Langchain, LlamaIndex, и SDK, таких как OpenAI и Mistral. Трассировка фиксирует весь поток запросов, позволяя понять следующее:

    +
      +
    • Латентность приложений: Выявление и оптимизация медленных вызовов LLM и производительности компонентов.
    • +
    • Использование токенов: Разбивка потребления токенов для оптимизации затрат.
    • +
    • Исключения времени выполнения: Выявление критических проблем, таких как ограничение скорости.
    • +
    • Извлеченные документы: Анализ поиска документов, их количества и порядка.
    • +
    +

    Используя трассировку Phoenix, вы сможете выявить узкие места, оптимизировать ресурсы и обеспечить надежность системы на различных платформах и языках.

    +
    import phoenix as px
    +from phoenix.trace.openai import OpenAIInstrumentor
    +
    +# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:
    +session = px.launch_app()
    +
    +# Initialize OpenAI auto-instrumentation
    +OpenAIInstrumentor().instrument()
    +
    +
    🌍 To view the Phoenix app in your browser, visit http://localhost:6006/
    +📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix
    +
    +

    + + Alt Text + Alt-текст

    +
    import nest_asyncio
    +
    +from phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals
    +
    +nest_asyncio.apply()  # This is needed for concurrency in notebook environments
    +
    +# Set your OpenAI API key
    +eval_model = OpenAIModel(model="gpt-4o")
    +
    +# Define your evaluators
    +hallucination_evaluator = HallucinationEvaluator(eval_model)
    +qa_evaluator = QAEvaluator(eval_model)
    +
    +# We have to make some minor changes to our dataframe to use the column names expected by our evaluators
    +# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'
    +# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'
    +df["context"] = df["contexts"]
    +df["reference"] = df["contexts"]
    +df.rename(columns={"question": "input", "answer": "output"}, inplace=True)
    +assert all(
    +    column in df.columns for column in ["output", "input", "context", "reference"]
    +)
    +
    +# Run the evaluators, each evaluator will return a dataframe with evaluation results
    +# We upload the evaluation results to Phoenix in the next step
    +hallucination_eval_df, qa_eval_df = run_evals(
    +    dataframe=df,
    +    evaluators=[hallucination_evaluator, qa_evaluator],
    +    provide_explanation=True,
    +)
    +
    +
    run_evals |██████████| 6/6 (100.0%) | ⏳ 00:03<00:00 |  1.64it/s
    +
    +
    results_df = df.copy()
    +results_df["hallucination_eval"] = hallucination_eval_df["label"]
    +results_df["hallucination_explanation"] = hallucination_eval_df["explanation"]
    +results_df["qa_eval"] = qa_eval_df["label"]
    +results_df["qa_explanation"] = qa_eval_df["explanation"]
    +results_df.head()
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    inputконтекстывыходground_truthконтекстссылкагаллюцинация_выводгаллюцинация_объяснениеqa_evalqa_explanation
    0что такое спецификация требований к оборудованию...[Требования к аппаратному обеспечению\n\nСледующая специф...Спецификация требований к аппаратному обеспечению для бу...Если вы хотите собрать Milvus и запустить его из источн...[Требования к аппаратному обеспечению\n\nСледующая специф...[Требования к аппаратному обеспечению\n\nСледующая специф...фактическийЧтобы определить, является ли ответ фактическим или галлю...правильныйЧтобы определить, является ли ответ правильным, нам нужно...
    1Какой язык программирования используется для написания...[CMake & Conan\n\nБиблиотека алгоритмов Mil...Язык программирования, используемый для написания Knowher...Язык программирования, используемый для написания Knowher...[CMake & Conan\n\nБиблиотека алгоритмов Mil...[CMake & Conan\n\nБиблиотека алгоритмов Mil...фактическийЧтобы определить, является ли ответ фактическим или галлю...правильныйЧтобы определить, является ли ответ правильным, нам нужно...
    2Что необходимо обеспечить перед запуском проверки покрытия кода...[Покрытие кода\n\nПеред отправкой вашего pull ...Перед запуском покрытия кода следует убедиться, что...Перед выполнением покрытия кода необходимо сделать ...[Code coverage\n\nBefore submitting your pull ...[Code coverage\n\nBefore submitting your pull ...ФактВ справочном тексте указано, что перед выполнением...правильныйЧтобы определить, верен ли ответ, нам нужно...
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.json b/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.json new file mode 100644 index 000000000..1b829c1ca --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.json @@ -0,0 +1 @@ +{"codeList":["pip install streamlit pymilvus openai\n","import streamlit as st\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n # TODO check for related support cases and articles\n st.write(\"Submitted!\")\n","streamlit run basic_support_form.py\n","import streamlit as st\nimport os\nimport pymilvus\nimport openai\n\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem?\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n import os\n import pymilvus\n import openai\n\n org_id = 360033549136 # TODO Load from customer login data\n\n pymilvus.connections.connect(uri=os.environ[\"MILVUS_URL\"], token=os.environ[\"MILVUS_TOKEN\"])\n collection = pymilvus.Collection(\"zendesk\")\n\n embedding = openai.Embedding.create(input=text_val, model=\"text-embedding-ada-002\")['data'][0]['embedding']\n\n results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=2, output_fields=[\"_id\", \"subject\", \"description\"], expr=f'status == \"new\" and organization_id == {org_id}')\n\n st.write(results[0])\n if len(results[0]) > 0 and results[0].distances[0] < 0.35:\n matching_ticket = results[0][0].entity\n st.write(f\"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before\")\n else:\n st.write(\"Submitted!\")\n \n","export MILVUS_TOKEN=...\nexport MILVUS_URL=https://...\nexport OPENAI_API_KEY=sk-...\n\nstreamlit run app.py\n"," ......\n \n else:\n # TODO Actually send out the ticket\n st.write(\"Submitted!\")\n article_results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=5, output_fields=[\"title\", \"html_url\"], expr=f'_ab_stream == \"articles\"')\n st.write(article_results[0])\n if len(article_results[0]) > 0:\n st.write(\"We also found some articles that might help you:\")\n for hit in article_results[0]:\n if hit.distance < 0.362:\n st.write(f\"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})\")\n\n"],"headingContent":"Airbyte: Open-Source Data Movement Infrastructure","anchorList":[{"label":"Airbyte: Инфраструктура перемещения данных с открытым исходным кодом","href":"Airbyte-Open-Source-Data-Movement-Infrastructure","type":1,"isActive":false},{"label":"Основные компоненты Airbyte","href":"Major-Components-of-Airbyte","type":2,"isActive":false},{"label":"Прежде чем начать","href":"Before-You-Begin","type":2,"isActive":false},{"label":"Настройка кластера Milvus","href":"Set-Up-Milvus-Cluster","type":2,"isActive":false},{"label":"Настройка соединения в Airbyte","href":"Set-Up-Connection-in-Airbyte","type":2,"isActive":false},{"label":"Создание приложения Streamlit для запроса коллекции","href":"Build-Streamlit-app-querying-the-collection","type":2,"isActive":false},{"label":"Заключение","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.md b/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.md new file mode 100644 index 000000000..b0f47ef74 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_airbyte.md @@ -0,0 +1,248 @@ +--- +id: integrate_with_airbyte.md +summary: >- + Airbyte - это инфраструктура перемещения данных с открытым исходным кодом для + создания конвейеров извлечения и загрузки данных (EL). Она отличается + универсальностью, масштабируемостью и простотой использования. Каталог + коннекторов Airbyte поставляется "из коробки" с более чем 350 предварительно + созданными коннекторами. С помощью этих коннекторов можно запустить репликацию + данных из источника в пункт назначения всего за несколько минут. +title: 'Airbyte: Инфраструктура перемещения данных с открытым исходным кодом' +--- +

    Airbyte: Инфраструктура перемещения данных с открытым исходным кодом

    Airbyte - это инфраструктура перемещения данных с открытым исходным кодом для создания конвейеров извлечения и загрузки данных (EL). Она разработана для обеспечения универсальности, масштабируемости и простоты использования. Каталог коннекторов Airbyte поставляется "из коробки" с более чем 350 предварительно созданными коннекторами. С помощью этих коннекторов можно запустить репликацию данных из источника в пункт назначения всего за несколько минут.

    +

    Основные компоненты Airbyte

    1. Каталог коннекторов

      +
    • 350+ готовых коннекторов: Каталог коннекторов Airbyte поставляется "из коробки" с более чем 350 готовыми коннекторами. Эти коннекторы можно использовать, чтобы начать репликацию данных из источника в пункт назначения всего за несколько минут.
    • +
    • No-Code Connector Builder: Вы можете легко расширить функциональность Airbyte для поддержки ваших пользовательских сценариев использования с помощью таких инструментов, как No-Code Connector Builder.
    • +
    +

    2. Платформа

    Платформа Airbyte предоставляет все горизонтальные сервисы, необходимые для настройки и масштабирования операций по перемещению данных, и может быть как облачной, так и самоуправляемой.

    +

    3. Пользовательский интерфейс

    Airbyte имеет пользовательский интерфейс, библиотеку PyAirbyte (Python), API и Terraform Provider для интеграции с предпочитаемыми вами инструментами и подходами к управлению инфраструктурой.

    +

    Благодаря возможностям Airbyte пользователи могут интегрировать источники данных в кластер Milvus для поиска по сходству.

    +

    Прежде чем начать

    Вам понадобятся:

    +
      +
    • учетная запись Zendesk (или другой источник данных, с которым вы хотите синхронизировать данные)
    • +
    • учетная запись Airbyte или локальный экземпляр
    • +
    • API-ключ OpenAI
    • +
    • Кластер Milvus
    • +
    • Python 3.10, установленный локально
    • +
    +

    Настройка кластера Milvus

    Если вы уже развернули кластер K8s для производства, вы можете пропустить этот шаг и перейти непосредственно к развертыванию Milvus Operator. В противном случае вы можете выполнить шаги по развертыванию кластера Milvus с помощью Milvus Operator.

    +

    Отдельные сущности (в нашем случае это тикеты поддержки и статьи базы знаний) хранятся в "коллекции" - после настройки кластера вам нужно создать коллекцию. Выберите подходящее имя и установите значение Dimension равным 1536, чтобы соответствовать размерности вектора, генерируемого сервисом встраивания OpenAI.

    +

    После создания запишите информацию о конечной точке и аутентификации.

    +

    Настройка соединения в Airbyte

    Наша база данных готова, давайте перенесем туда данные! Для этого нам нужно настроить соединение в Airbyte. Либо зарегистрируйте облачный аккаунт Airbyte на cloud.airbyte.com, либо запустите локальный экземпляр, как описано в документации.

    +

    Настройка источника

    После того как ваш экземпляр запущен, нам нужно настроить соединение - нажмите "Новое соединение" и выберите коннектор "Zendesk Support" в качестве источника. После нажатия кнопки "Проверить и сохранить" Airbyte проверит, может ли быть установлено соединение.

    +

    В облаке Airbyte вы можете легко пройти аутентификацию, нажав кнопку Authenticate. При использовании локального экземпляра Airbyte следуйте инструкциям, описанным на странице документации.

    +

    Настройка пункта назначения

    Если все работает правильно, следующим шагом будет настройка места назначения для перемещения данных. Здесь выберите коннектор "Milvus".

    +

    Коннектор Milvus выполняет три задачи:

    +
      +
    • Разбивка и форматирование - Разбивает записи Zendesk на текст и метаданные. Если размер текста превышает заданный размер чанка, записи разбиваются на несколько частей, которые загружаются в коллекцию по отдельности. Разбивка текста (или чанкинг) может, например, происходить в случае больших тикетов поддержки или статей знаний. Разбив текст на части, можно добиться того, что поиск всегда будет приносить полезные результаты.
    • +
    +

    Возьмем размер фрагмента в 1000 лексем и текстовые поля body, title, description и subject, поскольку именно они будут присутствовать в данных, которые мы получим из Zendesk.

    +
      +
    • Встраивание - с помощью моделей машинного обучения текстовые фрагменты, полученные в результате обработки, преобразуются в векторные вкрапления, которые затем можно искать на предмет семантического сходства. Для создания вкраплений необходимо предоставить ключ OpenAI API. Airbyte отправит каждый чанк в OpenAI и добавит полученный вектор к сущностям, загруженным в ваш кластер Milvus.
    • +
    • Индексирование - После того как вы векторизировали чанки, вы можете загрузить их в базу данных. Для этого вставьте информацию, которую вы получили при настройке кластера и коллекции в кластере Milvus.
      Нажав кнопку "Проверить и сохранить", вы проверите, все ли правильно выстроено (правильные учетные данные, коллекция существует и имеет ту же векторную размерность, что и настроенное вложение, и т. д.).
    • +
    +

    Настройка потока синхронизации

    Последний шаг перед тем, как данные будут готовы к потоку, - выбор "потоков" для синхронизации. Поток - это коллекция записей в источнике. Поскольку Zendesk поддерживает большое количество потоков, которые не имеют отношения к нашему случаю использования, давайте выберем только "билеты" и "статьи" и отключим все остальные, чтобы сэкономить полосу пропускания и убедиться, что в поиске будет отображаться только релевантная информация:

    Вы можете выбрать, какие поля извлекать из источника, щелкнув название потока. Режим синхронизации "Инкрементный | Append + Deduped" означает, что при последующих запусках соединения Zendesk и Milvus синхронизируются, передавая минимум данных (только те статьи и билеты, которые изменились с момента последнего запуска).

    +

    Как только соединение будет установлено, Airbyte начнет синхронизацию данных. Их появление в коллекции Milvus может занять несколько минут.

    +

    Если вы выберете частоту репликации, Airbyte будет запускаться регулярно, чтобы поддерживать коллекцию Milvus в актуальном состоянии с учетом изменений в статьях Zendesk и вновь созданных проблемах.

    +

    Поток проверок

    Вы можете проверить в пользовательском интерфейсе кластера Milvus, как структурированы данные в коллекции, перейдя на игровую площадку и выполнив запрос "Query Data" с фильтром, установленным на "_ab_stream == \"tickets\"".

    Как вы можете видеть в представлении "Результат", каждая запись, полученная из Zendesk, хранится в Milvus как отдельная сущность со всеми указанными метаданными. Текстовый фрагмент, на котором основано встраивание, показан как свойство "text" - это текст, который был вложен с помощью OpenAI и по которому мы будем искать.

    +

    Создание приложения Streamlit для запроса коллекции

    Наши данные готовы - теперь нам нужно создать приложение для их использования. В данном случае приложение будет представлять собой простую форму поддержки, в которую пользователи могут отправлять заявки. Когда пользователь нажмет кнопку "Отправить", мы сделаем две вещи:

    +
      +
    • поиск похожих заявок, поданных пользователями той же организации
    • +
    • Поиск статей, основанных на знаниях, которые могут быть релевантны пользователю.
    • +
    +

    В обоих случаях мы будем использовать семантический поиск с помощью вкраплений OpenAI. Для этого описание проблемы, введенное пользователем, также встраивается и используется для извлечения похожих сущностей из кластера Milvus. Если есть соответствующие результаты, они отображаются под формой.

    +

    Настройка среды пользовательского интерфейса

    Вам понадобится локальная установка Python, так как мы будем использовать Streamlit для реализации приложения.

    +

    Сначала установите Streamlit, клиентскую библиотеку Milvus и клиентскую библиотеку OpenAI локально:

    +
    pip install streamlit pymilvus openai
    +
    +

    Чтобы отобразить базовую форму поддержки, создайте python-файл basic_support_form.py:

    +
    import streamlit as st
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        # TODO check for related support cases and articles
    +        st.write("Submitted!")
    +
    +

    Чтобы запустить приложение, используйте Streamlit run:

    +
    streamlit run basic_support_form.py
    +
    +

    Это приведет к отрисовке базовой формы:

    Код для этого примера также можно найти на GitHub.

    +

    Настройка службы запросов бэкенда

    Далее проверим существующие открытые тикеты, которые могут быть релевантны. Для этого мы внедрили текст, введенный пользователем с помощью OpenAI, затем выполнили поиск по сходству в нашей коллекции, отфильтровав все еще открытые билеты. Если найдется такой, в котором расстояние между введенным тикетом и существующим очень мало, сообщите об этом пользователю и не отправляйте:

    +
    import streamlit as st
    +import os
    +import pymilvus
    +import openai
    +
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem?")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        import os
    +        import pymilvus
    +        import openai
    +
    +        org_id = 360033549136 # TODO Load from customer login data
    +
    +        pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
    +        collection = pymilvus.Collection("zendesk")
    +
    +        embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
    +
    +        results = collection.search(data=[embedding], anns_field="vector", param={}, limit=2, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
    +
    +        st.write(results[0])
    +        if len(results[0]) > 0 and results[0].distances[0] < 0.35:
    +            matching_ticket = results[0][0].entity
    +            st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
    +        else:
    +            st.write("Submitted!")
    +            
    +
    +

    Здесь происходит несколько вещей:

    +
      +
    • Устанавливается соединение с кластером Milvus.
    • +
    • Используется сервис OpenAI для создания вставки описания, введенного пользователем.
    • +
    • Выполняется поиск сходства, фильтруя результаты по статусу тикета и идентификатору организации (поскольку релевантными являются только открытые тикеты одной организации).
    • +
    • Если есть результаты и расстояние между векторами вкраплений существующего тикета и вновь введенного текста ниже определенного порога, об этом сообщается.
    • +
    +

    Чтобы запустить новое приложение, необходимо сначала установить переменные окружения для OpenAI и Milvus:

    +
    export MILVUS_TOKEN=...
    +export MILVUS_URL=https://...
    +export OPENAI_API_KEY=sk-...
    +
    +streamlit run app.py
    +
    +

    При попытке отправить билет, который уже существует, результат будет выглядеть так:

    Код этого примера также можно найти на GitHub.

    +

    Показывать больше релевантной информации

    Как видно из зеленого отладочного вывода, скрытого в финальной версии, два тикета соответствовали нашему поиску (в статусе new, от текущей организации и близко к вектору встраивания). Однако первый из них (релевантный) ранжировался выше, чем второй (нерелевантный в данной ситуации), что отражается в меньшем значении расстояния. Эта связь фиксируется в векторах встраивания без прямого сопоставления слов, как при обычном полнотекстовом поиске.

    +

    В заключение давайте покажем полезную информацию после отправки билета, чтобы предоставить пользователю как можно больше релевантной информации.

    +

    Для этого мы выполним второй поиск после отправки тикета, чтобы получить наиболее подходящие статьи базы знаний:

    +
       ......
    +   
    +        else:
    +            # TODO Actually send out the ticket
    +            st.write("Submitted!")
    +            article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
    +            st.write(article_results[0])
    +            if len(article_results[0]) > 0:
    +                st.write("We also found some articles that might help you:")
    +                for hit in article_results[0]:
    +                    if hit.distance < 0.362:
    +                        st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
    +
    +
    +

    Если нет открытого тикета поддержки с высоким показателем сходства, новый тикет отправляется, а соответствующие статьи базы знаний отображаются ниже:

    Код этого примера также можно найти на Github.

    +

    Заключение

    Хотя представленный здесь пользовательский интерфейс - это не настоящая форма поддержки, а пример, иллюстрирующий вариант использования, сочетание Airbyte и Milvus очень мощное - оно позволяет легко загружать текст из самых разных источников (от баз данных типа Postgres, API типа Zendesk или GitHub до полностью пользовательских источников, созданных с помощью SDK или визуального конструктора коннекторов Airbyte) и индексировать его во встроенном виде в Milvus, мощной векторной поисковой системе, способной масштабироваться до огромных объемов данных.

    +

    Airbyte и Milvus имеют открытый исходный код и совершенно бесплатны для использования в вашей инфраструктуре, при желании можно воспользоваться облачными предложениями для разгрузки операций.

    +

    Помимо классического варианта использования семантического поиска, описанного в этой статье, общая схема может быть использована для создания чат-бота, отвечающего на вопросы по методу RAG (Retrieval Augmented Generation), рекомендательных систем или для повышения релевантности и эффективности рекламы.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.json b/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.json new file mode 100644 index 000000000..b49f54812 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus bentoml\n","import bentoml\n\nBENTO_EMBEDDING_MODEL_END_POINT = \"BENTO_EMBEDDING_MODEL_END_POINT\"\nBENTO_API_TOKEN = \"BENTO_API_TOKEN\"\n\nembedding_client = bentoml.SyncHTTPClient(\n BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN\n)\n","# naively chunk on newlines\ndef chunk_text(filename: str) -> list:\n with open(filename, \"r\") as f:\n text = f.read()\n sentences = text.split(\"\\n\")\n return sentences\n","import os\nimport requests\nimport urllib.request\n\n# set up the data source\nrepo = \"ytang07/bento_octo_milvus_RAG\"\ndirectory = \"data\"\nsave_dir = \"./city_data\"\napi_url = f\"https://api.github.com/repos/{repo}/contents/{directory}\"\n\n\nresponse = requests.get(api_url)\ndata = response.json()\n\nif not os.path.exists(save_dir):\n os.makedirs(save_dir)\n\nfor item in data:\n if item[\"type\"] == \"file\":\n file_url = item[\"download_url\"]\n file_path = os.path.join(save_dir, item[\"name\"])\n urllib.request.urlretrieve(file_url, file_path)\n","# please upload your data directory under this file's folder\ncities = os.listdir(\"city_data\")\n# store chunked text for each of the cities in a list of dicts\ncity_chunks = []\nfor city in cities:\n chunked = chunk_text(f\"city_data/{city}\")\n cleaned = []\n for chunk in chunked:\n if len(chunk) > 7:\n cleaned.append(chunk)\n mapped = {\"city_name\": city.split(\".\")[0], \"chunks\": cleaned}\n city_chunks.append(mapped)\n","def get_embeddings(texts: list) -> list:\n if len(texts) > 25:\n splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]\n embeddings = []\n for split in splits:\n embedding_split = embedding_client.encode(sentences=split)\n embeddings += embedding_split\n return embeddings\n return embedding_client.encode(\n sentences=texts,\n )\n","entries = []\nfor city_dict in city_chunks:\n # No need for the embeddings list if get_embeddings already returns a list of lists\n embedding_list = get_embeddings(city_dict[\"chunks\"]) # returns a list of lists\n # Now match texts with embeddings and city name\n for i, embedding in enumerate(embedding_list):\n entry = {\n \"embedding\": embedding,\n \"sentence\": city_dict[\"chunks\"][\n i\n ], # Assume \"chunks\" has the corresponding texts for the embeddings\n \"city\": city_dict[\"city_name\"],\n }\n entries.append(entry)\n print(entries)\n","from pymilvus import MilvusClient\n\nCOLLECTION_NAME = \"Bento_Milvus_RAG\" # random name for your collection\nDIMENSION = 384\n\n# Initialize a Milvus Lite client\nmilvus_client = MilvusClient(\"milvus_demo.db\")\n","from pymilvus import connections\n\nconnections.connect(uri=\"milvus_demo.db\")\n","from pymilvus import MilvusClient, DataType, Collection\n\n# Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n)\n\n# 3.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# prepare index parameters\nindex_params = milvus_client.prepare_index_params()\n\n# add index\nindex_params.add_index(\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n\n# create collection\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME, schema=schema, index_params=index_params\n)\n\n# Outside the loop, now you upsert all the entries at once\nmilvus_client.insert(collection_name=COLLECTION_NAME, data=entries)\n","BENTO_LLM_END_POINT = \"BENTO_LLM_END_POINT\"\n\nllm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)\n","def dorag(question: str, context: str):\n\n prompt = (\n f\"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \\n\"\n f\"The user question is {question}\"\n )\n\n results = llm_client.generate(\n max_tokens=1024,\n prompt=prompt,\n )\n\n res = \"\"\n for result in results:\n res += result\n\n return res\n","question = \"What state is Cambridge in?\"\n\n\ndef ask_a_question(question):\n embeddings = get_embeddings([question])\n res = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=embeddings, # search for the one (1) embedding returned as a list of lists\n anns_field=\"embedding\", # Search across embeddings\n limit=5, # get me the top 5 results\n output_fields=[\"sentence\"], # get the sentence/chunk and city\n )\n\n sentences = []\n for hits in res:\n for hit in hits:\n print(hit)\n sentences.append(hit[\"entity\"][\"sentence\"])\n context = \". \".join(sentences)\n return context\n\n\ncontext = ask_a_question(question=question)\nprint(context)\n","print(dorag(question=question, context=context))\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and BentoML","anchorList":[{"label":"Генерация с дополнением к поиску (RAG) с помощью Milvus и BentoML","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-BentoML","type":1,"isActive":false},{"label":"Введение","href":"Introduction","type":2,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":2,"isActive":false},{"label":"Обслуживание вкраплений с помощью BentoML/BentoCloud","href":"Serving-Embeddings-with-BentoMLBentoCloud","type":2,"isActive":false},{"label":"Вставка данных в векторную базу данных для извлечения","href":"Inserting-Data-into-a-Vector-Database-for-Retrieval","type":2,"isActive":false},{"label":"Создание коллекции Milvus Lite","href":"Creating-Your-Milvus-Lite-Collection","type":2,"isActive":false},{"label":"Настройка LLM для RAG","href":"Set-up-Your-LLM-for-RAG","type":2,"isActive":false},{"label":"Инструкции LLM","href":"LLM-Instructions","type":2,"isActive":false},{"label":"Пример RAG","href":"A-RAG-Example","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.md b/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.md new file mode 100644 index 000000000..184cd534e --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_bentoml.md @@ -0,0 +1,351 @@ +--- +id: integrate_with_bentoml.md +summary: >- + В этом руководстве показано, как использовать открытую модель встраивания и + крупноязычную модель на BentoCloud с векторной базой данных Milvus для + создания приложения Retrieval Augmented Generation (RAG). +title: Генерация с дополнением к поиску (RAG) с помощью Milvus и BentoML +--- +

    Генерация с дополнением к поиску (RAG) с помощью Milvus и BentoML

    Open In Colab +GitHub Repository

    +

    Введение

    В этом руководстве показано, как использовать открытую модель встраивания и крупноязычную модель на BentoCloud с векторной базой данных Milvus для создания приложения RAG (Retrieval Augmented Generation). BentoCloud - это платформа AI Inference Platform для быстро развивающихся команд ИИ, предлагающая полностью управляемую инфраструктуру, предназначенную для вывода моделей. Она работает в сочетании с BentoML, фреймворком для обслуживания моделей с открытым исходным кодом, чтобы облегчить создание и развертывание высокопроизводительных модельных сервисов. В этой демонстрации мы используем Milvus Lite в качестве базы данных векторов - это облегченная версия Milvus, которая может быть встроена в ваше приложение на Python.

    +

    Прежде чем начать

    Milvus Lite доступен на PyPI. Вы можете установить его через pip для Python 3.8+:

    +
    $ pip install -U pymilvus bentoml
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    После входа в BentoCloud мы можем взаимодействовать с развернутыми сервисами BentoCloud Services в Deployments, а соответствующий END_POINT и API находятся в Playground -> Python. Данные о городе можно скачать здесь.

    +

    Обслуживание вкраплений с помощью BentoML/BentoCloud

    Чтобы использовать эту конечную точку, импортируйте bentoml и настройте HTTP-клиент, используя SyncHTTPClient, указав конечную точку и, опционально, токен (если вы включите Endpoint Authorization в BentoCloud). В качестве альтернативы можно использовать ту же модель, обслуживаемую через BentoML, используя его репозиторий Sentence Transformers Embeddings.

    +
    import bentoml
    +
    +BENTO_EMBEDDING_MODEL_END_POINT = "BENTO_EMBEDDING_MODEL_END_POINT"
    +BENTO_API_TOKEN = "BENTO_API_TOKEN"
    +
    +embedding_client = bentoml.SyncHTTPClient(
    +    BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN
    +)
    +
    +

    После подключения к embedding_client нам нужно обработать наши данные. Мы предоставили несколько функций для выполнения разбиения и встраивания данных.

    +

    Чтение файлов и предварительная обработка текста в список строк.

    +
    # naively chunk on newlines
    +def chunk_text(filename: str) -> list:
    +    with open(filename, "r") as f:
    +        text = f.read()
    +    sentences = text.split("\n")
    +    return sentences
    +
    +

    Сначала нам нужно загрузить данные о городе.

    +
    import os
    +import requests
    +import urllib.request
    +
    +# set up the data source
    +repo = "ytang07/bento_octo_milvus_RAG"
    +directory = "data"
    +save_dir = "./city_data"
    +api_url = f"https://api.github.com/repos/{repo}/contents/{directory}"
    +
    +
    +response = requests.get(api_url)
    +data = response.json()
    +
    +if not os.path.exists(save_dir):
    +    os.makedirs(save_dir)
    +
    +for item in data:
    +    if item["type"] == "file":
    +        file_url = item["download_url"]
    +        file_path = os.path.join(save_dir, item["name"])
    +        urllib.request.urlretrieve(file_url, file_path)
    +
    +

    Затем мы обработаем каждый из имеющихся файлов.

    +
    # please upload your data directory under this file's folder
    +cities = os.listdir("city_data")
    +# store chunked text for each of the cities in a list of dicts
    +city_chunks = []
    +for city in cities:
    +    chunked = chunk_text(f"city_data/{city}")
    +    cleaned = []
    +    for chunk in chunked:
    +        if len(chunk) > 7:
    +            cleaned.append(chunk)
    +    mapped = {"city_name": city.split(".")[0], "chunks": cleaned}
    +    city_chunks.append(mapped)
    +
    +

    Разбивает список строк на список вкраплений, в каждом из которых сгруппировано 25 текстовых строк.

    +
    def get_embeddings(texts: list) -> list:
    +    if len(texts) > 25:
    +        splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]
    +        embeddings = []
    +        for split in splits:
    +            embedding_split = embedding_client.encode(sentences=split)
    +            embeddings += embedding_split
    +        return embeddings
    +    return embedding_client.encode(
    +        sentences=texts,
    +    )
    +
    +

    Теперь нам нужно сопоставить вкрапления и текстовые фрагменты. Поскольку список вкраплений и список предложений должны совпадать по индексу, мы можем пройтись по enumerate по любому из этих списков, чтобы сопоставить их.

    +
    entries = []
    +for city_dict in city_chunks:
    +    # No need for the embeddings list if get_embeddings already returns a list of lists
    +    embedding_list = get_embeddings(city_dict["chunks"])  # returns a list of lists
    +    # Now match texts with embeddings and city name
    +    for i, embedding in enumerate(embedding_list):
    +        entry = {
    +            "embedding": embedding,
    +            "sentence": city_dict["chunks"][
    +                i
    +            ],  # Assume "chunks" has the corresponding texts for the embeddings
    +            "city": city_dict["city_name"],
    +        }
    +        entries.append(entry)
    +    print(entries)
    +
    +

    Вставка данных в векторную базу данных для извлечения

    Подготовив вкрапления и данные, мы можем вставить векторы вместе с метаданными в Milvus Lite для последующего поиска векторов. Первый шаг в этом разделе - запуск клиента для подключения к Milvus Lite. Мы просто импортируем модуль MilvusClient и инициализируем клиент Milvus Lite, который подключается к вашей векторной базе данных Milvus Lite. Размерность определяется размером модели встраивания, например, модель Sentence Transformer all-MiniLM-L6-v2 создает векторы размером 384.

    +
    from pymilvus import MilvusClient
    +
    +COLLECTION_NAME = "Bento_Milvus_RAG"  # random name for your collection
    +DIMENSION = 384
    +
    +# Initialize a Milvus Lite client
    +milvus_client = MilvusClient("milvus_demo.db")
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Или с помощью старого API connections.connect (не рекомендуется):

    +
    from pymilvus import connections
    +
    +connections.connect(uri="milvus_demo.db")
    +
    +

    Создание коллекции Milvus Lite

    Создание коллекции с помощью Milvus Lite включает в себя два этапа: во-первых, определение схемы, а во-вторых, определение индекса. Для этого раздела нам понадобится один модуль: DataType, который указывает нам, какой тип данных будет находиться в поле. Также нам понадобятся две функции для создания схемы и добавления полей. create_schema(): создает схему коллекции, add_field(): добавляет поле в схему коллекции.

    +
    from pymilvus import MilvusClient, DataType, Collection
    +
    +# Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +)
    +
    +# 3.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    Теперь, когда мы создали схему и успешно определили поле данных, нам нужно определить индекс. С точки зрения поиска, "индекс" определяет, как мы собираемся отображать наши данные для поиска. Для этого проекта мы используем стандартный вариант AUTOINDEX для индексации данных.

    +

    Далее мы создаем коллекцию с заданными ранее именем, схемой и индексом. Наконец, мы вставляем обработанные ранее данные.

    +
    # prepare index parameters
    +index_params = milvus_client.prepare_index_params()
    +
    +# add index
    +index_params.add_index(
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +# create collection
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME, schema=schema, index_params=index_params
    +)
    +
    +# Outside the loop, now you upsert all the entries at once
    +milvus_client.insert(collection_name=COLLECTION_NAME, data=entries)
    +
    +

    Настройка LLM для RAG

    Чтобы создать приложение RAG, нам нужно развернуть LLM на BentoCloud. Давайте воспользуемся последней версией Llama3 LLM. Как только он будет запущен, просто скопируйте конечную точку и токен этого модельного сервиса и настройте для него клиента.

    +
    BENTO_LLM_END_POINT = "BENTO_LLM_END_POINT"
    +
    +llm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)
    +
    +

    Инструкции LLM

    Теперь мы настроим инструкции LLM с подсказкой, контекстом и вопросом. Вот функция, которая ведет себя как LLM и возвращает вывод от клиента в строковом формате.

    +
    def dorag(question: str, context: str):
    +
    +    prompt = (
    +        f"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \n"
    +        f"The user question is {question}"
    +    )
    +
    +    results = llm_client.generate(
    +        max_tokens=1024,
    +        prompt=prompt,
    +    )
    +
    +    res = ""
    +    for result in results:
    +        res += result
    +
    +    return res
    +
    +

    Пример RAG

    Теперь мы готовы задать вопрос. Эта функция просто принимает вопрос, а затем выполняет RAG, чтобы сгенерировать соответствующий контекст из фоновой информации. Затем мы передаем контекст и вопрос в dorag() и получаем результат.

    +
    question = "What state is Cambridge in?"
    +
    +
    +def ask_a_question(question):
    +    embeddings = get_embeddings([question])
    +    res = milvus_client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=embeddings,  # search for the one (1) embedding returned as a list of lists
    +        anns_field="embedding",  # Search across embeddings
    +        limit=5,  # get me the top 5 results
    +        output_fields=["sentence"],  # get the sentence/chunk and city
    +    )
    +
    +    sentences = []
    +    for hits in res:
    +        for hit in hits:
    +            print(hit)
    +            sentences.append(hit["entity"]["sentence"])
    +    context = ". ".join(sentences)
    +    return context
    +
    +
    +context = ask_a_question(question=question)
    +print(context)
    +
    +

    Реализация RAG

    +
    print(dorag(question=question, context=context))
    +
    +

    Для примера с вопросом о том, в каком штате находится Кембридж, мы можем распечатать весь ответ из BentoML. Однако если мы потратим время на его разбор, он будет выглядеть более симпатично и сообщит нам, что Кембридж находится в штате Массачусетс.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_camel.json b/localization/v2.5.x/site/ru/integrations/integrate_with_camel.json new file mode 100644 index 000000000..a7d4350d2 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_camel.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U \"camel-ai[all]\" pymilvus\n","import os\nimport requests\n\nos.makedirs(\"local_data\", exist_ok=True)\n\nurl = \"https://arxiv.org/pdf/2303.17760.pdf\"\nresponse = requests.get(url)\nwith open(\"local_data/camel paper.pdf\", \"wb\") as file:\n file.write(response.content)\n","os.environ[\"OPENAI_API_KEY\"] = \"Your Key\"\n","from camel.embeddings import OpenAIEmbedding\n\nembedding_instance = OpenAIEmbedding()\n","from camel.storages import MilvusStorage\n\nstorage_instance = MilvusStorage(\n vector_dim=embedding_instance.get_output_dim(),\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n collection_name=\"camel_paper\",\n)\n","from camel.retrievers import VectorRetriever\n\nvector_retriever = VectorRetriever(\n embedding_model=embedding_instance, storage=storage_instance\n)\n","vector_retriever.process(content_input_path=\"local_data/camel paper.pdf\")\n","retrieved_info = vector_retriever.query(query=\"What is CAMEL?\", top_k=1)\nprint(retrieved_info)\n","retrieved_info_irrelevant = vector_retriever.query(\n query=\"Compared with dumpling and rice, which should I take for dinner?\", top_k=1\n)\n\nprint(retrieved_info_irrelevant)\n","from camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\nauto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n)\n\nretrieved_info = auto_retriever.run_vector_retriever(\n query=\"What is CAMEL-AI\",\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n top_k=1,\n return_detailed_info=True,\n)\n\nprint(retrieved_info)\n","from camel.agents import ChatAgent\nfrom camel.messages import BaseMessage\nfrom camel.types import RoleType\nfrom camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\n\ndef single_agent(query: str) -> str:\n # Set agent role\n assistant_sys_msg = BaseMessage(\n role_name=\"Assistant\",\n role_type=RoleType.ASSISTANT,\n meta_dict=None,\n content=\"\"\"You are a helpful assistant to answer question,\n I will give you the Original Query and Retrieved Context,\n answer the Original Query based on the Retrieved Context,\n if you can't answer the question just say I don't know.\"\"\",\n )\n\n # Add auto retriever\n auto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n )\n\n retrieved_info = auto_retriever.run_vector_retriever(\n query=query,\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n # vector_storage_local_path=\"storage_default_run\",\n top_k=1,\n return_detailed_info=True,\n )\n\n # Pass the retrieved infomation to agent\n user_msg = BaseMessage.make_user_message(role_name=\"User\", content=retrieved_info)\n agent = ChatAgent(assistant_sys_msg)\n\n # Get response\n assistant_response = agent.step(user_msg)\n return assistant_response.msg.content\n\n\nprint(single_agent(\"What is CAMEL-AI\"))\n","from typing import List\nfrom colorama import Fore\n\nfrom camel.agents.chat_agent import FunctionCallingRecord\nfrom camel.configs import ChatGPTConfig\nfrom camel.functions import (\n MATH_FUNCS,\n RETRIEVAL_FUNCS,\n)\nfrom camel.societies import RolePlaying\nfrom camel.types import ModelType\nfrom camel.utils import print_text_animated\n\n\ndef role_playing_with_rag(\n task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10\n) -> None:\n task_prompt = task_prompt\n\n user_model_config = ChatGPTConfig(temperature=0.0)\n\n function_list = [\n *MATH_FUNCS,\n *RETRIEVAL_FUNCS,\n ]\n assistant_model_config = ChatGPTConfig(\n tools=function_list,\n temperature=0.0,\n )\n\n role_play_session = RolePlaying(\n assistant_role_name=\"Searcher\",\n user_role_name=\"Professor\",\n assistant_agent_kwargs=dict(\n model_type=model_type,\n model_config=assistant_model_config,\n tools=function_list,\n ),\n user_agent_kwargs=dict(\n model_type=model_type,\n model_config=user_model_config,\n ),\n task_prompt=task_prompt,\n with_task_specify=False,\n )\n\n print(\n Fore.GREEN\n + f\"AI Assistant sys message:\\n{role_play_session.assistant_sys_msg}\\n\"\n )\n print(Fore.BLUE + f\"AI User sys message:\\n{role_play_session.user_sys_msg}\\n\")\n\n print(Fore.YELLOW + f\"Original task prompt:\\n{task_prompt}\\n\")\n print(\n Fore.CYAN\n + f\"Specified task prompt:\\n{role_play_session.specified_task_prompt}\\n\"\n )\n print(Fore.RED + f\"Final task prompt:\\n{role_play_session.task_prompt}\\n\")\n\n n = 0\n input_msg = role_play_session.init_chat()\n while n < chat_turn_limit:\n n += 1\n assistant_response, user_response = role_play_session.step(input_msg)\n\n if assistant_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI Assistant terminated. Reason: \"\n f\"{assistant_response.info['termination_reasons']}.\"\n )\n )\n break\n if user_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI User terminated. \"\n f\"Reason: {user_response.info['termination_reasons']}.\"\n )\n )\n break\n\n # Print output from the user\n print_text_animated(Fore.BLUE + f\"AI User:\\n\\n{user_response.msg.content}\\n\")\n\n # Print output from the assistant, including any function\n # execution information\n print_text_animated(Fore.GREEN + \"AI Assistant:\")\n tool_calls: List[FunctionCallingRecord] = assistant_response.info[\"tool_calls\"]\n for func_record in tool_calls:\n print_text_animated(f\"{func_record}\")\n print_text_animated(f\"{assistant_response.msg.content}\\n\")\n\n if \"CAMEL_TASK_DONE\" in user_response.msg.content:\n break\n\n input_msg = assistant_response.msg\n","role_playing_with_rag(\n task_prompt=\"\"\"What is the main termination reasons for AI Society\n dataset, how many number of messages did camel decided to\n limit, what's the value plus 100? You should refer to the\n content in path camel/local_data/camel paper.pdf\"\"\"\n)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Camel","anchorList":[{"label":"Система Retrieval-Augmented Generation (RAG) с помощью Milvus и Camel","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Camel","type":1,"isActive":false},{"label":"Загрузка данных","href":"Load-Data","type":2,"isActive":false},{"label":"1. Настроенный RAG","href":"1-Customized-RAG","type":2,"isActive":false},{"label":"2. Автоматический RAG","href":"2-Auto-RAG","type":2,"isActive":false},{"label":"3. Единый агент с автоматическим RAG","href":"3-Single-Agent-with-Auto-RAG","type":2,"isActive":false},{"label":"4. Ролевая игра с помощью Auto RAG","href":"4-Role-playing-with-Auto-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_camel.md b/localization/v2.5.x/site/ru/integrations/integrate_with_camel.md new file mode 100644 index 000000000..0b1688672 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_camel.md @@ -0,0 +1,474 @@ +--- +id: integrate_with_camel.md +summary: >- + В этом руководстве показано, как построить систему Retrieval-Augmented + Generation (RAG) с помощью CAMEL и Milvus. +title: Система Retrieval-Augmented Generation (RAG) с помощью Milvus и Camel +--- +

    Система Retrieval-Augmented Generation (RAG) с помощью Milvus и Camel

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как построить систему Retrieval-Augmented Generation (RAG) с помощью CAMEL и Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает релевантные документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    CAMEL - это мультиагентный фреймворк. Milvus - самая продвинутая в мире векторная база данных с открытым исходным кодом, созданная для работы с приложениями поиска сходства встраивания и искусственного интеллекта.

    +

    В этом блокноте мы покажем использование модуля CAMEL Retrieve как в индивидуальном, так и в автоматическом режиме. Мы также покажем, как объединить AutoRetriever с ChatAgent, и далее объединить AutoRetriever с RolePlaying с помощью Function Calling.

    +

    Включены 4 основные части:

    +
      +
    • Индивидуальный RAG
    • +
    • Автоматический RAG
    • +
    • Одиночный агент с Auto RAG
    • +
    • Ролевая игра с Auto RAG
    • +
    +

    Загрузка данных

    Сначала загрузим документ CAMEL с сайта https://arxiv.org/pdf/2303.17760.pdf. Это будут наши локальные данные для примера.

    +
    $ pip install -U "camel-ai[all]" pymilvus
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +
    import os
    +import requests
    +
    +os.makedirs("local_data", exist_ok=True)
    +
    +url = "https://arxiv.org/pdf/2303.17760.pdf"
    +response = requests.get(url)
    +with open("local_data/camel paper.pdf", "wb") as file:
    +    file.write(response.content)
    +
    +

    1. Настроенный RAG

    В этом разделе мы настроим наш индивидуальный конвейер RAG, в качестве примера мы возьмем VectorRetriever. Мы установим OpenAIEmbedding в качестве модели встраивания и MilvusStorage в качестве хранилища для нее.

    +

    Чтобы установить встраивание OpenAI, нам нужно установить OPENAI_API_KEY, как показано ниже.

    +
    os.environ["OPENAI_API_KEY"] = "Your Key"
    +
    +

    Импортируйте и установите экземпляр эмбеддинга:

    +
    from camel.embeddings import OpenAIEmbedding
    +
    +embedding_instance = OpenAIEmbedding()
    +
    +

    Импортируйте и установите экземпляр векторного хранилища:

    +
    from camel.storages import MilvusStorage
    +
    +storage_instance = MilvusStorage(
    +    vector_dim=embedding_instance.get_output_dim(),
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    collection_name="camel_paper",
    +)
    +
    +
    +

    Для url_and_api_key:

    +
      +
    • Использование локального файла, например./milvus.db, в качестве URI подключения Milvus является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае в качестве url используйте uri сервера, например,http://localhost:19530.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и токен подключения, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Импортируйте и настройте экземпляр ретривера:

    +

    По умолчанию similarity_threshold установлен на 0,75. Вы можете изменить его.

    +
    from camel.retrievers import VectorRetriever
    +
    +vector_retriever = VectorRetriever(
    +    embedding_model=embedding_instance, storage=storage_instance
    +)
    +
    +

    Мы используем встроенный Unstructured Module для разделения контента на небольшие фрагменты, контент будет разделен автоматически с помощью функции chunk_by_title, максимальное количество символов для каждого фрагмента составляет 500 символов, что является подходящей длиной для OpenAIEmbedding. Весь текст в кусках будет встроен и сохранен в экземпляр векторного хранилища, это займет некоторое время, пожалуйста, подождите.

    +
    vector_retriever.process(content_input_path="local_data/camel paper.pdf")
    +
    +
    [nltk_data] Downloading package punkt to /root/nltk_data...
    +[nltk_data]   Unzipping tokenizers/punkt.zip.
    +[nltk_data] Downloading package averaged_perceptron_tagger to
    +[nltk_data]     /root/nltk_data...
    +[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
    +
    +

    Теперь мы можем получить информацию из векторного хранилища, задав запрос. По умолчанию будет выдано текстовое содержимое из топ-1 чанка с наибольшим показателем косинусного сходства, причем показатель сходства должен быть выше 0,75, чтобы убедиться, что полученное содержимое соответствует запросу. Вы также можете изменить значение top_k.

    +

    Возвращаемый список строк включает:

    +
      +
    • балл сходства
    • +
    • путь к содержимому
    • +
    • метаданные
    • +
    • текст
    • +
    +
    retrieved_info = vector_retriever.query(query="What is CAMEL?", top_k=1)
    +print(retrieved_info)
    +
    +
    [{'similarity score': '0.8321675658226013', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 45}, 'text': 'CAMEL Data and Code License The intended purpose and licensing of CAMEL is solely for research use. The source code is licensed under Apache 2.0. The datasets are licensed under CC BY NC 4.0, which permits only non-commercial usage. It is advised that any models trained using the dataset should not be utilized for anything other than research purposes.\n\n45'}]
    +
    +

    Попробуем выполнить нерелевантный запрос:

    +
    retrieved_info_irrelevant = vector_retriever.query(
    +    query="Compared with dumpling and rice, which should I take for dinner?", top_k=1
    +)
    +
    +print(retrieved_info_irrelevant)
    +
    +
    [{'text': 'No suitable information retrieved from local_data/camel paper.pdf                 with similarity_threshold = 0.75.'}]
    +
    +

    2. Автоматический RAG

    В этом разделе мы запустим AutoRetriever с настройками по умолчанию. Он использует OpenAIEmbedding в качестве модели встраивания по умолчанию и Milvus в качестве векторного хранилища по умолчанию.

    +

    Что вам нужно сделать, так это:

    +
      +
    • Задать пути ввода контента, которые могут быть локальными или удаленными урлами
    • +
    • Задать удаленный url и api ключ для Milvus
    • +
    • Задать запрос
    • +
    +

    Конвейер Auto RAG создаст коллекции для заданных путей ввода контента, имя коллекции будет задано автоматически на основе имени пути ввода контента, если коллекция существует, она будет выполнять извлечение напрямую.

    +
    from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +auto_retriever = AutoRetriever(
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    storage_type=StorageType.MILVUS,
    +    embedding_model=embedding_instance,
    +)
    +
    +retrieved_info = auto_retriever.run_vector_retriever(
    +    query="What is CAMEL-AI",
    +    content_input_paths=[
    +        "local_data/camel paper.pdf",  # example local path
    +        "https://www.camel-ai.org/",  # example remote url
    +    ],
    +    top_k=1,
    +    return_detailed_info=True,
    +)
    +
    +print(retrieved_info)
    +
    +
    Original Query:
    +{What is CAMEL-AI}
    +Retrieved Context:
    +{'similarity score': '0.8252888321876526', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 7}, 'text': ' Section 3.2, to simulate assistant-user cooperation. For our analysis, we set our attention on AI Society setting. We also gathered conversational data, named CAMEL AI Society and CAMEL Code datasets and problem-solution pairs data named CAMEL Math and CAMEL Science and analyzed and evaluated their quality. Moreover, we will discuss potential extensions of our framework and highlight both the risks and opportunities that future AI society might present.'}
    +{'similarity score': '0.8378663659095764', 'content path': 'https://www.camel-ai.org/', 'metadata': {'filetype': 'text/html', 'languages': ['eng'], 'page_number': 1, 'url': 'https://www.camel-ai.org/', 'link_urls': ['#h.3f4tphhd9pn8', 'https://join.slack.com/t/camel-ai/shared_invite/zt-2g7xc41gy-_7rcrNNAArIP6sLQqldkqQ', 'https://discord.gg/CNcNpquyDc'], 'link_texts': [None, None, None], 'emphasized_text_contents': ['Mission', 'CAMEL-AI.org', 'is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.', 'Join us via', 'Slack', 'Discord', 'or'], 'emphasized_text_tags': ['span', 'span', 'span', 'span', 'span', 'span', 'span']}, 'text': 'Mission\n\nCAMEL-AI.org is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.\n\nJoin us via\n\nSlack\n\nDiscord\n\nor'}
    +
    +

    3. Единый агент с автоматическим RAG

    В этом разделе мы покажем, как объединить AutoRetriever с одним ChatAgent.

    +

    Зададим функцию агента, в этой функции мы можем получить ответ, предоставив запрос этому агенту.

    +
    from camel.agents import ChatAgent
    +from camel.messages import BaseMessage
    +from camel.types import RoleType
    +from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +
    +def single_agent(query: str) -> str:
    +    # Set agent role
    +    assistant_sys_msg = BaseMessage(
    +        role_name="Assistant",
    +        role_type=RoleType.ASSISTANT,
    +        meta_dict=None,
    +        content="""You are a helpful assistant to answer question,
    +         I will give you the Original Query and Retrieved Context,
    +        answer the Original Query based on the Retrieved Context,
    +        if you can't answer the question just say I don't know.""",
    +    )
    +
    +    # Add auto retriever
    +    auto_retriever = AutoRetriever(
    +        url_and_api_key=(
    +            "./milvus_demo.db",  # Your Milvus connection URI
    +            "",  # Your Milvus token
    +        ),
    +        storage_type=StorageType.MILVUS,
    +        embedding_model=embedding_instance,
    +    )
    +
    +    retrieved_info = auto_retriever.run_vector_retriever(
    +        query=query,
    +        content_input_paths=[
    +            "local_data/camel paper.pdf",  # example local path
    +            "https://www.camel-ai.org/",  # example remote url
    +        ],
    +        # vector_storage_local_path="storage_default_run",
    +        top_k=1,
    +        return_detailed_info=True,
    +    )
    +
    +    # Pass the retrieved infomation to agent
    +    user_msg = BaseMessage.make_user_message(role_name="User", content=retrieved_info)
    +    agent = ChatAgent(assistant_sys_msg)
    +
    +    # Get response
    +    assistant_response = agent.step(user_msg)
    +    return assistant_response.msg.content
    +
    +
    +print(single_agent("What is CAMEL-AI"))
    +
    +
    CAMEL-AI is an open-source community dedicated to the study of autonomous and communicative agents. It provides, implements, and supports various types of agents, tasks, prompts, models, datasets, and simulated environments to facilitate research in this field.
    +
    +

    4. Ролевая игра с помощью Auto RAG

    В этом разделе мы покажем, как объединить RETRIEVAL_FUNCS с RolePlaying, применив Function Calling.

    +
    from typing import List
    +from colorama import Fore
    +
    +from camel.agents.chat_agent import FunctionCallingRecord
    +from camel.configs import ChatGPTConfig
    +from camel.functions import (
    +    MATH_FUNCS,
    +    RETRIEVAL_FUNCS,
    +)
    +from camel.societies import RolePlaying
    +from camel.types import ModelType
    +from camel.utils import print_text_animated
    +
    +
    +def role_playing_with_rag(
    +    task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10
    +) -> None:
    +    task_prompt = task_prompt
    +
    +    user_model_config = ChatGPTConfig(temperature=0.0)
    +
    +    function_list = [
    +        *MATH_FUNCS,
    +        *RETRIEVAL_FUNCS,
    +    ]
    +    assistant_model_config = ChatGPTConfig(
    +        tools=function_list,
    +        temperature=0.0,
    +    )
    +
    +    role_play_session = RolePlaying(
    +        assistant_role_name="Searcher",
    +        user_role_name="Professor",
    +        assistant_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=assistant_model_config,
    +            tools=function_list,
    +        ),
    +        user_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=user_model_config,
    +        ),
    +        task_prompt=task_prompt,
    +        with_task_specify=False,
    +    )
    +
    +    print(
    +        Fore.GREEN
    +        + f"AI Assistant sys message:\n{role_play_session.assistant_sys_msg}\n"
    +    )
    +    print(Fore.BLUE + f"AI User sys message:\n{role_play_session.user_sys_msg}\n")
    +
    +    print(Fore.YELLOW + f"Original task prompt:\n{task_prompt}\n")
    +    print(
    +        Fore.CYAN
    +        + f"Specified task prompt:\n{role_play_session.specified_task_prompt}\n"
    +    )
    +    print(Fore.RED + f"Final task prompt:\n{role_play_session.task_prompt}\n")
    +
    +    n = 0
    +    input_msg = role_play_session.init_chat()
    +    while n < chat_turn_limit:
    +        n += 1
    +        assistant_response, user_response = role_play_session.step(input_msg)
    +
    +        if assistant_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI Assistant terminated. Reason: "
    +                    f"{assistant_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +        if user_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI User terminated. "
    +                    f"Reason: {user_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +
    +        # Print output from the user
    +        print_text_animated(Fore.BLUE + f"AI User:\n\n{user_response.msg.content}\n")
    +
    +        # Print output from the assistant, including any function
    +        # execution information
    +        print_text_animated(Fore.GREEN + "AI Assistant:")
    +        tool_calls: List[FunctionCallingRecord] = assistant_response.info["tool_calls"]
    +        for func_record in tool_calls:
    +            print_text_animated(f"{func_record}")
    +        print_text_animated(f"{assistant_response.msg.content}\n")
    +
    +        if "CAMEL_TASK_DONE" in user_response.msg.content:
    +            break
    +
    +        input_msg = assistant_response.msg
    +
    +

    Запустите ролевую игру с заданной функцией ретривера:

    +
    role_playing_with_rag(
    +    task_prompt="""What is the main termination reasons for AI Society
    +                   dataset, how many number of messages did camel decided to
    +                   limit, what's the value plus 100? You should refer to the
    +                   content in path camel/local_data/camel paper.pdf"""
    +)
    +
    +
    AI Assistant sys message:
    +BaseMessage(role_name='Searcher', role_type=<RoleType.ASSISTANT: 'assistant'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content="===== RULES OF ASSISTANT =====\nNever forget you are a Searcher and I am a Professor. Never flip roles! Never instruct me!\nWe share a common interest in collaborating to successfully complete a task.\nYou must help me to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?. Never forget our task!\nI must instruct you based on your expertise and my needs to complete the task.\n\nI must give you one instruction at a time.\nYou must write a specific solution that appropriately solves the requested instruction and explain your solutions.\nYou must decline my instruction honestly if you cannot perform the instruction due to physical, moral, legal reasons or your capability and explain the reasons.\nUnless I say the task is completed, you should always start with:\n\nSolution: <YOUR_SOLUTION>\n\n<YOUR_SOLUTION> should be very specific, include detailed explanations and provide preferable detailed implementations and examples and lists for task-solving.\nAlways end <YOUR_SOLUTION> with: Next request.")
    +
    +AI User sys message:
    +BaseMessage(role_name='Professor', role_type=<RoleType.USER: 'user'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content='===== RULES OF USER =====\nNever forget you are a Professor and I am a Searcher. Never flip roles! You will always instruct me.\nWe share a common interest in collaborating to successfully complete a task.\nI must help you to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what\'s the value plus 100?. Never forget our task!\nYou must instruct me based on my expertise and your needs to solve the task ONLY in the following two ways:\n\n1. Instruct with a necessary input:\nInstruction: <YOUR_INSTRUCTION>\nInput: <YOUR_INPUT>\n\n2. Instruct without any input:\nInstruction: <YOUR_INSTRUCTION>\nInput: None\n\nThe "Instruction" describes a task or question. The paired "Input" provides further context or information for the requested "Instruction".\n\nYou must give me one instruction at a time.\nI must write a response that appropriately solves the requested instruction.\nI must decline your instruction honestly if I cannot perform the instruction due to physical, moral, legal reasons or my capability and explain the reasons.\nYou should instruct me not ask me questions.\nNow you must start to instruct me using the two ways described above.\nDo not add anything else other than your instruction and the optional corresponding input!\nKeep giving me instructions and necessary inputs until you think the task is completed.\nWhen the task is completed, you must only reply with a single word <CAMEL_TASK_DONE>.\nNever say <CAMEL_TASK_DONE> unless my responses have solved your task.')
    +
    +Original task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +Specified task prompt:
    +None
    +
    +Final task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +
    +
    +AI User:
    +
    +Instruction: Provide a summary of the main termination reasons in the AI Society dataset.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: local_retriever
    +    Args: {'query': 'main termination reasons for AI Society dataset'}
    +    Result: Original Query:
    +{main termination reasons for AI Society dataset}
    +Retrieved Context:
    +Next we examine the conversation termination reasons for both AI Society and Code datasets. As can be seen in Figure 8, the main termination reasons for AI Society dataset is Assistant Instruct whereas for Code it is Token Limit. The latter is expected as the since responses that contain code tend to be long. It is also interesting to note that in both datasets, the termination due to Maximum Number of Messages is low indicating that the limit of 40 maximum messages is reasonable. Our decision t
    +
    +Solution: The main termination reason for the AI Society dataset is "Assistant Instruct." This indicates that conversations in the AI Society dataset typically end when the assistant is instructed to terminate the conversation.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Identify the number of messages that the camel decided to limit in the context provided.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Solution: The context provided from the local retriever indicates that the camel decided to limit the number of messages to a maximum of 40 messages. This is mentioned in the retrieved context where it states that the termination due to Maximum Number of Messages is low, indicating that the limit of 40 maximum messages is reasonable.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Calculate the value of the message limit plus 100.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: add
    +    Args: {'a': 40, 'b': 100}
    +    Result: 140
    +
    +Solution: The value of the message limit plus 100 is 140.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +CAMEL_TASK_DONE
    +
    +
    +AI Assistant:
    +
    +Solution: Understood, the task is completed.
    +
    +Next request.
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.json b/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.json new file mode 100644 index 000000000..d18191c54 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus cohere pandas numpy tqdm\n","import cohere\nimport pandas\nimport numpy as np\nfrom tqdm import tqdm\nfrom pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility\n","FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json' # The SQuAD dataset url\nCOLLECTION_NAME = 'question_answering_db' # Collection name\nDIMENSION = 1024 # Embeddings size, cohere embeddings default to 4096 with the large model\nCOUNT = 5000 # How many questions to embed and insert into Milvus\nBATCH_SIZE = 96 # How large of batches to use for embedding and insertion\nMILVUS_HOST = 'localhost' # Milvus server URI\nMILVUS_PORT = '19530'\nCOHERE_API_KEY = 'replace-this-with-the-cohere-api-key' # API key obtained from Cohere\n","# Download the dataset\ndataset = pandas.read_json(FILE)\n\n# Clean up the dataset by grabbing all the question answer pairs\nsimplified_records = []\nfor x in dataset['data']:\n for y in x['paragraphs']:\n for z in y['qas']:\n if len(z['answers']) != 0:\n simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})\n\n# Grab the amount of records based on COUNT\nsimplified_records = pandas.DataFrame.from_records(simplified_records)\nsimplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)\n\n# Check the length of the cleaned dataset matches count\nprint(len(simplified_records))\n","5000\n","# Connect to Milvus Database\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n\n# Remove collection if it already exists\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n\n# Create collection which includes the id, title, and embedding.\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n\n# Create an IVF_FLAT index for collection.\nindex_params = {\n 'metric_type':'IP',\n 'index_type':\"IVF_FLAT\",\n 'params':{\"nlist\": 1024}\n}\ncollection.create_index(field_name=\"original_question_embedding\", index_params=index_params)\ncollection.load()\n","# Set up a co:here client.\ncohere_client = cohere.Client(COHERE_API_KEY)\n\n# Extract embeddings from questions using Cohere\ndef embed(texts, input_type):\n res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)\n return res.embeddings\n\n# Insert each question, answer, and qustion embedding\ntotal = pandas.DataFrame()\nfor batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):\n questions = batch['question'].tolist()\n embeddings = embed(questions, \"search_document\")\n \n data = [\n {\n 'original_question': x,\n 'answer': batch['answer'].tolist()[i],\n 'original_question_embedding': embeddings[i]\n } for i, x in enumerate(questions)\n ]\n\n collection.insert(data=data)\n\ntime.sleep(10)\n","# Search the cluster for an answer to a question text\ndef search(text, top_k = 5):\n\n # AUTOINDEX does not require any search params \n search_params = {}\n\n results = collection.search(\n data = embed([text], \"search_query\"), # Embeded the question\n anns_field='original_question_embedding',\n param=search_params,\n limit = top_k, # Limit to top_k results per search\n output_fields=['original_question', 'answer'] # Include the original question and answer in the result\n )\n\n distances = results[0].distances\n entities = [ x.entity.to_dict()['entity'] for x in results[0] ]\n\n ret = [ {\n \"answer\": x[1][\"answer\"],\n \"distance\": x[0],\n \"original_question\": x[1]['original_question']\n } for x in zip(distances, entities)]\n\n return ret\n\n# Ask these questions\nsearch_questions = ['What kills bacteria?', 'What\\'s the biggest dog?']\n\n# Print out the results in order of [answer, similarity score, original question]\n\nret = [ { \"question\": x, \"candidates\": search(x) } for x in search_questions ]\n","# Output\n#\n# [\n# {\n# \"question\": \"What kills bacteria?\",\n# \"candidates\": [\n# {\n# \"answer\": \"farming\",\n# \"distance\": 0.6261022090911865,\n# \"original_question\": \"What makes bacteria resistant to antibiotic treatment?\"\n# },\n# {\n# \"answer\": \"Phage therapy\",\n# \"distance\": 0.6093736886978149,\n# \"original_question\": \"What has been talked about to treat resistant bacteria?\"\n# },\n# {\n# \"answer\": \"oral contraceptives\",\n# \"distance\": 0.5902313590049744,\n# \"original_question\": \"In therapy, what does the antibacterial interact with?\"\n# },\n# {\n# \"answer\": \"slowing down the multiplication of bacteria or killing the bacteria\",\n# \"distance\": 0.5874154567718506,\n# \"original_question\": \"How do antibiotics work?\"\n# },\n# {\n# \"answer\": \"in intensive farming to promote animal growth\",\n# \"distance\": 0.5667208433151245,\n# \"original_question\": \"Besides in treating human disease where else are antibiotics used?\"\n# }\n# ]\n# },\n# {\n# \"question\": \"What's the biggest dog?\",\n# \"candidates\": [\n# {\n# \"answer\": \"English Mastiff\",\n# \"distance\": 0.7875324487686157,\n# \"original_question\": \"What breed was the largest dog known to have lived?\"\n# },\n# {\n# \"answer\": \"forest elephants\",\n# \"distance\": 0.5886962413787842,\n# \"original_question\": \"What large animals reside in the national park?\"\n# },\n# {\n# \"answer\": \"Rico\",\n# \"distance\": 0.5634892582893372,\n# \"original_question\": \"What is the name of the dog that could ID over 200 things?\"\n# },\n# {\n# \"answer\": \"Iditarod Trail Sled Dog Race\",\n# \"distance\": 0.546872615814209,\n# \"original_question\": \"Which dog-sled race in Alaska is the most famous?\"\n# },\n# {\n# \"answer\": \"part of the family\",\n# \"distance\": 0.5387814044952393,\n# \"original_question\": \"Most people today describe their dogs as what?\"\n# }\n# ]\n# }\n# ]\n\n"],"headingContent":"Question Answering Using Milvus and Cohere","anchorList":[{"label":"Ответы на вопросы с использованием Milvus и Cohere","href":"Question-Answering-Using-Milvus-and-Cohere","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":2,"isActive":false},{"label":"Параметры","href":"Parameters","type":2,"isActive":false},{"label":"Подготовьте набор данных","href":"Prepare-the-dataset","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-a-collection","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data","type":2,"isActive":false},{"label":"Задать вопросы","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.md b/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.md new file mode 100644 index 000000000..5e79caaec --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_cohere.md @@ -0,0 +1,320 @@ +--- +id: integrate_with_cohere.md +summary: >- + На этой странице рассказывается о том, как искать лучшие ответы на вопросы, + используя Milvus в качестве базы данных векторов и Hugging Face в качестве + системы встраивания. +title: Ответы на вопросы с использованием Milvus и Cohere +--- +

    Ответы на вопросы с использованием Milvus и Cohere

    На этой странице показано, как создать систему ответов на вопросы на основе набора данных SQuAD, используя Milvus в качестве базы векторов и Cohere в качестве системы встраивания.

    +

    Прежде чем начать

    Для фрагментов кода на этой странице требуются установленные пакеты pymilvus, cohere, pandas, numpy и tqdm. Среди этих пакетов pymilvus является клиентом для Milvus. Если они отсутствуют в вашей системе, выполните следующие команды для их установки:

    +
    pip install pymilvus cohere pandas numpy tqdm
    +
    +

    Затем необходимо загрузить модули, которые будут использоваться в этом руководстве.

    +
    import cohere
    +import pandas
    +import numpy as np
    +from tqdm import tqdm
    +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
    +
    +

    Параметры

    Здесь находятся параметры, используемые в следующих фрагментах. Некоторые из них необходимо изменить, чтобы они подходили для вашего окружения. Рядом с каждым параметром находится описание его сути.

    +
    FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json'  # The SQuAD dataset url
    +COLLECTION_NAME = 'question_answering_db'  # Collection name
    +DIMENSION = 1024  # Embeddings size, cohere embeddings default to 4096 with the large model
    +COUNT = 5000  # How many questions to embed and insert into Milvus
    +BATCH_SIZE = 96 # How large of batches to use for embedding and insertion
    +MILVUS_HOST = 'localhost'  # Milvus server URI
    +MILVUS_PORT = '19530'
    +COHERE_API_KEY = 'replace-this-with-the-cohere-api-key'  # API key obtained from Cohere
    +
    +

    Чтобы узнать больше о модели и наборе данных, используемых на этой странице, обратитесь к сайтам co:here и SQuAD.

    +

    Подготовьте набор данных

    В этом примере мы будем использовать Stanford Question Answering Dataset (SQuAD) в качестве источника истины для ответов на вопросы. Этот набор данных поставляется в виде JSON-файла, и мы будем использовать pandas для его загрузки.

    +
    # Download the dataset
    +dataset = pandas.read_json(FILE)
    +
    +# Clean up the dataset by grabbing all the question answer pairs
    +simplified_records = []
    +for x in dataset['data']:
    +    for y in x['paragraphs']:
    +        for z in y['qas']:
    +            if len(z['answers']) != 0:
    +                simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})
    +
    +# Grab the amount of records based on COUNT
    +simplified_records = pandas.DataFrame.from_records(simplified_records)
    +simplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)
    +
    +# Check the length of the cleaned dataset matches count
    +print(len(simplified_records))
    +
    +

    На выходе мы получим количество записей в наборе данных.

    +
    5000
    +
    +

    Создание коллекции

    В этом разделе мы рассмотрим Milvus и настройку базы данных для этого сценария использования. В Milvus нам нужно создать коллекцию и проиндексировать ее.

    +
    # Connect to Milvus Database
    +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
    +
    +# Remove collection if it already exists
    +if utility.has_collection(COLLECTION_NAME):
    +    utility.drop_collection(COLLECTION_NAME)
    +
    +# Create collection which includes the id, title, and embedding.
    +fields = [
    +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +]
    +schema = CollectionSchema(fields=fields)
    +collection = Collection(name=COLLECTION_NAME, schema=schema)
    +
    +# Create an IVF_FLAT index for collection.
    +index_params = {
    +    'metric_type':'IP',
    +    'index_type':"IVF_FLAT",
    +    'params':{"nlist": 1024}
    +}
    +collection.create_index(field_name="original_question_embedding", index_params=index_params)
    +collection.load()
    +
    +

    Вставка данных

    После создания коллекции нам нужно начать вставку данных. Это делается в три этапа

    +
      +
    • чтение данных,
    • +
    • вставка исходных вопросов и
    • +
    • вставка данных в коллекцию, которую мы только что создали на Milvus.
    • +
    +

    В этом примере данные включают в себя исходный вопрос, вставку исходного вопроса и ответ на исходный вопрос.

    +
    # Set up a co:here client.
    +cohere_client = cohere.Client(COHERE_API_KEY)
    +
    +# Extract embeddings from questions using Cohere
    +def embed(texts, input_type):
    +    res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)
    +    return res.embeddings
    +
    +# Insert each question, answer, and qustion embedding
    +total = pandas.DataFrame()
    +for batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):
    +    questions = batch['question'].tolist()
    +    embeddings = embed(questions, "search_document")
    +    
    +    data = [
    +        {
    +            'original_question': x,
    +            'answer': batch['answer'].tolist()[i],
    +            'original_question_embedding': embeddings[i]
    +        } for i, x in enumerate(questions)
    +    ]
    +
    +    collection.insert(data=data)
    +
    +time.sleep(10)
    +
    +

    Задать вопросы

    После того как все данные вставлены в коллекцию Milvus, мы можем задать системе вопросы, взяв нашу фразу вопроса, внедрив ее с помощью Cohere и выполнив поиск по коллекции.

    +
    +

    Поиск по данным сразу после вставки может быть немного медленнее, поскольку поиск по неиндексированным данным выполняется методом грубой силы. Когда новые данные будут автоматически проиндексированы, поиск ускорится.

    +
    +
    # Search the cluster for an answer to a question text
    +def search(text, top_k = 5):
    +
    +    # AUTOINDEX does not require any search params 
    +    search_params = {}
    +
    +    results = collection.search(
    +        data = embed([text], "search_query"),  # Embeded the question
    +        anns_field='original_question_embedding',
    +        param=search_params,
    +        limit = top_k,  # Limit to top_k results per search
    +        output_fields=['original_question', 'answer']  # Include the original question and answer in the result
    +    )
    +
    +    distances = results[0].distances
    +    entities = [ x.entity.to_dict()['entity'] for x in results[0] ]
    +
    +    ret = [ {
    +        "answer": x[1]["answer"],
    +        "distance": x[0],
    +        "original_question": x[1]['original_question']
    +    } for x in zip(distances, entities)]
    +
    +    return ret
    +
    +# Ask these questions
    +search_questions = ['What kills bacteria?', 'What\'s the biggest dog?']
    +
    +# Print out the results in order of [answer, similarity score, original question]
    +
    +ret = [ { "question": x, "candidates": search(x) } for x in search_questions ]
    +
    +

    Результат должен быть похож на следующий:

    +
    # Output
    +#
    +# [
    +#     {
    +#         "question": "What kills bacteria?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "farming",
    +#                 "distance": 0.6261022090911865,
    +#                 "original_question": "What makes bacteria resistant to antibiotic treatment?"
    +#             },
    +#             {
    +#                 "answer": "Phage therapy",
    +#                 "distance": 0.6093736886978149,
    +#                 "original_question": "What has been talked about to treat resistant bacteria?"
    +#             },
    +#             {
    +#                 "answer": "oral contraceptives",
    +#                 "distance": 0.5902313590049744,
    +#                 "original_question": "In therapy, what does the antibacterial interact with?"
    +#             },
    +#             {
    +#                 "answer": "slowing down the multiplication of bacteria or killing the bacteria",
    +#                 "distance": 0.5874154567718506,
    +#                 "original_question": "How do antibiotics work?"
    +#             },
    +#             {
    +#                 "answer": "in intensive farming to promote animal growth",
    +#                 "distance": 0.5667208433151245,
    +#                 "original_question": "Besides in treating human disease where else are antibiotics used?"
    +#             }
    +#         ]
    +#     },
    +#     {
    +#         "question": "What's the biggest dog?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "English Mastiff",
    +#                 "distance": 0.7875324487686157,
    +#                 "original_question": "What breed was the largest dog known to have lived?"
    +#             },
    +#             {
    +#                 "answer": "forest elephants",
    +#                 "distance": 0.5886962413787842,
    +#                 "original_question": "What large animals reside in the national park?"
    +#             },
    +#             {
    +#                 "answer": "Rico",
    +#                 "distance": 0.5634892582893372,
    +#                 "original_question": "What is the name of the dog that could ID over 200 things?"
    +#             },
    +#             {
    +#                 "answer": "Iditarod Trail Sled Dog Race",
    +#                 "distance": 0.546872615814209,
    +#                 "original_question": "Which dog-sled race in Alaska is the most famous?"
    +#             },
    +#             {
    +#                 "answer": "part of the family",
    +#                 "distance": 0.5387814044952393,
    +#                 "original_question": "Most people today describe their dogs as what?"
    +#             }
    +#         ]
    +#     }
    +# ]
    +
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.json b/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.json new file mode 100644 index 000000000..0e97d401c --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"dspy-ai[milvus]\"\n$ pip install -U pymilvus\n","from dspy.datasets import HotPotQA\n\n# Load the dataset.\ndataset = HotPotQA(\n train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0\n)\n\n# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.\ntrainset = [x.with_inputs(\"question\") for x in dataset.train]\ndevset = [x.with_inputs(\"question\") for x in dataset.dev]\n","import requests\nimport os\n\nos.environ[\"OPENAI_API_KEY\"] = \"\"\nMILVUS_URI = \"example.db\"\nMILVUS_TOKEN = \"\"\n\nfrom pymilvus import MilvusClient, DataType, Collection\nfrom dspy.retrieve.milvus_rm import openai_embedding_function\n\nclient = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)\n\nif \"dspy_example\" not in client.list_collections():\n client.create_collection(\n collection_name=\"dspy_example\",\n overwrite=True,\n dimension=1536,\n primary_field_name=\"id\",\n vector_field_name=\"embedding\",\n id_type=\"int\",\n metric_type=\"IP\",\n max_length=65535,\n enable_dynamic=True,\n )\ntext = requests.get(\n \"https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt\"\n).text\n\nfor idx, passage in enumerate(text.split(\"\\n\")):\n if len(passage) == 0:\n continue\n client.insert(\n collection_name=\"dspy_example\",\n data=[\n {\n \"id\": idx,\n \"embedding\": openai_embedding_function(passage)[0],\n \"text\": passage,\n }\n ],\n )\n","from dspy.retrieve.milvus_rm import MilvusRM\nimport dspy\n\nretriever_model = MilvusRM(\n collection_name=\"dspy_example\",\n uri=MILVUS_URI,\n token=MILVUS_TOKEN, # ignore this if no token is required for Milvus connection\n embedding_function=openai_embedding_function,\n)\nturbo = dspy.OpenAI(model=\"gpt-3.5-turbo\")\ndspy.settings.configure(lm=turbo)\n","class GenerateAnswer(dspy.Signature):\n \"\"\"Answer questions with short factoid answers.\"\"\"\n\n context = dspy.InputField(desc=\"may contain relevant facts\")\n question = dspy.InputField()\n answer = dspy.OutputField(desc=\"often between 1 and 5 words\")\n","class RAG(dspy.Module):\n def __init__(self, rm):\n super().__init__()\n self.retrieve = rm\n\n # This signature indicates the task imposed on the COT module.\n self.generate_answer = dspy.ChainOfThought(GenerateAnswer)\n\n def forward(self, question):\n # Use milvus_rm to retrieve context for the question.\n context = self.retrieve(question).passages\n # COT module takes \"context, query\" and output \"answer\".\n prediction = self.generate_answer(context=context, question=question)\n return dspy.Prediction(\n context=[item.long_text for item in context], answer=prediction.answer\n )\n","rag = RAG(retriever_model)\nprint(rag(\"who write At My Window\").answer)\n","from dspy.evaluate.evaluate import Evaluate\nfrom dspy.datasets import HotPotQA\n\nevaluate_on_hotpotqa = Evaluate(\n devset=devset, num_threads=1, display_progress=False, display_table=5\n)\n\nmetric = dspy.evaluate.answer_exact_match\nscore = evaluate_on_hotpotqa(rag, metric=metric)\nprint(\"rag:\", score)\n","from dspy.teleprompt import BootstrapFewShot\n\n# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.\n\n\ndef validate_context_and_answer(example, pred, trace=None):\n answer_EM = dspy.evaluate.answer_exact_match(example, pred)\n answer_PM = dspy.evaluate.answer_passage_match(example, pred)\n return answer_EM and answer_PM\n\n\n# Set up a basic teleprompter, which will compile our RAG program.\nteleprompter = BootstrapFewShot(metric=validate_context_and_answer)\n\n# Compile!\ncompiled_rag = teleprompter.compile(rag, trainset=trainset)\n\n# Now compiled_rag is optimized and ready to answer your new question!\n# Now, let’s evaluate the compiled RAG program.\nscore = evaluate_on_hotpotqa(compiled_rag, metric=metric)\nprint(score)\nprint(\"compile_rag:\", score)\n"],"headingContent":"Integrate Milvus with DSPy","anchorList":[{"label":"Интеграция Milvus с DSPy","href":"Integrate-Milvus-with-DSPy","type":1,"isActive":false},{"label":"Что такое DSPy","href":"What-is-DSPy","type":2,"isActive":false},{"label":"Преимущества использования DSPy","href":"Benefits-of-using-DSPy","type":2,"isActive":false},{"label":"Модули","href":"Modules","type":2,"isActive":false},{"label":"Почему Milvus в DSPy","href":"Why-Milvus-in-DSPy","type":2,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false},{"label":"Резюме","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.md b/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.md new file mode 100644 index 000000000..d2e23e403 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_dspy.md @@ -0,0 +1,278 @@ +--- +id: integrate_with_dspy.md +summary: >- + Это руководство демонстрирует, как использовать MilvusRM, один из модулей + ретриверов DSPy, для оптимизации RAG-программ. +title: Интеграция Milvus с DSPy +--- +

    Интеграция Milvus с DSPy

    Open In Colab +GitHub Repository

    +

    Что такое DSPy

    DSPy, представленный Стэнфордской группой NLP, является революционным программным фреймворком, предназначенным для оптимизации подсказок и весов в языковых моделях, что особенно ценно в сценариях, где большие языковые модели (LLM) интегрированы на нескольких этапах конвейера. В отличие от традиционных методов разработки подсказок, основанных на ручном подборе и настройке, DSPy использует подход, основанный на обучении. Усваивая примеры запросов и ответов, DSPy динамически генерирует оптимизированные подсказки, адаптированные к конкретным задачам. Эта инновационная методология позволяет беспрепятственно перестраивать целые конвейеры, устраняя необходимость в постоянной ручной корректировке подсказок. Питонический синтаксис DSPy предлагает различные композитные и декларативные модули, упрощающие создание LLM.

    +

    Преимущества использования DSPy

      +
    • Подход к программированию: DSPy обеспечивает систематический подход к программированию для разработки LM-конвейеров, абстрагируя конвейеры как графы текстовых преобразований, а не просто подсказывая LLM. Его декларативные модули обеспечивают структурированное проектирование и оптимизацию, заменяя метод проб и ошибок традиционных шаблонов подсказок.
    • +
    • Повышение производительности: DSPy демонстрирует значительный прирост производительности по сравнению с существующими методами. На конкретных примерах он превосходит стандартные подсказки и демонстрации, созданные экспертами, демонстрируя свою универсальность и эффективность даже при компиляции в небольшие модели LM.
    • +
    • Модулированная абстракция: DSPy эффективно абстрагирует сложные аспекты разработки конвейера LM, такие как декомпозиция, тонкая настройка и выбор модели. С помощью DSPy краткая программа может быть легко преобразована в инструкции для различных моделей, таких как GPT-4, Llama2-13b или T5-base, что упрощает разработку и повышает производительность.
    • +
    +

    Модули

    Существует множество компонентов, которые вносят свой вклад в построение конвейера LLM. Здесь мы опишем некоторые ключевые компоненты, чтобы обеспечить высокоуровневое понимание того, как работает DSPy.

    +

    + + DSPy Modules + Модули DSPy

    +

    Сигнатура: Сигнатуры в DSPy служат декларативными спецификациями, определяющими входное/выходное поведение модулей и направляющими языковую модель при выполнении задач. Модуль: Модули DSPy служат фундаментальными компонентами для программ, использующих языковые модели (ЯМ). Они абстрагируют различные техники подсказок, такие как цепочка мыслей или ReAct, и адаптируются для работы с любой сигнатурой DSPy. Благодаря обучаемым параметрам и способности обрабатывать входные данные и создавать выходные, эти модули можно объединять в более крупные программы, черпая вдохновение в модулях NN в PyTorch, но адаптируя их для применения LM. Оптимизатор: Оптимизаторы в DSPy точно настраивают параметры программ DSPy, такие как подсказки и веса LLM, чтобы максимизировать заданные метрики, такие как точность, повышая эффективность программы.

    +

    Почему Milvus в DSPy

    DSPy - это мощный фреймворк программирования, который способствует развитию RAG-приложений. Таким приложениям необходимо извлекать полезную информацию для повышения качества ответов, для чего нужна векторная база данных. Milvus - это известная векторная база данных с открытым исходным кодом, позволяющая повысить производительность и масштабируемость. С MilvusRM, модулем ретривера в DSPy, интеграция Milvus становится простой. Теперь разработчики могут легко определять и оптимизировать RAG-программы с помощью DSPy, используя сильные возможности векторного поиска Milvus. Это сотрудничество делает приложения RAG более эффективными и масштабируемыми, объединяя возможности программирования DSPy с функциями поиска Milvus.

    +

    Примеры

    Теперь давайте рассмотрим быстрый пример, демонстрирующий использование Milvus в DSPy для оптимизации RAG-приложений.

    +

    Предварительные условия

    Перед созданием приложения RAG установите DSPy и PyMilvus.

    +
    $ pip install "dspy-ai[milvus]"
    +$ pip install -U pymilvus
    +
    +
    +Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться **перезапустить среду выполнения** (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).
    +

    Загрузка набора данных

    В этом примере в качестве обучающего набора данных мы используем HotPotQA, коллекцию сложных пар "вопрос-ответ". Мы можем загрузить их через класс HotPotQA.

    +
    from dspy.datasets import HotPotQA
    +
    +# Load the dataset.
    +dataset = HotPotQA(
    +    train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0
    +)
    +
    +# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
    +trainset = [x.with_inputs("question") for x in dataset.train]
    +devset = [x.with_inputs("question") for x in dataset.dev]
    +
    +

    Загрузка данных в векторную базу данных Milvus

    Загрузите контекстную информацию в коллекцию Milvus для векторного поиска. В этой коллекции должно быть поле embedding и поле text. В данном случае мы используем модель OpenAI text-embedding-3-small в качестве функции встраивания запроса по умолчанию.

    +
    import requests
    +import os
    +
    +os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"
    +MILVUS_URI = "example.db"
    +MILVUS_TOKEN = ""
    +
    +from pymilvus import MilvusClient, DataType, Collection
    +from dspy.retrieve.milvus_rm import openai_embedding_function
    +
    +client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)
    +
    +if "dspy_example" not in client.list_collections():
    +    client.create_collection(
    +        collection_name="dspy_example",
    +        overwrite=True,
    +        dimension=1536,
    +        primary_field_name="id",
    +        vector_field_name="embedding",
    +        id_type="int",
    +        metric_type="IP",
    +        max_length=65535,
    +        enable_dynamic=True,
    +    )
    +text = requests.get(
    +    "https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt"
    +).text
    +
    +for idx, passage in enumerate(text.split("\n")):
    +    if len(passage) == 0:
    +        continue
    +    client.insert(
    +        collection_name="dspy_example",
    +        data=[
    +            {
    +                "id": idx,
    +                "embedding": openai_embedding_function(passage)[0],
    +                "text": passage,
    +            }
    +        ],
    +    )
    +
    +

    Определите MilvusRM.

    Теперь вам нужно определить MilvusRM.

    +
    from dspy.retrieve.milvus_rm import MilvusRM
    +import dspy
    +
    +retriever_model = MilvusRM(
    +    collection_name="dspy_example",
    +    uri=MILVUS_URI,
    +    token=MILVUS_TOKEN,  # ignore this if no token is required for Milvus connection
    +    embedding_function=openai_embedding_function,
    +)
    +turbo = dspy.OpenAI(model="gpt-3.5-turbo")
    +dspy.settings.configure(lm=turbo)
    +
    +

    Построение сигнатур

    Теперь, когда мы загрузили данные, давайте начнем определять сигнатуры для подзадач нашего конвейера. Мы можем определить наши простые входные question и выходные answer, но поскольку мы строим конвейер RAG, мы будем получать контекстную информацию из Milvus. Поэтому давайте определим нашу сигнатуру как context, question --> answer.

    +
    class GenerateAnswer(dspy.Signature):
    +    """Answer questions with short factoid answers."""
    +
    +    context = dspy.InputField(desc="may contain relevant facts")
    +    question = dspy.InputField()
    +    answer = dspy.OutputField(desc="often between 1 and 5 words")
    +
    +

    Мы включаем краткие описания для полей context и answer, чтобы определить более четкие ориентиры того, что будет получать и генерировать модель.

    +

    Построение конвейера

    Теперь давайте определим конвейер RAG.

    +
    class RAG(dspy.Module):
    +    def __init__(self, rm):
    +        super().__init__()
    +        self.retrieve = rm
    +
    +        # This signature indicates the task imposed on the COT module.
    +        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
    +
    +    def forward(self, question):
    +        # Use milvus_rm to retrieve context for the question.
    +        context = self.retrieve(question).passages
    +        # COT module takes "context, query" and output "answer".
    +        prediction = self.generate_answer(context=context, question=question)
    +        return dspy.Prediction(
    +            context=[item.long_text for item in context], answer=prediction.answer
    +        )
    +
    +

    Выполнение конвейера и получение результатов

    Теперь мы построили этот конвейер RAG. Давайте опробуем его и получим результаты.

    +
    rag = RAG(retriever_model)
    +print(rag("who write At My Window").answer)
    +
    +
    Townes Van Zandt
    +
    +

    Мы можем оценить количественные результаты на наборе данных.

    +
    from dspy.evaluate.evaluate import Evaluate
    +from dspy.datasets import HotPotQA
    +
    +evaluate_on_hotpotqa = Evaluate(
    +    devset=devset, num_threads=1, display_progress=False, display_table=5
    +)
    +
    +metric = dspy.evaluate.answer_exact_match
    +score = evaluate_on_hotpotqa(rag, metric=metric)
    +print("rag:", score)
    +
    +

    Оптимизация конвейера

    После определения программы следующим шагом будет компиляция. Этот процесс обновляет параметры в каждом модуле для повышения производительности. Процесс компиляции зависит от трех важнейших факторов:

    +
      +
    • Обучающий набор: Для демонстрации мы будем использовать 20 примеров вопросов-ответов из нашего обучающего набора данных.
    • +
    • Метрика проверки: Мы создадим простую метрику validate_context_and_answer. Эта метрика проверяет точность предсказанного ответа и гарантирует, что найденный контекст включает ответ.
    • +
    • Специфический оптимизатор (телесуфлер): В компилятор DSPy встроено несколько телесуфлеров, предназначенных для эффективной оптимизации ваших программ.
    • +
    +
    from dspy.teleprompt import BootstrapFewShot
    +
    +# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.
    +
    +
    +def validate_context_and_answer(example, pred, trace=None):
    +    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
    +    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
    +    return answer_EM and answer_PM
    +
    +
    +# Set up a basic teleprompter, which will compile our RAG program.
    +teleprompter = BootstrapFewShot(metric=validate_context_and_answer)
    +
    +# Compile!
    +compiled_rag = teleprompter.compile(rag, trainset=trainset)
    +
    +# Now compiled_rag is optimized and ready to answer your new question!
    +# Now, let’s evaluate the compiled RAG program.
    +score = evaluate_on_hotpotqa(compiled_rag, metric=metric)
    +print(score)
    +print("compile_rag:", score)
    +
    +

    Оценка Ragas увеличилась с предыдущего значения 50,0 до 52,0, что свидетельствует о повышении качества ответа.

    +

    Резюме

    DSPy знаменует собой скачок в области взаимодействия с языковыми моделями благодаря программируемому интерфейсу, который облегчает алгоритмическую и автоматизированную оптимизацию подсказок и весов моделей. Использование DSPy для реализации RAG позволяет легко адаптироваться к различным языковым моделям и наборам данных, что значительно сокращает необходимость утомительного ручного вмешательства.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.json b/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.json new file mode 100644 index 000000000..458ae8831 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.json @@ -0,0 +1 @@ +{"codeList":["$ mkdir fastgpt\n$ cd fastgpt\n$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json\n\n# milvus version\n$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml\n# zilliz version\n# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml\n","# Launch the container\n$ docker compose up -d\n# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql\n$ sleep 10\n# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)\n$ docker restart oneapi\n","$ docker compose down\n"],"headingContent":"Deploying FastGPT with Milvus","anchorList":[{"label":"Развертывание FastGPT с помощью Milvus","href":"Deploying-FastGPT-with-Milvus","type":1,"isActive":false},{"label":"Загрузите docker-compose.yml","href":"Download-docker-composeyml","type":2,"isActive":false},{"label":"Запуск контейнера","href":"Launch-the-Container","type":2,"isActive":false},{"label":"Доступ к OneAPI для добавления моделей","href":"Access-OneAPI-to-Add-Models","type":2,"isActive":false},{"label":"Настройка токенов","href":"Setting-Tokens","type":2,"isActive":false},{"label":"Доступ к FastGPT","href":"Accessing-FastGPT","type":2,"isActive":false},{"label":"Остановка контейнера","href":"Stop-the-Container","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.md b/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.md new file mode 100644 index 000000000..ae8cf6efa --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_fastgpt.md @@ -0,0 +1,145 @@ +--- +id: integrate_with_fastgpt.md +summary: >- + В этом руководстве вы узнаете, как быстро развернуть собственное эксклюзивное + приложение FastGPT с помощью [Milvus](https://milvus.io/). +title: Развертывание FastGPT с помощью Milvus +--- +

    Развертывание FastGPT с помощью Milvus

    FastGPT - это система вопросов и ответов, основанная на знаниях и построенная на большой языковой модели LLM, предлагающая готовые к использованию возможности для обработки данных и вызова моделей. Кроме того, она позволяет организовать рабочий процесс с помощью визуализации Flow, что облегчает работу со сложными сценариями вопросов и ответов. В этом руководстве вы узнаете, как быстро развернуть собственное эксклюзивное приложение FastGPT с помощью Milvus.

    +

    Загрузите docker-compose.yml

    Убедитесь, что вы уже установили Docker Compose.
    +Выполните приведенную ниже команду, чтобы загрузить файл docker-compose.yml.

    +
    $ mkdir fastgpt
    +$ cd fastgpt
    +$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
    +
    +# milvus version
    +$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
    +# zilliz version
    +# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
    +
    +
    +

    Если вы используете версию Zilliz, настройте параметры MILVUS_ADDRESS и MILVUS_TOKEN link в файле docker-compose.yml, которые соответствуют Public Endpoint и Api key в Zilliz Cloud.

    +
    +

    Запуск контейнера

    Выполните запуск в той же директории, что и docker-compose.yml. Убедитесь, что версия docker-compose в идеале выше 2.17, так как в противном случае некоторые команды автоматизации могут не работать.

    +
    # Launch the container
    +$ docker compose up -d
    +# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql
    +$ sleep 10
    +# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)
    +$ docker restart oneapi
    +
    +

    Доступ к OneAPI для добавления моделей

    Доступ к OneAPI можно получить по адресу ip:3001. По умолчанию имя пользователя - root, а пароль - 123456. Вы можете изменить пароль после входа в систему.
    +Используя модель OpenAI в качестве примера, перейдите на вкладку "Канал", выберите модель чата и модель встраивания в разделе "Модели".
    +Введите свой API-ключ OpenAI в разделе "Секреты".
    +Для использования моделей за пределами OpenAI и получения дополнительной информации, пожалуйста, обратитесь к One API.

    +

    Настройка токенов

    Перейдите на вкладку "Токены". По умолчанию здесь установлен токен Initial Root Token. Вы также можете создать новый токен и установить квоту самостоятельно.
    +Нажмите "Копировать" на своем токене, убедившись, что значение этого токена совпадает со значением CHAT_API_KEY, заданным в файле docker-compose.yml.

    +

    Доступ к FastGPT

    В настоящее время доступ к FastGPT можно получить напрямую по адресу ip:3000 (пожалуйста, не забывайте о брандмауэре). Имя пользователя - root, а пароль - DEFAULT_ROOT_PSW в переменной окружения docker-compose.yml. Если вам потребуется доступ к доменному имени, вам нужно будет самостоятельно установить и настроить Nginx.

    +

    Остановка контейнера

    Выполните следующую команду, чтобы остановить контейнер.

    +
    $ docker compose down
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.json b/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.json new file mode 100644 index 000000000..9a5b76d03 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import os\nimport urllib.request\n\nurl = \"https://www.gutenberg.org/cache/epub/7785/pg7785.txt\"\nfile_path = \"./davinci.txt\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\n","from haystack import Pipeline\nfrom haystack.components.converters import MarkdownToDocument\nfrom haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder\nfrom haystack.components.preprocessors import DocumentSplitter\nfrom haystack.components.writers import DocumentWriter\nfrom haystack.utils import Secret\n\nfrom milvus_haystack import MilvusDocumentStore\nfrom milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever\n\n\ndocument_store = MilvusDocumentStore(\n connection_args={\"uri\": \"./milvus.db\"},\n # connection_args={\"uri\": \"http://localhost:19530\"},\n # connection_args={\"uri\": YOUR_ZILLIZ_CLOUD_URI, \"token\": Secret.from_env_var(\"ZILLIZ_CLOUD_API_KEY\")},\n drop_old=True,\n)\n","indexing_pipeline = Pipeline()\nindexing_pipeline.add_component(\"converter\", MarkdownToDocument())\nindexing_pipeline.add_component(\n \"splitter\", DocumentSplitter(split_by=\"sentence\", split_length=2)\n)\nindexing_pipeline.add_component(\"embedder\", OpenAIDocumentEmbedder())\nindexing_pipeline.add_component(\"writer\", DocumentWriter(document_store))\nindexing_pipeline.connect(\"converter\", \"splitter\")\nindexing_pipeline.connect(\"splitter\", \"embedder\")\nindexing_pipeline.connect(\"embedder\", \"writer\")\nindexing_pipeline.run({\"converter\": {\"sources\": [file_path]}})\n\nprint(\"Number of documents:\", document_store.count_documents())\n","question = 'Where is the painting \"Warrior\" currently stored?'\n\nretrieval_pipeline = Pipeline()\nretrieval_pipeline.add_component(\"embedder\", OpenAITextEmbedder())\nretrieval_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nretrieval_pipeline.connect(\"embedder\", \"retriever\")\n\nretrieval_results = retrieval_pipeline.run({\"embedder\": {\"text\": question}})\n\nfor doc in retrieval_results[\"retriever\"][\"documents\"]:\n print(doc.content)\n print(\"-\" * 10)\n","from haystack.utils import Secret\nfrom haystack.components.builders import PromptBuilder\nfrom haystack.components.generators import OpenAIGenerator\n\nprompt_template = \"\"\"Answer the following query based on the provided context. If the context does\n not include an answer, reply with 'I don't know'.\\n\n Query: {{query}}\n Documents:\n {% for doc in documents %}\n {{ doc.content }}\n {% endfor %}\n Answer:\n \"\"\"\n\nrag_pipeline = Pipeline()\nrag_pipeline.add_component(\"text_embedder\", OpenAITextEmbedder())\nrag_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nrag_pipeline.add_component(\"prompt_builder\", PromptBuilder(template=prompt_template))\nrag_pipeline.add_component(\n \"generator\",\n OpenAIGenerator(\n api_key=Secret.from_token(os.getenv(\"OPENAI_API_KEY\")),\n generation_kwargs={\"temperature\": 0},\n ),\n)\nrag_pipeline.connect(\"text_embedder.embedding\", \"retriever.query_embedding\")\nrag_pipeline.connect(\"retriever.documents\", \"prompt_builder.documents\")\nrag_pipeline.connect(\"prompt_builder\", \"generator\")\n\nresults = rag_pipeline.run(\n {\n \"text_embedder\": {\"text\": question},\n \"prompt_builder\": {\"query\": question},\n }\n)\nprint(\"RAG answer:\", results[\"generator\"][\"replies\"][0])\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Haystack","anchorList":[{"label":"Retrieval-Augmented Generation (RAG) с помощью Milvus и Haystack","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Haystack","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Подготовьте данные","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Создание конвейера индексирования","href":"Create-the-indexing-Pipeline","type":2,"isActive":false},{"label":"Создание конвейера поиска","href":"Create-the-retrieval-pipeline","type":2,"isActive":false},{"label":"Создание конвейера RAG","href":"Create-the-RAG-pipeline","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.md b/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.md new file mode 100644 index 000000000..8eea462f0 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_haystack.md @@ -0,0 +1,256 @@ +--- +id: integrate_with_haystack.md +summary: >- + В этом руководстве показано, как построить систему Retrieval-Augmented + Generation (RAG) с помощью Haystack и Milvus. +title: Retrieval-Augmented Generation (RAG) с помощью Milvus и Haystack +--- +

    Retrieval-Augmented Generation (RAG) с помощью Milvus и Haystack

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как построить систему Retrieval-Augmented Generation (RAG) с помощью Haystack и Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает соответствующие документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    Haystack - это Python-фреймворк с открытым исходным кодом от deepset для создания пользовательских приложений с большими языковыми моделями (LLM). Milvus - самая продвинутая в мире векторная база данных с открытым исходным кодом, созданная для использования в приложениях для поиска сходства встраивания и искусственного интеллекта.

    +

    Предварительные условия

    Перед запуском этого блокнота убедитесь, что у вас установлены следующие зависимости:

    +
    ! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Мы будем использовать модели из OpenAI. Вам необходимо подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Подготовьте данные

    Мы используем онлайн-контент о Леонардо да Винчи в качестве хранилища частных знаний для нашего RAG-конвейера, который является хорошим источником данных для простого RAG-конвейера.

    +

    Загрузите его и сохраните в локальном текстовом файле.

    +
    import os
    +import urllib.request
    +
    +url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
    +file_path = "./davinci.txt"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +
    +

    Создание конвейера индексирования

    Создайте конвейер индексирования, который преобразует текст в документы, разбивает их на предложения и вставляет их. Затем документы записываются в хранилище документов Milvus.

    +
    from haystack import Pipeline
    +from haystack.components.converters import MarkdownToDocument
    +from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
    +from haystack.components.preprocessors import DocumentSplitter
    +from haystack.components.writers import DocumentWriter
    +from haystack.utils import Secret
    +
    +from milvus_haystack import MilvusDocumentStore
    +from milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever
    +
    +
    +document_store = MilvusDocumentStore(
    +    connection_args={"uri": "./milvus.db"},
    +    # connection_args={"uri": "http://localhost:19530"},
    +    # connection_args={"uri": YOUR_ZILLIZ_CLOUD_URI, "token": Secret.from_env_var("ZILLIZ_CLOUD_API_KEY")},
    +    drop_old=True,
    +)
    +
    +
    +

    Для connection_args:

    +
      +
    • Задание uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +
    indexing_pipeline = Pipeline()
    +indexing_pipeline.add_component("converter", MarkdownToDocument())
    +indexing_pipeline.add_component(
    +    "splitter", DocumentSplitter(split_by="sentence", split_length=2)
    +)
    +indexing_pipeline.add_component("embedder", OpenAIDocumentEmbedder())
    +indexing_pipeline.add_component("writer", DocumentWriter(document_store))
    +indexing_pipeline.connect("converter", "splitter")
    +indexing_pipeline.connect("splitter", "embedder")
    +indexing_pipeline.connect("embedder", "writer")
    +indexing_pipeline.run({"converter": {"sources": [file_path]}})
    +
    +print("Number of documents:", document_store.count_documents())
    +
    +
    Converting markdown files to Documents: 100%|█| 1/
    +Calculating embeddings: 100%|█| 9/9 [00:05<00:00, 
    +E20240516 10:40:32.945937 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946677 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946704 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946725 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +
    +
    +Number of documents: 277
    +
    +

    Создание конвейера поиска

    Создайте конвейер поиска, который будет извлекать документы из хранилища документов Milvus с помощью системы поиска по векторному сходству.

    +
    question = 'Where is the painting "Warrior" currently stored?'
    +
    +retrieval_pipeline = Pipeline()
    +retrieval_pipeline.add_component("embedder", OpenAITextEmbedder())
    +retrieval_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +retrieval_pipeline.connect("embedder", "retriever")
    +
    +retrieval_results = retrieval_pipeline.run({"embedder": {"text": question}})
    +
    +for doc in retrieval_results["retriever"]["documents"]:
    +    print(doc.content)
    +    print("-" * 10)
    +
    +
    ). The
    +composition of this oil-painting seems to have been built up on the
    +second cartoon, which he had made some eight years earlier, and which
    +was apparently taken to France in 1516 and ultimately lost.
    +----------
    +
    +This "Baptism of Christ," which is now in the Accademia in Florence
    +and is in a bad state of preservation, appears to have been a
    +comparatively early work by Verrocchio, and to have been painted
    +in 1480-1482, when Leonardo would be about thirty years of age.
    +
    +To about this period belongs the superb drawing of the "Warrior," now
    +in the Malcolm Collection in the British Museum.
    +----------
    +" Although he
    +completed the cartoon, the only part of the composition which he
    +eventually executed in colour was an incident in the foreground
    +which dealt with the "Battle of the Standard." One of the many
    +supposed copies of a study of this mural painting now hangs on the
    +south-east staircase in the Victoria and Albert Museum.
    +----------
    +
    +

    Создание конвейера RAG

    Создайте конвейер RAG, который объединяет MilvusEmbeddingRetriever и OpenAIGenerator, чтобы ответить на вопрос с помощью полученных документов.

    +
    from haystack.utils import Secret
    +from haystack.components.builders import PromptBuilder
    +from haystack.components.generators import OpenAIGenerator
    +
    +prompt_template = """Answer the following query based on the provided context. If the context does
    +                     not include an answer, reply with 'I don't know'.\n
    +                     Query: {{query}}
    +                     Documents:
    +                     {% for doc in documents %}
    +                        {{ doc.content }}
    +                     {% endfor %}
    +                     Answer:
    +                  """
    +
    +rag_pipeline = Pipeline()
    +rag_pipeline.add_component("text_embedder", OpenAITextEmbedder())
    +rag_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
    +rag_pipeline.add_component(
    +    "generator",
    +    OpenAIGenerator(
    +        api_key=Secret.from_token(os.getenv("OPENAI_API_KEY")),
    +        generation_kwargs={"temperature": 0},
    +    ),
    +)
    +rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
    +rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
    +rag_pipeline.connect("prompt_builder", "generator")
    +
    +results = rag_pipeline.run(
    +    {
    +        "text_embedder": {"text": question},
    +        "prompt_builder": {"query": question},
    +    }
    +)
    +print("RAG answer:", results["generator"]["replies"][0])
    +
    +
    RAG answer: The painting "Warrior" is currently stored in the Malcolm Collection in the British Museum.
    +
    +

    Дополнительные сведения об использовании milvus-haystack см. в документе milvus-haystack Readme.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.json b/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.json new file mode 100644 index 000000000..96fb5e9dd --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus transformers datasets torch\n","from datasets import load_dataset\n\n\nDATASET = \"squad\" # Name of dataset from HuggingFace Datasets\nINSERT_RATIO = 0.001 # Ratio of example dataset to be inserted\n\ndata = load_dataset(DATASET, split=\"validation\")\n# Generates a fixed subset. To generate a random subset, remove the seed.\ndata = data.train_test_split(test_size=INSERT_RATIO, seed=42)[\"test\"]\n# Clean up the data structure in the dataset.\ndata = data.map(\n lambda val: {\"answer\": val[\"answers\"][\"text\"][0]},\n remove_columns=[\"id\", \"answers\", \"context\"],\n)\n\n# View summary of example data\nprint(data)\n","from transformers import AutoTokenizer, AutoModel\nimport torch\n\nMODEL = (\n \"sentence-transformers/all-MiniLM-L6-v2\" # Name of model from HuggingFace Models\n)\nINFERENCE_BATCH_SIZE = 64 # Batch size of model inference\n\n# Load tokenizer & model from HuggingFace Hub\ntokenizer = AutoTokenizer.from_pretrained(MODEL)\nmodel = AutoModel.from_pretrained(MODEL)\n\n\ndef encode_text(batch):\n # Tokenize sentences\n encoded_input = tokenizer(\n batch[\"question\"], padding=True, truncation=True, return_tensors=\"pt\"\n )\n\n # Compute token embeddings\n with torch.no_grad():\n model_output = model(**encoded_input)\n\n # Perform pooling\n token_embeddings = model_output[0]\n attention_mask = encoded_input[\"attention_mask\"]\n input_mask_expanded = (\n attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n )\n sentence_embeddings = torch.sum(\n token_embeddings * input_mask_expanded, 1\n ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)\n\n # Normalize embeddings\n batch[\"question_embedding\"] = torch.nn.functional.normalize(\n sentence_embeddings, p=2, dim=1\n )\n return batch\n\n\ndata = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)\ndata_list = data.to_list()\n","from pymilvus import MilvusClient\n\n\nMILVUS_URI = \"./huggingface_milvus_test.db\" # Connection URI\nCOLLECTION_NAME = \"huggingface_test\" # Collection name\nDIMENSION = 384 # Embedding dimension depending on model\n\nmilvus_client = MilvusClient(MILVUS_URI)\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n dimension=DIMENSION,\n auto_id=True, # Enable auto id\n enable_dynamic_field=True, # Enable dynamic fields\n vector_field_name=\"question_embedding\", # Map vector field name and embedding column in dataset\n consistency_level=\"Strong\", # To enable search with latest data\n)\n","milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)\n","questions = {\n \"question\": [\n \"What is LGM?\",\n \"When did Massachusetts first mandate that children be educated in schools?\",\n ]\n}\n\n# Generate question embeddings\nquestion_embeddings = [v.tolist() for v in encode_text(questions)[\"question_embedding\"]]\n\n# Search across Milvus\nsearch_results = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=question_embeddings,\n limit=3, # How many search results to output\n output_fields=[\"answer\", \"question\"], # Include these fields in search results\n)\n\n# Print out results\nfor q, res in zip(questions[\"question\"], search_results):\n print(\"Question:\", q)\n for r in res:\n print(\n {\n \"answer\": r[\"entity\"][\"answer\"],\n \"score\": r[\"distance\"],\n \"original question\": r[\"entity\"][\"question\"],\n }\n )\n print(\"\\n\")\n"],"headingContent":"Question Answering Using Milvus and Hugging Face","anchorList":[{"label":"Ответы на вопросы с помощью Milvus и обнимающихся лиц","href":"Question-Answering-Using-Milvus-and-Hugging-Face","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":2,"isActive":false},{"label":"Подготовка данных","href":"Prepare-data","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data","type":2,"isActive":false},{"label":"Задавайте вопросы","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.md b/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.md new file mode 100644 index 000000000..a249b84ef --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_hugging-face.md @@ -0,0 +1,246 @@ +--- +id: integrate_with_hugging-face.md +summary: >- + В этом руководстве показано, как построить систему ответов на вопросы, + используя Hugging Face в качестве загрузчика данных и генератора вкраплений + для обработки данных и Milvus в качестве векторной базы данных для + семантического поиска. +title: Ответы на вопросы с помощью Milvus и обнимающихся лиц +--- +

    Ответы на вопросы с помощью Milvus и обнимающихся лиц

    Open In Colab +GitHub Repository

    +

    Система ответов на вопросы, основанная на семантическом поиске, работает путем поиска наиболее похожего вопроса из набора пар "вопрос-ответ" для заданного вопроса. После определения наиболее похожего вопроса соответствующий ответ из набора данных рассматривается как ответ на запрос. Этот подход опирается на меры семантического сходства для определения сходства между вопросами и извлечения соответствующих ответов.

    +

    В этом руководстве показано, как создать систему ответов на вопросы, используя Hugging Face в качестве загрузчика данных и генератора вкраплений для обработки данных и Milvus в качестве векторной базы данных для семантического поиска.

    +

    Прежде чем начать

    Вам необходимо убедиться, что все необходимые зависимости установлены:

    +
      +
    • pymilvus: пакет python работает с сервисом векторной базы данных на базе Milvus или Zilliz Cloud.
    • +
    • datasets, transformers: пакеты Hugging Face управляют данными и используют модели.
    • +
    • torch: мощная библиотека обеспечивает эффективные тензорные вычисления и инструменты глубокого обучения.
    • +
    +
    $ pip install --upgrade pymilvus transformers datasets torch
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения. (Нажмите на меню "Время выполнения" в верхней части экрана и выберите "Перезапустить сеанс" из выпадающего меню).

    +
    +

    Подготовка данных

    В этом разделе мы загрузим примеры пар "вопрос-ответ" из набора данных Hugging Face Datasets. В качестве демонстрации мы берем только частичные данные из валидационного сплита SQuAD.

    +
    from datasets import load_dataset
    +
    +
    +DATASET = "squad"  # Name of dataset from HuggingFace Datasets
    +INSERT_RATIO = 0.001  # Ratio of example dataset to be inserted
    +
    +data = load_dataset(DATASET, split="validation")
    +# Generates a fixed subset. To generate a random subset, remove the seed.
    +data = data.train_test_split(test_size=INSERT_RATIO, seed=42)["test"]
    +# Clean up the data structure in the dataset.
    +data = data.map(
    +    lambda val: {"answer": val["answers"]["text"][0]},
    +    remove_columns=["id", "answers", "context"],
    +)
    +
    +# View summary of example data
    +print(data)
    +
    +
    Dataset({
    +    features: ['title', 'question', 'answer'],
    +    num_rows: 11
    +})
    +
    +

    Чтобы сгенерировать вкрапления для вопросов, вы можете выбрать модель вкрапления текста из Hugging Face Models. В этом руководстве в качестве примера мы будем использовать небольшую модель встраивания предложений all-MiniLM-L6-v2.

    +
    from transformers import AutoTokenizer, AutoModel
    +import torch
    +
    +MODEL = (
    +    "sentence-transformers/all-MiniLM-L6-v2"  # Name of model from HuggingFace Models
    +)
    +INFERENCE_BATCH_SIZE = 64  # Batch size of model inference
    +
    +# Load tokenizer & model from HuggingFace Hub
    +tokenizer = AutoTokenizer.from_pretrained(MODEL)
    +model = AutoModel.from_pretrained(MODEL)
    +
    +
    +def encode_text(batch):
    +    # Tokenize sentences
    +    encoded_input = tokenizer(
    +        batch["question"], padding=True, truncation=True, return_tensors="pt"
    +    )
    +
    +    # Compute token embeddings
    +    with torch.no_grad():
    +        model_output = model(**encoded_input)
    +
    +    # Perform pooling
    +    token_embeddings = model_output[0]
    +    attention_mask = encoded_input["attention_mask"]
    +    input_mask_expanded = (
    +        attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    +    )
    +    sentence_embeddings = torch.sum(
    +        token_embeddings * input_mask_expanded, 1
    +    ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
    +
    +    # Normalize embeddings
    +    batch["question_embedding"] = torch.nn.functional.normalize(
    +        sentence_embeddings, p=2, dim=1
    +    )
    +    return batch
    +
    +
    +data = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)
    +data_list = data.to_list()
    +
    +

    Вставка данных

    Теперь у нас есть готовые пары "вопрос-ответ" с вкраплениями вопросов. Следующий шаг - вставить их в векторную базу данных.

    +

    Сначала нам нужно подключиться к сервису Milvus и создать коллекцию Milvus.

    +
    from pymilvus import MilvusClient
    +
    +
    +MILVUS_URI = "./huggingface_milvus_test.db"  # Connection URI
    +COLLECTION_NAME = "huggingface_test"  # Collection name
    +DIMENSION = 384  # Embedding dimension depending on model
    +
    +milvus_client = MilvusClient(MILVUS_URI)
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    dimension=DIMENSION,
    +    auto_id=True,  # Enable auto id
    +    enable_dynamic_field=True,  # Enable dynamic fields
    +    vector_field_name="question_embedding",  # Map vector field name and embedding column in dataset
    +    consistency_level="Strong",  # To enable search with latest data
    +)
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Вставьте все данные в коллекцию:

    +
    milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)
    +
    +
    {'insert_count': 11,
    + 'ids': [450072488481390592, 450072488481390593, 450072488481390594, 450072488481390595, 450072488481390596, 450072488481390597, 450072488481390598, 450072488481390599, 450072488481390600, 450072488481390601, 450072488481390602],
    + 'cost': 0}
    +
    +

    Задавайте вопросы

    После того как все данные вставлены в Milvus, мы можем задать вопросы и посмотреть, какие ответы наиболее близки.

    +
    questions = {
    +    "question": [
    +        "What is LGM?",
    +        "When did Massachusetts first mandate that children be educated in schools?",
    +    ]
    +}
    +
    +# Generate question embeddings
    +question_embeddings = [v.tolist() for v in encode_text(questions)["question_embedding"]]
    +
    +# Search across Milvus
    +search_results = milvus_client.search(
    +    collection_name=COLLECTION_NAME,
    +    data=question_embeddings,
    +    limit=3,  # How many search results to output
    +    output_fields=["answer", "question"],  # Include these fields in search results
    +)
    +
    +# Print out results
    +for q, res in zip(questions["question"], search_results):
    +    print("Question:", q)
    +    for r in res:
    +        print(
    +            {
    +                "answer": r["entity"]["answer"],
    +                "score": r["distance"],
    +                "original question": r["entity"]["question"],
    +            }
    +        )
    +    print("\n")
    +
    +
    Question: What is LGM?
    +{'answer': 'Last Glacial Maximum', 'score': 0.956273078918457, 'original question': 'What does LGM stands for?'}
    +{'answer': 'coordinate the response to the embargo', 'score': 0.2120140939950943, 'original question': 'Why was this short termed organization created?'}
    +{'answer': '"Reducibility Among Combinatorial Problems"', 'score': 0.1945795714855194, 'original question': 'What is the paper written by Richard Karp in 1972 that ushered in a new era of understanding between intractability and NP-complete problems?'}
    +
    +
    +Question: When did Massachusetts first mandate that children be educated in schools?
    +{'answer': '1852', 'score': 0.9709997177124023, 'original question': 'In what year did Massachusetts first require children to be educated in schools?'}
    +{'answer': 'several regional colleges and universities', 'score': 0.34164726734161377, 'original question': 'In 1890, who did the university decide to team up with?'}
    +{'answer': '1962', 'score': 0.1931006908416748, 'original question': 'When were stromules discovered?'}
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_jina.json b/localization/v2.5.x/site/ru/integrations/integrate_with_jina.json new file mode 100644 index 000000000..6a6ce3b26 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_jina.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n$ pip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=1024\n)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information retrieval is the process of finding relevant information from a large collection of data or documents.\"\n\nqvecs = ef.encode_queries([query]) # This method uses `retrieval.query` as the task\ndvecs = ef.encode_documents([doc]) # This method uses `retrieval.passage` as the task\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-de\", jina_api_key)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden.\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-code\", jina_api_key)\n\n# Case1: Enhanced Code Navigation\n# query: text description of the functionality\n# document: relevant code snippet\n\nquery = \"function to calculate average in Python.\"\ndoc = \"\"\"\ndef calculate_average(numbers):\n total = sum(numbers)\n count = len(numbers)\n return total / count\n\"\"\"\n\n# Case2: Streamlined Code Review\n# query: text description of the programming concept\n# document: relevante code snippet or PR\n\nquery = \"pull quest related to Collection\"\ndoc = \"fix:[restful v2] parameters of create collection ...\"\n\n# Case3: Automatic Documentation Assistance\n# query: code snippet you need explanation\n# document: relevante document or DocsString\n\nquery = \"What is Collection in Milvus\"\ndoc = \"\"\"\nIn Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.\nMilvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.\n\"\"\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\nfrom pymilvus import MilvusClient\n\njina_api_key = \"\"\nDIMENSION = 1024 # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. \nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=DIMENSION,\n)\n\n\ndoc = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\ndvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task\n\ndata = [\n {\"id\": i, \"vector\": dvecs[i], \"text\": doc[i], \"subject\": \"history\"}\n for i in range(len(dvecs))\n]\n\nmilvus_client = MilvusClient(\"./milvus_jina_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\nres = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)\n\nprint(res[\"insert_count\"])\n","queries = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\nqvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=[qvecs[0]], # query vectors\n limit=3, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)[0]\n\nfor result in res:\n print(result)\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_api_key = \"\"\n\nrf = JinaRerankFunction(\"jina-reranker-v1-base-en\", jina_api_key)\n\nquery = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\nrf(query, documents)\n"],"headingContent":"Integrate Milvus with Jina AI","anchorList":[{"label":"Интеграция Milvus с Jina AI","href":"Integrate-Milvus-with-Jina-AI","type":1,"isActive":false},{"label":"Кто такая Jina AI","href":"Who-is-Jina-AI","type":2,"isActive":false},{"label":"Встраивание Milvus и Jina AI","href":"Milvus-and-Jina-AIs-Embedding","type":2,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false},{"label":"Встраивание общего назначения","href":"General-Purpose-Embedding","type":2,"isActive":false},{"label":"Двуязычные вкрапления","href":"Bilingual-Embeddings","type":2,"isActive":false},{"label":"Встраивание кода","href":"Code-Embeddings","type":2,"isActive":false},{"label":"Семантический поиск с Jina & Milvus","href":"Semantic-Search-with-Jina--Milvus","type":2,"isActive":false},{"label":"Jina Reranker","href":"Jina-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_jina.md b/localization/v2.5.x/site/ru/integrations/integrate_with_jina.md new file mode 100644 index 000000000..1b11ded5a --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_jina.md @@ -0,0 +1,307 @@ +--- +id: integrate_with_jina.md +summary: >- + В этом руководстве показано, как использовать вкрапления Jina и Milvus для + решения задач поиска и извлечения информации по сходству. +title: Интеграция Milvus с Jina +--- +

    Интеграция Milvus с Jina AI

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как использовать вкрапления Jina AI и Milvus для решения задач поиска и извлечения информации по сходству.

    +

    Кто такая Jina AI

    Jina AI, основанная в 2020 году в Берлине, является передовой компанией в области искусственного интеллекта, нацеленной на революцию в будущем искусственного интеллекта благодаря своей поисковой базе. Специализируясь на мультимодальном искусственном интеллекте, Jina AI стремится предоставить предприятиям и разработчикам возможность использовать мощь мультимодальных данных для создания стоимости и снижения затрат с помощью интегрированного набора компонентов, включая встраивания, ретрансляторы, оперативное управление и основную инфраструктуру. Передовые встраивания Jina AI отличаются высочайшей производительностью и имеют модель длиной 8192 токена, идеально подходящую для комплексного представления данных. Благодаря многоязыковой поддержке и бесшовной интеграции с ведущими платформами, такими как OpenAI, эти вставки облегчают работу с кросс-языковыми приложениями.

    +

    Встраивание Milvus и Jina AI

    Для эффективного хранения и поиска этих вкраплений с точки зрения скорости и масштаба требуется специальная инфраструктура, разработанная для этой цели. Milvus - это широко известная передовая векторная база данных с открытым исходным кодом, способная работать с крупными векторными данными. Milvus обеспечивает быстрый и точный поиск векторов (вкраплений) по множеству метрик. Его масштабируемость позволяет легко работать с огромными объемами данных изображений, обеспечивая высокую производительность поисковых операций даже при росте массивов данных.

    +

    Примеры

    Встраивания Jina были интегрированы в библиотеку моделей PyMilvus. Сейчас мы продемонстрируем примеры кода, чтобы показать, как использовать вкрапления Jina в действии.

    +

    Прежде чем мы начнем, нам нужно установить библиотеку моделей для PyMilvus.

    +
    $ pip install -U pymilvus
    +$ pip install "pymilvus[model]"
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения. (Нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Встраивание общего назначения

    Основная модель встраивания Jina AI отлично справляется с пониманием подробного текста, что делает ее идеальной для семантического поиска, классификации контента, поддерживает расширенный анализ настроения, обобщение текста и системы персонализированных рекомендаций.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=1024
    +)
    +
    +query = "what is information retrieval?"
    +doc = "Information retrieval is the process of finding relevant information from a large collection of data or documents."
    +
    +qvecs = ef.encode_queries([query])  # This method uses `retrieval.query` as the task
    +dvecs = ef.encode_documents([doc])  # This method uses `retrieval.passage` as the task
    +
    +

    Двуязычные вкрапления

    Двуязычные модели Jina AI улучшают многоязычные платформы, глобальную поддержку и межъязыковое обнаружение контента. Разработанные для немецко-английских и китайско-английских переводов, они способствуют взаимопониманию между различными языковыми группами, упрощая взаимодействие между языками.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-de", jina_api_key)
    +
    +query = "what is information retrieval?"
    +doc = "Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden."
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    Встраивание кода

    Модель встраивания кода Jina AI обеспечивает возможность поиска по коду и документации. Она поддерживает английский и 30 популярных языков программирования, что может быть использовано для улучшения навигации по коду, упрощения проверки кода и автоматизированной помощи в работе с документацией.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-code", jina_api_key)
    +
    +# Case1: Enhanced Code Navigation
    +# query: text description of the functionality
    +# document: relevant code snippet
    +
    +query = "function to calculate average in Python."
    +doc = """
    +def calculate_average(numbers):
    +    total = sum(numbers)
    +    count = len(numbers)
    +    return total / count
    +"""
    +
    +# Case2: Streamlined Code Review
    +# query: text description of the programming concept
    +# document: relevante code snippet or PR
    +
    +query = "pull quest related to Collection"
    +doc = "fix:[restful v2] parameters of create collection ..."
    +
    +# Case3: Automatic Documentation Assistance
    +# query: code snippet you need explanation
    +# document: relevante document or DocsString
    +
    +query = "What is Collection in Milvus"
    +doc = """
    +In Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.
    +Milvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.
    +"""
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    Семантический поиск с Jina & Milvus

    Благодаря мощной функции векторного встраивания мы можем объединить встраивания, полученные с помощью моделей искусственного интеллекта Jina, с векторной базой данных Milvus Lite для выполнения семантического поиска.

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +from pymilvus import MilvusClient
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +DIMENSION = 1024  # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. 
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=DIMENSION,
    +)
    +
    +
    +doc = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +dvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task
    +
    +data = [
    +    {"id": i, "vector": dvecs[i], "text": doc[i], "subject": "history"}
    +    for i in range(len(dvecs))
    +]
    +
    +milvus_client = MilvusClient("./milvus_jina_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +res = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Теперь, когда все данные находятся в векторной базе Milvus, мы можем выполнить семантический поиск, сгенерировав векторное вложение для запроса и выполнив векторный поиск.

    +
    queries = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +qvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=[qvecs[0]],  # query vectors
    +    limit=3,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)[0]
    +
    +for result in res:
    +    print(result)
    +
    +
    {'id': 1, 'distance': 0.8802614808082581, 'entity': {'text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", 'subject': 'history'}}
    +
    +

    Jina Reranker

    Jina Ai также предоставляет реранкеры для дальнейшего повышения качества поиска после использования вкраплений.

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +
    +rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)
    +
    +query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +rf(query, documents)
    +
    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9370958209037781, index=1),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.35420963168144226, index=3),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.3498658835887909, index=0),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.2728956639766693, index=2)]
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.json b/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.json new file mode 100644 index 000000000..812d92f98 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade\n","import os\n\n# Get keys for your project from the project settings page\n# https://cloud.langfuse.com\nos.environ[\"LANGFUSE_PUBLIC_KEY\"] = \"\"\nos.environ[\"LANGFUSE_SECRET_KEY\"] = \"\"\nos.environ[\"LANGFUSE_HOST\"] = \"https://cloud.langfuse.com\" # 🇪🇺 EU region\n# os.environ[\"LANGFUSE_HOST\"] = \"https://us.cloud.langfuse.com\" # 🇺🇸 US region\n\n# Your openai key\nos.environ[\"OPENAI_API_KEY\"] = \"\"\n","from llama_index.core import Settings\nfrom llama_index.core.callbacks import CallbackManager\nfrom langfuse.llama_index import LlamaIndexCallbackHandler\n \nlangfuse_callback_handler = LlamaIndexCallbackHandler()\nSettings.callback_manager = CallbackManager([langfuse_callback_handler])\n","from llama_index.core import Document\n\ndoc1 = Document(text=\"\"\"\nMaxwell \"Max\" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.\n\"\"\")\ndoc2 = Document(text=\"\"\"\nThroughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are \"Fleeting Echoes,\" \"Halcyon Dusk,\" and the Academy Award-winning sci-fi epic, \"Event Horizon's Brink.\" His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.\n\"\"\")\n","# Example index construction + LLM query\n\nfrom llama_index.core import VectorStoreIndex\nfrom llama_index.core import StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(\n uri=\"tmp/milvus_demo.db\", dim=1536, overwrite=False\n)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\nindex = VectorStoreIndex.from_documents(\n [doc1,doc2], storage_context=storage_context\n)\n","# Query\nresponse = index.as_query_engine().query(\"What did he do growing up?\")\nprint(response)\n","# Chat\nresponse = index.as_chat_engine().chat(\"What did he do growing up?\")\nprint(response)\n","# As we want to immediately see result in Langfuse, we need to flush the callback handler\nlangfuse_callback_handler.flush()\n"],"headingContent":"Using Langfuse to Trace Queries in RAG","anchorList":[{"label":"Использование Langfuse для трассировки запросов в RAG","href":"Using-Langfuse-to-Trace-Queries-in-RAG","type":1,"isActive":false},{"label":"Установка","href":"Setup","type":2,"isActive":false},{"label":"Индекс с помощью Milvus Lite","href":"Index-using-Milvus-Lite","type":2,"isActive":false},{"label":"Запрос","href":"Query","type":2,"isActive":false},{"label":"Исследуйте трассы в Langfuse","href":"Explore-traces-in-Langfuse","type":2,"isActive":false},{"label":"Интересуетесь более продвинутыми возможностями?","href":"Interested-in-more-advanced-features","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.md b/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.md new file mode 100644 index 000000000..1f3cf9e36 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_langfuse.md @@ -0,0 +1,180 @@ +--- +id: integrate_with_langfuse.md +summary: >- + Это простая поваренная книга, демонстрирующая, как использовать интеграцию + LlamaIndex Langfuse. Она использует Milvus Lite для хранения документов и + запросов. +title: Использование Langfuse для оценки качества RAG +--- +

    Использование Langfuse для трассировки запросов в RAG

    +Open In Colab +

    +

    Это простая поваренная книга, демонстрирующая, как использовать Langfuse для трассировки запросов в RAG. Конвейер RAG реализован с помощью LlamaIndex и Milvus Lite для хранения и получения документов.

    +

    В этом кратком руководстве мы покажем вам, как настроить приложение LlamaIndex, используя Milvus Lite в качестве хранилища векторов. Мы также покажем вам, как использовать интеграцию LlamaIndex с Langfuse для отслеживания вашего приложения.

    +

    Langfuse - это инженерная платформа LLM с открытым исходным кодом, которая помогает командам совместно отлаживать, анализировать и дорабатывать свои LLM-приложения. Все функции платформы интегрированы для ускорения рабочего процесса разработки.

    +

    Milvus Lite - это облегченная версия Milvus, векторной базы данных с открытым исходным кодом, которая обеспечивает работу приложений искусственного интеллекта с помощью векторных вкраплений и поиска сходства.

    +

    Установка

    Убедитесь, что у вас установлены llama-index и langfuse.

    +
    $ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade
    +
    +

    Инициализируйте интеграцию. Получите ключи API из настроек проекта Langfuse и замените public_key secret_key на значения ваших ключей. Этот пример использует OpenAI для встраивания и завершения чата, поэтому вам также нужно указать ключ OpenAI в переменной окружения.

    +
    import os
    +
    +# Get keys for your project from the project settings page
    +# https://cloud.langfuse.com
    +os.environ["LANGFUSE_PUBLIC_KEY"] = ""
    +os.environ["LANGFUSE_SECRET_KEY"] = ""
    +os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # 🇪🇺 EU region
    +# os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # 🇺🇸 US region
    +
    +# Your openai key
    +os.environ["OPENAI_API_KEY"] = ""
    +
    +
    from llama_index.core import Settings
    +from llama_index.core.callbacks import CallbackManager
    +from langfuse.llama_index import LlamaIndexCallbackHandler
    + 
    +langfuse_callback_handler = LlamaIndexCallbackHandler()
    +Settings.callback_manager = CallbackManager([langfuse_callback_handler])
    +
    +

    Индекс с помощью Milvus Lite

    from llama_index.core import Document
    +
    +doc1 = Document(text="""
    +Maxwell "Max" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.
    +""")
    +doc2 = Document(text="""
    +Throughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are "Fleeting Echoes," "Halcyon Dusk," and the Academy Award-winning sci-fi epic, "Event Horizon's Brink." His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.
    +""")
    +
    +
    # Example index construction + LLM query
    +
    +from llama_index.core import VectorStoreIndex
    +from llama_index.core import StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(
    +    uri="tmp/milvus_demo.db", dim=1536, overwrite=False
    +)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +index = VectorStoreIndex.from_documents(
    +    [doc1,doc2], storage_context=storage_context
    +)
    +
    +

    Запрос

    # Query
    +response = index.as_query_engine().query("What did he do growing up?")
    +print(response)
    +
    +
    # Chat
    +response = index.as_chat_engine().chat("What did he do growing up?")
    +print(response)
    +
    +

    Исследуйте трассы в Langfuse

    # As we want to immediately see result in Langfuse, we need to flush the callback handler
    +langfuse_callback_handler.flush()
    +
    +

    Готово! ✨ Вы видите трассировку индекса и запроса в вашем проекте Langfuse.

    +

    Примеры трасс (публичные ссылки):

    +
      +
    1. Запрос
    2. +
    3. Запрос (чат)
    4. +
    +

    Трассировка в Langfuse:

    +

    + + Langfuse Traces + Langfuse Traces

    +

    Интересуетесь более продвинутыми возможностями?

    Ознакомьтесь с полной документацией по интеграции, чтобы узнать больше о расширенных возможностях и о том, как их использовать:

    +
      +
    • Взаимодействие с Langfuse Python SDK и другими интеграциями
    • +
    • Добавление пользовательских метаданных и атрибутов к трассам
    • +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.json b/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.json new file mode 100644 index 000000000..067fa5ee8 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus>=2.4.2\n","$ pip install llama-index-vector-stores-milvus\n","$ pip install llama-index\n","import openai\n\nopenai.api_key = \"sk-***********\"\n","! mkdir -p 'data/'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'\n","from llama_index.core import SimpleDirectoryReader\n\n# load documents\ndocuments = SimpleDirectoryReader(\n input_files=[\"./data/paul_graham_essay.txt\"]\n).load_data()\n\nprint(\"Document ID:\", documents[0].doc_id)\n","# Create an index over the documents\nfrom llama_index.core import VectorStoreIndex, StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\n","query_engine = index.as_query_engine()\nres = query_engine.query(\"What did the author learn?\")\nprint(res)\n","res = query_engine.query(\"What challenges did the disease pose for the author?\")\nprint(res)\n","from llama_index.core import Document\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(\n [Document(text=\"The number that is being searched for is ten.\")],\n storage_context,\n)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"Who is the author?\")\nprint(res)\n","del index, vector_store, storage_context, query_engine\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", overwrite=False)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"What is the number?\")\nprint(res)\n","res = query_engine.query(\"Who is the author?\")\nprint(res)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Load all the two documents loaded before\ndocuments_all = SimpleDirectoryReader(\"./data/\").load_data()\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents_all, storage_context)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"uber_2021.pdf\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"paul_graham_essay.txt\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LlamaIndex","anchorList":[{"label":"Система Retrieval-Augmented Generation (RAG) с Milvus и LlamaIndex","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LlamaIndex","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-begin","type":2,"isActive":false},{"label":"Начало работы","href":"Getting-Started","type":2,"isActive":false},{"label":"Фильтрация метаданных","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.md b/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.md new file mode 100644 index 000000000..061e039d5 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_llamaindex.md @@ -0,0 +1,203 @@ +--- +id: integrate_with_llamaindex.md +summary: >- + В этом руководстве показано, как построить систему Retrieval-Augmented + Generation (RAG) с помощью LlamaIndex и Milvus. +title: Система Retrieval-Augmented Generation (RAG) с Milvus и LlamaIndex +--- +

    Система Retrieval-Augmented Generation (RAG) с Milvus и LlamaIndex

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как построить систему Retrieval-Augmented Generation (RAG) с помощью LlamaIndex и Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает соответствующие документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    LlamaIndex - это простой и гибкий фреймворк для подключения пользовательских источников данных к большим языковым моделям (LLM). Milvus - самая продвинутая в мире база векторных данных с открытым исходным кодом, созданная для поиска сходства встраивания и приложений искусственного интеллекта.

    +

    В этом блокноте мы покажем быструю демонстрацию использования MilvusVectorStore.

    +

    Прежде чем начать

    Установите зависимости

    Сниппеты кода на этой странице требуют наличия зависимостей pymilvus и llamaindex. Вы можете установить их с помощью следующих команд:

    +
    $ pip install pymilvus>=2.4.2
    +
    +
    $ pip install llama-index-vector-stores-milvus
    +
    +
    $ pip install llama-index
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения. (Нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Настройка OpenAI

    Для начала добавим ключ openai api. Это позволит нам получить доступ к chatgpt.

    +
    import openai
    +
    +openai.api_key = "sk-***********"
    +
    +

    Подготовьте данные

    Вы можете загрузить примеры данных с помощью следующих команд:

    +
    ! mkdir -p 'data/'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'
    +
    +

    Начало работы

    Сгенерируйте наши данные

    В качестве первого примера сгенерируем документ из файла paul_graham_essay.txt. Это одно эссе Пола Грэма под названием What I Worked On. Для генерации документов мы будем использовать SimpleDirectoryReader.

    +
    from llama_index.core import SimpleDirectoryReader
    +
    +# load documents
    +documents = SimpleDirectoryReader(
    +    input_files=["./data/paul_graham_essay.txt"]
    +).load_data()
    +
    +print("Document ID:", documents[0].doc_id)
    +
    +
    Document ID: 95f25e4d-f270-4650-87ce-006d69d82033
    +
    +

    Создание индекса по данным

    Теперь, когда у нас есть документ, мы можем создать индекс и вставить его.

    +
    +

    Обратите внимание, что для Milvus Lite требуется pymilvus>=2.4.2.

    +
    +
    # Create an index over the documents
    +from llama_index.core import VectorStoreIndex, StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +
    +
    +

    Для получения параметров MilvusVectorStore:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Запрос данных

    Теперь, когда наш документ хранится в индексе, мы можем задавать вопросы к индексу. Индекс будет использовать хранящиеся в нем данные в качестве базы знаний для chatgpt.

    +
    query_engine = index.as_query_engine()
    +res = query_engine.query("What did the author learn?")
    +print(res)
    +
    +
    The author learned that philosophy courses in college were boring to him, leading him to switch his focus to studying AI.
    +
    +
    res = query_engine.query("What challenges did the disease pose for the author?")
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in her losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    +

    Следующий тест показывает, что перезапись удаляет предыдущие данные.

    +
    from llama_index.core import Document
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(
    +    [Document(text="The number that is being searched for is ten.")],
    +    storage_context,
    +)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    The author is the individual who created the context information.
    +
    +

    Следующий тест показывает добавление дополнительных данных в уже существующий индекс.

    +
    del index, vector_store, storage_context, query_engine
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", overwrite=False)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("What is the number?")
    +print(res)
    +
    +
    The number is ten.
    +
    +
    res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    Paul Graham
    +
    +

    Фильтрация метаданных

    Мы можем генерировать результаты, фильтруя определенные источники. В следующем примере показана загрузка всех документов из каталога и их последующая фильтрация на основе метаданных.

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Load all the two documents loaded before
    +documents_all = SimpleDirectoryReader("./data/").load_data()
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents_all, storage_context)
    +
    +

    Мы хотим получить документы только из файла uber_2021.pdf.

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="uber_2021.pdf")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges related to the adverse impact on the business and operations, including reduced demand for Mobility offerings globally, affecting travel behavior and demand. Additionally, the pandemic led to driver supply constraints, impacted by concerns regarding COVID-19, with uncertainties about when supply levels would return to normal. The rise of the Omicron variant further affected travel, resulting in advisories and restrictions that could adversely impact both driver supply and consumer demand for Mobility offerings.
    +
    +

    В этот раз мы получаем другой результат при извлечении из файла paul_graham_essay.txt.

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="paul_graham_essay.txt")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in his mother losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.json b/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.json new file mode 100644 index 000000000..3d3a2f572 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.json @@ -0,0 +1 @@ +{"codeList":["$ pip install 'pymemgpt[milvus]'\n","$ memgpt configure\n","...\n? Select storage backend for archival data: milvus\n? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db\n","# we're saving the file as \"memgpt_research_paper.pdf\"\n$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf\n","$ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf\n","Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00, 3.94file/s]\nLoaded 74 passages and 13 documents from memgpt_research_paper\n","# reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona\n$ memgpt run --persona memgpt_doc\n","? Would you like to select an existing agent? No\n\n🧬 Creating new agent...\n-> 🤖 Using persona profile: 'sam_pov'\n-> 🧑 Using human profile: 'basic'\n🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)\n\nHit enter to begin (will request first MemGPT message)\n\n💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.\n🤖 Greetings Chad! I'm MemGPT. How may I assist you today?\n\n> Enter your message: /attach\n? Select data source memgpt_research_paper\n100%|███████████████████████████████████| 1/1 [00:00<00:00, 4.81it/s]\n","> Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?\n\n💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive\nunderstanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.\n⚡🧠 [function] searching memory with archival_memory_search\n💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within\nthe LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.\n🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern \nLarge Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision \nof extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context \nbaselines in deep memory retrieval and it's able to analyze large documents with precision.\n\n"],"headingContent":"MemGPT with Milvus Integration","anchorList":[{"label":"MemGPT с интеграцией Milvus","href":"MemGPT-with-Milvus-Integration","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration","type":2,"isActive":false},{"label":"Создание внешнего источника данных","href":"Creating-an-external-data-source","type":2,"isActive":false},{"label":"Прикрепление источника данных к агенту MemGPT","href":"Attaching-the-data-source-to-a-MemGPT-agent","type":2,"isActive":false},{"label":"Тестирование нашего нового чатбота","href":"Testing-out-our-new-chatbot","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.md b/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.md new file mode 100644 index 000000000..70cd97f79 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_memgpt.md @@ -0,0 +1,145 @@ +--- +id: integrate_with_memgpt.md +summary: >- + MemGPT упрощает создание и развертывание агентов LLM с поддержкой состояния. + Благодаря интеграции с Milvus вы можете создавать агенты с подключением к + внешним источникам данных (RAG). +title: MemGPT с интеграцией Milvus +--- +

    MemGPT с интеграцией Milvus

    MemGPT упрощает создание и развертывание агентов LLM с поддержкой состояния. Благодаря интеграции с Milvus вы можете создавать агентов с подключением к внешним источникам данных (RAG).

    +

    В этом примере мы будем использовать MemGPT для общения с пользовательским источником данных, который хранится в Milvus.

    +

    Конфигурация

    Чтобы запустить MemGPT, необходимо убедиться, что версия Python >= 3.10.

    +

    Чтобы включить бэкенд Milvus, убедитесь, что установили необходимые зависимости:

    +
    $ pip install 'pymemgpt[milvus]'
    +
    +

    Вы можете настроить подключение Milvus с помощью команды

    +
    $ memgpt configure
    +
    +
    ...
    +? Select storage backend for archival data: milvus
    +? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db
    +
    +

    Достаточно указать URI на путь к локальному файлу, например, ~/.memgpt/milvus.db, что автоматически вызовет локальный экземпляр сервиса Milvus через Milvus Lite.

    +

    Если у вас большой объем данных, например, более миллиона документов, мы рекомендуем установить более производительный сервер Milvus на docker или kubenetes. В этом случае URI должен быть URI сервера, например, http://localhost:19530.

    +

    Создание внешнего источника данных

    Чтобы передать внешние данные в чатбот MemGPT, нам сначала нужно создать источник данных.

    +

    Для загрузки исследовательской работы MemGPT мы используем curl (вы также можете просто загрузить PDF-файл из браузера):

    +
    # we're saving the file as "memgpt_research_paper.pdf"
    +$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf
    +
    +

    Теперь, когда статья загружена, мы можем создать источник данных MemGPT с помощью memgpt load:

    +
    $ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf
    +
    +
    Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  3.94file/s]
    +Loaded 74 passages and 13 documents from memgpt_research_paper
    +
    +

    Прикрепление источника данных к агенту MemGPT

    Теперь, когда мы создали этот источник данных, мы можем в любой момент прикрепить его к чатботу MemGPT.

    +

    Давайте создадим новый чатбот, используя персону memgpt_doc (но вы можете использовать любую персону):

    +
    # reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona
    +$ memgpt run --persona memgpt_doc
    +
    +

    Как только мы начнем общаться с агентом, мы сможем "прикрепить" источник данных к архивной памяти агента:

    +
    ? Would you like to select an existing agent? No
    +
    +🧬 Creating new agent...
    +->  🤖 Using persona profile: 'sam_pov'
    +->  🧑 Using human profile: 'basic'
    +🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)
    +
    +Hit enter to begin (will request first MemGPT message)
    +
    +💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.
    +🤖 Greetings Chad! I'm MemGPT. How may I assist you today?
    +
    +> Enter your message: /attach
    +? Select data source memgpt_research_paper
    +100%|███████████████████████████████████| 1/1 [00:00<00:00,  4.81it/s]
    +
    +

    Тестирование нашего нового чатбота

    Теперь, когда данные загружены в память чатбота, мы можем начать задавать вопросы о них:

    +
    > Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?
    +
    +💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive
    +understanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.
    +⚡🧠 [function] searching memory with archival_memory_search
    +💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within
    +the LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.
    +🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern 
    +Large Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision 
    +of extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context 
    +baselines in deep memory retrieval and it's able to analyze large documents with precision.
    +
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_openai.json b/localization/v2.5.x/site/ru/integrations/integrate_with_openai.json new file mode 100644 index 000000000..acd18c894 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade openai pymilvus\n","from openai import OpenAI\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"text-embedding-3-small\" # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models\nDIMENSION = 1536 # Dimension of vector embedding\n\n# Connect to OpenAI with API Key.\nopenai_client = OpenAI(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data\n]\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_openai_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_openai_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data\n]\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n","[\n {\n \"id\": 0,\n \"distance\": -0.772376537322998,\n \"entity\": {\n \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"subject\": \"history\",\n },\n },\n {\n \"id\": 1,\n \"distance\": -0.58596271276474,\n \"entity\": {\n \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"subject\": \"history\",\n },\n },\n]\n"],"headingContent":"Semantic Search with Milvus and OpenAI","anchorList":[{"label":"Семантический поиск с помощью Milvus и OpenAI","href":"Semantic-Search-with-Milvus-and-OpenAI","type":1,"isActive":false},{"label":"Начало работы","href":"Getting-started","type":2,"isActive":false},{"label":"Поиск названий книг с помощью OpenAI и Milvus","href":"Searching-book-titles-with-OpenAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_openai.md b/localization/v2.5.x/site/ru/integrations/integrate_with_openai.md new file mode 100644 index 000000000..f572c8e31 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_openai.md @@ -0,0 +1,157 @@ +--- +id: integrate_with_openai.md +title: Семантический поиск с помощью Milvus и OpenAI +summary: >- + На этой странице обсуждается интеграция векторной базы данных с API + встраивания OpenAI. +--- +

    Семантический поиск с помощью Milvus и OpenAI

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как OpenAI's Embedding API может быть использован с векторной базой данных Milvus для проведения семантического поиска по тексту.

    +

    Начало работы

    Прежде чем начать, убедитесь, что у вас готов ключ OpenAI API, или получите его на сайте OpenAI.

    +

    В этом примере используются данные о названиях книг. Вы можете скачать набор данных здесь и поместить его в ту же директорию, где вы запускаете следующий код.

    +

    Сначала установите пакет для Milvus и OpenAI:

    +
    pip install --upgrade openai pymilvus
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам, возможно, придется перезапустить среду выполнения. (Нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    После этого мы готовы генерировать вкрапления и использовать векторную базу данных для проведения семантического поиска.

    +

    Поиск названий книг с помощью OpenAI и Milvus

    В следующем примере мы загружаем данные о названиях книг из загруженного CSV-файла, используем модель встраивания OpenAI для генерации векторных представлений и сохраняем их в векторной базе данных Milvus для семантического поиска.

    +
    from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "text-embedding-3-small"  # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models
    +DIMENSION = 1536  # Dimension of vector embedding
    +
    +# Connect to OpenAI with API Key.
    +openai_client = OpenAI(api_key="<YOUR_OPENAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data
    +]
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_openai_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_openai_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Теперь, когда все данные находятся в векторной базе Milvus, мы можем выполнить семантический поиск, сгенерировав векторное вложение для запроса и выполнив векторный поиск.

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data
    +]
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +

    На выходе вы должны увидеть следующее:

    +
    [
    +    {
    +        "id": 0,
    +        "distance": -0.772376537322998,
    +        "entity": {
    +            "text": "Artificial intelligence was founded as an academic discipline in 1956.",
    +            "subject": "history",
    +        },
    +    },
    +    {
    +        "id": 1,
    +        "distance": -0.58596271276474,
    +        "entity": {
    +            "text": "Alan Turing was the first person to conduct substantial research in AI.",
    +            "subject": "history",
    +        },
    +    },
    +]
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.json b/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.json new file mode 100644 index 000000000..d856a0490 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus torch gdown torchvision tqdm\n","import gdown\nimport zipfile\n\nurl = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'\noutput = './paintings.zip'\ngdown.download(url, output)\n\nwith zipfile.ZipFile(\"./paintings.zip\",\"r\") as zip_ref:\n zip_ref.extractall(\"./paintings\")\n","# Milvus Setup Arguments\nCOLLECTION_NAME = 'image_search' # Collection name\nDIMENSION = 2048 # Embedding vector size in this example\nMILVUS_HOST = \"localhost\"\nMILVUS_PORT = \"19530\"\n\n# Inference Arguments\nBATCH_SIZE = 128\nTOP_K = 3\n","from pymilvus import connections\n\n# Connect to the instance\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n","from pymilvus import utility\n\n# Remove any previous collections with the same name\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n","from pymilvus import FieldSchema, CollectionSchema, DataType, Collection\n\n# Create collection which includes the id, filepath of the image, and image embedding\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200), # VARCHARS need a maximum length, so for this example they are set to 200 characters\n FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n","# Create an AutoIndex index for collection\nindex_params = {\n'metric_type':'L2',\n'index_type':\"IVF_FLAT\",\n'params':{'nlist': 16384}\n}\ncollection.create_index(field_name=\"image_embedding\", index_params=index_params)\ncollection.load()\n","import glob\n\n# Get the filepaths of the images\npaths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)\nlen(paths)\n","import torch\n\n# Load the embedding model with the last layer removed\nmodel = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\nmodel = torch.nn.Sequential(*(list(model.children())[:-1]))\nmodel.eval()\n","from torchvision import transforms\n\n# Preprocessing for images\npreprocess = transforms.Compose([\n transforms.Resize(256),\n transforms.CenterCrop(224),\n transforms.ToTensor(),\n transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n","from PIL import Image\nfrom tqdm import tqdm\n\n# Embed function that embeds the batch and inserts it\ndef embed(data):\n with torch.no_grad():\n output = model(torch.stack(data[0])).squeeze()\n collection.insert([data[1], output.tolist()])\n\ndata_batch = [[],[]]\n\n# Read the images into batches for embedding and insertion\nfor path in tqdm(paths):\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n if len(data_batch[0]) % BATCH_SIZE == 0:\n embed(data_batch)\n data_batch = [[],[]]\n\n# Embed and insert the remainder\nif len(data_batch[0]) != 0:\n embed(data_batch)\n\n# Call a flush to index any unsealed segments.\ncollection.flush()\n","import glob\n\n# Get the filepaths of the search images\nsearch_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)\nlen(search_paths)\n","import time\nfrom matplotlib import pyplot as plt\n\n# Embed the search images\ndef embed(data):\n with torch.no_grad():\n ret = model(torch.stack(data))\n # If more than one image, use squeeze\n if len(ret) > 1:\n return ret.squeeze().tolist()\n # Squeeze would remove batch for single image, so using flatten\n else:\n return torch.flatten(ret, start_dim=1).tolist()\n\ndata_batch = [[],[]]\n\nfor path in search_paths:\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n\nembeds = embed(data_batch[0])\nstart = time.time()\nres = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])\nfinish = time.time()\n","# Show the image results\nf, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)\n\nfor hits_i, hits in enumerate(res):\n axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))\n axarr[hits_i][0].set_axis_off()\n axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))\n for hit_i, hit in enumerate(hits):\n axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))\n axarr[hits_i][hit_i + 1].set_axis_off()\n axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))\n\n# Save the search result in a separate image file alongside your script.\nplt.savefig('search_result.png')\n"],"headingContent":"Image Search with PyTorch and Milvus","anchorList":[{"label":"Поиск изображений с помощью PyTorch и Milvus","href":"Image-Search-with-PyTorch-and-Milvus","type":1,"isActive":false},{"label":"Установка требований","href":"Installing-the-requirements","type":2,"isActive":false},{"label":"Захват данных","href":"Grabbing-the-data","type":2,"isActive":false},{"label":"Глобальные аргументы","href":"Global-Arguments","type":2,"isActive":false},{"label":"Настройка Milvus","href":"Setting-up-Milvus","type":2,"isActive":false},{"label":"Вставка данных","href":"Inserting-the-data","type":2,"isActive":false},{"label":"Выполнение поиска","href":"Performing-the-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.md b/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.md new file mode 100644 index 000000000..3417760ac --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_pytorch.md @@ -0,0 +1,299 @@ +--- +id: integrate_with_pytorch.md +summary: >- + На этой странице показано, как построить поиск изображений с помощью PyTorch и + Milvus. +title: Поиск изображений с помощью PyTorch и Milvus +--- +

    Поиск изображений с помощью PyTorch и Milvus

    В этом руководстве представлен пример интеграции PyTorch и Milvus для выполнения поиска по изображениям с использованием вкраплений. PyTorch - это мощный фреймворк глубокого обучения с открытым исходным кодом, широко используемый для построения и развертывания моделей машинного обучения. В этом примере мы используем библиотеку Torchvision и предварительно обученную модель ResNet50 для создания векторов признаков (вкраплений), которые представляют содержимое изображений. Эти вкрапления будут храниться в Milvus, высокопроизводительной базе данных векторов, чтобы обеспечить эффективный поиск по сходству. В качестве базы данных используется набор данных Impressionist-Classifier Dataset от Kaggle. Сочетая возможности глубокого обучения PyTorch с масштабируемой поисковой функциональностью Milvus, этот пример демонстрирует, как создать надежную и эффективную систему поиска изображений.

    +

    Давайте приступим!

    +

    Установка требований

    В этом примере мы будем использовать pymilvus для подключения к Milvus, torch для запуска модели встраивания, torchvision для собственно модели и препроцессинга, gdown для загрузки набора данных примера и tqdm для загрузки баров.

    +
    pip install pymilvus torch gdown torchvision tqdm
    +
    +

    Захват данных

    Мы используем gdown для захвата zip-архива с Google Drive и последующей его распаковки с помощью встроенной библиотеки zipfile.

    +
    import gdown
    +import zipfile
    +
    +url = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'
    +output = './paintings.zip'
    +gdown.download(url, output)
    +
    +with zipfile.ZipFile("./paintings.zip","r") as zip_ref:
    +    zip_ref.extractall("./paintings")
    +
    +
    +

    Размер набора данных составляет 2,35 ГБ, а время, затраченное на его загрузку, зависит от состояния вашей сети.

    +
    +

    Глобальные аргументы

    Вот некоторые из основных глобальных аргументов, которые мы будем использовать для более удобного отслеживания и обновления.

    +
    # Milvus Setup Arguments
    +COLLECTION_NAME = 'image_search'  # Collection name
    +DIMENSION = 2048  # Embedding vector size in this example
    +MILVUS_HOST = "localhost"
    +MILVUS_PORT = "19530"
    +
    +# Inference Arguments
    +BATCH_SIZE = 128
    +TOP_K = 3
    +
    +

    Настройка Milvus

    На данном этапе мы приступим к настройке Milvus. Для этого необходимо выполнить следующие шаги:

    +
      +
    1. Подключитесь к экземпляру Milvus, используя предоставленный URI.

      +
      from pymilvus import connections
      +
      +# Connect to the instance
      +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
      +
    2. +
    3. Если коллекция уже существует, удалите ее.

      +
      from pymilvus import utility
      +
      +# Remove any previous collections with the same name
      +if utility.has_collection(COLLECTION_NAME):
      +    utility.drop_collection(COLLECTION_NAME)
      +
    4. +
    5. Создайте коллекцию, содержащую идентификатор, путь к файлу изображения и его вставку.

      +
      from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
      +
      +# Create collection which includes the id, filepath of the image, and image embedding
      +fields = [
      +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
      +    FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200),  # VARCHARS need a maximum length, so for this example they are set to 200 characters
      +    FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
      +]
      +schema = CollectionSchema(fields=fields)
      +collection = Collection(name=COLLECTION_NAME, schema=schema)
      +
    6. +
    7. Создайте индекс на только что созданной коллекции и загрузите ее в память.

      +
      # Create an AutoIndex index for collection
      +index_params = {
      +'metric_type':'L2',
      +'index_type':"IVF_FLAT",
      +'params':{'nlist': 16384}
      +}
      +collection.create_index(field_name="image_embedding", index_params=index_params)
      +collection.load()
      +
    8. +
    +

    После выполнения этих действий коллекция будет готова к вставке и поиску. Все добавленные данные будут автоматически проиндексированы и сразу же станут доступны для поиска. Если данные очень свежие, поиск может быть медленнее, так как для данных, которые еще находятся в процессе индексирования, будет использоваться грубая сила.

    +

    Вставка данных

    Для этого примера мы будем использовать модель ResNet50, предоставленную сайтом torch и его центром моделей. Чтобы получить вкрапления, мы убираем последний слой классификации, в результате чего модель дает нам вкрапления 2048 измерений. Все модели зрения, найденные на сайте torch, используют ту же самую предварительную обработку, которую мы включили сюда.

    +

    На следующих шагах мы выполним следующие действия:

    +
      +
    1. Загрузим данные.

      +
      import glob
      +
      +# Get the filepaths of the images
      +paths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)
      +len(paths)
      +
    2. +
    3. Предварительная обработка данных.

      +
      import torch
      +
      +# Load the embedding model with the last layer removed
      +model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
      +model = torch.nn.Sequential(*(list(model.children())[:-1]))
      +model.eval()
      +
    4. +
    5. Встраивание данных.

      +
      from torchvision import transforms
      +
      +# Preprocessing for images
      +preprocess = transforms.Compose([
      +    transforms.Resize(256),
      +    transforms.CenterCrop(224),
      +    transforms.ToTensor(),
      +    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      +])
      +
    6. +
    7. Вставка данных.

      +
      from PIL import Image
      +from tqdm import tqdm
      +
      +# Embed function that embeds the batch and inserts it
      +def embed(data):
      +    with torch.no_grad():
      +        output = model(torch.stack(data[0])).squeeze()
      +        collection.insert([data[1], output.tolist()])
      +
      +data_batch = [[],[]]
      +
      +# Read the images into batches for embedding and insertion
      +for path in tqdm(paths):
      +    im = Image.open(path).convert('RGB')
      +    data_batch[0].append(preprocess(im))
      +    data_batch[1].append(path)
      +    if len(data_batch[0]) % BATCH_SIZE == 0:
      +        embed(data_batch)
      +        data_batch = [[],[]]
      +
      +# Embed and insert the remainder
      +if len(data_batch[0]) != 0:
      +    embed(data_batch)
      +
      +# Call a flush to index any unsealed segments.
      +collection.flush()
      +
      +
      +
        +
      • Этот шаг занимает относительно много времени, потому что вставка требует времени. Сделайте глоток кофе и расслабьтесь.
      • +
      • PyTorch может плохо работать с Python 3.9 и более ранними версиями. Вместо него лучше использовать Python 3.10 и более поздние версии.
      • +
      +
      +
    8. +
    +

    Когда все данные вставлены в Milvus, мы можем приступить к выполнению поиска. В этом примере мы будем искать два примера изображений. Поскольку мы выполняем пакетный поиск, время поиска распределяется между всеми изображениями пакета.

    +
    import glob
    +
    +# Get the filepaths of the search images
    +search_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)
    +len(search_paths)
    +
    +
    import time
    +from matplotlib import pyplot as plt
    +
    +# Embed the search images
    +def embed(data):
    +    with torch.no_grad():
    +        ret = model(torch.stack(data))
    +        # If more than one image, use squeeze
    +        if len(ret) > 1:
    +            return ret.squeeze().tolist()
    +        # Squeeze would remove batch for single image, so using flatten
    +        else:
    +            return torch.flatten(ret, start_dim=1).tolist()
    +
    +data_batch = [[],[]]
    +
    +for path in search_paths:
    +    im = Image.open(path).convert('RGB')
    +    data_batch[0].append(preprocess(im))
    +    data_batch[1].append(path)
    +
    +embeds = embed(data_batch[0])
    +start = time.time()
    +res = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])
    +finish = time.time()
    +
    +
    # Show the image results
    +f, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)
    +
    +for hits_i, hits in enumerate(res):
    +    axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))
    +    axarr[hits_i][0].set_axis_off()
    +    axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))
    +    for hit_i, hit in enumerate(hits):
    +        axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))
    +        axarr[hits_i][hit_i + 1].set_axis_off()
    +        axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))
    +
    +# Save the search result in a separate image file alongside your script.
    +plt.savefig('search_result.png')
    +
    +

    Результат поиска должен быть похож на следующий:

    +

    + + Image search output + Результат поиска изображений

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.json b/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.json new file mode 100644 index 000000000..728646ba9 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas ragas\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-3.5-turbo\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\n self.USER_PROMPT = \"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"foo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import os\nimport urllib.request\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\n# We simply use \"# \" to separate the content in the file, which can roughly separate the content of each main part of the markdown file.\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines) # Load the text data into RAG pipeline\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from ragas import evaluate\nfrom ragas.metrics import (\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n)\n\nresult = evaluate(\n rag_results,\n metrics=[\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n ],\n)\n\nresult\n"],"headingContent":"Evaluation with Ragas","anchorList":[{"label":"Оценка с помощью Ragas","href":"Evaluation-with-Ragas","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Определение конвейера RAG","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"Запустите конвейер RAG и получите результаты","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"Оценка с помощью Ragas","href":"Evaluation-with-Ragas","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.md b/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.md new file mode 100644 index 000000000..2174eaa2a --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_ragas.md @@ -0,0 +1,359 @@ +--- +id: integrate_with_ragas.md +summary: >- + В этом руководстве показано, как использовать Ragas для оценки конвейера + Retrieval-Augmented Generation (RAG), построенного на базе Milvus. +title: Оценка с помощью Ragas +--- +

    Оценка с помощью Ragas

    Open In Colab +GitHub Repository

    +

    Это руководство демонстрирует, как использовать Ragas для оценки конвейера Retrieval-Augmented Generation (RAG), построенного на базе Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает релевантные документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    Ragas - это фреймворк, который помогает оценивать конвейеры RAG. Существуют инструменты и фреймворки, которые помогают создавать такие конвейеры, но оценить их и определить количественную производительность может быть непросто. Именно здесь на помощь приходит Ragas (RAG Assessment).

    +

    Предварительные условия

    Прежде чем запускать этот блокнот, убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas ragas
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Определение конвейера RAG

    Мы определим класс RAG, использующий Milvus в качестве векторного хранилища и OpenAI в качестве LLM. Класс содержит метод load, который загружает текстовые данные в Milvus, метод retrieve, который извлекает наиболее похожие на заданный вопрос текстовые данные, и метод answer, который отвечает на заданный вопрос с помощью извлеченных знаний.

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-3.5-turbo",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +        self.USER_PROMPT = """
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("foo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",  # Inner product distance
    +            consistency_level="Strong",  # Strong consistency level
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    Инициализируем класс RAG с клиентами OpenAI и Milvus.

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Запустите конвейер RAG и получите результаты

    Мы используем руководство по разработке Milvus в качестве приватного знания в нашем RAG, которое является хорошим источником данных для простого конвейера RAG.

    +

    Скачайте его и загрузите в конвейер RAG.

    +
    import os
    +import urllib.request
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +# We simply use "# " to separate the content in the file, which can roughly separate the content of each main part of the markdown file.
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)  # Load the text data into RAG pipeline
    +
    +
    Creating embeddings: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 47/47 [00:16<00:00,  2.80it/s]
    +
    +

    Определим вопрос запроса о содержании документации руководства по разработке. А затем воспользуемся методом answer, чтобы получить ответ и извлеченные контекстные тексты.

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is 8GB of RAM and 50GB of free disk space.',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    Теперь подготовим несколько вопросов с соответствующими им ответами. Мы получим ответы и контексты из нашего конвейера RAG.

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    Answering questions: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.29s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    вопросконтекстыответобоснованная_истина
    0Что такое спецификация требований к оборудованию...[Требования к аппаратному обеспечению\n\nСледующая специф...Спецификация требований к аппаратному обеспечению для бу...Если вы хотите собрать Milvus и запустить его из источн...
    1Какой язык программирования используется для написа...[CMake & Conan\n\nБиблиотека алгоритмов Mil...Язык программирования, используемый для написания Kno...Язык программирования, используемый для написания Knowher...
    2Что необходимо убедиться перед запуском кода, покрывающег...[Покрытие кода\n\nПеред отправкой вашего pull ...Прежде чем выполнять покрытие кода, вы должны убедиться, что...Перед выполнением покрытия кода необходимо сделать ...
    +
    +

    Оценка с помощью Ragas

    Мы используем Ragas для оценки производительности наших результатов работы конвейера RAG.

    +

    Ragas предоставляет набор метрик, которые легко использовать. Мы взяли Answer relevancy, Faithfulness, Context recall и Context precision в качестве метрик для оценки нашего конвейера RAG. Более подробную информацию о метриках можно найти в разделе Метрики Ragas.

    +
    from ragas import evaluate
    +from ragas.metrics import (
    +    answer_relevancy,
    +    faithfulness,
    +    context_recall,
    +    context_precision,
    +)
    +
    +result = evaluate(
    +    rag_results,
    +    metrics=[
    +        answer_relevancy,
    +        faithfulness,
    +        context_recall,
    +        context_precision,
    +    ],
    +)
    +
    +result
    +
    +
    Evaluating:   0%|          | 0/12 [00:00<?, ?it/s]
    +
    +
    +
    +
    +
    +{'answer_relevancy': 0.9445, 'faithfulness': 1.0000, 'context_recall': 1.0000, 'context_precision': 1.0000}
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.json b/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.json new file mode 100644 index 000000000..5b8b65c21 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus sentence-transformers datasets tqdm\n","from datasets import load_dataset\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nfrom tqdm import tqdm\n","embedding_dim = 384\ncollection_name = \"movie_embeddings\"\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","client = MilvusClient(uri=\"./sentence_transformers_example.db\")\n","fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n FieldSchema(name=\"year\", dtype=DataType.INT64),\n FieldSchema(name=\"origin\", dtype=DataType.VARCHAR, max_length=64),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"IP\")\nclient.create_index(collection_name, index_params)\n","model = SentenceTransformer(\"all-MiniLM-L12-v2\")\n","for batch in tqdm(ds.batch(batch_size=512)):\n embeddings = model.encode(batch[\"PlotSummary\"])\n data = [\n {\"title\": title, \"embedding\": embedding, \"year\": year, \"origin\": origin}\n for title, embedding, year, origin in zip(\n batch[\"Title\"], embeddings, batch[\"Release Year\"], batch[\"Origin/Ethnicity\"]\n )\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n 'A shark terrorizes an LA beach.',\n 'An archaeologist searches for ancient artifacts while fighting Nazis.',\n 'Teenagers in detention learn about themselves.',\n 'A teenager fakes illness to get off school and have adventures with two friends.',\n 'A young couple with a kid look after a hotel during winter and the husband goes insane.',\n 'Four turtles fight bad guys.'\n ]\n\n# Search the database based on input text\ndef embed_query(data):\n vectors = model.encode(data)\n return [x for x in vectors]\n\n\nquery_vectors = embed_query(queries)\n\nres = client.search(\n collection_name=collection_name,\n data=query_vectors,\n filter='origin == \"American\" and year > 1945 and year < 2000',\n anns_field=\"embedding\",\n limit=3,\n output_fields=[\"title\"],\n)\n\nfor idx, hits in enumerate(res):\n print(\"Query:\", queries[idx])\n print(\"Results:\")\n for hit in hits:\n print(hit[\"entity\"].get(\"title\"), \"(\", round(hit[\"distance\"], 2), \")\")\n print()\n","Query: An archaeologist searches for ancient artifacts while fighting Nazis.\nResults:\nLove Slaves of the Amazons ( 0.4 )\nA Time to Love and a Time to Die ( 0.39 )\nThe Fifth Element ( 0.39 )\n\nQuery: Teenagers in detention learn about themselves.\nResults:\nThe Breakfast Club ( 0.54 )\nUp the Academy ( 0.46 )\nFame ( 0.43 )\n\nQuery: A teenager fakes illness to get off school and have adventures with two friends.\nResults:\nFerris Bueller's Day Off ( 0.48 )\nFever Lake ( 0.47 )\nLosin' It ( 0.39 )\n\nQuery: A young couple with a kid look after a hotel during winter and the husband goes insane.\nResults:\nThe Shining ( 0.48 )\nThe Four Seasons ( 0.42 )\nHighball ( 0.41 )\n\nQuery: Four turtles fight bad guys.\nResults:\nTeenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )\nDevil May Hare ( 0.43 )\nAttack of the Giant Leeches ( 0.42 )\n"],"headingContent":"Movie Search Using Milvus and SentenceTransformers","anchorList":[{"label":"Поиск фильмов с помощью Milvus и SentenceTransformers","href":"Movie-Search-Using-Milvus-and-SentenceTransformers","type":1,"isActive":false},{"label":"Необходимые библиотеки","href":"Required-Libraries","type":2,"isActive":false},{"label":"Загрузка и открытие набора данных","href":"Downloading-and-Opening-the-Dataset","type":2,"isActive":false},{"label":"Подключение к базе данных","href":"Connecting-to-the-Database","type":2,"isActive":false},{"label":"Вставка данных","href":"Inserting-the-Data","type":2,"isActive":false},{"label":"Выполнение поиска","href":"Performing-the-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.md b/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.md new file mode 100644 index 000000000..f2cd5db9f --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_sentencetransformers.md @@ -0,0 +1,224 @@ +--- +id: integrate_with_sentencetransformers.md +summary: На этой странице обсуждается поиск фильмов с использованием Milvus +title: Поиск фильмов с помощью Milvus и SentenceTransformers +--- +

    Поиск фильмов с помощью Milvus и SentenceTransformers

    В этом примере мы будем искать краткие описания сюжетов фильмов с помощью Milvus и библиотеки SentenceTransformers. В качестве базы данных мы будем использовать Wikipedia Movie Plots with Summaries, размещенную на HuggingFace.

    +

    Давайте приступим!

    +

    Необходимые библиотеки

    В этом примере мы будем использовать pymilvus для подключения к Milvus, sentence-transformers для генерации векторных вкраплений и datasets для загрузки набора данных примера.

    +
    pip install pymilvus sentence-transformers datasets tqdm
    +
    +
    from datasets import load_dataset
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +from tqdm import tqdm
    +
    +

    Мы определим некоторые глобальные параметры,

    +
    embedding_dim = 384
    +collection_name = "movie_embeddings"
    +
    +

    Загрузка и открытие набора данных

    В одной строке datasets можно загрузить и открыть набор данных. Библиотека будет кэшировать набор данных локально и использовать эту копию при следующем запуске. Каждая строка содержит информацию о фильме, к которому прилагается статья в Википедии. Мы используем столбцы Title, PlotSummary, Release Year и Origin/Ethnicity.

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +

    Подключение к базе данных

    На этом этапе мы приступаем к настройке Milvus. Для этого необходимо выполнить следующие шаги:

    +
      +
    1. Создайте базу данных Milvus Lite в локальном файле. (Замените этот URI на адрес сервера для Milvus Standalone и Milvus Distributed).
    2. +
    +
    client = MilvusClient(uri="./sentence_transformers_example.db")
    +
    +
      +
    1. Создайте схему данных. В ней указываются поля, из которых состоит элемент, включая размерность векторного вложения.
    2. +
    +
    fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +    FieldSchema(name="year", dtype=DataType.INT64),
    +    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +
      +
    1. Определите алгоритм индексирования векторного поиска. Milvus Lite поддерживает тип индекса FLAT, в то время как Milvus Standalone и Milvus Distributed реализуют широкий спектр методов, таких как IVF, HNSW и DiskANN. Для небольшого объема данных в этой демонстрации достаточно любого типа поискового индекса, поэтому здесь мы используем самый простой FLAT.
    2. +
    +
    index_params = client.prepare_index_params()
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
    +client.create_index(collection_name, index_params)
    +
    +

    После выполнения этих шагов мы готовы вставить данные в коллекцию и выполнить поиск. Все добавленные данные будут проиндексированы автоматически и сразу же станут доступны для поиска. Если данные очень свежие, поиск может быть медленнее, так как будет использоваться грубая сила для поиска данных, которые еще находятся в процессе индексации.

    +

    Вставка данных

    В этом примере мы будем использовать модель SentenceTransformers miniLM для создания вкраплений текста сюжета. Эта модель возвращает 384-мерные вкрапления.

    +
    model = SentenceTransformer("all-MiniLM-L12-v2")
    +
    +

    Мы перебираем строки данных, встраиваем поле краткого описания сюжета и вставляем сущности в векторную базу данных. Как правило, этот шаг следует выполнять над партиями элементов данных, чтобы максимизировать производительность CPU или GPU для модели встраивания, как мы и сделали здесь.

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    embeddings = model.encode(batch["PlotSummary"])
    +    data = [
    +        {"title": title, "embedding": embedding, "year": year, "origin": origin}
    +        for title, embedding, year, origin in zip(
    +            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
    +        )
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    Вышеописанная операция занимает относительно много времени, поскольку встраивание требует времени. Этот шаг занимает около 2 минут на CPU на MacBook Pro 2023 и будет намного быстрее при использовании специализированных GPU. Сделайте перерыв и насладитесь чашечкой кофе!

    +
    +

    Когда все данные введены в Milvus, мы можем приступить к выполнению поиска. В этом примере мы будем искать фильмы на основе краткого описания сюжета из Википедии. Поскольку мы выполняем пакетный поиск, время поиска распределяется между всеми фильмами. (Можете ли вы догадаться, какой фильм я хотел найти по тексту описания запроса?)

    +
    queries = [
    +    'A shark terrorizes an LA beach.',
    +    'An archaeologist searches for ancient artifacts while fighting Nazis.',
    +    'Teenagers in detention learn about themselves.',
    +    'A teenager fakes illness to get off school and have adventures with two friends.',
    +    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
    +    'Four turtles fight bad guys.'
    +    ]
    +
    +# Search the database based on input text
    +def embed_query(data):
    +    vectors = model.encode(data)
    +    return [x for x in vectors]
    +
    +
    +query_vectors = embed_query(queries)
    +
    +res = client.search(
    +    collection_name=collection_name,
    +    data=query_vectors,
    +    filter='origin == "American" and year > 1945 and year < 2000',
    +    anns_field="embedding",
    +    limit=3,
    +    output_fields=["title"],
    +)
    +
    +for idx, hits in enumerate(res):
    +    print("Query:", queries[idx])
    +    print("Results:")
    +    for hit in hits:
    +        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
    +    print()
    +
    +

    Результаты таковы:

    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +Love Slaves of the Amazons ( 0.4 )
    +A Time to Love and a Time to Die ( 0.39 )
    +The Fifth Element ( 0.39 )
    +
    +Query: Teenagers in detention learn about themselves.
    +Results:
    +The Breakfast Club ( 0.54 )
    +Up the Academy ( 0.46 )
    +Fame ( 0.43 )
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +Ferris Bueller's Day Off ( 0.48 )
    +Fever Lake ( 0.47 )
    +Losin' It ( 0.39 )
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining ( 0.48 )
    +The Four Seasons ( 0.42 )
    +Highball ( 0.41 )
    +
    +Query: Four turtles fight bad guys.
    +Results:
    +Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
    +Devil May Hare ( 0.43 )
    +Attack of the Giant Leeches ( 0.42 )
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.json b/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.json new file mode 100644 index 000000000..f6ac28063 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.json @@ -0,0 +1 @@ +{"codeList":["snowsql -a ${instance_name} -u ${user_name}\n","USE ROLE ACCOUNTADMIN;\nCREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH\n TYPE=oauth\n OAUTH_CLIENT=snowservices_ingress\n ENABLED=true;\n \nUSE ROLE ACCOUNTADMIN;\nGRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;\n","USE ROLE SECURITYADMIN;\nCREATE ROLE MILVUS_ROLE;\n\nUSE ROLE USERADMIN;\nCREATE USER milvus_user\n PASSWORD='milvususerok'\n DEFAULT_ROLE = MILVUS_ROLE\n DEFAULT_SECONDARY_ROLES = ('ALL')\n MUST_CHANGE_PASSWORD = FALSE;\n \nUSE ROLE SECURITYADMIN;\nGRANT ROLE MILVUS_ROLE TO USER milvus_user;\n","USE ROLE SYSADMIN;\nCREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH\nWAREHOUSE_SIZE='X-SMALL'\nAUTO_SUSPEND = 180\nAUTO_RESUME = true\nINITIALLY_SUSPENDED=false;\n\nUSE ROLE SYSADMIN;\nCREATE DATABASE IF NOT EXISTS MILVUS_DEMO;\nUSE DATABASE MILVUS_DEMO;\nCREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nCREATE OR REPLACE STAGE YAML_STAGE;\nCREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\nCREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n","USE ROLE SECURITYADMIN;\nGRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;\n","USE ROLE ACCOUNTADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\nCREATE NETWORK RULE allow_all_rule\nTYPE = 'HOST_PORT'\nMODE= 'EGRESS'\nVALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');\n\nCREATE EXTERNAL ACCESS INTEGRATION allow_all_eai\nALLOWED_NETWORK_RULES=(allow_all_rule)\nENABLED=TRUE;\n\nGRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;\n","cd ${repo_git_root_path}\ndocker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus\ndocker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter\n","docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}\n","docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","docker images | grep milvus\n\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus latest 3721bbb8f62b 2 days ago 2.95GB\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter latest 20633f5bcadf 2 days ago 2GB\n","docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","USE ROLE SYSADMIN;\nCREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\nCREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\n","DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;\nDESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;\n","PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;\nPUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;\n","USE ROLE SYSADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\n\nCREATE SERVICE MILVUS\n IN COMPUTE POOL MILVUS_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='milvus.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n\nCREATE SERVICE JUPYTER\n IN COMPUTE POOL JUPYTER_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='jupyter.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n","SHOW SERVICES;\n\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| name | database_name | schema_name | owner | compute_pool | dns_name | ......\n|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| JUPYTER | MILVUS_DEMO | PUBLIC | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... \n| MILVUS | MILVUS_DEMO | PUBLIC | SYSADMIN | MILVUS_COMPUTE_POOL | milvus.public.milvus-demo.snowflakecomputing.internal | ......\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n","USE ROLE SECURITYADMIN;\nGRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;\n","USE ROLE SYSADMIN;\nSHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n","USE ROLE ACCOUNTADMIN;\nDROP USER milvus_user;\n\nUSE ROLE SYSADMIN;\nDROP SERVICE MILVUS;\nDROP SERVICE JUPYTER;\n\nDROP COMPUTE POOL MILVUS_COMPUTE_POOL;\nDROP COMPUTE POOL JUPYTER_COMPUTE_POOL;\n\nDROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nDROP DATABASE MILVUS_DEMO;\nDROP WAREHOUSE MILVUS_WAREHOUSE;\n\nUSE ROLE ACCOUNTADMIN;\nDROP ROLE MILVUS_ROLE;\nDROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;\n"],"headingContent":"Milvus on Snowpark Container Services","anchorList":[{"label":"Milvus на контейнерных сервисах Snowpark","href":"Milvus-on-Snowpark-Container-Services","type":1,"isActive":false},{"label":"О контейнерных сервисах Snowpark","href":"About-Snowpark-Container-Services","type":2,"isActive":false},{"label":"Настройка демонстрационной версии Milvus","href":"Configure-Milvus-demo","type":2,"isActive":false},{"label":"Использование блокнота","href":"Use-Notebook","type":2,"isActive":false},{"label":"7. Очистка","href":"7-Clean-up","type":2,"isActive":false},{"label":"О Milvus","href":"About-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.md b/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.md new file mode 100644 index 000000000..0182bdad0 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_snowpark.md @@ -0,0 +1,322 @@ +--- +id: integrate_with_snowpark.md +summary: >- + В этом руководстве показано, как запустить демонстрацию Milvus на контейнерных + сервисах Snowpark. +title: Milvus на контейнерных сервисах Snowpark +--- +

    Milvus на контейнерных сервисах Snowpark

    В этом руководстве показано, как запустить демонстрацию Milvus на контейнерных сервисах Snowpark.

    +

    О контейнерных сервисах Snowpark

    Snowpark Container Services - это полностью управляемое контейнерное предложение, предназначенное для упрощения развертывания, управления и масштабирования контейнерных приложений в экосистеме Snowflake. Эта услуга позволяет пользователям запускать контейнерные рабочие нагрузки непосредственно в Snowflake, гарантируя, что данные не нужно выносить из среды Snowflake для обработки. Для получения дополнительной информации обратитесь к официальному представлению: Snowpark Container Services.

    +

    Настройка демонстрационной версии Milvus

    Ниже описано, как с помощью конфигурации и кода понять возможности Milvus и как использовать Milvus в SPCS.

    +

    1. Получите информацию об учетной записи

    Загрузите клиент SPCS: SnowSQL, затем войдите в свою учетную запись.

    +
    snowsql -a ${instance_name} -u ${user_name}
    +
    +

    Правило ${instance_name} - ${org_name}-${acct_name}. Соответствующую информацию можно получить, войдя на сайт app.snowflake.com и проверив информацию о личном кабинете.

    +

    + + Snowflake account information + Информация об учетной записи Snowflake

    +

    2. Настройка ролей и привилегий

    Настройте интеграцию OAUTH.

    +
    USE ROLE ACCOUNTADMIN;
    +CREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH
    +  TYPE=oauth
    +  OAUTH_CLIENT=snowservices_ingress
    +  ENABLED=true;
    +  
    +USE ROLE ACCOUNTADMIN;
    +GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;
    +
    +

    Создайте роль для сервиса, обратите внимание, что часть ${PASSWORD} здесь должна быть заменена пользователем, когда демонстрация будет выполнена.

    +
    USE ROLE SECURITYADMIN;
    +CREATE ROLE MILVUS_ROLE;
    +
    +USE ROLE USERADMIN;
    +CREATE USER milvus_user
    +  PASSWORD='milvususerok'
    +  DEFAULT_ROLE = MILVUS_ROLE
    +  DEFAULT_SECONDARY_ROLES = ('ALL')
    +  MUST_CHANGE_PASSWORD = FALSE;
    +  
    +USE ROLE SECURITYADMIN;
    +GRANT ROLE MILVUS_ROLE TO USER milvus_user;
    +
    +

    3. Создание конфигурации хранилища данных

      +
    • Создайте хранилище и базу данных

      +
      USE ROLE SYSADMIN;
      +CREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH
      +WAREHOUSE_SIZE='X-SMALL'
      +AUTO_SUSPEND = 180
      +AUTO_RESUME = true
      +INITIALLY_SUSPENDED=false;
      +
      +USE ROLE SYSADMIN;
      +CREATE DATABASE IF NOT EXISTS MILVUS_DEMO;
      +USE DATABASE MILVUS_DEMO;
      +CREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
      +CREATE OR REPLACE STAGE YAML_STAGE;
      +CREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +CREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +
    • +
    • Предоставьте привилегии роли

      +
      USE ROLE SECURITYADMIN;
      +GRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;
      +
    • +
    • Настройте ACL

      +
      USE ROLE ACCOUNTADMIN;
      +USE DATABASE MILVUS_DEMO;
      +USE SCHEMA PUBLIC;
      +CREATE NETWORK RULE allow_all_rule
      +TYPE = 'HOST_PORT'
      +MODE= 'EGRESS'
      +VALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');
      +
      +CREATE EXTERNAL ACCESS INTEGRATION allow_all_eai
      +ALLOWED_NETWORK_RULES=(allow_all_rule)
      +ENABLED=TRUE;
      +
      +GRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;
      +
    • +
    +

    4. Создание образов

    Образ, используемый Milvus, должен быть создан локально, а затем загружен пользователем. Для соответствующей настройки образа обратитесь к этому репозиторию. После клонирования кода перейдите в корневой каталог проекта и подготовьтесь к сборке образа.

    +
      +
    • Сборка образов локально

      +

      Откройте локальную оболочку и начните сборку образов.

      +
      cd ${repo_git_root_path}
      +docker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus
      +docker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter
      +
      +

      Здесь два образа, первый - это база данных Milvus, а второй - ноутбук, используемый для отображения.

      +

      После того как локальные образы будут собраны, подготовьтесь к их маркировке и загрузке.

    • +
    • Пометить собранные образы

      +

      Войдите в докер-хаб SPCS.

      +
      docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}
      +
      +

      Теперь вы можете пометить изображения для spcs.

      +
      docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
      +

      Затем используйте docker images | grep milvus в локальной оболочке, чтобы проверить, успешно ли упакован и помечен образ.

      +
      docker images | grep milvus
      +
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus    latest        3721bbb8f62b   2 days ago    2.95GB
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter   latest        20633f5bcadf   2 days ago    2GB
      +
    • +
    • Отправить образы в SPCS

      +
      docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
    • +
    +

    5. Создание и запуск служб

    Давайте вернемся в оболочку SnowSQL.

    +
      +
    • Создайте пулы вычислений
    • +
    +
    USE ROLE SYSADMIN;
    +CREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +CREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +
    +

    Проверьте пулы вычислений через DESCRIBE, пока их статус не станет ACTIVE или IDLE.

    +
    DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +

    + + Compute pool status + Статус вычислительного пула

    +
      +
    • Загрузка файлов спецификаций
    • +
    +

    После создания вычислительного пула начните подготовку spce-файла для сервиса. Файлы также находятся в этом репозитории. Пожалуйста, обратитесь к директории specs.

    +

    Откройте файлы спецификаций этих двух сервисов, найдите ${org_name}-${acct_name} в файле спецификации и замените его на ${имя_инстанции} вашей собственной учетной записи. После внесения изменений используйте SnowSQL для завершения загрузки.

    +
    PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;
    +PUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;
    +
    +
      +
    • Создание службы
    • +
    +

    Когда выгрузка будет завершена, вы будете готовы к созданию службы, Продолжить, чтобы завершить процесс создания службы.

    +
    USE ROLE SYSADMIN;
    +USE DATABASE MILVUS_DEMO;
    +USE SCHEMA PUBLIC;
    +
    +CREATE SERVICE MILVUS
    +  IN COMPUTE POOL MILVUS_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='milvus.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +CREATE SERVICE JUPYTER
    +  IN COMPUTE POOL JUPYTER_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='jupyter.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +

    Службы также можно просматривать через SHOW SERVICES;.

    +
    SHOW SERVICES;
    +
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| name    | database_name | schema_name | owner    | compute_pool         | dns_name                                               | ......
    +|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| JUPYTER | MILVUS_DEMO   | PUBLIC      | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... 
    +| MILVUS  | MILVUS_DEMO   | PUBLIC      | SYSADMIN | MILVUS_COMPUTE_POOL  | milvus.public.milvus-demo.snowflakecomputing.internal  | ......
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +
    +

    Если у вас возникли проблемы с запуском службы, вы можете просмотреть информацию о службе через CALL SYSTEM$GET_SERVICE_STATUS('milvus');.

    +

    + + Service status + Состояние службы

    +

    Дополнительную информацию можно получить через CALL SYSTEM$GET_SERVICE_LOGS('milvus', '0', 'milvus', 10);.

    +

    Использование блокнота

    Используйте SnowSQL для предоставления разрешений.

    +
    USE ROLE SECURITYADMIN;
    +GRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;
    +
    +

    Затем просмотрите и запишите конечную точку блокнота Jupyter.

    +
    USE ROLE SYSADMIN;
    +SHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;
    +
    +

    Запишите часть информации на ingress_url, затем откройте браузер и введите ingress_url, используя учетную запись milvus_user для входа на сайт.

    +

    + + Obtain the ingress URL + Получение URL-адреса входа

    +

    Откройте блокнот через ingress_url, дважды щелкните файл TestMilvus.ipynb на странице, чтобы опробовать Milvus. Выберите первую часть блока кода и нажмите кнопку Run, чтобы начать устанавливать соединение и инициализировать функцию встраивания.

    +

    + + Run TestMilvus.ipynb in the notebook + Запустите TestMilvus.ipynb в блокноте

    +

    Установив соединение, продолжайте нажимать кнопку RUN. Код превратит фрагмент текста в векторные данные после обработки встраивания, а затем вставит его в Milvus.

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +

    Затем используйте текст в качестве запроса: "Кто начал исследования ИИ?", выполните запрос после обработки встраивания и, наконец, получите и отобразите наиболее релевантные результаты.

    +

    + + Obtain and display the most relevant results + Получение и отображение наиболее релевантных результатов

    +

    Для получения дополнительной информации об использовании клиента Milvus вы можете обратиться к разделу Milvus Doc.

    +

    7. Очистка

    После проверки вы можете использовать SnowSQL для очистки служб, ролей и ресурсов данных.

    +
    USE ROLE ACCOUNTADMIN;
    +DROP USER milvus_user;
    +
    +USE ROLE SYSADMIN;
    +DROP SERVICE MILVUS;
    +DROP SERVICE JUPYTER;
    +
    +DROP COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DROP COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +DROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
    +DROP DATABASE MILVUS_DEMO;
    +DROP WAREHOUSE MILVUS_WAREHOUSE;
    +
    +USE ROLE ACCOUNTADMIN;
    +DROP ROLE MILVUS_ROLE;
    +DROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;
    +
    +

    О Milvus

    Для получения дополнительной информации о Milvus вы можете начать с введения и быстрого запуска Milvus. Конечно, есть более подробное введение в API, ссылки на версии для Python и Java, а также информация о встраиваниях и интеграциях для справки.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_spark.json b/localization/v2.5.x/site/ru/integrations/integrate_with_spark.json new file mode 100644 index 000000000..20f1f1f69 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_spark.json @@ -0,0 +1 @@ +{"codeList":["wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","from pyspark.sql import SparkSession\n\ncolumns = [\"id\", \"text\", \"vec\"]\ndata = [(1, \"a\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (2, \"b\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (3, \"c\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (4, \"d\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]\nsample_df = spark.sparkContext.parallelize(data).toDF(columns)\nsample_df.write \\\n .mode(\"append\") \\\n .option(\"milvus.host\", \"localhost\") \\\n .option(\"milvus.port\", \"19530\") \\\n .option(\"milvus.collection.name\", \"hello_spark_milvus\") \\\n .option(\"milvus.collection.vectorField\", \"vec\") \\\n .option(\"milvus.collection.vectorDim\", \"8\") \\\n .option(\"milvus.collection.primaryKeyField\", \"id\") \\\n .format(\"milvus\") \\\n .save()\n","import org.apache.spark.sql.{SaveMode, SparkSession}\n\nobject Hello extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"HelloSparkMilvus\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"a\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (2, \"b\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (3, \"c\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (4, \"d\", Seq(1.0,2.0,3.0,4.0,5.0))\n ).toDF(\"id\", \"text\", \"vec\")\n\n // set milvus options\n val milvusOptions = Map(\n \"milvus.host\" -> \"localhost\" -> uri,\n \"milvus.port\" -> \"19530\",\n \"milvus.collection.name\" -> \"hello_spark_milvus\",\n \"milvus.collection.vectorField\" -> \"vec\",\n \"milvus.collection.vectorDim\" -> \"5\",\n \"milvus.collection.primaryKeyField\", \"id\"\n )\n \n sampleDF.write.format(\"milvus\")\n .options(milvusOptions)\n .mode(SaveMode.Append)\n .save()\n}\n","val df = spark.read\n .format(\"milvusbinlog\")\n .load(path)\n .withColumnRenamed(\"val\", \"embedding\")\n","{\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]}\n{\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]}\n{\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]}\n{\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]}\n{\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n","{\n \"rows\":[\n {\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]},\n {\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]},\n {\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]},\n {\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]},\n {\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n ]\n}\n","val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n","df.write.format(\"parquet\").save(outputPath)\nMilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, \"parquet\")\n","spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar\n","import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.{SaveMode, SparkSession}\nimport zilliztech.spark.milvus.MilvusOptions._\n\nimport org.apache.spark.ml.linalg.Vector\n\nobject Mysql2MilvusDemo extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"Mysql2MilvusDemo\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models.\"),\n (2, \"As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. \"),\n (3, \"Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data.\"),\n (4, \"As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.\")\n ).toDF(\"id\", \"text\")\n\n // Write to MySQL Table\n sampleDF.write\n .mode(SaveMode.Append)\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .save()\n\n // Read from MySQL Table\n val dfMysql = spark.read\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .load()\n\n val tokenizer = new Tokenizer().setInputCol(\"text\").setOutputCol(\"tokens\")\n val tokenizedDf = tokenizer.transform(dfMysql)\n\n // Learn a mapping from words to Vectors.\n val word2Vec = new Word2Vec()\n .setInputCol(\"tokens\")\n .setOutputCol(\"vectors\")\n .setVectorSize(128)\n .setMinCount(0)\n val model = word2Vec.fit(tokenizedDf)\n\n val result = model.transform(tokenizedDf)\n\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // Apply the UDF to the DataFrame\n val resultDF = result.withColumn(\"embedding\", vectorToArrayUDF($\"vectors\"))\n val milvusDf = resultDF.drop(\"tokens\").drop(\"vectors\")\n\n milvusDf.write.format(\"milvus\")\n .option(MILVUS_HOST, \"localhost\")\n .option(MILVUS_PORT, \"19530\")\n .option(MILVUS_COLLECTION_NAME, \"text_embedding\")\n .option(MILVUS_COLLECTION_VECTOR_FIELD, \"embedding\")\n .option(MILVUS_COLLECTION_VECTOR_DIM, \"128\")\n .option(MILVUS_COLLECTION_PRIMARY_KEY, \"id\")\n .mode(SaveMode.Append)\n .save()\n}\n","import org.apache.spark.ml.feature.PCA\nimport org.apache.spark.ml.linalg.{Vector, Vectors}\nimport org.apache.spark.SparkConf\nimport org.apache.spark.sql.SparkSession\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.util.CaseInsensitiveStringMap\nimport zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}\n\nimport scala.collection.JavaConverters._\n\nobject TransformDemo extends App {\n val sparkConf = new SparkConf().setMaster(\"local\")\n val spark = SparkSession.builder().config(sparkConf).getOrCreate()\n\n import spark.implicits._\n\n val host = \"localhost\"\n val port = 19530\n val user = \"root\"\n val password = \"Milvus\"\n val fs = \"s3a://\"\n val bucketName = \"a-bucket\"\n val rootPath = \"files\"\n val minioAK = \"minioadmin\"\n val minioSK = \"minioadmin\"\n val minioEndpoint = \"localhost:9000\"\n val collectionName = \"hello_spark_milvus1\"\n val targetCollectionName = \"hello_spark_milvus2\"\n\n val properties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n\n // 1, configurations\n val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))\n\n // 2, batch read milvus collection data to dataframe\n // Schema: dim of `embeddings` is 8\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=8 |\n // +-+------------+------------+------------------+\n val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))\n val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n .withColumn(\"embeddings_vec\", arrayToVectorUDF($\"embeddings\"))\n .drop(\"embeddings\")\n \n // 3. Use PCA to reduce dim of vector\n val dim = 4\n val pca = new PCA()\n .setInputCol(\"embeddings_vec\")\n .setOutputCol(\"pca_vec\")\n .setK(dim)\n .fit(collectionDF)\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // embeddings dim number reduce to 4\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=4 |\n // +-+------------+------------+------------------+\n val pcaDf = pca.transform(collectionDF)\n .withColumn(\"embeddings\", vectorToArrayUDF($\"pca_vec\"))\n .select(\"pk\", \"random\", \"embeddings\")\n\n // 4. Write PCAed data to S3\n val outputPath = \"s3a://a-bucket/result\"\n pcaDf.write\n .mode(\"overwrite\")\n .format(\"parquet\")\n .save(outputPath)\n\n // 5. Config MilvusOptions of target table \n val targetProperties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n // 6. Bulkinsert Spark output files into milvus\n MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"parquet\")\n}\n","// Write the data in batch into the Milvus bucket storage.\nval outputPath = \"s3://my-temp-bucket/result\"\ndf.write\n .mode(\"overwrite\")\n .format(\"mjson\")\n .save(outputPath)\n// Specify Milvus options.\nval targetProperties = Map(\n MilvusOptions.MILVUS_URI -> zilliz_uri,\n MilvusOptions.MILVUS_TOKEN -> zilliz_token,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n)\nval targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n// Bulk insert Spark output files into Milvus\nMilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"mjson\")\n"],"headingContent":"Spark-Milvus Connector User Guide","anchorList":[{"label":"Руководство пользователя Spark-Milvus Connector","href":"Spark-Milvus-Connector-User-Guide","type":1,"isActive":false},{"label":"Быстрый старт","href":"Quick-start","type":2,"isActive":false},{"label":"Особенности и концепции","href":"Features--concepts","type":2,"isActive":false},{"label":"Формат данных Milvus","href":"Milvus-data-format","type":2,"isActive":false},{"label":"MilvusUtils","href":"MilvusUtils","type":2,"isActive":false},{"label":"Расширенное использование","href":"Advanced-Usage","type":2,"isActive":false},{"label":"Практическое руководство","href":"Hands-on","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_spark.md b/localization/v2.5.x/site/ru/integrations/integrate_with_spark.md new file mode 100644 index 000000000..fa4eb7ad3 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_spark.md @@ -0,0 +1,505 @@ +--- +id: integrate_with_spark.md +summary: На этой странице рассматривается разъем Spark-Milvus. +title: Руководство пользователя Spark-Milvus Connector +--- +

    Руководство пользователя Spark-Milvus Connector

    Spark-Milvus Connector (https://github.com/zilliztech/spark-milvus) обеспечивает бесшовную интеграцию между Apache Spark и Milvus, объединяя функции обработки данных и ML-технологий Apache Spark с возможностями хранения векторных данных и поиска в Milvus. Эта интеграция позволяет использовать различные интересные приложения, в том числе:

    +
      +
    • Эффективная загрузка векторных данных в Milvus большими партиями,
    • +
    • перемещение данных между Milvus и другими системами хранения или базами данных,
    • +
    • анализ данных в Milvus с помощью Spark MLlib и других инструментов искусственного интеллекта.
    • +
    +

    Быстрый старт

    Подготовка

    Spark-Milvus Connector поддерживает языки программирования Scala и Python. Пользователи могут использовать его с Pyspark или Spark-shell. Чтобы запустить эту демонстрацию, настройте среду Spark, содержащую зависимость Spark-Milvus Connector, выполнив следующие действия:

    +
      +
    1. Установите Apache Spark (версия >= 3.3.0).

      +

      Вы можете установить Apache Spark, обратившись к официальной документации.

    2. +
    3. Загрузите jar-файл spark-milvus.

      +
      wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar
      +
    4. +
    5. Запустите среду выполнения Spark с spark-milvus jar в качестве одной из зависимостей.

      +

      Чтобы запустить среду выполнения Spark с коннектором Spark-Milvus Connector, добавьте в команду загруженный spark-milvus в качестве зависимости.

      +
        +
      • pyspark

        +
        ./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
      • spark-shell

        +
        ./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
    6. +
    +

    Демонстрация

    В этой демонстрации мы создадим пример Spark DataFrame с векторными данными и запишем его в Milvus через Spark-Milvus Connector. Коллекция будет создана в Milvus автоматически на основе схемы и заданных параметров.

    + +
    from pyspark.sql import SparkSession
    +
    +columns = ["id", "text", "vec"]
    +data = [(1, "a", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (2, "b", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (3, "c", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (4, "d", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]
    +sample_df = spark.sparkContext.parallelize(data).toDF(columns)
    +sample_df.write \
    +    .mode("append") \
    +    .option("milvus.host", "localhost") \
    +    .option("milvus.port", "19530") \
    +    .option("milvus.collection.name", "hello_spark_milvus") \
    +    .option("milvus.collection.vectorField", "vec") \
    +    .option("milvus.collection.vectorDim", "8") \
    +    .option("milvus.collection.primaryKeyField", "id") \
    +    .format("milvus") \
    +    .save()
    +
    +
    import org.apache.spark.sql.{SaveMode, SparkSession}
    +
    +object Hello extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("HelloSparkMilvus")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "a", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (2, "b", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (3, "c", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (4, "d", Seq(1.0,2.0,3.0,4.0,5.0))
    +  ).toDF("id", "text", "vec")
    +
    +  // set milvus options
    +  val milvusOptions = Map(
    +      "milvus.host" -> "localhost" -> uri,
    +      "milvus.port" -> "19530",
    +      "milvus.collection.name" -> "hello_spark_milvus",
    +      "milvus.collection.vectorField" -> "vec",
    +      "milvus.collection.vectorDim" -> "5",
    +      "milvus.collection.primaryKeyField", "id"
    +    )
    +    
    +  sampleDF.write.format("milvus")
    +    .options(milvusOptions)
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    После выполнения приведенного выше кода вы можете просмотреть вставленные данные в Milvus с помощью SDK или Attu (A Milvus Dashboard). Вы можете найти коллекцию с именем hello_spark_milvus, в которую уже вставлены 4 сущности.

    +

    Особенности и концепции

    Опции Milvus

    В разделе "Быстрый старт " мы показали установку опций при работе с Milvus. Эти опции абстрагированы как опции Milvus. Они используются для создания соединений с Milvus и управления другим поведением Milvus. Не все опции являются обязательными.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Ключ опцииЗначение по умолчаниюОписание
    milvus.hostlocalhostХост сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.port19530Порт сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.usernamerootИмя пользователя для сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.passwordMilvusПароль для сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.uri--URI сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.token--Токен сервера Milvus. Подробнее см. в разделе Управление подключениями Milvus.
    milvus.database.namedefaultИмя базы данных Milvus для чтения или записи.
    milvus.collection.namehello_milvusИмя коллекции Milvus для чтения или записи.
    milvus.collection.primaryKeyFieldNoneИмя поля первичного ключа в коллекции. Требуется, если коллекция не существует.
    milvus.collection.vectorFieldNoneИмя векторного поля в коллекции. Требуется, если коллекция не существует.
    milvus.collection.vectorDimNoneРазмерность векторного поля в коллекции. Требуется, если коллекция не существует.
    milvus.collection.autoIDfalseЕсли коллекция не существует, этот параметр указывает, нужно ли автоматически генерировать идентификаторы для сущностей. Дополнительные сведения см. в разделе create_collection
    milvus.bucketa-bucketИмя ведра в хранилище Milvus. Оно должно быть таким же, как minio.bucketName в milvus.yaml.
    milvus.rootpathfilesКорневой путь хранилища Milvus. Он должен быть таким же, как minio.rootpath в milvus.yaml.
    milvus.fss3a://Файловая система хранилища Milvus. Значение s3a:// применяется для Spark с открытым исходным кодом. Для Databricks используйте s3://.
    milvus.storage.endpointlocalhost:9000Конечная точка хранилища Milvus. Это значение должно быть таким же, как minio.address:minio.port в milvus.yaml.
    milvus.storage.userminioadminПользователь хранилища Milvus. Это должно быть так же, как minio.accessKeyID в milvus.yaml.
    milvus.storage.passwordminioadminПароль хранилища Milvus. Пароль должен быть таким же, как minio.secretAccessKey в milvus.yaml.
    milvus.storage.useSSLfalseИспользовать ли SSL для хранилища Milvus. Значение должно быть таким же, как minio.useSSL в milvus.yaml.
    +

    Формат данных Milvus

    Spark-Milvus Connector поддерживает чтение и запись данных в следующих форматах данных Milvus:

    +
      +
    • milvus: Формат данных Milvus для плавного преобразования из Spark DataFrame в сущности Milvus.
    • +
    • milvusbinlog: Формат данных Milvus для чтения встроенных данных бинлога Milvus.
    • +
    • mjson: Формат Milvus JSON для массового ввода данных в Milvus.
    • +
    +

    milvus

    В разделе "Быстрый старт" мы используем формат milvus для записи образцов данных в кластер Milvus. Формат milvus - это новый формат данных, который поддерживает беспрепятственную запись данных Spark DataFrame в коллекции Milvus. Это достигается с помощью пакетных вызовов Insert API в Milvus SDK. Если коллекция не существует в Milvus, новая коллекция будет создана на основе схемы Dataframe. Однако автоматически созданная коллекция может не поддерживать все возможности схемы коллекции. Поэтому рекомендуется сначала создать коллекцию через SDK, а затем использовать spark-milvus для записи. Для получения дополнительной информации обратитесь к демонстрации.

    +

    milvusbinlog

    Новый формат данных milvusbinlog предназначен для чтения встроенных в Milvus данных binlog. Binlog - это внутренний формат хранения данных Milvus, основанный на parquet. К сожалению, он не может быть прочитан обычной библиотекой parquet, поэтому мы реализовали этот новый формат данных, чтобы помочь Spark job прочитать его. Не рекомендуется использовать milvusbinlog напрямую, если вы не знакомы с деталями внутреннего хранилища milvus. Мы предлагаем использовать функцию MilvusUtils, которая будет представлена в следующем разделе.

    +
    val df = spark.read
    +  .format("milvusbinlog")
    +  .load(path)
    +  .withColumnRenamed("val", "embedding")
    +
    +

    mjson

    Milvus предоставляет функциональность Bulkinsert для повышения производительности записи при работе с большими наборами данных. Однако формат JSON, используемый Milvus, несколько отличается от формата JSON, используемого по умолчанию в Spark. Чтобы решить эту проблему, мы ввели формат данных mjson для генерации данных, соответствующих требованиям Milvus. Вот пример, показывающий разницу между JSON-lines и mjson:

    +
      +
    • JSON-lines:

      +
      {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]}
      +{"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]}
      +{"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]}
      +{"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]}
      +{"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +
    • +
    • mjson (требуется для Milvus Bulkinsert):

      +
      {
      +    "rows":[
      +        {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]},
      +        {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]},
      +        {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]},
      +        {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]},
      +        {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +    ]
      +}
      +
    • +
    +

    Это будет улучшено в будущем. Мы рекомендуем использовать формат parquet в интеграции spark-milvus, если ваша версия Milvus - v2.3.7+, которая поддерживает bulkinsert с форматом Parquet. Смотрите демонстрацию на Github.

    +

    MilvusUtils

    MilvusUtils содержит несколько полезных функций util. В настоящее время он поддерживается только в Scala. Примеры использования приведены в разделе Advanced Usage.

    +

    MilvusUtils.readMilvusCollection

    MilvusUtils.readMilvusCollection - это простой интерфейс для загрузки всей коллекции Milvus в Spark Dataframe. Он включает в себя различные операции, в том числе вызов Milvus SDK, чтение milvusbinlog и общие операции объединения/соединения.

    +
    val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +
    +

    MilvusUtils.bulkInsertFromSpark

    MilvusUtils.bulkInsertFromSpark предоставляет удобный способ импортировать выходные файлы Spark в Milvus большой партией. Он оборачивает API Bullkinsert из Milvus SDK.

    +
    df.write.format("parquet").save(outputPath)
    +MilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, "parquet")
    +
    +

    Расширенное использование

    В этом разделе вы найдете примеры расширенного использования Spark-Milvus Connector для анализа и миграции данных. Дополнительные демонстрации смотрите в примерах.

    +

    MySQL -> встраивание -> Milvus

    В этой демонстрации мы

    +
      +
    1. Прочитаем данные из MySQL через Spark-MySQL Connector,
    2. +
    3. генерировать встраивание (на примере Word2Vec) и
    4. +
    5. записывать встроенные данные в Milvus.
    6. +
    +

    Чтобы включить Spark-MySQL Connector, вам нужно добавить следующую зависимость в ваше окружение Spark:

    +
    spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar
    +
    +
    import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.{SaveMode, SparkSession}
    +import zilliztech.spark.milvus.MilvusOptions._
    +
    +import org.apache.spark.ml.linalg.Vector
    +
    +object Mysql2MilvusDemo  extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("Mysql2MilvusDemo")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models."),
    +    (2, "As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. "),
    +    (3, "Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data."),
    +    (4, "As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.")
    +  ).toDF("id", "text")
    +
    +  // Write to MySQL Table
    +  sampleDF.write
    +    .mode(SaveMode.Append)
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .save()
    +
    +  // Read from MySQL Table
    +  val dfMysql = spark.read
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .load()
    +
    +  val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("tokens")
    +  val tokenizedDf = tokenizer.transform(dfMysql)
    +
    +  // Learn a mapping from words to Vectors.
    +  val word2Vec = new Word2Vec()
    +    .setInputCol("tokens")
    +    .setOutputCol("vectors")
    +    .setVectorSize(128)
    +    .setMinCount(0)
    +  val model = word2Vec.fit(tokenizedDf)
    +
    +  val result = model.transform(tokenizedDf)
    +
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // Apply the UDF to the DataFrame
    +  val resultDF = result.withColumn("embedding", vectorToArrayUDF($"vectors"))
    +  val milvusDf = resultDF.drop("tokens").drop("vectors")
    +
    +  milvusDf.write.format("milvus")
    +    .option(MILVUS_HOST, "localhost")
    +    .option(MILVUS_PORT, "19530")
    +    .option(MILVUS_COLLECTION_NAME, "text_embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_FIELD, "embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_DIM, "128")
    +    .option(MILVUS_COLLECTION_PRIMARY_KEY, "id")
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    Milvus -> Transform -> Milvus

    В этом демонстрационном примере мы

    +
      +
    1. Считывать данные из коллекции Milvus,
    2. +
    3. Применим трансформацию (на примере PCA) и
    4. +
    5. запишем преобразованные данные в другой Milvus с помощью Bulkinsert API.
    6. +
    +
    +

    Модель PCA - это модель трансформации, которая уменьшает размерность векторов вложения, что является распространенной операцией в машинном обучении. Вы можете добавить любые другие операции обработки, такие как фильтрация, объединение или нормализация, к шагу трансформации.

    +
    +
    import org.apache.spark.ml.feature.PCA
    +import org.apache.spark.ml.linalg.{Vector, Vectors}
    +import org.apache.spark.SparkConf
    +import org.apache.spark.sql.SparkSession
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.util.CaseInsensitiveStringMap
    +import zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}
    +
    +import scala.collection.JavaConverters._
    +
    +object TransformDemo extends App {
    +  val sparkConf = new SparkConf().setMaster("local")
    +  val spark = SparkSession.builder().config(sparkConf).getOrCreate()
    +
    +  import spark.implicits._
    +
    +  val host = "localhost"
    +  val port = 19530
    +  val user = "root"
    +  val password = "Milvus"
    +  val fs = "s3a://"
    +  val bucketName = "a-bucket"
    +  val rootPath = "files"
    +  val minioAK = "minioadmin"
    +  val minioSK = "minioadmin"
    +  val minioEndpoint = "localhost:9000"
    +  val collectionName = "hello_spark_milvus1"
    +  val targetCollectionName = "hello_spark_milvus2"
    +
    +  val properties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +
    +  // 1, configurations
    +  val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))
    +
    +  // 2, batch read milvus collection data to dataframe
    +  //  Schema: dim of `embeddings` is 8
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=8        |
    +  // +-+------------+------------+------------------+
    +  val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))
    +  val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +    .withColumn("embeddings_vec", arrayToVectorUDF($"embeddings"))
    +    .drop("embeddings")
    +  
    +  // 3. Use PCA to reduce dim of vector
    +  val dim = 4
    +  val pca = new PCA()
    +    .setInputCol("embeddings_vec")
    +    .setOutputCol("pca_vec")
    +    .setK(dim)
    +    .fit(collectionDF)
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // embeddings dim number reduce to 4
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=4        |
    +  // +-+------------+------------+------------------+
    +  val pcaDf = pca.transform(collectionDF)
    +    .withColumn("embeddings", vectorToArrayUDF($"pca_vec"))
    +    .select("pk", "random", "embeddings")
    +
    +  // 4. Write PCAed data to S3
    +  val outputPath = "s3a://a-bucket/result"
    +  pcaDf.write
    +    .mode("overwrite")
    +    .format("parquet")
    +    .save(outputPath)
    +
    +  // 5. Config MilvusOptions of target table  
    +  val targetProperties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +  val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +  // 6. Bulkinsert Spark output files into milvus
    +  MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
    +}
    +
    +

    Databricks -> Zilliz Cloud

    Если вы используете Zilliz Cloud (управляемый сервис Milvus), вы можете воспользоваться его удобным API импорта данных. Zilliz Cloud предоставляет исчерпывающие инструменты и документацию, чтобы помочь вам эффективно перемещать данные из различных источников данных, включая Spark и Databricks. Просто создайте ведро S3 в качестве посредника и откройте к нему доступ в своей учетной записи Zilliz Cloud. API импорта данных Zilliz Cloud автоматически загрузит всю партию данных из ведра S3 в ваш кластер Zilliz Cloud.

    +

    Подготовительные работы

    +
      +
    1. Загрузите среду выполнения Spark, добавив jar-файл в кластер Databricks.

      +

      Библиотеку можно установить разными способами. На этом скриншоте показана загрузка jar-файла из локальной сети в кластер. Дополнительные сведения см. в разделе Кластерные библиотеки в документации Databricks.

      +

      + + Install Databricks Library + Установка библиотеки Databricks

    2. +
    3. Создайте ведро S3 и настройте его как внешнее хранилище для кластера Databricks.

      +

      Для Bulkinsert требуется хранить данные во временном ведре, чтобы Zilliz Cloud мог импортировать их в пакетном режиме. Вы можете создать ведро S3 и настроить его как внешнее хранилище Databricks. Подробности см. в разделе Внешние местоположения.

    4. +
    5. Защитите учетные данные Databricks.

      +

      Для получения более подробной информации см. инструкции в блоге Securely Managing Credentials in Databricks.

    6. +
    +

    Демонстрация

    +

    Вот фрагмент кода, демонстрирующий процесс пакетной миграции данных. Аналогично приведенному выше примеру Milvus, вам просто нужно заменить учетные данные и адрес ведра S3.

    +
    // Write the data in batch into the Milvus bucket storage.
    +val outputPath = "s3://my-temp-bucket/result"
    +df.write
    +  .mode("overwrite")
    +  .format("mjson")
    +  .save(outputPath)
    +// Specify Milvus options.
    +val targetProperties = Map(
    +  MilvusOptions.MILVUS_URI -> zilliz_uri,
    +  MilvusOptions.MILVUS_TOKEN -> zilliz_token,
    +  MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +  MilvusOptions.MILVUS_BUCKET -> bucketName,
    +  MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +  MilvusOptions.MILVUS_FS -> fs,
    +  MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +  MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +  MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +)
    +val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +// Bulk insert Spark output files into Milvus
    +MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "mjson")
    +
    +

    Практическое руководство

    Чтобы помочь вам быстро начать работу с коннектором Spark-Milvus Connector, мы подготовили блокнот, который проведет вас через процессы потоковой и пакетной передачи данных с помощью Milvus и Zilliz Cloud.

    + diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.json b/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.json new file mode 100644 index 000000000..14a8a785f --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"vanna[milvus,openai]\"\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from pymilvus import MilvusClient, model\nfrom vanna.milvus import Milvus_VectorStore\nfrom vanna.openai import OpenAI_Chat\n\n\nclass VannaMilvus(Milvus_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n Milvus_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n","milvus_uri = \"./milvus_vanna.db\"\n\nmilvus_client = MilvusClient(uri=milvus_uri)\n\nvn_milvus = VannaMilvus(\n config={\n \"api_key\": os.getenv(\"OPENAI_API_KEY\"),\n \"model\": \"gpt-3.5-turbo\",\n \"milvus_client\": milvus_client,\n \"embedding_function\": model.DefaultEmbeddingFunction(),\n \"n_results\": 2, # The number of results to return from Milvus semantic search.\n }\n)\n","import sqlite3\n\nsqlite_path = \"./my-database.sqlite\"\nsql_connect = sqlite3.connect(sqlite_path)\nc = sql_connect.cursor()\n\ninit_sqls = \"\"\"\nCREATE TABLE IF NOT EXISTS Customer (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Company TEXT NOT NULL,\n City TEXT NOT NULL,\n Phone TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS Company (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Industry TEXT NOT NULL,\n Location TEXT NOT NULL,\n EmployeeCount INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS User (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Username TEXT NOT NULL UNIQUE,\n Email TEXT NOT NULL UNIQUE\n);\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');\n\nINSERT INTO Company (Name, Industry, Location, EmployeeCount)\nVALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);\n\nINSERT INTO User (Username, Email)\nVALUES ('johndoe123', 'johndoe123@example.com');\n\"\"\"\n\nfor sql in init_sqls.split(\";\"):\n c.execute(sql)\n\nsql_connect.commit()\n\n# Connect to the SQLite database\nvn_milvus.connect_to_sqlite(sqlite_path)\n","# If there exists training data, we should remove it before training.\nexisting_training_data = vn_milvus.get_training_data()\nif len(existing_training_data) > 0:\n for _, training_data in existing_training_data.iterrows():\n vn_milvus.remove_training_data(training_data[\"id\"])\n\n# Get the DDL of the SQLite database\ndf_ddl = vn_milvus.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\n# Train the model on the DDL data\nfor ddl in df_ddl[\"sql\"].to_list():\n vn_milvus.train(ddl=ddl)\n","# Add documentation about your business terminology or definitions.\nvn_milvus.train(\n documentation=\"ABC Corp specializes in cutting-edge technology solutions and innovation.\"\n)\nvn_milvus.train(\n documentation=\"XYZ Inc is a global leader in manufacturing and supply chain management.\"\n)\n\n# You can also add SQL queries to your training data.\nvn_milvus.train(sql=\"SELECT * FROM Customer WHERE Name = 'John Doe'\")\n","training_data = vn_milvus.get_training_data()\ntraining_data\n","sql = vn_milvus.generate_sql(\"what is the phone number of John Doe?\")\nvn_milvus.run_sql(sql)\n","sql = vn_milvus.generate_sql(\"which customer works for a manufacturing corporation?\")\nvn_milvus.run_sql(sql)\n","sql_connect.close()\nmilvus_client.close()\n\nos.remove(sqlite_path)\nif os.path.exists(milvus_uri):\n os.remove(milvus_uri)\n"],"headingContent":"Write SQL with Vanna and Milvus","anchorList":[{"label":"Пишите SQL с помощью Vanna и Milvus","href":"Write-SQL-with-Vanna-and-Milvus","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Подготовка данных","href":"Data-preparation","type":2,"isActive":false},{"label":"Обучение на данных","href":"Train-with-data","type":2,"isActive":false},{"label":"Генерация SQL и их выполнение","href":"Generate-SQLs-and-execute-them","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.md b/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.md new file mode 100644 index 000000000..be202e773 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_vanna.md @@ -0,0 +1,369 @@ +--- +id: integrate_with_vanna.md +summary: >- + В этом руководстве показано, как использовать Vanna для создания и выполнения + SQL-запросов на основе данных, хранящихся в базе данных. +title: Пишите SQL с помощью Vanna и Milvus +--- +

    Пишите SQL с помощью Vanna и Milvus

    Open In Colab +GitHub Repository

    +

    Vanna - это фреймворк Python RAG (Retrieval-Augmented Generation) с открытым исходным кодом для генерации SQL и связанных с ним функций. Milvus - самая продвинутая в мире векторная база данных с открытым исходным кодом, созданная для работы с приложениями для поиска сходства при встраивании и искусственного интеллекта.

    +

    Vanna работает в два простых шага - обучает "модель" RAG на ваших данных, а затем задает вопросы, которые возвращают SQL-запросы, которые могут быть настроены для выполнения в вашей базе данных. В этом руководстве показано, как использовать Vanna для генерации и выполнения SQL-запросов на основе данных, хранящихся в базе данных.

    +

    Предварительные условия

    Перед запуском этого блокнота убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install "vanna[milvus,openai]"
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения (щелкните на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Также вам нужно установить OPENAI_API_KEY в переменных окружения. Ключ API можно получить в OpenAI.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Подготовка данных

    Сначала нам нужно наследоваться от классов Milvus_VectorStore и OpenAI_Chat из Vanna и определить новый класс VannaMilvus, который объединяет возможности обоих классов.

    +
    from pymilvus import MilvusClient, model
    +from vanna.milvus import Milvus_VectorStore
    +from vanna.openai import OpenAI_Chat
    +
    +
    +class VannaMilvus(Milvus_VectorStore, OpenAI_Chat):
    +    def __init__(self, config=None):
    +        Milvus_VectorStore.__init__(self, config=config)
    +        OpenAI_Chat.__init__(self, config=config)
    +
    +

    Мы инициализируем класс VannaMilvus с необходимыми параметрами конфигурации. Мы используем экземпляр milvus_client для хранения вкраплений и model.DefaultEmbeddingFunction(), инициализированный из milvus_model, для генерации вкраплений.C

    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +
    milvus_uri = "./milvus_vanna.db"
    +
    +milvus_client = MilvusClient(uri=milvus_uri)
    +
    +vn_milvus = VannaMilvus(
    +    config={
    +        "api_key": os.getenv("OPENAI_API_KEY"),
    +        "model": "gpt-3.5-turbo",
    +        "milvus_client": milvus_client,
    +        "embedding_function": model.DefaultEmbeddingFunction(),
    +        "n_results": 2,  # The number of results to return from Milvus semantic search.
    +    }
    +)
    +
    +

    Это простой пример с несколькими выборками данных, поэтому мы установили значение n_results равным 2, чтобы обеспечить поиск двух наиболее похожих результатов. На практике при работе с большим набором обучающих данных следует установить значение n_results на более высокое значение.

    +

    Мы будем использовать пример базы данных SQLite с несколькими таблицами, содержащими некоторые примеры данных.

    +
    import sqlite3
    +
    +sqlite_path = "./my-database.sqlite"
    +sql_connect = sqlite3.connect(sqlite_path)
    +c = sql_connect.cursor()
    +
    +init_sqls = """
    +CREATE TABLE IF NOT EXISTS Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +);
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');
    +
    +INSERT INTO Company (Name, Industry, Location, EmployeeCount)
    +VALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);
    +
    +INSERT INTO User (Username, Email)
    +VALUES ('johndoe123', 'johndoe123@example.com');
    +"""
    +
    +for sql in init_sqls.split(";"):
    +    c.execute(sql)
    +
    +sql_connect.commit()
    +
    +# Connect to the SQLite database
    +vn_milvus.connect_to_sqlite(sqlite_path)
    +
    +

    Обучение на данных

    Мы можем обучить модель на DDL-данных базы данных SQLite. Мы получаем данные DDL и передаем их в функцию train.

    +
    # If there exists training data, we should remove it before training.
    +existing_training_data = vn_milvus.get_training_data()
    +if len(existing_training_data) > 0:
    +    for _, training_data in existing_training_data.iterrows():
    +        vn_milvus.remove_training_data(training_data["id"])
    +
    +# Get the DDL of the SQLite database
    +df_ddl = vn_milvus.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
    +
    +# Train the model on the DDL data
    +for ddl in df_ddl["sql"].to_list():
    +    vn_milvus.train(ddl=ddl)
    +
    +
    Adding ddl: CREATE TABLE Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +)
    +Adding ddl: CREATE TABLE sqlite_sequence(name,seq)
    +Adding ddl: CREATE TABLE Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +)
    +Adding ddl: CREATE TABLE User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +)
    +
    +

    Кроме обучения на DDL-данных, мы также можем обучаться на документации и SQL-запросах базы данных.

    +
    # Add documentation about your business terminology or definitions.
    +vn_milvus.train(
    +    documentation="ABC Corp specializes in cutting-edge technology solutions and innovation."
    +)
    +vn_milvus.train(
    +    documentation="XYZ Inc is a global leader in manufacturing and supply chain management."
    +)
    +
    +# You can also add SQL queries to your training data.
    +vn_milvus.train(sql="SELECT * FROM Customer WHERE Name = 'John Doe'")
    +
    +
    Adding documentation....
    +Adding documentation....
    +Using model gpt-3.5-turbo for 65.0 tokens (approx)
    +Question generated with sql: What are the details of the customer named John Doe? 
    +Adding SQL...
    +
    +
    +
    +
    +
    +'595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sql'
    +
    +

    Давайте посмотрим на обучающие данные.

    +
    training_data = vn_milvus.get_training_data()
    +training_data
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #idвопроссодержание
    0595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sqlКаковы данные о клиенте по имени Джо...SELECT * FROM Customer WHERE Name = 'John Doe'
    025f4956c-e370-4097-994f-996f22d145fa-ddlНетCREATE TABLE Company (\n ID INTEGER PRIMARY...
    1b95ecc66-f65b-49dc-a9f1-c1842ad230ff-ddlНетCREATE TABLE Customer (\n ID INTEGER PRIMAR...
    2fcc73d15-30a5-4421-9d73-b8c3b0ed5305-ddlНетCREATE TABLE sqlite_sequence(name,seq)
    3feae618c-5910-4f6f-8b4b-6cc3e03aec06-ddlНетCREATE TABLE User (\n ID INTEGER PRIMARY KE...
    079a48db1-ba1f-4fd5-be99-74f2ca2eaeeb-docНетКомпания XYZ Inc является мировым лидером в производстве...
    19f9df1b8-ae62-4823-ad28-d7e0f2d1f4c0-docНетABC Corp специализируется на передовых технологиях...
    +
    +

    Генерация SQL и их выполнение

    Поскольку мы тренировались с данными DDL, структура таблицы теперь доступна для генерации SQL-запросов.

    +

    Давайте попробуем выполнить простой вопрос.

    +
    sql = vn_milvus.generate_sql("what is the phone number of John Doe?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\nCREATE TABLE User (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Username TEXT NOT NULL UNIQUE,\n    Email TEXT NOT NULL UNIQUE\n)\n\n\n===Additional Context \n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'what is the phone number of John Doe?'}]
    +Using model gpt-3.5-turbo for 367.25 tokens (approx)
    +LLM Response: SELECT Phone FROM Customer WHERE Name = 'John Doe'
    +
    +
    + + + + + + + + + + + + + +
    #Телефон
    0123-456-7890
    +
    +

    А вот более сложный вопрос. Информация о названии производственной корпорации находится в данных документа, который является справочной информацией. Сформированный SQL-запрос извлекает информацию о клиенте на основе конкретного названия производственной корпорации.

    +
    sql = vn_milvus.generate_sql("which customer works for a manufacturing corporation?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Company (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Industry TEXT NOT NULL,\n    Location TEXT NOT NULL,\n    EmployeeCount INTEGER NOT NULL\n)\n\nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\n\n===Additional Context \n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'which customer works for a manufacturing corporation?'}]
    +Using model gpt-3.5-turbo for 384.25 tokens (approx)
    +LLM Response: SELECT * 
    +FROM Customer 
    +WHERE Company = 'XYZ Inc'
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    #IDИмяКомпанияГородТелефон
    02Джейн СмитXYZ IncЛос-Анджелес098-765-4321
    +
    +

    Отключитесь от SQLite и Milvus и удалите их, чтобы освободить ресурсы.

    +
    sql_connect.close()
    +milvus_client.close()
    +
    +os.remove(sqlite_path)
    +if os.path.exists(milvus_uri):
    +    os.remove(milvus_uri)
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.json b/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.json new file mode 100644 index 000000000..09ce8c304 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.json @@ -0,0 +1 @@ +{"codeList":["python3 -m pip install pymilvus fiftyone torch torchvision\n","import fiftyone as fo\nimport fiftyone.brain as fob\nimport fiftyone.zoo as foz\n\n# Step 1: Load your data into FiftyOne\ndataset = foz.load_zoo_dataset(\"quickstart\")\n\n# Steps 2 and 3: Compute embeddings and create a similarity index\nmilvus_index = fob.compute_similarity(\n dataset,\n brain_key=\"milvus_index\",\n backend=\"milvus\",\n)\n","# Step 4: Query your data\nquery = dataset.first().id # query by sample ID\nview = dataset.sort_by_similarity(\n query,\n brain_key=\"milvus_index\",\n k=10, # limit to 10 most similar samples\n)\n\n# Step 5 (optional): Cleanup\n\n# Delete the Milvus collection\nmilvus_index.cleanup()\n\n# Delete run record from FiftyOne\ndataset.delete_brain_run(\"milvus_index\")\n","# Step 5: Delete the index\nmilvus_index.delete()\n","import fiftyone.brain as fob\n\nfob.compute_similarity(..., backend=\"milvus\", ...)\n","export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus\n","{\n \"default_similarity_backend\": \"milvus\"\n}\n","export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX\n\n# also available if necessary\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"uri\": \"XXXXXX\",\n \"user\": \"XXXXXX\",\n \"password\": \"XXXXXX\",\n\n # also available if necessary\n \"secure\": true,\n \"token\": \"XXXXXX\",\n \"db_name\": \"XXXXXX\",\n \"client_key_path\": \"XXXXXX\",\n \"client_pem_path\": \"XXXXXX\",\n \"ca_pem_path\": \"XXXXXX\",\n \"server_pem_path\": \"XXXXXX\",\n \"server_name\": \"XXXXXX\"\n }\n }\n}\n","import fiftyone.brain as fob\n\nmilvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","milvus_index = dataset.load_brain_results(\n \"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"collection_name\": \"your_collection\",\n \"metric\": \"dotproduct\",\n \"consistency_level\": \"Strong\"\n }\n }\n}\n","milvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n collection_name=\"your_collection\",\n metric=\"dotproduct\",\n consistency_level=\"Strong\",\n)\n","import fiftyone.brain as fob\n\n# List all brain runs\ndataset.list_brain_runs()\n\n# Only list similarity runs\ndataset.list_brain_runs(type=fob.Similarity)\n\n# Only list specific similarity runs\ndataset.list_brain_runs(\n type=fob.Similarity,\n patches_field=\"ground_truth\",\n supports_prompts=True,\n)\n","info = dataset.get_brain_info(brain_key)\nprint(info)\n","dataset.rename_brain_run(brain_key, new_brain_key)\n","dataset.delete_brain_run(brain_key)\n","# Delete the Milvus collection\nmilvus_index = dataset.load_brain_results(brain_key)\nmilvus_index.cleanup()\n"],"headingContent":"Conduct Vision Searches with Milvus and FiftyOne","anchorList":[{"label":"Проводите зрительный поиск с помощью Milvus и FiftyOne","href":"Conduct-Vision-Searches-with-Milvus-and-FiftyOne","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Требования к установке","href":"Installing-Requirements","type":2,"isActive":false},{"label":"Основной рецепт","href":"Basic-recipe","type":2,"isActive":false},{"label":"Процедуры","href":"Procedures","type":2,"isActive":false},{"label":"Использование бэкэнда Milvus","href":"Use-the-Milvus-backend","type":2,"isActive":false},{"label":"Аутентификация","href":"Authentication","type":2,"isActive":false},{"label":"Управление прогонами мозга","href":"Manage-brain-runs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.md b/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.md new file mode 100644 index 000000000..e5be27b8d --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_voxel51.md @@ -0,0 +1,337 @@ +--- +id: integrate_with_voxel51.md +summary: На этой странице рассматривается интеграция с voxel51 +title: Проводите зрительный поиск с помощью Milvus и FiftyOne +--- +

    Проводите зрительный поиск с помощью Milvus и FiftyOne

    FiftyOne - это инструмент с открытым исходным кодом для создания высококачественных наборов данных и моделей компьютерного зрения. Это руководство поможет вам интегрировать возможности поиска по сходству Milvus в FiftyOne, что позволит вам проводить поиск по сходству в ваших собственных наборах данных.

    +

    FiftyOne предоставляет API для создания коллекций Milvus, загрузки векторов и выполнения запросов на поиск сходства, как программно на языке Python, так и с помощью "укажи и щелкни" в приложении. Демонстрация на этой странице посвящена программной интеграции.

    +

    Предварительные условия

    Перед началом работы убедитесь, что у вас есть все необходимое:

    + +

    Требования к установке

    Для этого примера мы будем использовать pymilvus и fiftyone. Вы можете установить их, выполнив следующие команды:

    +
    python3 -m pip install pymilvus fiftyone torch torchvision
    +
    +

    Основной рецепт

    Основная схема работы по использованию Milvus для создания индекса сходства в наборах данных FiftyOne и использования его для запросов к данным выглядит следующим образом:

    +
      +
    1. Загрузите набор данных в FiftyOne.
    2. +
    3. Вычислите векторные вложения для образцов или патчей в вашем наборе данных или выберите модель для использования генерируемых вложений.
    4. +
    5. Используйте compute_similarity() чтобы сгенерировать индекс сходства Милвуса для образцов или пятен объектов в наборе данных, задав параметр backend="milvus" и указав brain_key по вашему выбору.
    6. +
    7. Используйте этот индекс сходства Милвуса для запроса данных с помощью sort_by_similarity().
    8. +
    9. При желании удалите индекс.
    10. +
    +

    Процедуры

    Приведенный ниже пример демонстрирует описанный выше рабочий процесс.

    +

    1. Загрузите набор данных в FiftyOne и вычислите вкрапления для образцов.

    В приведенном ниже коде для демонстрации интеграции используется набор образцов изображений, предоставленный FiftyOne. Вы можете подготовить свой собственный набор изображений, обратившись к этой статье.

    +
    import fiftyone as fo
    +import fiftyone.brain as fob
    +import fiftyone.zoo as foz
    +
    +# Step 1: Load your data into FiftyOne
    +dataset = foz.load_zoo_dataset("quickstart")
    +
    +# Steps 2 and 3: Compute embeddings and create a similarity index
    +milvus_index = fob.compute_similarity(
    +    dataset,
    +    brain_key="milvus_index",
    +    backend="milvus",
    +)
    +
    +

    2. Проведите поиск сходства по видению

    Теперь вы можете использовать индекс сходства Milvus для проведения поиска сходства по зрению в вашем наборе данных.

    +
    # Step 4: Query your data
    +query = dataset.first().id  # query by sample ID
    +view = dataset.sort_by_similarity(
    +    query,
    +    brain_key="milvus_index",
    +    k=10,  # limit to 10 most similar samples
    +)
    +
    +# Step 5 (optional): Cleanup
    +
    +# Delete the Milvus collection
    +milvus_index.cleanup()
    +
    +# Delete run record from FiftyOne
    +dataset.delete_brain_run("milvus_index")
    +
    +

    3. Удалить индекс

    Если индекс сходства Milvus вам больше не нужен, вы можете удалить его с помощью следующего кода:

    +
    # Step 5: Delete the index
    +milvus_index.delete()
    +
    +

    Использование бэкэнда Milvus

    По умолчанию при вызове compute_similarity() или sort_by_similarity() будет использоваться бэкенд sklearn.

    +

    Чтобы использовать бэкенд Milvus, просто установите необязательный параметр бэкенда compute_similarity()"milvus" :

    +
    import fiftyone.brain as fob
    +
    +fob.compute_similarity(..., backend="milvus", ...)
    +
    +

    Кроме того, вы можете постоянно настраивать FiftyOne на использование бэкенда Milvus, установив следующую переменную окружения:

    +
    export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
    +
    +

    или установив параметр default_similarity_backend в конфиге вашего мозга, расположенном по адресу ~/.fiftyone/brain_config.json:

    +
    {
    +    "default_similarity_backend": "milvus"
    +}
    +
    +

    Аутентификация

    Если вы используете собственный сервер Milvus, вы можете предоставить свои учетные данные различными способами.

    +

    Рекомендуемый способ настройки учетных данных Milvus - хранить их в переменных окружения, показанных ниже, к которым FiftyOne автоматически обращается при каждом подключении к Milvus.

    +
    export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
    +
    +# also available if necessary
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
    +
    +

    FiftyOne Brain config

    Вы также можете хранить свои учетные данные в конфигурации мозга, расположенной по адресу ~/.fiftyone/brain_config.json:

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "uri": "XXXXXX",
    +            "user": "XXXXXX",
    +            "password": "XXXXXX",
    +
    +            # also available if necessary
    +            "secure": true,
    +            "token": "XXXXXX",
    +            "db_name": "XXXXXX",
    +            "client_key_path": "XXXXXX",
    +            "client_pem_path": "XXXXXX",
    +            "ca_pem_path": "XXXXXX",
    +            "server_pem_path": "XXXXXX",
    +            "server_name": "XXXXXX"
    +        }
    +    }
    +}
    +
    +

    Обратите внимание, что этот файл не будет существовать, пока вы его не создадите.

    +

    Аргументы ключевых слов

    Вы можете вручную указывать свои учетные данные Milvus в качестве аргументов ключевых слов при каждом вызове методов типа compute_similarity() которые требуют подключения к Milvus:

    +
    import fiftyone.brain as fob
    +
    +milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    Обратите внимание, что при использовании этой стратегии вы должны вручную указывать учетные данные при последующей загрузке индекса через load_brain_results():

    +
    milvus_index = dataset.load_brain_results(
    +    "milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    Параметры конфигурации Milvus

    Бэкэнд Milvus поддерживает множество параметров запроса, которые можно использовать для настройки запросов на сходство. К таким параметрам относятся:

    +
      +
    • имя_коллекции(нет): имя коллекции Milvus, которую нужно использовать или создать. Если имя не указано, будет создана новая коллекция

    • +
    • metric ("dotproduct"): метрика расстояния встраивания, которую следует использовать при создании нового индекса. Поддерживаются следующие значения: ("dotproduct", "euclidean")

    • +
    • consistency_level ("Session"): используемый уровень согласованности. Поддерживаются следующие значения: ("Strong", "Session", "Bounded", "Eventually")

    • +
    +

    Подробную информацию об этих параметрах см. в документации по аутентификации Milvus и документации по уровням согласованности Milvus.

    +

    Вы можете указать эти параметры с помощью любой из стратегий, описанных в предыдущем разделе. Вот пример конфигурации мозга, включающей все доступные параметры:

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "collection_name": "your_collection",
    +            "metric": "dotproduct",
    +            "consistency_level": "Strong"
    +        }
    +    }
    +}
    +
    +

    Однако обычно эти параметры напрямую передаются в compute_similarity() для настройки конкретного нового индекса:

    +
    milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    collection_name="your_collection",
    +    metric="dotproduct",
    +    consistency_level="Strong",
    +)
    +
    +

    Управление прогонами мозга

    FiftyOne предоставляет множество методов, которые вы можете использовать для управления мозговыми прогонами.

    +

    Например, вы можете вызвать list_brain_runs() чтобы просмотреть доступные мозговые ключи в наборе данных:

    +
    import fiftyone.brain as fob
    +
    +# List all brain runs
    +dataset.list_brain_runs()
    +
    +# Only list similarity runs
    +dataset.list_brain_runs(type=fob.Similarity)
    +
    +# Only list specific similarity runs
    +dataset.list_brain_runs(
    +    type=fob.Similarity,
    +    patches_field="ground_truth",
    +    supports_prompts=True,
    +)
    +
    +

    Или вы можете использовать get_brain_info() для получения информации о конфигурации мозгового цикла:

    +
    info = dataset.get_brain_info(brain_key)
    +print(info)
    +
    +

    Используйте load_brain_results() для загрузки SimilarityIndex экземпляра для мозгового цикла.

    +

    Вы можете использовать rename_brain_run() чтобы переименовать ключ мозга, связанный с существующим прогоном результатов сходства:

    +
    dataset.rename_brain_run(brain_key, new_brain_key)
    +
    +

    Наконец, вы можете использовать delete_brain_run() для удаления мозгового прогона:

    +
    dataset.delete_brain_run(brain_key)
    +
    +
    +

    Вызов delete_brain_run() удаляет только запись о мозговом прогоне из набора данных FiftyOne; при этом не удаляются связанные с ним коллекции Milvus, что можно сделать следующим образом:

    +
    # Delete the Milvus collection
    +milvus_index = dataset.load_brain_results(brain_key)
    +milvus_index.cleanup()
    +
    +
    +

    Для общего рабочего процесса векторного поиска в наборе данных FiftyOne с использованием бэкенда Milvus см. примеры здесь.

    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.json b/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.json new file mode 100644 index 000000000..f9860ac30 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade voyageai pymilvus\n","import voyageai\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"voyage-law-2\" # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models\nDIMENSION = 1024 # Dimension of vector embedding\n\n# Connect to VoyageAI with API Key.\nvoyage_client = voyageai.Client(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_voyage_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_voyage_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = voyage_client.embed(\n texts=queries, model=MODEL_NAME, truncation=False\n).embeddings\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n"],"headingContent":"Semantic Search with Milvus and VoyageAI","anchorList":[{"label":"Семантический поиск с помощью Milvus и VoyageAI","href":"Semantic-Search-with-Milvus-and-VoyageAI","type":1,"isActive":false},{"label":"Начало работы","href":"Getting-started","type":2,"isActive":false},{"label":"Поиск названий книг с помощью VoyageAI и Milvus","href":"Searching-book-titles-with-VoyageAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.md b/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.md new file mode 100644 index 000000000..6aa8e2cd4 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_voyageai.md @@ -0,0 +1,136 @@ +--- +id: integrate_with_voyageai.md +title: Семантический поиск с помощью Milvus и VoyageAI +summary: >- + На этой странице рассматривается интеграция векторной базы данных с API + встраивания VoyageAI. +--- +

    Семантический поиск с помощью Milvus и VoyageAI

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как можно использовать VoyageAI's Embedding API с векторной базой данных Milvus для проведения семантического поиска по тексту.

    +

    Начало работы

    Прежде чем начать, убедитесь, что у вас готов ключ Voyage API, или получите его на сайте VoyageAI.

    +

    В этом примере используются данные о названиях книг. Вы можете скачать набор данных здесь и поместить его в ту же директорию, где вы запускаете следующий код.

    +

    Сначала установите пакет для Milvus и Voyage AI:

    +
    $ pip install --upgrade voyageai pymilvus
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам, возможно, потребуется перезапустить среду выполнения. (Нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    После этого мы готовы к генерации вкраплений и использованию векторной базы данных для семантического поиска.

    +

    Поиск названий книг с помощью VoyageAI и Milvus

    В следующем примере мы загружаем данные о названиях книг из загруженного CSV-файла, используем модель встраивания Voyage AI для генерации векторных представлений и сохраняем их в векторной базе данных Milvus для семантического поиска.

    +
    import voyageai
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "voyage-law-2"  # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models
    +DIMENSION = 1024  # Dimension of vector embedding
    +
    +# Connect to VoyageAI with API Key.
    +voyage_client = voyageai.Client(api_key="<YOUR_VOYAGEAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_voyage_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_voyage_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Теперь, когда все данные находятся в векторной базе Milvus, мы можем выполнить семантический поиск, сгенерировав векторное вложение для запроса и выполнив векторный поиск.

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = voyage_client.embed(
    +    texts=queries, model=MODEL_NAME, truncation=False
    +).embeddings
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +
    Query: When was artificial intelligence founded?
    +[{'id': 0, 'distance': 0.7196218371391296, 'entity': {'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}}, {'id': 1, 'distance': 0.6297335028648376, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.json b/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.json new file mode 100644 index 000000000..3f6e0fa62 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus, whyhow_rbr\n","from pymilvus import MilvusClient\n\n# Milvus Lite local path\npath=\"./milvus_demo.db\" # random name for local milvus lite db path\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(path)\n","from pymilvus import MilvusClient\n\n# Milvus Cloud credentials\nYOUR_MILVUS_CLOUD_END_POINT = \"YOUR_MILVUS_CLOUD_END_POINT\"\nYOUR_MILVUS_CLOUD_TOKEN = \"YOUR_MILVUS_CLOUD_TOKEN\"\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(\n milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, \n milvus_token=YOUR_MILVUS_CLOUD_TOKEN,\n)\n","# Define collection name\nCOLLECTION_NAME=\"YOUR_COLLECTION_NAME\" # take your own collection name\n\n# Define vector dimension size\nDIMENSION=1536 # decide by the model you use\n","schema = milvus_client.create_schema(auto_id=True) # Enable id matching\n\nschema = milvus_client.add_field(schema=schema, field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema = milvus_client.add_field(schema=schema, field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# Start to indexing data field\nindex_params = milvus_client.prepare_index_params()\nindex_params = milvus_client.add_index(\n index_params=index_params, # pass in index_params object\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n","# Create Collection\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n schema=schema,\n index_params=index_params\n)\n","# get pdfs\npdfs = [\"harry-potter.pdf\", \"game-of-thrones.pdf\"] # replace to your pdfs path\n\n# Uploading the PDF document\nmilvus_client.upload_documents(\n collection_name=COLLECTION_NAME,\n documents=pdfs\n)\n","# Search data and implement RAG!\nres = milvus_client.search(\n question='What food does Harry Potter like to eat?',\n collection_name=COLLECTION_NAME,\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# RULES(search on book harry-potter on page 8):\nPARTITION_NAME='harry-potter' # search on books\npage_number='page_number == 8'\n\n# first create a partitions to store the book and later search on this specific partition:\nmilvus_client.crate_partition(\n collection_name=COLLECTION_NAME,\n partition_name=PARTITION_NAME # separate base on your pdfs type\n)\n\n# search with rules\nres = milvus_client.search(\n question='Tell me about the greedy method',\n collection_name=COLLECTION_NAME,\n partition_names=PARTITION_NAME,\n filter=page_number, # append any rules follow the Boolean Expression Rule\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# Clean up\nmilvus_client.drop_collection(\n collection_name=COLLECTION_NAME\n)\n"],"headingContent":"Integrate Milvus with WhyHow","anchorList":[{"label":"Интеграция Milvus с WhyHow","href":"Integrate-Milvus-with-WhyHow","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Установка","href":"Installation","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-Collection","type":2,"isActive":false},{"label":"Загрузка документов","href":"Upload-documents","type":2,"isActive":false},{"label":"Ответ на вопрос","href":"Question-answering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.md b/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.md new file mode 100644 index 000000000..452ba5055 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrate_with_whyhow.md @@ -0,0 +1,218 @@ +--- +id: integrate_with_whyhow.md +summary: >- + В этом руководстве показано, как использовать whyhow.ai и Milvus Lite для + выполнения поиска на основе правил. +title: Интеграция Milvus с WhyHow +--- +

    Интеграция Milvus с WhyHow

    В этом руководстве показано, как использовать whyhow.ai и Milvus Lite для выполнения поиска на основе правил.

    +

    Обзор

    WhyHow - это платформа, которая предоставляет разработчикам строительные блоки, необходимые для организации, контекстуализации и надежного извлечения неструктурированных данных для выполнения сложных RAG. Пакет Rule-based Retrieval - это пакет Python, разработанный WhyHow, который позволяет людям создавать и управлять приложениями Retrieval Augmented Generation (RAG) с расширенными возможностями фильтрации.

    +

    Установка

    Перед началом работы установите все необходимые пакеты python для последующего использования.

    +
    pip install --upgrade pymilvus, whyhow_rbr
    +
    +

    Далее нам нужно инициализировать клиент Milvus, чтобы реализовать поиск на основе правил с помощью Milvus Lite.

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Lite local path
    +path="./milvus_demo.db" # random name for local milvus lite db path
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(path)
    +
    +

    Вы также можете инициализировать клиента Milvus через Milvus Cloud

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Cloud credentials
    +YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
    +YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(
    +        milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, 
    +        milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
    +)
    +
    +

    Создание коллекции

    Определение необходимых переменных

    # Define collection name
    +COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
    +
    +# Define vector dimension size
    +DIMENSION=1536 # decide by the model you use
    +
    +

    Добавить схему

    Прежде чем вставлять данные в базу данных Milvus Lite, нам нужно сначала определить поле данных, которое здесь называется схемой. С помощью создания объекта CollectionSchema и добавления поля данных через add_field() мы можем управлять типом данных и их характеристиками. Этот шаг является обязательным перед вставкой любых данных в Milvus.

    +
    schema = milvus_client.create_schema(auto_id=True) # Enable id matching
    +
    +schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    Создание индекса

    Для каждой схемы лучше иметь индекс, чтобы запросы были более эффективными. Чтобы создать индекс, нам сначала нужен объект index_params, а затем мы добавляем данные индекса на этот объект IndexParams.

    +
    # Start to indexing data field
    +index_params = milvus_client.prepare_index_params()
    +index_params = milvus_client.add_index(
    +    index_params=index_params,  # pass in index_params object
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +

    Этот метод является тонкой оберткой вокруг официальной реализации Milvus(официальная документация).

    +

    Создание коллекции

    После определения всех полей данных и их индексации нам нужно создать коллекцию базы данных, чтобы мы могли быстро и точно получить доступ к нашим данным. Следует отметить, что мы инициализировали enable_dynamic_field значением true, чтобы вы могли свободно загружать любые данные. Издержки заключаются в том, что запросы к данным могут быть неэффективными.

    +
    # Create Collection
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    schema=schema,
    +    index_params=index_params
    +)
    +
    +

    Загрузка документов

    После создания коллекции мы готовы наполнить ее документами. В whyhow_rbr для этого используется метод upload_documents из MilvusClient. Он выполняет следующие действия под капотом:

    +
      +
    • Предварительная обработка: Чтение и разбиение предоставленных PDF-файлов на фрагменты
    • +
    • Встраивание: Встраивание всех фрагментов с помощью модели OpenAI
    • +
    • Вставка: Загрузка в Milvus Lite как вложений, так и метаданных.
    • +
    +
    # get pdfs
    +pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
    +
    +# Uploading the PDF document
    +milvus_client.upload_documents(
    +    collection_name=COLLECTION_NAME,
    +    documents=pdfs
    +)
    +
    +

    Ответ на вопрос

    Теперь мы можем перейти к созданию дополненного поиска.

    +
    # Search data and implement RAG!
    +res = milvus_client.search(
    +    question='What food does Harry Potter like to eat?',
    +    collection_name=COLLECTION_NAME,
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    Правила

    В предыдущем примере рассматривался каждый документ в нашем индексе. Однако иногда может быть полезно получить только документы, удовлетворяющие некоторым заданным условиям (например, filename=harry-potter.pdf). В whyhow_rbr через Milvus Lite это можно сделать с помощью настройки параметров поиска.

    +

    Правило может управлять следующими атрибутами метаданных

    +
      +
    • filename имя файла
    • +
    • page_numbers список целых чисел, соответствующих номерам страниц (индексация 0)
    • +
    • id уникальный идентификатор чанка (это самый "экстремальный" фильтр).
    • +
    • Другие правила на основе булевых выражений
    • +
    +
    # RULES(search on book harry-potter on page 8):
    +PARTITION_NAME='harry-potter' # search on books
    +page_number='page_number == 8'
    +
    +# first create a partitions to store the book and later search on this specific partition:
    +milvus_client.crate_partition(
    +    collection_name=COLLECTION_NAME,
    +    partition_name=PARTITION_NAME # separate base on your pdfs type
    +)
    +
    +# search with rules
    +res = milvus_client.search(
    +    question='Tell me about the greedy method',
    +    collection_name=COLLECTION_NAME,
    +    partition_names=PARTITION_NAME,
    +    filter=page_number, # append any rules follow the Boolean Expression Rule
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    В этом примере мы сначала создаем раздел, в котором хранятся pdf-файлы, связанные с Гарри Поттером, и через поиск в этом разделе мы можем получить самую прямую информацию. Кроме того, мы применяем номера страниц в качестве фильтра, чтобы указать точную страницу, по которой мы хотим выполнить поиск. Помните, что параметр filer должен соответствовать правилу boolean.

    +

    Очистка

    Наконец, после выполнения всех инструкций вы можете очистить базу данных, вызвав команду drop_collection().

    +
    # Clean up
    +milvus_client.drop_collection(
    +    collection_name=COLLECTION_NAME
    +)
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/integrations_overview.json b/localization/v2.5.x/site/ru/integrations/integrations_overview.json new file mode 100644 index 000000000..277fb9b40 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrations_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Integrations Overview","anchorList":[{"label":"Обзор интеграций","href":"Integrations-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/integrations_overview.md b/localization/v2.5.x/site/ru/integrations/integrations_overview.md new file mode 100644 index 000000000..ce58aaa73 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/integrations_overview.md @@ -0,0 +1,80 @@ +--- +id: integrations_overview.md +summary: >- + На этой странице представлен список руководств по взаимодействию с Milvus и + сторонними инструментами. +title: Обзор интеграций +--- +

    Обзор интеграций

    На этой странице представлен список руководств по взаимодействию Milvus с инструментами сторонних производителей.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    УчебникПример использованияПартнеры или стеки
    RAG с Milvus и LlamaIndexRAGMilvus, LLamaIndex
    RAG с Milvus и LangChainRAGMilvus, LangChain
    Гибридный поисковый ретривер Milvus в LangChainГибридный поискMilvus, LangChain
    Семантический поиск с помощью Milvus и OpenAIСемантический поискMilvus, OpenAI
    Ответы на вопросы с помощью Milvus и CohereСемантический поискMilvus, Cohere
    Ответы на вопросы с использованием Milvus и HuggingFaceОтветы на вопросыMilvus, HuggingFace
    Поиск изображений с использованием Milvus и PytorchСемантический поискMilvus, Pytorch
    Поиск фильмов с использованием Milvus и SentenceTransfromersСемантический поискMilvus, SentenceTransformers
    Использование Milvus в качестве хранилища векторов в LangChainСемантический поискMilvus, LangChain
    RAG с Milvus и HaystackRAGMilvus, Haystack
    Проведение визуального поиска с помощью Milvus и FiftyOneСемантический поискMilvus, FiftyOne
    Семантический поиск с помощью Milvus и VoyageAIСемантический поискMilvus, VoyageAI
    RAG с Milvus и BentoMLRAGMilvus, BentoML
    RAG с Milvus и DSPyRAGMilvus, DSPy
    Семантический поиск с Milvus и JinaСемантический поискMilvus, Jina
    Milvus на контейнерных сервисах SnowparkСоединение данныхMilvus, Snowpark
    Поиск на основе правил с помощью Milvus и WhyHowОтветы на вопросыMilvus, WhyHow
    Milvus в LangfuseНаблюдаемостьMilvus, Langfuse
    Оценка RAG с помощью раг и милвусаОценкаMilvus, Ragas
    Агент чатбота с помощью Milvus и MemGPTАгентMilvus, MemGPT
    Как развернуть FastGPT с помощью MilvusRAGMilvus, FastGPT
    Написание SQL с помощью Vanna и MilvusRAGMilvus, Vanna
    RAG с Milvus и CamelRAGMilvus, Camel
    Airbyte и Milvus: инфраструктура перемещения данных с открытым исходным кодомСоединение данныхMilvus, Airbyte
    Расширенный поиск видео: Использование Twelve Labs и Milvus для семантического поискаСемантический поискMilvus, Twelve Labs
    Создание RAG с помощью Milvus, vLLM и Llama 3.1RAGMilvus, vLLM, LlamaIndex
    Мультиагентные системы с Mistral AI, Milvus и Llama-agentsАгентMilvus, Mistral AI, LlamaIndex
    Подключение Kafka к MilvusИсточники данныхMilvus, Kafka
    Kotaemon RAG с MilvusRAGMilvus, Kotaemon
    Генерация с расширением поиска: Поиск сайтов с помощью Apify и сохранение данных в Milvus для ответов на вопросыИсточники данныхMilvus, Apify
    Оценка с помощью DeepEvalОценка и наблюдаемостьMilvus, DeepEval
    Оценка с помощью Arize PheonixОценка и наблюдаемостьMilvus, Arize Pheonix
    Развертывание Dify с помощью MilvusOchestrationMilvus, Dify
    Построение системы RAG с использованием Langflow и MilvusOchestrationMilvus, Langflow
    Построение RAG на архитектуре ArmRAGMilvus, Arm
    Построение RAG с помощью Milvus и Fireworks AILLMsMilvus, Fireworks AI
    Постройте RAG с помощью Milvus и Lepton AILLMsMilvus, Lepton AI
    Построение RAG с помощью Milvus и SiliconFlowLLMsMilvus, SiliconFlow
    Построение RAG с помощью Milvus и неструктурированныхИсточники данныхMilvus, неструктурированные данные
    Построение RAG с помощью Milvus + PII MaskerИсточники данныхMilvus, PII Masker
    Использование Milvus в PrivateGPTOchestrationвекторный поиск
    Начало работы с Mem0 и MilvusАгентыMem0, Milvus
    Таблица знаний с MilvusИнженерия знанийТаблица знаний, Milvus
    Использование Milvus в DocsGPTOchestrationDocsGPT, Milvus
    Использование Milvus с SambaNovaOrchestrationMilvus, SambaNova
    Построение RAG с помощью Milvus и CogneeИнженерия знанийMilvus, Cognee
    Построение RAG с помощью Milvus и GeminiLLMsMilvus, Gemini
    Построение RAG с помощью Milvus и OllamaLLMsMilvus, Ollama
    Начало работы с Dynamiq и MilvusОркестровкаMilvus, Dynamiq
    Построение RAG с помощью Milvus и DeepSeekLLMsMilvus, DeepSeek
    diff --git a/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.json b/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.json new file mode 100644 index 000000000..4ce7f4d45 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ tar -xzf kafka_2.13-3.6.1.tgz\n$ cd kafka_2.13-3.6.1\n","$ bin/zookeeper-server-start.sh config/zookeeper.properties\n","$ bin/kafka-server-start.sh config/server.properties\n","$ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092\n","key.converter.schemas.enable=false\nvalue.converter.schemas.enable=false\nplugin.path=libs/zilliz-kafka-connect-milvus-xxx\n","name=zilliz-kafka-connect-milvus\nconnector.class=com.milvus.io.kafka.MilvusSinkConnector\npublic.endpoint=https://:port\ntoken=*****************************************\ncollection.name=topic_0\ntopics=topic_0\n","$ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties\n","bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092 \n>{\"id\": 0, \"title\": \"The Reported Mortality Rate of Coronavirus Is Not Important\", \"title_vector\": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], \"link\": \"https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912\"}\n"],"headingContent":"Connect Kafka with Milvus","anchorList":[{"label":"Подключение Kafka к Milvus","href":"Connect-Kafka-with-Milvus","type":1,"isActive":false},{"label":"Шаг 1: Скачайте плагин kafka-connect-milvus","href":"Step-1-Download-the-kafka-connect-milvus-plugin","type":2,"isActive":false},{"label":"Шаг 2: Загрузите Kafka","href":"Step-2-Download-Kafka","type":2,"isActive":false},{"label":"ШАГ 3: Запустите среду Kafka","href":"STEP-3-Start-the-Kafka-Environment","type":2,"isActive":false},{"label":"Шаг 4: Настройте Kafka и Zilliz Cloud","href":"Step-4-Configure-Kafka-and-Zilliz-Cloud","type":2,"isActive":false},{"label":"Шаг 5: Загрузите плагин kafka-connect-milvus в Kafka Instance","href":"Step-5-Load-the-kafka-connect-milvus-plugin-to-Kafka-Instance","type":2,"isActive":false},{"label":"Шаг 6: Запуск коннектора","href":"Step-6-Launch-the-connector","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.md b/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.md new file mode 100644 index 000000000..41d17421f --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/kafka-connect-milvus.md @@ -0,0 +1,181 @@ +--- +id: kafka-connect-milvus.md +summary: >- + В этом кратком руководстве мы покажем, как настроить kafka с открытым исходным + кодом и Zilliz Cloud для получения векторных данных. +title: Интеграция Milvus с WhyHow +--- +

    Подключение Kafka к Milvus

    В этом кратком руководстве мы покажем, как настроить кафку с открытым исходным кодом и облако Zilliz для получения векторных данных.

    +

    Шаг 1: Скачайте плагин kafka-connect-milvus

    Выполните следующие шаги, чтобы загрузить плагин kafka-connect-milvus.

    +
      +
    1. Загрузите последнюю версию zip-файла плагина zilliz-kafka-connect-milvus-xxx.zip отсюда.
    2. +
    +

    Шаг 2: Загрузите Kafka

      +
    1. Загрузите последнюю версию kafka отсюда.
    2. +
    3. Распакуйте скачанный файл и перейдите в каталог kafka.
    4. +
    +
    $ tar -xzf kafka_2.13-3.6.1.tgz
    +$ cd kafka_2.13-3.6.1
    +
    +

    ШАГ 3: Запустите среду Kafka

    +

    ПРИМЕЧАНИЕ: В вашей локальной среде должна быть установлена Java 8+.

    +
    +

    Выполните следующие команды, чтобы запустить все службы в правильном порядке:

    +
      +
    1. Запустить службу ZooKeeper

      +
      $ bin/zookeeper-server-start.sh config/zookeeper.properties
      +
    2. +
    3. Запустить службу брокера Kafka

      +

      Откройте еще один сеанс терминала и выполните команду:

      +
      $ bin/kafka-server-start.sh config/server.properties
      +
    4. +
    +

    После успешного запуска всех служб у вас будет запущена базовая среда Kafka, готовая к использованию.

    +
      +
    • Ознакомьтесь с официальным руководством по быстрому запуску Kafka для получения подробной информации: https://kafka.apache.org/quickstart.
    • +
    +

    Шаг 4: Настройте Kafka и Zilliz Cloud

    Убедитесь, что Kafka и Zilliz Cloud установлены и правильно настроены.

    +
      +
    1. Если у вас еще нет темы в Kafka, создайте тему (например, topic_0) в Kafka.

      +
      $ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092
      +
    2. +
    3. Если у вас еще нет коллекции в Zilliz Cloud, создайте коллекцию с векторным полем (в данном примере вектор имеет значение dimension=8). Вы можете использовать следующий пример схемы в Zilliz Cloud:

      +

      +

      +

      Примечание: Убедитесь, что схемы обеих сторон соответствуют друг другу. В схеме имеется ровно одно векторное поле. Имена каждого поля на обеих сторонах абсолютно одинаковы.

      +

    4. +
    +

    Шаг 5: Загрузите плагин kafka-connect-milvus в Kafka Instance

      +
    1. распакуйте файл zilliz-kafka-connect-milvus-xxx.zip, который вы скачали в шаге 1.

    2. +
    3. скопируйте директории zilliz-kafka-connect-milvus в директорию libs вашей установки Kafka.

    4. +
    5. измените файл connect-standalone.properties в каталоге config вашей установки Kafka.

      +
      key.converter.schemas.enable=false
      +value.converter.schemas.enable=false
      +plugin.path=libs/zilliz-kafka-connect-milvus-xxx
      +
    6. +
    7. создайте и настройте файл milvus-sink-connector.properties в каталоге config вашей установки Kafka.

      +
      name=zilliz-kafka-connect-milvus
      +connector.class=com.milvus.io.kafka.MilvusSinkConnector
      +public.endpoint=https://<public.endpoint>:port
      +token=*****************************************
      +collection.name=topic_0
      +topics=topic_0
      +
    8. +
    +

    Шаг 6: Запуск коннектора

      +
    1. Запустите коннектор с предыдущим файлом конфигурации.

      +
      $ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties
      +
    2. +
    3. Попробуйте создать сообщение в тему Kafka, которую вы только что создали в Kafka.

      +
      bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092                        
      +>{"id": 0, "title": "The Reported Mortality Rate of Coronavirus Is Not Important", "title_vector": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], "link": "https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912"}
      +
    4. +
    5. Проверьте, была ли сущность вставлена в коллекцию в Zilliz Cloud. Вот как это выглядит на Zilliz Cloud, если вставка прошла успешно:

      +

    6. +
    +

    Поддержка

    Если вам нужна помощь или у вас есть вопросы по Kafka Connect Milvus Connector, пожалуйста, обращайтесь в нашу службу поддержки: Email: support@zilliz.com

    diff --git a/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.json b/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.json new file mode 100644 index 000000000..cbefc481a --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/whyhow-ai/knowledge-table.git\n","$ docker compose up -d --build\n","$ docker compose down\n"],"headingContent":"Knowledge Table with Milvus","anchorList":[{"label":"Knowledge Table с Milvus","href":"Knowledge-Table-with-Milvus","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Клонирование проекта","href":"Cloning-the-project","type":2,"isActive":false},{"label":"Настройка окружения","href":"Set-up-the-environment","type":2,"isActive":false},{"label":"Запуск приложения","href":"Starting-the-app","type":2,"isActive":false},{"label":"Остановка приложения","href":"Stopping-the-app","type":2,"isActive":false},{"label":"Доступ к проекту","href":"Accessing-the-project","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.md b/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.md new file mode 100644 index 000000000..d37276d8d --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/knowledge_table_with_milvus.md @@ -0,0 +1,145 @@ +--- +id: knowledge_table_with_milvus.md +summary: >- + По умолчанию Knowledge Table использует базу данных Milvus для хранения и + получения извлеченных данных. Это позволяет пользователям легко искать, + фильтровать и анализировать данные, используя мощные возможности Milvus. В + этом руководстве мы покажем, как начать работу с Knowledge Table и Milvus. +title: Knowledge Table с Milvus +--- +

    Knowledge Table с Milvus

    Knowledge Table, разработанный WhyHow AI, - это пакет с открытым исходным кодом, предназначенный для облегчения извлечения и изучения структурированных данных из неструктурированных документов. Он предоставляет пользователям интерфейс, похожий на электронную таблицу, и позволяет создавать представления знаний, такие как таблицы и графики, с помощью интерфейса запросов на естественном языке. Пакет включает настраиваемые правила извлечения, параметры форматирования и возможность отслеживания данных через их происхождение, что делает его пригодным для использования в различных приложениях. Он поддерживает бесшовную интеграцию в рабочие процессы RAG, удовлетворяя как бизнес-пользователей, нуждающихся в удобном интерфейсе, так и разработчиков, которым требуется гибкий бэкэнд для эффективной обработки документов.

    +

    По умолчанию Knowledge Table использует базу данных Milvus для хранения и получения извлеченных данных. Это позволяет пользователям легко искать, фильтровать и анализировать данные, используя мощные возможности Milvus. В этом руководстве мы покажем, как начать работу с Knowledge Table и Milvus.

    +

    Необходимые условия

      +
    • Docker
    • +
    • Docker Compose
    • +
    +

    Клонирование проекта

    $ git clone https://github.com/whyhow-ai/knowledge-table.git
    +
    +

    Настройка окружения

    В корневом каталоге проекта вы найдете файл .env.example. Скопируйте этот файл в каталог .env и заполните необходимые переменные окружения.

    +

    Для Milvus необходимо установить переменные окружения MILVUS_DB_URI и MILVUS_DB_TOKEN. Вот несколько советов:

    +
    +
      +
    • Установка MILVUS_DB_URI в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте MILVUS_DB_URI и MILVUS_DB_TOKEN, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Помимо Milvus, необходимо настроить и другие среды, например OPENAI_API_KEY. Их можно получить на соответствующих сайтах.

    +

    Запуск приложения

    $ docker compose up -d --build
    +
    +

    Остановка приложения

    $ docker compose down
    +
    +

    Доступ к проекту

    Доступ к фронтенду можно получить по адресу http://localhost:3000, а к бэкенду - по адресу http://localhost:8000.

    +

    + + + + +

    +

    Вы можете поиграть с пользовательским интерфейсом и попробовать использовать свои собственные документы.

    +

    Для более подробного демонстрационного использования вы можете обратиться к официальной документации Knowledge Table.

    diff --git a/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.json b/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.json new file mode 100644 index 000000000..2c2afff6c --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["# optional (setup env)\nconda create -n kotaemon python=3.10\nconda activate kotaemon\n\ngit clone https://github.com/Cinnamon/kotaemon\ncd kotaemon\n\npip install -e \"libs/kotaemon[all]\"\npip install -e \"libs/ktem\"\n","\"__type__\": \"kotaemon.storages.MilvusVectorStore\"\n","python app.py\n"],"headingContent":"Kotaemon RAG with Milvus","anchorList":[{"label":"Kotaemon RAG с Milvus","href":"Kotaemon-RAG-with-Milvus","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Запуск RAG с помощью kotaemon","href":"Start-RAG-with-kotaemon","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.md b/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.md new file mode 100644 index 000000000..83cfa7936 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/kotaemon_with_milvus.md @@ -0,0 +1,99 @@ +--- +id: kotaemon_with_milvus.md +summary: >- + В этом руководстве вы узнаете, как настроить приложение kotaemon с помощью + Milvus. +title: Kotaemon RAG с Milvus +--- +

    Kotaemon RAG с Milvus

    Kotaemon - это чистый и настраиваемый RAG-интерфейс с открытым исходным кодом для общения с документами. Создан с учетом пожеланий как конечных пользователей, так и разработчиков.

    +

    Kotaemon представляет собой настраиваемый многопользовательский веб-интерфейс для контроля качества документов, поддерживающий локальные и основанные на API LLM. Он предлагает гибридный конвейер RAG с полнотекстовым и векторным поиском, мультимодальный QA для документов с рисунками и таблицами, а также расширенное цитирование с предварительным просмотром документов. Он поддерживает сложные методы обоснования, такие как ReAct и ReWOO, и предоставляет настраиваемые параметры для поиска и генерации.

    +

    В этом руководстве вы узнаете, как настроить приложение kotaemon с помощью Milvus.

    +

    Необходимые условия

    Установка

    Мы рекомендуем устанавливать kotaemon этим способом:

    +
    # optional (setup env)
    +conda create -n kotaemon python=3.10
    +conda activate kotaemon
    +
    +git clone https://github.com/Cinnamon/kotaemon
    +cd kotaemon
    +
    +pip install -e "libs/kotaemon[all]"
    +pip install -e "libs/ktem"
    +
    +

    Кроме этого способа, есть и другие способы установки kotaemon. За более подробной информацией вы можете обратиться к официальной документации.

    +

    Установка Milvus в качестве векторного хранилища по умолчанию

    Чтобы изменить векторное хранилище по умолчанию на Milvus, необходимо модифицировать файл flowsettings.py, переключив KH_VECTORSTORE на:

    +
    "__type__": "kotaemon.storages.MilvusVectorStore"
    +
    +

    Set Environment Variables

    Вы можете настроить модели через файл .env с информацией, необходимой для подключения к LLM и моделям встраивания. например, OpenAI, Azure, Ollama и т. д.

    +

    Запуск Kotaemon

    После настройки переменных окружения и изменения векторного хранилища, вы можете запустить kotaemon, выполнив следующую команду:

    +
    python app.py
    +
    +

    Имя пользователя / пароль по умолчанию: admin / admin

    +

    Запуск RAG с помощью kotaemon

    1. Добавьте свои модели ИИ

    + + + + +

    +

    На вкладке Resources вы можете добавить и настроить свои LLM и модели встраивания. Вы можете добавить несколько моделей и установить их как активные или неактивные. Вам нужно указать только одну модель. Вы также можете добавить несколько моделей, чтобы обеспечить переключение между ними.

    +

    2. Загрузка документов

    + + + + +

    +

    Чтобы выполнить проверку документов, необходимо сначала загрузить их в приложение. Перейдите на вкладку File Index, и вы сможете загружать и управлять своими пользовательскими документами.

    +

    По умолчанию все данные приложения хранятся в папке ./ktem_app_data. Данные базы данных Milvus хранятся в папке ./ktem_app_data/user_data/vectorstore. Вы можете создать резервную копию или скопировать эту папку, чтобы перенести установку на новую машину.

    +

    3. Общение с документами

    + + + + +

    +

    Теперь перейдите на вкладку Chat. Вкладка "Чат" состоит из трех областей: панель настроек разговора, где вы управляете разговорами и ссылками на файлы; панель чата для взаимодействия с чат-ботом; и информационная панель, где отображаются подтверждающие доказательства, баллы доверия и рейтинги релевантности ответов.

    +

    Вы можете выбрать документы на панели настроек беседы. Затем просто запустите RAG с вашими документами, набрав сообщение в поле ввода и отправив его чатботу.

    +

    Если вы хотите более подробно изучить, как использовать kotaemon, вы можете получить полное руководство из официальной документации.

    diff --git a/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.json b/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.json new file mode 100644 index 000000000..3e49093b3 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.json @@ -0,0 +1 @@ +{"codeList":["%pip install -qU langchain_milvus\n","import EmbeddingTabs from \"@theme/EmbeddingTabs\";\n\n\n","# | output: false\n# | echo: false\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-large\")\n","from langchain_milvus import Milvus\n\n# The easiest way is to use Milvus Lite where everything is stored in a local file.\n# If you have a Milvus server you can use the server URI such as \"http://localhost:19530\".\nURI = \"./milvus_example.db\"\n\nvector_store = Milvus(\n embedding_function=embeddings,\n connection_args={\"uri\": URI},\n)\n","from langchain_core.documents import Document\n\nvector_store_saved = Milvus.from_documents(\n [Document(page_content=\"foo!\")],\n embeddings,\n collection_name=\"langchain_example\",\n connection_args={\"uri\": URI},\n)\n","vector_store_loaded = Milvus(\n embeddings,\n connection_args={\"uri\": URI},\n collection_name=\"langchain_example\",\n)\n","from uuid import uuid4\n\nfrom langchain_core.documents import Document\n\ndocument_1 = Document(\n page_content=\"I had chocalate chip pancakes and scrambled eggs for breakfast this morning.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_2 = Document(\n page_content=\"The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_3 = Document(\n page_content=\"Building an exciting new project with LangChain - come check it out!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_4 = Document(\n page_content=\"Robbers broke into the city bank and stole $1 million in cash.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_5 = Document(\n page_content=\"Wow! That was an amazing movie. I can't wait to see it again.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_6 = Document(\n page_content=\"Is the new iPhone worth the price? Read this review to find out.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_7 = Document(\n page_content=\"The top 10 soccer players in the world right now.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_8 = Document(\n page_content=\"LangGraph is the best framework for building stateful, agentic applications!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_9 = Document(\n page_content=\"The stock market is down 500 points today due to fears of a recession.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_10 = Document(\n page_content=\"I have a bad feeling I am going to get deleted :(\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocuments = [\n document_1,\n document_2,\n document_3,\n document_4,\n document_5,\n document_6,\n document_7,\n document_8,\n document_9,\n document_10,\n]\nuuids = [str(uuid4()) for _ in range(len(documents))]\n\nvector_store.add_documents(documents=documents, ids=uuids)\n","vector_store.delete(ids=[uuids[-1]])\n","results = vector_store.similarity_search(\n \"LangChain provides abstractions to make working with LLMs easy\",\n k=2,\n filter={\"source\": \"tweet\"},\n)\nfor res in results:\n print(f\"* {res.page_content} [{res.metadata}]\")\n","results = vector_store.similarity_search_with_score(\n \"Will it be hot tomorrow?\", k=1, filter={\"source\": \"news\"}\n)\nfor res, score in results:\n print(f\"* [SIM={score:3f}] {res.page_content} [{res.metadata}]\")\n","retriever = vector_store.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1})\nretriever.invoke(\"Stealing from the bank is a crime\", filter={\"source\": \"news\"})\n","from langchain_core.documents import Document\n\ndocs = [\n Document(page_content=\"i worked at kensho\", metadata={\"namespace\": \"harrison\"}),\n Document(page_content=\"i worked at facebook\", metadata={\"namespace\": \"ankush\"}),\n]\nvectorstore = Milvus.from_documents(\n docs,\n embeddings,\n connection_args={\"uri\": URI},\n drop_old=True,\n partition_key_field=\"namespace\", # Use the \"namespace\" field as the partition key\n)\n","# This will only get documents for Ankush\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"ankush\"'}).invoke(\n \"where did i work?\"\n)\n","# This will only get documents for Harrison\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"harrison\"'}).invoke(\n \"where did i work?\"\n)\n"],"headingContent":"Use Milvus as a Vector Store","anchorList":[{"label":"Используйте Milvus в качестве хранилища векторов","href":"Use-Milvus-as-a-Vector-Store","type":1,"isActive":false},{"label":"Установка","href":"Setup","type":2,"isActive":false},{"label":"Инициализация","href":"Initialization","type":2,"isActive":false},{"label":"Управление векторным хранилищем","href":"Manage-vector-store","type":2,"isActive":false},{"label":"Запрос к векторному хранилищу","href":"Query-vector-store","type":2,"isActive":false},{"label":"Использование для генерации с расширенным извлечением","href":"Usage-for-retrieval-augmented-generation","type":2,"isActive":false},{"label":"Справочник API","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.md b/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.md new file mode 100644 index 000000000..c8bd0fdac --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/basic_usage_langchain.md @@ -0,0 +1,321 @@ +--- +id: basic_usage_langchain.md +summary: >- + В этом блокноте показано, как использовать функциональные возможности, + связанные с векторной базой данных Milvus. +title: Используйте Milvus в качестве хранилища векторов +--- +

    Используйте Milvus в качестве хранилища векторов

    +

    Milvus - это база данных, которая хранит, индексирует и управляет массивными векторами встраивания, генерируемыми глубокими нейронными сетями и другими моделями машинного обучения (ML).

    +
    +

    В этом блокноте показано, как использовать функциональность, связанную с векторной базой данных Milvus.

    +

    Установка

    Для использования этой интеграции вам потребуется установить langchain-milvus с pip install -qU langchain-milvus.

    +
    %pip install -qU  langchain_milvus
    +
    +

    Последняя версия pymilvus поставляется с локальной векторной базой данных Milvus Lite, которая хорошо подходит для прототипирования. Если у вас большие объемы данных, например, более миллиона документов, мы рекомендуем установить более производительный сервер Milvus на docker или kubernetes.

    +

    Учетные данные

    Для использования векторного хранилища Milvus учетные данные не требуются.

    +

    Инициализация

    import EmbeddingTabs from "@theme/EmbeddingTabs";
    +
    +<EmbeddingTabs/>
    +
    +
    # | output: false
    +# | echo: false
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
    +
    +
    from langchain_milvus import Milvus
    +
    +# The easiest way is to use Milvus Lite where everything is stored in a local file.
    +# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
    +URI = "./milvus_example.db"
    +
    +vector_store = Milvus(
    +    embedding_function=embeddings,
    +    connection_args={"uri": URI},
    +)
    +
    +

    Разделите данные с помощью коллекций Milvus.

    Вы можете хранить разные несвязанные документы в разных коллекциях в рамках одного экземпляра Milvus, чтобы сохранить контекст.

    +

    Вот как можно создать новую коллекцию

    +
    from langchain_core.documents import Document
    +
    +vector_store_saved = Milvus.from_documents(
    +    [Document(page_content="foo!")],
    +    embeddings,
    +    collection_name="langchain_example",
    +    connection_args={"uri": URI},
    +)
    +
    +

    А вот как получить сохраненную коллекцию.

    +
    vector_store_loaded = Milvus(
    +    embeddings,
    +    connection_args={"uri": URI},
    +    collection_name="langchain_example",
    +)
    +
    +

    Управление векторным хранилищем

    После того как вы создали векторное хранилище, мы можем взаимодействовать с ним, добавляя и удаляя различные элементы.

    +

    Добавление элементов в векторное хранилище

    Мы можем добавлять элементы в векторное хранилище с помощью функции add_documents.

    +
    from uuid import uuid4
    +
    +from langchain_core.documents import Document
    +
    +document_1 = Document(
    +    page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_2 = Document(
    +    page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
    +    metadata={"source": "news"},
    +)
    +
    +document_3 = Document(
    +    page_content="Building an exciting new project with LangChain - come check it out!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_4 = Document(
    +    page_content="Robbers broke into the city bank and stole $1 million in cash.",
    +    metadata={"source": "news"},
    +)
    +
    +document_5 = Document(
    +    page_content="Wow! That was an amazing movie. I can't wait to see it again.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_6 = Document(
    +    page_content="Is the new iPhone worth the price? Read this review to find out.",
    +    metadata={"source": "website"},
    +)
    +
    +document_7 = Document(
    +    page_content="The top 10 soccer players in the world right now.",
    +    metadata={"source": "website"},
    +)
    +
    +document_8 = Document(
    +    page_content="LangGraph is the best framework for building stateful, agentic applications!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_9 = Document(
    +    page_content="The stock market is down 500 points today due to fears of a recession.",
    +    metadata={"source": "news"},
    +)
    +
    +document_10 = Document(
    +    page_content="I have a bad feeling I am going to get deleted :(",
    +    metadata={"source": "tweet"},
    +)
    +
    +documents = [
    +    document_1,
    +    document_2,
    +    document_3,
    +    document_4,
    +    document_5,
    +    document_6,
    +    document_7,
    +    document_8,
    +    document_9,
    +    document_10,
    +]
    +uuids = [str(uuid4()) for _ in range(len(documents))]
    +
    +vector_store.add_documents(documents=documents, ids=uuids)
    +
    +
    ['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
    + 'fa642726-5329-4495-a072-187e948dd71f',
    + '9905001c-a4a3-455e-ab94-72d0ed11b476',
    + 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
    + '7508f7ff-c0c9-49ea-8189-634f8a0244d8',
    + '2e179609-3ff7-4c6a-9e05-08978903fe26',
    + 'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
    + '1206d237-ee3a-484f-baf2-b5ac38eeb314',
    + 'd43cbf9a-a772-4c40-993b-9439065fec01',
    + '25e667bb-6f09-4574-a368-661069301906']
    +
    +

    Удалить элементы из векторного хранилища

    vector_store.delete(ids=[uuids[-1]])
    +
    +
    (insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
    +
    +

    Запрос к векторному хранилищу

    После создания векторного хранилища и добавления соответствующих документов вы, скорее всего, захотите запросить его во время работы вашей цепочки или агента.

    +

    Запрос напрямую

    Выполнить простой поиск по сходству с фильтрацией по метаданным можно следующим образом:

    +
    results = vector_store.similarity_search(
    +    "LangChain provides abstractions to make working with LLMs easy",
    +    k=2,
    +    filter={"source": "tweet"},
    +)
    +for res in results:
    +    print(f"* {res.page_content} [{res.metadata}]")
    +
    +
    * Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
    +* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
    +
    +

    Поиск по сходству с оценкой

    Вы также можете выполнить поиск с помощью оценки:

    +
    results = vector_store.similarity_search_with_score(
    +    "Will it be hot tomorrow?", k=1, filter={"source": "news"}
    +)
    +for res, score in results:
    +    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
    +
    +
    * [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
    +
    +

    Полный список всех вариантов поиска, доступных при использовании векторного хранилища Milvus, можно найти в справочнике API.

    +

    Превращение запроса в ретривер

    Вы также можете превратить векторное хранилище в ретривер для более удобного использования в ваших цепочках.

    +
    retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
    +retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
    +
    +
    [Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
    +
    +

    Использование для генерации с расширенным извлечением

    Руководства по использованию этого векторного хранилища для генерации с расширением поиска (RAG) см. в следующих разделах:

    + +

    Поиск для каждого пользователя

    При создании поискового приложения часто приходится учитывать интересы нескольких пользователей. Это означает, что вы можете хранить данные не только для одного пользователя, но и для многих других, и они не должны видеть данные друг друга.

    +

    Milvus рекомендует использовать partition_key для реализации многопользовательского доступа, вот пример.

    +
    +

    Функция Partition key сейчас недоступна в Milvus Lite, если вы хотите использовать ее, вам нужно запустить сервер Milvus из docker или kubernetes.

    +
    +
    from langchain_core.documents import Document
    +
    +docs = [
    +    Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
    +    Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
    +]
    +vectorstore = Milvus.from_documents(
    +    docs,
    +    embeddings,
    +    connection_args={"uri": URI},
    +    drop_old=True,
    +    partition_key_field="namespace",  # Use the "namespace" field as the partition key
    +)
    +
    +

    Чтобы выполнить поиск с использованием ключа раздела, в булевом выражении поискового запроса необходимо указать одно из следующих условий:

    +

    search_kwargs={"expr": '<partition_key> == "xxxx"'}

    +

    search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

    +

    Замените <partition_key> на имя поля, назначенного в качестве ключа раздела.

    +

    Milvus переходит к разделу, основанному на указанном ключе раздела, фильтрует сущности в соответствии с ключом раздела и осуществляет поиск среди отфильтрованных сущностей.

    +
    # This will only get documents for Ankush
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
    +
    +
    # This will only get documents for Harrison
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
    +
    +

    Справочник API

    Для получения подробной документации по всем функциям и конфигурациям __ModuleName__VectorStore перейдите по ссылке API: https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html.

    diff --git a/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.json b/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.json new file mode 100644 index 000000000..c5a070cb2 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import bs4\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\n\n# Create a WebBaseLoader instance to load documents from web sources\nloader = WebBaseLoader(\n web_paths=(\n \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n \"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/\",\n ),\n bs_kwargs=dict(\n parse_only=bs4.SoupStrainer(\n class_=(\"post-content\", \"post-title\", \"post-header\")\n )\n ),\n)\n# Load documents from web sources using the loader\ndocuments = loader.load()\n# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks\ntext_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)\n\n# Split the documents into chunks using the text_splitter\ndocs = text_splitter.split_documents(documents)\n\n# Let's take a look at the first document\ndocs[1]\n","from langchain_milvus import Milvus, Zilliz\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings()\n\nvectorstore = Milvus.from_documents( # or Zilliz.from_documents\n documents=docs,\n embedding=embeddings,\n connection_args={\n \"uri\": \"./milvus_demo.db\",\n },\n drop_old=True, # Drop the old Milvus collection if it exists\n)\n","query = \"What is self-reflection of an AI Agent?\"\nvectorstore.similarity_search(query, k=1)\n","from langchain_core.runnables import RunnablePassthrough\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_openai import ChatOpenAI\n\n# Initialize the OpenAI language model for response generation\nllm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n\n# Define the prompt template for generating AI responses\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n\n{context}\n\n\n\n{question}\n\n\nThe response should be specific and use statistics or numbers when possible.\n\nAssistant:\"\"\"\n\n# Create a PromptTemplate instance with the defined template and input variables\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n# Convert the vector store to a retriever\nretriever = vectorstore.as_retriever()\n\n\n# Define a function to format the retrieved documents\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","# Define the RAG (Retrieval-Augmented Generation) chain for AI response generation\nrag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n\n# rag_chain.get_graph().print_ascii()\n\n# Invoke the RAG chain with a specific question and retrieve the response\nres = rag_chain.invoke(query)\nres\n","vectorstore.similarity_search(\n \"What is CoT?\",\n k=1,\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n)\n\n# The same as:\n# vectorstore.as_retriever(search_kwargs=dict(\n# k=1,\n# expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n# )).invoke(\"What is CoT?\")\n","from langchain_core.runnables import ConfigurableField\n\n# Define a new retriever with a configurable field for search_kwargs\nretriever2 = vectorstore.as_retriever().configurable_fields(\n search_kwargs=ConfigurableField(\n id=\"retriever_search_kwargs\",\n )\n)\n\n# Invoke the retriever with a specific search_kwargs which filter the documents by source\nretriever2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n k=1,\n )\n }\n).invoke(query)\n","# Define a new RAG chain with this dynamically configurable retriever\nrag_chain2 = (\n {\"context\": retriever2 | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","# Invoke this RAG chain with a specific question and config\nrag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n )\n }\n).invoke(query)\n","rag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'\",\n )\n }\n).invoke(query)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LangChain","anchorList":[{"label":"Система Retrieval-Augmented Generation (RAG) с Milvus и LangChain","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LangChain","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Подготовьте данные","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Построение цепочки RAG с помощью векторного хранилища Milvus","href":"Build-RAG-chain-with-Milvus-Vector-Store","type":2,"isActive":false},{"label":"Фильтрация метаданных","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.md b/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.md new file mode 100644 index 000000000..68a3582a9 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/integrate_with_langchain.md @@ -0,0 +1,283 @@ +--- +id: integrate_with_langchain.md +summary: >- + В этом руководстве показано, как построить систему Retrieval-Augmented + Generation (RAG) с помощью LangChain и Milvus. +title: Система Retrieval-Augmented Generation (RAG) с Milvus и LangChain +--- +

    Система Retrieval-Augmented Generation (RAG) с Milvus и LangChain

    Open In Colab +GitHub Repository

    +

    В этом руководстве показано, как построить систему Retrieval-Augmented Generation (RAG) с помощью LangChain и Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает соответствующие документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    LangChain - это фреймворк для разработки приложений на основе больших языковых моделей (LLM). Milvus - самая передовая в мире база данных векторов с открытым исходным кодом, созданная для работы с приложениями поиска сходства встраивания и искусственного интеллекта.

    +

    Предварительные условия

    Перед запуском этого блокнота убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install --upgrade --quiet  langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения. (Нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Мы будем использовать модели из OpenAI. Вам следует подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Подготовьте данные

    Мы используем Langchain WebBaseLoader для загрузки документов из веб-источников и разбивки их на фрагменты с помощью RecursiveCharacterTextSplitter.

    +
    import bs4
    +from langchain_community.document_loaders import WebBaseLoader
    +from langchain_text_splitters import RecursiveCharacterTextSplitter
    +
    +# Create a WebBaseLoader instance to load documents from web sources
    +loader = WebBaseLoader(
    +    web_paths=(
    +        "https://lilianweng.github.io/posts/2023-06-23-agent/",
    +        "https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
    +    ),
    +    bs_kwargs=dict(
    +        parse_only=bs4.SoupStrainer(
    +            class_=("post-content", "post-title", "post-header")
    +        )
    +    ),
    +)
    +# Load documents from web sources using the loader
    +documents = loader.load()
    +# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks
    +text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
    +
    +# Split the documents into chunks using the text_splitter
    +docs = text_splitter.split_documents(documents)
    +
    +# Let's take a look at the first document
    +docs[1]
    +
    +
    Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/'})
    +
    +

    Как мы видим, документ уже разбит на фрагменты. А содержимое данных - это данные об агенте искусственного интеллекта.

    +

    Построение цепочки RAG с помощью векторного хранилища Milvus

    Мы инициализируем векторное хранилище Milvus с документами, затем загрузим документы в векторное хранилище Milvus и построим индекс под капотом.

    +
    from langchain_milvus import Milvus, Zilliz
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings()
    +
    +vectorstore = Milvus.from_documents(  # or Zilliz.from_documents
    +    documents=docs,
    +    embedding=embeddings,
    +    connection_args={
    +        "uri": "./milvus_demo.db",
    +    },
    +    drop_old=True,  # Drop the old Milvus collection if it exists
    +)
    +
    +
    +

    Для connection_args:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, замените Milvus.from_documents на Zilliz.from_documents, а также скорректируйте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Выполните поиск документов в векторном хранилище Milvus, используя тестовый вопрос-запрос. Рассмотрим первый верхний документ.

    +
    query = "What is self-reflection of an AI Agent?"
    +vectorstore.similarity_search(query, k=1)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    from langchain_core.runnables import RunnablePassthrough
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.output_parsers import StrOutputParser
    +from langchain_openai import ChatOpenAI
    +
    +# Initialize the OpenAI language model for response generation
    +llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
    +
    +# Define the prompt template for generating AI responses
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +If you don't know the answer, just say that you don't know, don't try to make up an answer.
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +The response should be specific and use statistics or numbers when possible.
    +
    +Assistant:"""
    +
    +# Create a PromptTemplate instance with the defined template and input variables
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +# Convert the vector store to a retriever
    +retriever = vectorstore.as_retriever()
    +
    +
    +# Define a function to format the retrieved documents
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    Используйте язык LCEL (LangChain Expression Language) для построения RAG-цепочки.

    +
    # Define the RAG (Retrieval-Augmented Generation) chain for AI response generation
    +rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +# rag_chain.get_graph().print_ascii()
    +
    +# Invoke the RAG chain with a specific question and retrieve the response
    +res = rag_chain.invoke(query)
    +res
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    Поздравляем! Вы построили базовую цепочку RAG на основе Milvus и LangChain.

    +

    Фильтрация метаданных

    Мы можем использовать правила скалярной фильтрации Milvus для фильтрации документов на основе метаданных. Мы загрузили документы из двух разных источников и можем отфильтровать их по метаданным source.

    +
    vectorstore.similarity_search(
    +    "What is CoT?",
    +    k=1,
    +    expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +)
    +
    +# The same as:
    +# vectorstore.as_retriever(search_kwargs=dict(
    +#     k=1,
    +#     expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +# )).invoke("What is CoT?")
    +
    +
    [Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555858})]
    +
    +

    Если мы хотим динамически менять параметры поиска, не перестраивая цепочку, мы можем настроить внутреннее устройство цепочки во время выполнения. Давайте определим новый ретривер с этой динамической конфигурацией и используем его для построения новой цепочки RAG.

    +
    from langchain_core.runnables import ConfigurableField
    +
    +# Define a new retriever with a configurable field for search_kwargs
    +retriever2 = vectorstore.as_retriever().configurable_fields(
    +    search_kwargs=ConfigurableField(
    +        id="retriever_search_kwargs",
    +    )
    +)
    +
    +# Invoke the retriever with a specific search_kwargs which filter the documents by source
    +retriever2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +            k=1,
    +        )
    +    }
    +).invoke(query)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    # Define a new RAG chain with this dynamically configurable retriever
    +rag_chain2 = (
    +    {"context": retriever2 | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    Попробуем эту динамически настраиваемую цепочку RAG с различными условиями фильтрации.

    +
    # Invoke this RAG chain with a specific question and config
    +rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    Когда мы изменим условие поиска, чтобы отфильтровать документы по второму источнику, поскольку содержимое этого источника блога не имеет ничего общего с вопросом запроса, мы получим ответ, не содержащий релевантной информации.

    +
    rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "I'm sorry, but based on the provided context, there is no specific information or statistical data available regarding the self-reflection of an AI agent."
    +
    +
    +

    В этом руководстве рассматривается базовое использование интеграции Milvus LangChain и простой подход RAG. Для более продвинутых техник RAG, пожалуйста, обратитесь к Advanced RAG bootcamp.

    diff --git a/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.json b/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.json new file mode 100644 index 000000000..608544046 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.json @@ -0,0 +1 @@ +{"codeList":["# os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass(\"Enter your LangSmith API key: \")\n# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n","%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever\nfrom langchain_milvus.utils.sparse import BM25SparseEmbedding\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom pymilvus import (\n Collection,\n CollectionSchema,\n DataType,\n FieldSchema,\n WeightedRanker,\n connections,\n)\n","CONNECTION_URI = \"http://localhost:19530\"\n","export OPENAI_API_KEY=\n","texts = [\n \"In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.\",\n \"In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.\",\n \"In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.\",\n \"In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.\",\n \"In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.\",\n \"In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.\",\n \"In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.\",\n \"In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.\",\n \"In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.\",\n \"In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.\",\n]\n","dense_embedding_func = OpenAIEmbeddings()\ndense_dim = len(dense_embedding_func.embed_query(texts[1]))\ndense_dim\n","sparse_embedding_func = BM25SparseEmbedding(corpus=texts)\nsparse_embedding_func.embed_query(texts[1])\n","connections.connect(uri=CONNECTION_URI)\n","pk_field = \"doc_id\"\ndense_field = \"dense_vector\"\nsparse_field = \"sparse_vector\"\ntext_field = \"text\"\nfields = [\n FieldSchema(\n name=pk_field,\n dtype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n ),\n FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),\n]\n","schema = CollectionSchema(fields=fields, enable_dynamic_field=False)\ncollection = Collection(\n name=\"IntroductionToTheNovels\", schema=schema, consistency_level=\"Strong\"\n)\n","dense_index = {\"index_type\": \"FLAT\", \"metric_type\": \"IP\"}\ncollection.create_index(\"dense_vector\", dense_index)\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncollection.create_index(\"sparse_vector\", sparse_index)\ncollection.flush()\n","entities = []\nfor text in texts:\n entity = {\n dense_field: dense_embedding_func.embed_documents([text])[0],\n sparse_field: sparse_embedding_func.embed_documents([text])[0],\n text_field: text,\n }\n entities.append(entity)\ncollection.insert(entities)\ncollection.load()\n","sparse_search_params = {\"metric_type\": \"IP\"}\ndense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\nretriever = MilvusCollectionHybridSearchRetriever(\n collection=collection,\n rerank=WeightedRanker(0.5, 0.5),\n anns_fields=[dense_field, sparse_field],\n field_embeddings=[dense_embedding_func, sparse_embedding_func],\n field_search_params=[dense_search_params, sparse_search_params],\n top_k=3,\n text_field=text_field,\n)\n","retriever.invoke(\"What are the story about ventures?\")\n","llm = ChatOpenAI()\n\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\n\n\n{context}\n\n\n\n{question}\n\n\nAssistant:\"\"\"\n\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n","def format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","rag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","rag_chain.invoke(\"What novels has Lila written and what are their contents?\")\n","collection.drop()\n"],"headingContent":"Milvus Hybrid Search Retriever","anchorList":[{"label":"Гибридный поисковый ретривер Milvus","href":"Milvus-Hybrid-Search-Retriever","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Настройка","href":"Setup","type":2,"isActive":false},{"label":"Инстанцирование","href":"Instantiation","type":2,"isActive":false},{"label":"Использование","href":"Usage","type":2,"isActive":false},{"label":"Использование в цепочке","href":"Use-within-a-chain","type":2,"isActive":false},{"label":"Справочник по API","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.md b/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.md new file mode 100644 index 000000000..705c3a92e --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/langchain/milvus_hybrid_search_retriever.md @@ -0,0 +1,310 @@ +--- +id: milvus_hybrid_search_retriever.md +summary: >- + В этом блокноте показано, как использовать функциональные возможности, + связанные с векторной базой данных Milvus. +title: Гибридный поисковый ретривер Milvus +--- +

    Гибридный поисковый ретривер Milvus

    Обзор

    +

    Milvus - это векторная база данных с открытым исходным кодом, созданная для использования в приложениях поиска по сходству и искусственного интеллекта. Milvus делает поиск по неструктурированным данным более доступным и обеспечивает постоянный пользовательский опыт независимо от среды развертывания.

    +
    +

    Это поможет вам начать работу с ретривером Milvus Hybrid Search, который сочетает в себе сильные стороны плотного и разреженного векторного поиска. Подробную документацию по всем функциям и конфигурациям MilvusCollectionHybridSearchRetriever можно найти в справочнике API.

    +

    Смотрите также документацию по многовекторному поиску Milvus.

    +

    Детали интеграции

    + + + + + + +
    РетриверСамостоятельный хостОблачное предложениеПакет
    MilvusCollectionHybridSearchRetrieverlangchain_milvus
    +

    Настройка

    Если вы хотите получить автоматическую трассировку отдельных запросов, вы также можете установить свой API-ключ LangSmith, откомментировав его ниже:

    +
    # os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
    +# os.environ["LANGSMITH_TRACING"] = "true"
    +
    +

    Установка

    Этот ретривер находится в пакете langchain-milvus. Это руководство требует следующих зависимостей:

    +
    %pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
    +
    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
    +from langchain_milvus.utils.sparse import BM25SparseEmbedding
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from pymilvus import (
    +    Collection,
    +    CollectionSchema,
    +    DataType,
    +    FieldSchema,
    +    WeightedRanker,
    +    connections,
    +)
    +
    +

    Запустите службу Milvus.

    Обратитесь к документации Milvus, чтобы запустить службу Milvus.

    +

    После запуска milvus вам необходимо указать URI подключения к milvus.

    +
    CONNECTION_URI = "http://localhost:19530"
    +
    +

    Подготовьте ключ API OpenAI

    Обратитесь к документации OpenAI, чтобы получить ключ OpenAI API и установить его в качестве переменной окружения.

    +
    export OPENAI_API_KEY=<your_api_key>
    +
    +

    Подготовьте функции плотного и разреженного встраивания

    Давайте выдумаем 10 фальшивых описаний романов. В реальном производстве это может быть большой объем текстовых данных.

    +
    texts = [
    +    "In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.",
    +    "In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.",
    +    "In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.",
    +    "In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.",
    +    "In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.",
    +    "In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.",
    +    "In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.",
    +    "In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.",
    +    "In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.",
    +    "In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.",
    +]
    +
    +

    Мы будем использовать OpenAI Embedding для генерации плотных векторов и алгоритм BM25 для генерации разреженных векторов.

    +

    Инициализируем функцию плотного встраивания и получаем размерность

    +
    dense_embedding_func = OpenAIEmbeddings()
    +dense_dim = len(dense_embedding_func.embed_query(texts[1]))
    +dense_dim
    +
    +
    1536
    +
    +

    Инициализируйте функцию разреженного встраивания.

    +

    Обратите внимание, что результатом разреженного встраивания является набор разреженных векторов, которые представляют собой индекс и вес ключевых слов входного текста.

    +
    sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
    +sparse_embedding_func.embed_query(texts[1])
    +
    +
    {0: 0.4270424944042204,
    + 21: 1.845826690498331,
    + 22: 1.845826690498331,
    + 23: 1.845826690498331,
    + 24: 1.845826690498331,
    + 25: 1.845826690498331,
    + 26: 1.845826690498331,
    + 27: 1.2237754316221157,
    + 28: 1.845826690498331,
    + 29: 1.845826690498331,
    + 30: 1.845826690498331,
    + 31: 1.845826690498331,
    + 32: 1.845826690498331,
    + 33: 1.845826690498331,
    + 34: 1.845826690498331,
    + 35: 1.845826690498331,
    + 36: 1.845826690498331,
    + 37: 1.845826690498331,
    + 38: 1.845826690498331,
    + 39: 1.845826690498331}
    +
    +

    Создание коллекции Milvus Collection и загрузка данных

    Инициализируйте URI подключения и установите соединение

    +
    connections.connect(uri=CONNECTION_URI)
    +
    +

    Определите имена полей и их типы данных

    +
    pk_field = "doc_id"
    +dense_field = "dense_vector"
    +sparse_field = "sparse_vector"
    +text_field = "text"
    +fields = [
    +    FieldSchema(
    +        name=pk_field,
    +        dtype=DataType.VARCHAR,
    +        is_primary=True,
    +        auto_id=True,
    +        max_length=100,
    +    ),
    +    FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +    FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),
    +]
    +
    +

    Создайте коллекцию с заданной схемой

    +
    schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +collection = Collection(
    +    name="IntroductionToTheNovels", schema=schema, consistency_level="Strong"
    +)
    +
    +

    Определите индекс для плотных и разреженных векторов

    +
    dense_index = {"index_type": "FLAT", "metric_type": "IP"}
    +collection.create_index("dense_vector", dense_index)
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +collection.create_index("sparse_vector", sparse_index)
    +collection.flush()
    +
    +

    Вставка сущностей в коллекцию и загрузка коллекции

    +
    entities = []
    +for text in texts:
    +    entity = {
    +        dense_field: dense_embedding_func.embed_documents([text])[0],
    +        sparse_field: sparse_embedding_func.embed_documents([text])[0],
    +        text_field: text,
    +    }
    +    entities.append(entity)
    +collection.insert(entities)
    +collection.load()
    +
    +

    Инстанцирование

    Теперь мы можем инстанцировать наш ретривер, определив параметры поиска для разреженных и плотных полей:

    +
    sparse_search_params = {"metric_type": "IP"}
    +dense_search_params = {"metric_type": "IP", "params": {}}
    +retriever = MilvusCollectionHybridSearchRetriever(
    +    collection=collection,
    +    rerank=WeightedRanker(0.5, 0.5),
    +    anns_fields=[dense_field, sparse_field],
    +    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    +    field_search_params=[dense_search_params, sparse_search_params],
    +    top_k=3,
    +    text_field=text_field,
    +)
    +
    +

    Во входных параметрах этого ретривера мы используем плотное вложение и разреженное вложение для выполнения гибридного поиска по двум полям этой коллекции и используем WeightedRanker для ранжирования. В итоге будет возвращено 3 лучших K-документа.

    +

    Использование

    retriever.invoke("What are the story about ventures?")
    +
    +
    [Document(page_content="In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.", metadata={'doc_id': '449281835035545843'}),
    + Document(page_content="In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.", metadata={'doc_id': '449281835035545845'}),
    + Document(page_content="In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.", metadata={'doc_id': '449281835035545846'})]
    +
    +

    Использование в цепочке

    Инициализируйте ChatOpenAI и определите шаблон подсказки

    +
    llm = ChatOpenAI()
    +
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +Assistant:"""
    +
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +
    +

    Определите функцию для форматирования документов

    +
    def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    Определите цепочку, используя ретривер и другие компоненты

    +
    rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    Выполните запрос, используя определенную цепочку

    +
    rag_chain.invoke("What novels has Lila written and what are their contents?")
    +
    +
    "Lila Rose has written 'The Memory Thief,' which follows a charismatic thief with the ability to steal and manipulate memories as they navigate a daring heist and a web of deceit and betrayal."
    +
    +

    Сбросьте коллекцию

    +
    collection.drop()
    +
    +

    Справочник по API

    Для получения подробной документации по всем функциям и конфигурациям MilvusCollectionHybridSearchRetriever перейдите к справке по API.

    diff --git a/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.json b/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.json new file mode 100644 index 000000000..f0a1b33be --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-agents pymilvus openai python-dotenv\n","$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai\n","# NOTE: This is ONLY necessary in jupyter notebook.\n# Details: Jupyter runs an event-loop behind the scenes.\n# This results in nested event-loops when we start an event-loop to make async queries.\n# This is normally not allowed, we use nest_asyncio to allow it for convenience.\nimport nest_asyncio\n\nnest_asyncio.apply()\n","\"\"\"\nload_dotenv reads key-value pairs from a .env file and can set them as environment variables.\nThis is useful to avoid leaking your API key for example :D\n\"\"\"\n\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n","$ mkdir -p 'data/10k/'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'\n","from llama_index.core import Settings\nfrom llama_index.embeddings.mistralai import MistralAIEmbedding\n\n# Define the default Embedding model used in this Notebook.\n# We are using Mistral Models, so we are also using Mistral Embeddings\n\nSettings.embed_model = MistralAIEmbedding(model_name=\"mistral-embed\")\n","from llama_index.llms.ollama import Ollama\n\nSettings.llm = Ollama(\"mistral-nemo\")\n","from llama_index.vector_stores.milvus import MilvusVectorStore\nfrom llama_index.core import (\n SimpleDirectoryReader,\n VectorStoreIndex,\n StorageContext,\n load_index_from_storage,\n)\nfrom llama_index.core.tools import QueryEngineTool, ToolMetadata\n\ninput_files = [\"./data/10k/lyft_2021.pdf\", \"./data/10k/uber_2021.pdf\"]\n\n# Create a single Milvus vector store\nvector_store = MilvusVectorStore(\n uri=\"./milvus_demo.db\", dim=1024, overwrite=False, collection_name=\"companies_docs\"\n)\n\n# Create a storage context with the Milvus vector store\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\n# Load data\ndocs = SimpleDirectoryReader(input_files=input_files).load_data()\n\n# Build index\nindex = VectorStoreIndex.from_documents(docs, storage_context=storage_context)\n\n# Define the query engine\ncompany_engine = index.as_query_engine(similarity_top_k=3)\n","# Define the different tools that can be used by our Agent.\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"lyft_10k\",\n description=(\n \"Provides information about Lyft financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"uber_10k\",\n description=(\n \"Provides information about Uber financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","from llama_index.llms.ollama import Ollama\nfrom llama_index.llms.mistralai import MistralAI\n\n# Set up the agent\nllm = Ollama(model=\"mistral-nemo\")\n\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"Could you please provide a comparison between Lyft and Uber's total revenues in 2021?\",\n allow_parallel_tool_calls=True,\n)\n\n# Example usage without metadata filtering\nprint(\"Response without metadata filtering:\")\nprint(response)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Example usage with metadata filtering\nfilters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"lyft_2021.pdf\")]\n)\n\nprint(f\"filters: {filters}\")\nfiltered_query_engine = index.as_query_engine(filters=filters)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Use this tool to retrieve specific data points about a company. \"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","# Set up the LLM we will use for Function Calling\n\nllm = Ollama(model=\"mistral-nemo\")\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"How many employees does Uber have?\",\n allow_parallel_tool_calls=True,\n)\nprint(response)\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"What are the risk factors for Lyft?\",\n allow_parallel_tool_calls=True,\n)\n\nprint(response)\n","> Question: What are the risk factors for Uber?\n\n> Response without metadata filtering:\nBased on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:\n\n- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.\n- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.\n- Risks related to attracting and retaining qualified drivers and riders.\n","from llama_index.core.prompts.base import PromptTemplate\n\n\n# Function to create a filtered query engine\ndef create_query_engine(question):\n # Extract metadata filters from question using a language model\n prompt_template = PromptTemplate(\n \"Given the following question, extract relevant metadata filters.\\n\"\n \"Consider company names, years, and any other relevant attributes.\\n\"\n \"Don't write any other text, just the MetadataFilters object\"\n \"Format it by creating a MetadataFilters like shown in the following\\n\"\n \"MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\\n\"\n \"If no specific filters are mentioned, returns an empty MetadataFilters()\\n\"\n \"Question: {question}\\n\"\n \"Metadata Filters:\\n\"\n )\n\n prompt = prompt_template.format(question=question)\n llm = Ollama(model=\"mistral-nemo\")\n response = llm.complete(prompt)\n\n metadata_filters_str = response.text.strip()\n if metadata_filters_str:\n metadata_filters = eval(metadata_filters_str)\n print(f\"eval: {metadata_filters}\")\n return index.as_query_engine(filters=metadata_filters)\n return index.as_query_engine()\n","response = create_query_engine(\n \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\n)\n","## Example usage with metadata filtering\nquestion = \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\nfiltered_query_engine = create_query_engine(question)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs_filtering\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n ),\n ),\n ),\n]\n# Set up the agent with the updated query engine tools\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=question,\n allow_parallel_tool_calls=True,\n)\n\nprint(\"Response with metadata filtering:\")\nprint(response)\n","from llama_agents import (\n AgentService,\n ToolService,\n LocalLauncher,\n MetaServiceTool,\n ControlPlaneServer,\n SimpleMessageQueue,\n AgentOrchestrator,\n)\n\nfrom llama_index.core.agent import FunctionCallingAgentWorker\nfrom llama_index.llms.mistralai import MistralAI\n\n# create our multi-agent framework components\nmessage_queue = SimpleMessageQueue()\ncontrol_plane = ControlPlaneServer(\n message_queue=message_queue,\n orchestrator=AgentOrchestrator(llm=MistralAI(\"mistral-large-latest\")),\n)\n\n# define Tool Service\ntool_service = ToolService(\n message_queue=message_queue,\n tools=query_engine_tools,\n running=True,\n step_interval=0.5,\n)\n\n# define meta-tools here\nmeta_tools = [\n await MetaServiceTool.from_tool_service(\n t.metadata.name,\n message_queue=message_queue,\n tool_service=tool_service,\n )\n for t in query_engine_tools\n]\n\n# define Agent and agent service\nworker1 = FunctionCallingAgentWorker.from_tools(\n meta_tools, llm=MistralAI(\"mistral-large-latest\")\n)\n\nagent1 = worker1.as_agent()\nagent_server_1 = AgentService(\n agent=agent1,\n message_queue=message_queue,\n description=\"Used to answer questions over differnet companies for their Financial results\",\n service_name=\"Companies_analyst_agent\",\n)\n","import logging\n\n# change logging level to enable or disable more verbose logging\nlogging.getLogger(\"llama_agents\").setLevel(logging.INFO)\n","## Define Launcher\nlauncher = LocalLauncher(\n [agent_server_1, tool_service],\n control_plane,\n message_queue,\n)\n","query_str = \"What are the risk factors for Uber?\"\nresult = launcher.launch_single(query_str)\n","print(result)\n"],"headingContent":"Multi-agent Systems with Mistral AI, Milvus and Llama-agents","anchorList":[{"label":"Мультиагентные системы с ИИ Мистраль, Milvus и Llama-агентами","href":"Multi-agent-Systems-with-Mistral-AI-Milvus-and-Llama-agents","type":1,"isActive":false},{"label":"Цель этого блокнота","href":"Goal-of-this-Notebook","type":2,"isActive":false},{"label":"Milvus","href":"Milvus","type":2,"isActive":false},{"label":"llama-agents","href":"llama-agents","type":2,"isActive":false},{"label":"llama-index","href":"llama-index","type":2,"isActive":false},{"label":"Mistral AI","href":"Mistral-AI","type":2,"isActive":false},{"label":"Установка зависимостей","href":"Install-Dependencies","type":2,"isActive":false},{"label":"Получите ключ API для Mistral","href":"Get-your-API-Key-for-Mistral","type":2,"isActive":false},{"label":"Загрузить данные","href":"Download-data","type":2,"isActive":false},{"label":"Подготовьте модель встраивания","href":"Prepare-Embedding-Model","type":1,"isActive":false},{"label":"Определение модели LLM","href":"Define-the-LLM-Model","type":2,"isActive":false},{"label":"Инстанцирование Milvus и загрузка данных","href":"Instanciate-Milvus-and-Load-Data","type":2,"isActive":false},{"label":"Определите инструменты","href":"Define-Tools","type":2,"isActive":false},{"label":"Фильтрация метаданных","href":"Metadata-Filtering","type":2,"isActive":false},{"label":"Примеры использования фильтрации метаданных","href":"Use-Cases-for-Metadata-Filtering","type":2,"isActive":false},{"label":"Пример использования","href":"Example-usage","type":2,"isActive":false},{"label":"Вызов функций","href":"Function-Calling","type":2,"isActive":false},{"label":"Взаимодействие с агентом","href":"Interact-with-the-Agent","type":2,"isActive":false},{"label":"Пример путаницы без фильтрации метаданных","href":"Example-of-Confusion-Without-Metadata-Filtering","type":2,"isActive":false},{"label":"Использование агента для извлечения фильтров метаданных","href":"Using-an-Agent-to-Extract-Metadata-Filters","type":2,"isActive":false},{"label":"Пример кода","href":"Code-Example","type":2,"isActive":false},{"label":"Оркестрирование различных сервисов с помощью Mistral Large","href":"Orchestrating-the-different-services-with-Mistral-Large","type":2,"isActive":false},{"label":"Заключение","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.md b/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.md new file mode 100644 index 000000000..d0c37ec93 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/llama_agents_metadata.md @@ -0,0 +1,784 @@ +--- +id: llama_agents_metadata.md +summary: >- + В этом блокноте мы рассмотрим различные идеи: Хранить данные в Milvus, + использовать llama-index с моделями Mistral для запросов к данным, создавать + агентов для автоматического поиска и чтения данных, а также разрабатывать + агентов для фильтрации метаданных на основе запросов пользователей. +title: 'Мультиагентные системы с ИИ Мистраль, Milvus и Llama-агентами' +--- +

    Мультиагентные системы с ИИ Мистраль, Milvus и Llama-агентами

    Цель этого блокнота

    В этом блокноте мы рассмотрим различные идеи:

    +
      +
    • 1️⃣ Хранить данные в Milvus: научимся хранить данные в Milvus, эффективной векторной базе данных, предназначенной для высокоскоростного поиска по сходству и приложений ИИ.

    • +
    • 2️⃣ Использование llama-index с моделями Mistral для запросов данных: Узнайте, как использовать llama-index в сочетании с моделями Mistral для запросов данных, хранящихся в Milvus.

    • +
    • 3️⃣ Создание автоматизированных агентов для поиска и чтения данных: Создайте агентов, которые могут автоматически искать и читать данные на основе запросов пользователей. Эти автоматизированные агенты повысят удобство работы пользователей, предоставляя быстрые и точные ответы, сокращая усилия по поиску вручную.

    • +
    • 4️⃣ Разработка агентов для фильтрации метаданных на основе пользовательских запросов: внедрите агенты, которые могут автоматически генерировать фильтры метаданных на основе пользовательских запросов, уточняя и контекстуализируя результаты поиска, избегая путаницы и повышая точность получаемой информации, даже для сложных запросов.

    • +
    • К концу этого блокнота вы получите полное представление об использовании Milvus, llama-index с llama-агентами и моделей Mistral для создания надежной и эффективной системы поиска данных.

    • +
    +

    Milvus

    Milvus - это векторная база данных с открытым исходным кодом, которая обеспечивает работу приложений искусственного интеллекта с помощью векторных вкраплений и поиска сходства.

    +

    В этом блокноте мы используем Milvus Lite, это облегченная версия Milvus.

    +

    С Milvus Lite вы можете начать создавать ИИ-приложения с векторным поиском сходства в течение нескольких минут! Milvus Lite подходит для работы в следующих средах:

    +
      +
    • Jupyter Notebook / Google Colab
    • +
    • Ноутбуки
    • +
    • Устройства Edge
    • +
    +

    + + image.png + image.png

    +

    llama-agents

    llama-agents позволяет запускать агентов как микросервисы. Это позволяет масштабировать сервисы вверх и вниз.

    +

    llama-index

    LlamaIndex - это фреймворк данных для вашего LLM-приложения. Он предоставляет такие инструменты, как:

    +
      +
    • Коннекторы данных получают существующие данные из их родного источника и формата.
    • +
    • Индексы данных структурируют ваши данные в промежуточных представлениях, которые легко и эффективно используются LLM.
    • +
    • Движки обеспечивают доступ к данным на естественном языке.
    • +
    • Агенты - это работники знаний на базе LLM, дополненные инструментами, от простых вспомогательных функций до API-интеграций и т. д.
    • +
    +

    + + image.png + image.png

    +

    Mistral AI

    Mistral AI - исследовательская лаборатория, создающая LLM и модели вкраплений. Недавно они выпустили новые версии своих моделей, Mistral Nemo и Mistral Large, которые показали себя особенно хорошо в RAG и вызове функций. Поэтому мы будем использовать их в этом блокноте.

    +

    Установка зависимостей

    $ pip install llama-agents pymilvus openai python-dotenv
    +
    +
    $ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai
    +
    +
    # NOTE: This is ONLY necessary in jupyter notebook.
    +# Details: Jupyter runs an event-loop behind the scenes.
    +#          This results in nested event-loops when we start an event-loop to make async queries.
    +#          This is normally not allowed, we use nest_asyncio to allow it for convenience.
    +import nest_asyncio
    +
    +nest_asyncio.apply()
    +
    +

    Получите ключ API для Mistral

    Вы можете получить ключ API Mistral в консоли Mistral Cloud Console.

    +
    """
    +load_dotenv reads key-value pairs from a .env file and can set them as environment variables.
    +This is useful to avoid leaking your API key for example :D
    +"""
    +
    +from dotenv import load_dotenv
    +import os
    +
    +load_dotenv()
    +
    +
    True
    +
    +

    Загрузить данные

    $ mkdir -p 'data/10k/'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
    +
    +

    Подготовьте модель встраивания

    Мы определяем модель встраивания, которая будет использоваться в этом блокноте. Мы используем mistral-embed, это модель встраивания, разработанная Mistral, она была обучена с учетом извлечений, что делает ее очень подходящей для нашей агентной системы RAG. За подробностями обращайтесь к странице Embedding в документации Mistral.

    +
    from llama_index.core import Settings
    +from llama_index.embeddings.mistralai import MistralAIEmbedding
    +
    +# Define the default Embedding model used in this Notebook.
    +# We are using Mistral Models, so we are also using Mistral Embeddings
    +
    +Settings.embed_model = MistralAIEmbedding(model_name="mistral-embed")
    +
    +

    Определение модели LLM

    Llama Index использует LLM для ответа на запросы и подсказки и отвечает за написание ответов на естественном языке. Мы определили Mistral Nemo в качестве модели по умолчанию. Nemo предлагает большое контекстное окно до 128 тыс. лексем. Его рассуждения, знания о мире и точность кодирования являются передовыми в своей размерной категории.

    +
    from llama_index.llms.ollama import Ollama
    +
    +Settings.llm = Ollama("mistral-nemo")
    +
    +

    Инстанцирование Milvus и загрузка данных

    Milvus - это популярная векторная база данных с открытым исходным кодом, которая обеспечивает приложениям ИИ высокопроизводительный и масштабируемый поиск векторного сходства.

    +
      +
    • Задание uri локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае в качестве uri используйте ури сервера, например,http://localhost:19530.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +
    from llama_index.vector_stores.milvus import MilvusVectorStore
    +from llama_index.core import (
    +    SimpleDirectoryReader,
    +    VectorStoreIndex,
    +    StorageContext,
    +    load_index_from_storage,
    +)
    +from llama_index.core.tools import QueryEngineTool, ToolMetadata
    +
    +input_files = ["./data/10k/lyft_2021.pdf", "./data/10k/uber_2021.pdf"]
    +
    +# Create a single Milvus vector store
    +vector_store = MilvusVectorStore(
    +    uri="./milvus_demo.db", dim=1024, overwrite=False, collection_name="companies_docs"
    +)
    +
    +# Create a storage context with the Milvus vector store
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +# Load data
    +docs = SimpleDirectoryReader(input_files=input_files).load_data()
    +
    +# Build index
    +index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
    +
    +# Define the query engine
    +company_engine = index.as_query_engine(similarity_top_k=3)
    +
    +

    Определите инструменты

    Одним из ключевых шагов в создании эффективного агента является определение инструментов, которые он может использовать для выполнения своих задач. По сути, эти инструменты представляют собой функции или службы, к которым агент может обращаться для получения информации или выполнения действий.

    +

    Ниже мы определим два инструмента, которые наш агент может использовать для запроса финансовой информации о Lyft и Uber за 2021 год. Эти инструменты будут интегрированы в нашего агента, что позволит ему отвечать на запросы на естественном языке, предоставляя точную и релевантную информацию.

    +

    Если вы посмотрите на график, который мы видим вверху, то это и есть "агентская служба".

    +
    # Define the different tools that can be used by our Agent.
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="lyft_10k",
    +            description=(
    +                "Provides information about Lyft financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="uber_10k",
    +            description=(
    +                "Provides information about Uber financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    from llama_index.llms.ollama import Ollama
    +from llama_index.llms.mistralai import MistralAI
    +
    +# Set up the agent
    +llm = Ollama(model="mistral-nemo")
    +
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="Could you please provide a comparison between Lyft and Uber's total revenues in 2021?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +# Example usage without metadata filtering
    +print("Response without metadata filtering:")
    +print(response)
    +
    +
    Response without metadata filtering:
    +The revenue for Lyft in 2021 was $3.84 billion.
    +
    +Uber's total revenue for the year ended December 31, 2021 was $17,455 million.
    +
    +

    Фильтрация метаданных

    Milvus поддерживает фильтрацию метаданных- технику, которая позволяет уточнять и сужать результаты поиска на основе определенных атрибутов или тегов, связанных с вашими данными. Это особенно полезно в сценариях, когда у вас много данных и нужно получить только те, которые соответствуют определенным критериям.

    +

    Примеры использования фильтрации метаданных

      +
    • Точность результатов поиска: Применяя фильтры метаданных, вы можете обеспечить высокую релевантность результатов поиска запросу пользователя. Например, если у вас есть коллекция финансовых документов, вы можете отфильтровать их на основе названия компании, года или любых других релевантных метаданных.

    • +
    • Эффективность: Фильтрация метаданных помогает сократить объем данных, которые необходимо обработать, что делает поисковые операции более эффективными. Это особенно полезно при работе с большими массивами данных.

    • +
    • Персонализация: У разных пользователей или приложений могут быть разные требования. Фильтрация метаданных позволяет настраивать результаты поиска в соответствии с конкретными потребностями, например, получать документы за определенный год или компанию.

    • +
    +

    Пример использования

    В приведенном ниже блоке кода фильтрация метаданных используется для создания механизма фильтрованных запросов, который извлекает документы на основе определенной пары ключ-значение метаданных: file_name: lyft_2021.pdf

    +

    Определенный ниже QueryEngineTool является более общим, чем тот, который был определен выше, в том случае у нас был инструмент для каждой компании (Uber и Lyft), в этом случае он более общий. Мы знаем, что у нас есть только финансовые документы о компаниях, но это все. Добавив фильтрацию метаданных, мы можем отфильтровать только получение данных из определенного документа.

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Example usage with metadata filtering
    +filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="lyft_2021.pdf")]
    +)
    +
    +print(f"filters: {filters}")
    +filtered_query_engine = index.as_query_engine(filters=filters)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Use this tool to retrieve specific data points about a company. "
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    filters: filters=[MetadataFilter(key='file_name', value='lyft_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +

    Вызов функций

    Mistral Nemo и Large поддерживают вызов собственных функций. Интеграция с инструментами LlamaIndex осуществляется через функцию predict_and_call на llm. Это позволяет пользователю подключать любые инструменты и позволять LLM решать, какие инструменты вызывать (если таковые имеются).

    +

    Подробнее об агентах вы можете узнать на сайте llama-index.

    +
    # Set up the LLM we will use for Function Calling
    +
    +llm = Ollama(model="mistral-nemo")
    +
    +

    Взаимодействие с агентом

    Теперь мы можем увидеть фильтрацию метаданных в действии:

    +
      +
    1. В первом случае агент не должен найти ничего по запросу пользователя, поскольку речь идет об Uber, а мы фильтруем документы только о Lyft.
    2. +
    3. Во втором случае агент должен найти информацию о Lyft, так как мы будем искать только документы о Lyft.
    4. +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="How many employees does Uber have?",
    +    allow_parallel_tool_calls=True,
    +)
    +print(response)
    +
    +
    I'm unable to provide information about Uber's employee count as it's outside the given Lyft context.
    +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="What are the risk factors for Lyft?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print(response)
    +
    +
    Investing in Lyft carries significant risks. These include general economic factors like impacts from pandemics or crises, operational factors such as competition, pricing changes, and driver/ride growth unpredictability, insurance coverage issues, autonomous vehicle technology uncertainties, reputational concerns, potential security breaches, reliance on third-party services, and challenges in expanding platform offerings. Lyft's business operations are subject to numerous other risks not explicitly mentioned here, which could also harm its financial condition and prospects.
    +
    +

    Пример путаницы без фильтрации метаданных

    > Question: What are the risk factors for Uber?
    +
    +> Response without metadata filtering:
    +Based on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:
    +
    +- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.
    +- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.
    +- Risks related to attracting and retaining qualified drivers and riders.
    +
    +

    В этом примере система неверно предоставляет информацию о Lyft вместо Uber, что приводит к ошибочному ответу. Вначале система говорит, что у нее нет такой информации, а затем просто продолжает и продолжает.

    +

    Использование агента для извлечения фильтров метаданных

    Чтобы решить эту проблему, мы можем использовать агента для автоматического извлечения фильтров метаданных из вопроса пользователя и применения их в процессе ответа на вопрос. Это гарантирует, что система получит правильную и релевантную информацию.

    +

    Пример кода

    Ниже приведен пример кода, демонстрирующий, как создать механизм фильтрованных запросов с использованием агента для извлечения фильтров метаданных из вопроса пользователя:

    +

    Объяснение

      +
    • Шаблон запроса: Класс PromptTemplate используется для определения шаблона для извлечения фильтров метаданных из вопроса пользователя. Шаблон предписывает языковой модели учитывать названия компаний, годы и другие соответствующие атрибуты.

    • +
    • LLM: Mistral Nemo используется для генерации фильтров метаданных на основе вопроса пользователя. Модель получает вопрос и шаблон для извлечения соответствующих фильтров.

    • +
    • Фильтры метаданных: Ответ от LLM анализируется для создания объекта MetadataFilters. Если конкретные фильтры не указаны, возвращается пустой объект MetadataFilters.

    • +
    • Фильтрованный механизм запросов: метод index.as_query_engine(filters=metadata_filters) создает механизм запросов, который применяет извлеченные фильтры метаданных к индексу. Это гарантирует, что будут получены только документы, соответствующие критериям фильтра.

    • +
    +
    from llama_index.core.prompts.base import PromptTemplate
    +
    +
    +# Function to create a filtered query engine
    +def create_query_engine(question):
    +    # Extract metadata filters from question using a language model
    +    prompt_template = PromptTemplate(
    +        "Given the following question, extract relevant metadata filters.\n"
    +        "Consider company names, years, and any other relevant attributes.\n"
    +        "Don't write any other text, just the MetadataFilters object"
    +        "Format it by creating a MetadataFilters like shown in the following\n"
    +        "MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\n"
    +        "If no specific filters are mentioned, returns an empty MetadataFilters()\n"
    +        "Question: {question}\n"
    +        "Metadata Filters:\n"
    +    )
    +
    +    prompt = prompt_template.format(question=question)
    +    llm = Ollama(model="mistral-nemo")
    +    response = llm.complete(prompt)
    +
    +    metadata_filters_str = response.text.strip()
    +    if metadata_filters_str:
    +        metadata_filters = eval(metadata_filters_str)
    +        print(f"eval: {metadata_filters}")
    +        return index.as_query_engine(filters=metadata_filters)
    +    return index.as_query_engine()
    +
    +
    response = create_query_engine(
    +    "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +
    ## Example usage with metadata filtering
    +question = "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +filtered_query_engine = create_query_engine(question)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs_filtering",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +            ),
    +        ),
    +    ),
    +]
    +# Set up the agent with the updated query engine tools
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg=question,
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print("Response with metadata filtering:")
    +print(response)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +Response with metadata filtering:
    +Uber's total revenue for the year ended December 31, 2021, is $17.455 billion.
    +
    +

    Оркестрирование различных сервисов с помощью Mistral Large

    Mistral Large - это флагманская модель Mistral с очень хорошими возможностями рассуждений, знаний и кодирования. Она идеально подходит для сложных задач, требующих больших возможностей рассуждений или узкой специализации. Она обладает расширенными возможностями вызова функций, а это именно то, что нам нужно для оркестровки наших различных агентов.

    +

    Почему нам нужна более интеллектуальная Модель?

    Вопрос, на который мы будем отвечать ниже, особенно сложен, поскольку требует оркестровки множества служб и агентов для получения согласованного и точного ответа. Это предполагает координацию различных инструментов и агентов для получения и обработки информации из разных источников, например финансовых данных из разных компаний.

    +

    Что же в этом сложного?

      +
    • Сложность: В вопросе задействовано множество агентов и служб, каждая из которых обладает собственной функциональностью и источниками данных. Согласование этих агентов для бесперебойной работы - сложная задача.
    • +
    +
      +
    • Интеграция данных: Вопрос требует интеграции данных из разных источников, что может быть непросто из-за различий в форматах, структурах и метаданных данных.

    • +
    • Понимание контекста: Вопрос может потребовать понимания контекста и взаимосвязей между различными частями информации, что является когнитивно сложной задачей.

    • +
    +

    Почему Mistral Large может помочь в этом случае?

    Mistral Large хорошо подходит для решения этой задачи благодаря своим расширенным возможностям рассуждений и вызова функций. Вот как он помогает:

    +
      +
    • Расширенные рассуждения: Mistral Large может решать сложные задачи рассуждения, что делает его идеальным для оркестровки нескольких агентов и служб. Он может понимать взаимосвязи между различными частями информации и принимать обоснованные решения.

    • +
    • Возможности вызова функций: Mistral Large обладает расширенными возможностями вызова функций, которые необходимы для координации действий различных агентов. Это позволяет обеспечить беспрепятственную интеграцию и оркестровку различных сервисов.

    • +
    • Специализированные знания: Mistral Large предназначен для решения узкоспециализированных задач, поэтому он хорошо подходит для обработки сложных запросов, требующих глубоких знаний о домене.

    • +
    +

    По всем этим причинам я решил, что в данном случае лучше использовать Mistral Large вместо Mistral Nemo.

    +
    from llama_agents import (
    +    AgentService,
    +    ToolService,
    +    LocalLauncher,
    +    MetaServiceTool,
    +    ControlPlaneServer,
    +    SimpleMessageQueue,
    +    AgentOrchestrator,
    +)
    +
    +from llama_index.core.agent import FunctionCallingAgentWorker
    +from llama_index.llms.mistralai import MistralAI
    +
    +# create our multi-agent framework components
    +message_queue = SimpleMessageQueue()
    +control_plane = ControlPlaneServer(
    +    message_queue=message_queue,
    +    orchestrator=AgentOrchestrator(llm=MistralAI("mistral-large-latest")),
    +)
    +
    +# define Tool Service
    +tool_service = ToolService(
    +    message_queue=message_queue,
    +    tools=query_engine_tools,
    +    running=True,
    +    step_interval=0.5,
    +)
    +
    +# define meta-tools here
    +meta_tools = [
    +    await MetaServiceTool.from_tool_service(
    +        t.metadata.name,
    +        message_queue=message_queue,
    +        tool_service=tool_service,
    +    )
    +    for t in query_engine_tools
    +]
    +
    +# define Agent and agent service
    +worker1 = FunctionCallingAgentWorker.from_tools(
    +    meta_tools, llm=MistralAI("mistral-large-latest")
    +)
    +
    +agent1 = worker1.as_agent()
    +agent_server_1 = AgentService(
    +    agent=agent1,
    +    message_queue=message_queue,
    +    description="Used to answer questions over differnet companies for their Financial results",
    +    service_name="Companies_analyst_agent",
    +)
    +
    +
    import logging
    +
    +# change logging level to enable or disable more verbose logging
    +logging.getLogger("llama_agents").setLevel(logging.INFO)
    +
    +
    ## Define Launcher
    +launcher = LocalLauncher(
    +    [agent_server_1, tool_service],
    +    control_plane,
    +    message_queue,
    +)
    +
    +
    query_str = "What are the risk factors for Uber?"
    +result = launcher.launch_single(query_str)
    +
    +
    INFO:llama_agents.message_queues.simple - Consumer AgentService-27cde4ed-5163-4005-90fc-13c158eda7e3: Companies_analyst_agent has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ToolService-b73c500a-5fbe-4f57-95c7-db74e173bd1b: default_tool_service has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer 62465ab8-32ff-436e-95fa-74e828745150: human has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ControlPlaneServer-f4c27d43-5474-43ca-93ca-a9aeed4534d7: control_plane has been registered.
    +INFO:llama_agents.services.agent - Companies_analyst_agent launch_local
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Launching message queue locally
    +INFO:llama_agents.services.agent - Processing initiated.
    +INFO:llama_agents.services.tool - Processing initiated.
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.simple - Consumer MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41: MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41 has been registered.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f4c270a4-bc47-4bbf-92fe-e2cc80757943 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f888f9a8-e716-4505-bfe2-577452e9b6e6 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'human' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'human' to consumer.
    +
    +
    print(result)
    +
    +
    [{"name": "finalize", "arguments": {"input": "Uber faces several risk factors, including general economic impacts such as pandemics or downturns, operational challenges like competition, market growth uncertainty, attracting and retaining drivers and riders, insurance adequacy, autonomous vehicle technology development, maintaining its reputation and brand, and managing growth. Additionally, reliance on third-party providers for various services can introduce further risks to its operations."}}]
    +
    +

    Заключение

    В этом блокноте вы увидели, как можно использовать llama-агенты для выполнения различных действий, вызывая соответствующие инструменты. Используя Mistral Large в сочетании с Mistral Nemo, мы продемонстрировали, как можно эффективно организовывать интеллектуальные, ресурсосберегающие системы, используя сильные стороны различных LLM. Мы увидели, что агент может выбрать коллекцию, содержащую данные, запрошенные пользователем.

    diff --git a/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.json b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.json new file mode 100644 index 000000000..86f1f1d71 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.json @@ -0,0 +1 @@ +{"codeList":["$ pip install dynamiq pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Importing necessary libraries for the workflow\nfrom io import BytesIO\nfrom dynamiq import Workflow\nfrom dynamiq.nodes import InputTransformer\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.converters import PyPDFConverter\nfrom dynamiq.nodes.splitters.document import DocumentSplitter\nfrom dynamiq.nodes.embedders import OpenAIDocumentEmbedder\nfrom dynamiq.nodes.writers import MilvusDocumentWriter\n\n# Initialize the workflow\nrag_wf = Workflow()\n","converter = PyPDFConverter(document_creation_mode=\"one-doc-per-page\")\nconverter_added = rag_wf.flow.add_nodes(\n converter\n) # Add node to the DAG (Directed Acyclic Graph)\n","document_splitter = DocumentSplitter(\n split_by=\"sentence\", # Splits documents into sentences\n split_length=10,\n split_overlap=1,\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[converter.id]}.output.documents\",\n },\n ),\n).depends_on(\n converter\n) # Set dependency on the PDF converter\nsplitter_added = rag_wf.flow.add_nodes(document_splitter) # Add to the DAG\n","embedder = OpenAIDocumentEmbedder(\n connection=OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"]),\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[document_splitter.id]}.output.documents\",\n },\n ),\n).depends_on(\n document_splitter\n) # Set dependency on the splitter\ndocument_embedder_added = rag_wf.flow.add_nodes(embedder) # Add to the DAG\n","vector_store = (\n MilvusDocumentWriter(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n create_if_not_exist=True,\n metric_type=\"COSINE\",\n )\n .inputs(documents=embedder.outputs.documents) # Connect to embedder output\n .depends_on(embedder) # Set dependency on the embedder\n)\nmilvus_writer_added = rag_wf.flow.add_nodes(vector_store) # Add to the DAG\n","file_paths = [\"./pdf_files/WhatisMilvus.pdf\"]\ninput_data = {\n \"files\": [BytesIO(open(path, \"rb\").read()) for path in file_paths],\n \"metadata\": [{\"filename\": path} for path in file_paths],\n}\n\n# Run the workflow with the prepared input data\ninserted_data = rag_wf.run(input_data=input_data)\n","from dynamiq import Workflow\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.embedders import OpenAITextEmbedder\nfrom dynamiq.nodes.retrievers import MilvusDocumentRetriever\nfrom dynamiq.nodes.llms import OpenAI\nfrom dynamiq.prompts import Message, Prompt\n\n# Initialize the workflow\nretrieval_wf = Workflow()\n","# Establish OpenAI connection\nopenai_connection = OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"])\n\n# Define the text embedder node\nembedder = OpenAITextEmbedder(\n connection=openai_connection,\n model=\"text-embedding-3-small\",\n)\n\n# Add the embedder node to the workflow\nembedder_added = retrieval_wf.flow.add_nodes(embedder)\n","document_retriever = (\n MilvusDocumentRetriever(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n top_k=5,\n )\n .inputs(embedding=embedder.outputs.embedding) # Connect to embedder output\n .depends_on(embedder) # Dependency on the embedder node\n)\n\n# Add the retriever node to the workflow\nmilvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)\n","# Define the prompt template for the LLM\nprompt_template = \"\"\"\nPlease answer the question based on the provided context.\n\nQuestion: {{ query }}\n\nContext:\n{% for document in documents %}\n- {{ document.content }}\n{% endfor %}\n\"\"\"\n\n# Create the prompt object\nprompt = Prompt(messages=[Message(content=prompt_template, role=\"user\")])\n","answer_generator = (\n OpenAI(\n connection=openai_connection,\n model=\"gpt-4o\",\n prompt=prompt,\n )\n .inputs(\n documents=document_retriever.outputs.documents,\n query=embedder.outputs.query,\n )\n .depends_on(\n [document_retriever, embedder]\n ) # Dependencies on retriever and embedder\n)\n\n# Add the answer generator node to the workflow\nanswer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)\n","# Run the workflow with a sample query\nsample_query = \"What is the Advanced Search Algorithms in Milvus?\"\n\nresult = retrieval_wf.run(input_data={\"query\": sample_query})\n\nanswer = result.output.get(answer_generator.id).get(\"output\", {}).get(\"content\")\nprint(answer)\n"],"headingContent":"Getting Started with Dynamiq and Milvus","anchorList":[{"label":"Начало работы с Dynamiq и Milvus","href":"Getting-Started-with-Dynamiq-and-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"RAG - поток индексирования документов","href":"RAG---Document-Indexing-Flow","type":2,"isActive":false},{"label":"Поток извлечения документов RAG","href":"RAG-Document-Retrieval-Flow","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.md b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.md new file mode 100644 index 000000000..c1a677dc5 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_dynamiq.md @@ -0,0 +1,340 @@ +--- +id: milvus_rag_with_dynamiq.md +summary: >- + В этом учебном пособии мы рассмотрим, как без проблем использовать Dynamiq с + Milvus, высокопроизводительной векторной базой данных, специально созданной + для рабочих процессов RAG. Milvus отличается эффективным хранением, + индексацией и поиском векторных вкраплений, что делает ее незаменимым + компонентом для систем искусственного интеллекта, требующих быстрого и точного + контекстного доступа к данным. +title: Начало работы с Dynamiq и Milvus +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Начало работы с Dynamiq и Milvus

    Dynamiq - это мощный фреймворк Gen AI, который упрощает разработку приложений на базе ИИ. Благодаря надежной поддержке генерации с расширенным поиском (RAG) и агентов с большой языковой моделью (LLM) Dynamiq позволяет разработчикам легко и эффективно создавать интеллектуальные динамические системы.

    +

    В этом руководстве мы рассмотрим, как использовать Dynamiq с Milvus, высокопроизводительной векторной базой данных, специально созданной для рабочих процессов RAG. Milvus отличается эффективным хранением, индексацией и поиском векторных вкраплений, что делает ее незаменимым компонентом для систем ИИ, требующих быстрого и точного контекстного доступа к данным.

    +

    В этом пошаговом руководстве мы рассмотрим два основных рабочих процесса RAG:

    +
      +
    • Поток индексирования документов: узнайте, как обрабатывать входные файлы (например, PDF), преобразовывать их содержимое в векторные вкрапления и сохранять их в Milvus. Использование высокопроизводительных возможностей индексирования Milvus гарантирует, что ваши данные будут готовы к быстрому поиску.

    • +
    • Поток поиска документов: Узнайте, как запрашивать у Milvus соответствующие вкрапления документов и использовать их для генерации проницательных, учитывающих контекст ответов с помощью LLM-агентов Dynamiq, создавая бесшовный пользовательский опыт, основанный на искусственном интеллекте.

    • +
    +

    К концу этого урока вы получите полное представление о том, как Milvus и Dynamiq работают вместе для создания масштабируемых, контекстно-зависимых систем ИИ, отвечающих вашим потребностям.

    +

    Подготовка

    Загрузите необходимые библиотеки

    $ pip install dynamiq pymilvus
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Настройка агента LLM

    В этом примере мы будем использовать OpenAI в качестве LLM. Вам следует подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    RAG - поток индексирования документов

    В этом руководстве демонстрируется рабочий процесс Retrieval-Augmented Generation (RAG) для индексирования документов с использованием Milvus в качестве векторной базы данных. Рабочий процесс принимает входные PDF-файлы, обрабатывает их на более мелкие фрагменты, генерирует векторные вкрапления, используя модель вкраплений OpenAI, и сохраняет вкрапления в коллекции Milvus для эффективного поиска.

    +

    К концу этого рабочего процесса вы получите масштабируемую и эффективную систему индексирования документов, которая будет поддерживать такие будущие задачи RAG, как семантический поиск и ответы на вопросы.

    +

    Импорт необходимых библиотек и инициализация рабочего процесса

    # Importing necessary libraries for the workflow
    +from io import BytesIO
    +from dynamiq import Workflow
    +from dynamiq.nodes import InputTransformer
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.converters import PyPDFConverter
    +from dynamiq.nodes.splitters.document import DocumentSplitter
    +from dynamiq.nodes.embedders import OpenAIDocumentEmbedder
    +from dynamiq.nodes.writers import MilvusDocumentWriter
    +
    +# Initialize the workflow
    +rag_wf = Workflow()
    +
    +

    Определите узел PDF-конвертера

    converter = PyPDFConverter(document_creation_mode="one-doc-per-page")
    +converter_added = rag_wf.flow.add_nodes(
    +    converter
    +)  # Add node to the DAG (Directed Acyclic Graph)
    +
    +

    Определите узел разделителя документов

    document_splitter = DocumentSplitter(
    +    split_by="sentence",  # Splits documents into sentences
    +    split_length=10,
    +    split_overlap=1,
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[converter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    converter
    +)  # Set dependency on the PDF converter
    +splitter_added = rag_wf.flow.add_nodes(document_splitter)  # Add to the DAG
    +
    +

    Определите узел встраивания

    embedder = OpenAIDocumentEmbedder(
    +    connection=OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]),
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[document_splitter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    document_splitter
    +)  # Set dependency on the splitter
    +document_embedder_added = rag_wf.flow.add_nodes(embedder)  # Add to the DAG
    +
    +

    Определите узел хранения векторов Milvus

    vector_store = (
    +    MilvusDocumentWriter(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        create_if_not_exist=True,
    +        metric_type="COSINE",
    +    )
    +    .inputs(documents=embedder.outputs.documents)  # Connect to embedder output
    +    .depends_on(embedder)  # Set dependency on the embedder
    +)
    +milvus_writer_added = rag_wf.flow.add_nodes(vector_store)  # Add to the DAG
    +
    +
    2024-11-19 22:14:03 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:03 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:04 - DEBUG - Created new connection using: 0bef2849fdb1458a85df8bb9dd27f51d
    +2024-11-19 22:14:04 - INFO - Collection my_milvus_collection does not exist. Creating a new collection.
    +2024-11-19 22:14:04 - DEBUG - Successfully created collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +
    +
    +

    Milvus предлагает два типа развертывания, предназначенных для различных случаев использования:

    +
      +
    1. MilvusDeploymentType.FILE
    2. +
    +
      +
    • Идеально подходит для локального прототипирования или хранения небольших объемов данных.
    • +
    • Установите uri на путь к локальному файлу (например, ./milvus.db), чтобы использовать Milvus Lite, который автоматически сохраняет все данные в указанном файле.
    • +
    • Это удобный вариант для быстрой настройки и экспериментов.
    • +
    +
      +
    1. MilvusDeploymentType.HOST
    2. +
    +
      +
    • Предназначен для сценариев с большими объемами данных, например, для управления более чем миллионом векторов.

      +

      Самостоятельно размещаемый сервер

      +
        +
      • Разверните высокопроизводительный сервер Milvus с помощью Docker или Kubernetes.
      • +
      • Настройте адрес и порт сервера как uri (например, http://localhost:19530).
      • +
      • Если включена аутентификация:
      • +
      • Укажите <your_username>:<your_password> в качестве token.
      • +
      • Если аутентификация отключена:
      • +
      • Оставьте значение token без изменений.
      • +
      +

      Zilliz Cloud (управляемая услуга)

      +
    • +
    +
    +

    Определение входных данных и запуск рабочего процесса

    file_paths = ["./pdf_files/WhatisMilvus.pdf"]
    +input_data = {
    +    "files": [BytesIO(open(path, "rb").read()) for path in file_paths],
    +    "metadata": [{"filename": path} for path in file_paths],
    +}
    +
    +# Run the workflow with the prepared input data
    +inserted_data = rag_wf.run(input_data=input_data)
    +
    +
    /var/folders/09/d0hx80nj35sb5hxb5cpc1q180000gn/T/ipykernel_31319/3145804345.py:4: ResourceWarning: unclosed file <_io.BufferedReader name='./pdf_files/WhatisMilvus.pdf'>
    +  BytesIO(open(path, "rb").read()) for path in file_paths
    +ResourceWarning: Enable tracemalloc to get the object allocation traceback
    +2024-11-19 22:14:09 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution started.
    +2024-11-19 22:14:09 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution succeeded in 58ms.
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution started.
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/websockets/legacy/__init__.py:6: DeprecationWarning: websockets.legacy is deprecated; see https://websockets.readthedocs.io/en/stable/howto/upgrade.html for upgrade instructions
    +  warnings.warn(  # deprecated in 14.0 - 2024-11-09
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/pydantic/fields.py:804: PydanticDeprecatedSince20: Using extra keyword arguments on `Field` is deprecated and will be removed. Use `json_schema_extra` instead. (Extra keys: 'is_accessible_to_agent'). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/
    +  warn(
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution succeeded in 104ms.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution started.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution succeeded in 724ms.
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution succeeded in 66ms.
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution succeeded in 961ms.
    +2024-11-19 22:14:10 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 1.3s.
    +2024-11-19 22:14:10 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution succeeded in 1.3s.
    +
    +

    С помощью этого рабочего процесса мы успешно реализовали конвейер индексации документов, используя Milvus в качестве векторной базы данных и модель встраивания OpenAI для семантического представления. Эта система обеспечивает быстрый и точный векторный поиск, формируя основу для таких рабочих процессов RAG, как семантический поиск, поиск документов и контекстное взаимодействие, управляемое ИИ.

    +

    Благодаря масштабируемым возможностям хранения Milvus и оркестровке Dynamiq это решение готово как для прототипирования, так и для крупномасштабных производственных развертываний. Теперь вы можете расширить этот конвейер, включив в него дополнительные задачи, такие как ответы на вопросы на основе поиска или генерация контента на основе ИИ.

    +

    Поток извлечения документов RAG

    В этом учебном пособии мы реализуем рабочий процесс поиска документов с дополненной генерацией (Retrieval-Augmented Generation, RAG). Этот рабочий процесс принимает запрос пользователя, генерирует для него векторное вложение, извлекает наиболее релевантные документы из векторной базы данных Milvus и использует большую языковую модель (LLM) для создания подробного и учитывающего контекст ответа на основе извлеченных документов.

    +

    Следуя этому процессу, вы создадите комплексное решение для семантического поиска и ответов на вопросы, сочетающее в себе мощь векторного поиска документов и возможности передовых LLM OpenAI. Такой подход позволяет эффективно и интеллектуально отвечать на запросы пользователей, используя знания, хранящиеся в вашей базе данных документов.

    +

    Импорт необходимых библиотек и инициализация рабочего процесса

    from dynamiq import Workflow
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.embedders import OpenAITextEmbedder
    +from dynamiq.nodes.retrievers import MilvusDocumentRetriever
    +from dynamiq.nodes.llms import OpenAI
    +from dynamiq.prompts import Message, Prompt
    +
    +# Initialize the workflow
    +retrieval_wf = Workflow()
    +
    +

    Определите подключение OpenAI и устройство встраивания текста

    # Establish OpenAI connection
    +openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"])
    +
    +# Define the text embedder node
    +embedder = OpenAITextEmbedder(
    +    connection=openai_connection,
    +    model="text-embedding-3-small",
    +)
    +
    +# Add the embedder node to the workflow
    +embedder_added = retrieval_wf.flow.add_nodes(embedder)
    +
    +

    Определите ретривер документов Milvus

    document_retriever = (
    +    MilvusDocumentRetriever(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        top_k=5,
    +    )
    +    .inputs(embedding=embedder.outputs.embedding)  # Connect to embedder output
    +    .depends_on(embedder)  # Dependency on the embedder node
    +)
    +
    +# Add the retriever node to the workflow
    +milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)
    +
    +
    2024-11-19 22:14:19 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:19 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:19 - DEBUG - Created new connection using: 98d1132773af4298a894ad5925845fd2
    +2024-11-19 22:14:19 - INFO - Collection my_milvus_collection already exists. Skipping creation.
    +
    +

    Определите шаблон подсказки

    # Define the prompt template for the LLM
    +prompt_template = """
    +Please answer the question based on the provided context.
    +
    +Question: {{ query }}
    +
    +Context:
    +{% for document in documents %}
    +- {{ document.content }}
    +{% endfor %}
    +"""
    +
    +# Create the prompt object
    +prompt = Prompt(messages=[Message(content=prompt_template, role="user")])
    +
    +

    Определите генератор ответов

    answer_generator = (
    +    OpenAI(
    +        connection=openai_connection,
    +        model="gpt-4o",
    +        prompt=prompt,
    +    )
    +    .inputs(
    +        documents=document_retriever.outputs.documents,
    +        query=embedder.outputs.query,
    +    )
    +    .depends_on(
    +        [document_retriever, embedder]
    +    )  # Dependencies on retriever and embedder
    +)
    +
    +# Add the answer generator node to the workflow
    +answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)
    +
    +

    Запустите рабочий процесс

    # Run the workflow with a sample query
    +sample_query = "What is the Advanced Search Algorithms in Milvus?"
    +
    +result = retrieval_wf.run(input_data={"query": sample_query})
    +
    +answer = result.output.get(answer_generator.id).get("output", {}).get("content")
    +print(answer)
    +
    +
    2024-11-19 22:14:22 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution started.
    +2024-11-19 22:14:22 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:22 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution started.
    +2024-11-19 22:14:23 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:23 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution succeeded in 474ms.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution started.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution succeeded in 23ms.
    +2024-11-19 22:14:23 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution started.
    +2024-11-19 22:14:24 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +2024-11-19 22:14:24 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution succeeded in 1.8s.
    +2024-11-19 22:14:25 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 2.4s.
    +2024-11-19 22:14:25 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution succeeded in 2.4s.
    +
    +
    +The advanced search algorithms in Milvus include a variety of in-memory and on-disk indexing/search algorithms such as IVF (Inverted File), HNSW (Hierarchical Navigable Small World), and DiskANN. These algorithms have been deeply optimized to enhance performance, delivering 30%-70% better performance compared to popular implementations like FAISS and HNSWLib. These optimizations are part of Milvus's design to ensure high efficiency and scalability in handling vector data.
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.json b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.json new file mode 100644 index 000000000..4bc6542f5 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.json @@ -0,0 +1 @@ +{"codeList":["from langchain.document_loaders import DirectoryLoader\n# Load HTML files already saved in a local directory\npath = \"../../RAG/rtdocs_new/\"\nglobal_pattern = '*.html'\nloader = DirectoryLoader(path=path, glob=global_pattern)\ndocs = loader.load()\n\n\n# Print num documents and a preview.\nprint(f\"loaded {len(docs)} documents\")\nprint(docs[0].page_content)\npprint.pprint(docs[0].metadata)\n","loaded 22 documents\nWhy Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...\n{'source': 'https://milvus.io/docs/quickstart.md'}\n","import torch\nfrom sentence_transformers import SentenceTransformer\n\n\n# Initialize torch settings for device-agnostic code.\nN_GPU = torch.cuda.device_count()\nDEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')\n\n\n# Download the model from huggingface model hub.\nmodel_name = \"BAAI/bge-large-en-v1.5\"\nencoder = SentenceTransformer(model_name, device=DEVICE)\n\n\n# Get the model parameters and save for later.\nEMBEDDING_DIM = encoder.get_sentence_embedding_dimension()\nMAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()\n\n\n# Inspect model parameters.\nprint(f\"model_name: {model_name}\")\nprint(f\"EMBEDDING_DIM: {EMBEDDING_DIM}\")\nprint(f\"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}\")\n","model_name: BAAI/bge-large-en-v1.5\nEMBEDDING_DIM: 1024\nMAX_SEQ_LENGTH: 512\n","from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n\nCHUNK_SIZE = 512\nchunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)\nprint(f\"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}\")\n\n\n# Define the splitter.\nchild_splitter = RecursiveCharacterTextSplitter(\n chunk_size=CHUNK_SIZE,\n chunk_overlap=chunk_overlap)\n\n\n# Chunk the docs.\nchunks = child_splitter.split_documents(docs)\nprint(f\"{len(docs)} docs split into {len(chunks)} child documents.\")\n\n\n# Encoder input is doc.page_content as strings.\nlist_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]\n\n\n# Embedding inference using HuggingFace encoder.\nembeddings = torch.tensor(encoder.encode(list_of_strings))\n\n\n# Normalize the embeddings.\nembeddings = np.array(embeddings / np.linalg.norm(embeddings))\n\n\n# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.\nconverted_values = list(map(np.float32, embeddings))\n\n\n# Create dict_list for Milvus insertion.\ndict_list = []\nfor chunk, vector in zip(chunks, converted_values):\n # Assemble embedding vector, original text chunk, metadata.\n chunk_dict = {\n 'chunk': chunk.page_content,\n 'source': chunk.metadata.get('source', \"\"),\n 'vector': vector,\n }\n dict_list.append(chunk_dict)\n","chunk_size: 512, chunk_overlap: 51.0\n22 docs split into 355 child documents.\n","# Connect a client to the Milvus Lite server.\nfrom pymilvus import MilvusClient\nmc = MilvusClient(\"milvus_demo.db\")\n\n\n# Create a collection with flexible schema and AUTOINDEX.\nCOLLECTION_NAME = \"MilvusDocs\"\nmc.create_collection(COLLECTION_NAME,\n EMBEDDING_DIM,\n consistency_level=\"Eventually\",\n auto_id=True, \n overwrite=True)\n\n\n# Insert data into the Milvus collection.\nprint(\"Start inserting entities\")\nstart_time = time.time()\nmc.insert(\n COLLECTION_NAME,\n data=dict_list,\n progress_bar=True)\n\n\nend_time = time.time()\nprint(f\"Milvus insert time for {len(dict_list)} vectors: \", end=\"\")\nprint(f\"{round(end_time - start_time, 2)} seconds\")\n","Start inserting entities\nMilvus insert time for 355 vectors: 0.2 seconds\n","SAMPLE_QUESTION = \"What do the parameters for HNSW mean?\"\n\n\n# Embed the question using the same encoder.\nquery_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))\n# Normalize embeddings to unit length.\nquery_embeddings = F.normalize(query_embeddings, p=2, dim=1)\n# Convert the embeddings to list of list of np.float32.\nquery_embeddings = list(map(np.float32, query_embeddings))\n\n\n# Define metadata fields you can filter on.\nOUTPUT_FIELDS = list(dict_list[0].keys())\nOUTPUT_FIELDS.remove('vector')\n\n\n# Define how many top-k results you want to retrieve.\nTOP_K = 2\n\n\n# Run semantic vector search using your query and the vector database.\nresults = mc.search(\n COLLECTION_NAME,\n data=query_embeddings,\n output_fields=OUTPUT_FIELDS,\n limit=TOP_K,\n consistency_level=\"Eventually\")\n","Retrieved result #1\ndistance = 0.7001987099647522\n('Chunk text: layer, finds the node closest to the target in this layer, and'\n...\n'outgoing')\nsource: https://milvus.io/docs/index.md\n\nRetrieved result #2\ndistance = 0.6953287124633789\n('Chunk text: this value can improve recall rate at the cost of increased'\n...\n'to the target')\nsource: https://milvus.io/docs/index.md\n","# (Recommended) Create a new conda environment.\nconda create -n myenv python=3.11 -y\nconda activate myenv\n\n\n# Install vLLM with CUDA 12.1.\npip install -U vllm transformers torch\n\n\nimport vllm, torch\nfrom vllm import LLM, SamplingParams\n\n\n# Clear the GPU memory cache.\ntorch.cuda.empty_cache()\n\n\n# Check the GPU.\n!nvidia-smi\n","# Login to HuggingFace using your new token.\nfrom huggingface_hub import login\nfrom google.colab import userdata\nhf_token = userdata.get('HF_TOKEN')\nlogin(token = hf_token, add_to_git_credential=True)\n","# 1. Choose a model\nMODELTORUN = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n\n\n# 2. Clear the GPU memory cache, you're going to need it all!\ntorch.cuda.empty_cache()\n\n\n# 3. Instantiate a vLLM model instance.\nllm = LLM(model=MODELTORUN,\n enforce_eager=True,\n dtype=torch.bfloat16,\n gpu_memory_utilization=0.5,\n max_model_len=1000,\n seed=415,\n max_num_batched_tokens=3000)\n","# Separate all the context together by space.\ncontexts_combined = ' '.join(contexts)\n# Lance Martin, LangChain, says put the best contexts at the end.\ncontexts_combined = ' '.join(reversed(contexts))\n\n\n# Separate all the unique sources together by comma.\nsource_combined = ' '.join(reversed(list(dict.fromkeys(sources))))\n\n\nSYSTEM_PROMPT = f\"\"\"First, check if the provided Context is relevant to\nthe user's question. Second, only if the provided Context is strongly relevant, answer the question using the Context. Otherwise, if the Context is not strongly relevant, answer the question without using the Context. \nBe clear, concise, relevant. Answer clearly, in fewer than 2 sentences.\nGrounding sources: {source_combined}\nContext: {contexts_combined}\nUser's question: {SAMPLE_QUESTION}\n\"\"\"\n\n\nprompts = [SYSTEM_PROMPT]\n","# Sampling parameters\nsampling_params = SamplingParams(temperature=0.2, top_p=0.95)\n\n\n# Invoke the vLLM model.\noutputs = llm.generate(prompts, sampling_params)\n\n\n# Print the outputs.\nfor output in outputs:\n prompt = output.prompt\n generated_text = output.outputs[0].text\n # !r calls repr(), which prints a string inside quotes.\n print()\n print(f\"Question: {SAMPLE_QUESTION!r}\")\n pprint.pprint(f\"Generated text: {generated_text!r}\")\n","Question: 'What do the parameters for HNSW MEAN!?'\nGenerated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '\n'* M: The maximum degree of nodes on each layer oof the graph, which can improve '\n'recall rate at the cost of increased search time. * efConstruction and ef: ' \n'These parameters specify a search range when building or searching an index.'\n"],"headingContent":"Building RAG with Milvus, vLLM, and Llama 3.1","anchorList":[{"label":"Создание RAG с помощью Milvus, vLLM и Llama 3.1","href":"Building-RAG-with-Milvus-vLLM-and-Llama-31","type":1,"isActive":false},{"label":"Введение в Milvus, vLLM и Meta's Llama 3.1","href":"Introduction-to-Milvus-vLLM-and-Meta’s-Llama-31","type":2,"isActive":false},{"label":"Построение и выполнение RAG-поиска с помощью Milvus","href":"Build-and-Perform-the-RAG-Retrieval-with-Milvus","type":2,"isActive":false},{"label":"Сборка и выполнение RAG-генерации с помощью vLLM и Llama 3.1-8B","href":"Build-and-Perform-the-RAG-Generation-with-vLLM-and-Llama-31-8B","type":2,"isActive":false},{"label":"Ссылки","href":"References","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.md b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.md new file mode 100644 index 000000000..96cb9b2f7 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/milvus_rag_with_vllm.md @@ -0,0 +1,386 @@ +--- +id: milvus_rag_with_vllm.md +summary: >- + В этом блоге мы расскажем вам, как создать и запустить RAG с помощью Milvus, + vLLM и Llama 3.1. Более конкретно, я покажу вам, как встраивать и хранить + текстовую информацию в виде векторных вкраплений в Milvus и использовать это + векторное хранилище в качестве базы знаний для эффективного извлечения + фрагментов текста, относящихся к вопросам пользователя. +title: 'Создание RAG с помощью Milvus, vLLM и Llama 3.1' +--- +

    Создание RAG с помощью Milvus, vLLM и Llama 3.1

    Калифорнийский университет в Беркли передал vLLM, быструю и простую в использовании библиотеку для вывода и обслуживания LLM, в фонд LF AI & Data Foundation в качестве проекта на стадии инкубации в июле 2024 года. Как проект-участник, мы приветствуем vLLM в семье LF AI & Data! 🎉

    +

    Большие языковые модели(LLM) и векторные базы данных обычно используются в паре для создания Retrieval Augmented Generation(RAG), популярной архитектуры приложений для решения проблемы галлюцинаций ИИ. В этом блоге мы расскажем вам, как построить и запустить RAG с помощью Milvus, vLLM и Llama 3.1. Более конкретно, я покажу вам, как встраивать и хранить текстовую информацию в виде векторных вкраплений в Milvus и использовать это векторное хранилище в качестве базы знаний для эффективного извлечения фрагментов текста, относящихся к вопросам пользователя. Наконец, мы используем vLLM для работы с моделью Meta Llama 3.1-8B, чтобы генерировать ответы, дополненные полученным текстом. Давайте погрузимся!

    +

    Введение в Milvus, vLLM и Meta's Llama 3.1

    Векторная база данных Milvus

    Milvus - это распределенная векторная база данных с открытым исходным кодом, предназначенная для хранения, индексации и поиска векторов в рабочих нагрузках генеративного ИИ (GenAI). Способность выполнять гибридный поиск, фильтрацию метаданных, повторное ранжирование и эффективно обрабатывать триллионы векторов делает Milvus лучшим выбором для рабочих нагрузок ИИ и машинного обучения. Milvus можно запускать локально, на кластере или размещать в полностью управляемом облаке Zilliz Cloud.

    +

    vLLM

    vLLM - это проект с открытым исходным кодом, начатый в лаборатории UC Berkeley SkyLab и направленный на оптимизацию производительности LLM-серверов. В нем используется эффективное управление памятью с помощью PagedAttention, непрерывное пакетирование и оптимизированные ядра CUDA. По сравнению с традиционными методами, vLLM повышает производительность обслуживания до 24 раз, сокращая при этом использование памяти GPU в два раза.

    +

    Согласно статье "Эффективное управление памятью при обслуживании больших языковых моделей с помощью PagedAttention", кэш KV использует около 30 % памяти GPU, что приводит к потенциальным проблемам с памятью. Кэш KV хранится в смежной памяти, но изменение его размера может привести к фрагментации памяти, что неэффективно для вычислений.

    +

    + + + + +

    +

    Изображение 1. Управление памятью KV-кэша в существующих системах ( статья 2023 Paged Attention)

    +

    Используя виртуальную память для KV-кэша, vLLM выделяет физическую память GPU только по мере необходимости, устраняя фрагментацию памяти и избегая предварительного распределения. В тестах vLLM превзошел HuggingFace Transformers (HF) и Text Generation Inference (TGI), достигнув пропускной способности в 24 раза выше, чем у HF, и в 3,5 раза выше, чем у TGI, на графических процессорах NVIDIA A10G и A100.

    +

    + + + + +

    +

    Изображение 2. Пропускная способность сервиса, когда каждый запрос запрашивает три параллельных завершения вывода. vLLM достигает 8,5x-15x более высокой пропускной способности, чем HF, и 3,3x-3,5x более высокой, чем TGI ( блог 2023 vLLM).

    +

    Meta's Llama 3.1

    Llama 3.1 от Meta была анонсирована 23 июля 2024 года. Модель 405B демонстрирует высочайшую производительность в нескольких публичных бенчмарках и имеет контекстное окно из 128 000 входных токенов с возможностью различного коммерческого использования. Наряду с моделью с 405 миллиардами параметров Meta выпустила обновленные версии Llama3 70B (70 миллиардов параметров) и 8B (8 миллиардов параметров). Весовые коэффициенты моделей доступны для скачивания на сайте Meta.

    +

    Ключевым моментом стало то, что точная настройка сгенерированных данных может повысить производительность, но некачественные примеры могут ее снизить. Команда Llama провела большую работу по выявлению и удалению таких плохих примеров, используя саму модель, вспомогательные модели и другие инструменты.

    +

    Построение и выполнение RAG-поиска с помощью Milvus

    Подготовьте набор данных.

    В качестве набора данных для этой демонстрации я использовал официальную документацию Milvus, которую я скачал и сохранил локально.

    +
    from langchain.document_loaders import DirectoryLoader
    +# Load HTML files already saved in a local directory
    +path = "../../RAG/rtdocs_new/"
    +global_pattern = '*.html'
    +loader = DirectoryLoader(path=path, glob=global_pattern)
    +docs = loader.load()
    +
    +
    +# Print num documents and a preview.
    +print(f"loaded {len(docs)} documents")
    +print(docs[0].page_content)
    +pprint.pprint(docs[0].metadata)
    +
    +
    loaded 22 documents
    +Why Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...
    +{'source': 'https://milvus.io/docs/quickstart.md'}
    +
    +

    Загрузите модель встраивания.

    Далее загрузите бесплатную модель встраивания с открытым исходным кодом с сайта HuggingFace.

    +
    import torch
    +from sentence_transformers import SentenceTransformer
    +
    +
    +# Initialize torch settings for device-agnostic code.
    +N_GPU = torch.cuda.device_count()
    +DEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')
    +
    +
    +# Download the model from huggingface model hub.
    +model_name = "BAAI/bge-large-en-v1.5"
    +encoder = SentenceTransformer(model_name, device=DEVICE)
    +
    +
    +# Get the model parameters and save for later.
    +EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
    +MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
    +
    +
    +# Inspect model parameters.
    +print(f"model_name: {model_name}")
    +print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
    +print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
    +
    +
    model_name: BAAI/bge-large-en-v1.5
    +EMBEDDING_DIM: 1024
    +MAX_SEQ_LENGTH: 512
    +
    +

    Разбейте и закодируйте ваши пользовательские данные в виде векторов.

    Я использую фиксированную длину 512 символов с 10-процентным перекрытием.

    +
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    +
    +
    +CHUNK_SIZE = 512
    +chunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)
    +print(f"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}")
    +
    +
    +# Define the splitter.
    +child_splitter = RecursiveCharacterTextSplitter(
    +   chunk_size=CHUNK_SIZE,
    +   chunk_overlap=chunk_overlap)
    +
    +
    +# Chunk the docs.
    +chunks = child_splitter.split_documents(docs)
    +print(f"{len(docs)} docs split into {len(chunks)} child documents.")
    +
    +
    +# Encoder input is doc.page_content as strings.
    +list_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]
    +
    +
    +# Embedding inference using HuggingFace encoder.
    +embeddings = torch.tensor(encoder.encode(list_of_strings))
    +
    +
    +# Normalize the embeddings.
    +embeddings = np.array(embeddings / np.linalg.norm(embeddings))
    +
    +
    +# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.
    +converted_values = list(map(np.float32, embeddings))
    +
    +
    +# Create dict_list for Milvus insertion.
    +dict_list = []
    +for chunk, vector in zip(chunks, converted_values):
    +   # Assemble embedding vector, original text chunk, metadata.
    +   chunk_dict = {
    +       'chunk': chunk.page_content,
    +       'source': chunk.metadata.get('source', ""),
    +       'vector': vector,
    +   }
    +   dict_list.append(chunk_dict)
    +
    +
    chunk_size: 512, chunk_overlap: 51.0
    +22 docs split into 355 child documents.
    +
    +

    Сохраните векторы в Milvus.

    Добавьте закодированные векторные вставки в базу данных векторов Milvus.

    +
    # Connect a client to the Milvus Lite server.
    +from pymilvus import MilvusClient
    +mc = MilvusClient("milvus_demo.db")
    +
    +
    +# Create a collection with flexible schema and AUTOINDEX.
    +COLLECTION_NAME = "MilvusDocs"
    +mc.create_collection(COLLECTION_NAME,
    +       EMBEDDING_DIM,
    +       consistency_level="Eventually",
    +       auto_id=True, 
    +       overwrite=True)
    +
    +
    +# Insert data into the Milvus collection.
    +print("Start inserting entities")
    +start_time = time.time()
    +mc.insert(
    +   COLLECTION_NAME,
    +   data=dict_list,
    +   progress_bar=True)
    +
    +
    +end_time = time.time()
    +print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
    +print(f"{round(end_time - start_time, 2)} seconds")
    +
    +
    Start inserting entities
    +Milvus insert time for 355 vectors: 0.2 seconds
    +
    +

    Задайте вопрос и найдите ближайшие соседние фрагменты из вашей базы знаний в Milvus.

    +
    SAMPLE_QUESTION = "What do the parameters for HNSW mean?"
    +
    +
    +# Embed the question using the same encoder.
    +query_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))
    +# Normalize embeddings to unit length.
    +query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
    +# Convert the embeddings to list of list of np.float32.
    +query_embeddings = list(map(np.float32, query_embeddings))
    +
    +
    +# Define metadata fields you can filter on.
    +OUTPUT_FIELDS = list(dict_list[0].keys())
    +OUTPUT_FIELDS.remove('vector')
    +
    +
    +# Define how many top-k results you want to retrieve.
    +TOP_K = 2
    +
    +
    +# Run semantic vector search using your query and the vector database.
    +results = mc.search(
    +    COLLECTION_NAME,
    +    data=query_embeddings,
    +    output_fields=OUTPUT_FIELDS,
    +    limit=TOP_K,
    +    consistency_level="Eventually")
    +
    +

    Полученный результат выглядит так, как показано ниже.

    +
    Retrieved result #1
    +distance = 0.7001987099647522
    +('Chunk text: layer, finds the node closest to the target in this layer, and'
    +...
    +'outgoing')
    +source: https://milvus.io/docs/index.md
    +
    +Retrieved result #2
    +distance = 0.6953287124633789
    +('Chunk text: this value can improve recall rate at the cost of increased'
    +...
    +'to the target')
    +source: https://milvus.io/docs/index.md
    +
    +

    Сборка и выполнение RAG-генерации с помощью vLLM и Llama 3.1-8B

    Установите vLLM и модели из HuggingFace

    По умолчанию vLLM загружает большие языковые модели из HuggingFace. В общем, если вы хотите использовать новую модель на HuggingFace, вам следует выполнить pip install --upgrade или -U. Кроме того, вам понадобится графический процессор, чтобы проводить анализ моделей Meta's Llama 3.1 с помощью vLLM.

    +

    Полный список всех моделей, поддерживаемых vLLM, можно найти на этой странице документации.

    +
    # (Recommended) Create a new conda environment.
    +conda create -n myenv python=3.11 -y
    +conda activate myenv
    +
    +
    +# Install vLLM with CUDA 12.1.
    +pip install -U vllm transformers torch
    +
    +
    +import vllm, torch
    +from vllm import LLM, SamplingParams
    +
    +
    +# Clear the GPU memory cache.
    +torch.cuda.empty_cache()
    +
    +
    +# Check the GPU.
    +!nvidia-smi
    +
    +

    Чтобы узнать больше о том, как установить vLLM, смотрите страницу его установки.

    +

    Получение токена HuggingFace.

    Некоторые модели на HuggingFace, например Meta Llama 3.1, требуют от пользователя принять лицензию, прежде чем он сможет загрузить грузы. Поэтому вы должны создать учетную запись HuggingFace, принять лицензию модели и сгенерировать токен.

    +

    При посещении этой страницы Llama3.1 на HuggingFace вы получите сообщение с просьбой согласиться с условиями. Нажмите "Принять лицензию", чтобы принять условия Meta перед загрузкой весов модели. Одобрение обычно занимает менее одного дня.

    +

    После получения одобрения вы должны сгенерировать новый токен HuggingFace. Старые токены не будут работать с новыми разрешениями.

    +

    Перед установкой vLLM войдите в HuggingFace с новым токеном. Ниже я использовал секреты Colab для хранения токена.

    +
    # Login to HuggingFace using your new token.
    +from huggingface_hub import login
    +from google.colab import userdata
    +hf_token = userdata.get('HF_TOKEN')
    +login(token = hf_token, add_to_git_credential=True)
    +
    +

    Запустите генерацию RAG

    В демонстрационном примере мы запускаем модель Llama-3.1-8B, которая требует GPU и значительного объема памяти. Следующий пример был запущен на Google Colab Pro ($10/месяц) с графическим процессором A100. Чтобы узнать больше о том, как запустить vLLM, вы можете ознакомиться с документацией по быстрому запуску.

    +
    # 1. Choose a model
    +MODELTORUN = "meta-llama/Meta-Llama-3.1-8B-Instruct"
    +
    +
    +# 2. Clear the GPU memory cache, you're going to need it all!
    +torch.cuda.empty_cache()
    +
    +
    +# 3. Instantiate a vLLM model instance.
    +llm = LLM(model=MODELTORUN,
    +         enforce_eager=True,
    +         dtype=torch.bfloat16,
    +         gpu_memory_utilization=0.5,
    +         max_model_len=1000,
    +         seed=415,
    +         max_num_batched_tokens=3000)
    +
    +

    Напишите подсказку, используя контексты и источники, полученные из Milvus.

    +
    # Separate all the context together by space.
    +contexts_combined = ' '.join(contexts)
    +# Lance Martin, LangChain, says put the best contexts at the end.
    +contexts_combined = ' '.join(reversed(contexts))
    +
    +
    +# Separate all the unique sources together by comma.
    +source_combined = ' '.join(reversed(list(dict.fromkeys(sources))))
    +
    +
    +SYSTEM_PROMPT = f"""First, check if the provided Context is relevant to
    +the user's question.  Second, only if the provided Context is strongly relevant, answer the question using the Context.  Otherwise, if the Context is not strongly relevant, answer the question without using the Context. 
    +Be clear, concise, relevant.  Answer clearly, in fewer than 2 sentences.
    +Grounding sources: {source_combined}
    +Context: {contexts_combined}
    +User's question: {SAMPLE_QUESTION}
    +"""
    +
    +
    +prompts = [SYSTEM_PROMPT]
    +
    +

    Теперь сгенерируйте ответ, используя извлеченные фрагменты и исходный вопрос, помещенный в подсказку.

    +
    # Sampling parameters
    +sampling_params = SamplingParams(temperature=0.2, top_p=0.95)
    +
    +
    +# Invoke the vLLM model.
    +outputs = llm.generate(prompts, sampling_params)
    +
    +
    +# Print the outputs.
    +for output in outputs:
    +   prompt = output.prompt
    +   generated_text = output.outputs[0].text
    +   # !r calls repr(), which prints a string inside quotes.
    +   print()
    +   print(f"Question: {SAMPLE_QUESTION!r}")
    +   pprint.pprint(f"Generated text: {generated_text!r}")
    +
    +
    Question: 'What do the parameters for HNSW MEAN!?'
    +Generated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '
    +'* M: The maximum degree of nodes on each layer oof the graph, which can improve '
    +'recall rate at the cost of increased search time. * efConstruction and ef: ' 
    +'These parameters specify a search range when building or searching an index.'
    +
    +

    По-моему, ответ выше выглядит идеально!

    +

    Если вас заинтересовала эта демонстрация, попробуйте сами и сообщите нам о своих впечатлениях. Вы также можете присоединиться к нашему сообществу Milvus на Discord, чтобы пообщаться со всеми разработчиками GenAI напрямую.

    +

    Ссылки

    diff --git a/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.json b/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.json new file mode 100644 index 000000000..4f167fd06 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install mem0ai pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Define Config\nfrom mem0 import Memory\n\nconfig = {\n \"vector_store\": {\n \"provider\": \"milvus\",\n \"config\": {\n \"collection_name\": \"quickstart_mem0_with_milvus\",\n \"embedding_model_dims\": \"1536\",\n \"url\": \"./milvus.db\", # Use local vector database for demo purpose\n },\n },\n \"version\": \"v1.1\",\n}\n\nm = Memory.from_config(config)\n","# Add a memory to user: Working on improving tennis skills\nres = m.add(\n messages=\"I am working on improving my tennis skills.\",\n user_id=\"alice\",\n metadata={\"category\": \"hobbies\"},\n)\n\nres\n","# Get memory_id\nmemory_id = res[\"results\"][0][\"id\"]\n\n# Update this memory with new information: Likes to play tennis on weekends\nm.update(memory_id=memory_id, data=\"Likes to play tennis on weekends\")\n","# Get all memory for the user Alice\nm.get_all(user_id=\"alice\")\n","m.history(memory_id=memory_id)\n","new_mem = m.add(\n \"I have a linear algebra midterm exam on November 20\",\n user_id=\"alice\",\n metadata={\"category\": \"task\"},\n)\n","m.get_all(user_id=\"alice\")\n","m.search(query=\"What are Alice's hobbies\", user_id=\"alice\")\n","m.delete(memory_id=memory_id)\n\nm.get_all(\"alice\")\n"],"headingContent":"Getting Started with Mem0 and Milvus","anchorList":[{"label":"Начало работы с Mem0 и Milvus","href":"Getting-Started-with-Mem0-and-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Управление пользовательскими воспоминаниями с помощью Mem0 и Milvus","href":"Managing-User-Memories-with-Mem0-and-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.md b/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.md new file mode 100644 index 000000000..205c4e762 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/quickstart_mem0_with_milvus.md @@ -0,0 +1,218 @@ +--- +id: quickstart_mem0_with_milvus.md +summary: >- + В этом уроке мы рассмотрим основные операции управления памятью Mem0 - + добавление, извлечение, обновление, поиск, удаление и отслеживание истории + памяти - с использованием Milvus, высокопроизводительной векторной базы данных + с открытым исходным кодом, которая обеспечивает эффективное хранение и + извлечение информации. Это практическое введение проведет вас через основные + операции с памятью, чтобы помочь вам создать персонализированное + взаимодействие ИИ с Mem0 и Milvus. +title: Начало работы с Mem0 и Milvus +--- +

    Начало работы с Mem0 и Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Mem0 - это интеллектуальный слой памяти для приложений ИИ, предназначенный для обеспечения персонализированного и эффективного взаимодействия за счет сохранения пользовательских предпочтений и непрерывной адаптации с течением времени. Идеально подходящий для чат-ботов и инструментов, управляемых искусственным интеллектом, Mem0 создает бесшовные, учитывающие контекст взаимодействия.

    +

    В этом уроке мы рассмотрим основные операции управления памятью Mem0 - добавление, извлечение, обновление, поиск, удаление и отслеживание истории памяти - с использованием Milvus, высокопроизводительной векторной базы данных с открытым исходным кодом, которая обеспечивает эффективное хранение и извлечение информации. Это практическое введение проведет вас через основные операции с памятью, чтобы помочь вам создать персонализированное взаимодействие ИИ с Mem0 и Milvus.

    +

    Подготовка

    Загрузите необходимые библиотеки

    $ pip install mem0ai pymilvus
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Настройка Mem0 с помощью Milvus

    В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Теперь мы можем настроить Mem0 на использование Milvus в качестве векторного хранилища.

    +
    # Define Config
    +from mem0 import Memory
    +
    +config = {
    +    "vector_store": {
    +        "provider": "milvus",
    +        "config": {
    +            "collection_name": "quickstart_mem0_with_milvus",
    +            "embedding_model_dims": "1536",
    +            "url": "./milvus.db",  # Use local vector database for demo purpose
    +        },
    +    },
    +    "version": "v1.1",
    +}
    +
    +m = Memory.from_config(config)
    +
    +
    +
    +
      +
    • Если вам нужна локальная база данных векторов только для небольших данных или прототипирования, установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +
    +
    +

    Управление пользовательскими воспоминаниями с помощью Mem0 и Milvus

    Добавление памяти

    Функция add сохраняет неструктурированный текст в Milvus в виде памяти, связывая его с конкретным пользователем и дополнительными метаданными.

    +

    Здесь мы добавляем в Milvus воспоминание Алисы "работаю над улучшением своих навыков игры в теннис" вместе с соответствующими метаданными для контекста.

    +
    # Add a memory to user: Working on improving tennis skills
    +res = m.add(
    +    messages="I am working on improving my tennis skills.",
    +    user_id="alice",
    +    metadata={"category": "hobbies"},
    +)
    +
    +res
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Working on improving tennis skills',
    +   'event': 'ADD'}],
    + 'relations': []}
    +
    +

    Обновление воспоминания

    Мы можем использовать возвращаемое значение функции add для получения идентификатора памяти, что позволит нам обновить эту память новой информацией с помощью update.

    +
    # Get memory_id
    +memory_id = res["results"][0]["id"]
    +
    +# Update this memory with new information: Likes to play tennis on weekends
    +m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
    +
    +
    {'message': 'Memory updated successfully!'}
    +
    +

    Получить всю память для пользователя

    Мы можем использовать функцию get_all для просмотра всех вставленных воспоминаний или фильтрации по user_id в Milvus.

    +

    Обратите внимание, что память теперь изменилась с "Работает над улучшением навыков игры в теннис" на "Любит играть в теннис по выходным".

    +
    # Get all memory for the user Alice
    +m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'}]}
    +
    +

    Просмотр истории обновления памяти

    Мы также можем просмотреть историю обновления воспоминаний, указав интересующий нас memory_id с помощью функции history.

    +
    m.history(memory_id=memory_id)
    +
    +
    [{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': None,
    +  'new_memory': 'Working on improving tennis skills',
    +  'event': 'ADD',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': None},
    + {'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': 'Working on improving tennis skills',
    +  'new_memory': 'Likes to play tennis on weekends',
    +  'event': 'UPDATE',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
    +
    +

    Поиск памяти

    Мы можем использовать функцию search для поиска наиболее связанного с пользователем воспоминания.

    +

    Для начала добавим еще одну память для Алисы.

    +
    new_mem = m.add(
    +    "I have a linear algebra midterm exam on November 20",
    +    user_id="alice",
    +    metadata={"category": "task"},
    +)
    +
    +

    Теперь мы вызываем get_all, указывая user_id, чтобы убедиться, что у нас действительно есть 2 записи памяти для пользователя Alice.

    +
    m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    Теперь мы можем выполнить search, предоставив query и user_id. Обратите внимание, что по умолчанию мы используем метрику L2 для поиска сходства, поэтому меньшее значение score означает большее сходство.

    +
    m.search(query="What are Alice's hobbies", user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'score': 1.2807445526123047,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'score': 1.728922724723816,
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    Удаление памяти

    Мы также можем delete память, предоставив соответствующее memory_id.

    +

    Мы удалим память "Любит играть в теннис по выходным", поскольку ее memory_id уже была получена, и вызовем get_all, чтобы убедиться, что удаление прошло успешно.

    +
    m.delete(memory_id=memory_id)
    +
    +m.get_all("alice")
    +
    +
    {'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/rag_with_langflow.json b/localization/v2.5.x/site/ru/integrations/rag_with_langflow.json new file mode 100644 index 000000000..6d2a2b873 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/rag_with_langflow.json @@ -0,0 +1 @@ +{"codeList":["$ python -m pip install langflow -U\n","$ python -m langflow run\n"],"headingContent":"Building a RAG System Using Langflow with Milvus","anchorList":[{"label":"Создание системы RAG с помощью Langflow и Milvus","href":"Building-a-RAG-System-Using-Langflow-with-Milvus","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Учебник .","href":"Tutorial","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/rag_with_langflow.md b/localization/v2.5.x/site/ru/integrations/rag_with_langflow.md new file mode 100644 index 000000000..d6865ddd7 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/rag_with_langflow.md @@ -0,0 +1,84 @@ +--- +id: rag_with_langflow.md +summary: >- + В этом руководстве показано, как использовать Langflow для создания конвейера + Retrieval-Augmented Generation (RAG) с помощью Milvus. +title: Создание системы RAG с помощью Langflow и Milvus +--- +

    Создание системы RAG с помощью Langflow и Milvus

    Это руководство демонстрирует, как использовать Langflow для создания конвейера Retrieval-Augmented Generation (RAG) с Milvus.

    +

    Система RAG улучшает генерацию текста, сначала извлекая соответствующие документы из базы знаний, а затем генерируя новые ответы на основе этого контекста. Milvus используется для хранения и получения текстовых вкраплений, а Langflow облегчает интеграцию поиска и генерации в визуальный рабочий процесс.

    +

    Langflow позволяет легко создавать конвейеры RAG, в которых фрагменты текста встраиваются, хранятся в Milvus и извлекаются при соответствующих запросах. Это позволяет языковой модели генерировать ответы с учетом контекста.

    +

    Milvus служит масштабируемой векторной базой данных, которая быстро находит семантически схожий текст, а Langflow позволяет управлять тем, как ваш конвейер обрабатывает поиск текста и генерирует ответы. Вместе они обеспечивают эффективный способ создания надежного конвейера RAG для усовершенствованных текстовых приложений.

    +

    Предварительные условия

    Перед запуском этого блокнота убедитесь, что у вас установлены следующие зависимости:

    +
    $ python -m pip install langflow -U
    +
    +

    Учебник .

    После установки всех зависимостей запустите дашборд Langflow, введя следующую команду:

    +
    $ python -m langflow run
    +
    +

    После этого появится панель инструментов, как показано ниже: langflowlangflow .

    +

    Мы хотим создать проект Vector Store, поэтому сначала нам нужно нажать кнопку New Project. Появится панель, и мы выберем вариант Vector Store RAG: panelpanel

    +

    После успешного создания проекта Vector Store Rag по умолчанию используется векторное хранилище AstraDB, в то время как мы хотим использовать Milvus. Поэтому нам нужно заменить эти два модуля astraDB на Milvus, чтобы использовать Milvus в качестве векторного хранилища. astraDBastraDB

    +

    Шаги по замене astraDB на Milvus:

      +
    1. Удалите существующие карты Vector Store. Щелкните на двух карточках AstraDB, отмеченных красным цветом на изображении выше, и нажмите backspace, чтобы удалить их.
    2. +
    3. Нажмите на опцию Vector Store в боковой панели, выберите Milvus и перетащите ее на холст. Сделайте это дважды, поскольку нам нужны две карты Milvus: одна для хранения рабочего процесса обработки файлов и одна для рабочего процесса поиска.
    4. +
    5. Свяжите модули Milvus с остальными компонентами. Для справки смотрите изображение ниже.
    6. +
    7. Настройте учетные данные Milvus для обоих модулей Milvus. Самый простой способ - использовать Milvus Lite, установив Connection URI на milvus_demo.db. Если у вас есть самостоятельно развернутый сервер Milvus или Zilliz Cloud, установите Connection URI на конечную точку сервера и Connection Password на токен (для Milvus это конкатенированный ":", для Zilliz Cloud это API Key). Для справки смотрите рисунок ниже:
    8. +
    +

    + + Milvus Structure demo + Демонстрация структуры Milvus

    +

    Встраивание знаний в систему RAG

      +
    1. Загрузите файл в базу знаний LLM через модуль файла в левом нижнем углу. Здесь мы загрузили файл, содержащий краткое введение в Milvus
    2. +
    3. Запустите рабочий процесс вставки, нажав кнопку run на модуле Milvus в правом нижнем углу. В результате знания будут вставлены в векторное хранилище Milvus.
    4. +
    5. Проверьте, сохранились ли знания в памяти. Откройте playground и задайте любые вопросы, связанные с загруженным файлом.
    6. +
    +

    + + why milvus + почему Milvus

    diff --git a/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.json b/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.json new file mode 100644 index 000000000..92b63e319 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -qU \"unstructured-ingest[pdf]\" unstructured pymilvus openai\n","import os\n\n\nos.environ[\"UNSTRUCTURED_API_KEY\"] = \"***********\"\nos.environ[\"UNSTRUCTURED_URL\"] = \"***********\"\n\nos.environ[\"OPENAI_API_KEY\"] = \"***********\"\n","from pymilvus import MilvusClient, DataType\n\n# Initialize Milvus client\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\") # TODO\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n\n\ndef emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","# Create schema\nschema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)\n# Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=65535)\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)\nindex_params = MilvusClient.prepare_index_params()\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"AUTOINDEX\",\n)\nmilvus_client.create_collection(\n collection_name=collection_name,\n schema=schema,\n index_params=index_params,\n consistency_level=\"Strong\",\n)\n\nmilvus_client.load_collection(collection_name=collection_name)\n","from unstructured_ingest.v2.pipeline.pipeline import Pipeline\nfrom unstructured_ingest.v2.interfaces import ProcessorConfig\nfrom unstructured_ingest.v2.processes.connectors.local import (\n LocalIndexerConfig,\n LocalDownloaderConfig,\n LocalConnectionConfig,\n LocalUploaderConfig,\n)\nfrom unstructured_ingest.v2.processes.partitioner import PartitionerConfig\n\ndirectory_with_pdfs = \"./pdf_files\"\ndirectory_with_results = \"./pdf_processed_outputs\"\n\nPipeline.from_configs(\n context=ProcessorConfig(),\n indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),\n downloader_config=LocalDownloaderConfig(),\n source_connection_config=LocalConnectionConfig(),\n partitioner_config=PartitionerConfig(\n partition_by_api=True,\n api_key=os.getenv(\"UNSTRUCTURED_API_KEY\"),\n partition_endpoint=os.getenv(\"UNSTRUCTURED_API_URL\"),\n strategy=\"hi_res\",\n additional_partition_args={\n \"split_pdf_page\": True,\n \"split_pdf_concurrency_level\": 15,\n },\n ),\n uploader_config=LocalUploaderConfig(output_dir=directory_with_results),\n).run()\n\n\nfrom unstructured.staging.base import elements_from_json\n\n\ndef load_processed_files(directory_path):\n elements = []\n for filename in os.listdir(directory_path):\n if filename.endswith(\".json\"):\n file_path = os.path.join(directory_path, filename)\n try:\n elements.extend(elements_from_json(filename=file_path))\n except IOError:\n print(f\"Error: Could not read file {filename}.\")\n\n return elements\n\n\nelements = load_processed_files(directory_with_results)\n","data = []\nfor i, element in enumerate(elements):\n data.append(\n {\n \"id\": i,\n \"vector\": emb_text(element.text),\n \"text\": element.text,\n \"metadata\": element.metadata.to_dict(),\n }\n )\nmilvus_client.insert(collection_name=collection_name, data=data)\n","def retrieve_documents(question, top_k=3):\n search_res = milvus_client.search(\n collection_name=collection_name,\n data=[emb_text(question)],\n limit=top_k,\n # search_params={\"metric_type\": \"IP\", \"params\": {}},\n output_fields=[\"text\"],\n )\n return [(res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]]\n","def generate_rag_response(question):\n retrieved_docs = retrieve_documents(question)\n context = \"\\n\".join([f\"Text: {doc[0]}\\n\" for doc in retrieved_docs])\n system_prompt = (\n \"You are an AI assistant. Provide answers based on the given context.\"\n )\n user_prompt = f\"\"\"\n Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.\n \n Context:\n {context}\n \n Question: {question}\n \"\"\"\n response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": system_prompt},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n return response.choices[0].message.content\n","question = \"What is the Advanced Search Algorithms in Milvus?\"\nanswer = generate_rag_response(question)\nprint(f\"Question: {question}\")\nprint(f\"Answer: {answer}\")\n"],"headingContent":"Build a RAG with Milvus and Unstructured","anchorList":[{"label":"Построение RAG с помощью Milvus и Unstructured","href":"Build-a-RAG-with-Milvus-and-Unstructured","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Создание коллекции Milvus","href":"Create-Milvus-Collection","type":2,"isActive":false},{"label":"Загрузка данных из Unstructured","href":"Load-data-from-Unstructured","type":2,"isActive":false},{"label":"Получение и генерация ответа","href":"Retrieve-and-Generate-Response","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.md b/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.md new file mode 100644 index 000000000..52d352ae4 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/rag_with_milvus_and_unstructured.md @@ -0,0 +1,289 @@ +--- +id: rag_with_milvus_and_unstructured.md +summary: >- + В этом руководстве мы будем использовать Unstructured для получения + PDF-документов, а затем с помощью Milvus построим конвейер RAG. +title: Построение RAG с помощью Milvus и Unstructured +--- +

    Построение RAG с помощью Milvus и Unstructured

    +Open In Colab + + +GitHub Repository +

    +

    Unstructured предоставляет платформу и инструменты для получения и обработки неструктурированных документов для создания расширенного поиска (RAG) и точной настройки модели. Она предлагает как платформу с пользовательским интерфейсом без кода, так и бессерверные API-сервисы, позволяющие пользователям обрабатывать данные на вычислительных ресурсах, размещенных на Unstructured.

    +

    В этом руководстве мы будем использовать Unstructured для получения PDF-документов, а затем с помощью Milvus построим конвейер RAG.

    +

    Подготовка

    Зависимости и среда

    $ pip install -qU "unstructured-ingest[pdf]" unstructured pymilvus openai
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Переменные окружения UNSTRUCTURED_API_KEY и UNSTRUCTURED_URL можно получить здесь.

    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +
    +os.environ["UNSTRUCTURED_API_KEY"] = "***********"
    +os.environ["UNSTRUCTURED_URL"] = "***********"
    +
    +os.environ["OPENAI_API_KEY"] = "***********"
    +
    +

    Подготовьте клиенты Milvus и OpenAI

    Вы можете использовать клиент Milvus для создания коллекции Milvus и вставки в нее данных.

    +
    from pymilvus import MilvusClient, DataType
    +
    +# Initialize Milvus client
    +milvus_client = MilvusClient(uri="./milvus_demo.db")  # TODO
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Подготовьте клиент OpenAI для генерации вкраплений и ответов.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +
    +def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовый эмбеддинг и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    Создание коллекции Milvus

    Мы создадим коллекцию со следующей схемой:

    +
      +
    • id: первичный ключ, который является уникальным идентификатором для каждого документа.
    • +
    • vector: вложенность документа.
    • +
    • text: текстовое содержимое документа.
    • +
    • metadata: метаданные документа.
    • +
    +

    Затем мы создаем индекс AUTOINDEX по полю vector. А затем создаем коллекцию.

    +
    # Create schema
    +schema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)
    +# Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)
    +index_params = MilvusClient.prepare_index_params()
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="AUTOINDEX",
    +)
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    schema=schema,
    +    index_params=index_params,
    +    consistency_level="Strong",
    +)
    +
    +milvus_client.load_collection(collection_name=collection_name)
    +
    +

    Загрузка данных из Unstructured

    Unstructured предоставляет гибкий и мощный конвейер для обработки различных типов файлов, включая PDF, HTML и т. д. Мы воспользуемся функцией ingest для разделения PDF-файлов в локальной директории. А затем загрузим данные в Milvus.

    +
    from unstructured_ingest.v2.pipeline.pipeline import Pipeline
    +from unstructured_ingest.v2.interfaces import ProcessorConfig
    +from unstructured_ingest.v2.processes.connectors.local import (
    +    LocalIndexerConfig,
    +    LocalDownloaderConfig,
    +    LocalConnectionConfig,
    +    LocalUploaderConfig,
    +)
    +from unstructured_ingest.v2.processes.partitioner import PartitionerConfig
    +
    +directory_with_pdfs = "./pdf_files"
    +directory_with_results = "./pdf_processed_outputs"
    +
    +Pipeline.from_configs(
    +    context=ProcessorConfig(),
    +    indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),
    +    downloader_config=LocalDownloaderConfig(),
    +    source_connection_config=LocalConnectionConfig(),
    +    partitioner_config=PartitionerConfig(
    +        partition_by_api=True,
    +        api_key=os.getenv("UNSTRUCTURED_API_KEY"),
    +        partition_endpoint=os.getenv("UNSTRUCTURED_API_URL"),
    +        strategy="hi_res",
    +        additional_partition_args={
    +            "split_pdf_page": True,
    +            "split_pdf_concurrency_level": 15,
    +        },
    +    ),
    +    uploader_config=LocalUploaderConfig(output_dir=directory_with_results),
    +).run()
    +
    +
    +from unstructured.staging.base import elements_from_json
    +
    +
    +def load_processed_files(directory_path):
    +    elements = []
    +    for filename in os.listdir(directory_path):
    +        if filename.endswith(".json"):
    +            file_path = os.path.join(directory_path, filename)
    +            try:
    +                elements.extend(elements_from_json(filename=file_path))
    +            except IOError:
    +                print(f"Error: Could not read file {filename}.")
    +
    +    return elements
    +
    +
    +elements = load_processed_files(directory_with_results)
    +
    +

    Вставка данных в Milvus.

    +
    data = []
    +for i, element in enumerate(elements):
    +    data.append(
    +        {
    +            "id": i,
    +            "vector": emb_text(element.text),
    +            "text": element.text,
    +            "metadata": element.metadata.to_dict(),
    +        }
    +    )
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +

    Получение и генерация ответа

    Определите функцию для получения соответствующих документов из Milvus.

    +
    def retrieve_documents(question, top_k=3):
    +    search_res = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[emb_text(question)],
    +        limit=top_k,
    +        # search_params={"metric_type": "IP", "params": {}},
    +        output_fields=["text"],
    +    )
    +    return [(res["entity"]["text"], res["distance"]) for res in search_res[0]]
    +
    +

    Определите функцию для генерации ответа с использованием полученных документов в конвейере RAG.

    +
    def generate_rag_response(question):
    +    retrieved_docs = retrieve_documents(question)
    +    context = "\n".join([f"Text: {doc[0]}\n" for doc in retrieved_docs])
    +    system_prompt = (
    +        "You are an AI assistant. Provide answers based on the given context."
    +    )
    +    user_prompt = f"""
    +    Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.
    +    
    +    Context:
    +    {context}
    +    
    +    Question: {question}
    +    """
    +    response = openai_client.chat.completions.create(
    +        model="gpt-4o-mini",
    +        messages=[
    +            {"role": "system", "content": system_prompt},
    +            {"role": "user", "content": user_prompt},
    +        ],
    +    )
    +    return response.choices[0].message.content
    +
    +

    Давайте протестируем конвейер RAG на примере вопроса.

    +
    question = "What is the Advanced Search Algorithms in Milvus?"
    +answer = generate_rag_response(question)
    +print(f"Question: {question}")
    +print(f"Answer: {answer}")
    +
    +
    INFO: HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +INFO: HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +
    +
    +Question: What is the Advanced Search Algorithms in Milvus?
    +Answer: The Advanced Search Algorithms in Milvus refer to a wide range of in-memory and on-disk indexing/search algorithms it supports, including IVF, HNSW, DiskANN, and more. These algorithms have been deeply optimized, and Milvus delivers 30%-70% better performance compared to popular implementations like FAISS and HNSWLib.
    +
    diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.json b/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.json new file mode 100644 index 000000000..e67def008 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/arc53/DocsGPT.git\n$ cd DocsGPT\n","$ echo \"\\nlangchain-milvus==0.1.6\" >> ./application/requirements.txt\n"," backend:\n build: ./application\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n"," worker:\n build: ./application\n command: celery -A application.app.celery worker -l INFO -B\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n","$ docker compose down\n"],"headingContent":"Use Milvus in DocsGPT","anchorList":[{"label":"Использование Milvus в DocsGPT","href":"Use-Milvus-in-DocsGPT","type":1,"isActive":false},{"label":"Требования","href":"Requirements","type":2,"isActive":false},{"label":"Клонируйте репозиторий","href":"Clone-the-repository","type":2,"isActive":false},{"label":"Добавить зависимость","href":"Add-dependency","type":2,"isActive":false},{"label":"Установите переменные окружения","href":"Set-environment-variables","type":2,"isActive":false},{"label":"Запустите службы","href":"Start-the-services","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.md b/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.md new file mode 100644 index 000000000..a0775fef3 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_in_docsgpt.md @@ -0,0 +1,142 @@ +--- +id: use_milvus_in_docsgpt.md +summary: >- + В этом руководстве мы покажем вам, как использовать Milvus в качестве + внутренней базы данных векторов для DocsGPT. +title: Использование Milvus в DocsGPT +--- +

    Использование Milvus в DocsGPT

    DocsGPT - это передовое решение с открытым исходным кодом, которое упрощает поиск информации в проектной документации за счет интеграции мощных моделей GPT. Оно позволяет разработчикам легко получать точные ответы на свои вопросы о проекте, избавляя их от трудоемкого ручного поиска.

    +

    В этом руководстве мы покажем вам, как использовать Milvus в качестве внутренней векторной базы данных для DocsGPT.

    +
    +

    Это руководство в основном ссылается на официальное руководство по установке DocsGPT. Если вы обнаружите, что в этом руководстве есть устаревшие части, вы можете отдать предпочтение официальному руководству и создать проблему для нас.

    +
    +

    Требования

    Убедитесь, что у вас установлен Docker

    +

    Клонируйте репозиторий

    Клонируйте репозиторий и перейдите в него:

    +
    $ git clone https://github.com/arc53/DocsGPT.git
    +$ cd DocsGPT
    +
    +

    Добавить зависимость

    Добавьте зависимость langchain-milvus в файл requirements.txt в папке application:

    +
    $ echo "\nlangchain-milvus==0.1.6" >> ./application/requirements.txt
    +
    +

    Установите переменные окружения

    Добавьте VECTOR_STORE=milvus, MILVUS_URI=..., MILVUS_TOKEN=... в переменные окружения для сервисов backend и worker в файле docker-compose.yaml, как показано ниже:

    +
      backend:
    +    build: ./application
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +
      worker:
    +    build: ./application
    +    command: celery -A application.app.celery worker -l INFO -B
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +

    Для сервисов MILVUS_URI и MILVUS_TOKEN вы можете использовать либо полностью управляемый сервис Zilliz Cloud(рекомендуется), либо запущенный вручную сервис Milvus.

    +
      +
    • Для полностью управляемого сервиса Zillz Cloud: Мы рекомендуем использовать сервис Zilliz Cloud. Вы можете зарегистрировать бесплатную пробную учетную запись на Zilliz Cloud. После этого вы получите адреса MILVUS_URI и MILVUS_TOKEN, которые соответствуют публичной конечной точке и ключу API.

    • +
    • Для запуска сервиса Milvus вручную: Если вы хотите настроить сервис Milvus, вы можете следовать официальной документации Milvus для настройки сервера Milvus, а затем получить MILVUS_URI и MILVUS_TOKEN с сервера. Файлы MILVUS_URI и MILVUS_TOKEN должны быть в формате http://<your_server_ip>:19530 и <your_username>:<your_password> соответственно.

    • +
    +

    Запустите службы

    Выполните: ./setup.sh

    +

    Затем перейдите на страницу http://localhost:5173/.

    +

    Вы можете поиграть с пользовательским интерфейсом и задать вопросы о ваших документах.

    +

    + + alt text + текст alt

    +

    Если вы хотите остановить сервисы, выполните:

    +
    $ docker compose down
    +
    +

    Для получения более подробной информации и более сложных настроек, пожалуйста, обратитесь к официальной документации DocsGPT.

    diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.json b/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.json new file mode 100644 index 000000000..793eca70c --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/zylon-ai/private-gpt\n$ cd private-gpt\n","$ brew install make\n","$ choco install make\n","$ poetry install --extras \"llms-ollama embeddings-ollama vector-stores-milvus ui\"\n","$ ollama serve\n","$ ollama pull llama3.1\n$ ollama pull nomic-embed-text\n","vectorstore:\n database: milvus\n","milvus:\n uri: http://localhost:19530\n collection_name: my_collection\n","PGPT_PROFILES=ollama make run\n"],"headingContent":"Use Milvus in PrivateGPT","anchorList":[{"label":"Использование Milvus в PrivateGPT","href":"Use-Milvus-in-PrivateGPT","type":1,"isActive":false},{"label":"Базовые требования для запуска PrivateGPT","href":"Base-requirements-to-run-PrivateGPT","type":2,"isActive":false},{"label":"Установите доступные модули","href":"Install-Available-Modules","type":2,"isActive":false},{"label":"Запустите службу Ollama","href":"Start-Ollama-service","type":2,"isActive":false},{"label":"Изменение настроек Milvus","href":"Change-Milvus-Settings","type":2,"isActive":false},{"label":"Запуск PrivateGPT","href":"Start-PrivateGPT","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.md b/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.md new file mode 100644 index 000000000..86975cce4 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_in_private_gpt.md @@ -0,0 +1,170 @@ +--- +id: use_milvus_in_private_gpt.md +summary: >- + В этом руководстве мы покажем вам, как использовать Milvus в качестве + внутренней базы данных векторов для PrivateGPT. +title: Использование Milvus в PrivateGPT +--- +

    Использование Milvus в PrivateGPT

    PrivateGPT - это готовый к производству ИИ-проект, который позволяет пользователям задавать вопросы о документах с помощью больших языковых моделей без подключения к интернету, обеспечивая при этом 100% конфиденциальность. PrivateGPT предлагает API, разделенный на высокоуровневые и низкоуровневые блоки. Он также предоставляет клиент Gradio UI и такие полезные инструменты, как скрипты массовой загрузки моделей и скрипты ингестирования. Концептуально PrivateGPT оборачивает конвейер RAG и раскрывает его примитивы, будучи готовым к использованию и предоставляя полную реализацию API и конвейера RAG.

    +

    В этом руководстве мы покажем вам, как использовать Milvus в качестве внутренней базы данных векторов для PrivateGPT.

    +
    +

    Это руководство в основном ссылается на официальное руководство по установке PrivateGPT. Если вы обнаружите, что в этом руководстве есть устаревшие части, вы можете в приоритетном порядке следовать официальному руководству и создать проблему для нас.

    +
    +

    Базовые требования для запуска PrivateGPT

    1. Клонируйте репозиторий PrivateGPT

    Клонируйте репозиторий и перейдите к нему:

    +
    $ git clone https://github.com/zylon-ai/private-gpt
    +$ cd private-gpt
    +
    +

    2. Установите Poetry

    Установите Poetry для управления зависимостями: Для установки следуйте инструкциям на официальном сайте Poetry.

    +

    3. (Необязательно) Установите make

    Чтобы запускать различные скрипты, необходимо установить make.

    +

    macOS (с помощью Homebrew):

    +
    $ brew install make
    +
    +

    Windows (использование Chocolatey):

    +
    $ choco install make
    +
    +

    Установите доступные модули

    PrivateGPT позволяет настроить некоторые модули, например, LLM, Embeddings, Vector Stores, UI.

    +

    В этом руководстве мы будем использовать следующие модули:

    +
      +
    • LLM: Ollama
    • +
    • Embeddings: Ollama
    • +
    • Vector Stores: Milvus
    • +
    • UI: Gradio
    • +
    +

    Выполните следующую команду, чтобы с помощью поэзии установить необходимые зависимости модулей:

    +
    $ poetry install --extras "llms-ollama embeddings-ollama vector-stores-milvus ui"
    +
    +

    Запустите службу Ollama

    Перейдите на сайт ollama.ai и следуйте инструкциям для установки Ollama на вашу машину.

    +

    После установки убедитесь, что приложение Ollama для рабочего стола закрыто.

    +

    Теперь запустите сервис Ollama (он запустит локальный сервер вывода, обслуживающий как LLM, так и Embeddings):

    +
    $ ollama serve
    +
    +

    Установите модели, которые будут использоваться, по умолчанию settings-ollama.yaml настроен на пользователя llama3.1 8b LLM (~4GB) и nomic-embed-text Embeddings (~275MB).

    +

    По умолчанию PrivateGPT будет автоматически извлекать модели по мере необходимости. Это поведение можно изменить, изменив свойство ollama.autopull_models.

    +

    В любом случае, если вы хотите извлекать модели вручную, выполните следующие команды:

    +
    $ ollama pull llama3.1
    +$ ollama pull nomic-embed-text
    +
    +

    При желании вы можете изменить свои любимые модели в файле settings-ollama.yaml и извлекать их вручную.

    +

    Изменение настроек Milvus

    В файле settings-ollama.yaml установите для vectorstore значение milvus:

    +
    vectorstore:
    +  database: milvus
    +
    +

    Вы также можете добавить некоторую конфигурацию Milvus, чтобы указать свои настройки. Например, так:

    +
    milvus:
    +  uri: http://localhost:19530
    +  collection_name: my_collection
    +
    +

    Доступны следующие опции конфигурации:

    + + + + + + + + + + +
    Поле ОпцияОписание
    uriПо умолчанию установлен "local_data/private_gpt/milvus/milvus_local.db" в качестве локального файла; вы также можете установить более производительный сервер Milvus на docker или k8s, например http://localhost:19530, в качестве вашего uri; Чтобы использовать Zilliz Cloud, настройте uri и token на Public Endpoint и API key в Zilliz Cloud.
    токенПара с сервером Milvus на docker или k8s или api ключ в Zilliz Cloud.
    имя_коллекцииИмя коллекции, по умолчанию установлено "milvus_db".
    перезаписатьПерезаписывать данные в коллекции, если они существовали, по умолчанию установлено значение True.
    +

    Запуск PrivateGPT

    После того как все настройки выполнены, вы можете запустить PrivateGPT с помощью пользовательского интерфейса Gradio.

    +
    PGPT_PROFILES=ollama make run
    +
    +

    UI будет доступен по адресу http://0.0.0.0:8001.

    +

    + + + + +

    +

    Вы можете поиграть с пользовательским интерфейсом и задать вопросы о ваших документах.

    +

    За более подробной информацией обращайтесь к официальной документации PrivateGPT.

    diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.json b/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.json new file mode 100644 index 000000000..c0721a96d --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/sambanova/ai-starter-kit.git\n$ d ai-starter-kit/enterprise_knowledge_retriever\n","...\nvectorstore = self.vectordb.create_vector_store(\n ..., db_type='milvus'\n)\n...\nvectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)\n","python3 -m venv enterprise_knowledge_env\nsource enterprise_knowledge_env/bin/activate\npip install -r requirements.txt\n","$ streamlit run streamlit/app.py --browser.gatherUsageStats false \n"],"headingContent":"Use Milvus with SambaNova","anchorList":[{"label":"Использование Milvus с SambaNova","href":"Use-Milvus-with-SambaNova","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Клонируйте репозиторий","href":"Clone-the-repository","type":2,"isActive":false},{"label":"Измените тип векторного хранилища","href":"Change-the-vector-store-type","type":2,"isActive":false},{"label":"Установите зависимости","href":"Install-dependencies","type":2,"isActive":false},{"label":"Запустите приложение","href":"Start-the-application","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.md b/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.md new file mode 100644 index 000000000..082988bff --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/use_milvus_with_sambanova.md @@ -0,0 +1,135 @@ +--- +id: use_milvus_with_sambanova.md +summary: >- + Этот учебник использует интеграцию Milvus в SambaNova AI Starter Kits для + создания корпоративной системы поиска знаний, подобной RAG + (Retrieval-Augmented Generation), для поиска и ответа на основе частных + документов предприятия. +title: Использование Milvus с SambaNova +--- +

    Использование Milvus с SambaNova

    SambaNova - это инновационная технологическая платформа ИИ, которая ускоряет развертывание передовых возможностей ИИ и глубокого обучения. Разработанная для корпоративного использования, она позволяет организациям использовать генеративный ИИ для повышения производительности и эффективности. Благодаря таким передовым решениям, как SambaNova Suite и DataScale, платформа позволяет предприятиям извлекать ценные сведения из своих данных, что способствует повышению эффективности работы и открывает новые возможности в сфере ИИ.

    +

    SambaNova AI Starter Kits - это коллекция ресурсов с открытым исходным кодом, призванных помочь разработчикам и предприятиям в развертывании приложений, основанных на искусственном интеллекте, с помощью SambaNova. Эти наборы содержат практические примеры и руководства, которые облегчают реализацию различных случаев использования ИИ, упрощая пользователям использование передовых технологий SambaNova.

    +

    В этом руководстве используется интеграция Milvus в SambaNova AI Starter Kits для создания системы поиска знаний предприятия, подобной RAG (Retrieval-Augmented Generation), для поиска и ответа на основе частных документов предприятия.

    +
    +

    Это руководство в основном ссылается на официальное руководство SambaNova AI Starter Kits. Если вы обнаружите, что в этом руководстве есть устаревшие части, вы можете в первую очередь следовать официальному руководству и создать проблему для нас.

    +
    +

    Необходимые условия

    Мы рекомендуем использовать Python >= 3.10 и < 3.12.

    +

    Посетите SambaNova Cloud, чтобы получить ключ API SambaNova.

    +

    Клонируйте репозиторий

    $ git clone https://github.com/sambanova/ai-starter-kit.git
    +$ d ai-starter-kit/enterprise_knowledge_retriever
    +
    +

    Измените тип векторного хранилища

    Измените тип векторного хранилища, установив db_type='milvus' в функции create_vector_store() и load_vdb() в src/document_retrieval.py.

    +
    ...
    +vectorstore = self.vectordb.create_vector_store(
    +    ..., db_type='milvus'
    +)
    +...
    +vectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)
    +
    +

    Установите зависимости

    Установите необходимые зависимости, выполнив следующую команду:

    +
    python3 -m venv enterprise_knowledge_env
    +source enterprise_knowledge_env/bin/activate
    +pip install -r requirements.txt
    +
    +

    Запустите приложение

    Запустите приложение с помощью следующей команды:

    +
    $ streamlit run streamlit/app.py --browser.gatherUsageStats false 
    +
    +

    После этого вы увидите пользовательский интерфейс в браузере:http://localhost:8501/

    +

    + + + + +

    +

    После установки ключа API SambaNova в пользовательском интерфейсе, вы можете играть с пользовательским интерфейсом и задавать вопросы о ваших документах.

    +

    Для получения более подробной информации, пожалуйста, обратитесь к официальной документации Enterprise Knowledge Retrieval of SambaNova AI Starter Kits.

    diff --git a/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.json b/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.json new file mode 100644 index 000000000..90c9f0c07 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["mkdir video-search-tutorial\ncd video-search-tutorial\n","python -m venv venv\nsource venv/bin/activate # On Windows, use `venv\\Scripts\\activate`\n","pip install twelvelabs pymilvus\n","touch video_search.py\n","export TWELVE_LABS_API_KEY='your_api_key_here'\n","from pymilvus import MilvusClient\n\n# Initialize the Milvus client\nmilvus_client = MilvusClient(\"milvus_twelvelabs_demo.db\")\n\nprint(\"Successfully connected to Milvus\")\n","# Initialize the collection name\ncollection_name = \"twelvelabs_demo_collection\"\n\n# Check if the collection already exists and drop it if it does\nif milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n\n# Create the collection\nmilvus_client.create_collection(\n collection_name=collection_name,\n dimension=1024 # The dimension of the Twelve Labs embeddings\n)\n\nprint(f\"Collection '{collection_name}' created successfully\")\n","from twelvelabs import TwelveLabs\nfrom twelvelabs.models.embed import EmbeddingsTask\nimport os\n\n# Retrieve the API key from environment variables\nTWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')\n","twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)\n","def generate_embedding(video_url):\n \"\"\"\n Generate embeddings for a given video URL using the Twelve Labs API.\n\n This function creates an embedding task for the specified video URL using\n the Marengo-retrieval-2.6 engine. It monitors the task progress and waits\n for completion. Once done, it retrieves the task result and extracts the\n embeddings along with their associated metadata.\n\n Args:\n video_url (str): The URL of the video to generate embeddings for.\n\n Returns:\n tuple: A tuple containing two elements:\n 1. list: A list of dictionaries, where each dictionary contains:\n - 'embedding': The embedding vector as a list of floats.\n - 'start_offset_sec': The start time of the segment in seconds.\n - 'end_offset_sec': The end time of the segment in seconds.\n - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').\n 2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.\n\n Raises:\n Any exceptions raised by the Twelve Labs API during task creation,\n execution, or retrieval.\n \"\"\"\n\n # Create an embedding task\n task = twelvelabs_client.embed.task.create(\n engine_name=\"Marengo-retrieval-2.6\",\n video_url=video_url\n )\n print(f\"Created task: id={task.id} engine_name={task.engine_name} status={task.status}\")\n\n # Define a callback function to monitor task progress\n def on_task_update(task: EmbeddingsTask):\n print(f\" Status={task.status}\")\n\n # Wait for the task to complete\n status = task.wait_for_done(\n sleep_interval=2,\n callback=on_task_update\n )\n print(f\"Embedding done: {status}\")\n\n # Retrieve the task result\n task_result = twelvelabs_client.embed.task.retrieve(task.id)\n\n # Extract and return the embeddings\n embeddings = []\n for v in task_result.video_embeddings:\n embeddings.append({\n 'embedding': v.embedding.float,\n 'start_offset_sec': v.start_offset_sec,\n 'end_offset_sec': v.end_offset_sec,\n 'embedding_scope': v.embedding_scope\n })\n \n return embeddings, task_result\n","# Example usage\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Generate embeddings for the video\nembeddings, task_result = generate_embedding(video_url)\n\nprint(f\"Generated {len(embeddings)} embeddings for the video\")\nfor i, emb in enumerate(embeddings):\n print(f\"Embedding {i+1}:\")\n print(f\" Scope: {emb['embedding_scope']}\")\n print(f\" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds\")\n print(f\" Embedding vector (first 5 values): {emb['embedding'][:5]}\")\n print()\n","def insert_embeddings(milvus_client, collection_name, task_result, video_url):\n \"\"\"\n Insert embeddings into the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to insert into.\n task_result (EmbeddingsTaskResult): The task result containing video embeddings.\n video_url (str): The URL of the video associated with the embeddings.\n\n Returns:\n MutationResult: The result of the insert operation.\n\n This function takes the video embeddings from the task result and inserts them\n into the specified Milvus collection. Each embedding is stored with additional\n metadata including its scope, start and end times, and the associated video URL.\n \"\"\"\n data = []\n\n for i, v in enumerate(task_result.video_embeddings):\n data.append({\n \"id\": i,\n \"vector\": v.embedding.float,\n \"embedding_scope\": v.embedding_scope,\n \"start_offset_sec\": v.start_offset_sec,\n \"end_offset_sec\": v.end_offset_sec,\n \"video_url\": video_url\n })\n\n insert_result = milvus_client.insert(collection_name=collection_name, data=data)\n print(f\"Inserted {len(data)} embeddings into Milvus\")\n return insert_result\n\n# Usage example\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Assuming this function exists from previous step\nembeddings, task_result = generate_embedding(video_url)\n\n# Insert embeddings into the Milvus collection\ninsert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)\nprint(insert_result)\n","def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):\n \"\"\"\n Perform a similarity search on the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to search in.\n query_vector (list): The query vector to search for similar embeddings.\n limit (int, optional): The maximum number of results to return. Defaults to 5.\n\n Returns:\n list: A list of search results, where each result is a dictionary containing\n the matched entity's metadata and similarity score.\n\n This function searches the specified Milvus collection for embeddings similar to\n the given query vector. It returns the top matching results, including metadata\n such as the embedding scope, time range, and associated video URL for each match.\n \"\"\"\n search_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vector],\n limit=limit,\n output_fields=[\"embedding_scope\", \"start_offset_sec\", \"end_offset_sec\", \"video_url\"]\n )\n\n return search_results\n \n# define the query vector\n# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.\nquery_vector = task_result.video_embeddings[0].embedding.float\n\n# Perform a similarity search on the Milvus collection\nsearch_results = perform_similarity_search(milvus_client, collection_name, query_vector)\n\nprint(\"Search Results:\")\nfor i, result in enumerate(search_results[0]):\n print(f\"Result {i+1}:\")\n print(f\" Video URL: {result['entity']['video_url']}\")\n print(f\" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds\")\n print(f\" Similarity Score: {result['distance']}\")\n print()\n"],"headingContent":"Advanced Video Search: Leveraging Twelve Labs and Milvus for Semantic Retrieval","anchorList":[{"label":"Расширенный поиск по видео: Использование технологий Twelve Labs и Milvus для семантического поиска","href":"Advanced-Video-Search-Leveraging-Twelve-Labs-and-Milvus-for-Semantic-Retrieval","type":1,"isActive":false},{"label":"Введение","href":"Introduction","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка среды разработки","href":"Setting-Up-the-Development-Environment","type":2,"isActive":false},{"label":"Подключение к Milvus","href":"Connecting-to-Milvus","type":2,"isActive":false},{"label":"Создание коллекции Milvus для вкраплений видео","href":"Creating-a-Milvus-Collection-for-Video-Embeddings","type":2,"isActive":false},{"label":"Генерация вкраплений с помощью Twelve Labs Embed API","href":"Generating-Embeddings-with-Twelve-Labs-Embed-API","type":2,"isActive":false},{"label":"Инициализируйте клиент Twelve Labs:","href":"Initialize-the-Twelve-Labs-client","type":2,"isActive":false},{"label":"Вставка эмбеддингов в Milvus","href":"Inserting-Embeddings-into-Milvus","type":2,"isActive":false},{"label":"Выполнение поиска по сходству","href":"Performing-Similarity-Search","type":2,"isActive":false},{"label":"Оптимизация производительности","href":"Optimizing-Performance","type":2,"isActive":false},{"label":"Расширенные возможности","href":"Advanced-Features","type":2,"isActive":false},{"label":"Обработка ошибок и ведение журнала","href":"Error-Handling-and-Logging","type":2,"isActive":false},{"label":"Заключение","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.md b/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.md new file mode 100644 index 000000000..b75c14fe3 --- /dev/null +++ b/localization/v2.5.x/site/ru/integrations/video_search_with_twelvelabs_and_milvus.md @@ -0,0 +1,463 @@ +--- +id: video_search_with_twelvelabs_and_milvus.md +summary: >- + Узнайте, как создать приложение для семантического видеопоиска, интегрировав + API Embed от Twelve Labs для генерации мультимодальных вкраплений с Milvus. В + книге рассматривается весь процесс - от создания среды разработки до + реализации таких продвинутых функций, как гибридный поиск и временной анализ + видео, - что обеспечивает комплексную основу для создания сложных систем + анализа и поиска видеоконтента. +title: >- + Расширенный поиск по видео: Использование технологий Twelve Labs и Milvus для + семантического поиска +--- +

    Расширенный поиск по видео: Использование технологий Twelve Labs и Milvus для семантического поиска

    Введение

    Добро пожаловать в это полное руководство по реализации семантического поиска видео с помощью Twelve Labs Embed API и Milvus. В этом руководстве мы рассмотрим, как использовать возможности передовых мультимодальных вкраплений Twelve Labs и эффективной векторной базы данных Milvus для создания надежного решения для поиска видео. Интегрируя эти технологии, разработчики могут открыть новые возможности анализа видеоконтента, создавая такие приложения, как контентный поиск видео, рекомендательные системы и сложные поисковые системы, понимающие нюансы видеоданных.

    +

    В этом учебном пособии вы пройдете весь путь от настройки среды разработки до реализации функционального приложения семантического видеопоиска. Мы рассмотрим такие ключевые понятия, как генерация мультимодальных вкраплений из видео, их эффективное хранение в Milvus и выполнение поиска по сходству для извлечения релевантного контента. Независимо от того, создаете ли вы платформу для видеоаналитики, инструмент для обнаружения контента или расширяете существующие приложения возможностями видеопоиска, это руководство даст вам знания и практические шаги для использования объединенных преимуществ Twelve Labs и Milvus в ваших проектах.

    +

    Предварительные условия

    Прежде чем мы начнем, убедитесь, что у вас есть следующее:

    +

    API-ключ Twelve Labs (зарегистрируйтесь на сайте https://api.twelvelabs.io, если у вас его нет) На вашей системе установлен Python 3.7 или более поздней версии.

    +

    Настройка среды разработки

    Создайте новый каталог для вашего проекта и перейдите в него:

    +
    mkdir video-search-tutorial
    +cd video-search-tutorial
    +
    +

    Создайте виртуальную среду (необязательно, но рекомендуется):

    +
    python -m venv venv
    +source venv/bin/activate  # On Windows, use `venv\Scripts\activate`
    +
    +

    Установите необходимые библиотеки Python:

    +
    pip install twelvelabs pymilvus
    +
    +

    Создайте новый файл Python для вашего проекта:

    +
    touch video_search.py
    +
    +

    Этот файл video_search.py будет основным скриптом, который мы будем использовать в учебнике. Далее задайте свой API-ключ Twelve Labs в качестве переменной окружения для безопасности:

    +
    export TWELVE_LABS_API_KEY='your_api_key_here'
    +
    +

    Подключение к Milvus

    Чтобы установить соединение с Milvus, мы будем использовать класс MilvusClient. Такой подход упрощает процесс подключения и позволяет нам работать с локальным файловым экземпляром Milvus, что идеально подходит для нашего учебника.

    +
    from pymilvus import MilvusClient
    +
    +# Initialize the Milvus client
    +milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
    +
    +print("Successfully connected to Milvus")
    +
    +

    Этот код создает новый экземпляр клиента Milvus, который будет хранить все данные в файле с именем milvus_twelvelabs_demo.db. Такой подход, основанный на файлах, идеально подходит для целей разработки и тестирования.

    +

    Создание коллекции Milvus для вкраплений видео

    Теперь, когда мы подключились к Milvus, давайте создадим коллекцию для хранения наших видеовставок и связанных с ними метаданных. Мы определим схему коллекции и создадим ее, если она еще не существует.

    +
    # Initialize the collection name
    +collection_name = "twelvelabs_demo_collection"
    +
    +# Check if the collection already exists and drop it if it does
    +if milvus_client.has_collection(collection_name=collection_name):
    +    milvus_client.drop_collection(collection_name=collection_name)
    +
    +# Create the collection
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=1024  # The dimension of the Twelve Labs embeddings
    +)
    +
    +print(f"Collection '{collection_name}' created successfully")
    +
    +

    В этом коде мы сначала проверяем, существует ли коллекция, и удаляем ее, если она уже существует. Это гарантирует, что мы начнем с чистого листа. Мы создаем коллекцию с размером 1024, что соответствует размеру выходных данных эмбеддингов Twelve Labs.

    +

    Генерация вкраплений с помощью Twelve Labs Embed API

    Чтобы сгенерировать вставки для наших видео с помощью Twelve Labs Embed API, мы воспользуемся Twelve Labs Python SDK. Этот процесс включает в себя создание задачи встраивания, ожидание ее завершения и получение результатов. Вот как это реализовать:

    +

    Во-первых, убедитесь, что у вас установлен Twelve Labs SDK, и импортируйте необходимые модули:

    +
    from twelvelabs import TwelveLabs
    +from twelvelabs.models.embed import EmbeddingsTask
    +import os
    +
    +# Retrieve the API key from environment variables
    +TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
    +
    +

    Инициализируйте клиент Twelve Labs:

    twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
    +
    +

    Создайте функцию для генерации вкраплений для заданного URL-адреса видео:

    +
    def generate_embedding(video_url):
    +    """
    +    Generate embeddings for a given video URL using the Twelve Labs API.
    +
    +    This function creates an embedding task for the specified video URL using
    +    the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
    +    for completion. Once done, it retrieves the task result and extracts the
    +    embeddings along with their associated metadata.
    +
    +    Args:
    +        video_url (str): The URL of the video to generate embeddings for.
    +
    +    Returns:
    +        tuple: A tuple containing two elements:
    +            1. list: A list of dictionaries, where each dictionary contains:
    +                - 'embedding': The embedding vector as a list of floats.
    +                - 'start_offset_sec': The start time of the segment in seconds.
    +                - 'end_offset_sec': The end time of the segment in seconds.
    +                - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
    +            2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
    +
    +    Raises:
    +        Any exceptions raised by the Twelve Labs API during task creation,
    +        execution, or retrieval.
    +    """
    +
    +    # Create an embedding task
    +    task = twelvelabs_client.embed.task.create(
    +        engine_name="Marengo-retrieval-2.6",
    +        video_url=video_url
    +    )
    +    print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
    +
    +    # Define a callback function to monitor task progress
    +    def on_task_update(task: EmbeddingsTask):
    +        print(f"  Status={task.status}")
    +
    +    # Wait for the task to complete
    +    status = task.wait_for_done(
    +        sleep_interval=2,
    +        callback=on_task_update
    +    )
    +    print(f"Embedding done: {status}")
    +
    +    # Retrieve the task result
    +    task_result = twelvelabs_client.embed.task.retrieve(task.id)
    +
    +    # Extract and return the embeddings
    +    embeddings = []
    +    for v in task_result.video_embeddings:
    +        embeddings.append({
    +            'embedding': v.embedding.float,
    +            'start_offset_sec': v.start_offset_sec,
    +            'end_offset_sec': v.end_offset_sec,
    +            'embedding_scope': v.embedding_scope
    +        })
    +    
    +    return embeddings, task_result
    +
    +

    Используйте функцию для генерации вкраплений для ваших видео:

    +
    # Example usage
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Generate embeddings for the video
    +embeddings, task_result = generate_embedding(video_url)
    +
    +print(f"Generated {len(embeddings)} embeddings for the video")
    +for i, emb in enumerate(embeddings):
    +    print(f"Embedding {i+1}:")
    +    print(f"  Scope: {emb['embedding_scope']}")
    +    print(f"  Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
    +    print(f"  Embedding vector (first 5 values): {emb['embedding'][:5]}")
    +    print()
    +
    +

    Эта реализация позволяет генерировать вставки для любого URL-адреса видео, используя Twelve Labs Embed API. Функция generate_embedding обрабатывает весь процесс, начиная с создания задачи и заканчивая получением результатов. Она возвращает список словарей, каждый из которых содержит вектор встраивания вместе с его метаданными (временной диапазон и область применения). Не забудьте обработать возможные ошибки, такие как проблемы с сетью или ограничения API, в производственной среде. Возможно, вам захочется реализовать повторные попытки или более надежную обработку ошибок в зависимости от конкретного случая использования.

    +

    Вставка эмбеддингов в Milvus

    После генерации вкраплений с помощью Twelve Labs Embed API следующим шагом будет вставка этих вкраплений вместе с их метаданными в нашу коллекцию Milvus. Этот процесс позволяет нам хранить и индексировать наши видеовставки для последующего эффективного поиска по сходству.

    +

    Вот как вставить вставки в Milvus:

    +
    def insert_embeddings(milvus_client, collection_name, task_result, video_url):
    +    """
    +    Insert embeddings into the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to insert into.
    +        task_result (EmbeddingsTaskResult): The task result containing video embeddings.
    +        video_url (str): The URL of the video associated with the embeddings.
    +
    +    Returns:
    +        MutationResult: The result of the insert operation.
    +
    +    This function takes the video embeddings from the task result and inserts them
    +    into the specified Milvus collection. Each embedding is stored with additional
    +    metadata including its scope, start and end times, and the associated video URL.
    +    """
    +    data = []
    +
    +    for i, v in enumerate(task_result.video_embeddings):
    +        data.append({
    +            "id": i,
    +            "vector": v.embedding.float,
    +            "embedding_scope": v.embedding_scope,
    +            "start_offset_sec": v.start_offset_sec,
    +            "end_offset_sec": v.end_offset_sec,
    +            "video_url": video_url
    +        })
    +
    +    insert_result = milvus_client.insert(collection_name=collection_name, data=data)
    +    print(f"Inserted {len(data)} embeddings into Milvus")
    +    return insert_result
    +
    +# Usage example
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Assuming this function exists from previous step
    +embeddings, task_result = generate_embedding(video_url)
    +
    +# Insert embeddings into the Milvus collection
    +insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
    +print(insert_result)
    +
    +

    Эта функция подготавливает данные для вставки, включая все необходимые метаданные, такие как вектор встраивания, временной диапазон и URL-адрес исходного видео. Затем она использует клиент Milvus для вставки этих данных в указанную коллекцию.

    +

    После того как мы сохранили в Milvus наши вкрапления, мы можем выполнить поиск по сходству, чтобы найти наиболее релевантные сегменты видео на основе вектора запроса. Вот как реализовать эту функциональность:

    +
    def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
    +    """
    +    Perform a similarity search on the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to search in.
    +        query_vector (list): The query vector to search for similar embeddings.
    +        limit (int, optional): The maximum number of results to return. Defaults to 5.
    +
    +    Returns:
    +        list: A list of search results, where each result is a dictionary containing
    +              the matched entity's metadata and similarity score.
    +
    +    This function searches the specified Milvus collection for embeddings similar to
    +    the given query vector. It returns the top matching results, including metadata
    +    such as the embedding scope, time range, and associated video URL for each match.
    +    """
    +    search_results = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[query_vector],
    +        limit=limit,
    +        output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
    +    )
    +
    +    return search_results
    +    
    +# define the query vector
    +# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
    +query_vector = task_result.video_embeddings[0].embedding.float
    +
    +# Perform a similarity search on the Milvus collection
    +search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
    +
    +print("Search Results:")
    +for i, result in enumerate(search_results[0]):
    +    print(f"Result {i+1}:")
    +    print(f"  Video URL: {result['entity']['video_url']}")
    +    print(f"  Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
    +    print(f"  Similarity Score: {result['distance']}")
    +    print()
    +
    +

    Эта реализация делает следующее:

    +
      +
    1. Определяет функцию perform_similarity_search, которая принимает вектор запроса и ищет похожие вкрапления в коллекции Milvus.
    2. +
    3. Использует метод поиска клиента Milvus для поиска наиболее похожих векторов.
    4. +
    5. Указывает выходные поля, которые мы хотим получить, включая метаданные о совпадающих видеосегментах.
    6. +
    7. Приводится пример использования этой функции с видеозаписью запроса: сначала генерируется ее вложение, а затем она используется для поиска.
    8. +
    9. Выводит результаты поиска, включая соответствующие метаданные и оценки сходства.
    10. +
    +

    Реализовав эти функции, вы создали полный рабочий процесс для хранения в Milvus вкраплений видео и выполнения поиска по сходству. Такая настройка позволяет эффективно находить похожий видеоконтент на основе мультимодальных вкраплений, созданных с помощью Twelve Labs's Embed API.

    +

    Оптимизация производительности

    Итак, давайте выведем это приложение на новый уровень! При работе с крупными коллекциями видео производительность имеет ключевое значение. Для оптимизации мы должны реализовать пакетную обработку для генерации и вставки в Milvus. Таким образом, мы сможем обрабатывать несколько видео одновременно, значительно сокращая общее время обработки. Кроме того, мы можем использовать функцию разделения Milvus для более эффективной организации наших данных, возможно, по категориям видео или временным периодам. Это ускорит выполнение запросов, позволив нам искать только в соответствующих разделах.

    +

    Еще один прием оптимизации - использование механизмов кэширования для часто используемых вкраплений или результатов поиска. Это может значительно улучшить время отклика для популярных запросов. Не забывайте настраивать параметры индекса Milvus в зависимости от конкретного набора данных и шаблонов запросов - небольшая настройка может значительно повысить производительность поиска.

    +

    Расширенные возможности

    Теперь давайте добавим несколько крутых функций, чтобы наше приложение выделялось на фоне других! Мы можем реализовать гибридный поиск, сочетающий текстовые и видеозапросы. На самом деле, Twelve Labs Embed API также может генерировать текстовые вставки для ваших текстовых запросов. Представьте, что пользователи могут ввести как текстовое описание, так и пример видеоклипа - мы сгенерируем вкрапления для обоих и выполним взвешенный поиск в Milvus. Это даст нам очень точные результаты.

    +

    Еще одним замечательным дополнением стал бы временной поиск внутри видео. Мы могли бы разбивать длинные видео на более мелкие сегменты, каждый из которых имел бы свой собственный эмбеддинг. Таким образом, пользователи могли бы находить конкретные моменты в видео, а не только целые клипы. И почему бы не включить базовую видеоаналитику? Мы могли бы использовать вкрапления для группировки похожих сегментов видео, выявления тенденций или даже определения выбросов в больших коллекциях видео.

    +

    Обработка ошибок и ведение журнала

    Давайте признаем, что все может пойти не так, и когда это происходит, мы должны быть готовы. Реализация надежной обработки ошибок имеет решающее значение. Мы должны обернуть наши вызовы API и операции с базой данных в блоки try-except, предоставляя пользователям информативные сообщения об ошибках, когда что-то не получается. Если речь идет о сетевых проблемах, то повторные попытки с экспоненциальным отступлением помогут справиться с временными сбоями.

    +

    Что касается протоколирования, то это наш лучший друг для отладки и мониторинга. Мы должны использовать модуль протоколирования Python для отслеживания важных событий, ошибок и показателей производительности нашего приложения. Давайте установим различные уровни ведения журнала - DEBUG для разработки, INFO для общей работы и ERROR для критических проблем. И не забудьте реализовать ротацию журналов для управления размерами файлов. Благодаря правильному ведению журналов мы сможем быстро выявлять и устранять проблемы, обеспечивая бесперебойную работу нашего приложения для поиска видео даже при увеличении его масштаба.

    +

    Заключение

    Поздравляем! Вы создали мощное приложение для семантического поиска видео, используя API Embed от Twelve Labs и Milvus. Эта интеграция позволяет обрабатывать, хранить и извлекать видеоконтент с беспрецедентной точностью и эффективностью. Используя мультимодальные вкрапления, вы создали систему, которая понимает нюансы видеоданных, открывая захватывающие возможности для обнаружения контента, рекомендательных систем и расширенной видеоаналитики.

    +

    Продолжая разрабатывать и совершенствовать свое приложение, помните, что сочетание передовой генерации вкраплений Twelve Labs и масштабируемого векторного хранилища Milvus обеспечивает надежную основу для решения еще более сложных задач понимания видео. Мы призываем вас экспериментировать с обсуждаемыми расширенными возможностями и расширять границы возможного в области поиска и анализа видео.

    diff --git a/localization/v2.5.x/site/ru/menuStructure/ru.json b/localization/v2.5.x/site/ru/menuStructure/ru.json new file mode 100644 index 000000000..6844cf66b --- /dev/null +++ b/localization/v2.5.x/site/ru/menuStructure/ru.json @@ -0,0 +1,2196 @@ +[ + { + "label": "О Милвусе", + "id": "about", + "isMenu": true, + "order": 0, + "children": [ + { + "label": "Что такое Милвус", + "id": "overview.md", + "order": 0, + "children": [] + }, + { + "label": "Усыновители Милвуса", + "id": "milvus_adopters.md", + "order": 1, + "children": [] + }, + { + "label": "Дорожная карта Милвуса", + "id": "roadmap.md", + "order": 2, + "children": [] + }, + { + "label": "Релизы", + "id": "release_notes.md", + "order": 3, + "children": [] + }, + { + "label": "Бенчмарки", + "id": "benchmark.md", + "order": 4, + "children": [] + }, + { + "label": "Сравнение", + "id": "comparison.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Начать", + "id": "getstarted", + "isMenu": true, + "order": 1, + "children": [ + { + "label": "Быстрый старт", + "id": "quickstart.md", + "order": 0, + "children": [] + }, + { + "label": "Установить Милвус", + "id": "install_milvus", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "install-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Запустить Milvus Lite", + "id": "milvus_lite.md", + "order": 1, + "children": [] + }, + { + "label": "Запустить Милвуса автономно", + "id": "run_milvus_docker", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Требования", + "id": "prerequisite-docker.md", + "order": 0, + "children": [] + }, + { + "label": "Docker (Linux)", + "id": "install_standalone-docker.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose (Linux)", + "id": "install_standalone-docker-compose.md", + "order": 2, + "children": [] + }, + { + "label": "Docker Desktop (Windows)", + "id": "install_standalone-windows.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Запустить Милвус Дистрикт", + "id": "run_milvus_k8s", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Требования", + "id": "prerequisite-helm.md", + "order": 0, + "children": [] + }, + { + "label": "Оператор Милвус", + "id": "install_cluster-milvusoperator.md", + "order": 1, + "children": [] + }, + { + "label": "Рулевая диаграмма", + "id": "install_cluster-helm.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Запустите Milvus с графическим процессором", + "id": "run_milvus_gpu", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Требования", + "id": "prerequisite-gpu.md", + "order": 0, + "children": [] + }, + { + "label": "Рулевая диаграмма", + "id": "install_cluster-helm-gpu.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose", + "id": "install_standalone-docker-compose-gpu.md", + "order": 2, + "children": [] + } + ] + } + ] + }, + { + "label": "Установите SDK", + "id": "install_sdks", + "order": 2, + "children": [ + { + "label": "PyMilvus", + "id": "install-pymilvus.md", + "order": 0, + "children": [] + }, + { + "label": "Java SDK", + "id": "install-java.md", + "order": 1, + "children": [] + }, + { + "label": "Go SDK", + "id": "install-go.md", + "order": 2, + "children": [] + }, + { + "label": "Node.js SDK", + "id": "install-node.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "Концепции", + "id": "concepts", + "isMenu": true, + "order": 2, + "children": [ + { + "label": "Архитектура", + "id": "architecture", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "architecture_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Хранение/вычисления", + "id": "four_layers.md", + "order": 1, + "children": [] + }, + { + "label": "Основные компоненты", + "id": "main_components.md", + "order": 2, + "children": [] + }, + { + "label": "Обработка данных", + "id": "data_processing.md", + "order": 3, + "children": [] + }, + { + "label": "Knowhere", + "id": "knowhere.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Битсет", + "id": "bitset.md", + "order": 1, + "children": [] + }, + { + "label": "Многопользовательская сеть", + "id": "multi_tenancy.md", + "order": 3, + "children": [] + }, + { + "label": "Временная метка", + "id": "timestamp.md", + "order": 4, + "children": [] + }, + { + "label": "Синхронизация времени", + "id": "time_sync.md", + "order": 6, + "children": [] + }, + { + "label": "Векторный индекс", + "id": "vector_index", + "order": 7, + "isMenu": true, + "children": [ + { + "label": "Индекс в памяти", + "id": "index.md", + "order": 0, + "children": [] + }, + { + "label": "Индекс на диске", + "id": "disk_index.md", + "order": 1, + "children": [] + }, + { + "label": "Индекс GPU", + "id": "gpu_index.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Скалярный индекс", + "id": "scalar_index.md", + "order": 8, + "children": [] + }, + { + "label": "Метрические типы", + "id": "metric.md", + "order": 9, + "children": [] + }, + { + "label": "Уровень согласованности", + "id": "consistency.md", + "order": 10, + "children": [] + }, + { + "label": "Реплика в памяти", + "id": "replica.md", + "order": 11, + "children": [] + }, + { + "label": "Терминология", + "id": "glossary.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Руководство пользователя", + "id": "userguide", + "isMenu": true, + "order": 3, + "children": [ + { + "label": "База данных", + "id": "manage_databases.md", + "order": 0, + "children": [] + }, + { + "label": "Коллекции", + "id": "collections", + "order": 1, + "children": [ + { + "label": "Коллекционирование с пояснениями", + "id": "manage-collections.md", + "order": 0, + "children": [] + }, + { + "label": "Создать коллекцию", + "id": "create-collection.md", + "order": 1, + "children": [] + }, + { + "label": "Создайте коллекцию мгновенно", + "id": "create-collection-instantly.md", + "order": 2, + "children": [] + }, + { + "label": "Просмотр коллекций", + "id": "view-collections.md", + "order": 3, + "children": [] + }, + { + "label": "Изменить коллекцию", + "id": "modify-collection.md", + "order": 4, + "children": [] + }, + { + "label": "Загрузка и освобождение", + "id": "load-and-release.md", + "order": 5, + "children": [] + }, + { + "label": "Управление разделами", + "id": "manage-partitions.md", + "order": 6, + "children": [] + }, + { + "label": "Управление псевдонимами", + "id": "manage-aliases.md", + "order": 7, + "children": [] + }, + { + "label": "Сбор капель", + "id": "drop-collection.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "Схема и поля данных", + "id": "schema", + "order": 2, + "children": [ + { + "label": "Объяснение схемы", + "id": "schema.md", + "order": 0, + "children": [] + }, + { + "label": "Основное поле и автоидентификатор", + "id": "primary-field.md", + "order": 1, + "children": [] + }, + { + "label": "Плотный вектор", + "id": "dense-vector.md", + "order": 2, + "children": [] + }, + { + "label": "Двоичный вектор", + "id": "binary-vector.md", + "order": 3, + "children": [] + }, + { + "label": "Разреженный вектор", + "id": "sparse_vector.md", + "order": 4, + "children": [] + }, + { + "label": "Строковое поле", + "id": "string.md", + "order": 5, + "children": [] + }, + { + "label": "Числовое поле", + "id": "number.md", + "order": 6, + "children": [] + }, + { + "label": "JSON-поле", + "id": "use-json-fields.md", + "order": 7, + "children": [] + }, + { + "label": "Поле массива", + "id": "array_data_type.md", + "order": 8, + "children": [] + }, + { + "label": "Динамическое поле", + "id": "enable-dynamic-field.md", + "order": 9, + "children": [] + }, + { + "label": "Нулевые и по умолчанию", + "id": "nullable-and-default.md", + "order": 10, + "children": [] + }, + { + "label": "Анализатор", + "id": "analyzer", + "order": 11, + "children": [ + { + "label": "Обзор анализатора", + "id": "analyzer-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Встроенные анализаторы", + "id": "built-in-analyzers", + "order": 1, + "children": [ + { + "label": "Стандарт", + "id": "standard-analyzer.md", + "order": 0, + "children": [] + }, + { + "label": "Английский язык", + "id": "english-analyzer.md", + "order": 1, + "children": [] + }, + { + "label": "Китайский", + "id": "chinese-analyzer.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Токенизаторы", + "id": "tokenizers", + "order": 2, + "children": [ + { + "label": "Стандарт", + "id": "standard-tokenizer.md", + "order": 0, + "children": [] + }, + { + "label": "Белое пространство", + "id": "whitespace-tokenizer.md", + "order": 1, + "children": [] + }, + { + "label": "Цзеба", + "id": "jieba-tokenizer.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Фильтры", + "id": "filters", + "order": 3, + "children": [ + { + "label": "Нижний регистр", + "id": "lowercase-filter.md", + "order": 0, + "children": [] + }, + { + "label": "Складывание ASCII", + "id": "ascii-folding-filter.md", + "order": 1, + "children": [] + }, + { + "label": "Alphanumonly", + "id": "alphanumonly-filter.md", + "order": 2, + "children": [] + }, + { + "label": "Cnalphanumonly", + "id": "cnalphanumonly-filter.md", + "order": 3, + "children": [] + }, + { + "label": "Cncharonly", + "id": "cncharonly-filter.md", + "order": 4, + "children": [] + }, + { + "label": "Длина", + "id": "length-filter.md", + "order": 5, + "children": [] + }, + { + "label": "Остановите", + "id": "stop-filter.md", + "order": 6, + "children": [] + }, + { + "label": "Декомпозер", + "id": "decompounder-filter.md", + "order": 7, + "children": [] + }, + { + "label": "Stemmer", + "id": "stemmer-filter.md", + "order": 8, + "children": [] + } + ] + } + ] + }, + { + "label": "Собственноручно", + "id": "schema-hands-on.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Вставка и удаление", + "id": "insert-and-delete", + "order": 3, + "children": [ + { + "label": "Вставить сущности", + "id": "insert-update-delete.md", + "order": 0, + "children": [] + }, + { + "label": "Сущности Upsert", + "id": "upsert-entities.md", + "order": 1, + "children": [] + }, + { + "label": "Удалить объекты", + "id": "delete-entities.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Индексы", + "id": "manage_indexes", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Векторные индексы", + "id": "index-vector-fields.md", + "order": 0, + "children": [] + }, + { + "label": "Скалярные индексы", + "id": "scalar-index", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Индексные скалярные поля", + "id": "index-scalar-fields.md", + "order": 1, + "children": [] + }, + { + "label": "Индекс растрового изображения", + "id": "bitmap.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Индексы с поддержкой GPU", + "id": "index-with-gpu.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Поиск и ранжирование", + "id": "search-rerank", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Базовый поиск ANN", + "id": "single-vector-search.md", + "order": 0, + "children": [] + }, + { + "label": "Фильтрованный поиск", + "id": "filtered-search.md", + "order": 1, + "children": [] + }, + { + "label": "Поиск диапазона", + "id": "range-search.md", + "order": 2, + "children": [] + }, + { + "label": "Группировка Поиск", + "id": "grouping-search.md", + "order": 3, + "children": [] + }, + { + "label": "Гибридный поиск", + "id": "multi-vector-search.md", + "order": 4, + "children": [] + }, + { + "label": "Запрос", + "id": "get-and-scalar-query.md", + "order": 5, + "children": [] + }, + { + "label": "Фильтрация", + "id": "filtering", + "order": 6, + "children": [ + { + "label": "Объяснение фильтрации", + "id": "boolean.md", + "order": 0, + "children": [] + }, + { + "label": "Основные операторы", + "id": "basic-operators.md", + "order": 1, + "children": [] + }, + { + "label": "Фильтрация шаблонов", + "id": "filtering-templating.md", + "order": 2, + "children": [] + }, + { + "label": "Операторы JSON", + "id": "json-operators.md", + "order": 3, + "children": [] + }, + { + "label": "Операторы массива", + "id": "array-operators.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Полнотекстовый поиск", + "id": "full-text-search.md", + "order": 7, + "children": [] + }, + { + "label": "Текстовое соответствие", + "id": "keyword-match.md", + "order": 8, + "children": [] + }, + { + "label": "Поисковые итераторы", + "id": "with-iterators.md", + "order": 9, + "children": [] + }, + { + "label": "Использование ключа раздела", + "id": "use-partition-key.md", + "order": 9, + "children": [] + }, + { + "label": "Рерайтинг", + "id": "reranking.md", + "order": 10, + "children": [] + } + ] + } + ] + }, + { + "label": "Модели", + "id": "models", + "isMenu": true, + "order": 4, + "children": [ + { + "label": "Встраивания", + "id": "embeddings", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "embeddings.md", + "order": 0, + "children": [] + }, + { + "label": "OpenAI", + "id": "embed-with-openai.md", + "order": 1, + "children": [] + }, + { + "label": "Трансформаторы приговоров", + "id": "embed-with-sentence-transform.md", + "order": 2, + "children": [] + }, + { + "label": "BGE M3", + "id": "embed-with-bgm-m3.md", + "order": 3, + "children": [] + }, + { + "label": "SPLADE", + "id": "embed-with-splade.md", + "order": 5, + "children": [] + }, + { + "label": "Вояж", + "id": "embed-with-voyage.md", + "order": 6, + "children": [] + }, + { + "label": "Джина А.И.", + "id": "embed-with-jina.md", + "order": 7, + "children": [] + }, + { + "label": "Cohere", + "id": "embed-with-cohere.md", + "order": 8, + "children": [] + }, + { + "label": "Инструктор", + "id": "embed-with-instructor.md", + "order": 9, + "children": [] + }, + { + "label": "Мистраль ИИ", + "id": "embed-with-mistral-ai.md", + "order": 10, + "children": [] + }, + { + "label": "Nomic", + "id": "embed-with-nomic.md", + "order": 11, + "children": [] + }, + { + "label": "mGTE", + "id": "embed-with-mgte.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "Реранкеры", + "id": "rerankers", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "rerankers-overview.md", + "order": 0, + "children": [] + }, + { + "label": "BGE", + "id": "rerankers-bge.md", + "order": 1, + "children": [] + }, + { + "label": "Cohere", + "id": "rerankers-cohere.md", + "order": 2, + "children": [] + }, + { + "label": "Кросс-кодер", + "id": "rerankers-cross-encoder.md", + "order": 3, + "children": [] + }, + { + "label": "Вояж", + "id": "rerankers-voyage.md", + "order": 4, + "children": [] + }, + { + "label": "Джина А.И.", + "id": "rerankers-jina.md", + "order": 5, + "children": [] + } + ] + } + ] + }, + { + "label": "Импорт данных", + "id": "data_import", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Подготовка исходных данных", + "id": "prepare-source-data.md", + "order": 0, + "children": [] + }, + { + "label": "Импорт данных", + "id": "import-data.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Миграция Мильвуса", + "id": "milvus_migration", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "Обзор", + "id": "migrate_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Установите инструмент миграции", + "id": "milvusdm_install.md", + "order": 1, + "children": [] + }, + { + "label": "Из Elasticsearch", + "id": "es2m.md", + "order": 2, + "children": [] + }, + { + "label": "От Фейса", + "id": "f2m.md", + "order": 3, + "children": [] + }, + { + "label": "Из Milvus 1.x", + "id": "m2m.md", + "order": 4, + "children": [] + }, + { + "label": "Из Milvus 2.3.x", + "id": "from-m2x.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Руководство по администрированию", + "id": "admin_guide", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "Развертывание", + "id": "deployment", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "В помещениях", + "id": "on_premises", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "С помощью Docker", + "id": "configure-docker.md", + "order": 0, + "children": [] + }, + { + "label": "С рулем", + "id": "configure-helm.md", + "order": 1, + "children": [] + }, + { + "label": "С оператором Милвусом", + "id": "configure_operator.md", + "order": 2, + "children": [] + }, + { + "label": "Распределить ресурсы", + "id": "allocate.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "На облаках", + "id": "on_cloud", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Развертывание на AWS", + "id": "eks.md", + "order": 1, + "children": [] + }, + { + "label": "Развертывание на GCP", + "id": "gcp.md", + "order": 2, + "children": [] + }, + { + "label": "Развертывание в Azure", + "id": "azure.md", + "order": 3, + "children": [] + }, + { + "label": "Развертывание на OpenShift", + "id": "openshift.md", + "order": 4, + "children": [] + }, + { + "label": "Балансировка нагрузки на уровне 7", + "id": "layer-7-lb", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "aws_layer7.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcp_layer7.md", + "order": 2, + "children": [] + }, + { + "label": "Лазурь", + "id": "ingress.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Облачное хранилище", + "id": "cloud-storage", + "order": 6, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "s3.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcs.md", + "order": 2, + "children": [] + }, + { + "label": "Лазурь", + "id": "abs.md", + "order": 3, + "children": [] + } + ] + } + ] + } + ] + }, + { + "label": "Конфигурация", + "id": "configuration", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Конфигурации системы", + "id": "system_configuration.md", + "order": 0, + "children": [] + }, + { + "label": "На лету", + "id": "dynamic_config.md", + "order": 1, + "children": [] + }, + { + "label": "Предельные показатели сбора", + "id": "limit_collection_counts.md", + "order": 2, + "children": [] + }, + { + "label": "Настройка кэша чанков", + "id": "chunk_cache.md", + "order": 3, + "children": [] + }, + { + "label": "Координатор HA", + "id": "coordinator_ha.md", + "order": 4, + "children": [] + }, + { + "label": "QueryNode с использованием локального диска", + "id": "configure-querynode-localdisk.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "Управление зависимостями", + "id": "manage_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "С помощью Docker или Helm", + "id": "docker_helm_dependencies", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Объектное хранилище", + "id": "deploy_s3.md", + "order": 0, + "children": [] + }, + { + "label": "Мета-хранилище", + "id": "deploy_etcd.md", + "order": 1, + "children": [] + }, + { + "label": "Хранение сообщений", + "id": "deploy_pulsar.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "С оператором Милвусом", + "id": "milvus_operator_dependencies", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Объектное хранилище", + "id": "object_storage_operator.md", + "order": 0, + "children": [] + }, + { + "label": "Мета-хранилище", + "id": "meta_storage_operator.md", + "order": 1, + "children": [] + }, + { + "label": "Хранение сообщений", + "id": "message_storage_operator.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Используйте Pulsa с Milvus", + "id": "pulsar_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Обновление до Pulsar v3", + "id": "upgrade-pulsar-v3.md", + "order": 0, + "children": [] + }, + { + "label": "Продолжайте использовать Pulsar v2", + "id": "use-pulsar-v2.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "Масштабирование", + "id": "scaling", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Масштабный кластер", + "id": "scaleout.md", + "order": 0, + "children": [] + }, + { + "label": "Зависимости от масштаба", + "id": "scale-dependencies.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Обновление", + "id": "upgrade_milvus", + "order": 7, + "children": [ + { + "label": "Обновление кластера Milvus", + "id": "upgrade_milvus_cluster-operator.md", + "order": 0, + "children": [] + }, + { + "label": "Обновление Milvus Standalone", + "id": "upgrade_milvus_standalone-operator.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Мониторинг, оповещения и журналы", + "id": "monitor_alert_log", + "order": 8, + "isMenu": true, + "children": [ + { + "label": "Мониторинг", + "id": "monitoring", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "Архитектура", + "id": "monitor_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Развертывание служб мониторинга", + "id": "monitor.md", + "order": 1, + "children": [] + }, + { + "label": "Визуализация показателей", + "id": "visualize.md", + "order": 2, + "children": [] + }, + { + "label": "Приборная панель показателей Milvus", + "id": "metrics_dashboard.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Оповещения", + "id": "alerts", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "Создать оповещение", + "id": "alert.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Журналы", + "id": "logs", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "Настройка Grafana Loki", + "id": "configure_grafana_loki.md", + "order": 0, + "children": [] + }, + { + "label": "Настройка журналов доступа", + "id": "configure_access_logs.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "След", + "id": "trace", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Розыск егерей", + "id": "config_jaeger_tracing.md", + "order": 0, + "children": [] + } + ] + } + ] + }, + { + "label": "Ресурсные группы", + "id": "resource_groups", + "order": 9, + "children": [ + { + "label": "Управление группами ресурсов", + "id": "resource_group.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Оптимизация хранения", + "id": "storage_optimization", + "order": 10, + "isMenu": true, + "children": [ + { + "label": "Используйте mmap", + "id": "mmap.md", + "order": 0, + "children": [] + }, + { + "label": "Уплотнение кластеров", + "id": "clustering-compaction.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Безопасность", + "id": "security", + "order": 11, + "isMenu": true, + "children": [ + { + "label": "Включить аутентификацию", + "id": "authenticate.md", + "order": 0, + "children": [] + }, + { + "label": "Пользователи, привилегии и роли", + "id": "users_and_roles.md", + "order": 10, + "children": [] + }, + { + "label": "Включить RBAC", + "id": "rbac.md", + "order": 1, + "isMenu": true, + "children": [] + }, + { + "label": "Шифрование в пути", + "id": "tls.md", + "order": 2, + "children": [] + }, + { + "label": "Подключение к Kafka с помощью SASL/SSL", + "id": "connect_kafka_ssl.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus WebUI", + "id": "milvus-webui.md", + "order": "12", + "children": [] + } + ] + }, + { + "label": "Инструменты", + "id": "tools", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "Атту (графический интерфейс Milvus)", + "id": "milvus_attu", + "order": 0, + "externalLink": "https://github.com/zilliztech/attu", + "children": [] + }, + { + "label": "Резервное копирование Milvus", + "id": "milvus_backup", + "order": 1, + "children": [ + { + "label": "Обзор", + "id": "milvus_backup_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Команды", + "id": "milvus_backup_cli.md", + "order": 1, + "children": [] + }, + { + "label": "RESTful API", + "id": "milvus_backup_api.md", + "order": 2, + "children": [] + }, + { + "label": "Распространенные случаи", + "id": "common-cases", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Миграция между экземплярами в одном ведре", + "id": "shared-bucket-backup-and-restore.md", + "order": 0, + "children": [] + }, + { + "label": "Миграция между экземплярами и ведрами", + "id": "cross-bucket-backup-and-restore.md", + "order": 1, + "children": [] + }, + { + "label": "Миграция между экземплярами в средах S3", + "id": "multi-storage-backup-and-restore.md", + "order": 2, + "children": [] + }, + { + "label": "Резервное копирование и восстановление в одном экземпляре", + "id": "single-instance-backup-and-restore.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "Птицелов", + "id": "birdwatcher", + "order": 2, + "children": [ + { + "label": "Обзор", + "id": "birdwatcher_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Руководства по установке", + "id": "birdwatcher_install_guides.md", + "order": 1, + "children": [] + }, + { + "label": "Руководства по использованию", + "id": "birdwatcher_usage_guides.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "ЦКЗ Милвус", + "id": "milvus_cdc", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "milvus-cdc-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Развертывание сервера CDC", + "id": "deploy-cdc-server.md", + "order": 1, + "children": [] + }, + { + "label": "Управление задачами CDC", + "id": "manage-cdc-tasks.md", + "order": 2, + "children": [] + }, + { + "label": "Мониторинг", + "id": "cdc-monitoring.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus CLI", + "id": "cli", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "Обзор", + "id": "cli_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Установка", + "id": "install_cli.md", + "order": 1, + "children": [] + }, + { + "label": "Команды", + "id": "cli_commands.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Разъемы Milvus", + "id": "milvus_connectors", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "Искра", + "id": "integrate_with_spark.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Инструмент для определения размеров Milvus", + "id": "sizing", + "order": 6, + "externalLink": "https://milvus.io/tools/sizing/", + "children": [] + }, + { + "label": "Клиент Powershell Milvus", + "id": "milvus_powershell", + "order": 8, + "externalLink": "https://github.com/rrg92/ps-milvus/blob/main/docs/integrate_powershell.md", + "children": [] + } + ] + }, + { + "label": "Интеграции", + "id": "integrations", + "isMenu": true, + "order": 8, + "children": [ + { + "label": "Обзор", + "id": "integrations_overview.md", + "order": 0, + "children": [] + }, + { + "label": "Модели встраивания", + "id": "integrate-embeddings-models", + "order": 1, + "children": [ + { + "label": "OpenAI", + "id": "integrate_with_openai.md", + "order": 0, + "children": [] + }, + { + "label": "Cohere", + "id": "integrate_with_cohere.md", + "order": 1, + "children": [] + }, + { + "label": "HuggingFace", + "id": "integrate_with_hugging-face.md", + "order": 2, + "children": [] + }, + { + "label": "PyTorch", + "id": "integrate_with_pytorch.md", + "order": 3, + "children": [] + }, + { + "label": "ПриговорТрансформеры", + "id": "integrate_with_sentencetransformers.md", + "order": 4, + "children": [] + }, + { + "label": "VoyageAI", + "id": "integrate_with_voyageai.md", + "order": 8, + "children": [] + }, + { + "label": "Джина А.И.", + "id": "integrate_with_jina.md", + "order": 11, + "children": [] + }, + { + "label": "Двенадцать лабораторий", + "id": "video_search_with_twelvelabs_and_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "BentoML", + "id": "integrate_with_bentoml.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "LLMs", + "id": "integrate-llms", + "order": 2, + "children": [ + { + "label": "vLLM", + "id": "milvus_rag_with_vllm.md", + "order": 0, + "children": [] + }, + { + "label": "Мистраль ИИ", + "id": "llama_agents_metadata.md", + "order": 1, + "children": [] + }, + { + "label": "Фейерверк", + "id": "build_RAG_with_milvus_and_fireworks.md", + "order": 2, + "children": [] + }, + { + "label": "Лептон", + "id": "build_RAG_with_milvus_and_lepton.md", + "order": 3, + "children": [] + }, + { + "label": "SiliconFlow", + "id": "build_RAG_with_milvus_and_siliconflow.md", + "order": 4, + "children": [] + }, + { + "label": "SambaNova", + "id": "use_milvus_with_sambanova.md", + "order": 5, + "children": [] + }, + { + "label": "Близнецы", + "id": "build_RAG_with_milvus_and_gemini.md", + "order": 6, + "children": [] + }, + { + "label": "Оллама", + "id": "build_RAG_with_milvus_and_ollama.md", + "order": 7, + "children": [] + }, + { + "label": "DeepSeek", + "id": "build_RAG_with_milvus_and_deepseek.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "Оркестровка", + "id": "orchestrate-with-milvus", + "order": 3, + "children": [ + { + "label": "LangChain", + "id": "langchain", + "order": 0, + "children": [ + { + "label": "Базовое использование", + "id": "basic_usage_langchain.md", + "order": 1, + "children": [] + }, + { + "label": "RAG", + "id": "integrate_with_langchain.md", + "order": 2, + "children": [] + }, + { + "label": "Гибридный поиск", + "id": "milvus_hybrid_search_retriever.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "LlamaIndex", + "id": "llamaindex", + "order": 1, + "children": [ + { + "label": "RAG", + "id": "integrate_with_llamaindex.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "DSPy", + "id": "integrate_with_dspy.md", + "order": 2, + "children": [] + }, + { + "label": "FastGPT", + "id": "integrate_with_fastgpt.md", + "order": 3, + "children": [] + }, + { + "label": "HayStack", + "id": "integrate_with_haystack.md", + "order": 4, + "children": [] + }, + { + "label": "Котаэмон", + "id": "kotaemon_with_milvus.md", + "order": 5, + "children": [] + }, + { + "label": "Dify", + "id": "dify_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "Langflow", + "id": "rag_with_langflow.md", + "order": 7, + "children": [] + }, + { + "label": "DocsGPT", + "id": "use_milvus_in_docsgpt.md", + "order": 9, + "children": [] + }, + { + "label": "PrivateGPT", + "id": "use_milvus_in_private_gpt.md", + "order": 10, + "children": [] + }, + { + "label": "Dynamiq", + "id": "milvus_rag_with_dynamiq.md", + "order": 11, + "children": [] + } + ] + }, + { + "label": "Агенты", + "id": "integrate-agents", + "order": 4, + "children": [ + { + "label": "MemGPT", + "id": "integrate_with_memgpt.md", + "order": 0, + "children": [] + }, + { + "label": "Верблюд", + "id": "integrate_with_camel.md", + "order": 1, + "children": [] + }, + { + "label": "Mem0", + "id": "quickstart_mem0_with_milvus.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Инженерия знаний", + "id": "knowledge-engineering", + "order": 5, + "children": [ + { + "label": "ПочемуКак", + "id": "integrate_with_whyhow.md", + "order": 0, + "children": [] + }, + { + "label": "Ванна", + "id": "integrate_with_vanna.md", + "order": 1, + "children": [] + }, + { + "label": "Таблица знаний", + "id": "knowledge_table_with_milvus.md", + "order": 2, + "children": [] + }, + { + "label": "Cognee", + "id": "build_RAG_with_milvus_and_cognee.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Оценка и наблюдаемость", + "id": "evaluation-observability", + "order": 6, + "children": [ + { + "label": "Рагас", + "id": "integrate_with_ragas.md", + "order": 0, + "children": [] + }, + { + "label": "LangFuse", + "id": "integrate_with_langfuse.md", + "order": 1, + "children": [] + }, + { + "label": "FiftyOne", + "id": "integrate_with_voxel51.md", + "order": 2, + "children": [] + }, + { + "label": "Ариза Феоникс", + "id": "evaluation_with_phoenix.md", + "order": 3, + "children": [] + }, + { + "label": "DeepEval", + "id": "evaluation_with_deepeval.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Источники данных", + "id": "data-sources", + "order": 7, + "children": [ + { + "label": "Airbyte", + "id": "integrate_with_airbyte.md", + "order": 0, + "children": [] + }, + { + "label": "Кафка", + "id": "kafka-connect-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "Apify", + "id": "apify_milvus_rag.md", + "order": 2, + "children": [] + }, + { + "label": "Неструктурированные", + "id": "rag_with_milvus_and_unstructured.md", + "order": 3, + "children": [] + }, + { + "label": "PII Masker", + "id": "RAG_with_pii_and_milvus.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "Другие", + "id": "other-integrations", + "order": 8, + "children": [ + { + "label": "Снежинка", + "id": "integrate_with_snowpark.md", + "order": 0, + "children": [] + }, + { + "label": "Рука", + "id": "build_rag_on_arm.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "Учебники", + "id": "tutorials", + "isMenu": true, + "order": 7, + "children": [ + { + "label": "Обзор", + "id": "tutorials-overview.md", + "order": 0, + "children": [] + }, + { + "label": "Создайте RAG с помощью Milvus", + "id": "build-rag-with-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "Продвинутый RAG", + "id": "how_to_enhance_your_rag.md", + "order": 2, + "children": [] + }, + { + "label": "Полнотекстовый поиск с помощью Milvus", + "id": "full_text_search_with_milvus.md", + "order": 3, + "children": [] + }, + { + "label": "Гибридный поиск с Milvus", + "id": "hybrid_search_with_milvus.md", + "order": 4, + "children": [] + }, + { + "label": "Поиск изображений с помощью Milvus", + "id": "image_similarity_search.md", + "order": 5, + "children": [] + }, + { + "label": "Мультимодальный RAG", + "id": "multimodal_rag_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "График RAG с помощью Milvus", + "id": "graph_rag_with_milvus.md", + "order": 7, + "children": [] + }, + { + "label": "Контекстный поиск", + "id": "contextual_retrieval_with_milvus.md", + "order": 8, + "children": [] + }, + { + "label": "Кластеризация HDBSCAN", + "id": "hdbscan_clustering_with_milvus.md", + "order": 9, + "children": [] + }, + { + "label": "Используйте ColPali для мультимодального поиска", + "id": "use_ColPali_with_milvus.md", + "order": 10, + "children": [] + }, + { + "label": "Векторная визуализация", + "id": "vector_visualization.md", + "order": 11, + "children": [] + }, + { + "label": "Рекомендация к просмотру фильма", + "id": "movie_recommendation_with_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "Поиск воронки с помощью вкраплений \"Матрешки", + "id": "funnel_search_with_matryoshka.md", + "order": 13, + "children": [] + }, + { + "label": "Быстрый старт с Attu", + "id": "quickstart_with_attu.md", + "order": 14, + "children": [] + }, + { + "label": "Использование AsyncMilvusClient с asyncio", + "id": "use-async-milvus-client-with-asyncio.md", + "order": 15, + "children": [] + }, + { + "label": "Подробнее", + "id": "explore-more", + "order": 99, + "children": [ + { + "label": "Система ответов на вопросы", + "id": "question_answering_system.md", + "order": 5, + "children": [] + }, + { + "label": "Рекомендательная система", + "id": "recommendation_system.md", + "order": 6, + "children": [] + }, + { + "label": "Поиск сходства видео", + "id": "video_similarity_search.md", + "order": 7, + "children": [] + }, + { + "label": "Поиск сходства аудиофайлов", + "id": "audio_similarity_search.md", + "order": 8, + "children": [] + }, + { + "label": "Классификация последовательностей ДНК", + "id": "dna_sequence_classification.md", + "order": 9, + "children": [] + }, + { + "label": "Система поиска текста", + "id": "text_search_engine.md", + "order": 10, + "children": [] + }, + { + "label": "Поисковая система для преобразования текста в изображения", + "id": "text_image_search.md", + "order": 11, + "children": [] + }, + { + "label": "Система дедупликации изображений", + "id": "image_deduplication_system.md", + "order": 12, + "children": [] + } + ] + } + ] + }, + { + "label": "Вопросы и ответы", + "id": "faq", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "Вопросы и ответы о производительности", + "id": "performance_faq.md", + "order": 0, + "children": [] + }, + { + "label": "Вопросы и ответы о продукции", + "id": "product_faq.md", + "order": 1, + "children": [] + }, + { + "label": "Вопросы и ответы по эксплуатации", + "id": "operational_faq.md", + "order": 2, + "children": [] + }, + { + "label": "Пределы Милвуса", + "id": "limitations.md", + "order": 3, + "children": [] + }, + { + "label": "Устранение неполадок", + "id": "troubleshooting.md", + "order": 4, + "children": [] + } + ] + } +] \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/es2m.json b/localization/v2.5.x/site/ru/migrate/es2m.json new file mode 100644 index 000000000..4edcae3ae --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/es2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n workMode: \"elasticsearch\" # operational mode of the migration job.\n reader:\n bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.\nmeta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.\n mode: \"config\" # specifies the source for meta configs. currently, onlly `config` is supported.\n version: \"8.9.1\"\n index: \"qatest_index\" # identifies the Elasticsearch index to migrate data from.\n fields: # fields within the Elasticsearch index to be migrated.\n - name: \"my_vector\" # name of the Elasticsearch field.\n type: \"dense_vector\" # data type of the Elasticsearch field.\n dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.\n - name: \"id\"\n pk: true # specifies if the field serves as a primary key.\n type: \"long\"\n - name: \"num\"\n type: \"integer\"\n - name: \"double1\"\n type: \"double\"\n - name: \"text1\"\n maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.\n type: \"text\"\n - name: \"bl1\"\n type: \"boolean\"\n - name: \"float1\"\n type: \"float\"\n milvus: # configs specific to creating the collection in Milvus 2.x\n collection: \"Collection_01\" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.\n closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.\n shardNum: 2 # number of shards to be created in the collection.\n consistencyLevel: Strong # consistency level for Milvus collection.\nsource: # connection configs for the source Elasticsearch server\n es:\n urls:\n - \"http://10.15.1.***:9200\" # address of the source Elasticsearch server.\n username: \"\" # username for the Elasticsearch server.\n password: \"\" # password for the Elasticsearch server.\ntarget:\n mode: \"remote\" # storage location for dumped files. valid values: `remote` and `local`.\n remote: # configs for remote storage\n outputDir: \"migration/milvus/test\" # output directory path in the cloud storage bucket.\n cloud: \"aws\" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.\n region: \"us-west-2\" # region of the cloud storage; can be any value if using local Minio.\n bucket: \"zilliz-aws-us-****-*-********\" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.\n useIAM: true # whether to use an IAM Role for connection.\n checkBucket: false # checks if the specified bucket exists in the storage.\n milvus2x: # connection configs for the target Milvus 2.x server\n endpoint: \"http://10.102.*.**:19530\" # address of the target Milvus server.\n username: \"****\" # username for the Milvus 2.x server.\n password: \"******\" # password for the Milvus 2.x server.\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[task/load_base_task.go:94] [\"[LoadTasker] Dec Task Processing-------------->\"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[task/load_base_task.go:76] [\"[LoadTasker] Progress Task --------------->\"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[dbclient/cus_field_milvus2x.go:86] [\"[Milvus2x] begin to ShowCollectionRows\"]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static: \"] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static Total\"] [\"Total Collections\"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]\n[migration/es_starter.go:25] [\"[Starter] migration ES to Milvus finish!!!\"] [Cost=80.009174459]\n[starter/starter.go:106] [\"[Starter] Migration Success!\"] [Cost=80.00928425]\n[cleaner/remote_cleaner.go:27] [\"[Remote Cleaner] Begin to clean files\"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]\n[cmd/start.go:32] [\"[Cleaner] clean file success!\"]\n"],"headingContent":"From Elasticsearch","anchorList":[{"label":"Из Elasticsearch","href":"From-Elasticsearch","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка файла миграции","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Запуск задачи миграции","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Проверка результата","href":"Verify-the-result","type":2,"isActive":false},{"label":"Справочник по сопоставлению полей","href":"Field-mapping-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/es2m.md b/localization/v2.5.x/site/ru/migrate/es2m.md new file mode 100644 index 000000000..acea74847 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/es2m.md @@ -0,0 +1,267 @@ +--- +id: es2m.md +summary: >- + В этом руководстве представлен полный пошаговый процесс переноса данных из + Elasticsearch в Milvus 2.x. +title: Из Elasticsearch +--- +

    Из Elasticsearch

    В этом руководстве представлен полный пошаговый процесс переноса данных из Elasticsearch в Milvus 2.x. Следуя этому руководству, вы сможете эффективно перенести свои данные, используя расширенные возможности Milvus 2.x и улучшенную производительность.

    +

    Необходимые условия

      +
    • Версии программного обеспечения:
    • +
    • Необходимые инструменты:
    • +
    • Поддерживаемые типы данных для миграции: Поля для миграции из исходного индекса Elasticsearch относятся к следующим типам - dense_vector, keyword, text, long, integer, double, float, boolean, object. Типы данных, не перечисленные здесь, в настоящее время не поддерживаются для миграции. Подробную информацию о сопоставлении данных между коллекциями Milvus и индексами Elasticsearch см. в справочнике "Сопоставление полей".
    • +
    • Требования к индексу Elasticsearch:
        +
      • Исходный индекс Elasticsearch должен содержать векторное поле типа dense_vector. Миграция не может начаться без векторного поля.
      • +
    • +
    +

    Настройка файла миграции

    Сохраните пример файла конфигурации миграции под именем migration.yaml и измените конфигурацию в соответствии с вашими реальными условиями. Вы можете поместить файл конфигурации в любой локальный каталог.

    +
    dumper: # configs for the migration job.
    +  worker:
    +    workMode: "elasticsearch" # operational mode of the migration job.
    +    reader:
    +      bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.
    +meta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.
    +  mode: "config" # specifies the source for meta configs. currently, onlly `config` is supported.
    +  version: "8.9.1"
    +  index: "qatest_index" # identifies the Elasticsearch index to migrate data from.
    +  fields: # fields within the Elasticsearch index to be migrated.
    +  - name: "my_vector" # name of the Elasticsearch field.
    +    type: "dense_vector" # data type of the Elasticsearch field.
    +    dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.
    +  - name: "id"
    +    pk: true # specifies if the field serves as a primary key.
    +    type: "long"
    +  - name: "num"
    +    type: "integer"
    +  - name: "double1"
    +    type: "double"
    +  - name: "text1"
    +    maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.
    +    type: "text"
    +  - name: "bl1"
    +    type: "boolean"
    +  - name: "float1"
    +    type: "float"
    +  milvus: # configs specific to creating the collection in Milvus 2.x
    +    collection: "Collection_01" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.
    +    closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.
    +    shardNum: 2 # number of shards to be created in the collection.
    +    consistencyLevel: Strong # consistency level for Milvus collection.
    +source: # connection configs for the source Elasticsearch server
    +  es:
    +    urls:
    +    - "http://10.15.1.***:9200" # address of the source Elasticsearch server.
    +    username: "" # username for the Elasticsearch server.
    +    password: "" # password for the Elasticsearch server.
    +target:
    +  mode: "remote" # storage location for dumped files. valid values: `remote` and `local`.
    +  remote: # configs for remote storage
    +    outputDir: "migration/milvus/test" # output directory path in the cloud storage bucket.
    +    cloud: "aws" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.
    +    region: "us-west-2" # region of the cloud storage; can be any value if using local Minio.
    +    bucket: "zilliz-aws-us-****-*-********" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.
    +    useIAM: true # whether to use an IAM Role for connection.
    +    checkBucket: false # checks if the specified bucket exists in the storage.
    +  milvus2x: # connection configs for the target Milvus 2.x server
    +    endpoint: "http://10.102.*.**:19530" # address of the target Milvus server.
    +    username: "****" # username for the Milvus 2.x server.
    +    password: "******" # password for the Milvus 2.x server.
    +
    +

    В следующей таблице описаны параметры в файле конфигурации примера. Полный список конфигураций см. в разделе Миграция Milvus: Elasticsearch на Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + +
      ПараметрОписание
      dumper.worker.workModeРежим работы задания миграции. Установите значение elasticsearch при миграции из индексов Elasticsearch.
      dumper.worker.reader.bufferSizeРазмер буфера для чтения из Elasticsearch в каждом пакете. Единица измерения: КБ.
      +
    • +
    • meta

      + + + + + + + + + + + + + + + + + + + +
      ПараметрОписание
      meta.modeУказывает источник метаконфигураций. В настоящее время поддерживается только config.
      meta.indexОпределяет индекс Elasticsearch для переноса данных.
      meta.fieldsПоля в индексе Elasticsearch, которые необходимо перенести.
      meta.fields.nameИмя поля Elasticsearch.
      meta.fields.maxLenМаксимальная длина поля. Этот параметр требуется только в том случае, если meta.fields.type - это keyword или text.
      meta.fields.pkУказывает, служит ли поле первичным ключом.
      meta.fields.typeТип данных поля Elasticsearch. В настоящее время в Elasticsearch поддерживаются следующие типы данных: dense_vector, keyword, text, long, integer, double, float, boolean, object.
      meta.fields.dimsРазмерность векторного поля. Этот параметр требуется только в том случае, если meta.fields.type - dense_vector.
      meta.milvusКонфиги, специфичные для создания коллекции в Milvus 2.x.
      meta.milvus.collectionИмя коллекции Milvus. По умолчанию используется имя индекса Elasticsearch, если оно не указано.
      meta.milvus.closeDynamicFieldУказывает, следует ли отключить динамическое поле в коллекции. По умолчанию false. Дополнительные сведения о динамических полях см. в разделе Включить динамическое поле.
      meta.milvus.shardNumКоличество шардов, которые будут созданы в коллекции. Дополнительные сведения об осколках см. в разделе Терминология.
      meta.milvus.consistencyLevelУровень согласованности для коллекции в Milvus. Дополнительные сведения см. в разделе Согласованность.
      +
    • +
    • source

      + + + + + + + + + + +
      ПараметрОписание
      source.esКонфигурация подключения для исходного сервера Elasticsearch.
      source.es.urlsАдрес исходного сервера Elasticsearch.
      source.es.usernameИмя пользователя для сервера Elasticsearch.
      source.es.passwordПароль для сервера Elasticsearch.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + +
      ПараметрОписание
      target.modeМесто хранения файлов дампа. Допустимые значения:
      - local: Хранить файлы дампа на локальных дисках.
      - remote: Хранить файлы дампа в объектном хранилище.
      target.remote.outputDirПуть к выходному каталогу в облачном хранилище.
      target.remote.cloudПоставщик услуг облачного хранилища. Примерные значения: aws, gcp, azure.
      target.remote.regionРегион облачного хранилища. Может иметь любое значение, если вы используете локальное MinIO.
      target.remote.bucketИмя ведра для хранения данных. Значение должно совпадать с конфигом в Milvus 2.x. Дополнительные сведения см. в разделе Конфигурации системы.
      target.remote.useIAMИспользовать ли IAM-роль для подключения.
      target.remote.checkBucketПроверять, существует ли указанный бакет в объектном хранилище.
      target.milvus2xКонфигурация подключения для целевого сервера Milvus 2.x.
      target.milvus2x.endpointАдрес целевого сервера Milvus.
      target.milvus2x.usernameИмя пользователя для сервера Milvus 2.x. Этот параметр необходим, если на сервере Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включение аутентификации.
      target.milvus2x.passwordПароль для сервера Milvus 2.x. Этот параметр необходим, если для сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включить аутентификацию.
      +
    • +
    +

    Запуск задачи миграции

    Запустите задачу миграции с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    Ниже приведен пример успешного вывода журнала миграции:

    +
    [task/load_base_task.go:94] ["[LoadTasker] Dec Task Processing-------------->"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[task/load_base_task.go:76] ["[LoadTasker] Progress Task --------------->"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[dbclient/cus_field_milvus2x.go:86] ["[Milvus2x] begin to ShowCollectionRows"]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static: "] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static Total"] ["Total Collections"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]
    +[migration/es_starter.go:25] ["[Starter] migration ES to Milvus finish!!!"] [Cost=80.009174459]
    +[starter/starter.go:106] ["[Starter] Migration Success!"] [Cost=80.00928425]
    +[cleaner/remote_cleaner.go:27] ["[Remote Cleaner] Begin to clean files"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]
    +[cmd/start.go:32] ["[Cleaner] clean file success!"]
    +
    +

    Проверка результата

    После выполнения задачи миграции вы можете выполнять вызовы API или использовать Attu для просмотра количества перенесенных сущностей. Дополнительную информацию см. в разделе Attu и get_collection_stats().

    +

    Справочник по сопоставлению полей

    Ознакомьтесь с приведенной ниже таблицей, чтобы понять, как типы полей в индексах Elasticsearch сопоставляются с типами полей в коллекциях Milvus.

    +

    Дополнительные сведения о поддерживаемых типах данных в Milvus см. в разделе Поддерживаемые типы данных.

    + + + + + + + + + + + + + + + +
    Тип поля ElasticsearchТип поля MilvusОписание
    плотный_векторFloatVectorРазмеры вектора остаются неизменными при миграции.
    ключевое словоVarCharУстанавливает максимальную длину (от 1 до 65 535). Строки, превышающие этот предел, могут вызвать ошибки миграции.
    текстVarCharУстановите максимальную длину (от 1 до 65 535). Строки, превышающие лимит, могут вызвать ошибки миграции.
    longInt64-
    целое числоInt32-
    двойноеDouble-
    floatFloat-
    booleanBool-
    объектJSON-
    diff --git a/localization/v2.5.x/site/ru/migrate/f2m.json b/localization/v2.5.x/site/ru/migrate/f2m.json new file mode 100644 index 000000000..69ed66cde --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/f2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n limit: 2\n workMode: faiss # operational mode of the migration job.\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 2\nsource: # configs for the source Faiss index.\n mode: local\n local:\n faissFile: ./testfiles/faiss/faiss_ivf_flat.index\n\ntarget: # configs for the target Milvus collection.\n create:\n collection:\n name: test1w\n shardsNums: 2\n dim: 256\n metricType: L2\n\n mode: remote\n remote:\n outputDir: testfiles/output/\n cloud: aws\n endpoint: 0.0.0.0:9000\n region: ap-southeast-1\n bucket: a-bucket\n ak: minioadmin\n sk: minioadmin\n useIAM: false\n useSSL: false\n checkBucket: true\n milvus2x:\n endpoint: localhost:19530\n username: xxxxx\n password: xxxxx\n\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Faiss","anchorList":[{"label":"Из Faiss","href":"From-Faiss","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка миграции","href":"Configure-the-migration","type":2,"isActive":false},{"label":"Запуск задачи миграции","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Проверьте результат","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/f2m.md b/localization/v2.5.x/site/ru/migrate/f2m.md new file mode 100644 index 000000000..573b39ee2 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/f2m.md @@ -0,0 +1,209 @@ +--- +id: f2m.md +title: Из Faiss +related_key: 'Faiss, migrate, import' +summary: 'Узнайте, как перенести данные Faiss в Milvus.' +--- +

    Из Faiss

    В этом руководстве представлен полный пошаговый процесс переноса данных из Faiss в Milvus 2.x. Следуя этому руководству, вы сможете эффективно перенести свои данные, используя расширенные возможности Milvus 2.x и улучшенную производительность.

    +

    Необходимые условия

    +

    Настройка миграции

    Сохраните пример файла конфигурации миграции как migration.yaml и измените конфигурацию в соответствии с вашими реальными условиями. Вы можете поместить файл конфигурации в любой локальный каталог.

    +
    dumper: # configs for the migration job.
    +  worker:
    +    limit: 2
    +    workMode: faiss    # operational mode of the migration job.
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 2
    +source: # configs for the source Faiss index.
    +  mode: local
    +  local:
    +    faissFile: ./testfiles/faiss/faiss_ivf_flat.index
    +
    +target: # configs for the target Milvus collection.
    +  create:
    +    collection:
    +      name: test1w
    +      shardsNums: 2
    +      dim: 256
    +      metricType: L2
    +
    +  mode: remote
    +  remote:
    +    outputDir: testfiles/output/
    +    cloud: aws
    +    endpoint: 0.0.0.0:9000
    +    region: ap-southeast-1
    +    bucket: a-bucket
    +    ak: minioadmin
    +    sk: minioadmin
    +    useIAM: false
    +    useSSL: false
    +    checkBucket: true
    +  milvus2x:
    +    endpoint: localhost:19530
    +    username: xxxxx
    +    password: xxxxx
    +
    +
    +

    В следующей таблице описаны параметры в файле конфигурации примера. Полный список конфигураций см. в разделе Миграция Milvus: Faiss на Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      ПараметрОписание
      dumper.worker.limitПараметр параллельности потоков дампера.
      dumper.worker.workModeРежим работы задания миграции. Установите значение faiss при миграции из индексов Faiss.
      dumper.worker.reader.bufferSizeРазмер буфера для чтения из Faiss в каждом пакете. Единица измерения: КБ.
      dumper.worker.writer.bufferSizeРазмер буфера для записи в Milvus в каждом пакете. Единицы измерения: КБ.
      +
    • +
    • loader

      + + + + + + + +
      ПараметрОписание
      loader.worker.limitПараметр параллельности потоков загрузчика.
      +
    • +
    • source

      + + + + + + + + +
      ПараметрОписание
      source.modeУказывает, откуда считываются исходные файлы. Допустимые значения:
      - local: считывает файлы с локального диска.
      - remote: считывает файлы с удаленного хранилища.
      source.local.faissFileПуть к каталогу, в котором находятся исходные файлы. Например, /db/faiss.index.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + + + + + + + +
      ПараметрОписание
      target.create.collection.nameИмя коллекции Milvus.
      target.create.collection.shardsNumsКоличество шардов, которые будут созданы в коллекции. Дополнительные сведения об осколках см. в разделе Терминология.
      target.create.collection.dimРазмерность векторного поля.
      target.create.collection.metricTypeТип метрики, используемый для измерения сходства между векторами. Дополнительные сведения см. в разделе Терминология.
      target.modeМесто хранения файлов дампа. Допустимые значения:
      - local: хранить файлы дампа на локальных дисках.
      - remote: хранить файлы дампа в объектном хранилище.
      target.remote.outputDirПуть к выходному каталогу в облачном хранилище.
      target.remote.cloudПоставщик услуг облачного хранилища. Примерные значения: aws, gcp, azure.
      target.remote.endpointКонечная точка хранилища Milvus 2.x.
      target.remote.regionРегион облачного хранилища. Может иметь любое значение, если вы используете локальное MinIO.
      target.remote.bucketИмя ведра для хранения данных. Значение должно совпадать с конфигом в Milvus 2.x. Дополнительные сведения см. в разделе Конфигурации системы.
      target.remote.akКлюч доступа для хранилища Milvus 2.x.
      target.remote.skСекретный ключ для хранилища Milvus 2.x.
      target.remote.useIAMИспользовать ли IAM-роль для подключения.
      target.remote.useSSLВключать ли SSL при подключении к Milvus 2.x. Дополнительные сведения см. в разделе Шифрование при транзите.
      target.remote.checkBucketПроверять, существует ли указанный бакет в хранилище объектов.
      target.milvus2x.endpointАдрес целевого сервера Milvus.
      target.milvus2x.usernameИмя пользователя для сервера Milvus 2.x. Этот параметр необходим, если на сервере Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включение аутентификации.
      target.milvus2x.passwordПароль для сервера Milvus 2.x. Этот параметр необходим, если для сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включить аутентификацию.
      +
    • +
    +

    Запуск задачи миграции

      +
    1. Запустите задачу миграции с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      Приведенная выше команда преобразует данные индекса Фейса в файлы NumPy, а затем использует операцию bulkInsert для записи данных в целевой бакет.

    2. +
    3. После создания файлов NumPy импортируйте их в Milvus 2.x с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    Проверьте результат

    После выполнения задачи миграции вы можете выполнить вызовы API или использовать Attu для просмотра количества перенесенных сущностей. Дополнительные сведения см. в разделе Attu и get_collection_stats().

    diff --git a/localization/v2.5.x/site/ru/migrate/from-m2x.json b/localization/v2.5.x/site/ru/migrate/from-m2x.json new file mode 100644 index 000000000..93d203c71 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/from-m2x.json @@ -0,0 +1 @@ +{"codeList":["dumper:\n worker:\n workMode: milvus2x\n reader:\n bufferSize: 500\n\nmeta:\n mode: config\n version: 2.3.0\n collection: src_table_name\n\nsource:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n\ntarget:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[INFO] [migration/milvus2x_starter.go:79] [\"=================>JobProcess!\"] [Percent=100]\n[INFO] [migration/milvus2x_starter.go:27] [\"[Starter] migration Milvus2x to Milvus2x finish!!!\"] [Cost=94.877717375]\n[INFO] [starter/starter.go:109] [\"[Starter] Migration Success!\"] [Cost=94.878243583]\n","./milvus-migration server run -p 8080\n","curl -XPOST http://localhost:8080/api/v1/start\n","meta:\n fields:\n - name: id\n - name: title_vector\n - name: reading_time\n","meta:\n milvus:\n collection: target_collection_name\n shardNum: 2\n closeDynamicField: false\n consistencyLevel: Customized\n"],"headingContent":"From Milvus 2.3.x","anchorList":[{"label":"С Milvus 2.3.x","href":"From-Milvus-23x","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Настройка файла миграции","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Запуск задачи миграции","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Проверить результат","href":"Verify-the-result","type":2,"isActive":false},{"label":"Дополнительные параметры конфигурации","href":"Additional-configuration-options","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/from-m2x.md b/localization/v2.5.x/site/ru/migrate/from-m2x.md new file mode 100644 index 000000000..0bfa2faef --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/from-m2x.md @@ -0,0 +1,220 @@ +--- +id: from-m2x.md +summary: >- + В этом руководстве представлен полный пошаговый процесс переноса данных из + Milvus 2.3.x в Milvus 2.3.x или выше. +title: С Milvus 2.3.x +--- +

    С Milvus 2.3.x

    В этом руководстве представлен полный пошаговый процесс переноса данных с Milvus 2.3.x на Milvus 2.3.x или выше.

    +

    Необходимые условия

      +
    • Версии программного обеспечения:
        +
      • Исходный Milvus: 2.3.0+ (Инструмент использует итератор для получения исходных данных коллекции, поэтому исходный Milvus должен быть версии 2.3.0 или выше).
      • +
      • Целевой Milvus: 2.3.0+
      • +
    • +
    • Необходимые инструменты:
    • +
    • Подготовка данных:
        +
      • Убедитесь, что исходная коллекция Milvus загружена и готова к экспорту данных.
      • +
      • Если целевой Milvus не содержит коллекции, соответствующей исходной, инструмент milvus-migration автоматически создаст ее. Обратите внимание, что после миграции целевая коллекция не будет проиндексирована, и вам придется вручную проиндексировать коллекцию.
      • +
    • +
    +

    Настройка файла миграции

    Сохраните пример файла конфигурации миграции как migration.yaml и измените конфигурацию в соответствии с вашими реальными условиями. Вы можете поместить файл конфигурации в любой локальный каталог.

    +
    dumper:
    +  worker:
    +    workMode: milvus2x
    +    reader:
    +      bufferSize: 500
    +
    +meta:
    +  mode: config
    +  version: 2.3.0
    +  collection: src_table_name
    +
    +source:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +target:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +

    В следующей таблице описаны параметры в файле конфигурации примера. Дополнительные сведения см. в разделе Миграция Milvus: Milvus2.x - Milvus2.x.

    +
      +
    • dumper

      + + + + + + + + +
      ПараметрОписание
      dumper.worker.workModeРежим работы задания миграции. Установите значение milvus2x при миграции с Milvus 2.x.
      dumper.worker.reader.bufferSizeРазмер буфера для чтения из Milvus 2.x в каждом пакете.
      +
    • +
    • meta

      + + + + + + + + + +
      ПараметрОписание
      meta.modeУказывает, откуда считывается метафайл. Имеет значение config, указывающее, что метаконфигурация может быть получена из этого файла migration.yaml.
      meta.versionИсходная версия Milvus. Установите значение 2.3.0 или выше.
      meta.collectionИмя исходной коллекции.
      +
    • +
    • source

      + + + + + + + + + +
      ПараметрОписание
      source.milvus2x.endpointАдрес исходного сервера Milvus.
      source.milvus2x.usernameИмя пользователя для исходного сервера Milvus. Этот параметр необходим, если на сервере Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включение аутентификации.
      source.milvus2x.passwordПароль для исходного сервера Milvus. Этот параметр необходим, если для вашего сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включить аутентификацию.
      +
    • +
    • target

      + + + + + + + + + +
      ПараметрОписание
      target.milvus2x.endpointАдрес целевого сервера Milvus.
      target.milvus2x.usernameИмя пользователя для целевого сервера Milvus. Этот параметр необходим, если для сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включение аутентификации.
      target.milvus2x.passwordПароль для целевого сервера Milvus. Этот параметр необходим, если для сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включить аутентификацию.
      +
    • +
    +

    Запуск задачи миграции

    У вас есть два варианта запуска задачи миграции - с помощью CLI или с помощью API-запросов. Выберите тот, который лучше всего соответствует вашим потребностям.

    +

    Вариант 1: Использование CLI

    Запустите задачу миграции с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    Следите за обновлениями в журналах. В журналах успешной миграции должны быть такие записи, как:

    +
    [INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
    +[INFO] [migration/milvus2x_starter.go:27] ["[Starter] migration Milvus2x to Milvus2x finish!!!"] [Cost=94.877717375]
    +[INFO] [starter/starter.go:109] ["[Starter] Migration Success!"] [Cost=94.878243583]
    +
    +

    Вариант 2: Выполнение API-запросов

    Для выполнения миграции можно также использовать Restful API. Запустите сервер API с помощью:

    +
    ./milvus-migration server run -p 8080
    +
    +

    После успешного запуска сервера поместите файл migration.yaml в каталог configs/ проекта и запустите миграцию с помощью:

    +
    curl -XPOST http://localhost:8080/api/v1/start
    +
    +

    Проверить результат

    После завершения задачи миграции используйте Attu для просмотра количества перенесенных сущностей. Кроме того, в Attu можно создавать индексы и загружать коллекции. Дополнительную информацию см. в разделе Attu и get_collection_stats().

    +

    Дополнительные параметры конфигурации

    В дополнение к базовым настройкам, упомянутым выше, вы можете добавить дополнительные параметры, исходя из ваших конкретных требований.

    +
      +
    • Выборочная миграция полей: Если вам нужно перенести только определенные поля коллекции, а не все поля, укажите поля, которые нужно перенести, в разделе meta файла migration.yaml.

      +
      meta:
      +  fields:
      +    - name: id
      +    - name: title_vector
      +    - name: reading_time
      +
    • +
    • Пользовательская целевая коллекция: Чтобы настроить свойства целевой коллекции, добавьте соответствующие конфигурации в раздел meta файла migration.yaml.

      +
      meta:
      +  milvus:
      +    collection: target_collection_name
      +    shardNum: 2
      +    closeDynamicField: false
      +    consistencyLevel: Customized
      +
    • +
    +

    Подробную информацию см. в разделе Миграция Milvus: Milvus2.x - Milvus2.x.

    diff --git a/localization/v2.5.x/site/ru/migrate/m2m.json b/localization/v2.5.x/site/ru/migrate/m2m.json new file mode 100644 index 000000000..1d4d24b61 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/m2m.json @@ -0,0 +1 @@ +{"codeList":["./milvus-migration export -m \"user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local\" -o outputDir\n","./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir\n","migration_data\n├── meta.json\n└── tables\n","dumper:\n worker:\n limit: 2\n workMode: milvus1x\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 16\nmeta:\n mode: local\n localFile: /outputDir/test/meta.json\nsource:\n mode: local\n local:\n tablesDir: /db/tables/\ntarget:\n mode: remote\n remote:\n outputDir: \"migration/test/xx\"\n ak: xxxx\n sk: xxxx\n cloud: aws\n region: us-west-2\n bucket: xxxxx\n useIAM: true\n checkBucket: false\n milvus2x:\n endpoint: \"{yourMilvus2_xServerAddress}:{port}\"\n username: xxxx\n password: xxxx\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Milvus 1.x","anchorList":[{"label":"С Milvus 1.x","href":"From-Milvus-1x","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Экспорт метаданных исходной установки Milvus","href":"Export-metadata-of-the-source-Milvus-installation","type":2,"isActive":false},{"label":"Настройка файла миграции","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"Запуск задачи миграции","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"Проверьте результат","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/m2m.md b/localization/v2.5.x/site/ru/migrate/m2m.md new file mode 100644 index 000000000..8aada6f7c --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/m2m.md @@ -0,0 +1,242 @@ +--- +id: m2m.md +summary: >- + В этом руководстве представлен полный пошаговый процесс переноса данных из + Milvus 1.x (включая 0.9.x и выше) в Milvus 2.x. +title: С Milvus 1.x +--- +

    С Milvus 1.x

    В этом руководстве представлен полный пошаговый процесс переноса данных с Milvus 1.x (включая 0.9.x и выше) на Milvus 2.x. Следуя этому руководству, вы сможете эффективно перенести свои данные, используя расширенные возможности Milvus 2.x и улучшенную производительность.

    +

    Необходимые условия

    +

    Экспорт метаданных исходной установки Milvus

    Чтобы подготовить данные миграции для Milvus 0.9.x - 1.x, остановите исходный Milvus или, по крайней мере, прекратите выполнять в нем любые операции DML.

    +
      +
    1. Экспортируйте метаданные исходной установки Milvus на meta.json.

      +
        +
      • Для инсталляций, использующих MySQL в качестве бэкенда, выполните команду
      • +
      +
      ./milvus-migration export -m "user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local" -o outputDir
      +
      +
        +
      • Для установок, использующих SQLite в качестве бэкенда, выполните команду
      • +
      +
      ./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir
      +
    2. +
    3. Скопируйте папку tables вашей установки Milvus, затем переместите папки meta.json и tables в пустую папку.

      +

      После выполнения этого шага структура пустой папки должна выглядеть следующим образом:

      +
      migration_data
      +├── meta.json
      +└── tables
      +
    4. +
    5. Загрузите папку, подготовленную на предыдущем шаге, в ведро блочного хранилища S3 или напрямую используйте эту локальную папку в следующем разделе.

    6. +
    +

    Настройка файла миграции

    Сохраните пример файла конфигурации миграции как migration.yaml и измените конфигурацию в соответствии с вашими реальными условиями. Вы можете поместить файл конфигурации в любой локальный каталог.

    +
    dumper:
    +  worker:
    +    limit: 2
    +    workMode: milvus1x
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 16
    +meta:
    +  mode: local
    +  localFile: /outputDir/test/meta.json
    +source:
    +  mode: local
    +  local:
    +    tablesDir: /db/tables/
    +target:
    +  mode: remote
    +  remote:
    +    outputDir: "migration/test/xx"
    +    ak: xxxx
    +    sk: xxxx
    +    cloud: aws
    +    region: us-west-2
    +    bucket: xxxxx
    +    useIAM: true
    +    checkBucket: false
    +  milvus2x:
    +    endpoint: "{yourMilvus2_xServerAddress}:{port}"
    +    username: xxxx
    +    password: xxxx
    +
    +

    В следующей таблице описаны параметры в файле конфигурации примера. Полный список конфигураций см. в разделе Миграция Milvus: Milvus1.x - Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      ПараметрОписание
      dumper.worker.limitПараметр параллельности потоков дампера.
      dumper.worker.workModeРежим работы задания миграции. Установите значение milvus1x при миграции с Milvus 1.x.
      dumper.worker.reader.bufferSizeРазмер буфера для чтения из Milvus 1.x в каждом пакете. Единица измерения: КБ.
      dumper.worker.writer.bufferSizeРазмер буфера для записи в Milvus 2.x в каждом пакете. Единицы измерения: КБ.
      +
    • +
    • loader

      + + + + + + + +
      ПараметрОписание
      loader.worker.limitПараметр параллельности потоков загрузчика.
      +
    • +
    • meta

      + + + + + + + + +
      ПараметрОписание
      meta.modeУказывает, откуда считывается метафайл meta.json. Допустимые значения: local, remote, mysql, sqlite.
      meta.localFileПуть к локальной директории, в которой находится файл meta.json. Этот конфиг используется только в том случае, если для meta.mode установлено значение local. О других конфигурациях метафайлов читайте в README_1X.
      +
    • +
    • source

      + + + + + + + + +
      ПараметрОписание
      source.modeУказывает, откуда считываются исходные файлы. Допустимые значения:
      - local: считывает файлы с локального диска.
      - remote: считывает файлы с удаленного хранилища.
      source.local.tablesDirПуть к каталогу, в котором находятся исходные файлы. Например, /db/tables/.
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + +
      ПараметрОписание
      target.modeМесто хранения сброшенных файлов. Допустимые значения:
      - local: Хранить файлы дампа на локальных дисках.
      - remote: Хранить файлы дампа в объектном хранилище.
      target.remote.outputDirПуть к выходному каталогу в облачном хранилище.
      target.remote.akКлюч доступа для хранилища Milvus 2.x.
      target.remote.skСекретный ключ для хранилища Milvus 2.x.
      target.remote.cloudПоставщик услуг облачного хранилища. Примерные значения: aws, gcp, azure.
      target.remote.regionРегион облачного хранилища. Может быть любым значением, если вы используете локальное MinIO.
      target.remote.bucketИмя ведра для хранения данных. Значение должно совпадать с конфигом в Milvus 2.x. Дополнительные сведения см. в разделе Конфигурации системы.
      target.remote.useIAMИспользовать ли IAM-роль для подключения.
      target.remote.checkBucketПроверять, существует ли указанный бакет в хранилище объектов.
      target.milvus2x.endpointАдрес целевого сервера Milvus.
      target.milvus2x.usernameИмя пользователя для сервера Milvus 2.x. Этот параметр необходим, если на сервере Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включение аутентификации.
      target.milvus2x.passwordПароль для сервера Milvus 2.x. Этот параметр необходим, если для сервера Milvus включена аутентификация пользователей. Дополнительные сведения см. в разделе Включить аутентификацию.
      +
    • +
    +

    Запуск задачи миграции

      +
    1. Запустите задачу миграции с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      Приведенная выше команда преобразует исходные данные в Milvus 1.x в файлы NumPy, а затем использует операцию bulkInsert для записи данных в целевой бакет.

    2. +
    3. После создания файлов NumPy импортируйте их в Milvus 2.x с помощью следующей команды. Замените {YourConfigFilePath} на локальный каталог, в котором находится файл конфигурации migration.yaml.

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    Проверьте результат

    После выполнения задачи миграции вы можете выполнить вызовы API или использовать Attu для просмотра количества перенесенных сущностей. Дополнительные сведения см. в разделе Attu и get_collection_stats().

    diff --git a/localization/v2.5.x/site/ru/migrate/migrate_overview.json b/localization/v2.5.x/site/ru/migrate/migrate_overview.json new file mode 100644 index 000000000..4ce4ab400 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/migrate_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Migration Overview","anchorList":[{"label":"Обзор миграции Milvus","href":"Milvus-Migration-Overview","type":1,"isActive":false},{"label":"Поддерживаемые миграции","href":"Supported-migrations","type":2,"isActive":false},{"label":"Особенности","href":"Features","type":2,"isActive":false},{"label":"Архитектура","href":"Architecture","type":2,"isActive":false},{"label":"Планы на будущее","href":"Future-plans","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/migrate_overview.md b/localization/v2.5.x/site/ru/migrate/migrate_overview.md new file mode 100644 index 000000000..016ae45c2 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/migrate_overview.md @@ -0,0 +1,120 @@ +--- +id: migrate_overview.md +summary: >- + В этой статье представлен обзор инструмента Milvus-migration, включая + поддерживаемые миграции, функции и архитектуру. +title: Обзор миграции Milvus +--- +

    Обзор миграции Milvus

    Учитывая разнообразные потребности пользователей, Milvus расширил свои инструменты миграции, чтобы не только облегчить обновление с более ранних версий Milvus 1.x, но и обеспечить бесшовную интеграцию данных из других систем, таких как Elasticsearch и Faiss. Проект Milvus-migration призван преодолеть разрыв между этими разнообразными средами данных и последними достижениями в технологии Milvus, обеспечивая беспрепятственное использование улучшенных функций и производительности.

    +

    Поддерживаемые миграции

    Инструмент Milvus-migration поддерживает различные пути миграции для удовлетворения различных потребностей пользователей:

    +
      +
    • Elasticsearch на Milvus 2.x: Позволяет пользователям переносить данные из сред Elasticsearch, чтобы воспользоваться преимуществами оптимизированного векторного поиска Milvus.
    • +
    • Faiss - Milvus 2.x: Предоставление экспериментальной поддержки для переноса данных из Faiss, популярной библиотеки для эффективного поиска по сходству.
    • +
    • Milvus 1.x - Milvus 2.x: Обеспечение плавного перехода данных из предыдущих версий на новейший фреймворк.
    • +
    • Milvus 2.3.x - Milvus 2.3.x или выше: Одноразовый переход для пользователей, которые уже перешли на 2.3.x.
    • +
    +

    Особенности

    Milvus-migration обладает надежными функциями, позволяющими справиться с различными сценариями миграции:

    +
      +
    • Несколько методов взаимодействия: Вы можете выполнять миграцию через интерфейс командной строки или через Restful API, гибко настраивая способ выполнения миграции.
    • +
    • Поддержка различных форматов файлов и облачных хранилищ: Инструмент Milvus-migration может работать с данными, хранящимися как в локальных файлах, так и в облачных хранилищах, таких как S3, OSS и GCP, что обеспечивает широкую совместимость.
    • +
    • Работа с типами данных: Milvus-migration способен работать как с векторными данными, так и со скалярными полями, что делает его универсальным выбором для решения различных задач миграции данных.
    • +
    +

    Архитектура

    Архитектура Milvus-migration стратегически продумана таким образом, чтобы обеспечить эффективные процессы потоковой передачи, разбора и записи данных, что позволяет осуществлять надежную миграцию данных из различных источников.

    +

    + + Milvus-migration architecture + Архитектура Milvus-migration

    +

    На предыдущем рисунке:

    +
      +
    • Источник данных: Milvus-migration поддерживает различные источники данных, включая Elasticsearch через API прокрутки, локальные или облачные файлы данных, а также базы данных Milvus 1.x. Доступ к ним и их чтение осуществляются в упрощенном порядке, чтобы запустить процесс миграции.
    • +
    • Потоковый конвейер:
        +
      • Процесс разбора: Данные из источников анализируются в соответствии с их форматом. Например, для источника данных из Elasticsearch используется парсер формата Elasticsearch, а для других форматов - соответствующие парсеры. Этот шаг очень важен для преобразования сырых данных в структурированный формат, который может быть подвергнут дальнейшей обработке.
      • +
      • Процесс преобразования: После парсинга данные подвергаются преобразованию, в ходе которого поля фильтруются, типы данных преобразуются, а имена таблиц корректируются в соответствии с целевой схемой Milvus 2.x. Это гарантирует, что данные соответствуют ожидаемой структуре и типам в Milvus.
      • +
    • +
    • Запись и загрузка данных:
        +
      • Запись данных: Обработанные данные записываются в промежуточные файлы JSON или NumPy, готовые к загрузке в Milvus 2.x.
      • +
      • Загрузка данных: Данные окончательно загружаются в Milvus 2.x с помощью операции BulkInsert, которая эффективно записывает большие объемы данных в системы хранения Milvus, облачные или файловые хранилища.
      • +
    • +
    +

    Планы на будущее

    Команда разработчиков стремится усовершенствовать Milvus-migration, добавив в него такие функции, как:

    +
      +
    • Поддержка большего количества источников данных: Планируется расширить поддержку дополнительных баз данных и файловых систем, таких как Pinecone, Chroma, Qdrant. Если вам нужна поддержка конкретного источника данных, пожалуйста, отправьте запрос через эту ссылку на GitHub.
    • +
    • Упрощение команд: Усилия по упрощению процесса выполнения команд для более легкого выполнения.
    • +
    • Парсер / преобразованиеSPI: В архитектуру предполагается включить инструменты интерфейса поставщика услуг (SPI) для парсинга и конвертации. Эти инструменты позволяют создавать пользовательские реализации, которые пользователи могут подключать к процессу миграции для обработки определенных форматов данных или правил преобразования.
    • +
    • Возобновление контрольных точек: Позволяет возобновлять миграцию с последней контрольной точки для повышения надежности и эффективности в случае перерывов в работе. Точки сохранения создаются для обеспечения целостности данных и хранятся в базах данных, таких как SQLite или MySQL, для отслеживания хода процесса миграции.
    • +
    diff --git a/localization/v2.5.x/site/ru/migrate/milvusdm_install.json b/localization/v2.5.x/site/ru/migrate/milvusdm_install.json new file mode 100644 index 000000000..4f4a381d1 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/milvusdm_install.json @@ -0,0 +1 @@ +{"codeList":["# clone the source project\ngit clone https://github.com/zilliztech/milvus-migration.git\n","cd milvus-migration\n","# compile the project to obtain an executable file\ngo get & go build\n"],"headingContent":"Install Migration Tool","anchorList":[{"label":"Установка инструмента миграции","href":"Install-Migration-Tool","type":1,"isActive":false},{"label":"Загрузить исполняемый двоичный файл","href":"Download-the-executable-binary","type":2,"isActive":false},{"label":"Компиляция из исходного кода","href":"Compile-from-source","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/migrate/milvusdm_install.md b/localization/v2.5.x/site/ru/migrate/milvusdm_install.md new file mode 100644 index 000000000..8fe1062d9 --- /dev/null +++ b/localization/v2.5.x/site/ru/migrate/milvusdm_install.md @@ -0,0 +1,91 @@ +--- +id: milvusdm_install.md +summary: 'Узнайте, как установить Milvus-Migration для переноса данных.' +title: Установка инструмента миграции +--- +

    Установка инструмента миграции

    Мы поддерживаем загрузку исполняемого двоичного файла или компиляцию инструмента Milvus-migration из исходного кода.

    +

    Загрузить исполняемый двоичный файл

      +
    1. Загрузите последнюю версию из репозитория Milvus-Migration на GitHub.
    2. +
    3. Распакуйте загруженный файл, чтобы получить исполняемый двоичный файл milvus-migration.
    4. +
    +

    Компиляция из исходного кода

    В качестве альтернативы загрузите и скомпилируйте исходный текст, чтобы получить исполняемый двоичный файл.

    +
      +
    1. Клонируйте репозиторий Milvus-Migration:

      +
      # clone the source project
      +git clone https://github.com/zilliztech/milvus-migration.git
      +
    2. +
    3. Перейдите в каталог проекта:

      +
      cd milvus-migration
      +
    4. +
    5. Скомпилируйте проект, чтобы получить исполняемый файл:

      +
      # compile the project to obtain an executable file
      +go get & go build
      +
      +

      В результате в каталоге проекта будет создан исполняемый файл milvus-migration.

    6. +
    +

    Что дальше

    Установив инструмент Milvus-migration, вы можете переносить данные из различных источников:

    + diff --git a/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.json b/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.json new file mode 100644 index 000000000..fe87c0687 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Architecture Overview","anchorList":[{"label":"Обзор архитектуры Milvus","href":"Milvus-Architecture-Overview","type":1,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.md b/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.md new file mode 100644 index 000000000..c0e7cb4bc --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/architecture_overview.md @@ -0,0 +1,54 @@ +--- +id: architecture_overview.md +summary: >- + Milvus - это быстрая, надежная и стабильная база данных векторов, созданная + специально для поиска сходств и искусственного интеллекта. +title: Обзор архитектуры Milvus +--- +

    Обзор архитектуры Milvus

    Построенный на основе популярных библиотек векторного поиска, таких как Faiss, HNSW, DiskANN, SCANN и других, Milvus был разработан для поиска сходства в плотных векторных наборах данных, содержащих миллионы, миллиарды и даже триллионы векторов. Прежде чем приступить к работе, ознакомьтесь с основными принципами поиска по вкраплениям.

    +

    Milvus также поддерживает чередование данных, потоковый ввод данных, динамическую схему, поиск в сочетании векторных и скалярных данных, многовекторный и гибридный поиск, разреженный вектор и многие другие расширенные функции. Платформа обеспечивает производительность по требованию и может быть оптимизирована под любой сценарий поиска встраивания. Мы рекомендуем развертывать Milvus с помощью Kubernetes для оптимальной доступности и эластичности.

    +

    В Milvus используется архитектура с общим хранилищем, предусматривающая дезагрегацию хранилищ и вычислений и горизонтальную масштабируемость вычислительных узлов. Следуя принципу разделения плоскости данных и плоскости управления, Milvus включает в себя четыре уровня: уровень доступа, сервис-координатор, рабочий узел и хранилище. Эти уровни являются взаимно независимыми, когда речь идет о масштабировании или аварийном восстановлении.

    +

    + + Architecture_diagram + Архитектура_диаграммы

    +

    Согласно рисунку, интерфейсы можно разделить на следующие категории:

    +
      +
    • DDL / DCL: createCollection / createPartition / dropCollection / dropPartition / hasCollection / hasPartition
    • +
    • DML / Produce: insert / delete / upsert
    • +
    • DQL: поиск / запрос
    • +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/architecture/data_processing.json b/localization/v2.5.x/site/ru/reference/architecture/data_processing.json new file mode 100644 index 000000000..9697deb98 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/data_processing.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Data Processing","anchorList":[{"label":"Обработка данных","href":"Data-Processing","type":1,"isActive":false},{"label":"Вставка данных","href":"Data-insertion","type":2,"isActive":false},{"label":"Построение индекса","href":"Index-building","type":2,"isActive":false},{"label":"Запрос данных","href":"Data-query","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/architecture/data_processing.md b/localization/v2.5.x/site/ru/reference/architecture/data_processing.md new file mode 100644 index 000000000..294eb315b --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/data_processing.md @@ -0,0 +1,124 @@ +--- +id: data_processing.md +summary: Узнайте о процедуре обработки данных в Milvus. +title: Обработка данных +--- +

    Обработка данных

    Эта статья содержит подробное описание реализации в Milvus вставки данных, построения индексов и запросов к данным.

    +

    Вставка данных

    Для каждой коллекции в Milvus можно указать количество шардов, каждый из которых соответствует виртуальному каналу(vchannel). Как показано на следующем рисунке, Milvus назначает каждому vchannel в брокере журналов физический канал(pchannel). Любой входящий запрос на вставку/удаление направляется на шарды на основе хэш-значения первичного ключа.

    +

    Валидация DML-запросов переносится на прокси, поскольку в Milvus нет сложных транзакций. Прокси запрашивает временную метку для каждого запроса на вставку/удаление у TSO (Timestamp Oracle), который является модулем синхронизации, расположенным в корневом координаторе. Поскольку старая временная метка перезаписывается новой, временные метки используются для определения последовательности обрабатываемых запросов данных. Proxy получает информацию из data coord партиями, включая сегменты сущностей и первичные ключи, чтобы увеличить общую пропускную способность и избежать перегрузки центрального узла.

    +

    + + Channels 1 + Каналы 1

    +

    В журнал записываются как операции DML (язык манипулирования данными), так и операции DDL (язык определения данных), но операциям DDL назначается только один канал из-за их низкой частоты появления.

    +

    + + Channels 2 + Каналы 2

    +

    V каналов хранятся в базовых узлах брокера журналов. Каждый канал физически неделим и доступен для любого, но только одного узла. Когда скорость поступления данных достигает узкого места, следует обратить внимание на две вещи: перегружен ли узел брокера журналов и нуждается ли он в масштабировании, и достаточно ли шардов для обеспечения баланса нагрузки на каждом узле.

    +

    + + Write log sequence + Последовательность записи журнала

    +

    На приведенной выше схеме показаны четыре компонента, участвующие в процессе записи последовательности журналов: прокси, брокер журналов, узел данных и хранилище объектов. Процесс включает в себя четыре задачи: проверку DML-запросов, публикацию-подписку последовательности журналов, преобразование потокового журнала в снимки журналов и сохранение снимков журналов. Эти четыре задачи отделены друг от друга, чтобы убедиться, что каждая из них выполняется узлом соответствующего типа. Узлы одного и того же типа являются равноправными и могут эластично и независимо масштабироваться для работы с различными нагрузками данных, в частности с массивными и сильно колеблющимися потоковыми данными.

    +

    Построение индекса

    Построение индекса осуществляется индексным узлом. Чтобы избежать частого создания индекса при обновлении данных, коллекция в Milvus делится на сегменты, каждый из которых имеет свой собственный индекс.

    +

    + + Index building + Построение индекса

    +

    Milvus поддерживает построение индекса для каждого векторного поля, скалярного поля и первичного поля. Как на входе, так и на выходе построения индекса происходит взаимодействие с хранилищем объектов: Индексный узел загружает снимки журнала для индексирования из сегмента (который находится в объектном хранилище) в память, десериализует соответствующие данные и метаданные для построения индекса, сериализует индекс по завершении построения индекса и записывает его обратно в объектное хранилище.

    +

    Построение индекса в основном включает в себя операции с векторами и матрицами и, следовательно, требует больших затрат вычислений и памяти. Векторы не могут быть эффективно проиндексированы традиционными древовидными индексами из-за их высокой размерности, но могут быть проиндексированы методами, которые более развиты в этой области, такими как кластерные или графовые индексы. Независимо от типа, построение индекса предполагает массивные итерационные вычисления для крупномасштабных векторов, такие как Kmeans или graph traverse.

    +

    В отличие от индексирования скалярных данных, построение векторного индекса должно в полной мере использовать преимущества ускорения SIMD (single instruction, multiple data). Milvus имеет встроенную поддержку наборов инструкций SIMD, например, SSE, AVX2 и AVX512. Учитывая "заминки" и ресурсоемкость построения векторных индексов, эластичность приобретает для Milvus решающее значение с экономической точки зрения. В будущих релизах Milvus будут продолжены исследования в области гетерогенных вычислений и бессерверных вычислений для снижения соответствующих затрат.

    +

    Кроме того, Milvus поддерживает скалярную фильтрацию и запросы по первичному полю. Для повышения эффективности запросов в нем имеются встроенные индексы, например, индексы фильтра Блума, хеш-индексы, древовидные индексы и инвертированные индексы, а также планируется внедрение внешних индексов, например, растровых индексов и грубых индексов.

    +

    Запрос данных

    Запрос данных - это процесс поиска в заданной коллекции k-го количества векторов, ближайших к целевому вектору, или всех векторов в заданном диапазоне расстояний до вектора. Векторы возвращаются вместе с соответствующими первичными ключами и полями.

    +

    + + Data query + Запрос данных

    +

    Коллекция в Milvus разбивается на множество сегментов, а узлы запросов загружают индексы по сегментам. Когда поступает поисковый запрос, он транслируется на все узлы запроса для одновременного поиска. Затем каждый узел обрезает локальные сегменты, ищет векторы, удовлетворяющие критериям, сводит и возвращает результаты поиска.

    +

    При запросе данных узлы запроса независимы друг от друга. Каждый узел отвечает только за две задачи: Загружать или освобождать сегменты, следуя инструкциям коорд запроса; проводить поиск в локальных сегментах. А прокси отвечает за сокращение результатов поиска от каждого узла запроса и возврат окончательных результатов клиенту.

    +

    + + Handoff + Передача

    +

    Существует два типа сегментов: растущие сегменты (для инкрементных данных) и закрытые сегменты (для исторических данных). Узлы запросов подписываются на vchannel, чтобы получать последние обновления (инкрементные данные) в виде растущих сегментов. Когда растущий сегмент достигает заданного порога, координатор данных запечатывает его и начинается построение индекса. Затем операция передачи, инициированная координатором запросов, превращает инкрементные данные в исторические. Координатор запросов равномерно распределяет запечатанные сегменты между всеми узлами запросов в соответствии с использованием памяти, нагрузкой на процессор и количеством сегментов.

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/architecture/four_layers.json b/localization/v2.5.x/site/ru/reference/architecture/four_layers.json new file mode 100644 index 000000000..9cc469730 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/four_layers.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Storage/Computing Disaggregation","anchorList":[{"label":"Дезагрегация систем хранения данных и вычислений","href":"StorageComputing-Disaggregation","type":1,"isActive":false},{"label":"Уровень доступа","href":"Access-layer","type":2,"isActive":false},{"label":"Служба координатора","href":"Coordinator-service","type":2,"isActive":false},{"label":"Рабочие узлы","href":"Worker-nodes","type":2,"isActive":false},{"label":"Хранилище","href":"Storage","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/architecture/four_layers.md b/localization/v2.5.x/site/ru/reference/architecture/four_layers.md new file mode 100644 index 000000000..6f7d68718 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/four_layers.md @@ -0,0 +1,123 @@ +--- +id: four_layers.md +summary: Структура разделения хранения и вычислений в Milvus. +title: Дезагрегация систем хранения данных и вычислений +--- +

    Дезагрегация систем хранения данных и вычислений

    Следуя принципу дезагрегации плоскости данных и плоскости управления, Milvus состоит из четырех уровней, которые являются взаимно независимыми с точки зрения масштабируемости и аварийного восстановления.

    +

    Уровень доступа

    Состоящий из группы прокси-серверов без статического управления, уровень доступа является передним уровнем системы и конечной точкой для пользователей. Он проверяет запросы клиентов и сокращает возвращаемые результаты:

    +
      +
    • Прокси сам по себе не имеет статусов. Он обеспечивает единый адрес сервиса, используя компоненты балансировки нагрузки, такие как Nginx, Kubernetes Ingress, NodePort и LVS.
    • +
    • Поскольку в Milvus используется архитектура массивно-параллельной обработки (MPP), прокси агрегирует и обрабатывает промежуточные результаты, прежде чем вернуть клиенту окончательные результаты.
    • +
    +

    Служба координатора

    Служба-координатор распределяет задачи между рабочими узлами и выполняет функции "мозга" системы. Среди задач, которые он берет на себя, - управление топологией кластера, балансировка нагрузки, генерация временных меток, объявление данных и управление данными.

    +

    Существует три типа координаторов: корневой координатор (root coord), координатор данных (data coord) и координатор запросов (query coord).

    +

    Корневой координатор (root coord)

    Корневой координатор обрабатывает запросы языка определения данных (DDL) и языка управления данными (DCL), такие как создание или удаление коллекций, разделов или индексов, а также управляет выдачей TSO (timestamp Oracle) и временных тикеров.

    +

    Координатор запросов (query coord)

    Query coord управляет топологией и балансировкой нагрузки для узлов запросов, а также передачей данных из растущих сегментов в закрытые сегменты.

    +

    Координатор данных (data coord)

    Координатор данных управляет топологией узлов данных и узлов индекса, поддерживает метаданные, запускает операции промывки, уплотнения, создания индекса и другие фоновые операции с данными.

    +

    Рабочие узлы

    Руки и ноги. Рабочие узлы - это немые исполнители, которые следуют инструкциям службы координатора и выполняют команды языка манипулирования данными (DML), поступающие от прокси. Рабочие узлы не имеют статических данных благодаря разделению хранения и вычислений и могут способствовать масштабированию системы и аварийному восстановлению при развертывании на Kubernetes. Существует три типа рабочих узлов:

    +

    Узел запросов

    Узел запросов получает инкрементные данные журнала и превращает их в растущие сегменты, подписываясь на брокера журналов, загружает исторические данные из объектного хранилища и выполняет гибридный поиск между векторными и скалярными данными.

    +

    Узел данных

    Узел данных получает инкрементные данные журнала, подписываясь на брокера журнала, обрабатывает запросы на мутацию, упаковывает данные журнала в снимки журнала и сохраняет их в объектном хранилище.

    +

    Индексный узел

    Индексный узел создает индексы. Индексные узлы не обязательно должны быть резидентными в памяти и могут быть реализованы с помощью бессерверного фреймворка.

    +

    Хранилище

    Хранилище - это кость системы, отвечающая за сохранность данных. Оно включает в себя метахранилище, брокер журналов и хранилище объектов.

    +

    Метахранилище

    Метахранилище хранит снимки метаданных, таких как схема коллекции и контрольные точки потребления сообщений. Хранение метаданных требует чрезвычайно высокой доступности, высокой согласованности и поддержки транзакций, поэтому Milvus выбрал etcd для метахранилища. Milvus также использует etcd для регистрации и проверки работоспособности сервисов.

    +

    Объектное хранилище

    В объектном хранилище хранятся файлы моментальных снимков журналов, индексные файлы для скалярных и векторных данных, а также промежуточные результаты запросов. Milvus использует MinIO в качестве объектного хранилища и может быть легко развернут на AWS S3 и Azure Blob, двух самых популярных и экономически эффективных сервисах хранения данных в мире. Однако объектное хранилище имеет высокую задержку доступа и тарифицируется по количеству запросов. Чтобы повысить производительность и снизить затраты, Milvus планирует реализовать разделение данных "холодный-горячий" в пуле кэша на базе памяти или SSD.

    +

    Брокер журналов

    Брокер журналов - это система pub-sub, поддерживающая воспроизведение. Он отвечает за сохранение потоковых данных и уведомление о событиях. Он также обеспечивает целостность инкрементных данных при восстановлении рабочих узлов после сбоев в системе. В кластере Milvus в качестве лог-брокера используется Pulsar; в автономном Milvus в качестве лог-брокера используется RocksDB. Кроме того, лог-брокер можно легко заменить платформами для хранения потоковых данных, такими как Kafka.

    +

    Milvus построен на базе лог-брокера и следует принципу "лог как данные", поэтому Milvus не поддерживает физические таблицы, но гарантирует надежность данных за счет персистентности логов и журналов моментальных снимков.

    +

    + + Log_mechanism + Механизм логирования

    +

    Лог-брокер является основой Milvus. Благодаря встроенному механизму pub-sub он отвечает за сохранение данных и их разделение по принципу "чтение-запись". На рисунке выше показано упрощенное изображение механизма, где система разделена на две роли - брокера журналов (для поддержания последовательности журналов) и подписчика журналов. Первый регистрирует все операции, изменяющие состояние коллекции; второй подписывается на последовательность журналов для обновления локальных данных и предоставляет услуги в виде копий, доступных только для чтения. Механизм pub-sub также позволяет расширить систему в плане сбора данных об изменениях (CDC) и глобально-распределенного развертывания.

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/architecture/main_components.json b/localization/v2.5.x/site/ru/reference/architecture/main_components.json new file mode 100644 index 000000000..c02a6e318 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/main_components.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Main Components","anchorList":[{"label":"Основные компоненты","href":"Main-Components","type":1,"isActive":false},{"label":"Автономный Milvus","href":"Milvus-standalone","type":2,"isActive":false},{"label":"Кластер Milvus","href":"Milvus-cluster","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/architecture/main_components.md b/localization/v2.5.x/site/ru/reference/architecture/main_components.md new file mode 100644 index 000000000..61139c856 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/architecture/main_components.md @@ -0,0 +1,98 @@ +--- +id: main_components.md +summary: Узнайте об основных компонентах автономной и кластерной системы Milvus. +title: Основные компоненты +--- +

    Основные компоненты

    Существует два режима работы Milvus: автономный и кластерный. Эти два режима имеют одинаковые возможности. Вы можете выбрать режим, который лучше всего подходит для вашего размера набора данных, данных о трафике и т. д. На данный момент Milvus standalone не может быть обновлен "онлайн" до Milvus cluster.

    +

    Автономный Milvus

    Milvus standalone включает в себя три компонента:

    +
      +
    • Milvus: основной функциональный компонент.

    • +
    • Meta Store: Движок метаданных, который получает доступ и хранит метаданные внутренних компонентов Milvus, включая прокси, индексные узлы и многое другое.

    • +
    • Хранилище объектов: Механизм хранения, который отвечает за сохранение данных в Milvus.

    • +
    +

    + + Standalone_architecture + Автономная_архитектура

    +

    Кластер Milvus

    Кластер Milvus включает в себя семь компонентов микросервисов и три сторонних зависимости. Все микросервисы могут быть развернуты на Kubernetes независимо друг от друга.

    +

    Компоненты микросервисов

      +
    • Корневой координатор
    • +
    • Прокси
    • +
    • Координата запроса
    • +
    • Узел запросов
    • +
    • Коорд данных
    • +
    • Индексный узел
    • +
    • Узел данных
    • +
    +

    Сторонние зависимости

      +
    • Метахранилище: Хранит метаданные для различных компонентов кластера, например, etcd.
    • +
    • Хранилище объектов: Отвечает за сохранение данных больших файлов в кластере, таких как индексные и бинарные файлы журналов, например S3.
    • +
    • Брокер журналов: Управляет журналами последних операций мутации, выводит потоковый журнал и предоставляет услуги публикации-подписки журналов, например, Pulsar.
    • +
    +

    + + Distributed_architecture + Распределенная_архитектура

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/benchmark.json b/localization/v2.5.x/site/ru/reference/benchmark.json new file mode 100644 index 000000000..8e82c2a36 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/benchmark.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus 2.2 Benchmark Test Report","anchorList":[{"label":"Отчет о тестировании Milvus 2.2 Benchmark","href":"Milvus-22-Benchmark-Test-Report","type":1,"isActive":false},{"label":"Резюме","href":"Summary","type":2,"isActive":false},{"label":"Терминология","href":"Terminology","type":2,"isActive":false},{"label":"Тестовая среда","href":"Test-environment","type":2,"isActive":false},{"label":"Конвейер тестирования","href":"Test-pipeline","type":2,"isActive":false},{"label":"Результаты тестирования","href":"Test-results","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/benchmark.md b/localization/v2.5.x/site/ru/reference/benchmark.md new file mode 100644 index 000000000..f454cc751 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/benchmark.md @@ -0,0 +1,279 @@ +--- +id: benchmark.md +summary: Узнайте об эталонном результате Милвуса. +title: Отчет о тестировании Milvus 2.2 Benchmark +--- +

    Отчет о тестировании Milvus 2.2 Benchmark

    В этом отчете представлены основные результаты тестирования Milvus 2.2.0. Его цель - дать представление о производительности поиска Milvus 2.2.0, особенно в части возможности расширения и масштабирования.

    +
    +
    +
    + Milvus Performance Evaluation 2023 +
    +
    +
    +

    Недавно мы провели сравнение с Milvus 2.2.3 и получили следующие основные результаты:

    +
      +
    • 2,5-кратное сокращение задержки при поиске
    • +
    • Увеличение QPS в 4,5 раза
    • +
    • Поиск сходства в миллиардных масштабах с незначительным снижением производительности
    • +
    • Линейная масштабируемость при использовании нескольких реплик.
    • +
    +

    Для получения более подробной информации, пожалуйста, обратитесь к этому техническому описанию и соответствующему тестовому коду бенчмарка.

    +
    +
    +

    Резюме

      +
    • По сравнению с Milvus 2.1, QPS Milvus 2.2.0 увеличивается более чем на 48 % в кластерном режиме и более чем на 75 % в автономном режиме.
    • +
    • Milvus 2.2.0 обладает впечатляющей способностью к увеличению и уменьшению масштаба:
        +
      • QPS линейно увеличивается при увеличении числа ядер процессора с 8 до 32.
      • +
      • QPS линейно увеличивается при увеличении количества реплик Querynode с 1 до 8.
      • +
    • +
    +

    Терминология

    +Нажмите, чтобы узнать подробности терминов, использованных в тесте + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ТерминОписание
    nqКоличество векторов для поиска в одном поисковом запросе
    topkЧисло ближайших векторов, которые будут найдены для каждого вектора (в nq) в поисковом запросе
    efПараметр поиска, специфичный для индекса HNSW
    RTВремя от отправки запроса до получения ответа
    QPSКоличество успешно обработанных поисковых запросов в секунду
    +

    +

    Тестовая среда

    Все тесты проводятся в следующих средах.

    +

    Аппаратная среда

    + + + + + + + + +
    Аппаратное обеспечениеСпецификация
    ПРОЦЕССОРЦентральный процессор Intel® Xeon® Gold 6226R @ 2,90 ГГц
    Память16*\32 ГБ RDIMM, 3200 MT/s
    ТВЕРДОТЕЛЬНЫЙ НАКОПИТЕЛЬSATA 6 Гбит/с
    +

    Программная среда

    + + + + + + + +
    Программное обеспечениеВерсия
    Milvusv2.2.0
    Milvus GO SDKv2.2.0
    +

    Схема развертывания

      +
    • Экземпляры Milvus (автономные или кластерные) разворачиваются через Helm на кластере Kubernetes на базе физических или виртуальных машин.
    • +
    • Различные тесты могут отличаться количеством ядер процессора, объемом памяти и количеством реплик (рабочих узлов), что относится только к кластерам Milvus.
    • +
    • Неопределенные конфигурации идентичны конфигурациям по умолчанию.
    • +
    • Зависимости Milvus (MinIO, Pulsar и Etcd) хранят данные на локальном SSD в каждом узле.
    • +
    • Поисковые запросы отправляются на экземпляры Milvus через Milvus GO SDK.
    • +
    +

    Наборы данных

    В тесте используется открытый набор данных SIFT (128 измерений) из ANN-Benchmarks.

    +

    Конвейер тестирования

      +
    1. Запустите экземпляр Milvus с помощью Helm с соответствующими конфигурациями сервера, указанными в каждом тесте.
    2. +
    3. Подключитесь к экземпляру Milvus с помощью Milvus GO SDK и получите соответствующие результаты тестирования.
    4. +
    5. Создайте коллекцию.
    6. +
    7. Вставьте 1 миллион векторов SIFT. Создайте индекс HNSW и настройте параметры индекса, установив M на 8 и efConstruction на 200.
    8. +
    9. Загрузите коллекцию.
    10. +
    11. Выполните поиск с различным числом одновременных запросов с параметрами поиска nq=1, topk=1, ef=64, длительность каждого одновременного запроса не менее 1 часа.
    12. +
    +

    Результаты тестирования

    Milvus 2.2.0 против Milvus 2.1.0

    Кластер

    +Конфигурации серверов (кластер)yaml queryNode: replicas: 1 resources: limits: cpu: "12.0" memory: 8Gi requests: cpu: "12.0" memory: 8Gi

    +

    Производительность поиска

    + + + + + + + + +
    MilvusQPSRT(TP99) / мсRT(TP50) / мсотказ/с
    2.1.0690459280
    2.2.01024863240
    +

    + + Cluster search performance + Производительность кластерного поиска

    +

    Автономный

    +Конфигурации серверов (автономные)yaml standalone: replicas: 1 resources: limits: cpu: "12.0" memory: 16Gi requests: cpu: "12.0" memory: 16Gi

    +

    Производительность поиска

    + + + + + + + + +
    MilvusQPSRT(TP99) / мсRT(TP50) / мсотказ/с
    2.1.04287104760
    2.2.07522127790
    +

    + + Standalone search performance + Производительность автономного поиска

    +

    Milvus 2.2.0 Масштабирование

    Увеличьте количество процессорных ядер в одном Querynode, чтобы проверить возможность масштабирования.

    +

    +Конфигурации серверов (кластер)yaml queryNode: replicas: 1 resources: limits: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi requests: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi

    +

    Производительность поиска

    + + + + + + + + + + +
    Ядра процессораКоличество одновременныхQPSRT(TP99) / мсRT(TP50) / мсотказ/с
    85007153127830
    123001024863240
    166001413585420
    326002028163280
    +

    + + Search performance by Querynode CPU cores + Производительность поиска по процессорным ядрам Querynode

    +

    Milvus 2.2.0 Масштабирование

    Расширьте количество реплик с помощью большего числа Querynodes, чтобы проверить возможность масштабирования.

    +
    +

    Примечание: количество Querynodes равно replica_number при загрузке коллекции.

    +
    +

    +Конфигурации сервера (кластера)yaml queryNode: replicas: 1 / 2 / 4 / 8 resources: limits: cpu: "8.0" memory: 8Gi requests: cpu: "8.0" memory: 8Gi

    + + + + + + + + + + +
    РепликиКоличество одновременныхQPSRT(TP99) / мсRT(TP50) / мсотказ/с
    15007153127830
    250015903105270
    480019281109400
    812003065593380
    +

    + + Search performance by Querynode replicas + Производительность поиска по репликам Querynode

    +

    Что дальше

      +
    • Попробуйте самостоятельно выполнить эталонные тесты Milvus 2.2.0, обратившись к этому руководству, за исключением того, что в данном руководстве следует использовать Milvus 2.2 и Pymilvus 2.2.
    • +
    diff --git a/localization/v2.5.x/site/ru/reference/bitset.json b/localization/v2.5.x/site/ru/reference/bitset.json new file mode 100644 index 000000000..a18d13cca --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/bitset.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Bitset","anchorList":[{"label":"Биты","href":"Bitset","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Реализация","href":"Implementation","type":2,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/bitset.md b/localization/v2.5.x/site/ru/reference/bitset.md new file mode 100644 index 000000000..e0d7d6197 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/bitset.md @@ -0,0 +1,130 @@ +--- +id: bitset.md +summary: Узнайте о наборах битов в Milvus. +title: Биты +--- +

    Биты

    В этой теме рассказывается о механизме битовых наборов, который позволяет реализовать в Milvus такие ключевые функции, как фильтрация атрибутов и операции удаления.

    +

    Обзор

    Набор битов - это набор битов. Биты - это элементы, имеющие только два возможных значения, чаще всего 0 и 1, или булевы значения true и false. В Milvus наборы битов - это массивы битовых чисел 0 и 1, которые могут использоваться для компактного и эффективного представления определенных данных, в отличие от интов, плавающих чисел или символов. По умолчанию битовое число имеет значение 0 и устанавливается в значение 1 только в том случае, если оно удовлетворяет определенным требованиям.

    +

    Операции над наборами битов выполняются с помощью булевой логики, в соответствии с которой выходное значение является либо допустимым, либо недопустимым, также обозначаемым 1 и 0 соответственно. Например, логический оператор AND может использоваться для сравнения двух битовых наборов, основанных на элементах в одинаковых индексных позициях, и выдает новый битовый набор с результатами. Если два элемента в позиции одинаковы, то в новом битовом наборе в этой позиции будет записан 1, если различны - 0.

    +

    Реализация

    Биты - это простой, но мощный механизм, который помогает Milvus выполнять фильтрацию атрибутов, удаление данных и запросы с помощью Time Travel.

    +

    Фильтрация атрибутов

    Поскольку битовые наборы содержат только два возможных значения, они идеально подходят для хранения результатов фильтрации атрибутов. Данные, удовлетворяющие требованиям заданного фильтра атрибутов, помечаются 1.

    +

    Удаление данных

    Битовые наборы служат компактным способом хранения информации о том, удалена ли строка в сегменте. Удаленные сущности помечаются 1 в соответствующем битовом наборе, который не будет вычисляться во время поиска или запроса.

    +

    Примеры

    Здесь мы приводим три примера, иллюстрирующие использование битовых наборов в Milvus, со ссылками на все три основные реализации битовых наборов, рассмотренные выше. Во всех трех случаях имеется сегмент с 8 сущностями, а затем происходит серия событий языка манипулирования данными (DML) в порядке, показанном ниже.

    +
      +
    • Четыре сущности, чьи primary_keys равны [1, 2, 3, 4] соответственно, вставляются, когда временная метка ts равна 100.
    • +
    • Остальные четыре сущности, чьи primary_keys равны [5, 6, 7, 8], вставляются, когда временная метка ts равна 200.
    • +
    • Сущности, чьи primary_keys равны [7, 8], удаляются, когда временная метка ts равна 300.
    • +
    • Условиям фильтрации атрибутов удовлетворяют только сущности, чьи primary_keys равны [1, 3, 5, 7].
    • +
    +

    + + Order of DML events + Порядок событий DML

    +

    Случай первый

    В этом случае пользователь задает time_travel равным 150, что означает, что он выполняет запрос к данным, удовлетворяющим ts = 150. Процесс формирования набора битов показан на рисунке 1.

    +

    На начальном этапе фильтрации filter_bitset должен быть [1, 0, 1, 0, 1, 0, 1, 0], где сущности [1, 3, 5, 7] отмечены как 1, поскольку они являются действительными результатами фильтрации.

    +

    Однако сущности [4, 5, 6, 7] не были вставлены в базу данных векторов, когда ts равнялся 150. Поэтому эти четыре сущности должны быть помечены как 0 независимо от условия фильтрации. Теперь результат набора битов должен быть [1, 0, 1, 0, 0, 0, 0, 0].

    +

    Как обсуждалось в разделе "Удаление данных", сущности, помеченные 1, игнорируются при поиске или запросе. Теперь результат набора битов нужно перевернуть, чтобы объединить с битовой картой удаления, что дает нам [0, 1, 0, 1, 1, 1, 1, 1].

    +

    Что касается битового набора удаления del_bitset, то его начальным значением должно быть [0, 0, 0, 0, 0, 0, 1, 1]. Однако сущности 7 и 8 не удаляются до тех пор, пока ts не станет равным 300. Поэтому, когда ts равно 150, сущности 7 и 8 все еще действительны. В результате значение del_bitset после путешествия во времени равно [0, 0, 0, 0, 0, 0, 0, 0].

    +

    Теперь у нас есть два набора битов после Путешествия во времени и фильтрации атрибутов: filter_bitset [0, 1, 0, 1, 1, 1, 1, 1] и del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . Объединим эти два набора битов с помощью оператора двоичной логики OR. Конечное значение result_bitset равно [0, 1, 0, 1, 1, 1, 1, 1], что означает, что на следующем этапе поиска или запроса будут вычислены только сущности 1 и 3.

    +

    + + Figure 1. Search with Time Travel = 150. + Рисунок 1. Поиск с перемещением во времени = 150.

    +

    Случай второй

    В этом случае пользователь задает time_travel равным 250. Процесс генерации набора битов показан на рисунке 2.

    +

    Как и в первом случае, начальным filter_bitset является [1, 0, 1, 0, 1, 0, 1, 0].

    +

    Все сущности находятся в базе данных вектора, когда ts = 250. Таким образом, filter_bitset остается неизменным, когда мы учитываем временную метку. Снова нужно перевернуть результат и получить [0, 1, 0, 1, 0, 1, 0, 1].

    +

    Что касается набора битов удаления del_bitset, то его начальное значение - [0, 0, 0, 0, 0, 0, 1, 1]. Однако сущности 7 и 8 не были удалены до тех пор, пока ts не станет равным 300. Поэтому, когда ts равно 250, сущности 7 и 8 все еще действительны. В результате после путешествия во времени del_bitset будет [0, 0, 0, 0, 0, 0, 0, 0].

    +

    Теперь у нас есть два набора битов после Путешествия во времени и фильтрации атрибутов: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] и del_bitset [0, 0, 0, 0, 0, 0, 0, 0] . Объединим эти два набора битов с помощью оператора двоичной логики OR. Результат_битового набора - [0, 1, 0, 1, 0, 1, 0, 1]. Иными словами, на следующем этапе поиска или запроса будут вычислены только энтитеты [1, 3, 5, 7].

    +

    + + Figure 2. Search with Time Travel = 250. + Рисунок 2. Поиск с временным перемещением = 250.

    +

    Третий случай

    В этом случае пользователь задает time_travel равным 350. Процесс генерации набора битов проиллюстрирован на рисунке 3.

    +

    Как и в предыдущих случаях, начальным filter_bitset является [0, 1, 0, 1, 0, 1, 0, 1].

    +

    Все сущности находятся в базе данных вектора, когда ts= 350. Поэтому конечный, перевернутый filter_bitset - это [0, 1, 0, 1, 0, 1, 0, 1], как и во втором случае.

    +

    Что касается битового набора удаления del_bitset, то поскольку сущности 7 и 8 уже были удалены при ts = 350, поэтому результатом del_bitset будет [0, 0, 0, 0, 0, 0, 1, 1].

    +

    Теперь у нас есть два набора битов после путешествия во времени и фильтрации атрибутов: filter_bitset [0, 1, 0, 1, 0, 1, 0, 1] и del_bitset [0, 0, 0, 0, 0, 0, 1, 1] . Объединим эти два набора битов с помощью оператора двоичной логики OR. Конечный result_bitset - это [0, 1, 0, 1, 0, 1, 1, 1]. Иными словами, на следующем этапе поиска или запроса будут вычислены только сущности [1, 3, 5].

    +

    + + Figure 3. Search with Time Travel = 350. + Рисунок 3. Поиск с перемещением во времени = 350.

    +

    Что дальше

    Теперь, когда вы знаете, как работают битовые наборы в Milvus, вы также можете захотеть:

    + diff --git a/localization/v2.5.x/site/ru/reference/coordinator_ha.json b/localization/v2.5.x/site/ru/reference/coordinator_ha.json new file mode 100644 index 000000000..5e696db33 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/coordinator_ha.json @@ -0,0 +1 @@ +{"codeList":["rootCoordinator:\n enabled: true\n # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.\n replicas: 2 # Otherwise, remove this configuration item.\n resources: {}\n nodeSelector: {}\n affinity: {}\n tolerations: []\n extraEnv: []\n heaptrack:\n enabled: false\n profiling:\n enabled: false # Enable live profiling\n activeStandby:\n enabled: true # Set this to true to have RootCoordinators work in active-standby mode.\n"," rootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.2.3\n command: [\"milvus\", \"run\", \"rootcoord\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n PULSAR_ADDRESS: pulsar://pulsar:6650\n ROOT_COORD_ADDRESS: rootcoord:53100\n # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n depends_on:\n - \"etcd\"\n - \"pulsar\"\n - \"minio\"\n\n# add the following to have RootCoords work in active-standby mode\n# rootcoord-1:\n# container_name: milvus-rootcoord-1\n# image: milvusdb/milvus:v2.2.3\n# command: [\"milvus\", \"run\", \"rootcoord\"]\n# environment:\n# ETCD_ENDPOINTS: etcd:2379\n# MINIO_ADDRESS: minio:9000\n# PULSAR_ADDRESS: pulsar://pulsar:6650\n# ROOT_COORD_ADDRESS: rootcoord-1:53100\n# # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n# depends_on:\n# - \"etcd\"\n# - \"pulsar\"\n# - \"minio\"\n","sudo ./scripts/start_cluster.sh\n","rootCoord:\n address: localhost\n port: 53100 # change to 53001\n","sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &\n","ps aux|grep milvus\n","> ps aux|grep milvus\nroot 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord\nroot 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy\nroot 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord\n...\n","[INFO] [sessionutil/session_util.go:649] [\"serverName: rootcoord is in STANDBY ...\"]\n","[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord-15\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] [\"stop watching ACTIVE key\"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] [\"start retrying to register as ACTIVE service...\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] [\"register ACTIVE service successfully\"] [ServerID=19]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] [\"quit STANDBY mode, this node will become ACTIVE\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] [\"rootcoord switch from standby to active, activating\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] [\"RootCoord Register Finished\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] [\"RootCoord start done ...\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] [\"RootCoord successfully started\"]\n"],"headingContent":"Coordinator HA","anchorList":[{"label":"Координатор HA","href":"Coordinator-HA","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Включение координатора HA","href":"Enable-coordinator-HA","type":2,"isActive":false},{"label":"Связанные элементы конфигурации","href":"Related-configuration-items","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/coordinator_ha.md b/localization/v2.5.x/site/ru/reference/coordinator_ha.md new file mode 100644 index 000000000..25fb1b39a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/coordinator_ha.md @@ -0,0 +1,195 @@ +--- +id: coordinator_ha.md +summary: >- + Узнайте о мотивации и процедуре работы координаторов Milvus в режиме активной + готовности. +title: Координатор HA +--- +

    Координатор HA

    Как видно из архитектуры Milvus, он состоит из множества компонентов и работает распределенно. Среди всех компонентов Milvus обеспечивает высокую доступность рабочих узлов за счет увеличения и уменьшения масштаба узлов, делая координаторов единственным слабым звеном в цепи.

    +

    Обзор

    В выпуске 2.2.3 Milvus реализовал высокую доступность для координаторов, чтобы заставить их работать в режиме активного резерва, смягчая возможные единичные точки отказа (SPoF), которые могут привести к недоступности сервиса.

    +

    + + Coordinator HA + Координатор HA

    +

    На рисунке выше показано, как координаторы работают в режиме активного резерва. Когда запускается пара координаторов, они регистрируются в etcd, используя идентификатор своего сервера, и конкурируют за активную роль. Координатор, которому удастся арендовать активную роль у etcd, начнет обслуживание, а другой координатор в паре останется в режиме ожидания, наблюдая за активной ролью и готовый обслуживать ее в случае гибели активного координатора.

    +

    Включение координатора HA

    С помощью Helm

    Чтобы запустить несколько координаторов и заставить их работать в режиме активного ожидания, необходимо внести следующие изменения в файл values.yaml.

    +
      +
    • Установите xxxCoordinator.replicas в 2.
    • +
    • Установите xxxCoordinator.activeStandby.enabled на true.
    • +
    +

    В следующем фрагменте кода в качестве примера используется RootCoord. Вы можете сделать то же самое с координаторами других типов.

    +
    rootCoordinator:
    +  enabled: true
    +  # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.
    +  replicas: 2  # Otherwise, remove this configuration item.
    +  resources: {}
    +  nodeSelector: {}
    +  affinity: {}
    +  tolerations: []
    +  extraEnv: []
    +  heaptrack:
    +    enabled: false
    +  profiling:
    +    enabled: false  # Enable live profiling
    +  activeStandby:
    +    enabled: true  # Set this to true to have RootCoordinators work in active-standby mode.
    +
    +

    С помощью Docker

    Чтобы запустить несколько координаторов и заставить их работать в режиме активного ожидания, вы можете добавить несколько определений в файл docker-compose, который вы используете для запуска кластера Milvus.

    +

    В следующем фрагменте кода в качестве примера используется RootCoord. Вы можете сделать то же самое с координаторами других типов.

    +
      rootcoord:
    +    container_name: milvus-rootcoord
    +    image: milvusdb/milvus:v2.2.3
    +    command: ["milvus", "run", "rootcoord"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +      PULSAR_ADDRESS: pulsar://pulsar:6650
    +      ROOT_COORD_ADDRESS: rootcoord:53100
    +      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +    depends_on:
    +      - "etcd"
    +      - "pulsar"
    +      - "minio"
    +
    +#   add the following to have RootCoords work in active-standby mode
    +#   rootcoord-1:
    +#    container_name: milvus-rootcoord-1
    +#    image: milvusdb/milvus:v2.2.3
    +#    command: ["milvus", "run", "rootcoord"]
    +#    environment:
    +#      ETCD_ENDPOINTS: etcd:2379
    +#      MINIO_ADDRESS: minio:9000
    +#      PULSAR_ADDRESS: pulsar://pulsar:6650
    +#      ROOT_COORD_ADDRESS: rootcoord-1:53100
    +#      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +#      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +#    depends_on:
    +#      - "etcd"
    +#      - "pulsar"
    +#      - "minio"
    +
    +

    С помощью оболочки Mac/Linux

    Чтобы запустить несколько координаторов и заставить их работать в режиме активного ожидания, вы можете

    +
      +
    1. Загрузить исходный код Milvus на локальный диск и запустить кластер Milvus из исходного кода следующим образом:

      +
      sudo ./scripts/start_cluster.sh
      +
      +

      В конце этого шага Milvus работает только с одним координатором каждого типа.

    2. +
    3. Обновите milvus.yaml, чтобы изменить номер порта координатора каждого типа. Ниже в качестве примера используется rootCoord.

      +
      rootCoord:
      +  address: localhost
      +  port: 53100 # change to 53001
      +
    4. +
    5. Запустите резервный координатор.

      +
      sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
      +
      +

      В конце этого шага выполните следующую команду, чтобы убедиться в существовании двух процессов координатора.

      +
      ps aux|grep milvus
      +
      +

      Результат должен быть похож на

      +
      > ps aux|grep milvus
      +root        12813   0.7 0.2 410709648   82432   ??  S   5:18PM  0:33.28 ./bin/milvus run rootcoord
      +root        12816   0.5 0.2 409487968   62352   ??  S   5:18PM  0:22.69 ./bin/milvus run proxy
      +root        17739   0.1 0.3 410289872   91792 s003  SN  6:01PM  0:00.30 ./bin/milvus run rootcoord
      +...
      +
      +

      А резервный координатор каждые десять секунд выводит в журнал следующую запись:

      +
      [INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
      +
    6. +
    7. Убейте активного координатора в паре и понаблюдайте за поведением резервного координатора.

      +

      Вы можете обнаружить, что резервному координатору требуется 60 секунд, чтобы взять на себя роль активного.

      +
      [2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
      +
    8. +
    +

    По умолчанию функция Coordinator HA отключена. Вы можете включить эту функцию вручную, изменив следующие элементы в конфигурационном файле Milvus.

    + +

    Ограничения

    В настоящее время не существует надежной гарантии согласованности между активной и резервной службой. Поэтому резервный координатор должен перезагружать метаданные, принимая на себя роль активного.

    +

    Etcd освобождает аренду только после истечения времени текущей сессии. По умолчанию таймаут сессии составляет 60 секунд. Поэтому между смертью активного координатора и принятием активной роли резервным координатором существует 60-секундный промежуток.

    diff --git a/localization/v2.5.x/site/ru/reference/disk_index.json b/localization/v2.5.x/site/ru/reference/disk_index.json new file mode 100644 index 000000000..d1d2a27f9 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/disk_index.json @@ -0,0 +1 @@ +{"codeList":["...\nDiskIndex:\n MaxDegree: 56\n SearchListSize: 100\n PQCodeBugetGBRatio: 0.125\n SearchCacheBudgetGBRatio: 0.125\n BeamWidthRatio: 4.0\n...\n"],"headingContent":"On-disk Index","anchorList":[{"label":"Индекс на диске","href":"On-disk-Index","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"Настройки индекса и поиска","href":"Index-and-search-settings","type":2,"isActive":false},{"label":"Конфигурации Milvus, связанные с DiskANN","href":"DiskANN-related-Milvus-configurations","type":2,"isActive":false},{"label":"Устранение неполадок","href":"Troubleshooting","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/disk_index.md b/localization/v2.5.x/site/ru/reference/disk_index.md new file mode 100644 index 000000000..6bdd87bba --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/disk_index.md @@ -0,0 +1,159 @@ +--- +id: disk_index.md +related_key: disk_index +summary: Механизм дисковых индексов в Milvus. +title: Индекс на диске +--- +

    Индекс на диске

    В этой статье представлен алгоритм индексирования на диске под названием DiskANN. Основанный на графах Vamana, DiskANN обеспечивает эффективный поиск в больших наборах данных.

    +

    Чтобы повысить производительность запросов, можно указать тип индекса для каждого векторного поля.

    +
    +В настоящее время векторное поле поддерживает только один тип индекса. При переключении типа индекса Milvus автоматически удаляет старый индекс.
    +

    Необходимые условия

    Чтобы использовать DiskANN, обратите внимание, что

    +
      +
    • По умолчанию DiskANN отключен. Если вы предпочитаете индексы в памяти, а не на диске, рекомендуется отключить эту функцию для повышения производительности.
        +
      • Чтобы отключить ее, вы можете изменить queryNode.enableDisk на false в конфигурационном файле milvus.
      • +
      • Чтобы включить ее снова, вы можете установить queryNode.enableDisk на true.
      • +
    • +
    • Экземпляр Milvus работает на Ubuntu 18.04.6 или более поздней версии.
    • +
    • Для достижения полной производительности путь данных Milvus должен быть смонтирован на NVMe SSD:
        +
      • Для автономного экземпляра Milvus путь к данным должен быть /var/lib/milvus/data в контейнере, в котором работает экземпляр.
      • +
      • Для экземпляра Milvus Cluster путь к данным должен быть /var/lib/milvus/data в контейнерах, где работают QueryNodes и IndexNodes.
      • +
    • +
    +

    Ограничения

    Чтобы использовать DiskANN, убедитесь, что вы

    +
      +
    • Используйте в данных только векторы с плавающей точкой и размерностью не менее 1.
    • +
    • Для измерения расстояния между векторами используйте только евклидово расстояние (L2), внутреннее произведение (IP) или COSINE.
    • +
    +

    Настройки индекса и поиска

      +
    • Параметры построения индекса

      +

      При построении индекса DiskANN в качестве типа индекса используйте DISKANN. Параметры индекса не требуются.

    • +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      search_listРазмер списка кандидатов, больший размер обеспечивает более высокий процент запоминания с ухудшением производительности.[topk, int32_max].16
      +
    • +
    +

    DiskANN можно настраивать. Вы можете изменить параметры, связанные с DiskANN, в ${MILVUS_ROOT_PATH}/configs/milvus.yaml, чтобы улучшить его производительность.

    +
    ...
    +DiskIndex:
    +  MaxDegree: 56
    +  SearchListSize: 100
    +  PQCodeBugetGBRatio: 0.125
    +  SearchCacheBudgetGBRatio: 0.125
    +  BeamWidthRatio: 4.0
    +...
    +
    + + + + + + + + + + + +
    ПараметрОписаниеДиапазон значенийЗначение по умолчанию
    MaxDegreeМаксимальная степень графа Vamana.
    Большее значение обеспечивает более высокую скорость отзыва, но увеличивает размер и время построения индекса.
    [1, 512]56
    SearchListSizeРазмер списка кандидатов.
    Большее значение увеличивает время, затрачиваемое на построение индекса, но обеспечивает более высокий процент отзыва.
    Установите значение меньше, чем MaxDegree, если вам не нужно сокращать время построения индекса.
    [1, int32_max]100
    PQCodeBugetGBRatioОграничение на размер кода PQ.
    Большее значение обеспечивает более высокую скорость запоминания, но увеличивает потребление памяти.
    (0.0, 0.25]0.125
    SearchCacheBudgetGBRatioОтношение кэшированных номеров узлов к исходным данным.
    Большее значение повышает производительность построения индексов, но увеличивает расход памяти.
    [0.0, 0.3)0.10
    BeamWidthRatioСоотношение между максимальным количеством запросов ввода-вывода за итерацию поиска и количеством CPU.[1, max(128 / количество CPU, 16)]4.0
    +

    Устранение неполадок

      +
    • Как справиться с ошибкой io_setup() failed; returned -11, errno=11:Resource temporarily unavailable?

      +

      Ядро Linux предоставляет функцию асинхронного неблокирующего ввода/вывода (AIO), которая позволяет процессу инициировать несколько операций ввода/вывода одновременно, не дожидаясь завершения ни одной из них. Это помогает увеличить производительность приложений, которые могут совмещать обработку и ввод-вывод.

      +

      Производительность можно настроить с помощью виртуального файла /proc/sys/fs/aio-max-nr в файловой системе proc. Параметр aio-max-nr определяет максимальное количество допустимых одновременных запросов.

      +

      Параметр aio-max-nr по умолчанию равен 65535, вы можете установить его на 10485760.

    • +
    diff --git a/localization/v2.5.x/site/ru/reference/glossary.json b/localization/v2.5.x/site/ru/reference/glossary.json new file mode 100644 index 000000000..12e35dfc1 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/glossary.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Terminology","anchorList":[{"label":"Терминология","href":"Terminology","type":1,"isActive":false},{"label":"AutoID","href":"AutoID","type":2,"isActive":false},{"label":"Автоиндекс","href":"Auto-Index","type":2,"isActive":false},{"label":"Attu","href":"Attu","type":2,"isActive":false},{"label":"Birdwatcher","href":"Birdwatcher","type":2,"isActive":false},{"label":"Bulk Writer","href":"Bulk-Writer","type":2,"isActive":false},{"label":"Bulk Insert","href":"Bulk-Insert","type":2,"isActive":false},{"label":"Cardinal","href":"Cardinal","type":2,"isActive":false},{"label":"Канал","href":"Channel","type":2,"isActive":false},{"label":"Коллекция","href":"Collection","type":2,"isActive":false},{"label":"Зависимость","href":"Dependency","type":2,"isActive":false},{"label":"Динамическая схема","href":"Dynamic-schema","type":2,"isActive":false},{"label":"Встраивание","href":"Embeddings","type":2,"isActive":false},{"label":"Сущность","href":"Entity","type":2,"isActive":false},{"label":"Поле","href":"Field","type":2,"isActive":false},{"label":"Фильтр","href":"Filter","type":2,"isActive":false},{"label":"Фильтрованный поиск","href":"Filtered-search","type":2,"isActive":false},{"label":"Гибридный поиск","href":"Hybrid-search","type":2,"isActive":false},{"label":"Индекс","href":"Index","type":2,"isActive":false},{"label":"Коннектор Kafka-Milvus","href":"Kafka-Milvus-Connector","type":2,"isActive":false},{"label":"Knowhere","href":"Knowhere","type":2,"isActive":false},{"label":"Брокер журналов","href":"Log-broker","type":2,"isActive":false},{"label":"Снимок журнала","href":"Log-snapshot","type":2,"isActive":false},{"label":"Подписчик журнала","href":"Log-subscriber","type":2,"isActive":false},{"label":"Хранилище сообщений","href":"Message-storage","type":2,"isActive":false},{"label":"Тип метрики","href":"Metric-type","type":2,"isActive":false},{"label":"Mmap","href":"Mmap","type":2,"isActive":false},{"label":"Резервное копирование Milvus","href":"Milvus-Backup","type":2,"isActive":false},{"label":"Milvus CDC","href":"Milvus-CDC","type":2,"isActive":false},{"label":"Milvus CLI","href":"Milvus-CLI","type":2,"isActive":false},{"label":"Milvus Migration","href":"Milvus-Migration","type":2,"isActive":false},{"label":"Кластер Milvus","href":"Milvus-cluster","type":2,"isActive":false},{"label":"Автономный Milvus","href":"Milvus-standalone","type":2,"isActive":false},{"label":"Многовекторный","href":"Multi-Vector","type":2,"isActive":false},{"label":"Разделы","href":"Partition","type":2,"isActive":false},{"label":"Ключ раздела","href":"Partition-key","type":2,"isActive":false},{"label":"PChannel","href":"PChannel","type":2,"isActive":false},{"label":"PyMilvus","href":"PyMilvus","type":2,"isActive":false},{"label":"Query","href":"Query","type":2,"isActive":false},{"label":"Поиск по диапазону","href":"Range-search","type":2,"isActive":false},{"label":"Схема","href":"Schema","type":2,"isActive":false},{"label":"Поиск","href":"Search","type":2,"isActive":false},{"label":"Сегмент","href":"Segment","type":2,"isActive":false},{"label":"Spark-Milvus Connector","href":"Spark-Milvus-Connector","type":2,"isActive":false},{"label":"Shard","href":"Shard","type":2,"isActive":false},{"label":"Разрозненный вектор","href":"Sparse-vector","type":2,"isActive":false},{"label":"Неструктурированные данные","href":"Unstructured-data","type":2,"isActive":false},{"label":"VChannel","href":"VChannel","type":2,"isActive":false},{"label":"Вектор","href":"Vector","type":2,"isActive":false},{"label":"Облако Zilliz","href":"Zilliz-Cloud","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/glossary.md b/localization/v2.5.x/site/ru/reference/glossary.md new file mode 100644 index 000000000..ad2085368 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/glossary.md @@ -0,0 +1,806 @@ +--- +id: glossary.md +title: Терминология +--- +

    Терминология

    AutoID

    AutoID - это атрибут первичного поля, определяющий, нужно ли включать автоприращение для первичного поля. Значение AutoID определяется на основе временной метки. Дополнительные сведения см. в разделе create_schema.

    +

    Автоиндекс

    Milvus автоматически определяет наиболее подходящий тип индекса и параметры для конкретного поля, основываясь на эмпирических данных. Это идеально подходит для ситуаций, когда вам не нужно контролировать конкретные параметры индекса. Дополнительную информацию см. в разделе add_index.

    +

    Attu

    Attu - это универсальный инструмент администрирования для Milvus, который значительно снижает сложность и стоимость управления системой.

    +

    Birdwatcher

    Birdwatcher - это отладочный инструмент для Milvus, который подключается к etcd, позволяя вам следить за состоянием сервера Milvus и вносить коррективы в режиме реального времени. Он также поддерживает резервное копирование файлов etcd, помогая разработчикам в устранении неполадок.

    +

    Bulk Writer

    Bulk Writer - это инструмент обработки данных, предоставляемый в SDK Milvus (например, PyMilvus, Java SDK), предназначенный для преобразования необработанных наборов данных в формат, совместимый с Milvus, для эффективного импорта.

    +

    Bulk Insert

    Bulk Insert - это API, который повышает производительность записи, позволяя импортировать несколько файлов за один запрос, оптимизируя операции с большими наборами данных.

    +

    Cardinal

    Cardinal, разработанный Zilliz Cloud, - это передовой алгоритм векторного поиска, обеспечивающий непревзойденное качество и производительность поиска. Благодаря инновационному дизайну и широким возможностям оптимизации Cardinal превосходит Knowhere от нескольких раз до порядка величины, адаптируясь к различным сценариям работы, таким как переменный размер K, высокая степень фильтрации, различные распределения данных и т. д.

    +

    Канал

    Milvus использует два типа каналов, PChannel и VChannel. Каждый PChannel соответствует теме для хранения журнала, а каждый VChannel - шарду в коллекции.

    +

    Коллекция

    В Milvus коллекция эквивалентна таблице в реляционной системе управления базами данных (RDBMS). Коллекции - это основные логические объекты, используемые для хранения и управления сущностями. Для получения дополнительной информации см. раздел Управление коллекциями.

    +

    Зависимость

    Зависимость - это программа, работа которой зависит от другой программы. Зависимости Milvus включают etcd (хранит метаданные), MinIO или S3 (хранилище объектов) и Pulsar (управляет журналами моментальных снимков). Дополнительную информацию см. в разделе Управление зависимостями.

    +

    Динамическая схема

    Динамическая схема позволяет вставлять в коллекцию сущности с новыми полями, не изменяя существующую схему. Это означает, что вы можете вставлять данные, не зная полной схемы коллекции, и включать в нее поля, которые еще не определены. Вы можете включить эту возможность без схемы, включив динамическое поле при создании коллекции. Дополнительные сведения см. в разделе Включение динамического поля.

    +

    Встраивание

    Milvus предлагает встроенные функции встраивания, которые работают с популярными провайдерами встраивания. Перед созданием коллекции в Milvus вы можете использовать эти функции для создания вкраплений для ваших наборов данных, что упростит процесс подготовки данных и векторного поиска. Чтобы увидеть создание вкраплений в действии, обратитесь к разделу "Использование модели PyMilvus для генерации вкраплений текста".

    +

    Сущность

    Сущность состоит из группы полей, которые представляют объекты реального мира. Каждая сущность в Milvus представлена уникальным первичным ключом.

    +

    Вы можете настроить первичные ключи. Если вы не настраиваете вручную, Milvus автоматически назначает первичный ключ сущностям. Если вы решили настроить первичный ключ, обратите внимание, что Milvus пока не поддерживает дедупликацию первичных ключей. Поэтому в одной коллекции могут существовать дубликаты первичных ключей. Дополнительные сведения см. в разделе "Вставка сущностей".

    +

    Поле

    Поле в коллекции Milvus эквивалентно столбцу таблицы в РСУБД. Поля могут быть либо скалярными для структурированных данных (например, чисел, строк), либо векторными для встраивания векторов.

    +

    Фильтр

    Milvus поддерживает скалярную фильтрацию путем поиска с предикатами, что позволяет определять условия фильтрации в запросах и поиске для уточнения результатов.

    +

    Фильтрованный поиск применяет скалярные фильтры к векторному поиску, позволяя уточнять результаты поиска на основе определенных критериев. Дополнительные сведения см. в разделе Фильтрованный поиск.

    +

    Гибридный поиск - это API для гибридного поиска, начиная с версии Milvus 2.4.0. Вы можете искать по нескольким векторным полям и объединять их. Векторный поиск в сочетании с фильтрацией скалярных полей называется "фильтрованный поиск". Для получения дополнительной информации обратитесь к разделу "Гибридный поиск".

    +

    Индекс

    Векторный индекс - это реорганизованная структура данных, полученная из исходных данных, которая может значительно ускорить процесс поиска векторного сходства. Milvus поддерживает широкий спектр типов индексов как для векторных, так и для скалярных полей. Дополнительную информацию см. в разделе Типы векторных индексов.

    +

    Коннектор Kafka-Milvus

    Kafka-Milvus Connector - это коннектор Kafka для Milvus. Он позволяет передавать векторные данные из Kafka в Milvus.

    +

    Knowhere

    Knowhere - это основной механизм выполнения векторов в Milvus, который включает в себя несколько библиотек поиска векторного сходства, в том числе Faiss, Hnswlib и Annoy. Knowhere также разработан для поддержки гетерогенных вычислений. Она контролирует, на каком оборудовании (CPU или GPU) выполнять запросы на создание индекса и поиск. Именно так Knowhere получила свое название - знание того, где выполнять операции.

    +

    Брокер журналов

    Брокер журналов - это система публикации-подписки, поддерживающая воспроизведение. Он отвечает за сохранение потоковых данных, выполнение надежных асинхронных запросов, уведомление о событиях и возврат результатов запросов. Он также обеспечивает целостность инкрементных данных при восстановлении рабочих узлов после сбоев в системе.

    +

    Снимок журнала

    Снимок журнала - это двоичный журнал, меньшая единица сегмента, которая записывает и обрабатывает обновления и изменения, внесенные в данные в Milvus. Данные из сегмента хранятся в нескольких бинлогах. В Milvus существует три типа бинлогов: InsertBinlog, DeleteBinlog и DDLBinlog. Дополнительную информацию см. в разделе Метахранилище.

    +

    Подписчик журнала

    Подписчики журналов подписываются на последовательность журналов для обновления локальных данных и предоставления услуг в виде копий только для чтения.

    +

    Хранилище сообщений

    Хранилище сообщений - это механизм хранения журналов в Milvus. В качестве хранилища сообщений Milvus поддерживает Kafka или Pulsa. Дополнительные сведения см. в разделе Настройка хранилища сообщений.

    +

    Тип метрики

    Типы метрик сходства используются для измерения сходства между векторами. В настоящее время Milvus поддерживает евклидово расстояние (L2), внутреннее произведение (IP), косинусное сходство (COSINE) и бинарные типы метрик. Вы можете выбрать наиболее подходящий тип метрики в зависимости от вашего сценария. Дополнительные сведения см. в разделе Метрики сходства.

    +

    Mmap

    Файлы с отображением в памяти позволяют эффективно работать с данными, отображая содержимое файла непосредственно в памяти. Это особенно полезно, когда память ограничена и загрузка всех данных невозможна. Эта техника позволяет увеличить объем данных и сохранить производительность до определенного уровня. Однако если объем данных значительно превышает объем памяти, скорость поиска и запросов может значительно снизиться. Дополнительные сведения см. в разделе Хранение данных с поддержкой MMap.

    +

    Резервное копирование Milvus

    Milvus Backup - это инструмент для создания копий данных, которые можно использовать для восстановления оригинала после потери данных.

    +

    Milvus CDC

    Milvus CDC (Change data capture) - это удобный инструмент, который позволяет захватывать и синхронизировать инкрементные данные в экземплярах Milvus. Он обеспечивает надежность бизнес-данных, беспрепятственно перенося их между исходным и целевым экземплярами, что позволяет легко выполнять инкрементное резервное копирование и аварийное восстановление.

    +

    Milvus CLI

    Milvus Command-Line Interface (CLI) - это инструмент командной строки, который поддерживает подключение к базе данных, операции с данными, а также импорт и экспорт данных. Основанный на Milvus Python SDK, он позволяет выполнять команды через терминал с помощью интерактивных подсказок командной строки.

    +

    Milvus Migration

    Milvus Migration - это инструмент с открытым исходным кодом, предназначенный для облегчения миграции данных из различных источников данных в Milvus 2.x.

    +

    Кластер Milvus

    При кластерном развертывании Milvus сервисы предоставляются группой узлов для достижения высокой доступности и легкой масштабируемости.

    +

    Автономный Milvus

    При автономном развертывании Milvus все операции, включая вставку данных, создание индекса и поиск векторного сходства, выполняются в рамках одного процесса.

    +

    Многовекторный

    Начиная с версии 2.4.0 Milvus поддерживает несколько векторных полей в одной коллекции. Дополнительную информацию см. в разделе Гибридный поиск.

    +

    Разделы

    Раздел - это разделение коллекции. Milvus поддерживает разделение данных коллекции на несколько частей на физическом хранилище. Этот процесс называется разделением, и каждый раздел может содержать несколько сегментов. Дополнительные сведения см. в разделе Управление разделами.

    +

    Ключ раздела

    Атрибут ключа раздела поля позволяет разделить сущности на отдельные разделы на основе значений их ключей разделов. Такая группировка гарантирует, что сущности с одинаковым значением ключа будут храниться вместе, что может ускорить поисковые операции, позволяя системе обходить нерелевантные разделы при запросах, отфильтрованных по полю ключа раздела. Дополнительные сведения см. в разделе Использование ключа раздела.

    +

    PChannel

    PChannel означает физический канал. Каждый PChannel соответствует теме для хранения журнала. По умолчанию группа из 16 каналов PChannel будет назначена для хранения журналов, которые регистрируют вставку, удаление и обновление данных при запуске кластера Milvus. Дополнительные сведения см. в разделе Конфигурации, связанные с каналами сообщений.

    +

    PyMilvus

    PyMilvus - это Python SDK для Milvus. Его исходный код находится в открытом доступе и размещен на GitHub. Вы можете выбрать MilvusClient (новая версия Python SDK) или оригинальный модуль ORM для взаимодействия с Milvus.

    +

    Query

    Query - это API, который выполняет скалярную фильтрацию с указанным булевым выражением в качестве фильтра. Для получения дополнительной информации обратитесь к разделу Get & Scalar Query.

    +

    Поиск по диапазону позволяет находить векторы, лежащие на заданном расстоянии от искомого вектора. Дополнительные сведения см. в разделе Поиск в диапазоне.

    +

    Схема

    Схема - это метаинформация, определяющая тип данных и их свойства. Каждая коллекция имеет собственную схему коллекции, в которой определены все поля коллекции, автоматический идентификатор (первичный ключ), возможность распределения и описание коллекции. Схемы полей также включены в схемы коллекций, в которых определяются имя, тип данных и другие свойства поля. Дополнительные сведения см. в разделе Управление схемой.

    +

    Поиск - это API, выполняющий операцию поиска векторного сходства, для выполнения которой требуются векторные данные. Дополнительные сведения см. в разделе Одновекторный поиск.

    +

    Сегмент

    Сегмент - это автоматически создаваемый файл данных, в котором хранятся вставленные данные. Коллекция может содержать несколько сегментов, и каждый сегмент может содержать множество сущностей. Во время поиска векторного сходства Milvus просматривает каждый сегмент для составления результатов поиска.

    +

    Существует два типа сегментов: растущие и закрытые. Растущий сегмент продолжает собирать новые данные до тех пор, пока не достигнет определенного порога или временного ограничения, после чего он становится закрытым. После запечатывания сегмент больше не принимает новые данные и переносится в объектное хранилище. Тем временем входящие данные направляются в новый растущий сегмент. Переход из растущего сегмента в закрытый происходит либо при достижении заданного предела сущности, либо при превышении максимально допустимой продолжительности нахождения в состоянии роста. Дополнительную информацию см. в разделе Детали проектирования.

    +

    Spark-Milvus Connector

    Spark-Milvus Connector обеспечивает бесшовную интеграцию между Apache Spark и Milvus, объединяя функции обработки данных и машинного обучения (ML) Apache Spark с возможностями хранения векторных данных и поиска в Milvus.

    +

    Shard

    Milvus повышает производительность записи данных, распределяя операции записи по нескольким узлам с помощью шардов, которые организованы на основе хэширования первичных ключей. При этом задействуются возможности параллельных вычислений кластера.

    +

    Разбиение на разделы позволяет снизить нагрузку на чтение за счет указания имени раздела, а разделение на разделы распределяет нагрузку на запись между несколькими серверами.

    +

    Разрозненный вектор

    Разреженные векторы представляют слова или фразы с помощью векторных вкраплений, в которых большинство элементов равны нулю, и только один ненулевой элемент указывает на присутствие конкретного слова. Модели с разреженными векторами, такие как SPLADEv2, превосходят модели с плотными векторами в поиске знаний за пределами области, понимании ключевых слов и интерпретируемости. Дополнительную информацию см. в разделе "Разреженные векторы".

    +

    Неструктурированные данные

    Неструктурированные данные, включая изображения, видео, аудио и естественный язык, - это информация, которая не имеет заранее определенной модели или способа организации. На этот тип данных приходится около 80 % всех данных в мире, и они могут быть преобразованы в векторы с помощью различных моделей искусственного интеллекта (ИИ) и ML.

    +

    VChannel

    VChannel означает логический канал. Каждый VChannel представляет собой осколок в коллекции. Каждой коллекции назначается группа каналов VChannel для регистрации вставки, удаления и обновления данных. Каналы VChannel логически разделены, но физически имеют общие ресурсы.

    +

    Вектор

    Вектор встраивания - это абстракция неструктурированных данных, таких как электронные письма, данные датчиков IoT, фотографии из Instagram, структуры белков и т. д. С математической точки зрения, вектор встраивания - это массив чисел с плавающей точкой или двоичных чисел. Современные методы встраивания используются для преобразования неструктурированных данных в векторы встраивания. Milvus поддерживает как плотные, так и разреженные векторы, начиная с версии 2.4.0.

    +

    Облако Zilliz

    Полностью управляемый Milvus в облаке Zilliz Cloud, с более широкими корпоративными возможностями и высоко оптимизированной производительностью.

    diff --git a/localization/v2.5.x/site/ru/reference/gpu_index.json b/localization/v2.5.x/site/ru/reference/gpu_index.json new file mode 100644 index 000000000..00a710065 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/gpu_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"GPU Index","anchorList":[{"label":"Индекс GPU","href":"GPU-Index","type":1,"isActive":false},{"label":"GPU_CAGRA","href":"GPUCAGRA","type":2,"isActive":false},{"label":"GPU_IVF_FLAT","href":"GPUIVFFLAT","type":2,"isActive":false},{"label":"GPU_IVF_PQ","href":"GPUIVFPQ","type":2,"isActive":false},{"label":"GPU_BRUTE_FORCE","href":"GPUBRUTEFORCE","type":2,"isActive":false},{"label":"Заключение","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/gpu_index.md b/localization/v2.5.x/site/ru/reference/gpu_index.md new file mode 100644 index 000000000..3386e7322 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/gpu_index.md @@ -0,0 +1,239 @@ +--- +id: gpu_index.md +related_key: gpu_index +summary: Механизм индексации GPU в Milvus. +title: Индекс GPU +--- +

    Индекс GPU

    Milvus поддерживает различные типы GPU-индексов для повышения производительности и эффективности поиска, особенно в сценариях с высокой пропускной способностью и большим количеством обращений. В этой теме представлен обзор типов GPU-индексов, поддерживаемых Milvus, их подходящих вариантов использования и характеристик производительности. Информацию о создании индексов с помощью GPU см. в разделе Индекс с GPU.

    +

    Важно отметить, что использование GPU-индекса не обязательно снизит задержку по сравнению с использованием CPU-индекса. Если вы хотите полностью увеличить пропускную способность, вам потребуется очень высокое давление запросов или большое количество векторов запросов.

    +

    + + performance + производительность

    +

    Поддержка GPU в Milvus обеспечивается командой Nvidia RAPIDS. Ниже перечислены типы GPU-индексов, поддерживаемые Milvus в настоящее время.

    +

    GPU_CAGRA

    GPU_CAGRA - это графовый индекс, оптимизированный для GPU. Использование GPU класса inference для запуска GPU-версии Milvus может быть более экономичным по сравнению с использованием дорогих GPU класса training.

    +
      +
    • Параметры построения индекса

      + + + + + + + + + + + +
      ПараметрОписаниеЗначение по умолчанию
      intermediate_graph_degreeВлияет на запоминание и время построения, определяя степень графа перед обрезкой. Рекомендуемые значения: 32 или 64.128
      graph_degreeВлияет на производительность поиска и запоминание, определяя степень графа после обрезки. Большая разница между этими двумя степенями приводит к увеличению времени построения. Его значение должно быть меньше значения intermediate_graph_degree.64
      build_algoВыбирает алгоритм генерации графа перед обрезкой. Возможные значения:
      IVF_PQ: : Обеспечивает более высокое качество, но меньшее время построения.
      NN_DESCENT: Обеспечивает более быстрое построение с потенциально более низким отзывом.
      IVF_PQ
      cache_dataset_on_deviceРешает, кэшировать ли исходный набор данных в памяти GPU. Возможные значения:
      “true”: Кэширует исходный набор данных, чтобы повысить запоминаемость за счет уточнения результатов поиска.
      “false”: Не кэширует исходный набор данных для экономии памяти GPU.
      “false”
      adapt_for_cpuОпределяет, использовать ли GPU для построения индексов и CPU для поиска.
      Установка этого параметра в значение true требует наличия параметра ef в поисковых запросах.
      “false”
      +
    • +
    • Параметры поиска

      + + + + + + + + + + + +
      ПараметрОписаниеЗначение по умолчанию
      itopk_sizeОпределяет размер промежуточных результатов, сохраняемых во время поиска. Большее значение может улучшить запоминание за счет снижения производительности поиска. Оно должно быть, по крайней мере, равно конечному значению top-k (limit) и, как правило, равно 2 (например, 16, 32, 64, 128).Пустой
      search_widthОпределяет количество точек входа в граф CAGRA во время поиска. Увеличение этого значения может улучшить запоминание, но может повлиять на производительность поиска (например, 1, 2, 4, 8, 16, 32).Empty
      min_iterations / max_iterationsУправляет процессом итерации поиска. По умолчанию они установлены на 0, и CAGRA автоматически определяет количество итераций на основе itopk_size и search_width. Настройка этих значений вручную может помочь сбалансировать производительность и точность.0
      team_sizeУказывает количество потоков CUDA, используемых для вычисления метрического расстояния на GPU. Обычные значения - от 2 до 32 (например, 2, 4, 8, 16, 32). Это значение незначительно влияет на производительность поиска. По умолчанию используется значение 0, при котором Milvus автоматически выбирает team_size в зависимости от размерности вектора.0
      efОпределяет компромисс между временем запроса и точностью. Более высокое значение ef приводит к более точному, но более медленному поиску.
      Этот параметр обязателен, если при построении индекса вы установили adapt_for_cpu на true.
      [top_k, int_max]
      +
    • +
    +
      +
    • Ограничения на поиск

      + + + + + + + + +
      ПараметрДиапазон
      limit (top-K)<= 1024
      limit (top-K)<=max((itopk_size + 31)// 32, search_width) * 32
      +
    • +
    +

    GPU_IVF_FLAT

    Подобно IVF_FLAT, GPU_IVF_FLAT также делит векторные данные на кластеры nlist, а затем сравнивает расстояния между целевым входным вектором и центром каждого кластера. В зависимости от количества кластеров, к которым система настроена на запрос (nprobe), результаты поиска сходства возвращаются на основе сравнений между целевым входным вектором и векторами только в наиболее похожих кластерах, что значительно сокращает время запроса.

    +

    Настраивая nprobe, можно найти идеальный баланс между точностью и скоростью для конкретного сценария. Результаты тестирования производительности IVF_FLAT показывают, что время выполнения запроса резко увеличивается как при увеличении количества векторов целевого входа (nq), так и при увеличении количества кластеров для поиска (nprobe).

    +

    GPU_IVF_FLAT - это самый базовый ЭКО-индекс, и закодированные данные, хранящиеся в каждом блоке, соответствуют исходным данным.

    +

    При проведении поиска следует учитывать, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно задать top-K до 256.

    +
      +
    • Параметры построения индекса

      + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      nlistКоличество единиц кластера[1, 65536]128
      cache_dataset_on_deviceОпределяет, нужно ли кэшировать исходный набор данных в памяти GPU. Возможные значения:
      “true”: Кэширует исходный набор данных для улучшения запоминания путем уточнения результатов поиска.
      “false”: Не кэшировать исходный набор данных для экономии памяти графического процессора.
      "true" "flase""false"
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
    • +
    • Ограничения на поиск

      + + + + + + + +
      ПараметрДиапазон
      limit (top-K)<= 2048
      +
    • +
    +

    GPU_IVF_PQ

    PQ (Product Quantization) равномерно разлагает исходное высокоразмерное векторное пространство на декартово произведение m низкоразмерных векторных пространств, а затем квантует разложенные низкоразмерные векторные пространства. Вместо вычисления расстояний между целевым вектором и центром всех единиц, квантование по продуктам позволяет вычислять расстояния между целевым вектором и центром кластеризации каждого низкоразмерного пространства и значительно сокращает временную и пространственную сложность алгоритма.

    +

    IVF_PQ выполняет кластеризацию индекса ЭКО перед квантованием произведения векторов. Его индексный файл еще меньше, чем у IVF_SQ8, но это также приводит к потере точности при поиске векторов.

    +
    +

    Параметры построения индекса и параметры поиска зависят от дистрибутива Milvus. Сначала выберите свой дистрибутив Milvus.

    +

    При поиске обратите внимание, что для любого поиска по коллекции, проиндексированной GPU_IVF_FLAT, можно установить top-K до 8192.

    +
    +
      +
    • Параметры построения индекса

      + + + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      nlistКоличество единиц кластера[1, 65536]128
      mКоличество коэффициентов квантования произведения,dim mod m or = 00
      nbits[Необязательно] Количество бит, в которых хранится каждый низкоразмерный вектор.[1, 16]8
      cache_dataset_on_deviceОпределяет, нужно ли кэшировать исходный набор данных в памяти GPU. Возможные значения:
      “true”: Кэширует исходный набор данных для улучшения запоминания путем уточнения результатов поиска.
      “false”: Не кэшировать исходный набор данных для экономии памяти графического процессора.
      "true" "false""false"
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
    • +
    • Ограничения на поиск

      + + + + + + + +
      ПараметрДиапазон
      limit (top-K)<= 1024
      +
    • +
    +

    GPU_BRUTE_FORCE

    GPU_BRUTE_FORCE предназначен для случаев, когда крайне важен высокий отзыв, гарантируя отзыв, равный 1, путем сравнения каждого запроса со всеми векторами в наборе данных. В качестве параметров построения индекса и поиска ему требуются только тип метрики (metric_type) и top-k (limit).

    +

    Для GPU_BRUTE_FORCE дополнительные параметры построения индекса и поиска не требуются.

    +

    Заключение

    В настоящее время Milvus загружает все индексы в память GPU для эффективной работы поиска. Объем загружаемых данных зависит от размера памяти GPU:

    +
      +
    • GPU_CAGRA: использование памяти примерно в 1,8 раза больше, чем исходные векторные данные.
    • +
    • GPU_IVF_FLAT и GPU_BRUTE_FORCE: Требуется память, равная размеру исходных данных.
    • +
    • GPU_IVF_PQ: Использует меньший объем памяти, который зависит от настроек параметров сжатия.
    • +
    diff --git a/localization/v2.5.x/site/ru/reference/index.json b/localization/v2.5.x/site/ru/reference/index.json new file mode 100644 index 000000000..fdf66e905 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-memory Index","anchorList":[{"label":"Индекс в памяти","href":"In-memory-Index","type":1,"isActive":false},{"label":"Векторные индексы ANNS","href":"ANNS-vector-indexes","type":2,"isActive":false},{"label":"Индексы, поддерживаемые в Milvus","href":"Indexes-supported-in-Milvus","type":2,"isActive":false},{"label":"FAQ","href":"FAQ","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/index.md b/localization/v2.5.x/site/ru/reference/index.md new file mode 100644 index 000000000..b1b300390 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/index.md @@ -0,0 +1,679 @@ +--- +id: index.md +related_key: index +summary: Индексный механизм в Милвусе. +title: Индекс в памяти +--- +

    Индекс в памяти

    В этой теме перечислены различные типы индексов in-memory, которые поддерживает Milvus, сценарии, для которых каждый из них подходит лучше всего, и параметры, которые пользователи могут настроить для достижения лучшей производительности поиска. Об индексах на диске см. в разделе Индекс на диске.

    +

    Индексирование - это процесс эффективной организации данных, и оно играет важную роль в обеспечении полезности поиска по сходству, значительно ускоряя трудоемкие запросы к большим наборам данных.

    +

    Чтобы повысить производительность запросов, можно указать тип индекса для каждого векторного поля.

    +
    +В настоящее время векторное поле поддерживает только один тип индекса. При переключении типа индекса Milvus автоматически удаляет старый индекс.
    +

    Векторные индексы ANNS

    Большинство типов векторных индексов, поддерживаемых Milvus, используют алгоритмы приближенного поиска ближайших соседей (ANNS). По сравнению с точным поиском, который обычно занимает много времени, основная идея ANNS заключается не в возвращении наиболее точного результата, а только в поиске соседей цели. ANNS повышает эффективность поиска, жертвуя точностью в приемлемом диапазоне.

    +

    В соответствии с методами реализации, векторный индекс ANNS можно разделить на четыре типа: основанные на деревьях, основанные на графах, основанные на хэшах и основанные на квантовании.

    +

    Индексы, поддерживаемые в Milvus

    Milvus поддерживает различные типы индексов, которые делятся по типу векторных вложений, с которыми они работают: вложения с плавающей точкой (также известные как векторы с плавающей точкой или плотные векторы), двоичные вложения (также известные как двоичные векторы) и разреженные вложения (также известные как разреженные векторы).

    + +
    +

    Индексы для вкраплений с плавающей точкой

    Для 128-мерных вкраплений (векторов) с плавающей точкой объем памяти, который они занимают, составляет 128 * размер float = 512 байт. А метрики расстояния, используемые для вкраплений с плавающей точкой, - это евклидово расстояние (L2) и внутреннее произведение (IP).

    +

    К таким типам индексов относятся FLAT, IVF_FLAT, IVF_PQ, IVF_SQ8, HNSW, HNSW_SQ, HNSW_PQ, HNSW_PRQ, и SCANN для поиска ANN на базе процессора.

    +
    +
    +

    Индексы для бинарных вкраплений

    Для 128-мерных бинарных вкраплений объем памяти, который они занимают, составляет 128 / 8 = 16 байт. В качестве метрики расстояния для бинарных вкраплений используются JACCARD и HAMMING.

    +

    К этому типу индексов относятся BIN_FLAT и BIN_IVF_FLAT.

    +
    +
    +

    Индексы для разреженных вкраплений

    Индексы для разреженных вкраплений поддерживают только метрики IP и BM25 (для полнотекстового поиска).

    +

    Типы индексов включают SPARSE_INVERTED_INDEX и SPARSE_WAND.

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Поддерживаемый индексКлассификацияСценарий
    FLATN/A +
      +
    • Относительно небольшой набор данных
    • +
    • Требуется 100-процентный коэффициент отзыва
    • +
    +
    ЭКО_FLATN/A +
      +
    • Высокоскоростной запрос
    • +
    • Требуется как можно более высокая скорость запоминания
    • +
    +
    IVF_SQ8Индекс на основе квантования +
      +
    • Очень высокоскоростной запрос
    • +
    • Ограниченные ресурсы памяти
    • +
    • Допускает незначительный компромисс в скорости запоминания
    • +
    +
    IVF_PQИндекс на основе квантования +
      +
    • Высокоскоростной запрос
    • +
    • Ограниченные ресурсы памяти
    • +
    • Допускает незначительный компромисс в скорости запоминания
    • +
    +
    HNSWИндекс на основе графов +
      +
    • Очень высокоскоростной запрос
    • +
    • Требуется как можно более высокая скорость запоминания
    • +
    • Большие ресурсы памяти
    • +
    +
    HNSW_SQИндекс на основе квантования +
      +
    • Очень высокоскоростной запрос
    • +
    • Ограниченные ресурсы памяти
    • +
    • Допускает незначительный компромисс в скорости запоминания
    • +
    +
    HNSW_PQИндекс на основе квантования +
      +
    • Среднескоростной запрос
    • +
    • Очень ограниченные ресурсы памяти
    • +
    • Допускает незначительный компромисс в скорости запоминания
    • +
    +
    HNSW_PRQИндекс на основе квантования +
      +
    • Запрос со средней скоростью
    • +
    • Очень ограниченные ресурсы памяти
    • +
    • Допускает незначительный компромисс в скорости запоминания
    • +
    +
    SCANNИндекс на основе квантования +
      +
    • Очень высокоскоростной запрос
    • +
    • Требуется как можно более высокая скорость запоминания
    • +
    • Большие ресурсы памяти
    • +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Поддерживаемый индексКлассификацияСценарий
    BIN_FLATИндекс на основе квантования
      +
    • Зависит от относительно небольших наборов данных.
    • +
    • Требуется идеальная точность.
    • +
    • Сжатие не применяется.
    • +
    • Гарантирует точные результаты поиска.
    • +
    BIN_IVF_FLATИндекс на основе квантования
      +
    • Высокоскоростной запрос
    • +
    • Требуется как можно более высокий коэффициент отзыва
    • +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    Поддерживаемый индексКлассификацияСценарий
    РАЗРЕЖЕННЫЙ_ИНВЕРТИРОВАННЫЙ_ИНДЕКСИнвертированный индекс
      +
    • Зависит от относительно небольших наборов данных.
    • +
    • Требуется 100-процентный коэффициент отзыва.
    • +
    SPARSE_WANDИнвертированный индекс
      +
    • Ускоренныйслабый алгоритм
    • +
    • Можно добиться значительного повышения скорости, жертвуя при этом лишь небольшим показателем запоминания.
    • +
    +
    +
    +

    FLAT

    Для приложений поиска векторного сходства, требующих идеальной точности и зависящих от относительно небольших (миллионных) наборов данных, индекс FLAT является хорошим выбором. FLAT не сжимает векторы и является единственным индексом, который может гарантировать точные результаты поиска. Результаты, полученные с помощью FLAT, можно также использовать для сравнения с результатами, полученными с помощью других индексов, которые имеют менее чем 100-процентный отзыв.

    +

    Точность FLAT объясняется тем, что он использует исчерпывающий подход к поиску, то есть для каждого запроса целевой входной сигнал сравнивается с каждым набором векторов в наборе данных. Это делает FLAT самым медленным индексом в нашем списке и плохо подходит для запросов к массивным векторным данным. Для индекса FLAT в Milvus не требуется никаких параметров, и его использование не требует обучения данных.

    +
      +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазон
      metric_type[Необязательно] Выбранная метрика расстояния.См. раздел Поддерживаемые метрики.
      +
    • +
    +

    IVF_FLAT

    IVF_FLAT делит векторные данные на кластеры nlist, а затем сравнивает расстояния между целевым входным вектором и центром каждого кластера. В зависимости от количества кластеров, к которым система настроена на запрос (nprobe), результаты поиска сходства возвращаются на основе сравнений между целевым входным вектором и векторами только в наиболее похожих кластерах, что значительно сокращает время запроса.

    +

    Настраивая nprobe, можно найти идеальный баланс между точностью и скоростью для конкретного сценария. Результаты тестирования производительности IVF_FLAT показывают, что время выполнения запроса резко возрастает при увеличении как количества векторов целевого входа (nq), так и количества кластеров для поиска (nprobe).

    +

    IVF_FLAT является самым базовым индексом ЭКО, и закодированные данные, хранящиеся в каждом блоке, соответствуют исходным данным.

    +
      +
    • Параметры построения индекса

      + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      nlistКоличество единиц кластера[1, 65536]128
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
      • Поиск диапазона

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        max_empty_result_bucketsМаксимальное количество ведер, не дающих результатов поиска.
        Это параметр поиска по диапазону, который прекращает процесс поиска, если количество последовательных пустых ведер достигает указанного значения.
        Увеличение этого значения может улучшить скорость отзыва за счет увеличения времени поиска.
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_SQ8

    IVF_FLAT не выполняет никакого сжатия, поэтому создаваемые им индексные файлы имеют примерно тот же размер, что и исходные, необработанные векторные данные без индексации. Например, если исходный набор данных 1B SIFT имеет размер 476 ГБ, то индексные файлы IVF_FLAT будут немного меньше (~470 ГБ). Загрузка всех индексных файлов в память займет 470 ГБ.

    +

    Если ресурсы памяти диска, CPU или GPU ограничены, IVF_SQ8 будет лучшим вариантом, чем IVF_FLAT. Этот тип индекса может преобразовывать каждое FLOAT (4 байта) в UINT8 (1 байт), выполняя скалярное квантование (SQ). Это позволяет сократить потребление памяти на диске, CPU и GPU на 70-75 %. Для набора данных 1B SIFT индексные файлы IVF_SQ8 требуют всего 140 ГБ памяти.

    +
      +
    • Параметры построения индекса

      + + + + + + + +
      ПараметрОписаниеДиапазон
      nlistКоличество кластеров[1, 65536]
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
      • Поиск диапазона

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        max_empty_result_bucketsМаксимальное количество ведер, не дающих результатов поиска.
        Это параметр поиска по диапазону, который прекращает процесс поиска, если количество последовательных пустых ведер достигает указанного значения.
        Увеличение этого значения может улучшить скорость запоминания ценой увеличения времени поиска.
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_PQ

    PQ (Product Quantization) равномерно разлагает исходное высокоразмерное векторное пространство на декартово произведение m низкоразмерных векторных пространств, а затем квантует разложенные низкоразмерные векторные пространства. Вместо вычисления расстояний между целевым вектором и центром всех единиц, квантование по продуктам позволяет вычислять расстояния между целевым вектором и центром кластеризации каждого низкоразмерного пространства и значительно сокращает временную и пространственную сложность алгоритма.

    +

    IVF_PQ выполняет кластеризацию индекса ЭКО перед квантованием произведения векторов. Его индексный файл еще меньше, чем у IVF_SQ8, но это также приводит к потере точности при поиске векторов.

    +
    +

    Параметры построения индекса и параметры поиска зависят от дистрибутива Milvus. Сначала выберите свой дистрибутив Milvus.

    +
    +
      +
    • Параметры построения индекса

      + + + + + + + + + +
      ПараметрОписаниеДиапазон
      nlistКоличество единиц кластера[1, 65536]
      mКоличество коэффициентов квантования произведенияdim mod m == 0
      nbits[Необязательно] Количество бит, в которых хранится каждый низкоразмерный вектор.[1, 64] (по умолчанию 8)
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
      • Поиск диапазона

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        max_empty_result_bucketsМаксимальное количество ведер, не дающих результатов поиска.
        Это параметр поиска по диапазону, который прекращает процесс поиска, если количество последовательных пустых ведер достигает указанного значения.
        Увеличение этого значения может улучшить скорость запоминания за счет увеличения времени поиска.
        [1, 65535]2
        +
      • +
    • +
    +

    SCANN

    ScaNN (Scalable Nearest Neighbors) похож на IVF_PQ с точки зрения кластеризации векторов и квантования произведений. Их отличия заключаются в деталях реализации квантования произведения и использовании SIMD (Single-Instruction / Multi-data) для эффективного вычисления.

    +
      +
    • Параметры построения индекса

      + + + + + + + + +
      ПараметрОписаниеДиапазон
      nlistКоличество кластеров[1, 65536]
      with_raw_dataВключать ли исходные данные в индексTrue или False. По умолчанию True.
      +
      +

      В отличие от IVF_PQ, значения по умолчанию применяются к m и nbits для оптимизации производительности.

      +
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]
        reorder_kКоличество единиц-кандидатов для запроса[top_k, ∞]top_k
        +
      • +
      • Поиск в диапазоне

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        max_empty_result_bucketsМаксимальное количество ведер, не дающих результатов поиска.
        Это параметр поиска по диапазону, который прекращает процесс поиска, если количество последовательных пустых ведер достигает указанного значения.
        Увеличение этого значения может улучшить скорость запоминания за счет увеличения времени поиска.
        [1, 65535]2
        +
      • +
    • +
    +

    HNSW

    HNSW (Hierarchical Navigable Small World Graph) - это алгоритм индексирования на основе графов. Он строит многослойную навигационную структуру для изображения в соответствии с определенными правилами. В этой структуре верхние слои более разрежены и расстояния между узлами больше, а нижние слои более плотные и расстояния между узлами ближе. Поиск начинается с самого верхнего слоя, в нем находится ближайший к цели узел, а затем переходят к следующему слою, чтобы начать новый поиск. После нескольких итераций поиск быстро приближается к целевой позиции.

    +

    Для повышения производительности HNSW ограничивает максимальную степень узлов на каждом слое графа значением M. Кроме того, вы можете использовать efConstruction (при построении индекса) или ef (при поиске целей), чтобы задать диапазон поиска.

    +
      +
    • Параметры построения индекса

      + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      MM определяет максимальное количество исходящих соединений в графе. Большее значение M приводит к увеличению точности/времени работы при фиксированном ef/efConstruction.[2, 2048]Нет
      efConstructionef_construction управляет компромиссом между скоростью поиска индекса и скоростью сборки. Увеличение параметра efConstruction может повысить качество индекса, но также имеет тенденцию к увеличению времени индексирования.[1, int_max]None
      +
    • +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      efПараметр, управляющий компромиссом между временем запроса и точностью. Более высокое значение ef приводит к более точному, но более медленному поиску.[top_k, int_max]Нет
      +
    • +
    +

    HNSW_SQ

    Скалярное квантование (SQ) - это техника, используемая для дискретизации данных с плавающей точкой на конечный набор значений, основанный на их величине. Например, SQ6 представляет собой квантование в (2^6 = 64) дискретных значений, где каждое число с плавающей точкой кодируется 6 битами. Аналогично, SQ8 квантует данные в (2^8 = 256) дискретных значений, где каждое число с плавающей точкой представлено 8 битами. Такое квантование уменьшает занимаемую память, сохраняя при этом важную структуру данных для эффективной обработки.

    +

    В сочетании с SQ, HNSW_SQ обеспечивает контролируемый компромисс между размером индекса и точностью, сохраняя при этом высокую производительность запросов в секунду (QPS). По сравнению со стандартным HNSW, это приводит к незначительному увеличению времени построения индекса.

    +
      +
    • Параметры построения индекса

      + + + + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      MM определяет максимальное количество исходящих соединений в графе. Большее значение M приводит к увеличению точности/времени работы при фиксированном ef/efConstruction.[2, 2048]Нет
      efConstructionef_construction управляет компромиссом между скоростью поиска индекса и скоростью сборки. Увеличение параметра efConstruction может повысить качество индекса, но также имеет тенденцию к увеличению времени индексирования.[1, int_max]None
      sq_typeТип скалярного квантователя.SQ6,SQ8, BF16, FP16SQ8
      refineРезервируются ли уточненные данные при построении индекса.true, falsefalse
      refine_typeТип данных уточняемого индекса.SQ6, SQ8, BF16, FP16, FP32Нет
      +
    • +
    • Параметры поиска

      + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      efПараметр, управляющий компромиссом между временем запроса и точностью. Более высокое значение ef приводит к более точному, но более медленному поиску.[top_k, int_max]Нет
      refine_kКоэффициент увеличения уточнения по сравнению с k.[1, float_max]1
      +
    • +
    +

    HNSW_PQ

    Основная идея PQ заключается в том, чтобы разбить вектор на m подвекторов, каждый из которых найдет 2^{nbits} центроидов на основе kmeans, и каждый подвектор выберет ближайший центроид в качестве своего приближенного подвектора. Затем мы записываем все центроиды, поэтому каждый подвектор можно закодировать как nbits, а плавающий вектор длины dim можно закодировать как m ⋅ nbits бит.

    +

    В сочетании с PQ HNSW_PQ обеспечивает контролируемый компромисс между размером индекса и точностью, но имеет более низкое значение QPS и более высокий коэффициент отзыва, чем HNSW_SQ при той же степени сжатия. По сравнению с HNSW_SQ, на построение индекса уходит больше времени.

    +
      +
    • Параметры построения индекса

      + + + + + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      MM определяет максимальное количество исходящих соединений в графе. Большее значение M приводит к увеличению точности/времени работы при фиксированном ef/efConstruction.[2, 2048]Нет
      efConstructionef_construction управляет компромиссом между скоростью поиска индекса и скоростью сборки. Увеличение параметра efConstruction может повысить качество индекса, но также имеет тенденцию к увеличению времени индексирования.[1, int_max]None
      mКоличество групп субвекторов, на которые нужно разбить вектор.[1, 65536]32
      nbitsКоличество бит, на которые квантуется каждая группа субвекторов.[1, 24]8
      refineРезервируются ли уточненные данные при построении индекса.true, falsefalse
      refine_typeТип данных уточненного индекса.SQ6, SQ8, BF16, FP16, FP32Нет
      +
    • +
    • Параметры поиска

      + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      efПараметр, управляющий компромиссом между временем запроса и точностью. Более высокое значение ef приводит к более точному, но более медленному поиску.[top_k, int_max]Нет
      refine_kКоэффициент увеличения уточнения по сравнению с k.[1, float_max]1
      +
    • +
    +

    HNSW_PRQ

    PRQ аналогичен PQ и также делит вектор на группы m. Каждый субвектор будет закодирован как nbits. После завершения pq-квантования вычисляется остаток между вектором и pq-квантованным вектором, и к остаточному вектору применяется pq-квантование. Всего будет выполнено nrq полных pq-квантований, поэтому плавающий вектор длины dim будет закодирован как m ⋅ nbits ⋅ nrq bits.

    +

    В сочетании с квантователем остаточного продукта (PRQ) HNSW_PRQ обеспечивает еще более высокий контролируемый компромисс между размером индекса и точностью. Он имеет почти эквивалентное значение QPS и более высокий коэффициент запоминания, чем HNSW_PQ, при той же степени сжатия. По сравнению с HNSW_PQ время построения индекса может увеличиться в несколько раз.

    +
      +
    • Параметры построения индекса

      + + + + + + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      MM определяет максимальное количество исходящих соединений в графе. Большее значение M приводит к увеличению точности/времени работы при фиксированном ef/efConstruction.[2, 2048]Нет
      efConstructionef_construction управляет компромиссом между скоростью поиска индекса и скоростью сборки. Увеличение параметра efConstruction может повысить качество индекса, но также имеет тенденцию к увеличению времени индексирования.[1, int_max]None
      mКоличество групп субвекторов, на которые нужно разбить вектор.[1, 65536]32
      nbitsКоличество бит, на которые квантуется каждая группа субвекторов.[1, 24]8
      nrqКоличество остаточных субквантователей.[1, 16]2
      refineРезервируются ли уточненные данные при построении индекса.true, falsefalse
      refine_typeТип данных уточняемого индекса.SQ6, SQ8, BF16, FP16, FP32Нет
      +
    • +
    • Параметры поиска

      + + + + + + + + +
      ПараметрОписаниеДиапазонЗначение по умолчанию
      efПараметр, управляющий компромиссом между временем запроса и точностью. Более высокое значение ef приводит к более точному, но более медленному поиску.[top_k, int_max]Нет
      refine_kКоэффициент увеличения уточнения по сравнению с k.[1, float_max]1
      +
    • +
    +
    +
    +

    BIN_FLAT

    Этот индекс точно такой же, как FLAT, за исключением того, что он может использоваться только для бинарных вкраплений.

    +

    Для приложений поиска векторного сходства, требующих идеальной точности и зависящих от относительно небольших (миллионных) наборов данных, индекс BIN_FLAT является хорошим выбором. BIN_FLAT не сжимает векторы и является единственным индексом, который может гарантировать точные результаты поиска. Результаты BIN_FLAT также можно использовать в качестве точки сравнения для результатов, выдаваемых другими индексами, которые имеют менее чем 100 % отзыв.

    +

    Точность BIN_FLAT объясняется тем, что он использует исчерпывающий подход к поиску, то есть для каждого запроса целевой входной сигнал сравнивается с векторами в наборе данных. Это делает BIN_FLAT самым медленным индексом в нашем списке и плохо подходит для запросов к массивным векторным данным. В Milvus нет параметров для индекса BIN_FLAT, и его использование не требует подготовки данных или дополнительного хранения.

    +
      +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазон
      metric_type[Необязательно] Выбранная метрика расстояния.См. раздел Поддерживаемые метрики.
      +
    • +
    +

    BIN_IVF_FLAT

    Этот индекс точно такой же, как IVF_FLAT, за исключением того, что он может использоваться только для бинарных вкраплений.

    +

    BIN_IVF_FLAT делит векторные данные на кластеры nlist, а затем сравнивает расстояния между целевым входным вектором и центром каждого кластера. В зависимости от количества кластеров, к которым система настроена на запрос (nprobe), результаты поиска сходства возвращаются на основе сравнений между целевым входным вектором и векторами только в наиболее похожих кластерах, что значительно сокращает время запроса.

    +

    Настраивая nprobe, можно найти идеальный баланс между точностью и скоростью для конкретного сценария. Время выполнения запроса резко возрастает при увеличении как количества векторов целевого входа (nq), так и количества кластеров для поиска (nprobe).

    +

    BIN_IVF_FLAT - это самый базовый индекс BIN_IVF, и закодированные данные, хранящиеся в каждом блоке, соответствуют исходным данным.

    +
      +
    • Параметры построения индекса

      + + + + + + + +
      ПараметрОписаниеДиапазон
      nlistКоличество единиц кластера[1, 65536]
      +
    • +
    • Параметры поиска

      +
        +
      • Общий поиск

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        nprobeКоличество единиц для запроса[1, nlist]8
        +
      • +
      • Поиск диапазона

        + + + + + + + +
        ПараметрОписаниеДиапазонЗначение по умолчанию
        max_empty_result_bucketsМаксимальное количество ведер, не дающих результатов поиска.
        Это параметр поиска по диапазону, который прекращает процесс поиска, если количество последовательных пустых ведер достигает указанного значения.
        Увеличение этого значения может улучшить скорость запоминания за счет увеличения времени поиска.
        [1, 65535]2
        +
      • +
    • +
    +
    +
    +

    SPARSE_INVERTED_INDEX

    В каждом измерении хранится список векторов, имеющих ненулевое значение в этом измерении. Во время поиска Milvus итерируется по каждому измерению вектора запроса и вычисляет оценки для векторов, имеющих ненулевые значения в этих измерениях.

    +
      +
    • Параметры построения индекса

      + + + + + + + +
      ПараметрОписаниеДиапазон
      drop_ratio_buildДоля малых значений вектора, которые исключаются в процессе индексирования. Этот параметр позволяет тонко настроить процесс индексирования, найти компромисс между эффективностью и точностью, игнорируя малые значения при построении индекса.[0, 1]
      +
    • +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазон
      drop_ratio_searchДоля малых значений вектора, которые исключаются в процессе поиска. Этот параметр позволяет тонко настроить процесс поиска, указав долю наименьших значений в векторе запроса, которые следует игнорировать. Это помогает сбалансировать точность и производительность поиска. Чем меньше значение drop_ratio_search, тем меньший вклад эти малые значения вносят в итоговую оценку. Игнорирование некоторых малых значений позволяет повысить производительность поиска при минимальном влиянии на точность.[0, 1]
      +
    • +
    +

    SPARSE_WAND

    Этот индекс имеет общие черты с SPARSE_INVERTED_INDEX, но использует алгоритм Weak-AND для дальнейшего сокращения числа полных оценок расстояния между IP-адресами в процессе поиска.

    +

    По результатам нашего тестирования SPARSE_WAND в целом превосходит другие методы по скорости. Однако его производительность может быстро ухудшаться при увеличении плотности векторов. Чтобы решить эту проблему, введение ненулевого drop_ratio_search может значительно повысить производительность, при этом потери точности будут минимальными. Дополнительную информацию см. в разделе "Разреженный вектор".

    +
      +
    • Параметры построения индекса

      + + + + + + + +
      ПараметрОписаниеДиапазон
      drop_ratio_buildДоля малых значений вектора, которые исключаются в процессе индексирования. Этот параметр позволяет тонко настроить процесс индексирования, найти компромисс между эффективностью и точностью, игнорируя малые значения при построении индекса.[0, 1]
      +
    • +
    • Параметры поиска

      + + + + + + + +
      ПараметрОписаниеДиапазон
      drop_ratio_searchДоля малых значений вектора, которые исключаются в процессе поиска. Этот параметр позволяет тонко настроить процесс поиска, указав долю наименьших значений в векторе запроса, которые следует игнорировать. Это помогает сбалансировать точность и производительность поиска. Чем меньше значение drop_ratio_search, тем меньший вклад эти малые значения вносят в итоговую оценку. Игнорирование некоторых малых значений позволяет повысить производительность поиска при минимальном влиянии на точность.[0, 1]
      +
    • +
    +
    +

    FAQ

    +В чем разница между индексом FLAT и индексом IVF_FLAT?

    +

    Индекс IVF_FLAT делит векторное пространство на кластеры nlist. Если значение nlist по умолчанию равно 16384, Milvus сравнивает расстояния между целевым вектором и центрами всех 16384 кластеров, чтобы получить nprobe ближайших кластеров. Затем Milvus сравнивает расстояния между целевым вектором и векторами в выбранных кластерах, чтобы получить ближайшие векторы. В отличие от IVF_FLAT, FLAT напрямую сравнивает расстояния между целевым вектором и каждым вектором.

    +

    +Поэтому, когда общее количество векторов приблизительно равно nlist, IVF_FLAT и FLAT мало отличаются по количеству необходимых вычислений и производительности поиска. Но при увеличении числа векторов в два, три или n раз от nlist индекс IVF_FLAT начинает демонстрировать все большие преимущества.

    +

    +Дополнительную информацию см. в разделе Как выбрать индекс в Milvus.

    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/knowhere.json b/localization/v2.5.x/site/ru/reference/knowhere.json new file mode 100644 index 000000000..fcb6f7954 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/knowhere.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Knowhere","anchorList":[{"label":"Knowhere","href":"Knowhere","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Knowhere в архитектуре Milvus","href":"Knowhere-in-the-Milvus-architecture","type":2,"isActive":false},{"label":"Преимущества Knowhere","href":"Knowhere-advantages","type":2,"isActive":false},{"label":"Структура кода Knowhere","href":"Knowhere-code-structure","type":2,"isActive":false},{"label":"Добавление индексов в Knowhere","href":"Adding-indices-to-Knowhere","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/knowhere.md b/localization/v2.5.x/site/ru/reference/knowhere.md new file mode 100644 index 000000000..809928f32 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/knowhere.md @@ -0,0 +1,179 @@ +--- +id: knowhere.md +summary: Узнайте о Knowhere в Милвусе. +title: Knowhere +--- +

    Knowhere

    В этой теме рассказывается о Knowhere, основном механизме векторного исполнения Milvus.

    +

    Обзор

    Knowhere - это основной механизм выполнения векторов в Milvus, который включает в себя несколько библиотек поиска векторного сходства, включая Faiss, Hnswlib и Annoy. Knowhere также разработан для поддержки гетерогенных вычислений. Она контролирует, на каком оборудовании (CPU или GPU) выполнять запросы на создание индекса и поиск. Именно так Knowhere получила свое название - знание того, где выполнять операции. В будущих релизах будут поддерживаться другие типы оборудования, включая DPU и TPU.

    +

    Knowhere в архитектуре Milvus

    На рисунке ниже показано место Knowhere в архитектуре Milvus.

    +

    + + Knowhere + Knowhere

    +

    Самый нижний слой - это системное оборудование. Над ним располагаются сторонние индексные библиотеки. На верхнем уровне Knowhere взаимодействует с индексным узлом и узлом запросов через CGO, что позволяет пакетам Go вызывать код на C.

    +

    Преимущества Knowhere

    Ниже перечислены преимущества Knowhere по сравнению с Faiss.

    +

    Поддержка BitsetView

    Milvus вводит механизм битов для реализации "мягкого удаления". Мягко удаленный вектор все еще существует в базе данных, но не будет вычислен при поиске или запросе векторного сходства.

    +

    Каждый бит в битовом наборе соответствует индексированному вектору. Если в наборе битов вектор помечен как "1", это означает, что данный вектор мягко удален и не будет задействован в векторном поиске. Параметр bitset применяется ко всем API запросов индекса Фейса в Knowhere, включая индексы CPU и GPU.

    +

    Более подробную информацию о механизме bitset можно найти в разделе bitset.

    +

    Поддержка нескольких метрик сходства для индексирования бинарных векторов

    Knowhere поддерживает Hamming, Jaccard, Tanimoto, Superstructure и Substructure. Жаккард и Танимото могут использоваться для измерения сходства между двумя наборами образцов, а Superstructure и Substructure - для измерения сходства химических структур.

    +

    Поддержка набора инструкций AVX512

    Помимо AArch64, SSE4.2 и AVX2, наборов инструкций, уже поддерживаемых Faiss, Knowhere также поддерживает AVX512, который может повысить производительность построения индексов и запросов на 20-30 % по сравнению с AVX2.

    +

    Автоматический выбор SIMD-инструкций

    Knowhere поддерживает автоматический вызов подходящих SIMD-инструкций (например, SIMD SSE, AVX, AVX2 и AVX512) на любом процессоре (как на локальных, так и на облачных платформах), так что пользователям не нужно вручную указывать флаг SIMD (например, "-msse4") во время компиляции.

    +

    Knowhere создается путем рефакторинга кодовой базы Faiss. Общие функции (например, вычисление подобия), которые зависят от ускорения SIMD, вырезаются из кода. Затем для каждой функции реализуются четыре версии (т. е. SSE, AVX, AVX2, AVX512), каждая из которых помещается в отдельный исходный файл. Затем исходные файлы компилируются по отдельности с соответствующим флагом SIMD. Таким образом, во время выполнения Knowhere может автоматически выбирать наиболее подходящие SIMD-инструкции, основываясь на текущих флагах процессора, а затем связывать нужные указатели функций с помощью хуков.

    +

    Другие оптимизации производительности

    Подробнее об оптимизации производительности Knowhere читайте в статье Milvus: A Purpose-Built Vector Data Management System.

    +

    Структура кода Knowhere

    Вычисления в Milvus в основном включают в себя векторные и скалярные операции. Knowhere обрабатывает только операции по индексированию векторов.

    +

    Индекс - это структура данных, независимая от исходных векторных данных. Как правило, индексирование требует четырех шагов: создание индекса, обучение данных, вставка данных и построение индекса. В некоторых приложениях ИИ обучение наборов данных отделено от поиска векторов. Данные из наборов данных сначала обучаются, а затем вставляются в векторную базу данных, например Milvus, для поиска сходства. Например, в открытых наборах данных sift1M и sift1B различаются данные для обучения и данные для тестирования.

    +

    Однако в Knowhere данные для обучения и для поиска одинаковы. Knowhere обучает все данные в сегменте, а затем вставляет все обученные данные и строит для них индекс.

    +

    DataObj: базовый класс

    DataObj является базовым классом всех структур данных в Knowhere. Size() - единственный виртуальный метод в DataObj. Класс Index наследуется от DataObj с полем "size_". Класс Index также имеет два виртуальных метода - Serialize() и Load(). Класс VecIndex, производный от Index, является виртуальным базовым классом для всех векторных индексов. VecIndex предоставляет методы, включая Train(), Query(), GetStatistics() и ClearStatistics().

    +

    + + base class + базовый класс

    +

    Некоторые другие типы индексов перечислены справа на рисунке выше.

    +
      +
    • Индекс Фейса имеет два базовых класса: FaissBaseIndex для всех индексов векторов с плавающей точкой и FaissBaseBinaryIndex для всех индексов двоичных векторов.

    • +
    • GPUIndex является базовым классом для всех индексов Фейса GPU.

    • +
    • OffsetBaseIndex базовый класс для всех индексов собственной разработки. Учитывая, что в индексном файле хранятся только идентификаторы векторов, размер файла для 128-мерных векторов может быть уменьшен на 2 порядка.

    • +
    +

    + + IDMAP + IDMAP

    +

    Технически говоря, IDMAP не является индексом, а скорее используется для поиска методом перебора. При вводе векторов в базу данных не требуется ни обучения данных, ни построения индекса. Поиск будет осуществляться непосредственно по вставленным векторным данным.

    +

    Однако для согласованности кода IDMAP также наследует от класса VecIndex со всеми его виртуальными интерфейсами. Использование IDMAP такое же, как и других индексов.

    +

    ЭКО-индексы

    + + IVF + IVF

    +

    Индексы IVF (инвертированный файл) являются наиболее часто используемыми. Класс IVF является производным от VecIndex и FaissBaseIndex, далее расширяется до IVFSQ и IVFPQ. GPUIVF является производным от GPUIndex и IVF. Затем GPUIVF расширяется до GPUIVFSQ и GPUIVFPQ.

    +

    IVFSQHybrid является самостоятельно разработанным гибридным индексом. Грубый квантователь выполняется на GPU, а поиск в ведре - на CPU. Этот тип индекса позволяет уменьшить количество копий памяти между CPU и GPU, используя вычислительную мощность GPU. IVFSQHybrid имеет тот же коэффициент отзыва, что и GPUIVFSQ, но обладает лучшей производительностью.

    +

    Структура базового класса для бинарных индексов относительно проще. BinaryIDMAP и BinaryIVF являются производными от FaissBaseBinaryIndex и VecIndex.

    +

    Сторонние индексы

    + + third-party indices + Сторонние индексы

    +

    В настоящее время, помимо Faiss, поддерживаются только два типа сторонних индексов: древовидный Annoy и графовый HNSW. Эти два распространенных и часто используемых сторонних индекса получены из VecIndex.

    +

    Добавление индексов в Knowhere

    Если вы хотите добавить новые индексы в Knowhere, сначала вы можете обратиться к существующим индексам:

    +
      +
    • Чтобы добавить индексы, основанные на квантовании, обратитесь к IVF_FLAT.

    • +
    • Чтобы добавить индексы на основе графов, обратитесь к HNSW.

    • +
    • Чтобы добавить индексы на основе деревьев, обратитесь к Annoy.

    • +
    +

    После обращения к существующему индексу вы можете выполнить следующие шаги, чтобы добавить новый индекс в Knowhere.

    +
      +
    1. Добавьте имя нового индекса в поле IndexEnum. Тип данных - строка.

    2. +
    3. Добавьте проверку достоверности данных для нового индекса в файл ConfAdapter.cpp. Проверка валидности нужна в основном для проверки параметров подготовки данных и запроса.

    4. +
    5. Создайте новый файл для нового индекса. Базовый класс нового индекса должен включать VecIndex, а также необходимый виртуальный интерфейс VecIndex.

    6. +
    7. Добавьте логику построения индекса для нового индекса в VecIndexFactory::CreateVecIndex().

    8. +
    9. Добавьте юнит-тест в каталог unittest.

    10. +
    +

    Что дальше

    После изучения того, как Knowhere работает в Milvus, вы также можете захотеть:

    + diff --git a/localization/v2.5.x/site/ru/reference/multi_tenancy.json b/localization/v2.5.x/site/ru/reference/multi_tenancy.json new file mode 100644 index 000000000..67f9d5a65 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/multi_tenancy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Multi-tenancy strategies","anchorList":[{"label":"Стратегии работы с несколькими арендаторами","href":"Multi-tenancy-strategies","type":1,"isActive":false},{"label":"Мультитенантность, ориентированная на базу данных","href":"Database-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Мультитенантность, ориентированная на коллекции","href":"Collection-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Ориентированное на разделы многопользовательское использование","href":"Partition-oriented-multi-tenancy","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/multi_tenancy.md b/localization/v2.5.x/site/ru/reference/multi_tenancy.md new file mode 100644 index 000000000..099f9620a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/multi_tenancy.md @@ -0,0 +1,106 @@ +--- +id: multi_tenancy.md +related_key: multi-tenancy +summary: Многопользовательский режим в Milvus. +title: Стратегии работы с несколькими арендаторами +--- +

    Стратегии работы с несколькими арендаторами

    Во многих случаях разработчики хотят запустить один кластер Milvus и обслуживать несколько арендаторов, например, несколько продуктовых команд или миллионы конечных пользователей. В этом руководстве описано несколько различных стратегий для достижения многопользовательского режима в Milvus.

    +

    Milvus разработан для поддержки многопользовательского доступа на уровне баз данных, коллекций или разделов. Цель многопользовательской аренды - отделить данные и ресурсы друг от друга. Реализация многопользовательского доступа на разных уровнях позволяет достичь различной степени изоляции, но также влечет за собой различные накладные расходы. Здесь мы расскажем о компромиссах между ними.

    +

    Мультитенантность, ориентированная на базу данных

    Начиная с версии 2.2.9 Milvus, вы можете создавать несколько баз данных в одном кластере Milvus. Эта возможность позволяет достичь ориентированной на базу данных многопользовательской сети, назначая базу данных для каждого арендатора, чтобы они могли создавать свои собственные коллекции. Такой подход обеспечивает наилучшую изоляцию данных и ресурсов для арендаторов, однако он ограничен максимум 64 базами данных в одном кластере.

    +

    Мультитенантность, ориентированная на коллекции

    Существует два возможных пути достижения ориентированной на коллекции многопользовательской среды.

    +

    Одна коллекция для всех арендаторов

    Использование одной коллекции для реализации многопользовательского доступа путем добавления поля tenant для различения арендаторов - простой вариант. При выполнении поиска ANN для конкретного арендатора добавьте выражение фильтра, чтобы отсеять все сущности, принадлежащие другим арендаторам. Это самый простой способ добиться многопользовательского доступа. Однако имейте в виду, что производительность фильтра может стать узким местом ANN-поиска. Чтобы повысить производительность поиска, можно оптимизировать многопользовательскую работу, ориентированную на разделы.

    +

    Одна коллекция для каждого арендатора

    Другой подход заключается в создании коллекции для каждого арендатора для хранения его собственных данных, вместо того чтобы хранить данные всех арендаторов в одной коллекции. Это обеспечивает лучшую изоляцию данных и производительность запросов. Однако следует помнить, что такой подход требует больше ресурсов для планирования и ограничен максимум 10 000 коллекций в кластере.

    +

    Ориентированное на разделы многопользовательское использование

    Существует два способа достижения ориентированной на разделы многопользовательской сети:

    +

    Один раздел на одного арендатора

    Управлять одной коллекцией гораздо проще, чем несколькими. Вместо того чтобы создавать несколько коллекций, подумайте о назначении раздела для каждого арендатора, чтобы добиться гибкой изоляции данных и управления памятью. Производительность поиска при ориентированном на разделы многопользовательстве гораздо выше, чем при ориентированном на коллекции многопользовательстве. Однако следует учитывать, что количество арендаторов коллекции не должно превышать максимальное количество разделов, которые может содержать коллекция.

    +

    Мультиарендаторство на основе ключей разделов

    В Milvus 2.2.9 появилась новая функция под названием "ключ раздела". При создании коллекции назначьте поле арендатора и сделайте его полем ключа раздела. Milvus будет хранить сущности в разделе в соответствии с хэш-значением поля ключа раздела. При выполнении поиска по ANN Milvus будет искать только в том разделе, который содержит ключ раздела. Это значительно сокращает объем поиска и обеспечивает более высокую производительность по сравнению с поиском без ключа раздела.

    +
    +

    Эта стратегия снимает ограничение на максимальное количество арендаторов, которое может поддерживать коллекция Milvus, и значительно упрощает управление ресурсами, поскольку Milvus автоматически управляет разделами за вас.

    +

    Итак, вы можете использовать одну или несколько из описанных выше стратегий многопользовательской работы для создания собственного решения. В следующей таблице приведены сравнения между этими стратегиями с точки зрения изоляции данных, производительности поиска и максимального количества арендаторов.

    + + + + + + + + + + + +
    Изоляция данныхПроизводительность поискаМаксимальное количество арендаторовРекомендуемые сценарии
    Ориентированная на базу данныхСильныйСильный64Для тех, кому требуется, чтобы коллекции менялись в зависимости от проекта, особенно подходит для изоляции данных между отделами вашей организации.
    Одна коллекция для всехСлабаяСредняяН/АДля тех, кто имеет ограниченные ресурсы и нечувствителен к изоляции данных.
    Одна коллекция на одного арендатораСильнаяСильнаяМенее 10 000Для тех, у кого менее 10 000 арендаторов на кластер.
    Один раздел на одного арендатораСреднийСильный4,096Для тех, у кого менее 4 096 арендаторов на кластер.
    на основе ключей разделовСреднийСильная10,000,000+Для тех, кто прогнозирует быстрый рост числа арендаторов до миллионов.
    +

    Что дальше

    Управлениесхемамибаз данных

    diff --git a/localization/v2.5.x/site/ru/reference/replica.json b/localization/v2.5.x/site/ru/reference/replica.json new file mode 100644 index 000000000..fcaa9c8b2 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/replica.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-Memory Replica","anchorList":[{"label":"Репликация в памяти","href":"In-Memory-Replica","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Ключевые понятия","href":"Key-Concepts","type":2,"isActive":false},{"label":"Детали дизайна","href":"Design-Details","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/replica.md b/localization/v2.5.x/site/ru/reference/replica.md new file mode 100644 index 000000000..2f1ae97c5 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/replica.md @@ -0,0 +1,91 @@ +--- +id: replica.md +summary: Узнайте о репликации in-memory в Milvus. +title: Репликация в памяти +--- +

    Репликация в памяти

    В этой теме описывается механизм реплик в памяти (репликаций) в Milvus, который позволяет реплицировать несколько сегментов в рабочей памяти для повышения производительности и доступности.

    +

    Информацию о том, как настроить реплики in-memory, см. в разделе Конфигурации, связанные с узлами запросов.

    +

    Обзор

    + + Replica_Availiability + Доступность_реплики

    +

    С помощью реплик in-memory Milvus может загружать один и тот же сегмент на несколько узлов запросов. Если один узел запроса вышел из строя или занят текущим поисковым запросом, когда приходит другой, система может отправить новые запросы на незанятый узел запроса, на котором есть репликация того же сегмента.

    +

    Производительность

    Реплики в памяти позволяют задействовать дополнительные ресурсы процессора и памяти. Это очень полезно, если у вас относительно небольшой набор данных, но вы хотите увеличить пропускную способность чтения за счет дополнительных аппаратных ресурсов. Общая производительность QPS (запрос в секунду) и пропускная способность могут быть значительно улучшены.

    +

    Доступность

    Реплики в памяти помогают Milvus быстрее восстанавливаться в случае сбоя узла запроса. Когда узел запроса выходит из строя, сегмент не нужно перезагружать на другой узел запроса. Вместо этого поисковый запрос может быть немедленно отправлен на новый узел запроса без необходимости повторной загрузки данных. При одновременном обслуживании нескольких копий сегментов система становится более устойчивой к сбоям.

    +

    Ключевые понятия

    Реплики in-memory организованы в виде групп реплик. Каждая группа реплик содержит черепные реплики. Каждая реплика шарда имеет потоковую реплику и историческую реплику, которые соответствуют растущим и закрытым сегментам в шарде (т. е. каналу DML).

    +

    + + An illustration of how in-memory replica works + Иллюстрация того, как работает реплика in-memory

    +

    Группа реплик

    Группа реплик состоит из нескольких узлов запросов, которые отвечают за работу с историческими данными и репликами.

    +

    Осколочная реплика

    Осколочная реплика состоит из потоковой и исторической реплик, принадлежащих одному осколку. Количество реплик шардов в группе реплик определяется количеством шардов в указанной коллекции.

    +

    Потоковая реплика

    Потоковая реплика содержит все растущие сегменты из одного канала DML. Технически говоря, потоковая реплика должна обслуживаться только одним узлом запроса в одной реплике.

    +

    Историческая реплика

    Историческая реплика содержит все запечатанные сегменты из одного и того же канала DML. Запечатанные сегменты одной исторической реплики могут быть распределены по нескольким узлам запросов в рамках одной группы реплик.

    +

    Лидер осколка

    Лидер осколка - это узел запроса, обслуживающий потоковую реплику в реплике осколка.

    +

    Детали дизайна

    Баланс

    Новый сегмент, который необходимо загрузить, будет распределен по нескольким различным узлам запросов. Поисковый запрос может быть обработан, как только хотя бы одна реплика будет успешно загружена.

    +

    Кэш

    Прокси-сервер поддерживает кэш, сопоставляющий сегменты с узлами запроса, и периодически обновляет его. Когда прокси получает запрос, Milvus получает из кэша все сегменты, которые нужно найти, и пытается равномерно распределить их по узлам запроса.

    +

    Для растущих сегментов прокси также поддерживает кэш "канал - узел запроса" и отправляет запросы на соответствующие узлы запроса.

    +

    Отказоустойчивость

    Кэши на прокси не всегда актуальны. Некоторые сегменты или каналы могут быть перемещены на другие узлы запроса в момент поступления запроса. В этом случае прокси получит ответ об ошибке, обновит кэш и попытается назначить его другому узлу запроса.

    +

    Сегмент будет проигнорирован, если прокси не сможет найти его после обновления кэша. Это может произойти, если сегмент был уплотнен.

    +

    Если кэш не точен, прокси может пропустить некоторые сегменты. Узлы запроса с каналами DML (растущие сегменты) возвращают ответы на поиск вместе со списком надежных сегментов, с которыми прокси может сравнить и обновить кэш.

    +

    Усовершенствование

    Прокси не может распределять поисковые запросы между узлами запросов абсолютно одинаково, и узлы запросов могут иметь разные ресурсы для обслуживания поисковых запросов. Чтобы избежать распределения ресурсов по принципу "длинного хвоста", прокси назначает активные сегменты на других узлах запроса незанятому узлу запроса, который также имеет эти сегменты.

    diff --git a/localization/v2.5.x/site/ru/reference/scalar_index.json b/localization/v2.5.x/site/ru/reference/scalar_index.json new file mode 100644 index 000000000..3dc22a4f1 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/scalar_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Scalar Index","anchorList":[{"label":"Скалярный индекс","href":"Scalar-Index","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Алгоритмы индексирования скалярных полей","href":"Scalar-field-indexing-algorithms","type":2,"isActive":false},{"label":"Рекомендации по производительности","href":"Performance-recommandations","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/scalar_index.md b/localization/v2.5.x/site/ru/reference/scalar_index.md new file mode 100644 index 000000000..d1eb69062 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/scalar_index.md @@ -0,0 +1,165 @@ +--- +id: scalar_index.md +related_key: scalar_index +summary: Скалярный индекс в Мильвусе. +title: Скалярный индекс +--- +

    Скалярный индекс

    Milvus поддерживает фильтрованный поиск по скалярным и векторным полям. Чтобы повысить эффективность поиска по скалярным полям, в Milvus начиная с версии 2.1.0 была введена индексация по скалярным полям. В этой статье представлен обзор индексирования скалярных полей в Milvus, который поможет вам понять его значение и реализацию.

    +

    Обзор

    При проведении поиска по векторному сходству в Milvus вы можете использовать логические операторы для организации скалярных полей в булевы выражения.

    +

    Когда Milvus получает поисковый запрос с таким булевым выражением, он разбирает булевое выражение на абстрактное синтаксическое дерево (AST), чтобы создать физический план для фильтрации атрибутов. Затем Milvus применяет физический план в каждом сегменте для создания набора битов в качестве результата фильтрации и включает результат в качестве параметра векторного поиска, чтобы сузить область поиска. В этом случае скорость векторного поиска в значительной степени зависит от скорости фильтрации атрибутов.

    +

    + + Attribute filtering in a segment + Фильтрация атрибутов в сегменте

    +

    Индексирование скалярных полей - это способ обеспечить скорость фильтрации атрибутов путем сортировки значений скалярных полей определенным образом для ускорения поиска информации.

    +

    Алгоритмы индексирования скалярных полей

    Milvus стремится достичь низкого потребления памяти, высокой эффективности фильтрации и короткого времени загрузки с помощью алгоритмов индексации скалярных полей. Эти алгоритмы делятся на два основных типа: автоиндексация и инвертированная индексация.

    +

    Автоматическое индексирование

    Milvus предоставляет опцию AUTOINDEX, чтобы избавить вас от необходимости вручную выбирать тип индекса. При вызове метода create_index, если не указан index_type, Milvus автоматически выбирает наиболее подходящий тип индекса, основываясь на типе данных.

    +

    В следующей таблице перечислены типы данных, которые поддерживает Milvus, и соответствующие им алгоритмы автоматического индексирования.

    + + + + + + + + + + + + + +
    Тип данныхАлгоритм автоматического индексирования
    VARCHARИнвертированный индекс
    INT8Инвертированный индекс
    INT16Инвертированный индекс
    INT32Инвертированный индекс
    INT64Инвертированный индекс
    FLOATИнвертированный индекс
    DOUBLEИнвертированный индекс
    +

    Инвертированное индексирование

    Инвертированное индексирование - это гибкий способ создания индекса для скалярного поля путем ручного указания параметров индекса. Этот метод хорошо подходит для различных сценариев, включая точечные запросы, запросы по совпадению шаблонов, полнотекстовый поиск, поиск в JSON, булевский поиск и даже запросы по совпадению префиксов.

    +

    Инвертированные индексы, реализованные в Milvus, работают на основе Tantivy, библиотеки полнотекстового поискового механизма. Tantivy гарантирует, что инвертированное индексирование в Milvus будет эффективным и быстрым.

    +

    Инвертированный индекс состоит из двух основных компонентов: словаря терминов и инвертированного списка. Словарь терминов включает все токенизированные слова, отсортированные по алфавиту, а инвертированный список содержит список документов, в которых встречается каждое слово. Такая схема позволяет выполнять точечные запросы и запросы по диапазону гораздо быстрее и эффективнее, чем поиск методом "грубой силы".

    +

    + + Inverted index diagram + Диаграмма инвертированного индекса

    +

    Преимущества использования инвертированного индекса особенно очевидны при выполнении следующих операций:

    +
      +
    • Точечный запрос: Например, при поиске документов, содержащих слово Milvus, процесс начинается с проверки наличия Milvus в словаре терминов. Если оно не найдено, то ни один документ не содержит этого слова. Если же оно найдено, то извлекается инвертированный список, связанный с Milvus, в котором указаны документы, содержащие это слово. Этот метод гораздо эффективнее, чем поиск "грубой силой" по миллиону документов, поскольку отсортированный словарь терминов значительно снижает временную сложность поиска слова Milvus.
    • +
    • Запрос диапазона: Эффективность запросов по диапазону, таких как поиск документов, содержащих слова в алфавитном порядке больше, чем very, также повышается благодаря словарю отсортированных терминов. Этот подход более эффективен, чем поиск методом "грубой силы", обеспечивая более быстрые и точные результаты.
    • +
    +

    Результаты тестирования

    Чтобы продемонстрировать улучшение производительности, обеспечиваемое скалярными индексами в Milvus, был проведен эксперимент по сравнению производительности нескольких выражений с использованием инвертированного индексирования и поиска методом "грубой силы" в необработанных данных.

    +

    Эксперимент включал в себя тестирование различных выражений в двух условиях: с инвертированным индексом и с перебором. Чтобы обеспечить справедливость, во всех тестах поддерживалось одинаковое распределение данных, каждый раз использовалась одна и та же коллекция. Перед каждым тестом коллекция освобождалась, индекс удалялся и перестраивался. Кроме того, перед каждым тестом выполнялся теплый запрос, чтобы минимизировать влияние холодных и горячих данных, и каждый запрос выполнялся несколько раз для обеспечения точности.

    +

    Для набора данных из 1 миллиона записей использование инвертированного индекса может обеспечить 30-кратное повышение производительности при выполнении точечных запросов. Для больших наборов данных прирост производительности может быть еще более значительным.

    +

    Рекомендации по производительности

    Чтобы в полной мере использовать возможности Milvus по индексированию скалярных полей и раскрыть его мощь в поиске по векторному сходству, вам может понадобиться модель для оценки необходимого объема памяти на основе имеющихся у вас данных.

    +

    В следующих таблицах перечислены функции оценки для всех типов данных, которые поддерживает Milvus.

    +
      +
    • Числовые поля

      + + + + + + + + + + + + +
      Тип данныхФункция оценки памяти (МБ)
      INT8numOfRows * 12 / 1024 / 1024
      INT16numOfRows * 12 / 1024 / 1024
      INT32numOfRows * 12 / 1024 / 1024
      INT64numOfRows * 24 / 1024 / 1024
      FLOAT32numOfRows * 12 / 1024 / 1024
      DOUBLEnumOfRows * 24 / 1024 / 1024
      +
    • +
    • Поля строк

      + + + + + + + + + + + + +
      Длина строкиФункция оценки памяти (МБ)
      (0, 8]numOfRows * 128 / 1024 / 1024
      (8, 16]numOfRows * 144 / 1024 / 1024
      (16, 32]numOfRows * 160 / 1024 / 1024
      (32, 64]numOfRows * 192 / 1024 / 1024
      (64, 128]numOfRows * 256 / 1024 / 1024
      (128, 65535]numOfRows * strLen * 1.5 / 1024 / 1024
      +
    • +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/schema.json b/localization/v2.5.x/site/ru/reference/schema.json new file mode 100644 index 000000000..7603363ae --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import DataType, FieldSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# The following creates a field and use it as the partition key\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n","from pymilvus import DataType, FieldSchema\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n # configure default value `25` for field `age`\n FieldSchema(name=\"age\", dtype=DataType.INT64, default_value=25, description=\"age\"),\n embedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n]\n","from pymilvus import DataType, FieldSchema, CollectionSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n\n# Set enable_dynamic_field to True if you need to use dynamic fields. \nschema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description=\"desc of a collection\")\n","from pymilvus import Collection, connections\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\ncollection_name1 = \"tutorial_1\"\ncollection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)\n","from pymilvus import Collection\nimport pandas as pd\ndf = pd.DataFrame({\n \"id\": [i for i in range(nb)],\n \"age\": [random.randint(20, 40) for i in range(nb)],\n \"embedding\": [[random.random() for _ in range(dim)] for _ in range(nb)],\n \"position\": \"test_pos\"\n})\n\ncollection, ins_res = Collection.construct_from_dataframe(\n 'my_collection',\n df,\n primary_field='id',\n auto_id=False\n )\n"],"headingContent":"Manage Schema","anchorList":[{"label":"Управление схемой","href":"Manage-Schema","type":1,"isActive":false},{"label":"Схема поля","href":"Field-schema","type":2,"isActive":false},{"label":"Схема коллекции","href":"Collection-schema","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/schema.md b/localization/v2.5.x/site/ru/reference/schema.md new file mode 100644 index 000000000..5ed3edf7a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/schema.md @@ -0,0 +1,252 @@ +--- +id: schema.md +summary: 'Узнайте, как определить схему в Milvus.' +title: Управление схемой +--- +

    Управление схемой

    В этой теме рассказывается о схемах в Milvus. Схема используется для определения свойств коллекции и полей в ней.

    +

    Схема поля

    Схема поля - это логическое определение поля. Это первое, что необходимо определить, прежде чем определять схему коллекции и управлять коллекциями.

    +

    Milvus поддерживает только одно поле первичного ключа в коллекции.

    +

    Свойства схемы поля

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    СвойстваОписаниеПримечание
    nameИмя создаваемого поля в коллекцииТип данных: Строка.
    Обязательно
    dtypeТип данных поляОбязательный
    descriptionОписание поляТип данных: Строка.
    Необязательно.
    is_primaryУстанавливать ли поле в качестве поля первичного ключа или нетТип данных: Boolean (true или false).
    Обязательно для поля первичного ключа
    auto_id (Обязательно для поля первичного ключа)Переключатель для включения или отключения автоматического присвоения идентификатора (первичного ключа).True или False
    max_length (Обязательно для поля VARCHAR)Максимальная длина байта для строк, разрешенных к вставке. Обратите внимание, что многобайтовые символы (например, символы Юникода) могут занимать более одного байта каждый, поэтому убедитесь, что длина байта вставляемых строк не превышает указанного предела.[1, 65,535]
    dimРазмерность вектораТип данных: Integer ∈[1, 32768].
    Обязательно для плотного векторного поля. Опустите для разреженного векторного поля.
    is_partition_keyЯвляется ли это поле полем с ключом раздела.Тип данных: Булево (true или false).
    +

    Создание схемы поля

    Чтобы уменьшить сложность при вставке данных, Milvus позволяет указать значение по умолчанию для каждого скалярного поля при создании схемы поля, за исключением поля первичного ключа. Это означает, что если вы оставите поле пустым при вставке данных, то к нему будет применено значение по умолчанию, указанное вами для этого поля.

    +

    Создайте обычную схему поля:

    +
    from pymilvus import DataType, FieldSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# The following creates a field and use it as the partition key
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +

    Создать схему поля со значениями по умолчанию:

    +
    from pymilvus import DataType, FieldSchema
    +
    +fields = [
    +  FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +  # configure default value `25` for field `age`
    +  FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
    +  embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +]
    +
    +

    Поддерживаемые типы данных

    DataType определяет тип данных, которые содержит поле. Разные поля поддерживают разные типы данных.

    +
      +
    • Поле первичного ключа поддерживает:

      +
        +
      • INT64: numpy.int64
      • +
      • VARCHAR: VARCHAR
      • +
    • +
    • Скалярное поле поддерживает:

      +
        +
      • BOOL: Boolean (true или false)
      • +
      • INT8: numpy.int8
      • +
      • INT16: numpy.int16
      • +
      • INT32: numpy.int32
      • +
      • INT64: numpy.int64
      • +
      • FLOAT: numpy.float32
      • +
      • DOUBLE: numpy.double
      • +
      • VARCHAR: VARCHAR
      • +
      • JSON: JSON
      • +
      • Array: Array
      • +
      +

      Доступен JSON как составной тип данных. Поле JSON состоит из пар ключ-значение. Каждый ключ - это строка, а значение может быть числом, строкой, булевым значением, массивом или списком. Подробнее см. в разделе JSON: новый тип данных.

    • +
    • Поддерживается векторное поле:

      +
        +
      • BINARY_VECTOR: хранит двоичные данные в виде последовательности 0 и 1, используется для компактного представления признаков при обработке изображений и поиске информации.
      • +
      • FLOAT_VECTOR: хранит 32-битные числа с плавающей точкой, широко используемые в научных вычислениях и машинном обучении для представления вещественных чисел.
      • +
      • FLOAT16_VECTOR: хранит 16-битные числа с плавающей точкой половинной точности, используемые в глубоком обучении и вычислениях на GPU для повышения эффективности использования памяти и пропускной способности.
      • +
      • BFLOAT16_VECTOR: хранит 16-битные числа с плавающей точкой с пониженной точностью, но с тем же диапазоном экспонент, что и Float32. Это популярно в глубоком обучении для снижения требований к памяти и вычислениям без существенного влияния на точность.
      • +
      • SPARSE_FLOAT_VECTOR: хранит список ненулевых элементов и соответствующих им индексов, используется для представления разреженных векторов. Для получения дополнительной информации обратитесь к разделу "Разреженные векторы".
      • +
      +

      Milvus поддерживает несколько векторных полей в коллекции. Дополнительные сведения см. в разделе Гибридный поиск.

    • +
    +

    Схема коллекции

    Схема коллекции - это логическое определение коллекции. Обычно перед определением схемы коллекции и управлением коллекциями необходимо определить схему поля.

    +

    Свойства схемы коллекции

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    СвойстваОписаниеПримечание
    fieldПоля в создаваемой коллекцииОбязательное
    descriptionОписание коллекцииТип данных: Строка.
    Необязательно.
    partition_key_fieldИмя поля, которое будет выступать в качестве ключа раздела.Тип данных: Строка.
    Необязательно.
    enable_dynamic_fieldВключать ли динамическую схему или нет.Тип данных: Булево (true или false).
    Необязательно, по умолчанию False.
    Подробнее о динамической схеме см. в разделе Динамическая схема и в руководствах пользователя по управлению коллекциями.
    +

    Создание схемы коллекции

    + Перед определением схемы коллекции определите схемы полей.
    +
    from pymilvus import DataType, FieldSchema, CollectionSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +# Set enable_dynamic_field to True if you need to use dynamic fields. 
    +schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")
    +
    +

    Создайте коллекцию с указанной схемой:

    +
    from pymilvus import Collection, connections
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +collection_name1 = "tutorial_1"
    +collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
    +
    +
    +
      +
    • Вы можете определить номер шарда с помощью shards_num.
    • +
    • Вы можете определить сервер Milvus, на котором хотите создать коллекцию, указав псевдоним в using.
    • +
    • Вы можете включить функцию ключа раздела для поля, установив is_partition_key на True для поля, если вам нужно реализовать многопользовательскую работу на основе ключа раздела.
    • +
    • Можно включить динамическую схему, установив enable_dynamic_field на True в схеме коллекции, если необходимо включить динамическое поле.
    • +
    +
    +


    +Вы также можете создать коллекцию с помощью Collection.construct_from_dataframe, который автоматически генерирует схему коллекции из DataFrame и создает коллекцию.

    +
    from pymilvus import Collection
    +import pandas as pd
    +df = pd.DataFrame({
    +    "id": [i for i in range(nb)],
    +    "age": [random.randint(20, 40) for i in range(nb)],
    +    "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
    +    "position": "test_pos"
    +})
    +
    +collection, ins_res = Collection.construct_from_dataframe(
    +    'my_collection',
    +    df,
    +    primary_field='id',
    +    auto_id=False
    +    )
    +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_common.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_common.json new file mode 100644 index 000000000..09d144ec5 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_common.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"common-related Configurations","anchorList":[{"label":"Конфигурации, связанные с общим","href":"common-related-Configurations","type":1,"isActive":false},{"label":"common.defaultPartitionName","href":"commondefaultPartitionName","type":2,"isActive":false},{"label":"common.defaultIndexName","href":"commondefaultIndexName","type":2,"isActive":false},{"label":"common.entityExpiration","href":"commonentityExpiration","type":2,"isActive":false},{"label":"common.indexSliceSize","href":"commonindexSliceSize","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.highPriority","href":"commonthreadCoreCoefficienthighPriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.middlePriority","href":"commonthreadCoreCoefficientmiddlePriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.lowPriority","href":"commonthreadCoreCoefficientlowPriority","type":2,"isActive":false},{"label":"common.gracefulTime","href":"commongracefulTime","type":2,"isActive":false},{"label":"common.gracefulStopTimeout","href":"commongracefulStopTimeout","type":2,"isActive":false},{"label":"common.storageType","href":"commonstorageType","type":2,"isActive":false},{"label":"common.simdType","href":"commonsimdType","type":2,"isActive":false},{"label":"common.security.superUsers","href":"commonsecuritysuperUsers","type":2,"isActive":false},{"label":"common.security.defaultRootPassword","href":"commonsecuritydefaultRootPassword","type":2,"isActive":false},{"label":"common.session.ttl","href":"commonsessionttl","type":2,"isActive":false},{"label":"common.session.retryTimes","href":"commonsessionretryTimes","type":2,"isActive":false},{"label":"common.locks.metrics.enable","href":"commonlocksmetricsenable","type":2,"isActive":false},{"label":"common.locks.threshold.info","href":"commonlocksthresholdinfo","type":2,"isActive":false},{"label":"common.locks.threshold.warn","href":"commonlocksthresholdwarn","type":2,"isActive":false},{"label":"common.ttMsgEnabled","href":"commonttMsgEnabled","type":2,"isActive":false},{"label":"common.traceLogMode","href":"commontraceLogMode","type":2,"isActive":false},{"label":"common.bloomFilterSize","href":"commonbloomFilterSize","type":2,"isActive":false},{"label":"common.maxBloomFalsePositive","href":"commonmaxBloomFalsePositive","type":2,"isActive":false},{"label":"common.bloomFilterType","href":"commonbloomFilterType","type":2,"isActive":false},{"label":"common.bloomFilterApplyBatchSize","href":"commonbloomFilterApplyBatchSize","type":2,"isActive":false},{"label":"common.usePartitionKeyAsClusteringKey","href":"commonusePartitionKeyAsClusteringKey","type":2,"isActive":false},{"label":"common.useVectorAsClusteringKey","href":"commonuseVectorAsClusteringKey","type":2,"isActive":false},{"label":"common.enableVectorClusteringKey","href":"commonenableVectorClusteringKey","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_common.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_common.md new file mode 100644 index 000000000..d2dcd999f --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_common.md @@ -0,0 +1,812 @@ +--- +id: configure_common.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить общие настройки для Milvus.' +--- +

    Конфигурации, связанные с общим

    common.defaultPartitionName

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Имя раздела по умолчанию при создании коллекции _default
    +

    common.defaultIndexName

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Имя индекса, когда он создается с неопределенным именем _default_idx
    +

    common.entityExpiration

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Истечение срока действия сущности в секундах, ВНИМАНИЕ -1 означает никогда не истекать -1
    +

    common.indexSliceSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер фрагмента индекса в МБ 16
    +

    common.threadCoreCoefficient.highPriority

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Этот параметр определяет, во сколько раз количество потоков больше количества ядер в пуле высокого приоритета 10
    +

    common.threadCoreCoefficient.middlePriority

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Этот параметр определяет, во сколько раз количество потоков больше количества ядер в пуле среднего приоритета 5
    +

    common.threadCoreCoefficient.lowPriority

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Этот параметр определяет, во сколько раз количество потоков больше количества ядер в пуле низкого приоритета 1
    +

    common.gracefulTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Миллисекунды. Он представляет собой интервал (в мс), на который необходимо вычесть время поступления запроса в случае Bounded Consistency. 5000
    +

    common.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. Он принудительно завершит работу сервера, если процесс льготной остановки не будет завершен в течение этого времени. 1800
    +

    common.storageType

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    настраивается во встроенном Milvus: local, доступны значения [local, remote, opendal], значение minio устарело, вместо него используйте remote удаленный
    +

    common.simdType

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Значение по умолчанию: auto
  • +
  • Доступные значения: [auto, avx512, avx2, avx, sse4_2].
  • +
  • Эта конфигурация используется только в querynode и indexnode, она выбирает набор инструкций процессора для поиска и построения индексов.
  • auto
    +

    common.security.superUsers

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Суперпользователи будут игнорировать некоторые процессы проверки системы,
  • +
  • например, проверку старого пароля при обновлении учетных данных.
  • +

    common.security.defaultRootPassword

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    пароль по умолчанию для пользователя root Milvus
    +

    common.session.ttl

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    значение ttl при предоставлении сеанса аренды службе регистрации 30
    +

    common.session.retryTimes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    время повторных попыток при отправке сеансом etcd-запросов 30
    +

    common.locks.metrics.enable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    собирать ли статистику для блокировок метрик false
    +

    common.locks.threshold.info

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    минимальное количество миллисекунд для длительности печати на информационном уровне 500
    +

    common.locks.threshold.warn

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    минимальное количество миллисекунд для длительности печати на уровне предупреждения 1000
    +

    common.ttMsgEnabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Отключать ли внутренний механизм передачи сообщений о времени в системе.
  • +
  • Если отключить (установить значение false), система не будет разрешать операции DML, включая вставку, удаление, запросы и поиск.
  • +
  • Это помогает Milvus-CDC синхронизировать инкрементные данные.
  • true
    +

    common.traceLogMode

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    информация о запросе трассировки 0
    +

    common.bloomFilterSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    начальный размер фильтра bloom 100000
    +

    common.maxBloomFalsePositive

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный коэффициент ложных срабатываний для фильтра bloom 0.001
    +

    common.bloomFilterType

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    тип фильтра цветения, поддерживает BasicBloomFilter и BlockedBloomFilter BasicBloomFilter
    +

    common.bloomFilterApplyBatchSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер партии при применении pk к bloom-фильтру 1000
    +

    common.usePartitionKeyAsClusteringKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    если true, выполнять уплотнение кластеризации и обрезку сегментов по полю ключа раздела false
    +

    common.useVectorAsClusteringKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    если true, выполнять уплотнение кластеризации и обрезку сегментов по полю вектора false
    +

    common.enableVectorClusteringKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    если true, включить ключ кластеризации векторов и уплотнение кластеризации векторов false
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.json new file mode 100644 index 000000000..2f8c5e5b7 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataCoord-related Configurations","anchorList":[{"label":"ДанныеКонфигурации, связанные с крышей","href":"dataCoord-related-Configurations","type":1,"isActive":false},{"label":"dataCoord.channel.watchTimeoutInterval","href":"dataCoordchannelwatchTimeoutInterval","type":2,"isActive":false},{"label":"dataCoord.channel.balanceWithRpc","href":"dataCoordchannelbalanceWithRpc","type":2,"isActive":false},{"label":"dataCoord.channel.legacyVersionWithoutRPCWatch","href":"dataCoordchannellegacyVersionWithoutRPCWatch","type":2,"isActive":false},{"label":"dataCoord.channel.balanceSilentDuration","href":"dataCoordchannelbalanceSilentDuration","type":2,"isActive":false},{"label":"dataCoord.channel.balanceInterval","href":"dataCoordchannelbalanceInterval","type":2,"isActive":false},{"label":"dataCoord.channel.checkInterval","href":"dataCoordchannelcheckInterval","type":2,"isActive":false},{"label":"dataCoord.channel.notifyChannelOperationTimeout","href":"dataCoordchannelnotifyChannelOperationTimeout","type":2,"isActive":false},{"label":"dataCoord.segment.maxSize","href":"dataCoordsegmentmaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.diskSegmentMaxSize","href":"dataCoordsegmentdiskSegmentMaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.sealProportion","href":"dataCoordsegmentsealProportion","type":2,"isActive":false},{"label":"dataCoord.segment.assignmentExpiration","href":"dataCoordsegmentassignmentExpiration","type":2,"isActive":false},{"label":"dataCoord.segment.allocLatestExpireAttempt","href":"dataCoordsegmentallocLatestExpireAttempt","type":2,"isActive":false},{"label":"dataCoord.segment.maxLife","href":"dataCoordsegmentmaxLife","type":2,"isActive":false},{"label":"dataCoord.segment.maxIdleTime","href":"dataCoordsegmentmaxIdleTime","type":2,"isActive":false},{"label":"dataCoord.segment.minSizeFromIdleToSealed","href":"dataCoordsegmentminSizeFromIdleToSealed","type":2,"isActive":false},{"label":"dataCoord.segment.maxBinlogFileNumber","href":"dataCoordsegmentmaxBinlogFileNumber","type":2,"isActive":false},{"label":"dataCoord.segment.smallProportion","href":"dataCoordsegmentsmallProportion","type":2,"isActive":false},{"label":"dataCoord.segment.compactableProportion","href":"dataCoordsegmentcompactableProportion","type":2,"isActive":false},{"label":"dataCoord.segment.expansionRate","href":"dataCoordsegmentexpansionRate","type":2,"isActive":false},{"label":"dataCoord.sealPolicy.channel.growingSegmentsMemSize","href":"dataCoordsealPolicychannelgrowingSegmentsMemSize","type":2,"isActive":false},{"label":"dataCoord.autoUpgradeSegmentIndex","href":"dataCoordautoUpgradeSegmentIndex","type":2,"isActive":false},{"label":"dataCoord.segmentFlushInterval","href":"dataCoordsegmentFlushInterval","type":2,"isActive":false},{"label":"dataCoord.enableCompaction","href":"dataCoordenableCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.enableAutoCompaction","href":"dataCoordcompactionenableAutoCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.enable","href":"dataCoordcompactionclusteringenable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.autoEnable","href":"dataCoordcompactionclusteringautoEnable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.triggerInterval","href":"dataCoordcompactionclusteringtriggerInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minInterval","href":"dataCoordcompactionclusteringminInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxInterval","href":"dataCoordcompactionclusteringmaxInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.newDataSizeThreshold","href":"dataCoordcompactionclusteringnewDataSizeThreshold","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxTrainSizeRatio","href":"dataCoordcompactionclusteringmaxTrainSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxCentroidsNum","href":"dataCoordcompactionclusteringmaxCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minCentroidsNum","href":"dataCoordcompactionclusteringminCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minClusterSizeRatio","href":"dataCoordcompactionclusteringminClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSizeRatio","href":"dataCoordcompactionclusteringmaxClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSize","href":"dataCoordcompactionclusteringmaxClusterSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.minSize","href":"dataCoordcompactionlevelzeroforceTriggerminSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.maxSize","href":"dataCoordcompactionlevelzeroforceTriggermaxSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMinNum","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMaxNum","type":2,"isActive":false},{"label":"dataCoord.syncSegmentsInterval","href":"dataCoordsyncSegmentsInterval","type":2,"isActive":false},{"label":"dataCoord.enableGarbageCollection","href":"dataCoordenableGarbageCollection","type":2,"isActive":false},{"label":"dataCoord.gc.interval","href":"dataCoordgcinterval","type":2,"isActive":false},{"label":"dataCoord.gc.missingTolerance","href":"dataCoordgcmissingTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.dropTolerance","href":"dataCoordgcdropTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.removeConcurrent","href":"dataCoordgcremoveConcurrent","type":2,"isActive":false},{"label":"dataCoord.gc.scanInterval","href":"dataCoordgcscanInterval","type":2,"isActive":false},{"label":"dataCoord.brokerTimeout","href":"dataCoordbrokerTimeout","type":2,"isActive":false},{"label":"dataCoord.autoBalance","href":"dataCoordautoBalance","type":2,"isActive":false},{"label":"dataCoord.checkAutoBalanceConfigInterval","href":"dataCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"dataCoord.import.filesPerPreImportTask","href":"dataCoordimportfilesPerPreImportTask","type":2,"isActive":false},{"label":"dataCoord.import.taskRetention","href":"dataCoordimporttaskRetention","type":2,"isActive":false},{"label":"dataCoord.import.maxSizeInMBPerImportTask","href":"dataCoordimportmaxSizeInMBPerImportTask","type":2,"isActive":false},{"label":"dataCoord.import.scheduleInterval","href":"dataCoordimportscheduleInterval","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalHigh","href":"dataCoordimportcheckIntervalHigh","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalLow","href":"dataCoordimportcheckIntervalLow","type":2,"isActive":false},{"label":"dataCoord.import.maxImportFileNumPerReq","href":"dataCoordimportmaxImportFileNumPerReq","type":2,"isActive":false},{"label":"dataCoord.import.waitForIndex","href":"dataCoordimportwaitForIndex","type":2,"isActive":false},{"label":"dataCoord.gracefulStopTimeout","href":"dataCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"dataCoord.slot.clusteringCompactionUsage","href":"dataCoordslotclusteringCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.mixCompactionUsage","href":"dataCoordslotmixCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.l0DeleteCompactionUsage","href":"dataCoordslotl0DeleteCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.ip","href":"dataCoordip","type":2,"isActive":false},{"label":"dataCoord.port","href":"dataCoordport","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxSendSize","href":"dataCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxRecvSize","href":"dataCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxSendSize","href":"dataCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxRecvSize","href":"dataCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.md new file mode 100644 index 000000000..a28463233 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_datacoord.md @@ -0,0 +1,2009 @@ +--- +id: configure_datacoord.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить dataCoord для Milvus.' +--- +

    ДанныеКонфигурации, связанные с крышей

    dataCoord.channel.watchTimeoutInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Таймаут на просмотр каналов (в секундах). При обновлении тиклера Датанод прогресс просмотра сбрасывает таймер таймаута. 300
    +

    dataCoord.channel.balanceWithRpc

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли балансировку с помощью RPC, по умолчанию используется etcd watch true
    +

    dataCoord.channel.legacyVersionWithoutRPCWatch

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Датаноды <= этой версии считаются устаревшими узлами, у которых нет rpc watch(). Это используется только во время скользящего обновления, когда устаревшие узлы не получат новых каналов. 2.4.1
    +

    dataCoord.channel.balanceSilentDuration

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Продолжительность, после которой менеджер каналов начинает фоновую балансировку каналов 300
    +

    dataCoord.channel.balanceInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал, с которым менеджер каналов проверяет состояние баланса каналов dml 360
    +

    dataCoord.channel.checkInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал в секундах, с которым менеджер каналов обновляет состояние каналов 1
    +

    dataCoord.channel.notifyChannelOperationTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Таймаут уведомления об операциях с каналом (в секундах). 5
    +

    dataCoord.segment.maxSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер сегмента, ед: МБ. datacoord.segment.maxSize и datacoord.segment.sealProportion вместе определяют, может ли сегмент быть запечатан. 1024
    +

    dataCoord.segment.diskSegmentMaxSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер сегмента в МБ для коллекции, имеющей индекс Disk 2048
    +

    dataCoord.segment.sealProportion

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальная пропорция к datacoord.segment.maxSize для уплотнения сегмента. datacoord.segment.maxSize и datacoord.segment.sealProportion вместе определяют, может ли сегмент быть уплотнен. 0.12
    +

    dataCoord.segment.assignmentExpiration

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Время истечения срока действия назначения сегмента, единица измерения: мс 2000
    +

    dataCoord.segment.allocLatestExpireAttempt

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Время попытки выделения последнего lastExpire из rootCoord после перезапуска 200
    +

    dataCoord.segment.maxLife

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное время жизни сегмента в секундах, 24*60*60 86400
    +

    dataCoord.segment.maxIdleTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Если сегмент не принял dml-записи в течение maxIdleTime и размер сегмента больше, чем
  • +
  • minSizeFromIdleToSealed, Milvus автоматически запечатает его.
  • +
  • Максимальное время простоя сегмента в секундах, 10*60.
  • 600
    +

    dataCoord.segment.minSizeFromIdleToSealed

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальный размер в МБ сегмента, который может простаивать от запечатывания. 16
    +

    dataCoord.segment.maxBinlogFileNumber

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество файлов binlog для одного сегмента, сегмент будет закрыт, если
  • +
  • количество файлов binlog достигнет максимального значения.
  • 32
    +

    dataCoord.segment.smallProportion

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Сегмент считается "малым сегментом", если количество строк в нем меньше 0.5
    +

    dataCoord.segment.compactableProportion

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • (smallProportion * segment max # of rows).
  • +
  • Уплотнение будет происходить на малых сегментах, если сегмент после уплотнения будет иметь
  • 0.85
    +

    dataCoord.segment.expansionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • больше (compactableProportion * segment max # of rows) рядов.
  • +
  • ДОЛЖНО БЫТЬ БОЛЬШЕ ИЛИ РАВНО !!!
  • +
  • Во время уплотнения размер сегмента # rows может превышать сегмент max # rows на (expansionRate-1) * 100%.
  • 1.25
    +

    dataCoord.sealPolicy.channel.growingSegmentsMemSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Порог размера в МБ, если суммарный размер растущих сегментов каждого шарда
  • +
  • превысит этот порог, самый большой растущий сегмент будет запечатан.
  • 4096
    +

    dataCoord.autoUpgradeSegmentIndex

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    автоматическое обновление индекса сегмента до версии индексного движка false
    +

    dataCoord.segmentFlushInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    минимальная длительность интервала (единица измерения: секунды) между операциями флузинга на одном и том же сегменте 2
    +

    dataCoord.enableCompaction

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Значение переключателя для управления включением уплотнения сегментов.
  • +
  • При уплотнении сегменты небольшого размера объединяются в большой сегмент, а удаленные сущности очищаются за время, превышающее длительность аренды Time Travel.
  • true
    +

    dataCoord.compaction.enableAutoCompaction

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Значение переключателя для управления включением автоматического уплотнения сегментов, во время которого data coord находит и объединяет уплотняемые сегменты в фоновом режиме.
  • +
  • Эта настройка действует только в том случае, если dataCoord.enableCompaction имеет значение true.
  • true
    +

    dataCoord.compaction.clustering.enable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить уплотнение кластеризации true
    +

    dataCoord.compaction.clustering.autoEnable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить автоматическое уплотнение кластеризации false
    +

    dataCoord.compaction.clustering.triggerInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал срабатывания кластерного уплотнения в секундах 600
    +

    dataCoord.compaction.clustering.minInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальный интервал между выполнениями кластерного уплотнения одной коллекции, чтобы избежать избыточного уплотнения 3600
    +

    dataCoord.compaction.clustering.maxInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Если коллекция не была уплотнена кластеризацией дольше, чем maxInterval, принудительное уплотнение 259200
    +

    dataCoord.compaction.clustering.newDataSizeThreshold

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Если размер новых данных больше, чем newDataSizeThreshold, выполнить кластерное уплотнение 512m
    +

    dataCoord.compaction.clustering.maxTrainSizeRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное отношение размера данных в обучении Kmeans, если оно больше, то выборка будет уменьшена, чтобы соответствовать этому ограничению 0.8
    +

    dataCoord.compaction.clustering.maxCentroidsNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное количество центроидов в Kmeans train 10240
    +

    dataCoord.compaction.clustering.minCentroidsNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    минимальное количество центроидов в поезде Kmeans 16
    +

    dataCoord.compaction.clustering.minClusterSizeRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    минимальный размер кластера / средний размер в Kmeans train 0.01
    +

    dataCoord.compaction.clustering.maxClusterSizeRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный размер кластера / avg размер в Kmeans train 10
    +

    dataCoord.compaction.clustering.maxClusterSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный размер кластера в Kmeans train 5g
    +

    dataCoord.compaction.levelzero.forceTrigger.minSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальный размер в байтах для принудительного запуска LevelZero Compaction, по умолчанию 8MB 8388608
    +

    dataCoord.compaction.levelzero.forceTrigger.maxSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер в байтах для принудительного запуска LevelZero Compaction, по умолчанию 64MB 67108864
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальное количество файлов deltalog для принудительного запуска LevelZero Compaction 10
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество файлов дельталога для принудительного запуска LevelZero Compaction, по умолчанию 30 30
    +

    dataCoord.syncSegmentsInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Временной интервал для регулярной синхронизации сегментов 300
    +

    dataCoord.enableGarbageCollection

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Значение переключателя для управления включением сборки мусора для очистки отброшенных данных в службе MinIO или S3. true
    +

    dataCoord.gc.interval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал, с которым data coord выполняет сборку мусора, единица измерения: секунда. 3600
    +

    dataCoord.gc.missingTolerance

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Продолжительность хранения незаписанных файлов двоичного журнала (binlog). Установка достаточно большого значения для этого параметра позволяет избежать ошибочного удаления вновь созданных файлов binlog, в которых отсутствуют метаданные. Единица измерения: секунда. 86400
    +

    dataCoord.gc.dropTolerance

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Длительность хранения файлов binlog удаленных сегментов перед их очисткой, единица измерения: секунда. 10800
    +

    dataCoord.gc.removeConcurrent

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    количество одновременных горутин для удаления удаленных объектов s3 32
    +

    dataCoord.gc.scanInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    файл-сирота (файл в oss, но не зарегистрирован в meta) в хранилище объектов интервал сканирования сборки мусора в часах 168
    +

    dataCoord.brokerTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    5000 мс, dataCoord таймаут rpc брокера 5000
    +

    dataCoord.autoBalance

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить автоматический баланс true
    +

    dataCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал проверки автобаланса 10
    +

    dataCoord.import.filesPerPreImportTask

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество файлов, допустимое для одной задачи предварительного импорта. 2
    +

    dataCoord.import.taskRetention

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Период хранения в секундах для задач в состоянии "Завершено" или "Не удалось". 10800
    +

    dataCoord.import.maxSizeInMBPerImportTask

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Чтобы предотвратить генерацию маленьких сегментов, мы будем перегруппировывать импортируемые файлы. Этот параметр представляет собой сумму размеров файлов в каждой группе (в каждой задаче импорта). 6144
    +

    dataCoord.import.scheduleInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал планирования импорта, измеряется в секундах. 2
    +

    dataCoord.import.checkIntervalHigh

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал проверки импорта, измеряемый в секундах, установлен на высокую частоту для программы проверки импорта. 2
    +

    dataCoord.import.checkIntervalLow

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал проверки импорта, измеряемый в секундах, установлен на низкую частоту для средства проверки импорта. 120
    +

    dataCoord.import.maxImportFileNumPerReq

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество файлов, разрешенное для одного запроса на импорт. 1024
    +

    dataCoord.import.waitForIndex

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Указывает, ожидает ли операция импорта завершения построения индекса. true
    +

    dataCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. принудительная остановка узла без изящной остановки 5
    +

    dataCoord.slot.clusteringCompactionUsage

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    использование слота для задания уплотнения кластеризации. 16
    +

    dataCoord.slot.mixCompactionUsage

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    использование слота для задания уплотнения смеси. 8
    +

    dataCoord.slot.l0DeleteCompactionUsage

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    использование слота для задания уплотнения l0. 8
    +

    dataCoord.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес адреса dataCoord. Если не указан, используется первый одноадресный адрес.
    +

    dataCoord.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт dataCoord 13333
    +

    dataCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить dataCoord, единица измерения: байт 536870912
    +

    dataCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить dataCoord, единица измерения: байт 268435456
    +

    dataCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на dataCoord, единица измерения: байт 268435456
    +

    dataCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на dataCoord, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.json new file mode 100644 index 000000000..462788ffc --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataNode-related Configurations","anchorList":[{"label":"Конфигурации, связанные с dataNode","href":"dataNode-related-Configurations","type":1,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxQueueLength","href":"dataNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxParallelism","href":"dataNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"dataNode.dataSync.maxParallelSyncMgrTasks","href":"dataNodedataSyncmaxParallelSyncMgrTasks","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.enable","href":"dataNodedataSyncskipModeenable","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.skipNum","href":"dataNodedataSyncskipModeskipNum","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.coldTime","href":"dataNodedataSyncskipModecoldTime","type":2,"isActive":false},{"label":"dataNode.segment.insertBufSize","href":"dataNodesegmentinsertBufSize","type":2,"isActive":false},{"label":"dataNode.segment.deleteBufBytes","href":"dataNodesegmentdeleteBufBytes","type":2,"isActive":false},{"label":"dataNode.segment.syncPeriod","href":"dataNodesegmentsyncPeriod","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncEnable","href":"dataNodememoryforceSyncEnable","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncSegmentNum","href":"dataNodememoryforceSyncSegmentNum","type":2,"isActive":false},{"label":"dataNode.memory.checkInterval","href":"dataNodememorycheckInterval","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncWatermark","href":"dataNodememoryforceSyncWatermark","type":2,"isActive":false},{"label":"dataNode.channel.workPoolSize","href":"dataNodechannelworkPoolSize","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointMaxParallel","href":"dataNodechannelupdateChannelCheckpointMaxParallel","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointInterval","href":"dataNodechannelupdateChannelCheckpointInterval","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointRPCTimeout","href":"dataNodechannelupdateChannelCheckpointRPCTimeout","type":2,"isActive":false},{"label":"dataNode.channel.maxChannelCheckpointsPerPRC","href":"dataNodechannelmaxChannelCheckpointsPerPRC","type":2,"isActive":false},{"label":"dataNode.channel.channelCheckpointUpdateTickInSeconds","href":"dataNodechannelchannelCheckpointUpdateTickInSeconds","type":2,"isActive":false},{"label":"dataNode.import.maxConcurrentTaskNum","href":"dataNodeimportmaxConcurrentTaskNum","type":2,"isActive":false},{"label":"dataNode.import.maxImportFileSizeInGB","href":"dataNodeimportmaxImportFileSizeInGB","type":2,"isActive":false},{"label":"dataNode.import.readBufferSizeInMB","href":"dataNodeimportreadBufferSizeInMB","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroBatchMemoryRatio","href":"dataNodecompactionlevelZeroBatchMemoryRatio","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroMaxBatchSize","href":"dataNodecompactionlevelZeroMaxBatchSize","type":2,"isActive":false},{"label":"dataNode.gracefulStopTimeout","href":"dataNodegracefulStopTimeout","type":2,"isActive":false},{"label":"dataNode.slot.slotCap","href":"dataNodeslotslotCap","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.memoryBufferRatio","href":"dataNodeclusteringCompactionmemoryBufferRatio","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.workPoolSize","href":"dataNodeclusteringCompactionworkPoolSize","type":2,"isActive":false},{"label":"dataNode.ip","href":"dataNodeip","type":2,"isActive":false},{"label":"dataNode.port","href":"dataNodeport","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxSendSize","href":"dataNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxRecvSize","href":"dataNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxSendSize","href":"dataNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxRecvSize","href":"dataNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.md new file mode 100644 index 000000000..a7025e61f --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_datanode.md @@ -0,0 +1,1015 @@ +--- +id: configure_datanode.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить dataNode для Milvus.' +--- +

    Конфигурации, связанные с dataNode

    dataNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальная длина очереди задач в графе потока 16
    +

    dataNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество параллельно выполняемых задач в графе потока 1024
    +

    dataNode.dataSync.maxParallelSyncMgrTasks

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество одновременных задач синхронизации для datanode sync mgr в глобальном масштабе 256
    +

    dataNode.dataSync.skipMode.enable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Поддержка пропуска некоторых сообщений timetick для снижения нагрузки на процессор true
    +

    dataNode.dataSync.skipMode.skipNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Потреблять по одной за каждые n пропущенных записей 4
    +

    dataNode.dataSync.skipMode.coldTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить режим пропуска после того, как в течение x секунд были только сообщения о таймлапсе 60
    +

    dataNode.segment.insertBufSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальный размер каждого файла бинлога в сегменте, буферизованном в памяти. Файлы бинлога, размер которых превышает это значение, затем сбрасываются в службу MinIO или S3.
  • +
  • Единица измерения: Байт .
  • +
  • Слишком маленькое значение этого параметра приводит к тому, что система слишком часто сохраняет небольшой объем данных. Слишком большое значение увеличивает потребность системы в памяти.
  • 16777216
    +

    dataNode.segment.deleteBufBytes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер буфера в байтах для промывки del для одного канала, по умолчанию 16 МБ. 16777216
    +

    dataNode.segment.syncPeriod

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Период синхронизации сегментов, если буфер не пуст. 600
    +

    dataNode.memory.forceSyncEnable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Установите значение true, чтобы принудительно синхронизировать сегменты при слишком большом использовании памяти true
    +

    dataNode.memory.forceSyncSegmentNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    количество сегментов для синхронизации, будут синхронизированы сегменты с наибольшим буфером. 1
    +

    dataNode.memory.checkInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал проверки использования памяти узла данных, в миллисекундах 3000
    +

    dataNode.memory.forceSyncWatermark

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    водяной знак памяти для автономной работы, при достижении которого сегменты будут синхронизированы. 0.5
    +

    dataNode.channel.workPoolSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • указать размер глобального рабочего пула всех каналов
  • +
  • если этот параметр <= 0, то он будет установлен как максимальное количество CPU, которые могут выполнять работу
  • +
  • рекомендуется устанавливать большее значение при большом количестве коллекций, чтобы избежать блокировки
  • -1
    +

    dataNode.channel.updateChannelCheckpointMaxParallel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • указать размер глобального рабочего пула для обновления контрольных точек каналов
  • +
  • если этот параметр <= 0, то будет установлено значение 10
  • 10
    +

    dataNode.channel.updateChannelCheckpointInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    длительность интервала (в секундах) для обновления контрольной точки каждого канала на узле данных 60
    +

    dataNode.channel.updateChannelCheckpointRPCTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    таймаут в секундах для вызова RPC UpdateChannelCheckpoint 20
    +

    dataNode.channel.maxChannelCheckpointsPerPRC

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество контрольных точек канала для одного RPC UpdateChannelCheckpoint. 128
    +

    dataNode.channel.channelCheckpointUpdateTickInSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Частота, в секундах, с которой программа обновления контрольных точек канала выполняет обновления. 10
    +

    dataNode.import.maxConcurrentTaskNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество задач импорта/преимпорта, разрешенных для одновременного выполнения на узле данных. 16
    +

    dataNode.import.maxImportFileSizeInGB

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер файла (в ГБ) для файла импорта, где файл импорта относится либо к файлу на основе строк, либо к набору файлов на основе столбцов. 16
    +

    dataNode.import.readBufferSizeInMB

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер блока данных (в МБ), считываемый из менеджера чанков узлом данных во время импорта. 16
    +

    dataNode.compaction.levelZeroBatchMemoryRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Минимальный коэффициент свободной памяти для уплотнения нулевого уровня, выполняемого в пакетном режиме 0.05
    +

    dataNode.compaction.levelZeroMaxBatchSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер партии означает максимальное количество сегментов L1/L2 в партии при выполнении уплотнения L0. По умолчанию -1, любое значение, меньшее 1, означает отсутствие ограничения. Допустимый диапазон: >= 1. -1
    +

    dataNode.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. принудительная остановка узла без грациозной остановки 1800
    +

    dataNode.slot.slotCap

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество задач (например, уплотнение, импорт), разрешенных для одновременного выполнения на узле данных 16
    +

    dataNode.clusteringCompaction.memoryBufferRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Коэффициент буфера памяти для кластерного уплотнения. Данные, превышающие пороговое значение, будут выгружаться в хранилище. 0.1
    +

    dataNode.clusteringCompaction.workPoolSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    размер рабочего пула для одного задания по уплотнению кластеризации. 8
    +

    dataNode.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес узла данных. Если не указан, используется первый одноадресный адрес.
    +

    dataNode.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт узла данных 21124
    +

    dataNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить dataNode, единица измерения: байт 536870912
    +

    dataNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить узел данных, единица измерения: байт 268435456
    +

    dataNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправить клиенты на dataNode, единица измерения: байт 268435456
    +

    dataNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на dataNode, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.json new file mode 100644 index 000000000..1b1872f67 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"etcd-related Configurations","anchorList":[{"label":"Конфигурации, связанные с etcd","href":"etcd-related-Configurations","type":1,"isActive":false},{"label":"etcd.endpoints","href":"etcdendpoints","type":2,"isActive":false},{"label":"etcd.rootPath","href":"etcdrootPath","type":2,"isActive":false},{"label":"etcd.metaSubPath","href":"etcdmetaSubPath","type":2,"isActive":false},{"label":"etcd.kvSubPath","href":"etcdkvSubPath","type":2,"isActive":false},{"label":"etcd.log.level","href":"etcdloglevel","type":2,"isActive":false},{"label":"etcd.log.path","href":"etcdlogpath","type":2,"isActive":false},{"label":"etcd.ssl.enabled","href":"etcdsslenabled","type":2,"isActive":false},{"label":"etcd.ssl.tlsCert","href":"etcdssltlsCert","type":2,"isActive":false},{"label":"etcd.ssl.tlsKey","href":"etcdssltlsKey","type":2,"isActive":false},{"label":"etcd.ssl.tlsCACert","href":"etcdssltlsCACert","type":2,"isActive":false},{"label":"etcd.ssl.tlsMinVersion","href":"etcdssltlsMinVersion","type":2,"isActive":false},{"label":"etcd.requestTimeout","href":"etcdrequestTimeout","type":2,"isActive":false},{"label":"etcd.use.embed","href":"etcduseembed","type":2,"isActive":false},{"label":"etcd.data.dir","href":"etcddatadir","type":2,"isActive":false},{"label":"etcd.auth.enabled","href":"etcdauthenabled","type":2,"isActive":false},{"label":"etcd.auth.userName","href":"etcdauthuserName","type":2,"isActive":false},{"label":"etcd.auth.password","href":"etcdauthpassword","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.md new file mode 100644 index 000000000..66daeace5 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_etcd.md @@ -0,0 +1,538 @@ +--- +id: configure_etcd.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить etcd для Milvus.' +--- +

    Конфигурации, связанные с etcd

    Связанные с etcd конфигурации, используемые для хранения метаданных Milvus и обнаружения сервисов.

    +

    etcd.endpoints

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Конечные точки, используемые для доступа к сервису etcd. Вы можете изменить этот параметр в соответствии с конечными точками вашего собственного кластера etcd.
  • +
  • Переменная окружения: ETCD_ENDPOINTS
  • +
  • При запуске Milvus etcd преимущественно получает действительный адрес из переменной окружения ETCD_ENDPOINTS.
  • localhost:2379
    +

    etcd.rootPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Корневой префикс ключа, по которому Milvus хранит данные в etcd.
  • +
  • Рекомендуется изменить этот параметр перед первым запуском Milvus.
  • +
  • Чтобы разделить экземпляр etcd между несколькими экземплярами Milvus, измените это значение на другое для каждого экземпляра Milvus перед их запуском.
  • +
  • Задайте легко идентифицируемый корневой путь для Milvus, если служба etcd уже существует.
  • +
  • Изменение этого параметра для уже запущенного экземпляра Milvus может привести к сбоям при чтении унаследованных данных.
  • by-dev
    +

    etcd.metaSubPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Подпрефикс ключа, в котором Milvus хранит информацию, связанную с метаданными, в etcd.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • meta
    +

    etcd.kvSubPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Подпрефикс ключа, по которому Milvus хранит временные метки в etcd.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется не изменять этот параметр, если нет особой причины.
  • kv
    +

    etcd.log.level

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Поддерживает только debug, info, warn, error, panic или fatal. По умолчанию 'info'. info
    +

    etcd.log.path

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • путь - одно из:
  • +
  • - "default" как os.Stderr,
  • +
  • - "stderr" как os.Stderr,
  • +
  • - "stdout" как os.Stdout,
  • +
  • - путь к файлу, в который будут добавляться журналы сервера.
  • +
  • пожалуйста, настройте во встроенном Milvus: /tmp/milvus/logs/etcd.log
  • stdout
    +

    etcd.ssl.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Поддерживать ли режим безопасного соединения ETCD false
    +

    etcd.ssl.tlsCert

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу сертификата /path/to/etcd-client.pem
    +

    etcd.ssl.tlsKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу ключа /path/to/etcd-client-key.pem
    +

    etcd.ssl.tlsCACert

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу CACert /path/to/ca.pem
    +

    etcd.ssl.tlsMinVersion

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Минимальная версия TLS
  • +
  • Необязательные значения: 1.0, 1.1, 1.2, 1.3。
  • +
  • Мы рекомендуем использовать версию 1.2 и выше.
  • 1.3
    +

    etcd.requestTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Таймаут операции Etcd в миллисекундах 10000
    +

    etcd.use.embed

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли встроенную систему Etcd (встроенный сервер EtcdServer). false
    +

    etcd.data.dir

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Только встроенный Etcd. Пожалуйста, настройте во встроенном Milvus: /tmp/milvus/etcdData/ default.etcd
    +

    etcd.auth.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли аутентификацию false
    +

    etcd.auth.userName

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    имя пользователя для аутентификации etcd
    +

    etcd.auth.password

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    пароль для аутентификации etcd
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.json new file mode 100644 index 000000000..0fa7ce41b --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"gpu-related Configurations","anchorList":[{"label":"Конфигурации, связанные с gpu","href":"gpu-related-Configurations","type":1,"isActive":false},{"label":"gpu.initMemSize","href":"gpuinitMemSize","type":2,"isActive":false},{"label":"gpu.maxMemSize","href":"gpumaxMemSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.md new file mode 100644 index 000000000..f1c8c708d --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_gpu.md @@ -0,0 +1,85 @@ +--- +id: configure_gpu.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить gpu для Milvus.' +--- +

    Конфигурации, связанные с gpu

    #при использовании индексации на GPU Milvus будет использовать пул памяти, чтобы избежать частого выделения и удаления памяти.

    +

    #Здесь вы можете задать размер памяти, занимаемой пулом памяти, единицей измерения является МБ.

    +

    #отметим, что существует вероятность аварийного завершения работы Milvus, когда фактическая потребность в памяти превышает значение, заданное параметром maxMemSize.

    +

    #если initMemSize и MaxMemSize оба равны нулю,

    +

    #milvus автоматически инициализирует половину доступной памяти GPU,

    +

    #maxMemSize - всю доступную память GPU.

    +

    gpu.initMemSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер инициализации пула памяти GPU
    +

    gpu.maxMemSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер пула памяти Gpu
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.json new file mode 100644 index 000000000..dbddf7d35 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"grpc-related Configurations","anchorList":[{"label":"Конфигурации, связанные с grpc","href":"grpc-related-Configurations","type":1,"isActive":false},{"label":"grpc.gracefulStopTimeout","href":"grpcgracefulStopTimeout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.md new file mode 100644 index 000000000..cefdb2a89 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_grpc.md @@ -0,0 +1,50 @@ +--- +id: configure_grpc.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить grpc для Milvus.' +--- +

    Конфигурации, связанные с grpc

    grpc.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунда, время ожидания завершения грациозной остановки 10
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.json new file mode 100644 index 000000000..adbb07dbb --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexCoord-related Configurations","anchorList":[{"label":"Конфигурации, связанные с IndexCoord","href":"indexCoord-related-Configurations","type":1,"isActive":false},{"label":"indexCoord.segment.minSegmentNumRowsToEnableIndex","href":"indexCoordsegmentminSegmentNumRowsToEnableIndex","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.md new file mode 100644 index 000000000..9b1e182a7 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexcoord.md @@ -0,0 +1,50 @@ +--- +id: configure_indexcoord.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить indexCoord для Milvus.' +--- +

    Конфигурации, связанные с IndexCoord

    indexCoord.segment.minSegmentNumRowsToEnableIndex

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Это пороговое значение. Если число строк сегмента меньше этого значения, сегмент не будет индексироваться 1024
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.json new file mode 100644 index 000000000..9d3f7ab8d --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexNode-related Configurations","anchorList":[{"label":"Конфигурации, связанные с indexNode","href":"indexNode-related-Configurations","type":1,"isActive":false},{"label":"indexNode.enableDisk","href":"indexNodeenableDisk","type":2,"isActive":false},{"label":"indexNode.ip","href":"indexNodeip","type":2,"isActive":false},{"label":"indexNode.port","href":"indexNodeport","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxSendSize","href":"indexNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxRecvSize","href":"indexNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxSendSize","href":"indexNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxRecvSize","href":"indexNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.md new file mode 100644 index 000000000..7191fbd9e --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_indexnode.md @@ -0,0 +1,224 @@ +--- +id: configure_indexnode.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить indexNode для Milvus.' +--- +

    Конфигурации, связанные с indexNode

    indexNode.enableDisk

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    включить индексный узел для построения дискового векторного индекса true
    +

    indexNode.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес индексного узла. Если не указан, используется первый одноадресный адрес.
    +

    indexNode.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт узла indexNode 21121
    +

    indexNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить indexNode, единица измерения: байт 536870912
    +

    indexNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить узел indexNode, единица измерения: байт 268435456
    +

    indexNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на indexNode, единица измерения: байт 268435456
    +

    indexNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на indexNode, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.json new file mode 100644 index 000000000..b16d92133 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"localStorage-related Configurations","anchorList":[{"label":"Конфигурации, связанные с localStorage","href":"localStorage-related-Configurations","type":1,"isActive":false},{"label":"localStorage.path","href":"localStoragepath","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.md new file mode 100644 index 000000000..b5a4aceca --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_localstorage.md @@ -0,0 +1,53 @@ +--- +id: configure_localstorage.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить localStorage для Milvus.' +--- +

    Конфигурации, связанные с localStorage

    localStorage.path

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Локальный путь к месту хранения векторных данных во время поиска или запроса, чтобы избежать повторного обращения к службе MinIO или S3.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • /var/lib/milvus/data/
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_log.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_log.json new file mode 100644 index 000000000..37b0f966f --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_log.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"log-related Configurations","anchorList":[{"label":"Конфигурации, связанные с журналом","href":"log-related-Configurations","type":1,"isActive":false},{"label":"log.level","href":"loglevel","type":2,"isActive":false},{"label":"log.file.rootPath","href":"logfilerootPath","type":2,"isActive":false},{"label":"log.file.maxSize","href":"logfilemaxSize","type":2,"isActive":false},{"label":"log.file.maxAge","href":"logfilemaxAge","type":2,"isActive":false},{"label":"log.file.maxBackups","href":"logfilemaxBackups","type":2,"isActive":false},{"label":"log.format","href":"logformat","type":2,"isActive":false},{"label":"log.stdout","href":"logstdout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_log.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_log.md new file mode 100644 index 000000000..f025e0968 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_log.md @@ -0,0 +1,231 @@ +--- +id: configure_log.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить журнал для Milvus.' +--- +

    Конфигурации, связанные с журналом

    Настройка вывода системного журнала.

    +

    log.level

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Уровень журнала Milvus. Варианты: debug, info, warn, error, panic и fatal.
  • +
  • Рекомендуется использовать уровень debug в тестовых средах и средах разработки, а уровень info - в производственных средах.
  • info
    +

    log.file.rootPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Корневой путь к файлам журнала.
  • +
  • По умолчанию значение пустое, что означает вывод файлов журнала в стандартный вывод (stdout) и стандартную ошибку (stderr).
  • +
  • Если для этого параметра задан правильный локальный путь, Milvus записывает и сохраняет файлы журнала по этому пути.
  • +
  • Установите этот параметр в качестве пути, для которого у вас есть разрешение на запись.
  • +

    log.file.maxSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер файла журнала, ед: МБ. 300
    +

    log.file.maxAge

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное время хранения перед автоматической очисткой файла журнала, единица измерения: день. Минимальное значение - 1. 10
    +

    log.file.maxBackups

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество файлов журнала для резервного копирования, единица измерения: день. Минимальное значение - 1. 20
    +

    log.format

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Формат журнала Milvus. Варианты: текст и JSON текст
    +

    log.stdout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать или не включать Stdout истина
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.json new file mode 100644 index 000000000..02d487ea6 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"metastore-related Configurations","anchorList":[{"label":"Конфигурации, связанные с метахранилищем","href":"metastore-related-Configurations","type":1,"isActive":false},{"label":"metastore.type","href":"metastoretype","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.md new file mode 100644 index 000000000..cbb835bde --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_metastore.md @@ -0,0 +1,50 @@ +--- +id: configure_metastore.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить метахранилище для Milvus.' +--- +

    Конфигурации, связанные с метахранилищем

    metastore.type

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Значение по умолчанию: etcd, Допустимые значения: [etcd, tikv]. etcd
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.json new file mode 100644 index 000000000..7fe96af5a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"minio-related Configurations","anchorList":[{"label":"Конфигурации, связанные с MinIO","href":"minio-related-Configurations","type":1,"isActive":false},{"label":"minio.address","href":"minioaddress","type":2,"isActive":false},{"label":"minio.port","href":"minioport","type":2,"isActive":false},{"label":"minio.accessKeyID","href":"minioaccessKeyID","type":2,"isActive":false},{"label":"minio.secretAccessKey","href":"miniosecretAccessKey","type":2,"isActive":false},{"label":"minio.useSSL","href":"miniouseSSL","type":2,"isActive":false},{"label":"minio.ssl.tlsCACert","href":"miniossltlsCACert","type":2,"isActive":false},{"label":"minio.bucketName","href":"miniobucketName","type":2,"isActive":false},{"label":"minio.rootPath","href":"miniorootPath","type":2,"isActive":false},{"label":"minio.useIAM","href":"miniouseIAM","type":2,"isActive":false},{"label":"minio.cloudProvider","href":"miniocloudProvider","type":2,"isActive":false},{"label":"minio.iamEndpoint","href":"minioiamEndpoint","type":2,"isActive":false},{"label":"minio.logLevel","href":"miniologLevel","type":2,"isActive":false},{"label":"minio.region","href":"minioregion","type":2,"isActive":false},{"label":"minio.useVirtualHost","href":"miniouseVirtualHost","type":2,"isActive":false},{"label":"minio.requestTimeoutMs","href":"miniorequestTimeoutMs","type":2,"isActive":false},{"label":"minio.listObjectsMaxKeys","href":"miniolistObjectsMaxKeys","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.md new file mode 100644 index 000000000..449c2a7ad --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_minio.md @@ -0,0 +1,528 @@ +--- +id: configure_minio.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить minio для Milvus.' +--- +

    Конфигурации, связанные с MinIO

    Связанная с MinIO конфигурация MinIO/S3/GCS или любой другой сервис поддерживает S3 API, который отвечает за сохранение данных для Milvus.

    +

    В дальнейшем описании для простоты мы будем называть сервис хранения данных MinIO/S3.

    +

    minio.address

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • IP-адрес сервиса MinIO или S3.
  • +
  • Переменная окружения: MINIO_ADDRESS
  • +
  • minio.address и minio.port вместе формируют действительный доступ к службе MinIO или S3.
  • +
  • При запуске Milvus MinIO преимущественно получает действительный IP-адрес из переменной окружения MINIO_ADDRESS.
  • +
  • Значение по умолчанию применяется, когда MinIO или S3 работает в одной сети с Milvus.
  • localhost
    +

    minio.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Порт службы MinIO или S3. 9000
    +

    minio.accessKeyID

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Идентификатор ключа доступа, который MinIO или S3 выдает пользователю для авторизованного доступа.
  • +
  • Переменная окружения: MINIO_ACCESS_KEY_ID или minio.accessKeyID
  • +
  • minio.accessKeyID и minio.secretAccessKey вместе используются для аутентификации личности для доступа к сервису MinIO или S3.
  • +
  • Эта конфигурация должна быть установлена идентично переменной окружения MINIO_ACCESS_KEY_ID, которая необходима для запуска MinIO или S3.
  • +
  • Значение по умолчанию применяется к сервису MinIO или S3, запущенному с помощью стандартного файла docker-compose.yml.
  • minioadmin
    +

    minio.secretAccessKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Секретный ключ, используемый для шифрования строки подписи и проверки строки подписи на сервере. Он должен быть строго конфиденциальным и доступным только для сервера MinIO или S3 и пользователей.
  • +
  • Переменная окружения: MINIO_SECRET_ACCESS_KEY или minio.secretAccessKey
  • +
  • minio.accessKeyID и minio.secretAccessKey вместе используются для аутентификации личности при доступе к сервису MinIO или S3.
  • +
  • Эта конфигурация должна быть установлена идентично переменной окружения MINIO_SECRET_ACCESS_KEY, которая необходима для запуска MinIO или S3.
  • +
  • Значение по умолчанию применяется к сервису MinIO или S3, запущенному с помощью файла docker-compose.yml по умолчанию.
  • minioadmin
    +

    minio.useSSL

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Значение переключателя для контроля доступа к сервису MinIO или S3 через SSL. false
    +

    minio.ssl.tlsCACert

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу CACert /path/to/public.crt
    +

    minio.bucketName

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Имя ведра, в котором Milvus хранит данные в MinIO или S3.
  • +
  • Milvus 2.0.0 не поддерживает хранение данных в нескольких ведрах.
  • +
  • Ведро с таким именем будет создано, если оно не существует. Если ведро уже существует и доступно, оно будет использовано напрямую. В противном случае будет выдана ошибка.
  • +
  • Чтобы разделить экземпляр MinIO между несколькими экземплярами Milvus, перед их запуском измените это значение на другое для каждого экземпляра Milvus. Подробности см. в разделе FAQ по операциям.
  • +
  • Данные будут храниться в локальном Docker, если Docker используется для локального запуска службы MinIO. Убедитесь, что места для хранения достаточно.
  • +
  • Имя ведра глобально уникально для одного экземпляра MinIO или S3.
  • a-bucket
    +

    minio.rootPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Корневой префикс ключа, в котором Milvus хранит данные в MinIO или S3.
  • +
  • Рекомендуется изменить этот параметр перед первым запуском Milvus.
  • +
  • Чтобы разделить экземпляр MinIO между несколькими экземплярами Milvus, измените это значение на другое для каждого экземпляра Milvus перед их запуском. Подробности см. в разделе Часто задаваемые вопросы по работе.
  • +
  • Установите удобный для идентификации префикс корневого ключа для Milvus, если служба etcd уже существует.
  • +
  • Изменение этого параметра для уже запущенного экземпляра Milvus может привести к сбоям при чтении унаследованных данных.
  • файлы
    +

    minio.useIAM

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Использовать ли рольIAM для доступа к S3/GCS вместо ключей доступа/секретных ключей.
  • +
  • Для получения дополнительной информации см.
  • +
  • aws: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
  • +
  • gcp: https://cloud.google.com/storage/docs/access-control/iam
  • +
  • aliyun (ack): https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-rrsa-to-enforce-access-control
  • +
  • aliyun (ecs): https://www.alibabacloud.com/help/en/elastic-compute-service/latest/attach-an-instance-ram-role
  • ложный
    +

    minio.cloudProvider

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Облачный провайдер S3. Поддерживает: "aws", "gcp", "aliyun".
  • +
  • Вы можете использовать "aws" для другого облачного провайдера, поддерживающего S3 API с подписью v4, например: minio
  • +
  • Вы можете использовать "gcp" для другого облачного провайдера, поддерживающего S3 API с подписью v2.
  • +
  • Вы можете использовать "aliyun", если другой облачный провайдер использует bucket в стиле виртуального хоста.
  • +
  • При включенном useIAM пока поддерживаются только "aws", "gcp" и "aliyun".
  • aws
    +

    minio.iamEndpoint

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Пользовательская конечная точка для получения учетных данных роли IAM. когда useIAM равен true и cloudProvider равен "aws".
  • +
  • Оставьте это значение пустым, если вы хотите использовать конечную точку AWS по умолчанию.
  • +

    minio.logLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Уровень журнала для журнала aws sdk. Поддерживаемые уровни: off, fatal, error, warn, info, debug, trace фатальный
    +

    minio.region

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Указание региона расположения системы хранения minio
    +

    minio.useVirtualHost

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Использовать ли режим виртуального хоста для ведра false
    +

    minio.requestTimeoutMs

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    minio таймаут для времени запроса в миллисекундах 10000
    +

    minio.listObjectsMaxKeys

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество объектов, запрашиваемых за партию в minio ListObjects rpc,
  • +
  • 0 означает использование oss-клиента по умолчанию, уменьшите эти конфигурации, если таймаут ListObjects
  • 0
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.json new file mode 100644 index 000000000..b9204ef48 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"mq-related Configurations","anchorList":[{"label":"Конфигурации, связанные с mq","href":"mq-related-Configurations","type":1,"isActive":false},{"label":"mq.type","href":"mqtype","type":2,"isActive":false},{"label":"mq.enablePursuitMode","href":"mqenablePursuitMode","type":2,"isActive":false},{"label":"mq.pursuitLag","href":"mqpursuitLag","type":2,"isActive":false},{"label":"mq.pursuitBufferSize","href":"mqpursuitBufferSize","type":2,"isActive":false},{"label":"mq.mqBufSize","href":"mqmqBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.mergeCheckInterval","href":"mqdispatchermergeCheckInterval","type":2,"isActive":false},{"label":"mq.dispatcher.targetBufSize","href":"mqdispatchertargetBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.maxTolerantLag","href":"mqdispatchermaxTolerantLag","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.md new file mode 100644 index 000000000..b0f6aaf89 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_mq.md @@ -0,0 +1,262 @@ +--- +id: configure_mq.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить mq для Milvus.' +--- +

    Конфигурации, связанные с mq

    Milvus поддерживает четыре MQ: rocksmq (основанный на RockDB), natsmq (встроенный nats-сервер), Pulsar и Kafka.

    +

    Вы можете изменить свой MQ, задав поле mq.type.

    +

    Если вы не установите поле mq.type по умолчанию, в этом файле есть примечание о включении приоритета, если мы настроим несколько mq.

    +
      +
    1. автономный (локальный) режим: rocksmq (по умолчанию) > natsmq > Pulsar > Kafka

    2. +
    3. кластерный режим: Pulsar(по умолчанию) > Kafka (rocksmq и natsmq не поддерживаются в кластерном режиме)

    4. +
    +

    mq.type

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Значение по умолчанию: "default"
  • +
  • Допустимые значения: [default, pulsar, kafka, rocksmq, natsmq].
  • по умолчанию
    +

    mq.enablePursuitMode

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Значение по умолчанию: "true" true
    +

    mq.pursuitLag

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    порог запаздывания для перехода в режим преследования, в секундах 10
    +

    mq.pursuitBufferSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    размер буфера режима преследования в байтах 8388608
    +

    mq.mqBufSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Длина потребительского буфера клиента MQ 16
    +

    mq.dispatcher.mergeCheckInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    время интервала (в секундах) для проверки диспетчером необходимости объединения 1
    +

    mq.dispatcher.targetBufSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    длина буфера канала для таргета 16
    +

    mq.dispatcher.maxTolerantLag

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Значение по умолчанию: "3", таймаут (в секундах), в течение которого цель посылает msgPack 3
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.json new file mode 100644 index 000000000..a3364d399 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"msgChannel-related Configurations","anchorList":[{"label":"Конфигурации, связанные с каналом сообщений","href":"msgChannel-related-Configurations","type":1,"isActive":false},{"label":"msgChannel.chanNamePrefix.cluster","href":"msgChannelchanNamePrefixcluster","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordTimeTick","href":"msgChannelchanNamePrefixrootCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordStatistics","href":"msgChannelchanNamePrefixrootCoordStatistics","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordDml","href":"msgChannelchanNamePrefixrootCoordDml","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.queryTimeTick","href":"msgChannelchanNamePrefixqueryTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordTimeTick","href":"msgChannelchanNamePrefixdataCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordSegmentInfo","href":"msgChannelchanNamePrefixdataCoordSegmentInfo","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataCoordSubNamePrefix","href":"msgChannelsubNamePrefixdataCoordSubNamePrefix","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataNodeSubNamePrefix","href":"msgChannelsubNamePrefixdataNodeSubNamePrefix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.md new file mode 100644 index 000000000..ce69450de --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_msgchannel.md @@ -0,0 +1,316 @@ +--- +id: configure_msgchannel.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить msgChannel для Milvus.' +--- +

    Конфигурации, связанные с каналом сообщений

    В этой теме представлены конфигурации Milvus, связанные с каналами сообщений.

    +

    msgChannel.chanNamePrefix.cluster

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс корневого имени канала при создании канала сообщений.
  • +
  • Рекомендуется изменить этот параметр перед первым запуском Milvus.
  • +
  • Чтобы разделить экземпляр Pulsar между несколькими экземплярами Milvus, перед запуском каждого экземпляра Milvus измените это имя на имя, отличное от принятого по умолчанию.
  • by-dev
    +

    msgChannel.chanNamePrefix.rootCoordTimeTick

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс под-имени канала сообщений, в котором корневой коорд публикует сообщения о временных тиках.
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordTimeTick}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • rootcoord-timetick
    +

    msgChannel.chanNamePrefix.rootCoordStatistics

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс имени канала сообщений, в котором корневой коорд публикует свои сообщения статистики.
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordStatistics}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • rootcoord-statistics
    +

    msgChannel.chanNamePrefix.rootCoordDml

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс имени канала сообщений, в котором корневой коорд публикует сообщения Data Manipulation Language (DML).
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordDml}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • rootcoord-dml
    +

    msgChannel.chanNamePrefix.queryTimeTick

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс под-имени канала сообщений, в котором узел запроса публикует сообщения о временных тиках.
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.queryTimeTick}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • queryTimeTick
    +

    msgChannel.chanNamePrefix.dataCoordTimeTick

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс под-имени канала сообщений, в котором коорд данных публикует сообщения о временных тиках.
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordTimeTick}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • datacoord-timetick-channel
    +

    msgChannel.chanNamePrefix.dataCoordSegmentInfo

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс имени канала сообщений, в котором датакоорд публикует сообщения с информацией о сегментах.
  • +
  • Полный префикс имени канала - ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordSegmentInfo}.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • сегмент-инфо-канал
    +

    msgChannel.subNamePrefix.dataCoordSubNamePrefix

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс имени подписки коорд. данных.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • dataCoord
    +

    msgChannel.subNamePrefix.dataNodeSubNamePrefix

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс имени подписки узла данных.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • dataNode
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.json new file mode 100644 index 000000000..c720661d4 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"natsmq-related Configurations","anchorList":[{"label":"Конфигурации, связанные с natsmq","href":"natsmq-related-Configurations","type":1,"isActive":false},{"label":"natsmq.server.port","href":"natsmqserverport","type":2,"isActive":false},{"label":"natsmq.server.storeDir","href":"natsmqserverstoreDir","type":2,"isActive":false},{"label":"natsmq.server.maxFileStore","href":"natsmqservermaxFileStore","type":2,"isActive":false},{"label":"natsmq.server.maxPayload","href":"natsmqservermaxPayload","type":2,"isActive":false},{"label":"natsmq.server.maxPending","href":"natsmqservermaxPending","type":2,"isActive":false},{"label":"natsmq.server.initializeTimeout","href":"natsmqserverinitializeTimeout","type":2,"isActive":false},{"label":"natsmq.server.monitor.trace","href":"natsmqservermonitortrace","type":2,"isActive":false},{"label":"natsmq.server.monitor.debug","href":"natsmqservermonitordebug","type":2,"isActive":false},{"label":"natsmq.server.monitor.logTime","href":"natsmqservermonitorlogTime","type":2,"isActive":false},{"label":"natsmq.server.monitor.logFile","href":"natsmqservermonitorlogFile","type":2,"isActive":false},{"label":"natsmq.server.monitor.logSizeLimit","href":"natsmqservermonitorlogSizeLimit","type":2,"isActive":false},{"label":"natsmq.server.retention.maxAge","href":"natsmqserverretentionmaxAge","type":2,"isActive":false},{"label":"natsmq.server.retention.maxBytes","href":"natsmqserverretentionmaxBytes","type":2,"isActive":false},{"label":"natsmq.server.retention.maxMsgs","href":"natsmqserverretentionmaxMsgs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.md new file mode 100644 index 000000000..ceeb589d4 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_natsmq.md @@ -0,0 +1,429 @@ +--- +id: configure_natsmq.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить natsmq для Milvus.' +--- +

    Конфигурации, связанные с natsmq

    конфигурация natsmq.

    +

    подробнее: https://docs.nats.io/running-a-nats-service/configuration

    +

    natsmq.server.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Порт прослушивания сервера NATS. 4222
    +

    natsmq.server.storeDir

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Каталог, используемый для хранения nats в JetStream /var/lib/milvus/nats
    +

    natsmq.server.maxFileStore

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер хранилища 'file' 17179869184
    +

    natsmq.server.maxPayload

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество байт в полезной нагрузке сообщения 8388608
    +

    natsmq.server.maxPending

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество байт, буферизуемых для соединения Применяется для клиентских соединений 67108864
    +

    natsmq.server.initializeTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    ожидание завершения инициализации natsmq 4000
    +

    natsmq.server.monitor.trace

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Если true, включить сообщения журнала трассировки протокола false
    +

    natsmq.server.monitor.debug

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Если true, включить сообщения журнала отладки false
    +

    natsmq.server.monitor.logTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Если установлено значение false, журнал будет вестись без временных меток. true
    +

    natsmq.server.monitor.logFile

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Путь к файлу журнала относительно ... двоичного файла milvus, если используется относительный путь /tmp/milvus/logs/nats.log
    +

    natsmq.server.monitor.logSizeLimit

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер в байтах после переноса файла журнала на новый файл. 536870912
    +

    natsmq.server.retention.maxAge

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный возраст любого сообщения в P-канале 4320
    +

    natsmq.server.retention.maxBytes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Сколько байт может содержать один P-канал. Удаление самых старых сообщений, если P-канал превышает этот размер
    +

    natsmq.server.retention.maxMsgs

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Сколько сообщений может содержать один P-канал. Удаление самых старых сообщений, если P-канал превышает этот предел
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.json new file mode 100644 index 000000000..62351e95a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"proxy-related Configurations","anchorList":[{"label":"Конфигурации, связанные с прокси","href":"proxy-related-Configurations","type":1,"isActive":false},{"label":"proxy.timeTickInterval","href":"proxytimeTickInterval","type":2,"isActive":false},{"label":"proxy.healthCheckTimeout","href":"proxyhealthCheckTimeout","type":2,"isActive":false},{"label":"proxy.msgStream.timeTick.bufSize","href":"proxymsgStreamtimeTickbufSize","type":2,"isActive":false},{"label":"proxy.maxNameLength","href":"proxymaxNameLength","type":2,"isActive":false},{"label":"proxy.maxFieldNum","href":"proxymaxFieldNum","type":2,"isActive":false},{"label":"proxy.maxVectorFieldNum","href":"proxymaxVectorFieldNum","type":2,"isActive":false},{"label":"proxy.maxShardNum","href":"proxymaxShardNum","type":2,"isActive":false},{"label":"proxy.maxDimension","href":"proxymaxDimension","type":2,"isActive":false},{"label":"proxy.ginLogging","href":"proxyginLogging","type":2,"isActive":false},{"label":"proxy.ginLogSkipPaths","href":"proxyginLogSkipPaths","type":2,"isActive":false},{"label":"proxy.maxTaskNum","href":"proxymaxTaskNum","type":2,"isActive":false},{"label":"proxy.mustUsePartitionKey","href":"proxymustUsePartitionKey","type":2,"isActive":false},{"label":"proxy.accessLog.enable","href":"proxyaccessLogenable","type":2,"isActive":false},{"label":"proxy.accessLog.minioEnable","href":"proxyaccessLogminioEnable","type":2,"isActive":false},{"label":"proxy.accessLog.localPath","href":"proxyaccessLoglocalPath","type":2,"isActive":false},{"label":"proxy.accessLog.filename","href":"proxyaccessLogfilename","type":2,"isActive":false},{"label":"proxy.accessLog.maxSize","href":"proxyaccessLogmaxSize","type":2,"isActive":false},{"label":"proxy.accessLog.rotatedTime","href":"proxyaccessLogrotatedTime","type":2,"isActive":false},{"label":"proxy.accessLog.remotePath","href":"proxyaccessLogremotePath","type":2,"isActive":false},{"label":"proxy.accessLog.remoteMaxTime","href":"proxyaccessLogremoteMaxTime","type":2,"isActive":false},{"label":"proxy.accessLog.cacheSize","href":"proxyaccessLogcacheSize","type":2,"isActive":false},{"label":"proxy.accessLog.cacheFlushInterval","href":"proxyaccessLogcacheFlushInterval","type":2,"isActive":false},{"label":"proxy.connectionCheckIntervalSeconds","href":"proxyconnectionCheckIntervalSeconds","type":2,"isActive":false},{"label":"proxy.connectionClientInfoTTLSeconds","href":"proxyconnectionClientInfoTTLSeconds","type":2,"isActive":false},{"label":"proxy.maxConnectionNum","href":"proxymaxConnectionNum","type":2,"isActive":false},{"label":"proxy.gracefulStopTimeout","href":"proxygracefulStopTimeout","type":2,"isActive":false},{"label":"proxy.slowQuerySpanInSeconds","href":"proxyslowQuerySpanInSeconds","type":2,"isActive":false},{"label":"proxy.queryNodePooling.size","href":"proxyqueryNodePoolingsize","type":2,"isActive":false},{"label":"proxy.http.enabled","href":"proxyhttpenabled","type":2,"isActive":false},{"label":"proxy.http.debug_mode","href":"proxyhttpdebugmode","type":2,"isActive":false},{"label":"proxy.http.port","href":"proxyhttpport","type":2,"isActive":false},{"label":"proxy.http.acceptTypeAllowInt64","href":"proxyhttpacceptTypeAllowInt64","type":2,"isActive":false},{"label":"proxy.http.enablePprof","href":"proxyhttpenablePprof","type":2,"isActive":false},{"label":"proxy.ip","href":"proxyip","type":2,"isActive":false},{"label":"proxy.port","href":"proxyport","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxSendSize","href":"proxygrpcserverMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxRecvSize","href":"proxygrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxSendSize","href":"proxygrpcclientMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxRecvSize","href":"proxygrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.md new file mode 100644 index 000000000..66f29a3fc --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_proxy.md @@ -0,0 +1,1155 @@ +--- +id: configure_proxy.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить прокси для Milvus.' +--- +

    Конфигурации, связанные с прокси

    Связанная конфигурация прокси, используемая для проверки клиентских запросов и уменьшения возвращаемых результатов.

    +

    proxy.timeTickInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал, с которым прокси синхронизирует тик времени, единица измерения: мс. 200
    +

    proxy.healthCheckTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    мс, интервал, через который выполняется проверка работоспособности компонента. 3000
    +

    proxy.msgStream.timeTick.bufSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество сообщений, которое может быть буферизовано в потоке сообщений timeTick прокси при выдаче сообщений. 512
    +

    proxy.maxNameLength

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальная длина имени или псевдонима, который может быть создан в Milvus, включая имя коллекции, псевдоним коллекции, имя раздела и имя поля. 255
    +

    proxy.maxFieldNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество полей, которое может быть создано при создании в коллекции. Настоятельно НЕ рекомендуется устанавливать maxFieldNum >= 64. 64
    +

    proxy.maxVectorFieldNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество векторных полей, которое может быть указано в коллекции. Диапазон значений: [1, 10]. 4
    +

    proxy.maxShardNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество осколков, которое может быть создано при создании в коллекции. 16
    +

    proxy.maxDimension

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество размеров вектора при создании в коллекции. 32768
    +

    proxy.ginLogging

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Нужно ли создавать журналы gin.\n
  • +
  • пожалуйста, настройте во встроенном Milvus: false
  • true
    +

    proxy.ginLogSkipPaths

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    пропускать url-путь для журнала gin /
    +

    proxy.maxTaskNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество задач в очереди задач прокси-сервера. 1024
    +

    proxy.mustUsePartitionKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    переключатель, указывающий, должен ли прокси использовать ключ раздела для коллекции false
    +

    proxy.accessLog.enable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли функцию журнала доступа. false
    +

    proxy.accessLog.minioEnable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Загружать ли локальные файлы журналов доступа в MinIO. Этот параметр может быть указан, если proxy.accessLog.filename не пуст. false
    +

    proxy.accessLog.localPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Путь к локальной папке, в которой хранится файл журнала доступа. Этот параметр может быть указан, если proxy.accessLog.filename не пуст. /tmp/milvus_access
    +

    proxy.accessLog.filename

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Имя файла журнала доступа. Если оставить этот параметр пустым, журналы доступа будут выводиться в stdout.
    +

    proxy.accessLog.maxSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер, допустимый для одного файла журнала доступа. Если размер файла журнала достигнет этого предела, будет запущен процесс ротации. Этот процесс запечатывает текущий файл журнала доступа, создает новый файл журнала и очищает содержимое исходного файла журнала. Единица измерения: МБ. 64
    +

    proxy.accessLog.rotatedTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный интервал времени, допустимый для ротации одного файла журнала доступа. По достижении указанного интервала времени запускается процесс ротации, в результате которого создается новый файл журнала доступа и закрывается предыдущий. Единицы измерения: секунды 0
    +

    proxy.accessLog.remotePath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Путь к объектному хранилищу для загрузки файлов журнала доступа. access_log/
    +

    proxy.accessLog.remoteMaxTime

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал времени, допустимый для загрузки файлов журнала доступа. Если время загрузки файла журнала превышает этот интервал, файл будет удален. Установка значения 0 отключает эту функцию. 0
    +

    proxy.accessLog.cacheSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер журнала кэша записи, в байтах. (Закрыть кэш записи, если его размер был равен 0) 0
    +

    proxy.accessLog.cacheFlushInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал времени автоматической промывки кэша записи, в секундах. (Закрыть автопромывку, если интервал был равен 0) 3
    +

    proxy.connectionCheckIntervalSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал времени (в секундах), в течение которого менеджер подключений сканирует информацию о неактивных клиентах. 120
    +

    proxy.connectionClientInfoTTLSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    продолжительность TTL информации о неактивном клиенте, в секундах 86400
    +

    proxy.maxConnectionNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное количество информации о клиенте, которым должен управлять прокси, чтобы избежать слишком большого количества информации о клиенте 10000
    +

    proxy.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. принудительная остановка узла без грациозной остановки 30
    +

    proxy.slowQuerySpanInSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Запрос, время выполнения которого превышает значение `slowQuerySpanInSeconds`, может считаться медленным, в секундах. 5
    +

    proxy.queryNodePooling.size

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    размер клиентского пула shardleader(querynode) 10
    +

    proxy.http.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли http-сервер true
    +

    proxy.http.debug_mode

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли режим отладки http-сервера false
    +

    proxy.http.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    высокоуровневый restful api
    +

    proxy.http.acceptTypeAllowInt64

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    высокоуровневый restful api, может ли http-клиент иметь дело с int64 true
    +

    proxy.http.enablePprof

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включать ли промежуточное ПО pprof на порту метрики true
    +

    proxy.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес прокси-сервера. Если не указан, используется первый одноадресный адрес
    +

    proxy.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт прокси 19530
    +

    proxy.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить прокси, единица измерения: байт 268435456
    +

    proxy.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить прокси, единица измерения: байт 67108864
    +

    proxy.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на прокси, единица измерения: байт 268435456
    +

    proxy.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на прокси, единица измерения: байт 67108864
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.json new file mode 100644 index 000000000..5052d8bd5 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"pulsar-related Configurations","anchorList":[{"label":"Конфигурации, связанные с pulsar","href":"pulsar-related-Configurations","type":1,"isActive":false},{"label":"pulsar.address","href":"pulsaraddress","type":2,"isActive":false},{"label":"pulsar.port","href":"pulsarport","type":2,"isActive":false},{"label":"pulsar.webport","href":"pulsarwebport","type":2,"isActive":false},{"label":"pulsar.maxMessageSize","href":"pulsarmaxMessageSize","type":2,"isActive":false},{"label":"pulsar.tenant","href":"pulsartenant","type":2,"isActive":false},{"label":"pulsar.namespace","href":"pulsarnamespace","type":2,"isActive":false},{"label":"pulsar.requestTimeout","href":"pulsarrequestTimeout","type":2,"isActive":false},{"label":"pulsar.enableClientMetrics","href":"pulsarenableClientMetrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.md new file mode 100644 index 000000000..1246da1e7 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_pulsar.md @@ -0,0 +1,264 @@ +--- +id: configure_pulsar.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить пульсар для Milvus.' +--- +

    Конфигурации, связанные с pulsar

    Связанная конфигурация pulsar, используемая для управления журналами Milvus о последних операциях мутации, вывода потокового журнала и предоставления услуг публикации-подписки журналов.

    +

    pulsar.address

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • IP-адрес службы Pulsar.
  • +
  • Переменная окружения: PULSAR_ADDRESS
  • +
  • pulsar.address и pulsar.port вместе формируют действительный доступ к Pulsar.
  • +
  • При запуске Milvus Pulsar преимущественно получает действительный IP-адрес из переменной окружения PULSAR_ADDRESS.
  • +
  • Значение по умолчанию применяется, когда Pulsar работает в одной сети с Milvus.
  • localhost
    +

    pulsar.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Порт службы Pulsar. 6650
    +

    pulsar.webport

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Веб-порт сервиса Пульсар. Если вы подключаетесь напрямую без прокси, следует использовать 8080. 80
    +

    pulsar.maxMessageSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальный размер каждого сообщения в Pulsar. Единица измерения: Байт.
  • +
  • По умолчанию Pulsar может передавать не более 5 МБ данных в одном сообщении. Если размер вставляемых данных превышает это значение, прокси фрагментирует данные на несколько сообщений, чтобы обеспечить их корректную передачу.
  • +
  • Если соответствующий параметр в Pulsar остается неизменным, увеличение этой конфигурации приведет к сбою Milvus, а уменьшение не даст никаких преимуществ.
  • 5242880
    +

    pulsar.tenant

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Pulsar может быть предоставлен определенным арендаторам с выделением им соответствующей емкости.
  • +
  • Чтобы разделить экземпляр Pulsar между несколькими экземплярами Milvus, вы можете изменить это значение на арендатора Pulsar, а не по умолчанию для каждого экземпляра Milvus перед их запуском. Однако если вы не хотите, чтобы Pulsar был многопользовательским, рекомендуется изменить msgChannel.chanNamePrefix.cluster на другое значение.
  • public
    +

    pulsar.namespace

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Пространство имен Pulsar - это номенклатура административных единиц внутри арендатора. по умолчанию
    +

    pulsar.requestTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    таймаут глобального запроса клиента pulsar в секундах 60
    +

    pulsar.enableClientMetrics

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Регистрировать ли метрики клиента pulsar в пути метрик milvus. false
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.json new file mode 100644 index 000000000..7cfb2336b --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryCoord-related Configurations","anchorList":[{"label":"Конфигурации, связанные с queryCoord","href":"queryCoord-related-Configurations","type":1,"isActive":false},{"label":"queryCoord.autoHandoff","href":"queryCoordautoHandoff","type":2,"isActive":false},{"label":"queryCoord.autoBalance","href":"queryCoordautoBalance","type":2,"isActive":false},{"label":"queryCoord.autoBalanceChannel","href":"queryCoordautoBalanceChannel","type":2,"isActive":false},{"label":"queryCoord.balancer","href":"queryCoordbalancer","type":2,"isActive":false},{"label":"queryCoord.globalRowCountFactor","href":"queryCoordglobalRowCountFactor","type":2,"isActive":false},{"label":"queryCoord.scoreUnbalanceTolerationFactor","href":"queryCoordscoreUnbalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.reverseUnBalanceTolerationFactor","href":"queryCoordreverseUnBalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.overloadedMemoryThresholdPercentage","href":"queryCoordoverloadedMemoryThresholdPercentage","type":2,"isActive":false},{"label":"queryCoord.balanceIntervalSeconds","href":"queryCoordbalanceIntervalSeconds","type":2,"isActive":false},{"label":"queryCoord.memoryUsageMaxDifferencePercentage","href":"queryCoordmemoryUsageMaxDifferencePercentage","type":2,"isActive":false},{"label":"queryCoord.rowCountFactor","href":"queryCoordrowCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountFactor","href":"queryCoordsegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.globalSegmentCountFactor","href":"queryCoordglobalSegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountMaxSteps","href":"queryCoordsegmentCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.rowCountMaxSteps","href":"queryCoordrowCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.randomMaxSteps","href":"queryCoordrandomMaxSteps","type":2,"isActive":false},{"label":"queryCoord.growingRowCountWeight","href":"queryCoordgrowingRowCountWeight","type":2,"isActive":false},{"label":"queryCoord.delegatorMemoryOverloadFactor","href":"queryCoorddelegatorMemoryOverloadFactor","type":2,"isActive":false},{"label":"queryCoord.balanceCostThreshold","href":"queryCoordbalanceCostThreshold","type":2,"isActive":false},{"label":"queryCoord.channelTaskTimeout","href":"queryCoordchannelTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.segmentTaskTimeout","href":"queryCoordsegmentTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.heartbeatAvailableInterval","href":"queryCoordheartbeatAvailableInterval","type":2,"isActive":false},{"label":"queryCoord.distRequestTimeout","href":"queryCoorddistRequestTimeout","type":2,"isActive":false},{"label":"queryCoord.heatbeatWarningLag","href":"queryCoordheatbeatWarningLag","type":2,"isActive":false},{"label":"queryCoord.checkHealthInterval","href":"queryCoordcheckHealthInterval","type":2,"isActive":false},{"label":"queryCoord.checkHealthRPCTimeout","href":"queryCoordcheckHealthRPCTimeout","type":2,"isActive":false},{"label":"queryCoord.brokerTimeout","href":"queryCoordbrokerTimeout","type":2,"isActive":false},{"label":"queryCoord.collectionRecoverTimes","href":"queryCoordcollectionRecoverTimes","type":2,"isActive":false},{"label":"queryCoord.observerTaskParallel","href":"queryCoordobserverTaskParallel","type":2,"isActive":false},{"label":"queryCoord.checkAutoBalanceConfigInterval","href":"queryCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"queryCoord.checkNodeSessionInterval","href":"queryCoordcheckNodeSessionInterval","type":2,"isActive":false},{"label":"queryCoord.gracefulStopTimeout","href":"queryCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"queryCoord.enableStoppingBalance","href":"queryCoordenableStoppingBalance","type":2,"isActive":false},{"label":"queryCoord.channelExclusiveNodeFactor","href":"queryCoordchannelExclusiveNodeFactor","type":2,"isActive":false},{"label":"queryCoord.collectionObserverInterval","href":"queryCoordcollectionObserverInterval","type":2,"isActive":false},{"label":"queryCoord.checkExecutedFlagInterval","href":"queryCoordcheckExecutedFlagInterval","type":2,"isActive":false},{"label":"queryCoord.updateCollectionLoadStatusInterval","href":"queryCoordupdateCollectionLoadStatusInterval","type":2,"isActive":false},{"label":"queryCoord.cleanExcludeSegmentInterval","href":"queryCoordcleanExcludeSegmentInterval","type":2,"isActive":false},{"label":"queryCoord.ip","href":"queryCoordip","type":2,"isActive":false},{"label":"queryCoord.port","href":"queryCoordport","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxSendSize","href":"queryCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxRecvSize","href":"queryCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxSendSize","href":"queryCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxRecvSize","href":"queryCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.md new file mode 100644 index 000000000..73254c0c7 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_querycoord.md @@ -0,0 +1,1300 @@ +--- +id: configure_querycoord.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить queryCoord для Milvus.' +--- +

    Конфигурации, связанные с queryCoord

    Связанная конфигурация queryCoord, используемая для управления топологией и балансировкой нагрузки для узлов запроса, а также для передачи данных от растущих сегментов к закрытым сегментам.

    +

    queryCoord.autoHandoff

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Переключающее значение для управления автоматической заменой растущего сегмента на соответствующий индексированный герметичный сегмент, когда растущий сегмент достигает порога герметизации.
  • +
  • Если этот параметр имеет значение false, Milvus просто перебирает растущие сегменты с помощью грубой силы.
  • true
    +

    queryCoord.autoBalance

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Переключающее значение для управления автоматической балансировкой использования памяти между узлами запроса путем равномерного распределения операций загрузки и освобождения сегментов. true
    +

    queryCoord.autoBalanceChannel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить канал автоматической балансировки true
    +

    queryCoord.balancer

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    автоматический балансировщик, используемый для сегментов на узлах запроса ScoreBasedBalancer
    +

    queryCoord.globalRowCountFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    вес, используемый при балансировке сегментов между узлами запроса 0.1
    +

    queryCoord.scoreUnbalanceTolerationFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    наименьшее значение для несбалансированной протяженности между узлами "от" и "до" при выполнении балансировки 0.05
    +

    queryCoord.reverseUnBalanceTolerationFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    наибольшее значение для дисбаланса между узлами "от" и "до" после выполнения баланса 1.3
    +

    queryCoord.overloadedMemoryThresholdPercentage

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Пороговое значение использования памяти (в процентах) в узле запроса для запуска балансировки уплотненного сегмента. 90
    +

    queryCoord.balanceIntervalSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал, через который коорд запроса балансирует использование памяти между узлами запроса. 60
    +

    queryCoord.memoryUsageMaxDifferencePercentage

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Пороговое значение разницы в использовании памяти (в процентах) между двумя узлами запроса для запуска балансировки сегмента уплотнения. 30
    +

    queryCoord.rowCountFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    вес количества строк, используемый при балансировке сегментов между узлами запроса 0.4
    +

    queryCoord.segmentCountFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    вес количества сегментов, используемый при балансировке сегментов между узлами запроса 0.4
    +

    queryCoord.globalSegmentCountFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    вес количества сегментов, используемый при балансировке сегментов между узлами запроса 0.1
    +

    queryCoord.segmentCountMaxSteps

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное количество шагов генератора плана, основанного на количестве сегментов 50
    +

    queryCoord.rowCountMaxSteps

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    генератор плана на основе счета сегментов максимальное количество шагов 50
    +

    queryCoord.randomMaxSteps

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    генератор плана на основе счета сегментов максимальное количество шагов 10
    +

    queryCoord.growingRowCountWeight

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    вес памяти для роста числа строк сегментов 4
    +

    queryCoord.delegatorMemoryOverloadFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    коэффициент перегрузки памяти делегатора 0.1
    +

    queryCoord.balanceCostThreshold

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    порог стоимости баланса, если разница стоимости кластера после выполнения плана баланса меньше этого значения, план не будет выполнен 0.001
    +

    queryCoord.channelTaskTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    1 минута 60000
    +

    queryCoord.segmentTaskTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    2 минута 120000
    +

    queryCoord.heartbeatAvailableInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    10 с, Доступны только узлы QueryNodes, которые извлекли пульс в течение этого времени 10000
    +

    queryCoord.distRequestTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    таймаут запроса для querycoord, получающего распределение данных от querynodes, в миллисекундах 5000
    +

    queryCoord.heatbeatWarningLag

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    значение задержки для предупреждения отчета querycoord, когда последнее тепловое биение слишком старое, в миллисекундах 5000
    +

    queryCoord.checkHealthInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    3 с, интервал, когда коорд запроса пытается проверить состояние узла запроса 3000
    +

    queryCoord.checkHealthRPCTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    100 мс, таймаут проверки здоровья rpc к узлу запроса 2000
    +

    queryCoord.brokerTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    5000 мс, таймаут rpc брокера querycoord 5000
    +

    queryCoord.collectionRecoverTimes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    если время восстановления коллекции достигает предела в состоянии загрузки, освободите ее 3
    +

    queryCoord.observerTaskParallel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    номер задачи диспетчера параллельного наблюдателя 16
    +

    queryCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал проверки конфигурации автоматического баланса 10
    +

    queryCoord.checkNodeSessionInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал (в секундах) проверки кластерного сеанса querynode 60
    +

    queryCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. принудительная остановка узла без изящной остановки 5
    +

    queryCoord.enableStoppingBalance

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    разрешать ли остановку баланса true
    +

    queryCoord.channelExclusiveNodeFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    наименьший номер узла для включения эксклюзивного режима канала 4
    +

    queryCoord.collectionObserverInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал наблюдателя сбора 200
    +

    queryCoord.checkExecutedFlagInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал проверки выполненного флага для принудительного вытягивания dist 100
    +

    queryCoord.updateCollectionLoadStatusInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    5 м, максимальный интервал для обновления состояния загрузки коллекции 5
    +

    queryCoord.cleanExcludeSegmentInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    длительность сегмента исключения чистого трубопровода, который используется для фильтрации недопустимых данных, в секундах 60
    +

    queryCoord.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес запроса (queryCoord). Если не указан, используется первый одноадресный адрес
    +

    queryCoord.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт запросаКоорд 19531
    +

    queryCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить queryCoord, единица измерения: байт 536870912
    +

    queryCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить queryCoord, единица измерения: байт 268435456
    +

    queryCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на queryCoord, единица измерения: байт 268435456
    +

    queryCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на queryCoord, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.json new file mode 100644 index 000000000..72847df29 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryNode-related Configurations","anchorList":[{"label":"Конфигурации, связанные с queryNode","href":"queryNode-related-Configurations","type":1,"isActive":false},{"label":"queryNode.stats.publishInterval","href":"queryNodestatspublishInterval","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereThreadPoolNumRatio","href":"queryNodesegcoreknowhereThreadPoolNumRatio","type":2,"isActive":false},{"label":"queryNode.segcore.chunkRows","href":"queryNodesegcorechunkRows","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.enableIndex","href":"queryNodesegcoreinterimIndexenableIndex","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nlist","href":"queryNodesegcoreinterimIndexnlist","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nprobe","href":"queryNodesegcoreinterimIndexnprobe","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.memExpansionRate","href":"queryNodesegcoreinterimIndexmemExpansionRate","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.buildParallelRate","href":"queryNodesegcoreinterimIndexbuildParallelRate","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereScoreConsistency","href":"queryNodesegcoreknowhereScoreConsistency","type":2,"isActive":false},{"label":"queryNode.loadMemoryUsageFactor","href":"queryNodeloadMemoryUsageFactor","type":2,"isActive":false},{"label":"queryNode.enableDisk","href":"queryNodeenableDisk","type":2,"isActive":false},{"label":"queryNode.cache.memoryLimit","href":"queryNodecachememoryLimit","type":2,"isActive":false},{"label":"queryNode.cache.readAheadPolicy","href":"queryNodecachereadAheadPolicy","type":2,"isActive":false},{"label":"queryNode.cache.warmup","href":"queryNodecachewarmup","type":2,"isActive":false},{"label":"queryNode.mmap.mmapEnabled","href":"queryNodemmapmmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.growingMmapEnabled","href":"queryNodemmapgrowingMmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.fixedFileSizeForMmapAlloc","href":"queryNodemmapfixedFileSizeForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.mmap.maxDiskUsagePercentageForMmapAlloc","href":"queryNodemmapmaxDiskUsagePercentageForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.lazyload.enabled","href":"queryNodelazyloadenabled","type":2,"isActive":false},{"label":"queryNode.lazyload.waitTimeout","href":"queryNodelazyloadwaitTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceTimeout","href":"queryNodelazyloadrequestResourceTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceRetryInterval","href":"queryNodelazyloadrequestResourceRetryInterval","type":2,"isActive":false},{"label":"queryNode.lazyload.maxRetryTimes","href":"queryNodelazyloadmaxRetryTimes","type":2,"isActive":false},{"label":"queryNode.lazyload.maxEvictPerRetry","href":"queryNodelazyloadmaxEvictPerRetry","type":2,"isActive":false},{"label":"queryNode.scheduler.maxReadConcurrentRatio","href":"queryNodeschedulermaxReadConcurrentRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.cpuRatio","href":"queryNodeschedulercpuRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.name","href":"queryNodeschedulerscheduleReadPolicyname","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.taskQueueExpire","href":"queryNodeschedulerscheduleReadPolicytaskQueueExpire","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping","href":"queryNodeschedulerscheduleReadPolicyenableCrossUserGrouping","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser","href":"queryNodeschedulerscheduleReadPolicymaxPendingTaskPerUser","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxQueueLength","href":"queryNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxParallelism","href":"queryNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"queryNode.enableSegmentPrune","href":"queryNodeenableSegmentPrune","type":2,"isActive":false},{"label":"queryNode.bloomFilterApplyParallelFactor","href":"queryNodebloomFilterApplyParallelFactor","type":2,"isActive":false},{"label":"queryNode.queryStreamBatchSize","href":"queryNodequeryStreamBatchSize","type":2,"isActive":false},{"label":"queryNode.workerPooling.size","href":"queryNodeworkerPoolingsize","type":2,"isActive":false},{"label":"queryNode.ip","href":"queryNodeip","type":2,"isActive":false},{"label":"queryNode.port","href":"queryNodeport","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxSendSize","href":"queryNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxRecvSize","href":"queryNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxSendSize","href":"queryNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxRecvSize","href":"queryNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.md new file mode 100644 index 000000000..f89329c74 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_querynode.md @@ -0,0 +1,1261 @@ +--- +id: configure_querynode.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить queryNode для Milvus.' +--- +

    Конфигурации, связанные с queryNode

    Связанная конфигурация узла queryNode, используемая для выполнения гибридного поиска между векторными и скалярными данными.

    +

    queryNode.stats.publishInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал, через который узел запроса публикует статистическую информацию об узле, включая статус сегмента, использование процессора, памяти, состояние здоровья и т. д. Единица измерения: мс. 1000
    +

    queryNode.segcore.knowhereThreadPoolNumRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Количество потоков в пуле потоков knowhere. Если диск включен, размер пула будет умножен на knowhereThreadPoolNumRatio([1, 32]). 4
    +

    queryNode.segcore.chunkRows

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Количество строк, на которые Segcore делит сегмент на чанки. 128
    +

    queryNode.segcore.interimIndex.enableIndex

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Создавать ли временный индекс для растущих сегментов и запечатанных сегментов, которые еще не проиндексированы, улучшая производительность поиска.
  • +
  • В конечном итоге Milvus запечатает и проиндексирует все сегменты, но включение этого параметра оптимизирует производительность поиска для запросов, следующих сразу за вставкой данных.
  • +
  • Значение по умолчанию равно true, что означает, что Milvus создает временный индекс для растущих сегментов и запечатанных сегментов, которые не индексируются при поиске.
  • true
    +

    queryNode.segcore.interimIndex.nlist

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    nlist временного индекса, рекомендуется установить sqrt(chunkRows), должно быть меньше chunkRows/8 128
    +

    queryNode.segcore.interimIndex.nprobe

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    nprobe для поиска небольшого индекса, исходя из ваших требований к точности, должен быть меньше nlist 16
    +

    queryNode.segcore.interimIndex.memExpansionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    дополнительная память, необходимая для построения промежуточного индекса 1.15
    +

    queryNode.segcore.interimIndex.buildParallelRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    отношение параллельного построения промежуточного индекса к числу процессоров 0.5
    +

    queryNode.segcore.knowhereScoreConsistency

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить логику вычисления баллов сильной согласованности в knowhere false
    +

    queryNode.loadMemoryUsageFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Коэффициент умножения для расчета использования памяти при загрузке сегментов 1
    +

    queryNode.enableDisk

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    включить загрузку дискового индекса querynode и поиск по дисковому индексу false
    +

    queryNode.cache.memoryLimit

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    2 ГБ, 2 * 1024 *1024 *1024 2147483648
    +

    queryNode.cache.readAheadPolicy

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Политика опережающего чтения для кэша чанков, опции: `normal, random, sequential, willneed, dontneed`. willneed
    +

    queryNode.cache.warmup

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • опции: async, sync, disable.
  • +
  • Указывает необходимость разогрева кэша чанков.
  • +
  • 1. Если установлено значение "sync" или "async", исходные векторные данные будут синхронно/асинхронно загружаться в
  • +
  • кэш чанков во время процесса загрузки. Такой подход способен существенно снизить задержку запросов/поиска
  • +
  • на определенное время после загрузки, хотя и сопровождается одновременным увеличением использования диска;
  • +
  • 2. Если установить значение "отключить", исходные векторные данные будут загружаться в кэш чанков только во время поиска/запроса.
  • отключить
    +

    queryNode.mmap.mmapEnabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить mmap для загрузки данных false
    +

    queryNode.mmap.growingMmapEnabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить mmap для использования при выращивании сырых данных false
    +

    queryNode.mmap.fixedFileSizeForMmapAlloc

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Размер tmp-файла для менеджера чанков mmap 1
    +

    queryNode.mmap.maxDiskUsagePercentageForMmapAlloc

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    процент диска, используемый в менеджере чанков mmap 50
    +

    queryNode.lazyload.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить ленивую загрузку для загрузки данных false
    +

    queryNode.lazyload.waitTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный таймаут ожидания в миллисекундах перед началом выполнения поиска и извлечения данных с помощью ленивой загрузки 30000
    +

    queryNode.lazyload.requestResourceTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный таймаут в миллисекундах для ожидания запроса ресурса для ленивой загрузки, по умолчанию 5 с 5000
    +

    queryNode.lazyload.requestResourceRetryInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    интервал повторных попыток в миллисекундах для ожидания ресурса запроса для ленивой нагрузки, по умолчанию 2 с 2000
    +

    queryNode.lazyload.maxRetryTimes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное время повторных попыток для ленивой нагрузки, по умолчанию 1 1
    +

    queryNode.lazyload.maxEvictPerRetry

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное количество выселений для ленивой нагрузки, по умолчанию 1 1
    +

    queryNode.scheduler.maxReadConcurrentRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • maxReadConcurrentRatio - коэффициент параллелизма для задачи чтения (задачи поиска и запроса).
  • +
  • Максимальный параллелизм чтения будет равен значению hardware.GetCPUNum * maxReadConcurrentRatio.
  • +
  • По умолчанию он равен 2.0, что означает, что максимальный обмен данными при чтении будет равен значению hardware.GetCPUNum * 2.
  • +
  • Максимальный обмен данными должен быть больше или равен 1 и меньше или равен hardware.GetCPUNum * 100.
  • +
  • (0, 100]
  • 1
    +

    queryNode.scheduler.cpuRatio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    коэффициент, используемый для оценки использования процессора задачей чтения. 10
    +

    queryNode.scheduler.scheduleReadPolicy.name

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • fifo: Очередь FIFO, поддерживающая расписание.
  • +
  • user-task-polling:
  • +
  • Задачи пользователя будут опрашиваться по одной и планироваться.
  • +
  • Расписание справедливо для гранулярности задач.
  • +
  • Политика основана на имени пользователя для аутентификации.
  • +
  • Пустое имя пользователя считается одним и тем же пользователем.
  • +
  • Когда нет нескольких пользователей, политика распадается на FIFO".
  • fifo
    +

    queryNode.scheduler.scheduleReadPolicy.taskQueueExpire

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Контролирует, как долго (много секунд) сохраняется очередь после того, как она опустела 60
    +

    queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включить перекрестную группировку пользователей при использовании политики user-task-polling. (Отключите, если задачи пользователей не могут объединяться друг с другом) false
    +

    queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество ожидающих задач для одного пользователя в планировщике 1024
    +

    queryNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер кэша очереди задач в графе потока в узле запроса. 16
    +

    queryNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество параллельно выполняемых задач в графе потока 1024
    +

    queryNode.enableSegmentPrune

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    использовать статистику разделов для обрезки данных в поиске/запросе на делегаторе осколков false
    +

    queryNode.bloomFilterApplyParallelFactor

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    коэффициент параллельности при применении pk к bloom-фильтру, по умолчанию 4*CPU_CORE_NUM 4
    +

    queryNode.queryStreamBatchSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    возвращаемый размер пакета для потокового запроса 4194304
    +

    queryNode.workerPooling.size

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    размер клиентского пула рабочего узла запроса 10
    +

    queryNode.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес узла запроса. Если не указан, используется первый одноадресный адрес.
    +

    queryNode.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт узла запроса 21123
    +

    queryNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить узел запроса, единица измерения: байт 536870912
    +

    queryNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить узел запроса, единица измерения: байт 268435456
    +

    queryNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на queryNode, единица измерения: байт 268435456
    +

    queryNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на queryNode, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.json new file mode 100644 index 000000000..3e8a505c0 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"quotaAndLimits-related Configurations","anchorList":[{"label":"Конфигурации, связанные с квотами и лимитами","href":"quotaAndLimits-related-Configurations","type":1,"isActive":false},{"label":"quotaAndLimits.enabled","href":"quotaAndLimitsenabled","type":2,"isActive":false},{"label":"quotaAndLimits.quotaCenterCollectInterval","href":"quotaAndLimitsquotaCenterCollectInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocRetryTimes","href":"quotaAndLimitslimitsallocRetryTimes","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocWaitInterval","href":"quotaAndLimitslimitsallocWaitInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.complexDeleteLimitEnable","href":"quotaAndLimitslimitscomplexDeleteLimitEnable","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxCollectionNumPerDB","href":"quotaAndLimitslimitsmaxCollectionNumPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxInsertSize","href":"quotaAndLimitslimitsmaxInsertSize","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxResourceGroupNumOfQueryNode","href":"quotaAndLimitslimitsmaxResourceGroupNumOfQueryNode","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.enabled","href":"quotaAndLimitsddlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.collectionRate","href":"quotaAndLimitsddlcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.partitionRate","href":"quotaAndLimitsddlpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.collectionRate","href":"quotaAndLimitsddldbcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.partitionRate","href":"quotaAndLimitsddldbpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.enabled","href":"quotaAndLimitsindexRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.max","href":"quotaAndLimitsindexRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.db.max","href":"quotaAndLimitsindexRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.enabled","href":"quotaAndLimitsflushRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.max","href":"quotaAndLimitsflushRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.collection.max","href":"quotaAndLimitsflushRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.db.max","href":"quotaAndLimitsflushRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.enabled","href":"quotaAndLimitscompactionRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.max","href":"quotaAndLimitscompactionRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.db.max","href":"quotaAndLimitscompactionRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.enabled","href":"quotaAndLimitsdmlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.max","href":"quotaAndLimitsdmlinsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.db.max","href":"quotaAndLimitsdmlinsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.collection.max","href":"quotaAndLimitsdmlinsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.partition.max","href":"quotaAndLimitsdmlinsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.max","href":"quotaAndLimitsdmlupsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.db.max","href":"quotaAndLimitsdmlupsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.collection.max","href":"quotaAndLimitsdmlupsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.partition.max","href":"quotaAndLimitsdmlupsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.max","href":"quotaAndLimitsdmldeleteRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.db.max","href":"quotaAndLimitsdmldeleteRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.collection.max","href":"quotaAndLimitsdmldeleteRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.partition.max","href":"quotaAndLimitsdmldeleteRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.max","href":"quotaAndLimitsdmlbulkLoadRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.db.max","href":"quotaAndLimitsdmlbulkLoadRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.collection.max","href":"quotaAndLimitsdmlbulkLoadRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.partition.max","href":"quotaAndLimitsdmlbulkLoadRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.enabled","href":"quotaAndLimitsdqlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.max","href":"quotaAndLimitsdqlsearchRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.db.max","href":"quotaAndLimitsdqlsearchRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.collection.max","href":"quotaAndLimitsdqlsearchRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.partition.max","href":"quotaAndLimitsdqlsearchRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.max","href":"quotaAndLimitsdqlqueryRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.db.max","href":"quotaAndLimitsdqlqueryRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.collection.max","href":"quotaAndLimitsdqlqueryRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.partition.max","href":"quotaAndLimitsdqlqueryRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.forceDeny","href":"quotaAndLimitslimitWritingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay","href":"quotaAndLimitslimitWritingttProtectionmaxTimeTickDelay","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.enabled","href":"quotaAndLimitslimitWritingmemProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled","href":"quotaAndLimitslimitWritinggrowingSegmentsSizeProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.enabled","href":"quotaAndLimitslimitWritingdiskProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuota","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuota","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerCollection","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerPartition","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionlowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionhighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.forceDeny","href":"quotaAndLimitslimitReadingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold","href":"quotaAndLimitslimitReadingqueueProtectionnqInQueueThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold","href":"quotaAndLimitslimitReadingqueueProtectionqueueLatencyThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.resultProtection.maxReadResultRate","href":"quotaAndLimitslimitReadingresultProtectionmaxReadResultRate","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.coolOffSpeed","href":"quotaAndLimitslimitReadingcoolOffSpeed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.md new file mode 100644 index 000000000..c0d4be94a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_quotaandlimits.md @@ -0,0 +1,2137 @@ +--- +id: configure_quotaandlimits.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить quotaAndLimits для Milvus.' +--- +

    Конфигурации, связанные с квотами и лимитами

    QuotaConfig, конфигурации квот и лимитов Milvus.

    +

    По умолчанию мы включаем:

    +
      +
    1. Защита TT;

    2. +
    3. Защита памяти.

    4. +
    5. Защита дисковых квот.

    6. +
    +

    Вы можете включить:

    +
      +
    1. Ограничение пропускной способности DML;

    2. +
    3. DDL, DQL qps/rps ограничение;

    4. +
    5. Защита длины/латентности очереди DQL;

    6. +
    7. защиту скорости обработки результатов DQL;

    8. +
    +

    При необходимости вы также можете вручную принудительно запретить запросы RW.

    +

    quotaAndLimits.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    `true` для включения квот и лимитов, `false` для отключения. true
    +

    quotaAndLimits.quotaCenterCollectInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • quotaCenterCollectInterval - интервал времени, в течение которого quotaCenter
  • +
  • собирает метрики с прокси, кластера запросов и кластера данных.
  • +
  • секунды, (0 ~ 65536)
  • 3
    +

    quotaAndLimits.limits.allocRetryTimes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    время повторных попыток при неудачном удалении данных, переадресованных из rate limit 15
    +

    quotaAndLimits.limits.allocWaitInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    длительность ожидания повторной попытки при неудачном удалении данных пересылки, в миллисекундах 1000
    +

    quotaAndLimits.limits.complexDeleteLimitEnable

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    удалять ли комплексное удаление данных пересылки по ограничителю false
    +

    quotaAndLimits.limits.maxCollectionNumPerDB

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество коллекций в базе данных. 65536
    +

    quotaAndLimits.limits.maxInsertSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальный размер одного запроса на вставку, в байтах, -1 означает отсутствие ограничений -1
    +

    quotaAndLimits.limits.maxResourceGroupNumOfQueryNode

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    максимальное количество групп ресурсов узлов запроса 1024
    +

    quotaAndLimits.ddl.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли дросселирование DDL-запросов. false
    +

    quotaAndLimits.ddl.collectionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество связанных с коллекцией DDL-запросов в секунду.
  • +
  • Установка этого параметра в значение 10 означает, что Milvus обрабатывает не более 10 связанных с коллекцией DDL-запросов в секунду, включая запросы на создание коллекции, запросы на удаление коллекции, запросы на загрузку коллекции и запросы на освобождение коллекции.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.ddl.enabled в true.
  • -1
    +

    quotaAndLimits.ddl.partitionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество DDL-запросов, связанных с разделами, в секунду.
  • +
  • Установка этого параметра в значение 10 означает, что Milvus обрабатывает не более 10 связанных с разделами запросов в секунду, включая запросы на создание разделов, запросы на удаление разделов, запросы на загрузку разделов и запросы на освобождение разделов.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.ddl.enabled в true.
  • -1
    +

    quotaAndLimits.ddl.db.collectionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps уровня db, по умолчанию без ограничений, скорость для CreateCollection, DropCollection, LoadCollection, ReleaseCollection -1
    +

    quotaAndLimits.ddl.db.partitionRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps уровня базы данных, по умолчанию без ограничений, скорость для CreatePartition, DropPartition, LoadPartition, ReleasePartition -1
    +

    quotaAndLimits.indexRate.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли дросселирование запросов, связанных с индексами. false
    +

    quotaAndLimits.indexRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество связанных с индексом запросов в секунду.
  • +
  • Установка этого параметра в значение 10 означает, что Milvus обрабатывает не более 10 запросов, связанных с разделами, в секунду, включая запросы на создание индекса и запросы на сброс индекса.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.indexRate.enabled в true.
  • -1
    +

    quotaAndLimits.indexRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps уровня db, по умолчанию без ограничений, скорость для CreateIndex, DropIndex -1
    +

    quotaAndLimits.flushRate.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли дросселирование запросов на флэш. true
    +

    quotaAndLimits.flushRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество запросов на промывку в секунду.
  • +
  • Установка этого параметра в значение 10 означает, что Milvus обрабатывает не более 10 запросов на промывку в секунду.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.flushRate.enabled в true.
  • -1
    +

    quotaAndLimits.flushRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps, по умолчанию без ограничений, скорость смыва на уровне коллекции. 0.1
    +

    quotaAndLimits.flushRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps на уровне db, по умолчанию без ограничений, скорость для смыва -1
    +

    quotaAndLimits.compactionRate.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли ручное дросселирование запросов на уплотнение. false
    +

    quotaAndLimits.compactionRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество запросов на ручное уплотнение в секунду.
  • +
  • Установка этого параметра в значение 10 означает, что Milvus обрабатывает не более 10 запросов на ручное уплотнение в секунду.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.compaction.enabled в true.
  • -1
    +

    quotaAndLimits.compactionRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps уровня db, по умолчанию без ограничений, скорость для ручного уплотнения -1
    +

    quotaAndLimits.dml.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли дросселирование DML-запросов. false
    +

    quotaAndLimits.dml.insertRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Наибольшая скорость вставки данных в секунду.
  • +
  • Установка этого параметра в значение 5 означает, что Milvus разрешает вставку данных только со скоростью 5 МБ/с.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dml.enabled в true.
  • -1
    +

    quotaAndLimits.dml.insertRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничений -1
    +

    quotaAndLimits.dml.insertRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Наибольшая скорость вставки данных в коллекцию в секунду.
  • +
  • Установка этого параметра в значение 5 означает, что Milvus разрешает вставку данных в любую коллекцию со скоростью 5 МБ/с.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dml.enabled в true.
  • -1
    +

    quotaAndLimits.dml.insertRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничений -1
    +

    quotaAndLimits.dml.upsertRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничения -1
    +

    quotaAndLimits.dml.upsertRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничения -1
    +

    quotaAndLimits.dml.upsertRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничения -1
    +

    quotaAndLimits.dml.upsertRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничения -1
    +

    quotaAndLimits.dml.deleteRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Наибольшая скорость удаления данных в секунду.
  • +
  • Установка этого параметра в 0,1 означает, что Milvus разрешает удаление данных только со скоростью 0,1 МБ/с.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dml.enabled в true.
  • -1
    +

    quotaAndLimits.dml.deleteRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничений -1
    +

    quotaAndLimits.dml.deleteRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Наибольшая скорость удаления данных в секунду.
  • +
  • Установка этого параметра в 0,1 означает, что Milvus разрешает удаление данных из любой коллекции только со скоростью 0,1 МБ/с.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dml.enabled в true.
  • -1
    +

    quotaAndLimits.dml.deleteRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничений -1
    +

    quotaAndLimits.dml.bulkLoadRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию без ограничений, пока не поддерживается. TODO: ограничить скорость bulkLoad -1
    +

    quotaAndLimits.dml.bulkLoadRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию нет ограничений, пока не поддерживается. TODO: ограничить db bulkLoad rate -1
    +

    quotaAndLimits.dml.bulkLoadRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию нет ограничений, пока не поддерживается. TODO: ограничить скорость загрузки коллекции (bulkLoad rate) -1
    +

    quotaAndLimits.dml.bulkLoadRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ/с, по умолчанию нет ограничений, пока не поддерживается. TODO: ограничить скорость загрузки разделов (partition bulkLoad rate) -1
    +

    quotaAndLimits.dql.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Включено ли дросселирование запросов DQL. false
    +

    quotaAndLimits.dql.searchRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество векторов для поиска в секунду.
  • +
  • Установка этого параметра в значение 100 означает, что Milvus разрешает поиск только 100 векторов в секунду, независимо от того, находятся ли эти 100 векторов в одном поиске или разбросаны по нескольким поискам.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dql.enabled в true.
  • -1
    +

    quotaAndLimits.dql.searchRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    vps (векторы в секунду), по умолчанию без ограничений -1
    +

    quotaAndLimits.dql.searchRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество векторов для поиска в одной коллекции в секунду.
  • +
  • Установка этого параметра в значение 100 означает, что Milvus разрешает поиск только 100 векторов в секунду на коллекцию, независимо от того, находятся ли эти 100 векторов в одном поиске или разбросаны по нескольким поискам.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dql.enabled в true.
  • -1
    +

    quotaAndLimits.dql.searchRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    vps (векторы в секунду), по умолчанию без ограничений -1
    +

    quotaAndLimits.dql.queryRate.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество запросов в секунду.
  • +
  • Установка этого параметра в значение 100 означает, что Milvus разрешает только 100 запросов в секунду.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dql.enabled в true.
  • -1
    +

    quotaAndLimits.dql.queryRate.db.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps, по умолчанию без ограничений -1
    +

    quotaAndLimits.dql.queryRate.collection.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество запросов на коллекцию в секунду.
  • +
  • Установка этого параметра в значение 100 означает, что Milvus разрешает только 100 запросов на коллекцию в секунду.
  • +
  • Чтобы использовать этот параметр, одновременно установите quotaAndLimits.dql.enabled в true.
  • -1
    +

    quotaAndLimits.dql.queryRate.partition.max

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    qps, по умолчанию без ограничений -1
    +

    quotaAndLimits.limitWriting.forceDeny

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • forceDeny false означает, что dml-запросы разрешены (за исключением некоторых
  • +
  • определенных условий, таких как память узлов для маркера воды), true означает всегда отклонять все dml-запросы.
  • false
    +

    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • maxTimeTickDelay указывает на обратное давление для DML-операций.
  • +
  • Скорость DML будет снижена в соответствии с отношением временной задержки тиков к maxTimeTickDelay,
  • +
  • если временная задержка тиков больше, чем maxTimeTickDelay, все запросы DML будут отклонены.
  • +
  • секунды
  • 300
    +

    quotaAndLimits.limitWriting.memProtection.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Если использование памяти > memoryHighWaterLevel, все запросы DML будут отклонены;
  • +
  • Когда memoryLowWaterLevel < memory usage < memoryHighWaterLevel, уменьшите скорость dml;
  • +
  • Когда использование памяти < memoryLowWaterLevel, никаких действий.
  • истина
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    (0, 1], memoryLowWaterLevel в DataNodes 0.85
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    (0, 1], memoryHighWaterLevel в DataNodes 0.95
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    (0, 1], memoryLowWaterLevel в QueryNodes 0.85
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    (0, 1], memoryHighWaterLevel в QueryNodes 0.95
    +

    quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Если размер растущих сегментов меньше нижнего водяного знака, никаких действий не предпринимается.
  • +
  • Если размер растущих сегментов превышает нижний водяной знак, скорость dml будет снижена,
  • +
  • но скорость не будет ниже, чем minRateRatio * dmlRate.
  • false
    +

    quotaAndLimits.limitWriting.diskProtection.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Когда общий размер файлов в хранилище объектов превышает `diskQuota`, все запросы dml будут отклонены; true
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuota

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ, (0, +inf), по умолчанию нет ограничений -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ, (0, +inf), по умолчанию без ограничений -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ, (0, +inf), по умолчанию без ограничений -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    МБ, (0, +inf), по умолчанию без ограничений -1
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    переключатель для включения квоты на количество строк сегмента l0 false
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Квота подсчета строк сегмента l0, низкий уровень воды 32768
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    l0 сегментная квота подсчета строк, низкий уровень воды 65536
    +

    quotaAndLimits.limitReading.forceDeny

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • forceDeny false означает, что запросы dql разрешены (за исключением некоторых
  • +
  • определенных условий, например, коллекция была сброшена), true означает, что всегда отклоняются все dql-запросы.
  • false
    +

    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • nqInQueueThreshold указывает на то, что система находится под обратным давлением для пути поиска/запроса.
  • +
  • Если NQ в очереди любого QueryNode больше, чем nqInQueueThreshold, скорость поиска и запросов постепенно снижается.
  • +
  • пока NQ в очереди не перестанет превышать nqInQueueThreshold. Мы считаем, что NQ запроса равен 1.
  • +
  • int, по умолчанию без ограничений
  • -1
    +

    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • queueLatencyThreshold указывает на то, что система находится под обратным давлением для пути поиска/запроса.
  • +
  • Если задержка очереди dql больше, чем queueLatencyThreshold, скорость поиска и запросов будет постепенно снижаться.
  • +
  • пока задержка очереди не перестанет превышать queueLatencyThreshold.
  • +
  • Под задержкой здесь понимается усредненная задержка за определенный период времени.
  • +
  • миллисекунды, по умолчанию без ограничения
  • -1
    +

    quotaAndLimits.limitReading.resultProtection.maxReadResultRate

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • maxReadResultRate указывает на то, что система находится под обратным давлением для пути поиска/запроса.
  • +
  • Если скорость считывания результатов dql больше maxReadResultRate, скорость поиска и запросов будет постепенно снижаться.
  • +
  • пока скорость чтения не перестанет превышать maxReadResultRate.
  • +
  • МБ/с, по умолчанию без ограничений
  • -1
    +

    quotaAndLimits.limitReading.coolOffSpeed

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • colOffSpeed - скорость остывания скорости поиска и запросов.
  • +
  • (0, 1]
  • 0.9
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.json new file mode 100644 index 000000000..bec64b83c --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rocksmq-related Configurations","anchorList":[{"label":"Конфигурации, связанные с rocksmq","href":"rocksmq-related-Configurations","type":1,"isActive":false},{"label":"rocksmq.path","href":"rocksmqpath","type":2,"isActive":false},{"label":"rocksmq.lrucacheratio","href":"rocksmqlrucacheratio","type":2,"isActive":false},{"label":"rocksmq.rocksmqPageSize","href":"rocksmqrocksmqPageSize","type":2,"isActive":false},{"label":"rocksmq.retentionTimeInMinutes","href":"rocksmqretentionTimeInMinutes","type":2,"isActive":false},{"label":"rocksmq.retentionSizeInMB","href":"rocksmqretentionSizeInMB","type":2,"isActive":false},{"label":"rocksmq.compactionInterval","href":"rocksmqcompactionInterval","type":2,"isActive":false},{"label":"rocksmq.compressionTypes","href":"rocksmqcompressionTypes","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.md new file mode 100644 index 000000000..4eed9c901 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_rocksmq.md @@ -0,0 +1,247 @@ +--- +id: configure_rocksmq.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить rocksmq для Milvus.' +--- +

    Конфигурации, связанные с rocksmq

    Если вы хотите включить kafka, необходимо прокомментировать конфиги pulsar

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout: 10

    +

    rocksmq.path

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Префикс ключа, по которому Milvus хранит данные в RocksMQ.
  • +
  • Внимание: Изменение этого параметра после использования Milvus в течение некоторого времени повлияет на доступ к старым данным.
  • +
  • Рекомендуется изменять этот параметр перед первым запуском Milvus.
  • +
  • Установите легко идентифицируемый префикс корневого ключа для Milvus, если служба etcd уже существует.
  • /var/lib/milvus/rdb_data
    +

    rocksmq.lrucacheratio

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Коэффициент кэш-памяти rocksdb 0.06
    +

    rocksmq.rocksmqPageSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер сообщений в каждой странице в RocksMQ. Сообщения в RocksMQ проверяются и очищаются (по истечении срока действия) пакетно на основе этого параметра. Единица измерения: Байт. 67108864
    +

    rocksmq.retentionTimeInMinutes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное время хранения подтвержденных сообщений в RocksMQ. Одобренные сообщения в RocksMQ сохраняются в течение указанного периода времени, а затем удаляются. Единица измерения: Минута. 4320
    +

    rocksmq.retentionSizeInMB

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер хранения подтвержденных сообщений каждой темы в RocksMQ. Одобренные сообщения в каждой теме очищаются, если их размер превышает этот параметр. Единица измерения: МБ. 8192
    +

    rocksmq.compactionInterval

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Интервал времени, через который запускается уплотнение rocksdb для удаления удаленных данных. Единица измерения: секунда 86400
    +

    rocksmq.compressionTypes

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Тип сжатия, поддерживается только использование 0,7. 0 означает не сжимать, 7 будет использовать zstd. Длина типов означает количество уровней rocksdb. 0,0,7,7,7
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.json new file mode 100644 index 000000000..a97f1758f --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rootCoord-related Configurations","anchorList":[{"label":"Конфигурации, связанные с rootCoord","href":"rootCoord-related-Configurations","type":1,"isActive":false},{"label":"rootCoord.dmlChannelNum","href":"rootCoorddmlChannelNum","type":2,"isActive":false},{"label":"rootCoord.maxPartitionNum","href":"rootCoordmaxPartitionNum","type":2,"isActive":false},{"label":"rootCoord.minSegmentSizeToEnableIndex","href":"rootCoordminSegmentSizeToEnableIndex","type":2,"isActive":false},{"label":"rootCoord.maxDatabaseNum","href":"rootCoordmaxDatabaseNum","type":2,"isActive":false},{"label":"rootCoord.maxGeneralCapacity","href":"rootCoordmaxGeneralCapacity","type":2,"isActive":false},{"label":"rootCoord.gracefulStopTimeout","href":"rootCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"rootCoord.ip","href":"rootCoordip","type":2,"isActive":false},{"label":"rootCoord.port","href":"rootCoordport","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxSendSize","href":"rootCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxRecvSize","href":"rootCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxSendSize","href":"rootCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxRecvSize","href":"rootCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.md new file mode 100644 index 000000000..125f445ed --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_rootcoord.md @@ -0,0 +1,375 @@ +--- +id: configure_rootcoord.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить rootCoord для Milvus.' +--- +

    Конфигурации, связанные с rootCoord

    Связанная конфигурация rootCoord, используемая для обработки запросов языка определения данных (DDL) и языка управления данными (DCL)

    +

    rootCoord.dmlChannelNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Количество DML-каналов, создаваемых при запуске корневого коорда. 16
    +

    rootCoord.maxPartitionNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Максимальное количество разделов в каждой коллекции.
  • +
  • Новые разделы не могут быть созданы, если этот параметр имеет значение 0 или 1.
  • +
  • Диапазон: [0, INT64MAX]
  • 1024
    +

    rootCoord.minSegmentSizeToEnableIndex

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • Минимальное количество строк в сегменте, необходимое для создания индекса.
  • +
  • Сегменты, размер которых меньше этого параметра, не будут индексироваться и будут искаться методом грубой силы.
  • 1024
    +

    rootCoord.maxDatabaseNum

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальное количество баз данных 64
    +

    rootCoord.maxGeneralCapacity

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    верхний предел для суммы произведения номеров разделов (partitionNumber) и осколков (shardNumber) 65536
    +

    rootCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    секунд. принудительная остановка узла без изящной остановки 5
    +

    rootCoord.ip

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP/IP-адрес корневого узла. Если не указан, используется первый одноадресный адрес.
    +

    rootCoord.port

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    TCP-порт rootCoord 53100
    +

    rootCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может отправить rootCoord, единица измерения: байт 536870912
    +

    rootCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который может получить rootCoord, единица измерения: байт 268435456
    +

    rootCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут отправлять клиенты на rootCoord, единица измерения: байт 268435456
    +

    rootCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Максимальный размер каждого RPC-запроса, который могут получить клиенты на rootCoord, единица измерения: байт 536870912
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.json new file mode 100644 index 000000000..81cf6c5fe --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tikv-related Configurations","anchorList":[{"label":"Конфигурации, связанные с tikv","href":"tikv-related-Configurations","type":1,"isActive":false},{"label":"tikv.endpoints","href":"tikvendpoints","type":2,"isActive":false},{"label":"tikv.rootPath","href":"tikvrootPath","type":2,"isActive":false},{"label":"tikv.metaSubPath","href":"tikvmetaSubPath","type":2,"isActive":false},{"label":"tikv.kvSubPath","href":"tikvkvSubPath","type":2,"isActive":false},{"label":"tikv.requestTimeout","href":"tikvrequestTimeout","type":2,"isActive":false},{"label":"tikv.snapshotScanSize","href":"tikvsnapshotScanSize","type":2,"isActive":false},{"label":"tikv.ssl.enabled","href":"tikvsslenabled","type":2,"isActive":false},{"label":"tikv.ssl.tlsCert","href":"tikvssltlsCert","type":2,"isActive":false},{"label":"tikv.ssl.tlsKey","href":"tikvssltlsKey","type":2,"isActive":false},{"label":"tikv.ssl.tlsCACert","href":"tikvssltlsCACert","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.md new file mode 100644 index 000000000..5864d1e57 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_tikv.md @@ -0,0 +1,314 @@ +--- +id: configure_tikv.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить tikv для Milvus.' +--- +

    Конфигурации, связанные с tikv

    Связанная конфигурация tikv, используемая для хранения метаданных Milvus.

    +

    Обратите внимание, что когда TiKV включен для метахранилища, вам все еще нужно иметь etcd для обнаружения сервисов.

    +

    TiKV - это хороший вариант, когда размер метаданных требует лучшей горизонтальной масштабируемости.

    +

    tikv.endpoints

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Обратите внимание, что порт pd по умолчанию для tikv равен 2379, что конфликтует с etcd. 127.0.0.1:2389
    +

    tikv.rootPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Корневой путь, по которому хранятся данные в tikv by-dev
    +

    tikv.metaSubPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    metaRootPath = rootPath + '/' + metaSubPath meta
    +

    tikv.kvSubPath

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    kvRootPath = rootPath + '/' + kvSubPath kv
    +

    tikv.requestTimeout

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    мс, таймаут запроса tikv 10000
    +

    tikv.snapshotScanSize

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    размер партии сканирования моментальных снимков tikv 256
    +

    tikv.ssl.enabled

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Поддерживать ли режим безопасного соединения TiKV false
    +

    tikv.ssl.tlsCert

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу сертификата
    +

    tikv.ssl.tlsKey

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу ключа
    +

    tikv.ssl.tlsCACert

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    путь к файлу CACert
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.json new file mode 100644 index 000000000..ed5bbef91 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tls-related Configurations","anchorList":[{"label":"Конфигурации, связанные с tls","href":"tls-related-Configurations","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.md new file mode 100644 index 000000000..c7d2fbf06 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_tls.md @@ -0,0 +1,22 @@ +--- +id: configure_tls.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить tls для Milvus.' +--- +

    Конфигурации, связанные с tls

    Настройте прокси tls enable.

    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.json b/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.json new file mode 100644 index 000000000..c2f3ffa53 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"trace-related Configurations","anchorList":[{"label":"Конфигурации, связанные с трассировкой","href":"trace-related-Configurations","type":1,"isActive":false},{"label":"trace.exporter","href":"traceexporter","type":2,"isActive":false},{"label":"trace.sampleFraction","href":"tracesampleFraction","type":2,"isActive":false},{"label":"trace.jaeger.url","href":"tracejaegerurl","type":2,"isActive":false},{"label":"trace.otlp.endpoint","href":"traceotlpendpoint","type":2,"isActive":false},{"label":"trace.otlp.method","href":"traceotlpmethod","type":2,"isActive":false},{"label":"trace.initTimeoutSeconds","href":"traceinitTimeoutSeconds","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.md b/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.md new file mode 100644 index 000000000..621220fa3 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/configure_trace.md @@ -0,0 +1,200 @@ +--- +id: configure_trace.md +related_key: configure +group: system_configuration.md +summary: 'Узнайте, как настроить трассировку для Milvus.' +--- +

    Конфигурации, связанные с трассировкой

    trace.exporter

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • тип экспортера трассировки, по умолчанию - stdout,
  • +
  • необязательные значения: ['noop','stdout','jaeger','otlp'].
  • noop
    +

    trace.sampleFraction

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    +
  • доля пробоотборника, основанного на traceID,
  • +
  • необязательные значения: [0, 1]
  • +
  • Фракции >= 1 всегда будут отбираться. Фракции < 0 рассматриваются как нулевые.
  • 0
    +

    trace.jaeger.url

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    когда экспортером является jaeger, должен установить URL jaeger'а
    +

    trace.otlp.endpoint

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    пример: "127.0.0.1:4317" для grpc, "127.0.0.1:4318" для http
    +

    trace.otlp.method

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    Метод экспорта otlp, допустимые значения: ["grpc", "http"], по умолчанию используется "grpc".
    +

    trace.initTimeoutSeconds

    + + + + + + + + + + + + +
    ОписаниеЗначение по умолчанию
    таймаут инициализации segcore в секундах, предотвращающий вечное зависание otlp grpc 10
    diff --git a/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.json b/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.json new file mode 100644 index 000000000..1b1cd5cea --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus System Configurations Checklist","anchorList":[{"label":"Контрольный список системных конфигураций Milvus","href":"Milvus-System-Configurations-Checklist","type":1,"isActive":false},{"label":"Разделы","href":"Sections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.md b/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.md new file mode 100644 index 000000000..fe3d5f2ef --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/sys_config/system_configuration.md @@ -0,0 +1,129 @@ +--- +id: system_configuration.md +related_key: configure +group: system_configuration.md +summary: Узнайте о конфигурации системы Milvus. +--- +

    Контрольный список системных конфигураций Milvus

    В этой теме представлены общие разделы системных конфигураций в Milvus.

    +

    Milvus поддерживает значительное количество параметров, которые настраивают систему. Каждая конфигурация имеет значение по умолчанию, которое можно использовать напрямую. Вы можете гибко изменять эти параметры, чтобы Milvus мог лучше обслуживать ваше приложение. Дополнительную информацию см. в разделе Настройка Milvus.

    +
    +В текущем выпуске все параметры вступают в силу только после настройки при запуске Milvus.
    +

    Разделы

    Для удобства обслуживания Milvus классифицирует свои конфигурации на %s разделов, основываясь на своих компонентах, зависимостях и общем использовании.

    +

    etcd

    Связанная конфигурация etcd, используемая для хранения метаданных Milvus и обнаружения сервисов.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с etcd.

    +

    metastore

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с метахранилищем.

    +

    tikv

    Связанная конфигурация tikv, используемая для хранения метаданных Milvus.

    +

    Обратите внимание, что когда TiKV включен для метахранилища, вам все еще нужно иметь etcd для обнаружения сервисов.

    +

    TiKV - это хороший вариант, когда размер метаданных требует лучшей горизонтальной масштабируемости.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с tikv.

    +

    localStorage

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с localStorage.

    +

    minio

    Связанная конфигурация MinIO/S3/GCS или любого другого сервиса поддерживает S3 API, который отвечает за сохранение данных для Milvus.

    +

    В дальнейшем описании для простоты мы будем называть сервис хранения данных MinIO/S3.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе "Конфигурации, связанные с MinIO".

    +

    mq

    Milvus поддерживает четыре MQ: rocksmq (на основе RockDB), natsmq (встроенный nats-сервер), Pulsar и Kafka.

    +

    Вы можете изменить свой MQ, задав поле mq.type.

    +

    Если вы не установите поле mq.type по умолчанию, в этом файле есть примечание о включении приоритета, если мы настраиваем несколько mq.

    +
      +
    1. автономный (локальный) режим: rocksmq (по умолчанию) > natsmq > Pulsar > Kafka

    2. +
    3. кластерный режим: Pulsar(по умолчанию) > Kafka (rocksmq и natsmq не поддерживаются в кластерном режиме).

    4. +
    +

    Подробное описание каждого параметра в этом разделе смотрите в разделе Конфигурации, связанные с mq.

    +

    pulsar

    Связанная конфигурация pulsar, используемая для управления журналами Milvus о последних операциях мутации, вывода потокового журнала и предоставления услуг публикации-подписки журналов.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с pulsar.

    +

    rocksmq

    Если вы хотите включить kafka, необходимо закомментировать конфигурацию pulsar

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout: 10

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с rocksmq.

    +

    natsmq

    конфигурация natsmq.

    +

    подробнее: https://docs.nats.io/running-a-nats-service/configuration

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с natsmq.

    +

    rootCoord

    Связанная конфигурация rootCoord, используемая для обработки запросов языка определения данных (DDL) и языка управления данными (DCL).

    +

    См. раздел Конфигурации, связанные с rootCoord, для подробного описания каждого параметра в этом разделе.

    +

    proxy

    Связанная конфигурация прокси, используемая для проверки клиентских запросов и уменьшения возвращаемых результатов.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с прокси.

    +

    queryCoord

    Связанная конфигурация queryCoord, используемая для управления топологией и балансировкой нагрузки для узлов запроса, а также для передачи данных из растущих сегментов в закрытые сегменты.

    +

    Подробное описание каждого параметра этого раздела см. в разделе Конфигурации, связанные с queryCoord.

    +

    queryNode

    Связанная конфигурация узла запроса (queryNode), используемая для гибридного поиска между векторными и скалярными данными.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с узлом запроса.

    +

    indexCoord

    См. Конфигурации, связанные с indexCoord, для подробного описания каждого параметра в этом разделе.

    +

    indexNode

    См. Конфигурации, связанные с узлом indexNode, для подробного описания каждого параметра в этом разделе.

    +

    dataCoord

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с данными.

    +

    dataNode

    См. Конфигурации, связанные с узлом данных, для подробного описания каждого параметра в этом разделе.

    +

    msgChannel

    В этой теме представлены конфигурации Milvus, связанные с каналом сообщений.

    +

    Подробное описание каждого параметра этого раздела см. в разделе msgChannel-related Configurations.

    +

    log

    Настройка вывода системного журнала.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с журналом.

    +

    grpc

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с grpc.

    +

    tls

    Настройка включения прокси-сервера tls.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с tls.

    +

    common

    Конфигурации, связанные с common, для подробного описания каждого параметра в этом разделе.

    +

    quotaAndLimits

    QuotaConfig, настройка квот и лимитов Milvus.

    +

    По умолчанию мы включаем:

    +
      +
    1. Защита TT;

    2. +
    3. Защита памяти.

    4. +
    5. Защита дисковых квот.

    6. +
    +

    Вы можете включить:

    +
      +
    1. Ограничение пропускной способности DML;

    2. +
    3. DDL, DQL qps/rps ограничение;

    4. +
    5. Защита длины/латентности очереди DQL;

    6. +
    7. защиту скорости обработки результатов DQL;

    8. +
    +

    При необходимости вы также можете вручную принудительно отклонять запросы RW.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с квотами и лимитами.

    +

    trace

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с трассировкой.

    +

    gpu

    #при использовании индексирования на GPU Milvus будет использовать пул памяти, чтобы избежать частого выделения и удаления памяти.

    +

    #здесь вы можете задать размер памяти, занимаемой пулом памяти, единицей измерения является МБ.

    +

    #отметим, что существует вероятность аварийного завершения работы Milvus, когда фактическая потребность в памяти превышает значение, заданное параметром maxMemSize.

    +

    #если initMemSize и MaxMemSize оба равны нулю,

    +

    #milvus автоматически инициализирует половину доступной памяти GPU,

    +

    #maxMemSize - всю доступную память GPU.

    +

    Подробное описание каждого параметра в этом разделе см. в разделе Конфигурации, связанные с gpu.

    diff --git a/localization/v2.5.x/site/ru/reference/time_sync.json b/localization/v2.5.x/site/ru/reference/time_sync.json new file mode 100644 index 000000000..338142238 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/time_sync.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Time Synchronization","anchorList":[{"label":"Синхронизация времени","href":"Time-Synchronization","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Оракул временных меток (TSO)","href":"Timestamp-oracle-TSO","type":2,"isActive":false},{"label":"Система синхронизации времени (timetick)","href":"Time-synchronization-system-timetick","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/time_sync.md b/localization/v2.5.x/site/ru/reference/time_sync.md new file mode 100644 index 000000000..ffff57f2a --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/time_sync.md @@ -0,0 +1,161 @@ +--- +id: time_sync.md +title: Синхронизация времени +summary: Узнайте о системе синхронизации времени в Milvus. +--- +

    Синхронизация времени

    В этой теме описывается механизм синхронизации времени в Milvus.

    +

    Обзор

    События в Milvus можно разделить на два типа:

    +
      +
    • События языка определения данных (DDL): создание/удаление коллекции, создание/удаление раздела и т. д.

    • +
    • События языка манипулирования данными (DML): вставка, поиск и т. д.

    • +
    +

    Любое событие, независимо от того, DDL оно или DML, помечается временной меткой, которая может указать, когда это событие произошло.

    +

    Предположим, есть два пользователя, которые инициируют серию событий DML и DDL в Milvus в порядке, показанном в следующей таблице.

    + + + + + + + + + + + + + + +
    Временная меткаПользователь 1Пользователь 2
    t0Создал коллекцию с именем C0./
    t2/Выполнили поиск по коллекции C0.
    t5Вставил данные A1 в коллекцию C0./
    t7/Выполнен поиск по коллекции C0.
    t10Вставил данные A2 в коллекцию C0./
    t12/Выполнил поиск по коллекции C0
    t15Удалены данные A1 из коллекции C0./
    t17/Выполнен поиск по коллекции C0
    +

    В идеале пользователь 2 должен видеть:

    +
      +
    • Пустую коллекцию C0 по адресу t2.

    • +
    • Данные A1 на t7.

    • +
    • Оба данных A1 и A2 на t12.

    • +
    • Только данные A2 по адресу t17 (поскольку данные A1 были удалены из коллекции до этого момента).

    • +
    +

    Этот идеальный сценарий может быть легко реализован при наличии только одного узла. Однако Milvus - это распределенная векторная база данных, и чтобы обеспечить порядок выполнения всех операций DML и DDL на разных узлах, Milvus необходимо решить следующие две проблемы:

    +
      +
    1. В приведенном примере для двух пользователей, находящихся на разных узлах, часы времени отличаются. Например, если пользователь 2 отстает от пользователя 1 на 24 часа, все операции пользователя 1 будут видны пользователю 2 только на следующий день.

    2. +
    3. Может существовать сетевая задержка. Если пользователь 2 выполняет поиск в коллекции C0 по адресу t17, Milvus должен гарантировать, что все операции до t17 будут успешно обработаны и завершены. Если операция удаления на t15 задерживается из-за сетевых задержек, велика вероятность того, что пользователь 2 все еще может увидеть предположительно удаленные данные A1 при поиске на t17.

    4. +
    +

    Поэтому для решения этих проблем в Milvus используется система синхронизации времени (timetick).

    +

    Оракул временных меток (TSO)

    Для решения первой проблемы, упомянутой в предыдущем разделе, Milvus, как и другие распределенные системы, предоставляет сервис оракула временных меток (TSO). Это означает, что все события в Milvus должны получать временную метку от TSO, а не от локальных часов.

    +

    Служба TSO предоставляется корневым координатором в Milvus. Клиенты могут выделять одну или несколько временных меток в одном запросе на выделение временной метки.

    +

    Временная метка TSO - это тип значения uint64, состоящий из физической и логической частей. На рисунке ниже показан формат временной метки.

    +

    + + TSO_Timestamp + TSO_Timestamp.

    +

    Как показано на рисунке, 46 бит в начале - это физическая часть, а именно время UTC в миллисекундах. Последние 18 бит - это логическая часть.

    +

    Система синхронизации времени (timetick)

    В этом разделе на примере операции вставки данных объясняется механизм синхронизации времени в Milvus.

    +

    Когда прокси получает запрос на вставку данных от SDK, он делит сообщения вставки на различные потоки сообщений (MsgStream) в соответствии с хэш-значением первичных ключей.

    +

    Каждому сообщению вставки (InsertMsg) присваивается временная метка перед отправкой на MsgStream.

    +
    + MsgStream является оберткой очереди сообщений, которая в Milvus 2.0 по умолчанию является Pulsar.
    +

    + + timesync_proxy_insert_msg + timesync_proxy_insert_msg

    +

    Один из общих принципов заключается в том, что в MsgStream, временные меткиInsertMsgs от одного и того же прокси должны быть инкрементными. Однако для InsertMsgs от разных прокси такого правила не существует.

    +

    На следующем рисунке приведен пример InsertMsgs в фрагменте MsgStream. Фрагмент содержит пять InsertMsgs, три из которых взяты с Proxy1, а остальные - с Proxy2.

    +

    + + msgstream + msgstream

    +

    Временные метки трех InsertMsgs из Proxy1 инкрементны, как и двух InsertMsgs из Proxy2. Однако среди Proxy1 и Proxy2 InsertMsgs нет определенного порядка.

    +

    Один из возможных сценариев заключается в том, что при чтении сообщения с временной меткой 110 с Proxy2 Milvus обнаруживает, что сообщение с временной меткой 80 с Proxy1 все еще находится в MsgStream. Поэтому Milvus вводит систему синхронизации времени, timetick, чтобы гарантировать, что при чтении сообщения с MsgStream все сообщения с меньшими значениями временных меток должны быть потреблены.

    +

    + + time_synchronization + синхронизация по времени

    +

    Как показано на рисунке выше,

    +
      +
    • Каждый прокси периодически (по умолчанию каждые 200 мс) сообщает корневой коорд наибольшее значение временной метки последнего сообщения InsertMsg в MsgStream.

    • +
    • Корневой коорд определяет минимальное значение временной метки на этом Msgstream, независимо от того, какому прокси принадлежит InsertMsgs. Затем корневой коорд вставляет эту минимальную временную метку в Msgstream. Эта временная метка также называется timetick.

    • +
    • Когда компоненты-потребители читают timetick, вставленный root coord, они понимают, что все сообщения вставки с меньшими значениями timestamp были потреблены. Поэтому соответствующие запросы могут быть выполнены безопасно, не прерывая выполнение заказа.

    • +
    +

    На следующем рисунке приведен пример Msgstream со вставленным таймстиком.

    +

    + + timetick + временная метка

    +

    MsgStream обрабатывает сообщения партиями в соответствии с временным тиком, чтобы выходные сообщения соответствовали требованиям временной метки. В приведенном выше примере все записи, кроме InsertMsgs, из Proxy2 будут обработаны по адресу Timestamp: 120, так как они находятся после последнего тика времени.

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/reference/timestamp.json b/localization/v2.5.x/site/ru/reference/timestamp.json new file mode 100644 index 000000000..592555592 --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/timestamp.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Timestamp","anchorList":[{"label":"Временная метка","href":"Timestamp","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Параметры временной метки","href":"Timestamp-parameters","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/reference/timestamp.md b/localization/v2.5.x/site/ru/reference/timestamp.md new file mode 100644 index 000000000..83919ef3f --- /dev/null +++ b/localization/v2.5.x/site/ru/reference/timestamp.md @@ -0,0 +1,109 @@ +--- +id: timestamp.md +title: Временная метка в Мильвусе +summary: >- + Узнайте о понятии временной метки и четырех основных параметрах, связанных с + временной меткой, в векторной базе данных Milvus. +--- +

    Временная метка

    В этой теме объясняется понятие временной метки и представлены четыре основных параметра, связанных с временной меткой, в векторной базе данных Milvus.

    +

    Обзор

    Milvus - это векторная база данных, которая может искать и запрашивать векторы, преобразованные из неструктурированных данных. При выполнении операций на языке манипулирования данными (DML), включая вставку и удаление данных, Milvus присваивает метки времени сущностям, участвующим в операции. Поэтому все сущности в Milvus имеют атрибут timestamp. И партии сущностей в одной операции DML имеют одно и то же значение временной метки.

    +

    Параметры временной метки

    При выполнении поиска или запроса векторного сходства в Milvus задействуется несколько параметров, связанных с меткой времени.

    +
      +
    • Guarantee_timestamp

    • +
    • Service_timestamp

    • +
    • Graceful_time

    • +
    • Travel_timestamp

    • +
    +

    Guarantee_timestamp

    Guarantee_timestamp это тип временной метки, используемый для обеспечения того, чтобы все данные, обновленные операциями DML до Guarantee_timestamp, были видны при выполнении поиска или запроса по векторному подобию. Например, если вы вставили партию данных в 15:00, другую партию в 17:00, а значение Guarantee_timestamp установлено как 18:00 во время поиска векторного подобия. Это означает, что две партии данных, вставленные в 15:00 и 17:00 соответственно, должны быть задействованы в поиске.

    +

    Если значение Guarantee_timestamp не настроено, Milvus автоматически берет момент времени, когда был сделан запрос на поиск. Поэтому поиск ведется на представлении данных, в котором все данные были обновлены операциями DML до начала поиска.

    +

    Чтобы избавить вас от необходимости разбираться в TSO внутри Milvus, вам, как пользователю, не нужно напрямую настраивать параметр Guarantee_timestamp. Вам нужно только выбрать уровень согласованности, а Milvus автоматически обработает параметр Guarantee_timestamp для вас. Каждому уровню согласованности соответствует определенное значение Guarantee_timestamp.

    +

    + + Guarantee_Timestamp + Гарантированный_временной метки.

    +

    Пример

    Как показано на рисунке выше, значение Guarantee_timestamp установлено как 2021-08-26T18:15:00 (для простоты временная метка в этом примере представлена физическим временем). При выполнении поиска или запроса будут искаться или запрашиваться все данные до 2021-08-26T18:15:00.

    +

    Service_timestamp

    Service_timestamp это тип временной метки, автоматически генерируемой и управляемой узлами запросов в Milvus. Он используется для указания того, какие операции DML выполняются узлами запросов.

    +

    Данные, управляемые узлами запросов, можно разделить на два типа:

    +
      +
    • Исторические данные (или также называемые пакетными данными)

    • +
    • Инкрементные данные (или также называемые потоковыми данными).

    • +
    +

    В Milvus необходимо загружать данные перед выполнением поиска или запроса. Поэтому пакетные данные в коллекции загружаются узлом запроса перед выполнением запроса на поиск или запрос. Однако потоковые данные вставляются в Milvus или удаляются из него на лету, что требует от узла запроса вести хронологию операций DML и запросов поиска или запроса. В результате узлы запросов используют Service_timestamp для хранения такой временной шкалы. Service_timestamp можно рассматривать как момент времени, когда определенные данные становятся видимыми, поскольку узлы запросов могут убедиться, что все операции DML до Service_timestamp завершены.

    +

    Когда поступает запрос на поиск или запрос, узел запроса сравнивает значения Service_timestamp и Guarantee_timestamp. В основном существует два сценария.

    +

    + + Service_Timestamp + Service_Timestamp.

    +

    Сценарий 1: Service_timestamp >= Guarantee_timestamp

    Как показано на рисунке 1, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:00. Когда значение Service_timestamp увеличивается до 2021-08-26T18:15:01, это означает, что все операции DML до этого момента времени выполняются и завершаются узлом запроса, включая те операции DML до времени, указанного на Guarantee_timestamp. В результате запрос на поиск или запрос может быть выполнен немедленно.

    +

    Сценарий 2: Service_timestamp < Guarantee_timestamp

    Как показано на рисунке 2, значение Guarantee_timestamp установлено как 2021-08-26T18:15:00, а текущим значением Service_timestamp является только 2021-08-26T18:14:55. Это означает, что выполняются и завершаются только операции DML до 2021-08-26T18:14:55, оставляя часть операций DML после этой временной точки, но до Guarantee_timestamp незавершенными. Если поиск или запрос выполняется в этот момент, некоторые из требуемых данных еще не видны и недоступны, что серьезно повлияет на точность результатов поиска или запроса. Поэтому узел запроса должен отложить запрос на поиск или запрос до завершения операций DML перед guarantee_timestamp (т. е. когда Service_timestamp >= Guarantee_timestamp).

    +

    Graceful_time

    Технически говоря, Graceful_time - это не временная метка, а скорее период времени (например, 100 мс). Тем не менее, Graceful_time стоит упомянуть, поскольку он тесно связан с Guarantee_timestamp и Service_timestamp. Graceful_time - настраиваемый параметр в конфигурационном файле Milvus. Он используется для указания периода времени, который можно выдержать, прежде чем определенные данные станут видимыми. Короче говоря, незавершенные операции DML во время Graceful_time могут быть терпимы.

    +

    Когда поступает запрос на поиск или запрос, может быть два сценария.

    +

    + + Graceful_Time + Graceful_Time.

    +

    Сценарий 1: Service_timestamp + Graceful_time >= Guarantee_timestamp

    Как показано на рисунке 1, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:01, а Graceful_time - как 2s. Значение Service_timestamp увеличивается до 2021-08-26T18:15:00. Хотя значение Service_timestamp все еще меньше, чем Guarantee_timestamp, и не все операции DML до 2021-08-26T18:15:01 завершены, период невидимости данных в 2 секунды допускается, о чем свидетельствует значение Graceful_time. Поэтому входящий запрос на поиск или запрос может быть выполнен немедленно.

    +

    Сценарий 2: Service_timestamp + Graceful_time < Guarantee_timestamp

    Как показано на рисунке 2, значение Guarantee_timestamp устанавливается как 2021-08-26T18:15:01, а Graceful_time - как 2s. Текущее значение Service_timestamp равно только 2021-08-26T18:14:54. Это означает, что ожидаемые операции DML еще не завершены, и даже с учетом 2 секунд льготного времени невидимость данных все еще невыносима. Поэтому узел запроса должен отложить поиск или запрос до завершения определенных DML-запросов (т. е. когда Service_timestamp + Graceful_time >= Guarantee_timestamp).

    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/release_notes.json b/localization/v2.5.x/site/ru/release_notes.json new file mode 100644 index 000000000..3c9f7041c --- /dev/null +++ b/localization/v2.5.x/site/ru/release_notes.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Release Notes","anchorList":[{"label":"Информация о выпуске","href":"Release-Notes","type":1,"isActive":false},{"label":"v2.5.3","href":"v253","type":2,"isActive":false},{"label":"v2.5.2","href":"v252","type":2,"isActive":false},{"label":"v2.5.1","href":"v251","type":2,"isActive":false},{"label":"v2.5.0","href":"v250","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/release_notes.md b/localization/v2.5.x/site/ru/release_notes.md new file mode 100644 index 000000000..2aec96f80 --- /dev/null +++ b/localization/v2.5.x/site/ru/release_notes.md @@ -0,0 +1,210 @@ +--- +id: release_notes.md +summary: Информация о выпуске Milvus +title: Информация о выпуске +--- +

    Информация о выпуске

    Узнайте, что нового появилось в Milvus! На этой странице собраны новые возможности, улучшения, известные проблемы и исправления ошибок в каждом выпуске. В этом разделе вы найдете примечания к выпуску для каждой версии после v2.5.0. Мы рекомендуем вам регулярно посещать эту страницу, чтобы узнавать об обновлениях.

    +

    v2.5.3

    Дата выпуска: 13 января 2025 года

    + + + + + + + +
    Версия MilvusВерсия Python SDKВерсия Node.js SDKВерсия Java SDK
    2.5.32.5.32.5.32.5.4
    +

    В Milvus 2.5.3 исправлены критические ошибки и улучшена производительность, что повышает общую стабильность, надежность и удобство использования. В этой версии улучшена обработка параллелизма, усилена индексация и поиск данных, а также обновлен ряд ключевых компонентов для более надежной работы пользователей.

    +

    Исправления ошибок

      +
    • Исправлена проблема, при которой использование фильтра IN по первичному ключу VARCHAR могло возвращать пустые результаты.(#39108)
    • +
    • Исправлена проблема параллелизма между операциями запроса и удаления, которая могла приводить к неправильным результатам.(#39054)
    • +
    • Исправлен сбой, вызванный итеративной фильтрацией, когда expr в запросе был пустым.(#39034)
    • +
    • Исправлена проблема, когда ошибка диска при обновлении конфигурации приводила к использованию настроек конфигурации по умолчанию.(#39072)
    • +
    • Исправлена потенциальная потеря удаленных данных из-за уплотнения кластера.(#39133)
    • +
    • Исправлена ошибка запроса на совпадение текста в растущих сегментах данных.(#39113)
    • +
    • Исправлены сбои при извлечении, вызванные тем, что индекс не содержал исходных данных для разреженных векторов.(#39146)
    • +
    • Исправлено возможное состояние гонки полей столбцов, вызванное одновременным выполнением запросов и загрузкой данных.(#39152)
    • +
    • Исправлены ошибки массовой вставки, когда поля nullable или default_value не были включены в данные.(#39111)
    • +
    +

    Улучшения

      +
    • Добавлен API группы ресурсов для RESTful-интерфейса.(#39092)
    • +
    • Оптимизирована производительность извлечения данных за счет использования SIMD-методов битового набора.(#39041)
    • +
    • Временная метка MVCC используется в качестве гарантийной временной метки, если она указана.(#39019)
    • +
    • Добавлены недостающие метрики удаления.(#38747)
    • +
    • Обновлен Etcd до версии v3.5.16.(#38969)
    • +
    • Создан новый пакет Go для управления протосами.(#39128)
    • +
    +

    v2.5.2

    Дата выхода: 3 января 2025 г.

    + + + + + + + +
    Версия MilvusВерсия Python SDKВерсия SDK для Node.jsВерсия Java SDK
    2.5.22.5.32.5.32.5.3
    +

    Milvus 2.5.2 поддерживает изменение максимальной длины столбцов VARCHAR и решает несколько критических проблем, связанных с параллелизмом, падениями разделов и обработкой статистики BM25 при импорте. Мы настоятельно рекомендуем обновиться до этой версии для повышения стабильности и производительности.

    +

    Улучшения

      +
    • Генерирование журналов использования диска только в том случае, если указанный путь не существует.(#38822)
    • +
    • Добавлен параметр для настройки максимальной длины VARCHAR и восстановлено ограничение до 65 535.(#38883)
    • +
    • Поддерживается преобразование типов параметров для выражений.(#38782)
    • +
    +

    Исправления ошибок

      +
    • Исправлены потенциальные тупики в сценариях параллелизма.(#38863)
    • +
    • Генерировался файл index_null_offset только для полей, поддерживающих нулевые значения.(#38834)
    • +
    • Исправлено использование плана извлечения после освобождения в фазе уменьшения.(#38841)
    • +
    • Распознавание выражений с заглавными буквами AND и OR.(#38928)
    • +
    • Разрешено успешное удаление разделов даже при неудачной загрузке.(#38874)
    • +
    • Исправлены проблемы с регистрацией файла статистики BM25 при импорте.(#38881)
    • +
    +

    v2.5.1

    Дата выхода: 26 декабря 2024 года

    + + + + + + + +
    Версия MilvusВерсия Python SDKВерсия SDK для Node.jsВерсия Java SDK
    2.5.12.5.22.5.22.5.2
    +

    В Milvus 2.5.1 исправлен ряд ошибок, касающихся загрузки памяти, списков RBAC, балансировки узлов запросов и индексации сегментов с уплотнениями, а также улучшены веб-интерфейс и перехватчики. Мы настоятельно рекомендуем обновиться до версии 2.5.1 для повышения стабильности и надежности.

    +

    Улучшения

      +
    • Обновление страниц коллекции и запросов в веб-интерфейсе.(#38701)
    • +
    +

    Исправления ошибок

      +
    • Исправлены проблемы OOM путем добавления фактора памяти к оценкам загрузки.(#38722)
    • +
    • Исправлено расширение групп привилегий при перечислении политик в RootCoord.(#38760)
    • +
    • Исправлены проблемы со списком групп привилегий и коллекций.(#38738)
    • +
    • Исправлен балансировщик, чтобы избежать повторной перегрузки одного и того же узла запроса.(#38724)
    • +
    • Исправлены неожиданные задачи балансировщика, запускаемые после перезапуска QueryCoord.(#38725)
    • +
    • Исправлено обновление конфигурации нагрузки, которое не применялось к загружаемым коллекциям.(#38737)
    • +
    • Исправлен нулевой счетчик чтения при импорте данных.(#38695)
    • +
    • Исправлено декодирование юникода для JSON-ключей в выражениях.(#38653)
    • +
    • Исправлено имя БД перехватчика для alterCollectionField в 2.5. (#38663)
    • +
    • Исправлены пустые параметры индекса для запечатанных сегментов при использовании перебора BM25.(#38752)
    • +
    +

    v2.5.0

    Дата выхода: 23 декабря 2024 года

    + + + + + + + +
    Версия MilvusВерсия Python SDKВерсия SDK для Node.jsВерсия Java SDK
    2.5.02.5.12.5.22.5.2
    +

    В Milvus 2.5.0 реализованы значительные улучшения, повышающие удобство использования, масштабируемость и производительность для пользователей, работающих с векторным поиском и управлением крупномасштабными данными. В этом выпуске Milvus интегрирует новые мощные функции, такие как поиск по терминам, уплотнение кластеров для оптимизации запросов и универсальная поддержка методов поиска по разреженным и плотным векторам. Усовершенствования в управлении кластерами, индексировании и обработке данных обеспечивают новые уровни гибкости и простоты использования, делая Milvus еще более надежной и удобной векторной базой данных.

    +

    Ключевые особенности

    Milvus 2.5 поддерживает полнотекстовый поиск, реализованный с помощью Sparse-BM25! Эта функция является важным дополнением к сильным возможностям семантического поиска Milvus, особенно в сценариях, связанных с редкими словами или техническими терминами. В предыдущих версиях Milvus поддерживал разреженные векторы для помощи в сценариях поиска по ключевым словам. Эти разреженные векторы генерировались вне Milvus с помощью нейронных моделей, таких как SPLADEv2/BGE-M3, или статистических моделей, таких как алгоритм BM25.

    +

    Milvus 2.5, работающий на базе Tantivy, имеет встроенные анализаторы и извлечение разреженных векторов, расширяя API от получения только векторов в качестве входных данных до прямого приема текста. Статистическая информация BM25 обновляется в реальном времени по мере ввода данных, что повышает удобство использования и точность. Кроме того, разреженные векторы, основанные на алгоритмах приближенного поиска ближайших соседей (ANN), обеспечивают более высокую производительность по сравнению со стандартными системами поиска по ключевым словам.

    +

    Подробнее см. в разделах Обзор анализатора и Полнотекстовый поиск.

    +

    Веб-интерфейс управления кластерами (бета-версия)

    Чтобы лучше поддерживать огромные данные и богатые возможности, сложная конструкция Milvus включает в себя различные зависимости, многочисленные роли узлов, сложные структуры данных и многое другое. Эти аспекты могут создавать проблемы при использовании и обслуживании.

    +

    В Milvus 2.5 появился встроенный WebUI для управления кластерами, который снижает сложность обслуживания системы за счет визуализации сложной информации о среде выполнения Milvus. Сюда входят сведения о базах данных и коллекциях, сегментах, каналах, зависимостях, состоянии здоровья узлов, информация о задачах, медленных запросах и многое другое.

    +

    Подробнее см. в разделе Milvus WebUI.

    +

    Текстовое соответствие

    Milvus 2.5 использует анализаторы и индексацию от Tantivy для предварительной обработки текста и создания индекса, поддерживая точное естественно-языковое соответствие текстовых данных на основе определенных терминов. Эта функция в основном используется для фильтрации поиска по определенным условиям и может включать скалярную фильтрацию для уточнения результатов запроса, позволяя искать сходство в векторах, удовлетворяющих скалярным критериям.

    +

    Подробнее см. в разделах "Обзор анализатора " и "Подбор текста".

    +

    Индекс растровых изображений

    В семействе Milvus появился новый скалярный индекс данных. Индекс BitMap использует массив битов, равный по длине количеству строк, для представления существования значений и ускорения поиска.

    +

    Битовые индексы традиционно эффективны для полей с низкой кардинальностью, которые имеют небольшое количество различных значений - например, столбец, содержащий информацию о поле, имеет только два возможных значения: male и female.

    +

    Подробнее см. в разделе Растровый индекс.

    +

    Нулевое значение и значение по умолчанию

    Milvus теперь поддерживает установку нулевых свойств и значений по умолчанию для скалярных полей, отличных от поля первичного ключа. Для скалярных полей, помеченных как nullable=True, пользователи могут опустить поле при вставке данных; система будет рассматривать его как нулевое значение или значение по умолчанию (если оно установлено) без возникновения ошибки.

    +

    Значения по умолчанию и свойства с возможностью обнуления обеспечивают большую гибкость Milvus. Пользователи могут использовать эту функцию для полей с неопределенными значениями при создании коллекций. Она также упрощает миграцию данных из других систем баз данных в Milvus, позволяя работать с наборами данных, содержащими нулевые значения, с сохранением исходных настроек значений по умолчанию.

    +

    Подробности см. в разделе "Нулевые значения и значения по умолчанию".

    +

    HNSW SQ/PQ/PRQ на основе Faiss

    Благодаря тесному сотрудничеству с сообществом Faiss, алгоритм HNSW в Faiss был значительно улучшен как в плане функциональности, так и в плане производительности. Из соображений стабильности и удобства сопровождения Milvus 2.5 официально перенес поддержку HNSW из hnswlib в Faiss.

    +

    Основываясь на Faiss, Milvus 2.5 поддерживает несколько методов квантования в HNSW для удовлетворения потребностей различных сценариев: SQ (Scalar Quantizers), PQ (Product Quantizer) и PRQ (Product Residual Quantizer). SQ и PQ более распространены; SQ обеспечивает хорошую производительность запросов и скорость сборки, в то время как PQ предлагает лучший отзыв при том же коэффициенте сжатия. Во многих векторных базах данных обычно используется бинарное квантование, которое является простой формой квантования SQ.

    +

    PRQ - это объединение PQ и AQ (аддитивного квантования). По сравнению с PQ, он требует больше времени на сборку, но обеспечивает лучший отзыв, особенно при высокой степени сжатия, говоря о двоичном сжатии.

    +

    Кластерное уплотнение (бета-версия)

    В Milvus 2.5 появилась функция Clustering Compaction для ускорения поиска и снижения затрат в больших коллекциях. При указании скалярного поля в качестве ключа кластеризации данные перераспределяются по диапазонам для оптимизации хранения и поиска. Действуя подобно глобальному индексу, эта функция позволяет Milvus эффективно отсеивать данные при запросах на основе метаданных кластеризации, повышая производительность поиска при применении скалярных фильтров.

    +

    Подробности см. в разделе "Компактификация кластеризации".

    +

    Другие возможности

    Потоковый узел (бета-версия)

    В Milvus 2.5 появился новый компонент, называемый потоковым узлом, который предоставляет услуги ведения журнала с опережением записи (WAL). Это позволяет Milvus достигать консенсуса до и после чтения и записи каналов, открывая новые возможности, функционал и оптимизации. Эта функция отключена по умолчанию в Milvus 2.5 и будет официально доступна в версии 3.0.

    +

    Поддержка IPv6

    Milvus теперь поддерживает IPv6, что позволяет расширить возможности сетевого подключения и совместимость.

    +

    Массовый импорт CSV

    В дополнение к форматам JSON и Parquet, Milvus теперь поддерживает прямой массовый импорт данных в формате CSV.

    +

    Шаблоны выражений для ускорения запросов

    Milvus теперь поддерживает шаблоны выражений, что повышает эффективность разбора выражений, особенно в сценариях со сложными выражениями.

    +

    Подробности см. в разделе Шаблонизация фильтров.

    +

    Усовершенствования GroupBy

      +
    • Настраиваемый размер группы: Добавлена поддержка указания количества записей, возвращаемых для каждой группы.
    • +
    • Гибридный поиск GroupBy: Поддерживается гибридный поиск GroupBy на основе нескольких векторных столбцов.
    • +
    +

    Усовершенствования итератора

      +
    • Поддержка MVCC: Теперь пользователи могут использовать итераторы без последствий последующих изменений данных, таких как вставки и удаления, благодаря Multi-Version Concurrency Control (MVCC).
    • +
    • Постоянный курсор: Milvus теперь поддерживает постоянный курсор для QueryIterator, что позволяет пользователям возобновить итерацию с последней позиции после перезапуска Milvus без необходимости перезапускать весь процесс итерации.
    • +
    +

    Улучшения

    Оптимизация удаления

    Повышена скорость и снижено потребление памяти при масштабных удалениях за счет оптимизации использования блокировок и управления памятью.

    +

    Обновление зависимостей

    Обновление до ETCD 3.5.16 и Pulsar 3.0.7 LTS, исправляющее существующие CVE и повышающее безопасность. Примечание: Обновление до Pulsar 3.x не совместимо с предыдущими версиями 2.x.

    +

    Для пользователей, у которых уже есть работающее развертывание Milvus, необходимо обновить компоненты ETCD и Pulsar, прежде чем вы сможете использовать новые возможности и функции. Подробности см. в разделе Обновление Pulsar с версии 2.x до версии 3.x.

    +

    Локальное хранилище V2

    В Milvus 2.5 представлен новый формат локальных файлов, что повышает эффективность загрузки и запросов для скалярных данных, снижает нагрузку на память и закладывает основу для будущих оптимизаций.

    +

    Оптимизация разбора выражений

    Улучшение разбора выражений за счет внедрения кэширования повторяющихся выражений, обновления ANTLR и оптимизации производительности клаузул NOT IN.

    +

    Улучшение производительности параллелизма DDL

    Оптимизирована производительность параллелизма операций языка определения данных (DDL).

    +

    Выравнивание функций RESTful API

    Согласование функциональных возможностей RESTful API с другими SDK для обеспечения согласованности.

    +

    Обновления в области безопасности и конфигурации

    Поддержка TLS для защиты межузловой связи в более сложных или корпоративных средах. Подробности см. в разделе Конфигурация безопасности.

    +

    Повышение производительности уплотнения

    Устранены ограничения на максимальное количество сегментов при смешанном уплотнении, теперь приоритет отдается меньшим сегментам, что повышает эффективность и ускоряет запросы к большим или фрагментированным наборам данных.

    +

    Балансировка каналов на основе баллов

    Внедрена политика, которая динамически распределяет нагрузку между каналами, повышая эффективность использования ресурсов и общую стабильность в крупномасштабных развертываниях.

    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-bge.json b/localization/v2.5.x/site/ru/rerankers/rerankers-bge.json new file mode 100644 index 000000000..2b0b4680b --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-bge.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import BGERerankFunction\n\n# Define the rerank function\nbge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = bge_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.991162\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: 0.032697\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: 0.006515\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"BGE","anchorList":[{"label":"BGE","href":"BGE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-bge.md b/localization/v2.5.x/site/ru/rerankers/rerankers-bge.md new file mode 100644 index 000000000..cb5c3e71e --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-bge.md @@ -0,0 +1,78 @@ +--- +id: rerankers-bge.md +order: 2 +summary: >- + Milvus поддерживает модели реранкера BGE с помощью класса `BGERerankFunction`. + Эта функция позволяет эффективно оценивать релевантность пар запрос-документ. +title: BGE +--- +

    BGE

    Milvus поддерживает модели реранкера BGE с помощью класса BGERerankFunction. Эта функциональность позволяет эффективно оценивать релевантность пар запрос-документ.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте класс BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +# Define the rerank function
    +bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Параметры

    +
      +
    • model_name (string)

      +

      Имя используемой модели. Вы можете указать любое из доступных имен моделей реранкера BGE, например, BAAI/bge-reranker-base, BAAI/bge-reranker-large, и т.д. Если оставить этот параметр неуказанным, будет использована модель BAAI/bge-reranker-v2-m3. Список доступных моделей см. в разделе Список моделей.

    • +
    • device (строка)

      +

      Необязательный параметр. Устройство, которое будет использоваться для запуска модели. Если параметр не указан, модель будет запущена на центральном процессоре. Вы можете указать cpu для CPU и cuda:n для n-го устройства GPU.

    • +
    +

    Затем используйте следующий код для ранжирования документов на основе запроса:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = bge_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Ожидаемый результат будет выглядеть следующим образом:

    +
    Index: 1
    +Score: 0.991162
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: 0.032697
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: 0.006515
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.json b/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.json new file mode 100644 index 000000000..711fccdf0 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CohereRerankFunction\n\n# Define the rerank function\ncohere_rf = CohereRerankFunction(\n model_name=\"rerank-english-v3.0\", # Specify the model name. Defaults to `rerank-english-v2.0`.\n api_key=COHERE_API_KEY # Replace with your Cohere API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = cohere_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.99691266\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.8578872\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.3589146\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.md b/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.md new file mode 100644 index 000000000..79214560c --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-cohere.md @@ -0,0 +1,79 @@ +--- +id: rerankers-cohere.md +order: 3 +summary: >- + Milvus поддерживает модели реранкера Cohere с помощью класса + `CohereRerankFunction`. Эта функция позволяет эффективно оценивать + релевантность пар запрос-документ. +title: Реранкеры Cohere +--- +

    Cohere

    Milvus поддерживает модели реранкера Cohere с помощью класса CohereRerankFunction. Эта функциональность позволяет эффективно оценивать релевантность пар запрос-документ.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте класс CohereRerankFunction:

    +
    from pymilvus.model.reranker import CohereRerankFunction
    +
    +# Define the rerank function
    +cohere_rf = CohereRerankFunction(
    +    model_name="rerank-english-v3.0",  # Specify the model name. Defaults to `rerank-english-v2.0`.
    +    api_key=COHERE_API_KEY # Replace with your Cohere API key
    +)
    +
    +

    Параметры

    +
      +
    • model_name (string)

      +

      Имя используемой модели. Вы можете указать любое из доступных имен моделей Cohere reranker, например, rerank-english-v3.0, rerank-multilingual-v3.0, и т. д. Если оставить этот параметр неуказанным, будет использована модель rerank-english-v2.0. Список доступных моделей см. в разделе Rerank.

    • +
    • api_key (string)

      +

      Ключ API для доступа к API Cohere. Информацию о том, как создать API-ключ, см. в разделе Cohere dashboard.

    • +
    +

    Затем используйте следующий код для ранжирования документов на основе запроса:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = cohere_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Ожидаемый результат будет выглядеть следующим образом:

    +
    Index: 1
    +Score: 0.99691266
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.8578872
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.3589146
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.json b/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.json new file mode 100644 index 000000000..344d9985b --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CrossEncoderRerankFunction\n\n# Define the rerank function\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = ce_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 6.250533\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: -2.954602\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: -4.771512\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Cross Encoder","anchorList":[{"label":"Кросс-кодировщик","href":"Cross-Encoder","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.md b/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.md new file mode 100644 index 000000000..d5a250dd2 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-cross-encoder.md @@ -0,0 +1,79 @@ +--- +id: rerankers-cross-encoder.md +order: 4 +summary: >- + Milvus поддерживает модели реранкера Cross Encoder с помощью класса + `CrossEncoderRerankFunction`. Эта функция позволяет эффективно оценивать + релевантность пар запрос-документ. +title: Кросс-кодировщик +--- +

    Кросс-кодировщик

    Milvus поддерживает кросс-кодировщики через класс CrossEncoderRerankFunction. Эта функциональность позволяет эффективно оценивать релевантность пар запрос-документ.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте класс CrossEncoderRerankFunction:

    +
    from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +# Define the rerank function
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (string)

      +

      Имя используемой модели. Вы можете указать любое из доступных имен моделей Cross-Encoder, например, cross-encoder/ms-marco-TinyBERT-L-2-v2, cross-encoder/ms-marco-MiniLM-L-2-v2, и т. д. Если оставить этот параметр неуказанным, будет использована пустая строка. Список доступных моделей см. в разделе Предварительно обученные перекрестные энкодеры.

    • +
    • device (string)

      +

      Устройство, которое будет использоваться для запуска модели. Вы можете указать cpu для CPU и cuda:n для n-го устройства GPU.

    • +
    +

    Затем используйте следующий код для ранжирования документов на основе запроса:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = ce_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Index: 1
    +Score: 6.250533
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: -2.954602
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: -4.771512
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-jina.json b/localization/v2.5.x/site/ru/rerankers/rerankers-jina.json new file mode 100644 index 000000000..a7f7c04fe --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_rf = JinaRerankFunction(\n model_name=\"jina-reranker-v2-base-multilingual\", # Defaults to `jina-reranker-v2-base-multilingual`\n api_key=JINAAI_API_KEY\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = jina_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.937096\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.354210\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.349866\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-jina.md b/localization/v2.5.x/site/ru/rerankers/rerankers-jina.md new file mode 100644 index 000000000..bf0b85a66 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-jina.md @@ -0,0 +1,78 @@ +--- +id: rerankers-jina.md +order: 6 +summary: >- + Milvus поддерживает модель реранкера Jina с помощью класса + `JinaRerankFunction`. Эта функция позволяет эффективно оценивать релевантность + пар запрос-документ. +title: Jina AI - Реранкеры +--- +

    Jina AI

    Milvus поддерживает модели реранкера Jina AI с помощью класса JinaRerankFunction. Эта функция позволяет эффективно оценивать релевантность пар запрос-документ.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте JinaRerankFunction:

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_rf = JinaRerankFunction(
    +    model_name="jina-reranker-v2-base-multilingual", # Defaults to `jina-reranker-v2-base-multilingual`
    +    api_key=JINAAI_API_KEY
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (строка)

      +

      Имя модели Jina AI reranker, которую следует использовать для кодирования. Если оставить этот параметр неуказанным, будет использоваться jina-reranker-v2-base-multilingual. Список доступных моделей см. в разделе Jina AI Rerankers.

    • +
    • api_key (string)

      +

      API-ключ для доступа к API Jina AI.

    • +
    +

    Затем используйте следующий код для ранжирования документов на основе запроса:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = jina_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Ожидаемый результат будет выглядеть следующим образом:

    +
    Index: 1
    +Score: 0.937096
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.354210
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.349866
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-overview.json b/localization/v2.5.x/site/ru/rerankers/rerankers-overview.json new file mode 100644 index 000000000..3d915f382 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-overview.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus[model]\n# or pip install \"pymilvus[model]\" for zsh.\n","from pymilvus.model.reranker import BGERerankFunction\n","bge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nbge_rf(query, documents)\n","[RerankResult(text=\"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\", score=0.9911615761470803, index=1),\n RerankResult(text=\"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\", score=0.0326971950177779, index=0),\n RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),\n RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]\n","entities = [\n {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\"}, \n {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\"}, \n {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, \n {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}\n]\n","from pymilvus import MilvusClient, DataType\n\nclient = MilvusClient(\n uri=\"http://10.102.6.214:19530\" # replace with your own Milvus server address\n)\n\nclient.drop_collection('test_collection')\n\n# define schema\n\nschema = client.create_schema(auto_id=False, enabel_dynamic_field=True)\n\nschema.add_field(field_name=\"doc_id\", datatype=DataType.INT64, is_primary=True, description=\"document id\")\nschema.add_field(field_name=\"doc_vector\", datatype=DataType.FLOAT_VECTOR, dim=384, description=\"document vector\")\nschema.add_field(field_name=\"doc_text\", datatype=DataType.VARCHAR, max_length=65535, description=\"document text\")\n\n# define index params\n\nindex_params = client.prepare_index_params()\n\nindex_params.add_index(field_name=\"doc_vector\", index_type=\"IVF_FLAT\", metric_type=\"IP\", params={\"nlist\": 128})\n\n# create collection\n\nclient.create_collection(collection_name=\"test_collection\", schema=schema, index_params=index_params)\n\n# insert data into collection\n\nclient.insert(collection_name=\"test_collection\", data=entities)\n\n# Output:\n# {'insert_count': 4, 'ids': [0, 1, 2, 3]}\n","# search results based on our query\n\nres = client.search(\n collection_name=\"test_collection\",\n data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector\n limit=3,\n output_fields=[\"doc_id\", \"doc_text\"]\n)\n\nfor i in res[0]:\n print(f'distance: {i[\"distance\"]}')\n print(f'doc_text: {i[\"entity\"][\"doc_text\"]}')\n","distance: 0.7235960960388184\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\ndistance: 0.6269873976707458\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\ndistance: 0.5340118408203125\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n","# use reranker to rerank search results\n\nfrom pymilvus.model.reranker import CrossEncoderRerankFunction\n\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n\nreranked_results = ce_rf(\n query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',\n documents=[\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n ],\n top_k=3\n)\n\n# print the reranked results\nfor result in reranked_results:\n print(f'score: {result.score}')\n print(f'doc_text: {result.text}')\n","score: 6.250532627105713\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\nscore: -2.9546022415161133\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\nscore: -4.771512031555176\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Rerankers Overview","anchorList":[{"label":"Обзор реранкеров","href":"Rerankers-Overview","type":1,"isActive":false},{"label":"Пример 1: Использование функции BGE rerank для ранжирования документов в соответствии с запросом","href":"Example-1-Use-BGE-rerank-function-to-rerank-documents-according-to-a-query","type":2,"isActive":false},{"label":"Пример 2: Использование реранкера для повышения релевантности результатов поиска","href":"Example-2-Use-a-reranker-to-enhance-relevance-of-search-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-overview.md b/localization/v2.5.x/site/ru/rerankers/rerankers-overview.md new file mode 100644 index 000000000..353732167 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-overview.md @@ -0,0 +1,210 @@ +--- +id: rerankers-overview.md +order: 1 +summary: >- + В библиотеку моделей PyMilvus интегрированы функции rerank для оптимизации + порядка результатов, возвращаемых при первоначальном поиске. +title: Обзор реранкеров +--- +

    Обзор реранкеров

    В сфере информационного поиска и генеративного ИИ реранкер - это важный инструмент, который оптимизирует порядок результатов первоначального поиска. Реранкеры отличаются от традиционных моделей встраивания тем, что принимают запрос и документ в качестве входных данных и напрямую возвращают оценку сходства вместо встраивания. Этот показатель указывает на релевантность запроса и документа.

    +

    Реранкеры часто используются после первого этапа поиска, обычно выполняемого с помощью векторного метода приближенных ближайших соседей (ANN). Хотя поиск с помощью ANN эффективен для получения широкого набора потенциально релевантных результатов, он не всегда определяет приоритет результатов с точки зрения фактической семантической близости к запросу. В данном случае rerankers используется для оптимизации порядка результатов с помощью более глубокого контекстного анализа, часто с использованием передовых моделей машинного обучения, таких как BERT или другие модели на основе трансформеров. Таким образом, rerankers может значительно повысить точность и релевантность конечных результатов, предоставляемых пользователю.

    +

    В библиотеку моделей PyMilvus интегрированы функции ранжирования для оптимизации порядка результатов, возвращаемых при первоначальном поиске. После того как вы получили ближайшие вложения из Milvus, вы можете использовать эти инструменты ранжирования для уточнения результатов поиска, чтобы повысить точность результатов поиска.

    + + + + + + + + + + + +
    Функция ранжированияAPI или открытый источник
    BGEОткрытый ресурс
    Перекрестный кодировщикOpen-sourced
    VoyageAPI
    CohereAPI
    Jina AIAPI
    +
    +
      +
    • Прежде чем использовать реранкеры с открытым исходным кодом, убедитесь, что вы скачали и установили все необходимые зависимости и модели.

    • +
    • Для реранкеров на базе API получите у провайдера ключ API и задайте его в соответствующих переменных окружения или аргументах.

    • +
    +
    +

    Пример 1: Использование функции BGE rerank для ранжирования документов в соответствии с запросом

    В этом примере мы покажем, как ранжировать результаты поиска с помощью BGE reranker на основе определенного запроса.

    +

    Чтобы использовать реранкер с библиотекой моделей PyMilvus, начните с установки библиотеки моделей PyMilvus вместе с подпакетом model, который содержит все необходимые утилиты для реранкинга:

    +
    pip install pymilvus[model]
    +# or pip install "pymilvus[model]" for zsh.
    +
    +

    Чтобы использовать реранкер BGE, сначала импортируйте класс BGERerankFunction:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +

    Затем создайте экземпляр BGERerankFunction для ранжирования:

    +
    bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    Чтобы проранжировать документы на основе запроса, используйте следующий код:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +bge_rf(query, documents)
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9911615761470803, index=1),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.0326971950177779, index=0),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]
    +
    +

    Пример 2: Использование реранкера для повышения релевантности результатов поиска

    В этом руководстве мы рассмотрим, как использовать метод search() в PyMilvus для проведения поиска по сходству и как повысить релевантность результатов поиска с помощью реранкера. В нашей демонстрации будет использован следующий набор данных:

    +
    entities = [
    +    {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence."}, 
    +    {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals."}, 
    +    {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, 
    +    {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}
    +]
    +
    +

    Компоненты набора данных:

    +
      +
    • doc_id: : Уникальный идентификатор для каждого документа.
    • +
    • doc_vector: Векторные вкрапления, представляющие документ. Руководство по созданию вкраплений см. в разделе "Вкрапления".
    • +
    • doc_text: Текстовое содержимое документа.
    • +
    +

    Подготовка

    Перед началом поиска сходства необходимо установить соединение с Milvus, создать коллекцию, подготовить и вставить данные в эту коллекцию. Следующий фрагмент кода иллюстрирует эти предварительные шаги.

    +
    from pymilvus import MilvusClient, DataType
    +
    +client = MilvusClient(
    +    uri="http://10.102.6.214:19530" # replace with your own Milvus server address
    +)
    +
    +client.drop_collection('test_collection')
    +
    +# define schema
    +
    +schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
    +
    +schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
    +schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
    +schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
    +
    +# define index params
    +
    +index_params = client.prepare_index_params()
    +
    +index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
    +
    +# create collection
    +
    +client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
    +
    +# insert data into collection
    +
    +client.insert(collection_name="test_collection", data=entities)
    +
    +# Output:
    +# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
    +
    +

    После вставки данных выполните поиск сходства с помощью метода search.

    +
    # search results based on our query
    +
    +res = client.search(
    +    collection_name="test_collection",
    +    data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
    +    limit=3,
    +    output_fields=["doc_id", "doc_text"]
    +)
    +
    +for i in res[0]:
    +    print(f'distance: {i["distance"]}')
    +    print(f'doc_text: {i["entity"]["doc_text"]}')
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    distance: 0.7235960960388184
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +distance: 0.6269873976707458
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +distance: 0.5340118408203125
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +

    Использование реранкера для улучшения результатов поиска

    Затем улучшите релевантность результатов поиска с помощью шага ранжирования. В этом примере мы используем CrossEncoderRerankFunction, встроенный в PyMilvus, для ранжирования результатов с целью повышения точности.

    +
    # use reranker to rerank search results
    +
    +from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +reranked_results = ce_rf(
    +    query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',
    +    documents=[
    +        "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +        "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +        "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +        "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +    ],
    +    top_k=3
    +)
    +
    +# print the reranked results
    +for result in reranked_results:
    +    print(f'score: {result.score}')
    +    print(f'doc_text: {result.text}')
    +
    +

    Ожидаемый результат похож на следующий:

    +
    score: 6.250532627105713
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +score: -2.9546022415161133
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +score: -4.771512031555176
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.json b/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.json new file mode 100644 index 000000000..e4cad0c5a --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import VoyageRerankFunction\n\n# Define the rerank function\nvoyage_rf = VoyageRerankFunction(\n model_name=\"rerank-lite-1\", # Specify the model name. Defaults to `rerank-lite-1`.\n api_key=VOYAGE_API_KEY # Replace with your Voyage API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = voyage_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.898438\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.718750\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.679688\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Voyage","anchorList":[{"label":"Voyage","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.md b/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.md new file mode 100644 index 000000000..dd8cc8139 --- /dev/null +++ b/localization/v2.5.x/site/ru/rerankers/rerankers-voyage.md @@ -0,0 +1,79 @@ +--- +id: rerankers-voyage.md +order: 5 +summary: >- + Milvus поддерживает модель реранкера Voyage с помощью класса + `VoyageRerankFunction`. Эта функция позволяет эффективно оценивать + релевантность пар запрос-документ. +title: Путешествие реранкеров +--- +

    Voyage

    Milvus поддерживает модель реранкера Voyage с помощью класса VoyageRerankFunction. Эта функциональность позволяет эффективно оценивать релевантность пар запрос-документ.

    +

    Чтобы воспользоваться этой функцией, установите необходимые зависимости:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    Затем инстанцируйте класс VoyageRerankFunction:

    +
    from pymilvus.model.reranker import VoyageRerankFunction
    +
    +# Define the rerank function
    +voyage_rf = VoyageRerankFunction(
    +    model_name="rerank-lite-1",  # Specify the model name. Defaults to `rerank-lite-1`.
    +    api_key=VOYAGE_API_KEY # Replace with your Voyage API key
    +)
    +
    +

    Параметры:

    +
      +
    • model_name (string)

      +

      Имя модели Voyage, которую следует использовать для кодирования. Если оставить этот параметр неуказанным, будет использована модель rerank-lite-1. Список доступных моделей см. в разделе Реранкеры.

    • +
    • api_key (строка)

      +

      API-ключ для доступа к API Voyage. Информацию о том, как создать API-ключ, см. в разделе API-ключ и Python-клиент.

    • +
    +

    Затем используйте следующий код для ранжирования документов на основе запроса:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = voyage_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    Ожидаемый результат будет похож на следующий:

    +
    Index: 1
    +Score: 0.898438
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.718750
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.679688
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.json b/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.json new file mode 100644 index 000000000..b7983d457 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Audio Similarity Search","anchorList":[{"label":"Поиск сходства аудиофайлов","href":"Audio-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.md b/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.md new file mode 100644 index 000000000..f64857499 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/audio_similarity_search.md @@ -0,0 +1,36 @@ +--- +id: audio_similarity_search.md +summary: Создайте систему поиска сходства аудиофайлов с помощью Milvus. +title: Поиск сходства аудиофайлов +--- +

    Поиск сходства аудиофайлов

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания системы поиска сходства аудио.

    +

    Используемые модели ML и стороннее программное обеспечение включают:

    +
      +
    • PANNs (Large-Scale Pretrained Audio Neural Networks)
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    Поиск по речи, музыке, звуковым эффектам и другим типам аудиозаписей позволяет быстро запрашивать огромные объемы аудиоданных и находить похожие звуки. Приложения систем поиска сходства звуков включают определение похожих звуковых эффектов, минимизацию нарушений прав интеллектуальной собственности и многое другое. Аудиопоиск может использоваться для поиска и мониторинга онлайн-медиа в режиме реального времени с целью пресечения нарушений прав интеллектуальной собственности. Он также играет важную роль в классификации и статистическом анализе аудиоданных.

    +


    +

    В этом уроке вы узнаете, как построить систему поиска по сходству аудиоданных, которая может возвращать похожие звуковые клипы. Загруженные аудиоклипы преобразуются в векторы с помощью PANN. Эти векторы хранятся в Milvus, который автоматически генерирует уникальный идентификатор для каждого вектора. Затем пользователи могут провести поиск векторного сходства в Milvus и запросить путь к данным аудиоклипа, соответствующий уникальному идентификатору вектора, возвращенному Milvus.

    +


    +

    + + Audio_search + Audio_search Audio_search_demoAudio_search_demo

    diff --git a/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.json b/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.json new file mode 100644 index 000000000..bbf18e2b0 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-3.5-turbo\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus","anchorList":[{"label":"Создание RAG с помощью Milvus","href":"Build-RAG-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Построение RAG","href":"Build-RAG","type":2,"isActive":false},{"label":"Быстрое развертывание","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.md b/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.md new file mode 100644 index 000000000..36b84fa53 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/build-rag-with-milvus.md @@ -0,0 +1,250 @@ +--- +id: build-rag-with-milvus.md +summary: Постройте тряпку с помощью милвуса +title: Создание RAG с помощью Milvus +--- +

    Создание RAG с помощью Milvus

    Open In Colab +GitHub Repository

    +

    +

    В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus.

    +

    Система RAG объединяет поисковую систему с генеративной моделью для создания нового текста на основе заданного запроса. Сначала система извлекает релевантные документы из корпуса с помощью Milvus, а затем использует генеративную модель для создания нового текста на основе извлеченных документов.

    +

    Подготовка

    Зависимости и окружение

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапустить среду выполнения. (Нажмите на меню "Время выполнения" в верхней части экрана и выберите "Перезапустить сессию" из выпадающего меню).

    +
    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вам следует подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватных знаний в нашем RAG, что является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка модели встраивания

    Мы инициализируем клиент OpenAI, чтобы подготовить модель встраивания.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Определите функцию для генерации текстовых вкраплений с помощью клиента OpenAI. В качестве примера мы используем модель text-embedding-3-small.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовое вкрапление и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.00988506618887186, -0.005540902726352215, 0.0068014683201909065, -0.03810417652130127, -0.018254263326525688, -0.041231658309698105, -0.007651153020560741, 0.03220026567578316, 0.01892443746328354, 0.00010708322952268645]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:27<00:00,  2.67it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    Построение RAG

    Получение данных для запроса

    Давайте зададим частый вопрос о Milvus.

    +
    question = "How is data stored in milvus?"
    +
    +

    Найдем этот вопрос в коллекции и получим семантический топ-3 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по этому запросу.

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7883545756340027
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6757288575172424
    +    ],
    +    [
    +        "How much does Milvus cost?\n\nMilvus is a 100% free open-source project.\n\nPlease adhere to [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) when using Milvus for production or distribution purposes.\n\nZilliz, the company behind Milvus, also offers a fully managed cloud version of the platform for those that don't want to build and maintain their own distributed instance. [Zilliz Cloud](https://zilliz.com/cloud) automatically maintains data reliability and allows users to pay only for what they use.\n\n###",
    +        0.6421123147010803
    +    ]
    +]
    +
    +

    Использование LLM для получения ответа RAG

    Преобразуйте полученные документы в строковый формат.

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    Определите системные и пользовательские подсказки для модели Lanage. Эта подсказка собрана из документов, полученных из Milvus.

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    Используйте OpenAI ChatGPT для генерации ответа на основе подсказок.

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-3.5-turbo",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Milvus stores data in persistent storage as incremental logs, including inserted data (vector data, scalar data, and collection-specific schema) and metadata. Inserted data is stored in various object storage backends like MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage. Metadata generated within Milvus is stored in etcd.
    +
    +

    Быстрое развертывание

    Чтобы узнать, как запустить онлайн-демонстрацию с помощью этого руководства, обратитесь к примеру приложения.

    diff --git a/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.json new file mode 100644 index 000000000..6fb410502 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install tqdm\n$ pip install anthropic\n","$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","from pymilvus.model.dense import VoyageEmbeddingFunction\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus.model.reranker import CohereRerankFunction\n\nfrom typing import List, Dict, Any\nfrom typing import Callable\nfrom pymilvus import (\n MilvusClient,\n DataType,\n AnnSearchRequest,\n RRFRanker,\n)\nfrom tqdm import tqdm\nimport json\nimport anthropic\n\n\nclass MilvusContextualRetriever:\n def __init__(\n self,\n uri=\"milvus.db\",\n collection_name=\"contexual_bgem3\",\n dense_embedding_function=None,\n use_sparse=False,\n sparse_embedding_function=None,\n use_contextualize_embedding=False,\n anthropic_client=None,\n use_reranker=False,\n rerank_function=None,\n ):\n self.collection_name = collection_name\n\n # For Milvus-lite, uri is a local path like \"./milvus.db\"\n # For Milvus standalone service, uri is like \"http://localhost:19530\"\n # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.\n self.client = MilvusClient(uri)\n\n self.embedding_function = dense_embedding_function\n\n self.use_sparse = use_sparse\n self.sparse_embedding_function = None\n\n self.use_contextualize_embedding = use_contextualize_embedding\n self.anthropic_client = anthropic_client\n\n self.use_reranker = use_reranker\n self.rerank_function = rerank_function\n\n if use_sparse is True and sparse_embedding_function:\n self.sparse_embedding_function = sparse_embedding_function\n elif sparse_embedding_function is False:\n raise ValueError(\n \"Sparse embedding function cannot be None if use_sparse is False\"\n )\n else:\n pass\n\n def build_collection(self):\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"dense_vector\",\n datatype=DataType.FLOAT_VECTOR,\n dim=self.embedding_function.dim,\n )\n if self.use_sparse is True:\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n if self.use_sparse is True:\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"IP\",\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n enable_dynamic_field=True,\n )\n\n def insert_data(self, chunk, metadata):\n dense_vec = self.embedding_function([chunk])[0]\n if self.use_sparse is True:\n sparse_result = self.sparse_embedding_function.encode_documents([chunk])\n if type(sparse_result) == dict:\n sparse_vec = sparse_result[\"sparse\"][[0]]\n else:\n sparse_vec = sparse_result[[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def insert_contextualized_data(self, doc, chunk, metadata):\n contextualized_text, usage = self.situate_context(doc, chunk)\n metadata[\"context\"] = contextualized_text\n text_to_embed = f\"{chunk}\\n\\n{contextualized_text}\"\n dense_vec = self.embedding_function([text_to_embed])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_documents(\n [text_to_embed]\n )[\"sparse\"][[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def situate_context(self, doc: str, chunk: str):\n DOCUMENT_CONTEXT_PROMPT = \"\"\"\n \n {doc_content}\n \n \"\"\"\n\n CHUNK_CONTEXT_PROMPT = \"\"\"\n Here is the chunk we want to situate within the whole document\n \n {chunk_content}\n \n\n Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.\n Answer only with the succinct context and nothing else.\n \"\"\"\n\n response = self.anthropic_client.beta.prompt_caching.messages.create(\n model=\"claude-3-haiku-20240307\",\n max_tokens=1000,\n temperature=0.0,\n messages=[\n {\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),\n \"cache_control\": {\n \"type\": \"ephemeral\"\n }, # we will make use of prompt caching for the full documents\n },\n {\n \"type\": \"text\",\n \"text\": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),\n },\n ],\n },\n ],\n extra_headers={\"anthropic-beta\": \"prompt-caching-2024-07-31\"},\n )\n return response.content[0].text, response.usage\n\n def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:\n dense_vec = self.embedding_function([query])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_queries([query])[\n \"sparse\"\n ][[0]]\n\n req_list = []\n if self.use_reranker:\n k = k * 10\n if self.use_sparse is True:\n req_list = []\n dense_search_param = {\n \"data\": [dense_vec],\n \"anns_field\": \"dense_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n dense_req = AnnSearchRequest(**dense_search_param)\n req_list.append(dense_req)\n\n sparse_search_param = {\n \"data\": [sparse_vec],\n \"anns_field\": \"sparse_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n sparse_req = AnnSearchRequest(**sparse_search_param)\n\n req_list.append(sparse_req)\n\n docs = self.client.hybrid_search(\n self.collection_name,\n req_list,\n RRFRanker(),\n k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n else:\n docs = self.client.search(\n self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n if self.use_reranker and self.use_contextualize_embedding:\n reranked_texts = []\n reranked_docs = []\n for i in range(k):\n if self.use_contextualize_embedding:\n reranked_texts.append(\n f\"{docs[0][i]['entity']['content']}\\n\\n{docs[0][i]['entity']['context']}\"\n )\n else:\n reranked_texts.append(f\"{docs[0][i]['entity']['content']}\")\n results = self.rerank_function(query, reranked_texts)\n for result in results:\n reranked_docs.append(docs[0][result.index])\n docs[0] = reranked_docs\n return docs\n\n\ndef evaluate_retrieval(\n queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20\n) -> Dict[str, float]:\n total_score = 0\n total_queries = len(queries)\n for query_item in tqdm(queries, desc=\"Evaluating retrieval\"):\n query = query_item[\"query\"]\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n # Find all golden chunk contents\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (\n doc\n for doc in query_item[\"golden_documents\"]\n if doc[\"uuid\"] == doc_uuid\n ),\n None,\n )\n if not golden_doc:\n print(f\"Warning: Golden document not found for UUID {doc_uuid}\")\n continue\n\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if not golden_chunk:\n print(\n f\"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}\"\n )\n continue\n\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n if not golden_contents:\n print(f\"Warning: No golden contents found for query: {query}\")\n continue\n\n retrieved_docs = retrieval_function(query, db, k=k)\n\n # Count how many golden chunks are in the top k retrieved documents\n chunks_found = 0\n for golden_content in golden_contents:\n for doc in retrieved_docs[0][:k]:\n retrieved_content = doc[\"entity\"][\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n total_score += query_score\n\n average_score = total_score / total_queries\n pass_at_n = average_score * 100\n return {\n \"pass_at_n\": pass_at_n,\n \"average_score\": average_score,\n \"total_queries\": total_queries,\n }\n\n\ndef retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:\n return db.search(query, k=k)\n\n\ndef load_jsonl(file_path: str) -> List[Dict[str, Any]]:\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndef evaluate_db(db, original_jsonl_path: str, k):\n # Load the original JSONL data for queries and ground truth\n original_data = load_jsonl(original_jsonl_path)\n\n # Evaluate retrieval\n results = evaluate_retrieval(original_data, retrieve_base, db, k)\n print(f\"Pass@{k}: {results['pass_at_n']:.2f}%\")\n print(f\"Total Score: {results['average_score']}\")\n print(f\"Total queries: {results['total_queries']}\")\n","dense_ef = VoyageEmbeddingFunction(api_key=\"your-voyage-api-key\", model_name=\"voyage-2\")\nsparse_ef = BGEM3EmbeddingFunction()\ncohere_rf = CohereRerankFunction(api_key=\"your-cohere-api-key\")\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n","standard_retriever = MilvusContextualRetriever(\n uri=\"standard.db\", collection_name=\"standard\", dense_embedding_function=dense_ef\n)\n\nstandard_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(standard_retriever, \"evaluation_set.jsonl\", 5)\n","hybrid_retriever = MilvusContextualRetriever(\n uri=\"hybrid.db\",\n collection_name=\"hybrid\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n)\n\nhybrid_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n hybrid_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(hybrid_retriever, \"evaluation_set.jsonl\", 5)\n","anthropic_client = anthropic.Anthropic(\n api_key=\"your-anthropic-api-key\",\n)\n","contextual_retriever = MilvusContextualRetriever(\n uri=\"contextual.db\",\n collection_name=\"contextual\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n use_contextualize_embedding=True,\n anthropic_client=anthropic_client,\n)\n\ncontextual_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n contextual_retriever.insert_contextualized_data(\n doc_content, chunk_content, metadata\n )\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n","contextual_retriever.use_reranker = True\ncontextual_retriever.rerank_function = cohere_rf\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n"],"headingContent":"Contextual Retrieval with Milvus","anchorList":[{"label":"Контекстный поиск с помощью Milvus","href":"Contextual-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных","href":"Download-Data","type":2,"isActive":false},{"label":"Определение ретривера","href":"Define-Retriever","type":2,"isActive":false},{"label":"Эксперимент I: Стандартный поиск","href":"Experiment-I-Standard-Retrieval","type":2,"isActive":false},{"label":"Эксперимент II: гибридный поиск","href":"Experiment-II-Hybrid-Retrieval","type":2,"isActive":false},{"label":"Эксперимент III: Контекстный поиск","href":"Experiment-III-Contextual-Retrieval","type":2,"isActive":false},{"label":"Эксперимент IV: Контекстный поиск с реранкером","href":"Experiment-IV-Contextual-Retrieval-with-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.md new file mode 100644 index 000000000..88fedb87b --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/contextual_retrieval_with_milvus.md @@ -0,0 +1,621 @@ +--- +id: contextual_retrieval_with_milvus.md +summary: >- + Контекстный поиск - это усовершенствованный метод поиска, предложенный + компанией Anthropic для решения проблемы семантической изоляции фрагментов, + которая возникает в современных решениях Retrieval-Augmented Generation (RAG). + В текущей практической парадигме RAG документы делятся на несколько + фрагментов, и для поиска запроса используется векторная база данных, из + которой извлекаются наиболее релевантные фрагменты. Затем LLM отвечает на + запрос, используя эти извлеченные фрагменты. Однако такой процесс разбиения + может привести к потере контекстной информации, что затрудняет определение + релевантности. +title: Контекстный поиск с помощью Milvus +--- +

    Контекстный поиск с помощью Milvus

    Open In Colab +GitHub Repository

    +

    + + image + Контекстный поиск изображений - это передовой метод поиска, предложенный компанией Anthropic для решения проблемы семантической изоляции фрагментов, которая возникает в современных решениях Retrieval-Augmented Generation (RAG). В текущей практической парадигме RAG документы делятся на несколько фрагментов, и для поиска запроса используется векторная база данных, из которой извлекаются наиболее релевантные фрагменты. Затем LLM отвечает на запрос, используя эти извлеченные фрагменты. Однако такой процесс разбивки может привести к потере контекстной информации, что затрудняет определение релевантности.

    +

    Контекстный поиск улучшает традиционные поисковые системы, добавляя контекст к каждому фрагменту документа перед встраиванием или индексированием, повышая точность и уменьшая ошибки поиска. В сочетании с такими методами, как гибридный поиск и реранкинг, он улучшает системы Retrieval-Augmented Generation (RAG), особенно для больших баз знаний. Кроме того, в сочетании с оперативным кэшированием она предлагает экономически эффективное решение, значительно сокращающее время ожидания и эксплуатационные расходы: стоимость контекстуализированных фрагментов составляет примерно 1,02 доллара за миллион маркеров документов. Это делает его масштабируемым и эффективным подходом для работы с большими базами знаний. Решение Anthropic демонстрирует два важных аспекта:

    +
      +
    • Document Enhancement: Переписывание запросов - важнейшая техника в современном информационном поиске, часто использующая вспомогательную информацию, чтобы сделать запрос более информативным. Аналогично, для достижения лучшей производительности в RAG предварительная обработка документов с помощью LLM (например, очистка источника данных, дополнение потерянной информации, обобщение и т. д.) перед индексированием может значительно повысить шансы на получение релевантных документов. Другими словами, этот шаг предварительной обработки помогает приблизить документы к запросам с точки зрения релевантности.
    • +
    • Low-Cost Processing by Caching Long Context: При использовании LLM для обработки документов часто возникает проблема стоимости. KVCache - популярное решение, позволяющее повторно использовать промежуточные результаты для одного и того же предшествующего контекста. В то время как большинство поставщиков хостинговых LLM делают эту функцию прозрачной для пользователя, Anthropic предоставляет пользователям контроль над процессом кэширования. При попадании в кэш большинство вычислений может быть сохранено (это часто случается, когда длинный контекст остается неизменным, но инструкции для каждого запроса меняются). Для получения более подробной информации щелкните здесь.
    • +
    +

    В этом блокноте мы покажем, как выполнять контекстный поиск с помощью Milvus и LLM, сочетая плотно-разреженный гибридный поиск и реранкер для создания все более мощной поисковой системы. Данные и экспериментальная установка основаны на контекстном поиске.

    +

    Подготовка

    Установите зависимости

    $ pip install "pymilvus[model]"
    +$ pip install tqdm
    +$ pip install anthropic
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Для запуска кода вам понадобятся API-ключи от Cohere, Voyage и Anthropic.

    +

    Загрузка данных

    Следующая команда загрузит пример данных, использованных в оригинальной демонстрации Anthropic.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    Определение ретривера

    Этот класс разработан как гибкий, позволяющий выбирать различные режимы извлечения данных в зависимости от ваших потребностей. Указав опции в методе инициализации, вы можете определить, использовать ли контекстный поиск, гибридный поиск (сочетающий плотный и разреженный методы поиска) или реранкер для улучшения результатов.

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus.model.reranker import CohereRerankFunction
    +
    +from typing import List, Dict, Any
    +from typing import Callable
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +from tqdm import tqdm
    +import json
    +import anthropic
    +
    +
    +class MilvusContextualRetriever:
    +    def __init__(
    +        self,
    +        uri="milvus.db",
    +        collection_name="contexual_bgem3",
    +        dense_embedding_function=None,
    +        use_sparse=False,
    +        sparse_embedding_function=None,
    +        use_contextualize_embedding=False,
    +        anthropic_client=None,
    +        use_reranker=False,
    +        rerank_function=None,
    +    ):
    +        self.collection_name = collection_name
    +
    +        # For Milvus-lite, uri is a local path like "./milvus.db"
    +        # For Milvus standalone service, uri is like "http://localhost:19530"
    +        # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.
    +        self.client = MilvusClient(uri)
    +
    +        self.embedding_function = dense_embedding_function
    +
    +        self.use_sparse = use_sparse
    +        self.sparse_embedding_function = None
    +
    +        self.use_contextualize_embedding = use_contextualize_embedding
    +        self.anthropic_client = anthropic_client
    +
    +        self.use_reranker = use_reranker
    +        self.rerank_function = rerank_function
    +
    +        if use_sparse is True and sparse_embedding_function:
    +            self.sparse_embedding_function = sparse_embedding_function
    +        elif sparse_embedding_function is False:
    +            raise ValueError(
    +                "Sparse embedding function cannot be None if use_sparse is False"
    +            )
    +        else:
    +            pass
    +
    +    def build_collection(self):
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_field=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="dense_vector",
    +            datatype=DataType.FLOAT_VECTOR,
    +            dim=self.embedding_function.dim,
    +        )
    +        if self.use_sparse is True:
    +            schema.add_field(
    +                field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +            )
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +        if self.use_sparse is True:
    +            index_params.add_index(
    +                field_name="sparse_vector",
    +                index_type="SPARSE_INVERTED_INDEX",
    +                metric_type="IP",
    +            )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +            enable_dynamic_field=True,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        dense_vec = self.embedding_function([chunk])[0]
    +        if self.use_sparse is True:
    +            sparse_result = self.sparse_embedding_function.encode_documents([chunk])
    +            if type(sparse_result) == dict:
    +                sparse_vec = sparse_result["sparse"][[0]]
    +            else:
    +                sparse_vec = sparse_result[[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def insert_contextualized_data(self, doc, chunk, metadata):
    +        contextualized_text, usage = self.situate_context(doc, chunk)
    +        metadata["context"] = contextualized_text
    +        text_to_embed = f"{chunk}\n\n{contextualized_text}"
    +        dense_vec = self.embedding_function([text_to_embed])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_documents(
    +                [text_to_embed]
    +            )["sparse"][[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def situate_context(self, doc: str, chunk: str):
    +        DOCUMENT_CONTEXT_PROMPT = """
    +        <document>
    +        {doc_content}
    +        </document>
    +        """
    +
    +        CHUNK_CONTEXT_PROMPT = """
    +        Here is the chunk we want to situate within the whole document
    +        <chunk>
    +        {chunk_content}
    +        </chunk>
    +
    +        Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.
    +        Answer only with the succinct context and nothing else.
    +        """
    +
    +        response = self.anthropic_client.beta.prompt_caching.messages.create(
    +            model="claude-3-haiku-20240307",
    +            max_tokens=1000,
    +            temperature=0.0,
    +            messages=[
    +                {
    +                    "role": "user",
    +                    "content": [
    +                        {
    +                            "type": "text",
    +                            "text": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),
    +                            "cache_control": {
    +                                "type": "ephemeral"
    +                            },  # we will make use of prompt caching for the full documents
    +                        },
    +                        {
    +                            "type": "text",
    +                            "text": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),
    +                        },
    +                    ],
    +                },
    +            ],
    +            extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"},
    +        )
    +        return response.content[0].text, response.usage
    +
    +    def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:
    +        dense_vec = self.embedding_function([query])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_queries([query])[
    +                "sparse"
    +            ][[0]]
    +
    +        req_list = []
    +        if self.use_reranker:
    +            k = k * 10
    +        if self.use_sparse is True:
    +            req_list = []
    +            dense_search_param = {
    +                "data": [dense_vec],
    +                "anns_field": "dense_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            dense_req = AnnSearchRequest(**dense_search_param)
    +            req_list.append(dense_req)
    +
    +            sparse_search_param = {
    +                "data": [sparse_vec],
    +                "anns_field": "sparse_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            sparse_req = AnnSearchRequest(**sparse_search_param)
    +
    +            req_list.append(sparse_req)
    +
    +            docs = self.client.hybrid_search(
    +                self.collection_name,
    +                req_list,
    +                RRFRanker(),
    +                k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        else:
    +            docs = self.client.search(
    +                self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        if self.use_reranker and self.use_contextualize_embedding:
    +            reranked_texts = []
    +            reranked_docs = []
    +            for i in range(k):
    +                if self.use_contextualize_embedding:
    +                    reranked_texts.append(
    +                        f"{docs[0][i]['entity']['content']}\n\n{docs[0][i]['entity']['context']}"
    +                    )
    +                else:
    +                    reranked_texts.append(f"{docs[0][i]['entity']['content']}")
    +            results = self.rerank_function(query, reranked_texts)
    +            for result in results:
    +                reranked_docs.append(docs[0][result.index])
    +            docs[0] = reranked_docs
    +        return docs
    +
    +
    +def evaluate_retrieval(
    +    queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20
    +) -> Dict[str, float]:
    +    total_score = 0
    +    total_queries = len(queries)
    +    for query_item in tqdm(queries, desc="Evaluating retrieval"):
    +        query = query_item["query"]
    +        golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +        # Find all golden chunk contents
    +        golden_contents = []
    +        for doc_uuid, chunk_index in golden_chunk_uuids:
    +            golden_doc = next(
    +                (
    +                    doc
    +                    for doc in query_item["golden_documents"]
    +                    if doc["uuid"] == doc_uuid
    +                ),
    +                None,
    +            )
    +            if not golden_doc:
    +                print(f"Warning: Golden document not found for UUID {doc_uuid}")
    +                continue
    +
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if not golden_chunk:
    +                print(
    +                    f"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}"
    +                )
    +                continue
    +
    +            golden_contents.append(golden_chunk["content"].strip())
    +
    +        if not golden_contents:
    +            print(f"Warning: No golden contents found for query: {query}")
    +            continue
    +
    +        retrieved_docs = retrieval_function(query, db, k=k)
    +
    +        # Count how many golden chunks are in the top k retrieved documents
    +        chunks_found = 0
    +        for golden_content in golden_contents:
    +            for doc in retrieved_docs[0][:k]:
    +                retrieved_content = doc["entity"]["content"].strip()
    +                if retrieved_content == golden_content:
    +                    chunks_found += 1
    +                    break
    +
    +        query_score = chunks_found / len(golden_contents)
    +        total_score += query_score
    +
    +    average_score = total_score / total_queries
    +    pass_at_n = average_score * 100
    +    return {
    +        "pass_at_n": pass_at_n,
    +        "average_score": average_score,
    +        "total_queries": total_queries,
    +    }
    +
    +
    +def retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:
    +    return db.search(query, k=k)
    +
    +
    +def load_jsonl(file_path: str) -> List[Dict[str, Any]]:
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +def evaluate_db(db, original_jsonl_path: str, k):
    +    # Load the original JSONL data for queries and ground truth
    +    original_data = load_jsonl(original_jsonl_path)
    +
    +    # Evaluate retrieval
    +    results = evaluate_retrieval(original_data, retrieve_base, db, k)
    +    print(f"Pass@{k}: {results['pass_at_n']:.2f}%")
    +    print(f"Total Score: {results['average_score']}")
    +    print(f"Total queries: {results['total_queries']}")
    +
    +

    Теперь вам нужно инициализировать эти модели для следующих экспериментов. Вы можете легко переключиться на другие модели, используя библиотеку моделей PyMilvus.

    +
    dense_ef = VoyageEmbeddingFunction(api_key="your-voyage-api-key", model_name="voyage-2")
    +sparse_ef = BGEM3EmbeddingFunction()
    +cohere_rf = CohereRerankFunction(api_key="your-cohere-api-key")
    +
    +
    Fetching 30 files:   0%|          | 0/30 [00:00<?, ?it/s]
    +
    +
    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +

    Эксперимент I: Стандартный поиск

    Стандартный поиск использует только плотные вкрапления для извлечения связанных документов. В этом эксперименте мы будем использовать Pass@5 для воспроизведения результатов из оригинального репозитория.

    +
    standard_retriever = MilvusContextualRetriever(
    +    uri="standard.db", collection_name="standard", dense_embedding_function=dense_ef
    +)
    +
    +standard_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(standard_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [01:29<00:00,  2.77it/s]
    +
    +Pass@5: 80.92%
    +Total Score: 0.8091877880184332
    +Total queries: 248
    +
    +

    Эксперимент II: гибридный поиск

    Теперь, когда мы получили многообещающие результаты с вкраплениями Voyage, мы перейдем к гибридному поиску с помощью модели BGE-M3, которая генерирует мощные разреженные вкрапления. Результаты плотного и разреженного поиска будут объединены с помощью метода Reciprocal Rank Fusion (RRF) для получения гибридного результата.

    +
    hybrid_retriever = MilvusContextualRetriever(
    +    uri="hybrid.db",
    +    collection_name="hybrid",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +)
    +
    +hybrid_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        hybrid_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(hybrid_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:09<00:00,  1.92it/s]
    +
    +Pass@5: 84.69%
    +Total Score: 0.8469182027649771
    +Total queries: 248
    +
    +

    Эксперимент III: Контекстный поиск

    Гибридный поиск демонстрирует улучшение, но результаты могут быть еще больше улучшены за счет применения метода контекстного поиска. Для этого мы будем использовать языковую модель Anthropic, чтобы добавить контекст из всего документа для каждого фрагмента.

    +
    anthropic_client = anthropic.Anthropic(
    +    api_key="your-anthropic-api-key",
    +)
    +
    +
    contextual_retriever = MilvusContextualRetriever(
    +    uri="contextual.db",
    +    collection_name="contextual",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +    use_contextualize_embedding=True,
    +    anthropic_client=anthropic_client,
    +)
    +
    +contextual_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        contextual_retriever.insert_contextualized_data(
    +            doc_content, chunk_content, metadata
    +        )
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
     Evaluating retrieval: 100%|██████████| 248/248 [01:55<00:00,  2.15it/s]
    +Pass@5: 87.14%
    +Total Score: 0.8713517665130568
    +Total queries: 248 
    +
    +

    Эксперимент IV: Контекстный поиск с реранкером

    Результаты можно улучшить, добавив ретранслятор Cohere. Не инициализируя отдельно новый ретривер с реранкером, мы можем просто настроить существующий ретривер на использование реранкера для повышения производительности.

    +
    contextual_retriever.use_reranker = True
    +contextual_retriever.rerank_function = cohere_rf
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:02<00:00,  2.00it/s]
    +Pass@5: 90.91%
    +Total Score: 0.9090821812596005
    +Total queries: 248
    +
    +

    Мы продемонстрировали несколько методов повышения производительности поиска. При более специальном проектировании в соответствии со сценарием контекстный поиск демонстрирует значительный потенциал для предварительной обработки документов при низких затратах, что приводит к улучшению системы RAG.

    diff --git a/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.json b/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.json new file mode 100644 index 000000000..8137a33ab --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"DNA Sequence Classification","anchorList":[{"label":"Классификация последовательностей ДНК","href":"DNA-Sequence-Classification","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.md b/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.md new file mode 100644 index 000000000..aacfe8f9b --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/dna_sequence_classification.md @@ -0,0 +1,36 @@ +--- +id: dna_sequence_classification.md +summary: Постройте систему классификации последовательностей ДНК с помощью Milvus. +title: Классификация последовательностей ДНК +--- +

    Классификация последовательностей ДНК

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для построения модели классификации последовательностей ДНК.

    +

    Используется модель ML и стороннее программное обеспечение, в том числе:

    +
      +
    • CountVectorizer
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    Последовательность ДНК - популярное понятие в прослеживаемости генов, идентификации видов, диагностике заболеваний и многих других областях. В то время как все отрасли изголодались по более интеллектуальным и эффективным методам исследования, искусственный интеллект привлекает большое внимание, особенно в биологической и медицинской сферах. Все больше ученых и исследователей вносят свой вклад в машинное обучение и глубокое обучение в области биоинформатики. Чтобы сделать экспериментальные результаты более убедительными, одним из распространенных вариантов является увеличение размера выборки. Сотрудничество с большими данными в геномике открывает новые возможности для их применения в реальности. Однако традиционное выравнивание последовательностей имеет свои ограничения, что делает его непригодным для больших наборов данных. Для того чтобы сделать меньший компромисс в реальности, векторизация является хорошим выбором для больших наборов данных последовательностей ДНК.

    +


    +

    В этом уроке вы узнаете, как построить модель классификации последовательностей ДНК. В этом руководстве используется CountVectorizer для извлечения признаков последовательностей ДНК и преобразования их в векторы. Затем эти векторы хранятся в Milvus, а соответствующие им классы ДНК - в MySQL. Пользователи могут проводить поиск сходства векторов в Milvus и вызывать соответствующую классификацию ДНК из MySQL.

    +


    +

    + + dna + ДНК

    diff --git a/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.json new file mode 100644 index 000000000..466897412 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","pip install \"pymilvus[model]\" -U \n","import json\n\nfrom pymilvus import (\n MilvusClient,\n DataType,\n Function,\n FunctionType,\n AnnSearchRequest,\n RRFRanker,\n)\n\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\n\nclass HybridRetriever:\n def __init__(self, uri, collection_name=\"hybrid\", dense_embedding_function=None):\n self.uri = uri\n self.collection_name = collection_name\n self.embedding_function = dense_embedding_function\n self.use_reranker = True\n self.use_sparse = True\n self.client = MilvusClient(uri=uri)\n\n def build_collection(self):\n if isinstance(self.embedding_function.dim, dict):\n dense_dim = self.embedding_function.dim[\"dense\"]\n else:\n dense_dim = self.embedding_function.dim\n\n tokenizer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"length\",\n \"max\": 200,\n },\n {\"type\": \"stemmer\", \"language\": \"english\"},\n {\n \"type\": \"stop\",\n \"stop_words\": [\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"for\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"no\",\n \"not\",\n \"of\",\n \"on\",\n \"or\",\n \"such\",\n \"that\",\n \"the\",\n \"their\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"to\",\n \"was\",\n \"will\",\n \"with\",\n ],\n },\n ],\n }\n\n schema = MilvusClient.create_schema()\n schema.add_field(\n field_name=\"pk\",\n datatype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n )\n schema.add_field(\n field_name=\"content\",\n datatype=DataType.VARCHAR,\n max_length=65535,\n analyzer_params=tokenizer_params,\n enable_match=True,\n enable_analyzer=True,\n )\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n schema.add_field(\n field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=dense_dim\n )\n schema.add_field(\n field_name=\"original_uuid\", datatype=DataType.VARCHAR, max_length=128\n )\n schema.add_field(field_name=\"doc_id\", datatype=DataType.VARCHAR, max_length=64)\n schema.add_field(\n field_name=\"chunk_id\", datatype=DataType.VARCHAR, max_length=64\n ),\n schema.add_field(field_name=\"original_index\", datatype=DataType.INT32)\n\n functions = Function(\n name=\"bm25\",\n function_type=FunctionType.BM25,\n input_field_names=[\"content\"],\n output_field_names=\"sparse_vector\",\n )\n\n schema.add_function(functions)\n\n index_params = MilvusClient.prepare_index_params()\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"BM25\",\n )\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n )\n\n def insert_data(self, chunk, metadata):\n embedding = self.embedding_function([chunk])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n self.client.insert(\n self.collection_name, {\"dense_vector\": dense_vec, **metadata}\n )\n\n def search(self, query: str, k: int = 20, mode=\"hybrid\"):\n\n output_fields = [\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n ]\n if mode in [\"dense\", \"hybrid\"]:\n embedding = self.embedding_function([query])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n\n if mode == \"sparse\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[query],\n anns_field=\"sparse_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"dense\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"hybrid\":\n full_text_search_params = {\"metric_type\": \"BM25\"}\n full_text_search_req = AnnSearchRequest(\n [query], \"sparse_vector\", full_text_search_params, limit=k\n )\n\n dense_search_params = {\"metric_type\": \"IP\"}\n dense_req = AnnSearchRequest(\n [dense_vec], \"dense_vector\", dense_search_params, limit=k\n )\n\n results = self.client.hybrid_search(\n self.collection_name,\n [full_text_search_req, dense_req],\n ranker=RRFRanker(),\n limit=k,\n output_fields=output_fields,\n )\n else:\n raise ValueError(\"Invalid mode\")\n return [\n {\n \"doc_id\": doc[\"entity\"][\"doc_id\"],\n \"chunk_id\": doc[\"entity\"][\"chunk_id\"],\n \"content\": doc[\"entity\"][\"content\"],\n \"score\": doc[\"distance\"],\n }\n for doc in results[0]\n ]\n","dense_ef = BGEM3EmbeddingFunction()\nstandard_retriever = HybridRetriever(\n uri=\"http://localhost:19530\",\n collection_name=\"milvus_hybrid\",\n dense_embedding_function=dense_ef,\n)\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n\nis_insert = True\nif is_insert:\n standard_retriever.build_collection()\n for doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","results = standard_retriever.search(\"create a logger?\", mode=\"sparse\", k=3)\nprint(results)\n","def load_jsonl(file_path: str):\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndataset = load_jsonl(\"evaluation_set.jsonl\")\nk = 5\n\n# mode can be \"dense\", \"sparse\" or \"hybrid\".\nmode = \"hybrid\"\n\ntotal_query_score = 0\nnum_queries = 0\n\nfor query_item in dataset:\n\n query = query_item[\"query\"]\n\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n chunks_found = 0\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (doc for doc in query_item[\"golden_documents\"] if doc[\"uuid\"] == doc_uuid),\n None,\n )\n if golden_doc:\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if golden_chunk:\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n results = standard_retriever.search(query, mode=mode, k=5)\n\n for golden_content in golden_contents:\n for doc in results[:k]:\n retrieved_content = doc[\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n\n total_query_score += query_score\n num_queries += 1\n","print(\"Pass@5: \", total_query_score / num_queries)\n"],"headingContent":"Full Text Search with Milvus","anchorList":[{"label":"Полнотекстовый поиск в Milvus","href":"Full-Text-Search-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Оценка","href":"Evaluation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.md new file mode 100644 index 000000000..e2e54e50b --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/full_text_search_with_milvus.md @@ -0,0 +1,372 @@ +--- +id: full_text_search_with_milvus.md +summary: >- + С выходом Milvus 2.5 функция полнотекстового поиска позволяет пользователям + эффективно искать текст по ключевым словам или фразам, обеспечивая мощные + возможности текстового поиска. Эта функция повышает точность поиска и может + быть легко объединена с поиском на основе вкраплений для гибридного поиска, + позволяя получать результаты как по семантическим, так и по ключевым словам в + одном запросе. В этом блокноте мы покажем основные возможности использования + полнотекстового поиска в Milvus. +title: Полнотекстовый поиск в Milvus +--- +

    +Open In Colab + + +GitHub Repository +

    +

    Полнотекстовый поиск в Milvus

    С выходом Milvus 2.5 функция полнотекстового поиска позволяет пользователям эффективно искать текст по ключевым словам или фразам, обеспечивая мощные возможности текстового поиска. Эта функция повышает точность поиска и может быть легко объединена с поиском на основе вкраплений для гибридного поиска, позволяя получать результаты как по семантическим, так и по ключевым словам в одном запросе. В этом блокноте мы покажем основные возможности использования полнотекстового поиска в Milvus.

    +

    Подготовка

    Загрузите набор данных

    Следующая команда загрузит пример данных, используемых в оригинальной демонстрации Anthropic.

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    Установите Milvus 2.5

    Для получения более подробной информации ознакомьтесь с официальным руководством по установке.

    +

    Установите PyMilvus

    Выполните следующую команду для установки PyMilvus:

    +
    pip install "pymilvus[model]" -U 
    +
    +

    Определите ретривер

    import json
    +
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    Function,
    +    FunctionType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +
    +class HybridRetriever:
    +    def __init__(self, uri, collection_name="hybrid", dense_embedding_function=None):
    +        self.uri = uri
    +        self.collection_name = collection_name
    +        self.embedding_function = dense_embedding_function
    +        self.use_reranker = True
    +        self.use_sparse = True
    +        self.client = MilvusClient(uri=uri)
    +
    +    def build_collection(self):
    +        if isinstance(self.embedding_function.dim, dict):
    +            dense_dim = self.embedding_function.dim["dense"]
    +        else:
    +            dense_dim = self.embedding_function.dim
    +
    +        tokenizer_params = {
    +            "tokenizer": "standard",
    +            "filter": [
    +                "lowercase",
    +                {
    +                    "type": "length",
    +                    "max": 200,
    +                },
    +                {"type": "stemmer", "language": "english"},
    +                {
    +                    "type": "stop",
    +                    "stop_words": [
    +                        "a",
    +                        "an",
    +                        "and",
    +                        "are",
    +                        "as",
    +                        "at",
    +                        "be",
    +                        "but",
    +                        "by",
    +                        "for",
    +                        "if",
    +                        "in",
    +                        "into",
    +                        "is",
    +                        "it",
    +                        "no",
    +                        "not",
    +                        "of",
    +                        "on",
    +                        "or",
    +                        "such",
    +                        "that",
    +                        "the",
    +                        "their",
    +                        "then",
    +                        "there",
    +                        "these",
    +                        "they",
    +                        "this",
    +                        "to",
    +                        "was",
    +                        "will",
    +                        "with",
    +                    ],
    +                },
    +            ],
    +        }
    +
    +        schema = MilvusClient.create_schema()
    +        schema.add_field(
    +            field_name="pk",
    +            datatype=DataType.VARCHAR,
    +            is_primary=True,
    +            auto_id=True,
    +            max_length=100,
    +        )
    +        schema.add_field(
    +            field_name="content",
    +            datatype=DataType.VARCHAR,
    +            max_length=65535,
    +            analyzer_params=tokenizer_params,
    +            enable_match=True,
    +            enable_analyzer=True,
    +        )
    +        schema.add_field(
    +            field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +        )
    +        schema.add_field(
    +            field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=dense_dim
    +        )
    +        schema.add_field(
    +            field_name="original_uuid", datatype=DataType.VARCHAR, max_length=128
    +        )
    +        schema.add_field(field_name="doc_id", datatype=DataType.VARCHAR, max_length=64)
    +        schema.add_field(
    +            field_name="chunk_id", datatype=DataType.VARCHAR, max_length=64
    +        ),
    +        schema.add_field(field_name="original_index", datatype=DataType.INT32)
    +
    +        functions = Function(
    +            name="bm25",
    +            function_type=FunctionType.BM25,
    +            input_field_names=["content"],
    +            output_field_names="sparse_vector",
    +        )
    +
    +        schema.add_function(functions)
    +
    +        index_params = MilvusClient.prepare_index_params()
    +        index_params.add_index(
    +            field_name="sparse_vector",
    +            index_type="SPARSE_INVERTED_INDEX",
    +            metric_type="BM25",
    +        )
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        embedding = self.embedding_function([chunk])
    +        if isinstance(embedding, dict) and "dense" in embedding:
    +            dense_vec = embedding["dense"][0]
    +        else:
    +            dense_vec = embedding[0]
    +        self.client.insert(
    +            self.collection_name, {"dense_vector": dense_vec, **metadata}
    +        )
    +
    +    def search(self, query: str, k: int = 20, mode="hybrid"):
    +
    +        output_fields = [
    +            "content",
    +            "original_uuid",
    +            "doc_id",
    +            "chunk_id",
    +            "original_index",
    +        ]
    +        if mode in ["dense", "hybrid"]:
    +            embedding = self.embedding_function([query])
    +            if isinstance(embedding, dict) and "dense" in embedding:
    +                dense_vec = embedding["dense"][0]
    +            else:
    +                dense_vec = embedding[0]
    +
    +        if mode == "sparse":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[query],
    +                anns_field="sparse_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "dense":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "hybrid":
    +            full_text_search_params = {"metric_type": "BM25"}
    +            full_text_search_req = AnnSearchRequest(
    +                [query], "sparse_vector", full_text_search_params, limit=k
    +            )
    +
    +            dense_search_params = {"metric_type": "IP"}
    +            dense_req = AnnSearchRequest(
    +                [dense_vec], "dense_vector", dense_search_params, limit=k
    +            )
    +
    +            results = self.client.hybrid_search(
    +                self.collection_name,
    +                [full_text_search_req, dense_req],
    +                ranker=RRFRanker(),
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        else:
    +            raise ValueError("Invalid mode")
    +        return [
    +            {
    +                "doc_id": doc["entity"]["doc_id"],
    +                "chunk_id": doc["entity"]["chunk_id"],
    +                "content": doc["entity"]["content"],
    +                "score": doc["distance"],
    +            }
    +            for doc in results[0]
    +        ]
    +
    +
    dense_ef = BGEM3EmbeddingFunction()
    +standard_retriever = HybridRetriever(
    +    uri="http://localhost:19530",
    +    collection_name="milvus_hybrid",
    +    dense_embedding_function=dense_ef,
    +)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 108848.72it/s]
    +
    +

    Вставьте данные

    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +is_insert = True
    +if is_insert:
    +    standard_retriever.build_collection()
    +    for doc in dataset:
    +        doc_content = doc["content"]
    +        for chunk in doc["chunks"]:
    +            metadata = {
    +                "doc_id": doc["doc_id"],
    +                "original_uuid": doc["original_uuid"],
    +                "chunk_id": chunk["chunk_id"],
    +                "original_index": chunk["original_index"],
    +                "content": chunk["content"],
    +            }
    +            chunk_content = chunk["content"]
    +            standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    results = standard_retriever.search("create a logger?", mode="sparse", k=3)
    +print(results)
    +
    +
    [{'doc_id': 'doc_10', 'chunk_id': 'doc_10_chunk_0', 'content': 'use {\n    crate::args::LogArgs,\n    anyhow::{anyhow, Result},\n    simplelog::{Config, LevelFilter, WriteLogger},\n    std::fs::File,\n};\n\npub struct Logger;\n\nimpl Logger {\n    pub fn init(args: &impl LogArgs) -> Result<()> {\n        let filter: LevelFilter = args.log_level().into();\n        if filter != LevelFilter::Off {\n            let logfile = File::create(args.log_file())\n                .map_err(|e| anyhow!("Failed to open log file: {e:}"))?;\n            WriteLogger::init(filter, Config::default(), logfile)\n                .map_err(|e| anyhow!("Failed to initalize logger: {e:}"))?;\n        }\n        Ok(())\n    }\n}\n', 'score': 9.12518310546875}, {'doc_id': 'doc_87', 'chunk_id': 'doc_87_chunk_3', 'content': '\t\tLoggerPtr INF = Logger::getLogger(LOG4CXX_TEST_STR("INF"));\n\t\tINF->setLevel(Level::getInfo());\n\n\t\tLoggerPtr INF_ERR = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR"));\n\t\tINF_ERR->setLevel(Level::getError());\n\n\t\tLoggerPtr DEB = Logger::getLogger(LOG4CXX_TEST_STR("DEB"));\n\t\tDEB->setLevel(Level::getDebug());\n\n\t\t// Note: categories with undefined level\n\t\tLoggerPtr INF_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.UNDEF"));\n\t\tLoggerPtr INF_ERR_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR.UNDEF"));\n\t\tLoggerPtr UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("UNDEF"));\n\n', 'score': 7.0077056884765625}, {'doc_id': 'doc_89', 'chunk_id': 'doc_89_chunk_3', 'content': 'using namespace log4cxx;\nusing namespace log4cxx::helpers;\n\nLOGUNIT_CLASS(FMTTestCase)\n{\n\tLOGUNIT_TEST_SUITE(FMTTestCase);\n\tLOGUNIT_TEST(test1);\n\tLOGUNIT_TEST(test1_expanded);\n\tLOGUNIT_TEST(test10);\n//\tLOGUNIT_TEST(test_date);\n\tLOGUNIT_TEST_SUITE_END();\n\n\tLoggerPtr root;\n\tLoggerPtr logger;\n\npublic:\n\tvoid setUp()\n\t{\n\t\troot = Logger::getRootLogger();\n\t\tMDC::clear();\n\t\tlogger = Logger::getLogger(LOG4CXX_TEST_STR("java.org.apache.log4j.PatternLayoutTest"));\n\t}\n\n', 'score': 6.750633716583252}]
    +
    +

    Оценка

    Теперь, когда мы вставили набор данных в Milvus, мы можем использовать плотный, разреженный или гибридный поиск для получения 5 лучших результатов. Вы можете изменить mode и оценить каждый из них. Мы представляем метрику Pass@5, которая включает в себя получение 5 лучших результатов для каждого запроса и вычисление Recall.

    +
    def load_jsonl(file_path: str):
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +dataset = load_jsonl("evaluation_set.jsonl")
    +k = 5
    +
    +# mode can be "dense", "sparse" or "hybrid".
    +mode = "hybrid"
    +
    +total_query_score = 0
    +num_queries = 0
    +
    +for query_item in dataset:
    +
    +    query = query_item["query"]
    +
    +    golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +    chunks_found = 0
    +    golden_contents = []
    +    for doc_uuid, chunk_index in golden_chunk_uuids:
    +        golden_doc = next(
    +            (doc for doc in query_item["golden_documents"] if doc["uuid"] == doc_uuid),
    +            None,
    +        )
    +        if golden_doc:
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if golden_chunk:
    +                golden_contents.append(golden_chunk["content"].strip())
    +
    +    results = standard_retriever.search(query, mode=mode, k=5)
    +
    +    for golden_content in golden_contents:
    +        for doc in results[:k]:
    +            retrieved_content = doc["content"].strip()
    +            if retrieved_content == golden_content:
    +                chunks_found += 1
    +                break
    +
    +    query_score = chunks_found / len(golden_contents)
    +
    +    total_query_score += query_score
    +    num_queries += 1
    +
    +
    print("Pass@5: ", total_query_score / num_queries)
    +
    +
    Pass@5:  0.7911386328725037
    +
    diff --git a/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.json b/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.json new file mode 100644 index 000000000..076fafa96 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.json @@ -0,0 +1 @@ +{"codeList":["import functools\n\nfrom datasets import load_dataset\nimport numpy as np\nimport pandas as pd\nimport pymilvus\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nimport torch\nimport torch.nn.functional as F\nfrom tqdm import tqdm\n","model = SentenceTransformer(\n # Remove 'device='mps' if running on non-Mac device\n \"nomic-ai/nomic-embed-text-v1.5\",\n trust_remote_code=True,\n device=\"mps\",\n)\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","embedding_dim = 768\nsearch_dim = 128\ncollection_name = \"movie_embeddings\"\n\nclient = MilvusClient(uri=\"./wiki-movie-plots-matryoshka.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n # First sixth of unnormalized embedding vector\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n # Entire unnormalized embedding vector\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"COSINE\")\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n # This particular model requires us to prefix 'search_document:' to stored entities\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Output of embedding model is unnormalized\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n \"An archaeologist searches for ancient artifacts while fighting Nazis.\",\n \"A teenager fakes illness to get off school and have adventures with two friends.\",\n \"A young couple with a kid look after a hotel during winter and the husband goes insane.\",\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\n# This particular model requires us to prefix 'search_query:' to queries\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries]\nsearch_data = embed_search(instruct_queries)\n\n# Normalize head embeddings\nhead_search = [x[:search_dim] for x in search_data]\n\n# Perform standard vector search on first sixth of embedding dimensions\nres = client.search(\n collection_name=collection_name,\n data=head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits][:5]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:\n \"\"\"\n Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.\n\n \"\"\"\n rows = [x[\"entity\"] for x in hits]\n rows_dict = [\n {\"title\": x[\"title\"], \"embedding\": torch.tensor(x[\"embedding\"])} for x in rows\n ]\n return pd.DataFrame.from_records(rows_dict)\n\n\ndfs = [hits_to_dataframe(hits) for hits in res]\n","# An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)\ndef calculate_score(row, query_emb=None, dims=768):\n emb = F.normalize(row[\"embedding\"][:dims], dim=-1)\n return (emb @ query_emb).item()\n\n\n# You could also add a top-K parameter as a termination condition\ndef funnel_search(\n df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5\n) -> pd.DataFrame:\n # Loop over increasing prefixes of the embeddings\n for dims in scales:\n # Query vector must be normalized for each new dimensionality\n emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))\n\n # Score\n scores = df.apply(\n functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1\n )\n df[\"scores\"] = scores\n\n # Re-rank\n df = df.sort_values(by=\"scores\", ascending=False)\n\n # Prune (in our case, remove half of candidates at each step)\n df = df.head(int(prune_ratio * len(df)))\n\n return df\n\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, search_data)\n]\n","for d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:5][\"title\"], \"\\n\")\n","# Search on entire embeddings\nres = client.search(\n collection_name=collection_name,\n data=search_data,\n anns_field=\"embedding\",\n limit=5,\n output_fields=[\"title\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","queries2 = [\n \"A teenager fakes illness to get off school and have adventures with two friends.\"\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries2]\nsearch_data2 = embed_search(instruct_queries)\nhead_search2 = [x[:search_dim] for x in search_data2]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=head_search2,\n anns_field=\"head_embedding\",\n limit=256,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", queries2[0])\n for idx, row in enumerate(rows):\n if row[\"title\"].strip() == \"Ferris Bueller's Day Off\":\n print(f\"Row {idx}: Ferris Bueller's Day Off\")\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries2, dfs, search_data2)\n]\n\nfor d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:7][\"title\"].to_string(index=False), \"\\n\")\n","client = MilvusClient(uri=\"./wikiplots-matryoshka-flipped.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n\nindex_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Encode and flip embeddings\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n embeddings = torch.flip(embeddings, dims=[-1])\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","# Normalize head embeddings\n\nflip_search_data = [\n torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data\n]\nflip_head_search = [x[:search_dim] for x in flip_search_data]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=flip_head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, flip_search_data)\n]\n\nfor d in dfs_results:\n print(\n d[\"query\"],\n \"\\n\",\n d[\"results\"][:7][\"title\"].to_string(index=False, header=False),\n \"\\n\",\n )\n"],"headingContent":"Funnel Search with Matryoshka Embeddings","anchorList":[{"label":"Поиск по воронке с вкраплениями \"Матрешки","href":"Funnel-Search-with-Matryoshka-Embeddings","type":1,"isActive":false},{"label":"Модель встраивания \"Матрешка","href":"Load-Matryoshka-Embedding-Model","type":2,"isActive":false},{"label":"Загрузка массива данных, встраивание элементов и создание базы векторов","href":"Loading-Dataset-Embedding-Items-and-Building-Vector-Database","type":2,"isActive":false},{"label":"Выполнение поиска по воронке","href":"Performing-Funnel-Search","type":2,"isActive":false},{"label":"Сравнение поиска по воронке с обычным поиском","href":"Comparing-Funnel-Search-to-Regular-Search","type":2,"isActive":false},{"label":"Расследование неудачи поиска по воронке в фильме \"Выходной день Ферриса Бьюллера","href":"Investigating-Funnel-Search-Recall-Failure-for-Ferris-Buellers-Day-Off","type":2,"isActive":false},{"label":"Имеет ли значение порядок? Префиксные и суффиксные вкрапления.","href":"Does-the-order-matter-Prefix-vs-suffix-embeddings","type":2,"isActive":false},{"label":"Резюме","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.md b/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.md new file mode 100644 index 000000000..884d7336f --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/funnel_search_with_matryoshka.md @@ -0,0 +1,570 @@ +--- +id: funnel_search_with_matryoshka.md +summary: >- + В этом блокноте мы рассмотрим, как использовать вкрапления Matryoshka с Milvus + для семантического поиска. Мы иллюстрируем алгоритм под названием "поиск по + воронке", который позволяет нам выполнять поиск по сходству по небольшому + подмножеству размерностей вкраплений без резкого снижения запоминания. +title: Поиск по воронке с вкраплениями "Матрешки +--- +

    Поиск по воронке с вкраплениями "Матрешки

    При создании эффективных систем векторного поиска одной из ключевых задач является управление затратами на хранение данных при сохранении приемлемой задержки и запоминания. Современные модели встраивания выдают векторы с сотнями или тысячами измерений, что создает значительные затраты на хранение и вычисления для исходного вектора и индекса.

    +

    Традиционно требования к хранению снижаются путем применения метода квантования или уменьшения размерности непосредственно перед построением индекса. Например, мы можем сэкономить место, снизив точность с помощью Product Quantization (PQ) или количество измерений с помощью Principal Component Analysis (PCA). Эти методы анализируют весь набор векторов, чтобы найти более компактный, сохраняющий семантические связи между векторами.

    +

    Несмотря на свою эффективность, эти стандартные подходы снижают точность или размерность только один раз и в одном масштабе. Но что, если бы мы могли одновременно поддерживать несколько уровней детализации, подобно пирамиде все более точных представлений?

    +

    Появились вкрапления "Матрешки". Названные в честь русской матрешки (см. иллюстрацию), эти умные конструкции встраивают несколько масштабов представления в один вектор. В отличие от традиционных методов постобработки, вкрапления "Матрешки" учатся этой многомасштабной структуре в процессе начального обучения. Результат поразителен: не только полное вложение отражает семантику входных данных, но и каждый вложенный префикс подмножества (первая половина, первая четверть и т. д.) обеспечивает целостное, хотя и менее детальное представление.

    +
    +

    В этом блокноте мы рассмотрим, как использовать вкрапления "Матрешки" с Milvus для семантического поиска. Мы проиллюстрируем алгоритм, называемый "поиском по воронке", который позволяет нам выполнять поиск по сходству в небольшом подмножестве измерений вкраплений без резкого снижения запоминания.

    +
    import functools
    +
    +from datasets import load_dataset
    +import numpy as np
    +import pandas as pd
    +import pymilvus
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +import torch
    +import torch.nn.functional as F
    +from tqdm import tqdm
    +
    +

    Модель встраивания "Матрешка

    Вместо того чтобы использовать стандартную модель встраивания, такую как sentence-transformers/all-MiniLM-L12-v2мы используем модель от Nomic, специально обученную для создания вкраплений "Матрешки".

    +
    model = SentenceTransformer(
    +    # Remove 'device='mps' if running on non-Mac device
    +    "nomic-ai/nomic-embed-text-v1.5",
    +    trust_remote_code=True,
    +    device="mps",
    +)
    +
    +
    <All keys matched successfully>
    +
    +

    Загрузка массива данных, встраивание элементов и создание базы векторов

    Следующий код является модификацией кода со страницы документации "Поиск фильмов с помощью Sentence Transformers и Milvus". Сначала мы загружаем набор данных из HuggingFace. Он содержит около 35 тысяч записей, каждая из которых соответствует фильму, имеющему статью в Википедии. В этом примере мы будем использовать поля Title и PlotSummary.

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +
    Dataset({
    +    features: ['Release Year', 'Title', 'Origin/Ethnicity', 'Director', 'Cast', 'Genre', 'Wiki Page', 'Plot', 'PlotSummary'],
    +    num_rows: 34886
    +})
    +
    +

    Далее мы подключаемся к базе данных Milvus Lite, задаем схему данных и создаем коллекцию с этой схемой. Мы будем хранить ненормализованное вложение и первую шестую часть вложения в отдельных полях. Причина в том, что первая 1/6 часть вкраплений "Матрешки" нужна нам для поиска сходства, а остальные 5/6 частей вкраплений - для ранжирования и улучшения результатов поиска.

    +
    embedding_dim = 768
    +search_dim = 128
    +collection_name = "movie_embeddings"
    +
    +client = MilvusClient(uri="./wiki-movie-plots-matryoshka.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    # First sixth of unnormalized embedding vector
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    # Entire unnormalized embedding vector
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +

    В настоящее время Milvus не поддерживает поиск по подмножествам вкраплений, поэтому мы разбиваем вкрапления на две части: голова представляет собой начальное подмножество вектора для индексации и поиска, а хвост - оставшуюся часть. Модель обучена для поиска сходства по косинусному расстоянию, поэтому мы нормализуем вкрапления головы. Однако, чтобы в дальнейшем вычислять сходство для больших подмножеств, нам нужно хранить норму вкраплений головы, чтобы ненормализовать их перед присоединением к хвосту.

    +

    Чтобы выполнить поиск по первой 1/6 части вкрапления, нам потребуется создать индекс векторного поиска по полю head_embedding. Позже мы сравним результаты "воронкообразного поиска" с обычным векторным поиском, поэтому построим индекс поиска и по полному вкраплению.

    +

    Важно отметить, что мы используем метрику расстояния COSINE, а не IP, поскольку в противном случае нам пришлось бы следить за нормами вкраплений, что усложнило бы реализацию (это станет более понятным после описания алгоритма поиска воронки).

    +
    index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="COSINE")
    +client.create_index(collection_name, index_params)
    +
    +

    Наконец, мы кодируем краткие описания сюжетов для всех 35 тысяч фильмов и вводим соответствующие вкрапления в базу данных.

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    # This particular model requires us to prefix 'search_document:' to stored entities
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Output of embedding model is unnormalized
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:57<00:00,  5.18s/it]
    +
    +

    Теперь давайте осуществим "воронкообразный поиск", используя первую 1/6 часть размеров вкраплений "Матрешки". У меня есть три фильма, которые я хочу найти, и я подготовил собственную сводку сюжетов для запросов к базе данных. Мы встраиваем запросы, затем выполняем векторный поиск по полю head_embedding, получая 128 кандидатов на результат.

    +
    queries = [
    +    "An archaeologist searches for ancient artifacts while fighting Nazis.",
    +    "A teenager fakes illness to get off school and have adventures with two friends.",
    +    "A young couple with a kid look after a hotel during winter and the husband goes insane.",
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +# This particular model requires us to prefix 'search_query:' to queries
    +instruct_queries = ["search_query: " + q.strip() for q in queries]
    +search_data = embed_search(instruct_queries)
    +
    +# Normalize head embeddings
    +head_search = [x[:search_dim] for x in search_data]
    +
    +# Perform standard vector search on first sixth of embedding dimensions
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +

    На этом этапе мы выполнили поиск по гораздо меньшему векторному пространству, и поэтому, скорее всего, снизили задержку и требования к хранению индекса по сравнению с поиском по всему пространству. Давайте рассмотрим 5 лучших совпадений для каждого запроса:

    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits][:5]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +The Passage
    +Counterblast
    +Dominion: Prequel to the Exorcist
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +How to Deal
    +Shorts
    +Blackbird
    +Valentine
    +Unfriended
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +Ghostkeeper
    +Our Vines Have Tender Grapes
    +The Ref
    +Impact
    +The House in Marsh Road
    +
    +

    Как мы видим, в результате усечения вкраплений во время поиска ухудшилась запоминаемость. Воронкообразный поиск исправляет это с помощью хитрого трюка: мы можем использовать оставшиеся размеры вкраплений для ранжирования и обрезки списка кандидатов, чтобы восстановить производительность поиска без дополнительных дорогостоящих векторных поисков.

    +

    Для простоты изложения алгоритма воронкообразного поиска мы преобразуем результаты поиска Milvus для каждого запроса в кадр данных Pandas.

    +
    def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:
    +    """
    +    Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.
    +
    +    """
    +    rows = [x["entity"] for x in hits]
    +    rows_dict = [
    +        {"title": x["title"], "embedding": torch.tensor(x["embedding"])} for x in rows
    +    ]
    +    return pd.DataFrame.from_records(rows_dict)
    +
    +
    +dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +

    Теперь, чтобы выполнить поиск по воронке, мы перебираем все более крупные подмножества вкраплений. На каждой итерации мы ранжируем кандидатов в соответствии с новыми сходствами и отсеиваем некоторую часть кандидатов с наименьшим рейтингом.

    +

    Для наглядности, из предыдущего шага мы получили 128 кандидатов, используя 1/6 размерности вкраплений и запроса. Первым шагом при выполнении воронкообразного поиска является пересчет сходства между запросами и кандидатами с использованием первой 1/3 измерений. Нижние 64 кандидата отсеиваются. Затем мы повторяем этот процесс с первыми 2/3 измерений, а затем со всеми измерениями, последовательно обрезая до 32 и 16 кандидатов.

    +
    # An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)
    +def calculate_score(row, query_emb=None, dims=768):
    +    emb = F.normalize(row["embedding"][:dims], dim=-1)
    +    return (emb @ query_emb).item()
    +
    +
    +# You could also add a top-K parameter as a termination condition
    +def funnel_search(
    +    df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5
    +) -> pd.DataFrame:
    +    # Loop over increasing prefixes of the embeddings
    +    for dims in scales:
    +        # Query vector must be normalized for each new dimensionality
    +        emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))
    +
    +        # Score
    +        scores = df.apply(
    +            functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1
    +        )
    +        df["scores"] = scores
    +
    +        # Re-rank
    +        df = df.sort_values(by="scores", ascending=False)
    +
    +        # Prune (in our case, remove half of candidates at each step)
    +        df = df.head(int(prune_ratio * len(df)))
    +
    +    return df
    +
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, search_data)
    +]
    +
    +
    for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:5]["title"], "\n")
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    + 0           "Pimpernel" Smith
    +1               Black Hunters
    +29    Raiders of the Lost Ark
    +34             The Master Key
    +51            My Gun Is Quick
    +Name: title, dtype: object 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    + 21               How I Live Now
    +32     On the Edge of Innocence
    +77             Bratz: The Movie
    +4                    Unfriended
    +108                  Simon Says
    +Name: title, dtype: object 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    + 9         The Shining
    +0         Ghostkeeper
    +11     Fast and Loose
    +7      Killing Ground
    +12         Home Alone
    +Name: title, dtype: object 
    +
    +

    Нам удалось восстановить запоминание без дополнительного поиска векторов! Качественно, эти результаты кажутся более запоминающимися для "Raiders of the Lost Ark" и "The Shining", чем стандартный векторный поиск в учебнике "Movie Search using Milvus and Sentence Transformers", который использует другую модель встраивания. Однако он не смог найти "Ferris Bueller's Day Off", к которому мы вернемся позже в этом блокноте. (Более подробные количественные эксперименты и бенчмарки см. в статье Matryoshka Representation Learning ).

    +

    Давайте сравним результаты нашего воронкообразного поиска со стандартным векторным поиском на том же наборе данных с той же моделью вкрапления. Мы выполняем поиск по полным вкраплениям.

    +
    # Search on entire embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=search_data,
    +    anns_field="embedding",
    +    limit=5,
    +    output_fields=["title", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +Raiders of the Lost Ark
    +The Master Key
    +My Gun Is Quick
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +A Walk to Remember
    +Ferris Bueller's Day Off
    +How I Live Now
    +On the Edge of Innocence
    +Bratz: The Movie
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining
    +Ghostkeeper
    +Fast and Loose
    +Killing Ground
    +Home Alone
    +
    +

    За исключением результатов по запросу "Подросток симулирует болезнь, чтобы не ходить в школу...", результаты воронкообразного поиска практически идентичны полному поиску, хотя воронкообразный поиск выполнялся в пространстве поиска 128 измерений против 768 измерений для обычного поиска.

    +

    Расследование неудачи поиска по воронке в фильме "Выходной день Ферриса Бьюллера

    Почему воронкообразный поиск не смог найти фильм Ferris Bueller's Day Off? Давайте разберемся, был ли он в первоначальном списке кандидатов или был ошибочно отфильтрован.

    +
    queries2 = [
    +    "A teenager fakes illness to get off school and have adventures with two friends."
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +instruct_queries = ["search_query: " + q.strip() for q in queries2]
    +search_data2 = embed_search(instruct_queries)
    +head_search2 = [x[:search_dim] for x in search_data2]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search2,
    +    anns_field="head_embedding",
    +    limit=256,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", queries2[0])
    +    for idx, row in enumerate(rows):
    +        if row["title"].strip() == "Ferris Bueller's Day Off":
    +            print(f"Row {idx}: Ferris Bueller's Day Off")
    +
    +
    Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Row 228: Ferris Bueller's Day Off
    +
    +

    Мы видим, что проблема заключалась в том, что первоначальный список кандидатов был недостаточно велик, или, скорее, желаемое попадание не было достаточно похоже на запрос на самом высоком уровне детализации. Замена 128 на 256 приводит к успешному поиску. Мы должны выработать правило, по которому количество кандидатов в удерживаемом наборе будет определяться эмпирически, чтобы оценить компромисс между запоминанием и задержкой.

    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries2, dfs, search_data2)
    +]
    +
    +for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:7]["title"].to_string(index=False), "\n")
    +
    +
    A teenager fakes illness to get off school and have adventures with two friends. 
    +       A Walk to Remember
    +Ferris Bueller's Day Off
    +          How I Live Now
    +On the Edge of Innocence
    +        Bratz: The Movie
    +              Unfriended
    +              Simon Says 
    +
    +

    Имеет ли значение порядок? Префиксные и суффиксные вкрапления.

    Модель была обучена хорошо сопоставлять рекурсивно меньшие префиксы вкраплений. Имеет ли значение порядок используемых нами измерений? Например, можем ли мы также взять подмножества вкраплений, которые являются суффиксами? В этом эксперименте мы изменили порядок размерностей в эмбеддингах "Матрешки" и выполнили поиск по воронке.

    +
    client = MilvusClient(uri="./wikiplots-matryoshka-flipped.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +client.create_index(collection_name, index_params)
    +
    +
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +
    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Encode and flip embeddings
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    embeddings = torch.flip(embeddings, dims=[-1])
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:50<00:00,  5.08s/it]
    +
    +
    # Normalize head embeddings
    +
    +flip_search_data = [
    +    torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data
    +]
    +flip_head_search = [x[:search_dim] for x in flip_search_data]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=flip_head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, flip_search_data)
    +]
    +
    +for d in dfs_results:
    +    print(
    +        d["query"],
    +        "\n",
    +        d["results"][:7]["title"].to_string(index=False, header=False),
    +        "\n",
    +    )
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    +       "Pimpernel" Smith
    +          Black Hunters
    +Raiders of the Lost Ark
    +         The Master Key
    +        My Gun Is Quick
    +            The Passage
    +        The Mole People 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    +                       A Walk to Remember
    +                          How I Live Now
    +                              Unfriended
    +Cirque du Freak: The Vampire's Assistant
    +                             Last Summer
    +                                 Contest
    +                                 Day One 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    +         Ghostkeeper
    +     Killing Ground
    +Leopard in the Snow
    +              Stone
    +          Afterglow
    +         Unfaithful
    +     Always a Bride 
    +
    +

    Как и ожидалось, запоминание гораздо хуже, чем поиск по воронке или обычный поиск (модель встраивания была обучена методом контрастного обучения на префиксах измерений встраивания, а не на суффиксах).

    +

    Резюме

    Вот сравнение результатов поиска по разным методам:

    +
    +
    +
    +Мы показали, как использовать вкрапления "Матрешки" вместе с Milvus для выполнения более эффективного алгоритма семантического поиска, названного "поиском по воронке". Мы также изучили важность этапов переранжирования и обрезки алгоритма, а также режим отказа, когда начальный список кандидатов слишком мал. Наконец, мы обсудили, насколько важен порядок размерностей при формировании подсемейств - он должен быть таким же, для которого обучалась модель. Вернее, только потому, что модель была обучена определенным образом, префиксы вкраплений имеют смысл. Теперь вы знаете, как реализовать вкрапления "Матрешки" и воронкообразный поиск, чтобы снизить затраты на хранение данных при семантическом поиске без ущерба для производительности поиска! diff --git a/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.json new file mode 100644 index 000000000..1878682b8 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import numpy as np\n\nfrom collections import defaultdict\nfrom scipy.sparse import csr_matrix\nfrom pymilvus import MilvusClient\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser, JsonOutputParser\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom tqdm import tqdm\n","milvus_client = MilvusClient(uri=\"./milvus.db\")\n\nllm = ChatOpenAI(\n model=\"gpt-4o\",\n temperature=0,\n)\nembedding_model = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n","nano_dataset = [\n {\n \"passage\": \"Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.\",\n \"triplets\": [\n [\"Jakob Bernoulli\", \"made significant contributions to\", \"calculus\"],\n [\n \"Jakob Bernoulli\",\n \"made significant contributions to\",\n \"the theory of probability\",\n ],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli numbers\"],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli theorem\"],\n [\"The Bernoulli theorem\", \"is a precursor to\", \"the law of large numbers\"],\n [\"Jakob Bernoulli\", \"was the older brother of\", \"Johann Bernoulli\"],\n ],\n },\n {\n \"passage\": \"Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.\",\n \"triplets\": [\n [\n \"Johann Bernoulli\",\n \"was a major figure of\",\n \"the development of calculus\",\n ],\n [\"Johann Bernoulli\", \"was\", \"Jakob's younger brother\"],\n [\"Johann Bernoulli\", \"worked on\", \"infinitesimal calculus\"],\n [\"Johann Bernoulli\", \"was instrumental in spreading\", \"Leibniz's ideas\"],\n [\"Johann Bernoulli\", \"contributed to\", \"the calculus of variations\"],\n [\"Johann Bernoulli\", \"was known for\", \"the brachistochrone problem\"],\n ],\n },\n {\n \"passage\": \"Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.\",\n \"triplets\": [\n [\"Daniel Bernoulli\", \"was the son of\", \"Johann Bernoulli\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"fluid dynamics\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"probability\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"statistics\"],\n [\"Daniel Bernoulli\", \"is most famous for\", \"Bernoulli’s principle\"],\n [\n \"Bernoulli’s principle\",\n \"is fundamental to\",\n \"the understanding of aerodynamics\",\n ],\n ],\n },\n {\n \"passage\": \"Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.\",\n \"triplets\": [\n [\n \"Leonhard Euler\",\n \"had a significant relationship with\",\n \"the Bernoulli family\",\n ],\n [\"leonhard Euler\", \"was born in\", \"Basel\"],\n [\"Leonhard Euler\", \"was a student of\", \"Johann Bernoulli\"],\n [\"Johann Bernoulli's influence\", \"was profound on\", \"Euler\"],\n ],\n },\n]\n","entityid_2_relationids = defaultdict(list)\nrelationid_2_passageids = defaultdict(list)\n\nentities = []\nrelations = []\npassages = []\nfor passage_id, dataset_info in enumerate(nano_dataset):\n passage, triplets = dataset_info[\"passage\"], dataset_info[\"triplets\"]\n passages.append(passage)\n for triplet in triplets:\n if triplet[0] not in entities:\n entities.append(triplet[0])\n if triplet[2] not in entities:\n entities.append(triplet[2])\n relation = \" \".join(triplet)\n if relation not in relations:\n relations.append(relation)\n entityid_2_relationids[entities.index(triplet[0])].append(\n len(relations) - 1\n )\n entityid_2_relationids[entities.index(triplet[2])].append(\n len(relations) - 1\n )\n relationid_2_passageids[relations.index(relation)].append(passage_id)\n","embedding_dim = len(embedding_model.embed_query(\"foo\"))\n\n\ndef create_milvus_collection(collection_name: str):\n if milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n consistency_level=\"Strong\",\n )\n\n\nentity_col_name = \"entity_collection\"\nrelation_col_name = \"relation_collection\"\npassage_col_name = \"passage_collection\"\ncreate_milvus_collection(entity_col_name)\ncreate_milvus_collection(relation_col_name)\ncreate_milvus_collection(passage_col_name)\n","def milvus_insert(\n collection_name: str,\n text_list: list[str],\n):\n batch_size = 512\n for row_id in tqdm(range(0, len(text_list), batch_size), desc=\"Inserting\"):\n batch_texts = text_list[row_id : row_id + batch_size]\n batch_embeddings = embedding_model.embed_documents(batch_texts)\n\n batch_ids = [row_id + j for j in range(len(batch_texts))]\n batch_data = [\n {\n \"id\": id_,\n \"text\": text,\n \"vector\": vector,\n }\n for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)\n ]\n milvus_client.insert(\n collection_name=collection_name,\n data=batch_data,\n )\n\n\nmilvus_insert(\n collection_name=relation_col_name,\n text_list=relations,\n)\n\nmilvus_insert(\n collection_name=entity_col_name,\n text_list=entities,\n)\n\nmilvus_insert(\n collection_name=passage_col_name,\n text_list=passages,\n)\n","query = \"What contribution did the son of Euler's teacher make?\"\n\nquery_ner_list = [\"Euler\"]\n# query_ner_list = ner(query) # In practice, replace it with your custom NER approach\n\nquery_ner_embeddings = [\n embedding_model.embed_query(query_ner) for query_ner in query_ner_list\n]\n\ntop_k = 3\n\nentity_search_res = milvus_client.search(\n collection_name=entity_col_name,\n data=query_ner_embeddings,\n limit=top_k,\n output_fields=[\"id\"],\n)\n\nquery_embedding = embedding_model.embed_query(query)\n\nrelation_search_res = milvus_client.search(\n collection_name=relation_col_name,\n data=[query_embedding],\n limit=top_k,\n output_fields=[\"id\"],\n)[0]\n","# Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.\nentity_relation_adj = np.zeros((len(entities), len(relations)))\nfor entity_id, entity in enumerate(entities):\n entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1\n\n# Convert the adjacency matrix to a sparse matrix for efficient computation.\nentity_relation_adj = csr_matrix(entity_relation_adj)\n\n# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.\nentity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T\nrelation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj\n\n# Specify the target degree of the subgraph to be expanded.\n# 1 or 2 is enough for most cases.\ntarget_degree = 1\n\n# Compute the target degree adjacency matrices using matrix multiplication.\nentity_adj_target_degree = entity_adj_1_degree\nfor _ in range(target_degree - 1):\n entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree\nrelation_adj_target_degree = relation_adj_1_degree\nfor _ in range(target_degree - 1):\n relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree\n\nentity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj\n","expanded_relations_from_relation = set()\nexpanded_relations_from_entity = set()\n# You can set the similarity threshold here to guarantee the quality of the retrieved ones.\n# entity_sim_filter_thresh = ...\n# relation_sim_filter_thresh = ...\n\nfiltered_hit_relation_ids = [\n relation_res[\"entity\"][\"id\"]\n for relation_res in relation_search_res\n # if relation_res['distance'] > relation_sim_filter_thresh\n]\nfor hit_relation_id in filtered_hit_relation_ids:\n expanded_relations_from_relation.update(\n relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()\n )\n\nfiltered_hit_entity_ids = [\n one_entity_res[\"entity\"][\"id\"]\n for one_entity_search_res in entity_search_res\n for one_entity_res in one_entity_search_res\n # if one_entity_res['distance'] > entity_sim_filter_thresh\n]\n\nfor filtered_hit_entity_id in filtered_hit_entity_ids:\n expanded_relations_from_entity.update(\n entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()\n )\n\n# Merge the expanded relations from the relation and entity retrieval ways.\nrelation_candidate_ids = list(\n expanded_relations_from_relation | expanded_relations_from_entity\n)\n\nrelation_candidate_texts = [\n relations[relation_id] for relation_id in relation_candidate_ids\n]\n","query_prompt_one_shot_input = \"\"\"I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.\n\nQuestion:\nWhen was the mother of the leader of the Third Crusade born?\n\nRelationship descriptions:\n[1] Eleanor was born in 1122.\n[2] Eleanor married King Louis VII of France.\n[3] Eleanor was the Duchess of Aquitaine.\n[4] Eleanor participated in the Second Crusade.\n[5] Eleanor had eight children.\n[6] Eleanor was married to Henry II of England.\n[7] Eleanor was the mother of Richard the Lionheart.\n[8] Richard the Lionheart was the King of England.\n[9] Henry II was the father of Richard the Lionheart.\n[10] Henry II was the King of England.\n[11] Richard the Lionheart led the Third Crusade.\n\n\"\"\"\nquery_prompt_one_shot_output = \"\"\"{\"thought_process\": \"To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.\", \"useful_relationships\": [\"[11] Richard the Lionheart led the Third Crusade\", \"[7] Eleanor was the mother of Richard the Lionheart\", \"[1] Eleanor was born in 1122\"]}\"\"\"\n\nquery_prompt_template = \"\"\"Question:\n{question}\n\nRelationship descriptions:\n{relation_des_str}\n\n\"\"\"\n\n\ndef rerank_relations(\n query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]\n) -> list[int]:\n relation_des_str = \"\\n\".join(\n map(\n lambda item: f\"[{item[0]}] {item[1]}\",\n zip(relation_candidate_ids, relation_candidate_texts),\n )\n ).strip()\n rerank_prompts = ChatPromptTemplate.from_messages(\n [\n HumanMessage(query_prompt_one_shot_input),\n AIMessage(query_prompt_one_shot_output),\n HumanMessagePromptTemplate.from_template(query_prompt_template),\n ]\n )\n rerank_chain = (\n rerank_prompts\n | llm.bind(response_format={\"type\": \"json_object\"})\n | JsonOutputParser()\n )\n rerank_res = rerank_chain.invoke(\n {\"question\": query, \"relation_des_str\": relation_des_str}\n )\n rerank_relation_ids = []\n rerank_relation_lines = rerank_res[\"useful_relationships\"]\n id_2_lines = {}\n for line in rerank_relation_lines:\n id_ = int(line[line.find(\"[\") + 1 : line.find(\"]\")])\n id_2_lines[id_] = line.strip()\n rerank_relation_ids.append(id_)\n return rerank_relation_ids\n\n\nrerank_relation_ids = rerank_relations(\n query,\n relation_candidate_texts=relation_candidate_texts,\n relation_candidate_ids=relation_candidate_ids,\n)\n","final_top_k = 2\n\nfinal_passages = []\nfinal_passage_ids = []\nfor relation_id in rerank_relation_ids:\n for passage_id in relationid_2_passageids[relation_id]:\n if passage_id not in final_passage_ids:\n final_passage_ids.append(passage_id)\n final_passages.append(passages[passage_id])\npassages_from_our_method = final_passages[:final_top_k]\n","naive_passage_res = milvus_client.search(\n collection_name=passage_col_name,\n data=[query_embedding],\n limit=final_top_k,\n output_fields=[\"text\"],\n)[0]\npassages_from_naive_rag = [res[\"entity\"][\"text\"] for res in naive_passage_res]\n\nprint(\n f\"Passages retrieved from naive RAG: \\n{passages_from_naive_rag}\\n\\n\"\n f\"Passages retrieved from our method: \\n{passages_from_our_method}\\n\\n\"\n)\n\n\nprompt = ChatPromptTemplate.from_messages(\n [\n (\n \"human\",\n \"\"\"Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.\nQuestion: {question}\nContext: {context}\nAnswer:\"\"\",\n )\n ]\n)\n\nrag_chain = prompt | llm | StrOutputParser()\n\nanswer_from_naive_rag = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_naive_rag)}\n)\nanswer_from_our_method = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_our_method)}\n)\n\nprint(\n f\"Answer from naive RAG: {answer_from_naive_rag}\\n\\nAnswer from our method: {answer_from_our_method}\"\n)\n"],"headingContent":"Graph RAG with Milvus","anchorList":[{"label":"График RAG с помощью Milvus","href":"Graph-RAG-with-Milvus","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Загрузка данных в автономном режиме","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"Онлайн-запросы","href":"Online-Querying","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.md new file mode 100644 index 000000000..5650e056b --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/graph_rag_with_milvus.md @@ -0,0 +1,509 @@ +--- +id: graph_rag_with_milvus.md +summary: График RAG с помощью Milvus +title: График RAG с помощью Milvus +--- +

    График RAG с помощью Milvus

    Open In Colab +GitHub Repository

    +

    Широкое применение больших языковых моделей подчеркивает важность повышения точности и релевантности их ответов. Технология Retrieval-Augmented Generation (RAG) расширяет модели за счет внешних баз знаний, предоставляя больше контекстной информации и смягчая такие проблемы, как галлюцинации и недостаточные знания. Однако опора исключительно на простые парадигмы RAG имеет свои ограничения, особенно при работе со сложными отношениями между сущностями и многоходовыми вопросами, когда модель часто не может дать точный ответ.

    +

    Внедрение графов знаний (ГЗ) в систему RAG предлагает новое решение. Графы знаний представляют сущности и их взаимоотношения в структурированном виде, предоставляя более точную поисковую информацию и помогая RAG лучше справляться со сложными задачами по ответам на вопросы. KG-RAG все еще находится на ранней стадии развития, и пока нет единого мнения о том, как эффективно извлекать сущности и отношения из KG или как интегрировать векторный поиск сходства с графовыми структурами.

    +

    В этой тетради мы представляем простой, но мощный подход, позволяющий значительно улучшить производительность этого сценария. Это простая парадигма RAG с многоходовым поиском и последующим ранжированием, но она логически реализует Graph RAG и достигает самой современной производительности при обработке многоходовых вопросов. Давайте посмотрим, как это реализовано.

    +

    + + + + +

    +

    Предварительные условия

    Перед запуском этого блокнота убедитесь, что у вас установлены следующие зависимости:

    +
    $ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +
    +

    Мы будем использовать модели из OpenAI. Вам необходимо подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Импортируйте необходимые библиотеки и зависимости.

    +
    import numpy as np
    +
    +from collections import defaultdict
    +from scipy.sparse import csr_matrix
    +from pymilvus import MilvusClient
    +from langchain_core.messages import AIMessage, HumanMessage
    +from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
    +from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from tqdm import tqdm
    +
    +

    Инициализируйте экземпляр клиента Milvus, LLM и модель встраивания.

    +
    milvus_client = MilvusClient(uri="./milvus.db")
    +
    +llm = ChatOpenAI(
    +    model="gpt-4o",
    +    temperature=0,
    +)
    +embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +
    +

    Для args в MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Загрузка данных в автономном режиме

    Подготовка данных

    В качестве примера мы будем использовать нано-набор данных, в котором представлены отношения между семейством Бернулли и Эйлером. Наноданные содержат 4 отрывка и набор соответствующих триплетов, где каждый триплет содержит субъект, предикат и объект. На практике вы можете использовать любой подход для извлечения триплетов из своего собственного корпуса.

    +
    nano_dataset = [
    +    {
    +        "passage": "Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.",
    +        "triplets": [
    +            ["Jakob Bernoulli", "made significant contributions to", "calculus"],
    +            [
    +                "Jakob Bernoulli",
    +                "made significant contributions to",
    +                "the theory of probability",
    +            ],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli numbers"],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli theorem"],
    +            ["The Bernoulli theorem", "is a precursor to", "the law of large numbers"],
    +            ["Jakob Bernoulli", "was the older brother of", "Johann Bernoulli"],
    +        ],
    +    },
    +    {
    +        "passage": "Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.",
    +        "triplets": [
    +            [
    +                "Johann Bernoulli",
    +                "was a major figure of",
    +                "the development of calculus",
    +            ],
    +            ["Johann Bernoulli", "was", "Jakob's younger brother"],
    +            ["Johann Bernoulli", "worked on", "infinitesimal calculus"],
    +            ["Johann Bernoulli", "was instrumental in spreading", "Leibniz's ideas"],
    +            ["Johann Bernoulli", "contributed to", "the calculus of variations"],
    +            ["Johann Bernoulli", "was known for", "the brachistochrone problem"],
    +        ],
    +    },
    +    {
    +        "passage": "Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.",
    +        "triplets": [
    +            ["Daniel Bernoulli", "was the son of", "Johann Bernoulli"],
    +            ["Daniel Bernoulli", "made major contributions to", "fluid dynamics"],
    +            ["Daniel Bernoulli", "made major contributions to", "probability"],
    +            ["Daniel Bernoulli", "made major contributions to", "statistics"],
    +            ["Daniel Bernoulli", "is most famous for", "Bernoulli’s principle"],
    +            [
    +                "Bernoulli’s principle",
    +                "is fundamental to",
    +                "the understanding of aerodynamics",
    +            ],
    +        ],
    +    },
    +    {
    +        "passage": "Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.",
    +        "triplets": [
    +            [
    +                "Leonhard Euler",
    +                "had a significant relationship with",
    +                "the Bernoulli family",
    +            ],
    +            ["leonhard Euler", "was born in", "Basel"],
    +            ["Leonhard Euler", "was a student of", "Johann Bernoulli"],
    +            ["Johann Bernoulli's influence", "was profound on", "Euler"],
    +        ],
    +    },
    +]
    +
    +

    Мы строим сущности и отношения следующим образом:

    +
      +
    • Сущность - это субъект или объект в триплете, поэтому мы напрямую извлекаем их из триплетов.
    • +
    • Здесь мы строим концепцию отношений, непосредственно соединяя субъект, предикат и объект с пробелом между ними.
    • +
    +

    Мы также готовим дикту для сопоставления идентификатора сущности с идентификатором отношения и еще одну дикту для сопоставления идентификатора отношения с идентификатором перехода для последующего использования.

    +
    entityid_2_relationids = defaultdict(list)
    +relationid_2_passageids = defaultdict(list)
    +
    +entities = []
    +relations = []
    +passages = []
    +for passage_id, dataset_info in enumerate(nano_dataset):
    +    passage, triplets = dataset_info["passage"], dataset_info["triplets"]
    +    passages.append(passage)
    +    for triplet in triplets:
    +        if triplet[0] not in entities:
    +            entities.append(triplet[0])
    +        if triplet[2] not in entities:
    +            entities.append(triplet[2])
    +        relation = " ".join(triplet)
    +        if relation not in relations:
    +            relations.append(relation)
    +            entityid_2_relationids[entities.index(triplet[0])].append(
    +                len(relations) - 1
    +            )
    +            entityid_2_relationids[entities.index(triplet[2])].append(
    +                len(relations) - 1
    +            )
    +        relationid_2_passageids[relations.index(relation)].append(passage_id)
    +
    +

    Вставка данных

    Создайте коллекции Milvus для сущности, отношения и перехода. Коллекции сущностей и отношений используются в качестве основных коллекций для построения графов в нашем методе, в то время как коллекция отрывков используется в качестве наивного сравнения RAG-поиска или для вспомогательных целей.

    +
    embedding_dim = len(embedding_model.embed_query("foo"))
    +
    +
    +def create_milvus_collection(collection_name: str):
    +    if milvus_client.has_collection(collection_name=collection_name):
    +        milvus_client.drop_collection(collection_name=collection_name)
    +    milvus_client.create_collection(
    +        collection_name=collection_name,
    +        dimension=embedding_dim,
    +        consistency_level="Strong",
    +    )
    +
    +
    +entity_col_name = "entity_collection"
    +relation_col_name = "relation_collection"
    +passage_col_name = "passage_collection"
    +create_milvus_collection(entity_col_name)
    +create_milvus_collection(relation_col_name)
    +create_milvus_collection(passage_col_name)
    +
    +

    Вставьте данные с их метаданными в коллекции Milvus, включая коллекции сущностей, отношений и отрывков. Информация метаданных включает в себя идентификатор отрывка и идентификатор смежной сущности или отношения.

    +
    def milvus_insert(
    +    collection_name: str,
    +    text_list: list[str],
    +):
    +    batch_size = 512
    +    for row_id in tqdm(range(0, len(text_list), batch_size), desc="Inserting"):
    +        batch_texts = text_list[row_id : row_id + batch_size]
    +        batch_embeddings = embedding_model.embed_documents(batch_texts)
    +
    +        batch_ids = [row_id + j for j in range(len(batch_texts))]
    +        batch_data = [
    +            {
    +                "id": id_,
    +                "text": text,
    +                "vector": vector,
    +            }
    +            for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)
    +        ]
    +        milvus_client.insert(
    +            collection_name=collection_name,
    +            data=batch_data,
    +        )
    +
    +
    +milvus_insert(
    +    collection_name=relation_col_name,
    +    text_list=relations,
    +)
    +
    +milvus_insert(
    +    collection_name=entity_col_name,
    +    text_list=entities,
    +)
    +
    +milvus_insert(
    +    collection_name=passage_col_name,
    +    text_list=passages,
    +)
    +
    +
    Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.02it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.39it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  2.28it/s]
    +
    +

    Онлайн-запросы

    Поиск сходства

    Мы извлекаем топ-К похожих сущностей и отношений на основе входного запроса из Milvus.

    +

    При выполнении поиска сущностей мы должны сначала извлечь сущности из текста запроса с помощью специального метода, например NER (Named-entity recognition). Для простоты мы приводим здесь результаты NER. Если вы хотите изменить запрос в соответствии с вашими пожеланиями, вам необходимо изменить соответствующий список NER запроса. На практике вы можете использовать любую другую модель или подход для извлечения сущностей из запроса.

    +
    query = "What contribution did the son of Euler's teacher make?"
    +
    +query_ner_list = ["Euler"]
    +# query_ner_list = ner(query) # In practice, replace it with your custom NER approach
    +
    +query_ner_embeddings = [
    +    embedding_model.embed_query(query_ner) for query_ner in query_ner_list
    +]
    +
    +top_k = 3
    +
    +entity_search_res = milvus_client.search(
    +    collection_name=entity_col_name,
    +    data=query_ner_embeddings,
    +    limit=top_k,
    +    output_fields=["id"],
    +)
    +
    +query_embedding = embedding_model.embed_query(query)
    +
    +relation_search_res = milvus_client.search(
    +    collection_name=relation_col_name,
    +    data=[query_embedding],
    +    limit=top_k,
    +    output_fields=["id"],
    +)[0]
    +
    +

    Расширение подграфа

    Мы используем извлеченные сущности и отношения для расширения подграфа и получения отношений-кандидатов, а затем объединяем их двумя способами. Ниже приведена блок-схема процесса расширения подграфа: + + + +

    +

    Здесь мы строим матрицу смежности и используем матричное умножение для вычисления информации о сопоставлении смежности в пределах нескольких степеней. Таким образом, мы можем быстро получить информацию о любой степени расширения.

    +
    # Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.
    +entity_relation_adj = np.zeros((len(entities), len(relations)))
    +for entity_id, entity in enumerate(entities):
    +    entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1
    +
    +# Convert the adjacency matrix to a sparse matrix for efficient computation.
    +entity_relation_adj = csr_matrix(entity_relation_adj)
    +
    +# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.
    +entity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T
    +relation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj
    +
    +# Specify the target degree of the subgraph to be expanded.
    +# 1 or 2 is enough for most cases.
    +target_degree = 1
    +
    +# Compute the target degree adjacency matrices using matrix multiplication.
    +entity_adj_target_degree = entity_adj_1_degree
    +for _ in range(target_degree - 1):
    +    entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree
    +relation_adj_target_degree = relation_adj_1_degree
    +for _ in range(target_degree - 1):
    +    relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree
    +
    +entity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj
    +
    +

    Взяв значение из матрицы расширения целевой степени, мы можем легко расширить соответствующую степень из найденных сущностей и отношений, чтобы получить все отношения в подграфе.

    +
    expanded_relations_from_relation = set()
    +expanded_relations_from_entity = set()
    +# You can set the similarity threshold here to guarantee the quality of the retrieved ones.
    +# entity_sim_filter_thresh = ...
    +# relation_sim_filter_thresh = ...
    +
    +filtered_hit_relation_ids = [
    +    relation_res["entity"]["id"]
    +    for relation_res in relation_search_res
    +    # if relation_res['distance'] > relation_sim_filter_thresh
    +]
    +for hit_relation_id in filtered_hit_relation_ids:
    +    expanded_relations_from_relation.update(
    +        relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()
    +    )
    +
    +filtered_hit_entity_ids = [
    +    one_entity_res["entity"]["id"]
    +    for one_entity_search_res in entity_search_res
    +    for one_entity_res in one_entity_search_res
    +    # if one_entity_res['distance'] > entity_sim_filter_thresh
    +]
    +
    +for filtered_hit_entity_id in filtered_hit_entity_ids:
    +    expanded_relations_from_entity.update(
    +        entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()
    +    )
    +
    +# Merge the expanded relations from the relation and entity retrieval ways.
    +relation_candidate_ids = list(
    +    expanded_relations_from_relation | expanded_relations_from_entity
    +)
    +
    +relation_candidate_texts = [
    +    relations[relation_id] for relation_id in relation_candidate_ids
    +]
    +
    +

    Расширив подграф, мы получили отношения-кандидаты, которые будут ранжированы LLM на следующем шаге.

    +

    Ранжирование LLM

    На этом этапе мы используем мощный механизм самонаблюдения LLM для дальнейшей фильтрации и уточнения набора отношений-кандидатов. Мы используем одноразовую подсказку, включающую запрос и набор отношений-кандидатов в подсказку, и поручаем LLM выбрать потенциальные отношения, которые могут помочь ответить на запрос. Учитывая, что некоторые запросы могут быть сложными, мы используем подход "Цепочка мыслей", позволяя LLM выразить свой мыслительный процесс в ответе. Мы оговариваем, что ответ LLM должен быть в формате json для удобства разбора.

    +
    query_prompt_one_shot_input = """I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.
    +
    +Question:
    +When was the mother of the leader of the Third Crusade born?
    +
    +Relationship descriptions:
    +[1] Eleanor was born in 1122.
    +[2] Eleanor married King Louis VII of France.
    +[3] Eleanor was the Duchess of Aquitaine.
    +[4] Eleanor participated in the Second Crusade.
    +[5] Eleanor had eight children.
    +[6] Eleanor was married to Henry II of England.
    +[7] Eleanor was the mother of Richard the Lionheart.
    +[8] Richard the Lionheart was the King of England.
    +[9] Henry II was the father of Richard the Lionheart.
    +[10] Henry II was the King of England.
    +[11] Richard the Lionheart led the Third Crusade.
    +
    +"""
    +query_prompt_one_shot_output = """{"thought_process": "To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.", "useful_relationships": ["[11] Richard the Lionheart led the Third Crusade", "[7] Eleanor was the mother of Richard the Lionheart", "[1] Eleanor was born in 1122"]}"""
    +
    +query_prompt_template = """Question:
    +{question}
    +
    +Relationship descriptions:
    +{relation_des_str}
    +
    +"""
    +
    +
    +def rerank_relations(
    +    query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]
    +) -> list[int]:
    +    relation_des_str = "\n".join(
    +        map(
    +            lambda item: f"[{item[0]}] {item[1]}",
    +            zip(relation_candidate_ids, relation_candidate_texts),
    +        )
    +    ).strip()
    +    rerank_prompts = ChatPromptTemplate.from_messages(
    +        [
    +            HumanMessage(query_prompt_one_shot_input),
    +            AIMessage(query_prompt_one_shot_output),
    +            HumanMessagePromptTemplate.from_template(query_prompt_template),
    +        ]
    +    )
    +    rerank_chain = (
    +        rerank_prompts
    +        | llm.bind(response_format={"type": "json_object"})
    +        | JsonOutputParser()
    +    )
    +    rerank_res = rerank_chain.invoke(
    +        {"question": query, "relation_des_str": relation_des_str}
    +    )
    +    rerank_relation_ids = []
    +    rerank_relation_lines = rerank_res["useful_relationships"]
    +    id_2_lines = {}
    +    for line in rerank_relation_lines:
    +        id_ = int(line[line.find("[") + 1 : line.find("]")])
    +        id_2_lines[id_] = line.strip()
    +        rerank_relation_ids.append(id_)
    +    return rerank_relation_ids
    +
    +
    +rerank_relation_ids = rerank_relations(
    +    query,
    +    relation_candidate_texts=relation_candidate_texts,
    +    relation_candidate_ids=relation_candidate_ids,
    +)
    +
    +

    Получение окончательных результатов

    Мы можем получить окончательные результаты извлечения отрывков из ранжированных отношений.

    +
    final_top_k = 2
    +
    +final_passages = []
    +final_passage_ids = []
    +for relation_id in rerank_relation_ids:
    +    for passage_id in relationid_2_passageids[relation_id]:
    +        if passage_id not in final_passage_ids:
    +            final_passage_ids.append(passage_id)
    +            final_passages.append(passages[passage_id])
    +passages_from_our_method = final_passages[:final_top_k]
    +
    +

    Мы можем сравнить результаты с наивным методом RAG, который извлекает topK отрывков, основанных на вложении запроса, непосредственно из коллекции отрывков.

    +
    naive_passage_res = milvus_client.search(
    +    collection_name=passage_col_name,
    +    data=[query_embedding],
    +    limit=final_top_k,
    +    output_fields=["text"],
    +)[0]
    +passages_from_naive_rag = [res["entity"]["text"] for res in naive_passage_res]
    +
    +print(
    +    f"Passages retrieved from naive RAG: \n{passages_from_naive_rag}\n\n"
    +    f"Passages retrieved from our method: \n{passages_from_our_method}\n\n"
    +)
    +
    +
    +prompt = ChatPromptTemplate.from_messages(
    +    [
    +        (
    +            "human",
    +            """Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.
    +Question: {question}
    +Context: {context}
    +Answer:""",
    +        )
    +    ]
    +)
    +
    +rag_chain = prompt | llm | StrOutputParser()
    +
    +answer_from_naive_rag = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_naive_rag)}
    +)
    +answer_from_our_method = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_our_method)}
    +)
    +
    +print(
    +    f"Answer from naive RAG: {answer_from_naive_rag}\n\nAnswer from our method: {answer_from_our_method}"
    +)
    +
    +
    Passages retrieved from naive RAG: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.']
    +
    +Passages retrieved from our method: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.']
    +
    +
    +Answer from naive RAG: I don't know. The retrieved context does not provide information about the contributions made by the son of Euler's teacher.
    +
    +Answer from our method: The son of Euler's teacher, Daniel Bernoulli, made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.
    +
    +

    Как мы видим, отрывки, полученные с помощью наивного метода RAG, не содержат истинного отрывка, что привело к неправильному ответу. Отрывки, полученные с помощью нашего метода, верны, и это помогает получить точный ответ на вопрос.

    diff --git a/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.json new file mode 100644 index 000000000..56a5bf8e5 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install hdbscan\n$ pip install plotly\n$ pip install umap-learn\n","import pandas as pd\nfrom dotenv import load_dotenv\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType\n\nload_dotenv()\n\ndf = pd.read_csv(\"news_data_dedup.csv\")\n\n\ndocs = [\n f\"{title}\\n{description}\" for title, description in zip(df.title, df.description)\n]\nef = BGEM3EmbeddingFunction()\n\nembeddings = ef(docs)[\"dense\"]\n\nconnections.connect(uri=\"milvus.db\")\n","fields = [\n FieldSchema(\n name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True\n ), # Primary ID field\n FieldSchema(\n name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=1024\n ), # Float vector field (embedding)\n FieldSchema(\n name=\"text\", dtype=DataType.VARCHAR, max_length=65535\n ), # Float vector field (embedding)\n]\n\nschema = CollectionSchema(fields=fields, description=\"Embedding collection\")\n\ncollection = Collection(name=\"news_data\", schema=schema)\n\nfor doc, embedding in zip(docs, embeddings):\n collection.insert({\"text\": doc, \"embedding\": embedding})\n print(doc)\n\nindex_params = {\"index_type\": \"FLAT\", \"metric_type\": \"L2\", \"params\": {}}\n\ncollection.create_index(field_name=\"embedding\", index_params=index_params)\n\ncollection.flush()\n","import hdbscan\nimport numpy as np\nimport pandas as pd\nimport plotly.express as px\nfrom umap import UMAP\nfrom pymilvus import Collection\n\ncollection = Collection(name=\"news_data\")\ncollection.load()\n\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"embedding\"]\n)\n\nsearch_params = {\n \"metric_type\": \"L2\",\n \"params\": {\"nprobe\": 10},\n} # L2 is Euclidean distance\n\nids = []\ndist = {}\n\nembeddings = []\n","while True:\n batch = iterator.next()\n batch_ids = [data[\"id\"] for data in batch]\n ids.extend(batch_ids)\n\n query_vectors = [data[\"embedding\"] for data in batch]\n embeddings.extend(query_vectors)\n\n results = collection.search(\n data=query_vectors,\n limit=50,\n anns_field=\"embedding\",\n param=search_params,\n output_fields=[\"id\"],\n )\n for i, batch_id in enumerate(batch_ids):\n dist[batch_id] = []\n for result in results[i]:\n dist[batch_id].append((result.id, result.distance))\n\n if len(batch) == 0:\n break\n\nids2index = {}\n\nfor id in dist:\n ids2index[id] = len(ids2index)\n\ndist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)\n\nfor id in dist:\n for result in dist[id]:\n dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]\n\nh = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric=\"precomputed\")\nhdb = h.fit(dist_metric)\n","import plotly.io as pio\n\npio.renderers.default = \"notebook\"\n\numap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)\n\ndf_umap = (\n pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=[\"x\", \"y\"])\n .assign(cluster=lambda df: hdb.labels_.astype(str))\n .query('cluster != \"-1\"')\n .sort_values(by=\"cluster\")\n)\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"text\"]\n)\n\nids = []\ntexts = []\n\nwhile True:\n batch = iterator.next()\n if len(batch) == 0:\n break\n batch_ids = [data[\"id\"] for data in batch]\n batch_texts = [data[\"text\"] for data in batch]\n ids.extend(batch_ids)\n texts.extend(batch_texts)\n\nshow_texts = [texts[i] for i in df_umap.index]\n\ndf_umap[\"hover_text\"] = show_texts\nfig = px.scatter(\n df_umap, x=\"x\", y=\"y\", color=\"cluster\", hover_data={\"hover_text\": True}\n)\nfig.show()\n"],"headingContent":"HDBSCAN Clustering with Milvus","anchorList":[{"label":"Кластеризация HDBSCAN с помощью Milvus","href":"HDBSCAN-Clustering-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузить данные","href":"Download-Data","type":2,"isActive":false},{"label":"Извлечение вкраплений в Milvus","href":"Extract-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"Построение матрицы расстояний для HDBSCAN","href":"Construct-the-Distance-Matrix-for-HDBSCAN","type":2,"isActive":false},{"label":"Визуализация кластеров с помощью UMAP","href":"Clusters-Visualization-using-UMAP","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.md new file mode 100644 index 000000000..9c87c55ab --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/hdbscan_clustering_with_milvus.md @@ -0,0 +1,276 @@ +--- +id: hdbscan_clustering_with_milvus.md +summary: >- + В этом блокноте мы будем использовать модель встраивания BGE-M3 для извлечения + вложений из набора данных новостных заголовков, использовать Milvus для + эффективного вычисления расстояний между вложениями, чтобы помочь HDBSCAN в + кластеризации, а затем визуализировать результаты для анализа с помощью метода + UMAP. Этот блокнот является адаптацией Milvus статьи Дилана Кастильо. +title: Кластеризация HDBSCAN с помощью Milvus +--- +

    Кластеризация HDBSCAN с помощью Milvus

    +Open In Colab + + +GitHub Repository +

    +

    С помощью моделей глубокого обучения данные могут быть преобразованы во вкрапления, которые отражают значимые представления исходных данных. Применяя алгоритм кластеризации без контроля, мы можем объединить похожие точки данных в группы на основе присущих им закономерностей. HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) - это широко используемый алгоритм кластеризации, который эффективно группирует точки данных, анализируя их плотность и расстояние. Он особенно полезен для обнаружения кластеров различной формы и размера. В этом блокноте мы будем использовать HDBSCAN с Milvus, высокопроизводительной векторной базой данных, для группировки точек данных в отдельные группы на основе их вкраплений.

    +

    HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) - это алгоритм кластеризации, основанный на вычислении расстояний между точками данных в пространстве вкраплений. Эти вкрапления, созданные моделями глубокого обучения, представляют данные в высокоразмерной форме. Чтобы сгруппировать похожие точки данных, HDBSCAN определяет их близость и плотность, но эффективное вычисление этих расстояний, особенно для больших наборов данных, может быть сложной задачей.

    +

    Milvus, высокопроизводительная база данных векторов, оптимизирует этот процесс, сохраняя и индексируя вкрапления, что позволяет быстро находить похожие векторы. При совместном использовании HDBSCAN и Milvus обеспечивают эффективную кластеризацию больших наборов данных в пространстве вкраплений.

    +

    В этом блокноте мы используем модель встраивания BGE-M3 для извлечения встраиваний из набора данных новостных заголовков, используем Milvus для эффективного вычисления расстояний между встраиваниями, чтобы помочь HDBSCAN в кластеризации, а затем визуализируем результаты для анализа с помощью метода UMAP. Этот блокнот является адаптацией Milvus к статье Дилана Кастильо.

    +

    Подготовка

    загрузите набор данных новостей с сайта https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/.

    +
    $ pip install "pymilvus[model]"
    +$ pip install hdbscan
    +$ pip install plotly
    +$ pip install umap-learn
    +
    +

    Загрузить данные

    Загрузите новостной набор данных с https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/, извлеките news_data_dedup.csv и поместите его в текущую директорию.

    +

    Извлечение вкраплений в Milvus

    Мы создадим коллекцию с помощью Milvus и извлечем плотные вкрапления с помощью модели BGE-M3.

    +
    import pandas as pd
    +from dotenv import load_dotenv
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType
    +
    +load_dotenv()
    +
    +df = pd.read_csv("news_data_dedup.csv")
    +
    +
    +docs = [
    +    f"{title}\n{description}" for title, description in zip(df.title, df.description)
    +]
    +ef = BGEM3EmbeddingFunction()
    +
    +embeddings = ef(docs)["dense"]
    +
    +connections.connect(uri="milvus.db")
    +
    +
    +
      +
    • Если вам нужна локальная векторная база данных только для небольшого масштаба данных или прототипирования, установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +
    +
    fields = [
    +    FieldSchema(
    +        name="id", dtype=DataType.INT64, is_primary=True, auto_id=True
    +    ),  # Primary ID field
    +    FieldSchema(
    +        name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024
    +    ),  # Float vector field (embedding)
    +    FieldSchema(
    +        name="text", dtype=DataType.VARCHAR, max_length=65535
    +    ),  # Float vector field (embedding)
    +]
    +
    +schema = CollectionSchema(fields=fields, description="Embedding collection")
    +
    +collection = Collection(name="news_data", schema=schema)
    +
    +for doc, embedding in zip(docs, embeddings):
    +    collection.insert({"text": doc, "embedding": embedding})
    +    print(doc)
    +
    +index_params = {"index_type": "FLAT", "metric_type": "L2", "params": {}}
    +
    +collection.create_index(field_name="embedding", index_params=index_params)
    +
    +collection.flush()
    +
    +

    Построение матрицы расстояний для HDBSCAN

    HDBSCAN требует вычисления расстояний между точками для кластеризации, что может потребовать больших вычислительных затрат. Поскольку удаленные точки оказывают меньшее влияние на назначение кластеризации, мы можем повысить эффективность, вычислив топ-к ближайших соседей. В этом примере мы используем индекс FLAT, но для больших наборов данных Milvus поддерживает более продвинутые методы индексации, чтобы ускорить процесс поиска. Во-первых, нам нужно получить итератор для итерации коллекции Milvus, которую мы ранее создали.

    +
    import hdbscan
    +import numpy as np
    +import pandas as pd
    +import plotly.express as px
    +from umap import UMAP
    +from pymilvus import Collection
    +
    +collection = Collection(name="news_data")
    +collection.load()
    +
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "embedding"]
    +)
    +
    +search_params = {
    +    "metric_type": "L2",
    +    "params": {"nprobe": 10},
    +}  # L2 is Euclidean distance
    +
    +ids = []
    +dist = {}
    +
    +embeddings = []
    +
    +

    Мы будем итерировать все вкрапления в коллекции Milvus. Для каждого вкрапления мы будем искать его топ-к соседей в той же коллекции, получать их идентификаторы и расстояния. Затем нам также нужно построить словарь для сопоставления исходного идентификатора с непрерывным индексом в матрице расстояний. После этого нужно создать матрицу расстояний, которая инициализируется всеми элементами как бесконечность, и заполнить ее искомыми элементами. Таким образом, расстояние между удаленными точками будет игнорироваться. Наконец, мы используем библиотеку HDBSCAN для кластеризации точек с помощью созданной матрицы расстояний. Нам нужно установить метрику на 'precomputed', чтобы указать, что данные - это матрица расстояний, а не оригинальные вкрапления.

    +
    while True:
    +    batch = iterator.next()
    +    batch_ids = [data["id"] for data in batch]
    +    ids.extend(batch_ids)
    +
    +    query_vectors = [data["embedding"] for data in batch]
    +    embeddings.extend(query_vectors)
    +
    +    results = collection.search(
    +        data=query_vectors,
    +        limit=50,
    +        anns_field="embedding",
    +        param=search_params,
    +        output_fields=["id"],
    +    )
    +    for i, batch_id in enumerate(batch_ids):
    +        dist[batch_id] = []
    +        for result in results[i]:
    +            dist[batch_id].append((result.id, result.distance))
    +
    +    if len(batch) == 0:
    +        break
    +
    +ids2index = {}
    +
    +for id in dist:
    +    ids2index[id] = len(ids2index)
    +
    +dist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)
    +
    +for id in dist:
    +    for result in dist[id]:
    +        dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]
    +
    +h = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric="precomputed")
    +hdb = h.fit(dist_metric)
    +
    +

    После этого кластеризация HDBSCAN завершена. Мы можем получить некоторые данные и показать их кластер. Обратите внимание, что некоторые данные не будут отнесены ни к одному кластеру, что означает, что они являются шумом, поскольку расположены в какой-то разреженной области.

    +

    Визуализация кластеров с помощью UMAP

    Мы уже кластеризовали данные с помощью HDBSCAN и можем получить метки для каждой точки данных. Однако, используя некоторые методы визуализации, мы можем получить полную картину кластеров для интуитивного анализа. Сейчас мы будем использовать UMAP для визуализации кластеров. UMAP - это эффективный метод, используемый для уменьшения размерности, сохраняющий структуру высокоразмерных данных и проецирующий их в более низкоразмерное пространство для визуализации или дальнейшего анализа. С его помощью мы можем визуализировать исходные высокоразмерные данные в 2D- или 3D-пространстве и четко видеть кластеры. Здесь мы снова итерируем точки данных и получаем идентификатор и текст исходных данных, затем с помощью ploty строим график точек данных с этими метаданными на рисунке и используем разные цвета для представления различных кластеров.

    +
    import plotly.io as pio
    +
    +pio.renderers.default = "notebook"
    +
    +umap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)
    +
    +df_umap = (
    +    pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=["x", "y"])
    +    .assign(cluster=lambda df: hdb.labels_.astype(str))
    +    .query('cluster != "-1"')
    +    .sort_values(by="cluster")
    +)
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "text"]
    +)
    +
    +ids = []
    +texts = []
    +
    +while True:
    +    batch = iterator.next()
    +    if len(batch) == 0:
    +        break
    +    batch_ids = [data["id"] for data in batch]
    +    batch_texts = [data["text"] for data in batch]
    +    ids.extend(batch_ids)
    +    texts.extend(batch_texts)
    +
    +show_texts = [texts[i] for i in df_umap.index]
    +
    +df_umap["hover_text"] = show_texts
    +fig = px.scatter(
    +    df_umap, x="x", y="y", color="cluster", hover_data={"hover_text": True}
    +)
    +fig.show()
    +
    +

    + + image + изображение

    +

    Здесь мы демонстрируем, что данные хорошо кластеризованы, и вы можете навести курсор на точки, чтобы проверить текст, который они представляют. Мы надеемся, что с помощью этого блокнота вы узнаете, как эффективно использовать HDBSCAN для кластеризации вкраплений с помощью Milvus, что также может быть применено к другим типам данных. В сочетании с большими языковыми моделями этот подход позволяет проводить более глубокий анализ данных в больших масштабах.

    diff --git a/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.json b/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.json new file mode 100644 index 000000000..09c126c3c --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"How to Enhance the Performance of Your RAG Pipeline","anchorList":[{"label":"Как повысить производительность конвейера RAG","href":"How-to-Enhance-the-Performance-of-Your-RAG-Pipeline","type":1,"isActive":false},{"label":"Стандартный конвейер RAG","href":"A-Standard-RAG-Pipeline","type":2,"isActive":false},{"label":"Различные типы техник улучшения RAG","href":"Various-Types-of-RAG-Enhancement-Techniques","type":2,"isActive":false},{"label":"Улучшение запросов","href":"Query-Enhancement","type":2,"isActive":false},{"label":"Улучшение индексации","href":"Indexing-Enhancement","type":2,"isActive":false},{"label":"Усовершенствование ретривера","href":"Retriever-Enhancement","type":2,"isActive":false},{"label":"Расширение возможностей генератора","href":"Generator-Enhancement","type":2,"isActive":false},{"label":"Улучшение конвейера RAG","href":"RAG-Pipeline-Enhancement","type":2,"isActive":false},{"label":"Резюме","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.md b/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.md new file mode 100644 index 000000000..59893a31c --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/how_to_enhance_your_rag.md @@ -0,0 +1,296 @@ +--- +id: how_to_enhance_your_rag.md +summary: >- + С ростом популярности приложений Retrieval Augmented Generation RAG все чаще + возникает вопрос об улучшении их производительности. В этой статье + представлены все возможные способы оптимизации конвейеров RAG и приведены + соответствующие иллюстрации, которые помогут вам быстро понять основные + стратегии оптимизации RAG. +title: Как повысить производительность конвейера RAG +--- +

    Как повысить производительность конвейера RAG

    С ростом популярности приложений Retrieval Augmented Generation(RAG) все чаще возникает вопрос о повышении их производительности. В этой статье представлены все возможные способы оптимизации конвейеров RAG и приведены соответствующие иллюстрации, которые помогут вам быстро понять основные стратегии оптимизации RAG.

    +

    Важно отметить, что мы лишь в общих чертах рассмотрим эти стратегии и методы, сосредоточившись на том, как они интегрируются в систему RAG. Однако мы не будем углубляться в сложные детали или проводить вас через пошаговое внедрение.

    +

    Стандартный конвейер RAG

    На схеме ниже показан самый простой стандартный конвейер RAG. Сначала фрагменты документов загружаются в векторное хранилище (например, в облако Milvus или Zilliz). Затем из векторного хранилища извлекается Top-K наиболее релевантных фрагментов, связанных с запросом. Эти релевантные фрагменты затем вводятся в контекстную подсказку LLM, и, наконец, LLM возвращает окончательный ответ.

    +

    + + + + +

    +

    Различные типы техник улучшения RAG

    Мы можем классифицировать различные подходы к улучшению RAG в зависимости от их роли на этапах конвейера RAG.

    +
      +
    • Улучшение запросов: Модификация и манипулирование процессом запроса на входе RAG для лучшего выражения или обработки намерения запроса.
    • +
    • Улучшение индексирования: Оптимизация создания индексов с кусками с помощью таких методов, как многокусковое индексирование, пошаговое индексирование или многоходовое индексирование.
    • +
    • Улучшение ретривера: Применение методов и стратегий оптимизации в процессе поиска.
    • +
    • Усовершенствование генератора: Корректировка и оптимизация подсказок при сборке подсказок для LLM с целью получения более качественных ответов.
    • +
    • Улучшение конвейера RAG: Динамическое переключение процессов в рамках всего конвейера RAG, включая использование агентов или инструментов для оптимизации ключевых этапов конвейера RAG.
    • +
    +

    Далее мы представим конкретные методы в каждой из этих категорий.

    +

    Улучшение запросов

    Давайте рассмотрим четыре эффективных метода улучшения работы с запросами: Гипотетические вопросы, вкрапления гипотетических документов, подзапросы и пошаговые подсказки.

    +

    Создание гипотетических вопросов

    Создание гипотетических вопросов подразумевает использование LLM для генерации множества вопросов, которые пользователи могут задать по поводу содержимого каждого блока документов. Прежде чем реальный запрос пользователя дойдет до LLM, векторное хранилище извлекает наиболее релевантные гипотетические вопросы, связанные с реальным запросом, вместе с соответствующими фрагментами документов и направляет их в LLM.

    +

    + + + + +

    +

    Эта методология позволяет обойти проблему междоменной асимметрии в процессе векторного поиска, напрямую участвуя в поиске между запросами, что облегчает нагрузку на векторный поиск. Однако это влечет за собой дополнительные накладные расходы и неопределенность при генерации гипотетических вопросов.

    +

    HyDE (Hypothetical Document Embeddings)

    HyDE расшифровывается как Hypothetical Document Embeddings. Он использует LLM для создания "гипотетического документа" или фальшивого ответа в ответ на запрос пользователя, лишенного контекстной информации. Затем этот фальшивый ответ преобразуется в векторные вкрапления и используется для запроса наиболее релевантных фрагментов документов в векторной базе данных. Затем векторная база данных извлекает Top-K наиболее релевантных фрагментов документов и передает их в LLM и исходный запрос пользователя для создания окончательного ответа.

    +

    + + + + +

    +

    Этот метод похож на метод гипотетического вопроса в решении проблемы междоменной асимметрии в векторном поиске. Однако у него есть и недостатки, такие как дополнительные вычислительные затраты и неопределенность при генерации фальшивых ответов.

    +

    Более подробную информацию можно найти в статье HyDE.

    +

    Создание подзапросов

    Когда пользовательский запрос слишком сложен, мы можем использовать LLM для разбиения его на более простые подзапросы перед передачей их в векторную базу данных и LLM. Давайте рассмотрим пример.

    +

    Представьте, что пользователь спрашивает: "Чем отличаются функции Milvus и Zilliz Cloud?" Этот вопрос довольно сложный и может не иметь прямого ответа в нашей базе знаний. Чтобы решить эту проблему, мы можем разделить его на два более простых подзапроса:

    +
      +
    • Подзапрос 1: "Каковы особенности Milvus?"
    • +
    • Подзапрос 2: "Каковы особенности Zilliz Cloud?".
    • +
    +

    Получив эти подзапросы, мы отправляем их в векторную базу данных после преобразования в векторные вкрапления. Затем векторная база данных находит фрагменты документов Top-K, наиболее релевантные каждому подзапросу. Наконец, LLM использует эту информацию для генерации лучшего ответа.

    +

    + + + + +

    +

    Разбив запрос пользователя на подзапросы, мы облегчаем нашей системе поиск релевантной информации и предоставление точных ответов даже на сложные вопросы.

    +

    Создание пошаговых подсказок

    Еще один способ упростить сложные пользовательские запросы - создать пошаговые подсказки. Эта техника предполагает абстрагирование сложных запросов пользователя в "пошаговые вопросы"** с помощью LLM. Затем векторная база данных использует эти пошаговые вопросы для извлечения наиболее релевантных фрагментов документов. И наконец, LLM генерирует более точный ответ на основе этих полученных фрагментов документов.

    +

    Проиллюстрируем эту технику на примере. Рассмотрим следующий запрос, который является довольно сложным и не простым для прямого ответа:

    +

    Исходный запрос пользователя: "У меня есть набор данных с 10 миллиардами записей, и я хочу хранить его в Milvus для запросов. Возможно ли это?"

    +

    Чтобы упростить этот пользовательский запрос, мы можем использовать LLM для генерации более простого пошагового вопроса:

    +

    Stepback Question: "Каков предельный размер набора данных, с которым может работать Milvus?".

    +

    + + + + +

    +

    Этот метод может помочь нам получить более точные ответы на сложные запросы. Он разбивает исходный вопрос на более простые формы, облегчая нашей системе поиск релевантной информации и предоставление точных ответов.

    +

    Улучшение индексации

    Улучшение индексации - еще одна стратегия повышения производительности приложений RAG. Давайте рассмотрим три метода улучшения индексации.

    +

    Автоматическое объединение фрагментов документов

    При построении индекса мы можем использовать два уровня детализации: дочерние и соответствующие им родительские блоки. Сначала мы ищем дочерние блоки на более тонком уровне детализации. Затем мы применяем стратегию слияния: если определенное количество, n, дочерних чанков из первых k дочерних чанков принадлежат одному и тому же родительскому чанку, мы предоставляем этот родительский чанк в LLM в качестве контекстной информации.

    +

    + + + + +

    +

    Эта методология была реализована в LlamaIndex.

    +

    Построение иерархических индексов

    При создании индексов для документов мы можем создать двухуровневый индекс: один для резюме документов, другой - для их фрагментов. Процесс векторного поиска состоит из двух этапов: сначала мы фильтруем релевантные документы на основе резюме, а затем извлекаем соответствующие фрагменты документов исключительно из этих релевантных документов.

    +

    + + + + +

    +

    Этот подход оказывается полезным в ситуациях с большими объемами данных или в случаях, когда данные иерархичны, например, при поиске контента в библиотечной коллекции.

    +

    Гибридный поиск и реранжирование

    Метод гибридного поиска и реранжирования объединяет один или несколько дополнительных методов поиска с поиском по векторному сходству. Затем реранжировщик ранжирует полученные результаты на основе их релевантности запросу пользователя.

    +

    К распространенным алгоритмам дополнительного поиска относятся методы, основанные на лексической частоте, например BM25, или большие модели, использующие разреженные вкрапления, например Splade. Алгоритмы повторного ранжирования включают RRF или более сложные модели, такие как Cross-Encoder, которые напоминают BERT-подобные архитектуры.

    +

    + + + + +

    +

    Этот подход использует различные методы поиска для улучшения качества поиска и устранения потенциальных пробелов в векторном отзыве.

    +

    Усовершенствование ретривера

    Усовершенствование компонента ретривера в системе RAG также может улучшить работу приложений RAG. Давайте рассмотрим некоторые эффективные методы улучшения ретривера.

    +

    Поиск в окне предложения

    В базовой системе RAG фрагмент документа, передаваемый LLM, представляет собой более крупное окно, охватывающее извлеченный фрагмент вставки. Это гарантирует, что информация, предоставляемая LLM, включает в себя более широкий спектр контекстных деталей, минимизируя потерю информации. Техника Sentence Window Retrieval позволяет отделить фрагмент документа, используемый для поиска вкраплений, от фрагмента, предоставляемого LLM.

    +

    + + + + +

    +

    Однако увеличение размера окна может привести к появлению дополнительной мешающей информации. Мы можем регулировать размер расширения окна в зависимости от конкретных потребностей бизнеса.

    +

    Фильтрация метаданных

    Чтобы обеспечить более точные ответы, мы можем уточнить полученные документы, отфильтровав метаданные, такие как время и категория, перед передачей их в LLM. Например, если получены финансовые отчеты за несколько лет, фильтрация по нужному году позволит уточнить информацию в соответствии с конкретными требованиями. Этот метод эффективен в ситуациях с обширными данными и подробными метаданными, например при поиске контента в библиотечных фондах.

    +

    + + + + +

    +

    Расширение возможностей генератора

    Давайте рассмотрим другие методы оптимизации RAG, улучшив генератор в системе RAG.

    +

    Сжатие запроса LLM

    Шумовая информация в извлеченных фрагментах документов может существенно повлиять на точность окончательного ответа RAG. Ограниченное окно подсказки в LLM также является препятствием для получения более точных ответов. Чтобы решить эту проблему, мы можем сжать нерелевантные детали, подчеркнуть ключевые абзацы и уменьшить общую длину контекста в найденных фрагментах документов.

    +

    + + + + +

    +

    Этот подход похож на рассмотренный ранее гибридный метод поиска и реранжирования, в котором реранжировщик используется для отсеивания нерелевантных фрагментов документов.

    +

    Корректировка порядка расположения фрагментов в подсказке

    В статье "Lost in the middle" исследователи заметили, что LLM часто не обращают внимания на информацию в середине документов в процессе рассуждения. Вместо этого они склонны больше полагаться на информацию, представленную в начале и конце документов.

    +

    Основываясь на этом наблюдении, мы можем изменить порядок извлечения фрагментов, чтобы улучшить качество ответа: при извлечении нескольких фрагментов знаний фрагменты с относительно низким уровнем доверия размещаются в середине, а фрагменты с относительно высоким уровнем доверия - на обоих концах.

    +

    + + + + +

    +

    Улучшение конвейера RAG

    Мы также можем повысить производительность ваших приложений RAG, улучшив весь конвейер RAG.

    +

    Саморефлексия

    Этот подход включает в себя концепцию саморефлексии в агентах ИИ. Как же работает эта техника?

    +

    Некоторые первоначально полученные фрагменты документов Top-K неоднозначны и могут не давать прямого ответа на вопрос пользователя. В таких случаях мы можем провести второй раунд размышлений, чтобы проверить, действительно ли эти фрагменты могут отвечать на запрос.

    +

    Для проверки можно использовать эффективные методы анализа, такие как модели Natural Language Inference (NLI), или дополнительные инструменты, например поиск в Интернете.

    +

    + + + + +

    +

    Эта концепция саморефлексии была исследована в нескольких работах и проектах, включая Self-RAG, Corrective RAG, LangGraph и т. д.

    +

    Маршрутизация запросов с помощью агента

    Иногда нам не нужно использовать систему RAG для ответа на простые вопросы, так как это может привести к еще большему непониманию и выводам на основе недостоверной информации. В таких случаях мы можем использовать агента в качестве маршрутизатора на этапе запроса. Этот агент оценивает, должен ли запрос пройти через конвейер RAG. Если да, то запускается последующий конвейер RAG; в противном случае LLM обращается к запросу напрямую.

    +

    + + + + + + + + + + +

    +

    Агент может принимать различные формы, включая LLM, небольшую классификационную модель или даже набор правил.

    +

    Маршрутизация запросов на основе намерений пользователя позволяет перенаправить часть запросов, что приводит к значительному увеличению времени отклика и заметному уменьшению ненужного шума.

    +

    Мы можем распространить технику маршрутизации запросов на другие процессы в системе RAG, например определить, когда использовать такие инструменты, как веб-поиск, выполнение подзапросов или поиск изображений. Такой подход гарантирует, что каждый шаг в системе RAG будет оптимизирован на основе конкретных требований запроса, что приведет к более эффективному и точному поиску информации.

    +

    Резюме

    Хотя ванильный конвейер RAG может показаться простым, для достижения оптимальной производительности бизнеса часто требуются более сложные методы оптимизации.

    +

    В этой статье мы обобщили различные популярные подходы к повышению производительности ваших RAG-приложений. Мы также привели наглядные иллюстрации, чтобы помочь вам быстро понять эти концепции и методы и ускорить их внедрение и оптимизацию.

    +

    Вы можете получить простые реализации основных подходов, перечисленных в статье, по этой ссылке на GitHub.

    diff --git a/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.json new file mode 100644 index 000000000..7a153975d --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus \"pymilvus[model]\"\n","# Run this cell to download the dataset\n$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv\n","import pandas as pd\n\nfile_path = \"quora_duplicate_questions.tsv\"\ndf = pd.read_csv(file_path, sep=\"\\t\")\nquestions = set()\nfor _, row in df.iterrows():\n obj = row.to_dict()\n questions.add(obj[\"question1\"][:512])\n questions.add(obj[\"question2\"][:512])\n if len(questions) > 500: # Skip this if you want to use the full dataset\n break\n\ndocs = list(questions)\n\n# example question\nprint(docs[0])\n","from milvus_model.hybrid import BGEM3EmbeddingFunction\n\nef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\ndense_dim = ef.dim[\"dense\"]\n\n# Generate embeddings using BGE-M3 model\ndocs_embeddings = ef(docs)\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# Connect to Milvus given URI\nconnections.connect(uri=\"./milvus.db\")\n\n# Specify the data schema for the new Collection\nfields = [\n # Use auto generated id as primary key\n FieldSchema(\n name=\"pk\", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100\n ),\n # Store the original text to retrieve based on semantically distance\n FieldSchema(name=\"text\", dtype=DataType.VARCHAR, max_length=512),\n # Milvus now supports both sparse and dense vectors,\n # we can store each in a separate field to conduct hybrid search on both vectors\n FieldSchema(name=\"sparse_vector\", dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=\"dense_vector\", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n]\nschema = CollectionSchema(fields)\n\n# Create collection (drop the old one if exists)\ncol_name = \"hybrid_demo\"\nif utility.has_collection(col_name):\n Collection(col_name).drop()\ncol = Collection(col_name, schema, consistency_level=\"Strong\")\n\n# To make vector search efficient, we need to create indices for the vector fields\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"sparse_vector\", sparse_index)\ndense_index = {\"index_type\": \"AUTOINDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"dense_vector\", dense_index)\ncol.load()\n","# For efficiency, we insert 50 records in each small batch\nfor i in range(0, len(docs), 50):\n batched_entities = [\n docs[i : i + 50],\n docs_embeddings[\"sparse\"][i : i + 50],\n docs_embeddings[\"dense\"][i : i + 50],\n ]\n col.insert(batched_entities)\nprint(\"Number of entities inserted:\", col.num_entities)\n","# Enter your search query\nquery = input(\"Enter your search query: \")\nprint(query)\n\n# Generate embeddings for the query\nquery_embeddings = ef([query])\n# print(query_embeddings)\n","from pymilvus import (\n AnnSearchRequest,\n WeightedRanker,\n)\n\n\ndef dense_search(col, query_dense_embedding, limit=10):\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n res = col.search(\n [query_dense_embedding],\n anns_field=\"dense_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef sparse_search(col, query_sparse_embedding, limit=10):\n search_params = {\n \"metric_type\": \"IP\",\n \"params\": {},\n }\n res = col.search(\n [query_sparse_embedding],\n anns_field=\"sparse_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef hybrid_search(\n col,\n query_dense_embedding,\n query_sparse_embedding,\n sparse_weight=1.0,\n dense_weight=1.0,\n limit=10,\n):\n dense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n dense_req = AnnSearchRequest(\n [query_dense_embedding], \"dense_vector\", dense_search_params, limit=limit\n )\n sparse_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n sparse_req = AnnSearchRequest(\n [query_sparse_embedding], \"sparse_vector\", sparse_search_params, limit=limit\n )\n rerank = WeightedRanker(sparse_weight, dense_weight)\n res = col.hybrid_search(\n [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=[\"text\"]\n )[0]\n return [hit.get(\"text\") for hit in res]\n","dense_results = dense_search(col, query_embeddings[\"dense\"][0])\nsparse_results = sparse_search(col, query_embeddings[\"sparse\"]._getrow(0))\nhybrid_results = hybrid_search(\n col,\n query_embeddings[\"dense\"][0],\n query_embeddings[\"sparse\"]._getrow(0),\n sparse_weight=0.7,\n dense_weight=1.0,\n)\n","def doc_text_formatting(ef, query, docs):\n tokenizer = ef.model.tokenizer\n query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)\n query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)\n formatted_texts = []\n\n for doc in docs:\n ldx = 0\n landmarks = []\n encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)\n tokens = tokenizer.convert_ids_to_tokens(encoding[\"input_ids\"])[1:-1]\n offsets = encoding[\"offset_mapping\"][1:-1]\n for token, (start, end) in zip(tokens, offsets):\n if token in query_tokens:\n if len(landmarks) != 0 and start == landmarks[-1]:\n landmarks[-1] = end\n else:\n landmarks.append(start)\n landmarks.append(end)\n close = False\n formatted_text = \"\"\n for i, c in enumerate(doc):\n if ldx == len(landmarks):\n pass\n elif i == landmarks[ldx]:\n if close:\n formatted_text += \"\"\n else:\n formatted_text += \"\"\n close = not close\n ldx = ldx + 1\n formatted_text += c\n if close is True:\n formatted_text += \"\"\n formatted_texts.append(formatted_text)\n return formatted_texts\n","from IPython.display import Markdown, display\n\n# Dense search results\ndisplay(Markdown(\"**Dense Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, dense_results)\nfor result in dense_results:\n display(Markdown(result))\n\n# Sparse search results\ndisplay(Markdown(\"\\n**Sparse Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, sparse_results)\nfor result in formatted_results:\n display(Markdown(result))\n\n# Hybrid search results\ndisplay(Markdown(\"\\n**Hybrid Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, hybrid_results)\nfor result in formatted_results:\n display(Markdown(result))\n"],"headingContent":"Hybrid Search with Milvus","anchorList":[{"label":"Гибридный поиск с помощью Milvus","href":"Hybrid-Search-with-Milvus","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.md new file mode 100644 index 000000000..adca16b35 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/hybrid_search_with_milvus.md @@ -0,0 +1,313 @@ +--- +id: hybrid_search_with_milvus.md +summary: Гибридный поиск с Milvus +title: Гибридный поиск с помощью Milvus +--- +

    Гибридный поиск с помощью Milvus

    Open In Colab +GitHub Repository

    +

    +

    В этом уроке мы покажем, как проводить гибридный поиск с помощью Milvus и модели BGE-M3. Модель BGE-M3 может преобразовывать текст в плотные и разреженные векторы. Milvus поддерживает хранение обоих типов векторов в одной коллекции, что позволяет осуществлять гибридный поиск, повышающий релевантность результатов.

    +

    Milvus поддерживает плотный, разреженный и гибридный методы поиска:

    +
      +
    • Плотный поиск: Использует семантический контекст для понимания смысла запросов.
    • +
    • Разрозненный поиск: Упор делается на сопоставление текста для поиска результатов по определенным терминам, что эквивалентно полнотекстовому поиску.
    • +
    • Гибридный поиск: Комбинирует плотный и разреженный подходы, захватывая полный контекст и конкретные ключевые слова для получения исчерпывающих результатов поиска.
    • +
    +

    Интегрируя эти методы, гибридный поиск Milvus уравновешивает семантическое и лексическое сходство, улучшая общую релевантность результатов поиска. В этом блокноте мы рассмотрим процесс настройки и использования этих стратегий поиска, подчеркнем их эффективность в различных сценариях поиска.

    +

    Зависимости и окружение

    $ pip install --upgrade pymilvus "pymilvus[model]"
    +
    +

    Загрузить набор данных

    Для демонстрации поиска нам нужен корпус документов. Давайте воспользуемся набором данных Quora Duplicate Questions и поместим его в локальную директорию.

    +

    Источник набора данных: First Quora Dataset Release: Question Pairs

    +
    # Run this cell to download the dataset
    +$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv
    +
    +

    Загрузка и подготовка данных

    Мы загрузим набор данных и подготовим небольшой корпус для поиска.

    +
    import pandas as pd
    +
    +file_path = "quora_duplicate_questions.tsv"
    +df = pd.read_csv(file_path, sep="\t")
    +questions = set()
    +for _, row in df.iterrows():
    +    obj = row.to_dict()
    +    questions.add(obj["question1"][:512])
    +    questions.add(obj["question2"][:512])
    +    if len(questions) > 500:  # Skip this if you want to use the full dataset
    +        break
    +
    +docs = list(questions)
    +
    +# example question
    +print(docs[0])
    +
    +
    What is the strongest Kevlar cord?
    +
    +

    Использование модели BGE-M3 для вкраплений

    Модель BGE-M3 может встраивать тексты в виде плотных и разреженных векторов.

    +
    from milvus_model.hybrid import BGEM3EmbeddingFunction
    +
    +ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +dense_dim = ef.dim["dense"]
    +
    +# Generate embeddings using BGE-M3 model
    +docs_embeddings = ef(docs)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 302473.85it/s]
    +Inference Embeddings: 100%|██████████| 32/32 [01:59<00:00,  3.74s/it]
    +
    +

    Настройка коллекции и индекса Milvus

    Мы настроим коллекцию Milvus и создадим индексы для векторных полей.

    +
    +
      +
    • Задание uri локального файла, например "./milvus.db", является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае в качестве uri используйте ури сервера, например http://localhost:19530.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +
    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# Connect to Milvus given URI
    +connections.connect(uri="./milvus.db")
    +
    +# Specify the data schema for the new Collection
    +fields = [
    +    # Use auto generated id as primary key
    +    FieldSchema(
    +        name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
    +    ),
    +    # Store the original text to retrieve based on semantically distance
    +    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),
    +    # Milvus now supports both sparse and dense vectors,
    +    # we can store each in a separate field to conduct hybrid search on both vectors
    +    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +]
    +schema = CollectionSchema(fields)
    +
    +# Create collection (drop the old one if exists)
    +col_name = "hybrid_demo"
    +if utility.has_collection(col_name):
    +    Collection(col_name).drop()
    +col = Collection(col_name, schema, consistency_level="Strong")
    +
    +# To make vector search efficient, we need to create indices for the vector fields
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +col.create_index("sparse_vector", sparse_index)
    +dense_index = {"index_type": "AUTOINDEX", "metric_type": "IP"}
    +col.create_index("dense_vector", dense_index)
    +col.load()
    +
    +

    Вставка данных в коллекцию Milvus

    Вставьте документы и их вкрапления в коллекцию.

    +
    # For efficiency, we insert 50 records in each small batch
    +for i in range(0, len(docs), 50):
    +    batched_entities = [
    +        docs[i : i + 50],
    +        docs_embeddings["sparse"][i : i + 50],
    +        docs_embeddings["dense"][i : i + 50],
    +    ]
    +    col.insert(batched_entities)
    +print("Number of entities inserted:", col.num_entities)
    +
    +
    Number of entities inserted: 502
    +
    +

    Введите поисковый запрос

    # Enter your search query
    +query = input("Enter your search query: ")
    +print(query)
    +
    +# Generate embeddings for the query
    +query_embeddings = ef([query])
    +# print(query_embeddings)
    +
    +
    How to start learning programming?
    +
    +

    Сначала мы подготовим несколько полезных функций для запуска поиска:

    +
      +
    • dense_search: только поиск по плотному векторному полю
    • +
    • sparse_search: поиск только по разреженному векторному полю
    • +
    • hybrid_search: поиск по плотному и векторному полю с взвешенным реранкером
    • +
    +
    from pymilvus import (
    +    AnnSearchRequest,
    +    WeightedRanker,
    +)
    +
    +
    +def dense_search(col, query_dense_embedding, limit=10):
    +    search_params = {"metric_type": "IP", "params": {}}
    +    res = col.search(
    +        [query_dense_embedding],
    +        anns_field="dense_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def sparse_search(col, query_sparse_embedding, limit=10):
    +    search_params = {
    +        "metric_type": "IP",
    +        "params": {},
    +    }
    +    res = col.search(
    +        [query_sparse_embedding],
    +        anns_field="sparse_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def hybrid_search(
    +    col,
    +    query_dense_embedding,
    +    query_sparse_embedding,
    +    sparse_weight=1.0,
    +    dense_weight=1.0,
    +    limit=10,
    +):
    +    dense_search_params = {"metric_type": "IP", "params": {}}
    +    dense_req = AnnSearchRequest(
    +        [query_dense_embedding], "dense_vector", dense_search_params, limit=limit
    +    )
    +    sparse_search_params = {"metric_type": "IP", "params": {}}
    +    sparse_req = AnnSearchRequest(
    +        [query_sparse_embedding], "sparse_vector", sparse_search_params, limit=limit
    +    )
    +    rerank = WeightedRanker(sparse_weight, dense_weight)
    +    res = col.hybrid_search(
    +        [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=["text"]
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +

    Запустим три разных поиска с заданными функциями:

    +
    dense_results = dense_search(col, query_embeddings["dense"][0])
    +sparse_results = sparse_search(col, query_embeddings["sparse"]._getrow(0))
    +hybrid_results = hybrid_search(
    +    col,
    +    query_embeddings["dense"][0],
    +    query_embeddings["sparse"]._getrow(0),
    +    sparse_weight=0.7,
    +    dense_weight=1.0,
    +)
    +
    +

    Отображение результатов поиска

    Чтобы отобразить результаты плотного, разреженного и гибридного поиска, нам понадобятся утилиты для форматирования результатов.

    +
    def doc_text_formatting(ef, query, docs):
    +    tokenizer = ef.model.tokenizer
    +    query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)
    +    query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)
    +    formatted_texts = []
    +
    +    for doc in docs:
    +        ldx = 0
    +        landmarks = []
    +        encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)
    +        tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])[1:-1]
    +        offsets = encoding["offset_mapping"][1:-1]
    +        for token, (start, end) in zip(tokens, offsets):
    +            if token in query_tokens:
    +                if len(landmarks) != 0 and start == landmarks[-1]:
    +                    landmarks[-1] = end
    +                else:
    +                    landmarks.append(start)
    +                    landmarks.append(end)
    +        close = False
    +        formatted_text = ""
    +        for i, c in enumerate(doc):
    +            if ldx == len(landmarks):
    +                pass
    +            elif i == landmarks[ldx]:
    +                if close:
    +                    formatted_text += "</span>"
    +                else:
    +                    formatted_text += "<span style='color:red'>"
    +                close = not close
    +                ldx = ldx + 1
    +            formatted_text += c
    +        if close is True:
    +            formatted_text += "</span>"
    +        formatted_texts.append(formatted_text)
    +    return formatted_texts
    +
    +

    Затем мы можем отобразить результаты поиска в виде текста с выделением:

    +
    from IPython.display import Markdown, display
    +
    +# Dense search results
    +display(Markdown("**Dense Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, dense_results)
    +for result in dense_results:
    +    display(Markdown(result))
    +
    +# Sparse search results
    +display(Markdown("\n**Sparse Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, sparse_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +# Hybrid search results
    +display(Markdown("\n**Hybrid Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, hybrid_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +

    Результаты плотного поиска:

    +

    Как лучше всего начать изучать робототехнику?

    +

    Как выучить такой компьютерный язык, как java?

    +

    Как начать изучать информационную безопасность?

    +

    Что такое программирование на Java? Как выучить язык программирования Java?

    +

    Как выучить компьютерную безопасность?

    +

    Как лучше всего начать заниматься робототехникой? Какая самая лучшая плата для разработки, чтобы я мог начать работать на ней?

    +

    Как научиться свободно говорить по-английски?

    +

    Каковы лучшие способы выучить французский язык?

    +

    Как сделать физику легкой для изучения?

    +

    Как подготовиться к UPSC?

    +

    Результаты разреженного поиска:

    +

    Что такое программирование на Java? Как выучить язык программирования Java?

    +

    С чего лучше всего начать изучение робототехники?

    +

    Что является альтернативой машинному обучению?

    +

    Как создать новый терминал и новую оболочку в Linux с помощью программирования на C?

    +

    Как создать новую оболочку в новом терминале с помощью программирования на C (терминал Linux)?

    +

    Какой бизнес лучше начать в Хайдарабаде?

    +

    Какой бизнес лучше начать в Хайдарабаде?

    +

    Как лучше всего начать заниматься робототехникой? Какая самая лучшая плата для разработки, чтобы я мог начать работать на ней?

    +

    Какая математика нужна новичку для понимания алгоритмов компьютерного программирования? Какие книги по алгоритмам подходят для новичков?

    +

    Как сделать так, чтобы жизнь устраивала вас и не позволяла издеваться над вами психически и эмоционально?

    +

    Результаты поиска по запросу Гибрид:

    +

    Как лучше всего начать заниматься робототехникой? Какая плата лучше для разработки, чтобы я мог начать работать на ней?

    +

    Что такое программирование на Java? Как выучить язык программирования Java?

    +

    Как лучше всего начать изучать робототехнику?

    +

    Как подготовиться к UPSC?

    +

    Как сделать физику легкой для изучения?

    +

    Каковы лучшие способы изучения французского языка?

    +

    Как научиться свободно говорить по-английски?

    +

    Как научиться компьютерной безопасности?

    +

    Как начать изучать информационную безопасность?

    +

    Как выучить такой компьютерный язык, как java?

    +

    Что является альтернативой машинному обучению?

    +

    Как создать новый терминал и новую оболочку в Linux с помощью программирования на C?

    +

    Как создать новую оболочку в новом терминале с помощью программирования на C (терминал Linux)?

    +

    Какой бизнес лучше начать в Хайдарабаде?

    +

    Какой бизнес лучше начать в Хайдарабаде?

    +

    Какая математика нужна новичку для понимания алгоритмов компьютерного программирования? Какие книги по алгоритмам подходят для начинающих?

    +

    Как сделать так, чтобы жизнь вас устраивала, и не дать жизни издеваться над вами психически и эмоционально?

    +

    Быстрое развертывание

    Чтобы узнать, как запустить онлайн-демонстрацию с помощью этого учебника, пожалуйста, обратитесь к примеру приложения.

    diff --git a/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.json b/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.json new file mode 100644 index 000000000..4e23c0f90 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Image Deduplication","anchorList":[{"label":"Дедупликация изображений","href":"Image-Deduplication","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.md b/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.md new file mode 100644 index 000000000..9bf973541 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/image_deduplication_system.md @@ -0,0 +1,35 @@ +--- +id: image_deduplication_system.md +summary: Создайте систему дедупликации изображений с помощью Milvus. +title: Дедупликация изображений +--- +

    Дедупликация изображений

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания системы дедупликации изображений.

    + +

    Используемые модели ML и стороннее программное обеспечение включают:

    + +

    В последние годы наблюдается экспоненциальный взрыв пользовательского контента. Люди могут мгновенно загрузить сделанную ими фотографию на платформу социальных сетей. Однако при таком изобилии данных об изображениях мы видим множество дублирующегося контента. Чтобы улучшить качество работы пользователей, эти дублирующиеся изображения необходимо удалять. Система дедупликации изображений избавляет нас от ручного труда, связанного с поочередным сравнением изображений в базе данных для выявления дубликатов. Выделить абсолютно идентичные изображения - задача совсем несложная. Однако иногда изображение может быть увеличено, обрезано, изменена яркость или шкала серого. Система дедупликации изображений должна выявить эти похожие изображения и удалить их.

    +

    В этом учебном пособии вы узнаете, как построить систему дедупликации изображений. В этом учебнике используется модель ResNet-50 для извлечения характеристик изображений и преобразования их в векторы. Затем эти векторы изображений сохраняются в векторной базе данных Milvus, и в ней же выполняется поиск векторного сходства.

    +

    + + Image_deduplication_workflow + Процесс_дедупликации_изображений

    diff --git a/localization/v2.5.x/site/ru/tutorials/image_similarity_search.json b/localization/v2.5.x/site/ru/tutorials/image_similarity_search.json new file mode 100644 index 000000000..70a51c6e8 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/image_similarity_search.json @@ -0,0 +1 @@ +{"codeList":["!wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip\n!unzip -q -o reverse_image_search.zip\n","$ pip install pymilvus --upgrade\n$ pip install timm\n","import torch\nfrom PIL import Image\nimport timm\nfrom sklearn.preprocessing import normalize\nfrom timm.data import resolve_data_config\nfrom timm.data.transforms_factory import create_transform\n\n\nclass FeatureExtractor:\n def __init__(self, modelname):\n # Load the pre-trained model\n self.model = timm.create_model(\n modelname, pretrained=True, num_classes=0, global_pool=\"avg\"\n )\n self.model.eval()\n\n # Get the input size required by the model\n self.input_size = self.model.default_cfg[\"input_size\"]\n\n config = resolve_data_config({}, model=modelname)\n # Get the preprocessing function provided by TIMM for the model\n self.preprocess = create_transform(**config)\n\n def __call__(self, imagepath):\n # Preprocess the input image\n input_image = Image.open(imagepath).convert(\"RGB\") # Convert to RGB if needed\n input_image = self.preprocess(input_image)\n\n # Convert the image to a PyTorch tensor and add a batch dimension\n input_tensor = input_image.unsqueeze(0)\n\n # Perform inference\n with torch.no_grad():\n output = self.model(input_tensor)\n\n # Extract the feature vector\n feature_vector = output.squeeze().numpy()\n\n return normalize(feature_vector.reshape(1, -1), norm=\"l2\").flatten()\n","from pymilvus import MilvusClient\n\n# Set up a Milvus client\nclient = MilvusClient(uri=\"example.db\")\n# Create a collection in quick setup mode\nif client.has_collection(collection_name=\"image_embeddings\"):\n client.drop_collection(collection_name=\"image_embeddings\")\nclient.create_collection(\n collection_name=\"image_embeddings\",\n vector_field_name=\"vector\",\n dimension=512,\n auto_id=True,\n enable_dynamic_field=True,\n metric_type=\"COSINE\",\n)\n","import os\n\nextractor = FeatureExtractor(\"resnet34\")\n\nroot = \"./train\"\ninsert = True\nif insert is True:\n for dirpath, foldername, filenames in os.walk(root):\n for filename in filenames:\n if filename.endswith(\".JPEG\"):\n filepath = dirpath + \"/\" + filename\n image_embedding = extractor(filepath)\n client.insert(\n \"image_embeddings\",\n {\"vector\": image_embedding, \"filename\": filepath},\n )\n","from IPython.display import display\n\nquery_image = \"./test/Afghan_hound/n02088094_4261.JPEG\"\n\nresults = client.search(\n \"image_embeddings\",\n data=[extractor(query_image)],\n output_fields=[\"filename\"],\n search_params={\"metric_type\": \"COSINE\"},\n)\nimages = []\nfor result in results:\n for hit in result[:10]:\n filename = hit[\"entity\"][\"filename\"]\n img = Image.open(filename)\n img = img.resize((150, 150))\n images.append(img)\n\nwidth = 150 * 5\nheight = 150 * 2\nconcatenated_image = Image.new(\"RGB\", (width, height))\n\nfor idx, img in enumerate(images):\n x = idx % 5\n y = idx // 5\n concatenated_image.paste(img, (x * 150, y * 150))\ndisplay(\"query\")\ndisplay(Image.open(query_image).resize((150, 150)))\ndisplay(\"results\")\ndisplay(concatenated_image)\n"],"headingContent":"Image Search with Milvus","anchorList":[{"label":"Поиск изображений с помощью Milvus","href":"Image-Search-with-Milvus","type":1,"isActive":false},{"label":"Подготовка набора данных","href":"Dataset-Preparation","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prequisites","type":2,"isActive":false},{"label":"Определение экстрактора функций","href":"Define-the-Feature-Extractor","type":2,"isActive":false},{"label":"Создайте коллекцию Milvus","href":"Create-a-Milvus-Collection","type":2,"isActive":false},{"label":"Вставка эмбеддингов в Milvus","href":"Insert-the-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"Быстрое развертывание","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/image_similarity_search.md b/localization/v2.5.x/site/ru/tutorials/image_similarity_search.md new file mode 100644 index 000000000..f9075dcb3 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/image_similarity_search.md @@ -0,0 +1,263 @@ +--- +id: image_similarity_search.md +summary: поиск изображений с помощью Milvus +title: Поиск изображений с помощью Milvus +--- +

    Поиск изображений с помощью Milvus

    Open In Colab +GitHub Repository

    +

    +

    В этом блокноте мы покажем вам, как использовать Milvus для поиска похожих изображений в наборе данных. Для демонстрации этого мы будем использовать подмножество набора данных ImageNet, а затем искать изображение афганской борзой.

    +

    Подготовка набора данных

    Сначала нам нужно загрузить набор данных и извлечь его для дальнейшей обработки.

    +
    !wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
    +!unzip -q -o reverse_image_search.zip
    +
    +

    Предварительные условия

    Чтобы запустить этот блокнот, необходимо установить следующие зависимости:

    +
      +
    • pymilvus>=2.4.2
    • +
    • timm
    • +
    • torch
    • +
    • numpy
    • +
    • sklearn
    • +
    • pillow
    • +
    +

    Чтобы запустить Colab, мы предоставили удобные команды для установки необходимых зависимостей.

    +
    $ pip install pymilvus --upgrade
    +$ pip install timm
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей вам, возможно, потребуется перезапустить среду выполнения. (Нажмите на меню "Время выполнения" в верхней части экрана и выберите "Перезапустить сессию" из выпадающего меню).

    +
    +

    Определение экстрактора функций

    Затем нам нужно определить экстрактор признаков, который извлекает вкрапления из изображения, используя модель ResNet-34 от timm.

    +
    import torch
    +from PIL import Image
    +import timm
    +from sklearn.preprocessing import normalize
    +from timm.data import resolve_data_config
    +from timm.data.transforms_factory import create_transform
    +
    +
    +class FeatureExtractor:
    +    def __init__(self, modelname):
    +        # Load the pre-trained model
    +        self.model = timm.create_model(
    +            modelname, pretrained=True, num_classes=0, global_pool="avg"
    +        )
    +        self.model.eval()
    +
    +        # Get the input size required by the model
    +        self.input_size = self.model.default_cfg["input_size"]
    +
    +        config = resolve_data_config({}, model=modelname)
    +        # Get the preprocessing function provided by TIMM for the model
    +        self.preprocess = create_transform(**config)
    +
    +    def __call__(self, imagepath):
    +        # Preprocess the input image
    +        input_image = Image.open(imagepath).convert("RGB")  # Convert to RGB if needed
    +        input_image = self.preprocess(input_image)
    +
    +        # Convert the image to a PyTorch tensor and add a batch dimension
    +        input_tensor = input_image.unsqueeze(0)
    +
    +        # Perform inference
    +        with torch.no_grad():
    +            output = self.model(input_tensor)
    +
    +        # Extract the feature vector
    +        feature_vector = output.squeeze().numpy()
    +
    +        return normalize(feature_vector.reshape(1, -1), norm="l2").flatten()
    +
    +

    Создайте коллекцию Milvus

    Затем нам нужно создать коллекцию Milvus для хранения вкраплений изображений.

    +
    from pymilvus import MilvusClient
    +
    +# Set up a Milvus client
    +client = MilvusClient(uri="example.db")
    +# Create a collection in quick setup mode
    +if client.has_collection(collection_name="image_embeddings"):
    +    client.drop_collection(collection_name="image_embeddings")
    +client.create_collection(
    +    collection_name="image_embeddings",
    +    vector_field_name="vector",
    +    dimension=512,
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +    metric_type="COSINE",
    +)
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Вставка эмбеддингов в Milvus

    Мы извлечем вкрапления каждого изображения с помощью модели ResNet34 и вставим изображения из обучающего набора в Milvus.

    +
    import os
    +
    +extractor = FeatureExtractor("resnet34")
    +
    +root = "./train"
    +insert = True
    +if insert is True:
    +    for dirpath, foldername, filenames in os.walk(root):
    +        for filename in filenames:
    +            if filename.endswith(".JPEG"):
    +                filepath = dirpath + "/" + filename
    +                image_embedding = extractor(filepath)
    +                client.insert(
    +                    "image_embeddings",
    +                    {"vector": image_embedding, "filename": filepath},
    +                )
    +
    +
    from IPython.display import display
    +
    +query_image = "./test/Afghan_hound/n02088094_4261.JPEG"
    +
    +results = client.search(
    +    "image_embeddings",
    +    data=[extractor(query_image)],
    +    output_fields=["filename"],
    +    search_params={"metric_type": "COSINE"},
    +)
    +images = []
    +for result in results:
    +    for hit in result[:10]:
    +        filename = hit["entity"]["filename"]
    +        img = Image.open(filename)
    +        img = img.resize((150, 150))
    +        images.append(img)
    +
    +width = 150 * 5
    +height = 150 * 2
    +concatenated_image = Image.new("RGB", (width, height))
    +
    +for idx, img in enumerate(images):
    +    x = idx % 5
    +    y = idx // 5
    +    concatenated_image.paste(img, (x * 150, y * 150))
    +display("query")
    +display(Image.open(query_image).resize((150, 150)))
    +display("results")
    +display(concatenated_image)
    +
    +
    'query'
    +
    +

    + + png + png

    +
    'results'
    +
    +

    + + Results + Результаты

    +

    Мы видим, что большинство изображений относятся к той же категории, что и поисковое изображение - афганская борзая. Это означает, что мы нашли изображения, схожие с поисковым изображением.

    +

    Быстрое развертывание

    Чтобы узнать, как запустить онлайн-демонстрацию с помощью этого руководства, пожалуйста, обратитесь к примеру приложения.

    diff --git a/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.json new file mode 100644 index 000000000..412de54ef --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install openai pymilvus datasets tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","COLLECTION_NAME = \"movie_search\"\nDIMENSION = 1536\n\nBATCH_SIZE = 1000\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Database\nclient = MilvusClient(\"./milvus_demo.db\")\n","# Remove collection if it already exists\nif client.has_collection(COLLECTION_NAME):\n client.drop_collection(COLLECTION_NAME)\n","from pymilvus import DataType\n\n# Create collection which includes the id, title, and embedding.\n\n# 1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=False,\n)\n\n# 2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"type\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"release_year\", datatype=DataType.INT64)\nschema.add_field(field_name=\"rating\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"description\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n\n# 3. Create collection with the schema\nclient.create_collection(collection_name=COLLECTION_NAME, schema=schema)\n","# Create the index on the collection and load it.\n\n# 1. Prepare index parameters\nindex_params = client.prepare_index_params()\n\n\n# 2. Add an index on the embedding field\nindex_params.add_index(\n field_name=\"embedding\", metric_type=\"IP\", index_type=\"AUTOINDEX\", params={}\n)\n\n\n# 3. Create index\nclient.create_index(collection_name=COLLECTION_NAME, index_params=index_params)\n\n\n# 4. Load collection\nclient.load_collection(collection_name=COLLECTION_NAME, replica_number=1)\n","from datasets import load_dataset\n\ndataset = load_dataset(\"hugginglearners/netflix-shows\", split=\"train\")\n","def emb_texts(texts):\n res = openai_client.embeddings.create(input=texts, model=\"text-embedding-3-small\")\n return [res_data.embedding for res_data in res.data]\n","from tqdm import tqdm\n\n# batch (data to be inserted) is a list of dictionaries\nbatch = []\n\n# Embed and insert in batches\nfor i in tqdm(range(0, len(dataset))):\n batch.append(\n {\n \"title\": dataset[i][\"title\"] or \"\",\n \"type\": dataset[i][\"type\"] or \"\",\n \"release_year\": dataset[i][\"release_year\"] or -1,\n \"rating\": dataset[i][\"rating\"] or \"\",\n \"description\": dataset[i][\"description\"] or \"\",\n }\n )\n\n if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:\n embeddings = emb_texts([item[\"description\"] for item in batch])\n\n for item, emb in zip(batch, embeddings):\n item[\"embedding\"] = emb\n\n client.insert(collection_name=COLLECTION_NAME, data=batch)\n batch = []\n","import textwrap\n\n\ndef query(query, top_k=5):\n text, expr = query\n\n res = client.search(\n collection_name=COLLECTION_NAME,\n data=emb_texts(text),\n filter=expr,\n limit=top_k,\n output_fields=[\"title\", \"type\", \"release_year\", \"rating\", \"description\"],\n search_params={\n \"metric_type\": \"IP\",\n \"params\": {},\n },\n )\n\n print(\"Description:\", text, \"Expression:\", expr)\n\n for hit_group in res:\n print(\"Results:\")\n for rank, hit in enumerate(hit_group, start=1):\n entity = hit[\"entity\"]\n\n print(\n f\"\\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}\"\n )\n print(\n f\"\\t\\tType: {entity.get('type', '')} \"\n f\"Release Year: {entity.get('release_year', '')} \"\n f\"Rating: {entity.get('rating', '')}\"\n )\n description = entity.get(\"description\", \"\")\n print(textwrap.fill(description, width=88))\n print()\n\n\nmy_query = (\"movie about a fluffly animal\", 'release_year < 2019 and rating like \"PG%\"')\n\nquery(my_query)\n"],"headingContent":"Movie Recommendation with Milvus","anchorList":[{"label":"Рекомендация фильмов с помощью Milvus","href":"Movie-Recommendation-with-Milvus","type":1,"isActive":false},{"label":"Зависимости и окружение","href":"Dependencies-and-Environment","type":2,"isActive":false},{"label":"Инициализация клиента OpenAI и Milvus","href":"Initialize-OpenAI-client-and-Milvus","type":2,"isActive":false},{"label":"Набор данных","href":"Dataset","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-the-Data","type":2,"isActive":false},{"label":"Запрос к базе данных","href":"Query-the-Database","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.md new file mode 100644 index 000000000..477735bf2 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/movie_recommendation_with_milvus.md @@ -0,0 +1,299 @@ +--- +id: movie_recommendation_with_milvus.md +summary: >- + В этом блокноте мы рассмотрим, как генерировать вкрапления описаний фильмов с + помощью OpenAI и использовать эти вкрапления в Milvus, чтобы рекомендовать + фильмы, соответствующие вашим предпочтениям. Чтобы улучшить результаты поиска, + мы будем использовать фильтрацию для выполнения поиска по метаданным. Набор + данных, используемый в этом примере, взят из HuggingFace datasets и содержит + более 8 000 записей о фильмах, что обеспечивает богатый выбор вариантов для + рекомендаций фильмов. +title: Рекомендация фильмов с помощью Milvus +--- +

    Рекомендация фильмов с помощью Milvus

    +Open In Colab + + +GitHub Repository +

    +

    В этом блокноте мы рассмотрим, как генерировать вкрапления описаний фильмов с помощью OpenAI и использовать эти вкрапления в Milvus для рекомендации фильмов, соответствующих вашим предпочтениям. Чтобы улучшить результаты поиска, мы будем использовать фильтрацию для поиска по метаданным. Набор данных, используемый в этом примере, взят из HuggingFace datasets и содержит более 8 000 записей о фильмах, что обеспечивает богатый выбор вариантов для рекомендаций фильмов.

    +

    Зависимости и окружение

    Вы можете установить зависимости, выполнив следующую команду:

    +
    $ pip install openai pymilvus datasets tqdm
    +
    +
    +

    Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).

    +

    В этом примере мы будем использовать OpenAI в качестве LLM. Вам следует подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Инициализация клиента OpenAI и Milvus

    Инициализируйте клиент OpenAI.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Задайте имя коллекции и размер для вкраплений.

    +
    COLLECTION_NAME = "movie_search"
    +DIMENSION = 1536
    +
    +BATCH_SIZE = 1000
    +
    +

    Подключитесь к Milvus.

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Database
    +client = MilvusClient("./milvus_demo.db")
    +
    +
    +

    Как и в случае с аргументами url и token:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +
    # Remove collection if it already exists
    +if client.has_collection(COLLECTION_NAME):
    +    client.drop_collection(COLLECTION_NAME)
    +
    +

    Определите поля для коллекции, которые включают в себя id, название, тип, год выпуска, рейтинг и описание.

    +
    from pymilvus import DataType
    +
    +# Create collection which includes the id, title, and embedding.
    +
    +# 1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=False,
    +)
    +
    +# 2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="type", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="release_year", datatype=DataType.INT64)
    +schema.add_field(field_name="rating", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +# 3. Create collection with the schema
    +client.create_collection(collection_name=COLLECTION_NAME, schema=schema)
    +
    +

    Создайте индекс для коллекции и загрузите его.

    +
    # Create the index on the collection and load it.
    +
    +# 1. Prepare index parameters
    +index_params = client.prepare_index_params()
    +
    +
    +# 2. Add an index on the embedding field
    +index_params.add_index(
    +    field_name="embedding", metric_type="IP", index_type="AUTOINDEX", params={}
    +)
    +
    +
    +# 3. Create index
    +client.create_index(collection_name=COLLECTION_NAME, index_params=index_params)
    +
    +
    +# 4. Load collection
    +client.load_collection(collection_name=COLLECTION_NAME, replica_number=1)
    +
    +

    Набор данных

    Запустив Milvus, мы можем приступить к захвату данных. Hugging Face Datasets - это хаб, в котором хранится множество различных пользовательских наборов данных, и для этого примера мы используем набор данных netflix-shows от HuggingLearners. В этом наборе содержатся фильмы и пары метаданных к ним для более чем 8 тысяч фильмов. Мы собираемся вставить каждое описание и хранить его в Milvus вместе с названием, типом, годом выпуска и рейтингом.

    +
    from datasets import load_dataset
    +
    +dataset = load_dataset("hugginglearners/netflix-shows", split="train")
    +
    +

    Вставка данных

    Теперь, когда у нас есть данные на машине, мы можем приступить к их встраиванию и вставке в Milvus. Функция встраивания принимает текст и возвращает вложенные данные в виде списка.

    +
    def emb_texts(texts):
    +    res = openai_client.embeddings.create(input=texts, model="text-embedding-3-small")
    +    return [res_data.embedding for res_data in res.data]
    +
    +

    На следующем этапе происходит собственно вставка. Мы перебираем все записи и создаем партии, которые вставляем, как только достигнем заданного размера партии. После завершения цикла мы вставляем последнюю оставшуюся партию, если она существует.

    +
    from tqdm import tqdm
    +
    +# batch (data to be inserted) is a list of dictionaries
    +batch = []
    +
    +# Embed and insert in batches
    +for i in tqdm(range(0, len(dataset))):
    +    batch.append(
    +        {
    +            "title": dataset[i]["title"] or "",
    +            "type": dataset[i]["type"] or "",
    +            "release_year": dataset[i]["release_year"] or -1,
    +            "rating": dataset[i]["rating"] or "",
    +            "description": dataset[i]["description"] or "",
    +        }
    +    )
    +
    +    if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:
    +        embeddings = emb_texts([item["description"] for item in batch])
    +
    +        for item, emb in zip(batch, embeddings):
    +            item["embedding"] = emb
    +
    +        client.insert(collection_name=COLLECTION_NAME, data=batch)
    +        batch = []
    +
    +

    Запрос к базе данных

    Теперь, когда наши данные надежно вставлены в Milvus, мы можем выполнить запрос. Запрос содержит кортеж описания фильма, который вы ищете, и фильтр, который нужно использовать. Более подробную информацию о фильтре можно найти здесь. Сначала поиск выводит описание и выражение фильтра. После этого для каждого результата мы выводим оценку, название, тип, год выпуска, рейтинг и описание фильма.

    +
    import textwrap
    +
    +
    +def query(query, top_k=5):
    +    text, expr = query
    +
    +    res = client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=emb_texts(text),
    +        filter=expr,
    +        limit=top_k,
    +        output_fields=["title", "type", "release_year", "rating", "description"],
    +        search_params={
    +            "metric_type": "IP",
    +            "params": {},
    +        },
    +    )
    +
    +    print("Description:", text, "Expression:", expr)
    +
    +    for hit_group in res:
    +        print("Results:")
    +        for rank, hit in enumerate(hit_group, start=1):
    +            entity = hit["entity"]
    +
    +            print(
    +                f"\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}"
    +            )
    +            print(
    +                f"\t\tType: {entity.get('type', '')} "
    +                f"Release Year: {entity.get('release_year', '')} "
    +                f"Rating: {entity.get('rating', '')}"
    +            )
    +            description = entity.get("description", "")
    +            print(textwrap.fill(description, width=88))
    +            print()
    +
    +
    +my_query = ("movie about a fluffly animal", 'release_year < 2019 and rating like "PG%"')
    +
    +query(my_query)
    +
    +
    Description: movie about a fluffly animal Expression: release_year < 2019 and rating like "PG%"
    +Results:
    +    Rank: 1 Score: 0.42213767766952515 Title: The Adventures of Tintin
    +        Type: Movie Release Year: 2011 Rating: PG
    +This 3-D motion capture adapts Georges Remi's classic comic strip about the adventures
    +of fearless young journalist Tintin and his trusty dog, Snowy.
    +
    +    Rank: 2 Score: 0.4041026830673218 Title: Hedgehogs
    +        Type: Movie Release Year: 2016 Rating: PG
    +When a hedgehog suffering from memory loss forgets his identity, he ends up on a big
    +city journey with a pigeon to save his habitat from a human threat.
    +
    +    Rank: 3 Score: 0.3980264663696289 Title: Osmosis Jones
    +        Type: Movie Release Year: 2001 Rating: PG
    +Peter and Bobby Farrelly outdo themselves with this partially animated tale about an
    +out-of-shape 40-year-old man who's the host to various organisms.
    +
    +    Rank: 4 Score: 0.39479154348373413 Title: The Lamb
    +        Type: Movie Release Year: 2017 Rating: PG
    +A big-dreaming donkey escapes his menial existence and befriends some free-spirited
    +animal pals in this imaginative retelling of the Nativity Story.
    +
    +    Rank: 5 Score: 0.39370301365852356 Title: Open Season 2
    +        Type: Movie Release Year: 2008 Rating: PG
    +Elliot the buck and his forest-dwelling cohorts must rescue their dachshund pal from
    +some spoiled pets bent on returning him to domesticity.
    +
    diff --git a/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.json new file mode 100644 index 000000000..a5e7b432f --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm\n","$ git clone https://github.com/FlagOpen/FlagEmbedding.git\n$ pip install -e FlagEmbedding\n","$ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz\n$ tar -xzf amazon_reviews_2023_subset.tar.gz\n","$ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth\n","import torch\nfrom FlagEmbedding.visual.modeling import Visualized_BGE\n\n\nclass Encoder:\n def __init__(self, model_name: str, model_path: str):\n self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)\n self.model.eval()\n\n def encode_query(self, image_path: str, text: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path, text=text)\n return query_emb.tolist()[0]\n\n def encode_image(self, image_path: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path)\n return query_emb.tolist()[0]\n\n\nmodel_name = \"BAAI/bge-base-en-v1.5\"\nmodel_path = \"./Visualized_base_en_v1.5.pth\" # Change to your own value if using a different model path\nencoder = Encoder(model_name, model_path)\n","import os\nfrom tqdm import tqdm\nfrom glob import glob\n\n\n# Generate embeddings for the image dataset\ndata_dir = (\n \"./images_folder\" # Change to your own value if using a different data directory\n)\nimage_list = glob(\n os.path.join(data_dir, \"images\", \"*.jpg\")\n) # We will only use images ending with \".jpg\"\nimage_dict = {}\nfor image_path in tqdm(image_list, desc=\"Generating image embeddings: \"):\n try:\n image_dict[image_path] = encoder.encode_image(image_path)\n except Exception as e:\n print(f\"Failed to generate embedding for {image_path}. Skipped.\")\n continue\nprint(\"Number of encoded images:\", len(image_dict))\n","from pymilvus import MilvusClient\n\n\ndim = len(list(image_dict.values())[0])\ncollection_name = \"multimodal_rag_demo\"\n\n# Connect to Milvus client given URI\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\n# Create Milvus Collection\n# By default, vector field name is \"vector\"\nmilvus_client.create_collection(\n collection_name=collection_name,\n auto_id=True,\n dimension=dim,\n enable_dynamic_field=True,\n)\n\n# Insert data into collection\nmilvus_client.insert(\n collection_name=collection_name,\n data=[{\"image_path\": k, \"vector\": v} for k, v in image_dict.items()],\n)\n","query_image = os.path.join(\n data_dir, \"leopard.jpg\"\n) # Change to your own query image path\nquery_text = \"phone case with this image theme\"\n\n# Generate query embedding given image and text instructions\nquery_vec = encoder.encode_query(image_path=query_image, text=query_text)\n\nsearch_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vec],\n output_fields=[\"image_path\"],\n limit=9, # Max number of search results to return\n search_params={\"metric_type\": \"COSINE\", \"params\": {}}, # Search parameters\n)[0]\n\nretrieved_images = [hit.get(\"entity\").get(\"image_path\") for hit in search_results]\nprint(retrieved_images)\n","import numpy as np\nimport cv2\n\nimg_height = 300\nimg_width = 300\nrow_count = 3\n\n\ndef create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:\n \"\"\"\n creates a 5x5 panoramic view image from a list of images\n\n args:\n images: list of images to be combined\n\n returns:\n np.ndarray: the panoramic view image\n \"\"\"\n panoramic_width = img_width * row_count\n panoramic_height = img_height * row_count\n panoramic_image = np.full(\n (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8\n )\n\n # create and resize the query image with a blue border\n query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)\n query_image = Image.open(query_image_path).convert(\"RGB\")\n query_array = np.array(query_image)[:, :, ::-1]\n resized_image = cv2.resize(query_array, (img_width, img_height))\n\n border_size = 10\n blue = (255, 0, 0) # blue color in BGR\n bordered_query_image = cv2.copyMakeBorder(\n resized_image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=blue,\n )\n\n query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(\n bordered_query_image, (img_width, img_height)\n )\n\n # add text \"query\" below the query image\n text = \"query\"\n font_scale = 1\n font_thickness = 2\n text_org = (10, img_height * 3 + 30)\n cv2.putText(\n query_image_null,\n text,\n text_org,\n cv2.FONT_HERSHEY_SIMPLEX,\n font_scale,\n blue,\n font_thickness,\n cv2.LINE_AA,\n )\n\n # combine the rest of the images into the panoramic view\n retrieved_imgs = [\n np.array(Image.open(img).convert(\"RGB\"))[:, :, ::-1] for img in retrieved_images\n ]\n for i, image in enumerate(retrieved_imgs):\n image = cv2.resize(image, (img_width - 4, img_height - 4))\n row = i // row_count\n col = i % row_count\n start_row = row * img_height\n start_col = col * img_width\n\n border_size = 2\n bordered_image = cv2.copyMakeBorder(\n image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=(0, 0, 0),\n )\n panoramic_image[\n start_row : start_row + img_height, start_col : start_col + img_width\n ] = bordered_image\n\n # add red index numbers to each image\n text = str(i)\n org = (start_col + 50, start_row + 30)\n (font_width, font_height), baseline = cv2.getTextSize(\n text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2\n )\n\n top_left = (org[0] - 48, start_row + 2)\n bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)\n\n cv2.rectangle(\n panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED\n )\n cv2.putText(\n panoramic_image,\n text,\n (start_col + 10, start_row + 30),\n cv2.FONT_HERSHEY_SIMPLEX,\n 1,\n (0, 0, 255),\n 2,\n cv2.LINE_AA,\n )\n\n # combine the query image with the panoramic view\n panoramic_image = np.hstack([query_image_null, panoramic_image])\n return panoramic_image\n","from PIL import Image\n\ncombined_image_path = os.path.join(data_dir, \"combined_image.jpg\")\npanoramic_image = create_panoramic_view(query_image, retrieved_images)\ncv2.imwrite(combined_image_path, panoramic_image)\n\ncombined_image = Image.open(combined_image_path)\nshow_combined_image = combined_image.resize((300, 300))\nshow_combined_image.show()\n","import requests\nimport base64\n\nopenai_api_key = \"sk-***\" # Change to your OpenAI API Key\n\n\ndef generate_ranking_explanation(\n combined_image_path: str, caption: str, infos: dict = None\n) -> tuple[list[int], str]:\n with open(combined_image_path, \"rb\") as image_file:\n base64_image = base64.b64encode(image_file.read()).decode(\"utf-8\")\n\n information = (\n \"You are responsible for ranking results for a Composed Image Retrieval. \"\n \"The user retrieves an image with an 'instruction' indicating their retrieval intent. \"\n \"For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. \"\n \"Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. \"\n f\"User instruction: {caption} \\n\\n\"\n )\n\n # add additional information for each image\n if infos:\n for i, info in enumerate(infos[\"product\"]):\n information += f\"{i}. {info}\\n\"\n\n information += (\n \"Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. \"\n \"The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent.\"\n )\n\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\",\n }\n\n payload = {\n \"model\": \"gpt-4o\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": information},\n {\n \"type\": \"image_url\",\n \"image_url\": {\"url\": f\"data:image/jpeg;base64,{base64_image}\"},\n },\n ],\n }\n ],\n \"max_tokens\": 300,\n }\n\n response = requests.post(\n \"https://api.openai.com/v1/chat/completions\", headers=headers, json=payload\n )\n result = response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n # parse the ranked indices from the response\n start_idx = result.find(\"[\")\n end_idx = result.find(\"]\")\n ranked_indices_str = result[start_idx + 1 : end_idx].split(\",\")\n ranked_indices = [int(index.strip()) for index in ranked_indices_str]\n\n # extract explanation\n explanation = result[end_idx + 1 :].strip()\n\n return ranked_indices, explanation\n","ranked_indices, explanation = generate_ranking_explanation(\n combined_image_path, query_text\n)\n","print(explanation)\n\nbest_index = ranked_indices[0]\nbest_img = Image.open(retrieved_images[best_index])\nbest_img = best_img.resize((150, 150))\nbest_img.show()\n"],"headingContent":"Multimodal RAG with Milvus","anchorList":[{"label":"Мультимодальный RAG с Milvus","href":"Multimodal-RAG-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Загрузка данных","href":"Load-Data","type":2,"isActive":false},{"label":"Мультимодальный поиск с генеративным реранкером","href":"Multimodal-Search-with-Generative-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.md new file mode 100644 index 000000000..45e1ef0f0 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/multimodal_rag_with_milvus.md @@ -0,0 +1,424 @@ +--- +id: multimodal_rag_with_milvus.md +summary: Мультимодальный RAG с Milvus +title: Мультимодальный RAG с Milvus +--- +

    Мультимодальный RAG с Milvus

    Open In Colab +GitHub Repository

    +

    +

    В этом учебном пособии демонстрируется мультимодальная система RAG на базе Milvus, визуализированной модели BGE и GPT-4o. В этой системе пользователи могут загружать изображения и редактировать текстовые инструкции, которые обрабатываются составленной BGE моделью поиска для поиска изображений-кандидатов. Затем GPT-4o выступает в роли реранкера, выбирая наиболее подходящее изображение и обосновывая свой выбор. Эта мощная комбинация обеспечивает бесперебойный и интуитивно понятный поиск изображений, используя Milvus для эффективного поиска, модель BGE для точной обработки и сопоставления изображений и GPT-4o для расширенного реранкинга.

    +

    Подготовка

    Установите зависимости

    $ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm
    +
    +
    $ git clone https://github.com/FlagOpen/FlagEmbedding.git
    +$ pip install -e FlagEmbedding
    +
    +
    +

    Если вы используете Google Colab, для включения только что установленных зависимостей может потребоваться перезапуск среды выполнения (нажмите на меню "Время выполнения" в верхней части экрана и выберите "Перезапустить сессию" из выпадающего меню).

    +
    +

    Загрузить данные

    Следующая команда загрузит данные примера и распакует их в локальную папку "./images_folder":

    +
      +
    • изображения: Подмножество Amazon Reviews 2023, содержащее около 900 изображений из категорий "Appliance", "Cell_Phones_and_Accessories" и "Electronics".

    • +
    • leopard.jpg: пример изображения для запроса.

    • +
    +
    $ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz
    +$ tar -xzf amazon_reviews_2023_subset.tar.gz
    +
    +

    Модель встраивания нагрузки

    Мы будем использовать модель Visualized BGE "bge-visualized-base-en-v1.5" для генерации вкраплений как для изображений, так и для текста.

    +

    1. Загрузить вес

    +
    $ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth
    +
    +

    2. Построить кодировщик

    +
    import torch
    +from FlagEmbedding.visual.modeling import Visualized_BGE
    +
    +
    +class Encoder:
    +    def __init__(self, model_name: str, model_path: str):
    +        self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)
    +        self.model.eval()
    +
    +    def encode_query(self, image_path: str, text: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path, text=text)
    +        return query_emb.tolist()[0]
    +
    +    def encode_image(self, image_path: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path)
    +        return query_emb.tolist()[0]
    +
    +
    +model_name = "BAAI/bge-base-en-v1.5"
    +model_path = "./Visualized_base_en_v1.5.pth"  # Change to your own value if using a different model path
    +encoder = Encoder(model_name, model_path)
    +
    +

    Загрузка данных

    В этом разделе мы загрузим в базу данных примеры изображений с соответствующими вкраплениями.

    +

    Генерация вкраплений

    Загрузите все jpeg-изображения из каталога данных и примените кодировщик для преобразования изображений во вкрапления.

    +
    import os
    +from tqdm import tqdm
    +from glob import glob
    +
    +
    +# Generate embeddings for the image dataset
    +data_dir = (
    +    "./images_folder"  # Change to your own value if using a different data directory
    +)
    +image_list = glob(
    +    os.path.join(data_dir, "images", "*.jpg")
    +)  # We will only use images ending with ".jpg"
    +image_dict = {}
    +for image_path in tqdm(image_list, desc="Generating image embeddings: "):
    +    try:
    +        image_dict[image_path] = encoder.encode_image(image_path)
    +    except Exception as e:
    +        print(f"Failed to generate embedding for {image_path}. Skipped.")
    +        continue
    +print("Number of encoded images:", len(image_dict))
    +
    +
    Generating image embeddings: 100%|██████████| 900/900 [00:20<00:00, 44.08it/s]
    +
    +Number of encoded images: 900
    +
    +

    Вставка в Milvus

    Вставка изображений с соответствующими путями и вкраплениями в коллекцию Milvus.

    +
    +

    Как и в случае с аргументом MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например ./milvus_demo.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +
    from pymilvus import MilvusClient
    +
    +
    +dim = len(list(image_dict.values())[0])
    +collection_name = "multimodal_rag_demo"
    +
    +# Connect to Milvus client given URI
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +# Create Milvus Collection
    +# By default, vector field name is "vector"
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    auto_id=True,
    +    dimension=dim,
    +    enable_dynamic_field=True,
    +)
    +
    +# Insert data into collection
    +milvus_client.insert(
    +    collection_name=collection_name,
    +    data=[{"image_path": k, "vector": v} for k, v in image_dict.items()],
    +)
    +
    +
    {'insert_count': 900,
    + 'ids': [451537887696781312, 451537887696781313, ..., 451537887696782211],
    + 'cost': 0}
    +
    +

    Мультимодальный поиск с генеративным реранкером

    В этом разделе мы сначала выполним поиск релевантных изображений по мультимодальному запросу, а затем воспользуемся сервисом LLM для ранжирования результатов и поиска лучшего из них с объяснением.

    +

    Теперь мы готовы выполнить расширенный поиск изображений с данными запроса, состоящими из изображений и текстовых инструкций.

    +
    query_image = os.path.join(
    +    data_dir, "leopard.jpg"
    +)  # Change to your own query image path
    +query_text = "phone case with this image theme"
    +
    +# Generate query embedding given image and text instructions
    +query_vec = encoder.encode_query(image_path=query_image, text=query_text)
    +
    +search_results = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[query_vec],
    +    output_fields=["image_path"],
    +    limit=9,  # Max number of search results to return
    +    search_params={"metric_type": "COSINE", "params": {}},  # Search parameters
    +)[0]
    +
    +retrieved_images = [hit.get("entity").get("image_path") for hit in search_results]
    +print(retrieved_images)
    +
    +
    ['./images_folder/images/518Gj1WQ-RL._AC_.jpg', './images_folder/images/41n00AOfWhL._AC_.jpg', './images_folder/images/51Wqge9HySL._AC_.jpg', './images_folder/images/51R2SZiywnL._AC_.jpg', './images_folder/images/516PebbMAcL._AC_.jpg', './images_folder/images/51RrgfYKUfL._AC_.jpg', './images_folder/images/515DzQVKKwL._AC_.jpg', './images_folder/images/51BsgVw6RhL._AC_.jpg', './images_folder/images/51INtcXu9FL._AC_.jpg']
    +
    +

    Ранжирование с помощью GPT-4o

    Мы будем использовать LLM для ранжирования изображений и генерирования объяснения для лучшего результата на основе запроса пользователя и полученных результатов.

    +

    1. Создание панорамного вида

    +
    import numpy as np
    +import cv2
    +
    +img_height = 300
    +img_width = 300
    +row_count = 3
    +
    +
    +def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:
    +    """
    +    creates a 5x5 panoramic view image from a list of images
    +
    +    args:
    +        images: list of images to be combined
    +
    +    returns:
    +        np.ndarray: the panoramic view image
    +    """
    +    panoramic_width = img_width * row_count
    +    panoramic_height = img_height * row_count
    +    panoramic_image = np.full(
    +        (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8
    +    )
    +
    +    # create and resize the query image with a blue border
    +    query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)
    +    query_image = Image.open(query_image_path).convert("RGB")
    +    query_array = np.array(query_image)[:, :, ::-1]
    +    resized_image = cv2.resize(query_array, (img_width, img_height))
    +
    +    border_size = 10
    +    blue = (255, 0, 0)  # blue color in BGR
    +    bordered_query_image = cv2.copyMakeBorder(
    +        resized_image,
    +        border_size,
    +        border_size,
    +        border_size,
    +        border_size,
    +        cv2.BORDER_CONSTANT,
    +        value=blue,
    +    )
    +
    +    query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(
    +        bordered_query_image, (img_width, img_height)
    +    )
    +
    +    # add text "query" below the query image
    +    text = "query"
    +    font_scale = 1
    +    font_thickness = 2
    +    text_org = (10, img_height * 3 + 30)
    +    cv2.putText(
    +        query_image_null,
    +        text,
    +        text_org,
    +        cv2.FONT_HERSHEY_SIMPLEX,
    +        font_scale,
    +        blue,
    +        font_thickness,
    +        cv2.LINE_AA,
    +    )
    +
    +    # combine the rest of the images into the panoramic view
    +    retrieved_imgs = [
    +        np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images
    +    ]
    +    for i, image in enumerate(retrieved_imgs):
    +        image = cv2.resize(image, (img_width - 4, img_height - 4))
    +        row = i // row_count
    +        col = i % row_count
    +        start_row = row * img_height
    +        start_col = col * img_width
    +
    +        border_size = 2
    +        bordered_image = cv2.copyMakeBorder(
    +            image,
    +            border_size,
    +            border_size,
    +            border_size,
    +            border_size,
    +            cv2.BORDER_CONSTANT,
    +            value=(0, 0, 0),
    +        )
    +        panoramic_image[
    +            start_row : start_row + img_height, start_col : start_col + img_width
    +        ] = bordered_image
    +
    +        # add red index numbers to each image
    +        text = str(i)
    +        org = (start_col + 50, start_row + 30)
    +        (font_width, font_height), baseline = cv2.getTextSize(
    +            text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2
    +        )
    +
    +        top_left = (org[0] - 48, start_row + 2)
    +        bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)
    +
    +        cv2.rectangle(
    +            panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED
    +        )
    +        cv2.putText(
    +            panoramic_image,
    +            text,
    +            (start_col + 10, start_row + 30),
    +            cv2.FONT_HERSHEY_SIMPLEX,
    +            1,
    +            (0, 0, 255),
    +            2,
    +            cv2.LINE_AA,
    +        )
    +
    +    # combine the query image with the panoramic view
    +    panoramic_image = np.hstack([query_image_null, panoramic_image])
    +    return panoramic_image
    +
    +

    Объедините изображение запроса и найденные изображения с индексами в панорамный вид.

    +
    from PIL import Image
    +
    +combined_image_path = os.path.join(data_dir, "combined_image.jpg")
    +panoramic_image = create_panoramic_view(query_image, retrieved_images)
    +cv2.imwrite(combined_image_path, panoramic_image)
    +
    +combined_image = Image.open(combined_image_path)
    +show_combined_image = combined_image.resize((300, 300))
    +show_combined_image.show()
    +
    +

    + + Create a panoramic view + Создание панорамного представления

    +

    2. Ранжирование и объяснение

    +

    Мы отправим объединенное изображение в мультимодальный LLM-сервис вместе с соответствующими подсказками для ранжирования найденных результатов с пояснениями. Чтобы задействовать GPT-4o в качестве LLM, необходимо подготовить ключ OpenAI API.

    +
    import requests
    +import base64
    +
    +openai_api_key = "sk-***"  # Change to your OpenAI API Key
    +
    +
    +def generate_ranking_explanation(
    +    combined_image_path: str, caption: str, infos: dict = None
    +) -> tuple[list[int], str]:
    +    with open(combined_image_path, "rb") as image_file:
    +        base64_image = base64.b64encode(image_file.read()).decode("utf-8")
    +
    +    information = (
    +        "You are responsible for ranking results for a Composed Image Retrieval. "
    +        "The user retrieves an image with an 'instruction' indicating their retrieval intent. "
    +        "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. "
    +        "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. "
    +        f"User instruction: {caption} \n\n"
    +    )
    +
    +    # add additional information for each image
    +    if infos:
    +        for i, info in enumerate(infos["product"]):
    +            information += f"{i}. {info}\n"
    +
    +    information += (
    +        "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. "
    +        "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent."
    +    )
    +
    +    headers = {
    +        "Content-Type": "application/json",
    +        "Authorization": f"Bearer {openai_api_key}",
    +    }
    +
    +    payload = {
    +        "model": "gpt-4o",
    +        "messages": [
    +            {
    +                "role": "user",
    +                "content": [
    +                    {"type": "text", "text": information},
    +                    {
    +                        "type": "image_url",
    +                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
    +                    },
    +                ],
    +            }
    +        ],
    +        "max_tokens": 300,
    +    }
    +
    +    response = requests.post(
    +        "https://api.openai.com/v1/chat/completions", headers=headers, json=payload
    +    )
    +    result = response.json()["choices"][0]["message"]["content"]
    +
    +    # parse the ranked indices from the response
    +    start_idx = result.find("[")
    +    end_idx = result.find("]")
    +    ranked_indices_str = result[start_idx + 1 : end_idx].split(",")
    +    ranked_indices = [int(index.strip()) for index in ranked_indices_str]
    +
    +    # extract explanation
    +    explanation = result[end_idx + 1 :].strip()
    +
    +    return ranked_indices, explanation
    +
    +

    Получите индексы изображений после ранжирования и причину лучшего результата:

    +
    ranked_indices, explanation = generate_ranking_explanation(
    +    combined_image_path, query_text
    +)
    +
    +

    3. Отображение лучшего результата с объяснением

    +
    print(explanation)
    +
    +best_index = ranked_indices[0]
    +best_img = Image.open(retrieved_images[best_index])
    +best_img = best_img.resize((150, 150))
    +best_img.show()
    +
    +
    Reasons: The most suitable item for the user's query intent is index 6 because the instruction specifies a phone case with the theme of the image, which is a leopard. The phone case with index 6 has a thematic design resembling the leopard pattern, making it the closest match to the user's request for a phone case with the image theme.
    +
    +

    + + The best result + Лучший результат

    +

    Быстрое развертывание

    Чтобы узнать, как запустить онлайн-демонстрацию с помощью этого руководства, пожалуйста, обратитесь к примеру приложения.

    diff --git a/localization/v2.5.x/site/ru/tutorials/question_answering_system.json b/localization/v2.5.x/site/ru/tutorials/question_answering_system.json new file mode 100644 index 000000000..9f8f8ddc6 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/question_answering_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Question Answering System","anchorList":[{"label":"Система ответов на вопросы","href":"Question-Answering-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/question_answering_system.md b/localization/v2.5.x/site/ru/tutorials/question_answering_system.md new file mode 100644 index 000000000..cc2b1ca27 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/question_answering_system.md @@ -0,0 +1,44 @@ +--- +id: question_answering_system.md +summary: Создайте систему ответов на вопросы с помощью Milvus. +title: Система ответов на вопросы +--- +

    Система ответов на вопросы

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания системы ответов на вопросы (QA).

    + +

    Используемые ML-модели и стороннее программное обеспечение включают:

    + +


    +

    Система ответов на вопросы - распространенное в реальном мире приложение, относящееся к области обработки естественного языка. Типичные системы QA включают в себя системы онлайн-обслуживания клиентов, чат-боты QA и другие. Большинство систем ответов на вопросы можно классифицировать как: генеративные или поисковые, однораундовые или многораундовые, системы ответов на вопросы с открытым доменом или специфические.

    +


    +

    В этом уроке вы узнаете, как построить систему QA, которая может связывать новые вопросы пользователей с массивными ответами, ранее сохраненными в векторной базе данных. Чтобы построить такого чатбота, подготовьте собственный набор данных вопросов и соответствующих ответов. Храните вопросы и ответы в MySQL, реляционной базе данных. Затем используйте BERT, модель машинного обучения (ML) для обработки естественного языка (NLP), чтобы преобразовать вопросы в векторы. Эти векторы вопросов хранятся и индексируются в Milvus. Когда пользователи вводят новый вопрос, он также преобразуется в вектор с помощью модели BERT, и Milvus ищет наиболее похожий вектор вопроса на этот новый вектор. Система QA возвращает ответ на наиболее похожий вопрос.

    +


    +

    + + QA_Chatbot + QA_Chatbot

    +

    + + QA_chatbot_demo + QA_chatbot_demo

    diff --git a/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.json b/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.json new file mode 100644 index 000000000..dc964dd14 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.json @@ -0,0 +1 @@ +{"codeList":["attu.app is damaged and cannot be opened.\n","sudo xattr -rd com.apple.quarantine /Applications/attu.app\n","wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\nunzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n text_lines += file_text.split(\"# \")\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n\n# Generate test embedding\ntest_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","768\n[-0.04836066 0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448\n -0.03041712 -0.02269499 -0.02317863 -0.00426028]\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Standalone\nclient = MilvusClient(uri=\"http://localhost:19530\")\n\ncollection_name = \"attu_tutorial\"\n\n# Drop collection if it exists\nif client.has_collection(collection_name):\n client.drop_collection(collection_name)\n\n# Create a new collection\nclient.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\"\n)\n","from tqdm import tqdm\n\ndata = []\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nclient.insert(collection_name=collection_name, data=data)\n"],"headingContent":"Quick Start with Attu Desktop","anchorList":[{"label":"Быстрый старт с Attu Desktop","href":"Quick-Start-with-Attu-Desktop","type":1,"isActive":false},{"label":"1. Введение","href":"1-Introduction","type":2,"isActive":false},{"label":"2. Установите настольное приложение","href":"2-Install-Desktop-Application","type":2,"isActive":false},{"label":"3. Подключение к Milvus","href":"3-Connect-to-Milvus","type":2,"isActive":false},{"label":"4. Подготовка данных, создание коллекции и вставка данных","href":"4-Prepare-Data-Create-Collection-and-Insert-Data","type":2,"isActive":false},{"label":"5. Визуализация результатов поиска и взаимосвязей","href":"5-Visualizing-Search-Results-and-Relationships","type":2,"isActive":false},{"label":"6. Заключение","href":"6-Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.md b/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.md new file mode 100644 index 000000000..7a0b6530a --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/quickstart_with_attu.md @@ -0,0 +1,242 @@ +--- +id: quickstart_with_attu.md +summary: >- + Attu - это универсальный инструмент администрирования Milvus с открытым + исходным кодом. Он имеет интуитивно понятный графический интерфейс + пользователя (GUI), позволяющий легко взаимодействовать с вашими базами + данных. Всего за несколько кликов вы можете визуализировать состояние + кластера, управлять метаданными, выполнять запросы к данным и многое другое. +title: Система ответов на вопросы +--- +

    Быстрый старт с Attu Desktop

    1. Введение

    Attu - это универсальный инструмент администрирования Milvus с открытым исходным кодом. Он имеет интуитивно понятный графический интерфейс пользователя (GUI), позволяющий легко взаимодействовать с вашими базами данных. Всего несколькими щелчками мыши вы можете визуализировать состояние кластера, управлять метаданными, выполнять запросы к данным и многое другое.

    +
    +

    2. Установите настольное приложение

    Загрузите настольную версию Attu, посетив страницу Attu GitHub Releases. Выберите подходящую версию для вашей операционной системы и выполните шаги по установке.

    +

    Примечание для macOS (чип серии M):

    Если вы столкнулись с ошибкой:

    +
    attu.app is damaged and cannot be opened.
    +
    +

    Выполните следующую команду в терминале, чтобы обойти эту проблему:

    +
    sudo xattr -rd com.apple.quarantine /Applications/attu.app
    +
    +
    +

    3. Подключение к Milvus

    Attu поддерживает подключение как к Milvus Standalone, так и к Zilliz Cloud, обеспечивая гибкость работы с локальными или облачными базами данных.

    +

    Чтобы использовать Milvus Standalone локально:

    +
      +
    1. Запустите Milvus Standalone, следуя руководству по установке Milvus.
    2. +
    3. Откройте Attu и введите информацию о подключении:
        +
      • Milvus Address: URI вашего сервера Milvus Standalone, например http://localhost:19530.
      • +
      • Другие дополнительные настройки: Вы можете задать их в зависимости от конфигурации Milvus или просто оставить по умолчанию.
      • +
    4. +
    5. Нажмите кнопку Подключить, чтобы получить доступ к базе данных.
    6. +
    +
    +

    Вы также можете подключить полностью управляемый Milvus на Zilliz Cloud. Просто установите Milvus Address и token на публичную конечную точку и API-ключ вашего экземпляра Zilliz Cloud.

    +
    +
      +
    1. Нажмите, чтобы получить доступ к базе данных.
    2. +
    +

    + Attu Login Page +

    +
    +

    4. Подготовка данных, создание коллекции и вставка данных

    4.1 Подготовка данных

    В качестве набора данных для этого примера мы используем страницы FAQ из документации Milvus 2.4.x.

    +

    Загрузите и извлеките данные:

    wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Обработка Markdown-файлов:

    from glob import glob
    +
    +text_lines = []
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +    text_lines += file_text.split("# ")
    +
    +
    +

    4.2 Генерирование вкраплений

    Определите модель встраивания для генерации текстовых вкраплений с помощью milvus_model. В качестве примера мы используем модель DefaultEmbeddingFunction, которая представляет собой предварительно обученную и легкую модель встраивания.

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +# Generate test embedding
    +test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +

    Выход:

    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +
    +

    4.3 Создание коллекции

    Подключитесь к Milvus и создайте коллекцию:

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Standalone
    +client = MilvusClient(uri="http://localhost:19530")
    +
    +collection_name = "attu_tutorial"
    +
    +# Drop collection if it exists
    +if client.has_collection(collection_name):
    +    client.drop_collection(collection_name)
    +
    +# Create a new collection
    +client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong"
    +)
    +
    +
    +

    4.4 Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления и вставьте данные в Milvus:

    +
    from tqdm import tqdm
    +
    +data = []
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    4.5 Визуализация данных и схемы

    Теперь мы можем визуализировать схему данных и вставленные сущности с помощью интерфейса Attu. Схема отображает определенные поля, включая поле id типа Int64 и поле vector типа FloatVector(768) с метрикой Inner Product (IP). В коллекцию загружено 72 сущности.

    +

    Кроме того, мы можем просмотреть вставленные данные, включая идентификатор, векторные вложения и динамические поля, хранящие метаданные, такие как текстовое содержимое. Интерфейс поддерживает фильтрацию и запросы на основе заданных условий или динамических полей.

    +

    + Schema View + Data View +

    +

    5. Визуализация результатов поиска и взаимосвязей

    Attu предоставляет мощный интерфейс для визуализации и изучения взаимосвязей данных. Чтобы изучить вставленные точки данных и отношения подобия, выполните следующие действия:

    +

    Перейдите на вкладку Векторный поиск в Attu.

    +
      +
    1. Нажмите кнопку Генерировать случайные данные, чтобы создать тестовые запросы.
    2. +
    3. Нажмите кнопку Поиск, чтобы получить результаты на основе сгенерированных данных.
    4. +
    +

    Результаты отображаются в таблице, в которой показаны идентификаторы, баллы сходства и динамические поля для каждой совпадающей сущности.

    +

    + Search Results Table +

    +
    +

    5.2 Изучение взаимосвязей данных

    Нажмите кнопку Explore на панели результатов, чтобы визуализировать взаимосвязи между вектором запроса и результатами поиска в виде графа знаний.

    +
      +
    • Центральный узел представляет вектор поиска.
    • +
    • Подключенные узлы представляют результаты поиска, при нажатии на которые отображается подробная информация о соответствующем узле.
    • +
    +

    + Knowledge Graph Visualization +

    +
    +

    5.3 Развернуть граф

    Дважды щелкните на любом узле результатов, чтобы развернуть его связи. Это действие позволяет выявить дополнительные связи между выбранным узлом и другими точками данных в коллекции, создавая более крупный, взаимосвязанный граф знаний.

    +

    Такое расширенное представление позволяет глубже изучить взаимосвязь точек данных на основе векторного сходства.

    +

    + Expanded Knowledge Graph +

    +
    +

    6. Заключение

    Attu упрощает управление и визуализацию векторных данных, хранящихся в Milvus. От вставки данных до выполнения запросов и интерактивного исследования он предоставляет интуитивно понятный интерфейс для решения сложных задач векторного поиска. Благодаря таким функциям, как поддержка динамических схем, графические визуализации поиска и гибкие фильтры запросов, Attu позволяет пользователям эффективно анализировать большие массивы данных.

    +

    Используя инструменты визуального поиска Attu, пользователи могут лучше понять свои данные, выявить скрытые взаимосвязи и принять решения, основанные на данных. Начните исследовать свои собственные наборы данных уже сегодня с помощью Attu и Milvus!

    +
    diff --git a/localization/v2.5.x/site/ru/tutorials/recommendation_system.json b/localization/v2.5.x/site/ru/tutorials/recommendation_system.json new file mode 100644 index 000000000..2d5576179 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/recommendation_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Recommender System","anchorList":[{"label":"Рекомендательная система","href":"Recommender-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/recommendation_system.md b/localization/v2.5.x/site/ru/tutorials/recommendation_system.md new file mode 100644 index 000000000..3b1bd629d --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/recommendation_system.md @@ -0,0 +1,36 @@ +--- +id: recommendation_system.md +summary: Создайте персонализированную рекомендательную систему с помощью Milvus. +title: Рекомендательная система +--- +

    Рекомендательная система

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания рекомендательной системы.

    +

    Используемые модели ML и стороннее программное обеспечение включают:

    +
      +
    • PaddlePaddle
    • +
    • Redis или MySQL
    • +
    • Towhee .
    • +
    +


    +

    Рекомендательная система - это подмножество системы фильтрации информации, которая может быть использована в различных сценариях, включая персонализированные рекомендации фильмов, музыки, продуктов и потоков новостей. В отличие от поисковых систем, рекомендательные системы не требуют от пользователей точного описания своих потребностей, а обнаруживают потребности и интересы пользователей, анализируя их поведение.

    +


    +

    В этом уроке вы узнаете, как построить систему рекомендаций фильмов, которая может предлагать фильмы, соответствующие интересам пользователя. Чтобы создать такую систему, сначала загрузите набор данных, связанный с фильмами. В этом уроке используется MovieLens 1M. В качестве альтернативы вы можете подготовить собственные наборы данных, которые должны содержать такую информацию, как оценки фильмов пользователями, демографические характеристики пользователей и описание фильмов. Используйте PaddlePaddle для объединения идентификаторов пользователей и характеристик и преобразования их в 256-мерные векторы. Аналогичным образом преобразуйте идентификаторы и характеристики фильмов в векторы. Храните векторы фильмов в Milvus и используйте векторы пользователей для поиска сходства. Если вектор пользователя похож на вектор фильма, Milvus вернет вектор фильма и его ID в качестве результата рекомендации. Затем запросите информацию о фильме, используя идентификатор вектора фильма, хранящийся в Redis или MySQL.

    +


    +

    + + recommender_system + рекомендующая_система

    diff --git a/localization/v2.5.x/site/ru/tutorials/text_image_search.json b/localization/v2.5.x/site/ru/tutorials/text_image_search.json new file mode 100644 index 000000000..c4cec65b2 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/text_image_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text to Image Search Engine","anchorList":[{"label":"Поисковая система \"текст в изображение","href":"Text-to-Image-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/text_image_search.md b/localization/v2.5.x/site/ru/tutorials/text_image_search.md new file mode 100644 index 000000000..06c5c16c0 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/text_image_search.md @@ -0,0 +1,39 @@ +--- +id: text_image_search.md +summary: Создайте поисковую систему по тексту и изображениям с помощью Milvus. +title: Поисковая система "текст в изображение +--- +

    Поисковая система "текст в изображение

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания поисковой системы по тексту и изображениям.

    +

    Вы можете быстро создать минимально жизнеспособную поисковую систему по тексту и изображениям, следуя базовому руководству. Кроме того, вы можете прочитать учебник с глубоким погружением, в котором рассматривается все, начиная с выбора модели и заканчивая развертыванием сервиса. Вы можете создать более продвинутую систему поиска по тексту и изображениям, отвечающую вашим собственным потребностям, следуя инструкциям в руководстве по глубокому погружению.

    + +

    Используемые модели ML и стороннее программное обеспечение включают:

    + +

    В настоящее время традиционные текстовые поисковые системы теряют свое очарование, и все больше людей переходят на TikTok в качестве своей любимой поисковой системы. При традиционном текстовом поиске люди вводят ключевые слова, и им показываются все тексты, содержащие это ключевое слово. Однако люди жалуются, что не всегда могут найти то, что им нужно, при таком поиске. Более того, результаты поиска недостаточно интуитивны. Люди говорят, что изображения и видео гораздо более интуитивны и приятны, чем продираться сквозь строки текста. В результате появилась кросс-модальная поисковая система "текст-изображение". С помощью такого нового типа поисковой системы люди могут находить релевантные изображения, вводя фрагмент текста с некоторыми ключевыми словами.

    +

    В этом уроке вы узнаете, как создать поисковую систему "текст-изображение". В этом учебнике используется модель CLIP для извлечения характеристик изображений и преобразования их в векторы. Затем эти векторы изображений хранятся в векторной базе данных Milvus. Когда пользователи вводят тексты запросов, эти тексты также преобразуются в векторы вложений с помощью той же ML-модели CLIP. Затем в Milvus выполняется поиск векторного сходства для извлечения наиболее похожих векторов изображений на вектор входного текста.

    +

    + + Text_image_search + Поиск_изображения_текста

    diff --git a/localization/v2.5.x/site/ru/tutorials/text_search_engine.json b/localization/v2.5.x/site/ru/tutorials/text_search_engine.json new file mode 100644 index 000000000..b0d758bfb --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/text_search_engine.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text Search Engine","anchorList":[{"label":"Система поиска текста","href":"Text-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/text_search_engine.md b/localization/v2.5.x/site/ru/tutorials/text_search_engine.md new file mode 100644 index 000000000..cc0c59a1a --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/text_search_engine.md @@ -0,0 +1,39 @@ +--- +id: text_search_engine.md +summary: Создайте систему текстового поиска с помощью Milvus. +title: Система поиска текста +--- +

    Система поиска текста

    В этом уроке вы узнаете, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания системы поиска по тексту.

    + +

    Используемые ML-модели и стороннее программное обеспечение включают:

    + +


    +

    Одним из основных применений Milvus в области обработки естественного языка (NLP) является система текстового поиска. Это отличный инструмент, который может помочь пользователям найти нужную информацию. Он даже может найти информацию, которую трудно найти. Системы текстового поиска сравнивают введенные пользователями ключевые слова или семантику с базой данных текстов, а затем возвращают результаты, соответствующие определенным критериям.

    +


    +

    В этом уроке вы узнаете, как создать систему поиска по тексту. В этом учебнике используется BERT для преобразования текстов в векторы фиксированной длины. Milvus используется в качестве базы данных векторов для хранения и поиска сходства векторов. Затем используйте MySQL для сопоставления идентификаторов векторов, сгенерированных Milvus, с текстовыми данными.

    +


    +

    + + text_search_engine + text_search_engine text_search_enginetext_search_engine

    diff --git a/localization/v2.5.x/site/ru/tutorials/tutorials-overview.json b/localization/v2.5.x/site/ru/tutorials/tutorials-overview.json new file mode 100644 index 000000000..01be239c2 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/tutorials-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Tutorials Overview","anchorList":[{"label":"Обзор учебников","href":"Tutorials-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/tutorials-overview.md b/localization/v2.5.x/site/ru/tutorials/tutorials-overview.md new file mode 100644 index 000000000..22d7fb825 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/tutorials-overview.md @@ -0,0 +1,52 @@ +--- +id: tutorials-overview.md +summary: На этой странице представлен список руководств по взаимодействию с Milvus. +title: Обзор учебников +--- +

    Обзор учебников

    На этой странице представлен список учебных пособий по взаимодействию с Milvus.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    УчебникПример использованияСвязанные возможности Milvus
    Создание RAG с помощью MilvusRAGвекторный поиск
    Расширенный RAGRAGвекторный поиск
    Полнотекстовый поиск с помощью MilvusБыстрый стартПолнотекстовый поиск
    Гибридный поиск с MilvusГибридный поискгибридный поиск, многовекторный, плотное вложение, разреженное вложение
    Поиск изображений с помощью MilvusСемантический поисквекторный поиск, динамическое поле
    Мультимодальный RAG с MilvusRAGвекторный поиск, динамическое поле
    Мультимодальный поиск с использованием мультивекторовСемантический поискмультивекторный, гибридный поиск
    Граф RAG с MilvusRAGпоиск по графу
    Контекстный поиск с MilvusБыстрый стартвекторный поиск
    Кластеризация HDBSCAN с помощью MilvusБыстрый стартвекторный поиск
    Использование ColPali для мультимодального поиска с MilvusБыстрый запусквекторный поиск
    Визуализация векторовБыстрый стартвекторный поиск
    Рекомендация фильмов с помощью MilvusСистема рекомендацийвекторный поиск
    Поиск воронки с помощью вкраплений "МатрешкиБыстрый стартвекторный поиск
    Система ответов на вопросыОтветы на вопросывекторный поиск
    Рекомендательная системаСистема рекомендацийвекторный поиск
    Поиск по сходству видеоСемантический поисквекторный поиск
    Поиск по сходству аудиоСемантический поисквекторный поиск
    Классификация ДНККлассификациявекторный поиск
    Система текстового поискаСемантический поисквекторный поиск
    Поиск изображений по текстуСемантический поисквекторный поиск
    Дедупликация изображенийДедупликациявекторный поиск
    Быстрый старт с AttuБыстрый стартвекторный поиск
    Использование AsyncMilvusClient с asyncioAsyncIOAsyncIO, векторный поиск
    diff --git a/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.json b/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.json new file mode 100644 index 000000000..f28ebc340 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.json @@ -0,0 +1 @@ +{"codeList":["import asyncio​\nimport numpy as np​\nfrom scipy.sparse import csr_matrix​\nfrom pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​\n​\nloop = asyncio.get_event_loop()​\n\n","# Connect to Milvus server using AsyncMilvusClient​\nasync_client = AsyncMilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n\n","schema = async_client.create_schema(​\n auto_id=False,​\n description=\"This is a sample schema\",​\n)​\n​\nschema.add_field(\"id\", DataType.INT64, is_primary=True)​\nschema.add_field(\"dense_vector\", DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(\"sparse_vector\", DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(\"text\", DataType.VARCHAR, max_length=512)​\n\n","async def create_my_collection(collection_name, schema):​\n if (client.has_collection(collection_name)):​\n await async_client.drop_collection(collection_name)​\n​\n await async_client.create_collection(​\n collection_name=collection_name,​\n schema=schema​\n )​\n​\n if (client.has_collection(collection_name)):​\n print(\"Collection created successfully\")​\n else:​\n print(\"Failed to create collection\")​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_my_collection(\"my_collection\", schema))​\n​\n# Output​\n#​\n# Collection created successfully​\n\n","async def create_indexes(collection_name):​\n index_params = client.prepare_index_params()​\n​\n index_params.add_index(field_name=\"dense_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"sparse_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"text\", index_type=\"AUTOINDEX\")​\n​\n await async_client.create_index(collection_name, index_params)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_indexes(\"my_collection\"))​\n\n","async def load_my_collection(collection_name):​\n await async_client.load_collection(collection_name)​\n print(client.get_load_state(collection_name))​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(load_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# {'state': }​\n\n","async def insert_sample_data(collection_name):​\n # Randomly generated data will be used here​\n rng = np.random.default_rng(42)​\n​\n def generate_random_text(length):​\n seed = \"this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence.\"​\n words = seed.split()​\n return \" \".join(rng.choice(words, length))​\n ​\n data = [{​\n 'id': i, ​\n 'dense_vector': rng.random(5).tolist(), ​\n 'sparse_vector': csr_matrix(rng.random(5)), ​\n 'text': generate_random_text(10)​\n } for i in range(10000)]​\n​\n res = await async_client.insert(collection_name, data)​\n​\n print(res)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(insert_sample_data(\"my_collection\"))​\n​\n# Output​\n#​\n# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​\n\n","async def query_my_collection(collection_name):​\n # Find the number of entities with the `text` fields starting with the word \"random\" in the `my_collection` collection.​\n​\n res = await async_client.query(​\n collection_name=\"my_collection\",​\n filter='text like \"%random%\"',​\n output_fields=[\"count(*)\"]​\n )​\n​\n print(res) ​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(query_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# data: [\"{'count(*)': 6802}\"] ​\n\n","async def conduct_vector_search(collection_name, type, field):​\n # Generate a set of three random query vectors​\n query_vectors = []​\n if type == \"dense\":​\n query_vectors = [ rng.random(5) for _ in range(3) ]​\n ​\n if type == \"sparse\":​\n query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​\n​\n print(query_vectors)​\n​\n res = await async_client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n anns_field=field,​\n output_fields=[\"text\", field]​\n )​\n​\n print(res)​\n ​\n# To search against the dense vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"dense\", \"dense_vector\"))​\n​\n# To search against the sparse vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"sparse\", \"sparse_vector\"))​\n\n","async def conduct_hybrid_search(collection_name):​\n req_dense = AnnSearchRequest(​\n data=[ rng.random(5) for _ in range(3) ],​\n anns_field=\"dense_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n req_sparse = AnnSearchRequest(​\n data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​\n anns_field=\"sparse_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n reqs = [req_dense, req_sparse]​\n​\n ranker = RRFRanker()​\n​\n res = await async_client.hybrid_search(​\n collection_name=\"my_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n output_fields=[\"text\", \"dense_vector\", \"sparse_vector\"]​\n )​\n​\n print(res)​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(conduct_hybrid_search(\"my_collection\"))​\n\n"],"headingContent":"Tutorial: Use AsyncMilvusClient with asyncio​","anchorList":[{"label":"Учебное пособие: Использование AsyncMilvusClient с asyncio","href":"Tutorial-Use-AsyncMilvusClient-with-asyncio​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создание цикла событий","href":"Create-an-event-loop​","type":2,"isActive":false},{"label":"Подключение с помощью AsyncMilvusClient","href":"Connect-with-AsyncMilvusClient​","type":2,"isActive":false},{"label":"Создайте схему","href":"Create-schema​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-collection​","type":2,"isActive":false},{"label":"Создать индекс","href":"Create-index​","type":2,"isActive":false},{"label":"Загрузка коллекции","href":"Load-collection​","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data​","type":2,"isActive":false},{"label":"Запрос","href":"Query​","type":2,"isActive":false},{"label":"Поиск","href":"Search​","type":2,"isActive":false},{"label":"Гибридный поиск","href":"Hybrid-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.md b/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.md new file mode 100644 index 000000000..b0504ace6 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/use-async-milvus-client-with-asyncio.md @@ -0,0 +1,416 @@ +--- +id: use-async-milvus-client-with-asyncio.md +summary: >- + AsyncMilvusClient - это асинхронный MilvusClient, который предлагает + основанный на корутинах API для неблокирующего доступа к Milvus через asyncio. + В этой статье вы узнаете о процессе вызова API, которые предоставляет + AsyncMilvusClient, и о том, на какие аспекты следует обратить внимание. +title: Система ответов на вопросы +--- +

    Учебное пособие: Использование AsyncMilvusClient с asyncio

    AsyncMilvusClient - это асинхронный MilvusClient, который предлагает основанный на корутинах API для неблокирующего доступа к Milvus через asyncio. В этой статье вы узнаете о процессе вызова API, которые предоставляет AsyncMilvusClient, и о том, на какие аспекты следует обратить внимание.

    +

    Обзор

    Asyncio - это библиотека для написания параллельного кода с использованием синтаксиса async/await. Она служит основой для высокопроизводительного асинхронного клиента Milvus, который будет вписываться в вашу библиотеку кода, работающую поверх asyncio.

    +

    Методы, которые предоставляет AsyncMilvusClient, имеют идентичные наборы параметров и поведение, как и методы MilvusClient. Единственное различие заключается в том, как вы их вызываете. В следующей таблице перечислены методы, доступные в AsyncMilvusClient.

    +

    **Client**

    +

    `close()`

    +

    +

    +

    **Коллекции и разделы**

    +

    `create_collection()`

    +

    `drop_collection()`

    +

    `create_partition()`

    +

    `drop_partition()`

    +

    +

    +

    **Индекс**

    +

    `create_index()`

    +

    `drop_index()`

    +

    `load_collection()`

    +

    `release_collection()`

    +

    `load_partitions()`

    +

    `release_partitions()`

    +

    **Вектор**

    +

    `insert()`

    +

    `upsert()`

    +

    `delete()`

    +

    `search()`

    +

    `query()`

    +

    `hybrid_search()`

    +

    `get()`

    +

    +

    +
    +

    Если вам все еще нужна асинхронная версия любого другого метода MilvusClient, вы можете отправить запрос на разработку функции в репо pymilvus. Вклад в код также приветствуется.

    +

    Создание цикла событий

    Приложения, использующие asyncio, обычно используют цикл событий в качестве орхистратора для управления асинхронными задачами и операциями ввода-вывода. В этом руководстве мы получим цикл событий из asyncio и используем его в качестве орхистратора.

    +
    import asyncio​
    +import numpy as np​
    +from scipy.sparse import csr_matrix​
    +from pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​
    +​
    +loop = asyncio.get_event_loop()​
    +
    +
    +

    Подключение с помощью AsyncMilvusClient

    Следующий пример демонстрирует, как подключить Milvus асинхронным способом.

    +
    # Connect to Milvus server using AsyncMilvusClient​
    +async_client = AsyncMilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +
    +
    +

    Создайте схему

    В настоящее время create_schema() недоступен в AsyncMilvusClient. Вместо этого мы будем использовать MilvusClient для создания схемы коллекции.

    +
    schema = async_client.create_schema(​
    +    auto_id=False,​
    +    description="This is a sample schema",​
    +)​
    +​
    +schema.add_field("id", DataType.INT64, is_primary=True)​
    +schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field("text", DataType.VARCHAR, max_length=512)​
    +
    +
    +
    +

    AsyncMilvusClient вызывает метод create_schema() синхронно, поэтому вам не нужно оркестровать вызов с помощью цикла событий.

    +
    +

    Создание коллекции

    Теперь мы используем схему для создания коллекции. Обратите внимание, что к любому вызову методов AsyncMilvusClient необходимо добавлять ключевое слово await и помещать вызов внутрь функции async, как показано ниже.

    +
    async def create_my_collection(collection_name, schema):​
    +    if (client.has_collection(collection_name)):​
    +        await async_client.drop_collection(collection_name)​
    +​
    +    await async_client.create_collection(​
    +        collection_name=collection_name,​
    +        schema=schema​
    +    )​
    +​
    +    if (client.has_collection(collection_name)):​
    +        print("Collection created successfully")​
    +    else:​
    +        print("Failed to create collection")​
    +        ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_my_collection("my_collection", schema))​
    +​
    +# Output​
    +#​
    +# Collection created successfully​
    +
    +
    +

    Создать индекс

    Также необходимо создать индексы для всех векторных и необязательных скалярных полей. В соответствии со схемой, определенной выше, в коллекции есть два векторных поля, и вы создадите для них индексы следующим образом.

    +
    async def create_indexes(collection_name):​
    +    index_params = client.prepare_index_params()​
    +​
    +    index_params.add_index(field_name="dense_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="sparse_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="text", index_type="AUTOINDEX")​
    +​
    +    await async_client.create_index(collection_name, index_params)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_indexes("my_collection"))​
    +
    +
    +

    Загрузка коллекции

    Коллекция может быть загружена после того, как необходимые поля будут проиндексированы. Следующий код демонстрирует, как загрузить коллекцию асинхронно.

    +
    async def load_my_collection(collection_name):​
    +    await async_client.load_collection(collection_name)​
    +    print(client.get_load_state(collection_name))​
    +    ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(load_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'state': <LoadState: Loaded>}​
    +
    +
    +

    Вставка данных

    Вы можете использовать модели встраивания, доступные в pymilvus, для создания векторных вкраплений для ваших текстов. Подробности см. в разделе Обзор вкраплений. В этом разделе мы вставим в коллекцию случайно сгенерированные данные.

    +
    async def insert_sample_data(collection_name):​
    +    # Randomly generated data will be used here​
    +    rng = np.random.default_rng(42)​
    +​
    +    def generate_random_text(length):​
    +        seed = "this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence."​
    +        words = seed.split()​
    +        return " ".join(rng.choice(words, length))​
    +    ​
    +    data = [{​
    +        'id': i, ​
    +        'dense_vector': rng.random(5).tolist(), ​
    +        'sparse_vector': csr_matrix(rng.random(5)), ​
    +        'text': generate_random_text(10)​
    +    } for i in range(10000)]​
    +​
    +    res = await async_client.insert(collection_name, data)​
    +​
    +    print(res)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(insert_sample_data("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​
    +
    +
    +

    Запрос

    После того как коллекция загружена и наполнена данными, в ней можно выполнять поиск и запросы. В этом разделе вы хотите найти количество сущностей в поле text, начинающихся со слова random, в коллекции с именем my_collection.

    +
    async def query_my_collection(collection_name):​
    +    # Find the number of entities with the `text` fields starting with the word "random" in the `my_collection` collection.​
    +​
    +    res = await async_client.query(​
    +        collection_name="my_collection",​
    +        filter='text like "%random%"',​
    +        output_fields=["count(*)"]​
    +    )​
    +​
    +    print(res) ​
    +    ​
    +# Call the above function asynchronously   ​
    +loop.run_until_complete(query_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# data: ["{'count(*)': 6802}"] ​
    +
    +
    +

    Поиск

    В этом разделе вы проведете векторный поиск по плотным и разреженным векторным полям целевой коллекции.

    +
    async def conduct_vector_search(collection_name, type, field):​
    +    # Generate a set of three random query vectors​
    +    query_vectors = []​
    +    if type == "dense":​
    +        query_vectors = [ rng.random(5) for _ in range(3) ]​
    +    ​
    +    if type == "sparse":​
    +        query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​
    +​
    +    print(query_vectors)​
    +​
    +    res = await async_client.search(​
    +        collection_name="my_collection",​
    +        data=query_vectors,​
    +        anns_field=field,​
    +        output_fields=["text", field]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# To search against the dense vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "dense", "dense_vector"))​
    +​
    +# To search against the sparse vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "sparse", "sparse_vector"))​
    +
    +
    +

    В результатах поиска должно быть три набора результатов, соответствующих заданным векторам запроса.

    +

    Гибридный поиск

    Гибридный поиск объединяет результаты нескольких поисков и упорядочивает их для получения лучшего отзыва. В этом разделе вы проведете гибридный поиск с использованием плотных и разреженных векторных полей.

    +
    async def conduct_hybrid_search(collection_name):​
    +    req_dense = AnnSearchRequest(​
    +        data=[ rng.random(5) for _ in range(3) ],​
    +        anns_field="dense_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    req_sparse = AnnSearchRequest(​
    +        data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​
    +        anns_field="sparse_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    reqs = [req_dense, req_sparse]​
    +​
    +    ranker = RRFRanker()​
    +​
    +    res = await async_client.hybrid_search(​
    +        collection_name="my_collection",​
    +        reqs=reqs,​
    +        ranker=ranker,​
    +        output_fields=["text", "dense_vector", "sparse_vector"]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# Call the above function asynchronously  ​
    +loop.run_until_complete(conduct_hybrid_search("my_collection"))​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.json b/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.json new file mode 100644 index 000000000..9c0820a69 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pdf2image\n$ pip pymilvus\n$ pip install colpali_engine\n$ pip install tqdm\n$ pip instal pillow\n","from pdf2image import convert_from_path\n\npdf_path = \"pdfs/2004.12832v2.pdf\"\nimages = convert_from_path(pdf_path)\n\nfor i, image in enumerate(images):\n image.save(f\"pages/page_{i + 1}.png\", \"PNG\")\n","from pymilvus import MilvusClient, DataType\nimport numpy as np\nimport concurrent.futures\n\nclient = MilvusClient(uri=\"milvus.db\")\n","class MilvusColbertRetriever:\n def __init__(self, milvus_client, collection_name, dim=128):\n # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.\n # If the collection exists, load it.\n self.collection_name = collection_name\n self.client = milvus_client\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.load_collection(collection_name)\n self.dim = dim\n\n def create_collection(self):\n # Create a new collection in Milvus for storing embeddings.\n # Drop the existing collection if it already exists and define the schema for the collection.\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.drop_collection(collection_name=self.collection_name)\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_fields=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=self.dim\n )\n schema.add_field(field_name=\"seq_id\", datatype=DataType.INT16)\n schema.add_field(field_name=\"doc_id\", datatype=DataType.INT64)\n schema.add_field(field_name=\"doc\", datatype=DataType.VARCHAR, max_length=65535)\n\n self.client.create_collection(\n collection_name=self.collection_name, schema=schema\n )\n\n def create_index(self):\n # Create an index on the vector field to enable fast similarity search.\n # Releases and drops any existing index before creating a new one with specified parameters.\n self.client.release_collection(collection_name=self.collection_name)\n self.client.drop_index(\n collection_name=self.collection_name, index_name=\"vector\"\n )\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"vector\",\n index_name=\"vector_index\",\n index_type=\"HNSW\", # or any other index type you want\n metric_type=\"IP\", # or the appropriate metric type\n params={\n \"M\": 16,\n \"efConstruction\": 500,\n }, # adjust these parameters as needed\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def create_scalar_index(self):\n # Create a scalar index for the \"doc_id\" field to enable fast lookups by document ID.\n self.client.release_collection(collection_name=self.collection_name)\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"doc_id\",\n index_name=\"int32_index\",\n index_type=\"INVERTED\", # or any other index type you want\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def search(self, data, topk):\n # Perform a vector search on the collection to find the top-k most similar documents.\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n results = self.client.search(\n self.collection_name,\n data,\n limit=int(50),\n output_fields=[\"vector\", \"seq_id\", \"doc_id\"],\n search_params=search_params,\n )\n doc_ids = set()\n for r_id in range(len(results)):\n for r in range(len(results[r_id])):\n doc_ids.add(results[r_id][r][\"entity\"][\"doc_id\"])\n\n scores = []\n\n def rerank_single_doc(doc_id, data, client, collection_name):\n # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.\n doc_colbert_vecs = client.query(\n collection_name=collection_name,\n filter=f\"doc_id in [{doc_id}]\",\n output_fields=[\"seq_id\", \"vector\", \"doc\"],\n limit=1000,\n )\n doc_vecs = np.vstack(\n [doc_colbert_vecs[i][\"vector\"] for i in range(len(doc_colbert_vecs))]\n )\n score = np.dot(data, doc_vecs.T).max(1).sum()\n return (score, doc_id)\n\n with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:\n futures = {\n executor.submit(\n rerank_single_doc, doc_id, data, client, self.collection_name\n ): doc_id\n for doc_id in doc_ids\n }\n for future in concurrent.futures.as_completed(futures):\n score, doc_id = future.result()\n scores.append((score, doc_id))\n\n scores.sort(key=lambda x: x[0], reverse=True)\n if len(scores) >= topk:\n return scores[:topk]\n else:\n return scores\n\n def insert(self, data):\n # Insert ColBERT embeddings and metadata for a document into the collection.\n colbert_vecs = [vec for vec in data[\"colbert_vecs\"]]\n seq_length = len(colbert_vecs)\n doc_ids = [data[\"doc_id\"] for i in range(seq_length)]\n seq_ids = list(range(seq_length))\n docs = [\"\"] * seq_length\n docs[0] = data[\"filepath\"]\n\n # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.\n self.client.insert(\n self.collection_name,\n [\n {\n \"vector\": colbert_vecs[i],\n \"seq_id\": seq_ids[i],\n \"doc_id\": doc_ids[i],\n \"doc\": docs[i],\n }\n for i in range(seq_length)\n ],\n )\n","from colpali_engine.models import ColPali\nfrom colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor\nfrom colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor\nfrom colpali_engine.utils.torch_utils import ListDataset, get_torch_device\nfrom torch.utils.data import DataLoader\nimport torch\nfrom typing import List, cast\n\ndevice = get_torch_device(\"cpu\")\nmodel_name = \"vidore/colpali-v1.2\"\n\nmodel = ColPali.from_pretrained(\n model_name,\n torch_dtype=torch.bfloat16,\n device_map=device,\n).eval()\n\nqueries = [\n \"How to end-to-end retrieval with ColBert?\",\n \"Where is ColBERT performance table?\",\n]\n\nprocessor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))\n\ndataloader = DataLoader(\n dataset=ListDataset[str](queries),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_queries(x),\n)\n\nqs: List[torch.Tensor] = []\nfor batch_query in dataloader:\n with torch.no_grad():\n batch_query = {k: v.to(model.device) for k, v in batch_query.items()}\n embeddings_query = model(**batch_query)\n qs.extend(list(torch.unbind(embeddings_query.to(\"cpu\"))))\n","from tqdm import tqdm\nfrom PIL import Image\nimport os\n\nimages = [Image.open(\"./pages/\" + name) for name in os.listdir(\"./pages\")]\n\ndataloader = DataLoader(\n dataset=ListDataset[str](images),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_images(x),\n)\n\nds: List[torch.Tensor] = []\nfor batch_doc in tqdm(dataloader):\n with torch.no_grad():\n batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}\n embeddings_doc = model(**batch_doc)\n ds.extend(list(torch.unbind(embeddings_doc.to(\"cpu\"))))\n\nprint(ds[0].shape)\n","retriever = MilvusColbertRetriever(collection_name=\"colpali\", milvus_client=client)\nretriever.create_collection()\nretriever.create_index()\n","filepaths = [\"./pages/\" + name for name in os.listdir(\"./pages\")]\nfor i in range(len(filepaths)):\n data = {\n \"colbert_vecs\": ds[i].float().numpy(),\n \"doc_id\": i,\n \"filepath\": filepaths[i],\n }\n retriever.insert(data)\n","for query in qs:\n query = query.float().numpy()\n result = retriever.search(query, topk=1)\n print(filepaths[result[0][1]])\n"],"headingContent":"Use ColPali for Multi-Modal Retrieval with Milvus","anchorList":[{"label":"Использование ColPali для мультимодального поиска с помощью Milvus","href":"Use-ColPali-for-Multi-Modal-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Подготовка данных","href":"Prepare-the-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.md b/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.md new file mode 100644 index 000000000..b10722ff4 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/use_ColPali_with_milvus.md @@ -0,0 +1,335 @@ +--- +id: use_ColPali_with_milvus.md +summary: >- + В этом блокноте мы называем этот вид многовекторного представления + "вкраплениями ColBERT" для общности. Однако на самом деле используется модель + ColPali. Мы продемонстрируем, как использовать Milvus для многовекторного + поиска. На основе этого мы покажем, как использовать ColPali для поиска + страниц по заданному запросу. +title: Использование ColPali для мультимодального поиска с помощью Milvus +--- +

    Использование ColPali для мультимодального поиска с помощью Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Современные модели поиска обычно используют одно вложение для представления текста или изображений. Однако ColBERT - это нейронная модель, которая использует список вкраплений для каждого экземпляра данных и применяет операцию "MaxSim" для расчета сходства между двумя текстами. Помимо текстовых данных, рисунки, таблицы и диаграммы также содержат богатую информацию, которая часто игнорируется при поиске информации по тексту.

    +

    + + + + +

    +

    Функция MaxSim сравнивает запрос и документ (то, что вы ищете), рассматривая их вкрапления лексем. Для каждого слова в запросе она выбирает наиболее похожее слово из документа (используя косинусоидальное сходство или квадратичное расстояние L2) и суммирует эти максимальные сходства по всем словам в запросе.

    +

    ColPali - это метод, который объединяет многовекторное представление ColBERT с PaliGemma (мультимодальной моделью большого языка), чтобы использовать ее широкие возможности понимания. Этот подход позволяет представить страницу с текстом и изображениями с помощью единого многовекторного вложения. Вкрапления в этом многовекторном представлении могут захватывать подробную информацию, улучшая производительность генерации с расширенным поиском (RAG) для мультимодальных данных.

    +

    В этом блокноте мы называем этот вид многовекторного представления "вкраплениями ColBERT" для общности. Однако на самом деле используется модель ColPali. Мы продемонстрируем, как использовать Milvus для многовекторного поиска. На основе этого мы расскажем, как использовать ColPali для поиска страниц по заданному запросу.

    +

    Подготовка

    $ pip install pdf2image
    +$ pip pymilvus
    +$ pip install colpali_engine
    +$ pip install tqdm
    +$ pip instal pillow
    +
    +

    Подготовка данных

    В качестве примера мы будем использовать PDF RAG. Вы можете скачать документ ColBERT и поместить его в ./pdf. ColPali не обрабатывает текст напрямую; вместо этого вся страница растеризуется в изображение. Модель ColPali отлично справляется с пониманием текстовой информации, содержащейся в этих изображениях. Поэтому мы преобразуем каждую страницу PDF в изображение для обработки.

    +
    from pdf2image import convert_from_path
    +
    +pdf_path = "pdfs/2004.12832v2.pdf"
    +images = convert_from_path(pdf_path)
    +
    +for i, image in enumerate(images):
    +    image.save(f"pages/page_{i + 1}.png", "PNG")
    +
    +

    Далее мы инициализируем базу данных с помощью Milvus Lite. Вы можете легко переключиться на полный экземпляр Milvus, установив uri на соответствующий адрес, где размещен ваш сервис Milvus.

    +
    from pymilvus import MilvusClient, DataType
    +import numpy as np
    +import concurrent.futures
    +
    +client = MilvusClient(uri="milvus.db")
    +
    +
    +
      +
    • Если вам нужна локальная векторная база данных только для небольших масштабов данных или прототипирования, установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, поскольку он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.
    • +
    • Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
    • +
    +
    +

    Мы определим класс MilvusColbertRetriever, чтобы обернуть его вокруг клиента Milvus для получения многовекторных данных. Реализация сплющивает вкрапления ColBERT и вставляет их в коллекцию, где каждая строка представляет собой отдельное вкрапление из списка вкраплений ColBERT. Она также записывает doc_id и seq_id для отслеживания происхождения каждого вкрапления.

    +

    При поиске по списку вкраплений ColBERT будет проведено несколько поисков - по одному для каждого вкрапления ColBERT. Полученные идентификаторы doc_ids будут затем дедуплицированы. Будет проведен процесс ранжирования, в ходе которого будут получены полные вкрапления для каждого doc_id и рассчитан балл MaxSim для получения окончательных ранжированных результатов.

    +
    class MilvusColbertRetriever:
    +    def __init__(self, milvus_client, collection_name, dim=128):
    +        # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.
    +        # If the collection exists, load it.
    +        self.collection_name = collection_name
    +        self.client = milvus_client
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.load_collection(collection_name)
    +        self.dim = dim
    +
    +    def create_collection(self):
    +        # Create a new collection in Milvus for storing embeddings.
    +        # Drop the existing collection if it already exists and define the schema for the collection.
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.drop_collection(collection_name=self.collection_name)
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_fields=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=self.dim
    +        )
    +        schema.add_field(field_name="seq_id", datatype=DataType.INT16)
    +        schema.add_field(field_name="doc_id", datatype=DataType.INT64)
    +        schema.add_field(field_name="doc", datatype=DataType.VARCHAR, max_length=65535)
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name, schema=schema
    +        )
    +
    +    def create_index(self):
    +        # Create an index on the vector field to enable fast similarity search.
    +        # Releases and drops any existing index before creating a new one with specified parameters.
    +        self.client.release_collection(collection_name=self.collection_name)
    +        self.client.drop_index(
    +            collection_name=self.collection_name, index_name="vector"
    +        )
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="vector",
    +            index_name="vector_index",
    +            index_type="HNSW",  # or any other index type you want
    +            metric_type="IP",  # or the appropriate metric type
    +            params={
    +                "M": 16,
    +                "efConstruction": 500,
    +            },  # adjust these parameters as needed
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def create_scalar_index(self):
    +        # Create a scalar index for the "doc_id" field to enable fast lookups by document ID.
    +        self.client.release_collection(collection_name=self.collection_name)
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="doc_id",
    +            index_name="int32_index",
    +            index_type="INVERTED",  # or any other index type you want
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def search(self, data, topk):
    +        # Perform a vector search on the collection to find the top-k most similar documents.
    +        search_params = {"metric_type": "IP", "params": {}}
    +        results = self.client.search(
    +            self.collection_name,
    +            data,
    +            limit=int(50),
    +            output_fields=["vector", "seq_id", "doc_id"],
    +            search_params=search_params,
    +        )
    +        doc_ids = set()
    +        for r_id in range(len(results)):
    +            for r in range(len(results[r_id])):
    +                doc_ids.add(results[r_id][r]["entity"]["doc_id"])
    +
    +        scores = []
    +
    +        def rerank_single_doc(doc_id, data, client, collection_name):
    +            # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.
    +            doc_colbert_vecs = client.query(
    +                collection_name=collection_name,
    +                filter=f"doc_id in [{doc_id}]",
    +                output_fields=["seq_id", "vector", "doc"],
    +                limit=1000,
    +            )
    +            doc_vecs = np.vstack(
    +                [doc_colbert_vecs[i]["vector"] for i in range(len(doc_colbert_vecs))]
    +            )
    +            score = np.dot(data, doc_vecs.T).max(1).sum()
    +            return (score, doc_id)
    +
    +        with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:
    +            futures = {
    +                executor.submit(
    +                    rerank_single_doc, doc_id, data, client, self.collection_name
    +                ): doc_id
    +                for doc_id in doc_ids
    +            }
    +            for future in concurrent.futures.as_completed(futures):
    +                score, doc_id = future.result()
    +                scores.append((score, doc_id))
    +
    +        scores.sort(key=lambda x: x[0], reverse=True)
    +        if len(scores) >= topk:
    +            return scores[:topk]
    +        else:
    +            return scores
    +
    +    def insert(self, data):
    +        # Insert ColBERT embeddings and metadata for a document into the collection.
    +        colbert_vecs = [vec for vec in data["colbert_vecs"]]
    +        seq_length = len(colbert_vecs)
    +        doc_ids = [data["doc_id"] for i in range(seq_length)]
    +        seq_ids = list(range(seq_length))
    +        docs = [""] * seq_length
    +        docs[0] = data["filepath"]
    +
    +        # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.
    +        self.client.insert(
    +            self.collection_name,
    +            [
    +                {
    +                    "vector": colbert_vecs[i],
    +                    "seq_id": seq_ids[i],
    +                    "doc_id": doc_ids[i],
    +                    "doc": docs[i],
    +                }
    +                for i in range(seq_length)
    +            ],
    +        )
    +
    +

    Мы будем использовать colpali_engine для извлечения списков вкраплений для двух запросов и извлечения релевантной информации из PDF-страниц.

    +
    from colpali_engine.models import ColPali
    +from colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor
    +from colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor
    +from colpali_engine.utils.torch_utils import ListDataset, get_torch_device
    +from torch.utils.data import DataLoader
    +import torch
    +from typing import List, cast
    +
    +device = get_torch_device("cpu")
    +model_name = "vidore/colpali-v1.2"
    +
    +model = ColPali.from_pretrained(
    +    model_name,
    +    torch_dtype=torch.bfloat16,
    +    device_map=device,
    +).eval()
    +
    +queries = [
    +    "How to end-to-end retrieval with ColBert?",
    +    "Where is ColBERT performance table?",
    +]
    +
    +processor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](queries),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_queries(x),
    +)
    +
    +qs: List[torch.Tensor] = []
    +for batch_query in dataloader:
    +    with torch.no_grad():
    +        batch_query = {k: v.to(model.device) for k, v in batch_query.items()}
    +        embeddings_query = model(**batch_query)
    +    qs.extend(list(torch.unbind(embeddings_query.to("cpu"))))
    +
    +

    Кроме того, нам нужно извлечь список вкраплений для каждой страницы, а он показывает, что для каждой страницы имеется 1030 128-мерных вкраплений.

    +
    from tqdm import tqdm
    +from PIL import Image
    +import os
    +
    +images = [Image.open("./pages/" + name) for name in os.listdir("./pages")]
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](images),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_images(x),
    +)
    +
    +ds: List[torch.Tensor] = []
    +for batch_doc in tqdm(dataloader):
    +    with torch.no_grad():
    +        batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
    +        embeddings_doc = model(**batch_doc)
    +    ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
    +
    +print(ds[0].shape)
    +
    +
      0%|          | 0/10 [00:00<?, ?it/s]
    +
    +100%|██████████| 10/10 [01:22<00:00,  8.24s/it]
    +
    +torch.Size([1030, 128])
    +
    +

    Мы создадим коллекцию под названием "colpali" с помощью MilvusColbertRetriever.

    +
    retriever = MilvusColbertRetriever(collection_name="colpali", milvus_client=client)
    +retriever.create_collection()
    +retriever.create_index()
    +
    +

    Мы вставим списки вкраплений в базу данных Milvus.

    +
    filepaths = ["./pages/" + name for name in os.listdir("./pages")]
    +for i in range(len(filepaths)):
    +    data = {
    +        "colbert_vecs": ds[i].float().numpy(),
    +        "doc_id": i,
    +        "filepath": filepaths[i],
    +    }
    +    retriever.insert(data)
    +
    +

    Теперь мы можем искать наиболее релевантную страницу, используя список вкраплений по запросу.

    +
    for query in qs:
    +    query = query.float().numpy()
    +    result = retriever.search(query, topk=1)
    +    print(filepaths[result[0][1]])
    +
    +
    ./pages/page_5.png
    +./pages/page_7.png
    +
    +

    Наконец, мы получим оригинальное название страницы. С помощью ColPali мы можем извлекать мультимодальные документы, не прибегая к сложным технологиям обработки для извлечения текста и изображений из документов. Благодаря использованию больших моделей зрения можно анализировать больше информации, например таблицы и рисунки, без существенной потери информации.

    diff --git a/localization/v2.5.x/site/ru/tutorials/vector_visualization.json b/localization/v2.5.x/site/ru/tutorials/vector_visualization.json new file mode 100644 index 000000000..bf3d5b0b2 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/vector_visualization.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-large\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","# Modify the question to test it with your own query!\n\nquestion = \"How is data stored in Milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=10, # Return top 10 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","import pandas as pd\nimport numpy as np\nfrom sklearn.manifold import TSNE\n\ndata.append({\"id\": len(data), \"vector\": emb_text(question), \"text\": question})\nembeddings = []\nfor gp in data:\n embeddings.append(gp[\"vector\"])\n\nX = np.array(embeddings, dtype=np.float32)\ntsne = TSNE(random_state=0, max_iter=1000)\ntsne_results = tsne.fit_transform(X)\n\ndf_tsne = pd.DataFrame(tsne_results, columns=[\"TSNE1\", \"TSNE2\"])\ndf_tsne\n","import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Extract similar ids from search results\nsimilar_ids = [gp[\"id\"] for gp in search_res[0]]\n\ndf_norm = df_tsne[:-1]\n\ndf_query = pd.DataFrame(df_tsne.iloc[-1]).T\n\n# Filter points based on similar ids\nsimilar_points = df_tsne[df_tsne.index.isin(similar_ids)]\n\n# Create the plot\nfig, ax = plt.subplots(figsize=(8, 6)) # Set figsize\n\n# Set the style of the plot\nsns.set_style(\"darkgrid\", {\"grid.color\": \".6\", \"grid.linestyle\": \":\"})\n\n# Plot all points in blue\nsns.scatterplot(\n data=df_tsne, x=\"TSNE1\", y=\"TSNE2\", color=\"blue\", label=\"All knowledge\", ax=ax\n)\n\n# Overlay similar points in red\nsns.scatterplot(\n data=similar_points,\n x=\"TSNE1\",\n y=\"TSNE2\",\n color=\"red\",\n label=\"Similar knowledge\",\n ax=ax,\n)\n\nsns.scatterplot(\n data=df_query, x=\"TSNE1\", y=\"TSNE2\", color=\"green\", label=\"Query\", ax=ax\n)\n\n# Set plot titles and labels\nplt.title(\"Scatter plot of knowledge using t-SNE\")\nplt.xlabel(\"TSNE1\")\nplt.ylabel(\"TSNE2\")\n\n# Set axis to be equal\nplt.axis(\"equal\")\n\n# Display the legend\nplt.legend()\n\n# Show the plot\nplt.show()\n"],"headingContent":"Vector Visualization","anchorList":[{"label":"Визуализация векторов","href":"Vector-Visualization","type":1,"isActive":false},{"label":"Подготовка","href":"Preparation","type":2,"isActive":false},{"label":"Подготовьте данные","href":"Prepare-the-data","type":2,"isActive":false},{"label":"Подготовка модели встраивания","href":"Prepare-the-Embedding-Model","type":2,"isActive":false},{"label":"Загрузка данных в Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data","type":2,"isActive":false},{"label":"Визуализация вкраплений в векторном поиске","href":"Visualizing-Embeddings-in-Vector-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/vector_visualization.md b/localization/v2.5.x/site/ru/tutorials/vector_visualization.md new file mode 100644 index 000000000..da74e4afc --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/vector_visualization.md @@ -0,0 +1,434 @@ +--- +id: vector_visualization.md +summary: >- + В этом примере мы покажем, как визуализировать вкрапления (векторы) в Milvus с + помощью t-SN. +title: Визуализация векторов +--- +

    Визуализация векторов

    +Open In Colab + + +GitHub Repository +

    +

    В этом примере мы покажем, как визуализировать вкрапления (векторы) в Milvus с помощью t-SNE.

    +

    Методы уменьшения размерности, такие как t-SNE, неоценимы для визуализации сложных, высокоразмерных данных в 2D или 3D пространстве с сохранением локальной структуры. Это позволяет распознавать закономерности, улучшает понимание взаимосвязей между признаками и облегчает интерпретацию результатов работы моделей машинного обучения. Кроме того, это помогает в оценке алгоритмов путем визуального сравнения результатов кластеризации, упрощает представление данных для неспециалистов и позволяет снизить вычислительные затраты за счет работы с более низкоразмерными представлениями. Благодаря этим приложениям t-SNE не только помогает глубже изучить наборы данных, но и способствует принятию более обоснованных решений.

    +

    Подготовка

    Зависимости и среда

    $ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn
    +
    +

    В этом примере мы будем использовать модель встраивания OpenAI. Вы должны подготовить api ключ OPENAI_API_KEY в качестве переменной окружения.

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    Подготовьте данные

    Мы используем страницы FAQ из Milvus Documentation 2.4.x в качестве приватного знания в нашем RAG, который является хорошим источником данных для простого RAG-конвейера.

    +

    Скачайте zip-файл и распакуйте документы в папку milvus_docs.

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    Мы загружаем все файлы разметки из папки milvus_docs/en/faq. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    Подготовка модели встраивания

    Мы инициализируем клиент OpenAI, чтобы подготовить модель встраивания.

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    Определите функцию для генерации текстовых вкраплений с помощью клиента OpenAI. В качестве примера мы используем модель text-embedding-3-large.

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-large")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    Сгенерируйте тестовое вкрапление и выведите его размерность и первые несколько элементов.

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    3072
    +[-0.015370666049420834, 0.00234124343842268, -0.01011690590530634, 0.044725317507982254, -0.017235849052667618, -0.02880779094994068, -0.026678944006562233, 0.06816216558218002, -0.011376636102795601, 0.021659553050994873]
    +
    +

    Загрузка данных в Milvus

    Создайте коллекцию

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    Что касается аргумента MilvusClient:

    +
      +
    • Установка uri в качестве локального файла, например./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.
    • +
    • Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, напримерhttp://localhost:19530, в качестве uri.
    • +
    • Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
    • +
    +
    +

    Проверьте, не существует ли уже коллекция, и удалите ее, если она существует.

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    Создайте новую коллекцию с указанными параметрами.

    +

    Если мы не укажем информацию о полях, Milvus автоматически создаст поле по умолчанию id для первичного ключа и поле vector для хранения векторных данных. Зарезервированное поле JSON используется для хранения не определенных схемой полей и их значений.

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    Вставка данных

    Пройдитесь по текстовым строкам, создайте вкрапления, а затем вставьте данные в Milvus.

    +

    Вот новое поле text, которое является неопределенным полем в схеме коллекции. Оно будет автоматически добавлено в зарезервированное динамическое поле JSON, с которым можно обращаться как с обычным полем на высоком уровне.

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:20<00:00,  3.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    В этом разделе мы выполним поиск по милвусу, а затем визуализируем вектор запроса и полученный вектор вместе в уменьшенном измерении.

    +

    Получение данных для запроса

    Подготовим вопрос для поиска.

    +
    # Modify the question to test it with your own query!
    +
    +question = "How is data stored in Milvus?"
    +
    +

    Найдем вопрос в коллекции и получим семантический топ-10 совпадений.

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=10,  # Return top 10 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    Давайте посмотрим на результаты поиска по запросу

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7675539255142212
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6210848689079285
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.585393488407135
    +    ],
    +    [
    +        "Why is there no vector data in etcd?\n\netcd stores Milvus module metadata; MinIO stores entities.\n\n###",
    +        0.579704999923706
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5777501463890076
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5655910968780518
    +    ],
    +    [
    +        "Does Milvus support inserting and searching data simultaneously?\n\nYes. Insert operations and query operations are handled by two separate modules that are mutually independent. From the client\u2019s perspective, an insert operation is complete when the inserted data enters the message queue. However, inserted data are unsearchable until they are loaded to the query node. If the segment size does not reach the index-building threshold (512 MB by default), Milvus resorts to brute-force search and query performance may be diminished.\n\n###",
    +        0.5618637204170227
    +    ],
    +    [
    +        "What data types does Milvus support on the primary key field?\n\nIn current release, Milvus supports both INT64 and string.\n\n###",
    +        0.5561620593070984
    +    ],
    +    [
    +        "Is Milvus available for concurrent search?\n\nYes. For queries on the same collection, Milvus concurrently searches the incremental and historical data. However, queries on different collections are conducted in series. Whereas the historical data can be an extremely huge dataset, searches on the historical data are relatively more time-consuming and essentially performed in series.\n\n###",
    +        0.529681921005249
    +    ],
    +    [
    +        "Can vectors with duplicate primary keys be inserted into Milvus?\n\nYes. Milvus does not check if vector primary keys are duplicates.\n\n###",
    +        0.528809666633606
    +    ]
    +]
    +
    +

    Снижение размерности до 2-д с помощью t-SNE

    Уменьшим размерность вкраплений до 2-d с помощью t-SNE. Для выполнения преобразования t-SNE мы воспользуемся библиотекой sklearn.

    +
    import pandas as pd
    +import numpy as np
    +from sklearn.manifold import TSNE
    +
    +data.append({"id": len(data), "vector": emb_text(question), "text": question})
    +embeddings = []
    +for gp in data:
    +    embeddings.append(gp["vector"])
    +
    +X = np.array(embeddings, dtype=np.float32)
    +tsne = TSNE(random_state=0, max_iter=1000)
    +tsne_results = tsne.fit_transform(X)
    +
    +df_tsne = pd.DataFrame(tsne_results, columns=["TSNE1", "TSNE2"])
    +df_tsne
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TSNE1TSNE2
    0-3.8773620.866726
    1-5.9230840.671701
    2-0.6459540.240083
    30.4445821.222875
    46.503896-4.984684
    .........
    696.3540551.264959
    706.0559611.266211
    71-1.5160031.328765
    723.971772-0.681780
    733.971772-0.681780
    +

    74 строки × 2 столбца

    +
    +

    Визуализация результатов поиска Milvus на двумерной плоскости

    Мы изобразим вектор запроса зеленым цветом, найденные векторы - красным, а оставшиеся векторы - синим.

    +
    import matplotlib.pyplot as plt
    +import seaborn as sns
    +
    +# Extract similar ids from search results
    +similar_ids = [gp["id"] for gp in search_res[0]]
    +
    +df_norm = df_tsne[:-1]
    +
    +df_query = pd.DataFrame(df_tsne.iloc[-1]).T
    +
    +# Filter points based on similar ids
    +similar_points = df_tsne[df_tsne.index.isin(similar_ids)]
    +
    +# Create the plot
    +fig, ax = plt.subplots(figsize=(8, 6))  # Set figsize
    +
    +# Set the style of the plot
    +sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
    +
    +# Plot all points in blue
    +sns.scatterplot(
    +    data=df_tsne, x="TSNE1", y="TSNE2", color="blue", label="All knowledge", ax=ax
    +)
    +
    +# Overlay similar points in red
    +sns.scatterplot(
    +    data=similar_points,
    +    x="TSNE1",
    +    y="TSNE2",
    +    color="red",
    +    label="Similar knowledge",
    +    ax=ax,
    +)
    +
    +sns.scatterplot(
    +    data=df_query, x="TSNE1", y="TSNE2", color="green", label="Query", ax=ax
    +)
    +
    +# Set plot titles and labels
    +plt.title("Scatter plot of knowledge using t-SNE")
    +plt.xlabel("TSNE1")
    +plt.ylabel("TSNE2")
    +
    +# Set axis to be equal
    +plt.axis("equal")
    +
    +# Display the legend
    +plt.legend()
    +
    +# Show the plot
    +plt.show()
    +
    +

    + + png + png

    +

    Как мы видим, вектор запроса находится близко к найденным векторам. Хотя найденные векторы не входят в стандартный круг с фиксированным радиусом, центром которого является запрос, мы видим, что они все еще очень близки к вектору запроса на 2D-плоскости.

    +

    Использование методов снижения размерности может облегчить понимание векторов и поиск неисправностей. Надеюсь, вы сможете лучше понять векторы благодаря этому уроку.

    diff --git a/localization/v2.5.x/site/ru/tutorials/video_similarity_search.json b/localization/v2.5.x/site/ru/tutorials/video_similarity_search.json new file mode 100644 index 000000000..5bdf76e78 --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/video_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Video Similarity Search","anchorList":[{"label":"Поиск по сходству видео","href":"Video-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/tutorials/video_similarity_search.md b/localization/v2.5.x/site/ru/tutorials/video_similarity_search.md new file mode 100644 index 000000000..2b5c708ab --- /dev/null +++ b/localization/v2.5.x/site/ru/tutorials/video_similarity_search.md @@ -0,0 +1,40 @@ +--- +id: video_similarity_search.md +summary: Создайте систему поиска по сходству видео с помощью Milvus. +title: Поиск по сходству видео +--- +

    Поиск по сходству видео

    В этом руководстве показано, как использовать Milvus, векторную базу данных с открытым исходным кодом, для создания системы поиска сходства видео.

    + +

    Используемые ML-модели и стороннее программное обеспечение включают:

    +
      +
    • OpenCV
    • +
    • ResNet-50
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    В наши дни после просмотра понравившегося фильма или видео люди могут легко сделать скриншоты и поделиться своими мыслями, разместив их на различных платформах социальных сетей. Когда подписчики видят скриншоты, им бывает очень сложно определить, о каком фильме идет речь, если название фильма не указано в сообщении. Чтобы узнать название фильма, люди могут воспользоваться системой поиска по сходству видео. С помощью этой системы пользователи могут загрузить изображение и получить видео или фильмы, содержащие ключевые кадры, похожие на загруженное изображение.

    +


    +

    В этом уроке вы узнаете, как создать систему поиска по сходству видео. Для создания системы в этом уроке используется около 100 анимированных gif на Tumblr. Однако вы можете подготовить и свои собственные наборы данных видео. Сначала система использует OpenCV для извлечения ключевых кадров из видео, а затем получает векторы признаков каждого ключевого кадра с помощью ResNet-50. Все векторы сохраняются и ищутся в Milvus, который возвращает идентификаторы похожих векторов. Затем эти идентификаторы сопоставляются с соответствующим видео, хранящимся в MySQL.

    +


    +

    + + video_search + video_search video_search_demovideo_search_demo

    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.json b/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.json new file mode 100644 index 000000000..75b5dc215 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"quick_setup\",​\n dimension=5​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .dimension(5)​\n .build();​\n​\nclient.createCollection(quickSetupReq);​\n​\nGetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(quickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nimport { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"quick_setup\",​\n dimension: 5,​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"dimension\": 5​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"custom_quick_setup\",​\n dimension=5,​\n primary_field_name=\"my_id\",​\n id_type=\"string\",​\n vector_field_name=\"my_vector\",​\n metric_type=\"L2\",​\n auto_id=True,​\n max_length=512​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .dimension(5)​\n .primaryFieldName(\"my_id\")​\n .idType(DataType.VarChar)​\n .maxLength(512)​\n .vectorFieldName(\"my_vector\")​\n .metricType(\"L2\")​\n .autoID(true)​\n .build();​\n​\nclient.createCollection(customQuickSetupReq);​\n​\nGetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(customQuickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"custom_quick_setup\",​\n dimension: 5,​\n primary_field_name: \"my_id\",​\n id_type: \"Varchar\",​\n max_length: 512,​\n vector_field_name: \"my_vector\",​\n metric_type: \"L2\",​\n auto_id: true​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\",​\n \"dimension\": 5,​\n \"primaryFieldName\": \"my_id\",​\n \"idType\": \"VarChar\",​\n \"vectorFieldName\": \"my_vector\",​\n \"metricType\": \"L2\",​\n \"autoId\": true,​\n \"params\": {​\n \"max_length\": \"512\"​\n }​\n}'​\n\n"],"headingContent":"Create Collection Instantly​","anchorList":[{"label":"Мгновенное создание коллекции","href":"Create-Collection-Instantly​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Быстрая настройка","href":"Quick-Setup​","type":2,"isActive":false},{"label":"Быстрая настройка с помощью пользовательских полей","href":"Quick-Setup-with-Custom-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.md b/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.md new file mode 100644 index 000000000..0de6b2cb3 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/create-collection-instantly.md @@ -0,0 +1,341 @@ +--- +id: create-collection-instantly.md +title: Создайте коллекцию мгновенно +--- +

    Мгновенное создание коллекции

    Вы можете мгновенно создать коллекцию, задав ее имя и размерность векторного поля. Milvus автоматически индексирует векторное поле и загружает коллекцию при ее создании. На этой странице показано, как мгновенно создать коллекцию с настройками по умолчанию.

    +

    Обзор

    Коллекция - это двумерная таблица с фиксированными столбцами и вариативными строками. Каждый столбец представляет поле, а каждая строка - сущность. Для реализации такого структурного управления данными необходима схема. Каждая вставляемая сущность должна удовлетворять ограничениям, определенным в схеме.

    +

    Приложения AIGC обычно используют векторные базы данных в качестве базы знаний для управления данными, генерируемыми в процессе взаимодействия пользователей с большими языковыми моделями (LLM). Такие базы знаний практически аналогичны. Чтобы ускорить использование кластеров Milvus в таких сценариях, вам доступен метод мгновенного создания коллекции с помощью всего двух параметров, а именно имени коллекции и размерности векторного поля.

    +

    При мгновенном создании коллекции с настройками по умолчанию применяются следующие параметры.

    +
      +
    • Первичное и векторное поля добавляются в схему(id и vector).

    • +
    • Первичное поле принимает целые числа и отключает AutoId.

    • +
    • Поле vector принимает плавающие векторные вложения.

    • +
    • AUTOINDEX используется для создания индекса на векторном поле.

    • +
    • COSINE используется для измерения сходства между векторными вкраплениями.

    • +
    • Динамическое поле резервов с именем $meta используется для сохранения не определенных схемой полей и их значений в парах ключ-значение.

    • +
    • Коллекция автоматически загружается при создании.

    • +
    +

    Для получения подробной информации о вышеупомянутых терминах см. раздел "Объяснение коллекции".

    +

    Стоит отметить, что мгновенное создание коллекции с настройками по умолчанию подходит не для всех сценариев. Советуем ознакомиться с общей процедурой создания коллекции, чтобы лучше понять возможности Milvus.

    +

    Быстрая настройка

    Таким образом, вы можете мгновенно создать коллекцию, указав только имя коллекции и размерность векторного поля.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="quick_setup",​
    +    dimension=5​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .dimension(5)​
    +        .build();​
    +​
    +client.createCollection(quickSetupReq);​
    +​
    +GetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(quickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "quick_setup",​
    +    dimension: 5,​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "dimension": 5​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    Быстрая настройка с помощью пользовательских полей

    Если тип метрики, имена полей и типы данных по умолчанию не удовлетворяют вашим потребностям, вы можете настроить эти параметры следующим образом.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="custom_quick_setup",​
    +    dimension=5,​
    +    primary_field_name="my_id",​
    +    id_type="string",​
    +    vector_field_name="my_vector",​
    +    metric_type="L2",​
    +    auto_id=True,​
    +    max_length=512​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .dimension(5)​
    +        .primaryFieldName("my_id")​
    +        .idType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .vectorFieldName("my_vector")​
    +        .metricType("L2")​
    +        .autoID(true)​
    +        .build();​
    +​
    +client.createCollection(customQuickSetupReq);​
    +​
    +GetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(customQuickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "custom_quick_setup",​
    +    dimension: 5,​
    +    primary_field_name: "my_id",​
    +    id_type: "Varchar",​
    +    max_length: 512,​
    +    vector_field_name: "my_vector",​
    +    metric_type: "L2",​
    +    auto_id: true​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup",​
    +    "dimension": 5,​
    +    "primaryFieldName": "my_id",​
    +    "idType": "VarChar",​
    +    "vectorFieldName": "my_vector",​
    +    "metricType": "L2",​
    +    "autoId": true,​
    +    "params": {​
    +        "max_length": "512"​
    +    }​
    +}'​
    +
    +
    +

    Если коллекции, созданные двумя вышеуказанными способами, все еще не удовлетворяют вашим потребностям, выполните процедуру в разделе "Создание коллекции".

    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/create-collection.json b/localization/v2.5.x/site/ru/userGuide/collections/create-collection.json new file mode 100644 index 000000000..b5005a694 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/create-collection.json @@ -0,0 +1 @@ +{"codeList":["# 3. Create a collection in customized setup mode​\nfrom pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 3.1. Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n​\n# 3.2. Add fields to schema​\nschema.add_field(field_name=\"my_id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"my_vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"my_varchar\", datatype=DataType.VARCHAR, max_length=512)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 3. Create a collection in customized setup mode​\n​\n// 3.1 Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// 3.2 Add fields to schema​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n dim: 5​\n },​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512​\n }​\n]​\n\n","import \"github.com/milvus-io/milvus/client/v2/entity\"​\n​\nschema := entity.NewSchema().WithDynamicFieldEnabled(true).​\n WithField(entity.NewField().WithName(\"my_id\").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​\n WithField(entity.NewField().WithName(\"my_vector\").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​\n WithField(entity.NewField().WithName(\"my_varchar\").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","# 3.3. Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# 3.4. Add indexes​\nindex_params.add_index(​\n field_name=\"my_id\",​\n index_type=\"STL_SORT\"​\n)​\n​\nindex_params.add_index(​\n field_name=\"my_vector\", ​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\n// 3.3 Prepare index parameters​\nIndexParam indexParamForIdField = IndexParam.builder()​\n .fieldName(\"my_id\")​\n .indexType(IndexParam.IndexType.STL_SORT)​\n .build();​\n​\nIndexParam indexParamForVectorField = IndexParam.builder()​\n .fieldName(\"my_vector\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForIdField);​\nindexParams.add(indexParamForVectorField);​\n\n","// 3.2 Prepare index parameters​\nconst index_params = [{​\n field_name: \"my_id\",​\n index_type: \"STL_SORT\"​\n},{​\n field_name: \"my_vector\",​\n index_type: \"AUTOINDEX\",​\n metric_type: \"COSINE\"​\n}]​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n \"github.com/milvus-io/milvus/client/v2/index\"​\n)​\n​\nindexOptions := []client.CreateIndexOption{​\n client.NewCreateIndexOption(collectionName, \"my_vector\", index.NewAutoIndex(entity.COSINE)).WithIndexName(\"my_vector\"),​\n client.NewCreateIndexOption(collectionName, \"my_id\", index.NewSortedIndex()).WithIndexName(\"my_id\"),​\n}​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"my_vector\",​\n \"metricType\": \"COSINE\",​\n \"indexName\": \"my_vector\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"my_id\",​\n \"indexName\": \"my_id\",​\n \"indexType\": \"STL_SORT\"​\n }​\n ]'​\n\n","# 3.5. Create a collection with the index loaded simultaneously​\nclient.create_collection(​\n collection_name=\"customized_setup_1\",​\n schema=schema,​\n index_params=index_params​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n// 3.4 Create a collection with schema and index parameters​\nCreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\n​\nclient.createCollection(customizedSetupReq1);​\n​\n// 3.5 Get load state of the collection​\nGetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq1);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// true​\n\n","// 3.3 Create a collection with fields and index parameters​\nres = await client.createCollection({​\n collection_name: \"customized_setup_1\",​\n fields: fields,​\n index_params: index_params,​\n})​\n​\nconsole.log(res.error_code) ​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_1\", schema).​\n WithIndexOptions(indexOptions...),​\n)​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_1\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# 3.6. Create a collection and index it separately​\nclient.create_collection(​\n collection_name=\"customized_setup_2\",​\n schema=schema,​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 3.6 Create a collection and index it separately​\nCreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .collectionSchema(schema)​\n .build();​\n​\nclient.createCollection(customizedSetupReq2);​\n​\nGetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n ​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq2);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// false​\n\n","// 3.4 Create a collection and index it seperately​\nres = await client.createCollection({​\n collection_name: \"customized_setup_2\",​\n fields: fields,​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_2\", schema))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\",​\n \\\"schema\\\": $schema​\n}\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\"​\n}\"​\n\n","# With shard number​\nclient.create_collection(​\n collection_name=\"customized_setup_3\",​\n schema=schema,​\n # highlight-next-line​\n num_shards=1​\n)​\n\n","// With shard number​\nCreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_3\")​\n .collectionSchema(collectionSchema)​\n // highlight-next-line​\n .numShards(1)​\n .build();​\nclient.createCollection(customizedSetupReq3);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_3\",​\n schema: schema,​\n // highlight-next-line​\n shards_num: 1​\n}​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_3\", schema).WithShardNum(1))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"shardsNum\": 1​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_3\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With mmap​\nclient.create_collection(​\n collection_name=\"customized_setup_4\",​\n schema=schema,​\n # highlight-next-line​\n enable_mmap=False​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With MMap​\nCreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_4\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.MMAP_ENABLED, \"false\")​\n .build();​\nclient.createCollection(customizedSetupReq4);​\n\n","client.create_collection({​\n collection_name: \"customized_setup_4\",​\n schema: schema,​\n properties: {​\n 'mmap.enabled': true,​\n },​\n})​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_4\", schema).WithProperty(common.MmapEnabledKey, true))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","# Currently not available for REST\n\n","# With TTL​\nclient.create_collection(​\n collection_name=\"customized_setup_5\",​\n schema=schema,​\n # highlight-start​\n properties={​\n \"collection.ttl.seconds\": 86400​\n }​\n # highlight-end​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With TTL​\nCreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_5\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.TTL_SECONDS, \"86400\")​\n .build();​\nclient.createCollection(customizedSetupReq5);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_5\",​\n schema: schema,​\n // highlight-start​\n properties: {​\n \"collection.ttl.seconds\": 86400​\n }​\n // highlight-end​\n}​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr = cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_5\", schema).​\n WithProperty(common.CollectionTTLConfigKey, 86400)) // TTL in seconds​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"ttlSeconds\": 86400​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_5\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With consistency level​\nclient.create_collection(​\n collection_name=\"customized_setup_6\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Bounded\",​\n)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\n​\n// With consistency level​\nCreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_6\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nclient.createCollection(customizedSetupReq6);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_6\",​\n schema: schema,​\n // highlight-next​\n consistency_level: \"Bounded\",​\n // highlight-end​\n}​\n​\nclient.createCollection(createCollectionReq);​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_6\", schema).​\n WithConsistencyLevel(entity.ClBounded))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_6\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n"],"headingContent":"Create Collection​","anchorList":[{"label":"Создать коллекцию","href":"Create-Collection​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создать схему","href":"Create-Schema​","type":2,"isActive":false},{"label":"(Необязательно) Установка параметров индекса","href":"Optional-Set-Index-Parameters​","type":2,"isActive":false},{"label":"Создать коллекцию","href":"Create-Collection​","type":2,"isActive":false},{"label":"Установка свойств коллекции","href":"Set-Collection-Properties​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/create-collection.md b/localization/v2.5.x/site/ru/userGuide/collections/create-collection.md new file mode 100644 index 000000000..aacfcbc09 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/create-collection.md @@ -0,0 +1,760 @@ +--- +id: create-collection.md +title: Создать коллекцию +--- +

    Создать коллекцию

    Вы можете создать коллекцию, определив ее схему, параметры индекса, тип метрики и необходимость загрузки при создании. На этой странице описано, как создать коллекцию с нуля.

    +

    Обзор

    Коллекция - это двумерная таблица с фиксированными столбцами и вариантами строк. Каждый столбец представляет поле, а каждая строка - сущность. Для реализации такого структурного управления данными необходима схема. Каждая вставляемая сущность должна соответствовать ограничениям, определенным в схеме.

    +

    Вы можете определить каждый аспект коллекции, включая ее схему, параметры индекса, тип метрики и необходимость ее загрузки при создании, чтобы убедиться, что коллекция полностью соответствует вашим требованиям.

    +

    Чтобы создать коллекцию, необходимо

    + +

    Создать схему

    Схема определяет структуру данных коллекции. При создании коллекции необходимо разработать схему в соответствии с вашими требованиями. Для получения подробной информации см. раздел "Объяснение схемы".

    +

    Следующие фрагменты кода создают схему с динамическим полем enabled и тремя обязательными полями my_id, my_vector и my_varchar.

    +
    +

    Вы можете установить значения по умолчанию для любого скалярного поля и сделать его нулевым. Подробнее см. в разделе Nullable & Default.

    +
    + +
    # 3. Create a collection in customized setup mode​
    +from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 3.1. Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +​
    +# 3.2. Add fields to schema​
    +schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 3. Create a collection in customized setup mode​
    +​
    +// 3.1 Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// 3.2 Add fields to schema​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "my_vector",​
    +        data_type: DataType.FloatVector,​
    +        dim: 5​
    +    },​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512​
    +    }​
    +]​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2/entity"​
    +​
    +schema := entity.NewSchema().WithDynamicFieldEnabled(true).​
    +        WithField(entity.NewField().WithName("my_id").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​
    +        WithField(entity.NewField().WithName("my_vector").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​
    +        WithField(entity.NewField().WithName("my_varchar").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    (Необязательно) Установка параметров индекса

    Создание индекса для определенного поля ускоряет поиск по этому полю. Индекс записывает порядок следования сущностей в коллекции. Как показано в следующих фрагментах кода, вы можете использовать metric_type и index_type для выбора подходящих способов индексации поля в Milvus и измерения сходства между векторными вкраплениями.

    +

    В Milvus вы можете использовать AUTOINDEX в качестве типа индекса для всех векторных полей и один из COSINE, L2 и IP в качестве типа метрики в зависимости от ваших потребностей.

    +

    Как показано в приведенном выше фрагменте кода, для векторных полей необходимо задать как тип индекса, так и тип метрики, а для скалярных полей - только тип индекса. Индексы обязательны для векторных полей, и рекомендуется создавать индексы для скалярных полей, часто используемых в условиях фильтрации.

    +

    Подробнее см. в разделе "Индексы".

    + +
    # 3.3. Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# 3.4. Add indexes​
    +index_params.add_index(​
    +    field_name="my_id",​
    +    index_type="STL_SORT"​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="my_vector", ​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +// 3.3 Prepare index parameters​
    +IndexParam indexParamForIdField = IndexParam.builder()​
    +        .fieldName("my_id")​
    +        .indexType(IndexParam.IndexType.STL_SORT)​
    +        .build();​
    +​
    +IndexParam indexParamForVectorField = IndexParam.builder()​
    +        .fieldName("my_vector")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForIdField);​
    +indexParams.add(indexParamForVectorField);​
    +
    +
    +
    // 3.2 Prepare index parameters​
    +const index_params = [{​
    +    field_name: "my_id",​
    +    index_type: "STL_SORT"​
    +},{​
    +    field_name: "my_vector",​
    +    index_type: "AUTOINDEX",​
    +    metric_type: "COSINE"​
    +}]​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +    "github.com/milvus-io/milvus/client/v2/index"​
    +)​
    +​
    +indexOptions := []client.CreateIndexOption{​
    +    client.NewCreateIndexOption(collectionName, "my_vector", index.NewAutoIndex(entity.COSINE)).WithIndexName("my_vector"),​
    +    client.NewCreateIndexOption(collectionName, "my_id", index.NewSortedIndex()).WithIndexName("my_id"),​
    +}​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "my_vector",​
    +            "metricType": "COSINE",​
    +            "indexName": "my_vector",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "my_id",​
    +            "indexName": "my_id",​
    +            "indexType": "STL_SORT"​
    +        }​
    +    ]'​
    +
    +
    +

    Создание коллекции

    Если вы создали коллекцию с параметрами индекса, Milvus автоматически загружает коллекцию при ее создании. В этом случае индексируются все поля, указанные в параметрах индекса.

    +

    В следующих фрагментах кода показано, как создать коллекцию с индексными параметрами и проверить состояние ее загрузки.

    + +
    # 3.5. Create a collection with the index loaded simultaneously​
    +client.create_collection(​
    +    collection_name="customized_setup_1",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +// 3.4 Create a collection with schema and index parameters​
    +CreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +​
    +client.createCollection(customizedSetupReq1);​
    +​
    +// 3.5 Get load state of the collection​
    +GetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq1);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 3.3 Create a collection with fields and index parameters​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_1",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +​
    +console.log(res.error_code)  ​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_1", schema).​
    +    WithIndexOptions(indexOptions...),​
    +)​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_1\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вы также можете создать коллекцию без индексных параметров и добавить их впоследствии. В этом случае Milvus не загружает коллекцию при ее создании. Подробнее о том, как создать индексы для существующей коллекции, читайте в разделе Index Explained.

    +

    Следующий фрагмент кода демонстрирует, как создать коллекцию без индекса, при этом статус загрузки коллекции при создании остается незагруженным.

    + +
    # 3.6. Create a collection and index it separately​
    +client.create_collection(​
    +    collection_name="customized_setup_2",​
    +    schema=schema,​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    // 3.6 Create a collection and index it separately​
    +CreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .collectionSchema(schema)​
    +    .build();​
    +​
    +client.createCollection(customizedSetupReq2);​
    +​
    +GetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +        ​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq2);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 3.4 Create a collection and index it seperately​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    fields: fields,​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_2", schema))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\",​
    +    \"schema\": $schema​
    +}"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\"​
    +}"​
    +
    +
    +

    Milvus также предоставляет возможность мгновенного создания коллекции. Подробнее см. в разделе "Мгновенное создание коллекции".

    +

    Установка свойств коллекции

    Вы можете задать свойства создаваемой коллекции, чтобы она вписалась в ваш сервис. Ниже перечислены применимые свойства.

    +

    Установить номер осколка

    Осколки - это горизонтальные срезы коллекции. Каждый шард соответствует каналу ввода данных. По умолчанию каждая коллекция имеет один шард. При создании коллекции вы можете установить соответствующее количество шардов, исходя из ожидаемой пропускной способности и объема данных, которые будут вставляться в коллекцию.

    +

    В обычных случаях следует увеличивать количество шардов на один каждый раз, когда ожидаемая пропускная способность увеличивается на 500 МБ/с или объем данных для вставки увеличивается на 100 ГБ. Это предложение основано на нашем собственном опыте и может не полностью соответствовать сценариям ваших приложений. Вы можете изменить это число в соответствии со своими потребностями или просто использовать значение по умолчанию.

    +

    Следующий фрагмент кода демонстрирует, как установить номер шарда при создании коллекции.

    + +
    # With shard number​
    +client.create_collection(​
    +    collection_name="customized_setup_3",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_shards=1​
    +)​
    +
    +
    +
    // With shard number​
    +CreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_3")​
    +    .collectionSchema(collectionSchema)​
    +    // highlight-next-line​
    +    .numShards(1)​
    +    .build();​
    +client.createCollection(customizedSetupReq3);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_3",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    shards_num: 1​
    +}​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_3", schema).WithShardNum(1))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "shardsNum": 1​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_3\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Включить mmap

    Milvus по умолчанию включает mmap для всех коллекций, что позволяет Milvus отображать необработанные данные полей в память вместо их полной загрузки. Это уменьшает объем занимаемой памяти и увеличивает емкость коллекции. Подробнее о mmap см. в разделе Использование mmap.

    + +
    # With mmap​
    +client.create_collection(​
    +    collection_name="customized_setup_4",​
    +    schema=schema,​
    +    # highlight-next-line​
    +    enable_mmap=False​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With MMap​
    +CreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_4")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.MMAP_ENABLED, "false")​
    +        .build();​
    +client.createCollection(customizedSetupReq4);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "customized_setup_4",​
    +    schema: schema,​
    +     properties: {​
    +        'mmap.enabled': true,​
    +     },​
    +})​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_4", schema).WithProperty(common.MmapEnabledKey, true))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    # Currently not available for REST
    +
    +
    +

    Установка TTL коллекции

    Если коллекция должна быть отброшена на определенный период, подумайте о том, чтобы установить ее время жизни (TTL) в секундах. Как только TTL истечет, Milvus удалит сущности в коллекции и сбросит коллекцию. Удаление происходит асинхронно, что означает, что поиск и запросы все еще возможны до завершения удаления.

    +

    Следующий фрагмент кода устанавливает TTL на один день (86400 секунд). Рекомендуется устанавливать TTL как минимум на пару дней.

    + +
    # With TTL​
    +client.create_collection(​
    +    collection_name="customized_setup_5",​
    +    schema=schema,​
    +    # highlight-start​
    +    properties={​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With TTL​
    +CreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_5")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.TTL_SECONDS, "86400")​
    +        .build();​
    +client.createCollection(customizedSetupReq5);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_5",​
    +    schema: schema,​
    +    // highlight-start​
    +    properties: {​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    // highlight-end​
    +}​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err = cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_5", schema).​
    +        WithProperty(common.CollectionTTLConfigKey, 86400)) //  TTL in seconds​
    +if err != nil {​
    +        // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "ttlSeconds": 86400​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_5\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Установка уровня согласованности

    При создании коллекции вы можете установить уровень согласованности для поисков и запросов в коллекции. Вы также можете изменить уровень согласованности коллекции во время определенного поиска или запроса.

    + +
    # With consistency level​
    +client.create_collection(​
    +    collection_name="customized_setup_6",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Bounded",​
    +)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +​
    +// With consistency level​
    +CreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_6")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +client.createCollection(customizedSetupReq6);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_6",​
    +    schema: schema,​
    +    // highlight-next​
    +    consistency_level: "Bounded",​
    +    // highlight-end​
    +}​
    +​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_6", schema).​
    +    WithConsistencyLevel(entity.ClBounded))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_6\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Подробнее об уровнях согласованности см. в разделе Уровень согласованности.

    +

    Включение динамического поля

    Динамическое поле в коллекции - это зарезервированное поле JavaScript Object Notation (JSON) с именем $meta. После включения этого поля Milvus сохраняет все не определенные схемой поля, содержащиеся в каждой сущности, и их значения в виде пар ключ-значение в зарезервированном поле.

    +

    Подробнее о том, как использовать динамическое поле, читайте в разделе Динамическое поле.

    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.json b/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.json new file mode 100644 index 000000000..caa437090 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.drop_collection(​\n collection_name=\"customized_setup_2\"​\n)​\n\n","import io.milvus.v2.service.collection.request.DropCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nclient.dropCollection(dropQuickSetupParam);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 10. Drop the collection​\nres = await client.dropCollection({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.DropCollection(ctx, client.NewDropCollectionOption(\"customized_setup_2\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Drop Collection​","anchorList":[{"label":"Бросить коллекцию","href":"Drop-Collection​","type":1,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.md b/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.md new file mode 100644 index 000000000..c04823c99 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/drop-collection.md @@ -0,0 +1,138 @@ +--- +id: drop-collection.md +title: Бросить коллекцию +--- +

    Бросить коллекцию

    Вы можете отказаться от коллекции, если она больше не нужна.

    +

    Примеры

    В следующих фрагментах кода предполагается, что у вас есть коллекция с именем customized_setup_2.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.drop_collection(​
    +    collection_name="customized_setup_2"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DropCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +client.dropCollection(dropQuickSetupParam);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 10. Drop the collection​
    +res = await client.dropCollection({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.DropCollection(ctx, client.NewDropCollectionOption("customized_setup_2"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.json b/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.json new file mode 100644 index 000000000..407522d20 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 7. Load the collection​\nclient.load_collection(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.LoadCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Load the collection​\nres = await client.loadCollection({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\ndefer cli.Close(ctx)​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.load_collection(​\n collection_name=\"customized_setup_1\",​\n # highlight-next-line​\n load_fields=[\"my_id\", \"my_vector\"] # Load only the specified fields​\n skip_load_dynamic_field=True # Skip loading the dynamic field​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .loadFields(Arrays.asList(\"my_id\", \"my_vector\"))​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n\n","await client.load_collection({​\n collection_name: \"customized_setup_1\",​\n load_fields: [\"my_id\", \"my_vector\"], // Load only the specified fields​\n skip_load_dynamic_field: true //Skip loading the dynamic field​\n});​\n​\nconst loadState = client.getCollectionLoadState({​\n collection_name: \"customized_setup_1\",​\n})​\n​\nconsole.log(loadState);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\").​\n WithLoadFields(\"my_id\", \"my_vector\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","# REST 缺失​\n\n","# 8. Release the collection​\nclient.release_collection(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​\n​\n​\n// 8. Release the collection​\nReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nclient.releaseCollection(releaseCollectionReq);​\n​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// false​\n\n","// 8. Release the collection​\nres = await client.releaseCollection({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import (​\n \"context\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nerr := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption(\"custom_quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n"],"headingContent":"Load & Release​","anchorList":[{"label":"Загрузка и освобождение","href":"Load--Release​","type":1,"isActive":false},{"label":"Загрузка коллекции","href":"Load-Collection​","type":2,"isActive":false},{"label":"Загрузка определенных полей","href":"Load-Specific-Fields​","type":2,"isActive":false},{"label":"Освобождение коллекции","href":"Release-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.md b/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.md new file mode 100644 index 000000000..85a4a03ea --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/load-and-release.md @@ -0,0 +1,411 @@ +--- +id: load-and-release.md +title: Загрузка и освобождение +--- +

    Загрузка и освобождение

    Загрузка коллекции является необходимым условием для выполнения поиска и запросов по сходству в коллекциях. Эта страница посвящена процедурам загрузки и освобождения коллекции.

    +

    Загрузка коллекции

    При загрузке коллекции Milvus загружает индексные файлы и исходные данные всех полей в память для быстрого реагирования на поиск и запросы. Объекты, вставленные после загрузки коллекции, автоматически индексируются и загружаются.

    +

    Следующие фрагменты кода демонстрируют, как загрузить коллекцию.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 7. Load the collection​
    +client.load_collection(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.LoadCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Load the collection​
    +res = await client.loadCollection({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +defer cli.Close(ctx)​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Загрузка определенных полей

    Milvus может загружать только те поля, которые участвуют в поиске и запросах, что позволяет сократить использование памяти и повысить производительность поиска.

    +

    Следующий фрагмент кода предполагает, что вы создали коллекцию с именем customized_setup_2, и в ней есть два поля с именами my_id и my_vector.

    + +
    client.load_collection(​
    +    collection_name="customized_setup_1",​
    +    # highlight-next-line​
    +    load_fields=["my_id", "my_vector"] # Load only the specified fields​
    +    skip_load_dynamic_field=True # Skip loading the dynamic field​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    // 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .loadFields(Arrays.asList("my_id", "my_vector"))​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +
    +
    +
    await client.load_collection({​
    +  collection_name: "customized_setup_1",​
    +  load_fields: ["my_id", "my_vector"], // Load only the specified fields​
    +  skip_load_dynamic_field: true //Skip loading the dynamic field​
    +});​
    +​
    +const loadState = client.getCollectionLoadState({​
    +    collection_name: "customized_setup_1",​
    +})​
    +​
    +console.log(loadState);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1").​
    +    WithLoadFields("my_id", "my_vector"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # REST 缺失​
    +
    +
    +

    Если вы решили загрузить конкретные поля, стоит отметить, что только поля, включенные в load_fields, могут быть использованы в качестве фильтров и выходных полей в поиске и запросах. Вы всегда должны включать имена первичного поля и хотя бы одного векторного поля в load_fields.

    +

    Вы также можете использовать skip_load_dynamic_field, чтобы определить, нужно ли загружать динамическое поле. Динамическое поле - это зарезервированное JSON-поле с именем $meta, которое сохраняет все не определенные схемой поля и их значения в виде пар ключ-значение. При загрузке динамического поля все ключи в полях загружаются и доступны для фильтрации и вывода. Если все ключи динамического поля не участвуют в фильтрации и выводе метаданных, установите skip_load_dynamic_field на True.

    +

    Чтобы загрузить дополнительные поля после загрузки коллекции, необходимо сначала освободить коллекцию, чтобы избежать возможных ошибок, вызванных изменением индекса.

    +

    Освобождение коллекции

    Поиск и запросы требуют большого объема памяти. Чтобы сэкономить затраты, рекомендуется освобождать коллекции, которые в данный момент не используются.

    +

    Следующий фрагмент кода демонстрирует, как освободить коллекцию.

    + +
    # 8. Release the collection​
    +client.release_collection(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​
    +​
    +​
    +// 8. Release the collection​
    +ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +client.releaseCollection(releaseCollectionReq);​
    +​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 8. Release the collection​
    +res = await client.releaseCollection({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +err := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption("custom_quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.json b/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.json new file mode 100644 index 000000000..98c32eaad --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 9. Manage aliases​\n# 9.1. Create aliases​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"bob\"​\n)​\n​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"alice\"​\n)​\n\n","import io.milvus.v2.service.utility.request.CreateAliasReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 9. Manage aliases​\n​\n// 9.1 Create alias​\nCreateAliasReq createAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"bob\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n​\ncreateAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 9. Manage aliases​\n// 9.1 Create aliases​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","# 9.2. List aliases​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\",​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.ListAliasesReq;​\nimport io.milvus.v2.service.utility.response.ListAliasResp;​\n​\n// 9.2 List alises​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob, alice]​\n\n","// 9.2 List aliases​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob', 'alice' ]​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"bob\",​\n# \"alice\"​\n# ]​\n# }​\n\n","# 9.3. Describe aliases​\nres = client.describe_alias(​\n alias=\"bob\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"alias\": \"bob\",​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.DescribeAliasReq;​\nimport io.milvus.v2.service.utility.response.DescribeAliasResp;​\n​\n// 9.3 Describe alias​\nDescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​\n .alias(\"bob\")​\n .build();​\n​\nDescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​\n​\nSystem.out.println(describeAliasRes);​\n​\n// Output:​\n// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​\n\n","// 9.3 Describe aliases​\nres = await client.describeAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// {​\n// status: {​\n// extra_info: {},​\n// error_code: 'Success',​\n// reason: '',​\n// code: 0,​\n// retriable: false,​\n// detail: ''​\n// },​\n// db_name: 'default',​\n// alias: 'bob',​\n// collection: 'customized_setup_2'​\n// }​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n","# 9.4 Reassign aliases to other collections​\nclient.alter_alias(​\n collection_name=\"customized_setup_1\",​\n alias=\"alice\"​\n)​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_1\",​\n# \"db_name\": \"default\"​\n# }​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.AlterAliasReq;​\n​\n// 9.4 Reassign alias to other collections​\nAlterAliasReq alterAliasReq = AlterAliasReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.alterAlias(alterAliasReq);​\n​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\nlistAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nlistAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob]​\n\n","// 9.4 Reassign aliases to other collections​\nres = await client.alterAlias({​\n collection_name: \"customized_setup_1\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'alice' ]​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob' ]​\n// ​\n​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"alice\",​\n# \"collectionName\": \"customized_setup_1\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n"],"headingContent":"Manage Aliases​","anchorList":[{"label":"Управление псевдонимами","href":"Manage-Aliases​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создание псевдонима","href":"Create-Alias​","type":2,"isActive":false},{"label":"Список псевдонимов","href":"List-Aliases​","type":2,"isActive":false},{"label":"Описать псевдоним","href":"Describe-Alias​","type":2,"isActive":false},{"label":"Изменить псевдоним","href":"Alter-Alias​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.md b/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.md new file mode 100644 index 000000000..2ba188429 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-aliases.md @@ -0,0 +1,542 @@ +--- +id: manage-aliases.md +title: Управление псевдонимами +--- +

    Управление псевдонимами

    Milvus предоставляет возможности управления псевдонимами. На этой странице показаны процедуры создания, перечисления, изменения и удаления псевдонимов.

    +

    Обзор

    Вы можете создавать псевдонимы для своих коллекций. Коллекция может иметь несколько псевдонимов, но коллекции не могут совместно использовать псевдоним.

    +

    Получив запрос на коллекцию, Milvus находит ее по указанному имени. Если коллекции по указанному имени не существует, Milvus продолжает поиск по указанному имени в качестве псевдонима. Вы можете использовать псевдонимы коллекций, чтобы адаптировать свой код к различным сценариям.

    +

    Создание псевдонима

    Следующий фрагмент кода демонстрирует, как создать псевдоним для коллекции.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 9. Manage aliases​
    +# 9.1. Create aliases​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="bob"​
    +)​
    +​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="alice"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.utility.request.CreateAliasReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 9. Manage aliases​
    +​
    +// 9.1 Create alias​
    +CreateAliasReq createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("bob")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +​
    +createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 9. Manage aliases​
    +// 9.1 Create aliases​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    Список псевдонимов

    Следующий фрагмент кода демонстрирует процедуру составления списка псевдонимов, выделенных для определенной коллекции.

    + +
    # 9.2. List aliases​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob",​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.ListAliasesReq;​
    +import io.milvus.v2.service.utility.response.ListAliasResp;​
    +​
    +// 9.2 List alises​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob, alice]​
    +
    +
    +
    // 9.2 List aliases​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob', 'alice' ]​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "bob",​
    +#         "alice"​
    +#     ]​
    +# }​
    +
    +
    +

    Описать псевдоним

    Следующий фрагмент кода подробно описывает конкретный псевдоним, включая имя коллекции, которой он был присвоен.

    + +
    # 9.3. Describe aliases​
    +res = client.describe_alias(​
    +    alias="bob"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "alias": "bob",​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.DescribeAliasReq;​
    +import io.milvus.v2.service.utility.response.DescribeAliasResp;​
    +​
    +// 9.3 Describe alias​
    +DescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​
    +    .alias("bob")​
    +    .build();​
    +​
    +DescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​
    +​
    +System.out.println(describeAliasRes);​
    +​
    +// Output:​
    +// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​
    +
    +
    +
    // 9.3 Describe aliases​
    +res = await client.describeAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// {​
    +//   status: {​
    +//     extra_info: {},​
    +//     error_code: 'Success',​
    +//     reason: '',​
    +//     code: 0,​
    +//     retriable: false,​
    +//     detail: ''​
    +//   },​
    +//   db_name: 'default',​
    +//   alias: 'bob',​
    +//   collection: 'customized_setup_2'​
    +// }​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    +

    Изменить псевдоним

    Вы можете перераспределить псевдоним, уже выделенный для определенной коллекции, на другой.

    + +
    # 9.4 Reassign aliases to other collections​
    +client.alter_alias(​
    +    collection_name="customized_setup_1",​
    +    alias="alice"​
    +)​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_1",​
    +#     "db_name": "default"​
    +# }​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.AlterAliasReq;​
    +​
    +// 9.4 Reassign alias to other collections​
    +AlterAliasReq alterAliasReq = AlterAliasReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.alterAlias(alterAliasReq);​
    +​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob]​
    +
    +
    +
    // 9.4 Reassign aliases to other collections​
    +res = await client.alterAlias({​
    +    collection_name: "customized_setup_1",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'alice' ]​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob' ]​
    +// ​
    +​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "alice",​
    +#         "collectionName": "customized_setup_1",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.json b/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.json new file mode 100644 index 000000000..6015fa2d8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Collection Explained​","anchorList":[{"label":"Объяснение коллекций","href":"Collection-Explained​","type":1,"isActive":false},{"label":"Коллекция","href":"Collection​","type":2,"isActive":false},{"label":"Схема и поля","href":"Schema-and-Fields​","type":2,"isActive":false},{"label":"Первичный ключ и AutoId","href":"Primary-key-and-AutoId​","type":2,"isActive":false},{"label":"Индекс","href":"Index​","type":2,"isActive":false},{"label":"Сущность","href":"Entity​","type":2,"isActive":false},{"label":"Загрузка и освобождение","href":"Load-and-Release​","type":2,"isActive":false},{"label":"Поиск и запросы","href":"Search-and-Query​","type":2,"isActive":false},{"label":"Раздел","href":"Partition​","type":2,"isActive":false},{"label":"Осколки","href":"Shard​","type":2,"isActive":false},{"label":"Псевдоним","href":"Alias​","type":2,"isActive":false},{"label":"Функция","href":"Function​","type":2,"isActive":false},{"label":"Уровень согласованности","href":"Consistency-Level​","type":2,"isActive":false},{"label":"Ограничения","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.md b/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.md new file mode 100644 index 000000000..ff692bb1d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-collections.md @@ -0,0 +1,272 @@ +--- +id: manage-collections.md +title: Объяснение коллекций +--- +

    Объяснение коллекций

    В Milvus вы можете создавать несколько коллекций для управления данными и вставлять данные в коллекции в виде сущностей. Коллекции и сущности похожи на таблицы и записи в реляционных базах данных. Эта страница поможет вам узнать о коллекции и связанных с ней понятиях.

    +

    Коллекция

    Коллекция - это двумерная таблица с фиксированными столбцами и вариантами строк. Каждый столбец представляет собой поле, а каждая строка - сущность.

    +

    На следующей схеме показана коллекция с восемью столбцами и шестью сущностями.

    +

    + + Collection explained + Пояснения к коллекции

    +

    Схема и поля

    Описывая объект, мы обычно упоминаем его атрибуты, такие как размер, вес и положение. Эти атрибуты можно использовать в качестве полей в коллекции. Каждое поле имеет различные ограничивающие свойства, такие как тип данных и размерность векторного поля. Вы можете сформировать схему коллекции, создав поля и определив их порядок. Возможные применимые типы данных см. в разделе Объяснение схемы.

    +

    Вы должны включить все определенные схемой поля в вставляемые сущности. Чтобы сделать некоторые из них необязательными, можно

    +
      +
    • Сделать их нулевыми или установить значения по умолчанию.

      +

      Подробные сведения о том, как сделать поле нулевым или установить значение по умолчанию, см. в разделе Нулевые и по умолчанию.

    • +
    • Включение динамического поля

      +

      Подробнее о том, как включить и использовать динамическое поле, читайте в разделе Динамическое поле.

    • +
    +

    Первичный ключ и AutoId

    Подобно первичному полю в реляционной базе данных, коллекция имеет первичное поле, чтобы отличать сущность от других. Каждое значение в первичном поле глобально уникально и соответствует одной конкретной сущности.

    +

    Как показано на диаграмме выше, поле с именем id служит первичным полем, и первый ID 0 соответствует сущности под названием "Смертность от коронавируса не важна". Других сущностей с первичным полем 0 не существует.

    +

    Первичное поле может принимать только целые числа или строки. При вставке сущностей вы должны включать значения первичного поля по умолчанию. Однако если вы включили функцию AutoId при создании коллекции, Milvus будет генерировать эти значения при вставке данных. В этом случае исключите значения первичного поля из вставляемых сущностей.

    +

    Дополнительные сведения см. в разделе Первичное поле и AutoID.

    +

    Индекс

    Создание индексов по определенным полям повышает эффективность поиска. Рекомендуется создавать индексы для всех полей, на которые опирается ваш сервис, среди которых индексы для векторных полей являются обязательными.

    +

    Сущность

    Сущности - это записи данных, которые имеют одинаковый набор полей в коллекции. Значения во всех полях одной строки составляют сущность.

    +

    Вы можете вставить в коллекцию столько сущностей, сколько вам нужно. Однако с увеличением количества сущностей увеличивается и объем занимаемой ими памяти, что влияет на производительность поиска.

    +

    Дополнительные сведения см. в разделе Объяснение схемы.

    +

    Загрузка и освобождение

    Загрузка коллекции - это необходимое условие для выполнения поиска и запросов по сходству в коллекциях. При загрузке коллекции Milvus загружает все индексные файлы и исходные данные в каждом поле в память для быстрого отклика на поиск и запросы.

    +

    Поиск и запросы занимают много памяти. Чтобы сократить расходы, рекомендуется освободить коллекции, которые в данный момент не используются.

    +

    Более подробную информацию см. в разделе Загрузка и освобождение.

    +

    Поиск и запросы

    После создания индексов и загрузки коллекции можно начать поиск по сходству, подав один или несколько векторов запросов. Например, при получении векторного представления запроса, переданного в поисковом запросе, Milvus использует указанный тип метрики для измерения сходства между вектором запроса и векторами в целевой коллекции, а затем возвращает те, которые семантически схожи с запросом.

    +

    Вы также можете включить фильтрацию метаданных в поиск и запросы, чтобы улучшить релевантность результатов. Обратите внимание, что условия фильтрации метаданных являются обязательными в запросах и необязательными в поиске.

    +

    Подробные сведения о применимых типах метрик см. в разделе Типы метрик.

    +

    Для получения дополнительной информации о поиске и запросах обратитесь к статьям в главе " Поиск и ранжирование ", среди которых основными являются следующие.

    + +

    Кроме того, Milvus предлагает усовершенствования для повышения производительности и эффективности поиска. По умолчанию они отключены, и вы можете включить и использовать их в соответствии с требованиями вашего сервиса. К ним относятся

    + +

    Раздел

    Разделы - это подмножества коллекции, которые имеют один и тот же набор полей с родительской коллекцией, и каждый из них содержит подмножество сущностей.

    +

    Распределяя сущности по разным разделам, вы можете создавать группы сущностей. Вы можете выполнять поиск и запросы в определенных разделах, чтобы Milvus игнорировал сущности в других разделах и повышал эффективность поиска.

    +

    Подробнее см. в разделе Управление разделами.

    +

    Осколки

    Осколки - это горизонтальные срезы коллекции. Каждый шард соответствует каналу ввода данных. По умолчанию каждая коллекция имеет один шард. При создании коллекции можно задать соответствующее количество шардов в зависимости от ожидаемой пропускной способности и объема данных, которые необходимо вставить в коллекцию.

    +

    Подробнее о том, как задать количество шардов, см. в разделе Создание коллекции.

    +

    Псевдоним

    Вы можете создавать псевдонимы для своих коллекций. Коллекция может иметь несколько псевдонимов, но коллекции не могут иметь общий псевдоним. При получении запроса на коллекцию Milvus находит коллекцию по указанному имени. Если коллекции по указанному имени не существует, Milvus продолжает поиск по указанному имени в качестве псевдонима. Вы можете использовать псевдонимы коллекций, чтобы адаптировать свой код к различным сценариям.

    +

    Для получения дополнительной информации см. раздел Управление псевдонимами.

    +

    Функция

    Вы можете задать функции для Milvus, чтобы получить поля при создании коллекции. Например, функция полнотекстового поиска использует определенную пользователем функцию для получения разреженного векторного поля из определенного поля varchar. Дополнительные сведения о полнотекстовом поиске см. в разделе Полнотекстовый поиск.

    +

    Уровень согласованности

    В распределенных системах баз данных обычно используется уровень согласованности для определения однородности данных между узлами данных и репликами. Вы можете установить отдельные уровни согласованности при создании коллекции или проведении поиска по сходству в коллекции. Применимые уровни согласованности: Strong, Bounded Staleness, Session и Eventually.

    +

    Подробные сведения об этих уровнях согласованности см. в разделе Уровень согласованности.

    +

    Ограничения

    Лимиты и ограничения для коллекций см. в разделе Лимиты и ограничения.

    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.json b/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.json new file mode 100644 index 000000000..d3ea43e30 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.ListPartitionsReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport java.util.*;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nlet res = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res);​\n​\n// Output​\n// [\"_default\"]​\n\n","import (​\n \"context\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvucclient\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n // handle error​\n}​\n​\ndefer cli.Close(ctx)​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n","client.create_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\", \"partitionA\"]​\n\n","import io.milvus.v2.service.partition.request.CreatePartitionReq;​\n​\nCreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.createPartition(createPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default, partitionA]​\n\n","await client.createPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","import (​\n \"fmt\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nerr = cli.CreatePartition(ctx, client.NewCreatePartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\",​\n# \"partitionA\"​\n# ]​\n# }​\n\n","res = client.has_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# True​\n\n","import io.milvus.v2.service.partition.request.HasPartitionReq;​\n​\nHasPartitionReq hasPartitionReq = HasPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean hasPartitionRes = client.hasPartition(hasPartitionReq);​\nSystem.out.println(hasPartitionRes);​\n​\n// Output:​\n// true​\n\n","res = await client.hasPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.value)​\n​\n// Output​\n// true​\n\n","import (​\n \"fmt\"​\n ​\n \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nresult, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(result)​\n​\n// Output:​\n// true​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"has\": true​\n# }​\n# }​\n\n","client.load_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.LoadPartitionsReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n​\nLoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.loadPartitions(loadPartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// True​\n\n","await client.loadPartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// False​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateNotLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nclient.drop_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.DropPartitionReq;​\nimport io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\nimport io.milvus.v2.service.partition.request.ListPartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nDropPartitionReq dropPartitionReq = DropPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.dropPartition(dropPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nawait client.dropPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\"]​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n"],"headingContent":"Manage Partitions​","anchorList":[{"label":"Управление разделами","href":"Manage-Partitions​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Список разделов","href":"List-Partitions​","type":2,"isActive":false},{"label":"Создать раздел","href":"Create-Partition​","type":2,"isActive":false},{"label":"Проверка наличия определенного раздела","href":"Check-for-a-Specific-Partition​","type":2,"isActive":false},{"label":"Загрузка и освобождение разделов","href":"Load-and-Release-Partitions​","type":2,"isActive":false},{"label":"Операции с данными внутри разделов","href":"Data-Operations-Within-Partitions​","type":2,"isActive":false},{"label":"Сбросить раздел","href":"Drop-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.md b/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.md new file mode 100644 index 000000000..251c128b1 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/manage-partitions.md @@ -0,0 +1,764 @@ +--- +id: manage-partitions.md +title: Управление разделами +--- +

    Управление разделами

    Раздел - это подмножество коллекции. Каждый раздел имеет ту же структуру данных, что и родительская коллекция, но содержит только часть данных коллекции. Эта страница поможет вам понять, как управлять разделами.

    +

    Обзор

    При создании коллекции Milvus также создает в ней раздел с именем _default. Если вы не собираетесь добавлять другие разделы, все сущности, вставленные в коллекцию, попадают в раздел по умолчанию, и все поиски и запросы также выполняются в разделе по умолчанию.

    +

    Вы можете добавить дополнительные разделы и вставлять в них сущности на основе определенных критериев. Тогда можно ограничить поиск и запросы в определенных разделах, что повысит производительность поиска.

    +

    В коллекции может быть максимум 1024 раздела.

    +
    +

    Функция Partition Key - это оптимизация поиска на основе разделов, позволяющая Milvus распределять сущности по разным разделам на основе значений в определенном скалярном поле. Эта функция помогает реализовать ориентированное на разделы многопользовательское использование и повышает производительность поиска.

    +

    На этой странице данная функция не рассматривается. Более подробную информацию можно найти в разделе Использование ключа раздела.

    +
    +

    Список разделов

    При создании коллекции Milvus также создает в ней раздел с именем _default. Вы можете перечислить разделы в коллекции следующим образом.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import java.util.*;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +let res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res);​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    import (​
    +    "context"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvucclient"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    +

    Создать раздел

    Вы можете добавлять в коллекцию дополнительные разделы и вставлять сущности в эти разделы на основе определенных критериев.

    + +
    client.create_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default", "partitionA"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.CreatePartitionReq;​
    +​
    +CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.createPartition(createPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default, partitionA]​
    +
    +
    +
    await client.createPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +err = cli.CreatePartition(ctx, client.NewCreatePartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default",​
    +#         "partitionA"​
    +#     ]​
    +# }​
    +
    +
    +

    Проверка наличия определенного раздела

    Следующие фрагменты кода демонстрируют, как проверить, существует ли раздел в определенной коллекции.

    + +
    res = client.has_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# True​
    +
    +
    +
    import io.milvus.v2.service.partition.request.HasPartitionReq;​
    +​
    +HasPartitionReq hasPartitionReq = HasPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean hasPartitionRes = client.hasPartition(hasPartitionReq);​
    +System.out.println(hasPartitionRes);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    res = await client.hasPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.value)​
    +​
    +// Output​
    +// true​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +result, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(result)​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#        "has": true​
    +#     }​
    +# }​
    +
    +
    +

    Загрузка и освобождение разделов

    Вы можете отдельно загрузить или освободить один или несколько разделов.

    +

    Загрузка разделов

    Вы можете отдельно загрузить определенные разделы в коллекцию. Стоит отметить, что статус загрузки коллекции остается незагруженным, если в коллекции есть незагруженный раздел.

    + +
    client.load_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.LoadPartitionsReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +​
    +LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.loadPartitions(loadPartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// True​
    +
    +
    +
    await client.loadPartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Освобождение разделов

    Вы также можете освободить определенные разделы.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// False​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    Операции с данными внутри разделов

    Вставка и удаление объектов

    Вы можете выполнять операции вставки, апсерт и удаления в определенных операциях. Для получения подробной информации см.

    +
      +
    • Вставка сущностей в раздел

    • +
    • Вставить сущности в раздел

    • +
    • Удалить сущности из раздела

    • +
    +

    Поиск и запросы

    Вы можете выполнять поиск и запросы в определенных разделах. Для получения подробной информации см.

    +
      +
    • Проведение поиска ANN в разделах

    • +
    • Проведение фильтрации метаданных в разделах

    • +
    +

    Сбросить раздел

    Можно удалять разделы, которые больше не нужны. Прежде чем сбрасывать раздел, убедитесь, что он был освобожден.

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +client.drop_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.DropPartitionReq;​
    +import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +DropPartitionReq dropPartitionReq = DropPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.dropPartition(dropPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +await client.dropPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.json b/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.json new file mode 100644 index 000000000..034a5de5c --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.rename_collection(​\n old_name=\"my_collection\",​\n new_name=\"my_new_collection\"​\n)​\n\n","import io.milvus.v2.service.collection.request.RenameCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nRenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .newCollectionName(\"my_new_collection\")​\n .build();​\n​\nclient.renameCollection(renameCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = await client.renameCollection({​\n oldName: \"my_collection\",​\n newName: \"my_new_collection\"​\n});​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.RenameCollection(ctx, client.NewRenameCollectionOption(\"my_collection\", \"my_new_collection\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"newCollectionName\": \"my_new_collection\"​\n}'​\n\n","from pymilvus import MilvusClient\n\nclient.alter_collection_properties(\n collection_name=\"collection_name\",\n properties = {\"collection.ttl.seconds\": 500}\n)\n","import io.milvus.v2.service.collection.request.AlterCollectionReq;​\nimport java.util.HashMap;​\nimport java.util.Map;​\n​\nMap properties = new HashMap<>();​\nproperties.put(\"collection.ttl.seconds\", \"60\");​\n​\nAlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .properties(properties)​\n .build();​\n​\nclient.alterCollection(alterCollectionReq);​\n\n","res = await client.alterCollection({​\n collection_name: \"my_collection\",​\n properties: {​\n \"collection.ttl.seconds\": 60​\n }​\n})​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.AlterCollection(ctx, client.NewAlterCollectionOption(\"my_collection\").WithProperty(common.CollectionTTLConfigKey, 60))​\nif err != nil {​\n // handle error​\n}​\n\n","# Currently not available for REST\n\n"],"headingContent":"Modify Collection​","anchorList":[{"label":"Изменить коллекцию","href":"Modify-Collection​","type":1,"isActive":false},{"label":"Переименование коллекции","href":"Rename-Collection​","type":2,"isActive":false},{"label":"Установить TTL коллекции","href":"Set-Collection-TTL​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.md b/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.md new file mode 100644 index 000000000..f6d024b75 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/modify-collection.md @@ -0,0 +1,213 @@ +--- +id: modify-collection.md +title: Изменить коллекцию +--- +

    Изменить коллекцию

    Вы можете переименовать коллекцию или изменить ее настройки. Эта страница посвящена изменению коллекции.

    +

    Переименование коллекции

    Вы можете переименовать коллекцию следующим образом.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.rename_collection(​
    +    old_name="my_collection",​
    +    new_name="my_new_collection"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.RenameCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +RenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .newCollectionName("my_new_collection")​
    +        .build();​
    +​
    +client.renameCollection(renameCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = await client.renameCollection({​
    +    oldName: "my_collection",​
    +    newName: "my_new_collection"​
    +});​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.RenameCollection(ctx, client.NewRenameCollectionOption("my_collection", "my_new_collection"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "newCollectionName": "my_new_collection"​
    +}'​
    +
    +
    +

    Установить TTL коллекции

    Если коллекция должна быть удалена в течение определенного периода времени, подумайте о том, чтобы установить ее время жизни (TTL) в секундах. Как только TTL истечет, Milvus удалит сущности в коллекции. Удаление происходит асинхронно, что означает, что поиск и запросы все еще возможны до завершения удаления.

    +

    Следующий фрагмент кода демонстрирует, как изменить TTL коллекции.

    + +
    from pymilvus import MilvusClient
    +
    +client.alter_collection_properties(
    +  collection_name="collection_name",
    +  properties = {"collection.ttl.seconds": 500}
    +)
    +
    +
    import io.milvus.v2.service.collection.request.AlterCollectionReq;​
    +import java.util.HashMap;​
    +import java.util.Map;​
    +​
    +Map<String, String> properties = new HashMap<>();​
    +properties.put("collection.ttl.seconds", "60");​
    +​
    +AlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .properties(properties)​
    +        .build();​
    +​
    +client.alterCollection(alterCollectionReq);​
    +
    +
    +
    res = await client.alterCollection({​
    +    collection_name: "my_collection",​
    +    properties: {​
    +        "collection.ttl.seconds": 60​
    +    }​
    +})​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.AlterCollection(ctx, client.NewAlterCollectionOption("my_collection").WithProperty(common.CollectionTTLConfigKey, 60))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # Currently not available for REST
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/collections/view-collections.json b/localization/v2.5.x/site/ru/userGuide/collections/view-collections.json new file mode 100644 index 000000000..a987468d2 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/view-collections.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_collections()​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.response.ListCollectionsResp;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListCollectionsResp resp = client.listCollections();​\nSystem.out.println(resp.getCollectionNames());​\n\n","import { MilvusClient } from '@zilliz/milvus2-sdk-node';​\n​\nconst client = new MilvusClient({​\n address: 'localhost:19530',​\n token: 'root:Milvus'​\n});​\n​\n​\nconst collections = await client.listCollections();​\nconsole.log(collections);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collectionNames)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}​\n}'​\n\n","[\"quick_setup\"]​\n\n","res = client.describe_collection(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.service.collection.request.DescribeCollectionReq;​\nimport io.milvus.v2.service.collection.response.DescribeCollectionResp;​\n​\nDescribeCollectionReq request = DescribeCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\nDescribeCollectionResp resp = client.describeCollection(request);​\nSystem.out.println(resp);​\n\n","const res = await client.describeCollection({​\n collection_name: \"quick_setup\"​\n});​\n​\nconsole.log(res);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collection)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n\n"],"headingContent":"View Collections​","anchorList":[{"label":"Просмотр коллекций","href":"View-Collections​","type":1,"isActive":false},{"label":"Список коллекций","href":"List-Collections​","type":2,"isActive":false},{"label":"Описать коллекцию","href":"Describe-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/collections/view-collections.md b/localization/v2.5.x/site/ru/userGuide/collections/view-collections.md new file mode 100644 index 000000000..cc2ff153f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/collections/view-collections.md @@ -0,0 +1,202 @@ +--- +id: view-collections.md +title: Просмотр коллекций +--- +

    Просмотр коллекций

    Вы можете получить список имен всех коллекций в текущей подключенной базе данных, а также проверить детали конкретной коллекции.

    +

    Список коллекций

    В следующем примере показано, как получить список имен всех коллекций в текущей подключенной базе данных.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_collections()​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.response.ListCollectionsResp;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListCollectionsResp resp = client.listCollections();​
    +System.out.println(resp.getCollectionNames());​
    +
    +
    +
    import { MilvusClient } from '@zilliz/milvus2-sdk-node';​
    +​
    +const client = new MilvusClient({​
    +    address: 'localhost:19530',​
    +    token: 'root:Milvus'​
    +});​
    +​
    +​
    +const collections = await client.listCollections();​
    +console.log(collections);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collectionNames)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}​
    +}'​
    +
    +
    +

    Если вы уже создали коллекцию с именем quick_setup, результат приведенного выше примера должен быть похож на следующий.

    +
    ["quick_setup"]​
    +
    +
    +

    Описать коллекцию

    Вы также можете получить подробную информацию о конкретной коллекции. В следующем примере предполагается, что вы уже создали коллекцию с именем quick_setup.

    + +
    res = client.describe_collection(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DescribeCollectionReq;​
    +import io.milvus.v2.service.collection.response.DescribeCollectionResp;​
    +​
    +DescribeCollectionReq request = DescribeCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +DescribeCollectionResp resp = client.describeCollection(request);​
    +System.out.println(resp);​
    +
    +
    +
    const res = await client.describeCollection({​
    +    collection_name: "quick_setup"​
    +});​
    +​
    +console.log(res);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collection)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/data-import/import-data.json b/localization/v2.5.x/site/ru/userGuide/data-import/import-data.json new file mode 100644 index 000000000..aa01c2fc7 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/data-import/import-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus.bulk_writer import bulk_import\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Bulk-insert data from a set of JSON files already uploaded to the MinIO server\nresp = bulk_import(\n url=url,\n collection_name=\"quick_setup\",\n files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],\n)\n\njob_id = resp.json()['data']['jobId']\nprint(job_id)\n","private static String bulkImport(List> batchFiles) throws InterruptedException {\n MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()\n .collectionName(\"quick_setup\")\n .files(batchFiles)\n .build();\n String bulkImportResult = BulkImport.bulkImport(\"http://localhost:19530\", milvusImportRequest);\n System.out.println(bulkImportResult);\n\n JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);\n String jobId = bulkImportObject.getAsJsonObject(\"data\").get(\"jobId\").getAsString();\n System.out.println(\"Create a bulkInert task, job id: \" + jobId);\n return jobId;\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/create\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"files\": [\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\"\n ],\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\"\n ]\n ],\n \"collectionName\": \"quick_setup\"\n}'\n","[\n \"/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json\"\n],\n","[\n \"/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet\"\n]\n\n","{\n \"code\": 200,\n \"data\": {\n \"jobId\": \"448707763884413158\"\n }\n}\n","import json\nfrom pymilvus.bulk_writer import get_import_progress\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Get bulk-insert job progress\nresp = get_import_progress(\n url=url,\n job_id=\"453265736269038336\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void getImportProgress(String jobId) {\n while (true) {\n System.out.println(\"Wait 5 second to check bulkInsert job state...\");\n try {\n TimeUnit.SECONDS.sleep(5);\n } catch (InterruptedException e) {\n break;\n }\n\n MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()\n .jobId(jobId)\n .build();\n String getImportProgressResult = BulkImport.getImportProgress(\"http://localhost:19530\", request);\n\n JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);\n String state = getImportProgressObject.getAsJsonObject(\"data\").get(\"state\").getAsString();\n String progress = getImportProgressObject.getAsJsonObject(\"data\").get(\"progress\").getAsString();\n if (\"Failed\".equals(state)) {\n String reason = getImportProgressObject.getAsJsonObject(\"data\").get(\"reason\").getAsString();\n System.out.printf(\"The job %s failed, reason: %s%n\", jobId, reason);\n break;\n } else if (\"Completed\".equals(state)) {\n System.out.printf(\"The job %s completed%n\", jobId);\n break;\n } else {\n System.out.printf(\"The job %s is running, state:%s progress:%s%n\", jobId, state, progress);\n }\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n getImportProgress(jobId);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/describe\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"jobId\": \"449839014328146739\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"collectionName\": \"quick_setup\",\n \"completeTime\": \"2024-05-18T02:57:13Z\",\n \"details\": [\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146740 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\\\" \",\n \"fileSize\": 31567874,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 100000\n },\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146741 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\\\" \",\n \"fileSize\": 31517224,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000 \n }\n ],\n \"fileSize\": 63085098,\n \"importedRows\": 200000,\n \"jobId\": \"449839014328146739\",\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000\n }\n}\n","import json\nfrom pymilvus.bulk_writer import list_import_jobs\n\nurl = f\"http://127.0.0.1:19530\"\n\n# List bulk-insert jobs\nresp = list_import_jobs(\n url=url,\n collection_name=\"quick_setup\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void listImportJobs() {\n MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName(\"quick_setup\").build();\n String listImportJobsResult = BulkImport.listImportJobs(\"http://localhost:19530\", listImportJobsRequest);\n System.out.println(listImportJobsResult);\n}\n\npublic static void main(String[] args) throws Exception {\n listImportJobs();\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/list\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"quick_setup\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"records\": [\n {\n \"collectionName\": \"quick_setup\",\n \"jobId\": \"448761313698322011\",\n \"progress\": 50,\n \"state\": \"Importing\"\n }\n ]\n }\n}\n"],"headingContent":"Import data","anchorList":[{"label":"Импорт данных","href":"Import-data","type":1,"isActive":false},{"label":"Прежде чем начать","href":"Before-you-start","type":2,"isActive":false},{"label":"Импорт данных","href":"Import-data","type":2,"isActive":false},{"label":"Проверить ход импорта","href":"Check-import-progress","type":2,"isActive":false},{"label":"Список заданий импорта","href":"List-Import-Jobs","type":2,"isActive":false},{"label":"Ограничения","href":"Limitations","type":2,"isActive":false},{"label":"Ограничения","href":"Constraints","type":2,"isActive":false},{"label":"Рекомендации","href":"Recommendations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/data-import/import-data.md b/localization/v2.5.x/site/ru/userGuide/data-import/import-data.md new file mode 100644 index 000000000..3d554bab8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/data-import/import-data.md @@ -0,0 +1,401 @@ +--- +id: import-data.md +order: 1 +title: Импорт данных +summary: На этой странице показана процедура импорта подготовленных данных. +--- +

    Импорт данных

    На этой странице показана процедура импорта подготовленных данных.

    +

    Прежде чем начать

      +
    • Вы уже подготовили данные и поместили их в ведро Milvus.

      +

      Если нет, то сначала следует использовать RemoteBulkWriter для подготовки данных и убедиться, что подготовленные данные уже переданы в ведро Milvus на экземпляре MinIO, запущенном вместе с вашим экземпляром Milvus. Подробности см. в разделе Подготовка исходных данных.

    • +
    • Вы уже создали коллекцию со схемой, которую вы используете для подготовки данных. Если нет, обратитесь к разделу Управление коллекциями.

    • +
    +
    +

    Следующий фрагмент кода создает простую коллекцию с заданной схемой. Для получения дополнительной информации о параметрах см. create_schema() и create_collection() в справочнике SDK.

    +
    +
    +

    Следующий фрагмент кода создает простую коллекцию с заданной схемой. Для получения дополнительной информации о параметрах см. createCollection() в справочнике SDK.

    +
    +

    Импорт данных

    Чтобы импортировать подготовленные данные, необходимо создать задание импорта следующим образом:

    + +
    from pymilvus.bulk_writer import bulk_import
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Bulk-insert data from a set of JSON files already uploaded to the MinIO server
    +resp = bulk_import(
    +    url=url,
    +    collection_name="quick_setup",
    +    files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],
    +)
    +
    +job_id = resp.json()['data']['jobId']
    +print(job_id)
    +
    +
    private static String bulkImport(List<List<String>> batchFiles) throws InterruptedException {
    +    MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()
    +            .collectionName("quick_setup")
    +            .files(batchFiles)
    +            .build();
    +    String bulkImportResult = BulkImport.bulkImport("http://localhost:19530", milvusImportRequest);
    +    System.out.println(bulkImportResult);
    +
    +    JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);
    +    String jobId = bulkImportObject.getAsJsonObject("data").get("jobId").getAsString();
    +    System.out.println("Create a bulkInert task, job id: " + jobId);
    +    return jobId;
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/create" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "files": [
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet"
    +        ],
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet"
    +        ]
    +    ],
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    Тело запроса содержит два поля:

    +
      +
    • collectionName

      +

      Имя целевой коллекции.

    • +
    • files

      +

      Список списков путей к файлам относительно корневого пути ведра Milvus на экземпляре MioIO, запущенном вместе с вашим экземпляром Milvus. Возможные вложенные списки следующие:

      +
        +
      • Файлы JSON

        +

        Если подготовленный файл имеет формат JSON, каждый подсписок должен содержать путь к одному подготовленному JSON-файлу.

        +
        [
        +    "/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json"
        +],
        +
      • +
      • Паркетные файлы

        +

        Если подготовленный файл имеет формат Parquet, каждый вложенный список должен содержать путь к одному подготовленному файлу parquet.

        +
        [
        +    "/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet"
        +]
        +
        +
      • +
    • +
    +

    Возможные варианты возврата следующие:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "jobId": "448707763884413158"
    +    }
    +}
    +
    +

    Проверить ход импорта

    Получив идентификатор задания импорта, вы можете проверить ход импорта следующим образом:

    + +
    import json
    +from pymilvus.bulk_writer import get_import_progress
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Get bulk-insert job progress
    +resp = get_import_progress(
    +    url=url,
    +    job_id="453265736269038336",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void getImportProgress(String jobId) {
    +    while (true) {
    +        System.out.println("Wait 5 second to check bulkInsert job state...");
    +        try {
    +            TimeUnit.SECONDS.sleep(5);
    +        } catch (InterruptedException e) {
    +            break;
    +        }
    +
    +        MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()
    +                .jobId(jobId)
    +                .build();
    +        String getImportProgressResult = BulkImport.getImportProgress("http://localhost:19530", request);
    +
    +        JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);
    +        String state = getImportProgressObject.getAsJsonObject("data").get("state").getAsString();
    +        String progress = getImportProgressObject.getAsJsonObject("data").get("progress").getAsString();
    +        if ("Failed".equals(state)) {
    +            String reason = getImportProgressObject.getAsJsonObject("data").get("reason").getAsString();
    +            System.out.printf("The job %s failed, reason: %s%n", jobId, reason);
    +            break;
    +        } else if ("Completed".equals(state)) {
    +            System.out.printf("The job %s completed%n", jobId);
    +            break;
    +        } else {
    +            System.out.printf("The job %s is running, state:%s progress:%s%n", jobId, state, progress);
    +        }
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +    getImportProgress(jobId);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/describe" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "jobId": "449839014328146739"
    +}'
    +
    +

    Возможный ответ выглядит следующим образом:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "collectionName": "quick_setup",
    +        "completeTime": "2024-05-18T02:57:13Z",
    +        "details": [
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146740 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\" ",
    +                "fileSize": 31567874,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 100000
    +            },
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146741 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\" ",
    +                "fileSize": 31517224,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 200000            
    +            }
    +        ],
    +        "fileSize": 63085098,
    +        "importedRows": 200000,
    +        "jobId": "449839014328146739",
    +        "progress": 100,
    +        "state": "Completed",
    +        "totalRows": 200000
    +    }
    +}
    +
    +

    Список заданий импорта

    Вы можете перечислить все задания импорта относительно определенной коллекции следующим образом:

    + +
    import json
    +from pymilvus.bulk_writer import list_import_jobs
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# List bulk-insert jobs
    +resp = list_import_jobs(
    +    url=url,
    +    collection_name="quick_setup",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void listImportJobs() {
    +    MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName("quick_setup").build();
    +    String listImportJobsResult = BulkImport.listImportJobs("http://localhost:19530", listImportJobsRequest);
    +    System.out.println(listImportJobsResult);
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    listImportJobs();
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/list" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    Возможные значения следующие:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "records": [
    +            {
    +                "collectionName": "quick_setup",
    +                "jobId": "448761313698322011",
    +                "progress": 50,
    +                "state": "Importing"
    +            }
    +        ]
    +    }
    +}
    +
    +

    Ограничения

      +
    • Размер каждого файла импорта не должен превышать 16 ГБ.

    • +
    • Максимальное количество запросов на импорт ограничено 1024.

    • +
    • Максимальное количество файлов в одном запросе на импорт не должно превышать 1024.

    • +
    • В запросе на импорт можно указать только одно имя раздела. Если имя раздела не указано, данные будут вставлены в раздел по умолчанию. Кроме того, в запросе на импорт нельзя задать имя раздела, если в целевой коллекции задан ключ раздела.

    • +
    +

    Ограничения

    Перед импортом данных убедитесь, что вы приняли к сведению ограничения в отношении следующих поведений Milvus:

    +
      +
    • Ограничения, касающиеся поведения Load:

      +
        +
      • Если коллекция уже была загружена до импорта, вы можете использовать функцию refresh_load для загрузки новых импортированных данных после завершения импорта.
      • +
    • +
    • Ограничения, касающиеся поведения запросов и поиска:

      +
        +
      • До перехода задания импорта в состояние Completed новые импортированные данные гарантированно будут невидимы для запросов и поиска.

      • +
      • После завершения задания,

        +
          +
        • Если коллекция не загружена, можно использовать функцию load для загрузки новых импортированных данных.

        • +
        • Если коллекция уже загружена, можно вызвать функцию load(is_refresh=True) для загрузки импортированных данных.

        • +
      • +
    • +
    • Ограничения, касающиеся поведения при удалении:

      +
        +
      • До того как статус задания импорта станет Завершен, удаление не гарантируется и может быть успешным, а может и не быть.

      • +
      • Удаление после завершения задания гарантированно успешно.

      • +
    • +
    +

    Рекомендации

    Мы настоятельно рекомендуем использовать функцию многофайлового импорта, которая позволяет загружать несколько файлов в одном запросе. Этот метод не только упрощает процесс импорта, но и значительно повышает его производительность. Кроме того, консолидация загружаемых файлов позволяет сократить время на управление данными и повысить эффективность рабочего процесса.

    diff --git a/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.json b/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.json new file mode 100644 index 000000000..74b1ffd40 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# You need to work out a collection schema out of your dataset.\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True\n)\n\nDIM = 512\n\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True),\nschema.add_field(field_name=\"bool\", datatype=DataType.BOOL),\nschema.add_field(field_name=\"int8\", datatype=DataType.INT8),\nschema.add_field(field_name=\"int16\", datatype=DataType.INT16),\nschema.add_field(field_name=\"int32\", datatype=DataType.INT32),\nschema.add_field(field_name=\"int64\", datatype=DataType.INT64),\nschema.add_field(field_name=\"float\", datatype=DataType.FLOAT),\nschema.add_field(field_name=\"double\", datatype=DataType.DOUBLE),\nschema.add_field(field_name=\"varchar\", datatype=DataType.VARCHAR, max_length=512),\nschema.add_field(field_name=\"json\", datatype=DataType.JSON),\nschema.add_field(field_name=\"array_str\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)\nschema.add_field(field_name=\"array_int\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)\nschema.add_field(field_name=\"float_vector\", datatype=DataType.FLOAT_VECTOR, dim=DIM),\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=DIM),\nschema.add_field(field_name=\"float16_vector\", datatype=DataType.FLOAT16_VECTOR, dim=DIM),\n# schema.add_field(field_name=\"bfloat16_vector\", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)\n\nschema.verify()\n\nprint(schema)\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\nimport io.milvus.bulkwriter.BulkImport;\nimport io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\nimport io.milvus.bulkwriter.common.clientenum.CloudStorage;\nimport io.milvus.bulkwriter.connect.S3ConnectParam;\nimport io.milvus.bulkwriter.connect.StorageConnectParam;\nimport io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;\nimport io.milvus.bulkwriter.request.import_.MilvusImportRequest;\nimport io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;\nimport io.milvus.common.utils.Float16Utils;\nimport io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.*;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\nprivate static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint(\"http://127.0.0.1:9000\");\nprivate static final String BUCKET_NAME = \"a-bucket\";\nprivate static final String ACCESS_KEY = \"minioadmin\";\nprivate static final String SECRET_KEY = \"minioadmin\";\n\nprivate static final Integer DIM = 512;\nprivate static final Gson GSON_INSTANCE = new Gson();\n\nprivate static CreateCollectionReq.CollectionSchema createSchema() {\n CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(true)\n .build();\n schema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(io.milvus.v2.common.DataType.Int64)\n .isPrimaryKey(Boolean.TRUE)\n .autoID(false)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"bool\")\n .dataType(DataType.Bool)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int8\")\n .dataType(DataType.Int8)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int16\")\n .dataType(DataType.Int16)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int32\")\n .dataType(DataType.Int32)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int64\")\n .dataType(DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float\")\n .dataType(DataType.Float)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"double\")\n .dataType(DataType.Double)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"varchar\")\n .dataType(DataType.VarChar)\n .maxLength(512)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"json\")\n .dataType(io.milvus.v2.common.DataType.JSON)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_int\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_str\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.VarChar)\n .maxLength(128)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float_vector\")\n .dataType(io.milvus.v2.common.DataType.FloatVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"binary_vector\")\n .dataType(io.milvus.v2.common.DataType.BinaryVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float16_vector\")\n .dataType(io.milvus.v2.common.DataType.Float16Vector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"sparse_vector\")\n .dataType(io.milvus.v2.common.DataType.SparseFloatVector)\n .build());\n \n return schema;\n}\n","from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType\n# Use `from pymilvus import LocalBulkWriter, BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = LocalBulkWriter(\n schema=schema,\n local_path='.',\n segment_size=512 * 1024 * 1024, # Default value\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.LocalBulkWriter;\nimport io.milvus.bulkwriter.LocalBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\n\nLocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withLocalPath(\".\")\n .withChunkSize(512 * 1024 * 1024)\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nLocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);\n","from pymilvus.bulk_writer import RemoteBulkWriter\n# Use `from pymilvus import RemoteBulkWriter` \n# when you use pymilvus earlier than 2.4.2 \n\n# Third-party constants\nACCESS_KEY=\"minioadmin\"\nSECRET_KEY=\"minioadmin\"\nBUCKET_NAME=\"a-bucket\"\n\n# Connections parameters to access the remote bucket\nconn = RemoteBulkWriter.S3ConnectParam(\n endpoint=\"localhost:9000\", # the default MinIO service started along with Milvus\n access_key=ACCESS_KEY,\n secret_key=SECRET_KEY,\n bucket_name=BUCKET_NAME,\n secure=False\n)\n\nfrom pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n\nprint('bulk writer created.')\n","private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n","from pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\n\nRemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withConnectParam(storageConnectParam)\n .withChunkSize(512 * 1024 * 1024)\n .withRemotePath(\"/\")\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nRemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);\n","import random, string, json\nimport numpy as np\nimport tensorflow as tf\n\ndef generate_random_str(length=5):\n letters = string.ascii_uppercase\n digits = string.digits\n \n return ''.join(random.choices(letters + digits, k=length))\n\n# optional input for binary vector:\n# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]\n# 2. numpy array of uint8\ndef gen_binary_vector(to_numpy_arr):\n raw_vector = [random.randint(0, 1) for i in range(DIM)]\n if to_numpy_arr:\n return np.packbits(raw_vector, axis=-1)\n return raw_vector\n\n# optional input for float vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float32\ndef gen_float_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=\"float32\")\n return raw_vector\n\n# # optional input for bfloat16 vector:\n# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# # 2. numpy array of bfloat16\n# def gen_bf16_vector(to_numpy_arr):\n# raw_vector = [random.random() for _ in range(DIM)]\n# if to_numpy_arr:\n# return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()\n# return raw_vector\n\n# optional input for float16 vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float16\ndef gen_fp16_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=np.float16)\n return raw_vector\n\n# optional input for sparse vector:\n# only accepts dict like {2: 13.23, 45: 0.54} or {\"indices\": [1, 2], \"values\": [0.1, 0.2]}\n# note: no need to sort the keys\ndef gen_sparse_vector(pair_dict: bool):\n raw_vector = {}\n dim = random.randint(2, 20)\n if pair_dict:\n raw_vector[\"indices\"] = [i for i in range(dim)]\n raw_vector[\"values\"] = [random.random() for _ in range(dim)]\n else:\n for i in range(dim):\n raw_vector[i] = random.random()\n return raw_vector\n\nfor i in range(10000):\n writer.append_row({\n \"id\": np.int64(i),\n \"bool\": True if i % 3 == 0 else False,\n \"int8\": np.int8(i%128),\n \"int16\": np.int16(i%1000),\n \"int32\": np.int32(i%100000),\n \"int64\": np.int64(i),\n \"float\": np.float32(i/3),\n \"double\": np.float64(i/7),\n \"varchar\": f\"varchar_{i}\",\n \"json\": json.dumps({\"dummy\": i, \"ok\": f\"name_{i}\"}),\n \"array_str\": np.array([f\"str_{k}\" for k in range(5)], np.dtype(\"str\")),\n \"array_int\": np.array([k for k in range(10)], np.dtype(\"int64\")),\n \"float_vector\": gen_float_vector(True),\n \"binary_vector\": gen_binary_vector(True),\n \"float16_vector\": gen_fp16_vector(True),\n # \"bfloat16_vector\": gen_bf16_vector(True),\n \"sparse_vector\": gen_sparse_vector(True),\n f\"dynamic_{i}\": i,\n })\n if (i+1)%1000 == 0:\n writer.commit()\n print('committed')\n\nprint(writer.batch_files)\n","private static byte[] genBinaryVector() {\n Random ran = new Random();\n int byteCount = DIM / 8;\n ByteBuffer vector = ByteBuffer.allocate(byteCount);\n for (int i = 0; i < byteCount; ++i) {\n vector.put((byte) ran.nextInt(Byte.MAX_VALUE));\n }\n return vector.array();\n}\n\nprivate static List genFloatVector() {\n Random ran = new Random();\n List vector = new ArrayList<>();\n for (int i = 0; i < DIM; ++i) {\n vector.add(ran.nextFloat());\n }\n return vector;\n}\n\nprivate static byte[] genFloat16Vector() {\n List originalVector = genFloatVector();\n return Float16Utils.f32VectorToFp16Buffer(originalVector).array();\n}\n\nprivate static SortedMap genSparseVector() {\n Random ran = new Random();\n SortedMap sparse = new TreeMap<>();\n int dim = ran.nextInt(18) + 2; // [2, 20)\n for (int i = 0; i < dim; ++i) {\n sparse.put((long)ran.nextInt(1000000), ran.nextFloat());\n }\n return sparse;\n}\n\nprivate static List genStringArray(int length) {\n List arr = new ArrayList<>();\n for (int i = 0; i < length; i++) {\n arr.add(\"str_\" + i);\n }\n return arr;\n}\n\nprivate static List genIntArray(int length) {\n List arr = new ArrayList<>();\n for (long i = 0; i < length; i++) {\n arr.add(i);\n }\n return arr;\n}\n\nprivate static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n\nprivate static List> uploadData() throws Exception {\n CreateCollectionReq.CollectionSchema collectionSchema = createSchema();\n try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {\n for (int i = 0; i < 10000; ++i) {\n JsonObject rowObject = new JsonObject();\n\n rowObject.addProperty(\"id\", i);\n rowObject.addProperty(\"bool\", i % 3 == 0);\n rowObject.addProperty(\"int8\", i % 128);\n rowObject.addProperty(\"int16\", i % 1000);\n rowObject.addProperty(\"int32\", i % 100000);\n rowObject.addProperty(\"int64\", i);\n rowObject.addProperty(\"float\", i / 3);\n rowObject.addProperty(\"double\", i / 7);\n rowObject.addProperty(\"varchar\", \"varchar_\" + i);\n rowObject.addProperty(\"json\", String.format(\"{\\\"dummy\\\": %s, \\\"ok\\\": \\\"name_%s\\\"}\", i, i));\n rowObject.add(\"array_str\", GSON_INSTANCE.toJsonTree(genStringArray(5)));\n rowObject.add(\"array_int\", GSON_INSTANCE.toJsonTree(genIntArray(10)));\n rowObject.add(\"float_vector\", GSON_INSTANCE.toJsonTree(genFloatVector()));\n rowObject.add(\"binary_vector\", GSON_INSTANCE.toJsonTree(genBinaryVector()));\n rowObject.add(\"float16_vector\", GSON_INSTANCE.toJsonTree(genFloat16Vector()));\n rowObject.add(\"sparse_vector\", GSON_INSTANCE.toJsonTree(genSparseVector()));\n rowObject.addProperty(\"dynamic\", \"dynamic_\" + i);\n\n remoteBulkWriter.appendRow(rowObject);\n\n if ((i+1)%1000 == 0) {\n remoteBulkWriter.commit(false);\n }\n }\n\n List> batchFiles = remoteBulkWriter.getBatchFiles();\n System.out.println(batchFiles);\n return batchFiles;\n } catch (Exception e) {\n throw e;\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n}\n","print(writer.batch_files)\n\n# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],\n# ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]\n","// localBulkWriter.getBatchFiles();\nremoteBulkWriter.getBatchFiles();\n\n// \n\n// Close the BulkWriter\ntry {\n localBulkWriter.close();\n remoteBulkWriter.close(); \n} catch (Exception e) {\n // TODO: handle exception\n e.printStackTrace();\n}\n","# JSON\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.json \n\n# Parquet\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.parquet \n"],"headingContent":"Prepare Source Data","anchorList":[{"label":"Подготовка исходных данных","href":"Prepare-Source-Data","type":1,"isActive":false},{"label":"Перед началом работы","href":"Before-you-start","type":2,"isActive":false},{"label":"Настройка BulkWriter","href":"Set-up-BulkWriter","type":2,"isActive":false},{"label":"Начало записи","href":"Start-writing","type":2,"isActive":false},{"label":"Проверка результатов","href":"Verify-the-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.md b/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.md new file mode 100644 index 000000000..92d055694 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/data-import/prepare-source-data.md @@ -0,0 +1,633 @@ +--- +id: prepare-source-data.md +order: 0 +title: Подготовка исходных данных +summary: >- + На этой странице рассказывается о том, что следует учесть, прежде чем начать + массово вставлять данные в свою коллекцию. +--- +

    Подготовка исходных данных

    На этой странице рассказывается о том, что следует учесть перед тем, как начать массово вставлять данные в коллекцию.

    +

    Перед началом работы

    Целевая коллекция требует сопоставления исходных данных с ее схемой. На диаграмме ниже показано, как приемлемые исходные данные сопоставляются со схемой целевой коллекции.

    +

    + + Map data to schema + Сопоставление данных со схемой

    +

    Вам следует внимательно изучить свои данные и в соответствии с ними разработать схему целевой коллекции.

    +

    Если взять в качестве примера данные JSON на диаграмме выше, то в списке строк есть две сущности, каждая строка имеет шесть полей. Схема коллекции выборочно включает четыре: id, vector, scalar_1 и scalar_2.

    +

    При разработке схемы необходимо учитывать еще два момента:

    +
      +
    • Включать ли автоидентификацию.

      +

      Поле id служит первичным полем коллекции. Чтобы первичное поле автоматически увеличивалось, можно включить в схему функцию AutoID. В этом случае необходимо исключить поле id из каждой строки исходных данных.

    • +
    • Включать ли динамические поля

      +

      Целевая коллекция также может хранить поля, не включенные в ее предопределенную схему, если схема включает динамические поля. Поле $meta - это зарезервированное поле JSON для хранения динамических полей и их значений в виде пар ключ-значение. На приведенной выше схеме поля dynamic_field_1 и dynamic_field_2 и их значения будут сохранены как пары ключ-значение в поле $meta.

    • +
    +

    В следующем коде показано, как настроить схему для коллекции, показанной на рисунке выше.

    +
    +

    Для получения дополнительной информации обратитесь к create_schema() и add_field() в справочнике SDK.

    +
    +
    +

    Чтобы получить дополнительную информацию, обратитесь к CollectionSchema в справочнике SDK.

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# You need to work out a collection schema out of your dataset.
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True
    +)
    +
    +DIM = 512
    +
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True),
    +schema.add_field(field_name="bool", datatype=DataType.BOOL),
    +schema.add_field(field_name="int8", datatype=DataType.INT8),
    +schema.add_field(field_name="int16", datatype=DataType.INT16),
    +schema.add_field(field_name="int32", datatype=DataType.INT32),
    +schema.add_field(field_name="int64", datatype=DataType.INT64),
    +schema.add_field(field_name="float", datatype=DataType.FLOAT),
    +schema.add_field(field_name="double", datatype=DataType.DOUBLE),
    +schema.add_field(field_name="varchar", datatype=DataType.VARCHAR, max_length=512),
    +schema.add_field(field_name="json", datatype=DataType.JSON),
    +schema.add_field(field_name="array_str", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)
    +schema.add_field(field_name="array_int", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)
    +schema.add_field(field_name="float_vector", datatype=DataType.FLOAT_VECTOR, dim=DIM),
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=DIM),
    +schema.add_field(field_name="float16_vector", datatype=DataType.FLOAT16_VECTOR, dim=DIM),
    +# schema.add_field(field_name="bfloat16_vector", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
    +
    +schema.verify()
    +
    +print(schema)
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +import io.milvus.bulkwriter.BulkImport;
    +import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +import io.milvus.bulkwriter.common.clientenum.CloudStorage;
    +import io.milvus.bulkwriter.connect.S3ConnectParam;
    +import io.milvus.bulkwriter.connect.StorageConnectParam;
    +import io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;
    +import io.milvus.bulkwriter.request.import_.MilvusImportRequest;
    +import io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;
    +import io.milvus.common.utils.Float16Utils;
    +import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.*;
    +
    +import java.io.IOException;
    +import java.nio.ByteBuffer;
    +import java.util.*;
    +import java.util.concurrent.TimeUnit;
    +
    +private static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint("http://127.0.0.1:9000");
    +private static final String BUCKET_NAME = "a-bucket";
    +private static final String ACCESS_KEY = "minioadmin";
    +private static final String SECRET_KEY = "minioadmin";
    +
    +private static final Integer DIM = 512;
    +private static final Gson GSON_INSTANCE = new Gson();
    +
    +private static CreateCollectionReq.CollectionSchema createSchema() {
    +    CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(true)
    +        .build();
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("id")
    +            .dataType(io.milvus.v2.common.DataType.Int64)
    +            .isPrimaryKey(Boolean.TRUE)
    +            .autoID(false)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("bool")
    +            .dataType(DataType.Bool)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int8")
    +            .dataType(DataType.Int8)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int16")
    +            .dataType(DataType.Int16)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int32")
    +            .dataType(DataType.Int32)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int64")
    +            .dataType(DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float")
    +            .dataType(DataType.Float)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("double")
    +            .dataType(DataType.Double)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("varchar")
    +            .dataType(DataType.VarChar)
    +            .maxLength(512)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("json")
    +            .dataType(io.milvus.v2.common.DataType.JSON)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_int")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_str")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.VarChar)
    +            .maxLength(128)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float_vector")
    +            .dataType(io.milvus.v2.common.DataType.FloatVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("binary_vector")
    +            .dataType(io.milvus.v2.common.DataType.BinaryVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float16_vector")
    +            .dataType(io.milvus.v2.common.DataType.Float16Vector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("sparse_vector")
    +            .dataType(io.milvus.v2.common.DataType.SparseFloatVector)
    +            .build());
    +    
    +    return schema;
    +}
    +
    +

    Настройка BulkWriter

    BulkWriter - это инструмент, предназначенный для преобразования необработанных наборов данных в формат, подходящий для импорта через RESTful Import API. Он предлагает два типа писателей:

    +
      +
    • LocalBulkWriter: Считывает указанный набор данных и преобразует его в удобный для использования формат.
    • +
    • RemoteBulkWriter: Выполняет ту же задачу, что и LocalBulkWriter, но дополнительно передает преобразованные файлы данных в указанное удаленное хранилище объектов.
    • +
    +

    RemoteBulkWriter отличается от LocalBulkWriter тем, что RemoteBulkWriter передает преобразованные файлы данных в целевое ведро хранения объектов.

    +

    Настройка LocalBulkWriter

    LocalBulkWriter добавляет строки из исходного набора данных и фиксирует их в локальном файле указанного формата.

    + +
    from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType
    +# Use `from pymilvus import LocalBulkWriter, BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = LocalBulkWriter(
    +    schema=schema,
    +    local_path='.',
    +    segment_size=512 * 1024 * 1024, # Default value
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.LocalBulkWriter;
    +import io.milvus.bulkwriter.LocalBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +
    +LocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withLocalPath(".")
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +LocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);
    +
    +
    +

    При создании LocalBulkWriter необходимо:

    +
      +
    • Ссылаться на созданную схему в schema.
    • +
    • Задать local_path в качестве выходного каталога.
    • +
    • Установить file_type в качестве типа выходного файла.
    • +
    • Если ваш набор данных содержит большое количество записей, рекомендуется сегментировать данные, установив для параметра segment_size соответствующее значение.
    • +
    +

    Подробнее о настройках параметров см. в разделе LocalBulkWriter в справке SDK.

    +
    +
    +

    При создании LocalBulkWriter необходимо:

    +
      +
    • Ссылаться на созданную схему в CollectionSchema().
    • +
    • Задать выходной каталог в withLocalPath().
    • +
    • Задать тип выходного файла в withFileType().
    • +
    • Если ваш набор данных содержит большое количество записей, рекомендуется сегментировать данные, установив подходящее значение параметра withChunkSize().
    • +
    +

    Подробнее о настройках параметров см. в разделе LocalBulkWriter в справке SDK.

    +
    +

    Настройка RemoteBulkWriter

    Вместо того чтобы фиксировать добавленные данные в локальный файл, RemoteBulkWriter фиксирует их в удаленном бакете. Поэтому перед созданием RemoteBulkWriter необходимо настроить объект ConnectParam.

    + +
    from pymilvus.bulk_writer import RemoteBulkWriter
    +# Use `from pymilvus import RemoteBulkWriter` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +# Third-party constants
    +ACCESS_KEY="minioadmin"
    +SECRET_KEY="minioadmin"
    +BUCKET_NAME="a-bucket"
    +
    +# Connections parameters to access the remote bucket
    +conn = RemoteBulkWriter.S3ConnectParam(
    +    endpoint="localhost:9000", # the default MinIO service started along with Milvus
    +    access_key=ACCESS_KEY,
    +    secret_key=SECRET_KEY,
    +    bucket_name=BUCKET_NAME,
    +    secure=False
    +)
    +
    +from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +print('bulk writer created.')
    +
    +
    private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +

    Когда параметры соединения готовы, вы можете ссылаться на них в RemoteBulkWriter следующим образом:

    + +
    from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +
    +RemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withConnectParam(storageConnectParam)
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withRemotePath("/")
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +RemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);
    +
    +
    +

    Параметры для создания RemoteBulkWriter почти не отличаются от параметров для LocalBulkWriter, за исключением connect_param. Подробнее о настройках параметров см. в разделе RemoteBulkWriter и ConnectParam в справке SDK.

    +
    +
    +

    Параметры для создания RemoteBulkWriter почти не отличаются от параметров для LocalBulkWriter, за исключением StorageConnectParam. Подробнее о настройках параметров см. в разделах RemoteBulkWriter и StorageConnectParam в справке SDK.

    +
    +

    Начало записи

    +

    У BulkWriter есть два метода: append_row() добавляет строку из исходного набора данных и commit() фиксирует добавленные строки в локальный файл или удаленный бакет.

    +
    +
    +

    У BulkWriter есть два метода: appendRow() добавляет строку из исходного набора данных и commit() фиксирует добавленные строки в локальный файл или удаленный бакет.

    +
    +

    В демонстрационных целях следующий код добавляет случайно сгенерированные данные.

    + +
    import random, string, json
    +import numpy as np
    +import tensorflow as tf
    +
    +def generate_random_str(length=5):
    +    letters = string.ascii_uppercase
    +    digits = string.digits
    +    
    +    return ''.join(random.choices(letters + digits, k=length))
    +
    +# optional input for binary vector:
    +# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]
    +# 2. numpy array of uint8
    +def gen_binary_vector(to_numpy_arr):
    +    raw_vector = [random.randint(0, 1) for i in range(DIM)]
    +    if to_numpy_arr:
    +        return np.packbits(raw_vector, axis=-1)
    +    return raw_vector
    +
    +# optional input for float vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float32
    +def gen_float_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype="float32")
    +    return raw_vector
    +
    +# # optional input for bfloat16 vector:
    +# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# # 2. numpy array of bfloat16
    +# def gen_bf16_vector(to_numpy_arr):
    +#     raw_vector = [random.random() for _ in range(DIM)]
    +#     if to_numpy_arr:
    +#         return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()
    +#     return raw_vector
    +
    +# optional input for float16 vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float16
    +def gen_fp16_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype=np.float16)
    +    return raw_vector
    +
    +# optional input for sparse vector:
    +# only accepts dict like {2: 13.23, 45: 0.54} or {"indices": [1, 2], "values": [0.1, 0.2]}
    +# note: no need to sort the keys
    +def gen_sparse_vector(pair_dict: bool):
    +    raw_vector = {}
    +    dim = random.randint(2, 20)
    +    if pair_dict:
    +        raw_vector["indices"] = [i for i in range(dim)]
    +        raw_vector["values"] = [random.random() for _ in range(dim)]
    +    else:
    +        for i in range(dim):
    +            raw_vector[i] = random.random()
    +    return raw_vector
    +
    +for i in range(10000):
    +    writer.append_row({
    +        "id": np.int64(i),
    +        "bool": True if i % 3 == 0 else False,
    +        "int8": np.int8(i%128),
    +        "int16": np.int16(i%1000),
    +        "int32": np.int32(i%100000),
    +        "int64": np.int64(i),
    +        "float": np.float32(i/3),
    +        "double": np.float64(i/7),
    +        "varchar": f"varchar_{i}",
    +        "json": json.dumps({"dummy": i, "ok": f"name_{i}"}),
    +        "array_str": np.array([f"str_{k}" for k in range(5)], np.dtype("str")),
    +        "array_int": np.array([k for k in range(10)], np.dtype("int64")),
    +        "float_vector": gen_float_vector(True),
    +        "binary_vector": gen_binary_vector(True),
    +        "float16_vector": gen_fp16_vector(True),
    +        # "bfloat16_vector": gen_bf16_vector(True),
    +        "sparse_vector": gen_sparse_vector(True),
    +        f"dynamic_{i}": i,
    +    })
    +    if (i+1)%1000 == 0:
    +        writer.commit()
    +        print('committed')
    +
    +print(writer.batch_files)
    +
    +
    private static byte[] genBinaryVector() {
    +    Random ran = new Random();
    +    int byteCount = DIM / 8;
    +    ByteBuffer vector = ByteBuffer.allocate(byteCount);
    +    for (int i = 0; i < byteCount; ++i) {
    +        vector.put((byte) ran.nextInt(Byte.MAX_VALUE));
    +    }
    +    return vector.array();
    +}
    +
    +private static List<Float> genFloatVector() {
    +    Random ran = new Random();
    +    List<Float> vector = new ArrayList<>();
    +    for (int i = 0; i < DIM; ++i) {
    +        vector.add(ran.nextFloat());
    +    }
    +    return vector;
    +}
    +
    +private static byte[] genFloat16Vector() {
    +    List<Float> originalVector = genFloatVector();
    +    return Float16Utils.f32VectorToFp16Buffer(originalVector).array();
    +}
    +
    +private static SortedMap<Long, Float> genSparseVector() {
    +    Random ran = new Random();
    +    SortedMap<Long, Float> sparse = new TreeMap<>();
    +    int dim = ran.nextInt(18) + 2; // [2, 20)
    +    for (int i = 0; i < dim; ++i) {
    +        sparse.put((long)ran.nextInt(1000000), ran.nextFloat());
    +    }
    +    return sparse;
    +}
    +
    +private static List<String> genStringArray(int length) {
    +    List<String> arr = new ArrayList<>();
    +    for (int i = 0; i < length; i++) {
    +        arr.add("str_" + i);
    +    }
    +    return arr;
    +}
    +
    +private static List<Long> genIntArray(int length) {
    +    List<Long> arr = new ArrayList<>();
    +    for (long i = 0; i < length; i++) {
    +        arr.add(i);
    +    }
    +    return arr;
    +}
    +
    +private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +private static List<List<String>> uploadData() throws Exception {
    +    CreateCollectionReq.CollectionSchema collectionSchema = createSchema();
    +    try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {
    +        for (int i = 0; i < 10000; ++i) {
    +            JsonObject rowObject = new JsonObject();
    +
    +            rowObject.addProperty("id", i);
    +            rowObject.addProperty("bool", i % 3 == 0);
    +            rowObject.addProperty("int8", i % 128);
    +            rowObject.addProperty("int16", i % 1000);
    +            rowObject.addProperty("int32", i % 100000);
    +            rowObject.addProperty("int64", i);
    +            rowObject.addProperty("float", i / 3);
    +            rowObject.addProperty("double", i / 7);
    +            rowObject.addProperty("varchar", "varchar_" + i);
    +            rowObject.addProperty("json", String.format("{\"dummy\": %s, \"ok\": \"name_%s\"}", i, i));
    +            rowObject.add("array_str", GSON_INSTANCE.toJsonTree(genStringArray(5)));
    +            rowObject.add("array_int", GSON_INSTANCE.toJsonTree(genIntArray(10)));
    +            rowObject.add("float_vector", GSON_INSTANCE.toJsonTree(genFloatVector()));
    +            rowObject.add("binary_vector", GSON_INSTANCE.toJsonTree(genBinaryVector()));
    +            rowObject.add("float16_vector", GSON_INSTANCE.toJsonTree(genFloat16Vector()));
    +            rowObject.add("sparse_vector", GSON_INSTANCE.toJsonTree(genSparseVector()));
    +            rowObject.addProperty("dynamic", "dynamic_" + i);
    +
    +            remoteBulkWriter.appendRow(rowObject);
    +
    +            if ((i+1)%1000 == 0) {
    +                remoteBulkWriter.commit(false);
    +            }
    +        }
    +
    +        List<List<String>> batchFiles = remoteBulkWriter.getBatchFiles();
    +        System.out.println(batchFiles);
    +        return batchFiles;
    +    } catch (Exception e) {
    +        throw e;
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +}
    +
    +

    Проверка результатов

    +

    Чтобы проверить результаты, вы можете получить фактический путь вывода, распечатав свойство batch_files писателя.

    +
    +
    +

    Чтобы проверить результаты, вы можете получить фактический путь вывода, распечатав метод getBatchFiles() писателя.

    +
    + +
    print(writer.batch_files)
    +
    +# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],
    +#  ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]
    +
    +
    // localBulkWriter.getBatchFiles();
    +remoteBulkWriter.getBatchFiles();
    +
    +// 
    +
    +// Close the BulkWriter
    +try {
    +    localBulkWriter.close();
    +    remoteBulkWriter.close();            
    +} catch (Exception e) {
    +    // TODO: handle exception
    +    e.printStackTrace();
    +}
    +
    +

    BulkWriter генерирует UUID, создает вложенную папку с UUID в предоставленном каталоге вывода и помещает все сгенерированные файлы в эту вложенную папку. Щелкните здесь, чтобы загрузить готовый пример данных.

    +

    Возможные структуры папок следующие:

    +
    # JSON
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.json 
    +
    +# Parquet
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.parquet 
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.json b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.json new file mode 100644 index 000000000..b24839421 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n filter=\"color in ['red_3314', 'purple_7392']\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .filter(\"color in ['red_3314', 'purple_7392']\")​\n .build());​\n​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Delete entities​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n filter: \"color in ['red', 'green']\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 3​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color in [\\\"red_3314\\\", \\\"purple_7392\\\"]\"​\n}'​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n ids=[18, 19]​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19]​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":{}}​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n ids=[18, 19],​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .partitionName(\"partitionA\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19],​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"cost\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Delete Entities​","anchorList":[{"label":"Удаление сущностей","href":"Delete-Entities​","type":1,"isActive":false},{"label":"Удаление сущностей по условиям фильтрации","href":"Delete-Entities-by-Filtering-Conditions​","type":2,"isActive":false},{"label":"Удаление сущностей по первичным ключам","href":"Delete-Entities-by-Primary-Keys​","type":2,"isActive":false},{"label":"Удаление сущностей из разделов","href":"Delete-Entities-from-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.md b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.md new file mode 100644 index 000000000..120b04723 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/delete-entities.md @@ -0,0 +1,257 @@ +--- +id: delete-entities.md +title: Удалить объекты +--- +

    Удаление сущностей

    Вы можете удалить сущности, которые больше не нужны, с помощью условий фильтрации или их первичных ключей.

    +

    Удаление сущностей по условиям фильтрации

    При пакетном удалении нескольких сущностей, имеющих общие атрибуты, можно использовать выражения фильтрации. В приведенном ниже примере используется оператор in для массового удаления всех сущностей, для поля color которых установлены значения red и green. Вы также можете использовать другие операторы для построения выражений фильтрации, отвечающих вашим требованиям. Более подробную информацию о выражениях фильтрации можно найти в разделе Фильтрация метаданных.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    filter="color in ['red_3314', 'purple_7392']"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +ilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .filter("color in ['red_3314', 'purple_7392']")​
    +        .build());​
    +​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Delete entities​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    filter: "color in ['red', 'green']"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 3​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color in [\"red_3314\", \"purple_7392\"]"​
    +}'​
    +
    +
    +

    Удаление сущностей по первичным ключам

    В большинстве случаев первичный ключ однозначно идентифицирует сущность. Вы можете удалять сущности, задавая их первичные ключи в запросе на удаление. В примере ниже показано, как удалить две сущности с первичными ключами 18 и 19.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    ids=[18, 19]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19]​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +## {"code":0,"cost":0,"data":{}}​
    +
    +
    +

    Удаление сущностей из разделов

    Вы также можете удалять сущности, хранящиеся в определенных разделах. В следующих фрагментах кода предполагается, что в вашей коллекции есть раздел с именем PartitionA.

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    ids=[18, 19],​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .partitionName("partitionA")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19],​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "cost": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.json b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.json new file mode 100644 index 000000000..cb0e7df38 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n partition_name=\"partitionA\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_name: \"partitionA\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 10,​\n# 11,​\n# 12,​\n# 13,​\n# 14,​\n# 15,​\n# 16,​\n# 17,​\n# 18,​\n# 19​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Insert Entities​","anchorList":[{"label":"Вставка сущностей","href":"Insert-Entities​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Вставка сущностей в коллекцию","href":"Insert-Entities-into-a-Collection​","type":2,"isActive":false},{"label":"Вставка сущностей в раздел","href":"Insert-Entities-into-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.md b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.md new file mode 100644 index 000000000..898198da0 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/insert-update-delete.md @@ -0,0 +1,365 @@ +--- +id: insert-update-delete.md +summary: >- + Сущности в коллекции - это записи данных, которые имеют одинаковый набор + полей. Значения полей в каждой записи данных образуют сущность. На этой + странице рассказывается о том, как вставлять сущности в коллекцию. +title: Вставка сущностей +--- +

    Вставка сущностей

    Сущности в коллекции - это записи данных, которые имеют одинаковый набор полей. Значения полей в каждой записи данных образуют сущность. На этой странице рассказывается о том, как вставлять сущности в коллекцию.

    +

    Обзор

    В Milvus сущность относится к записям данных в коллекции, которые имеют одну и ту же схему, при этом данные в каждом поле строки составляют сущность. Поэтому сущности в одной Коллекции имеют одинаковые атрибуты (такие как имена полей, типы данных и другие ограничения).

    +

    При вставке сущности в Коллекцию вставляемая сущность может быть успешно добавлена только в том случае, если она содержит все поля, определенные в схеме. Вставленная сущность попадает в раздел с именем _default в порядке вставки. При условии, что определенный раздел существует, вы также можете вставлять сущности в этот раздел, указав имя раздела в запросе на вставку.

    +

    Milvus также поддерживает динамические поля для поддержания масштабируемости Коллекции. Когда динамическое поле включено, вы можете вставлять в Коллекцию поля, которые не определены в схеме. Эти поля и значения будут храниться в виде пар ключ-значение в зарезервированном поле $meta. Дополнительную информацию о динамических полях см. в разделе Динамическое поле.

    +

    Вставка сущностей в коллекцию

    Перед вставкой данных необходимо организовать их в список словарей в соответствии со схемой, причем каждый словарь будет представлять сущность и содержать все поля, определенные схемой. Если в Коллекции включено динамическое поле, каждый словарь может также включать поля, которые не определены в схеме.

    +

    В этом разделе вы будете вставлять сущности в Коллекцию, созданную способом быстрой настройки. Коллекция, созданная таким образом, имеет только два поля, названные id и vector. Кроме того, в этой Коллекции включено динамическое поле, поэтому сущности в коде примера включают поле **color**, которое не определено в схеме.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Вставка сущностей в раздел

    Вы также можете вставить сущности в указанный раздел. В следующих фрагментах кода предполагается, что в вашей коллекции есть раздел с именем PartitionA.

    + +
    data=[​
    +    {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    partition_name="partitionA",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_name: "partitionA",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             10,​
    +#             11,​
    +#             12,​
    +#             13,​
    +#             14,​
    +#             15,​
    +#             16,​
    +#             17,​
    +#             18,​
    +#             19​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.json b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.json new file mode 100644 index 000000000..1615a015d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"},​\n {\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"},​\n {\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"},​\n {\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"},​\n {\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"},​\n {\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"},​\n {\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"},​\n {\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"},​\n {\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"},​\n {\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}​\n]​\n​\nres = client.upsert(​\n collection_name='quick_setup',​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \\\"color\\\": \\\"black_9898\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \\\"color\\\": \\\"red_7319\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \\\"color\\\": \\\"white_6465\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \\\"color\\\": \\\"orange_7580\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \\\"color\\\": \\\"red_3314\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \\\"color\\\": \\\"black_9955\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \\\"color\\\": \\\"yellow_2461\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \\\"color\\\": \\\"white_5015\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \\\"color\\\": \\\"purple_6414\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \\\"color\\\": \\\"brown_7231\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\ndata = [​\n {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: \"black_9898\"},​\n {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: \"red_7319\"},​\n {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: \"white_6465\"},​\n {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: \"orange_7580\"},​\n {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: \"red_3314\"},​\n {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: \"black_9955\"},​\n {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: \"yellow_2461\"},​\n {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: \"white_5015\"},​\n {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: \"purple_6414\"},​\n {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: \"brown_7231\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n]​\n​\nres = client.upsert(​\n collection_name=\"quick_setup\",​\n data=data,​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \\\"color\\\": \\\"black_3651\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \\\"color\\\": \\\"grey_2049\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \\\"color\\\": \\\"blue_6168\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \\\"color\\\": \\\"blue_1672\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \\\"color\\\": \\\"pink_1601\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \\\"color\\\": \\\"yellow_9925\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \\\"color\\\": \\\"orange_9872\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \\\"color\\\": \\\"red_6450\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \\\"color\\\": \\\"purple_7392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \\\"color\\\": \\\"pink_4996\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 6. Upsert data in partitions​\ndata = [​\n {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: \"black_3651\"},​\n {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: \"grey_2049\"},​\n {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: \"blue_6168\"},​\n {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: \"blue_1672\"},​\n {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: \"pink_1601\"},​\n {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: \"yellow_9925\"},​\n {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: \"orange_9872\"},​\n {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: \"red_6450\"},​\n {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: \"purple_7392\"},​\n {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: \"pink_4996\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Upsert Entities​","anchorList":[{"label":"Сущности Upsert","href":"Upsert-Entities​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Upsert сущности в коллекции","href":"Upsert-Entity-in-a-Collection​","type":2,"isActive":false},{"label":"Вставка сущностей в раздел","href":"Upsert-Entities-in-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.md b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.md new file mode 100644 index 000000000..13fb303a6 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/insert-and-delete/upsert-entities.md @@ -0,0 +1,360 @@ +--- +id: upsert-entities.md +title: Сущности Upsert +--- +

    Сущности Upsert

    Операция Upsert объединяет действия по обновлению и вставке данных. Milvus определяет, выполнять ли операцию обновления или вставки, проверяя, существует ли первичный ключ. В этом разделе мы расскажем о том, как выполнить Upsert сущности, а также о том, как операция Upsert ведет себя в различных сценариях.

    +

    Обзор

    Когда вам нужно обновить сущность в коллекции или вы не уверены, обновлять или вставлять, вы можете попробовать использовать операцию Upsert. При использовании этой операции необходимо убедиться, что сущность, включенная в запрос Upsert, содержит первичный ключ; в противном случае возникнет ошибка. Получив запрос Upsert, Milvus выполнит следующий процесс.

    +
      +
    1. Проверьте, включено ли в первичном поле Коллекции значение AutoId.

      +

      a. Если да, Milvus заменит первичный ключ в сущности автоматически сгенерированным первичным ключом и вставит данные.

      +

      b. Если нет, Milvus будет использовать первичный ключ сущности для вставки данных.

    2. +
    3. Выполните операцию удаления на основе значения первичного ключа сущности, включенной в запрос Upsert.

    4. +
    +

    + + Upsert Entities + Сущности Upsert

    +

    Upsert сущности в коллекции

    В этом разделе вы выполните апсерт сущностей в Коллекцию, созданную способом быстрой настройки. Коллекция, созданная таким образом, имеет только два поля, названные id и vector. Кроме того, в этой Коллекции включено динамическое поле, поэтому сущности в коде примера включают поле с названием color, которое не определено в схеме.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_9898"},​
    +    {"id": 1, "vector": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], "color": "red_7319"},​
    +    {"id": 2, "vector": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], "color": "white_6465"},​
    +    {"id": 3, "vector": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], "color": "orange_7580"},​
    +    {"id": 4, "vector": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], "color": "red_3314"},​
    +    {"id": 5, "vector": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], "color": "black_9955"},​
    +    {"id": 6, "vector": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], "color": "yellow_2461"},​
    +    {"id": 7, "vector": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], "color": "white_5015"},​
    +    {"id": 8, "vector": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], "color": "purple_6414"},​
    +    {"id": 9, "vector": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], "color": "brown_7231"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name='quick_setup',​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +data = [​
    +    {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: "black_9898"},​
    +    {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: "red_7319"},​
    +    {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: "white_6465"},​
    +    {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: "orange_7580"},​
    +    {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: "red_3314"},​
    +    {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: "black_9955"},​
    +    {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: "yellow_2461"},​
    +    {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: "white_5015"},​
    +    {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: "purple_6414"},​
    +    {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: "brown_7231"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Вставка сущностей в раздел

    Вы также можете вставить сущности в указанный раздел. В следующих фрагментах кода предполагается, что в вашей коллекции есть раздел с именем PartitionA.

    + +
    data=[​
    +    {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +    {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +    {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +    {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +    {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +    {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +    {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +    {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +    {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +    {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name="quick_setup",​
    +    data=data,​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 6. Upsert data in partitions​
    +data = [​
    +    {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: "black_3651"},​
    +    {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: "grey_2049"},​
    +    {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: "blue_6168"},​
    +    {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: "blue_1672"},​
    +    {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: "pink_1601"},​
    +    {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: "yellow_9925"},​
    +    {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: "orange_9872"},​
    +    {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: "red_6450"},​
    +    {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: "purple_7392"},​
    +    {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: "pink_4996"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +        {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +        {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +        {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +        {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +        {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +        {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +        {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +        {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +        {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.json b/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.json new file mode 100644 index 000000000..efd22c90f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nindex_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​\nindex_params.add_index(​\n field_name=\"category\", # Name of the scalar field to be indexed​\n index_type=\"BITMAP\", # Type of index to be created​\n index_name=\"category_bitmap_index\" # Name of the index to be created​\n)​\n​\nclient.create_index(​\n collection_name=\"my_collection\", # Specify the collection name​\n index_params=index_params​\n)​\n\n"],"headingContent":"BITMAP​","anchorList":[{"label":"BITMAP","href":"BITMAP​","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Создание растрового индекса","href":"Create-a-bitmap-index","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.md b/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.md new file mode 100644 index 000000000..361ec0671 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/bitmap.md @@ -0,0 +1,125 @@ +--- +id: bitmap.md +title: BITMAP +related_key: bitmap +summary: >- + Битовая индексация - это эффективная техника индексирования, разработанная для + повышения производительности запросов к скалярным полям с низкой + кардинальностью. +--- +

    BITMAP

    Битовая карта - это эффективная техника индексирования, разработанная для повышения производительности запросов к скалярным полям с низкой кардинальностью. Под кардинальностью понимается количество отдельных значений в поле. Поля с меньшим количеством отдельных элементов считаются низкокардинальными.

    +

    Этот тип индекса помогает сократить время поиска скалярных запросов, представляя значения полей в компактном двоичном формате и выполняя над ними эффективные побитовые операции. По сравнению с другими типами индексов, растровые индексы обычно занимают больше места и обеспечивают более высокую скорость выполнения запросов при работе с полями с низкой кардинальностью.

    +

    Обзор

    Термин Bitmap объединяет два слова: Бит и Карта. Бит представляет собой наименьшую единицу данных в компьютере, которая может содержать только значение 0 или 1. Карта, в данном контексте, означает процесс преобразования и организации данных в соответствии с тем, какое значение должно быть присвоено 0 и 1.

    +

    Растровый индекс состоит из двух основных компонентов: растровых изображений и ключей. Ключи представляют собой уникальные значения в индексируемом поле. Для каждого уникального значения существует соответствующее битовое изображение. Длина этих битовых карт равна количеству записей в коллекции. Каждый бит в битовой карте соответствует одной записи в коллекции. Если значение индексируемого поля в записи совпадает с ключом, то соответствующий бит устанавливается в 1, в противном случае - в 0.

    +

    Рассмотрим коллекцию документов с полями Category и Public. Мы хотим получить документы, которые относятся к категории Tech и открыты для публики. В этом случае ключами для наших растровых индексов будут Tech и Public.

    +

    + + Bitmap indexing + Растровое индексирование

    +

    Как показано на рисунке, растровые индексы для Category и Public будут следующими.

    +
      +
    • Tech: [1, 0, 1, 0, 0], что показывает, что только 1-й и 3-й документы попадают в категорию Tech.

    • +
    • Public: [1, 0, 0, 1, 0], что показывает, что только 1-й и 4-й документы открыты для публики.

    • +
    +

    Чтобы найти документы, соответствующие обоим критериям, мы выполняем побитовую операцию AND на этих двух битовых картах.

    +
      +
    • Tech AND Public: [1, 0, 0, 0, 0]
    • +
    +

    Полученное битовое изображение [1, 0, 0, 0, 0] указывает на то, что только первый документ(ID 1) удовлетворяет обоим критериям. Используя растровые индексы и эффективные побитовые операции, мы можем быстро сузить область поиска, избавившись от необходимости сканировать весь набор данных.

    +

    Создание растрового индекса

    Чтобы создать растровый индекс в Milvus, используйте метод create_index() и установите параметр index_type в значение "BITMAP".

    +
    from pymilvus import MilvusClient​
    +​
    +index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​
    +index_params.add_index(​
    +    field_name="category", # Name of the scalar field to be indexed​
    +    index_type="BITMAP", # Type of index to be created​
    +    index_name="category_bitmap_index" # Name of the index to be created​
    +)​
    +​
    +client.create_index(​
    +    collection_name="my_collection", # Specify the collection name​
    +    index_params=index_params​
    +)​
    +
    +
    +

    В этом примере мы создаем растровый индекс по полю category коллекции my_collection. Метод add_index() используется для указания имени поля, типа индекса и имени индекса.

    +

    После создания растрового индекса можно использовать параметр filter в операциях запроса для выполнения скалярной фильтрации на основе проиндексированного поля. Это позволяет эффективно сузить результаты поиска с помощью растрового индекса. Дополнительные сведения см. в разделе Фильтрация метаданных.

    +

    Ограничения

      +
    • Растровые индексы поддерживаются только для скалярных полей, которые не являются первичными ключами.

    • +
    • Тип данных поля должен быть одним из следующих.

      +
        +
      • BOOL, INT8, INT16, INT32, INT64, VARCHAR.

      • +
      • ARRAY (элементы должны быть одного из следующих типов: BOOL, INT8, INT16, INT32, INT64, VARCHAR)

      • +
    • +
    • Растровые индексы не поддерживают следующие типы данных.

      +
        +
      • FLOAT, DOUBLE: Типы с плавающей точкой не совместимы с двоичной природой растровых индексов.

      • +
      • JSON: Типы данных JSON имеют сложную структуру, которая не может быть эффективно представлена с помощью растровых индексов.

      • +
    • +
    • Растровые индексы не подходят для полей с высокой кардинальностью (т. е. для полей с большим количеством различных значений).

      +
        +
      • Как правило, растровые индексы наиболее эффективны, когда кардинальность поля не превышает 500.

      • +
      • При увеличении кардинальности сверх этого порога преимущества растровых индексов в плане производительности снижаются, а накладные расходы на хранение становятся значительными.

      • +
      • Для полей с высокой кардинальностью следует рассмотреть возможность использования альтернативных методов индексирования, например инвертированных индексов, в зависимости от конкретного случая использования и требований к запросам.

      • +
    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.json b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.json new file mode 100644 index 000000000..133aac839 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.json @@ -0,0 +1 @@ +{"codeList":["# Auto indexing\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\nindex_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters\n\nindex_params.add_index(\n field_name=\"scalar_1\", # Name of the scalar field to be indexed\n index_type=\"\", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n index_name=\"default_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"default_index\") // Name of the index to be created\n .indexType(\"\") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"default_index\", // Name of the index to be created\n index_type: \"\" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n})\n","index_params = MilvusClient.prepare_index_params() # Prepare an IndexParams object\n\nindex_params.add_index(\n field_name=\"scalar_2\", # Name of the scalar field to be indexed\n index_type=\"INVERTED\", # Type of index to be created\n index_name=\"inverted_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"inverted_index\") // Name of the index to be created\n .indexType(\"INVERTED\") // Type of index to be created\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"inverted_index\", // Name of the index to be created\n index_type: \"INVERTED\" // Type of index to be created\n})\n","client.list_indexes(\n collection_name=\"test_scalar_index\" # Specify the collection name\n)\n\n# Output:\n# ['default_index','inverted_index']\n","import java.util.List;\nimport io.milvus.v2.service.index.request.ListIndexesReq;\n\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ]\n","res = await client.listIndexes({\n collection_name: 'test_scalar_index'\n})\n\nconsole.log(res.indexes)\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ] \n"],"headingContent":"Index Scalar Fields","anchorList":[{"label":"Скалярные поля индексов","href":"Index-Scalar-Fields","type":1,"isActive":false},{"label":"Типы скалярного индексирования","href":"Types-of-scalar-indexing","type":2,"isActive":false},{"label":"Автоматическое индексирование","href":"Auto-indexing","type":2,"isActive":false},{"label":"Пользовательское индексирование","href":"Custom-indexing","type":2,"isActive":false},{"label":"Проверка результата","href":"Verifying-the-result","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.md b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.md new file mode 100644 index 000000000..5e4d97be8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-scalar-fields.md @@ -0,0 +1,326 @@ +--- +id: index-scalar-fields.md +order: 2 +summary: >- + Это руководство поможет вам создать и настроить скалярные индексы для таких + полей, как целые числа, строки и т. д. +title: Скалярные поля индексов +--- +

    Скалярные поля индексов

    В Milvus скалярный индекс используется для ускорения метафильтрации по определенному значению не векторного поля, подобно традиционному индексу базы данных. В этом руководстве вы узнаете, как создать и настроить скалярные индексы для таких полей, как целые числа, строки и т. д.

    +

    Типы скалярного индексирования

    +

    Автоматическое индексирование

    +

    Чтобы использовать автоматическое индексирование, опустите параметр index_type в строке add_index()чтобы Milvus мог определить тип индекса на основе типа скалярного поля.

    +
    +
    +

    Чтобы использовать автоматическое индексирование, опустите параметр indexType в IndexParam, чтобы Milvus мог определить тип индекса на основе типа скалярного поля.

    +
    +
    +

    Чтобы использовать автоматическое индексирование, опустите параметр index_type в createIndex(), чтобы Milvus мог определить тип индекса на основе типа скалярного поля.

    +
    +

    Сопоставления между скалярными типами данных и алгоритмами индексации по умолчанию см. в разделе Алгоритмы индексации скалярных полей.

    + +
    # Auto indexing
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +index_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
    +
    +index_params.add_index(
    +    field_name="scalar_1", # Name of the scalar field to be indexed
    +    index_type="", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    index_name="default_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("default_index") // Name of the index to be created
    +    .indexType("") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "default_index", // Name of the index to be created
    +    index_type: "" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +})
    +
    +

    Пользовательское индексирование

    +

    Чтобы использовать пользовательскую индексацию, укажите конкретный тип индекса с помощью параметра index_type в файле add_index().

    +
    +
    +

    Чтобы использовать пользовательскую индексацию, укажите конкретный тип индекса с помощью параметра indexType в IndexParam.

    +
    +
    +

    Чтобы использовать пользовательскую индексацию, укажите конкретный тип индекса с помощью параметра index_type в createIndex().

    +
    +

    В примере ниже создается инвертированный индекс для скалярного поля scalar_2.

    + +
    index_params = MilvusClient.prepare_index_params() #  Prepare an IndexParams object
    +
    +index_params.add_index(
    +    field_name="scalar_2", # Name of the scalar field to be indexed
    +    index_type="INVERTED", # Type of index to be created
    +    index_name="inverted_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("inverted_index") // Name of the index to be created
    +    .indexType("INVERTED") // Type of index to be created
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "inverted_index", // Name of the index to be created
    +    index_type: "INVERTED" // Type of index to be created
    +})
    +
    +
    +

    Методы и параметры

    +
      +
    • prepare_index_params()

      +

      Подготавливает объект IndexParams.

    • +
    • add_index()

      +

      Добавляет конфигурации индекса в объект IndexParams.

      +
        +
      • имя_поля(строка)

        +

        Имя скалярного поля для индексации.

      • +
      • index_type(строка):

        +

        Тип создаваемого скалярного индекса. Для неявного индексирования оставьте его пустым или опустите этот параметр.

        +

        Для пользовательского индексирования допустимыми значениями являются:

        +
          +
        • INVERTED: (Рекомендуется) Инвертированный индекс состоит из словаря терминов, содержащего все токенизированные слова, отсортированные в алфавитном порядке. Подробнее см. в разделе Скалярный индекс.

        • +
        • STL_SORT: Сортирует скалярные поля с помощью стандартного алгоритма сортировки библиотеки шаблонов. Поддерживаются только числовые поля (например, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).

        • +
        • Trie: Древовидная структура данных для быстрого поиска и извлечения префиксов. Поддерживает поля VARCHAR.

        • +
      • +
      • имя_индекса(строка)

        +

        Имя создаваемого скалярного индекса. Каждое скалярное поле поддерживает один индекс.

      • +
    • +
    • create_index()

      +

      Создает индекс в указанной коллекции.

      +
        +
      • имя_коллекции(строка)

        +

        Имя коллекции, для которой создается индекс.

      • +
      • index_params

        +

        Объект IndexParams, содержащий конфигурации индекса.

      • +
    • +
    +
    +
    +

    Методы и параметры

    +
      +
    • IndexParamПодготавливает объект IndexParam.
        +
      • fieldName(String) Имя скалярного поля для индексации.
      • +
      • indexName(String) Имя создаваемого скалярного индекса. Каждое скалярное поле поддерживает один индекс.
      • +
      • indexType(String) Тип создаваемого скалярного индекса. Для неявного индексирования оставьте его пустым или опустите этот параметр. Для пользовательского индексирования допустимыми значениями являются:
          +
        • INVERTED: (Рекомендуется) Инвертированный индекс состоит из словаря терминов, содержащего все токенизированные слова, отсортированные в алфавитном порядке. Подробнее см. в разделе Скалярный индекс.
        • +
        • STL_SORT: Сортирует скалярные поля с помощью стандартного алгоритма сортировки библиотеки шаблонов. Поддерживает булевы и числовые поля (например, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).
        • +
        • Trie: Древовидная структура данных для быстрого поиска и извлечения префиксов. Поддерживает поля VARCHAR.
        • +
      • +
    • +
    • CreateIndexReqСоздает индекс в указанной коллекции.
        +
      • collectionName(String) Имя коллекции, для которой создается индекс.
      • +
      • indexParams(List) Список объектов IndexParam, содержащих конфигурации индекса.
      • +
    • +
    +
    +
    +

    Методы и параметры

    +
      +
    • createIndex

      +

      Создает индекс в указанной коллекции.

      +
        +
      • Имя_коллекции(строка) Имя коллекции, для которой создается индекс.
      • +
      • имя_поля(строка) Имя скалярного поля для индексации.
      • +
      • index_name(string) Имя создаваемого скалярного индекса. Каждое скалярное поле поддерживает один индекс.
      • +
      • index_type(строка) Тип создаваемого скалярного индекса. Для неявного индексирования оставьте его пустым или опустите этот параметр. Для пользовательского индексирования допустимыми значениями являются:
          +
        • INVERTED: (рекомендуется) Инвертированный индекс состоит из словаря терминов, содержащего все токенизированные слова, отсортированные в алфавитном порядке. Подробнее см. в разделе Скалярный индекс.
        • +
        • STL_SORT: Сортирует скалярные поля с помощью стандартного алгоритма сортировки библиотеки шаблонов. Поддерживаются булевы и числовые поля (например, INT8, INT16, INT32, INT64, FLOAT, DOUBLE).
        • +
        • Trie: Древовидная структура данных для быстрого поиска и извлечения префиксов. Поддерживает поля VARCHAR.
        • +
      • +
    • +
    +
    +

    Проверка результата

    +

    Используйте метод list_indexes() для проверки создания скалярных индексов:

    +
    +
    +

    Используйте метод listIndexes() для проверки создания скалярных индексов:

    +
    +
    +

    Используйте метод listIndexes() для проверки создания скалярных индексов:

    +
    + +
    client.list_indexes(
    +    collection_name="test_scalar_index"  # Specify the collection name
    +)
    +
    +# Output:
    +# ['default_index','inverted_index']
    +
    +
    import java.util.List;
    +import io.milvus.v2.service.index.request.ListIndexesReq;
    +
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("test_scalar_index")  // Specify the collection name
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]
    +
    +
    res = await client.listIndexes({
    +    collection_name: 'test_scalar_index'
    +})
    +
    +console.log(res.indexes)
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]   
    +
    +

    Ограничения

      +
    • В настоящее время скалярная индексация поддерживает типы данных INT8, INT16, INT32, INT64, FLOAT, DOUBLE, BOOL, VARCHAR и ARRAY, но не тип данных JSON.
    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.json b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.json new file mode 100644 index 000000000..d98899a4e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# 1. Set up a Milvus client\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\n# 2. Create schema\n# 2.1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True,\n)\n\n# 2.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)\n\n# 3. Create collection\nclient.create_collection(\n collection_name=\"customized_setup\", \n schema=schema, \n)\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";\n\n// 1. Connect to Milvus server\nConnectConfig connectConfig = ConnectConfig.builder()\n .uri(CLUSTER_ENDPOINT)\n .build();\n\nMilvusClientV2 client = new MilvusClientV2(connectConfig);\n\n// 2. Create a collection\n\n// 2.1 Create schema\nCreateCollectionReq.CollectionSchema schema = client.createSchema();\n\n// 2.2 Add fields to schema\nschema.addField(AddFieldReq.builder().fieldName(\"id\").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());\nschema.addField(AddFieldReq.builder().fieldName(\"vector\").dataType(DataType.FloatVector).dimension(5).build());\n\n// 3 Create a collection without schema and index parameters\nCreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()\n.collectionName(\"customized_setup\")\n.collectionSchema(schema)\n.build();\n\nclient.createCollection(customizedSetupReq);\n","// 1. Set up a Milvus Client\nclient = new MilvusClient({address, token});\n\n// 2. Define fields for the collection\nconst fields = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n autoID: false\n },\n {\n name: \"vector\",\n data_type: DataType.FloatVector,\n dim: 5\n },\n]\n\n// 3. Create a collection\nres = await client.createCollection({\n collection_name: \"customized_setup\",\n fields: fields,\n})\n\nconsole.log(res.error_code) \n\n// Output\n// \n// Success\n// \n","# 4.1. Set up the index parameters\nindex_params = MilvusClient.prepare_index_params()\n\n# 4.2. Add an index on the vector field.\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"IVF_FLAT\",\n index_name=\"vector_index\",\n params={ \"nlist\": 128 }\n)\n\n# 4.3. Create an index file\nclient.create_index(\n collection_name=\"customized_setup\",\n index_params=index_params,\n sync=False # Whether to wait for index creation to complete before returning. Defaults to True.\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\n// 4 Prepare index parameters\n\n// 4.2 Add an index for the vector field \"vector\"\nIndexParam indexParamForVectorField = IndexParam.builder()\n .fieldName(\"vector\")\n .indexName(\"vector_index\")\n .indexType(IndexParam.IndexType.IVF_FLAT)\n .metricType(IndexParam.MetricType.COSINE)\n .extraParams(Map.of(\"nlist\", 128))\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\n// 4.3 Crate an index file\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","// 4. Set up index for the collection\n// 4.1. Set up the index parameters\nres = await client.createIndex({\n collection_name: \"customized_setup\",\n field_name: \"vector\",\n index_type: \"AUTOINDEX\",\n metric_type: \"COSINE\", \n index_name: \"vector_index\",\n params: { \"nlist\": 128 }\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n","# 5. Describe index\nres = client.list_indexes(\n collection_name=\"customized_setup\"\n)\n\nprint(res)\n\n# Output\n#\n# [\n# \"vector_index\",\n# ]\n\nres = client.describe_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n\nprint(res)\n\n# Output\n#\n# {\n# \"index_type\": ,\n# \"metric_type\": \"COSINE\",\n# \"field_name\": \"vector\",\n# \"index_name\": \"vector_index\"\n# }\n","import io.milvus.v2.service.index.request.DescribeIndexReq;\nimport io.milvus.v2.service.index.response.DescribeIndexResp;\n\n// 5. Describe index\n// 5.1 List the index names\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"customized_setup\")\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"vector_index\"\n// ]\n\n// 5.2 Describe an index\nDescribeIndexReq describeIndexReq = DescribeIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nDescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);\n\nSystem.out.println(JSONObject.toJSON(describeIndexResp));\n\n// Output:\n// {\n// \"metricType\": \"COSINE\",\n// \"indexType\": \"AUTOINDEX\",\n// \"fieldName\": \"vector\",\n// \"indexName\": \"vector_index\"\n// }\n","// 5. Describe the index\nres = await client.describeIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(JSON.stringify(res.index_descriptions, null, 2))\n\n// Output\n// \n// [\n// {\n// \"params\": [\n// {\n// \"key\": \"index_type\",\n// \"value\": \"AUTOINDEX\"\n// },\n// {\n// \"key\": \"metric_type\",\n// \"value\": \"COSINE\"\n// }\n// ],\n// \"index_name\": \"vector_index\",\n// \"indexID\": \"449007919953063141\",\n// \"field_name\": \"vector\",\n// \"indexed_rows\": \"0\",\n// \"total_rows\": \"0\",\n// \"state\": \"Finished\",\n// \"index_state_fail_reason\": \"\",\n// \"pending_index_rows\": \"0\"\n// }\n// ]\n// \n","# 6. Drop index\nclient.drop_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n","// 6. Drop index\n\nDropIndexReq dropIndexReq = DropIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nclient.dropIndex(dropIndexReq);\n","// 6. Drop the index\nres = await client.dropIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n"],"headingContent":"Index Vector Fields","anchorList":[{"label":"Индексирование векторных полей","href":"Index-Vector-Fields","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Подготовка","href":"Preparations","type":2,"isActive":false},{"label":"Индексирование коллекции","href":"Index-a-Collection","type":2,"isActive":false},{"label":"Проверка сведений об индексе","href":"Check-Index-Details","type":2,"isActive":false},{"label":"Сбросить индекс","href":"Drop-an-Index","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.md b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.md new file mode 100644 index 000000000..3727f2ed8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-vector-fields.md @@ -0,0 +1,593 @@ +--- +id: index-vector-fields.md +order: 1 +summary: >- + В этом руководстве рассматриваются основные операции по созданию и управлению + индексами векторных полей в коллекции. +title: Индексирование векторных полей +--- +

    Индексирование векторных полей

    В этом руководстве рассматриваются основные операции по созданию и управлению индексами векторных полей в коллекции.

    +

    Обзор

    Используя метаданные, хранящиеся в индексном файле, Milvus организует ваши данные в специализированную структуру, облегчая быстрое извлечение запрашиваемой информации при поиске или запросах.

    +

    Milvus предоставляет несколько типов индексов и метрик для сортировки значений полей для эффективного поиска по сходству. В следующей таблице перечислены поддерживаемые типы индексов и метрики для различных типов векторных полей. В настоящее время Milvus поддерживает различные типы векторных данных, включая вкрапления с плавающей точкой (часто называемые векторами с плавающей точкой или плотными векторами), двоичные вкрапления (также известные как двоичные векторы) и разреженные вкрапления (также известные как разреженные векторы). Подробнее см. в разделе Индекс в памяти и метрики сходства.

    + +
    + + + + + + + + + + + + + +
    Типы метрикТипы индексов
    • Евклидово расстояние (L2)
    • Внутреннее произведение (IP)
    • Косинусное сходство (COSINE)
    • FLAT
    • IVF_FLAT
    • IVF_SQ8
    • IVF_PQ
    • GPU_IVF_FLAT
    • GPU_IVF_PQ
    • HNSW
    • DISKANN
    +
    +
    + + + + + + + + + + + + + +
    Метрические типыТипы индексов
    • Жаккард (JACCARD)
    • Хэмминг (HAMMING)
    • BIN_FLAT
    • BIN_IVF_FLAT
    +
    +
    + + + + + + + + + + + + + +
    Метрические типыТипы индексов
    IP
    • РАЗРЕЖЕННЫЙ_ИНВЕРТИРОВАННЫЙ_ИНДЕКС
    • SPARSE_WAND
    +
    +

    Рекомендуется создавать индексы как для векторного поля, так и для скалярных полей, к которым часто обращаются.

    +

    Подготовка

    Как объясняется в разделе "Управление коллекциями", Milvus автоматически генерирует индекс и загружает его в память при создании коллекции, если в запросе на создание коллекции указано одно из следующих условий:

    +
      +
    • размерность векторного поля и тип метрики, или

    • +
    • Схема и параметры индекса.

    • +
    +

    В приведенном ниже фрагменте кода используется существующий код для установления соединения с экземпляром Milvus и создания коллекции без указания параметров индекса. В этом случае коллекция не имеет индекса и остается незагруженной.

    +
    +

    Чтобы подготовиться к индексированию, используйте MilvusClient чтобы подключиться к серверу Milvus и создать коллекцию с помощью create_schema(), add_field(), и create_collection().

    +
    +
    +

    Чтобы подготовиться к индексированию, используйте MilvusClientV2 для подключения к серверу Milvus и настройки коллекции с помощью createSchema(), addField(), и createCollection().

    +
    +
    +

    Чтобы подготовиться к индексированию, используйте MilvusClient для подключения к серверу Milvus и настройки коллекции с помощью createCollection().

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# 1. Set up a Milvus client
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +# 2. Create schema
    +# 2.1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True,
    +)
    +
    +# 2.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
    +
    +# 3. Create collection
    +client.create_collection(
    +    collection_name="customized_setup", 
    +    schema=schema, 
    +)
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +String CLUSTER_ENDPOINT = "http://localhost:19530";
    +
    +// 1. Connect to Milvus server
    +ConnectConfig connectConfig = ConnectConfig.builder()
    +    .uri(CLUSTER_ENDPOINT)
    +    .build();
    +
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);
    +
    +// 2. Create a collection
    +
    +// 2.1 Create schema
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();
    +
    +// 2.2 Add fields to schema
    +schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
    +schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());
    +
    +// 3 Create a collection without schema and index parameters
    +CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
    +.collectionName("customized_setup")
    +.collectionSchema(schema)
    +.build();
    +
    +client.createCollection(customizedSetupReq);
    +
    +
    // 1. Set up a Milvus Client
    +client = new MilvusClient({address, token});
    +
    +// 2. Define fields for the collection
    +const fields = [
    +    {
    +        name: "id",
    +        data_type: DataType.Int64,
    +        is_primary_key: true,
    +        autoID: false
    +    },
    +    {
    +        name: "vector",
    +        data_type: DataType.FloatVector,
    +        dim: 5
    +    },
    +]
    +
    +// 3. Create a collection
    +res = await client.createCollection({
    +    collection_name: "customized_setup",
    +    fields: fields,
    +})
    +
    +console.log(res.error_code)  
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    +

    Индексирование коллекции

    +

    Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте prepare_index_params() для подготовки параметров индекса и create_index() чтобы создать индекс.

    +
    +
    +

    Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте IndexParam для подготовки параметров индекса и createIndex() чтобы создать индекс.

    +
    +
    +

    Чтобы создать индекс для коллекции или проиндексировать коллекцию, используйте createIndex().

    +
    + +
    # 4.1. Set up the index parameters
    +index_params = MilvusClient.prepare_index_params()
    +
    +# 4.2. Add an index on the vector field.
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="IVF_FLAT",
    +    index_name="vector_index",
    +    params={ "nlist": 128 }
    +)
    +
    +# 4.3. Create an index file
    +client.create_index(
    +    collection_name="customized_setup",
    +    index_params=index_params,
    +    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +// 4 Prepare index parameters
    +
    +// 4.2 Add an index for the vector field "vector"
    +IndexParam indexParamForVectorField = IndexParam.builder()
    +    .fieldName("vector")
    +    .indexName("vector_index")
    +    .indexType(IndexParam.IndexType.IVF_FLAT)
    +    .metricType(IndexParam.MetricType.COSINE)
    +    .extraParams(Map.of("nlist", 128))
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +// 4.3 Crate an index file
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    // 4. Set up index for the collection
    +// 4.1. Set up the index parameters
    +res = await client.createIndex({
    +    collection_name: "customized_setup",
    +    field_name: "vector",
    +    index_type: "AUTOINDEX",
    +    metric_type: "COSINE",   
    +    index_name: "vector_index",
    +    params: { "nlist": 128 }
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОписание
    field_nameИмя целевого файла, к которому применяется данный объект.
    metric_typeАлгоритм, который используется для измерения сходства между векторами. Возможные значения: IP, L2, COSINE, JACCARD, HAMMING. Этот параметр доступен только в том случае, если указанное поле является векторным полем. Дополнительную информацию см. в разделе Индексы, поддерживаемые в Milvus.
    index_typeИмя алгоритма, используемого для упорядочивания данных в конкретном поле. Применимые алгоритмы см. в разделах Индекс в памяти и Индекс на диске.
    index_nameИмя индексного файла, созданного после применения данного объекта.
    paramsПараметры тонкой настройки для указанного типа индекса. Подробные сведения о возможных ключах и диапазонах значений см. в разделе Индекс в памяти.
    collection_nameИмя существующей коллекции.
    index_paramsОбъект IndexParams, содержащий список объектов IndexParam.
    syncУправляет тем, как строится индекс по отношению к запросу клиента. Допустимые значения:
    • True (по умолчанию): Клиент ждет, пока индекс будет полностью построен, прежде чем вернуться. Это означает, что вы не получите ответа, пока процесс не будет завершен.
    • False: Клиент возвращается сразу после получения запроса, а индекс строится в фоновом режиме. Чтобы узнать, завершилось ли создание индекса, используйте метод describe_index().
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОписание
    fieldNameИмя целевого поля, к которому применяется данный объект IndexParam.
    indexNameИмя индексного файла, созданного после применения данного объекта.
    indexTypeИмя алгоритма, используемого для упорядочивания данных в конкретном поле. Применимые алгоритмы см. в разделах Индекс в памяти и Индекс на диске.
    metricTypeМетрика расстояния, используемая для индекса. Возможные значения: IP, L2, COSINE, JACCARD, HAMMING.
    extraParamsДополнительные параметры индекса. Подробнее см. в разделах Индекс в памяти и Индекс на диске.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ПараметрОписание
    collection_nameИмя существующей коллекции.
    field_nameИмя поля, в котором нужно создать индекс.
    index_typeТип создаваемого индекса.
    metric_typeТип метрики, используемой для измерения векторного расстояния.
    index_nameИмя создаваемого индекса.
    paramsДругие специфические для индекса параметры.
    +
    +

    примечания

    +

    В настоящее время для каждого поля коллекции можно создать только один индексный файл.

    +
    +

    Проверка сведений об индексе

    После создания индекса можно проверить его детали.

    +
    +

    Чтобы проверить сведения об индексе, используйте list_indexes() чтобы перечислить имена индексов и describe_index() чтобы получить сведения об индексе.

    +
    +
    +

    Чтобы проверить сведения об индексе, используйте describeIndex() чтобы получить сведения об индексе.

    +
    +
    +

    Чтобы проверить сведения об индексе, используйте describeIndex() чтобы получить сведения об индексе.

    +
    + +
    # 5. Describe index
    +res = client.list_indexes(
    +    collection_name="customized_setup"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# [
    +#     "vector_index",
    +# ]
    +
    +res = client.describe_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# {
    +#     "index_type": ,
    +#     "metric_type": "COSINE",
    +#     "field_name": "vector",
    +#     "index_name": "vector_index"
    +# }
    +
    +
    import io.milvus.v2.service.index.request.DescribeIndexReq;
    +import io.milvus.v2.service.index.response.DescribeIndexResp;
    +
    +// 5. Describe index
    +// 5.1 List the index names
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("customized_setup")
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "vector_index"
    +// ]
    +
    +// 5.2 Describe an index
    +DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);
    +
    +System.out.println(JSONObject.toJSON(describeIndexResp));
    +
    +// Output:
    +// {
    +//     "metricType": "COSINE",
    +//     "indexType": "AUTOINDEX",
    +//     "fieldName": "vector",
    +//     "indexName": "vector_index"
    +// }
    +
    +
    // 5. Describe the index
    +res = await client.describeIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(JSON.stringify(res.index_descriptions, null, 2))
    +
    +// Output
    +// 
    +// [
    +//   {
    +//     "params": [
    +//       {
    +//         "key": "index_type",
    +//         "value": "AUTOINDEX"
    +//       },
    +//       {
    +//         "key": "metric_type",
    +//         "value": "COSINE"
    +//       }
    +//     ],
    +//     "index_name": "vector_index",
    +//     "indexID": "449007919953063141",
    +//     "field_name": "vector",
    +//     "indexed_rows": "0",
    +//     "total_rows": "0",
    +//     "state": "Finished",
    +//     "index_state_fail_reason": "",
    +//     "pending_index_rows": "0"
    +//   }
    +// ]
    +// 
    +
    +

    Вы можете проверить индексный файл, созданный для определенного поля, и собрать статистику по количеству строк, проиндексированных с помощью этого индексного файла.

    +

    Сбросить индекс

    Вы можете просто отказаться от индекса, если он больше не нужен.

    +
    +

    Прежде чем сбрасывать индекс, убедитесь, что он был освобожден.

    +
    +
    +

    Чтобы удалить индекс, используйте команду drop_index().

    +
    +
    +

    Чтобы удалить индекс, используйте dropIndex().

    +
    +
    +

    Чтобы сбросить индекс, используйте dropIndex().

    +
    + +
    # 6. Drop index
    +client.drop_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +
    // 6. Drop index
    +
    +DropIndexReq dropIndexReq = DropIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +client.dropIndex(dropIndexReq);
    +
    +
    // 6. Drop the index
    +res = await client.dropIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.json b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.json new file mode 100644 index 000000000..b532bf389 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.json @@ -0,0 +1 @@ +{"codeList":["gpu:\n initMemSize: 0 #set the initial memory pool size.\n maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","gpu:\n initMemSize: 2048 #set the initial memory pool size.\n maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_CAGRA\",\n \"params\": {\n 'intermediate_graph_degree': 64,\n 'graph_degree': 32\n }\n}\n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_IVF_FLAT\", # Or GPU_IVF_PQ\n \"params\": {\n \"nlist\": 1024\n }\n}\n","index_params = {\n 'index_type': 'GPU_BRUTE_FORCE',\n 'metric_type': 'L2',\n 'params': {}\n}\n","# Get an existing collection\ncollection = Collection(\"YOUR_COLLECTION_NAME\")\n\ncollection.create_index(\n field_name=\"vector\", # Name of the vector field on which an index is built\n index_params=index_params\n)\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {}\n}\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {\n \"itopk_size\": 128,\n \"search_width\": 4,\n \"min_iterations\": 0,\n \"max_iterations\": 0,\n \"team_size\": 0\n }\n}\n","search_params = {\n \"metric_type\": \"L2\", \n \"params\": {\"nprobe\": 10}\n}\n","# Load data into memory\ncollection.load()\n\ncollection.search(\n data=[[query_vector]], # Your query vector\n anns_field=\"vector\", # Name of the vector field\n param=search_params,\n limit=100 # Number of the results to return\n)\n"],"headingContent":"Index with GPU","anchorList":[{"label":"Индекс с GPU","href":"Index-with-GPU","type":1,"isActive":false},{"label":"Настройка параметров Milvus для управления памятью GPU","href":"Configure-Milvus-settings-for-GPU-memory-control","type":2,"isActive":false},{"label":"Построение индекса","href":"Build-an-index","type":2,"isActive":false},{"label":"Поиск","href":"Search","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"FAQ","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.md b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.md new file mode 100644 index 000000000..99f0bd6a8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage-indexes/index-with-gpu.md @@ -0,0 +1,233 @@ +--- +id: index-with-gpu.md +order: 3 +summary: >- + В этом руководстве объясняется, как создать индекс с поддержкой GPU в Milvus, + чтобы повысить производительность поиска. +title: Индекс с GPU +--- +

    Индекс с GPU

    В этом руководстве описаны шаги по созданию индекса с поддержкой GPU в Milvus, который может значительно повысить производительность поиска в сценариях с высокой пропускной способностью и большим количеством обращений. Подробные сведения о типах индексов с поддержкой GPU в Milvus см. в разделе Индекс GPU.

    +

    Настройка параметров Milvus для управления памятью GPU

    Milvus использует глобальный пул графической памяти для выделения памяти GPU.

    +

    Он поддерживает два параметра initMemSize и maxMemSize в файле конфигурации Milvus. Изначально размер пула устанавливается на initMemSize, а после превышения этого лимита автоматически увеличивается до maxMemSize.

    +

    По умолчанию initMemSize составляет 1/2 доступной памяти GPU при запуске Milvus, а по умолчанию maxMemSize равен всей доступной памяти GPU.

    +

    До версии Milvus 2.4.1 (включая версию 2.4.1) Milvus использовал единый пул памяти GPU. Для версий до 2.4.1 (включая версию 2.4.1) рекомендовалось установить оба значения в 0.

    +
    gpu:
    +  initMemSize: 0 #set the initial memory pool size.
    +  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    Начиная с Milvus 2.4.1, пул памяти GPU используется только для временных данных GPU во время поиска. Поэтому рекомендуется устанавливать значения 2048 и 4096.

    +
    gpu:
    +  initMemSize: 2048 #set the initial memory pool size.
    +  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    Построение индекса

    В следующих примерах показано, как создавать GPU-индексы разных типов.

    +

    Подготовка параметров индекса

    При настройке параметров индекса GPU определите index_type, metric_type и params:

    +
      +
    • index_type(string): Тип индекса, используемого для ускорения векторного поиска. Возможные варианты: GPU_CAGRA, GPU_IVF_FLAT, GPU_IVF_PQ и GPU_BRUTE_FORCE.

    • +
    • metric_type(строка): Тип метрики, используемой для измерения сходства векторов. Возможные варианты: IP и L2.

    • +
    • params(dict): Специфические для индекса параметры построения. Валидные опции для этого параметра зависят от типа индекса.

    • +
    +

    Ниже приведены примеры конфигураций для различных типов индексов:

    +
      +
    • ИндексGPU_CAGRA

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_CAGRA",
      +    "params": {
      +        'intermediate_graph_degree': 64,
      +        'graph_degree': 32
      +    }
      +}
      +
      +

      Возможные опции для параметра params включают:

      +
        +
      • intermediate_graph_degree(int): Влияет на запоминание и время построения, определяя степень графа перед обрезкой. Рекомендуемые значения - 32 или 64.

      • +
      • graph_degree(int): Влияет на производительность поиска и запоминание, задавая степень графа после обрезки. Обычно она равна половине промежуточной_графовой_степени. Большая разница между этими двумя степенями приводит к увеличению времени построения. Его значение должно быть меньше значения intermediate_graph_degree.

      • +
      • build_algo(строка): Выбирает алгоритм построения графа перед обрезкой. Возможные варианты:

        +
          +
        • IVF_PQ: предлагает более высокое качество, но более медленное время построения.

        • +
        • NN_DESCENT: Обеспечивает более быстрое построение с потенциально более низким отзывом.

        • +
      • +
      • cache_dataset_on_device(string, "true" | "false"): Решает, нужно ли кэшировать исходный набор данных в памяти GPU. Значение "true" повышает запоминаемость за счет уточнения результатов поиска, а значение "false" экономит память GPU.

      • +
    • +
    • ИндексGPU_IVF_FLAT или GPU_IVF_PQ

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ
      +    "params": {
      +        "nlist": 1024
      +    }
      +}
      +
      +

      Параметры params идентичны тем, что используются в IVF_FLAT и IVF_PQ.

    • +
    • ИндексGPU_BRUTE_FORCE

      +
      index_params = {
      +    'index_type': 'GPU_BRUTE_FORCE',
      +    'metric_type': 'L2',
      +    'params': {}
      +}
      +
      +

      Никаких дополнительных конфигураций params не требуется.

    • +
    +

    Построение индекса

    После настройки параметров индекса в index_params вызовите метод create_index() для построения индекса.

    +
    # Get an existing collection
    +collection = Collection("YOUR_COLLECTION_NAME")
    +
    +collection.create_index(
    +    field_name="vector", # Name of the vector field on which an index is built
    +    index_params=index_params
    +)
    +
    +

    После того как вы построили индекс GPU, следующим шагом будет подготовка параметров поиска перед выполнением поиска.

    +

    Подготовка параметров поиска

    Ниже приведены примеры конфигураций для различных типов индексов:

    +
      +
    • ИндексGPU_BRUTE_FORCE

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {}
      +}
      +
      +

      Никаких дополнительных конфигураций параметров не требуется.

    • +
    • ИндексGPU_CAGRA

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {
      +        "itopk_size": 128,
      +        "search_width": 4,
      +        "min_iterations": 0,
      +        "max_iterations": 0,
      +        "team_size": 0
      +    }
      +}
      +
      +

      Ключевые параметры поиска включают:

      +
        +
      • itopk_size: Определяет размер промежуточных результатов, сохраняемых во время поиска. Большее значение может улучшить запоминание за счет снижения производительности поиска. Оно должно быть как минимум равно конечному значению top-k(limit) и обычно является показателем степени 2 (например, 16, 32, 64, 128).

      • +
      • search_width: задает количество точек входа в граф CAGRA во время поиска. Увеличение этого значения может улучшить запоминание, но может повлиять на производительность поиска.

      • +
      • min_iterations / max_iterations: Эти параметры управляют процессом итераций поиска. По умолчанию они установлены в 0, и CAGRA автоматически определяет количество итераций, основываясь на itopk_size и search_width. Настройка этих значений вручную может помочь сбалансировать производительность и точность.

      • +
      • team_size: Указывает количество потоков CUDA, используемых для вычисления метрического расстояния на GPU. Обычные значения - от 2 до 32 (например, 2, 4, 8, 16, 32). Это значение незначительно влияет на производительность поиска. Значение по умолчанию - 0, при котором Milvus автоматически выбирает размер team_size на основе размерности вектора.

      • +
    • +
    • ИндексGPU_IVF_FLAT или GPU_IVF_PQ

      +
      search_params = {
      +    "metric_type": "L2", 
      +    "params": {"nprobe": 10}
      +}
      +
      +

      Параметры поиска для этих двух типов индексов аналогичны тем, что используются в IVF_FLAT и IVF_PQ. Дополнительные сведения см. в разделе Проведение поиска векторного сходства.

    • +
    +

    Воспользуйтесь методом search() для выполнения поиска векторного сходства в индексе GPU.

    +
    # Load data into memory
    +collection.load()
    +
    +collection.search(
    +    data=[[query_vector]], # Your query vector
    +    anns_field="vector", # Name of the vector field
    +    param=search_params,
    +    limit=100 # Number of the results to return
    +)
    +
    +

    Ограничения

    При использовании индексов GPU следует помнить о некоторых ограничениях:

    +
      +
    • Для GPU_IVF_FLAT максимальное значение limit равно 1024.

    • +
    • Для GPU_IVF_PQ и GPU_CAGRA максимальное значение limit равно 1024.

    • +
    • Хотя для GPU_BRUTE_FORCE нет установленного предела, рекомендуется не превышать 4096, чтобы избежать потенциальных проблем с производительностью.

    • +
    • В настоящее время индексы GPU не поддерживают расстояние COSINE. Если требуется расстояние COSINE, то сначала следует нормализовать данные, а затем использовать вместо него расстояние внутреннего произведения (IP).

    • +
    • Защита от OOM при загрузке для индексов GPU поддерживается не полностью, слишком большой объем данных может привести к сбою QueryNode.

    • +
    • GPU-индексы не поддерживают такие функции поиска, как поиск по диапазону и поиск по группировке.

    • +
    +

    FAQ

      +
    • Когда целесообразно использовать GPU-индекс?

      +

      GPU-индекс особенно полезен в ситуациях, когда требуется высокая пропускная способность или высокий уровень отзыва. Например, при работе с большими партиями данных производительность индексирования на GPU может превышать производительность индексирования на CPU в 100 раз. В сценариях с небольшими партиями индексы на GPU по-прежнему значительно превосходят индексы на CPU по производительности. Кроме того, если требуется быстрая вставка данных, использование GPU может существенно ускорить процесс создания индексов.

    • +
    • Для каких сценариев наиболее подходят индексы на GPU, такие как CAGRA, GPU_IVF_PQ, GPU_IVF_FLAT и GPU_BRUTE_FORCE?

      +

      Индексы CAGRA идеально подходят для сценариев, требующих повышенной производительности, хотя и за счет потребления большего объема памяти. В средах, где приоритетом является экономия памяти, индекс GPU_IVF_PQ может помочь минимизировать требования к хранению данных, хотя при этом теряется точность. Индекс GPU_IVF_FLAT служит сбалансированным вариантом, предлагая компромисс между производительностью и использованием памяти. И наконец, индекс GPU_BRUTE_FORCE предназначен для операций исчерпывающего поиска, гарантируя коэффициент отзыва равный 1 при выполнении обходного поиска.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/manage_databases.json b/localization/v2.5.x/site/ru/userGuide/manage_databases.json new file mode 100644 index 000000000..856e90248 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage_databases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, db\n\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\n\ndatabase = db.create_database(\"my_database\")\n","import io.milvus.client.MilvusServiceClient;\nimport io.milvus.param.ConnectParam;\nimport io.milvus.param.collection.CreateDatabaseParam;\n\n// 1. Connect to Milvus server\nConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n\n// 3. Create a new database\nCreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()\n .withDatabaseName(\"\")\n .build();\n\nR response = client.createDatabase(createDatabaseParam);\n","const address = \"http://localhost:19530\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address });\n\n// 3. Create a database\nres = await client.createDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n\n// {\n// error_code: 'Success',\n// reason: '',\n// code: 0,\n// retriable: false,\n// detail: ''\n// }\n","db.using_database(\"my_database\")\n","// No equivalent method is available.\n","// 4. Activate another database\nres = await client.useDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n","conn = connections.connect(\n host=\"127.0.0.1\",\n port=\"19530\",\n db_name=\"my_database\"\n)\n","ConnectParam connectParam = ConnectParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n","const address = \"http://localhost:19530\";\nconst db_name = \"my_database\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address, db_name });\n","db.list_database()\n\n# Output\n['default', 'my_database']\n","import io.milvus.grpc.ListDatabasesResponse;\nimport io.milvus.param.R;\n\n// 2. List all databases\nR listDatabasesResponse = client.listDatabases();\nSystem.out.println(listDatabasesResponse.getData());\n\n// status {\n// }\n// db_names: \"default\"\n// db_names: \"my_database\"\n// created_timestamp: 1716794498117757990\n// created_timestamp: 1716797196479639477\n","res = await client.listDatabases();\n\nconsole.log(res.db_names);\n\n// [ 'default', 'my_database' ]\n","db.drop_database(\"my_database\")\n\ndb.list_database()\n\n# Output\n['default']\n","import io.milvus.param.collection.DropDatabaseParam;\n\nDropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .build();\n\nresponse = client.dropDatabase(dropDatabaseParam);\n","res = await client.dropDatabase({\n db_name: \"my_database\",\n});\n","from pymilvus import connections, Role\n\n_URI = \"http://localhost:19530\"\n_TOKEN = \"root:Milvus\"\n_DB_NAME = \"default\"\n\n\ndef connect_to_milvus(db_name=\"default\"):\n print(f\"connect to milvus\\n\")\n connections.connect(\n uri=_URI,\n token=_TOKEN,\n db_name=db_name\n )\n","String URI = \"http://localhost:19530\";\nString TOKEN = \"root:Milvus\";\n\npublic class ConnectToMilvus {\n private String _dbName = \"default\";\n\n public newBuilder() {}\n\n public MilvusServiceClient build() {\n ConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(URI)\n .withToken(TOKEN)\n .withDatabaseName(_dbNAME)\n .build();\n\n return new MilvusServiceClient(connectParam);\n }\n\n public newBuilder withDbName(String dbName) {\n this._dbName = dbName;\n return this;\n }\n}\n","const address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\n\nfunction connectToMilvus(dbName = \"default\") {\n const client = new MilvusClient({\n address,\n token,\n dbName,\n });\n\n return client;\n}\n","_ROLE_NAME = \"test_role\"\n_PRIVILEGE_INSERT = \"Insert\"\n\nconnect_to_milvus()\nrole = Role(_ROLE_NAME)\nrole.create()\n\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","String ROLE_NAME = \"test_role\";\nString PRIVILEGE_INSERT = \"Insert\";\n\nMilvusServiceClient client = new ConnectToMilvus().build();\nR response = client.createRole(CreateRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const ROLE_NAME = \"test_role\";\nconst PRIVILEGE_INSERT = \"Insert\";\n\nconst client = connectToMilvus();\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\nconnect_to_milvus(db_name=\"foo\")\n\n# This role will have the insert permission of all collections under foo db,\n# excluding the insert permissions of collections under other dbs\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","// NOTE: please make sure the 'foo' db has been created\nMilvusServiceClient client = new ConnectToMilvus().withDbName(\"foo\").build();\n\n// This role will have the insert permission of all collections under foo db,\n// excluding the insert permissions of collections under other dbs\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const client = connectToMilvus(\"foo\");\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\n\ndb_name = \"foo\"\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\nprint(role.list_grants(db_name=db_name))\nprint(role.list_grant(\"Collection\", \"*\", db_name=db_name))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\n","// NOTE: please make sure the 'foo' db has been created\n\nString dbName = \"foo\";\nMilvusServiceClient client = new ConnectToMilvus().build();\n\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","// The Node.js SDK currently cannot support this case.\n"],"headingContent":"Manage Databases","anchorList":[{"label":"Управление базами данных","href":"Manage-Databases","type":1,"isActive":false},{"label":"Создание базы данных","href":"Create-database","type":2,"isActive":false},{"label":"Использование базы данных","href":"Use-a-database","type":2,"isActive":false},{"label":"Список баз данных","href":"List-databases","type":2,"isActive":false},{"label":"Сбросить базу данных","href":"Drop-database","type":2,"isActive":false},{"label":"Использование RBAC с базой данных","href":"Use-RBAC-with-database","type":2,"isActive":false},{"label":"Что дальше","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/manage_databases.md b/localization/v2.5.x/site/ru/userGuide/manage_databases.md new file mode 100644 index 000000000..0c1ad1056 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/manage_databases.md @@ -0,0 +1,597 @@ +--- +id: manage_databases.md +title: Управление базами данных +--- +

    Управление базами данных

    Как и в традиционных системах баз данных, в Milvus можно создавать базы данных и назначать определенным пользователям привилегии для управления ими. Затем эти пользователи получают право управлять коллекциями в базах данных. Кластер Milvus поддерживает максимум 64 базы данных.

    +
    +

    Сниппеты кода на этой странице используют модуль PyMilvus ORM для взаимодействия с Milvus. Сниппеты кода с новым MilvusClient SDK будут доступны в ближайшее время.

    +
    +

    Создание базы данных

    +

    Используйте connect() для подключения к серверу Milvus и create_database() для создания новой базы данных:

    +
    +
    +

    Используйте MilvusClient для подключения к серверу Milvus и createDatabase() для создания новой базы данных:

    +
    +
    +

    Используйте MilvusClient для подключения к серверу Milvus и createDatabase() для создания новой базы данных:

    +
    + +
    from pymilvus import connections, db
    +
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +
    +database = db.create_database("my_database")
    +
    +
    import io.milvus.client.MilvusServiceClient;
    +import io.milvus.param.ConnectParam;
    +import io.milvus.param.collection.CreateDatabaseParam;
    +
    +// 1. Connect to Milvus server
    +ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +// 3. Create a new database
    +CreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()
    +    .withDatabaseName("")
    +    .build();
    +
    +R<RpcStatus> response = client.createDatabase(createDatabaseParam);
    +
    +
    const address = "http://localhost:19530";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address });
    +
    +// 3. Create a database
    +res = await client.createDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +// {
    +//   error_code: 'Success',
    +//   reason: '',
    +//   code: 0,
    +//   retriable: false,
    +//   detail: ''
    +// }
    +
    +

    Приведенные выше фрагменты кода подключаются к базе данных по умолчанию и создают новую базу данных с именем my_database.

    +

    Использование базы данных

    Кластер Milvus поставляется с базой данных по умолчанию, названной 'default'. Коллекции создаются в базе данных по умолчанию, если не указано иное.

    +

    Чтобы изменить базу данных по умолчанию, выполните следующие действия:

    + +
    db.using_database("my_database")
    +
    +
    // No equivalent method is available.
    +
    +
    // 4. Activate another database
    +res = await client.useDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +

    Вы также можете задать базу данных, которая будет использоваться при подключении к кластеру Milvus, следующим образом:

    + +
    conn = connections.connect(
    +    host="127.0.0.1",
    +    port="19530",
    +    db_name="my_database"
    +)
    +
    +
    ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +
    const address = "http://localhost:19530";
    +const db_name = "my_database";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address, db_name });
    +
    +

    Список баз данных

    +

    Чтобы найти все существующие базы данных в вашем кластере Milvus, используйте метод list_database():

    +
    +
    +

    Чтобы найти все существующие базы данных в вашем кластере Milvus, используйте метод listDatabases():

    +
    +
    +

    Чтобы найти все существующие базы данных в вашем кластере Milvus, используйте метод listDatabases():

    +
    + +
    db.list_database()
    +
    +# Output
    +['default', 'my_database']
    +
    +
    import io.milvus.grpc.ListDatabasesResponse;
    +import io.milvus.param.R;
    +
    +// 2. List all databases
    +R<ListDatabasesResponse> listDatabasesResponse = client.listDatabases();
    +System.out.println(listDatabasesResponse.getData());
    +
    +// status {
    +// }
    +// db_names: "default"
    +// db_names: "my_database"
    +// created_timestamp: 1716794498117757990
    +// created_timestamp: 1716797196479639477
    +
    +
    res = await client.listDatabases();
    +
    +console.log(res.db_names);
    +
    +// [ 'default', 'my_database' ]
    +
    +

    Сбросить базу данных

    Чтобы сбросить базу данных, необходимо сначала сбросить все ее коллекции. В противном случае сброс не удастся.

    +
    +

    Чтобы сбросить базу данных, используйте метод drop_database():

    +
    +
    +

    Чтобы сбросить базу данных, используйте метод dropDatabase():

    +
    +
    +

    Чтобы сбросить базу данных, используйте метод dropDatabase():

    +
    + +
    db.drop_database("my_database")
    +
    +db.list_database()
    +
    +# Output
    +['default']
    +
    +
    import io.milvus.param.collection.DropDatabaseParam;
    +
    +DropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .build();
    +
    +response = client.dropDatabase(dropDatabaseParam);
    +
    +
    res = await client.dropDatabase({
    +    db_name: "my_database",
    +});
    +
    +

    Использование RBAC с базой данных

    RBAC также охватывает операции с базами данных и обеспечивает совместимость с ними. Слово database в API разрешений (Grant / Revoke / List Grant) имеет следующие значения:

    +
      +
    • Если ни в соединении Milvus, ни в вызове Permission API не указан db_name, то под словом database подразумевается база данных по умолчанию.
    • +
    • Если в соединении Milvus указан db_name, а в последующем вызове Permission API - нет, то база данных ссылается на базу данных, имя которой было указано в соединении Milvus.
    • +
    • Если вызов Permission API выполняется по соединению Milvus, с указанием или без указания db_name, база данных ссылается на базу данных, имя которой было указано в вызове Permission API.
    • +
    +

    Следующий фрагмент кода является общим для всех перечисленных ниже блоков.

    + +
    from pymilvus import connections, Role
    +
    +_URI = "http://localhost:19530"
    +_TOKEN = "root:Milvus"
    +_DB_NAME = "default"
    +
    +
    +def connect_to_milvus(db_name="default"):
    +    print(f"connect to milvus\n")
    +    connections.connect(
    +        uri=_URI,
    +        token=_TOKEN,
    +        db_name=db_name
    +    )
    +
    +
    String URI = "http://localhost:19530";
    +String TOKEN = "root:Milvus";
    +
    +public class ConnectToMilvus {
    +    private String _dbName = "default";
    +
    +    public newBuilder() {}
    +
    +    public MilvusServiceClient build() {
    +        ConnectParam connectParam = ConnectParam.newBuilder()
    +            .withUri(URI)
    +            .withToken(TOKEN)
    +            .withDatabaseName(_dbNAME)
    +            .build();
    +
    +        return new MilvusServiceClient(connectParam);
    +    }
    +
    +    public newBuilder withDbName(String dbName) {
    +        this._dbName = dbName;
    +        return this;
    +    }
    +}
    +
    +
    const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +
    +function connectToMilvus(dbName = "default") {
    +    const client = new MilvusClient({
    +        address,
    +        token,
    +        dbName,
    +    });
    +
    +    return client;
    +}
    +
    +
      +
    • Если ни в соединении Milvus, ни в вызове Permission API не указан db_name, база данных ссылается на базу данных по умолчанию.

      +

      +
      _ROLE_NAME = "test_role"
      +_PRIVILEGE_INSERT = "Insert"
      +
      +connect_to_milvus()
      +role = Role(_ROLE_NAME)
      +role.create()
      +
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      String ROLE_NAME = "test_role";
      +String PRIVILEGE_INSERT = "Insert";
      +
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +R<RpcStatus> response = client.createRole(CreateRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const ROLE_NAME = "test_role";
      +const PRIVILEGE_INSERT = "Insert";
      +
      +const client = connectToMilvus();
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • Если в соединении Milvus указан db_name, а в последующем вызове Permission API - нет, то база данных ссылается на базу данных, имя которой было указано в соединении Milvus.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +connect_to_milvus(db_name="foo")
      +
      +# This role will have the insert permission of all collections under foo db,
      +# excluding the insert permissions of collections under other dbs
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +MilvusServiceClient client = new ConnectToMilvus().withDbName("foo").build();
      +
      +// This role will have the insert permission of all collections under foo db,
      +// excluding the insert permissions of collections under other dbs
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const client = connectToMilvus("foo");
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • Если вызов Permission API выполняется по соединению Milvus, с указанием или без указания db_name, база данных ссылается на базу данных, имя которой было указано в вызове Permission API.

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +
      +db_name = "foo"
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +print(role.list_grants(db_name=db_name))
      +print(role.list_grant("Collection", "*", db_name=db_name))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +
      +String dbName = "foo";
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      // The Node.js SDK currently cannot support this case.
      +
    • +
    +

    Что дальше

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.json new file mode 100644 index 000000000..caeeb7ff8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"type\": \"standard\", # Uses the standard built-in analyzer​\n \"stop_words\": [\"a\", \"an\", \"for\"] # Defines a list of common words (stop words) to exclude from tokenization​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"standard\");\nanalyzerParams.put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n","const analyzer_params = {\n \"type\": \"standard\", // Uses the standard built-in analyzer\n \"stop_words\": [\"a\", \"an\", \"for\"] // Defines a list of common words (stop words) to exclude from tokenization\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }'\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stop\",​\n \"stop_words\": [\"a\", \"an\", \"for\"]​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","[\"Vector\", \"Database\", \"Built\", \"for\", \"Scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"whitespace\");\n","const analyzer_params = {\n \"tokenizer\": \"whitespace\",\n};\n","export analyzerParams='{\n \"type\": \"whitespace\"\n }'\n","[\"vector\", \"database\", \"built\", \"for\", \"scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [\"lowercase\"], # Optional: Built-in filter that converts text to lowercase​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\", Collections.singletonList(\"lowercase\"));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\"lowercase\"], // Optional: Built-in filter that converts text to lowercase\n}\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\"lowercase\"]\n}'\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [​\n {​\n \"type\": \"stop\", # Specifies 'stop' as the filter type​\n \"stop_words\": [\"of\", \"to\"], # Customizes stop words for this filter type​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Collections.singletonList(new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\n {\n \"type\": \"stop\", // Specifies 'stop' as the filter type\n \"stop_words\": [\"of\", \"to\"], // Customizes stop words for this filter type\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","from pymilvus import MilvusClient, DataType​\n​\n# Set up a Milvus client​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\"​\n)​\n​\n# Create schema​\nschema = client.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\n# Add fields to schema​\n​\n# Use a built-in analyzer​\nanalyzer_params_built_in = {​\n \"type\": \"english\"​\n}​\n​\n# Add VARCHAR field `title_en`​\nschema.add_field(​\n field_name='title_en', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_built_in,​\n enable_match=True, ​\n)​\n​\n# Configure a custom analyzer​\nanalyzer_params_custom = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\", # Built-in filter​\n {​\n \"type\": \"length\", # Custom filter​\n \"max\": 40​\n },​\n {​\n \"type\": \"stop\", # Custom filter​\n \"stop_words\": [\"of\", \"to\"]​\n }​\n ]​\n}​\n​\n# Add VARCHAR field `title`​\nschema.add_field(​\n field_name='title', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_custom,​\n enable_match=True, ​\n)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n# Add primary field​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\n​\n# Set up index params for vector field​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"embedding\", metric_type=\"COSINE\", index_type=\"AUTOINDEX\")​\n​\n# Create collection with defined schema​\nclient.create_collection(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n schema=schema,​\n index_params=index_params​\n)​\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\n// Set up a Milvus client\nConnectConfig config = ConnectConfig.builder()\n .uri(\"http://localhost:19530\")\n .build();\nMilvusClientV2 client = new MilvusClientV2(config);\n\n// Create schema\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\n// Add fields to schema\n// Use a built-in analyzer\nMap analyzerParamsBuiltin = new HashMap<>();\nanalyzerParamsBuiltin.put(\"type\", \"english\");\n// Add VARCHAR field `title_en`\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title_en\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParamsBuiltin)\n .enableMatch(true)\n .build());\n\n// Configure a custom analyzer\nMap analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"length\");\n put(\"max\", 40);\n }},\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}\n )\n);\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true) // must enable this if you use TextMatch\n .build());\n\n// Add vector field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"embedding\")\n .dataType(DataType.FloatVector)\n .dimension(3)\n .build());\n// Add primary field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\n\n// Set up index params for vector field\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"embedding\")\n .indexType(IndexParam.IndexType.AUTOINDEX)\n .metricType(IndexParam.MetricType.COSINE)\n .build());\n\n// Create collection with defined schema\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\n// Set up a Milvus client\nconst client = new MilvusClient(\"http://localhost:19530\");\n// Use a built-in analyzer for VARCHAR field `title_en`\nconst analyzerParamsBuiltIn = {\n type: \"english\",\n};\n\n// Configure a custom analyzer for VARCHAR field `title`\nconst analyzerParamsCustom = {\n tokenizer: \"standard\",\n filter: [\n \"lowercase\",\n {\n type: \"length\",\n max: 40,\n },\n {\n type: \"stop\",\n stop_words: [\"of\", \"to\"],\n },\n ],\n};\n\n// Create schema\nconst schema = {\n auto_id: true,\n fields: [\n {\n name: \"id\",\n type: DataType.INT64,\n is_primary: true,\n },\n {\n name: \"title_en\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsBuiltIn,\n enable_match: true,\n },\n {\n name: \"title\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsCustom,\n enable_match: true,\n },\n {\n name: \"embedding\",\n data_type: DataType.FLOAT_VECTOR,\n dim: 4,\n },\n ],\n};\n\n// Set up index params for vector field\nconst indexParams = [\n {\n name: \"embedding\",\n metric_type: \"COSINE\",\n index_type: \"AUTOINDEX\",\n },\n];\n\n// Create collection with defined schema\nawait client.createCollection({\n collection_name: \"YOUR_COLLECTION_NAME\",\n schema: schema,\n index_params: indexParams,\n});\n\nconsole.log(\"Collection created successfully!\");\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"title_en\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"title\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\n \"tokenizer\": \"standard\",\n \"filter\":[\n \"lowercase\",\n {\n \"type\":\"length\",\n \"max\":40\n },\n {\n \"type\":\"stop\",\n \"stop_words\":[\"of\",\"to\"]\n }\n ]\n }\n }\n },\n {\n \"fieldName\": \"embedding\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\":3\n }\n }\n ]\n }'\n \nexport indexParams='[\n {\n \"fieldName\": \"embedding\",\n \"metricType\": \"COSINE\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"YOUR_COLLECTION_NAME\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n"],"headingContent":"Analyzer Overview​","anchorList":[{"label":"Обзор анализаторов","href":"Analyzer-Overview​","type":1,"isActive":false},{"label":"Анатомия анализатора","href":"Anatomy-of-an-analyzer​","type":2,"isActive":false},{"label":"Типы анализаторов","href":"Analyzer-types​","type":2,"isActive":false},{"label":"Пример использования","href":"Example-use​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.md new file mode 100644 index 000000000..29b0ebffb --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer-overview.md @@ -0,0 +1,585 @@ +--- +id: analyzer-overview.md +title: Обзор анализаторов +summary: >- + В обработке текстов анализатор - это важнейший компонент, преобразующий + необработанный текст в структурированный формат, удобный для поиска. Каждый + анализатор обычно состоит из двух основных элементов: токенизатора и фильтра. + Вместе они преобразуют входной текст в лексемы, уточняют эти лексемы и готовят + их к эффективному индексированию и поиску. +--- +

    Обзор анализаторов

    В обработке текстов анализатор - это важнейший компонент, преобразующий необработанный текст в структурированный, пригодный для поиска формат. Каждый анализатор обычно состоит из двух основных элементов: токенизатора и фильтра. Вместе они преобразуют входной текст в лексемы, уточняют эти лексемы и готовят их к эффективному индексированию и поиску.

    +

    Анализаторы в Milvus, работающие на базе Tantivy, настраиваются во время создания коллекции, когда вы добавляете поля VARCHAR в схему коллекции. Токены, созданные анализатором, могут быть использованы для построения индекса для сопоставления с текстом или преобразованы в разреженные вкрапления для полнотекстового поиска. Дополнительные сведения см. в разделе "Текстовое соответствие или полнотекстовый поиск".

    +
    +

    Использование анализаторов может повлиять на производительность.

    +
      +
    • Полнотекстовый поиск: При полнотекстовом поиске каналы DataNode и QueryNode потребляют данные медленнее, поскольку им приходится ждать завершения токенизации. В результате вновь поступившие данные становятся доступными для поиска дольше.

    • +
    • Текстовое соответствие: При сопоставлении текстов создание индекса также происходит медленнее, поскольку перед созданием индекса необходимо завершить токенизацию.

    • +
    +
    +

    Анатомия анализатора

    Анализатор в Milvus состоит ровно из одного токенизатора и нуля или более фильтров.

    +
      +
    • Токенизатор: Токенизатор разбивает входной текст на дискретные единицы, называемые лексемами. Эти лексемы могут быть словами или фразами, в зависимости от типа токенизатора.

    • +
    • Фильтры: Фильтры могут применяться к лексемам для их дальнейшего уточнения, например, для перевода их в нижний регистр или удаления общих слов.

    • +
    +

    Ниже показано, как анализатор обрабатывает текст.

    +

    analyzer-overview

    +

    Типы анализаторов

    Milvus предоставляет два типа анализаторов для удовлетворения различных потребностей в обработке текста.

    +
      +
    • Встроенный анализатор: Это предопределенные конфигурации, которые решают общие задачи обработки текста с минимальной настройкой. Встроенные анализаторы идеально подходят для поиска общего назначения, поскольку не требуют сложной настройки.

    • +
    • Пользовательский анализатор: Для более сложных задач пользовательские анализаторы позволяют задать собственную конфигурацию, указав как токенизатор, так и ноль или более фильтров. Такой уровень настройки особенно полезен в специализированных случаях, когда требуется точный контроль над обработкой текста.

    • +
    +
    +

    Если вы не указываете конфигурацию анализатора при создании коллекции, Milvus по умолчанию использует анализатор standard для обработки всего текста. Подробнее см. в разделе Стандартный.

    +
    +

    Встроенный анализатор

    Встроенные анализаторы в Milvus предварительно сконфигурированы с определенными токенизаторами и фильтрами, что позволяет использовать их сразу, без необходимости определять эти компоненты самостоятельно. Каждый встроенный анализатор представляет собой шаблон, включающий в себя предустановленные токенизаторы и фильтры, с дополнительными параметрами для настройки.

    +

    Например, чтобы использовать встроенный анализатор standard, достаточно указать его имя standard в качестве type и опционально включить дополнительные конфигурации, специфичные для этого типа анализатора, например stop_words.

    + +
    analyzer_params = {​
    +    "type": "standard", # Uses the standard built-in analyzer​
    +    "stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "standard");
    +analyzerParams.put("stop_words", Arrays.asList("a", "an", "for"));
    +
    +
    const analyzer_params = {
    +    "type": "standard", // Uses the standard built-in analyzer
    +    "stop_words": ["a", "an", "for"] // Defines a list of common words (stop words) to exclude from tokenization
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "stop_words": ["a", "an", "for"]
    +    }'
    +
    +

    Приведенная выше конфигурация встроенного анализатора standard эквивалентна настройке пользовательского анализатора со следующими параметрами, где опции tokenizer и filter явно определены для достижения той же функциональности:

    + +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stop",​
    +            "stop_words": ["a", "an", "for"]​
    +        }​
    +    ]​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}));
    +
    +
    const analyzer_params = {
    +    "tokenizer": "standard",
    +    "filter": [
    +        "lowercase",
    +        {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +        }
    +    ]
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "filter":  [
    +       "lowercase",
    +       {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +       }
    +   ]
    +}'
    +
    +

    Milvus предлагает следующие встроенные анализаторы, каждый из которых можно использовать напрямую, указав его имя в качестве параметра type.

    +
      +
    • standard: : Подходит для обработки текста общего назначения, применяя стандартную токенизацию и фильтрацию строчных букв.

    • +
    • english: : Оптимизирован для англоязычного текста, с поддержкой английских стоп-слов.

    • +
    • chinese: Специализирован для обработки китайского текста, включая токенизацию, адаптированную к структурам китайского языка.

    • +
    +

    Пользовательский анализатор

    Для более сложной обработки текста пользовательские анализаторы в Milvus позволяют создать индивидуальный конвейер обработки текста, указав токенизатор и фильтры. Такая настройка идеально подходит для специализированных случаев, когда требуется точный контроль.

    +

    Токенизатор

    Токенизатор - обязательный компонент пользовательского анализатора, который запускает конвейер анализатора, разбивая входной текст на дискретные единицы или лексемы. В зависимости от типа токенизатора токенизация выполняется по определенным правилам, таким как разбиение на пробельные символы или знаки препинания. Этот процесс позволяет более точно и независимо обрабатывать каждое слово или фразу.

    +

    Например, токенизатор преобразует текст "Vector Database Built for Scale" в отдельные лексемы.

    +
    ["Vector", "Database", "Built", "for", "Scale"]​
    +
    +

    Пример указания токенизатора.

    + +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "whitespace");
    +
    +
    const analyzer_params = {
    +    "tokenizer": "whitespace",
    +};
    +
    +
    export analyzerParams='{
    +       "type": "whitespace"
    +    }'
    +
    +

    Фильтр

    Фильтры - это необязательные компоненты, работающие с токенами, полученными токенизатором, преобразуя или уточняя их по мере необходимости. Например, после применения фильтра lowercase к токенизированным терминам ["Vector", "Database", "Built", "for", "Scale"], результат может быть следующим.

    +
    ["vector", "database", "built", "for", "scale"]​
    +
    +

    Фильтры в пользовательском анализаторе могут быть как встроенными, так и пользовательскими, в зависимости от потребностей конфигурации.

    +
      +
    • Встроенные фильтры: Предварительно сконфигурированы Milvus и требуют минимальной настройки. Вы можете использовать эти фильтры из коробки, указав их имена. Приведенные ниже фильтры являются встроенными для прямого использования.

      +
        +
      • lowercase: Преобразует текст в нижний регистр, обеспечивая сопоставление без учета регистра. Подробнее см. в разделе Нижний регистр.

      • +
      • asciifolding: Преобразует не ASCII-символы в ASCII-эквиваленты, упрощая работу с многоязычным текстом. Подробнее см. в разделе Сложение ASCII.

      • +
      • alphanumonly: Сохраняет только алфавитно-цифровые символы, удаляя остальные. Подробнее см. в разделе "Только алфавитно-цифровые".

      • +
      • cnalphanumonly: Удаляет лексемы, содержащие любые символы, кроме китайских, английских букв или цифр. Подробнее см. в разделе Cnalphanumonly.

      • +
      • cncharonly: Удаляет маркеры, содержащие любые некитайские символы. Подробнее см. в разделе Cncharonly.

      • +
      +

      Пример использования встроенного фильтра:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase​
      +}​
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter", Collections.singletonList("lowercase"));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": ["lowercase"], // Optional: Built-in filter that converts text to lowercase
      +}
      +
      +
      export analyzerParams='{
      +   "type": "standard",
      +   "filter":  ["lowercase"]
      +}'
      +
    • +
    • Пользовательские фильтры: Пользовательские фильтры позволяют создавать специализированные конфигурации. Вы можете определить пользовательский фильтр, выбрав подходящий тип фильтра (filter.type) и добавив специальные настройки для каждого типа фильтра. Примеры типов фильтров, поддерживающих настройку.

      +
        +
      • stop: Удаляет указанные общие слова, задавая список стоп-слов (например, "stop_words": ["of", "to"]). Подробнее см. в разделе "Стоп-слова".

      • +
      • length: Исключает лексемы на основе критериев длины, например, задавая максимальную длину лексемы. Подробнее см. в разделе Длина.

      • +
      • stemmer: Сокращает слова до их корневых форм для более гибкого подбора. Подробнее см. в разделе Стеммер.

      • +
      +

      Пример настройки пользовательского фильтра:

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": [​
      +        {​
      +            "type": "stop", # Specifies 'stop' as the filter type​
      +            "stop_words": ["of", "to"], # Customizes stop words for this filter type​
      +        }​
      +    ]​
      +}​
      +
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter",
      +    Collections.singletonList(new HashMap<String, Object>() {{
      +        put("type", "stop");
      +        put("stop_words", Arrays.asList("a", "an", "for"));
      +    }}));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": [
      +        {
      +            "type": "stop", // Specifies 'stop' as the filter type
      +            "stop_words": ["of", "to"], // Customizes stop words for this filter type
      +        }
      +    ]
      +};
      +
      +
      export analyzerParams='{
      +    "type": "standard",
      +    "filter":  [
      +    {
      +            "type": "stop",
      +            "stop_words": ["a", "an", "for"]
      +    }
      +    ]
      +}'
      +
    • +
    +

    Пример использования

    В этом примере мы определяем схему коллекции с векторным полем для вкраплений и двумя полями VARCHAR для возможностей обработки текста. Каждое поле VARCHAR имеет собственные настройки анализатора для обработки различных данных.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +# Set up a Milvus client​
    +client = MilvusClient(​
    +    uri="http://localhost:19530"​
    +)​
    +​
    +# Create schema​
    +schema = client.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +# Add fields to schema​
    +​
    +# Use a built-in analyzer​
    +analyzer_params_built_in = {​
    +    "type": "english"​
    +}​
    +​
    +# Add VARCHAR field `title_en`​
    +schema.add_field(​
    +    field_name='title_en', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_built_in,​
    +    enable_match=True, ​
    +)​
    +​
    +# Configure a custom analyzer​
    +analyzer_params_custom = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase", # Built-in filter​
    +        {​
    +            "type": "length", # Custom filter​
    +            "max": 40​
    +        },​
    +        {​
    +            "type": "stop", # Custom filter​
    +            "stop_words": ["of", "to"]​
    +        }​
    +    ]​
    +}​
    +​
    +# Add VARCHAR field `title`​
    +schema.add_field(​
    +    field_name='title', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_custom,​
    +    enable_match=True, ​
    +)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +# Add primary field​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Set up index params for vector field​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")​
    +​
    +# Create collection with defined schema​
    +client.create_collection(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +// Set up a Milvus client
    +ConnectConfig config = ConnectConfig.builder()
    +        .uri("http://localhost:19530")
    +        .build();
    +MilvusClientV2 client = new MilvusClientV2(config);
    +
    +// Create schema
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +// Add fields to schema
    +// Use a built-in analyzer
    +Map<String, Object> analyzerParamsBuiltin = new HashMap<>();
    +analyzerParamsBuiltin.put("type", "english");
    +// Add VARCHAR field `title_en`
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title_en")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParamsBuiltin)
    +        .enableMatch(true)
    +        .build());
    +
    +// Configure a custom analyzer
    +Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "length");
    +                    put("max", 40);
    +                }},
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}
    +        )
    +);
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true) // must enable this if you use TextMatch
    +        .build());
    +
    +// Add vector field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("embedding")
    +        .dataType(DataType.FloatVector)
    +        .dimension(3)
    +        .build());
    +// Add primary field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +
    +// Set up index params for vector field
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("embedding")
    +        .indexType(IndexParam.IndexType.AUTOINDEX)
    +        .metricType(IndexParam.MetricType.COSINE)
    +        .build());
    +
    +// Create collection with defined schema
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +// Set up a Milvus client
    +const client = new MilvusClient("http://localhost:19530");
    +// Use a built-in analyzer for VARCHAR field `title_en`
    +const analyzerParamsBuiltIn = {
    +  type: "english",
    +};
    +
    +// Configure a custom analyzer for VARCHAR field `title`
    +const analyzerParamsCustom = {
    +  tokenizer: "standard",
    +  filter: [
    +    "lowercase",
    +    {
    +      type: "length",
    +      max: 40,
    +    },
    +    {
    +      type: "stop",
    +      stop_words: ["of", "to"],
    +    },
    +  ],
    +};
    +
    +// Create schema
    +const schema = {
    +  auto_id: true,
    +  fields: [
    +    {
    +      name: "id",
    +      type: DataType.INT64,
    +      is_primary: true,
    +    },
    +    {
    +      name: "title_en",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsBuiltIn,
    +      enable_match: true,
    +    },
    +    {
    +      name: "title",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsCustom,
    +      enable_match: true,
    +    },
    +    {
    +      name: "embedding",
    +      data_type: DataType.FLOAT_VECTOR,
    +      dim: 4,
    +    },
    +  ],
    +};
    +
    +// Set up index params for vector field
    +const indexParams = [
    +  {
    +    name: "embedding",
    +    metric_type: "COSINE",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +// Create collection with defined schema
    +await client.createCollection({
    +  collection_name: "YOUR_COLLECTION_NAME",
    +  schema: schema,
    +  index_params: indexParams,
    +});
    +
    +console.log("Collection created successfully!");
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "title_en",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "title",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {
    +                        "tokenizer": "standard",
    +                        "filter":[
    +                            "lowercase",
    +                            {
    +                                "type":"length",
    +                                "max":40
    +                            },
    +                            {
    +                                "type":"stop",
    +                                "stop_words":["of","to"]
    +                            }
    +                        ]
    +                    }
    +                }
    +            },
    +            {
    +                "fieldName": "embedding",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim":3
    +                }
    +            }
    +        ]
    +    }'
    +    
    +export indexParams='[
    +        {
    +            "fieldName": "embedding",
    +            "metricType": "COSINE",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"YOUR_COLLECTION_NAME\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.json new file mode 100644 index 000000000..6cb2ee7a9 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n \"filter\": [\"cnalphanumonly\"]​\n}​\n","analyzer_params = {​\n \"type\": \"chinese\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\"]​\n"],"headingContent":"Chinese​","anchorList":[{"label":"Китайский","href":"Chinese​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.md new file mode 100644 index 000000000..8aa764b6a --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/chinese-analyzer.md @@ -0,0 +1,50 @@ +--- +id: chinese-analyzer.md +title: Китайский анализатор +related_key: 'chinese, analyzer' +summary: >- + Анализатор `chinese` разработан специально для работы с китайским текстом, + обеспечивая эффективную сегментацию и токенизацию. +--- +

    Китайский

    Анализатор chinese разработан специально для работы с китайским текстом, обеспечивая эффективную сегментацию и токенизацию.

    +

    Определение

    Анализатор chinese состоит из.

    +
      +
    • Токенизатор: Использует токенизатор jieba для сегментации китайского текста на лексемы, основанные на словарном запасе и контексте. Дополнительную информацию см. в разделе Jieba.

    • +
    • Фильтр: Использует фильтр cnalphanumonly для удаления лексем, содержащих некитайские символы. Дополнительные сведения см. в разделе Cnalphanumonly.

    • +
    +

    Функциональность анализатора chinese эквивалентна следующей пользовательской конфигурации анализатора.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +    "filter": ["cnalphanumonly"]​
    +}​
    +
    +

    Конфигурация .

    Чтобы применить анализатор chinese к полю, просто установите type на chinese в analyzer_params.

    +
    analyzer_params = {​
    +    "type": "chinese",​
    +}​
    +
    +
    +

    Анализатор chinese не принимает никаких дополнительных параметров.

    +
    +

    Пример вывода

    Вот как анализатор chinese обрабатывает текст.

    +

    Исходный текст.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    Ожидаемый результат.

    +
    ["Milvus", "是", "一个", "高性", "性能", "高性能", "可", "扩展", "的", "向量", "数据", "据库", "数据库"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.json new file mode 100644 index 000000000..062932c0b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stemmer\",​\n \"language\": \"english\"​\n },{​\n \"type\": \"stop\",​\n \"stop_words\": \"_english_\",​\n }​\n ]​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n \"stop_words\": [\"a\", \"an\", \"the\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"milvus\", \"vector\", \"databas\", \"built\", \"scale\"]​\n"],"headingContent":"English​","anchorList":[{"label":"Английский","href":"English​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.md new file mode 100644 index 000000000..4fa13bbec --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/english-analyzer.md @@ -0,0 +1,74 @@ +--- +id: english-analyzer.md +title: Анализатор английского языка +related_key: 'english, analyzer' +summary: >- + Анализатор `english` в Milvus предназначен для обработки английского текста, + применяя специфические для данного языка правила токенизации и фильтрации. +--- +

    Английский

    Анализатор english в Milvus предназначен для обработки английского текста, применяя специфические для данного языка правила токенизации и фильтрации.

    +

    Определение

    Анализатор english использует следующие компоненты.

    +
      +
    • Токенизатор: Использует standard tokenizer для разбиения текста на отдельные единицы слов.

    • +
    • Фильтры: Включает несколько фильтров для комплексной обработки текста.

      +
        +
      • lowercase: : Преобразовывает все лексемы в строчные буквы, что позволяет осуществлять поиск без учета регистра.

      • +
      • stemmer: : Сокращает слова до их корневой формы для поддержки более широкого соответствия (например, "running" становится "run").

      • +
      • stop_words: Удаляет распространенные английские стоп-слова, чтобы сосредоточиться на ключевых терминах в тексте.

      • +
    • +
    +

    Функциональность анализатора english эквивалентна следующей пользовательской конфигурации анализатора.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stemmer",​
    +            "language": "english"​
    +        },{​
    +            "type": "stop",​
    +            "stop_words": "_english_",​
    +        }​
    +    ]​
    +}​
    +
    +

    Конфигурация .

    Чтобы применить анализатор english к полю, просто установите type на english в analyzer_params, и включите дополнительные параметры по мере необходимости.

    +
    analyzer_params = {​
    +    "type": "english",​
    +}​
    +
    +

    Анализатор english принимает следующие необязательные параметры:

    +

    Параметр

    +

    Описание

    +

    stop_words

    +

    Массив, содержащий список стоп-слов, которые будут удалены при токенизации. По умолчанию используется _english_, встроенный набор распространенных английских стоп-слов.

    +
    +

    Пример конфигурации с пользовательскими стоп-словами.

    +
    analyzer_params = {​
    +    "type": "english",​
    +    "stop_words": ["a", "an", "the"]​
    +}​
    +
    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот как анализатор english обрабатывает текст.

    +

    Исходный текст.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Ожидаемый результат.

    +
    ["milvus", "vector", "databas", "built", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.json new file mode 100644 index 000000000..378ea3de9 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n \"stop_words\", [\"of\"] # Optional: List of words to exclude from tokenization​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"the\", \"milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"Стандартный","href":"Standard​","type":1,"isActive":false},{"label":"Определение","href":"Definition​","type":2,"isActive":false},{"label":"Конфигурация .","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.md new file mode 100644 index 000000000..f15548c0f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/analyzer/standard-analyzer.md @@ -0,0 +1,107 @@ +--- +id: standard-analyzer.md +title: Стандартный анализатор +related_key: 'standard, analyzer' +summary: >- + Анализатор `standard` - это анализатор по умолчанию в Milvus, который + автоматически применяется к текстовым полям, если анализатор не указан. Он + использует грамматическую токенизацию, что делает его эффективным для + большинства языков. +--- +

    Стандартный

    Анализатор standard - это анализатор по умолчанию в Milvus, который автоматически применяется к текстовым полям, если анализатор не указан. Он использует грамматическую токенизацию, что делает его эффективным для большинства языков.

    +

    Определение

    Анализатор standard состоит из.

    +
      +
    • Токенизатор: Использует токенизатор standard для разбиения текста на отдельные единицы слов на основе правил грамматики. Дополнительную информацию см. в разделе Стандарт.

    • +
    • Фильтр: Использует фильтр lowercase для преобразования всех лексем в нижний регистр, что позволяет осуществлять поиск без учета регистра. Для получения дополнительной информации см.lowercase filter.

    • +
    +

    Функциональность анализатора standard эквивалентна следующей пользовательской конфигурации анализатора.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    Конфигурация .

    Чтобы применить анализатор standard к полю, просто установите type на standard в analyzer_params, и включите дополнительные параметры по мере необходимости.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +}​
    +
    +

    Анализатор standard принимает следующие необязательные параметры:

    +

    Параметр

    +

    Описание

    +

    stop_words

    +

    Массив, содержащий список стоп-слов, которые будут удалены при токенизации. По умолчанию используется _english_, встроенный набор распространенных английских стоп-слов. Подробности о _english_ можно найти здесь.

    +
    +

    Пример настройки пользовательских стоп-слов.

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +    "stop_words", ["of"] # Optional: List of words to exclude from tokenization​
    +}​
    +
    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Дополнительные сведения см. в разделе Пример использования.

    +

    Пример вывода

    Вот как анализатор standard обрабатывает текст.

    +

    Исходный текст.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Ожидаемый результат.

    +
    ["the", "milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.json new file mode 100644 index 000000000..4ebb48a02 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"alphanumonly\"],​\n}​\n","\"Milvus 2.0 @ Scale! #AI #Vector_Databasé\"​\n","[\"Milvus\", \"2\", \"0\", \"Scale\", \"AI\", \"Vector\"]​\n"],"headingContent":"Alphanumonly​","anchorList":[{"label":"Только алфавитно-цифровые термины","href":"Alphanumonly​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.md new file mode 100644 index 000000000..e5c5eeab6 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/alphanumonly-filter.md @@ -0,0 +1,70 @@ +--- +id: alphanumonly-filter.md +title: Фильтр Alphanumonly +summary: >- + Фильтр `alphanumonly` удаляет токены, содержащие символы, отличные от ASCII, + оставляя только алфавитно-цифровые термины. Этот фильтр полезен для обработки + текста, в котором важны только основные буквы и цифры, исключая любые + специальные символы. +--- +

    Только алфавитно-цифровые термины

    Фильтр alphanumonly удаляет лексемы, содержащие символы, отличные от ASCII, оставляя только буквенно-цифровые термины. Этот фильтр полезен для обработки текста, в котором важны только основные буквы и цифры, исключая любые специальные символы и знаки.

    +

    Конфигурация

    Фильтр alphanumonly встроен в Milvus. Чтобы использовать его, просто укажите его имя в секции filter в разделе analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["alphanumonly"],​
    +}​
    +
    +

    Фильтр alphanumonly работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр alphanumonly обрабатывает текст.

    +

    Исходный текст.

    +
    "Milvus 2.0 @ Scale! #AI #Vector_Databasé"​
    +
    +

    Ожидаемый результат.

    +
    ["Milvus", "2", "0", "Scale", "AI", "Vector"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.json new file mode 100644 index 000000000..92663378d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"asciifolding\"],​\n}​\n","\"Café Möller serves crème brûlée and piñatas.\"​\n","[\"Cafe\", \"Moller\", \"serves\", \"creme\", \"brulee\", \"and\", \"pinatas\"]​\n"],"headingContent":"ASCII folding​","anchorList":[{"label":"Складывание ASCII","href":"ASCII-folding​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.md new file mode 100644 index 000000000..a844af89f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/ascii-folding-filter.md @@ -0,0 +1,68 @@ +--- +id: ascii-folding-filter.md +title: Складывание ASCII +summary: >- + Фильтр `asciifolding`** ** преобразует символы за пределами блока Basic Latin + Unicode (первые 127 символов ASCII) в их эквиваленты ASCII. +--- +

    Складывание ASCII

    Фильтр asciifolding** ** преобразует символы за пределами блока Basic Latin Unicode (первые 127 символов ASCII) в их эквиваленты ASCII. Например, он преобразует символы типа í в i, что делает обработку текста более простой и последовательной, особенно для многоязычного контента.

    +

    Конфигурация

    Фильтр asciifolding встроен в Milvus. Чтобы использовать его, просто укажите его имя в секции filter в разделе analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["asciifolding"],​
    +}​
    +
    +

    Фильтр asciifolding работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр asciifolding обрабатывает текст.

    +

    Исходный текст.

    +
    "Café Möller serves crème brûlée and piñatas."​
    +
    +

    Ожидаемый результат.

    +
    ["Cafe", "Moller", "serves", "creme", "brulee", "and", "pinatas"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json new file mode 100644 index 000000000..aac5c4b52 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cnalphanumonly\"],​\n}​\n\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"Milvus\", \"是\", \"LF\", \"AI\", \"Data\", \"Foundation\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"Apache\", \"2.0\", \"许可\", \"发布\"]​\n"],"headingContent":"Cnalphanumonly​","anchorList":[{"label":"Cnalphanumonly","href":"Cnalphanumonly​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md new file mode 100644 index 000000000..3b13709e2 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md @@ -0,0 +1,69 @@ +--- +id: cnalphanumonly-filter.md +title: Фильтр Cnalphanumonly +summary: >- + Фильтр `cnalphanumonly` удаляет лексемы, содержащие любые символы, кроме + китайских, английских букв или цифр. +--- +

    Cnalphanumonly

    Фильтр cnalphanumonly удаляет токены, содержащие любые символы, отличные от китайских, английских букв или цифр.

    +

    Конфигурация

    Фильтр cnalphanumonly встроен в Milvus. Чтобы использовать его, просто укажите его имя в секции filter в разделе analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cnalphanumonly"],​
    +}​
    +
    +
    +

    Фильтр cnalphanumonly работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр cnalphanumonly обрабатывает текст.

    +

    Исходный текст.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    Ожидаемый результат.

    +
    ["Milvus", "是", "LF", "AI", "Data", "Foundation", "下", "的", "一个", "开源", "项目", "以", "Apache", "2.0", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.json new file mode 100644 index 000000000..7a326681d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cncharonly\"],​\n}​\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"是\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"许可\", \"发布\"]​\n"],"headingContent":"Cncharonly​","anchorList":[{"label":"Cncharonly","href":"Cncharonly​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.md new file mode 100644 index 000000000..400c96e96 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/cncharonly-filter.md @@ -0,0 +1,68 @@ +--- +id: cncharonly-filter.md +title: Фильтр Cncharonly +summary: >- + Фильтр `cnalphanumonly` удаляет лексемы, содержащие любые символы, кроме + китайских, английских букв или цифр. +--- +

    Cncharonly

    Фильтр cncharonly удаляет токены, содержащие любые некитайские символы. Этот фильтр полезен, когда вы хотите сосредоточиться исключительно на китайском тексте, отфильтровывая любые токены, содержащие другие шрифты, цифры или символы.

    +

    Конфигурация

    Фильтр cncharonly встроен в Milvus. Чтобы использовать его, просто укажите его имя в секции filter в разделе analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cncharonly"],​
    +}​
    +
    +

    Фильтр cncharonly работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр cncharonly обрабатывает текст.

    +

    Исходный текст.

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    Ожидаемый результат.

    +
    ["是", "下", "的", "一个", "开源", "项目", "以", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.json new file mode 100644 index 000000000..217ec7572 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"decompounder\", # Specifies the filter type as decompounder​\n \"word_list\": [\"dampf\", \"schiff\", \"fahrt\", \"brot\", \"backen\", \"automat\"],​\n }],​\n}​\n","\"dampfschifffahrt brotbackautomat\"​\n","[\"dampf\", \"schiff\", \"fahrt\", \"brotbackautomat\"]​\n"],"headingContent":"Decompounder​","anchorList":[{"label":"Расщепитель","href":"Decompounder​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.md new file mode 100644 index 000000000..4840b0798 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/decompounder-filter.md @@ -0,0 +1,79 @@ +--- +id: decompounder-filter.md +title: Декомпенсаторный фильтр +summary: >- + Фильтр `decompounder` разделяет сложные слова на отдельные компоненты на + основе заданного словаря, облегчая поиск частей сложных терминов. Этот фильтр + особенно полезен для языков, в которых часто используются сложные слова, + например, для немецкого. +--- +

    Расщепитель

    Фильтр decompounder разделяет сложные слова на отдельные компоненты на основе заданного словаря, облегчая поиск частей сложных терминов. Этот фильтр особенно полезен для языков, в которых часто используются сложные слова, например, для немецкого.

    +

    Конфигурация

    Фильтр decompounder - это пользовательский фильтр в Milvus. Чтобы использовать его, укажите "type": "decompounder" в конфигурации фильтра, а также параметр word_list, который предоставляет словарь компонентов слов для распознавания.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "decompounder", # Specifies the filter type as decompounder​
    +        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],​
    +    }],​
    +}​
    +
    +

    Фильтр decompounder принимает следующие настраиваемые параметры.

    +

    Параметр

    +

    Описание

    +

    word_list

    +

    Список компонентов слов, используемых для разделения сложных терминов. Этот словарь определяет, как составные слова разлагаются на отдельные термины.

    +
    +

    Фильтр decompounder работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр decompounder обрабатывает текст.

    +

    Исходный текст.

    +
    "dampfschifffahrt brotbackautomat"​
    +
    +

    Ожидаемый результатword_list: ["dampf", "schiff", "fahrt", "brot", "backen", "automat"]).

    +
    ["dampf", "schiff", "fahrt", "brotbackautomat"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.json new file mode 100644 index 000000000..1d8b0dc58 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"length\", # Specifies the filter type as length​\n \"max\": 10, # Sets the maximum token length to 10 characters​\n }],​\n}​\n","\"The length filter allows control over token length requirements for text processing.\"​\n","[\"length\", \"filter\", \"allows\", \"control\", \"over\", \"token\", \"length\", \"for\", \"text\"]​\n"],"headingContent":"Length​","anchorList":[{"label":"Длина","href":"Length​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.md new file mode 100644 index 000000000..518089678 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/length-filter.md @@ -0,0 +1,78 @@ +--- +id: length-filter.md +title: Фильтр по длине +summary: >- + Фильтр `length` удаляет лексемы, которые не соответствуют заданным требованиям + по длине, позволяя вам контролировать длину лексем, сохраняемых при обработке + текста. +--- +

    Длина

    Фильтр length удаляет лексемы, не соответствующие заданным требованиям по длине, позволяя контролировать длину лексем, сохраняемых при обработке текста.

    +

    Конфигурация

    Фильтр length - это пользовательский фильтр в Milvus, задаваемый параметром "type": "length" в конфигурации фильтра. Вы можете настроить его как словарь внутри analyzer_params для определения ограничений длины.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "length", # Specifies the filter type as length​
    +        "max": 10, # Sets the maximum token length to 10 characters​
    +    }],​
    +}​
    +
    +

    Фильтр length принимает следующие настраиваемые параметры.

    +

    Параметр

    +

    Описание

    +

    max

    +

    Устанавливает максимальную длину токена. Токены, превышающие эту длину, удаляются.

    +
    +

    Фильтр length работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр length обрабатывает текст.

    +

    Пример текста.

    +
    "The length filter allows control over token length requirements for text processing."​
    +
    +

    Ожидаемый результатmax: 10).

    +
    ["length", "filter", "allows", "control", "over", "token", "length", "for", "text"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.json new file mode 100644 index 000000000..4e207a19f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"],​\n}​\n","\"The Lowercase Filter Ensures Uniformity In Text Processing.\"​\n","[\"the\", \"lowercase\", \"filter\", \"ensures\", \"uniformity\", \"in\", \"text\", \"processing\"]​\n"],"headingContent":"Lowercase​","anchorList":[{"label":"Нижний регистр","href":"Lowercase​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.md new file mode 100644 index 000000000..0ec3670c1 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/lowercase-filter.md @@ -0,0 +1,68 @@ +--- +id: lowercase-filter.md +title: Фильтр нижнего регистра +summary: >- + Фильтр `lowercase` преобразует термины, сгенерированные токенизатором, в + строчные буквы, делая поиск нечувствительным к регистру. +--- +

    Нижний регистр

    Фильтр lowercase преобразует термины, созданные токенизатором, в нижний регистр, делая поиск нечувствительным к регистру. Например, он может преобразовать ["High", "Performance", "Vector", "Database"] в ["high", "performance", "vector", "database"].

    +

    Конфигурация

    Фильтр lowercase встроен в Milvus. Чтобы использовать его, просто укажите его имя в секции filter в разделе analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"],​
    +}​
    +
    +

    Фильтр lowercase работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр lowercase обрабатывает текст.

    +

    Исходный текст.

    +
    "The Lowercase Filter Ensures Uniformity In Text Processing."​
    +
    +

    Ожидаемый результат.

    +
    ["the", "lowercase", "filter", "ensures", "uniformity", "in", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.json new file mode 100644 index 000000000..e50577b7d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stemmer\", # Specifies the filter type as stemmer​\n \"language\": \"english\", # Sets the language for stemming to English​\n }],​\n}​\n","\"running runs looked ran runner\"​\n","[\"run\", \"run\", \"look\", \"ran\", \"runner\"]​\n"],"headingContent":"Stemmer​","anchorList":[{"label":"Стеммер","href":"Stemmer​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.md new file mode 100644 index 000000000..83b849aa4 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stemmer-filter.md @@ -0,0 +1,78 @@ +--- +id: stemmer-filter.md +title: Фильтр Stemmer +summary: >- + Фильтр `stemmer` сокращает слова до их базовой или корневой формы (так + называемый stemming), облегчая поиск слов с одинаковыми значениями в различных + склонениях. +--- +

    Стеммер

    Фильтр stemmer сокращает слова до их базовой или корневой формы (так называемый стемминг), облегчая поиск слов со схожими значениями в различных склонениях. Фильтр stemmer поддерживает несколько языков, обеспечивая эффективный поиск и индексирование в различных языковых контекстах.

    +

    Конфигурация

    Фильтр stemmer - это пользовательский фильтр в Milvus. Чтобы использовать его, укажите "type": "stemmer" в конфигурации фильтра, а также параметр language для выбора нужного языка для стемминга.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stemmer", # Specifies the filter type as stemmer​
    +        "language": "english", # Sets the language for stemming to English​
    +    }],​
    +}​
    +
    +

    Фильтр stemmer принимает следующие настраиваемые параметры.

    +

    Параметр

    +

    Описание

    +

    language

    +

    Указывает язык для процесса стемминга. Поддерживаются следующие языки: "arabic", "danish", "dutch", "english", "finnish", "french", "german", "greek", "hungarian", "italian", "norwegian", "portuguese", "romanian", "russian", "spanish", "swedish", "tamil", "turkish".

    +
    +

    Фильтр stemmer работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр stemmer обрабатывает текст.

    +

    Исходный текст.

    +
    "running runs looked ran runner"​
    +
    +

    Ожидаемый результатlanguage: "english").

    +
    ["run", "run", "look", "ran", "runner"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.json new file mode 100644 index 000000000..da76277e0 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stop\", # Specifies the filter type as stop​\n \"stop_words\": [\"of\", \"to\", \"_english_\"], # Defines custom stop words and includes the English stop word list​\n }],​\n}​\n","\"The stop filter allows control over common stop words for text processing.\"​\n","[\"The\", \"stop\", \"filter\", \"allows\", \"control\", \"common\", \"stop\", \"words\", \"text\", \"processing\"]​\n"],"headingContent":"Stop​","anchorList":[{"label":"Остановка","href":"Stop​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.md new file mode 100644 index 000000000..f1c98fe65 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/filter/stop-filter.md @@ -0,0 +1,78 @@ +--- +id: stop-filter.md +title: Стоп-фильтр +summary: >- + Фильтр `stop` удаляет указанные стоп-слова из токенизированного текста, + помогая устранить обычные, менее значимые слова. Вы можете настроить список + стоп-слов с помощью параметра `stop_words`. +--- +

    Остановка

    Фильтр stop удаляет заданные стоп-слова из токенизированного текста, помогая устранить распространенные и менее значимые слова. Список стоп-слов можно настроить с помощью параметра stop_words.

    +

    Конфигурация

    Фильтр length - это пользовательский фильтр в Milvus. Чтобы использовать его, укажите "type": "stop" в конфигурации фильтра, а также параметр stop_words, который предоставляет список стоп-слов.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stop", # Specifies the filter type as stop​
    +        "stop_words": ["of", "to", "_english_"], # Defines custom stop words and includes the English stop word list​
    +    }],​
    +}​
    +
    +

    Фильтр stop принимает следующие настраиваемые параметры.

    +

    Параметр

    +

    Описание

    +

    stop_words

    +

    Список слов, которые должны быть удалены при токенизации. По умолчанию используется предопределенный список _english_, содержащий распространенные английские стоп-слова. Подробности о _english_ можно найти здесь.

    +
    +

    Фильтр stop работает с терминами, сгенерированными токенизатором, поэтому он должен использоваться в сочетании с токенизатором.

    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как фильтр stop обрабатывает текст.

    +

    Исходный текст.

    +
    "The stop filter allows control over common stop words for text processing."​
    +
    +

    Ожидаемый результатstop_words: ["the", "over", "_english_"]).

    +
    ["The", "stop", "filter", "allows", "control", "common", "stop", "words", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json new file mode 100644 index 000000000..86babcbc6 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \" \", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"、\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\", \"!\"]​\n"],"headingContent":"Jieba​","anchorList":[{"label":"Jieba","href":"Jieba​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md new file mode 100644 index 000000000..3fbf44c79 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md @@ -0,0 +1,66 @@ +--- +id: jieba-tokenizer.md +title: Токенизатор Jieba +summary: >- + Токенизатор `jieba` обрабатывает китайский текст, разбивая его на составляющие + слова. +--- +

    Jieba

    Токенизатор jieba обрабатывает китайский текст, разбивая его на составляющие слова.

    +

    Конфигурация

    Чтобы сконфигурировать анализатор, использующий токенизатор jieba, установите tokenizer на jieba в analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +}​
    +
    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как токенизатор jieba обрабатывает текст.

    +

    Исходный текст.

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    Ожидаемый результат.

    +
    ["Milvus", " ", "是", "一个", "高性", "性能", "高性能", "、", "可", "扩展", "的", "向量", "数据", "据库", "数据库", "!"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json new file mode 100644 index 000000000..af7c2268f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n}​\n\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"Стандартный","href":"Standard​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md new file mode 100644 index 000000000..fe9315631 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md @@ -0,0 +1,77 @@ +--- +id: standard-tokenizer.md +title: Стандартный токенизатор +summary: >- + Стандартный токенизатор Milvus разделяет текст на основе пробелов и знаков + препинания, что делает его подходящим для большинства языков. +--- +

    Стандартный

    Токенизатор standard в Milvus разделяет текст на основе пробелов и знаков препинания, что делает его подходящим для большинства языков.

    +

    Конфигурация

    Чтобы настроить анализатор на использование токенизатора standard, установите tokenizer на standard в analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +}​
    +
    +
    +

    Токенизатор standard может работать в сочетании с одним или несколькими фильтрами. Например, следующий код определяет анализатор, использующий токенизатор standard и фильтр lowercase.

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +
    +
    +

    Для упрощения настройки вы можете использовать фильтр standard analyzer, который объединяет токенизатор standard с фильтром lowercase filter.

    +
    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как токенизатор standard обрабатывает текст.

    +

    Исходный текст.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Ожидаемый результат.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json new file mode 100644 index 000000000..7b88d7301 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n \"filter\": [\"lowercase\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale!\"]​\n"],"headingContent":"Whitespace​","anchorList":[{"label":"Пробел","href":"Whitespace​","type":1,"isActive":false},{"label":"Конфигурация","href":"Configuration​","type":2,"isActive":false},{"label":"Пример вывода","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md new file mode 100644 index 000000000..c5e7fcbc9 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md @@ -0,0 +1,72 @@ +--- +id: whitespace-tokenizer.md +title: Токенизатор пробелов +summary: >- + Токенизатор `whitespace` делит текст на термины, когда между словами есть + пробел. +--- +

    Пробел

    Токенизатор whitespace разделяет текст на термины, когда между словами есть пробел.

    +

    Конфигурация

    Чтобы сконфигурировать анализатор, использующий токенизатор whitespace, установите tokenizer на whitespace в analyzer_params.

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +

    Токенизатор пробельных символов может работать в сочетании с одним или несколькими фильтрами. Например, следующий код определяет анализатор, использующий токенизатор whitespace и lowercase filter:

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    Определив analyzer_params, вы можете применить их к полю VARCHAR при определении схемы коллекции. Это позволит Milvus обрабатывать текст в этом поле с помощью указанного анализатора для эффективной токенизации и фильтрации. Подробнее см. в разделе Пример использования.

    +

    Пример вывода

    Вот пример того, как токенизатор whitespace обрабатывает текст.

    +

    Исходный текст.

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    Ожидаемый результат.

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale!"]​
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.json b/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.json new file mode 100644 index 000000000..3eece9fdc --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3]​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\n# Add an Array field with elements of type VARCHAR​\nschema.add_field(field_name=\"tags\", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​\n# Add an Array field with elements of type INT64​\nschema.add_field(field_name=\"ratings\", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​\n​\n# Add primary field​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"tags\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(10)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"ratings\")​\n .dataType(DataType.Array)​\n .elementType(DataType.Int64)​\n .maxCapacity(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"tags\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 10,​\n max_length: 65535​\n },​\n {​\n name: \"rating\",​\n data_type: DataType.Array,​\n element_type: DataType.Int64,​\n max_capacity: 5,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export arrayField1='{​\n \"fieldName\": \"tags\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 10,​\n \"max_length\": 100​\n }​\n}'​\n​\nexport arrayField2='{​\n \"fieldName\": \"ratings\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"Int64\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 5​\n }​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $arrayField1,​\n $arrayField2,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","# Prepare index parameters​\nindex_params = client.prepare_index_params() # Prepare IndexParams object​\n​\nindex_params.add_index(​\n field_name=\"tags\", # Name of the Array field to index​\n index_type=\"AUTOINDEX\", # Index type​\n index_name=\"inverted_index\" # Index name​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"tags\")​\n .indexName(\"inverted_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'inverted_index',​\n field_name: 'tags',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, such as L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n"," indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_array_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_array_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_array_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_array_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n]​\n​\nclient.insert(​\n collection_name=\"my_array_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"pop\\\", \\\"rock\\\", \\\"classic\\\"], \\\"ratings\\\": [5, 4, 3], \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"jazz\\\", \\\"blues\\\"], \\\"ratings\\\": [4, 5], \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"electronic\\\", \\\"dance\\\"], \\\"ratings\\\": [3, 3, 4], \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_array_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n];​\n​\nclient.insert({​\n collection_name: \"my_array_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n } ​\n ],​\n \"collectionName\": \"my_array_collection\"​\n}'​\n\n","filter = 'ratings[0] < 4'​\n​\nres = client.query(​\n collection_name=\"my_array_collection\",​\n filter=filter,​\n output_fields=[\"tags\", \"ratings\", \"embedding\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"ratings[0] < 4\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_array_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​\n\n","client.query({​\n collection_name: 'my_array_collection',​\n filter: 'ratings[0] < 4',​\n output_fields: ['tags', 'ratings', 'embedding']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"filter\": \"ratings[0] < 4\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"embedding\":[0.67,0.45,0.89],\"pk\":3,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[3,3,4]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"electronic\",\"dance\"]}}}}]}​\n\n","filter = 'tags[0] == \"pop\"'​\n​\nres = client.search(​\n collection_name=\"my_array_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"tags\", \"ratings\", \"embedding\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"tags[0] == \\\"pop\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_array_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_array_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['tags', 'ratings', 'embdding'],​\n filter: 'tags[0] == \"pop\"'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"filter\": \"tags[0] == \\\"pop\\\"\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"embedding\":[0.12,0.34,0.56],\"id\":1,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[5,4,3]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"pop\",\"rock\",\"classic\"]}}}}]}​\n\n"],"headingContent":"Array Field​","anchorList":[{"label":"Поле массива","href":"Array-Field​","type":1,"isActive":false},{"label":"Добавление поля Array","href":"Add-Array-field​","type":2,"isActive":false},{"label":"Установка индексных параметров","href":"Set-index-params​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-collection​","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data​","type":2,"isActive":false},{"label":"Поиск и запрос","href":"Search-and-query​","type":2,"isActive":false},{"label":"Лимиты","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.md b/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.md new file mode 100644 index 000000000..06ff00cf6 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/array_data_type.md @@ -0,0 +1,631 @@ +--- +id: array_data_type.md +title: Поле массива +summary: >- + Тип Array используется для хранения полей, содержащих несколько значений + одного типа данных. Он обеспечивает гибкий способ хранения атрибутов с + несколькими элементами, что делает его особенно полезным в сценариях, где + необходимо сохранить набор связанных данных. В Milvus вы можете хранить поля + Array наряду с векторными данными, что позволяет выполнять более сложные + запросы и фильтрацию. +--- +

    Поле массива

    Тип Array используется для хранения полей, содержащих несколько значений одного типа данных. Он обеспечивает гибкий способ хранения атрибутов с несколькими элементами, что делает его особенно полезным в сценариях, где необходимо сохранить набор связанных данных. В Milvus можно хранить поля Array наряду с векторными данными, что позволяет выполнять более сложные запросы и фильтрацию.

    +

    Например, в музыкальной рекомендательной системе поле Array может хранить список тегов для песни; при анализе поведения пользователей оно может хранить пользовательские рейтинги песен. Ниже приведен пример типичного поля Array.

    +
    {​
    +  "tags": ["pop", "rock", "classic"],​
    +  "ratings": [5, 4, 3]​
    +}​
    +
    +
    +

    В этом примере поля tags и ratings являются полями Array. Поле tags - это строковый массив, представляющий жанры песен, такие как поп, рок и классика, а поле ratings - это целочисленный массив, представляющий пользовательские оценки песни в диапазоне от 1 до 5. Эти поля Array обеспечивают гибкий способ хранения многозначных данных, что облегчает проведение детального анализа при запросах и фильтрации.

    +

    Добавление поля Array

    Чтобы использовать поля Array в Milvus, определите соответствующий тип поля при создании схемы коллекции. Этот процесс включает в себя.

    +
      +
    1. Установка datatype на поддерживаемый тип данных Array, ARRAY.

    2. +
    3. Использование параметра element_type для указания типа данных элементов массива. Это может быть любой скалярный тип данных, поддерживаемый Milvus, например VARCHAR или INT64. Все элементы в одном массиве должны иметь одинаковый тип данных.

    4. +
    5. Использование параметра max_capacity для определения максимальной емкости массива, т. е. максимального количества элементов, которые он может содержать.

    6. +
    +

    Вот как определить схему коллекции, включающую поля Array.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +# Add an Array field with elements of type VARCHAR​
    +schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​
    +# Add an Array field with elements of type INT64​
    +schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​
    +​
    +# Add primary field​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("tags")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(10)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("ratings")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.Int64)​
    +        .maxCapacity(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "tags",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 10,​
    +    max_length: 65535​
    +  },​
    +  {​
    +    name: "rating",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.Int64,​
    +    max_capacity: 5,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export arrayField1='{​
    +    "fieldName": "tags",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_capacity": 10,​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export arrayField2='{​
    +    "fieldName": "ratings",​
    +    "dataType": "Array",​
    +    "elementDataType": "Int64",​
    +    "elementTypeParams": {​
    +        "max_capacity": 5​
    +    }​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $arrayField1,​
    +        $arrayField2,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    В этом примере.

    +
      +
    • tags это строковый массив, для которого element_type установлено значение VARCHAR, указывающее, что элементы массива должны быть строками. max_capacity установлено значение 10, что означает, что массив может содержать до 10 элементов.

    • +
    • ratings это целочисленный массив с element_type, установленным в INT64, указывающим, что элементы должны быть целыми числами. max_capacity установлено в 5, что позволяет содержать до 5 оценок.

    • +
    • Мы также добавляем поле первичного ключа pk и векторное поле embedding.

    • +
    +
    +

    Первичное поле и векторное поле являются обязательными при создании коллекции. Первичное поле уникально идентифицирует каждую сущность, а векторное поле имеет решающее значение для поиска сходства. Дополнительные сведения см. в разделах Первичное поле и автоидентификатор, Плотный вектор, Двоичный вектор или Разреженный вектор.

    +
    +

    Установка индексных параметров

    Установка параметров индекса для полей массива необязательна, но может значительно повысить эффективность поиска.

    +

    В следующем примере мы создаем AUTOINDEX для поля tags, что означает, что Milvus автоматически создаст соответствующий скалярный индекс на основе типа данных.

    + +
    # Prepare index parameters​
    +index_params = client.prepare_index_params()  # Prepare IndexParams object​
    +​
    +index_params.add_index(​
    +    field_name="tags",  # Name of the Array field to index​
    +    index_type="AUTOINDEX",  # Index type​
    +    index_name="inverted_index"  # Index name​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("tags")​
    +        .indexName("inverted_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'inverted_index',​
    +    field_name: 'tags',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    В дополнение к AUTOINDEX вы можете указать другие типы скалярных индексов, например INVERTED или BITMAP. Поддерживаемые типы индексов см. в разделе Скалярные индексы.

    +

    Более того, вы должны создать индекс для векторного поля перед созданием коллекции. В этом примере мы используем AUTOINDEX, чтобы упростить настройку векторного индекса.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, such as L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
     indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Создание коллекции

    Используйте заданную схему и параметры индекса для создания коллекции.

    + +
    client.create_collection(​
    +    collection_name="my_array_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_array_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_array_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции вы можете вставить данные, включающие поля Array.

    + +
    data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_array_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"tags\": [\"pop\", \"rock\", \"classic\"], \"ratings\": [5, 4, 3], \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"jazz\", \"blues\"], \"ratings\": [4, 5], \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"electronic\", \"dance\"], \"ratings\": [3, 3, 4], \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_array_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }       ​
    +    ],​
    +    "collectionName": "my_array_collection"​
    +}'​
    +
    +
    +

    В этом примере.

    +
      +
    • Каждая запись данных включает первичное поле (pk), а tags и ratings - поля Array, используемые для хранения тегов и оценок.

    • +
    • embedding это 3-мерное векторное поле, используемое для поиска векторного сходства.

    • +
    +

    Поиск и запрос

    Поля массивов позволяют использовать скалярную фильтрацию при поиске, расширяя возможности векторного поиска Milvus. Наряду с поиском по векторному сходству можно выполнять запросы на основе свойств полей массива.

    +

    Фильтр запросов

    Вы можете фильтровать данные на основе свойств полей массива, например, получить доступ к определенному элементу или проверить, удовлетворяет ли элемент массива определенному условию.

    + +
    filter = 'ratings[0] < 4'​
    +​
    +res = client.query(​
    +    collection_name="my_array_collection",​
    +    filter=filter,​
    +    output_fields=["tags", "ratings", "embedding"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "ratings[0] < 4";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_array_collection',​
    +    filter: 'ratings[0] < 4',​
    +    output_fields: ['tags', 'ratings', 'embedding']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "filter": "ratings[0] < 4",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"embedding":[0.67,0.45,0.89],"pk":3,"ratings":{"Data":{"LongData":{"data":[3,3,4]}}},"tags":{"Data":{"StringData":{"data":["electronic","dance"]}}}}]}​
    +
    +
    +

    В этом запросе Milvus отфильтровывает сущности, у которых первый элемент массива ratings меньше 4, возвращая сущности, соответствующие условию.

    +

    Векторный поиск с фильтрацией по массиву

    Комбинируя векторное сходство с фильтрацией массивов, вы можете убедиться, что найденные данные не только схожи по семантике, но и соответствуют определенным условиям, что делает результаты поиска более точными и соответствующими потребностям бизнеса.

    + +
    filter = 'tags[0] == "pop"'​
    +​
    +res = client.search(​
    +    collection_name="my_array_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["tags", "ratings", "embedding"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "tags[0] == \"pop\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_array_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['tags', 'ratings', 'embdding'],​
    +    filter: 'tags[0] == "pop"'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "filter": "tags[0] == \"pop\"",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"distance":-0.24793813,"embedding":[0.12,0.34,0.56],"id":1,"ratings":{"Data":{"LongData":{"data":[5,4,3]}}},"tags":{"Data":{"StringData":{"data":["pop","rock","classic"]}}}}]}​
    +
    +
    +

    В этом примере Milvus возвращает 5 сущностей, наиболее похожих на вектор запроса, причем первым элементом массива tags является "pop".

    +

    Кроме того, Milvus поддерживает расширенные операторы фильтрации массивов, такие как ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY и ARRAY_LENGTH, для дальнейшего расширения возможностей запроса. Более подробную информацию см. в разделе Фильтрация метаданных.

    +

    Лимиты

      +
    • Тип данных: Все элементы в поле массива должны иметь одинаковый тип данных, как указано на сайте element_type.

    • +
    • Емкость массива: Количество элементов в поле массива должно быть меньше или равно максимальной емкости, определенной при создании массива, как указано на max_capacity.

    • +
    • Работа со строками: Строковые значения в полях массива хранятся как есть, без семантического экранирования или преобразования. Например, 'a"b', "a'b", 'a\'b' и "a\"b" хранятся как введенные, а 'a'b' и "a"b" считаются недопустимыми значениями.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.json b/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.json new file mode 100644 index 000000000..4b496a1fc --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=128)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"binary_vector\")​\n .dataType(DataType.BinaryVector)​\n .dimension(128)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"binary vector\",​\n data_type: DataType.BinaryVector,​\n dim: 128,​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"binary_vector\",​\n \"dataType\": \"BinaryVector\",​\n \"elementTypeParams\": {​\n \"dim\": 128​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ],​\n \\\"enableDynamicField\\\": true​\n}\"​\n​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"binary_vector\",​\n index_name=\"binary_vector_index\",​\n index_type=\"BIN_IVF_FLAT\",​\n metric_type=\"HAMMING\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexParams = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexParams.add(IndexParam.builder()​\n .fieldName(\"binary_vector\")​\n .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​\n .metricType(IndexParam.MetricType.HAMMING)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n indexName: \"binary_vector_index\",​\n field_name: \"binary_vector\",​\n metric_type: MetricType.HAMMING,​\n index_type: IndexType.BIN_IVF_FLAT,​\n params: {​\n nlist: 128,​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"binary_vector\",​\n \"metricType\": \"HAMMING\",​\n \"indexName\": \"binary_vector_index\",​\n \"indexType\": \"BIN_IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_binary_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","def convert_bool_list_to_bytes(bool_list):​\n if len(bool_list) % 8 != 0:​\n raise ValueError(\"The length of a boolean list must be a multiple of 8\")​\n​\n byte_array = bytearray(len(bool_list) // 8)​\n for i, bit in enumerate(bool_list):​\n if bit == 1:​\n index = i // 8​\n shift = i % 8​\n byte_array[index] |= (1 << shift)​\n return bytes(byte_array)​\n​\n​\nbool_vectors = [​\n [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​\n [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​\n]​\n​\ndata = [{\"binary_vector\": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​\n​\nclient.insert(​\n collection_name=\"my_binary_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nprivate static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​\n byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​\n for (int i = 0; i < booleanArray.length; i++) {​\n if (booleanArray[i]) {​\n int index = i / Byte.SIZE;​\n int shift = i % Byte.SIZE;​\n byteArray[index] |= (byte) (1 << shift);​\n }​\n }​\n​\n return byteArray;​\n}​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n{​\n boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_binary_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"data\\\": $data,​\n \\\"collectionName\\\": \\\"my_binary_collection\\\"​\n}\"​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​\nquery_vector = convert_bool_list_to_bytes(query_bool_list)​\n​\nres = client.search(​\n collection_name=\"my_binary_collection\",​\n data=[query_vector],​\n anns_field=\"binary_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.BinaryVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nboolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\nBinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"binary_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\n System.out.println(searchR.getSearchResults());​\n ​\n // Output​\n //​\n // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​\n\n","query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​\n​\nclient.search({​\n collection_name: 'my_binary_collection',​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","export searchParams='{​\n \"params\":{\"nprobe\":10}​\n }'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"data\\\": $data,​\n \\\"annsField\\\": \\\"binary_vector\\\",​\n \\\"limit\\\": 5,​\n \\\"searchParams\\\":$searchParams,​\n \\\"outputFields\\\": [\\\"pk\\\"]​\n}\"​\n\n"],"headingContent":"Binary Vector​","anchorList":[{"label":"Двоичный вектор","href":"Binary-Vector​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование бинарных векторов в Milvus","href":"Use-binary-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.md b/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.md new file mode 100644 index 000000000..6631a4512 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/binary-vector.md @@ -0,0 +1,445 @@ +--- +id: binary-vector.md +title: Двоичный вектор +summary: >- + Двоичные векторы - это особая форма представления данных, которая преобразует + традиционные высокоразмерные векторы с плавающей точкой в двоичные векторы, + содержащие только 0 и 1. Это преобразование не только уменьшает размер + вектора, но и снижает затраты на хранение и вычисления, сохраняя при этом + семантическую информацию. Когда точность для некритичных характеристик не + важна, двоичные векторы могут эффективно сохранить большую часть целостности и + полезности исходных векторов с плавающей точкой. +--- +

    Двоичный вектор

    Двоичные векторы - это особая форма представления данных, которая преобразует традиционные высокоразмерные векторы с плавающей точкой в двоичные векторы, содержащие только 0 и 1. Это преобразование не только уменьшает размер вектора, но и снижает затраты на хранение и вычисления, сохраняя при этом семантическую информацию. Когда точность для некритичных характеристик не важна, двоичные векторы могут эффективно сохранять большую часть целостности и полезности исходных векторов с плавающей точкой.

    +

    Двоичные векторы имеют широкий спектр применения, особенно в ситуациях, когда эффективность вычислений и оптимизация хранения данных имеют решающее значение. В крупномасштабных системах искусственного интеллекта, таких как поисковые или рекомендательные системы, обработка огромных объемов данных в реальном времени является ключевой задачей. Уменьшая размер векторов, двоичные векторы помогают снизить время ожидания и вычислительные затраты без существенного ущерба для точности. Кроме того, двоичные векторы полезны в средах с ограниченными ресурсами, таких как мобильные устройства и встроенные системы, где память и вычислительная мощность ограничены. Благодаря использованию двоичных векторов сложные функции искусственного интеллекта могут быть реализованы в таких ограниченных условиях при сохранении высокой производительности.

    +

    Обзор

    Двоичные векторы - это метод кодирования сложных объектов (таких как изображения, текст или аудио) в двоичные значения фиксированной длины. В Milvus двоичные векторы обычно представляются в виде массивов битов или массивов байтов. Например, 8-мерный двоичный вектор может быть представлен как [1, 0, 1, 1, 0, 0, 1, 0].

    +

    На диаграмме ниже показано, как двоичные векторы представляют наличие ключевых слов в текстовом контенте. В этом примере для представления двух различных текстов(Текст 1 и Текст 2) используется 10-мерный двоичный вектор, где каждое измерение соответствует одному слову из словаря: 1 означает присутствие слова в тексте, а 0 - его отсутствие.

    +

    + + Binary vector representation of text content + Бинарное векторное представление содержимого текста

    +

    Двоичные векторы обладают следующими характеристиками.

    +
      +
    • Эффективное хранение: Каждое измерение требует всего 1 бит памяти, что значительно сокращает пространство для хранения.

    • +
    • Быстрое вычисление: Сходство между векторами может быть быстро вычислено с помощью побитовых операций, таких как XOR.

    • +
    • Фиксированная длина: Длина вектора остается неизменной независимо от длины исходного текста, что упрощает индексирование и поиск.

    • +
    • Простота и интуитивность: Непосредственно отражает наличие ключевых слов, что делает его подходящим для некоторых специализированных поисковых задач.

    • +
    +

    Бинарные векторы могут быть сгенерированы различными методами. При обработке текстов можно использовать предопределенные словари для установки соответствующих битов на основе наличия слов. При обработке изображений алгоритмы перцептивного хэширования (например, pHash) могут генерировать двоичные характеристики изображений. В приложениях машинного обучения выходные данные моделей могут быть бинаризованы для получения двоичных векторных представлений.

    +

    После бинарной векторизации данные могут быть сохранены в Milvus для управления и поиска векторов. На схеме ниже показан основной процесс.

    +

    + + Use binary vectors in Milvus + Использование бинарных векторов в Milvus

    +
    +

    Хотя двоичные векторы отлично подходят для определенных сценариев, их выразительные возможности ограничены, что затрудняет передачу сложных семантических отношений. Поэтому в реальных сценариях бинарные векторы часто используются вместе с другими типами векторов, чтобы сбалансировать эффективность и выразительность. Дополнительную информацию см. в разделах "Плотный вектор" и "Разреженный вектор".

    +
    +

    Использование бинарных векторов в Milvus

    Добавить векторное поле

    Чтобы использовать двоичные векторы в Milvus, сначала определите векторное поле для хранения двоичных векторов при создании коллекции. Этот процесс включает в себя.

    +
      +
    1. Установка datatype в поддерживаемый тип данных двоичного вектора, т. е. BINARY_VECTOR.

    2. +
    3. Указание размеров вектора с помощью параметра dim. Обратите внимание, что dim должен быть кратен 8, так как при вставке двоичные векторы должны быть преобразованы в массив байтов. Каждые 8 булевых значений (0 или 1) будут упакованы в 1 байт. Например, если dim=128, то для вставки потребуется 16-байтовый массив.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("binary_vector")​
    +        .dataType(DataType.BinaryVector)​
    +        .dimension(128)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "binary vector",​
    +  data_type: DataType.BinaryVector,​
    +  dim: 128,​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "binary_vector",​
    +    "dataType": "BinaryVector",​
    +    "elementTypeParams": {​
    +        "dim": 128​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ],​
    +    \"enableDynamicField\": true​
    +}"​
    +​
    +
    +
    +

    В этом примере добавлено векторное поле с именем binary_vector для хранения двоичных векторов. Тип данных этого поля - BINARY_VECTOR, размерность - 128.

    +

    Установка параметров индекса для векторного поля

    Для ускорения поиска необходимо создать индекс для двоичного векторного поля. Индексирование может значительно повысить эффективность поиска в больших векторных данных.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="binary_vector",​
    +    index_name="binary_vector_index",​
    +    index_type="BIN_IVF_FLAT",​
    +    metric_type="HAMMING",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexParams.add(IndexParam.builder()​
    +        .fieldName("binary_vector")​
    +        .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.HAMMING)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +  indexName: "binary_vector_index",​
    +  field_name: "binary_vector",​
    +  metric_type: MetricType.HAMMING,​
    +  index_type: IndexType.BIN_IVF_FLAT,​
    +  params: {​
    +    nlist: 128,​
    +  },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "binary_vector",​
    +            "metricType": "HAMMING",​
    +            "indexName": "binary_vector_index",​
    +            "indexType": "BIN_IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    В приведенном выше примере для поля binary_vector создается индекс с именем binary_vector_index, использующий тип индекса BIN_IVF_FLAT. Значение metric_type установлено в HAMMING, что указывает на использование расстояния Хэмминга для измерения сходства.

    +

    Кроме BIN_IVF_FLAT, Milvus поддерживает и другие типы индексов для двоичных векторов. Для получения более подробной информации обратитесь к разделу Индексы двоичных векторов. Кроме того, Milvus поддерживает другие метрики сходства для бинарных векторов. Более подробную информацию можно найти в разделе Типы метрик.

    +

    Создание коллекции

    После того как настройки бинарных векторов и индексов завершены, создайте коллекцию, содержащую бинарные векторы. В примере ниже используется метод create_collection для создания коллекции с именем my_binary_collection.

    + +
    client.create_collection(​
    +    collection_name="my_binary_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции используйте метод insert для добавления данных, содержащих двоичные векторы. Обратите внимание, что двоичные векторы должны быть предоставлены в виде байтового массива, где каждый байт представляет собой 8 булевых значений.

    +

    Например, для 128-мерного двоичного вектора требуется 16-байтовый массив (так как 128 бит ÷ 8 бит/байт = 16 байт). Ниже приведен пример кода для вставки данных.

    + +
    def convert_bool_list_to_bytes(bool_list):​
    +    if len(bool_list) % 8 != 0:​
    +        raise ValueError("The length of a boolean list must be a multiple of 8")​
    +​
    +    byte_array = bytearray(len(bool_list) // 8)​
    +    for i, bit in enumerate(bool_list):​
    +        if bit == 1:​
    +            index = i // 8​
    +            shift = i % 8​
    +            byte_array[index] |= (1 << shift)​
    +    return bytes(byte_array)​
    +​
    +​
    +bool_vectors = [​
    +    [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​
    +    [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​
    +]​
    +​
    +data = [{"binary_vector": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​
    +​
    +client.insert(​
    +    collection_name="my_binary_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +private static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​
    +    byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​
    +    for (int i = 0; i < booleanArray.length; i++) {​
    +        if (booleanArray[i]) {​
    +            int index = i / Byte.SIZE;​
    +            int shift = i % Byte.SIZE;​
    +            byteArray[index] |= (byte) (1 << shift);​
    +        }​
    +    }​
    +​
    +    return byteArray;​
    +}​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +{​
    +    boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_binary_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"data\": $data,​
    +    \"collectionName\": \"my_binary_collection\"​
    +}"​
    +
    +
    +

    Выполнение поиска по сходству

    Поиск по сходству - одна из основных функций Milvus, позволяющая быстро находить данные, наиболее похожие на вектор запроса, на основе расстояния между векторами. Чтобы выполнить поиск по сходству с использованием бинарных векторов, подготовьте вектор запроса и параметры поиска, а затем вызовите метод search.

    +

    В процессе поиска бинарные векторы также должны быть предоставлены в виде массива байтов. Убедитесь, что размерность вектора запроса соответствует размерности, указанной при определении dim, и что каждые 8 булевых значений преобразуются в 1 байт.

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​
    +query_vector = convert_bool_list_to_bytes(query_bool_list)​
    +​
    +res = client.search(​
    +    collection_name="my_binary_collection",​
    +    data=[query_vector],​
    +    anns_field="binary_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.BinaryVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +BinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("binary_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    + System.out.println(searchR.getSearchResults());​
    + ​
    + // Output​
    + //​
    + // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​
    +
    +
    +
    query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​
    +​
    +client.search({​
    +    collection_name: 'my_binary_collection',​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    export searchParams='{​
    +        "params":{"nprobe":10}​
    +    }'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"data\": $data,​
    +    \"annsField\": \"binary_vector\",​
    +    \"limit\": 5,​
    +    \"searchParams\":$searchParams,​
    +    \"outputFields\": [\"pk\"]​
    +}"​
    +
    +
    +

    Дополнительные сведения о параметрах поиска сходства см. в разделе Базовый поиск ANN.

    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.json b/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.json new file mode 100644 index 000000000..99b39939f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.json @@ -0,0 +1 @@ +{"codeList":["[​\n -0.013052909,​\n 0.020387933,​\n -0.007869,​\n -0.11111383,​\n -0.030188112,​\n -0.0053388323,​\n 0.0010654867,​\n 0.072027855,​\n // ... more dimensions​\n]​\n​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=4)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(4)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"dense_vector\",​\n data_type: DataType.FloatVector,​\n dim: 128,​\n});​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"dense_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 4​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"dense_vector\",​\n index_name=\"dense_vector_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"dense_vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n index_name: 'dense_vector_index',​\n field_name: 'dense_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.IVF_FLAT,​\n params: {​\n nlist: 128​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_vector_index\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_dense_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_dense_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.7]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.8]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_dense_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.1, 0.2, 0.3, 0.4]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.2, 0.3, 0.4, 0.5]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { dense_vector: [0.1, 0.2, 0.3, 0.7] },​\n { dense_vector: [0.2, 0.3, 0.4, 0.8] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_dense_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.4]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.5]} ​\n ],​\n \"collectionName\": \"my_dense_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572531\",\"453577185629572532\"]}}​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_vector = [0.1, 0.2, 0.3, 0.7]​\n​\nres = client.search(​\n collection_name=\"my_dense_collection\",​\n data=[query_vector],​\n anns_field=\"dense_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"dense_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​\n\n","query_vector = [0.1, 0.2, 0.3, 0.7];​\n​\nclient.search({​\n collection_name: my_dense_collection,​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dense_collection\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.7]​\n ],​\n \"annsField\": \"dense_vector\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.55,\"id\":\"453577185629572532\",\"pk\":\"453577185629572532\"},{\"distance\":0.42,\"id\":\"453577185629572531\",\"pk\":\"453577185629572531\"}]}​\n\n"],"headingContent":"Dense Vector​","anchorList":[{"label":"Плотный вектор","href":"Dense-Vector​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование плотных векторов в Milvus","href":"Use-dense-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.md b/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.md new file mode 100644 index 000000000..28a0003d1 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/dense-vector.md @@ -0,0 +1,434 @@ +--- +id: dense-vector.md +title: Плотный вектор +summary: >- + Плотные векторы - это числовые представления данных, широко используемые в + машинном обучении и анализе данных. Они состоят из массивов вещественных + чисел, в которых большинство или все элементы ненулевые. По сравнению с + разреженными векторами, плотные векторы содержат больше информации на одном и + том же уровне размерности, поскольку каждое измерение содержит значимые + значения. Такое представление может эффективно отражать сложные закономерности + и взаимосвязи, облегчая анализ и обработку данных в высокоразмерных + пространствах. Плотные векторы обычно имеют фиксированное число измерений, от + нескольких десятков до нескольких сотен или даже тысяч, в зависимости от + конкретного приложения и требований. +--- +

    Плотный вектор

    Плотные векторы - это числовые представления данных, широко используемые в машинном обучении и анализе данных. Они состоят из массивов вещественных чисел, в которых большинство или все элементы ненулевые. По сравнению с разреженными векторами, плотные векторы содержат больше информации на одном и том же уровне размерности, поскольку каждое измерение содержит значимые значения. Такое представление может эффективно отражать сложные закономерности и взаимосвязи, облегчая анализ и обработку данных в высокоразмерных пространствах. Плотные векторы обычно имеют фиксированное число измерений, от нескольких десятков до нескольких сотен или даже тысяч, в зависимости от конкретного применения и требований.

    +

    Плотные векторы в основном используются в сценариях, требующих понимания семантики данных, таких как семантический поиск и рекомендательные системы. В семантическом поиске плотные векторы помогают уловить глубинные связи между запросами и документами, повышая релевантность результатов поиска. В рекомендательных системах они помогают выявить сходство между пользователями и предметами, предлагая более персонализированные предложения.

    +

    Обзор

    Плотные векторы обычно представляются в виде массивов чисел с плавающей точкой фиксированной длины, например [0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5]. Размерность таких векторов обычно варьируется от сотен до тысяч, например 128, 256, 768 или 1024. Каждая размерность отражает специфические семантические особенности объекта, что позволяет использовать его в различных сценариях путем вычисления сходства.

    +

    + + Dense vectors in 2D space + Плотные векторы в двумерном пространстве

    +

    На рисунке выше показано представление плотных векторов в двумерном пространстве. Хотя плотные векторы в реальных приложениях часто имеют гораздо большую размерность, эта двумерная иллюстрация эффективно передает несколько ключевых концепций.

    +
      +
    • Многомерное представление: Каждая точка представляет собой концептуальный объект (например, Milvus, векторную базу данных, поисковую систему и т. д.), положение которого определяется значениями его размерностей.

    • +
    • Семантические отношения: Расстояния между точками отражают семантическое сходство между концептами. Более близкие точки указывают на концепции, которые более семантически связаны.

    • +
    • Эффект кластеризации: Связанные понятия (такие как Milvus, векторная база данных и поисковая система) располагаются близко друг к другу в пространстве, образуя семантический кластер.

    • +
    +

    Ниже приведен пример реального плотного вектора, представляющего текст "Milvus is an efficient vector database".

    +
    [​
    +    -0.013052909,​
    +    0.020387933,​
    +    -0.007869,​
    +    -0.11111383,​
    +    -0.030188112,​
    +    -0.0053388323,​
    +    0.0010654867,​
    +    0.072027855,​
    +    // ... more dimensions​
    +]​
    +​
    +
    +
    +

    Плотные векторы могут быть сгенерированы с помощью различных моделей встраивания, таких как CNN-модели (например, ResNet, VGG) для изображений и языковые модели (например, BERT, Word2Vec) для текста. Эти модели преобразуют исходные данные в точки в высокоразмерном пространстве, отражая семантические особенности данных. Кроме того, Milvus предлагает удобные методы, помогающие пользователям генерировать и обрабатывать плотные векторы, как подробно описано в разделе Embeddings.

    +

    После того как данные векторизованы, их можно хранить в Milvus для управления и поиска векторов. На схеме ниже показан основной процесс.

    +

    + + Use dense vecctors in Milvus + Использование плотных векторов в Milvus

    +
    +

    Помимо плотных векторов, Milvus также поддерживает разреженные векторы и двоичные векторы. Разреженные векторы подходят для точного сопоставления по определенным терминам, например, для поиска по ключевым словам и сопоставления терминов, а двоичные векторы обычно используются для эффективной работы с бинаризованными данными, например, для сопоставления шаблонов изображений и некоторых приложений хэширования. Дополнительные сведения см. в разделах "Двоичный вектор" и "Разреженный вектор".

    +
    +

    Использование плотных векторов в Milvus

    Добавьте векторное поле

    Чтобы использовать плотные векторы в Milvus, сначала определите векторное поле для хранения плотных векторов при создании коллекции. Этот процесс включает в себя.

    +
      +
    1. Установка datatype на поддерживаемый тип данных плотного вектора. Поддерживаемые типы данных плотных векторов см. в разделе Типы данных.

    2. +
    3. Указание размеров плотного вектора с помощью параметра dim.

    4. +
    +

    В примере ниже мы добавляем векторное поле с именем dense_vector для хранения плотных векторов. Тип данных поля - FLOAT_VECTOR, размерность - 4.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(4)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "dense_vector",​
    +  data_type: DataType.FloatVector,​
    +  dim: 128,​
    +});​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "dense_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 4​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Поддерживаемые типы данных для плотных векторных полей:

    + + + + + + + + + +
    ТипОписание
    FLOAT_VECTORХранит 32-битные числа с плавающей точкой, обычно используемые для представления вещественных чисел в научных вычислениях и машинном обучении. Идеально подходит для сценариев, требующих высокой точности, например для различения похожих векторов.
    FLOAT16_VECTORХранит 16-битные числа с плавающей точкой половинной точности, используемые для глубокого обучения и вычислений на GPU. Экономит место в памяти в сценариях, где точность не так важна, например, на этапе запоминания с низкой точностью в рекомендательных системах.
    BFLOAT16_VECTORХранит 16-битные числа Brain Floating Point (bfloat16), предлагая тот же диапазон экспоненты, что и Float32, но с пониженной точностью. Подходит для сценариев, в которых необходимо быстро обрабатывать большие объемы векторов, например, для крупномасштабного поиска изображений.
    +

    Установка индексных параметров для векторного поля

    Чтобы ускорить семантический поиск, необходимо создать индекс для векторного поля. Индексирование может значительно повысить эффективность поиска по крупномасштабным векторным данным.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="dense_vector",​
    +    index_name="dense_vector_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("dense_vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +    index_name: 'dense_vector_index',​
    +    field_name: 'dense_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.IVF_FLAT,​
    +    params: {​
    +      nlist: 128​
    +    },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense_vector",​
    +            "metricType": "IP",​
    +            "indexName": "dense_vector_index",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    В приведенном выше примере для поля dense_vector создается индекс с именем dense_vector_index с использованием типа индекса IVF_FLAT. Значение metric_type установлено в IP, что указывает на то, что в качестве метрики расстояния будет использоваться внутреннее произведение.

    +

    Milvus поддерживает и другие типы индексов. Для получения более подробной информации обратитесь к разделу Плавающие векторные индексы. Кроме того, Milvus поддерживает другие типы метрик. Для получения дополнительной информации обратитесь к разделу "Метрические типы".

    +

    Создание коллекции

    После того как настройки параметров плотного вектора и индекса завершены, можно создать коллекцию, содержащую плотные векторы. В примере ниже используется метод create_collection для создания коллекции с именем my_dense_collection.

    + +
    client.create_collection(​
    +    collection_name="my_dense_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_dense_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции используйте метод insert для добавления данных, содержащих плотные векторы. Убедитесь, что размерность вставляемых плотных векторов соответствует значению dim, заданному при добавлении поля плотных векторов.

    + +
    data = [​
    +    {"dense_vector": [0.1, 0.2, 0.3, 0.7]},​
    +    {"dense_vector": [0.2, 0.3, 0.4, 0.8]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_dense_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.1, 0.2, 0.3, 0.4]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.2, 0.3, 0.4, 0.5]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { dense_vector: [0.1, 0.2, 0.3, 0.7] },​
    +  { dense_vector: [0.2, 0.3, 0.4, 0.8] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_dense_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"dense_vector": [0.1, 0.2, 0.3, 0.4]},​
    +        {"dense_vector": [0.2, 0.3, 0.4, 0.5]}        ​
    +    ],​
    +    "collectionName": "my_dense_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572531","453577185629572532"]}}​
    +
    +
    +

    Выполнение поиска по сходству

    Семантический поиск на основе плотных векторов - одна из основных функций Milvus, позволяющая быстро находить данные, наиболее похожие на вектор запроса, на основе расстояния между векторами. Чтобы выполнить поиск по сходству, подготовьте вектор запроса и параметры поиска, а затем вызовите метод search.

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_vector = [0.1, 0.2, 0.3, 0.7]​
    +​
    +res = client.search(​
    +    collection_name="my_dense_collection",​
    +    data=[query_vector],​
    +    anns_field="dense_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("dense_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​
    +
    +
    +
    query_vector = [0.1, 0.2, 0.3, 0.7];​
    +​
    +client.search({​
    +    collection_name: my_dense_collection,​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dense_collection",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.7]​
    +    ],​
    +    "annsField": "dense_vector",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.55,"id":"453577185629572532","pk":"453577185629572532"},{"distance":0.42,"id":"453577185629572531","pk":"453577185629572531"}]}​
    +
    +
    +

    Дополнительные сведения о параметрах поиска сходства см. в разделе Базовый поиск ANN.

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.json b/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.json new file mode 100644 index 000000000..2ad2cd3df --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient= MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.create_collection(​\n collection_name=\"my_dynamic_collection\",​\n dimension=5,​\n # highlight-next-line​\n enable_dynamic_field=True​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .dimension(5)​\n // highlight-next-line​\n .enableDynamicField(true)​\n .build()​\nclient.createCollection(createCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new Client({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: \"customized_setup_2\",​\n schema: schema,​\n // highlight-next-line​\n enable_dynamic_field: true​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"dimension\": 5,​\n \"enableDynamicField\": true​\n}'​\n\n","[​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n\n","data=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"my_dynamic_collection\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n ​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"my_dynamic_collection\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_dynamic_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\"',​\n output_fields=[\"color\"]​\n # highlight-end​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(queryVector))​\n .outputFields(Collections.singletonList(\"color\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .topK(5)​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​\n​\n\n","const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: \"color like \\\"red%\\\"\",​\n output_fields: [\"color\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"distance\":0.6290165,\"id\":1},{\"color\":\"red_4794\",\"distance\":0.5975797,\"id\":4},{\"color\":\"red_9392\",\"distance\":-0.24996185,\"id\":6}]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Dynamic Field​","anchorList":[{"label":"Динамическое поле","href":"Dynamic-Field​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Включение динамического поля","href":"Enable-dynamic-field​","type":2,"isActive":false},{"label":"Использование динамического поля","href":"Use-dynamic-field​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.md b/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.md new file mode 100644 index 000000000..9b70cbed5 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/enable-dynamic-field.md @@ -0,0 +1,382 @@ +--- +id: enable-dynamic-field.md +title: Включить динамическое поле +summary: >- + Все поля, определенные в схеме коллекции, должны быть включены в вставляемые + сущности. Если вы хотите, чтобы некоторые поля были необязательными, подумайте + о включении динамического поля. В этой теме описывается, как включить и + использовать динамическое поле. +--- +

    Динамическое поле

    Все поля, определенные в схеме коллекции, должны быть включены в вставляемые сущности. Если вы хотите, чтобы некоторые поля были необязательными, подумайте о включении динамического поля. В этой теме описывается, как включить и использовать динамическое поле.

    +

    Обзор

    В Milvus вы можете создать схему коллекции, задав имена и типы данных для каждого поля в коллекции. Когда вы добавляете поле в схему, убедитесь, что оно включено в сущность, которую вы собираетесь вставить. Если вы хотите, чтобы некоторые поля были необязательными, одним из вариантов является включение динамического поля.

    +

    Динамическое поле - это зарезервированное поле с именем $meta, которое имеет тип JavaScript Object Notation (JSON). Любые поля в сущностях, не определенные в схеме, будут храниться в этом зарезервированном поле JSON в виде пар ключ-значение.

    +

    Для коллекции с включенным динамическим полем можно использовать ключи в динамическом поле для скалярной фильтрации, как и в случае с полями, явно определенными в схеме.

    +

    Включение динамического поля

    Коллекции, созданные с помощью метода, описанного в разделе "Создать коллекцию мгновенно", по умолчанию имеют включенное динамическое поле. Вы также можете включить динамическое поле вручную при создании коллекции с пользовательскими настройками.

    + +
    from pymilvus import MilvusClient​
    +​
    +client= MilvusClient(uri="http://localhost:19530")​
    +​
    +client.create_collection(​
    +    collection_name="my_dynamic_collection",​
    +    dimension=5,​
    +    # highlight-next-line​
    +    enable_dynamic_field=True​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +    .collectionName("my_dynamic_collection")​
    +    .dimension(5)​
    +    // highlight-next-line​
    +    .enableDynamicField(true)​
    +    .build()​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new Client({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    enable_dynamic_field: true​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "dimension": 5,​
    +    "enableDynamicField": true​
    +}'​
    +
    +
    +

    Использование динамического поля

    Когда в коллекции включено динамическое поле, все поля и их значения, которые не определены в схеме, будут храниться в динамическом поле в виде пар ключ-значение.

    +

    Например, предположим, что в схеме вашей коллекции определены только два поля id и vector с включенным динамическим полем. Теперь вставьте в эту коллекцию следующий набор данных.

    +
    [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +
    +
    +

    Приведенный выше набор данных содержит 10 сущностей, каждая из которых включает поля id, vector и color. Здесь поле color не определено в схеме. Поскольку в коллекции включено динамическое поле, поле color будет храниться как пара ключ-значение в динамическом поле.

    +

    Вставка данных

    Следующий код демонстрирует, как вставить этот набор данных в коллекцию.

    + +
    data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="my_dynamic_collection",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +   ​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "my_dynamic_collection"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    Запрос и поиск с помощью динамического поля

    Milvus поддерживает использование выражений фильтрации при запросах и поиске, позволяя указывать, какие поля включать в результаты. Следующий пример демонстрирует, как с помощью динамического поля выполнять запросы и поиск по полю color, которое не определено в схеме.

    + +
    query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_dynamic_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%"',​
    +    output_fields=["color"]​
    +    # highlight-end​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(queryVector))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .filter("color like \"red%\"")​
    +        .topK(5)​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​
    +​
    +
    +
    +
    const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: "color like \"red%\"",​
    +    output_fields: ["color"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"color":"red_7025","distance":0.6290165,"id":1},{"color":"red_4794","distance":0.5975797,"id":4},{"color":"red_9392","distance":-0.24996185,"id":6}]}​
    +
    +
    +

    В выражении фильтра, использованном в приведенном выше примере кода, color like "red%" and likes > 50, условия указывают, что значение поля color должно начинаться с "red". В данных примера этому условию удовлетворяют только две сущности. Таким образом, когда limit (topK) устанавливается на 3 или меньше, будут возвращены обе эти сущности.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.json b/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.json new file mode 100644 index 000000000..fbcfa3ea6 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri='http://localhost:19530')​\n​\n# Define collection schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, nullable=True) # Nullable field​\n​\n# Set index params​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\n# Create collection​\nclient.create_collection(collection_name=\"user_profiles_null\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .isNullable(true)​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_null\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.Int64, dim: 5 },​\n​\n { name: \"age\", data_type: DataType.FloatVector, nullable: true },​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.AUTOINDEX,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport nullField='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"nullable\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $nullField​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_null\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": None},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}​\n]​\n​\nclient.insert(collection_name=\"user_profiles_null\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6], \\\"age\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​\n { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​\n { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_null\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]} ​\n ],​\n \"collectionName\": \"user_profiles_null\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_null\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n limit=2,​\n search_params={\"params\": {\"nprobe\": 16}},​\n output_fields=[\"id\", \"age\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .topK(2)​\n .searchParams(params)​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​\n\n","client.search({​\n collection_name: 'user_profiles_null',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id'],​\n filter: '25 <= age <= 35',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"data\": [​\n [0.1, -0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n#{\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"distance\":0.16000001,\"id\":1},{\"age\":null,\"distance\":0.28999996,\"id\":2},{\"age\":null,\"distance\":0.52000004,\"id\":3}]}​\n\n","# Reviewing previously inserted data:​\n# {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30}​\n# {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129], \"age\": None}​\n# {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": None} # Omitted age column is treated as None​\n​\nresults = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"age >= 0\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [​\n# {\"id\": 1, \"age\": 30}​\n# ]​\n# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"age >= 0\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=1, age=30})]​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"age >= 0\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"filter\": \"age >= 0\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1}]}​\n\n","null_results = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [{\"id\": 2, \"age\": None}, {\"id\": 3, \"age\": None}]​\n\n","QueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .limit(10)​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"expr\": \"\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1},{\"age\":null,\"id\":2},{\"age\":null,\"id\":3}]}​\n\n","schema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, default_value=18)​\nschema.add_field(field_name=\"status\", datatype=DataType.VARCHAR, default_value=\"active\", max_length=10)​\n​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\nclient.create_collection(collection_name=\"user_profiles_default\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .defaultValue(18L)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"status\")​\n .dataType(DataType.VarChar)​\n .maxLength(10)​\n .defaultValue(\"active\")​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_default\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.FloatVector, dim: 5 },​\n { name: \"age\", data_type: DataType.Int64, default_value: 18 },​\n { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.IVF_FLAT,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport defaultValueField1='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"defaultValue\": 18​\n}'​\n​\nexport defaultValueField2='{​\n \"fieldName\": \"status\",​\n \"dataType\": \"VarChar\",​\n \"defaultValue\": \"active\",​\n \"elementTypeParams\": {​\n \"max_length\": 10​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $defaultValueField1,​\n $defaultValueField2​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_default\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129]},\n {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": 25, \"status\": None}, \n {\"id\": 4, \"vector\": [0.4, 0.5, ..., 0.131], \"age\": None, \"status\": \"inactive\"} \n]​\n​\nclient.insert(collection_name=\"user_profiles_default\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30, \\\"status\\\": \\\"premium\\\"}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7], \\\"age\\\": 25, \\\"status\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4, 0.5, 0.6, 0.7, 0.8], \\\"age\\\": null, \\\"status\\\": \\\"inactive\\\"}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_default\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n ],​\n \"collectionName\": \"user_profiles_default\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_default\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n search_params={\"params\": {\"nprobe\": 16}},​\n filter=\"age == 18\", # 18 is the default value of the `age` field​\n limit=10,​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .searchParams(params)​\n .filter(\"age == 18\")​\n .topK(10)​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​\n\n","client.search({​\n collection_name: 'user_profiles_default',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id', 'status'],​\n filter: 'age == 18',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"distance\":0.050000004,\"id\":2,\"status\":\"active\"},{\"age\":18,\"distance\":0.45000002,\"id\":4,\"status\":\"inactive\"}]}​\n\n","# Query all entities where `age` equals the default value (18)​\ndefault_age_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter=\"age == 18\",​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\n# Query all entities where `status` equals the default value (\"active\")​\ndefault_status_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter='status == \"active\"',​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp ageResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"age == 18\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(ageResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​\n​\nQueryResp statusResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"status == \\\"active\\\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(statusResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​\n\n","// Query all entities where `age` equals the default value (18)​\nconst default_age_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: \"age == 18\",​\n output_fields: [\"id\", \"age\", \"status\"]​\n);​\n// Query all entities where `status` equals the default value (\"active\")​\nconst default_status_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: 'status == \"active\"',​\n output_fields: [\"id\", \"age\", \"status\"]​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":18,\"id\":4,\"status\":\"inactive\"}]}​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"status == \\\"active\\\"\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":25,\"id\":3,\"status\":\"active\"}]}​\n\n"],"headingContent":"Nullable & Default​","anchorList":[{"label":"Nullable & Default","href":"Nullable--Default​","type":1,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"Атрибут Nullable","href":"Nullable-attribute","type":2,"isActive":false},{"label":"Значения по умолчанию","href":"Default-values​","type":2,"isActive":false},{"label":"Применимые правила","href":"Applicable-rules","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.md b/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.md new file mode 100644 index 000000000..80f1da648 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/nullable-and-default.md @@ -0,0 +1,878 @@ +--- +id: nullable-and-default.md +title: Nullable & Default +related_key: 'nullable, default' +summary: >- + Milvus позволяет установить атрибут `nullable` и значения по умолчанию для + скалярных полей, за исключением первичного поля. Для полей, помеченных как + nullable=True, вы можете пропустить поле при вставке данных или задать ему + прямое нулевое значение, и система будет воспринимать его как нулевое, не + вызывая ошибки. +--- +

    Nullable & Default

    Milvus позволяет установить атрибут nullable и значения по умолчанию для скалярных полей, за исключением первичного поля. Для полей, помеченных как nullable=True, вы можете пропустить поле при вставке данных или установить для него прямое нулевое значение, и система будет воспринимать его как нулевое, не вызывая ошибки. Если поле имеет значение по умолчанию, система автоматически применит это значение, если при вставке данных для поля не будет указано.

    +

    Атрибуты default value и nullable упрощают миграцию данных из других систем баз данных в Milvus, позволяя работать с наборами данных с нулевыми значениями и сохранять настройки значений по умолчанию. При создании коллекции вы также можете включить nullable или установить значения по умолчанию для полей, значения которых могут быть неопределенными.

    +

    Ограничения

      +
    • Только скалярные поля, за исключением первичного поля, поддерживают значения по умолчанию и атрибут nullable.

    • +
    • Поля JSON и Array не поддерживают значения по умолчанию.

    • +
    • Значения по умолчанию или атрибут nullable можно настроить только при создании коллекции и не изменять после этого.

    • +
    • Скалярные поля с включенным атрибутом nullable нельзя использовать в качестве group_by_field в группировочном поиске. Дополнительные сведения о группировочном поиске см. в разделе Группировочный поиск.

    • +
    • Поля, помеченные как nullable, нельзя использовать в качестве ключей разделов. Дополнительные сведения о ключах разделов см. в разделе Использование ключей разделов.

    • +
    • При создании индекса по скалярному полю с включенным атрибутом nullable нулевые значения будут исключены из индекса.

    • +
    +

    Атрибут Nullable

    Атрибут nullable позволяет хранить в коллекции нулевые значения, обеспечивая гибкость при работе с неизвестными данными.

    +

    Установка атрибута nullable

    При создании коллекции используйте nullable=True для определения полей с нулевыми значениями (по умолчанию False). Следующий пример создает коллекцию с именем user_profiles_null и устанавливает поле age как nullable.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri='http://localhost:19530')​
    +​
    +# Define collection schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True) # Nullable field​
    +​
    +# Set index params​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +# Create collection​
    +client.create_collection(collection_name="user_profiles_null", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .isNullable(true)​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_null",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.Int64, dim: 5 },​
    +​
    +    { name: "age", data_type: DataType.FloatVector, nullable: true },​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.AUTOINDEX,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export nullField='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "nullable": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $nullField​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_null\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка сущностей

    Когда вы вставляете данные в поле с возможностью зануления, вставьте null или непосредственно опустите это поле.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": None},​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]}​
    +]​
    +​
    +client.insert(collection_name="user_profiles_null", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​
    +  { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​
    +  { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_null",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": null}, ​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]} ​
    +    ],​
    +    "collectionName": "user_profiles_null"​
    +}'​
    +
    +
    +

    Поиск и запрос с нулевыми значениями

    При использовании метода search, если поле содержит значения null, результат поиска вернет поле как null.

    + +
    res = client.search(​
    +    collection_name="user_profiles_null",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    limit=2,​
    +    search_params={"params": {"nprobe": 16}},​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .topK(2)​
    +        .searchParams(params)​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_null',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id'],​
    +    filter: '25 <= age <= 35',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "data": [​
    +        [0.1, -0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +#{"code":0,"cost":0,"data":[{"age":30,"distance":0.16000001,"id":1},{"age":null,"distance":0.28999996,"id":2},{"age":null,"distance":0.52000004,"id":3}]}​
    +
    +
    +

    Когда вы используете метод query для скалярной фильтрации, результаты фильтрации для нулевых значений будут ложными, что означает, что они не будут выбраны.

    + +
    # Reviewing previously inserted data:​
    +# {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30}​
    +# {"id": 2, "vector": [0.2, 0.3, ..., 0.129], "age": None}​
    +# {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": None}  # Omitted age  column is treated as None​
    +​
    +results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="age >= 0",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [​
    +#     {"id": 1, "age": 30}​
    +# ]​
    +# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("age >= 0")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=1, age=30})]​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "age >= 0",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "filter": "age >= 0",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1}]}​
    +
    +
    +

    Чтобы запросить сущности со значениями null, используйте пустое выражение "".

    + +
    null_results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [{"id": 2, "age": None}, {"id": 3, "age": None}]​
    +
    +
    +
    QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .limit(10)​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "expr": "",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1},{"age":null,"id":2},{"age":null,"id":3}]}​
    +
    +
    +

    Значения по умолчанию

    Значения по умолчанию - это предустановленные значения, присваиваемые скалярным полям. Если при вставке вы не указываете значение для поля, имеющего значение по умолчанию, система автоматически использует значение по умолчанию.

    +

    Установка значений по умолчанию

    При создании коллекции используйте параметр default_value, чтобы задать значение по умолчанию для поля. В следующем примере показано, как установить значение по умолчанию для age на 18 и status на "active".

    + +
    schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)​
    +schema.add_field(field_name="status", datatype=DataType.VARCHAR, default_value="active", max_length=10)​
    +​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +client.create_collection(collection_name="user_profiles_default", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .defaultValue(18L)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("status")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(10)​
    +        .defaultValue("active")​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_default",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.FloatVector, dim: 5 },​
    +    { name: "age", data_type: DataType.Int64, default_value: 18 },​
    +    { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.IVF_FLAT,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export defaultValueField1='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "defaultValue": 18​
    +}'​
    +​
    +export defaultValueField2='{​
    +    "fieldName": "status",​
    +    "dataType": "VarChar",​
    +    "defaultValue": "active",​
    +    "elementTypeParams": {​
    +        "max_length": 10​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $defaultValueField1,​
    +        $defaultValueField2​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_default\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка сущностей

    При вставке данных, если вы опустите поля со значением по умолчанию или установите для них значение null, система будет использовать значение по умолчанию.

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, ..., 0.129]},
    +    {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": 25, "status": None}, 
    +    {"id": 4, "vector": [0.4, 0.5, ..., 0.131], "age": None, "status": "inactive"} 
    +]​
    +​
    +client.insert(collection_name="user_profiles_default", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +    {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}  ​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_default",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]},​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +        {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}      ​
    +    ],​
    +    "collectionName": "user_profiles_default"​
    +}'​
    +
    +
    +
    +

    Дополнительную информацию о том, как вступают в силу параметры nullable и значения по умолчанию, см. в разделе Применимые правила.

    +
    +

    Поиск и запрос со значениями по умолчанию

    Сущности, содержащие значения по умолчанию, при векторном поиске и скалярной фильтрации обрабатываются так же, как и любые другие сущности. Значения по умолчанию можно включать в операции search и query.

    +

    Например, при выполнении операции search в результаты будут включены сущности, для которых в параметре age установлено значение по умолчанию 18.

    + +
    res = client.search(​
    +    collection_name="user_profiles_default",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    search_params={"params": {"nprobe": 16}},​
    +    filter="age == 18",  # 18 is the default value of the `age` field​
    +    limit=10,​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .searchParams(params)​
    +        .filter("age == 18")​
    +        .topK(10)​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_default',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id', 'status'],​
    +    filter: 'age == 18',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"distance":0.050000004,"id":2,"status":"active"},{"age":18,"distance":0.45000002,"id":4,"status":"inactive"}]}​
    +
    +
    +

    В операции query вы можете искать или фильтровать по значениям по умолчанию напрямую.

    + +
    # Query all entities where `age` equals the default value (18)​
    +default_age_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter="age == 18",​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +# Query all entities where `status` equals the default value ("active")​
    +default_status_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter='status == "active"',​
    +    output_fields=["id", "age", "status"]​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp ageResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("age == 18")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(ageResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​
    +​
    +QueryResp statusResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("status == \"active\"")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(statusResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​
    +
    +
    +
    // Query all entities where `age` equals the default value (18)​
    +const default_age_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: "age == 18",​
    +    output_fields: ["id", "age", "status"]​
    +);​
    +// Query all entities where `status` equals the default value ("active")​
    +const default_status_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: 'status == "active"',​
    +    output_fields: ["id", "age", "status"]​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":18,"id":4,"status":"inactive"}]}​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "status == \"active\"",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":25,"id":3,"status":"active"}]}​
    +
    +
    +

    Применимые правила

    В следующей таблице представлено поведение нулевых столбцов и значений по умолчанию при различных комбинациях конфигурации. Эти правила определяют, как Milvus обрабатывает данные при попытке вставить нулевые значения или если значения полей не предоставлены.

    + + + + + + + + + + + +
    НулевыеЗначение по умолчаниюТип значения по умолчаниюПользовательский вводРезультатПример
    Non-nullНет/нулевойИспользуется значение по умолчанию
    • Поле: age
    • Значение по умолчанию: 18
    • Пользовательский ввод: null
    • Результат: хранится как 18
    -Нет/nullХранится как null
    • Поле:
    • middle_name
    • Значение по умолчанию:
    • -Ввод
    • пользователя
    • : null
    • Результат: сохранено как null
    Не нулевоеNone/nullИспользует значение по умолчанию
    • Поле:
    • status
    • Значение по умолчанию:
    • "active"
    • Пользовательский ввод: null
    • Результат: сохраняется как "active"
    -Нет/nullВыбрасывает ошибку
    • Поле:
    • email
    • Значение по умолчанию:
    • -Ввод
    • пользователя
    • : null
    • Результат: Операция отклонена, система выбрасывает ошибку
    NullNone/nullВыбрасывает ошибку
    • Поле:
    • username
    • Значение по умолчанию:
    • nullВвод
    • пользователя
    • : null
    • Результат: Операция отклонена, система выбрасывает ошибку
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/number.json b/localization/v2.5.x/site/ru/userGuide/schema/number.json new file mode 100644 index 000000000..83382ea44 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/number.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64)​\nschema.add_field(field_name=\"price\", datatype=DataType.FLOAT)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"price\")​\n .dataType(DataType.Float)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"age\",​\n data_type: DataType.Int64,​\n },​\n {​\n name: \"price\",​\n data_type: DataType.Float,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n​\n\n","export int64Field='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport floatField='{​\n \"fieldName\": \"price\",​\n \"dataType\": \"Float\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $int64Field,​\n $floatField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"age\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"inverted_index\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"age\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n​\n\n","const indexParams = {​\n index_name: 'inverted_index',​\n field_name: 'age',​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","import { IndexType } from \"@zilliz/milvus2-sdk-node\";​\nconst indexParams = [​\n {​\n field_name: \"age\",​\n index_name: \"inverted_index\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n {​\n field_name: \"embedding\",​\n metric_type: \"COSINE\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n];​\n​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_scalar_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_scalar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_scalar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"age\\\": 25, \\\"price\\\": 99.99, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 30, \\\"price\\\": 149.50, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 35, \\\"price\\\": 199.99, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​\n { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​\n { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_scalar_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_scalar_collection\"​\n}'​\n\n","filter = \"30 <= age <= 40\"​\n​\nres = client.query(​\n collection_name=\"my_scalar_collection\",​\n filter=filter,​\n output_fields=[\"age\",\"price\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'age': 30, 'price': np.float32(149.5), 'pk': 2}\", \"{'age': 35, 'price': np.float32(199.99), 'pk': 3}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"30 <= age <= 40\";​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .build());​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: '30 <= age <= 40',​\n output_fields: ['age', 'price']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"filter\": \"30 <= age <= 40\",​\n \"outputFields\": [\"age\",\"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"pk\":2,\"price\":149.5},{\"age\":35,\"pk\":3,\"price\":199.99}]}​\n\n","filter = \"25 <= age <= 35\"​\n​\nres = client.search(​\n collection_name=\"my_scalar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"age\",\"price\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"25 <= age <= 35\";​\n​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_scalar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['age', 'price'],​\n filter: '25 <= age <= 35'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"outputFields\": [\"age\", \"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":35,\"distance\":-0.19054288,\"id\":3,\"price\":199.99},{\"age\":30,\"distance\":-0.20163085,\"id\":2,\"price\":149.5},{\"age\":25,\"distance\":-0.2364331,\"id\":1,\"price\":99.99}]}​\n\n"],"headingContent":"Number Field​","anchorList":[{"label":"Числовое поле","href":"Number-Field​","type":1,"isActive":false},{"label":"Поддерживаемые типы числовых полей","href":"Supported-number-field-types​","type":2,"isActive":false},{"label":"Добавление числового поля","href":"Add-number-field​","type":2,"isActive":false},{"label":"Установка индексных параметров","href":"Set-index-params​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-collection​","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data​","type":2,"isActive":false},{"label":"Поиск и запросы","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/number.md b/localization/v2.5.x/site/ru/userGuide/schema/number.md new file mode 100644 index 000000000..6c78dc00e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/number.md @@ -0,0 +1,568 @@ +--- +id: number.md +title: Числовое поле +related_key: 'number, integer, float, double' +summary: >- + Числовые поля используются для хранения невекторных числовых данных в Milvus. + Эти поля обычно используются для описания дополнительной информации, связанной + с векторными данными, такой как возраст, цена и т. д. Используя эти данные, вы + можете лучше описать векторы и повысить эффективность фильтрации данных и + условных запросов. +--- +

    Числовое поле

    Числовые поля используются для хранения невекторных числовых данных в Milvus. Эти поля обычно используются для описания дополнительной информации, связанной с векторными данными, такой как возраст, цена и т. д. Используя эти данные, вы можете лучше описать векторы и повысить эффективность фильтрации данных и условных запросов.

    +

    Числовые поля особенно полезны во многих сценариях. Например, в рекомендациях по электронной коммерции поле цены может использоваться для фильтрации, а при анализе профиля пользователя возрастные диапазоны помогают уточнить результаты. В сочетании с векторными данными числовые поля могут помочь системе обеспечить схожий поиск и более точно удовлетворить индивидуальные потребности пользователей.

    +

    Поддерживаемые типы числовых полей

    Milvus поддерживает различные типы числовых полей для удовлетворения различных потребностей в хранении данных и запросов.

    +

    Тип

    +

    Описание

    +

    BOOL

    +

    Булевский тип для хранения true или false, подходит для описания бинарных состояний.

    +

    INT8

    +

    8-битное целое число, подходит для хранения целочисленных данных небольшого диапазона.

    +

    INT16

    +

    16-битное целое число, для хранения целочисленных данных среднего диапазона.

    +

    INT32

    +

    32-битное целое число, идеально подходящее для хранения общих целочисленных данных, таких как количество продукции или идентификаторы пользователей.

    +

    INT64

    +

    64-битное целое число, подходящее для хранения данных большого диапазона, таких как временные метки или идентификаторы.

    +

    FLOAT

    +

    32-битное число с плавающей точкой - для данных, требующих общей точности, таких как номиналы или температура.

    +

    DOUBLE

    +

    64-битное число с плавающей запятой двойной точности - для данных высокой точности, таких как финансовая информация или научные расчеты.

    +
    +

    Добавление числового поля

    Чтобы использовать числовые поля в Milvus, определите соответствующие поля в схеме коллекции, установив для datatype поддерживаемый тип, например BOOL или INT8. Полный список поддерживаемых типов числовых полей см. в разделе Поддерживаемые типы числовых полей.

    +

    В следующем примере показано, как определить схему, включающую числовые поля age и price.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="age", datatype=DataType.INT64)​
    +schema.add_field(field_name="price", datatype=DataType.FLOAT)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("price")​
    +        .dataType(DataType.Float)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "age",​
    +    data_type: DataType.Int64,​
    +  },​
    +  {​
    +    name: "price",​
    +    data_type: DataType.Float,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export floatField='{​
    +    "fieldName": "price",​
    +    "dataType": "Float"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $int64Field,​
    +        $floatField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +
    +

    Основное поле и векторное поле являются обязательными при создании коллекции. Первичное поле уникально идентифицирует каждую сущность, а векторное поле имеет решающее значение для поиска по сходству. Подробнее см. в разделах Первичное поле и автоидентификация, Плотный вектор, Двоичный вектор или Разреженный вектор.

    +
    +

    Установка индексных параметров

    Установка параметров индекса для числовых полей необязательна, но может значительно повысить эффективность поиска.

    +

    В следующем примере мы создаем AUTOINDEX для числового поля age, что позволяет Milvus автоматически создавать соответствующий индекс на основе типа данных. Дополнительные сведения см. в разделе АВТОИНДЕКС.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="age",​
    +    index_type="AUTOINDEX",​
    +    index_name="inverted_index"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("age")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'inverted_index',​
    +    field_name: 'age',​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Помимо AUTOINDEX, вы можете указать другие типы индексов для числовых полей. Поддерживаемые типы индексов см. в разделе Скалярные индексы.

    +

    Кроме того, перед созданием коллекции необходимо создать индекс для векторного поля. В этом примере мы используем AUTOINDEX, чтобы упростить настройку векторного индекса.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    import { IndexType } from "@zilliz/milvus2-sdk-node";​
    +const indexParams = [​
    +  {​
    +    field_name: "age",​
    +    index_name: "inverted_index",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +  {​
    +    field_name: "embedding",​
    +    metric_type: "COSINE",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +];​
    +​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Создание коллекции

    После того как схема и индексы определены, можно создать коллекцию, включающую числовые поля.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_scalar_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_scalar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции вы можете вставить данные, включающие числовые поля.

    + +
    data = [​
    +    {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_scalar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​
    +  { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​
    +  { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_scalar_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +        {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +        {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_scalar_collection"​
    +}'​
    +
    +
    +

    В этом примере мы вставляем данные, включающие age, price, pk (основное поле) и векторное представление (embedding). Чтобы убедиться, что вставляемые данные соответствуют полям, определенным в схеме, рекомендуется заранее проверить типы данных, чтобы избежать ошибок.

    +

    Если при определении схемы вы установите значение enable_dynamic_fields=True, Milvus позволит вам вставлять числовые поля, которые не были определены заранее. Однако имейте в виду, что это может увеличить сложность запросов и управления, что потенциально может повлиять на производительность. Дополнительную информацию см. в разделе Динамическое поле.

    +

    Поиск и запросы

    После добавления числовых полей вы можете использовать их для фильтрации в операциях поиска и запросов, чтобы получить более точные результаты поиска.

    +

    Фильтр запросов

    После добавления числовых полей их можно использовать для фильтрации в запросах. Например, вы можете запросить все сущности, в которых age находится в диапазоне от 30 до 40.

    + +
    filter = "30 <= age <= 40"​
    +​
    +res = client.query(​
    +    collection_name="my_scalar_collection",​
    +    filter=filter,​
    +    output_fields=["age","price"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'age': 30, 'price': np.float32(149.5), 'pk': 2}", "{'age': 35, 'price': np.float32(199.99), 'pk': 3}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "30 <= age <= 40";​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .build());​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: '30 <= age <= 40',​
    +    output_fields: ['age', 'price']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "filter": "30 <= age <= 40",​
    +    "outputFields": ["age","price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":30,"pk":2,"price":149.5},{"age":35,"pk":3,"price":199.99}]}​
    +
    +
    +

    Это выражение запроса возвращает все совпадающие сущности и выводит их поля age и price. Дополнительные сведения о фильтрации запросов см. в разделе Фильтрация метаданных.

    +

    Векторный поиск с фильтрацией по числам

    Помимо базовой фильтрации по числовым полям, можно комбинировать векторный поиск по сходству с фильтрами по числовым полям. Например, в следующем коде показано, как добавить фильтр по полю чисел к векторному поиску.

    + +
    filter = "25 <= age <= 35"​
    +​
    +res = client.search(​
    +    collection_name="my_scalar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["age","price"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "25 <= age <= 35";​
    +​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_scalar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['age', 'price'],​
    +    filter: '25 <= age <= 35'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "outputFields": ["age", "price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":35,"distance":-0.19054288,"id":3,"price":199.99},{"age":30,"distance":-0.20163085,"id":2,"price":149.5},{"age":25,"distance":-0.2364331,"id":1,"price":99.99}]}​
    +
    +
    +

    В этом примере мы сначала определяем вектор запроса и добавляем условие фильтра 25 <= age <= 35 во время поиска. Это гарантирует, что результаты поиска будут не только похожи на вектор запроса, но и будут соответствовать заданному возрастному диапазону. Дополнительные сведения см. в разделе Фильтрация метаданных.

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/primary-field.json b/localization/v2.5.x/site/ru/userGuide/schema/primary-field.json new file mode 100644 index 000000000..c0e1e563a --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/primary-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n​\nschema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n // highlight-end​\n .build());​\n);​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"pk\",​\n description: \"ID field\",​\n data_type: DataType.VARCHAR,​\n is_primary_key: true,​\n max_length: 100,​\n },​\n];​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.VARCHAR,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n max_length=512,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.VarChar)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(512)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.VarChar,​\n // highlight-start​\n is_primary_key: true,​\n autoID: true,​\n maxLength: 512​\n // highlight-end​\n});​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ],​\n \\\"params\\\": {​\n \\\"max_length\\\": 512​\n }​\n}\"​\n\n"],"headingContent":"Primary Field & AutoID​","anchorList":[{"label":"Первичное поле и автоидентификатор","href":"Primary-Field--AutoID​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование первичных ключей Int64","href":"Use-Int64-Primary-Keys​","type":2,"isActive":false},{"label":"Использование первичных ключей VarChar","href":"Use-VarChar-Primary-Keys​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/primary-field.md b/localization/v2.5.x/site/ru/userGuide/schema/primary-field.md new file mode 100644 index 000000000..8e3439f14 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/primary-field.md @@ -0,0 +1,195 @@ +--- +id: primary-field.md +title: Основное поле и автоидентификатор +summary: >- + Первичное поле уникально идентифицирует сущность. На этой странице описано, + как добавить первичное поле в два разных типа данных и как разрешить Milvus + автоматически распределять значения первичного поля. +--- +

    Первичное поле и автоидентификатор

    Первичное поле уникально идентифицирует сущность. На этой странице описано, как добавить первичное поле в два разных типа данных и как включить в Milvus функцию автоматического присвоения значений первичного поля.

    +

    Обзор

    В коллекции первичный ключ каждой сущности должен быть глобально уникальным. При добавлении первичного поля необходимо явно установить тип данных VARCHAR или INT64. Установка типа данных INT64 означает, что первичными ключами должны быть целые числа, как на 12345; установка типа данных VARCHAR означает, что первичными ключами должны быть строки, как на my_entity_1234.

    +

    Вы также можете включить AutoID, чтобы Milvus автоматически выделял первичные ключи для входящих сущностей. После включения AutoID в коллекции не включайте первичные ключи при вставке сущностей.

    +

    Первичное поле в коллекции не имеет значения по умолчанию и не может быть null.

    +

    Использование первичных ключей Int64

    Чтобы использовать первичные ключи типа Int64, вам нужно установить datatype на DataType.INT64 и is_primary на true. Если вам также нужно, чтобы Milvus выделял первичные ключи для входящих сущностей, также установите auto_id на true.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +​
    +schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        // highlight-end​
    +        .build());​
    +);​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "pk",​
    +    description: "ID field",​
    +    data_type: DataType.VARCHAR,​
    +    is_primary_key: true,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}"​
    +
    +
    +

    Использование первичных ключей VarChar

    Чтобы использовать первичные ключи VarChar, помимо изменения значения параметра data_type на DataType.VARCHAR, необходимо также установить параметр max_length для поля.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    max_length=512,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(512)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.VarChar,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: true,​
    +    maxLength: 512​
    +    // highlight-end​
    +});​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ],​
    +    \"params\": {​
    +        \"max_length\": 512​
    +    }​
    +}"​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.json b/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.json new file mode 100644 index 000000000..edf8092f2 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\ncollection_name = \"my_collection\"​\n​\n# client = MilvusClient(uri=\"http://localhost:19530\")​\nclient = MilvusClient(uri=\"./milvus_demo.db\")​\n​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n)​\n​\nschema.add_field(field_name=\"article_id\", datatype=DataType.INT64, is_primary=True, description=\"article id\")​\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=200, description=\"article title\")​\nschema.add_field(field_name=\"author_info\", datatype=DataType.JSON, description=\"author information\")​\nschema.add_field(field_name=\"publish_ts\", datatype=DataType.INT32, description=\"publish timestamp\")​\nschema.add_field(field_name=\"image_url\", datatype=DataType.VARCHAR, max_length=500, description=\"image URL\")​\nschema.add_field(field_name=\"image_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"image vector\")​\nschema.add_field(field_name=\"summary\", datatype=DataType.VARCHAR, max_length=1000, description=\"article summary\")​\nschema.add_field(field_name=\"summary_dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"summary dense vector\")​\nschema.add_field(field_name=\"summary_sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR, description=\"summary sparse vector\")​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"image_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_dense_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_sparse_vector\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"publish_ts\",​\n index_type=\"INVERTED\",​\n)​\n\n","client.create_collection(​\n collection_name=collection_name,​\n schema=schema,​\n index_params=index_params,​\n)​\n\n","collection_desc = client.describe_collection(​\n collection_name=collection_name​\n)​\nprint(collection_desc)​\n\n"],"headingContent":"Schema Design Hands-On​","anchorList":[{"label":"Проектирование схем на практике","href":"Schema-Design-Hands-On​","type":1,"isActive":false},{"label":"Пример: Поиск новостей","href":"An-Example-News-Search​","type":1,"isActive":false},{"label":"Как реализовать пример схемы","href":"How-to-Implement-the-Example-Schema​","type":1,"isActive":false},{"label":"Создание схемы","href":"Create-Schema​","type":2,"isActive":false},{"label":"Определение индекса","href":"Define-Index​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-Collection​","type":2,"isActive":false},{"label":"Другие соображения","href":"Other-Considerations​","type":1,"isActive":false},{"label":"Загрузка индекса","href":"Loading-Index​","type":2,"isActive":false},{"label":"Как определить модель данных для нескольких арендаторов","href":"How-to-Define-Data-Model-For-Multi-tenancy​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.md b/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.md new file mode 100644 index 000000000..3ec55bf6b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/schema-hands-on.md @@ -0,0 +1,271 @@ +--- +id: schema-hands-on.md +title: Проектирование схем на практике +summary: >- + Milvus поддерживает определение модели данных через схему коллекции. Коллекция + организует неструктурированные данные, такие как текст и изображения, вместе с + их векторными представлениями, включая плотные и разреженные векторы различной + точности, используемые для семантического поиска. Кроме того, Milvus + поддерживает хранение и фильтрацию невекторных типов данных, называемых + "скалярными". К скалярным типам относятся BOOL, INT8/16/32/64, FLOAT/DOUBLE, + VARCHAR, JSON и Array. +--- +

    Проектирование схем на практике

    Информационно-поисковые системы (IR), также известные как поиск, необходимы для различных приложений искусственного интеллекта, таких как генерация с расширенным поиском (RAG), поиск изображений и рекомендации товаров. Первым шагом в разработке IR-системы является проектирование модели данных, которое включает в себя анализ бизнес-требований, определение способа организации информации и индексацию данных для обеспечения семантического поиска.

    +

    Milvus поддерживает определение модели данных через схему коллекции. Коллекция организует неструктурированные данные, такие как текст и изображения, вместе с их векторными представлениями, включая плотные и разреженные векторы различной точности, используемые для семантического поиска. Кроме того, Milvus поддерживает хранение и фильтрацию невекторных типов данных, называемых "скалярными". К скалярным типам относятся BOOL, INT8/16/32/64, FLOAT/DOUBLE, VARCHAR, JSON и Array.

    +

    + + Example data schema designed for searching news article + Пример схемы данных, предназначенной для поиска новостной статьи

    +

    Проектирование модели данных поисковой системы включает в себя анализ потребностей бизнеса и абстрагирование информации в виде модели данных, выраженной в виде схемы. Например, для поиска по фрагменту текста его необходимо "проиндексировать", преобразовав буквенную строку в вектор с помощью "встраивания", что позволяет осуществлять векторный поиск. Помимо этого основного требования, может потребоваться хранение других свойств, таких как время публикации и автор. Эти метаданные позволяют уточнить семантический поиск с помощью фильтрации, возвращая только тексты, опубликованные после определенной даты или определенным автором. Кроме того, их может потребоваться получить вместе с основным текстом для отображения результатов поиска в приложении. Чтобы упорядочить эти фрагменты текста, каждому из них должен быть присвоен уникальный идентификатор, выраженный в виде целого числа или строки. Эти элементы необходимы для реализации сложной логики поиска.

    +

    Хорошо продуманная схема очень важна, поскольку она абстрагирует модель данных и решает, можно ли достичь бизнес-целей с помощью поиска. Кроме того, поскольку каждая строка данных, вставляемая в коллекцию, должна соответствовать схеме, это значительно помогает поддерживать согласованность данных и их долгосрочное качество. С технической точки зрения, четко определенная схема приводит к хорошо организованному хранению данных в столбцах и более чистой структуре индексов, что повышает производительность поиска.

    +

    Пример: Поиск новостей

    Допустим, мы хотим создать поиск для новостного сайта, и у нас есть корпус новостей с текстом, уменьшенными изображениями и другими метаданными. Сначала нам нужно проанализировать, как мы хотим использовать эти данные для поддержки бизнес-требований поиска. Представьте, что нам необходимо получать новости на основе уменьшенного изображения и краткого содержания, а также использовать метаданные, такие как информация об авторе и время публикации, в качестве критериев для фильтрации результатов поиска. Эти требования можно разделить на следующие.

    +
      +
    • Для поиска изображений по тексту мы можем встраивать изображения в векторы с помощью мультимодальной модели встраивания, которая может отображать текстовые и графические данные в одно и то же латентное пространство.

    • +
    • Краткий текст статьи встраивается в векторы с помощью модели встраивания текста.

    • +
    • Для фильтрации по времени публикации даты хранятся в виде скалярного поля, а для эффективной фильтрации необходим индекс для скалярного поля. Другие более сложные структуры данных, такие как JSON, можно хранить в скалярном поле и выполнять поиск по их содержимому (индексирование JSON - это будущая функция).

    • +
    • Чтобы получить байт миниатюры изображения и отобразить его на странице результатов поиска, также хранится url изображения. Аналогично, для текста и заголовка резюме. (В качестве альтернативы мы можем хранить необработанный текст и данные файла изображения как скалярные поля, если это необходимо).

    • +
    • Чтобы улучшить результат поиска по краткому тексту, мы разработали гибридный подход к поиску. Для одного из путей поиска мы используем регулярную модель встраивания для генерации плотного вектора из текста, такую как OpenAI's text-embedding-3-large или open-source bge-large-en-v1.5. Эти модели хорошо отражают общую семантику текста. Другой путь - использовать модели разреженного встраивания, такие как BM25 или SPLADE, для генерации разреженного вектора, напоминающего полнотекстовый поиск, который хорошо улавливает детали и отдельные понятия в тексте. Milvus поддерживает использование обоих методов в одной коллекции данных благодаря своей многовекторной функции. Поиск по нескольким векторам может быть выполнен за одну операцию hybrid_search().

    • +
    • Наконец, нам также необходимо поле ID для идентификации каждой отдельной новостной страницы, формально называемой "сущностью" в терминологии Milvus. Это поле используется в качестве первичного ключа (или сокращенно "pk").

    • +
    +

    Имя поля

    +

    article_id (первичный ключ)

    +

    заголовок

    +

    автор_инфо

    +

    публикация_тс

    +

    адрес_изображения

    +

    вектор_изображения

    +

    резюме

    +

    суммарный_плотный_вектор

    +

    сводный_разреженный_вектор

    +

    Тип

    +

    INT64

    +

    VARCHAR

    +

    JSON

    +

    INT32

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    VARCHAR

    +

    ПЛОСКИЙ_ВЕКТОР

    +

    РАЗРЕЖЕННЫЙ_ПЛОСКИЙ_ВЕКТОР

    +

    Нужный индекс

    +

    N

    +

    N

    +

    N (поддержка скоро появится)

    +

    Y

    +

    N

    +

    Y

    +

    N

    +

    Y

    +

    Y

    +
    +

    Как реализовать пример схемы

    Создание схемы

    Сначала мы создадим экземпляр клиента Milvus, который можно использовать для подключения к серверу Milvus и управления коллекциями и данными.

    +

    Чтобы создать схему, мы используем create_schema() для создания объекта схемы и add_field() для добавления полей в схему.

    +
    from pymilvus import MilvusClient, DataType​
    +​
    +collection_name = "my_collection"​
    +​
    +# client = MilvusClient(uri="http://localhost:19530")​
    +client = MilvusClient(uri="./milvus_demo.db")​
    +​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +)​
    +​
    +schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, description="article id")​
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200, description="article title")​
    +schema.add_field(field_name="author_info", datatype=DataType.JSON, description="author information")​
    +schema.add_field(field_name="publish_ts", datatype=DataType.INT32, description="publish timestamp")​
    +schema.add_field(field_name="image_url", datatype=DataType.VARCHAR,  max_length=500, description="image URL")​
    +schema.add_field(field_name="image_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="image vector")​
    +schema.add_field(field_name="summary", datatype=DataType.VARCHAR, max_length=1000, description="article summary")​
    +schema.add_field(field_name="summary_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="summary dense vector")​
    +schema.add_field(field_name="summary_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="summary sparse vector")​
    +
    +
    +

    Вы можете заметить аргумент uri в MilvusClient, который используется для подключения к серверу Milvus. Вы можете задать эти аргументы следующим образом.

    +
      +
    • Если вам нужна локальная векторная база данных только для небольших масштабов данных или создания прототипов, установка uri в качестве локального файла, например,./milvus.db, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле.

    • +
    • Если у вас большой объем данных, скажем, более миллиона векторов, вы можете настроить более производительный сервер Milvus на Docker или Kubernetes. В этом случае используйте адрес и порт сервера в качестве uri, например,http://localhost:19530. Если вы включили функцию аутентификации на Milvus, используйте "<ваше_имя_пользователя>:<ваш_пароль>" в качестве токена, в противном случае не задавайте токен.

    • +
    • Если вы используете Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте uri и token, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.

    • +
    +

    Что касается auto_id в MilvusClient.create_schema, AutoID - это атрибут первичного поля, который определяет, нужно ли включать автоматическое приращение для первичного поля. Поскольку мы установили полеarticle_id в качестве первичного ключа и хотим добавлять id статьи вручную, мы установили auto_id False, чтобы отключить эту функцию.

    +

    После добавления всех полей в объект схемы наш объект схемы соответствует записям в таблице выше.

    +

    Определение индекса

    После определения схемы с различными полями, включая метаданные и векторные поля для изображений и сводных данных, на следующем этапе необходимо подготовить параметры индекса. Индексирование имеет решающее значение для оптимизации поиска и извлечения векторов, обеспечивая эффективную работу запросов. В следующем разделе мы определим параметры индекса для указанных векторных и скалярных полей в коллекции.

    +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="image_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_dense_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_sparse_vector",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="publish_ts",​
    +    index_type="INVERTED",​
    +)​
    +
    +
    +

    После настройки и применения параметров индекса Milvus оптимизируется для обработки сложных запросов к векторным и скалярным данным. Такое индексирование повышает производительность и точность поиска по сходству в коллекции, позволяя эффективно извлекать статьи, основанные на векторах изображений и суммарных векторах. Благодаря использованию AUTOINDEX для плотных векторов, SPARSE_INVERTED_INDEX для разреженных векторов и INVERTED_INDEX для скаляров, Milvus может быстро определять и возвращать наиболее релевантные результаты, значительно повышая общий пользовательский опыт и эффективность процесса поиска данных.

    +

    Существует множество типов индексов и метрик. Для получения дополнительной информации о них вы можете обратиться к разделам Тип индекса Milvus и Тип метрики Milvus.

    +

    Создание коллекции

    Определив схему и индексы, мы создаем "коллекцию" с этими параметрами. Коллекция для Milvus - это как таблица для реляционной БД.

    +
    client.create_collection(​
    +    collection_name=collection_name,​
    +    schema=schema,​
    +    index_params=index_params,​
    +)​
    +
    +
    +

    Мы можем проверить, что коллекция была успешно создана, описав ее.

    +
    collection_desc = client.describe_collection(​
    +    collection_name=collection_name​
    +)​
    +print(collection_desc)​
    +
    +
    +

    Другие соображения

    Загрузка индекса

    При создании коллекции в Milvus вы можете выбрать загрузку индекса сразу или отложить ее до массового ввода данных. Как правило, вам не нужно делать явный выбор, так как приведенные выше примеры показывают, что индекс автоматически создается для всех поступающих данных сразу после создания коллекции. Это обеспечивает немедленный поиск по поступившим данным. Однако если после создания коллекции выполняется большая массовая вставка и поиск данных не требуется до определенного момента, можно отложить построение индекса, опустив index_params в создании коллекции, и построить индекс, вызвав load явно после того, как будут получены все данные. Этот метод более эффективен для построения индекса на большой коллекции, но поиск не может быть выполнен до вызова load().

    +

    Как определить модель данных для нескольких арендаторов

    Концепция нескольких арендаторов обычно используется в сценариях, когда одно программное приложение или сервис должны обслуживать несколько независимых пользователей или организаций, каждая из которых имеет свою собственную изолированную среду. Это часто встречается в облачных вычислениях, приложениях SaaS (Software as a Service) и системах баз данных. Например, в облачном сервисе хранения данных может использоваться многопользовательский подход, позволяющий разным компаниям хранить и управлять своими данными отдельно, используя при этом одну и ту же базовую инфраструктуру. Такой подход позволяет максимально эффективно использовать ресурсы, обеспечивая при этом безопасность и конфиденциальность данных для каждого арендатора.

    +

    Самый простой способ разграничить арендаторов - изолировать их данные и ресурсы друг от друга. Каждый арендатор либо имеет эксклюзивный доступ к определенным ресурсам, либо использует ресурсы совместно с другими для управления такими сущностями Milvus, как базы данных, коллекции и разделы. Для реализации многопользовательского режима Milvus существуют специальные методы, согласованные с этими сущностями. Для получения дополнительной информации вы можете обратиться к странице Milvus multi-tenancy.

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/schema.json b/localization/v2.5.x/site/ru/userGuide/schema/schema.json new file mode 100644 index 000000000..aaf1d5fc5 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = []​\n\n","export schema='{​\n \"fields\": []​\n}'​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=False,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(false)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n // highlight-start​\n is_primary_key: true,​\n autoID: false​\n // highlight-end​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema='{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}'​\n\n","schema.add_field(​\n field_name=\"my_vector\",​\n datatype=DataType.FLOAT_VECTOR,​\n # highlight-next-line​\n dim=5​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n // highlight-next-line​\n .dimension(5)​\n .build());​\n\n","schema.push({​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n // highlight-next-line​\n dim: 5​\n});​\n\n","export vectorField='{​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_varchar\",​\n datatype=DataType.VARCHAR,​\n # highlight-next-line​\n max_length=512​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n // highlight-next-line​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n // highlight-next-line​\n max_length: 512​\n});​\n\n","export varCharField='{​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 256​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_int64\",​\n datatype=DataType.INT64,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_int64\")​\n .dataType(DataType.Int64)​\n .build());​\n\n","schema.push({​\n name: \"my_int64\",​\n data_type: DataType.Int64,​\n});​\n\n","export int64Field='{​\n \"fieldName\": \"my_int64\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_bool\",​\n datatype=DataType.BOOL,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_bool\")​\n .dataType(DataType.Bool)​\n .build());​\n\n","schema.push({​\n name: \"my_bool\",​\n data_type: DataType.Boolean,​\n});​\n\n","export boolField='{​\n \"fieldName\": \"my_bool\",​\n \"dataType\": \"Boolean\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_json\",​\n datatype=DataType.JSON,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_json\")​\n .dataType(DataType.JSON)​\n .build());​\n\n","schema.push({​\n name: \"my_json\",​\n data_type: DataType.JSON,​\n});​\n\n","export jsonField='{​\n \"fieldName\": \"my_json\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_array\",​\n datatype=DataType.ARRAY,​\n element_type=DataType.VARCHAR,​\n max_capacity=5,​\n max_length=512,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_array\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(5)​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_array\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 5,​\n max_length: 512​\n});​\n\n","export arrayField='{​\n \"fieldName\": \"my_array\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField,​\n $arrayField​\n ]​\n}\"​\n\n"],"headingContent":"Schema Explained​","anchorList":[{"label":"Объяснение схемы","href":"Schema-Explained​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создание схемы","href":"Create-Schema​","type":2,"isActive":false},{"label":"Добавление первичного поля","href":"Add-Primary-Field​","type":2,"isActive":false},{"label":"Добавление векторных полей","href":"Add-Vector-Fields​","type":2,"isActive":false},{"label":"Добавление скалярных полей","href":"Add-Scalar-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/schema.md b/localization/v2.5.x/site/ru/userGuide/schema/schema.md new file mode 100644 index 000000000..d930888b3 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/schema.md @@ -0,0 +1,453 @@ +--- +id: schema.md +title: Объяснение схемы +summary: >- + Схема определяет структуру данных коллекции. Прежде чем создавать коллекцию, + необходимо разработать ее схему. Эта страница поможет вам понять схему + коллекции и самостоятельно разработать пример схемы. +--- +

    Объяснение схемы

    Схема определяет структуру данных коллекции. Прежде чем создавать коллекцию, необходимо разработать ее схему. Эта страница поможет вам понять схему коллекции и самостоятельно разработать пример схемы.

    +

    Обзор

    В Milvus схема коллекции представляет собой таблицу в реляционной базе данных, которая определяет, как Milvus организует данные в коллекции.

    +

    Хорошо разработанная схема очень важна, поскольку она абстрагирует модель данных и решает, можно ли достичь бизнес-целей с помощью поиска. Кроме того, поскольку каждая строка данных, вставляемая в коллекцию, должна соответствовать схеме, это помогает поддерживать согласованность данных и долгосрочное качество. С технической точки зрения четко определенная схема приводит к хорошо организованному хранению данных в столбцах и более чистой структуре индексов, что повышает производительность поиска.

    +

    Схема коллекции имеет первичный ключ, максимум четыре векторных поля и несколько скалярных полей. На следующей схеме показано, как сопоставить статью со списком полей схемы.

    +

    + + Schema design + Проектирование схемы

    +

    Проектирование модели данных поисковой системы включает в себя анализ потребностей бизнеса и абстрагирование информации в виде модели данных, выраженной в виде схемы. Например, поиск по фрагменту текста должен быть "проиндексирован" путем преобразования буквенной строки в вектор с помощью "встраивания" и включения векторного поиска. Помимо этого основного требования, может потребоваться хранение других свойств, таких как временная метка публикации и автор. Эти метаданные позволяют уточнять семантический поиск с помощью фильтрации, возвращая только тексты, опубликованные после определенной даты или определенным автором. Вы также можете получить эти скаляры вместе с основным текстом, чтобы отобразить результат поиска в приложении. Для упорядочивания этих фрагментов текста каждому из них должен быть присвоен уникальный идентификатор, выраженный в виде целого числа или строки. Эти элементы необходимы для реализации сложной логики поиска.

    +

    Обратитесь к Schema Design Hands-On, чтобы узнать, как создать хорошо продуманную схему.

    +

    Создание схемы

    Следующий фрагмент кода демонстрирует, как создать схему.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = []​
    +
    +
    +
    export schema='{​
    +    "fields": []​
    +}'​
    +
    +
    +

    Добавление первичного поля

    Первичное поле в коллекции уникально идентифицирует сущность. Оно принимает только значения Int64 или VarChar. Следующие фрагменты кода демонстрируют, как добавить первичное поле.

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=False,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.Int64,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: false​
    +    // highlight-end​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema='{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}'​
    +
    +
    +

    При добавлении поля вы можете явно указать его как первичное, установив для свойства is_primary значение True. По умолчанию первичное поле принимает значения Int64. В этом случае значение первичного поля должно быть целым числом, как на 12345. Если вы решили использовать в первичном поле значения VarChar, то значение должно быть строкой, как на my_entity_1234.

    +

    Вы также можете установить для свойства autoId значение True, чтобы Milvus автоматически выделял значения первичного поля при вставке данных.

    +

    Подробнее см. в разделе Первичное поле и автоидентификация.

    +

    Добавление векторных полей

    Векторные поля принимают различные разреженные и плотные векторные вложения. В Milvus вы можете добавить в коллекцию четыре векторных поля. Следующие фрагменты кода демонстрируют, как добавить векторное поле.

    + +
    schema.add_field(​
    +    field_name="my_vector",​
    +    datatype=DataType.FLOAT_VECTOR,​
    +    # highlight-next-line
    +    dim=5​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        // highlight-next-line​
    +        .dimension(5)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_vector",​
    +    data_type: DataType.FloatVector,​
    +    // highlight-next-line​
    +    dim: 5​
    +});​
    +
    +
    +
    export vectorField='{​
    +    "fieldName": "my_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    Параметр dim в приведенных выше фрагментах кода указывает на размерность векторных вкраплений, которые будут храниться в векторном поле. Значение FLOAT_VECTOR указывает на то, что векторное поле содержит список 32-битных плавающих чисел, которые обычно используются для представления антилогарифмов.Кроме того, Milvus также поддерживает следующие типы векторных вложений.

    +
      +
    • FLOAT16_VECTOR

      +

      Векторное поле этого типа содержит список 16-битных чисел с плавающей запятой половинной точности и обычно применяется в сценариях глубокого обучения или вычислений на базе GPU с ограничением памяти или пропускной способности.

    • +
    • BFLOAT16_VECTOR

      +

      Векторное поле этого типа содержит список 16-битных чисел с плавающей точкой, которые имеют пониженную точность, но тот же диапазон экспонент, что и Float32. Этот тип данных часто используется в сценариях глубокого обучения, так как позволяет сократить расход памяти без существенного влияния на точность.

    • +
    • BINARY_VECTOR

      +

      Векторное поле этого типа содержит список 0 и 1. Они служат компактными элементами для представления данных в сценариях обработки изображений и поиска информации.

    • +
    • SPARSE_FLOAT_VECTOR

      +

      Векторное поле этого типа содержит список ненулевых чисел и их порядковых номеров для представления разреженных векторных вкраплений.

    • +
    +

    Добавление скалярных полей

    В распространенных случаях вы можете использовать скалярные поля для хранения метаданных векторных вкраплений, хранящихся в Milvus, и проводить поиск по ANN с фильтрацией метаданных для повышения корректности результатов поиска. Milvus поддерживает несколько типов скалярных полей, включая VarChar, Boolean, Int, Float, Double, Array и JSON.

    +

    Добавление строковых полей

    В Milvus вы можете использовать поля VarChar для хранения строк. Подробнее о поле VarChar см. в разделе "Строковое поле".

    + +
    schema.add_field(​
    +    field_name="my_varchar",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-next-line
    +    max_length=512​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-next-line​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_varchar",​
    +    data_type: DataType.VarChar,​
    +    // highlight-next-line​
    +    max_length: 512​
    +});​
    +
    +
    +
    export varCharField='{​
    +    "fieldName": "my_varchar",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 256​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField​
    +    ]​
    +}"​
    +
    +
    +

    Добавление числовых полей

    Milvus поддерживает следующие типы чисел: Int8, Int16, Int32, Int64, Float и Double. Подробнее о числовых полях см. в разделе Числовое поле.

    + +
    schema.add_field(​
    +    field_name="my_int64",​
    +    datatype=DataType.INT64,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_int64")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_int64",​
    +    data_type: DataType.Int64,​
    +});​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "my_int64",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field​
    +    ]​
    +}"​
    +
    +
    +

    Добавление булевых полей

    Milvus поддерживает булевы поля. В следующих фрагментах кода показано, как добавить булево поле.

    + +
    schema.add_field(​
    +    field_name="my_bool",​
    +    datatype=DataType.BOOL,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_bool")​
    +        .dataType(DataType.Bool)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_bool",​
    +    data_type: DataType.Boolean,​
    +});​
    +
    +
    +
    export boolField='{​
    +    "fieldName": "my_bool",​
    +    "dataType": "Boolean"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField​
    +    ]​
    +}"​
    +
    +
    +

    Добавление полей JSON

    В поле JSON обычно хранятся полуструктурированные данные в формате JSON. Подробнее о полях JSON читайте в разделе Поле JSON.

    + +
    schema.add_field(​
    +    field_name="my_json",​
    +    datatype=DataType.JSON,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_json")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_json",​
    +    data_type: DataType.JSON,​
    +});​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "my_json",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField​
    +    ]​
    +}"​
    +
    +
    +

    Добавление полей массива

    Поле массива хранит список элементов. Типы данных всех элементов в поле массива должны быть одинаковыми. Подробнее о полях массива см. в разделе Поле массива.

    + +
    schema.add_field(​
    +    field_name="my_array",​
    +    datatype=DataType.ARRAY,​
    +    element_type=DataType.VARCHAR,​
    +    max_capacity=5,​
    +    max_length=512,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_array")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(5)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_array",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 5,​
    +    max_length: 512​
    +});​
    +
    +
    +
    export arrayField='{​
    +    "fieldName": "my_array",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 512​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField,​
    +        $arrayField​
    +    ]​
    +}"​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.json b/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.json new file mode 100644 index 000000000..25484a4ad --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.json @@ -0,0 +1 @@ +{"codeList":["from scipy.sparse import csr_matrix​\n​\n# Create a sparse matrix​\nrow = [0, 0, 1, 2, 2, 2]​\ncol = [0, 2, 2, 0, 1, 2]​\ndata = [1, 2, 3, 4, 5, 6]​\nsparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​\n​\n# Represent sparse vector using the sparse matrix​\nsparse_vector = sparse_matrix.getrow(0)​\n\n","# Represent sparse vector using a dictionary​\nsparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​\n\n","SortedMap sparseVector = new TreeMap<>();​\nsparseVector.put(1L, 0.5f);​\nsparseVector.put(100L, 0.3f);​\nsparseVector.put(500L, 0.8f);​\nsparseVector.put(1024L, 0.2f);​\nsparseVector.put(5000L, 0.6f);​\n\n","# Represent sparse vector using a list of tuples​\nsparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.drop_collection(collection_name=\"my_sparse_collection\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse_vector\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"sparse_vector\",​\n data_type: DataType.SparseFloatVector,​\n }​\n];​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"sparse_vector\",​\n \"dataType\": \"SparseFloatVector\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse_vector\",​\n index_name=\"sparse_inverted_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n params={\"drop_ratio_build\": 0.2},​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"drop_ratio_build\", 0.2);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"sparse_vector\")​\n .indexName(\"sparse_inverted_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","const indexParams = await client.createIndex({​\n index_name: 'sparse_inverted_index',​\n field_name: 'sparse_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.SPARSE_WAND,​\n params: {​\n drop_ratio_build: 0.2,​\n },​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"sparse_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_inverted_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\",​\n \"params\":{\"drop_ratio_build\": 0.2}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_sparse_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_sparse_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_sparse_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","sparse_vectors = [​\n {\"sparse_vector\": {1: 0.5, 100: 0.3, 500: 0.8}},​\n {\"sparse_vector\": {10: 0.1, 200: 0.7, 1000: 0.9}},​\n]​\n​\nclient.insert(​\n collection_name=\"my_sparse_collection\",​\n data=sparse_vectors​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(1L, 0.5f);​\n sparse.put(100L, 0.3f);​\n sparse.put(500L, 0.8f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(10L, 0.1f);​\n sparse.put(200L, 0.7f);​\n sparse.put(1000L, 0.9f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { sparse_vector: { \"1\": 0.5, \"100\": 0.3, \"500\": 0.8 } },​\n { sparse_vector: { \"10\": 0.1, \"200\": 0.7, \"1000\": 0.9 } },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"sparse_vector\": {\"1\": 0.5, \"100\": 0.3, \"500\": 0.8}},​\n {\"sparse_vector\": {\"10\": 0.1, \"200\": 0.7, \"1000\": 0.9}} ​\n ],​\n \"collectionName\": \"my_sparse_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572534\",\"453577185629572535\"]}}​\n\n","# Prepare search parameters​\nsearch_params = {​\n \"params\": {\"drop_ratio_search\": 0.2}, # Additional optional search parameters​\n}​\n​\n# Prepare the query vector​\nquery_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​\n\n","res = client.search(​\n collection_name=\"my_sparse_collection\",​\n data=query_vector,​\n limit=3,​\n output_fields=[\"pk\"],​\n search_params=search_params,​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"drop_ratio_search\", 0.2);​\n​\nSortedMap sparse = new TreeMap<>();​\nsparse.put(10L, 0.1f);​\nsparse.put(200L, 0.7f);​\nsparse.put(1000L, 0.9f);​\n​\nSparseFloatVec queryVector = new SparseFloatVec(sparse);​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"sparse_vector\")​\n .searchParams(searchParams)​\n .topK(3)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​\n\n","client.search({​\n collection_name: 'my_sparse_collection',​\n data: {1: 0.2, 50: 0.4, 1000: 0.7},​\n limit: 3,​\n output_fields: ['pk'],​\n params: {​\n drop_ratio_search: 0.2​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_sparse_collection\",​\n \"data\": [​\n {\"1\": 0.2, \"50\": 0.4, \"1000\": 0.7}​\n ],​\n \"annsField\": \"sparse_vector\",​\n \"limit\": 3,​\n \"searchParams\":{​\n \"params\":{\"drop_ratio_search\": 0.2}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.63,\"id\":\"453577185629572535\",\"pk\":\"453577185629572535\"},{\"distance\":0.1,\"id\":\"453577185629572534\",\"pk\":\"453577185629572534\"}]}​\n\n"],"headingContent":"Sparse Vector​","anchorList":[{"label":"Разреженный вектор","href":"Sparse-Vector​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование разреженных векторов в Milvus","href":"Use-sparse-vectors-in-Milvus​","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.md b/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.md new file mode 100644 index 000000000..46f11d5a3 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/sparse_vector.md @@ -0,0 +1,537 @@ +--- +id: sparse_vector.md +title: Разреженный вектор +summary: >- + Разреженные векторы - важный метод представления данных в информационном + поиске и обработке естественного языка. Хотя плотные векторы популярны + благодаря своим отличным возможностям семантического понимания, разреженные + векторы часто дают более точные результаты, когда речь идет о приложениях, + требующих точного сопоставления ключевых слов или фраз. +--- +

    Разреженный вектор

    Разреженные векторы - важный метод представления данных в информационном поиске и обработке естественного языка. Хотя плотные векторы популярны благодаря своим отличным возможностям семантического понимания, разреженные векторы часто дают более точные результаты, когда речь идет о приложениях, требующих точного соответствия ключевых слов или фраз.

    +

    Обзор

    Разреженный вектор - это особое представление высокоразмерных векторов, в котором большинство элементов равны нулю, и только несколько измерений имеют ненулевые значения. Эта характеристика делает разреженные векторы особенно эффективными при работе с крупномасштабными, высокоразмерными, но разреженными данными. К числу распространенных приложений относятся.

    +
      +
    • Анализ текста: Представление документов в виде векторов "мешок слов", где каждое измерение соответствует слову, и только слова, встречающиеся в документе, имеют ненулевые значения.

    • +
    • Рекомендательные системы: Матрицы взаимодействия пользователя и элемента, где каждое измерение представляет собой оценку пользователем определенного элемента, причем большинство пользователей взаимодействуют только с несколькими элементами.

    • +
    • Обработка изображений: Локальное представление признаков, сосредоточенное только на ключевых точках изображения, в результате чего получаются высокоразмерные разреженные векторы.

    • +
    +

    Как показано на диаграмме ниже, плотные векторы обычно представляются в виде непрерывных массивов, где каждая позиция имеет значение (например, [0.3, 0.8, 0.2, 0.3, 0.1]). В отличие от них, разреженные векторы хранят только ненулевые элементы и их индексы, часто представляемые в виде пар ключ-значение (например, [{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}]). Такое представление значительно сокращает объем памяти и повышает эффективность вычислений, особенно при работе с очень высокоразмерными данными (например, 10 000 измерений).

    +

    + + Spare vector representation + Представление разреженных векторов

    +

    Разреженные векторы могут быть сгенерированы с помощью различных методов, таких как TF-IDF (Term Frequency-Inverse Document Frequency) и BM25 в обработке текстов. Кроме того, Milvus предлагает удобные методы, помогающие генерировать и обрабатывать разреженные векторы. Подробнее см. в разделе "Вкрапления".

    +

    Для текстовых данных Milvus также предоставляет возможности полнотекстового поиска, позволяя выполнять векторный поиск непосредственно в необработанных текстовых данных без использования внешних моделей встраивания для генерации разреженных векторов. Дополнительную информацию см. в разделе Полнотекстовый поиск.

    +

    После векторизации данные можно хранить в Milvus для управления и поиска векторов. На схеме ниже показан основной процесс.

    +

    + + Use sparse vector in Milvus + Использование разреженного вектора в Milvus

    +
    +

    Помимо разреженных векторов, Milvus также поддерживает плотные векторы и двоичные векторы. Плотные векторы идеально подходят для фиксации глубоких семантических связей, а двоичные векторы - для таких сценариев, как быстрое сравнение сходства и дедупликация контента. Дополнительные сведения см. в разделах "Плотный вектор" и "Двоичный вектор".

    +
    +

    Использование разреженных векторов в Milvus

    Milvus поддерживает представление разреженных векторов в любом из следующих форматов.

    +
      +
    • Разреженная матрица (с использованием класса scipy.sparse ).

      +

      +
      from scipy.sparse import csr_matrix​
      +​
      +# Create a sparse matrix​
      +row = [0, 0, 1, 2, 2, 2]​
      +col = [0, 2, 2, 0, 1, 2]​
      +data = [1, 2, 3, 4, 5, 6]​
      +sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​
      +​
      +# Represent sparse vector using the sparse matrix​
      +sparse_vector = sparse_matrix.getrow(0)​
      +
      +
    • +
    • Список словарей (в формате {dimension_index: value, ...})

      +

      +
      # Represent sparse vector using a dictionary​
      +sparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​
      +
      +
      +
      SortedMap<Long, Float> sparseVector = new TreeMap<>();​
      +sparseVector.put(1L, 0.5f);​
      +sparseVector.put(100L, 0.3f);​
      +sparseVector.put(500L, 0.8f);​
      +sparseVector.put(1024L, 0.2f);​
      +sparseVector.put(5000L, 0.6f);​
      +
      +
    • +
    • Список итераторов кортежей (в формате [(dimension_index, value)])

      +

      +
      # Represent sparse vector using a list of tuples​
      +sparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​
      +
      +
    • +
    +

    Добавьте векторное поле

    Чтобы использовать разреженные векторы в Milvus, при создании коллекции определите поле для хранения разреженных векторов. Этот процесс включает в себя.

    +
      +
    1. Установка datatype в поддерживаемый тип данных разреженного вектора, SPARSE_FLOAT_VECTOR.

    2. +
    3. Размерность указывать не нужно.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +client.drop_collection(collection_name="my_sparse_collection")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse_vector")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "sparse_vector",​
    +    data_type: DataType.SparseFloatVector,​
    +  }​
    +];​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "sparse_vector",​
    +    "dataType": "SparseFloatVector"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    В этом примере для хранения разреженных векторов добавлено векторное поле с именем sparse_vector. Тип данных этого поля - SPARSE_FLOAT_VECTOR.

    +

    Установка параметров индекса для векторного поля

    Процесс создания индекса для разреженных векторов аналогичен процессу создания индекса для плотных векторов, но с отличиями в заданном типе индекса (index_type), метрике расстояния (metric_type) и параметрах индекса (params).

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse_vector",​
    +    index_name="sparse_inverted_index",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +    params={"drop_ratio_build": 0.2},​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("drop_ratio_build", 0.2);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("sparse_vector")​
    +        .indexName("sparse_inverted_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    const indexParams = await client.createIndex({​
    +    index_name: 'sparse_inverted_index',​
    +    field_name: 'sparse_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.SPARSE_WAND,​
    +    params: {​
    +      drop_ratio_build: 0.2,​
    +    },​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "sparse_vector",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_inverted_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX",​
    +            "params":{"drop_ratio_build": 0.2}​
    +        }​
    +    ]'​
    +
    +
    +

    В примере выше.

    +
      +
    • Для разреженного вектора создается индекс типа SPARSE_INVERTED_INDEX. Для разреженных векторов можно указать SPARSE_INVERTED_INDEX или SPARSE_WAND. Подробнее см. в разделе Индексы разреженных векторов.

    • +
    • Для разреженных векторов metric_type поддерживает только IP (внутреннее произведение), используемое для измерения сходства между двумя разреженными векторами. Дополнительные сведения о сходстве см. в разделе Метрические типы.

    • +
    • drop_ratio_build это необязательный параметр индекса, специально предназначенный для разреженных векторов. Он управляет долей малых значений вектора, исключаемых при построении индекса. Например, при значении {"drop_ratio_build": 0.2} наименьшие 20 % значений вектора будут исключены при создании индекса, что сократит вычислительные усилия при поиске.

    • +
    +

    Создание коллекции

    После завершения настройки разреженных векторов и индексов можно создать коллекцию, содержащую разреженные векторы. В примере ниже используется create_collection для создания коллекции с именем my_sparse_collection.

    + +
    client.create_collection(​
    +    collection_name="my_sparse_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_sparse_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_sparse_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции вставьте данные, содержащие разреженные векторы.

    + +
    sparse_vectors = [​
    +    {"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}},​
    +    {"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_sparse_collection",​
    +    data=sparse_vectors​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(1L, 0.5f);​
    +    sparse.put(100L, 0.3f);​
    +    sparse.put(500L, 0.8f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(10L, 0.1f);​
    +    sparse.put(200L, 0.7f);​
    +    sparse.put(1000L, 0.9f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { sparse_vector: { "1": 0.5, "100": 0.3, "500": 0.8 } },​
    +  { sparse_vector: { "10": 0.1, "200": 0.7, "1000": 0.9 } },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"sparse_vector": {"1": 0.5, "100": 0.3, "500": 0.8}},​
    +        {"sparse_vector": {"10": 0.1, "200": 0.7, "1000": 0.9}}        ​
    +    ],​
    +    "collectionName": "my_sparse_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572534","453577185629572535"]}}​
    +
    +
    +

    Выполнить поиск по сходству

    Чтобы выполнить поиск по сходству с использованием разреженных векторов, подготовьте вектор запроса и параметры поиска.

    + +
    # Prepare search parameters​
    +search_params = {​
    +    "params": {"drop_ratio_search": 0.2},  # Additional optional search parameters​
    +}​
    +​
    +# Prepare the query vector​
    +query_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​
    +
    +
    +

    В этом примере drop_ratio_search - необязательный параметр специально для разреженных векторов, позволяющий тонко настраивать малые значения в векторе запроса во время поиска. Например, при использовании {"drop_ratio_search": 0.2} наименьшие 20 % значений в векторе запроса будут игнорироваться во время поиска.

    +

    Затем выполните поиск сходства, используя метод search.

    + +
    res = client.search(​
    +    collection_name="my_sparse_collection",​
    +    data=query_vector,​
    +    limit=3,​
    +    output_fields=["pk"],​
    +    search_params=search_params,​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("drop_ratio_search", 0.2);​
    +​
    +SortedMap<Long, Float> sparse = new TreeMap<>();​
    +sparse.put(10L, 0.1f);​
    +sparse.put(200L, 0.7f);​
    +sparse.put(1000L, 0.9f);​
    +​
    +SparseFloatVec queryVector = new SparseFloatVec(sparse);​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("sparse_vector")​
    +        .searchParams(searchParams)​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_sparse_collection',​
    +    data: {1: 0.2, 50: 0.4, 1000: 0.7},​
    +    limit: 3,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        drop_ratio_search: 0.2​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_sparse_collection",​
    +    "data": [​
    +        {"1": 0.2, "50": 0.4, "1000": 0.7}​
    +    ],​
    +    "annsField": "sparse_vector",​
    +    "limit": 3,​
    +    "searchParams":{​
    +        "params":{"drop_ratio_search": 0.2}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.63,"id":"453577185629572535","pk":"453577185629572535"},{"distance":0.1,"id":"453577185629572534","pk":"453577185629572534"}]}​
    +
    +
    +

    Дополнительные сведения о параметрах поиска по сходству см. в разделе Базовый поиск ANN.

    +

    Ограничения

    При использовании разреженных векторов в Milvus учитывайте следующие ограничения:

    +
      +
    • В настоящее время для разреженных векторов поддерживаются только метрики расстояния IP и BM25 (для полнотекстового поиска). Высокая размерность разреженных векторов делает L2 и косинусное расстояние нецелесообразными.

    • +
    • Для полей разреженных векторов поддерживаются только типы индексов SPARSE_INVERTED_INDEX и SPARSE_WAND.

    • +
    • Типы данных, поддерживаемые для разреженных векторов:

      +
        +
      • Размерная часть должна быть беззнаковым 32-битным целым числом;
      • +
      • Часть значения может быть неотрицательным 32-битным числом с плавающей точкой.
      • +
    • +
    • Разреженные векторы должны удовлетворять следующим требованиям для вставки и поиска:

      +
        +
      • Хотя бы одно значение в векторе ненулевое;
      • +
      • Индексы вектора неотрицательны.
      • +
    • +
    +

    ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

      +
    • Можете ли вы объяснить разницу между SPARSE_INVERTED_INDEX и SPARSE_WAND, и как мне выбрать между ними?

      +

      SPARSE_INVERTED_INDEX - это традиционный инвертированный индекс, в то время как SPARSE_WAND использует алгоритм Weak-AND для уменьшения количества полных оценок IP-расстояния во время поиска. SPARSE_WAND обычно быстрее, но его производительность может снижаться с увеличением плотности векторов. Чтобы выбрать один из них, проведите эксперименты и бенчмарки, основанные на конкретном наборе данных и сценарии использования.

    • +
    • Как выбрать параметры drop_ratio_build и drop_ratio_search?

      +

      Выбор параметров drop_ratio_build и drop_ratio_search зависит от характеристик ваших данных и ваших требований к задержке/пропускной способности и точности поиска.

    • +
    • Может ли размерность разреженного вложения быть любой дискретной величиной в пространстве uint32?

      +

      Да, за одним исключением. Размерность разреженного вкрапления может быть любой величиной в диапазоне [0, maximum of uint32). Это означает, что вы не можете использовать максимальное значение uint32.

    • +
    • Поиск в растущих сегментах осуществляется через индекс или методом грубой силы?

      +

      Поиск по растущим сегментам осуществляется через индекс того же типа, что и индекс запечатанного сегмента. Для новых растущих сегментов до построения индекса используется поиск методом грубой силы.

    • +
    • Можно ли в одной коллекции иметь как разреженные, так и плотные векторы?

      +

      Да, благодаря поддержке нескольких типов векторов можно создавать коллекции, содержащие как разреженные, так и плотные векторные столбцы, и выполнять в них гибридный поиск.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/string.json b/localization/v2.5.x/site/ru/userGuide/schema/string.json new file mode 100644 index 000000000..48650b1c0 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/string.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\n# define schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"varchar_field1\", datatype=DataType.VARCHAR, max_length=100)​\nschema.add_field(field_name=\"varchar_field2\", datatype=DataType.VARCHAR, max_length=200)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field1\")​\n .dataType(DataType.VarChar)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field2\")​\n .dataType(DataType.VarChar)​\n .maxLength(200)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"varchar_field2\",​\n data_type: DataType.VarChar,​\n max_length: 200,​\n },​\n {​\n name: \"varchar_field1\",​\n data_type: DataType.VarChar,​\n max_length: 100,​\n },​\n];​\n\n","export varcharField1='{​\n \"fieldName\": \"varchar_field1\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport varcharField2='{​\n \"fieldName\": \"varchar_field2\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 200​\n }​\n}'​\n​\nexport primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $varcharField1,​\n $varcharField2,​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"varchar_field1\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"varchar_index\"​\n)​\n\n","​\nimport io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"varchar_field1\")​\n .indexName(\"varchar_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'varchar_index',​\n field_name: 'varchar_field1',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metric_type: MetricType.COSINE,​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_varchar_collection\",​\n schema: schema,​\n index_params: index_params​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_varchar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n## {\"code\":0,\"data\":{}}​\n\n","data = [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_varchar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product A\\\", \\\"varchar_field2\\\": \\\"High quality product\\\", \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product B\\\", \\\"varchar_field2\\\": \\\"Affordable price\\\", \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product C\\\", \\\"varchar_field2\\\": \\\"Best seller\\\", \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n varchar_field1: \"Product A\",​\n varchar_field2: \"High quality product\",​\n pk: 1,​\n embedding: [0.1, 0.2, 0.3],​\n },​\n {​\n varchar_field1: \"Product B\",​\n varchar_field2: \"Affordable price\",​\n pk: 2,​\n embedding: [0.4, 0.5, 0.6],​\n },​\n {​\n varchar_field1: \"Product C\",​\n varchar_field2: \"Best seller\",​\n pk: 3,​\n embedding: [0.7, 0.8, 0.9],​\n },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_varchar_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":3,\"insertIds\":[1,2,3]}}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.query(​\n collection_name=\"my_varchar_collection\",​\n filter=filter,​\n output_fields=[\"varchar_field1\", \"varchar_field2\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​\n\n","client.query({​\n collection_name: 'my_varchar_collection',​\n filter: 'varchar_field1 == \"Product A\"',​\n output_fields: ['varchar_field1', 'varchar_field2']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\",​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"]​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":[{\"pk\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.search(​\n collection_name=\"my_varchar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"varchar_field1\", \"varchar_field2\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_varchar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['varchar_field1', 'varchar_field2'],​\n filter: 'varchar_field1 == \"Product A\"'​\n params: {​\n nprobe:10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"],​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.2364331,\"id\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n"],"headingContent":"String Field​","anchorList":[{"label":"Строковое поле","href":"String-Field​","type":1,"isActive":false},{"label":"Добавление поля VARCHAR","href":"Add-VARCHAR-field​","type":2,"isActive":false},{"label":"Установка индексных параметров","href":"Set-index-params​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-collection​","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data​","type":2,"isActive":false},{"label":"Поиск и запросы","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/string.md b/localization/v2.5.x/site/ru/userGuide/schema/string.md new file mode 100644 index 000000000..f0673aa5b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/string.md @@ -0,0 +1,560 @@ +--- +id: string.md +title: Строковое поле +summary: >- + В Milvus VARCHAR - это тип данных, используемый для хранения данных строкового + типа, подходящий для хранения строк переменной длины. Он может хранить строки + как с однобайтовыми, так и с многобайтовыми символами, с максимальной длиной + до 65 535 символов. При определении поля VARCHAR необходимо также указать + параметр максимальной длины max_length. Строковый тип VARCHAR обеспечивает + эффективный и гибкий способ хранения и управления текстовыми данными, что + делает его идеальным для приложений, работающих со строками различной длины. +--- +

    Строковое поле

    В Milvus VARCHAR - это тип данных, используемый для хранения данных строкового типа, подходящий для хранения строк переменной длины. Он может хранить строки как с однобайтовыми, так и с многобайтовыми символами, с максимальной длиной до 65 535 символов. При определении поля VARCHAR необходимо также указать параметр максимальной длины max_length. Строковый тип VARCHAR обеспечивает эффективный и гибкий способ хранения и управления текстовыми данными, что делает его идеальным для приложений, работающих со строками различной длины.

    +

    Добавление поля VARCHAR

    Чтобы использовать строковые данные в Milvus, определите поле VARCHAR при создании коллекции. Этот процесс включает в себя.

    +
      +
    1. Установка datatype в качестве поддерживаемого типа строковых данных, т. е. VARCHAR.

    2. +
    3. Указание максимальной длины строкового типа с помощью параметра max_length, которая не может превышать 60 535 символов.

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +# define schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="varchar_field1", datatype=DataType.VARCHAR, max_length=100)​
    +schema.add_field(field_name="varchar_field2", datatype=DataType.VARCHAR, max_length=200)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field1")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field2")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(200)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "varchar_field2",​
    +    data_type: DataType.VarChar,​
    +    max_length: 200,​
    +  },​
    +  {​
    +    name: "varchar_field1",​
    +    data_type: DataType.VarChar,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    export varcharField1='{​
    +    "fieldName": "varchar_field1",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export varcharField2='{​
    +    "fieldName": "varchar_field2",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 200​
    +    }​
    +}'​
    +​
    +export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $varcharField1,​
    +        $varcharField2,​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    В этом примере мы добавляем два поля VARCHAR: varchar_field1 и varchar_field2, максимальная длина которых установлена на 100 и 200 символов соответственно. Рекомендуется устанавливать значение max_length в зависимости от характеристик ваших данных, чтобы обеспечить размещение самых длинных данных, избегая при этом чрезмерного выделения места. Кроме того, мы добавили первичное поле pk и векторное поле embedding.

    +
    +

    Первичное поле и векторное поле являются обязательными при создании коллекции. Первичное поле уникально идентифицирует каждую сущность, а векторное поле очень важно для поиска по сходству. Дополнительные сведения см. в разделах Первичное поле и автоидентификация, Плотный вектор, Двоичный вектор или Разреженный вектор.

    +
    +

    Установка индексных параметров

    Установка параметров индекса для полей VARCHAR не является обязательной, но может значительно повысить эффективность поиска.

    +

    В следующем примере мы создаем AUTOINDEX для varchar_field1, что означает, что Milvus автоматически создаст соответствующий индекс на основе типа данных. Дополнительную информацию см. в разделе АВТОИНДЕКС.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="varchar_field1",​
    +    index_type="AUTOINDEX",​
    +    index_name="varchar_index"​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("varchar_field1")​
    +        .indexName("varchar_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'varchar_index',​
    +    field_name: 'varchar_field1',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    В дополнение к AUTOINDEX можно указать другие типы скалярных индексов, например INVERTED или BITMAP. Поддерживаемые типы индексов см. в разделе Скалярные индексы.

    +

    Кроме того, перед созданием коллекции необходимо создать индекс для векторного поля. В этом примере мы используем AUTOINDEX, чтобы упростить настройку векторного индекса.

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metric_type: MetricType.COSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Создание коллекции

    После того как схема и индекс определены, можно создать коллекцию, включающую строковые поля.

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_varchar_collection",​
    +    schema: schema,​
    +    index_params: index_params​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_varchar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +## {"code":0,"data":{}}​
    +
    +
    +

    Вставка данных

    После создания коллекции вы можете вставить данные, включающие строковые поля.

    + +
    data = [​
    +    {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_varchar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +    varchar_field1: "Product A",​
    +    varchar_field2: "High quality product",​
    +    pk: 1,​
    +    embedding: [0.1, 0.2, 0.3],​
    +  },​
    +  {​
    +    varchar_field1: "Product B",​
    +    varchar_field2: "Affordable price",​
    +    pk: 2,​
    +    embedding: [0.4, 0.5, 0.6],​
    +  },​
    +  {​
    +    varchar_field1: "Product C",​
    +    varchar_field2: "Best seller",​
    +    pk: 3,​
    +    embedding: [0.7, 0.8, 0.9],​
    +  },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_varchar_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":3,"insertIds":[1,2,3]}}​
    +
    +
    +

    В этом примере мы вставляем данные, включающие поля VARCHAR (varchar_field1 и varchar_field2), первичное поле (pk) и векторные представления (embedding). Чтобы убедиться, что вставляемые данные соответствуют полям, определенным в схеме, рекомендуется заранее проверить типы данных, чтобы избежать ошибок при вставке.

    +

    Если вы установите enable_dynamic_fields=True при определении схемы, Milvus позволит вам вставлять строковые поля, которые не были определены заранее. Однако имейте в виду, что это может увеличить сложность запросов и управления, что потенциально может повлиять на производительность. Дополнительную информацию см. в разделе Динамическое поле.

    +

    Поиск и запросы

    После добавления строковых полей вы можете использовать их для фильтрации в операциях поиска и запросов, добиваясь более точных результатов поиска.

    +

    Фильтр запросов

    После добавления строковых полей вы можете фильтровать результаты с помощью этих полей в запросах. Например, можно запросить все сущности, в которых varchar_field1 равно "Product A".

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.query(​
    +    collection_name="my_varchar_collection",​
    +    filter=filter,​
    +    output_fields=["varchar_field1", "varchar_field2"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_varchar_collection',​
    +    filter: 'varchar_field1 == "Product A"',​
    +    output_fields: ['varchar_field1', 'varchar_field2']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "filter": "varchar_field1 == \"Product A\"",​
    +    "outputFields": ["varchar_field1", "varchar_field2"]​
    +}'​
    +## {"code":0,"cost":0,"data":[{"pk":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    Это выражение запроса возвращает все совпадающие сущности и выводит их поля varchar_field1 и varchar_field2. Дополнительные сведения о фильтрации запросов см. в разделе Фильтрация метаданных.

    +

    Векторный поиск с фильтрацией строк

    В дополнение к базовой фильтрации скалярных полей можно комбинировать векторный поиск по сходству с фильтрами скалярных полей. Например, в следующем коде показано, как добавить фильтр скалярных полей в векторный поиск.

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.search(​
    +    collection_name="my_varchar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["varchar_field1", "varchar_field2"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_varchar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['varchar_field1', 'varchar_field2'],​
    +    filter: 'varchar_field1 == "Product A"'​
    +    params: {​
    +       nprobe:10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["varchar_field1", "varchar_field2"],​
    +    "filter": "varchar_field1 == \"Product A\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.2364331,"id":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    В этом примере мы сначала определяем вектор запроса и добавляем условие фильтра varchar_field1 == "Product A" во время поиска. Это гарантирует, что результаты поиска будут не только похожи на вектор запроса, но и будут соответствовать заданному условию строкового фильтра. Дополнительные сведения см. в разделе Фильтрация метаданных.

    diff --git a/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.json b/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.json new file mode 100644 index 000000000..082daf0cc --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"category\": \"electronics\",​\n \"price\": 99.99,​\n \"brand\": \"BrandA\"​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"metadata\")​\n .dataType(DataType.JSON)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export jsonField='{​\n \"fieldName\": \"metadata\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $jsonField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","​\nindex_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","const indexParams = {​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metricType: MetricType.CONSINE,​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_json_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_json_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_json_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_json_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# Data to be inserted​\ndata = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\n# Insert data into the collection​\nclient.insert(​\n collection_name=\"your_collection_name\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"home_appliances\\\", \\\"price\\\": 249.99, \\\"brand\\\": \\\"BrandB\\\"}, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"furniture\\\", \\\"price\\\": 399.99, \\\"brand\\\": \\\"BrandC\\\"}, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_json_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\nclient.insert({​\n collection_name: \"my_json_collection\",​\n data: data​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n } ​\n ],​\n \"collectionName\": \"my_json_collection\"​\n}'​\n\n","filter = 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150'​\n​\nres = client.query(​\n collection_name=\"my_json_collection\",​\n filter=filter,​\n output_fields=[\"metadata\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_json_collection\")​\n .filter(filter)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}, pk=1})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n output_fields: ['metadata']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"filter\": \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\",​\n \"outputFields\": [\"metadata\"]​\n}'​\n{\"code\":0,\"cost\":0,\"data\":[{\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\",\"pk\":1}]}​\n\n","filter = 'metadata[\"brand\"] == \"BrandA\"'​\n​\nres = client.search(​\n collection_name=\"my_json_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"metadata\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_json_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_json_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['metadata'],​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"metadata\"],​\n \"filter\": \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"id\":1,\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\"}]}​\n\n"],"headingContent":"JSON Field​","anchorList":[{"label":"Поле JSON","href":"JSON-Field​","type":1,"isActive":false},{"label":"Добавить JSON-поле","href":"Add-JSON-field​","type":2,"isActive":false},{"label":"Создание коллекции","href":"Create-collection​","type":2,"isActive":false},{"label":"Вставка данных","href":"Insert-data​","type":2,"isActive":false},{"label":"Поиск и запрос","href":"Search-and-query​","type":2,"isActive":false},{"label":"Ограничения","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.md b/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.md new file mode 100644 index 000000000..57e742aed --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/schema/use-json-fields.md @@ -0,0 +1,524 @@ +--- +id: use-json-fields.md +title: Используйте поля JSON +summary: >- + JSON (JavaScript Object Notation) - это легкий формат обмена данными, который + обеспечивает гибкий способ хранения и запроса сложных структур данных. В + Milvus вы можете хранить дополнительную структурированную информацию наряду с + векторными данными, используя поля JSON, что позволяет выполнять расширенный + поиск и запросы, сочетающие сходство векторов и структурированную фильтрацию. +--- +

    Поле JSON

    JSON (JavaScript Object Notation) - это легкий формат обмена данными, который обеспечивает гибкий способ хранения и запроса сложных структур данных. В Milvus вы можете хранить дополнительную структурированную информацию наряду с векторными данными с помощью полей JSON, что позволяет выполнять расширенный поиск и запросы, сочетающие сходство векторов и структурированную фильтрацию.

    +

    Поля JSON идеально подходят для приложений, которым требуются метаданные для оптимизации результатов поиска. Например, в электронной коммерции векторы товаров могут быть дополнены такими атрибутами, как категория, цена и бренд. В рекомендательных системах векторы пользователей могут быть объединены с предпочтениями и демографической информацией. Ниже приведен пример типичного поля JSON.

    +
    {​
    +  "category": "electronics",​
    +  "price": 99.99,​
    +  "brand": "BrandA"​
    +}​
    +
    +
    +

    Добавить JSON-поле

    Чтобы использовать JSON-поля в Milvus, определите соответствующий тип поля в схеме коллекции, установив datatype на поддерживаемый тип JSON, т. е. JSON.

    +

    Вот как определить схему коллекции, включающую поле JSON.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("metadata")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "metadata",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $jsonField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    В этом примере мы добавляем поле JSON под названием metadata для хранения дополнительных метаданных, связанных с векторными данными, таких как категория товара, цена и информация о бренде.

    +
    +

    Первичное поле и векторное поле являются обязательными при создании коллекции. Основное поле уникально идентифицирует каждую сущность, а векторное поле необходимо для поиска по сходству. Дополнительные сведения см. в разделах Первичное поле и автоидентификатор, Плотный вектор, Двоичный вектор или Разреженный вектор.

    +
    +

    Создание коллекции

    При создании коллекции необходимо создать индекс для векторного поля, чтобы обеспечить производительность поиска. В этом примере мы используем AUTOINDEX, чтобы упростить настройку индекса. Дополнительные сведения см. в разделе АВТОИНДЕКС.

    + +
    ​
    +index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metricType: MetricType.CONSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Используйте заданную схему и параметры индекса для создания коллекции.

    + +
    client.create_collection(​
    +    collection_name="my_json_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_json_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_json_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    После создания коллекции вы можете вставить данные, включающие поля JSON.

    + +
    # Data to be inserted​
    +data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +# Insert data into the collection​
    +client.insert(​
    +    collection_name="your_collection_name",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"}, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"}, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +client.insert({​
    +    collection_name: "my_json_collection",​
    +    data: data​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +            "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +            "pk": 1,​
    +            "embedding": [0.12, 0.34, 0.56]​
    +        },​
    +        {​
    +            "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +            "pk": 2,​
    +            "embedding": [0.56, 0.78, 0.90]​
    +        },​
    +        {​
    +            "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +            "pk": 3,​
    +            "embedding": [0.91, 0.18, 0.23]​
    +        }       ​
    +    ],​
    +    "collectionName": "my_json_collection"​
    +}'​
    +
    +
    +

    В этом примере.

    +
      +
    • Каждая запись данных включает первичное поле (pk), metadata в виде JSON-поля для хранения такой информации, как категория товара, цена и бренд.

    • +
    • embedding это 3-мерное векторное поле, используемое для поиска векторного сходства.

    • +
    +

    Поиск и запрос

    JSON-поля позволяют скалярную фильтрацию при поиске, что расширяет возможности векторного поиска в Milvus. Вы можете делать запросы на основе свойств JSON, а также на основе векторного сходства.

    +

    Фильтр запросов

    Вы можете фильтровать данные на основе свойств JSON, например, искать определенные значения или проверять, попадает ли число в определенный диапазон.

    + +
    filter = 'metadata["category"] == "electronics" and metadata["price"] < 150'​
    +​
    +res = client.query(​
    +    collection_name="my_json_collection",​
    +    filter=filter,​
    +    output_fields=["metadata"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .filter(filter)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +    output_fields: ['metadata']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "filter": "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150",​
    +    "outputFields": ["metadata"]​
    +}'​
    +{"code":0,"cost":0,"data":[{"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}","pk":1}]}​
    +
    +
    +

    В приведенном выше запросе Milvus отфильтровывает сущности, в которых поле metadata имеет категорию "electronics" и цену ниже 150, возвращая сущности, соответствующие этим критериям.

    +

    Векторный поиск с фильтрацией JSON

    Комбинируя векторное сходство с фильтрацией JSON, вы можете убедиться, что полученные данные не только соответствуют семантике, но и отвечают конкретным бизнес-условиям, делая результаты поиска более точными и соответствующими потребностям пользователей.

    + +
    filter = 'metadata["brand"] == "BrandA"'​
    +​
    +res = client.search(​
    +    collection_name="my_json_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["metadata"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "metadata[\"brand\"] == \"BrandA\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_json_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['metadata'],​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["metadata"],​
    +    "filter": "metadata[\"brand\"] == \"BrandA\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.24793813,"id":1,"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}"}]}​
    +
    +
    +

    В этом примере Milvus возвращает 5 сущностей, наиболее похожих на вектор запроса, с полем metadata, содержащим бренд "BrandA".

    +

    Кроме того, Milvus поддерживает расширенные операторы фильтрации JSON, такие как JSON_CONTAINS, JSON_CONTAINS_ALL, и JSON_CONTAINS_ANY, которые могут еще больше расширить возможности запроса. Более подробную информацию см. в разделе Фильтрация метаданных.

    +

    Ограничения

      +
    • Ограничения индексирования: Из-за сложности структур данных индексирование полей JSON не поддерживается.

    • +
    • Сопоставление типов данных: если ключевое значение поля JSON является целым числом или плавающей точкой, его можно сравнивать только с другим целым числом или плавающей точкой, а также с полями INT32/64 или FLOAT32/64. Если значение ключа является строкой (VARCHAR), его можно сравнивать только с другим строковым ключом.

    • +
    • Ограничения на именование: При именовании JSON-ключей рекомендуется использовать только буквы, цифры и символы подчеркивания, так как другие символы могут вызвать проблемы при фильтрации или поиске.

    • +
    • Работа со строковыми значениями: Для строковых значений (VARCHAR) Milvus хранит строки полей JSON как есть, без семантического преобразования. Например: 'a"b', "a'b", 'a\\'b' и "a\\"b" сохраняются в том виде, в котором они были введены; однако 'a'b' и "a"b" считаются недействительными.

    • +
    • Работа с вложенными словарями: Любые вложенные словари в значениях полей JSON рассматриваются как строки.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.json new file mode 100644 index 000000000..d2d084cf9 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​\n\n","filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_LENGTH(history_temperatures) < 10'​\n\n"],"headingContent":"ARRAY Operators​","anchorList":[{"label":"Операторы ARRAY","href":"ARRAY-Operators​","type":1,"isActive":false},{"label":"Доступные операторы ARRAY","href":"Available-ARRAY-Operators​","type":2,"isActive":false},{"label":"ARRAY_CONTAINS","href":"ARRAYCONTAINS​","type":2,"isActive":false},{"label":"МАССИВ_СОДЕРЖИТ_ВСЕ","href":"ARRAYCONTAINSALL​","type":2,"isActive":false},{"label":"ARRAY_CONTAINS_ANY","href":"ARRAYCONTAINSANY​","type":2,"isActive":false},{"label":"ARRAY_LENGTH","href":"ARRAYLENGTH​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.md new file mode 100644 index 000000000..907b6c2b9 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/array-operators.md @@ -0,0 +1,136 @@ +--- +id: array-operators.md +summary: >- + Milvus предоставляет мощные операторы для запросов к полям массивов, позволяя + вам фильтровать и извлекать сущности на основе содержимого массивов. +title: Операторы массива +--- +

    Операторы ARRAY

    Milvus предоставляет мощные операторы для запросов к полям массивов, позволяя вам фильтровать и извлекать сущности на основе содержимого массивов.

    +
    +

    Все элементы в массиве должны быть одного типа, а вложенные структуры внутри массивов рассматриваются как обычные строки. Поэтому при работе с полями ARRAY рекомендуется избегать чрезмерно глубокой вложенности и следить за тем, чтобы структуры данных были как можно более плоскими для достижения оптимальной производительности.

    +
    +

    Доступные операторы ARRAY

    Операторы ARRAY позволяют выполнять тонкие запросы к полям массивов в Milvus. К таким операторам относятся.

    +
      +
    • ARRAY_CONTAINS(identifier, expr): проверяет, существует ли определенный элемент в поле массива.

    • +
    • ARRAY_CONTAINS_ALL(identifier, expr): гарантирует, что все элементы указанного списка присутствуют в поле массива.

    • +
    • ARRAY_CONTAINS_ANY(identifier, expr): проверяет, присутствует ли в поле массива какой-либо элемент из указанного списка.

    • +
    • ARRAY_LENGTH(identifier, expr): позволяет фильтровать сущности по количеству элементов в поле массива.

    • +
    +

    ARRAY_CONTAINS

    Оператор ARRAY_CONTAINS проверяет, существует ли определенный элемент в поле массива. Он полезен, когда нужно найти сущности, в которых заданный элемент присутствует в массиве.

    +

    Пример

    +

    Предположим, у вас есть поле массива history_temperatures, которое содержит зарегистрированные самые низкие температуры за разные годы. Чтобы найти все сущности, в которых массив содержит значение 23, вы можете использовать следующее выражение фильтра.

    +
    filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​
    +
    +
    +

    Это вернет все сущности, в которых массив history_temperatures содержит значение 23.

    +

    МАССИВ_СОДЕРЖИТ_ВСЕ

    Оператор ARRAY_CONTAINS_ALL гарантирует, что все элементы указанного списка присутствуют в поле массива. Этот оператор полезен, когда нужно найти сущности, содержащие несколько значений в массиве.

    +

    Пример

    +

    Если вы хотите найти все сущности, в которых массив history_temperatures содержит и 23, и 24, вы можете использовать этот оператор.

    +
    filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​
    +
    +
    +

    Это вернет все сущности, в которых массив history_temperatures содержит оба указанных значения.

    +

    ARRAY_CONTAINS_ANY

    Оператор ARRAY_CONTAINS_ANY проверяет, присутствует ли в поле массива любой элемент из указанного списка. Это полезно, когда нужно найти сущности, содержащие хотя бы одно из указанных значений в массиве.

    +

    Пример

    +

    Чтобы найти все сущности, в которых массив history_temperatures содержит либо 23, либо 24, вы можете использовать оператор.

    +
    filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​
    +
    +
    +

    Это вернет все сущности, в которых массив history_temperatures содержит хотя бы одно из значений 23 или 24.

    +

    ARRAY_LENGTH

    Оператор ARRAY_LENGTH позволяет фильтровать сущности по количеству элементов в поле массива. Это удобно, когда нужно найти сущности с массивами определенной длины.

    +

    Пример

    +

    Если вы хотите найти все сущности, в которых массив history_temperatures содержит менее 10 элементов, вы можете использовать.

    +
    filter = 'ARRAY_LENGTH(history_temperatures) < 10'​
    +
    +
    +

    Это вернет все сущности, в которых массив history_temperatures содержит менее 10 элементов.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.json new file mode 100644 index 000000000..93c1cf5ad --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'status == \"active\"'​\n\n","filter = 'status != \"inactive\"'​\n\n","filter = 'age > 30'​\n\n","filter = 'price < 100'​\n\n","filter = 'rating >= 4'​\n\n","filter = 'discount <= 10'​\n\n","filter = 'color in [\"red\", \"green\", \"blue\"]'​\n\n","filter = 'name LIKE \"Prod%\"'​\n\n","filter = 'name LIKE \"%XYZ\"'​\n\n","filter = 'name LIKE \"%Pro%\"'​\n\n","filter = 'total == base_price + tax'​\n\n","filter = 'quantity - quantity_sold > 50'​\n\n","filter = 'price * quantity > 1000'​\n\n","filter = 'total_price / quantity < 50'​\n\n","filter = 'id % 2 == 0'​\n\n","filter = 'price ** 2 > 1000'​\n\n","filter = 'price > 100 AND stock > 50'​\n\n","filter = 'color == \"red\" OR color == \"blue\"'​\n\n","filter = 'NOT color == \"green\"'​\n\n","filter = 'product[\"price\"] > 1000'​\n\n","filter = 'history_temperatures[0] > 30'​\n\n"],"headingContent":"Basic Operators​","anchorList":[{"label":"Основные операторы","href":"Basic-Operators​","type":1,"isActive":false},{"label":"Операторы сравнения","href":"Comparison-operators​","type":2,"isActive":false},{"label":"Операторы диапазона","href":"Range-operators​","type":2,"isActive":false},{"label":"Арифметические операторы","href":"Arithmetic-Operators​","type":2,"isActive":false},{"label":"Логические операторы","href":"Logical-Operators​","type":2,"isActive":false},{"label":"Советы по использованию основных операторов с полями JSON и ARRAY","href":"Tips-on-Using-Basic-Operators-with-JSON-and-ARRAY-Fields​","type":2,"isActive":false},{"label":"Заключение .","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.md new file mode 100644 index 000000000..67434bf7a --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/basic-operators.md @@ -0,0 +1,236 @@ +--- +id: basic-operators.md +summary: >- + Milvus предоставляет богатый набор базовых операторов, которые помогут вам + эффективно фильтровать и запрашивать данные. Эти операторы позволяют уточнять + условия поиска на основе скалярных полей, числовых вычислений, логических + условий и многого другого. Понимание того, как использовать эти операторы, + очень важно для создания точных запросов и повышения эффективности поиска. +title: Основные операторы +--- +

    Основные операторы

    Milvus предоставляет богатый набор базовых операторов, которые помогут вам эффективно фильтровать и запрашивать данные. Эти операторы позволяют уточнять условия поиска на основе скалярных полей, числовых вычислений, логических условий и многого другого. Понимание того, как использовать эти операторы, очень важно для создания точных запросов и повышения эффективности поиска.

    +

    Операторы сравнения

    Операторы сравнения используются для фильтрации данных на основе равенства, неравенства или размера. Они применимы к числовым, текстовым полям и полям даты.

    +

    Поддерживаемые операторы сравнения.

      +
    • == (Равно)

    • +
    • != (Не равно)

    • +
    • > (Больше, чем)

    • +
    • < (Меньше, чем)

    • +
    • >= (Больше или равно)

    • +
    • <= (Меньше или равно)

    • +
    +

    Пример 1: Фильтрация с помощью Equal To (==)

    Предположим, у вас есть поле с именем status, и вы хотите найти все сущности, в которых status является "активным". Для этого можно использовать оператор равенства ==.

    +
    filter = 'status == "active"'​
    +
    +
    +

    Пример 2: Фильтрация с помощью Not Equal To (!=)

    Чтобы найти сущности, в которых status не является "неактивным".

    +
    filter = 'status != "inactive"'​
    +
    +
    +

    Пример 3: Фильтрация с помощью Greater Than (>)

    Если вы хотите найти все сущности с age больше 30.

    +
    filter = 'age > 30'​
    +
    +
    +

    Пример 4: Фильтрация с помощью Less Than (<)

    Чтобы найти сущности, у которых price меньше 100.

    +
    filter = 'price < 100'​
    +
    +
    +

    Пример 5: Фильтрация с помощью Greater Than or Equal To (>=)

    Если вы хотите найти все сущности с rating больше или равным 4.

    +
    filter = 'rating >= 4'​
    +
    +
    +

    Пример 6: Фильтрация с помощью Less Than or Equal To (<=)

    Чтобы найти сущности с discount меньше или равным 10%.

    +
    filter = 'discount <= 10'​
    +
    +
    +

    Операторы диапазона

    Операторы диапазона помогают фильтровать данные на основе определенных наборов или диапазонов значений.

    +

    Поддерживаемые операторы диапазона.

      +
    • IN: Используются для поиска значений в определенном наборе или диапазоне.

    • +
    • LIKE: : Используется для поиска шаблона (в основном для текстовых полей).

    • +
    +

    Пример 1: Использование IN для поиска нескольких значений

    Если вы хотите найти все сущности, для которых color является либо "красным", либо "зеленым", либо "синим".

    +
    filter = 'color in ["red", "green", "blue"]'​
    +
    +
    +

    Это полезно, когда нужно проверить принадлежность к списку значений.

    +

    Пример 2: Использование LIKE для сопоставления с образцом

    Оператор LIKE используется для поиска шаблонов в строковых полях. Он может сопоставлять подстроки в различных позициях в тексте: в качестве префикса, инфикса или суффикса. Оператор LIKE использует символ % в качестве подстановочного знака, который может соответствовать любому количеству символов (включая ноль).

    +

    Префиксное совпадение (начинается с)

    Чтобы выполнить префиксное совпадение, при котором строка начинается с заданного шаблона, можно поместить шаблон в начало и использовать оператор % для соответствия всем символам, следующим за ним. Например, чтобы найти все продукты, чье name начинается с "Prod".

    +
    filter = 'name LIKE "Prod%"'​
    +
    +
    +

    В этом случае будет найден любой продукт, название которого начинается с "Prod", например "Product A", "Product B" и т. д.

    +

    Суффиксное совпадение (заканчивается на)

    Для суффиксного совпадения, когда строка заканчивается заданным шаблоном, поместите символ % в начало шаблона. Например, чтобы найти все продукты, чей name заканчивается на "XYZ".

    +
    filter = 'name LIKE "%XYZ"'​
    +
    +
    +

    В этом случае будет найден любой продукт, название которого заканчивается на "XYZ", например "ProductXYZ", "SampleXYZ" и т. д.

    +

    Инфиксное совпадение (Contains)

    Чтобы выполнить инфиксное совпадение, при котором шаблон может встречаться в любом месте строки, вы можете поместить символ % как в начало, так и в конец шаблона. Например, чтобы найти все продукты, в названии которых name содержится слово "Pro".

    +
    filter = 'name LIKE "%Pro%"'​
    +
    +
    +

    В этом случае будет найден любой продукт, в названии которого содержится подстрока "Pro", например "Product", "ProLine" или "SuperPro".

    +

    Арифметические операторы

    Арифметические операторы позволяют создавать условия на основе вычислений с использованием числовых полей.

    +

    Поддерживаемые арифметические операторы.

      +
    • + (Сложение)

    • +
    • - (Вычитание)

    • +
    • * (Умножение)

    • +
    • / (Деление)

    • +
    • % (Модуль)

    • +
    • ** (Экспоненция)

    • +
    +

    Пример 1: Использование сложения (+)

    Найти объекты, в которых цена total равна сумме base_price и tax.

    +
    filter = 'total == base_price + tax'​
    +
    +
    +

    Пример 2: Использование вычитания (-)

    Найти объекты, в которых quantity больше 50, а quantity_sold меньше 30.

    +
    filter = 'quantity - quantity_sold > 50'​
    +
    +
    +

    Пример 3: Использование умножения (*)

    Чтобы найти объекты, где price больше 100 и quantity больше 10, перемножьте их.

    +
    filter = 'price * quantity > 1000'​
    +
    +
    +

    Пример 4: Использование деления (/)

    Для поиска произведений, где total_price, деленное на quantity, меньше 50.

    +
    filter = 'total_price / quantity < 50'​
    +
    +
    +

    Пример 5: Использование модуля (%)

    Для поиска объектов, в которых id является четным числом (т. е. кратным 2).

    +
    filter = 'id % 2 == 0'​
    +
    +
    +

    Пример 6: Использование экспоненции (**)

    Для поиска сущностей, в которых price, возведенное в степень 2, больше 1000.

    +
    filter = 'price ** 2 > 1000'​
    +
    +
    +

    Логические операторы

    Логические операторы используются для объединения нескольких условий в более сложное выражение фильтра. К ним относятся AND, OR и NOT.

    +

    Поддерживаемые логические операторы.

      +
    • AND: Объединяет несколько условий, которые все должны быть истинными.

    • +
    • OR: : Комбинирует условия, из которых хотя бы одно должно быть истинным.

    • +
    • NOT: Отрицает условие.

    • +
    +

    Пример 1: Использование AND для объединения условий

    Найти все товары, в которых price больше 100, а stock больше 50.

    +
    filter = 'price > 100 AND stock > 50'​
    +
    +
    +

    Пример 2: Использование OR для объединения условий

    Найти все товары, для которых color является либо "красным", либо "синим".

    +
    filter = 'color == "red" OR color == "blue"'​
    +
    +
    +

    Пример 3: Использование NOT для исключения условия

    Найти все товары, для которых color не является "зеленым".

    +
    filter = 'NOT color == "green"'​
    +
    +
    +

    Советы по использованию основных операторов с полями JSON и ARRAY

    Хотя базовые операторы в Milvus универсальны и могут применяться к скалярным полям, их также можно эффективно использовать с ключами и индексами в полях JSON и ARRAY.

    +

    Например, если у вас есть поле product, содержащее несколько ключей, таких как price, model и tags, всегда ссылайтесь непосредственно на ключ.

    +
    filter = 'product["price"] > 1000'​
    +
    +
    +

    Чтобы найти записи, в которых первая температура в массиве записанных температур превышает определенное значение, используйте.

    +
    filter = 'history_temperatures[0] > 30'​
    +
    +
    +

    Заключение .

    Milvus предлагает ряд базовых операторов, которые обеспечивают гибкость при фильтрации и запросе данных. Комбинируя операторы сравнения, диапазона, арифметические и логические операторы, вы можете создавать мощные выражения фильтрации для сужения результатов поиска и эффективного извлечения нужных данных.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.json new file mode 100644 index 000000000..fb178629c --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.json @@ -0,0 +1 @@ +{"codeList":["filter='color in [\"red\", \"green\", \"blue\"]'​\n\n","filter='product[\"model\"] == \"JSN-087\" and product[\"price\"] < 1850'​\n\n","filter='history_temperatures[10] > 23'​\n\n","filter = \"age > 25 and city in ['北京', '上海']\"​\n\n","filter = \"age > {age} and city in {city}\",​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter='json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n","filter=\"ARRAY_CONTAINS(history_temperatures, 23)\"​\n\n","filter=\"ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_LENGTH(history_temperatures) < 10\"​\n\n"],"headingContent":"Filtering Explained​","anchorList":[{"label":"Объяснение фильтрации","href":"Filtering-Explained​","type":1,"isActive":false},{"label":"Основные операторы","href":"Basic-operators​","type":2,"isActive":false},{"label":"Шаблоны выражений фильтрации","href":"Filter-expression-templates​","type":2,"isActive":false},{"label":"Операторы, специфичные для типов данных","href":"Data-type-specific-operators​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.md new file mode 100644 index 000000000..74f037367 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/boolean.md @@ -0,0 +1,148 @@ +--- +id: boolean.md +summary: >- + Milvus предоставляет мощные возможности фильтрации, которые позволяют + выполнять точные запросы к вашим данным. Выражения фильтрации позволяют + нацеливаться на определенные скалярные поля и уточнять результаты поиска с + помощью различных условий. В этом руководстве объясняется, как использовать + выражения фильтрации в Milvus, и приводятся примеры, ориентированные на + операции запроса. Вы также можете применять эти фильтры в запросах на поиск и + удаление. +title: Объяснение фильтрации +--- +

    Объяснение фильтрации

    Milvus предоставляет мощные возможности фильтрации, которые позволяют выполнять точные запросы к вашим данным. Выражения фильтрации позволяют нацеливаться на определенные скалярные поля и уточнять результаты поиска с помощью различных условий. В этом руководстве объясняется, как использовать выражения фильтрации в Milvus, а примеры посвящены операциям запроса. Вы также можете применять эти фильтры в запросах на поиск и удаление.

    +

    Основные операторы

    Milvus поддерживает несколько основных операторов для фильтрации данных.

    +
      +
    • Операторы сравнения: ==, !=, >, <, >=, и <= позволяют фильтровать данные на основе числовых, текстовых полей или полей даты.

    • +
    • Фильтры диапазонов: IN и LIKE помогают найти определенные диапазоны или наборы значений.

    • +
    • Арифметические операторы: +, -, *, /, %, и `` используются для вычислений с числовыми полями.

    • +
    • Логические операторы: AND, OR, и NOT или '&&', '||', '~', '!' объединяют несколько условий в сложные выражения.

    • +
    +

    Пример: Фильтрация по цвету

    Чтобы найти сущности с первичными цветами (красным, зеленым или синим) в скалярном поле color, используйте следующее выражение фильтра.

    +
    filter='color in ["red", "green", "blue"]'​
    +
    +
    +

    Пример: Фильтрация полей JSON

    Milvus позволяет ссылаться на ключи в полях JSON. Например, если у вас есть JSON-поле product с ключами price и model, и вы хотите найти товары с определенной моделью и ценой ниже 1 850, используйте следующее выражение фильтра.

    +
    filter='product["model"] == "JSN-087" and product["price"] < 1850'​
    +
    +
    +

    Пример: Фильтрация полей массива

    Если у вас есть поле массива history_temperatures, содержащее записи о температуре, и вы хотите найти обсерватории, в которых 10-я зарегистрированная температура превышает 23 °C, используйте это выражение.

    +
    filter='history_temperatures[10] > 23'​
    +
    +
    +

    Дополнительные сведения об этих базовых операторах см. в разделе Базовые операторы.

    +

    Шаблоны выражений фильтрации

    При фильтрации с использованием символов CJK обработка может быть более сложной из-за большего набора символов и различий в кодировке. Это может привести к снижению производительности, особенно при использовании оператора IN.

    +

    Milvus вводит шаблонизацию выражений фильтрации для оптимизации производительности при работе с символами CJK. Отделяя динамические значения от выражения фильтра, механизм запросов более эффективно обрабатывает вставку параметров.

    +

    Пример

    Чтобы найти людей старше 25 лет, проживающих в "北京" (Пекин) или "上海" (Шанхай), используйте следующее шаблонное выражение.

    +
    filter = "age > 25 and city in ['北京', '上海']"​
    +
    +
    +

    Чтобы повысить производительность, используйте эту вариацию с параметрами.

    +
    filter = "age > {age} and city in {city}",​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    Такой подход снижает накладные расходы на синтаксический разбор и повышает скорость выполнения запросов. Дополнительные сведения см. в разделе Шаблонизация фильтров.

    +

    Операторы, специфичные для типов данных

    Milvus предоставляет расширенные операторы фильтрации для определенных типов данных, таких как поля JSON, ARRAY и VARCHAR.

    +

    Операторы, специфичные для полей JSON

    Milvus предлагает расширенные операторы для запросов к полям JSON, обеспечивая точную фильтрацию в сложных структурах JSON.

    +

    JSON_CONTAINS(identifier, jsonExpr): Проверяет, существует ли выражение JSON в поле.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains(tags, "sale")'​
    +
    +
    +

    JSON_CONTAINS_ALL(identifier, jsonExpr): : Проверяет наличие всех элементов JSON-выражения.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter='json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    JSON_CONTAINS_ANY(identifier, jsonExpr): : Фильтрует сущности, для которых в выражении JSON существует хотя бы один элемент.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    Более подробную информацию об операторах JSON см. в разделе Операторы JSON.

    +

    Операторы, специфичные для полей ARRAY

    Milvus предоставляет расширенные операторы фильтрации для полей массивов, таких как ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY, и ARRAY_LENGTH, которые позволяют осуществлять тонкий контроль над данными массива.

    +

    ARRAY_CONTAINS: : Фильтрует сущности, содержащие определенный элемент.

    +
    filter="ARRAY_CONTAINS(history_temperatures, 23)"​
    +
    +
    +

    ARRAY_CONTAINS_ALL: : Фильтрует сущности, в которых присутствуют все элементы списка.

    +
    filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_CONTAINS_ANY: : Фильтрует сущности, содержащие любой элемент из списка.

    +
    filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_LENGTH: Фильтрует на основе длины массива.

    +
    filter="ARRAY_LENGTH(history_temperatures) < 10"​
    +
    +
    +

    Более подробную информацию об операторах массивов см. в разделе Операторы ARRAY.

    +

    Операторы, специфичные для полей VARCHAR

    Оператор Text_Match позволяет точно находить документы по определенным условиям запроса. Он особенно полезен для фильтрованного поиска, сочетающего скалярные фильтры с поиском по векторному сходству. В отличие от семантического поиска, Text Match фокусируется на точных вхождениях терминов.

    +

    Milvus использует Tantivy для поддержки инвертированного индексирования и текстового поиска по терминам. Процесс включает в себя.

    +
      +
    1. Анализатор: Токенизирует и обрабатывает входной текст.

    2. +
    3. Индексирование: Создает инвертированный индекс, сопоставляющий уникальные лексемы с документами.

    4. +
    +

    Более подробную информацию см. в разделе "Сопоставление текста".

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.json new file mode 100644 index 000000000..0af352efa --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.json @@ -0,0 +1 @@ +{"codeList":["filter = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.search(​\n \"hello_milvus\",​\n vectors[:nq],​\n filter=expr,​\n limit=10,​\n output_fields=[\"age\", \"city\"],​\n search_params={\"metric_type\": \"COSINE\", \"params\": {\"search_list\": 100}},​\n filter_params=filter_params,​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.query(​\n \"hello_milvus\",​\n filter=expr,​\n output_fields=[\"age\", \"city\"],​\n filter_params=filter_params​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.delete(​\n \"hello_milvus\",​\n filter=expr,​\n filter_params=filter_params​\n)​\n\n"],"headingContent":"Filter Templating​","anchorList":[{"label":"Шаблонизация фильтров","href":"Filter-Templating​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Поисковые операции","href":"Search-Operations​","type":2,"isActive":false},{"label":"Операции запроса","href":"Query-Operations​","type":2,"isActive":false},{"label":"Операции удаления","href":"Delete-Operations​","type":2,"isActive":false},{"label":"Заключение","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.md new file mode 100644 index 000000000..0b98c740b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/filtering-templating.md @@ -0,0 +1,155 @@ +--- +id: filtering-templating.md +summary: >- + В Milvus сложные выражения фильтров с большим количеством элементов, особенно + те, в которых используются символы не ASCII, такие как символы CJK, могут + значительно повлиять на производительность запроса. Для решения этой проблемы + в Milvus внедрен механизм шаблонизации выражений фильтров, предназначенный для + повышения эффективности за счет сокращения времени, затрачиваемого на разбор + сложных выражений. На этой странице рассказывается об использовании шаблонов + выражений фильтров в операциях поиска, запроса и удаления. +title: Фильтрация шаблонов +--- +

    Шаблонизация фильтров

    В Milvus сложные выражения фильтров с большим количеством элементов, особенно те, в которых используются символы не ASCII, например CJK, могут существенно повлиять на производительность запросов. Для решения этой проблемы в Milvus внедрен механизм шаблонизации выражений фильтров, предназначенный для повышения эффективности за счет сокращения времени, затрачиваемого на разбор сложных выражений. На этой странице рассказывается об использовании шаблонов выражений фильтров в операциях поиска, запроса и удаления.

    +

    Обзор

    Шаблонизация выражений фильтра позволяет создавать выражения фильтра с заполнителями, которые могут динамически подставляться в значения во время выполнения запроса. Использование шаблонов позволяет избежать встраивания больших массивов или сложных выражений непосредственно в фильтр, что сокращает время разбора и повышает производительность запроса.

    +

    Допустим, у вас есть выражение фильтра, включающее два поля age и city, и вы хотите найти всех людей, чей возраст больше 25 лет и которые живут либо в "北京" (Пекин), либо в "上海" (Шанхай). Вместо того чтобы напрямую вставлять значения в выражение фильтра, можно использовать шаблон.

    +
    filter = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    Здесь {age} и {city} - это заполнители, которые будут заменены реальными значениями в filter_params при выполнении запроса.

    +

    Использование шаблонов выражений фильтров в Milvus имеет несколько ключевых преимуществ.

    +
      +
    • Сокращение времени разбора: заменяя большие или сложные выражения фильтра на шаблоны, система тратит меньше времени на разбор и обработку фильтра.

    • +
    • Повышение производительности запросов: Благодаря уменьшению накладных расходов на парсинг повышается производительность запросов, что приводит к повышению QPS и ускорению времени отклика.

    • +
    • Масштабируемость: По мере роста наборов данных и усложнения выражений фильтров шаблонизация обеспечивает эффективность и масштабируемость производительности.

    • +
    +

    Поисковые операции

    Для операций поиска в Milvus выражение filter используется для определения условия фильтрации, а параметр filter_params - для задания значений для заполнителей. Словарь filter_params содержит динамические значения, которые Milvus будет использовать для подстановки в выражение фильтра.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.search(​
    +    "hello_milvus",​
    +    vectors[:nq],​
    +    filter=expr,​
    +    limit=10,​
    +    output_fields=["age", "city"],​
    +    search_params={"metric_type": "COSINE", "params": {"search_list": 100}},​
    +    filter_params=filter_params,​
    +)​
    +
    +
    +

    В этом примере Milvus динамически заменит {age} на 25 и {city} на ["北京", "上海"] при выполнении поиска.

    +

    Операции запроса

    Тот же механизм шаблонизации может быть применен к операциям запроса в Milvus. В функции query вы определяете выражение фильтрации и используете filter_params для указания значений для подстановки.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.query(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    output_fields=["age", "city"],​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    Используя filter_params, Milvus эффективно обрабатывает динамическую вставку значений, повышая скорость выполнения запроса.

    +

    Операции удаления

    Вы также можете использовать шаблонизацию выражений фильтра в операциях удаления. Как и в поиске и запросе, выражение filter определяет условия, а filter_params предоставляет динамические значения для заполнителей.

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.delete(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    Такой подход повышает производительность операций удаления, особенно при работе со сложными условиями фильтрации.

    +

    Заключение

    Шаблонирование выражений фильтра является важным инструментом для оптимизации производительности запросов в Milvus. Используя заполнители и словарь filter_params, вы можете значительно сократить время разбора сложных выражений фильтра. Это приводит к ускорению выполнения запросов и повышению общей производительности.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.json new file mode 100644 index 000000000..2557a94f8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.json @@ -0,0 +1 @@ +{"codeList":["# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter = 'json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n"],"headingContent":"JSON Operators​","anchorList":[{"label":"Операторы JSON","href":"JSON-Operators​","type":1,"isActive":false},{"label":"Доступные операторы JSON","href":"Available-JSON-Operators​","type":2,"isActive":false},{"label":"JSON_CONTAINS","href":"JSONCONTAINS​","type":2,"isActive":false},{"label":"JSON_CONTAINS_ALL","href":"JSONCONTAINSALL​","type":2,"isActive":false},{"label":"JSON_COTAINS_ANY","href":"JSONCOTAINSANY​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.md new file mode 100644 index 000000000..09088e153 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/boolean/json-operators.md @@ -0,0 +1,122 @@ +--- +id: json-operators.md +summary: >- + Milvus поддерживает расширенные операторы для запросов и фильтрации полей + JSON, что делает их идеальными для управления сложными структурированными + данными. Эти операторы позволяют выполнять высокоэффективные запросы к + документам JSON, позволяя вам извлекать сущности на основе определенных + элементов, значений или условий в полях JSON. В этом разделе мы расскажем вам + об использовании операторов JSON в Milvus и приведем практические примеры, + иллюстрирующие их функциональность. +title: Операторы JSON +--- +

    Операторы JSON

    Milvus поддерживает расширенные операторы для запросов и фильтрации полей JSON, что делает их идеальными для управления сложными структурированными данными. Эти операторы позволяют выполнять высокоэффективные запросы к документам JSON, позволяя вам извлекать сущности на основе определенных элементов, значений или условий в полях JSON. В этом разделе мы расскажем вам об использовании специфических операторов JSON в Milvus и приведем практические примеры, иллюстрирующие их функциональность.

    +
    +

    JSON-поля не могут работать со сложными вложенными структурами и рассматривают все вложенные структуры как обычные строки. Поэтому при работе с полями JSON рекомендуется избегать слишком глубокой вложенности и следить за тем, чтобы структуры данных были как можно более плоскими для достижения оптимальной производительности.

    +
    +

    Доступные операторы JSON

    Milvus предоставляет несколько мощных операторов JSON, которые помогают фильтровать и запрашивать данные JSON, а именно.

    +
      +
    • JSON_CONTAINS(identifier, expr): Фильтрует сущности, в поле которых встречается указанное выражение JSON.

    • +
    • JSON_CONTAINS_ALL(identifier, expr): : Убеждается, что все элементы указанного JSON-выражения присутствуют в поле.

    • +
    • JSON_CONTAINS_ANY(identifier, expr): : Фильтрует сущности, в которых хотя бы один член JSON-выражения присутствует в поле.

    • +
    +

    Давайте рассмотрим эти операторы на примерах, чтобы увидеть, как они могут применяться в реальных сценариях.

    +

    JSON_CONTAINS

    Оператор json_contains проверяет, существует ли определенный элемент или подмассив в поле JSON. Он полезен, когда нужно убедиться, что массив или объект JSON содержит определенное значение.

    +

    Пример

    +

    Представьте, что у вас есть коллекция продуктов, каждый из которых имеет поле tags, содержащее JSON-массив строк, например ["electronics", "sale", "new"]. Вы хотите отфильтровать товары, имеющие тег "sale".

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains(tags, "sale")'​
    +
    +
    +

    В этом примере Milvus вернет все товары, в которых поле tags содержит элемент "sale".

    +

    JSON_CONTAINS_ALL

    Оператор json_contains_all гарантирует, что все элементы указанного JSON-выражения присутствуют в целевом поле. Он особенно полезен, когда нужно сопоставить несколько значений в массиве JSON.

    +

    Пример

    +

    Продолжая сценарий с тегами продуктов, если вы хотите найти все продукты, имеющие теги "electronics", "sale", и "new", вы можете использовать оператор json_contains_all.

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter = 'json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    Этот запрос вернет все товары, в которых массив tags содержит все три указанных элемента: "electronics", "sale", и "new".

    +

    JSON_COTAINS_ANY

    Оператор json_contains_any фильтрует сущности, в которых хотя бы один член выражения JSON существует в поле. Это полезно, когда нужно подобрать сущности по любому из нескольких возможных значений.

    +

    Пример

    +

    Допустим, вы хотите отфильтровать продукты, имеющие хотя бы один из тегов "electronics", "sale" или "new". Для этого можно использовать оператор json_contains_any.

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    В этом случае Milvus вернет все товары, у которых есть хотя бы один из тегов в списке ["electronics", "new", "clearance"]. Даже если у товара есть только один из этих тегов, он будет включен в результат.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.json new file mode 100644 index 000000000..fa55ae58a --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.json @@ -0,0 +1 @@ +{"codeList":["dataCoord:\n compaction:\n clustering:\n enable: true \n autoEnable: false \n triggerInterval: 600 \n minInterval: 3600 \n maxInterval: 259200 \n newDataSizeThreshold: 512m \n timeout: 7200\n \nqueryNode:\n enableSegmentPrune: true \n\ndatanode:\n clusteringCompaction:\n memoryBufferRatio: 0.1 \n workPoolSize: 8 \ncommon:\n usePartitionKeyAsClusteringKey: true \n","default_fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n FieldSchema(name=\"key\", dtype=DataType.INT64, is_clustering_key=True),\n FieldSchema(name=\"var\", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),\n FieldSchema(name=\"embeddings\", dtype=DataType.FLOAT_VECTOR, dim=dim)\n]\n\ndefault_schema = CollectionSchema(\n fields=default_fields, \n description=\"test clustering-key collection\"\n)\n\ncoll1 = Collection(name=\"clustering_test\", schema=default_schema)\n","coll1.compact(is_clustering=True)\ncoll1.get_compaction_state(is_clustering=True)\ncoll1.wait_for_compaction_completed(is_clustering=True)\n"],"headingContent":"Clustering Compaction","anchorList":[{"label":"Кластерное уплотнение","href":"Clustering-Compaction","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Использование уплотнения кластеров","href":"Use-Clustering-Compaction","type":2,"isActive":false},{"label":"Запуск уплотнения кластеризации","href":"Trigger-Clustering-Compaction","type":2,"isActive":false},{"label":"Лучшие практики","href":"Best-practices","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.md new file mode 100644 index 000000000..805fec724 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/clustering-compaction.md @@ -0,0 +1,273 @@ +--- +id: clustering-compaction.md +title: Кластерное уплотнение +related_key: 'clustering, compaction' +summary: >- + Функция уплотнения кластеров предназначена для повышения производительности + поиска и снижения затрат в больших коллекциях. Это руководство поможет вам + понять, что такое уплотнение кластеров и как эта функция может повысить + производительность поиска. +--- +

    Кластерное уплотнение

    Функция уплотнения кластеров предназначена для повышения производительности поиска и снижения затрат в больших коллекциях. Это руководство поможет вам понять, что такое уплотнение кластеров и как эта функция может повысить производительность поиска.

    +

    Обзор

    Milvus хранит входящие сущности в сегментах коллекции и уплотняет сегмент, когда он переполнен. Если это происходит, создается новый сегмент для размещения дополнительных сущностей. В результате сущности произвольно распределяются по сегментам. Такое распределение требует от Milvus поиска в нескольких сегментах ближайших соседей для заданного вектора запроса.

    +

    + + Without clustering Compaction + Уплотнение без кластеризации

    +

    Если Milvus может распределить сущности между сегментами на основе значений в определенном поле, область поиска может быть ограничена в пределах одного сегмента, что повышает производительность поиска.

    +

    Clustering Compaction - это функция в Milvus, которая перераспределяет сущности между сегментами в коллекции на основе значений в скалярном поле. Чтобы включить эту функцию, сначала нужно выбрать скалярное поле в качестве ключа кластеризации. Это позволит Milvus перераспределять сущности в сегмент, если значения их ключа кластеризации попадают в определенный диапазон. Когда вы запускаете уплотнение кластеризации, Milvus генерирует/обновляет глобальный индекс PartitionStats, который записывает отношения сопоставления между сегментами и значениями ключей кластеризации.

    +

    + + With Clustering Compaction + При кластерном уплотнении

    +

    Используя PartitionStats в качестве ссылки, Milvus может отсеивать нерелевантные данные при получении запроса на поиск/запрос, содержащего значение ключа кластеризации, и ограничивать область поиска сегментами, сопоставленными с этим значением, тем самым повышая производительность поиска. Подробнее об улучшении производительности см. в разделе "Бенчмарк-тесты".

    +

    Использование уплотнения кластеров

    Функция Clustering Compaction в Milvus является очень настраиваемой. Вы можете запустить ее вручную или настроить автоматическое включение через определенные промежутки времени с помощью Milvus. Чтобы включить уплотнение кластеров, выполните следующие действия:

    +

    Глобальная конфигурация

    Вам необходимо изменить конфигурационный файл Milvus, как показано ниже.

    +
    dataCoord:
    +  compaction:
    +    clustering:
    +      enable: true 
    +      autoEnable: false 
    +      triggerInterval: 600 
    +      minInterval: 3600 
    +      maxInterval: 259200 
    +      newDataSizeThreshold: 512m 
    +      timeout: 7200
    +     
    +queryNode:
    +  enableSegmentPrune: true 
    +
    +datanode:
    +  clusteringCompaction:
    +    memoryBufferRatio: 0.1 
    +    workPoolSize: 8  
    +common:
    +  usePartitionKeyAsClusteringKey: true 
    +
    +
      +
    • dataCoord.compaction.clustering

      + + + + + + + + + + + + + +
      Элемент конфигурацииОписаниеЗначение по умолчанию
      enableУказывает, нужно ли включать уплотнение кластеризации.
      Установите значение true, если вам нужно включить эту функцию для каждой коллекции, имеющей ключ кластеризации.
      false
      autoEnableУказывает, следует ли включать автоматически запускаемое уплотнение.
      Значение true означает, что Milvus уплотняет коллекции, имеющие ключ кластеризации, через указанные интервалы времени.
      false
      triggerIntervalУказывает интервал в миллисекундах, через который Milvus начинает уплотнение кластеров.
      Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
      -
      minIntervalУказывает минимальный интервал в секундах.
      Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
      Установка целого числа, большего, чем triggerInterval, помогает избежать повторных уплотнений в течение короткого периода.
      -
      maxIntervalУказывает максимальный интервал в секундах.
      Этот параметр действителен только в том случае, если для autoEnable установлено значение true.
      Если Milvus обнаруживает, что коллекция не была уплотнена кластеризацией в течение периода, превышающего это значение, он принудительно выполняет уплотнение кластеризации.
      -
      newDataSizeThresholdУказывает верхний порог для запуска кластерного уплотнения.
      Этот параметр действителен только в том случае, если для параметра autoEnable установлено значение true.
      Как только Milvus обнаружит, что объем данных в коллекции превышает это значение, он инициирует процесс кластерного уплотнения.
      -
      timeoutУказывает длительность таймаута для кластерного уплотнения.
      Если время выполнения кластерного уплотнения превышает это значение, кластерное уплотнение завершается неудачно.
      -
      +
    • +
    • queryNode

      + + + + + + + +
      Элемент конфигурацииОписаниеЗначение по умолчанию
      enableSegmentPruneУказывает, обрезает ли Milvus данные, обращаясь к PartitionStats при получении запросов поиска/запроса.
      Установка этого значения в true позволяет Milvus отсеивать нерелевантные данные из сегментов во время запроса поиска/запроса.
      false
      +
    • +
    • dataNode.clusteringCompaction

      + + + + + + + + +
      Элемент конфигурацииОписаниеЗначение по умолчанию
      memoryBufferRatioОпределяет соотношение буферов памяти для задач уплотнения кластеризации.
      Milvus удаляет данные, когда размер данных превышает размер выделенного буфера, рассчитанный с помощью этого соотношения.
      -
      workPoolSizeУказание размера рабочего пула для задачи кластерного уплотнения.-
      +
    • +
    • common

      + + + + + + + +
      Элемент конфигурацииОписаниеЗначение по умолчанию
      usePartitionKeyAsClusteringKeyУказывает, использовать ли ключ раздела в коллекциях в качестве ключа кластеризации.
      Значение true означает, что ключ раздела будет использоваться в качестве ключа кластеризации.
      Вы всегда можете отменить эту настройку в коллекции, явно задав ключ кластеризации.
      false
      +
    • +
    +

    Чтобы применить вышеуказанные изменения к кластеру Milvus, выполните действия, описанные в разделах Настройка Milvus с Helm и Настройка Milvus с Milvus Operators.

    +

    Конфигурация коллекции

    Для уплотнения кластера в определенной коллекции необходимо выбрать скалярное поле из коллекции в качестве ключа кластеризации.

    +
    default_fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +    FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
    +    FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
    +    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
    +]
    +
    +default_schema = CollectionSchema(
    +    fields=default_fields, 
    +    description="test clustering-key collection"
    +)
    +
    +coll1 = Collection(name="clustering_test", schema=default_schema)
    +
    +
    +

    В качестве ключа кластеризации можно использовать скалярные поля следующих типов данных: Int8, Int16, Int32, Int64, Float, Double и VarChar.

    +
    +

    Запуск уплотнения кластеризации

    Если вы включили автоматическое уплотнение кластеризации, Milvus автоматически запускает уплотнение через указанный интервал времени. В качестве альтернативы вы можете вручную запустить уплотнение следующим образом:

    +
    coll1.compact(is_clustering=True)
    +coll1.get_compaction_state(is_clustering=True)
    +coll1.wait_for_compaction_completed(is_clustering=True)
    +
    +

    Тест бенчмарка

    Объем данных и шаблоны запросов в совокупности определяют повышение производительности уплотнения кластеризации. Внутренний эталонный тест демонстрирует, что уплотнение кластеризации дает 25-кратное улучшение количества запросов в секунду (QPS).

    +

    Эталонный тест проводился на коллекции, содержащей сущности из 20-миллионного 768-мерного набора данных LAION с ключевым полем, назначенным в качестве ключа кластеризации. После запуска уплотнения кластеризации в коллекции параллельные поиски выполняются до тех пор, пока загрузка процессора не достигнет высокого уровня.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Фильтр поискаКоэффициент отсеваЗадержка (мс)QPS (запросов/с)
    AvgMinMaxМедианаTP99
    Нет0%168567222941710229117.75
    ключ > 200 и ключ < 80040.2%10454718281085161728.38
    ключ > 200 и ключ < 60059.8%829451483882130335.78
    ключ > 200 и ключ < 40079.5%55010098558489854.00
    ключ == 100099%6824127370246431.41
    +

    По мере сужения диапазона поиска в фильтрах поиска коэффициент обрезки увеличивается. Это означает, что в процессе поиска пропускается больше сущностей. Сравнивая статистику в первой и последней строках, можно заметить, что поиск без уплотнения кластеров требует сканирования всей коллекции. С другой стороны, поиск с уплотнением кластеризации по определенному ключу позволяет добиться 25-кратного улучшения.

    +

    Лучшие практики

    Вот несколько советов по эффективному использованию кластерного уплотнения:

    +
      +
    • Включите эту функцию для коллекций с большим объемом данных. Производительность поиска повышается при увеличении объема данных в коллекции. Лучше всего включать эту функцию для коллекций, содержащих более 1 миллиона сущностей.

    • +
    • Выберите подходящий ключ кластеризации. В качестве ключа кластеризации можно использовать скалярные поля, обычно используемые в качестве условий фильтрации. Для коллекции, содержащей данные от нескольких арендаторов, в качестве ключа кластеризации можно использовать поле, которое отличает одного арендатора от другого.

    • +
    • Использовать ключ раздела в качестве ключа кластеризации. Вы можете установить значение common.usePartitionKeyAsClusteringKey в true, если хотите включить эту функцию для всех коллекций в вашем экземпляре Milvus или если вы все еще сталкиваетесь с проблемами производительности в большой коллекции с ключом раздела. При этом у вас будет ключ кластеризации и ключ раздела, когда вы выбираете скалярное поле в коллекции в качестве ключа раздела.

      +

      Обратите внимание, что эта настройка не мешает выбрать другое скалярное поле в качестве ключа кластеризации. Явно указанный ключ кластеризации всегда имеет приоритет.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.json new file mode 100644 index 000000000..de25fe219 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.json @@ -0,0 +1 @@ +{"codeList":["client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Strong\",​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n // highlight-next​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isClusteringKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n​\nexport params='{​\n \"consistencyLevel\": \"Strong\"​\n}'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","res = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-start​\n consistency_level=\"Bounded\",​\n # highlight-next​\n)​\n\n","SearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .searchParams(params)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"limit\": 3,​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n\n","res = client.query(​\n collection_name=\"my_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3,​\n # highlight-start​\n consistency_level=\"Eventually\",​\n # highlight-next​\n)​\n\n","QueryReq queryReq = QueryReq.builder()​\n .collectionName(\"my_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .consistencyLevel(ConsistencyLevel.EVENTUALLY)​\n .build();​\n ​\n QueryResp getResp = client.query(queryReq);​\n\n"],"headingContent":"Consistency Level​","anchorList":[{"label":"Уровень согласованности","href":"Consistency-Level​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Установка уровня согласованности","href":"Set-Consistency-Level​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.md new file mode 100644 index 000000000..d67a3b26e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/consistency.md @@ -0,0 +1,211 @@ +--- +id: consistency.md +summary: Узнайте о четырех уровнях согласованности в Milvus. +title: Последовательность +--- +

    Уровень согласованности

    Будучи распределенной векторной базой данных, Milvus предлагает несколько уровней согласованности, чтобы гарантировать, что каждый узел или реплика могут получить доступ к одним и тем же данным во время операций чтения и записи. В настоящее время поддерживаются такие уровни согласованности, как Strong, Bounded, Eventually и Session, при этом по умолчанию используется уровень согласованности Bounded.

    +

    Обзор

    Milvus - это система, которая разделяет хранение и вычисления. В этой системе DataNodes отвечают за сохранение данных и в конечном итоге хранят их в распределенном объектном хранилище, таком как MinIO/S3. QueryNodes решают вычислительные задачи, такие как поиск. Эти задачи включают в себя обработку как пакетных, так и потоковых данных. Проще говоря, под пакетными данными можно понимать данные, которые уже были сохранены в объектном хранилище, а под потоковыми данными - данные, которые еще не были сохранены в объектном хранилище. Из-за сетевых задержек узлы QueryNodes часто не могут хранить самые последние потоковые данные. Без дополнительных мер предосторожности выполнение поиска непосредственно на потоковых данных может привести к потере многих незафиксированных точек данных, что повлияет на точность результатов поиска.

    +

    Milvus - это система, которая разделяет хранение и вычисления. В этой системе узлы DataNodes отвечают за сохранение данных и в конечном итоге хранят их в распределенном объектном хранилище, таком как MinIO/S3. QueryNodes решают вычислительные задачи, такие как поиск. Эти задачи включают в себя обработку как пакетных, так и потоковых данных. Проще говоря, под пакетными данными можно понимать данные, которые уже были сохранены в объектном хранилище, а под потоковыми данными - данные, которые еще не были сохранены в объектном хранилище. Из-за сетевых задержек узлы QueryNodes часто не могут хранить самые последние потоковые данные. Без дополнительных мер предосторожности выполнение поиска непосредственно на потоковых данных может привести к потере многих незафиксированных точек данных, что повлияет на точность результатов поиска.

    +

    + + Batch data and streaming data + Пакетные данные и потоковые данные

    +

    Как показано на рисунке выше, после получения запроса на поиск узлы QueryNodes могут одновременно получать как потоковые, так и пакетные данные. Однако из-за сетевой задержки потоковые данные, полученные узлами QueryNodes, могут быть неполными.

    +

    Чтобы решить эту проблему, Milvus проставляет временные метки для каждой записи в очереди данных и постоянно вставляет метки синхронизации в очередь данных. При получении временной метки синхронизации (syncTs) QueryNodes устанавливает ее в качестве ServiceTime, что означает, что QueryNodes могут видеть все данные до этого Service Time. Основываясь на ServiceTime, Milvus может предоставлять гарантийные временные метки (GuaranteeTs) для удовлетворения различных требований пользователей к согласованности и доступности. Пользователи могут сообщить узлам QueryNodes о необходимости включить в область поиска данные до определенного момента времени, указав GuaranteeTs в своих поисковых запросах.

    +

    + + ServiceTime and GuaranteeTs + ServiceTime и GuaranteeTs

    +

    Как показано на рисунке выше, если GuaranteeTs меньше ServiceTime, это означает, что все данные до указанного момента времени были полностью записаны на диск, что позволяет узлам QueryNodes немедленно выполнить операцию поиска. Когда GuaranteeTs больше ServiceTime, узлы QueryNodes должны ждать, пока ServiceTime превысит GuaranteeTs, прежде чем они смогут выполнить операцию Search.

    +

    Пользователям необходимо найти компромисс между точностью запроса и его задержкой. Если пользователи предъявляют высокие требования к согласованности и не чувствительны к задержкам запросов, они могут установить GuaranteeTs на максимально возможное значение; если пользователи хотят получать результаты поиска быстро и более терпимы к точности запросов, то GuaranteeTs можно установить на меньшее значение.

    +

    + + Consistency Levels Illustrated + Иллюстрация уровней согласованности

    +

    Milvus предоставляет четыре типа уровней согласованности с различными GuaranteeTs.

    +
      +
    • Сильная

      +

      В качестве GuaranteeTs используется последняя временная метка, и узлы запросов должны ждать, пока ServiceTime не достигнет GuaranteeTs, прежде чем выполнять запросы на поиск.

    • +
    • Eventual

      +

      GuaranteeTs устанавливается на очень маленькое значение, например 1, чтобы избежать проверок согласованности, и QueryNodes могут немедленно выполнять поисковые запросы по всем пакетным данным.

    • +
    • Ограниченная стабильность

      +

      GuranteeTs устанавливается в момент времени, более ранний, чем последняя временная метка, чтобы QueryNodes могли выполнять поиск с допуском на определенную потерю данных.

    • +
    • Сессия

      +

      В качестве GuaranteeTs используется последняя временная точка, в которую клиент вставляет данные, чтобы узлы QueryNodes могли выполнять поиск по всем данным, вставленным клиентом.

    • +
    +

    Milvus использует Bounded Staleness в качестве уровня согласованности по умолчанию. Если GuaranteeTs не указан, в качестве GuaranteeTs используется последнее ServiceTime.

    +

    Установка уровня согласованности

    Вы можете установить различные уровни согласованности при создании коллекции, а также при выполнении поиска и запросов.

    +

    Установка уровня согласованности при создании коллекции

    При создании коллекции можно установить уровень согласованности для поиска и запросов внутри коллекции. В следующем примере кода уровень согласованности установлен на Strong.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Strong",​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .collectionSchema(schema)​
    +        // highlight-next​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isClusteringKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +​
    +export params='{​
    +    "consistencyLevel": "Strong"​
    +}'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_collection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

    +

    Установка уровня согласованности в поиске

    Вы всегда можете изменить уровень согласованности для конкретного поиска. Следующий пример кода устанавливает уровень согласованности обратно на Bounded. Изменение применяется только к текущему поисковому запросу.

    + +
    res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-start​
    +    consistency_level="Bounded",​
    +    # highlight-next​
    +)​
    +
    +
    +
    SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .searchParams(params)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "limit": 3,​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +
    +
    +

    Этот параметр также доступен в гибридных поисках и поисковом итераторе. Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

    +

    Установка уровня согласованности в запросе

    Вы всегда можете изменить уровень согласованности для конкретного поиска. Следующий пример кода устанавливает уровень согласованности на Eventually. Настройка применяется только к текущему запросу.

    + +
    res = client.query(​
    +    collection_name="my_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3,​
    +    # highlight-start​
    +    consistency_level="Eventually",​
    +    # highlight-next​
    +)​
    +
    +
    +
    QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("my_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .consistencyLevel(ConsistencyLevel.EVENTUALLY)​
    +        .build();​
    +        ​
    + QueryResp getResp = client.query(queryReq);​
    +
    +
    +

    Этот параметр также доступен в итераторе запроса. Возможные значения параметра consistency_level: Strong, Bounded, Eventually и Session.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.json new file mode 100644 index 000000000..d1621f446 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\", \"likes\": 165},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\", \"likes\": 25},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\", \"likes\": 764},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\", \"likes\": 234},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\", \"likes\": 122},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\", \"likes\": 12},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\", \"likes\": 58},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\", \"likes\": 775},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\", \"likes\": 876},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\", \"likes\": 765}​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\" and likes > 50',​\n output_fields=[\"color\", \"likes\"]​\n # highlight-end​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"filtered_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .filter(\"color like \\\"red%\\\" and likes > 50\")​\n .outputFields(Arrays.asList(\"color\", \"likes\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​\n\n","import (​\n \"context\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_filter() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"filtered_search_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithFilter(`color like \"red%\" and likes > 50`).WithOutputFields(\"color\", \"likes\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nconst res = await client.search({​\n collection_name: \"filtered_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: 'color like \"red%\" and likes > 50',​\n output_fields: [\"color\", \"likes\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\", \"likes\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Filtered Search​","anchorList":[{"label":"Фильтрованный поиск","href":"Filtered-Search​","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Примеры","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.md new file mode 100644 index 000000000..a4a72d48b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/filtered-search.md @@ -0,0 +1,257 @@ +--- +id: filtered-search.md +title: Фильтрованный поиск +related_key: 'ann search, filtered search' +summary: >- + ANN-поиск находит векторные вкрапления, наиболее похожие на заданные векторные + вкрапления. Однако результаты поиска не всегда могут быть корректными. Вы + можете включить условия фильтрации в поисковый запрос, чтобы Milvus проводил + фильтрацию метаданных перед проведением ANN-поиска, сокращая область поиска со + всей коллекции до сущностей, соответствующих указанным условиям фильтрации. +--- +

    Фильтрованный поиск

    ANN-поиск находит векторные вкрапления, наиболее похожие на заданные векторные вкрапления. Однако результаты поиска не всегда могут быть корректными. Вы можете включить условия фильтрации в запрос на поиск, чтобы Milvus проводил фильтрацию метаданных перед проведением ANN-поиска, сокращая область поиска со всей коллекции до сущностей, соответствующих указанным условиям фильтрации.

    +

    Обзор

    Если коллекция содержит как векторные вкрапления, так и их метаданные, вы можете отфильтровать метаданные перед ANN-поиском, чтобы улучшить релевантность результатов поиска. Получив поисковый запрос с условием фильтрации, Milvus ограничивает область поиска сущностями, соответствующими указанному условию фильтрации.

    +

    + + Filtered search + Отфильтрованный поиск

    +

    Как показано на диаграмме выше, поисковый запрос содержит chunk like % red % в качестве условия фильтрации, что указывает на то, что Milvus должен провести поиск ANN во всех сущностях, которые имеют слово red в поле chunk. В частности, Milvus делает следующее.

    +
      +
    • Отфильтровать сущности, соответствующие условиям фильтрации, указанным в поисковом запросе.

    • +
    • Проводит ANN-поиск в отфильтрованных сущностях.

    • +
    • Возвращает топ-K сущностей.

    • +
    +

    Примеры

    В этом разделе показано, как проводить фильтрованный поиск. Фрагменты кода в этом разделе предполагают, что у вас уже есть следующие сущности в вашей коллекции. Каждая сущность имеет четыре поля, а именно id, vector, color и likes.

    +
    [​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025", "likes": 25},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781", "likes": 764},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298", "likes": 234},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794", "likes": 122},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222", "likes": 12},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392", "likes": 58},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510", "likes": 775},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381", "likes": 876},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976", "likes": 765}​
    +]​
    +
    +
    +

    Поисковый запрос в следующем фрагменте кода содержит условие фильтрации и несколько выходных полей.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%" and likes > 50',​
    +    output_fields=["color", "likes"]​
    +    # highlight-end​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("filtered_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .filter("color like \"red%\" and likes > 50")​
    +        .outputFields(Arrays.asList("color", "likes"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​
    +
    +
    +
    import (​
    +    "context"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_filter() {​
    +        ctx, cancel := context.WithCancel(context.Background())​
    +        defer cancel()​
    +​
    +        milvusAddr := "127.0.0.1:19530"​
    +        token := "root:Milvus"​
    +​
    +        cli, err := client.New(ctx, &client.ClientConfig{​
    +                Address: milvusAddr,​
    +                APIKey:  token,​
    +        })​
    +        if err != nil {​
    +                log.Fatal("failed to connect to milvus server: ", err.Error())​
    +        }​
    +​
    +        defer cli.Close(ctx)​
    +​
    +        queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +        resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +                "filtered_search_collection", // collectionName​
    +                3,             // limit​
    +                []entity.Vector{entity.FloatVector(queryVector)},​
    +        ).WithFilter(`color like "red%" and likes > 50`).WithOutputFields("color", "likes"))​
    +        if err != nil {​
    +                log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +        }​
    +​
    +        for _, resultSet := range resultSets {​
    +                log.Println("IDs: ", resultSet.IDs)​
    +                log.Println("Scores: ", resultSet.Scores)​
    +        }​
    +        // Output:​
    +        // IDs:​
    +        // Scores:​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +const res = await client.search({​
    +    collection_name: "filtered_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: 'color like "red%" and likes > 50',​
    +    output_fields: ["color", "likes"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "outputFields": ["color", "likes"]​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    Условие фильтрации в поисковом запросе читается как color like "red%" and likes > 50. В нем используется оператор and для включения двух условий: первое запрашивает сущности, имеющие значение, начинающееся с red в поле color, а второе - сущности со значением больше 50 в поле likes. Этим требованиям отвечают только две сущности. При установке top-K на 3 Milvus вычислит расстояние между этими двумя сущностями до вектора запроса и вернет их в качестве результатов поиска.

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    Дополнительные сведения об операторах, которые можно использовать при фильтрации метаданных, см. в разделе Фильтрация метаданных.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.json new file mode 100644 index 000000000..b76cb434e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType, Function, FunctionType​\n\nclient = MilvusClient(uri=\"http://localhost:19530\")\n​\nschema = client.create_schema()​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True, auto_id=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .build();\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"sparse\")\n .dataType(DataType.SparseFloatVector)\n .build());\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\nconst schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n\nconsole.log(res.results)\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n","bm25_function = Function(​\n name=\"text_bm25_emb\", # Function name​\n input_field_names=[\"text\"], # Name of the VARCHAR field containing raw text data​\n output_field_names=[\"sparse\"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​\n function_type=FunctionType.BM25,​\n)​\n​\nschema.add_function(bm25_function)​\n\n","import io.milvus.common.clientenum.FunctionType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq.Function;\n\nimport java.util.*;\n\nschema.addFunction(Function.builder()\n .functionType(FunctionType.BM25)\n .name(\"text_bm25_emb\")\n .inputFieldNames(Collections.singletonList(\"text\"))\n .outputFieldNames(Collections.singletonList(\"vector\"))\n .build());\n","const functions = [\n {\n name: 'text_bm25_emb',\n description: 'bm25 function',\n type: FunctionType.BM25,\n input_field_names: ['text'],\n output_field_names: ['vector'],\n params: {},\n },\n];\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ],\n \"functions\": [\n {\n \"name\": \"text_bm25_emb\",\n \"type\": \"BM25\",\n \"inputFieldNames\": [\"text\"],\n \"outputFieldNames\": [\"sparse\"],\n \"params\": {}\n }\n ]\n }'\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_type=\"AUTOINDEX\", ​\n metric_type=\"BM25\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;\n\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"sparse\")\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)\n .metricType(IndexParam.MetricType.BM25)\n .build());\n","const index_params = [\n {\n field_name: \"sparse\",\n metric_type: \"BM25\",\n index_type: \"AUTOINDEX\",\n },\n];\n","export indexParams='[\n {\n \"fieldName\": \"sparse\",\n \"metricType\": \"BM25\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n","client.create_collection(​\n collection_name='demo', ​\n schema=schema, ​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"demo\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","await client.create_collection(\n collection_name: 'demo', \n schema: schema, \n index_params: index_params,\n functions: functions\n);\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"demo\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n","client.insert('demo', [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n])\n\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\n\nimport io.milvus.v2.service.vector.request.InsertReq;\n\nGson gson = new Gson();\nList rows = Arrays.asList(\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval is a field of study.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval focuses on finding relevant information in large datasets.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"data mining and information retrieval overlap in research.\\\"}\", JsonObject.class)\n);\n\nclient.insert(InsertReq.builder()\n .collectionName(\"demo\")\n .data(rows)\n .build());\n","await client.insert({\ncollection_name: 'demo', \ndata: [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n]);\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"data\": [\n {\"text\": \"information retrieval is a field of study.\"},\n {\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"},\n {\"text\": \"data mining and information retrieval overlap in research.\"} \n ],\n \"collectionName\": \"demo\"\n}'\n","search_params = {​\n 'params': {'drop_ratio_search': 0.2},​\n}​\n​\nclient.search(​\n collection_name='demo', ​\n data=['whats the focus of information retrieval?'],​\n anns_field='sparse',​\n limit=3,​\n search_params=search_params​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq;\nimport io.milvus.v2.service.vector.request.data.EmbeddedText;\nimport io.milvus.v2.service.vector.response.SearchResp;\n\nMap searchParams = new HashMap<>();\nsearchParams.put(\"drop_ratio_search\", 0.2);\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"demo\")\n .data(Collections.singletonList(new EmbeddedText(\"whats the focus of information retrieval?\")))\n .annsField(\"sparse\")\n .topK(3)\n .searchParams(searchParams)\n .outputFields(Collections.singletonList(\"text\"))\n .build());\n","await client.search(\n collection_name: 'demo', \n data: ['whats the focus of information retrieval?'],\n anns_field: 'sparse',\n limit: 3,\n params: {'drop_ratio_search': 0.2},\n)\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"demo\",\n \"data\": [\n \"whats the focus of information retrieval?\"\n ],\n \"annsField\": \"sparse\",\n \"limit\": 3,\n \"outputFields\": [\n \"text\"\n ],\n \"searchParams\":{\n \"params\":{\n \"drop_ratio_search\":0.2\n }\n }\n}'\n"],"headingContent":"Full Text Search​","anchorList":[{"label":"Полнотекстовый поиск","href":"Full-Text-Search​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создание коллекции для полнотекстового поиска","href":"Create-a-collection-for-full-text-search​","type":2,"isActive":false},{"label":"Вставка текстовых данных","href":"Insert-text-data","type":2,"isActive":false},{"label":"Выполнение полнотекстового поиска","href":"Perform-full-text-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.md new file mode 100644 index 000000000..6baf5de3d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/full-text-search.md @@ -0,0 +1,501 @@ +--- +id: full-text-search.md +title: Полнотекстовый поиск +related_key: 'full, text, search' +summary: >- + Полнотекстовый поиск - это функция, которая позволяет находить в текстовых + массивах документов документы, содержащие определенные термины или фразы, а + затем ранжировать результаты по релевантности. +--- +

    Полнотекстовый поиск

    Полнотекстовый поиск - это функция, которая позволяет находить документы, содержащие определенные термины или фразы в текстовых массивах данных, а затем ранжировать результаты по релевантности. Эта функция преодолевает ограничения семантического поиска, который может упускать из виду точные термины, обеспечивая получение наиболее точных и контекстуально релевантных результатов. Кроме того, она упрощает векторный поиск, принимая исходный текст, автоматически преобразуя текстовые данные в разреженные вкрапления без необходимости вручную генерировать векторные вкрапления.

    +

    Эта функция, использующая алгоритм BM25 для оценки релевантности, особенно ценна в сценариях поиска с расширенной генерацией (RAG), где приоритет отдается документам, которые точно соответствуют определенным поисковым терминам.

    +
    +
      +
    • Интегрируя полнотекстовый поиск с плотным векторным поиском на основе семантики, вы можете повысить точность и релевантность результатов поиска. Дополнительную информацию см. в разделе "Гибридный поиск".
    • +
    • Полнотекстовый поиск доступен в Milvus Standalone и Milvus Distributed, но не в Milvus Lite, хотя его добавление в Milvus Lite находится в дорожной карте.
    • +
    +
    +

    Обзор

    Полнотекстовый поиск упрощает процесс поиска по тексту, устраняя необходимость ручного встраивания. Эта функция работает по следующей схеме.

    +
      +
    1. Ввод текста: Вы вставляете необработанные текстовые документы или предоставляете текст запроса без необходимости их ручного встраивания.

    2. +
    3. Анализ текста: Milvus использует анализатор для токенизации входного текста в отдельные термины, пригодные для поиска. Дополнительные сведения об анализаторах см. в разделе Обзор анализаторов.

    4. +
    5. Обработка функции: Встроенная функция получает токенизированные термины и преобразует их в разреженные векторные представления.

    6. +
    7. Хранение коллекций: Milvus хранит эти разреженные вкрапления в коллекции для эффективного поиска.

    8. +
    9. BM25 scoring: Во время поиска Milvus применяет алгоритм BM25 для подсчета баллов для сохраненных документов и ранжирует совпавшие результаты на основе их релевантности тексту запроса.

    10. +
    +

    + + Full text search + Полнотекстовый поиск

    +

    Чтобы воспользоваться полнотекстовым поиском, выполните следующие основные действия.

    +
      +
    1. Создайте коллекцию: Создайте коллекцию с необходимыми полями и определите функцию для преобразования необработанного текста в разреженные вкрапления.

    2. +
    3. Вставить данные: Вставьте необработанные текстовые документы в коллекцию.

    4. +
    5. Выполните поиск: Используйте тексты запросов для поиска по коллекции и получения релевантных результатов.

    6. +
    +

    Создание коллекции для полнотекстового поиска

    Чтобы включить полнотекстовый поиск, создайте коллекцию с определенной схемой. Эта схема должна включать три необходимых поля.

    +
      +
    • Основное поле, которое уникально идентифицирует каждую сущность в коллекции.

    • +
    • Поле VARCHAR, в котором хранятся необработанные текстовые документы, с атрибутом enable_analyzer, установленным на True. Это позволяет Milvus преобразовывать текст в определенные термины для функциональной обработки.

    • +
    • Поле SPARSE_FLOAT_VECTOR зарезервировано для хранения разреженных вкраплений, которые Milvus будет автоматически генерировать для поля VARCHAR.

    • +
    +

    Определите схему коллекции

    Сначала создайте схему и добавьте необходимые поля.

    + +
    from pymilvus import MilvusClient, DataType, Function, FunctionType​
    +
    +client = MilvusClient(uri="http://localhost:19530")
    +​
    +schema = client.create_schema()​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .build();
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("sparse")
    +        .dataType(DataType.SparseFloatVector)
    +        .build());
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +console.log(res.results)
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +

    В этой конфигурации.

    +
      +
    • id: служит первичным ключом и автоматически генерируется с помощью auto_id=True.

    • +
    • textВ : хранятся необработанные текстовые данные для операций полнотекстового поиска. Тип данных должен быть VARCHAR, так как VARCHAR - это строковый тип данных Milvus для хранения текста. Установите enable_analyzer=True, чтобы Milvus мог токенизировать текст. По умолчанию Milvus использует стандартный анализатор для анализа текста. Чтобы настроить другой анализатор, обратитесь к разделу Обзор.

    • +
    • sparse: векторное поле, зарезервированное для хранения внутренних разреженных вкраплений для операций полнотекстового поиска. Тип данных должен быть SPARSE_FLOAT_VECTOR.

    • +
    +

    Теперь определите функцию, которая будет преобразовывать ваш текст в разреженные векторные представления, а затем добавьте ее в схему.

    + +
    bm25_function = Function(​
    +    name="text_bm25_emb", # Function name​
    +    input_field_names=["text"], # Name of the VARCHAR field containing raw text data​
    +    output_field_names=["sparse"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​
    +    function_type=FunctionType.BM25,​
    +)​
    +​
    +schema.add_function(bm25_function)​
    +
    +
    +
    import io.milvus.common.clientenum.FunctionType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq.Function;
    +
    +import java.util.*;
    +
    +schema.addFunction(Function.builder()
    +        .functionType(FunctionType.BM25)
    +        .name("text_bm25_emb")
    +        .inputFieldNames(Collections.singletonList("text"))
    +        .outputFieldNames(Collections.singletonList("vector"))
    +        .build());
    +
    +
    const functions = [
    +    {
    +      name: 'text_bm25_emb',
    +      description: 'bm25 function',
    +      type: FunctionType.BM25,
    +      input_field_names: ['text'],
    +      output_field_names: ['vector'],
    +      params: {},
    +    },
    +];
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ],
    +        "functions": [
    +            {
    +                "name": "text_bm25_emb",
    +                "type": "BM25",
    +                "inputFieldNames": ["text"],
    +                "outputFieldNames": ["sparse"],
    +                "params": {}
    +            }
    +        ]
    +    }'
    +
    +

    Параметр

    +

    Описание

    +

    name

    +

    +

    Название функции. Эта функция преобразует необработанный текст из поля text в векторы для поиска, которые будут храниться в поле sparse.

    +

    input_field_names

    +

    Имя поля VARCHAR, требующего преобразования текста в разреженный вектор. Для FunctionType.BM25 этот параметр принимает только одно имя поля.

    +

    output_field_names

    +

    Имя поля, в котором будут храниться сгенерированные внутри поля разреженные векторы. Для FunctionType.BM25 этот параметр принимает только одно имя поля.

    +

    function_type

    +

    Тип используемой функции. Установите значение FunctionType.BM25.

    +
    +
    +

    Для коллекций с несколькими полями VARCHAR, требующими преобразования текста в разреженный вектор, добавьте в схему коллекции отдельные функции, обеспечив каждой функции уникальное имя и значение output_field_names.

    +
    +

    Настройка индекса

    Определив схему с необходимыми полями и встроенной функцией, настройте индекс для коллекции. Чтобы упростить этот процесс, используйте AUTOINDEX в качестве index_type, который позволяет Milvus выбрать и настроить наиболее подходящий тип индекса, основываясь на структуре ваших данных.

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_type="AUTOINDEX", ​
    +    metric_type="BM25"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;
    +
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("sparse")
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)
    +        .metricType(IndexParam.MetricType.BM25)
    +        .build());
    +
    +
    const index_params = [
    +  {
    +    field_name: "sparse",
    +    metric_type: "BM25",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +
    export indexParams='[
    +        {
    +            "fieldName": "sparse",
    +            "metricType": "BM25",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +

    Параметр

    +

    Описание

    +

    field_name

    +

    Имя векторного поля для индексации. Для полнотекстового поиска это должно быть поле, в котором хранятся сгенерированные разреженные векторы. В данном примере задано значение sparse.

    +

    index_type

    +

    Тип создаваемого индекса. AUTOINDEX позволяет Milvus автоматически оптимизировать настройки индекса. Если вам нужно больше контроля над настройками индекса, вы можете выбрать один из различных типов индексов, доступных для разреженных векторов в Milvus. Дополнительную информацию см. в разделе Индексы, поддерживаемые в Milvus.

    +

    metric_type

    +

    Значение этого параметра должно быть установлено на BM25 специально для функциональности полнотекстового поиска.

    +
    +

    Создайте коллекцию

    Теперь создайте коллекцию, используя заданные параметры схемы и индекса.

    + +
    client.create_collection(​
    +    collection_name='demo', ​
    +    schema=schema, ​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("demo")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    await client.create_collection(
    +    collection_name: 'demo', 
    +    schema: schema, 
    +    index_params: index_params,
    +    functions: functions
    +);
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"demo\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    +

    Вставка текстовых данных

    После настройки коллекции и индекса вы готовы к вставке текстовых данных. В этом процессе вам нужно только предоставить исходный текст. Встроенная функция, которую мы определили ранее, автоматически генерирует соответствующий разреженный вектор для каждой текстовой записи.

    + +
    client.insert('demo', [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +])
    +
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +
    +import io.milvus.v2.service.vector.request.InsertReq;
    +
    +Gson gson = new Gson();
    +List<JsonObject> rows = Arrays.asList(
    +        gson.fromJson("{\"text\": \"information retrieval is a field of study.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"data mining and information retrieval overlap in research.\"}", JsonObject.class)
    +);
    +
    +client.insert(InsertReq.builder()
    +        .collectionName("demo")
    +        .data(rows)
    +        .build());
    +
    +
    await client.insert({
    +collection_name: 'demo', 
    +data: [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +]);
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "data": [
    +        {"text": "information retrieval is a field of study."},
    +        {"text": "information retrieval focuses on finding relevant information in large datasets."},
    +        {"text": "data mining and information retrieval overlap in research."}       
    +    ],
    +    "collectionName": "demo"
    +}'
    +
    +

    После того как вы вставили данные в свою коллекцию, вы можете выполнять полнотекстовый поиск с помощью запросов с сырым текстом. Milvus автоматически преобразует ваш запрос в разреженный вектор и ранжирует совпадающие результаты поиска с помощью алгоритма BM25, а затем возвращает результаты topK (limit).

    + +
    search_params = {​
    +    'params': {'drop_ratio_search': 0.2},​
    +}​
    +​
    +client.search(​
    +    collection_name='demo', ​
    +    data=['whats the focus of information retrieval?'],​
    +    anns_field='sparse',​
    +    limit=3,​
    +    search_params=search_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;
    +import io.milvus.v2.service.vector.request.data.EmbeddedText;
    +import io.milvus.v2.service.vector.response.SearchResp;
    +
    +Map<String,Object> searchParams = new HashMap<>();
    +searchParams.put("drop_ratio_search", 0.2);
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("demo")
    +        .data(Collections.singletonList(new EmbeddedText("whats the focus of information retrieval?")))
    +        .annsField("sparse")
    +        .topK(3)
    +        .searchParams(searchParams)
    +        .outputFields(Collections.singletonList("text"))
    +        .build());
    +
    +
    await client.search(
    +    collection_name: 'demo', 
    +    data: ['whats the focus of information retrieval?'],
    +    anns_field: 'sparse',
    +    limit: 3,
    +    params: {'drop_ratio_search': 0.2},
    +)
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "demo",
    +    "data": [
    +        "whats the focus of information retrieval?"
    +    ],
    +    "annsField": "sparse",
    +    "limit": 3,
    +    "outputFields": [
    +        "text"
    +    ],
    +    "searchParams":{
    +        "params":{
    +            "drop_ratio_search":0.2
    +        }
    +    }
    +}'
    +
    +

    Параметр

    +

    Описание

    +

    search_params

    +

    Словарь, содержащий параметры поиска.

    +

    params.drop_ratio_search

    +

    Доля низкочастотных терминов, которые следует игнорировать при поиске. Подробнее см. в разделе "Разреженный вектор".

    +

    data

    +

    Необработанный текст запроса.

    +

    anns_field

    +

    Имя поля, содержащего внутренне сгенерированные разреженные векторы.

    +

    limit

    +

    Максимальное количество возвращаемых совпадений.

    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.json new file mode 100644 index 000000000..b2af13daa --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"},​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.GetReq​\nimport io.milvus.v2.service.vector.request.GetResp​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nGetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .ids(Arrays.asList(0, 1, 2))​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\nList results = getResp.getGetResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.get({​\n collection_name=\"query_collection\",​\n ids=[0,1,2],​\n output_fields=[\"vector\", \"color\"]​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"pink_8682\",\"id\":0,\"vector\":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"orange_6781\",\"id\":2,\"vector\":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n\n","​\nimport io.milvus.v2.service.vector.request.QueryReq​\nimport io.milvus.v2.service.vector.request.QueryResp​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\nList results = getResp.getQueryResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​\n// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nfunc ExampleClient_Query_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n resultSet, err := cli.Query(ctx, client.NewQueryOption(\"query_collection\").​\n WithFilter(`color like \"red%\"`).​\n WithOutputFields(\"vector\", \"color\").​\n WithLimit(3))​\n​\n fmt.Println(resultSet.GetColumn(\"color\"))​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.query({​\n collection_name=\"quick_setup\",​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n#{\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"red_4794\",\"id\":4,\"vector\":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{\"color\":\"red_9392\",\"id\":6,\"vector\":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​\n\n","from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","import io.milvus.orm.iterator.QueryIterator;​\nimport io.milvus.response.QueryResultsWrapper;​\nimport io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.QueryIteratorReq;​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n​\nwhile (true) {​\n List res = queryIterator.next();​\n if (res.isEmpty()) {​\n queryIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n​\n// Output​\n// [color:red_7025, id:1]​\n// [color:red_4794, id:4]​\n// [color:red_9392, id:6]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","# Currently not available\n\n","from pymilvus import MilvusClient​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nfrom pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n​\n# 使用 QueryIterator​\nfrom pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","GetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionName(\"partitionA\")​\n .ids(Arrays.asList(10, 11, 12))​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Collections.singletonList(\"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 使用 Get 方法​\nvar res = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 使用 Query 方法​\nres = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 暂不支持使用 QueryIterator​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n partition_names: ['partitionA'],​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['vector', 'color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\n# 使用 Get 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# 使用 Query 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"],​\n \"id\": [0, 1, 2]​\n}'​\n\n"],"headingContent":"Query​","anchorList":[{"label":"Запрос","href":"Query​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование Get","href":"Use-Get​","type":2,"isActive":false},{"label":"Использование запросов","href":"Use-Query​","type":2,"isActive":false},{"label":"Использование QueryIterator","href":"Use-QueryIterator​","type":2,"isActive":false},{"label":"Запросы в разделах","href":"Queries-in-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.md new file mode 100644 index 000000000..cd1b47005 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/get-and-scalar-query.md @@ -0,0 +1,587 @@ +--- +id: get-and-scalar-query.md +summary: >- + В дополнение к поиску по ANN, Milvus также поддерживает фильтрацию метаданных + с помощью запросов. На этой странице рассказывается, как использовать Query, + Get и QueryIterators для выполнения фильтрации метаданных. +title: Запрос +--- +

    Запрос

    Помимо поиска по ANN, Milvus также поддерживает фильтрацию метаданных с помощью запросов. На этой странице рассказывается о том, как использовать Query, Get и QueryIterators для фильтрации метаданных.

    +

    Обзор

    Коллекция может хранить различные типы скалярных полей. Вы можете заставить Milvus фильтровать сущности на основе одного или нескольких скалярных полей. Milvus предлагает три типа запросов: Query, Get и QueryIterator. В таблице ниже приведено сравнение этих трех типов запросов.

    +

    +

    Get

    +

    Запрос

    +

    QueryIterator

    +

    Применимые сценарии

    +

    Чтобы найти сущности, содержащие указанные первичные ключи.

    +

    +

    Чтобы найти все или определенное количество сущностей, удовлетворяющих пользовательским условиям фильтрации.

    +

    Для поиска всех сущностей, удовлетворяющих пользовательским условиям фильтрации, в постраничных запросах.

    +

    Метод фильтрации

    +

    По первичным ключам

    +

    По выражениям фильтрации.

    +

    По выражениям фильтрации.

    +

    Обязательные параметры

    +
    • Имя коллекции

    • +
    • Первичные ключи

    +

    +
    • Имя коллекции

    • +
    • Выражения фильтрации

    +
    • Имя коллекции

    • +
    • Выражения фильтрации

    • +
    • Количество сущностей, возвращаемых по запросу

    +

    Необязательные параметры

    +
    • Имя раздела

    • +
    • Выходные поля

    +
    • Имя раздела

    • +
    • Количество возвращаемых сущностей

    • +
    • Поля вывода

    +
    • Имя раздела

    • +
    • Общее количество возвращаемых сущностей

    • +
    • Выходные поля

    +

    Возвращает

    +

    Возвращает сущности, содержащие указанные первичные ключи в указанной коллекции или разделе.

    +

    Возвращает все или определенное количество сущностей, удовлетворяющих пользовательским условиям фильтрации, в указанной коллекции или разделе.

    +

    Возвращает все сущности, удовлетворяющие пользовательским условиям фильтрации, в указанной коллекции или разделе с помощью постраничных запросов.

    +
    +

    Дополнительные сведения о фильтрации метаданных см. в разделе Фильтрация метаданных.

    +

    Использование Get

    Когда вам нужно найти сущности по их первичным ключам, вы можете использовать метод Get. В следующих примерах кода предполагается, что в вашей коллекции есть три поля с именами id, vector и color, и возвращаются сущности с первичными ключами 1, 2 и 3.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},​
    +]​
    +
    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.GetReq​
    +import io.milvus.v2.service.vector.request.GetResp​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +        ​
    +GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .ids(Arrays.asList(0, 1, 2))​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getGetResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.get({​
    +    collection_name="query_collection",​
    +    ids=[0,1,2],​
    +    output_fields=["vector", "color"]​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"color":"pink_8682","id":0,"vector":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"orange_6781","id":2,"vector":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​
    +
    +
    +

    Использование запросов

    Когда вам нужно найти сущности по пользовательским условиям фильтрации, используйте метод Query. Следующие примеры кода предполагают наличие трех полей с именами id, vector и color и возвращают указанное количество сущностей, имеющих значение color, начиная с red.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.service.vector.request.QueryReq​
    +import io.milvus.v2.service.vector.request.QueryResp​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getQueryResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​
    +// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +func ExampleClient_Query_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    resultSet, err := cli.Query(ctx, client.NewQueryOption("query_collection").​
    +        WithFilter(`color like "red%"`).​
    +        WithOutputFields("vector", "color").​
    +        WithLimit(3))​
    +​
    +    fmt.Println(resultSet.GetColumn("color"))​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.query({​
    +    collection_name="quick_setup",​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +#{"code":0,"cost":0,"data":[{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"red_4794","id":4,"vector":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{"color":"red_9392","id":6,"vector":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​
    +
    +
    +

    Использование QueryIterator

    Если вам нужно найти сущности по пользовательским условиям фильтрации с помощью постраничных запросов, создайте QueryIterator и используйте его метод next() для итерации по всем сущностям, чтобы найти те, которые удовлетворяют условиям фильтрации. В следующих примерах кода предполагается, что есть три поля с именами id, vector и color, и возвращаются все сущности, имеющие значение color, начиная с red.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    import io.milvus.orm.iterator.QueryIterator;​
    +import io.milvus.response.QueryResultsWrapper;​
    +import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.QueryIteratorReq;​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = queryIterator.next();​
    +    if (res.isEmpty()) {​
    +        queryIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +​
    +// Output​
    +// [color:red_7025, id:1]​
    +// [color:red_4794, id:4]​
    +// [color:red_9392, id:6]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    # Currently not available
    +
    +
    +

    Запросы в разделах

    Вы также можете выполнять запросы в одном или нескольких разделах, включив имена разделов в запрос Get, Query или QueryIterator. В следующих примерах кода предполагается, что в коллекции есть раздел с именем PartitionA.

    + +
    from pymilvus import MilvusClient​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +​
    +# 使用 QueryIterator​
    +from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionName("partitionA")​
    +        .ids(Arrays.asList(10, 11, 12))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Collections.singletonList("color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 使用 Get 方法​
    +var res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 使用 Query 方法​
    +res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 暂不支持使用 QueryIterator​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  partition_names: ['partitionA'],​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['vector', 'color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +# 使用 Get 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# 使用 Query 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"],​
    +    "id": [0, 1, 2]​
    +}'​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.json new file mode 100644 index 000000000..807006ee3 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"chunk\": \"pink_8682\", \"docId\": 1},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"chunk\": \"red_7025\", \"docId\": 5},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"chunk\": \"orange_6781\", \"docId\": 2},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"chunk\": \"pink_9298\", \"docId\": 3},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"chunk\": \"red_4794\", \"docId\": 3},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"chunk\": \"yellow_4222\", \"docId\": 4},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"chunk\": \"red_9392\", \"docId\": 1},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"chunk\": \"grey_8510\", \"docId\": 2},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"chunk\": \"white_9381\", \"docId\": 5},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"chunk\": \"purple_4976\", \"docId\": 3},​\n]​\n​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vectors = [​\n [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​\n​\n# Group search results​\nres = client.search(​\n collection_name=\"group_search_collection\",​\n data=query_vectors,​\n limit=3,​\n group_by_field=\"docId\",​\n output_fields=[\"docId\"]​\n)​\n​\n# Retrieve the values in the `docId` column​\ndoc_ids = [result['entity']['docId'] for result in res[0]]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .groupByFieldName(\"docId\")​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n\n","// nolint​\nfunc ExampleClient_Search_grouping() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithGroupByField(\"docId\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n // highlight-start​\n group_by_field: \"docId\"​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"groupingField\": \"docId\",​\n \"outputFields\": [\"docId\"]​\n}'​\n\n","# Group search results​\n​\nres = client.search(​\n collection_name=\"group_search_collection\", ​\n data=query_vectors, # Query vector\n limit=5, # Top K results​ to return​\n group_by_field=\"docId\", # Group by docId​\n group_size=2, # Return 2 entities per group​\n strict_group_size=True, # Ensure each group has 2 entities​\n output_fields=[\"docId\"]​\n)​\n\n","FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .groupByFieldName(\"docId\")​\n .groupSize(2)​\n .strictGroupSize(true)​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n group_by_field: \"docId\",​\n // highlight-start​\n group_size: 2,​\n strict_group_size: true​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"groupingField\": \"docId\",​\n \"groupSize\":2,​\n \"strictGroupSize\":true,​\n \"outputFields\": [\"docId\"]​\n}'​\n\n"],"headingContent":"Grouping Search​","anchorList":[{"label":"Группировочный поиск","href":"Grouping-Search​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Выполнение группировочного поиска","href":"Perform-Grouping-Search​","type":2,"isActive":false},{"label":"Настройка размера группы","href":"Configure-group-size​","type":2,"isActive":false},{"label":"Соображения","href":"Considerations​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.md new file mode 100644 index 000000000..07e7baacb --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/grouping-search.md @@ -0,0 +1,366 @@ +--- +id: grouping-search.md +summary: >- + Группировочный поиск позволяет Milvus группировать результаты поиска по + значениям в указанном поле, чтобы собрать данные на более высоком уровне. + Например, вы можете использовать базовый поиск ANN, чтобы найти книги, похожие + на ту, которую вы рассматриваете, но вы можете использовать группирующий + поиск, чтобы найти категории книг, которые могут быть связаны с темами, + обсуждаемыми в этой книге. В этой теме описывается использование группирующего + поиска, а также ключевые моменты. +title: Группировка Поиск +--- +

    Группировочный поиск

    Группировочный поиск позволяет Milvus группировать результаты поиска по значениям в указанном поле, чтобы собрать данные на более высоком уровне. Например, вы можете использовать базовый поиск ANN, чтобы найти книги, похожие на ту, которую вы рассматриваете, но вы можете использовать группирующий поиск, чтобы найти категории книг, которые могут быть связаны с темами, обсуждаемыми в этой книге. В этой теме описывается использование группирующего поиска, а также ключевые моменты.

    +

    Обзор

    Когда сущности в результатах поиска имеют одинаковое значение в скалярном поле, это указывает на их схожесть по определенному атрибуту, что может негативно повлиять на результаты поиска.

    +

    Предположим, что в коллекции хранится несколько документов (обозначаемых docId). Чтобы сохранить как можно больше семантической информации при преобразовании документов в векторы, каждый документ разбивается на более мелкие, управляемые абзацы (или куски) и хранится как отдельные сущности. Даже если документ разделен на более мелкие части, пользователи часто заинтересованы в том, чтобы определить, какие документы наиболее релевантны их потребностям.

    +

    + + ANN Search + ANN-поиск

    +

    При выполнении поиска по приближенным ближайшим соседям (ANN) в такой коллекции результаты поиска могут включать несколько абзацев из одного и того же документа, что может привести к пропуску других документов, что может не соответствовать предполагаемому сценарию использования.

    +

    + + Grouping Search + Группировка поиска

    +

    Чтобы улучшить разнообразие результатов поиска, можно добавить параметр group_by_field в запрос на поиск, чтобы включить группировочный поиск. Как показано на рисунке, можно установить group_by_field на docId. Получив этот запрос, Milvus.

    +
      +
    • Выполнит ANN-поиск на основе предоставленного вектора запроса, чтобы найти все сущности, наиболее похожие на запрос.

    • +
    • Сгруппирует результаты поиска по указанному group_by_field, например docId.

    • +
    • Вернет верхние результаты для каждой группы, как определено параметром limit, с наиболее похожими сущностями из каждой группы.

    • +
    +
    +

    По умолчанию группировочный поиск возвращает только одну сущность на группу. Если вы хотите увеличить количество результатов, возвращаемых для каждой группы, вы можете управлять этим с помощью параметров group_size и strict_group_size.

    +
    +

    Выполнение группировочного поиска

    В этом разделе приведены примеры кода, демонстрирующие использование группировочного поиска. В следующем примере предполагается, что коллекция включает поля id, vector, chunk и docId.

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "chunk": "pink_8682", "docId": 1},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "chunk": "red_7025", "docId": 5},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "chunk": "orange_6781", "docId": 2},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "chunk": "pink_9298", "docId": 3},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "chunk": "red_4794", "docId": 3},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "chunk": "yellow_4222", "docId": 4},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "chunk": "red_9392", "docId": 1},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "chunk": "grey_8510", "docId": 2},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "chunk": "white_9381", "docId": 5},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "chunk": "purple_4976", "docId": 3},​
    +]​
    +​
    +
    +
    +

    В поисковом запросе установите значения group_by_field и output_fields на docId. Milvus сгруппирует результаты по указанному полю и вернет наиболее похожую сущность из каждой группы, включая значение docId для каждой возвращенной сущности.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vectors = [​
    +    [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​
    +​
    +# Group search results​
    +res = client.search(​
    +    collection_name="group_search_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +    group_by_field="docId",​
    +    output_fields=["docId"]​
    +)​
    +​
    +# Retrieve the values in the `docId` column​
    +doc_ids = [result['entity']['docId'] for result in res[0]]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .groupByFieldName("docId")​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +
    +
    +
    // nolint​
    +func ExampleClient_Search_grouping() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,               // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ).WithGroupByField("docId"))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    // highlight-start​
    +    group_by_field: "docId"​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "groupingField": "docId",​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    В приведенном выше запросе limit=3 указывает на то, что система вернет результаты поиска из трех групп, причем каждая группа будет содержать одну наиболее похожую на вектор запроса сущность.

    +

    Настройка размера группы

    По умолчанию группировочный поиск возвращает только одну сущность на группу. Если вы хотите получить несколько результатов на группу, настройте параметры group_size и strict_group_size.

    + +
    # Group search results​
    +​
    +res = client.search(​
    +    collection_name="group_search_collection", ​
    +    data=query_vectors, # Query vector
    +    limit=5, # Top K results​ to return​
    +    group_by_field="docId", # Group by docId​
    +    group_size=2, # Return 2 entities per group​
    +    strict_group_size=True, # Ensure each group has 2 entities​
    +    output_fields=["docId"]​
    +)​
    +
    +
    +
    FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .groupByFieldName("docId")​
    +        .groupSize(2)​
    +        .strictGroupSize(true)​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    group_by_field: "docId",​
    +    // highlight-start​
    +    group_size: 2,​
    +    strict_group_size: true​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "groupingField": "docId",​
    +    "groupSize":2,​
    +    "strictGroupSize":true,​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    В примере выше.

    +
      +
    • group_size: Указывает желаемое количество сущностей, возвращаемых в каждой группе. Например, если задать group_size=2, то каждая группа (или каждый docId) в идеале должна возвращать два наиболее похожих абзаца (или фрагмента). Если group_size не задан, система по умолчанию возвращает один результат на группу.

    • +
    • strict_group_size: Этот булевский параметр управляет тем, должна ли система строго придерживаться подсчета, заданного group_size. Если задан strict_group_size=True, система попытается включить в каждую группу точное количество сущностей, заданное group_size (например, два абзаца), если только в этой группе не будет достаточно данных. По умолчанию (strict_group_size=False), системе приоритетнее удовлетворить количество групп, заданное параметром limit, чем гарантировать, что каждая группа содержит сущности group_size. Такой подход обычно более эффективен в случаях, когда распределение данных неравномерно.

    • +
    +

    Дополнительные сведения о параметрах см. в разделе Поиск().

    +

    Соображения

      +
    • Количество групп: Параметр limit управляет количеством групп, из которых возвращаются результаты поиска, а не конкретным количеством сущностей в каждой группе. Установка подходящего значения limit помогает контролировать разнообразие поиска и производительность запросов. Уменьшение limit может снизить затраты на вычисления, если данные распределены плотно или производительность вызывает беспокойство.

    • +
    • Сущности на группу: Параметр group_size управляет количеством сущностей, возвращаемых на группу. Настройка параметра group_size в зависимости от конкретного случая использования может повысить насыщенность результатов поиска. Однако если данные распределены неравномерно, некоторые группы могут возвращать меньше сущностей, чем указано на group_size, особенно в сценариях с ограниченным количеством данных.

    • +
    • Строгий размер группы: При использовании strict_group_size=True система будет пытаться вернуть указанное количество сущностей (group_size) для каждой группы, если только в этой группе нет достаточного количества данных. Эта настройка обеспечивает постоянное количество сущностей в группе, но может привести к снижению производительности при неравномерном распределении данных или ограниченных ресурсах. Если строгий подсчет сущностей не требуется, установка strict_group_size=False может повысить скорость выполнения запросов.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.json new file mode 100644 index 000000000..e9fc11a07 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True, # Whether to enable text analysis for this field​\n enable_match=True # Whether to enable text match​\n)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n\n","analyzer_params={​\n \"type\": \"english\"​\n}​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=200, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params,​\n enable_match=True, ​\n)​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"english\");\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(200)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n analyzer_params: { type: 'english' },\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 200,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"my_vector\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\": \"5\"\n }\n }\n ]\n }'\n\n","TEXT_MATCH(field_name, text)​\n\n","filter = \"TEXT_MATCH(text, 'machine deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine deep')\";\n","export filter=\"\\\"TEXT_MATCH(text, 'machine deep')\\\"\"\n","filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"\n","export filter=\"\\\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\\\"\"\n","filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\"\n","String filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","const filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","export filter=\"\\\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\\\"\"\n","# Match entities with `keyword1` or `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1 keyword2')\"​\n​\n# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​\nresult = MilvusClient.search(​\n collection_name=\"YOUR_COLLECTION_NAME\", # Your collection name​\n anns_field=\"embeddings\", # Vector field name​\n data=[query_vector], # Query vector​\n filter=filter,​\n search_params={\"params\": {\"nprobe\": 10}},​\n limit=10, # Max. number of results to return​\n output_fields=[\"id\", \"text\"] # Fields to return​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .annsField(\"embeddings\")\n .data(Collections.singletonList(queryVector)))\n .filter(filter)\n .topK(10)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build());\n","// Match entities with `keyword1` or `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\n// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field\nconst result = await client.search(\n collection_name: \"YOUR_COLLECTION_NAME\", // Your collection name\n anns_field: \"embeddings\", // Vector field name\n data: [query_vector], // Query vector\n filter: filter,\n params: {\"nprobe\": 10},\n limit: 10, // Max. number of results to return\n output_fields: [\"id\", \"text\"] //Fields to return\n);\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1 keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"annsField\": \"my_vector\",\n \"data\": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],\n \"filter\": '\"$filter\"',\n \"searchParams\": {\n \"params\": {\n \"nprobe\": 10\n }\n },\n \"limit\": 3,\n \"outputFields\": [\"text\",\"id\"]\n}'\n","# Match entities with both `keyword1` and `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\"​\n​\nresult = MilvusClient.query(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n filter=filter, ​\n output_fields=[\"id\", \"text\"]​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nQueryResp queryResp = client.query(QueryReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .filter(filter)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build()\n);\n","// Match entities with both `keyword1` and `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nconst result = await client.query(\n collection_name: \"YOUR_COLLECTION_NAME\",\n filter: filter, \n output_fields: [\"id\", \"text\"]\n)\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"filter\": '\"$filter\"',\n \"outputFields\": [\"id\", \"text\"]\n}'\n"],"headingContent":"Text Match​","anchorList":[{"label":"Сопоставление текстов","href":"Text-Match​","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Включить текстовое соответствие","href":"Enable-text-match","type":2,"isActive":false},{"label":"Использование текстового соответствия","href":"Use-text-match","type":2,"isActive":false},{"label":"Соображения","href":"Considerations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.md new file mode 100644 index 000000000..836b66131 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/keyword-match.md @@ -0,0 +1,431 @@ +--- +id: keyword-match.md +summary: >- + Текстовое соответствие в Milvus позволяет точно находить документы по + определенным терминам. Эта функция используется в основном для фильтрации + поиска по определенным условиям и может включать скалярную фильтрацию для + уточнения результатов запроса, позволяя искать сходство в векторах, + удовлетворяющих скалярным критериям. +title: Сопоставление текстов +--- +

    Сопоставление текстов

    Текстовое соответствие в Milvus позволяет точно находить документы по определенным терминам. Эта функция в основном используется для фильтрации поиска по определенным условиям и может включать скалярную фильтрацию для уточнения результатов запроса, позволяя искать сходство в векторах, которые соответствуют скалярным критериям.

    +
    +

    Текстовое совпадение нацелено на поиск точных вхождений терминов запроса, без оценки релевантности сопоставленных документов. Если вы хотите получить наиболее релевантные документы, основанные на семантическом значении и важности терминов запроса, мы рекомендуем вам использовать полнотекстовый поиск.

    +
    +

    Обзор

    Milvus интегрирует Tantivy для работы с инвертированным индексом и текстовым поиском по терминам. Для каждой текстовой записи Milvus индексирует ее в соответствии с процедурой.

    +
      +
    1. Анализатор: Анализатор обрабатывает входной текст, разбивая его на отдельные слова, или лексемы, а затем применяя фильтры по мере необходимости. Это позволяет Milvus построить индекс на основе этих лексем.

    2. +
    3. Индексирование: После анализа текста Milvus создает инвертированный индекс, который сопоставляет каждую уникальную лексему с содержащими ее документами.

    4. +
    +

    Когда пользователь выполняет поиск по тексту, инвертированный индекс используется для быстрого извлечения всех документов, содержащих эти термины. Это гораздо быстрее, чем сканирование каждого документа по отдельности.

    +

    + + Text Match + Совпадение текста

    +

    Включить текстовое соответствие

    Текстовое совпадение работает с типом поля VARCHAR, который по сути является строковым типом данных в Milvus. Чтобы включить текстовое соответствие, установите значения enable_analyzer и enable_match на True, а затем при определении схемы коллекции настройте анализатор для текстового анализа.

    +

    Установите enable_analyzer и enable_match.

    Чтобы включить текстовое соответствие для определенного поля VARCHAR, при определении схемы поля установите параметры enable_analyzer и enable_match в значение True. Это дает Milvus указание токенизировать текст и создать инвертированный индекс для указанного поля, обеспечивая быстрое и эффективное текстовое соответствие.

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True, # Whether to enable text analysis for this field​
    +    enable_match=True # Whether to enable text match​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +
    +

    Необязательно: Настройка анализатора

    Производительность и точность подбора текста зависят от выбранного анализатора. Различные анализаторы приспособлены к различным языкам и структурам текста, поэтому выбор правильного анализатора может существенно повлиять на результаты поиска для конкретного случая использования.

    +

    По умолчанию в Milvus используется анализатор standard, который выполняет токенизацию текста на основе пробелов и пунктуации, удаляет лексемы длиной более 40 символов и преобразует текст в строчные буквы. Для применения этой настройки по умолчанию не требуется никаких дополнительных параметров. Дополнительные сведения см. в разделе Стандартный.

    +

    В случаях, когда требуется другой анализатор, его можно настроить с помощью параметра analyzer_params. Например, чтобы применить анализатор english для обработки английского текста.

    + +
    analyzer_params={​
    +    "type": "english"​
    +}​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=200, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params,​
    +    enable_match=True, ​
    +)​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "english");
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(200)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +    analyzer_params: { type: 'english' },
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 200,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "my_vector",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim": "5"
    +                }
    +            }
    +        ]
    +    }'
    +
    +
    +

    Milvus также предоставляет различные другие анализаторы, подходящие для разных языков и сценариев. Для получения более подробной информации обратитесь к разделу Обзор.

    +

    Использование текстового соответствия

    После того как вы включили текстовое соответствие для поля VARCHAR в схеме коллекции, вы можете выполнять текстовое соответствие с помощью выражения TEXT_MATCH.

    +

    Синтаксис выражения TEXT_MATCH

    Выражение TEXT_MATCH используется для указания поля и условий для поиска. Его синтаксис выглядит следующим образом.

    +
    TEXT_MATCH(field_name, text)​
    +
    +
    +
      +
    • field_name: : Имя поля VARCHAR для поиска.

    • +
    • text: Термины для поиска. Несколько терминов могут быть разделены пробелами или другими соответствующими разделителями в зависимости от языка и настроенного анализатора.

    • +
    +

    По умолчанию TEXT_MATCH использует логику поиска "ИЛИ", то есть возвращает документы, содержащие любой из указанных терминов. Например, для поиска документов, содержащих термин machine или deep в поле text, используйте следующее выражение.

    + +
    filter = "TEXT_MATCH(text, 'machine deep')"​
    +
    +
    String filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    const filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    export filter="\"TEXT_MATCH(text, 'machine deep')\""
    +
    +

    Вы также можете объединить несколько выражений TEXT_MATCH с помощью логических операторов для выполнения AND-сопоставления.

    +
      +
    • Для поиска документов, содержащих machine и deep в поле text, используйте следующее выражение.

      +

      +
      filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"​
      +
      +
      String filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')";
      +
      +
      const filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
      +
      +
      export filter="\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\""
      +
    • +
    • Для поиска документов, содержащих machine и learning, но не содержащих deep в поле text, используйте следующие выражения:

      +

      +
      filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"
      +
      +
      String filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      const filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      export filter="\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\""
      +
    • +
    +

    Поиск с помощью текстового соответствия

    Текстовое совпадение можно использовать в сочетании с поиском по векторному сходству, чтобы сузить область поиска и повысить его производительность. Фильтрация коллекции с помощью текстового соответствия перед векторным поиском по сходству позволяет сократить количество документов, в которых необходимо выполнить поиск, что приводит к сокращению времени выполнения запроса.

    +

    В этом примере выражение filter фильтрует результаты поиска, чтобы включить только документы, соответствующие указанному термину keyword1 или keyword2. Затем векторный поиск сходства выполняется для этого отфильтрованного подмножества документов.

    + +
    # Match entities with `keyword1` or `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1 keyword2')"​
    +​
    +# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​
    +result = MilvusClient.search(​
    +    collection_name="YOUR_COLLECTION_NAME", # Your collection name​
    +    anns_field="embeddings", # Vector field name​
    +    data=[query_vector], # Query vector​
    +    filter=filter,​
    +    search_params={"params": {"nprobe": 10}},​
    +    limit=10, # Max. number of results to return​
    +    output_fields=["id", "text"] # Fields to return​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .annsField("embeddings")
    +        .data(Collections.singletonList(queryVector)))
    +        .filter(filter)
    +        .topK(10)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build());
    +
    +
    // Match entities with `keyword1` or `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
    +const result = await client.search(
    +    collection_name: "YOUR_COLLECTION_NAME", // Your collection name
    +    anns_field: "embeddings", // Vector field name
    +    data: [query_vector], // Query vector
    +    filter: filter,
    +    params: {"nprobe": 10},
    +    limit: 10, // Max. number of results to return
    +    output_fields: ["id", "text"] //Fields to return
    +);
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1 keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "annsField": "my_vector",
    +    "data": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],
    +    "filter": '"$filter"',
    +    "searchParams": {
    +        "params": {
    +            "nprobe": 10
    +        }
    +    },
    +    "limit": 3,
    +    "outputFields": ["text","id"]
    +}'
    +
    +

    Запрос с текстовым совпадением

    Текстовое соответствие также можно использовать для скалярной фильтрации в запросах. Указав выражение TEXT_MATCH в параметре expr метода query(), вы можете получить документы, соответствующие заданным условиям.

    +

    В приведенном ниже примере извлекаются документы, в которых поле text содержит термины keyword1 и keyword2.

    + +
    # Match entities with both `keyword1` and `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"​
    +​
    +result = MilvusClient.query(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    filter=filter, ​
    +    output_fields=["id", "text"]​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +QueryResp queryResp = client.query(QueryReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .filter(filter)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build()
    +);
    +
    +
    // Match entities with both `keyword1` and `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +const result = await client.query(
    +    collection_name: "YOUR_COLLECTION_NAME",
    +    filter: filter, 
    +    output_fields: ["id", "text"]
    +)
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "filter": '"$filter"',
    +    "outputFields": ["id", "text"]
    +}'
    +
    +

    Соображения

      +
    • Включение текстового соответствия для поля приводит к созданию инвертированного индекса, который потребляет ресурсы хранилища. Учитывайте влияние на хранение данных, когда решите включить эту функцию, поскольку оно зависит от размера текста, уникальных лексем и используемого анализатора.

    • +
    • После определения анализатора в схеме его настройки становятся постоянными для данной коллекции. Если вы решите, что другой анализатор будет лучше соответствовать вашим потребностям, вы можете удалить существующую коллекцию и создать новую с нужной конфигурацией анализатора.

    • +
    • Правила экранирования в выражениях filter:

      +
        +
      • Символы, заключенные в двойные или одинарные кавычки в выражениях, интерпретируются как строковые константы. Если строковая константа включает в себя управляющие символы, то они должны быть представлены с помощью управляющей последовательности. Например, используйте \\ для обозначения \, \\t для обозначения табуляции \t, и \\n для обозначения новой строки.
      • +
      • Если строковая константа заключена в одинарные кавычки, то одинарная кавычка внутри константы должна быть представлена как \\', а двойная кавычка может быть представлена как " или \\". Пример: 'It\\'s milvus'.
      • +
      • Если строковая константа заключена в двойные кавычки, то двойная кавычка внутри константы должна быть представлена как \\", а одинарная кавычка может быть представлена как ' или \\'. Пример: "He said \\"Hi\\"".
      • +
    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.json new file mode 100644 index 000000000..7bebd8c6d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Metric Types​","anchorList":[{"label":"Типы метрик","href":"Metric-Types​","type":1,"isActive":false},{"label":"Евклидово расстояние (L2)","href":"Euclidean-distance-L2​","type":2,"isActive":false},{"label":"Внутреннее произведение (IP)","href":"Inner-product-IP​","type":2,"isActive":false},{"label":"Косинусное сходство","href":"Cosine-similarity-​","type":2,"isActive":false},{"label":"Расстояние JACCARD","href":"JACCARD-distance​","type":2,"isActive":false},{"label":"Расстояние Хамминга","href":"HAMMING-distance​","type":2,"isActive":false},{"label":"Сходство BM25","href":"BM25-similarity​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.md new file mode 100644 index 000000000..ed646cf49 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/metric.md @@ -0,0 +1,252 @@ +--- +id: metric.md +summary: >- + Метрики сходства используются для измерения сходства между векторами. Выбор + подходящей метрики расстояния позволяет значительно повысить эффективность + классификации и кластеризации. +title: Метрические типы +--- +

    Типы метрик

    Метрики сходства используются для измерения сходства между векторами. Выбор подходящей метрики расстояния позволяет значительно улучшить производительность классификации и кластеризации.

    +

    В настоящее время Milvus поддерживает такие типы метрик сходства: Евклидово расстояние (L2), внутреннее произведение (IP), косинусное сходство (COSINE), JACCARD, HAMMING, и BM25 (специально разработанная для полнотекстового поиска по разреженным векторам).

    +

    В таблице ниже приведены соответствия между различными типами полей и соответствующими им типами метрик.

    +

    Тип поля

    +

    Диапазон измерений

    +

    Поддерживаемые метрические типы

    +

    Метрический тип по умолчанию

    +

    FLOAT_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    COSINE

    +

    FLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    +

    COSINE

    +

    BFLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE, L2, IP

    +

    COSINE

    +

    SPARSE_FLOAT_VECTOR

    +

    Размерность указывать не нужно.

    +

    IP, BM25 (используется только для полнотекстового поиска)

    +

    IP

    +

    BINARY_VECTOR

    +

    8-32,768*8

    +

    +

    HAMMING, JACCARD

    +

    HAMMING

    +
    +
    +
      +
    • Для векторных полей типа SPARSE_FLOAT_VECTOR используйте метрический тип BM25 только при полнотекстовом поиске. Дополнительные сведения см. в разделе Полнотекстовый поиск.

    • +
    • Для векторных полей типа BINARY_VECTOR значение размерности (dim) должно быть кратно 8.

    • +
    +
    +

    В таблице ниже приведены характеристики значений расстояния сходства для всех поддерживаемых метрических типов и диапазон их значений.

    +

    Тип метрики

    +

    Характеристики значений расстояния сходства

    +

    Диапазон значений расстояния сходства

    +

    L2

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, ∞)

    +

    IP

    +

    Большее значение указывает на большее сходство.

    +

    [-1, 1]

    +

    COSINE

    +

    Большее значение указывает на большее сходство.

    +

    [-1, 1]

    +

    JACCARD

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, 1]

    +

    HAMMING

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, dim(vector)]

    +

    BM25

    +

    Оценка релевантности на основе частоты терминов, инвертированной частоты документов и нормализации документов.

    +

    [0, ∞)

    +

    +
    +

    Евклидово расстояние (L2)

    По сути, евклидово расстояние измеряет длину отрезка, соединяющего 2 точки.

    +

    Формула для евклидова расстояния выглядит следующим образом.

    +

    + + Euclidean distance formula + Формула евклидова расстояния

    +

    где a = (a0, a1,...,an-1) и b = (b0, b1,..., bn-1) - две точки в n-мерном евклидовом пространстве.

    +

    Это наиболее часто используемая метрика расстояния, которая очень полезна, когда данные непрерывны.

    +
    +

    Milvus вычисляет значение перед применением квадратного корня только в том случае, если в качестве метрики расстояния выбрано евклидово расстояние.

    +
    +

    Внутреннее произведение (IP)

    Расстояние IP между двумя вкраплениями определяется следующим образом.

    +

    + + Inner product formula + Формула внутреннего произведения

    +

    IP более полезно, если вам нужно сравнить ненормированные данные или если вам важны величина и угол.

    +
    +

    Если вы используете IP для вычисления сходства между эмбеддингами, вы должны нормализовать ваши эмбеддинги. После нормализации внутреннее произведение равно косинусному сходству.

    +
    +

    Предположим, что X' нормализовано из эмбеддинга X.

    +

    + + Normalized inner product formula + Формула нормализованного внутреннего произведения

    +

    Корреляция между двумя эмбеддингами выглядит следующим образом.

    +

    + + Correlation between embeddings + Корреляция между эмбеддингами

    +

    Косинусное сходство

    Косинусное сходство использует косинус угла между двумя наборами векторов для измерения того, насколько они похожи. Можно представить два набора векторов как отрезки прямых, начинающиеся из одной и той же точки, например [0,0,...], но направленные в разные стороны.

    +

    Чтобы вычислить косинусоидальное сходство между двумя наборами векторов A = (a0, a1,...,an-1) и B = (b0, b1,..., bn-1), воспользуйтесь следующей формулой.

    +

    + + Cosine similarity formula + Формула косинусного сходства

    +

    Косинусоидальное сходство всегда находится в интервале [-1, 1]. Например, косинус сходства двух пропорциональных векторов равен 1, двух ортогональных векторов - 0, а двух противоположных векторов - -1. Чем больше косинус, тем меньше угол между двумя векторами, что говорит о том, что эти два вектора более похожи друг на друга.

    +

    Вычитая косинус сходства из 1, вы можете получить косинусоидальное расстояние между двумя векторами.

    +

    Расстояние JACCARD

    Коэффициент сходства JACCARD измеряет сходство между двумя выборочными совокупностями и определяется как кардинальность пересечения заданных совокупностей, деленная на кардинальность их объединения. Он может быть применен только к конечным выборочным совокупностям.

    +

    + + JACCARD similarity coefficient formula + Формула коэффициента сходства JACCARD

    +

    Расстояние JACCARD измеряет несходство между наборами данных и получается путем вычитания коэффициента сходства JACCARD из 1. Для бинарных переменных расстояние JACCARD эквивалентно коэффициенту Танимото.

    +

    + + JACCARD distance formula + Формула расстояния JACCARD

    +

    Расстояние Хамминга

    Расстояние Хамминга измеряет бинарные строки данных. Расстояние между двумя строками одинаковой длины - это количество битовых позиций, в которых биты различаются.

    +

    Например, пусть есть две строки, 1101 1001 и 1001 1101.

    +

    11011001 ⊕ 10011101 = 01000100. Поскольку они содержат две 1, расстояние HAMMING, d (11011001, 10011101) = 2.

    +

    Сходство BM25

    BM25 - это широко используемый метод измерения релевантности текста, специально разработанный для полнотекстового поиска. Он объединяет следующие три ключевых фактора.

    +
      +
    • Частота терминов (TF): Измеряет, насколько часто термин встречается в документе. Хотя более высокая частота часто указывает на большую важность, BM25 использует параметр насыщенности k1, чтобы предотвратить доминирование слишком частых терминов в оценке релевантности.

    • +
    • Обратная частота документа (IDF): Отражает важность термина во всем корпусе документов. Термины, встречающиеся в меньшем количестве документов, получают более высокое значение IDF, что указывает на больший вклад в релевантность.

    • +
    • Нормализация длины документа: Длинные документы имеют тенденцию получать более высокие оценки, так как содержат больше терминов. BM25 уменьшает это смещение путем нормализации длины документов, а параметр b управляет силой этой нормализации.

    • +
    +

    Баллы BM25 рассчитываются следующим образом.

    +

    + + BM25 similarity formula + Формула сходства BM25

    +

    Описание параметра.

    +
      +
    • ​Q: Текст запроса, предоставленный пользователем.

    • +
    • ​D: : Оцениваемый документ.

    • +
    • ​TF(qi​,D): Частота термина, показывающая, как часто термин ​qi встречается в документе ​D.

    • +
    • ​IDF(qi​): Обратная частота документа, рассчитывается как.

      +

      + + IDF formula + формула IDF

      +

      где ​N - общее количество документов в корпусе, а ​n(qi​) - количество документов, содержащих термин qi.

    • +
    • ​∣D∣: Длина документа ​D (общее количество терминов).

    • +
    • ​avgdl: Средняя длина всех документов в корпусе.

    • +
    • ​k1​: Контролирует влияние частоты терминов на оценку. Более высокие значения увеличивают важность частоты терминов. Типичный диапазон - [1.2, 2.0], в то время как Milvus допускает диапазон [0, 3].

    • +
    • ​b: Управляет степенью нормализации длины, в диапазоне от 0 до 1. Если значение равно 0, нормализация не применяется; если значение равно 1, применяется полная нормализация.

    • +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.json new file mode 100644 index 000000000..30635fdb8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.json @@ -0,0 +1 @@ +{"codeList":["# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n # Set memory mapping property for whole cluster\n mmapEnabled: false | true\n # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. \n mmapDirPath: any/valid/path \n....\n","# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n vectorField: false # Enable mmap for loading vector data\n vectorIndex: false # Enable mmap for loading vector index\n scalarField: false # Enable mmap for loading scalar data\n scalarIndex: false # Enable mmap for loading scalar index\n....\n","# Get existing collection\ncollection = Collection(\"test_collection\") # Replace with your collection name\n\n# Set memory mapping property to True or Flase\ncollection.set_properties({'mmap.enabled': True})\n","schema = MilvusClient.create_schema()\n\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)\n","collection.alter_index(\n index_name=\"vector_index\", # Replace with your vector index name\n extra_params={\"mmap.enabled\": True} # Enable memory mapping for index\n)\n","# new-values.yaml\nextraConfigFiles:\n user.yaml: |+\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \nhelm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# patch.yaml\nspec:\n config:\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \n kubectl patch milvus --patch-file patch.yaml\n","# A new installation script is provided to enable mmap-related settings.\n"],"headingContent":"MMap-enabled Data Storage","anchorList":[{"label":"Хранение данных с поддержкой MMap","href":"MMap-enabled-Data-Storage","type":1,"isActive":false},{"label":"Настройка отображения памяти","href":"Configure-memory-mapping","type":2,"isActive":false},{"label":"Настройка пути хранения в различных развертываниях","href":"Customize-storage-path-in-different-deployments","type":2,"isActive":false},{"label":"Ограничения","href":"Limits","type":2,"isActive":false},{"label":"ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.md new file mode 100644 index 000000000..d2ed6c2c1 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/mmap.md @@ -0,0 +1,190 @@ +--- +id: mmap.md +summary: MMap позволяет разместить больше данных на одном узле. +title: Хранение данных с поддержкой MMap +--- +

    Хранение данных с поддержкой MMap

    В Milvus файлы с отображением памяти позволяют напрямую отображать содержимое файлов в память. Эта функция повышает эффективность использования памяти, особенно в ситуациях, когда доступной памяти мало, а полная загрузка данных невозможна. Этот механизм оптимизации может увеличить объем памяти, обеспечивая производительность до определенного предела; однако, когда объем данных слишком сильно превышает объем памяти, производительность поиска и запросов может серьезно снизиться, поэтому, пожалуйста, включите или выключите эту функцию в зависимости от ситуации.

    +

    Настройка отображения памяти

    Начиная с Milvus 2.4, вы можете гибко настроить статический файл конфигурации, чтобы задать параметры отображения памяти по умолчанию для всего кластера перед развертыванием. Кроме того, есть возможность динамически изменять параметры для точной настройки параметров отображения памяти на уровне кластера и индекса. В будущих обновлениях возможности отображения памяти будут расширены за счет конфигураций на уровне полей.

    +

    Перед развертыванием кластера: глобальная конфигурация

    Перед развертыванием кластера настройки на уровне кластера применяют отображение памяти для всего кластера. Благодаря этому все новые объекты будут автоматически соответствовать этим конфигурациям. Важно отметить, что изменение этих настроек требует перезапуска кластера, чтобы они вступили в силу.

    +

    Чтобы изменить настройки отображения памяти в кластере, отредактируйте файл configs/milvus.yaml. В этом файле вы можете указать, включать ли отображение памяти по умолчанию, и определить путь к каталогу для хранения файлов с отображением памяти. Если путь (mmapDirPath) не указан, система по умолчанию будет хранить файлы с отображением памяти в каталоге {localStorage.path}/mmap. Дополнительные сведения см. в разделе Конфигурации, связанные с локальным хранилищем.

    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    # Set memory mapping property for whole cluster
    +    mmapEnabled: false | true
    +    # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. 
    +    mmapDirPath: any/valid/path 
    +....
    +
    +

    После 2.4.10 конфигурация queryNode.mmap.mmapEnabled разделяется на четыре отдельных поля, и все они по умолчанию false:

    +
      +
    • queryNode.mmap.vectorField, управляет тем, являются ли данные вектора mmap;
    • +
    • queryNode.mmap.vectorIndex, управляет тем, является ли индекс вектора mmap;
    • +
    • queryNode.mmap.scalarField, управляет тем, являются ли скалярные данные mmap;
    • +
    • queryNode.mmap.scalarIndex, управляет тем, является ли скалярный индекс mmap;
    • +
    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    vectorField: false # Enable mmap for loading vector data
    +    vectorIndex: false # Enable mmap for loading vector index
    +    scalarField: false # Enable mmap for loading scalar data
    +    scalarIndex: false # Enable mmap for loading scalar index
    +....
    +
    +

    Кроме того, только векторный индекс и векторные данные mmap могут быть включены или выключены для коллекции отдельно, но не для других.

    +

    Совместимость: Если исходная конфигурация queryNode.mmap.mmapEnabled установлена на true, то вновь добавленная конфигурация будет установлена на true. Если для queryNode.mmap.mmapEnabled установлено значение false, то для новой конфигурации будет установлено значение true, окончательное значение будет true.

    +

    Во время работы кластера: динамическая конфигурация

    Во время работы кластера можно динамически изменять параметры отображения памяти на уровне коллекции или индекса.

    +

    На уровне коллекции отображение памяти применяется ко всем неиндексированным исходным данным в коллекции, исключая первичные ключи, временные метки и идентификаторы строк. Такой подход особенно удобен для комплексного управления большими наборами данных.

    +

    Для динамической корректировки настроек отображения памяти в коллекции используйте метод set_properties(). Здесь вы можете переключать mmap.enabled между True и False по мере необходимости.

    +
    # Get existing collection
    +collection = Collection("test_collection") # Replace with your collection name
    +
    +# Set memory mapping property to True or Flase
    +collection.set_properties({'mmap.enabled': True})
    +
    +

    После 2.4.10, настройки отображения памяти в коллекции, используйте метод add_field. Здесь вы можете переключать mmap_enabled между True или False по мере необходимости.

    +
    schema = MilvusClient.create_schema()
    +
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
    +
    +

    Для настроек на уровне индексов отображение памяти может быть специально применено к векторным индексам, не затрагивая другие типы данных. Эта возможность неоценима для коллекций, которым требуется оптимизированная производительность векторного поиска.

    +

    Чтобы включить или отключить отображение памяти для индекса в коллекции, вызовите метод alter_index(), указав имя целевого индекса в index_name и установив mmap.enabled в True или False.

    +
    collection.alter_index(
    +    index_name="vector_index", # Replace with your vector index name
    +    extra_params={"mmap.enabled": True} # Enable memory mapping for index
    +)
    +
    +

    Настройка пути хранения в различных развертываниях

    Файлы, отображаемые в памяти, по умолчанию размещаются в каталоге /mmap внутри localStorage.path. Вот как настроить этот параметр при различных способах развертывания:

    +
      +
    • Для Milvus, установленного с помощью Helm Chart:
    • +
    +
    # new-values.yaml
    +extraConfigFiles:
    +   user.yaml: |+
    +      queryNode:
    +         mmap:
    +           mmapEnabled: true
    +           mmapDirPath: any/valid/path
    +        
    +helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
      +
    • Для Milvus, установленного с помощью Milvus Operator:
    • +
    +
    # patch.yaml
    +spec:
    +  config:
    +    queryNode:
    +      mmap:
    +        mmapEnabled: true
    +        mmapDirPath: any/valid/path
    +      
    + kubectl patch milvus <milvus-name> --patch-file patch.yaml
    +
    +
      +
    • Для Milvus, установленного с помощью Docker:
    • +
    +
    # A new installation script is provided to enable mmap-related settings.
    +
    +

    Ограничения

      +
    • Сопоставление памяти не может быть включено для загруженной коллекции, убедитесь, что коллекция была освобождена перед включением сопоставления памяти.

    • +
    • Сопоставление памяти не поддерживается для индексов класса DiskANN или GPU.

    • +
    +

    ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

      +
    • В каких сценариях рекомендуется включать отображение памяти? Каковы компромиссы после включения этой функции?

      +

      Сопоставление памяти рекомендуется при ограниченном объеме памяти или при умеренных требованиях к производительности. Включение этой функции увеличивает пропускную способность для загрузки данных. Например, при конфигурации из 2 процессоров и 8 ГБ памяти включение функции отображения памяти позволяет загрузить в 4 раза больше данных по сравнению с отсутствием этой функции. Влияние на производительность различно:

      +
        +
      • При достаточном объеме памяти ожидаемая производительность аналогична производительности при использовании только памяти.

      • +
      • При недостатке памяти ожидаемая производительность может снизиться.

      • +
    • +
    • Какова связь между конфигурациями на уровне коллекции и на уровне индекса?

      +

      Уровень коллекции и уровень индекса не являются всеобъемлющими отношениями, уровень коллекции контролирует, поддерживают ли исходные данные mmap или нет, в то время как уровень индекса предназначен только для векторных индексов.

    • +
    • Существует ли какой-либо рекомендуемый тип индекса для отображения памяти?

      +

      Да, для включения mmap рекомендуется HNSW. Мы уже тестировали индексы серий HNSW, IVF_FLAT, IVF_PQ/SQ, производительность индексов серии IVF серьезно упала, в то время как падение производительности при включении mmap для индексов HNSW остается в пределах ожиданий.

    • +
    • Какое локальное хранилище требуется для отображения памяти?

      +

      Высококачественный диск повышает производительность, причем предпочтительным вариантом являются диски NVMe.

    • +
    • Можно ли отображать память на скалярные данные?

      +

      Картирование памяти можно применять к скалярным данным, но оно не применимо к индексам, построенным на скалярных полях.

    • +
    • Как определяется приоритет для конфигураций отображения памяти на разных уровнях?

      +

      В Milvus, когда конфигурации отображения памяти явно определены на нескольких уровнях, конфигурации на уровне индексов и коллекций имеют наивысший приоритет, а затем следуют конфигурации на уровне кластеров.

    • +
    • Если я перейду с Milvus 2.3 и настрою путь к каталогу отображения памяти, что произойдет?

      +

      Если вы перешли с Milvus 2.3 и настроили путь к каталогу отображения памяти (mmapDirPath), ваша конфигурация будет сохранена, а параметром по умолчанию для включенного отображения памяти (mmapEnabled) будет true. Важно перенести метаданные, чтобы синхронизировать конфигурацию существующих файлов с отображением памяти. Дополнительные сведения см. в разделе Миграция метаданных.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.json new file mode 100644 index 000000000..a57d6c0f5 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.json @@ -0,0 +1 @@ +{"codeList":["# Create a collection in customized setup mode​\nfrom pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n# Add fields to schema​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(field_name=\"dense\", datatype=DataType.FLOAT_VECTOR, dim=5)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"text\")​\n .dataType(DataType.VarChar)​\n .maxLength(1000)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense\")​\n .dataType(DataType.FloatVector)​\n .dimension(768)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","// WIP​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// Create a collection in customized setup mode​\n// Define fields​\nconst fields = [​\n {​\n name: \"id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"text\",​\n data_type: DataType.VarChar,​\n max_length: 1000​\n },​\n {​\n name: \"sparse\",​\n data_type: DataType.SPARSE_FLOAT_VECTOR​\n },​\n {​\n name: \"dense\",​\n data_type: DataType.FloatVector,​\n dim: 768​\n }​\n]​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": true,​\n \"fields\": [​\n {​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"text\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 1000​\n }​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"dataType\": \"SparseFloatVector\"​\n },​\n {​\n \"fieldName\": \"dense\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"768\"​\n }​\n }​\n ]​\n }'​\n\n","from pymilvus import MilvusClient​\n​\n# Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# Add indexes​\nindex_params.add_index(​\n field_name=\"dense\",​\n index_name=\"dense_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128},​\n)​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_name=\"sparse_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\", # Index type for sparse vectors​\n metric_type=\"IP\", # Currently, only IP (Inner Product) is supported for sparse vectors​\n params={\"drop_ratio_build\": 0.2}, # The ratio of small vector values to be dropped during indexing​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nMap denseParams = new HashMap<>();​\ndenseParams.put(\"nlist\", 128);​\nIndexParam indexParamForDenseField = IndexParam.builder()​\n .fieldName(\"dense\")​\n .indexName(\"dense_index\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(denseParams)​\n .build();​\n​\nMap sparseParams = new HashMap<>();​\nsparseParams.put(\"drop_ratio_build\", 0.2);​\nIndexParam indexParamForSparseField = IndexParam.builder()​\n .fieldName(\"sparse\")​\n .indexName(\"sparse_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(sparseParams)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForDenseField);​\nindexParams.add(indexParamForSparseField);​\n\n","const index_params = [{​\n field_name: \"dense\",​\n index_type: \"IVF_FLAT\",​\n metric_type: \"IP\"​\n},{​\n field_name: \"sparse\",​\n index_type: \"SPARSE_INVERTED_INDEX\",​\n metric_type: \"IP\"​\n}]​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_index\",​\n \"indexType\":\"IVF_FLAT\",​\n \"params\":{\"nlist\":128}​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\"​\n }​\n ]'​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_collection(​\n collection_name=\"hybrid_search_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","res = await client.createCollection({​\n collection_name: \"hybrid_search_collection\",​\n fields: fields,​\n index_params: index_params,​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","from pymilvus import MilvusClient​\n​\ndata=[​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n​\nres = client.insert(​\n collection_name=\"hybrid_search_collection\",​\n data=data​\n)​\n​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\n​\nGson gson = new Gson();​\nJsonObject row1 = new JsonObject();​\nrow1.addProperty(\"id\", 1);​\nrow1.addProperty(\"text\", \"Artificial intelligence was founded as an academic discipline in 1956.\");​\nrow1.add(\"dense\", gson.toJsonTree(dense1));​\nrow1.add(\"sparse\", gson.toJsonTree(sparse1));​\n​\nJsonObject row2 = new JsonObject();​\nrow2.addProperty(\"id\", 2);​\nrow2.addProperty(\"text\", \"Alan Turing was the first person to conduct substantial research in AI.\");​\nrow2.add(\"dense\", gson.toJsonTree(dense2));​\nrow2.add(\"sparse\", gson.toJsonTree(sparse2));​\n​\nJsonObject row3 = new JsonObject();​\nrow3.addProperty(\"id\", 3);​\nrow3.addProperty(\"text\", \"Born in Maida Vale, London, Turing was raised in southern England.\");​\nrow3.add(\"dense\", gson.toJsonTree(dense3));​\nrow3.add(\"sparse\", gson.toJsonTree(sparse3));​\n​\nList data = Arrays.asList(row1, row2, row3);​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nvar data = [​\n {id: 0, text: \"Artificial intelligence was founded as an academic discipline in 1956.\", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​\n {id: 1, text: \"Alan Turing was the first person to conduct substantial research in AI.\", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​\n {id: 2, text: \"Born in Maida Vale, London, Turing was raised in southern England.\" , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"hybrid_search_collection\",​\n data: data,​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{\"9637\": 0.30856525997853057, \"4399\": 0.19771651149001523}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{\"6959\": 0.31025067641541815, \"1729\": 0.8265339135915016}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{\"1220\": 0.15303302147479103, \"7335\": 0.9436728846033107}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n ],​\n \"collectionName\": \"hybrid_search_collection\"​\n}'​\n\n","from pymilvus import AnnSearchRequest​\n​\nquery_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nsearch_param_1 = {​\n \"data\": [query_dense_vector],​\n \"anns_field\": \"dense\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2​\n}​\nrequest_1 = AnnSearchRequest(**search_param_1)​\n​\nquery_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​\nsearch_param_2 = {​\n \"data\": [query_sparse_vector],​\n \"anns_field\": \"sparse\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2​\n}​\nrequest_2 = AnnSearchRequest(**search_param_2)​\n​\nreqs = [request_1, request_2]​\n​\n\n","import io.milvus.v2.service.vector.request.AnnSearchReq;​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\n​\nfloat[] dense = new float[]{-0.0475336798f, 0.0521207601f, 0.0904406682f, ...};​\nSortedMap sparse = new TreeMap() {{​\n put(3573L, 0.34701499f);​\n put(5263L, 0.263937551f);​\n ...​\n}};​\n​\n​\nList queryDenseVectors = Collections.singletonList(new FloatVec(dense));​\nList querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​\n​\nList searchRequests = new ArrayList<>();​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"dense\")​\n .vectors(queryDenseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"nprobe\\\": 10}\")​\n .topK(2)​\n .build());​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"sparse\")​\n .vectors(querySparseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"drop_ratio_build\\\": 0.2}\")​\n .topK(2)​\n .build());​\n\n","const search_param_1 = {​\n \"data\": query_vector, ​\n \"anns_field\": \"dense\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n​\nconst search_param_2 = {​\n \"data\": query_sparse_vector, ​\n \"anns_field\": \"sparse\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n\n","export req='[​\n {​\n \"data\": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​\n \"annsField\": \"dense\",​\n \"params\": {​\n \"params\": {​\n \"nprobe\": 10​\n }​\n },​\n \"limit\": 2​\n },​\n {​\n \"data\": [{\"3573\": 0.34701499565746674}, {\"5263\": 0.2639375518635271}],​\n \"annsField\": \"sparse\",​\n \"params\": {​\n \"params\": {​\n \"drop_ratio_build\": 0.2​\n }​\n },​\n \"limit\": 2​\n }​\n ]'​\n\n","from pymilvus import WeightedRanker​\n​\nrerank= WeightedRanker(0.8, 0.3) ​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.WeightedRanker;​\n​\nBaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = WeightedRanker(0.8, 0.3);​\n\n","export rerank='{​\n \"strategy\": \"ws\",​\n \"params\": {\"weights\": [0.8,0.3]}​\n }'​\n\n","from pymilvus import RRFRanker​\n​\nranker = RRFRanker(100)​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.RRFRanker;​\n​\nBaseRanker reranker = new RRFRanker(100);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = RRFRanker(\"100\");​\n\n","export rerank='{​\n \"strategy\": \"rrf\",​\n \"params\": { \"k\": 100}​\n }'​\n\n","from pymilvus import MilvusClient​\n​\nres = client.hybrid_search(​\n collection_name=\"hybrid_search_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n limit=2​\n)​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.HybridSearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nHybridSearchReq hybridSearchReq = HybridSearchReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .searchRequests(searchRequests)​\n .ranker(reranker)​\n .topK(2)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.hybridSearch(hybridSearchReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.loadCollection({​\n collection_name: \"hybrid_search_collection\"​\n})​\n​\nimport { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​\n​\nconst search = await client.search({​\n collection_name: \"hybrid_search_collection\",​\n data: [search_param_1, search_param_2],​\n limit: 2,​\n rerank: RRFRanker(100)​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"search\\\": ${req},​\n \\\"rerank\\\": {​\n \\\"strategy\\\":\\\"rrf\\\",​\n \\\"params\\\": {​\n \\\"k\\\": 10​\n }​\n },​\n \\\"limit\\\": 3,​\n \\\"outputFields\\\": [​\n \\\"user_id\\\",​\n \\\"word_count\\\",​\n \\\"book_describe\\\"​\n ]​\n}\"​\n\n","[\"['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']\"]​\n\n"],"headingContent":"Hybrid Search​","anchorList":[{"label":"Гибридный поиск","href":"Hybrid-Search​","type":1,"isActive":false},{"label":"Сценарии","href":"Scenarios​","type":2,"isActive":false},{"label":"Рабочий процесс","href":"Workflow​","type":2,"isActive":false},{"label":"Примеры","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.md new file mode 100644 index 000000000..0ea3a3a84 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/multi-vector-search.md @@ -0,0 +1,683 @@ +--- +id: multi-vector-search.md +order: 2 +summary: >- + В этом руководстве показано, как выполнять гибридный поиск в Milvus и понимать + ранжирование результатов. +title: Гибридный поиск +--- +

    Гибридный поиск

    Гибридный поиск - это метод поиска, при котором одновременно выполняется несколько ANN-поисков, перебираются несколько наборов результатов этих ANN-поисков и в итоге возвращается один набор результатов. Использование гибридного поиска позволяет повысить точность поиска. Zilliz поддерживает проведение гибридного поиска в коллекции с несколькими векторными полями.

    +

    Гибридный поиск чаще всего используется в сценариях, включающих поиск по разреженным и плотным векторам и мультимодальный поиск. В этом руководстве на конкретном примере показано, как проводить гибридный поиск в Zilliz.

    +

    Сценарии

    Гибридный поиск подходит для следующих двух сценариев.

    +

    Поиск по разреженным и плотным векторам

    Различные типы векторов могут представлять различную информацию, а использование различных моделей встраивания позволяет более полно представить различные особенности и аспекты данных. Например, при использовании различных моделей встраивания для одного и того же предложения можно сгенерировать плотный вектор для представления семантического значения и разреженный вектор для представления частоты слов в предложении.

    +
      +
    • Разреженные векторы: Разреженные векторы характеризуются высокой размерностью вектора и наличием небольшого количества ненулевых значений. Такая структура делает их особенно хорошо подходящими для традиционных приложений информационного поиска. В большинстве случаев количество измерений, используемых в разреженных векторах, соответствует различным лексемам в одном или нескольких языках. Каждому измерению присваивается значение, которое указывает на относительную важность этой лексемы в документе. Такая схема удобна для задач, связанных с сопоставлением текстов.

    • +
    • Плотные векторы: Плотные векторы - это вкрапления, полученные из нейронных сетей. Будучи расположенными в упорядоченном массиве, эти векторы отражают семантическую сущность входного текста. Обратите внимание, что плотные векторы не ограничиваются обработкой текста; они также широко используются в компьютерном зрении для представления семантики визуальных данных. Эти плотные векторы, обычно генерируемые моделями встраивания текста, характеризуются тем, что большинство или все элементы являются ненулевыми. Таким образом, плотные векторы особенно эффективны для приложений семантического поиска, поскольку они могут возвращать наиболее похожие результаты на основе векторного расстояния даже при отсутствии точных текстовых совпадений. Эта возможность позволяет получить более тонкие и учитывающие контекст результаты поиска, часто улавливая взаимосвязи между понятиями, которые могут быть упущены при использовании подходов, основанных на ключевых словах.

    • +
    +

    Более подробную информацию см. в разделах "Разреженный вектор" и "Плотный вектор".

    +

    Мультимодальный поиск

    Мультимодальный поиск - это поиск сходства между неструктурированными данными в нескольких модальностях (например, изображения, видео, аудио, текст и т. д.). Например, человек может быть представлен с помощью различных модальностей данных, таких как отпечатки пальцев, отпечатки голоса и черты лица. Гибридный поиск поддерживает несколько поисков одновременно. Например, поиск человека по схожим отпечаткам пальцев и отпечаткам голоса.

    +

    Рабочий процесс

    Основной рабочий процесс при проведении гибридного поиска выглядит следующим образом.

    +
      +
    1. Генерирование плотных векторов с помощью моделей встраивания, таких как BERT и Transformers.

    2. +
    3. Генерирование разреженных векторов с помощью таких моделей встраивания, как BM25, BGE-M3, SPLADE и т. д.

    4. +
    5. Создайте коллекцию в Zilliz и определите схему коллекции, включающую плотные и разреженные векторные поля.

    6. +
    7. Вставьте разреженные векторы в коллекцию, только что созданную на предыдущем этапе.

    8. +
    9. Проведите гибридный поиск: ANN-поиск по плотным векторам вернет набор топ-K наиболее похожих результатов, а текстовое соответствие по разреженным векторам также вернет набор топ-K результатов.

    10. +
    11. Нормализация: Нормализуйте оценки двух наборов топ-K результатов, преобразовав их в диапазон между [0,1].

    12. +
    13. Выберите подходящую стратегию ранжирования для объединения и ранжирования двух наборов результатов top-K и, в конечном счете, верните окончательный набор результатов top-K.

    14. +
    +

    + + Hybrid Search Workflow + Рабочий процесс гибридного поиска

    +

    Примеры

    В этом разделе на конкретном примере показано, как проводить гибридный поиск на разреженных векторах для повышения точности текстового поиска.

    +

    Создание коллекции с несколькими векторными полями

    Процесс создания коллекции состоит из трех частей: определение схемы коллекции, настройка параметров индекса и создание коллекции.

    +

    Определение схемы

    В этом примере необходимо определить несколько векторных полей в схеме коллекции. В настоящее время каждая коллекция по умолчанию может включать до 4 векторных полей. Но вы также можете изменить значение параметра proxy.maxVectorFieldNum чтобы при необходимости включить в коллекцию до 10 векторных полей.

    +

    В следующем примере определена схема коллекции, где dense и sparse - это два векторных поля.

    +
      +
    • id: Это поле служит первичным ключом для хранения текстовых идентификаторов. Тип данных этого поля - INT64.

    • +
    • text: Это поле используется для хранения текстового содержимого. Тип данных этого поля - VARCHAR, максимальная длина - 1000 символов.

    • +
    • dense: Это поле используется для хранения плотных векторов текстов. Тип данных этого поля - FLOAT_VECTOR, размерность вектора - 768.

    • +
    • sparse: Это поле используется для хранения разреженных векторов текстов. Тип данных этого поля - SPARSE_FLOAT_VECTOR.

    • +
    + +
    # Create a collection in customized setup mode​
    +from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +# Add fields to schema​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field(field_name="dense", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("text")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(1000)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(768)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    // WIP​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// Create a collection in customized setup mode​
    +// Define fields​
    +const fields = [​
    +    {​
    +        name: "id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "text",​
    +        data_type: DataType.VarChar,​
    +        max_length: 1000​
    +    },​
    +    {​
    +        name: "sparse",​
    +        data_type: DataType.SPARSE_FLOAT_VECTOR​
    +    },​
    +    {​
    +        name: "dense",​
    +        data_type: DataType.FloatVector,​
    +        dim: 768​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": true,​
    +        "fields": [​
    +            {​
    +                "fieldName": "id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "text",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 1000​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "sparse",​
    +                "dataType": "SparseFloatVector"​
    +            },​
    +            {​
    +                "fieldName": "dense",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "768"​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    При поиске разреженных векторов можно упростить процесс генерации разреженных векторов вкраплений, используя возможности полнотекстового поиска. Более подробную информацию см. в разделе "Полнотекстовый поиск".

    +

    Создание индекса

    После определения схемы коллекции необходимо настроить индексы векторов и метрики сходства. В этом примере для плотного векторного поля dense создается индекс IVF_FLAT, а для разреженного векторного поля sparse- индекс SPARSE_INVERTED_INDEX. Чтобы узнать о типах поддерживаемых индексов, см. раздел "Объяснение индексов".

    + +
    from pymilvus import MilvusClient​
    +​
    +# Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# Add indexes​
    +index_params.add_index(​
    +    field_name="dense",​
    +    index_name="dense_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128},​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_name="sparse_index",​
    +    index_type="SPARSE_INVERTED_INDEX",  # Index type for sparse vectors​
    +    metric_type="IP",  # Currently, only IP (Inner Product) is supported for sparse vectors​
    +    params={"drop_ratio_build": 0.2},  # The ratio of small vector values to be dropped during indexing​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +Map<String, Object> denseParams = new HashMap<>();​
    +denseParams.put("nlist", 128);​
    +IndexParam indexParamForDenseField = IndexParam.builder()​
    +        .fieldName("dense")​
    +        .indexName("dense_index")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(denseParams)​
    +        .build();​
    +​
    +Map<String, Object> sparseParams = new HashMap<>();​
    +sparseParams.put("drop_ratio_build", 0.2);​
    +IndexParam indexParamForSparseField = IndexParam.builder()​
    +        .fieldName("sparse")​
    +        .indexName("sparse_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(sparseParams)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForDenseField);​
    +indexParams.add(indexParamForSparseField);​
    +
    +
    +
    const index_params = [{​
    +    field_name: "dense",​
    +    index_type: "IVF_FLAT",​
    +    metric_type: "IP"​
    +},{​
    +    field_name: "sparse",​
    +    index_type: "SPARSE_INVERTED_INDEX",​
    +    metric_type: "IP"​
    +}]​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense",​
    +            "metricType": "IP",​
    +            "indexName": "dense_index",​
    +            "indexType":"IVF_FLAT",​
    +            "params":{"nlist":128}​
    +        },​
    +        {​
    +            "fieldName": "sparse",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    Создание коллекции

    Создайте коллекцию с именем demo со схемой коллекции и индексами, настроенными в предыдущих двух шагах.

    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_collection(​
    +    collection_name="hybrid_search_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    res = await client.createCollection({​
    +    collection_name: "hybrid_search_collection",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    Вставка данных

    Вставьте разреженно-плотные векторы в коллекцию demo.

    + +
    from pymilvus import MilvusClient​
    +​
    +data=[​
    +    {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +    {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +    {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +​
    +res = client.insert(​
    +    collection_name="hybrid_search_collection",​
    +    data=data​
    +)​
    +​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +​
    +Gson gson = new Gson();​
    +JsonObject row1 = new JsonObject();​
    +row1.addProperty("id", 1);​
    +row1.addProperty("text", "Artificial intelligence was founded as an academic discipline in 1956.");​
    +row1.add("dense", gson.toJsonTree(dense1));​
    +row1.add("sparse", gson.toJsonTree(sparse1));​
    +​
    +JsonObject row2 = new JsonObject();​
    +row2.addProperty("id", 2);​
    +row2.addProperty("text", "Alan Turing was the first person to conduct substantial research in AI.");​
    +row2.add("dense", gson.toJsonTree(dense2));​
    +row2.add("sparse", gson.toJsonTree(sparse2));​
    +​
    +JsonObject row3 = new JsonObject();​
    +row3.addProperty("id", 3);​
    +row3.addProperty("text", "Born in Maida Vale, London, Turing was raised in southern England.");​
    +row3.add("dense", gson.toJsonTree(dense3));​
    +row3.add("sparse", gson.toJsonTree(sparse3));​
    +​
    +List<JsonObject> data = Arrays.asList(row1, row2, row3);​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +var data = [​
    +    {id: 0, text: "Artificial intelligence was founded as an academic discipline in 1956.", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​
    +    {id: 1, text: "Alan Turing was the first person to conduct substantial research in AI.", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​
    +    {id: 2, text: "Born in Maida Vale, London, Turing was raised in southern England." , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]}       ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "hybrid_search_collection",​
    +    data: data,​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{"9637": 0.30856525997853057, "4399": 0.19771651149001523}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +        {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{"6959": 0.31025067641541815, "1729": 0.8265339135915016}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +        {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{"1220": 0.15303302147479103, "7335": 0.9436728846033107}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +    ],​
    +    "collectionName": "hybrid_search_collection"​
    +}'​
    +
    +
    +

    Создание нескольких экземпляров AnnSearchRequest

    Гибридный поиск реализуется путем создания нескольких AnnSearchRequest в функции hybrid_search(), где каждый AnnSearchRequest представляет собой базовый запрос на поиск ANN для определенного векторного поля. Поэтому перед проведением гибридного поиска необходимо создать AnnSearchRequest для каждого векторного поля.

    +
    +

    В гибридном поиске каждый AnnSearchRequest поддерживает только один вектор запроса.

    +
    +

    Предположим, текст запроса "Кто начал исследования ИИ?" уже преобразован в разреженный и плотный векторы. Исходя из этого, создаются два поисковых запроса AnnSearchRequest для векторных полей sparse и dense соответственно, как показано в следующем примере.

    + +
    from pymilvus import AnnSearchRequest​
    +​
    +query_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +search_param_1 = {​
    +    "data": [query_dense_vector],​
    +    "anns_field": "dense",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2​
    +}​
    +request_1 = AnnSearchRequest(**search_param_1)​
    +​
    +query_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​
    +search_param_2 = {​
    +    "data": [query_sparse_vector],​
    +    "anns_field": "sparse",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2​
    +}​
    +request_2 = AnnSearchRequest(**search_param_2)​
    +​
    +reqs = [request_1, request_2]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.AnnSearchReq;​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +​
    +float[] dense = new float[]{-0.0475336798f,  0.0521207601f,  0.0904406682f, ...};​
    +SortedMap<Long, Float> sparse = new TreeMap<Long, Float>() {{​
    +    put(3573L, 0.34701499f);​
    +    put(5263L, 0.263937551f);​
    +    ...​
    +}};​
    +​
    +​
    +List<BaseVector> queryDenseVectors = Collections.singletonList(new FloatVec(dense));​
    +List<BaseVector> querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​
    +​
    +List<AnnSearchReq> searchRequests = new ArrayList<>();​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("dense")​
    +        .vectors(queryDenseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"nprobe\": 10}")​
    +        .topK(2)​
    +        .build());​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("sparse")​
    +        .vectors(querySparseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"drop_ratio_build\": 0.2}")​
    +        .topK(2)​
    +        .build());​
    +
    +
    +
    const search_param_1 = {​
    +    "data": query_vector, ​
    +    "anns_field": "dense", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +​
    +const search_param_2 = {​
    +    "data": query_sparse_vector, ​
    +    "anns_field": "sparse", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +
    +
    +
    export req='[​
    +    {​
    +        "data": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​
    +        "annsField": "dense",​
    +        "params": {​
    +            "params": {​
    +                "nprobe": 10​
    +             }​
    +        },​
    +        "limit": 2​
    +    },​
    +    {​
    +        "data": [{"3573": 0.34701499565746674}, {"5263": 0.2639375518635271}],​
    +        "annsField": "sparse",​
    +        "params": {​
    +            "params": {​
    +                "drop_ratio_build": 0.2​
    +             }​
    +        },​
    +        "limit": 2​
    +    }​
    + ]'​
    +
    +
    +

    Поскольку параметр limit имеет значение 2, каждый AnnSearchRequest возвращает 2 результата поиска. В данном примере создано 2 AnnSearchRequest, поэтому всего будет возвращено 4 результата поиска.

    +

    Настройка стратегии ранжирования

    Чтобы объединить и ранжировать два набора результатов поиска ANN, необходимо выбрать подходящую стратегию ранжирования. Zilliz поддерживает два типа стратегий ранжирования: WeightedRanker и RRFRanker. При выборе стратегии ранжирования следует учитывать, есть ли акцент на одном или нескольких базовых ANN-поисках по векторным полям.

    +
      +
    • WeightedRanker: Эта стратегия рекомендуется, если вы хотите, чтобы в результатах был сделан акцент на определенном векторном поле. WeightedRanker позволяет присваивать более высокие веса определенным векторным полям, делая на них больший акцент. Например, при мультимодальном поиске текстовые описания изображения могут считаться более важными, чем цвета на этом изображении.

    • +
    • RRFRanker (Reciprocal Rank Fusion Ranker): Эта стратегия рекомендуется, когда нет конкретного акцента. RRF может эффективно сбалансировать важность каждого векторного поля.

    • +
    +

    Более подробную информацию о механизмах работы этих двух стратегий ранжирования см. в разделе Ранжирование.

    +

    В следующих двух примерах показано, как использовать стратегии ранжирования WeightedRanker и RRFRanker.

    +
      +
    1. Пример 1: Использование WeightedRanker

      +

      При использовании стратегии WeightedRanker необходимо ввести значения веса в функцию WeightedRanker. Количество базовых ANN в гибридном поиске соответствует количеству значений, которые необходимо ввести. Вводимые значения должны находиться в диапазоне [0,1], причем значения ближе к 1 означают большую важность.

      +

      +
      from pymilvus import WeightedRanker​
      +​
      +rerank= WeightedRanker(0.8, 0.3) ​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.WeightedRanker;​
      +​
      +BaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = WeightedRanker(0.8, 0.3);​
      +
      +
      +
      export rerank='{​
      +        "strategy": "ws",​
      +        "params": {"weights": [0.8,0.3]}​
      +    }'​
      +
      +
    2. +
    3. Пример 2: Использование RRFRanker

      +

      При использовании стратегии RRFRanker необходимо ввести в RRFRanker значение параметра k. По умолчанию значение k равно 60. Этот параметр помогает определить, как объединяются ранги из разных поисковых запросов ANN, стремясь сбалансировать и объединить важность всех поисковых запросов.

      +

      +
      from pymilvus import RRFRanker​
      +​
      +ranker = RRFRanker(100)​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.RRFRanker;​
      +​
      +BaseRanker reranker = new RRFRanker(100);​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = RRFRanker("100");​
      +
      +
      +
      export rerank='{​
      +        "strategy": "rrf",​
      +        "params": { "k": 100}​
      +    }'​
      +
      +
    4. +
    +

    Выполнение гибридного поиска

    Перед проведением гибридного поиска необходимо загрузить коллекцию в память. Если какие-либо векторные поля коллекции не имеют индекса или не загружены, при вызове метода Hybrid Search возникнет ошибка.

    + +
    from pymilvus import MilvusClient​
    +​
    +res = client.hybrid_search(​
    +    collection_name="hybrid_search_collection",​
    +    reqs=reqs,​
    +    ranker=ranker,​
    +    limit=2​
    +)​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.HybridSearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +HybridSearchReq hybridSearchReq = HybridSearchReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .searchRequests(searchRequests)​
    +        .ranker(reranker)​
    +        .topK(2)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.hybridSearch(hybridSearchReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.loadCollection({​
    +    collection_name: "hybrid_search_collection"​
    +})​
    +​
    +import { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​
    +​
    +const search = await client.search({​
    +  collection_name: "hybrid_search_collection",​
    +  data: [search_param_1, search_param_2],​
    +  limit: 2,​
    +  rerank: RRFRanker(100)​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"search\": ${req},​
    +    \"rerank\": {​
    +        \"strategy\":\"rrf\",​
    +        \"params\": {​
    +            \"k\": 10​
    +        }​
    +    },​
    +    \"limit\": 3,​
    +    \"outputFields\": [​
    +        \"user_id\",​
    +        \"word_count\",​
    +        \"book_describe\"​
    +    ]​
    +}"​
    +
    +
    +

    Ниже приведен результат.

    +
    ["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]​
    +
    +
    +

    Поскольку в методе Hybrid Search указано limit=2, Zilliz проранжирует четыре результата поиска из шага 3 и в итоге вернет только 2 наиболее похожих результата поиска.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.json new file mode 100644 index 000000000..0caec65ed --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={​\n # highlight-start​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n # highlight-end​\n }​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"radius\", 0.4);​\nextraParams.put(\"range_filter\", 0.6);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"range_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .searchParams(extraParams)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​\n\n","// TODO ​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"range_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n params: {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"searchParams\": {​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n }​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n"],"headingContent":"Range Search​","anchorList":[{"label":"Поиск по диапазону","href":"Range-Search​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Примеры","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.md new file mode 100644 index 000000000..fd2a37b1a --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/range-search.md @@ -0,0 +1,214 @@ +--- +id: range-search.md +summary: >- + Поиск по диапазону повышает релевантность результатов поиска, ограничивая + расстояние или оценку возвращаемых сущностей определенным диапазоном. Эта + страница поможет вам понять, что такое поиск по диапазону и каковы процедуры + поиска по диапазону. +title: Поиск диапазона +--- +

    Поиск по диапазону

    Поиск по диапазону повышает релевантность результатов поиска, ограничивая расстояние или оценку возвращаемых сущностей определенным диапазоном. Эта страница поможет вам понять, что такое поиск по диапазону, а также процедуры для проведения поиска по диапазону.

    +

    Обзор

    При выполнении запроса на поиск в диапазоне Milvus использует наиболее похожие на вектор запроса векторы из результатов поиска ANN в качестве центра, радиус, указанный в запросе на поиск, в качестве радиуса внешнего круга, а range_filter в качестве радиуса внутреннего круга, чтобы нарисовать две концентрические окружности. Будут возвращены все векторы с оценками сходства, которые попадают в кольцевую область, образованную этими двумя концентрическими окружностями. Здесь range_filter может быть установлен в 0, что означает, что будут возвращены все сущности в пределах указанного балла сходства (радиуса).

    +

    + + Range search + Поиск по диапазону

    +

    На приведенной выше схеме видно, что запрос на поиск по диапазону содержит два параметра: радиус и range_filter. Получив запрос на поиск по диапазону, Milvus делает следующее.

    +
      +
    • Использует указанный тип метрики(COSINE) для поиска всех векторных вкраплений, наиболее похожих на вектор запроса.

    • +
    • Отфильтровать векторные вкрапления, чьи расстояния или оценки до вектора запроса попадают в диапазон, заданный параметрами radius и range_filter.

    • +
    • Вернуть топ-K сущностей из отфильтрованных.

    • +
    +

    Способ задания параметров radius и range_filter зависит от типа метрики поиска. В следующей таблице перечислены требования к настройке этих двух параметров для различных типов метрик.

    +

    Тип метрики

    +

    Обозначения

    +

    Требования к настройке radius и range_filter

    +

    L2

    +

    Меньшее расстояние L2 указывает на большее сходство.

    +

    Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что

    +

    range_filter <= расстояние < radius

    +

    IP

    +

    Большее расстояние IP указывает на большее сходство.

    +

    Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что

    +

    radius < расстояние <= range_filter

    +

    COSINE

    +

    Большее расстояние COSINE указывает на большее сходство.

    +

    Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

    +

    radius < расстояние <= range_filter

    +

    JACCARD

    +

    Меньшее расстояние Жаккара указывает на большее сходство.

    +

    +

    Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

    +

    range_filter <= расстояние < radius

    +

    HAMMING

    +

    Меньшее расстояние Хэмминга указывает на большее сходство.

    +

    Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

    +

    range_filter <= расстояние < radius

    +
    +

    Примеры

    В этом разделе показано, как выполнять поиск по диапазону. Поисковые запросы в следующих фрагментах кода не содержат метрического типа, что указывает на применение метрического типа по умолчанию COSINE. В этом случае убедитесь, что значение радиуса меньше значения range_filter.

    +

    В следующих фрагментах кода установите radius на 0.4 и range_filter на 0.6, чтобы Milvus вернул все сущности, чьи расстояния или баллы до вектора запроса находятся в пределах от 0,4 до 0,6.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={​
    +        # highlight-start​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +        # highlight-end​
    +    }​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    + io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("radius", 0.4);​
    +extraParams.put("range_filter", 0.6);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("range_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .searchParams(extraParams)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​
    +
    +
    +
    // TODO ​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "range_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    params: {​
    +        "radius": 0.4,​
    +        "range_filter": 0.6​
    +    }​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "searchParams": {​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +    }​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.json new file mode 100644 index 000000000..975c53454 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import WeightedRanker\n\n# Use WeightedRanker to combine results with specified weights\nrerank = WeightedRanker(0.8, 0.8, 0.7) \n","from pymilvus import RRFRanker\n\n# Default k value is 60\nranker = RRFRanker()\n\n# Or specify k value\nranker = RRFRanker(k=100)\n"],"headingContent":"Reranking","anchorList":[{"label":"Ранжирование","href":"Reranking","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Взвешенная оценка (WeightedRanker)","href":"Weighted-Scoring-WeightedRanker","type":2,"isActive":false},{"label":"Взаимное слияние рангов (RRFRanker)","href":"Reciprocal-Rank-Fusion-RRFRanker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.md new file mode 100644 index 000000000..07747a300 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/reranking.md @@ -0,0 +1,122 @@ +--- +id: reranking.md +summary: >- + В этой теме рассматривается процесс реранжирования, объясняется его значение и + реализуются два метода реранжирования. +title: Ранжирование +--- +

    Ранжирование

    Milvus обеспечивает возможности гибридного поиска с помощью API hybrid_search(), используя сложные стратегии ранжирования для уточнения результатов поиска по нескольким экземплярам AnnSearchRequest. В этой теме рассматривается процесс реранжирования, объясняется его значение и реализация различных стратегий реранжирования в Milvus.

    +

    Обзор

    Следующий рисунок иллюстрирует выполнение гибридного поиска в Milvus и подчеркивает роль реранкинга в этом процессе.

    +

    reranking_process

    +

    Ранжирование в гибридном поиске - это важный этап, который объединяет результаты из нескольких векторных полей, обеспечивая релевантность и точную расстановку приоритетов в итоговой выдаче. В настоящее время Milvus предлагает следующие стратегии ранжирования:

    +
      +
    • WeightedRanker: Этот подход объединяет результаты, вычисляя средневзвешенное значение оценок (или векторных расстояний) из разных векторных поисков. Он присваивает веса в зависимости от значимости каждого векторного поля.

    • +
    • RRFRanker: Эта стратегия объединяет результаты на основе их рангов в различных векторных столбцах.

    • +
    +

    Взвешенная оценка (WeightedRanker)

    Стратегия WeightedRanker присваивает различные веса результатам из каждого маршрута векторного поиска на основе значимости каждого векторного поля. Эта стратегия ранжирования применяется, когда значимость каждого векторного поля варьируется, что позволяет выделить определенные векторные поля по сравнению с другими, присвоив им более высокие веса. Например, при мультимодальном поиске текстовое описание может считаться более важным, чем распределение цветов на изображениях.

    +

    Основной процесс работы WeightedRanker выглядит следующим образом:

    +
      +
    • Сбор оценок во время поиска: Сбор результатов и их оценок из различных маршрутов векторного поиска.

    • +
    • Нормализация оценок: Нормализация оценок по каждому маршруту в диапазоне [0,1], где значения ближе к 1 означают более высокую релевантность. Эта нормализация очень важна, так как распределения баллов варьируются в зависимости от типа метрики. Например, расстояние для IP находится в диапазоне [-∞,+∞], а расстояние для L2 - в диапазоне [0,+∞]. Milvus использует функцию arctan, преобразуя значения в диапазон [0,1], чтобы обеспечить стандартизированную основу для различных типов метрик.

      +

      arctan-function

    • +
    • Распределение веса: Присвойте вес w𝑖 каждому маршруту векторного поиска. Пользователи задают веса, которые отражают надежность, точность или другие важные метрики источника данных. Каждый вес находится в диапазоне [0,1].

    • +
    • Слияние баллов: Вычисление средневзвешенного значения нормализованных оценок для получения итоговой оценки. Затем результаты ранжируются на основе этих оценок от самой высокой до самой низкой, чтобы получить окончательные отсортированные результаты.

    • +
    +

    + + weighted-reranker + взвешенный ранжир

    +

    Чтобы использовать эту стратегию, примените экземпляр WeightedRanker и задайте значения весов, передав переменное количество числовых аргументов.

    +
    from pymilvus import WeightedRanker
    +
    +# Use WeightedRanker to combine results with specified weights
    +rerank = WeightedRanker(0.8, 0.8, 0.7) 
    +
    +

    Обратите внимание, что:

    +
      +
    • Каждое значение веса варьируется от 0 (наименее важный) до 1 (наиболее важный), влияя на итоговый суммарный балл.

    • +
    • Общее количество значений веса, указанных в WeightedRanker, должно быть равно количеству экземпляров AnnSearchRequest, созданных ранее.

    • +
    • Стоит отметить, что из-за различий в измерениях разных типов метрик мы нормализуем расстояния между результатами отзыва так, чтобы они лежали в интервале [0,1], где 0 означает "разные", а 1 - "похожие". Итоговая оценка будет представлять собой сумму значений веса и расстояния.

    • +
    +

    Взаимное слияние рангов (RRFRanker)

    RRF - это метод слияния данных, который объединяет ранжированные списки на основе взаимности их рангов. Это эффективный способ сбалансировать влияние каждого векторного поля, особенно когда нет четкого приоритета важности. Эта стратегия обычно используется, когда необходимо уделить равное внимание всем векторным полям или когда существует неопределенность в отношении относительной важности каждого поля.

    +

    Основной процесс RRF выглядит следующим образом:

    +
      +
    • Сбор рейтингов во время поиска: Ретриверы по нескольким векторным полям получают и сортируют результаты.

    • +
    • Слияние рангов: Алгоритм RRF взвешивает и объединяет ранги, полученные от каждого ретривера. Формула выглядит следующим образом:

      +

      + + rrf-ranker + rrf-ranker

      +

      Здесь 𝑁 представляет собой количество различных маршрутов поиска, rank𝑖(𝑑) - ранговая позиция извлеченного документа 𝑑 по 𝑖-му ретриверу, а 𝑘 - параметр сглаживания, обычно устанавливаемый на 60.

    • +
    • Комплексное ранжирование: Повторное ранжирование найденных результатов на основе комбинированных оценок для получения окончательных результатов.

    • +
    +

    Чтобы использовать эту стратегию, примените экземпляр RRFRanker.

    +
    from pymilvus import RRFRanker
    +
    +# Default k value is 60
    +ranker = RRFRanker()
    +
    +# Or specify k value
    +ranker = RRFRanker(k=100)
    +
    +

    RRF позволяет сбалансировать влияние полей без указания явных весов. Лучшие совпадения, согласованные несколькими полями, будут приоритетными в итоговом рейтинге.

    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.json new file mode 100644 index 000000000..4e8179d04 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n anns_field=\"vector\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"}​\n)​\n​\nfor hits in res:​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 7. Search with multiple vectors​\n# 7.1. Prepare query vectors​\nquery_vectors = [​\n [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​\n [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​\n]​\n​\n# 7.2. Start search​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# Output​\n#​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ],​\n# [​\n# {​\n# \"id\": 730,​\n# \"distance\": 0.04431751370429993,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 333,​\n# \"distance\": 0.04231833666563034,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 232,​\n# \"distance\": 0.04221535101532936,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nList queryVectors = Arrays.asList(​\n new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​\n new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​\n);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(queryVectors)​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​\n// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​\n// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​\n// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​\n\n","// 7. Search with multiple vectors​\nconst query_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n vectors: query_vectors,​\n limit: 5,​\n})​\n​\nconsole.log(res.results)​\n​\n// Output​\n// ​\n// [​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ],​\n// [​\n// { score: 0.04431751370429993, id: '730' },​\n// { score: 0.04231833666563034, id: '333' },​\n// { score: 0.04221535101532936, id: '232' },​\n// ]​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ],​\n# [​\n# {​\n# \"distance\": 0.04431751370429993,​\n# \"id\": 730​\n# },​\n# {​\n# \"distance\": 0.04231833666563034,​\n# \"id\": 333​\n# },​\n# {​\n# \"distance\": 0.04221535101532936,​\n# \"id\": 232​\n# }​\n# ]​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n data=[query_vector],​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​\n// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​\n// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_names: [\"partitionA\"],​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"],​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-next-line​\n output_fields=[\"color\"]​\n)​\n​\nprint(res)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {​\n# \"color\": \"orange_6781\"​\n# }​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {​\n# \"color\": \"red_4794\"​\n# }​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {​\n# \"color\": \"grey_8510\"​\n# }​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n // highlight-next-line​\n output_fields: [\"color\"]​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551', entity: {\"color\": \"orange_6781\"}},​\n// { score: 0.0800950899720192, id: '296' entity: {\"color\": \"red_4794\"}},​\n// { score: 0.07794742286205292, id: '43' entity: {\"color\": \"grey_8510\"}}​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551,​\n# \"color\": \"orange_6781\"​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296,​\n# \"color\": \"red_4794\"​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# \"color\": \"grey_8510\"​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={​\n \"metric_type\": \"IP\", ​\n # highlight-next-line​\n \"offset\": 10 # The records to skip​\n }​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .offset(10)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​\n// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​\n// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return,​\n // highlight-next-line​\n offset: 10 // The record to skip.​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"offset\": 10​\n}'​\n\n"],"headingContent":"Ba​sic ANN Search","anchorList":[{"label":"Базовый ANN-поиск","href":"Ba​sic-ANN-Search","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Одновекторный поиск","href":"Single-Vector-Search​","type":2,"isActive":false},{"label":"Поиск по большому вектору","href":"Bulk-Vector-Search​","type":2,"isActive":false},{"label":"Поиск ANN в разделах","href":"ANN-Search-in-Partition​","type":2,"isActive":false},{"label":"Использование выходных полей","href":"Use-Output-Fields​","type":2,"isActive":false},{"label":"Использование лимита и смещения","href":"Use-Limit-and-Offset​","type":2,"isActive":false},{"label":"Улучшение поиска с помощью ИНС","href":"Enhancing-ANN-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.md new file mode 100644 index 000000000..575db716d --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/single-vector-search.md @@ -0,0 +1,919 @@ +--- +id: single-vector-search.md +order: 1 +summary: >- + В этой статье описывается, как искать векторы в коллекции Milvus с помощью + одного вектора запроса. +title: Базовый ANN-поиск +--- +

    Базовый ANN-поиск

    На основе индексного файла, в котором хранится отсортированный порядок векторных вкраплений, поиск по методу приближенного ближайшего соседа (ANN) находит подгруппу векторных вкраплений на основе вектора запроса, содержащегося в полученном поисковом запросе, сравнивает вектор запроса с векторами в подгруппе и возвращает наиболее похожие результаты. С помощью ANN-поиска Milvus обеспечивает эффективный поиск. Эта страница поможет вам узнать, как проводить базовый поиск с помощью ANN.

    +

    Обзор

    Поиск ANN и поиск k-Nearest Neighbors (kNN) являются обычными методами поиска векторного сходства. При kNN-поиске необходимо сравнить все векторы в векторном пространстве с вектором запроса, переданным в поисковом запросе, прежде чем определить наиболее похожие, что занимает много времени и ресурсов.

    +

    В отличие от kNN-поиска, алгоритм ANN-поиска запрашивает индексный файл, в котором записан отсортированный порядок векторных вкраплений. Когда поступает запрос на поиск, вы можете использовать индексный файл в качестве справочника, чтобы быстро найти подгруппу, вероятно, содержащую векторные вложения, наиболее похожие на вектор запроса. Затем вы можете использовать указанный тип метрики для измерения сходства между вектором запроса и векторами в подгруппе, отсортировать членов группы по сходству с вектором запроса и определить членов группы Top-K.

    +

    Поиск в ANN зависит от предварительно созданных индексов, поэтому производительность поиска, использование памяти и корректность поиска могут отличаться в зависимости от выбранного типа индекса. Необходимо соблюдать баланс между производительностью и корректностью поиска.

    +

    Чтобы сократить время обучения, Milvus предоставляет AUTOINDEX. С помощью AUTOINDEX Milvus анализирует распределение данных в вашей коллекции во время создания индекса и устанавливает наиболее оптимальные параметры индекса на основе анализа, чтобы найти баланс между производительностью и корректностью поиска.

    +

    Подробные сведения об AUTOINDEX и применимых типах метрик см. в разделе AUTOINDEX и типы метрик. В этом разделе вы найдете подробную информацию о следующих темах.

    + +

    Одновекторный поиск

    В ANN-поиске одновекторный поиск означает поиск, который включает только один вектор запроса. На основе предварительно созданного индекса и типа метрики, указанного в поисковом запросе, Milvus найдет топ-K векторов, наиболее похожих на вектор запроса.

    +

    В этом разделе вы узнаете, как выполнить одновекторный поиск. Сниппет кода предполагает, что вы создали коллекцию быстрым способом. Запрос на поиск содержит один вектор запроса и просит Milvus использовать Inner Product (IP) для расчета сходства между векторами запроса и векторами в коллекции и возвращает три наиболее похожих.

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    anns_field="vector",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"}​
    +)​
    +​
    +for hits in res:​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +    ​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,             // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Milvus ранжирует результаты поиска по степени их сходства с вектором запроса в порядке убывания. Показатель сходства также называется расстоянием до вектора запроса, и его диапазон значений зависит от используемых типов метрик.

    +

    В следующей таблице перечислены используемые типы метрик и соответствующие диапазоны расстояний.

    +

    Тип метрики

    +

    Характеристики

    +

    Диапазон расстояний

    +

    L2

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, ∞)

    +

    IP

    +

    Большее значение указывает на большее сходство.

    +

    [-1, 1]

    +

    COSINE

    +

    Большее значение указывает на большее сходство.

    +

    [-1, 1]

    +

    JACCARD

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, 1]

    +

    HAMMING

    +

    Меньшее значение указывает на большее сходство.

    +

    [0, dim(vector)].

    +
    +

    Поиск по большому вектору

    Аналогичным образом вы можете включить в поисковый запрос несколько векторов запроса. Milvus проведет параллельный поиск ANN по векторам запроса и вернет два набора результатов.

    + +
    # 7. Search with multiple vectors​
    +# 7.1. Prepare query vectors​
    +query_vectors = [​
    +    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​
    +    [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​
    +]​
    +​
    +# 7.2. Start search​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# Output​
    +#​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ],​
    +#     [​
    +#         {​
    +#             "id": 730,​
    +#             "distance": 0.04431751370429993,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 333,​
    +#             "distance": 0.04231833666563034,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 232,​
    +#             "distance": 0.04221535101532936,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +List<BaseVector> queryVectors = Arrays.asList(​
    +        new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​
    +        new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​
    +);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(queryVectors)​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​
    +// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​
    +// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​
    +// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​
    +
    +
    +
    // 7. Search with multiple vectors​
    +const query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​
    +    [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    vectors: query_vectors,​
    +    limit: 5,​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// Output​
    +// ​
    +// [​
    +//   [​
    +//     { score: 0.08821295201778412, id: '551' },​
    +//     { score: 0.0800950899720192, id: '296' },​
    +//     { score: 0.07794742286205292, id: '43' }​
    +//   ],​
    +//   [​
    +//     { score: 0.04431751370429993, id: '730' },​
    +//     { score: 0.04231833666563034, id: '333' },​
    +//     { score: 0.04221535101532936, id: '232' },​
    +//   ]​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +        [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         [​
    +#           {​
    +#               "distance": 0.08821295201778412,​
    +#               "id": 551​
    +#           },​
    +#           {​
    +#               "distance": 0.0800950899720192,​
    +#               "id": 296​
    +#           },​
    +#           {​
    +#               "distance": 0.07794742286205292,​
    +#               "id": 43​
    +#           }​
    +#         ],​
    +#         [​
    +#           {​
    +#               "distance": 0.04431751370429993,​
    +#               "id": 730​
    +#           },​
    +#           {​
    +#               "distance": 0.04231833666563034,​
    +#               "id": 333​
    +#           },​
    +#           {​
    +#               "distance": 0.04221535101532936,​
    +#               "id": 232​
    +#           }​
    +#        ]​
    +#     ]​
    +# }​
    +
    +
    +

    Поиск ANN в разделах

    Предположим, вы создали несколько разделов в коллекции, и вам нужно сузить область поиска до определенного количества разделов. В этом случае в запрос на поиск можно включить имена целевых разделов, чтобы ограничить область поиска указанными разделами. Сокращение числа разделов, участвующих в поиске, повышает производительность поиска.

    +

    Следующий фрагмент кода предполагает наличие в коллекции раздела с именем PartitionA.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    data=[query_vector],​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​
    +// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​
    +// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_names: ["partitionA"],​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"],​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Использование выходных полей

    В результаты поиска Milvus по умолчанию включает значения первичных полей и расстояния/коэффициенты сходства сущностей, содержащих векторные вкрапления top-K. Вы можете включить имена целевых полей в поисковый запрос в качестве выходных полей, чтобы результаты поиска содержали значения других полей этих сущностей.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-next-line​
    +    output_fields=["color"]​
    +)​
    +​
    +print(res)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {​
    +#                 "color": "orange_6781"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {​
    +#                 "color": "red_4794"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {​
    +#                 "color": "grey_8510"​
    +#             }​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +    // highlight-next-line​
    +    output_fields: ["color"]​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551', entity: {"color": "orange_6781"}},​
    +//   { score: 0.0800950899720192, id: '296' entity: {"color": "red_4794"}},​
    +//   { score: 0.07794742286205292, id: '43' entity: {"color": "grey_8510"}}​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551,​
    +#             "color": "orange_6781"​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296,​
    +#             "color": "red_4794"​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#             "color": "grey_8510"​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Использование лимита и смещения

    Вы можете заметить, что параметр limit, передаваемый в поисковых запросах, определяет количество сущностей, включаемых в результаты поиска. Этот параметр определяет максимальное количество сущностей, возвращаемых при одном поиске, и обычно называется top-K.

    +

    Если вы хотите выполнять постраничные запросы, вы можете использовать цикл для отправки нескольких запросов на поиск, при этом параметры Limit и Offset будут передаваться в каждом запросе. В частности, вы можете установить параметр Limit на количество сущностей, которые вы хотите включить в результаты текущего запроса, а Offset - на общее количество сущностей, которые уже были возвращены.

    +

    В таблице ниже показано, как задать параметры Limit и Offset для постраничных запросов, возвращающих 100 сущностей за раз.

    +

    Запросы

    +

    Сущности, возвращаемые по одному запросу

    +

    Сущности, которые уже были возвращены в общей сложности

    +

    1-й запрос

    +

    100

    +

    0

    +

    2-й запрос

    +

    100

    +

    100

    +

    Третий запрос

    +

    100

    +

    200

    +

    Пятый запрос

    +

    100

    +

    100 x (n-1)

    +
    +

    Обратите внимание, что сумма limit и offset в одном ANN-поиске должна быть меньше 16 384.

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={​
    +        "metric_type": "IP", ​
    +        # highlight-next-line​
    +        "offset": 10 # The records to skip​
    +    }​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .offset(10)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​
    +// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​
    +// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return,​
    +    // highlight-next-line​
    +    offset: 10 // The record to skip.​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "offset": 10​
    +}'​
    +
    +
    +

    Улучшение поиска с помощью ИНС

    AUTOINDEX значительно сглаживает кривую обучения при поиске с помощью ANN. Однако результаты поиска могут быть не всегда корректными по мере увеличения top-K. Уменьшив объем поиска, улучшив релевантность результатов поиска и разнообразив их, Milvus разработал следующие усовершенствования поиска.

    +
      +
    • Фильтрованный поиск

      +

      Вы можете включить условия фильтрации в поисковый запрос, чтобы Milvus выполнял фильтрацию метаданных перед проведением ANN-поиска, сокращая область поиска со всей коллекции до сущностей, соответствующих заданным условиям фильтрации.

      +

      Дополнительные сведения о фильтрации метаданных и условиях фильтрации см. в разделах Фильтрованный поиск и Фильтрация метаданных.

    • +
    • Поиск по диапазону

      +

      Вы можете улучшить релевантность результатов поиска, ограничив расстояние или оценку возвращаемых сущностей определенным диапазоном. В Milvus поиск по диапазону предполагает рисование двух концентрических окружностей, в центре которых находится векторное вложение, наиболее похожее на вектор запроса. В поисковом запросе указывается радиус обеих окружностей, и Milvus возвращает все векторные вкрапления, которые попадают во внешнюю окружность, но не во внутреннюю.

      +

      Подробнее о поиске по диапазону см. в разделе Поиск по диапазону.

    • +
    • Группировочный поиск

      +

      Если возвращаемые сущности имеют одинаковое значение в определенном поле, результаты поиска могут не отражать распределение всех векторных вкраплений в векторном пространстве. Чтобы разнообразить результаты поиска, воспользуйтесь группирующим поиском.

      +

      Подробнее о группирующем поиске см. в разделе Группирующий поиск.

    • +
    • Гибридный поиск

      +

      Коллекция может включать до четырех векторных полей для сохранения векторных вкраплений, созданных с помощью различных моделей вкраплений. При этом можно использовать гибридный поиск для ранжирования результатов поиска по этим векторным полям, что повышает коэффициент запоминания.

      +

      Подробнее о гибридном поиске см. в разделе Гибридный поиск.

    • +
    • Итератор поиска

      +

      Один поиск ANN возвращает максимум 16 384 сущности. Если вам нужно вернуть больше сущностей за один поиск, используйте итераторы поиска.

      +

      Подробнее об итераторах поиска см. в разделе Итератор поиска.

    • +
    • Полнотекстовый поиск

      +

      Полнотекстовый поиск - это функция поиска документов, содержащих определенные термины или фразы в текстовых наборах данных, с последующим ранжированием результатов на основе релевантности. Эта функция позволяет преодолеть ограничения семантического поиска, который может упускать из виду точные термины, обеспечивая получение наиболее точных и контекстуально релевантных результатов. Кроме того, она упрощает векторный поиск, принимая исходный текст, автоматически преобразуя текстовые данные в разреженные вкрапления без необходимости вручную генерировать векторные вкрапления.

      +

      Подробнее о полнотекстовом поиске см. в разделе Полнотекстовый поиск.

    • +
    • Совпадение текста

      +

      Функция сопоставления текста в Milvus позволяет точно находить документы по определенным терминам. Эта функция используется в основном для фильтрации поиска по определенным условиям и может включать скалярную фильтрацию для уточнения результатов запроса, позволяя искать сходство в векторах, удовлетворяющих скалярным критериям.

      +

      Подробные сведения о текстовом совпадении см. в разделе "Текстовое совпадение".

    • +
    • Использование ключа раздела

      +

      Вовлечение нескольких скалярных полей в фильтрацию метаданных и использование довольно сложных условий фильтрации может повлиять на эффективность поиска. Если задать скалярное поле в качестве ключа раздела и использовать в поисковом запросе условие фильтрации, включающее ключ раздела, это поможет ограничить область поиска разделами, соответствующими указанным значениям ключа раздела.

      +

      Подробнее о ключе раздела см. в разделе Использование ключа раздела.

    • +
    • Использовать mmap

      +

      В Milvus файлы с отображением памяти позволяют напрямую отображать содержимое файлов в память. Эта функция повышает эффективность использования памяти, особенно в ситуациях, когда доступной памяти мало, а полная загрузка данных невозможна. Этот механизм оптимизации может увеличить объем памяти, обеспечивая производительность до определенного предела; однако, когда объем данных слишком сильно превышает объем памяти, производительность поиска и запросов может серьезно снизиться, поэтому, пожалуйста, включите или выключите эту функцию в зависимости от ситуации.

      +

      Подробнее о настройках mmap см. в разделе Использование mmap.

    • +
    • Уплотнение кластеров

      +

      Кластерное уплотнение предназначено для повышения производительности поиска и снижения затрат в больших коллекциях. Это руководство поможет вам понять, что такое кластерное уплотнение и как эта функция может повысить производительность поиска.

      +

      Подробные сведения о кластерном уплотнении см. в разделе Кластерное уплотнение.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.json new file mode 100644 index 000000000..d42eebd46 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nschema = client.create_schema()​\n​\n# Add the partition key​\nschema.add_field(​\n field_name=\"my_varchar\", ​\n datatype=DataType.VARCHAR, ​\n max_length=512,​\n # highlight-next-line​\n is_partition_key=True,​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\n// Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// Add the partition key​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n // highlight-next-line​\n .isPartitionKey(true)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512,​\n // highlight-next-line​\n is_partition_key: true​\n }​\n]​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isPartitionKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next-line​\n num_partitions=1024​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n .numPartitions(1024)​\n .build();​\n client.createCollection(createCollectionReq);​\n\n","await client.create_collection({​\n collection_name: \"my_collection\",​\n schema: schema,​\n num_partitions: 1024​\n})​\n\n","export params='{​\n \"partitionsNum\": 1024​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"myCollection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# Filter based on a single partition key value, or​\nfilter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nfilter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","// Filter based on a single partition key value, or​\nString filter = \"partition_key == 'x' && \";​\n​\n// Filter based on multiple partition key values​\nString filter = \"partition_key in ['x', 'y', 'z'] && \";​\n\n","// Filter based on a single partition key value, or​\nconst filter = 'partition_key == \"x\" && '​\n​\n// Filter based on multiple partition key values​\nconst filter = 'partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","# Filter based on a single partition key value, or​\nexport filter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nexport filter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n"],"headingContent":"Use Partition Key​","anchorList":[{"label":"Использование Partition Key","href":"Use-Partition-Key​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Использование Partition Key","href":"Use-Partition-Key​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.md new file mode 100644 index 000000000..e6db088ce --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/use-partition-key.md @@ -0,0 +1,245 @@ +--- +id: use-partition-key.md +title: Использование ключа раздела +--- +

    Использование Partition Key

    Partition Key - это решение для оптимизации поиска на основе разделов. Назначив определенное скалярное поле в качестве ключа раздела и задав условия фильтрации на основе ключа раздела во время поиска, можно сузить область поиска до нескольких разделов, тем самым повысив эффективность поиска. В этой статье мы расскажем о том, как использовать ключ раздела, и о связанных с этим моментах.

    +

    Обзор

    В Milvus можно использовать разделы для разделения данных и повышения эффективности поиска, ограничивая область поиска определенными разделами. Если вы решили управлять разделами вручную, вы можете создать максимум 1024 раздела в коллекции и вставить сущности в эти разделы на основе определенного правила, чтобы сузить область поиска, ограничив поиск определенным количеством разделов.

    +

    Milvus представляет ключ раздела для повторного использования разделов при разделении данных, чтобы преодолеть ограничение на количество разделов, которые можно создать в коллекции. При создании коллекции в качестве ключа раздела можно использовать скалярное поле. Когда коллекция готова, Milvus создает указанное количество разделов внутри коллекции, причем каждый раздел соответствует диапазону значений в ключе раздела. Получив вставленные сущности, Milvus сохраняет их в разных разделах на основе значений ключа раздела.

    +

    + + Partition v.s. Partition Key + Раздел против ключа раздела

    +

    На следующем рисунке показано, как Milvus обрабатывает поисковые запросы в коллекции с включенной функцией Partition Key и без нее.

    +
      +
    • Если ключ раздела отключен, Milvus ищет в коллекции сущности, наиболее похожие на вектор запроса. Вы можете сузить область поиска, если знаете, какой раздел содержит наиболее релевантные результаты.

    • +
    • Если функция Partition Key включена, Milvus определяет область поиска на основе значения Partition Key, указанного в фильтре поиска, и сканирует только те сущности в разделах, которые совпадают.

    • +
    +

    + + With or Without Partition Key + С ключом раздела или без него

    +

    Использовать ключ раздела

    Чтобы использовать ключ раздела, вам необходимо

    +
      +
    • Задать ключ раздела.

    • +
    • задать количество создаваемых разделов (необязательно) и

    • +
    • создать условие фильтрации на основе ключа раздела.

    • +
    +

    Установка ключа раздела

    Чтобы назначить скалярное поле в качестве ключа раздела, необходимо установить его атрибут is_partition_key на true при добавлении скалярного поля.

    + +
    from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +schema = client.create_schema()​
    +​
    +# Add the partition key​
    +schema.add_field(​
    +    field_name="my_varchar", ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=512,​
    +    # highlight-next-line​
    +    is_partition_key=True,​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +// Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// Add the partition key​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        // highlight-next-line​
    +        .isPartitionKey(true)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512,​
    +        // highlight-next-line​
    +        is_partition_key: true​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isPartitionKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    Установка номеров разделов

    Когда вы назначаете скалярное поле в коллекции в качестве ключа раздела, Milvus автоматически создает 16 разделов в коллекции. Получив сущность, Milvus выбирает раздел на основе значения Partition Key этой сущности и сохраняет сущность в этом разделе, в результате чего некоторые или все разделы будут содержать сущности с разными значениями Partition Key.

    +

    Вы также можете определить количество разделов, которые нужно создать вместе с коллекцией. Это возможно только в том случае, если в качестве ключа раздела указано скалярное поле.

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_partitions=1024​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +                .collectionName("my_collection")​
    +                .collectionSchema(schema)​
    +                .numPartitions(1024)​
    +                .build();​
    +        client.createCollection(createCollectionReq);​
    +
    +
    +
    await client.create_collection({​
    +    collection_name: "my_collection",​
    +    schema: schema,​
    +    num_partitions: 1024​
    +})​
    +
    +
    +
    export params='{​
    +    "partitionsNum": 1024​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"myCollection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    Создание условия фильтрации

    При выполнении ANN-поиска в коллекции с включенной функцией Partition Key необходимо включить в запрос поиска выражение фильтрации, включающее Partition Key. В выражении фильтрации можно ограничить значение Partition Key определенным диапазоном, чтобы Milvus ограничил область поиска соответствующими разделами.

    +

    Следующие примеры демонстрируют фильтрацию на основе ключей разделов на основе конкретного значения ключа раздела и набора значений ключей разделов.

    + +
    # Filter based on a single partition key value, or​
    +filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +String filter = "partition_key == 'x' && <other conditions>";​
    +​
    +// Filter based on multiple partition key values​
    +String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +const filter = 'partition_key == "x" && <other conditions>'​
    +​
    +// Filter based on multiple partition key values​
    +const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    # Filter based on a single partition key value, or​
    +export filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +export filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.json b/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.json new file mode 100644 index 000000000..e2a3743b4 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create iterator​\nquery_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​\n​\ncollection = Collection(\"iterator_collection\")​\n​\niterator = collection.search_iterator(​\n data=query_vectors,​\n anns_field=\"vector\",​\n param={\"metric_type\": \"L2\", \"params\": {\"nprobe\": 16}},​\n # highlight-next-line​\n batch_size=50,​\n output_fields=[\"color\"],​\n # highlight-next-line​\n limit=20000​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.orm.iterator.SearchIterator;​\nimport io.milvus.v2.common.IndexParam.MetricType;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​\n .collectionName(\"iterator_collection\")​\n .vectors(Collections.singletonList(queryVector))​\n .vectorFieldName(\"vector\")​\n .batchSize(500L)​\n .outputFields(Lists.newArrayList(\"color\"))​\n .topK(20000)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","results = []​\n​\nwhile True:​\n # highlight-next-line​\n result = iterator.next()​\n if not result:​\n # highlight-next-line​\n iterator.close()​\n break​\n ​\n for hit in result:​\n results.append(hit.to_dict())​\n\n","import io.milvus.response.QueryResultsWrapper;​\n​\nwhile (true) {​\n List res = searchIterator.next();​\n if (res.isEmpty()) {​\n searchIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n\n"],"headingContent":"Search Iterator​","anchorList":[{"label":"Итератор поиска","href":"Search-Iterator​","type":1,"isActive":false},{"label":"Обзор","href":"Overview​","type":2,"isActive":false},{"label":"Создание SearchIterator","href":"Create-SearchIterator​","type":2,"isActive":false},{"label":"Использование SearchIterator","href":"Use-SearchIterator​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.md b/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.md new file mode 100644 index 000000000..2c1f6ae6e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/search-query-get/with-iterators.md @@ -0,0 +1,163 @@ +--- +id: with-iterators.md +order: 4 +summary: >- + Milvus предоставляет итераторы поиска и запросов для итерации результатов с + большим количеством сущностей. +title: С помощью итераторов +--- +

    Итератор поиска

    ANN Search имеет максимальное ограничение на количество сущностей, которые могут быть вызваны в одном запросе, и простое использование базового ANN Search может не удовлетворить требованиям крупномасштабного поиска. Для запросов ANN Search, в которых topK превышает 16 384, рекомендуется использовать SearchIterator. В этом разделе мы расскажем о том, как использовать SearchIterator, и о связанных с этим моментах.

    +

    Обзор

    Запрос Search возвращает результаты поиска, а SearchIterator возвращает итератор. Вы можете вызвать метод next() этого итератора, чтобы получить результаты поиска.

    +

    В частности, итераторы SearchIterator можно использовать следующим образом.

    +
      +
    1. Создайте SearchIterator и задайте количество сущностей, возвращаемых по одному поисковому запросу, и общее количество возвращаемых сущностей.

    2. +
    3. Вызовите метод next() итератора SearchIterator в цикле, чтобы получить результаты поиска в постраничном виде.

    4. +
    5. Вызовите метод close() итератора, чтобы завершить цикл, если метод next() возвращает пустой результат.

    6. +
    +

    Создание SearchIterator

    Следующий фрагмент кода демонстрирует, как создать SearchIterator.

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create iterator​
    +query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​
    +​
    +collection = Collection("iterator_collection")​
    +​
    +iterator = collection.search_iterator(​
    +    data=query_vectors,​
    +    anns_field="vector",​
    +    param={"metric_type": "L2", "params": {"nprobe": 16}},​
    +    # highlight-next-line
    +    batch_size=50,​
    +    output_fields=["color"],​
    +    # highlight-next-line
    +    limit=20000​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.orm.iterator.SearchIterator;​
    +import io.milvus.v2.common.IndexParam.MetricType;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​
    +        .collectionName("iterator_collection")​
    +        .vectors(Collections.singletonList(queryVector))​
    +        .vectorFieldName("vector")​
    +        .batchSize(500L)​
    +        .outputFields(Lists.newArrayList("color"))​
    +        .topK(20000)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +

    В приведенных выше примерах вы задали количество сущностей, возвращаемых за один поиск(batch_size/batchSize), равным 50, а общее количество возвращаемых сущностей(topK) - 20 000.

    +

    Использование SearchIterator

    Когда итератор SearchIterator готов, вы можете вызвать его метод next(), чтобы получить результаты поиска в постраничном виде.

    + +
    results = []​
    +​
    +while True:​
    +    # highlight-next-line​
    +    result = iterator.next()​
    +    if not result:​
    +        # highlight-next-line​
    +        iterator.close()​
    +        break​
    +    ​
    +    for hit in result:​
    +        results.append(hit.to_dict())​
    +
    +
    +
    import io.milvus.response.QueryResultsWrapper;​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = searchIterator.next();​
    +    if (res.isEmpty()) {​
    +        searchIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +
    +
    +

    В приведенных выше примерах кода вы создали бесконечный цикл, вызвали метод next() в цикле, чтобы сохранить результаты поиска в переменной, и закрыли итератор, когда next() ничего не вернул.

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.json b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.json new file mode 100644 index 000000000..4aebfd1ad --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo install github.com/milvus-io/birdwatcher\n","go run main.go\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo build -o birdwatcher main.go\n","./birdwatcher\n","wget -O birdwatcher.tar.gz \\\nhttps://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher__.tar.gz\n","tar -xvzf birdwatcher.tar.gz\n./birdwatcher\n","apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: birdwatcher\nspec:\n selector:\n matchLabels:\n app: birdwatcher\n template:\n metadata:\n labels:\n app: birdwatcher\n spec:\n containers:\n - name: birdwatcher\n image: milvusdb/birdwatcher\n resources:\n limits:\n memory: \"128Mi\"\n cpu: \"500m\"\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ndocker build -t milvusdb/birdwatcher .\n","...\n - name: birdwatcher\n image: milvusdb/birdwatcher\n imagePullPolicy: Never\n...\n","kubectl apply -f deployment.yml\n"],"headingContent":"Install Birdwatcher","anchorList":[{"label":"Установите Birdwatcher","href":"Install-Birdwatcher","type":1,"isActive":false},{"label":"Локальная установка","href":"Local-install","type":2,"isActive":false},{"label":"Установка в качестве капсулы Kubernetes","href":"Install-as-a-Kubernetes-pod","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.md b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.md new file mode 100644 index 000000000..a6466250e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_install_guides.md @@ -0,0 +1,118 @@ +--- +id: birdwatcher_install_guides.md +summary: 'Узнайте, как установить Birdwatch для отладки Milvus.' +title: Установите Birdwatcher +--- +

    Установите Birdwatcher

    На этой странице показано, как установить Birdwatcher.

    +

    Локальная установка

    Если вы установили Milvus Standalone с помощью docker, вам лучше скачать и установить собранный бинарник, установить Birdwatcher как обычный модуль Go или собрать Birdwatcher из исходников.

    +
      +
    • Установите его как обычный модуль Go.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go install github.com/milvus-io/birdwatcher
      +
      +

      Затем вы можете запустить Birdwatcher следующим образом:

      +
      go run main.go
      +
    • +
    • Соберите его из исходников.

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go build -o birdwatcher main.go
      +
      +

      Затем вы можете запустить Birdwatcher следующим образом:

      +
      ./birdwatcher
      +
    • +
    • Загрузить уже собранный бинарник.

      +

      Сначала откройте страницу последнего релиза и найдите готовые двоичные файлы.

      +
      wget -O birdwatcher.tar.gz \
      +https://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher_<os>_<arch>.tar.gz
      +
      +

      Затем вы можете распаковать tarball и использовать Birdwatcher следующим образом:

      +
      tar -xvzf birdwatcher.tar.gz
      +./birdwatcher
      +
    • +
    +

    Установка в качестве капсулы Kubernetes

    Если вы установили либо Milvus Standalone с помощью диаграмм Helm или Milvus Operator, либо Milvus Cluster с помощью диаграмм Helm или Milvus Operator, вам рекомендуется установить Birdwatcher в качестве капсулы Kubernetes.

    +

    Подготовьте deployment.yml

    apiVersion: apps/v1
    +kind: Deployment
    +metadata:
    +  name: birdwatcher
    +spec:
    +  selector:
    +    matchLabels:
    +      app: birdwatcher
    +  template:
    +    metadata:
    +      labels:
    +        app: birdwatcher
    +    spec:
    +      containers:
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        resources:
    +          limits:
    +            memory: "128Mi"
    +            cpu: "500m"
    +
    +
    +

    Если образ, доступный на DockerHub, не является последним, вы можете собрать образ Birdwatcher с помощью Dockerfile, поставляемого вместе с исходным кодом, как показано ниже:

    +
    git clone https://github.com/milvus-io/birdwatcher.git
    +cd birdwatcher
    +docker build -t milvusdb/birdwatcher .
    +
    +

    Чтобы развернуть локально собранный образ, нужно добавить imagePullPolicy в вышеуказанные спецификации и установить его на Never.

    +
    ...
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        imagePullPolicy: Never
    +...
    +
    +
    +

    Применить deployment.yml

    Сохраните приведенный выше YAML в файле и назовите его deployment.yml, а затем выполните следующую команду

    +
    kubectl apply -f deployment.yml
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.json b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.json new file mode 100644 index 000000000..905a772c2 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Birdwatcher","anchorList":[{"label":"Birdwatcher","href":"Birdwatcher","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisite","type":2,"isActive":false},{"label":"Архитектура","href":"Architecture","type":2,"isActive":false},{"label":"Последний релиз","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.md b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.md new file mode 100644 index 000000000..48b95ff2c --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_overview.md @@ -0,0 +1,77 @@ +--- +id: birdwatcher_overview.md +summary: >- + Birdwatcher - это отладочный инструмент для Milvus 2.x. Он подключается к etcd + и проверяет состояние системы Milvus. +title: Birdwatcher +--- +

    Birdwatcher

    Milvus - это векторная база данных без состояния, в которой чтение и запись разделены, а etcd играет роль единого источника состояния. Все координаторы должны запрашивать состояние из etcd, прежде чем вносить в него какие-либо изменения. Когда пользователям нужно проверить или очистить состояние, им нужен инструмент для взаимодействия с etcd. Именно здесь на сцену выходит Birdwatcher.

    +

    Birdwatcher - это отладочный инструмент для Milvus. Используя его для подключения к etcd, вы можете проверять состояние системы Milvus или настраивать ее на лету.

    +

    Необходимые условия

    +

    Архитектура

    + + Birdwatcher architecture + Архитектура Birdwatcher

    +

    Последний релиз

    Релиз v1.0.2

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.json b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.json new file mode 100644 index 000000000..e022c6e96 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.json @@ -0,0 +1 @@ +{"codeList":["./birdwatcher\n","Offline >\n","Offline > connect\nMilvus(by-dev) >\n","kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'\n","kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh\n","Offline > connect --etcd ${ETCD_IP_ADDR}:2379\nMilvus(by-dev)\n","Offline > connect --rootPath my-release\nMilvus(my-release) >\n","Offline > connect --dry\nusing dry mode, ignore rootPath and metaPath\nEtcd(127.0.0.1:2379) > find-milvus\n1 candidates found:\nmy-release\nEtcd(127.0.0.1:2379) > use my-release\nMilvus(my-release) >\n","Milvus(my-release) > show -h\nUsage:\n show [command]\n\nAvailable Commands:\n alias list alias meta info\n channel-watch display channel watching info from data coord meta store\n checkpoint list checkpoint collection vchannels\n collection-history display collection change history\n collection-loaded display information of loaded collection from querycoord\n collections list current available collection from RootCoord\n config-etcd list configuations set by etcd source\n configurations iterate all online components and inspect configuration\n current-version \n database display Database info from rootcoord meta\n index \n partition list partitions of provided collection\n querycoord-channel display querynode information from querycoord cluster\n querycoord-cluster display querynode information from querycoord cluster\n querycoord-task display task information from querycoord\n replica list current replica information from QueryCoord\n segment display segment information from data coord meta store\n segment-index display segment index information\n segment-loaded display segment information from querycoordv1 meta\n segment-loaded-grpc list segments loaded information\n session list online milvus components\n\nFlags:\n -h, --help help for show\n\nUse \" show [command] --help\" for more information about a command.\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n","Milvus(by-dev) > show database\n=============================\nID: 1 Name: default\nTenantID: State: DatabaseCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show collections\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n--- Total collections: 1 Matched collections: 1\n--- Total channel: 1 Healthy collections: 1\n================================================================================\n","Milvus(by-dev) > show collection-history --id 443407225551410746\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n","Milvus(by-dev) > show collection-loaded\nVersion: [>= 2.2.0] CollectionID: 443407225551410746\nReplicaNumber: 1 LoadStatus: Loaded\n--- Collections Loaded: 1\n","Milvus(by-dev) > show checkpoint --collection 443407225551410746\nvchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint\n","Milvus(by-dev) > show index\n*************2.1.x***************\n*************2.2.x***************\n==================================================================\nIndex ID: 443407225551410801 Index Name: _default_idx_102 CollectionID:443407225551410746\nCreate Time: 2023-08-08 09:27:19.139 +0000 Deleted: false\nIndex Type: HNSW Metric Type: L2\nIndex Params: \n==================================================================\n","Milvus(by-dev) > show partition --collection 443407225551410746\nParition ID: 443407225551410747 Name: _default State: PartitionCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show channel-watch\n=============================\nkey: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0\nChannel Name:by-dev-rootcoord-dml_0_443407225551410746v0 WatchState: WatchSuccess\nChannel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000\nStart Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000\nUnflushed segments: []\nFlushed segments: []\nDropped segments: []\n--- Total Channels: 1\n","Milvus(by-dev) > show replica\n================================================================================\nReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0\nAll Nodes:[2]\n","SegmentID: 443407225551610865 State: Flushed, Row Count:5979\n--- Growing: 0, Sealed: 0, Flushed: 1\n--- Total Segments: 1, row count: 5979\n","Milvus(by-dev) > show segment-loaded-grpc\n===========\nServerID 2\nChannel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937\nLeader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0\nGrowing segments number: 0 , ids: []\nSegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0\nSealed segments number: 1 \n","Milvus(by-dev) > show configurations\nclient nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nComponent rootcoord-1\nrootcoord.importtaskexpiration: 900\nrootcoord.enableactivestandby: false\nrootcoord.importtaskretention: 86400\nrootcoord.maxpartitionnum: 4096\nrootcoord.dmlchannelnum: 16\nrootcoord.minsegmentsizetoenableindex: 1024\nrootcoord.port: 53100\nrootcoord.address: localhost\nrootcoord.maxdatabasenum: 64\nComponent datacoord-3\n...\nquerynode.gracefulstoptimeout: 30\nquerynode.cache.enabled: true\nquerynode.cache.memorylimit: 2147483648\nquerynode.scheduler.maxreadconcurrentratio: 2\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n\nMilvus(by-dev) > visit querycoord 7\nQueryCoord-7(10.244.0.8:19531) > configuration\nKey: querycoord.enableactivestandby, Value: false\nKey: querycoord.channeltasktimeout, Value: 60000\nKey: querycoord.overloadedmemorythresholdpercentage, Value: 90\nKey: querycoord.distpullinterval, Value: 500\nKey: querycoord.checkinterval, Value: 10000\nKey: querycoord.checkhandoffinterval, Value: 5000\nKey: querycoord.taskexecutioncap, Value: 256\nKey: querycoord.taskmergecap, Value: 8\nKey: querycoord.autohandoff, Value: true\nKey: querycoord.address, Value: localhost\nKey: querycoord.port, Value: 19531\nKey: querycoord.memoryusagemaxdifferencepercentage, Value: 30\nKey: querycoord.refreshtargetsintervalseconds, Value: 300\nKey: querycoord.balanceintervalseconds, Value: 60\nKey: querycoord.loadtimeoutseconds, Value: 1800\nKey: querycoord.globalrowcountfactor, Value: 0.1\nKey: querycoord.scoreunbalancetolerationfactor, Value: 0.05\nKey: querycoord.reverseunbalancetolerationfactor, Value: 1.3\nKey: querycoord.balancer, Value: ScoreBasedBalancer\nKey: querycoord.autobalance, Value: true\nKey: querycoord.segmenttasktimeout, Value: 120000\n","Milvus(my-release) > backup\nBacking up ... 100%(2452/2451)\nbackup etcd for prefix done\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nbackup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz\n","Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747\nPK 110 found on segment 442844725212299830\nField id, value: &{long_data: }\nField title, value: &{string_data: }\nField title_vector, value: &{dim:768 float_vector: }\nField article_meta, value: &{json_data: }\n","Milvus(by-dev) > probe query\nprobing collection 442682158191982314\nFound vector field vector(103) with dim[384], indexID: 442682158191990455\nfailed to generated mock request probing index type IVF_FLAT not supported yet\nprobing collection 442844725212086932\nFound vector field title_vector(102) with dim[768], indexID: 442844725212086936\nShard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.\nprobing collection 442844725212299747\nFound vector field title_vector(102) with dim[768], indexID: 442844725212299751\nShard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.\nprobing collection 443294505839900248\nFound vector field vector(101) with dim[256], indexID: 443294505839900251\nShard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.\n"],"headingContent":"Use Birdwatcher","anchorList":[{"label":"Использование Birdwatcher","href":"Use-Birdwatcher","type":1,"isActive":false},{"label":"Запуск Birdwatcher","href":"Start-Birdwatcher","type":2,"isActive":false},{"label":"Подключиться к etcd","href":"Connect-to-etcd","type":2,"isActive":false},{"label":"Проверить состояние Milvus","href":"Check-Milvus-status","type":2,"isActive":false},{"label":"Резервное копирование метрик","href":"Backup-metrics","type":2,"isActive":false},{"label":"Зондировать коллекции","href":"Probe-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.md b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.md new file mode 100644 index 000000000..61ba434ac --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/birdwatcher_usage_guides.md @@ -0,0 +1,406 @@ +--- +id: birdwatcher_usage_guides.md +summary: 'Узнайте, как использовать Birdwatch для отладки Milvus.' +title: Использование Birdwatcher +--- +

    Использование Birdwatcher

    В этом руководстве вы узнаете, как использовать Birdwatcher для проверки состояния вашего Milvus и его настройки на лету.

    +

    Запуск Birdwatcher

    Birdwatcher - это инструмент командной строки, запустить его можно следующим образом:

    +
    ./birdwatcher
    +
    +

    После этого вас встретит следующее приглашение:

    +
    Offline >
    +
    +

    Подключиться к etcd

    Перед началом любых других операций необходимо использовать Birdwatcher для подключения к etcd.

    +
      +
    • Подключение с настройками по умолчанию

      +
      Offline > connect
      +Milvus(by-dev) >
      +
    • +
    • Подключение из Birdwatcher в капсуле

      +

      Если вы решили запустить Birdwatcher в стручке Kubernetes, вам нужно сначала получить IP-адрес etcd следующим образом:

      +
      kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'
      +
      +

      Затем получить доступ к оболочке стручка.

      +
      kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh
      +
      +

      Наконец, используйте полученный IP-адрес для подключения к etcd следующим образом:

      +
      Offline > connect --etcd ${ETCD_IP_ADDR}:2379
      +Milvus(by-dev)
      +
    • +
    • Подключение с другим корневым путем

      +

      Если корневой путь вашего Milvus отличается от by-dev и вы получаете сообщение об ошибке, сообщающей о неправильном корневом пути, вы можете подключиться к etcd следующим образом:

      +
      Offline > connect --rootPath my-release
      +Milvus(my-release) >
      +
      +

      Если вы не знаете корневой путь вашего Milvus, подключитесь к etcd следующим образом:

      +
      Offline > connect --dry
      +using dry mode, ignore rootPath and metaPath
      +Etcd(127.0.0.1:2379) > find-milvus
      +1 candidates found:
      +my-release
      +Etcd(127.0.0.1:2379) > use my-release
      +Milvus(my-release) >
      +
    • +
    +

    Проверить состояние Milvus

    Для проверки состояния Milvus можно использовать команды show.

    +
    Milvus(my-release) > show -h
    +Usage:
    +   show [command]
    +
    +Available Commands:
    +  alias               list alias meta info
    +  channel-watch       display channel watching info from data coord meta store
    +  checkpoint          list checkpoint collection vchannels
    +  collection-history  display collection change history
    +  collection-loaded   display information of loaded collection from querycoord
    +  collections         list current available collection from RootCoord
    +  config-etcd         list configuations set by etcd source
    +  configurations      iterate all online components and inspect configuration
    +  current-version     
    +  database            display Database info from rootcoord meta
    +  index               
    +  partition           list partitions of provided collection
    +  querycoord-channel  display querynode information from querycoord cluster
    +  querycoord-cluster  display querynode information from querycoord cluster
    +  querycoord-task     display task information from querycoord
    +  replica             list current replica information from QueryCoord
    +  segment             display segment information from data coord meta store
    +  segment-index       display segment index information
    +  segment-loaded      display segment information from querycoordv1 meta
    +  segment-loaded-grpc list segments loaded information
    +  session             list online milvus components
    +
    +Flags:
    +  -h, --help   help for show
    +
    +Use " show [command] --help" for more information about a command.
    +
    +

    Список сессий

    Чтобы перечислить сессии, связанные с различными компонентами Milvus:

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +

    В выводе команды каждая запись сеанса, перечисленная show session, соответствует узлу или службе, которые в настоящее время активны и зарегистрированы в etcd.

    +

    Проверка баз данных и коллекций

    Вы можете перечислить все базы данных и коллекции.

    +
      +
    • Список баз данных

      +

      В выводе команды вы можете найти информацию о каждой базе данных.

      +
      Milvus(by-dev) > show database
      +=============================
      +ID: 1   Name: default
      +TenantID:        State: DatabaseCreated
      +--- Total Database(s): 1
      +
    • +
    • Список коллекций

      +

      В выводе команды можно найти подробную информацию о каждой коллекции.

      +
      Milvus(by-dev) > show collections
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +--- Total collections:  1        Matched collections:  1
      +--- Total channel: 1     Healthy collections: 1
      +================================================================================
      +
    • +
    • Просмотр конкретной коллекции

      +

      Вы можете просмотреть конкретную коллекцию, указав ее ID.

      +
      Milvus(by-dev) > show collection-history --id 443407225551410746
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +
    • +
    • Просмотреть все загруженные коллекции

      +

      Вы можете заставить Birdwatcher отфильтровать все загруженные коллекции.

      +
      Milvus(by-dev) > show collection-loaded
      +Version: [>= 2.2.0]     CollectionID: 443407225551410746
      +ReplicaNumber: 1        LoadStatus: Loaded
      +--- Collections Loaded: 1
      +
    • +
    • Список всех контрольных точек канала коллекции

      +

      Вы можете заставить Birdwatcher перечислить все контрольные точки определенной коллекции.

      +
      Milvus(by-dev) > show checkpoint --collection 443407225551410746
      +vchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint
      +
    • +
    +

    Проверка сведений об индексе

    Выполните следующую команду, чтобы получить подробный список всех индексных файлов.

    +
    Milvus(by-dev) > show index
    +*************2.1.x***************
    +*************2.2.x***************
    +==================================================================
    +Index ID: 443407225551410801    Index Name: _default_idx_102    CollectionID:443407225551410746
    +Create Time: 2023-08-08 09:27:19.139 +0000      Deleted: false
    +Index Type: HNSW        Metric Type: L2
    +Index Params: 
    +==================================================================
    +
    +

    Список разделов

    Выполните следующую команду, чтобы перечислить все разделы в определенной коллекции.

    +
    Milvus(by-dev) > show partition --collection 443407225551410746
    +Parition ID: 443407225551410747 Name: _default  State: PartitionCreated
    +--- Total Database(s): 1
    +
    +

    Проверить состояние канала

    Выполните следующую команду, чтобы просмотреть состояние канала.

    +
    Milvus(by-dev) > show channel-watch
    +=============================
    +key: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0
    +Channel Name:by-dev-rootcoord-dml_0_443407225551410746v0         WatchState: WatchSuccess
    +Channel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000
    +Start Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000
    +Unflushed segments: []
    +Flushed segments: []
    +Dropped segments: []
    +--- Total Channels: 1
    +
    +

    Список всех реплик и сегментов

      +
    • Список всех реплик

      +

      Выполните следующую команду, чтобы перечислить все реплики и соответствующие им коллекции.

      +
      Milvus(by-dev) > show replica
      +================================================================================
      +ReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0
      +All Nodes:[2]
      +
    • +
    • Список всех сегментов

      +

      Выполните следующую команду, чтобы перечислить все сегменты и их состояние.

      +
      SegmentID: 443407225551610865 State: Flushed, Row Count:5979
      +--- Growing: 0, Sealed: 0, Flushed: 1
      +--- Total Segments: 1, row count: 5979
      +
      +

      Выполните следующую команду, чтобы получить подробный список всех загруженных сегментов. Для Milvus 2.1.x вместо этого используйте show segment-loaded.

      +
      Milvus(by-dev) > show segment-loaded-grpc
      +===========
      +ServerID 2
      +Channel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937
      +Leader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Growing segments number: 0 , ids: []
      +SegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Sealed segments number: 1    
      +
    • +
    +

    Список конфигураций

    Вы можете попросить Birdwatcher вывести список текущих конфигураций каждого компонента Milvus.

    +
    Milvus(by-dev) > show configurations
    +client nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Component rootcoord-1
    +rootcoord.importtaskexpiration: 900
    +rootcoord.enableactivestandby: false
    +rootcoord.importtaskretention: 86400
    +rootcoord.maxpartitionnum: 4096
    +rootcoord.dmlchannelnum: 16
    +rootcoord.minsegmentsizetoenableindex: 1024
    +rootcoord.port: 53100
    +rootcoord.address: localhost
    +rootcoord.maxdatabasenum: 64
    +Component datacoord-3
    +...
    +querynode.gracefulstoptimeout: 30
    +querynode.cache.enabled: true
    +querynode.cache.memorylimit: 2147483648
    +querynode.scheduler.maxreadconcurrentratio: 2
    +
    +

    В качестве альтернативы вы можете посетить каждый компонент Milvus, чтобы найти его конфигурацию. Ниже показано, как вывести список конфигурации QueryCoord с идентификатором 7.

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +Milvus(by-dev) > visit querycoord 7
    +QueryCoord-7(10.244.0.8:19531) > configuration
    +Key: querycoord.enableactivestandby, Value: false
    +Key: querycoord.channeltasktimeout, Value: 60000
    +Key: querycoord.overloadedmemorythresholdpercentage, Value: 90
    +Key: querycoord.distpullinterval, Value: 500
    +Key: querycoord.checkinterval, Value: 10000
    +Key: querycoord.checkhandoffinterval, Value: 5000
    +Key: querycoord.taskexecutioncap, Value: 256
    +Key: querycoord.taskmergecap, Value: 8
    +Key: querycoord.autohandoff, Value: true
    +Key: querycoord.address, Value: localhost
    +Key: querycoord.port, Value: 19531
    +Key: querycoord.memoryusagemaxdifferencepercentage, Value: 30
    +Key: querycoord.refreshtargetsintervalseconds, Value: 300
    +Key: querycoord.balanceintervalseconds, Value: 60
    +Key: querycoord.loadtimeoutseconds, Value: 1800
    +Key: querycoord.globalrowcountfactor, Value: 0.1
    +Key: querycoord.scoreunbalancetolerationfactor, Value: 0.05
    +Key: querycoord.reverseunbalancetolerationfactor, Value: 1.3
    +Key: querycoord.balancer, Value: ScoreBasedBalancer
    +Key: querycoord.autobalance, Value: true
    +Key: querycoord.segmenttasktimeout, Value: 120000
    +
    +

    Резервное копирование метрик

    Вы можете попросить Birdwatcher создать резервную копию метрик всех компонентов.

    +
    Milvus(my-release) > backup
    +Backing up ... 100%(2452/2451)
    +backup etcd for prefix  done
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +backup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz
    +
    +

    Затем вы можете проверить файл в директории, где вы запускаете Birdwatcher.

    +

    Зондировать коллекции

    Вы можете попросить Birdwatcher проверить состояние загруженных коллекций с указанными первичными ключами или имитационными запросами.

    +

    Зондирование коллекции с известным первичным ключом

    В команде probe необходимо указать первичный ключ, используя флаг pk, и идентификатор коллекции, используя флаг collection.

    +
    Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747
    +PK 110 found on segment 442844725212299830
    +Field id, value: &{long_data:<data:110 > }
    +Field title, value: &{string_data:<data:"Human Resources Datafication" > }
    +Field title_vector, value: &{dim:768 float_vector:<data:0.022454707 data:0.007861045 data:0.0063843643 data:0.024065714 data:0.013782166 data:0.018483251 data:-0.026526336 ... data:-0.06579628 data:0.00033906146 data:0.030992996 data:-0.028134001 data:-0.01311325 data:0.012471594 > }
    +Field article_meta, value: &{json_data:<data:"{\"link\":\"https:\\/\\/towardsdatascience.com\\/human-resources-datafication-d44c8f7cb365\",\"reading_time\":6,\"publication\":\"Towards Data Science\",\"claps\":256,\"responses\":0}" > }
    +
    +

    Проверка всех коллекций с помощью имитационных запросов

    Вы также можете попросить Birdwatcher исследовать все коллекции с помощью имитационных запросов.

    +
    Milvus(by-dev) > probe query
    +probing collection 442682158191982314
    +Found vector field vector(103) with dim[384], indexID: 442682158191990455
    +failed to generated mock request probing index type IVF_FLAT not supported yet
    +probing collection 442844725212086932
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212086936
    +Shard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.
    +probing collection 442844725212299747
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212299751
    +Shard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.
    +probing collection 443294505839900248
    +Found vector field vector(101) with dim[256], indexID: 443294505839900251
    +Shard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.json b/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.json new file mode 100644 index 000000000..14880754b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.json @@ -0,0 +1 @@ +{"codeList":["clear\n","connect [-uri (text)] [-t (text)]\n","milvus_cli > connect -uri http://127.0.0.1:19530\n","create database -db (text)\n","milvus_cli > create database -db testdb\n","use database -db (text)\n","milvus_cli > use database -db testdb\n","list databases\n","milvus_cli > list databases\n","delete database -db (text)\n","milvus_cli > delete database -db testdb\n","create user -u (text) -p (text)\n","milvus_cli > create user -u zilliz -p zilliz\n","create role -r (text)\n","milvus_cli > create role -r role1\n","create alias -c (text) -a (text) [-A]\n","milvus_cli > create alias -c car -a carAlias1\n","milvus_cli > create alias -c car2 -A -a carAlias1\n","create collection -c (text) -f (text) -p (text) [-a] [-d (text)]\n","## For array field: --schema-field support :::(:if Varchar)\n\nmilvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'\n","create partition -c (text) -p (text) [-d (text)]\n","milvus_cli > create partition -c car -p new_partition -d test_add_partition\n","create index\n","milvus_cli > create index\n\nCollection name (car, car2): car2\n\nThe name of the field to create an index for (vector): vector\n\nIndex name: vectorIndex\n\n# Default is ''\nIndex type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT\n\n# Default is ''\nIndex metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:\n\nTimeout []:\n","delete user -u (text)\n","milvus_cli > delete user -u zilliz\n","delete role -r (text)\n","milvus_cli > delete role -r role1\n","delete alias -a (text)\n","delete collection -c (text)\n","milvus_cli > delete collection -c car\n","delete entities -c (text) -p (text)\n","milvus_cli > delete entities -c car\n\nThe expression to specify entities to be deleted, such as \"film_id in [ 0, 1 ]\": film_id in [ 0, 1 ]\n\nYou are trying to delete the entities of collection. This action cannot be undone!\n\nDo you want to continue? [y/N]: y\n","delete partition -c (text) -p (text)\n","milvus_cli > delete partition -c car -p new_partition\n","delete index -c (text) -in (text)\n","milvus_cli > delete index -c car -in indexName\n","grant role -r role1 -u user1\n","grant privilege\n","grant role -r role1 -u user1\n","revoke privilege\n","show collection -c (text)\n","milvus_cli > show collection -c test_collection_insert\n","show partition -c (text) -p (text)\n","milvus_cli > show partition -c test_collection_insert -p _default\n","show index -c (text) -in (text)\n","milvus_cli > show index -c test_collection -in index_name\n","exit\n","help \n","import -c (text)[-p (text)] \n","milvus_cli > import -c car 'examples/import_csv/vectors.csv'\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-\nio/milvus_cli/main/examples/import_csv/vectors.csv'\n\nReading file from remote URL.\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","list users\n","list roles\n","milvus_cli > list roles\n","milvus_cli > list grants -r role1 -o object1 -t Collection\n","list collections\n","list indexes -c (text)\n","list partitions -c (text)\n","load -c (text) [-p (text)]\n","query\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id in [ 428960801420883491, 428960801420883492,\n428960801420883493 ]\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: color, brand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id > 428960801420883491\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: id, color,\nbrand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","release -c (text) [-p (text)]\n","search\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file\nout headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):\n [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, car2): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []:\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []:\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","list connections\n","show index_progress -c (text) [-i (text)]\n","show loading_progress -c (text) [-p (text)]\n","version\n","$ milvus_cli --version\nMilvus_CLI v0.4.0\n"],"headingContent":"Milvus_CLI Command Reference","anchorList":[{"label":"Справочник команд Milvus_CLI","href":"MilvusCLI-Command-Reference","type":1,"isActive":false},{"label":"очистить","href":"clear","type":2,"isActive":false},{"label":"подключиться","href":"connect","type":2,"isActive":false},{"label":"создать базу данных","href":"create-Database","type":2,"isActive":false},{"label":"использовать базу данных","href":"use-Database","type":2,"isActive":false},{"label":"список баз данных","href":"list-Databases","type":2,"isActive":false},{"label":"удалить базу данных","href":"delete-Database","type":2,"isActive":false},{"label":"создать пользователя","href":"create-user","type":2,"isActive":false},{"label":"создать роль","href":"create-role","type":2,"isActive":false},{"label":"создать псевдоним","href":"create-alias","type":2,"isActive":false},{"label":"создать коллекцию","href":"create-collection","type":2,"isActive":false},{"label":"создать раздел","href":"create-partition","type":2,"isActive":false},{"label":"создать индекс","href":"create-index","type":2,"isActive":false},{"label":"удалить пользователя","href":"delete-user","type":2,"isActive":false},{"label":"удалить роль","href":"delete-role","type":2,"isActive":false},{"label":"удалить псевдоним","href":"delete-alias","type":2,"isActive":false},{"label":"удалить коллекцию","href":"delete-collection","type":2,"isActive":false},{"label":"удалить сущности","href":"delete-entities","type":2,"isActive":false},{"label":"удалить раздел","href":"delete-partition","type":2,"isActive":false},{"label":"удалить индекс","href":"delete-index","type":2,"isActive":false},{"label":"предоставить роль","href":"grant-role","type":2,"isActive":false},{"label":"присвоить привилегию","href":"grant-privilege","type":2,"isActive":false},{"label":"отозвать роль","href":"revoke-role","type":2,"isActive":false},{"label":"отменить привилегию","href":"revoke-privilege","type":2,"isActive":false},{"label":"показать коллекцию","href":"show-collection","type":2,"isActive":false},{"label":"показать раздел","href":"show-partition","type":2,"isActive":false},{"label":"показать индекс","href":"show-index","type":2,"isActive":false},{"label":"exit","href":"exit","type":2,"isActive":false},{"label":"help","href":"help","type":2,"isActive":false},{"label":"импорт","href":"import","type":2,"isActive":false},{"label":"список пользователей","href":"list-users","type":2,"isActive":false},{"label":"Список ролей","href":"List-roles","type":2,"isActive":false},{"label":"Перечислить гранты","href":"List-grants","type":2,"isActive":false},{"label":"список коллекций","href":"list-collections","type":2,"isActive":false},{"label":"список индексов","href":"list-indexes","type":2,"isActive":false},{"label":"список разделов","href":"list-partitions","type":2,"isActive":false},{"label":"загрузить","href":"load","type":2,"isActive":false},{"label":"запрос","href":"query","type":2,"isActive":false},{"label":"освободить","href":"release","type":2,"isActive":false},{"label":"search","href":"search","type":2,"isActive":false},{"label":"список соединений","href":"list-connection","type":2,"isActive":false},{"label":"show index_progress","href":"show-indexprogress","type":2,"isActive":false},{"label":"show loading_progress","href":"show-loadingprogress","type":2,"isActive":false},{"label":"версия","href":"version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.md b/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.md new file mode 100644 index 000000000..61fb22bf4 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/cli_commands.md @@ -0,0 +1,1530 @@ +--- +id: cli_commands.md +summary: Взаимодействуйте с Милвусом с помощью команд. +title: Справочник команд Milvus_CLI +--- +

    Справочник команд Milvus_CLI

    Milvus Command-Line Interface (CLI) - это инструмент командной строки, который поддерживает подключение к базе данных, операции с данными, а также импорт и экспорт данных.

    +

    В этой теме представлены все поддерживаемые команды и соответствующие опции. Некоторые примеры также включены для справки.

    +

    очистить

    Очищает экран.

    +

    Синтаксис

    +
    clear
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    подключиться

    Подключение к Milvus.

    +

    Синтаксис

    +
    connect [-uri (text)] [-t (text)]
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -uri-uri(Необязательно) Имя uri. По умолчанию - "http://127.0.0.1:19530".
    -t-token(Необязательно) apikey облака zilliz или username:password. По умолчанию - None.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > connect -uri http://127.0.0.1:19530
    +
    +

    создать базу данных

    Создание базы данных в Milvus

    +

    Синтаксис

    +
    create database -db (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -db-database[Требуется] Имя базы данных в milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    Пример 1

    В следующем примере создается база данных testdb в milvus.

    +
    milvus_cli > create database -db testdb
    +
    +

    использовать базу данных

    Использовать базу данных в Milvus

    +

    Синтаксис

    +
    use database -db (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -db-database[Требуется] Имя базы данных в milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    Пример 1

    В следующем примере используется база данных testdb в milvus.

    +
    milvus_cli > use database -db testdb
    +
    +

    список баз данных

    Список баз данных в Milvus

    +

    Синтаксис

    +
    list databases
    +
    +

    Примеры

    Пример 1

    В следующем примере перечислены базы данных в Milvus.

    +
    milvus_cli > list databases
    +
    +

    удалить базу данных

    Удалить базу данных в Milvus

    +

    Синтаксис

    +
    delete database -db (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -db-database[Требуется] Имя базы данных в milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    Пример 1

    В следующем примере удаляется база данных testdb в milvus.

    +
    milvus_cli > delete database -db testdb
    +
    +

    создать пользователя

    Создание пользователя в Milvus

    +

    Синтаксис

    +
    create user -u (text) -p (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -p-парольПароль пользователя в формате milvus. По умолчанию используется значение "None".
    -u-usernameИмя пользователя в milvus. По умолчанию - "Нет".
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    Пример 1

    В следующем примере создается пользователь zilliz и пароль zilliz в milvus.

    +
    milvus_cli > create user -u zilliz -p zilliz
    +
    +

    создать роль

    Создание роли в Milvus

    +

    Синтаксис

    +
    create role -r (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -r-roleNameИмя роли milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    Пример 1

    В следующем примере создается роль role1 в milvus.

    +
    milvus_cli > create role -r role1
    +
    +

    создать псевдоним

    Задает уникальные псевдонимы для коллекции.

    +
    Коллекция может иметь несколько псевдонимов. Однако псевдоним соответствует максимум одной коллекции.
    +

    Синтаксис

    +
    create alias -c (text) -a (text) [-A]
    +
    +

    Параметры

    + + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -a-alias-nameПсевдоним.
    -A-alter(Необязательно) Флаг для передачи псевдонима в указанную коллекцию.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    +

    Пример 1

    +

    В следующем примере создаются псевдонимы carAlias1 и carAlias2 для коллекции car.

    +
    milvus_cli > create alias -c car -a carAlias1
    +
    +

    Пример 2

    +
    Пример 2 основан на примере 1.
    +

    В следующем примере псевдоним carAlias1 переносится из коллекции car в коллекцию car2.

    +
    milvus_cli > create alias -c car2 -A -a carAlias1
    +
    +

    создать коллекцию

    Создает коллекцию.

    +

    Синтаксис

    +
    create collection -c (text) -f (text) -p (text) [-a] [-d (text)]
    +
    +

    Опции

    + + + + + + + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -f-schema-field(Множество) Схема поля в формате <fieldName>:<dataType>:<dimOfVector/desc>.
    -p-schema-primary-fieldИмя поля первичного ключа.
    -a-schema-auto-id(Необязательно) Флаг для автоматической генерации идентификаторов.
    -desc-schema-description(Необязательно) Описание коллекции.
    -level-уровень согласованности(Необязательно) Уровень согласованности: Bounded, Session, Strong, Eventual .
    -d-is-dynamic(Необязательно) Схема коллекции поддерживает динамические поля или нет.
    -s-shards-num(Необязательно) Количество осколков
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    ## For array field: --schema-field support <fieldName>:<dataType>:<maxCapacity>:<elementDataType>(:<maxLength>if Varchar)
    +
    +milvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'
    +
    +

    создать раздел

    Создает раздел.

    +

    Синтаксис

    +
    create partition -c (text) -p (text) [-d (text)]
    +
    +

    Опции

    + + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -p-partitionИмя раздела.
    -d-description(Необязательно) Описание раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > create partition -c car -p new_partition -d test_add_partition
    +
    +

    создать индекс

    Создает индекс для поля.

    +
    В настоящее время коллекция поддерживает не более одного индекса.
    +

    Синтаксис

    +
    create index
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    Пример

    +

    Создать индекс для поля и получить запрос на ввод необходимых данных:

    +
    milvus_cli > create index
    +
    +Collection name (car, car2): car2
    +
    +The name of the field to create an index for (vector): vector
    +
    +Index name: vectorIndex
    +
    +# Default is ''
    +Index type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT
    +
    +# Default is ''
    +Index metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:
    +
    +Timeout []:
    +
    +

    удалить пользователя

    Удаляет пользователя

    +

    Синтаксис

    delete user -u (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -u-имя пользователяИмя пользователя.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    milvus_cli > delete user -u zilliz
    +
    +

    удалить роль

    Удаление роли в Milvus

    +

    Синтаксис

    +
    delete role -r (text)
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -r-roleNameИмя роли milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    В следующем примере удаляется роль role1 в milvus.

    +
    milvus_cli > delete role -r role1
    +
    +

    удалить псевдоним

    Удаляет псевдоним.

    +

    Синтаксис

    +
    delete alias -a (text)
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -a-alias-nameПсевдоним.
    -helpn/aОтображает справку по использованию команды.
    +

    удалить коллекцию

    Удаляет коллекцию.

    +

    Синтаксис

    +
    delete collection -c (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя удаляемой коллекции.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > delete collection -c car
    +
    +

    удалить сущности

    Удаляет сущности.

    +

    Синтаксис

    +
    delete entities -c (text) -p (text)
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежат удаляемые сущности.
    -p-partition(Необязательно) Имя удаляемого раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > delete entities -c car
    +
    +The expression to specify entities to be deleted, such as "film_id in [ 0, 1 ]": film_id in [ 0, 1 ]
    +
    +You are trying to delete the entities of collection. This action cannot be undone!
    +
    +Do you want to continue? [y/N]: y
    +
    +

    удалить раздел

    Удаляет раздел.

    +

    Синтаксис

    +
    delete partition -c (text) -p (text)
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежит удаляемый раздел.
    -p-partitionИмя удаляемого раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > delete partition -c car -p new_partition
    +
    +

    удалить индекс

    Удаляет индекс и соответствующие индексные файлы.

    +
    В настоящее время коллекция поддерживает не более одного индекса.
    +

    Синтаксис

    +
    delete index -c (text) -in (text)
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -in-index-nameИмя индекса.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > delete index -c car -in indexName
    +
    +

    предоставить роль

    Предоставление роли пользователю

    +

    Синтаксис

    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -r-roleNameИмя роли milvus.
    -u-usernameИмя пользователя milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    grant role -r role1 -u user1
    +
    +

    присвоить привилегию

    Назначает привилегию роли.

    +

    Синтаксис

    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    Пример

    +
    grant privilege
    +
    +

    отозвать роль

    Отменяет роль, назначенную пользователю.

    +

    Синтаксис

    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -r-roleNameИмя роли milvus.
    -u-usernameИмя пользователя milvus.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    grant role -r role1 -u user1
    +
    +

    отменить привилегию

    Отменяет привилегию, уже назначенную роли.

    +

    Синтаксис

    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    Пример

    +
    revoke privilege
    +
    +

    показать коллекцию

    Отображает подробную информацию о коллекции.

    +

    Синтаксис

    +
    show collection -c (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > show collection -c test_collection_insert
    +
    +

    показать раздел

    Показывает подробную информацию о разделе.

    +

    Синтаксис

    +
    show partition -c (text) -p (text)
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежит раздел.
    -p-partitionИмя раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    Пример

    +
    milvus_cli > show partition -c test_collection_insert -p _default
    +
    +

    показать индекс

    Показывает подробную информацию об индексе.

    +

    Синтаксис

    +
    show index -c (text) -in (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -in-index-nameИмя индекса.
    +

    | --help | n/a | Отображает справку по использованию команды. |

    +

    Пример

    +
    milvus_cli > show index -c test_collection -in index_name
    +
    +

    exit

    Закрывает окно командной строки.

    +

    Синтаксис

    +
    exit
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    help

    Отображает справку по использованию команды.

    +

    Синтаксис

    +
    help <command>
    +
    +

    Команды

    + + + + + + + + + + + + + + + + + + + + + + + + +
    КомандаОписание
    очиститьОчищает экран.
    подключитьсяПодключение к Milvus.
    создатьСоздает коллекцию, базу данных, раздел, пользователя, роль и индекс.
    grantПредоставить роль, привилегию.
    отозватьОтменить роль, привилегию .
    удалитьУдаление коллекции, базы данных, раздела, псевдонима, пользователя, роли или индекса.
    exitЗакрывает окно командной строки.
    helpОтображает справку по использованию команды.
    вставитьИмпортирует данные в раздел.
    listВывод списка коллекций, баз данных, разделов, пользователей, ролей, грантов или индексов.
    loadЗагружает коллекцию или раздел.
    запросПоказывает результаты запроса, соответствующие всем введенным критериям.
    освободитьВысвобождает коллекцию или раздел.
    поискВыполняет поиск векторного сходства или гибридный поиск.
    показатьПоказать соединение, базу данных, коллекцию, ход загрузки_прогресса или ход индекса_прогресса.
    переименоватьПереименовать коллекцию
    использоватьИспользовать базу данных
    версияПоказывает версию Milvus_CLI.
    +

    импорт

    Импортирует локальные или удаленные данные в раздел.

    +

    Синтаксис

    +
    import -c (text)[-p (text)] <file_path>
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, в которую вставляются данные.
    -p-partition(Необязательно) Имя раздела, в который вставляются данные. Если не передавать этот параметр раздела, то будет выбран раздел "_default".
    -helpn/aОтображает справку по использованию команды.
    +

    Пример 1

    +В следующем примере импортируется локальный CSV-файл.

    +
    milvus_cli > import -c car 'examples/import_csv/vectors.csv'
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    Пример 2

    +В следующем примере импортируется удаленный CSV-файл.

    +
    milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-
    +io/milvus_cli/main/examples/import_csv/vectors.csv'
    +
    +Reading file from remote URL.
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    список пользователей

    Перечисление всех пользователей.

    +

    Синтаксис

    list users
    +
    +

    Опции

    | Опция | Полное имя | Описание | | --help | n/a | Отображает справку по использованию команды. |

    +

    Список ролей

    Список ролей в Milvus

    +

    Синтаксис

    +
    list roles
    +
    +

    Опции

    + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    Примеры

    milvus_cli > list roles
    +
    +

    Перечислить гранты

    Перечислить гранты в Milvus

    +

    Опции

    + + + + + + + + + +
    ОпцияПолное названиеОписание
    -r-roleNameИмя роли milvus.
    -o-objectNameИмя объекта milvus.
    -t-objectTypeГлобальный, Коллекция или Пользователь.
    -helpn/aОтображает справку по использованию команды.
    +

    Примеры

    milvus_cli > list grants -r role1 -o object1 -t Collection
    +
    +

    список коллекций

    Выводит список всех коллекций.

    +

    Синтаксис

    +
    list collections
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    список индексов

    Выводит список всех индексов для коллекции.

    +
    В настоящее время коллекция поддерживает не более одного индекса.
    +

    Синтаксис

    +
    list indexes -c (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -helpn/aОтображает справку по использованию команды.
    +

    список разделов

    Выводит список всех разделов коллекции.

    +

    Синтаксис

    +
    list partitions -c (text)
    +
    +

    Опции

    + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции.
    -helpn/aОтображает справку по использованию команды.
    +

    загрузить

    Загружает коллекцию или раздел с жесткого диска в оперативную память.

    +

    Синтаксис

    +
    load -c (text) [-p (text)]
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежит раздел.
    -p-partition(Необязательно/многократно) Имя раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    запрос

    Показывает результаты запроса, соответствующие всем введенным критериям.

    +

    Синтаксис

    +
    query
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    Пример

    +

    Пример 1

    +

    Выполнить запрос и получить запрос на ввод необходимых данных:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id in [ 428960801420883491, 428960801420883492,
    +428960801420883493 ]
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: color, brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    Пример 2

    +

    Чтобы выполнить запрос и получить запрос на ввод необходимых данных:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id > 428960801420883491
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: id, color,
    +brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    освободить

    Освобождает коллекцию или раздел из оперативной памяти.

    +

    Синтаксис

    +
    release -c (text) [-p (text)]
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежит раздел.
    -p-partition(Необязательно/многократно) Имя раздела.
    -helpn/aОтображает справку по использованию команды.
    +

    Выполняет поиск векторного сходства или гибридный поиск.

    +

    +
    search
    +
    +

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    +

    +

    Выполнить поиск в csv-файле и получить запрос на ввод необходимых данных:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file
    +out headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    Выполнить поиск в индексированной коллекции и получить запрос на ввод необходимых данных:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):
    +    [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    Выполнить поиск в неиндексированной коллекции и получить запрос на ввод необходимых данных:

    +
    milvus_cli > search
    +
    +Collection name (car, car2): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []:
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []:
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    список соединений

    Список соединений.

    +

    Синтаксис

    +
    list connections
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +

    show index_progress

    Показывает прогресс индексирования сущностей.

    +

    Синтаксис

    +
    show index_progress -c (text) [-i (text)]
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежат сущности.
    -i-index(Необязательно) Имя индекса.
    -helpn/aОтображает справку по использованию команды.
    +

    show loading_progress

    Отображает ход загрузки коллекции.

    +

    Синтаксис

    +
    show loading_progress -c (text) [-p (text)]
    +
    +

    Опции

    + + + + + + + + + +
    ОпцияПолное имяОписание
    -c-collection-nameИмя коллекции, к которой принадлежат сущности.
    -p-partition(Необязательно/многократно) Имя раздела загрузки.
    -helpn/aОтображает справку по использованию команды.
    +

    версия

    Показывает версию Milvus_CLI.

    +

    Синтаксис

    +
    version
    +
    +

    Опции

    + + + + + + + +
    ОпцияПолное имяОписание
    -helpн/аОтображает справку по использованию команды.
    +
    Вы также можете проверить версию Milvus_CLI в оболочке, как показано в следующем примере. В этом случае milvus_cli --version выступает в качестве команды.
    +

    Пример

    +
    $ milvus_cli --version
    +Milvus_CLI v0.4.0
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.json b/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.json new file mode 100644 index 000000000..1224850f0 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Command-Line Interface","anchorList":[{"label":"Командно-строчный интерфейс Milvus","href":"Milvus-Command-Line-Interface","type":1,"isActive":false},{"label":"Рекомендуемая версия","href":"Recommended-version","type":2,"isActive":false},{"label":"Текущая версия","href":"Current-version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.md b/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.md new file mode 100644 index 000000000..044f6ab1c --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/cli_overview.md @@ -0,0 +1,79 @@ +--- +id: cli_overview.md +summary: >- + Milvus Command-Line Interface (CLI) - это инструмент командной строки, который + поддерживает подключение к базе данных, операции с данными, а также импорт и + экспорт данных. +title: Командно-строчный интерфейс Milvus +--- +

    Командно-строчный интерфейс Milvus

    Milvus Command-Line Interface (CLI) - это инструмент командной строки, поддерживающий подключение к базе данных, операции с данными, импорт и экспорт данных. Основанный на Milvus Python SDK, он позволяет выполнять команды через терминал, используя интерактивные подсказки командной строки.

    +

    В следующей таблице приведены рекомендуемые версии PyMilvus и Milvus_CLI в зависимости от версии Milvus, которую вы используете.

    + + + + + + + + + + + + + + + + + + + + + +
    MilvusPyMilvusMilvus_CLI
    1.0.x1.0.1x
    1.1.x1.1.2x
    2.0.0-RC12.0.0rc1x
    2.0.0-RC22.0.0rc20.1.3
    2.0.0-RC42.0.0rc40.1.4
    2.0.0-RC52.0.0rc50.1.5
    2.0.0-RC62.0.0rc60.1.6
    2.0.0-RC72.0.0rc70.1.7
    2.0.0-RC82.0.0rc80.1.8
    2.0.0-RC92.0.0rc90.1.9
    2.1.02.1.00.3.0
    2.2.x2.2.x0.4.0
    2.3.x2.3.x0.4.2
    2.4.x2.4.x1.0.0
    2.4.x2.4.x1.0.1
    +
    Milvus 2.0.0-RC7 и более поздние версии не имеют обратной совместимости с 2.0.0-RC6 и более ранними версиями из-за изменений, внесенных в форматы хранения данных.
    +

    Текущая версия

    Текущая версия Milvus_CLI - 1.0.1. Чтобы узнать, какая версия у вас установлена, и проверить, не требуется ли обновление, выполните команду milvus_cli --version.

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/install_cli.json b/localization/v2.5.x/site/ru/userGuide/tools/install_cli.json new file mode 100644 index 000000000..3bfd42172 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/install_cli.json @@ -0,0 +1 @@ +{"codeList":["pip install milvus-cli\n","$ docker run -it zilliz/milvus_cli:latest\n","git clone https://github.com/zilliztech/milvus_cli.git\n","cd milvus_cli\n","python -m pip install --editable .\n"],"headingContent":"Install Milvus_CLI","anchorList":[{"label":"Установка Milvus_CLI","href":"Install-MilvusCLI","type":1,"isActive":false},{"label":"Установка из PyPI","href":"Install-from-PyPI","type":2,"isActive":false},{"label":"Установка с помощью Docker","href":"Install-with-Docker","type":2,"isActive":false},{"label":"Установка из исходного кода","href":"Install-from-source-code","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/install_cli.md b/localization/v2.5.x/site/ru/userGuide/tools/install_cli.md new file mode 100644 index 000000000..a31cbdda8 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/install_cli.md @@ -0,0 +1,100 @@ +--- +id: install_cli.md +summary: 'Узнайте, как установить Milvus_CLI.' +title: Установка Milvus_CLI +--- +

    Установка Milvus_CLI

    В этой теме описывается, как установить Milvus_CLI.

    +

    Установка из PyPI

    Вы можете установить Milvus_CLI из PyPI.

    +

    Необходимые условия

      +
    • Установите Python 3.8.5 или более позднюю версию
    • +
    • Установить pip
    • +
    +

    Установка через pip

    Выполните следующую команду для установки Milvus_CLI.

    +
    pip install milvus-cli
    +
    +

    Установка с помощью Docker

    Вы можете установить Milvus_CLI с помощью docker.

    +

    Необходимые условия .

    Требуется Docker 19.03 или более поздняя версия.

    +

    Установка на основе образа Docker

    $ docker run -it zilliz/milvus_cli:latest
    +
    +

    Установка из исходного кода

      +
    1. Выполните следующую команду, чтобы загрузить репозиторий milvus_cli.
    2. +
    +
    git clone https://github.com/zilliztech/milvus_cli.git
    +
    +
      +
    1. Выполните следующую команду, чтобы войти в папку milvus_cli.
    2. +
    +
    cd milvus_cli
    +
    +
      +
    1. Выполните следующую команду для установки Milvus_CLI.
    2. +
    +
    python -m pip install --editable .
    +
    +

    Также вы можете установить Milvus_CLI из сжатого тарбола (файл.tar.gz ). Загрузите tarball и выполните команду python -m pip install milvus_cli-<version>.tar.gz.

    +

    Установка из файла .exe

    Этот способ установки применим только для Windows.
    +

    Скачайте .exe-файл с GitHub и запустите его для установки Milvus_CLI. В случае успеха появится окно milvus_cli-<version>.exe, как показано на следующем рисунке.

    +

    + + Milvus_CLI + Milvus_CLI

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json new file mode 100644 index 000000000..e51dced9f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across Buckets","anchorList":[{"label":"Миграция между экземплярами с использованием разных ведер","href":"Migrate-Between-Instances-Across-Buckets","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Необходимые условия**","href":"Prerequisites","type":2,"isActive":false},{"label":"Резервное копирование коллекции из milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Восстановление резервной копии на milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md new file mode 100644 index 000000000..234c43dcc --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md @@ -0,0 +1,203 @@ +--- +id: cross-bucket-backup-and-restore.md +summary: >- + В этой теме описывается процесс резервного копирования коллекции из одного + экземпляра Milvus и ее восстановления в другом экземпляре. +title: Миграция между экземплярами с использованием разных ведер +--- +

    Миграция между экземплярами с использованием разных ведер

    В этой теме описывается процесс резервного копирования коллекции из одного экземпляра Milvus и ее восстановления в другом экземпляре, причем каждый экземпляр использует разные ведра в одном и том же хранилище объектов.

    +

    Обзор

    На диаграмме ниже показан процесс резервного копирования и восстановления с использованием разных ведер в одном объектном хранилище.

    +

    + + cross-bucket-backup-and-restore.png + cross-bucket-backup-and-restore.png

    +

    Предположим, что у нас есть два экземпляра Milvus, milvus_A и milvus_B, оба используют стандартный механизм хранения MinIO для хранения объектов. Эти экземпляры используют разные ведра bucket_A и bucket_B в одном и том же объектном хранилище. В этом примере нам необходимо выполнить следующие задачи:

    +
      +
    1. Создать резервную копию (my_backup) для коллекции coll в bucket_A и сохранить ее в bucket_B.

    2. +
    3. В bucket_B восстановите из резервной копии и назовите восстановленную коллекцию coll_bak.

    4. +
    +

    Необходимые условия**

      +
    • Убедитесь, что инструмент milvus-backup установлен.

    • +
    • Ознакомьтесь с настройкой параметров объектного хранилища Milvus. Подробные сведения см. в разделе Объектное хранилище.

    • +
    +

    Резервное копирование коллекции из milvus_A

    Шаг 1: Подготовьте конфигурацию

    Перейдите в каталог проекта milvus-backup и создайте каталог с именем configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Загрузите резервный файл конфигурации backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Структура файла выглядит следующим образом:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Шаг 2: Редактирование файла конфигурации

    Измените файл backup.yaml, чтобы установить соответствующие конфигурации дляmilvus_A:

    +
      +
    • Конфиги подключения

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: IP-адрес или имя хоста сервера milvus_A.

      • +
      • milvus.port: TCP-порт, на котором прослушивается сервер Milvus (по умолчанию 19530).

      • +
    • +
    • Конфигурации хранилища (настройки MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: localhost # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: Имя ведра, используемого для хранения данных в milvus_A. В данном примере установлено значение bucket_A.

    • +
    • minio.rootPath: Корневой путь внутри ведра, в котором хранятся данные из milvus_A. В данном примере установлено значение files.

    • +
    • minio.backupBucketName: Имя ведра, используемого для хранения резервных копий вmilvus_B. В этом примере milvus_A и milvus_B используют разные ведра. Поэтому установите значение bucket_B.

    • +
    • minio.backupRootPath: Корневой путь в ведре, предназначенном для хранения файлов резервных копий в milvus_B. В данном примере установите значение backup.

    • +
    +

    Шаг 3: Создание резервной копии

    После сохранения файла backup.yaml создайте резервную копию с именем my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Эта команда создает резервную копию bucket_B/backup/my_backup в объектном хранилище для коллекции coll.

    +

    Восстановление резервной копии на milvus_B

    Шаг 1: Настройте параметры восстановления

    Повторите шаг 2, чтобы изменить конфигурацию для восстановления на milvus_B, убедившись, что minio.bucketName установлен на bucket_B.

    +

    Вот пример конфигурации:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +...
    +
    +

    Шаг 2: Восстановление резервной копии

    Восстановите резервную копию на milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Эта команда восстанавливает резервную копию в новую коллекцию с именем coll_bak в milvus_B, с данными, хранящимися в bucket_B/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json new file mode 100644 index 000000000..d8f905e81 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","# configure a Minio host\nmc alias set my_minio https:// \n","# List the available buckets\nmc ls my_minio\n","# Download a bucket recursively\nmc cp --recursive my_minio/ \n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across S3 Environments","anchorList":[{"label":"Миграция между экземплярами в средах S3","href":"Migrate-Between-Instances-Across-S3-Environments","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Резервное копирование коллекции из milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Вручную перенесите резервную копию на milvus_B","href":"Manually-transfer-the-backup-to-milvusB","type":2,"isActive":false},{"label":"Восстановление из резервной копии на milvus_B","href":"Restore-from-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md new file mode 100644 index 000000000..730f7d8cd --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md @@ -0,0 +1,246 @@ +--- +id: multi-storage-backup-and-restore.md +summary: >- + В этой теме описывается процесс резервного копирования коллекции из одного + экземпляра Milvus и ее восстановления в другом экземпляре. +title: Миграция между экземплярами в средах S3 +--- +

    Миграция между экземплярами в средах S3

    В этой теме подробно описывается процесс резервного копирования коллекции из одного экземпляра Milvus и ее восстановления в другом экземпляре, причем каждый экземпляр использует разные хранилища объектов.

    +

    Обзор

    На приведенной ниже диаграмме показан процесс резервного копирования и восстановления с использованием различных объектных хранилищ.

    +

    + + multi-storage-backup-and-restore.png + multi-storage-backup-and-restore.png

    +

    Предположим, что у нас есть два экземпляра Milvus, milvus_A и milvus_B, использующие разные хранилища объектов. В этом примере нам необходимо выполнить следующие задачи:

    +
      +
    1. Создать резервную копию (my_backup) для коллекции coll в bucket_A объектного хранилищаmilvus_A.

    2. +
    3. Перенести резервную копию my_backup на bucket_B из milvus_B'объектного хранилища.

    4. +
    +

    В bucket_B выполните восстановление из резервной копии и назовите восстановленную коллекцию coll_bak.

    +

    Предварительные условия

      +
    • Убедитесь, что инструмент milvus-backup установлен.

    • +
    • Ознакомьтесь с настройками объектного хранилища Milvus. Подробнее см. в разделе "Объектное хранилище".

    • +
    +

    Резервное копирование коллекции из milvus_A

    Шаг 1: Подготовьте конфигурацию

    Перейдите в каталог проекта milvus-backup и создайте каталог с именем configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Загрузите резервный файл конфигурации backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Структура файла выглядит следующим образом:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Шаг 2: Редактирование файла конфигурации

    Измените файл backup.yaml, чтобы установить соответствующие конфигурации для milvus_A:

    +
      +
    • Connection configs

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: IP-адрес или имя хоста сервера milvus_A.

      • +
      • milvus.port: TCP-порт, на котором прослушивается сервер Milvus (по умолчанию 19530).

      • +
    • +
    • Конфигурации хранилища (настройки MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: minio_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName: Имя ведра, используемого для хранения данных в milvus_A. В данном примере установлено значение bucket_A.

    • +
    • minio.rootPath: Корневой путь внутри ведра, где хранятся данные из milvus_A. В данном примере установлено значение files.

    • +
    • minio.backupBucketName: Имя ведра, используемого для хранения резервных копий. В данном примере установлено значение bucket_A.

    • +
    • minio.backupRootPath: Корневой путь в ведре, предназначенном для хранения файлов резервных копий milvus_B. В данном примере установлено значение backup.

    • +
    +

    Шаг 3: Создание резервной копии

    После сохранения файла backup.yaml создайте резервную копию с именем my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Эта команда создает резервную копию bucket_A/backup/my_backup в объектном хранилище milvus_A.

    +

    Вручную перенесите резервную копию на milvus_B

    Поскольку milvus_A и milvus_B используют разные объектные хранилища, вам нужно вручную загрузить резервную копию из хранилища milvus_A и выгрузить ее в хранилищеmilvus_B.

    +

    Использование консоли MinIO

    +
      +
    1. Войдите в консоль MinIO.

    2. +
    3. Найдите ведро, указанное в minio.address для milvus_A.

    4. +
    5. Выберите файлы резервных копий в этом ведре.

    6. +
    7. Нажмите Download, чтобы загрузить файлы на свой компьютер.

    8. +
    +

    Использование клиента mc

    +

    В качестве альтернативы можно использовать клиент mc для загрузки файлов резервных копий:

    +
      +
    1. Настройте хост MinIO:
    2. +
    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +
      +
    1. Список доступных ведер:
    2. +
    +
    # List the available buckets
    +mc ls my_minio
    +
    +
      +
    1. Загрузите ведро рекурсивно:
    2. +
    +
    # Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    После загрузки файлов резервных копий их можно загрузить в хранилище объектов, используемое milvus_B, для последующего восстановления. Кроме того, можно загрузить резервную копию в Zilliz Cloud, чтобы создать управляемую векторную базу данных с вашими данными. Подробности см. в разделе Миграция из Milvus в Zilliz Cloud.

    +

    Восстановление из резервной копии на milvus_B

    Шаг 1: Настройте параметры восстановления

    Повторите шаг 2, чтобы изменить конфигурацию для восстановления на milvus_B, убедившись, что minio.bucketName установлен на bucket_B.

    +

    Вот пример конфигурации:

    +
    # milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: minio_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    Шаг 2: Восстановление из резервной копии

    Восстановите резервную копию на milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Эта команда восстанавливает резервную копию в новую коллекцию с именем coll_bak вmilvus_B, с данными, хранящимися в bucket_B/files/insert_log/[ID of new collection] в хранилище объектов milvus_B.

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json new file mode 100644 index 000000000..1dbcc2fc1 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_A\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_B\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n ...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances in One Bucket (Different Root Paths)","anchorList":[{"label":"Миграция между экземплярами в одном ведре (разные корневые пути)","href":"Migrate-Between-Instances-in-One-Bucket-Different-Root-Paths","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Резервное копирование коллекции из milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"Восстановите резервную копию в milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md new file mode 100644 index 000000000..344924abd --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md @@ -0,0 +1,199 @@ +--- +id: shared-bucket-backup-and-restore.md +summary: >- + В этой теме описывается процесс резервного копирования коллекции из одного + экземпляра Milvus и ее восстановления в другом экземпляре при использовании + общего ведра для хранения объектов. +title: Миграция между экземплярами в одном ведре (разные корневые пути) +--- +

    Миграция между экземплярами в одном ведре (разные корневые пути)

    В этой теме описывается процесс резервного копирования коллекции из одного экземпляра Milvus и ее восстановления в другом экземпляре при использовании общего ведра для хранения объектов с различными корневыми путями для каждого экземпляра.

    +

    Обзор

    На диаграмме ниже показан процесс резервного копирования и восстановления с использованием общего ведра.

    +

    + + shared-bucket-backup-and-restore.png + shared-bucket-backup-and-restore.png

    +

    Предположим, что у нас есть экземпляры Milvus, milvus_A и milvus_B, оба используют стандартный механизм хранения MinIO для хранения объектов. Эти экземпляры используют один и тот же бакет, bucket_A, но хранят свои данные в разных корневых путях: files_A для milvus_A и files_B для milvus_B. В этом примере нам необходимо выполнить следующие задачи:

    +
      +
    1. Создать резервную копию (my_backup) для коллекции coll, которая хранится по путиfiles_A для milvus_A.

    2. +
    3. Восстановить из резервной копии и сохранить ее в files_B для milvus_B.

    4. +
    +

    Предварительные условия

      +
    • Убедитесь, что инструмент milvus-backup установлен.

    • +
    • Ознакомьтесь с настройкой параметров хранилища объектов Milvus. Подробные сведения см. в разделе Хранилище объектов.

    • +
    +

    Резервное копирование коллекции из milvus_A

    Шаг 1: Подготовка конфигурации

    Перейдите в каталог проекта milvus-backup и создайте каталог с именем configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Загрузите файл конфигурации резервной копии backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Структура файла выглядит следующим образом:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Шаг 2: Редактирование файла конфигурации

    Измените файл backup.yaml, чтобы установить соответствующие конфигурации дляmilvus_A:

    +
      +
    • Конфиги подключения

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address: IP-адрес или имя хоста сервера milvus_A.

      • +
      • milvus.port: TCP-порт, на котором прослушивается сервер Milvus (по умолчанию 19530).

      • +
    • +
    • Конфигурации хранилища (настройки MinIO/S3)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: milvus_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files_A" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
      +
        +
      • minio.bucketName: Имя ведра, используемого для хранения milvus_A. В данном примере установлено значение bucket_A.

      • +
      • minio.rootPath: Корневой путь внутри ведра, где хранятся данные из milvus_A. В данном примере установлено значение files_A.

      • +
      • minio.backupBucketName: Имя ведра, используемого для хранения данных. В этом примере milvus_A и milvus_B используют общий бакет. Поэтому установите значениеbucket_A.

      • +
      • minio.backupRootPath: Корневой путь в ведре, предназначенном для хранения файлов резервных копий milvus_B. В этом примере используется путь, отличный от milvus_A. Поэтому установите значение backup.

      • +
    • +
    +

    Шаг 3: Создание резервной копии

    После сохранения backup.yaml создайте резервную копию с именем my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Эта команда создает резервную копию bucket_A/backup/my_backup в объектном хранилище для коллекции coll.

    +

    Восстановите резервную копию в milvus_B

    Шаг 1: Настройка параметров восстановления

    Повторите шаг 2, чтобы изменить конфигурацию для восстановления milvus_B, обеспечив установку minio.bucketName на bucket_A и minio.rootPath на files_B, чтобы различать места хранения между двумя экземплярами.

    +

    Вот пример конфигурации:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: milvus_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files_B" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +  ...
    +
    +

    Шаг 2: Восстановление резервной копии

    Восстановите резервную копию на milvus_B:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Эта команда восстанавливает резервную копию в новую коллекцию с именем coll_bak в milvus_B, с данными, хранящимися в bucket_A/files_B/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json new file mode 100644 index 000000000..12d168416 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Backup and Restore in One Instance","anchorList":[{"label":"Резервное копирование и восстановление в одном экземпляре","href":"Backup-and-Restore-in-One-Instance","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Резервное копирование коллекции","href":"Back-up-the-collection","type":2,"isActive":false},{"label":"Восстановление из резервной копии в milvus_A","href":"Restore-from-the-backup-within-milvusA","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md new file mode 100644 index 000000000..973552309 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md @@ -0,0 +1,142 @@ +--- +id: single-instance-backup-and-restore.md +summary: >- + В этой теме описывается процесс резервного копирования коллекции и ее + восстановления из резервной копии в одном и том же экземпляре Milvus. +title: Резервное копирование и восстановление в одном экземпляре +--- +

    Резервное копирование и восстановление в одном экземпляре

    В этой теме описывается процесс резервного копирования коллекции и ее восстановления из резервной копии в одном экземпляре Milvus.

    +

    Обзор

    На диаграмме ниже показан процесс резервного копирования и восстановления в рамках одного экземпляра Milvus.

    +

    + + single-instance-backup-and-restore.png + single-instance-backup-and-restore.png

    +

    Предположим, у нас есть экземпляр Milvus, milvus_A, использующий для хранения данных ведро с именемbucket_A. В этом примере мы должны выполнить следующие задачи:

    +
      +
    1. Создать резервную копию (my_backup) для коллекции coll в bucket_A.

    2. +
    3. Восстановить из резервной копии и назвать восстановленную коллекцию coll_bak.

    4. +
    +

    Предварительные условия

      +
    • Убедитесь, что инструмент milvus-backup установлен.

    • +
    • Ознакомьтесь с настройкой параметров объектного хранилища Milvus. Подробнее см. в разделе "Объектное хранилище".

    • +
    +

    Резервное копирование коллекции

    Шаг 1: Подготовьте конфигурацию

    Перейдите в каталог проекта milvus-backup и создайте каталог с именем configs:

    +
    mkdir configs
    +cd configs
    +
    +

    Загрузите файл конфигурации резервного копирования backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    Структура файла выглядит следующим образом:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    Шаг 2: Редактирование файла конфигурации

    Измените файл backup.yaml, чтобы установить соответствующие конфигурации дляmilvus_A. Ниже приведен пример конфигурации хранилища:

    +
    # Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    Шаг 3: Создание резервной копии

    После сохранения файла backup.yaml создайте резервную копию с именем my_backup:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    Эта команда создает резервную копию bucket_A/backup/my_backup в объектном хранилище milvus_A.

    +

    Восстановление из резервной копии в milvus_A

    После создания резервной копии можно восстановить из нее с помощью следующей команды:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    Эта команда восстанавливает из резервной копии и создает новую коллекцию с именем coll_bak в milvus_A, с данными, хранящимися в bucket_A/files/insert_log/[ID of new collection].

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.json new file mode 100644 index 000000000..d51f18a7f --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","./milvus-backup server\n","./milvus-backup server -p 443\n","python example/prepare_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/create' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"backup_name\": \"my_backup\",\n \"collection_names\": [\n \"hello_milvus\"\n ]\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/list' \\\n--header 'Content-Type: application/json'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=&backup_name=my_backup' \\\n--header 'Content-Type: application/json'\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"_recover\",\n \"backup_name\":\"my_backup\"\n}'\n","python example/clean_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"\",\n \"backup_name\":\"my_backup\"\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=' \\\n--header 'Content-Type: application/json'\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using APIs","anchorList":[{"label":"Резервное копирование и восстановление данных с помощью API","href":"Back-up-and-Restore-Data-Using-APIs","type":1,"isActive":false},{"label":"Получение Milvus Backup","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"Подготовьте конфигурационный файл","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"Запустите сервер API","href":"Start-up-the-API-server","type":2,"isActive":false},{"label":"Подготовьте данные","href":"Prepare-data","type":2,"isActive":false},{"label":"Резервное копирование данных","href":"Back-up-data","type":2,"isActive":false},{"label":"Восстановление данных","href":"Restore-data","type":2,"isActive":false},{"label":"Проверка восстановленных данных","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.md new file mode 100644 index 000000000..f468dafd7 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_api.md @@ -0,0 +1,230 @@ +--- +id: milvus_backup_api.md +summary: 'Узнайте, как использовать Milvus Backup через API' +title: Резервное копирование и восстановление данных с помощью API +--- +

    Резервное копирование и восстановление данных с помощью API

    Milvus Backup предоставляет функции резервного копирования и восстановления данных для обеспечения безопасности ваших данных Milvus.

    +

    Получение Milvus Backup

    Вы можете загрузить скомпилированный двоичный файл или собрать его из исходных текстов.

    +

    Чтобы загрузить скомпилированный двоичный файл, перейдите на страницу релиза, где вы найдете все официальные релизы. Помните, что всегда используйте двоичные файлы из релиза, помеченного как Latest.

    +

    Чтобы скомпилировать из исходников, сделайте следующее:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    Подготовьте конфигурационный файл

    Скачайте пример конфигурационного файла и измените его в соответствии с вашими потребностями.

    +

    Затем создайте папку рядом с загруженным или собранным двоичным файлом Milvus Backup, назовите ее configs, а файл конфигурации поместите в папку configs.

    +

    Структура папки должна быть похожа на следующую:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    Поскольку Milvus Backup не может создавать резервные копии данных по локальному пути, при настройке файла конфигурации убедитесь, что настройки Minio верны.

    +
    +

    Имя ведра Minio по умолчанию зависит от способа установки Milvus. При внесении изменений в настройки Minio руководствуйтесь следующей таблицей.

    + + + + + + + + +
    полеDocker ComposeHelm / Milvus Operator
    bucketNamea-bucketmilvus-bucket
    rootPathфайлыфайл
    +
    +

    Запустите сервер API

    Затем вы можете запустить сервер API следующим образом:

    +
    ./milvus-backup server
    +
    +

    По умолчанию API-сервер прослушивает порт 8080. Вы можете изменить это, запустив его с флагом -p. Чтобы запустить сервер API, прослушивающий порт 443, сделайте следующее:

    +
    ./milvus-backup server -p 443
    +
    +

    Вы можете получить доступ к пользовательскому интерфейсу Swagger, используя http://localhost:/api/v1/docs/index.html.

    +

    Подготовьте данные

    Если вы запустили пустой локальный экземпляр Milvus, прослушивающий порт по умолчанию 19530, используйте примеры сценариев Python для генерации некоторых данных в вашем экземпляре. Не стесняйтесь вносить необходимые изменения в скрипты в соответствии с вашими потребностями.

    +

    Получите сценарии. Затем запустите скрипты для генерации данных. Убедитесь, что PyMilvus, официальный Milvus Python SDK, установлен.

    +
    python example/prepare_data.py
    +
    +

    Этот шаг необязателен. Если вы его пропустите, убедитесь, что в вашем экземпляре Milvus уже есть данные.

    +

    Резервное копирование данных

    +

    Обратите внимание, что запуск Milvus Backup на экземпляре Milvus обычно не влияет на работу экземпляра. Ваш экземпляр Milvus будет полностью функционировать во время резервного копирования или восстановления.

    +

    Выполните следующую команду для создания резервной копии. При необходимости измените адреса collection_names и backup_name.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/create' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +  "async": true,
    +  "backup_name": "my_backup",
    +  "collection_names": [
    +    "hello_milvus"
    +  ]
    +}'
    +
    +

    После выполнения команды вы можете перечислить резервные копии в ведро, указанное в настройках Minio, следующим образом:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/list' \
    +--header 'Content-Type: application/json'
    +
    +

    А скачать файлы резервных копий можно следующим образом:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=<test_backup_id>&backup_name=my_backup' \
    +--header 'Content-Type: application/json'
    +
    +

    Во время выполнения вышеуказанной команды измените backup_id и backup_name на те, которые возвращает API list.

    +

    Теперь вы можете сохранить файлы резервных копий в безопасном месте для восстановления в будущем или загрузить их в Zilliz Cloud для создания управляемой векторной базы данных с вашими данными. Подробности см. в разделе Миграция с Milvus на Zilliz Cloud.

    +

    Восстановление данных

    +

    Вы можете вызвать команду restore API с параметром collection_suffix, чтобы создать новую коллекцию, восстановив данные из резервной копии. При необходимости измените параметры collection_names и backup_name.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "_recover",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    Параметр collection_suffix позволяет задать суффикс для создаваемой новой коллекции. Приведенная выше команда создаст новую коллекцию под названием hello_milvus_recover в вашем экземпляре Milvus.

    +

    Если вы предпочитаете восстановить резервную копию коллекции без изменения ее имени, отбросьте коллекцию перед ее восстановлением из резервной копии. Теперь вы можете очистить данные, сгенерированные в Prepare data, выполнив следующую команду.

    +
    python example/clean_data.py
    +
    +

    Затем выполните следующую команду для восстановления данных из резервной копии.

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    Процесс восстановления может занять много времени в зависимости от размера восстанавливаемых данных. Поэтому все задачи восстановления выполняются асинхронно. Состояние задачи восстановления можно проверить, выполнив команду:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=<test_restore_id>' \
    +--header 'Content-Type: application/json'
    +
    +

    Не забудьте изменить адрес test_restore_id на тот, который был восстановлен с помощью API восстановления.

    +

    Проверка восстановленных данных

    После завершения восстановления можно проверить восстановленные данные, проиндексировав восстановленную коллекцию следующим образом:

    +
    python example/verify_data.py
    +
    +

    Обратите внимание, что в приведенном выше сценарии предполагается, что вы выполнили команду restore с флагом -s и суффикс установлен на -recover. Не стесняйтесь вносить необходимые изменения в сценарий в соответствии с вашими потребностями.

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.json new file mode 100644 index 000000000..452247d2e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","python example/prepare_data.py\n","./milvus-backup create -n \n","# configure a Minio host\nmc alias set my_minio https:// \n\n# List the available buckets\nmc ls my_minio\n\n# Download a bucket recursively\nmc cp --recursive my_minio/ \n","./milvus-backup restore -n my_backup -s _recover\n","python example/clean_data.py\n","./milvus-backup restore -n my_backup\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using Commands","anchorList":[{"label":"Резервное копирование и восстановление данных с помощью команд","href":"Back-up-and-Restore-Data-Using-Commands","type":1,"isActive":false},{"label":"Получение Milvus Backup","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"Подготовьте конфигурационный файл","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"Подготовьте данные","href":"Prepare-data","type":2,"isActive":false},{"label":"Резервное копирование данных","href":"Back-up-data","type":2,"isActive":false},{"label":"Восстановление данных","href":"Restore-data","type":2,"isActive":false},{"label":"Проверка восстановленных данных","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.md new file mode 100644 index 000000000..dc7a81c9c --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_cli.md @@ -0,0 +1,180 @@ +--- +id: milvus_backup_cli.md +summary: 'Узнайте, как использовать Milvus Backup с помощью CLI' +title: Резервное копирование и восстановление данных с помощью команд +--- +

    Резервное копирование и восстановление данных с помощью команд

    Milvus Backup предоставляет функции резервного копирования и восстановления данных для обеспечения безопасности ваших данных Milvus.

    +

    Получение Milvus Backup

    Вы можете загрузить скомпилированный двоичный файл или собрать его из исходных текстов.

    +

    Чтобы загрузить скомпилированный двоичный файл, перейдите на страницу релиза, где вы найдете все официальные релизы. Помните, что всегда используйте двоичные файлы из релиза, помеченного как Latest.

    +

    Чтобы скомпилировать из исходников, сделайте следующее:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    Подготовьте конфигурационный файл

    Скачайте пример конфигурационного файла и измените его в соответствии с вашими потребностями.

    +

    Затем создайте папку рядом с загруженным или собранным двоичным файлом Milvus Backup, назовите ее configs, а файл конфигурации поместите в папку configs.

    +

    Структура папки должна быть похожа на следующую:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    Поскольку Milvus Backup не может создавать резервные копии данных по локальному пути, при настройке файла конфигурации убедитесь, что настройки Minio верны.

    +
    +

    Имя ведра Minio по умолчанию зависит от способа установки Milvus. При внесении изменений в настройки Minio руководствуйтесь следующей таблицей.

    + + + + + + + + +
    полеDocker ComposeHelm / Milvus Operator
    bucketNamea-bucketmilvus-bucket
    rootPathфайлыфайл
    +
    +

    Подготовьте данные

    Если вы запустили пустой локальный экземпляр Milvus с портом по умолчанию, используйте примеры Python-скриптов, чтобы сгенерировать некоторые данные в вашем экземпляре. Не стесняйтесь вносить необходимые изменения в скрипты, чтобы они соответствовали вашим потребностям.

    +

    Получите сценарии. Затем запустите скрипты для генерации данных. Убедитесь, что PyMilvus, официальный Milvus Python SDK, установлен.

    +
    python example/prepare_data.py
    +
    +

    Этот шаг необязателен. Если вы его пропустите, убедитесь, что в вашем экземпляре Milvus уже есть данные.

    +

    Резервное копирование данных

    Обратите внимание, что запуск Milvus Backup на экземпляре Milvus обычно не влияет на работу экземпляра. Ваш экземпляр Milvus будет полностью функционировать во время резервного копирования или восстановления.

    +
    +

    Выполните следующую команду, чтобы создать резервную копию.

    +
    ./milvus-backup create -n <backup_name>
    +
    +

    После выполнения команды вы можете проверить файлы резервной копии в ведре, указанном в настройках Minio. В частности, их можно загрузить с помощью Minio Console или клиента mc.

    +

    Чтобы загрузить файлы из Minio Console, войдите в Minio Console, найдите ведро, указанное в minio.address, выберите файлы в этом ведре и нажмите кнопку Загрузить, чтобы загрузить их.

    +

    Если вы предпочитаете клиент mc, выполните следующие действия:

    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +# List the available buckets
    +mc ls my_minio
    +
    +# Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    Теперь вы можете сохранить файлы резервных копий в безопасном месте для восстановления в будущем или загрузить их в Zilliz Cloud, чтобы создать управляемую векторную базу данных с вашими данными. Подробнее см. в разделе Миграция из Milvus в Zilliz Cloud.

    +

    Восстановление данных

    +

    Вы можете выполнить команду restore с флагом -s, чтобы создать новую коллекцию, восстановив данные из резервной копии:

    +
    ./milvus-backup restore -n my_backup -s _recover
    +
    +

    Флаг -s позволяет задать суффикс для создаваемой коллекции. Приведенная выше команда создаст новую коллекцию под названием hello_milvus_recover в вашем экземпляре Milvus.

    +

    Если вы предпочитаете восстановить резервную копию коллекции без изменения ее имени, отбросьте коллекцию перед ее восстановлением из резервной копии. Теперь вы можете очистить данные, сгенерированные в Prepare data, выполнив следующую команду.

    +
    python example/clean_data.py
    +
    +

    Затем выполните следующую команду для восстановления данных из резервной копии.

    +
    ./milvus-backup restore -n my_backup
    +
    +

    Проверка восстановленных данных

    После завершения восстановления можно проверить восстановленные данные, проиндексировав восстановленную коллекцию следующим образом:

    +
    python example/verify_data.py
    +
    +

    Обратите внимание, что в приведенном выше сценарии предполагается, что вы выполнили команду restore с флагом -s и суффикс установлен на -recover. Не стесняйтесь вносить необходимые изменения в сценарий в соответствии с вашими потребностями.

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.json new file mode 100644 index 000000000..519130e7b --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Backup","anchorList":[{"label":"Резервное копирование Milvus","href":"Milvus-Backup","type":1,"isActive":false},{"label":"Предварительные условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Архитектура","href":"Architecture","type":2,"isActive":false},{"label":"Последний выпуск","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.md new file mode 100644 index 000000000..4af3d4d65 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-backup/milvus_backup_overview.md @@ -0,0 +1,83 @@ +--- +id: milvus_backup_overview.md +summary: >- + Milvus-Backup - это инструмент, который позволяет пользователям создавать + резервные копии и восстанавливать данные Milvus. +title: Резервное копирование Milvus +--- +

    Резервное копирование Milvus

    Milvus Backup - это инструмент, который позволяет пользователям создавать резервные копии и восстанавливать данные Milvus. Он предоставляет как CLI, так и API, чтобы вписаться в различные сценарии применения.

    +

    Предварительные условия

    Перед началом использования Milvus Backup убедитесь, что

    +
      +
    • Операционная система - CentOS 7.5+ или Ubuntu LTS 18.04+,
    • +
    • Версия Go - 1.20.2 или более поздняя.
    • +
    +

    Архитектура

    + + Milvus Backup architecture + Архитектура Milvus Backup

    +

    Milvus Backup обеспечивает резервное копирование и восстановление метаданных, сегментов и данных между экземплярами Milvus. Он предоставляет северные интерфейсы, такие как CLI, API и модуль Go на основе gRPC, для гибкого управления процессами резервного копирования и восстановления.

    +

    Milvus Backup считывает метаданные и сегменты коллекции из исходного экземпляра Milvus для создания резервной копии. Затем он копирует данные коллекции из корневого пути исходного экземпляра Milvus и сохраняет скопированные данные в корневом пути резервной копии.

    +

    Для восстановления из резервной копии Milvus Backup создает новую коллекцию в целевом экземпляре Milvus на основе метаданных коллекции и информации о сегментах в резервной копии. Затем он копирует данные из корневого пути резервной копии в корневой путь целевого экземпляра.

    +

    Последний выпуск

    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.json new file mode 100644 index 000000000..dfaac7717 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Monitoring","anchorList":[{"label":"Мониторинг","href":"Monitoring","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.md new file mode 100644 index 000000000..786e09fce --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/cdc-monitoring.md @@ -0,0 +1,44 @@ +--- +id: cdc-monitoring.md +order: 4 +summary: >- + Milvus-CDC предоставляет широкие возможности мониторинга с помощью приборных + панелей Grafana. +title: Мониторинг +--- +

    Мониторинг

    Milvus-CDC предоставляет широкие возможности мониторинга с помощью панелей Grafana, позволяя визуализировать ключевые показатели и обеспечивать бесперебойную работу задач Change Data Capture (CDC) и состояние сервера.

    +

    Метрики для задач CDC

    Чтобы начать работу, импортируйте файл cdc-grafana.json в Grafana. Это добавит приборную панель, специально разработанную для мониторинга состояния задач CDC.

    +

    Обзор приборной панели CDC Grafana:

    +

    + + milvus-cdc-dashboard + milvus-cdc-dashboard

    +

    Ключевые метрики с пояснениями:

    +
      +
    • Задача: Количество задач CDC в различных состояниях, включая начальное, запущенное и приостановленное.

    • +
    • Request Total: общее количество запросов, полученных Milvus-CDC.

    • +
    • Успех запроса: Количество успешных запросов, полученных Milvus-CDC.

    • +
    • количество задач: Количество задач в начальном, приостановленном и запущенном состояниях с течением времени.

    • +
    • состояние задачи: Состояние отдельных задач.

    • +
    • request count: Количество успешных и общих запросов.

    • +
    • задержка запроса: Задержка запросов через p99, среднее значение и другая статистика.

    • +
    • replicate data rate: Скорость передачи данных при репликации для операций чтения/записи

    • +
    • replicate tt lag: Задержка времени репликации для операций чтения/записи.

    • +
    • api execute count: Количество раз, когда были выполнены различные API Milvus-CDC.

    • +
    • center ts: Временная метка для задач чтения/записи.

    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.json new file mode 100644 index 000000000..0be53b063 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/zilliztech/milvus-cdc.git\n\ncd milvus-cdc/server/configs\n","# cdc meta data config\nmetaStoreConfig:\n # the metastore type, available value: etcd, mysql\n storeType: etcd\n # etcd address\n etcdEndpoints:\n - localhost:2379\n # mysql connection address\n # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8\n # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy\n rootPath: cdc\n","# milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.\nsourceConfig:\n # etcd config\n etcdAddress:\n - localhost:2379\n etcdRootPath: by-dev\n etcdMetaSubPath: meta\n # default partition name\n defaultPartitionName: _default\n # read buffer length, mainly used for buffering if writing data to milvus-target is slow.\n readChanLen: 10\n replicateChan: by-dev-replicate-msg\n # milvus-source mq config, which is pulsar or kafka\n pulsar:\n address: pulsar://localhost:6650\n webAddress: localhost:80\n maxMessageSize: 5242880\n tenant: public\n namespace: default\n# authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken\n# authParams: token:xxx\n# kafka:\n# address: 127.0.0.1:9092\n","make build\n","bash build_image.sh\n","# dir tree\n.\n├── milvus-cdc # build from source code or download from release page\n├── configs\n│ └── cdc.yaml # config for cdc and source milvus\n\n# start milvus cdc\n./milvus-cdc server\n","docker compose up -d\n"],"headingContent":"Deploy CDC Server","anchorList":[{"label":"Развертывание сервера CDC","href":"Deploy-CDC-Server","type":1,"isActive":false},{"label":"Необходимые условия","href":"Prerequisites","type":2,"isActive":false},{"label":"Шаги","href":"Steps","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.md new file mode 100644 index 000000000..12673d01e --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/deploy-cdc-server.md @@ -0,0 +1,156 @@ +--- +id: deploy-cdc-server.md +order: 2 +summary: >- + В этом руководстве представлен пошаговый процесс развертывания сервера + Milvus-CDC. +title: Развертывание сервера CDC +--- +

    Развертывание сервера CDC

    В этом руководстве представлен пошаговый процесс развертывания сервера Milvus-CDC.

    +

    Необходимые условия

    Перед развертыванием сервера Milvus-CDC убедитесь, что выполнены следующие условия:

    +
      +
    • Экземпляры Milvus: Оба исходных Milvus и хотя бы один целевой Milvus должны быть развернуты и работать.

      +
        +
      • Версии исходного и целевого Milvus должны быть 2.3.2 или выше, предпочтительно 2.4.x. Мы рекомендуем использовать одну и ту же версию для исходного и целевого Milvus, чтобы обеспечить совместимость.

      • +
      • Установите конфигурацию common.ttMsgEnabled целевого Milvus на false.

      • +
      • Настройте исходный и целевой Milvus с разными параметрами хранения метаданных и сообщений, чтобы избежать конфликтов. Например, избегайте использования одинаковых конфигураций etcd и rootPath, а также одинаковых сервисов Pulsar и chanNamePrefix в нескольких экземплярах Milvus.

      • +
    • +
    • Метахранилище: Подготовьте базу данных etcd или MySQL для метахранилища Milvus-CDC.

    • +
    +

    Шаги

    Получите файл конфигурации Milvus-CDC

    Клонируйте репозиторий Milvus-CDC и перейдите в каталог milvus-cdc/server/configs, чтобы получить доступ к файлу конфигурации cdc.yaml.

    +
    git clone https://github.com/zilliztech/milvus-cdc.git
    +
    +cd milvus-cdc/server/configs
    +
    +

    Отредактируйте файл конфигурации

    В каталоге milvus-cdc/server/configs измените файл cdc.yaml, чтобы настроить конфигурации, связанные с метахранилищем Milvus-CDC и деталями подключения исходного Milvus.

    +
      +
    • Конфигурация метахранилища:

      +
        +
      • metaStoreConfig.storeType: Тип метахранилища для Milvus-CDC. Возможные значения: etcd или mysql.

      • +
      • metaStoreConfig.etcdEndpoints: Адрес для подключения к etcd Milvus-CDC. Требуется, если для storeType установлено значение etcd.

      • +
      • metaStoreConfig.mysqlSourceUrl: Адрес подключения к базе данных MySQL для сервера Milvus-CDC. Требуется, если storeType установлен в mysql.

      • +
      • metaStoreConfig.rootPath: Корневой путь метахранилища Milvus-CDC. Эта конфигурация обеспечивает многопользовательский режим, позволяя нескольким службам CDC использовать один и тот же экземпляр etcd или MySQL, достигая при этом изоляции за счет разных корневых путей.

      • +
      +

      Пример конфигурации:

      +
      # cdc meta data config
      +metaStoreConfig:
      +  # the metastore type, available value: etcd, mysql
      +  storeType: etcd
      +  # etcd address
      +  etcdEndpoints:
      +    - localhost:2379
      +  # mysql connection address
      +  # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8
      +  # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy
      +  rootPath: cdc
      +
    • +
    • Конфигурация источника Milvus:

      +

      Укажите детали подключения исходного Milvus, включая etcd и хранилище сообщений, чтобы установить соединение между сервером Milvus-CDC и исходным Milvus.

      +
        +
      • sourceConfig.etcdAddress: Адрес для подключения к etcd источника Milvus. Дополнительные сведения см. в разделе Конфигурации, связанные с etcd.

      • +
      • sourceConfig.etcdRootPath: Корневой префикс ключа, по которому исходный Milvus хранит данные в etcd. Значение может меняться в зависимости от метода развертывания экземпляра Milvus:

        +
          +
        • Helm или Docker Compose: По умолчанию by-dev.

        • +
        • Оператор: По умолчанию <release_name>.

        • +
      • +
      • replicateChan: имя канала репликации milvus, которое находится на {msgChannel.chanNamePrefix.cluster}/{msgChannel.chanNamePrefix.replicateMsg} в файле milvus.yaml.

      • +
      • sourceConfig.pulsar: Конфигурации Pulsar для исходного Milvus. Если источник Milvus использует Kafka для хранения сообщений, удалите все конфигурации, связанные с Pulsar. Дополнительные сведения см. в разделе Конфигурации, связанные с Pulsar.

      • +
      • sourceConfig.kafka.address: Адрес Kafka для источника Milvus. Не комментируйте эту конфигурацию, если источник Milvus использует Kafka для хранения сообщений.

      • +
    • +
    +

    Пример конфигурации:

    +
    # milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.
    +sourceConfig:
    +  # etcd config
    +  etcdAddress:
    +    - localhost:2379
    +  etcdRootPath: by-dev
    +  etcdMetaSubPath: meta
    +  # default partition name
    +  defaultPartitionName: _default
    +  # read buffer length, mainly used for buffering if writing data to milvus-target is slow.
    +  readChanLen: 10
    +  replicateChan: by-dev-replicate-msg
    +  # milvus-source mq config, which is pulsar or kafka
    +  pulsar:
    +    address: pulsar://localhost:6650
    +    webAddress: localhost:80
    +    maxMessageSize: 5242880
    +    tenant: public
    +    namespace: default
    +#    authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken
    +#    authParams: token:xxx
    +#  kafka:
    +#    address: 127.0.0.1:9092
    +
    +

    Компиляция сервера Milvus-CDC

    После сохранения файла cdc.yaml перейдите в каталог milvus-cdc и выполните одну из следующих команд для компиляции сервера:

    +
      +
    • Для бинарного файла:

      +
      make build
      +
    • +
    • Для образа Docker:

      +
      bash build_image.sh
      +
      +

      Для образа Docker смонтируйте скомпилированный файл на /app/server/configs/cdc.yaml внутри контейнера.

    • +
    +

    Запустите сервер

      +
    • Использование двоичного файла

      +

      Перейдите в каталог с бинарным файлом milvus-cdc и в каталог configs с файлом cdc.yaml, а затем запустите сервер:

      +
      # dir tree
      +.
      +├── milvus-cdc # build from source code or download from release page
      +├── configs
      +│   └── cdc.yaml # config for cdc and source milvus
      +
      +# start milvus cdc
      +./milvus-cdc server
      +
    • +
    • Используя Docker Compose:

      +
      docker compose up -d
      +
    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.json new file mode 100644 index 000000000..09b8a8ace --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.json @@ -0,0 +1 @@ +{"codeList":["curl -X POST http:_//localhost:8444/cdc \\\n-H \"Content-Type: application/json\" \\\n-d '{\n \"request_type\": \"create\",\n \"request_data\": {\n \"milvus_connect_param\": {\n \"uri\": \"http://localhost:19530\",\n \"token\":\"root:Milvus\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ]\n }\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"task_id\":\"xxxx\"\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\": \"list\"\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"tasks\": [\n {\n \"task_id\": \"xxxxx\",\n \"milvus_connect_param\": {\n \"uri\":\"http://localhost:19530\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"state\": \"Running\"\n }\n ]\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"pause\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"resume\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"get\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"Task\": {\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"milvus_connect_param\": {\n \"connect_timeout\": 10,\n \"uri\":\"http://localhost:19530\"\n },\n \"state\": \"Running\",\n \"task_id\": \"xxxx\"\n }\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"delete\",\n \"request_data\": {\n \"task_id\": \"30d1e325df604ebb99e14c2a335a1421\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n"],"headingContent":"Manage CDC Tasks","anchorList":[{"label":"Управление задачами CDC","href":"Manage-CDC-Tasks","type":1,"isActive":false},{"label":"Создание задачи","href":"Create-a-task","type":2,"isActive":false},{"label":"Список задач","href":"List-tasks","type":2,"isActive":false},{"label":"Приостановить задачу","href":"Pause-a-task","type":2,"isActive":false},{"label":"Возобновить задачу","href":"Resume-a-task","type":2,"isActive":false},{"label":"Получить сведения о задаче","href":"Retrieve-task-details","type":2,"isActive":false},{"label":"Удалить задачу","href":"Delete-a-task","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.md new file mode 100644 index 000000000..c539a2382 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/manage-cdc-tasks.md @@ -0,0 +1,275 @@ +--- +id: manage-cdc-tasks.md +order: 3 +summary: >- + Задача Capture Data Change (CDC) позволяет синхронизировать данные из + исходного экземпляра Milvus в целевой экземпляр Milvus. +title: Управление задачами CDC +--- +

    Управление задачами CDC

    Задача Capture Data Change (CDC) позволяет синхронизировать данные с исходного экземпляра Milvus на целевой экземпляр Milvus. Она отслеживает журналы операций источника и реплицирует изменения данных, такие как вставки, удаления и операции с индексами, на целевой экземпляр в режиме реального времени. Это облегчает аварийное восстановление в реальном времени или активно-активное распределение нагрузки между развертываниями Milvus.

    +

    В этом руководстве описано управление задачами CDC, включая создание, приостановку, возобновление, получение подробной информации, создание списка и удаление через HTTP-запросы.

    +

    Создание задачи

    Создание задачи CDC позволяет синхронизировать операции по изменению данных в исходном Milvus с целевым Milvus.

    +

    Чтобы создать задачу CDC, выполните следующие действия:

    +
    curl -X POST http:_//localhost:8444/cdc \
    +-H "Content-Type: application/json" \
    +-d '{
    +  "request_type": "create",
    +  "request_data": {
    +    "milvus_connect_param": {
    +      "uri": "http://localhost:19530",
    +      "token":"root:Milvus",
    +      "connect_timeout": 10
    +    },
    +    "collection_infos": [
    +      {
    +        "name": "*"
    +      }
    +    ]
    +  }
    +}'
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Параметры:

    +
      +
    • milvus_connect_param: параметры подключения целевого Milvus.

      +
        +
      • host: Имя хоста или IP-адрес сервера Milvus.

      • +
      • порт: Номер порта, на котором прослушивается сервер Milvus.

      • +
      • username: Имя пользователя для аутентификации на сервере Milvus.

      • +
      • password: Пароль для аутентификации на сервере Milvus.

      • +
      • enable_tls: Использовать ли TLS/SSL-шифрование для соединения.

      • +
      • connect_timeout: Период таймаута в секундах для установления соединения.

      • +
    • +
    • collection_infos: Коллекции для синхронизации. В настоящее время поддерживается только звездочка(*), так как Milvus-CDC синхронизирует на уровне кластера, а не отдельных коллекций.

    • +
    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "task_id":"xxxx"
    +  }
    +}
    +
    +

    Список задач

    Чтобы перечислить все созданные задачи CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type": "list"
    +}' http://localhost:8444/cdc
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "tasks": [
    +      {
    +        "task_id": "xxxxx",
    +        "milvus_connect_param": {
    +          "uri":"http://localhost:19530",
    +          "connect_timeout": 10
    +        },
    +        "collection_infos": [
    +          {
    +            "name": "*"
    +          }
    +        ],
    +        "state": "Running"
    +      }
    +    ]
    +  }
    +}
    +
    +

    Приостановить задачу

    Чтобы приостановить задачу CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"pause",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Параметры:

    +
      +
    • task_id: Идентификатор задачи CDC, которую нужно приостановить.
    • +
    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    Возобновить задачу

    Чтобы возобновить приостановленную задачу CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"resume",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Параметры:

    +
      +
    • task_id: Идентификатор задачи CDC, которую необходимо возобновить.
    • +
    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    Получить сведения о задаче

    Чтобы получить сведения о конкретной задаче CDC:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"get",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Параметры:

    +
      +
    • task_id: Идентификатор задачи CDC для запроса.
    • +
    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "Task": {
    +      "collection_infos": [
    +        {
    +          "name": "*"
    +        }
    +      ],
    +      "milvus_connect_param": {
    +        "connect_timeout": 10,
    +        "uri":"http://localhost:19530"
    +      },
    +      "state": "Running",
    +      "task_id": "xxxx"
    +    }
    +  }
    +}
    +
    +

    Удалить задачу

    Чтобы удалить задачу CDC, выполните следующие действия:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"delete",
    +  "request_data": {
    +    "task_id": "30d1e325df604ebb99e14c2a335a1421"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    Замените localhost на IP-адрес целевого сервера Milvus.

    +

    Параметры:

    +
      +
    • task_id: Идентификатор задачи CDC для удаления.
    • +
    +

    Ожидаемый ответ:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.json new file mode 100644 index 000000000..a82ec72af --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview","anchorList":[{"label":"Обзор","href":"Overview","type":1,"isActive":false},{"label":"Ключевые возможности","href":"Key-capabilities","type":2,"isActive":false},{"label":"Архитектура","href":"Architecture","type":2,"isActive":false},{"label":"Рабочий процесс","href":"Workflow","type":2,"isActive":false},{"label":"Лимиты","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.md new file mode 100644 index 000000000..b7b9ecf89 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-cdc/milvus-cdc-overview.md @@ -0,0 +1,125 @@ +--- +id: milvus-cdc-overview.md +order: 1 +summary: >- + Milvus-CDC - это удобный инструмент для сбора и синхронизации инкрементных + данных в экземплярах Milvus. +title: Обзор CDC +--- +

    Обзор

    Milvus-CDC - это удобный инструмент для захвата и синхронизации инкрементных данных в экземплярах Milvus. Он обеспечивает надежность бизнес-данных, беспрепятственно перенося их между исходным и целевым экземплярами, позволяя легко выполнять инкрементное резервное копирование и аварийное восстановление.

    +

    Ключевые возможности

      +
    • Последовательная синхронизация данных: Обеспечивает целостность и непротиворечивость данных за счет последовательной синхронизации изменений данных между экземплярами Milvus.

    • +
    • Инкрементная репликация данных: Реплицирует инкрементные данные, включая вставки и удаления, из исходного Milvus в целевой Milvus, обеспечивая постоянное хранение.

    • +
    • Управление задачами CDC: Позволяет управлять задачами CDC с помощью запросов OpenAPI, включая создание, запрос статуса и удаление задач CDC.

    • +
    +

    Кроме того, в будущем мы планируем расширить наши возможности и включить поддержку интеграции с системами потоковой обработки.

    +

    Архитектура

    Milvus-CDC использует архитектуру с двумя основными компонентами - HTTP-сервером, который управляет задачами и метаданными, и corelib, который синхронизирует выполнение задач с читателем, получающим данные из исходного экземпляра Milvus, и писателем, отправляющим обработанные данные в целевой экземпляр Milvus.

    +

    + + milvus-cdc-architecture + Архитектура milvus-cdc-архитектуры

    +

    На предыдущей диаграмме,

    +
      +
    • HTTP-сервер: Обрабатывает запросы пользователей, выполняет задачи и поддерживает метаданные. Он служит плоскостью управления для оркестровки задач в системе Milvus-CDC.

    • +
    • Corelib: Отвечает за фактическую синхронизацию задач. Он включает в себя компонент чтения, который получает информацию из etcd и очереди сообщений (MQ) исходного Milvus, и компонент записи, который переводит сообщения из MQ в параметры API для системы Milvus и отправляет эти запросы целевому Milvus для завершения процесса синхронизации.

    • +
    +

    Рабочий процесс

    Поток обработки данных Milvus-CDC включает в себя следующие шаги:

    +
      +
    1. Создание задачи: Пользователи инициируют задачу CDC с помощью HTTP-запросов.

    2. +
    3. Извлечение метаданных: Система получает метаданные, относящиеся к коллекции, из источника Milvus's etcd, включая информацию о канале и контрольной точке коллекции.

    4. +
    5. Подключение MQ: Имея под рукой метаданные, система подключается к MQ, чтобы начать подписку на поток данных.

    6. +
    7. Обработка данных: Данные из MQ считываются, разбираются и либо передаются с помощью Go SDK, либо обрабатываются для повторения операций, выполняемых в исходном Milvus.

    8. +
    +

    + + milvus-cdc-workflow + milvus-cdc-workflow

    +

    Лимиты

      +
    • Инкрементная синхронизация данных: На данный момент Milvus-CDC предназначен для синхронизации только инкрементных данных. Если вашему предприятию требуется полное резервное копирование данных, обратитесь к нам за помощью.

    • +
    • Объем синхронизации: В настоящее время Milvus-CDC может синхронизировать данные на уровне кластера. Мы работаем над добавлением поддержки синхронизации данных на уровне коллекции в ближайших выпусках.

    • +
    • Поддерживаемые API-запросы: В настоящее время Milvus-CDC поддерживает следующие API-запросы. Мы планируем расширить поддержку дополнительных запросов в будущих выпусках:

      +
        +
      • Создание/Удаление коллекции

      • +
      • Вставка/удаление/пополнение

      • +
      • Создать/Удалить раздел

      • +
      • Создание/удаление индекса

      • +
      • Загрузка/освобождение/промывка

      • +
      • Загрузка/освобождение раздела

      • +
      • Создать/удалить базу данных

      • +
    • +
    diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.json b/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.json new file mode 100644 index 000000000..a21d4e859 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.json @@ -0,0 +1 @@ +{"codeList":["http://${MILVUS_PROXY_IP}:9091/webui\n"],"headingContent":"Milvus WebUI","anchorList":[{"label":"Milvus WebUI","href":"Milvus-WebUI","type":1,"isActive":false},{"label":"Обзор","href":"Overview","type":2,"isActive":false},{"label":"Features","href":"Features","type":2,"isActive":false},{"label":"Главная","href":"Home","type":2,"isActive":false},{"label":"Коллекции","href":"Collections","type":2,"isActive":false},{"label":"Запрос","href":"Query","type":2,"isActive":false},{"label":"Данные","href":"Data","type":2,"isActive":false},{"label":"Задачи","href":"Tasks","type":2,"isActive":false},{"label":"Медленные запросы","href":"Slow-requests","type":2,"isActive":false},{"label":"Конфигурации","href":"Configurations","type":2,"isActive":false},{"label":"Инструменты","href":"Tools","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.md b/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.md new file mode 100644 index 000000000..316fdaaa3 --- /dev/null +++ b/localization/v2.5.x/site/ru/userGuide/tools/milvus-webui.md @@ -0,0 +1,290 @@ +--- +id: milvus-webui.md +summary: >- + Milvus Web UI - это графический инструмент управления для Milvus. Он улучшает + наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. Вы + можете +title: Milvus WebUI +--- +

    Milvus WebUI

    Milvus Web UI - это графический инструмент управления для Milvus. Он повышает наблюдаемость системы благодаря простому и интуитивно понятному интерфейсу. С помощью Milvus Web UI можно просматривать статистику и метрики компонентов и зависимостей Milvus, проверять детали базы данных и коллекции, а также выводить список подробных конфигураций Milvus.

    +

    Обзор

    Milvus Web UI отличается от Birdwatcher и Attu тем, что это встроенный инструмент, обеспечивающий общую наблюдаемость системы с помощью простого и интуитивно понятного интерфейса.

    +

    В следующей таблице приведено сравнение возможностей Milvus Web UI и Birdwatcher/Attu:

    + + + + + + + + + + + + +
    ХарактеристикаMilvus Web UIBirdwatcherAttu
    Операционная формаGUICLIGUI
    Целевые пользователиМейнтейнеры, разработчикиМейнтейнерыРазработчики
    УстановкаВстроенныйАвтономный инструментАвтономный инструмент
    ЗависимостиMilvusMilvus / etcdMilvus
    Основные функциональные возможностиСреда выполнения, детали базы данных/коллекции, сегменты, каналы, задачи и медленные запросыПроверка метаданных и выполнение Milvus APIУправление базой данных и оперативные задачи
    Доступно сv2.5.0v2.0.0v0.1.8
    +

    Начиная с версии 2.5.0, вы можете получить доступ к Milvus Web UI, используя следующий URL на работающем экземпляре Milvus:

    +
    http://${MILVUS_PROXY_IP}:9091/webui
    +
    +

    Features

    Milvus Web UI предоставляет следующие возможности:

    +

    + + Milvus Web UI overview + Обзор Milvus Web UI

    +
      +
    • Главная страница

      +

      Вы можете найти информацию о текущем запущенном экземпляре Milvus, его компонентах, подключенных клиентах и зависимостях.

    • +
    • Коллекции

      +

      Вы можете просмотреть список баз данных и коллекций, находящихся в Milvus, и проверить их детали.

    • +
    • Запрос

      +

      Вы можете просмотреть собранную статистику узлов запросов и координаторов запросов по сегментам, каналам, репликам и группам ресурсов.

    • +
    • Данные

      +

      Вы можете просмотреть собранную статистику узлов данных в терминах сегментов и каналов.

    • +
    • Задачи

      +

      Вы можете просмотреть список задач, запущенных в Milvus, включая задачи планировщика Querycoord, задачи уплотнения, задачи построения индексов, задачи импорта и задачи синхронизации данных.

    • +
    • Медленные запросы

      +

      Вы можете просмотреть список медленных запросов в Milvus, включая тип запроса, длительность запроса и параметры запроса.

    • +
    • Конфигурации

      +

      Вы можете просмотреть список конфигураций Milvus и их значения.

    • +
    • Инструменты

      +

      Из веб-интерфейса можно получить доступ к двум встроенным инструментам, pprof и инструменту визуализации данных Milvus.

    • +
    +

    Главная

    На главной странице вы можете найти следующую информацию:

    +

    + + Milvus Web UI Home + Milvus Web UI Home

    +
      +
    • Информация о системе: Просмотр информации о системе, включая сведения о режиме развертывания, образе, используемом при развертывании, и сопутствующей информации.

    • +
    • Информация о компонентах: Просмотр состояния и метрик компонентов Milvus, включая состояние и метрики узлов запросов, узлов данных, узлов индексов, координаторов и прокси.

    • +
    • Подключенные клиенты: Просмотр подключенных клиентов и информации о них, включая тип и версию SDK, имя пользователя и историю доступа.

    • +
    • Системные зависимости: Просмотр состояния и метрик зависимостей Milvus, включая состояние и метрики метахранилища, очереди сообщений и хранилища объектов.

    • +
    +

    Коллекции

    На странице "Коллекции" можно просмотреть список баз данных и коллекций, находящихся в Milvus, и узнать их подробную информацию.

    +

    + + Milvus Web UI Collections + Коллекции Milvus Web UI

    +
      +
    • База данных: Просмотр списка баз данных, находящихся в Milvus, и сведений о них.

    • +
    • Коллекция: Просмотр списка коллекций в каждой базе данных и их подробной информации.

      +

      Вы можете щелкнуть коллекцию, чтобы просмотреть ее детали, включая количество полей, разделы, индексы и другую подробную информацию.

      +

      + + Milvus Web UI Collection Details + Milvus Web UI Сведения о коллекции

    • +
    +

    Запрос

    + + Milvus Web UI Query Page + Страница запроса в Milvus Web UI

    +
      +
    • Сегменты: Просмотр списка сегментов и их подробной информации, включая идентификатор сегмента, соответствующую коллекцию, состояние, размер и т. д.

    • +
    • Каналы: Просмотр списка каналов и их подробной информации, включая название канала, соответствующие коллекции и т. д.

    • +
    • Реплики: Просмотр списка реплик и их сведений, включая идентификатор реплики, соответствующую коллекцию и т. д.

    • +
    • Группы ресурсов: Просмотр списка групп ресурсов и их сведений, включая имя группы ресурсов, количество узлов запросов в группе, ее конфигурации и т. д.

    • +
    +

    Данные

    + + Milvus Web UI Data Page + Страница данных Milvus Web UI

    +
      +
    • Сегменты: Просмотр списка сегментов из узлов данных/координаторов и их подробной информации, включая идентификатор сегмента, соответствующую коллекцию, состояние, размер и т. д.

    • +
    • Каналы: Просмотр списка каналов из узлов/координаторов данных и их подробной информации, включая название канала, соответствующие коллекции и т. д.

    • +
    +

    Задачи

    + + Milvus Web UI Tasks Page + Страница задач Milvus Web UI

    +
      +
    • Задачи: Просмотр списка задач, запущенных в Milvus, включая тип задачи, состояние и действия.

      +
        +
      • Задачи QueryCoord: Просмотр всех задач планировщика QueryCoord, включая задачи балансировщика, проверки индексов/сегментов/каналов/лидеров за последние 15 минут.

      • +
      • Compaction Tasks (Задачи уплотнения): Просмотр всех задач по уплотнению данных от координаторов данных за последние 15 минут.

      • +
      • Index-Building Tasks: Просмотр всех задач построения индексов от координаторов данных за последние 30 минут.

      • +
      • Import Tasks (Задачи импорта): Просмотр всех задач импорта от координаторов данных за последние 30 минут.

      • +
      • Задачи синхронизации данных: Просмотр всех задач синхронизации данных от узлов данных за последние 15 минут.

      • +
    • +
    +

    Медленные запросы

    + + Milvus Web UI Slow Requests Page + Страница медленных запросов Milvus Web UI

    +
      +
    • Медленные запросы: Медленный запрос - это поиск или запрос, задержка которого превышает значение proxy.slowQuerySpanInSeconds, указанное в конфигурации. В списке медленных запросов отображаются все медленные запросы за последние 15 минут.
    • +
    +

    Конфигурации

    + + Milvus Web UI Configurations Page + Страница конфигураций Milvus Web UI

    +
      +
    • Конфигурации: Просмотр списка конфигураций времени выполнения Milvus и их значений.
    • +
    +

    Инструменты

      +
    • pprof: доступ к инструменту pprof для профилирования и отладки Milvus.

    • +
    • Инструмент визуализации данных Milvus: Доступ к инструменту визуализации данных Milvus для визуализации данных в Milvus.

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/about/comparison.json b/localization/v2.5.x/site/zh-hant/about/comparison.json new file mode 100644 index 000000000..295bb26a5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/comparison.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Comparing Milvus with Alternatives","anchorList":[{"label":"比較 Milvus 與其他選擇","href":"Comparing-Milvus-with-Alternatives","type":1,"isActive":false},{"label":"Milvus 的重點","href":"Milvus-highlights","type":2,"isActive":false},{"label":"整體比較","href":"Overall-comparison","type":2,"isActive":false},{"label":"術語比較","href":"Terminology-comparison","type":2,"isActive":false},{"label":"能力比較","href":"Capability-comparison","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/about/comparison.md b/localization/v2.5.x/site/zh-hant/about/comparison.md new file mode 100644 index 000000000..73c90c3f0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/comparison.md @@ -0,0 +1,159 @@ +--- +id: comparison.md +title: 比較 +summary: 本文將比較 Milvus 與其他向量搜尋解決方案。 +--- +

    比較 Milvus 與其他選擇

    在探索各種向量資料庫選項時,這份全面的指南將協助您瞭解 Milvus 的獨特功能,確保您選擇最適合您特定需求的資料庫。值得注意的是,Milvus 是領先的開放原始碼向量資料庫,Zilliz Cloud提供全面管理的 Milvus 服務。若要客觀評估 Milvus 與其競爭對手的差異,請考慮使用基準工具來分析效能指標。

    +

    Milvus 的重點

      +
    • 功能性:Milvus 支援稀疏向量、大量向量、篩選搜尋混合搜尋功能等進階功能,超越了基本向量相似性搜尋的範圍。

    • +
    • 彈性:Milvus 適合各種部署模式和多種 SDK,所有這些都在一個強大、整合的生態系統中。

    • +
    • 效能:Milvus 透過HNSWDiskANN 等最佳化索引演算法,以及先進的GPU 加速,保證以高吞吐量和低延遲進行即時處理。

    • +
    • 可擴充性:其訂製的分散式架構可輕鬆擴充,從小型資料集到超過 100 億向量的資料集合,皆可應付自如。

    • +
    +

    整體比較

    為了比較 Milvus 和 Pinecone 這兩種向量資料庫解決方案,以下表格的結構突顯了各種功能的差異。

    + + + + + + + + + + + + + +
    特徵PineconeMilvus備註
    部署模式僅 SaaSMilvus Lite、On-prem Standalone & Cluster、Zilliz Cloud Saas & BYOCMilvus 提供更靈活的部署模式。
    支援的 SDKPython、JavaScript/TypeScriptPython, Java, NodeJS, Go, Restful API, C#, RustMilvus 支援更多的程式語言。
    開源狀態關閉開放源碼Milvus 是一個廣受歡迎的開放原始碼向量資料庫。
    擴充性僅向上/向下擴充縮放/縮入與放大/縮小Milvus 採用分散式架構以增強擴充能力。
    可用性可用區域內的 Pod 架構可用區域故障移轉和跨區域 HAMilvus CDC (變更資料擷取) 可實現主用/備用模式,以提高可用性。
    效能成本 (每百萬次查詢)中型資料集 0.178 美元起,大型資料集 1.222 美元起Zilliz Cloud 中型資料集起價為 0.148 美元,大型資料集起價為 0.635 美元;提供免費版本。請參閱成本排名報告
    GPU 加速不支援支援 NVIDIA GPUGPU 加速可大幅提升效能,通常可提升幾個數量級。
    +

    術語比較

    雖然兩者的向量資料庫功能類似,但 Milvus 與 Pinecone 在特定領域的術語上略有不同。詳細的術語比較如下。

    + + + + + + + + + + + + +
    PineconeMilvus備註
    索引收集在 Pinecone 中,索引是儲存和管理相同大小向量的組織單位,這個索引與硬體(稱為 Pods)緊密結合。相比之下,Milvus 的集合具有類似的目的,但可以在單一實例中處理多個集合。
    集合備份在 Pinecone 中,集合基本上是索引的靜態快照,主要用於備份目的,且無法查詢。在 Milvus 中,建立備份的等效功能更透明,命名也更直接。
    命名空間分割鍵命名空間允許把索引中的向量分割成子集。Milvus 提供多種方法,如分割或分割鍵,以確保在一個集合內有效的資料隔離。
    元資料標量欄位Pinecone 的元資料處理依賴於 key-value 對,而 Milvus 則允許複雜的標量欄位,包括標準資料類型和動態 JSON 欄位。
    查詢搜尋用來尋找指定向量最近鄰的方法名稱,可能還會在上面套用一些額外的篩選條件。
    不可用迭代器Pinecone 缺乏迭代索引中所有向量的功能。Milvus 引入了 Search Iterator 和 Query Iterator 方法,增強了跨資料集的資料檢索能力。
    +

    能力比較

    + + + + + + + + + + + + +
    能力比較PineconeMilvus
    部署模式僅 SaaSMilvus Lite、On-prem Standalone & Cluster、Zilliz Cloud Saas & BYOC
    嵌入功能不可用支援pymilvus[model]
    資料類型字串、數字、Bool、字串清單字串、VarChar、Number (Int、Float、Double)、Bool、陣列、JSON、浮點向量、二進制向量、BFloat16、Float16、稀疏向量
    度量與索引類型Cos, Dot, Euclidean
    P-family, S-family
    Cosine, IP (Dot), L2 (Euclidean), Hamming, Jaccard
    FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, HNSW, SCANN, GPU 索引
    模式設計彈性模式彈性模式、嚴格模式
    多重向量欄位不適用多向量與混合搜尋
    工具資料集、文字工具、Spark 連接器Attu、Birdwatcher、Backup、CLI、CDC、Spark 和 Kafka 連結器
    +

    主要觀點

      +
    • 部署模式:Milvus 提供多種部署方式,包括本機部署、Docker、Kubernetes on-premises、雲端 SaaS,以及針對企業的自帶雲端 (BYOC),而 Pinecone 則僅限於 SaaS 部署。

    • +
    • 嵌入功能:Milvus 支援額外的嵌入函式庫,可直接使用嵌入模型將源資料轉換為向量。

    • +
    • 資料類型:Milvus 支援的資料類型比 Pinecone 更廣泛,包括陣列和 JSON。Pinecone 只支援以字串、數字、布林值或字串清單為值的平面元資料結構,而 Milvus 可以處理 JSON 欄位內的任何 JSON 物件,包括巢狀結構。Pinecone 限制每個向量的元資料大小為 40KB。

    • +
    • 度量和索引類型:Milvus 支援多種公制和索引類型,以滿足各種使用情況,而 Pinecone 的選擇則較為有限。在 Milvus 中,向量的索引是強制性的,而 AUTO_INDEX 選項則可簡化設定流程。

    • +
    • 模式設計:Milvus 為模式設計提供彈性的create_collection 模式,包括快速設定動態模式,提供類似 Pinecone 的無模式體驗,以及自訂設定預定義的模式欄位和索引,類似關聯式資料庫管理系統 (RDBMS)。

    • +
    • 多重向量欄位:Milvus 可在單一集合中儲存多個向量欄位,這些欄位可以是稀疏或密集的,而且維度可能會有所不同。Pinecone 並未提供類似的功能。

    • +
    • 工具:Milvus 為資料庫管理和使用提供了更廣泛的工具選擇,例如 Attu、Birdwatcher、Backup、CLI、CDC 以及 Spark 和 Kafka Connector。

    • +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/about/limitations.json b/localization/v2.5.x/site/zh-hant/about/limitations.json new file mode 100644 index 000000000..e65fd6463 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/limitations.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Limits","anchorList":[{"label":"Milvus 限制","href":"Milvus-Limits","type":1,"isActive":false},{"label":"資源名稱的長度","href":"Length-of-a-resource-name","type":2,"isActive":false},{"label":"命名規則","href":"Naming-rules","type":2,"isActive":false},{"label":"資源數量","href":"Number-of-resources","type":2,"isActive":false},{"label":"集合中的資源數量","href":"Number-of-resources-in-a-collection","type":2,"isActive":false},{"label":"字串長度","href":"Length-of-a-string","type":2,"isActive":false},{"label":"向量的尺寸","href":"Dimensions-of-a-vector","type":2,"isActive":false},{"label":"每個 RPC 的輸入和輸出","href":"Input-and-Output-per-RPC","type":2,"isActive":false},{"label":"載入限制","href":"Load-limits","type":2,"isActive":false},{"label":"搜尋限制","href":"Search-limits","type":2,"isActive":false},{"label":"不同搜尋類型的索引限制","href":"Index-limits-on-different-search-types","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/about/limitations.md b/localization/v2.5.x/site/zh-hant/about/limitations.md new file mode 100644 index 000000000..96bbf7f54 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/limitations.md @@ -0,0 +1,260 @@ +--- +id: limitations.md +title: Milvus 限制 +related_key: Limitations +summary: 了解使用 Milvus 時的限制。 +--- +

    Milvus 限制

    Milvus 致力於提供最好的向量資料庫,以支援人工智慧應用程式和向量相似性搜尋。然而,Milvus 團隊仍在不斷努力,以帶來更多的功能和最好的工具來增強用戶體驗。本頁列出使用者在使用 Milvus 時可能會遇到的一些已知限制。

    +

    資源名稱的長度

    + + + + + + + + + +
    資源限制
    收集255 個字元
    欄位255 個字元
    索引255 個字元
    分區255 個字元
    +

    命名規則

    資源名稱可包含數字、字母和底線 (_)。資源名稱必須以字母或底線 (_) 開頭。

    +

    資源數量

    + + + + + + + +
    資源限制
    收集65,536
    連線 / 代理65,536
    +

    集合中的資源數量

    + + + + + + + + + + +
    資源限制
    分區1,024
    分片16
    欄位64
    索引1
    實體無限制
    +

    字串長度

    + + + + + + +
    資料類型限制
    VARCHAR65,535
    +

    向量的尺寸

    + + + + + + +
    屬性極限
    尺寸32,768
    +

    每個 RPC 的輸入和輸出

    + + + + + + + + +
    操作極限
    插入64 MB
    搜尋64 MB
    查詢64 MB
    +

    載入限制

    在目前的版本中,要載入的資料必須低於所有查詢節點總記憶體資源的 90%,以便為執行引擎保留記憶體資源。

    +

    搜尋限制

    + + + + + + + +
    向量限制
    topk (返回最相似結果的數量)16,384
    nq (搜尋請求的數量)16,384
    +

    不同搜尋類型的索引限制

    下表概述了不同索引類型對各種搜尋行為的支援。

    + + + + + + + + + + + + + + + + + +
    HNSWDISKANN平面IVF_FLATIVF_SQ8IVF_PQSCANNGPU_IFV_FLATGPU_IVF_PQGPU_CAGRAGpu_brute_forcesparse_inverted_indexSPARSE_WANDBIN_FLATBIN_IVF_FLAT
    基本搜尋
    分區搜尋
    基本搜尋與原始資料擷取
    基本搜尋與分頁
    篩選搜尋
    範圍搜尋
    群組搜尋
    使用迭代器搜尋
    混合搜尋是(僅 RRFRanker)是(僅 RRFRanker)
    查詢/獲取
    使用迭代器查詢
    diff --git a/localization/v2.5.x/site/zh-hant/about/milvus_adopters.json b/localization/v2.5.x/site/zh-hant/about/milvus_adopters.json new file mode 100644 index 000000000..6dda1bb48 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/milvus_adopters.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Adopters","anchorList":[{"label":"Milvus 採用者","href":"Milvus-Adopters","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/about/milvus_adopters.md b/localization/v2.5.x/site/zh-hant/about/milvus_adopters.md new file mode 100644 index 000000000..898bbc3bd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/milvus_adopters.md @@ -0,0 +1,27 @@ +--- +id: milvus_adopters.md +title: Milvus 採用者 +related_key: Milvus adopters +summary: 了解已在生產應用中採用 Milvus 的公司。 +--- +

    Milvus 採用者

    Milvus 是企業用戶中領先的向量資料庫,獲得了 Nvidia、Roblox、AT&T 等知名公司的認可。以下是已成功將 Milvus 整合至其應用程式的企業名單。

    +

    + + Milvus Adopters + Milvus 採用者

    +

    請造訪我們的Milvus 使用案例頁面,瞭解業界領導者如何利用 Milvus 來強化他們的 AI 應用程式,並加速業務成長。

    diff --git a/localization/v2.5.x/site/zh-hant/about/overview.json b/localization/v2.5.x/site/zh-hant/about/overview.json new file mode 100644 index 000000000..8ff2c88c1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"What is Milvus?","anchorList":[{"label":"Milvus 是什麼?","href":"What-is-Milvus","type":1,"isActive":false},{"label":"非結構化資料、嵌入式與 Milvus","href":"Unstructured-Data-Embeddings-and-Milvus","type":2,"isActive":false},{"label":"是什麼讓 Milvus 如此快速?","href":"What-Makes-Milvus-so-Fast","type":2,"isActive":false},{"label":"是什麼讓 Milvus 具備如此高的可擴展性?","href":"What-Makes-Milvus-so-Scalable","type":2,"isActive":false},{"label":"Milvus 支援的搜尋類型","href":"Types-of-Searches-Supported-by-Milvus","type":2,"isActive":false},{"label":"全面的功能集","href":"Comprehensive-Feature-Set","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/about/overview.md b/localization/v2.5.x/site/zh-hant/about/overview.md new file mode 100644 index 000000000..c0039a535 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/overview.md @@ -0,0 +1,177 @@ +--- +id: overview.md +title: 什麼是 Milvus +related_key: Milvus Overview +summary: >- + Milvus + 是一種高效能、高度可擴充的向量資料庫,可在從筆記型電腦到大型分散式系統等各種環境中有效率地執行。它既可以開放原始碼軟體的形式提供,也可以雲端服務的形式提供。 +--- +

    Milvus 是什麼?

    Milvus 是一個高效能、高度可擴充的向量資料庫,可在從筆記型電腦到大型分散式系統等各種環境中有效率地執行。它同時以開源軟體和雲端服務的形式提供。

    +

    Milvus 是 LF AI & Data Foundation 的開源專案,以 Apache 2.0 授權釋出。大多數的貢獻者都是來自高效能運算 (HPC) 社群的專家,專精於建立大型系統和優化硬體感知程式碼。核心貢獻者包括來自 Zilliz、ARM、NVIDIA、AMD、Intel、Meta、IBM、Salesforce、阿里巴巴和微軟的專業人士。

    +

    非結構化資料、嵌入式與 Milvus

    非結構化資料,例如文字、圖片和音訊,格式各異,並帶有豐富的基本語意,因此分析起來極具挑戰性。為了管理這種複雜性,我們使用 embeddings 將非結構化資料轉換成可捕捉其基本特徵的數值向量。這些向量隨後會儲存在向量資料庫中,以實現快速、可擴展的搜尋和分析。

    +

    Milvus 提供強大的資料建模功能,讓您能夠將非結構化資料或多模式資料組織成結構化的集合。它支援各種不同屬性建模的資料類型,包括常見的數值和字元類型、各種向量類型、陣列、集合和 JSON,讓您省去維護多個資料庫系統的麻煩。

    +

    + + Untructured data, embeddings, and Milvus + 非結構化資料、嵌入與 Milvus

    +

    Milvus 提供三種部署模式,涵蓋各種資料規模 - 從 Jupyter Notebooks 中的本機原型,到管理數百億向量的大型 Kubernetes 集群:

    +
      +
    • Milvus Lite 是一個 Python 函式庫,可輕鬆整合至您的應用程式。Milvus Lite 是 Milvus 的輕量版,非常適合在 Jupyter Notebooks 中快速建立原型,或在資源有限的邊緣裝置上執行。瞭解更多資訊
    • +
    • Milvus Standalone 是單機伺服器部署,所有元件都綁定在單一 Docker 映像檔中,方便部署。進一步瞭解
    • +
    • Milvus Distributed 可部署在 Kubernetes 集群上,其雲端原生架構專為十億級或更大規模的場景而設計。此架構可確保關鍵元件的備援。進一步瞭解
    • +
    +

    是什麼讓 Milvus 如此快速?

    Milvus 從一開始就被設計成高效率的向量資料庫系統。在大多數情況下,Milvus 的效能比其他向量資料庫高出 2 至 5 倍 (請參閱 VectorDBBench 結果)。這種高效能是幾個關鍵設計決策的結果:

    +

    硬體感知最佳化:為了讓 Milvus 適用於各種硬體環境,我們特別針對許多硬體架構和平台優化了其效能,包括 AVX512、SIMD、GPU 和 NVMe SSD。

    +

    進階搜尋演算法:Milvus 支援廣泛的記憶體內與磁碟上索引/搜尋演算法,包括 IVF、HNSW、DiskANN 等,這些演算法都經過深度最佳化。與 FAISS 和 HNSWLib 等熱門實作相比,Milvus 的效能提升了 30%-70%。

    +

    C++ 搜尋引擎:向量資料庫超過 80% 的效能取決於其搜尋引擎。由於 C++ 語言的高效能、低階最佳化和有效率的資源管理,Milvus 使用 C++ 來處理這個關鍵元件。最重要的是,Milvus 整合了許多硬體感知的程式碼最佳化,從匯編等級向量化到多執行緒平行化和排程,以充分發揮硬體能力。

    +

    面向列:Milvus 是一個面向列的向量資料庫系統。其主要優勢來自資料存取模式。在執行查詢時,面向列的資料庫只讀取查詢所涉及的特定欄位,而不是整行,這大大減少了存取的資料量。此外,針對以列為基礎的資料進行的作業可以輕鬆地向量化,讓作業可以一次套用整個列,進一步提升效能。

    +

    是什麼讓 Milvus 具備如此高的可擴展性?

    2022 年,Milvus 支援十億級向量;2023 年,Milvus 以一致的穩定性擴充至百億級向量,為超過 300 家主要企業的大型應用程式提供支援,包括 Salesforce、PayPal、Shopee、Airbnb、eBay、NVIDIA、IBM、AT&T、LINE、ROBLOX、Inflection 等。

    +

    Milvus 的雲原生與高度解耦的系統架構,可確保系統能隨著資料成長而持續擴充:

    +

    + + Highly decoupled system architecture of Milvus + Milvus 高度解耦的系統架構

    +

    Milvus 本身是完全無狀態的,因此可借助 Kubernetes 或公有雲輕鬆擴展。此外,Milvus 各個元件都有很好的解耦功能,其中最重要的三個任務 - 搜尋、資料插入和索引/壓縮 - 都被設計成容易並行化的流程,並將複雜的邏輯分離出來。這可確保相對應的查詢節點、資料節點和索引節點都能獨立擴充,以最佳化效能和成本效益。

    +

    Milvus 支援的搜尋類型

    Milvus 支援多種類型的搜尋功能,以滿足不同用例的需求:

    +
      +
    • ANN 搜尋:找出最接近您查詢向量的前 K 個向量。
    • +
    • 過濾搜尋:在指定過濾條件下執行 ANN 搜尋。
    • +
    • 範圍搜尋:尋找距離您的查詢向量指定半徑範圍內的向量。
    • +
    • 混合搜尋:根據多向量領域進行 ANN 搜尋。
    • +
    • 全文搜尋:根據 BM25 進行全文搜尋。
    • +
    • 重新排序:根據附加條件或輔助演算法調整搜尋結果的順序,精煉最初的 ANN 搜尋結果。
    • +
    • 擷取:依據主鍵擷取資料。
    • +
    • 查詢:使用特定的表達方式擷取資料。
    • +
    +

    全面的功能集

    除了上述的關鍵搜尋功能外,Milvus 還提供了一系列圍繞 ANN 搜尋實施的功能,以便您能充分利用其功能。

    +

    API 與 SDK

    +

    進階資料類型

    除了原始資料類型外,Milvus 還支援各種進階資料類型及其各自適用的距離度量。

    + +

    加速

      +
    • 搜尋演算法 Milvus 支援一組可調整的索引和搜尋演算法。如需詳細資訊,請參閱「記憶體內索引」、「磁碟上索引」和「GPU 索引」。

    • +
    • 分區和分區鍵值 分區是 Milvus 資料集中的子分區。您可以選擇標量欄位作為分割鍵,以獲得更好的搜尋效能。如需詳細資訊,請參閱管理分割區和 使用分割區金鑰

    • +
    • 可調整的一致性模型 一致性可確保每個 Milvus 節點或副本在特定時間寫入或讀取資料時,擁有相同的資料視圖。在 Milvus 中執行 ANN 搜尋時,您可以輕鬆調整一致性層級。如需詳細資訊,請參閱一致性

    • +
    • 高通量資料匯入 要匯入大量資料到 Milvus,而不是一個接一個地插入,請考慮使用我們的高通量資料匯入工具。詳情請參閱準備來源資料匯入資料

    • +
    • 多租用支援 Milvus 實現了許多面向多租用場景的功能,包括分區鑰匙、集群鑰匙等。詳情請參閱多租戶策略

    • +
    +

    安全性與授權

      +
    • 可調整的一致性模型 一致性確保每個 Milvus 節點或副本在特定時間寫入或讀取資料時,擁有相同的資料視圖。在 Milvus 中執行 ANN 搜尋時,您可以輕鬆調整一致性層級。如需詳細資訊,請參閱一致性

    • +
    • 資料隔離及資源控制 對於多租戶情境,資料隔離是基本的安全需求。Milvus 實現了多種功能來解決您的安全問題。如需詳細資訊,請參閱管理資源 群組群集壓縮

    • +
    +

    AI 整合

      +
    • 嵌入式模型整合 嵌入式模型將非結構化資料轉換成高維資料空間中的數值表示,以便您可以將它們儲存在 Milvus 中。目前 Python SDK PyMilvus 整合了多種嵌入模型,讓您可以快速將資料準備成向量嵌入。如需詳細資訊,請參閱嵌入概述

    • +
    • 重排模型 (Reranking Model Integrations) 在資訊檢索與生成式人工智慧領域中,重排器 (reranker) 是優化初始搜尋結果順序的重要工具。PyMilvus 也整合了幾個 reranking 模型來優化從初始搜尋返回結果的順序。詳情請參閱Rerankers 總覽

    • +
    • LangChain 與其他 AI 工具整合 在 GenAI 時代,LangChain 等工具獲得許多應用程式開發人員的關注。作為核心元件,Milvus 通常在這些工具中扮演向量儲存的角色。要了解如何將 Milvus 整合到您最喜愛的 AI 工具中,請參考我們的整合教學

    • +
    +

    工具與生態系統

      +
    • Attu Attu 是一個多合一的直覺式圖形使用者介面,可協助您管理 Milvus 及其儲存的資料。如需詳細資訊,請參閱Attu資源庫。

    • +
    • Birdwatcher Birdwatcher 是 Milvus 的調試工具。使用它連線到 etcd,您可以檢查 Milvus 系統的狀態或即時設定。如需詳細資訊,請參閱BirdWatcher

    • +
    • Promethus & Grafana 整合 Prometheus 是 Kubernetes 的開放原始碼系統監控與警示工具套件。Grafana 是可與所有資料來源連接的開放原始碼視覺化堆疊。您可以使用 Promethus & Grafana 作為監控服務提供者,以視覺化方式監控 Milvus 分散式的效能。詳情請參閱部署監控服務

    • +
    • Milvus 備份 Milvus 備份是一個允許使用者備份和還原 Milvus 資料的工具。它同時提供 CLI 和 API,以適合不同的應用情境。詳情請參閱Milvus 備份

    • +
    • Milvus Capture Data Change (CDC) Milvus-CDC 可以捕捉和同步 Milvus 實例中的增量數據,並通過源實例和目標實例之間的無縫傳輸來確保業務數據的可靠性,從而實現簡便的增量備份和災難恢復。詳情請參閱Milvus CDC

    • +
    • Milvus Connectors Milvus 已經規劃了一套連接器,讓您可以無縫整合 Milvus 與第三方工具,例如 Apache Spark。目前,您可以使用我們的 Spark Connector 將 Milvus 資料饋送至 Apache Spark 進行機器學習處理。如需詳細資訊,請參閱Spark-Milvus Connector

    • +
    • 矢量傳輸服務 (VTS) Milvus 提供了一套工具,讓您可以在 Milvus 實例和一堆資料來源之間傳輸資料,包括 Zilliz 集群、Elasticsearch、Postgres (PgVector) 和另一個 Milvus 實例。詳情請參閱遷移

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/about/roadmap.json b/localization/v2.5.x/site/zh-hant/about/roadmap.json new file mode 100644 index 000000000..f732f8385 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/roadmap.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Roadmap","anchorList":[{"label":"Milvus 路線圖","href":"Milvus-Roadmap","type":1,"isActive":false},{"label":"路線圖","href":"Roadmap","type":2,"isActive":false},{"label":"如何貢獻","href":"How-to-contribute","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/about/roadmap.md b/localization/v2.5.x/site/zh-hant/about/roadmap.md new file mode 100644 index 000000000..24c1caf80 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/about/roadmap.md @@ -0,0 +1,107 @@ +--- +id: roadmap.md +title: Milvus 路線圖 +related_key: Milvus roadmap +summary: Milvus 是一個開放原始碼的向量資料庫,專為人工智能應用程式打造。以下是我們的發展路線圖。 +--- +

    Milvus 路線圖

    歡迎來到 Milvus 路線圖!加入我們不斷提升和發展 Milvus 的旅程。我們很高興與您分享我們的成就、未來計畫,以及我們對未來的願景。我們的路線圖不只是一張即將推出的功能清單,它反映了我們對創新的承諾,以及我們與社群合作的決心。我們邀請您深入了解我們的路線圖、提供您的意見,並協助塑造 Milvus 的未來!

    +

    路線圖

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    類別Milvus 2.5.0 (在最近的版本中達成)下一版 (CY25 年中)未來路線圖(一年內)
    AI 驅動的非結構化資料處理
    強化使用 AI 模型和先進技術處理和分析非結構化資料的能力。
    全文檢索
    支援 Sparse-BM25 的全文檢索。新的 API 接受文本作為輸入,並在 Milvus 內自動生成稀疏向量

    Sparse Vector(GA)
    支援稀疏向量的高效儲存和索引方法
    Data-In and Data-Out
    支援主要模型服務以擷取原始資料

    AdvancedReranker
    支援以模型為基礎的 rerankers 及使用者自訂的評分函數

    JSON Enhancement
    JSON 索引及解析以加速處理過程
    原始資料輸入與資料輸出
    支援 Blob 與 url 參考以處理原始資料

    支援更多資料類型
    例如:Datetime、Map、GIS

    支援 Tensors
    支援向量清單,典型用法如 Colbert、Copali 等。
    搜尋品質與效能
    透過最佳化架構、演算法與 API,提供精確、相關且快速的搜尋結果
    文字匹配功能
    快速篩選文字/varchar 中的關鍵字/符號

    增強群組搜尋
    在混合搜尋中引入 group_size 並新增群組支援

    位圖索引與反向索引
    加速標籤篩選
    進階匹配
    例如:匹配短語、模糊匹配,以及更多的標記器

    彙總
    標量欄位彙總,例如:最小、最大、計數、分別。
    部分更新
    支援更新特定欄位的值

    排序能力
    在執行過程中依標量欄位排序

    支援資料聚類
    資料共址性
    豐富的功能與管理
    開發人員友善且強大的資料管理功能
    在資料匯入時支援 CSV 檔案
    Bulkinsert 支援 CSV 格式

    支援 Null 和 Default 值
    Null和 Default 類型使從其他 DBMS 匯入資料更容易

    Milvus WebUI (Beta)
    為 DBA 提供可視化管理工具
    主鍵重複刪除
    透過使用全局 pk 索引

    線上模式變更
    例如新增/刪除欄位、修改 varchar 長度

    資料版本管理與還原
    支援透過快照進行資料版本管理
    Rust 與 C++ SDK
    支援更多用戶端

    支援 UDF
    使用者自訂函式
    成本效益與架構
    最先進的系統,以穩定性、成本效益和可擴充性為優先考量
    按欄位加載
    選擇要加載的集合部分

    記憶體最佳化
    減少 OOM 並增強負載

    Streaming Node (Beta)
    提供全局一致性並解決根協調器上的效能瓶頸

    Storage Format V2 (Beta)
    通用格式設計與基於磁碟的資料存取基礎

    Clustering Compaction
    基於組態的資料再分配以加速讀取效能
    懶惰載入
    載入可由第一次讀取作業啟動,而無需明確呼叫 load()

    分層儲存
    支援冷熱儲存,以優化成本

    按區域釋出
    釋出部分集合,以減少記憶體使用

    串流節點 (GA)
    處理串流資料,並簡化架構
    移除依賴
    減少或消除對 pulsar、etcd 等外部元件的依賴

    將協調邏輯合併到 MixCoord
    簡化架構
    +
      +
    • 我們的路線圖通常分為三個部分:最近的版本、即將推出的下一個版本,以及未來一年內的中長期願景。
    • +
    • 隨著我們的進展,我們會不斷學習並偶爾調整重點,視需要增加或移除項目。
    • +
    • 這些計劃僅供參考,隨時可能變更,也可能因訂閱服務的不同而有所差異。
    • +
    • 我們會堅定不移地遵循我們的路線圖,並以我們的發行說明做為參考。
    • +
    +

    如何貢獻

    作為一個開源專案,Milvus依靠社區的貢獻而茁壯成長。以下是您如何參與我們的旅程。

    +

    分享回饋

    +

    程式碼貢獻

      +
    • 拉取請求:直接向我們的程式碼庫貢獻。無論是修正錯誤、新增功能或改善文件,我們都歡迎您的貢獻。

    • +
    • 開發指南:查看我們的「貢獻者指南」,瞭解有關代碼貢獻的指引。

    • +
    +

    傳播

      +
    • 社群分享:喜歡 Milvus 嗎?在社交媒體和技術博客上分享您的使用案例和經驗。

    • +
    • 在 GitHub 上星級我們:在我們的GitHub 儲存庫上賦予星級來表示您的支持。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/allocate.json b/localization/v2.5.x/site/zh-hant/adminGuide/allocate.json new file mode 100644 index 000000000..75b757f16 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/allocate.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi\n","helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi\n","dataNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\nqueryNode:\n resources:\n limits:\n cpu: \"4\"\n memory: \"16Gi\"\n requests:\n cpu: \"1\"\n memory: \"4Gi\"\n","helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml\n"],"headingContent":"Allocate Resources on Kubernetes","anchorList":[{"label":"在 Kubernetes 上分配資源","href":"Allocate-Resources-on-Kubernetes","type":1,"isActive":false},{"label":"1.檢視可用資源","href":"1-View-available-resources","type":2,"isActive":false},{"label":"2.分配資源","href":"2-Allocate-resources","type":2,"isActive":false},{"label":"3.套用配置","href":"3-Apply-configurations","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/allocate.md b/localization/v2.5.x/site/zh-hant/adminGuide/allocate.md new file mode 100644 index 000000000..7688f1f52 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/allocate.md @@ -0,0 +1,141 @@ +--- +id: allocate.md +title: 在 Kubernetes 上為 Milvus 分配資源 +summary: 瞭解如何在 Kubernetes 上為 Milvus 分配資源。 +--- +

    在 Kubernetes 上分配資源

    本主題描述如何在 Kubernetes 上分配資源給 Milvus 叢集。

    +

    一般而言,您在生產中分配給 Milvus 叢集的資源應與機器的工作量成正比。分配資源時,您也應該考慮機器類型。雖然您可以在群集執行時更新配置,但我們建議您在部署群集前設定這些值。

    +
    +

    有關如何使用 Milvus Operator 分配資源的資訊,請參閱使用 Milvus Operator 分配資源

    +
    +

    1.檢視可用資源

    執行kubectl describe nodes 檢視您已佈建的實體上的可用資源。

    +

    2.分配資源

    使用 Helm 為 Milvus 元件分配 CPU 和記憶體資源。

    +
    +使用 Helm 升級資源會導致執行中的 Pod 執行滾動更新。
    +

    有兩種方式可以分配資源:

    + +

    使用指令分配資源

    如果使用--set 更新資源配置,您需要為每個 Milvus 元件設定資源變數。

    + +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set standalone.resources.limits.cpu=2 --set standalone.resources.limits.memory=4Gi --set standalone.resources.requests.cpu=0.1 --set standalone.resources.requests.memory=128Mi
    +
    +
    +
    +
    helm upgrade my-release milvus/milvus --reuse-values --set dataNode.resources.limits.cpu=2 --set dataNode.resources.limits.memory=4Gi --set dataNode.resources.requests.cpu=0.1 --set dataNode.resources.requests.memory=128Mi
    +
    +
    +

    透過設定配置檔分配資源

    您也可以在resources.yaml 檔案中指定參數resources.requestsresources.limits 來分配 CPU 和記憶體資源。

    +
    dataNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +queryNode:
    +  resources:
    +    limits:
    +      cpu: "4"
    +      memory: "16Gi"
    +    requests:
    +      cpu: "1"
    +      memory: "4Gi"
    +
    +

    3.套用配置

    執行下列指令,將新的配置套用到您的 Milvus 叢集。

    +
    helm upgrade my-release milvus/milvus --reuse-values -f resources.yaml
    +
    +
    +如果未指定resources.limits ,pod 將消耗所有可用的 CPU 和記憶體資源。因此,請確保指定resources.requestsresources.limits ,以避免在同一實體上其他執行中的任務需要消耗更多記憶體時,出現資源過度分配的情況。
    +

    請參閱Kubernetes 文件,取得更多有關管理資源的資訊。

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.json b/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.json new file mode 100644 index 000000000..c457a6942 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.json @@ -0,0 +1 @@ +{"codeList":["...\ncommon:\n...\n security:\n authorizationEnabled: true\n...\n","...\nextraConfigFiles:\n user.yaml: |+\n common:\n security:\n authorizationEnabled: true\n...\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n common:\n security:\n authorizationEnabled: true\n","# use default `root` user to connect to Milvus\n\nfrom pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri='http://localhost:19530', # replace with your own Milvus server address\n token=\"root:Milvus\"\n) \n","# create a user\nclient.create_user(\n user_name=\"user_1\",\n password=\"P@ssw0rd\",\n)\n\n# verify the user has been created\n\nclient.describe_user(\"user_1\")\n\n# output\n# {'user_name': 'user_1', 'roles': ()}\n","# connect to milvus with the newly created user\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"user_1:P@ssw0rd\"\n)\n","# update password\n\nclient.update_password(\n user_name=\"user_1\",\n old_password=\"P@ssw0rd\",\n new_password=\"P@ssw0rd123\"\n)\n","common:\n security:\n superUsers: root, foo\n","client.drop_user(user_name=\"user_1\")\n","# list all users\n\nclient.list_users()\n"],"headingContent":"Authenticate User Access","anchorList":[{"label":"認證用戶訪問","href":"Authenticate-User-Access","type":1,"isActive":false},{"label":"啟用使用者驗證","href":"Enable-user-authentication","type":2,"isActive":false},{"label":"使用驗證連線到 Milvus","href":"Connect-to-Milvus-with-authentication","type":2,"isActive":false},{"label":"建立新使用者","href":"Create-a-new-user","type":2,"isActive":false},{"label":"使用新使用者連線到 Milvus","href":"Connect-to-Milvus-with-a-new-user","type":2,"isActive":false},{"label":"更新用戶密碼","href":"Update-user-password","type":2,"isActive":false},{"label":"刪除使用者","href":"Drop-a-user","type":2,"isActive":false},{"label":"列出所有使用者","href":"List-all-users","type":2,"isActive":false},{"label":"限制","href":"Limitations","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.md b/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.md new file mode 100644 index 000000000..b0c9c3d96 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/authenticate.md @@ -0,0 +1,277 @@ +--- +id: authenticate.md +summary: 了解如何在 Milvus 中管理使用者驗證。 +title: 認證用戶訪問 +--- +

    認證用戶訪問

    本指南解釋如何在 Milvus 中管理用戶認證,包括啟用認證、以用戶身份連接,以及修改用戶憑證。

    +
    +
      +
    • TLS 和用戶認證是兩種不同的安全方法。如果你在 Milvus 系統中同時啟用了用戶認證和 TLS,你必須提供用戶名、密碼和證書檔路徑。有關如何啟用 TLS 的資訊,請參閱傳輸中的加密

    • +
    • 本頁的程式碼片段使用新的MilvusClient(Python) 與 Milvus 互動。適用於其他語言的新 MilvusClient SDK 將於未來更新中發佈。

    • +
    +
    +

    啟用使用者驗證

    +
    +

    要為您的 Milvus 伺服器啟用使用者驗證,請在 Milvus 配置檔案milvus.yaml 中設定 common.security.authorizationEnabled 為 true。如需有關配置的更多資訊,請參閱Configure Milvus with Docker Compose

    +
    ...
    +common:
    +...
    +  security:
    +    authorizationEnabled: true
    +...
    +
    +
    +
    +

    若要為您的 Milvus 伺服器啟用使用者驗證,請在 Milvus 配置檔案中設定 authorizationEnabled 為 truevalues.yaml 。有關配置的詳細資訊,請參閱使用 Helm Charts 配置 Milvus

    +
    ...
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        authorizationEnabled: true
    +...
    +
    +
    +
    +

    要啟用認證,請在Milvus CRD 中設定spec.common.security.authorizationEnabledtrue 。關於 Milvus CRD 的更多資訊,請參考使用 Milvus Operator 配置 Milvus

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  config:
    +    common:
    +      security:
    +        authorizationEnabled: true
    +
    +
    +

    使用驗證連線到 Milvus

    啟用認證後,您需要使用使用者名稱和密碼連線到 Milvus。預設情況下,當 Milvus 啟動時,root 使用者會以密碼Milvus 建立。以下是如何使用預設root 使用者在啟用驗證後連線至 Milvus 的範例:

    +
    # use default `root` user to connect to Milvus
    +
    +from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri='http://localhost:19530', # replace with your own Milvus server address
    +    token="root:Milvus"
    +) 
    +
    +
    +如果您在啟用驗證連線到 Milvus 時未能提供有效的令牌,您將會收到 gRPC 錯誤。
    +

    建立新使用者

    以預設root 使用者身份連線後,您可以如下方式建立並驗證新使用者:

    +
    # create a user
    +client.create_user(
    +    user_name="user_1",
    +    password="P@ssw0rd",
    +)
    +
    +# verify the user has been created
    +
    +client.describe_user("user_1")
    +
    +# output
    +# {'user_name': 'user_1', 'roles': ()}
    +
    +

    關於建立使用者的更多資訊,請參考create_user()

    +

    使用新使用者連線到 Milvus

    使用新創建用戶的憑證進行連接:

    +
    # connect to milvus with the newly created user
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="user_1:P@ssw0rd"
    +)
    +
    +

    更新用戶密碼

    使用下面的代碼更改現有用戶的密碼:

    +
    # update password
    +
    +client.update_password(
    +    user_name="user_1",
    +    old_password="P@ssw0rd",
    +    new_password="P@ssw0rd123"
    +)
    +
    +

    關於更新使用者密碼的更多資訊,請參考update_password()

    +

    如果您忘記舊密碼,Milvus 提供一個設定項目,允許您指定某些使用者為超級使用者。這樣當您重新設定密碼時,就不需要舊密碼了。

    +

    預設情況下,Milvus 配置檔案中的common.security.superUsers 欄位是空的,這表示所有使用者在重設密碼時都必須提供舊密碼。不過,您可以指定特定使用者為不需要提供舊密碼的超級使用者。在下面的片段中,rootfoo 被指定為超級使用者。

    +

    您應該在管理 Milvus 實例運行的 Milvus 配置文件中添加以下配置項目。

    +
    common:
    +    security:
    +        superUsers: root, foo
    +
    +

    刪除使用者

    要刪除使用者,請使用drop_user() 方法。

    +
    client.drop_user(user_name="user_1")
    +
    +
    +要刪除用戶,您不能是被刪除的用戶。否則會產生錯誤。
    +

    列出所有使用者

    列出所有使用者。

    +
    # list all users
    +
    +client.list_users()
    +
    +

    限制

      +
    1. 使用者名稱不得為空,且長度不得超過 32 個字元。必須以字母開頭,且只包含下劃線、字母或數字。
    2. +
    3. 密碼必須至少有 6 個字元,長度不得超過 256 個字元。
    4. +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.json b/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.json new file mode 100644 index 000000000..d8a8d7b94 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.json @@ -0,0 +1 @@ +{"codeList":["queryNode:\n cache:\n warmup: async\n"],"headingContent":"Configure Chunk Cache","anchorList":[{"label":"配置分塊緩存","href":"Configure-Chunk-Cache","type":1,"isActive":false},{"label":"背景資料","href":"Background","type":2,"isActive":false},{"label":"配置分塊緩存","href":"Configure-Chunk-Cache","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.md b/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.md new file mode 100644 index 000000000..1bea9d6e7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/chunk_cache.md @@ -0,0 +1,77 @@ +--- +id: chunk_cache.md +title: 配置分塊緩存 +--- +

    配置分塊緩存

    大塊快取機制讓 Milvus 能夠在需要資料之前,將資料預先載入查詢節點本機硬碟的快取記憶體。此機制可縮短將資料從磁碟載入記憶體的時間,大幅提升向量檢索效能。

    +

    背景資料

    在進行查詢以擷取向量之前,Milvus 需要將資料從物件儲存區載入查詢節點本機硬碟的記憶體快取記憶體。這是一個耗時的過程。在所有資料載入之前,Milvus 可能會延遲回應某些向量檢索請求。

    +

    為了改善查詢效能,Milvus 提供了一個分塊快取機制,在需要資料之前,將資料從物件儲存預先載入本機硬碟的快取記憶體。當收到查詢請求時,Segcore 會先檢查資料是否在快取記憶體中,而不是在物件儲存空間中。如果資料在快取記憶體中,Segcore 可以快速地從快取記憶體中擷取,並將結果回傳給客戶端。

    +

    配置 Chunk Cache

    本指南提供如何為Milvus實例配置chunk cache機制的說明。配置因您安裝 Milvus 實例的方式而異。

    +
      +
    • 對於使用 Helm Charts 安裝的 Milvus 實例

      +

      將配置加入values.yaml 檔案的config 部分。詳情請參閱使用 Helm Charts 設定 Milvus

    • +
    • 對於使用 Docker Compose 安裝的 Milvus 實體

      +

      將配置新增到您用來啟動 Milvus 實例的milvus.yaml 檔案。如需詳細資訊,請參閱使用 Docker Compose 配置 Milvus

    • +
    • 對於使用 Operator 安裝的 Milvus 實例

      +

      將配置新增到Milvus 自訂資源的spec.components 區段。如需詳細資訊,請參閱使用 Operator 配置 Milvus

    • +
    +

    組態選項

    queryNode:
    +    cache:
    +        warmup: async
    +
    +

    warmup 参数决定 Milvus 是否在需要之前将数据从对象存储预加载到查询节点本地硬盘上的缓存中。此参数默认为disable 。可能的選項如下:

    +
      +
    • async:Milvus 在后台异步预加载数据,这不会影响加载集合所需的时间。然而,在載入過程完成後的一段短時間內,使用者在擷取向量時可能會遇到延遲。 這是預設選項。
    • +
    • sync:Milvus 會同步預先載入資料,這可能會影響載入資料集所需的時間。不過,使用者可以在載入過程完成後立即執行查詢,而不會有任何延遲。
    • +
    • disable:Milvus 不會預先載入資料到記憶體快取。
    • +
    +

    請注意,大塊快取設定也適用於新資料插入資料集或資料集索引重建時。

    +

    常見問題

      +
    • 如何判斷chunk cache機制是否正常運作?

      +

      建議您在載入資料集後,檢查搜尋或查詢請求的延遲時間。如果延遲時間明顯高於預期(例如數秒),可能表示主群快取機制仍在運作。

      +

      如果查詢延遲長時間居高不下。您可以檢查物件儲存的吞吐量,以確保分塊快取機制仍在運作。在正常情況下,工作中的 chunk 快取將會在物件儲存上產生高吞吐量。或者,您可以簡單地在sync 模式下嘗試使用 chunk 快取。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.json new file mode 100644 index 000000000..93ead8b2c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.json @@ -0,0 +1 @@ +{"codeList":["variable \"index_count\" {\n description = \"Amount of index instances to run\"\n type = number\n default = 5\n}\n","variable \"index_ec2_type\" {\n description = \"Which server type\"\n type = string\n default = \"c5.2xlarge\"\n}\n","variable \"key_name\" {\n description = \"Which aws key to use for access into instances, needs to be uploaded already\"\n type = string\n default = \"\"\n}\n\nvariable \"my_ip\" {\n description = \"my_ip for security group. used so that ansible and terraform can ssh in\"\n type = string\n default = \"x.x.x.x/32\"\n}\n","provider \"aws\" {\n profile = \"default\"\n region = \"us-east-2\"\n}\n","resource \"aws_security_group\" \"cluster_sg\" {\n name = \"cluster_sg\"\n description = \"Allows only me to access\"\n vpc_id = aws_vpc.cluster_vpc.id\n\n ingress {\n description = \"All ports from my IP\"\n from_port = 0\n to_port = 65535\n protocol = \"tcp\"\n cidr_blocks = [var.my_ip]\n }\n\n ingress {\n description = \"Full subnet communication\"\n from_port = 0\n to_port = 65535\n protocol = \"all\"\n self = true\n }\n\n egress {\n from_port = 0\n to_port = 0\n protocol = \"-1\"\n cidr_blocks = [\"0.0.0.0/0\"]\n ipv6_cidr_blocks = [\"::/0\"]\n }\n\n tags = {\n Name = \"cluster_sg\"\n }\n}\n","resource \"aws_vpc\" \"cluster_vpc\" {\n cidr_block = \"10.0.0.0/24\"\n tags = {\n Name = \"cluster_vpc\"\n }\n}\n\nresource \"aws_internet_gateway\" \"cluster_gateway\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n tags = {\n Name = \"cluster_gateway\"\n }\n}\n","resource \"aws_subnet\" \"cluster_subnet\" {\n vpc_id = aws_vpc.cluster_vpc.id\n cidr_block = \"10.0.0.0/24\"\n map_public_ip_on_launch = true\n\n tags = {\n Name = \"cluster_subnet\"\n }\n}\n\nresource \"aws_route_table\" \"cluster_subnet_gateway_route\" {\n vpc_id = aws_vpc.cluster_vpc.id\n\n route {\n cidr_block = \"0.0.0.0/0\"\n gateway_id = aws_internet_gateway.cluster_gateway.id\n }\n\n tags = {\n Name = \"cluster_subnet_gateway_route\"\n }\n}\n\nresource \"aws_route_table_association\" \"cluster_subnet_add_gateway\" {\n subnet_id = aws_subnet.cluster_subnet.id\n route_table_id = aws_route_table.cluster_subnet_gateway_route.id\n}\n\n","resource \"aws_instance\" \"minio_node\" {\n count = var.minio_count\n ami = \"ami-0d8d212151031f51c\"\n instance_type = var.minio_ec2_type\n key_name = var.key_name\n subnet_id = aws_subnet.cluster_subnet.id \n vpc_security_group_ids = [aws_security_group.cluster_sg.id]\n\n root_block_device {\n volume_type = \"gp2\"\n volume_size = 1000\n }\n \n tags = {\n Name = \"minio-${count.index + 1}\"\n }\n}\n","git clone https://github.com/milvus-io/milvus.git\n","$ cd ./milvus/deployments/docker/cluster-distributed-deployment\n","[dockernodes] #Add docker host names.\ndockernode01\ndockernode02\ndockernode03\n\n[admin] #Add Ansible controller name.\nansible-controller\n\n[coords] #Add the host names of Milvus coordinators.\n; Take note the IP of this host VM, and replace 10.170.0.17 with it.\ndockernode01\n\n[nodes] #Add the host names of Milvus nodes.\ndockernode02\n\n[dependencies] #Add the host names of Milvus dependencies.\n; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. \n; Take note the IP of this host VM, and replace 10.170.0.19 with it.\ndockernode03\n\n[docker:children]\ndockernodes\ncoords\nnodes\ndependencies\n\n[docker:vars]\nansible_python_interpreter= /usr/bin/python3\nStrictHostKeyChecking= no\n\n; Setup variables to control what type of network to use when creating containers.\ndependencies_network= host\nnodes_network= host\n\n; Setup varibale to control what version of Milvus image to use.\nimage= milvusdb/milvus-dev:master-20220412-4781db8a\n\n; Setup static IP addresses of the docker hosts as variable for container environment variable config.\n; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM\n; on which the etcd, minio, pulsar, coordinators will be hosted.\netcd_ip= 10.170.0.19\nminio_ip= 10.170.0.19\npulsar_ip= 10.170.0.19\ncoords_ip= 10.170.0.17\n\n; Setup container environment which later will be used in container creation.\nETCD_ENDPOINTS= {{etcd_ip}}:2379 \nMINIO_ADDRESS= {{minio_ip}}:9000\nPULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650\nQUERY_COORD_ADDRESS= {{coords_ip}}:19531\nDATA_COORD_ADDRESS= {{coords_ip}}:13333\nROOT_COORD_ADDRESS= {{coords_ip}}:53100\nINDEX_COORD_ADDRESS= {{coords_ip}}:31000\n","[defaults]\nhost_key_checking = False\ninventory = inventory.ini # Specify the Inventory file\nprivate_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host\n","---\n- name: setup pre-requisites # Install prerequisite\n hosts: all\n become: yes\n become_user: root\n roles:\n - install-modules\n - configure-hosts-file\n\n- name: install docker\n become: yes\n become_user: root\n hosts: dockernodes\n roles:\n - docker-installation\n","$ ansible all -m ping\n","dockernode01 | SUCCESS => {\n\"changed\": false,\n\"ping\": \"pong\"\n}\nansible-controller | SUCCESS => {\n \"ansible_facts\": {\n \"discovered_interpreter_python\": \"/usr/bin/python3\"\n },\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode03 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\ndockernode02 | SUCCESS => {\n \"changed\": false,\n \"ping\": \"pong\"\n}\n","$ ansible-playbook deploy-docker.yml --syntax-check\n","playbook: deploy-docker.yml\n","$ ansible-playbook deploy-docker.yml\n","TASK [docker-installation : Install Docker-CE] *******************************************************************\nok: [dockernode01]\nok: [dockernode03]\nok: [dockernode02]\n\nTASK [docker-installation : Install python3-docker] **************************************************************\nok: [dockernode01]\nok: [dockernode02]\nok: [dockernode03]\n\nTASK [docker-installation : Install docker-compose python3 library] **********************************************\nchanged: [dockernode01]\nchanged: [dockernode03]\nchanged: [dockernode02]\n\nPLAY RECAP *******************************************************************************************************\nansible-controller : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n","$ docker -v\n","$ sudo docker -v\n","Docker version 20.10.14, build a224086\n","$ docker ps\n","$ ansible-playbook deploy-milvus.yml --syntax-check\n","playbook: deploy-milvus.yml\n","$ ansible-playbook deploy-milvus.yml\n","PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode03]\n\nTASK [etcd] *******************************************************************************************************\nchanged: [dockernode03]\n\nTASK [pulsar] *****************************************************************************************************\nchanged: [dockernode03]\n\nTASK [minio] ******************************************************************************************************\nchanged: [dockernode03]\n\nPLAY [Create milvus nodes] ****************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode02]\n\nTASK [querynode] **************************************************************************************************\nchanged: [dockernode02]\n\nTASK [datanode] ***************************************************************************************************\nchanged: [dockernode02]\n\nTASK [indexnode] **************************************************************************************************\nchanged: [dockernode02]\n\nPLAY [Create milvus coords] ***************************************************************************************\n\nTASK [Gathering Facts] ********************************************************************************************\nok: [dockernode01]\n\nTASK [rootcoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [datacoord] **************************************************************************************************\nchanged: [dockernode01]\n\nTASK [querycoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [indexcoord] *************************************************************************************************\nchanged: [dockernode01]\n\nTASK [proxy] ******************************************************************************************************\nchanged: [dockernode01]\n\nPLAY RECAP ********************************************************************************************************\ndockernode01 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\ndockernode03 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0\n"],"headingContent":"(Deprecated) Deploy a Milvus Cluster on EC2","anchorList":[{"label":"(已停用) 在 EC2 上部署 Milvus 群集","href":"Deprecated-Deploy-a-Milvus-Cluster-on-EC2","type":1,"isActive":false},{"label":"佈建 Milvus 叢集","href":"Provision-a-Milvus-cluster","type":2,"isActive":false},{"label":"啟動 Milvus 叢集","href":"Start-the-Milvus-cluster","type":2,"isActive":false},{"label":"停止節點","href":"Stop-nodes","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.md new file mode 100644 index 000000000..0cf6f5def --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws.md @@ -0,0 +1,494 @@ +--- +id: aws.md +title: 在 EC2 上部署 Milvus 集群 +related_key: cluster +summary: 瞭解如何在 AWS EC2 上部署 Milvus 群集。 +--- +

    (已停用) 在 EC2 上部署 Milvus 群集

    本主題描述如何使用 Terraform 和 Ansible 在Amazon EC2上部署 Milvus 叢集。

    +
    +

    此主題已經過時,即將移除。建議您參考在 EKS 上部署 Milvus 叢集

    +
    +

    佈建 Milvus 叢集

    本節說明如何使用 Terraform 來佈建 Milvus 叢集。

    +

    Terraform是基礎架構即程式碼 (IaC) 軟體工具。透過 Terraform,您可以使用宣告式組態檔案來佈建基礎設施。

    +

    先決條件

    +

    準備配置

    您可以從Google Drive 下載範本配置檔案。

    +
      +
    • main.tf

      +

      此檔案包含配置 Milvus 集群的配置。

    • +
    • variables.tf

      +

      此檔案可快速編輯用於設定或更新 Milvus 叢集的變數。

    • +
    • output.tf 以及inventory.tmpl

      +

      這些檔案儲存 Milvus 叢集的元資料。本主題中使用的元資料是每個節點實體的public_ip 、每個節點實體的private_ip ,以及所有 EC2 實體 ID。

    • +
    +

    準備變數.tf

    本節說明variables.tf 檔案所包含的配置。

    +
      +
    • 節點數量

      +

      以下範本宣告一個index_count 變數,用於設定索引節點的數量。

      +
      index_count 的值必須大於或等於 1。
      +
      variable "index_count" {
      +  description = "Amount of index instances to run"
      +  type        = number
      +  default     = 5
      +}
      +
    • +
    • 節點類型的實例類型

      +

      以下範本宣告一個index_ec2_type 變數,用來設定索引節點的實體類型

      +
      variable "index_ec2_type" {
      +  description = "Which server type"
      +  type        = string
      +  default     = "c5.2xlarge"
      +}
      +
    • +
    • 存取權限

      +

      以下範本宣告了key_name 變數和my_ip 變數。key_name 變數代表 AWS 存取權限金鑰。my_ip 變數代表安全群組的 IP 位址範圍。

      +
      variable "key_name" {
      +  description = "Which aws key to use for access into instances, needs to be uploaded already"
      +  type        = string
      +  default     = ""
      +}
      +
      +variable "my_ip" {
      +  description = "my_ip for security group. used so that ansible and terraform can ssh in"
      +  type        = string
      +  default     = "x.x.x.x/32"
      +}
      +
    • +
    +

    準備 main.tf

    本節說明main.tf 檔案所包含的設定。

    +
      +
    • 雲提供商和區域

      +

      以下範本使用us-east-2 區域。如需詳細資訊,請參閱可用區域

      +
      provider "aws" {
      +  profile = "default"
      +  region  = "us-east-2"
      +}
      +
    • +
    • 安全群組

      +

      以下模板声明了一个安全组,允许来自variables.tf 中声明的my_ip 所代表的 CIDR 地址范围的传入流量。

      +
      resource "aws_security_group" "cluster_sg" {
      +  name        = "cluster_sg"
      +  description = "Allows only me to access"
      +  vpc_id      = aws_vpc.cluster_vpc.id
      +
      +  ingress {
      +    description      = "All ports from my IP"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "tcp"
      +    cidr_blocks      = [var.my_ip]
      +  }
      +
      +  ingress {
      +    description      = "Full subnet communication"
      +    from_port        = 0
      +    to_port          = 65535
      +    protocol         = "all"
      +    self             = true
      +  }
      +
      +  egress {
      +    from_port        = 0
      +    to_port          = 0
      +    protocol         = "-1"
      +    cidr_blocks      = ["0.0.0.0/0"]
      +    ipv6_cidr_blocks = ["::/0"]
      +  }
      +
      +  tags = {
      +    Name = "cluster_sg"
      +  }
      +}
      +
    • +
    • VPC

      +

      以下範本在 Milvus 叢集上指定具有 10.0.0.0/24 CIDR 區塊的 VPC。

      +
      resource "aws_vpc" "cluster_vpc" {
      +  cidr_block = "10.0.0.0/24"
      +  tags = {
      +    Name = "cluster_vpc"
      +  }
      +}
      +
      +resource "aws_internet_gateway" "cluster_gateway" {
      +  vpc_id = aws_vpc.cluster_vpc.id
      +
      +  tags = {
      +    Name = "cluster_gateway"
      +  }
      +}
      +
    • +
    • 子網路 (選用)

      +

      以下範本宣告一個子網路,其流量會路由到網際網路閘道。在這種情況下,子網路的 CIDR 區塊大小與 VPC 的 CIDR 區塊大小相同。

      +
      resource "aws_subnet" "cluster_subnet" {
      +  vpc_id                  = aws_vpc.cluster_vpc.id
      +  cidr_block              = "10.0.0.0/24"
      +  map_public_ip_on_launch = true
      +
      +  tags = {
      +    Name = "cluster_subnet"
      +  }
      +}
      +
      +resource "aws_route_table" "cluster_subnet_gateway_route" {
      +  vpc_id       = aws_vpc.cluster_vpc.id
      +
      +  route {
      +    cidr_block = "0.0.0.0/0"
      +    gateway_id = aws_internet_gateway.cluster_gateway.id
      +  }
      +
      +  tags = {
      +    Name = "cluster_subnet_gateway_route"
      +  }
      +}
      +
      +resource "aws_route_table_association" "cluster_subnet_add_gateway" {
      +  subnet_id      = aws_subnet.cluster_subnet.id
      +  route_table_id = aws_route_table.cluster_subnet_gateway_route.id
      +}
      +
      +
    • +
    • 節點實體 (節點)

      +

      以下範本宣告 MinIO 節點實體。main.tf 範本檔案宣告 11 種節點類型的節點。對於某些節點類型,您需要設定root_block_device 。如需詳細資訊,請參閱EBS、Ephemeral 和 Root Block Devices

      +
      resource "aws_instance" "minio_node" {
      +  count         = var.minio_count
      +  ami           = "ami-0d8d212151031f51c"
      +  instance_type = var.minio_ec2_type
      +  key_name      = var.key_name
      +  subnet_id     = aws_subnet.cluster_subnet.id 
      +  vpc_security_group_ids = [aws_security_group.cluster_sg.id]
      +
      +  root_block_device {
      +    volume_type = "gp2"
      +    volume_size = 1000
      +  }
      +  
      +  tags = {
      +    Name = "minio-${count.index + 1}"
      +  }
      +}
      +
    • +
    +

    套用組態

      +
    1. 開啟終端機,並導航至存放main.tf 的資料夾。

    2. +
    3. 若要初始化組態,請執行terraform init

    4. +
    5. 若要套用組態,請執行terraform apply ,並在出現提示時輸入yes

    6. +
    +

    現在您已使用 Terraform 佈建 Milvus 叢集。

    +

    啟動 Milvus 叢集

    本節將介紹如何使用 Ansible 來啟動已佈建的 Milvus 叢集。

    +

    Ansible是一個配置管理工具,用於自動化雲端佈建和配置管理。

    +

    先決條件

    +

    下載 Ansible Milvus 節點部署 Playbook

    從 GitHub 複製 Milvus 套件庫,下載 Ansible Milvus 節點部署 Playbook。

    +
    git clone https://github.com/milvus-io/milvus.git
    +
    +

    設定安裝檔案

    inventory.iniansible.cfg 檔案用來控制 Ansible playbook 中的環境變數和登入驗證方法。在inventory.ini 檔案中,dockernodes 部份定義了所有 docker 引擎的伺服器。ansible.cfg 部分定義 Milvus 協調器的所有伺服器。node 部份定義 Milvus 節點的所有伺服器。

    +

    輸入 Playbook 的本機路徑並設定安裝檔案。

    +
    $ cd ./milvus/deployments/docker/cluster-distributed-deployment
    +
    +

    inventory.ini

    配置inventory.ini ,按照主機在 Milvus 系統中的角色將其分組。

    +

    添加主机名,并定义docker 组和vars

    +
    [dockernodes] #Add docker host names.
    +dockernode01
    +dockernode02
    +dockernode03
    +
    +[admin] #Add Ansible controller name.
    +ansible-controller
    +
    +[coords] #Add the host names of Milvus coordinators.
    +; Take note the IP of this host VM, and replace 10.170.0.17 with it.
    +dockernode01
    +
    +[nodes] #Add the host names of Milvus nodes.
    +dockernode02
    +
    +[dependencies] #Add the host names of Milvus dependencies.
    +; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus. 
    +; Take note the IP of this host VM, and replace 10.170.0.19 with it.
    +dockernode03
    +
    +[docker:children]
    +dockernodes
    +coords
    +nodes
    +dependencies
    +
    +[docker:vars]
    +ansible_python_interpreter= /usr/bin/python3
    +StrictHostKeyChecking= no
    +
    +; Setup variables to control what type of network to use when creating containers.
    +dependencies_network= host
    +nodes_network= host
    +
    +; Setup varibale to control what version of Milvus image to use.
    +image= milvusdb/milvus-dev:master-20220412-4781db8a
    +
    +; Setup static IP addresses of the docker hosts as variable for container environment variable config.
    +; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
    +; on which the etcd, minio, pulsar, coordinators will be hosted.
    +etcd_ip= 10.170.0.19
    +minio_ip= 10.170.0.19
    +pulsar_ip= 10.170.0.19
    +coords_ip= 10.170.0.17
    +
    +; Setup container environment which later will be used in container creation.
    +ETCD_ENDPOINTS= {{etcd_ip}}:2379 
    +MINIO_ADDRESS= {{minio_ip}}:9000
    +PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
    +QUERY_COORD_ADDRESS= {{coords_ip}}:19531
    +DATA_COORD_ADDRESS= {{coords_ip}}:13333
    +ROOT_COORD_ADDRESS= {{coords_ip}}:53100
    +INDEX_COORD_ADDRESS= {{coords_ip}}:31000
    +
    +

    ansible.cfg

    ansible.cfg 控制 playbook 的動作,例如 SSH 金鑰等。不要在 docker 主機上透過 SSH key 設定 passphrase。否則 Ansible SSH 連線會失敗。建議在三台主機上設定相同的使用者名稱和 SSH 金鑰,並設定新的使用者帳號無需密碼即可執行 sudo。否則,在執行 Ansible playbook 時,您會收到使用者名稱與密碼不符或未獲賦予提升權限的錯誤。

    +
    [defaults]
    +host_key_checking = False
    +inventory = inventory.ini # Specify the Inventory file
    +private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host
    +
    +

    deploy-docker.yml

    deploy-docker.yml 定義安裝 Docker 時的任務。詳情請參閱檔案中的程式碼註解。

    +
    ---
    +- name: setup pre-requisites # Install prerequisite
    +  hosts: all
    +  become: yes
    +  become_user: root
    +  roles:
    +    - install-modules
    +    - configure-hosts-file
    +
    +- name: install docker
    +  become: yes
    +  become_user: root
    +  hosts: dockernodes
    +  roles:
    +    - docker-installation
    +
    +

    測試 Ansible 連線性

    測試與 Ansible 的連線性。

    +
    $ ansible all -m ping
    +
    +

    如果您沒有在ansible.cfg 中指定 inventory 檔案的路徑,請在指令中加入-i ,否則 Ansible 會使用/etc/ansible/hosts

    +

    終端返回如下:

    +
    dockernode01 | SUCCESS => {
    +"changed": false,
    +"ping": "pong"
    +}
    +ansible-controller | SUCCESS => {
    +    "ansible_facts": {
    +        "discovered_interpreter_python": "/usr/bin/python3"
    +    },
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode03 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +dockernode02 | SUCCESS => {
    +    "changed": false,
    +    "ping": "pong"
    +}
    +
    +

    檢查 Playbook 語法

    檢查 Playbook 的語法。

    +
    $ ansible-playbook deploy-docker.yml --syntax-check
    +
    +

    通常,終端返回如下:

    +
    playbook: deploy-docker.yml
    +
    +

    安裝 Docker

    使用 Playbook 安裝 Docker。

    +
    $ ansible-playbook deploy-docker.yml
    +
    +

    如果 Docker 已成功安裝在三台主機上,終端機會返回如下內容:

    +
    TASK [docker-installation : Install Docker-CE] *******************************************************************
    +ok: [dockernode01]
    +ok: [dockernode03]
    +ok: [dockernode02]
    +
    +TASK [docker-installation : Install python3-docker] **************************************************************
    +ok: [dockernode01]
    +ok: [dockernode02]
    +ok: [dockernode03]
    +
    +TASK [docker-installation : Install docker-compose python3 library] **********************************************
    +changed: [dockernode01]
    +changed: [dockernode03]
    +changed: [dockernode02]
    +
    +PLAY RECAP *******************************************************************************************************
    +ansible-controller         : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode01               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=10   changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    驗證安裝

    使用 SSH 金鑰登入三台主機,並驗證在主機上的安裝。

    +
      +
    • 針對 root 主機
    • +
    +
    $ docker -v
    +
    +
      +
    • 對於非 root 主機:
    • +
    +
    $ sudo docker -v
    +
    +

    通常,終端機會返回以下內容:

    +
    Docker version 20.10.14, build a224086
    +
    +

    檢查容器的執行狀態。

    +
    $ docker ps
    +
    +

    檢查語法

    檢查deploy-milvus.yml 的語法。

    +
    $ ansible-playbook deploy-milvus.yml --syntax-check
    +
    +

    通常,終端返回如下內容:

    +
    playbook: deploy-milvus.yml
    +
    +

    創建 Milvus 容器

    創建 Milvus 容器的任務定義在deploy-milvus.yml

    +
    $ ansible-playbook deploy-milvus.yml
    +
    +

    終端返回:

    +
    PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode03]
    +
    +TASK [etcd] *******************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [pulsar] *****************************************************************************************************
    +changed: [dockernode03]
    +
    +TASK [minio] ******************************************************************************************************
    +changed: [dockernode03]
    +
    +PLAY [Create milvus nodes] ****************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode02]
    +
    +TASK [querynode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [datanode] ***************************************************************************************************
    +changed: [dockernode02]
    +
    +TASK [indexnode] **************************************************************************************************
    +changed: [dockernode02]
    +
    +PLAY [Create milvus coords] ***************************************************************************************
    +
    +TASK [Gathering Facts] ********************************************************************************************
    +ok: [dockernode01]
    +
    +TASK [rootcoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [datacoord] **************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [querycoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [indexcoord] *************************************************************************************************
    +changed: [dockernode01]
    +
    +TASK [proxy] ******************************************************************************************************
    +changed: [dockernode01]
    +
    +PLAY RECAP ********************************************************************************************************
    +dockernode01               : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode02               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +dockernode03               : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    +
    +

    現在您已經在三台主機上部署了 Milvus。

    +

    停止節點

    不再需要 Milvus 集群後,您可以停止所有節點。

    +
    確保terraform 二進位檔在您的PATH 上可用。
    +
      +
    1. 執行terraform destroy ,並在提示時輸入yes

    2. +
    3. 如果成功,所有節點實例都會停止。

    4. +
    +

    下一步

    如果您想學習如何在其他雲端部署 Milvus:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.json new file mode 100644 index 000000000..8bc57e938 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP\n","# If the import-certificate command is successful, it returns the arn of the imported certificate.\naws acm import-certificate --certificate fileb://Certificate.pem \\\n --certificate-chain fileb://CertificateChain.pem \\\n --private-key fileb://PrivateKey.pem \n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n namespace: milvus\n name: milvus-demo\n annotations:\n alb.ingress.kubernetes.io/scheme: internet-facing\n alb.ingress.kubernetes.io/backend-protocol-version: GRPC\n alb.ingress.kubernetes.io/target-type: ip\n alb.ingress.kubernetes.io/listen-ports: '[{\"HTTPS\":443}]'\n alb.ingress.kubernetes.io/certificate-arn: \"arn:aws:acm:region:account-id:certificate/certificate-id\"\n\nspec:\n ingressClassName: alb\n rules:\n - host: milvus-demo.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: milvus-demo\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmilvus-demo alb milvus-demo.milvus.io k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com 80 10m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\nconnections.connect(\"default\", host=\"k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com\", port=\"443\", secure=True, server_name=\"milvus-demo.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on AWS","anchorList":[{"label":"在 AWS 上為 Milvus 設定第 7 層負載平衡器","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-AWS","type":1,"isActive":false},{"label":"驗證透過 Layer-7 負載平衡器的連線","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.md new file mode 100644 index 000000000..babff6bcf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/aws_layer7.md @@ -0,0 +1,107 @@ +--- +id: aws_layer7.md +title: 在 AWS 上為 Milvus 設定第 7 層負載平衡器 +related_key: cluster +summary: 瞭解如何在 AWS 上的 Layer-7 負載平衡器後面部署 Milvus 叢集。 +--- +

    在 AWS 上為 Milvus 設定第 7 層負載平衡器

    與第 4 層負載平衡器相比,第 7 層負載平衡器提供智慧型負載平衡和快取功能,是雲原生服務的最佳選擇。

    +

    本指南將教您如何為已經在第 4 層負載平衡器後面執行的 Milvus 叢集設定第 7 層負載平衡器。

    +

    開始之前

    +

    調整 Milvus 配置

    本指南假設您已在 AWS 的第 4 層負載平衡器後部署 Milvus 叢集

    +

    在為此 Milvus 叢集設定第 7 層負載平衡器之前,請執行下列指令移除第 4 層負載平衡器。

    +
    helm upgrade milvus-demo milvus/milvus -n milvus --set service.type=ClusterIP
    +
    +

    準備 TLS 證書

    TLS 需要憑證才能運作。我們使用ACM管理憑證,需要將現有的憑證匯入 ACM。請參考匯入憑證。以下是一個範例。

    +
    # If the import-certificate command is successful, it returns the arn of the imported certificate.
    +aws acm import-certificate --certificate fileb://Certificate.pem \
    +      --certificate-chain fileb://CertificateChain.pem \
    +      --private-key fileb://PrivateKey.pem  
    +
    +

    建立 Ingress 以產生第七層負載平衡器

    按以下方式準備 Ingress 檔案,並將其命名為ingress.yaml請將憑證 arn 和 host 改為您自己的。

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  namespace: milvus
    +  name: milvus-demo
    +  annotations:
    +    alb.ingress.kubernetes.io/scheme: internet-facing
    +    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
    +    alb.ingress.kubernetes.io/target-type: ip
    +    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]'
    +    alb.ingress.kubernetes.io/certificate-arn: "arn:aws:acm:region:account-id:certificate/certificate-id"
    +
    +spec:
    +  ingressClassName: alb
    +  rules:
    +    - host: milvus-demo.milvus.io
    +      http:
    +        paths:
    +        - path: /
    +          pathType: Prefix
    +          backend:
    +            service:
    +              name: milvus-demo
    +              port:
    +                number: 19530
    +
    +

    然後,您就可以將該檔案套用到 EKS 叢集來建立 Ingress。

    +
    kubectl apply -f ingress.yaml
    +
    +

    現在,等待 AWS 設定 Layer-7 負載平衡器。您可以執行

    +
    kubectl -f ingress.yaml get -w
    +
    +

    輸出應該與下面相似:

    +
    NAME          CLASS   HOSTS                   ADDRESS                                                                PORTS   AGE
    +milvus-demo   alb     milvus-demo.milvus.io   k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com   80      10m
    +
    +

    一旦ADDRESS欄位顯示地址,Layer-7 負載平衡器就可以使用了。

    +

    驗證透過 Layer-7 負載平衡器的連線

    本指南使用 PyMilvus 來驗證與我們剛剛建立的 Layer-7 負載平衡器後面的 Milvus 服務的連線。如需詳細步驟,請閱讀此內容。

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +connections.connect("default", host="k8s-milvus-milvusde-2f72215c02-778371620.us-east-2.elb.amazonaws.com", port="443", secure=True, server_name="milvus-demo.milvus.io")
    +
    +
    +
      +
    • hostserver_name應該用您自己的名稱取代。
    • +
    • 如果您已經設定 DNS 記錄,將網域名稱對應到 alb,請將host改為網域名稱,並省略server_name
    • +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.json new file mode 100644 index 000000000..4b9519c06 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.json @@ -0,0 +1 @@ +{"codeList":["{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"S3BucketManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:CreateBucket\",\n \"s3:PutBucketAcl\",\n \"s3:PutBucketOwnershipControls\",\n \"s3:DeleteBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::milvus-bucket-*\"\n ]\n }\n ]\n}\n","{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"IAMPolicyManagement\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"iam:CreatePolicy\",\n \"iam:DeletePolicy\"\n ],\n \"Resource\": \"arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite\"\n }\n ]\n} \n","milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","aws iam attach-user-policy --user-name --policy-arn \"arn:aws:iam:::policy/MilvusS3ReadWrite\"\n","apiVersion: eksctl.io/v1alpha5\nkind: ClusterConfig\n\nmetadata:\n name: 'milvus-eks-cluster'\n region: 'us-east-2'\n version: \"1.27\"\n\niam:\n withOIDC: true\n\n serviceAccounts:\n - metadata:\n name: aws-load-balancer-controller\n namespace: kube-system\n wellKnownPolicies:\n awsLoadBalancerController: true\n\nmanagedNodeGroups:\n - name: milvus-node-group\n labels: { role: milvus }\n instanceType: m6i.4xlarge\n desiredCapacity: 3\n privateNetworking: true\n \naddons:\n- name: vpc-cni\n version: latest\n attachPolicyARNs:\n - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy\n- name: coredns\n version: latest\n- name: kube-proxy\n version: latest\n- name: aws-ebs-csi-driver\n version: latest\n wellKnownPolicies:\n ebsCSIController: true\n","eksctl create cluster -f eks_cluster.yaml\n","aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'\n","kubectl cluster-info\n\nkubectl get nodes -A -o wide\n","cat <\"\n useIAM: false\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n accessKey: \"\"\n secretKey: \"\"\n region: \"us-east-2\"\n\n# HA Configurations\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n","kubectl get pods -n milvus\n","kubectl get svc -n milvus\n","wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py\n","python3 hello_milvus.py\n","=== start connecting to Milvus ===\n\nDoes collection hello_milvus exist in Milvus: False\n\n=== Create collection `hello_milvus` ===\n\n\n=== Start inserting entities ===\n\nNumber of entities in Milvus: 3000\n\n=== Start Creating index IVF_FLAT ===\n\n\n=== Start loading ===\n\n\n=== Start searching based on vector similarity ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561\nhit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304\nhit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482\nhit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nsearch latency = 0.4693s\n\n=== Start querying with `random > 0.5` ===\n\nquery result:\n-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}\nsearch latency = 0.9407s\nquery pagination(limit=4):\n [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\nquery pagination(offset=1, limit=3):\n [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]\n\n=== Start hybrid searching with `random > 0.5` ===\n\nhit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911\nhit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661\nhit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507\nhit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368\nhit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499\nhit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955\nsearch latency = 0.4652s\n\n=== Start deleting with expr `pk in [\"0\" , \"1\"]` ===\n\nquery before delete by expr=`pk in [\"0\" , \"1\"]` -> result:\n-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}\n-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}\n\nquery after delete by expr=`pk in [\"0\" , \"1\"]` -> result: []\n\n\n=== Drop collection `hello_milvus` ===\n","helm uninstall milvus-demo -n milvus\n","eksctl delete cluster --name milvus-eks-cluster --region us-east-2\n","aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive\n\naws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2\n\naws iam detach-user-policy --user-name --policy-arn \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\"\n\naws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\n"],"headingContent":"Deploy a Milvus Cluster on EKS","anchorList":[{"label":"在 EKS 上部署 Milvus 群集","href":"Deploy-a-Milvus-Cluster-on-EKS","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定 AWS 資源","href":"Set-up-AWS-Resources","type":2,"isActive":false},{"label":"建立儲存類別","href":"Create-a-StorageClass","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"驗證安裝","href":"Verify-the-installation","type":2,"isActive":false},{"label":"清理成功","href":"Clean-up-works","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.md new file mode 100644 index 000000000..3c87234cb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/eks.md @@ -0,0 +1,518 @@ +--- +id: eks.md +title: 在 EKS 上部署 Milvus 群集 +related_key: cluster +summary: 學習如何在 EKS 上部署 Milvus 集群 +--- +

    在 EKS 上部署 Milvus 群集

    本主題描述如何在Amazon EKS 上部署 Milvus 叢集。

    +

    先決條件

      +
    • 您已在本機電腦或 Amazon EC2 上安裝 AWS CLI,這將作為您執行本文件所涵蓋的作業的端點。對於 Amazon Linux 2 或 Amazon Linux 2023,已安裝 AWS CLI 工具。若要在本機電腦上安裝 AWS CLi。請參閱如何安裝 AWS CLI
    • +
    • 您已在偏好的端點裝置上安裝 Kubernetes 和 EKS 工具,包括
    • +
    • AWS IAM 權限已正確授予。您使用的 IAM 安全本金必須具有使用 Amazon EKS IAM 角色、服務相關角色、AWS CloudFormation、VPC 及其他相關資源的權限。您可以遵循以下任一種方式授予您的主體適當的權限。
        +
      • (不建議)只需將您使用的使用者/角色的關聯政策設定為 AWS 管理政策AdministratorAccess
      • +
      • (強烈建議)若要執行最小權限原則,請執行下列步驟:
          +
        • 若要設定eksctl 的權限,請參閱 eksctl 的最小權限

        • +
        • 若要設定建立/刪除 AWS S3 資料桶的權限,請參閱下列權限設定:

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "S3BucketManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "s3:CreateBucket",
          +        "s3:PutBucketAcl",
          +        "s3:PutBucketOwnershipControls",
          +        "s3:DeleteBucket"
          +      ],
          +      "Resource": [
          +        "arn:aws:s3:::milvus-bucket-*"
          +      ]
          +    }
          +  ]
          +}
          +
        • +
        • 若要設定建立/刪除 IAM 政策的權限,請參閱下列權限設定。請使用您自己的YOUR_ACCOUNT_ID

          +
          {
          +  "Version": "2012-10-17",
          +  "Statement": [
          +    {
          +      "Sid": "IAMPolicyManagement",
          +      "Effect": "Allow",
          +      "Action": [
          +        "iam:CreatePolicy",
          +        "iam:DeletePolicy"
          +      ],
          +      "Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:policy/MilvusS3ReadWrite"
          +    }
          +  ]
          +}    
          +
        • +
      • +
    • +
    +

    設定 AWS 資源

    您可以使用 AWS 管理主控台、AWS CLI 或 IaC 工具(如 Terraform)設定所需的 AWS 資源,包括 AWS S3 桶和 EKS 群集。在本文件中,我們建議使用 AWS CLI 來示範如何設定 AWS 資源。

    +

    建立 Amazon S3 儲存桶

      +
    • 建立 AWS S3 儲存桶。

      +

      閱讀桶命名規則,並在命名 AWS S3 桶時遵守命名規則。

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • 建立 IAM 政策,用於讀取和寫入上述建立的儲存桶內的物件。請使用您自己的名稱取代儲存桶名稱。

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:GetObject",
      +        "s3:PutObject",
      +        "s3:ListBucket",
      +        "s3:DeleteObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>",
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • 將政策附加到您的 AWS 使用者。

      +
      aws iam attach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::<your-iam-account-id>:policy/MilvusS3ReadWrite"
      +
    • +
    +

    建立 Amazon EKS 叢集

      +
    • 準備一個群集設定檔案如下,並將其命名為eks_cluster.yaml

      +
      apiVersion: eksctl.io/v1alpha5
      +kind: ClusterConfig
      +
      +metadata:
      +  name: 'milvus-eks-cluster'
      +  region: 'us-east-2'
      +  version: "1.27"
      +
      +iam:
      +  withOIDC: true
      +
      +  serviceAccounts:
      +  - metadata:
      +      name: aws-load-balancer-controller
      +      namespace: kube-system
      +    wellKnownPolicies:
      +      awsLoadBalancerController: true
      +
      +managedNodeGroups:
      +  - name: milvus-node-group
      +    labels: { role: milvus }
      +    instanceType: m6i.4xlarge
      +    desiredCapacity: 3
      +    privateNetworking: true
      +    
      +addons:
      +- name: vpc-cni
      +  version: latest
      +  attachPolicyARNs:
      +    - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
      +- name: coredns
      +  version: latest
      +- name: kube-proxy
      +  version: latest
      +- name: aws-ebs-csi-driver
      +  version: latest
      +  wellKnownPolicies:
      +    ebsCSIController: true
      +
    • +
    • 執行下列指令以建立 EKS 叢集。

      +
      eksctl create cluster -f eks_cluster.yaml
      +
    • +
    • 取得 kubeconfig 檔案。

      +
      aws eks update-kubeconfig --region 'us-east-2' --name 'milvus-eks-cluster'
      +
    • +
    • 驗證 EKS 群集。

      +
      kubectl cluster-info
      +
      +kubectl get nodes -A -o wide
      +
    • +
    +

    建立儲存類別

    Milvus 使用etcd 作為元儲存,需要依賴gp3 StorageClass 來建立和管理 PVC。

    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: storage.k8s.io/v1
    +kind: StorageClass
    +metadata:
    +  name: ebs-gp3-sc
    +  annotations:
    +    storageclass.kubernetes.io/is-default-class: "true"
    +provisioner: ebs.csi.aws.com
    +volumeBindingMode: WaitForFirstConsumer
    +parameters:
    +  type: gp3
    +EOF
    +
    +

    將原始的 gp2 StorageClass 設定為非預設值。

    +
    kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
    +
    +

    安裝 AWS LoadBalancer 控制器

      +
    • 新增 Helm chars repo。

      +
      helm repo add eks https://aws.github.io/eks-charts
      +helm repo update
      +
    • +
    • 安裝 AWS Load Balancer Controller。

      +
      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
      +  -n kube-system \
      +  --set clusterName='milvus-eks-cluster' \
      +  --set serviceAccount.create=false \
      +  --set serviceAccount.name=aws-load-balancer-controller 
      +
    • +
    • 驗證安裝

      +
      kubectl get deployment -n kube-system aws-load-balancer-controller
      +
    • +
    +

    部署 Milvus

    在本指南中,我們將使用 Milvus Helm Charts 部署 Milvus 集群。您可以在這裡找到圖表。

    +
      +
    • 新增 Milvus Helm Chart repo。

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm/
      +helm repo update
      +
    • +
    • 準備好 Milvus 配置檔案milvus.yaml ,並用你自己的檔案取代<bucket-name> <s3-access-key> <s3-secret-key>

      +

      +
        +
      • 要為您的 Milvus 設定 HA,請參考此計算器以獲得更多資訊。您可以直接從計算器下載相關組態,並應移除 MinIO 相關組態。
      • +
      • 若要實現協調器的多重複製部署,請將xxCoordinator.activeStandby.enabled 設為true
      • +
      +

      +
      cluster:
      +  enabled: true
      +
      +service:
      +  type: LoadBalancer
      +  port: 19530
      +  annotations: 
      +    service.beta.kubernetes.io/aws-load-balancer-type: external
      +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
      +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
      +
      +minio:
      +  enabled: false
      +
      +externalS3:
      +  enabled: true
      +  host: "s3.us-east-2.amazonaws.com"
      +  port: "443"
      +  useSSL: true
      +  bucketName: "<bucket-name>"
      +  useIAM: false
      +  cloudProvider: "aws"
      +  iamEndpoint: ""
      +  accessKey: "<s3-access-key>"
      +  secretKey: "<s3-secret-key>"
      +  region: "us-east-2"
      +
      +# HA Configurations
      +rootCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi
      +
      +indexCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +queryCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +dataCoordinator:
      +  replicas: 2
      +  activeStandby:
      +    enabled: true
      +  resources: 
      +    limits:
      +      cpu: "0.5"
      +      memory: 0.5Gi
      +
      +proxy:
      +  replicas: 2
      +  resources: 
      +    limits:
      +      cpu: 1
      +      memory: 2Gi  
      +
    • +
    • 安裝 Milvus。

      +
      helm install milvus-demo milvus/milvus -n milvus -f milvus.yaml
      +
    • +
    • 等到所有 Pod 都Running

      +
      kubectl get pods -n milvus
      +
      +

      +

      Helm 不支援排程服務建立的順序。在etcdpulsar 上線初期,業務 pod 重新啟動一到兩次是正常的。

      +

    • +
    • 取得 Milvus 服務位址。

      +
      kubectl get svc -n milvus
      +
    • +
    +

    驗證安裝

    您可以按照下面的簡單指南來驗證安裝。如需詳細資訊,請參考此範例

    +
      +
    • 下載範例程式碼。

      +
      wget https://raw.githubusercontent.com/milvus-io/pymilvus/master/examples/hello_milvus.py
      +
    • +
    • 將範例程式碼中的host 參數改成上面的 Milvus 服務位址。

    • +
    +
    ```python
    +...
    +connections.connect("default", host="milvus-service-06b515b1ce9ad10.elb.us-east-2.amazonaws.com", port="19530")
    +...
    +```
    +
    +
      +
    • 執行範例程式碼。

      +
      python3 hello_milvus.py
      +
      +

      輸出應該與下面相似:

      +
      === start connecting to Milvus     ===
      +
      +Does collection hello_milvus exist in Milvus: False
      +
      +=== Create collection `hello_milvus` ===
      +
      +
      +=== Start inserting entities       ===
      +
      +Number of entities in Milvus: 3000
      +
      +=== Start Creating index IVF_FLAT  ===
      +
      +
      +=== Start loading                  ===
      +
      +
      +=== Start searching based on vector similarity ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561
      +hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304
      +hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
      +hit: id: 1580, distance: 0.05628091096878052, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +search latency = 0.4693s
      +
      +=== Start querying with `random > 0.5` ===
      +
      +query result:
      +-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}
      +search latency = 0.9407s
      +query pagination(limit=4):
      +        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +query pagination(offset=1, limit=3):
      +        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
      +
      +=== Start hybrid searching with `random > 0.5` ===
      +
      +hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
      +hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661
      +hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507
      +hit: id: 2377, distance: 0.08096685260534286, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
      +hit: id: 2034, distance: 0.20354536175727844, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499
      +hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955
      +search latency = 0.4652s
      +
      +=== Start deleting with expr `pk in ["0" , "1"]` ===
      +
      +query before delete by expr=`pk in ["0" , "1"]` -> result:
      +-{'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0'}
      +-{'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545], 'pk': '1'}
      +
      +query after delete by expr=`pk in ["0" , "1"]` -> result: []
      +
      +
      +=== Drop collection `hello_milvus` ===
      +
    • +
    +

    清理成功

    萬一您需要透過卸載 Milvus、銷毀 EKS 叢集、刪除 AWS S3 buckets 及相關 IAM 策略來還原環境。

    +
      +
    • 解除安裝 Milvus。

      +
      helm uninstall milvus-demo -n milvus
      +
    • +
    • 銷毀 EKS 叢集。

      +
      eksctl delete cluster --name milvus-eks-cluster --region us-east-2
      +
    • +
    • 刪除 AWS S3 容量桶和相關的 IAM 政策。

      +

      您應該將水桶名稱和政策 ARN 替換為您自己的名稱和政策 ARN。

      +
      aws s3 rm s3://milvus-bucket-039dd013c0712f085d60e21f --recursive
      +
      +aws s3api delete-bucket --bucket milvus-bucket-039dd013c0712f085d60e21f --region us-east-2
      +
      +aws iam detach-user-policy --user-name <your-user-name> --policy-arn "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite"
      +
      +aws iam delete-policy --policy-arn 'arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
      +
    • +
    +

    下一步

    如果您想學習如何在其他雲端部署 Milvus:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.json new file mode 100644 index 000000000..76fd4b27c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.json @@ -0,0 +1 @@ +{"codeList":["milvus_bucket_name=\"milvus-bucket-$(openssl rand -hex 12)\"\n\naws s3api create-bucket --bucket \"$milvus_bucket_name\" --region 'us-east-2' --acl private --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'\n\n\n# Output\n#\n# \"Location\": \"http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/\"\n","echo '{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:ListBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\"\n ]\n },\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:PutObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n}' > milvus-s3-policy.json\n\naws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json\n\n\n# Get the ARN from the command output as follows:\n# {\n# \"Policy\": {\n# \"PolicyName\": \"MilvusS3ReadWrite\",\n# \"PolicyId\": \"AN5QQVVPM1BVTFlBNkdZT\",\n# \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n# \"Path\": \"/\",\n# \"DefaultVersionId\": \"v1\",\n# \"AttachmentCount\": 0,\n# \"PermissionsBoundaryUsageCount\": 0,\n# \"IsAttachable\": true,\n# \"CreateDate\": \"2023-11-16T06:00:01+00:00\",\n# \"UpdateDate\": \"2023-11-16T06:00:01+00:00\"\n# }\n# } \n","eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \\\n --attach-policy-arn arn:aws:iam:::policy/MilvusS3ReadWrite --approve\n","aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument\n# An example output is as follows\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"Federated\": \"arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE\"\n },\n \"Action\": \"sts:AssumeRoleWithWebIdentity\",\n \"Condition\": {\n \"StringEquals\": {\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub\": \"system:serviceaccount:default:my-service-account\",\n \"oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud\": \"sts.amazonaws.com\"\n }\n }\n }\n ]\n}\n","aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text\n# An example output is as follows\narn:aws:iam::12345678901:policy/MilvusS3ReadWrite\n","export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'\naws iam get-policy --policy-arn $policy_arn\n# An example output is as follows\n{\n \"Policy\": {\n \"PolicyName\": \"MilvusS3ReadWrite\",\n \"PolicyId\": \"EXAMPLEBIOWGLDEXAMPLE\",\n \"Arn\": \"arn:aws:iam::12345678901:policy/MilvusS3ReadWrite\",\n \"Path\": \"/\",\n \"DefaultVersionId\": \"v2\",\n [...]\n }\n}\n","aws iam get-policy-version --policy-arn $policy_arn --version-id v2\n# An example output is as follows\n{\n \"PolicyVersion\": {\n \"Document\": {\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:ListBucket\",\n \"s3:DeleteObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::\",\n \"arn:aws:s3:::/*\"\n ]\n }\n ]\n },\n [...]\n }\n}\n","kubectl describe serviceaccount milvus-s3-access-sa -n milvus\n# An example output is as follows\nName: milvus-s3-access-sa\nNamespace: milvus\nLabels: app.kubernetes.io/managed-by=eksctl\nAnnotations: eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa\n[...]\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n port: 19530\n annotations: \n service.beta.kubernetes.io/aws-load-balancer-type: external\n service.beta.kubernetes.io/aws-load-balancer-name: milvus-service\n service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing\n service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip\n\nserviceAccount:\n create: false\n name: milvus-s3-access-sa\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: \"s3.us-east-2.amazonaws.com\"\n port: \"443\"\n useSSL: true\n bucketName: \"\"\n useIAM: true\n cloudProvider: \"aws\"\n iamEndpoint: \"\"\n\nrootCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: 1\n memory: 2Gi\n\nindexCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nqueryCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\ndataCoordinator:\n replicas: 2\n activeStandby:\n enabled: true\n resources: \n limits:\n cpu: \"0.5\"\n memory: 0.5Gi\n\nproxy:\n replicas: 2\n resources: \n limits:\n cpu: 1\n memory: 2Gi \n","helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml\n"],"headingContent":"Configure S3 Access by IAM Role","anchorList":[{"label":"依 IAM 角色設定 S3 存取權限","href":"Configure-S3-Access-by-IAM-Role","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"將 IAM 角色與 Kubernetes 服務帳戶關聯","href":"Associate-an-IAM-role-with-a-Kubernetes-service-account","type":2,"isActive":false},{"label":"驗證角色和服務帳號的設定","href":"Verify-the-role-and-service-account-setup","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"驗證安裝","href":"Verify-the-installation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.md new file mode 100644 index 000000000..f33574b5c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/aws/s3.md @@ -0,0 +1,341 @@ +--- +id: s3.md +title: 依 IAM 角色設定 S3 存取權限 +related_key: 's3, storage, iam' +summary: 瞭解如何使用 IAM 角色設定 s3。 +--- +

    依 IAM 角色設定 S3 存取權限

    本主題介紹當安裝 Milvus 與 helm 時,如何依 IAM 角色設定 s3 存取。 詳細資訊請參考IAM 角色

    +

    開始之前

    +

    將 IAM 角色與 Kubernetes 服務帳戶關聯

      +
    • 建立 AWS S3 儲存桶。

      +

      閱讀桶命名規則,並在命名 AWS S3 桶時遵守命名規則。

      +
      milvus_bucket_name="milvus-bucket-$(openssl rand -hex 12)"
      +
      +aws s3api create-bucket --bucket "$milvus_bucket_name" --region 'us-east-2' --acl private  --object-ownership ObjectWriter --create-bucket-configuration LocationConstraint='us-east-2'
      +
      +
      +# Output
      +#
      +# "Location": "http://milvus-bucket-039dd013c0712f085d60e21f.s3.amazonaws.com/"
      +
    • +
    • 建立 IAM 政策,用於讀取和寫入上述建立的儲存桶內的物件。請使用您自己的名稱取代儲存桶名稱。

      +
      echo '{
      +  "Version": "2012-10-17",
      +  "Statement": [
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:ListBucket"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>"
      +      ]
      +    },
      +    {
      +      "Effect": "Allow",
      +      "Action": [
      +        "s3:DeleteObject",
      +        "s3:GetObject",
      +        "s3:PutObject"
      +      ],
      +      "Resource": [
      +        "arn:aws:s3:::<bucket-name>/*"
      +      ]
      +    }
      +  ]
      +}' > milvus-s3-policy.json
      +
      +aws iam create-policy --policy-name MilvusS3ReadWrite --policy-document file://milvus-s3-policy.json
      +
      +
      +# Get the ARN from the command output as follows:
      +# {
      +#     "Policy": {
      +#         "PolicyName": "MilvusS3ReadWrite",
      +#         "PolicyId": "AN5QQVVPM1BVTFlBNkdZT",
      +#         "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
      +#         "Path": "/",
      +#         "DefaultVersionId": "v1",
      +#         "AttachmentCount": 0,
      +#         "PermissionsBoundaryUsageCount": 0,
      +#         "IsAttachable": true,
      +#         "CreateDate": "2023-11-16T06:00:01+00:00",
      +#        "UpdateDate": "2023-11-16T06:00:01+00:00"
      +#     }
      +# }    
      +
    • +
    • 建立 IAM 角色,並將其與 Kubernetes 服務帳號相關聯。將your-account-id 改為您的帳號 ID。

    • +
    +
    eksctl create iamserviceaccount --name milvus-s3-access-sa --namespace milvus --cluster milvus-eks-cluster --role-name milvus-s3-access-sa \
    +    --attach-policy-arn arn:aws:iam::<your-account-id>:policy/MilvusS3ReadWrite --approve
    +
    +

    驗證角色和服務帳號的設定

    請參閱IAM 角色

    +
      +
    • 確認 IAM 角色的信任政策已正確設定。
    • +
    +
    aws iam get-role --role-name milvus-s3-access-sa --query Role.AssumeRolePolicyDocument
    +# An example output is as follows
    +{
    +    "Version": "2012-10-17",
    +    "Statement": [
    +        {
    +            "Effect": "Allow",
    +            "Principal": {
    +                "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
    +            },
    +            "Action": "sts:AssumeRoleWithWebIdentity",
    +            "Condition": {
    +                "StringEquals": {
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account",
    +                    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"
    +                }
    +            }
    +        }
    +    ]
    +}
    +
    +
      +
    • 確認您在之前步驟中附加到角色的政策已附加到角色。
    • +
    +
    aws iam list-attached-role-policies --role-name milvus-s3-access-sa --query 'AttachedPolicies[].PolicyArn' --output text
    +# An example output is as follows
    +arn:aws:iam::12345678901:policy/MilvusS3ReadWrite
    +
    +
      +
    • 檢視政策的預設版本。
    • +
    +
    export policy_arn='arn:aws:iam::12345678901:policy/MilvusS3ReadWrite'
    +aws iam get-policy --policy-arn $policy_arn
    +# An example output is as follows
    +{
    +    "Policy": {
    +        "PolicyName": "MilvusS3ReadWrite",
    +        "PolicyId": "EXAMPLEBIOWGLDEXAMPLE",
    +        "Arn": "arn:aws:iam::12345678901:policy/MilvusS3ReadWrite",
    +        "Path": "/",
    +        "DefaultVersionId": "v2",
    +        [...]
    +    }
    +}
    +
    +
      +
    • 檢視政策內容,確認政策包含 Pod 所需的所有權限。如有必要,請將以下指令中的 1 改為之前輸出中返回的版本。
    • +
    +
    aws iam get-policy-version --policy-arn $policy_arn --version-id v2
    +# An example output is as follows
    +{
    +    "PolicyVersion": {
    +        "Document": {
    +            "Version": "2012-10-17",
    +            "Statement": [
    +                {
    +                    "Effect": "Allow",
    +                    "Action": [
    +                        "s3:GetObject",
    +                        "s3:PutObject",
    +                        "s3:ListBucket",
    +                        "s3:DeleteObject"
    +                    ],
    +                    "Resource": [
    +                        "arn:aws:s3:::<bucket-name>",
    +                        "arn:aws:s3:::<bucket-name>/*"
    +                    ]
    +                }
    +            ]
    +        },
    +        [...]
    +    }
    +}
    +
    +
      +
    • 確認 Kubernetes 服務帳戶已註明角色。
    • +
    +
    kubectl describe serviceaccount milvus-s3-access-sa -n milvus
    +# An example output is as follows
    +Name:                milvus-s3-access-sa
    +Namespace:           milvus
    +Labels:              app.kubernetes.io/managed-by=eksctl
    +Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::12345678901:role/milvus-s3-access-sa
    +[...]
    +
    +

    部署 Milvus

    在本指南中,我們將使用 Milvus Helm Charts 部署 Milvus 群集。您可以在這裡找到圖表。

    +
      +
    • 新增 Milvus Helm Chart repo。
    • +
    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +
    +
      +
    • 準備 Milvus 配置文件milvus.yaml ,並將<bucket-name> 改為上面建立的 bucket 的名稱。
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +  port: 19530
    +  annotations: 
    +    service.beta.kubernetes.io/aws-load-balancer-type: external
    +    service.beta.kubernetes.io/aws-load-balancer-name: milvus-service
    +    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    +    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-s3-access-sa
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: "s3.us-east-2.amazonaws.com"
    +  port: "443"
    +  useSSL: true
    +  bucketName: "<bucket-name>"
    +  useIAM: true
    +  cloudProvider: "aws"
    +  iamEndpoint: ""
    +
    +rootCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi
    +
    +indexCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +queryCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +dataCoordinator:
    +  replicas: 2
    +  activeStandby:
    +    enabled: true
    +  resources: 
    +    limits:
    +      cpu: "0.5"
    +      memory: 0.5Gi
    +
    +proxy:
    +  replicas: 2
    +  resources: 
    +    limits:
    +      cpu: 1
    +      memory: 2Gi  
    +
    +
      +
    • 安裝 Milvus。
    • +
    +
    helm upgrade --install milvus-demo milvus/milvus -n milvus -f milvus.yaml
    +
    +

    驗證安裝

    請參考Verify-the-installation

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/abs.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/abs.json new file mode 100644 index 000000000..42b16adf5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/abs.json @@ -0,0 +1 @@ +{"codeList":["export RESOURCE_GROUP=\"\"\nexport AKS_CLUSTER=\"\" \nexport SUB_ID=\"\"\nexport USER_ASSIGNED_IDENTITY_NAME=\"workload-identity\"\nexport SERVICE_ACCOUNT_NAME=\"milvus-abs-access-sa\"\nexport STORAGE_ACCOUNT_NAME=\"milvustesting1\"\nexport CONTAINER_NAME=\"testmilvus\"\nexport LOCATION=\"\"\nexport SERVICE_ACCOUNT_NAMESPACE=\"default\"\n","az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity\n","export SERVICE_ACCOUNT_ISSUER=\"$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)\"\n","az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}\n\n","az identity create --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\"\nexport USER_ASSIGNED_IDENTITY_CLIENT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'clientId' -otsv)\"\nexport USER_ASSIGNED_IDENTITY_OBJECT_ID=\"$(az identity show --name \"${USER_ASSIGNED_IDENTITY_NAME}\" --resource-group \"${RESOURCE_GROUP}\" --query 'principalId' -otsv)\"\naz role assignment create --role \"Storage Blob Data Contributor\" --assignee \"${USER_ASSIGNED_IDENTITY_OBJECT_ID}\" --scope \"/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}\"\n\n","cat <透過工作負載身分設定 Blob 儲存存取

    本主題介紹當您使用 helm 安裝 Milvus 時,如何透過 Workload Identity 設定 Azure Blob Storage 存取權限。 如需詳細資訊,請參閱Workload Identity

    +

    設定應用程式使用 Workload Identity

      +
    • 設定環境。
    • +
    +
    export RESOURCE_GROUP="<your resource group>"
    +export AKS_CLUSTER="<your aks cluster name>" 
    +export SUB_ID="<your Subscription ID>"
    +export USER_ASSIGNED_IDENTITY_NAME="workload-identity"
    +export SERVICE_ACCOUNT_NAME="milvus-abs-access-sa"
    +export STORAGE_ACCOUNT_NAME="milvustesting1"
    +export CONTAINER_NAME="testmilvus"
    +export LOCATION="<your location>"
    +export SERVICE_ACCOUNT_NAMESPACE="default"
    +
    +
      +
    • 使用 OIDC 發行者和 Workload Identity 更新 AKS 叢集。
    • +
    +
    az aks update -g ${RESOURCE_GROUP} -n ${AKS_CLUSTER} --enable-oidc-issuer --enable-workload-identity
    +
    +
      +
    • 取得 OIDC 發行者 URL。
    • +
    +
    export SERVICE_ACCOUNT_ISSUER="$(az aks show --resource-group ${RESOURCE_GROUP} --name ${AKS_CLUSTER} --query 'oidcIssuerProfile.issuerUrl' -otsv)"
    +
    +
      +
    • 建立儲存帳戶和容器。
    • +
    +
    az storage account create -n ${STORAGE_ACCOUNT_NAME} -g ${RESOURCE_GROUP} -l $LOCATION --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n ${CONTAINER_NAME} --account-name ${STORAGE_ACCOUNT_NAME}
    +
    +
    +
      +
    • 建立使用者指定的管理身分並指定角色。
    • +
    +
    az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}"
    +export USER_ASSIGNED_IDENTITY_CLIENT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'clientId' -otsv)"
    +export USER_ASSIGNED_IDENTITY_OBJECT_ID="$(az identity show --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --query 'principalId' -otsv)"
    +az role assignment create --role "Storage Blob Data Contributor" --assignee "${USER_ASSIGNED_IDENTITY_OBJECT_ID}" --scope "/subscriptions/${SUB_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Storage/storageAccounts/${STORAGE_ACCOUNT_NAME}"
    +
    +
    +
      +
    • 建立服務帳戶。
    • +
    +
    cat <<EOF | kubectl apply -f -
    +apiVersion: v1
    +kind: ServiceAccount
    +metadata:
    +  annotations:
    +    azure.workload.identity/client-id: ${USER_ASSIGNED_IDENTITY_CLIENT_ID}
    +  name: ${SERVICE_ACCOUNT_NAME}
    +EOF
    +
    +
      +
    • 在身分與服務帳戶發行者及主體之間建立聯合身分憑證。
    • +
    +
    az identity federated-credential create \
    +  --name "kubernetes-federated-credential" \
    +  --identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
    +  --resource-group "${RESOURCE_GROUP}" \
    +  --issuer "${SERVICE_ACCOUNT_ISSUER}" \
    +  --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}"
    +
    +

    部署 Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    的 values.yaml 內容:

    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +labels:
    +  azure.workload.identity/use: "true"
    +
    +serviceAccount:
    +  create: false
    +  name: milvus-abs-access-sa # SERVICE_ACCOUNT_NAME
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # CONTAINER_NAME
    +  cloudProvider: azure
    +  useSSL: true
    +  useIAM: true
    +  accessKey: "milvustesting1" # STORAGE_ACCOUNT_NAME
    +  secretKey: ""
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.json new file mode 100644 index 000000000..07ce8cdb7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.json @@ -0,0 +1 @@ +{"codeList":["az account set --subscription EXAMPLE-SUBSCRIPTION-ID\n","az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME\n","az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2\naz storage container create -n testmilvus --account-name milvustesting1\n","az storage account keys list --account-name milvustesting2\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nextraConfigFiles:\n user.yaml: |+\n common:\n storageType: remote\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: core.windows.net\n port: 443\n rootPath: my-release\n bucketName: testmilvus # the storage account container name\n cloudProvider: azure\n useSSL: true\n accessKey: \"milvustesting1\" # the storage account name\n secretKey: \"\" \n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy Milvus on Azure with AKS","anchorList":[{"label":"使用 AKS 在 Azure 上部署 Milvus","href":"Deploy-Milvus-on-Azure-with-AKS","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"軟體需求","href":"Software-requirements","type":2,"isActive":false},{"label":"佈建 Kubernetes 叢集","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"連接至群集","href":"Connect-to-the-cluster","type":2,"isActive":false},{"label":"設定訂閱和憑證","href":"Set-a-subscription-and-credentials","type":2,"isActive":false},{"label":"使用 Azure Blob Storage 作為外部物件儲存","href":"Using-Azure-Blob-Storage-as-external-object-storage","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"驗證部署","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"你好 Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.md new file mode 100644 index 000000000..1c6cdab7a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/azure.md @@ -0,0 +1,299 @@ +--- +id: azure.md +title: 使用 Kubernetes 在 Microsoft Azure 上部署 Milvus +related_key: cluster +summary: 瞭解如何在 Azure 上部署 Milvus 群集。 +--- +

    使用 AKS 在 Azure 上部署 Milvus

    本主題描述如何使用Azure Kubernetes Service(AKS) 和Azure 入口網站佈建和建立叢集。

    +

    先決條件

    確保您的 Azure 專案已設定妥當,且您有存取要使用的資源的權限。如果您不確定您的存取權限,請聯絡您的管理員。

    +

    軟體需求

    +

    或者,您可以使用預先安裝了 Azure CLI、kubectl 和 Helm 的Cloud Shell

    +
    安裝 Azure CLI 之後,請確認已正確驗證。
    +

    佈建 Kubernetes 叢集

      +
    1. 登入 Azure 入口網站。
    2. +
    3. 在 Azure 入口網站功能表上或從首頁,選擇建立資源
    4. +
    5. 選擇容器>Kubernetes 服務
    6. +
    7. Basics頁面上,設定下列選項:
    8. +
    +
      +
    • 專案詳細資訊

      +
        +
      • 訂閱:請聯絡您組織的 Azure 管理員,以確定您應該使用的訂閱。

        +
          +
        • 資源群組:聯繫您組織的 Azure 管理員,以確定應該使用哪個資源群組。
        • +
      • +
    • +
    • 群集詳細資訊

      +
        +
      • Kubernetes 群集名稱:輸入群集名稱。

      • +
      • 區域:選擇一個區域。

      • +
      • 可用性區域:根據需要選擇可用性區域。對於生產群集,建議您選擇多個可用性區域。

      • +
    • +
    • 主要節點池

      +
        +
      • 節點大小:我們建議您選擇最低 16 GB 記憶體的虛擬機器,但您也可以根據需要選擇虛擬機器大小。

      • +
      • 擴充方式:選擇擴充方式。

      • +
      • 節點數量範圍:選擇節點數的範圍。

      • +
    • +
    • 節點池

      +
        +
      • Enable virtual nodes(啟用虛擬節點):選取核取方塊以啟用虛擬節點。

      • +
      • 啟用虛擬機器規模集:建議您選擇enabled

      • +
    • +
    • 網路

      +
        +
      • 網路組態:我們建議您選擇Kubenet

      • +
      • DNS 名稱前綴:輸入 DNS 名稱前綴。

      • +
      • 流量路由

        +
          +
        • 負載平衡器Standard

        • +
        • HTTP 應用程式路由:不需要。

        • +
      • +
    • +
    +
      +
    1. 設定選項後,按一下檢閱 + 建立,驗證完成後再按一下建立。建立群集需要幾分鐘時間。
    2. +
    +

    連接至群集

      +
    1. 導覽到您在 Kubernetes 服務中建立的群集,然後按一下它。
    2. +
    3. 在左側導覽窗格中,按一下Overview
    4. +
    5. 在顯示的「總覽」頁面上,按一下「連線」以檢視資源群組和訂閱。
    6. +
    +

    設定訂閱和憑證

    您可以使用 Azure Cloud Shell 執行下列程序。
    +
      +
    1. 執行以下指令以設定訂閱。
    2. +
    +
    az account set --subscription EXAMPLE-SUBSCRIPTION-ID
    +
    +
      +
    1. 執行下列指令下載憑證,並設定 Kubernetes CLI 以使用憑證。
    2. +
    +
    az aks get-credentials --resource-group YOUR-RESOURCE-GROUP --name YOUR-CLUSTER-NAME
    +
    +
    +使用相同的 shell 執行下列程序。如果切換到其他 shell,請重新執行前面的指令。
    +

    使用 Azure Blob Storage 作為外部物件儲存

    Azure Blob Storage 是 AWS Simple Storage Service (S3) 的 Azure 版本。

    +
      +
    • 建立儲存帳戶和容器
    • +
    +
    az storage account create -n milvustesting1 -g MyResourceGroup -l eastus --sku Standard_LRS --min-tls-version TLS1_2
    +az storage container create -n testmilvus --account-name milvustesting1
    +
    +
      +
    • 取得秘鑰,使用第一個值
    • +
    +
    az storage account keys list --account-name milvustesting2
    +
    +
      +
    • 新增 values.yaml
    • +
    +
    cluster:
    +  enabled: true
    +
    +service:
    +  type: LoadBalancer
    +
    +extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      storageType: remote
    +
    +minio:
    +  enabled: false
    +
    +externalS3:
    +  enabled: true
    +  host: core.windows.net
    +  port: 443
    +  rootPath: my-release
    +  bucketName: testmilvus # the storage account container name
    +  cloudProvider: azure
    +  useSSL: true
    +  accessKey: "milvustesting1" # the storage account name
    +  secretKey: "<secret-key>" 
    +
    +

    部署 Milvus

    現在 Kubernetes 叢集已準備就緒。讓我們馬上部署 Milvus。

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    在前面的指令中,我們在本機新增 Milvus Helm 圖表的 repo,並更新 repo 以取得最新的圖表。然後,我們安裝一個 Milvus 實例,並命名為my-release

    +

    請注意配置service.type 的值,它表示我們希望透過 Layer-4 負載平衡器來揭露 Milvus 的實例。

    +

    驗證部署

    所有 pod 都執行後,執行下列指令以取得外部 IP 位址。

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    你好 Milvus

    請參考Hello Milvus,將 host 值變更為外部 IP 位址,然後執行程式碼。

    +

    下一步

    如果您想學習如何在其他雲端部署 Milvus:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.json new file mode 100644 index 000000000..3f211b266 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.json @@ -0,0 +1 @@ +{"codeList":["export DNS_LABEL=\"milvustest\" # Your DNS label must be unique within its Azure location.\nexport NAMESPACE=\"ingress-basic\"\n","helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx\nhelm repo update\nhelm install ingress-nginx ingress-nginx/ingress-nginx \\\n --create-namespace \\\n --namespace $NAMESPACE \\\n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-dns-label-name\"=$DNS_LABEL \\ \n --set controller.service.annotations.\"service\\.beta\\.kubernetes\\.io/azure-load-balancer-health-probe-request-path\"=/healthz\n","kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller\n","# Public IP address of your ingress controller\nIP=\"MY_EXTERNAL_IP\"\n\n# Get the resource-id of the public IP\nPUBLICIPID=$(az network public-ip list --query \"[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]\" --output tsv)\n\n# Update public IP address with DNS name\naz network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL\n\n# Display the FQDN\naz network public-ip show --ids $PUBLICIPID --query \"[dnsSettings.fqdn]\" --output tsv\n# sample output: milvustest.eastus2.cloudapp.azure.com\n","helm repo add jetstack https://charts.jetstack.io\nhelm repo update\nhelm install cert-manager jetstack/cert-manager \\\n --namespace $NAMESPACE \\\n --set installCRDs=true\n","apiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt\nspec:\n acme:\n server: https://acme-v02.api.letsencrypt.org/directory\n email: MY_EMAIL_ADDRESS\n privateKeySecretRef:\n name: letsencrypt\n solvers:\n - http01:\n ingress:\n class: nginx\n","kubectl apply -f cluster-issuer.yaml\n","kubectl apply -f ingress.yaml\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n annotations:\n cert-manager.io/cluster-issuer: letsencrypt\n nginx.ingress.kubernetes.io/backend-protocol: GRPC\n nginx.ingress.kubernetes.io/force-ssl-redirect: \"true\"\n nginx.ingress.kubernetes.io/proxy-body-size: 2048m\nspec:\n ingressClassName: nginx\n tls:\n - hosts:\n - milvustest.eastus2.cloudapp.azure.com # the FQDN\n secretName: tls-secret\n rules:\n - host: milvustest.eastus2.cloudapp.azure.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl get certificate \nNAME READY SECRET AGE\ntls-secret True tls-secret 8m7s\nkubectl get ingress\nNAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus nginx milvustest.eastus2.cloudapp.azure.com EXTERNAL-IP 80, 443 8m15s\n","connections.connect(\"default\",uri=\"https://milvustest.eastus2.cloudapp.azure.com:443\") \n"],"headingContent":"Configure ingress nginx with Milvus","anchorList":[{"label":"使用Milvus配置nginx入口","href":"Configure-ingress-nginx-with-Milvus","type":1,"isActive":false},{"label":"配置nginx入口","href":"Configure-ingress-nginx","type":2,"isActive":false},{"label":"安裝 cert-manager","href":"Install-cert-manager","type":2,"isActive":false},{"label":"建立 CA 叢集簽發器","href":"Create-a-CA-cluster-issuer","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"建立 Milvus 入口路由","href":"Create-Milvus-ingress-route","type":2,"isActive":false},{"label":"驗證","href":"Verify","type":2,"isActive":false},{"label":"你好 Milvus","href":"Hello-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.md new file mode 100644 index 000000000..77a56bf76 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/azure/ingress.md @@ -0,0 +1,235 @@ +--- +id: ingress.md +title: 使用Milvus配置nginx入口 +related_key: ingress nginx +summary: 學習如何使用 Milvus 配置 ingress nginx。 +--- +

    使用Milvus配置nginx入口

    本主題介紹如何使用 Milvus 配置 ingress nginx。 詳情請參閱ingress-nginx

    +

    配置nginx入口

      +
    • 設置環境。
    • +
    +
    export DNS_LABEL="milvustest" # Your DNS label must be unique within its Azure location.
    +export NAMESPACE="ingress-basic"
    +
    +
      +
    • 安裝ngress nginx
    • +
    +
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    +helm repo update
    +helm install ingress-nginx ingress-nginx/ingress-nginx \
    +    --create-namespace \
    +    --namespace $NAMESPACE \
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL \  
    +    --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz
    +
    +
      +
    • 獲取外部 IP 位址。
    • +
    +
    kubectl --namespace $NAMESPACE get services -o wide -w ingress-nginx-controller
    +
    +
      +
    • 設定ngress控制器的FQDN。
    • +
    +
    # Public IP address of your ingress controller
    +IP="MY_EXTERNAL_IP"
    +
    +# Get the resource-id of the public IP
    +PUBLICIPID=$(az network public-ip list --query "[?ipAddress!=null]|[?contains(ipAddress, '$IP')].[id]" --output tsv)
    +
    +# Update public IP address with DNS name
    +az network public-ip update --ids $PUBLICIPID --dns-name $DNS_LABEL
    +
    +# Display the FQDN
    +az network public-ip show --ids $PUBLICIPID --query "[dnsSettings.fqdn]" --output tsv
    +# sample output: milvustest.eastus2.cloudapp.azure.com
    +
    +

    安裝 cert-manager

    helm repo add jetstack https://charts.jetstack.io
    +helm repo update
    +helm install cert-manager jetstack/cert-manager \
    +    --namespace $NAMESPACE \
    +    --set installCRDs=true
    +
    +

    建立 CA 叢集簽發器

      +
    • 使用下列範例清單建立叢集簽發器,例如 cluster-issuer.yaml。將 MY_EMAIL_ADDRESS 改為您組織的有效地址。
    • +
    +
    apiVersion: cert-manager.io/v1
    +kind: ClusterIssuer
    +metadata:
    +  name: letsencrypt
    +spec:
    +  acme:
    +    server: https://acme-v02.api.letsencrypt.org/directory
    +    email: MY_EMAIL_ADDRESS
    +    privateKeySecretRef:
    +      name: letsencrypt
    +    solvers:
    +    - http01:
    +        ingress:
    +          class: nginx
    +
    +
      +
    • 使用 kubectl apply 指令套用簽發器。
    • +
    +
    kubectl apply -f cluster-issuer.yaml
    +
    +

    部署 Milvus

    參考Azure,注意配置service.type 值,您需要變更為ClusterIP

    +

    建立 Milvus 入口路由

    kubectl apply -f ingress.yaml
    +
    +

    請參閱 ingress.yaml 的內容:

    +
    apiVersion: networking.k8s.io/v1
    +kind: Ingress
    +metadata:
    +  name: my-release-milvus
    +  annotations:
    +    cert-manager.io/cluster-issuer: letsencrypt
    +    nginx.ingress.kubernetes.io/backend-protocol: GRPC
    +    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    +    nginx.ingress.kubernetes.io/proxy-body-size: 2048m
    +spec:
    +  ingressClassName: nginx
    +  tls:
    +  - hosts:
    +    - milvustest.eastus2.cloudapp.azure.com # the FQDN
    +    secretName: tls-secret
    +  rules:
    +    - host: milvustest.eastus2.cloudapp.azure.com
    +      http:
    +        paths:
    +          - path: /
    +            pathType: Prefix
    +            backend:
    +              service:
    +                name: my-release-milvus
    +                port:
    +                  number: 19530
    +
    +

    驗證

    kubectl get certificate 
    +NAME         READY   SECRET       AGE
    +tls-secret   True    tls-secret   8m7s
    +kubectl get ingress
    +NAME                CLASS   HOSTS                                   ADDRESS        PORTS     AGE
    +my-release-milvus   nginx   milvustest.eastus2.cloudapp.azure.com   EXTERNAL-IP   80, 443   8m15s
    +
    +

    你好 Milvus

    請參考Hello Milvus,變更 uri args,然後執行程式碼。

    +
    connections.connect("default",uri="https://milvustest.eastus2.cloudapp.azure.com:443") 
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.json new file mode 100644 index 000000000..3e0c3894b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.json @@ -0,0 +1 @@ +{"codeList":["gcloud compute networks create milvus-network \\\n --project=milvus-testing-nonprod \\\n --subnet-mode=auto \\\n --mtu=1460 \\\n --bgp-routing-mode=regional\n","gcloud compute firewall-rules create milvus-network-allow-icmp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows ICMP connections from any source to any instance on the network.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=icmp\n\ngcloud compute firewall-rules create milvus-network-allow-internal \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows connections from any source in the network IP range to any instance on the network using all protocols.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=10.128.0.0/9 \\\n --action=ALLOW --rules=all\n\ngcloud compute firewall-rules create milvus-network-allow-rdp \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows RDP connections from any source to any instance on the network using port 3389.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:3389\n\ngcloud compute firewall-rules create milvus-network-allow-ssh \\\n --project=milvus-testing-nonprod \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --description=\"Allows TCP connections from any source to any instance on the network using port 22.\" \\\n --direction=INGRESS \\\n --priority=65534 \\\n --source-ranges=0.0.0.0/0 \\\n --action=ALLOW \\\n --rules=tcp:22\n","gcloud compute firewall-rules create allow-milvus-in \\\n --project=milvus-testing-nonprod \\\n --description=\"Allow ingress traffic for Milvus on port 19530\" \\\n --direction=INGRESS \\\n --priority=1000 \\\n --network=projects/milvus-testing-nonprod/global/networks/milvus-network \\\n --action=ALLOW \\\n --rules=tcp:19530 \\\n --source-ranges=0.0.0.0/0\n","gcloud container clusters create \"milvus-cluster-1\" \\\n --project \"milvus-testing-nonprod\" \\\n --zone \"us-west1-a\" \\\n --workload-pool \"milvus-testing-nonprod.svc.id.goog\" \\\n --no-enable-basic-auth \\\n --cluster-version \"1.28.10-gke.1075001\" \\\n --release-channel \"regular\" \\\n --machine-type \"c2-standard-4\" \\\n --image-type \"COS_CONTAINERD\" \\\n --disk-type \"pd-standard\" \\\n --disk-size \"100\" \\\n --max-pods-per-node \"110\" \\\n --num-nodes \"3\" \\\n --enable-ip-alias \\\n --network \"projects/milvus-testing-nonprod/global/networks/milvus-network\" \\\n --subnetwork \"projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network\"\n","gcloud container clusters get-credentials milvus-cluster-1 --zone \"us-west1-a\"\n","gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n accessKey: \"\"\n secretKey: \"\"\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update\nhelm install -f values.yaml my-release milvus/milvus\n","kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'\n"],"headingContent":"Deploy a Milvus Cluster on GKE","anchorList":[{"label":"在 GKE 上部署 Milvus 集群","href":"Deploy-a-Milvus-Cluster-on-GKE","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"設定網路","href":"Set-up-the-network","type":2,"isActive":false},{"label":"佈建 Kubernetes 群集","href":"Provision-a-Kubernetes-cluster","type":2,"isActive":false},{"label":"使用 Google Cloud Storage (GCS) 作為外部物件儲存空間","href":"Use-Google-Cloud-Storage-GCS-as-external-object-storage","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"驗證部署","href":"Verify-the-deployment","type":2,"isActive":false},{"label":"你好 Milvus","href":"Hello-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.md new file mode 100644 index 000000000..6784e5e20 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp.md @@ -0,0 +1,287 @@ +--- +id: gcp.md +title: 在 GKE 上部署 Milvus 集群 +related_key: cluster +summary: 了解如何在 GKE 上部署 Milvus 群集。 +--- +

    在 GKE 上部署 Milvus 集群

    Milvus 是雲端原生向量資料庫,可部署於各種雲端環境。本指南將教您如何在 Google Cloud Platform (GCP) 上設定 Milvus 的每個細節。

    +

    + + Deploy a Milvus cluster on GCP + 在 GCP 上部署 Milvus 叢集

    +

    開始之前

    要在 GCP 上部署 Milvus,請確保

    + +

    設定網路

    為了確保 Milvus 的安全性,您需要在 GCP 專案中建立邏輯隔離的虛擬網路。以下指令會建立一個 VPC。

    +
    gcloud compute networks create milvus-network \
    +    --project=milvus-testing-nonprod \
    +    --subnet-mode=auto \
    +    --mtu=1460 \
    +    --bgp-routing-mode=regional
    +
    +

    為了方便您的工作,您也需要設定數個防火牆規則,以允許透過 ICMP、RDP 和 SSH 的外部流量,以及 VPC 內的流量。

    +
    gcloud compute firewall-rules create milvus-network-allow-icmp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows ICMP connections from any source to any instance on the network." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=icmp
    +
    +gcloud compute firewall-rules create milvus-network-allow-internal \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows connections from any source in the network IP range to any instance on the network using all protocols." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=10.128.0.0/9 \
    +    --action=ALLOW --rules=all
    +
    +gcloud compute firewall-rules create milvus-network-allow-rdp \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows RDP connections from any source to any instance on the network using port 3389." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:3389
    +
    +gcloud compute firewall-rules create milvus-network-allow-ssh \
    +    --project=milvus-testing-nonprod \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --description="Allows TCP connections from any source to any instance on the network using port 22." \
    +    --direction=INGRESS \
    +    --priority=65534 \
    +    --source-ranges=0.0.0.0/0 \
    +    --action=ALLOW \
    +    --rules=tcp:22
    +
    +

    最後,您需要允許埠19530 的傳入流量到我們稍後建立的 Milvus 實例。

    +
    gcloud compute firewall-rules create allow-milvus-in \
    +    --project=milvus-testing-nonprod  \
    +    --description="Allow ingress traffic for Milvus on port 19530" \
    +    --direction=INGRESS \
    +    --priority=1000 \
    +    --network=projects/milvus-testing-nonprod/global/networks/milvus-network \
    +    --action=ALLOW \
    +    --rules=tcp:19530 \
    +    --source-ranges=0.0.0.0/0
    +
    +

    佈建 Kubernetes 群集

    在本指南中,我們將使用 Google Kubernetes Engine (GKE) 服務,在us-west1-a區域中佈建一個有兩個節點的 Kubernetes 叢集。每個節點都是執行COS_CONTAINERD映像的e2-standard-4Compute Engine 虛擬機。

    +
    +

    建議您使用提供至少 16 GB 記憶體的機器類型,以確保服務的穩定性。

    +
    +
    gcloud container clusters create "milvus-cluster-1" \
    +    --project "milvus-testing-nonprod" \
    +    --zone "us-west1-a" \
    +    --workload-pool "milvus-testing-nonprod.svc.id.goog" \
    +    --no-enable-basic-auth \
    +    --cluster-version "1.28.10-gke.1075001" \
    +    --release-channel "regular" \
    +    --machine-type "c2-standard-4" \
    +    --image-type "COS_CONTAINERD" \
    +    --disk-type "pd-standard" \
    +    --disk-size "100" \
    +    --max-pods-per-node "110" \
    +    --num-nodes "3" \
    +    --enable-ip-alias \
    +    --network "projects/milvus-testing-nonprod/global/networks/milvus-network" \
    +    --subnetwork "projects/milvus-testing-nonprod/regions/us-west1/subnetworks/milvus-network"
    +
    +

    Kubernetes 叢集需要幾分鐘的時間才能啟動。叢集準備就緒後,請使用下列指令取得其憑證,以便您可以在終端執行kubectl 指令,與叢集進行遠端通訊。

    +
    gcloud container clusters get-credentials milvus-cluster-1 --zone "us-west1-a"
    +
    +

    使用 Google Cloud Storage (GCS) 作為外部物件儲存空間

      +
    • 建立儲存桶。
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • 產生使用者存取金鑰和秘密金鑰,您應該到專案的儲存頁面。在儀表板的左側邊欄,按一下 Google Cloud Storage,然後按一下設定。選取 INTEROPERABILITY 索引標籤。如果尚未啟用,請按一下互操作存取。然後按一下 CREATE A KEY 按鈕以建立。
    • +
    +

    + + GCP Access keys for your user account + 用戶帳戶的 GCP 存取金鑰

    +
      +
    • 新增 values.yaml
    • +
    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    accessKey: "<access-key>"
    +    secretKey: "<secret-key>"
    +
    +

    部署 Milvus

    現在 Kubernetes 叢集已準備就緒。讓我們馬上部署 Milvus。

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +helm install -f values.yaml my-release milvus/milvus
    +
    +

    在前面的指令中,我們在本機新增 Milvus Helm 圖表的 repo,並更新 repo 以取得最新的圖表。然後,我們安裝一個 Milvus 實例,並命名為my-release

    +

    請注意配置service.type 的值,它表示我們希望透過 Layer-4 負載平衡器揭露 Milvus 的實例。

    +

    如果您想透過第 7 層負載平衡器暴露您的 Milvus 實例,請閱讀這篇文章

    +

    驗證部署

    所有 pod 都運行後,執行下列指令以取得外部 IP 位址。

    +
    kubectl get services|grep my-release-milvus|grep LoadBalancer|awk '{print $4}'
    +
    +

    你好 Milvus

    請參考Hello Milvus,將 host 值變更為外部 IP 位址,然後執行程式碼。

    +

    下一步

    如果您想學習如何在其他雲端部署 Milvus:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.json new file mode 100644 index 000000000..e8fad916b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.json @@ -0,0 +1 @@ +{"codeList":["helm upgrade my-release milvus/milvus --set service.type=ClusterIP\n","helm upgrade my-release milvus/milvus -f tls.yaml\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n tlsMode: 1\n","apiVersion: cloud.google.com/v1\nkind: BackendConfig\nmetadata:\n name: my-release-backendconfig\n namespace: default\nspec:\n healthCheck:\n port: 9091\n requestPath: /healthz\n type: HTTP\n","kubectl apply -f backendconfig.yaml\n","kubectl annotate service my-release-milvus \\\n cloud.google.com/app-protocols='{\"milvus\":\"HTTP2\"}' \\\n cloud.google.com/backend-config='{\"default\": \"my-release-backendconfig\"}' \\\n cloud.google.com/neg='{\"ingress\": true}' --overwrite\n","# Generates a tls.key.\nopenssl genrsa -out tls.key 2048\n\n# Creates a certificate and signs it with the preceding key.\nopenssl req -new -key tls.key -out tls.csr \\\n -subj \"/CN=my-release.milvus.io\"\n\nopenssl x509 -req -days 99999 -in tls.csr -signkey tls.key \\\n -out tls.crt\n","kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key\n","apiVersion: networking.gke.io/v1\nkind: ManagedCertificate\nmetadata:\n name: my-release-milvus-tls\nspec:\n domains:\n - my-release.milvus.io\n","kubectl apply -f ./managed-crt.yaml\n","kubectl get -f ./managed-crt.yaml -o yaml -w\n","status:\n certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e\n certificateStatus: Provisioning\n domainStatus:\n - domain: my-release.milvus.io\n status: Provisioning\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\nspec:\n tls:\n - hosts:\n - my-release.milvus.io\n secretName: my-release-milvus-tls\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-release-milvus\n namespace: default\n annotations:\n networking.gke.io/managed-certificates: \"my-release-milvus-tls\"\nspec:\n rules:\n - host: my-release.milvus.io\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: my-release-milvus\n port:\n number: 19530\n","kubectl apply -f ingress.yaml\n","kubectl -f ./config/samples/ingress.yaml get -w\n","NAME CLASS HOSTS ADDRESS PORTS AGE\nmy-release-milvus my-release.milvus.io 80 4s\nmy-release-milvus my-release.milvus.io 34.111.144.65 80, 443 41m\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", server_pem_path=\"tls.crt\", secure=True, server_name=\"my-release.milvus.io\")\n\n# For Google-managed certificates, there is not need to do so.\nconnections.connect(\"default\", host=\"34.111.144.65\", port=\"443\", secure=True, server_name=\"my-release.milvus.io\")\n"],"headingContent":"Set up a Layer-7 Load Balancer for Milvus on GCP","anchorList":[{"label":"為 GCP 上的 Milvus 設定第 7 層負載平衡器","href":"Set-up-a-Layer-7-Load-Balancer-for-Milvus-on-GCP","type":1,"isActive":false},{"label":"驗證透過 Layer-7 負載平衡器的連線","href":"Verify-the-connection-through-the-Layer-7-load-balancer","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.md new file mode 100644 index 000000000..eced247e4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcp_layer7.md @@ -0,0 +1,213 @@ +--- +id: gcp_layer7.md +title: 為 GCP 上的 Milvus 設定第 7 層負載平衡器 +related_key: cluster +summary: 了解如何在 GCP 上的 Layer-7 負載平衡器後面部署 Milvus 群集。 +--- +

    為 GCP 上的 Milvus 設定第 7 層負載平衡器

    與 Layer-4 負載平衡器相比,Layer-7 負載平衡器提供智慧型負載平衡和快取功能,是雲原生服務的最佳選擇。

    +

    本指南將教您如何為已在第 4 層負載平衡器後執行的 Milvus 集群設定第 7 層負載平衡器。

    +

    開始之前

    +

    調整 Milvus 配置

    本指南假設您已在 GCP 的第 4 層負載平衡器後部署 Milvus 叢集

    +

    在為此 Milvus 叢集設定 Layer-7 負載平衡器之前,請執行下列指令移除 Layer-4 負載平衡器。

    +
    helm upgrade my-release milvus/milvus --set service.type=ClusterIP
    +
    +

    作為第 7 層負載平衡器的後端服務,Milvus 必須符合某些加密要求,這樣才能理解來自負載平衡器的 HTTP/2 請求。因此,您需要在 Milvus 集群上啟用 TLS,如下所示。

    +
    helm upgrade my-release milvus/milvus -f tls.yaml
    +
    +

    的 tls.yaml 內容:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        tlsMode: 1
    +
    +

    設定健康檢查端點

    為了確保服務可用性,GCP 上的 Layer-7 負載平衡需要探測後端服務的健康狀況。因此,我們需要設定一個 BackendConfig 來包裝健康檢查端點,並透過註解將 BackendConfig 與 Milvus 服務關聯。

    +

    以下片段就是 BackendConfig 的設定。將它儲存為backendconfig.yaml ,以備日後使用。

    +
    apiVersion: cloud.google.com/v1
    +kind: BackendConfig
    +metadata:
    +  name: my-release-backendconfig
    +  namespace: default
    +spec:
    +  healthCheck:
    +    port: 9091
    +    requestPath: /healthz
    +    type: HTTP
    +
    +

    然後執行下列指令來建立健康檢查端點。

    +
    kubectl apply -f backendconfig.yaml
    +
    +

    最後,更新 Milvus 服務的註解,要求我們稍後建立的 Layer-7 負載平衡器使用剛建立的端點執行健康檢查。

    +
    kubectl annotate service my-release-milvus \
    +    cloud.google.com/app-protocols='{"milvus":"HTTP2"}' \
    +    cloud.google.com/backend-config='{"default": "my-release-backendconfig"}' \
    +    cloud.google.com/neg='{"ingress": true}' --overwrite
    +
    +
    +
      +
    • 至於第一個註解、

      +

      Milvus 原生於 gRPC,而 gRPC 是建基於 HTTP/2 的。因此,我們可以使用 HTTP/2 作為 Layer-7 負載平衡器與 Milvus 之間的通訊協定。

    • +
    • 至於第二個註解、

      +

      Milvus 只透過 gRPC 和 HTTP/1 提供健康檢查端點。我們需要設定一個 BackendConfig 來包裝健康檢查端點,並將其與 Milvus 服務關聯,以便 Layer-7 負載平衡器探測此端點以瞭解 Milvus 的健康狀況。

    • +
    • 至於第三個註解、

      +

      它要求在建立入口後建立網路端點群組 (NEG)。當 NEG 與 GKE Ingress 一起使用時,Ingress 控制器會促進負載平衡器各方面的建立。這包括建立虛擬 IP 位址、轉寄規則、健康檢查、防火牆規則等。如需詳細資訊,請參閱Google Cloud 文件

    • +
    +
    +

    準備 TLS 憑證

    TLS 需要憑證才能運作。有兩種建立憑證的方法,即自我管理和 Google 管理。

    +

    本指南使用my-release.milvus.io作為存取我們 Milvus 服務的網域名稱。

    +

    建立自我管理的憑證

    執行下列指令來建立證書。

    +
    # Generates a tls.key.
    +openssl genrsa -out tls.key 2048
    +
    +# Creates a certificate and signs it with the preceding key.
    +openssl req -new -key tls.key -out tls.csr \
    +    -subj "/CN=my-release.milvus.io"
    +
    +openssl x509 -req -days 99999 -in tls.csr -signkey tls.key \
    +    -out tls.crt
    +
    +

    然後使用這些檔案在您的 GKE 叢集中建立一個秘密,以供日後使用。

    +
    kubectl create secret tls my-release-milvus-tls --cert=./tls.crt --key=./tls.key
    +
    +

    建立 Google 管理的憑證

    以下片段是 ManagedCertificate 的設定。將它儲存為managed-crt.yaml 以備稍後使用。

    +
    apiVersion: networking.gke.io/v1
    +kind: ManagedCertificate
    +metadata:
    +  name: my-release-milvus-tls
    +spec:
    +  domains:
    +    - my-release.milvus.io
    +
    +

    將設定套用至您的 GKE 叢集,建立受管理的憑證,方法如下:

    +
    kubectl apply -f ./managed-crt.yaml
    +
    +

    這可能會持續一段時間。您可以執行

    +
    kubectl get -f ./managed-crt.yaml -o yaml -w
    +
    +

    輸出應與以下相似:

    +
    status:
    +  certificateName: mcrt-34446a53-d639-4764-8438-346d7871a76e
    +  certificateStatus: Provisioning
    +  domainStatus:
    +  - domain: my-release.milvus.io
    +    status: Provisioning
    +
    +

    一旦certificateStatus轉為Active,您就可以設定負載平衡器了。

    +

    建立一個 Ingress 來產生第七層負載平衡器

    使用下列其中一個片段建立 YAML 檔案。

    +
      +
    • 使用自我管理的憑證

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +spec:
      +  tls:
      +  - hosts:
      +    - my-release.milvus.io
      +    secretName: my-release-milvus-tls
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    • 使用 Google 管理的憑證

      +
      apiVersion: networking.k8s.io/v1
      +kind: Ingress
      +metadata:
      +  name: my-release-milvus
      +  namespace: default
      +  annotations:
      +    networking.gke.io/managed-certificates: "my-release-milvus-tls"
      +spec:
      +  rules:
      +  - host: my-release.milvus.io
      +    http:
      +      paths:
      +      - path: /
      +        pathType: Prefix
      +        backend:
      +          service:
      +            name: my-release-milvus
      +            port:
      +              number: 19530
      +
    • +
    +

    然後將檔案套用到 GKE 叢集,即可建立 Ingress。

    +
    kubectl apply -f ingress.yaml
    +
    +

    現在,等待 Google 設定第七層負載平衡器。您可以執行

    +
    kubectl  -f ./config/samples/ingress.yaml get -w
    +
    +

    輸出應該與下面相似:

    +
    NAME                CLASS    HOSTS                  ADDRESS   PORTS   AGE
    +my-release-milvus   <none>   my-release.milvus.io             80      4s
    +my-release-milvus   <none>   my-release.milvus.io   34.111.144.65   80, 443   41m
    +
    +

    一旦ADDRESS欄位顯示 IP 位址,Layer-7 負載平衡器就可以使用了。連接埠 80 和連接埠 443 都會顯示在上述輸出中。請記住,為了您的利益,您應該始終使用連接埠 443。

    +

    驗證透過 Layer-7 負載平衡器的連線

    本指南使用 PyMilvus 來驗證與我們剛剛建立的 Layer-7 負載平衡器後面的 Milvus 服務的連線。如需詳細步驟,請閱讀此內容。

    +

    請注意,連線參數會隨著您在Prepare TLS certificates 中選擇管理憑證的方式而有所不同。

    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# For self-managed certificates, you need to include the certificate in the parameters used to set up the connection.
    +connections.connect("default", host="34.111.144.65", port="443", server_pem_path="tls.crt", secure=True, server_name="my-release.milvus.io")
    +
    +# For Google-managed certificates, there is not need to do so.
    +connections.connect("default", host="34.111.144.65", port="443", secure=True, server_name="my-release.milvus.io")
    +
    +
    +
      +
    • hostport中的 IP 位址和連接埠號應該與Create an Ingress to generate a Layer-7 Load Balancer 結尾所列的 IP 位址和連接埠號相符。
    • +
    • 如果您已設定 DNS 記錄將網域名稱對應到主機 IP 位址,請以網域名稱取代host中的 IP 位址,並省略server_name
    • +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.json new file mode 100644 index 000000000..6b1ef853e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.json @@ -0,0 +1 @@ +{"codeList":["gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access\n","kubectl create serviceaccount milvus-gcs-access-sa\n","gcloud iam service-accounts create milvus-gcs-access-sa \\\n --project=milvus-testing-nonprod\n","gcloud projects add-iam-policy-binding milvus-testing-nonprod \\\n --member \"serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\" \\\n --role \"roles/storage.admin\" \\\n --condition='title=milvus-testing-nonprod,expression=resource.service == \"storage.googleapis.com\" && resource.name.startsWith(\"projects/_/buckets/milvus-testing-nonprod\")'\n","gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \\\n --role \"roles/iam.workloadIdentityUser\" \\\n --member \"serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]\"\n","kubectl annotate serviceaccount milvus-gcs-access-sa \\\n --namespace default \\\n iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com\n","curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email\n","helm install -f values.yaml my-release milvus/milvus\n","cluster:\n enabled: true\n\nservice:\n type: LoadBalancer\n\nminio:\n enabled: false\n\nserviceAccount:\n create: false\n name: milvus-gcs-access-sa\n\nexternalS3:\n enabled: true\n host: storage.googleapis.com\n port: 443\n rootPath: milvus/my-release\n bucketName: milvus-testing-nonprod\n cloudProvider: gcp\n useSSL: true\n useIAM: true\n"],"headingContent":"Configure GCS Access by Workload Identity","anchorList":[{"label":"依據工作負載身分設定 GCS 存取","href":"Configure-GCS-Access-by-Workload-Identity","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"設定應用程式以使用 Workload Identity","href":"Configure-applications-to-use-Workload-Identity","type":2,"isActive":false},{"label":"驗證 Workload Identity 設定","href":"Verify-the-Workload-Identity-setup","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.md new file mode 100644 index 000000000..d72b673aa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/gcp/gcs.md @@ -0,0 +1,151 @@ +--- +id: gcs.md +title: 依據工作負載身分設定 GCS 存取 +related_key: 'gcs, storage, workload identity, iam' +summary: 瞭解如何使用 Workload Identity 設定 gcs。 +--- +

    依據工作負載身分設定 GCS 存取

    本主題介紹當您使用 helm 安裝 Milvus 時,如何透過 Workload Identity 設定 gcs 存取。 詳細資訊請參閱Workload Identity

    +

    開始之前

    請使用 Google Cloud CLI 或 Google Cloud 主控台在群集和節點池上啟用 Workload Identity。必須先在群集層級啟用 Workload Identity,才能在節點池上啟用 Workload Identity。

    +

    設定應用程式以使用 Workload Identity

      +
    • 建立儲存桶。
    • +
    +
    gcloud storage buckets create gs://milvus-testing-nonprod --project=milvus-testing-nonprod --default-storage-class=STANDARD --location=us-west1 --uniform-bucket-level-access
    +
    +
      +
    • 為您的應用程式建立 Kubernetes 服務帳戶。
    • +
    +
    kubectl create serviceaccount milvus-gcs-access-sa
    +
    +
      +
    • 為您的應用程式建立 IAM 服務帳戶,或使用現有的 IAM 服務帳戶。您可以在組織中的任何專案中使用任何 IAM 服務帳戶。
    • +
    +
    gcloud iam service-accounts create milvus-gcs-access-sa \
    +    --project=milvus-testing-nonprod
    +
    +
      +
    • 確保您的 IAM 服務帳戶具有所需的角色。您可以使用以下指令授予其他角色:
    • +
    +
    gcloud projects add-iam-policy-binding milvus-testing-nonprod \
    +    --member "serviceAccount:milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com" \
    +    --role "roles/storage.admin" \
    +    --condition='title=milvus-testing-nonprod,expression=resource.service == "storage.googleapis.com" && resource.name.startsWith("projects/_/buckets/milvus-testing-nonprod")'
    +
    +
      +
    • 透過在兩個服務帳戶之間新增 IAM 策略綁定,允許 Kubernetes 服務帳戶冒充 IAM 服務帳戶。此绑定允许 Kubernetes 服务帐户充当 IAM 服务帐户。
    • +
    +
    gcloud iam service-accounts add-iam-policy-binding milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com \
    +    --role "roles/iam.workloadIdentityUser" \
    +    --member "serviceAccount:milvus-testing-nonprod.svc.id.goog[default/milvus-gcs-access-sa]"
    +
    +
      +
    • 使用 IAM 服務帳戶的電子郵件地址註解 Kubernetes 服務帳戶。
    • +
    +
    kubectl annotate serviceaccount milvus-gcs-access-sa \
    +    --namespace default \
    +    iam.gke.io/gcp-service-account=milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com
    +
    +

    驗證 Workload Identity 設定

    請參閱Workload Identity。在 Pod 內執行下列指令:

    +
    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
    +
    +

    如果結果是milvus-gcs-access-sa@milvus-testing-nonprod.iam.gserviceaccount.com ,就OK了。

    +

    部署 Milvus

    helm install -f values.yaml my-release milvus/milvus
    +
    +

    values.yaml內容:

    +
    cluster:
    +    enabled: true
    +
    +service:
    +    type: LoadBalancer
    +
    +minio:
    +    enabled: false
    +
    +serviceAccount:
    +    create: false
    +    name: milvus-gcs-access-sa
    +
    +externalS3:
    +    enabled: true
    +    host: storage.googleapis.com
    +    port: 443
    +    rootPath: milvus/my-release
    +    bucketName: milvus-testing-nonprod
    +    cloudProvider: gcp
    +    useSSL: true
    +    useIAM: true
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.json b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.json new file mode 100644 index 000000000..aa73620d2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.json @@ -0,0 +1 @@ +{"codeList":["# milvus-operator-certificate.yaml\napiVersion: cert-manager.io/v1\nkind: Certificate\nmetadata:\n name: milvus-operator-serving-cert\n namespace: milvus-operator\nspec:\n dnsNames:\n - milvus-operator-webhook-service.milvus-operator.svc\n - milvus-operator-webhook-service.milvus-operator.svc.cluster.local\n issuerRef:\n kind: Issuer\n name: milvus-operator-selfsigned-issuer\n secretName: milvus-operator-webhook-cert\n---\napiVersion: cert-manager.io/v1\nkind: Issuer\nmetadata:\n name: milvus-operator-selfsigned-issuer\n namespace: milvus-operator\nspec:\n selfSigned: {}\n","kubectl apply -f milvus-operator-certificate.yaml\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update milvus-operator\n","helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator\n"],"headingContent":"Deploy a Milvus Cluster on OpenShift","anchorList":[{"label":"在 OpenShift 上部署 Milvus 集群","href":"Deploy-a-Milvus-Cluster-on-OpenShift","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"步驟 1:安裝 Cert Manager","href":"Step-1-Install-Cert-Manager","type":2,"isActive":false},{"label":"步驟 2:為 Milvus Operator 簽發自簽憑證","href":"Step-2-Issue-a-Self-Signed-Certificate-for-Milvus-Operator","type":2,"isActive":false},{"label":"步驟 3: 安裝 Milvus Operator","href":"Step-3-Install-Milvus-Operator","type":2,"isActive":false},{"label":"步驟 4:部署 Milvus","href":"Step-4-Deploy-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-Next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.md b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.md new file mode 100644 index 000000000..9f5e855a4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/clouds/openshift/openshift.md @@ -0,0 +1,183 @@ +--- +id: openshift.md +title: 在 OpenShift 上部署 Milvus 集群 +related_key: cluster +summary: 瞭解如何在 OpenShift 上部署 Milvus 群集。 +--- +

    在 OpenShift 上部署 Milvus 集群

    本主題提供如何在 OpenShift 上部署 Milvus 的逐步指南。

    +

    先決條件

    在開始部署程序之前,請確保您擁有

    +
      +
    • 正在執行的 OpenShift 叢集。
    • +
    • 具有足夠權限的 OpenShift 叢集存取權限 (cluster-admin 角色或同等權限)。
    • +
    • 存取 OpenShift Container Platform 網頁主控台。
    • +
    +

    步驟 1:安裝 Cert Manager

    管理 Milvus Operator 的 TLS 憑證需要 Cert Manager。

    +
      +
    1. 為您的 OpenShift 版本尋找合適的 Cert-manager 版本:Cert Manager 版本

    2. +
    3. 按照官方指南安裝 Cert Manager:安裝 Cert Manager

    4. +
    5. 驗證您的 Cert Manager 是否正常運作:

      +
        +
      1. 在 openshift 主控台中,導覽到Workloads>Pods。選擇專案cert-manager

        +

        + + cert-manager-1 + cert-manager-1

      2. +
      3. 確保所有 Pod 已準備就緒。例如,下圖顯示 Pod 仍在啟動中。等到所有這些 Pod 都準備就緒。

        +

        + + cert-manager-2 + cert-manager-2

      4. +
    6. +
    +

    步驟 2:為 Milvus Operator 簽發自簽憑證

    確保您以kubeadmin 或同等權限登入。

    +
      +
    1. 建立下列名為milvus-operator-certificate.yaml 的清單檔案:

      +
      # milvus-operator-certificate.yaml
      +apiVersion: cert-manager.io/v1
      +kind: Certificate
      +metadata:
      +  name: milvus-operator-serving-cert
      +  namespace: milvus-operator
      +spec:
      +  dnsNames:
      +  - milvus-operator-webhook-service.milvus-operator.svc
      +  - milvus-operator-webhook-service.milvus-operator.svc.cluster.local
      +  issuerRef:
      +    kind: Issuer
      +    name: milvus-operator-selfsigned-issuer
      +  secretName: milvus-operator-webhook-cert
      +---
      +apiVersion: cert-manager.io/v1
      +kind: Issuer
      +metadata:
      +  name: milvus-operator-selfsigned-issuer
      +  namespace: milvus-operator
      +spec:
      +  selfSigned: {}
      +
    2. +
    3. 應用該檔案:

      +
      kubectl apply -f milvus-operator-certificate.yaml
      +
    4. +
    +

    步驟 3: 安裝 Milvus Operator

    現在您可以開始安裝 Milvus Operator。建議使用 Helm 安裝 Milvus Operator,以簡化設定過程。

    +
      +
    1. 新增 Milvus Operator Helm 套件庫:

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator/
      +helm repo update milvus-operator
      +
    2. +
    3. 安裝 Milvus Operator:

      +
      helm -n milvus-operator upgrade --install --create-namespace milvus-operator milvus-operator/milvus-operator
      +
    4. +
    +

    步驟 4:部署 Milvus

    按照 Milvus 文檔網站的其餘指南進行:部署 Milvus

    +

    下一步

    如果您想學習如何在其他雲上部署 Milvus:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.json b/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.json new file mode 100644 index 000000000..8d06b9e4b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl create namespace observability\n$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability\n","$ kubectl get deployment jaeger-operator -n observability\n\nNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE\njaeger-operator 1 1 1 1 48s\n","apiVersion: jaegertracing.io/v1\nkind: Jaeger\nmetadata:\n name: jaeger\n","$ kubectl apply -f simplest.yaml\n","$ kubectl get jaegers\n\nNAME STATUS VERSION STRATEGY STORAGE AGE\njaeger Running 1.62.0 allinone memory 13s\n","extraConfigFiles:\n user.yaml: |+\n trace:\n exporter: jaeger\n sampleFraction: 1\n jaeger:\n url: \"http://jaeger-collector:14268/api/traces\"\n","$ helm repo add zilliztech https://zilliztech.github.io/milvus-helm\n$ helm repo update\n$ helm upgrade --install -f values.yaml my-release milvus/milvus\n","$ helm upgrade my-release -f values.yaml milvus/milvus\n","$ kubectl get ingress\n\nNAME CLASS HOSTS ADDRESS PORTS AGE\njaeger-query * 192.168.122.34 80 14m\n"],"headingContent":"Configure Trace","anchorList":[{"label":"配置軌跡","href":"Configure-Trace","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"部署 Jaeger","href":"Deply-Jaeger","type":2,"isActive":false},{"label":"使用 Helm Chart 安裝 Milvus","href":"Install-Milvus-with-Helm-Chart","type":2,"isActive":false},{"label":"檢視追蹤","href":"View-Traces","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.md b/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.md new file mode 100644 index 000000000..234be6098 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/config_jaeger_tracing.md @@ -0,0 +1,146 @@ +--- +id: config_jaeger_tracing.md +title: 配置軌跡 +related_key: 'Jaeger, Milvus, Trace' +summary: 本指南提供如何設定 Jaeger 為 Milvus 收集軌跡的說明。 +--- +

    配置軌跡

    本指南提供如何配置Jaeger為Milvus收集軌跡的說明。

    +

    先決條件

      +
    • 您已安裝必要的工具,包括HelmKubectl
    • +
    • 必須安裝 Cert-manager 1.6.1 或更高版本。安裝指南可在這裡找到。
    • +
    +

    部署 Jaeger

    Jaeger 是Uber Technologies 以開源方式釋出的分散式追蹤平台。

    +

    1.在 Kubernetes 上安裝 Jaeger 操作器

    要安裝操作器,請執行:

    +
    $ kubectl create namespace observability
    +$ kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.62.0/jaeger-operator.yaml -n observability
    +
    +

    此時,應該會有jaeger-operator 部署可用。您可以執行以下指令查看:

    +
    $ kubectl get deployment jaeger-operator -n observability
    +
    +NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    +jaeger-operator   1         1         1            1           48s
    +
    +

    2.部署 Jaeger

    創建一個 Jaeger 實例的最簡單方法是創建一個 YAML 檔案,就像下面的範例一樣。這會安裝預設的 AllInOne 策略,在單一 pod 中部署All-in-one映像(結合jaeger-agentjaeger-collectorjaeger -query 和 Jaeger UI),預設使用記憶體儲存

    +

    如果要長時間儲存追蹤資料,請參考production-strategy

    +
    apiVersion: jaegertracing.io/v1
    +kind: Jaeger
    +metadata:
    +  name: jaeger
    +
    +

    然後,YAML 檔案就可以使用kubectl

    +
    $ kubectl apply -f simplest.yaml
    +
    +

    幾秒鐘之後,一個新的 Jaeger 存儲在記憶體中的多合一實例就會出現,適合快速演示和開發用途。要檢查已建立的實體,請列出 jaeger 物件:

    +
    $ kubectl get jaegers
    +
    +NAME     STATUS    VERSION   STRATEGY   STORAGE   AGE
    +jaeger   Running   1.62.0    allinone   memory    13s
    +
    +

    使用 Helm Chart 安裝 Milvus

    您可以使用下列設定安裝或升級 Milvus with Helm Chart:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    trace:
    +      exporter: jaeger
    +      sampleFraction: 1
    +      jaeger:
    +        url: "http://jaeger-collector:14268/api/traces"
    +
    +

    要將上述設定套用到新的 Milvus 部署,您可以執行下列指令:

    +
    $ helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +$ helm repo update
    +$ helm upgrade --install -f values.yaml my-release milvus/milvus
    +
    +

    要將上述設定套用到現有的 Milvus 部署,您可以執行下列指令:

    +
    $ helm upgrade my-release -f values.yaml milvus/milvus
    +
    +

    檢視追蹤

    一旦您使用 Helm Chart 部署了 Jaeger 和 Milvus,dfault 已經啟用了入口。您可以執行以下指令檢視ingress:

    +
    $ kubectl get ingress
    +
    +NAME           CLASS    HOSTS   ADDRESS         PORTS   AGE
    +jaeger-query   <none>   *       192.168.122.34  80      14m
    +
    +

    一旦ingress可用,您就可以通過導航到http://${ADDRESS} 來訪問 Jaeger UI。用攝取端的實際 IP 位址取代${ADDRESS}

    +

    下面的截圖顯示了Jaeger用戶介面,以及Milvus在搜索操作和載入收集操作中的痕跡:

    +

    + + Trace Search Request + 追蹤搜尋請求

    +

    + + Trace Load Collection Request + 蹤跡負載收集請求

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.json b/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.json new file mode 100644 index 000000000..7fbb917ea --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml\n","# For Milvus standalone\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n","...\n standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.2.13\n command: [\"milvus\", \"run\", \"standalone\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml # Map the local path to the container path\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n ports:\n - \"19530:19530\"\n - \"9091:9091\"\n depends_on:\n - \"etcd\"\n - \"minio\"\n...\n","$ sudo docker compose up -d\n"],"headingContent":"Configure Milvus with Docker Compose","anchorList":[{"label":"使用 Docker Compose 配置 Milvus","href":"Configure-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"下載設定檔","href":"Download-a-configuration-file","type":2,"isActive":false},{"label":"修改設定檔","href":"Modify-the-configuration-file","type":2,"isActive":false},{"label":"下載安裝檔案","href":"Download-an-installation-file","type":2,"isActive":false},{"label":"修改安裝檔案","href":"Modify-the-installation-file","type":2,"isActive":false},{"label":"啟動 Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.md b/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.md new file mode 100644 index 000000000..eff38f4dd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-docker.md @@ -0,0 +1,296 @@ +--- +id: configure-docker.md +label: Docker Compose +related_key: configure +summary: 使用 Docker Compose 配置 Milvus。 +title: 使用 Docker Compose 配置 Milvus +--- +

    使用 Docker Compose 配置 Milvus

    本主題描述如何使用 Docker Compose 設定 Milvus 元件及其第三方相依性。

    +
    +在目前的版本中,所有參數只有在 Milvus 重新啟動後才能生效。
    +

    下載設定檔

    直接下載 milvus.yaml 或使用下列指令。

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/v2.5.3/configs/milvus.yaml
    +
    +

    修改設定檔

    透過調整milvus.yaml 中的相應參數,配置您的 Milvus 實例以符合您的應用程式情境。

    +

    查看以下鏈接,瞭解各參數的更多資訊。

    +

    排序方式

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    用途參數
    效能調整 + +
    資料與元 + +
    管理 + +
    配額與限制 + +
    +
    +

    下載安裝檔案

    下載 Milvusstandalone 的安裝檔案,並將其儲存為docker-compose.yml

    +

    您也可以簡單地執行以下指令。

    +
    # For Milvus standalone
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +

    修改安裝檔案

    docker-compose.yml 中,在每個milvus-standalone 下方新增volumes 區段。

    +

    milvus.yaml 檔案的本機路徑,映射到所有volumes 區段下的配置檔案/milvus/configs/milvus.yaml 的對應 docker container 路徑上。

    +
    ...
    +  standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:v2.2.13
    +    command: ["milvus", "run", "standalone"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - /local/path/to/your/milvus.yaml:/milvus/configs/milvus.yaml   # Map the local path to the container path
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +    ports:
    +      - "19530:19530"
    +      - "9091:9091"
    +    depends_on:
    +      - "etcd"
    +      - "minio"
    +...
    +
    +
    +根據docker-compose.yml 的預設設定,資料會儲存在/volumes 資料夾。若要變更儲存資料的資料夾,請編輯docker-compose.yml 或執行$ export DOCKER_VOLUME_DIRECTORY=
    +

    啟動 Milvus

    修改完配置文件和安裝文件後,您就可以啟動 Milvus 了。

    +
    $ sudo docker compose up -d
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.json b/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.json new file mode 100644 index 000000000..8c90010ec --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml\n","# Extra configs for milvus.yaml\n# If set, this config will merge into milvus.yaml\n# Please follow the config structure in the milvus.yaml\n# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml\n# Note: this config will be the top priority which will override the config\n# in the image and helm chart.\nextraConfigFiles:\n user.yaml: |+\n # For example to set the graceful time for query nodes\n # queryNodes:\n # gracefulTime: 10\n","$ helm upgrade my-release milvus/milvus -f values.yaml\n","$ helm show values milvus/milvus\n","# For instance, upgrade the Milvus cluster with compaction disabled\n$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false\n"],"headingContent":"Configure Milvus with Helm Charts","anchorList":[{"label":"使用 Helm Charts 配置 Milvus","href":"Configure-Milvus-with-Helm-Charts","type":1,"isActive":false},{"label":"通過配置文件配置 Milvus","href":"Configure-Milvus-via-configuration-file","type":2,"isActive":false},{"label":"透過命令列配置 Milvus","href":"Configure-Milvus-via-command-line","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.md b/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.md new file mode 100644 index 000000000..642e613e5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-helm.md @@ -0,0 +1,250 @@ +--- +id: configure-helm.md +label: Helm +related_key: configure +summary: 使用 Helm 圖表設定 Milvus。 +title: 使用 Helm Charts 配置 Milvus +--- +

    使用 Helm Charts 配置 Milvus

    本主題描述如何使用 Helm Charts 設定 Milvus 元件和其第三方相依性。

    +
    +在目前的版本中,所有參數只在 Milvus 重新啟動後生效。
    +

    通過配置文件配置 Milvus

    您可以使用配置文件values.yaml 來配置 Milvus。

    +

    下載配置檔

    直接下載 values.yaml 或使用以下命令。

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus-helm/master/charts/milvus/values.yaml
    +
    +

    修改配置文件

    通過調整values.yaml 中的相應參數,配置您的 Milvus 實例,以適應您的應用場景。

    +

    具體來說,在values.yaml 中搜索extraConfigFiles ,並將您的配置放入此部分,如下所示:

    +
    # Extra configs for milvus.yaml
    +# If set, this config will merge into milvus.yaml
    +# Please follow the config structure in the milvus.yaml
    +# at https://github.com/milvus-io/milvus/blob/master/configs/milvus.yaml
    +# Note: this config will be the top priority which will override the config
    +# in the image and helm chart.
    +extraConfigFiles:
    +  user.yaml: |+
    +    #    For example to set the graceful time for query nodes
    +    #    queryNodes:
    +    #      gracefulTime: 10
    +
    +

    查看以下鏈接,瞭解各參數的更多資訊。

    +

    排序依據

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    用途參數
    效能調整 + +
    資料與元 + +
    管理 + +
    配額與限制 + +
    +
    +

    其他專門針對 Kubernetes 安裝的參數,請參閱Milvus Helm Chart Configuration

    +

    啟動 Milvus

    修改完配置文件後,就可以用該文件啟動 Milvus。

    +
    $ helm upgrade my-release milvus/milvus -f values.yaml
    +
    +

    透過命令列配置 Milvus

    另外,您也可以直接使用 Helm 指令升級 Milvus 配置。

    +

    檢查可配置的參數

    在升級之前,你可以用 Helm 圖表檢查可配置的參數。

    +
    $ helm show values milvus/milvus
    +
    +

    啟動 Milvus

    在升級指令中加入--values--set ,設定並啟動 Milvus。

    +
    # For instance, upgrade the Milvus cluster with compaction disabled
    +$ helm upgrade my-release milvus/milvus --set dataCoord.enableCompaction=false
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.json b/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.json new file mode 100644 index 000000000..37abed205 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.json @@ -0,0 +1 @@ +{"codeList":["$ lsblk | grep nvme\nnvme0n1 259:0 0 250.0G 0 disk \nnvme1n1 259:1 0 250.0G 0 disk \n","MIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"==MYBOUNDARY==\"\n\n--==MYBOUNDARY==\nContent-Type: text/x-shellscript; charset=\"us-ascii\"\n\n#!/bin/bash\necho \"Running custom user data script\"\nif ( lsblk | fgrep -q nvme1n1 ); then\n mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker\n mkfs.xfs /dev/nvme1n1\n mount /dev/nvme1n1 /mnt/data\n chmod 0755 /mnt/data\n mv /var/lib/kubelet /mnt/data/\n mv /var/lib/docker /mnt/data/\n ln -sf /mnt/data/kubelet /var/lib/kubelet\n ln -sf /mnt/data/docker /var/lib/docker\n UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')\n echo \"UUID=$UUID /mnt/data xfs defaults,noatime 1 1\" >> /etc/fstab\nfi\necho 10485760 > /proc/sys/fs/aio-max-nr\n\n--==MYBOUNDARY==--\n","gcloud container node-pools create ${POOL_NAME} \\\n --cluster=${CLUSTER_NAME} \\\n --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \\\n --machine-type=${MACHINE_TYPE}\n","mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1\nmdadm -Ds > /etc/mdadm/mdadm.conf \nupdate-initramfs -u\n\nmkfs.xfs /dev/md0\nmkdir -p /var/lib/kubelet\necho '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab\nmount -a\n","#!/bin/bash\necho \"nvme init start...\"\nmkfs.xfs /dev/nvme0n1\nmkdir -p /mnt/data\necho '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab\nmount -a\n\nmkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods\nmkdir -p /var/lib/kubelet /var/lib/containerd /var/log/pods\n\necho '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab\necho '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab\nmount -a\n\necho \"nvme init end...\"\n","sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state\nsudo vim /etc/containerd/config.toml\n","[plugins.\"io.containerd.grpc.v1.cri\".containerd]\nsnapshotter = \"overlayfs\"\nroot = \"/mnt/nvme/containerd\"\nstate = \"/mnt/nvme/containerd/state\"\n","sudo systemctl restart containerd\n","kubectl create -f ubuntu.yaml\n","apiVersion: v1\nkind: Pod\nmetadata:\nname: ubuntu\nspec:\ncontainers:\n- name: ubuntu\n image: ubuntu:latest\n command: [\"sleep\", \"86400\"]\n volumeMounts:\n - name: data-volume\n mountPath: /data\nvolumes:\n - name: data-volume\n emptyDir: {}\n","# enter the container\nkubectl exec pod/ubuntu -it bash\n\n# in container\napt-get update\napt-get install fio -y\n\n# change to the mounted dir\ncd /data\n\n# write 10GB\nfio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test\n\n# verify the read speed\n# compare with the disk performance indicators provided by various cloud providers.\nfio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly\n","Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]\niops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024\nread: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)\n slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96\n clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13\n lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74\n clat percentiles (usec):\n | 1.00th=[ 69], 5.00th=[ 79], 10.00th=[ 85], 20.00th=[ 95],\n | 30.00th=[ 106], 40.00th=[ 123], 50.00th=[ 149], 60.00th=[ 11469],\n | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],\n | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],\n | 99.99th=[767558]\nbw ( MiB/s): min= 236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591\niops : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591\nlat (usec) : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%\nlat (usec) : 1000=0.08%\nlat (msec) : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%\nlat (msec) : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%\nlat (msec) : 2000=0.01%\ncpu : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665\nIO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%\n submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%\n complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%\n issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0\n latency : target=0, window=0, percentile=100.00%, depth=64\n","...\nspec:\n components:\n queryNode:\n volumeMounts:\n - mountPath: /var/lib/milvus/data\n name: data\n volumes:\n - emptyDir:\n name: data\n"],"headingContent":"Configure Milvus QueryNode with Local Disk","anchorList":[{"label":"使用本機磁碟配置 Milvus QueryNode","href":"Configure-Milvus-QueryNode-with-Local-Disk","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"設定 Kubernetes 使用本機磁碟","href":"Configure-Kubernetes-to-use-local-disk","type":2,"isActive":false},{"label":"驗證磁碟效能","href":"Verify-disk-performance","type":2,"isActive":false},{"label":"部署 Milvus Distributed","href":"Deploy-Milvus-Distributed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.md b/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.md new file mode 100644 index 000000000..7daf8122b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure-querynode-localdisk.md @@ -0,0 +1,282 @@ +--- +id: configure-querynode-localdisk.md +title: 使用本機磁碟配置 Milvus QueryNode +related_key: 'querynode, query node, local disk' +summary: 瞭解如何設定 Milvus QueryNode 使用本機磁碟。 +--- +

    使用本機磁碟配置 Milvus QueryNode

    本文描述如何設定 Milvus QueryNode 使用本機磁碟儲存。

    +

    概述

    Milvus 是專為人工智能量身打造的向量資料庫,可有效儲存及擷取大量向量資料。它是圖像和視訊分析、自然語言處理和推薦系統等任務的理想選擇。為了確保最佳效能,將磁碟讀取延遲時間降至最低是非常重要的。強烈建議使用本機 NVMe SSD,以防止延遲並保持系統穩定。

    +

    本機磁碟儲存發揮作用的主要功能包括

    +
      +
    • Chunk 快取:將資料預先載入本機磁碟快取,以加快搜尋速度。
    • +
    • MMap:將檔案內容直接映射到記憶體,以提高記憶體效率。
    • +
    • DiskANN 索引:需要磁碟儲存空間以進行有效率的索引管理。
    • +
    +

    在本文中,我們將著重於在雲端平台上部署Milvus Distributed,以及如何設定 QueryNode 使用 NVMe 磁碟儲存。下表列出各雲端供應商推薦的機器類型。

    + + + + + + + + + + + +
    雲供應商機器類型
    AWSR6id 系列
    GCPN2 系列
    AzureLsv3 系列
    阿里巴巴雲i3 系列
    騰訊雲IT5 系列
    +

    這些機器類型提供 NVMe 磁碟儲存。您可以在這些機器類型的實體上使用lsblk 指令檢查它們是否有 NVMe 磁碟儲存。如果有,您就可以進行下一步。

    +
    $ lsblk | grep nvme
    +nvme0n1     259:0    0 250.0G  0 disk 
    +nvme1n1     259:1    0 250.0G  0 disk 
    +
    +

    設定 Kubernetes 使用本機磁碟

    若要設定 Milvus Distributed 的 QueryNode 使用 NVMe 磁碟儲存,您需要設定目標 Kubernetes 叢集的 Worker 節點,將容器和影像儲存於 NVMe 磁碟上。其步驟依雲供應商而有所不同。

    +

    AWS

    使用 Amazon EKS 時,您可以使用啟動範本自訂受管節點,您可以在其中指定節點群組的組態設定。以下是如何在 Amazon EKS 群集的工作節點上掛載 NVMe 磁碟的範例:

    +
    MIME-Version: 1.0
    +Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="
    +
    +--==MYBOUNDARY==
    +Content-Type: text/x-shellscript; charset="us-ascii"
    +
    +#!/bin/bash
    +echo "Running custom user data script"
    +if ( lsblk | fgrep -q nvme1n1 ); then
    +    mkdir -p /mnt/data /var/lib/kubelet /var/lib/docker
    +    mkfs.xfs /dev/nvme1n1
    +    mount /dev/nvme1n1 /mnt/data
    +    chmod 0755 /mnt/data
    +    mv /var/lib/kubelet /mnt/data/
    +    mv /var/lib/docker /mnt/data/
    +    ln -sf /mnt/data/kubelet /var/lib/kubelet
    +    ln -sf /mnt/data/docker /var/lib/docker
    +    UUID=$(lsblk -f | grep nvme1n1 | awk '{print $3}')
    +    echo "UUID=$UUID     /mnt/data   xfs    defaults,noatime  1   1" >> /etc/fstab
    +fi
    +echo 10485760 > /proc/sys/fs/aio-max-nr
    +
    +--==MYBOUNDARY==--
    +
    +
    +

    在上述範例中,我們假設 NVMe 磁碟為/dev/nvme1n1 。您需要修改腳本以符合您的特定配置。

    +
    +

    如需詳細資訊,請參閱使用啟動範本自訂受管節點

    +

    GCP

    若要在 Google Kubernetes Engine (GKE) 叢集上佈建 Local SSD 儲存,並配置工作負載從連接至叢集中節點的 Local SSD 支援暫存中消耗資料,請執行下列指令:

    +
    gcloud container node-pools create ${POOL_NAME} \
    +    --cluster=${CLUSTER_NAME} \
    +    --ephemeral-storage-local-ssd count=${NUMBER_OF_DISKS} \
    +    --machine-type=${MACHINE_TYPE}
    +
    +

    如需詳細資訊,請參閱在 GKE 上配置 Local SSD 儲存

    +

    Azure

    若要使用本機 NVMe 磁碟儲存建立虛擬機器規模集 (VMSS),您需要傳送自訂資料至虛擬機器實體。以下是如何將 NVMe 磁碟附加到 VMSS 中的虛擬機器實體的範例:

    +
    mdadm -Cv /dev/md0 -l0 -n2 /dev/nvme0n1 /dev/nvme1n1
    +mdadm -Ds > /etc/mdadm/mdadm.conf 
    +update-initramfs -u
    +
    +mkfs.xfs /dev/md0
    +mkdir -p /var/lib/kubelet
    +echo '/dev/md0 /var/lib/kubelet xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +
    +

    在上述示例中,我們假設 NVMe 磁碟為/dev/nvme0n1/dev/nvme1n1 。您需要修改腳本以符合您的特定配置。

    +
    +

    阿里雲與 TecentCloud

    要創建一個使用本地 SSD 卷的節點池,我們需要傳入自定義數據(Custom Data)。以下是自訂資料的範例。

    +
    #!/bin/bash
    +echo "nvme init start..."
    +mkfs.xfs /dev/nvme0n1
    +mkdir -p /mnt/data
    +echo '/dev/nvme0n1 /mnt/data/ xfs defaults 0 0' >> /etc/fstab
    +mount -a
    +
    +mkdir -p /mnt/data/kubelet /mnt/data/containerd /mnt/data/log/pods
    +mkdir -p  /var/lib/kubelet /var/lib/containerd /var/log/pods
    +
    +echo '/mnt/data/kubelet /var/lib/kubelet none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/containerd /var/lib/containerd none defaults,bind 0 0' >> /etc/fstab
    +echo '/mnt/data/log/pods /var/log/pods none defaults,bind 0 0' >> /etc/fstab
    +mount -a
    +
    +echo "nvme init end..."
    +
    +
    +

    在上述示例中,我們假設 NVMe 磁碟為/dev/nvme0n1 。您需要修改腳本以符合您的特定配置。

    +
    +

    您自己的 IDC

    如果您正在運行自己的 IDC,並且想要在 containerd 中設定容器預設使用新掛載的 NVMe 磁碟上的檔案系統,請遵循下列步驟:

    +
      +
    • 掛載 NVMe 磁碟。

      +

      確保您的 NVMe 磁碟已在主機上正確掛載。您可以將它掛載到您選擇的目錄。例如,如果您將它掛載到/mnt/nvme ,請確定它已正確設定,而且您可以透過執行lsblkdf -h ,在/mnt/nvme 看到磁碟可用。

    • +
    • 更新 containerd 配置。

      +

      修改 containerd 配置以使用新的掛載作為容器儲存的根目錄。

      +
      sudo mkdir -p /mnt/nvme/containerd /mnt/nvme/containerd/state
      +sudo vim /etc/containerd/config.toml
      +
      +

      找到[plugins."io.containerd.grpc.v1.cri".containerd] 部分,並修改snapshotterroot 設定,如下所示: 重新啟動 containerd。

      +
      [plugins."io.containerd.grpc.v1.cri".containerd]
      +snapshotter = "overlayfs"
      +root = "/mnt/nvme/containerd"
      +state = "/mnt/nvme/containerd/state"
      +
    • +
    • 重新啟動 containerd。

      +

      重新啟動 containerd 服務以套用變更。

      +
      sudo systemctl restart containerd
      +
    • +
    +

    驗證磁碟效能

    建議您使用Fio 來驗證磁碟效能,Fio 是一種常用的磁碟效能基準測試工具。以下是如何執行 Fio 以測試磁碟效能的範例。

    +
      +
    • 將測試 pod 部署到具有 NVMe 磁碟的節點。

      +
      kubectl create -f ubuntu.yaml
      +
      +

      ubuntu.yaml 檔案如下:

      +
      apiVersion: v1
      +kind: Pod
      +metadata:
      +name: ubuntu
      +spec:
      +containers:
      +- name: ubuntu
      +    image: ubuntu:latest
      +    command: ["sleep", "86400"]
      +    volumeMounts:
      +    - name: data-volume
      +        mountPath: /data
      +volumes:
      +    - name: data-volume
      +    emptyDir: {}
      +
    • +
    • 執行 Fio 測試磁碟效能。

      +
      # enter the container
      +kubectl exec pod/ubuntu -it bash
      +
      +# in container
      +apt-get update
      +apt-get install fio -y
      +
      +# change to the mounted dir
      +cd /data
      +
      +# write 10GB
      +fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4K -size=10G -numjobs=10 -runtime=600 -group_reporting -filename=test -name=Rand_Write_IOPS_Test
      +
      +# verify the read speed
      +# compare with the disk performance indicators provided by various cloud providers.
      +fio --filename=test --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=128 --time_based --group_reporting --name=iops-test-job --eta-newline=1  --readonly
      +
      +

      輸出結果應該是這樣

      +
      Jobs: 128 (f=128): [r(128)][100.0%][r=1458MiB/s][r=373k IOPS][eta 00m:00s]
      +iops-test-job: (groupid=0, jobs=128): err= 0: pid=768: Mon Jun 24 09:35:06 2024
      +read: IOPS=349k, BW=1364MiB/s (1430MB/s)(160GiB/120067msec)
      +    slat (nsec): min=765, max=530621k, avg=365836.09, stdev=4765464.96
      +    clat (usec): min=35, max=1476.0k, avg=23096.78, stdev=45409.13
      +    lat (usec): min=36, max=1571.6k, avg=23462.62, stdev=46296.74
      +    clat percentiles (usec):
      +    |  1.00th=[    69],  5.00th=[    79], 10.00th=[    85], 20.00th=[    95],
      +    | 30.00th=[   106], 40.00th=[   123], 50.00th=[   149], 60.00th=[ 11469],
      +    | 70.00th=[ 23462], 80.00th=[ 39584], 90.00th=[ 70779], 95.00th=[103285],
      +    | 99.00th=[189793], 99.50th=[244319], 99.90th=[497026], 99.95th=[591397],
      +    | 99.99th=[767558]
      +bw (  MiB/s): min=  236, max= 4439, per=100.00%, avg=1365.82, stdev= 5.02, samples=30591
      +iops        : min=60447, max=1136488, avg=349640.62, stdev=1284.65, samples=30591
      +lat (usec)   : 50=0.01%, 100=24.90%, 250=30.47%, 500=0.09%, 750=0.31%
      +lat (usec)   : 1000=0.08%
      +lat (msec)   : 2=0.32%, 4=0.59%, 10=1.86%, 20=8.20%, 50=17.29%
      +lat (msec)   : 100=10.62%, 250=4.80%, 500=0.38%, 750=0.09%, 1000=0.01%
      +lat (msec)   : 2000=0.01%
      +cpu          : usr=0.20%, sys=0.48%, ctx=838085, majf=0, minf=9665
      +IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
      +    submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
      +    complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
      +    issued rwts: total=41910256,0,0,0 short=0,0,0,0 dropped=0,0,0,0
      +    latency   : target=0, window=0, percentile=100.00%, depth=64
      +
    • +
    +

    部署 Milvus Distributed

    一旦驗證結果令人滿意,您就可以依照下列步驟部署 Milvus Distributed:

    +

    使用 Helm 部署 Milvus Distributed 的提示

    QueryNode pod 預設使用 NVMe 磁碟作為 EmptyDir 磁碟區。建議您將 NVMe 磁碟掛載至 QueryNode pod 內的/var/lib/milvus/data ,以確保最佳效能。

    +

    有關如何使用 Helm 部署 Milvus Distributed 的詳細資訊,請參閱使用Helm 在 Kubernetes 執行 Milvus

    +

    使用 Milvus Operator 部署 Milvus Distributed 的提示

    Milvus Operator 會自動設定 QueryNode pod 使用 NVMe 磁碟作為 EmptyDir 磁碟區。建議您將下列配置新增至MilvusCluster 自訂資源:

    +
    ...
    +spec:
    +  components:
    +    queryNode:
    +      volumeMounts:
    +      - mountPath: /var/lib/milvus/data
    +        name: data
    +      volumes:
    +      - emptyDir:
    +        name: data
    +
    +

    這將確保 QueryNode pod 使用 NVMe 磁碟作為資料卷。有關如何使用 Milvus Operator 部署Milvus Distributed 的詳細資訊,請參閱使用Milvus Operator 在 Kubernetes 中執行 Milvus

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.json b/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.json new file mode 100644 index 000000000..8ee9a286f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.json @@ -0,0 +1 @@ +{"codeList":["proxy:\n accessLog:\n enable: true\n # If `filename` is emtpy, logs will be printed to stdout.\n filename: \"\"\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\" # Name of the access log file\n localPath: \"/var/logs/milvus\" # Local file path where the access log file is stored\n maxSize: 500 # Max size for each single access log file. Unit: MB\n rotatedTime: 24 # Time interval for log rotation. Unit: seconds\n maxBackups: 7 # Max number of sealed access log files that can be retained\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n maxSize: 500\n rotatedTime: 24 \n maxBackups: 7\n minioEnable: true\n remotePath: \"/milvus/logs/access_logs\"\n remoteMaxTime: 0\n # Additional formatter configurations...\n","proxy:\n accessLog:\n enable: true\n filename: \"access_log.txt\"\n localPath: \"/var/logs/milvus\"\n # Define custom formatters for access logs with format and applicable methods\n formatters:\n # The `base` formatter applies to all methods by default\n # The `base` formatter does not require specific method association\n base: \n # Format string; an empty string means no log output\n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]\"\n # Custom formatter for specific methods (e.g., Query, Search)\n query: \n format: \"[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]\"\n # Specify the methods to which this custom formatter applies\n methods: [\"Query\", \"Search\"]\n"],"headingContent":"Configure Access Logs","anchorList":[{"label":"配置訪問日誌","href":"Configure-Access-Logs","type":1,"isActive":false},{"label":"組態選項","href":"Configuration-options","type":2,"isActive":false},{"label":"格式設定","href":"Formatter-config","type":2,"isActive":false},{"label":"參考:支援的度量","href":"Reference-Supported-metrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.md b/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.md new file mode 100644 index 000000000..073d47aff --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure_access_logs.md @@ -0,0 +1,175 @@ +--- +id: configure_access_logs.md +title: 配置訪問日誌 +--- +

    配置訪問日誌

    Milvus 的存取日誌功能允許伺服器管理員記錄和分析使用者的存取行為,協助瞭解查詢成功率和失敗原因等方面。

    +

    本指南提供在 Milvus 中配置訪問日誌的詳細說明。

    +

    存取日誌的設定取決於 Milvus 的安裝方式:

    + +

    組態選項

    根據您的需求,從三個組態選項中選擇:

    +
      +
    • 基本配置:用於一般用途。
    • +
    • 本機存取記錄檔的組態:用於在本機儲存記錄。
    • +
    • 將本機存取記錄上傳至 MinIO 的組態:用於雲端儲存與備份。
    • +
    +

    基本設定

    基本設定包括啟用存取日誌、定義日誌檔名或使用 stdout。

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    # If `filename` is emtpy, logs will be printed to stdout.
    +    filename: ""
    +    # Additional formatter configurations...
    +
    +
      +
    • proxy.accessLog.enable:是否啟用存取記錄功能。預設為false
    • +
    • proxy.accessLog.filename:存取日誌檔案名稱。如果將此參數留空,存取日誌會列印到 stdout。
    • +
    +

    配置本機存取日誌檔案

    設定存取日誌檔案的本機儲存,參數包括本機檔案路徑、檔案大小和輪換時間間隔:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt" # Name of the access log file
    +    localPath: "/var/logs/milvus" # Local file path where the access log file is stored
    +    maxSize: 500 # Max size for each single access log file. Unit: MB
    +    rotatedTime: 24 # Time interval for log rotation. Unit: seconds
    +    maxBackups: 7 # Max number of sealed access log files that can be retained
    +    # Additional formatter configurations...
    +
    +

    這些參數會在filename 不為空時指定。

    +
      +
    • proxy.accessLog.localPath:儲存存取記錄檔的本機檔案路徑。
    • +
    • proxy.accessLog.maxSize:單一存取記錄檔允許的最大大小 (MB)。如果日誌檔案大小達到此限制,就會啟動輪換程序。此程序會封鎖目前的存取記錄檔,建立新的記錄檔,並清除原始記錄檔的內容。
    • +
    • proxy.accessLog.rotatedTime:允許輪換單一存取記錄檔的最大時間間隔 (以秒為單位)。當達到指定的時間間隔,就會觸發輪換程序,建立新的存取記錄檔,並封存先前的存取記錄檔。
    • +
    • proxy.accessLog.maxBackups:可保留的最大封存存取記錄檔數量。如果封存的存取日誌檔案數量超過此限制,則會刪除最舊的檔案。
    • +
    +

    將本機存取記錄檔上傳至 MinIO 的設定

    啟用並設定將本機存取記錄檔上傳至 MinIO 的設定:

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    maxSize: 500
    +    rotatedTime: 24 
    +    maxBackups: 7
    +    minioEnable: true
    +    remotePath: "/milvus/logs/access_logs"
    +    remoteMaxTime: 0
    +    # Additional formatter configurations...
    +
    +

    設定 MinIO 參數時,請確認已設定maxSizerotatedTime 。否則可能會導致無法成功上傳本機存取記錄檔到 MinIO。

    +
      +
    • proxy.accessLog.minioEnable:是否將本機存取記錄檔上傳至 MinIO。預設為false
    • +
    • proxy.accessLog.remotePath:上傳存取記錄檔的物件儲存路徑。
    • +
    • proxy.accessLog.remoteMaxTime:允許上傳存取記錄檔的時間間隔。如果日誌檔案的上傳時間超過此時間間隔,檔案會被刪除。將值設為 0 會停用此功能。
    • +
    +

    格式設定

    所有方法使用的預設記錄格式是base 格式,不需要特定的方法關聯。但是,如果您希望自訂特定方法的日誌輸出,您可以定義自訂的日誌格式,並應用在關聯的方法上。

    +
    proxy:
    +  accessLog:
    +    enable: true
    +    filename: "access_log.txt"
    +    localPath: "/var/logs/milvus"
    +    # Define custom formatters for access logs with format and applicable methods
    +    formatters:
    +      # The `base` formatter applies to all methods by default
    +      # The `base` formatter does not require specific method association
    +      base: 
    +        # Format string; an empty string means no log output
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_name-$method_status-$error_code [traceID: $trace_id] [timeCost: $time_cost]"
    +      # Custom formatter for specific methods (e.g., Query, Search)
    +      query: 
    +        format: "[$time_now] [ACCESS] <$user_name: $user_addr> $method_status-$method_name [traceID: $trace_id] [timeCost: $time_cost] [database: $database_name] [collection: $collection_name] [partitions: $partition_name] [expr: $method_expr]"
    +        # Specify the methods to which this custom formatter applies
    +        methods: ["Query", "Search"]
    +
    +
      +
    • proxy.accessLog.<formatter_name>.format:使用動態度量定義日誌格式。如需詳細資訊,請參閱支援的度量
    • +
    • proxy.accessLog.<formatter_name>.methods:列出使用此格式的 Milvus 操作。要取得方法名稱,請參閱Milvus 方法中的MilvusService
    • +
    +

    參考:支援的度量

    + + + + + + + + + + + + + + + + + + + + + + +
    公制名稱說明
    $method_name方法名稱
    $method_status存取狀態:確定失敗
    $method_expr用於查詢、搜尋或刪除操作的表達式
    $trace_id與存取相關聯的 TraceID
    $user_addr使用者的 IP 位址
    $user_name使用者名稱
    $response_size回應資料的大小
    $error_codeMilvus 特有的錯誤代碼
    $error_msg詳細錯誤資訊
    $database_name目標 Milvus 資料庫名稱
    $collection_name目標 Milvus 收集的名稱
    $partition_name目標 Milvus 磁碟分割的名稱
    $time_cost完成存取所花的時間
    $time_now列印存取記錄的時間 (通常相等於$time_end)
    $time_start開始存取的時間
    $time_end存取結束的時間
    $sdk_version使用者使用的 Milvus SDK 版本
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.json new file mode 100644 index 000000000..63cab7b37 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n nodeSelector: {}\n tolerations: {}\n env: {}\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n","kubectl apply -f milvuscluster_resource.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n mode: cluster\n components:\n resources:\n limits:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n rootCoord: \n replicas: 1\n port: 8080\n resources:\n limits:\n cpu: '6'\n memory: '10Gi'\n dataCoord: {}\n queryCoord: {}\n indexCoord: {}\n dataNode: {}\n indexNode: {}\n queryNode: {}\n proxy:\n replicas: 1\n serviceType: ClusterIP\n resources:\n limits:\n cpu: '2'\n memory: 4Gi\n requests:\n cpu: 100m\n memory: 128Mi\n config: {}\n dependencies: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Milvus with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 配置 Milvus","href":"Configure-Milvus-with-Milvus-Operator","type":1,"isActive":false},{"label":"配置全局資源","href":"Configure-global-resources","type":2,"isActive":false},{"label":"配置私有資源","href":"Configure-private-resources","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.md new file mode 100644 index 000000000..de85966f8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/configure_operator.md @@ -0,0 +1,336 @@ +--- +id: configure_operator.md +label: Milvus Operator +related_key: Milvus Operator +summary: 學習如何使用 Milvus Operator 設定 Milvus。 +title: 使用 Milvus Operator 配置 Milvus +--- +

    使用 Milvus Operator 配置 Milvus

    在生產環境中,您需要根據機器類型和工作量為 Milvus 叢集分配資源。您可以在部署時進行配置,也可以在叢集運行時更新配置。

    +

    本主題介紹如何在使用 Milvus Operator 安裝 Milvus 叢集時進行配置。

    +

    本主題假設您已部署 Milvus Operator。更多資訊請參閱部署 Milvus Operator

    +

    使用 Milvus Operator 配置 Milvus 群集包括:

    +
      +
    • 全局資源組態
    • +
    • 私有資源組態
    • +
    +
    +私有资源配置将覆盖全局资源配置。如果您在配置全局資源時,同時指定某個元件的私有資源,該元件會優先回應私有配置。
    +

    配置全局資源

    使用 Milvus Operator 啟動 Milvus 叢集時,需要指定配置檔案。這裡的範例使用預設的設定檔。

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    配置文件的詳細內容如下:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    欄位spec.components 包括所有 Milvus 元件的全局和私有資源設定。以下是配置全局資源的四個常用欄位。

    +
      +
    • image:使用的 Milvus docker 映像檔。
    • +
    • resources:分配給每個元件的計算資源。
    • +
    • tolerations 以及 : K8s 集群中每個 Milvus 元件的排程規則。更多資訊請參閱nodeSelector容忍度nodeSelector
    • +
    • env:環境變數。
    • +
    +

    如果您想要設定更多欄位,請參閱這裡的說明文件。

    +

    要設定 Milvus 集群的全局資源,請建立milvuscluster_resource.yaml 檔案。

    +

    範例

    以下範例設定 Milvus 叢集的全局資源。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    nodeSelector: {}
    +    tolerations: {}
    +    env: {}
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +
    +

    執行下列指令套用新設定:

    +
    kubectl apply -f milvuscluster_resource.yaml
    +
    +
    +如果 K8s 叢集中有一個名為my-release 的 Milvus 叢集,叢集資源會根據配置檔更新。否則,將會建立新的 Milvus 叢集。
    +

    配置私有資源

    最初在 Milvus 2.0 中,一個 Milvus 叢集包括七個元件:proxy、root coord、data coord、query coord、index node、data node 和 query node。然而,Milvus 2.1.0 發布了一個新的元件--混合協調器。混合協調器包含所有協調器元件。因此,啟動混合協調器意味著您不需要安裝和啟動其他協調器,包括根協調器、資料協調器和查詢協調器。

    +

    用於設定每個元件的常見欄位包括

    +
      +
    • replica:每個元件的複本數量。
    • +
    • port:每個元件的監聽埠號碼。
    • +
    • 全局資源設定中常用的四個欄位:image,env,nodeSelector,tolerations,resources (見上文)。如需更多可設定欄位,請點選本文件中的每個元件。
    • +
    +
    +此外,在設定代理時,有一個額外的欄位叫做 `serviceType`。這個欄位定義 Milvus 在 K8s 集群中提供的服務類型。
    +

    若要設定特定元件的資源,請先在spec.componets 下的欄位中加入元件名稱,然後再設定其私有資源。

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    用途參數
    效能調整 + +
    資料與元 + +
    管理 + +
    配額與限制 + +
    +
    +

    範例

    以下範例在milvuscluster.yaml 檔案中設定 proxy 和 datanode 的複本和運算資源。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  mode: cluster
    +  components:
    +    resources:
    +      limits:
    +        cpu: '4'
    +        memory: 8Gi
    +      requests:
    +        cpu: 200m
    +        memory: 512Mi
    +    rootCoord: 
    +      replicas: 1
    +      port: 8080
    +      resources:
    +        limits:
    +          cpu: '6'
    +          memory: '10Gi'
    +    dataCoord: {}
    +    queryCoord: {}
    +    indexCoord: {}
    +    dataNode: {}
    +    indexNode: {}
    +    queryNode: {}
    +    proxy:
    +      replicas: 1
    +      serviceType: ClusterIP
    +      resources:
    +        limits:
    +          cpu: '2'
    +          memory: 4Gi
    +        requests:
    +          cpu: 100m
    +          memory: 128Mi
    +  config: {}
    +  dependencies: {}
    +
    +
    +此範例不僅設定了全局資源,也設定了 root coord 和 proxy 的私有計算資源。使用此配置文件啟動 Milvus 群集時,私有資源配置將應用於 root coord 和 proxy,而其他元件將遵循全局資源配置。
    +

    執行下列指令套用新的配置:

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.json b/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.json new file mode 100644 index 000000000..dbaae6ef9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.json @@ -0,0 +1 @@ +{"codeList":["version: '3'\nservices:\n zookeeper:\n image: wurstmeister/zookeeper:latest\n container_name: zookeeper\n ports:\n - 2181:2181\n restart: always\n\n kafka:\n image: wurstmeister/kafka:latest\n container_name: kafka\n ports:\n - 9092:9092\n environment:\n - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181\n - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092\n - KAFKA_LISTENERS=PLAINTEXT://:9092\n volumes:\n - /var/run/docker.sock:/var/run/docker.sock\n restart: always\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9092\"\n saslUsername:\n saslPassword:\n saslMechanisms:\n securityProtocol:\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: \n tlsKey:\n tlsCACert:\n tlsKeyPassword:\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n environment:\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n ports:\n - 2181:2181\n\n kafka:\n image: confluentinc/cp-kafka:latest\n container_name: kafka\n depends_on:\n - zookeeper\n ports:\n - 9092:9092\n - 9093:9093\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","KafkaServer {\n org.apache.kafka.common.security.plain.PlainLoginModule required\n username=\"kafka\"\n password=\"pass123\"\n user_kafka=\"pass123\";\n};\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_PLAINTEXT\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: false # Whether to support kafka secure connection mode\n tlsCert: # path to client's public key\n tlsKey: # path to client's private key\n tlsCACert: # file or directory path to CA certificate\n tlsKeyPassword: # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","#!/bin/bash\n#\n#\n# This scripts generates:\n# - root CA certificate\n# - server certificate and keystore\n# - client keys\n#\n# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka\n#\n\n\nif [[ \"$1\" == \"-k\" ]]; then\n USE_KEYTOOL=1\n shift\nelse\n USE_KEYTOOL=0\nfi\n\nOP=\"$1\"\nCA_CERT=\"$2\"\nPFX=\"$3\"\nHOST=\"$4\"\n\nC=NN\nST=NN\nL=NN\nO=NN\nOU=NN\nCN=\"kafka-ssl\"\n \n\n# Password\nPASS=\"abcdefgh\"\n\n# Cert validity, in days\nVALIDITY=365\n\nset -e\n\nexport LC_ALL=C\n\nif [[ $OP == \"ca\" && ! -z \"$CA_CERT\" && ! -z \"$3\" ]]; then\n CN=\"$3\"\n openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin \"pass:$PASS\" -passout \"pass:$PASS\" < \"\n echo \" $0 [-k] server|client \"\n echo \"\"\n echo \" -k = Use keytool/Java Keystore, else standard SSL keys\"\n exit 1\nfi\n","$ ./gen-ssl-certs.sh ca ca-cert kafka-ssl\n","$ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl\n","$ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client\n","$ ls -l my_secrets\ntotal 12\n-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert\n-rw------- 1 1.9K Feb 26 11:53 ca-cert.key\n-rw-rw-r-- 1 41 Feb 26 11:54 ca-cert.srl\n-rw-rw-r-- 1 9 Feb 26 12:08 cert_creds\n-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed\n-rw------- 1 1.8K Feb 26 11:54 kafka_client.key\n-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem\n-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req\n-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks\n-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: \n saslPassword: \n saslMechanisms: \n securityProtocol: SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n","$ docker compose up -d\n","version: '3'\nservices:\n zookeeper:\n image: confluentinc/cp-zookeeper:latest\n container_name: zookeeper\n hostname: zookeeper\n ports:\n - 2181:2181\n environment:\n ZOOKEEPER_SERVER_ID: 1\n ZOOKEEPER_CLIENT_PORT: 2181\n ZOOKEEPER_TICK_TIME: 2000\n\n\n kafka-ssl:\n image: confluentinc/cp-kafka:latest\n container_name: kafka-ssl\n hostname: kafka-ssl\n ports:\n - 9093:9093\n depends_on:\n - zookeeper\n environment:\n KAFKA_BROKER_ID: 1\n KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'\n ZOOKEEPER_SASL_ENABLED: \"false\"\n KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093\n KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks\n KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_KEY_CREDENTIALS: cert_creds\n KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks\n KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds\n KAFKA_SSL_CLIENT_AUTH: 'required'\n KAFKA_SECURITY_PROTOCOL: SASL_SSL\n KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n\n KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL\n KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL\n KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN\n KAFKA_SASL_ENABLED_MECHANISMS: PLAIN\n KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1\n KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n KAFKA_DEFAULT_REPLICATION_FACTOR: 1\n KAFKA_OPTS: \"-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf\"\n\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets\n - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf\n","$ docker compose up -d\n","version: '3.5'\n\nservices:\n etcd:\n ......\n \n minio:\n ......\n \n standalone:\n container_name: milvus-standalone\n ......\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets\n","$ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml\n","mq:\n type: kafka\n\nkafka:\n brokerList: \"127.0.0.1:9093\"\n saslUsername: kafka\n saslPassword: pass123\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL\n readTimeout: 10 # read message timeout in seconds\n ssl:\n enabled: true # Whether to support kafka secure connection mode\n tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key\n tlsKey: /milvus/secrets/kafka_client.key # path to client's private key\n tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate\n tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any\n"],"headingContent":"Connecting to Kafka with SASL/SSL","anchorList":[{"label":"使用 SASL/SSL 連線到 Kafka","href":"Connecting-to-Kafka-with-SASLSSL","type":1,"isActive":false},{"label":"不使用 SASL/SSL 連接 Milvus 到 Kafka","href":"Connect-Milvus-to-Kafka-Without-SASLSSL","type":2,"isActive":false},{"label":"使用 SASL/PLAIN Alone 連接 Milus 到 Kafka","href":"Connect-Milus-to-Kafka-with-SASLPLAIN-Alone","type":2,"isActive":false},{"label":"使用 SSL 獨立連接 Milvus 到 Kafka","href":"Connect-Milvus-to-Kafka-with-SSL-Alone","type":2,"isActive":false},{"label":"使用 SASL/PLAIN 和 SSL 連接 Milvus 到 Kafka","href":"Connect-Milvus-to-Kafka-with-SASLPLAIN-and-SSL","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.md b/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.md new file mode 100644 index 000000000..4c72c5aa3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/connect_kafka_ssl.md @@ -0,0 +1,617 @@ +--- +id: connect_kafka_ssl.md +title: 使用 SASL/SSL 連線到 Kafka +related_key: 'kafka, sasl, tls' +summary: 本指南列出了幾種連接 Milvus 到 Kafka 的方法,從最簡單的不使用 SASL/SSL 到使用 SASL/SSL 的完全安全的方法。 +--- +

    使用 SASL/SSL 連線到 Kafka

    本指南列出了幾種連接 Milvus 到 Kafka 的方法,從最簡單的不使用 SASL/SSL 到使用 SASL/SSL 的完全安全的方法。

    +

    不使用 SASL/SSL 連接 Milvus 到 Kafka

    要在沒有 SASL/SSL 的情況下啟動 Milvus 和 Kafka,您必須停用 Kafka 和 Milvus 的驗證和加密。僅在可信賴的環境中使用它們。

    +

    1.在沒有 SASL/SSL 的情況下啟動 Kafka 服務

    您可以使用下列docker-compose.yaml 檔案,在沒有 SASL/SSL 的情況下啟動 Kafka 服務:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: wurstmeister/zookeeper:latest
    +    container_name: zookeeper
    +    ports:
    +      - 2181:2181
    +    restart: always
    +
    +  kafka:
    +    image: wurstmeister/kafka:latest
    +    container_name: kafka
    +    ports:
    +      - 9092:9092
    +    environment:
    +      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
    +      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
    +      - KAFKA_LISTENERS=PLAINTEXT://:9092
    +    volumes:
    +      - /var/run/docker.sock:/var/run/docker.sock
    +    restart: always
    +
    +

    然後您可以使用下列指令啟動 Kafka 服務:

    +
    $ docker compose up -d
    +
    +

    2.啟動 Milvus 並連接到 Kafka

    一旦 Kafka 服務啟動,您就可以啟動 Milvus 並連接到它。使用下列docker-compose.yaml 檔案啟動 Milvus 並連線到 Kafka,不需要 SASL/SSL:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    使用以下命令下載 Milvus 配置文件模板:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    並設定以下參數:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9092"
    +  saslUsername:
    +  saslPassword:
    +  saslMechanisms:
    +  securityProtocol:
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: 
    +    tlsKey:
    +    tlsCACert:
    +    tlsKeyPassword:
    +
    +

    然後使用以下指令啟動 Milvus:

    +
    $ docker compose up -d
    +
    +

    使用 SASL/PLAIN Alone 連接 Milus 到 Kafka

    要使用 SASL/PLAIN 認證啟動 Kafka,您需要加入kafka_server_jass.conf 檔案,並進行適當的設定。

    +

    1.使用 SASL/PLAIN 啟動 Kafka 服務

    將以下docker-compose.yaml 檔案和kafka_server_jaas.conf 檔案放在同一個目錄中。

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    environment:
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +    ports:
    +      - 2181:2181
    +
    +  kafka:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka
    +    depends_on:
    +      - zookeeper
    +    ports:
    +      - 9092:9092
    +      - 9093:9093
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://localhost:9093
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    kafka_server_jass.conf 檔案中,設定下列參數:

    +
    KafkaServer {
    +    org.apache.kafka.common.security.plain.PlainLoginModule required
    +    username="kafka"
    +    password="pass123"
    +    user_kafka="pass123";
    +};
    +
    +

    然後就可以用以下指令啟動 Kafka 服務:

    +
    $ docker compose up -d
    +
    +

    2.啟動 Milvus 並連接到 Kafka

    一旦 Kafka 服務啟動,您就可以啟動 Milvus 並連接到它。使用下面的docker-compose.yaml 文件啟動 Milvus 並使用 SASL/PLAIN 連接到 Kafka:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +

    使用下面的命令下載 Milvus 配置文件模板:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    並設定以下參數:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_PLAINTEXT
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: false # Whether to support kafka secure connection mode
    +    tlsCert: # path to client's public key
    +    tlsKey: # path to client's private key
    +    tlsCACert: # file or directory path to CA certificate
    +    tlsKeyPassword: # private key passphrase for use with private key, if any
    +
    +

    然後使用下列指令啟動 Milvus:

    +
    $ docker compose up -d
    +
    +

    使用 SSL 獨立連接 Milvus 到 Kafka

    要使用 SSL 認證啟動 Kafka,你需要取得一些證書檔案或產生自簽的證書。在這個範例中,我們使用自簽的憑證。

    +

    1.產生自簽憑證

    建立一個名為my_secrets 的資料夾,在其中加入一個名為gen-ssl-certs.sh 的 bash script,並將下列內容貼入其中:

    +
    #!/bin/bash
    +#
    +#
    +# This scripts generates:
    +#  - root CA certificate
    +#  - server certificate and keystore
    +#  - client keys
    +#
    +# https://cwiki.apache.org/confluence/display/KAFKA/Deploying+SSL+for+Kafka
    +#
    +
    +
    +if [[ "$1" == "-k" ]]; then
    +    USE_KEYTOOL=1
    +    shift
    +else
    +    USE_KEYTOOL=0
    +fi
    +
    +OP="$1"
    +CA_CERT="$2"
    +PFX="$3"
    +HOST="$4"
    +
    +C=NN
    +ST=NN
    +L=NN
    +O=NN
    +OU=NN
    +CN="kafka-ssl"
    + 
    +
    +# Password
    +PASS="abcdefgh"
    +
    +# Cert validity, in days
    +VALIDITY=365
    +
    +set -e
    +
    +export LC_ALL=C
    +
    +if [[ $OP == "ca" && ! -z "$CA_CERT" && ! -z "$3" ]]; then
    +    CN="$3"
    +    openssl req -new -x509 -keyout ${CA_CERT}.key -out $CA_CERT -days $VALIDITY -passin "pass:$PASS" -passout "pass:$PASS" <<EOF
    +${C}
    +${ST}
    +${L}
    +${O}
    +${OU}
    +${CN}
    +$USER@${CN}
    +.
    +.
    +EOF
    +
    +
    +
    +elif [[ $OP == "server" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    #Step 1
    +    echo "############ Generating key"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        
    +    #Step 2
    +    echo "############ Adding CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    #Step 3
    +    echo "############ Export certificate"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +    echo "############ Sign certificate"
    +    openssl x509 -req -CA $CA_CERT -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin "pass:$PASS"
    +    
    +    
    +    echo "############ Import CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +    
    +    echo "############ Import signed CA"
    +    keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}server.keystore.jks -alias localhost -import -file ${PFX}cert-signed    
    +
    +    
    +elif [[ $OP == "client" && ! -z "$CA_CERT" && ! -z "$PFX" && ! -z "$CN" ]]; then
    +
    +    if [[ $USE_KEYTOOL == 1 ]]; then
    +        echo "############ Creating client truststore"
    +
    +        [[ -f ${PFX}client.truststore.jks ]] || keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.truststore.jks -alias CARoot -import -file $CA_CERT <<EOF
    +yes
    +EOF
    +
    +        echo "############ Generating key"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -validity $VALIDITY -genkey -keyalg RSA <<EOF
    +$CN
    +$OU
    +$O
    +$L
    +$ST
    +$C
    +yes
    +yes
    +EOF
    +        echo "########### Export certificate"
    +        keytool -storepass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -certreq -file ${PFX}cert-file
    +
    +        echo "########### Sign certificate"
    +        openssl x509 -req -CA ${CA_CERT} -CAkey ${CA_CERT}.key -in ${PFX}cert-file -out ${PFX}cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASS        
    +
    +        echo "########### Import CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias CARoot -import -file ${CA_CERT} <<EOF
    +yes
    +EOF
    +
    +        echo "########### Import signed CA"
    +        keytool -storepass "$PASS" -keypass "$PASS" -keystore ${PFX}client.keystore.jks -alias localhost -import -file ${PFX}cert-signed
    +
    +    else
    +        # Standard OpenSSL keys
    +        echo "############ Generating key"
    +        openssl genrsa -des3 -passout "pass:$PASS" -out ${PFX}client.key 2048 
    +        
    +        echo "############ Generating request"
    +        openssl req -passin "pass:$PASS" -passout "pass:$PASS" -key ${PFX}client.key -new -out ${PFX}client.req \
    +                <<EOF
    +$C
    +$ST
    +$L
    +$O
    +$OU
    +$CN
    +.
    +$PASS
    +.
    +EOF
    +
    +        echo "########### Signing key"
    +        openssl x509 -req -passin "pass:$PASS" -in ${PFX}client.req -CA $CA_CERT -CAkey ${CA_CERT}.key -CAcreateserial -out ${PFX}client.pem -days $VALIDITY
    +
    +    fi
    +
    +    
    +    
    +
    +else
    +    echo "Usage: $0 ca <ca-cert-file> <CN>"
    +    echo "       $0 [-k] server|client <ca-cert-file> <file_prefix> <hostname>"
    +    echo ""
    +    echo "       -k = Use keytool/Java Keystore, else standard SSL keys"
    +    exit 1
    +fi
    +
    +

    在上述腳本中,預設密碼abcdefgh 適用。若要變更密碼,請建立一個名為cert_creds 的文字檔,並在第一行輸入密碼。

    +

    然後執行以下指令以產生憑證:

    +
      +
    • 產生 CA 憑證:

      +

      以下假設 CA 證書檔案的名稱是ca-cert ,而經紀人的主機名稱是kafka-ssl

      +
      $ ./gen-ssl-certs.sh ca ca-cert kafka-ssl
      +
    • +
    • 生成服务器证书和密钥库:

      +

      以下假設 CA 憑證檔案的名稱是ca-cert ,所有輸出檔案的前綴是kafka_ ,經紀人的主機名稱是kafka-ssl

      +
      $ ./gen-ssl-certs.sh -k server ca-cert kafka_ kafka-ssl
      +
    • +
    • 生成用戶端金鑰:

      +

      以下假設 CA 證書檔案的名稱是ca-cert ,所有輸出檔案的前綴是kafka_ ,用戶端名稱是kafka-client

      +
      $ ./gen-ssl-certs.sh client ca-cert kafka_ kafka-client
      +
    • +
    +

    生成所有必要的證書後,您可以在my_secrets 資料夾中看到下列檔案:

    +
    $ ls -l my_secrets
    +total 12
    +-rw-rw-r-- 1 1.4K Feb 26 11:53 ca-cert
    +-rw------- 1 1.9K Feb 26 11:53 ca-cert.key
    +-rw-rw-r-- 1   41 Feb 26 11:54 ca-cert.srl
    +-rw-rw-r-- 1    9 Feb 26 12:08 cert_creds
    +-rwxrwxr-x 1 3.9K Feb 26 17:26 gen-ssl-certs.sh
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-file
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_cert-signed
    +-rw------- 1 1.8K Feb 26 11:54 kafka_client.key
    +-rw-rw-r-- 1 1.2K Feb 26 11:54 kafka_client.pem
    +-rw-rw-r-- 1 1013 Feb 26 11:54 kafka_client.req
    +-rw-rw-r-- 1 5.6K Feb 26 11:54 kafka_server.keystore.jks
    +-rw-rw-r-- 1 1.4K Feb 26 11:54 kafka_server.truststore.jks
    +
    +

    2.使用 SSL 啟動 Kafka 服務

    使用下列docker-compose.yaml 檔案以 SSL 啟動 Kafka 服務:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +
    +

    然後使用下列指令啟動 Kafka 服務:

    +
    $ docker compose up -d
    +
    +

    3.啟動 Milvus 並使用 SSL 連線到 Kafka

    一旦 Kafka 服務啟動,您就可以啟動 Milvus 並連接到它。使用下面的docker-compose.yaml 檔啟動 Milvus 並使用 SSL 連接到 Kafka:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +      
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    使用以下命令下載 Milvus 配置文件模板:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    並設定以下參數:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: 
    +  saslPassword: 
    +  saslMechanisms: 
    +  securityProtocol: SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    +

    然後用以下指令啟動 Milvus:

    +
    $ docker compose up -d
    +
    +

    使用 SASL/PLAIN 和 SSL 連接 Milvus 到 Kafka

    要使用 SASL/PLAIN 和 SSL 連接 Milvus 到 Kafka,您需要重複單獨使用 SASL/PLAIN 連接Milvus 到 Kafka 和單獨使用 SSL 連接 Milvus 到 Kafka 的步驟。

    +

    1.使用 SASL/PLAIN 和 SSL 啟動 Kafka 服務

    使用「Connect Milus to Kafka with SASL/PLAIN Alone」中提到的kafka_server_jass.conf 檔案,以及「Connect Milus to Kafka with SSL Alone」中產生的my_secrets 資料夾,以 SASL/PLAIN 和 SSL 啟動 Kafka 服務。

    +

    下列docker-compose.yaml 檔案可用於以 SASL/PLAIN 和 SSL 啟動 Kafka 服務:

    +
    version: '3'
    +services:
    +  zookeeper:
    +    image: confluentinc/cp-zookeeper:latest
    +    container_name: zookeeper
    +    hostname: zookeeper
    +    ports:
    +      - 2181:2181
    +    environment:
    +      ZOOKEEPER_SERVER_ID: 1
    +      ZOOKEEPER_CLIENT_PORT: 2181
    +      ZOOKEEPER_TICK_TIME: 2000
    +
    +
    +  kafka-ssl:
    +    image: confluentinc/cp-kafka:latest
    +    container_name: kafka-ssl
    +    hostname: kafka-ssl
    +    ports:
    +      - 9093:9093
    +    depends_on:
    +      - zookeeper
    +    environment:
    +      KAFKA_BROKER_ID: 1
    +      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
    +      ZOOKEEPER_SASL_ENABLED: "false"
    +      KAFKA_ADVERTISED_LISTENERS: SASL_SSL://kafka-ssl:9093
    +      KAFKA_SSL_KEYSTORE_FILENAME: kafka_server.keystore.jks
    +      KAFKA_SSL_KEYSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_KEY_CREDENTIALS: cert_creds
    +      KAFKA_SSL_TRUSTSTORE_FILENAME: kafka_server.truststore.jks
    +      KAFKA_SSL_TRUSTSTORE_CREDENTIALS: cert_creds
    +      KAFKA_SSL_CLIENT_AUTH: 'required'
    +      KAFKA_SECURITY_PROTOCOL: SASL_SSL
    +      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    +
    +      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_SSL:SASL_SSL
    +      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_SSL
    +      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
    +      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
    +      KAFKA_CONFLUENT_TOPIC_REPLICATION_FACTOR: 1
    +      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
    +      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
    +      KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/configs/kafka_server_jass.conf"
    +
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/etc/kafka/secrets
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/kafka_server_jass.conf:/etc/kafka/configs/kafka_server_jass.conf
    +
    +

    然後使用下列指令啟動 Kafka 服務:

    +
    $ docker compose up -d
    +
    +

    2.啟動 Milvus 並使用 SASL/PLAIN 和 SSL 連接到 Kafka

    一旦 Kafka 服務啟動,您就可以啟動 Milvus 並連接到它。使用下列docker-compose.yaml 檔案啟動 Milvus 並使用 SASL/PLAIN 和 SSL 連線到 Kafka:

    +
    version: '3.5'
    +
    +services:
    +  etcd:
    +    ......
    +    
    +  minio:
    +    ......
    +    
    +  standalone:
    +    container_name: milvus-standalone
    +    ......
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/my_secrets:/milvus/secrets
    +
    +

    使用以下命令下載 Milvus 配置文件模板:

    +
    $ wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml -O milvus.yaml
    +
    +

    並設定以下參數:

    +
    mq:
    +  type: kafka
    +
    +kafka:
    +  brokerList: "127.0.0.1:9093"
    +  saslUsername: kafka
    +  saslPassword: pass123
    +  saslMechanisms: PLAIN
    +  securityProtocol: SASL_SSL
    +  readTimeout: 10 # read message timeout in seconds
    +  ssl:
    +    enabled: true # Whether to support kafka secure connection mode
    +    tlsCert: /milvus/secrets/kafka_client.pem # path to client's public key
    +    tlsKey: /milvus/secrets/kafka_client.key # path to client's private key
    +    tlsCACert: /milvus/secrets/ca-cert # file or directory path to CA certificate
    +    tlsKeyPassword: abcdefgh # private key passphrase for use with private key, if any
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.json b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.json new file mode 100644 index 000000000..2b12143a8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.json @@ -0,0 +1 @@ +{"codeList":["etcd:\n endpoints:\n - localhost:2379\n rootPath: by-dev # The root path where data are stored in etcd\n metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath\n kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath\n log:\n # path is one of:\n # - \"default\" as os.Stderr,\n # - \"stderr\" as os.Stderr,\n # - \"stdout\" as os.Stdout,\n # - file path to append server logs to.\n # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log\n path: stdout\n level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.\n use:\n # please adjust in embedded Milvus: true\n embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).\n data:\n # Embedded Etcd only.\n # please adjust in embedded Milvus: /tmp/milvus/etcdData/\n dir: default.etcd\n","docker compose up\n","etcd:\n enabled: false\n","externalEtcd:\n enabled: true\n ## the endpoints of the external etcd\n endpoints:\n - :2379\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={:2379}\n"],"headingContent":"Configure Meta Storage with Docker Compose or Helm","anchorList":[{"label":"使用 Docker Compose 或 Helm 設定元資料儲存空間","href":"Configure-Meta-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"使用 Docker Compose 配置 etcd","href":"Configure-etcd-with-Docker-Compose","type":2,"isActive":false},{"label":"在 K8s 上配置 etcd","href":"Configure-etcd-on-K8s","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.md b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.md new file mode 100644 index 000000000..a5f2fe00e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_etcd.md @@ -0,0 +1,136 @@ +--- +id: deploy_etcd.md +title: 使用 Docker Compose 或 Helm 設定元資料儲存空間 +related_key: 'S3, storage' +summary: 學習如何使用 Docker Compose/Helm 為 Milvus 設定元儲存。 +--- +

    使用 Docker Compose 或 Helm 設定元資料儲存空間

    Milvus 使用 etcd 來儲存元資料。本主題介紹如何使用 Docker Compose 或 Helm 配置 etcd。

    +

    使用 Docker Compose 配置 etcd

    1.配置 etcd

    要使用 Docker Compose 配置 etcd,請在 milvus/configs 路徑上的milvus.yaml 檔案中的etcd 部分提供您的值。

    +
    etcd:
    +  endpoints:
    +    - localhost:2379
    +  rootPath: by-dev # The root path where data are stored in etcd
    +  metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
    +  kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
    +  log:
    +    # path is one of:
    +    #  - "default" as os.Stderr,
    +    #  - "stderr" as os.Stderr,
    +    #  - "stdout" as os.Stdout,
    +    #  - file path to append server logs to.
    +    # please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
    +    path: stdout
    +    level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
    +  use:
    +    # please adjust in embedded Milvus: true
    +    embed: false # Whether to enable embedded Etcd (an in-process EtcdServer).
    +  data:
    +    # Embedded Etcd only.
    +    # please adjust in embedded Milvus: /tmp/milvus/etcdData/
    +    dir: default.etcd
    +
    +

    更多資訊請參閱etcd 相關組態

    +

    2.執行 Milvus

    執行下列指令啟動使用 etcd 設定的 Milvus。

    +
    docker compose up
    +
    +
    配置只在 Milvus 啟動後生效。更多資訊請參閱啟動 Milvus
    +

    在 K8s 上配置 etcd

    對於 K8s 上的 Milvus 集群,您可以在啟動 Milvus 的相同命令中配置 etcd。另外,您也可以在啟動 Milvus 之前,使用values.yml 檔案在milvus-helm套件庫的 /charts/milvus 路徑上設定 etcd。

    +

    下表列出在 YAML 檔案中設定 etcd 的關鍵。

    + + + + + + + + + +
    說明
    etcd.enabled啟用或停用 etcd。true/false
    externalEtcd.enabled啟用或停用外部 etcd。true/false
    externalEtcd.endpoints存取 etcd 的端點。
    +

    使用 YAML 檔案

      +
    1. 使用values.yaml 檔案中的值配置etcd 部分。
    2. +
    +
    etcd:
    +  enabled: false
    +
    +
      +
    1. 使用values.yaml 檔案中的值配置externaletcd 部分。
    2. +
    +
    externalEtcd:
    +  enabled: true
    +  ## the endpoints of the external etcd
    +  endpoints:
    +    - <your_etcd_IP>:2379
    +
    +
      +
    1. 配置完前面的部分並儲存values.yaml 檔案後,執行下列命令安裝使用 etcd 配置的 Milvus。
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    使用命令

    要安裝 Milvus 並配置 etcd,請使用您的值執行下列命令。

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true --set etcd.enabled=false --set externaletcd.enabled=true --set externalEtcd.endpoints={<your_etcd_IP>:2379}
    +
    +

    下一步

    了解如何使用 Docker Compose 或 Helm 配置其他 Milvus 依賴項目:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.json b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.json new file mode 100644 index 000000000..a62b1dba2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.json @@ -0,0 +1 @@ +{"codeList":["pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of pulsar\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n","docker compose up\n","extraConfigFiles:\n user.yaml: |+\n pulsar:\n address: localhost # Address of pulsar\n port: 6650 # Port of Pulsar\n webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080\n maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.\n tenant: public\n namespace: default \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n kafka:\n brokerList:\n - :\n saslUsername:\n saslPassword:\n saslMechanisms: PLAIN\n securityProtocol: SASL_SSL \n","helm install milvus/milvus -f values.yaml\n","extraConfigFiles:\n user.yaml: |+\n rocksmq:\n # The path where the message is stored in rocksmq\n # please adjust in embedded Milvus: /tmp/milvus/rdb_data\n path: /var/lib/milvus/rdb_data\n lrucacheratio: 0.06 # rocksdb cache memory ratio\n rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq\n retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.\n retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.\n compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data\n # compaction compression type, only support use 0,7.\n # 0 means not compress, 7 will use zstd\n # len of types means num of rocksdb level.\n compressionTypes: [0, 0, 7, 7, 7] \n","extraConfigFiles:\n user.yaml: |+\n mq:\n type: natsmq\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n"],"headingContent":"Configure Message Storage with Docker Compose or Helm","anchorList":[{"label":"使用 Docker Compose 或 Helm 設定訊息儲存空間","href":"Configure-Message-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"使用 Docker Compose 設定 Pulsar","href":"Configure-Pulsar-with-Docker-Compose","type":2,"isActive":false},{"label":"使用 Helm 設定 Pulsar","href":"Configure-Pulsar-with-Helm","type":2,"isActive":false},{"label":"使用 Helm 配置 Kafka","href":"Configure-Kafka-with-Helm","type":2,"isActive":false},{"label":"使用 Helm 配置 RocksMQ","href":"Configure-RocksMQ-with-Helm","type":2,"isActive":false},{"label":"使用 Helm 配置 NATS","href":"Configure-NATS-with-Helm","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.md b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.md new file mode 100644 index 000000000..989669579 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_pulsar.md @@ -0,0 +1,240 @@ +--- +id: deploy_pulsar.md +title: 使用 Docker Compose 或 Helm 設定訊息儲存空間 +related_key: 'Pulsar, storage' +summary: 瞭解如何使用 Docker Compose 或 Helm 設定訊息儲存。 +--- +

    使用 Docker Compose 或 Helm 設定訊息儲存空間

    Milvus 使用 Pulsar 或 Kafka 來管理最近變更的日誌、輸出串流日誌,以及提供日誌訂閱。Pulsar 是預設的訊息儲存系統。本主題介紹如何使用 Docker Compose 或 Helm 設定訊息儲存。

    +

    您可以使用Docker Compose或在 K8s 上設定 Pulsar,並在 K8s 上設定 Kafka。

    +

    使用 Docker Compose 設定 Pulsar

    1.設定 Pulsar

    要使用 Docker Compose 設定 Pulsar,請在 milvus/configs 路徑上的milvus.yaml 檔案中提供pulsar 部分的值。

    +
    pulsar:
    +  address: localhost # Address of pulsar
    +  port: 6650 # Port of pulsar
    +  maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +
    +

    更多資訊請參閱Pulsar 相關設定

    +

    2.執行 Milvus

    執行下列指令啟動使用 Pulsar 設定的 Milvus。

    +
    docker compose up
    +
    +
    配置只在 Milvus 啟動後生效。更多資訊請參閱啟動 Milvus
    +

    使用 Helm 設定 Pulsar

    對於 K8s 上的 Milvus 集群,你可以在啟動 Milvus 的相同指令中設定 Pulsar。另外,你也可以在啟動 Milvus 之前,使用 /charts/milvus 路徑下milvus-helm套件庫中的values.yml 檔來設定 Pulsar。

    +

    關於如何使用 Helm設定 Milvus 的詳細資訊,請參考 使用Helm Charts 設定 Milvus。有關 Pulsar 相關組態項目的詳細資訊,請參閱Pulsar 相關組態

    +

    使用 YAML 檔案

      +
    1. 配置values.yaml 檔案中的externalConfigFiles 部分。
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    pulsar:
    +      address: localhost # Address of pulsar
    +      port: 6650 # Port of Pulsar
    +      webport: 80 # Web port of pulsar, if you connect direcly without proxy, should use 8080
    +      maxMessageSize: 5242880 # 5 * 1024 * 1024 Bytes, Maximum size of each message in pulsar.
    +      tenant: public
    +      namespace: default    
    +
    +
      +
    1. 配置前面的部分並儲存values.yaml 檔案後,執行下列指令安裝使用 Pulsar 配置的 Milvus。
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    使用 Helm 配置 Kafka

    對於 K8s 上的 Milvus 集群,你可以在啟動 Milvus 的同一個命令中配置 Kafka。另外,你也可以在啟動 Milvus 之前,使用 /charts/milvus 路徑上milvus-helm套件庫中的values.yml 檔來設定 Kafka。

    +

    有關如何使用 Helm設定 Milvus 的詳細資訊,請參考Configure Milvus with Helm Charts。有關 Pulsar 相關設定項的詳細資訊,請參閱Pulsar 相關設定

    +

    使用 YAML 檔案

      +
    1. 如果要使用 Kafka 作為訊息儲存系統,請設定values.yaml 檔案中的externalConfigFiles 部分。
    2. +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    kafka:
    +      brokerList:
    +        -  <your_kafka_address>:<your_kafka_port>
    +      saslUsername:
    +      saslPassword:
    +      saslMechanisms: PLAIN
    +      securityProtocol: SASL_SSL    
    +
    +
      +
    1. 配置完前面的部分並儲存values.yaml 檔案後,執行以下指令來安裝使用 Kafka 配置的 Milvus。
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    使用 Helm 配置 RocksMQ

    Milvus standalone 使用 RocksMQ 作為預設的訊息儲存空間。有關如何使用 Helm 配置 Milvus 的詳細步驟,請參考Configure Milvus with Helm Charts。關於 RocksMQ 相關配置項的詳細步驟,請參考RocksMQ 相關配置

    +
      +
    • 如果你用 RocksMQ 啟動 Milvus 並想要改變它的設定,你可以用以下 YAML 檔案中改變的設定執行helm upgrade -f

    • +
    • 如果你已經使用 Helm 獨立安裝了 Milvus,並使用了 RocksMQ 以外的訊息存放區,想要將它改回 RocksMQ,請在刷新所有集合並停止 Milvus 後,使用以下 YAML 檔案執行helm upgrade -f

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    rocksmq:
    +      # The path where the message is stored in rocksmq
    +      # please adjust in embedded Milvus: /tmp/milvus/rdb_data
    +      path: /var/lib/milvus/rdb_data
    +      lrucacheratio: 0.06 # rocksdb cache memory ratio
    +      rocksmqPageSize: 67108864 # 64 MB, 64 * 1024 * 1024 bytes, The size of each page of messages in rocksmq
    +      retentionTimeInMinutes: 4320 # 3 days, 3 * 24 * 60 minutes, The retention time of the message in rocksmq.
    +      retentionSizeInMB: 8192 # 8 GB, 8 * 1024 MB, The retention size of the message in rocksmq.
    +      compactionInterval: 86400 # 1 day, trigger rocksdb compaction every day to remove deleted data
    +      # compaction compression type, only support use 0,7.
    +      # 0 means not compress, 7 will use zstd
    +      # len of types means num of rocksdb level.
    +      compressionTypes: [0, 0, 7, 7, 7]    
    +
    +
    +

    不建議改變訊息存放區。如果您想這麼做,請先停止所有的 DDL 作業,然後再呼叫 FlushAll API 來沖洗所有的集合,最後在您實際變更訊息存放區之前停止 Milvus。

    +
    +

    使用 Helm 配置 NATS

    NATS 是一個實驗性的訊息存放區,可以替代 RocksMQ。關於如何使用 Helm 配置 Milvus 的詳細步驟,請參考Configure Milvus with Helm Charts。關於 RocksMQ 相關設定項的詳細步驟,請參考NATS 相關設定

    +
      +
    • 如果你用 NATS 啟動 Milvus 並想要改變它的設定,你可以用以下 YAML 檔案中改變的設定執行helm upgrade -f

    • +
    • 如果您用 NATS 以外的消息存储安装了 Milvus standalone,并想将其更改为 NATS,请在刷新所有集合并停止 Milvus 后,使用下面的 YAML 文件运行helm upgrade -f

    • +
    +
    extraConfigFiles:
    +  user.yaml: |+
    +    mq:
    +      type: natsmq
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +
    +
    +

    在 RocksMQ 和 NATS 之間做選擇?

    +

    RockMQ 使用 CGO 與 RocksDB 互動,並自行管理記憶體,而 Milvus 安裝中內嵌的純 Go NATS 則將記憶體管理委託給 Go 的垃圾回收器 (GC)。

    +

    在資料封包小於 64 kb 的情況下,RocksDB 在記憶體使用量、CPU 使用量和回應時間上都比較優勝。另一方面,如果資料封包大於 64 kb,NATS 在有足夠記憶體和理想 GC 排程的情況下,在回應時間上表現優異。

    +

    目前,建議您僅在實驗中使用 NATS。

    +
    +

    下一步

    學習如何使用 Docker Compose 或 Helm 配置其他 Milvus 依賴項目:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.json b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.json new file mode 100644 index 000000000..343fc9f48 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.json @@ -0,0 +1 @@ +{"codeList":["minio:\n address: \n port: \n accessKeyID: \n secretAccessKey: \n useSSL: \n bucketName: \"\"\n","docker compose up\n","minio:\n enabled: false\n","externalS3:\n enabled: true\n host: \"\"\n port: \"\"\n accessKey: \"\"\n secretKey: \"\"\n useSSL: \n bucketName: \"\"\n","helm install milvus/milvus -f values.yaml\n","helm install milvus/milvus --set cluster.enabled=true --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host= --set externalS3.port= --set externalS3.accessKey= --set externalS3.secretKey= --set externalS3.bucketName=\n"],"headingContent":"Configure Object Storage with Docker Compose or Helm","anchorList":[{"label":"使用 Docker Compose 或 Helm 設定物件儲存","href":"Configure-Object-Storage-with-Docker-Compose-or-Helm","type":1,"isActive":false},{"label":"使用 Docker Compose 設定 S3","href":"Configure-S3-with-Docker-Compose","type":2,"isActive":false},{"label":"在 K8s 上設定 S3","href":"Configure-S3-on-K8s","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.md b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.md new file mode 100644 index 000000000..3db2e2bee --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/deploy_s3.md @@ -0,0 +1,132 @@ +--- +id: deploy_s3.md +title: 使用 Docker Compose 或 Helm 設定物件儲存 +related_key: 'S3, storage' +summary: 學習如何使用 Docker Compose 或 Helm 為 Milvus 設定 S3 儲存。 +--- +

    使用 Docker Compose 或 Helm 設定物件儲存

    Milvus 預設使用 MinIO 作為物件儲存,但它也支援使用Amazon Simple Storage Service (S3)作為日誌和索引檔案的持久性物件儲存。本主題描述如何為 Milvus 設定 S3。如果您滿意 MinIO,可以跳過本主題。

    +

    您可以使用Docker Compose或在 K8s 上設定 S3。

    +

    使用 Docker Compose 設定 S3

    1.設定 S3

    MinIO與 S3 相容。要使用 Docker Compose 設定 S3,請在 milvus/configs 路徑上的milvus.yaml 檔案中提供minio 部分的值。

    +
    minio:
    +  address: <your_s3_endpoint>
    +  port: <your_s3_port>
    +  accessKeyID: <your_s3_access_key_id>
    +  secretAccessKey: <your_s3_secret_access_key>
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +

    如需詳細資訊,請參閱MinIO/S3 配置

    +

    2.完善 docker-compose.yaml

    您也可以移除MINIO_ADDRESS 環境變數,讓 milvus 服務在docker-compose.yaml 。預設的情況下,milvus 會使用本機的 minio 而不是外部的 S3。

    +

    3.執行 Milvus

    執行下列指令啟動使用 S3 配置的 Milvus。

    +
    docker compose up
    +
    +
    配置僅在 Milvus 啟動後生效。更多資訊請參閱啟動 Milvus
    +

    在 K8s 上設定 S3

    對於 K8s 上的 Milvus 叢集,您可以在啟動 Milvus 的相同指令中設定 S3。另外,您也可以在啟動 Milvus 前,使用milvus-helm套件庫中 /charts/milvus 路徑上的values.yml 檔來設定 S3。

    +

    下表列出在 YAML 檔案中設定 S3 的鍵。

    + + + + + + + + + + + + + + + +
    說明
    minio.enabled啟用或停用 MinIO。true/false
    externalS3.enabled啟用或停用 S3。true/false
    externalS3.host存取 S3 的端點。
    externalS3.port存取 S3 的連接埠。
    externalS3.rootPathS3 儲存的根目錄。預設為 emtpy 字串。
    externalS3.accessKeyS3 的存取金鑰 ID。
    externalS3.secretKeyS3 的秘密存取金鑰。
    externalS3.bucketNameS3 儲存桶的名稱。
    externalS3.useSSL連接時是否使用 SSL預設值為false
    +

    使用 YAML 檔案

      +
    1. values.yaml 檔案中設定minio 部分。
    2. +
    +
    minio:
    +  enabled: false
    +
    +
      +
    1. 使用您在values.yaml 檔案中的值配置externalS3 部分。
    2. +
    +
    externalS3:
    +  enabled: true
    +  host: "<your_s3_endpoint>"
    +  port: "<your_s3_port>"
    +  accessKey: "<your_s3_access_key_id>"
    +  secretKey: "<your_s3_secret_key>"
    +  useSSL: <true/false>
    +  bucketName: "<your_bucket_name>"
    +
    +
      +
    1. 配置前面的部分並儲存values.yaml 檔案後,執行下列指令安裝使用 S3 配置的 Milvus。
    2. +
    +
    helm install <your_release_name> milvus/milvus -f values.yaml
    +
    +

    使用指令

    要安裝 Milvus 並配置 S3,請使用您的值執行下列指令。

    +
    helm install <your_release_name> milvus/milvus --set cluster.enabled=true  --set minio.enabled=false --set externalS3.enabled=true --set externalS3.host=<your_s3_endpoint> --set externalS3.port=<your_s3_port> --set externalS3.accessKey=<your_s3_access_key_id> --set externalS3.secretKey=<your_s3_secret_key> --set externalS3.bucketName=<your_bucket_name>
    +
    +

    下一步

    了解如何使用 Docker Compose 或 Helm 配置其他 Milvus 依賴項目:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.json b/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.json new file mode 100644 index 000000000..db8c3b1f2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create a user​\nclient.drop_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.client.ConnectConfig​\nimport io.milvus.v2.client.MilvusClientV2​\nimport io.milvus.v2.service.rbac.request.DropUserReq​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropUserReq dropUserReq = DropUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nclient.dropUser(dropUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.deleteUser({​\n username: 'user_1'​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","import io.milvus.v2.service.rbac.request.listUsersReq​\n​\nList resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listUsers()​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root']​\n\n","from pymilvus import MilvusClient​\n​\nclient.drop_role(role_name=\"role_a\")​\n\n","import io.milvus.v2.service.rbac.request.DropRoleReq​\n​\nDropRoleReq dropRoleReq = DropRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\nclient.dropRole(dropRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.dropRole({​\n roleName: 'role_a',​\n })​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List resp = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.listRoles(​\n includeUserInfo: True​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin']​\n\n"],"headingContent":"Drop Users & Roles​","anchorList":[{"label":"刪除使用者和角色","href":"Drop-Users--Roles​","type":1,"isActive":false},{"label":"刪除使用者","href":"Drop-a-user​","type":2,"isActive":false},{"label":"刪除角色","href":"Drop-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.md b/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.md new file mode 100644 index 000000000..b1d485ea4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/drop_users_roles.md @@ -0,0 +1,202 @@ +--- +id: drop_users_roles.md +related_key: enable RBAC +summary: 為了確保資料安全,建議您刪除不再使用的使用者和角色。本指南將介紹如何刪除使用者和角色。 +title: 刪除使用者和角色 +--- +

    刪除使用者和角色

    為了確保資料安全,建議您刪除不再使用的使用者和角色。本指南將介紹如何停用使用者和角色。

    +

    刪除使用者

    以下範例示範如何停用使用者user_1

    +
    +

    root 使用者無法被刪除。

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create a user​
    +client.drop_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig​
    +import io.milvus.v2.client.MilvusClientV2​
    +import io.milvus.v2.service.rbac.request.DropUserReq​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropUserReq dropUserReq = DropUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +client.dropUser(dropUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.deleteUser({​
    +    username: 'user_1'​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    一旦用戶被 drop,您可以列出所有現有的用戶,以檢查 drop 操作是否成功。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.listUsersReq​
    +​
    +List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listUsers()​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    以下是一個輸出範例。清單中沒有user_1 。刪除操作成功。

    +
    ['root']​
    +
    +
    +

    刪除角色

    以下範例示範如何刪除角色role_a

    +
    +

    內建的角色admin 無法刪除。

    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.drop_role(role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropRoleReq​
    +​
    +DropRoleReq dropRoleReq = DropRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +client.dropRole(dropRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.dropRole({​
    +   roleName: 'role_a',​
    + })​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    一旦刪除角色,您可以列出所有現有角色,以檢查刪除作業是否成功。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> resp = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.listRoles(​
    +    includeUserInfo: True​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    以下是一個輸出範例。清單中沒有role_a 。刪除作業成功。

    +
    ['admin']​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.json b/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.json new file mode 100644 index 000000000..8cc40794c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.json @@ -0,0 +1 @@ +{"codeList":["$ etcdctl put by-dev/config/proxy/minPasswordLength 8\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl del by-dev/config/proxy/minPasswordLength \n# or \n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength\"\n","$ etcdctl get by-dev/config/proxy/minPasswordLength\n","$ etcdctl get --prefix by-dev/config\n# or\n$ birdwatcher -olc \"#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd\"\n","Offline > connect --etcd ip:port \nMilvus(by-dev) > show session # List all nodes with their server ID\nMilvus(by-dev) > visit querycoord 1 # Visit a node by server ID\nQueryCoord-1(ip:port) > configuration # List the configuration of the node\n"],"headingContent":"Configure Milvus on the Fly","anchorList":[{"label":"即時配置 Milvus","href":"Configure-Milvus-on-the-Fly","type":1,"isActive":false},{"label":"在您開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"變更組態","href":"Change-configurations","type":2,"isActive":false},{"label":"回滾組態","href":"Roll-back-configurations","type":2,"isActive":false},{"label":"查看配置","href":"View-configurations","type":2,"isActive":false},{"label":"適用的組態項目","href":"Applicable-configuration-items","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.md b/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.md new file mode 100644 index 000000000..5d64c46ae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/dynamic_config.md @@ -0,0 +1,208 @@ +--- +id: dynamic_config.md +related_key: configure +summary: 了解 Milvus 的動態配置。 +title: 即時配置 Milvus +--- +

    即時配置 Milvus

    Milvus 允許您即時變更某些配置。

    +

    在您開始之前

    您需要確保: 您已安裝 Birdwatcher。

    +
      +
    • 您已安裝 Birdwatcher。詳情請參閱安裝 Birdwatcher
    • +
    • 您已安裝 etcdctl。詳情請參閱與 etcd 互動,或
    • +
    • 您安裝了其他 etcd 用戶端,例如 Python 用戶端。
    • +
    +
    +
      +
    • 本指南中的示例將proxy.minPasswordLength 的值更改成8 。您可以使用Applicable configuration items(適用的組態項目)中列出的適用的鍵來替換。
    • +
    • 本指南的範例假設你的 Milvus 的根目錄為by-dev 。所有配置都列在路徑by-dev/config 下。Milvus 根路徑會因安裝方式而異。對於使用 Helm 圖表安裝的實體,根目錄預設為by-dev 。如果您不知道根目錄,請參考Connect to etcd
    • +
    +
    +

    變更組態

    在 Milvus 上,proxy.minPasswordLength 預設設定為6 。要變更此值,您可以執行下列步驟:

    +
    $ etcdctl put by-dev/config/proxy/minPasswordLength 8
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,set config-etcd --key by-dev/config/proxy/minPasswordLength --value 8"
    +
    +

    然後您可以檢查配置如下:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    回滾組態

    Milvus 也允許您回退配置,以防更改的值不再適用。

    +
    $ etcdctl del by-dev/config/proxy/minPasswordLength 
    +# or 
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,remove config-etcd --key by-dev/config/proxy/minPasswordLength"
    +
    +

    然後您可以檢查配置,如下所示:

    +
    $ etcdctl get by-dev/config/proxy/minPasswordLength
    +
    +

    查看配置

    與其查看特定配置項的值,您還可以列出所有配置項。

    +
    $ etcdctl get --prefix by-dev/config
    +# or
    +$ birdwatcher -olc "#connect --etcd 127.0.0.1:2379 --rootPath=by-dev,show config-etcd"
    +
    +

    檢視特定節點的組態:

    +
    Offline > connect --etcd ip:port 
    +Milvus(by-dev) > show session          # List all nodes with their server ID
    +Milvus(by-dev) > visit querycoord 1    # Visit a node by server ID
    +QueryCoord-1(ip:port) > configuration  # List the configuration of the node
    +
    +

    適用的組態項目

    目前,您可以即時變更下列組態項目。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    組態項目預設值
    pulsar.maxMessageSize5242880
    common.retentionDuration86400
    common.entityExpiration-1
    常見的優化時間5000
    common.gracefulStopTimeout30
    quotaAndLimits.ddl.enabledFALSE
    quotaAndLimits.indexRate.enabledFALSE
    quotaAndLimits.flushRate.enabledFALSE
    quotaAndLimits.compactionRate.enabledFALSE
    quotaAndLimits.dml.enabledFALSE
    quotaAndLimits.dql.enabledFALSE
    quotaAndLimits.limits.collection.maxNum64
    quotaAndLimits.limitWriting.forceDenyFALSE
    quotaAndLimits.limitWriting.ttProtection.enabledFALSE
    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay9223372036854775807
    quotaAndLimits.limitWriting.memProtection.enabledTRUE
    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel0.85
    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel0.95
    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel0.85
    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel 0.950.95
    quotaAndLimits.limitWriting.diskProtection.enabledTRUE
    quotaAndLimits.limitWriting.diskProtection.diskQuota+INF
    quotaAndLimits.limitReading.forceDenyFALSE
    quotaAndLimits.limitReading.queueProtection.enabledFALSE
    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold9223372036854775807
    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold+INF
    quotaAndLimits.limitReading.resultProtection.enabledFALSE
    quotaAndLimits.limitReading.resultProtection.maxReadResultRate+INF
    quotaAndLimits.limitReading.coolOffSpeed0.9
    自動索引啟用FALSE
    autoIndex.params.build""
    autoIndex.params.extra""
    autoIndex.params.search""
    proxy.maxNameLength255
    proxy.maxUsernameLength32
    proxy.minPasswordLength6
    proxy.maxPasswordLength256
    proxy.maxFieldNum64
    proxy.maxShardNum256
    proxy.maxDimension32768
    proxy.maxUserNum100
    proxy.maxRoleNum10
    queryNode.enableDiskTRUE
    dataCoord.segment.diskSegmentMaxSize2048
    dataCoord.compaction.enableAutoCompactionTRUE
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.json b/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.json new file mode 100644 index 000000000..d88223cae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.grant_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.grantPrivilegeV2(GrantPrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"collection_01\", \"privilege_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.GrantV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\n\nawait milvusClient.grantPrivilege({\n roleName: 'role_a',\n object: 'Collection', \n objectName: 'collection_01',\n privilegeName: 'Search'\n });\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"privilege_group_1\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n","from pymilvus import MilvusClient\n\nclient.describe_role(role_name=\"role_a\")\n","import io.milvus.v2.service.rbac.response.DescribeRoleResp;\nimport io.milvus.v2.service.rbac.request.DescribeRoleReq\n\nDescribeRoleReq describeRoleReq = DescribeRoleReq.builder()\n .roleName(\"role_a\")\n .build();\nDescribeRoleResp resp = client.describeRole(describeRoleReq);\nList infos = resp.getGrantInfos();\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.ListRoles(context.Background())\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")\n\nawait milvusClient.describeRole({roleName: 'role_a'});\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\"\n}'\n","{\n \"role\": \"role_a\",\n \"privileges\": [\n {\n \"collection_name\": \"collection_01\",\n \"db_name\": \"default\",\n \"role_name\": \"role_a\",\n \"privilege\": \"Search\",\n \"grantor_name\": \"root\"\n },\n \"privilege_group_1\"\n ]\n}\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"http://localhost:19530\",\n token=\"root:Milvus\"\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"Search\"\n collection_name='collection_01'\n db_name='default',\n)\n \nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"privilege_group_1\"\n collection_name='collection_01'\n db_name='default',\n)\n\nclient.revoke_privilege_v2(\n role_name=\"role_a\",\n privilege=\"ClusterReadOnly\"\n collection_name='*'\n db_name='*',\n)\n","import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"Search\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"privilege_group_1\")\n .collectionName(\"collection_01\")\n .dbName(\"default\")\n .build());\n\nclient.revokePrivilegeV2(RevokePrivilegeReqV2.builder()\n .roleName(\"role_a\")\n .privilege(\"ClusterReadOnly\")\n .collectionName(\"*\")\n .dbName(\"*\")\n .build());\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"Search\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"collection_01\", \"privielge_group_1\", entity.WithOperatePrivilegeDatabase(\"default\"))\n\nclient.RevokeV2(context.Background(), \"role_a\", \"*\", \"ClusterReadOnly\", entity.WithOperatePrivilegeDatabase(\"*\"))\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"Search\",\n \"collectionName\": \"collection_01\",\n \"dbName\":\"default\"\n}'\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"roleName\": \"role_a\",\n \"privilege\": \"ClusterReadOnly\",\n \"collectionName\": \"*\",\n \"dbName\":\"*\"\n}'\n"],"headingContent":"Grant Privilege or Privilege Group to Roles​","anchorList":[{"label":"授予角色特權或特權群組","href":"Grant-Privilege-or-Privilege-Group-to-Roles​","type":1,"isActive":false},{"label":"授予角色一個特權或特權群組","href":"Grant-a-privilege-or-a-privilege-group-to-a-role​","type":2,"isActive":false},{"label":"描述角色","href":"Describe-a-role","type":2,"isActive":false},{"label":"撤銷角色的特權或特權群組","href":"Revoke-a-privilege-or-a-privilege-group-from-a-role","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.md b/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.md new file mode 100644 index 000000000..021a4a18d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/grant_privileges.md @@ -0,0 +1,540 @@ +--- +id: grant_privileges.md +related_key: enable RBAC +summary: 建立角色後,就可以授予角色權限。本指南將介紹如何授予角色權限或權限群組。 +title: 授予角色特權或特權群組 +--- +

    授予角色特權或特權群組

    建立角色後,就可以授予角色權限。本指南介紹如何授予角色特權或特權群組。

    +

    授予角色一個特權或特權群組

    Milvus 2.5 引入了新版本的 API,簡化了授予操作。向角色授予特權時,不再需要查詢對象類型。以下是參數和相對應的解釋。

    +
      +
    • role_name:需要授予特權或特權群組的目標角色名稱。

    • +
    • Resource: 資源:特權的目標資源,可以是特定的實體、資料庫或集合。下表解釋如何在client.grantV2() 方法中指定資源。

    • +
    +

    層級

    +

    資源

    +

    授予方法

    +

    註解

    +

    收集

    +

    +

    特定的收藏集

    +

    +

    client.grant_privilege_v2(role_name="roleA", privilege="CollectionAdmin", collection_name="col1", db_name="db1")

    +

    輸入目標集合的名稱,以及目標集合所屬資料庫的名稱。

    +

    +

    特定資料庫下的所有集合

    +

    client.grant_privilege_v2(role_name="roleA", privilege="CollectionAdmin", collection_name="*", db_name="db1")

    +

    輸入目標資料庫的名稱和通配符`*` 作為集合名稱。

    +

    **Database**

    +

    特定資料庫

    +

    client.grant_privilege_v2(role_name="roleA", privilege="DatabaseAdmin", collection_name="*", db_name="db1")

    +

    輸入目標資料庫的名稱和通配符`*` 作為集合名稱。

    +

    +

    目前實例下的所有資料庫

    +

    client.grant_privilege_v2(role_name="roleA", privilege="DatabaseAdmin", collection_name="*", db_name="*")

    +

    輸入`*` 作為資料庫名稱,輸入`*` 作為集合名稱。

    +

    ** 實例**

    +

    目前的實體

    +

    client.grant_privilege_v2(role_name="roleA", privilege="ClusterAdmin", collection_name="*", db_name="*")

    +

    輸入`*` 作為資料庫名稱,輸入`*` 作為集合名稱。

    +
    +
      +
    • 權限:您需要賦予角色的特定權限或權限群。目前,Milvus 提供 56 種可授予的權限。下表列出了 Milvus 中的特權。

      +

      +

      下表中的類型欄是用戶為了方便您快速查找特權,僅用於分類目的。在授予特權時,您不需要瞭解其類型。您只需輸入對應的權限即可。

      +

    • +
    +

    **類型 **

    +

    **權限**

    +

    **描述

    +

    **客戶端的相關 API 描述**

    +

    資料庫權限

    +

    列出資料庫

    +

    檢視目前實例中的所有資料庫

    +

    [ListDatabases](https://milvus.io/docs/manage_databases.md)

    +

    描述資料庫

    +

    檢視資料庫的詳細資訊

    +

    [DescribeDatabase](https://milvus.io/docs/manage_databases.md)

    +

    建立資料庫

    +

    建立資料庫

    +

    [CreateDatabase](https://milvus.io/docs/manage_databases.md)

    +

    丟棄資料庫

    +

    丟棄資料庫

    +

    [DropDatabase](https://milvus.io/docs/manage_databases.md)

    +

    更改資料庫

    +

    修改資料庫的屬性

    +

    [AlterDatabase](https://milvus.io/docs/manage_databases.md)

    +

    收集權限

    +

    +

    GetFlushState

    +

    檢查集合沖洗作業的狀態

    +

    [GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    取得載入狀態

    +

    檢查集合的載入狀態

    +

    [GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    取得載入進度

    +

    檢查集合的載入進度

    +

    [GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)

    +

    顯示收藏集

    +

    檢視所有具有收藏權限的收藏集

    +

    [ShowCollections](https://milvus.io/docs/view-collections.md)

    +

    列出別名

    +

    檢視集合的所有別名

    +

    [ListAliases](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/list_aliases.md)

    +

    描述收藏集

    +

    檢視集合的詳細資訊

    +

    [DescribeCollection](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_collection.md)

    +

    描述別名

    +

    檢視別名的詳細資訊

    +

    [DescribeAlias](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/describe_alias.md)

    +

    取得統計資料

    +

    取得集合的統計資料 (例如集合中的實體數量)

    +

    [GetCollectionStatistics](https://milvus.io/api-reference/pymilvus/v2.5.x/MilvusClient/Collections/get_collection_stats.md)

    +

    建立集合

    +

    建立一個集合

    +

    [CreateCollection](https://milvus.io/docs/create-collection.md)

    +

    丟棄集合

    +

    丟棄一個收藏集

    +

    [DropCollection](https://milvus.io/docs/drop-collection.md)

    +

    載入

    +

    載入一個收藏集

    +

    [LoadCollection](https://milvus.io/docs/load-and-release.md)/[GetLoadingProgress](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/loading_progress.md)/[GetLoadState](https://milvus.io/api-reference/restful/v2.5.x/v2/Collection%20(v2)/Get%20Load%20State.md)

    +

    釋放

    +

    釋放集合

    +

    [ReleaseCollection](https://milvus.io/docs/load-and-release.md)

    +

    刷新

    +

    +

    將集合中的所有實體持久化到封閉的區段。任何在 flush 操作之後插入的實體都會被儲存在新的區段中。

    +

    [Flush](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)/[GetFlushState](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/Collection/flush.md)

    +

    壓縮

    +

    手動觸發壓縮

    +

    [Compact](https://milvus.io/docs/v2.0.x/compact_data.md)

    +

    重新命名集合

    +

    重新命名一個集合

    +

    [RenameCollection](https://milvus.io/docs/modify-collection.md)

    +

    建立別名

    +

    為集合建立別名

    +

    [CreateAlias](https://milvus.io/docs/manage-aliases.md)

    +

    刪除別名

    +

    刪除集合的別名

    +

    [DropAlias](https://milvus.io/docs/manage-aliases.md)

    +

    全部清除

    +

    清除資料庫中的所有集合

    +

    [FlushAll](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/flush_all.md)

    +

    分區權限

    +

    有分區

    +

    檢查是否存在磁碟分割

    +

    [HasPartition](https://milvus.io/docs/manage-partitions.md)

    +

    顯示分割區

    +

    檢視集合中的所有磁碟分割

    +

    [ShowPartitions](https://milvus.io/docs/manage-partitions.md)

    +

    建立磁碟分割

    +

    建立磁碟分割

    +

    [CreatePartition](https://milvus.io/docs/manage-partitions.md)

    +

    丟棄分割區

    +

    刪除磁碟分割

    +

    [DropPartition](https://milvus.io/docs/manage-partitions.md)

    +

    索引權限

    +

    索引詳細資料

    +

    檢視索引的詳細資料

    +

    +

    [DescribeIndex/GetIndexState/GetIndexBuildProgress](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    建立索引

    +

    建立索引

    +

    [CreateIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    刪除索引

    +

    刪除索引

    +

    [DropIndex](https://milvus.io/docs/index-vector-fields.md?tab=floating)

    +

    資源管理權限

    +

    +

    負載平衡

    +

    達成負載平衡

    +

    [LoadBalance](https://milvus.io/docs/resource_group.md)

    +

    建立資源群組

    +

    建立資源群組

    +

    [CreateResourceGroup](https://milvus.io/api-reference/pymilvus/v2.5.x/ORM/utility/create_resource_group.md)

    +

    刪除資源群組

    +

    刪除資源群組

    +

    [DropResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    更新資源群組

    +

    更新資源群組

    +

    [UpdateResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    描述資源群組

    +

    檢視資源群組的詳細資訊

    +

    [DescribeResourceGroup](https://milvus.io/docs/resource_group.md)

    +

    列出資源群組

    +

    檢視目前實例的所有資源群組

    +

    [ListResourceGroups](https://milvus.io/docs/resource_group.md)

    +

    轉移節點

    +

    在資源群組之間轉移節點

    +

    [TransferNode](https://milvus.io/docs/resource_group.md)

    +

    傳送複本

    +

    在資源群組之間傳輸複本

    +

    [TransferReplica](https://milvus.io/docs/resource_group.md)

    +

    備份 RBAC

    +

    為目前實例中所有 RBAC 相關作業建立備份

    +

    備份 RBAC

    +

    還原 RBAC

    +

    還原當前實例中所有 RBAC 相關操作的備份

    +

    還原 RBAC

    +

    實體權限

    +

    +

    查詢

    +

    進行查詢

    +

    [查詢](https://milvus.io/docs/get-and-scalar-query.md)

    +

    搜尋

    +

    進行搜尋

    +

    [Search](https://milvus.io/docs/single-vector-search.md)

    +

    插入

    +

    插入實體

    +

    [Insert](https://milvus.io/docs/insert-update-delete.md)

    +

    刪除

    +

    刪除實體

    +

    [刪除](https://milvus.io/docs/delete-entities.md)

    +

    插入

    +

    插入實體

    +

    [Upsert](https://milvus.io/docs/upsert-entities.md)

    +

    輸入

    +

    大量插入或匯入實體

    +

    [BulkInsert/Import](https://milvus.io/docs/import-data.md)

    +

    RBAC 權限

    +

    建立所有權

    +

    建立使用者或角色

    +

    [CreateUser/CreateRole](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    更新使用者

    +

    更新使用者的密碼

    +

    [UpdateCredential](https://zilliverse.feishu.cn/wiki/CnzkwQBW3i7bE3kVtLzcqQLtn9d)

    +

    刪除所有權

    +

    刪除使用者密碼或角色

    +

    [DeleteCredential/DropRole](https://zilliverse.feishu.cn/wiki/OqZnwJHrJilLPukfvp5cSgnmnTh)

    +

    選擇所有權

    +

    檢視授予特定角色的所有使用者

    +

    [SelectRole/SelectGrant](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    管理所有權

    +

    管理使用者或角色,或將角色授予使用者

    +

    [OperateUserRole/OperatePrivilege/OperatePrivilegeV2](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    選擇使用者

    +

    檢視授予使用者的所有角色

    +

    [SelectUser](https://zilliverse.feishu.cn/wiki/ZsNZwn1MkiOtH9kFU35cyRgVnue)

    +

    建立特權群組

    +

    建立特權群組

    +

    [CreatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    刪除特權群組

    +

    刪除特權群組

    +

    [DropPrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    列出特權群組

    +

    檢視目前實例中的所有權限群組

    +

    [ListPrivilegeGroups](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +

    操作特權群組

    +

    在特權群組中加入特權或移除特權

    +

    [OperatePrivilegeGroup](https://zilliverse.feishu.cn/wiki/FpV8wdWcZiDwnQkBloucYF7wnUg)

    +
    +

    以下範例示範如何在collection_01 上授予預設資料庫下的PrivilegeSearch 特權,以及授予角色role_a 名為privilege_group_1 的特權群組。

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.grant_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.GrantPrivilegeReqV2
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.grantPrivilegeV2(GrantPrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "collection_01", "privilege_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.GrantV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +
    +await milvusClient.grantPrivilege({
    +   roleName: 'role_a',
    +   object: 'Collection', 
    +   objectName: 'collection_01',
    +   privilegeName: 'Search'
    + });
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "privilege_group_1",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/grant_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    +

    描述角色

    下面的示例演示了如何使用 describe_role 方法查看授予角色 role_a 的权限。

    + +
    from pymilvus import MilvusClient
    +
    +client.describe_role(role_name="role_a")
    +
    +
    import io.milvus.v2.service.rbac.response.DescribeRoleResp;
    +import io.milvus.v2.service.rbac.request.DescribeRoleReq
    +
    +DescribeRoleReq describeRoleReq = DescribeRoleReq.builder()
    +        .roleName("role_a")
    +        .build();
    +DescribeRoleResp resp = client.describeRole(describeRoleReq);
    +List<DescribeRoleResp.GrantInfo> infos = resp.getGrantInfos();
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.ListRoles(context.Background())
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")
    +
    +await milvusClient.describeRole({roleName: 'role_a'});
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/describe" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a"
    +}'
    +
    +

    以下是一個輸出範例。

    +
    {
    +     "role": "role_a",
    +     "privileges": [
    +         {
    +             "collection_name": "collection_01",
    +             "db_name": "default",
    +             "role_name": "role_a",
    +             "privilege": "Search",
    +             "grantor_name": "root"
    +         },
    +         "privilege_group_1"
    +     ]
    +}
    +
    +

    撤銷角色的特權或特權群組

    以下範例示範如何撤銷collection_01 在預設資料庫下的特權PrivilegeSearch ,以及授予角色role_a 的特權群組privilege_group_1

    + +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="http://localhost:19530",
    +    token="root:Milvus"
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="Search"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +    
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="privilege_group_1"
    +    collection_name='collection_01'
    +    db_name='default',
    +)
    +
    +client.revoke_privilege_v2(
    +    role_name="role_a",
    +    privilege="ClusterReadOnly"
    +    collection_name='*'
    +    db_name='*',
    +)
    +
    +
    import io.milvus.v2.service.rbac.request.RevokePrivilegeReqV2
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("Search")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("privilege_group_1")
    +        .collectionName("collection_01")
    +        .dbName("default")
    +        .build());
    +
    +client.revokePrivilegeV2(RevokePrivilegeReqV2.builder()
    +        .roleName("role_a")
    +        .privilege("ClusterReadOnly")
    +        .collectionName("*")
    +        .dbName("*")
    +        .build());
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "Search", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "collection_01", "privielge_group_1", entity.WithOperatePrivilegeDatabase("default"))
    +
    +client.RevokeV2(context.Background(), "role_a", "*", "ClusterReadOnly", entity.WithOperatePrivilegeDatabase("*"))
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "Search",
    +    "collectionName": "collection_01",
    +    "dbName":"default"
    +}'
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/revoke_privilege_v2" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "roleName": "role_a",
    +    "privilege": "ClusterReadOnly",
    +    "collectionName": "*",
    +    "dbName":"*"
    +}'
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.json b/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.json new file mode 100644 index 000000000..70fd51bdf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.grant_role(user_name=\"user_1\", role_name=\"role_a\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.GrantRoleReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nGrantRoleReq grantRoleReq = GrantRoleReq.builder()​\n .roleName(\"role_a\")​\n .userName(\"user_1\")​\n .build();​\nclient.grantRole(grantRoleReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nmilvusClient.grantRole({​\n username: 'user_1',​\n roleName: 'role_a'​\n })​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\",​\n \"userName\": \"user_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.describe_user(user_name=\"user_1\")​\n\n","import io.milvus.v2.service.rbac.request.DescribeUserReq;​\nimport io.milvus.v2.service.rbac.response.DescribeUserResp;​\n​\nDescribeUserReq describeUserReq = DescribeUserReq.builder()​\n .userName(\"user_1\")​\n .build();​\nDescribeUserResp describeUserResp = client.describeUser(describeUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nmilvusClient.describeUser({username: 'user_1'})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\"​\n}'​\n\n","{'user_name': 'user_1', 'roles': 'role_a'}​\n\n","from pymilvus import MilvusClient​\n​\nclient.revoke_role(​\n user_name='user_1',​\n role_name='role_a'​\n)​\n\n","import io.milvus.v2.service.rbac.request.RevokeRoleReq;​\n​\nclient.revokeRole(RevokeRoleReq.builder()​\n .userName(\"user_1\")​\n .roleName(\"role_a\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"roleName\": \"role_a\"​\n}'​\n\n"],"headingContent":"Grant Roles to Users​","anchorList":[{"label":"授予使用者角色","href":"Grant-Roles-to-Users​","type":1,"isActive":false},{"label":"授予用戶角色","href":"Grant-a-role-to-a-user​","type":2,"isActive":false},{"label":"描述使用者","href":"Describe-user​","type":2,"isActive":false},{"label":"撤銷角色","href":"Revoke-a-role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.md b/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.md new file mode 100644 index 000000000..6f61b31fa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/grant_roles.md @@ -0,0 +1,201 @@ +--- +id: grant_roles.md +related_key: enable RBAC +summary: >- + 建立角色並授予角色權限後,您可以將角色授予使用者,這樣使用者就可以存取資源並執行角色所定義的動 + 作。您可以向一個使用者授予多個角色,或向多個使用者授予一個角色。本指南介紹如何授予使用者角色。 +title: 授予使用者角色 +--- +

    授予使用者角色

    建立角色並授予角色權限後,您可以將角色授予使用者,這樣使用者就可以存取資源並執行角色所定義的動 作。您可以向一個使用者授予多個角色,或向多個使用者授予一個角色。本指南介紹如何授予用戶角色。

    +

    Milvus 中的內建使用者root 已經被賦予admin 角色,擁有所有權限。您不需要為它指派任何其他角色。

    +

    授予用戶角色

    以下範例示範如何授予角色role_a 給使用者user_1

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.grant_role(user_name="user_1", role_name="role_a")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.GrantRoleReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +GrantRoleReq grantRoleReq = GrantRoleReq.builder()​
    +        .roleName("role_a")​
    +        .userName("user_1")​
    +        .build();​
    +client.grantRole(grantRoleReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +milvusClient.grantRole({​
    +   username: 'user_1',​
    +   roleName: 'role_a'​
    + })​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/grant_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a",​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    描述使用者

    一旦授予一個角色給使用者,您可以透過describe_user() 方法檢查授予操作是否成功。

    +

    下面的示例演示了如何檢查用戶user_1 的角色。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.describe_user(user_name="user_1")​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DescribeUserReq;​
    +import io.milvus.v2.service.rbac.response.DescribeUserResp;​
    +​
    +DescribeUserReq describeUserReq = DescribeUserReq.builder()​
    +        .userName("user_1")​
    +        .build();​
    +DescribeUserResp describeUserResp = client.describeUser(describeUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +milvusClient.describeUser({username: 'user_1'})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1"​
    +}'​
    +
    +
    +

    以下是一個輸出範例。

    +
    {'user_name': 'user_1', 'roles': 'role_a'}​
    +
    +
    +

    撤銷角色

    您也可以撤銷指派給使用者的角色。

    +

    下面的示例演示了如何撤銷分配給用戶role_a 的角色user_1

    + +
    from pymilvus import MilvusClient​
    +​
    +client.revoke_role(​
    +    user_name='user_1',​
    +    role_name='role_a'​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RevokeRoleReq;​
    +​
    +client.revokeRole(RevokeRoleReq.builder()​
    +        .userName("user_1")​
    +        .roleName("role_a")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/revoke_role" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.json b/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.json new file mode 100644 index 000000000..16a86f25c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.json @@ -0,0 +1 @@ +{"codeList":["rootCoord:\n maxGeneralCapacity: 65536\n","60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960\n","failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:\n"],"headingContent":"Limit Collection Counts","anchorList":[{"label":"限制收藏集數量","href":"Limit-Collection-Counts","type":1,"isActive":false},{"label":"組態選項","href":"Configuration-options","type":2,"isActive":false},{"label":"計算收藏集數量","href":"Calculating-the-number-of-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.md b/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.md new file mode 100644 index 000000000..b100b0033 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/limit_collection_counts.md @@ -0,0 +1,72 @@ +--- +id: limit_collection_counts.md +title: 設定收集數量限制 +--- +

    限制收藏集數量

    一個 Milvus 實例最多允許 65,536 個集合。但是,過多的收藏集可能會導致性能問題。因此,建議限制在 Milvus 實例中建立的收藏集數量。

    +

    本指南說明如何設定 Milvus 範例中的收藏集數量限制。

    +

    設定會因您安裝 Milvus 實例的方式而異。

    +
      +
    • 對於使用 Helm Charts 安裝的 Milvus 實例

      +

      將設定加入values.yaml 檔案的config 部分。詳情請參閱使用 Helm Charts 設定 Milvus

    • +
    • 對於使用 Docker Compose 安裝的 Milvus 實體

      +

      將配置新增到您用來啟動 Milvus 實例的milvus.yaml 檔案。如需詳細資訊,請參閱使用 Docker Compose 配置 Milvus

    • +
    • 對於使用 Operator 安裝的 Milvus 實例

      +

      將配置新增到Milvus 自訂資源的spec.components 區段。如需詳細資訊,請參閱使用 Operator 配置 Milvus

    • +
    +

    組態選項

    rootCoord:
    +    maxGeneralCapacity: 65536
    +
    +

    maxGeneralCapacity 參數設定目前 Milvus 實體可持有的最大集合數量。預設值為65536

    +

    計算收藏集數量

    在一個集合中,您可以設定多個分片和分區。分片是用於在多個資料節點之間分配資料寫入作業的邏輯單位。分區是邏輯單位,用於透過僅載入集合資料的子集來提高資料擷取效率。計算當前 Milvus 實例中的集合數量時,您還需要計算分片和分區。

    +

    例如,假設您已經建立了100 個集合,其中60 個集合有2個分塊和4 個分區,其餘40 個集合有1個分塊和12 個分區。集合單元的總數(計算方式為shards × partitions )可如下確定:

    +
    60 (collections) x 2 (shards) x 4 (partitions) + 40 (collections) x 1 (shard) x 12 (partitions) = 960
    +
    +

    在此範例中,計算出的 960 個集合單位總數代表目前的使用量。maxGeneralCapacity 定義了實體可支援的最大集合單位數量,預設值為65536 。這表示該實體最多可容納 65,536 個收集單元。如果總數超過此限制,系統會顯示以下錯誤訊息:

    +
    failed checking constraint: sum_collections(parition*shard) exceeding the max general capacity:
    +
    +

    若要避免此錯誤訊息,您可以減少現有或新集合中的分片或分割數量、刪除某些集合,或增加maxGeneralCapacity 值。

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.json new file mode 100644 index 000000000..70ecf54c8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: {}\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: milvus\nspec:\n dependencies: \n msgStreamType: 'natsmq'\n natsmq:\n # server side configuration for natsmq.\n server: \n # 4222 by default, Port for nats server listening.\n port: 4222 \n # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.\n storeDir: /var/lib/milvus/nats \n # (B) 16GB by default, Maximum size of the 'file' storage.\n maxFileStore: 17179869184 \n # (B) 8MB by default, Maximum number of bytes in a message payload.\n maxPayload: 8388608 \n # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.\n maxPending: 67108864 \n # (√ms) 4s by default, waiting for initialization of natsmq finished.\n initializeTimeout: 4000 \n monitor:\n # false by default, If true enable debug log messages.\n debug: false \n # true by default, If set to false, log without timestamps.\n logTime: true \n # no log file by default, Log file path relative to.. .\n logFile: \n # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.\n logSizeLimit: 0 \n retention:\n # (min) 3 days by default, Maximum age of any message in the P-channel.\n maxAge: 4320 \n # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.\n maxBytes:\n # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit. \n maxMsgs: \n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n pulsar: # Optional\n # Whether (=true) to use an existed external pulsar as specified in the field endpoints or \n # (=false) create a new pulsar inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external pulsar endpoints if external=true\n endpoints:\n - 192.168.1.1:6650\n components: {}\n config: {} \n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n pulsar:\n inCluster:\n values:\n components:\n autorecovery: false\n zookeeper:\n replicaCount: 1\n bookkeeper:\n replicaCount: 1\n resoureces:\n limit:\n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n broker:\n replicaCount: 1\n configData:\n ## Enable `autoSkipNonRecoverableData` since bookkeeper is running\n ## without persistence\n autoSkipNonRecoverableData: \"true\"\n managedLedgerDefaultEnsembleSize: \"1\"\n managedLedgerDefaultWriteQuorum: \"1\"\n managedLedgerDefaultAckQuorum: \"1\"\n proxy:\n replicaCount: 1\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n config:\n kafka:\n # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL \n securityProtocol: PLAINTEXT\n # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512\n saslMechanisms: PLAIN\n saslUsername: \"\"\n saslPassword: \"\"\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n msgStreamType: \"kafka\"\n kafka:\n external: true\n brokerList: \n - \"kafkaBrokerAddr1:9092\"\n - \"kafkaBrokerAddr2:9092\"\n # ...\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec: \n dependencies:\n msgStreamType: \"kafka\"\n kafka:\n inCluster: \n values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka\n components: {}\n config: {}\n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Message Storage with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 設定訊息儲存","href":"Configure-Message-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-begin","type":2,"isActive":false},{"label":"設定 RocksMQ","href":"Configure-RocksMQ","type":2,"isActive":false},{"label":"配置 NATS","href":"Configure-NATS","type":2,"isActive":false},{"label":"設定 Pulsar","href":"Configure-Pulsar","type":2,"isActive":false},{"label":"配置 Kafka","href":"Configure-Kafka","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.md new file mode 100644 index 000000000..1c231cb30 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/message_storage_operator.md @@ -0,0 +1,348 @@ +--- +id: message_storage_operator.md +title: 使用 Milvus Operator 設定訊息儲存 +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 學習如何使用 Milvus Operator 設定訊息儲存。 +--- +

    使用 Milvus Operator 設定訊息儲存

    Milvus 使用 RocksMQ、Pulsar 或 Kafka 來管理最近變更的日誌、輸出串流日誌,以及提供日誌訂閱。本主題介紹如何在使用 Milvus Operator 安裝 Milvus 時,設定訊息儲存的依賴性。如需詳細資訊,請參閱 Milvus Operator 套件庫中的Configure Message Storage with Milvus Operator

    +

    本主題假設您已部署 Milvus Operator。

    +
    請參閱部署 Milvus Operator以取得更多資訊。
    +

    您需要指定使用 Milvus Operator 啟動 Milvus 叢集的設定檔。

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    您只需編輯milvus_cluster_default.yaml 中的程式碼模板,即可設定第三方依賴。以下各節將分別介紹如何設定物件儲存、etcd 和 Pulsar。

    +

    開始之前

    下表顯示 Milvus 獨立模式和集群模式是否支援 RocksMQ、NATS、Pulsar 和 Kafka。

    + + + + + + + + +
    RocksMQNATSPulsar卡夫卡
    單機模式✔️✔️✔️✔️
    叢集模式✖️✖️✔️✔️
    +

    指定訊息儲存也有其他限制:

    +
      +
    • 一個 Milvus 實例只支援一個訊息儲存空間。然而,我們仍然向後相容為一個實例設定多個訊息儲存空間。優先順序如下:
        +
      • 獨立模式: RocksMQ (預設) > Pulsar > Kafka
      • +
      • 群集模式:Pulsar (預設) > Kafka
      • +
      • 為了向下相容性,2.3 中引入的 Nats 不參與這些優先順序規則。
      • +
    • +
    • 當 Milvus 系統在執行時,訊息儲存是無法改變的。
    • +
    • 僅支援 Kafka 2.x 或 3.x 版本。
    • +
    +

    設定 RocksMQ

    RocksMQ 是 Milvus 單機版的預設訊息儲存空間。

    +
    +

    目前,你只能透過 Milvus Operator 設定 RocksMQ 為 Milvus standalone 的訊息儲存空間。

    +
    +

    範例

    下面的例子配置了一個 RocksMQ 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: {}
    +  components: {}
    +  config: {}
    +
    +

    配置 NATS

    NATS 是 NATS 的另一個訊息儲存空間。

    +

    範例

    下面的示例配置了一个 NATS 服务。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: milvus
    +spec:
    +  dependencies: 
    +    msgStreamType: 'natsmq'
    +    natsmq:
    +      # server side configuration for natsmq.
    +      server: 
    +        # 4222 by default, Port for nats server listening.
    +        port: 4222 
    +        # /var/lib/milvus/nats by default, directory to use for JetStream storage of nats.
    +        storeDir: /var/lib/milvus/nats 
    +        # (B) 16GB by default, Maximum size of the 'file' storage.
    +        maxFileStore: 17179869184 
    +        # (B) 8MB by default, Maximum number of bytes in a message payload.
    +        maxPayload: 8388608 
    +        # (B) 64MB by default, Maximum number of bytes buffered for a connection applies to client connections.
    +        maxPending: 67108864 
    +        # (√ms) 4s by default, waiting for initialization of natsmq finished.
    +        initializeTimeout: 4000 
    +        monitor:
    +          # false by default, If true enable debug log messages.
    +          debug: false 
    +          # true by default, If set to false, log without timestamps.
    +          logTime: true 
    +          # no log file by default, Log file path relative to.. .
    +          logFile: 
    +          # (B) 0, unlimited by default, Size in bytes after the log file rolls over to a new one.
    +          logSizeLimit: 0 
    +        retention:
    +          # (min) 3 days by default, Maximum age of any message in the P-channel.
    +          maxAge: 4320 
    +          # (B) None by default, How many bytes the single P-channel may contain. Removing oldest messages if the P-channel exceeds this size.
    +          maxBytes:
    +          # None by default, How many message the single P-channel may contain. Removing oldest messages if the P-channel exceeds this limit.    
    +          maxMsgs: 
    +  components: {}
    +  config: {}
    +
    +

    要把消息存储从 RocksMQ 迁移到 NATS,请执行以下操作:

    +
      +
    1. 停止所有 DDL 操作。

    2. +
    3. 调用 FlushAll API,然后在 API 调用执行完毕后停止 Milvus。

    4. +
    5. msgStreamType 改為natsmq ,並在spec.dependencies.natsmq 中對 NATS 設定進行必要的修改。

    6. +
    7. 再次啟動 Milvus 並檢查是否:

      +
        +
      • 日誌中是否有讀取mqType=natsmq 的日誌項目。
      • +
      • spec.dependencies.natsmq.server.storeDir 中指定的目錄中是否存在名為jetstream 的目錄。
      • +
    8. +
    9. (可選)備份並清理 RocksMQ 儲存目錄中的資料檔案。

    10. +
    +
    +

    在 RocksMQ 和 NATS 之間做選擇?

    +

    RockMQ使用CGO與RocksDB互動,並自行管理記憶體,而內嵌在Milvus安裝中的純GO NATS則將記憶體管理委託給Go的垃圾收集器(GC)。

    +

    在資料封包小於 64 kb 的情況下,RocksDB 在記憶體使用量、CPU 使用量和回應時間上都比較優勝。另一方面,如果資料封包大於 64 kb,NATS 在有足夠記憶體和理想 GC 排程的情況下,在回應時間上表現優異。

    +

    目前,建議您僅在實驗中使用 NATS。

    +
    +

    設定 Pulsar

    Pulsar 管理最近變更的日誌、輸出串流日誌,並提供日誌訂閱。Milvus 獨立版和 Milvus 集群都支援配置 Pulsar 作訊息儲存。然而,使用 Milvus Operator,您只能設定 Pulsar 為 Milvus 叢集的訊息儲存。添加spec.dependencies.pulsar 下的必填欄位以配置 Pulsar。

    +

    pulsar 支援 和 。external inCluster

    +

    外部 Pulsar

    external 表示使用外部 Pulsar 服務。 用於設定外部 Pulsar 服務的欄位包括:

    +
      +
    • external: true 值表示 Milvus 使用外部 Pulsar 服務。
    • +
    • endpoints:Pulsar 的端點。
    • +
    +

    範例

    以下範例設定外部 Pulsar 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    pulsar: # Optional
    +      # Whether (=true) to use an existed external pulsar as specified in the field endpoints or 
    +      # (=false) create a new pulsar inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external pulsar endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:6650
    +  components: {}
    +  config: {}           
    +
    +

    內部 Pulsar

    inCluster 表示當 Milvus 集群啟動時,Pulsar 服務會在集群中自動啟動。

    +

    範例

    以下範例設定內部 Pulsar 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    pulsar:
    +      inCluster:
    +        values:
    +          components:
    +            autorecovery: false
    +          zookeeper:
    +            replicaCount: 1
    +          bookkeeper:
    +            replicaCount: 1
    +            resoureces:
    +              limit:
    +                cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +          broker:
    +            replicaCount: 1
    +            configData:
    +              ## Enable `autoSkipNonRecoverableData` since bookkeeper is running
    +              ## without persistence
    +              autoSkipNonRecoverableData: "true"
    +              managedLedgerDefaultEnsembleSize: "1"
    +              managedLedgerDefaultWriteQuorum: "1"
    +              managedLedgerDefaultAckQuorum: "1"
    +          proxy:
    +            replicaCount: 1
    +  components: {}
    +  config: {}            
    +
    +
    此範例指定 Pulsar 各元件的複製數量、Pulsar BookKeeper 的計算資源,以及其他配置。
    +
    values.yaml 中找到配置內部 Pulsar 服務的完整配置項目。如前面的範例所示,在pulsar.inCluster.values 下依需要加入設定項目。
    +

    假設設定檔名為milvuscluster.yaml ,執行下列指令套用設定。

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    配置 Kafka

    Pulsar 是 Milvus 叢集的預設訊息儲存空間。如果要使用 Kafka,請加入可選欄位msgStreamType 來設定 Kafka。

    +

    kafka 支援 和 。external inCluster

    +

    外部 Kafka

    external 表示使用外部 Kafka 服務。

    +

    用於設定外部 Kafka 服務的欄位包括

    +
      +
    • external:true 值表示 Milvus 使用外部 Kafka 服務。
    • +
    • brokerList:要將訊息傳送至的經紀人清單。
    • +
    +

    範例

    以下範例設定外部 Kafka 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  config:
    +    kafka:
    +      # securityProtocol supports: PLAINTEXT, SSL, SASL_PLAINTEXT, SASL_SSL 
    +      securityProtocol: PLAINTEXT
    +      # saslMechanisms supports: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512
    +      saslMechanisms: PLAIN
    +      saslUsername: ""
    +      saslPassword: ""
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    msgStreamType: "kafka"
    +    kafka:
    +      external: true
    +      brokerList: 
    +        - "kafkaBrokerAddr1:9092"
    +        - "kafkaBrokerAddr2:9092"
    +        # ...
    +
    +
    +

    操作員 v0.8.5 或更高版本支援 SASL 配置。

    +
    +

    內部 Kafka

    inCluster 表示當 Milvus 叢集啟動時,叢集中的 Kafka 服務會自動啟動。

    +

    範例

    以下範例設定內部 Kafka 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec: 
    +  dependencies:
    +    msgStreamType: "kafka"
    +    kafka:
    +      inCluster: 
    +        values: {} # values can be found in https://artifacthub.io/packages/helm/bitnami/kafka
    +  components: {}
    +  config: {}
    +
    +

    在這裡找到配置內部 Kafka 服務的完整配置項目。根據需要在kafka.inCluster.values 下添加配置項目。

    +

    假設配置檔名為milvuscluster.yaml ,執行下列指令套用配置。

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    下一步

    學習如何使用 Milvus Operator 配置其他 Milvus 依賴項目:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.json new file mode 100644 index 000000000..128080bc1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","kind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies: # Optional\n etcd: # Optional\n # Whether (=true) to use an existed external etcd as specified in the field endpoints or \n # (=false) create a new etcd inside the same kubernetes cluster for milvus.\n external: true # Optional default=false\n # The external etcd endpoints if external=true\n endpoints:\n - 192.168.1.1:2379\n components: {}\n config: {}\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n dependencies:\n etcd:\n inCluster:\n values:\n replicaCount: 5\n resources:\n limits: \n cpu: '4'\n memory: 8Gi\n requests:\n cpu: 200m\n memory: 512Mi\n components: {}\n config: {} \n","kubectl apply -f milvuscluster.yaml\n"],"headingContent":"Configure Meta Storage with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 設定元資料儲存","href":"Configure-Meta-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"設定 etcd","href":"Configure-etcd","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.md new file mode 100644 index 000000000..9326d0d02 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/meta_storage_operator.md @@ -0,0 +1,117 @@ +--- +id: meta_storage_operator.md +title: 使用 Milvus Operator 設定元資料儲存 +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 學習如何使用 Milvus Operator 設定元儲存。 +--- +

    使用 Milvus Operator 設定元資料儲存

    Milvus 使用 etcd 來儲存元資料。本主題介紹當安裝 Milvus 與 Milvus Operator 時,如何設定 meta 儲存的依賴性。如需詳細資訊,請參閱 Milvus Operator 套件庫中的Configure Meta Storage with MilvusOperator。

    +

    本主題假設您已部署 Milvus Operator。

    +
    請參閱部署 Milvus Operator以取得更多資訊。
    +

    您需要指定使用 Milvus Operator 啟動 Milvus 叢集的設定檔。

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    您只需編輯milvus_cluster_default.yaml 中的程式碼模板,即可設定第三方依賴。以下各節將分別介紹如何設定物件儲存、etcd 和 Pulsar。

    +

    設定 etcd

    spec.dependencies.etcd 下新增必填欄位,以設定 etcd。

    +

    etcd 支持 和 。external inCluster

    +

    用於配置外部 etcd 服務的欄位包括:

    +
      +
    • external:true 值表示 Milvus 使用外部 etcd 服務。
    • +
    • endpoints:etcd 的端點。
    • +
    +

    外部 etcd

    範例

    下面的示例配置了外部 etcd 服務。

    +
    kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies: # Optional
    +    etcd: # Optional
    +      # Whether (=true) to use an existed external etcd as specified in the field endpoints or 
    +      # (=false) create a new etcd inside the same kubernetes cluster for milvus.
    +      external: true # Optional default=false
    +      # The external etcd endpoints if external=true
    +      endpoints:
    +      - 192.168.1.1:2379
    +  components: {}
    +  config: {}
    +
    +

    內部 etcd

    inCluster 表示當 Milvus 集群啟動時,etcd 服務會在集群中自動啟動。

    +

    範例

    下面的示例配置了內部 etcd 服務。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  dependencies:
    +    etcd:
    +      inCluster:
    +        values:
    +          replicaCount: 5
    +          resources:
    +            limits: 
    +              cpu: '4'
    +              memory: 8Gi
    +            requests:
    +              cpu: 200m
    +              memory: 512Mi
    +  components: {}
    +  config: {}              
    +
    +
    前面的示例指定了副本的數量為5 ,並限制了 etcd 的計算資源。
    +
    values.yaml 中查找配置内部 etcd 服务的完整配置项。如上例所示,在etcd.inCluster.values 下按需要添加配置项。
    +

    假設配置檔名為milvuscluster.yaml ,執行下列指令套用配置。

    +
    kubectl apply -f milvuscluster.yaml
    +
    +

    下一步

    學習如何使用 Milvus Operator 配置其他 Milvus 相依性:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.json new file mode 100644 index 000000000..578335aa4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Create an Alert for Milvus Services","anchorList":[{"label":"為 Milvus 服務建立警報","href":"Create-an-Alert-for-Milvus-Services","type":1,"isActive":false},{"label":"建立警報的情況","href":"Scenarios-for-creating-alerts","type":2,"isActive":false},{"label":"設定警報","href":"Set-up-alerts","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.md new file mode 100644 index 000000000..c63cdbdd1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/alert.md @@ -0,0 +1,132 @@ +--- +id: alert.md +title: 建立警報 +related_key: monitor and alert. +summary: 瞭解如何在 Grafana 中為 Milvus 服務建立警示。 +--- +

    為 Milvus 服務建立警報

    本主題介紹 Milvus 服務的警示機制,並解釋為何、何時及如何在 Milvus 中建立警示。

    +

    透過建立警示,當特定指標的值超過您預先定義的臨界值時,您可以收到通知。

    +

    例如,您創建一個警報,並設定 80 MB 為 Milvus 元件記憶體使用的最大值。如果實際使用量超過預先定義的數字,您將收到警報,提醒您 Milvus 元件的記憶體使用量超過 80 MB。收到警報後,您可以相應地及時調整資源分配,以確保服務的可用性。

    +

    建立警報的情況

    以下是一些您需要建立警報的常見情況。

    +
      +
    • Milvus 元件的 CPU 或記憶體使用率過高。
    • +
    • Milvus 元件 pod 的磁碟空間不足。
    • +
    • Milvus 元件 pod 重新啟動的頻率太高。
    • +
    +

    下列指標可用於警示設定:

    + + + + + + + + + + + +
    公制說明測量單位
    CPU 使用量Milvus 元件的 CPU 使用量,由 CPU 的運行時間顯示。
    記憶體Milvus 元件消耗的記憶體資源。MB
    動畫在 GO 語言中同時執行的活動。/
    作業系統線程線程或作業系統中的輕量級進程。/
    已開啟的進程檔案目前使用的檔案描述符數量。/
    +

    設定警報

    本指南以建立 Milvus 元件記憶體使用警示為例。若要建立其他類型的警示,請相應調整您的指令。如果您在過程中遇到任何問題,請隨時到Milvus 論壇詢問或在Slack 上啟動討論。

    +

    先決條件

    本教學假設您已安裝和設定 Grafana。如果沒有,建議閱讀監控指南

    +

    1.新增查詢

    要為 Milvus 元件的記憶體使用量新增警示,請編輯記憶體面板。然後,新增一個包含 metric 的新查詢:process_resident_memory_bytes{app_kubernetes_io_name="milvus", app_kubernetes_io_instance=~"my-release", namespace="default"}

    +

    + + Alert_metric + Alert_metric

    +

    2.儲存儀表板

    儲存儀表板,等待幾分鐘就可以看到警示。

    +

    + + Alert_dashboard + 警報儀表板

    +

    Grafana 警報查詢不支援範本變數。因此,您應該在標籤中加入第二個不含任何範本變數的查詢。第二個查詢預設命名為「A」。您可以按一下下拉式選單來重新命名。

    +

    + + Alert_query + 警報查詢

    +

    3.新增警示通知

    若要接收警示通知,請新增「通知頻道」。然後,在欄位「傳送至」中指定頻道。

    +

    + + Alert_notification + 警報通知

    +

    如果成功建立並觸發警報,您會收到如下截圖所示的通知。

    +

    + + Notification_message + 通知訊息

    +

    若要刪除警報,請移至「警報」面板,然後按一下刪除按鈕。

    +

    + + Delete_alert + 刪除警報

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.json new file mode 100644 index 000000000..5c529ca01 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.json @@ -0,0 +1 @@ +{"codeList":["helm repo add grafana https://grafana.github.io/helm-charts\nhelm repo update\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n\nminio:\n enabled: true\n","loki:\n commonConfig:\n replication_factor: 1\n auth_enabled: false\n storage:\n bucketNames:\n chunks: loki-chunks\n ruler: loki-ruler\n admin: loki-admin\n type: 's3'\n s3:\n endpoint: s3.us-west-2.amazonaws.com\n region: us-west-2\n secretAccessKey: \n accessKeyId: \n","kubectl create ns loki\nhelm install --values loki.yaml loki grafana/loki -n loki\n","config:\n clients:\n - url: http://loki-gateway/loki/api/v1/push\n","helm install --values promtail.yaml promtail grafana/promtail -n loki\n","kubectl create ns monitoring\nhelm install my-grafana grafana/grafana --namespace monitoring\n","kubectl get secret --namespace monitoring my-grafana -o jsonpath=\"{.data.admin-password}\" | base64 --decode ; echo\n","export POD_NAME=$(kubectl get pods --namespace monitoring -l \"app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana\" -o jsonpath=\"{.items[0].metadata.name}\")\nkubectl --namespace monitoring port-forward $POD_NAME 3000\n"],"headingContent":"Configure Grafana Loki","anchorList":[{"label":"配置 Grafana Loki","href":"Configure-Grafana-Loki","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"部署 Loki","href":"Deploy-Loki","type":2,"isActive":false},{"label":"部署 Promtail","href":"Deploy-Promtail","type":2,"isActive":false},{"label":"使用 Grafana 查詢日誌","href":"Query-Logs-with-Grafana","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.md new file mode 100644 index 000000000..8b2b9ee0a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/configure_grafana_loki.md @@ -0,0 +1,172 @@ +--- +id: configure_grafana_loki.md +title: 配置 Grafana Loki +summary: 本主題說明如何使用 Loki 收集日誌,並使用 Grafana 查詢 Milvus 叢集的日誌。 +--- +

    配置 Grafana Loki

    本指南說明如何設定 Loki 以收集日誌,以及設定 Grafana 以查詢和顯示 Milvus 叢集的日誌。

    +

    在本指南中,您將學習如何

    +
      +
    • 使用 Helm 在 Milvus 叢集上部署LokiPromtail
    • +
    • 為 Loki 配置物件儲存。
    • +
    • 使用 Grafana 查詢日誌。
    • +
    +

    先決條件

    +

    部署 Loki

    Loki 是受 Prometheus 啟發的日誌聚合系統。使用 Helm 部署 Loki,從您的 Milvus 叢集收集日誌。

    +

    1.新增 Grafana 的 Helm 圖表儲存庫

    將 Grafana 的圖表儲存庫加入 Helm 並更新:

    +
    helm repo add grafana https://grafana.github.io/helm-charts
    +helm repo update
    +
    +

    2.為 Loki 設定物件儲存

    選擇下列其中一個儲存選項,並建立loki.yaml 配置檔案:

    +
      +
    • 選項 1:使用 MinIO 儲存

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +
      +minio:
      +  enabled: true
      +
    • +
    • 選項 2:使用 AWS S3 儲存

      +

      在以下範例中,請將<accessKey><keyId> 替換為您自己的 S3 存取金鑰和 ID,s3.endpoint 替換為 S3 端點,s3.region 替換為 S3 區域。

      +
      loki:
      +  commonConfig:
      +    replication_factor: 1
      +  auth_enabled: false
      +  storage:
      +    bucketNames:
      +      chunks: loki-chunks
      +      ruler: loki-ruler
      +      admin: loki-admin
      +    type: 's3'
      +    s3:
      +      endpoint: s3.us-west-2.amazonaws.com
      +      region: us-west-2
      +      secretAccessKey: <accessKey>
      +      accessKeyId: <keyId>
      +
    • +
    +

    3.安裝 Loki

    執行下列指令來安裝 Loki:

    +
    kubectl create ns loki
    +helm install --values loki.yaml loki grafana/loki -n loki
    +
    +

    部署 Promtail

    Promtail 是 Loki 的日誌收集代理。它從 Milvus pod 讀取日誌,並將它們傳送至 Loki。

    +

    1.建立 Promtail 組態

    建立promtail.yaml 配置檔案:

    +
    config:
    +  clients:
    +    - url: http://loki-gateway/loki/api/v1/push
    +
    +

    2.安裝 Promtail

    使用 Helm 安裝 Promtail:

    +
    helm install  --values promtail.yaml promtail grafana/promtail -n loki
    +
    +

    使用 Grafana 查詢日誌

    部署 Grafana 並將其設定為連線至 Loki 以查詢記錄。

    +

    1.部署 Grafana

    使用下列指令安裝 Grafana:

    +
    kubectl create ns monitoring
    +helm install my-grafana grafana/grafana --namespace monitoring
    +
    +

    在存取 Grafana 之前,您需要擷取admin 密碼:

    +
    kubectl get secret --namespace monitoring my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
    +
    +

    然後,將 Grafana 連接埠轉送至您的本機:

    +
    export POD_NAME=$(kubectl get pods --namespace monitoring -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana" -o jsonpath="{.items[0].metadata.name}")
    +kubectl --namespace monitoring port-forward $POD_NAME 3000
    +
    +

    2.在 Grafana 中將 Loki 新增為資料來源

    一旦 Grafana 開始執行,您就需要將 Loki 新增為資料來源,以便查詢日誌。

    +
      +
    1. 打開 Web 瀏覽器並導航至127.0.0.1:3000 。使用之前獲得的用戶名admin 和密碼登錄。
    2. +
    3. 在左側功能表中,選擇連線>新增連線
    4. +
    5. 在出現的頁面中,選擇Loki作為資料來源類型。您可以在搜尋列中輸入loki來尋找資料來源。
    6. +
    7. 在 Loki 資料來源設定中,指定名稱URL,然後按一下儲存與測試
    8. +
    +

    + + DataSource + 資料來源

    +

    3.查詢 Milvus 日誌

    將 Loki 新增為資料來源後,在 Grafana 中查詢 Milvus 日誌:

    +
      +
    1. 在左側功能表中,按一下探索
    2. +
    3. 在頁面左上角,選擇 loki 資料來源。
    4. +
    5. 使用標籤瀏覽器選擇標籤並查詢日誌。
    6. +
    +

    + + Query + 查詢

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.json new file mode 100644 index 000000000..cc977d207 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Metrics Dashboard","anchorList":[{"label":"Milvus 指標儀表板","href":"Milvus-Metrics-Dashboard","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.md new file mode 100644 index 000000000..8b8a5299b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/metrics_dashboard.md @@ -0,0 +1,196 @@ +--- +id: metrics_dashboard.md +title: Milvus 指標儀表板 +summary: 本主題介紹 Milvus Dashboard 中顯示的監控指標。 +--- +

    Milvus 指標儀表板

    Milvus 會在執行期間輸出詳細的時間序列指標清單。您可以使用PrometheusGrafana來視覺化這些指標。本主題介紹 Grafana Milvus Dashboard 中顯示的監控指標。

    +

    本主題中的時間單位為毫秒。而本主題中的「第 99 百分位數」是指 99% 的時間統計都控制在某個數值之內。

    +

    我們建議先閱讀Milvus 監控框架概述,以瞭解 Prometheus 的度量指標。

    +

    代理

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 公制Milvus 測量指標說明
    查詢向量計數率過去兩分鐘內,每個代理每秒查詢的向量平均數。sum(increase(milvus_proxy_search_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_search_vectors_count累積查詢的向量數量。
    插入向量計數率過去兩分鐘內,每個代理平均每秒插入的向量數量。sum(increase(milvus_proxy_insert_vectors_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_proxy_insert_vectors_count插入向量的累積數量。
    搜尋延遲過去兩分鐘內,每個代理伺服器接收搜尋與查詢要求的平均延遲時間,以及延遲時間的第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_latency搜尋與查詢要求的延遲時間。
    集合搜尋延遲每個代理在過去兩分鐘內接收特定資料集的搜尋和查詢請求的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    AVG:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sum搜尋和查詢要求到特定集合的延遲時間
    突變延遲過去兩分鐘內每個代理接收突變請求的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_mutation_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_latency_sum突變請求的延遲時間。
    收集突變延遲每個代理在過去兩分鐘內接收到特定集合的突變請求的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_collection_sq_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])))
    AVG:
    sum(increase(milvus_proxy_collection_sq_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_collection_sq_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", collection_name=~"$collection"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_collection_sq_latency_sum對特定集合提出突變請求的延遲時間
    等待搜尋結果的延遲代理在過去兩分鐘內傳送搜尋和查詢請求與接收結果之間的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_wait_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_sq_wait_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_wait_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_wait_result_latency傳送搜尋和查詢要求與接收結果之間的延遲。
    減少搜尋結果延遲在過去兩分鐘內,透過代理匯集搜尋和查詢結果的平均延遲時間和第 99 百分位數的延遲時間。P99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_reduce_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_proxy_sq_reduce_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_reduce_result_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_reduce_result_latency每個查詢節點彙總搜尋與查詢結果的延遲時間。
    解碼搜尋結果的延遲在過去兩分鐘內,由代理解碼搜尋和查詢結果的平均延遲時間和第 99 百分位數的延遲時間。P99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_proxy_sq_decode_result_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_proxy_sq_decode_result_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type) / sum(increase(milvus_proxy_sq_decode_resultlatency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, query_type)
    milvus_proxy_sq_decode_result_latency解碼每個搜尋與查詢結果的延遲時間。
    Msg Stream Object Num過去兩分鐘內,每個代理在其對應的實體主題上建立的 msgstream 物件的平均、最大及最小數量。avg(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_msgstream_obj_num在每個實體主題上建立的 msgstream 物件數量。
    突發傳送延遲每個代理伺服器在過去兩分鐘內傳送插入或刪除請求的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, msg_type, pod, node_id) (rate(milvus_proxy_mutation_send_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_proxy_mutation_send_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type) / sum(increase(milvus_proxy_mutation_send_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, msg_type)
    milvus_proxy_mutation_send_latency傳送插入或刪除請求的延遲時間。
    快取記憶體命中率過去兩分鐘內,包括GeCollectionIDGetCollectionInfoGetCollectionSchema 在內的每秒平均快取記憶體命中率。sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", cache_state="hit"}[2m])/120) by(cache_name, pod, node_id) / sum(increase(milvus_proxy_cache_hit_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(cache_name, pod, node_id)milvus_proxy_cache_hit_count每個快取記憶體讀取作業的命中率和失敗率統計。
    快取更新延遲過去兩分鐘內,各代理的快取更新平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_cache_update_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_proxy_cache_update_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_cache_update_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_cache_update_latency每次更新快取記憶體的延遲時間。
    同步時間每個代理伺服器在其對應的實體通道中同步的平均、最大和最小時間。avg(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_proxy_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_proxy_sync_epoch_time每個實體通道的 epoch time (Unix 時間,自 1970 年 1 月 1 日起經過的毫秒數)。
    除了實體通道之外,還有預設的ChannelName
    套用 PK 延遲過去兩分鐘內每個代理的平均延遲時間和主索引鍵應用延遲時間的第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_pk_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_pk_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_pk_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_pk_latency應用主索引鍵的延遲。
    套用時間戳延遲過去兩分鐘內,每個代理伺服器應用 Timestamp 應用延遲的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_proxy_apply_timestamp_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_apply_timestamp_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id) / sum(increase(milvus_proxy_apply_timestamp_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id)
    milvus_proxy_apply_timestamp_latency套用時間戳的延遲。
    請求成功率每個代理每秒收到的成功請求數目,每個請求類型的詳細明細。可能的請求類型包括 DescribeCollection、DescribeIndex、GetCollectionStatistics、HasCollection、Search、Query、ShowPartitions、Insert 等。
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="success"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_count所有類型的接收要求數量
    請求失敗率每個代理每秒收到的失敗請求數目,並詳細列出每種請求類型。可能的請求類型有:DescribeCollection、DescribeIndex、GetCollectionStatistics、HasCollection、Search、Query、ShowPartitions、Insert 等。
    sum(increase(milvus_proxy_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace", status="fail"}[2m])/120) by(function_name, pod, node_id)milvus_proxy_req_count所有類型的接收要求數量
    請求延遲每個代理接收所有類型要求的平均延遲時間和第 99 百分位數p99:
    histogram_quantile(0.99, sum by (le, pod, node_id, function_name) (rate(milvus_proxy_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_proxy_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name) / sum(increase(milvus_proxy_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (pod, node_id, function_name)
    milvus_proxy_req_latency所有類型接收請求的延遲
    插入/刪除要求位元組率代理伺服器在過去兩分鐘內每秒收到的插入和刪除請求的位元組數量。sum(increase(milvus_proxy_receive_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_receive_bytes_count插入和刪除請求的計數。
    傳送位元組率每個代理伺服器在過去兩分鐘內回應搜尋和查詢要求時,每秒傳回給用戶端的位元組數量。sum(increase(milvus_proxy_send_bytes_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by(pod, node_id)milvus_proxy_send_bytes_count每個代理伺服器回應搜尋和查詢要求時,傳回給用戶端的位元組數量。
    +

    +

    根協調者

    + + + + + + + + + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 公制描述
    代理節點數建立的代理數目。sum(milvus_rootcoord_proxy_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_proxy_num代理的數量。
    同步時間每個實體通道 (PChannel) 中每個根協定同步的平均、最大和最小歷時。avg(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_rootcoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_sync_epoch_time每個實體通道的 epoch time (Unix 時間,自 1970 年 1 月 1 日起經過的毫秒數)。
    DDL 請求率過去兩分鐘內每秒 DDL 請求的狀態和次數。sum(increase(milvus_rootcoord_ddl_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, function_name)milvus_rootcoord_ddl_req_countDDL 請求的總數,包括CreateCollection,DescribeCollection,DescribeSegments,HasCollection,ShowCollections,ShowPartitions, 和ShowSegments
    DDL 請求延遲過去兩分鐘內 DDL 請求延遲的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, function_name) (rate(milvus_rootcoord_ddl_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_rootcoord_ddl_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name) / sum(increase(milvus_rootcoord_ddl_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by (function_name)
    milvus_rootcoord_ddl_req_latency所有類型 DDL 請求的延遲。
    同步計時延遲過去兩分鐘內,root coord 將所有時間戳記同步至 PChannel 所使用時間的平均延遲和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_rootcoord_sync_timetick_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_rootcoord_sync_timetick_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_rootcoord_sync_timetick_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_rootcoord_sync_timetick_latency根協調同步所有時間戳記到 PChannel 所使用的時間。
    ID 分配率過去兩分鐘內,每秒由 root coord 指派的 ID 數量。sum(increase(milvus_rootcoord_id_alloc_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120)milvus_rootcoord_id_alloc_count根目錄分配的 ID 累積數量。
    時間戳記根目錄的最新時間戳記。milvus_rootcoord_timestamp{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestamp根目錄的最新時間戳記。
    儲存的時間戳記根目錄儲存於元儲存的預先指定時間戳記。milvus_rootcoord_timestamp_saved{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}milvus_rootcoord_timestamp_saved根目錄儲存於元儲存的預先指定時間戳記。
    時間戳提前 3 秒指定。時間戳每 50 毫秒更新一次,並儲存在元儲存器中。
    集合總數集合的總數。sum(milvus_rootcoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_collection_num目前 Milvus 中存在的集合總數。
    分區數目分區的總數。sum(milvus_rootcoord_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_partition_num目前 Milvus 中存在的分區總數。
    DML 通道數目DML 通道的總數。sum(milvus_rootcoord_dml_channel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_dml_channel_num目前 Milvus 中存在的 DML 通道總數。
    訊息流總數msgstreams 的總數。sum(milvus_rootcoord_msgstream_obj_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_msgstream_obj_numMilvus 目前的 msgstreams 總數。
    憑證總數憑證總數。sum(milvus_rootcoord_credential_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_credential_numMilvus 目前的憑證總數。
    時間延遲所有資料節點和查詢節點上流量圖的最大時間延遲總和。sum(milvus_rootcoord_time_tick_delay{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_rootcoord_time_tick_delay每個 DataNode 和 QueryNode 上流量圖的最大時間刻度延遲。
    +

    +

    查詢協調器

    + + + + + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 公制描述
    已載入的集合數目目前載入記憶體的集合數量。sum(milvus_querycoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_collection_numMilvus 目前載入的集合數量。
    已載入的實體數目目前載入記憶體的實體數量。sum(milvus_querycoord_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_entitiy_numMilvus 目前載入的實體數量。
    載入要求率過去兩分鐘內每秒載入要求的次數。sum(increase(milvus_querycoord_load_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])120) by (status)milvus_querycoord_load_req_count累積的載入要求數量。
    釋放要求率過去兩分鐘內每秒釋放要求的數量。sum(increase(milvus_querycoord_release_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_querycoord_release_req_count釋放要求的累積數目。
    負載要求延遲過去兩分鐘內負載要求延遲的平均延遲和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_load_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querycoord_load_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_load_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_load_latency完成負載請求所用的時間。
    釋放請求延遲過去兩分鐘內釋放要求延遲的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_release_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querycoord_release_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_release_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m]))
    milvus_querycoord_release_latency完成釋放要求所用的時間。
    次負載任務次負載任務的數量。sum(milvus_querycoord_child_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_child_task_num子負載任務的數量。
    查詢協定會將負載請求分割為多個子負載任務。
    父載入任務父載入任務的數量。sum(milvus_querycoord_parent_task_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_parent_task_num子負載任務的數量。
    每個負載請求對應任務佇列中的父任務。
    子負載任務延遲子負載任務在過去兩分鐘內的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le) (rate(milvus_querycoord_child_task_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querycoord_child_task_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) / sum(increase(milvus_querycoord_child_task_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) namespace"}[2m])))
    milvus_querycoord_child_task_latency完成次負載任務的延遲時間。
    查詢節點數查詢協調器管理的查詢節點數目。sum(milvus_querycoord_querynode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_querycoord_querynode_num查詢協調器管理的查詢節點數。
    +

    +

    查詢節點

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 測量指標說明
    載入的集合數目每個查詢節點載入記憶體的集合數量。sum(milvus_querynode_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_collection_num每個查詢節點載入的集合數量。
    載入的分割數目每個查詢節點載入記憶體的分割數目。sum(milvus_querynode_partition_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_partition_num每個查詢節點載入的分割數目。
    載入的區段數目每個查詢節點載入記憶體的區段數目。sum(milvus_querynode_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_segment_num每個查詢節點載入的區段數目。
    可查詢的實體數目每個查詢節點上可查詢及可搜尋的實體數目。sum(milvus_querynode_entity_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_entity_num每個查詢節點上可查詢及可搜尋的實體數目。
    DML 虛擬通道每個查詢節點監視的 DML 虛擬通道數量。sum(milvus_querynode_dml_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_dml_vchannel_num每個查詢節點監視的 DML 虛擬通道數量。
    Delta 虛擬通道每個查詢節點監視的 delta 通道數量。sum(milvus_querynode_delta_vchannel_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_delta_vchannel_num每個查詢節點所看管的 delta 通道數量。
    消費者數目每個查詢節點的 Consumer 數量。sum(milvus_querynode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_consumer_num每個查詢節點中的消費者數量。
    搜尋要求率每個查詢節點每秒收到的搜尋和查詢請求總數,以及過去兩分鐘內成功搜尋和查詢請求的數目。sum(increase(milvus_querynode_sq_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (query_type, status, pod, node_id)milvus_querynode_sq_req_count累積的搜尋與查詢請求次數。
    搜尋要求延遲每個查詢節點在過去兩分鐘內搜尋和查詢請求所用時間的平均延遲時間和第 99 百分位數。
    此面板顯示狀態為 「成功 」或 「總計 」的搜尋和查詢請求的延遲時間。
    P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_sq_req_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_sq_req_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_req_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_req_latency查詢節點的搜尋要求延遲。
    搜尋在佇列中的延遲過去兩分鐘內佇列中的搜尋與查詢請求的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_queue_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_sq_queue_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_queue_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_queue_latency查詢節點收到的搜尋和查詢請求的延遲時間。
    搜尋段延遲每個查詢節點在過去兩分鐘內搜尋和查詢網段所花時間的平均延遲時間和第 99 百分位數。
    區段的狀態可以是封閉或成長。
    p99:
    histogram_quantile(0.99, sum by (le, query_type, segment_state, pod, node_id) (rate(milvus_querynode_sq_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_sq_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state) / sum(increase(milvus_querynode_sq_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type, segment_state)
    milvus_querynode_sq_segment_latency每個查詢節點搜尋和查詢每個區段所花的時間。
    Segcore 請求延遲過去兩分鐘內,每個查詢節點在 segcore 中搜尋和查詢所花時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, query_type, pod, node_id) (rate(milvus_querynode_sq_core_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_sq_core_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_core_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_core_latency每個查詢節點在 segcore 中搜尋與查詢所花費的時間。
    搜尋縮短延遲過去兩分鐘內,每個查詢節點在搜尋或查詢的還原階段所用時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id, query_type) (rate(milvus_querynode_sq_reduce_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_sq_reduce_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type) / sum(increase(milvus_querynode_sq_reduce_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id, query_type)
    milvus_querynode_sq_reduce_latency每個查詢在 reduce 階段所花費的時間。
    負載分段延遲每個查詢節點在過去兩分鐘內載入一個區段所花時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_load_segment_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_load_segment_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_load_segment_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket每個查詢節點載入一個區段所花的時間。
    流程圖數每個查詢節點中的 flowgraph 數量。sum(milvus_querynode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_flowgraph_num每個查詢節點中的 flowgraph 數量。
    未解決的讀取任務長度每個查詢節點中未解決的讀取要求佇列的長度。sum(milvus_querynode_read_task_unsolved_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_unsolved_len未解決的讀取要求佇列的長度。
    就緒讀取任務長度每個查詢節點中待執行讀取請求佇列的長度。sum(milvus_querynode_read_task_ready_len{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_ready_len待執行讀取請求佇列的長度。
    並行讀取任務數每個查詢節點目前執行的並行讀取請求數目。sum(milvus_querynode_read_task_concurrency{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_read_task_concurrency目前執行的並行讀取請求數目。
    估計 CPU 使用量排程器估計每個查詢節點的 CPU 使用量。sum(milvus_querynode_estimate_cpu_usage{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_querynode_estimate_cpu_usage排程器估計每個查詢節點的 CPU 使用量。
    當值為 100 時,表示使用了整個虛擬 CPU (vCPU)。
    搜尋群大小過去兩分鐘內搜尋群大小 (即每個查詢節點執行的合併搜尋請求中原始搜尋請求的總數) 的平均數和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket來自不同資料桶的合併搜尋任務中的原始搜尋任務數目(即搜尋群組大小)。
    搜尋 NQ每個查詢節點在過去兩分鐘內執行搜尋要求時,所完成查詢次數 (NQ) 的平均值和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_size_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_search_group_size_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_size_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket搜尋要求的查詢次數 (NQ)。
    搜尋群組 NQ每個查詢節點在過去兩分鐘內合併執行的搜尋要求 NQ 的平均數和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_nq_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_querynode_search_group_nq_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_nq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket來自不同資料桶的合併搜尋要求 NQ。
    搜尋 Top_K每個查詢節點在過去兩分鐘內執行的Top_K 搜尋要求的平均數和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket搜尋要求的Top_K
    搜尋群組 Top_K過去兩分鐘內,每個查詢節點合計執行的Top_K 搜尋請求的平均數和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_querynode_search_group_topk_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_querynode_search_group_topk_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_querynode_search_group_topk_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_querynode_load_segment_latency_bucket從不同資料桶合併的搜尋要求的Top_K
    驅逐讀取請求率過去兩分鐘內,每個查詢節點每秒驅逐的讀取要求數目。sum(increase(milvus_querynode_read_evicted_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_querynode_sq_req_count查詢節點因流量限制而驅逐的讀取要求累計數。
    +

    +

    資料協調器

    + + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 測量指標說明
    資料節點數由 data coord. 管理的資料節點數目。sum(milvus_datacoord_datanode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_datanode_num由資料協調員管理的資料節點數目。
    段數 Num由 data coord 記錄在 metadata 中的所有類型段落的數量。sum(milvus_datacoord_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (segment_state)milvus_datacoord_segment_num由資料協調員記錄在元資料中的所有類型段落的數量。
    區段類型包括:掉落、刷新、沖洗、成長和封存。
    集合數依據資料坐標在元資料中記錄的集合數量。sum(milvus_datacoord_collection_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_collection_num按資料坐標在 metadata 中記錄的集合數目。
    儲存的行數資料坐標中有效和已沖洗資料的累積行數。sum(milvus_datacoord_stored_rows_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_rows_num資料坐標中有效和已刷新資料的累積行數。
    儲存行數比率過去兩分鐘內每秒刷新的平均行數。sum(increase(milvus_datacoord_stored_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (pod, node_id)milvus_datacoord_stored_rows_count資料坐標刷新的累積行數。
    同步時間資料協調器在每個實體通道同步的平均、最大和最小歷時。avg(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) max(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance) min(milvus_datacoord_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_sync_epoch_time每個實體通道的 epoch time (Unix 時間,自 1970 年 1 月 1 日起經過的毫秒數)。
    儲存的 binlog 大小儲存的 binlog 總大小。sum(milvus_datacoord_stored_binlog_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_datacoord_stored_binlog_size儲存於 Milvus 的 binlog 總大小。
    +

    +

    資料節點

    + + + + + + + + + + + + + + + + + + + +
    面板面板描述PromQL (Prometheus 查詢語言)使用的 Milvus 公制Milvus 測量指標說明
    流程圖數量每個資料節點對應的 flowgraph 物件數量。sum(milvus_datanode_flowgraph_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_flowgraph_numflowgraph 物件的數量。
    集合中的每個分片對應一個 flowgraph 物件。
    Msg Rows Consume Rate(訊息行消耗率過去兩分鐘內,每個資料節點每秒消耗的串流訊息行數目。sum(increase(milvus_datanode_msg_rows_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_msg_rows_count消耗的串流訊息行數。
    目前,按資料節點計算的串流訊息只包括插入和刪除訊息。
    刷新資料大小率過去兩分鐘內,每個資料節點每秒記錄的每個刷新訊息的大小。sum(increase(milvus_datanode_flushed_data_size{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (msg_type, pod, node_id)milvus_datanode_flushed_data_size每個刷新訊息的大小。
    目前,按資料節點計算的串流訊息只包括插入和刪除訊息。
    用戶數在每個資料節點上建立的消費者數量。sum(milvus_datanode_consumer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_consumer_num每個資料節點上建立的消費者數量。
    每個 flowgraph 對應一個 Consumer。
    生產者數目每個資料節點上建立的生產者數量。sum(milvus_datanode_producer_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_producer_num每個資料節點上建立的消費者數量。
    集合中的每個分片對應一個 delta 通道生產者和一個 Timetick 通道生產者。
    同步時間在所有實體主題中,每個資料節點同步的平均、最大和最小時元時間。avg(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) max(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id) min(milvus_datanode_sync_epoch_time{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_sync_epoch_time資料節點上每個實體主題的 epoch time (Unix time,自 1970 年 1 月 1 日起經過的毫秒數。)。
    未刷新段數在每個資料節點上建立的未刷新區段數目。sum(milvus_datanode_unflushed_segment_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (pod, node_id)milvus_datanode_unflushed_segment_num在每個資料節點上建立的未刷新區段數目。
    編碼緩衝區延遲每個資料節點在過去兩分鐘內編碼緩衝區所用時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_encode_buffer_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_datanode_encode_buffer_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_encode_buffer_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_encode_buffer_latency每個資料節點編碼緩衝區所需的時間。
    儲存資料延遲每個資料節點在過去兩分鐘內,將緩衝區寫入儲存層所用時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_save_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_datanode_save_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_save_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_save_latency每個資料節點將緩衝區寫入儲存層所花費的時間。
    沖洗作業率過去兩分鐘內,每個資料節點每秒刷新緩衝區的次數。sum(increase(milvus_datanode_flush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_buffer_op_count資料節點刷新緩衝區的累積次數。
    自動沖洗作業率過去兩分鐘內,每個資料節點每秒自動刷新緩衝區的次數。sum(increase(milvus_datanode_autoflush_buffer_op_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_autoflush_buffer_op_count資料節點自動刷新緩衝區的累積次數。
    沖洗要求率過去兩分鐘內,每個資料節點每秒收到緩衝區刷新請求的次數。sum(increase(milvus_datanode_flush_req_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_datanode_flush_req_count資料節點從資料協調器收到沖洗要求的累積次數。
    壓縮延遲過去兩分鐘內,每個資料節點執行壓縮任務所花時間的平均延遲時間和 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_datanode_compaction_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_datanode_compaction_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_datanode_compaction_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_datanode_compaction_latency每個資料節點執行壓縮任務所需的時間。
    +

    +

    索引協調器

    + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 度量說明
    索引請求率過去兩分鐘內平均每秒收到的索引建立請求數目。sum(increase(milvus_indexcoord_indexreq_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status)milvus_indexcoord_indexreq_count收到的索引建立請求數目。
    索引任務計數索引元資料中記錄的所有索引建立任務的計數。sum(milvus_indexcoord_indextask_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (index_task_status)milvus_indexcoord_indextask_count索引元資料中記錄的所有索引任務計數。
    索引節點數目受管索引節點的數量。sum(milvus_indexcoord_indexnode_num{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}) by (app_kubernetes_io_instance)milvus_indexcoord_indexnode_num受管索引節點的數目。
    +

    +

    索引節點

    + + + + + + + + + + + + +
    面板面板說明PromQL (Prometheus 查詢語言)使用的 Milvus 度量Milvus 測量指標說明
    索引任務率過去兩分鐘內,每個索引節點平均每秒收到的索引建立任務數量。sum(increase(milvus_indexnode_index_task_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])/120) by (status, pod, node_id)milvus_indexnode_index_task_count收到的索引建立任務數。
    負載欄位延遲過去兩分鐘內,每個索引節點每次載入段字段資料所用時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_load_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_indexnode_load_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_load_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_load_field_latency索引節點載入段字段資料所用的時間。
    解碼欄位延遲每個索引節點在過去兩分鐘內每次編碼欄位資料所用時間的平均延遲時間和第 99 百分位數。P99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_decode_field_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    AVG:
    sum(increase(milvus_indexnode_decode_field_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_decode_field_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_decode_field_latency用於解碼欄位資料的時間。
    建立索引延遲每個索引節點在過去兩分鐘內建立索引所用時間的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_build_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_build_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_build_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_build_index_latency建立索引所用的時間。
    編碼索引延遲每個索引節點在過去兩分鐘內編碼索引檔案所用時間的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_encode_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_encode_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_encode_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_encode_index_latency編碼索引檔案所用的時間。
    儲存索引延遲每個索引節點在過去兩分鐘內儲存索引檔案所用時間的平均延遲時間和第 99 百分位數。p99:
    histogram_quantile(0.99, sum by (le, pod, node_id) (rate(milvus_indexnode_save_index_latency_bucket{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])))
    avg:
    sum(increase(milvus_indexnode_save_index_latency_sum{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id) / sum(increase(milvus_indexnode_save_index_latency_count{app_kubernetes_io_instance=~"$instance", app_kubernetes_io_name="$app_name", namespace="$namespace"}[2m])) by(pod, node_id)
    milvus_indexnode_save_index_latency儲存索引檔案所用的時間。
    +

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.json new file mode 100644 index 000000000..f55d48007 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/prometheus-operator/kube-prometheus.git\n$ cd kube-prometheus\n$ kubectl apply --server-side -f manifests/setup\n$ kubectl wait \\\n --for condition=Established \\\n --all CustomResourceDefinition \\\n --namespace=monitoring\n$ kubectl apply -f manifests/\n","kubectl patch clusterrole prometheus-k8s --type=json -p='[{\"op\": \"add\", \"path\": \"/rules/-\", \"value\": {\"apiGroups\": [\"\"], \"resources\": [\"pods\", \"services\", \"endpoints\"], \"verbs\": [\"get\", \"watch\", \"list\"]}}]'\n","$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090\n$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000\n","$ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values\n","$ kubectl get servicemonitor\n","NAME AGE\nmy-release-milvus 54s\n"],"headingContent":"Deploying Monitoring Services on Kubernetes","anchorList":[{"label":"在 Kubernetes 上部署監控服務","href":"Deploying-Monitoring-Services-on-Kubernetes","type":1,"isActive":false},{"label":"使用 Prometheus 監控指標","href":"Monitor-metrics-with-Prometheus","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"在 Kubernetes 上部署監控服務","href":"Deploy-monitoring-services-on-Kubernetes","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.md new file mode 100644 index 000000000..403aecd80 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor.md @@ -0,0 +1,134 @@ +--- +id: monitor.md +title: 部署監控服務 +related_key: 'monitor, alert' +summary: 學習如何使用 Prometheus 為 Milvus 集群部署監控服務。 +--- +

    在 Kubernetes 上部署監控服務

    本主題描述如何使用 Prometheus 為 Kubernetes 上的 Milvus 叢集部署監控服務。

    +

    使用 Prometheus 監控指標

    度量指標是提供系統運行狀態資訊的指標。例如,透過度量指標,您可以瞭解 Milvus 的資料節點消耗了多少記憶體或 CPU 資源。瞭解 Milvus 叢集中各元件的效能和狀態,可以讓您充分掌握資訊,從而做出更好的決策,並更及時地調整資源分配。

    +

    一般而言,度量指標會儲存於時間序列資料庫(TSDB),例如Prometheus,並記錄有時間戳記的度量指標。在監控 Milvus 服務的情況下,您可以使用 Prometheus 從出口商設定的端點抽取資料。然後,Prometheus 在http://<component-host>:9091/metrics 匯出每個 Milvus 元件的度量指標。

    +

    但是,您可能會為一個元件設置多個副本,這使得 Prometheus 的手動設定變得過於複雜。因此,您可以使用 Kubernetes 的擴充套件Prometheus Operator,自動且有效地管理 Prometheus 監控實體。使用 Prometheus Operator 可省去手動新增度量目標和服務提供者的麻煩。

    +

    ServiceMonitor 自訂資源定義 (CRD) 可讓您宣告性地定義如何監控動態服務集。它還允許使用標籤選擇使用所需的組態來監控哪些服務。使用 Prometheus Operator,您可以引入慣例,指定如何暴露度量。新服務可以按照您設定的慣例自動發現,而無需手動重新配置。

    +

    下圖說明 Prometheus 工作流程。

    +

    + + Prometheus_architecture + Prometheus 架構

    +

    先決條件

    本教程使用Kube-prometheus,以省去您安裝和手動設定每個監控和警示元件的麻煩。

    +

    Kube-prometheus 收集 Kubernetes 清单、Grafana面板和Prometheus 规则,并结合文档和脚本。

    +

    在部署監控服務之前,您需要使用 kube-prometheus manifests 目錄中的組態來建立監控堆疊。

    +
    $ git clone https://github.com/prometheus-operator/kube-prometheus.git
    +$ cd kube-prometheus
    +$ kubectl apply --server-side -f manifests/setup
    +$ kubectl wait \
    +        --for condition=Established \
    +        --all CustomResourceDefinition \
    +        --namespace=monitoring
    +$ kubectl apply -f manifests/
    +
    +
    +預設的 prometheus-k8s clusterrole 無法捕捉 milvus 的指標,需要修補:
    +
    kubectl patch clusterrole prometheus-k8s --type=json -p='[{"op": "add", "path": "/rules/-", "value": {"apiGroups": [""], "resources": ["pods", "services", "endpoints"], "verbs": ["get", "watch", "list"]}}]'
    +
    +

    要刪除堆疊,請執行kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

    +

    在 Kubernetes 上部署監控服務

    1.存取儀表板

    將 Prometheus 服務轉發至9090 連接埠,並將 Grafana 服務轉發至3000 連接埠。

    +
    $ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/prometheus-k8s 9090
    +$ kubectl --namespace monitoring --address 0.0.0.0 port-forward svc/grafana 3000
    +
    +

    2.啟用 ServiceMonitor

    Milvus Helm 預設未啟用 ServiceMonitor。在 Kubernetes 群集中安裝 Prometheus Operator 之後,您可以透過新增參數metrics.serviceMonitor.enabled=true 來啟用它。

    +
    $ helm upgrade my-release milvus/milvus --set metrics.serviceMonitor.enabled=true --reuse-values
    +
    +

    安裝完成後,使用kubectl 檢查 ServiceMonitor 資源。

    +
    $ kubectl get servicemonitor
    +
    +
    NAME                           AGE
    +my-release-milvus              54s
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.json new file mode 100644 index 000000000..7ba1edb5b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus monitoring framework overview","anchorList":[{"label":"Milvus 監控框架概述","href":"Milvus-monitoring-framework-overview","type":1,"isActive":false},{"label":"Milvus 中的 Prometheus","href":"Prometheus-in-Milvus","type":2,"isActive":false},{"label":"Milvus 中的 Grafana","href":"Grafana-in-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.md new file mode 100644 index 000000000..810567151 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/monitor_overview.md @@ -0,0 +1,111 @@ +--- +id: monitor_overview.md +title: 監視器概觀 +related_key: 'monitor, alert' +summary: 瞭解 Milvus 如何使用 Prometheus 和 Grafana 來監控和警示服務。 +--- +

    Milvus 監控框架概述

    本主題說明 Milvus 如何使用 Prometheus 來監控指標,以及如何使用 Grafana 來視覺化指標和建立警示。

    +

    Milvus 中的 Prometheus

    Prometheus是 Kubernetes 實作的開放原始碼監控及警示工具套件。它以時間序列資料的方式收集並儲存指標。這表示度量記錄時會儲存時間戳記,以及稱為標籤的可選鍵值對。

    +

    目前 Milvus 使用 Prometheus 的下列元件:

    +
      +
    • Prometheus 端點,從出口商設定的端點取得資料。
    • +
    • Prometheus 操作員,以有效管理 Prometheus 監控實體。
    • +
    • Kube-prometheus 提供易於操作的端對端 Kubernetes 群集監控。
    • +
    +

    度量名稱

    Prometheus 中有效的度量名稱包含三個元素:命名空間、子系統和名稱。這三個元素以「_」連結。

    +

    Prometheus 監控的 Milvus 公制的命名空間是 "milvus"。根據度量指標所屬的角色,其子系統應該是下列八種角色之一:"rootcoord"、"proxy"、"querycoord"、"querynode"、"indexcoord"、"indexnode"、"datacoord"、"datanode"。

    +

    例如,計算查詢向量總數的 Milvus 公制命名為milvus_proxy_search_vectors_count

    +

    度量類型

    Prometheus 支援四種度量類型:

    +
      +
    • 計數器 (Counter):一種累積度量,其值只能增加或在重新啟動時重設為零。
    • +
    • Gauge (度量單位):這種度量單位的值可以上升或下降。
    • +
    • 直方圖:一種根據可設定的桶進行計算的度量指標。常見的範例是請求持續時間。
    • +
    • 摘要:類似直方圖的度量類型,可在滑動時間視窗中計算可設定的量化值。
    • +
    +

    度量標籤

    Prometheus 透過標籤區分具有相同度量名稱的樣本。標籤是度量指標的特定屬性。具有相同名稱的度量值,其variable_labels 欄位的值必須相同。下表列出 Milvus 公制常用標籤的名稱和意義。

    + + + + + + + + + + + + + + + + + +
    標籤名稱定義
    "node_id"角色的唯一 ID。由 milvus 產生的全局唯一 ID。
    狀態已處理的作業或請求的狀態。「放棄」、「成功 」或 「失敗」。
    "查詢類型讀取請求的類型。「搜尋 」或 「查詢」。
    "msg_type訊息的類型。「插入」、「刪除」、「搜尋 」或 「查詢」。
    "segment_state" 區段的狀態。區段的狀態。"Sealed"、"Growing"、"Flushed"、"Flushing"、"Dropped 「或 」Importing"。
    "cache_state" 快取物件的狀態。快取物件的狀態。「命中 」或 「未命中」。
    "快取名稱快取物件的名稱。此標籤與 "cache_state" 標籤一起使用。例如:"CollectionID"、"Schema "等。
    "通道名稱訊息儲存(Pulsar 或 Kafka)中的實體主題。例如:"by-dev-rootcoord-dml_0"、"by-dev-rootcoord-dml_255 "等。
    "function_name"(函式名處理特定請求的函式名稱。例如,"CreateCollection"、"CreatePartition"、"CreateIndex "等。
    "使用者名稱用於驗證的使用者名稱。您偏好的使用者名稱。
    "索引任務的狀態索引任務在元儲存中的狀態。「未發佈」、「進行中」、「失敗」、「完成 」或 「回收」。
    +

    Milvus 中的 Grafana

    Grafana是一個開放原始碼的可視化堆疊,可連結所有資料來源。透過調出指標,它可以幫助使用者瞭解、分析和監控大量資料。

    +

    Milvus 使用 Grafana 的客製化儀表板來進行度量可視化。

    +

    下一步

    了解監控和警示的基本工作流程後,請學習:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.json b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.json new file mode 100644 index 000000000..7b787b837 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.json @@ -0,0 +1 @@ +{"codeList":["wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json\n"],"headingContent":"Visualize Milvus Metrics in Grafana","anchorList":[{"label":"在 Grafana 中視覺化 Milvus 的度量指標","href":"Visualize-Milvus-Metrics-in-Grafana","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"使用 Grafana 可視化度量指標","href":"Visualize-metrics-using-Grafana","type":2,"isActive":false},{"label":"接下來","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.md b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.md new file mode 100644 index 000000000..ba72bc270 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/monitor/visualize.md @@ -0,0 +1,100 @@ +--- +id: visualize.md +title: 可視化指標 +related_key: 'monitor, alert' +summary: 瞭解如何在 Grafana 中視覺化 Milvus 的度量指標。 +--- +

    在 Grafana 中視覺化 Milvus 的度量指標

    本主題描述如何使用 Grafana 可視化 Milvus metrics。

    +

    如監控指南所述,指標包含有用的資訊,例如特定 Milvus 元件使用了多少記憶體。監控指標有助於您更好地瞭解 Milvus 的性能及其運行狀態,以便及時調整資源分配。

    +

    可視化是一種顯示資源使用量在不同時間變化的圖表,它使您更容易快速查看和注意到資源使用量的變化,特別是在事件發生時。

    +

    本教學使用時間序列分析的開放原始碼平台 Grafana 來視覺化部署在 Kubernetes (K8s) 上的 Milvus 叢集的各種效能指標。

    +

    先決條件

      +
    • 您已在 K8s 上安裝 Milvus 叢集。)
    • +
    • 在使用 Grafana 可視化指標之前,您需要設定 Prometheus以監控和收集指標。如果設定成功,您可以從http://localhost:3000 存取 Grafana。或者您也可以使用admin:admin 的預設 Grafanauser:password 存取 Grafana。
    • +
    +

    使用 Grafana 可視化度量指標

    1.下載並匯入儀表板

    從 JSON 檔案下載並匯入 Milvus 的儀表板。

    +
    wget https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/deployments/monitor/grafana/milvus-dashboard.json
    +
    +

    + + Download_and_import + 下載與匯入

    +

    2.檢視指標

    選擇要監控的 Milvus 實例。然後您可以看到 Milvus 元件面板。

    +

    + + Select_instance + 選擇實例

    +

    + + Grafana_panel + Grafana_panel

    +

    接下來

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.json new file mode 100644 index 000000000..242e44b79 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.json @@ -0,0 +1 @@ +{"codeList":["kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n dependencies:\n # Omit other fields ...\n storage:\n inCluster:\n values:\n mode: standalone\n resources:\n requests:\n memory: 100Mi\n deletionPolicy: Delete # Delete | Retain, default: Retain\n pvcDeletion: true # default: false\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-s3-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n # your bucket name\n bucketName: \n # Optional, config the prefix of the bucket milvus will use\n rootPath: milvus/my-release\n useSSL: true\n dependencies:\n storage:\n # enable external object storage\n external: true\n type: S3 # MinIO | S3\n # the endpoint of AWS S3\n endpoint: s3.amazonaws.com:443\n # the secret storing the access key and secret key\n secretRef: \"my-release-s3-secret\"\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n eks.amazonaws.com/role-arn: \n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n # enable AssumeRole\n useIAM: true\n # Omit other fields ...\n dependencies:\n storage:\n # Omit other fields ...\n # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect\n endpoint: s3..amazonaws.com:443\n secretRef: \"\" # we don't need to specify the secret here\n","# # change the to match your environment\napiVersion: v1\nkind: Secret\nmetadata:\n name: my-release-gcp-secret\ntype: Opaque\nstringData:\n accesskey: \n secretkey: \n","# # change the to match your environment\napiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n labels:\n app: milvus\nspec:\n # Omit other fields ...\n config:\n minio:\n cloudProvider: gcp\n dependencies:\n storage:\n # Omit other fields ...\n endpoint: storage.googleapis.com:443\n","apiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-release-sa\n annotations:\n iam.gke.io/gcp-service-account: \n","labels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n # use the above ServiceAccount\n serviceAccountName: my-release-sa\n config:\n minio:\n cloudProvider: gcp\n # enable AssumeRole\n useIAM: true\n # Omit other fields ... \n"],"headingContent":"Configure Object Storage with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 設定物件儲存","href":"Configure-Object-Storage-with-Milvus-Operator","type":1,"isActive":false},{"label":"設定物件儲存","href":"Configure-object-storage","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.md new file mode 100644 index 000000000..0a6fbac2b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/object_storage_operator.md @@ -0,0 +1,230 @@ +--- +id: object_storage_operator.md +title: 使用 Milvus Operator 設定物件儲存 +related_key: 'minio, s3, storage, etcd, pulsar' +summary: 瞭解如何使用 Milvus Operator 設定物件儲存。 +--- +

    使用 Milvus Operator 設定物件儲存

    Milvus 使用 MinIO 或 S3 作為物件儲存,以持久化大型檔案,例如索引檔案和二進位日誌。本主題介紹當您使用 Milvus Operator 安裝 Milvus 時,如何設定物件儲存的依賴性。如需詳細資訊,請參閱 Milvus Operator 資源庫中的Configure Object Storage with MilvusOperator。

    +

    本主題假設您已部署 Milvus Operator。

    +
    請參閱部署 Milvus Operator以取得更多資訊。
    +

    您需要指定使用 Milvus Operator 啟動 Milvus 叢集的設定檔。

    +
    kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    您只需編輯milvus_cluster_default.yaml 中的程式碼模板,即可設定第三方依賴。以下各節將分別介紹如何設定物件儲存、etcd 及 Pulsar。

    +

    設定物件儲存

    Milvus 集群使用 MinIO 或 S3 作為物件儲存,以持久化大型檔案,例如索引檔案和二進位日誌。在spec.dependencies.storage 下添加必填字段以配置对象存储,可能的选项是externalinCluster

    +

    內部物件儲存

    預設情況下,Milvus Operator 會為 Milvus 部署集群內 MinIO。以下是一個配置範例,示範如何使用此 MinIO 作為內部物件儲存。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +  labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  dependencies:
    +    # Omit other fields ...
    +    storage:
    +      inCluster:
    +        values:
    +          mode: standalone
    +          resources:
    +            requests:
    +              memory: 100Mi
    +        deletionPolicy: Delete # Delete | Retain, default: Retain
    +        pvcDeletion: true # default: false
    +
    +

    應用上述配置後,叢集內 MinIO 將以獨立模式執行,記憶體上限為 100Mi。請注意

    +
      +
    • deletionPolicy 欄位指定集群內 MinIO 的刪除政策。它預設為Delete ,並有Retain 作為替代選項。

      +
        +
      • Delete 表示群集內物件儲存會在您停止 Milvus 範例時刪除。
      • +
      • Retain 表示群集內物件儲存會保留為依賴服務,供您稍後啟動 Milvus 範例時使用。
      • +
    • +
    • pvcDeletion 欄位指定當叢集內 MinIO 刪除時,是否刪除 PVC(Persistent Volume Claim)。

    • +
    +

    inCluster.values 下的欄位與 Milvus Helm Chart 中的相同,您可以在這裡找到。

    +

    外部物件儲存

    在模板 YAML 檔案中使用external 表示使用外部物件儲存服務。要使用外部物件儲存,您需要在 Milvus CRD 中正確設定spec.dependencies.storagespec.config.minio 下的欄位。

    +

    使用 Amazon Web Service (AWS) S3 作為外部物件儲存空間

      +
    • 透過 AK/SK 設定 AWS S3 存取權限

      +

      通常可透過存取金鑰和存取秘鑰的一對來存取 S3 儲存桶。您可以建立Secret 物件,將它們儲存在 Kubernetes 中,如下所示:

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-s3-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      然後您可以設定 AWS S3 儲存桶作為外部物件儲存:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      # your bucket name
      +      bucketName: <my-bucket>
      +      # Optional, config the prefix of the bucket milvus will use
      +      rootPath: milvus/my-release
      +      useSSL: true
      +  dependencies:
      +    storage:
      +      # enable external object storage
      +      external: true
      +      type: S3 # MinIO | S3
      +      # the endpoint of AWS S3
      +      endpoint: s3.amazonaws.com:443
      +      # the secret storing the access key and secret key
      +      secretRef: "my-release-s3-secret"
      +
    • +
    • 透過 AssumeRole 配置 AWS S3 存取權限

      +

      另外,您也可以讓 Milvus 使用AssumeRole 存取您的 AWS S3 收件匣,如此一來,只涉及臨時憑證,而非您實際的 AK/SK。

      +

      如果這是您的選擇,您需要在 AWS 主控台上準備一個角色,並取得它的 ARN,通常是arn:aws:iam::<your account id>:role/<role-name> 的形式。

      +

      然後建立ServiceAccount 物件,將它儲存在您的 Kubernetes 中,如下所示:

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    eks.amazonaws.com/role-arn: <my-role-arn>
      +
      +

      一切就緒後,在範本 YAML 檔案中參考上述ServiceAccount ,並將spec.config.minio.useIAM 設為true ,以啟用 AssumeRole。

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      # Note: you must use regional endpoint here, otherwise the minio client that milvus uses will fail to connect
      +      endpoint: s3.<my-bucket-region>.amazonaws.com:443
      +      secretRef: "" # we don't need to specify the secret here
      +
    • +
    +

    使用 Google Cloud Storage (GCS) 作為外部物件儲存

    AWS S3 物件儲存並非唯一的選擇。您也可以使用其他公有雲供應商的物件儲存服務,例如 Google Cloud。

    +
      +
    • 透過 AK/SK 設定 GCS 存取權限

      +

      配置大多與使用 AWS S3 相似。您仍需要建立Secret 物件,以便在 Kubernetes 中儲存憑證。

      +
      # # change the <parameters> to match your environment
      +apiVersion: v1
      +kind: Secret
      +metadata:
      +  name: my-release-gcp-secret
      +type: Opaque
      +stringData:
      +  accesskey: <my-access-key>
      +  secretkey: <my-secret-key>
      +
      +

      然後,您只需要將endpoint 改為storage.googleapis.com:443 ,並將spec.config.minio.cloudProvider 設定為gcp ,如下所示:

      +
      # # change the <parameters> to match your environment
      +apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +  dependencies:
      +    storage:
      +      # Omit other fields ...
      +      endpoint: storage.googleapis.com:443
      +
    • +
    • 透過 AssumeRole 設定 GCS 存取權限

      +

      與 AWS S3 相似,如果您使用 GKE 作為 Kubernetes 叢集,您也可以使用Workload Identity以臨時憑證存取 GCS。

      +

      ServiceAccount 的註解與 AWS EKS 不同。您需要指定 GCP 服務帳號名稱,而非角色 ARN。

      +
      apiVersion: v1
      +kind: ServiceAccount
      +metadata:
      +  name: my-release-sa
      +  annotations:
      +    iam.gke.io/gcp-service-account: <my-gcp-service-account-name>
      +
      +

      然後,您可以設定您的 Milvus 實例使用上述ServiceAccount ,並透過設定spec.config.minio.useIAMtrue 來啟用 AssumeRole,如下所示:

      +
      labels:
      +    app: milvus
      +spec:
      +  # Omit other fields ...
      +  components:
      +    # use the above ServiceAccount
      +    serviceAccountName: my-release-sa
      +  config:
      +    minio:
      +      cloudProvider: gcp
      +      # enable AssumeRole
      +      useIAM: true
      +      # Omit other fields ...  
      +
    • +
    +

    下一步

    學習如何使用 Milvus Operator 配置其他 Milvus 相依性:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.json b/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.json new file mode 100644 index 000000000..2942da119 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\nclient.create_privileg_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​\n​\nclient.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.CreatePrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​\n\n","import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​\n​\nclient.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Arrays.asList(\"Query\", \"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.AddPrivilegesToGroup(context.Background(), \"privilege_group_1\", []string{\"Query\", \"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Query\", \"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​\n\n","import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​\n​\nclient.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .privileges(Collections.singletonList(\"Search\"))​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.RemovePrivilegesFromGroup(context.Background(), \"privilege_group_1\", []string{\"Search\"})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\",​\n \"privileges\":[\"Search\"]​\n}'​\n\n","from pymilvus import MilvusClient​\nclient.list_privilege_groups()​\n\n","import io.milvus.v2.service.rbac.PrivilegeGroup;​\nimport io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​\nimport io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​\n​\nListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​\n .build());​\nList groups = resp.getPrivilegeGroups();​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.ListPrivilegeGroups(context.Background())​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","PrivilegeGroupItem: , ​\n\n","from pymilvus import MilvusClient​\nclient.drop_privilege_group(group_name='privilege_group_1')​\n\n","import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​\n​\nclient.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​\n .groupName(\"privilege_group_1\")​\n .build());​\n\n","import \"github.com/milvus-io/milvus-sdk-go/v2/client\"​\n​\nclient.DropPrivilegeGroup(context.Background(), \"privilege_group_1\")​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"privilegeGroupName\":\"privilege_group_1\"​\n}'​\n\n"],"headingContent":"Create Privilege Group​","anchorList":[{"label":"建立特權群組","href":"Create-Privilege-Group​","type":1,"isActive":false},{"label":"特權群組與特權","href":"Privilege-group-vs-privileges​","type":2,"isActive":false},{"label":"內建的特權群組","href":"Built-in-privilege-groups​","type":2,"isActive":false},{"label":"程序","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.md b/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.md new file mode 100644 index 000000000..be96d3f46 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/privilege_group.md @@ -0,0 +1,489 @@ +--- +id: privilege_group.md +related_key: enable RBAC +summary: 為了簡化授予權限的程序,建議您將多個權限合併為一個權限群。 +title: 建立權限群組 +--- +

    建立特權群組

    為了簡化授予特權的流程,建議您將多個特權合併為一個特權群組。

    +

    特權群組與特權

    特權群組由多個特權組成。

    +

    + + Privilege group illustrated + 特權群組說明

    +

    如上圖所示,假設您需要賦予一個角色三種不同的權限。

    +
      +
    • 如果不使用特權群組,則需要授予三次特權。

    • +
    • 如果使用特權群組,則只需建立特權群組,並將三種特權加入此特權群組,然後將特權群組授權給角色 A。

    • +
    +

    透過使用特權群組,您可以批量授予角色多項特權。

    +

    內建的特權群組

    為了易於使用,Milvus 在集合、資料庫和實例層面上提供了共 9 個內建的權限:COLL_RO、COLL_RW、COLL_ADMIN、DB_RO、DB_RW、DB_Admin、Cluster_RO、Cluster_RW 和 Cluster_Admin。

    +
    +

    這三層內建的權限群組沒有階級關係。在實體層級設定權限群組,並不會自動設定該實體下所有資料庫和資料集的權限。資料庫和資料集層級的權限需要手動設定。

    +
    +

    下表說明每個內建權限群組所包含的權限。

    +

    資料集層級

      +
    • COLL_RO: 包含讀取集合資料的權限。

    • +
    • COLL_RW:包含讀取和寫入收集資料的權限。

    • +
    • COLL_ADMIN:包含讀取和寫入集合資料以及管理集合的權限。

    • +
    +

    下表列出了集合層級的三個內建權限群組所包含的特定權限。

    +

    **權限**

    +

    **僅限集合讀取**

    +

    僅讀取集合資料** **寫入集合資料** **讀取集合資料**

    +

    **集合管理員**

    +

    查詢

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    搜尋

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    索引詳細資料

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetFlushState

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    取得載入狀態

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    GetLoadingProgress

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    HasPartition

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    顯示分區

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    列出別名

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    描述集合

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    描述別名

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    取得統計資料

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    建立索引

    +

    +

    ✔️

    +

    ✔️

    +

    下拉索引

    +

    +

    ✔️

    +

    ✔️

    +

    建立分區

    +

    +

    ✔️

    +

    ✔️

    +

    DropPartition

    +

    +

    ✔️

    +

    ✔️

    +

    載入

    +

    +

    ✔️

    +

    ✔️

    +

    釋放

    +

    +

    ✔️

    +

    ✔️

    +

    插入

    +

    +

    ✔️

    +

    ✔️

    +

    刪除

    +

    +

    ✔️

    +

    ✔️

    +

    上傳

    +

    +

    ✔️

    +

    ✔️

    +

    輸入

    +

    +

    ✔️

    +

    ✔️

    +

    同花順

    +

    +

    ✔️

    +

    ✔️

    +

    壓實

    +

    +

    ✔️

    +

    ✔️

    +

    負載平衡

    +

    +

    ✔️

    +

    ✔️

    +

    建立別名

    +

    +

    +

    ✔️

    +

    刪除別名

    +

    +

    +

    ✔️

    +
    +

    資料庫層級

      +
    • DB_RO:包含讀取資料庫資料的權限

    • +
    • DB_RW:包含讀取及寫入資料庫資料的權限

    • +
    • DB_Admin:包括讀取和寫入資料庫資料以及管理資料庫的權限。

    • +
    +

    下表列出了資料庫層級的三個內建權限群組所包含的特定權限。

    +

    **權限**

    +

    **僅讀取資料庫**

    +

    **資料庫讀寫**

    +

    **資料庫管理員**

    +

    顯示資料庫

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    描述資料庫

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    建立集合

    +

    +

    +

    ✔️

    +

    丟棄收藏集

    +

    +

    +

    ✔️

    +

    改變資料庫

    +

    +

    ✔️

    +

    ✔️

    +
    +

    群集層級

      +
    • Cluster_RO: 包含讀取實體資料的權限

    • +
    • Cluster_RW: 包含讀取和寫入實體資料的權限

    • +
    • Cluster_Admin: 包含讀寫實體資料和管理實體的權限。

    • +
    +

    下表列出了实例级别的三个内置权限组所包含的特定权限。

    +

    **權限**

    +

    **僅限群集讀取**

    +

    **叢集讀取寫入**

    +

    **簇管理**

    +

    列出資料庫

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    重新命名資料庫

    +

    +

    +

    ✔️

    +

    建立所有權

    +

    +

    +

    ✔️

    +

    更新使用者

    +

    +

    +

    ✔️

    +

    刪除所有權

    +

    +

    +

    ✔️

    +

    選擇所有權

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    管理所有權

    +

    +

    +

    ✔️

    +

    選擇使用者

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    備份RBAC

    +

    +

    +

    ✔️

    +

    還原RBAC

    +

    +

    +

    ✔️

    +

    建立資源群組

    +

    +

    +

    ✔️

    +

    刪除資源群組

    +

    +

    +

    ✔️

    +

    更新資源群組

    +

    +

    ✔️

    +

    ✔️

    +

    描述資源群組

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    列出資源群組

    +

    ✔️

    +

    ✔️

    +

    ✔️

    +

    傳輸節點

    +

    +

    ✔️

    +

    ✔️

    +

    傳輸複製

    +

    +

    ✔️

    +

    ✔️

    +

    建立資料庫

    +

    +

    +

    ✔️

    +

    刪除資料庫

    +

    +

    +

    ✔️

    +

    全部清除

    +

    +

    ✔️

    +

    ✔️

    +

    建立權限群組

    +

    +

    +

    ✔️

    +

    刪除權限群組

    +

    +

    +

    ✔️

    +

    ListPrivilegeGroups

    +

    +

    +

    ✔️

    +

    操作特權群組

    +

    +

    +

    ✔️

    +
    +

    程序

    您可以建立特權群組,然後將特權加入特權群組。

    +

    建立特權群組

    以下範例示範如何建立一個名為privilege_group_1 的特權群組。

    + +
    from pymilvus import MilvusClient​
    +client.create_privileg_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.CreatePrivilegeGroupReq;​
    +​
    +client.createPrivilegeGroup(CreatePrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.CreatePrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    +

    在特權群組中加入特權

    下面的示例演示了如何將權限PrivilegeBackupRBACPrivilegeRestoreRBAC 添加到剛剛創建的權限組privilege_group_1 中。

    + +
    from pymilvus import MilvusClient​
    +client.add_privileges_to_group(group_name='privilege_group_1', privileges=['Query', 'Search'])​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.AddPrivilegesToGroupReq;​
    +​
    +client.addPrivilegesToGroup(AddPrivilegesToGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Arrays.asList("Query", "Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.AddPrivilegesToGroup(context.Background(), "privilege_group_1", []string{"Query", "Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/add_privileges_to_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Query", "Search"]​
    +}'​
    +
    +
    +

    從特權群組移除特權

    以下範例示範如何從特權群組privilege_group_1 移除特權PrivilegeRestoreRBAC

    + +
    from pymilvus import MilvusClient​
    +client.remove_privileges_from_group(group_name='privilege_group_1', privileges='Search')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.RemovePrivilegesFromGroupReq;​
    +​
    +client.removePrivilegesFromGroup(RemovePrivilegesFromGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .privileges(Collections.singletonList("Search"))​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.RemovePrivilegesFromGroup(context.Background(), "privilege_group_1", []string{"Search"})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/remove_privileges_from_group" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1",​
    +    "privileges":["Search"]​
    +}'​
    +
    +
    +

    列出特權群組

    以下範例說明如何列出所有現有的特權群組。

    + +
    from pymilvus import MilvusClient​
    +client.list_privilege_groups()​
    +
    +
    +
    import io.milvus.v2.service.rbac.PrivilegeGroup;​
    +import io.milvus.v2.service.rbac.request.ListPrivilegeGroupsReq;​
    +import io.milvus.v2.service.rbac.response.ListPrivilegeGroupsResp;​
    +​
    +ListPrivilegeGroupsResp resp = client.listPrivilegeGroups(ListPrivilegeGroupsReq.builder()​
    +        .build());​
    +List<PrivilegeGroup> groups = resp.getPrivilegeGroups();​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.ListPrivilegeGroups(context.Background())​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    以下是一個輸出範例。

    +
    PrivilegeGroupItem: <privilege_group:privilege_group_1>, <privileges:('Search', 'Query')>​
    +
    +
    +

    刪除特權群組

    以下範例說明如何刪除特權群組privilege_group_1

    + +
    from pymilvus import MilvusClient​
    +client.drop_privilege_group(group_name='privilege_group_1')​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.DropPrivilegeGroupReq;​
    +​
    +client.dropPrivilegeGroup(DropPrivilegeGroupReq.builder()​
    +        .groupName("privilege_group_1")​
    +        .build());​
    +
    +
    +
    import "github.com/milvus-io/milvus-sdk-go/v2/client"​
    +​
    +client.DropPrivilegeGroup(context.Background(), "privilege_group_1")​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/privilege_groups/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "privilegeGroupName":"privilege_group_1"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/rbac.json b/localization/v2.5.x/site/zh-hant/adminGuide/rbac.json new file mode 100644 index 000000000..c330279c7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/rbac.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"RBAC Explained​","anchorList":[{"label":"RBAC 解釋","href":"RBAC-Explained​","type":1,"isActive":false},{"label":"RBAC 主要概念","href":"RBAC-key-concepts​","type":2,"isActive":false},{"label":"程序","href":"Procedures​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/rbac.md b/localization/v2.5.x/site/zh-hant/adminGuide/rbac.md new file mode 100644 index 000000000..2fa5dde73 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/rbac.md @@ -0,0 +1,76 @@ +--- +id: rbac.md +related_key: enable RBAC +summary: >- + RBAC (Role-Based Access Control,基於角色的存取控制) 是一種基於角色的存取控制方法。使用 + RBAC,您可以在集合、資料庫和實例層級精細地控制使用者可以執行的作業,增強資料安全性。 +title: RBAC 解釋 +--- +

    RBAC 解釋

    RBAC (Role-Based Access Control,基於角色的存取控制) 是一種基於角色的存取控制方法。使用 RBAC,您可以在集合、資料庫和實例層級精細地控制使用者可以執行的操作,從而增強資料安全性。

    +

    與傳統的使用者存取控制模型不同,RBAC 引入了角色的概念。在 RBAC 模型中,您賦予角色權限,然後再賦予使用者這些角色。接著使用者就可以取得權限。

    +

    RBAC 模型可以提高存取控制管理的效率。例如,如果多個使用者需要同一套權限,您不需要手動為每個使用者設定權限。取而代之的是,您可以創建一個角色並將該角色分配給使用者。如果要調整這些使用者的權限,只要調整角色的權限即可,而修改的內容會套用到具有此角色的所有使用者。

    +

    RBAC 主要概念

    + + Users, roles, and privileges + 使用者、角色和權限

    +

    RBAC 模型中有四個主要元件。

    +
      +
    • **資源:**可存取的資源實體。在 Milvus 中有三種等級的資源 - 實例、資料庫和集合。

    • +
    • **權限:**在 Milvus 資源上執行特定操作的權限(例如:建立集合、插入資料等)。

    • +
    • **權限群:** 多重權限的群組。

    • +
    • **角色:**角色由兩部分組成:權限和資源。權限定義了角色可以執行的操作類型,而資源則定義了可以執行操作的目標資源。例如,資料庫管理員角色可以對特定資料庫執行讀取、寫入和管理操作。

    • +
    • **用戶: **用戶是使用 Milvus 的人。每個使用者都有一個唯一的 ID,並被賦予一個或多個角色。

    • +
    +

    程序

    通過 RBAC 實現存取控制,您需要遵循以下步驟。

    +
      +
    1. 建立使用者:除了 Milvus 的預設用戶root ,您還可以創建新用戶和設置密碼,以保護資料安全。

    2. +
    3. 建立角色:您可以根據需要建立自訂角色。角色的具體功能由其權限決定。

    4. +
    5. 建立特權群組:將多個特權組合為一個特權組,以簡化授予角色特權的流程。

    6. +
    7. 授予角色特權或特權群組:為角色授予特權或特權群組,以定義該角色的功能。

    8. +
    9. 授予使用者角色:將具有特定權限的角色授予使用者,使使用者可以擁有角色的權限。一個角色可以授予多個使用者。

    10. +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.json b/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.json new file mode 100644 index 000000000..66d847813 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.json @@ -0,0 +1 @@ +{"codeList":["{\n \"requests\": { \"nodeNum\": 1 },\n \"limits\": { \"nodeNum\": 1 },\n \"transfer_from\": [{ \"resource_group\": \"rg1\" }],\n \"transfer_to\": [{ \"resource_group\": \"rg2\" }]\n}\n","import pymilvus\n\n# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).\nname = \"rg\"\nnode_num = 0\n\n# create a resource group that exactly hold no query node.\ntry:\n utility.create_resource_group(name, config=utility.ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n ), using='default')\n print(f\"Succeeded in creating resource group {name}.\")\nexcept Exception:\n print(\"Failed to create the resource group.\")\n","rgs = utility.list_resource_groups(using='default')\nprint(f\"Resource group list: {rgs}\")\n\n# Resource group list: ['__default_resource_group', 'rg']\n","info = utility.describe_resource_group(name, using=\"default\")\nprint(f\"Resource group description: {info}\")\n\n# Resource group description: \n# , // string, rg name\n# , // int, num_node which has been transfer to this rg\n# , // int, available node_num, some node may shutdown\n# , // map[string]int, from collection_name to loaded replica of each collecion in this rg\n# , // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg \n# . // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg\n","source = '__default_resource_group'\ntarget = 'rg'\nexpected_num_nodes_in_default = 0\nexpected_num_nodes_in_rg = 1\n\ntry:\n utility.update_resource_groups({\n source: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_default},\n limits={\"node_num\": expected_num_nodes_in_default},\n ),\n target: ResourceGroupConfig(\n requests={\"node_num\": expected_num_nodes_in_rg},\n limits={\"node_num\": expected_num_nodes_in_rg},\n )\n }, using=\"default\")\n print(f\"Succeeded in move 1 node(s) from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving nodes.\")\n\n# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.\n","from pymilvus import Collection\n\ncollection = Collection('demo')\n\n# Milvus loads the collection to the default resource group.\ncollection.load(replica_number=2)\n\n# Or, you can ask Milvus load the collection to the desired resource group.\n# make sure that query nodes num should be greater or equal to replica_number\nresource_groups = ['rg']\ncollection.load(replica_number=2, _resource_groups=resource_groups) \n","collection = Collection(\"Books\")\n\n# Use the load method of a collection to load one of its partition\ncollection.load([\"Novels\"], replica_number=2, _resource_groups=resource_groups)\n\n# Or, you can use the load method of a partition directly\npartition = Partition(collection, \"Novels\")\npartition.load(replica_number=2, _resource_groups=resource_groups)\n","source = '__default_resource_group'\ntarget = 'rg'\ncollection_name = 'c'\nnum_replicas = 1\n\ntry:\n utility.transfer_replica(source, target, collection_name, num_replicas, using=\"default\")\n print(f\"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.\")\nexcept Exception:\n print(\"Something went wrong while moving replicas.\")\n\n# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.\n","try:\n utility.update_resource_groups({\n \"rg\": utility.ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n ),\n }, using=\"default\")\n utility.drop_resource_group(\"rg\", using=\"default\")\n print(f\"Succeeded in dropping {source}.\")\nexcept Exception:\n print(f\"Something went wrong while dropping {source}.\")\n","from pymilvus import utility\nfrom pymilvus.client.types import ResourceGroupConfig\n\n_PENDING_NODES_RESOURCE_GROUP=\"__pending_nodes\"\n\ndef init_cluster(node_num: int):\n print(f\"Init cluster with {node_num} nodes, all nodes will be put in default resource group\")\n # create a pending resource group, which can used to hold the pending nodes that do not hold any data.\n utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(\n requests={\"node_num\": 0}, # this resource group can hold 0 nodes, no data will be load on it.\n limits={\"node_num\": 10000}, # this resource group can hold at most 10000 nodes \n ))\n\n # update default resource group, which can used to hold the nodes that all initial node in it.\n utility.update_resource_groups({\n \"__default_resource_group\": ResourceGroupConfig(\n requests={\"node_num\": node_num},\n limits={\"node_num\": node_num},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.\n )})\n utility.create_resource_group(name=\"rg1\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n utility.create_resource_group(name=\"rg2\", config=ResourceGroupConfig(\n requests={\"node_num\": 0},\n limits={\"node_num\": 0},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}], \n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ))\n\ninit_cluster(1)\n","\ndef scale_to(node_num: int):\n # scale the querynode number in Milvus into node_num.\n pass\n","# scale rg1 into 3 nodes, rg2 into 1 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 3},\n limits={\"node_num\": 3},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n \"rg2\": ResourceGroupConfig(\n requests={\"node_num\": 1},\n limits={\"node_num\": 1},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\nscale_to(5)\n# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.\n","# scale rg1 from 3 nodes into 2 nodes\nutility.update_resource_groups({\n \"rg1\": ResourceGroupConfig(\n requests={\"node_num\": 2},\n limits={\"node_num\": 2},\n transfer_from=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n transfer_to=[{\"resource_group\": _PENDING_NODES_RESOURCE_GROUP}],\n ),\n})\n\n# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.\nscale_to(4)\n# scale the node in __pending_nodes\n"],"headingContent":"Manage Resource Groups","anchorList":[{"label":"管理資源群組","href":"Manage-Resource-Groups","type":1,"isActive":false},{"label":"什麼是資源群組","href":"What-is-a-resource-group","type":2,"isActive":false},{"label":"資源群組的概念","href":"Concepts-of-resource-group","type":2,"isActive":false},{"label":"使用宣告式 api 管理資源群組","href":"Use-declarative-api-to-manage-resource-group","type":2,"isActive":false},{"label":"管理集群擴充的好方法","href":"A-good-practice-to-manage-cluster-scaling","type":2,"isActive":false},{"label":"資源群組如何與多個複製品互動","href":"How-resource-groups-interacts-with-multiple-replicas","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.md b/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.md new file mode 100644 index 000000000..1bee13919 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/resource_group.md @@ -0,0 +1,353 @@ +--- +id: resource_group.md +related_key: Manage Resource Groups +summary: 學習如何管理資源群組。 +title: 管理資源群組 +--- +

    管理資源群組

    在 Milvus 中,您可以使用資源群組,將某些查詢節點與其他節點實體隔離。本指南將教您如何建立和管理自訂資源群組,以及在資源群組之間轉移節點。

    +

    什麼是資源群組

    一个资源组可以容纳 Milvus 集群中的几个或所有查询节点。您可以根据对您最有意义的方式来决定如何在资源组之间分配查询节点。例如,在多集合場景中,您可以為每個資源群組分配適當數量的查詢節點,並將集合載入不同的資源群組,使每個集合中的作業與其他集合中的作業在物理上獨立。

    +

    請注意,一個 Milvus 實例會維護一個預設的資源群組,在啟動時存放所有的查詢節點,並將它命名為__default_resource_group

    +

    從版本 2.4.1 開始,Milvus 提供了宣告式的資源群組 API,而舊的資源群組 API 已經被廢棄。新的宣告式 API 能讓使用者達到idempotency,更容易在雲原生環境中進行二次開發。

    +

    資源群組的概念

    資源群組由資源群組 config 描述:

    +
    {
    +    "requests": { "nodeNum": 1 },
    +    "limits": { "nodeNum": 1 },
    +    "transfer_from": [{ "resource_group": "rg1" }],
    +    "transfer_to": [{ "resource_group": "rg2" }]
    +}
    +
    +
      +
    • requests 屬性指定資源群組必須符合的條件。
    • +
    • limits屬性指定資源群組的最大限制。
    • +
    • transfer_fromtransfer_to 屬性分別描述資源群組最好從哪些資源群組取得資源,以及將資源轉移到哪些資源群組。
    • +
    +

    一旦資源群組的配置發生變化,Milvus 會根據新的配置盡可能調整當前查詢節點的資源,確保所有資源群組最終都能滿足以下條件:

    +

    .requests.nodeNum < nodeNumOfResourceGroup < .limits.nodeNum.

    +

    下列情況除外:

    +
      +
    • 當 Milvus 集群中的 QueryNodes 數量不足時,即NumOfQueryNode < sum(.requests.nodeNum) ,總會有資源群組沒有足夠的 QueryNodes。
    • +
    • 當 Milvus 叢集中的 QueryNodes 數量過多時,即NumOfQueryNode > sum(.limits.nodeNum) ,多餘的 QueryNodes 總會先被放置在__default_resource_group中。
    • +
    +

    當然,如果群集中的 QueryNodes 數量發生變化,Milvus 會不斷嘗試調整以滿足最終條件。因此,您可以先套用資源群組組態變更,然後再執行 QueryNode 擴充。

    +

    使用宣告式 api 管理資源群組

    +

    本頁面的所有程式碼範例都在 PyMilvus 2.5.3 中。在執行它們之前,請先升級您的 PyMilvus 安裝。

    +
    +
      +
    1. 建立資源群組

      +

      要建立一個資源群組,請在連線到 Milvus 實例後執行下列步驟。以下片段假設default 是您 Milvus 連線的別名。

      +
      import pymilvus
      +
      +# A resource group name should be a string of 1 to 255 characters, starting with a letter or an underscore (_) and containing only numbers, letters, and underscores (_).
      +name = "rg"
      +node_num = 0
      +
      +# create a resource group that exactly hold no query node.
      +try:
      +    utility.create_resource_group(name, config=utility.ResourceGroupConfig(
      +        requests={"node_num": node_num},
      +        limits={"node_num": node_num},
      +    ), using='default')
      +    print(f"Succeeded in creating resource group {name}.")
      +except Exception:
      +    print("Failed to create the resource group.")
      +
    2. +
    3. 列出資源群組。

      +

      建立資源群組後,您可以在資源群組清單中看到它。

      +

      要查看 Milvus 实例中的资源组列表,请执行以下操作:

      +
      rgs = utility.list_resource_groups(using='default')
      +print(f"Resource group list: {rgs}")
      +
      +# Resource group list: ['__default_resource_group', 'rg']
      +
    4. +
    5. 描述資源群組。

      +

      您可以讓 Milvus 以下列方式描述資源群組:

      +
      info = utility.describe_resource_group(name, using="default")
      +print(f"Resource group description: {info}")
      +
      +# Resource group description: 
      +#        <name:"rg">,           // string, rg name
      +#        <capacity:1>,            // int, num_node which has been transfer to this rg
      +#        <num_available_node:0>,  // int, available node_num, some node may shutdown
      +#        <num_loaded_replica:{}>, // map[string]int, from collection_name to loaded replica of each collecion in this rg
      +#        <num_outgoing_node:{}>,  // map[string]int, from collection_name to outgoging accessed node num by replica loaded in this rg 
      +#        <num_incoming_node:{}>.  // map[string]int, from collection_name to incoming accessed node num by replica loaded in other rg
      +
    6. +
    7. 在資源群組之間轉移節點。

      +

      您可能會注意到所描述的資源群組還沒有任何查詢節點。從預設資源群組移動一些節點到您建立的資源群組,如下所示: 假設目前群組的__default_resource_group中有 1 個 QueryNodes,而我們想要移動一個節點到建立的rgupdate_resource_groups 確保多重組態變更的原子性,因此 Milvus 看不到任何中間狀態。

      +
      source = '__default_resource_group'
      +target = 'rg'
      +expected_num_nodes_in_default = 0
      +expected_num_nodes_in_rg = 1
      +
      +try:
      +    utility.update_resource_groups({
      +        source: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_default},
      +            limits={"node_num": expected_num_nodes_in_default},
      +        ),
      +        target: ResourceGroupConfig(
      +            requests={"node_num": expected_num_nodes_in_rg},
      +            limits={"node_num": expected_num_nodes_in_rg},
      +        )
      +    }, using="default")
      +    print(f"Succeeded in move 1 node(s) from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving nodes.")
      +
      +# After a while, succeeded in moving 1 node(s) from __default_resource_group to rg.
      +
    8. +
    9. 將集合和分割載入資源群組。

      +

      一旦資源群組中有查詢節點,您就可以載入集合到這個資源群組。以下片段假定已經存在一個名為demo 的集合。

      +
      from pymilvus import Collection
      +
      +collection = Collection('demo')
      +
      +# Milvus loads the collection to the default resource group.
      +collection.load(replica_number=2)
      +
      +# Or, you can ask Milvus load the collection to the desired resource group.
      +# make sure that query nodes num should be greater or equal to replica_number
      +resource_groups = ['rg']
      +collection.load(replica_number=2, _resource_groups=resource_groups) 
      +
      +

      此外,您也可以直接將分割載入資源群組,並將其複本分佈在多個資源群組中。以下假設一個名為Books 的集合已經存在,而且它有一個名為Novels 的分割區。

      +
      collection = Collection("Books")
      +
      +# Use the load method of a collection to load one of its partition
      +collection.load(["Novels"], replica_number=2, _resource_groups=resource_groups)
      +
      +# Or, you can use the load method of a partition directly
      +partition = Partition(collection, "Novels")
      +partition.load(replica_number=2, _resource_groups=resource_groups)
      +
      +

      請注意,_resource_groups 是一個可選參數,不指定它會讓 Milvus 將複製本載入預設資源群組中的查詢節點。

      +

      若要 Milus 在單獨的資源群組中載入集合的每個複製本,請確保資源群組的數量等於複製本的數量。

    10. +
    11. 在資源群組之間轉移副本。

      +

      Milvus 使用副本实现分布在多个查询节点上的之间的负载平衡。您可以按以下方式將資料集中的某些複製品從一個資源群組移到另一個資源群組:

      +
      source = '__default_resource_group'
      +target = 'rg'
      +collection_name = 'c'
      +num_replicas = 1
      +
      +try:
      +    utility.transfer_replica(source, target, collection_name, num_replicas, using="default")
      +    print(f"Succeeded in moving {num_node} replica(s) of {collection_name} from {source} to {target}.")
      +except Exception:
      +    print("Something went wrong while moving replicas.")
      +
      +# Succeeded in moving 1 replica(s) of c from __default_resource_group to rg.
      +
    12. +
    13. 刪除資源群組。

      +

      您可以隨時刪除沒有查詢節點的資源群組 (limits.node_num = 0)。在本指南中,資源群組rg 現在有一個查詢節點。您需要先將資源群組limits.node_num 的配置變更為零。

      +
      try:
      +    utility.update_resource_groups({
      +        "rg": utility.ResourceGroupConfig(
      +            requests={"node_num": 0},
      +            limits={"node_num": 0},
      +        ),
      +    }, using="default")
      +    utility.drop_resource_group("rg", using="default")
      +    print(f"Succeeded in dropping {source}.")
      +except Exception:
      +    print(f"Something went wrong while dropping {source}.")
      +
    14. +
    +

    如需詳細資訊,請參閱pymilvus 中的相關範例

    +

    管理集群擴充的好方法

    目前,在雲原生環境中,Milvus 無法獨立進行擴充。但是,通過使用Declarative Resource Group API與容器協調,Milvus 可以輕鬆實現 QueryNodes 的資源隔離和管理。 以下是在雲環境中管理 QueryNodes 的良好實踐:

    +
      +
    1. 預設情況下,Milvus 會建立一個__default_resource_group 。此資源群組無法刪除,同時也是所有集合的預設載入資源群組,多餘的 QueryNodes 總是會被指派給它。因此,我們可以建立一個待定資源群組,來存放未使用的 QueryNode 資源,防止 QueryNode 資源被__default_resource_group 所佔用。

      +

      此外,如果我們嚴格執行約束sum(.requests.nodeNum) <= queryNodeNum ,就可以精確地控制群集中 QueryNode 的分配。讓我們假設目前叢集中只有一個 QueryNode,並初始化叢集。 以下是一個設定範例:

      +
      from pymilvus import utility
      +from pymilvus.client.types import ResourceGroupConfig
      +
      +_PENDING_NODES_RESOURCE_GROUP="__pending_nodes"
      +
      +def init_cluster(node_num: int):
      +    print(f"Init cluster with {node_num} nodes, all nodes will be put in default resource group")
      +    # create a pending resource group, which can used to hold the pending nodes that do not hold any data.
      +    utility.create_resource_group(name=_PENDING_NODES_RESOURCE_GROUP, config=ResourceGroupConfig(
      +        requests={"node_num": 0}, # this resource group can hold 0 nodes, no data will be load on it.
      +        limits={"node_num": 10000}, # this resource group can hold at most 10000 nodes 
      +    ))
      +
      +    # update default resource group, which can used to hold the nodes that all initial node in it.
      +    utility.update_resource_groups({
      +        "__default_resource_group": ResourceGroupConfig(
      +            requests={"node_num": node_num},
      +            limits={"node_num": node_num},
      +            transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover missing node from pending resource group at high priority.
      +            transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], # recover redundant node to pending resource group at low priority.
      +        )})
      +    utility.create_resource_group(name="rg1", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +    utility.create_resource_group(name="rg2", config=ResourceGroupConfig(
      +        requests={"node_num": 0},
      +        limits={"node_num": 0},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}], 
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ))
      +
      +init_cluster(1)
      +
      +

      使用上面的範例程式碼,我們建立一個名為__pending_nodes的資源群組,以存放額外的 QueryNodes。我們也建立兩個使用者特定的資源群組,分別命名為rg1rg2。此外,我們確保另一個資源群組優先從__pending_nodes 恢復遺失或多餘的 QueryNodes。

    2. +
    3. 叢集縮放

      +

      假設我們有以下的縮放功能:

      +
      
      +def scale_to(node_num: int):
      +    # scale the querynode number in Milvus into node_num.
      +    pass
      +
      +

      我們可以使用 API 將特定資源群組的 QueryNodes 擴充到指定的數量,而不影響任何其他資源群組。

      +
      # scale rg1 into 3 nodes, rg2 into 1 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 3},
      +        limits={"node_num": 3},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +    "rg2": ResourceGroupConfig(
      +        requests={"node_num": 1},
      +        limits={"node_num": 1},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +scale_to(5)
      +# rg1 has 3 nodes, rg2 has 1 node, __default_resource_group has 1 node.
      +
    4. +
    5. 群集縮放

      +

      同樣地,我們可以建立 Scaling-in 規則,優先從__pending_nodes資源群組中選擇 QueryNodes。此資訊可透過describe_resource_group API 取得。達到擴充到指定資源群組的目標。

      +
      # scale rg1 from 3 nodes into 2 nodes
      +utility.update_resource_groups({
      +    "rg1": ResourceGroupConfig(
      +        requests={"node_num": 2},
      +        limits={"node_num": 2},
      +        transfer_from=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +        transfer_to=[{"resource_group": _PENDING_NODES_RESOURCE_GROUP}],
      +    ),
      +})
      +
      +# rg1 has 2 nodes, rg2 has 1 node, __default_resource_group has 1 node, __pending_nodes has 1 node.
      +scale_to(4)
      +# scale the node in __pending_nodes
      +
    6. +
    +

    資源群組如何與多個複製品互動

      +
    • 單一集合的複製本與資源群組有 N 對 N 的關係。
    • +
    • 當單一集合的多個複製本載入一個資源群組時,該資源群組的 QueryNodes 會平均分配給各個複製本,確保每個複製本的 QueryNodes 數目差異不超過 1。
    • +
    +

    下一步

    要部署多租户 Milvus 实例,请阅读以下内容:

    + diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.json b/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.json new file mode 100644 index 000000000..10941a8de --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.json @@ -0,0 +1 @@ +{"codeList":["# new-values.yaml\nminio:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yam;\nminio:\n zones: 2\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n resources:\n limits:\n cpu: 2\n memory: 12Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\nkafka:\n replicaCount: 4\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n broker:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n resources:\n limits:\n cpu: 4\n memory: 16Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","pulsar:\n bookkeeper:\n volumes:\n journal:\n size: 20Gi\n storageClassName: gp3\n","# new-values.yaml\npulsar:\n broker:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\npulsar:\n bookkeeper:\n replicaCount: 3\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n resources:\n limits:\n cpu: 2\n memory: 8Gi\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# new-values.yaml\netcd:\n replicaCount: 5\n","helm upgrade --reuse-values -f new-values.yaml milvus/milvus\n"],"headingContent":"Scale Milvus Dependencies","anchorList":[{"label":"擴充 Milvus 的相依性","href":"Scale-Milvus-Dependencies","type":1,"isActive":false},{"label":"擴充 MinIO","href":"Scale-MinIO","type":2,"isActive":false},{"label":"Kafka","href":"Kafka","type":2,"isActive":false},{"label":"新增額外的 Kafka 代理商池(建議)","href":"Add-an-extra-Kafka-broker-pool-Recommended","type":2,"isActive":false},{"label":"Pulsar","href":"Pulsar","type":2,"isActive":false},{"label":"增加每個 Pulsar 代理 pod 的資源","href":"Increase-resources-per-Pulsar-broker-pod","type":2,"isActive":false},{"label":"增加每個 Pulsar 莊家 pod 的資源","href":"Increase-resources-per-Pulsar-bookie-pod","type":2,"isActive":false},{"label":"etcd","href":"etcd","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.md b/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.md new file mode 100644 index 000000000..90f8c28c2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/scale-dependencies.md @@ -0,0 +1,252 @@ +--- +id: scale-dependencies.md +title: 規模依賴性 +--- +

    擴充 Milvus 的相依性

    Milvus 依賴各種依賴元件,例如 MinIO、Kafka、Pulsar 和 etcd。擴充這些元件可以增強 Milvus 對不同需求的適應性。

    +
    +

    Milvus Operator 使用者請參考使用 MilvusOperator 配置物件儲存使用 Milvus Operator 配置元儲存,以及使用 Milvus Operator配置訊息儲存

    +
    +

    擴充 MinIO

    增加每個 MinIO pod 的資源

    MinIO 是 Milvus 使用的物件儲存系統,可以增加每個 Pod 的 CPU 和記憶體資源。

    +
    # new-values.yaml
    +minio:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    您也可以手動變更每個 MioIO Persistent Volume Claim (PVC) 的spec.resources.requests.storage 值,以增加 MioIO 群集的磁碟容量。請注意,您的預設儲存類別應允許卷擴充。

    +

    建議您為您的 Milvus 實例新增一個額外的 MioIO 伺服器池。

    +
    # new-values.yam;
    +minio:
    +  zones: 2
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    這會為您的 MinIO 群集新增一個額外的伺服器池,允許 Milvus 根據每個伺服器池的可用磁碟容量寫入 MinIO 伺服器池。舉例來說,如果一組有三個伺服器池,總共有 10 TiB 的可用空間,各伺服器池的分佈如下:

    + + + + + + + + + +
    可用空間寫入可能性
    池 A3 TiB30% (3/10)
    資源池 B2 TiB20% (2/10)
    池 C5 TiB50% (5/10)
    +
    +

    MinIO 不會在新伺服器池中自動重新平衡物件。如果需要,您可以使用mc admin rebalance 手動啟動重新平衡程序。

    +
    +

    Kafka

    增加每個 Kafka 代理 pod 的資源

    透過調整每個 Kafka 代理 pod 的 CPU 和記憶體資源來增強 Kafka 代理的容量。

    +
    # new-values.yaml
    +kafka:
    +  resources:
    +     limits:
    +        cpu: 2
    +        memory: 12Gi
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    您也可以透過手動變更每個 Kafka Persistent Volume Claim (PVC) 的spec.resources.requests.storage 值來增加 Kafka 群組的磁碟容量。確保您的預設儲存類別允許卷擴充。

    +

    建議您為 Milvus 實例新增一個額外的 Kafka 伺服器池。

    +
    # new-values.yaml
    +kafka:
    +  replicaCount: 4
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    這將會為您的 Kafka 集群新增一個額外的經紀人。

    +
    +

    Kafka 不會自動重新平衡所有經紀人的主題。如果需要,請在登入每個 Kafka 代理 pod 之後使用bin/kafka-reassign-partitions.sh 在所有 Kafka 代理之間手動重新平衡主題/分區。

    +
    +

    Pulsar

    Pulsar 將計算和儲存分開。您可以獨立增加 Pulsar 代理伺服器(運算)和 Pulsar 帳戶(儲存)的容量。

    +

    增加每個 Pulsar 代理 pod 的資源

    # new-values.yaml
    +pulsar:
    +  broker:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    增加每個 Pulsar 莊家 pod 的資源

    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    resources:
    +       limits:
    +         cpu: 4
    +         memory: 16Gi
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    您也可以透過手動變更每個 Pulsar 書籤管理員的 Persistent Volume Claim (PVC) 的值spec.resources.requests.storage 來增加 Pulsar 叢集的磁碟容量。請注意,您的預設儲存類別應允許卷擴充。

    +

    Pulsar bookie pod 有兩種儲存類型:journallegers 。對於journal 儲存類型,請考慮使用ssdgp3 作為儲存類別。以下是為 Pulsar 日誌指定儲存類別的範例。

    +
    pulsar:
    +  bookkeeper:
    +    volumes:
    +      journal:
    +        size: 20Gi
    +        storageClassName: gp3
    +
    +

    新增額外的 Pulsar 代理 pod

    # new-values.yaml
    +pulsar:
    +  broker:
    +    replicaCount: 3
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
    # new-values.yaml
    +pulsar:
    +  bookkeeper:
    +    replicaCount: 3
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    etcd

    # new-values.yaml
    +etcd:
    +  resources:
    +     limits:
    +       cpu: 2
    +       memory: 8Gi
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +

    增加額外的 etcd pod

    etcd pod 的總數應為奇數。

    +
    # new-values.yaml
    +etcd:
    +  replicaCount: 5
    +
    +

    儲存檔案後,使用下列指令套用變更:

    +
    helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.json b/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.json new file mode 100644 index 000000000..95c360401 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.json @@ -0,0 +1 @@ +{"codeList":["NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 1m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 1m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 1m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 1m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 1m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 1m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 1m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 1m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 1m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 1m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 1m \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-czq9f 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-jcdcn 1/1 Running 0 5s\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 2m\nmy-release-milvus-datacoord-7b5d84d8c6-rzjml 1/1 Running 0 2m\nmy-release-milvus-datanode-665d4586b9-525pm 1/1 Running 0 2m\nmy-release-milvus-indexcoord-9669d5989-kr5cm 1/1 Running 0 2m\nmy-release-milvus-indexnode-b89cc5756-xbpbn 1/1 Running 0 2m\nmy-release-milvus-proxy-7cbcc8ffbc-4jn8d 1/1 Running 0 2m\nmy-release-milvus-pulsar-6b9754c64d-4tg4m 1/1 Running 0 2m\nmy-release-milvus-querycoord-75f6c789f8-j28bg 1/1 Running 0 2m\nmy-release-milvus-querynode-7c7779c6f8-pnjzh 1/1 Running 0 2m\nmy-release-milvus-rootcoord-75585dc57b-cjh87 1/1 Running 0 2m\nmy-release-minio-5564fbbddc-9sbgv 1/1 Running 0 2m\n"],"headingContent":"Scale a Milvus Cluster","anchorList":[{"label":"擴充 Milvus 集群","href":"Scale-a-Milvus-Cluster","type":1,"isActive":false},{"label":"什麼是水平縮放?","href":"What-is-horizontal-scaling","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"擴充 Milvus 叢集","href":"Scale-a-Milvus-cluster","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.md b/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.md new file mode 100644 index 000000000..537b8a116 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/scaleout.md @@ -0,0 +1,181 @@ +--- +id: scaleout.md +related_key: scale Milvus cluster +summary: 學習如何在 Milvus 集群中手動或自動縮放和擴展。 +title: 擴充 Milvus 集群 +--- +

    擴充 Milvus 集群

    Milvus 支援其元件的水平擴充。這意味著您可以根據自己的需要,增加或減少每種類型的工作節點數量。

    +

    本主題將介紹如何擴展 Milvus 叢集。我們假設您在擴充之前已經安裝了 Milvus 叢集。此外,我們建議您在開始之前先熟悉Milvus 架構

    +

    本教學以擴充三個查詢節點為例。若要縮放其他類型的節點,請在命令列中以對應的節點類型取代queryNode

    +
    +

    有关如何使用 Milvus Operator 扩展群集的信息,请参阅使用 Milvus Operator 扩展群集

    +
    +

    什麼是水平縮放?

    水平縮放包括縮出和縮入。

    +

    縮放

    縮放是指增加叢集中的節點數量。與擴充不同的是,向外擴充不需要您為群集中的一個節點分配更多的資源。相反,縮放是透過增加節點來水平擴展群集。

    +

    + + Scaleout + 縮放

    +

    + + Scaleup + 擴充

    +

    根據Milvus 架構,無狀態工作節點包括查詢節點、資料節點、索引節點和代理。因此,您可以擴展這些類型的節點,以滿足您的業務需求和應用場景。您可以手動或自動縮放 Milvus 集群。

    +

    一般而言,如果您建立的 Milvus 叢集使用率過高,您就需要將其縮減。以下是一些可能需要縮減 Milvus 叢集的典型情況:

    +
      +
    • CPU 和記憶體使用率在一段時間內偏高。
    • +
    • 查詢吞吐量變高。
    • +
    • 需要更高的索引速度。
    • +
    • 需要處理大量的大型資料集。
    • +
    • 需要確保 Milvus 服務的高可用性。
    • +
    +

    向內擴展

    向內擴充是指減少叢集中的節點數量。一般來說,如果您所建立的 Milvus 叢集使用率不足,您就需要擴充叢集。以下是一些需要擴充 Milvus 叢集的典型情況:

    +
      +
    • CPU 和記憶體使用率在一段時間內偏低。
    • +
    • 查詢吞吐量變低。
    • +
    • 不需要更高的索引速度。
    • +
    • 要處理的資料集大小很小。
    • +
    +
    +我們不建議大幅減少工作者節點的數量。例如,如果群集中有五個資料節點,我們建議每次減少一個資料節點,以確保服務可用性。如果第一次嘗試縮放之後,服務是可用的,您可以繼續進一步減少資料節點的數量。
    +

    先決條件

    執行kubectl get pods 以取得您建立的 Milvus 叢集中的元件清單及其工作狀態。

    +
    NAME                                            READY   STATUS       RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running      0          1m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running      0          1m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running      0          1m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running      0          1m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running      0          1m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running      0          1m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running      0          1m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running      0          1m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running      0          1m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running      0          1m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running      0          1m 
    +
    +
    +Milvus 只支援新增工作節點,不支援新增協調器元件。
    +

    擴充 Milvus 叢集

    您可以手動或自動擴充 Milvus 叢集。如果啟用自動擴充,當 CPU 和記憶體資源消耗達到您設定的值時,Milvus 叢集會自動縮小或擴大。

    +

    目前,Milvus 2.1.0 只支援手動縮放。

    +

    縮放

    執行helm upgrade my-release milvus/milvus --set queryNode.replicas=3 --reuse-values 來手動縮放查詢節點。

    +

    如果成功,查詢節點上會新增三個執行中的 Pod,如以下範例所示。

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-czq9f    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-jcdcn    1/1     Running   0          5s
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    縮放

    執行helm upgrade my-release milvus/milvus --set queryNode.replicas=1 --reuse-values 以擴充查詢節點。

    +

    如果成功,查詢節點上的三個執行中 Pod 將減少為一個,如以下範例所示。

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          2m
    +my-release-milvus-datacoord-7b5d84d8c6-rzjml    1/1     Running   0          2m
    +my-release-milvus-datanode-665d4586b9-525pm     1/1     Running   0          2m
    +my-release-milvus-indexcoord-9669d5989-kr5cm    1/1     Running   0          2m
    +my-release-milvus-indexnode-b89cc5756-xbpbn     1/1     Running   0          2m
    +my-release-milvus-proxy-7cbcc8ffbc-4jn8d        1/1     Running   0          2m
    +my-release-milvus-pulsar-6b9754c64d-4tg4m       1/1     Running   0          2m
    +my-release-milvus-querycoord-75f6c789f8-j28bg   1/1     Running   0          2m
    +my-release-milvus-querynode-7c7779c6f8-pnjzh    1/1     Running   0          2m
    +my-release-milvus-rootcoord-75585dc57b-cjh87    1/1     Running   0          2m
    +my-release-minio-5564fbbddc-9sbgv               1/1     Running   0          2m
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/tls.json b/localization/v2.5.x/site/zh-hant/adminGuide/tls.json new file mode 100644 index 000000000..86db3e2f0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/tls.json @@ -0,0 +1 @@ +{"codeList":["openssl version\n","sudo apt install openssl\n","mkdir cert && cd cert\ntouch gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out ca.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# create a new ca certificate\nopenssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n","chmod +x gen.sh\n./gen.sh\n","#!/usr/bin/env sh\n# your variables\nCountry=\"US\"\nState=\"CA\"\nLocation=\"Redwood City\"\nOrganization=\"zilliz\"\nOrganizationUnit=\"devops\"\nCommonName=\"localhost\"\nExpireDays=3650 # 10 years\n\n# generate private key for ca, server and client\nopenssl genpkey -quiet -algorithm rsa:2048 -out server.key\nopenssl genpkey -quiet -algorithm rsa:2048 -out client.key\n\n# prepare extension config for signing certificates\necho '[v3_req]\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\nsubjectAltName = @alt_names\n[alt_names]\nDNS = '$CommonName > openssl.cnf\n\n# sign server certificate with ca\nopenssl req -new -key server.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n\n# sign client certificate with ca\nopenssl req -new -key client.key\\\n -subj \"/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName\"\\\n | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \\\n -extfile ./openssl.cnf -extensions v3_req\n","chmod +x renew.sh\n./renew.sh\n","proxy:\n http:\n # for now milvus do not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \ntls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n tlsMode: 1\n","internaltls:\n serverPemPath: /milvus/tls/server.pem\n serverKeyPath: /milvus/tls/server.key\n caPemPath: /milvus/tls/ca.pem\n\ncommon:\n security:\n internaltlsEnabled: true \n","├── docker-compose.yml\n├── milvus.yaml\n└── tls\n ├── server.pem\n ├── server.key\n └── ca.pem\n"," standalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:latest\n command: [\"milvus\", \"run\", \"standalone\"]\n security_opt:\n - seccomp:unconfined\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n volumes:\n - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus\n - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls\n - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml\n","sudo docker compose up -d\n","├── milvus.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n config:\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost # the CommonName in your certificates\n components:\n # mount the certs secret to the milvus container\n volumes:\n - name: certs\n secret:\n secretName: certs\n volumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","kubectl create -f milvus.yaml\n","├── values.yaml (to be created later)\n├── server.pem\n├── server.key\n└── ca.pem\n","kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem\n","extraConfigFiles:\n user.yaml: |+\n proxy:\n http:\n # for now not support config restful on same port with grpc\n # so we set to 8080, grpc will still use 19530\n port: 8080 \n common:\n security:\n tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS\n # Configure tls certificates path for external service\n tls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","extraConfigFiles:\n user.yaml: |+\n common:\n security:\n internaltlsEnabled: true # whether to enable internal tls\n # Configure tls certificates path for internal service\n internaltls:\n serverPemPath: /certs/server.pem\n serverKeyPath: /certs/server.key\n caPemPath: /certs/ca.pem\n sni: localhost\n# mount the certs secret to the milvus container\nvolumes:\n - name: certs\n secret:\n secretName: certs\nvolumeMounts:\n - name: certs\n mountPath: /certs\n readOnly: true\n","helm repo add milvus https://zilliztech.github.io/milvus-helm/\nhelm repo update milvus\nhelm install my-release milvus/milvus -f values.yaml\n","[...date time...] [INFO] [utils/util.go:56] [\"Internal TLS Enabled\"] [value=true]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n server_pem_path=\"path_to/server.pem\",\n server_name=\"localhost\"\n)\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\n uri=\"https://localhost:19530\",\n secure=True,\n client_pem_path=\"path_to/client.pem\",\n client_key_path=\"path_to/client.key\",\n ca_pem_path=\"path_to/ca.pem\",\n server_name=\"localhost\"\n)\n","curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n","curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list\n"],"headingContent":"Encryption in Transit","anchorList":[{"label":"傳輸中的加密","href":"Encryption-in-Transit","type":1,"isActive":false},{"label":"建立你自己的證書","href":"Create-your-own-certificate","type":2,"isActive":false},{"label":"使用 TLS 設定 Milvus 伺服器","href":"Set-up-a-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"驗證內部 TLS 已啟用","href":"Verify-Internal-TLS-enabled","type":2,"isActive":false},{"label":"使用 TLS 連線到 Milvus 伺服器","href":"Connect-to-the-Milvus-server-with-TLS","type":2,"isActive":false},{"label":"使用 TLS 連線到 Milvus RESTful 伺服器","href":"Connect-to-the-Milvus-RESTful-server-with-TLS","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/tls.md b/localization/v2.5.x/site/zh-hant/adminGuide/tls.md new file mode 100644 index 000000000..2d78586ba --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/tls.md @@ -0,0 +1,449 @@ +--- +id: tls.md +title: 傳輸中的加密 +summary: 了解如何在 Milvus 中啟用 TLS 代理。 +--- +

    傳輸中的加密

    TLS(傳輸層安全)是一種加密協議,以確保通訊安全。Milvus 代理使用 TLS 單向和雙向認證。

    +

    本主題描述如何在 Milvus 代理中為 gRPC 和 RESTful 流量啟用 TLS。

    +
    +

    TLS 和用戶認證是兩種不同的安全方法。如果你在 Milvus 系統中同時啟用了用戶認證和 TLS,你將需要提供用戶名、密碼和證書檔路徑。有關如何啟用使用者驗證的資訊,請參考驗證使用者存取

    +
    +

    建立你自己的證書

    先決條件

    確定已安裝 OpenSSL。如果尚未安裝,請先建立並安裝OpenSSL。

    +
    openssl version
    +
    +

    如果未安裝 OpenSSL。可在 Ubuntu 中使用下列指令安裝。

    +
    sudo apt install openssl
    +
    +

    建立檔案

      +
    1. 建立gen.sh 檔案。
    2. +
    +
    mkdir cert && cd cert
    +touch gen.sh
    +
    +
      +
    1. 將下列腳本複製到gen.sh
    2. +
    +

    有必要在gen.sh 檔案中設定CommonNameCommonName 指的是客戶端在連線時應指定的伺服器名稱。

    +

    gen.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out ca.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# create a new ca certificate
    +openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.pem \
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +
    +

    +

    gen.sh 檔案中的變數對建立證書簽章請求檔案的過程至關重要。前五個變數是基本的簽署資訊,包括國家、州、地點、組織、組織單位。配置CommonName 時必須謹慎,因為它會在客戶端與伺服器通訊期間進行驗證。

    +

    執行gen.sh 以產生憑證

    執行gen.sh 檔案以建立憑證。

    +
    chmod +x gen.sh
    +./gen.sh
    +
    +

    將會建立下列七個檔案:ca.key,ca.pem,ca.srl,server.key,server.pem,client.key,client.pem

    +

    請務必確保ca.key,ca.pem,ca.srl 的安全,以便稍後更新您的憑證。server.keyserver.pem 檔案供伺服器使用,而client.keyclient.pem 檔案供用戶端使用。

    +

    更新憑證 (選用)

    如果您想在某些情況下更新證書,例如證書即將過期,您可以使用下列腳本。

    +

    您的工作目錄中需要ca.key,ca.pem,ca.srl

    +

    renew.sh

    +
    #!/usr/bin/env sh
    +# your variables
    +Country="US"
    +State="CA"
    +Location="Redwood City"
    +Organization="zilliz"
    +OrganizationUnit="devops"
    +CommonName="localhost"
    +ExpireDays=3650 # 10 years
    +
    +# generate private key for ca, server and client
    +openssl genpkey -quiet -algorithm rsa:2048 -out server.key
    +openssl genpkey -quiet -algorithm rsa:2048 -out client.key
    +
    +# prepare extension config for signing certificates
    +echo '[v3_req]
    +basicConstraints = CA:FALSE
    +keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    +extendedKeyUsage = serverAuth
    +subjectAltName = @alt_names
    +[alt_names]
    +DNS = '$CommonName > openssl.cnf
    +
    +# sign server certificate with ca
    +openssl req -new -key server.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out server.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +# sign client certificate with ca
    +openssl req -new -key client.key\
    +  -subj "/C=$Country/ST=$State/L=$Location/O=$Organization/OU=$OrganizationUnit/CN=$CommonName"\
    +  | openssl x509 -req -days $ExpireDays -out client.pem -CA ca.pem -CAkey ca.key -CAcreateserial \
    +    -extfile ./openssl.cnf -extensions v3_req
    +
    +

    +

    執行renew.sh 檔案來建立證書。

    +
    chmod +x renew.sh
    +./renew.sh
    +
    +

    使用 TLS 設定 Milvus 伺服器

    本節概述使用 TLS 加密設定 Milvus 伺服器的步驟。

    +

    為 Docker Compose 設定

    1.修改 Milvus 伺服器設定

    要啟用外部 TLS,請在milvus.yaml 檔案中加入下列配置:

    +
    proxy:
    +  http:
    +    # for now milvus do not support config restful on same port with grpc
    +    # so we set to 8080, grpc will still use 19530
    +    port: 8080 
    +tls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    tlsMode: 1
    +
    +

    參數:

    +
      +
    • serverPemPath:伺服器證書檔案的路徑。
    • +
    • serverKeyPath:伺服器金鑰檔案的路徑。
    • +
    • caPemPath:CA 憑證檔案的路徑。
    • +
    • tlsMode:外部服務的 TLS 模式。有效值:
        +
      • 1:單向驗證,只有伺服器需要憑證,用戶端驗證憑證。此模式需要伺服器端提供server.pemserver.key ,用戶端提供server.pem
      • +
      • 2:雙向認證:伺服器和用戶端都需要憑證才能建立安全連線。此模式需要伺服器端的server.pem,server.key, 和ca.pem ,以及用戶端的client.pem,client.key, 和ca.pem
      • +
    • +
    +

    若要啟用內部 TLS,請在milvus.yaml 檔案中加入下列設定:

    +
    internaltls:
    +  serverPemPath: /milvus/tls/server.pem
    +  serverKeyPath: /milvus/tls/server.key
    +  caPemPath: /milvus/tls/ca.pem
    +
    +common:
    +  security:
    +    internaltlsEnabled: true 
    +
    +

    參數:

    +
      +
    • serverPemPath:伺服器證書檔案的路徑。
    • +
    • serverKeyPath:伺服器金鑰檔案的路徑。
    • +
    • caPemPath:CA 憑證檔案的路徑。
    • +
    • internaltlsEnabled:是否啟用內部 TLS。目前只支援單向 TLS。
    • +
    +

    2.將憑證檔案映射到容器

    準備證書檔案

    在與您的docker-compose.yaml 相同的目錄下建立一個名為tls 的新資料夾。將server.pemserver.keyca.pem 複製到tls 資料夾。將它們放置在如下的目錄結構中:

    +
    ├── docker-compose.yml
    +├── milvus.yaml
    +└── tls
    +     ├── server.pem
    +     ├── server.key
    +     └── ca.pem
    +
    +

    更新 Docker Compose 配置

    編輯docker-compose.yaml 檔案以對應容器內的憑證檔案路徑,如下所示:

    +
      standalone:
    +    container_name: milvus-standalone
    +    image: milvusdb/milvus:latest
    +    command: ["milvus", "run", "standalone"]
    +    security_opt:
    +    - seccomp:unconfined
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +    volumes:
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/tls:/milvus/tls
    +      - ${DOCKER_VOLUME_DIRECTORY:-.}/milvus.yaml:/milvus/configs/milvus.yaml
    +
    +
    使用 Docker Compose 部署 Milvus

    執行下列指令部署 Milvus:

    +
    sudo docker compose up -d
    +
    +

    為 Milvus 操作員設定

    將憑證檔案放到您的工作目錄中。目錄結構應如下所示:

    +
    ├── milvus.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    使用證書檔案建立一個秘密:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    若要啟用外部 TLS,請在milvus.yaml 檔案中加入下列設定:

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 for one-way TLS, 2 for Mutual TLS, 0 for disable
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    要啟用內部 TLS,請在milvus.yaml 檔案中加入下列設定:

    +

    記住在證書中以 CommonName 取代internaltls.sni 欄位。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  config:
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost # the CommonName in your certificates
    +  components:
    +    # mount the certs secret to the milvus container
    +    volumes:
    +      - name: certs
    +        secret:
    +          secretName: certs
    +    volumeMounts:
    +      - name: certs
    +        mountPath: /certs
    +        readOnly: true
    +
    +

    建立 Milvus CR:

    +
    kubectl create -f milvus.yaml
    +
    +

    設定為 Milvus Helm

    把證書檔案放到你的工作目錄。目錄結構應該是這樣的

    +
    ├── values.yaml (to be created later)
    +├── server.pem
    +├── server.key
    +└── ca.pem
    +
    +

    使用證書檔案建立一個秘密:

    +
    kubectl create secret generic certs --from-file=server.pem --from-file=server.key --from-file=ca.pem
    +
    +

    若要啟用外部 TLS,請在values.yaml 檔案中加入下列設定:

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    proxy:
    +      http:
    +        # for now not support config restful on same port with grpc
    +        # so we set to 8080, grpc will still use 19530
    +        port: 8080 
    +    common:
    +      security:
    +        tlsMode: 1 # tlsMode for external service 1 means set to 2 to enable Mutual TLS
    +    # Configure tls certificates path for external service
    +    tls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    要啟用內部 TLS,請在values.yaml 檔案中加入下列設定:

    +

    切記在憑證中以 CommonName 取代internaltls.sni 欄位。

    +
    extraConfigFiles:
    +  user.yaml: |+
    +    common:
    +      security:
    +        internaltlsEnabled: true # whether to enable internal tls
    +    # Configure tls certificates path for internal service
    +    internaltls:
    +      serverPemPath: /certs/server.pem
    +      serverKeyPath: /certs/server.key
    +      caPemPath: /certs/ca.pem
    +      sni: localhost
    +# mount the certs secret to the milvus container
    +volumes:
    +  - name: certs
    +    secret:
    +      secretName: certs
    +volumeMounts:
    +  - name: certs
    +    mountPath: /certs
    +    readOnly: true
    +
    +

    建立 milvus 版本:

    +
    helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +helm repo update milvus
    +helm install my-release milvus/milvus -f values.yaml
    +
    +

    驗證內部 TLS 已啟用

    很難直接驗證內部 TLS。你可以檢查 Milvus 日誌,看看內部 TLS 是否啟用。

    +

    在 Milvus 日誌中,如果內部 TLS 已啟用,你應該會看到以下訊息:

    +
    [...date time...] [INFO] [utils/util.go:56] ["Internal TLS Enabled"] [value=true]
    +
    +

    使用 TLS 連線到 Milvus 伺服器

    對於 SDK 互動,根據 TLS 模式使用下列設定。

    +

    單向 TLS 連線

    提供server.pem 的路徑,並確保server_name 與證書中設定的CommonName 吻合。

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    server_pem_path="path_to/server.pem",
    +    server_name="localhost"
    +)
    +
    +

    雙向 TLS 連線

    提供client.pem,client.key, 和ca.pem 的路徑,並確保server_name 與證書中設定的CommonName 吻合。

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient(
    +    uri="https://localhost:19530",
    +    secure=True,
    +    client_pem_path="path_to/client.pem",
    +    client_key_path="path_to/client.key",
    +    ca_pem_path="path_to/ca.pem",
    +    server_name="localhost"
    +)
    +
    +

    更多資訊請參閱example_tls1.pyexample_tls2. py

    +

    使用 TLS 連線到 Milvus RESTful 伺服器

    對於 RESTful API,您可以使用curl 指令檢查 tls。

    +

    單向 TLS 連線

    curl --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    +

    雙向 TLS 連線

    curl --cert path_to/client.pem --key path_to/client.key --cacert path_to/ca.pem https://localhost:8080/v2/vectordb/collections/list
    +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.json new file mode 100644 index 000000000..23b569ac9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.json @@ -0,0 +1 @@ +{"codeList":["kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​\n","[1] 8116​\nForwarding from 127.0.0.1:9091 -> 9091​\n\n","pid=8116​\n\n","curl 127.0.0.1:9091/api/v1/collections \\​\n|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\\​\n|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \\​\n> flushing_segments.json​\ncat flushing_segments.json​\n\n","{​\n \"segmentIDs\": [​\n 454097953998181000,​\n 454097953999383600,​\n 454097953998180800​\n ]​\n}​\n\n","cat flushing_segments.json| curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​\n\n","{\"status\":{},\"flushed\":true}​\n\n","kill $pid​\n\n","[1] + 8116 terminated kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 ​\n\n","helm -n default get values my-release -o yaml > values.yaml​\ncat values.yaml​\n\n","helm -n default uninstall my-release​\n\n","These resources were kept due to the resource policy:​\n[PersistentVolumeClaim] my-release-minio​\n​\nrelease \"my-release\" uninstalled​\n\n","kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​\nkubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​\necho \"Volume Claims:\"​\ncat pulsar-pvcs.txt​\necho \"Volumes:\"​\ncat pulsar-pvs.txt​\n\n","Volume Claims:​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​\nmy-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​\nmy-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​\nVolumes:​\npvc-f590a4de-df31-4ca8-a424-007eac3c619a​\npvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​\npvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​\npvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​\npvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​\n\n","cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","persistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0\" deleted​\npersistentvolumeclaim \"my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1\" deleted​\npersistentvolumeclaim \"my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0\" deleted​\n\n","cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​\n\n","Error from server (NotFound): persistentvolumeclaims \"pvc-f590a4de-df31-4ca8-a424-007eac3c619a\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf\" not found​\nError from server (NotFound): persistentvolumeclaims \"pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a\" not found​\n\n","kubectl -n default get milvus my-release -o yaml > milvus.yaml​\nhead milvus.yaml -n 20​\n\n","apiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations:​\n milvus.io/dependency-values-merged: \"true\"​\n milvus.io/pod-service-label-added: \"true\"​\n milvus.io/querynode-current-group-id: \"0\"​\n creationTimestamp: \"2024-11-22T08:06:59Z\"​\n finalizers:​\n - milvus.milvus.io/finalizer​\n generation: 3​\n labels:​\n app: milvus​\n milvus.io/operator-version: 1.1.2​\nname: my-release​\nnamespace: default​\nresourceVersion: \"692217324\"​\nuid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​\nspec:​\n components:​\n\n","# a patch to retain etcd & storage data and delete pulsar data while delete milvus​\nspec:​\n dependencies:​\n etcd:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n storage:​\n inCluster:​\n deletionPolicy: Retain​\n pvcDeletion: false​\n pulsar:​\n inCluster:​\n deletionPolicy: Delete​\n pvcDeletion: true​\n\n","kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​\n\n","milvus.milvus.io/my-release patched​\n\n","kubectl -n default delete milvus my-release --wait=false​\nkubectl -n default get milvus my-release​\nkubectl -n default delete milvus my-release --wait=true​\n\n","milvus.milvus.io \"my-release\" deleted​\nNAME MODE STATUS UPDATED AGE​\nmy-release cluster Deleting True 41m​\nmilvus.milvus.io \"my-release\" deleted​\n\n","kubectl -n default get milvus my-release​\n\n","No resources found in default namespace.​\n\n","# change the following:​\npulsar:​\n enabled: false # set to false​\n # you may also clean up rest fields under pulsar field​\n # it's ok to keep them though.​\npulsarv3:​\n enabled: true​\n # append other values for pulsar v3 chart if needs​\n\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm​\nhelm repo update zilliztech​\n\n","\"zilliztech\" already exists with the same configuration, skipping​\nHang tight while we grab the latest from your chart repositories...​\n...Successfully got an update from the \"zilliztech\" chart repository​\nUpdate Complete. ⎈Happy Helming!⎈​\n\n","helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​\n\n","NAME: my-release​\nLAST DEPLOYED: Fri Nov 22 15:31:27 2024​\nNAMESPACE: default​\nSTATUS: deployed​\nREVISION: 1​\nTEST SUITE: None​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 4m3s​\nmy-release-milvus-datanode-56487bc4bc-s6mbd 1/1 Running 0 4m5s​\nmy-release-milvus-indexnode-6476894d6-rv85d 1/1 Running 0 4m5s​\nmy-release-milvus-mixcoord-6d8875cb9c-67fcq 1/1 Running 0 4m4s​\nmy-release-milvus-proxy-7bc45d57c5-2qf8m 1/1 Running 0 4m4s​\nmy-release-milvus-querynode-77465747b-kt7f4 1/1 Running 0 4m4s​\nmy-release-minio-684ff4f5df-pnc97 1/1 Running 0 4m5s​\nmy-release-pulsarv3-bookie-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-1 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-2 1/1 Running 0 4m3s​\nmy-release-pulsarv3-bookie-init-6z4tk 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-broker-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-broker-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-proxy-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-pulsar-init-wvqpc 0/1 Completed 0 4m1s​\nmy-release-pulsarv3-recovery-0 1/1 Running 0 4m3s​\nmy-release-pulsarv3-zookeeper-0 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-1 1/1 Running 0 4m2s​\nmy-release-pulsarv3-zookeeper-2 1/1 Running 0 4m2s​\n\n","# change the followings fields:​\napiVersion: milvus.io/v1beta1​\nkind: Milvus​\nmetadata:​\n annotations: null # this field should be removed or set to null​\n resourceVersion: null # this field should be removed or set to null​\n uid: null # this field should be removed or set to null​\nspec:​\n dependencies:​\n pulsar:​\n inCluster:​\n chartVersion: pulsar-v3​\n # delete all previous values for pulsar v2 and set it to null.​\n # you may add additional values here for pulsar v3 if you're sure about it.​\n values: null​\n\n","helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​\nhelm repo update milvus-operator​\nhelm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​\n\n","kubectl create -f milvus.yaml​\n\n","milvus.milvus.io/my-release created​\n\n","NAME READY STATUS RESTARTS AGE​\nmy-release-etcd-0 1/1 Running 0 65m​\nmy-release-milvus-datanode-57fd59ff58-5mdrk 1/1 Running 0 93s​\nmy-release-milvus-indexnode-67867c6b9b-4wsbw 1/1 Running 0 93s​\nmy-release-milvus-mixcoord-797849f9bb-sf8z5 1/1 Running 0 93s​\nmy-release-milvus-proxy-5d5bf98445-c55m6 1/1 Running 0 93s​\nmy-release-milvus-querynode-0-64797f5c9-lw4rh 1/1 Running 0 92s​\nmy-release-minio-79476ccb49-zvt2h 1/1 Running 0 65m​\nmy-release-pulsar-bookie-0 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-1 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-2 1/1 Running 0 5m10s​\nmy-release-pulsar-bookie-init-v8fdj 0/1 Completed 0 5m11s​\nmy-release-pulsar-broker-0 1/1 Running 0 5m11s​\nmy-release-pulsar-broker-1 1/1 Running 0 5m10s​\nmy-release-pulsar-proxy-0 1/1 Running 0 5m11s​\nmy-release-pulsar-proxy-1 1/1 Running 0 5m10s​\nmy-release-pulsar-pulsar-init-5lhx7 0/1 Completed 0 5m11s​\nmy-release-pulsar-recovery-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-0 1/1 Running 0 5m11s​\nmy-release-pulsar-zookeeper-1 1/1 Running 0 5m10s​\nmy-release-pulsar-zookeeper-2 1/1 Running 0 5m10s​\n\n"],"headingContent":"Upgrading Pulsar ​","anchorList":[{"label":"升級 Pulsar","href":"Upgrading-Pulsar-​","type":1,"isActive":false},{"label":"路線圖","href":"Roadmap","type":2,"isActive":false},{"label":"步驟","href":"Procedures","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.md new file mode 100644 index 000000000..866e65f3e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade-pulsar-v3.md @@ -0,0 +1,425 @@ +--- +id: upgrade-pulsar-v3.md +related_key: upgrade pulsar v3 +summary: 了解如何在 Milvus 中將 Pulsar 從 V2 升級到 V3,以便使用最新版本的 Milvus v2.5.x。 +title: 將 Milvus 的 Pulsar 從 V2 升級至 V3 +--- +

    升級 Pulsar

    本文將介紹如何將 Pulsar 從 V2 升級到 V3。

    +

    自 Milvus v2.5 起,milvus-helmmilvus-operator將默認使用 Pulsar V3,以修復一些錯誤和安全漏洞。 雖然 Milvus 2.5 與 Pulsar 2.x 相容,升級到 Pulsar V3 是可選的。為了增強穩定性和性能,我們建議升級到 Pulsar V3。

    +

    如果您喜歡使用 Pulsar V2 與 Milvus v2.5.x,請閱讀使用 Pulsar V2 與 Milvus v2.5.x

    +
    +
      +
    1. 升級過程需要一個短暫的服務中斷(通常需要大約幾分鐘到十幾分鐘,取決於數據量)。

    2. +
    3. 在操作之前,您需要停止所有正在運行的用戶端向 Milvus 寫入數據。否則,寫入的資料可能會遺失。

    4. +
    5. 本文假設 Milvus 安裝在命名空間default 並命名為my-release 。請在執行從本頁複製的指令時,將參數變更為您自己的命名空間和發行版名稱。

    6. +
    7. 確保您的工作環境在 Kubernetes 叢集的上述命名空間下有權限,並安裝下列指令。

      +

      a.kubectl >= 1.20

      +

      b.helm >= 3.14.0

      +

      c.cat,grep,awk 進行字串操作

      +

      d.curlAttu v2.4+用於與 milvus 管理 API 進行互動

    8. +
    +
    +

    路線圖

    升級過程包括以下步驟:

    +
      +
    1. 持久保存 pulsar 中未消耗的資料。

    2. +
    3. 停止 Milvus 並刪除 pulsar V2。

    4. +
    5. 啟動 Pulsar V3 和 Milvus。

    6. +
    +

    步驟

    本節提供在 Milvus 中將 Pulsar 從 V2 升級到 V3 的詳細步驟。

    +

    持久化 Pulsar 中未消耗的資料

    在這個步驟中,您需要確保 Pulsar 中現有的資料已持久化到物件儲存服務。 有兩種方法可用,您可以選擇適合您需求的方法。

    +

    方法 1:使用 Attu

    如果您的工作 Milvus 部署中只有少量的集合,且分段不多,您可以使用 Attu 將資料持久化到物件儲存服務。

    +
      +
    1. 選取所有資料庫中的每個集合,進入Segments 面板,按一下Flush 按鈕。

      +

      + + Segment panel of a collection + 集合的區段面板

    2. +
    3. 然後在彈出視窗時,再次按一下Flush

      +

      + + Data flush prompt in Attu + 在 Attu 中的資料沖洗提示

    4. +
    5. 然後等到所有資料集的 Persistent Segment 狀態都是Flushed

      +

      + + View data flush status in Attu + 在 Attu 中檢視資料刷新狀態

    6. +
    +

    方法 2:使用管理 API

      +
    1. 將 Milvus proxy 的 9091 埠代理到本機主機,以進行後續操作。

      +
      kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091 &​
      +
      +

      輸出。

      +
      [1] 8116​
      +Forwarding from 127.0.0.1:9091 -> 9091​
      +
      +
    2. +
    3. 儲存 Pid 以便稍後清理。

      +
      pid=8116​
      +
      +
    4. +
    5. 觸發將所有插入的資料從 Pulsar 持久化到 Ojbect Storage 的動作。

      +
      curl 127.0.0.1:9091/api/v1/collections \​
      +|curl 127.0.0.1:9091/api/v1/persist -d @/dev/stdin\​
      +|jq '.flush_coll_segIDs'| jq '[.[] | .data[]]' | jq '{segmentIDs: (.)}' \​
      +> flushing_segments.json​
      +cat flushing_segments.json​
      +
      +
      +

      輸出。

      +
      {​
      +  "segmentIDs": [​
      +    454097953998181000,​
      +    454097953999383600,​
      +    454097953998180800​
      +  ]​
      +}​
      +
      +
    6. +
    7. 檢查刷新的所有區段。

      +
      cat flushing_segments.json|  curl -X GET 127.0.0.1:9091/api/v1/persist/state -d @/dev/stdin ​
      +
      +
      +

      完成後,您應該會看到下列輸出

      +
      {"status":{},"flushed":true}​
      +
      +
    8. +
    9. 停止後台kubectl port-forward 程序

      +
      kill $pid​
      +
      +
      +

      輸出。

      +
      [1]  + 8116 terminated  kubectl -n default port-forward deploy/my-release-milvus-proxy 9091:9091                      ​
      +
      +
    10. +
    +

    停止 Milvus 並刪除 Pulsar V2

    在這個步驟中,您需要停止 Milvus pod 並刪除 Pulsar V2 部署。 有兩個獨立的部分可供使用:

    + +

    使用 Helm 刪除 Pulsar V2

    如果你已經使用 Milvus Helm 圖表安裝 Milvus,按照以下步驟停止 Milvus pod 並刪除 Pulsar V2 部署。

    +
      +
    1. 儲存目前的 Milvus 發行值到values.yaml ,以便日後恢復。

      +
      helm -n default get values my-release -o yaml > values.yaml​
      +cat values.yaml​
      +
      +
    2. +
    3. 使用指令停止 Milvus 及所有相依性。不用擔心資料卷,預設會保留它們。

      +
      helm -n default uninstall my-release​
      +
      +
      +

      輸出

      +
      These resources were kept due to the resource policy:​
      +[PersistentVolumeClaim] my-release-minio​
      +​
      +release "my-release" uninstalled​
      +
      +
    4. +
    5. List pulsar PVCs & PVs (Persistent Volume Claims & Persistent Volume) 需要清除

      +
      kubectl -n default get pvc -lapp=pulsar,release=my-release |grep -v NAME |awk '{print $1}' > pulsar-pvcs.txt​
      +kubectl -n default get pvc -lapp=pulsar,release=my-release -o custom-columns=VOL:.spec.volumeName|grep -v VOL > pulsar-pvs.txt​
      +echo "Volume Claims:"​
      +cat pulsar-pvcs.txt​
      +echo "Volumes:"​
      +cat pulsar-pvs.txt​
      +
      +
      +

      輸出

      +
      Volume Claims:​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0​
      +my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1​
      +my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0​
      +Volumes:​
      +pvc-f590a4de-df31-4ca8-a424-007eac3c619a​
      +pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3​
      +pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b​
      +pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf​
      +pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a​
      +
      +
    6. +
    7. 檢查pulsar-pvcs.txt 的 PVC 清單是否全部為 Pulsar。一旦確認沒有錯誤,請刪除 PVC。

      +
      cat pulsar-pvcs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      輸出。

      +
      persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-journal-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-0" deleted​
      +persistentvolumeclaim "my-release-pulsar-bookie-ledgers-my-release-pulsar-bookie-1" deleted​
      +persistentvolumeclaim "my-release-pulsar-zookeeper-data-my-release-pulsar-zookeeper-0" deleted​
      +
      +
    8. +
    9. (可選)根據提供 PVC 的儲存類別,您可能還需要手動移除 PV。

      +
      cat pulsar-pvs.txt |xargs -I {} kubectl -n default delete pvc {} --wait=false​
      +
      +
      +

      如果它輸出 NotFound 錯誤,也沒關係。它已被 kubernetes 控制器刪除。

      +
      Error from server (NotFound): persistentvolumeclaims "pvc-f590a4de-df31-4ca8-a424-007eac3c619a" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-17b0e215-3e14-4d14-901e-1a1dda9ff5a3" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-72f83c25-6ea1-45ee-9559-0b783f2c530b" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-60dcb6e4-760d-46c7-af1a-d1fc153b0caf" not found​
      +Error from server (NotFound): persistentvolumeclaims "pvc-2da33f64-c053-42b9-bb72-c5d50779aa0a" not found​
      +
      +
    10. +
    +

    使用 Milvus 操作員刪除 Pulsar V2

    如果您已使用 Milvus Operator 安裝 Milvus,請依照下列步驟停止 Milvus Pod 並刪除 Pulsar V2 部署。

    +
      +
    1. 將目前的 Milvus Manifest 儲存至milvus.yaml ,以備日後使用。

      +
      kubectl -n default get milvus my-release -o yaml > milvus.yaml​
      +head milvus.yaml -n 20​
      +
      +
      +

      輸出。

      +
      apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations:​
      +    milvus.io/dependency-values-merged: "true"​
      +    milvus.io/pod-service-label-added: "true"​
      +    milvus.io/querynode-current-group-id: "0"​
      +  creationTimestamp: "2024-11-22T08:06:59Z"​
      +  finalizers:​
      +  - milvus.milvus.io/finalizer​
      +  generation: 3​
      +  labels:​
      +    app: milvus​
      +    milvus.io/operator-version: 1.1.2​
      +name: my-release​
      +namespace: default​
      +resourceVersion: "692217324"​
      +uid: 7a469ed0-9df1-494e-bd9a-340fac4305b5​
      +spec:​
      +  components:​
      +
      +
    2. +
    3. 建立patch.yaml 檔案,內容如下。

      +
      # a patch to retain etcd & storage data and delete pulsar data while delete milvus​
      +spec:​
      +  dependencies:​
      +    etcd:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    storage:​
      +      inCluster:​
      +        deletionPolicy: Retain​
      +        pvcDeletion: false​
      +    pulsar:​
      +      inCluster:​
      +        deletionPolicy: Delete​
      +        pvcDeletion: true​
      +
      +
    4. +
    5. 使用kubectl patch 保留 etcd & 儲存資料,並刪除 pulsar 資料,同時刪除 milvus。

      +
      kubectl -n default patch milvus my-release --patch-file patch.yaml --type=merge​
      +
      +
      +

      輸出。

      +
      milvus.milvus.io/my-release patched​
      +
      +
    6. +
    7. 停止 Milvus 並刪除脈衝星 V2。不用擔心 etcd 和 object 儲存資料卷,它們會被預設保留。

      +
      kubectl -n default delete milvus my-release --wait=false​
      +kubectl -n default get milvus my-release​
      +kubectl -n default delete milvus my-release --wait=true​
      +
      +
      +

      輸出:請注意,milvus 可能需要幾分鐘才能優雅地停止,操作員也可能需要幾分鐘才能刪除 pulsar 儲存空間。

      +
      milvus.milvus.io "my-release" deleted​
      +NAME         MODE      STATUS     UPDATED   AGE​
      +my-release   cluster   Deleting   True      41m​
      +milvus.milvus.io "my-release" deleted​
      +
      +
      +

      等待命令完成。

    8. +
    9. 再次檢查 Milvus 資源是否已消失。

      +
      kubectl -n default get milvus my-release​
      +
      +
      +

      輸出應該是

      +
      No resources found in default namespace.​
      +
      +
    10. +
    +

    啟動 Pulsar V3 和 Milvus

    在這個步驟中,您需要啟動 Pulsar V3 和 Milvus pods。 有兩個獨立的部分可供使用:

    +
      +
    • 給 Helm 使用者

      +

      如果您使用 Milvus Helm 圖表安裝 Milvus,請前往For Helm User

    • +
    • 給 Milvus 操作員使用者

      +

      如果您使用 Milvus Operator 安裝了 Milvus,請前往For Milvus Operator 使用者

    • +
    +

    啟動 Pulsar V3 並使用 Helm

      +
    1. 編輯上一步儲存的values.yaml

      +
      # change the following:​
      +pulsar:​
      +  enabled: false # set to false​
      +  # you may also clean up rest fields under pulsar field​
      +  # it's ok to keep them though.​
      +pulsarv3:​
      +  enabled: true​
      +  # append other values for pulsar v3 chart if needs​
      +
      +
    2. +
    3. 更新您的本機 helm repo

      +
      helm repo add zilliztech https://zilliztech.github.io/milvus-helm​
      +helm repo update zilliztech​
      +
      +
      +

      輸出

      +
      "zilliztech" already exists with the same configuration, skipping​
      +Hang tight while we grab the latest from your chart repositories...​
      +...Successfully got an update from the "zilliztech" chart repository​
      +Update Complete. ⎈Happy Helming!⎈​
      +
      +
    4. +
    5. 使用編輯好的values.yaml 安裝您的 milvus 版本與最新的 helm 圖表版本。

      +
      helm -n default install my-release zilliztech/milvus --reset-values -f values.yaml​
      +
      +
      +

      輸出

      +
      NAME: my-release​
      +LAST DEPLOYED: Fri Nov 22 15:31:27 2024​
      +NAMESPACE: default​
      +STATUS: deployed​
      +REVISION: 1​
      +TEST SUITE: None​
      +
      +
    6. +
    7. 檢查所有 Pod 是否都已排程並開始執行kubectl -n default get pods

      +

      所有 pod 可能需要幾分鐘才能啟動。

      +

      輸出如下。

      +
      NAME                                          READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                             1/1     Running     0          4m3s​
      +my-release-milvus-datanode-56487bc4bc-s6mbd   1/1     Running     0          4m5s​
      +my-release-milvus-indexnode-6476894d6-rv85d   1/1     Running     0          4m5s​
      +my-release-milvus-mixcoord-6d8875cb9c-67fcq   1/1     Running     0          4m4s​
      +my-release-milvus-proxy-7bc45d57c5-2qf8m      1/1     Running     0          4m4s​
      +my-release-milvus-querynode-77465747b-kt7f4   1/1     Running     0          4m4s​
      +my-release-minio-684ff4f5df-pnc97             1/1     Running     0          4m5s​
      +my-release-pulsarv3-bookie-0                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-1                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-2                  1/1     Running     0          4m3s​
      +my-release-pulsarv3-bookie-init-6z4tk         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-broker-0                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-broker-1                  1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-0                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-proxy-1                   1/1     Running     0          4m2s​
      +my-release-pulsarv3-pulsar-init-wvqpc         0/1     Completed   0          4m1s​
      +my-release-pulsarv3-recovery-0                1/1     Running     0          4m3s​
      +my-release-pulsarv3-zookeeper-0               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-1               1/1     Running     0          4m2s​
      +my-release-pulsarv3-zookeeper-2               1/1     Running     0          4m2s​
      +
      +
    8. +
    +

    啟動 Pulsar V3 並使用 Milvus Operator

      +
    1. 編輯上一步儲存的milvus.yaml

      +
      # change the followings fields:​
      +apiVersion: milvus.io/v1beta1​
      +kind: Milvus​
      +metadata:​
      +  annotations: null # this field should be removed or set to null​
      +  resourceVersion: null # this field should be removed or set to null​
      +  uid: null # this field should be removed or set to null​
      +spec:​
      +  dependencies:​
      +    pulsar:​
      +      inCluster:​
      +        chartVersion: pulsar-v3​
      +        # delete all previous values for pulsar v2 and set it to null.​
      +        # you may add additional values here for pulsar v3 if you're sure about it.​
      +        values: null​
      +
      +
    2. +
    3. 確保您的 Milvus Operator 已升級至 v1.1.2 或更新版本。

      +
      helm repo add milvus-operator https://zilliztech.github.io/milvus-operator​
      +helm repo update milvus-operator​
      +helm -n milvus-operator upgrade milvus-operator milvus-operator/milvus-operator​
      +
      +
      +

      使用命令以 Pulsar V3 啟動 Milvus

      +
      kubectl create -f milvus.yaml​
      +
      +
      +

      輸出

      +
      milvus.milvus.io/my-release created​
      +
      +
    4. +
    5. 檢查 Pods 是否全部排程並運行,kubectl -n default get pods

      +

      所有 Pod 可能需要幾分鐘才能啟動。

      +

      輸出如下。

      +
      NAME                                            READY   STATUS      RESTARTS   AGE​
      +my-release-etcd-0                               1/1     Running     0          65m​
      +my-release-milvus-datanode-57fd59ff58-5mdrk     1/1     Running     0          93s​
      +my-release-milvus-indexnode-67867c6b9b-4wsbw    1/1     Running     0          93s​
      +my-release-milvus-mixcoord-797849f9bb-sf8z5     1/1     Running     0          93s​
      +my-release-milvus-proxy-5d5bf98445-c55m6        1/1     Running     0          93s​
      +my-release-milvus-querynode-0-64797f5c9-lw4rh   1/1     Running     0          92s​
      +my-release-minio-79476ccb49-zvt2h               1/1     Running     0          65m​
      +my-release-pulsar-bookie-0                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-2                      1/1     Running     0          5m10s​
      +my-release-pulsar-bookie-init-v8fdj             0/1     Completed   0          5m11s​
      +my-release-pulsar-broker-0                      1/1     Running     0          5m11s​
      +my-release-pulsar-broker-1                      1/1     Running     0          5m10s​
      +my-release-pulsar-proxy-0                       1/1     Running     0          5m11s​
      +my-release-pulsar-proxy-1                       1/1     Running     0          5m10s​
      +my-release-pulsar-pulsar-init-5lhx7             0/1     Completed   0          5m11s​
      +my-release-pulsar-recovery-0                    1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-0                   1/1     Running     0          5m11s​
      +my-release-pulsar-zookeeper-1                   1/1     Running     0          5m10s​
      +my-release-pulsar-zookeeper-2                   1/1     Running     0          5m10s​
      +
      +
    6. +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.json new file mode 100644 index 000000000..d39515a56 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nrootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.5.3\n...\nproxy:\n container_name: milvus-proxy\n image: milvusdb/milvus:v2.5.3\n...\nquerycoord:\n container_name: milvus-querycoord\n image: milvusdb/milvus:v2.5.3 \n...\nquerynode:\n container_name: milvus-querynode\n image: milvusdb/milvus:v2.5.3\n...\nindexcoord:\n container_name: milvus-indexcoord\n image: milvusdb/milvus:v2.5.3\n...\nindexnode:\n container_name: milvus-indexnode\n image: milvusdb/milvus:v2.5.3 \n...\ndatacoord:\n container_name: milvus-datacoord\n image: milvusdb/milvus:v2.5.3 \n...\ndatanode:\n container_name: milvus-datanode\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","Update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Cluster with Docker Compose","anchorList":[{"label":"使用 Docker Compose 升級 Milvus 叢集","href":"Upgrade-Milvus-Cluster-with-Docker-Compose","type":1,"isActive":false},{"label":"通過改變映像來升級 Milvus","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.md new file mode 100644 index 000000000..4ebe74f4e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-docker.md @@ -0,0 +1,154 @@ +--- +id: upgrade_milvus_cluster-docker.md +summary: 學習如何使用 Docker Compose 升級 Milvus 叢集。 +title: 使用 Docker Compose 升級 Milvus 叢集 +--- + +

    使用 Docker Compose 升級 Milvus 叢集

    本主題描述如何使用 Docker Compose 升級您的 Milvus。

    +

    在一般情況下,您可以透過變更映像檔來升級 Milvus。然而,在從 v2.1.x 升級到 v2.5.3 之前,您需要先遷移元資料

    +

    通過改變映像來升級 Milvus

    在一般情況下,您可以按以下步驟升級 Milvus:

    +
      +
    1. docker-compose.yaml 中變更 Milvus image 標籤。

      +

      請注意,您需要變更 Proxy、所有協調器和所有工作節點的映像標籤。

      +
      ...
      +rootcoord:
      +  container_name: milvus-rootcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +proxy:
      +  container_name: milvus-proxy
      +  image: milvusdb/milvus:v2.5.3
      +...
      +querycoord:
      +  container_name: milvus-querycoord
      +  image: milvusdb/milvus:v2.5.3  
      +...
      +querynode:
      +  container_name: milvus-querynode
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexcoord:
      +  container_name: milvus-indexcoord
      +  image: milvusdb/milvus:v2.5.3
      +...
      +indexnode:
      +  container_name: milvus-indexnode
      +  image: milvusdb/milvus:v2.5.3 
      +...
      +datacoord:
      +  container_name: milvus-datacoord
      +  image: milvusdb/milvus:v2.5.3   
      +...
      +datanode:
      +  container_name: milvus-datanode
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. 執行下列指令以執行升級。

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    遷移元資料

      +
    1. 停止所有 Milvus 元件。

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. 為元資料遷移準備配置檔案migrate.yaml

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. 執行遷移容器。

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvus/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. 使用新的 Milvus 映像重新啟動 Milvus 元件。

      +
      Update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.json new file mode 100644 index 000000000..b68bef1ec --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update zilliztech\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update zilliztech\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nnew-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4 \n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 21m\nmy-release-etcd-1 1/1 Running 0 21m\nmy-release-etcd-2 1/1 Running 0 21m\nmy-release-milvus-datacoord-664c58798d-fl75s 1/1 Running 0 21m\nmy-release-milvus-datanode-5f75686c55-xfg2r 1/1 Running 0 21m\nmy-release-milvus-indexcoord-5f98b97589-2l48r 1/1 Running 0 21m\nmy-release-milvus-indexnode-857b4ddf98-vmd75 1/1 Running 0 21m\nmy-release-milvus-proxy-6c548f787f-scspp 1/1 Running 0 21m\nmy-release-milvus-querycoord-c454f44cd-dwmwq 1/1 Running 0 21m\nmy-release-milvus-querynode-76bb4946d-lbrz6 1/1 Running 0 21m\nmy-release-milvus-rootcoord-7764c5b686-62msm 1/1 Running 0 21m\nmy-release-minio-0 1/1 Running 0 21m\nmy-release-minio-1 1/1 Running 0 21m\nmy-release-minio-2 1/1 Running 0 21m\nmy-release-minio-3 1/1 Running 0 21m\nmy-release-pulsar-bookie-0 1/1 Running 0 21m\nmy-release-pulsar-bookie-1 1/1 Running 0 21m\nmy-release-pulsar-bookie-2 1/1 Running 0 21m\nmy-release-pulsar-bookie-init-tjxpj 0/1 Completed 0 21m\nmy-release-pulsar-broker-0 1/1 Running 0 21m\nmy-release-pulsar-proxy-0 1/1 Running 0 21m\nmy-release-pulsar-pulsar-init-c8vvc 0/1 Completed 0 21m\nmy-release-pulsar-recovery-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 21m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 20m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 20m\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0\n"],"headingContent":"Upgrade Milvus Cluster with Helm Chart","anchorList":[{"label":"使用 Helm 圖表升級 Milvus 集群","href":"Upgrade-Milvus-Cluster-with-Helm-Chart","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"檢查 Milvus Helm 海圖","href":"Check-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"進行滾動升級","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"使用 Helm 升級 Milvus","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.md new file mode 100644 index 000000000..603c6e3cf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-helm.md @@ -0,0 +1,281 @@ +--- +id: upgrade_milvus_cluster-helm.md +label: Helm +order: 1 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: 學習如何使用 Helm Chart 升級 Milvus 集群。 +title: 使用 Helm 圖表升級 Milvus 集群 +--- + +

    使用 Helm 圖表升級 Milvus 集群

    本指南描述如何使用 Milvus Helm 圖表升級你的 Milvus 集群。

    +

    先決條件

      +
    • Helm 版本 >= 3.14.0
    • +
    • Kubernetes 版本 >= 1.20.0
    • +
    +
    +

    自 Milvus Helm 圖表版本 4.2.21 起,我們引入 pulsar-v3.x 圖表作為依賴。為了向下相容性,請升級您的 helm 至 v3.14 或更高版本,並確保在使用helm upgrade 時加入--reset-then-reuse-values 選項。

    +
    +

    檢查 Milvus Helm 海圖

    執行下列指令來檢查新的 Milvus 版本。

    +
    $ helm repo update zilliztech
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    位於https://milvus-io.github.io/milvus-helm/ 的 Milvus Helm Charts repo 已經歸檔,您可以從https://zilliztech.github.io/milvus-helm/ 取得進一步的更新,如下所示:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    存檔的 repo 仍可使用於 4.0.31 之前的圖表。對於之後的版本,請使用新的 repo。

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    您可以為您的 Milvus 選擇升級路徑,如下所示:

    +
    - 進行滾動升級](#conduct-a-rolling-upgrade) 從 Milvus v2.2.3 及以後的版本升級到 v2.5.3。
    + +
    +

    進行滾動升級

    自 Milvus 2.2.3 起,您可以設定 Milvus 協調器工作在主動待命模式,並啟用它們的滾動升級功能,以便 Milvus 可以在協調器升級期間回應傳入的請求。在之前的版本中,協調器需要在升級過程中移除然後再創建,這可能會導致服務出現一定的停機時間。

    +

    滾動升級需要協調器在主動待命模式下工作。您可以使用我們提供的腳本,設定協調器在主動待命模式下工作,並開始滾動升級。

    +

    基於 Kubernetes 提供的滾動更新功能,上述腳本會根據部署的依賴關係強制執行有序更新。此外,Milvus 實作了一套機制,以確保其元件在升級期間仍能與依賴元件的系統相容,大幅減少潛在的服務停機時間。

    +

    該腳本只適用於與 Helm 一起安裝的 Milvus 的升級。下表列出了腳本中可用的命令旗標。

    + + + + + + + + + + + +
    參數說明預設值需要
    iMilvus 實例名稱None真實
    nMilvus 安裝的命名空間default
    t目標 Milvus 版本None
    w新的 Milvus 圖片標籤milvusdb/milvus:v2.2.3
    o操作update
    +

    一旦您確保 Milvus 實例中的所有部署都處於正常狀態。您可以執行以下指令,將 Milvus 實例升級至 2.5.3。

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. 腳本硬體編碼了部署的升級順序,無法變更。
    2. +
    3. 腳本使用kubectl patch 更新部署,並使用kubectl rollout status 觀察其狀態。
    4. +
    5. 腳本使用kubectl patch 將部署的app.kubernetes.io/version 標籤更新為指令中-t 旗標之後指定的標籤。
    6. +
    +
    +
    +

    使用 Helm 升級 Milvus

    要將 Milvus 從 v2.2.3 之前的次要版本升級到最新版本,請執行下列指令:

    +
    helm repo update zilliztech
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    使用前面命令中的 Helm 圖表版本。有關如何取得 Helm 圖表版本的詳細資訊,請參閱檢查 Milvus 版本

    +

    遷移元資料

    自 Milvus 2.2.0 起,元資料與先前版本的元資料不相容。以下示例片段假設從 Milvus 2.1.4 升級到 Milvus 2.2.0。

    +

    1.檢查 Milvus 版本

    執行$ helm list 檢查您的 Milvus 應用程式版本。您可以看到APP VERSION 是 2.1.4。

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION    
    +new-release         default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4 
    +
    +

    2.檢查正在運行的 pod

    執行$ kubectl get pods 檢查執行中的 Pod。您可以看到以下輸出。

    +
    NAME                                             READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          21m
    +my-release-etcd-1                               1/1     Running     0          21m
    +my-release-etcd-2                               1/1     Running     0          21m
    +my-release-milvus-datacoord-664c58798d-fl75s    1/1     Running     0          21m
    +my-release-milvus-datanode-5f75686c55-xfg2r     1/1     Running     0          21m
    +my-release-milvus-indexcoord-5f98b97589-2l48r   1/1     Running     0          21m
    +my-release-milvus-indexnode-857b4ddf98-vmd75    1/1     Running     0          21m
    +my-release-milvus-proxy-6c548f787f-scspp        1/1     Running     0          21m
    +my-release-milvus-querycoord-c454f44cd-dwmwq    1/1     Running     0          21m
    +my-release-milvus-querynode-76bb4946d-lbrz6     1/1     Running     0          21m
    +my-release-milvus-rootcoord-7764c5b686-62msm    1/1     Running     0          21m
    +my-release-minio-0                              1/1     Running     0          21m
    +my-release-minio-1                              1/1     Running     0          21m
    +my-release-minio-2                              1/1     Running     0          21m
    +my-release-minio-3                              1/1     Running     0          21m
    +my-release-pulsar-bookie-0                      1/1     Running     0          21m
    +my-release-pulsar-bookie-1                      1/1     Running     0          21m
    +my-release-pulsar-bookie-2                      1/1     Running     0          21m
    +my-release-pulsar-bookie-init-tjxpj             0/1     Completed   0          21m
    +my-release-pulsar-broker-0                      1/1     Running     0          21m
    +my-release-pulsar-proxy-0                       1/1     Running     0          21m
    +my-release-pulsar-pulsar-init-c8vvc             0/1     Completed   0          21m
    +my-release-pulsar-recovery-0                    1/1     Running     0          21m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          21m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          20m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          20m
    +
    +

    3.檢查影像標籤

    檢查 pod 的 image 標籤my-release-milvus-proxy-6c548f787f-scspp 。您可以看到您的 Milvus 集群的版本是 v2.1.4。

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4.遷移元資料

    Milvus 2.2 的一個主要改變是段索引的 metadata 結構。因此,當您將 Milvus 從 v2.1.x 升級到 v2.2.0 時,您需要使用 Helm 來遷移 metadata。這裡有一個腳本可以讓您安全地遷移 metadata。

    +

    這個腳本只適用於安裝在 K8s 集群上的 Milvus。如果在過程中發生錯誤,請先用回滾操作回滾到之前的版本。

    +

    下表列出了元資料遷移的操作。

    + + + + + + + + + + + + + + + + + +
    參數說明預設值需要
    iMilvus 實例名稱。None真實
    nMilvus 安裝的命名空間。default
    sMilvus 原始版本。None
    t目標 Milvus 版本。None
    rMilvus 元的根目錄。by-dev
    w新的 Milvus 圖片標籤。milvusdb/milvus:v2.2.0
    mmeta 遷移圖片標籤。milvusdb/meta-migration:v2.2.0錯誤
    o元移轉操作。migrate錯誤
    d是否在移轉完成後刪除移轉 pod。false
    c元遷移 pvc 的儲存類別。default storage class錯誤
    emilvus 使用的 etcd enpoint。etcd svc installed with milvus錯誤
    +

    1.遷移元資料

      +
    1. 下載遷移腳本
    2. +
    3. 停止 Milvus 元件。Milvus etcd 中的任何活動會話都可能導致遷移失敗。
    4. +
    5. 為 Milvus 元資料建立備份。
    6. +
    7. 遷移 Milvus 元資料。
    8. +
    9. 使用新的映像啟動 Milvus 元件。
    10. +
    +

    2.將 Milvus 從 v2.1.x 升級到 2.2.0

    以下命令假設你將 Milvus 從 v2.1.4 升級到 2.2.0。將它們改成適合你需要的版本。

    +
      +
    1. 指定 Milvus 實例名稱、源 Milvus 版本和目標 Milvus 版本。

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.2.0
      +
    2. +
    3. 如果你的 Milvus 沒有安裝在預設的 K8s 命名空間,用-n 指定命名空間。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0
      +
    4. +
    5. 如果您的 Milvus 安裝在自訂的rootpath ,請用-r 指定根目錄。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev
      +
    6. +
    7. 如果你的 Milvus 安裝了自訂的image ,用-w 指定圖片標籤。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -w milvusdb/milvus:v2.2.0
      +
    8. +
    9. 如果您想在遷移完成後自動移除遷移 Pod,請設定-d true

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -w milvusdb/milvus:v2.2.0 -d true
      +
    10. +
    11. 如果遷移失敗,請回滾並重新遷移。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o rollback -w milvusdb/milvus:v2.1.4
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.2.0 -r by-dev -o migrate -w milvusdb/milvus:v2.2.0
      +
    12. +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.json new file mode 100644 index 000000000..213ab9041 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Cluster with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 升級 Milvus 集群","href":"Upgrade-Milvus-Cluster-with-Milvus-Operator","type":1,"isActive":false},{"label":"升級你的 Milvus 操作員","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"進行滾動升級","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"透過變更 Milvus 的映像來升級它","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.md new file mode 100644 index 000000000..dd7f5c6a9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_cluster-operator.md @@ -0,0 +1,179 @@ +--- +id: upgrade_milvus_cluster-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_cluster-operator.md +related_key: upgrade Milvus Cluster +summary: 學習如何使用 Milvus Operator 升級 Milvus 集群。 +title: 使用 Milvus Operator 升級 Milvus 集群 +--- + +

    使用 Milvus Operator 升級 Milvus 集群

    本指南描述如何使用 Milvus Operator 升級您的 Milvus 集群。

    +

    升級你的 Milvus 操作員

    執行以下指令,將您的 Milvus Operator 版本升級至 v1.0.1。

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    一旦您將 Milvus 操作員升級到最新版本,您有以下選擇:

    + +

    進行滾動升級

    自 Milvus 2.2.3 起,您可以設定 Milvus 協調器工作在主動待命模式,並啟用它們的滾動升級功能,以便 Milvus 可以在協調器升級期間回應傳入的請求。在之前的版本中,協調器需要在升級過程中移除,然後再建立,這可能會導致服務出現一定的停機時間。

    +

    基於 Kubernetes 提供的滾動更新功能,Milvus 操作者會根據部署的依賴關係,強制執行部署的有序更新。此外,Milvus 實作了一套機制,以確保其元件在升級過程中與依賴元件的系統保持相容,大幅減少潛在的服務停機時間。

    +

    預設關閉了滾動升級功能。您需要通過配置文件明確地啟用它。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    在上述配置文件中,將spec.components.enableRollingUpdate 設定為true ,並將spec.components.image 設定為所需的 Milvus 版本。

    +

    預設情況下,Milvus 會以有序的方式為協調器執行滾動升級,其中會逐一取代協調器 pod 映像檔。若要減少升級時間,請考慮將spec.components.imageUpdateMode 設為all ,讓 Milvus 在同一時間取代所有 Pod 影像。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    您可以將spec.components.imageUpdateMode 設為rollingDowngrade ,讓 Milvus 以較低的版本取代協調器 Pod 影像。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-old-version>
    +
    +

    然後將您的設定儲存為 YAML 檔案 (例如milvusupgrade.yml),並將此設定檔修補到您的 Milvus 實例,如下所示:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    透過變更 Milvus 的映像來升級它

    在一般情況下,您可以簡單地透過改變映像檔,將您的 Milvus 更新到最新版本。然而,請注意,以這種方式升級 Milvus 時會有一定的停機時間。

    +

    編譯如下配置檔,並將其保存為milvusupgrade.yaml

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    然後執行以下步驟來執行升級:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    遷移元資料

    自 Milvus 2.2.0 起,元資料與先前版本的元資料不相容。以下示例片段假設從 Milvus 2.1.4 升級到 Milvus 2.5.3。

    +

    1.建立.yaml 檔案進行元資料遷移

    建立一個元資料遷移檔案。以下是一個範例。您需要在設定檔中指定name,sourceVersion, 和targetVersion 。以下範例將name 設定為my-release-upgrade,sourceVersion 設定為v2.1.4,targetVersion 設定為v2.5.3 。這表示您的 Milvus 集群將從 v2.1.4 升級到 v2.5.3。

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2.套用新設定

    執行下列指令建立新的配置。

    +
    $ kubectl create -f https://github.com/zilliztech/milvus-operator/blob/main/config/samples/beta/milvusupgrade.yaml
    +
    +

    3.檢查元資料遷移的狀態

    執行下列指令檢查元資料遷移的狀態。

    +
    kubectl describe milvus release-name
    +
    +

    輸出中的狀態ready 表示元資料遷移成功。

    +

    或者,您也可以執行kubectl get pod 來檢查所有的 Pod。如果所有的 pod 都是ready ,則表示元資料遷移成功。

    +

    4.刪除my-release-upgrade

    升級成功後,刪除 YAML 檔案中的my-release-upgrade

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.json new file mode 100644 index 000000000..83871eae9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["...\nstandalone:\n container_name: milvus-standalone\n image: milvusdb/milvus:v2.5.3\n","docker compose down\ndocker compose up -d\n","docker stop \n","# migration.yaml\ncmd:\n # Option: run/backup/rollback\n type: run\n runWithBackup: true\nconfig:\n sourceVersion: 2.1.4 # Specify your milvus version\n targetVersion: 2.5.3\n backupFilePath: /tmp/migration.bak\nmetastore:\n type: etcd\netcd:\n endpoints:\n - milvus-etcd:2379 # Use the etcd container name\n rootPath: by-dev # The root path where data is stored in etcd\n metaSubPath: meta\n kvSubPath: kv\n","# Suppose your docker-compose run with the default milvus network,\n# and you put migration.yaml in the same directory with docker-compose.yaml.\ndocker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml\n","// Run the following only after update the milvus image tag in the docker-compose.yaml\ndocker compose down\ndocker compose up -d\n"],"headingContent":"Upgrade Milvus Standalone with Docker Compose","anchorList":[{"label":"使用 Docker Compose 升級 Milvus 單機版","href":"Upgrade-Milvus-Standalone-with-Docker-Compose","type":1,"isActive":false},{"label":"透過變更映像來升級 Milvus","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.md new file mode 100644 index 000000000..b8f9d0927 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-docker.md @@ -0,0 +1,132 @@ +--- +id: upgrade_milvus_standalone-docker.md +label: Docker Compose +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 學習如何使用 Docker Compose 升級 Milvus 單機版。 +title: 使用 Docker Compose 升級 Milvus 單機版 +--- + +

    使用 Docker Compose 升級 Milvus 單機版

    本主題描述如何使用 Docker Compose 升級您的 Milvus。

    +

    在一般情況下,您可以透過變更映像檔來升級 Milvus。然而,在從 v2.1.x 升級到 v2.5.3 之前,您需要先遷移元資料

    +
    +

    基於安全考量,Milvus 隨著 v2.2.5 的發行,會將 MinIO 升級至 RELEASE.2023-03-20T20-16-18Z。在從使用 Docker Compose 安裝的先前 Milvus Standalone 版本進行任何升級之前,您應該先建立一個 Single-Node Single-Drive MinIO 部署,並將現有的 MinIO 設定和內容遷移到新部署。如需詳細資訊,請參閱本指南

    +
    +

    透過變更映像來升級 Milvus

    在一般情況下,您可以如下方式升級 Milvus:

    +
      +
    1. docker-compose.yaml 中變更 Milvus 映像檔標籤。

      +
      ...
      +standalone:
      +  container_name: milvus-standalone
      +  image: milvusdb/milvus:v2.5.3
      +
    2. +
    3. 執行下列指令來執行升級。

      +
      docker compose down
      +docker compose up -d
      +
    4. +
    +

    遷移元資料

      +
    1. 停止所有 Milvus 元件。

      +
      docker stop <milvus-component-docker-container-name>
      +
    2. +
    3. 為元資料遷移準備配置檔案migration.yaml

      +
      # migration.yaml
      +cmd:
      +  # Option: run/backup/rollback
      +  type: run
      +  runWithBackup: true
      +config:
      +  sourceVersion: 2.1.4   # Specify your milvus version
      +  targetVersion: 2.5.3
      +  backupFilePath: /tmp/migration.bak
      +metastore:
      +  type: etcd
      +etcd:
      +  endpoints:
      +    - milvus-etcd:2379  # Use the etcd container name
      +  rootPath: by-dev # The root path where data is stored in etcd
      +  metaSubPath: meta
      +  kvSubPath: kv
      +
    4. +
    5. 執行遷移容器。

      +
      # Suppose your docker-compose run with the default milvus network,
      +# and you put migration.yaml in the same directory with docker-compose.yaml.
      +docker run --rm -it --network milvus -v $(pwd)/migration.yaml:/milvus/configs/migration.yaml milvusdb/meta-migration:v2.2.0 /milvus/bin/meta-migration -config=/milvus/configs/migration.yaml
      +
    6. +
    7. 使用新的 Milvus 映像重新啟動 Milvus 元件。

      +
      // Run the following only after update the milvus image tag in the docker-compose.yaml
      +docker compose down
      +docker compose up -d
      +
    8. +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.json new file mode 100644 index 000000000..2fd2c8d59 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.json @@ -0,0 +1 @@ +{"codeList":["$ helm repo update\n$ helm search repo zilliztech/milvus --versions\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update zilliztech\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus --reset-then-reuse-values\n","NAME CHART VERSION APP VERSION DESCRIPTION \nzilliztech/milvus 4.1.34 2.4.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.33 2.4.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.32 2.4.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.31 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.30 2.4.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.29 2.4.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.24 2.3.11 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.23 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.22 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.21 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.20 2.3.10 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.18 2.3.10 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.18 2.3.9 Milvus is an open-source vector database built ... \nzilliztech/milvus 4.1.17 2.3.8 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.16 2.3.7 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.15 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.14 2.3.6 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.13 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.12 2.3.5 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.11 2.3.4 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.10 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.9 2.3.3 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.8 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.7 2.3.2 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.6 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.5 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.4 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.3 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.2 2.3.1 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.1 2.3.0 Milvus is an open-source vector database built ...\nzilliztech/milvus 4.1.0 2.3.0 Milvus is an open-source vector database built ...\n","sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'\n","helm repo update\nhelm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here\n","NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION \nmy-release default 1 2022-11-21 15:41:25.51539 +0800 CST deployed milvus-3.2.18 2.1.4\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 84s\nmy-release-milvus-standalone-75c599fffc-6rwlj 1/1 Running 0 84s\nmy-release-minio-744dd9586f-qngzv 1/1 Running 0 84s\n","$ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'\n# milvusdb/milvus:v2.1.4\n","./migrate.sh -i my-release -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true\n","./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1\n./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3\n"],"headingContent":"Upgrade Milvus Standalone with Helm Chart","anchorList":[{"label":"使用 Helm 圖表升級 Milvus 單機版","href":"Upgrade-Milvus-Standalone-with-Helm-Chart","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"檢查 Milvus 版本","href":"Check-the-Milvus-version","type":2,"isActive":false},{"label":"進行滾動升級","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"使用 Helm 升級 Milvus","href":"Upgrade-Milvus-using-Helm","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.md new file mode 100644 index 000000000..919280a40 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-helm.md @@ -0,0 +1,259 @@ +--- +id: upgrade_milvus_standalone-helm.md +label: Helm +order: 1 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 了解如何使用 Helm Chart 升級 Milvus 單機版。 +title: 使用 Helm 圖表升級 Milvus 單機版 +--- + +

    使用 Helm 圖表升級 Milvus 單機版

    本指南描述如何使用 Milvus Helm 圖表升級你的 Milvus 單機。

    +

    先決條件

      +
    • Helm 版本 >= 3.14.0
    • +
    • Kubernetes 版本 >= 1.20.0
    • +
    +
    +

    自 Milvus Helm 圖表版本 4.2.21 起,我們引入 pulsar-v3.x 圖表作為相依性。為了向下相容性,請升級您的 helm 至 v3.14 或更高版本,並確保在使用helm upgrade 時加入--reset-then-reuse-values 選項。

    +
    +

    檢查 Milvus 版本

    執行下列指令來檢查新的 Milvus 版本。

    +
    $ helm repo update
    +$ helm search repo zilliztech/milvus --versions
    +
    +
    +

    位於https://milvus-io.github.io/milvus-helm/ 的 Milvus Helm Charts repo 已經歸檔,您可以從https://zilliztech.github.io/milvus-helm/ 取得進一步的更新,如下所示:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update zilliztech
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus --reset-then-reuse-values
    +
    +

    存檔的 repo 仍可使用於 4.0.31 之前的圖表。對於之後的版本,請使用新的 repo。

    +
    +
    NAME                    CHART VERSION   APP VERSION             DESCRIPTION                                       
    +zilliztech/milvus       4.1.34          2.4.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.33          2.4.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.32          2.4.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.31          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.30          2.4.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.29          2.4.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.24          2.3.11                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.23          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.22          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.21          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.20          2.3.10                  Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.18          2.3.10                  Milvus is an open-source vector database built ... 
    +zilliztech/milvus       4.1.18          2.3.9                   Milvus is an open-source vector database built ...                                       
    +zilliztech/milvus       4.1.17          2.3.8                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.16          2.3.7                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.15          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.14          2.3.6                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.13          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.12          2.3.5                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.11          2.3.4                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.10          2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.9           2.3.3                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.8           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.7           2.3.2                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.6           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.5           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.4           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.3           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.2           2.3.1                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.1           2.3.0                   Milvus is an open-source vector database built ...
    +zilliztech/milvus       4.1.0           2.3.0                   Milvus is an open-source vector database built ...
    +
    +

    您可以為您的 Milvus 選擇升級路徑,如下所示:

    +
    - 進行滾動升級](#conduct-a-rolling-upgrade) 從 Milvus v2.2.3 及以後的版本升級到 v2.5.3。
    + +
    +

    進行滾動升級

    自 Milvus 2.2.3 起,您可以設定 Milvus 協調器工作在主動待命模式,並啟用它們的滾動升級功能,以便 Milvus 可以在協調器升級期間回應傳入的請求。在之前的版本中,協調器需要在升級過程中移除然後再創建,這可能會導致服務出現一定的停機時間。

    +

    滾動升級需要協調器在主動待命模式下工作。您可以使用我們提供的腳本,設定協調器在主動待命模式下工作,並開始滾動升級。

    +

    基於 Kubernetes 提供的滾動更新功能,上述腳本會根據部署的依賴關係強制執行有序更新。此外,Milvus 實作了一套機制,以確保其元件在升級期間仍能與那些依賴它們的元件相容,大幅減少潛在的服務停機時間。

    +

    該腳本只適用於與 Helm 一起安裝的 Milvus 的升級。下表列出了腳本中可用的命令旗標。

    + + + + + + + + + + + +
    參數說明預設值需要
    iMilvus 實例名稱None真實
    nMilvus 安裝的命名空間default
    t目標 Milvus 版本None
    w新的 Milvus 圖片標籤milvusdb/milvus:v2.2.3
    o操作update
    +

    一旦您確保 Milvus 實例中的所有部署都處於正常狀態。你可以執行以下指令將 Milvus 實例升級到 2.5.3。

    +
    sh rollingUpdate.sh -n default -i my-release -o update -t 2.5.3 -w 'milvusdb/milvus:v2.5.3'
    +
    +
    +
      +
    1. 該腳本不適用於安裝了RocksMQ的Milvus實例。
    2. +
    3. 腳本硬體編碼了部署的升級順序,無法更改。
    4. +
    5. 腳本使用kubectl patch 更新部署,並使用kubectl rollout status 觀察其狀態。
    6. +
    7. 腳本使用kubectl patch 來更新部署的app.kubernetes.io/version 標籤,使其成為命令中-t 旗標之後指定的標籤。
    8. +
    +
    +
    +

    使用 Helm 升級 Milvus

    要將 Milvus 從 v2.2.3 之前的次要版本升級到最新版本,請執行下列指令:

    +
    helm repo update
    +helm upgrade my-release milvus/milvus --reset-then-reuse-values --version=4.1.24 # use the helm chart version here
    +
    +

    使用前面命令中的 Helm 圖表版本。有關如何取得 Helm 圖表版本的詳細資訊,請參閱檢查 Milvus 版本

    +

    遷移元資料

    自 Milvus 2.2.0 起,元資料與先前版本的元資料不相容。以下示例片段假設從 Milvus 2.1.4 升級到 Milvus 2.2.0。

    +

    1.檢查 Milvus 版本

    執行$ helm list 檢查您的 Milvus 應用程式版本。您可以看到APP VERSION 是 2.1.4。

    +
    NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION     
    +my-release          default     1           2022-11-21 15:41:25.51539 +0800 CST     deployed    milvus-3.2.18   2.1.4
    +
    +

    2.檢查正在運行的 pod

    執行$ kubectl get pods 檢查執行中的 Pod。您可以看到以下輸出。

    +
    NAME                                            READY   STATUS    RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running   0          84s
    +my-release-milvus-standalone-75c599fffc-6rwlj   1/1     Running   0          84s
    +my-release-minio-744dd9586f-qngzv               1/1     Running   0          84s
    +
    +

    3.檢查影像標籤

    檢查 pod 的 image 標籤my-release-milvus-proxy-6c548f787f-scspp 。您可以看到您的 Milvus 集群的版本是 v2.1.4。

    +
    $ kubectl get pods my-release-milvus-proxy-6c548f787f-scspp -o=jsonpath='{$.spec.containers[0].image}'
    +# milvusdb/milvus:v2.1.4
    +
    +

    4.遷移元資料

    Milvus 2.2 的一個主要改變是段索引的 metadata 結構。因此,當您將 Milvus 從 v2.1.x 升級到 v2.2.0 時,您需要使用 Helm 來遷移 metadata。這裡有一個腳本可以讓您安全地遷移 metadata。

    +

    這個腳本只適用於安裝在 K8s 集群上的 Milvus。如果在過程中發生錯誤,請先用回滾操作回滾到之前的版本。

    +

    下表列出了您可以進行的元資料遷移操作。

    + + + + + + + + + + + + + + + + + +
    參數說明預設值需要
    iMilvus 實例名稱。None真實
    nMilvus 安裝的命名空間。default
    sMilvus 原始版本。None
    t目標 Milvus 版本。None
    rMilvus 元的根目錄。by-dev
    w新的 Milvus 圖片標籤。milvusdb/milvus:v2.2.0
    mmeta 遷移圖片標籤。milvusdb/meta-migration:v2.2.0錯誤
    o元移轉操作。migrate錯誤
    d是否在移轉完成後刪除移轉 pod。false
    c元遷移 pvc 的儲存類別。default storage class錯誤
    emilvus 使用的 etcd enpoint。etcd svc installed with milvus錯誤
    +

    1.遷移元資料

      +
    1. 下載遷移腳本
    2. +
    3. 停止 Milvus 元件。Milvus etcd 中的任何活動會話都可能導致遷移失敗。
    4. +
    5. 為 Milvus 元資料建立備份。
    6. +
    7. 遷移 Milvus 元資料。
    8. +
    9. 使用新的映像啟動 Milvus 元件。
    10. +
    +

    2.將 Milvus 從 v2.1.x 升級到 2.5.3

    以下命令假設你將 Milvus 從 v2.1.4 升級到 2.5.3。將它們改成適合你需要的版本。

    +
      +
    1. 指定 Milvus 實例名稱、源 Milvus 版本和目標 Milvus 版本。

      +
      ./migrate.sh -i my-release -s 2.1.4 -t 2.5.3
      +
    2. +
    3. 如果你的 Milvus 沒有安裝在預設的 K8s 命名空間,用-n 指定命名空間。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3
      +
    4. +
    5. 如果您的 Milvus 安裝在自訂的rootpath ,請用-r 指定根目錄。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev
      +
    6. +
    7. 如果你的 Milvus 安裝了自訂的image ,用-w 指定圖片標籤。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -w milvusdb/milvus:v2.5.3
      +
    8. +
    9. 如果您想在遷移完成後自動移除遷移 Pod,請設定-d true

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -w milvusdb/milvus:v2.5.3 -d true
      +
    10. +
    11. 如果遷移失敗,請回滾並重新遷移。

      +
      ./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o rollback -w milvusdb/milvus:v2.1.1
      +./migrate.sh -i my-release -n milvus -s 2.1.4 -t 2.5.3 -r by-dev -o migrate -w milvusdb/milvus:v2.5.3
      +
    12. +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.json b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.json new file mode 100644 index 000000000..8a360225d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.json @@ -0,0 +1 @@ +{"codeList":["helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/\nhelm repo update zilliztech-milvus-operator\nhelm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingUpgrade # Default value, can be omitted\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: all\n image: milvusdb/milvus:v2.5.3\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nspec:\n components:\n enableRollingUpdate: true\n imageUpdateMode: rollingDowngrade\n image: milvusdb/milvus:\n","kubectl patch -f milvusupgrade.yml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\nlabels:\n app: milvus\nspec:\n # Omit other fields ...\n components:\n image: milvusdb/milvus:v2.5.3\n","kubectl patch -f milvusupgrade.yaml\n","apiVersion: milvus.io/v1beta1\nkind: MilvusUpgrade\nmetadata:\n name: my-release-upgrade\nspec:\n milvus:\n namespace: default\n name: my-release\n sourceVersion: \"v2.1.4\"\n targetVersion: \"v2.5.3\"\n # below are some omit default values:\n # targetImage: \"milvusdb/milvus:v2.5.3\"\n # toolImage: \"milvusdb/meta-migration:v2.2.0\"\n # operation: upgrade\n # rollbackIfFailed: true\n # backupPVC: \"\"\n # maxRetry: 3\n","$ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml\n","kubectl describe milvus release-name\n"],"headingContent":"Upgrade Milvus Standalone with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 升級 Milvus 單機版","href":"Upgrade-Milvus-Standalone-with-Milvus-Operator","type":1,"isActive":false},{"label":"升級你的 Milvus 操作系統","href":"Upgrade-your-Milvus-operator","type":2,"isActive":false},{"label":"進行滾動升級","href":"Conduct-a-rolling-upgrade","type":2,"isActive":false},{"label":"透過變更 Milvus 的映像來升級它","href":"Upgrade-Milvus-by-changing-its-image","type":2,"isActive":false},{"label":"遷移元資料","href":"Migrate-the-metadata","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.md b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.md new file mode 100644 index 000000000..a3a706313 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/upgrade_milvus_standalone-operator.md @@ -0,0 +1,181 @@ +--- +id: upgrade_milvus_standalone-operator.md +label: Milvus Operator +order: 0 +group: upgrade_milvus_standalone-operator.md +related_key: upgrade Milvus Standalone +summary: 了解如何使用 Milvus operator 升級 Milvus standalone。 +title: 使用 Milvus Operator 升級 Milvus 單機版 +--- + +

    使用 Milvus Operator 升級 Milvus 單機版

    本指南描述如何使用 Milvus Operator 升級您的 Milvus 獨立系統。

    +

    升級你的 Milvus 操作系統

    執行以下指令,將您的 Milvus 操作系統升級到 v1.0.1。

    +
    helm repo add zilliztech-milvus-operator https://zilliztech.github.io/milvus-operator/
    +helm repo update zilliztech-milvus-operator
    +helm -n milvus-operator upgrade milvus-operator zilliztech-milvus-operator/milvus-operator
    +
    +

    一旦您升級您的 Milvus 操作員到最新版本,您有以下選擇:

    + +

    進行滾動升級

    自 Milvus 2.2.3 起,您可以設定 Milvus 協調器工作在主動待命模式,並啟用它們的滾動升級功能,以便 Milvus 可以在協調器升級期間回應傳入的請求。在之前的版本中,協調器需要在升級過程中移除,然後再建立,這可能會導致服務出現一定的停機時間。

    +

    基於 Kubernetes 提供的滾動更新功能,Milvus 操作者會根據部署的依賴關係,強制執行部署的有序更新。此外,Milvus 實作了一套機制,以確保其元件在升級過程中與依賴元件的系統保持相容,大幅減少潛在的服務停機時間。

    +

    預設關閉了滾動升級功能。您需要通過配置文件明確地啟用它。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingUpgrade # Default value, can be omitted
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    在上述配置文件中,將spec.components.enableRollingUpdate 設定為true ,並將spec.components.image 設定為所需的 Milvus 版本。

    +

    預設情況下,Milvus 會以有序的方式為協調器執行滾動升級,在此過程中,它會一個接一個地更換協調器 pod 映像檔。若要縮短升級時間,可考慮將spec.components.imageUpdateMode 設為all ,讓 Milvus 同時取代所有 Pod 影像。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: all
    +    image: milvusdb/milvus:v2.5.3
    +
    +

    您可以將spec.components.imageUpdateMode 設為rollingDowngrade ,讓 Milvus 以較低的版本取代協調器 Pod 影像。

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +  name: my-release
    +spec:
    +  components:
    +    enableRollingUpdate: true
    +    imageUpdateMode: rollingDowngrade
    +    image: milvusdb/milvus:<some-older-version>
    +
    +

    然後將您的設定儲存為 YAML 檔案 (例如milvusupgrade.yml),並將此設定檔修補到您的 Milvus 實例,如下所示:

    +
    kubectl patch -f milvusupgrade.yml
    +
    +

    透過變更 Milvus 的映像來升級它

    在一般情況下,您可以簡單地透過改變映像檔,將您的 Milvus 更新到最新版本。然而,請注意,以這種方式升級 Milvus 時會有一定的停機時間。

    +

    編譯如下配置檔,並將其保存為milvusupgrade.yaml

    +
    apiVersion: milvus.io/v1beta1
    +kind: Milvus
    +metadata:
    +    name: my-release
    +labels:
    +    app: milvus
    +spec:
    +  # Omit other fields ...
    +  components:
    +   image: milvusdb/milvus:v2.5.3
    +
    +

    然後執行以下步驟來執行升級:

    +
    kubectl patch -f milvusupgrade.yaml
    +
    +

    遷移元資料

    自 Milvus 2.2.0 起,元資料與先前版本的元資料不相容。以下示例片段假設從 Milvus 2.1.4 升級到 Milvus v2.5.3。

    +

    1.建立.yaml 檔案進行元資料遷移

    建立一個元資料遷移檔案。以下是一個範例。您需要在設定檔中指定name,sourceVersion, 和targetVersion 。以下範例將name 設定為my-release-upgrade,sourceVersion 設定為v2.1.4,targetVersion 設定為v2.5.3 。這表示您的 Milvus 實例將從 v2.1.4 升級到 v2.5.3。

    +
    apiVersion: milvus.io/v1beta1
    +kind: MilvusUpgrade
    +metadata:
    +  name: my-release-upgrade
    +spec:
    +  milvus:
    +    namespace: default
    +    name: my-release
    +  sourceVersion: "v2.1.4"
    +  targetVersion: "v2.5.3"
    +  # below are some omit default values:
    +  # targetImage: "milvusdb/milvus:v2.5.3"
    +  # toolImage: "milvusdb/meta-migration:v2.2.0"
    +  # operation: upgrade
    +  # rollbackIfFailed: true
    +  # backupPVC: ""
    +  # maxRetry: 3
    +
    +

    2.套用新配置

    執行下列指令套用新的配置。

    +
    $ kubectl create -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvusupgrade.yaml
    +
    +

    3.檢查元資料遷移的狀態

    執行下列指令檢查元資料轉移的狀態。

    +
    kubectl describe milvus release-name
    +
    +

    輸出中的狀態ready 表示元資料遷移成功。

    +

    或者,您也可以執行kubectl get pod 來檢查所有的 Pod。如果所有的 pod 都是ready ,則表示元資料遷移成功。

    +

    4.刪除my-release-upgrade

    升級成功後,刪除 YAML 檔案中的my-release-upgrade

    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.json b/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.json new file mode 100644 index 000000000..0e13ab720 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.json @@ -0,0 +1 @@ +{"codeList":["namespace=default\nrelease=my-release\nhelm -n ${namespace} get values ${release} -o yaml > values.yaml\ncat values.yaml\n","# ... omit existing values\npulsar:\n enabled: true\npulsarv3:\n enabled: false\nimage:\n all:\n repository: milvusdb/milvus\n tag: v2.5.0-beta \n","helm repo add milvus https://zilliztech.github.io/milvus-helm\nhelm repo update milvus\n","helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml\n","wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","apiVersion: milvus.io/v1beta1\nkind: Milvus\nmetadata:\n name: my-release\n namespace: default\n labels:\n app: milvus\nspec:\n mode: cluster\n dependencies:\n pulsar:\n inCluster:\n chartVersion: pulsar-v2\n","kubectl apply -f milvus_cluster_default.yaml\n","helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false\n","pulsar:\n enabled: true\npulsarv3:\n enabled: false\n","helm install my-release milvus/milvus -f values.yaml\n"],"headingContent":"Use Pulsar v2 with Milvus v2.5.x","anchorList":[{"label":"使用 Pulsar v2 搭配 Milvus v2.5.x","href":"Use-Pulsar-v2-with-Milvus-v25x","type":1,"isActive":false},{"label":"在升級 Milvus v2.5.x 的同時繼續使用 Pulsar v2","href":"Continue-using-Pulsar-v2-while-upgrading-Milvus-v25x","type":2,"isActive":false},{"label":"使用 Pulsar v2 建立新的 Milvus 實例","href":"Creating-a-new-Milvus-instance-with-Pulsar-v2","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.md b/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.md new file mode 100644 index 000000000..62cc8aeeb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/use-pulsar-v2.md @@ -0,0 +1,138 @@ +--- +id: use-pulsar-v2.md +related_key: use pulsar v2 with milvus v2.5.x +summary: >- + Milvus建議您為Milvus v2.5.x升級Pulsar到v3。然而,如果您喜歡使用Pulsar v2,這篇文章將引導您通過步驟繼續使用Pulsar + v2與Milvus v2.5.x。 +title: 使用 Pulsar v2 搭配 Milvus v2.5.x +--- +

    使用 Pulsar v2 搭配 Milvus v2.5.x

    Milvus建議您升級Pulsar到v3來執行Milvus v2.5.x。詳情請參考升級Pulsar。然而,如果你喜歡使用Pulsar v2與Milvus v2.5.x,這篇文章將指導你如何使用Pulsar v2執行Milvus v2.5.x。

    +

    如果你已經有一個正在運行的Milvus實例,並希望將它升級到v2.5.x,但繼續使用Pulsar v2,你可以按照本頁面的步驟進行。

    +

    在升級 Milvus v2.5.x 的同時繼續使用 Pulsar v2

    本節將引導你完成繼續使用Pulsar v2的步驟,同時升級你正在運行的Milvus實例到Milvus v2.5.x。

    +

    適用於 Milvus Operator 使用者

    Milvus Operator 預設與 Pulsar v2 升級相容。您可以參考使用 MilvusOperator 升級 Milvus Cluster,將您的 Milvus 實例升級到 v2.5.x。

    +

    升級完成後,您可以繼續使用 Pulsar v2 與您的 Milvus 實例。

    +

    針對 Helm 使用者

    在升級之前,請確認

    +
      +
    • 您的 Helm 版本在 v3.12 以上,建議使用最新版本。

      +

      如需詳細資訊,請參閱安裝 Helm

    • +
    • 您的 Kubernetes 版本為 v1.20 以上。

    • +
    +

    本文中的作業假設

    +
      +
    • Milvus 已安裝在default 命名空間。

    • +
    • Milvus 的發行版名稱是my-release

    • +
    +

    在升級 Milvus 之前,您需要修改values.yaml 檔案,指定 Pulsar 版本為 v2。步驟如下

    +
      +
    1. 獲取您的 Milvus 實例的當前values.yaml 檔案。

      +
      namespace=default
      +release=my-release
      +helm -n ${namespace} get values ${release} -o yaml > values.yaml
      +cat values.yaml
      +
    2. +
    3. 編輯values.yaml 檔案,指定 Pulsar 版本為 v2。

      +
      # ... omit existing values
      +pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +image:
      +  all:
      +    repository: milvusdb/milvus
      +    tag: v2.5.0-beta 
      +
      +

      對於image, 將tag 改為所需的 Milvus 版本 (例如v2.5.0-beta)。

    4. +
    5. 更新 Milvus Helm 圖表。

      +
      helm repo add milvus https://zilliztech.github.io/milvus-helm
      +helm repo update milvus
      +
    6. +
    7. 升級 Milvus 實例。

      +
      helm -n $namespace upgrade $releaase milvus/milvus -f values.yaml
      +
    8. +
    +

    使用 Pulsar v2 建立新的 Milvus 實例

    本節將引導您使用 Pulsar v2 建立新 Milvus 實例的步驟。

    +

    對於 Milvus Operator 用戶

    在您部署Milvus v2.5.x之前,您需要下載和編輯Milvus Customer Resource Definition (CRD)檔案。有關如何使用 Milvus Operator 安裝 Milvus 的詳細資訊,請參閱使用 Milvus Operator 安裝 Milvus Cluster

    +
      +
    1. 下載 CRD 檔案。

      +
      wget https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
      +
    2. +
    3. 編輯milvus_cluster_default.yaml 檔案,指定 Pulsar 版本為 v2。

      +
      apiVersion: milvus.io/v1beta1
      +kind: Milvus
      +metadata:
      +  name: my-release
      +  namespace: default
      +  labels:
      +    app: milvus
      +spec:
      +  mode: cluster
      +  dependencies:
      +    pulsar:
      +      inCluster:
      +        chartVersion: pulsar-v2
      +
      +

      對於dependencies ,將pulsar.inCluster.chartVersion 改為pulsar-v2

    4. +
    5. 繼續安裝 Milvus Cluster 與 Milvus Operator 的步驟,使用編輯後的 CRD 檔部署 Milvus v2.5.x 與 Pulsar v2。

      +
      kubectl apply -f milvus_cluster_default.yaml
      +
    6. +
    +

    針對 Helm 使用者

    在部署 Milvus v2.5.x 之前,您可以準備一個values.yaml 檔案,或使用內嵌參數指定 Pulsar 版本。有關如何使用 Helm 安裝 Milvus 的詳細資訊,請參閱使用Helm 安裝 Milvus Cluster

    +
      +
    • 使用內嵌參數指定 Pulsar 版本為 v2。

      +
      helm install my-release milvus/milvus --set pulsar.enabled=true,pulsarv3.enabled=false
      +
    • +
    • 使用values.yaml 檔案指定 Pulsar 版本為 v2。

      +
      pulsar:
      +  enabled: true
      +pulsarv3:
      +  enabled: false
      +
      +

      然後,使用values.yaml 檔案以 Pulsar v2 部署 Milvus v2.5.x。

      +
      helm install my-release milvus/milvus -f values.yaml
      +
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.json b/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.json new file mode 100644 index 000000000..5521d46d3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.create_user(user_name=\"user_1\", password=\"P@ssw0rd\")​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.rbac.request.CreateUserReq;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nCreateUserReq createUserReq = CreateUserReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .build();​\n ​\nclient.createUser(createUserReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nawait milvusClient.createUser({​\n username: 'user_1',​\n password: 'P@ssw0rd',​\n });​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.update_password(​\n user_name=\"user_1\",​\n old_password=\"P@ssw0rd\",​\n new_password=\"NewP@ssw0rd\"​\n)​\n\n","import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​\n​\nUpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​\n .userName(\"user_1\")​\n .password(\"P@ssw0rd\")​\n .newPassword(\"NewP@ssw0rd\")​\n .build();​\nclient.updatePassword(updatePasswordReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.updateUser({​\n username: 'user_1',​\n newPassword: 'P@ssw0rd',​\n oldPassword: 'NewP@ssw0rd',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"newPassword\": \"P@ssw0rd!\",​\n \"userName\": \"user_1\",​\n \"password\": \"P@ssw0rd\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_users()​\n\n","List resp = client.listUsers();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listUsers();​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/users/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['root', 'user_1']​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_role(role_name=\"role_a\")​\nimport io.milvus.v2.service.rbac.request.CreateRoleReq;​\n\n","CreateRoleReq createRoleReq = CreateRoleReq.builder()​\n .roleName(\"role_a\")​\n .build();​\n ​\n\n","client.createRole(createRoleReq);​\nconst { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.createRole({​\n roleName: 'role_a',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"roleName\": \"role_a\"​\n}'​\n\n","from pymilvus import MilvusClient​\n​\nclient.list_roles()​\n\n","List roles = client.listRoles();​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nawait milvusClient.listRoles(​\n includeUserInfo: True​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/roles/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n\n","['admin', 'role_a']​\n\n"],"headingContent":"Create Users & Roles​","anchorList":[{"label":"建立使用者與角色","href":"Create-Users--Roles​","type":1,"isActive":false},{"label":"用戶","href":"User​","type":2,"isActive":false},{"label":"角色","href":"Role​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.md b/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.md new file mode 100644 index 000000000..861c57412 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/adminGuide/users_and_roles.md @@ -0,0 +1,258 @@ +--- +id: users_and_roles.md +related_key: 'users, roles' +summary: >- + Milvus 透過 RBAC + 實現了精細的存取控制。您可以從建立使用者和角色開始,然後將權限或權限群組分配給角色,最後透過賦予使用者角色來管理存取控制。這種方法可以確保存取管理的效率和安全性。本頁介紹如何在 + Milvus 中建立使用者和角色。 +title: 建立使用者與角色 +--- +

    建立使用者與角色

    Milvus 通過 RBAC 實現細粒度的存取控制。您可以從建立使用者和角色開始,然後為角色指定權限或權限群組,最後透過賦予使用者角色來管理存取控制。這種方法可以確保存取管理的效率和安全性。本頁介紹如何在 Milvus 中建立使用者和角色。

    +

    用戶

    初始化 Milvus 實例後,第一次連接 Milvus 時會自動產生一個根用戶進行認證。根用戶的用戶名是root ,密碼是Milvus 。根用戶的默認角色是admin ,可以訪問所有資源。為了確保資料安全,請妥善保管 root 使用者的憑證,以防止未經授權的存取。

    +

    對於日常操作,我們建議您建立使用者,而不是使用 root 使用者。

    +

    建立使用者

    以下範例顯示如何建立使用者,使用者名稱為user_1 ,密碼為P@ssw0rd 。使用者的使用者名稱和密碼必須遵循這些規則。

    +
      +
    • 使用者名稱:必須以字母開頭,且只能包含大寫或小寫字母、數字和底線。

    • +
    • 密碼:長度必須為 8-64 個字元,且必須包含下列三項:大寫字母、小寫字母、數字和特殊字符。

    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.create_user(user_name="user_1", password="P@ssw0rd")​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.rbac.request.CreateUserReq;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +        ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +CreateUserReq createUserReq = CreateUserReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .build();​
    +        ​
    +client.createUser(createUserReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +await milvusClient.createUser({​
    +   username: 'user_1',​
    +   password: 'P@ssw0rd',​
    + });​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    更新密碼

    建立使用者後,如果忘記了,可以更新密碼。

    +

    新密碼也必須遵循以下規則。

    +
      +
    • 長度必須為 8-64 個字元,並包含下列三項:大寫字母、小寫字母、數字及特殊字符。
    • +
    +

    以下範例顯示如何更新使用者user_1 的密碼為NewP@ssw0rd

    + +
    from pymilvus import MilvusClient​
    +​
    +client.update_password(​
    +    user_name="user_1",​
    +    old_password="P@ssw0rd",​
    +    new_password="NewP@ssw0rd"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.rbac.request.UpdatePasswordReq;​
    +​
    +UpdatePasswordReq updatePasswordReq = UpdatePasswordReq.builder()​
    +        .userName("user_1")​
    +        .password("P@ssw0rd")​
    +        .newPassword("NewP@ssw0rd")​
    +        .build();​
    +client.updatePassword(updatePasswordReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.updateUser({​
    +   username: 'user_1',​
    +   newPassword: 'P@ssw0rd',​
    +   oldPassword: 'NewP@ssw0rd',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/update_password" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "newPassword": "P@ssw0rd!",​
    +    "userName": "user_1",​
    +    "password": "P@ssw0rd"​
    +}'​
    +
    +
    +

    列出使用者

    建立數個使用者後,您可以列出並檢視所有現有使用者。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_users()​
    +
    +
    +
    List<String> resp = client.listUsers();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listUsers();​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/users/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    下面是一個輸出範例。root 是 Milvus 自動產生的預設使用者。user_1 是剛建立的新使用者。

    +
    ['root', 'user_1']​
    +
    +
    +

    角色

    Milvus 提供了一個內建的角色admin ,這是一個管理員角色,可以存取所有實體下的資源,並擁有所有操作的權限。為了更精細的存取管理和增強資料安全性,建議您依據需求建立自訂角色。

    +

    建立角色

    下面的示例演示了如何创建名为role_a 的角色。

    +

    角色名稱必須遵循以下規則。

    +
      +
    • 必須以字母開頭,且只能包含大寫或小寫字母、數字和底線。"
    • +
    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_role(role_name="role_a")​
    +import io.milvus.v2.service.rbac.request.CreateRoleReq;​
    +
    +
    +
    CreateRoleReq createRoleReq = CreateRoleReq.builder()​
    +        .roleName("role_a")​
    +        .build();​
    +       ​
    +
    +
    +
    client.createRole(createRoleReq);​
    +const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.createRole({​
    +   roleName: 'role_a',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "roleName": "role_a"​
    +}'​
    +
    +
    +

    列出角色

    建立數個角色後,您可以列出並檢視所有現有的角色。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.list_roles()​
    +
    +
    +
    List<String> roles = client.listRoles();​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +await milvusClient.listRoles(​
    +    includeUserInfo: True​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/roles/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +
    +
    +

    下面是一個輸出範例。admin 是 Milvus 的預設角色。role_a 是剛剛建立的新角色。

    +
    ['admin', 'role_a']​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.json new file mode 100644 index 000000000..c8761f540 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\nbge_m3_ef = BGEM3EmbeddingFunction(\n model_name='BAAI/bge-m3', # Specify the model name\n device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = bge_m3_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense document dim:\", bge_m3_ef.dim[\"dense\"], docs_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse document dim:\", bge_m3_ef.dim[\"sparse\"], list(docs_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02505937, -0.00142193, 0.04015467, ..., -0.02094924,\n 0.02623661, 0.00324098], dtype=float32), array([ 0.00118463, 0.00649292, -0.00735763, ..., -0.01446293,\n 0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 , 0.0009811 , ..., -0.02559666,\n 0.08084674, 0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type ''\n with 43 stored elements in Compressed Sparse Row format>}\nDense document dim: 1024 (1024,)\nSparse document dim: 250002 (1, 250002)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bge_m3_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension of dense embeddings\nprint(\"Dense query dim:\", bge_m3_ef.dim[\"dense\"], query_embeddings[\"dense\"][0].shape)\n# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse query dim:\", bge_m3_ef.dim[\"sparse\"], list(query_embeddings[\"sparse\"])[0].shape)\n","Embeddings: {'dense': [array([-0.02024024, -0.01514386, 0.02380808, ..., 0.00234648,\n -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,\n 0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type ''\n with 14 stored elements in Compressed Sparse Row format>}\nDense query dim: 1024 (1024,)\nSparse query dim: 250002 (1, 250002)\n"],"headingContent":"BGE M3","anchorList":[{"label":"BGE M3","href":"BGE-M3","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.md new file mode 100644 index 000000000..1edb339fa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bgm-m3.md @@ -0,0 +1,91 @@ +--- +id: embed-with-bgm-m3.md +order: 4 +summary: BGE-M3 因其多語言能力、多功能能力和多粒度能力而得名。 +title: BGE M3 +--- +

    BGE M3

    BGE-M3因其在多語言、多功能和多粒度方面的能力而得名。BGE-M3 可支援超過 100 種語言,為多語言和跨語言檢索任務設定了新的基準。其在單一框架內執行密集檢索、多向量檢索和稀疏檢索的獨特能力,使其成為廣泛資訊檢索 (IR) 應用的理想選擇。

    +

    Milvus 使用BGEM3EmbeddingFunction類與 BGE M3 模型整合。這個類別處理嵌入的計算,並將它們以與 Milvus 相容的格式傳回,以便進行索引和搜尋。要使用此功能,必須安裝 FlagEmbedding。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化BGEM3EmbeddingFunction

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(
    +    model_name='BAAI/bge-m3', # Specify the model name
    +    device='cpu', # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +    use_fp16=False # Specify whether to use fp16. Set to `False` if `device` is `cpu`.
    +)
    +
    +

    參數

    +
      +
    • model_name(string)

      +

      用於編碼的模型名稱。預設值為BAAI/bge-m3

    • +
    • device(字串)

      +

      要使用的裝置,cpu代表 CPU,cuda:n代表第 n 個 GPU 裝置。

    • +
    • use_fp16(bool)

      +

      是否使用 16 位元浮點精確度 (fp16)。當裝置cpu 時,指定為False

    • +
    +

    要為文件建立嵌入式資料,請使用encode_documents()方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = bge_m3_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense document dim:", bge_m3_ef.dim["dense"], docs_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse document dim:", bge_m3_ef.dim["sparse"], list(docs_embeddings["sparse"])[0].shape)
    +
    +

    預期的輸出類似如下:

    +
    Embeddings: {'dense': [array([-0.02505937, -0.00142193,  0.04015467, ..., -0.02094924,
    +        0.02623661,  0.00324098], dtype=float32), array([ 0.00118463,  0.00649292, -0.00735763, ..., -0.01446293,
    +        0.04243685, -0.01794822], dtype=float32), array([ 0.00415287, -0.0101492 ,  0.0009811 , ..., -0.02559666,
    +        0.08084674,  0.00141647], dtype=float32)], 'sparse': <3x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 43 stored elements in Compressed Sparse Row format>}
    +Dense document dim: 1024 (1024,)
    +Sparse document dim: 250002 (1, 250002)
    +
    +

    若要為查詢建立內嵌資料,請使用encode_queries()方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bge_m3_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension of dense embeddings
    +print("Dense query dim:", bge_m3_ef.dim["dense"], query_embeddings["dense"][0].shape)
    +# Since the sparse embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse query dim:", bge_m3_ef.dim["sparse"], list(query_embeddings["sparse"])[0].shape)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: {'dense': [array([-0.02024024, -0.01514386,  0.02380808, ...,  0.00234648,
    +       -0.00264978, -0.04317448], dtype=float32), array([ 0.00648045, -0.0081542 , -0.02717067, ..., -0.00380103,
    +        0.04200587, -0.01274772], dtype=float32)], 'sparse': <2x250002 sparse array of type '<class 'numpy.float32'>'
    +        with 14 stored elements in Compressed Sparse Row format>}
    +Dense query dim: 1024 (1024,)
    +Sparse query dim: 250002 (1, 250002)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.json new file mode 100644 index 000000000..04ac93b04 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer\nfrom pymilvus.model.sparse import BM25EmbeddingFunction\n\n# there are some built-in analyzers for several languages, now we use 'en' for English.\nanalyzer = build_default_analyzer(language=\"en\")\n\ncorpus = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\n# analyzer can tokenize the text into tokens\ntokens = analyzer(corpus[0])\nprint(\"tokens:\", tokens)\n","tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']\n","# Use the analyzer to instantiate the BM25EmbeddingFunction\nbm25_ef = BM25EmbeddingFunction(analyzer)\n\n# Fit the model on the corpus to get the statstics of the corpus\nbm25_ef.fit(corpus)\n","docs = [\n \"The field of artificial intelligence was established as an academic subject in 1956.\",\n \"Alan Turing was the pioneer in conducting significant research in artificial intelligence.\",\n \"Originating in Maida Vale, London, Turing grew up in the southern regions of England.\",\n \"In 1956, artificial intelligence emerged as a scholarly field.\",\n \"Turing, originally from Maida Vale, London, was brought up in the south of England.\"\n]\n\n# Create embeddings for the documents\ndocs_embeddings = bm25_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 0) 1.0208816705336425\n (0, 1) 1.0208816705336425\n (0, 3) 1.0208816705336425\n...\n (4, 16) 0.9606986899563318\n (4, 17) 0.9606986899563318\n (4, 20) 0.9606986899563318\nSparse dim: 21 (1, 21)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = bm25_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", bm25_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 0) 0.5108256237659907\n (0, 1) 0.5108256237659907\n (0, 2) 0.5108256237659907\n (1, 6) 0.5108256237659907\n (1, 7) 0.11554389108992644\n (1, 14) 0.5108256237659907\nSparse dim: 21 (1, 21)\n"],"headingContent":"BM25","anchorList":[{"label":"BM25","href":"BM25","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.md new file mode 100644 index 000000000..253d7cb64 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-bm25.md @@ -0,0 +1,110 @@ +--- +id: embed-with-bm25.md +order: 5 +summary: BM25 是資訊檢索中使用的排序函數,用來估計文件與指定搜尋查詢的相關性。 +title: BM25 +--- +

    BM25

    BM25是資訊檢索中使用的排序函數,用來估計文件與指定搜尋查詢的相關性。它結合了文件長度規範化和詞彙頻率飽和,增強了基本的詞彙頻率方法。BM25 可以將文件表示成詞彙重要性分數的向量,從而產生稀疏嵌入,允許在稀疏向量空間中進行有效的檢索和排序。

    +

    Milvus 使用BM25EmbeddingFunction類與BM25模型整合。這個類別處理嵌入的計算,並將它們以與 Milvus 相容的格式傳回,以便進行索引和搜尋。這個過程中不可或缺的是建立一個標記化的分析器。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    要輕鬆建立標記化分析器,Milvus 提供預設的分析器,只需要指定文字的語言。

    +

    範例

    +
    from pymilvus.model.sparse.bm25.tokenizers import build_default_analyzer
    +from pymilvus.model.sparse import BM25EmbeddingFunction
    +
    +# there are some built-in analyzers for several languages, now we use 'en' for English.
    +analyzer = build_default_analyzer(language="en")
    +
    +corpus = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +# analyzer can tokenize the text into tokens
    +tokens = analyzer(corpus[0])
    +print("tokens:", tokens)
    +
    +

    參數

    +
      +
    • 語言(字串)

      +

      要標記化的文字語言。有效選項為en(英文)、de(德文)、fr(法文)、ru(俄文)、sp(西班牙文)、it(義大利文)、pt(葡萄牙文)、zh(中文)、jp(日文)、kr(韓文)。

    • +
    +

    預期的輸出與以下相似:

    +
    tokens: ['artifici', 'intellig', 'found', 'academ', 'disciplin', '1956']
    +
    +

    BM25 演算法在處理文字時,會先使用內建的分析器將文字分割成字元,如圖中所示的英文字元,如'artifici'、 'intellig「」academ'。然後,它會收集這些標記的統計資料,評估它們在文件中的頻率和分佈情況。BM25 的核心會根據每個標記的重要性計算其相關性分數,較罕見的標記會獲得較高的分數。這個簡潔的過程可以根據與查詢的相關性對文件進行有效的排序。

    +

    要收集語料庫的統計資料,請使用fit()方法:

    +
    # Use the analyzer to instantiate the BM25EmbeddingFunction
    +bm25_ef = BM25EmbeddingFunction(analyzer)
    +
    +# Fit the model on the corpus to get the statstics of the corpus
    +bm25_ef.fit(corpus)
    +
    +

    然後,使用encode_documents()為文件建立內嵌:

    +
    docs = [
    +    "The field of artificial intelligence was established as an academic subject in 1956.",
    +    "Alan Turing was the pioneer in conducting significant research in artificial intelligence.",
    +    "Originating in Maida Vale, London, Turing grew up in the southern regions of England.",
    +    "In 1956, artificial intelligence emerged as a scholarly field.",
    +    "Turing, originally from Maida Vale, London, was brought up in the south of England."
    +]
    +
    +# Create embeddings for the documents
    +docs_embeddings = bm25_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings:   (0, 0)        1.0208816705336425
    +  (0, 1)        1.0208816705336425
    +  (0, 3)        1.0208816705336425
    +...
    +  (4, 16)        0.9606986899563318
    +  (4, 17)        0.9606986899563318
    +  (4, 20)        0.9606986899563318
    +Sparse dim: 21 (1, 21)
    +
    +

    要為查詢建立嵌入式資料,請使用encode_queries()方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = bm25_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", bm25_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    預期的輸出與下面相似:

    +
    Embeddings:   (0, 0)        0.5108256237659907
    +  (0, 1)        0.5108256237659907
    +  (0, 2)        0.5108256237659907
    +  (1, 6)        0.5108256237659907
    +  (1, 7)        0.11554389108992644
    +  (1, 14)        0.5108256237659907
    +Sparse dim: 21 (1, 21)
    +
    +

    注意事項:

    +

    使用BM25EmbeddingFunction 時,請注意encoding_queries()encoding_documents()操作無法在數學上互換。因此,沒有已實作的bm25_ef(text)

    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.json new file mode 100644 index 000000000..3ce35a476 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import CohereEmbeddingFunction\n\ncohere_ef = CohereEmbeddingFunction(\n model_name=\"embed-english-light-v3.0\",\n api_key=\"YOUR_COHERE_API_KEY\",\n input_type=\"search_document\",\n embedding_types=[\"float\"]\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = cohere_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", cohere_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 3.43322754e-02, 1.16252899e-03, -5.25207520e-02, 1.32846832e-03,\n -6.80541992e-02, 6.10961914e-02, -7.06176758e-02, 1.48925781e-01,\n 1.54174805e-01, 1.98516846e-02, 2.43835449e-02, 3.55224609e-02,\n 1.82952881e-02, 7.57446289e-02, -2.40783691e-02, 4.40063477e-02,\n...\n 0.06359863, -0.01971436, -0.02253723, 0.00354195, 0.00222015,\n 0.00184727, 0.03408813, -0.00777817, 0.04919434, 0.01519775,\n -0.02862549, 0.04760742, -0.07891846, 0.0124054 ], dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = cohere_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", cohere_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-1.33361816e-02, 9.79423523e-04, -7.28759766e-02, -1.93786621e-02,\n -9.71679688e-02, 4.34875488e-02, -9.81445312e-02, 1.16882324e-01,\n 5.89904785e-02, -4.19921875e-02, 4.95910645e-02, 5.83496094e-02,\n 3.47595215e-02, -5.87463379e-03, -7.30514526e-03, 2.92816162e-02,\n...\n 0.00749969, -0.01192474, 0.02719116, 0.03347778, 0.07696533,\n 0.01409149, 0.00964355, -0.01681519, -0.0073204 , 0.00043154,\n -0.04577637, 0.03591919, -0.02807617, -0.04812622], dtype=float32)]\nDim 384 (384,)\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.md new file mode 100644 index 000000000..cf8a5610f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-cohere.md @@ -0,0 +1,104 @@ +--- +id: embed-with-cohere.md +order: 9 +summary: 本文說明如何使用 CohereEmbeddingFunction 來使用 Cohere 嵌入模型來編碼文件和查詢。 +title: 嵌入 Cohere +--- +

    Cohere

    Cohere 的內嵌模型用來產生文字內嵌,也就是捕捉文字語意資訊的浮點數字清單。這些嵌入資料可用於文字分類和語意搜尋等任務。

    +

    Milvus 使用CohereEmbeddingFunction 類與 Cohere 的嵌入模型整合。這個類別處理嵌入的計算,並將它們以與 Milvus 相容的格式傳回,以便進行索引和搜尋。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化CohereEmbeddingFunction

    +
    from pymilvus.model.dense import CohereEmbeddingFunction
    +
    +cohere_ef = CohereEmbeddingFunction(
    +    model_name="embed-english-light-v3.0",
    +    api_key="YOUR_COHERE_API_KEY",
    +    input_type="search_document",
    +    embedding_types=["float"]
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      用於編碼的 Cohere 嵌入模型名稱。您可以指定任何可用的 Cohere 嵌入模型名稱,例如embed-english-v3.0,embed-multilingual-v3.0 等。如果不指定此參數,則會使用embed-english-light-v3.0 。如需可用模型的清單,請參閱Embed

    • +
    • api_key (字串)

      +

      存取 Cohere API 的 API 金鑰。

    • +
    • input_type (字串)

      +

      傳送到模型的輸入類型。嵌入模型 v3 及更高版本必須使用。

      +
        +
      • "search_document":用於儲存在向量資料庫中的嵌入,用於搜索用例。
      • +
      • "search_query":用於對向量資料庫執行搜尋查詢的嵌入,以尋找相關文件。
      • +
      • "classification":用於通過文字分類器的嵌入。
      • +
      • "clustering":用於通過聚類演算法運行的嵌入。
      • +
    • +
    • embedding_types (List[str])

      +

      您想要獲取的嵌入式資料類型。非必要,預設為 None,會返回 Embed Floats 回應類型。目前,您只能指定此參數的單一值。可能的值:

      +
        +
      • "float":當您想要回傳預設的浮動嵌入時,請使用此值。對所有模型都有效。
      • +
      • "binary":當您想要取回有符號的二進位內嵌時,請使用此項。僅對 v3 模型有效。
      • +
      • "ubinary":當您想要取回無符號的二進位嵌入時,請使用此項。僅對 v3 模型有效。
      • +
    • +
    +

    要為文件建立嵌入式資料,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = cohere_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", cohere_ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings: [array([ 3.43322754e-02,  1.16252899e-03, -5.25207520e-02,  1.32846832e-03,
    +       -6.80541992e-02,  6.10961914e-02, -7.06176758e-02,  1.48925781e-01,
    +        1.54174805e-01,  1.98516846e-02,  2.43835449e-02,  3.55224609e-02,
    +        1.82952881e-02,  7.57446289e-02, -2.40783691e-02,  4.40063477e-02,
    +...
    +        0.06359863, -0.01971436, -0.02253723,  0.00354195,  0.00222015,
    +        0.00184727,  0.03408813, -0.00777817,  0.04919434,  0.01519775,
    +       -0.02862549,  0.04760742, -0.07891846,  0.0124054 ], dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    若要為查詢建立嵌入式資料,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = cohere_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", cohere_ef.dim, query_embeddings[0].shape)
    +
    +

    預期輸出與下列內容相似:

    +
    Embeddings: [array([-1.33361816e-02,  9.79423523e-04, -7.28759766e-02, -1.93786621e-02,
    +       -9.71679688e-02,  4.34875488e-02, -9.81445312e-02,  1.16882324e-01,
    +        5.89904785e-02, -4.19921875e-02,  4.95910645e-02,  5.83496094e-02,
    +        3.47595215e-02, -5.87463379e-03, -7.30514526e-03,  2.92816162e-02,
    +...
    +        0.00749969, -0.01192474,  0.02719116,  0.03347778,  0.07696533,
    +        0.01409149,  0.00964355, -0.01681519, -0.0073204 ,  0.00043154,
    +       -0.04577637,  0.03591919, -0.02807617, -0.04812622], dtype=float32)]
    +Dim 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.json new file mode 100644 index 000000000..193adf244 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import InstructorEmbeddingFunction\n\nef = InstructorEmbeddingFunction(\n model_name=\"hkunlp/instructor-xl\", # Defaults to `hkunlp/instructor-xl`\n query_instruction=\"Represent the question for retrieval:\",\n doc_instruction=\"Represent the document for retrieval:\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,\n -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,\n -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,\n -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,\n ...\n -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,\n 6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],\n dtype=float32)]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,\n -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,\n -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,\n -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,\n ...\n 7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,\n 1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],\n dtype=float32)]\nDim 768 (768,)\n"],"headingContent":"Instructor","anchorList":[{"label":"教師","href":"Instructor","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.md new file mode 100644 index 000000000..1c2119f20 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-instructor.md @@ -0,0 +1,90 @@ +--- +id: embed-with-instructor.md +order: 10 +summary: 本文說明如何使用 InstructorEmbeddingFunction 來使用 Instructor 嵌入模型編碼文件和查詢。 +title: 教師 +--- +

    教師

    Instructor是一個由指令調整的文字內嵌模型,只要提供任務指令,就可以產生適合任何任務(例如分類、檢索、聚類、文字評估等)和領域(例如科學、金融等)的文字內嵌,而不需要任何微調。

    +

    Milvus 透過 InstructorEmbeddingFunction 類別與 Instructor 的嵌入模型整合。該類提供使用 Instructor 嵌入模型編碼文件和查詢的方法,並將嵌入返回為與 Milvus 索引相容的密集向量。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化 InstructorEmbeddingFunction:

    +
    from pymilvus.model.dense import InstructorEmbeddingFunction
    +
    +ef = InstructorEmbeddingFunction(
    +    model_name="hkunlp/instructor-xl", # Defaults to `hkunlp/instructor-xl`
    +    query_instruction="Represent the question for retrieval:",
    +    doc_instruction="Represent the document for retrieval:"
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要用做編碼的 Mistral AI 嵌入模型名稱。預設值為hkunlp/instructor-xl 。如需詳細資訊,請參閱模型清單

    • +
    • query_instruction (字串)

      +

      指導模型如何為查詢或問題產生嵌入的特定任務指示。

    • +
    • doc_instruction (字串)

      +

      指導模型為文件產生內嵌的特定任務指示。

    • +
    +

    若要為文件建立內嵌,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: [array([ 1.08575663e-02, 3.87877878e-03, 3.18090729e-02, -8.12458917e-02,
    +       -4.68971021e-02, -5.85585833e-02, -5.95418774e-02, -8.55880603e-03,
    +       -5.54775111e-02, -6.08020350e-02, 1.76202394e-02, 1.06648318e-02,
    +       -5.89960292e-02, -7.46861771e-02, 6.60329172e-03, -4.25189249e-02,
    +       ...
    +       -1.26921125e-02, 3.01475357e-02, 8.25323071e-03, -1.88470203e-02,
    +        6.04814291e-03, -2.81618331e-02, 5.91602828e-03, 7.13866428e-02],
    +      dtype=float32)]
    +Dim: 768 (768,)
    +
    +

    要為查詢建立內嵌,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: [array([ 1.21721877e-02, 1.88485277e-03, 3.01732980e-02, -8.10302645e-02,
    +       -6.13401756e-02, -3.98149453e-02, -5.18723316e-02, -6.76784338e-03,
    +       -6.59285188e-02, -5.38365729e-02, -5.13435388e-03, -2.49210224e-02,
    +       -5.74403182e-02, -7.03031123e-02, 6.63730130e-03, -3.42259370e-02,
    +       ...
    +        7.36595877e-03, 2.85532661e-02, -1.55952033e-02, 2.13342719e-02,
    +        1.51187545e-02, -2.82798670e-02, 2.69396193e-02, 6.16136603e-02],
    +      dtype=float32)]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.json new file mode 100644 index 000000000..4cee744ff --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINAAI_API_KEY, # Provide your Jina AI API key\n task=\"retrieval.passage\", # Specify the task\n dimensions=1024, # Defaults to 1024\n)\n","\n```python\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = jina_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", jina_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([9.80641991e-02, -8.51697400e-02, 7.36531913e-02, 1.42558888e-02,\n -2.23589484e-02, 1.68494112e-03, -3.50753777e-02, -3.11530549e-02,\n -3.26012149e-02, 5.04568312e-03, 3.69836427e-02, 3.48948985e-02,\n 8.19722563e-03, 5.88679723e-02, -6.71099266e-03, -1.82369724e-02,\n...\n 2.48654783e-02, 3.43279652e-02, -1.66154150e-02, -9.90478322e-03,\n -2.96043139e-03, -8.57473817e-03, -7.39028037e-04, 6.25024503e-03,\n -1.08831357e-02, -4.00776342e-02, 3.25369164e-02, -1.42691191e-03])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = jina_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", jina_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([8.79201014e-03, 1.47551354e-02, 4.02722731e-02, -2.52991207e-02,\n 1.12719582e-02, 3.75947170e-02, 3.97946090e-02, -7.36681819e-02,\n -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,\n 5.26071340e-02, 6.75181448e-02, 3.92445624e-02, -1.40817231e-02,\n...\n 8.81703943e-03, 4.24629413e-02, -2.32944116e-02, -2.05193572e-02,\n -3.22035812e-02, 2.81896023e-03, 3.85326855e-02, 3.64372656e-02,\n -1.65050142e-02, -4.26847413e-02, 2.02664156e-02, -1.72684863e-02])]\nDim 1024 (1024,)\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_ef = JinaEmbeddingFunction(\n model_name=\"jina-embeddings-v3\", # Defaults to `jina-embeddings-v3`\n api_key=JINA_API_KEY, # Provide your Jina AI API key\n task=\"text-matching\",\n dimensions=1024, # Defaults to 1024\n)\n\ntexts = [\n \"Follow the white rabbit.\", # English\n \"Sigue al conejo blanco.\", # Spanish\n \"Suis le lapin blanc.\", # French\n \"跟着白兔走。\", # Chinese\n \"اتبع الأرنب الأبيض.\", # Arabic\n \"Folge dem weißen Kaninchen.\", # German\n]\n\nembeddings = jina_ef(texts)\n\n# Compute similarities\nprint(embeddings[0] @ embeddings[1].T)\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.md new file mode 100644 index 000000000..6aa96be0b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-jina.md @@ -0,0 +1,128 @@ +--- +id: embed-with-jina.md +order: 8 +summary: 本文說明如何使用 JinaEmbeddingFunction 來使用 Jina AI 嵌入模型對文件和查詢進行編碼。 +title: Jina AI - 嵌入 +--- +

    Jina AI

    Jina AI 的嵌入模型是高性能的文字嵌入模型,可以將文字輸入轉換為數字表示,捕捉文字的語義。這些模型在密集檢索、語義文字相似性和多語言理解等應用中表現優異。

    +

    Milvus 透過JinaEmbeddingFunction 類與 Jina AI 的嵌入模型整合。這個類別提供了使用 Jina AI 嵌入模型編碼文件和查詢的方法,並將嵌入作為與 Milvus 索引相容的密集向量傳回。若要使用此功能,請向Jina AI 取得 API 金鑰。

    +

    若要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化JinaEmbeddingFunction

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINAAI_API_KEY, # Provide your Jina AI API key
    +    task="retrieval.passage", # Specify the task
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      用於編碼的 Jina AI 嵌入模型名稱。您可以指定任何可用的 Jina AI 嵌入模型名稱,例如jina-embeddings-v3,jina-embeddings-v2-base-en 等。如果不指定此参数,将使用jina-embeddings-v3 。如需可用模型的清單,請參閱Jina Embeddings

    • +
    • api_key (字串)

      +

      存取 Jina AI API 的 API 金鑰。

    • +
    • task (字串)

      +

      傳送到模型的輸入類型。嵌入模型 v3 及更高版本必須使用。

      +
        +
      • "retrieval.passage":用於在索引時對檢索任務中的大型文件進行編碼。
      • +
      • "retrieval.query":用於在檢索任務中編碼使用者查詢或問題。
      • +
      • "classification":用於對文字分類任務中的文字進行編碼。
      • +
      • "text-matching":用於編碼相似性匹配的文字,例如測量兩個句子之間的相似性。
      • +
      • "clustering":用於聚類或重排任務。
      • +
    • +
    • dimensions (int)

      +

      輸出嵌入結果的維數。預設為 1024。僅支援嵌入模型 v3 及更高版本。

    • +
    • late_chunking (bool)

      +

      此參數控制是否使用Jina AI 上月推出的新分塊方法來編碼一批句子。預設為False 。當設定為True 時,Jina AI API 會將輸入欄位中的所有句子串連起來,並以單一字串的方式送入模型。在內部,模型會嵌入這個長串連的字串,然後執行後期的分塊,並傳回一個與輸入清單大小相符的嵌入清單。

    • +
    +

    若要為文件建立嵌入式資料,請使用encode_documents() 方法。此方法專為非對稱檢索任務中的文件嵌入而設計,例如為搜尋或推薦任務建立文件索引。此方法使用retrieval.passage 作為任務。

    +
    
    +```python
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = jina_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", jina_ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出類似如下:

    +
    Embeddings: [array([9.80641991e-02, -8.51697400e-02,  7.36531913e-02,  1.42558888e-02,
    +       -2.23589484e-02,  1.68494112e-03, -3.50753777e-02, -3.11530549e-02,
    +       -3.26012149e-02,  5.04568312e-03,  3.69836427e-02,  3.48948985e-02,
    +        8.19722563e-03,  5.88679723e-02, -6.71099266e-03, -1.82369724e-02,
    +...
    +        2.48654783e-02,  3.43279652e-02, -1.66154150e-02, -9.90478322e-03,
    +       -2.96043139e-03, -8.57473817e-03, -7.39028037e-04,  6.25024503e-03,
    +       -1.08831357e-02, -4.00776342e-02,  3.25369164e-02, -1.42691191e-03])]
    +Dim: 1024 (1024,)
    +
    +

    若要建立查詢嵌入,請使用encode_queries() 方法。此方法專為非對稱檢索任務(如搜尋查詢或問題)中的查詢嵌入而設計。此方法使用retrieval.query 作為任務。

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = jina_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", jina_ef.dim, query_embeddings[0].shape)
    +
    +

    預期的輸出類似如下:

    +
    Embeddings: [array([8.79201014e-03,  1.47551354e-02,  4.02722731e-02, -2.52991207e-02,
    +        1.12719582e-02,  3.75947170e-02,  3.97946090e-02, -7.36681819e-02,
    +       -2.17952449e-02, -1.16298944e-02, -6.83426252e-03, -5.12507409e-02,
    +        5.26071340e-02,  6.75181448e-02,  3.92445624e-02, -1.40817231e-02,
    +...
    +        8.81703943e-03,  4.24629413e-02, -2.32944116e-02, -2.05193572e-02,
    +       -3.22035812e-02,  2.81896023e-03,  3.85326855e-02,  3.64372656e-02,
    +       -1.65050142e-02, -4.26847413e-02,  2.02664156e-02, -1.72684863e-02])]
    +Dim 1024 (1024,)
    +
    +

    若要為相似性比對(例如 STS 或對稱檢索任務)、文字分類、聚類或重排任務建立輸入的內嵌,請在實體化JinaEmbeddingFunction 類別時使用適當的task 參數值。

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_ef = JinaEmbeddingFunction(
    +    model_name="jina-embeddings-v3", # Defaults to `jina-embeddings-v3`
    +    api_key=JINA_API_KEY, # Provide your Jina AI API key
    +    task="text-matching",
    +    dimensions=1024, # Defaults to 1024
    +)
    +
    +texts = [
    +    "Follow the white rabbit.",  # English
    +    "Sigue al conejo blanco.",  # Spanish
    +    "Suis le lapin blanc.",  # French
    +    "跟着白兔走。",  # Chinese
    +    "اتبع الأرنب الأبيض.",  # Arabic
    +    "Folge dem weißen Kaninchen.",  # German
    +]
    +
    +embeddings = jina_ef(texts)
    +
    +# Compute similarities
    +print(embeddings[0] @ embeddings[1].T)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.json new file mode 100644 index 000000000..c951e2997 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.hybrid import MGTEEmbeddingFunction\n\nef = MGTEEmbeddingFunction(\n model_name=\"Alibaba-NLP/gte-multilingual-base\", # Defaults to `Alibaba-NLP/gte-multilingual-base`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension of embeddings\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,\n 1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,\n 2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,\n 6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,\n ...\n 2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,\n 6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(ef.dim)\n","Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,\n 1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,\n -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,\n 8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,\n ...\n 3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,\n 7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], \n 'sparse': }\n\n{'dense': 768, 'sparse': 250002}\n"],"headingContent":"mGTE","anchorList":[{"label":"mGTE","href":"mGTE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.md new file mode 100644 index 000000000..0fe48fac6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mgte.md @@ -0,0 +1,88 @@ +--- +id: embed-with-mgte.md +order: 13 +summary: 本文說明如何使用 MGTEEmbeddingFunction 來使用 mGTE 嵌入模型來編碼文件和查詢。 +title: mGTE +--- +

    mGTE

    mGTE 是用於文字檢索任務的多語言文字表示模型和重排模型。

    +

    Milvus 透過 MGTEEmbeddingFunction 類別與 mGTE 嵌入模型整合。這個類別提供了使用 mGTE 內嵌模型來編碼文件和查詢的方法,並將內嵌返回為與 Milvus 索引相容的密集和稀疏向量。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化 MGTEEmbeddingFunction:

    +
    from pymilvus.model.hybrid import MGTEEmbeddingFunction
    +
    +ef = MGTEEmbeddingFunction(
    +    model_name="Alibaba-NLP/gte-multilingual-base", # Defaults to `Alibaba-NLP/gte-multilingual-base`
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      用於編碼的 mGTE 嵌入模型名稱。預設值為Alibaba-NLP/gte-multilingual-base

    • +
    +

    要為文件建立嵌入模型,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension of embeddings
    +print(ef.dim)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: {'dense': [tensor([-4.9149e-03, 1.6553e-02, -9.5524e-03, -2.1800e-02, 1.2075e-02,
    +        1.8500e-02, -3.0632e-02, 5.5909e-02, 8.7365e-02, 1.8763e-02,
    +        2.1708e-03, -2.7530e-02, -1.1523e-01, 6.5810e-03, -6.4674e-02,
    +        6.7966e-02, 1.3005e-01, 1.1942e-01, -1.2174e-02, -4.0426e-02,
    +        ...
    +        2.0129e-02, -2.3657e-02, 2.2626e-02, 2.1858e-02, -1.9181e-02,
    +        6.0706e-02, -2.0558e-02, -4.2050e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 41 stored elements and shape (3, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    +

    要為查詢建立內嵌,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print(ef.dim)
    +
    +

    預期輸出與下列內容相似:

    +
    Embeddings: {'dense': [tensor([ 6.5883e-03, -7.9415e-03, -3.3669e-02, -2.6450e-02, 1.4345e-02,
    +        1.9612e-02, -8.1679e-02, 5.6361e-02, 6.9020e-02, 1.9827e-02,
    +       -9.2933e-03, -1.9995e-02, -1.0055e-01, -5.4053e-02, -8.5991e-02,
    +        8.3004e-02, 1.0870e-01, 1.1565e-01, 2.1268e-02, -1.3782e-02,
    +        ...
    +        3.2847e-02, -2.3751e-02, 3.4475e-02, 5.3623e-02, -3.3894e-02,
    +        7.9408e-02, 8.2720e-03, -2.3459e-02], device='mps:0')], 
    + 'sparse': <Compressed Sparse Row sparse array of dtype 'float64'
    + with 13 stored elements and shape (2, 250002)>}
    +
    +{'dense': 768, 'sparse': 250002}
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.json new file mode 100644 index 000000000..77004b3fc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import MistralAIEmbeddingFunction\n\nef = MistralAIEmbeddingFunction(\n model_name=\"mistral-embed\", # Defaults to `mistral-embed`\n api_key=\"MISTRAL_API_KEY\" # Provide your Mistral AI API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,\n 0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,\n 0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,\n 0.03634644, -0.01802063])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,\n 0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,\n 0.03582764, 0.00366592])]\nDim 1024 (1024,)\n"],"headingContent":"Mistral AI","anchorList":[{"label":"Mistral AI","href":"Mistral-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.md new file mode 100644 index 000000000..f82f3590d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-mistral-ai.md @@ -0,0 +1,78 @@ +--- +id: embed-with-mistral-ai.md +order: 11 +summary: 本文說明如何使用 MistralAIEmbeddingFunction 來使用 Mistral AI 嵌入模型來編碼文件和查詢。 +title: Mistral AI +--- +

    Mistral AI

    Mistral AI 的嵌入模型是文字嵌入模型,旨在將文字輸入轉換為密集的數值向量,有效捕捉文字的基本意義。這些模型針對語意搜尋、自然語言理解和情境感知應用程式等任務進行了高度最佳化,因此適用於廣泛的人工智能驅動解決方案。

    +

    Milvus 透過 MistralAIEmbeddingFunction 類別與 Mistral AI 的嵌入模型整合。這個類別提供使用 Mistral AI 嵌入模型來編碼文件和查詢的方法,並將嵌入結果回傳成與 Milvus 索引相容的密集向量。要使用此功能,請向Mistral AI 取得 API 金鑰。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化 MistralAIEmbeddingFunction:

    +
    from pymilvus.model.dense import MistralAIEmbeddingFunction
    +
    +ef = MistralAIEmbeddingFunction(
    +    model_name="mistral-embed", # Defaults to `mistral-embed`
    +    api_key="MISTRAL_API_KEY" # Provide your Mistral AI API key
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要用做編碼的 Mistral AI 嵌入模型名稱。預設值為mistral-embed 。如需詳細資訊,請參閱Embeddings

    • +
    • api_key (字串)

      +

      存取 Mistral AI API 的 API 金鑰。

    • +
    +

    要為文件建立嵌入式資料,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings: [array([-0.06051636, 0.03207397, 0.04684448, ..., -0.01618958,
    +       0.02442932, -0.01302338]), array([-0.04675293, 0.06512451, 0.04290771, ..., -0.01454926,
    +       0.0014801 , 0.00686646]), array([-0.05978394, 0.08728027, 0.02217102, ..., -0.00681305,
    +       0.03634644, -0.01802063])]
    +Dim: 1024 (1024,)
    +
    +

    若要為查詢建立嵌入式資料,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    預期輸出與下列內容相似:

    +
    Embeddings: [array([-0.04916382, 0.04568481, 0.03594971, ..., -0.02653503,
    +       0.02804565, 0.00600815]), array([-0.05938721, 0.07098389, 0.01773071, ..., -0.01708984,
    +       0.03582764, 0.00366592])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.json new file mode 100644 index 000000000..cc09bcb43 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","# Before accessing the Nomic Atlas API, configure your Nomic API token\nimport nomic\nnomic.login('YOUR_NOMIC_API_KEY')\n\n# Import Nomic embedding function\nfrom pymilvus.model.dense import NomicEmbeddingFunction\n\nef = NomicEmbeddingFunction(\n model_name=\"nomic-embed-text-v1.5\", # Defaults to `mistral-embed`\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,\n 6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,\n 3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,\n ...\n -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,\n -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,\n -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]\nDim: 768 (768,)\n","queries = [\"When was artificial intelligence founded\",\n \"Where was Alan Turing born?\"]\n\nquery_embeddings = ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,\n 7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,\n -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,\n ...\n 7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,\n -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,\n -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]\nDim 768 (768,)\n"],"headingContent":"Nomic","anchorList":[{"label":"Nomic","href":"Nomic","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.md new file mode 100644 index 000000000..fcc91cc44 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-nomic.md @@ -0,0 +1,87 @@ +--- +id: embed-with-nomic.md +order: 12 +summary: 本文說明如何使用 NomicEmbeddingFunction 來使用 Nomic 嵌入模型來編碼文件和查詢。 +title: Nomic +--- +

    Nomic

    Nomic模型是由 Nomic AI 開發的一系列先進文字和圖像嵌入解決方案,旨在將各種形式的資料轉換成能捕捉其語義的密集數值向量。

    +

    Milvus 透過 NomicEmbeddingFunction 類別與 Nomic 的嵌入模型整合。這個類別提供了使用 Nomic 嵌入模型來編碼文件和查詢的方法,並將嵌入返回為與 Milvus 索引相容的密集向量。要使用此功能,請從Nomic Atlas 取得 API 金鑰。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化 NomicEmbeddingFunction:

    +
    # Before accessing the Nomic Atlas API, configure your Nomic API token
    +import nomic
    +nomic.login('YOUR_NOMIC_API_KEY')
    +
    +# Import Nomic embedding function
    +from pymilvus.model.dense import NomicEmbeddingFunction
    +
    +ef = NomicEmbeddingFunction(
    +    model_name="nomic-embed-text-v1.5", # Defaults to `mistral-embed`
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      用於編碼的 Nomic 嵌入模型名稱。預設值為nomic-embed-text-v1.5 。如需更多資訊,請參閱Nomic 官方文件

    • +
    +

    要為文件建立嵌入模型,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與下面相似:

    +
    Embeddings: [array([ 5.59997560e-02, 7.23266600e-02, -1.51977540e-01, -4.53491200e-02,
    +        6.49414060e-02, 4.33654800e-02, 2.26593020e-02, -3.51867680e-02,
    +        3.49998470e-03, 1.75571440e-03, -4.30297850e-03, 1.81274410e-02,
    +        ...
    +       -1.64337160e-02, -3.85437000e-02, 6.14318850e-02, -2.82745360e-02,
    +       -7.25708000e-02, -4.15563580e-04, -7.63320900e-03, 1.88446040e-02,
    +       -5.78002930e-02, 1.69830320e-02, -8.91876200e-03, -2.37731930e-02])]
    +Dim: 768 (768,)
    +
    +

    要為查詢建立嵌入式資料,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded",
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", ef.dim, query_embeddings[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings: [array([ 3.24096680e-02, 7.35473600e-02, -1.63940430e-01, -4.45556640e-02,
    +        7.83081050e-02, 2.64587400e-02, 1.35898590e-03, -1.59606930e-02,
    +       -3.33557130e-02, 1.05056760e-02, -2.35290530e-02, 2.23388670e-02,
    +        ...
    +        7.67211900e-02, 4.54406740e-02, 9.70459000e-02, 4.00161740e-03,
    +       -3.12805180e-02, -7.05566400e-02, 5.04760740e-02, 5.22766100e-02,
    +       -3.87878400e-02, -3.03649900e-03, 5.90515140e-03, -1.95007320e-02])]
    +Dim 768 (768,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.json new file mode 100644 index 000000000..abcf3721e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nopenai_ef = model.dense.OpenAIEmbeddingFunction(\n model_name='text-embedding-3-large', # Specify the model name\n api_key='YOUR_API_KEY', # Provide your OpenAI API key\n dimensions=512 # Set the embedding dimensionality\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = openai_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", openai_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,\n 4.23139781e-02, -6.64533582e-03, 4.21088142e-03, 1.04644023e-01,\n 5.10009527e-02, 5.32827862e-02, -3.26061808e-02, -3.66494283e-02,\n...\n -8.93232748e-02, 6.68255147e-03, 3.55093405e-02, -5.09071983e-02,\n 3.74144339e-03, 4.72541340e-02, 2.11916920e-02, 1.00753829e-02,\n -5.76633997e-02, 9.68257990e-03, 4.62721288e-02, -4.33261096e-02])]\nDim: 512 (512,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = openai_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim\", openai_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033, 0.01635982,\n -0.03169853, -0.0033602 , 0.09047844, 0.00030747, 0.11853652,\n -0.02870182, -0.01526102, 0.05505067, 0.00993909, -0.07165466,\n...\n -9.78106782e-02, -2.22669560e-02, 1.21873049e-02, -4.83198799e-02,\n 5.32377362e-02, -1.90469325e-02, 5.62430918e-02, 1.02650477e-02,\n -6.21757433e-02, 7.88027793e-02, 4.91846527e-04, -1.51633881e-02])]\nDim 512 (512,)\n"],"headingContent":"OpenAI","anchorList":[{"label":"OpenAI","href":"OpenAI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.md new file mode 100644 index 000000000..adcafe824 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-openai.md @@ -0,0 +1,89 @@ +--- +id: embed-with-openai.md +order: 2 +summary: Milvus 透過 OpenAIEmbeddingFunction 類別與 OpenAI 的模型整合。 +title: OpenAI +--- +

    OpenAI

    Milvus 透過OpenAIEmbeddingFunction類與 OpenAI 的模型整合。這個類別提供了使用預先訓練的 OpenAI 模型來編碼文件和查詢的方法,並將嵌入返回為與 Milvus 索引相容的密集向量。若要使用此功能,請在OpenAI平台上建立帳號,從OpenAI取得 API 金鑰。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化OpenAIEmbeddingFunction

    +
    from pymilvus import model
    +
    +openai_ef = model.dense.OpenAIEmbeddingFunction(
    +    model_name='text-embedding-3-large', # Specify the model name
    +    api_key='YOUR_API_KEY', # Provide your OpenAI API key
    +    dimensions=512 # Set the embedding dimensionality
    +)
    +
    +

    參數

    +
      +
    • model_name(string)

      +

      用於編碼的 OpenAI 模型名稱。有效的選項為text-embedding-3-smalltext- embedding- 3-largetext-embedding-ada-002(預設)。

    • +
    • api_key(字串)

      +

      存取 OpenAI API 的 API 金鑰。

    • +
    • dimensions(int)

      +

      產生的輸出 embeddings 應該有的尺寸數。僅在text-embedding-3及更新的模型中支援。

    • +
    +

    若要為文件建立嵌入式資料,請使用encode_documents()方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = openai_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", openai_ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與下面相似:

    +
    Embeddings: [array([ 1.76741909e-02, -2.04964578e-02, -1.09788161e-02, -5.27223349e-02,
    +        4.23139781e-02, -6.64533582e-03,  4.21088142e-03,  1.04644023e-01,
    +        5.10009527e-02,  5.32827862e-02, -3.26061808e-02, -3.66494283e-02,
    +...
    +       -8.93232748e-02,  6.68255147e-03,  3.55093405e-02, -5.09071983e-02,
    +        3.74144339e-03,  4.72541340e-02,  2.11916920e-02,  1.00753829e-02,
    +       -5.76633997e-02,  9.68257990e-03,  4.62721288e-02, -4.33261096e-02])]
    +Dim: 512 (512,)
    +
    +

    要為查詢建立內嵌,請使用encode_queries()方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = openai_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim", openai_ef.dim, query_embeddings[0].shape)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: [array([ 0.00530251, -0.01907905, -0.01672608, -0.05030033,  0.01635982,
    +       -0.03169853, -0.0033602 ,  0.09047844,  0.00030747,  0.11853652,
    +       -0.02870182, -0.01526102,  0.05505067,  0.00993909, -0.07165466,
    +...
    +       -9.78106782e-02, -2.22669560e-02,  1.21873049e-02, -4.83198799e-02,
    +        5.32377362e-02, -1.90469325e-02,  5.62430918e-02,  1.02650477e-02,
    +       -6.21757433e-02,  7.88027793e-02,  4.91846527e-04, -1.51633881e-02])]
    +Dim 512 (512,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.json new file mode 100644 index 000000000..e5c6f3387 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(\n model_name='all-MiniLM-L6-v2', # Specify the model name\n device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = sentence_transformer_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = sentence_transformer_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", sentence_transformer_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([-2.52114702e-02, -5.29330298e-02, 1.14570223e-02, 1.95571519e-02,\n -2.46500354e-02, -2.66519729e-02, -8.48201662e-03, 2.82961670e-02,\n -3.65092754e-02, 7.50745758e-02, 4.28900979e-02, 7.18822703e-02,\n...\n -6.76431581e-02, -6.45996556e-02, -4.67132553e-02, 4.78532910e-02,\n -2.31596199e-03, 4.13446948e-02, 1.06935494e-01, -1.08258888e-01],\n dtype=float32)]\nDim: 384 (384,)\n"],"headingContent":"Sentence Transformers","anchorList":[{"label":"句子轉換器","href":"Sentence-Transformers","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.md new file mode 100644 index 000000000..5541fbcce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-sentence-transform.md @@ -0,0 +1,86 @@ +--- +id: embed-with-sentence-transform.md +order: 3 +summary: 本文示範如何使用 Milvus 中的句子轉換器 (Sentence Transformers),將文件和查詢編碼成密集向量。 +title: 句子轉換器 +--- +

    句子轉換器

    Milvus 透過SentenceTransformerEmbeddingFunction類與Sentence Transformer預先訓練的模型整合。這個類別提供了使用預先訓練的 Sentence Transformer 模型來編碼文件和查詢的方法,並將嵌入回傳成與 Milvus 索引相容的密集向量。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化SentenceTransformerEmbeddingFunction

    +
    from pymilvus import model
    +
    +sentence_transformer_ef = model.dense.SentenceTransformerEmbeddingFunction(
    +    model_name='all-MiniLM-L6-v2', # Specify the model name
    +    device='cpu' # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    參數

    +
      +
    • model_name(string)

      +

      用於編碼的 Sentence Transformer 模型名稱。預設值為all-MiniLM-L6-v2。您可以使用任何 Sentence Transformers 預先訓練的模型。如需可用模型的清單,請參閱預先訓練的模型。

    • +
    • 裝置(字串)

      +

      要使用的裝置,cpu代表 CPU,cuda:n代表第 n 個 GPU 裝置。

    • +
    +

    要為文件建立嵌入式資料,請使用encode_documents()方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = sentence_transformer_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與下圖相似:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    要為查詢建立嵌入式資料,請使用encode_queries()方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = sentence_transformer_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", sentence_transformer_ef.dim, query_embeddings[0].shape)
    +
    +

    預期輸出與下列內容相似:

    +
    Embeddings: [array([-2.52114702e-02, -5.29330298e-02,  1.14570223e-02,  1.95571519e-02,
    +       -2.46500354e-02, -2.66519729e-02, -8.48201662e-03,  2.82961670e-02,
    +       -3.65092754e-02,  7.50745758e-02,  4.28900979e-02,  7.18822703e-02,
    +...
    +       -6.76431581e-02, -6.45996556e-02, -4.67132553e-02,  4.78532910e-02,
    +       -2.31596199e-03,  4.13446948e-02,  1.06935494e-01, -1.08258888e-01],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.json new file mode 100644 index 000000000..06db0bdf6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus import model\n\nsplade_ef = model.sparse.SpladeEmbeddingFunction(\n model_name=\"naver/splade-cocondenser-selfdistil\", \n device=\"cpu\"\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = splade_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(docs_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6392706036567688\n (0, 2034) 0.024093208834528923\n (0, 2082) 0.3230178654193878\n...\n (2, 23602) 0.5671860575675964\n (2, 26757) 0.5770265460014343\n (2, 28639) 3.1990697383880615\nSparse dim: 30522 (1, 30522)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = splade_ef.encode_queries(queries)\n\n# Print embeddings\nprint(\"Embeddings:\", query_embeddings)\n# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.\nprint(\"Sparse dim:\", splade_ef.dim, list(query_embeddings)[0].shape)\n","Embeddings: (0, 2001) 0.6353746056556702\n (0, 2194) 0.015553371049463749\n (0, 2301) 0.2756537199020386\n...\n (1, 18522) 0.1282549500465393\n (1, 23602) 0.13133203983306885\n (1, 28639) 2.8150033950805664\nSparse dim: 30522 (1, 30522)\n"],"headingContent":"SPLADE","anchorList":[{"label":"SPLADE","href":"SPLADE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.md new file mode 100644 index 000000000..eb45c22f4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-splade.md @@ -0,0 +1,87 @@ +--- +id: embed-with-splade.md +order: 6 +summary: 本文說明如何使用 SpladeEmbeddingFunction 來使用 SPLADE 模型編碼文件和查詢。 +title: SPLADE +--- +

    SPLADE

    SPLADEembedding 是一種為文件和查詢提供高度稀疏表示的模型,它繼承了字袋 (BOW) 模型的理想特性,例如精確的詞彙匹配和效率。

    +

    Milvus 透過SpladeEmbeddingFunction類別與 SPLADE 模型整合。這個類別提供了對文件和查詢進行編碼的方法,並將嵌入返回為與 Milvus 索引相容的稀疏向量。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    要實體化SpladeEmbeddingFunction,請使用指令:

    +
    from pymilvus import model
    +
    +splade_ef = model.sparse.SpladeEmbeddingFunction(
    +    model_name="naver/splade-cocondenser-selfdistil", 
    +    device="cpu"
    +)
    +
    +

    參數

    +
      +
    • model_name(string)

      +

      要用做編碼的 SPLADE 模型名稱。有效的選項為naver/splade-cocondenser-ensembledistil(預設)、naver/splade_v2_maxnaver/splade_v2_distilnaver/splade-cocondenser-selfdistil。如需詳細資訊,請參閱Play with models

    • +
    • 裝置(字串)

      +

      要使用的裝置,cpu代表 CPU,cuda:n代表第 n 個 GPU 裝置。

    • +
    +

    要為文件建立嵌入式資料,請使用encode_documents()方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = splade_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(docs_embeddings)[0].shape)
    +
    +

    預期的輸出與下圖相似:

    +
    Embeddings:   (0, 2001) 0.6392706036567688
    +  (0, 2034) 0.024093208834528923
    +  (0, 2082) 0.3230178654193878
    +...
    +  (2, 23602)    0.5671860575675964
    +  (2, 26757)    0.5770265460014343
    +  (2, 28639)    3.1990697383880615
    +Sparse dim: 30522 (1, 30522)
    +
    +

    要為查詢建立嵌入式資料,請使用encode_queries()方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = splade_ef.encode_queries(queries)
    +
    +# Print embeddings
    +print("Embeddings:", query_embeddings)
    +# since the output embeddings are in a 2D csr_array format, we convert them to a list for easier manipulation.
    +print("Sparse dim:", splade_ef.dim, list(query_embeddings)[0].shape)
    +
    +

    預期輸出與下列內容相似:

    +
    Embeddings:   (0, 2001)        0.6353746056556702
    +  (0, 2194)        0.015553371049463749
    +  (0, 2301)        0.2756537199020386
    +...
    +  (1, 18522)        0.1282549500465393
    +  (1, 23602)        0.13133203983306885
    +  (1, 28639)        2.8150033950805664
    +Sparse dim: 30522 (1, 30522)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.json b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.json new file mode 100644 index 000000000..ba7547304 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.dense import VoyageEmbeddingFunction\n\nvoyage_ef = VoyageEmbeddingFunction(\n model_name=\"voyage-3\", # Defaults to `voyage-3`\n api_key=VOYAGE_API_KEY # Provide your Voyage API key\n)\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\ndocs_embeddings = voyage_ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", docs_embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", voyage_ef.dim, docs_embeddings[0].shape)\n","Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,\n 0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,\n 0.03349845, 0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,\n 0.07658645, 0.03064499])]\nDim: 1024 (1024,)\n","queries = [\"When was artificial intelligence founded\", \n \"Where was Alan Turing born?\"]\n\nquery_embeddings = voyage_ef.encode_queries(queries)\n\nprint(\"Embeddings:\", query_embeddings)\nprint(\"Dim\", voyage_ef.dim, query_embeddings[0].shape)\n","Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,\n 0.04493361, 0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,\n 0.05706626, 0.0263358 ])]\nDim 1024 (1024,)\n"],"headingContent":"Voyage","anchorList":[{"label":"Voyage","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.md b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.md new file mode 100644 index 000000000..76b065f18 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embed-with-voyage.md @@ -0,0 +1,75 @@ +--- +id: embed-with-voyage.md +order: 7 +summary: 本文說明如何使用 VoyageEmbeddingFunction 來使用 Voyage 模型編碼文件和查詢。 +title: 嵌入航程 +--- +

    Voyage

    Milvus 透過 VoyageEmbeddingFunction 類與 Voyage 的模型整合。此類提供使用 Voyage 模型編碼文件和查詢的方法,並將嵌入返回為與 Milvus 索引相容的密集向量。若要使用此功能,請在Voyage平台上建立帳號,從Voyage取得 API 金鑰。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化VoyageEmbeddingFunction

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +
    +voyage_ef = VoyageEmbeddingFunction(
    +    model_name="voyage-3", # Defaults to `voyage-3`
    +    api_key=VOYAGE_API_KEY # Provide your Voyage API key
    +)
    +
    +

    參數

    +
      +
    • model_name (string) 用於編碼的 Voyage 模型名稱。您可以指定任何可用的 Voyage 模型名稱,例如 , 等。如果未指定此參數,則會使用 。如需可用模型的清單,請參閱voyage-3-lite voyage-finance-2 voyage-3 Voyage 官方文件
    • +
    • api_key (字串) 用來存取 Voyage API 的 API 金鑰。有關如何建立 API 金鑰的資訊,請參閱API 金鑰與 Python Client
    • +
    +

    若要為文件建立嵌入式資料,請使用encode_documents() 方法:

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +docs_embeddings = voyage_ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", docs_embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", voyage_ef.dim, docs_embeddings[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings: [array([ 0.02582654, -0.00907086, -0.04604037, ..., -0.01227521,
    +        0.04420955, -0.00038829]), array([ 0.03844212, -0.01597065, -0.03728884, ..., -0.02118733,
    +        0.03349845,  0.0065346 ]), array([ 0.05143557, -0.01096631, -0.02690451, ..., -0.02416254,
    +        0.07658645,  0.03064499])]
    +Dim: 1024 (1024,)
    +
    +

    要為查詢建立嵌入式資料,請使用encode_queries() 方法:

    +
    queries = ["When was artificial intelligence founded", 
    +           "Where was Alan Turing born?"]
    +
    +query_embeddings = voyage_ef.encode_queries(queries)
    +
    +print("Embeddings:", query_embeddings)
    +print("Dim", voyage_ef.dim, query_embeddings[0].shape)
    +
    +

    預期的輸出與下列內容相似:

    +
    Embeddings: [array([ 0.01733501, -0.0230672 , -0.05208827, ..., -0.00957995,
    +        0.04493361,  0.01485138]), array([ 0.05937521, -0.00729363, -0.02184347, ..., -0.02107683,
    +        0.05706626,  0.0263358 ])]
    +Dim 1024 (1024,)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embeddings.json b/localization/v2.5.x/site/zh-hant/embeddings/embeddings.json new file mode 100644 index 000000000..84f41d40d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embeddings.json @@ -0,0 +1 @@ +{"codeList":["pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# This will download \"all-MiniLM-L6-v2\", a light weight model.\nef = model.DefaultEmbeddingFunction()\n\n# Data from which embeddings are to be generated \ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nembeddings = ef.encode_documents(docs)\n\n# Print embeddings\nprint(\"Embeddings:\", embeddings)\n# Print dimension and shape of embeddings\nprint(\"Dim:\", ef.dim, embeddings[0].shape)\n","Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,\n -4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,\n 2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,\n...\n -4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,\n -4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],\n dtype=float32)]\nDim: 384 (384,)\n","from pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import (\n utility,\n FieldSchema, CollectionSchema, DataType,\n Collection, AnnSearchRequest, RRFRanker, connections,\n)\n","# 1. prepare a small corpus to search\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\nquery = \"Who started AI research?\"\n\n# BGE-M3 model can embed texts as dense and sparse vectors.\n# It is included in the optional `model` module in pymilvus, to install it,\n# simply run \"pip install pymilvus[model]\".\n\nbge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\n\ndocs_embeddings = bge_m3_ef(docs)\nquery_embeddings = bge_m3_ef([query])\n"],"headingContent":"Embedding Overview","anchorList":[{"label":"嵌入概述","href":"Embedding-Overview","type":1,"isActive":false},{"label":"範例 1:使用預設的 embedding 函式產生密集向量","href":"Example-1-Use-default-embedding-function-to-generate-dense-vectors","type":2,"isActive":false},{"label":"範例 2:使用 BGE M3 模型一次呼叫產生密集與稀疏向量","href":"Example-2-Generate-dense-and-sparse-vectors-in-one-call-with-BGE-M3-model","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/embeddings/embeddings.md b/localization/v2.5.x/site/zh-hant/embeddings/embeddings.md new file mode 100644 index 000000000..73b76fd26 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/embeddings/embeddings.md @@ -0,0 +1,143 @@ +--- +id: embeddings.md +order: 1 +summary: 瞭解如何為您的資料產生 embeddings。 +title: 嵌入概述 +--- +

    嵌入概述

    嵌入(Embedding)是一種機器學習概念,用於將資料映射到高維空間,將語義相似的資料放在一起。嵌入模型通常是來自 BERT 或其他 Transformer 系列的深度神經網路,可以有效地以一系列稱為向量的數字來表示文字、影像和其他資料類型的語意。這些模型的一個主要特點是,向量之間在高維空間的數學距離可以表示原始文字或影像語義的相似性。這個特性釋放了許多資訊檢索的應用,例如 Google 和 Bing 等網路搜尋引擎、電子商務網站上的產品搜尋和推薦,以及最近在生成式人工智慧 (Generative AI) 中流行的檢索擴增生成 (Retrieval Augmented Generation, RAG) 模式。

    +

    嵌入有兩大類,各自產生不同類型的向量:

    +
      +
    • 密集嵌入:大多數的嵌入模型將資訊表示為數百到數千維的浮點向量。由於大部分的維度都有非零值,因此輸出的向量稱為「密集」向量。舉例來說,流行的開放原始碼嵌入模型 BAAI/bge-base-en-v1.5 會輸出 768 個浮點數的向量 (768 維浮點向量)。

    • +
    • 稀疏嵌入:相比之下,稀疏嵌入的輸出向量大多數維度為零,即「稀疏」向量。這些向量通常有更高的維度(數萬或更多),這是由標記詞彙的大小決定的。稀疏向量可以由深度神經網路或文字庫的統計分析產生。由於稀疏嵌入向量具有可解釋性及更好的域外泛化能力,因此越來越多的開發人員採用稀疏嵌入向量作為密集嵌入向量的補充。

    • +
    +

    Milvus 是專為向量資料管理、儲存和檢索而設計的向量資料庫。透過整合主流的embeddingsreranking模型,您可以輕鬆地將原始文字轉換為可搜尋的向量,或使用強大的模型對結果進行 rerank,以達到更精確的 RAG 結果。此一整合簡化了文字轉換,不需要額外的 embedding 或 reranking 元件,進而簡化 RAG 的開發與驗證。

    +

    要以實際操作建立嵌入,請參考使用 PyMilvus 的模型來產生文字嵌入

    + + + + + + + + + + + + + + + + + +
    嵌入函數類型API 或開放源碼
    開放密集API
    句子轉換器密集開放源碼
    開放源碼稀疏開放源碼
    bge-m3混合開放原始碼
    稠密密集型API
    叢書密集API
    凝聚密集API
    導師密集開放源碼
    Mistral AI密集API
    諾米密集型API
    mGTE混合型開放源碼
    +

    範例 1:使用預設的 embedding 函式產生密集向量

    要在 Milvus 中使用嵌入函數,首先要安裝 PyMilvus 用戶端函式庫,並安裝model 子套件,該套件包裝了所有用於嵌入生成的實用程式。

    +
    pip install "pymilvus[model]"
    +
    +

    model 子套件支援各種嵌入模型,從OpenAISentence TransformersBGE M3SPLADE預先訓練的模型。為了簡單起見,本範例使用DefaultEmbeddingFunction ,它是全-MiniLM-L6-v2 的句子轉換器模型,模型約 70MB,第一次使用時會下載:

    +
    from pymilvus import model
    +
    +# This will download "all-MiniLM-L6-v2", a light weight model.
    +ef = model.DefaultEmbeddingFunction()
    +
    +# Data from which embeddings are to be generated 
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +embeddings = ef.encode_documents(docs)
    +
    +# Print embeddings
    +print("Embeddings:", embeddings)
    +# Print dimension and shape of embeddings
    +print("Dim:", ef.dim, embeddings[0].shape)
    +
    +

    預期的輸出與以下相似:

    +
    Embeddings: [array([-3.09392996e-02, -1.80662833e-02,  1.34775648e-02,  2.77156215e-02,
    +       -4.86349640e-03, -3.12581174e-02, -3.55921760e-02,  5.76934684e-03,
    +        2.80773244e-03,  1.35783911e-01,  3.59678417e-02,  6.17732145e-02,
    +...
    +       -4.61330153e-02, -4.85207550e-02,  3.13997865e-02,  7.82178566e-02,
    +       -4.75336798e-02,  5.21207601e-02,  9.04406682e-02, -5.36676683e-02],
    +      dtype=float32)]
    +Dim: 384 (384,)
    +
    +

    範例 2:使用 BGE M3 模型一次呼叫產生密集與稀疏向量

    在這個範例中,我們使用BGE M3混合模型將文字嵌入到密集向量和稀疏向量中,並使用它們來擷取相關文件。整體步驟如下:

    +
      +
    1. 使用 BGE-M3 模型將文字嵌入為密集向量和稀疏向量;

    2. +
    3. 建立一個 Milvus 集合來儲存密集向量和稀疏向量;

    4. +
    5. 將資料插入 Milvus;

    6. +
    7. 搜尋並檢查結果。

    8. +
    +

    首先,我們需要安裝必要的相依性。

    +
    from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import (
    +    utility,
    +    FieldSchema, CollectionSchema, DataType,
    +    Collection, AnnSearchRequest, RRFRanker, connections,
    +)
    +
    +

    使用 BGE M3 對文件和查詢進行編碼,以便嵌入檢索。

    +
    # 1. prepare a small corpus to search
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +query = "Who started AI research?"
    +
    +# BGE-M3 model can embed texts as dense and sparse vectors.
    +# It is included in the optional `model` module in pymilvus, to install it,
    +# simply run "pip install pymilvus[model]".
    +
    +bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +
    +docs_embeddings = bge_m3_ef(docs)
    +query_embeddings = bge_m3_ef([query])
    +
    diff --git a/localization/v2.5.x/site/zh-hant/faq/operational_faq.json b/localization/v2.5.x/site/zh-hant/faq/operational_faq.json new file mode 100644 index 000000000..c45e61d92 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/operational_faq.json @@ -0,0 +1 @@ +{"codeList":["{\n \"registry-mirrors\": [\"https://registry.docker-cn.com\"]\n}\n","$ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512\n","pip install pymilvus>=2.4.2\n","# Python Example: result of len() str cannot be used as \"max-length\" in Milvus \n>>> s = \"你好,世界!\"\n>>> len(s) # Number of characters of s.\n6\n>>> len(bytes(s, \"utf-8\")) # Size in bytes of s, max-length in Milvus.\n18\n","pip install pymilvus>=2.4.2\n"],"headingContent":"Operational FAQ","anchorList":[{"label":"操作常見問題","href":"Operational-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/faq/operational_faq.md b/localization/v2.5.x/site/zh-hant/faq/operational_faq.md new file mode 100644 index 000000000..0f71f4031 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/operational_faq.md @@ -0,0 +1,107 @@ +--- +id: operational_faq.md +summary: 尋找有關 Milvus 營運的常見問題的答案。 +title: 操作常見問題 +--- +

    操作常見問題

    如果我從 Docker Hub 拉取 Milvus Docker 映像失敗怎麼辦?

    如果您從 Docker Hub 拉取 Milvus Docker image 失敗,請嘗試加入其他註冊表鏡像。

    +

    中國大陸的使用者可以在/etc.docker/daemon.json 的 registry-mirrors array 中加入網址 "https://registry.docker-cn.com"。

    +
    {
    +  "registry-mirrors": ["https://registry.docker-cn.com"]
    +}
    +
    +

    Docker 是安裝和執行 Milvus 的唯一方法嗎?

    Docker 是部署 Milvus 的有效方法,但不是唯一的方法。您也可以從原始碼部署 Milvus。這需要 Ubuntu (18.04 或更高版本) 或 CentOS (7 或更高版本)。更多資訊請參閱從原始碼建立 Milvus

    +

    影響召回率的主要因素是什麼?

    召回率主要受索引類型和搜尋參數影響。

    +

    對於 FLAT 索引,Milvus 採取集合內的窮盡掃描,100% 回復。

    +

    對於 IVF 索引,nprobe 參數決定在資料集中的搜尋範圍。增加 nprobe 會增加搜尋向量的比例和召回率,但會降低查詢效能。

    +

    對於 HNSW 索引,ef 參數決定圖搜尋的寬度。增加 ef 會增加在圖表上搜尋的點數量和召回率,但會降低查詢效能。

    +

    如需詳細資訊,請參閱向量索引

    +

    為什麼我對配置檔案的變更沒有生效?

    Milvus 不支援在執行時修改組態檔案。您必須重新啟動 Milvus Docker,配置檔案的變更才會生效。

    +

    我如何知道 Milvus 是否成功啟動?

    如果 Milvus 是使用 Docker Compose 啟動的,請執行docker ps 觀察有多少 Docker 容器正在執行,並檢查 Milvus 服務是否正確啟動。

    +

    對於 Milvus 獨立版本,您應該至少可以觀察到三個執行中的 Docker 容器,其中一個是 Milvus 服務,另外兩個是 etcd 管理和儲存服務。如需詳細資訊,請參閱安裝 Milvus standalone

    +

    為什麼日誌檔中的時間與系統時間不同?

    時間不同通常是因為主機不使用 Coordinated Universal Time (UTC)。

    +

    Docker 映像中的日誌檔案預設使用 UTC。如果您的主機不使用 UTC,可能會發生這個問題。

    +

    我如何知道我的 CPU 是否支援 Milvus?

    Milvus 的運算操作取決於 CPU 對 SIMD (Single Instruction, Multiple Data) 延伸指令集的支援。您的 CPU 是否支援 SIMD 延伸指令集,對 Milvus 的索引建立和向量相似性搜尋至關重要。確保您的 CPU 至少支援下列其中一種 SIMD 指令集:

    +
      +
    • SSE4.2
    • +
    • AVX
    • +
    • AVX2
    • +
    • AVX512
    • +
    +

    執行 lscpu 指令檢查您的 CPU 是否支援上述 SIMD 指令集:

    +
    $ lscpu | grep -e sse4_2 -e avx -e avx2 -e avx512
    +
    +

    為什麼 Milvus 在啟動時返回illegal instruction

    Milvus 要求您的 CPU 支援 SIMD 指令集:SSE4.2、AVX、AVX2 或 AVX512。CPU 必須至少支援其中之一,以確保 Milvus 正常運作。在啟動時返回illegal instruction 錯誤,表示您的 CPU 不支援上述四個指令集中的任何一個。

    +

    請參閱CPU 對 SIMD 指令集的支援

    +

    我可以在 Windows 上安裝 Milvus 嗎?

    可以,您可以從原始碼或二進位套件編譯在 Windows 上安裝 Milvus。

    +

    請參閱在 Windows 上執行 Milvus了解如何在 Windows 上安裝 Milvus。

    +

    我在 Windows 上安裝 pymilvus 時出錯。我該怎麼做?

    不建議在 Windows 上安裝 PyMilvus。但如果您必須在 Windows 上安裝 PyMilvus 但卻發生錯誤,請嘗試在Conda環境中安裝。更多關於如何在 Conda 環境中安裝 PyMilvus 的資訊,請參閱安裝 MilvusSDK

    +

    我可以在斷線時部署 Milvus 嗎?

    可以。您可以在離線環境中安裝 Milvus。更多資訊請參閱離線安裝 Milvus

    +

    我在哪裡可以找到 Milvus 產生的日誌?

    Milvus 日誌預設列印到 stout (標準輸出) 和 stderr (標準錯誤),然而我們強烈建議在生產中重定向您的日誌到一個持久卷。要這樣做,請更新milvus.yaml 中的log.file.rootPath 。如果您使用milvus-helm 圖表部署 Milvus,您也需要先透過--set log.persistence.enabled=true 啟用日誌持久化。

    +

    如果您沒有變更設定,使用 kubectl logs <pod-name> 或 docker logs CONTAINER 也可以幫助您找到日誌。

    +

    在插入資料之前,我可以為一個區段建立索引嗎?

    可以。但我們建議您在為每個區段建立索引之前,先分批插入資料,每批不應超過 256 MB。

    +

    我可以在多個 Milvus 實體中共用一個 etcd 實體嗎?

    是的,您可以在多個 Milvus 實例中共用一個 etcd 實例。要做到這一點,您需要在啟動每個 Milvus 實例之前,將etcd.rootPath 改為每個實例配置文件中的單獨值。

    +

    我可以在多個 Milvus 實例中共用一個 Pulsar 實例嗎?

    是的,您可以在多個 Milvus 實例之間共享一個 Pulsar 實例。要這樣做,你可以

    +
      +
    • 如果在你的 Pulsar 实例上启用了多租户,考虑为每个 Milvus 实例分配一个单独的租户或命名空间。要做到這一點,您需要在啟動 Milvus 實例之前,將其配置檔中的pulsar.tenantpulsar.namespace 改為每個實例的唯一值。
    • +
    • 如果您不打算在 Pulsar 實例上啟用多租戶功能,請考慮在啟動 Milvus 實例之前,將配置檔案中的msgChannel.chanNamePrefix.cluster 變更為每個實例的唯一值。
    • +
    +

    我可以在多個 Milvus 實例中共用一個 MinIO 實例嗎?

    是的,您可以在多個 Milvus 實體之間共用一個 MinIO 實體。要做到這一點,您需要在啟動每個 Milvus 實例之前,將minio.rootPath 改為每個 Milvus 實例在配置文件中的唯一值。

    +

    如何處理pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')> 錯誤訊息?

    錯誤訊息Illegal uri [example.db] 表示您嘗試使用早期版本的 PyMilvus 連線到 Milvus Lite,而早期版本的 PyMilvus 並不支援此連線類型。要解決這個問題,請將你的 PyMilvus 安裝升級到至少 2.4.2 版,它包含了對連線到 Milvus Lite 的支援。

    +

    您可以使用下列指令升級 PyMilvus:

    +
    pip install pymilvus>=2.4.2
    +
    +

    為什麼我得到的結果少於我在搜尋/查詢中設定的limit

    有幾個原因可能會導致您收到的結果比您指定的limit 少:

    +
      +
    • 資料有限:資料集中可能沒有足夠的實體來滿足您所要求的限制。如果集合中的實體總數少於限制,您自然會收到較少的結果。

    • +
    • 重複的主鍵:Milvus 在搜尋過程中遇到重複的主索引鍵時,會優先處理特定的實體。此行為依據搜尋類型而有所不同:

    • +
    • 查詢 (完全匹配):Milvus 選擇具有匹配 PK 的最新實體。 ANN 搜尋:Milvus 選擇相似度得分最高的實體,即使實體共享相同的 PK。 如果您的集合有許多重複的主索引鍵,此優先順序可能會導致比限制更少的唯一結果。

    • +
    • 匹配不足:您的搜尋篩選表達式可能過於嚴格,導致符合相似性臨界值的實體較少。如果為搜尋設定的條件限制性過高,將沒有足夠的實體符合,導致結果少於預期。

    • +
    +

    MilvusClient("milvus_demo.db") gives an error: ModuleNotFoundError: No module named 'milvus_lite'.這是什麼原因造成的,該如何解決?

    當您嘗試在 Windows 平台上使用 Milvus Lite 時,會發生此錯誤。Milvus Lite主要是為Linux環境設計,對Windows可能沒有本機支援。

    +

    解決方法是使用 Linux 環境:

    +
      +
    • 使用 Linux 作業系統或虛擬機器來執行 Milvus Lite。
    • +
    • 此方法可確保與函式庫的相依性及功能相容。
    • +
    +

    Milvus 中的 "Length exceeds max length" 錯誤是什麼?

    Milvus 中的 "Length exceeds max length "錯誤發生在資料元素的大小超過集合或欄位的最大允許大小時。以下是一些範例和解釋:

    +
      +
    • JSON 欄位錯誤:<MilvusException: (code=1100, message=the length (398324) of json field (metadata) exceeds max length (65536): expected=valid length json string, actual=length exceeds max length: invalid parameter)>

    • +
    • 字串長度錯誤:<ParamError: (code=1, message=invalid input, length of string exceeds max length. length: 74238, max length: 60535)>

    • +
    • VarChar 欄位錯誤:<MilvusException: (code=1100, message=the length (60540) of 0th VarChar paragraph exceeds max length (0)%!(EXTRA int64=60535): invalid parameter)>

    • +
    +

    要了解並處理這些錯誤:

    +
      +
    • 瞭解len(str) 在 Python 中代表字元數,而不是以位元組表示的大小。
    • +
    • 對於以字串為基礎的資料類型,例如 VARCHAR 和 JSON,使用len(bytes(str, encoding='utf-8')) 來決定實際大小 (位元組),這也是 Milvus 使用 "max-length" 的原因。
    • +
    +

    Python 中的範例:

    +
    # Python Example: result of len() str cannot be used as "max-length" in Milvus 
    +>>> s = "你好,世界!"
    +>>> len(s) # Number of characters of s.
    +6
    +>>> len(bytes(s, "utf-8")) # Size in bytes of s, max-length in Milvus.
    +18
    +
    +

    pymilvus.exceptions.ConnectionConfigException: <ConnectionConfigException: (code=1, message=Illegal uri: [example.db], expected form 'https://user:pwd@example.com:12345')>.這是什麼原因造成的,該如何解決?

    這個錯誤表示您嘗試使用不支援的早期版本 pymilvus 連線到 Milvus Lite。要解決這個問題,請將您的 pymilvus 安裝升級到至少 2.4.2 版本。這個版本支援連線到 Milvus Lite。要升級,請使用下列指令:

    +
    pip install pymilvus>=2.4.2
    +
    +

    還有問題嗎?

    您可以

    +
      +
    • 查看 GitHub 上的Milvus。隨時提出問題、分享想法並幫助他人。
    • +
    • 加入我們的Milvus 論壇Slack 頻道,尋找支援並參與我們的開放原始碼社群。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/faq/performance_faq.json b/localization/v2.5.x/site/zh-hant/faq/performance_faq.json new file mode 100644 index 000000000..95851445a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/performance_faq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Performance FAQ","anchorList":[{"label":"效能常見問題","href":"Performance-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/faq/performance_faq.md b/localization/v2.5.x/site/zh-hant/faq/performance_faq.md new file mode 100644 index 000000000..259fdad33 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/performance_faq.md @@ -0,0 +1,49 @@ +--- +id: performance_faq.md +summary: 尋找關於搜尋效能、效能增強及其他效能相關問題的常見問題答案。 +title: 效能常見問題 +--- +

    效能常見問題

    如何為 IVF 索引設定nlistnprobe

    設定nlist 需視情況而定。根據經驗,nlist 的建議值是4 × sqrt(n) ,其中n 是段中實體的總數。

    +

    每個區段的大小由datacoord.segment.maxSize 參數決定,預設值為 512 MB。網段 n 中的實體總數可以用datacoord.segment.maxSize 除以每個實體的大小來估計。

    +

    nprobe 的設定是針對資料集和情境而定,並涉及準確性和查詢效能之間的權衡。我們建議透過反覆的實驗找出理想的值。

    +

    以下圖表是在 sift50m 資料集和 IVF_SQ8 索引上執行測試的結果,其中比較了不同nlist/nprobe 對的召回率和查詢效能。

    +

    + + Accuracy test + 精確度測試 Performance test效能測試

    +

    為什麼有時候在較小的資料集上查詢需要較長的時間?

    查詢作業是在區段上進行的。索引可減少查詢資料段所需的時間。如果資料段沒有索引,Milvus 就會對原始資料進行暴力搜尋,大大增加查詢時間。

    +

    因此,在小型資料集(集合)上查詢通常需要較長的時間,因為它尚未建立索引。這是因為其區段的大小尚未達到rootCoord.minSegmentSizeToEnableindex 所設定的索引建立臨界值。呼叫create_index() ,強制 Milvus 為已達到臨界值但尚未自動建立索引的區段建立索引,可大幅改善查詢效能。

    +

    哪些因素影響 CPU 使用量?

    當 Milvus 建立索引或執行查詢時,CPU 使用量會增加。一般而言,除了使用 Annoy(在單一線程上執行)外,索引建立都是 CPU 密集型的。

    +

    當執行查詢時,CPU 使用量會受到nqnprobe 的影響。當nqnprobe 較小的時候,並發量會很低,CPU 使用量也會保持在低水平。

    +

    同時插入資料和搜尋會影響查詢效能嗎?

    插入作業不是 CPU 密集型作業。然而,由於新的區段可能尚未達到建立索引的臨界值,Milvus 會採用強制搜尋,這會嚴重影響查詢效能。

    +

    rootcoord.minSegmentSizeToEnableIndex 參數決定段的索引建立臨界值,預設為 1024 行。如需詳細資訊,請參閱系統設定

    +

    索引 VARCHAR 欄位可以提高刪除速度嗎?

    為 VARCHAR 欄位建立索引可以加快「Delete By Expression」作業的速度,但僅限於特定情況:

    +
      +
    • INVERTED 索引:此索引有助於非主索引鍵 VARCHAR 欄位上的IN== 表達式。
    • +
    • Trie 索引:此索引有助於非主鍵 VARCHAR 欄位上的前綴查詢 (例如LIKE prefix%)。
    • +
    +

    但是,索引 VARCHAR 欄位並不會加快速度:

    +
      +
    • 按 ID 刪除:當 VARCHAR 欄位是主索引鍵時。
    • +
    • 不相關的表達:當 VARCHAR 欄位不是刪除表達式的一部分時。
    • +
    +

    還有問題嗎?

    您可以

    +
      +
    • 在 GitHub 上查看Milvus。隨時提出問題、分享想法並幫助他人。
    • +
    • 加入我們的Slack 頻道,尋找支援並參與我們的開放原始碼社群。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/faq/product_faq.json b/localization/v2.5.x/site/zh-hant/faq/product_faq.json new file mode 100644 index 000000000..0ab701d42 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/product_faq.json @@ -0,0 +1 @@ +{"codeList":["60 * 2 * 4 + 40 * 1 * 12 = 960\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n","proxy:\n grpc:\n serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte\n"],"headingContent":"Product FAQ","anchorList":[{"label":"產品常見問題","href":"Product-FAQ","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/faq/product_faq.md b/localization/v2.5.x/site/zh-hant/faq/product_faq.md new file mode 100644 index 000000000..1ea09596b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/product_faq.md @@ -0,0 +1,100 @@ +--- +id: product_faq.md +summary: 尋找關於全球最先進向量資料庫常見問題的答案。 +title: 產品常見問題 +--- +

    產品常見問題

    Milvus 的成本是多少?

    Milvus 是一個 100% 免費的開源專案。

    +

    當使用 Milvus 作生產或發行用途時,請遵守Apache License 2.0

    +

    Milvus 背後的公司 Zilliz 也提供完全管理雲端版本的平台,給那些不想建立和維護自己的分散式實例的人。Zilliz Cloud會自動維護資料的可靠性,並允許使用者只需為他們所使用的付費。

    +

    Milvus 支援非 x86 架構嗎?

    Milvus 不能在非 x86 平台上安裝或運行。

    +

    您的 CPU 必須支援下列指令集之一才能執行 Milvus:SSE4.2、AVX、AVX2、AVX512。這些都是 x86 專用的 SIMD 指令集。

    +

    Milvus 在哪裡儲存資料?

    Milvus 處理兩種類型的資料,插入資料和元資料。

    +

    插入的資料,包括向量資料、標量資料和特定於集合的模式,會以增量日誌的方式儲存於持久性儲存空間。Milvus 支援多種物件儲存後端,包括MinIOAWS S3Google Cloud Storage(GCS)、Azure Blob Storage阿里雲 OSS 及騰訊 Cloud Object Storage(COS)。

    +

    Metadata 在 Milvus 內產生。每個 Milvus 模組都有自己的元資料,並儲存在 etcd 中。

    +

    為什麼 etcd 中沒有向量資料?

    etcd 儲存 Milvus 模組元資料;MinIO 儲存實體。

    +

    Milvus 支援同時插入和查詢資料嗎?

    是的。插入作業和查詢作業由兩個獨立的模組處理,它們是相互獨立的。從客戶端的角度來看,當插入的資料進入訊息佇列時,插入作業就完成了。但是,插入的資料在載入查詢節點之前是無法查詢的。如果區段大小未達到建立索引的臨界值 (預設為 512 MB),Milvus 就會採用暴力搜尋,而查詢效能可能會降低。

    +

    有重複主鍵的向量可以插入 Milvus 嗎?

    可以。Milvus 不檢查向量的主鍵是否重複。

    +

    當插入具有重複主鍵的向量時,Milvus 是否將其視為更新操作?

    Milvus 目前不支持更新操作,也不檢查實體主鍵是否重複。您有責任確保實體的主索引鍵是唯一的,如果它們不是唯一的,Milvus 可能包含多個具有重複主索引鍵的實體。

    +

    如果發生這種情況,查詢時將返回哪個資料副本仍是未知行為。此限制將在未來的版本中修復。

    +

    自定義實體主鍵的最大長度是多少?

    實體主鍵必須是非負 64 位元整數。

    +

    每次插入操作可新增的最大資料量是多少?

    插入操作的大小不得超過 1,024 MB。這是 gRPC 施加的限制。

    +

    在特定分區中搜尋時,集合大小會影響查詢效能嗎?

    如果指定了搜索的分區,Milvus 只搜索指定的分區。

    +

    這取決於搜尋需要哪些資料。所有可能出現在搜尋結果的磁碟分割都必須在搜尋前載入。

    +
      +
    • 例如,如果您只想搜尋特定的磁碟分割,則不需要載入所有磁碟分割。呼叫load_partition() 載入想要的磁碟分割,然後在 search() 方法呼叫中指定磁碟分割。
    • +
    • 如果要搜尋所有磁碟分割,請呼叫load_collection() 載入整個集合,包括所有磁碟分割。
    • +
    • 如果您在搜尋之前沒有載入資料集或特定的分割區,Milvus 會返回錯誤。
    • +
    +

    插入向量後可以建立索引嗎?

    是的。如果之前create_index() 已經為一個集合建立了索引,Milvus 會自動為隨後插入的向量建立索引。然而,Milvus 在新插入的向量填滿整個區段之前不會建立索引,而且新建立的索引檔案與之前的檔案是分開的。

    +

    FLAT 和 IVF_FLAT 索引有什麼不同?

    IVF_FLAT 索引將向量空間分為列表簇。在預設的列表值為 16,384 時,Milvus 會比較目標向量與所有 16,384 個簇的中心點之間的距離,以回傳探針最近的簇。接著,Milvus 會比較目標向量和選取的叢集中向量之間的距離,以得到最近的向量。與 IVF_FLAT 不同,FLAT 直接比較目標向量與其他向量之間的距離。

    +

    當向量的總數大約等於 nlist 時,IVF_FLAT 和 FLAT 在計算需求和搜尋效能上的距離不大。然而,當向量的數量超過 nlist 的兩倍以上時,IVF_FLAT 就開始展現出效能優勢。

    +

    更多資訊請參閱向量索引

    +

    Milvus 如何刷新資料?

    當插入的資料被攝取到訊息佇列時,Milvus 會返回成功。然而,資料尚未刷新到磁碟。然後 Milvus 的資料節點會將訊息佇列中的資料以增量日誌的方式寫入持久性儲存空間。如果呼叫flush() ,資料節點會被強制立即將訊息佇列中的所有資料寫入持久性儲存空間。

    +

    什麼是規範化?為什麼需要規範化?

    規範化是指轉換向量使其規範等於 1 的過程。如果使用內積來計算向量相似性,向量就必須歸一化。歸一化之後,內積等於余弦相似度。

    +

    更多資訊請參閱維基百科

    +

    為什麼 Euclidean distance (L2) 和 inner product (IP) 會傳回不同的結果?

    對於規範化向量,歐氏距離 (L2) 在數學上等於內乘積 (IP)。如果這些相似度指標返回不同的結果,請檢查您的向量是否已歸一化

    +

    Milvus 的集合和分區總數有限制嗎?

    有。您最多可以在一個 Milvus 實例中建立 65,535 個集合。在計算現有集合的數量時,Milvus 會計算所有包含分片和分區的集合。

    +

    例如,假設您已經建立了 100 個集合,其中 60 個集合有 2 個分塊和 4 個磁碟分割,其餘 40 個集合有 1 個分塊和 12 個磁碟分割。目前的集合數量可計算為

    +
    60 * 2 * 4 + 40 * 1 * 12 = 960
    +
    +

    搜尋topk 向量時,為何得到的向量少於 k 個?

    在 Milvus 支援的索引中,IVF_FLAT 和 IVF_SQ8 實作 k-means 聚類方法。資料空間被分割成nlist 叢集,插入的向量會分佈到這些叢集中。然後,Milvus 選擇nprobe 最近的簇,比較目標向量與所選簇中所有向量的距離,並傳回最後的結果。

    +

    如果nlisttopk 較大,而 nprobe 較小,則 nprobe 叢集中的向量數目可能會少於k 。因此,當您搜尋topk 最近的向量時,返回的向量數目會少於k

    +

    要避免這種情況,請嘗試將nprobe 設得大一些,將nlistk 設得小一些。

    +

    更多資訊請參閱向量索引

    +

    Milvus 支援的最大向量維度是多少?

    Milvus 預設最多可以管理 32,768 維度的向量。您可以增加Proxy.maxDimension 的值,以允許更大維度的向量。

    +

    Milvus 支援 Apple M1 CPU 嗎?

    目前的 Milvus 版本不直接支援蘋果 M1 CPU。Milvus 2.3 之後,Milvus 提供 ARM64 架構的 Docker 映像檔。

    +

    Milvus 的主鍵欄位支援哪些資料類型?

    在目前的版本中,Milvus 支援 INT64 和字串。

    +

    Milvus 是否可擴充?

    是的,您可以透過 Kubernetes 上的 Helm Chart 部署多個節點的 Milvus 集群。更多說明,請參考Scale Guide

    +

    什麼是 Growing segment 和 sealed segment?

    當有搜尋要求時,Milvus 會同時搜尋增量資料和歷史資料。增量資料是最近的更新,它們會儲存在成長中的區段,在它們達到要持久化到物件儲存的臨界值之前,這些區段會在記憶體中緩衝,並為它們建立更有效率的索引;而歷史資料是一段時間前的更新。歷史資料則是前一陣子的更新,它們位於已持久化到物件儲存空間的封存區段中。增量資料和歷史資料共同構成搜尋的整個資料集。這樣的設計使得任何輸入到 Milvus 的資料都可以立即搜尋。對於 Milvus Distributed 而言,有更多複雜的因素決定剛擷取的記錄何時可以顯示在搜尋結果中。了解更多關於一致性層級的細節。

    +

    是的。對於同一個資料集的查詢,Milvus 可以同時搜尋增量和歷史資料。但是,對不同集合的查詢是串聯進行的。而歷史資料可能是一個極為龐大的資料集,在歷史資料上的搜尋相對地更耗費時間,基本上是串聯進行的。

    +

    為什麼 MinIO 中的資料在相對應的資料集被刪除後仍會保留?

    MinIO 中的資料被設計成保留一段時間,以方便資料回滾。

    +

    Milvus 支援 Pulsar 以外的訊息引擎嗎?

    是的。Milvus 2.1.0 支援 Kafka。

    +

    搜尋與查詢有什麼不同?

    在 Milvus 中,向量相似性搜尋是根據相似性計算和向量索引加速來擷取向量。與向量相似性搜尋不同,向量查詢是透過基於布林表達式的標量篩選來擷取向量。布林表達式會對標量欄位或主要關鍵欄位進行篩選,並擷取符合篩選條件的所有結果。在查詢中,既不涉及相似度指標,也不涉及向量索引。

    +

    為什麼在 Milvus 中,浮點向量值的精確度是小數點後 7 位數?

    Milvus 支援將向量儲存為 Float32 陣列。Float32 值的精確度是小數點後 7 位數。即使是 Float64 值,例如 1.3476964684980388,Milvus 也會將其儲存為 1.347696。因此,當您從 Milvus 擷取這樣的向量時,Float64 值的精確度就會消失。

    +

    Milvus 如何處理向量資料類型和精確度?

    Milvus 支援二進位、Float32、Float16 和 BFloat16 向量類型。

    +
      +
    • 二進位向量:以 0 和 1 的序列儲存二進位資料,用於影像處理和資訊檢索。
    • +
    • Float32 向量:預設的儲存精確度約為十進位的 7 位數。即使是 Float64 值,也是以 Float32 精度儲存,可能會在檢索時造成精確度的損失。
    • +
    • Float16 和 BFloat16 向量:提供較低的精確度和記憶體使用量。Float16 適用於頻寬和儲存空間有限的應用程式,而 BFloat16 則平衡範圍和效率,常用於深度學習,以降低計算需求,而不會顯著影響精確度。
    • +
    +

    Milvus 是否支援指定標量或向量欄位的預設值?

    目前,Milvus 2.4.x 不支援指定標量或向量欄位的預設值。此功能將在未來的版本中提供。

    +

    在 Milvus 中刪除資料後,儲存空間會立即釋放嗎?

    不,當您在 Milvus 刪除資料時,儲存空間不會立即釋放。雖然刪除資料會將實體標記為 「邏輯上已刪除」,但實際空間可能不會立即釋放。原因如下:

    +
      +
    • 壓縮:Milvus 會在背景自動壓縮資料。此過程會將較小的資料區段合併為較大的區段,並移除邏輯上已刪除的資料 (標示為刪除的實體) 或已超過使用時間 (TTL) 的資料。但是,壓縮會建立新的區段,同時將舊的區段標記為 「已丟棄」。
    • +
    • 垃圾回收:稱為垃圾回收 (GC) 的獨立程序會定期移除這些「已丟棄」的區段,釋放它們所佔用的儲存空間。這可確保儲存空間的有效使用,但可能會在刪除與空間回收之間產生少許延遲。
    • +
    +

    我可以在操作後立即看到插入、刪除或上插的資料而不需要等待刷新嗎?

    可以,在 Milvus 中,由於其儲存-運算分解架構,資料可讀性與刷新作業沒有直接關聯。您可以使用一致性層級管理資料的可讀性。

    +

    選擇一致性等級時,請考慮一致性與效能之間的權衡。對於需要立即可見性的作業,請使用「強」一致性層級。若要加快寫入速度,請優先使用較弱的一致性 (資料可能無法立即可見)。如需詳細資訊,請參閱一致性

    +

    啟用分割區金鑰功能後,Milvus 中num_partitions 的預設值是多少,為什麼?

    啟用分割區金鑰功能後,Milvus 中num_partitions 的預設值設定為16 。 選擇此預設值是基於穩定性和效能原因。您可以根據需要調整num_partitions 值,方法是在create_collection 函式中指定該值。

    +

    標量篩選表達式有最大長度限制嗎?

    有,標量過濾表達式的最大長度受 RPC 傳輸限制的約束,該限制在milvus.yaml 配置檔中定義。具體來說,該限制由代理部分下的serverMaxRecvSize 參數設定:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    預設情況下,每個 RPC 請求的最大大小為 64MB。因此,過濾表達式的長度必須小於此限制,才能確保成功處理。

    +

    執行大量向量搜尋時,一次可以指定多少個向量?有限制嗎?

    是的,在批量向量搜索中可以指定的向量數量受限於 RPC 傳輸大小,該大小在milvus.yaml 配置文件中定義。此限制由代理部分下的serverMaxRecvSize 參數決定:

    +
    proxy:
    +  grpc:
    +    serverMaxRecvSize: 67108864 # The maximum size of each RPC request that the proxy can receive, unit: byte
    +
    +

    預設情況下,每個 RPC 請求的最大大小為 64MB。因此,輸入向量的總大小(包括其尺寸資料和元資料)必須小於此限制,才能確保成功執行。

    +

    還有問題嗎?

    您可以

    +
      +
    • 在 GitHub 上查看Milvus。歡迎您提出問題、分享想法並幫助他人。
    • +
    • 加入我們的Slack 社群,尋找支援並參與我們的開放原始碼社群。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/faq/troubleshooting.json b/localization/v2.5.x/site/zh-hant/faq/troubleshooting.json new file mode 100644 index 000000000..453b75a3a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/troubleshooting.json @@ -0,0 +1 @@ +{"codeList":["$ docker logs \n","kubectl scale sts --replicas=1\n# delete the pvc for etcd-1 and etcd-2\nkubectl scale sts --replicas=3\n","kubectl kubectl scale sts --replicas=0\n# delete the pvc for etcd-0, etcd-1, etcd-2\nkubectl kubectl scale sts --replicas=1\n# restore the backup data\n"],"headingContent":"Troubleshooting","anchorList":[{"label":"疑難排解","href":"Troubleshooting","type":1,"isActive":false},{"label":"開機問題","href":"Boot-issues","type":2,"isActive":false},{"label":"運行時問題","href":"Runtime-issues","type":2,"isActive":false},{"label":"API 問題","href":"API-issues","type":2,"isActive":false},{"label":"etcd 崩潰問題","href":"etcd-crash-issues","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/faq/troubleshooting.md b/localization/v2.5.x/site/zh-hant/faq/troubleshooting.md new file mode 100644 index 000000000..000fcf5aa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/faq/troubleshooting.md @@ -0,0 +1,112 @@ +--- +id: troubleshooting.md +summary: 了解您在使用 Milvus 時可能遇到的常見問題,以及如何克服這些問題。 +title: 疑難排解 +--- +

    疑難排解

    本頁列出運行 Milvus 時可能發生的常見問題,以及可能的故障排除提示。本頁面的問題分為以下幾類:

    + +

    開機問題

    開機錯誤通常是致命的。執行下列指令可檢視錯誤的詳細資訊:

    +
    $ docker logs <your milvus container id>
    +
    +

    運行時問題

    運行期間發生的錯誤可能會導致服務癱瘓。若要排除此問題,請先檢查伺服器與用戶端的相容性,然後再繼續進行。

    +

    API 問題

    這些問題發生在 Milvus 伺服器和客戶端之間的 API 方法呼叫期間。它們會同步或非同步地傳回給用戶端。

    +

    etcd 崩潰問題

    1. etcd pod 待定

    etcd 集群預設使用 pvc。StorageClass 需要為 Kubernetes 叢集預先設定。

    +

    2. etcd pod 崩溃

    當 etcd pod 崩潰時,Error: bad member ID arg (strconv.ParseUint: parsing "": invalid syntax), expecting ID in Hex ,您可以登入此 pod 並刪除/bitnami/etcd/data/member_id 檔案。

    +

    3.當etcd-0 仍在執行時,多個 Pod 持續當機

    如果多個 Pod 在etcd-0 仍在執行時持續當機,您可以執行下列程式碼。

    +
    kubectl scale sts <etcd-sts> --replicas=1
    +# delete the pvc for etcd-1 and etcd-2
    +kubectl scale sts <etcd-sts> --replicas=3
    +
    +

    4.所有 pod 都當機

    當所有 pod 都當機時,請嘗試複製/bitnami/etcd/data/member/snap/db 檔案。使用https://github.com/etcd-io/bbolt 修改資料庫資料。

    +

    所有 Milvus 元資料都保存在key 資料桶中。備份此資料桶中的資料,並執行下列指令。請注意,by-dev/meta/session 檔案中的前綴資料不需要備份。

    +
    kubectl kubectl scale sts <etcd-sts> --replicas=0
    +# delete the pvc for etcd-0, etcd-1, etcd-2
    +kubectl kubectl scale sts <etcd-sts> --replicas=1
    +# restore the backup data
    +
    +


    +

    如果您需要協助解決問題,請隨時

    +
      +
    • 加入我們的Slack 頻道,向 Milvus 團隊尋求支援。
    • +
    • 在 GitHub 上提交問題,並詳細說明您的問題。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install-overview.json b/localization/v2.5.x/site/zh-hant/getstarted/install-overview.json new file mode 100644 index 000000000..81c5796b7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview of Milvus Deployment Options","anchorList":[{"label":"Milvus 部署選項概述","href":"Overview-of-Milvus-Deployment-Options","type":1,"isActive":false},{"label":"Milvus Lite","href":"Milvus-Lite","type":2,"isActive":false},{"label":"Milvus 單機版","href":"Milvus-Standalone","type":2,"isActive":false},{"label":"分散式 Milvus","href":"Milvus-Distributed","type":2,"isActive":false},{"label":"為您的使用個案選擇正確的部署模式","href":"Choose-the-Right-Deployment-for-Your-Use-Case","type":2,"isActive":false},{"label":"功能比較","href":"Comparison-on-functionalities","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install-overview.md b/localization/v2.5.x/site/zh-hant/getstarted/install-overview.md new file mode 100644 index 000000000..c876ab43e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install-overview.md @@ -0,0 +1,137 @@ +--- +id: install-overview.md +summary: >- + Milvus 是一個高效能、可擴充的向量資料庫。它支援各種規模的使用案例,從在本機 Jupyter Notebooks + 中執行的示範,到處理數百億向量的大規模 Kubernetes 集群。目前,Milvus 有三種部署選項_Milvus Lite、Milvus + Standalone 和 Milvus Distributed。 +title: Milvus 部署選項概述 +--- +

    Milvus 部署選項概述

    Milvus 是一個高效能、可擴充的向量資料庫。它支援各種規模的使用案例,從在本機 Jupyter Notebooks 中執行的示範,到處理數百億向量的大型 Kubernetes 集群。目前,Milvus 有三種部署選項:Milvus Lite、Milvus Standalone 和 Milvus Distributed。

    +

    Milvus Lite

    Milvus Lite是可匯入您應用程式的 Python 函式庫。作為 Milvus 的輕量級版本,它非常適合在 Jupyter Notebook 或資源有限的智慧型裝置上執行快速原型。Milvus Lite 支援與其他 Milvus 部署相同的 API。與 Milvus Lite 互動的用戶端程式碼也可以在其他部署模式下與 Milvus 實體一起運作。

    +

    要將 Milvus Lite 整合到您的應用程式中,請執行pip install pymilvus 來安裝它,並使用MilvusClient("./demo.db") 語句來實體化一個向量資料庫,該資料庫的本機檔案會持久化您所有的資料。如需更多詳細資訊,請參閱運行 Milvus Lite

    +

    Milvus 單機版

    Milvus Standalone 是單機伺服器部署。Milvus Standalone 的所有元件都包裝在單一Docker 映像檔中,讓部署更方便。如果您有生產工作負載,但又不想使用 Kubernetes,在有足夠記憶體的單機上執行 Milvus Standalone 是個不錯的選擇。此外,Milvus Standalone 透過主從複製支援高可用性。

    +

    分散式 Milvus

    Milvus Distributed 可以部署在Kubernetes集群上。此部署採用雲原生架構,擷取負載和搜尋查詢分別由獨立節點處理,讓關鍵元件具有備援。它提供最高的可擴充性和可用性,以及自訂每個元件所分配資源的彈性。Milvus Distributed 是企業用戶在生產中運行大型向量搜索系統的首選。

    +

    為您的使用個案選擇正確的部署模式

    部署模式的選擇通常取決於您應用程式的開發階段:

    +
      +
    • 用於快速原型

      +

      如果您想快速建立原型或作為學習用途,例如檢索擴增世代 (Retrieval Augmented Generation, RAG) demo、AI 聊天機、多模態搜尋,Milvus Lite 本身或 Milvus Lite 與 Milvus Standalone 的組合都很適合。您可以在筆記型電腦中使用 Milvus Lite 進行快速原型設計,並探索各種方法,例如 RAG 中的不同分塊策略。您可能希望將 Milvus Lite 建立的應用程式部署到小規模的生產中,以服務真正的使用者,或在較大的資料集上驗證想法,例如超過幾百萬的向量。Milvus Standalone 是合適的。Milvus Lite 的應用程式邏輯仍可共用,因為所有 Milvus 部署都有相同的客戶端 API。Milvus Lite 儲存的資料也可以透過命令列工具移植到 Milvus Standalone。

    • +
    • 小規模生產部署

      +

      對於早期階段的生產,當專案仍在尋求產品與市場的契合,敏捷性比可擴展性更重要時,Milvus Standalone 是最好的選擇。只要有足夠的機器資源,Milvus Standalone 仍可擴充至 1 億向量,同時對 DevOps 的需求遠低於維護 K8s 集群。

    • +
    • 大型生產部署

      +

      當您的業務快速成長,資料規模超過單一伺服器的容量,是時候考慮Milvus Distributed。您可以繼續使用Milvus Standalone作為開發或暫存環境,並運行Milvus Distributed的K8s集群。這可讓您持續處理數百億個向量,並可針對您的特定工作負載,例如高讀取次數、低寫入次數或高寫入次數、低讀取次數的情況,彈性調整節點大小。

    • +
    • 邊緣裝置上的本機搜尋

      +

      若要在邊緣裝置上搜尋私人或敏感資料,您可以在裝置上部署 Milvus Lite,而無需依賴雲端服務來進行文字或影像搜尋。這適用於專屬文件搜尋或裝置上物件偵測等情況。

    • +
    +

    Milvus 部署模式的選擇取決於您專案的階段與規模。Milvus 提供靈活且功能強大的解決方案,可滿足從快速原型到大規模企業部署的各種需求。

    +
      +
    • Milvus Lite建議用於較小的資料集,最多可達數百萬向量。
    • +
    • Milvus Standalone適用於中型資料集,最多可擴充至 1 億向量。
    • +
    • Milvus Distributed專為大規模部署而設計,能夠處理從 1 億到數百億向量的資料集。
    • +
    +

    + + Select deployment option for your use case + 選擇適合您使用情況的部署選項

    +

    功能比較

    + + + + + + + + + + + +
    特點Milvus LiteMilvus 單機版分散式
    SDK / 客戶端軟體Python
    gRPC
    Python
    Go
    Java
    Node.js
    C#
    RESTful
    Python
    Java
    Go
    Node.js
    C#
    RESTful
    資料類型Dense Vector
    Sparse Vector
    Binary Vector
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    Dense Vector
    Sparse Vector
    Binary Vector
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    Dense Vector
    Sparse Vector
    Binary Vector
    Boolean
    Integer
    Floating Point
    VarChar
    Array
    JSON
    搜尋功能向量搜尋 (ANN Search)
    元資料篩選
    範圍搜尋
    標量查詢
    依主索引鍵取得實體
    混合搜尋
    向量搜尋 (ANN Search)
    元資料篩選
    範圍搜尋
    標量查詢
    依主索引鍵取得實體
    混合搜尋
    向量搜尋 (ANN 搜尋)
    元資料篩選
    範圍搜尋
    標量查詢
    依主索引鍵取得實體
    混合搜尋
    CRUD 操作✔️✔️✔️
    進階資料管理不適用存取控制
    磁碟分割
    磁碟分割金鑰
    存取控制
    磁碟分割
    磁碟分割金鑰
    實體資源群組
    一致性等級
    有限制的停滯性
    會話
    最終

    有限制的不穩定性
    會話
    最終
    diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.json b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.json new file mode 100644 index 000000000..9cdec13f8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.json @@ -0,0 +1 @@ +{"codeList":["$ go get -u github.com/milvus-io/milvus-sdk-go/v2\n"],"headingContent":"Install Milvus Go SDK","anchorList":[{"label":"安裝 Milvus Go SDK","href":"Install-Milvus-Go-SDK","type":1,"isActive":false},{"label":"需求","href":"Requirement","type":2,"isActive":false},{"label":"安裝 Milvus GO SDK","href":"Install-Milvus-GO-SDK","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.md b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.md new file mode 100644 index 000000000..2f065226b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-go.md @@ -0,0 +1,83 @@ +--- +id: install-go.md +label: Install GO SDK +related_key: SDK +summary: 學習如何安裝 Milvus 的 GO SDK。 +title: 安裝 Milvus Go SDK +--- +

    安裝 Milvus Go SDK

    本主題描述如何為 Milvus 安裝 Milvus Go SDK。

    +

    目前版本的 Milvus 支援 Python、Node.js、GO 及 Java 的 SDK。

    +

    需求

    需要使用 GO (1.17 或更新版本)。

    +

    安裝 Milvus GO SDK

    透過go get 安裝 Milvus GO SDK 及相依套件。

    +
    $ go get -u github.com/milvus-io/milvus-sdk-go/v2
    +
    +

    下一步

    安裝 Milvus GO SDK 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.json b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.json new file mode 100644 index 000000000..599cf366b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.json @@ -0,0 +1 @@ +{"codeList":["\n io.milvus\n milvus-sdk-java\n 2.5.4\n\n","implementation 'io.milvus:milvus-sdk-java:2.5.4'\n"],"headingContent":"Install Milvus Java SDK","anchorList":[{"label":"安裝 Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":1,"isActive":false},{"label":"需求","href":"Requirement","type":2,"isActive":false},{"label":"安裝 Milvus Java SDK","href":"Install-Milvus-Java-SDK","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.md b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.md new file mode 100644 index 000000000..0e67c9199 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-java.md @@ -0,0 +1,100 @@ +--- +id: install-java.md +label: Install Java SDK +related_key: SDK +summary: 學習如何安裝 Milvus 的 Java SDK。 +title: 安裝 Milvus Java SDK +--- +

    安裝 Milvus Java SDK

    本主題描述如何為 Milvus 安裝 Milvus Java SDK。

    +

    目前版本的 Milvus 支援 Python、Node.js、GO 及 Java SDK。

    +

    需求

      +
    • Java (8 或更新版本)
    • +
    • Apache Maven 或 Gradle/Grails
    • +
    +

    安裝 Milvus Java SDK

    執行以下指令來安裝 Milvus Java SDK。

    +
      +
    • Apache Maven
    • +
    +
    <dependency>
    +    <groupId>io.milvus</groupId>
    +    <artifactId>milvus-sdk-java</artifactId>
    +    <version>2.5.4</version>
    +</dependency>
    +
    +
      +
    • Gradle/Grails
    • +
    +
    implementation 'io.milvus:milvus-sdk-java:2.5.4'
    +
    +

    下一步

    安裝 Milvus Java SDK 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.json b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.json new file mode 100644 index 000000000..83cf8dcb6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.json @@ -0,0 +1 @@ +{"codeList":["npm install @zilliz/milvus2-sdk-node\n# or ...\nyarn add @zilliz/milvus2-sdk-node\n"],"headingContent":"Install Milvus Nodejs SDK","anchorList":[{"label":"安裝 Milvus Nodejs SDK","href":"Install-Milvus-Nodejs-SDK","type":1,"isActive":false},{"label":"相容性","href":"Compatibility","type":2,"isActive":false},{"label":"需求","href":"Requirement","type":2,"isActive":false},{"label":"安裝","href":"Installation","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.md b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.md new file mode 100644 index 000000000..5630637f3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-node.md @@ -0,0 +1,118 @@ +--- +id: install-node.md +label: Install Node.js SDK +related_key: SDK +summary: 學習如何安裝 Milvus 的 Node.js SDK。 +title: 安裝 Milvus Nodejs SDK +--- +

    安裝 Milvus Nodejs SDK

    本主題描述如何為 Milvus 安裝 Milvus Node.js SDK。

    +

    相容性

    以下集合顯示 Milvus 版本和推薦的 @zilliz/milvus2-sdk-node 版本:

    + + + + + + + + + + + + + +
    Milvus 版本推薦的 @zilliz/milvus2-sdk-node 版本
    2.5.x最新版本
    2.4.x2.4.10
    2.3.x2.3.5
    2.2.x2.2.x
    2.1.x2.1.x
    2.0.12.0.0, 2.0.1
    2.0.02.0.0
    +

    需求

    Node.js v18+

    +

    安裝

    開始使用 Milvus node.js 客戶端的建議方式是使用 npm (Node 套件管理員) 在您的專案中安裝相依性。

    +
    npm install @zilliz/milvus2-sdk-node
    +# or ...
    +yarn add @zilliz/milvus2-sdk-node
    +
    +

    這將會下載 Milvus node.js sdk,並在您的 package.json 檔案中加入依賴項目。

    +

    下一步

    安裝 Milvus Node.js SDK 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.json b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.json new file mode 100644 index 000000000..7f4045af2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.json @@ -0,0 +1 @@ +{"codeList":["$ python3 -m pip install pymilvus==2.5.3\n","$ python3 -c \"from pymilvus import Collection\"\n"],"headingContent":"Install Milvus Python SDK","anchorList":[{"label":"安裝 Milvus Python SDK","href":"Install-Milvus-Python-SDK","type":1,"isActive":false},{"label":"需求","href":"Requirements","type":2,"isActive":false},{"label":"透過 pip 安裝 PyMilvus","href":"Install-PyMilvus-via-pip","type":2,"isActive":false},{"label":"驗證安裝","href":"Verify-installation","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.md b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.md new file mode 100644 index 000000000..36dd993d8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/install_SDKs/install-pymilvus.md @@ -0,0 +1,109 @@ +--- +id: install-pymilvus.md +label: Install PyMilvus +related_key: SDK +summary: 學習如何安裝 Milvus 的 Python SDK。 +title: 安裝 Milvus Python SDK +--- +

    安裝 Milvus Python SDK

    本主題描述如何為 Milvus 安裝 Milvus python SDK pymilvus。

    +

    目前版本的 Milvus 支援 Python、Node.js、GO 及 Java SDK。

    +

    需求

      +
    • 需要 Python 3.7 或更新版本。
    • +
    • 已安裝 Google protobuf。您可以使用pip3 install protobuf==3.20.0 指令來安裝。
    • +
    • 已安裝 grpcio-tools。您可以使用命令pip3 install grpcio-tools 安裝。
    • +
    +

    透過 pip 安裝 PyMilvus

    PyMilvus 可在Python Package Index 中找到。

    +
    +建議安裝與您安裝的 Milvus 伺服器版本相符的 PyMilvus 版本。如需詳細資訊,請參閱Release Notes
    +
    $ python3 -m pip install pymilvus==2.5.3
    +
    +

    驗證安裝

    如果 PyMilvus 已正確安裝,當你執行下列命令時將不會產生任何異常。

    +
    $ python3 -c "from pymilvus import Collection"
    +
    +

    下一步

    安裝 PyMilvus 之後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.json b/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.json new file mode 100644 index 000000000..06bc6b3da --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.json @@ -0,0 +1 @@ +{"codeList":["pip install -U pymilvus\n","from pymilvus import MilvusClient\nclient = MilvusClient(\"./milvus_demo.db\")\n","from pymilvus import MilvusClient\nimport numpy as np\n\nclient = MilvusClient(\"./milvus_demo.db\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=384 # The vectors we will use in this demo has 384 dimensions\n)\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# For illustration, here we use fake vectors with random numbers (384 dimension).\n\nvectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]\ndata = [ {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"} for i in range(len(vectors)) ]\nres = client.insert(\n collection_name=\"demo_collection\",\n data=data\n)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=[vectors[0]],\n filter=\"subject == 'history'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# a query that retrieves all entities matching filter expressions.\nres = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\nprint(res)\n\n# delete\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n)\nprint(res)\n","# Install\npip install -U \"pymilvus[bulk_writer]\"\n\nmilvus-lite dump -h\n\nusage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]\n\noptional arguments:\n -h, --help show this help message and exit\n -d DB_FILE, --db-file DB_FILE\n milvus lite db file\n -c COLLECTION, --collection COLLECTION\n collection that need to be dumped\n -p PATH, --path PATH dump file storage dir\n","milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir\n# ./milvus_demo.db: milvus lite db file\n# demo_collection: collection that need to be dumped\n#./data_dir : dump file storage dir\n"],"headingContent":"Run Milvus Lite Locally","anchorList":[{"label":"本地運行 Milvus Lite","href":"Run-Milvus-Lite-Locally","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定 Milvus Lite","href":"Set-up-Milvus-Lite","type":2,"isActive":false},{"label":"連接至 Milvus Lite","href":"Connect-to-Milvus-Lite","type":2,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"從 Milvus Lite 遷移資料","href":"Migrating-data-from-Milvus-Lite","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.md b/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.md new file mode 100644 index 000000000..79613495d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/milvus_lite.md @@ -0,0 +1,412 @@ +--- +id: milvus_lite.md +summary: 開始使用 Milvus Lite。 +title: 本地運行 Milvus Lite +--- +

    本地運行 Milvus Lite

    本頁說明如何使用 Milvus Lite 在本機執行 Milvus。Milvus Lite 是Milvus 的輕量級版本,Milvus 是一個開放源碼向量資料庫,可透過向量嵌入和相似性搜尋為 AI 應用程式提供動力。

    +

    概述

    Milvus Lite 可以匯入您的 Python 應用程式,提供 Milvus 的核心向量搜尋功能。Milvus Lite 已包含在Milvus 的 Python SDK 中。它可以簡單地透過pip install pymilvus 部署。

    +

    使用 Milvus Lite,您可以在幾分鐘內開始建立具有向量相似性搜尋的 AI 應用程式!Milvus Lite 適合在下列環境中執行:

    +
      +
    • Jupyter Notebook / Google Colab
    • +
    • 筆記型電腦
    • +
    • 邊緣裝置
    • +
    +

    Milvus Lite 與 Milvus Standalone 和 Distributed 共用相同的 API,並涵蓋大部分功能,例如向量資料持久化和管理、向量 CRUD 操作、稀疏和密集向量搜尋、元資料過濾、多向量和混合搜尋。這兩項功能可在不同類型的環境中提供一致的體驗,從邊緣裝置到雲端集群,適合不同規模的使用個案。使用相同的客戶端程式碼,您可以在筆記型電腦或 Jupyter Notebook 上使用 Milvus Lite 執行 GenAI 應用程式,或在 Docker 容器上使用 Milvus Standalone 執行 GenAI 應用程式,或在大型 Kubernetes 叢集上使用 Milvus Distributed 執行 GenAI 應用程式,在生產中提供數十億向量的服務。

    +

    先決條件

    Milvus Lite 目前支援下列環境:

    +
      +
    • Ubuntu >= 20.04 (x86_64 和 arm64)
    • +
    • MacOS >= 11.0 (Apple Silicon M1/M2 和 x86_64)
    • +
    +

    請注意 Milvus Lite 只適用於小規模的向量搜尋使用個案。對於大規模的使用個案,我們建議使用Milvus StandaloneMilvus Distributed。您也可以考慮在Zilliz Cloud 上使用完全管理的 Milvus。

    +

    設定 Milvus Lite

    pip install -U pymilvus
    +
    +

    我們建議使用pymilvus 。由於milvus-lite 已包含在pymilvus 2.4.2 或以上版本,您可以pip install-U 強制更新至最新版本,milvus-lite 會自動安裝。

    +

    如果您想明確地安裝milvus-lite 套件,或者您已經安裝了較舊版本的milvus-lite 並想要更新它,您可以進行pip install -U milvus-lite

    +

    連接至 Milvus Lite

    pymilvus 中,指定一個本地檔案名稱作為 MilvusClient 的 uri 參數,將會使用 Milvus Lite。

    +
    from pymilvus import MilvusClient
    +client = MilvusClient("./milvus_demo.db")
    +
    +

    執行上述程式碼片段後,會在目前的資料夾中產生一個名為milvus_demo.db的資料庫檔案。

    +
    +

    注意:請注意相同的 API 也適用於 Milvus Standalone、Milvus Distributed 和 Zilliz Cloud,唯一的差別是將本機檔案名稱換成遠端伺服器端點和憑證,例如client = MilvusClient(uri="http://localhost:19530", token="username:password")

    +
    +

    範例

    以下是一個簡單的示範,展示如何使用 Milvus Lite 進行文字搜尋。有更多使用 Milvus Lite 建立應用程式的完整範例,例如RAG圖片搜尋,以及在流行的 RAG 架構中使用 Milvus Lite,例如LangChainLlamaIndex

    +
    from pymilvus import MilvusClient
    +import numpy as np
    +
    +client = MilvusClient("./milvus_demo.db")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=384  # The vectors we will use in this demo has 384 dimensions
    +)
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# For illustration, here we use fake vectors with random numbers (384 dimension).
    +
    +vectors = [[ np.random.uniform(-1, 1) for _ in range(384) ] for _ in range(len(docs)) ]
    +data = [ {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"} for i in range(len(vectors)) ]
    +res = client.insert(
    +    collection_name="demo_collection",
    +    data=data
    +)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=[vectors[0]],
    +    filter="subject == 'history'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# a query that retrieves all entities matching filter expressions.
    +res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +print(res)
    +
    +# delete
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +)
    +print(res)
    +
    +

    限制

    當執行 Milvus Lite 時,請注意有些功能是不支援的。以下表格總結了 Milvus Lite 的使用限制。

    +

    收集

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    方法/參數Milvus Lite 支援
    create_collection()支援有限的參數
    collection_nameY
    dimensionY
    primary_field_nameY
    id_typeY
    vector_field_nameY
    metric_typeY
    auto_idY
    schemaY
    index_paramsY
    enable_dynamic_fieldY
    num_shardsN
    partition_key_fieldN
    num_partitionsN
    consistency_levelN (僅支援Strong; 任何設定都會被視為Strong.)
    get_collection_stats()支援取得集合統計資料。
    collection_nameY
    timeoutY
    describe_collection()num_shardsconsistency_levelcollection_id 回應無效。
    timeoutY
    has_collection()支援檢查集合是否存在。
    collection_nameY
    timeoutY
    list_collections()支援列出所有的集合。
    drop_collection()支援丟棄一個集合。
    collection_nameY
    timeoutY
    rename_collection()不支援重新命名集合。
    +

    欄位與模式

    + + + + + + + + + + + + + + + + + + + +
    方法/參數Milvus Lite 支援
    create_schema()支援有限的參數
    auto_idY
    enable_dynamic_fieldY
    primary_fieldY
    partition_key_fieldN
    add_field()支援有限的參數
    field_nameY
    datatypeY
    is_primaryY
    max_lengthY
    element_typeY
    max_capacityY
    dimY
    is_partition_keyN
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    方法/參數Milvus Lite 支援
    搜尋()支援有限的參數
    collection_nameY
    dataY
    filterY
    limitY
    output_fieldsY
    search_paramsY
    timeoutY
    partition_namesN
    anns_fieldY
    查詢()支援有限參數
    collection_nameY
    filterY
    output_fieldsY
    timeoutY
    idsY
    partition_namesN
    獲取()支援有限參數
    collection_nameY
    idsY
    output_fieldsY
    timeoutY
    partition_namesN
    刪除()支援有限參數
    collection_nameY
    idsY
    timeoutY
    filterY
    partition_nameN
    插入()支援有限參數
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    upsert()支援有限參數
    collection_nameY
    dataY
    timeoutY
    partition_nameN
    +

    載入與釋放

    + + + + + + + + + + + + + + +
    方法/參數Milvus Lite 支援
    load_collection()Y
    collection_nameY
    timeoutY
    release_collection()Y
    collection_nameY
    timeoutY
    get_load_state()不支援取得載入狀態。
    refresh_load()不支援載入已載入集合的未載入資料。
    close()Y
    +

    索引

    + + + + + + + + + + + + + + + + + + + +
    方法/參數Milvus Lite 支援
    list_indexes()支援列出索引。
    collection_nameY
    field_nameY
    create_index()僅支援FLAT 索引類型。
    index_paramsY
    timeoutY
    drop_index()支援丟失索引。
    collection_nameY
    index_nameY
    timeoutY
    describe_index()支援描述索引。
    collection_nameY
    index_nameY
    timeoutY
    +

    向量索引類型

    Milvus Lite 只支援FLAT索引類型。無論集合中指定的索引類型為何,它都使用 FLAT 類型。

    +

    搜尋功能

    Milvus Lite 支援 Sparse Vector、Multi-vector、Hybrid Search。

    +

    分割

    Milvus Lite 不支援分割和分割相關的方法。

    +

    使用者與角色

    Milvus Lite 不支援使用者與角色及相關方法。

    +

    別名

    Milvus Lite 不支援別名和別名相關的方法。

    +

    從 Milvus Lite 遷移資料

    所有儲存於 Milvus Lite 的資料都可以輕鬆匯出並載入其他類型的 Milvus 部署,例如 Docker 上的 Milvus Standalone、K8s 上的 Milvus Distributed 或Zilliz Cloud 上的完全管理式 Milvus。

    +

    Milvus Lite 提供一個命令列工具,可以將資料轉換成 json 檔案,並將其匯入MilvusZilliz Cloud(Milvus 的完全管理雲端服務)。milvus-lite 指令會與 milvus-lite python 套件一起安裝。

    +
    # Install
    +pip install -U "pymilvus[bulk_writer]"
    +
    +milvus-lite dump -h
    +
    +usage: milvus-lite dump [-h] [-d DB_FILE] [-c COLLECTION] [-p PATH]
    +
    +optional arguments:
    +  -h, --help            show this help message and exit
    +  -d DB_FILE, --db-file DB_FILE
    +                        milvus lite db file
    +  -c COLLECTION, --collection COLLECTION
    +                        collection that need to be dumped
    +  -p PATH, --path PATH  dump file storage dir
    +
    +

    以下範例會將demo_collection 套件中儲存於./milvus_demo.db (Milvus Lite 資料庫檔案) 的所有資料匯出。

    +

    匯出資料:

    +
    milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
    +# ./milvus_demo.db: milvus lite db file
    +# demo_collection: collection that need to be dumped
    +#./data_dir : dump file storage dir
    +
    +

    使用轉儲檔案,您可以透過資料匯入上傳資料到 Zilliz Cloud,或透過大量插入上傳資料到 Milvus 伺服器。

    +

    下一步

    連接 Milvus Lite 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/quickstart.json b/localization/v2.5.x/site/zh-hant/getstarted/quickstart.json new file mode 100644 index 000000000..ae61d1047 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/quickstart.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","if client.has_collection(collection_name=\"demo_collection\"):\n client.drop_collection(collection_name=\"demo_collection\")\nclient.create_collection(\n collection_name=\"demo_collection\",\n dimension=768, # The vectors we will use in this demo has 768 dimensions\n)\n","$ pip install \"pymilvus[model]\"\n","from pymilvus import model\n\n# If connection to https://huggingface.co/ failed, uncomment the following path\n# import os\n# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'\n\n# This will download a small embedding model \"paraphrase-albert-small-v2\" (~50MB).\nembedding_fn = model.DefaultEmbeddingFunction()\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = embedding_fn.encode_documents(docs)\n# The output vector has 768 dimensions, matching the collection that we just created.\nprint(\"Dim:\", embedding_fn.dim, vectors[0].shape) # Dim: 768 (768,)\n\n# Each entity has id, vector representation, raw text, and a subject label that we use\n# to demo metadata filtering later.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Dim: 768 (768,)\nData has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","import random\n\n# Text strings to search from.\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n# Use fake representation with random vectors (768 dimension).\nvectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(vectors))\n]\n\nprint(\"Data has\", len(data), \"entities, each with fields: \", data[0].keys())\nprint(\"Vector dim:\", len(data[0][\"vector\"]))\n","Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])\nVector dim: 768\n","res = client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res)\n","{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}\n","query_vectors = embedding_fn.encode_queries([\"Who is Alan Turing?\"])\n# If you don't have the embedding function you can use a fake vector to finish the demo:\n# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]\n\nres = client.search(\n collection_name=\"demo_collection\", # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nprint(res)\n","data: [\"[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]\"] , extra_info: {'cost': 0}\n","# Insert more docs in another subject.\ndocs = [\n \"Machine learning has been used for drug design.\",\n \"Computational synthesis with AI algorithms predicts molecular properties.\",\n \"DDR1 is involved in cancers and fibrosis.\",\n]\nvectors = embedding_fn.encode_documents(docs)\ndata = [\n {\"id\": 3 + i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"biology\"}\n for i in range(len(vectors))\n]\n\nclient.insert(collection_name=\"demo_collection\", data=data)\n\n# This will exclude any text in \"history\" subject despite close to the query vector.\nres = client.search(\n collection_name=\"demo_collection\",\n data=embedding_fn.encode_queries([\"tell me AI related information\"]),\n filter=\"subject == 'biology'\",\n limit=2,\n output_fields=[\"text\", \"subject\"],\n)\n\nprint(res)\n","data: [\"[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]\"] , extra_info: {'cost': 0}\n","res = client.query(\n collection_name=\"demo_collection\",\n filter=\"subject == 'history'\",\n output_fields=[\"text\", \"subject\"],\n)\n","res = client.query(\n collection_name=\"demo_collection\",\n ids=[0, 2],\n output_fields=[\"vector\", \"text\", \"subject\"],\n)\n","# Delete entities by primary key\nres = client.delete(collection_name=\"demo_collection\", ids=[0, 2])\n\nprint(res)\n\n# Delete entities by a filter expression\nres = client.delete(\n collection_name=\"demo_collection\",\n filter=\"subject == 'biology'\",\n)\n\nprint(res)\n","[0, 2]\n[3, 4, 5]\n","from pymilvus import MilvusClient\n\nclient = MilvusClient(\"milvus_demo.db\")\n","# Drop collection\nclient.drop_collection(collection_name=\"demo_collection\")\n","client = MilvusClient(uri=\"http://localhost:19530\", token=\"root:Milvus\")\n"],"headingContent":"Quickstart with Milvus Lite","anchorList":[{"label":"Milvus Lite 快速入門","href":"Quickstart-with-Milvus-Lite","type":1,"isActive":false},{"label":"安裝 Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"設定向量資料庫","href":"Set-Up-Vector-Database","type":2,"isActive":false},{"label":"建立一個集合","href":"Create-a-Collection","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-Data","type":2,"isActive":false},{"label":"使用向量表示文字","href":"Represent-text-with-vectors","type":2,"isActive":false},{"label":"[另一種方法] 使用隨機向量的偽造表示法","href":"Alternatively-Use-fake-representation-with-random-vectors","type":2,"isActive":false},{"label":"插入資料","href":"Insert-Data","type":2,"isActive":false},{"label":"語意搜尋","href":"Semantic-Search","type":2,"isActive":false},{"label":"使用元資料篩選的向量搜尋","href":"Vector-Search-with-Metadata-Filtering","type":2,"isActive":false},{"label":"刪除實體","href":"Delete-Entities","type":2,"isActive":false},{"label":"載入現有資料","href":"Load-Existing-Data","type":2,"isActive":false},{"label":"刪除集合","href":"Drop-the-collection","type":2,"isActive":false},{"label":"瞭解更多","href":"Learn-More","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/quickstart.md b/localization/v2.5.x/site/zh-hant/getstarted/quickstart.md new file mode 100644 index 000000000..7f5a839fb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/quickstart.md @@ -0,0 +1,408 @@ +--- +id: quickstart.md +summary: 開始使用 Milvus。 +title: 快速入門 +--- +

    Milvus Lite 快速入門

    Open In Colab +GitHub Repository

    +

    向量是神經網路模型的輸出資料格式,可以有效地編碼資訊,並在知識庫、語意搜尋、Retrieval Augmented Generation (RAG) 等人工智慧應用中扮演關鍵的角色。

    +

    Milvus 是一個開放原始碼的向量資料庫,適合各種規模的 AI 應用程式,從在 Jupyter notebook 中執行示範聊天機器人,到建立服務數十億使用者的網路規模搜尋。在本指南中,我們將教您如何在幾分鐘內在本機設定 Milvus,並使用 Python 用戶端函式庫來產生、儲存和搜尋向量。

    +

    安裝 Milvus

    在本指南中,我們使用 Milvus Lite,它是pymilvus 中包含的一個 python 函式庫,可以嵌入到客戶端應用程式中。Milvus 也支援部署在DockerKubernetes上,以應用於生產使用個案。

    +

    在開始之前,請確認您的本機環境中有 Python 3.8+ 可用。安裝pymilvus ,其中包含 python 客戶端函式庫和 Milvus Lite:

    +
    $ pip install -U pymilvus
    +
    +
    +
    +

    如果您正在使用 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時間。(按一下螢幕上方的「Runtime」功能表,從下拉式功能表中選擇「Restart session」)。

    +
    +
    +

    設定向量資料庫

    要建立一個本機的 Milvus 向量資料庫,只要實體化一個MilvusClient ,指定一個檔案名稱來儲存所有資料,例如 "milvus_demo.db"。

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    建立一個集合

    在 Milvus 中,我們需要一個集合來儲存向量及其相關的元資料。您可以將它想像成傳統 SQL 資料庫中的資料表。建立集合時,您可以定義 schema 和索引參數,以設定向量規格,例如維度、索引類型和遠端指標。此外,還有一些複雜的概念,可以優化索引的向量搜尋效能。目前,讓我們先專注於基本概念,並盡可能使用預設值。至少,您只需要設定集合名稱和集合向量欄位的維度。

    +
    if client.has_collection(collection_name="demo_collection"):
    +    client.drop_collection(collection_name="demo_collection")
    +client.create_collection(
    +    collection_name="demo_collection",
    +    dimension=768,  # The vectors we will use in this demo has 768 dimensions
    +)
    +
    +

    在上面的設定中

    +
      +
    • 主鍵和向量欄位使用預設名稱("id 「和 」vector")。
    • +
    • 度量類型 (向量距離定義) 設定為預設值(COSINE)。
    • +
    • 主鍵欄位接受整數,並且不會自動遞增(即不使用自動識別功能)。 或者,您可以按照此指令正式定義集合的模式。
    • +
    +

    準備資料

    在本指南中,我們使用向量來對文字執行語意搜尋。我們需要下載嵌入模型來為文字產生向量。使用pymilvus[model] 函式庫中的實用函式即可輕鬆完成這項工作。

    +

    使用向量表示文字

    首先,安裝模型函式庫。這個套件包含基本的 ML 工具,例如 PyTorch。如果您的本地環境從未安裝過 PyTorch,下載套件可能需要一些時間。

    +
    $ pip install "pymilvus[model]"
    +
    +

    使用預設模型產生向量內嵌。Milvus 希望資料是以字典清單的方式插入,每個字典代表一個資料記錄,稱為一個實體。

    +
    from pymilvus import model
    +
    +# If connection to https://huggingface.co/ failed, uncomment the following path
    +# import os
    +# os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
    +
    +# This will download a small embedding model "paraphrase-albert-small-v2" (~50MB).
    +embedding_fn = model.DefaultEmbeddingFunction()
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = embedding_fn.encode_documents(docs)
    +# The output vector has 768 dimensions, matching the collection that we just created.
    +print("Dim:", embedding_fn.dim, vectors[0].shape)  # Dim: 768 (768,)
    +
    +# Each entity has id, vector representation, raw text, and a subject label that we use
    +# to demo metadata filtering later.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Dim: 768 (768,)
    +Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    [另一種方法] 使用隨機向量的偽造表示法

    如果您因為網路問題而無法下載模型,您可以使用隨機向量來表示文字,並繼續完成範例。只要注意搜尋結果不會反映語意相似性,因為向量是假的。

    +
    import random
    +
    +# Text strings to search from.
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +# Use fake representation with random vectors (768 dimension).
    +vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(vectors))
    +]
    +
    +print("Data has", len(data), "entities, each with fields: ", data[0].keys())
    +print("Vector dim:", len(data[0]["vector"]))
    +
    +
    Data has 3 entities, each with fields:  dict_keys(['id', 'vector', 'text', 'subject'])
    +Vector dim: 768
    +
    +

    插入資料

    讓我們將資料插入到資料集中:

    +
    res = client.insert(collection_name="demo_collection", data=data)
    +
    +print(res)
    +
    +
    {'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
    +
    +

    現在我們可以用向量來表示搜尋查詢的文字,並在 Milvus 上進行向量相似性搜尋,從而進行語意搜尋。

    +

    Milvus 可同時接受一個或多個向量搜尋請求。query_vectors 變數的值是一個向量清單,其中每個向量是一個浮點數的陣列。

    +
    query_vectors = embedding_fn.encode_queries(["Who is Alan Turing?"])
    +# If you don't have the embedding function you can use a fake vector to finish the demo:
    +# query_vectors = [ [ random.uniform(-1, 1) for _ in range(768) ] ]
    +
    +res = client.search(
    +    collection_name="demo_collection",  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 2, 'distance': 0.5859944820404053, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118255615234375, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
    +
    +

    輸出是一個結果清單,每個結果對應到一個向量搜尋查詢。每個查詢包含一個結果清單,其中每個結果包含實體主鍵、到查詢向量的距離,以及指定output_fields 的實體詳細資料。

    +

    使用元資料篩選的向量搜尋

    您也可以在考慮元資料值(在 Milvus 中稱為 「標量 」欄位,因為標量指的是非向量資料)的同時進行向量搜尋。這是透過指定特定條件的篩選表達式來完成的。讓我們在下面的範例中看看如何使用subject 欄位進行搜尋和篩選。

    +
    # Insert more docs in another subject.
    +docs = [
    +    "Machine learning has been used for drug design.",
    +    "Computational synthesis with AI algorithms predicts molecular properties.",
    +    "DDR1 is involved in cancers and fibrosis.",
    +]
    +vectors = embedding_fn.encode_documents(docs)
    +data = [
    +    {"id": 3 + i, "vector": vectors[i], "text": docs[i], "subject": "biology"}
    +    for i in range(len(vectors))
    +]
    +
    +client.insert(collection_name="demo_collection", data=data)
    +
    +# This will exclude any text in "history" subject despite close to the query vector.
    +res = client.search(
    +    collection_name="demo_collection",
    +    data=embedding_fn.encode_queries(["tell me AI related information"]),
    +    filter="subject == 'biology'",
    +    limit=2,
    +    output_fields=["text", "subject"],
    +)
    +
    +print(res)
    +
    +
    data: ["[{'id': 4, 'distance': 0.27030569314956665, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.16425910592079163, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
    +
    +

    預設情況下,標量欄位不會被索引。如果您需要在大型資料集中執行 metadata 過濾搜尋,您可以考慮使用固定模式,同時開啟索引以改善搜尋效能。

    +

    除了向量搜尋外,您也可以執行其他類型的搜尋:

    +

    查詢

    查詢()是擷取所有符合條件的實體的操作,例如篩選表達式或符合某些 id。

    +

    例如,擷取標量欄位具有特定值的所有實體:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    filter="subject == 'history'",
    +    output_fields=["text", "subject"],
    +)
    +
    +

    透過主索引鍵直接擷取實體:

    +
    res = client.query(
    +    collection_name="demo_collection",
    +    ids=[0, 2],
    +    output_fields=["vector", "text", "subject"],
    +)
    +
    +

    刪除實體

    如果您想清除資料,您可以刪除指定主索引鍵的實體,或刪除符合特定篩選表達式的所有實體。

    +
    # Delete entities by primary key
    +res = client.delete(collection_name="demo_collection", ids=[0, 2])
    +
    +print(res)
    +
    +# Delete entities by a filter expression
    +res = client.delete(
    +    collection_name="demo_collection",
    +    filter="subject == 'biology'",
    +)
    +
    +print(res)
    +
    +
    [0, 2]
    +[3, 4, 5]
    +
    +

    載入現有資料

    由於 Milvus Lite 的所有資料都儲存在本機檔案中,即使在程式終止後,您也可以透過建立MilvusClient 與現有檔案,將所有資料載入記憶體中。例如,這將恢復 "milvus_demo.db" 檔案中的集合,並繼續將資料寫入其中。

    +
    from pymilvus import MilvusClient
    +
    +client = MilvusClient("milvus_demo.db")
    +
    +

    刪除集合

    如果您想刪除一個資料集中的所有資料,您可以使用

    +
    # Drop collection
    +client.drop_collection(collection_name="demo_collection")
    +
    +

    瞭解更多

    Milvus Lite 非常適合使用本機 python 程式上手。如果您有大規模的資料,或想在生產中使用 Milvus,您可以學習在DockerKubernetes 上部署 Milvus。Milvus 的所有部署模式都共用相同的 API,因此如果轉換到其他部署模式,您的用戶端程式碼不需要做太大的變更。只要指定部署在任何地方的 Milvus 伺服器的URI 和 Token即可:

    +
    client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
    +
    +

    Milvus 提供 REST 和 gRPC API,以及PythonJavaGo、C# 和Node.js 等語言的用戶端程式庫。

    diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.json new file mode 100644 index 000000000..4a1a0fedf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.json @@ -0,0 +1 @@ +{"codeList":["# Download the configuration file\n$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml\n\n# Start Milvus\n$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker-compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n"],"headingContent":"Run Milvus with Docker Compose (Linux)","anchorList":[{"label":"使用 Docker Compose 執行 Milvus (Linux)","href":"Run-Milvus-with-Docker-Compose-Linux","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"安裝 Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"停止和刪除 Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.md new file mode 100644 index 000000000..2da05ebeb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker-compose.md @@ -0,0 +1,155 @@ +--- +id: install_standalone-docker-compose.md +label: Docker Compose +related_key: Docker Compose +summary: 學習如何使用 Docker Compose 獨立安裝 Milvus。 +title: 使用 Docker Compose 執行 Milvus (Linux) +--- +

    使用 Docker Compose 執行 Milvus (Linux)

    本頁說明如何使用 Docker Compose 在 Docker 中啟動 Milvus 實例。

    +

    先決條件

    +

    安裝 Milvus

    Milvus 在 Milvus 套件庫中提供 Docker Compose 配置檔案。要使用 Docker Compose 安裝 Milvus,只要執行

    +
    # Download the configuration file
    +$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml
    +
    +# Start Milvus
    +$ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +
      +
    • 如果您執行上述指令失敗,請檢查您的系統是否已安裝 Docker Compose V1。如果是這種情況,建議您根據本頁面的注意事項,轉移到 Docker Compose V2。

    • +
    • 如果您在拉取映像時遇到任何問題,請與我們聯絡community@zilliz.com,並提供問題的詳細資訊,我們會為您提供必要的支援。

    • +
    +
    +

    啟動 Milvus 之後

    +
      +
    • 命名為milvus- standalonemilvus-miniomilvus-etcd的容器已啟動。
        +
      • milvus-etcd容器不向主機暴露任何連接埠,並將其資料映射到目前資料夾中的volumes/etcd
      • +
      • milvus-minio容器使用預設的驗證憑證在本機服務連接埠90909091,並將其資料對應到目前資料夾中的volumes/minio
      • +
      • milvus-standalone容器使用預設設定本機服務連接埠19530,並將其資料對應到目前資料夾中的volumes/milvus
      • +
    • +
    +

    您可以使用以下命令檢查容器是否已啟動和運行:

    +
    $ sudo docker-compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    您也可以存取 Milvus WebUI,網址是http://127.0.0.1:9091/webui/ ,以瞭解更多關於您的 Milvus 實例的資訊。詳情請參閱Milvus WebUI

    +

    停止和刪除 Milvus

    您可以按以下方式停止和刪除此容器

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    下一步

    在 Docker 中安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.json new file mode 100644 index 000000000..0e86a4fc7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.json @@ -0,0 +1 @@ +{"codeList":["# Download the installation script\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh\n\n# Start the Docker container\n$ bash standalone_embed.sh start\n","# Stop Milvus\n$ bash standalone_embed.sh stop\n\n# Delete Milvus data\n$ bash standalone_embed.sh delete\n","# upgrade Milvus\n$ bash standalone_embed.sh upgrade\n"],"headingContent":"Run Milvus in Docker (Linux)","anchorList":[{"label":"在 Docker 中執行 Milvus (Linux)","href":"Run-Milvus-in-Docker-Linux","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"在 Docker 中安裝 Milvus","href":"Install-Milvus-in-Docker","type":2,"isActive":false},{"label":"停止和刪除 Milvus","href":"Stop-and-delete-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.md new file mode 100644 index 000000000..e30391074 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-docker.md @@ -0,0 +1,142 @@ +--- +id: install_standalone-docker.md +label: Docker +related_key: Docker +summary: 了解如何使用 Docker 獨立安裝 Milvus。 +title: 在 Docker 中執行 Milvus (Linux) +--- +

    在 Docker 中執行 Milvus (Linux)

    本頁說明如何在 Docker 中啟動 Milvus 實例。

    +

    先決條件

    +

    在 Docker 中安裝 Milvus

    Milvus 提供了一個安裝腳本,將其安裝為一個 docker 容器。該腳本可在Milvus 套件庫中找到。要在 Docker 中安裝 Milvus,只要執行

    +
    # Download the installation script
    +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
    +
    +# Start the Docker container
    +$ bash standalone_embed.sh start
    +
    +
    +

    如果您在拉取映像檔時遇到任何問題,請與我們聯絡community@zilliz.com,並提供問題的詳細資訊,我們會為您提供必要的支援。

    +
    +

    執行安裝腳本之後

    +
      +
    • 一個名為 milvus 的 docker 容器已經在19530 連接埠啟動。
    • +
    • 嵌入式 etcd 與 Milvus 安裝在同一個容器中,並在2379 連接埠提供服務。它的設定檔對應到目前資料夾中的embedEtcd.yaml。
    • +
    • 若要變更預設的 Milvus 設定,請將您的設定新增到目前資料夾中的user.yaml檔案,然後再重新啟動服務。
    • +
    • Milvus 資料卷會映射到目前資料夾中的volumes/milvus
    • +
    +

    您可以存取 Milvus WebUI,網址是http://127.0.0.1:9091/webui/ ,以瞭解更多關於您的 Milvus 實例的資訊。詳情請參閱Milvus WebUI

    +

    停止和刪除 Milvus

    您可以按以下方式停止和刪除此容器

    +
    # Stop Milvus
    +$ bash standalone_embed.sh stop
    +
    +# Delete Milvus data
    +$ bash standalone_embed.sh delete
    +
    +

    您可以按以下步驟升級最新版本的 Milvus

    +
    # upgrade Milvus
    +$ bash standalone_embed.sh upgrade
    +
    +

    下一步

    在 Docker 中安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.json new file mode 100644 index 000000000..d0cf4aa9b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.json @@ -0,0 +1 @@ +{"codeList":["C:\\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​\n\n","C:\\>standalone.bat start​\nWait for Milvus starting...​\nStart successfully.​\nTo change the default Milvus configuration, edit user.yaml and restart the service.​\n\n","# Stop Milvus​\nC:\\>standalone.bat stop​\nStop successfully.​\n​\n# Delete Milvus container​\nC:\\>standalone.bat delete​\nDelete Milvus container successfully. # Container has been removed.​\nDelete successfully. # Data has been removed.​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","# Download the installation script​\n$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​\n​\n# Start the Docker container​\n$ bash standalone_embed.sh start​\n\n","$ bash standalone_embed.sh start​\nWait for Milvus Starting...​\nStart successfully.​\nTo change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​\n\n","# Stop Milvus​\n$ bash standalone_embed.sh stop​\nStop successfully.​\n​\n# Delete Milvus data​\n$ bash standalone_embed.sh stop​\nDelete Milvus container successfully.​\nDelete successfully.​\n\n","# Download the configuration file and rename it as docker-compose.yml​\nC:\\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​\n​\n# Start Milvus​\nC:\\>docker compose up -d​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>wsl --install​\nUbuntu already installed.​\nStarting Ubuntu...​\n\n","$ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​\n\n","$ sudo docker compose up -d​\n​\nCreating milvus-etcd ... done​\nCreating milvus-minio ... done​\nCreating milvus-standalone ... done​\n\n","C:\\>net start com.docker.service​\nThe Docker for Windows Service service is starting.​\nThe Docker for Windows Service service was started successfully.​\n\n","C:\\>wsl --update​\nChecking for updates.​\nThe most recent version of Windows Subsystem for Linux is already installed.​\n\n","C:\\>cd \"C:\\Program Files\\Docker\\Docker\"​\nC:\\Program Files\\Docker\\Docker>.\\DockerCli.exe -SwitchDaemon​\nSwitching to windows engine: Post \"http://ipc/engine/switch\": open \\\\.\\pipe\\dockerBackendApiServer: The system cannot find the file specified.​\n\n"],"headingContent":"Run Milvus in Docker (Windows)","anchorList":[{"label":"在 Docker 中執行 Milvus (Windows)","href":"Run-Milvus-in-Docker-Windows","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites​","type":2,"isActive":false},{"label":"在 Docker 中執行 Milvus","href":"Run-Milvus-in-Docker​","type":2,"isActive":false},{"label":"使用 Docker Compose 執行 Milvus","href":"Run-Milvus-with-Docker-Compose​","type":2,"isActive":false},{"label":"常見問題","href":"FAQs​","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.md new file mode 100644 index 000000000..927258505 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/install_standalone-windows.md @@ -0,0 +1,301 @@ +--- +id: install_standalone-windows.md +label: Docker +related_key: Docker +summary: 了解如何使用 Docker Desktop for Windows 獨立安裝 Milvus。 +title: 在 Docker 中執行 Milvus (Linux) +--- +

    在 Docker 中執行 Milvus (Windows)

    本頁面示範如何使用 Docker Desktop for Windows 在 Windows 上執行 Milvus。

    +

    先決條件

    +

    在 Docker 中執行 Milvus

    Milvus 提供一個安裝腳本,可將其安裝為 Docker 容器。在 Microsoft Windows 上安裝 Docker Desktop 後,您可以從 PowerShell 或 Windows Command Prompt 以管理員模式以及 WSL 2 存取 Docker CLI。

    +

    從 PowerShell 或 Windows Command Prompt

    如果您比較熟悉 PowerShell 或 Windows Command Prompt,命令提示符如下。

    +
      +
    1. 在管理員模式下開啟 Docker Desktop,方法是按滑鼠右鍵並選擇以管理員身分執行

    2. +
    3. 下載安裝指令碼並儲存為standalone.bat

      +
      C:\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat​
      +
      +
    4. +
    5. 執行下載的腳本,以 Docker 容器啟動 Milvus。

      +
      C:\>standalone.bat start​
      +Wait for Milvus starting...​
      +Start successfully.​
      +To change the default Milvus configuration, edit user.yaml and restart the service.​
      +
      +
      +

      執行安裝腳本後

      +
        +
      • 一個名為milvus-standalone的 docker 容器已經在19530 連接埠啟動。

      • +
      • 嵌入式 etcd 與 Milvus 安裝在同一個容器中,並在2379 連接埠提供服務。它的設定檔對應到目前資料夾中的embedEtcd.yaml。

      • +
      • Milvus 資料卷被對應到目前資料夾中的volumes/milvus

      • +
      +

      您可以使用下列命令管理 Milvus 容器和儲存的資料。

      +
      # Stop Milvus​
      +C:\>standalone.bat stop​
      +Stop successfully.​
      +​
      +# Delete Milvus container​
      +C:\>standalone.bat delete​
      +Delete Milvus container successfully. # Container has been removed.​
      +Delete successfully. # Data has been removed.​
      +
      +
    6. +
    +

    從 WSL 2

    如果您喜歡在 Windows 上使用 Linux 指令和 shell 腳本啟動 Milvus,請確保已經安裝了 WSL 2 指令。有關如何安裝 WSL 2 指令的詳細資訊,您可以參考這篇微軟文章

    +
      +
    1. 啟動 WSL 2。

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. 下載安裝腳本

      +
      # Download the installation script​
      +$ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh​
      +​
      +# Start the Docker container​
      +$ bash standalone_embed.sh start​
      +
      +
    4. +
    5. 以 docker 容器的方式啟動 Milvus。

      +
      $ bash standalone_embed.sh start​
      +Wait for Milvus Starting...​
      +Start successfully.​
      +To change the default Milvus configuration, add your settings to the user.yaml file and then restart the service.​
      +
      +
      +

      您可以使用下列指令來管理 Milvus 容器和儲存的資料。

      +
      # Stop Milvus​
      +$ bash standalone_embed.sh stop​
      +Stop successfully.​
      +​
      +# Delete Milvus data​
      +$ bash standalone_embed.sh stop​
      +Delete Milvus container successfully.​
      +Delete successfully.​
      +
      +
    6. +
    +

    使用 Docker Compose 執行 Milvus

    在 Microsoft Windows 上安裝 Docker Desktop 之後,您就可以從 PowerShell 或 Windows Command Prompt 以管理員模式存取 Docker CLI。您可以在 PowerShell、Windows Command Prompt 或 WSL 2 中執行 Docker Compose 來啟動 Milvus。

    +

    從 PowerShell 或 Windows Command Prompt

      +
    1. 在管理員模式中開啟 Docker Desktop,方法是按滑鼠右鍵並選擇以管理員身分執行

    2. +
    3. 在 PowerShell 或 Windows Command Prompt 執行下列指令,為 Milvus Standalone 下載 Docker Compose 配置檔案,並啟動 Milvus。

      +
      # Download the configuration file and rename it as docker-compose.yml​
      +C:\>Invoke-WebRequest https://github.com/milvus-io/milvus/releases/download/v2.4.15/milvus-standalone-docker-compose.yml -OutFile docker-compose.yml​
      +​
      +# Start Milvus​
      +C:\>docker compose up -d​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
      +

      視您的網路連線而定,下載 Milvus 安裝的映像可能需要一段時間。命名為milvus- standalonemilvus-miniomilvus-etcd的容器啟動後,您可以看到

      +
        +
      • milvus-etcd容器不向主機暴露任何連接埠,並將其資料映射到目前資料夾中的volumes/etcd

      • +
      • milvus-minio容器使用預設的驗證憑證在本機服務連接埠90909091,並將其資料對應到目前資料夾中的volumes/minio

      • +
      • milvus-standalone容器使用預設設定在本機服務連接埠19530,並將其資料對應到目前資料夾中的volumes/milvus

      • +
    4. +
    +

    如果您已安裝 WSL 2,也可以呼叫 Linux 版本的 Docker Compose 指令。

    +

    從 WSL 2

    步驟與在 Linux 系統中使用 Docker Compose 安裝 Milvus 相似。

    +
      +
    1. 啟動 WSL 2。

      +
      C:\>wsl --install​
      +Ubuntu already installed.​
      +Starting Ubuntu...​
      +
      +
    2. +
    3. 下載 Milvus 配置檔案。

      +
      $ wget https://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml -O docker-compose.yml​
      +
      +
    4. +
    5. 啟動 Milvus。

      +
      $ sudo docker compose up -d​
      +​
      +Creating milvus-etcd  ... done​
      +Creating milvus-minio ... done​
      +Creating milvus-standalone ... done​
      +
      +
    6. +
    +

    常見問題

    我該如何處理Docker Engine stopped 錯誤?

    當您在 Windows 安裝 Docker Desktop 後,如果您的電腦沒有正確設定,您可能會遇到Docker Engine stopped 錯誤。在這種情況下,您可能需要進行以下檢查。

    +
      +
    1. 檢查是否已啟用虛擬化。

      +

      您可以查看「任務管理員」中的「效能」索引標籤,以檢查虛擬化是否已啟用。

      +

      + + Virtualization in Task Manager + 工作管理器中的虛擬化

      +

      如果虛擬化已停用,您可能需要檢查主機板韌體的 BIOS 設定。在 BIOS 設定中啟用虛擬化的方法因主機板廠商而異。以華碩主機板為例,您可以參考這篇文章來啟用虛擬化。

      +

      然後,您需要重新啟動電腦並啟用 Hyper-V。詳情請參閱這篇微軟文章

    2. +
    3. 檢查 Docker Desktop Service 是否已經啟動。

      +

      您可以執行下列指令來啟動 Docker Desktop Service。

      +
      C:\>net start com.docker.service​
      +The Docker for Windows Service service is starting.​
      +The Docker for Windows Service service was started successfully.​
      +
      +
    4. +
    5. 檢查是否已正確安裝 WSL。

      +

      您可以執行下列指令來安裝或更新 WSL 2 指令。

      +
      C:\>wsl --update​
      +Checking for updates.​
      +The most recent version of Windows Subsystem for Linux is already installed.​
      +
      +
    6. +
    7. 檢查 Docker Daemon 是否已啟動。

      +

      您需要到 Docker Desktop 的安裝目錄,執行.\DockerCli.exe -SwitchDaemon 來啟動 Docker Daemon。

      +
      C:\>cd "C:\Program Files\Docker\Docker"​
      +C:\Program Files\Docker\Docker>.\DockerCli.exe -SwitchDaemon​
      +Switching to windows engine: Post "http://ipc/engine/switch": open \\.\pipe\dockerBackendApiServer: The system cannot find the file specified.​
      +
      +
    8. +
    9. 檢查是否已以管理員模式啟動 Docker Desktop。

      +

      確保你已經以管理員模式啟動 Docker Desktop。要這樣做,在Docker Desktop上按一下滑鼠右鍵,然後選擇以管理員模式執行

      +

      + + Start Docker Desktop as Administrator + 以管理員模式啟動 Docker Desktop

    10. +
    +

    如果您在從 WSL 2 執行 Milvus 時遇到 WSL 相關的問題,您可能需要檢查是否已將 Docker Desktop 設定為使用基於 WSL 2 的引擎,如下所示。

    +
      +
    1. 確保在設定>一般中勾選「使用 WSL 2-based engine」。

      +

      + + Use the WSL 2 based engine in Docker Desktop Settings + 在 Docker Desktop 設定中使用基於 WSL 2 的引擎

    2. +
    3. 從已安裝的 WSL 2 發行版本中選擇要啟用 Docker 整合的版本,前往設定>資源>WSL 整合

      +

      + + Select WSL 2 distributions in Docker Desktop Settings + 在 Docker Desktop 設定中選擇 WSL 2 發行版本

    4. +
    +

    + + Read config failed error prompt in Milvus startup + 在 Milvus 啟動時出現讀取設定失敗的錯誤提示

    +

    要處理 Milvus 啟動時提示「讀取設定失敗」的錯誤,您需要檢查掛載到 Milvus 容器的磁碟區是否正確。如果磁碟區正確掛載到容器中,您可以使用docker exec 指令進入容器,並列出/milvus/configs資料夾,如下所示。

    +

    + + List Milvus config files + 列出 Milvus 配置文件

    +

    +

    下一步

    在 Docker 中安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.json new file mode 100644 index 000000000..da21a7d1c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n"],"headingContent":"Requirements for Installing Milvus with Docker Compose","anchorList":[{"label":"使用 Docker Compose 安裝 Milvus 的需求","href":"Requirements-for-Installing-Milvus-with-Docker-Compose","type":1,"isActive":false},{"label":"硬體需求","href":"Hardware-requirements","type":2,"isActive":false},{"label":"軟體需求","href":"Software-requirements","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.md new file mode 100644 index 000000000..66046032c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-docker/prerequisite-docker.md @@ -0,0 +1,111 @@ +--- +id: prerequisite-docker.md +label: Docker requirements +related_key: Docker +summary: 了解使用 Docker Compose 安裝 Milvus 前的必要準備。 +title: 使用 Docker Compose 安裝 Milvus 的需求 +--- +

    使用 Docker Compose 安裝 Milvus 的需求

    在安裝 Milvus 實例之前,請檢查您的硬體和軟體是否符合需求。

    +

    硬體需求

    + + + + + + + + + +
    元件要求建議備註
    中央處理器
    • Intel 第二代 Core CPU 或更高階
    • 蘋果矽晶片
    • 單機:4 核心或以上
    • 群集:8 核心或更多
    CPU 指令集
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Milvus 中的向量相似性搜尋和索引建立需要 CPU 支援單指令、多資料 (SIMD) 延伸集。確保 CPU 至少支援所列的一種 SIMD 擴充集。如需詳細資訊,請參閱具有 AVX 的 CPU
    記憶體
    • 單機:8G
    • 群集:32G
    • 單機:16G
    • 群集:128G
    RAM 的大小取決於資料量。
    硬碟機SATA 3.0 SSD 或更高NVMe SSD 或更高硬碟大小視資料容量而定。
    +

    軟體需求

    + + + + + + + + +
    作業系統軟體備註
    macOS 10.14 或更新版本Docker 桌面設定 Docker 虛擬機器 (VM) 至少使用 2 個虛擬 CPU (vCPU) 和 8 GB 的初始記憶體。否則,安裝可能會失敗。
    如需詳細資訊,請參閱在 Mac 上安裝 Docker Desktop
    Linux 平台
    • Docker 19.03 或更新版本
    • Docker Compose 1.25.1 或更新版本
    更多資訊請參閱安裝 Docker Engine安裝 Docker Compose
    啟用 WSL 2 的 WindowsDocker 桌面我們建議您將原始碼和其他綁定掛載到 Linux containers 的資料存放在 Linux 檔案系統,而不是 Windows 檔案系統。
    請參閱在 Windows 上安裝 Docker Desktop with WSL 2 backend 以取得更多資訊。
    +

    當使用 Docker script 或 Docker Compose 配置安裝 Milvus Standalone 時,會自動取得並配置下列相依性:

    + + + + + + + + + +
    軟體版本備註
    etcd3.5.0請參閱其他磁碟需求
    MinIORELEASE.2023-03-20T20-16-18Z
    脈動星2.8.2
    +

    額外的磁碟需求

    磁碟效能對 etcd 至關重要。強烈建議您使用本機 NVMe SSD。較慢的磁碟回應速度可能會導致頻繁的群集選舉,最終會降低 etcd 服務的效能。

    +

    要測試您的磁碟是否合格,請使用fio

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    理想情況下,您的磁碟應達到 500 IOPS 以上,第 99 百分位數的 fsync 延遲應低於 10 毫秒。閱讀 etcd文件以瞭解更詳細的要求。

    +

    下一步

    如果您的硬體和軟體符合上述要求,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json new file mode 100644 index 000000000..febe21109 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nstandalone:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus -f custom-values.yaml\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"2\"\n limits:\n nvidia.com/gpu: \"2\"\nEOF\n","cat < custom-values.yaml\nindexNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"0\"\nqueryNode:\n resources:\n requests:\n nvidia.com/gpu: \"1\"\n limits:\n nvidia.com/gpu: \"1\"\n extraEnv:\n - name: CUDA_VISIBLE_DEVICES\n value: \"1\"\nEOF\n","$ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datacoord-6fd4bd885c-gkzwx 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexcoord-5bfcf6bdd8-nmh5l 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querycoord-579cd79455-xht5n 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-milvus-rootcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 30s\nmy-release-milvus-standalone-54c4f88cb9-f84pf 1/1 Running 0 30s\nmy-release-minio-5564fbbddc-mz7f5 1/1 Running 0 30s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus with GPU Support Using Helm Chart","anchorList":[{"label":"使用 Helm Chart 運行支援 GPU 的 Milvus","href":"Run-Milvus-with-GPU-Support-Using-Helm-Chart","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"為 Milvus 安裝 Helm Chart","href":"Install-Helm-Chart-for-Milvus","type":2,"isActive":false},{"label":"啟動 Milvus","href":"Start-Milvus","type":2,"isActive":false},{"label":"存取 Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"卸載 Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md new file mode 100644 index 000000000..6e1cda54b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md @@ -0,0 +1,378 @@ +--- +id: install_cluster-helm-gpu.md +label: Cluster (Helm) +related_key: Kubernetes +summary: 學習如何在 Kubernetes 上安裝 Milvus 叢集。 +title: 使用 Helm Chart 運行支援 GPU 的 Milvus +--- +

    使用 Helm Chart 運行支援 GPU 的 Milvus

    本頁說明如何使用 Helm Chart 啟動支援 GPU 的 Milvus 實例。

    +

    概述

    Helm 使用稱為圖表的封裝格式。圖表是描述一組相關 Kubernetes 資源的檔案集合。Milvus 提供一組圖表來幫助您部署 Milvus 的相依性和元件。Milvus Helm Chart是使用 Helm 套件管理員在 Kubernetes (K8s) 集群上啟動 Milvus 部署的解決方案。

    +

    先決條件

    +
    +

    如果您在拉取映像時遇到任何問題,請透過community@zilliz.com與我們聯絡,並提供問題的詳細資訊,我們將為您提供必要的支援。

    +
    +

    為 Milvus 安裝 Helm Chart

    Helm 是一個 K8s 套件管理器,可以幫助您快速部署 Milvus。

    +
      +
    1. 新增 Milvus Helm 套件庫。
    2. +
    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    位於https://milvus-io.github.io/milvus-helm/ 的 Milvus Helm Charts repo 已經歸檔,您可以從https://zilliztech.github.io/milvus-helm/ 取得進一步的更新,如下所示:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    存檔的 repo 仍可使用於 4.0.31 之前的圖表。對於之後的版本,請使用新的 repo。

    +
    +
      +
    1. 在本地更新圖表。
    2. +
    +
    $ helm repo update
    +
    +

    啟動 Milvus

    安裝 Helm 圖表後,您就可以在 Kubernetes 上啟動 Milvus。在本節中,我們會引導您完成啟動支援 GPU 的 Milvus 的步驟。

    +

    您應該使用 Helm 來啟動 Milvus,方法是指定版本名稱、圖表,以及您期望變更的參數。在本指南中,我們使用my-release 作為版本名稱。若要使用不同的發行版名稱,請將下列指令中的my-release 改為您正在使用的名稱。

    +

    Milvus 允許您指派一個或多個 GPU 裝置到 Milvus。

    +

    1.指定單一 GPU 裝置

    支援 GPU 的 Milvus 允許您指定一個或多個 GPU 裝置。

    +
      +
    • Milvus 集群

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
    • +
    • Milvus 獨立

      +
      cat <<EOF > custom-values.yaml
      +standalone:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2.指派多個 GPU 裝置

    除了單一 GPU 裝置,您也可以指派多個 GPU 裝置給 Milvus。

    +
      +
    • Milvus 集群

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      在上面的配置中,索引節點 (indexNode) 和查詢節點 (queryNode) 共用兩個 GPU。要為 indexNode 和 queryNode 分配不同的 GPU,您可以在配置文件中相應地修改配置,方法如下:設定extraEnv

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus -f custom-values.yaml
      +
      +
      +
        +
      • 版本名稱只能包含字母、數字和破折號。版本名稱中不允許使用點。
      • +
      • 使用 Helm 安裝 Milvus 時,預設命令列會安裝群集版本的 Milvus。獨立安裝 Milvus 時需要進一步設定。
      • +
      • 根據Kuberenetes 的廢棄 API 移轉指南,PodDisruptionBudget 的policy/v1beta1API 版本自 v1.25 起不再提供服務。建議您遷移艙單和 API 用戶端,改用policy/v1API 版本。
        對於仍在 Kuberenetes v1.25 及更新版本上使用policy/v1beta1API 版本 PodDisruptionBudget 的使用者,作為一個解決方案,您可以執行下列指令來安裝 Milvus:
        helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
      • +
      • 更多資訊請參閱Milvus Helm ChartHelm
      • +
      +
      +
    • +
    • Milvus 單機版

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "2"
      +    limits:
      +      nvidia.com/gpu: "2"
      +EOF
      +
      +

      在上述配置中,indexNode 和 queryNode 共用兩個 GPU。若要為 indexNode 和 queryNode 分配不同的 GPU,您可以在設定檔中設定 extraEnv 來相應修改配置,如下所示:

      +
      cat <<EOF > custom-values.yaml
      +indexNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "0"
      +queryNode:
      +  resources:
      +    requests:
      +      nvidia.com/gpu: "1"
      +    limits:
      +      nvidia.com/gpu: "1"
      +  extraEnv:
      +    - name: CUDA_VISIBLE_DEVICES
      +      value: "1"
      +EOF
      +
      +
      $ helm install my-release milvus/milvus --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false -f custom-values.yaml
      +
    • +
    +

    2.檢查 Milvus 狀態

    執行以下指令檢查 Milvus 狀態:

    +
    $ kubectl get pods
    +
    +

    Milvus 啟動後,READY 列會顯示所有 Pod 的1/1

    +
      +
    • Milvus 集群

      +
      NAME                                             READY  STATUS   RESTARTS  AGE
      +my-release-etcd-0                                1/1    Running   0        3m23s
      +my-release-etcd-1                                1/1    Running   0        3m23s
      +my-release-etcd-2                                1/1    Running   0        3m23s
      +my-release-milvus-datacoord-6fd4bd885c-gkzwx     1/1    Running   0        3m23s
      +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
      +my-release-milvus-indexcoord-5bfcf6bdd8-nmh5l    1/1    Running   0        3m23s
      +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
      +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
      +my-release-milvus-querycoord-579cd79455-xht5n    1/1    Running   0        3m24s
      +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
      +my-release-milvus-rootcoord-7fb9488465-dmbbj     1/1    Running   0        3m23s
      +my-release-minio-0                               1/1    Running   0        3m23s
      +my-release-minio-1                               1/1    Running   0        3m23s
      +my-release-minio-2                               1/1    Running   0        3m23s
      +my-release-minio-3                               1/1    Running   0        3m23s
      +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
      +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
      +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
      +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
      +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
      +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
      +
    • +
    • Milvus 獨立

      +
      NAME                                               READY   STATUS      RESTARTS   AGE
      +my-release-etcd-0                                  1/1     Running     0          30s
      +my-release-milvus-standalone-54c4f88cb9-f84pf      1/1     Running     0          30s
      +my-release-minio-5564fbbddc-mz7f5                  1/1     Running     0          30s
      +
    • +
    +

    3.將本機連接埠轉送至 Milvus

    確認 Milvus 伺服器正在聆聽的本機連接埠。用您自己的 pod 名稱取代 pod 名稱。

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    然後,執行下列指令,將本機連接埠轉送至 Milvus 服務的連接埠。

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    您可以選擇在上述指令中使用:19530 而不是27017:19530 ,讓kubectl 替您分配一個本機連接埠,這樣您就不必管理連接埠衝突。

    +

    預設情況下,kubectl 的連接埠轉發只會監聽localhost 。如果您希望 Milvus 監聽選定或所有的 IP 位址,請使用address 。以下指令會讓 port-forward 聆聽主機上所有的 IP 位址。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    現在,您可以使用轉送的連接埠連線到 Milvus。

    +

    存取 Milvus WebUI

    Milvus 隨附一個內建的 GUI 工具,稱為 Milvus WebUI,您可以透過瀏覽器存取。Milvus Web UI 以簡單直觀的介面增強系統的可觀察性。您可以使用 Milvus Web UI 觀察 Milvus 元件和相依性的統計和指標、檢查資料庫和收集的詳細資訊,以及列出 Milvus 的詳細配置。有關 Milvus Web UI 的詳細資訊,請參閱Milvus WebUI

    +

    要啟用對 Milvus Web UI 的存取,您需要將代理 pod 的連接埠轉發到本機連接埠。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    現在,您可以在http://localhost:27018 存取 Milvus Web UI。

    +

    卸載 Milvus

    執行以下指令卸載 Milvus。

    +
    $ helm uninstall my-release
    +
    +

    下一步

    安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json new file mode 100644 index 000000000..3eef7ba5c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: [\"0\"]\n...\n","...\nstandalone:\n ...\n deploy:\n resources:\n reservations:\n devices:\n - driver: nvidia\n capabilities: [\"gpu\"]\n device_ids: ['0', '1']\n...\n","$ sudo docker compose up -d\n\nCreating milvus-etcd ... done\nCreating milvus-minio ... done\nCreating milvus-standalone ... done\n","$ sudo docker compose ps\n\n Name Command State Ports\n--------------------------------------------------------------------------------------------------------------------\nmilvus-etcd etcd -advertise-client-url ... Up 2379/tcp, 2380/tcp\nmilvus-minio /usr/bin/docker-entrypoint ... Up (healthy) 9000/tcp\nmilvus-standalone /tini -- milvus run standalone Up 0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp\n","$ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone\n","$ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone\n","# Stop Milvus\n$ sudo docker compose down\n\n# Delete service data\n$ sudo rm -rf volumes\n","docker cp :/milvus/configs/milvus.yaml milvus.yaml\n","vim milvus.yaml\n","...\ngpu:\n initMemSize: 0\n maxMemSize: 0\n...\n","docker cp milvus.yaml :/milvus/configs/milvus.yaml\n","docker stop \ndocker start \n"],"headingContent":"Run Milvus with GPU Support Using Docker Compose","anchorList":[{"label":"使用 Docker Compose 運行支援 GPU 的 Milvus","href":"Run-Milvus-with-GPU-Support-Using-Docker-Compose","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"安裝 Milvus","href":"Install-Milvus","type":2,"isActive":false},{"label":"設定記憶體池","href":"Configure-memory-pool","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md new file mode 100644 index 000000000..107410922 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md @@ -0,0 +1,224 @@ +--- +id: install_standalone-docker-compose-gpu.md +label: Standalone (Docker Compose) +related_key: Kubernetes +summary: 學習如何在 Kubernetes 上安裝 Milvus 叢集。 +title: 使用 Docker Compose 運行支援 GPU 的 Milvus +--- +

    使用 Docker Compose 運行支援 GPU 的 Milvus

    本頁說明如何使用 Docker Compose 啟動支援 GPU 的 Milvus 實例。

    +

    先決條件

    +
    +

    如果您在拉動映像時遇到任何問題,請透過community@zilliz.com與我們聯絡,並提供問題的詳細資訊,我們將為您提供必要的支援。

    +
    +

    安裝 Milvus

    若要使用 Docker Compose 安裝支援 GPU 的 Milvus,請遵循下列步驟。

    +

    1.下載並設定 YAML 檔案

    下載 milvus-standalone-docker-compose-gpu.yml並手動儲存為 docker-compose.yml,或使用下列指令。

    +
    $ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose-gpu.yml -O docker-compose.yml
    +
    +

    您需要對 YAML 檔案中獨立服務的環境變數做一些變更,如下所示:

    +
      +
    • 若要指定特定的 GPU 裝置給 Milvus,請找到standalone 服務定義中的deploy.resources.reservations.devices[0].devices_ids 欄位,並將其值更換為所需 GPU 的 ID。您可以使用 NVIDIA GPU 顯示驅動程式隨附的nvidia-smi 工具來確定 GPU 裝置的 ID。Milvus 支援多個 GPU 裝置。
    • +
    +

    指定單一 GPU 裝置至 Milvus:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ["0"]
    +...
    +
    +

    指定多個 GPU 裝置至 Milvus:

    +
    ...
    +standalone:
    +  ...
    +  deploy:
    +    resources:
    +      reservations:
    +        devices:
    +          - driver: nvidia
    +            capabilities: ["gpu"]
    +            device_ids: ['0', '1']
    +...
    +
    +

    2.啟動 Milvus

    在存放 docker-compose.yml 的目錄中,執行啟動 Milvus:

    +
    $ sudo docker compose up -d
    +
    +Creating milvus-etcd  ... done
    +Creating milvus-minio ... done
    +Creating milvus-standalone ... done
    +
    +
    +

    如果您無法執行上述指令,請檢查您的系統是否已安裝 Docker Compose V1。如果是這樣的話,建議您根據本頁面的說明,轉換到 Docker Compose V2。

    +
    +

    啟動 Milvus 之後、

    +
      +
    • 命名為milvus- standalonemilvus-miniomilvus-etcd的容器已啟動。
        +
      • milvus-etcd容器不向主機暴露任何連接埠,並將其資料映射到目前資料夾中的volumes/etcd
      • +
      • milvus-minio容器使用預設的驗證憑證在本機服務連接埠90909091,並將其資料對應到目前資料夾中的volumes/minio
      • +
      • milvus-standalone容器使用預設設定本機服務連接埠19530,並將其資料對應到目前資料夾中的volumes/milvus
      • +
    • +
    +

    您可以使用以下命令檢查容器是否已啟動和運行:

    +
    $ sudo docker compose ps
    +
    +      Name                     Command                  State                            Ports
    +--------------------------------------------------------------------------------------------------------------------
    +milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
    +milvus-minio        /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
    +milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp
    +
    +

    您也可以存取 Milvus WebUI,網址是http://127.0.0.1:9091/webui/ ,以瞭解更多關於您的 Milvus 實例的資訊。如需詳細資訊,請參閱Milvus WebUI

    +

    如果您在 docker-compose.yml 中指定了多個 GPU 裝置給 Milvus,您可以指定哪個 GPU 裝置是可見或可用的。

    +

    讓 GPU 裝置0 對 Milvus 是可見的:

    +
    $ CUDA_VISIBLE_DEVICES=0 ./milvus run standalone
    +
    +

    讓 GPU 裝置01 對 Milvus 是可見的:

    +
    $ CUDA_VISIBLE_DEVICES=0,1 ./milvus run standalone
    +
    +

    您可以如下方式停止和刪除此容器。

    +
    # Stop Milvus
    +$ sudo docker compose down
    +
    +# Delete service data
    +$ sudo rm -rf volumes
    +
    +

    設定記憶體池

    Milvus 開啟並運行後,您可以透過修改milvus.yaml 檔案中的initMemSizemaxMemSize 設定,自訂記憶體池內容。

    +
    +

    milvus.yaml 檔案位於 Milvus 容器內的/milvus/configs/ 目錄。

    +
    +

    要自訂記憶體池時,請修改milvus.yaml 檔案中的initMemSizemaxMemSize 設定,如下所示。

    +
      +
    1. 使用以下命令將milvus.yaml 從 Milvus 容器複製到您的本機。用您實際的 Milvus 容器 ID 取代<milvus_container_id>

      +
      docker cp <milvus_container_id>:/milvus/configs/milvus.yaml milvus.yaml
      +
    2. +
    3. 使用您喜歡的文字編輯器開啟複製的milvus.yaml 檔案。例如,使用 vim:

      +
      vim milvus.yaml
      +
    4. +
    5. 根據需要編輯initMemSizemaxMemSize 設定,並儲存您的變更:

      +
      ...
      +gpu:
      +  initMemSize: 0
      +  maxMemSize: 0
      +...
      +
      +
        +
      • initMemSize:記憶體池的初始大小。預設為 1024。
      • +
      • maxMemSize:記憶體池的最大大小。預設為 2048。
      • +
    6. +
    7. 使用以下命令將修改過的milvus.yaml 檔案複製回 Milvus 容器。用您實際的 Milvus 容器 ID 取代<milvus_container_id>

      +
      docker cp milvus.yaml <milvus_container_id>:/milvus/configs/milvus.yaml
      +
    8. +
    9. 重新啟動 Milvus 容器以套用變更:

      +
      docker stop <milvus_container_id>
      +docker start <milvus_container_id>
      +
    10. +
    +

    下一步

    在 Docker 中安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.json new file mode 100644 index 000000000..77262873f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545\n","$ modinfo nvidia | grep \"^version\"\nversion: 545.29.06\n","$ minikube start\n","$ kubectl cluster-info\n"," $ kubectl describe node \n\n Capacity:\n ...\n nvidia.com/gpu: 4\n ...\n Allocatable:\n ...\n nvidia.com/gpu: 4\n ...\n ``` \n"],"headingContent":"Requirements for Installing Milvus with GPU","anchorList":[{"label":"安裝支援 GPU 的 Milvus 所需條件","href":"Requirements-for-Installing-Milvus-with-GPU","type":1,"isActive":false},{"label":"計算能力","href":"Compute-capability","type":2,"isActive":false},{"label":"NVIDIA 驅動程式","href":"NVIDIA-driver","type":2,"isActive":false},{"label":"軟體需求","href":"Software-requirements","type":2,"isActive":false},{"label":"常見問題","href":"FAQs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.md new file mode 100644 index 000000000..687bd5c95 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-gpu/prerequisite-gpu.md @@ -0,0 +1,149 @@ +--- +id: prerequisite-gpu.md +label: GPU requirements +related_key: GPU +summary: 了解安裝 Milvus with GPU 前的必要準備。 +title: 安裝支援 GPU 的 Milvus 所需條件 +--- +

    安裝支援 GPU 的 Milvus 所需條件

    本頁面列出設定支援 GPU 的 Milvus 的硬體與軟體需求。

    +

    計算能力

    您的 GPU 裝置的運算能力必須是下列其中之一:6.0, 7.0, 7.5, 8.0, 8.6, 9.0.

    +

    若要檢查您的 GPU 裝置是否符合要求,請在 NVIDIA 開發人員網站上檢查「您的 GPU 運算能力」。

    +

    NVIDIA 驅動程式

    您的 GPU 裝置的 NVIDIA 驅動程式必須在其中一個支援的 Linux 發行版本上,並已依照本指南安裝 NVIDIA Container Toolkit。

    +

    對於 Ubuntu 22.04 使用者,您可以使用下列指令安裝驅動程式和容器工具包:

    +
    $ sudo apt install --no-install-recommends nvidia-headless-545 nvidia-utils-545
    +
    +

    其他作業系統使用者請參考官方安裝指南

    +

    您可以執行下列指令檢查驅動程式是否已正確安裝:

    +
    $ modinfo nvidia | grep "^version"
    +version:        545.29.06
    +
    +

    建議您使用版本 545 以上的驅動程式。

    +

    軟體需求

    建議您在 Linux 平台上執行 Kubernetes 叢集。

    +
      +
    • kubectl 是 Kubernetes 的命令列工具。使用與您的叢集相差一個次要版本之內的 kubectl 版本。使用最新版本的 kubectl 有助於避免不可預見的問題。
    • +
    • 在本機執行 Kubernetes 叢集時需要 minikube。確保您在使用 Helm 安裝 Milvus 之前先安裝 Docker。如需詳細資訊,請參閱Get Docker
    • +
    + + + + + + + +
    作業系統軟體注意事項
    Linux 平台
    • Kubernetes 1.16 或更新版本
    • kubectl
    • Helm 3.0.0 或更新版本
    • minikube (適用於 Milvus 單機版)
    • Docker 19.03 或更新版本 (適用於 Milvus 單機版)
    更多資訊請參閱Helm 文件
    +

    常見問題

    如何在本機啟動 K8s 叢集進行測試?

    您可以使用minikubekindKubeadm 等工具,在本機快速建立 Kubernetes 叢集。以下程序以 minikube 為例。

    +
      +
    1. 下載 minikube
    2. +
    +

    前往Get Started頁面,檢查您是否符合What you'll need章節所列的條件,按一下描述您目標平台的按鈕,然後複製指令下載並安裝二進位檔案。

    +
      +
    1. 使用 minikube 啟動 K8s 叢集
    2. +
    +
    $ minikube start
    +
    +
      +
    1. 檢查 K8s 叢集的狀態
    2. +
    +

    您可以使用下列指令檢查已安裝 K8s 叢集的狀態。

    +
    $ kubectl cluster-info
    +
    +
    +

    確保您可以透過kubectl 存取 K8s 叢集。如果您尚未在本機安裝kubectl ,請參閱在minikube 內使用 kubectl

    +
    +

    如何啟動具有 GPU 工作節點的 K8s 叢集?

    如果您偏好使用支援 GPU 的工作節點,您可以依照下列步驟建立一個有 GPU 工作節點的 K8s 叢集。我們建議在有GPU工作節點的K8s集群上安裝Milvus,並使用預設的儲存類別。

    +
      +
    1. 準備 GPU 工作人員節點
    2. +
    +

    若要使用啟用 GPU 的工作節點,請遵循準備 GPU 節點的步驟。

    +
      +
    1. 在 K8s 上啟用 GPU 支援
    2. +
    +

    按照以下步驟使用 Helm 部署nvidia-device-plugin

    +

    設定完成後,使用下列指令檢視 GPU 資源。將<gpu-worker-node> 改為實際的節點名稱。

    +
      $ kubectl describe node <gpu-worker-node>
    +
    +  Capacity:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  Allocatable:
    +  ...
    +  nvidia.com/gpu:     4
    +  ...
    +  ```  
    +
    diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.json new file mode 100644 index 000000000..443ed35a6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ helm repo add milvus https://zilliztech.github.io/milvus-helm/\n","helm repo add zilliztech https://zilliztech.github.io/milvus-helm/\nhelm repo update\n# upgrade existing helm release\nhelm upgrade my-release zilliztech/milvus\n","$ helm repo update\n","$ helm install my-release milvus/milvus\n","$ kubectl get pods\n","NAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 3m23s\nmy-release-etcd-1 1/1 Running 0 3m23s\nmy-release-etcd-2 1/1 Running 0 3m23s\nmy-release-milvus-datanode-68cb87dcbd-4khpm 1/1 Running 0 3m23s\nmy-release-milvus-indexnode-5c5f7b5bd9-l8hjg 1/1 Running 0 3m24s\nmy-release-milvus-mixcoord-7fb9488465-dmbbj 1/1 Running 0 3m23s\nmy-release-milvus-proxy-6bd7f5587-ds2xv 1/1 Running 0 3m24s\nmy-release-milvus-querynode-5cd8fff495-k6gtg 1/1 Running 0 3m24s\nmy-release-minio-0 1/1 Running 0 3m23s\nmy-release-minio-1 1/1 Running 0 3m23s\nmy-release-minio-2 1/1 Running 0 3m23s\nmy-release-minio-3 1/1 Running 0 3m23s\nmy-release-pulsar-autorecovery-86f5dbdf77-lchpc 1/1 Running 0 3m24s\nmy-release-pulsar-bookkeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-bookkeeper-1 1/1 Running 0 98s\nmy-release-pulsar-broker-556ff89d4c-2m29m 1/1 Running 0 3m23s\nmy-release-pulsar-proxy-6fbd75db75-nhg4v 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-0 1/1 Running 0 3m23s\nmy-release-pulsar-zookeeper-metadata-98zbr 0/1 Completed 0 3m24s\n","$ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ helm template my-release milvus/milvus > milvus_manifest.yaml\n","$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt\n$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py\n","$ pip3 install -r requirements.txt\n$ python3 save_image.py --manifest milvus_manifest.yaml\n","$ for image in $(find . -type f -name \"*.tar.gz\") ; do gunzip -c $image | docker load; done\n","$ kubectl apply -f milvus_manifest.yaml\n","$ helm repo update\n$ helm upgrade my-release zilliztech/milvus\n","$ helm uninstall my-release\n"],"headingContent":"Run Milvus in Kubernetes with Helm","anchorList":[{"label":"使用 Helm 在 Kubernetes 中執行 Milvus","href":"Run-Milvus-in-Kubernetes-with-Helm","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"安裝 Milvus Helm Chart","href":"Install-Milvus-Helm-Chart","type":2,"isActive":false},{"label":"線上安裝","href":"Online-install","type":2,"isActive":false},{"label":"存取 Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"存取 Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"離線安裝","href":"Offline-install","type":2,"isActive":false},{"label":"升級正在運行的 Milvus 集群","href":"Upgrade-running-Milvus-cluster","type":2,"isActive":false},{"label":"卸載 Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.md new file mode 100644 index 000000000..0347a3b21 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-helm.md @@ -0,0 +1,335 @@ +--- +id: install_cluster-helm.md +label: Helm +related_key: Kubernetes +summary: 學習如何在 Kubernetes 上安裝 Milvus 叢集。 +title: 使用 Helm 安裝 Milvus 集群 +--- +

    使用 Helm 在 Kubernetes 中執行 Milvus

    本頁說明如何使用 MilvusHelm 圖表在 Kubernetes 中啟動 Milvus 實例。

    +

    概述

    Helm 使用一種稱為圖表的封裝格式。圖表是描述相關 Kubernetes 資源集的檔案集合。Milvus 提供了一組圖表來幫助您部署 Milvus 的相依性和元件。

    +

    先決條件

      +
    • 安裝 Helm CLI

    • +
    • 建立 K8s 集群

    • +
    • 安裝StorageClass。您可以按以下步驟檢查已安裝的 StorageClass。

      +
      $ kubectl get sc
      +
      +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
      +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
      +
    • +
    • 安裝前檢查硬體和軟體需求

    • +
    • 在安裝 Milvus 之前,建議使用Milvus Sizing Tool根據您的資料大小來估計硬體需求。這有助於確保 Milvus 安裝的最佳性能和資源分配。

    • +
    +
    +

    如果您在拉動映像時遇到任何問題,請聯繫我們community@zilliz.com,並提供有關問題的詳細資訊,我們將為您提供必要的支援。

    +
    +

    安裝 Milvus Helm Chart

    在安裝 Milvus Helm Charts 之前,您需要新增 Milvus Helm repository。

    +
    $ helm repo add milvus https://zilliztech.github.io/milvus-helm/
    +
    +
    +

    位於https://github.com/milvus-io/milvus-helm 的 Milvus Helm Charts repo 已經歸檔,您可以從https://github.com/zilliztech/milvus-helm 取得進一步的更新,如下所示:

    +
    helm repo add zilliztech https://zilliztech.github.io/milvus-helm/
    +helm repo update
    +# upgrade existing helm release
    +helm upgrade my-release zilliztech/milvus
    +
    +

    存檔的 repo 仍可使用於 4.0.31 之前的圖表。對於之後的版本,請使用新的 repo。

    +
    +

    然後從儲存庫取得 Milvus 圖表,如下所示:

    +
    $ helm repo update
    +
    +

    您可以隨時執行這個指令來取得最新的 Milvus Helm 圖表。

    +

    線上安裝

    1.部署 Milvus 集群

    安裝 Helm 圖表後,您就可以在 Kubernetes 上啟動 Milvus。本節將引導您完成啟動 Milvus 的步驟。

    +
    $ helm install my-release milvus/milvus
    +
    +

    在上述指令中,my-release 是發行版名稱,而milvus/milvus 是本機安裝的圖表儲存庫。若要使用其他名稱,請將my-release 替換為您認為合適的名稱。

    +

    上面的命令使用預設配置部署 Milvus 叢集及其元件和相依性。要自訂這些設定,我們建議您使用Milvus 大小調整工具,根據您的實際資料大小調整配置,然後下載相應的 YAML 檔案。要瞭解有關配置參數的更多資訊,請參閱Milvus 系統配置清單

    +
    +
      +
    • 版本名稱只能包含字母、數字和破折號。版本名稱中不允許使用點。
    • +
    • 使用 Helm 安裝 Milvus 時,預設命令列會安裝群集版本的 Milvus。獨立安裝 Milvus 時需要進一步設定。
    • +
    • 根據Kubernetes 的廢棄 API 移轉指南,PodDisruptionBudget 的policy/v1beta1API 版本自 v1.25 起不再提供服務。建議您遷移艙單和 API 用戶端,改用policy/v1API 版本。
      對於仍在 Kubernetes v1.25 及更新版本上使用 PodDisruptionBudget 的policy/v1beta1API 版本的使用者,作為變通方案,您可以執行下列指令來安裝 Milvus:
      helm install my-release milvus/milvus --set pulsar.bookkeeper.pdb.usePolicy=false,pulsar.broker.pdb.usePolicy=false,pulsar.proxy.pdb.usePolicy=false,pulsar.zookeeper.pdb.usePolicy=false
    • +
    • 請參閱Milvus Helm ChartHelm以取得更多資訊。
    • +
    +
    +

    2.檢查 Milvus 群集狀態

    執行下列指令來檢查 Milvus 叢集中所有 Pod 的狀態。

    +
    $ kubectl get pods
    +
    +

    一旦所有 pod 都在運行,上述命令的輸出應該與下面相似:

    +
    NAME                                             READY  STATUS   RESTARTS  AGE
    +my-release-etcd-0                                1/1    Running   0        3m23s
    +my-release-etcd-1                                1/1    Running   0        3m23s
    +my-release-etcd-2                                1/1    Running   0        3m23s
    +my-release-milvus-datanode-68cb87dcbd-4khpm      1/1    Running   0        3m23s
    +my-release-milvus-indexnode-5c5f7b5bd9-l8hjg     1/1    Running   0        3m24s
    +my-release-milvus-mixcoord-7fb9488465-dmbbj      1/1    Running   0        3m23s
    +my-release-milvus-proxy-6bd7f5587-ds2xv          1/1    Running   0        3m24s
    +my-release-milvus-querynode-5cd8fff495-k6gtg     1/1    Running   0        3m24s
    +my-release-minio-0                               1/1    Running   0        3m23s
    +my-release-minio-1                               1/1    Running   0        3m23s
    +my-release-minio-2                               1/1    Running   0        3m23s
    +my-release-minio-3                               1/1    Running   0        3m23s
    +my-release-pulsar-autorecovery-86f5dbdf77-lchpc  1/1    Running   0        3m24s
    +my-release-pulsar-bookkeeper-0                   1/1    Running   0        3m23s
    +my-release-pulsar-bookkeeper-1                   1/1    Running   0        98s
    +my-release-pulsar-broker-556ff89d4c-2m29m        1/1    Running   0        3m23s
    +my-release-pulsar-proxy-6fbd75db75-nhg4v         1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-0                    1/1    Running   0        3m23s
    +my-release-pulsar-zookeeper-metadata-98zbr       0/1   Completed  0        3m24s
    +
    +

    您也可以存取 Milvus WebUI,網址是http://127.0.0.1:9091/webui/ ,以瞭解更多關於您的 Milvus 實例的資訊。詳情請參閱Milvus WebUI

    +

    3.將本機連接埠轉送至 Milvus

    執行下列指令,取得 Milvus 叢集服務的連接埠。

    +
    $ kubectl get pod my-release-milvus-proxy-6bd7f5587-ds2xv --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    輸出顯示 Milvus 實例在預設的19530 連接埠提供服務。

    +
    +

    如果您以獨立模式部署 Milvus,請將 Pod 名稱從my-release-milvus-proxy-xxxxxxxxxx-xxxxx 改為my-release-milvus-xxxxxxxxxx-xxxxx

    +
    +

    然後執行下列指令,將本機連接埠轉寄到 Milvus 服務的連接埠。

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    您可以選擇在上述指令中使用:19530 而不是27017:19530 ,讓kubectl 替您分配一個本機連接埠,這樣您就不必管理連接埠衝突。

    +

    預設情況下,kubectl 的連接埠轉發只會在localhost 上監聽。如果您希望 Milvus 監聽選定或所有的 IP 位址,請使用address 。以下指令會讓 port-forward 聆聽主機上所有的 IP 位址。

    +

    現在,您可以使用轉送的連接埠連線到 Milvus。

    +

    存取 Milvus WebUI

    Milvus 隨附一個內建的 GUI 工具,稱為 Milvus WebUI,您可以透過瀏覽器存取。Milvus Web UI 以簡單直觀的介面增強系統的可觀察性。您可以使用 Milvus Web UI 觀察 Milvus 元件和相依性的統計和指標、檢查資料庫和收集的詳細資訊,以及列出 Milvus 的詳細配置。有關 Milvus Web UI 的詳細資訊,請參閱Milvus WebUI

    +

    要啟用對 Milvus Web UI 的存取,您需要將代理 pod 的連接埠轉發到本機連接埠。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    現在,您可以在http://localhost:27018 存取 Milvus Web UI。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    現在,您可以使用轉送的連接埠連線到 Milvus。

    +

    存取 Milvus WebUI

    Milvus 隨附一個內建的 GUI 工具,稱為 Milvus WebUI,您可以透過瀏覽器存取。Milvus Web UI 以簡單直觀的介面增強系統的可觀察性。您可以使用 Milvus Web UI 觀察 Milvus 元件和相依性的統計和指標、檢查資料庫和收集的詳細資訊,以及列出 Milvus 的詳細配置。有關 Milvus Web UI 的詳細資訊,請參閱Milvus WebUI

    +

    要啟用對 Milvus Web UI 的存取,您需要將代理 pod 的連接埠轉發到本機連接埠。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    現在,您可以存取 Milvus Web UI,網址是http://localhost:27018

    +

    離線安裝

    如果您處在網路受限的環境,請依照本節的步驟啟動 Milvus 叢集。

    +

    1.取得 Milvus 清單

    執行下列命令取得 Milvus 清單。

    +
    $ helm template my-release milvus/milvus > milvus_manifest.yaml
    +
    +

    上述命令會渲染 Milvus 叢集的圖表模板,並將輸出保存到一個名為milvus_manifest.yaml 的艙單檔案中。使用此清單,您可以在獨立的 Pod 中安裝 Milvus 叢集及其元件和相依性。

    +
    +
      +
    • 若要在單機模式下安裝 Milvus 實例,即所有 Milvus 元件都包含在單一 pod 中,您應該執行helm template my-release --set cluster.enabled=false --set etcd.replicaCount=1 --set minio.mode=standalone --set pulsar.enabled=false milvus/milvus > milvus_manifest.yaml 來渲染單機模式下 Milvus 實例的圖表模板。
    • +
    • 要變更 Milvus 配置,下載 value.yaml範本,將您所需的設定放入其中,並使用helm template -f values.yaml my-release milvus/milvus > milvus_manifest.yaml 來渲染相應的艙單。
    • +
    +
    +

    2.下載影像拉取腳本

    image-pulling script 是用 Python 開發的。您應該在requirement.txt 檔案中下載腳本及其相依性。

    +
    $ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/requirements.txt
    +$ wget https://raw.githubusercontent.com/milvus-io/milvus/master/deployments/offline/save_image.py
    +
    +

    3.拉取並儲存影像

    執行下列指令來拉取並儲存所需的影像。

    +
    $ pip3 install -r requirements.txt
    +$ python3 save_image.py --manifest milvus_manifest.yaml
    +
    +

    圖片會拉取到目前目錄中名為images 的子資料夾。

    +

    4.載入影像

    現在您可以按照下列步驟,將影像載入網路受限環境中的主機:

    +
    $ for image in $(find . -type f -name "*.tar.gz") ; do gunzip -c $image | docker load; done
    +
    +

    5.部署 Milvus

    $ kubectl apply -f milvus_manifest.yaml
    +
    +

    到現在為止,您可以依照線上安裝的步驟23檢查群集狀態,並將本機連接埠轉寄給 Milvus。

    +

    升級正在運行的 Milvus 集群

    執行以下指令,將正在運行的 Milvus 集群升級到最新版本:

    +
    $ helm repo update
    +$ helm upgrade my-release zilliztech/milvus
    +
    +

    卸載 Milvus

    執行以下命令卸載 Milvus。

    +
    $ helm uninstall my-release
    +
    +

    下一步

    在 Docker 中安裝 Milvus 後,您可以

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json new file mode 100644 index 000000000..5496a7017 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.json @@ -0,0 +1 @@ +{"codeList":["$ kubectl get sc\n\nNAME PROVISIONER RECLAIMPOLICY VOLUMEBIINDINGMODE ALLOWVOLUMEEXPANSION AGE\nstandard (default) k8s.io/minikube-hostpath Delete Immediate false \n","$ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml\n","customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created\ncustomresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created\nnamespace/cert-manager created\nserviceaccount/cert-manager-cainjector created\n...\nservice/cert-manager created\nservice/cert-manager-webhook created\ndeployment.apps/cert-manager-cainjector created\ndeployment.apps/cert-manager created\ndeployment.apps/cert-manager-webhook created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created\n","$ kubectl get pods -n cert-manager\n\nNAME READY STATUS RESTARTS AGE\ncert-manager-848f547974-gccz8 1/1 Running 0 70s\ncert-manager-cainjector-54f4cc6b5-dpj84 1/1 Running 0 70s\ncert-manager-webhook-7c9588c76-tqncn 1/1 Running 0 70s\n","$ helm install milvus-operator \\\n -n milvus-operator --create-namespace \\\n --wait --wait-for-jobs \\\n https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz\n","NAME: milvus-operator\nLAST DEPLOYED: Thu Jul 7 13:18:40 2022\nNAMESPACE: milvus-operator\nSTATUS: deployed\nREVISION: 1\nTEST SUITE: None\nNOTES:\nMilvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed\nIf Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`\nFull Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md\nQuick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`\nMore samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples\nCRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml\n","namespace/milvus-operator created\ncustomresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created\nserviceaccount/milvus-operator-controller-manager created\nrole.rbac.authorization.k8s.io/milvus-operator-leader-election-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created\nclusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created\nrolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created\nclusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created\nconfigmap/milvus-operator-manager-config created\nservice/milvus-operator-controller-manager-metrics-service created\nservice/milvus-operator-webhook-service created\ndeployment.apps/milvus-operator-controller-manager created\ncertificate.cert-manager.io/milvus-operator-serving-cert created\nissuer.cert-manager.io/milvus-operator-selfsigned-issuer created\nmutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created\nvalidatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created\n","$ kubectl get pods -n milvus-operator\n\nNAME READY STATUS RESTARTS AGE\nmilvus-operator-5fd77b87dc-msrk4 1/1 Running 0 46s\n","$ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml\n","$ kubectl get milvus my-release -o yaml\n","apiVersion: milvus.io/v1alpha1\nkind: Milvus\nmetadata:\n...\nstatus:\n conditions:\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n reason: StorageReady\n status: \"True\"\n type: StorageReady\n - lastTransitionTime: \"2021-11-02T06:06:23Z\"\n message: Pulsar is ready\n reason: PulsarReady\n status: \"True\"\n type: PulsarReady\n - lastTransitionTime: \"2021-11-02T05:59:41Z\"\n message: Etcd endpoints is healthy\n reason: EtcdReady\n status: \"True\"\n type: EtcdReady\n - lastTransitionTime: \"2021-11-02T06:12:36Z\"\n message: All Milvus components are healthy\n reason: MilvusClusterHealthy\n status: \"True\"\n type: MilvusReady\n endpoint: my-release-milvus.default:19530\n status: Healthy\n","$ kubectl get pods\n\nNAME READY STATUS RESTARTS AGE\nmy-release-etcd-0 1/1 Running 0 14m\nmy-release-etcd-1 1/1 Running 0 14m\nmy-release-etcd-2 1/1 Running 0 14m\nmy-release-milvus-datanode-5c686bd65-wxtmf 1/1 Running 0 6m\nmy-release-milvus-indexnode-5b9787b54-xclbx 1/1 Running 0 6m\nmy-release-milvus-proxy-84f67cdb7f-pg6wf 1/1 Running 0 6m\nmy-release-milvus-querynode-5bcb59f6-nhqqw 1/1 Running 0 6m\nmy-release-milvus-mixcoord-fdcccfc84-9964g 1/1 Running 0 6m\nmy-release-minio-0 1/1 Running 0 14m\nmy-release-minio-1 1/1 Running 0 14m\nmy-release-minio-2 1/1 Running 0 14m\nmy-release-minio-3 1/1 Running 0 14m\nmy-release-pulsar-bookie-0 1/1 Running 0 14m\nmy-release-pulsar-bookie-1 1/1 Running 0 14m\nmy-release-pulsar-bookie-init-h6tfz 0/1 Completed 0 14m\nmy-release-pulsar-broker-0 1/1 Running 0 14m\nmy-release-pulsar-broker-1 1/1 Running 0 14m\nmy-release-pulsar-proxy-0 1/1 Running 0 14m\nmy-release-pulsar-proxy-1 1/1 Running 0 14m\nmy-release-pulsar-pulsar-init-d2t56 0/1 Completed 0 14m\nmy-release-pulsar-recovery-0 1/1 Running 0 14m\nmy-release-pulsar-toolset-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-0 1/1 Running 0 14m\nmy-release-pulsar-zookeeper-1 1/1 Running 0 13m\nmy-release-pulsar-zookeeper-2 1/1 Running 0 13m\n","$ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template\n='{{(index (index .spec.containers 0).ports 0).containerPort}}{{\"\\n\"}}'\n19530\n","$ kubectl port-forward service/my-release-milvus 27017:19530\nForwarding from 127.0.0.1:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530\nForwarding from 0.0.0.0:27017 -> 19530\n","$ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091\nForwarding from 0.0.0.0:27018 -> 9091\n","$ kubectl delete milvus my-release\n","$ helm -n milvus-operator uninstall milvus-operator\n","$ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml\n"],"headingContent":"Run Milvus in Kubernetes with Milvus Operator","anchorList":[{"label":"使用 Milvus Operator 在 Kubernetes 中執行 Milvus","href":"Run-Milvus-in-Kubernetes-with-Milvus-Operator","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"安裝 Milvus 操作器","href":"Install-Milvus-Operator","type":2,"isActive":false},{"label":"部署 Milvus","href":"Deploy-Milvus","type":2,"isActive":false},{"label":"存取 Milvus WebUI","href":"Access-Milvus-WebUI","type":2,"isActive":false},{"label":"卸載 Milvus","href":"Uninstall-Milvus","type":2,"isActive":false},{"label":"解除安裝 Milvus 操作系統","href":"Uninstall-Milvus-Operator","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md new file mode 100644 index 000000000..7525d2f67 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md @@ -0,0 +1,392 @@ +--- +id: install_cluster-milvusoperator.md +label: Milvus Operator +related_key: Kubernetes +summary: 學習如何使用 Milvus Operator 在 Kubernetes 上安裝 Milvus 叢集 +title: 使用 Milvus Operator 安裝 Milvus Cluster +--- +

    使用 Milvus Operator 在 Kubernetes 中執行 Milvus

    本頁說明如何使用 MilvusOperator 在 Kubernetes 中啟動 Milvus 實例。

    +

    概述

    Milvus Operator 是一個解決方案,可以幫助您部署和管理完整的 Milvus 服務堆疊到目標 Kubernetes (K8s) 集群。堆疊包括所有 Milvus 元件和相關的依賴項目,例如 etcd、Pulsar 和 MinIO。

    +

    先決條件

      +
    • 建立 K8s 叢集

    • +
    • 安裝StorageClass。您可以按以下步驟檢查已安裝的 StorageClass。

      +
      $ kubectl get sc
      +
      +NAME                  PROVISIONER                  RECLAIMPOLICY    VOLUMEBIINDINGMODE    ALLOWVOLUMEEXPANSION     AGE
      +standard (default)    k8s.io/minikube-hostpath     Delete           Immediate             false 
      +
    • +
    • 安裝前檢查軟硬體需求

    • +
    • 在安裝 Milvus 之前,建議使用Milvus Sizing Tool根據您的資料大小來估計硬體需求。這有助於確保 Milvus 安裝的最佳性能和資源分配。

    • +
    +
    +

    如果您在拉動映像時遇到任何問題,請聯繫我們community@zilliz.com,並提供有關問題的詳細資訊,我們將為您提供必要的支援。

    +
    +

    安裝 Milvus 操作器

    Milvus Operator 定義了Kubernetes 自訂資源之上的 Milvus 叢集自訂資源。定義自訂資源後,您就可以宣告式的方式使用 K8s API,並管理 Milvus 部署堆疊,以確保其可擴充性及高可用性。

    +

    1.安裝 cert-manager

    Milvus Operator 使用cert-manager為 webhook 伺服器提供證書。

    +
    + +
    +

    執行以下指令來安裝 cert-manager。

    +
    $ kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
    +
    +

    安裝程序結束後,您會看到類似下面的輸出。

    +
    customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
    +customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io created
    +namespace/cert-manager created
    +serviceaccount/cert-manager-cainjector created
    +...
    +service/cert-manager created
    +service/cert-manager-webhook created
    +deployment.apps/cert-manager-cainjector created
    +deployment.apps/cert-manager created
    +deployment.apps/cert-manager-webhook created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
    +
    +

    您可以按以下步驟檢查 cert-manager pod 是否正在執行:

    +
    $ kubectl get pods -n cert-manager
    +
    +NAME                                      READY   STATUS    RESTARTS   AGE
    +cert-manager-848f547974-gccz8             1/1     Running   0          70s
    +cert-manager-cainjector-54f4cc6b5-dpj84   1/1     Running   0          70s
    +cert-manager-webhook-7c9588c76-tqncn      1/1     Running   0          70s
    +
    +

    2.安裝 Milvus Operator

    您可以用以下任一種方式安裝 Milvus Operator:

    + +

    使用 Helm 安裝

    執行下列指令,以 Helm 安裝 Milvus Operator。

    +
    $ helm install milvus-operator \
    +  -n milvus-operator --create-namespace \
    +  --wait --wait-for-jobs \
    +  https://github.com/zilliztech/milvus-operator/releases/download/v1.0.1/milvus-operator-1.0.1.tgz
    +
    +

    安裝程序結束後,您會看到類似以下的輸出。

    +
    NAME: milvus-operator
    +LAST DEPLOYED: Thu Jul  7 13:18:40 2022
    +NAMESPACE: milvus-operator
    +STATUS: deployed
    +REVISION: 1
    +TEST SUITE: None
    +NOTES:
    +Milvus Operator Is Starting, use `kubectl get -n milvus-operator deploy/milvus-operator` to check if its successfully installed
    +If Operator not started successfully, check the checker's log with `kubectl -n milvus-operator logs job/milvus-operator-checker`
    +Full Installation doc can be found in https://github.com/zilliztech/milvus-operator/blob/main/docs/installation/installation.md
    +Quick start with `kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_minimum.yaml`
    +More samples can be found in https://github.com/zilliztech/milvus-operator/tree/main/config/samples
    +CRD Documentation can be found in https://github.com/zilliztech/milvus-operator/tree/main/docs/CRD
    +
    +

    使用 kubectl 安裝

    執行下列指令,以kubectl 安裝 Milvus Operator。

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/deploy/manifests/deployment.yaml
    +
    +

    安裝程序結束後,您會看到類似以下的輸出。

    +
    namespace/milvus-operator created
    +customresourcedefinition.apiextensions.k8s.io/milvusclusters.milvus.io created
    +serviceaccount/milvus-operator-controller-manager created
    +role.rbac.authorization.k8s.io/milvus-operator-leader-election-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-manager-role created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-metrics-reader created
    +clusterrole.rbac.authorization.k8s.io/milvus-operator-proxy-role created
    +rolebinding.rbac.authorization.k8s.io/milvus-operator-leader-election-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-manager-rolebinding created
    +clusterrolebinding.rbac.authorization.k8s.io/milvus-operator-proxy-rolebinding created
    +configmap/milvus-operator-manager-config created
    +service/milvus-operator-controller-manager-metrics-service created
    +service/milvus-operator-webhook-service created
    +deployment.apps/milvus-operator-controller-manager created
    +certificate.cert-manager.io/milvus-operator-serving-cert created
    +issuer.cert-manager.io/milvus-operator-selfsigned-issuer created
    +mutatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-mutating-webhook-configuration created
    +validatingwebhookconfiguration.admissionregistration.k8s.io/milvus-operator-validating-webhook-configuration created
    +
    +

    您可以檢查 Milvus Operator pod 是否正在執行,如下所示:

    +
    $ kubectl get pods -n milvus-operator
    +
    +NAME                               READY   STATUS    RESTARTS   AGE
    +milvus-operator-5fd77b87dc-msrk4   1/1     Running   0          46s
    +
    +

    部署 Milvus

    1.部署 Milvus 集群

    一旦 Milvus Operator pod 運行,您就可以按以下方式部署 Milvus 叢集。

    +
    $ kubectl apply -f https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_cluster_default.yaml
    +
    +

    上面的指令使用預設的設定,將 Milvus 叢集的元件和相依性分別部署在不同的 Pod 中。若要自訂這些設定,建議您使用Milvus 大小調整工具,根據實際資料大小調整配置,然後下載相對應的 YAML 檔案。要瞭解有關配置參數的更多資訊,請參閱Milvus 系統配置清單

    +
    +
      +
    • 版本名稱只能包含字母、數字和破折號。發行版名稱中不允許點。
    • +
    • 您也可以在獨立模式下部署 Milvus 實例,即所有元件都包含在單一 pod 中。要做到這一點,請將上述命令中的配置文件 URL 改為https://raw.githubusercontent.com/zilliztech/milvus-operator/main/config/samples/milvus_default.yaml
    • +
    +
    +

    2.檢查 Milvus 集群狀態

    執行以下指令檢查 Milvus 叢集狀態

    +
    $ kubectl get milvus my-release -o yaml
    +
    +

    一旦您的 Milvus 叢集準備就緒,上述命令的輸出應該與下面相似。如果status.status 欄位保持Unhealthy ,您的 Milvus 叢集仍在創建中。

    +
    apiVersion: milvus.io/v1alpha1
    +kind: Milvus
    +metadata:
    +...
    +status:
    +  conditions:
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    reason: StorageReady
    +    status: "True"
    +    type: StorageReady
    +  - lastTransitionTime: "2021-11-02T06:06:23Z"
    +    message: Pulsar is ready
    +    reason: PulsarReady
    +    status: "True"
    +    type: PulsarReady
    +  - lastTransitionTime: "2021-11-02T05:59:41Z"
    +    message: Etcd endpoints is healthy
    +    reason: EtcdReady
    +    status: "True"
    +    type: EtcdReady
    +  - lastTransitionTime: "2021-11-02T06:12:36Z"
    +    message: All Milvus components are healthy
    +    reason: MilvusClusterHealthy
    +    status: "True"
    +    type: MilvusReady
    +  endpoint: my-release-milvus.default:19530
    +  status: Healthy
    +
    +

    Milvus Operator 會建立 Milvus 依賴項目,例如 etcd、Pulsar 和 MinIO,然後是 Milvus 元件,例如 proxy、coordinator 和節點。

    +

    一旦您的 Milvus 叢集準備就緒,Milvus 叢集中所有 Pod 的狀態應該類似於下面。

    +
    $ kubectl get pods
    +
    +NAME                                            READY   STATUS      RESTARTS   AGE
    +my-release-etcd-0                               1/1     Running     0          14m
    +my-release-etcd-1                               1/1     Running     0          14m
    +my-release-etcd-2                               1/1     Running     0          14m
    +my-release-milvus-datanode-5c686bd65-wxtmf      1/1     Running     0          6m
    +my-release-milvus-indexnode-5b9787b54-xclbx     1/1     Running     0          6m
    +my-release-milvus-proxy-84f67cdb7f-pg6wf        1/1     Running     0          6m
    +my-release-milvus-querynode-5bcb59f6-nhqqw      1/1     Running     0          6m
    +my-release-milvus-mixcoord-fdcccfc84-9964g      1/1     Running     0          6m
    +my-release-minio-0                              1/1     Running     0          14m
    +my-release-minio-1                              1/1     Running     0          14m
    +my-release-minio-2                              1/1     Running     0          14m
    +my-release-minio-3                              1/1     Running     0          14m
    +my-release-pulsar-bookie-0                      1/1     Running     0          14m
    +my-release-pulsar-bookie-1                      1/1     Running     0          14m
    +my-release-pulsar-bookie-init-h6tfz             0/1     Completed   0          14m
    +my-release-pulsar-broker-0                      1/1     Running     0          14m
    +my-release-pulsar-broker-1                      1/1     Running     0          14m
    +my-release-pulsar-proxy-0                       1/1     Running     0          14m
    +my-release-pulsar-proxy-1                       1/1     Running     0          14m
    +my-release-pulsar-pulsar-init-d2t56             0/1     Completed   0          14m
    +my-release-pulsar-recovery-0                    1/1     Running     0          14m
    +my-release-pulsar-toolset-0                     1/1     Running     0          14m
    +my-release-pulsar-zookeeper-0                   1/1     Running     0          14m
    +my-release-pulsar-zookeeper-1                   1/1     Running     0          13m
    +my-release-pulsar-zookeeper-2                   1/1     Running     0          13m
    +
    +

    3.將本機連接埠轉送至 Milvus

    執行下列指令以取得 Milvus 叢集服務的連接埠。

    +
    $ kubectl get pod my-release-milvus-proxy-84f67cdb7f-pg6wf --template
    +='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
    +19530
    +
    +

    輸出顯示 Milvus 實例在預設的19530 連接埠提供服務。

    +
    +

    如果您以獨立模式部署 Milvus,請將 Pod 名稱從my-release-milvus-proxy-xxxxxxxxxx-xxxxx 改為my-release-milvus-xxxxxxxxxx-xxxxx

    +
    +

    然後執行下列指令,將本機連接埠轉寄到 Milvus 服務的連接埠。

    +
    $ kubectl port-forward service/my-release-milvus 27017:19530
    +Forwarding from 127.0.0.1:27017 -> 19530
    +
    +

    您可以選擇在上述指令中使用:19530 而不是27017:19530 ,讓kubectl 替您分配一個本機連接埠,這樣您就不必管理連接埠衝突。

    +

    預設情況下,kubectl 的連接埠轉發只會在localhost 上監聽。如果您希望 Milvus 監聽選定或所有的 IP 位址,請使用address 。以下指令會讓 port-forward 聆聽主機上所有的 IP 位址。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27017:19530
    +Forwarding from 0.0.0.0:27017 -> 19530
    +
    +

    現在,您可以使用轉送的連接埠連線到 Milvus。

    +

    存取 Milvus WebUI

    Milvus 隨附一個內建的 GUI 工具,稱為 Milvus WebUI,您可以透過瀏覽器存取。Milvus Web UI 以簡單直觀的介面增強系統的可觀察性。您可以使用 Milvus Web UI 觀察 Milvus 元件和相依性的統計和指標、檢查資料庫和收集的詳細資訊,以及列出 Milvus 的詳細配置。有關 Milvus Web UI 的詳細資訊,請參閱Milvus WebUI

    +

    要啟用對 Milvus Web UI 的存取,您需要將代理 pod 的連接埠轉發到本機連接埠。

    +
    $ kubectl port-forward --address 0.0.0.0 service/my-release-milvus 27018:9091
    +Forwarding from 0.0.0.0:27018 -> 9091
    +
    +

    現在,您可以在http://localhost:27018 存取 Milvus Web UI。

    +

    卸載 Milvus

    執行下列指令卸載 Milvus 叢集。

    +
    $ kubectl delete milvus my-release
    +
    +
    +
      +
    • 當您使用預設設定刪除 Milvus 叢集時,etcd、Pulsar 和 MinIO 等相依性不會被刪除。因此,下次安裝相同的 Milvus 叢集實例時,這些依賴將再次被使用。
    • +
    • 若要連同 Milvus 叢集一起刪除依賴項目和私有虛擬雲 (PVC),請參閱組態檔案
    • +
    +
    +

    解除安裝 Milvus 操作系統

    解除安裝 Milvus Operator 也有兩種方式。

    + +

    使用 Helm 卸載

    $ helm -n milvus-operator uninstall milvus-operator
    +
    +

    使用 kubectl 卸載

    $ kubectl delete -f https://raw.githubusercontent.com/zilliztech/milvus-operator/v1.0.1/deploy/manifests/deployment.yaml
    +
    +

    下一步

    在 Docker 中安裝 Milvus 後,您就可以:

    + diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.json b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.json new file mode 100644 index 000000000..e1cbbaac9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.json @@ -0,0 +1 @@ +{"codeList":["mkdir test-data\nfio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest\n","$ minikube start\n","$ kubectl cluster-info\n"],"headingContent":"Requirements for running Milvus on Kubernetes","anchorList":[{"label":"在 Kubernetes 上執行 Milvus 的需求","href":"Requirements-for-running-Milvus-on-Kubernetes","type":1,"isActive":false},{"label":"硬體需求","href":"Hardware-requirements","type":2,"isActive":false},{"label":"軟體需求","href":"Software-requirements","type":2,"isActive":false},{"label":"常見問題","href":"FAQs","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.md b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.md new file mode 100644 index 000000000..6187c59c4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/getstarted/run-milvus-k8s/prerequisite-helm.md @@ -0,0 +1,148 @@ +--- +id: prerequisite-helm.md +label: Install on Kubernetes +related_key: Kubernetes +summary: 了解使用 Helm 安裝 Milvus 前的必要準備。 +title: 在 Kubernetes 上執行 Milvus 的需求 +--- +

    在 Kubernetes 上執行 Milvus 的需求

    本頁面列出啟動並執行 Milvus 所需的硬體與軟體需求。

    +

    硬體需求

    + + + + + + + + + +
    元件需求建議備註
    中央處理器
    • Intel 第二代 Core CPU 或更高階
    • 蘋果矽晶片
    • 單機:4 核心或以上
    • 群集:8 核心或更多
    CPU 指令集
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    • SSE4.2
    • AVX
    • AVX2
    • AVX-512
    Milvus 中的向量相似性搜尋和索引建立需要 CPU 支援單指令、多資料 (SIMD) 延伸集。確保 CPU 至少支援所列的一種 SIMD 擴充集。如需詳細資訊,請參閱具有 AVX 的 CPU
    記憶體
    • 單機:8G
    • 群集:32G
    • 單機:16G
    • 群集:128G
    RAM 的大小取決於資料量。
    硬碟機SATA 3.0 SSD 或 CloudStorageNVMe SSD 或更高規格硬碟大小視資料容量而定。
    +

    軟體需求

    建議您在 Linux 平台上執行 Kubernetes 叢集。

    +

    kubectl 是 Kubernetes 的命令列工具。使用與您的叢集相差一個次要版本之內的 kubectl 版本。使用最新版本的 kubectl 有助於避免不可預見的問題。

    +

    在本機執行 Kubernetes 叢集時需要 minikube。使用 Helm 安裝 Milvus 前,請確認已安裝 Docker。如需詳細資訊,請參閱Get Docker

    + + + + + + + +
    作業系統軟體注意事項
    Linux 平台
    • Kubernetes 1.16 或更新版本
    • kubectl
    • Helm 3.0.0 或更新版本
    • minikube (適用於 Milvus 單機版)
    • Docker 19.03 或更新版本 (適用於 Milvus 單機版)
    如需詳細資訊,請參閱Helm 文件
    + + + + + + + + + +
    軟體版本注意事項
    etcd3.5.0請參閱其他磁碟需求
    MinIORELEASE.2023-03-20T20-16-18Z
    脈動星2.8.2
    +

    額外的磁碟需求

    磁碟效能對 etcd 至關重要。強烈建議您使用本機 NVMe SSD。較慢的磁碟回應速度可能會導致頻繁的群集選舉,最終會降低 etcd 服務的效能。

    +

    要測試磁碟是否合格,請使用fio

    +
    mkdir test-data
    +fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=2200m --bs=2300 --name=mytest
    +
    +

    理想情況下,您的磁碟應達到 500 IOPS 以上,第 99 百分位數的 fsync 延遲應低於 10 毫秒。閱讀 etcd文件以瞭解更詳細的要求。

    +

    常見問題

    如何在本機啟動 K8s 叢集進行測試?

    您可以使用minikubekindKubeadm 等工具在本機快速建立 Kubernetes 叢集。以下程序以 minikube 為例。

    +
      +
    1. 下載 minikube
    2. +
    +

    前往Get Started頁面,檢查您是否符合What you'll need章節所列的條件,按一下描述您目標平台的按鈕,然後複製指令下載並安裝二進位檔案。

    +
      +
    1. 使用 minikube 啟動 K8s 叢集
    2. +
    +
    $ minikube start
    +
    +
      +
    1. 檢查 K8s 叢集的狀態
    2. +
    +

    您可以使用下列指令檢查已安裝 K8s 叢集的狀態。

    +
    $ kubectl cluster-info
    +
    +
    +

    確保您可以透過kubectl 存取 K8s 叢集。如果您尚未在本機安裝kubectl ,請參閱在minikube 內使用 kubectl

    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/home/home.json b/localization/v2.5.x/site/zh-hant/home/home.json new file mode 100644 index 000000000..9c88dc83d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/home/home.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"","anchorList":[{"label":"開始使用","href":"Get-Started","type":2,"isActive":false},{"label":"推薦文章","href":"Recommended-articles","type":2,"isActive":false},{"label":"新文件","href":"Whats-new-in-docs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/home/home.md b/localization/v2.5.x/site/zh-hant/home/home.md new file mode 100644 index 000000000..2f1b68fd2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/home/home.md @@ -0,0 +1,122 @@ +--- +id: home.md +--- +
    +

    +歡迎來到 Milvus Docs!

    +

    +在這裡,您將學習到什麼是Milvus,以及如何安裝、使用和部署Milvus來建立一個符合您業務需求的應用程式。

    +
    +
    +
    +

    免費試用管理Milvus!

    +

    Zilliz Cloud 由 Milvus 驅動,無後顧之憂,速度快 10 倍。

    +
    + +
    +

    開始使用

    +
    + + icon +

    學習如何使用 Docker Compose 或 Kubernetes 安裝 Milvus。

    +
    +
    + + icon +

    學習如何使用範例程式碼快速執行 Milvus。

    +
    +
    + + icon +

    + 學習如何使用 Milvus 建立向量相似性搜尋應用程式。

    +
    +
    + +
    +

    新文件

    2024 年 11 月 - Milvus 2.5.0 發佈

    + +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.json new file mode 100644 index 000000000..f3957157a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/HydroXai/pii-masker-v1.git\n$ cd pii-masker-v1/pii-masker\n","$ pip install --upgrade pymilvus openai requests tqdm dataset\n","$ export OPENAI_API_KEY=sk-***********\n","text_lines = [\n \"Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16\",\n \"Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.\",\n \"In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.\",\n \"Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.\",\n]\n","from model import PIIMasker\n\nmasker = PIIMasker()\n","masked_results = []\nfor full_text in text_lines:\n masked_text, _ = masker.mask_pii(full_text)\n masked_results.append(masked_text)\n\nfor res in masked_results:\n print(res + \"\\n\")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(masked_results, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"What was the office address of Hiroshi's partner from Munich?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=1, # Return top 1 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say \"I don't know\".\nAI:\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus + PII Masker","anchorList":[{"label":"使用 Milvus + PII Masker 建立 RAG","href":"Build-RAG-with-Milvus-+-PII-Masker","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.md new file mode 100644 index 000000000..6bd3c6745 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/RAG_with_pii_and_milvus.md @@ -0,0 +1,240 @@ +--- +id: RAG_with_pii_and_milvus.md +summary: 在本教程中,我們將教您如何使用 Milvus 和 PII Masker 建立 RAG(Retrieval-Augmented Generation) 管道。 +title: 使用 Milvus + PII Masker 建立 RAG +--- +

    使用 Milvus + PII Masker 建立 RAG

    PII(個人識別資訊)是一種可用於識別個人身份的敏感資料。

    +

    PII MaskerHydroX AI 開發,是一款先進的開放原始碼工具,旨在利用尖端的 AI 模型保護您的敏感資料。無論您是要處理客戶資料、執行資料分析,或是確保符合隱私權法規,PII Masker 都能提供強大、可擴充的解決方案,確保您的資訊安全。

    +

    在本教程中,我們將介紹如何使用 PII Masker 與 Milvus 來保護 RAG(Retrieval-Augmented Generation)應用程式中的隱私資料。透過結合 PII Masker 的資料遮蔽功能與 Milvus 的高效資料擷取功能,您可以建立安全、符合隱私權規定的管道,放心地處理敏感資料。此方法可確保您的應用程式符合隱私權標準,並有效保護使用者資料。

    +

    準備工作

    開始使用 PII Masker

    依照 PII Masker 的安裝指南,安裝所需的相依性並下載模型。以下是一個簡單的指南:

    +
    $ git clone https://github.com/HydroXai/pii-masker-v1.git
    +$ cd pii-masker-v1/pii-masker
    +
    +

    https://huggingface.co/hydroxai/pii_model_weight 下載模型,並取代其中的檔案:pii-masker/output_model/deberta3base_1024/

    +

    依賴與環境

    $ pip install --upgrade pymilvus openai requests tqdm dataset
    +
    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    $ export OPENAI_API_KEY=sk-***********
    +
    +

    然後您可以建立一個 python 或 jupyter 記事本,執行下列程式碼。

    +

    準備資料

    為了測試或示範目的,讓我們產生一些包含 PII 資訊的假行。

    +
    text_lines = [
    +    "Alice Johnson, a resident of Dublin, Ireland, attended a flower festival at Hyde Park on May 15, 2023. She entered the park at noon using her digital passport, number 23456789. Alice spent the afternoon admiring various flowers and plants, attending a gardening workshop, and having a light snack at one of the food stalls. While there, she met another visitor, Mr. Thompson, who was visiting from London. They exchanged tips on gardening and shared contact information: Mr. Thompson's address was 492, Pine Lane, and his cell phone number was +018.221.431-4517. Alice gave her contact details: home address, Ranch 16",
    +    "Hiroshi Tanaka, a businessman from Tokyo, Japan, went to attend a tech expo at the Berlin Convention Center on November 10, 2023. He registered for the event at 9 AM using his digital passport, number Q-24567680. Hiroshi networked with industry professionals, participated in panel discussions, and had lunch with some potential partners. One of the partners he met was from Munich, and they decided to keep in touch: the partner's office address was given as house No. 12, Road 7, Block E. Hiroshi offered his business card with the address, 654 Sakura Road, Tokyo.",
    +    "In an online forum discussion about culinary exchanges around the world, several participants shared their experiences. One user, Male, with the email 2022johndoe@example.com, shared his insights. He mentioned his ID code 1A2B3C4D5E and reference number L87654321 while residing in Italy but originally from Australia. He provided his +0-777-123-4567 and described his address at 456, Flavorful Lane, Pasta, IT, 00100.",
    +    "Another user joined the conversation on the topic of international volunteering opportunities. Identified as Female, she used the email 2023janedoe@example.com to share her story. She noted her 9876543210123 and M1234567890123 while residing in Germany but originally from Brazil. She provided her +0-333-987-6543 and described her address at 789, Sunny Side Street, Berlin, DE, 10178.",
    +]
    +
    +

    使用 PIIMasker 屏蔽資料

    讓我們初始化 PIIMasker 物件並載入模型。

    +
    from model import PIIMasker
    +
    +masker = PIIMasker()
    +
    +

    然後,我們會從文字行清單中遮罩 PII,並列印遮罩後的結果。

    +
    masked_results = []
    +for full_text in text_lines:
    +    masked_text, _ = masker.mask_pii(full_text)
    +    masked_results.append(masked_text)
    +
    +for res in masked_results:
    +    print(res + "\n")
    +
    +
    Alice [B-NAME] , a resident of Dublin Ireland attended flower festival at Hyde Park on May 15 2023 [B-PHONE_NUM] She entered the park noon using her digital passport number 23 [B-ID_NUM] [B-NAME] afternoon admiring various flowers and plants attending gardening workshop having light snack one food stalls While there she met another visitor Mr Thompson who was visiting from London They exchanged tips shared contact information : ' s address 492 [I-STREET_ADDRESS] his cell phone + [B-PHONE_NUM] [B-NAME] details home Ranch [B-STREET_ADDRESS]
    +
    +Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]
    +
    +In an online forum discussion about culinary exchanges around the world [I-STREET_ADDRESS] several participants shared their experiences [I-STREET_ADDRESS] One user Male with email 2022 [B-EMAIL] his insights He mentioned ID code 1 [B-ID_NUM] [I-PHONE_NUM] reference number L [B-ID_NUM] residing in Italy but originally from Australia provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 456 [I-STREET_ADDRESS]
    +
    +Another user joined the conversation on topic of international volunteering opportunities . Identified as Female , she used email 2023 [B-EMAIL] share her story She noted 98 [B-ID_NUM] [I-PHONE_NUM] M [B-ID_NUM] residing in Germany but originally from Brazil provided + [B-PHONE_NUM] [I-PHONE_NUM] described address at 789 [I-STREET_ADDRESS] DE 10 178
    +
    +

    準備嵌入模型

    我們初始化 OpenAI 用戶端以準備嵌入模型。

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    定義使用 OpenAI 用戶端產生文字嵌入的函式。我們使用text-embedding-3-small 模型作為範例。

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生測試嵌入並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 上的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您要使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,這兩個項目對應 Zilliz Cloud 中的Public Endpoint 和 Api key
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷遮罩的文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(masked_results, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 4/4 [00:01<00:00,  2.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 4, 'ids': [0, 1, 2, 3], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於文件的問題。

    +
    question = "What was the office address of Hiroshi's partner from Munich?"
    +
    +

    在集合中搜尋問題,並擷取語義上 top-1 的匹配項目。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=1,  # Return top 1 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        "Hiroshi [B-NAME] [I-STREET_ADDRESS] a businessman from Tokyo Japan went to attend tech expo at the Berlin Convention Center on November 10 2023 . He registered for event 9 AM using his digital passport number Q [B-ID_NUM] [B-NAME] with industry professionals participated in panel discussions and had lunch some potential partners One of he met was Munich they decided keep touch : partner ' s office address given as house No [I-STREET_ADDRESS] [B-NAME] business card 654 [B-STREET_ADDRESS]",
    +        0.6544462442398071
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 LLM 的系統和使用者提示。

    +

    注意:我們告訴 LLM,如果片段中沒有有用的資訊,就說「我不知道」。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided. If there are no useful information in the snippets, just say "I don't know".
    +AI:
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 OpenAI ChatGPT 根據提示產生回應。

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-4o-mini",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    I don't know.
    +
    +

    在這裡我們可以看到,由於我們已經用掩碼取代了 PII,LLM 無法在上下文中取得 PII 資訊。通過這種方式,我們可以有效地保護用戶的隱私。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.json b/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.json new file mode 100644 index 000000000..dbff867e1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0\n","import os\nfrom getpass import getpass\n\nos.environ[\"APIFY_API_TOKEN\"] = getpass(\"Enter YOUR APIFY_API_TOKEN\")\nos.environ[\"OPENAI_API_KEY\"] = getpass(\"Enter YOUR OPENAI_API_KEY\")\n","os.environ[\"MILVUS_URI\"] = getpass(\"Enter YOUR MILVUS_URI\")\nos.environ[\"MILVUS_TOKEN\"] = getpass(\"Enter YOUR MILVUS_TOKEN\")\n\nMILVUS_COLLECTION_NAME = \"apify\"\n","from apify_client import ApifyClient\n\nclient = ApifyClient(os.getenv(\"APIFY_API_TOKEN\"))\n\nactor_id = \"apify/website-content-crawler\"\nrun_input = {\n \"crawlerType\": \"cheerio\",\n \"maxCrawlPages\": 10,\n \"startUrls\": [{\"url\": \"https://milvus.io/\"}, {\"url\": \"https://zilliz.com/\"}],\n}\n\nactor_call = client.actor(actor_id).call(run_input=run_input)\n","dataset_id = actor_call[\"defaultDatasetId\"]\ndataset_id\n","item = client.dataset(dataset_id).list_items(limit=1).items\nitem[0].get(\"text\")\n","milvus_integration_inputs = {\n \"milvusUri\": os.getenv(\"MILVUS_URI\"),\n \"milvusToken\": os.getenv(\"MILVUS_TOKEN\"),\n \"milvusCollectionName\": MILVUS_COLLECTION_NAME,\n \"datasetFields\": [\"text\", \"metadata.title\"],\n \"datasetId\": actor_call[\"defaultDatasetId\"],\n \"performChunking\": True,\n \"embeddingsApiKey\": os.getenv(\"OPENAI_API_KEY\"),\n \"embeddingsProvider\": \"OpenAI\",\n}\n","actor_call = client.actor(\"apify/milvus-integration\").call(\n run_input=milvus_integration_inputs\n)\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.vectorstores import Milvus\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n\nvectorstore = Milvus(\n connection_args={\n \"uri\": os.getenv(\"MILVUS_URI\"),\n \"token\": os.getenv(\"MILVUS_TOKEN\"),\n },\n embedding_function=embeddings,\n collection_name=MILVUS_COLLECTION_NAME,\n)\n\nprompt = PromptTemplate(\n input_variables=[\"context\", \"question\"],\n template=\"Use the following pieces of retrieved context to answer the question. If you don't know the answer, \"\n \"just say that you don't know. \\nQuestion: {question} \\nContext: {context} \\nAnswer:\",\n)\n\n\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n\n\nrag_chain = (\n {\n \"context\": vectorstore.as_retriever() | format_docs,\n \"question\": RunnablePassthrough(),\n }\n | prompt\n | ChatOpenAI(model=\"gpt-4o-mini\")\n | StrOutputParser()\n)\n","question = \"What is Milvus database?\"\n\nrag_chain.invoke(question)\n"],"headingContent":"Retrieval-Augmented Generation: Crawling Websites with Apify and Saving Data to Milvus for Question Answering","anchorList":[{"label":"擷取增強世代:使用 Apify 抓取網站,並將資料儲存至 Milvus 作為問題回答之用","href":"Retrieval-Augmented-Generation-Crawling-Websites-with-Apify-and-Saving-Data-to-Milvus-for-Question-Answering","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-begin","type":1,"isActive":false},{"label":"安裝相依性","href":"Install-dependencies","type":2,"isActive":false},{"label":"設定 Apify 和 Open API 金鑰","href":"Set-up-Apify-and-Open-API-keys","type":2,"isActive":false},{"label":"設定 Milvus/Zilliz URI、Token 和集合名稱","href":"Set-up-MilvusZilliz-URI-token-and-collection-name","type":2,"isActive":false},{"label":"使用網站內容抓取器從 Milvus.io 抓取文字內容","href":"Using-the-Website-Content-Crawler-to-scrape-text-content-from-Milvusio","type":2,"isActive":false},{"label":"檢索與 LLM 產生管道","href":"Retrieval-and-LLM-generative-pipeline","type":1,"isActive":false},{"label":"總結","href":"Conclusion","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.md b/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.md new file mode 100644 index 000000000..1c54db4f8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/apify_milvus_rag.md @@ -0,0 +1,262 @@ +--- +id: apify_milvus_rag.md +summary: 本教學說明如何使用 Apify 的網站內容抓取器抓取網站,並將資料儲存到 Milvus/Zilliz 向量資料庫,以待日後用來回答問題。 +title: 擷取增強世代:使用 Apify 抓取網站,並將資料儲存至 Milvus 作為問題回答之用 +--- +

    擷取增強世代:使用 Apify 抓取網站,並將資料儲存至 Milvus 作為問題回答之用

    Open In Colab

    +

    本教學說明如何使用 Apify 的網站內容抓取器抓取網站,並將資料儲存至 Milvus/Zilliz 向量資料庫,以後用於問題回答。

    +

    Apify是一個網路搜刮與資料擷取平台,提供一個應用程式市場,其中有超過兩千種現成的雲端工具,稱為 Actors。這些工具是從電子商務網站、社群媒體、搜尋引擎、線上地圖等抽取結構化資料等使用個案的理想選擇。

    +

    例如,Website Content CrawlerActor 可以深入抓取網站,透過移除 cookies 模組、頁尾或導覽來清理 HTML,然後將 HTML 轉換成 Markdown。

    +

    適用於 Milvus/Zilliz 的 Apify 整合可輕鬆地將資料從網路上傳至向量資料庫。

    +

    開始之前

    在執行本筆記型電腦之前,請確定您已具備下列條件:

    + +

    安裝相依性

    $ pip install --upgrade --quiet  apify==1.7.2 langchain-core==0.3.5 langchain-milvus==0.1.5 langchain-openai==0.2.0
    +
    +

    設定 Apify 和 Open API 金鑰

    import os
    +from getpass import getpass
    +
    +os.environ["APIFY_API_TOKEN"] = getpass("Enter YOUR APIFY_API_TOKEN")
    +os.environ["OPENAI_API_KEY"] = getpass("Enter YOUR OPENAI_API_KEY")
    +
    +
    Enter YOUR APIFY_API_TOKEN··········
    +Enter YOUR OPENAI_API_KEY··········
    +
    +

    設定 Milvus/Zilliz URI、Token 和集合名稱

    您需要 Milvus/Zilliz 的 URI 和 Token 來設定用戶端。

    +
      +
    • 如果您有在Docker 或 Kubernetes 上自行部署 Milvus 伺服器,請使用伺服器位址和連接埠作為您的 URI,例如http://localhost:19530 。如果您啟用 Milvus 上的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則令牌保留為空字串。
    • +
    • 如果您使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 API key
    • +
    +

    請注意,集合不需要事先存在。當資料上傳到資料庫時,它會自動建立。

    +
    os.environ["MILVUS_URI"] = getpass("Enter YOUR MILVUS_URI")
    +os.environ["MILVUS_TOKEN"] = getpass("Enter YOUR MILVUS_TOKEN")
    +
    +MILVUS_COLLECTION_NAME = "apify"
    +
    +
    Enter YOUR MILVUS_URI··········
    +Enter YOUR MILVUS_TOKEN··········
    +
    +

    使用網站內容抓取器從 Milvus.io 抓取文字內容

    接下來,我們將使用 Apify Python SDK 來使用網站內容爬蟲。我們先定義 actor_id 和 run_input,然後再指定要儲存到向量資料庫的資訊。

    +

    actor_id="apify/website-content-crawler" 是網站內容爬蟲的識別碼。爬蟲的行為可透過 run_input 參數完全控制(詳情請參閱輸入頁面)。在這個範例中,我們要抓取的是 Milvus 文件,不需要 JavaScript 渲染。因此,我們設定crawlerType=cheerio, 定義startUrls, 並透過設定maxCrawlPages=10 來限制爬取的頁面數量。

    +
    from apify_client import ApifyClient
    +
    +client = ApifyClient(os.getenv("APIFY_API_TOKEN"))
    +
    +actor_id = "apify/website-content-crawler"
    +run_input = {
    +    "crawlerType": "cheerio",
    +    "maxCrawlPages": 10,
    +    "startUrls": [{"url": "https://milvus.io/"}, {"url": "https://zilliz.com/"}],
    +}
    +
    +actor_call = client.actor(actor_id).call(run_input=run_input)
    +
    +

    網站內容抓取程式會徹底抓取網站,直到達到maxCrawlPages 所設定的預定限制。抓取的資料會儲存在 Apify 平台上的Dataset 。要存取及分析這些資料,您可以使用defaultDatasetId

    +
    dataset_id = actor_call["defaultDatasetId"]
    +dataset_id
    +
    +
    'P9dLFfeJAljlePWnz'
    +
    +

    以下程式碼從 ApifyDataset 取得 scraped 資料,並顯示第一個 scraped 網站

    +
    item = client.dataset(dataset_id).list_items(limit=1).items
    +item[0].get("text")
    +
    +
    'The High-Performance Vector Database Built for Scale\nStart running Milvus in seconds\nfrom pymilvus import MilvusClient client = MilvusClient("milvus_demo.db") client.create_collection( collection_name="demo_collection", dimension=5 )\nDeployment Options to Match Your Unique Journey\nMilvus Lite\nLightweight, easy to start\nVectorDB-as-a-library runs in notebooks/ laptops with a pip install\nBest for learning and prototyping\nMilvus Standalone\nRobust, single-machine deployment\nComplete vector database for production or testing\nIdeal for datasets with up to millions of vectors\nMilvus Distributed\nScalable, enterprise-grade solution\nHighly reliable and distributed vector database with comprehensive toolkit\nScale horizontally to handle billions of vectors\nZilliz Cloud\nFully managed with minimal operations\nAvailable in both serverless and dedicated cluster\nSaaS and BYOC options for different security and compliance requirements\nTry Free\nLearn more about different Milvus deployment models\nLoved by GenAI developers\nBased on our research, Milvus was selected as the vector database of choice (over Chroma and Pinecone). Milvus is an open-source vector database designed specifically for similarity search on massive datasets of high-dimensional vectors.\nWith its focus on efficient vector similarity search, Milvus empowers you to build robust and scalable image retrieval systems. Whether you’re managing a personal photo library or developing a commercial image search application, Milvus offers a powerful foundation for unlocking the hidden potential within your image collections.\nBhargav Mankad\nSenior Solution Architect\nMilvus is a powerful vector database tailored for processing and searching extensive vector data. It stands out for its high performance and scalability, rendering it perfect for machine learning, deep learning, similarity search tasks, and recommendation systems.\nIgor Gorbenko\nBig Data Architect\nStart building your GenAI app now\nGuided with notebooks developed by us and our community\nRAG\nTry Now\nImage Search\nTry Now\nMultimodal Search\nTry Now\nUnstructured Data Meetups\nJoin a Community of Passionate Developers and Engineers Dedicated to Gen AI.\nRSVP now\nWhy Developers Prefer Milvus for Vector Databases\nScale as needed\nElastic scaling to tens of billions of vectors with distributed architecture.\nBlazing fast\nRetrieve data quickly and accurately with Global Index, regardless of scale.\nReusable Code\nWrite once, and deploy with one line of code into the production environment.\nFeature-rich\nMetadata filtering, hybrid search, multi-vector and more.\nWant to learn more about Milvus? View our documentation\nJoin the community of developers building GenAI apps with Milvus, now with over 25 million downloads\nGet Milvus Updates\nSubscribe to get updates on the latest Milvus releases, tutorials and training from Zilliz, the creator and key maintainer of Milvus.'
    +
    +

    要上傳資料到 Milvus 資料庫,我們使用Apify Milvus 整合。首先,我們需要設定 Milvus 資料庫的參數。接下來,我們選擇要儲存到資料庫的欄位 (datasetFields)。在下面的範例中,我們要儲存text 欄位和metadata.title

    +
    milvus_integration_inputs = {
    +    "milvusUri": os.getenv("MILVUS_URI"),
    +    "milvusToken": os.getenv("MILVUS_TOKEN"),
    +    "milvusCollectionName": MILVUS_COLLECTION_NAME,
    +    "datasetFields": ["text", "metadata.title"],
    +    "datasetId": actor_call["defaultDatasetId"],
    +    "performChunking": True,
    +    "embeddingsApiKey": os.getenv("OPENAI_API_KEY"),
    +    "embeddingsProvider": "OpenAI",
    +}
    +
    +

    現在,我們呼叫apify/milvus-integration 來儲存資料

    +
    actor_call = client.actor("apify/milvus-integration").call(
    +    run_input=milvus_integration_inputs
    +)
    +
    +

    現在所有的 scraped 資料都儲存在 Milvus 資料庫中,可以進行擷取和問題回答了

    +

    檢索與 LLM 產生管道

    接下來,我們將使用 Langchain 定義檢索增強管道。管道分兩個階段運作:

    +
      +
    • 向量倉庫 (Milvus):Langchain 透過將查詢嵌入與儲存的文件嵌入進行匹配,從 Milvus 擷取相關文件。
    • +
    • LLM 回應:擷取的文件為 LLM (例如 GPT-4)提供上下文,以產生有根據的答案。
    • +
    +

    有關 RAG 鏈的詳細資訊,請參閱Langchain 文件

    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.vectorstores import Milvus
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +vectorstore = Milvus(
    +    connection_args={
    +        "uri": os.getenv("MILVUS_URI"),
    +        "token": os.getenv("MILVUS_TOKEN"),
    +    },
    +    embedding_function=embeddings,
    +    collection_name=MILVUS_COLLECTION_NAME,
    +)
    +
    +prompt = PromptTemplate(
    +    input_variables=["context", "question"],
    +    template="Use the following pieces of retrieved context to answer the question. If you don't know the answer, "
    +    "just say that you don't know. \nQuestion: {question} \nContext: {context} \nAnswer:",
    +)
    +
    +
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +
    +rag_chain = (
    +    {
    +        "context": vectorstore.as_retriever() | format_docs,
    +        "question": RunnablePassthrough(),
    +    }
    +    | prompt
    +    | ChatOpenAI(model="gpt-4o-mini")
    +    | StrOutputParser()
    +)
    +
    +

    一旦資料庫中有了資料,我們就可以開始發問了

    +
    +
    question = "What is Milvus database?"
    +
    +rag_chain.invoke(question)
    +
    +
    'Milvus is an open-source vector database specifically designed for billion-scale vector similarity search. It facilitates efficient management and querying of vector data, which is essential for applications involving unstructured data, such as AI and machine learning. Milvus allows users to perform operations like CRUD (Create, Read, Update, Delete) and vector searches, making it a powerful tool for handling large datasets.'
    +
    +

    總結

    在本教程中,我們示範了如何使用 Apify 抓取網站內容、將資料儲存在 Milvus 向量資料庫,並使用檢索增強管道來執行問題解答任務。透過結合 Apify 的網頁抓取功能與向量儲存的 Milvus/Zilliz 以及語言模型的 Langchain,您可以建立高效能的資訊檢索系統。

    +

    為了改善資料庫中的資料蒐集與更新,Apify 整合提供增量更新功能,僅根據校驗和更新新的或修改過的資料。此外,它還可以自動移除在指定時間內未被抓取的過期資料。這些功能有助於保持您的向量資料庫最佳化,並確保您的檢索增強管道以最少的手動工作保持高效率與最新。

    +

    有關 Apify-Milvus 整合的更多詳細資訊,請參閱Apify Milvus 文件整合 README 檔案

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.json new file mode 100644 index 000000000..5acb96744 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus git+https://github.com/topoteretes/cognee.git\n","import os\n\nimport cognee\n\ncognee.config.set_llm_api_key(\"YOUR_OPENAI_API_KEY\")\n\n\nos.environ[\"VECTOR_DB_PROVIDER\"] = \"milvus\"\nos.environ[\"VECTOR_DB_URL\"] = \"./milvus.db\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","await cognee.add(data=text_lines, dataset_name=\"milvus_faq\")\nawait cognee.cognify()\n\n# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\\n\\nYes. When ...\n# ...\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)\n\nprint(search_results[0])\n","from cognee.api.v1.search import SearchType\n\nquery_text = \"How is data stored in milvus?\"\nsearch_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)\n","def format_and_print(data):\n print(\"ID:\", data[\"id\"])\n print(\"\\nText:\\n\")\n paragraphs = data[\"text\"].split(\"\\n\\n\")\n for paragraph in paragraphs:\n print(paragraph.strip())\n print()\n\n\nformat_and_print(search_results[0])\n","await cognee.prune.prune_data()\nawait cognee.prune.prune_system(metadata=True)\n","# We only use one line of text as the dataset, which simplifies the output later\ntext = \"\"\"\n Natural language processing (NLP) is an interdisciplinary\n subfield of computer science and information retrieval.\n \"\"\"\n\nawait cognee.add(text)\nawait cognee.cognify()\n","query_text = \"Tell me about NLP\"\nsearch_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)\n\nfor result_text in search_results:\n print(result_text)\n\n# Example output:\n# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})\n# (...)\n#\n# It represents nodes and relationships in the knowledge graph:\n# - The first element is the source node (e.g., 'natural language processing').\n# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').\n# - The third element is the target node (e.g., 'computer science').\n"],"headingContent":"","anchorList":[{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.md new file mode 100644 index 000000000..a7eabd833 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_cognee.md @@ -0,0 +1,157 @@ +--- +id: build_RAG_with_milvus_and_cognee.md +summary: 在本教程中,我們將告訴您如何使用 Milvus 和 Cognee 建立 RAG(Retrieval-Augmented Generation)管道。 +title: 使用 Milvus 和 Cognee 建立 RAG +--- +

    +Open In Colab + + +GitHub Repository +

    +

    使用 Milvus 和 Cognee 建立 RAG

    Cognee是一個開發者至上的平台,可透過可擴充的模組化 ECL(Extract、Cognify、Load)管道簡化 AI 應用程式開發。透過與 Milvus 的無縫整合,Cognee 可實現對話、文件和轉錄的高效連接和檢索,從而減少幻覺並優化營運成本。

    +

    憑藉對 Milvus、圖形資料庫和 LLM 等向量儲存的強大支援,Cognee 為建立檢索增強生成 (RAG) 系統提供了靈活且可定制的框架。它的生產就緒架構可確保為人工智能驅動的應用程式提高準確性和效率。

    +

    在本教程中,我們將教您如何使用 Milvus 和 Cognee 建立 RAG(檢索-增強生成)管道。

    +
    $ pip install pymilvus git+https://github.com/topoteretes/cognee.git
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    本範例預設使用 OpenAI 作為 LLM。您應該準備api key,並在 configset_llm_api_key() 函式中設定。

    +

    若要設定 Milvus 為向量資料庫,請將VECTOR_DB_PROVIDER 設定為milvus ,並指定VECTOR_DB_URLVECTOR_DB_KEY 。因為我們在這個 demo 中使用 Milvus Lite 來儲存資料,所以只需要提供VECTOR_DB_URL

    +
    import os
    +
    +import cognee
    +
    +cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
    +
    +
    +os.environ["VECTOR_DB_PROVIDER"] = "milvus"
    +os.environ["VECTOR_DB_URL"] = "./milvus.db"
    +
    +
    +

    至於環境變數VECTOR_DB_URLVECTOR_DB_KEY

    +
      +
    • VECTOR_DB_URL 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的VECTOR_DB_URL
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整VECTOR_DB_URLVECTOR_DB_KEY ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +

    +

    準備資料

    我們使用Milvus 文件 2.4.x中的 FAQ 頁面作為我們 RAG 中的私有知識,這是一個簡單 RAG 管道的良好資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,這樣就可以大致分隔出 markdown 文件中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    建立 RAG

    重置 Cognee 資料

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    清零準備就緒後,我們現在就可以加入資料集,並將其處理成知識圖表。

    +

    新增資料與認知

    await cognee.add(data=text_lines, dataset_name="milvus_faq")
    +await cognee.cognify()
    +
    +# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
    +# ...
    +
    +

    add 方法會將資料集(Milvus FAQs)載入 Cognee,而cognify 方法則會處理資料,以抽取實體、關係和摘要,建構知識圖表。

    +

    查詢摘要

    現在資料已經處理完成,讓我們來查詢知識圖表。

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
    +
    +print(search_results[0])
    +
    +
    {'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
    +
    +

    此查詢在知識圖表中搜尋與查詢文字相關的摘要,並列印出最相關的候選摘要。

    +

    查詢大塊

    摘要提供了高層次的洞察力,但若要瞭解更仔細的細節,我們可以直接從處理過的資料集中查詢特定的資料塊。這些資料塊來自於在建立知識圖表時新增和分析的原始資料。

    +
    from cognee.api.v1.search import SearchType
    +
    +query_text = "How is data stored in milvus?"
    +search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
    +
    +

    讓我們將它格式化並顯示出來,以獲得更好的可讀性!

    +
    def format_and_print(data):
    +    print("ID:", data["id"])
    +    print("\nText:\n")
    +    paragraphs = data["text"].split("\n\n")
    +    for paragraph in paragraphs:
    +        print(paragraph.strip())
    +        print()
    +
    +
    +format_and_print(search_results[0])
    +
    +
    ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
    +
    +Text:
    +
    +Where does Milvus store data?
    +
    +Milvus deals with two types of data, inserted data and metadata.
    +
    +Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
    +
    +Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
    +
    +###
    +
    +

    在之前的步驟中,我們查詢了 Milvus FAQ 資料集的摘要和特定資料塊。雖然這提供了詳盡的洞察力和細粒度資訊,但資料集相當龐大,因此要清楚可視化知識圖表內的依賴關係是一大挑戰。

    +

    為了解決這個問題,我們將重設 Cognee 環境,並使用更小、更集中的資料集。這將使我們能夠更好地展示在 Cognify 過程中提取的關係和依賴關係。通過簡化資料,我們可以清楚地看到 Cognee 如何組織和結構知識圖表中的資訊。

    +

    重置 Cognee

    await cognee.prune.prune_data()
    +await cognee.prune.prune_system(metadata=True)
    +
    +

    新增焦點資料集

    在這裡,我們添加並處理了一個只有一行文字的較小數據集,以確保知識圖表聚焦且易於詮釋。

    +
    # We only use one line of text as the dataset, which simplifies the output later
    +text = """
    +    Natural language processing (NLP) is an interdisciplinary
    +    subfield of computer science and information retrieval.
    +    """
    +
    +await cognee.add(text)
    +await cognee.cognify()
    +
    +

    查詢洞察力

    透過聚焦於這個較小的資料集,我們現在可以清楚地分析知識圖形中的關係和結構。

    +
    query_text = "Tell me about NLP"
    +search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
    +
    +for result_text in search_results:
    +    print(result_text)
    +
    +# Example output:
    +# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
    +# (...)
    +#
    +# It represents nodes and relationships in the knowledge graph:
    +# - The first element is the source node (e.g., 'natural language processing').
    +# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
    +# - The third element is the target node (e.g., 'computer science').
    +
    +

    此輸出代表知識圖表查詢的結果,展示了從已處理資料集中萃取的實體 (節點) 及其關係 (邊)。每個元元組包括來源實體、關係類型和目標實體,以及獨特 ID、描述和時間戳等元資料。圖形會強調關鍵概念及其語義連結,提供對資料集的結構化理解。

    +

    恭喜您,您已經學會了使用 Milvus 的 cognee 的基本用法。如果您想了解更多關於 cognee 的進階用法,請參閱其官方頁面

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.json new file mode 100644 index 000000000..21d7d021d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"DEEPSEEK_API_KEY\"] = \"***********\"\n","! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\ndeepseek_client = OpenAI(\n api_key=os.environ[\"DEEPSEEK_API_KEY\"],\n base_url=\"https://api.deepseek.com\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = deepseek_client.chat.completions.create(\n model=\"deepseek-chat\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and DeepSeek","anchorList":[{"label":"使用 Milvus 和 DeepSeek 建立 RAG","href":"Build-RAG-with-Milvus-and-DeepSeek","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.md new file mode 100644 index 000000000..51b4a9c30 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_deepseek.md @@ -0,0 +1,247 @@ +--- +id: build_RAG_with_milvus_and_deepseek.md +summary: >- + 在本教程中,我們將告訴您如何使用 Milvus 和 DeepSeek 建立檢索-增強世代 (Retrieval-Augmented Generation, + RAG) 管道。 +title: 使用 Milvus 和 DeepSeek 建立 RAG +--- +

    使用 Milvus 和 DeepSeek 建立 RAG

    Open In Colab +GitHub Repository

    +

    DeepSeek可讓開發人員利用高效能的語言模型建立和擴充人工智能應用程式。它提供高效的推理、靈活的 API 和先進的專家混合物 (MoE) 架構,可執行強大的推理和檢索任務。

    +

    在本教程中,我們將告訴您如何使用 Milvus 和 DeepSeek 建立檢索-增強世代 (RAG) 管道。

    +

    準備工作

    相依性與環境

    ! pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時(點擊螢幕上方的「Runtime」功能表,從下拉式功能表中選擇「Restart session」)。

    +
    +

    DeepSeek 啟用 OpenAI 式 API。您可以登入其官方網站,準備api key DEEPSEEK_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["DEEPSEEK_API_KEY"] = "***********"
    +
    +

    準備資料

    我們使用Milvus Documentation 2.4.x中的 FAQ 頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道來說,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    ! wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +! unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備 LLM 和嵌入模型

    DeepSeek 啟用 OpenAI 風格的 API,您也可以使用相同的 API,稍作調整後呼叫 LLM。

    +
    from openai import OpenAI
    +
    +deepseek_client = OpenAI(
    +    api_key=os.environ["DEEPSEEK_API_KEY"],
    +    base_url="https://api.deepseek.com",
    +)
    +
    +

    定義嵌入模型,使用milvus_model 產生文字嵌入。我們以DefaultEmbeddingFunction 模型為例,這是一個預先訓練好的輕量級嵌入模型。

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    產生測試嵌入,並列印其維度和前幾個元素。

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings:   0%|          | 0/72 [00:00<?, ?it/s]huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 246522.36it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 DeepSeek 提供的deepseek-chat 模型,根據提示產生回應。

    +
    response = deepseek_client.chat.completions.create(
    +    model="deepseek-chat",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +1. **Inserted Data**: This includes vector data, scalar data, and collection-specific schema. The inserted data is stored in persistent storage as incremental logs. Milvus supports various object storage backends for this purpose, such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +2. **Metadata**: Metadata is generated within Milvus and is specific to each Milvus module. This metadata is stored in etcd, a distributed key-value store.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and Milvus returns success at this stage. The data is then written to persistent storage as incremental logs by the data node. If the `flush()` function is called, the data node is forced to write all data in the message queue to persistent storage immediately.
    +
    +

    太好了!我們已經用 Milvus 和 DeepSeek 成功地建立了一個 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.json new file mode 100644 index 000000000..b393f8590 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"FIREWORKS_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nfireworks_client = OpenAI(\n api_key=os.environ[\"FIREWORKS_API_KEY\"],\n base_url=\"https://api.fireworks.ai/inference/v1\",\n)\n","def emb_text(text):\n return (\n fireworks_client.embeddings.create(\n input=text, model=\"nomic-ai/nomic-embed-text-v1.5\"\n )\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = fireworks_client.chat.completions.create(\n model=\"accounts/fireworks/models/llama-v3p1-405b-instruct\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Fireworks AI","anchorList":[{"label":"使用 Milvus 和 Fireworks AI 建立 RAG","href":"Build-RAG-with-Milvus-and-Fireworks-AI","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.md new file mode 100644 index 000000000..ff182ba60 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_fireworks.md @@ -0,0 +1,248 @@ +--- +id: build_RAG_with_milvus_and_fireworks.md +summary: >- + 在本教程中,我們將教您如何使用 Milvus 和 Fireworks AI 建立 RAG(Retrieval-Augmented + Generation)管道。 +title: 使用 Milvus 和 Fireworks AI 建立 RAG +--- +

    使用 Milvus 和 Fireworks AI 建立 RAG

    +Open In Colab + + +GitHub Repository +

    +

    Fireworks AI是一個生成式人工智能推理平台,提供業界領先的速度和生產準備,可執行和自訂模型。 Fireworks AI 提供各種生成式人工智能服務,包括無伺服器模型、隨需部署和微調功能。它提供了部署各種 AI 模型的全面環境,包括大型語言模型 (LLM) 和嵌入模型。Fireworks AI 匯聚了許多模型,讓使用者可以輕鬆存取和利用這些資源,而不需要大量的基礎架構設定。

    +

    在本教程中,我們將教您如何使用 Milvus 和 Fireworks AI 建立 RAG(Retrieval-Augmented Generation)管道。

    +

    準備工作

    相依性與環境

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    Fireworks AI 啟用 OpenAI-style API。您可以登入其官方網站,並準備api key FIREWORKS_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["FIREWORKS_API_KEY"] = "***********"
    +
    +

    準備資料

    我們使用Milvus Documentation 2.4.x中的 FAQ 頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備 LLM 和嵌入模型

    我們初始化一個用戶端來準備 LLM 和嵌入模型。Fireworks AI 啟用 OpenAI 風格的 API,您可以使用相同的 API 並稍作調整來呼叫嵌入模型和 LLM。

    +
    from openai import OpenAI
    +
    +fireworks_client = OpenAI(
    +    api_key=os.environ["FIREWORKS_API_KEY"],
    +    base_url="https://api.fireworks.ai/inference/v1",
    +)
    +
    +

    定義使用客戶端產生文字嵌入的函式。我們以nomic-ai/nomic-embed-text-v1.5 模型為例。

    +
    def emb_text(text):
    +    return (
    +        fireworks_client.embeddings.create(
    +            input=text, model="nomic-ai/nomic-embed-text-v1.5"
    +        )
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生一個測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[0.04815673828125, 0.0261993408203125, -0.1749267578125, -0.03131103515625, 0.068115234375, -0.00621795654296875, 0.03955078125, -0.0210723876953125, 0.039703369140625, -0.0286102294921875]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:28<00:00,  2.51it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8334928750991821
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.746377170085907
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7328270673751831
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 Fireworks 提供的llama-v3p1-405b-instruct 模型,根據提示產生回應。

    +
    response = fireworks_client.chat.completions.create(
    +    model="accounts/fireworks/models/llama-v3p1-405b-instruct",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    According to the provided context, Milvus stores data in two ways:
    +
    +1. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. This can be done using multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +2. Metadata, which are generated within Milvus, are stored in etcd, with each Milvus module having its own metadata.
    +
    +Additionally, when data is inserted, it is first loaded into a message queue, and then written to persistent storage as incremental logs by the data node. The `flush()` function can be used to force the data node to write all data in the message queue to persistent storage immediately.
    +
    +

    太好了!我們已經用 Milvus 和 Fireworks AI 成功地建立了一個 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.json new file mode 100644 index 000000000..38a678d3c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus google-generativeai requests tqdm\n","import os\n\nos.environ[\"GEMINI_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","import google.generativeai as genai\n\ngenai.configure(api_key=os.environ[\"GEMINI_API_KEY\"])\n\ngemini_model = genai.GenerativeModel(\"gemini-1.5-flash\")\n\nresponse = gemini_model.generate_content(\"who are you\")\nprint(response.text)\n","test_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=[\"This is a test1\", \"This is a test2\"]\n)[\"embedding\"]\n\nembedding_dim = len(test_embeddings[0])\nprint(embedding_dim)\nprint(test_embeddings[0][:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = genai.embed_content(\n model=\"models/text-embedding-004\", content=text_lines\n)[\"embedding\"]\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","question_embedding = genai.embed_content(\n model=\"models/text-embedding-004\", content=question\n)[\"embedding\"]\n\nsearch_res = milvus_client.search(\n collection_name=collection_name,\n data=[question_embedding],\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","gemini_model = genai.GenerativeModel(\n \"gemini-1.5-flash\", system_instruction=SYSTEM_PROMPT\n)\nresponse = gemini_model.generate_content(USER_PROMPT)\nprint(response.text)\n"],"headingContent":"Build RAG with Milvus and Gemini","anchorList":[{"label":"使用 Milvus 和 Gemini 建立 RAG","href":"Build-RAG-with-Milvus-and-Gemini","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.md new file mode 100644 index 000000000..870608905 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_gemini.md @@ -0,0 +1,244 @@ +--- +id: build_RAG_with_milvus_and_gemini.md +summary: >- + 在本教程中,我們將教您如何使用 Milvus 和 Gemini 建立 RAG(Retrieval-Augmented + Generation,檢索-增強生成)管道。我們將使用 Gemini 模型根據給定的查詢產生文字。我們也會使用 Milvus 來儲存和擷取產生的文字。 +title: 使用 Milvus 和 Gemini 建立 RAG +--- +

    +Open In Colab + + +GitHub Repository +

    +

    使用 Milvus 和 Gemini 建立 RAG

    Gemini APIGoogle AI Studio可協助您開始使用 Google 的最新模型,並將您的想法轉化為可擴充的應用程式。Gemini 可讓您存取功能強大的語言模型,例如Gemini-1.5-FlashGemini-1.5-Flash-8BGemini-1.5-Pro ,以執行文字產生、文件處理、視覺、音訊分析等任務。透過 API,您可以輸入包含數百萬筆字元的長上下文、針對特定任務微調模型、產生結構化輸出(如 JSON),以及利用語意檢索和程式碼執行等功能。

    +

    在本教程中,我們將教您如何使用 Milvus 和 Gemini 建立 RAG(Retrieval-Augmented Generation)管道。我們將使用 Gemini 模型根據給定的查詢生成文字。我們也會使用 Milvus 來儲存和擷取產生的文字。

    +

    準備工作

    相依性與環境

    $ pip install --upgrade pymilvus google-generativeai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(按一下螢幕上方的「Runtime」功能表,然後從下拉式功能表中選擇「Restart session」)。

    +
    +

    您應該先登入 Google AI Studio 平台,並準備api key GEMINI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["GEMINI_API_KEY"] = "***********"
    +
    +

    準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備 LLM 和嵌入模型

    我們使用gemini-1.5-flash 作為 LLM,並使用text-embedding-004 作為嵌入模型。

    +

    讓我們嘗試從 LLM 產生一個測試回應:

    +
    import google.generativeai as genai
    +
    +genai.configure(api_key=os.environ["GEMINI_API_KEY"])
    +
    +gemini_model = genai.GenerativeModel("gemini-1.5-flash")
    +
    +response = gemini_model.generate_content("who are you")
    +print(response.text)
    +
    +
    I am a large language model, trained by Google.  I am an AI and don't have a personal identity or consciousness.  My purpose is to process information and respond to a wide range of prompts and questions in a helpful and informative way.
    +
    +

    產生測試的 embedding,並列印其尺寸和前幾個元素。

    +
    test_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=["This is a test1", "This is a test2"]
    +)["embedding"]
    +
    +embedding_dim = len(test_embeddings[0])
    +print(embedding_dim)
    +print(test_embeddings[0][:10])
    +
    +
    768
    +[0.013588584, -0.004361838, -0.08481652, -0.039724775, 0.04723794, -0.0051557426, 0.026071774, 0.045514572, -0.016867816, 0.039378334]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = genai.embed_content(
    +    model="models/text-embedding-004", content=text_lines
    +)["embedding"]
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 468201.38it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    question_embedding = genai.embed_content(
    +    model="models/text-embedding-004", content=question
    +)["embedding"]
    +
    +search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[question_embedding],
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.8048275113105774
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7574886679649353
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.7453608512878418
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 Gemini 根據提示產生回應。

    +
    gemini_model = genai.GenerativeModel(
    +    "gemini-1.5-flash", system_instruction=SYSTEM_PROMPT
    +)
    +response = gemini_model.generate_content(USER_PROMPT)
    +print(response.text)
    +
    +
    Milvus stores data in two ways:  Inserted data (vector data, scalar data, and collection-specific schema) is stored as an incremental log in persistent storage using object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.  Metadata, generated by each Milvus module, is stored in etcd.
    +
    +

    太好了!我們已成功地利用 Milvus 和 Gemini 建立 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.json new file mode 100644 index 000000000..e6b21ab15 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus[model] openai requests tqdm\n","import os\n\nos.environ[\"LEPTONAI_TOKEN\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nlepton_client = OpenAI(\n api_key=os.environ[\"LEPTONAI_TOKEN\"],\n base_url=\"https://mistral-7b.lepton.run/api/v1/\",\n)\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n","test_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=embedding_model.encode_queries(\n [question]\n ), # Convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = lepton_client.chat.completions.create(\n model=\"mistral-7b\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and Lepton AI","anchorList":[{"label":"使用 Milvus 和 Lepton AI 建立 RAG","href":"Build-RAG-with-Milvus-and-Lepton-AI","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.md new file mode 100644 index 000000000..55885069d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_lepton.md @@ -0,0 +1,241 @@ +--- +id: build_RAG_with_milvus_and_lepton.md +summary: 在本教程中,我們將教您如何使用 Milvus 和 Lepton AI 建立 RAG(Retrieval-Augmented Generation)管道。 +title: 使用 Milvus 和 Lepton AI 建立 RAG +--- +

    使用 Milvus 和 Lepton AI 建立 RAG

    +Open In Colab + + +GitHub Repository +

    +

    Lepton AI可讓開發人員和企業在幾分鐘內高效率地運行 AI 應用程式,並達到可供生產的規模。 Lepton AI 可讓您以 Python 原生方式建立模型、在本機除錯和測試模型、只需一個指令即可將模型部署到雲端,並透過簡單靈活的 API 在任何應用程式中使用模型。它提供了一個全面的環境來部署各種 AI 模型,包括大型語言模型 (LLM) 和擴散模型,而不需要大量的基礎架構設定。

    +

    在本教程中,我們將教您如何使用 Milvus 和 Lepton AI 建立 RAG (Retrieval-Augmented Generation) 輸送管道。

    +

    準備工作

    相依性與環境

    $ pip install --upgrade pymilvus[model] openai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    Lepton 啟用 OpenAI-style API。您可以登入其官方網站,並準備api key LEPTONAI_TOKEN 作為環境變數。

    +
    import os
    +
    +os.environ["LEPTONAI_TOKEN"] = "***********"
    +
    +

    準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備 LLM 與嵌入模型

    Lepton 啟用 OpenAI 風格的 API,您可以使用相同的 API,稍作調整後呼叫 LLM。

    +
    from openai import OpenAI
    +
    +lepton_client = OpenAI(
    +    api_key=os.environ["LEPTONAI_TOKEN"],
    +    base_url="https://mistral-7b.lepton.run/api/v1/",
    +)
    +
    +

    定義一個嵌入模型,使用milvus_model 來產生文字嵌入。我們以DefaultEmbeddingFunction 模型為例,這是一個預先訓練好的輕量級嵌入模型。

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +

    產生測試嵌入,並列印其維度和前幾個元素。

    +
    test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:00<00:00, 1090216.20it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=embedding_model.encode_queries(
    +        [question]
    +    ),  # Convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6572665572166443
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.6312146186828613
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6115777492523193
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 Lepton AI 提供的mistral-7b 模型,根據提示產生回應。

    +
    response = lepton_client.chat.completions.create(
    +    model="mistral-7b",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Inserted data in Milvus, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental logs. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and stored in etcd.
    +
    +

    太好了!我們成功地利用 Milvus 和 Lepton AI 建立了 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.json new file mode 100644 index 000000000..13ee6305e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus ollama\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","! ollama pull mxbai-embed-large\n","! ollama pull llama3.2\n","import ollama\n\n\ndef emb_text(text):\n response = ollama.embeddings(model=\"mxbai-embed-large\", prompt=text)\n return response[\"embedding\"]\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","from ollama import chat\nfrom ollama import ChatResponse\n\nresponse: ChatResponse = chat(\n model=\"llama3.2\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response[\"message\"][\"content\"])\n"],"headingContent":"Build RAG with Milvus and Ollama","anchorList":[{"label":"使用 Milvus 和 Ollama 建立 RAG","href":"Build-RAG-with-Milvus-and-Ollama","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.md new file mode 100644 index 000000000..43356b423 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_ollama.md @@ -0,0 +1,281 @@ +--- +id: build_RAG_with_milvus_and_ollama.md +summary: >- + 在本指南中,我們將教您如何利用 Ollama 和 Milvus 來有效且安全地建立 RAG(Retrieval-Augmented + Generation)管道。 +title: 使用 Milvus 和 Ollama 建立 RAG +--- +

    +Open In Colab + + +GitHub Repository +

    +

    使用 Milvus 和 Ollama 建立 RAG

    Ollama是一個開放原始碼平台,可簡化大型語言模型 (LLM) 的本機執行與客製化。它提供使用者友善的免雲端體驗,無需進階技術即可輕鬆進行模型下載、安裝與互動。透過不斷增加的預訓 LLM 資料庫 (從一般用途到特定領域),Ollama 可輕鬆管理和自訂各種應用程式的模型。它能確保資料隱私和彈性,讓使用者能夠完全在自己的機器上微調、最佳化和部署 AI 驅動的解決方案。

    +

    在本指南中,我們將告訴您如何利用 Ollama 和 Milvus 高效、安全地建立 RAG(Retrieval-Augmented Generation)管道。

    +

    準備工作

    相依性與環境

    $ pip install pymilvus ollama
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +
    --2024-11-26 21:47:19--  https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +Resolving github.com (github.com)... 140.82.112.4
    +Connecting to github.com (github.com)|140.82.112.4|:443... connected.
    +HTTP request sent, awaiting response... 302 Found
    +Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream [following]
    +--2024-11-26 21:47:20--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/267273319/c52902a0-e13c-4ca7-92e0-086751098a05?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20241127%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20241127T024720Z&X-Amz-Expires=300&X-Amz-Signature=7808b77cbdaa7e122196bcd75a73f29f2540333a350c4830bbdf5f286e876304&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Dmilvus_docs_2.4.x_en.zip&response-content-type=application%2Foctet-stream
    +Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ...
    +Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
    +HTTP request sent, awaiting response... 200 OK
    +Length: 613094 (599K) [application/octet-stream]
    +Saving to: ‘milvus_docs_2.4.x_en.zip’
    +
    +milvus_docs_2.4.x_e 100%[===================>] 598.72K  1.20MB/s    in 0.5s    
    +
    +2024-11-26 21:47:20 (1.20 MB/s) - ‘milvus_docs_2.4.x_en.zip’ saved [613094/613094]
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備 LLM 和嵌入模型

    Ollama 支援多種模型,可同時進行以 LLM 為基礎的任務和嵌入生成,讓您可以輕鬆開發檢索-增強生成 (RAG) 應用程式。對於這個設定:

    +
      +
    • 我們將使用Llama 3.2 (3B)作為文本生成任務的 LLM。
    • +
    • 對於嵌入生成,我們將使用mxbai-embed-large,這是一個 334M 參數的模型,已針對語意相似性進行最佳化。
    • +
    +

    在開始之前,請確保兩個模型都已拉到本機:

    +
    ! ollama pull mxbai-embed-large
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling 819c2adf5ce6... 100% ▕████████████████▏ 669 MB                         
    +pulling c71d239df917... 100% ▕████████████████▏  11 KB                         
    +pulling b837481ff855... 100% ▕████████████████▏   16 B                         
    +pulling 38badd946f91... 100% ▕████████████████▏  408 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +
    ! ollama pull llama3.2
    +
    +
    [?25lpulling manifest ⠋ [?25h[?25lpulling manifest ⠙ [?25h[?25lpulling manifest ⠹ [?25h[?25lpulling manifest ⠸ [?25h[?25lpulling manifest ⠼ [?25h[?25lpulling manifest ⠴ [?25h[?25lpulling manifest 
    +pulling dde5aa3fc5ff... 100% ▕████████████████▏ 2.0 GB                         
    +pulling 966de95ca8a6... 100% ▕████████████████▏ 1.4 KB                         
    +pulling fcc5a6bec9da... 100% ▕████████████████▏ 7.7 KB                         
    +pulling a70ff7e570d9... 100% ▕████████████████▏ 6.0 KB                         
    +pulling 56bb8bd477a5... 100% ▕████████████████▏   96 B                         
    +pulling 34bb5ab01051... 100% ▕████████████████▏  561 B                         
    +verifying sha256 digest 
    +writing manifest 
    +success [?25h
    +
    +

    準備好這些模型後,我們就可以開始實作 LLM 驅動的生成和基於嵌入的檢索工作流程。

    +
    import ollama
    +
    +
    +def emb_text(text):
    +    response = ollama.embeddings(model="mxbai-embed-large", prompt=text)
    +    return response["embedding"]
    +
    +

    產生測試嵌入,並列印其維度和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.23276396095752716, 0.4257211685180664, 0.19724100828170776, 0.46120673418045044, -0.46039995551109314, -0.1413791924715042, -0.18261606991291046, -0.07602324336767197, 0.39991313219070435, 0.8337644338607788]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在此檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:03<00:00, 22.56it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        231.9398193359375
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        226.48316955566406
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        210.60745239257812
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 Ollama 提供的llama3.2 模型,根據提示產生回應。

    +
    from ollama import chat
    +from ollama import ChatResponse
    +
    +response: ChatResponse = chat(
    +    model="llama3.2",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response["message"]["content"])
    +
    +
    According to the provided context, data in Milvus is stored in two types:
    +
    +1. **Inserted data**: Storing data in persistent storage as incremental log. It supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage.
    +
    +2. **Metadata**: Generated within Milvus and stored in etcd.
    +
    +

    太好了!我們已經用 Milvus 和 Ollama 成功地建立了一個 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.json b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.json new file mode 100644 index 000000000..fb9ce6a19 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"SILICON_FLOW_API_KEY\"] = \"***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nsiliconflow_client = OpenAI(\n api_key=os.environ[\"SILICON_FLOW_API_KEY\"], base_url=\"https://api.siliconflow.cn/v1\"\n)\n","def emb_text(text):\n return (\n siliconflow_client.embeddings.create(input=text, model=\"BAAI/bge-large-en-v1.5\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = siliconflow_client.chat.completions.create(\n model=\"deepseek-ai/DeepSeek-V2.5\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus and SiliconFlow","anchorList":[{"label":"使用 Milvus 和 SiliconFlow 建立 RAG","href":"Build-RAG-with-Milvus-and-SiliconFlow","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.md b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.md new file mode 100644 index 000000000..749ea724e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_RAG_with_milvus_and_siliconflow.md @@ -0,0 +1,244 @@ +--- +id: build_RAG_with_milvus_and_siliconflow.md +summary: >- + 在本教程中,我們將教您如何使用 Milvus 和 SiliconFlow 建立 RAG(Retrieval-Augmented Generation) + 管線。 +title: 使用 Milvus 和 SiliconFlow 建立 RAG +--- +

    使用 Milvus 和 SiliconFlow 建立 RAG

    +Open In Colab + + +GitHub Repository +

    +

    SiliconFlow致力於建立一個可擴充、標準化且高效能的 AI Infra 平台。 SiliconCloud 是 SiliconFlow 的旗艦產品之一,被描述為模型即服務 (MaaS) 平台。它為部署各種 AI 模型(包括大型語言模型 (LLM) 和嵌入模型)提供了全面的環境。SiliconCloud 匯聚了無數的開放原始碼模型,讓使用者可以輕鬆存取並利用這些資源,而不需要大量的基礎架構設定。

    +

    在本教程中,我們將教您如何使用 Milvus 和 SiliconFlow 建立一個 RAG(Retrieval-Augmented Generation) 管道。

    +

    準備工作

    相依性與環境

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    SiliconFlow 啟用 OpenAI-style API。您可以登入其官方網站,並準備api key SILICON_FLOW_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["SILICON_FLOW_API_KEY"] = "***********"
    +
    +

    準備資料

    我們使用Milvus Documentation 2.4.x中的 FAQ 頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,這樣就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備嵌入模型

    我們初始化一個用戶端來準備嵌入模型。SiliconFlow 啟用 OpenAI 風格的 API,您可以使用相同的 API,只要稍作調整,就可以呼叫嵌入模型和 LLM。

    +
    from openai import OpenAI
    +
    +siliconflow_client = OpenAI(
    +    api_key=os.environ["SILICON_FLOW_API_KEY"], base_url="https://api.siliconflow.cn/v1"
    +)
    +
    +

    定義使用客戶端產生文字嵌入的函式。我們以BAAI/bge-large-en-v1.5 模型為例。

    +
    def emb_text(text):
    +    return (
    +        siliconflow_client.embeddings.create(input=text, model="BAAI/bge-large-en-v1.5")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生一個測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1024
    +[0.011475468054413795, 0.02982141077518463, 0.0038535362109541893, 0.035921916365623474, -0.0159175843000412, -0.014918108470737934, -0.018094222992658615, -0.002937349723652005, 0.030917132273316383, 0.03390815854072571]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:04<00:00, 16.97it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.833885133266449
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.812842607498169
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.7714196443557739
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 SiliconCloud 提供的deepseek-ai/DeepSeek-V2.5 模型,根據提示產生回應。

    +
    response = siliconflow_client.chat.completions.create(
    +    model="deepseek-ai/DeepSeek-V2.5",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    In Milvus, data is stored in two main categories: inserted data and metadata.
    +
    +- **Inserted Data**: This includes vector data, scalar data, and collection-specific schema, which are stored in persistent storage as incremental logs. Milvus supports various object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS).
    +
    +- **Metadata**: This is generated within Milvus, with each module having its own metadata stored in etcd, a distributed key-value store.
    +
    +

    太好了!我們已經用 Milvus 和 SiliconFlow 成功地建立了一個 RAG 管道。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.json b/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.json new file mode 100644 index 000000000..9008a04bd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.json @@ -0,0 +1 @@ +{"codeList":["$ sudo apt update\n$ sudo apt install python-is-python3 python3-pip python3-venv -y\n","$ python -m venv venv\n$ source venv/bin/activate\n","$ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(\n uri=\"\", token=\"\"\n)\n\ncollection_name = \"my_rag_collection\"\n\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=384,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from langchain_huggingface import HuggingFaceEmbeddings\n\nembedding_model = HuggingFaceEmbeddings(model_name=\"all-MiniLM-L6-v2\")\n","from tqdm import tqdm\n\ndata = []\n\ntext_embeddings = embedding_model.embed_documents(text_lines)\n\nfor i, (line, embedding) in enumerate(\n tqdm(zip(text_lines, text_embeddings), desc=\"Creating embeddings\")\n):\n data.append({\"id\": i, \"vector\": embedding, \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","$ sudo apt install make cmake -y\n$ sudo apt install gcc g++ -y\n$ sudo apt install build-essential -y\n","$ git clone https://github.com/ggerganov/llama.cpp\n","$ cd llama.cpp\n$ make GGML_NO_LLAMAFILE=1 -j$(nproc)\n","$ ./llama-cli -h\n","$ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False\n","$ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8\n","$ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536 --port 8080\n","from openai import OpenAI\n\nllm_client = OpenAI(base_url=\"http://localhost:8080/v1\", api_key=\"no-key\")\n","test_embedding = embedding_model.embed_query(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n embedding_model.embed_query(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","response = llm_client.chat.completions.create(\n model=\"not-used\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n\n"],"headingContent":"Build RAG on Arm Architecture","anchorList":[{"label":"在 Arm 架構上建立 RAG","href":"Build-RAG-on-Arm-Architecture","type":1,"isActive":false},{"label":"前提條件","href":"Prerequisite","type":2,"isActive":false},{"label":"離線資料載入","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"在 Arm 上啟動 LLM 服務","href":"Launch-LLM-Service-on-Arm","type":2,"isActive":false},{"label":"線上 RAG","href":"Online-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.md b/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.md new file mode 100644 index 000000000..f5f182378 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/build_rag_on_arm.md @@ -0,0 +1,299 @@ +--- +id: build_rag_on_arm.md +summary: >- + 在本教程中,您將學習如何在以 Arm 為基礎的基礎架構上建立一個 Retrieval-Augmented Generation (RAG) + 應用程式。在向量儲存方面,我們利用 Zilliz Cloud 這個完全由 Milvus 管理的向量資料庫。Zilliz Cloud 可在 AWS、GCP 和 + Azure 等主要雲端上使用。在這個示範中,我們使用 Zilliz Cloud 部署在 AWS 上的 Arm 機器。對於 LLM,我們在 AWS Arm + 架構的伺服器 CPU 上使用 Llama-3.1-8B 模型,並使用 llama.cpp。 +title: 在 Arm 架構上建立 RAG +--- +

    在 Arm 架構上建立 RAG

    ArmCPU 廣泛應用於各式各樣的應用程式,包括傳統的機器學習 (ML) 和人工智能 (AI) 用例。

    +

    在本教程中,您將學習如何在 Arm 架構的基礎架構上建立檢索增強世代 (RAG) 應用程式。在向量儲存方面,我們利用Zilliz Cloud 這個完全由 Milvus 管理的向量資料庫。Zilliz Cloud 可在 AWS、GCP 和 Azure 等主要雲端上使用。在這個示範中,我們使用 Zilliz Cloud 部署在 AWS 上的 Arm 機器。對於 LLM,我們使用llama.cpp 在 AWS Arm 架構的伺服器 CPU 上建立Llama-3.1-8B 模型。

    +

    前提條件

    若要執行本範例,我們建議您使用AWS Graviton,它提供了在基於 Arm 的伺服器上執行 ML 工作負載的高成本效益方式。本筆記本已在使用 Ubuntu 22.04 LTS 系統的 AWS Graviton3c7g.2xlarge 實例上進行測試。

    +

    您至少需要四個核心和 8GB 記憶體才能執行本範例。配置磁碟儲存至少達 32 GB。我們建議您使用相同或更好規格的實例。

    +

    啟動實例後,連線到該實例,並執行下列指令準備環境。

    +

    在伺服器上安裝 python:

    +
    $ sudo apt update
    +$ sudo apt install python-is-python3 python3-pip python3-venv -y
    +
    +

    建立並啟動虛擬環境:

    +
    $ python -m venv venv
    +$ source venv/bin/activate
    +
    +

    安裝所需的 python 相依性:

    +
    $ pip install --upgrade pymilvus openai requests langchain-huggingface huggingface_hub tqdm
    +
    +

    離線資料載入

    建立資料集

    我們使用部署在 AWS 上的Zilliz Cloud與 Arm 型機器來儲存與擷取向量資料。若要快速上手,只需在 Zilliz Cloud 免費註冊一個帳號

    +
    +

    除了 Zilliz Cloud 之外,自我託管的 Milvus 也是一個選擇(設定較複雜)。我們也可以在以 ARM 為基礎的機器上部署Milvus StandaloneKubernetes。有關 Milvus 安裝的詳細資訊,請參閱安裝說明文件

    +
    +

    我們在 Zilliz Cloud 設定uritokenPublic Endpoint 和 Api key

    +
    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(
    +    uri="<your_zilliz_public_endpoint>", token="<your_zilliz_api_key>"
    +)
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    檢查資料集是否已存在,若已存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位作為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=384,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    我們使用內乘距離作為預設的度量類型。如需更多關於距離類型的資訊,您可以參考相似度量頁面

    +

    準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道來說,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,這樣就可以大致分隔出 markdown 文件中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    插入資料

    我們準備了一個簡單但有效率的嵌入模型all-MiniLM-L6-v2,可以將文字轉換成嵌入向量。

    +
    from langchain_huggingface import HuggingFaceEmbeddings
    +
    +embedding_model = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
    +
    +

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +text_embeddings = embedding_model.embed_documents(text_lines)
    +
    +for i, (line, embedding) in enumerate(
    +    tqdm(zip(text_lines, text_embeddings), desc="Creating embeddings")
    +):
    +    data.append({"id": i, "vector": embedding, "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 72/72 [00:18<00:00,  3.91it/s]
    +
    +

    在 Arm 上啟動 LLM 服務

    在本節中,我們將在 Arm-based CPU 上建立並啟動llama.cpp 服務。

    +

    Llama 3.1 模型與 llama.cpp

    Meta 的Llama-3.1-8B 模型屬於 Llama 3.1 模型系列,可免費用於研究與商業用途。在使用該模型之前,請造訪 Llama網站並填寫表格以申請存取權限。

    +

    llama.cpp是一個開放原始碼的 C/C++ 專案,可在各種硬體上實現高效率的 LLM 推論 - 包括本機和雲端。您可以使用llama.cpp 方便地託管 Llama 3.1 模型。

    +

    下載並建立 llama.cpp

    執行下列指令以安裝 make、cmake、gcc、g++ 及其他從原始碼建立 llama.cpp 所需的基本工具:

    +
    $ sudo apt install make cmake -y
    +$ sudo apt install gcc g++ -y
    +$ sudo apt install build-essential -y
    +
    +

    現在您可以開始建立llama.cpp

    +

    克隆 llama.cpp 的原始碼套件庫:

    +
    $ git clone https://github.com/ggerganov/llama.cpp
    +
    +

    預設情況下,llama.cpp 只會在 Linux 和 Windows 上為 CPU 建立。您不需要提供任何額外的開關,就可以針對您所執行的 Arm CPU 建立它。

    +

    執行make 以建立它:

    +
    $ cd llama.cpp
    +$ make GGML_NO_LLAMAFILE=1 -j$(nproc)
    +
    +

    執行 help 指令檢查llama.cpp 是否已正確建立:

    +
    $ ./llama-cli -h
    +
    +

    如果llama.cpp 已正確建立,您會看到幫助選項顯示。輸出片段看起來像這樣:

    +
    example usage:
    +
    +    text generation:     ./llama-cli -m your_model.gguf -p "I believe the meaning of life is" -n 128
    +
    +    chat (conversation): ./llama-cli -m your_model.gguf -p "You are a helpful assistant" -cnv
    +
    +

    現在您可以使用 huggingface cli 下載模型:

    +
    $ huggingface-cli download cognitivecomputations/dolphin-2.9.4-llama3.1-8b-gguf dolphin-2.9.4-llama3.1-8b-Q4_0.gguf --local-dir . --local-dir-use-symlinks False
    +
    +

    由 llama.cpp 團隊推出的 GGUF 模型格式,使用壓縮和量化將權值精確度降低為 4 位元整數,大幅降低計算和記憶體需求,使 Arm CPU 有效運用於 LLM 推論。

    +

    重新量化模型權值

    要重新量化,請執行

    +
    $ ./llama-quantize --allow-requantize dolphin-2.9.4-llama3.1-8b-Q4_0.gguf dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf Q4_0_8_8
    +
    +

    這將會輸出一個新檔案dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf ,其中包含重新配置的權值,讓llama-cli 可以使用 SVE 256 和 MATMUL_INT8 支援。

    +
    +

    此重新量化特別針對 Graviton3 而言是最佳的。對於 Graviton2,最佳的重新量化應以Q4_0_4_4 格式執行,而對於 Graviton4,Q4_0_4_8 格式最適合重新量化。

    +
    +

    啟動 LLM 服務

    您可以利用 llama.cpp 伺服器程式,並透過 OpenAI 相容的 API 傳送請求。這可讓您開發與 LLM 多次互動的應用程式,而無須重複啟動和停止 LLM。此外,您也可以從另一台透過網路託管 LLM 的機器存取伺服器。

    +

    從命令列啟動伺服器,它會在 8080 連接埠監聽:

    +
    $ ./llama-server -m dolphin-2.9.4-llama3.1-8b-Q4_0_8_8.gguf -n 2048 -t 64 -c 65536  --port 8080
    +
    +
    'main: server is listening on 127.0.0.1:8080 - starting the main loop
    +
    +

    您也可以調整已啟動 LLM 的參數,使其適應您的伺服器硬體,以獲得理想的效能。如需更多參數資訊,請參閱llama-server --help 指令。

    +

    如果您在執行此步驟時感到吃力,可以參考官方文件以獲得更多資訊。

    +

    您已經在 Arm-based CPU 上啟動了 LLM 服務。接下來,我們直接使用 OpenAI SDK 與服務互動。

    +

    線上 RAG

    LLM 用戶端與嵌入模型

    我們初始化 LLM 用戶端並準備嵌入模型。

    +

    對於 LLM,我們使用 OpenAI SDK 來請求之前啟動的 Llama 服務。我們不需要使用任何 API 金鑰,因為它實際上是我們本機的 llama.cpp 服務。

    +
    from openai import OpenAI
    +
    +llm_client = OpenAI(base_url="http://localhost:8080/v1", api_key="no-key")
    +
    +

    產生一個測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = embedding_model.embed_query("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    384
    +[0.03061249852180481, 0.013831384479999542, -0.02084377221763134, 0.016327863559126854, -0.010231520049273968, -0.0479842908680439, -0.017313342541456223, 0.03728749603033066, 0.04588735103607178, 0.034405000507831573]
    +
    +

    擷取查詢資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在集合中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        embedding_model.embed_query(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.6488019824028015
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5974207520484924
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5833579301834106
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +
    Define system and user prompts for the Language Model. This prompt is assembled with the retrieved documents from Milvus.
    +
    +SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 LLM 根據提示產生回應。我們將model 參數設定為not-used ,因為它是 llama.cpp 服務的多餘參數。

    +
    response = llm_client.chat.completions.create(
    +    model="not-used",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    +
    Milvus stores data in two types: inserted data and metadata. Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends such as MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage (COS). Metadata are generated within Milvus and each Milvus module has its own metadata that are stored in etcd.
    +
    +

    恭喜您!您已經在以 Arm 為基礎的基礎架構之上建立了一個 RAG 應用程式。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.json new file mode 100644 index 000000000..731a0a148 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/langgenius/dify.git\n","cd dify/docker\n","cp .env.example .env\n","VECTOR_STORE=milvus\n","MILVUS_URI=xxx\nMILVUS_TOKEN=xxx\n","docker compose up -d\n","docker compose up -d\n"],"headingContent":"Deploying Dify with Milvus","anchorList":[{"label":"使用 Milvus 部署 Dify","href":"Deploying-Dify-with-Milvus","type":1,"isActive":false},{"label":"克隆儲存庫","href":"Clone-the-Repository","type":2,"isActive":false},{"label":"設定環境變數","href":"Set-the-Environment-Variables","type":2,"isActive":false},{"label":"啟動 Docker Containers","href":"Start-the-Docker-Containers","type":2,"isActive":false},{"label":"登入 Dify","href":"Log-in-to-Dify","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.md new file mode 100644 index 000000000..aeae491ea --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/dify_with_milvus.md @@ -0,0 +1,109 @@ +--- +id: dify_with_milvus.md +summary: 在本教程中,我們將教您如何使用 Milvus 部署 Dify,以實現高效的檢索和 RAG 引擎。 +title: 使用 Milvus 部署 Dify +--- +

    使用 Milvus 部署 Dify

    Dify是一個開放原始碼平台,旨在透過結合 Backend-as-a-Service 與 LLMOps 來簡化 AI 應用程式的建置。它支援主流的 LLM,提供直覺的提示協調介面、高品質的 RAG 引擎以及彈性的 AI 代理框架。Dify 具備低程式碼工作流程、易於使用的介面和 API,讓開發人員和非技術使用者都能專注於建立創新、真實世界的 AI 解決方案,而無需處理複雜的問題。

    +

    在本教程中,我們將教您如何使用 Milvus 部署 Dify,以實現高效的檢索和 RAG 引擎。

    +

    克隆儲存庫

    克隆 Dify 原始碼到您的本機:

    +
    git clone https://github.com/langgenius/dify.git
    +
    +

    設定環境變數

    導覽到 Dify 原始碼中的 Docker 目錄

    +
    cd dify/docker
    +
    +

    複製環境配置檔案

    +
    cp .env.example .env
    +
    +

    更改.env 檔案中的VECTOR_STORE

    +
    VECTOR_STORE=milvus
    +
    +

    變更.env 檔案中的 Milvus 配置

    +
    MILVUS_URI=xxx
    +MILVUS_TOKEN=xxx
    +
    +

    在此設定中,請使用伺服器的外部 URI,例如http://172.16.16.16:19530 ,作為您的MILVUS_URI

    +

    對於MILVUS_TOKEN ,如果您沒有為您的 Milvus 伺服器設定一個 token,您可以將它設定為一個空字串,例如MILVUS_TOKEN= ,否則,您需要將它設定為您的 Milvus token。更多關於如何在 Milvus 設定 token 的資訊,您可以參考authenticate 頁面

    +

    啟動 Docker Containers

    根據您系統上的 Docker Compose 版本,選擇適當的指令來啟動容器。您可以使用$ docker compose version 指令檢查版本,更多資訊請參考 Docker 文件:

    +

    如果您有 Docker Compose V2,請使用下列指令:

    +
    docker compose up -d
    +
    +

    如果您有 Docker Compose V1,請使用下列指令:

    +
    docker compose up -d
    +
    +

    登入 Dify

    開啟瀏覽器並進入 Dify 安裝頁面,您可以在這裡設定您的管理帳號:http://localhost/install ,然後登入 Dify 主頁面進一步使用。

    +

    進一步的使用方法及指導,請參考Dify 說明文件

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.json b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.json new file mode 100644 index 000000000..87ff838fd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas deepeval\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from deepeval.metrics import (\n ContextualPrecisionMetric,\n ContextualRecallMetric,\n ContextualRelevancyMetric,\n)\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\ncontextual_precision = ContextualPrecisionMetric()\ncontextual_recall = ContextualRecallMetric()\ncontextual_relevancy = ContextualRelevancyMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[contextual_precision, contextual_recall, contextual_relevancy],\n print_results=False, # Change to True to see detailed metric results\n)\n","from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric\nfrom deepeval.test_case import LLMTestCase\nfrom deepeval import evaluate\n\nanswer_relevancy = AnswerRelevancyMetric()\nfaithfulness = FaithfulnessMetric()\n\ntest_cases = []\n\nfor index, row in df.iterrows():\n test_case = LLMTestCase(\n input=row[\"question\"],\n actual_output=row[\"answer\"],\n expected_output=row[\"ground_truth\"],\n retrieval_context=row[\"contexts\"],\n )\n test_cases.append(test_case)\n\n# test_cases\nresult = evaluate(\n test_cases=test_cases,\n metrics=[answer_relevancy, faithfulness],\n print_results=False, # Change to True to see detailed metric results\n)\n"],"headingContent":"Evaluation with DeepEval","anchorList":[{"label":"使用 DeepEval 進行評估","href":"Evaluation-with-DeepEval","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"定義 RAG 管道","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"執行 RAG 管道並獲得結果","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"評估 Retriever","href":"Evaluating-Retriever","type":2,"isActive":false},{"label":"評估生成","href":"Evaluating-Generation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.md b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.md new file mode 100644 index 000000000..cf8c1221f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_deepeval.md @@ -0,0 +1,432 @@ +--- +id: evaluation_with_deepeval.md +summary: 本指南說明如何使用 DeepEval 評估以 Milvus 為基礎的 Retrieval-Augmented Generation (RAG) 管道。 +title: 使用 DeepEval 進行評估 +--- +

    使用 DeepEval 進行評估

    Open In Colab +GitHub Repository

    +

    本指南演示了如何使用DeepEval來評估建立在Milvus 上的檢索-增強生成 (RAG) 管道。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示生成新文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    DeepEval 是一個可協助您評估 RAG 管道的框架。現有的工具和框架可以幫助您建立這些管道,但是評估它和量化您的管道效能可能很困難。這就是 DeepEval 的用武之地。

    +

    先決條件

    在執行本筆記本之前,請確定您已安裝下列依賴項目:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas deepeval
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時(點擊螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    定義 RAG 管道

    我們將定義以 Milvus 作為向量儲存、OpenAI 作為 LLM 的 RAG 類。該類包含load 方法 (將文字資料載入 Milvus)、retrieve 方法 (擷取與給定問題最相似的文字資料),以及answer 方法 (使用擷取的知識回答給定問題)。

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    讓我們用 OpenAI 和 Milvus 客戶端初始化 RAG 類別。

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    執行 RAG 管道並獲得結果

    我們使用Milvus 開發指南作為 RAG 中的私有知識,這是簡單 RAG 管道的良好資料來源。

    +

    下載並載入 RAG 管道。

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:20<00:00,  2.26it/s]
    +
    +

    讓我們定義一個關於開發指南文件內容的查詢問題。然後使用answer 方法取得答案和擷取的上下文文字。

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is as follows:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    現在讓我們準備一些問題與其相對應的地面真實答案。我們從 RAG 管道取得答案和上下文。

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.06s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    問題上下文答案地面真相
    0什麼是硬體需求規格?[Hardware Requirements/硬體需求規格] 以下為硬體需求規格...硬體需求規格是什麼?如果您想建立 Milvus 並從來源執行...
    1用什麼編程語言來寫...[CMake & Conan\n\nMilvus 的演算法函式庫...編寫 Knowherus 的程式語言是...用來編寫 Knowher...
    2在運行代碼覆蓋之前應確保哪些...[Code coverage\n/nBefore submitting your pull ...在執行程式碼覆蓋之前,應該確保...在執行程式碼覆蓋之前,您應該確保 ...
    +
    +

    評估 Retriever

    在評估大型語言模型 (LLM) 系統中的 Retriever 時,評估以下幾點至關重要:

    +
      +
    1. 排序相關性:retriever如何有效地將相關資訊優先於不相關的資料。

    2. +
    3. 上下文擷取:根據輸入擷取與擷取上下文相關資訊的能力。

    4. +
    5. 平衡性:擷取工具如何有效管理文字區塊大小與擷取範圍,以減少不相關性。

    6. +
    +

    這些因素合在一起,提供了對檢索器如何排定優先順序、擷取和呈現最有用資訊的全面瞭解。

    +
    from deepeval.metrics import (
    +    ContextualPrecisionMetric,
    +    ContextualRecallMetric,
    +    ContextualRelevancyMetric,
    +)
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +contextual_precision = ContextualPrecisionMetric()
    +contextual_recall = ContextualRecallMetric()
    +contextual_relevancy = ContextualRelevancyMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[contextual_precision, contextual_recall, contextual_relevancy],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/deepeval/__init__.py:49: UserWarning: You are using deepeval version 1.1.6, however version 1.2.2 is available. You should consider upgrading via the "pip install --upgrade deepeval" command.
    +  warnings.warn(
    +
    +
    您正在執行 DeepEval 最新的Contextual Precision Metric(使用 gpt-4o、 strict=Falseasync_mode=True...
    +
    ✨ 您正在運行 DeepEval 最新的Contextual Recall Metric(使用 gpt-4o, strict=Falseasync_mode=True...
    +
    ✨ 您正在執行 DeepEval 最新的Contextual Relevancy Metric(using gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.91s/test case]
    +
    +
    測試完成 🎉!執行「deepeval login」以檢視 Confident AI 的評估結果。 
    +‼️ 注意:您也可以直接在 Confident AI 上對 deepeval 的所有指標執行評估。
    +

    評估生成

    要評估大型語言模型 (LLM) 中生成輸出的品質,必須著重於兩個關鍵方面:

    +
      +
    1. 相關性:評估提示是否有效地引導 LLM 產生有用且符合上下文的回應。

    2. +
    3. 忠實性:測量輸出的準確性,確保模型產生的資訊與事實相符,沒有幻覺或矛盾。產生的內容應與檢索上下文中提供的事實資訊一致。

    4. +
    +

    這些因素共同確保輸出內容既相關又可靠。

    +
    from deepeval.metrics import AnswerRelevancyMetric, FaithfulnessMetric
    +from deepeval.test_case import LLMTestCase
    +from deepeval import evaluate
    +
    +answer_relevancy = AnswerRelevancyMetric()
    +faithfulness = FaithfulnessMetric()
    +
    +test_cases = []
    +
    +for index, row in df.iterrows():
    +    test_case = LLMTestCase(
    +        input=row["question"],
    +        actual_output=row["answer"],
    +        expected_output=row["ground_truth"],
    +        retrieval_context=row["contexts"],
    +    )
    +    test_cases.append(test_case)
    +
    +# test_cases
    +result = evaluate(
    +    test_cases=test_cases,
    +    metrics=[answer_relevancy, faithfulness],
    +    print_results=False,  # Change to True to see detailed metric results
    +)
    +
    +
    ✨ 您正在運行 DeepEval 最新的答案相關度指標(使用 gpt-4o, strict=Falseasync_mode=True...
    +
    ✨ 您正在執行 DeepEval 最新的忠誠度公制(using gpt-4o, strict=False, async_mode=True)...
    +
    Event loop is already running. Applying nest_asyncio patch to allow async execution...
    +
    +
    +Evaluating 3 test case(s) in parallel: |██████████|100% (3/3) [Time Taken: 00:11,  3.97s/test case]
    +
    +
    測試完成 🎉!執行「deepeval login」以檢視 Confident AI 的評估結果。 
    +‼️ 注意:您也可以直接在 Confident AI 上對 deepeval 的所有指標執行評估。
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.json b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.json new file mode 100644 index 000000000..c550e4192 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas \"arize-phoenix>=4.29.0\" nest_asyncio\n","import os\n\n# os.environ[\"OPENAI_API_KEY\"] = \"sk-*****************\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-4o-mini\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\n Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n \"\"\"\n self.USER_PROMPT = \"\"\"\n Use the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n \n {context}\n \n \n {question}\n \n \"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"demo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\",\n consistency_level=\"Strong\",\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import urllib.request\nimport os\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines)\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","import phoenix as px\nfrom phoenix.trace.openai import OpenAIInstrumentor\n\n# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:\nsession = px.launch_app()\n\n# Initialize OpenAI auto-instrumentation\nOpenAIInstrumentor().instrument()\n","import nest_asyncio\n\nfrom phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals\n\nnest_asyncio.apply() # This is needed for concurrency in notebook environments\n\n# Set your OpenAI API key\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Define your evaluators\nhallucination_evaluator = HallucinationEvaluator(eval_model)\nqa_evaluator = QAEvaluator(eval_model)\n\n# We have to make some minor changes to our dataframe to use the column names expected by our evaluators\n# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'\n# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'\ndf[\"context\"] = df[\"contexts\"]\ndf[\"reference\"] = df[\"contexts\"]\ndf.rename(columns={\"question\": \"input\", \"answer\": \"output\"}, inplace=True)\nassert all(\n column in df.columns for column in [\"output\", \"input\", \"context\", \"reference\"]\n)\n\n# Run the evaluators, each evaluator will return a dataframe with evaluation results\n# We upload the evaluation results to Phoenix in the next step\nhallucination_eval_df, qa_eval_df = run_evals(\n dataframe=df,\n evaluators=[hallucination_evaluator, qa_evaluator],\n provide_explanation=True,\n)\n","results_df = df.copy()\nresults_df[\"hallucination_eval\"] = hallucination_eval_df[\"label\"]\nresults_df[\"hallucination_explanation\"] = hallucination_eval_df[\"explanation\"]\nresults_df[\"qa_eval\"] = qa_eval_df[\"label\"]\nresults_df[\"qa_explanation\"] = qa_eval_df[\"explanation\"]\nresults_df.head()\n"],"headingContent":"Evaluation with Arize Pheonix","anchorList":[{"label":"使用 Arize Pheonix 進行評估","href":"Evaluation-with-Arize-Pheonix","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"定義 RAG 管道","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"執行 RAG 管道並獲得結果","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"使用 Arize Phoenix 進行評估","href":"Evaluation-with-Arize-Phoenix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.md b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.md new file mode 100644 index 000000000..cf42ce0a4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/evaluation_with_phoenix.md @@ -0,0 +1,472 @@ +--- +id: evaluation_with_phoenix.md +summary: 本指南演示了如何使用 Arize Pheonix 評估建立在 Milvus 上的檢索增強世代 (RAG) 管道。 +title: 使用 Arize Pheonix 進行評估 +--- +

    使用 Arize Pheonix 進行評估

    Open In Colab +GitHub Repository

    +

    本指南演示了如何使用Arize Pheonix來評估建立在Milvus 上的檢索-增強生成 (RAG) 管道。

    +

    RAG 系統結合了一個檢索系統和一個生成模型,根據給定的提示生成新的文本。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    Arize Pheonix 是一個可以幫助您評估 RAG 管道的框架。現有的工具和框架可以幫助您建立這些管道,但是評估它和量化您的管道性能可能會很難。這就是 Arize Pheonix 的用武之地。

    +

    先決條件

    在執行本筆記本之前,請確認您已安裝下列依賴項目:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas "arize-phoenix>=4.29.0" nest_asyncio
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時(點選畫面頂端的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +# os.environ["OPENAI_API_KEY"] = "sk-*****************"
    +
    +

    定義 RAG 管道

    我們將定義以 Milvus 作為向量儲存、OpenAI 作為 LLM 的 RAG 類。該類包含load 方法 (將文字資料載入 Milvus)、retrieve 方法 (擷取與給定問題最相似的文字資料),以及answer 方法 (使用擷取的知識回答給定問題)。

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG(Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-4o-mini",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +            Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +        """
    +        self.USER_PROMPT = """
    +            Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +            <context>
    +            {context}
    +            </context>
    +            <question>
    +            {question}
    +            </question>
    +        """
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("demo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",
    +            consistency_level="Strong",
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    讓我們用 OpenAI 和 Milvus 客戶端初始化 RAG 類別。

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    執行 RAG 管道並獲得結果

    我們使用Milvus 開發指南作為 RAG 中的私有知識,這是簡單 RAG 管道的良好資料來源。

    +

    下載並載入 RAG 管道。

    +
    import urllib.request
    +import os
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)
    +
    +
    Creating embeddings: 100%|██████████| 47/47 [00:12<00:00,  3.84it/s]
    +
    +

    讓我們定義一個關於開發指南文件內容的查詢問題。然後使用answer 方法取得答案和擷取的上下文文字。

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code are:\n\n- 8GB of RAM\n- 50GB of free disk space',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    現在讓我們準備一些問題與其相對應的地面真實答案。我們從 RAG 管道取得答案和上下文。

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    /Users/eureka/miniconda3/envs/zilliz/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
    +  from .autonotebook import tqdm as notebook_tqdm
    +Answering questions: 100%|██████████| 3/3 [00:03<00:00,  1.04s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    問題上下文答案地面真相
    0什麼是硬體需求規格?[Hardware Requirements/硬體需求規格] 以下為硬體需求規格...硬體需求規格是什麼?如果您想建立 Milvus 並從來源執行...
    1用什麼編程語言來寫...[CMake & Conan\n\nMilvus 的演算法函式庫...編寫 Knowherus 的程式語言是...用來編寫 Knowher...
    2在運行代碼覆蓋之前應確保哪些...[Code coverage\n/nBefore submitting your pull ...在執行程式碼覆蓋之前,應該確保...在運行程式碼覆蓋之前,您應該確保 ...
    +
    +

    使用 Arize Phoenix 進行評估

    我們使用 Arize Phoenix 來評估我們的 retrieval-augmented generation (RAG) pipeline,著重於兩個關鍵指標:

    +
      +
    • 幻覺評估:判斷內容是事實還是幻覺(沒有上下文基礎的資訊),確保資料的完整性。

      +
        +
      • 幻覺解釋:解釋回覆是否符合事實的原因。
      • +
    • +
    • QA 評估:評估輸入查詢的模型答案的準確性。

      +
        +
      • QA 說明:詳細說明答案正確或不正確的原因。
      • +
    • +
    +

    Phoenix 追蹤概述

    Phoenix 為 LLM 應用程式提供OTEL 相容的追蹤功能,並與LangchainLlamaIndex 等框架以及OpenAIMistral 等 SDK 整合。追蹤功能可捕捉整個請求流,提供以下洞察力:

    +
      +
    • 應用程式延遲:識別並優化緩慢的 LLM 調用和元件效能。
    • +
    • 令牌使用情況:分解令牌消耗,以優化成本。
    • +
    • 運行時異常:捕捉速率限制等關鍵問題。
    • +
    • 檢索文件:分析文件擷取、分數和順序。
    • +
    +

    利用 Phoenix 的追蹤功能,您可以識別瓶頸問題最佳化資源並確保跨越各種框架和語言的系統可靠性

    +
    import phoenix as px
    +from phoenix.trace.openai import OpenAIInstrumentor
    +
    +# To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:
    +session = px.launch_app()
    +
    +# Initialize OpenAI auto-instrumentation
    +OpenAIInstrumentor().instrument()
    +
    +
    🌍 To view the Phoenix app in your browser, visit http://localhost:6006/
    +📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix
    +
    +

    + + Alt Text + 標示文字

    +
    import nest_asyncio
    +
    +from phoenix.evals import HallucinationEvaluator, OpenAIModel, QAEvaluator, run_evals
    +
    +nest_asyncio.apply()  # This is needed for concurrency in notebook environments
    +
    +# Set your OpenAI API key
    +eval_model = OpenAIModel(model="gpt-4o")
    +
    +# Define your evaluators
    +hallucination_evaluator = HallucinationEvaluator(eval_model)
    +qa_evaluator = QAEvaluator(eval_model)
    +
    +# We have to make some minor changes to our dataframe to use the column names expected by our evaluators
    +# for `hallucination_evaluator` the input df needs to have columns 'output', 'input', 'context'
    +# for `qa_evaluator` the input df needs to have columns 'output', 'input', 'reference'
    +df["context"] = df["contexts"]
    +df["reference"] = df["contexts"]
    +df.rename(columns={"question": "input", "answer": "output"}, inplace=True)
    +assert all(
    +    column in df.columns for column in ["output", "input", "context", "reference"]
    +)
    +
    +# Run the evaluators, each evaluator will return a dataframe with evaluation results
    +# We upload the evaluation results to Phoenix in the next step
    +hallucination_eval_df, qa_eval_df = run_evals(
    +    dataframe=df,
    +    evaluators=[hallucination_evaluator, qa_evaluator],
    +    provide_explanation=True,
    +)
    +
    +
    run_evals |██████████| 6/6 (100.0%) | ⏳ 00:03<00:00 |  1.64it/s
    +
    +
    results_df = df.copy()
    +results_df["hallucination_eval"] = hallucination_eval_df["label"]
    +results_df["hallucination_explanation"] = hallucination_eval_df["explanation"]
    +results_df["qa_eval"] = qa_eval_df["label"]
    +results_df["qa_explanation"] = qa_eval_df["explanation"]
    +results_df.head()
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    輸入上下文輸出地面真值上下文參考幻覺評估幻覺解釋qa_evalqa_explanation
    0什麼是硬體需求規格?[Hardware Requirements/硬體需求規格] 以下為硬體需求規格...硬體需求規格(Hardware Requirements Specification)...如果您想建立 Milvus 並從來源執行,您需要...[Hardware Requirements(硬體需求)] 以下是硬體需求規格,以建立...[Hardware Requirements\n\nThe following specif...事實要判斷答案是事實還是虛假,您需要...正確要確定答案是否正確,我們需要...
    1用什麼程式語言來寫...[CMake&Conan/n/nThe algorithm library of Mil...用於編寫 Knowher...用於編寫 Knowher...[CMake & Conan\nnThe algorithm library of Mil...[CMake & Conan\nThe algorithm library of Mil...事實判斷答案是事實還是虛假。正確要確定答案是否正確,我們需要...
    2在執行程式碼覆蓋之前,應確保什麼?[Code coverage\n/nBefore submitting your pull ...在執行程式碼覆蓋之前,應該確保...在執行程式碼覆蓋之前,應該確保 ...[Code coverage\n\nBefore submitting your pull ...[Code coverage\n/nBefore submitting your pull ...事實參考文獻中規定,在 runni...正確要確定答案是否正確,我們需要...
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.json new file mode 100644 index 000000000..99264b2e0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.json @@ -0,0 +1 @@ +{"codeList":["pip install streamlit pymilvus openai\n","import streamlit as st\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n # TODO check for related support cases and articles\n st.write(\"Submitted!\")\n","streamlit run basic_support_form.py\n","import streamlit as st\nimport os\nimport pymilvus\nimport openai\n\n\nwith st.form(\"my_form\"):\n st.write(\"Submit a support case\")\n text_val = st.text_area(\"Describe your problem?\")\n\n submitted = st.form_submit_button(\"Submit\")\n if submitted:\n import os\n import pymilvus\n import openai\n\n org_id = 360033549136 # TODO Load from customer login data\n\n pymilvus.connections.connect(uri=os.environ[\"MILVUS_URL\"], token=os.environ[\"MILVUS_TOKEN\"])\n collection = pymilvus.Collection(\"zendesk\")\n\n embedding = openai.Embedding.create(input=text_val, model=\"text-embedding-ada-002\")['data'][0]['embedding']\n\n results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=2, output_fields=[\"_id\", \"subject\", \"description\"], expr=f'status == \"new\" and organization_id == {org_id}')\n\n st.write(results[0])\n if len(results[0]) > 0 and results[0].distances[0] < 0.35:\n matching_ticket = results[0][0].entity\n st.write(f\"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before\")\n else:\n st.write(\"Submitted!\")\n \n","export MILVUS_TOKEN=...\nexport MILVUS_URL=https://...\nexport OPENAI_API_KEY=sk-...\n\nstreamlit run app.py\n"," ......\n \n else:\n # TODO Actually send out the ticket\n st.write(\"Submitted!\")\n article_results = collection.search(data=[embedding], anns_field=\"vector\", param={}, limit=5, output_fields=[\"title\", \"html_url\"], expr=f'_ab_stream == \"articles\"')\n st.write(article_results[0])\n if len(article_results[0]) > 0:\n st.write(\"We also found some articles that might help you:\")\n for hit in article_results[0]:\n if hit.distance < 0.362:\n st.write(f\"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})\")\n\n"],"headingContent":"Airbyte: Open-Source Data Movement Infrastructure","anchorList":[{"label":"Airbyte:開放原始碼資料移動基礎架構","href":"Airbyte-Open-Source-Data-Movement-Infrastructure","type":1,"isActive":false},{"label":"Airbyte 的主要組成部分","href":"Major-Components-of-Airbyte","type":2,"isActive":false},{"label":"開始之前","href":"Before-You-Begin","type":2,"isActive":false},{"label":"設定 Milvus 叢集","href":"Set-Up-Milvus-Cluster","type":2,"isActive":false},{"label":"在 Airbyte 中設定連線","href":"Set-Up-Connection-in-Airbyte","type":2,"isActive":false},{"label":"建立 Streamlit 應用程式查詢資料集","href":"Build-Streamlit-app-querying-the-collection","type":2,"isActive":false},{"label":"總結","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.md new file mode 100644 index 000000000..1d34e4b2d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_airbyte.md @@ -0,0 +1,244 @@ +--- +id: integrate_with_airbyte.md +summary: >- + Airbyte 是一套開放原始碼的資料移動基礎架構,用於建立抽取與載入 (EL) 資料管道。它的設計具有多功能性、可擴展性和易用性。Airbyte + 的連接器目錄「開箱即用」,包含 350 多個預先建立的連接器。這些連接器可用於在短短幾分鐘內將資料從來源複製到目的地。 +title: Airbyte:開放原始碼資料移動基礎架構 +--- +

    Airbyte:開放原始碼資料移動基礎架構

    Airbyte 是一套開放原始碼的資料移動基礎架構,用於建立抽取與載入 (EL) 資料管道。它的設計具有多功能性、可擴展性和易用性。Airbyte 的連接器目錄「開箱即用」,包含 350 多個預先建立的連接器。這些連接器可用於在短短幾分鐘內將資料從來源複製到目的地。

    +

    Airbyte 的主要組成部分

    1.連接器目錄

      +
    • 350+ 預建連接器:Airbyte 的連接器目錄 「開箱即用」,包含 350 多個預建連接器。這些連接器可用於在短短幾分鐘內將資料從來源複製到目的地。
    • +
    • No-Code Connector Builder:您可以透過No-Code Connector Builder 等工具輕鬆擴展 Airbyte 的功能,以支援您的自訂用例。
    • +
    +

    2.平台

    Airbyte 的平台提供配置和擴展資料移動作業所需的所有水平服務,可選擇雲端管理自我管理

    +

    3.使用者介面

    Airbyte 具備使用者介面、PyAirbyte(Python 函式庫)、APITerraform Provider,可與您偏好的工具和基礎架構管理方法整合。

    +

    透過 Airbyte 的能力,使用者可以將資料來源整合至 Milvus 叢集,進行相似性搜尋。

    +

    開始之前

    您將需要

    +
      +
    • Zendesk 帳戶 (或其他您想要同步資料的資料來源)
    • +
    • Airbyte 帳戶或本機實例
    • +
    • OpenAI API 金鑰
    • +
    • Milvus 集群
    • +
    • 本機已安裝 Python 3.10
    • +
    +

    設定 Milvus 叢集

    如果您已經為生產部署了 K8s 集群,您可以跳過此步驟,直接部署 Milvus Operator。如果沒有,您可以按照步驟使用 Milvus Operator 部署 Milvus 集群。

    +

    個別實體 (在我們的例子中,支援票單和知識庫文章) 儲存在「集合」中 - 在您的群集設定完成後,您需要建立一個集合。選擇一個合適的名稱,並將 Dimension 設定為 1536,以符合 OpenAI embeddings 服務所產生的向量維度。

    +

    建立後,記錄端點和驗證資訊。

    +

    在 Airbyte 中設定連線

    我們的資料庫已準備就緒,讓我們移動一些資料過去!为此,我们需要在 Airbyte 中配置连接。您可以在cloud.airbyte.com註冊一個 Airbyte 雲端帳戶,或按照文件中所述啟動一個本地實例。

    +

    設定來源

    实例运行后,我们需要设置连接 - 单击 "New connection「(新建连接)并选择 」Zendesk Support "连接器作为源。单击 "Test and Save"(测试并保存)按钮后,Airbyte 将检查是否可以建立连接。

    +

    在 Airbyte 云上,您可以通过单击 「验证 」按钮轻松进行验证。使用本機 Airbyte 實例時,請遵循文件頁面上概述的指示。

    +

    設定目的地

    如果一切運作正常,下一步就是設定要移動資料的目的地。在此,選擇「Milvus」連接器。

    +

    Milvus 連接器可做三件事:

    +
      +
    • 分塊和格式化- 將 Zendesk 記錄分割為文字和元資料。如果文字大於指定的分塊大小,記錄會被分割成多個部分,並單獨載入資料集中。例如,分割文字(或分塊)可能發生在大型支援票單或知識文章的情況。透過分割文字,您可以確保搜尋總是能得到有用的結果。
    • +
    +

    讓我們使用 1000 個標記的分塊大小,以及 body、title、description 和 subject 等文字欄位,因為這些都會出現在我們從 Zendesk 收到的資料中。

    +
      +
    • 嵌入- 使用機器學習模型將處理部分產生的文字塊轉換為向量嵌入,然後您可以搜尋其語意相似性。若要建立嵌入,您必須提供 OpenAI API 金鑰。Airbyte 將傳送每個chunk 到 OpenAI,並將產生的向量加入載入您 Milvus 叢集的實體中。
    • +
    • 索引- 一旦您將小塊向量化,您就可以將它們載入資料庫。為此,請插入您在 Milvus 叢集中設定叢集和集合時所獲得的資訊。
      點選「測試並儲存」將檢查一切是否正確排列(有效憑證、集合存在且與設定的嵌入具有相同的向量維度等)。
    • +
    +

    設定串流同步流程

    資料準備好流動之前的最後一個步驟是選擇要同步的「串流」。流是來源中記錄的集合。由於 Zendesk 支援大量與我們的使用案例不相關的串流,讓我們只選擇「票單」和「文章」,禁用所有其他串流,以節省頻寬,並確保只有相關資訊會顯示在搜尋中:

    您可以按一下串流名稱,選擇要從來源中萃取哪些欄位。Incremental | Append + Deduped "同步模式意味著後續的連接運行會保持 Zendesk 和 Milvus 同步,同時傳輸最少的資料(僅傳輸自上次運行後發生變化的文章和票單)。

    +

    連接一經建立,Airbyte 即會開始同步資料。它可能需要幾分鐘才能出現在您的 Milvus 收集中。

    +

    如果您選擇複製頻率,Airbyte 會定期執行,以保持您的 Milvus 收集與 Zendesk 文章和新建立問題的變更同步。

    +

    檢查流程

    您可以在 Milvus 集群 UI 中检查数据在集合中的结构,方法是导航到 playground 并执行 "Query Data 「查询,过滤器设置为」_ab_stream == \"ticket/""。

    正如您在結果檢視中所看到的,來自 Zendesk 的每筆記錄都以獨立的實體儲存於 Milvus 中,並包含所有指定的元資料。嵌入所依據的文字區塊顯示為 "text "屬性 - 這是使用 OpenAI 嵌入的文字,也是我們要搜尋的內容。

    +

    建立 Streamlit 應用程式查詢資料集

    我們的資料已經準備就緒 - 現在我們需要建立應用程式來使用它。在這種情況下,應用程式將會是一個簡單的支援表單,供使用者提交支援個案。當使用者按下提交時,我們會做兩件事:

    +
      +
    • 搜尋同一組織的使用者所提交的類似票單
    • +
    • 搜尋可能與使用者相關的知識型文章
    • +
    +

    在這兩種情況下,我們都會使用 OpenAI 內嵌利用語意搜尋。為此,使用者輸入的問題描述也會被嵌入,並用於從 Milvus 叢集中擷取相似的實體。如果有相關的結果,就會顯示在表單下方。

    +

    設定 UI 環境

    您需要本機安裝 Python,因為我們會使用 Streamlit 來實作應用程式。

    +

    首先,在本機安裝 Streamlit、Milvus 客戶端函式庫和 OpenAI 客戶端函式庫:

    +
    pip install streamlit pymilvus openai
    +
    +

    若要渲染基本的支援表單,請建立一個 python 檔案basic_support_form.py

    +
    import streamlit as st
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        # TODO check for related support cases and articles
    +        st.write("Submitted!")
    +
    +

    要執行應用程式,請使用 Streamlit run:

    +
    streamlit run basic_support_form.py
    +
    +

    這將會渲染一個基本的表單:

    這個範例的程式碼也可以在GitHub 上找到。

    +

    設定後端查詢服務

    接下來,讓我們檢查可能相關的現有開狀。為了做到這一點,我們使用 OpenAI 嵌入使用者輸入的文字,然後在我們的集合中進行相似性搜尋,過濾仍未結案的票單。如果有一個提供的票單與現有票單之間的距離很低,就會讓使用者知道,並且不要提交:

    +
    import streamlit as st
    +import os
    +import pymilvus
    +import openai
    +
    +
    +with st.form("my_form"):
    +    st.write("Submit a support case")
    +    text_val = st.text_area("Describe your problem?")
    +
    +    submitted = st.form_submit_button("Submit")
    +    if submitted:
    +        import os
    +        import pymilvus
    +        import openai
    +
    +        org_id = 360033549136 # TODO Load from customer login data
    +
    +        pymilvus.connections.connect(uri=os.environ["MILVUS_URL"], token=os.environ["MILVUS_TOKEN"])
    +        collection = pymilvus.Collection("zendesk")
    +
    +        embedding = openai.Embedding.create(input=text_val, model="text-embedding-ada-002")['data'][0]['embedding']
    +
    +        results = collection.search(data=[embedding], anns_field="vector", param={}, limit=2, output_fields=["_id", "subject", "description"], expr=f'status == "new" and organization_id == {org_id}')
    +
    +        st.write(results[0])
    +        if len(results[0]) > 0 and results[0].distances[0] < 0.35:
    +            matching_ticket = results[0][0].entity
    +            st.write(f"This case seems very similar to {matching_ticket.get('subject')} (id #{matching_ticket.get('_id')}). Make sure it has not been submitted before")
    +        else:
    +            st.write("Submitted!")
    +            
    +
    +

    這裡發生了幾件事情:

    +
      +
    • 與 Milvus 叢集的連線已建立。
    • +
    • 使用 OpenAI 服務產生使用者輸入描述的嵌入。
    • +
    • 執行相似性搜尋,依據票單狀態和組織 ID 篩選結果(因為只有同一組織的開放票單才相關)。
    • +
    • 如果有結果,且現有票單的嵌入向量與新輸入文字的嵌入向量之間的距離低於某個臨界值,則會指出這個事實。
    • +
    +

    要執行新的應用程式,需要先為 OpenAI 和 Milvus 設定環境變數:

    +
    export MILVUS_TOKEN=...
    +export MILVUS_URL=https://...
    +export OPENAI_API_KEY=sk-...
    +
    +streamlit run app.py
    +
    +

    當嘗試提交已經存在的票單,結果會是這樣:

    這個範例的程式碼也可以在GitHub 上找到。

    +

    顯示更多相關資訊

    正如您在隱藏於最終版本中的綠色除錯輸出中所看到的,有兩張票單符合我們的搜尋(狀態為新、來自目前的組織,且接近嵌入向量)。但是,第一張 (相關) 的排名高於第二張 (在此情況下不相關),這反映在較低的距離值上。這種關係在嵌入向量中被捕捉到,而不會像一般全文檢索一樣直接匹配字詞。

    +

    總結一下,讓我們在提交票單之後顯示有用的資訊,儘可能在最前面提供使用者相關資訊。

    +

    為此,我們會在提交票單後進行第二次搜尋,以取得最匹配的知識庫文章:

    +
       ......
    +   
    +        else:
    +            # TODO Actually send out the ticket
    +            st.write("Submitted!")
    +            article_results = collection.search(data=[embedding], anns_field="vector", param={}, limit=5, output_fields=["title", "html_url"], expr=f'_ab_stream == "articles"')
    +            st.write(article_results[0])
    +            if len(article_results[0]) > 0:
    +                st.write("We also found some articles that might help you:")
    +                for hit in article_results[0]:
    +                    if hit.distance < 0.362:
    +                        st.write(f"* [{hit.entity.get('title')}]({hit.entity.get('html_url')})")
    +
    +
    +

    如果沒有相似度高的開放支援票單,則會提交新票單,並在下方顯示相關的知識文章:

    此範例的程式碼也可以在Github 上找到。

    +

    總結

    雖然這裡所顯示的 UI 並非實際的支援表單,而是用來說明使用個案的範例,但 Airbyte 與 Milvus 的結合是非常強大的 - 它可以輕鬆地從各種來源載入文字(從像 Postgres 之類的資料庫,到像 Zendesk 或 GitHub 之類的 API,再到使用 Airbyte 的 SDK 或視覺連接器建立器建立的完全自訂來源),並在 Milvus 中以內嵌的形式進行索引,Milvus 是一個強大的向量搜尋引擎,能夠擴展至龐大的資料量。

    +

    Airbyte 和 Milvus 是開放原始碼,可完全免費在您的基礎架構上使用,如果需要,還可透過雲端服務來卸載作業。

    +

    除了本文所說明的經典語意搜尋用例外,一般的設定也可用於使用 RAG 方法 (Retrieval Augmented Generation) 建立問題解答聊天機器人、推薦系統,或協助提高廣告的相關性與效率。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.json new file mode 100644 index 000000000..2bd60a483 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus bentoml\n","import bentoml\n\nBENTO_EMBEDDING_MODEL_END_POINT = \"BENTO_EMBEDDING_MODEL_END_POINT\"\nBENTO_API_TOKEN = \"BENTO_API_TOKEN\"\n\nembedding_client = bentoml.SyncHTTPClient(\n BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN\n)\n","# naively chunk on newlines\ndef chunk_text(filename: str) -> list:\n with open(filename, \"r\") as f:\n text = f.read()\n sentences = text.split(\"\\n\")\n return sentences\n","import os\nimport requests\nimport urllib.request\n\n# set up the data source\nrepo = \"ytang07/bento_octo_milvus_RAG\"\ndirectory = \"data\"\nsave_dir = \"./city_data\"\napi_url = f\"https://api.github.com/repos/{repo}/contents/{directory}\"\n\n\nresponse = requests.get(api_url)\ndata = response.json()\n\nif not os.path.exists(save_dir):\n os.makedirs(save_dir)\n\nfor item in data:\n if item[\"type\"] == \"file\":\n file_url = item[\"download_url\"]\n file_path = os.path.join(save_dir, item[\"name\"])\n urllib.request.urlretrieve(file_url, file_path)\n","# please upload your data directory under this file's folder\ncities = os.listdir(\"city_data\")\n# store chunked text for each of the cities in a list of dicts\ncity_chunks = []\nfor city in cities:\n chunked = chunk_text(f\"city_data/{city}\")\n cleaned = []\n for chunk in chunked:\n if len(chunk) > 7:\n cleaned.append(chunk)\n mapped = {\"city_name\": city.split(\".\")[0], \"chunks\": cleaned}\n city_chunks.append(mapped)\n","def get_embeddings(texts: list) -> list:\n if len(texts) > 25:\n splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]\n embeddings = []\n for split in splits:\n embedding_split = embedding_client.encode(sentences=split)\n embeddings += embedding_split\n return embeddings\n return embedding_client.encode(\n sentences=texts,\n )\n","entries = []\nfor city_dict in city_chunks:\n # No need for the embeddings list if get_embeddings already returns a list of lists\n embedding_list = get_embeddings(city_dict[\"chunks\"]) # returns a list of lists\n # Now match texts with embeddings and city name\n for i, embedding in enumerate(embedding_list):\n entry = {\n \"embedding\": embedding,\n \"sentence\": city_dict[\"chunks\"][\n i\n ], # Assume \"chunks\" has the corresponding texts for the embeddings\n \"city\": city_dict[\"city_name\"],\n }\n entries.append(entry)\n print(entries)\n","from pymilvus import MilvusClient\n\nCOLLECTION_NAME = \"Bento_Milvus_RAG\" # random name for your collection\nDIMENSION = 384\n\n# Initialize a Milvus Lite client\nmilvus_client = MilvusClient(\"milvus_demo.db\")\n","from pymilvus import connections\n\nconnections.connect(uri=\"milvus_demo.db\")\n","from pymilvus import MilvusClient, DataType, Collection\n\n# Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n)\n\n# 3.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# prepare index parameters\nindex_params = milvus_client.prepare_index_params()\n\n# add index\nindex_params.add_index(\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n\n# create collection\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME, schema=schema, index_params=index_params\n)\n\n# Outside the loop, now you upsert all the entries at once\nmilvus_client.insert(collection_name=COLLECTION_NAME, data=entries)\n","BENTO_LLM_END_POINT = \"BENTO_LLM_END_POINT\"\n\nllm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)\n","def dorag(question: str, context: str):\n\n prompt = (\n f\"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \\n\"\n f\"The user question is {question}\"\n )\n\n results = llm_client.generate(\n max_tokens=1024,\n prompt=prompt,\n )\n\n res = \"\"\n for result in results:\n res += result\n\n return res\n","question = \"What state is Cambridge in?\"\n\n\ndef ask_a_question(question):\n embeddings = get_embeddings([question])\n res = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=embeddings, # search for the one (1) embedding returned as a list of lists\n anns_field=\"embedding\", # Search across embeddings\n limit=5, # get me the top 5 results\n output_fields=[\"sentence\"], # get the sentence/chunk and city\n )\n\n sentences = []\n for hits in res:\n for hit in hits:\n print(hit)\n sentences.append(hit[\"entity\"][\"sentence\"])\n context = \". \".join(sentences)\n return context\n\n\ncontext = ask_a_question(question=question)\nprint(context)\n","print(dorag(question=question, context=context))\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and BentoML","anchorList":[{"label":"使用 Milvus 和 BentoML 的 Retrieval-Augmented Generation (RAG)","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-BentoML","type":1,"isActive":false},{"label":"簡介","href":"Introduction","type":2,"isActive":false},{"label":"開始之前","href":"Before-you-begin","type":2,"isActive":false},{"label":"使用 BentoML/BentoCloud 提供嵌入式服務","href":"Serving-Embeddings-with-BentoMLBentoCloud","type":2,"isActive":false},{"label":"將資料插入向量資料庫以進行檢索","href":"Inserting-Data-into-a-Vector-Database-for-Retrieval","type":2,"isActive":false},{"label":"建立您的 Milvus Lite 套件","href":"Creating-Your-Milvus-Lite-Collection","type":2,"isActive":false},{"label":"為 RAG 設定您的 LLM","href":"Set-up-Your-LLM-for-RAG","type":2,"isActive":false},{"label":"LLM 指令","href":"LLM-Instructions","type":2,"isActive":false},{"label":"RAG 範例","href":"A-RAG-Example","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.md new file mode 100644 index 000000000..4c094a8b5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_bentoml.md @@ -0,0 +1,348 @@ +--- +id: integrate_with_bentoml.md +summary: 本指南示範如何使用 BentoCloud 上的開放原始碼嵌入模型和大型語言模型,並搭配 Milvus 向量資料庫,建立檢索擴增世代 (RAG) 應用程式。 +title: 使用 Milvus 和 BentoML 的 Retrieval-Augmented Generation (RAG) +--- +

    使用 Milvus 和 BentoML 的 Retrieval-Augmented Generation (RAG)

    Open In Colab +GitHub Repository

    +

    簡介

    本指南說明如何使用 BentoCloud 上的開放原始碼嵌入模型和大型語言模型,以及 Milvus 向量資料庫來建立 RAG (Retrieval Augmented Generation) 應用程式。 BentoCloud 是專為快速行動的人工智能團隊所設計的人工智能推論平台,提供專為模型推論量身打造的完整管理基礎架構。它與 BentoML(一個開放源碼的模型服務架構)結合使用,可簡化高效能模型服務的建立與部署。在這個示範中,我們使用 Milvus Lite 作為向量資料庫,它是 Milvus 的輕量版,可以嵌入到您的 Python 應用程式中。

    +

    開始之前

    Milvus Lite 可在 PyPI 上找到。您可以透過 Python 3.8+ 的 pip 安裝它:

    +
    $ pip install -U pymilvus bentoml
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的依賴項目,您可能需要重新啟動運行時(點擊螢幕上方的「Runtime」功能表,從下拉式功能表中選擇「Restart session」)。

    +
    +

    登入 BentoCloud 後,我們可以在部署中與已部署的 BentoCloud 服務互動,而相對應的 END_POINT 和 API 則位於 Playground -> Python。 您可以在此下載城市資料。

    +

    使用 BentoML/BentoCloud 提供嵌入式服務

    要使用此端點,請匯入bentoml ,並透過指定端點和可選的令牌(如果您在 BentoCloud 上開啟Endpoint Authorization ),使用SyncHTTPClient 設定 HTTP 客戶端。或者,您也可以使用 BentoML 的Sentence Transformers Embeddings套件庫來提供相同的模型。

    +
    import bentoml
    +
    +BENTO_EMBEDDING_MODEL_END_POINT = "BENTO_EMBEDDING_MODEL_END_POINT"
    +BENTO_API_TOKEN = "BENTO_API_TOKEN"
    +
    +embedding_client = bentoml.SyncHTTPClient(
    +    BENTO_EMBEDDING_MODEL_END_POINT, token=BENTO_API_TOKEN
    +)
    +
    +

    一旦連接到 embedding_client,我們就需要處理資料。我們提供了幾個函式來執行資料分割和嵌入。

    +

    讀取檔案並將文字預先處理為字串清單。

    +
    # naively chunk on newlines
    +def chunk_text(filename: str) -> list:
    +    with open(filename, "r") as f:
    +        text = f.read()
    +    sentences = text.split("\n")
    +    return sentences
    +
    +

    首先,我們需要下載城市資料。

    +
    import os
    +import requests
    +import urllib.request
    +
    +# set up the data source
    +repo = "ytang07/bento_octo_milvus_RAG"
    +directory = "data"
    +save_dir = "./city_data"
    +api_url = f"https://api.github.com/repos/{repo}/contents/{directory}"
    +
    +
    +response = requests.get(api_url)
    +data = response.json()
    +
    +if not os.path.exists(save_dir):
    +    os.makedirs(save_dir)
    +
    +for item in data:
    +    if item["type"] == "file":
    +        file_url = item["download_url"]
    +        file_path = os.path.join(save_dir, item["name"])
    +        urllib.request.urlretrieve(file_url, file_path)
    +
    +

    接下來,我們處理每個檔案。

    +
    # please upload your data directory under this file's folder
    +cities = os.listdir("city_data")
    +# store chunked text for each of the cities in a list of dicts
    +city_chunks = []
    +for city in cities:
    +    chunked = chunk_text(f"city_data/{city}")
    +    cleaned = []
    +    for chunk in chunked:
    +        if len(chunk) > 7:
    +            cleaned.append(chunk)
    +    mapped = {"city_name": city.split(".")[0], "chunks": cleaned}
    +    city_chunks.append(mapped)
    +
    +

    將字串清單分割成嵌入清單,每組 25 個文字串。

    +
    def get_embeddings(texts: list) -> list:
    +    if len(texts) > 25:
    +        splits = [texts[x : x + 25] for x in range(0, len(texts), 25)]
    +        embeddings = []
    +        for split in splits:
    +            embedding_split = embedding_client.encode(sentences=split)
    +            embeddings += embedding_split
    +        return embeddings
    +    return embedding_client.encode(
    +        sentences=texts,
    +    )
    +
    +

    現在,我們需要匹配 embeddings 和文字塊。由於嵌入式清單和句子清單應該依索引匹配,因此我們可以透過enumerate 任一清單來進行匹配。

    +
    entries = []
    +for city_dict in city_chunks:
    +    # No need for the embeddings list if get_embeddings already returns a list of lists
    +    embedding_list = get_embeddings(city_dict["chunks"])  # returns a list of lists
    +    # Now match texts with embeddings and city name
    +    for i, embedding in enumerate(embedding_list):
    +        entry = {
    +            "embedding": embedding,
    +            "sentence": city_dict["chunks"][
    +                i
    +            ],  # Assume "chunks" has the corresponding texts for the embeddings
    +            "city": city_dict["city_name"],
    +        }
    +        entries.append(entry)
    +    print(entries)
    +
    +

    將資料插入向量資料庫以進行檢索

    準備好嵌入和資料之後,我們就可以將向量連同 metadata 插入 Milvus Lite,以便稍後進行向量搜尋。本節的第一步是連線到 Milvus Lite 來啟動一個用戶端。我們只要匯入MilvusClient 模組,並初始化一個連線到 Milvus Lite 向量資料庫的 Milvus Lite 用戶端。維度大小來自嵌入模型的大小,例如 Sentence Transformer 模型all-MiniLM-L6-v2 產生 384 維度的向量。

    +
    from pymilvus import MilvusClient
    +
    +COLLECTION_NAME = "Bento_Milvus_RAG"  # random name for your collection
    +DIMENSION = 384
    +
    +# Initialize a Milvus Lite client
    +milvus_client = MilvusClient("milvus_demo.db")
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    或使用舊的 connections.connect API (不建議):

    +
    from pymilvus import connections
    +
    +connections.connect(uri="milvus_demo.db")
    +
    +

    建立您的 Milvus Lite 套件

    使用 Milvus Lite 建立資料集包含兩個步驟:第一,定義模式;第二,定義索引。在這一節,我們需要一個模組:DataType 告訴我們欄位中的資料類型。create_schema(): 建立一個集合的模式,add_field(): 加入一個欄位到集合的模式。

    +
    from pymilvus import MilvusClient, DataType, Collection
    +
    +# Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +)
    +
    +# 3.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    現在我們已經建立了模式並成功定義了資料欄位,我們需要定義索引。就搜尋而言,「索引」定義了我們如何將資料映射出來以供擷取。在本專案中,我們使用預設選項AUTOINDEX來為資料建立索引。

    +

    接下來,我們使用之前給定的名稱、模式和索引建立集合。最後,我們插入先前處理過的資料。

    +
    # prepare index parameters
    +index_params = milvus_client.prepare_index_params()
    +
    +# add index
    +index_params.add_index(
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +# create collection
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME, schema=schema, index_params=index_params
    +)
    +
    +# Outside the loop, now you upsert all the entries at once
    +milvus_client.insert(collection_name=COLLECTION_NAME, data=entries)
    +
    +

    為 RAG 設定您的 LLM

    要建立 RAG 應用程式,我們需要在 BentoCloud 上部署 LLM。讓我們使用最新的 Llama3 LLM。一旦部署完成,只需複製此模型服務的端點和標記,並為其設定用戶端即可。

    +
    BENTO_LLM_END_POINT = "BENTO_LLM_END_POINT"
    +
    +llm_client = bentoml.SyncHTTPClient(BENTO_LLM_END_POINT, token=BENTO_API_TOKEN)
    +
    +

    LLM 指令

    現在,我們設定 LLM 指令的提示、上下文和問題。以下是執行 LLM 的函式,它會以字串格式回傳用戶端的輸出。

    +
    def dorag(question: str, context: str):
    +
    +    prompt = (
    +        f"You are a helpful assistant. The user has a question. Answer the user question based only on the context: {context}. \n"
    +        f"The user question is {question}"
    +    )
    +
    +    results = llm_client.generate(
    +        max_tokens=1024,
    +        prompt=prompt,
    +    )
    +
    +    res = ""
    +    for result in results:
    +        res += result
    +
    +    return res
    +
    +

    RAG 範例

    現在我們準備提出問題。這個函式簡單地接收一個問題,然後進行 RAG,從背景資訊中產生相關的上下文。接著,我們將上下文和問題傳給 dorag() 並得到結果。

    +
    question = "What state is Cambridge in?"
    +
    +
    +def ask_a_question(question):
    +    embeddings = get_embeddings([question])
    +    res = milvus_client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=embeddings,  # search for the one (1) embedding returned as a list of lists
    +        anns_field="embedding",  # Search across embeddings
    +        limit=5,  # get me the top 5 results
    +        output_fields=["sentence"],  # get the sentence/chunk and city
    +    )
    +
    +    sentences = []
    +    for hits in res:
    +        for hit in hits:
    +            print(hit)
    +            sentences.append(hit["entity"]["sentence"])
    +    context = ". ".join(sentences)
    +    return context
    +
    +
    +context = ask_a_question(question=question)
    +print(context)
    +
    +

    執行 RAG

    +
    print(dorag(question=question, context=context))
    +
    +

    對於問劍橋在哪個州的範例問題,我們可以從 BentoML 列印整個回應。但是,如果我們花點時間來解析它,它看起來就會比較美觀,而且它應該會告訴我們劍橋位於麻薩諸塞州。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.json new file mode 100644 index 000000000..4fe8c0fec --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U \"camel-ai[all]\" pymilvus\n","import os\nimport requests\n\nos.makedirs(\"local_data\", exist_ok=True)\n\nurl = \"https://arxiv.org/pdf/2303.17760.pdf\"\nresponse = requests.get(url)\nwith open(\"local_data/camel paper.pdf\", \"wb\") as file:\n file.write(response.content)\n","os.environ[\"OPENAI_API_KEY\"] = \"Your Key\"\n","from camel.embeddings import OpenAIEmbedding\n\nembedding_instance = OpenAIEmbedding()\n","from camel.storages import MilvusStorage\n\nstorage_instance = MilvusStorage(\n vector_dim=embedding_instance.get_output_dim(),\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n collection_name=\"camel_paper\",\n)\n","from camel.retrievers import VectorRetriever\n\nvector_retriever = VectorRetriever(\n embedding_model=embedding_instance, storage=storage_instance\n)\n","vector_retriever.process(content_input_path=\"local_data/camel paper.pdf\")\n","retrieved_info = vector_retriever.query(query=\"What is CAMEL?\", top_k=1)\nprint(retrieved_info)\n","retrieved_info_irrelevant = vector_retriever.query(\n query=\"Compared with dumpling and rice, which should I take for dinner?\", top_k=1\n)\n\nprint(retrieved_info_irrelevant)\n","from camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\nauto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n)\n\nretrieved_info = auto_retriever.run_vector_retriever(\n query=\"What is CAMEL-AI\",\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n top_k=1,\n return_detailed_info=True,\n)\n\nprint(retrieved_info)\n","from camel.agents import ChatAgent\nfrom camel.messages import BaseMessage\nfrom camel.types import RoleType\nfrom camel.retrievers import AutoRetriever\nfrom camel.types import StorageType\n\n\ndef single_agent(query: str) -> str:\n # Set agent role\n assistant_sys_msg = BaseMessage(\n role_name=\"Assistant\",\n role_type=RoleType.ASSISTANT,\n meta_dict=None,\n content=\"\"\"You are a helpful assistant to answer question,\n I will give you the Original Query and Retrieved Context,\n answer the Original Query based on the Retrieved Context,\n if you can't answer the question just say I don't know.\"\"\",\n )\n\n # Add auto retriever\n auto_retriever = AutoRetriever(\n url_and_api_key=(\n \"./milvus_demo.db\", # Your Milvus connection URI\n \"\", # Your Milvus token\n ),\n storage_type=StorageType.MILVUS,\n embedding_model=embedding_instance,\n )\n\n retrieved_info = auto_retriever.run_vector_retriever(\n query=query,\n content_input_paths=[\n \"local_data/camel paper.pdf\", # example local path\n \"https://www.camel-ai.org/\", # example remote url\n ],\n # vector_storage_local_path=\"storage_default_run\",\n top_k=1,\n return_detailed_info=True,\n )\n\n # Pass the retrieved infomation to agent\n user_msg = BaseMessage.make_user_message(role_name=\"User\", content=retrieved_info)\n agent = ChatAgent(assistant_sys_msg)\n\n # Get response\n assistant_response = agent.step(user_msg)\n return assistant_response.msg.content\n\n\nprint(single_agent(\"What is CAMEL-AI\"))\n","from typing import List\nfrom colorama import Fore\n\nfrom camel.agents.chat_agent import FunctionCallingRecord\nfrom camel.configs import ChatGPTConfig\nfrom camel.functions import (\n MATH_FUNCS,\n RETRIEVAL_FUNCS,\n)\nfrom camel.societies import RolePlaying\nfrom camel.types import ModelType\nfrom camel.utils import print_text_animated\n\n\ndef role_playing_with_rag(\n task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10\n) -> None:\n task_prompt = task_prompt\n\n user_model_config = ChatGPTConfig(temperature=0.0)\n\n function_list = [\n *MATH_FUNCS,\n *RETRIEVAL_FUNCS,\n ]\n assistant_model_config = ChatGPTConfig(\n tools=function_list,\n temperature=0.0,\n )\n\n role_play_session = RolePlaying(\n assistant_role_name=\"Searcher\",\n user_role_name=\"Professor\",\n assistant_agent_kwargs=dict(\n model_type=model_type,\n model_config=assistant_model_config,\n tools=function_list,\n ),\n user_agent_kwargs=dict(\n model_type=model_type,\n model_config=user_model_config,\n ),\n task_prompt=task_prompt,\n with_task_specify=False,\n )\n\n print(\n Fore.GREEN\n + f\"AI Assistant sys message:\\n{role_play_session.assistant_sys_msg}\\n\"\n )\n print(Fore.BLUE + f\"AI User sys message:\\n{role_play_session.user_sys_msg}\\n\")\n\n print(Fore.YELLOW + f\"Original task prompt:\\n{task_prompt}\\n\")\n print(\n Fore.CYAN\n + f\"Specified task prompt:\\n{role_play_session.specified_task_prompt}\\n\"\n )\n print(Fore.RED + f\"Final task prompt:\\n{role_play_session.task_prompt}\\n\")\n\n n = 0\n input_msg = role_play_session.init_chat()\n while n < chat_turn_limit:\n n += 1\n assistant_response, user_response = role_play_session.step(input_msg)\n\n if assistant_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI Assistant terminated. Reason: \"\n f\"{assistant_response.info['termination_reasons']}.\"\n )\n )\n break\n if user_response.terminated:\n print(\n Fore.GREEN\n + (\n \"AI User terminated. \"\n f\"Reason: {user_response.info['termination_reasons']}.\"\n )\n )\n break\n\n # Print output from the user\n print_text_animated(Fore.BLUE + f\"AI User:\\n\\n{user_response.msg.content}\\n\")\n\n # Print output from the assistant, including any function\n # execution information\n print_text_animated(Fore.GREEN + \"AI Assistant:\")\n tool_calls: List[FunctionCallingRecord] = assistant_response.info[\"tool_calls\"]\n for func_record in tool_calls:\n print_text_animated(f\"{func_record}\")\n print_text_animated(f\"{assistant_response.msg.content}\\n\")\n\n if \"CAMEL_TASK_DONE\" in user_response.msg.content:\n break\n\n input_msg = assistant_response.msg\n","role_playing_with_rag(\n task_prompt=\"\"\"What is the main termination reasons for AI Society\n dataset, how many number of messages did camel decided to\n limit, what's the value plus 100? You should refer to the\n content in path camel/local_data/camel paper.pdf\"\"\"\n)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Camel","anchorList":[{"label":"使用 Milvus 和 Camel 的檢索-擴充世代 (RAG)","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Camel","type":1,"isActive":false},{"label":"載入資料","href":"Load-Data","type":2,"isActive":false},{"label":"1.自訂 RAG","href":"1-Customized-RAG","type":2,"isActive":false},{"label":"2.自動 RAG","href":"2-Auto-RAG","type":2,"isActive":false},{"label":"3.具有自動 RAG 的單一代理","href":"3-Single-Agent-with-Auto-RAG","type":2,"isActive":false},{"label":"4.使用 Auto RAG 進行角色扮演","href":"4-Role-playing-with-Auto-RAG","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.md new file mode 100644 index 000000000..a6ce3283b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_camel.md @@ -0,0 +1,472 @@ +--- +id: integrate_with_camel.md +summary: 本指南示範如何使用 CAMEL 和 Milvus 建立檢索增強世代 (RAG) 系統。 +title: 使用 Milvus 和 Camel 的檢索-擴充世代 (RAG) +--- +

    使用 Milvus 和 Camel 的檢索-擴充世代 (RAG)

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 CAMEL 和 Milvus 建立一個檢索-增強生成 (RAG) 系統。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示生成新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    CAMEL是一個多重代理框架。Milvus是世界上最先進的開放原始碼向量資料庫,專門用於嵌入相似性搜尋和人工智能應用程式。

    +

    在本筆記簿中,我們展示了 CAMEL Retrieve 模組在自訂和自動兩種方式中的用法。我們也將展示如何結合AutoRetrieverChatAgent ,並透過Function Calling 進一步結合AutoRetrieverRolePlaying

    +

    包括四個主要部分:

    +
      +
    • 自訂 RAG
    • +
    • 自動 RAG
    • +
    • 使用自動 RAG 的單一代理
    • +
    • 角色扮演與自動 RAG
    • +
    +

    載入資料

    讓我們先從 https://arxiv.org/pdf/2303.17760.pdf 載入 CAMEL 文件。這將是我們的本地範例資料。

    +
    $ pip install -U "camel-ai[all]" pymilvus
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +
    import os
    +import requests
    +
    +os.makedirs("local_data", exist_ok=True)
    +
    +url = "https://arxiv.org/pdf/2303.17760.pdf"
    +response = requests.get(url)
    +with open("local_data/camel paper.pdf", "wb") as file:
    +    file.write(response.content)
    +
    +

    1.自訂 RAG

    在本節中,我們將設定自訂的 RAG 管道,以VectorRetriever 為例。我們將設定OpenAIEmbedding 為嵌入模型,MilvusStorage 為其儲存空間。

    +

    要設定 OpenAI 的嵌入,我們需要設定OPENAI_API_KEY

    +
    os.environ["OPENAI_API_KEY"] = "Your Key"
    +
    +

    匯入並設定嵌入實例:

    +
    from camel.embeddings import OpenAIEmbedding
    +
    +embedding_instance = OpenAIEmbedding()
    +
    +

    匯入並設定向量儲存實例:

    +
    from camel.storages import MilvusStorage
    +
    +storage_instance = MilvusStorage(
    +    vector_dim=embedding_instance.get_output_dim(),
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    collection_name="camel_paper",
    +)
    +
    +
    +

    對於url_and_api_key

    +
      +
    • 使用本機檔案,例如./milvus.db ,作為 Milvus connection URI 是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存於此檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的 url。
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整連線 uri 和 token,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +

    匯入並設定 retriever instance:

    +

    預設情況下,similarity_threshold 設定為 0.75。您可以變更它。

    +
    from camel.retrievers import VectorRetriever
    +
    +vector_retriever = VectorRetriever(
    +    embedding_model=embedding_instance, storage=storage_instance
    +)
    +
    +

    我們使用整合的Unstructured Module 來將內容分割成小塊,內容會利用其chunk_by_title 功能自動分割,每個小塊的最大字元為 500 個字元,這是OpenAIEmbedding 的合適長度。分塊中的所有文字都會嵌入並儲存到向量儲存實例中,這需要一些時間,請稍候。

    +
    vector_retriever.process(content_input_path="local_data/camel paper.pdf")
    +
    +
    [nltk_data] Downloading package punkt to /root/nltk_data...
    +[nltk_data]   Unzipping tokenizers/punkt.zip.
    +[nltk_data] Downloading package averaged_perceptron_tagger to
    +[nltk_data]     /root/nltk_data...
    +[nltk_data]   Unzipping taggers/averaged_perceptron_tagger.zip.
    +
    +

    現在我們可以透過查詢從向量儲存中擷取資訊。預設情況下,它會從 Cosine 類似度分數最高的前 1 個分塊中擷取文字內容,而類似度分數應高於 0.75,以確保擷取的內容與查詢相關。您也可以變更top_k 值。

    +

    傳回的字串清單包括

    +
      +
    • 相似度得分
    • +
    • 內容路徑
    • +
    • 元資料
    • +
    • 文字
    • +
    +
    retrieved_info = vector_retriever.query(query="What is CAMEL?", top_k=1)
    +print(retrieved_info)
    +
    +
    [{'similarity score': '0.8321675658226013', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 45}, 'text': 'CAMEL Data and Code License The intended purpose and licensing of CAMEL is solely for research use. The source code is licensed under Apache 2.0. The datasets are licensed under CC BY NC 4.0, which permits only non-commercial usage. It is advised that any models trained using the dataset should not be utilized for anything other than research purposes.\n\n45'}]
    +
    +

    讓我們試試不相關的查詢:

    +
    retrieved_info_irrelevant = vector_retriever.query(
    +    query="Compared with dumpling and rice, which should I take for dinner?", top_k=1
    +)
    +
    +print(retrieved_info_irrelevant)
    +
    +
    [{'text': 'No suitable information retrieved from local_data/camel paper.pdf                 with similarity_threshold = 0.75.'}]
    +
    +

    2.自動 RAG

    在本節中,我們將以預設設定執行AutoRetriever 。它使用OpenAIEmbedding 作為預設的嵌入模型,並使用Milvus 作為預設的向量儲存。

    +

    您需要做的是

    +
      +
    • 設定內容輸入路徑,可以是本機路徑或遠端網址
    • +
    • 設定 Milvus 的遠端網址和 api 金鑰
    • +
    • 提供查詢
    • +
    +

    自動 RAG 管道會為指定的內容輸入路徑建立集合,集合名稱會根據內容輸入路徑名稱自動設定,如果集合存在,則會直接進行擷取。

    +
    from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +auto_retriever = AutoRetriever(
    +    url_and_api_key=(
    +        "./milvus_demo.db",  # Your Milvus connection URI
    +        "",  # Your Milvus token
    +    ),
    +    storage_type=StorageType.MILVUS,
    +    embedding_model=embedding_instance,
    +)
    +
    +retrieved_info = auto_retriever.run_vector_retriever(
    +    query="What is CAMEL-AI",
    +    content_input_paths=[
    +        "local_data/camel paper.pdf",  # example local path
    +        "https://www.camel-ai.org/",  # example remote url
    +    ],
    +    top_k=1,
    +    return_detailed_info=True,
    +)
    +
    +print(retrieved_info)
    +
    +
    Original Query:
    +{What is CAMEL-AI}
    +Retrieved Context:
    +{'similarity score': '0.8252888321876526', 'content path': 'local_data/camel paper.pdf', 'metadata': {'last_modified': '2024-04-19T14:40:00', 'filetype': 'application/pdf', 'page_number': 7}, 'text': ' Section 3.2, to simulate assistant-user cooperation. For our analysis, we set our attention on AI Society setting. We also gathered conversational data, named CAMEL AI Society and CAMEL Code datasets and problem-solution pairs data named CAMEL Math and CAMEL Science and analyzed and evaluated their quality. Moreover, we will discuss potential extensions of our framework and highlight both the risks and opportunities that future AI society might present.'}
    +{'similarity score': '0.8378663659095764', 'content path': 'https://www.camel-ai.org/', 'metadata': {'filetype': 'text/html', 'languages': ['eng'], 'page_number': 1, 'url': 'https://www.camel-ai.org/', 'link_urls': ['#h.3f4tphhd9pn8', 'https://join.slack.com/t/camel-ai/shared_invite/zt-2g7xc41gy-_7rcrNNAArIP6sLQqldkqQ', 'https://discord.gg/CNcNpquyDc'], 'link_texts': [None, None, None], 'emphasized_text_contents': ['Mission', 'CAMEL-AI.org', 'is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.', 'Join us via', 'Slack', 'Discord', 'or'], 'emphasized_text_tags': ['span', 'span', 'span', 'span', 'span', 'span', 'span']}, 'text': 'Mission\n\nCAMEL-AI.org is an open-source community dedicated to the study of autonomous and communicative agents. We believe that studying these agents on a large scale offers valuable insights into their behaviors, capabilities, and potential risks. To facilitate research in this field, we provide, implement, and support various types of agents, tasks, prompts, models, datasets, and simulated environments.\n\nJoin us via\n\nSlack\n\nDiscord\n\nor'}
    +
    +

    3.具有自動 RAG 的單一代理

    本節將介紹如何將AutoRetriever 與單一ChatAgent 結合。

    +

    讓我們設定一個代理函式,在這個函式中,我們可以透過提供查詢給這個代理來取得回應。

    +
    from camel.agents import ChatAgent
    +from camel.messages import BaseMessage
    +from camel.types import RoleType
    +from camel.retrievers import AutoRetriever
    +from camel.types import StorageType
    +
    +
    +def single_agent(query: str) -> str:
    +    # Set agent role
    +    assistant_sys_msg = BaseMessage(
    +        role_name="Assistant",
    +        role_type=RoleType.ASSISTANT,
    +        meta_dict=None,
    +        content="""You are a helpful assistant to answer question,
    +         I will give you the Original Query and Retrieved Context,
    +        answer the Original Query based on the Retrieved Context,
    +        if you can't answer the question just say I don't know.""",
    +    )
    +
    +    # Add auto retriever
    +    auto_retriever = AutoRetriever(
    +        url_and_api_key=(
    +            "./milvus_demo.db",  # Your Milvus connection URI
    +            "",  # Your Milvus token
    +        ),
    +        storage_type=StorageType.MILVUS,
    +        embedding_model=embedding_instance,
    +    )
    +
    +    retrieved_info = auto_retriever.run_vector_retriever(
    +        query=query,
    +        content_input_paths=[
    +            "local_data/camel paper.pdf",  # example local path
    +            "https://www.camel-ai.org/",  # example remote url
    +        ],
    +        # vector_storage_local_path="storage_default_run",
    +        top_k=1,
    +        return_detailed_info=True,
    +    )
    +
    +    # Pass the retrieved infomation to agent
    +    user_msg = BaseMessage.make_user_message(role_name="User", content=retrieved_info)
    +    agent = ChatAgent(assistant_sys_msg)
    +
    +    # Get response
    +    assistant_response = agent.step(user_msg)
    +    return assistant_response.msg.content
    +
    +
    +print(single_agent("What is CAMEL-AI"))
    +
    +
    CAMEL-AI is an open-source community dedicated to the study of autonomous and communicative agents. It provides, implements, and supports various types of agents, tasks, prompts, models, datasets, and simulated environments to facilitate research in this field.
    +
    +

    4.使用 Auto RAG 進行角色扮演

    在本節中,我們將展示如何透過應用Function Calling 來結合RETRIEVAL_FUNCSRolePlaying

    +
    from typing import List
    +from colorama import Fore
    +
    +from camel.agents.chat_agent import FunctionCallingRecord
    +from camel.configs import ChatGPTConfig
    +from camel.functions import (
    +    MATH_FUNCS,
    +    RETRIEVAL_FUNCS,
    +)
    +from camel.societies import RolePlaying
    +from camel.types import ModelType
    +from camel.utils import print_text_animated
    +
    +
    +def role_playing_with_rag(
    +    task_prompt, model_type=ModelType.GPT_4O, chat_turn_limit=10
    +) -> None:
    +    task_prompt = task_prompt
    +
    +    user_model_config = ChatGPTConfig(temperature=0.0)
    +
    +    function_list = [
    +        *MATH_FUNCS,
    +        *RETRIEVAL_FUNCS,
    +    ]
    +    assistant_model_config = ChatGPTConfig(
    +        tools=function_list,
    +        temperature=0.0,
    +    )
    +
    +    role_play_session = RolePlaying(
    +        assistant_role_name="Searcher",
    +        user_role_name="Professor",
    +        assistant_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=assistant_model_config,
    +            tools=function_list,
    +        ),
    +        user_agent_kwargs=dict(
    +            model_type=model_type,
    +            model_config=user_model_config,
    +        ),
    +        task_prompt=task_prompt,
    +        with_task_specify=False,
    +    )
    +
    +    print(
    +        Fore.GREEN
    +        + f"AI Assistant sys message:\n{role_play_session.assistant_sys_msg}\n"
    +    )
    +    print(Fore.BLUE + f"AI User sys message:\n{role_play_session.user_sys_msg}\n")
    +
    +    print(Fore.YELLOW + f"Original task prompt:\n{task_prompt}\n")
    +    print(
    +        Fore.CYAN
    +        + f"Specified task prompt:\n{role_play_session.specified_task_prompt}\n"
    +    )
    +    print(Fore.RED + f"Final task prompt:\n{role_play_session.task_prompt}\n")
    +
    +    n = 0
    +    input_msg = role_play_session.init_chat()
    +    while n < chat_turn_limit:
    +        n += 1
    +        assistant_response, user_response = role_play_session.step(input_msg)
    +
    +        if assistant_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI Assistant terminated. Reason: "
    +                    f"{assistant_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +        if user_response.terminated:
    +            print(
    +                Fore.GREEN
    +                + (
    +                    "AI User terminated. "
    +                    f"Reason: {user_response.info['termination_reasons']}."
    +                )
    +            )
    +            break
    +
    +        # Print output from the user
    +        print_text_animated(Fore.BLUE + f"AI User:\n\n{user_response.msg.content}\n")
    +
    +        # Print output from the assistant, including any function
    +        # execution information
    +        print_text_animated(Fore.GREEN + "AI Assistant:")
    +        tool_calls: List[FunctionCallingRecord] = assistant_response.info["tool_calls"]
    +        for func_record in tool_calls:
    +            print_text_animated(f"{func_record}")
    +        print_text_animated(f"{assistant_response.msg.content}\n")
    +
    +        if "CAMEL_TASK_DONE" in user_response.msg.content:
    +            break
    +
    +        input_msg = assistant_response.msg
    +
    +

    使用定義的 retriever 函式執行角色扮演:

    +
    role_playing_with_rag(
    +    task_prompt="""What is the main termination reasons for AI Society
    +                   dataset, how many number of messages did camel decided to
    +                   limit, what's the value plus 100? You should refer to the
    +                   content in path camel/local_data/camel paper.pdf"""
    +)
    +
    +
    AI Assistant sys message:
    +BaseMessage(role_name='Searcher', role_type=<RoleType.ASSISTANT: 'assistant'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content="===== RULES OF ASSISTANT =====\nNever forget you are a Searcher and I am a Professor. Never flip roles! Never instruct me!\nWe share a common interest in collaborating to successfully complete a task.\nYou must help me to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?. Never forget our task!\nI must instruct you based on your expertise and my needs to complete the task.\n\nI must give you one instruction at a time.\nYou must write a specific solution that appropriately solves the requested instruction and explain your solutions.\nYou must decline my instruction honestly if you cannot perform the instruction due to physical, moral, legal reasons or your capability and explain the reasons.\nUnless I say the task is completed, you should always start with:\n\nSolution: <YOUR_SOLUTION>\n\n<YOUR_SOLUTION> should be very specific, include detailed explanations and provide preferable detailed implementations and examples and lists for task-solving.\nAlways end <YOUR_SOLUTION> with: Next request.")
    +
    +AI User sys message:
    +BaseMessage(role_name='Professor', role_type=<RoleType.USER: 'user'>, meta_dict={'task': "What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?", 'assistant_role': 'Searcher', 'user_role': 'Professor'}, content='===== RULES OF USER =====\nNever forget you are a Professor and I am a Searcher. Never flip roles! You will always instruct me.\nWe share a common interest in collaborating to successfully complete a task.\nI must help you to complete the task.\nHere is the task: What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what\'s the value plus 100?. Never forget our task!\nYou must instruct me based on my expertise and your needs to solve the task ONLY in the following two ways:\n\n1. Instruct with a necessary input:\nInstruction: <YOUR_INSTRUCTION>\nInput: <YOUR_INPUT>\n\n2. Instruct without any input:\nInstruction: <YOUR_INSTRUCTION>\nInput: None\n\nThe "Instruction" describes a task or question. The paired "Input" provides further context or information for the requested "Instruction".\n\nYou must give me one instruction at a time.\nI must write a response that appropriately solves the requested instruction.\nI must decline your instruction honestly if I cannot perform the instruction due to physical, moral, legal reasons or my capability and explain the reasons.\nYou should instruct me not ask me questions.\nNow you must start to instruct me using the two ways described above.\nDo not add anything else other than your instruction and the optional corresponding input!\nKeep giving me instructions and necessary inputs until you think the task is completed.\nWhen the task is completed, you must only reply with a single word <CAMEL_TASK_DONE>.\nNever say <CAMEL_TASK_DONE> unless my responses have solved your task.')
    +
    +Original task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +Specified task prompt:
    +None
    +
    +Final task prompt:
    +What is the main termination reasons for AI Society dataset, how many number of messages did camel decided to limit, what's the value plus 100?
    +
    +
    +
    +AI User:
    +
    +Instruction: Provide a summary of the main termination reasons in the AI Society dataset.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: local_retriever
    +    Args: {'query': 'main termination reasons for AI Society dataset'}
    +    Result: Original Query:
    +{main termination reasons for AI Society dataset}
    +Retrieved Context:
    +Next we examine the conversation termination reasons for both AI Society and Code datasets. As can be seen in Figure 8, the main termination reasons for AI Society dataset is Assistant Instruct whereas for Code it is Token Limit. The latter is expected as the since responses that contain code tend to be long. It is also interesting to note that in both datasets, the termination due to Maximum Number of Messages is low indicating that the limit of 40 maximum messages is reasonable. Our decision t
    +
    +Solution: The main termination reason for the AI Society dataset is "Assistant Instruct." This indicates that conversations in the AI Society dataset typically end when the assistant is instructed to terminate the conversation.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Identify the number of messages that the camel decided to limit in the context provided.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Solution: The context provided from the local retriever indicates that the camel decided to limit the number of messages to a maximum of 40 messages. This is mentioned in the retrieved context where it states that the termination due to Maximum Number of Messages is low, indicating that the limit of 40 maximum messages is reasonable.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +Instruction: Calculate the value of the message limit plus 100.
    +Input: None
    +
    +
    +AI Assistant:
    +
    +Function Execution: add
    +    Args: {'a': 40, 'b': 100}
    +    Result: 140
    +
    +Solution: The value of the message limit plus 100 is 140.
    +
    +Next request.
    +
    +
    +AI User:
    +
    +CAMEL_TASK_DONE
    +
    +
    +AI Assistant:
    +
    +Solution: Understood, the task is completed.
    +
    +Next request.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.json new file mode 100644 index 000000000..aca0b9461 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus cohere pandas numpy tqdm\n","import cohere\nimport pandas\nimport numpy as np\nfrom tqdm import tqdm\nfrom pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility\n","FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json' # The SQuAD dataset url\nCOLLECTION_NAME = 'question_answering_db' # Collection name\nDIMENSION = 1024 # Embeddings size, cohere embeddings default to 4096 with the large model\nCOUNT = 5000 # How many questions to embed and insert into Milvus\nBATCH_SIZE = 96 # How large of batches to use for embedding and insertion\nMILVUS_HOST = 'localhost' # Milvus server URI\nMILVUS_PORT = '19530'\nCOHERE_API_KEY = 'replace-this-with-the-cohere-api-key' # API key obtained from Cohere\n","# Download the dataset\ndataset = pandas.read_json(FILE)\n\n# Clean up the dataset by grabbing all the question answer pairs\nsimplified_records = []\nfor x in dataset['data']:\n for y in x['paragraphs']:\n for z in y['qas']:\n if len(z['answers']) != 0:\n simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})\n\n# Grab the amount of records based on COUNT\nsimplified_records = pandas.DataFrame.from_records(simplified_records)\nsimplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)\n\n# Check the length of the cleaned dataset matches count\nprint(len(simplified_records))\n","5000\n","# Connect to Milvus Database\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n\n# Remove collection if it already exists\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n\n# Create collection which includes the id, title, and embedding.\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),\n FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n\n# Create an IVF_FLAT index for collection.\nindex_params = {\n 'metric_type':'IP',\n 'index_type':\"IVF_FLAT\",\n 'params':{\"nlist\": 1024}\n}\ncollection.create_index(field_name=\"original_question_embedding\", index_params=index_params)\ncollection.load()\n","# Set up a co:here client.\ncohere_client = cohere.Client(COHERE_API_KEY)\n\n# Extract embeddings from questions using Cohere\ndef embed(texts, input_type):\n res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)\n return res.embeddings\n\n# Insert each question, answer, and qustion embedding\ntotal = pandas.DataFrame()\nfor batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):\n questions = batch['question'].tolist()\n embeddings = embed(questions, \"search_document\")\n \n data = [\n {\n 'original_question': x,\n 'answer': batch['answer'].tolist()[i],\n 'original_question_embedding': embeddings[i]\n } for i, x in enumerate(questions)\n ]\n\n collection.insert(data=data)\n\ntime.sleep(10)\n","# Search the cluster for an answer to a question text\ndef search(text, top_k = 5):\n\n # AUTOINDEX does not require any search params \n search_params = {}\n\n results = collection.search(\n data = embed([text], \"search_query\"), # Embeded the question\n anns_field='original_question_embedding',\n param=search_params,\n limit = top_k, # Limit to top_k results per search\n output_fields=['original_question', 'answer'] # Include the original question and answer in the result\n )\n\n distances = results[0].distances\n entities = [ x.entity.to_dict()['entity'] for x in results[0] ]\n\n ret = [ {\n \"answer\": x[1][\"answer\"],\n \"distance\": x[0],\n \"original_question\": x[1]['original_question']\n } for x in zip(distances, entities)]\n\n return ret\n\n# Ask these questions\nsearch_questions = ['What kills bacteria?', 'What\\'s the biggest dog?']\n\n# Print out the results in order of [answer, similarity score, original question]\n\nret = [ { \"question\": x, \"candidates\": search(x) } for x in search_questions ]\n","# Output\n#\n# [\n# {\n# \"question\": \"What kills bacteria?\",\n# \"candidates\": [\n# {\n# \"answer\": \"farming\",\n# \"distance\": 0.6261022090911865,\n# \"original_question\": \"What makes bacteria resistant to antibiotic treatment?\"\n# },\n# {\n# \"answer\": \"Phage therapy\",\n# \"distance\": 0.6093736886978149,\n# \"original_question\": \"What has been talked about to treat resistant bacteria?\"\n# },\n# {\n# \"answer\": \"oral contraceptives\",\n# \"distance\": 0.5902313590049744,\n# \"original_question\": \"In therapy, what does the antibacterial interact with?\"\n# },\n# {\n# \"answer\": \"slowing down the multiplication of bacteria or killing the bacteria\",\n# \"distance\": 0.5874154567718506,\n# \"original_question\": \"How do antibiotics work?\"\n# },\n# {\n# \"answer\": \"in intensive farming to promote animal growth\",\n# \"distance\": 0.5667208433151245,\n# \"original_question\": \"Besides in treating human disease where else are antibiotics used?\"\n# }\n# ]\n# },\n# {\n# \"question\": \"What's the biggest dog?\",\n# \"candidates\": [\n# {\n# \"answer\": \"English Mastiff\",\n# \"distance\": 0.7875324487686157,\n# \"original_question\": \"What breed was the largest dog known to have lived?\"\n# },\n# {\n# \"answer\": \"forest elephants\",\n# \"distance\": 0.5886962413787842,\n# \"original_question\": \"What large animals reside in the national park?\"\n# },\n# {\n# \"answer\": \"Rico\",\n# \"distance\": 0.5634892582893372,\n# \"original_question\": \"What is the name of the dog that could ID over 200 things?\"\n# },\n# {\n# \"answer\": \"Iditarod Trail Sled Dog Race\",\n# \"distance\": 0.546872615814209,\n# \"original_question\": \"Which dog-sled race in Alaska is the most famous?\"\n# },\n# {\n# \"answer\": \"part of the family\",\n# \"distance\": 0.5387814044952393,\n# \"original_question\": \"Most people today describe their dogs as what?\"\n# }\n# ]\n# }\n# ]\n\n"],"headingContent":"Question Answering Using Milvus and Cohere","anchorList":[{"label":"使用 Milvus 和 Cohere 進行問題回答","href":"Question-Answering-Using-Milvus-and-Cohere","type":1,"isActive":false},{"label":"在您開始之前","href":"Before-you-begin","type":2,"isActive":false},{"label":"參數","href":"Parameters","type":2,"isActive":false},{"label":"準備資料集","href":"Prepare-the-dataset","type":2,"isActive":false},{"label":"建立資料集","href":"Create-a-collection","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data","type":2,"isActive":false},{"label":"詢問問題","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.md new file mode 100644 index 000000000..29e861ff7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_cohere.md @@ -0,0 +1,317 @@ +--- +id: integrate_with_cohere.md +summary: 本頁面將介紹如何使用 Milvus 作為向量資料庫,以及 Hugging Face 作為嵌入系統,來搜尋問題的最佳答案。 +title: 使用 Milvus 和 Cohere 進行問題回答 +--- +

    使用 Milvus 和 Cohere 進行問題回答

    本頁說明如何使用 Milvus 作為向量資料庫,並使用 Cohere 作為嵌入系統,建立一個以 SQuAD 資料集為基礎的問題解答系統。

    +

    在您開始之前

    本頁面的程式碼片段需要安裝pymilvuscoherepandasnumpytqdm。在這些套件中,PYMILVUS是 Milvus 的用戶端。如果您的系統上沒有這些套件,請執行下列指令來安裝它們:

    +
    pip install pymilvus cohere pandas numpy tqdm
    +
    +

    然後您需要載入本指南要使用的模組。

    +
    import cohere
    +import pandas
    +import numpy as np
    +from tqdm import tqdm
    +from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
    +
    +

    參數

    在這裡我們可以找到以下片段所使用的參數。有些參數需要變更,以符合您的環境。每個參數旁都有說明。

    +
    FILE = 'https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v2.0.json'  # The SQuAD dataset url
    +COLLECTION_NAME = 'question_answering_db'  # Collection name
    +DIMENSION = 1024  # Embeddings size, cohere embeddings default to 4096 with the large model
    +COUNT = 5000  # How many questions to embed and insert into Milvus
    +BATCH_SIZE = 96 # How large of batches to use for embedding and insertion
    +MILVUS_HOST = 'localhost'  # Milvus server URI
    +MILVUS_PORT = '19530'
    +COHERE_API_KEY = 'replace-this-with-the-cohere-api-key'  # API key obtained from Cohere
    +
    +

    若要瞭解更多關於本頁面所用模型和資料集的資訊,請參閱co:hereSQuAD

    +

    準備資料集

    在本範例中,我們要使用 Stanford Question Answering Dataset (SQuAD) 作為回答問題的真相來源。這個資料集是以 JSON 檔案的形式出現,我們要使用pandas將它載入。

    +
    # Download the dataset
    +dataset = pandas.read_json(FILE)
    +
    +# Clean up the dataset by grabbing all the question answer pairs
    +simplified_records = []
    +for x in dataset['data']:
    +    for y in x['paragraphs']:
    +        for z in y['qas']:
    +            if len(z['answers']) != 0:
    +                simplified_records.append({'question': z['question'], 'answer': z['answers'][0]['text']})
    +
    +# Grab the amount of records based on COUNT
    +simplified_records = pandas.DataFrame.from_records(simplified_records)
    +simplified_records = simplified_records.sample(n=min(COUNT, len(simplified_records)), random_state = 42)
    +
    +# Check the length of the cleaned dataset matches count
    +print(len(simplified_records))
    +
    +

    輸出應該是資料集中的記錄數

    +
    5000
    +
    +

    建立資料集

    本節將介紹 Milvus 以及為本使用個案設定資料庫。在 Milvus 中,我們需要設定一個資料集並建立索引。

    +
    # Connect to Milvus Database
    +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
    +
    +# Remove collection if it already exists
    +if utility.has_collection(COLLECTION_NAME):
    +    utility.drop_collection(COLLECTION_NAME)
    +
    +# Create collection which includes the id, title, and embedding.
    +fields = [
    +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name='original_question', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='answer', dtype=DataType.VARCHAR, max_length=1000),
    +    FieldSchema(name='original_question_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +]
    +schema = CollectionSchema(fields=fields)
    +collection = Collection(name=COLLECTION_NAME, schema=schema)
    +
    +# Create an IVF_FLAT index for collection.
    +index_params = {
    +    'metric_type':'IP',
    +    'index_type':"IVF_FLAT",
    +    'params':{"nlist": 1024}
    +}
    +collection.create_index(field_name="original_question_embedding", index_params=index_params)
    +collection.load()
    +
    +

    插入資料

    建立資料集後,我們需要開始插入資料。這分為三個步驟

    +
      +
    • 讀取資料、
    • +
    • 嵌入原始問題,以及
    • +
    • 將資料插入我們剛剛在 Milvus 上建立的資料集中。
    • +
    +

    在這個範例中,資料包括原始問題、原始問題的嵌入以及原始問題的答案。

    +
    # Set up a co:here client.
    +cohere_client = cohere.Client(COHERE_API_KEY)
    +
    +# Extract embeddings from questions using Cohere
    +def embed(texts, input_type):
    +    res = cohere_client.embed(texts, model='embed-multilingual-v3.0', input_type=input_type)
    +    return res.embeddings
    +
    +# Insert each question, answer, and qustion embedding
    +total = pandas.DataFrame()
    +for batch in tqdm(np.array_split(simplified_records, (COUNT/BATCH_SIZE) + 1)):
    +    questions = batch['question'].tolist()
    +    embeddings = embed(questions, "search_document")
    +    
    +    data = [
    +        {
    +            'original_question': x,
    +            'answer': batch['answer'].tolist()[i],
    +            'original_question_embedding': embeddings[i]
    +        } for i, x in enumerate(questions)
    +    ]
    +
    +    collection.insert(data=data)
    +
    +time.sleep(10)
    +
    +

    詢問問題

    一旦所有資料都插入 Milvus 資料集中,我們就可以利用問題短語向系統發問,將其嵌入 Cohere,然後在資料集中進行搜尋。

    +
    +

    插入資料後立即執行的搜尋可能會慢一點,因為搜尋未編入索引的資料是以暴力方式進行的。一旦新資料被自動編入索引,搜尋速度就會加快。

    +
    +
    # Search the cluster for an answer to a question text
    +def search(text, top_k = 5):
    +
    +    # AUTOINDEX does not require any search params 
    +    search_params = {}
    +
    +    results = collection.search(
    +        data = embed([text], "search_query"),  # Embeded the question
    +        anns_field='original_question_embedding',
    +        param=search_params,
    +        limit = top_k,  # Limit to top_k results per search
    +        output_fields=['original_question', 'answer']  # Include the original question and answer in the result
    +    )
    +
    +    distances = results[0].distances
    +    entities = [ x.entity.to_dict()['entity'] for x in results[0] ]
    +
    +    ret = [ {
    +        "answer": x[1]["answer"],
    +        "distance": x[0],
    +        "original_question": x[1]['original_question']
    +    } for x in zip(distances, entities)]
    +
    +    return ret
    +
    +# Ask these questions
    +search_questions = ['What kills bacteria?', 'What\'s the biggest dog?']
    +
    +# Print out the results in order of [answer, similarity score, original question]
    +
    +ret = [ { "question": x, "candidates": search(x) } for x in search_questions ]
    +
    +

    輸出應該與下列內容相似:

    +
    # Output
    +#
    +# [
    +#     {
    +#         "question": "What kills bacteria?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "farming",
    +#                 "distance": 0.6261022090911865,
    +#                 "original_question": "What makes bacteria resistant to antibiotic treatment?"
    +#             },
    +#             {
    +#                 "answer": "Phage therapy",
    +#                 "distance": 0.6093736886978149,
    +#                 "original_question": "What has been talked about to treat resistant bacteria?"
    +#             },
    +#             {
    +#                 "answer": "oral contraceptives",
    +#                 "distance": 0.5902313590049744,
    +#                 "original_question": "In therapy, what does the antibacterial interact with?"
    +#             },
    +#             {
    +#                 "answer": "slowing down the multiplication of bacteria or killing the bacteria",
    +#                 "distance": 0.5874154567718506,
    +#                 "original_question": "How do antibiotics work?"
    +#             },
    +#             {
    +#                 "answer": "in intensive farming to promote animal growth",
    +#                 "distance": 0.5667208433151245,
    +#                 "original_question": "Besides in treating human disease where else are antibiotics used?"
    +#             }
    +#         ]
    +#     },
    +#     {
    +#         "question": "What's the biggest dog?",
    +#         "candidates": [
    +#             {
    +#                 "answer": "English Mastiff",
    +#                 "distance": 0.7875324487686157,
    +#                 "original_question": "What breed was the largest dog known to have lived?"
    +#             },
    +#             {
    +#                 "answer": "forest elephants",
    +#                 "distance": 0.5886962413787842,
    +#                 "original_question": "What large animals reside in the national park?"
    +#             },
    +#             {
    +#                 "answer": "Rico",
    +#                 "distance": 0.5634892582893372,
    +#                 "original_question": "What is the name of the dog that could ID over 200 things?"
    +#             },
    +#             {
    +#                 "answer": "Iditarod Trail Sled Dog Race",
    +#                 "distance": 0.546872615814209,
    +#                 "original_question": "Which dog-sled race in Alaska is the most famous?"
    +#             },
    +#             {
    +#                 "answer": "part of the family",
    +#                 "distance": 0.5387814044952393,
    +#                 "original_question": "Most people today describe their dogs as what?"
    +#             }
    +#         ]
    +#     }
    +# ]
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.json new file mode 100644 index 000000000..6345fefef --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"dspy-ai[milvus]\"\n$ pip install -U pymilvus\n","from dspy.datasets import HotPotQA\n\n# Load the dataset.\ndataset = HotPotQA(\n train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0\n)\n\n# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.\ntrainset = [x.with_inputs(\"question\") for x in dataset.train]\ndevset = [x.with_inputs(\"question\") for x in dataset.dev]\n","import requests\nimport os\n\nos.environ[\"OPENAI_API_KEY\"] = \"\"\nMILVUS_URI = \"example.db\"\nMILVUS_TOKEN = \"\"\n\nfrom pymilvus import MilvusClient, DataType, Collection\nfrom dspy.retrieve.milvus_rm import openai_embedding_function\n\nclient = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)\n\nif \"dspy_example\" not in client.list_collections():\n client.create_collection(\n collection_name=\"dspy_example\",\n overwrite=True,\n dimension=1536,\n primary_field_name=\"id\",\n vector_field_name=\"embedding\",\n id_type=\"int\",\n metric_type=\"IP\",\n max_length=65535,\n enable_dynamic=True,\n )\ntext = requests.get(\n \"https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt\"\n).text\n\nfor idx, passage in enumerate(text.split(\"\\n\")):\n if len(passage) == 0:\n continue\n client.insert(\n collection_name=\"dspy_example\",\n data=[\n {\n \"id\": idx,\n \"embedding\": openai_embedding_function(passage)[0],\n \"text\": passage,\n }\n ],\n )\n","from dspy.retrieve.milvus_rm import MilvusRM\nimport dspy\n\nretriever_model = MilvusRM(\n collection_name=\"dspy_example\",\n uri=MILVUS_URI,\n token=MILVUS_TOKEN, # ignore this if no token is required for Milvus connection\n embedding_function=openai_embedding_function,\n)\nturbo = dspy.OpenAI(model=\"gpt-3.5-turbo\")\ndspy.settings.configure(lm=turbo)\n","class GenerateAnswer(dspy.Signature):\n \"\"\"Answer questions with short factoid answers.\"\"\"\n\n context = dspy.InputField(desc=\"may contain relevant facts\")\n question = dspy.InputField()\n answer = dspy.OutputField(desc=\"often between 1 and 5 words\")\n","class RAG(dspy.Module):\n def __init__(self, rm):\n super().__init__()\n self.retrieve = rm\n\n # This signature indicates the task imposed on the COT module.\n self.generate_answer = dspy.ChainOfThought(GenerateAnswer)\n\n def forward(self, question):\n # Use milvus_rm to retrieve context for the question.\n context = self.retrieve(question).passages\n # COT module takes \"context, query\" and output \"answer\".\n prediction = self.generate_answer(context=context, question=question)\n return dspy.Prediction(\n context=[item.long_text for item in context], answer=prediction.answer\n )\n","rag = RAG(retriever_model)\nprint(rag(\"who write At My Window\").answer)\n","from dspy.evaluate.evaluate import Evaluate\nfrom dspy.datasets import HotPotQA\n\nevaluate_on_hotpotqa = Evaluate(\n devset=devset, num_threads=1, display_progress=False, display_table=5\n)\n\nmetric = dspy.evaluate.answer_exact_match\nscore = evaluate_on_hotpotqa(rag, metric=metric)\nprint(\"rag:\", score)\n","from dspy.teleprompt import BootstrapFewShot\n\n# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.\n\n\ndef validate_context_and_answer(example, pred, trace=None):\n answer_EM = dspy.evaluate.answer_exact_match(example, pred)\n answer_PM = dspy.evaluate.answer_passage_match(example, pred)\n return answer_EM and answer_PM\n\n\n# Set up a basic teleprompter, which will compile our RAG program.\nteleprompter = BootstrapFewShot(metric=validate_context_and_answer)\n\n# Compile!\ncompiled_rag = teleprompter.compile(rag, trainset=trainset)\n\n# Now compiled_rag is optimized and ready to answer your new question!\n# Now, let’s evaluate the compiled RAG program.\nscore = evaluate_on_hotpotqa(compiled_rag, metric=metric)\nprint(score)\nprint(\"compile_rag:\", score)\n"],"headingContent":"Integrate Milvus with DSPy","anchorList":[{"label":"整合 Milvus 與 DSPy","href":"Integrate-Milvus-with-DSPy","type":1,"isActive":false},{"label":"什麼是 DSPy","href":"What-is-DSPy","type":2,"isActive":false},{"label":"使用 DSPy 的優點","href":"Benefits-of-using-DSPy","type":2,"isActive":false},{"label":"模組","href":"Modules","type":2,"isActive":false},{"label":"為什麼在 DSPy 中使用 Milvus","href":"Why-Milvus-in-DSPy","type":2,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false},{"label":"總結","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.md new file mode 100644 index 000000000..e2d756a31 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_dspy.md @@ -0,0 +1,276 @@ +--- +id: integrate_with_dspy.md +summary: 本指南展示了如何使用DSPy的retriever模組之一MilvusRM來優化RAG程式。 +title: 整合 Milvus 與 DSPy +--- +

    整合 Milvus 與 DSPy

    Open In Colab +GitHub Repository

    +

    什麼是 DSPy

    DSPy 由 Stanford NLP Group 推出,是一個突破性的程式框架,專門用來優化語言模型內的提示和權重,尤其是在大型語言模型 (LLM) 整合於管道多個階段的情況下,更顯重要。DSPy 採用了以學習為基礎的方法,有別於依賴手動製作和調整的傳統提示工程技術。透過吸收問答範例,DSPy 可針對特定任務動態產生最佳化的提示。這種創新的方法能夠無縫地重新組合整個管道,省去持續手動調整提示的需要。DSPy 的 Pythonic 語法提供各種可組合與宣告式模組,簡化了 LLM 的指令。

    +

    使用 DSPy 的優點

      +
    • 程式設計方法:DSPy 將管道抽象為文字轉換圖形,而不只是提示 LLM,為 LM 管道開發提供了系統化的程式設計方法。其宣告式模組可進行結構化設計與最佳化,取代傳統提示範本的試誤法。
    • +
    • 效能提升:DSPy 證實比現有方法有顯著的效能提升。透過案例研究,它的表現優於標準提示和專家建立的示範,即使編譯成較小的 LM 模型,也能展示其多功能性和有效性。
    • +
    • 模組化抽象:DSPy 有效地抽象出 LM 管線開發的複雜層面,例如分解、微調與模型選擇。有了 DSPy,一個簡潔的程式可以無縫地轉換成各種模型的指令,例如 GPT-4、Llama2-13b 或 T5-base,從而簡化開發過程並提昇效能。
    • +
    +

    模組

    建構 LLM 管道有許多元件。在此,我們將介紹一些關鍵元件,以提供對 DSPy 運作方式的高層次瞭解。

    +

    + + DSPy Modules + DSPy 模組

    +

    簽名:DSPy 中的簽章 (Signature) 是宣告性的規格,概述模組的輸入/輸出行為,在執行任務時引導語言模型。 模組 (Module):DSPy 模組是程式利用語言模型 (LM) 的基本元件。它們抽象出各種提示技術,例如連鎖思考或 ReAct,並可適應處理任何 DSPy Signature。這些模組具有可學習的參數,以及處理輸入和產生輸出的能力,可以結合成更大的程式,其靈感來自 PyTorch 中的 NN 模組,但專為 LM 應用程式量身打造。 優化器:DSPy 中的優化器可微調 DSPy 程式的參數,例如提示和 LLM 權重,以最大化指定的準確度等指標,進而提升程式效率。

    +

    為什麼在 DSPy 中使用 Milvus

    DSPy 是一個強大的程式設計框架,可提升 RAG 應用程式。這類應用程式需要擷取有用的資訊來提升答案品質,而這需要向量資料庫。Milvus 是知名的開放原始碼向量資料庫,可提升效能與擴充性。有了 DSPy 中的retriever 模組 MilvusRM,整合 Milvus 變得無縫。現在,開發人員可以利用 Milvus 強大的向量搜尋功能,使用 DSPy 輕鬆定義和優化 RAG 程式。這項合作結合了 DSPy 的程式設計能力與 Milvus 的搜尋功能,讓 RAG 應用程式更有效率且更具擴充性。

    +

    範例

    現在,讓我們以一個快速的範例來說明如何在 DSPy 中利用 Milvus 來優化 RAG 應用程式。

    +

    先決條件

    在建立 RAG 應用程式之前,先安裝 DSPy 和 PyMilvus。

    +
    $ pip install "dspy-ai[milvus]"
    +$ pip install -U pymilvus
    +
    +
    +如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要**重新啟動運行時間** (點選螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。
    +

    載入資料集

    在本範例中,我們使用 HotPotQA 這個複雜問題-答案對的集合作為訓練資料集。我們可以透過 HotPotQA 類載入它們。

    +
    from dspy.datasets import HotPotQA
    +
    +# Load the dataset.
    +dataset = HotPotQA(
    +    train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0
    +)
    +
    +# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
    +trainset = [x.with_inputs("question") for x in dataset.train]
    +devset = [x.with_inputs("question") for x in dataset.dev]
    +
    +

    將資料擷取至 Milvus 向量資料庫

    將上下文資訊擷取至 Milvus 資料庫,以便進行向量檢索。這個集合應該有embedding 欄位和text 欄位。在這種情況下,我們使用 OpenAI 的text-embedding-3-small 模型作為預設的查詢嵌入函式。

    +
    import requests
    +import os
    +
    +os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"
    +MILVUS_URI = "example.db"
    +MILVUS_TOKEN = ""
    +
    +from pymilvus import MilvusClient, DataType, Collection
    +from dspy.retrieve.milvus_rm import openai_embedding_function
    +
    +client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)
    +
    +if "dspy_example" not in client.list_collections():
    +    client.create_collection(
    +        collection_name="dspy_example",
    +        overwrite=True,
    +        dimension=1536,
    +        primary_field_name="id",
    +        vector_field_name="embedding",
    +        id_type="int",
    +        metric_type="IP",
    +        max_length=65535,
    +        enable_dynamic=True,
    +    )
    +text = requests.get(
    +    "https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt"
    +).text
    +
    +for idx, passage in enumerate(text.split("\n")):
    +    if len(passage) == 0:
    +        continue
    +    client.insert(
    +        collection_name="dspy_example",
    +        data=[
    +            {
    +                "id": idx,
    +                "embedding": openai_embedding_function(passage)[0],
    +                "text": passage,
    +            }
    +        ],
    +    )
    +
    +

    定義 MilvusRM。

    現在,您需要定義 MilvusRM。

    +
    from dspy.retrieve.milvus_rm import MilvusRM
    +import dspy
    +
    +retriever_model = MilvusRM(
    +    collection_name="dspy_example",
    +    uri=MILVUS_URI,
    +    token=MILVUS_TOKEN,  # ignore this if no token is required for Milvus connection
    +    embedding_function=openai_embedding_function,
    +)
    +turbo = dspy.OpenAI(model="gpt-3.5-turbo")
    +dspy.settings.configure(lm=turbo)
    +
    +

    建立簽章

    現在我們已經載入資料,讓我們開始定義管道中子任務的簽章。我們可以定義我們簡單的輸入question 和輸出answer ,但因為我們正在建立一個 RAG 管道,所以我們會從 Milvus 擷取上下文資訊。因此,讓我們定義我們的簽章為context, question --> answer

    +
    class GenerateAnswer(dspy.Signature):
    +    """Answer questions with short factoid answers."""
    +
    +    context = dspy.InputField(desc="may contain relevant facts")
    +    question = dspy.InputField()
    +    answer = dspy.OutputField(desc="often between 1 and 5 words")
    +
    +

    我們包含contextanswer 欄位的簡短說明,以定義更清楚的指引,說明模型將會接收什麼,應該產生什麼。

    +

    建立管道

    現在,讓我們定義 RAG 管道。

    +
    class RAG(dspy.Module):
    +    def __init__(self, rm):
    +        super().__init__()
    +        self.retrieve = rm
    +
    +        # This signature indicates the task imposed on the COT module.
    +        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)
    +
    +    def forward(self, question):
    +        # Use milvus_rm to retrieve context for the question.
    +        context = self.retrieve(question).passages
    +        # COT module takes "context, query" and output "answer".
    +        prediction = self.generate_answer(context=context, question=question)
    +        return dspy.Prediction(
    +            context=[item.long_text for item in context], answer=prediction.answer
    +        )
    +
    +

    執行管道並取得結果

    現在,我們已經建立了 RAG 管道。讓我們試試並得到結果。

    +
    rag = RAG(retriever_model)
    +print(rag("who write At My Window").answer)
    +
    +
    Townes Van Zandt
    +
    +

    我們可以評估資料集的量化結果。

    +
    from dspy.evaluate.evaluate import Evaluate
    +from dspy.datasets import HotPotQA
    +
    +evaluate_on_hotpotqa = Evaluate(
    +    devset=devset, num_threads=1, display_progress=False, display_table=5
    +)
    +
    +metric = dspy.evaluate.answer_exact_match
    +score = evaluate_on_hotpotqa(rag, metric=metric)
    +print("rag:", score)
    +
    +

    優化管道

    定義這個程式之後,下一步就是編譯。這個過程會更新每個模組內的參數,以提升效能。編譯過程取決於三個關鍵因素:

    +
      +
    • 訓練集:我們會利用訓練資料集中的 20 個問答範例來進行示範。
    • +
    • 驗證指標:我們會建立一個簡單的validate_context_and_answer 公制。此標準可驗證預測答案的準確性,並確保擷取的上下文包含該答案。
    • +
    • 特定優化器 (提詞器):DSPy 的編譯器結合了多個 teleprompter,旨在有效優化您的程式。
    • +
    +
    from dspy.teleprompt import BootstrapFewShot
    +
    +# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.
    +
    +
    +def validate_context_and_answer(example, pred, trace=None):
    +    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
    +    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
    +    return answer_EM and answer_PM
    +
    +
    +# Set up a basic teleprompter, which will compile our RAG program.
    +teleprompter = BootstrapFewShot(metric=validate_context_and_answer)
    +
    +# Compile!
    +compiled_rag = teleprompter.compile(rag, trainset=trainset)
    +
    +# Now compiled_rag is optimized and ready to answer your new question!
    +# Now, let’s evaluate the compiled RAG program.
    +score = evaluate_on_hotpotqa(compiled_rag, metric=metric)
    +print(score)
    +print("compile_rag:", score)
    +
    +

    Ragas 分數從之前的 50.0 增加到 52.0,顯示答案品質有所提升。

    +

    總結

    DSPy 標誌著語言模型互動的一大躍進,透過其可編程介面,有助於演算法和自動最佳化模型提示和權重。利用 DSPy 實作 RAG,可輕鬆適應不同的語言模型或資料集,大幅減少繁瑣的手動介入。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.json new file mode 100644 index 000000000..c3362181a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.json @@ -0,0 +1 @@ +{"codeList":["$ mkdir fastgpt\n$ cd fastgpt\n$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json\n\n# milvus version\n$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml\n# zilliz version\n# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml\n","# Launch the container\n$ docker compose up -d\n# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql\n$ sleep 10\n# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)\n$ docker restart oneapi\n","$ docker compose down\n"],"headingContent":"Deploying FastGPT with Milvus","anchorList":[{"label":"使用 Milvus 部署 FastGPT","href":"Deploying-FastGPT-with-Milvus","type":1,"isActive":false},{"label":"下載 docker-compose.yml","href":"Download-docker-composeyml","type":2,"isActive":false},{"label":"啟動容器","href":"Launch-the-Container","type":2,"isActive":false},{"label":"存取 OneAPI 來新增模型","href":"Access-OneAPI-to-Add-Models","type":2,"isActive":false},{"label":"設定代號","href":"Setting-Tokens","type":2,"isActive":false},{"label":"存取 FastGPT","href":"Accessing-FastGPT","type":2,"isActive":false},{"label":"停止容器","href":"Stop-the-Container","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.md new file mode 100644 index 000000000..64042ffa0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_fastgpt.md @@ -0,0 +1,143 @@ +--- +id: integrate_with_fastgpt.md +summary: '本教學將引導您如何使用 [Milvus](https://milvus.io/),快速部署自己專屬的 FastGPT 應用程式。' +title: 使用 Milvus 部署 FastGPT +--- +

    使用 Milvus 部署 FastGPT

    FastGPT是建構在 LLM 大型語言模型上的知識型問答系統,可為資料處理和模型調用提供即時可用的功能。此外,它還可以透過 Flow 可視化來協調工作流程,從而促進複雜問題和回答情境的處理。本教學將引導您如何使用Milvus 快速部署自己專屬的 FastGPT 應用程式。

    +

    下載 docker-compose.yml

    確保您已經安裝Docker Compose
    +執行以下指令下載 docker-compose.yml 檔案。

    +
    $ mkdir fastgpt
    +$ cd fastgpt
    +$ curl -O https://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/config.json
    +
    +# milvus version
    +$ curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-milvus.yml
    +# zilliz version
    +# curl -o docker-compose.yml https://raw.githubusercontent.com/labring/FastGPT/main/files/docker/docker-compose-zilliz.yml
    +
    +
    +

    如果您使用的是 Zilliz 版本,請調整 docker-compose.yml 檔案中的MILVUS_ADDRESSMILVUS_TOKEN link 參數,與Zilliz Cloud 中的Public Endpoint 和 Api key對應。

    +
    +

    啟動容器

    在與 docker-compose.yml 相同的目錄下執行。確保 docker-compose 的版本最好在 2.17 以上,否則某些自動化指令可能無法運作。

    +
    # Launch the container
    +$ docker compose up -d
    +# Wait for 10s, OneAPI typically needs to restart a few times to initially connect to Mysql
    +$ sleep 10
    +# Restart oneapi (Due to certain issues with the default Key of OneAPI, it will display 'channel not found' if not restarted, this can be temporarily resolved by manually restarting once, while waiting for the author's fix)
    +$ docker restart oneapi
    +
    +

    存取 OneAPI 來新增模型

    OneAPI 的存取網址是ip:3001 。預設使用者名稱為 root,密碼為 123456。您可以在登入後更改密碼。
    +以 OpenAI 的模型為例,點選「Channel」索引標籤,在「Models」下選擇您的聊天模型和嵌入模型。
    +在「密碼」一欄輸入您的OpenAI API密碼。
    +如需使用 OpenAI 以外的模型以及更多資訊,請參閱One API

    +

    設定代號

    按一下「Token」索引標籤。預設情況下,有一個代號Initial Root Token 。您也可以自行建立新的代號並設定配額。
    +點選「Copy」你的代碼,確保這個代碼的值與在 docker-compose.yml 檔案中設定的CHAT_API_KEY 值相符。

    +

    存取 FastGPT

    目前 FastGPT 可以在ip:3000 直接存取 (請注意防火牆)。登入的使用者名稱是 root,密碼則是在 docker-compose.yml 環境變數中設定的DEFAULT_ROOT_PSW 。如果您需要域名訪問,您需要自行安裝和設定Nginx

    +

    停止容器

    執行以下指令來停止容器。

    +
    $ docker compose down
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.json new file mode 100644 index 000000000..d3b27ad9e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.json @@ -0,0 +1 @@ +{"codeList":["! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import os\nimport urllib.request\n\nurl = \"https://www.gutenberg.org/cache/epub/7785/pg7785.txt\"\nfile_path = \"./davinci.txt\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\n","from haystack import Pipeline\nfrom haystack.components.converters import MarkdownToDocument\nfrom haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder\nfrom haystack.components.preprocessors import DocumentSplitter\nfrom haystack.components.writers import DocumentWriter\nfrom haystack.utils import Secret\n\nfrom milvus_haystack import MilvusDocumentStore\nfrom milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever\n\n\ndocument_store = MilvusDocumentStore(\n connection_args={\"uri\": \"./milvus.db\"},\n # connection_args={\"uri\": \"http://localhost:19530\"},\n # connection_args={\"uri\": YOUR_ZILLIZ_CLOUD_URI, \"token\": Secret.from_env_var(\"ZILLIZ_CLOUD_API_KEY\")},\n drop_old=True,\n)\n","indexing_pipeline = Pipeline()\nindexing_pipeline.add_component(\"converter\", MarkdownToDocument())\nindexing_pipeline.add_component(\n \"splitter\", DocumentSplitter(split_by=\"sentence\", split_length=2)\n)\nindexing_pipeline.add_component(\"embedder\", OpenAIDocumentEmbedder())\nindexing_pipeline.add_component(\"writer\", DocumentWriter(document_store))\nindexing_pipeline.connect(\"converter\", \"splitter\")\nindexing_pipeline.connect(\"splitter\", \"embedder\")\nindexing_pipeline.connect(\"embedder\", \"writer\")\nindexing_pipeline.run({\"converter\": {\"sources\": [file_path]}})\n\nprint(\"Number of documents:\", document_store.count_documents())\n","question = 'Where is the painting \"Warrior\" currently stored?'\n\nretrieval_pipeline = Pipeline()\nretrieval_pipeline.add_component(\"embedder\", OpenAITextEmbedder())\nretrieval_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nretrieval_pipeline.connect(\"embedder\", \"retriever\")\n\nretrieval_results = retrieval_pipeline.run({\"embedder\": {\"text\": question}})\n\nfor doc in retrieval_results[\"retriever\"][\"documents\"]:\n print(doc.content)\n print(\"-\" * 10)\n","from haystack.utils import Secret\nfrom haystack.components.builders import PromptBuilder\nfrom haystack.components.generators import OpenAIGenerator\n\nprompt_template = \"\"\"Answer the following query based on the provided context. If the context does\n not include an answer, reply with 'I don't know'.\\n\n Query: {{query}}\n Documents:\n {% for doc in documents %}\n {{ doc.content }}\n {% endfor %}\n Answer:\n \"\"\"\n\nrag_pipeline = Pipeline()\nrag_pipeline.add_component(\"text_embedder\", OpenAITextEmbedder())\nrag_pipeline.add_component(\n \"retriever\", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)\n)\nrag_pipeline.add_component(\"prompt_builder\", PromptBuilder(template=prompt_template))\nrag_pipeline.add_component(\n \"generator\",\n OpenAIGenerator(\n api_key=Secret.from_token(os.getenv(\"OPENAI_API_KEY\")),\n generation_kwargs={\"temperature\": 0},\n ),\n)\nrag_pipeline.connect(\"text_embedder.embedding\", \"retriever.query_embedding\")\nrag_pipeline.connect(\"retriever.documents\", \"prompt_builder.documents\")\nrag_pipeline.connect(\"prompt_builder\", \"generator\")\n\nresults = rag_pipeline.run(\n {\n \"text_embedder\": {\"text\": question},\n \"prompt_builder\": {\"query\": question},\n }\n)\nprint(\"RAG answer:\", results[\"generator\"][\"replies\"][0])\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and Haystack","anchorList":[{"label":"使用 Milvus 和 Haystack 的檢索-擴充世代 (RAG)","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-Haystack","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-the-data","type":2,"isActive":false},{"label":"建立索引管道","href":"Create-the-indexing-Pipeline","type":2,"isActive":false},{"label":"建立檢索管道","href":"Create-the-retrieval-pipeline","type":2,"isActive":false},{"label":"建立 RAG 管道","href":"Create-the-RAG-pipeline","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.md new file mode 100644 index 000000000..8f37e8c54 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_haystack.md @@ -0,0 +1,254 @@ +--- +id: integrate_with_haystack.md +summary: 本指南示範如何使用 Haystack 和 Milvus 建立檢索增強世代 (RAG) 系統。 +title: 使用 Milvus 和 Haystack 的檢索-擴充世代 (RAG) +--- +

    使用 Milvus 和 Haystack 的檢索-擴充世代 (RAG)

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 Haystack 和 Milvus 建立一個檢索-增強生成 (RAG) 系統。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示產生新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    Haystack是 deepset 開放源碼的 Python 框架,用於使用大型語言模型 (LLM) 建立自訂應用程式。Milvus是世界上最先進的開放原始碼向量資料庫,用於嵌入相似性搜尋和人工智能應用程式。

    +

    先決條件

    執行本筆記本之前,請確定您已安裝下列相依性:

    +
    ! pip install --upgrade --quiet pymilvus milvus-haystack markdown-it-py mdit_plain
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面頂端的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    我們將使用 OpenAI 的模型。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    準備資料

    我們使用一個有關Leonardo Da Vinci的線上內容,作為我們 RAG 管道的私人知識儲存庫,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載並儲存為本機文字檔。

    +
    import os
    +import urllib.request
    +
    +url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
    +file_path = "./davinci.txt"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +
    +

    建立索引管道

    建立一個索引管道,將文字轉換成文件、分割成句子並嵌入其中。然後將文件寫入 Milvus 文件儲存庫。

    +
    from haystack import Pipeline
    +from haystack.components.converters import MarkdownToDocument
    +from haystack.components.embedders import OpenAIDocumentEmbedder, OpenAITextEmbedder
    +from haystack.components.preprocessors import DocumentSplitter
    +from haystack.components.writers import DocumentWriter
    +from haystack.utils import Secret
    +
    +from milvus_haystack import MilvusDocumentStore
    +from milvus_haystack.milvus_embedding_retriever import MilvusEmbeddingRetriever
    +
    +
    +document_store = MilvusDocumentStore(
    +    connection_args={"uri": "./milvus.db"},
    +    # connection_args={"uri": "http://localhost:19530"},
    +    # connection_args={"uri": YOUR_ZILLIZ_CLOUD_URI, "token": Secret.from_env_var("ZILLIZ_CLOUD_API_KEY")},
    +    drop_old=True,
    +)
    +
    +
    +

    對於 connection_args:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +
    indexing_pipeline = Pipeline()
    +indexing_pipeline.add_component("converter", MarkdownToDocument())
    +indexing_pipeline.add_component(
    +    "splitter", DocumentSplitter(split_by="sentence", split_length=2)
    +)
    +indexing_pipeline.add_component("embedder", OpenAIDocumentEmbedder())
    +indexing_pipeline.add_component("writer", DocumentWriter(document_store))
    +indexing_pipeline.connect("converter", "splitter")
    +indexing_pipeline.connect("splitter", "embedder")
    +indexing_pipeline.connect("embedder", "writer")
    +indexing_pipeline.run({"converter": {"sources": [file_path]}})
    +
    +print("Number of documents:", document_store.count_documents())
    +
    +
    Converting markdown files to Documents: 100%|█| 1/
    +Calculating embeddings: 100%|█| 9/9 [00:05<00:00, 
    +E20240516 10:40:32.945937 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946677 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946704 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +E20240516 10:40:32.946725 5309095 milvus_local.cpp:189] [SERVER][GetCollection][] Collecton HaystackCollection not existed
    +
    +
    +Number of documents: 277
    +
    +

    建立檢索管道

    建立檢索管道,使用向量相似性搜尋引擎從 Milvus 文件儲存庫檢索文件。

    +
    question = 'Where is the painting "Warrior" currently stored?'
    +
    +retrieval_pipeline = Pipeline()
    +retrieval_pipeline.add_component("embedder", OpenAITextEmbedder())
    +retrieval_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +retrieval_pipeline.connect("embedder", "retriever")
    +
    +retrieval_results = retrieval_pipeline.run({"embedder": {"text": question}})
    +
    +for doc in retrieval_results["retriever"]["documents"]:
    +    print(doc.content)
    +    print("-" * 10)
    +
    +
    ). The
    +composition of this oil-painting seems to have been built up on the
    +second cartoon, which he had made some eight years earlier, and which
    +was apparently taken to France in 1516 and ultimately lost.
    +----------
    +
    +This "Baptism of Christ," which is now in the Accademia in Florence
    +and is in a bad state of preservation, appears to have been a
    +comparatively early work by Verrocchio, and to have been painted
    +in 1480-1482, when Leonardo would be about thirty years of age.
    +
    +To about this period belongs the superb drawing of the "Warrior," now
    +in the Malcolm Collection in the British Museum.
    +----------
    +" Although he
    +completed the cartoon, the only part of the composition which he
    +eventually executed in colour was an incident in the foreground
    +which dealt with the "Battle of the Standard." One of the many
    +supposed copies of a study of this mural painting now hangs on the
    +south-east staircase in the Victoria and Albert Museum.
    +----------
    +
    +

    建立 RAG 管道

    建立 RAG 管道,結合 MilvusEmbeddingRetriever 與 OpenAIGenerator,使用擷取的文件回答問題。

    +
    from haystack.utils import Secret
    +from haystack.components.builders import PromptBuilder
    +from haystack.components.generators import OpenAIGenerator
    +
    +prompt_template = """Answer the following query based on the provided context. If the context does
    +                     not include an answer, reply with 'I don't know'.\n
    +                     Query: {{query}}
    +                     Documents:
    +                     {% for doc in documents %}
    +                        {{ doc.content }}
    +                     {% endfor %}
    +                     Answer:
    +                  """
    +
    +rag_pipeline = Pipeline()
    +rag_pipeline.add_component("text_embedder", OpenAITextEmbedder())
    +rag_pipeline.add_component(
    +    "retriever", MilvusEmbeddingRetriever(document_store=document_store, top_k=3)
    +)
    +rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template))
    +rag_pipeline.add_component(
    +    "generator",
    +    OpenAIGenerator(
    +        api_key=Secret.from_token(os.getenv("OPENAI_API_KEY")),
    +        generation_kwargs={"temperature": 0},
    +    ),
    +)
    +rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding")
    +rag_pipeline.connect("retriever.documents", "prompt_builder.documents")
    +rag_pipeline.connect("prompt_builder", "generator")
    +
    +results = rag_pipeline.run(
    +    {
    +        "text_embedder": {"text": question},
    +        "prompt_builder": {"query": question},
    +    }
    +)
    +print("RAG answer:", results["generator"]["replies"][0])
    +
    +
    RAG answer: The painting "Warrior" is currently stored in the Malcolm Collection in the British Museum.
    +
    +

    有關如何使用 milvus-haystack 的詳細資訊,請參閱milvus-haystack Readme

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.json new file mode 100644 index 000000000..83924e337 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus transformers datasets torch\n","from datasets import load_dataset\n\n\nDATASET = \"squad\" # Name of dataset from HuggingFace Datasets\nINSERT_RATIO = 0.001 # Ratio of example dataset to be inserted\n\ndata = load_dataset(DATASET, split=\"validation\")\n# Generates a fixed subset. To generate a random subset, remove the seed.\ndata = data.train_test_split(test_size=INSERT_RATIO, seed=42)[\"test\"]\n# Clean up the data structure in the dataset.\ndata = data.map(\n lambda val: {\"answer\": val[\"answers\"][\"text\"][0]},\n remove_columns=[\"id\", \"answers\", \"context\"],\n)\n\n# View summary of example data\nprint(data)\n","from transformers import AutoTokenizer, AutoModel\nimport torch\n\nMODEL = (\n \"sentence-transformers/all-MiniLM-L6-v2\" # Name of model from HuggingFace Models\n)\nINFERENCE_BATCH_SIZE = 64 # Batch size of model inference\n\n# Load tokenizer & model from HuggingFace Hub\ntokenizer = AutoTokenizer.from_pretrained(MODEL)\nmodel = AutoModel.from_pretrained(MODEL)\n\n\ndef encode_text(batch):\n # Tokenize sentences\n encoded_input = tokenizer(\n batch[\"question\"], padding=True, truncation=True, return_tensors=\"pt\"\n )\n\n # Compute token embeddings\n with torch.no_grad():\n model_output = model(**encoded_input)\n\n # Perform pooling\n token_embeddings = model_output[0]\n attention_mask = encoded_input[\"attention_mask\"]\n input_mask_expanded = (\n attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()\n )\n sentence_embeddings = torch.sum(\n token_embeddings * input_mask_expanded, 1\n ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)\n\n # Normalize embeddings\n batch[\"question_embedding\"] = torch.nn.functional.normalize(\n sentence_embeddings, p=2, dim=1\n )\n return batch\n\n\ndata = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)\ndata_list = data.to_list()\n","from pymilvus import MilvusClient\n\n\nMILVUS_URI = \"./huggingface_milvus_test.db\" # Connection URI\nCOLLECTION_NAME = \"huggingface_test\" # Collection name\nDIMENSION = 384 # Embedding dimension depending on model\n\nmilvus_client = MilvusClient(MILVUS_URI)\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n dimension=DIMENSION,\n auto_id=True, # Enable auto id\n enable_dynamic_field=True, # Enable dynamic fields\n vector_field_name=\"question_embedding\", # Map vector field name and embedding column in dataset\n consistency_level=\"Strong\", # To enable search with latest data\n)\n","milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)\n","questions = {\n \"question\": [\n \"What is LGM?\",\n \"When did Massachusetts first mandate that children be educated in schools?\",\n ]\n}\n\n# Generate question embeddings\nquestion_embeddings = [v.tolist() for v in encode_text(questions)[\"question_embedding\"]]\n\n# Search across Milvus\nsearch_results = milvus_client.search(\n collection_name=COLLECTION_NAME,\n data=question_embeddings,\n limit=3, # How many search results to output\n output_fields=[\"answer\", \"question\"], # Include these fields in search results\n)\n\n# Print out results\nfor q, res in zip(questions[\"question\"], search_results):\n print(\"Question:\", q)\n for r in res:\n print(\n {\n \"answer\": r[\"entity\"][\"answer\"],\n \"score\": r[\"distance\"],\n \"original question\": r[\"entity\"][\"question\"],\n }\n )\n print(\"\\n\")\n"],"headingContent":"Question Answering Using Milvus and Hugging Face","anchorList":[{"label":"使用 Milvus 和擁抱臉回答問題","href":"Question-Answering-Using-Milvus-and-Hugging-Face","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-begin","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-data","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data","type":2,"isActive":false},{"label":"提出問題","href":"Ask-questions","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.md new file mode 100644 index 000000000..c366ff9bb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_hugging-face.md @@ -0,0 +1,242 @@ +--- +id: integrate_with_hugging-face.md +summary: 本教學展示如何使用 Hugging Face 作為資料處理的資料載入器與嵌入產生器,以及 Milvus 作為語意搜尋的向量資料庫,來建立一個問題回答系統。 +title: 使用 Milvus 和擁抱臉回答問題 +--- +

    使用 Milvus 和擁抱臉回答問題

    Open In Colab +GitHub Repository

    +

    基於語意搜尋的問題回答系統的工作方式,是針對給定的查詢問題,從問答對資料集中找出最相似的問題。一旦找出最相似的問題,資料集中相應的答案就會被視為查詢的答案。此方法依賴語意相似性量測來判斷問題之間的相似性,並擷取相關的答案。

    +

    本教學說明如何使用Hugging Face作為資料載入與嵌入產生器來處理資料,並使用Milvus作為向量資料庫來進行語意搜尋,以建立一個問題回答系統。

    +

    開始之前

    您需要確認所有所需的相依性都已安裝:

    +
      +
    • pymilvus: python 套件可與 Milvus 或 Zilliz Cloud 所提供的向量資料庫服務搭配使用。
    • +
    • datasets,transformers: Hugging Face 套件可管理資料並運用模型。
    • +
    • torch:一個功能強大的函式庫提供高效的張量計算和深度學習工具。
    • +
    +
    $ pip install --upgrade pymilvus transformers datasets torch
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時間。(按一下螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    準備資料

    在本節中,我們將載入擁抱臉資料集中的範例問題-答案對。作為示範,我們只從SQuAD 的驗證分割中抽取部分資料。

    +
    from datasets import load_dataset
    +
    +
    +DATASET = "squad"  # Name of dataset from HuggingFace Datasets
    +INSERT_RATIO = 0.001  # Ratio of example dataset to be inserted
    +
    +data = load_dataset(DATASET, split="validation")
    +# Generates a fixed subset. To generate a random subset, remove the seed.
    +data = data.train_test_split(test_size=INSERT_RATIO, seed=42)["test"]
    +# Clean up the data structure in the dataset.
    +data = data.map(
    +    lambda val: {"answer": val["answers"]["text"][0]},
    +    remove_columns=["id", "answers", "context"],
    +)
    +
    +# View summary of example data
    +print(data)
    +
    +
    Dataset({
    +    features: ['title', 'question', 'answer'],
    +    num_rows: 11
    +})
    +
    +

    要產生問題的嵌入模型,您可以從 Hugging Face Models 中選擇一個文字嵌入模型。在本教程中,我們將以一個小型的句子嵌入模型all-MiniLM-L6-v2為例。

    +
    from transformers import AutoTokenizer, AutoModel
    +import torch
    +
    +MODEL = (
    +    "sentence-transformers/all-MiniLM-L6-v2"  # Name of model from HuggingFace Models
    +)
    +INFERENCE_BATCH_SIZE = 64  # Batch size of model inference
    +
    +# Load tokenizer & model from HuggingFace Hub
    +tokenizer = AutoTokenizer.from_pretrained(MODEL)
    +model = AutoModel.from_pretrained(MODEL)
    +
    +
    +def encode_text(batch):
    +    # Tokenize sentences
    +    encoded_input = tokenizer(
    +        batch["question"], padding=True, truncation=True, return_tensors="pt"
    +    )
    +
    +    # Compute token embeddings
    +    with torch.no_grad():
    +        model_output = model(**encoded_input)
    +
    +    # Perform pooling
    +    token_embeddings = model_output[0]
    +    attention_mask = encoded_input["attention_mask"]
    +    input_mask_expanded = (
    +        attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    +    )
    +    sentence_embeddings = torch.sum(
    +        token_embeddings * input_mask_expanded, 1
    +    ) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
    +
    +    # Normalize embeddings
    +    batch["question_embedding"] = torch.nn.functional.normalize(
    +        sentence_embeddings, p=2, dim=1
    +    )
    +    return batch
    +
    +
    +data = data.map(encode_text, batched=True, batch_size=INFERENCE_BATCH_SIZE)
    +data_list = data.to_list()
    +
    +

    插入資料

    現在我們已經準備好問題嵌入的問題-答案對。下一步就是將它們插入向量資料庫。

    +

    我們首先需要連線到 Milvus 服務,並建立一個 Milvus 套件。

    +
    from pymilvus import MilvusClient
    +
    +
    +MILVUS_URI = "./huggingface_milvus_test.db"  # Connection URI
    +COLLECTION_NAME = "huggingface_test"  # Collection name
    +DIMENSION = 384  # Embedding dimension depending on model
    +
    +milvus_client = MilvusClient(MILVUS_URI)
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    dimension=DIMENSION,
    +    auto_id=True,  # Enable auto id
    +    enable_dynamic_field=True,  # Enable dynamic fields
    +    vector_field_name="question_embedding",  # Map vector field name and embedding column in dataset
    +    consistency_level="Strong",  # To enable search with latest data
    +)
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    將所有資料插入收集:

    +
    milvus_client.insert(collection_name=COLLECTION_NAME, data=data_list)
    +
    +
    {'insert_count': 11,
    + 'ids': [450072488481390592, 450072488481390593, 450072488481390594, 450072488481390595, 450072488481390596, 450072488481390597, 450072488481390598, 450072488481390599, 450072488481390600, 450072488481390601, 450072488481390602],
    + 'cost': 0}
    +
    +

    提出問題

    一旦所有資料都插入 Milvus,我們就可以提出問題,看看最接近的答案是什麼。

    +
    questions = {
    +    "question": [
    +        "What is LGM?",
    +        "When did Massachusetts first mandate that children be educated in schools?",
    +    ]
    +}
    +
    +# Generate question embeddings
    +question_embeddings = [v.tolist() for v in encode_text(questions)["question_embedding"]]
    +
    +# Search across Milvus
    +search_results = milvus_client.search(
    +    collection_name=COLLECTION_NAME,
    +    data=question_embeddings,
    +    limit=3,  # How many search results to output
    +    output_fields=["answer", "question"],  # Include these fields in search results
    +)
    +
    +# Print out results
    +for q, res in zip(questions["question"], search_results):
    +    print("Question:", q)
    +    for r in res:
    +        print(
    +            {
    +                "answer": r["entity"]["answer"],
    +                "score": r["distance"],
    +                "original question": r["entity"]["question"],
    +            }
    +        )
    +    print("\n")
    +
    +
    Question: What is LGM?
    +{'answer': 'Last Glacial Maximum', 'score': 0.956273078918457, 'original question': 'What does LGM stands for?'}
    +{'answer': 'coordinate the response to the embargo', 'score': 0.2120140939950943, 'original question': 'Why was this short termed organization created?'}
    +{'answer': '"Reducibility Among Combinatorial Problems"', 'score': 0.1945795714855194, 'original question': 'What is the paper written by Richard Karp in 1972 that ushered in a new era of understanding between intractability and NP-complete problems?'}
    +
    +
    +Question: When did Massachusetts first mandate that children be educated in schools?
    +{'answer': '1852', 'score': 0.9709997177124023, 'original question': 'In what year did Massachusetts first require children to be educated in schools?'}
    +{'answer': 'several regional colleges and universities', 'score': 0.34164726734161377, 'original question': 'In 1890, who did the university decide to team up with?'}
    +{'answer': '1962', 'score': 0.1931006908416748, 'original question': 'When were stromules discovered?'}
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.json new file mode 100644 index 000000000..5151cd504 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -U pymilvus\n$ pip install \"pymilvus[model]\"\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=1024\n)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information retrieval is the process of finding relevant information from a large collection of data or documents.\"\n\nqvecs = ef.encode_queries([query]) # This method uses `retrieval.query` as the task\ndvecs = ef.encode_documents([doc]) # This method uses `retrieval.passage` as the task\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-de\", jina_api_key)\n\nquery = \"what is information retrieval?\"\ndoc = \"Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden.\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\n\njina_api_key = \"\"\nef = JinaEmbeddingFunction(\"jina-embeddings-v2-base-code\", jina_api_key)\n\n# Case1: Enhanced Code Navigation\n# query: text description of the functionality\n# document: relevant code snippet\n\nquery = \"function to calculate average in Python.\"\ndoc = \"\"\"\ndef calculate_average(numbers):\n total = sum(numbers)\n count = len(numbers)\n return total / count\n\"\"\"\n\n# Case2: Streamlined Code Review\n# query: text description of the programming concept\n# document: relevante code snippet or PR\n\nquery = \"pull quest related to Collection\"\ndoc = \"fix:[restful v2] parameters of create collection ...\"\n\n# Case3: Automatic Documentation Assistance\n# query: code snippet you need explanation\n# document: relevante document or DocsString\n\nquery = \"What is Collection in Milvus\"\ndoc = \"\"\"\nIn Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.\nMilvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.\n\"\"\"\n\nqvecs = ef.encode_queries([query])\ndvecs = ef.encode_documents([doc])\n","from pymilvus.model.dense import JinaEmbeddingFunction\nfrom pymilvus import MilvusClient\n\njina_api_key = \"\"\nDIMENSION = 1024 # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. \nef = JinaEmbeddingFunction(\n \"jina-embeddings-v3\", \n jina_api_key,\n task=\"retrieval.passage\",\n dimensions=DIMENSION,\n)\n\n\ndoc = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\ndvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task\n\ndata = [\n {\"id\": i, \"vector\": dvecs[i], \"text\": doc[i], \"subject\": \"history\"}\n for i in range(len(dvecs))\n]\n\nmilvus_client = MilvusClient(\"./milvus_jina_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\nres = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)\n\nprint(res[\"insert_count\"])\n","queries = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\nqvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=[qvecs[0]], # query vectors\n limit=3, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)[0]\n\nfor result in res:\n print(result)\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_api_key = \"\"\n\nrf = JinaRerankFunction(\"jina-reranker-v1-base-en\", jina_api_key)\n\nquery = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\",\n]\n\nrf(query, documents)\n"],"headingContent":"Integrate Milvus with Jina AI","anchorList":[{"label":"整合 Milvus 與 Jina AI","href":"Integrate-Milvus-with-Jina-AI","type":1,"isActive":false},{"label":"誰是 Jina AI","href":"Who-is-Jina-AI","type":2,"isActive":false},{"label":"Milvus 與 Jina AI 的嵌入式系統","href":"Milvus-and-Jina-AIs-Embedding","type":2,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false},{"label":"通用嵌入","href":"General-Purpose-Embedding","type":2,"isActive":false},{"label":"雙語嵌入","href":"Bilingual-Embeddings","type":2,"isActive":false},{"label":"程式碼嵌入","href":"Code-Embeddings","type":2,"isActive":false},{"label":"使用 Jina 與 Milvus 進行語意搜尋","href":"Semantic-Search-with-Jina--Milvus","type":2,"isActive":false},{"label":"Jina Reranker","href":"Jina-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.md new file mode 100644 index 000000000..eb48fb92b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_jina.md @@ -0,0 +1,305 @@ +--- +id: integrate_with_jina.md +summary: 本指南示範如何使用 Jina 嵌入和 Milvus 進行相似性搜尋和檢索任務。 +title: 整合 Milvus 與 Jina +--- +

    整合 Milvus 與 Jina AI

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 Jina AI 嵌入和 Milvus 來進行相似性搜索和檢索任務。

    +

    誰是 Jina AI

    Jina AI 於 2020 年在柏林成立,是一家先進的人工智能公司,專注於透過其搜尋基礎徹底改變人工智能的未來。Jina AI 專精於多模態人工智慧,旨在透過其整合式元件套件,包括嵌入式、reerankers、prompt ops 和核心基礎架構,讓企業和開發人員能夠利用多模態資料的力量來創造價值和節省成本。 Jina AI 的尖端嵌入式擁有頂級效能,其 8192 符記長度模型是全面資料表達的理想選擇。這些嵌入式提供多語言支援,並與 OpenAI 等領先平台無縫整合,有助於跨語言應用程式的發展。

    +

    Milvus 與 Jina AI 的嵌入式系統

    為了有效地儲存和搜尋這些嵌入式資料,以達到速度和規模,需要專為此目的而設計的特定基礎架構。Milvus 是廣為人知的先進開源向量資料庫,能夠處理大規模的向量資料。Milvus 能夠根據大量指標進行快速準確的向量(嵌入)搜尋。它的可擴展性允許無縫處理大量的影像資料,即使資料集成長也能確保高效能的搜尋作業。

    +

    範例

    Jina 嵌入已經整合到 PyMilvus 模型庫中。現在,我們將以程式碼範例來展示如何實際使用 Jina embeddings。

    +

    在開始之前,我們需要為 PyMilvus 安裝模型庫。

    +
    $ pip install -U pymilvus
    +$ pip install "pymilvus[model]"
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時間。(按一下螢幕上方的「Runtime」功能表,然後從下拉式功能表中選擇「Restart session」)。

    +
    +

    通用嵌入

    Jina AI 的核心嵌入模型擅於理解詳細的文字,因此非常適合語意搜尋、內容分類,進而支援進階情感分析、文字摘要和個人化推薦系統。

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=1024
    +)
    +
    +query = "what is information retrieval?"
    +doc = "Information retrieval is the process of finding relevant information from a large collection of data or documents."
    +
    +qvecs = ef.encode_queries([query])  # This method uses `retrieval.query` as the task
    +dvecs = ef.encode_documents([doc])  # This method uses `retrieval.passage` as the task
    +
    +

    雙語嵌入

    Jina AI 的雙語模型增強了多語言平台、全球支援和跨語言內容發現。它們專為德英和中英翻譯而設計,可促進多種語言群體之間的理解,簡化跨語言互動。

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-de", jina_api_key)
    +
    +query = "what is information retrieval?"
    +doc = "Information Retrieval ist der Prozess, relevante Informationen aus einer großen Sammlung von Daten oder Dokumenten zu finden."
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    程式碼嵌入

    Jina AI 的程式碼嵌入模型可透過程式碼和文件提供搜尋能力。它支援英文和 30 種常用程式語言,可用於增強程式碼導航、簡化程式碼檢閱和自動化文件輔助。

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +ef = JinaEmbeddingFunction("jina-embeddings-v2-base-code", jina_api_key)
    +
    +# Case1: Enhanced Code Navigation
    +# query: text description of the functionality
    +# document: relevant code snippet
    +
    +query = "function to calculate average in Python."
    +doc = """
    +def calculate_average(numbers):
    +    total = sum(numbers)
    +    count = len(numbers)
    +    return total / count
    +"""
    +
    +# Case2: Streamlined Code Review
    +# query: text description of the programming concept
    +# document: relevante code snippet or PR
    +
    +query = "pull quest related to Collection"
    +doc = "fix:[restful v2] parameters of create collection ..."
    +
    +# Case3: Automatic Documentation Assistance
    +# query: code snippet you need explanation
    +# document: relevante document or DocsString
    +
    +query = "What is Collection in Milvus"
    +doc = """
    +In Milvus, you store your vector embeddings in collections. All vector embeddings within a collection share the same dimensionality and distance metric for measuring similarity.
    +Milvus collections support dynamic fields (i.e., fields not pre-defined in the schema) and automatic incrementation of primary keys.
    +"""
    +
    +qvecs = ef.encode_queries([query])
    +dvecs = ef.encode_documents([doc])
    +
    +

    使用 Jina 與 Milvus 進行語意搜尋

    透過強大的向量嵌入功能,我們可以結合利用 Jina AI 模型與 Milvus Lite 向量資料庫所擷取的嵌入資料來執行語意搜尋。

    +
    from pymilvus.model.dense import JinaEmbeddingFunction
    +from pymilvus import MilvusClient
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +DIMENSION = 1024  # `jina-embeddings-v3` supports flexible embedding sizes (32, 64, 128, 256, 512, 768, 1024), allowing for truncating embeddings to fit your application. 
    +ef = JinaEmbeddingFunction(
    +    "jina-embeddings-v3", 
    +    jina_api_key,
    +    task="retrieval.passage",
    +    dimensions=DIMENSION,
    +)
    +
    +
    +doc = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +dvecs = ef.encode_documents(doc) # This method uses `retrieval.passage` as the task
    +
    +data = [
    +    {"id": i, "vector": dvecs[i], "text": doc[i], "subject": "history"}
    +    for i in range(len(dvecs))
    +]
    +
    +milvus_client = MilvusClient("./milvus_jina_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +res = milvus_client.insert(collection_name=COLLECTION_NAME, data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    有了 Milvus 向量資料庫中的所有資料,我們現在可以透過產生查詢的向量嵌入來執行語意搜尋,並進行向量搜尋。

    +
    queries = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +qvecs = ef.encode_queries([queries]) # This method uses `retrieval.query` as the task
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=[qvecs[0]],  # query vectors
    +    limit=3,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)[0]
    +
    +for result in res:
    +    print(result)
    +
    +
    {'id': 1, 'distance': 0.8802614808082581, 'entity': {'text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", 'subject': 'history'}}
    +
    +

    Jina Reranker

    在使用 embeddings 搜尋之後,Jina Ai 也提供了 reranker 來進一步提升檢索品質。

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_api_key = "<YOUR_JINA_API_KEY>"
    +
    +rf = JinaRerankFunction("jina-reranker-v1-base-en", jina_api_key)
    +
    +query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.",
    +]
    +
    +rf(query, documents)
    +
    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9370958209037781, index=1),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.35420963168144226, index=3),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.3498658835887909, index=0),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.2728956639766693, index=2)]
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.json new file mode 100644 index 000000000..000eabbd6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade\n","import os\n\n# Get keys for your project from the project settings page\n# https://cloud.langfuse.com\nos.environ[\"LANGFUSE_PUBLIC_KEY\"] = \"\"\nos.environ[\"LANGFUSE_SECRET_KEY\"] = \"\"\nos.environ[\"LANGFUSE_HOST\"] = \"https://cloud.langfuse.com\" # 🇪🇺 EU region\n# os.environ[\"LANGFUSE_HOST\"] = \"https://us.cloud.langfuse.com\" # 🇺🇸 US region\n\n# Your openai key\nos.environ[\"OPENAI_API_KEY\"] = \"\"\n","from llama_index.core import Settings\nfrom llama_index.core.callbacks import CallbackManager\nfrom langfuse.llama_index import LlamaIndexCallbackHandler\n \nlangfuse_callback_handler = LlamaIndexCallbackHandler()\nSettings.callback_manager = CallbackManager([langfuse_callback_handler])\n","from llama_index.core import Document\n\ndoc1 = Document(text=\"\"\"\nMaxwell \"Max\" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.\n\"\"\")\ndoc2 = Document(text=\"\"\"\nThroughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are \"Fleeting Echoes,\" \"Halcyon Dusk,\" and the Academy Award-winning sci-fi epic, \"Event Horizon's Brink.\" His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.\n\"\"\")\n","# Example index construction + LLM query\n\nfrom llama_index.core import VectorStoreIndex\nfrom llama_index.core import StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(\n uri=\"tmp/milvus_demo.db\", dim=1536, overwrite=False\n)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\nindex = VectorStoreIndex.from_documents(\n [doc1,doc2], storage_context=storage_context\n)\n","# Query\nresponse = index.as_query_engine().query(\"What did he do growing up?\")\nprint(response)\n","# Chat\nresponse = index.as_chat_engine().chat(\"What did he do growing up?\")\nprint(response)\n","# As we want to immediately see result in Langfuse, we need to flush the callback handler\nlangfuse_callback_handler.flush()\n"],"headingContent":"Using Langfuse to Trace Queries in RAG","anchorList":[{"label":"在 RAG 中使用 Langfuse 追蹤查詢","href":"Using-Langfuse-to-Trace-Queries-in-RAG","type":1,"isActive":false},{"label":"設定","href":"Setup","type":2,"isActive":false},{"label":"使用 Milvus Lite 建立索引","href":"Index-using-Milvus-Lite","type":2,"isActive":false},{"label":"查詢","href":"Query","type":2,"isActive":false},{"label":"在 Langfuse 中探索痕跡","href":"Explore-traces-in-Langfuse","type":2,"isActive":false},{"label":"對更多進階功能感興趣?","href":"Interested-in-more-advanced-features","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.md new file mode 100644 index 000000000..4100d15c4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_langfuse.md @@ -0,0 +1,177 @@ +--- +id: integrate_with_langfuse.md +summary: 這是一個簡單的烹飪手冊,示範如何使用 LlamaIndex Langfuse 整合。它使用 Milvus Lite 來儲存文件和 Query。 +title: 使用 Langfuse 評估 RAG 品質 +--- +

    在 RAG 中使用 Langfuse 追蹤查詢

    +Open In Colab +

    +

    這是一個簡單的烹飪手冊,示範如何在 RAG 中使用 Langfuse 來追蹤您的查詢。RAG 管道是使用 LlamaIndex 和 Milvus Lite 來儲存和擷取文件。

    +

    在本快速入門中,我們將教您如何使用 Milvus Lite 作為向量儲存,建立 LlamaIndex 應用程式。我們也會告訴您如何使用 Langfuse LlamaIndex 整合來追蹤您的應用程式。

    +

    Langfuse是一個開放原始碼的 LLM 工程平台,可協助團隊協同除錯、分析和迭代他們的 LLM 應用程式。所有平台功能都是原生整合,以加速開發工作流程。

    +

    Milvus Lite是 Milvus 的輕量級版本,Milvus是一個開放原始碼向量資料庫,以向量嵌入和相似性搜尋為 AI 應用程式提供動力。

    +

    設定

    確定您已安裝llama-indexlangfuse

    +
    $ pip install llama-index langfuse llama-index-vector-stores-milvus --upgrade
    +
    +

    初始化整合。從Langfuse 專案設定取得您的 API 金鑰,並將 public_key secret_key 替換為您的金鑰值。本範例使用 OpenAI 進行嵌入和聊天完成,因此您也需要在環境變數中指定 OpenAI 金鑰。

    +
    import os
    +
    +# Get keys for your project from the project settings page
    +# https://cloud.langfuse.com
    +os.environ["LANGFUSE_PUBLIC_KEY"] = ""
    +os.environ["LANGFUSE_SECRET_KEY"] = ""
    +os.environ["LANGFUSE_HOST"] = "https://cloud.langfuse.com" # 🇪🇺 EU region
    +# os.environ["LANGFUSE_HOST"] = "https://us.cloud.langfuse.com" # 🇺🇸 US region
    +
    +# Your openai key
    +os.environ["OPENAI_API_KEY"] = ""
    +
    +
    from llama_index.core import Settings
    +from llama_index.core.callbacks import CallbackManager
    +from langfuse.llama_index import LlamaIndexCallbackHandler
    + 
    +langfuse_callback_handler = LlamaIndexCallbackHandler()
    +Settings.callback_manager = CallbackManager([langfuse_callback_handler])
    +
    +

    使用 Milvus Lite 建立索引

    from llama_index.core import Document
    +
    +doc1 = Document(text="""
    +Maxwell "Max" Silverstein, a lauded movie director, screenwriter, and producer, was born on October 25, 1978, in Boston, Massachusetts. A film enthusiast from a young age, his journey began with home movies shot on a Super 8 camera. His passion led him to the University of Southern California (USC), majoring in Film Production. Eventually, he started his career as an assistant director at Paramount Pictures. Silverstein's directorial debut, “Doors Unseen,” a psychological thriller, earned him recognition at the Sundance Film Festival and marked the beginning of a successful directing career.
    +""")
    +doc2 = Document(text="""
    +Throughout his career, Silverstein has been celebrated for his diverse range of filmography and unique narrative technique. He masterfully blends suspense, human emotion, and subtle humor in his storylines. Among his notable works are "Fleeting Echoes," "Halcyon Dusk," and the Academy Award-winning sci-fi epic, "Event Horizon's Brink." His contribution to cinema revolves around examining human nature, the complexity of relationships, and probing reality and perception. Off-camera, he is a dedicated philanthropist living in Los Angeles with his wife and two children.
    +""")
    +
    +
    # Example index construction + LLM query
    +
    +from llama_index.core import VectorStoreIndex
    +from llama_index.core import StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(
    +    uri="tmp/milvus_demo.db", dim=1536, overwrite=False
    +)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +index = VectorStoreIndex.from_documents(
    +    [doc1,doc2], storage_context=storage_context
    +)
    +
    +

    查詢

    # Query
    +response = index.as_query_engine().query("What did he do growing up?")
    +print(response)
    +
    +
    # Chat
    +response = index.as_chat_engine().chat("What did he do growing up?")
    +print(response)
    +
    +

    在 Langfuse 中探索痕跡

    # As we want to immediately see result in Langfuse, we need to flush the callback handler
    +langfuse_callback_handler.flush()
    +
    +

    完成!您可以在 Langfuse 專案中看到索引和查詢的軌跡。

    +

    示例軌跡(公共鏈接):

    +
      +
    1. 查詢
    2. +
    3. 查詢 (聊天)
    4. +
    +

    Langfuse 中的軌跡:

    +

    + + Langfuse Traces + Langfuse 軌跡

    +

    對更多進階功能感興趣?

    請參閱完整的整合說明文件,瞭解更多進階功能及使用方式:

    +
      +
    • 與 Langfuse Python SDK 及其他整合的互操作性
    • +
    • 新增自訂元資料與屬性至追蹤資料
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.json new file mode 100644 index 000000000..fd6f52d74 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pymilvus>=2.4.2\n","$ pip install llama-index-vector-stores-milvus\n","$ pip install llama-index\n","import openai\n\nopenai.api_key = \"sk-***********\"\n","! mkdir -p 'data/'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'\n! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'\n","from llama_index.core import SimpleDirectoryReader\n\n# load documents\ndocuments = SimpleDirectoryReader(\n input_files=[\"./data/paul_graham_essay.txt\"]\n).load_data()\n\nprint(\"Document ID:\", documents[0].doc_id)\n","# Create an index over the documents\nfrom llama_index.core import VectorStoreIndex, StorageContext\nfrom llama_index.vector_stores.milvus import MilvusVectorStore\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\n","query_engine = index.as_query_engine()\nres = query_engine.query(\"What did the author learn?\")\nprint(res)\n","res = query_engine.query(\"What challenges did the disease pose for the author?\")\nprint(res)\n","from llama_index.core import Document\n\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(\n [Document(text=\"The number that is being searched for is ten.\")],\n storage_context,\n)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"Who is the author?\")\nprint(res)\n","del index, vector_store, storage_context, query_engine\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", overwrite=False)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents, storage_context=storage_context)\nquery_engine = index.as_query_engine()\nres = query_engine.query(\"What is the number?\")\nprint(res)\n","res = query_engine.query(\"Who is the author?\")\nprint(res)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Load all the two documents loaded before\ndocuments_all = SimpleDirectoryReader(\"./data/\").load_data()\n\nvector_store = MilvusVectorStore(uri=\"./milvus_demo.db\", dim=1536, overwrite=True)\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\nindex = VectorStoreIndex.from_documents(documents_all, storage_context)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"uber_2021.pdf\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n","filters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"paul_graham_essay.txt\")]\n)\nquery_engine = index.as_query_engine(filters=filters)\nres = query_engine.query(\"What challenges did the disease pose for the author?\")\n\nprint(res)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LlamaIndex","anchorList":[{"label":"使用 Milvus 和 LlamaIndex 的檢索增強世代 (RAG)","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LlamaIndex","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-begin","type":2,"isActive":false},{"label":"開始","href":"Getting-Started","type":2,"isActive":false},{"label":"元資料篩選","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.md new file mode 100644 index 000000000..43fbbfff7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_llamaindex.md @@ -0,0 +1,201 @@ +--- +id: integrate_with_llamaindex.md +summary: 本指南示範如何使用 LlamaIndex 和 Milvus 建立檢索增強世代 (RAG) 系統。 +title: 使用 Milvus 和 LlamaIndex 的檢索增強世代 (RAG) +--- +

    使用 Milvus 和 LlamaIndex 的檢索增強世代 (RAG)

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 LlamaIndex 和 Milvus 建立一個檢索-增強生成 (RAG) 系統。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示生成新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    LlamaIndex是一個簡單、靈活的資料框架,可將自訂資料來源連接至大型語言模型 (LLM)。Milvus是世界上最先進的開放原始碼向量資料庫,是為了強化嵌入式相似性搜尋與 AI 應用程式而建立的。

    +

    在本筆記簿中,我們將展示使用 MilvusVectorStore 的快速示範。

    +

    開始之前

    安裝相依性

    本頁面的程式碼片段需要 pymilvus 和 llamaindex 的相依性。您可以使用下列指令安裝它們:

    +
    $ pip install pymilvus>=2.4.2
    +
    +
    $ pip install llama-index-vector-stores-milvus
    +
    +
    $ pip install llama-index
    +
    +
    +

    如果您使用 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時間。(按一下螢幕上方的「Runtime」功能表,然後從下拉式功能表中選擇「Restart session」)。

    +
    +

    設定 OpenAI

    讓我們先加入 openai api 金鑰。這將允許我們存取 chatgpt。

    +
    import openai
    +
    +openai.api_key = "sk-***********"
    +
    +

    準備資料

    您可以使用下列指令下載範例資料:

    +
    ! mkdir -p 'data/'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham_essay.txt'
    +! wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/uber_2021.pdf'
    +
    +

    開始

    產生我們的資料

    作為第一個範例,讓我們從檔案paul_graham_essay.txt 產生一個文件。這是一篇來自 Paul Graham 的單篇文章,標題是What I Worked On 。我們將使用 SimpleDirectoryReader 來產生文件。

    +
    from llama_index.core import SimpleDirectoryReader
    +
    +# load documents
    +documents = SimpleDirectoryReader(
    +    input_files=["./data/paul_graham_essay.txt"]
    +).load_data()
    +
    +print("Document ID:", documents[0].doc_id)
    +
    +
    Document ID: 95f25e4d-f270-4650-87ce-006d69d82033
    +
    +

    在資料中建立索引

    現在我們有了一個文件,我們可以建立一個索引並插入文件。

    +
    +

    請注意,Milvus Lite需要pymilvus>=2.4.2

    +
    +
    # Create an index over the documents
    +from llama_index.core import VectorStoreIndex, StorageContext
    +from llama_index.vector_stores.milvus import MilvusVectorStore
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +
    +
    +

    關於MilvusVectorStore 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存於此檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    查詢資料

    現在我們的文件已儲存在索引中,我們可以針對索引提出問題。索引會使用本身儲存的資料作為 chatgpt 的知識庫。

    +
    query_engine = index.as_query_engine()
    +res = query_engine.query("What did the author learn?")
    +print(res)
    +
    +
    The author learned that philosophy courses in college were boring to him, leading him to switch his focus to studying AI.
    +
    +
    res = query_engine.query("What challenges did the disease pose for the author?")
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in her losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    +

    下一個測試顯示覆寫會移除先前的資料。

    +
    from llama_index.core import Document
    +
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(
    +    [Document(text="The number that is being searched for is ten.")],
    +    storage_context,
    +)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    The author is the individual who created the context information.
    +
    +

    下一個測試顯示在已存在的索引中加入額外的資料。

    +
    del index, vector_store, storage_context, query_engine
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", overwrite=False)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
    +query_engine = index.as_query_engine()
    +res = query_engine.query("What is the number?")
    +print(res)
    +
    +
    The number is ten.
    +
    +
    res = query_engine.query("Who is the author?")
    +print(res)
    +
    +
    Paul Graham
    +
    +

    元資料篩選

    我們可以透過篩選特定來源來產生結果。以下範例說明從目錄載入所有文件,並隨後根據元資料過濾這些文件。

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Load all the two documents loaded before
    +documents_all = SimpleDirectoryReader("./data/").load_data()
    +
    +vector_store = MilvusVectorStore(uri="./milvus_demo.db", dim=1536, overwrite=True)
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +index = VectorStoreIndex.from_documents(documents_all, storage_context)
    +
    +

    我們只想擷取檔案uber_2021.pdf 中的文件。

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="uber_2021.pdf")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges related to the adverse impact on the business and operations, including reduced demand for Mobility offerings globally, affecting travel behavior and demand. Additionally, the pandemic led to driver supply constraints, impacted by concerns regarding COVID-19, with uncertainties about when supply levels would return to normal. The rise of the Omicron variant further affected travel, resulting in advisories and restrictions that could adversely impact both driver supply and consumer demand for Mobility offerings.
    +
    +

    當從檔案paul_graham_essay.txt 擷取時,我們會得到不同的結果。

    +
    filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="paul_graham_essay.txt")]
    +)
    +query_engine = index.as_query_engine(filters=filters)
    +res = query_engine.query("What challenges did the disease pose for the author?")
    +
    +print(res)
    +
    +
    The disease posed challenges for the author as it affected his mother's health, leading to a stroke caused by colon cancer. This resulted in his mother losing her balance and needing to be placed in a nursing home. The author and his sister were determined to help their mother get out of the nursing home and back to her house.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.json new file mode 100644 index 000000000..d152f54e1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.json @@ -0,0 +1 @@ +{"codeList":["$ pip install 'pymemgpt[milvus]'\n","$ memgpt configure\n","...\n? Select storage backend for archival data: milvus\n? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db\n","# we're saving the file as \"memgpt_research_paper.pdf\"\n$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf\n","$ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf\n","Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00, 3.94file/s]\nLoaded 74 passages and 13 documents from memgpt_research_paper\n","# reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona\n$ memgpt run --persona memgpt_doc\n","? Would you like to select an existing agent? No\n\n🧬 Creating new agent...\n-> 🤖 Using persona profile: 'sam_pov'\n-> 🧑 Using human profile: 'basic'\n🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)\n\nHit enter to begin (will request first MemGPT message)\n\n💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.\n🤖 Greetings Chad! I'm MemGPT. How may I assist you today?\n\n> Enter your message: /attach\n? Select data source memgpt_research_paper\n100%|███████████████████████████████████| 1/1 [00:00<00:00, 4.81it/s]\n","> Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?\n\n💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive\nunderstanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.\n⚡🧠 [function] searching memory with archival_memory_search\n💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within\nthe LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.\n🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern \nLarge Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision \nof extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context \nbaselines in deep memory retrieval and it's able to analyze large documents with precision.\n\n"],"headingContent":"MemGPT with Milvus Integration","anchorList":[{"label":"與 Milvus 整合的 MemGPT","href":"MemGPT-with-Milvus-Integration","type":1,"isActive":false},{"label":"設定","href":"Configuration","type":2,"isActive":false},{"label":"建立外部資料來源","href":"Creating-an-external-data-source","type":2,"isActive":false},{"label":"將資料來源附加到 MemGPT 代理","href":"Attaching-the-data-source-to-a-MemGPT-agent","type":2,"isActive":false},{"label":"測試我們的新聊天機器人","href":"Testing-out-our-new-chatbot","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.md new file mode 100644 index 000000000..fa57ae6c7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_memgpt.md @@ -0,0 +1,142 @@ +--- +id: integrate_with_memgpt.md +summary: MemGPT 可讓您輕鬆建立和部署有狀 LLM 代理。透過 Milvus 整合,您可以建立與外部資料來源 (RAG) 連結的代理。 +title: 與 Milvus 整合的 MemGPT +--- +

    與 Milvus 整合的 MemGPT

    MemGPT可讓您輕鬆建立和部署有狀 LLM 代理。透過 Milvus 整合,您可以建立與外部資料來源 (RAG) 連結的代理。

    +

    在本範例中,我們要使用 MemGPT 與儲存於 Milvus 的自訂資料來源聊天。

    +

    設定

    要執行 MemGPT,您必須確定 Python 版本 >= 3.10。

    +

    要啟用 Milvus 後端,請確認安裝所需的相依性:

    +
    $ pip install 'pymemgpt[milvus]'
    +
    +

    您可以透過命令設定 Milvus 連線。

    +
    $ memgpt configure
    +
    +
    ...
    +? Select storage backend for archival data: milvus
    +? Enter the Milvus connection URI (Default: ~/.memgpt/milvus.db): ~/.memgpt/milvus.db
    +
    +

    您只需將 URI 設定為本機檔案路徑,例如~/.memgpt/milvus.db ,這將自動透過 Milvus Lite 啟用本機的 Milvus 服務實體。

    +

    如果您有大規模的資料,例如超過一百萬份的文件,我們建議您在docker 或 kubenetes 上架設效能更高的 Milvus 伺服器。 在這種情況下,您的 URI 應該是伺服器的 URI,例如http://localhost:19530

    +

    建立外部資料來源

    要將外部資料饋送至 MemGPT 聊天機,我們首先需要建立資料來源。

    +

    要下載 MemGPT 研究論文,我們會使用curl (您也可以直接從瀏覽器下載 PDF):

    +
    # we're saving the file as "memgpt_research_paper.pdf"
    +$ curl -L -o memgpt_research_paper.pdf https://arxiv.org/pdf/2310.08560.pdf
    +
    +

    現在我們已經下載了論文,可以使用memgpt load 建立 MemGPT 資料來源:

    +
    $ memgpt load directory --name memgpt_research_paper --input-files=memgpt_research_paper.pdf
    +
    +
    Loading files: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  3.94file/s]
    +Loaded 74 passages and 13 documents from memgpt_research_paper
    +
    +

    將資料來源附加到 MemGPT 代理

    既然我們已經建立了這個資料來源,就可以隨時將它附加到 MemGPT 聊天機上。

    +

    讓我們使用memgpt_doc 角色(但您也可以使用任何角色)建立一個新的聊天機器人:

    +
    # reminder: `memgpt run --persona memgpt_doc` will create a new MemGPT agent using the `memgpt_doc` persona
    +$ memgpt run --persona memgpt_doc
    +
    +

    與代理聊天後,我們就可以將資料來源「附加」到代理的存檔記憶體:

    +
    ? Would you like to select an existing agent? No
    +
    +🧬 Creating new agent...
    +->  🤖 Using persona profile: 'sam_pov'
    +->  🧑 Using human profile: 'basic'
    +🎉 Created new agent 'PoliteButterfly' (id=d26e1981-ff36-4095-97a0-61a1601dfb5d)
    +
    +Hit enter to begin (will request first MemGPT message)
    +
    +💭 Interesting, I've got a first-time user. Time to present myself and get to understand the user's needs. I wonder what brings Chad here today.
    +🤖 Greetings Chad! I'm MemGPT. How may I assist you today?
    +
    +> Enter your message: /attach
    +? Select data source memgpt_research_paper
    +100%|███████████████████████████████████| 1/1 [00:00<00:00,  4.81it/s]
    +
    +

    測試我們的新聊天機器人

    既然資料已經載入聊天機器人的記憶體,我們就可以開始詢問相關問題了:

    +
    > Enter your message: The paper I loaded into your archival memory is called MemGPT. Can you tell me more about it?
    +
    +💭 It seems Chad would like to know more about the paper titled 'MemGPT' that's stored in my archival memory. It's time to search the archival memory for details and background data to provide a comprehensive
    +understanding of the paper. Let's remember to page through results until I've gathered enough information to answer Chad's enquiry.
    +⚡🧠 [function] searching memory with archival_memory_search
    +💭 Based on the found results, MemGPT is an AI system designed for tasks like extended conversations and document analysis. It efficiently manages different tiers of storage to provide extended context within
    +the LLM’s limited cap. Also, noteworthy from my findings is that MemGPT performs impressively in deep memory retrieval (DMR) and document QA tasks. Let's prepare a comprehensive response for Chad.
    +🤖 Certainly, Chad. MemGPT, or MemoryGPT, is a system specially designed for tasks like extended conversations and document analysis which are traditionally hindered by the limited context windows of modern 
    +Large Language Models (LLMs). It uses a technique inspired by hierarchical memory systems in traditional operating systems, called virtual context management. This technique allows for an effective provision 
    +of extended context within an LLM’s limited context window by intelligently managing different storage tiers, much like paging between physical memory and disk. Notably, MemGPT outperforms the fixed-context 
    +baselines in deep memory retrieval and it's able to analyze large documents with precision.
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.json new file mode 100644 index 000000000..241ed49f8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade openai pymilvus\n","from openai import OpenAI\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"text-embedding-3-small\" # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models\nDIMENSION = 1536 # Dimension of vector embedding\n\n# Connect to OpenAI with API Key.\nopenai_client = OpenAI(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data\n]\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_openai_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_openai_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = [\n vec.embedding\n for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data\n]\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n","[\n {\n \"id\": 0,\n \"distance\": -0.772376537322998,\n \"entity\": {\n \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"subject\": \"history\",\n },\n },\n {\n \"id\": 1,\n \"distance\": -0.58596271276474,\n \"entity\": {\n \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"subject\": \"history\",\n },\n },\n]\n"],"headingContent":"Semantic Search with Milvus and OpenAI","anchorList":[{"label":"使用 Milvus 和 OpenAI 進行語意搜尋","href":"Semantic-Search-with-Milvus-and-OpenAI","type":1,"isActive":false},{"label":"開始使用","href":"Getting-started","type":2,"isActive":false},{"label":"使用 OpenAI 與 Milvus 搜尋書名","href":"Searching-book-titles-with-OpenAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.md new file mode 100644 index 000000000..0b4249190 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_openai.md @@ -0,0 +1,155 @@ +--- +id: integrate_with_openai.md +title: 使用 Milvus 和 OpenAI 進行語意搜尋 +summary: 本頁討論向量資料庫與 OpenAI 的嵌入式 API 的整合。 +--- +

    使用 Milvus 和 OpenAI 進行語意搜尋

    Open In Colab +GitHub Repository

    +

    本指南展示OpenAI 的 Embedding API如何與 Milvus 向量資料庫搭配使用,以對文字進行語意搜尋。

    +

    開始使用

    在您開始之前,請確定您已準備好 OpenAI API 金鑰,或者您已從OpenAI 網站取得一個金鑰。

    +

    本範例使用的資料是書名。您可以在此下載資料集,並將其放在執行下列程式碼的同一個目錄中。

    +

    首先,安裝 Milvus 和 OpenAI 的套件:

    +
    pip install --upgrade openai pymilvus
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時間。(點選螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    有了這些,我們就可以產生嵌入並使用向量資料庫來進行語意搜尋了。

    +

    使用 OpenAI 與 Milvus 搜尋書名

    在以下範例中,我們從下載的 CSV 檔案載入書名資料,使用 OpenAI 嵌入模型產生向量表示,並將其儲存在 Milvus 向量資料庫中進行語意搜尋。

    +
    from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "text-embedding-3-small"  # Which model to use, please check https://platform.openai.com/docs/guides/embeddings for available models
    +DIMENSION = 1536  # Dimension of vector embedding
    +
    +# Connect to OpenAI with API Key.
    +openai_client = OpenAI(api_key="<YOUR_OPENAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=docs, model=MODEL_NAME).data
    +]
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_openai_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_openai_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    有了 Milvus 向量資料庫中的所有資料,我們現在就可以透過產生查詢的向量嵌入來執行語意搜尋,並進行向量搜尋。

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = [
    +    vec.embedding
    +    for vec in openai_client.embeddings.create(input=queries, model=MODEL_NAME).data
    +]
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +

    您應該會看到以下輸出:

    +
    [
    +    {
    +        "id": 0,
    +        "distance": -0.772376537322998,
    +        "entity": {
    +            "text": "Artificial intelligence was founded as an academic discipline in 1956.",
    +            "subject": "history",
    +        },
    +    },
    +    {
    +        "id": 1,
    +        "distance": -0.58596271276474,
    +        "entity": {
    +            "text": "Alan Turing was the first person to conduct substantial research in AI.",
    +            "subject": "history",
    +        },
    +    },
    +]
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.json new file mode 100644 index 000000000..aaa02a2a6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus torch gdown torchvision tqdm\n","import gdown\nimport zipfile\n\nurl = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'\noutput = './paintings.zip'\ngdown.download(url, output)\n\nwith zipfile.ZipFile(\"./paintings.zip\",\"r\") as zip_ref:\n zip_ref.extractall(\"./paintings\")\n","# Milvus Setup Arguments\nCOLLECTION_NAME = 'image_search' # Collection name\nDIMENSION = 2048 # Embedding vector size in this example\nMILVUS_HOST = \"localhost\"\nMILVUS_PORT = \"19530\"\n\n# Inference Arguments\nBATCH_SIZE = 128\nTOP_K = 3\n","from pymilvus import connections\n\n# Connect to the instance\nconnections.connect(host=MILVUS_HOST, port=MILVUS_PORT)\n","from pymilvus import utility\n\n# Remove any previous collections with the same name\nif utility.has_collection(COLLECTION_NAME):\n utility.drop_collection(COLLECTION_NAME)\n","from pymilvus import FieldSchema, CollectionSchema, DataType, Collection\n\n# Create collection which includes the id, filepath of the image, and image embedding\nfields = [\n FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200), # VARCHARS need a maximum length, so for this example they are set to 200 characters\n FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n]\nschema = CollectionSchema(fields=fields)\ncollection = Collection(name=COLLECTION_NAME, schema=schema)\n","# Create an AutoIndex index for collection\nindex_params = {\n'metric_type':'L2',\n'index_type':\"IVF_FLAT\",\n'params':{'nlist': 16384}\n}\ncollection.create_index(field_name=\"image_embedding\", index_params=index_params)\ncollection.load()\n","import glob\n\n# Get the filepaths of the images\npaths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)\nlen(paths)\n","import torch\n\n# Load the embedding model with the last layer removed\nmodel = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)\nmodel = torch.nn.Sequential(*(list(model.children())[:-1]))\nmodel.eval()\n","from torchvision import transforms\n\n# Preprocessing for images\npreprocess = transforms.Compose([\n transforms.Resize(256),\n transforms.CenterCrop(224),\n transforms.ToTensor(),\n transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])\n","from PIL import Image\nfrom tqdm import tqdm\n\n# Embed function that embeds the batch and inserts it\ndef embed(data):\n with torch.no_grad():\n output = model(torch.stack(data[0])).squeeze()\n collection.insert([data[1], output.tolist()])\n\ndata_batch = [[],[]]\n\n# Read the images into batches for embedding and insertion\nfor path in tqdm(paths):\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n if len(data_batch[0]) % BATCH_SIZE == 0:\n embed(data_batch)\n data_batch = [[],[]]\n\n# Embed and insert the remainder\nif len(data_batch[0]) != 0:\n embed(data_batch)\n\n# Call a flush to index any unsealed segments.\ncollection.flush()\n","import glob\n\n# Get the filepaths of the search images\nsearch_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)\nlen(search_paths)\n","import time\nfrom matplotlib import pyplot as plt\n\n# Embed the search images\ndef embed(data):\n with torch.no_grad():\n ret = model(torch.stack(data))\n # If more than one image, use squeeze\n if len(ret) > 1:\n return ret.squeeze().tolist()\n # Squeeze would remove batch for single image, so using flatten\n else:\n return torch.flatten(ret, start_dim=1).tolist()\n\ndata_batch = [[],[]]\n\nfor path in search_paths:\n im = Image.open(path).convert('RGB')\n data_batch[0].append(preprocess(im))\n data_batch[1].append(path)\n\nembeds = embed(data_batch[0])\nstart = time.time()\nres = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])\nfinish = time.time()\n","# Show the image results\nf, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)\n\nfor hits_i, hits in enumerate(res):\n axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))\n axarr[hits_i][0].set_axis_off()\n axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))\n for hit_i, hit in enumerate(hits):\n axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))\n axarr[hits_i][hit_i + 1].set_axis_off()\n axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))\n\n# Save the search result in a separate image file alongside your script.\nplt.savefig('search_result.png')\n"],"headingContent":"Image Search with PyTorch and Milvus","anchorList":[{"label":"使用 PyTorch 和 Milvus 進行圖片搜尋","href":"Image-Search-with-PyTorch-and-Milvus","type":1,"isActive":false},{"label":"安裝需求","href":"Installing-the-requirements","type":2,"isActive":false},{"label":"擷取資料","href":"Grabbing-the-data","type":2,"isActive":false},{"label":"全局參數","href":"Global-Arguments","type":2,"isActive":false},{"label":"設定 Milvus","href":"Setting-up-Milvus","type":2,"isActive":false},{"label":"插入資料","href":"Inserting-the-data","type":2,"isActive":false},{"label":"執行搜尋","href":"Performing-the-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.md new file mode 100644 index 000000000..c8ab6ec08 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_pytorch.md @@ -0,0 +1,297 @@ +--- +id: integrate_with_pytorch.md +summary: 本頁面演示如何使用 PyTorch 和 Milvus 建立圖片搜尋。 +title: 使用 PyTorch 和 Milvus 進行圖片搜尋 +--- +

    使用 PyTorch 和 Milvus 進行圖片搜尋

    本指南介紹一個整合 PyTorch 與 Milvus 的範例,以使用嵌入式執行圖像搜尋。PyTorch 是一個強大的開源深度學習框架,廣泛用於建立和部署機器學習模型。在本範例中,我們將利用其 Torchvision 函式庫和預先訓練好的 ResNet50 模型來產生代表圖像內容的特徵向量 (embeddings)。這些嵌入向量將儲存在高效能向量資料庫 Milvus 中,以便進行有效率的相似性搜尋。使用的資料集是來自Kaggle 的 Impressionist-Classifier Dataset。透過結合 PyTorch 的深度學習能力與 Milvus 的可擴充搜尋功能,本範例展示了如何建立一個強大且有效率的圖像檢索系統。

    +

    讓我們開始吧

    +

    安裝需求

    在本範例中,我們將使用pymilvus 連線使用 Milvus,torch 用於執行嵌入模型,torchvision 用於實際模型和預處理,gdown 用於下載範例資料集,tqdm 用於載入欄位。

    +
    pip install pymilvus torch gdown torchvision tqdm
    +
    +

    擷取資料

    我們要使用gdown 從 Google Drive 抓取壓縮檔,然後用內建的zipfile 函式庫來解壓縮。

    +
    import gdown
    +import zipfile
    +
    +url = 'https://drive.google.com/uc?id=1OYDHLEy992qu5C4C8HV5uDIkOWRTAR1_'
    +output = './paintings.zip'
    +gdown.download(url, output)
    +
    +with zipfile.ZipFile("./paintings.zip","r") as zip_ref:
    +    zip_ref.extractall("./paintings")
    +
    +
    +

    資料集的大小為 2.35 GB,下載所花的時間取決於您的網路狀況。

    +
    +

    全局參數

    這些是我們將會使用的一些主要全局參數,以便於追蹤和更新。

    +
    # Milvus Setup Arguments
    +COLLECTION_NAME = 'image_search'  # Collection name
    +DIMENSION = 2048  # Embedding vector size in this example
    +MILVUS_HOST = "localhost"
    +MILVUS_PORT = "19530"
    +
    +# Inference Arguments
    +BATCH_SIZE = 128
    +TOP_K = 3
    +
    +

    設定 Milvus

    此時,我們要開始設定 Milvus。步驟如下:

    +
      +
    1. 使用提供的 URI 連線到 Milvus 實例。

      +
      from pymilvus import connections
      +
      +# Connect to the instance
      +connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)
      +
    2. +
    3. 如果集合已經存在,請將它刪除。

      +
      from pymilvus import utility
      +
      +# Remove any previous collections with the same name
      +if utility.has_collection(COLLECTION_NAME):
      +    utility.drop_collection(COLLECTION_NAME)
      +
    4. +
    5. 建立收藏集,收藏 ID、圖片的檔案路徑及其嵌入。

      +
      from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
      +
      +# Create collection which includes the id, filepath of the image, and image embedding
      +fields = [
      +    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
      +    FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200),  # VARCHARS need a maximum length, so for this example they are set to 200 characters
      +    FieldSchema(name='image_embedding', dtype=DataType.FLOAT_VECTOR, dim=DIMENSION)
      +]
      +schema = CollectionSchema(fields=fields)
      +collection = Collection(name=COLLECTION_NAME, schema=schema)
      +
    6. +
    7. 在新建立的集合上建立索引,並將其載入記憶體。

      +
      # Create an AutoIndex index for collection
      +index_params = {
      +'metric_type':'L2',
      +'index_type':"IVF_FLAT",
      +'params':{'nlist': 16384}
      +}
      +collection.create_index(field_name="image_embedding", index_params=index_params)
      +collection.load()
      +
    8. +
    +

    完成這些步驟後,就可以插入集合並進行搜尋。任何新增的資料都會自動建立索引,並立即可供搜尋。如果資料非常新,搜尋速度可能會較慢,因為會對仍在編制索引的資料使用暴力搜尋。

    +

    插入資料

    在本範例中,我們將使用torch 及其 model hub 所提供的 ResNet50 模型。為了取得嵌入式資料,我們會去掉最後的分類層,結果模型會提供 2048 個維度的嵌入式資料。在torch 上找到的所有視覺模型都使用相同的預處理,我們在這裡也包含了相同的預處理。

    +

    在接下來的幾個步驟中,我們將會

    +
      +
    1. 載入資料。

      +
      import glob
      +
      +# Get the filepaths of the images
      +paths = glob.glob('./paintings/paintings/**/*.jpg', recursive=True)
      +len(paths)
      +
    2. +
    3. 將資料分批預先處理。

      +
      import torch
      +
      +# Load the embedding model with the last layer removed
      +model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True)
      +model = torch.nn.Sequential(*(list(model.children())[:-1]))
      +model.eval()
      +
    4. +
    5. 嵌入資料。

      +
      from torchvision import transforms
      +
      +# Preprocessing for images
      +preprocess = transforms.Compose([
      +    transforms.Resize(256),
      +    transforms.CenterCrop(224),
      +    transforms.ToTensor(),
      +    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
      +])
      +
    6. +
    7. 插入資料。

      +
      from PIL import Image
      +from tqdm import tqdm
      +
      +# Embed function that embeds the batch and inserts it
      +def embed(data):
      +    with torch.no_grad():
      +        output = model(torch.stack(data[0])).squeeze()
      +        collection.insert([data[1], output.tolist()])
      +
      +data_batch = [[],[]]
      +
      +# Read the images into batches for embedding and insertion
      +for path in tqdm(paths):
      +    im = Image.open(path).convert('RGB')
      +    data_batch[0].append(preprocess(im))
      +    data_batch[1].append(path)
      +    if len(data_batch[0]) % BATCH_SIZE == 0:
      +        embed(data_batch)
      +        data_batch = [[],[]]
      +
      +# Embed and insert the remainder
      +if len(data_batch[0]) != 0:
      +    embed(data_batch)
      +
      +# Call a flush to index any unsealed segments.
      +collection.flush()
      +
      +
      +
        +
      • 這個步驟相對耗時,因為嵌入需要時間。喝一口咖啡,放鬆一下。
      • +
      • PyTorch 可能無法在 Python 3.9 及更早的版本中順利運作。請考慮使用 Python 3.10 或更高版本。
      • +
      +
      +
    8. +
    +

    將所有資料插入 Milvus 之後,我們就可以開始執行搜尋了。在這個範例中,我們要搜尋兩個範例圖片。由於我們進行的是批次搜尋,因此搜尋時間是由批次中的影像共同分擔的。

    +
    import glob
    +
    +# Get the filepaths of the search images
    +search_paths = glob.glob('./paintings/test_paintings/**/*.jpg', recursive=True)
    +len(search_paths)
    +
    +
    import time
    +from matplotlib import pyplot as plt
    +
    +# Embed the search images
    +def embed(data):
    +    with torch.no_grad():
    +        ret = model(torch.stack(data))
    +        # If more than one image, use squeeze
    +        if len(ret) > 1:
    +            return ret.squeeze().tolist()
    +        # Squeeze would remove batch for single image, so using flatten
    +        else:
    +            return torch.flatten(ret, start_dim=1).tolist()
    +
    +data_batch = [[],[]]
    +
    +for path in search_paths:
    +    im = Image.open(path).convert('RGB')
    +    data_batch[0].append(preprocess(im))
    +    data_batch[1].append(path)
    +
    +embeds = embed(data_batch[0])
    +start = time.time()
    +res = collection.search(embeds, anns_field='image_embedding', param={'nprobe': 128}, limit=TOP_K, output_fields=['filepath'])
    +finish = time.time()
    +
    +
    # Show the image results
    +f, axarr = plt.subplots(len(data_batch[1]), TOP_K + 1, figsize=(20, 10), squeeze=False)
    +
    +for hits_i, hits in enumerate(res):
    +    axarr[hits_i][0].imshow(Image.open(data_batch[1][hits_i]))
    +    axarr[hits_i][0].set_axis_off()
    +    axarr[hits_i][0].set_title('Search Time: ' + str(finish - start))
    +    for hit_i, hit in enumerate(hits):
    +        axarr[hits_i][hit_i + 1].imshow(Image.open(hit.entity.get('filepath')))
    +        axarr[hits_i][hit_i + 1].set_axis_off()
    +        axarr[hits_i][hit_i + 1].set_title('Distance: ' + str(hit.distance))
    +
    +# Save the search result in a separate image file alongside your script.
    +plt.savefig('search_result.png')
    +
    +

    搜尋結果的影像應該類似於下圖:

    +

    + + Image search output + 影像搜尋輸出

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.json new file mode 100644 index 000000000..5e696e1a8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm pandas ragas\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from typing import List\nfrom tqdm import tqdm\nfrom openai import OpenAI\nfrom pymilvus import MilvusClient\n\n\nclass RAG:\n \"\"\"\n RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.\n \"\"\"\n\n def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):\n self._prepare_openai(openai_client)\n self._prepare_milvus(milvus_client)\n\n def _emb_text(self, text: str) -> List[float]:\n return (\n self.openai_client.embeddings.create(input=text, model=self.embedding_model)\n .data[0]\n .embedding\n )\n\n def _prepare_openai(\n self,\n openai_client: OpenAI,\n embedding_model: str = \"text-embedding-3-small\",\n llm_model: str = \"gpt-3.5-turbo\",\n ):\n self.openai_client = openai_client\n self.embedding_model = embedding_model\n self.llm_model = llm_model\n self.SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\n self.USER_PROMPT = \"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n\n def _prepare_milvus(\n self, milvus_client: MilvusClient, collection_name: str = \"rag_collection\"\n ):\n self.milvus_client = milvus_client\n self.collection_name = collection_name\n if self.milvus_client.has_collection(self.collection_name):\n self.milvus_client.drop_collection(self.collection_name)\n embedding_dim = len(self._emb_text(\"foo\"))\n self.milvus_client.create_collection(\n collection_name=self.collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n )\n\n def load(self, texts: List[str]):\n \"\"\"\n Load the text data into Milvus.\n \"\"\"\n data = []\n for i, line in enumerate(tqdm(texts, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": self._emb_text(line), \"text\": line})\n\n self.milvus_client.insert(collection_name=self.collection_name, data=data)\n\n def retrieve(self, question: str, top_k: int = 3) -> List[str]:\n \"\"\"\n Retrieve the most similar text data to the given question.\n \"\"\"\n search_res = self.milvus_client.search(\n collection_name=self.collection_name,\n data=[self._emb_text(question)],\n limit=top_k,\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n )\n retrieved_texts = [res[\"entity\"][\"text\"] for res in search_res[0]]\n return retrieved_texts[:top_k]\n\n def answer(\n self,\n question: str,\n retrieval_top_k: int = 3,\n return_retrieved_text: bool = False,\n ):\n \"\"\"\n Answer the given question with the retrieved knowledge.\n \"\"\"\n retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)\n user_prompt = self.USER_PROMPT.format(\n context=\"\\n\".join(retrieved_texts), question=question\n )\n response = self.openai_client.chat.completions.create(\n model=self.llm_model,\n messages=[\n {\"role\": \"system\", \"content\": self.SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n if not return_retrieved_text:\n return response.choices[0].message.content\n else:\n return response.choices[0].message.content, retrieved_texts\n","openai_client = OpenAI()\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\nmy_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)\n","import os\nimport urllib.request\n\nurl = \"https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md\"\nfile_path = \"./Milvus_DEVELOPMENT.md\"\n\nif not os.path.exists(file_path):\n urllib.request.urlretrieve(url, file_path)\nwith open(file_path, \"r\") as file:\n file_text = file.read()\n\n# We simply use \"# \" to separate the content in the file, which can roughly separate the content of each main part of the markdown file.\ntext_lines = file_text.split(\"# \")\nmy_rag.load(text_lines) # Load the text data into RAG pipeline\n","question = \"what is the hardware requirements specification if I want to build Milvus and run from source code?\"\nmy_rag.answer(question, return_retrieved_text=True)\n","from datasets import Dataset\nimport pandas as pd\n\nquestion_list = [\n \"what is the hardware requirements specification if I want to build Milvus and run from source code?\",\n \"What is the programming language used to write Knowhere?\",\n \"What should be ensured before running code coverage?\",\n]\nground_truth_list = [\n \"If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\\n\\n- 8GB of RAM\\n- 50GB of free disk space.\",\n \"The programming language used to write Knowhere is C++.\",\n \"Before running code coverage, you should make sure that your code changes are covered by unit tests.\",\n]\ncontexts_list = []\nanswer_list = []\nfor question in tqdm(question_list, desc=\"Answering questions\"):\n answer, contexts = my_rag.answer(question, return_retrieved_text=True)\n contexts_list.append(contexts)\n answer_list.append(answer)\n\ndf = pd.DataFrame(\n {\n \"question\": question_list,\n \"contexts\": contexts_list,\n \"answer\": answer_list,\n \"ground_truth\": ground_truth_list,\n }\n)\nrag_results = Dataset.from_pandas(df)\ndf\n","from ragas import evaluate\nfrom ragas.metrics import (\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n)\n\nresult = evaluate(\n rag_results,\n metrics=[\n answer_relevancy,\n faithfulness,\n context_recall,\n context_precision,\n ],\n)\n\nresult\n"],"headingContent":"Evaluation with Ragas","anchorList":[{"label":"使用 Ragas 進行評估","href":"Evaluation-with-Ragas","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"定義 RAG 管道","href":"Define-the-RAG-pipeline","type":2,"isActive":false},{"label":"執行 RAG 管道並獲得結果","href":"Run-the-RAG-pipeline-and-get-results","type":2,"isActive":false},{"label":"使用 Ragas 進行評估","href":"Evaluation-with-Ragas","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.md new file mode 100644 index 000000000..ff90a7b88 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_ragas.md @@ -0,0 +1,357 @@ +--- +id: integrate_with_ragas.md +summary: 本指南說明如何使用 Ragas 來評估建立在 Milvus 上的 Retrieval-Augmented Generation (RAG) 管道。 +title: 使用 Ragas 進行評估 +--- +

    使用 Ragas 進行評估

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 Ragas 來評估建立在Milvus 之上的檢索-增強生成 (RAG) 管道。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示生成新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    Ragas是一個可以幫助您評估 RAG 管道的框架。現有的工具和框架可以幫助您建立這些管道,但是評估它和量化您的管道效能可能很困難。這就是 Ragas (RAG 評估) 的用武之地。

    +

    先決條件

    在執行本筆記本之前,請確定您已安裝下列依賴項目:

    +
    $ pip install --upgrade pymilvus openai requests tqdm pandas ragas
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    定義 RAG 管道

    我們將定義以 Milvus 作為向量儲存、OpenAI 作為 LLM 的 RAG 類。該類包含load 方法 (將文字資料載入 Milvus)、retrieve 方法 (擷取與給定問題最相似的文字資料),以及answer 方法 (使用擷取的知識回答給定問題)。

    +
    from typing import List
    +from tqdm import tqdm
    +from openai import OpenAI
    +from pymilvus import MilvusClient
    +
    +
    +class RAG:
    +    """
    +    RAG (Retrieval-Augmented Generation) class built upon OpenAI and Milvus.
    +    """
    +
    +    def __init__(self, openai_client: OpenAI, milvus_client: MilvusClient):
    +        self._prepare_openai(openai_client)
    +        self._prepare_milvus(milvus_client)
    +
    +    def _emb_text(self, text: str) -> List[float]:
    +        return (
    +            self.openai_client.embeddings.create(input=text, model=self.embedding_model)
    +            .data[0]
    +            .embedding
    +        )
    +
    +    def _prepare_openai(
    +        self,
    +        openai_client: OpenAI,
    +        embedding_model: str = "text-embedding-3-small",
    +        llm_model: str = "gpt-3.5-turbo",
    +    ):
    +        self.openai_client = openai_client
    +        self.embedding_model = embedding_model
    +        self.llm_model = llm_model
    +        self.SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +        self.USER_PROMPT = """
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +    def _prepare_milvus(
    +        self, milvus_client: MilvusClient, collection_name: str = "rag_collection"
    +    ):
    +        self.milvus_client = milvus_client
    +        self.collection_name = collection_name
    +        if self.milvus_client.has_collection(self.collection_name):
    +            self.milvus_client.drop_collection(self.collection_name)
    +        embedding_dim = len(self._emb_text("foo"))
    +        self.milvus_client.create_collection(
    +            collection_name=self.collection_name,
    +            dimension=embedding_dim,
    +            metric_type="IP",  # Inner product distance
    +            consistency_level="Strong",  # Strong consistency level
    +        )
    +
    +    def load(self, texts: List[str]):
    +        """
    +        Load the text data into Milvus.
    +        """
    +        data = []
    +        for i, line in enumerate(tqdm(texts, desc="Creating embeddings")):
    +            data.append({"id": i, "vector": self._emb_text(line), "text": line})
    +
    +        self.milvus_client.insert(collection_name=self.collection_name, data=data)
    +
    +    def retrieve(self, question: str, top_k: int = 3) -> List[str]:
    +        """
    +        Retrieve the most similar text data to the given question.
    +        """
    +        search_res = self.milvus_client.search(
    +            collection_name=self.collection_name,
    +            data=[self._emb_text(question)],
    +            limit=top_k,
    +            search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +            output_fields=["text"],  # Return the text field
    +        )
    +        retrieved_texts = [res["entity"]["text"] for res in search_res[0]]
    +        return retrieved_texts[:top_k]
    +
    +    def answer(
    +        self,
    +        question: str,
    +        retrieval_top_k: int = 3,
    +        return_retrieved_text: bool = False,
    +    ):
    +        """
    +        Answer the given question with the retrieved knowledge.
    +        """
    +        retrieved_texts = self.retrieve(question, top_k=retrieval_top_k)
    +        user_prompt = self.USER_PROMPT.format(
    +            context="\n".join(retrieved_texts), question=question
    +        )
    +        response = self.openai_client.chat.completions.create(
    +            model=self.llm_model,
    +            messages=[
    +                {"role": "system", "content": self.SYSTEM_PROMPT},
    +                {"role": "user", "content": user_prompt},
    +            ],
    +        )
    +        if not return_retrieved_text:
    +            return response.choices[0].message.content
    +        else:
    +            return response.choices[0].message.content, retrieved_texts
    +
    +

    讓我們用 OpenAI 和 Milvus 客戶端初始化 RAG 類別。

    +
    openai_client = OpenAI()
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +my_rag = RAG(openai_client=openai_client, milvus_client=milvus_client)
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    執行 RAG 管道並獲得結果

    我們使用Milvus 開發指南作為 RAG 中的私有知識,這是簡單 RAG 管道的良好資料來源。

    +

    下載並載入 RAG 管道。

    +
    import os
    +import urllib.request
    +
    +url = "https://raw.githubusercontent.com/milvus-io/milvus/master/DEVELOPMENT.md"
    +file_path = "./Milvus_DEVELOPMENT.md"
    +
    +if not os.path.exists(file_path):
    +    urllib.request.urlretrieve(url, file_path)
    +with open(file_path, "r") as file:
    +    file_text = file.read()
    +
    +# We simply use "# " to separate the content in the file, which can roughly separate the content of each main part of the markdown file.
    +text_lines = file_text.split("# ")
    +my_rag.load(text_lines)  # Load the text data into RAG pipeline
    +
    +
    Creating embeddings: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 47/47 [00:16<00:00,  2.80it/s]
    +
    +

    讓我們定義一個關於開發指南文件內容的查詢問題。然後使用answer 方法取得答案和擷取的上下文文字。

    +
    question = "what is the hardware requirements specification if I want to build Milvus and run from source code?"
    +my_rag.answer(question, return_retrieved_text=True)
    +
    +
    ('The hardware requirements specification to build and run Milvus from source code is 8GB of RAM and 50GB of free disk space.',
    + ['Hardware Requirements\n\nThe following specification (either physical or virtual machine resources) is recommended for Milvus to build and run from source code.\n\n```\n- 8GB of RAM\n- 50GB of free disk space\n```\n\n##',
    +  'Building Milvus on a local OS/shell environment\n\nThe details below outline the hardware and software requirements for building on Linux and MacOS.\n\n##',
    +  "Software Requirements\n\nAll Linux distributions are available for Milvus development. However a majority of our contributor worked with Ubuntu or CentOS systems, with a small portion of Mac (both x86_64 and Apple Silicon) contributors. If you would like Milvus to build and run on other distributions, you are more than welcome to file an issue and contribute!\n\nHere's a list of verified OS types where Milvus can successfully build and run:\n\n- Debian/Ubuntu\n- Amazon Linux\n- MacOS (x86_64)\n- MacOS (Apple Silicon)\n\n##"])
    +
    +

    現在讓我們準備一些問題與其相對應的地面真實答案。我們從 RAG 管道取得答案和上下文。

    +
    from datasets import Dataset
    +import pandas as pd
    +
    +question_list = [
    +    "what is the hardware requirements specification if I want to build Milvus and run from source code?",
    +    "What is the programming language used to write Knowhere?",
    +    "What should be ensured before running code coverage?",
    +]
    +ground_truth_list = [
    +    "If you want to build Milvus and run from source code, the recommended hardware requirements specification is:\n\n- 8GB of RAM\n- 50GB of free disk space.",
    +    "The programming language used to write Knowhere is C++.",
    +    "Before running code coverage, you should make sure that your code changes are covered by unit tests.",
    +]
    +contexts_list = []
    +answer_list = []
    +for question in tqdm(question_list, desc="Answering questions"):
    +    answer, contexts = my_rag.answer(question, return_retrieved_text=True)
    +    contexts_list.append(contexts)
    +    answer_list.append(answer)
    +
    +df = pd.DataFrame(
    +    {
    +        "question": question_list,
    +        "contexts": contexts_list,
    +        "answer": answer_list,
    +        "ground_truth": ground_truth_list,
    +    }
    +)
    +rag_results = Dataset.from_pandas(df)
    +df
    +
    +
    Answering questions: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:03<00:00,  1.29s/it]
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    問題上下文答案地面真相
    0什麼是硬體需求規格?[Hardware Requirements/硬體需求規格]以下是...硬體需求規格是什麼?如果您想建立 Milvus 並從來源執行...
    1用什麼編程語言來寫...[CMake & Conan\n\nMilvus 的演算法函式庫...用來編寫知乎的程式語言是什麼?用什麼編程語言來寫Knowher...
    2在運行代碼覆蓋之前應確保哪些...[Code coverage\n/nBefore submitting your pull ...在執行程式碼覆蓋之前,您應該確保...在執行程式碼覆蓋之前,您應該確保 ...
    +
    +

    使用 Ragas 進行評估

    我們使用 Ragas 來評估 RAG 管道結果的效能。

    +

    Ragas 提供了一套易於使用的度量指標。我們以Answer relevancy,Faithfulness,Context recall, 和Context precision 作為評估 RAG 管道的指標。有關指標的詳細資訊,請參閱Ragas Metrics

    +
    from ragas import evaluate
    +from ragas.metrics import (
    +    answer_relevancy,
    +    faithfulness,
    +    context_recall,
    +    context_precision,
    +)
    +
    +result = evaluate(
    +    rag_results,
    +    metrics=[
    +        answer_relevancy,
    +        faithfulness,
    +        context_recall,
    +        context_precision,
    +    ],
    +)
    +
    +result
    +
    +
    Evaluating:   0%|          | 0/12 [00:00<?, ?it/s]
    +
    +
    +
    +
    +
    +{'answer_relevancy': 0.9445, 'faithfulness': 1.0000, 'context_recall': 1.0000, 'context_precision': 1.0000}
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.json new file mode 100644 index 000000000..dbc3be096 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus sentence-transformers datasets tqdm\n","from datasets import load_dataset\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nfrom tqdm import tqdm\n","embedding_dim = 384\ncollection_name = \"movie_embeddings\"\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","client = MilvusClient(uri=\"./sentence_transformers_example.db\")\n","fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n FieldSchema(name=\"year\", dtype=DataType.INT64),\n FieldSchema(name=\"origin\", dtype=DataType.VARCHAR, max_length=64),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"IP\")\nclient.create_index(collection_name, index_params)\n","model = SentenceTransformer(\"all-MiniLM-L12-v2\")\n","for batch in tqdm(ds.batch(batch_size=512)):\n embeddings = model.encode(batch[\"PlotSummary\"])\n data = [\n {\"title\": title, \"embedding\": embedding, \"year\": year, \"origin\": origin}\n for title, embedding, year, origin in zip(\n batch[\"Title\"], embeddings, batch[\"Release Year\"], batch[\"Origin/Ethnicity\"]\n )\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n 'A shark terrorizes an LA beach.',\n 'An archaeologist searches for ancient artifacts while fighting Nazis.',\n 'Teenagers in detention learn about themselves.',\n 'A teenager fakes illness to get off school and have adventures with two friends.',\n 'A young couple with a kid look after a hotel during winter and the husband goes insane.',\n 'Four turtles fight bad guys.'\n ]\n\n# Search the database based on input text\ndef embed_query(data):\n vectors = model.encode(data)\n return [x for x in vectors]\n\n\nquery_vectors = embed_query(queries)\n\nres = client.search(\n collection_name=collection_name,\n data=query_vectors,\n filter='origin == \"American\" and year > 1945 and year < 2000',\n anns_field=\"embedding\",\n limit=3,\n output_fields=[\"title\"],\n)\n\nfor idx, hits in enumerate(res):\n print(\"Query:\", queries[idx])\n print(\"Results:\")\n for hit in hits:\n print(hit[\"entity\"].get(\"title\"), \"(\", round(hit[\"distance\"], 2), \")\")\n print()\n","Query: An archaeologist searches for ancient artifacts while fighting Nazis.\nResults:\nLove Slaves of the Amazons ( 0.4 )\nA Time to Love and a Time to Die ( 0.39 )\nThe Fifth Element ( 0.39 )\n\nQuery: Teenagers in detention learn about themselves.\nResults:\nThe Breakfast Club ( 0.54 )\nUp the Academy ( 0.46 )\nFame ( 0.43 )\n\nQuery: A teenager fakes illness to get off school and have adventures with two friends.\nResults:\nFerris Bueller's Day Off ( 0.48 )\nFever Lake ( 0.47 )\nLosin' It ( 0.39 )\n\nQuery: A young couple with a kid look after a hotel during winter and the husband goes insane.\nResults:\nThe Shining ( 0.48 )\nThe Four Seasons ( 0.42 )\nHighball ( 0.41 )\n\nQuery: Four turtles fight bad guys.\nResults:\nTeenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )\nDevil May Hare ( 0.43 )\nAttack of the Giant Leeches ( 0.42 )\n"],"headingContent":"Movie Search Using Milvus and SentenceTransformers","anchorList":[{"label":"使用 Milvus 和 SentenceTransformers 搜尋電影","href":"Movie-Search-Using-Milvus-and-SentenceTransformers","type":1,"isActive":false},{"label":"所需的函式庫","href":"Required-Libraries","type":2,"isActive":false},{"label":"下載與開啟資料集","href":"Downloading-and-Opening-the-Dataset","type":2,"isActive":false},{"label":"連接至資料庫","href":"Connecting-to-the-Database","type":2,"isActive":false},{"label":"插入資料","href":"Inserting-the-Data","type":2,"isActive":false},{"label":"執行搜尋","href":"Performing-the-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.md new file mode 100644 index 000000000..2c5e448b2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_sentencetransformers.md @@ -0,0 +1,224 @@ +--- +id: integrate_with_sentencetransformers.md +summary: 本頁討論如何使用 Milvus 搜尋電影 +title: 使用 Milvus 和 SentenceTransformers 搜尋電影 +--- +

    使用 Milvus 和 SentenceTransformers 搜尋電影

    在這個範例中,我們將使用 Milvus 和 SentenceTransformers 函式庫搜尋電影劇情摘要。我們要使用的資料集是 HuggingFace 上託管的Wikipedia Movie Plots with Summaries

    +

    讓我們開始吧!

    +

    所需的函式庫

    在這個範例中,我們將使用pymilvus 連線使用 Milvus,使用sentence-transformers 產生向量嵌入,使用datasets 下載範例資料集。

    +
    pip install pymilvus sentence-transformers datasets tqdm
    +
    +
    from datasets import load_dataset
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +from tqdm import tqdm
    +
    +

    我們將定義一些全局參數、

    +
    embedding_dim = 384
    +collection_name = "movie_embeddings"
    +
    +

    下載與開啟資料集

    在單一行中,datasets 允許我們下載和開啟資料集。資料庫會在本機快取資料集,並在下次執行時使用該副本。每一行都包含一部電影的詳細資料,該電影附有一篇 Wikipedia 文章。我們使用Title,PlotSummary,Release YearOrigin/Ethnicity 列。

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +

    連接至資料庫

    此時,我們要開始設定 Milvus。步驟如下:

    +
      +
    1. 在本地檔案中建立一個 Milvus Lite 資料庫。(將此 URI 改為 Milvus Standalone 和 Milvus Distributed 的伺服器位址)。
    2. +
    +
    client = MilvusClient(uri="./sentence_transformers_example.db")
    +
    +
      +
    1. 建立資料模式。這將指定組成元素的欄位,包括向量嵌入的維度。
    2. +
    +
    fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +    FieldSchema(name="year", dtype=DataType.INT64),
    +    FieldSchema(name="origin", dtype=DataType.VARCHAR, max_length=64),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +
      +
    1. 定義向量搜尋索引演算法。Milvus Lite 支援 FLAT 索引類型,而 Milvus Standalone 和 Milvus Distributed 則實施多種方法,例如 IVF、HNSW 和 DiskANN。對於本範例中的小型資料,任何搜尋索引類型都已經足夠,因此我們在此使用最簡單的 FLAT 索引類型。
    2. +
    +
    index_params = client.prepare_index_params()
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="IP")
    +client.create_index(collection_name, index_params)
    +
    +

    完成這些步驟後,我們就可以將資料插入資料庫並執行搜尋。任何新增的資料都會自動建立索引,並立即可供搜尋。如果資料非常新,搜尋速度可能會較慢,因為會對仍在建立索引過程中的資料使用暴力搜尋。

    +

    插入資料

    在這個範例中,我們要使用 SentenceTransformers miniLM 模型來建立繪圖文字的嵌入。這個模型會傳回 384 個維度的嵌入。

    +
    model = SentenceTransformer("all-MiniLM-L12-v2")
    +
    +

    我們在資料的行上循環,嵌入圖面摘要欄位,並將實體插入向量資料庫。一般而言,您應該在成批的資料項目上執行此步驟,以最大化嵌入模型的 CPU 或 GPU 吞吐量,就像我們在這裡所做的一樣。

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    embeddings = model.encode(batch["PlotSummary"])
    +    data = [
    +        {"title": title, "embedding": embedding, "year": year, "origin": origin}
    +        for title, embedding, year, origin in zip(
    +            batch["Title"], embeddings, batch["Release Year"], batch["Origin/Ethnicity"]
    +        )
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    上述操作相對耗時,因為嵌入需要時間。在 2023 MacBook Pro 上使用 CPU 執行此步驟約需 2 分鐘,使用專用 GPU 執行此步驟則會更快。休息一下,喝杯咖啡吧!

    +
    +

    將所有資料插入 Milvus 後,我們就可以開始執行搜尋。在這個範例中,我們要根據 Wikipedia 的劇情摘要搜尋電影。由於我們進行的是批次搜尋,因此搜尋時間會在電影搜尋中共享。(您能猜到我心目中根據查詢描述文字要檢索哪部電影嗎?)

    +
    queries = [
    +    'A shark terrorizes an LA beach.',
    +    'An archaeologist searches for ancient artifacts while fighting Nazis.',
    +    'Teenagers in detention learn about themselves.',
    +    'A teenager fakes illness to get off school and have adventures with two friends.',
    +    'A young couple with a kid look after a hotel during winter and the husband goes insane.',
    +    'Four turtles fight bad guys.'
    +    ]
    +
    +# Search the database based on input text
    +def embed_query(data):
    +    vectors = model.encode(data)
    +    return [x for x in vectors]
    +
    +
    +query_vectors = embed_query(queries)
    +
    +res = client.search(
    +    collection_name=collection_name,
    +    data=query_vectors,
    +    filter='origin == "American" and year > 1945 and year < 2000',
    +    anns_field="embedding",
    +    limit=3,
    +    output_fields=["title"],
    +)
    +
    +for idx, hits in enumerate(res):
    +    print("Query:", queries[idx])
    +    print("Results:")
    +    for hit in hits:
    +        print(hit["entity"].get("title"), "(", round(hit["distance"], 2), ")")
    +    print()
    +
    +

    結果如下

    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +Love Slaves of the Amazons ( 0.4 )
    +A Time to Love and a Time to Die ( 0.39 )
    +The Fifth Element ( 0.39 )
    +
    +Query: Teenagers in detention learn about themselves.
    +Results:
    +The Breakfast Club ( 0.54 )
    +Up the Academy ( 0.46 )
    +Fame ( 0.43 )
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +Ferris Bueller's Day Off ( 0.48 )
    +Fever Lake ( 0.47 )
    +Losin' It ( 0.39 )
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining ( 0.48 )
    +The Four Seasons ( 0.42 )
    +Highball ( 0.41 )
    +
    +Query: Four turtles fight bad guys.
    +Results:
    +Teenage Mutant Ninja Turtles II: The Secret of the Ooze ( 0.47 )
    +Devil May Hare ( 0.43 )
    +Attack of the Giant Leeches ( 0.42 )
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.json new file mode 100644 index 000000000..35ca6d683 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.json @@ -0,0 +1 @@ +{"codeList":["snowsql -a ${instance_name} -u ${user_name}\n","USE ROLE ACCOUNTADMIN;\nCREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH\n TYPE=oauth\n OAUTH_CLIENT=snowservices_ingress\n ENABLED=true;\n \nUSE ROLE ACCOUNTADMIN;\nGRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;\n","USE ROLE SECURITYADMIN;\nCREATE ROLE MILVUS_ROLE;\n\nUSE ROLE USERADMIN;\nCREATE USER milvus_user\n PASSWORD='milvususerok'\n DEFAULT_ROLE = MILVUS_ROLE\n DEFAULT_SECONDARY_ROLES = ('ALL')\n MUST_CHANGE_PASSWORD = FALSE;\n \nUSE ROLE SECURITYADMIN;\nGRANT ROLE MILVUS_ROLE TO USER milvus_user;\n","USE ROLE SYSADMIN;\nCREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH\nWAREHOUSE_SIZE='X-SMALL'\nAUTO_SUSPEND = 180\nAUTO_RESUME = true\nINITIALLY_SUSPENDED=false;\n\nUSE ROLE SYSADMIN;\nCREATE DATABASE IF NOT EXISTS MILVUS_DEMO;\nUSE DATABASE MILVUS_DEMO;\nCREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nCREATE OR REPLACE STAGE YAML_STAGE;\nCREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\nCREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');\n","USE ROLE SECURITYADMIN;\nGRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;\nGRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;\n","USE ROLE ACCOUNTADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\nCREATE NETWORK RULE allow_all_rule\nTYPE = 'HOST_PORT'\nMODE= 'EGRESS'\nVALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');\n\nCREATE EXTERNAL ACCESS INTEGRATION allow_all_eai\nALLOWED_NETWORK_RULES=(allow_all_rule)\nENABLED=TRUE;\n\nGRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;\n","cd ${repo_git_root_path}\ndocker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus\ndocker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter\n","docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}\n","docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","docker images | grep milvus\n\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus latest 3721bbb8f62b 2 days ago 2.95GB\n${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter latest 20633f5bcadf 2 days ago 2GB\n","docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus\ndocker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter\n","USE ROLE SYSADMIN;\nCREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\nCREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL\n MIN_NODES = 1\n MAX_NODES = 1\n INSTANCE_FAMILY = CPU_X64_S\n AUTO_RESUME = true;\n","DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;\nDESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;\n","PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;\nPUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;\n","USE ROLE SYSADMIN;\nUSE DATABASE MILVUS_DEMO;\nUSE SCHEMA PUBLIC;\n\nCREATE SERVICE MILVUS\n IN COMPUTE POOL MILVUS_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='milvus.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n\nCREATE SERVICE JUPYTER\n IN COMPUTE POOL JUPYTER_COMPUTE_POOL \n FROM @YAML_STAGE\n SPEC='jupyter.yaml'\n MIN_INSTANCES=1\n MAX_INSTANCES=1;\n","SHOW SERVICES;\n\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| name | database_name | schema_name | owner | compute_pool | dns_name | ......\n|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n| JUPYTER | MILVUS_DEMO | PUBLIC | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... \n| MILVUS | MILVUS_DEMO | PUBLIC | SYSADMIN | MILVUS_COMPUTE_POOL | milvus.public.milvus-demo.snowflakecomputing.internal | ......\n+---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------\n","USE ROLE SECURITYADMIN;\nGRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;\n","USE ROLE SYSADMIN;\nSHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;\n","docs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n","USE ROLE ACCOUNTADMIN;\nDROP USER milvus_user;\n\nUSE ROLE SYSADMIN;\nDROP SERVICE MILVUS;\nDROP SERVICE JUPYTER;\n\nDROP COMPUTE POOL MILVUS_COMPUTE_POOL;\nDROP COMPUTE POOL JUPYTER_COMPUTE_POOL;\n\nDROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;\nDROP DATABASE MILVUS_DEMO;\nDROP WAREHOUSE MILVUS_WAREHOUSE;\n\nUSE ROLE ACCOUNTADMIN;\nDROP ROLE MILVUS_ROLE;\nDROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;\n"],"headingContent":"Milvus on Snowpark Container Services","anchorList":[{"label":"在 Snowpark 容器服務上使用 Milvus","href":"Milvus-on-Snowpark-Container-Services","type":1,"isActive":false},{"label":"關於 Snowpark 容器服務","href":"About-Snowpark-Container-Services","type":2,"isActive":false},{"label":"配置 Milvus 演示","href":"Configure-Milvus-demo","type":2,"isActive":false},{"label":"使用筆記本","href":"Use-Notebook","type":2,"isActive":false},{"label":"7.清理","href":"7-Clean-up","type":2,"isActive":false},{"label":"關於 Milvus","href":"About-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.md new file mode 100644 index 000000000..f6b51fc8e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_snowpark.md @@ -0,0 +1,320 @@ +--- +id: integrate_with_snowpark.md +summary: 本指南演示如何在 Snowpark 容器服務上啟動 Milvus 演示。 +title: 在 Snowpark 容器服務上使用 Milvus +--- +

    在 Snowpark 容器服務上使用 Milvus

    本指南演示如何在 Snowpark 容器服務上啟動 Milvus 演示。

    +

    關於 Snowpark 容器服務

    Snowpark Container Services 是完全受管理的容器產品,旨在促進 Snowflake 生態系統內容器化應用程式的部署、管理和擴充。此服務可讓使用者直接在 Snowflake 內執行容器化工作負載,確保資料不需移出 Snowflake 環境進行處理。如需詳細資訊,請參閱官方介紹:Snowpark 容器服務

    +

    配置 Milvus 演示

    以下將透過配置與程式碼,讓使用者了解 Milvus 的功能,以及如何在 SPCS 中使用 Milvus。

    +

    1.取得帳號資訊

    下載 SPCS 客戶端:SnowSQL,然後登入您的帳戶。

    +
    snowsql -a ${instance_name} -u ${user_name}
    +
    +

    ${instance_name} 的規則是${org_name}-${acct_name} 。登入app.snowflake.com並查看個人帳戶資訊,即可獲得相關資訊。

    +

    + + Snowflake account information + 雪花帳戶資訊

    +

    2.配置角色和權限

    配置 OAUTH 整合。

    +
    USE ROLE ACCOUNTADMIN;
    +CREATE SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH
    +  TYPE=oauth
    +  OAUTH_CLIENT=snowservices_ingress
    +  ENABLED=true;
    +  
    +USE ROLE ACCOUNTADMIN;
    +GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SYSADMIN;
    +
    +

    為服務建立角色,注意此處的${PASSWORD} 部分需要在演示時由使用者取代

    +
    USE ROLE SECURITYADMIN;
    +CREATE ROLE MILVUS_ROLE;
    +
    +USE ROLE USERADMIN;
    +CREATE USER milvus_user
    +  PASSWORD='milvususerok'
    +  DEFAULT_ROLE = MILVUS_ROLE
    +  DEFAULT_SECONDARY_ROLES = ('ALL')
    +  MUST_CHANGE_PASSWORD = FALSE;
    +  
    +USE ROLE SECURITYADMIN;
    +GRANT ROLE MILVUS_ROLE TO USER milvus_user;
    +
    +

    3.建立資料儲存設定

      +
    • 建立倉庫和資料庫

      +
      USE ROLE SYSADMIN;
      +CREATE OR REPLACE WAREHOUSE MILVUS_WAREHOUSE WITH
      +WAREHOUSE_SIZE='X-SMALL'
      +AUTO_SUSPEND = 180
      +AUTO_RESUME = true
      +INITIALLY_SUSPENDED=false;
      +
      +USE ROLE SYSADMIN;
      +CREATE DATABASE IF NOT EXISTS MILVUS_DEMO;
      +USE DATABASE MILVUS_DEMO;
      +CREATE IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
      +CREATE OR REPLACE STAGE YAML_STAGE;
      +CREATE OR REPLACE STAGE DATA ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +CREATE OR REPLACE STAGE FILES ENCRYPTION = (TYPE = 'SNOWFLAKE_SSE');
      +
    • +
    • 授予角色權限

      +
      USE ROLE SECURITYADMIN;
      +GRANT ALL PRIVILEGES ON DATABASE MILVUS_DEMO TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON SCHEMA MILVUS_DEMO.PUBLIC TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON WAREHOUSE MILVUS_WAREHOUSE TO MILVUS_ROLE;
      +GRANT ALL PRIVILEGES ON STAGE MILVUS_DEMO.PUBLIC.FILES TO MILVUS_ROLE;
      +
    • +
    • 配置 ACL

      +
      USE ROLE ACCOUNTADMIN;
      +USE DATABASE MILVUS_DEMO;
      +USE SCHEMA PUBLIC;
      +CREATE NETWORK RULE allow_all_rule
      +TYPE = 'HOST_PORT'
      +MODE= 'EGRESS'
      +VALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');
      +
      +CREATE EXTERNAL ACCESS INTEGRATION allow_all_eai
      +ALLOWED_NETWORK_RULES=(allow_all_rule)
      +ENABLED=TRUE;
      +
      +GRANT USAGE ON INTEGRATION allow_all_eai TO ROLE SYSADMIN;
      +
    • +
    +

    4.建立影像

    Milvus 使用的映像需要在本地建立,然後由使用者上傳。關於 image 的相關設定,請參考此 repo。克隆代碼後,到專案根目錄準備建立映像。

    +
      +
    • 在本機建立映像

      +

      開啟本機 shell 並開始建立映像。

      +
      cd ${repo_git_root_path}
      +docker build --rm --no-cache --platform linux/amd64 -t milvus ./images/milvus
      +docker build --rm --no-cache --platform linux/amd64 -t jupyter ./images/jupyter
      +
      +

      這裡有兩個映像,第一個是執行 Milvus 資料庫,第二個是用來顯示的筆記型電腦。

      +

      本機影像建立完成後,準備標記並上傳。

    • +
    • 標記已建立的影像

      +

      登入 SPCS 的 docker hub。

      +
      docker login ${instance_name}.registry.snowflakecomputing.com -u ${user_name}
      +
      +

      就可以為 spcs 的映像加上標籤了。

      +
      docker tag milvus ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker tag jupyter ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
      +

      然後在本機 shell 中使用docker images | grep milvus 檢查影像是否已成功打包並加上標籤。

      +
      docker images | grep milvus
      +
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus    latest        3721bbb8f62b   2 days ago    2.95GB
      +${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter   latest        20633f5bcadf   2 days ago    2GB
      +
    • +
    • 推送影像到 SPCS

      +
      docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/milvus
      +docker push ${instance_name}.registry.snowflakecomputing.com/milvus_demo/public/milvus_repo/jupyter
      +
    • +
    +

    5.建立並啟動服務

    讓我們回到 SnowSQL shell。

    +
      +
    • 建立運算池
    • +
    +
    USE ROLE SYSADMIN;
    +CREATE COMPUTE POOL IF NOT EXISTS MILVUS_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +CREATE COMPUTE POOL IF NOT EXISTS JUPYTER_COMPUTE_POOL
    +  MIN_NODES = 1
    +  MAX_NODES = 1
    +  INSTANCE_FAMILY = CPU_X64_S
    +  AUTO_RESUME = true;
    +
    +

    透過DESCRIBE 檢查計算池,直到狀態為ACTIVEIDLE

    +
    DESCRIBE COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DESCRIBE COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +

    + + Compute pool status + 計算池狀態

    +
      +
    • 上傳規格檔案
    • +
    +

    建立計算池後,開始準備服務的 spce 檔案。這些檔案也在此 repo 中。請參考 specs 目錄。

    +

    打開這兩個服務的 spec 檔案,在 spec 檔案中找到${org_name}-${acct_name} ,並用您自己帳號的 ${instance_name} 取代。修改後,使用 SnowSQL 完成上傳。

    +
    PUT file://${path/to/jupyter.yaml} @yaml_stage overwrite=true auto_compress=false;
    +PUT file://${path/to/milvus.yaml} @yaml_stage overwrite=true auto_compress=false;
    +
    +
      +
    • 建立服務
    • +
    +

    上傳完成後,您就可以建立服務了,繼續完成建立服務的程序。

    +
    USE ROLE SYSADMIN;
    +USE DATABASE MILVUS_DEMO;
    +USE SCHEMA PUBLIC;
    +
    +CREATE SERVICE MILVUS
    +  IN COMPUTE POOL MILVUS_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='milvus.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +CREATE SERVICE JUPYTER
    +  IN COMPUTE POOL JUPYTER_COMPUTE_POOL 
    +  FROM @YAML_STAGE
    +  SPEC='jupyter.yaml'
    +  MIN_INSTANCES=1
    +  MAX_INSTANCES=1;
    +
    +

    也可透過SHOW SERVICES; 檢視服務。

    +
    SHOW SERVICES;
    +
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| name    | database_name | schema_name | owner    | compute_pool         | dns_name                                               | ......
    +|---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +| JUPYTER | MILVUS_DEMO   | PUBLIC      | SYSADMIN | JUPYTER_COMPUTE_POOL | jupyter.public.milvus-demo.snowflakecomputing.internal | ...... 
    +| MILVUS  | MILVUS_DEMO   | PUBLIC      | SYSADMIN | MILVUS_COMPUTE_POOL  | milvus.public.milvus-demo.snowflakecomputing.internal  | ......
    ++---------+---------------+-------------+----------+----------------------+--------------------------------------------------------+-----------------
    +
    +

    如果您在啟動服務時遇到問題,您可以透過CALL SYSTEM$GET_SERVICE_STATUS('milvus'); 檢視服務資訊。

    +

    + + Service status + 服務狀態

    +

    可透過CALL SYSTEM$GET_SERVICE_LOGS('milvus', '0', 'milvus', 10); 獲得更多資訊。

    +

    使用筆記本

    使用SnowSQL授予權限。

    +
    USE ROLE SECURITYADMIN;
    +GRANT USAGE ON SERVICE MILVUS_DEMO.PUBLIC.JUPYTER TO ROLE MILVUS_ROLE;
    +
    +

    然後檢視並記錄 Jupyter nootbook 的端點。

    +
    USE ROLE SYSADMIN;
    +SHOW ENDPOINTS IN SERVICE MILVUS_DEMO.PUBLIC.JUPYTER;
    +
    +

    記錄ingress_url 部分資訊,然後開啟瀏覽器並輸入ingress_url ,使用 milvus_user 帳號登入網站。

    +

    + + Obtain the ingress URL + 取得入口 URL

    +

    透過ingress_url 開啟筆記型電腦,雙擊頁面上的TestMilvus.ipynb 檔案試用 Milvus。選擇程式碼區塊的第一部分,然後按一下執行按鈕,開始建立連線和初始化嵌入功能。

    +

    + + Run TestMilvus.ipynb in the notebook + 在筆記型電腦中執行 TestMilvus.ipynb

    +

    建立連線後,繼續按一下RUN。程式碼會將一段文字經過嵌入處理後,變成向量資料,再插入到 Milvus 中。

    +
    docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +

    然後使用一段文字作為查詢:"Who started AI research?",執行嵌入處理後的查詢,最後獲得並顯示最相關的結果。

    +

    + + Obtain and display the most relevant results + 取得並顯示最相關的結果

    +

    關於 Milvus 客戶端的使用方法,您可以參考Milvus Doc章節。

    +

    7.清理

    驗證完成後,您可以使用 SnowSQL 來清理服務、角色和資料資源。

    +
    USE ROLE ACCOUNTADMIN;
    +DROP USER milvus_user;
    +
    +USE ROLE SYSADMIN;
    +DROP SERVICE MILVUS;
    +DROP SERVICE JUPYTER;
    +
    +DROP COMPUTE POOL MILVUS_COMPUTE_POOL;
    +DROP COMPUTE POOL JUPYTER_COMPUTE_POOL;
    +
    +DROP IMAGE REPOSITORY MILVUS_DEMO.PUBLIC.MILVUS_REPO;
    +DROP DATABASE MILVUS_DEMO;
    +DROP WAREHOUSE MILVUS_WAREHOUSE;
    +
    +USE ROLE ACCOUNTADMIN;
    +DROP ROLE MILVUS_ROLE;
    +DROP SECURITY INTEGRATION SNOWSERVICES_INGRESS_OAUTH;
    +
    +

    關於 Milvus

    關於 Milvus 的更多資訊,您可以從Milvus 介紹快速入門開始。當然,還有更詳細的 API 介紹,請參考PythonJava版本,另外還有EmbeddingsIntegrations的相關資訊可供參考。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.json new file mode 100644 index 000000000..7e6c6dff1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.json @@ -0,0 +1 @@ +{"codeList":["wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar\n","from pyspark.sql import SparkSession\n\ncolumns = [\"id\", \"text\", \"vec\"]\ndata = [(1, \"a\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (2, \"b\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (3, \"c\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),\n (4, \"d\", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]\nsample_df = spark.sparkContext.parallelize(data).toDF(columns)\nsample_df.write \\\n .mode(\"append\") \\\n .option(\"milvus.host\", \"localhost\") \\\n .option(\"milvus.port\", \"19530\") \\\n .option(\"milvus.collection.name\", \"hello_spark_milvus\") \\\n .option(\"milvus.collection.vectorField\", \"vec\") \\\n .option(\"milvus.collection.vectorDim\", \"8\") \\\n .option(\"milvus.collection.primaryKeyField\", \"id\") \\\n .format(\"milvus\") \\\n .save()\n","import org.apache.spark.sql.{SaveMode, SparkSession}\n\nobject Hello extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"HelloSparkMilvus\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"a\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (2, \"b\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (3, \"c\", Seq(1.0,2.0,3.0,4.0,5.0)),\n (4, \"d\", Seq(1.0,2.0,3.0,4.0,5.0))\n ).toDF(\"id\", \"text\", \"vec\")\n\n // set milvus options\n val milvusOptions = Map(\n \"milvus.host\" -> \"localhost\" -> uri,\n \"milvus.port\" -> \"19530\",\n \"milvus.collection.name\" -> \"hello_spark_milvus\",\n \"milvus.collection.vectorField\" -> \"vec\",\n \"milvus.collection.vectorDim\" -> \"5\",\n \"milvus.collection.primaryKeyField\", \"id\"\n )\n \n sampleDF.write.format(\"milvus\")\n .options(milvusOptions)\n .mode(SaveMode.Append)\n .save()\n}\n","val df = spark.read\n .format(\"milvusbinlog\")\n .load(path)\n .withColumnRenamed(\"val\", \"embedding\")\n","{\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]}\n{\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]}\n{\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]}\n{\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]}\n{\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n","{\n \"rows\":[\n {\"book_id\": 101, \"word_count\": 13, \"book_intro\": [1.1, 1.2]},\n {\"book_id\": 102, \"word_count\": 25, \"book_intro\": [2.1, 2.2]},\n {\"book_id\": 103, \"word_count\": 7, \"book_intro\": [3.1, 3.2]},\n {\"book_id\": 104, \"word_count\": 12, \"book_intro\": [4.1, 4.2]},\n {\"book_id\": 105, \"word_count\": 34, \"book_intro\": [5.1, 5.2]}\n ]\n}\n","val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n","df.write.format(\"parquet\").save(outputPath)\nMilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, \"parquet\")\n","spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar\n","import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.{SaveMode, SparkSession}\nimport zilliztech.spark.milvus.MilvusOptions._\n\nimport org.apache.spark.ml.linalg.Vector\n\nobject Mysql2MilvusDemo extends App {\n\n val spark = SparkSession.builder().master(\"local[*]\")\n .appName(\"Mysql2MilvusDemo\")\n .getOrCreate()\n\n import spark.implicits._\n\n // Create DataFrame\n val sampleDF = Seq(\n (1, \"Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models.\"),\n (2, \"As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. \"),\n (3, \"Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data.\"),\n (4, \"As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.\")\n ).toDF(\"id\", \"text\")\n\n // Write to MySQL Table\n sampleDF.write\n .mode(SaveMode.Append)\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .save()\n\n // Read from MySQL Table\n val dfMysql = spark.read\n .format(\"jdbc\")\n .option(\"driver\",\"com.mysql.cj.jdbc.Driver\")\n .option(\"url\", \"jdbc:mysql://localhost:3306/test\")\n .option(\"dbtable\", \"demo\")\n .option(\"user\", \"root\")\n .option(\"password\", \"123456\")\n .load()\n\n val tokenizer = new Tokenizer().setInputCol(\"text\").setOutputCol(\"tokens\")\n val tokenizedDf = tokenizer.transform(dfMysql)\n\n // Learn a mapping from words to Vectors.\n val word2Vec = new Word2Vec()\n .setInputCol(\"tokens\")\n .setOutputCol(\"vectors\")\n .setVectorSize(128)\n .setMinCount(0)\n val model = word2Vec.fit(tokenizedDf)\n\n val result = model.transform(tokenizedDf)\n\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // Apply the UDF to the DataFrame\n val resultDF = result.withColumn(\"embedding\", vectorToArrayUDF($\"vectors\"))\n val milvusDf = resultDF.drop(\"tokens\").drop(\"vectors\")\n\n milvusDf.write.format(\"milvus\")\n .option(MILVUS_HOST, \"localhost\")\n .option(MILVUS_PORT, \"19530\")\n .option(MILVUS_COLLECTION_NAME, \"text_embedding\")\n .option(MILVUS_COLLECTION_VECTOR_FIELD, \"embedding\")\n .option(MILVUS_COLLECTION_VECTOR_DIM, \"128\")\n .option(MILVUS_COLLECTION_PRIMARY_KEY, \"id\")\n .mode(SaveMode.Append)\n .save()\n}\n","import org.apache.spark.ml.feature.PCA\nimport org.apache.spark.ml.linalg.{Vector, Vectors}\nimport org.apache.spark.SparkConf\nimport org.apache.spark.sql.SparkSession\nimport org.apache.spark.sql.functions.udf\nimport org.apache.spark.sql.util.CaseInsensitiveStringMap\nimport zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}\n\nimport scala.collection.JavaConverters._\n\nobject TransformDemo extends App {\n val sparkConf = new SparkConf().setMaster(\"local\")\n val spark = SparkSession.builder().config(sparkConf).getOrCreate()\n\n import spark.implicits._\n\n val host = \"localhost\"\n val port = 19530\n val user = \"root\"\n val password = \"Milvus\"\n val fs = \"s3a://\"\n val bucketName = \"a-bucket\"\n val rootPath = \"files\"\n val minioAK = \"minioadmin\"\n val minioSK = \"minioadmin\"\n val minioEndpoint = \"localhost:9000\"\n val collectionName = \"hello_spark_milvus1\"\n val targetCollectionName = \"hello_spark_milvus2\"\n\n val properties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n\n // 1, configurations\n val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))\n\n // 2, batch read milvus collection data to dataframe\n // Schema: dim of `embeddings` is 8\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=8 |\n // +-+------------+------------+------------------+\n val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))\n val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)\n .withColumn(\"embeddings_vec\", arrayToVectorUDF($\"embeddings\"))\n .drop(\"embeddings\")\n \n // 3. Use PCA to reduce dim of vector\n val dim = 4\n val pca = new PCA()\n .setInputCol(\"embeddings_vec\")\n .setOutputCol(\"pca_vec\")\n .setK(dim)\n .fit(collectionDF)\n val vectorToArrayUDF = udf((v: Vector) => v.toArray)\n // embeddings dim number reduce to 4\n // +-+------------+------------+------------------+\n // | | field name | field type | other attributes |\n // +-+------------+------------+------------------+\n // |1| \"pk\" | Int64 | is_primary=True |\n // | | | | auto_id=False |\n // +-+------------+------------+------------------+\n // |2| \"random\" | Double | |\n // +-+------------+------------+------------------+\n // |3|\"embeddings\"| FloatVector| dim=4 |\n // +-+------------+------------+------------------+\n val pcaDf = pca.transform(collectionDF)\n .withColumn(\"embeddings\", vectorToArrayUDF($\"pca_vec\"))\n .select(\"pk\", \"random\", \"embeddings\")\n\n // 4. Write PCAed data to S3\n val outputPath = \"s3a://a-bucket/result\"\n pcaDf.write\n .mode(\"overwrite\")\n .format(\"parquet\")\n .save(outputPath)\n\n // 5. Config MilvusOptions of target table \n val targetProperties = Map(\n MilvusOptions.MILVUS_HOST -> host,\n MilvusOptions.MILVUS_PORT -> port.toString,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n )\n val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n // 6. Bulkinsert Spark output files into milvus\n MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"parquet\")\n}\n","// Write the data in batch into the Milvus bucket storage.\nval outputPath = \"s3://my-temp-bucket/result\"\ndf.write\n .mode(\"overwrite\")\n .format(\"mjson\")\n .save(outputPath)\n// Specify Milvus options.\nval targetProperties = Map(\n MilvusOptions.MILVUS_URI -> zilliz_uri,\n MilvusOptions.MILVUS_TOKEN -> zilliz_token,\n MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,\n MilvusOptions.MILVUS_BUCKET -> bucketName,\n MilvusOptions.MILVUS_ROOTPATH -> rootPath,\n MilvusOptions.MILVUS_FS -> fs,\n MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,\n MilvusOptions.MILVUS_STORAGE_USER -> minioAK,\n MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,\n)\nval targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))\n \n// Bulk insert Spark output files into Milvus\nMilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, \"mjson\")\n"],"headingContent":"Spark-Milvus Connector User Guide","anchorList":[{"label":"Spark-Milvus Connector 使用手冊","href":"Spark-Milvus-Connector-User-Guide","type":1,"isActive":false},{"label":"快速啟動","href":"Quick-start","type":2,"isActive":false},{"label":"功能與概念","href":"Features--concepts","type":2,"isActive":false},{"label":"Milvus 資料格式","href":"Milvus-data-format","type":2,"isActive":false},{"label":"MilvusUtils","href":"MilvusUtils","type":2,"isActive":false},{"label":"進階用法","href":"Advanced-Usage","type":2,"isActive":false},{"label":"實際操作","href":"Hands-on","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.md new file mode 100644 index 000000000..303862b41 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_spark.md @@ -0,0 +1,505 @@ +--- +id: integrate_with_spark.md +summary: 本頁討論 Spark-Milvus 連接器。 +title: Spark-Milvus Connector 使用手冊 +--- +

    Spark-Milvus Connector 使用手冊

    Spark-Milvus Connector (https://github.com/zilliztech/spark-milvus) 提供 Apache Spark 和 Milvus 的無縫整合,結合 Apache Spark 的資料處理和 ML 功能,以及 Milvus 的向量資料儲存和搜尋功能。此整合可實現各種有趣的應用,包括

    +
      +
    • 有效率地將向量資料大量載入 Milvus、
    • +
    • 在 Milvus 與其他儲存系統或資料庫之間移動資料、
    • +
    • 利用 Spark MLlib 及其他 AI 工具分析 Milvus 中的資料。
    • +
    +

    快速啟動

    準備工作

    Spark-Milvus Connector 支援 Scala 和 Python 程式語言。使用者可搭配PysparkSpark-shell 使用。若要執行本範例,請依照下列步驟建立包含 Spark-Milvus Connector 相依性的 Spark 環境:

    +
      +
    1. 安裝 Apache Spark (版本 >= 3.3.0)

      +

      您可以參考官方文件安裝 Apache Spark。

    2. +
    3. 下載spark-milvusjar 檔案。

      +
      wget https://github.com/zilliztech/spark-milvus/raw/1.0.0-SNAPSHOT/output/spark-milvus-1.0.0-SNAPSHOT.jar
      +
    4. +
    5. spark-milvusjar 作為其中一個依賴項目,啟動 Spark 執行時間。

      +

      若要使用 Spark-Milvus Connector 來啟動 Spark runtime,請將下載的spark-milvus作為相依性加入指令中。

      +
        +
      • pyspark

        +
        ./bin/pyspark --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
      • spark-shell

        +
        ./bin/spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar
        +
      • +
    6. +
    +

    示範

    在這個示範中,我們會建立一個有向量資料的 Spark DataFrame 範例,並透過 Spark-Milvus Connector 將資料寫入 Milvus。一個集合會根據 schema 和指定的選項自動在 Milvus 中建立。

    + +
    from pyspark.sql import SparkSession
    +
    +columns = ["id", "text", "vec"]
    +data = [(1, "a", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (2, "b", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (3, "c", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0]),
    +    (4, "d", [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0])]
    +sample_df = spark.sparkContext.parallelize(data).toDF(columns)
    +sample_df.write \
    +    .mode("append") \
    +    .option("milvus.host", "localhost") \
    +    .option("milvus.port", "19530") \
    +    .option("milvus.collection.name", "hello_spark_milvus") \
    +    .option("milvus.collection.vectorField", "vec") \
    +    .option("milvus.collection.vectorDim", "8") \
    +    .option("milvus.collection.primaryKeyField", "id") \
    +    .format("milvus") \
    +    .save()
    +
    +
    import org.apache.spark.sql.{SaveMode, SparkSession}
    +
    +object Hello extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("HelloSparkMilvus")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "a", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (2, "b", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (3, "c", Seq(1.0,2.0,3.0,4.0,5.0)),
    +    (4, "d", Seq(1.0,2.0,3.0,4.0,5.0))
    +  ).toDF("id", "text", "vec")
    +
    +  // set milvus options
    +  val milvusOptions = Map(
    +      "milvus.host" -> "localhost" -> uri,
    +      "milvus.port" -> "19530",
    +      "milvus.collection.name" -> "hello_spark_milvus",
    +      "milvus.collection.vectorField" -> "vec",
    +      "milvus.collection.vectorDim" -> "5",
    +      "milvus.collection.primaryKeyField", "id"
    +    )
    +    
    +  sampleDF.write.format("milvus")
    +    .options(milvusOptions)
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    執行上述程式碼後,您可以使用 SDK 或 Attu (A Milvus Dashboard) 在 Milvus 中檢視插入的資料。您可以發現一個名為hello_spark_milvus 的集合已經被插入了 4 個實體。

    +

    功能與概念

    Milvus 選項

    快速入門部分,我們展示了使用 Milvus 操作時的設定選項。這些選項被抽象為 Milvus 選項。它們用來建立與 Milvus 的連線,並控制其他 Milvus 行為。不是所有的選項都是強制性的。

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    選項關鍵預設值說明
    milvus.hostlocalhostMilvus 伺服器主機。詳細資訊請參閱管理 Milvus 連線
    milvus.port19530Milvus 伺服器連接埠。詳細資訊請參閱管理 Milvus 連線
    milvus.usernamerootMilvus 伺服器的使用者名稱。詳細資訊請參閱管理 Milvus 連線
    milvus.passwordMilvusMilvus 伺服器密碼。詳細資訊請參閱管理 Milvus 連線
    milvus.uri--Milvus 伺服器 URI。詳情請參閱管理 Milvus 連線
    milvus.token--Milvus 伺服器代碼。詳情請參閱管理 Milvus 連線
    milvus.database.namedefault要讀取或寫入的 Milvus 資料庫名稱。
    milvus.collection.namehello_milvus要讀取或寫入的 Milvus 資料庫名稱。
    milvus.collection.primaryKeyFieldNone資料集中主索引欄位的名稱。如果集合不存在,則為必填字段。
    milvus.collection.vectorFieldNone集合中向量欄位的名稱。若集合不存在,則必須填寫。
    milvus.collection.vectorDimNone集合中向量欄位的尺寸。若集合不存在,則必須填寫。
    milvus.collection.autoIDfalse如果集合不存在,此選項指定是否自動為實體產生 ID。更多資訊,請參閱create_collection
    milvus.bucketa-bucketMilvus 儲存中的 Bucket 名稱。這應該與milvus.yaml 中的minio.bucketName 相同。
    milvus.rootpathfilesMilvus 儲存的根目錄。這應該與milvus.yaml 中的minio.rootpath 相同。
    milvus.fss3a://Milvus 儲存的檔案系統。s3a:// 適用於開放原始碼 Spark。對於 Databricks,請使用s3://
    milvus.storage.endpointlocalhost:9000Milvus 儲存的端點。這應該與milvus.yaml 中的minio.address:minio.port 相同。
    milvus.storage.userminioadminMilvus 儲存的使用者。這應該與milvus.yaml 中的minio.accessKeyID 相同。
    milvus.storage.passwordminioadminMilvus 儲存的密碼。這應該與milvus.yaml 中的minio.secretAccessKey 相同。
    milvus.storage.useSSLfalse是否為 Milvus 儲存使用 SSL。這應該與milvus.yaml 中的minio.useSSL 相同。
    +

    Milvus 資料格式

    Spark-Milvus Connector 支援以下列 Milvus 資料格式讀寫資料:

    +
      +
    • milvus:Milvus 資料格式,可從 Spark DataFrame 無縫轉換為 Milvus 實體。
    • +
    • milvusbinlog:讀取 Milvus 內建 binlog 資料的 Milvus 資料格式。
    • +
    • mjson:Milvus JSON 格式,用於將大量資料插入 Milvus。
    • +
    +

    Milvus

    快速啟動中,我們使用milvus格式將範例資料寫入 Milvus 叢集。milvus格式是一種新的資料格式,支援將 Spark DataFrame 資料無縫寫入 Milvus 集合。這是透過批次呼叫 Milvus SDK 的 Insert API 來實現的。如果 Milvus 中不存在集合,則會根據 Dataframe 的模式創建一個新的集合。然而,自動建立的集合可能不支援集合模式的所有功能。因此,建議先透過 SDK 建立集合,然後再使用 spark-milvus 進行寫入。如需更多資訊,請參閱示範

    +

    milvusbinlog

    新的資料格式milvusbinlog是用來讀取 Milvus 內建的 binlog 資料。Binlog 是 Milvus 基於 parquet 的內部資料儲存格式。除非您熟悉 Milvus 內部儲存的細節,否則不建議直接使用milvusbinlog。我們建議使用將在下一節介紹的MilvusUtils函式。

    +
    val df = spark.read
    +  .format("milvusbinlog")
    +  .load(path)
    +  .withColumnRenamed("val", "embedding")
    +
    +

    mjson

    Milvus 提供Bulkinsert功能,以便在操作大型資料集時有更好的寫入效能。然而,Milvus 使用的 JSON 格式與 Spark 預設的 JSON 輸出格式略有不同,為了解決這個問題,我們引入mjson資料格式來產生符合 Milvus 要求的資料。以下是一個範例,說明 JSON-lines 和mjson 的差異:

    +
      +
    • JSON-lines:

      +
      {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]}
      +{"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]}
      +{"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]}
      +{"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]}
      +{"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +
    • +
    • mjson (Milvus Bulkinsert 所需的):

      +
      {
      +    "rows":[
      +        {"book_id": 101, "word_count": 13, "book_intro": [1.1, 1.2]},
      +        {"book_id": 102, "word_count": 25, "book_intro": [2.1, 2.2]},
      +        {"book_id": 103, "word_count": 7, "book_intro": [3.1, 3.2]},
      +        {"book_id": 104, "word_count": 12, "book_intro": [4.1, 4.2]},
      +        {"book_id": 105, "word_count": 34, "book_intro": [5.1, 5.2]}
      +    ]
      +}
      +
    • +
    +

    這將在未來得到改進。如果您的 Milvus 版本是 v2.3.7+ 且支援使用 Parquet 格式的 bulkinsert,我們建議您在 spark-milvus 整合中使用 parquet 格式。請參閱 Github 上的示範

    +

    MilvusUtils

    MilvusUtils 包含數個有用的 util 函數。目前只支援 Scala。更多使用範例請參閱進階使用部分。

    +

    MilvusUtils.readMilvusCollection

    MilvusUtils.readMilvusCollection是一個簡單的介面,用來載入整個 Milvus 套件到 Spark 資料框。它包裝了各種操作,包括呼叫 Milvus SDK、讀取milvusbinlog和一般的union/join操作。

    +
    val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +
    +

    MilvusUtils.bulkInsertFromSpark

    MilvusUtils.bulkInsertFromSpark提供了一個方便的方式,將 Spark 輸出檔案大量匯入 Milvus。它包裝了 Milvus SDK 的BullkinsertAPI。

    +
    df.write.format("parquet").save(outputPath)
    +MilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputPath, "parquet")
    +
    +

    進階用法

    在本節中,您將找到 Spark-Milvus Connector 用於資料分析和遷移的進階使用範例。如需更多示範,請參閱範例

    +

    MySQL -> 嵌入 -> Milvus

    在這個示範中,我們會

    +
      +
    1. 透過 Spark-MySQL Connector 從 MySQL 讀取資料、
    2. +
    3. 產生 embedding (以 Word2Vec 為例),以及
    4. +
    5. 將嵌入資料寫入 Milvus。
    6. +
    +

    要啟用 Spark-MySQL Connector,您需要在 Spark 環境中加入下列依賴:

    +
    spark-shell --jars spark-milvus-1.0.0-SNAPSHOT.jar,mysql-connector-j-x.x.x.jar
    +
    +
    import org.apache.spark.ml.feature.{Tokenizer, Word2Vec}
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.{SaveMode, SparkSession}
    +import zilliztech.spark.milvus.MilvusOptions._
    +
    +import org.apache.spark.ml.linalg.Vector
    +
    +object Mysql2MilvusDemo  extends App {
    +
    +  val spark = SparkSession.builder().master("local[*]")
    +    .appName("Mysql2MilvusDemo")
    +    .getOrCreate()
    +
    +  import spark.implicits._
    +
    +  // Create DataFrame
    +  val sampleDF = Seq(
    +    (1, "Milvus was created in 2019 with a singular goal: store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models."),
    +    (2, "As a database specifically designed to handle queries over input vectors, it is capable of indexing vectors on a trillion scale. "),
    +    (3, "Unlike existing relational databases which mainly deal with structured data following a pre-defined pattern, Milvus is designed from the bottom-up to handle embedding vectors converted from unstructured data."),
    +    (4, "As the Internet grew and evolved, unstructured data became more and more common, including emails, papers, IoT sensor data, Facebook photos, protein structures, and much more.")
    +  ).toDF("id", "text")
    +
    +  // Write to MySQL Table
    +  sampleDF.write
    +    .mode(SaveMode.Append)
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .save()
    +
    +  // Read from MySQL Table
    +  val dfMysql = spark.read
    +    .format("jdbc")
    +    .option("driver","com.mysql.cj.jdbc.Driver")
    +    .option("url", "jdbc:mysql://localhost:3306/test")
    +    .option("dbtable", "demo")
    +    .option("user", "root")
    +    .option("password", "123456")
    +    .load()
    +
    +  val tokenizer = new Tokenizer().setInputCol("text").setOutputCol("tokens")
    +  val tokenizedDf = tokenizer.transform(dfMysql)
    +
    +  // Learn a mapping from words to Vectors.
    +  val word2Vec = new Word2Vec()
    +    .setInputCol("tokens")
    +    .setOutputCol("vectors")
    +    .setVectorSize(128)
    +    .setMinCount(0)
    +  val model = word2Vec.fit(tokenizedDf)
    +
    +  val result = model.transform(tokenizedDf)
    +
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // Apply the UDF to the DataFrame
    +  val resultDF = result.withColumn("embedding", vectorToArrayUDF($"vectors"))
    +  val milvusDf = resultDF.drop("tokens").drop("vectors")
    +
    +  milvusDf.write.format("milvus")
    +    .option(MILVUS_HOST, "localhost")
    +    .option(MILVUS_PORT, "19530")
    +    .option(MILVUS_COLLECTION_NAME, "text_embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_FIELD, "embedding")
    +    .option(MILVUS_COLLECTION_VECTOR_DIM, "128")
    +    .option(MILVUS_COLLECTION_PRIMARY_KEY, "id")
    +    .mode(SaveMode.Append)
    +    .save()
    +}
    +
    +

    Milvus -> Transform -> Milvus

    在這個示範中,我們會

    +
      +
    1. 從 Milvus 套件讀取資料、
    2. +
    3. 套用轉換 (以 PCA 為例),以及
    4. +
    5. 透過 Bulkinsert API 將轉換後的資料寫入另一個 Milvus。
    6. +
    +
    +

    PCA 模型是一種轉換模型,可降低嵌入向量的維度,這是機器學習中常見的操作。 您可以在轉換步驟中加入任何其他處理操作,例如過濾、連結或歸一化。

    +
    +
    import org.apache.spark.ml.feature.PCA
    +import org.apache.spark.ml.linalg.{Vector, Vectors}
    +import org.apache.spark.SparkConf
    +import org.apache.spark.sql.SparkSession
    +import org.apache.spark.sql.functions.udf
    +import org.apache.spark.sql.util.CaseInsensitiveStringMap
    +import zilliztech.spark.milvus.{MilvusOptions, MilvusUtils}
    +
    +import scala.collection.JavaConverters._
    +
    +object TransformDemo extends App {
    +  val sparkConf = new SparkConf().setMaster("local")
    +  val spark = SparkSession.builder().config(sparkConf).getOrCreate()
    +
    +  import spark.implicits._
    +
    +  val host = "localhost"
    +  val port = 19530
    +  val user = "root"
    +  val password = "Milvus"
    +  val fs = "s3a://"
    +  val bucketName = "a-bucket"
    +  val rootPath = "files"
    +  val minioAK = "minioadmin"
    +  val minioSK = "minioadmin"
    +  val minioEndpoint = "localhost:9000"
    +  val collectionName = "hello_spark_milvus1"
    +  val targetCollectionName = "hello_spark_milvus2"
    +
    +  val properties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> collectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +
    +  // 1, configurations
    +  val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))
    +
    +  // 2, batch read milvus collection data to dataframe
    +  //  Schema: dim of `embeddings` is 8
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=8        |
    +  // +-+------------+------------+------------------+
    +  val arrayToVectorUDF = udf((arr: Seq[Double]) => Vectors.dense(arr.toArray[Double]))
    +  val collectionDF = MilvusUtils.readMilvusCollection(spark, milvusOptions)
    +    .withColumn("embeddings_vec", arrayToVectorUDF($"embeddings"))
    +    .drop("embeddings")
    +  
    +  // 3. Use PCA to reduce dim of vector
    +  val dim = 4
    +  val pca = new PCA()
    +    .setInputCol("embeddings_vec")
    +    .setOutputCol("pca_vec")
    +    .setK(dim)
    +    .fit(collectionDF)
    +  val vectorToArrayUDF = udf((v: Vector) => v.toArray)
    +  // embeddings dim number reduce to 4
    +  // +-+------------+------------+------------------+
    +  // | | field name | field type | other attributes |
    +  // +-+------------+------------+------------------+
    +  // |1|    "pk"    |    Int64   |  is_primary=True |
    +  // | |            |            |   auto_id=False  |
    +  // +-+------------+------------+------------------+
    +  // |2|  "random"  |    Double  |                  |
    +  // +-+------------+------------+------------------+
    +  // |3|"embeddings"| FloatVector|     dim=4        |
    +  // +-+------------+------------+------------------+
    +  val pcaDf = pca.transform(collectionDF)
    +    .withColumn("embeddings", vectorToArrayUDF($"pca_vec"))
    +    .select("pk", "random", "embeddings")
    +
    +  // 4. Write PCAed data to S3
    +  val outputPath = "s3a://a-bucket/result"
    +  pcaDf.write
    +    .mode("overwrite")
    +    .format("parquet")
    +    .save(outputPath)
    +
    +  // 5. Config MilvusOptions of target table  
    +  val targetProperties = Map(
    +    MilvusOptions.MILVUS_HOST -> host,
    +    MilvusOptions.MILVUS_PORT -> port.toString,
    +    MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +    MilvusOptions.MILVUS_BUCKET -> bucketName,
    +    MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +    MilvusOptions.MILVUS_FS -> fs,
    +    MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +    MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +    MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +  )
    +  val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +  // 6. Bulkinsert Spark output files into milvus
    +  MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
    +}
    +
    +

    Databricks -> Zilliz Cloud

    如果您使用 Zilliz Cloud(Milvus 的管理服務),您可以利用其便利的資料匯入 API。Zilliz Cloud 提供全面的工具和說明文件,協助您有效率地從各種資料來源移動資料,包括 Spark 和 Databricks。只需設定一個 S3 bucket 作為中介,並開放其存取至您的 Zilliz Cloud 帳戶。Zilliz Cloud 的資料匯入 API 會自動從 S3 資料桶載入整批資料到您的 Zilliz Cloud 叢集。

    +

    準備工作

    +
      +
    1. 將 jar 檔案加入您的 Databricks Cluster,載入 Spark 運行時間。

      +

      您可以用不同的方式安裝函式庫。此螢幕截圖顯示從本機上傳 jar 到叢集。如需詳細資訊,請參閱 Databricks 文件中的叢集函式庫。

      +

      + + Install Databricks Library + 安裝 Databricks 函式庫

    2. +
    3. 建立一個 S3 bucket,並將其設定為 Databricks 叢集的外部儲存位置。

      +

      Bulkinsert 要求將資料儲存在臨時儲存桶中,以便 Zilliz Cloud 可以批次匯入資料。您可以创建一个 S3 bucket 并将其配置为 databricks 的外部位置。詳情請參閱外部位置

    4. +
    5. 保護您的 Databricks 認證。

      +

      如需詳細資訊,請參閱部落格 Securely Managing Credentials in Databricks 的說明。

    6. +
    +

    示範

    +

    以下是展示批次資料遷移過程的程式碼片段。類似於上述 Milvus 的範例,您只需要更換憑證和 S3 儲存桶位址。

    +
    // Write the data in batch into the Milvus bucket storage.
    +val outputPath = "s3://my-temp-bucket/result"
    +df.write
    +  .mode("overwrite")
    +  .format("mjson")
    +  .save(outputPath)
    +// Specify Milvus options.
    +val targetProperties = Map(
    +  MilvusOptions.MILVUS_URI -> zilliz_uri,
    +  MilvusOptions.MILVUS_TOKEN -> zilliz_token,
    +  MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,
    +  MilvusOptions.MILVUS_BUCKET -> bucketName,
    +  MilvusOptions.MILVUS_ROOTPATH -> rootPath,
    +  MilvusOptions.MILVUS_FS -> fs,
    +  MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,
    +  MilvusOptions.MILVUS_STORAGE_USER -> minioAK,
    +  MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
    +)
    +val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))
    +  
    +// Bulk insert Spark output files into Milvus
    +MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "mjson")
    +
    +

    實際操作

    為了幫助您快速上手 Spark-Milvus Connector,我們準備了一本筆記本,教您如何使用 Milvus 和 Zilliz Cloud 進行串流和批次資料傳輸。

    + diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.json new file mode 100644 index 000000000..319dabf47 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"vanna[milvus,openai]\"\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from pymilvus import MilvusClient, model\nfrom vanna.milvus import Milvus_VectorStore\nfrom vanna.openai import OpenAI_Chat\n\n\nclass VannaMilvus(Milvus_VectorStore, OpenAI_Chat):\n def __init__(self, config=None):\n Milvus_VectorStore.__init__(self, config=config)\n OpenAI_Chat.__init__(self, config=config)\n","milvus_uri = \"./milvus_vanna.db\"\n\nmilvus_client = MilvusClient(uri=milvus_uri)\n\nvn_milvus = VannaMilvus(\n config={\n \"api_key\": os.getenv(\"OPENAI_API_KEY\"),\n \"model\": \"gpt-3.5-turbo\",\n \"milvus_client\": milvus_client,\n \"embedding_function\": model.DefaultEmbeddingFunction(),\n \"n_results\": 2, # The number of results to return from Milvus semantic search.\n }\n)\n","import sqlite3\n\nsqlite_path = \"./my-database.sqlite\"\nsql_connect = sqlite3.connect(sqlite_path)\nc = sql_connect.cursor()\n\ninit_sqls = \"\"\"\nCREATE TABLE IF NOT EXISTS Customer (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Company TEXT NOT NULL,\n City TEXT NOT NULL,\n Phone TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS Company (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Name TEXT NOT NULL,\n Industry TEXT NOT NULL,\n Location TEXT NOT NULL,\n EmployeeCount INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS User (\n ID INTEGER PRIMARY KEY AUTOINCREMENT,\n Username TEXT NOT NULL UNIQUE,\n Email TEXT NOT NULL UNIQUE\n);\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');\n\nINSERT INTO Customer (Name, Company, City, Phone) \nVALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');\n\nINSERT INTO Company (Name, Industry, Location, EmployeeCount)\nVALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);\n\nINSERT INTO User (Username, Email)\nVALUES ('johndoe123', 'johndoe123@example.com');\n\"\"\"\n\nfor sql in init_sqls.split(\";\"):\n c.execute(sql)\n\nsql_connect.commit()\n\n# Connect to the SQLite database\nvn_milvus.connect_to_sqlite(sqlite_path)\n","# If there exists training data, we should remove it before training.\nexisting_training_data = vn_milvus.get_training_data()\nif len(existing_training_data) > 0:\n for _, training_data in existing_training_data.iterrows():\n vn_milvus.remove_training_data(training_data[\"id\"])\n\n# Get the DDL of the SQLite database\ndf_ddl = vn_milvus.run_sql(\"SELECT type, sql FROM sqlite_master WHERE sql is not null\")\n\n# Train the model on the DDL data\nfor ddl in df_ddl[\"sql\"].to_list():\n vn_milvus.train(ddl=ddl)\n","# Add documentation about your business terminology or definitions.\nvn_milvus.train(\n documentation=\"ABC Corp specializes in cutting-edge technology solutions and innovation.\"\n)\nvn_milvus.train(\n documentation=\"XYZ Inc is a global leader in manufacturing and supply chain management.\"\n)\n\n# You can also add SQL queries to your training data.\nvn_milvus.train(sql=\"SELECT * FROM Customer WHERE Name = 'John Doe'\")\n","training_data = vn_milvus.get_training_data()\ntraining_data\n","sql = vn_milvus.generate_sql(\"what is the phone number of John Doe?\")\nvn_milvus.run_sql(sql)\n","sql = vn_milvus.generate_sql(\"which customer works for a manufacturing corporation?\")\nvn_milvus.run_sql(sql)\n","sql_connect.close()\nmilvus_client.close()\n\nos.remove(sqlite_path)\nif os.path.exists(milvus_uri):\n os.remove(milvus_uri)\n"],"headingContent":"Write SQL with Vanna and Milvus","anchorList":[{"label":"使用 Vanna 和 Milvus 寫 SQL","href":"Write-SQL-with-Vanna-and-Milvus","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"資料準備","href":"Data-preparation","type":2,"isActive":false},{"label":"使用資料進行訓練","href":"Train-with-data","type":2,"isActive":false},{"label":"產生 SQL 並執行","href":"Generate-SQLs-and-execute-them","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.md new file mode 100644 index 000000000..73ede7541 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_vanna.md @@ -0,0 +1,367 @@ +--- +id: integrate_with_vanna.md +summary: 本指南示範如何使用 Vanna 根據您儲存於資料庫的資料,產生並執行 SQL 查詢。 +title: 使用 Vanna 和 Milvus 寫 SQL +--- +

    使用 Vanna 和 Milvus 寫 SQL

    Open In Colab +GitHub Repository

    +

    Vanna是一個開放原始碼的 Python RAG(Retrieval-Augmented Generation)框架,用於 SQL 生成和相關功能。Milvus是世界上最先進的開放原始碼向量資料庫,用於嵌入相似性搜尋和人工智能應用程式。

    +

    Vanna 可透過兩個簡單的步驟運作 - 在您的資料上訓練 RAG「模型」,然後發問問題,這些問題會回傳 SQL 查詢,這些查詢可以設定為在您的資料庫上執行。本指南將示範如何使用 Vanna 根據資料庫中儲存的資料,產生並執行 SQL 查詢。

    +

    先決條件

    在執行本筆記本之前,請確定您已安裝下列依賴項目:

    +
    $ pip install "vanna[milvus,openai]"
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面頂端的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    而且您需要在環境變數中設定OPENAI_API_KEY 。您可以從OpenAI 取得 API 金鑰。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    資料準備

    首先,我們需要繼承 Vanna 的Milvus_VectorStoreOpenAI_Chat 類,並定義一個結合兩者功能的新類VannaMilvus

    +
    from pymilvus import MilvusClient, model
    +from vanna.milvus import Milvus_VectorStore
    +from vanna.openai import OpenAI_Chat
    +
    +
    +class VannaMilvus(Milvus_VectorStore, OpenAI_Chat):
    +    def __init__(self, config=None):
    +        Milvus_VectorStore.__init__(self, config=config)
    +        OpenAI_Chat.__init__(self, config=config)
    +
    +

    我們使用必要的組態參數初始化VannaMilvus 類別。我們使用milvus_client 的實例來儲存嵌入式資料,並使用從milvus_model初始化的model.DefaultEmbeddingFunction() 來產生嵌入式資料。C

    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +
    milvus_uri = "./milvus_vanna.db"
    +
    +milvus_client = MilvusClient(uri=milvus_uri)
    +
    +vn_milvus = VannaMilvus(
    +    config={
    +        "api_key": os.getenv("OPENAI_API_KEY"),
    +        "model": "gpt-3.5-turbo",
    +        "milvus_client": milvus_client,
    +        "embedding_function": model.DefaultEmbeddingFunction(),
    +        "n_results": 2,  # The number of results to return from Milvus semantic search.
    +    }
    +)
    +
    +

    這是一個只有少數資料樣本的簡單範例,因此我們將n_results 設定為 2,以確保我們搜尋前 2 個最相似的結果。實際上,在處理較大的訓練資料集時,您應該將n_results 設定為較高的值。

    +

    我們將使用一個樣本 SQLite 資料庫,其中有幾個包含一些樣本資料的資料表。

    +
    import sqlite3
    +
    +sqlite_path = "./my-database.sqlite"
    +sql_connect = sqlite3.connect(sqlite_path)
    +c = sql_connect.cursor()
    +
    +init_sqls = """
    +CREATE TABLE IF NOT EXISTS Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +);
    +
    +CREATE TABLE IF NOT EXISTS User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +);
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('John Doe', 'ABC Corp', 'New York', '123-456-7890');
    +
    +INSERT INTO Customer (Name, Company, City, Phone) 
    +VALUES ('Jane Smith', 'XYZ Inc', 'Los Angeles', '098-765-4321');
    +
    +INSERT INTO Company (Name, Industry, Location, EmployeeCount)
    +VALUES ('ABC Corp', 'cutting-edge technology', 'New York', 100);
    +
    +INSERT INTO User (Username, Email)
    +VALUES ('johndoe123', 'johndoe123@example.com');
    +"""
    +
    +for sql in init_sqls.split(";"):
    +    c.execute(sql)
    +
    +sql_connect.commit()
    +
    +# Connect to the SQLite database
    +vn_milvus.connect_to_sqlite(sqlite_path)
    +
    +

    使用資料進行訓練

    我們可以在 SQLite 資料庫的 DDL 資料上訓練模型。我們取得 DDL 資料,並將其送入train 函式。

    +
    # If there exists training data, we should remove it before training.
    +existing_training_data = vn_milvus.get_training_data()
    +if len(existing_training_data) > 0:
    +    for _, training_data in existing_training_data.iterrows():
    +        vn_milvus.remove_training_data(training_data["id"])
    +
    +# Get the DDL of the SQLite database
    +df_ddl = vn_milvus.run_sql("SELECT type, sql FROM sqlite_master WHERE sql is not null")
    +
    +# Train the model on the DDL data
    +for ddl in df_ddl["sql"].to_list():
    +    vn_milvus.train(ddl=ddl)
    +
    +
    Adding ddl: CREATE TABLE Customer (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Company TEXT NOT NULL,
    +    City TEXT NOT NULL,
    +    Phone TEXT NOT NULL
    +)
    +Adding ddl: CREATE TABLE sqlite_sequence(name,seq)
    +Adding ddl: CREATE TABLE Company (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Name TEXT NOT NULL,
    +    Industry TEXT NOT NULL,
    +    Location TEXT NOT NULL,
    +    EmployeeCount INTEGER NOT NULL
    +)
    +Adding ddl: CREATE TABLE User (
    +    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    +    Username TEXT NOT NULL UNIQUE,
    +    Email TEXT NOT NULL UNIQUE
    +)
    +
    +

    除了在 DDL 資料上進行訓練外,我們也可以在資料庫的文件和 SQL 查詢上進行訓練。

    +
    # Add documentation about your business terminology or definitions.
    +vn_milvus.train(
    +    documentation="ABC Corp specializes in cutting-edge technology solutions and innovation."
    +)
    +vn_milvus.train(
    +    documentation="XYZ Inc is a global leader in manufacturing and supply chain management."
    +)
    +
    +# You can also add SQL queries to your training data.
    +vn_milvus.train(sql="SELECT * FROM Customer WHERE Name = 'John Doe'")
    +
    +
    Adding documentation....
    +Adding documentation....
    +Using model gpt-3.5-turbo for 65.0 tokens (approx)
    +Question generated with sql: What are the details of the customer named John Doe? 
    +Adding SQL...
    +
    +
    +
    +
    +
    +'595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sql'
    +
    +

    讓我們來看看訓練資料。

    +
    training_data = vn_milvus.get_training_data()
    +training_data
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #id問題內容
    0595b185c-e6ad-47b0-98fd-0e93ef9b6a0a-sql名為 Joh... 的客戶的詳細資料是什麼?SELECT * FROM Customer WHERE Name = 'John Doe'
    025f4956c-e370-4097-994f-996f22d145fa-ddlCREATE TABLE Company (\n ID INTEGER PRIMARY...
    1b95ecc66-f65b-49dc-a9f1-c1842ad230ff-ddlCREATE TABLE Customer (\n ID INTEGER PRIMAR...
    2fcc73d15-30a5-4421-9d73-b8c3b0ed5305-ddlCREATE TABLE sqlite_sequence(name,seq)
    3feae618c-5910-4f6f-8b4b-6cc3e03aec06-ddlCREATE TABLE User (\n ID INTEGER PRIMARY KE...
    079a48db1-ba1f-4fd5-be99-74f2ca2eaeeb-docXYZ Inc 是一家全球領先的製造和服務供應商。
    19f9df1b8-ae62-4823-ad28-d7e0f2d1f4c0-docABC Corp 專門從事尖端技術的研發與生產。
    +
    +

    產生 SQL 並執行

    由於我們已經訓練過 DDL 資料,現在資料表結構可以用來產生 SQL 查詢。

    +

    讓我們嘗試一個簡單的問題。

    +
    sql = vn_milvus.generate_sql("what is the phone number of John Doe?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\nCREATE TABLE User (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Username TEXT NOT NULL UNIQUE,\n    Email TEXT NOT NULL UNIQUE\n)\n\n\n===Additional Context \n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'what is the phone number of John Doe?'}]
    +Using model gpt-3.5-turbo for 367.25 tokens (approx)
    +LLM Response: SELECT Phone FROM Customer WHERE Name = 'John Doe'
    +
    +
    + + + + + + + + + + + + + +
    #電話
    0123-456-7890
    +
    +

    下面是一個比較複雜的問題。製造企業名稱資訊在文件資料中,屬於背景資訊。產生的 SQL 查詢將根據特定的製造公司名稱擷取客戶資訊。

    +
    sql = vn_milvus.generate_sql("which customer works for a manufacturing corporation?")
    +vn_milvus.run_sql(sql)
    +
    +
    SQL Prompt: [{'role': 'system', 'content': "You are a SQLite expert. Please help to generate a SQL query to answer the question. Your response should ONLY be based on the given context and follow the response guidelines and format instructions. \n===Tables \nCREATE TABLE Company (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Industry TEXT NOT NULL,\n    Location TEXT NOT NULL,\n    EmployeeCount INTEGER NOT NULL\n)\n\nCREATE TABLE Customer (\n    ID INTEGER PRIMARY KEY AUTOINCREMENT,\n    Name TEXT NOT NULL,\n    Company TEXT NOT NULL,\n    City TEXT NOT NULL,\n    Phone TEXT NOT NULL\n)\n\n\n===Additional Context \n\nXYZ Inc is a global leader in manufacturing and supply chain management.\n\nABC Corp specializes in cutting-edge technology solutions and innovation.\n\n===Response Guidelines \n1. If the provided context is sufficient, please generate a valid SQL query without any explanations for the question. \n2. If the provided context is almost sufficient but requires knowledge of a specific string in a particular column, please generate an intermediate SQL query to find the distinct strings in that column. Prepend the query with a comment saying intermediate_sql \n3. If the provided context is insufficient, please explain why it can't be generated. \n4. Please use the most relevant table(s). \n5. If the question has been asked and answered before, please repeat the answer exactly as it was given before. \n"}, {'role': 'user', 'content': 'What are the details of the customer named John Doe?'}, {'role': 'assistant', 'content': "SELECT * FROM Customer WHERE Name = 'John Doe'"}, {'role': 'user', 'content': 'which customer works for a manufacturing corporation?'}]
    +Using model gpt-3.5-turbo for 384.25 tokens (approx)
    +LLM Response: SELECT * 
    +FROM Customer 
    +WHERE Company = 'XYZ Inc'
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    #ID名稱公司名稱城市電話
    02簡-史密斯XYZ Inc洛杉磯098-765-4321
    +
    +

    中斷 SQLite 和 Milvus 的連線,並將其移除以釋放資源。

    +
    sql_connect.close()
    +milvus_client.close()
    +
    +os.remove(sqlite_path)
    +if os.path.exists(milvus_uri):
    +    os.remove(milvus_uri)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.json new file mode 100644 index 000000000..88d010161 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.json @@ -0,0 +1 @@ +{"codeList":["python3 -m pip install pymilvus fiftyone torch torchvision\n","import fiftyone as fo\nimport fiftyone.brain as fob\nimport fiftyone.zoo as foz\n\n# Step 1: Load your data into FiftyOne\ndataset = foz.load_zoo_dataset(\"quickstart\")\n\n# Steps 2 and 3: Compute embeddings and create a similarity index\nmilvus_index = fob.compute_similarity(\n dataset,\n brain_key=\"milvus_index\",\n backend=\"milvus\",\n)\n","# Step 4: Query your data\nquery = dataset.first().id # query by sample ID\nview = dataset.sort_by_similarity(\n query,\n brain_key=\"milvus_index\",\n k=10, # limit to 10 most similar samples\n)\n\n# Step 5 (optional): Cleanup\n\n# Delete the Milvus collection\nmilvus_index.cleanup()\n\n# Delete run record from FiftyOne\ndataset.delete_brain_run(\"milvus_index\")\n","# Step 5: Delete the index\nmilvus_index.delete()\n","import fiftyone.brain as fob\n\nfob.compute_similarity(..., backend=\"milvus\", ...)\n","export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus\n","{\n \"default_similarity_backend\": \"milvus\"\n}\n","export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX\n\n# also available if necessary\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX\nexport FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"uri\": \"XXXXXX\",\n \"user\": \"XXXXXX\",\n \"password\": \"XXXXXX\",\n\n # also available if necessary\n \"secure\": true,\n \"token\": \"XXXXXX\",\n \"db_name\": \"XXXXXX\",\n \"client_key_path\": \"XXXXXX\",\n \"client_pem_path\": \"XXXXXX\",\n \"ca_pem_path\": \"XXXXXX\",\n \"server_pem_path\": \"XXXXXX\",\n \"server_name\": \"XXXXXX\"\n }\n }\n}\n","import fiftyone.brain as fob\n\nmilvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","milvus_index = dataset.load_brain_results(\n \"milvus_index\",\n uri=\"XXXXXX\",\n user=\"XXXXXX\",\n password=\"XXXXXX\",\n\n # also available if necessary\n secure=True,\n token=\"XXXXXX\",\n db_name=\"XXXXXX\",\n client_key_path=\"XXXXXX\",\n client_pem_path=\"XXXXXX\",\n ca_pem_path=\"XXXXXX\",\n server_pem_path=\"XXXXXX\",\n server_name=\"XXXXXX\",\n)\n","{\n \"similarity_backends\": {\n \"milvus\": {\n \"collection_name\": \"your_collection\",\n \"metric\": \"dotproduct\",\n \"consistency_level\": \"Strong\"\n }\n }\n}\n","milvus_index = fob.compute_similarity(\n ...\n backend=\"milvus\",\n brain_key=\"milvus_index\",\n collection_name=\"your_collection\",\n metric=\"dotproduct\",\n consistency_level=\"Strong\",\n)\n","import fiftyone.brain as fob\n\n# List all brain runs\ndataset.list_brain_runs()\n\n# Only list similarity runs\ndataset.list_brain_runs(type=fob.Similarity)\n\n# Only list specific similarity runs\ndataset.list_brain_runs(\n type=fob.Similarity,\n patches_field=\"ground_truth\",\n supports_prompts=True,\n)\n","info = dataset.get_brain_info(brain_key)\nprint(info)\n","dataset.rename_brain_run(brain_key, new_brain_key)\n","dataset.delete_brain_run(brain_key)\n","# Delete the Milvus collection\nmilvus_index = dataset.load_brain_results(brain_key)\nmilvus_index.cleanup()\n"],"headingContent":"Conduct Vision Searches with Milvus and FiftyOne","anchorList":[{"label":"使用 Milvus 與 FiftyOne 進行視覺搜尋","href":"Conduct-Vision-Searches-with-Milvus-and-FiftyOne","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"安裝需求","href":"Installing-Requirements","type":2,"isActive":false},{"label":"基本配方","href":"Basic-recipe","type":2,"isActive":false},{"label":"程序","href":"Procedures","type":2,"isActive":false},{"label":"使用 Milvus 後端","href":"Use-the-Milvus-backend","type":2,"isActive":false},{"label":"驗證","href":"Authentication","type":2,"isActive":false},{"label":"管理大腦運行","href":"Manage-brain-runs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.md new file mode 100644 index 000000000..f86b88025 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voxel51.md @@ -0,0 +1,337 @@ +--- +id: integrate_with_voxel51.md +summary: 本頁討論與 voxel51 的整合 +title: 使用 Milvus 與 FiftyOne 進行視覺搜尋 +--- +

    使用 Milvus 與 FiftyOne 進行視覺搜尋

    FiftyOne是一個開放源碼工具,用來建立高品質的資料集與電腦視覺模型。本指南可協助您將 Milvus 的相似性搜尋功能整合至 FiftyOne,讓您能在自己的資料集上進行視覺搜尋。

    +

    FiftyOne 提供 API 來建立 Milvus 資料集、上傳向量以及執行相似性查詢,您可以使用 Python程式語言或在 App 中透過點選方式來進行。本頁面的示範將著重於程式整合。

    +

    先決條件

    在開始之前,請確認您有以下條件:

    + +

    安裝需求

    在這個範例中,我們要使用pymilvusfiftyone 。您可以執行下列指令來安裝它們:

    +
    python3 -m pip install pymilvus fiftyone torch torchvision
    +
    +

    基本配方

    使用 Milvus 在您的 FiftyOne 資料集上建立相似性索引,並以此查詢資料的基本工作流程如下:

    +
      +
    1. 將資料集載入FiftyOne
    2. +
    3. 為您資料集中的樣本或斑塊計算向量內嵌,或選擇一個模型來使用產生內嵌。
    4. +
    5. 使用 compute_similarity()方法為資料集中的樣本或物件修補區產生一個 Milvus 相似度指數,方法是設定參數backend="milvus" 並指定您所選擇的brain_key
    6. +
    7. 使用此 Milvus 相似性索引來查詢您的資料,使用 sort_by_similarity().
    8. +
    9. 如果需要,請刪除索引。
    10. +
    +

    程序

    下面的示例演示了上述工作流程。

    +

    1.將資料集載入 FiftyOne 並計算樣本的內嵌值

    以下程式碼使用 FiftyOne 提供的樣本圖片集來示範整合。您可以參考這篇文章來準備您自己的圖像集。

    +
    import fiftyone as fo
    +import fiftyone.brain as fob
    +import fiftyone.zoo as foz
    +
    +# Step 1: Load your data into FiftyOne
    +dataset = foz.load_zoo_dataset("quickstart")
    +
    +# Steps 2 and 3: Compute embeddings and create a similarity index
    +milvus_index = fob.compute_similarity(
    +    dataset,
    +    brain_key="milvus_index",
    +    backend="milvus",
    +)
    +
    +

    2.進行視覺相似性搜尋

    現在您可以使用 Milvus 相似性索引來對您的資料集進行視覺相似性搜尋。

    +
    # Step 4: Query your data
    +query = dataset.first().id  # query by sample ID
    +view = dataset.sort_by_similarity(
    +    query,
    +    brain_key="milvus_index",
    +    k=10,  # limit to 10 most similar samples
    +)
    +
    +# Step 5 (optional): Cleanup
    +
    +# Delete the Milvus collection
    +milvus_index.cleanup()
    +
    +# Delete run record from FiftyOne
    +dataset.delete_brain_run("milvus_index")
    +
    +

    3.刪除索引

    如果您不再需要 Milvus 相似性索引,您可以使用以下代碼刪除它:

    +
    # Step 5: Delete the index
    +milvus_index.delete()
    +
    +

    使用 Milvus 後端

    預設情況下,呼叫 compute_similarity()sort_by_similarity() 將使用 sklearn 後端。

    +

    要使用 Milvus 後端,只需將可選的後端參數設定為 compute_similarity()"milvus"

    +
    import fiftyone.brain as fob
    +
    +fob.compute_similarity(..., backend="milvus", ...)
    +
    +

    另外,您也可以透過設定以下的環境變數,永久設定 FiftyOne 使用 Milvus 後端:

    +
    export FIFTYONE_BRAIN_DEFAULT_SIMILARITY_BACKEND=milvus
    +
    +

    或設定你的brain configdefault_similarity_backend 參數,位於~/.fiftyone/brain_config.json

    +
    {
    +    "default_similarity_backend": "milvus"
    +}
    +
    +

    驗證

    如果您使用自訂的 Milvus 伺服器,您可以用多種方式提供您的認證。

    +

    建議的方式是將您的 Milvus 認證資料儲存在下列的環境變數中,當連線到 Milvus 時,FiftyOne 會自動存取這些變數。

    +
    export FIFTYONE_BRAIN_SIMILARITY_MILVUS_URI=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_USER=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_PASSWORD=XXXXXX
    +
    +# also available if necessary
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SECURE=true
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_TOKEN=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_DB_NAME=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_KEY_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CLIENT_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_CA_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_PEM_PATH=XXXXXX
    +export FIFTYONE_BRAIN_SIMILARITY_MILVUS_SERVER_NAME=XXXXXX
    +
    +

    FiftyOne Brain config

    您也可以將您的認證存放在您的腦組設定中,位於~/.fiftyone/brain_config.json

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "uri": "XXXXXX",
    +            "user": "XXXXXX",
    +            "password": "XXXXXX",
    +
    +            # also available if necessary
    +            "secure": true,
    +            "token": "XXXXXX",
    +            "db_name": "XXXXXX",
    +            "client_key_path": "XXXXXX",
    +            "client_pem_path": "XXXXXX",
    +            "ca_pem_path": "XXXXXX",
    +            "server_pem_path": "XXXXXX",
    +            "server_name": "XXXXXX"
    +        }
    +    }
    +}
    +
    +

    請注意,這個檔案在您建立之前是不存在的。

    +

    關鍵字參數

    您可以手動提供您的 Milvus 認證作為關鍵字參數,每次您呼叫方法如 compute_similarity()等需要連線到 Milvus 的方法時,您可以手動提供您的 Milvus 認證作為關鍵字參數:

    +
    import fiftyone.brain as fob
    +
    +milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    請注意,當使用此策略時,您必須在稍後透過以下方式載入索引時,手動提供憑證 load_brain_results():

    +
    milvus_index = dataset.load_brain_results(
    +    "milvus_index",
    +    uri="XXXXXX",
    +    user="XXXXXX",
    +    password="XXXXXX",
    +
    +    # also available if necessary
    +    secure=True,
    +    token="XXXXXX",
    +    db_name="XXXXXX",
    +    client_key_path="XXXXXX",
    +    client_pem_path="XXXXXX",
    +    ca_pem_path="XXXXXX",
    +    server_pem_path="XXXXXX",
    +    server_name="XXXXXX",
    +)
    +
    +

    Milvus 配置參數

    Milvus 後端支援多種查詢參數,可用於自訂您的相似性查詢。這些參數包括

    +
      +
    • collection_name(無):要使用或建立的 Milvus 集合名稱。如果沒有提供,將會建立一個新的集合

    • +
    • metric("dotproduct"): 建立新索引時要使用的嵌入距離公制。支援的值是 ("dotproduct","euclidean")

    • +
    • consistency_level("Session"): 要使用的一致性等級。支援的值為 ("Strong","Session","Bounded","Eventually")

    • +
    +

    有關這些參數的詳細資訊,請參閱Milvus 認證說明文件Milvus 一致性等級說明文件

    +

    您可以透過上一節所述的任何策略指定這些參數。下面是一個包含所有可用參數的brain config的範例:

    +
    {
    +    "similarity_backends": {
    +        "milvus": {
    +            "collection_name": "your_collection",
    +            "metric": "dotproduct",
    +            "consistency_level": "Strong"
    +        }
    +    }
    +}
    +
    +

    然而,通常這些參數會直接傳給 compute_similarity()來設定特定的新索引:

    +
    milvus_index = fob.compute_similarity(
    +    ...
    +    backend="milvus",
    +    brain_key="milvus_index",
    +    collection_name="your_collection",
    +    metric="dotproduct",
    +    consistency_level="Strong",
    +)
    +
    +

    管理大腦運行

    FiftyOne 提供了多種方法,您可以用來管理大腦運行。

    +

    例如,您可以呼叫 list_brain_runs()來查看資料集上可用的大腦索引鍵:

    +
    import fiftyone.brain as fob
    +
    +# List all brain runs
    +dataset.list_brain_runs()
    +
    +# Only list similarity runs
    +dataset.list_brain_runs(type=fob.Similarity)
    +
    +# Only list specific similarity runs
    +dataset.list_brain_runs(
    +    type=fob.Similarity,
    +    patches_field="ground_truth",
    +    supports_prompts=True,
    +)
    +
    +

    或者,您可以使用 get_brain_info()來擷取有關大腦運行配置的資訊:

    +
    info = dataset.get_brain_info(brain_key)
    +print(info)
    +
    +

    使用 load_brain_results()來載入 SimilarityIndex實例。

    +

    您可以使用 rename_brain_run()來重新命名與現有相似性結果執行相關聯的腦部鍵:

    +
    dataset.rename_brain_run(brain_key, new_brain_key)
    +
    +

    最後,您可以使用 delete_brain_run()來刪除大腦運行:

    +
    dataset.delete_brain_run(brain_key)
    +
    +
    +

    呼叫 delete_brain_run()只會從您的 FiftyOne 資料集中刪除腦部運行的記錄;它不會刪除任何相關的 Milvus 資料集,您可以如下操作:

    +
    # Delete the Milvus collection
    +milvus_index = dataset.load_brain_results(brain_key)
    +milvus_index.cleanup()
    +
    +
    +

    有關使用 Milvus 後端在 FiftyOne 資料集上的常見向量搜尋工作流程,請參閱這裡的範例

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.json new file mode 100644 index 000000000..c5e053261 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade voyageai pymilvus\n","import voyageai\nfrom pymilvus import MilvusClient\n\nMODEL_NAME = \"voyage-law-2\" # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models\nDIMENSION = 1024 # Dimension of vector embedding\n\n# Connect to VoyageAI with API Key.\nvoyage_client = voyageai.Client(api_key=\"\")\n\ndocs = [\n \"Artificial intelligence was founded as an academic discipline in 1956.\",\n \"Alan Turing was the first person to conduct substantial research in AI.\",\n \"Born in Maida Vale, London, Turing was raised in southern England.\",\n]\n\nvectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings\n\n# Prepare data to be stored in Milvus vector database.\n# We can store the id, vector representation, raw text and labels such as \"subject\" in this case in Milvus.\ndata = [\n {\"id\": i, \"vector\": vectors[i], \"text\": docs[i], \"subject\": \"history\"}\n for i in range(len(docs))\n]\n\n\n# Connect to Milvus, all data is stored in a local file named \"milvus_voyage_demo.db\"\n# in current directory. You can also connect to a remote Milvus server following this\n# instruction: https://milvus.io/docs/install_standalone-docker.md.\nmilvus_client = MilvusClient(uri=\"milvus_voyage_demo.db\")\nCOLLECTION_NAME = \"demo_collection\" # Milvus collection name\n# Create a collection to store the vectors and text.\nif milvus_client.has_collection(collection_name=COLLECTION_NAME):\n milvus_client.drop_collection(collection_name=COLLECTION_NAME)\nmilvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)\n\n# Insert all data into Milvus vector database.\nres = milvus_client.insert(collection_name=\"demo_collection\", data=data)\n\nprint(res[\"insert_count\"])\n","queries = [\"When was artificial intelligence founded?\"]\n\nquery_vectors = voyage_client.embed(\n texts=queries, model=MODEL_NAME, truncation=False\n).embeddings\n\nres = milvus_client.search(\n collection_name=COLLECTION_NAME, # target collection\n data=query_vectors, # query vectors\n limit=2, # number of returned entities\n output_fields=[\"text\", \"subject\"], # specifies fields to be returned\n)\n\nfor q in queries:\n print(\"Query:\", q)\n for result in res:\n print(result)\n print(\"\\n\")\n"],"headingContent":"Semantic Search with Milvus and VoyageAI","anchorList":[{"label":"使用 Milvus 和 VoyageAI 進行語意搜尋","href":"Semantic-Search-with-Milvus-and-VoyageAI","type":1,"isActive":false},{"label":"開始使用","href":"Getting-started","type":2,"isActive":false},{"label":"使用 VoyageAI 和 Milvus 搜尋書名","href":"Searching-book-titles-with-VoyageAI--Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.md new file mode 100644 index 000000000..2d251ee69 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_voyageai.md @@ -0,0 +1,134 @@ +--- +id: integrate_with_voyageai.md +title: 使用 Milvus 和 VoyageAI 進行語意搜尋 +summary: 本頁討論向量資料庫與 VoyageAI 的嵌入式 API 的整合。 +--- +

    使用 Milvus 和 VoyageAI 進行語意搜尋

    Open In Colab +GitHub Repository

    +

    本指南展示了如何將VoyageAI 的 Embedding API與 Milvus 向量資料庫搭配使用,在文字上進行語意搜尋。

    +

    開始使用

    在開始之前,請確認您已準備好 Voyage API 金鑰,或者您可以從VoyageAI 網站取得一個。

    +

    本範例使用的資料是書名。您可以在這裡下載資料集,並將其放在執行下列程式碼的同一個目錄中。

    +

    首先,安裝 Milvus 和 Voyage AI 的套件:

    +
    $ pip install --upgrade voyageai pymilvus
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動運行時間。(點選螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    有了這些,我們就可以產生 embeddings 並使用向量資料庫來進行語意搜尋了。

    +

    使用 VoyageAI 和 Milvus 搜尋書名

    在以下範例中,我們從下載的 CSV 檔案載入書名資料,使用 Voyage AI 嵌入模型產生向量表示,並將其儲存於 Milvus 向量資料庫,以進行語意搜尋。

    +
    import voyageai
    +from pymilvus import MilvusClient
    +
    +MODEL_NAME = "voyage-law-2"  # Which model to use, please check https://docs.voyageai.com/docs/embeddings for available models
    +DIMENSION = 1024  # Dimension of vector embedding
    +
    +# Connect to VoyageAI with API Key.
    +voyage_client = voyageai.Client(api_key="<YOUR_VOYAGEAI_API_KEY>")
    +
    +docs = [
    +    "Artificial intelligence was founded as an academic discipline in 1956.",
    +    "Alan Turing was the first person to conduct substantial research in AI.",
    +    "Born in Maida Vale, London, Turing was raised in southern England.",
    +]
    +
    +vectors = voyage_client.embed(texts=docs, model=MODEL_NAME, truncation=False).embeddings
    +
    +# Prepare data to be stored in Milvus vector database.
    +# We can store the id, vector representation, raw text and labels such as "subject" in this case in Milvus.
    +data = [
    +    {"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
    +    for i in range(len(docs))
    +]
    +
    +
    +# Connect to Milvus, all data is stored in a local file named "milvus_voyage_demo.db"
    +# in current directory. You can also connect to a remote Milvus server following this
    +# instruction: https://milvus.io/docs/install_standalone-docker.md.
    +milvus_client = MilvusClient(uri="milvus_voyage_demo.db")
    +COLLECTION_NAME = "demo_collection"  # Milvus collection name
    +# Create a collection to store the vectors and text.
    +if milvus_client.has_collection(collection_name=COLLECTION_NAME):
    +    milvus_client.drop_collection(collection_name=COLLECTION_NAME)
    +milvus_client.create_collection(collection_name=COLLECTION_NAME, dimension=DIMENSION)
    +
    +# Insert all data into Milvus vector database.
    +res = milvus_client.insert(collection_name="demo_collection", data=data)
    +
    +print(res["insert_count"])
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    有了 Milvus 向量資料庫中的所有資料,我們現在可以透過產生查詢的向量嵌入來執行語意搜尋,並進行向量搜尋。

    +
    queries = ["When was artificial intelligence founded?"]
    +
    +query_vectors = voyage_client.embed(
    +    texts=queries, model=MODEL_NAME, truncation=False
    +).embeddings
    +
    +res = milvus_client.search(
    +    collection_name=COLLECTION_NAME,  # target collection
    +    data=query_vectors,  # query vectors
    +    limit=2,  # number of returned entities
    +    output_fields=["text", "subject"],  # specifies fields to be returned
    +)
    +
    +for q in queries:
    +    print("Query:", q)
    +    for result in res:
    +        print(result)
    +    print("\n")
    +
    +
    Query: When was artificial intelligence founded?
    +[{'id': 0, 'distance': 0.7196218371391296, 'entity': {'text': 'Artificial intelligence was founded as an academic discipline in 1956.', 'subject': 'history'}}, {'id': 1, 'distance': 0.6297335028648376, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.json b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.json new file mode 100644 index 000000000..1b9aef7e1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus, whyhow_rbr\n","from pymilvus import MilvusClient\n\n# Milvus Lite local path\npath=\"./milvus_demo.db\" # random name for local milvus lite db path\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(path)\n","from pymilvus import MilvusClient\n\n# Milvus Cloud credentials\nYOUR_MILVUS_CLOUD_END_POINT = \"YOUR_MILVUS_CLOUD_END_POINT\"\nYOUR_MILVUS_CLOUD_TOKEN = \"YOUR_MILVUS_CLOUD_TOKEN\"\n\n# Initialize the ClientMilvus\nmilvus_client = ClientMilvus(\n milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, \n milvus_token=YOUR_MILVUS_CLOUD_TOKEN,\n)\n","# Define collection name\nCOLLECTION_NAME=\"YOUR_COLLECTION_NAME\" # take your own collection name\n\n# Define vector dimension size\nDIMENSION=1536 # decide by the model you use\n","schema = milvus_client.create_schema(auto_id=True) # Enable id matching\n\nschema = milvus_client.add_field(schema=schema, field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema = milvus_client.add_field(schema=schema, field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n","# Start to indexing data field\nindex_params = milvus_client.prepare_index_params()\nindex_params = milvus_client.add_index(\n index_params=index_params, # pass in index_params object\n field_name=\"embedding\",\n index_type=\"AUTOINDEX\", # use autoindex instead of other complex indexing method\n metric_type=\"COSINE\", # L2, COSINE, or IP\n)\n","# Create Collection\nmilvus_client.create_collection(\n collection_name=COLLECTION_NAME,\n schema=schema,\n index_params=index_params\n)\n","# get pdfs\npdfs = [\"harry-potter.pdf\", \"game-of-thrones.pdf\"] # replace to your pdfs path\n\n# Uploading the PDF document\nmilvus_client.upload_documents(\n collection_name=COLLECTION_NAME,\n documents=pdfs\n)\n","# Search data and implement RAG!\nres = milvus_client.search(\n question='What food does Harry Potter like to eat?',\n collection_name=COLLECTION_NAME,\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# RULES(search on book harry-potter on page 8):\nPARTITION_NAME='harry-potter' # search on books\npage_number='page_number == 8'\n\n# first create a partitions to store the book and later search on this specific partition:\nmilvus_client.crate_partition(\n collection_name=COLLECTION_NAME,\n partition_name=PARTITION_NAME # separate base on your pdfs type\n)\n\n# search with rules\nres = milvus_client.search(\n question='Tell me about the greedy method',\n collection_name=COLLECTION_NAME,\n partition_names=PARTITION_NAME,\n filter=page_number, # append any rules follow the Boolean Expression Rule\n anns_field='embedding',\n output_fields='text'\n)\nprint(res['answer'])\nprint(res['matches'])\n","# Clean up\nmilvus_client.drop_collection(\n collection_name=COLLECTION_NAME\n)\n"],"headingContent":"Integrate Milvus with WhyHow","anchorList":[{"label":"整合 Milvus 與 WhyHow","href":"Integrate-Milvus-with-WhyHow","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"安裝","href":"Installation","type":2,"isActive":false},{"label":"建立收藏集","href":"Create-Collection","type":2,"isActive":false},{"label":"上傳文件","href":"Upload-documents","type":2,"isActive":false},{"label":"問題回答","href":"Question-answering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.md b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.md new file mode 100644 index 000000000..13cd71699 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrate_with_whyhow.md @@ -0,0 +1,216 @@ +--- +id: integrate_with_whyhow.md +summary: 本指南示範如何使用 whyhow.ai 和 Milvus Lite 來進行 Rule-based Retrieval。 +title: 整合 Milvus 與 WhyHow +--- +

    整合 Milvus 與 WhyHow

    本指南展示了如何使用 whyhow.ai 和 Milvus Lite 進行基於規則的檢索。

    +

    概述

    WhyHow是一個平台,提供開發人員所需的建構塊,讓他們可以組織、內容化並可靠地擷取非結構化的資料,以執行複雜的RAG。Rule-based Retrieval 套件是由 WhyHow 所開發的 Python 套件,可讓人們建立與管理具有進階過濾功能的 Retrieval Augmented Generation (RAG) 應用程式。

    +

    安裝

    在開始之前,請先安裝所有必要的 python 套件,以便日後使用。

    +
    pip install --upgrade pymilvus, whyhow_rbr
    +
    +

    接下來,我們需要初始化 Milvus 客戶端,以使用 Milvus Lite 來實現基於規則的檢索。

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Lite local path
    +path="./milvus_demo.db" # random name for local milvus lite db path
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(path)
    +
    +

    您也可以透過 Milvus Cloud 來初始化 Milvus 客戶端。

    +
    from pymilvus import MilvusClient
    +
    +# Milvus Cloud credentials
    +YOUR_MILVUS_CLOUD_END_POINT = "YOUR_MILVUS_CLOUD_END_POINT"
    +YOUR_MILVUS_CLOUD_TOKEN = "YOUR_MILVUS_CLOUD_TOKEN"
    +
    +# Initialize the ClientMilvus
    +milvus_client = ClientMilvus(
    +        milvus_uri=YOUR_MILVUS_CLOUD_END_POINT, 
    +        milvus_token=YOUR_MILVUS_CLOUD_TOKEN,
    +)
    +
    +

    建立收藏集

    定義必要的變數

    # Define collection name
    +COLLECTION_NAME="YOUR_COLLECTION_NAME" # take your own collection name
    +
    +# Define vector dimension size
    +DIMENSION=1536 # decide by the model you use
    +
    +

    添加模式

    在插入任何資料到 Milvus Lite 資料庫之前,我們需要先定義資料欄位,在這裡稱為 schema。透過建立物件CollectionSchema 和新增資料欄位add_field() ,我們可以控制資料類型和它們的特性。在插入任何資料到 Milvus 之前,這個步驟是必須的。

    +
    schema = milvus_client.create_schema(auto_id=True) # Enable id matching
    +
    +schema = milvus_client.add_field(schema=schema, field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema = milvus_client.add_field(schema=schema, field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +

    建立索引

    對於每個模式,最好有一個索引,這樣查詢會更有效率。要建立索引,我們首先需要一個index_params ,之後再在這個IndexParams 物件上加入更多的索引資料。

    +
    # Start to indexing data field
    +index_params = milvus_client.prepare_index_params()
    +index_params = milvus_client.add_index(
    +    index_params=index_params,  # pass in index_params object
    +    field_name="embedding",
    +    index_type="AUTOINDEX",  # use autoindex instead of other complex indexing method
    +    metric_type="COSINE",  # L2, COSINE, or IP
    +)
    +
    +

    這個方法是官方 Milvus 實作(官方說明文件) 的薄層包裝。

    +

    建立集合

    定義所有資料欄位並編制索引之後,我們現在需要建立資料庫集合,以便快速精確地存取資料。需要提及的是,我們將enable_dynamic_field 初始化為 true,因此您可以自由上傳任何資料。代價是資料查詢的效率可能會較低。

    +
    # Create Collection
    +milvus_client.create_collection(
    +    collection_name=COLLECTION_NAME,
    +    schema=schema,
    +    index_params=index_params
    +)
    +
    +

    上傳文件

    建立資料集之後,我們就可以用文件來填充資料集了。在whyhow_rbr 中,這是使用MilvusClientupload_documents 方法來完成的。它會在引擎蓋下執行下列步驟:

    +
      +
    • 預先處理:讀取提供的 PDF 檔案並將其分割成小塊
    • +
    • 嵌入:使用 OpenAI 模型嵌入所有區塊
    • +
    • 插入:將嵌入與元資料上傳至 Milvus Lite
    • +
    +
    # get pdfs
    +pdfs = ["harry-potter.pdf", "game-of-thrones.pdf"] # replace to your pdfs path
    +
    +# Uploading the PDF document
    +milvus_client.upload_documents(
    +    collection_name=COLLECTION_NAME,
    +    documents=pdfs
    +)
    +
    +

    問題回答

    現在我們終於可以進行檢索擴增生成了。

    +
    # Search data and implement RAG!
    +res = milvus_client.search(
    +    question='What food does Harry Potter like to eat?',
    +    collection_name=COLLECTION_NAME,
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    規則

    在之前的範例中,我們考慮了索引中的每一份文件。然而,有時候只檢索符合某些預先定義條件的文件可能是有益的 (例如:filename=harry-potter.pdf)。在whyhow_rbr 中透過 Milvus Lite,這可以透過調整搜尋參數來達成。

    +

    規則可控制下列元資料屬性

    +
      +
    • filename 檔案名稱
    • +
    • page_numbers 與頁碼對應的整數清單(0 索引)
    • +
    • id 區塊的唯一識別碼(這是最「極端」的過濾器)
    • +
    • 其他基於布林表達式的規則
    • +
    +
    # RULES(search on book harry-potter on page 8):
    +PARTITION_NAME='harry-potter' # search on books
    +page_number='page_number == 8'
    +
    +# first create a partitions to store the book and later search on this specific partition:
    +milvus_client.crate_partition(
    +    collection_name=COLLECTION_NAME,
    +    partition_name=PARTITION_NAME # separate base on your pdfs type
    +)
    +
    +# search with rules
    +res = milvus_client.search(
    +    question='Tell me about the greedy method',
    +    collection_name=COLLECTION_NAME,
    +    partition_names=PARTITION_NAME,
    +    filter=page_number, # append any rules follow the Boolean Expression Rule
    +    anns_field='embedding',
    +    output_fields='text'
    +)
    +print(res['answer'])
    +print(res['matches'])
    +
    +

    在這個範例中,我們首先建立一個分區來儲存與哈利波特相關的 pdf,透過在這個分區中搜尋,我們可以得到最直接的資訊。此外,我們應用頁碼作為過濾器,以指定我們想要搜尋的精確頁面。請記住,filer 參數必須遵循布林規則

    +

    清理

    最後,在執行所有指令之後,您可以呼叫drop_collection() 來清理資料庫。

    +
    # Clean up
    +milvus_client.drop_collection(
    +    collection_name=COLLECTION_NAME
    +)
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.json b/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.json new file mode 100644 index 000000000..3e1c396a4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Integrations Overview","anchorList":[{"label":"整合概述","href":"Integrations-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.md b/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.md new file mode 100644 index 000000000..ef87b4e09 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/integrations_overview.md @@ -0,0 +1,78 @@ +--- +id: integrations_overview.md +summary: 本頁提供一系列教學,讓您與 Milvus 及第三方工具互動。 +title: 整合概述 +--- +

    整合概述

    本頁提供一系列教學,讓您與 Milvus 和第三方工具互動。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    教學使用案例合作夥伴或堆疊
    使用 Milvus 和 LlamaIndex 的 RAGRAGMilvus、LLamaIndex
    RAG 與 Milvus 和 LangChainRAGMilvus、LangChain
    在LangChain中的Milvus混合搜索檢索器混合搜尋Milvus、LangChain
    使用 Milvus 與 OpenAI 的語意搜尋語意搜尋Milvus、OpenAI
    使用 Milvus 和 Cohere 進行問題回答語意搜尋邏輯搜尋
    使用 Milvus 和 HuggingFace 進行問題回答問題回答Milvus、HuggingFace
    使用 Milvus 和 Pytorch 進行圖像搜尋語意搜尋詞彙搜尋
    使用 Milvus 和 SentenceTransfromers 進行電影搜尋語意搜尋Milvus、SentenceTransformers
    在LangChain中使用Milvus作為向量庫語意搜尋Milvus、LangChain
    使用 Milvus 和 Haystack 的 RAGRAGMilvus、Haystack
    使用 Milvus 和 FiftyOne 進行視覺搜尋語意搜尋Milvus、FiftyOne
    使用 Milvus 和 VoyageAI 進行語意搜尋語意搜尋Milvus、VoyageAI
    使用 Milvus 和 BentoML 的 RAGRAGMilvus、BentoML
    使用 Milvus 和 DSPy 的 RAGRAGMilvus、DSPy
    使用 Milvus 和 Jina 進行語意搜尋語意搜尋Milvus、Jina
    Milvus在Snowpark容器服務上的應用資料連接Milvus、Snowpark
    使用 Milvus 和 WhyHow 進行基於規則的檢索問題回答Milvus、WhyHow
    Milvus 在 Langfuse 中的應用可觀察性Milvus、Langfuse
    使用 Ragas 和 Milvus 進行 RAG 評估評估Milvus、Ragas
    使用 Milvus 和 MemGPT 的聊天機代碼代理程式Milvus、MemGPT
    如何使用 Milvus 部署 FastGPTRAGMilvus、FastGPT
    使用 Vanna 和 Milvus 寫 SQLRAGMilvus、Vanna
    使用 Milvus 和 Camel 進行 RAGRAGMilvus、Camel
    Airbyte 與 Milvus:開放源碼資料移動基礎架構資料連接Milvus、Airbyte
    進階視訊搜尋:利用 Twelve Labs 和 Milvus 進行語義檢索語意搜尋Milvus、Twelve Labs
    使用 Milvus、vLLM 和 Llama 3.1 建立 RAGRAGMilvus、vLLM、LlamaIndex
    使用 Mistral AI、Milvus 和 Llama-agents 的多代理系統代理Milvus、Mistral AI、LlamaIndex
    使用 Milvus 連接 Kafka資料來源Milvus、Kafka
    Kotaemon RAG 與 MilvusRAGMilvus、Kotaemon
    擷取增強世代:使用 Apify 抓取網站並將資料儲存至 Milvus 以進行問題解答資料來源Milvus、Apify
    使用 DeepEval 進行評估評估與可觀察性Milvus、DeepEval
    使用 Arize Pheonix 評估評估與可觀性Milvus、Arize Pheonix
    使用 Milvus 部署 Dify協調Milvus、Dify
    使用 Milvus 與 Langflow 建立 RAG 系統協調Milvus、Langflow
    在 Arm 架構上建立 RAGRAGMilvus、Arm
    使用 Milvus 和 Fireworks AI 建立 RAGLLMsMilvus、Fireworks AI
    使用 Milvus 和 Lepton AI 建立 RAGLLMsMilvus、Lepton AI
    使用 Milvus 和 SiliconFlow 建立 RAGLLMsMilvus、SiliconFlow
    使用 Milvus 和非結構化資料來源Milvus、非結構化
    使用 Milvus + PII 掩碼器建立 RAG資料來源Milvus,PII 掩碼器
    在 PrivateGPT 中使用 Milvus協調向量搜尋
    開始使用 Mem0 和 Milvus代理Mem0、Milvus
    使用 Milvus 的知識表知識工程知識表、Milvus
    在 DocsGPT 中使用 Milvus協調DocsGPT, Milvus
    在 SambaNova 中使用 Milvus協調Milvus、SambaNova
    使用 Milvus 和 Cognee 建立 RAG知識工程Milvus、Cognee
    使用 Milvus 和 Gemini 建立 RAGLLMsMilvus、Gemini
    使用 Milvus 和 Ollama 建立 RAGLLMsMilvus、Ollama
    開始使用 Dynamiq 和 Milvus協調Milvus、Dynamiq
    使用 Milvus 和 DeepSeek 建立 RAGLLMsMilvus、DeepSeek
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.json b/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.json new file mode 100644 index 000000000..daa94a686 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ tar -xzf kafka_2.13-3.6.1.tgz\n$ cd kafka_2.13-3.6.1\n","$ bin/zookeeper-server-start.sh config/zookeeper.properties\n","$ bin/kafka-server-start.sh config/server.properties\n","$ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092\n","key.converter.schemas.enable=false\nvalue.converter.schemas.enable=false\nplugin.path=libs/zilliz-kafka-connect-milvus-xxx\n","name=zilliz-kafka-connect-milvus\nconnector.class=com.milvus.io.kafka.MilvusSinkConnector\npublic.endpoint=https://:port\ntoken=*****************************************\ncollection.name=topic_0\ntopics=topic_0\n","$ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties\n","bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092 \n>{\"id\": 0, \"title\": \"The Reported Mortality Rate of Coronavirus Is Not Important\", \"title_vector\": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], \"link\": \"https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912\"}\n"],"headingContent":"Connect Kafka with Milvus","anchorList":[{"label":"用 Milvus 連接 Kafka","href":"Connect-Kafka-with-Milvus","type":1,"isActive":false},{"label":"步驟 1:下載 kafka-connect-milvus 外掛程式","href":"Step-1-Download-the-kafka-connect-milvus-plugin","type":2,"isActive":false},{"label":"步驟 2:下載 Kafka","href":"Step-2-Download-Kafka","type":2,"isActive":false},{"label":"第 3 步:啟動 Kafka 環境","href":"STEP-3-Start-the-Kafka-Environment","type":2,"isActive":false},{"label":"步驟 4:配置 Kafka 和 Zilliz Cloud","href":"Step-4-Configure-Kafka-and-Zilliz-Cloud","type":2,"isActive":false},{"label":"步驟 5:載入 kafka-connect-milvus 外掛程式到 Kafka Instance","href":"Step-5-Load-the-kafka-connect-milvus-plugin-to-Kafka-Instance","type":2,"isActive":false},{"label":"步驟 6:啟動連接器","href":"Step-6-Launch-the-connector","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.md b/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.md new file mode 100644 index 000000000..765b6a402 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/kafka-connect-milvus.md @@ -0,0 +1,179 @@ +--- +id: kafka-connect-milvus.md +summary: 在這份快速入門指南中,我們將介紹如何設定開放原始碼 kafka 和 Zilliz Cloud 來擷取向量資料。 +title: 整合 Milvus 與 WhyHow +--- +

    用 Milvus 連接 Kafka

    在這份快速入門指南中,我們將介紹如何設定開放原始碼 kafka 和 Zilliz Cloud 來擷取向量資料。

    +

    步驟 1:下載 kafka-connect-milvus 外掛程式

    完成以下步驟下載 kafka-connect-milvus 外掛程式。

    +
      +
    1. 這裡下載最新的外掛壓縮檔zilliz-kafka-connect-milvus-xxx.zip
    2. +
    +

    步驟 2:下載 Kafka

      +
    1. 這裡下載最新的 kafka。
    2. +
    3. 解壓縮下載的檔案,然後前往 kafka 目錄。
    4. +
    +
    $ tar -xzf kafka_2.13-3.6.1.tgz
    +$ cd kafka_2.13-3.6.1
    +
    +

    第 3 步:啟動 Kafka 環境

    +

    注意:您的本機環境必須安裝 Java 8 以上。

    +
    +

    執行下列指令,以便以正確的順序啟動所有服務:

    +
      +
    1. 啟動 ZooKeeper 服務

      +
      $ bin/zookeeper-server-start.sh config/zookeeper.properties
      +
    2. +
    3. 啟動 Kafka 代理服務

      +

      開啟另一個終端會話並執行:

      +
      $ bin/kafka-server-start.sh config/server.properties
      +
    4. +
    +

    當所有的服務都成功啟動後,您就可以擁有一個基本的 Kafka 環境,隨時可以使用。

    +
      +
    • 詳情請查看官方快速入門指南:https://kafka.apache.org/quickstart。
    • +
    +

    步驟 4:配置 Kafka 和 Zilliz Cloud

    確保您已經設定好 Kafka 和 Zilliz Cloud 並正確配置。

    +
      +
    1. 如果您尚未在 Kafka 中建立主題,請在 Kafka 中建立主題 (例如topic_0)。

      +
      $ bin/kafka-topics.sh --create --topic topic_0 --bootstrap-server localhost:9092
      +
    2. +
    3. 如果您尚未在 Zilliz Cloud 中建立一個集合,請建立一個具有向量欄位的集合 (在本範例中,向量有dimension=8)。您可以在 Zilliz Cloud 上使用以下示例模式:

      +

      +

      +

      注意:請確保雙方的模式相互匹配。在模式中,正好有一個向量欄位。雙方每個欄位的名稱完全相同。

      +

    4. +
    +

    步驟 5:載入 kafka-connect-milvus 外掛程式到 Kafka Instance

      +
    1. 解壓縮您在步驟 1 下載的zilliz-kafka-connect-milvus-xxx.zip 檔案。

    2. +
    3. 複製zilliz-kafka-connect-milvus 目錄到您 Kafka 安裝的libs 目錄。

    4. +
    5. 修改您 Kafka 安裝的config 目錄中的connect-standalone.properties 檔案。

      +
      key.converter.schemas.enable=false
      +value.converter.schemas.enable=false
      +plugin.path=libs/zilliz-kafka-connect-milvus-xxx
      +
    6. +
    7. 在您 Kafka 安裝的config 目錄中建立並配置milvus-sink-connector.properties 檔案。

      +
      name=zilliz-kafka-connect-milvus
      +connector.class=com.milvus.io.kafka.MilvusSinkConnector
      +public.endpoint=https://<public.endpoint>:port
      +token=*****************************************
      +collection.name=topic_0
      +topics=topic_0
      +
    8. +
    +

    步驟 6:啟動連接器

      +
    1. 使用之前的配置文件啟動連接器

      +
      $ bin/connect-standalone.sh config/connect-standalone.properties config/milvus-sink-connector.properties
      +
    2. +
    3. 嘗試製作一個訊息到您剛在 Kafka 中建立的 Kafka 主題

      +
      bin/kafka-console-producer.sh --topic topic_0 --bootstrap-server localhost:9092                        
      +>{"id": 0, "title": "The Reported Mortality Rate of Coronavirus Is Not Important", "title_vector": [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648, 0.00082446384, -0.00071647146, 0.048612226], "link": "https://medium.com/swlh/the-reported-mortality-rate-of-coronavirus-is-not-important-369989c8d912"}
      +
    4. +
    5. 檢查該實體是否已插入到 Zilliz Cloud 的集合中。下面是插入成功後在 Zilliz Cloud 上的樣子:

      +

    6. +
    +

    支援

    如果您需要任何協助或對 Kafka Connect Milvus Connector 有任何疑問,請隨時聯絡我們的支援團隊:電子郵件: support@zilliz.com

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.json new file mode 100644 index 000000000..ab0f8561e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/whyhow-ai/knowledge-table.git\n","$ docker compose up -d --build\n","$ docker compose down\n"],"headingContent":"Knowledge Table with Milvus","anchorList":[{"label":"使用 Milvus 的知識表","href":"Knowledge-Table-with-Milvus","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"克隆專案","href":"Cloning-the-project","type":2,"isActive":false},{"label":"設定環境","href":"Set-up-the-environment","type":2,"isActive":false},{"label":"啟動應用程式","href":"Starting-the-app","type":2,"isActive":false},{"label":"停止應用程式","href":"Stopping-the-app","type":2,"isActive":false},{"label":"存取專案","href":"Accessing-the-project","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.md new file mode 100644 index 000000000..a1b1b7a95 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/knowledge_table_with_milvus.md @@ -0,0 +1,144 @@ +--- +id: knowledge_table_with_milvus.md +summary: >- + 在預設情況下,Knowledge Table 使用 Milvus + 資料庫來儲存和擷取萃取的資料。這使得用戶可以使用Milvus的強大功能輕鬆地搜索、過濾和分析數據。在本教程中,我們將介紹如何開始使用 Knowledge + Table 和 Milvus。 +title: 使用 Milvus 的知識表 +--- +

    使用 Milvus 的知識表

    WhyHow AI 所開發的Knowledge Table 是一套開放原始碼套件,設計用來協助從非結構化文檔中萃取與探索結構化資料。它為使用者提供類似試算表的介面,並可透過自然語言查詢介面建立表格和圖表等知識表象。該套件包括可自訂的擷取規則、格式化選項,以及透過來源進行的資料追溯,使其適用於各種不同的應用程式。它支援與 RAG 工作流程的無縫整合,同時滿足需要友善使用者介面的企業用戶和需要彈性後端以進行有效文件處理的開發人員的需求。

    +

    在預設情況下,Knowledge Table 使用 Milvus 資料庫來儲存和檢索擷取的資料。這使得用戶可以使用 Milvus 的強大功能輕鬆地搜索、過濾和分析數據。在本教程中,我們將介紹如何開始使用 Knowledge Table 和 Milvus。

    +

    先決條件

      +
    • Docker
    • +
    • Docker Compose
    • +
    +

    克隆專案

    $ git clone https://github.com/whyhow-ai/knowledge-table.git
    +
    +

    設定環境

    您可以在專案根目錄中找到.env.example 檔案。複製這個檔案到.env 並填入所需的環境變數。

    +

    對於 Milvus,您應該設定MILVUS_DB_URIMILVUS_DB_TOKEN 環境變數。以下是一些提示:

    +
    +
      +
    • MILVUS_DB_URI 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 上的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整MILVUS_DB_URIMILVUS_DB_TOKEN ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    除了 Milvus,您也應該設定其他環境,例如OPENAI_API_KEY 。您可以從各個網站取得這些設定。

    +

    啟動應用程式

    $ docker compose up -d --build
    +
    +

    停止應用程式

    $ docker compose down
    +
    +

    存取專案

    前台可從http://localhost:3000 存取,後台可從http://localhost:8000 存取。

    +

    + + + + +

    +

    您可以玩弄 UI 並嘗試使用自己的文件。

    +

    如需進一步的使用示範,您可以參考官方的Knowledge Table 文件

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.json new file mode 100644 index 000000000..8432e269c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["# optional (setup env)\nconda create -n kotaemon python=3.10\nconda activate kotaemon\n\ngit clone https://github.com/Cinnamon/kotaemon\ncd kotaemon\n\npip install -e \"libs/kotaemon[all]\"\npip install -e \"libs/ktem\"\n","\"__type__\": \"kotaemon.storages.MilvusVectorStore\"\n","python app.py\n"],"headingContent":"Kotaemon RAG with Milvus","anchorList":[{"label":"使用 Milvus 的 Kotaemon RAG","href":"Kotaemon-RAG-with-Milvus","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"使用 kotaemon 啟動 RAG","href":"Start-RAG-with-kotaemon","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.md new file mode 100644 index 000000000..5e888b0a2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/kotaemon_with_milvus.md @@ -0,0 +1,97 @@ +--- +id: kotaemon_with_milvus.md +summary: 本教學將引導您如何使用 Milvus 自訂您的 kotaemon 應用程式。 +title: 使用 Milvus 的 Kotaemon RAG +--- +

    使用 Milvus 的 Kotaemon RAG

    Kotaemon是一個開放原始碼、簡潔且可自訂的 RAG UI,用來與您的文件聊天。以最終使用者和開發者為中心而建立。

    +

    Kotaemon 提供可客製化、多使用者的文件 QA 網頁使用者介面,支援本機和以 API 為基礎的 LLM。它提供混合 RAG 輸送管道,包含全文檢索與向量檢索、含圖表文件的多模式 QA,以及含文件預覽的進階引文。它支援 ReAct 和 ReWOO 等複雜的推理方法,並提供可設定的擷取與產生設定。

    +

    本教學將引導您如何使用Milvus 自訂您的 kotaemon 應用程式。

    +

    先決條件

    安裝

    我們建議使用此方式安裝 kotaemon:

    +
    # optional (setup env)
    +conda create -n kotaemon python=3.10
    +conda activate kotaemon
    +
    +git clone https://github.com/Cinnamon/kotaemon
    +cd kotaemon
    +
    +pip install -e "libs/kotaemon[all]"
    +pip install -e "libs/ktem"
    +
    +

    除了這種方式,還有一些其他的方式來安裝 kotaemon。您可以參考官方文件以獲得更多詳細資訊。

    +

    設定 Milvus 為預設向量儲存空間

    若要變更預設向量儲存為 Milvus,您必須修改flowsettings.py 檔案,將KH_VECTORSTORE 切換為:

    +
    "__type__": "kotaemon.storages.MilvusVectorStore"
    +
    +

    設定環境變數

    您可以透過.env 檔案,設定連接 LLM 和嵌入模型所需的資訊。例如:OpenAI、Azure、Ollama 等。

    +

    執行 Kotaemon

    設定環境變數並變更向量儲存後,您可以執行以下指令來執行 kotaemon:

    +
    python app.py
    +
    +

    預設使用者名稱 / 密碼為 admin /admin

    +

    使用 kotaemon 啟動 RAG

    1.新增您的 AI 模型

    + + + + +

    +

    Resources 標籤中,您可以新增並設定您的 LLM 和嵌入模型。您可以新增多個模型,並將它們設定為作用中或非作用中。您只需要提供至少一個。您也可以提供多個模型,以便在它們之間切換。

    +

    2.上傳您的文件

    + + + + +

    +

    為了對您的文件進行 QA,您需要先將它們上傳到應用程式。導覽到File Index 索引標籤,您就可以上傳和管理您的自訂文件。

    +

    預設情況下,所有應用程式資料都儲存在./ktem_app_data 資料夾。Milvus 資料庫資料儲存在./ktem_app_data/user_data/vectorstore 。您可以備份或複製這個資料夾,以便將安裝移到新的機器上。

    +

    3.與您的文件聊天

    + + + + +

    +

    現在導航回到Chat 標籤。聊天」標籤由 3 個區域組成:「會談設定面板」,您可在此管理會談和檔案參考;「聊天面板」,用於與聊天機器人互動;以及「資訊面板」,用於顯示支持證據、置信度分數和答案的相關性評分。

    +

    您可以在「會話設定面板」中選擇您的文件。然後只要在輸入框中輸入訊息,就可以用您的文件啟動 RAG,並將訊息傳送給聊天機器人。

    +

    如果您想深入了解如何使用 kotaemon,您可以從官方文件獲得完整的指導。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.json b/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.json new file mode 100644 index 000000000..7d2063c76 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.json @@ -0,0 +1 @@ +{"codeList":["%pip install -qU langchain_milvus\n","import EmbeddingTabs from \"@theme/EmbeddingTabs\";\n\n\n","# | output: false\n# | echo: false\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings(model=\"text-embedding-3-large\")\n","from langchain_milvus import Milvus\n\n# The easiest way is to use Milvus Lite where everything is stored in a local file.\n# If you have a Milvus server you can use the server URI such as \"http://localhost:19530\".\nURI = \"./milvus_example.db\"\n\nvector_store = Milvus(\n embedding_function=embeddings,\n connection_args={\"uri\": URI},\n)\n","from langchain_core.documents import Document\n\nvector_store_saved = Milvus.from_documents(\n [Document(page_content=\"foo!\")],\n embeddings,\n collection_name=\"langchain_example\",\n connection_args={\"uri\": URI},\n)\n","vector_store_loaded = Milvus(\n embeddings,\n connection_args={\"uri\": URI},\n collection_name=\"langchain_example\",\n)\n","from uuid import uuid4\n\nfrom langchain_core.documents import Document\n\ndocument_1 = Document(\n page_content=\"I had chocalate chip pancakes and scrambled eggs for breakfast this morning.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_2 = Document(\n page_content=\"The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_3 = Document(\n page_content=\"Building an exciting new project with LangChain - come check it out!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_4 = Document(\n page_content=\"Robbers broke into the city bank and stole $1 million in cash.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_5 = Document(\n page_content=\"Wow! That was an amazing movie. I can't wait to see it again.\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_6 = Document(\n page_content=\"Is the new iPhone worth the price? Read this review to find out.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_7 = Document(\n page_content=\"The top 10 soccer players in the world right now.\",\n metadata={\"source\": \"website\"},\n)\n\ndocument_8 = Document(\n page_content=\"LangGraph is the best framework for building stateful, agentic applications!\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocument_9 = Document(\n page_content=\"The stock market is down 500 points today due to fears of a recession.\",\n metadata={\"source\": \"news\"},\n)\n\ndocument_10 = Document(\n page_content=\"I have a bad feeling I am going to get deleted :(\",\n metadata={\"source\": \"tweet\"},\n)\n\ndocuments = [\n document_1,\n document_2,\n document_3,\n document_4,\n document_5,\n document_6,\n document_7,\n document_8,\n document_9,\n document_10,\n]\nuuids = [str(uuid4()) for _ in range(len(documents))]\n\nvector_store.add_documents(documents=documents, ids=uuids)\n","vector_store.delete(ids=[uuids[-1]])\n","results = vector_store.similarity_search(\n \"LangChain provides abstractions to make working with LLMs easy\",\n k=2,\n filter={\"source\": \"tweet\"},\n)\nfor res in results:\n print(f\"* {res.page_content} [{res.metadata}]\")\n","results = vector_store.similarity_search_with_score(\n \"Will it be hot tomorrow?\", k=1, filter={\"source\": \"news\"}\n)\nfor res, score in results:\n print(f\"* [SIM={score:3f}] {res.page_content} [{res.metadata}]\")\n","retriever = vector_store.as_retriever(search_type=\"mmr\", search_kwargs={\"k\": 1})\nretriever.invoke(\"Stealing from the bank is a crime\", filter={\"source\": \"news\"})\n","from langchain_core.documents import Document\n\ndocs = [\n Document(page_content=\"i worked at kensho\", metadata={\"namespace\": \"harrison\"}),\n Document(page_content=\"i worked at facebook\", metadata={\"namespace\": \"ankush\"}),\n]\nvectorstore = Milvus.from_documents(\n docs,\n embeddings,\n connection_args={\"uri\": URI},\n drop_old=True,\n partition_key_field=\"namespace\", # Use the \"namespace\" field as the partition key\n)\n","# This will only get documents for Ankush\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"ankush\"'}).invoke(\n \"where did i work?\"\n)\n","# This will only get documents for Harrison\nvectorstore.as_retriever(search_kwargs={\"expr\": 'namespace == \"harrison\"'}).invoke(\n \"where did i work?\"\n)\n"],"headingContent":"Use Milvus as a Vector Store","anchorList":[{"label":"使用 Milvus 作為向量儲存庫","href":"Use-Milvus-as-a-Vector-Store","type":1,"isActive":false},{"label":"安裝","href":"Setup","type":2,"isActive":false},{"label":"初始化","href":"Initialization","type":2,"isActive":false},{"label":"管理向量儲存","href":"Manage-vector-store","type":2,"isActive":false},{"label":"查詢向量儲存","href":"Query-vector-store","type":2,"isActive":false},{"label":"檢索增強生成的用法","href":"Usage-for-retrieval-augmented-generation","type":2,"isActive":false},{"label":"API 參考","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.md b/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.md new file mode 100644 index 000000000..97d146ba5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/basic_usage_langchain.md @@ -0,0 +1,319 @@ +--- +id: basic_usage_langchain.md +summary: 本筆記本說明如何使用與 Milvus 向量資料庫相關的功能。 +title: 使用 Milvus 作為向量儲存庫 +--- +

    使用 Milvus 作為向量儲存庫

    +

    Milvus是一個資料庫,可儲存、索引和管理由深度神經網路和其他機器學習 (ML) 模型所產生的大量嵌入向量。

    +
    +

    本筆記展示如何使用 Milvus 向量資料庫的相關功能。

    +

    安裝

    您需要透過pip install -qU langchain-milvus 安裝langchain-milvus ,才能使用此整合。

    +
    %pip install -qU  langchain_milvus
    +
    +

    最新版本的 pymilvus 隨附一個本機向量資料庫 Milvus Lite,適合做為原型。如果您有大規模的資料,例如超過一百萬份的文件,我們建議您在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。

    +

    憑證

    使用Milvus 向量存儲不需要憑證。

    +

    初始化

    import EmbeddingTabs from "@theme/EmbeddingTabs";
    +
    +<EmbeddingTabs/>
    +
    +
    # | output: false
    +# | echo: false
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
    +
    +
    from langchain_milvus import Milvus
    +
    +# The easiest way is to use Milvus Lite where everything is stored in a local file.
    +# If you have a Milvus server you can use the server URI such as "http://localhost:19530".
    +URI = "./milvus_example.db"
    +
    +vector_store = Milvus(
    +    embedding_function=embeddings,
    +    connection_args={"uri": URI},
    +)
    +
    +

    使用 Milvus 集合區隔資料

    您可以在同一個 Milvus 實例中,將不同的不相關文件儲存在不同的集合中,以維護上下文。

    +

    下面是如何創建一個新的集合

    +
    from langchain_core.documents import Document
    +
    +vector_store_saved = Milvus.from_documents(
    +    [Document(page_content="foo!")],
    +    embeddings,
    +    collection_name="langchain_example",
    +    connection_args={"uri": URI},
    +)
    +
    +

    以下是如何擷取儲存的集合

    +
    vector_store_loaded = Milvus(
    +    embeddings,
    +    connection_args={"uri": URI},
    +    collection_name="langchain_example",
    +)
    +
    +

    管理向量儲存

    一旦你創建了你的向量商店,我們可以通過添加和刪除不同的項目與它互動。

    +

    將項目加入向量商店

    我們可以使用add_documents 功能,將項目加入向量儲存庫。

    +
    from uuid import uuid4
    +
    +from langchain_core.documents import Document
    +
    +document_1 = Document(
    +    page_content="I had chocalate chip pancakes and scrambled eggs for breakfast this morning.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_2 = Document(
    +    page_content="The weather forecast for tomorrow is cloudy and overcast, with a high of 62 degrees.",
    +    metadata={"source": "news"},
    +)
    +
    +document_3 = Document(
    +    page_content="Building an exciting new project with LangChain - come check it out!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_4 = Document(
    +    page_content="Robbers broke into the city bank and stole $1 million in cash.",
    +    metadata={"source": "news"},
    +)
    +
    +document_5 = Document(
    +    page_content="Wow! That was an amazing movie. I can't wait to see it again.",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_6 = Document(
    +    page_content="Is the new iPhone worth the price? Read this review to find out.",
    +    metadata={"source": "website"},
    +)
    +
    +document_7 = Document(
    +    page_content="The top 10 soccer players in the world right now.",
    +    metadata={"source": "website"},
    +)
    +
    +document_8 = Document(
    +    page_content="LangGraph is the best framework for building stateful, agentic applications!",
    +    metadata={"source": "tweet"},
    +)
    +
    +document_9 = Document(
    +    page_content="The stock market is down 500 points today due to fears of a recession.",
    +    metadata={"source": "news"},
    +)
    +
    +document_10 = Document(
    +    page_content="I have a bad feeling I am going to get deleted :(",
    +    metadata={"source": "tweet"},
    +)
    +
    +documents = [
    +    document_1,
    +    document_2,
    +    document_3,
    +    document_4,
    +    document_5,
    +    document_6,
    +    document_7,
    +    document_8,
    +    document_9,
    +    document_10,
    +]
    +uuids = [str(uuid4()) for _ in range(len(documents))]
    +
    +vector_store.add_documents(documents=documents, ids=uuids)
    +
    +
    ['b0248595-2a41-4f6b-9c25-3a24c1278bb3',
    + 'fa642726-5329-4495-a072-187e948dd71f',
    + '9905001c-a4a3-455e-ab94-72d0ed11b476',
    + 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5',
    + '7508f7ff-c0c9-49ea-8189-634f8a0244d8',
    + '2e179609-3ff7-4c6a-9e05-08978903fe26',
    + 'fab1f2ac-43e1-45f9-b81b-fc5d334c6508',
    + '1206d237-ee3a-484f-baf2-b5ac38eeb314',
    + 'd43cbf9a-a772-4c40-993b-9439065fec01',
    + '25e667bb-6f09-4574-a368-661069301906']
    +
    +

    從向量庫中刪除項目

    vector_store.delete(ids=[uuids[-1]])
    +
    +
    (insert count: 0, delete count: 1, upsert count: 0, timestamp: 0, success count: 0, err count: 0, cost: 0)
    +
    +

    查詢向量儲存

    一旦您的向量儲存庫建立完成,並加入相關文件後,您很可能希望在連鎖或代理程式執行期間查詢它。

    +

    直接查詢

    執行簡單的類似性搜尋並過濾元資料的方法如下:

    +
    results = vector_store.similarity_search(
    +    "LangChain provides abstractions to make working with LLMs easy",
    +    k=2,
    +    filter={"source": "tweet"},
    +)
    +for res in results:
    +    print(f"* {res.page_content} [{res.metadata}]")
    +
    +
    * Building an exciting new project with LangChain - come check it out! [{'pk': '9905001c-a4a3-455e-ab94-72d0ed11b476', 'source': 'tweet'}]
    +* LangGraph is the best framework for building stateful, agentic applications! [{'pk': '1206d237-ee3a-484f-baf2-b5ac38eeb314', 'source': 'tweet'}]
    +
    +

    使用分數進行相似性搜尋

    您也可以使用分數進行搜尋:

    +
    results = vector_store.similarity_search_with_score(
    +    "Will it be hot tomorrow?", k=1, filter={"source": "news"}
    +)
    +for res, score in results:
    +    print(f"* [SIM={score:3f}] {res.page_content} [{res.metadata}]")
    +
    +
    * [SIM=21192.628906] bar [{'pk': '2', 'source': 'https://example.com'}]
    +
    +

    如需使用Milvus 向量商店時可用的所有搜尋選項的完整清單,您可以造訪API 參考資料

    +

    透過轉換成retriever進行查詢

    您也可以將向量儲存轉換成retriever,以便在您的鏈中更容易使用。

    +
    retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
    +retriever.invoke("Stealing from the bank is a crime", filter={"source": "news"})
    +
    +
    [Document(metadata={'pk': 'eacc7256-d7fa-4036-b1f7-83d7a4bee0c5', 'source': 'news'}, page_content='Robbers broke into the city bank and stole $1 million in cash.')]
    +
    +

    檢索增強生成的用法

    有關如何將此向量庫用於檢索擴充生成 (RAG) 的指南,請參閱以下章節:

    + +

    每使用者檢索

    在建立擷取應用程式時,您通常必須以多位使用者為考量。這表示您可能不只為一個使用者儲存資料,而是為許多不同的使用者儲存資料,而且他們應該無法看到彼此的資料。

    +

    Milvus 建議使用partition_key來實現多重租用,這裡是一個範例。

    +
    +

    現在 Milvus Lite 沒有分區鑰匙的功能,如果你想使用它,你需要從docker 或 kubernetes 啟動 Milvus 伺服器。

    +
    +
    from langchain_core.documents import Document
    +
    +docs = [
    +    Document(page_content="i worked at kensho", metadata={"namespace": "harrison"}),
    +    Document(page_content="i worked at facebook", metadata={"namespace": "ankush"}),
    +]
    +vectorstore = Milvus.from_documents(
    +    docs,
    +    embeddings,
    +    connection_args={"uri": URI},
    +    drop_old=True,
    +    partition_key_field="namespace",  # Use the "namespace" field as the partition key
    +)
    +
    +

    若要使用分割區金鑰進行搜尋,您應該在搜尋請求的布林表達式中包含下列任一項:

    +

    search_kwargs={"expr": '<partition_key> == "xxxx"'}

    +

    search_kwargs={"expr": '<partition_key> == in ["xxx", "xxx"]'}

    +

    請以指定為分割區金鑰的欄位名稱取代<partition_key>

    +

    Milvus 會根據指定的分割區金鑰變更為分割區,根據分割區金鑰過濾實體,並在過濾的實體中進行搜尋。

    +
    # This will only get documents for Ankush
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "ankush"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at facebook', metadata={'namespace': 'ankush'})]
    +
    +
    # This will only get documents for Harrison
    +vectorstore.as_retriever(search_kwargs={"expr": 'namespace == "harrison"'}).invoke(
    +    "where did i work?"
    +)
    +
    +
    [Document(page_content='i worked at kensho', metadata={'namespace': 'harrison'})]
    +
    +

    API 參考

    如需所有 __ModuleName__VectorStore 功能和配置的詳細說明文件,請前往 API 參考:https://api.python.langchain.com/en/latest/vectorstores/langchain_milvus.vectorstores.milvus.Milvus.html。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.json b/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.json new file mode 100644 index 000000000..26bc88c25 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import bs4\nfrom langchain_community.document_loaders import WebBaseLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\n\n# Create a WebBaseLoader instance to load documents from web sources\nloader = WebBaseLoader(\n web_paths=(\n \"https://lilianweng.github.io/posts/2023-06-23-agent/\",\n \"https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/\",\n ),\n bs_kwargs=dict(\n parse_only=bs4.SoupStrainer(\n class_=(\"post-content\", \"post-title\", \"post-header\")\n )\n ),\n)\n# Load documents from web sources using the loader\ndocuments = loader.load()\n# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks\ntext_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)\n\n# Split the documents into chunks using the text_splitter\ndocs = text_splitter.split_documents(documents)\n\n# Let's take a look at the first document\ndocs[1]\n","from langchain_milvus import Milvus, Zilliz\nfrom langchain_openai import OpenAIEmbeddings\n\nembeddings = OpenAIEmbeddings()\n\nvectorstore = Milvus.from_documents( # or Zilliz.from_documents\n documents=docs,\n embedding=embeddings,\n connection_args={\n \"uri\": \"./milvus_demo.db\",\n },\n drop_old=True, # Drop the old Milvus collection if it exists\n)\n","query = \"What is self-reflection of an AI Agent?\"\nvectorstore.similarity_search(query, k=1)\n","from langchain_core.runnables import RunnablePassthrough\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_openai import ChatOpenAI\n\n# Initialize the OpenAI language model for response generation\nllm = ChatOpenAI(model_name=\"gpt-3.5-turbo\", temperature=0)\n\n# Define the prompt template for generating AI responses\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\nIf you don't know the answer, just say that you don't know, don't try to make up an answer.\n\n{context}\n\n\n\n{question}\n\n\nThe response should be specific and use statistics or numbers when possible.\n\nAssistant:\"\"\"\n\n# Create a PromptTemplate instance with the defined template and input variables\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n# Convert the vector store to a retriever\nretriever = vectorstore.as_retriever()\n\n\n# Define a function to format the retrieved documents\ndef format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","# Define the RAG (Retrieval-Augmented Generation) chain for AI response generation\nrag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n\n# rag_chain.get_graph().print_ascii()\n\n# Invoke the RAG chain with a specific question and retrieve the response\nres = rag_chain.invoke(query)\nres\n","vectorstore.similarity_search(\n \"What is CoT?\",\n k=1,\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n)\n\n# The same as:\n# vectorstore.as_retriever(search_kwargs=dict(\n# k=1,\n# expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n# )).invoke(\"What is CoT?\")\n","from langchain_core.runnables import ConfigurableField\n\n# Define a new retriever with a configurable field for search_kwargs\nretriever2 = vectorstore.as_retriever().configurable_fields(\n search_kwargs=ConfigurableField(\n id=\"retriever_search_kwargs\",\n )\n)\n\n# Invoke the retriever with a specific search_kwargs which filter the documents by source\nretriever2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n k=1,\n )\n }\n).invoke(query)\n","# Define a new RAG chain with this dynamically configurable retriever\nrag_chain2 = (\n {\"context\": retriever2 | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","# Invoke this RAG chain with a specific question and config\nrag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'\",\n )\n }\n).invoke(query)\n","rag_chain2.with_config(\n configurable={\n \"retriever_search_kwargs\": dict(\n expr=\"source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'\",\n )\n }\n).invoke(query)\n"],"headingContent":"Retrieval-Augmented Generation (RAG) with Milvus and LangChain","anchorList":[{"label":"使用 Milvus 和 LangChain 的檢索-增強世代 (RAG)","href":"Retrieval-Augmented-Generation-RAG-with-Milvus-and-LangChain","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-the-data","type":2,"isActive":false},{"label":"使用 Milvus 向量儲存建立 RAG 鏈","href":"Build-RAG-chain-with-Milvus-Vector-Store","type":2,"isActive":false},{"label":"元資料過濾","href":"Metadata-filtering","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.md b/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.md new file mode 100644 index 000000000..ea780c6b2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/integrate_with_langchain.md @@ -0,0 +1,281 @@ +--- +id: integrate_with_langchain.md +summary: 本指南示範如何使用 LangChain 和 Milvus 建立一個 Retrieval-Augmented Generation (RAG) 系統。 +title: 使用 Milvus 和 LangChain 的檢索-增強世代 (RAG) +--- +

    使用 Milvus 和 LangChain 的檢索-增強世代 (RAG)

    Open In Colab +GitHub Repository

    +

    本指南展示了如何使用 LangChain 和 Milvus 建立一個檢索-增強生成 (RAG) 系統。

    +

    RAG 系統結合了檢索系統與生成模型,可根據給定的提示產生新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    LangChain是一個由大型語言模型 (LLM) 驅動的應用程式開發框架。Milvus是世界上最先進的開放源碼向量資料庫,用於嵌入相似性搜尋和人工智能應用程式。

    +

    先決條件

    執行本筆記本之前,請確定您已安裝下列相依性:

    +
    $ pip install --upgrade --quiet  langchain langchain-core langchain-community langchain-text-splitters langchain-milvus langchain-openai bs4
    +
    +
    +

    如果您使用的是 Google Colab,要啟用剛安裝的依賴項目,您可能需要重新啟動運行時間。(按一下螢幕上方的「Runtime」功能表,然後從下拉式功能表中選擇「Restart session」)。

    +
    +

    我們將使用 OpenAI 的模型。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    準備資料

    我們使用 Langchain WebBaseLoader 從網頁來源載入文件,並使用 RecursiveCharacterTextSplitter 將文件分割成小塊。

    +
    import bs4
    +from langchain_community.document_loaders import WebBaseLoader
    +from langchain_text_splitters import RecursiveCharacterTextSplitter
    +
    +# Create a WebBaseLoader instance to load documents from web sources
    +loader = WebBaseLoader(
    +    web_paths=(
    +        "https://lilianweng.github.io/posts/2023-06-23-agent/",
    +        "https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/",
    +    ),
    +    bs_kwargs=dict(
    +        parse_only=bs4.SoupStrainer(
    +            class_=("post-content", "post-title", "post-header")
    +        )
    +    ),
    +)
    +# Load documents from web sources using the loader
    +documents = loader.load()
    +# Initialize a RecursiveCharacterTextSplitter for splitting text into chunks
    +text_splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
    +
    +# Split the documents into chunks using the text_splitter
    +docs = text_splitter.split_documents(documents)
    +
    +# Let's take a look at the first document
    +docs[1]
    +
    +
    Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/'})
    +
    +

    我們可以看到,文件已經被分割成幾個區塊。而資料的內容是關於 AI 代理的。

    +

    使用 Milvus 向量儲存建立 RAG 鏈

    我們將以文件初始化一個 Milvus 向量儲存庫,將文件載入 Milvus 向量儲存庫,並在引擎蓋下建立索引。

    +
    from langchain_milvus import Milvus, Zilliz
    +from langchain_openai import OpenAIEmbeddings
    +
    +embeddings = OpenAIEmbeddings()
    +
    +vectorstore = Milvus.from_documents(  # or Zilliz.from_documents
    +    documents=docs,
    +    embedding=embeddings,
    +    connection_args={
    +        "uri": "./milvus_demo.db",
    +    },
    +    drop_old=True,  # Drop the old Milvus collection if it exists
    +)
    +
    +
    +

    對於connection_args

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請將Milvus.from_documents 改為Zilliz.from_documents ,並調整uritoken ,分別對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    使用測試查詢問題搜尋 Milvus 向量儲存庫中的文件。讓我們來看看最頂端的 1 個文件。

    +
    query = "What is self-reflection of an AI Agent?"
    +vectorstore.similarity_search(query, k=1)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    from langchain_core.runnables import RunnablePassthrough
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.output_parsers import StrOutputParser
    +from langchain_openai import ChatOpenAI
    +
    +# Initialize the OpenAI language model for response generation
    +llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
    +
    +# Define the prompt template for generating AI responses
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +If you don't know the answer, just say that you don't know, don't try to make up an answer.
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +The response should be specific and use statistics or numbers when possible.
    +
    +Assistant:"""
    +
    +# Create a PromptTemplate instance with the defined template and input variables
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +# Convert the vector store to a retriever
    +retriever = vectorstore.as_retriever()
    +
    +
    +# Define a function to format the retrieved documents
    +def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    使用 LCEL(LangChain Expression Language) 建立 RAG 鏈。

    +
    # Define the RAG (Retrieval-Augmented Generation) chain for AI response generation
    +rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +# rag_chain.get_graph().print_ascii()
    +
    +# Invoke the RAG chain with a specific question and retrieve the response
    +res = rag_chain.invoke(query)
    +res
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    恭喜您!您已經建立了一個由 Milvus 和 LangChain 驅動的基本 RAG 鏈。

    +

    元資料過濾

    我們可以使用Milvus Scalar 過濾規則來根據 metadata 過濾文件。我們從兩個不同的來源載入了文件,我們可以根據元資料來過濾文件source

    +
    vectorstore.similarity_search(
    +    "What is CoT?",
    +    k=1,
    +    expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +)
    +
    +# The same as:
    +# vectorstore.as_retriever(search_kwargs=dict(
    +#     k=1,
    +#     expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +# )).invoke("What is CoT?")
    +
    +
    [Document(page_content='Fig. 1. Overview of a LLM-powered autonomous agent system.\nComponent One: Planning#\nA complicated task usually involves many steps. An agent needs to know what they are and plan ahead.\nTask Decomposition#\nChain of thought (CoT; Wei et al. 2022) has become a standard prompting technique for enhancing model performance on complex tasks. The model is instructed to “think step by step” to utilize more test-time computation to decompose hard tasks into smaller and simpler steps. CoT transforms big tasks into multiple manageable tasks and shed lights into an interpretation of the model’s thinking process.\nTree of Thoughts (Yao et al. 2023) extends CoT by exploring multiple reasoning possibilities at each step. It first decomposes the problem into multiple thought steps and generates multiple thoughts per step, creating a tree structure. The search process can be BFS (breadth-first search) or DFS (depth-first search) with each state evaluated by a classifier (via a prompt) or majority vote.\nTask decomposition can be done (1) by LLM with simple prompting like "Steps for XYZ.\\n1.", "What are the subgoals for achieving XYZ?", (2) by using task-specific instructions; e.g. "Write a story outline." for writing a novel, or (3) with human inputs.\nAnother quite distinct approach, LLM+P (Liu et al. 2023), involves relying on an external classical planner to do long-horizon planning. This approach utilizes the Planning Domain Definition Language (PDDL) as an intermediate interface to describe the planning problem. In this process, LLM (1) translates the problem into “Problem PDDL”, then (2) requests a classical planner to generate a PDDL plan based on an existing “Domain PDDL”, and finally (3) translates the PDDL plan back into natural language. Essentially, the planning step is outsourced to an external tool, assuming the availability of domain-specific PDDL and a suitable planner which is common in certain robotic setups but not in many other domains.\nSelf-Reflection#', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555858})]
    +
    +

    如果我們想要動態地變更搜尋參數,而不需要重建鏈,我們可以設定 runtime chain internals。讓我們用這個動態配置定義一個新的 retriever,然後用它來建立一個新的 RAG 鏈。

    +
    from langchain_core.runnables import ConfigurableField
    +
    +# Define a new retriever with a configurable field for search_kwargs
    +retriever2 = vectorstore.as_retriever().configurable_fields(
    +    search_kwargs=ConfigurableField(
    +        id="retriever_search_kwargs",
    +    )
    +)
    +
    +# Invoke the retriever with a specific search_kwargs which filter the documents by source
    +retriever2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +            k=1,
    +        )
    +    }
    +).invoke(query)
    +
    +
    [Document(page_content='Self-Reflection#\nSelf-reflection is a vital aspect that allows autonomous agents to improve iteratively by refining past action decisions and correcting previous mistakes. It plays a crucial role in real-world tasks where trial and error are inevitable.\nReAct (Yao et al. 2023) integrates reasoning and acting within LLM by extending the action space to be a combination of task-specific discrete actions and the language space. The former enables LLM to interact with the environment (e.g. use Wikipedia search API), while the latter prompting LLM to generate reasoning traces in natural language.\nThe ReAct prompt template incorporates explicit steps for LLM to think, roughly formatted as:\nThought: ...\nAction: ...\nObservation: ...\n... (Repeated many times)', metadata={'source': 'https://lilianweng.github.io/posts/2023-06-23-agent/', 'pk': 449281835035555859})]
    +
    +
    # Define a new RAG chain with this dynamically configurable retriever
    +rag_chain2 = (
    +    {"context": retriever2 | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    讓我們用不同的篩選條件試試這個動態配置的 RAG 鏈。

    +
    # Invoke this RAG chain with a specific question and config
    +rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-06-23-agent/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "Self-reflection of an AI agent involves the process of synthesizing memories into higher-level inferences over time to guide the agent's future behavior. It serves as a mechanism to create higher-level summaries of past events. One approach to self-reflection involves prompting the language model with the 100 most recent observations and asking it to generate the 3 most salient high-level questions based on those observations. This process helps the AI agent optimize believability in the current moment and over time."
    +
    +

    當我們改變搜尋條件,以第二個來源過濾文件時,由於這個部落格來源的內容與查詢問題毫無關係,因此我們得到一個沒有相關資訊的答案。

    +
    rag_chain2.with_config(
    +    configurable={
    +        "retriever_search_kwargs": dict(
    +            expr="source == 'https://lilianweng.github.io/posts/2023-03-15-prompt-engineering/'",
    +        )
    +    }
    +).invoke(query)
    +
    +
    "I'm sorry, but based on the provided context, there is no specific information or statistical data available regarding the self-reflection of an AI agent."
    +
    +
    +

    本教學著重於 Milvus LangChain 整合的基本用法和簡單的 RAG 方法。如需更進階的 RAG 技術,請參考進階 RAG Bootcamp

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.json b/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.json new file mode 100644 index 000000000..3768f9122 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.json @@ -0,0 +1 @@ +{"codeList":["# os.environ[\"LANGSMITH_API_KEY\"] = getpass.getpass(\"Enter your LangSmith API key: \")\n# os.environ[\"LANGSMITH_TRACING\"] = \"true\"\n","%pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai\n","from langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import PromptTemplate\nfrom langchain_core.runnables import RunnablePassthrough\nfrom langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever\nfrom langchain_milvus.utils.sparse import BM25SparseEmbedding\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom pymilvus import (\n Collection,\n CollectionSchema,\n DataType,\n FieldSchema,\n WeightedRanker,\n connections,\n)\n","CONNECTION_URI = \"http://localhost:19530\"\n","export OPENAI_API_KEY=\n","texts = [\n \"In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.\",\n \"In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.\",\n \"In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.\",\n \"In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.\",\n \"In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.\",\n \"In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.\",\n \"In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.\",\n \"In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.\",\n \"In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.\",\n \"In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.\",\n]\n","dense_embedding_func = OpenAIEmbeddings()\ndense_dim = len(dense_embedding_func.embed_query(texts[1]))\ndense_dim\n","sparse_embedding_func = BM25SparseEmbedding(corpus=texts)\nsparse_embedding_func.embed_query(texts[1])\n","connections.connect(uri=CONNECTION_URI)\n","pk_field = \"doc_id\"\ndense_field = \"dense_vector\"\nsparse_field = \"sparse_vector\"\ntext_field = \"text\"\nfields = [\n FieldSchema(\n name=pk_field,\n dtype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n ),\n FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),\n]\n","schema = CollectionSchema(fields=fields, enable_dynamic_field=False)\ncollection = Collection(\n name=\"IntroductionToTheNovels\", schema=schema, consistency_level=\"Strong\"\n)\n","dense_index = {\"index_type\": \"FLAT\", \"metric_type\": \"IP\"}\ncollection.create_index(\"dense_vector\", dense_index)\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncollection.create_index(\"sparse_vector\", sparse_index)\ncollection.flush()\n","entities = []\nfor text in texts:\n entity = {\n dense_field: dense_embedding_func.embed_documents([text])[0],\n sparse_field: sparse_embedding_func.embed_documents([text])[0],\n text_field: text,\n }\n entities.append(entity)\ncollection.insert(entities)\ncollection.load()\n","sparse_search_params = {\"metric_type\": \"IP\"}\ndense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\nretriever = MilvusCollectionHybridSearchRetriever(\n collection=collection,\n rerank=WeightedRanker(0.5, 0.5),\n anns_fields=[dense_field, sparse_field],\n field_embeddings=[dense_embedding_func, sparse_embedding_func],\n field_search_params=[dense_search_params, sparse_search_params],\n top_k=3,\n text_field=text_field,\n)\n","retriever.invoke(\"What are the story about ventures?\")\n","llm = ChatOpenAI()\n\nPROMPT_TEMPLATE = \"\"\"\nHuman: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.\nUse the following pieces of information to provide a concise answer to the question enclosed in tags.\n\n\n{context}\n\n\n\n{question}\n\n\nAssistant:\"\"\"\n\nprompt = PromptTemplate(\n template=PROMPT_TEMPLATE, input_variables=[\"context\", \"question\"]\n)\n","def format_docs(docs):\n return \"\\n\\n\".join(doc.page_content for doc in docs)\n","rag_chain = (\n {\"context\": retriever | format_docs, \"question\": RunnablePassthrough()}\n | prompt\n | llm\n | StrOutputParser()\n)\n","rag_chain.invoke(\"What novels has Lila written and what are their contents?\")\n","collection.drop()\n"],"headingContent":"Milvus Hybrid Search Retriever","anchorList":[{"label":"Milvus 混合型搜索尋回犬","href":"Milvus-Hybrid-Search-Retriever","type":1,"isActive":false},{"label":"總覽","href":"Overview","type":2,"isActive":false},{"label":"設定","href":"Setup","type":2,"isActive":false},{"label":"實體化","href":"Instantiation","type":2,"isActive":false},{"label":"使用方式","href":"Usage","type":2,"isActive":false},{"label":"在鏈中使用","href":"Use-within-a-chain","type":2,"isActive":false},{"label":"API 參考","href":"API-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.md b/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.md new file mode 100644 index 000000000..15acd0aaf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/langchain/milvus_hybrid_search_retriever.md @@ -0,0 +1,308 @@ +--- +id: milvus_hybrid_search_retriever.md +summary: 本筆記本說明如何使用與 Milvus 向量資料庫相關的功能。 +title: Milvus 混合型搜索尋回犬 +--- +

    Milvus 混合型搜索尋回犬

    總覽

    +

    Milvus是一個開放原始碼的向量資料庫,用來支援嵌入式相似性搜尋與人工智慧應用程式。Milvus 讓非結構化資料搜尋更容易存取,不論部署環境為何,都能提供一致的使用者體驗。

    +
    +

    這將有助於您開始使用 Milvus Hybrid SearchRetriever,它結合了密集與稀疏向量搜尋的優點。如需所有MilvusCollectionHybridSearchRetriever 功能和配置的詳細說明文件,請前往API 參考

    +

    另請參閱 Milvus 多向量搜尋文件

    +

    整合細節

    + + + + + + +
    回收器自我託管雲端服務套件
    MilvusCollectionHybridSearchRetrieverlangchain_milvus
    +

    設定

    如果您想要從個別查詢自動追蹤,您也可以在下面取消註解來設定您的LangSmithAPI 金鑰:

    +
    # os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
    +# os.environ["LANGSMITH_TRACING"] = "true"
    +
    +

    安裝

    這個 retriever 存放在langchain-milvus 套件中。本指南需要下列相依性:

    +
    %pip install --upgrade --quiet pymilvus[model] langchain-milvus langchain-openai
    +
    +
    from langchain_core.output_parsers import StrOutputParser
    +from langchain_core.prompts import PromptTemplate
    +from langchain_core.runnables import RunnablePassthrough
    +from langchain_milvus.retrievers import MilvusCollectionHybridSearchRetriever
    +from langchain_milvus.utils.sparse import BM25SparseEmbedding
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from pymilvus import (
    +    Collection,
    +    CollectionSchema,
    +    DataType,
    +    FieldSchema,
    +    WeightedRanker,
    +    connections,
    +)
    +
    +

    啟動 Milvus 服務

    請參考Milvus 文件啟動 Milvus 服務。

    +

    啟動 Milvus 後,您需要指定您的 milvus 連線 URI。

    +
    CONNECTION_URI = "http://localhost:19530"
    +
    +

    準備 OpenAI API Key

    請參考 OpenAI文件取得 OpenAI API key,並將其設定為環境變數。

    +
    export OPENAI_API_KEY=<your_api_key>
    +
    +

    準備密集與稀疏嵌入函數

    讓我們虛構 10 個假的小說描述。在實際製作中,可能會有大量的文字資料。

    +
    texts = [
    +    "In 'The Whispering Walls' by Ava Moreno, a young journalist named Sophia uncovers a decades-old conspiracy hidden within the crumbling walls of an ancient mansion, where the whispers of the past threaten to destroy her own sanity.",
    +    "In 'The Last Refuge' by Ethan Blackwood, a group of survivors must band together to escape a post-apocalyptic wasteland, where the last remnants of humanity cling to life in a desperate bid for survival.",
    +    "In 'The Memory Thief' by Lila Rose, a charismatic thief with the ability to steal and manipulate memories is hired by a mysterious client to pull off a daring heist, but soon finds themselves trapped in a web of deceit and betrayal.",
    +    "In 'The City of Echoes' by Julian Saint Clair, a brilliant detective must navigate a labyrinthine metropolis where time is currency, and the rich can live forever, but at a terrible cost to the poor.",
    +    "In 'The Starlight Serenade' by Ruby Flynn, a shy astronomer discovers a mysterious melody emanating from a distant star, which leads her on a journey to uncover the secrets of the universe and her own heart.",
    +    "In 'The Shadow Weaver' by Piper Redding, a young orphan discovers she has the ability to weave powerful illusions, but soon finds herself at the center of a deadly game of cat and mouse between rival factions vying for control of the mystical arts.",
    +    "In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.",
    +    "In 'The Clockwork Kingdom' by Augusta Wynter, a brilliant inventor discovers a hidden world of clockwork machines and ancient magic, where a rebellion is brewing against the tyrannical ruler of the land.",
    +    "In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.",
    +    "In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.",
    +]
    +
    +

    我們會使用OpenAI Embedding來產生密集向量,並使用BM25 演算法來產生稀疏向量。

    +

    初始化密集嵌入函數並取得維度

    +
    dense_embedding_func = OpenAIEmbeddings()
    +dense_dim = len(dense_embedding_func.embed_query(texts[1]))
    +dense_dim
    +
    +
    1536
    +
    +

    初始化稀疏嵌入函數。

    +

    請注意,稀疏嵌入的輸出是一組稀疏向量,代表輸入文字關鍵字的索引和權重。

    +
    sparse_embedding_func = BM25SparseEmbedding(corpus=texts)
    +sparse_embedding_func.embed_query(texts[1])
    +
    +
    {0: 0.4270424944042204,
    + 21: 1.845826690498331,
    + 22: 1.845826690498331,
    + 23: 1.845826690498331,
    + 24: 1.845826690498331,
    + 25: 1.845826690498331,
    + 26: 1.845826690498331,
    + 27: 1.2237754316221157,
    + 28: 1.845826690498331,
    + 29: 1.845826690498331,
    + 30: 1.845826690498331,
    + 31: 1.845826690498331,
    + 32: 1.845826690498331,
    + 33: 1.845826690498331,
    + 34: 1.845826690498331,
    + 35: 1.845826690498331,
    + 36: 1.845826690498331,
    + 37: 1.845826690498331,
    + 38: 1.845826690498331,
    + 39: 1.845826690498331}
    +
    +

    建立 Milvus 套件並載入資料

    初始化連線 URI 並建立連線

    +
    connections.connect(uri=CONNECTION_URI)
    +
    +

    定義欄位名稱及其資料類型

    +
    pk_field = "doc_id"
    +dense_field = "dense_vector"
    +sparse_field = "sparse_vector"
    +text_field = "text"
    +fields = [
    +    FieldSchema(
    +        name=pk_field,
    +        dtype=DataType.VARCHAR,
    +        is_primary=True,
    +        auto_id=True,
    +        max_length=100,
    +    ),
    +    FieldSchema(name=dense_field, dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +    FieldSchema(name=sparse_field, dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name=text_field, dtype=DataType.VARCHAR, max_length=65_535),
    +]
    +
    +

    使用定義的模式建立集合

    +
    schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +collection = Collection(
    +    name="IntroductionToTheNovels", schema=schema, consistency_level="Strong"
    +)
    +
    +

    定義密集與稀疏向量的索引

    +
    dense_index = {"index_type": "FLAT", "metric_type": "IP"}
    +collection.create_index("dense_vector", dense_index)
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +collection.create_index("sparse_vector", sparse_index)
    +collection.flush()
    +
    +

    將實體插入集合並載入集合

    +
    entities = []
    +for text in texts:
    +    entity = {
    +        dense_field: dense_embedding_func.embed_documents([text])[0],
    +        sparse_field: sparse_embedding_func.embed_documents([text])[0],
    +        text_field: text,
    +    }
    +    entities.append(entity)
    +collection.insert(entities)
    +collection.load()
    +
    +

    實體化

    現在我們可以實體化我們的 Retriever,定義稀疏和密集欄位的搜尋參數:

    +
    sparse_search_params = {"metric_type": "IP"}
    +dense_search_params = {"metric_type": "IP", "params": {}}
    +retriever = MilvusCollectionHybridSearchRetriever(
    +    collection=collection,
    +    rerank=WeightedRanker(0.5, 0.5),
    +    anns_fields=[dense_field, sparse_field],
    +    field_embeddings=[dense_embedding_func, sparse_embedding_func],
    +    field_search_params=[dense_search_params, sparse_search_params],
    +    top_k=3,
    +    text_field=text_field,
    +)
    +
    +

    在這個 Retriever 的輸入參數中,我們使用密集嵌入和稀疏嵌入來對這個 Collection 的兩個欄位執行混合搜尋,並使用 WeightedRanker 來進行重新排序。最後,將返回 3 個 Top-K Documents。

    +

    使用方式

    retriever.invoke("What are the story about ventures?")
    +
    +
    [Document(page_content="In 'The Lost Expedition' by Caspian Grey, a team of explorers ventures into the heart of the Amazon rainforest in search of a lost city, but soon finds themselves hunted by a ruthless treasure hunter and the treacherous jungle itself.", metadata={'doc_id': '449281835035545843'}),
    + Document(page_content="In 'The Phantom Pilgrim' by Rowan Welles, a charismatic smuggler is hired by a mysterious organization to transport a valuable artifact across a war-torn continent, but soon finds themselves pursued by deadly assassins and rival factions.", metadata={'doc_id': '449281835035545845'}),
    + Document(page_content="In 'The Dreamwalker's Journey' by Lyra Snow, a young dreamwalker discovers she has the ability to enter people's dreams, but soon finds herself trapped in a surreal world of nightmares and illusions, where the boundaries between reality and fantasy blur.", metadata={'doc_id': '449281835035545846'})]
    +
    +

    在鏈中使用

    初始化 ChatOpenAI 並定義一個提示範本

    +
    llm = ChatOpenAI()
    +
    +PROMPT_TEMPLATE = """
    +Human: You are an AI assistant, and provides answers to questions by using fact based and statistical information when possible.
    +Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
    +
    +<context>
    +{context}
    +</context>
    +
    +<question>
    +{question}
    +</question>
    +
    +Assistant:"""
    +
    +prompt = PromptTemplate(
    +    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
    +)
    +
    +

    定義格式化文件的函式

    +
    def format_docs(docs):
    +    return "\n\n".join(doc.page_content for doc in docs)
    +
    +

    使用檢索器和其他元件定義鏈

    +
    rag_chain = (
    +    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    +    | prompt
    +    | llm
    +    | StrOutputParser()
    +)
    +
    +

    使用定義的鏈執行查詢

    +
    rag_chain.invoke("What novels has Lila written and what are their contents?")
    +
    +
    "Lila Rose has written 'The Memory Thief,' which follows a charismatic thief with the ability to steal and manipulate memories as they navigate a daring heist and a web of deceit and betrayal."
    +
    +

    丟棄集合

    +
    collection.drop()
    +
    +

    API 參考

    如需所有MilvusCollectionHybridSearchRetriever 功能和配置的詳細說明文件,請前往API 參考

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.json b/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.json new file mode 100644 index 000000000..31355470f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.json @@ -0,0 +1 @@ +{"codeList":["$ pip install llama-agents pymilvus openai python-dotenv\n","$ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai\n","# NOTE: This is ONLY necessary in jupyter notebook.\n# Details: Jupyter runs an event-loop behind the scenes.\n# This results in nested event-loops when we start an event-loop to make async queries.\n# This is normally not allowed, we use nest_asyncio to allow it for convenience.\nimport nest_asyncio\n\nnest_asyncio.apply()\n","\"\"\"\nload_dotenv reads key-value pairs from a .env file and can set them as environment variables.\nThis is useful to avoid leaking your API key for example :D\n\"\"\"\n\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n","$ mkdir -p 'data/10k/'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'\n$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'\n","from llama_index.core import Settings\nfrom llama_index.embeddings.mistralai import MistralAIEmbedding\n\n# Define the default Embedding model used in this Notebook.\n# We are using Mistral Models, so we are also using Mistral Embeddings\n\nSettings.embed_model = MistralAIEmbedding(model_name=\"mistral-embed\")\n","from llama_index.llms.ollama import Ollama\n\nSettings.llm = Ollama(\"mistral-nemo\")\n","from llama_index.vector_stores.milvus import MilvusVectorStore\nfrom llama_index.core import (\n SimpleDirectoryReader,\n VectorStoreIndex,\n StorageContext,\n load_index_from_storage,\n)\nfrom llama_index.core.tools import QueryEngineTool, ToolMetadata\n\ninput_files = [\"./data/10k/lyft_2021.pdf\", \"./data/10k/uber_2021.pdf\"]\n\n# Create a single Milvus vector store\nvector_store = MilvusVectorStore(\n uri=\"./milvus_demo.db\", dim=1024, overwrite=False, collection_name=\"companies_docs\"\n)\n\n# Create a storage context with the Milvus vector store\nstorage_context = StorageContext.from_defaults(vector_store=vector_store)\n\n# Load data\ndocs = SimpleDirectoryReader(input_files=input_files).load_data()\n\n# Build index\nindex = VectorStoreIndex.from_documents(docs, storage_context=storage_context)\n\n# Define the query engine\ncompany_engine = index.as_query_engine(similarity_top_k=3)\n","# Define the different tools that can be used by our Agent.\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"lyft_10k\",\n description=(\n \"Provides information about Lyft financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n QueryEngineTool(\n query_engine=company_engine,\n metadata=ToolMetadata(\n name=\"uber_10k\",\n description=(\n \"Provides information about Uber financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","from llama_index.llms.ollama import Ollama\nfrom llama_index.llms.mistralai import MistralAI\n\n# Set up the agent\nllm = Ollama(model=\"mistral-nemo\")\n\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"Could you please provide a comparison between Lyft and Uber's total revenues in 2021?\",\n allow_parallel_tool_calls=True,\n)\n\n# Example usage without metadata filtering\nprint(\"Response without metadata filtering:\")\nprint(response)\n","from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters\n\n# Example usage with metadata filtering\nfilters = MetadataFilters(\n filters=[ExactMatchFilter(key=\"file_name\", value=\"lyft_2021.pdf\")]\n)\n\nprint(f\"filters: {filters}\")\nfiltered_query_engine = index.as_query_engine(filters=filters)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n \"Use this tool to retrieve specific data points about a company. \"\n \"Do not attempt to interpret or summarize the data.\"\n ),\n ),\n ),\n]\n","# Set up the LLM we will use for Function Calling\n\nllm = Ollama(model=\"mistral-nemo\")\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"How many employees does Uber have?\",\n allow_parallel_tool_calls=True,\n)\nprint(response)\n","response = llm.predict_and_call(\n query_engine_tools,\n user_msg=\"What are the risk factors for Lyft?\",\n allow_parallel_tool_calls=True,\n)\n\nprint(response)\n","> Question: What are the risk factors for Uber?\n\n> Response without metadata filtering:\nBased on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:\n\n- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.\n- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.\n- Risks related to attracting and retaining qualified drivers and riders.\n","from llama_index.core.prompts.base import PromptTemplate\n\n\n# Function to create a filtered query engine\ndef create_query_engine(question):\n # Extract metadata filters from question using a language model\n prompt_template = PromptTemplate(\n \"Given the following question, extract relevant metadata filters.\\n\"\n \"Consider company names, years, and any other relevant attributes.\\n\"\n \"Don't write any other text, just the MetadataFilters object\"\n \"Format it by creating a MetadataFilters like shown in the following\\n\"\n \"MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\\n\"\n \"If no specific filters are mentioned, returns an empty MetadataFilters()\\n\"\n \"Question: {question}\\n\"\n \"Metadata Filters:\\n\"\n )\n\n prompt = prompt_template.format(question=question)\n llm = Ollama(model=\"mistral-nemo\")\n response = llm.complete(prompt)\n\n metadata_filters_str = response.text.strip()\n if metadata_filters_str:\n metadata_filters = eval(metadata_filters_str)\n print(f\"eval: {metadata_filters}\")\n return index.as_query_engine(filters=metadata_filters)\n return index.as_query_engine()\n","response = create_query_engine(\n \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\n)\n","## Example usage with metadata filtering\nquestion = \"What is Uber revenue? This should be in the file_name: uber_2021.pdf\"\nfiltered_query_engine = create_query_engine(question)\n\n# Define query engine tools with the filtered query engine\nquery_engine_tools = [\n QueryEngineTool(\n query_engine=filtered_query_engine,\n metadata=ToolMetadata(\n name=\"company_docs_filtering\",\n description=(\n \"Provides information about various companies' financials for year 2021. \"\n \"Use a detailed plain text question as input to the tool.\"\n ),\n ),\n ),\n]\n# Set up the agent with the updated query engine tools\nresponse = llm.predict_and_call(\n query_engine_tools,\n user_msg=question,\n allow_parallel_tool_calls=True,\n)\n\nprint(\"Response with metadata filtering:\")\nprint(response)\n","from llama_agents import (\n AgentService,\n ToolService,\n LocalLauncher,\n MetaServiceTool,\n ControlPlaneServer,\n SimpleMessageQueue,\n AgentOrchestrator,\n)\n\nfrom llama_index.core.agent import FunctionCallingAgentWorker\nfrom llama_index.llms.mistralai import MistralAI\n\n# create our multi-agent framework components\nmessage_queue = SimpleMessageQueue()\ncontrol_plane = ControlPlaneServer(\n message_queue=message_queue,\n orchestrator=AgentOrchestrator(llm=MistralAI(\"mistral-large-latest\")),\n)\n\n# define Tool Service\ntool_service = ToolService(\n message_queue=message_queue,\n tools=query_engine_tools,\n running=True,\n step_interval=0.5,\n)\n\n# define meta-tools here\nmeta_tools = [\n await MetaServiceTool.from_tool_service(\n t.metadata.name,\n message_queue=message_queue,\n tool_service=tool_service,\n )\n for t in query_engine_tools\n]\n\n# define Agent and agent service\nworker1 = FunctionCallingAgentWorker.from_tools(\n meta_tools, llm=MistralAI(\"mistral-large-latest\")\n)\n\nagent1 = worker1.as_agent()\nagent_server_1 = AgentService(\n agent=agent1,\n message_queue=message_queue,\n description=\"Used to answer questions over differnet companies for their Financial results\",\n service_name=\"Companies_analyst_agent\",\n)\n","import logging\n\n# change logging level to enable or disable more verbose logging\nlogging.getLogger(\"llama_agents\").setLevel(logging.INFO)\n","## Define Launcher\nlauncher = LocalLauncher(\n [agent_server_1, tool_service],\n control_plane,\n message_queue,\n)\n","query_str = \"What are the risk factors for Uber?\"\nresult = launcher.launch_single(query_str)\n","print(result)\n"],"headingContent":"Multi-agent Systems with Mistral AI, Milvus and Llama-agents","anchorList":[{"label":"使用 Mistral AI、Milvus 和 Llama-agents 的多代理系統","href":"Multi-agent-Systems-with-Mistral-AI-Milvus-and-Llama-agents","type":1,"isActive":false},{"label":"本手冊的目標","href":"Goal-of-this-Notebook","type":2,"isActive":false},{"label":"Milvus","href":"Milvus","type":2,"isActive":false},{"label":"llama-agents","href":"llama-agents","type":2,"isActive":false},{"label":"llama-index","href":"llama-index","type":2,"isActive":false},{"label":"Mistral AI","href":"Mistral-AI","type":2,"isActive":false},{"label":"安裝相依性","href":"Install-Dependencies","type":2,"isActive":false},{"label":"取得 Mistral 的 API 金鑰","href":"Get-your-API-Key-for-Mistral","type":2,"isActive":false},{"label":"下載資料","href":"Download-data","type":2,"isActive":false},{"label":"準備嵌入模型","href":"Prepare-Embedding-Model","type":1,"isActive":false},{"label":"定義 LLM 模型","href":"Define-the-LLM-Model","type":2,"isActive":false},{"label":"安裝 Milvus 並載入資料","href":"Instanciate-Milvus-and-Load-Data","type":2,"isActive":false},{"label":"定義工具","href":"Define-Tools","type":2,"isActive":false},{"label":"元資料篩選","href":"Metadata-Filtering","type":2,"isActive":false},{"label":"元資料篩選的使用案例","href":"Use-Cases-for-Metadata-Filtering","type":2,"isActive":false},{"label":"使用範例","href":"Example-usage","type":2,"isActive":false},{"label":"函式呼叫","href":"Function-Calling","type":2,"isActive":false},{"label":"與代理互動","href":"Interact-with-the-Agent","type":2,"isActive":false},{"label":"沒有元資料篩選的混淆範例","href":"Example-of-Confusion-Without-Metadata-Filtering","type":2,"isActive":false},{"label":"使用代理程式擷取元資料篩選器","href":"Using-an-Agent-to-Extract-Metadata-Filters","type":2,"isActive":false},{"label":"程式碼範例","href":"Code-Example","type":2,"isActive":false},{"label":"使用 Mistral Large 協調不同的服務","href":"Orchestrating-the-different-services-with-Mistral-Large","type":2,"isActive":false},{"label":"總結","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.md b/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.md new file mode 100644 index 000000000..6e82ba4b0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/llama_agents_metadata.md @@ -0,0 +1,782 @@ +--- +id: llama_agents_metadata.md +summary: >- + 在本筆記簿中,我們將探討不同的想法:將資料儲存至 Milvus、使用 llama-index 搭配 Mistral + 模型進行資料查詢、建立自動化資料搜尋與讀取代理程式,以及開發根據使用者查詢進行元資料篩選的代理程式。 +title: 使用 Mistral AI、Milvus 和 Llama-agents 的多代理系統 +--- +

    使用 Mistral AI、Milvus 和 Llama-agents 的多代理系統

    本手冊的目標

    在本筆記簿中,我們將探討不同的想法:

    +
      +
    • 1️⃣ Store Data into Milvus:學習將資料儲存到Milvus中,Milvus是為高速相似性搜索和人工智能應用而設計的高效向量資料庫。

    • +
    • 2️⃣使用llama-index與Mistral模型進行資料查詢:探索如何結合Mistral模型使用llama-index查詢儲存於Milvus的資料。

    • +
    • 3️⃣建立自動化的資料搜尋與讀取代理:建立能根據使用者查詢自動搜尋與讀取資料的代理。這些自動化代理程式可提供快速、精確的回覆,減少手動搜尋的工作量,進而提升使用者體驗。

    • +
    • 4️⃣開發基於使用者查詢的元資料篩選代理程式:實施可自動根據使用者查詢產生元資料篩選程式的代理程式,精煉搜尋結果並使其符合上下文,避免混亂並提高所擷取資訊的準確性,即使是複雜的查詢也不例外。

    • +
    • 🔍 摘要 在本筆記簿結束時,您將全面了解如何使用 Milvus、llama-index 搭配 llama-agents 以及 Mistral 模型來建立一個強大且有效率的資料檢索系統。

    • +
    +

    Milvus

    Milvus 是一個開放原始碼的向量資料庫,以向量嵌入和相似性搜尋為 AI 應用程式提供動力。

    +

    在本筆記簿中,我們使用 Milvus Lite,它是 Milvus 的輕量級版本。

    +

    使用 Milvus Lite,您可以在幾分鐘內開始使用向量相似性搜尋建立 AI 應用程式!Milvus Lite 適合在下列環境中執行:

    +
      +
    • Jupyter Notebook / Google Colab
    • +
    • 筆記型電腦
    • +
    • 邊緣裝置
    • +
    +

    + + image.png + image.png

    +

    llama-agents

    llama-agents 可讓代理以微服務的方式執行。這樣就能上下擴充服務。

    +

    llama-index

    LlamaIndex 是 LLM 應用程式的資料框架。它提供的工具包括

    +
      +
    • 資料連接器可從原始來源和格式擷取現有資料。
    • +
    • 資料索引將您的資料結構化,使其成為 LLM 易於使用且效能優異的中間表示形式。
    • +
    • 引擎提供自然語言存取您的資料。
    • +
    • 代理是由 LLM 驅動的知識工作者,透過工具來增強,從簡單的輔助功能到 API 整合等等。
    • +
    +

    + + image.png + image.png

    +

    Mistral AI

    Mistral AI 是一個建立 LLM 與 Embeddings 模型的研究實驗室,他們最近發表了新版本的模型,Mistral Nemo 與 Mistral Large,這兩個模型在 RAG 與函式呼叫方面表現得特別好。正因為如此,我們將在本筆記本中使用它們。

    +

    安裝相依性

    $ pip install llama-agents pymilvus openai python-dotenv
    +
    +
    $ pip install llama-index-vector-stores-milvus llama-index-readers-file llama-index-llms-ollama llama-index-llms-mistralai llama-index-embeddings-mistralai
    +
    +
    # NOTE: This is ONLY necessary in jupyter notebook.
    +# Details: Jupyter runs an event-loop behind the scenes.
    +#          This results in nested event-loops when we start an event-loop to make async queries.
    +#          This is normally not allowed, we use nest_asyncio to allow it for convenience.
    +import nest_asyncio
    +
    +nest_asyncio.apply()
    +
    +

    取得 Mistral 的 API 金鑰

    您可以從Mistral Cloud Console 取得 Mistral API 金鑰。

    +
    """
    +load_dotenv reads key-value pairs from a .env file and can set them as environment variables.
    +This is useful to avoid leaking your API key for example :D
    +"""
    +
    +from dotenv import load_dotenv
    +import os
    +
    +load_dotenv()
    +
    +
    True
    +
    +

    下載資料

    $ mkdir -p 'data/10k/'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/uber_2021.pdf' -O 'data/10k/uber_2021.pdf'
    +$ wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/10k/lyft_2021.pdf' -O 'data/10k/lyft_2021.pdf'
    +
    +

    準備嵌入模型

    我們定義本筆記本使用的 Embedding Model。我們使用mistral-embed ,這是一個由 Mistral 開發的 Embedding Model,它已經針對 Retrievals 訓練過,這使得它對於我們的 Agentic RAG 系統來說是一個非常好的模型。詳情請參閱 Mistral 文件的Embedding頁面。

    +
    from llama_index.core import Settings
    +from llama_index.embeddings.mistralai import MistralAIEmbedding
    +
    +# Define the default Embedding model used in this Notebook.
    +# We are using Mistral Models, so we are also using Mistral Embeddings
    +
    +Settings.embed_model = MistralAIEmbedding(model_name="mistral-embed")
    +
    +

    定義 LLM 模型

    Llama Index 使用 LLM 來回應提示和查詢,並負責撰寫自然語言回應。 我們定義 Mistral Nemo 為預設。Nemo 提供最多 128k tokens 的大型上下文視窗。它的推理能力、世界知識和編碼準確度在同級產品中都是最先進的。

    +
    from llama_index.llms.ollama import Ollama
    +
    +Settings.llm = Ollama("mistral-nemo")
    +
    +

    安裝 Milvus 並載入資料

    Milvus是一個廣受歡迎的開放原始碼向量資料庫,以高效能、可擴充的向量相似性搜尋為 AI 應用程式提供動力。

    +
      +
    • 將 uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在此檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的 uri。
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完整管理雲端服務,請調整 uri 和 token,對應 Zilliz Cloud 的Public Endpoint 和 API key
    • +
    +
    from llama_index.vector_stores.milvus import MilvusVectorStore
    +from llama_index.core import (
    +    SimpleDirectoryReader,
    +    VectorStoreIndex,
    +    StorageContext,
    +    load_index_from_storage,
    +)
    +from llama_index.core.tools import QueryEngineTool, ToolMetadata
    +
    +input_files = ["./data/10k/lyft_2021.pdf", "./data/10k/uber_2021.pdf"]
    +
    +# Create a single Milvus vector store
    +vector_store = MilvusVectorStore(
    +    uri="./milvus_demo.db", dim=1024, overwrite=False, collection_name="companies_docs"
    +)
    +
    +# Create a storage context with the Milvus vector store
    +storage_context = StorageContext.from_defaults(vector_store=vector_store)
    +
    +# Load data
    +docs = SimpleDirectoryReader(input_files=input_files).load_data()
    +
    +# Build index
    +index = VectorStoreIndex.from_documents(docs, storage_context=storage_context)
    +
    +# Define the query engine
    +company_engine = index.as_query_engine(similarity_top_k=3)
    +
    +

    定義工具

    建立有效代理程式的關鍵步驟之一,就是定義它可以用來執行任務的工具。這些工具基本上是代理程式可以用來擷取資訊或執行動作的函式或服務。

    +

    下面,我們將定義兩個工具,讓我們的代理可以用來查詢 2021 年 Lyft 和 Uber 的財務資訊。這些工具將會整合到我們的代理程式中,讓代理程式能夠以精確且相關的資訊回應自然語言查詢。

    +

    如果您看一下我們在頂端的圖表,這就是「Agent 服務」。

    +
    # Define the different tools that can be used by our Agent.
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="lyft_10k",
    +            description=(
    +                "Provides information about Lyft financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +    QueryEngineTool(
    +        query_engine=company_engine,
    +        metadata=ToolMetadata(
    +            name="uber_10k",
    +            description=(
    +                "Provides information about Uber financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    from llama_index.llms.ollama import Ollama
    +from llama_index.llms.mistralai import MistralAI
    +
    +# Set up the agent
    +llm = Ollama(model="mistral-nemo")
    +
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="Could you please provide a comparison between Lyft and Uber's total revenues in 2021?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +# Example usage without metadata filtering
    +print("Response without metadata filtering:")
    +print(response)
    +
    +
    Response without metadata filtering:
    +The revenue for Lyft in 2021 was $3.84 billion.
    +
    +Uber's total revenue for the year ended December 31, 2021 was $17,455 million.
    +
    +

    元資料篩選

    Milvus支援Metadata 過濾,這是一種技術,可讓您根據與資料相關的特定屬性或標籤,精細並縮小搜尋結果的範圍。當您擁有大量資料,且只需要擷取符合特定條件的相關資料子集時,此功能尤其有用。

    +

    元資料篩選的使用案例

      +
    • 搜尋結果的精確度:透過套用元資料篩選器,您可以確保搜尋結果與使用者的查詢高度相關。例如,如果您有一系列財務文件,您可以根據公司名稱、年份或任何其他相關的元資料來篩選這些文件。

    • +
    • 效率:元資料篩選有助於減少需要處理的資料量,使搜尋作業更有效率。這在處理大型資料集時尤其有利。

    • +
    • 客製化:不同的使用者或應用程式可能有不同的需求。元資料篩選可讓您自訂搜尋結果,以滿足特定需求,例如擷取特定年份或公司的文件。

    • +
    +

    使用範例

    在下面的程式碼區塊中,元資料篩選被用來建立一個篩選的查詢引擎,根據特定的元資料鍵值對來擷取文件:file_namelyft_2021.pdf

    +

    下面定義的QueryEngineTool 比上面定義的更通用,在上面的定義中,我們每個公司(Uber 和 Lyft)都有一個工具,在這個定義中,它更通用。我們只知道我們有關於公司的財務文件,但僅止於此。 透過加入 Metadata Filtering,我們可以過濾只從特定文件取得的資料。

    +
    from llama_index.core.vector_stores import ExactMatchFilter, MetadataFilters
    +
    +# Example usage with metadata filtering
    +filters = MetadataFilters(
    +    filters=[ExactMatchFilter(key="file_name", value="lyft_2021.pdf")]
    +)
    +
    +print(f"filters: {filters}")
    +filtered_query_engine = index.as_query_engine(filters=filters)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +                "Use this tool to retrieve specific data points about a company. "
    +                "Do not attempt to interpret or summarize the data."
    +            ),
    +        ),
    +    ),
    +]
    +
    +
    filters: filters=[MetadataFilter(key='file_name', value='lyft_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +

    函式呼叫

    Mistral Nemo 和 Large 支援原生函式呼叫。透過 LLM 上的predict_and_call 函式,可與 LlamaIndex 工具無縫整合。這允許使用者附加任何工具,並讓 LLM 決定要呼叫哪些工具 (如果有)。

    +

    您可以在 llama-index 網站上瞭解更多關於Agents的資訊。

    +
    # Set up the LLM we will use for Function Calling
    +
    +llm = Ollama(model="mistral-nemo")
    +
    +

    與代理互動

    現在我們可以實作 Metadata 過濾:

    +
      +
    1. 在第一張圖中,Agent 應該無法找到任何與使用者查詢相關的資訊,因為這是關於 Uber 的資訊,而我們只會篩選關於 Lyft 的文件。
    2. +
    3. 在第二個例子中,Agent 應該可以找到關於 Lyft 的資訊,因為我們只會搜尋關於 Lyft 的文件。
    4. +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="How many employees does Uber have?",
    +    allow_parallel_tool_calls=True,
    +)
    +print(response)
    +
    +
    I'm unable to provide information about Uber's employee count as it's outside the given Lyft context.
    +
    +
    response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg="What are the risk factors for Lyft?",
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print(response)
    +
    +
    Investing in Lyft carries significant risks. These include general economic factors like impacts from pandemics or crises, operational factors such as competition, pricing changes, and driver/ride growth unpredictability, insurance coverage issues, autonomous vehicle technology uncertainties, reputational concerns, potential security breaches, reliance on third-party services, and challenges in expanding platform offerings. Lyft's business operations are subject to numerous other risks not explicitly mentioned here, which could also harm its financial condition and prospects.
    +
    +

    沒有元資料篩選的混淆範例

    > Question: What are the risk factors for Uber?
    +
    +> Response without metadata filtering:
    +Based on the provided context, which pertains to Lyft's Risk Factors section in their Annual Report, some of the potential risk factors applicable to a company like Uber might include:
    +
    +- General economic factors such as the impact of global pandemics or other crises on ride-sharing demand.
    +- Operational factors like competition in ride-hailing services, unpredictability in results of operations, and uncertainty about market growth for ridesharing and related services.
    +- Risks related to attracting and retaining qualified drivers and riders.
    +
    +

    在這個範例中,系統錯誤地提供了關於 Lyft 而非 Uber 的資訊,導致了誤導性的回應。系統一開始就說它沒有這些資訊,但接著又繼續說下去。

    +

    使用代理程式擷取元資料篩選器

    為了解決這個問題,我們可以使用代理程式從使用者的問題中自動擷取元資料篩選器,並在回答問題的過程中套用這些篩選器。這可確保系統擷取正確的相關資訊。

    +

    程式碼範例

    以下是一個程式碼範例,示範如何使用代理從使用者的問題中擷取元資料篩選器來建立篩選式查詢引擎:

    +

    說明

      +
    • Prompt Template:PromptTemplate 類用於定義從使用者問題中抽取元資料篩選器的範本。該模板指示語言模型考慮公司名稱、年份和其他相關屬性。

    • +
    • LLM: Mistral Nemo 用來根據使用者的問題產生元資料篩選器。模型會根據問題和範本來擷取相關的篩選條件。

    • +
    • 元資料篩選器:LLM 的回應會被解析以建立MetadataFilters 物件。如果沒有提及特定的篩選條件,則會傳回一個空的MetadataFilters 物件。

    • +
    • 過濾查詢引擎index.as_query_engine(filters=metadata_filters) 方法會建立一個查詢引擎,將擷取的元資料過濾器套用至索引。這可確保只擷取符合篩選條件的文件。

    • +
    +
    from llama_index.core.prompts.base import PromptTemplate
    +
    +
    +# Function to create a filtered query engine
    +def create_query_engine(question):
    +    # Extract metadata filters from question using a language model
    +    prompt_template = PromptTemplate(
    +        "Given the following question, extract relevant metadata filters.\n"
    +        "Consider company names, years, and any other relevant attributes.\n"
    +        "Don't write any other text, just the MetadataFilters object"
    +        "Format it by creating a MetadataFilters like shown in the following\n"
    +        "MetadataFilters(filters=[ExactMatchFilter(key='file_name', value='lyft_2021.pdf')])\n"
    +        "If no specific filters are mentioned, returns an empty MetadataFilters()\n"
    +        "Question: {question}\n"
    +        "Metadata Filters:\n"
    +    )
    +
    +    prompt = prompt_template.format(question=question)
    +    llm = Ollama(model="mistral-nemo")
    +    response = llm.complete(prompt)
    +
    +    metadata_filters_str = response.text.strip()
    +    if metadata_filters_str:
    +        metadata_filters = eval(metadata_filters_str)
    +        print(f"eval: {metadata_filters}")
    +        return index.as_query_engine(filters=metadata_filters)
    +    return index.as_query_engine()
    +
    +
    response = create_query_engine(
    +    "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +
    +
    ## Example usage with metadata filtering
    +question = "What is Uber revenue? This should be in the file_name: uber_2021.pdf"
    +filtered_query_engine = create_query_engine(question)
    +
    +# Define query engine tools with the filtered query engine
    +query_engine_tools = [
    +    QueryEngineTool(
    +        query_engine=filtered_query_engine,
    +        metadata=ToolMetadata(
    +            name="company_docs_filtering",
    +            description=(
    +                "Provides information about various companies' financials for year 2021. "
    +                "Use a detailed plain text question as input to the tool."
    +            ),
    +        ),
    +    ),
    +]
    +# Set up the agent with the updated query engine tools
    +response = llm.predict_and_call(
    +    query_engine_tools,
    +    user_msg=question,
    +    allow_parallel_tool_calls=True,
    +)
    +
    +print("Response with metadata filtering:")
    +print(response)
    +
    +
    eval: filters=[MetadataFilter(key='file_name', value='uber_2021.pdf', operator=<FilterOperator.EQ: '=='>)] condition=<FilterCondition.AND: 'and'>
    +Response with metadata filtering:
    +Uber's total revenue for the year ended December 31, 2021, is $17.455 billion.
    +
    +

    使用 Mistral Large 協調不同的服務

    Mistral Large 是 Mistral 的旗艦型號,具有非常好的推理、知識和編碼能力。它是需要大型推理能力或高度專業化的複雜任務的理想選擇。它擁有進階的函式呼叫能力,這正是我們需要來協調不同代理的地方。

    +

    為什麼我們需要更聰明的 Model?

    下面要回答的問題特別具有挑戰性,因為它需要協調多種服務和代理來提供一致且精確的回應。這涉及到協調各種工具和代理來擷取和處理來自不同來源的資訊,例如來自不同公司的財務資料。

    +

    這有什麼難的?

      +
    • 複雜性:這個問題涉及到多個代理和服務,每個代理和服務都有自己的功能和資料來源。協調這些代理,使其無縫合作是一項複雜的任務。
    • +
    +
      +
    • 資料整合:這個問題需要整合來自不同來源的資料,由於資料格式、結構和元資料的差異,這可能是一項挑戰。

    • +
    • 情境瞭解:問題可能需要理解不同資訊之間的上下文和關係,這是一項對認知要求很高的任務。

    • +
    +

    為什麼 Mistral Large 在這種情況下會有幫助?

    由於 Mistral Large 具備先進的推理和函式呼叫功能,因此非常適合這項任務。以下是它的幫助方式:

    +
      +
    • 進階推理:Mistral Large 可以處理複雜的推理任務,使其成為協調多個代理和服務的理想選擇。它可以理解不同資訊之間的關係,並做出明智的決策。

    • +
    • 函式呼叫功能:Mistral Large 具備先進的函式呼叫功能,對於協調不同代理的動作至關重要。這可讓各種服務進行無縫整合與協調。

    • +
    • 專業知識:Mistral Large 專為高度專業化的任務所設計,因此非常適合處理需要深厚領域知識的複雜查詢。

    • +
    +

    基於所有這些原因,我決定在這裡使用 Mistral Large 而非 Mistral Nemo 會比較適合。

    +
    from llama_agents import (
    +    AgentService,
    +    ToolService,
    +    LocalLauncher,
    +    MetaServiceTool,
    +    ControlPlaneServer,
    +    SimpleMessageQueue,
    +    AgentOrchestrator,
    +)
    +
    +from llama_index.core.agent import FunctionCallingAgentWorker
    +from llama_index.llms.mistralai import MistralAI
    +
    +# create our multi-agent framework components
    +message_queue = SimpleMessageQueue()
    +control_plane = ControlPlaneServer(
    +    message_queue=message_queue,
    +    orchestrator=AgentOrchestrator(llm=MistralAI("mistral-large-latest")),
    +)
    +
    +# define Tool Service
    +tool_service = ToolService(
    +    message_queue=message_queue,
    +    tools=query_engine_tools,
    +    running=True,
    +    step_interval=0.5,
    +)
    +
    +# define meta-tools here
    +meta_tools = [
    +    await MetaServiceTool.from_tool_service(
    +        t.metadata.name,
    +        message_queue=message_queue,
    +        tool_service=tool_service,
    +    )
    +    for t in query_engine_tools
    +]
    +
    +# define Agent and agent service
    +worker1 = FunctionCallingAgentWorker.from_tools(
    +    meta_tools, llm=MistralAI("mistral-large-latest")
    +)
    +
    +agent1 = worker1.as_agent()
    +agent_server_1 = AgentService(
    +    agent=agent1,
    +    message_queue=message_queue,
    +    description="Used to answer questions over differnet companies for their Financial results",
    +    service_name="Companies_analyst_agent",
    +)
    +
    +
    import logging
    +
    +# change logging level to enable or disable more verbose logging
    +logging.getLogger("llama_agents").setLevel(logging.INFO)
    +
    +
    ## Define Launcher
    +launcher = LocalLauncher(
    +    [agent_server_1, tool_service],
    +    control_plane,
    +    message_queue,
    +)
    +
    +
    query_str = "What are the risk factors for Uber?"
    +result = launcher.launch_single(query_str)
    +
    +
    INFO:llama_agents.message_queues.simple - Consumer AgentService-27cde4ed-5163-4005-90fc-13c158eda7e3: Companies_analyst_agent has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ToolService-b73c500a-5fbe-4f57-95c7-db74e173bd1b: default_tool_service has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer 62465ab8-32ff-436e-95fa-74e828745150: human has been registered.
    +INFO:llama_agents.message_queues.simple - Consumer ControlPlaneServer-f4c27d43-5474-43ca-93ca-a9aeed4534d7: control_plane has been registered.
    +INFO:llama_agents.services.agent - Companies_analyst_agent launch_local
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Launching message queue locally
    +INFO:llama_agents.services.agent - Processing initiated.
    +INFO:llama_agents.services.tool - Processing initiated.
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.simple - Consumer MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41: MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41 has been registered.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f4c270a4-bc47-4bbf-92fe-e2cc80757943 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.base - Publishing message to 'Companies_analyst_agent' with action 'ActionTypes.NEW_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.services.agent - Created new task: 0720da2f-1751-4766-a814-ba720bc8a467
    +INFO:llama_agents.message_queues.simple - Successfully published message 'Companies_analyst_agent' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'default_tool_service' with action 'ActionTypes.NEW_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'default_tool_service' to consumer.
    +INFO:llama_agents.services.tool - Processing tool call id f888f9a8-e716-4505-bfe2-577452e9b6e6 with company_docs
    +INFO:llama_agents.message_queues.base - Publishing message to 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' with action 'ActionTypes.COMPLETED_TOOL_CALL'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'MetaServiceTool-5671c175-7b03-4bc8-b60d-bd7101d0fc41' to consumer.
    +INFO:llama_agents.message_queues.base - Publishing message to 'control_plane' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.base - Publishing message to 'human' with action 'ActionTypes.COMPLETED_TASK'
    +INFO:llama_agents.message_queues.simple - Successfully published message 'control_plane' to consumer.
    +INFO:llama_agents.message_queues.simple - Successfully published message 'human' to consumer.
    +
    +
    print(result)
    +
    +
    [{"name": "finalize", "arguments": {"input": "Uber faces several risk factors, including general economic impacts such as pandemics or downturns, operational challenges like competition, market growth uncertainty, attracting and retaining drivers and riders, insurance adequacy, autonomous vehicle technology development, maintaining its reputation and brand, and managing growth. Additionally, reliance on third-party providers for various services can introduce further risks to its operations."}}]
    +
    +

    總結

    在這個筆記本中,你已經看到如何使用 llama-agents 來呼叫適當的工具來執行不同的動作。透過結合使用 Mistral Large 與 Mistral Nemo,我們展示了如何利用不同 LLM 的優勢,有效地協調智慧型、資源效率型系統。我們看到,Agent 可以挑選包含使用者所要求資料的集合。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.json b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.json new file mode 100644 index 000000000..ae46c1f24 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.json @@ -0,0 +1 @@ +{"codeList":["$ pip install dynamiq pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Importing necessary libraries for the workflow\nfrom io import BytesIO\nfrom dynamiq import Workflow\nfrom dynamiq.nodes import InputTransformer\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.converters import PyPDFConverter\nfrom dynamiq.nodes.splitters.document import DocumentSplitter\nfrom dynamiq.nodes.embedders import OpenAIDocumentEmbedder\nfrom dynamiq.nodes.writers import MilvusDocumentWriter\n\n# Initialize the workflow\nrag_wf = Workflow()\n","converter = PyPDFConverter(document_creation_mode=\"one-doc-per-page\")\nconverter_added = rag_wf.flow.add_nodes(\n converter\n) # Add node to the DAG (Directed Acyclic Graph)\n","document_splitter = DocumentSplitter(\n split_by=\"sentence\", # Splits documents into sentences\n split_length=10,\n split_overlap=1,\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[converter.id]}.output.documents\",\n },\n ),\n).depends_on(\n converter\n) # Set dependency on the PDF converter\nsplitter_added = rag_wf.flow.add_nodes(document_splitter) # Add to the DAG\n","embedder = OpenAIDocumentEmbedder(\n connection=OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"]),\n input_transformer=InputTransformer(\n selector={\n \"documents\": f\"${[document_splitter.id]}.output.documents\",\n },\n ),\n).depends_on(\n document_splitter\n) # Set dependency on the splitter\ndocument_embedder_added = rag_wf.flow.add_nodes(embedder) # Add to the DAG\n","vector_store = (\n MilvusDocumentWriter(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n create_if_not_exist=True,\n metric_type=\"COSINE\",\n )\n .inputs(documents=embedder.outputs.documents) # Connect to embedder output\n .depends_on(embedder) # Set dependency on the embedder\n)\nmilvus_writer_added = rag_wf.flow.add_nodes(vector_store) # Add to the DAG\n","file_paths = [\"./pdf_files/WhatisMilvus.pdf\"]\ninput_data = {\n \"files\": [BytesIO(open(path, \"rb\").read()) for path in file_paths],\n \"metadata\": [{\"filename\": path} for path in file_paths],\n}\n\n# Run the workflow with the prepared input data\ninserted_data = rag_wf.run(input_data=input_data)\n","from dynamiq import Workflow\nfrom dynamiq.connections import (\n OpenAI as OpenAIConnection,\n Milvus as MilvusConnection,\n MilvusDeploymentType,\n)\nfrom dynamiq.nodes.embedders import OpenAITextEmbedder\nfrom dynamiq.nodes.retrievers import MilvusDocumentRetriever\nfrom dynamiq.nodes.llms import OpenAI\nfrom dynamiq.prompts import Message, Prompt\n\n# Initialize the workflow\nretrieval_wf = Workflow()\n","# Establish OpenAI connection\nopenai_connection = OpenAIConnection(api_key=os.environ[\"OPENAI_API_KEY\"])\n\n# Define the text embedder node\nembedder = OpenAITextEmbedder(\n connection=openai_connection,\n model=\"text-embedding-3-small\",\n)\n\n# Add the embedder node to the workflow\nembedder_added = retrieval_wf.flow.add_nodes(embedder)\n","document_retriever = (\n MilvusDocumentRetriever(\n connection=MilvusConnection(\n deployment_type=MilvusDeploymentType.FILE, uri=\"./milvus.db\"\n ),\n index_name=\"my_milvus_collection\",\n dimension=1536,\n top_k=5,\n )\n .inputs(embedding=embedder.outputs.embedding) # Connect to embedder output\n .depends_on(embedder) # Dependency on the embedder node\n)\n\n# Add the retriever node to the workflow\nmilvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)\n","# Define the prompt template for the LLM\nprompt_template = \"\"\"\nPlease answer the question based on the provided context.\n\nQuestion: {{ query }}\n\nContext:\n{% for document in documents %}\n- {{ document.content }}\n{% endfor %}\n\"\"\"\n\n# Create the prompt object\nprompt = Prompt(messages=[Message(content=prompt_template, role=\"user\")])\n","answer_generator = (\n OpenAI(\n connection=openai_connection,\n model=\"gpt-4o\",\n prompt=prompt,\n )\n .inputs(\n documents=document_retriever.outputs.documents,\n query=embedder.outputs.query,\n )\n .depends_on(\n [document_retriever, embedder]\n ) # Dependencies on retriever and embedder\n)\n\n# Add the answer generator node to the workflow\nanswer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)\n","# Run the workflow with a sample query\nsample_query = \"What is the Advanced Search Algorithms in Milvus?\"\n\nresult = retrieval_wf.run(input_data={\"query\": sample_query})\n\nanswer = result.output.get(answer_generator.id).get(\"output\", {}).get(\"content\")\nprint(answer)\n"],"headingContent":"Getting Started with Dynamiq and Milvus","anchorList":[{"label":"開始使用 Dynamiq 和 Milvus","href":"Getting-Started-with-Dynamiq-and-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"RAG - 文件索引流程","href":"RAG---Document-Indexing-Flow","type":2,"isActive":false},{"label":"RAG 文件檢索流程","href":"RAG-Document-Retrieval-Flow","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.md b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.md new file mode 100644 index 000000000..5d3ff2b3f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_dynamiq.md @@ -0,0 +1,336 @@ +--- +id: milvus_rag_with_dynamiq.md +summary: >- + 在本教程中,我們將探討如何將 Dynamiq 與 Milvus 無縫搭配使用,Milvus 是專為 RAG 工作流程打造的高性能向量資料庫。Milvus + 擅長於向量嵌入的高效儲存、索引和擷取,使其成為需要快速精確存取上下文資料的 AI 系統不可或缺的元件。 +title: 開始使用 Dynamiq 和 Milvus +--- +

    +Open In Colab + + +GitHub Repository +

    +

    開始使用 Dynamiq 和 Milvus

    Dynamiq是強大的 Gen AI 框架,可簡化 AI 驅動應用程式的開發。Dynamiq 擁有對檢索增強生成 (RAG) 和大型語言模型 (LLM) 代理的強大支援,可讓開發人員輕鬆高效地創建智慧型動態系統。

    +

    在本教程中,我們將探討如何將 Dynamiq 與Milvus 無縫搭配使用,Milvus 是專為 RAG 工作流程打造的高性能向量資料庫。Milvus 擅長於向量嵌入的高效儲存、索引和檢索,使其成為需要快速精確存取上下文資料的人工智能系統不可或缺的元件。

    +

    本分步指南將涵蓋兩個核心 RAG 工作流程:

    +
      +
    • 文件索引流程:學習如何處理輸入文件(例如 PDF),將其內容轉換為向量嵌入,並儲存到 Milvus 中。利用 Milvus 的高效能索引功能,可確保您的資料可供快速檢索。

    • +
    • 文件檢索流程:探索如何查詢 Milvus 的相關文件嵌入,並使用它們與 Dynamiq 的 LLM 代理一起產生有洞察力、上下文感知的回應,創造無縫 AI 驅動的使用者體驗。

    • +
    +

    本教學結束時,您將充分瞭解 Milvus 與 Dynamiq 如何協同合作,建立符合您需求的可擴充、情境感知 AI 系統。

    +

    準備工作

    下載所需的函式庫

    $ pip install dynamiq pymilvus
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(按一下螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    設定 LLM 代理程式

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    RAG - 文件索引流程

    本教學示範使用 Milvus 作為向量資料庫,以 Retrieval-Augmented Generation (RAG) 工作流程建立文件索引。此工作流程會擷取輸入的 PDF 檔案,將其處理為較小的區塊,使用 OpenAI 的嵌入模型產生向量嵌入,並將嵌入儲存於 Milvus 資料集中,以便進行有效的檢索。

    +

    在此工作流程結束時,您將擁有一個可擴充的高效率文件索引系統,可支援未來的 RAG 任務,例如語意搜尋和問題回答。

    +

    匯入所需的程式庫並初始化工作流程

    # Importing necessary libraries for the workflow
    +from io import BytesIO
    +from dynamiq import Workflow
    +from dynamiq.nodes import InputTransformer
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.converters import PyPDFConverter
    +from dynamiq.nodes.splitters.document import DocumentSplitter
    +from dynamiq.nodes.embedders import OpenAIDocumentEmbedder
    +from dynamiq.nodes.writers import MilvusDocumentWriter
    +
    +# Initialize the workflow
    +rag_wf = Workflow()
    +
    +

    定義 PDF 轉換器節點

    converter = PyPDFConverter(document_creation_mode="one-doc-per-page")
    +converter_added = rag_wf.flow.add_nodes(
    +    converter
    +)  # Add node to the DAG (Directed Acyclic Graph)
    +
    +

    定義文件分割節點

    document_splitter = DocumentSplitter(
    +    split_by="sentence",  # Splits documents into sentences
    +    split_length=10,
    +    split_overlap=1,
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[converter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    converter
    +)  # Set dependency on the PDF converter
    +splitter_added = rag_wf.flow.add_nodes(document_splitter)  # Add to the DAG
    +
    +

    定義嵌入節點

    embedder = OpenAIDocumentEmbedder(
    +    connection=OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"]),
    +    input_transformer=InputTransformer(
    +        selector={
    +            "documents": f"${[document_splitter.id]}.output.documents",
    +        },
    +    ),
    +).depends_on(
    +    document_splitter
    +)  # Set dependency on the splitter
    +document_embedder_added = rag_wf.flow.add_nodes(embedder)  # Add to the DAG
    +
    +

    定義 Milvus 向量儲存節點

    vector_store = (
    +    MilvusDocumentWriter(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        create_if_not_exist=True,
    +        metric_type="COSINE",
    +    )
    +    .inputs(documents=embedder.outputs.documents)  # Connect to embedder output
    +    .depends_on(embedder)  # Set dependency on the embedder
    +)
    +milvus_writer_added = rag_wf.flow.add_nodes(vector_store)  # Add to the DAG
    +
    +
    2024-11-19 22:14:03 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:03 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:04 - DEBUG - Created new connection using: 0bef2849fdb1458a85df8bb9dd27f51d
    +2024-11-19 22:14:04 - INFO - Collection my_milvus_collection does not exist. Creating a new collection.
    +2024-11-19 22:14:04 - DEBUG - Successfully created collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +2024-11-19 22:14:05 - DEBUG - Successfully created an index on collection: my_milvus_collection
    +
    +
    +

    Milvus 提供兩種部署類型,滿足不同的使用情況:

    +
      +
    1. MilvusDeploymentType.FILE
    2. +
    +
      +
    • 本地原型小規模資料儲存的理想選擇。
    • +
    • uri 設定為本機檔案路徑 (例如./milvus.db) 以利用Milvus Lite,它會自動將所有資料儲存到指定的檔案中。
    • +
    • 這是快速設定實驗的方便選項。
    • +
    +
      +
    1. MilvusDeploymentType.HOST
    2. +
    +
      +
    • 專為大規模資料情境所設計,例如管理超過一百萬個向量。

      +

      自託管伺服器

      +
        +
      • 使用Docker 或 Kubernetes 部署高效能的 Milvus 伺服器。
      • +
      • 設定伺服器的位址和連接埠為uri (例如http://localhost:19530)。
      • +
      • 如果啟用了驗證:
      • +
      • 提供<your_username>:<your_password> 作為token
      • +
      • 如果停用驗證:
      • +
      • 不設定token
      • +
      +

      Zilliz 雲端 (管理服務)

      +
    • +
    +
    +

    定義輸入資料並執行工作流程

    file_paths = ["./pdf_files/WhatisMilvus.pdf"]
    +input_data = {
    +    "files": [BytesIO(open(path, "rb").read()) for path in file_paths],
    +    "metadata": [{"filename": path} for path in file_paths],
    +}
    +
    +# Run the workflow with the prepared input data
    +inserted_data = rag_wf.run(input_data=input_data)
    +
    +
    /var/folders/09/d0hx80nj35sb5hxb5cpc1q180000gn/T/ipykernel_31319/3145804345.py:4: ResourceWarning: unclosed file <_io.BufferedReader name='./pdf_files/WhatisMilvus.pdf'>
    +  BytesIO(open(path, "rb").read()) for path in file_paths
    +ResourceWarning: Enable tracemalloc to get the object allocation traceback
    +2024-11-19 22:14:09 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution started.
    +2024-11-19 22:14:09 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution started.
    +2024-11-19 22:14:09 - INFO - Node PyPDF File Converter - 6eb42b1f-7637-407b-a3ac-4167bcf3b5c4: execution succeeded in 58ms.
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution started.
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/websockets/legacy/__init__.py:6: DeprecationWarning: websockets.legacy is deprecated; see https://websockets.readthedocs.io/en/stable/howto/upgrade.html for upgrade instructions
    +  warnings.warn(  # deprecated in 14.0 - 2024-11-09
    +/Users/jinhonglin/anaconda3/envs/myenv/lib/python3.11/site-packages/pydantic/fields.py:804: PydanticDeprecatedSince20: Using extra keyword arguments on `Field` is deprecated and will be removed. Use `json_schema_extra` instead. (Extra keys: 'is_accessible_to_agent'). Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.7/migration/
    +  warn(
    +2024-11-19 22:14:09 - INFO - Node DocumentSplitter - 5baed580-6de0-4dcd-bace-d7d947ab6c7f: execution succeeded in 104ms.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution started.
    +2024-11-19 22:14:09 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - d30a4cdc-0fab-4aff-b2e5-6161a62cb6fd: execution succeeded in 724ms.
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution started.
    +2024-11-19 22:14:10 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:10 - INFO - Node MilvusDocumentWriter - dddab4cc-1dae-4e7e-9101-1ec353f530da: execution succeeded in 66ms.
    +2024-11-19 22:14:10 - INFO - Node OpenAIDocumentEmbedder - 91928f67-a00f-48f6-a864-f6e21672ec7e: execution succeeded in 961ms.
    +2024-11-19 22:14:10 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 1.3s.
    +2024-11-19 22:14:10 - INFO - Workflow 87878444-6a3d-43f3-ae32-0127564a959f: execution succeeded in 1.3s.
    +
    +

    透過這個工作流程,我們成功地使用 Milvus 作為向量資料庫,並使用 OpenAI 的 embedding model 作為語意表示,來執行文件索引管道。此設定可實現快速且精確的向量式檢索,為語意搜尋、文件檢索和情境式 AI 驅動互動等 RAG 工作流程奠定基礎。

    +

    透過 Milvus 的可擴充儲存功能和 Dynamiq 的協調功能,此解決方案已準備好進行原型和大規模生產部署。您現在可以擴充此管道,以包含其他任務,例如以檢索為基礎的問題回答或 AI 驅動的內容產生。

    +

    RAG 文件檢索流程

    在本教程中,我們將實作一個「Retrieval-Augmented Generation (RAG)」文件擷取工作流程。此工作流程會接收使用者的查詢,為其產生向量嵌入,從 Milvus 向量資料庫中擷取最相關的文件,並使用大型語言模型 (LLM) 根據擷取的文件產生詳細且上下文感知的答案。

    +

    透過遵循此工作流程,您將可建立語意搜尋與問題回答的端對端解決方案,結合向量式文件擷取的強大功能與 OpenAI 先進 LLM 的能力。此方法可利用您文件資料庫中儲存的知識,對使用者的查詢做出有效率且智慧型的回應。

    +

    匯入所需的程式庫並初始化工作流程

    from dynamiq import Workflow
    +from dynamiq.connections import (
    +    OpenAI as OpenAIConnection,
    +    Milvus as MilvusConnection,
    +    MilvusDeploymentType,
    +)
    +from dynamiq.nodes.embedders import OpenAITextEmbedder
    +from dynamiq.nodes.retrievers import MilvusDocumentRetriever
    +from dynamiq.nodes.llms import OpenAI
    +from dynamiq.prompts import Message, Prompt
    +
    +# Initialize the workflow
    +retrieval_wf = Workflow()
    +
    +

    定義 OpenAI 連線和文字嵌入器

    # Establish OpenAI connection
    +openai_connection = OpenAIConnection(api_key=os.environ["OPENAI_API_KEY"])
    +
    +# Define the text embedder node
    +embedder = OpenAITextEmbedder(
    +    connection=openai_connection,
    +    model="text-embedding-3-small",
    +)
    +
    +# Add the embedder node to the workflow
    +embedder_added = retrieval_wf.flow.add_nodes(embedder)
    +
    +

    定義 Milvus 文件擷取程式

    document_retriever = (
    +    MilvusDocumentRetriever(
    +        connection=MilvusConnection(
    +            deployment_type=MilvusDeploymentType.FILE, uri="./milvus.db"
    +        ),
    +        index_name="my_milvus_collection",
    +        dimension=1536,
    +        top_k=5,
    +    )
    +    .inputs(embedding=embedder.outputs.embedding)  # Connect to embedder output
    +    .depends_on(embedder)  # Dependency on the embedder node
    +)
    +
    +# Add the retriever node to the workflow
    +milvus_retriever_added = retrieval_wf.flow.add_nodes(document_retriever)
    +
    +
    2024-11-19 22:14:19 - WARNING - Environment variable 'MILVUS_API_TOKEN' not found
    +2024-11-19 22:14:19 - INFO - Pass in the local path ./milvus.db, and run it using milvus-lite
    +2024-11-19 22:14:19 - DEBUG - Created new connection using: 98d1132773af4298a894ad5925845fd2
    +2024-11-19 22:14:19 - INFO - Collection my_milvus_collection already exists. Skipping creation.
    +
    +

    定義提示範本

    # Define the prompt template for the LLM
    +prompt_template = """
    +Please answer the question based on the provided context.
    +
    +Question: {{ query }}
    +
    +Context:
    +{% for document in documents %}
    +- {{ document.content }}
    +{% endfor %}
    +"""
    +
    +# Create the prompt object
    +prompt = Prompt(messages=[Message(content=prompt_template, role="user")])
    +
    +

    定義答案產生器

    answer_generator = (
    +    OpenAI(
    +        connection=openai_connection,
    +        model="gpt-4o",
    +        prompt=prompt,
    +    )
    +    .inputs(
    +        documents=document_retriever.outputs.documents,
    +        query=embedder.outputs.query,
    +    )
    +    .depends_on(
    +        [document_retriever, embedder]
    +    )  # Dependencies on retriever and embedder
    +)
    +
    +# Add the answer generator node to the workflow
    +answer_generator_added = retrieval_wf.flow.add_nodes(answer_generator)
    +
    +

    執行工作流程

    # Run the workflow with a sample query
    +sample_query = "What is the Advanced Search Algorithms in Milvus?"
    +
    +result = retrieval_wf.run(input_data={"query": sample_query})
    +
    +answer = result.output.get(answer_generator.id).get("output", {}).get("content")
    +print(answer)
    +
    +
    2024-11-19 22:14:22 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution started.
    +2024-11-19 22:14:22 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution started.
    +2024-11-19 22:14:22 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution started.
    +2024-11-19 22:14:23 - INFO - HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +2024-11-19 22:14:23 - INFO - Node OpenAITextEmbedder - 47afb0bc-cf96-429d-b58f-11b6c935fec3: execution succeeded in 474ms.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution started.
    +2024-11-19 22:14:23 - INFO - Node MilvusDocumentRetriever - 51c8311b-4837-411f-ba42-21e28239a2ee: execution succeeded in 23ms.
    +2024-11-19 22:14:23 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution started.
    +2024-11-19 22:14:24 - INFO - HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +2024-11-19 22:14:24 - INFO - Node LLM - ac722325-bece-453f-a2ed-135b0749ee7a: execution succeeded in 1.8s.
    +2024-11-19 22:14:25 - INFO - Flow b30b48ec-d5d2-4e4c-8e25-d6976c8a9c17: execution succeeded in 2.4s.
    +2024-11-19 22:14:25 - INFO - Workflow f4a073fb-dfb6-499c-8cac-5710a7ad6d47: execution succeeded in 2.4s.
    +
    +
    +The advanced search algorithms in Milvus include a variety of in-memory and on-disk indexing/search algorithms such as IVF (Inverted File), HNSW (Hierarchical Navigable Small World), and DiskANN. These algorithms have been deeply optimized to enhance performance, delivering 30%-70% better performance compared to popular implementations like FAISS and HNSWLib. These optimizations are part of Milvus's design to ensure high efficiency and scalability in handling vector data.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.json b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.json new file mode 100644 index 000000000..593c8bb2c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.json @@ -0,0 +1 @@ +{"codeList":["from langchain.document_loaders import DirectoryLoader\n# Load HTML files already saved in a local directory\npath = \"../../RAG/rtdocs_new/\"\nglobal_pattern = '*.html'\nloader = DirectoryLoader(path=path, glob=global_pattern)\ndocs = loader.load()\n\n\n# Print num documents and a preview.\nprint(f\"loaded {len(docs)} documents\")\nprint(docs[0].page_content)\npprint.pprint(docs[0].metadata)\n","loaded 22 documents\nWhy Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...\n{'source': 'https://milvus.io/docs/quickstart.md'}\n","import torch\nfrom sentence_transformers import SentenceTransformer\n\n\n# Initialize torch settings for device-agnostic code.\nN_GPU = torch.cuda.device_count()\nDEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')\n\n\n# Download the model from huggingface model hub.\nmodel_name = \"BAAI/bge-large-en-v1.5\"\nencoder = SentenceTransformer(model_name, device=DEVICE)\n\n\n# Get the model parameters and save for later.\nEMBEDDING_DIM = encoder.get_sentence_embedding_dimension()\nMAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()\n\n\n# Inspect model parameters.\nprint(f\"model_name: {model_name}\")\nprint(f\"EMBEDDING_DIM: {EMBEDDING_DIM}\")\nprint(f\"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}\")\n","model_name: BAAI/bge-large-en-v1.5\nEMBEDDING_DIM: 1024\nMAX_SEQ_LENGTH: 512\n","from langchain.text_splitter import RecursiveCharacterTextSplitter\n\n\nCHUNK_SIZE = 512\nchunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)\nprint(f\"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}\")\n\n\n# Define the splitter.\nchild_splitter = RecursiveCharacterTextSplitter(\n chunk_size=CHUNK_SIZE,\n chunk_overlap=chunk_overlap)\n\n\n# Chunk the docs.\nchunks = child_splitter.split_documents(docs)\nprint(f\"{len(docs)} docs split into {len(chunks)} child documents.\")\n\n\n# Encoder input is doc.page_content as strings.\nlist_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]\n\n\n# Embedding inference using HuggingFace encoder.\nembeddings = torch.tensor(encoder.encode(list_of_strings))\n\n\n# Normalize the embeddings.\nembeddings = np.array(embeddings / np.linalg.norm(embeddings))\n\n\n# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.\nconverted_values = list(map(np.float32, embeddings))\n\n\n# Create dict_list for Milvus insertion.\ndict_list = []\nfor chunk, vector in zip(chunks, converted_values):\n # Assemble embedding vector, original text chunk, metadata.\n chunk_dict = {\n 'chunk': chunk.page_content,\n 'source': chunk.metadata.get('source', \"\"),\n 'vector': vector,\n }\n dict_list.append(chunk_dict)\n","chunk_size: 512, chunk_overlap: 51.0\n22 docs split into 355 child documents.\n","# Connect a client to the Milvus Lite server.\nfrom pymilvus import MilvusClient\nmc = MilvusClient(\"milvus_demo.db\")\n\n\n# Create a collection with flexible schema and AUTOINDEX.\nCOLLECTION_NAME = \"MilvusDocs\"\nmc.create_collection(COLLECTION_NAME,\n EMBEDDING_DIM,\n consistency_level=\"Eventually\",\n auto_id=True, \n overwrite=True)\n\n\n# Insert data into the Milvus collection.\nprint(\"Start inserting entities\")\nstart_time = time.time()\nmc.insert(\n COLLECTION_NAME,\n data=dict_list,\n progress_bar=True)\n\n\nend_time = time.time()\nprint(f\"Milvus insert time for {len(dict_list)} vectors: \", end=\"\")\nprint(f\"{round(end_time - start_time, 2)} seconds\")\n","Start inserting entities\nMilvus insert time for 355 vectors: 0.2 seconds\n","SAMPLE_QUESTION = \"What do the parameters for HNSW mean?\"\n\n\n# Embed the question using the same encoder.\nquery_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))\n# Normalize embeddings to unit length.\nquery_embeddings = F.normalize(query_embeddings, p=2, dim=1)\n# Convert the embeddings to list of list of np.float32.\nquery_embeddings = list(map(np.float32, query_embeddings))\n\n\n# Define metadata fields you can filter on.\nOUTPUT_FIELDS = list(dict_list[0].keys())\nOUTPUT_FIELDS.remove('vector')\n\n\n# Define how many top-k results you want to retrieve.\nTOP_K = 2\n\n\n# Run semantic vector search using your query and the vector database.\nresults = mc.search(\n COLLECTION_NAME,\n data=query_embeddings,\n output_fields=OUTPUT_FIELDS,\n limit=TOP_K,\n consistency_level=\"Eventually\")\n","Retrieved result #1\ndistance = 0.7001987099647522\n('Chunk text: layer, finds the node closest to the target in this layer, and'\n...\n'outgoing')\nsource: https://milvus.io/docs/index.md\n\nRetrieved result #2\ndistance = 0.6953287124633789\n('Chunk text: this value can improve recall rate at the cost of increased'\n...\n'to the target')\nsource: https://milvus.io/docs/index.md\n","# (Recommended) Create a new conda environment.\nconda create -n myenv python=3.11 -y\nconda activate myenv\n\n\n# Install vLLM with CUDA 12.1.\npip install -U vllm transformers torch\n\n\nimport vllm, torch\nfrom vllm import LLM, SamplingParams\n\n\n# Clear the GPU memory cache.\ntorch.cuda.empty_cache()\n\n\n# Check the GPU.\n!nvidia-smi\n","# Login to HuggingFace using your new token.\nfrom huggingface_hub import login\nfrom google.colab import userdata\nhf_token = userdata.get('HF_TOKEN')\nlogin(token = hf_token, add_to_git_credential=True)\n","# 1. Choose a model\nMODELTORUN = \"meta-llama/Meta-Llama-3.1-8B-Instruct\"\n\n\n# 2. Clear the GPU memory cache, you're going to need it all!\ntorch.cuda.empty_cache()\n\n\n# 3. Instantiate a vLLM model instance.\nllm = LLM(model=MODELTORUN,\n enforce_eager=True,\n dtype=torch.bfloat16,\n gpu_memory_utilization=0.5,\n max_model_len=1000,\n seed=415,\n max_num_batched_tokens=3000)\n","# Separate all the context together by space.\ncontexts_combined = ' '.join(contexts)\n# Lance Martin, LangChain, says put the best contexts at the end.\ncontexts_combined = ' '.join(reversed(contexts))\n\n\n# Separate all the unique sources together by comma.\nsource_combined = ' '.join(reversed(list(dict.fromkeys(sources))))\n\n\nSYSTEM_PROMPT = f\"\"\"First, check if the provided Context is relevant to\nthe user's question. Second, only if the provided Context is strongly relevant, answer the question using the Context. Otherwise, if the Context is not strongly relevant, answer the question without using the Context. \nBe clear, concise, relevant. Answer clearly, in fewer than 2 sentences.\nGrounding sources: {source_combined}\nContext: {contexts_combined}\nUser's question: {SAMPLE_QUESTION}\n\"\"\"\n\n\nprompts = [SYSTEM_PROMPT]\n","# Sampling parameters\nsampling_params = SamplingParams(temperature=0.2, top_p=0.95)\n\n\n# Invoke the vLLM model.\noutputs = llm.generate(prompts, sampling_params)\n\n\n# Print the outputs.\nfor output in outputs:\n prompt = output.prompt\n generated_text = output.outputs[0].text\n # !r calls repr(), which prints a string inside quotes.\n print()\n print(f\"Question: {SAMPLE_QUESTION!r}\")\n pprint.pprint(f\"Generated text: {generated_text!r}\")\n","Question: 'What do the parameters for HNSW MEAN!?'\nGenerated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '\n'* M: The maximum degree of nodes on each layer oof the graph, which can improve '\n'recall rate at the cost of increased search time. * efConstruction and ef: ' \n'These parameters specify a search range when building or searching an index.'\n"],"headingContent":"Building RAG with Milvus, vLLM, and Llama 3.1","anchorList":[{"label":"使用 Milvus、vLLM 和 Llama 3.1 建立 RAG","href":"Building-RAG-with-Milvus-vLLM-and-Llama-31","type":1,"isActive":false},{"label":"Milvus、vLLM 和 Meta's Llama 3.1 簡介","href":"Introduction-to-Milvus-vLLM-and-Meta’s-Llama-31","type":2,"isActive":false},{"label":"使用 Milvus 建立並執行 RAG-Retrieval","href":"Build-and-Perform-the-RAG-Retrieval-with-Milvus","type":2,"isActive":false},{"label":"使用 vLLM 和 Llama 3.1-8B 建立並執行 RAG-Generation","href":"Build-and-Perform-the-RAG-Generation-with-vLLM-and-Llama-31-8B","type":2,"isActive":false},{"label":"參考資料","href":"References","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.md b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.md new file mode 100644 index 000000000..b72fcd6a7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/milvus_rag_with_vllm.md @@ -0,0 +1,383 @@ +--- +id: milvus_rag_with_vllm.md +summary: >- + 這篇部落格將會告訴您如何使用 Milvus、vLLM 和 Llama 3.1 建立並執行一個 RAG。更具體來說,我會告訴您如何在 Milvus + 中將文字資訊嵌入並儲存為向量嵌入,並將此向量儲存作為知識庫,以有效率地擷取與使用者問題相關的文字區塊。 +title: 使用 Milvus、vLLM 和 Llama 3.1 建立 RAG +--- +

    使用 Milvus、vLLM 和 Llama 3.1 建立 RAG

    加州大學柏克萊分校於 2024 年 7 月捐贈vLLMLF AI & Data Foundation作為孵化階段專案。身為其他成員專案,我們歡迎 vLLM 加入 LF AI & Data 大家庭!🎉

    +

    大型語言模型(LLM) 與向量資料庫通常會搭配來建構 Retrieval Augmented Generation(RAG),這是一種常用的 AI 應用架構,可以解決AI 幻覺的問題。這篇部落格將會告訴您如何使用 Milvus、vLLM 和 Llama 3.1 來建立並執行 RAG。更具體來說,我會告訴您如何在 Milvus 中將文字資訊嵌入並儲存為向量嵌入,並使用此向量儲存作為知識庫,以有效率地擷取與使用者問題相關的文字塊。最後,我們會利用 vLLM 為 Meta 的 Llama 3.1-8B 模型提供服務,以產生由擷取的文字所增強的答案。讓我們深入瞭解!

    +

    Milvus、vLLM 和 Meta's Llama 3.1 簡介

    Milvus 向量資料庫

    Milvus是一個開放原始碼、專門為 生成式人工智能(GenAI) 工作負載而設計的分散式向量資料庫,用於儲存、索引和搜尋向量。它能夠執行混合搜尋、 元資料過濾、重新排列,並有效率地處理數以萬億計的向量,讓 Milvus 成為 AI 與機器學習工作負載的首選。Milvus可在本機、集群上執行,或託管於全面管理的Zilliz Cloud

    +

    vLLM

    vLLM是 UC Berkeley SkyLab 開發的開放原始碼專案,專注於優化 LLM 服務效能。它使用 PagedAttention、連續批次和最佳化的 CUDA 核心進行有效的記憶體管理。與傳統方法相比,vLLM 可將服務效能提升 24 倍,同時將 GPU 記憶體使用量減少一半。

    +

    根據「Efficient Memory Management for Large Language Model Serving with PagedAttention」這篇論文,KV 快取記憶體使用了約 30% 的 GPU 記憶體,導致潛在的記憶體問題。KV 快取儲存在連續的記憶體中,但改變大小會造成記憶體碎片,對於計算而言效率不高。

    +

    + + + + +

    +

    圖 1.現有系統中的 KV 快取記憶體管理 (2023 分頁注意事項論文)

    +

    透過為 KV 快取記憶體使用虛擬記憶體,vLLM 只會在需要時分配實體 GPU 記憶體,消除記憶體碎片並避免預先分配。在測試中,vLLM 的表現優於HuggingFace Transformers(HF) 和Text Generation Inference(TGI),在 NVIDIA A10G 和 A100 GPU 上,vLLM 的吞吐量比 HF 高出 24 倍,比 TGI 高出 3.5 倍。

    +

    + + + + +

    +

    圖 2.vLLM 的吞吐量比 HF 高出 8.5 倍至 15 倍,比 TGI 高出 3.3 倍至 3.5 倍 (2023vLLM 博客)。

    +

    Meta's Llama 3.1

    Meta's Llama 3.1於 2024 年 7 月 23 日發表。405B 模型在多個公開基準上提供最先進的效能,並擁有 128,000 個輸入代幣的上下文視窗,允許各種商業用途。除了 4050 億參數模型之外,Meta 還發布了 Llama3 70B (700 億參數) 和 8B (80 億參數) 的更新版本。模型權重可在 Meta 網站上下載。

    +

    一個重要的啟示是,微調產生的資料可以提升效能,但品質不佳的範例則會降低效能。Llama 團隊使用模型本身、輔助模型和其他工具,廣泛地識別和移除這些不良範例。

    +

    使用 Milvus 建立並執行 RAG-Retrieval

    準備您的資料集。

    我使用官方的Milvus 文件作為本範例的資料集,我下載並儲存在本機。

    +
    from langchain.document_loaders import DirectoryLoader
    +# Load HTML files already saved in a local directory
    +path = "../../RAG/rtdocs_new/"
    +global_pattern = '*.html'
    +loader = DirectoryLoader(path=path, glob=global_pattern)
    +docs = loader.load()
    +
    +
    +# Print num documents and a preview.
    +print(f"loaded {len(docs)} documents")
    +print(docs[0].page_content)
    +pprint.pprint(docs[0].metadata)
    +
    +
    loaded 22 documents
    +Why Milvus Docs Tutorials Tools Blog Community Stars0 Try Managed Milvus FREE Search Home v2.4.x About ...
    +{'source': 'https://milvus.io/docs/quickstart.md'}
    +
    +

    下載嵌入模型。

    接下來,從 HuggingFace 下載免費的開放原始碼嵌入模型

    +
    import torch
    +from sentence_transformers import SentenceTransformer
    +
    +
    +# Initialize torch settings for device-agnostic code.
    +N_GPU = torch.cuda.device_count()
    +DEVICE = torch.device('cuda:N_GPU' if torch.cuda.is_available() else 'cpu')
    +
    +
    +# Download the model from huggingface model hub.
    +model_name = "BAAI/bge-large-en-v1.5"
    +encoder = SentenceTransformer(model_name, device=DEVICE)
    +
    +
    +# Get the model parameters and save for later.
    +EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
    +MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
    +
    +
    +# Inspect model parameters.
    +print(f"model_name: {model_name}")
    +print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
    +print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
    +
    +
    model_name: BAAI/bge-large-en-v1.5
    +EMBEDDING_DIM: 1024
    +MAX_SEQ_LENGTH: 512
    +
    +

    將您自訂的資料分塊並編碼為向量。

    我會使用固定長度的 512 個字元,並有 10% 的重疊。

    +
    from langchain.text_splitter import RecursiveCharacterTextSplitter
    +
    +
    +CHUNK_SIZE = 512
    +chunk_overlap = np.round(CHUNK_SIZE * 0.10, 0)
    +print(f"chunk_size: {CHUNK_SIZE}, chunk_overlap: {chunk_overlap}")
    +
    +
    +# Define the splitter.
    +child_splitter = RecursiveCharacterTextSplitter(
    +   chunk_size=CHUNK_SIZE,
    +   chunk_overlap=chunk_overlap)
    +
    +
    +# Chunk the docs.
    +chunks = child_splitter.split_documents(docs)
    +print(f"{len(docs)} docs split into {len(chunks)} child documents.")
    +
    +
    +# Encoder input is doc.page_content as strings.
    +list_of_strings = [doc.page_content for doc in chunks if hasattr(doc, 'page_content')]
    +
    +
    +# Embedding inference using HuggingFace encoder.
    +embeddings = torch.tensor(encoder.encode(list_of_strings))
    +
    +
    +# Normalize the embeddings.
    +embeddings = np.array(embeddings / np.linalg.norm(embeddings))
    +
    +
    +# Milvus expects a list of `numpy.ndarray` of `numpy.float32` numbers.
    +converted_values = list(map(np.float32, embeddings))
    +
    +
    +# Create dict_list for Milvus insertion.
    +dict_list = []
    +for chunk, vector in zip(chunks, converted_values):
    +   # Assemble embedding vector, original text chunk, metadata.
    +   chunk_dict = {
    +       'chunk': chunk.page_content,
    +       'source': chunk.metadata.get('source', ""),
    +       'vector': vector,
    +   }
    +   dict_list.append(chunk_dict)
    +
    +
    chunk_size: 512, chunk_overlap: 51.0
    +22 docs split into 355 child documents.
    +
    +

    在 Milvus 中儲存向量。

    將編碼好的向量嵌入到 Milvus 向量資料庫中。

    +
    # Connect a client to the Milvus Lite server.
    +from pymilvus import MilvusClient
    +mc = MilvusClient("milvus_demo.db")
    +
    +
    +# Create a collection with flexible schema and AUTOINDEX.
    +COLLECTION_NAME = "MilvusDocs"
    +mc.create_collection(COLLECTION_NAME,
    +       EMBEDDING_DIM,
    +       consistency_level="Eventually",
    +       auto_id=True, 
    +       overwrite=True)
    +
    +
    +# Insert data into the Milvus collection.
    +print("Start inserting entities")
    +start_time = time.time()
    +mc.insert(
    +   COLLECTION_NAME,
    +   data=dict_list,
    +   progress_bar=True)
    +
    +
    +end_time = time.time()
    +print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
    +print(f"{round(end_time - start_time, 2)} seconds")
    +
    +
    Start inserting entities
    +Milvus insert time for 355 vectors: 0.2 seconds
    +
    +

    提出問題,並從 Milvus 的知識庫中搜尋最近鄰的資料塊。

    +
    SAMPLE_QUESTION = "What do the parameters for HNSW mean?"
    +
    +
    +# Embed the question using the same encoder.
    +query_embeddings = torch.tensor(encoder.encode(SAMPLE_QUESTION))
    +# Normalize embeddings to unit length.
    +query_embeddings = F.normalize(query_embeddings, p=2, dim=1)
    +# Convert the embeddings to list of list of np.float32.
    +query_embeddings = list(map(np.float32, query_embeddings))
    +
    +
    +# Define metadata fields you can filter on.
    +OUTPUT_FIELDS = list(dict_list[0].keys())
    +OUTPUT_FIELDS.remove('vector')
    +
    +
    +# Define how many top-k results you want to retrieve.
    +TOP_K = 2
    +
    +
    +# Run semantic vector search using your query and the vector database.
    +results = mc.search(
    +    COLLECTION_NAME,
    +    data=query_embeddings,
    +    output_fields=OUTPUT_FIELDS,
    +    limit=TOP_K,
    +    consistency_level="Eventually")
    +
    +

    檢索結果如下所示。

    +
    Retrieved result #1
    +distance = 0.7001987099647522
    +('Chunk text: layer, finds the node closest to the target in this layer, and'
    +...
    +'outgoing')
    +source: https://milvus.io/docs/index.md
    +
    +Retrieved result #2
    +distance = 0.6953287124633789
    +('Chunk text: this value can improve recall rate at the cost of increased'
    +...
    +'to the target')
    +source: https://milvus.io/docs/index.md
    +
    +

    使用 vLLM 和 Llama 3.1-8B 建立並執行 RAG-Generation

    從 HuggingFace 安裝 vLLM 和模型

    vLLM 預設會從 HuggingFace 下載大型語言模型。一般而言,無論何時您想要在 HuggingFace 上使用全新的模型,都應該執行 pip install --upgrade 或 -U。此外,您需要 GPU 才能使用 vLLM 執行 Meta's Llama 3.1 模型的推論。

    +

    如需所有 vLLM 支援模型的完整清單,請參閱此文件頁面

    +
    # (Recommended) Create a new conda environment.
    +conda create -n myenv python=3.11 -y
    +conda activate myenv
    +
    +
    +# Install vLLM with CUDA 12.1.
    +pip install -U vllm transformers torch
    +
    +
    +import vllm, torch
    +from vllm import LLM, SamplingParams
    +
    +
    +# Clear the GPU memory cache.
    +torch.cuda.empty_cache()
    +
    +
    +# Check the GPU.
    +!nvidia-smi
    +
    +

    若要進一步瞭解如何安裝 vLLM,請參閱其安裝頁面。

    +

    取得 HuggingFace 令牌。

    HuggingFace 上的某些模型,例如 Meta Llama 3.1,要求使用者在能夠下載權重之前接受其授權。因此,您必須建立 HuggingFace 帳戶,接受模型的授權,並產生一個代用幣。

    +

    造訪 HuggingFace 上這個Llama3.1 頁面時,您會收到要求您同意條款的訊息。在下載模型權重之前,按一下「接受授權」以接受 Meta 條款。批准通常需要不到一天的時間。

    +

    收到批准後,您必須產生一個新的 HuggingFace 令牌。您的舊權限將無法使用新的權限。

    +

    在安裝 vLLM 之前,請使用新的 token 登入 HuggingFace。以下,我使用 Colab secrets 來儲存代用幣。

    +
    # Login to HuggingFace using your new token.
    +from huggingface_hub import login
    +from google.colab import userdata
    +hf_token = userdata.get('HF_TOKEN')
    +login(token = hf_token, add_to_git_credential=True)
    +
    +

    執行 RAG-Generation

    在示範中,我們執行Llama-3.1-8B 模型,這需要 GPU 和相當大的記憶體才能啟動。以下範例是在 Google Colab Pro ($10/month) 搭配 A100 GPU 上執行。若要進一步瞭解如何執行 vLLM,您可以查看Quickstart 文件

    +
    # 1. Choose a model
    +MODELTORUN = "meta-llama/Meta-Llama-3.1-8B-Instruct"
    +
    +
    +# 2. Clear the GPU memory cache, you're going to need it all!
    +torch.cuda.empty_cache()
    +
    +
    +# 3. Instantiate a vLLM model instance.
    +llm = LLM(model=MODELTORUN,
    +         enforce_eager=True,
    +         dtype=torch.bfloat16,
    +         gpu_memory_utilization=0.5,
    +         max_model_len=1000,
    +         seed=415,
    +         max_num_batched_tokens=3000)
    +
    +

    使用從 Milvus 擷取的上下文和來源撰寫提示。

    +
    # Separate all the context together by space.
    +contexts_combined = ' '.join(contexts)
    +# Lance Martin, LangChain, says put the best contexts at the end.
    +contexts_combined = ' '.join(reversed(contexts))
    +
    +
    +# Separate all the unique sources together by comma.
    +source_combined = ' '.join(reversed(list(dict.fromkeys(sources))))
    +
    +
    +SYSTEM_PROMPT = f"""First, check if the provided Context is relevant to
    +the user's question.  Second, only if the provided Context is strongly relevant, answer the question using the Context.  Otherwise, if the Context is not strongly relevant, answer the question without using the Context. 
    +Be clear, concise, relevant.  Answer clearly, in fewer than 2 sentences.
    +Grounding sources: {source_combined}
    +Context: {contexts_combined}
    +User's question: {SAMPLE_QUESTION}
    +"""
    +
    +
    +prompts = [SYSTEM_PROMPT]
    +
    +

    現在,使用擷取的片段和塞入提示的原始問題產生一個答案。

    +
    # Sampling parameters
    +sampling_params = SamplingParams(temperature=0.2, top_p=0.95)
    +
    +
    +# Invoke the vLLM model.
    +outputs = llm.generate(prompts, sampling_params)
    +
    +
    +# Print the outputs.
    +for output in outputs:
    +   prompt = output.prompt
    +   generated_text = output.outputs[0].text
    +   # !r calls repr(), which prints a string inside quotes.
    +   print()
    +   print(f"Question: {SAMPLE_QUESTION!r}")
    +   pprint.pprint(f"Generated text: {generated_text!r}")
    +
    +
    Question: 'What do the parameters for HNSW MEAN!?'
    +Generated text: 'Answer: The parameters for HNSW (Hiera(rchical Navigable Small World Graph) are: '
    +'* M: The maximum degree of nodes on each layer oof the graph, which can improve '
    +'recall rate at the cost of increased search time. * efConstruction and ef: ' 
    +'These parameters specify a search range when building or searching an index.'
    +
    +

    我覺得上面的答案看起來很完美!

    +

    如果您對這個示範有興趣,歡迎親自試用,並讓我們知道您的想法。我們也歡迎您加入Discord 上的 Milvus 社群,直接與所有 GenAI 開發人員交談。

    +

    參考資料

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.json new file mode 100644 index 000000000..2044b9e17 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install mem0ai pymilvus\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","# Define Config\nfrom mem0 import Memory\n\nconfig = {\n \"vector_store\": {\n \"provider\": \"milvus\",\n \"config\": {\n \"collection_name\": \"quickstart_mem0_with_milvus\",\n \"embedding_model_dims\": \"1536\",\n \"url\": \"./milvus.db\", # Use local vector database for demo purpose\n },\n },\n \"version\": \"v1.1\",\n}\n\nm = Memory.from_config(config)\n","# Add a memory to user: Working on improving tennis skills\nres = m.add(\n messages=\"I am working on improving my tennis skills.\",\n user_id=\"alice\",\n metadata={\"category\": \"hobbies\"},\n)\n\nres\n","# Get memory_id\nmemory_id = res[\"results\"][0][\"id\"]\n\n# Update this memory with new information: Likes to play tennis on weekends\nm.update(memory_id=memory_id, data=\"Likes to play tennis on weekends\")\n","# Get all memory for the user Alice\nm.get_all(user_id=\"alice\")\n","m.history(memory_id=memory_id)\n","new_mem = m.add(\n \"I have a linear algebra midterm exam on November 20\",\n user_id=\"alice\",\n metadata={\"category\": \"task\"},\n)\n","m.get_all(user_id=\"alice\")\n","m.search(query=\"What are Alice's hobbies\", user_id=\"alice\")\n","m.delete(memory_id=memory_id)\n\nm.get_all(\"alice\")\n"],"headingContent":"Getting Started with Mem0 and Milvus","anchorList":[{"label":"開始使用 Mem0 和 Milvus","href":"Getting-Started-with-Mem0-and-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"使用Mem0和Milvus管理用戶記憶體","href":"Managing-User-Memories-with-Mem0-and-Milvus","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.md new file mode 100644 index 000000000..0540b40fb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/quickstart_mem0_with_milvus.md @@ -0,0 +1,214 @@ +--- +id: quickstart_mem0_with_milvus.md +summary: >- + 在本教程中,我們將介紹基本的 Mem0 記憶體管理作業 - 新增、擷取、更新、搜尋、刪除和追蹤記憶體歷史 - 使用 + Milvus,這是一個高效能的開放原始碼向量資料庫,提供高效的儲存和擷取功能。本實用導覽將引導您完成基礎記憶體作業,以協助您使用 Mem0 和 Milvus + 建立個人化的 AI 互動。 +title: 開始使用 Mem0 和 Milvus +--- +

    開始使用 Mem0 和 Milvus

    +Open In Colab + + +GitHub Repository +

    +

    Mem0是適用於 AI 應用程式的智慧型記憶體層級,可保留使用者偏好並隨時間持續適應,提供個人化且有效率的互動。Mem0 是聊天機器人和 AI 驅動工具的理想選擇,可創造無縫、情境感知的體驗。

    +

    在本教程中,我們將介紹 Mem0 記憶體管理的基本操作 - 新增、擷取、更新、搜尋、刪除和追蹤記憶體歷史 - 使用Milvus,這是一個高效能的開放原始碼向量資料庫,提供高效的儲存和擷取功能。這個實作導覽將引導您完成基本的記憶體作業,以協助您使用 Mem0 和 Milvus 建立個人化的 AI 互動。

    +

    準備工作

    下載所需的函式庫

    $ pip install mem0ai pymilvus
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面頂端的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    使用 Milvus 設定 Mem0

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    現在,我們可以設定 Mem0 使用 Milvus 作為向量資料庫。

    +
    # Define Config
    +from mem0 import Memory
    +
    +config = {
    +    "vector_store": {
    +        "provider": "milvus",
    +        "config": {
    +            "collection_name": "quickstart_mem0_with_milvus",
    +            "embedding_model_dims": "1536",
    +            "url": "./milvus.db",  # Use local vector database for demo purpose
    +        },
    +    },
    +    "version": "v1.1",
    +}
    +
    +m = Memory.from_config(config)
    +
    +
    +
    +
      +
    • 如果你只需要一個本機向量資料庫來做小量資料或原型設計,將 uri 設定為一個本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 API key
    • +
    +
    +
    +

    使用Mem0和Milvus管理用戶記憶體

    新增記憶體

    add 函式會將 Milvus 中的非結構化文字儲存為記憶體,並將其與特定使用者和可選元資料相關聯。

    +

    在這裡,我們要將 Alice 的記憶體「努力改善我的網球技術」,連同相關的元資料一起加入 Milvus。

    +
    # Add a memory to user: Working on improving tennis skills
    +res = m.add(
    +    messages="I am working on improving my tennis skills.",
    +    user_id="alice",
    +    metadata={"category": "hobbies"},
    +)
    +
    +res
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Working on improving tennis skills',
    +   'event': 'ADD'}],
    + 'relations': []}
    +
    +

    更新記憶體

    我們可以使用add 函式的回傳值來擷取記憶體 ID,讓我們可以透過update 更新此記憶體的新資訊。

    +
    # Get memory_id
    +memory_id = res["results"][0]["id"]
    +
    +# Update this memory with new information: Likes to play tennis on weekends
    +m.update(memory_id=memory_id, data="Likes to play tennis on weekends")
    +
    +
    {'message': 'Memory updated successfully!'}
    +
    +

    取得使用者的所有記憶體

    我們可以使用get_all 函式檢視所有已插入的記憶體,或依據 Milvus 中的user_id 篩選。

    +

    請注意,我們可以看到該記憶體已經從 「努力提高網球技術 」變為 「喜歡在週末打網球」。

    +
    # Get all memory for the user Alice
    +m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'}]}
    +
    +

    檢視記憶體更新歷史

    我們也可以透過history 功能,指定我們感興趣的記憶體_id,來檢視記憶體更新歷史。

    +
    m.history(memory_id=memory_id)
    +
    +
    [{'id': '71ed3cec-5d9a-4fa6-a009-59802450c0b9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': None,
    +  'new_memory': 'Working on improving tennis skills',
    +  'event': 'ADD',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': None},
    + {'id': 'db2b003c-ffb7-42e4-bd8a-b9cf56a02bb9',
    +  'memory_id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +  'old_memory': 'Working on improving tennis skills',
    +  'new_memory': 'Likes to play tennis on weekends',
    +  'event': 'UPDATE',
    +  'created_at': '2024-11-01T19:33:44.116920-07:00',
    +  'updated_at': '2024-11-01T19:33:47.619857-07:00'}]
    +
    +

    搜尋記憶體

    我們可以使用search 函式來尋找使用者最相關的記憶體。

    +

    讓我們先為 Alice 加入另一個記憶體。

    +
    new_mem = m.add(
    +    "I have a linear algebra midterm exam on November 20",
    +    user_id="alice",
    +    metadata={"category": "task"},
    +)
    +
    +

    現在,我們呼叫get_all ,指定 user_id,以驗證我們確實有 2 個使用者 Alice 的記憶體項目。

    +
    m.get_all(user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    我們現在可以透過提供queryuser_id 來執行search 。請注意,我們預設使用L2 公制進行相似性搜尋,因此score 越小代表相似性越高。

    +
    m.search(query="What are Alice's hobbies", user_id="alice")
    +
    +
    {'results': [{'id': '77162018-663b-4dfa-88b1-4f029d6136ab',
    +   'memory': 'Likes to play tennis on weekends',
    +   'hash': '4c3bc9f87b78418f19df6407bc86e006',
    +   'metadata': None,
    +   'score': 1.2807445526123047,
    +   'created_at': '2024-11-01T19:33:44.116920-07:00',
    +   'updated_at': '2024-11-01T19:33:47.619857-07:00',
    +   'user_id': 'alice'},
    +  {'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'score': 1.728922724723816,
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    +

    刪除記憶體

    我們也可以透過提供對應的memory_iddelete 記憶體。

    +

    我們將刪除記憶體 "Likes to play tennis on weekends",因為它的memory_id 已經被擷取,並呼叫get_all 來驗證刪除是否成功。

    +
    m.delete(memory_id=memory_id)
    +
    +m.get_all("alice")
    +
    +
    {'results': [{'id': 'aa8eaa38-74d6-4b58-8207-b881d6d93d02',
    +   'memory': 'Has a linear algebra midterm exam on November 20',
    +   'hash': '575182f46965111ca0a8279c44920ea2',
    +   'metadata': {'category': 'task'},
    +   'created_at': '2024-11-01T19:33:57.271657-07:00',
    +   'updated_at': None,
    +   'user_id': 'alice'}]}
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.json b/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.json new file mode 100644 index 000000000..e87786fd2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.json @@ -0,0 +1 @@ +{"codeList":["$ python -m pip install langflow -U\n","$ python -m langflow run\n"],"headingContent":"Building a RAG System Using Langflow with Milvus","anchorList":[{"label":"使用 Langflow 與 Milvus 建立 RAG 系統","href":"Building-a-RAG-System-Using-Langflow-with-Milvus","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"教學","href":"Tutorial","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.md b/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.md new file mode 100644 index 000000000..90e1f1074 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/rag_with_langflow.md @@ -0,0 +1,82 @@ +--- +id: rag_with_langflow.md +summary: 本指南示範如何使用 Langflow 與 Milvus 建立檢索增強世代 (RAG) 管道。 +title: 使用 Langflow 與 Milvus 建立 RAG 系統 +--- +

    使用 Langflow 與 Milvus 建立 RAG 系統

    本指南示範如何使用LangflowMilvus 建立檢索增強生成 (RAG) 管道。

    +

    RAG 系統會先從知識庫中擷取相關文件,然後根據此上下文產生新的回應,藉此增強文字的產生。Milvus 用於儲存和擷取文字內嵌,而 Langflow 則有助於將擷取和產生整合到可視化的工作流程中。

    +

    Langflow 可以輕鬆建構 RAG 管道,將大量文字嵌入、儲存在 Milvus 中,並在進行相關查詢時擷取。這可讓語言模型產生符合上下文的回應。

    +

    Milvus 可作為可擴充的向量資料庫,快速找到語意相似的文字,而 Langflow 則可讓您管理管道處理文字擷取和回應產生的方式。兩者結合起來,提供了一個有效率的方式來建立強大的 RAG 管道,以增強以文字為基礎的應用程式。

    +

    先決條件

    在執行本筆記本之前,請確定您已安裝下列依賴項目:

    +
    $ python -m pip install langflow -U
    +
    +

    教學

    安裝好所有相依性後,請輸入下列指令啟動 Langflow 面板:

    +
    $ python -m langflow run
    +
    +

    接著會彈出一個儀表板,如下所示: langflowlangflow

    +

    我們要建立一個Vector Store專案,所以我們首先要點選New Project按鈕。會彈出一個面板,我們選擇Vector Store RAG選項: panelpanel

    +

    一旦成功建立 Vector Store Rag 專案,預設的向量儲存是 AstraDB,而我們想要使用 Milvus。所以我們需要用 Milvus 取代這兩個 astraDB 模組,才能使用 Milvus 作為向量儲存器。 astraDBastraDB

    +

    用 Milvus 取代 astraDB 的步驟:

      +
    1. 移除向量儲存的現有卡片。在上圖中點選兩張標紅的 AstraDB 卡,按下backspace鍵刪除它們。
    2. +
    3. 按一下側邊列中的Vector Store選項,選擇 Milvus 並將其拖曳到畫布中。這樣做兩次,因為我們需要 2 張 Milvus 卡,一張用於儲存檔案處理工作流程,一張用於搜尋工作流程。
    4. +
    5. 將 Milvus 模組連結到其他元件。請參考下面的圖片。
    6. +
    7. 為兩個 Milvus 模組設定 Milvus 認證。最簡單的方法是使用 Milvus Lite,將 Connection URI 設定為 milvus_demo.db。如果您有自部署的 Milvus 伺服器或在 Zilliz Cloud 上,請將 Connection URI 設定為伺服器端點,並將 Connection Password 設定為 token (對於 Milvus 是 ":",對於 Zilliz Cloud 是 API Key)。請參考下圖:
    8. +
    +

    + + Milvus Structure demo + Milvus 結構示範

    +

    將知識嵌入 RAG 系統

      +
    1. 透過左下方的檔案模組上載檔案作為 LLM 的知識庫。這裡我們上傳了一個包含 Milvus 簡介的檔案
    2. +
    3. 按下右下方 Milvus 模組的 run 按鈕,執行插入工作流程。這將插入知識到 Milvus 向量存儲器中。
    4. +
    5. 測試知識是否在記憶體中。打開 playground,詢問任何與您上傳檔案相關的問題。
    6. +
    +

    + + why milvus + 為什麼選擇 Milvus

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.json b/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.json new file mode 100644 index 000000000..3d8f92161 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.json @@ -0,0 +1 @@ +{"codeList":["$ pip install -qU \"unstructured-ingest[pdf]\" unstructured pymilvus openai\n","import os\n\n\nos.environ[\"UNSTRUCTURED_API_KEY\"] = \"***********\"\nos.environ[\"UNSTRUCTURED_URL\"] = \"***********\"\n\nos.environ[\"OPENAI_API_KEY\"] = \"***********\"\n","from pymilvus import MilvusClient, DataType\n\n# Initialize Milvus client\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\") # TODO\n","collection_name = \"my_rag_collection\"\n\nif milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n\n\ndef emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","# Create schema\nschema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)\n# Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=65535)\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)\nindex_params = MilvusClient.prepare_index_params()\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"AUTOINDEX\",\n)\nmilvus_client.create_collection(\n collection_name=collection_name,\n schema=schema,\n index_params=index_params,\n consistency_level=\"Strong\",\n)\n\nmilvus_client.load_collection(collection_name=collection_name)\n","from unstructured_ingest.v2.pipeline.pipeline import Pipeline\nfrom unstructured_ingest.v2.interfaces import ProcessorConfig\nfrom unstructured_ingest.v2.processes.connectors.local import (\n LocalIndexerConfig,\n LocalDownloaderConfig,\n LocalConnectionConfig,\n LocalUploaderConfig,\n)\nfrom unstructured_ingest.v2.processes.partitioner import PartitionerConfig\n\ndirectory_with_pdfs = \"./pdf_files\"\ndirectory_with_results = \"./pdf_processed_outputs\"\n\nPipeline.from_configs(\n context=ProcessorConfig(),\n indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),\n downloader_config=LocalDownloaderConfig(),\n source_connection_config=LocalConnectionConfig(),\n partitioner_config=PartitionerConfig(\n partition_by_api=True,\n api_key=os.getenv(\"UNSTRUCTURED_API_KEY\"),\n partition_endpoint=os.getenv(\"UNSTRUCTURED_API_URL\"),\n strategy=\"hi_res\",\n additional_partition_args={\n \"split_pdf_page\": True,\n \"split_pdf_concurrency_level\": 15,\n },\n ),\n uploader_config=LocalUploaderConfig(output_dir=directory_with_results),\n).run()\n\n\nfrom unstructured.staging.base import elements_from_json\n\n\ndef load_processed_files(directory_path):\n elements = []\n for filename in os.listdir(directory_path):\n if filename.endswith(\".json\"):\n file_path = os.path.join(directory_path, filename)\n try:\n elements.extend(elements_from_json(filename=file_path))\n except IOError:\n print(f\"Error: Could not read file {filename}.\")\n\n return elements\n\n\nelements = load_processed_files(directory_with_results)\n","data = []\nfor i, element in enumerate(elements):\n data.append(\n {\n \"id\": i,\n \"vector\": emb_text(element.text),\n \"text\": element.text,\n \"metadata\": element.metadata.to_dict(),\n }\n )\nmilvus_client.insert(collection_name=collection_name, data=data)\n","def retrieve_documents(question, top_k=3):\n search_res = milvus_client.search(\n collection_name=collection_name,\n data=[emb_text(question)],\n limit=top_k,\n # search_params={\"metric_type\": \"IP\", \"params\": {}},\n output_fields=[\"text\"],\n )\n return [(res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]]\n","def generate_rag_response(question):\n retrieved_docs = retrieve_documents(question)\n context = \"\\n\".join([f\"Text: {doc[0]}\\n\" for doc in retrieved_docs])\n system_prompt = (\n \"You are an AI assistant. Provide answers based on the given context.\"\n )\n user_prompt = f\"\"\"\n Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.\n \n Context:\n {context}\n \n Question: {question}\n \"\"\"\n response = openai_client.chat.completions.create(\n model=\"gpt-4o-mini\",\n messages=[\n {\"role\": \"system\", \"content\": system_prompt},\n {\"role\": \"user\", \"content\": user_prompt},\n ],\n )\n return response.choices[0].message.content\n","question = \"What is the Advanced Search Algorithms in Milvus?\"\nanswer = generate_rag_response(question)\nprint(f\"Question: {question}\")\nprint(f\"Answer: {answer}\")\n"],"headingContent":"Build a RAG with Milvus and Unstructured","anchorList":[{"label":"使用 Milvus 和 Unstructured 建立 RAG","href":"Build-a-RAG-with-Milvus-and-Unstructured","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"建立 Milvus 套件","href":"Create-Milvus-Collection","type":2,"isActive":false},{"label":"從 Unstructured 載入資料","href":"Load-data-from-Unstructured","type":2,"isActive":false},{"label":"擷取並產生回應","href":"Retrieve-and-Generate-Response","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.md b/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.md new file mode 100644 index 000000000..d272d112e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/rag_with_milvus_and_unstructured.md @@ -0,0 +1,287 @@ +--- +id: rag_with_milvus_and_unstructured.md +summary: 在本教程中,我們將使用 Unstructured 擷取 PDF 文件,然後再使用 Milvus 建立 RAG 管道。 +title: 使用 Milvus 和 Unstructured 建立 RAG +--- +

    使用 Milvus 和 Unstructured 建立 RAG

    +Open In Colab + + +GitHub Repository +

    +

    Unstructured提供了一個平台和工具,用於擷取和處理非結構化文檔,以進行資料檢索擴增生成 (Retrieval Augmented Generation, RAG) 和模型微調。它同時提供無程式碼 UI 平台和無伺服器 API 服務,讓使用者可以在 Unstructured 託管的計算資源上處理資料。

    +

    在本教程中,我們將使用 Unstructured 擷取 PDF 文件,然後再使用 Milvus 建立 RAG 管道。

    +

    準備工作

    依賴與環境

    $ pip install -qU "unstructured-ingest[pdf]" unstructured pymilvus openai
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    您可以從這裡取得UNSTRUCTURED_API_KEYUNSTRUCTURED_URL 環境變數。

    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +
    +os.environ["UNSTRUCTURED_API_KEY"] = "***********"
    +os.environ["UNSTRUCTURED_URL"] = "***********"
    +
    +os.environ["OPENAI_API_KEY"] = "***********"
    +
    +

    準備 Milvus 和 OpenAI 客戶端

    您可以使用 Milvus 客戶端建立一個 Milvus 套件,並將資料插入其中。

    +
    from pymilvus import MilvusClient, DataType
    +
    +# Initialize Milvus client
    +milvus_client = MilvusClient(uri="./milvus_demo.db")  # TODO
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存到這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 上的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您要使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,這兩個項目對應 Zilliz Cloud 中的Public Endpoint 和 Api key
    • +
    +
    +

    檢查資料集是否已存在,若已存在,請將其刪除。

    +
    collection_name = "my_rag_collection"
    +
    +if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    準備 OpenAI 用戶端以產生嵌入並產生回應。

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +
    +def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.009889289736747742, -0.005578675772994757, 0.00683477520942688, -0.03805781528353691, -0.01824733428657055, -0.04121600463986397, -0.007636285852640867, 0.03225184231996536, 0.018949154764413834, 9.352207416668534e-05]
    +
    +

    建立 Milvus 套件

    我們將以下列模式建立一個集合:

    +
      +
    • id:主鍵,這是每個文件的唯一識別碼。
    • +
    • vector:文件的嵌入。
    • +
    • text:文件的文字內容。
    • +
    • metadata:文件的元資料。
    • +
    +

    然後,我們在vector 欄位上建立AUTOINDEX 索引。然後建立集合。

    +
    # Create schema
    +schema = milvus_client.create_schema(auto_id=False, enable_dynamic_field=False)
    +# Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=embedding_dim)
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535)
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)
    +index_params = MilvusClient.prepare_index_params()
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="AUTOINDEX",
    +)
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    schema=schema,
    +    index_params=index_params,
    +    consistency_level="Strong",
    +)
    +
    +milvus_client.load_collection(collection_name=collection_name)
    +
    +

    從 Unstructured 載入資料

    Unstructured 提供了靈活而強大的攝取管道來處理各種檔案類型,包括 PDF、HTML 等等。 我們將使用攝取功能來分割本機目錄中的 PDF 檔案。然後將資料載入 Milvus。

    +
    from unstructured_ingest.v2.pipeline.pipeline import Pipeline
    +from unstructured_ingest.v2.interfaces import ProcessorConfig
    +from unstructured_ingest.v2.processes.connectors.local import (
    +    LocalIndexerConfig,
    +    LocalDownloaderConfig,
    +    LocalConnectionConfig,
    +    LocalUploaderConfig,
    +)
    +from unstructured_ingest.v2.processes.partitioner import PartitionerConfig
    +
    +directory_with_pdfs = "./pdf_files"
    +directory_with_results = "./pdf_processed_outputs"
    +
    +Pipeline.from_configs(
    +    context=ProcessorConfig(),
    +    indexer_config=LocalIndexerConfig(input_path=directory_with_pdfs),
    +    downloader_config=LocalDownloaderConfig(),
    +    source_connection_config=LocalConnectionConfig(),
    +    partitioner_config=PartitionerConfig(
    +        partition_by_api=True,
    +        api_key=os.getenv("UNSTRUCTURED_API_KEY"),
    +        partition_endpoint=os.getenv("UNSTRUCTURED_API_URL"),
    +        strategy="hi_res",
    +        additional_partition_args={
    +            "split_pdf_page": True,
    +            "split_pdf_concurrency_level": 15,
    +        },
    +    ),
    +    uploader_config=LocalUploaderConfig(output_dir=directory_with_results),
    +).run()
    +
    +
    +from unstructured.staging.base import elements_from_json
    +
    +
    +def load_processed_files(directory_path):
    +    elements = []
    +    for filename in os.listdir(directory_path):
    +        if filename.endswith(".json"):
    +            file_path = os.path.join(directory_path, filename)
    +            try:
    +                elements.extend(elements_from_json(filename=file_path))
    +            except IOError:
    +                print(f"Error: Could not read file {filename}.")
    +
    +    return elements
    +
    +
    +elements = load_processed_files(directory_with_results)
    +
    +

    將資料插入 Milvus。

    +
    data = []
    +for i, element in enumerate(elements):
    +    data.append(
    +        {
    +            "id": i,
    +            "vector": emb_text(element.text),
    +            "text": element.text,
    +            "metadata": element.metadata.to_dict(),
    +        }
    +    )
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +

    擷取並產生回應

    定義一個函式從 Milvus 擷取相關文件。

    +
    def retrieve_documents(question, top_k=3):
    +    search_res = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[emb_text(question)],
    +        limit=top_k,
    +        # search_params={"metric_type": "IP", "params": {}},
    +        output_fields=["text"],
    +    )
    +    return [(res["entity"]["text"], res["distance"]) for res in search_res[0]]
    +
    +

    定義一個函式,使用 RAG 管道中擷取的文件產生回應。

    +
    def generate_rag_response(question):
    +    retrieved_docs = retrieve_documents(question)
    +    context = "\n".join([f"Text: {doc[0]}\n" for doc in retrieved_docs])
    +    system_prompt = (
    +        "You are an AI assistant. Provide answers based on the given context."
    +    )
    +    user_prompt = f"""
    +    Use the following pieces of information to answer the question. If the information is not in the context, say you don't know.
    +    
    +    Context:
    +    {context}
    +    
    +    Question: {question}
    +    """
    +    response = openai_client.chat.completions.create(
    +        model="gpt-4o-mini",
    +        messages=[
    +            {"role": "system", "content": system_prompt},
    +            {"role": "user", "content": user_prompt},
    +        ],
    +    )
    +    return response.choices[0].message.content
    +
    +

    讓我們用範例問題來測試 RAG 管道。

    +
    question = "What is the Advanced Search Algorithms in Milvus?"
    +answer = generate_rag_response(question)
    +print(f"Question: {question}")
    +print(f"Answer: {answer}")
    +
    +
    INFO: HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
    +INFO: HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
    +
    +
    +Question: What is the Advanced Search Algorithms in Milvus?
    +Answer: The Advanced Search Algorithms in Milvus refer to a wide range of in-memory and on-disk indexing/search algorithms it supports, including IVF, HNSW, DiskANN, and more. These algorithms have been deeply optimized, and Milvus delivers 30%-70% better performance compared to popular implementations like FAISS and HNSWLib.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.json b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.json new file mode 100644 index 000000000..a931aa56d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/arc53/DocsGPT.git\n$ cd DocsGPT\n","$ echo \"\\nlangchain-milvus==0.1.6\" >> ./application/requirements.txt\n"," backend:\n build: ./application\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n"," worker:\n build: ./application\n command: celery -A application.app.celery worker -l INFO -B\n environment:\n - VECTOR_STORE=milvus\n - MILVUS_URI=...\n - MILVUS_TOKEN=...\n","$ docker compose down\n"],"headingContent":"Use Milvus in DocsGPT","anchorList":[{"label":"在 DocsGPT 中使用 Milvus","href":"Use-Milvus-in-DocsGPT","type":1,"isActive":false},{"label":"安裝需求","href":"Requirements","type":2,"isActive":false},{"label":"複製套件庫","href":"Clone-the-repository","type":2,"isActive":false},{"label":"新增依賴","href":"Add-dependency","type":2,"isActive":false},{"label":"設定環境變數","href":"Set-environment-variables","type":2,"isActive":false},{"label":"啟動服務","href":"Start-the-services","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.md b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.md new file mode 100644 index 000000000..6d957a051 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_docsgpt.md @@ -0,0 +1,140 @@ +--- +id: use_milvus_in_docsgpt.md +summary: 在本教程中,我們將教您如何使用 Milvus 作為 DocsGPT 的後端向量資料庫。 +title: 在 DocsGPT 中使用 Milvus +--- +

    在 DocsGPT 中使用 Milvus

    DocsGPT是一個先進的開放原始碼解決方案,它透過整合強大的 GPT 模型,簡化了在專案文件中尋找資訊的過程。它能讓開發人員輕鬆獲得有關專案問題的準確答案,省去耗時的手動搜尋。

    +

    在本教程中,我們將教您如何使用 Milvus 作為 DocsGPT 的後端向量資料庫。

    +
    +

    本教學主要參考DocsGPT官方安裝指南。如果您發現本教程有過時的部分,您可以優先按照官方指南進行,並向我們提出問題。

    +
    +

    安裝需求

    確認您已經安裝Docker

    +

    複製套件庫

    克隆儲存庫並導航到它:

    +
    $ git clone https://github.com/arc53/DocsGPT.git
    +$ cd DocsGPT
    +
    +

    新增依賴

    langchain-milvus 依賴附加到application 資料夾下的requirements.txt 檔案:

    +
    $ echo "\nlangchain-milvus==0.1.6" >> ./application/requirements.txt
    +
    +

    設定環境變數

    docker-compose.yaml 檔案中,將VECTOR_STORE=milvus,MILVUS_URI=...,MILVUS_TOKEN=... 加入backendworker 服務的環境變數,就像這樣:

    +
      backend:
    +    build: ./application
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +
      worker:
    +    build: ./application
    +    command: celery -A application.app.celery worker -l INFO -B
    +    environment:
    +      - VECTOR_STORE=milvus
    +      - MILVUS_URI=...
    +      - MILVUS_TOKEN=...
    +
    +

    對於MILVUS_URIMILVUS_TOKEN ,您可以使用完全管理的Zilliz Cloud(Recommended) 服務或手動啟動的 Milvus 服務。

    +
      +
    • 對於完全管理的 Zilliz Cloud 服務:我們建議使用 Zilliz Cloud 服務。您可以在Zilliz Cloud 上註冊免費試用帳號。之後,您將獲得MILVUS_URIMILVUS_TOKEN ,它們對應於公共端點和 API 金鑰

    • +
    • 用於手動啟動 Milvus 服務:如果您想要設定 Milvus 服務,您可以依照Milvus 官方文件設定 Milvus 伺服器,然後從伺服器取得MILVUS_URIMILVUS_TOKENMILVUS_URIMILVUS_TOKEN 的格式分別為http://<your_server_ip>:19530<your_username>:<your_password>

    • +
    +

    啟動服務

    執行:./setup.sh

    +

    然後瀏覽 http://localhost:5173/。

    +

    您可以玩弄 UI 並提出有關文件的問題。

    +

    + + alt text + 選取文字

    +

    如果要停止服務,執行:

    +
    $ docker compose down
    +
    +

    如需更多詳細資訊和更進階的設定,請參閱DocsGPT官方文件。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.json b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.json new file mode 100644 index 000000000..6b48ff372 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/zylon-ai/private-gpt\n$ cd private-gpt\n","$ brew install make\n","$ choco install make\n","$ poetry install --extras \"llms-ollama embeddings-ollama vector-stores-milvus ui\"\n","$ ollama serve\n","$ ollama pull llama3.1\n$ ollama pull nomic-embed-text\n","vectorstore:\n database: milvus\n","milvus:\n uri: http://localhost:19530\n collection_name: my_collection\n","PGPT_PROFILES=ollama make run\n"],"headingContent":"Use Milvus in PrivateGPT","anchorList":[{"label":"在 PrivateGPT 中使用 Milvus","href":"Use-Milvus-in-PrivateGPT","type":1,"isActive":false},{"label":"執行 PrivateGPT 的基本需求","href":"Base-requirements-to-run-PrivateGPT","type":2,"isActive":false},{"label":"安裝可用模組","href":"Install-Available-Modules","type":2,"isActive":false},{"label":"啟動 Ollama 服務","href":"Start-Ollama-service","type":2,"isActive":false},{"label":"變更 Milvus 設定","href":"Change-Milvus-Settings","type":2,"isActive":false},{"label":"啟動 PrivateGPT","href":"Start-PrivateGPT","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.md b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.md new file mode 100644 index 000000000..caa9ba102 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_in_private_gpt.md @@ -0,0 +1,168 @@ +--- +id: use_milvus_in_private_gpt.md +summary: 在本教程中,我們將教您如何使用 Milvus 作為 PrivateGPT 的後端向量資料庫。 +title: 在 PrivateGPT 中使用 Milvus +--- +

    在 PrivateGPT 中使用 Milvus

    PrivateGPT是一個生產就緒的 AI 專案,可讓使用者在沒有網際網路連線的情況下,使用大型語言模型針對他們的文件提出問題,同時確保 100% 的隱私。PrivateGPT 提供的 API 分為高階與低階區塊。它也提供 Gradio UI 用戶端和有用的工具,例如大量模型下載腳本和攝取腳本。從概念上來看,PrivateGPT 包覆了 RAG 管道並公開其基元,可立即使用並提供 API 和 RAG 管道的完整實作。

    +

    在本教程中,我們將教您如何使用 Milvus 作為 PrivateGPT 的後端向量資料庫。

    +
    +

    本教學主要參考PrivateGPT官方安裝指南。如果您發現本教學有過時的部分,您可以優先按照官方指南,並向我們提出問題。

    +
    +

    執行 PrivateGPT 的基本需求

    1.克隆 PrivateGPT 儲存庫

    複製儲存庫並導航到它:

    +
    $ git clone https://github.com/zylon-ai/private-gpt
    +$ cd private-gpt
    +
    +

    2.安裝 Poetry

    安裝Poetry用於依賴管理:依照 Poetry 官方網站的指示安裝。

    +

    3.(可選)安裝 make

    若要執行各種腳本,您需要安裝 make。

    +

    macOS (使用 Homebrew):

    +
    $ brew install make
    +
    +

    Windows (使用 Chocolatey):

    +
    $ choco install make
    +
    +

    安裝可用模組

    PrivateGPT 允許自訂某些模組的設定,例如 LLM、Embeddings、Vector Stores、UI。

    +

    在本教程中,我們將使用下列模組:

    +
      +
    • LLM: Ollama
    • +
    • 嵌入:Ollama
    • +
    • 向量儲存:Milvus
    • +
    • UI:Gradio
    • +
    +

    執行以下指令,使用 poetry 安裝所需的模組相依性:

    +
    $ poetry install --extras "llms-ollama embeddings-ollama vector-stores-milvus ui"
    +
    +

    啟動 Ollama 服務

    前往ollama.ai,依照指示在您的機器上安裝 Ollama。

    +

    安裝完成後,確定 Ollama 桌面應用程式已關閉。

    +

    現在,啟動 Ollama 服務(它會啟動本機推理伺服器,同時為 LLM 和 Embeddings 服務):

    +
    $ ollama serve
    +
    +

    安裝要使用的模型,預設settings-ollama.yaml 設定為使用者llama3.1 8b LLM (~4GB) 和nomic-embed-text Embeddings (~275MB)

    +

    預設情況下,PrivateGPT 會根據需要自動拉取模型。這個行為可以透過修改ollama.autopull_models 屬性來改變。

    +

    無論如何,如果您想要手動拉取模型,請執行下列指令:

    +
    $ ollama pull llama3.1
    +$ ollama pull nomic-embed-text
    +
    +

    您可以選擇性地在settings-ollama.yaml 檔案中變更到您最喜愛的模型,然後手動拉取它們。

    +

    變更 Milvus 設定

    在檔案settings-ollama.yaml, 設定 vectorstore 為 milvus:

    +
    vectorstore:
    +  database: milvus
    +
    +

    您也可以加入一些 cumstom Milvus 設定來指定您的設定。 像這樣:

    +
    milvus:
    +  uri: http://localhost:19530
    +  collection_name: my_collection
    +
    +

    可用的設定選項有

    + + + + + + + + + + +
    欄位 選項說明
    uri預設為 "local_data/private_gpt/milvus/milvus_local.db" 作為本機檔案;您也可以在 docker 或 k8s 上設定效能較高的 Milvus 伺服器,例如 http://localhost:19530,作為您的 uri;若要使用Zilliz Cloud,請將 uri 和 token 調整為 Zilliz Cloud 的Public Endpoint 和 API key
    令牌與 docker 或 k8s 上的 Milvus 伺服器或 Zilliz Cloud 的 api key 配對。
    集合名稱collection 的名稱,設定為預設的 "milvus_db"。
    覆寫覆寫資料集中已存在的資料,預設為 True。
    +

    啟動 PrivateGPT

    完成所有設定後,您就可以使用 Gradio UI 執行 PrivateGPT。

    +
    PGPT_PROFILES=ollama make run
    +
    +

    UI 的網址是http://0.0.0.0:8001

    +

    + + + + +

    +

    您可以玩弄 UI 並詢問關於您的文件的問題。

    +

    如需更多詳細資訊,請參閱PrivateGPT官方說明文件。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.json b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.json new file mode 100644 index 000000000..e6a350805 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.json @@ -0,0 +1 @@ +{"codeList":["$ git clone https://github.com/sambanova/ai-starter-kit.git\n$ d ai-starter-kit/enterprise_knowledge_retriever\n","...\nvectorstore = self.vectordb.create_vector_store(\n ..., db_type='milvus'\n)\n...\nvectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)\n","python3 -m venv enterprise_knowledge_env\nsource enterprise_knowledge_env/bin/activate\npip install -r requirements.txt\n","$ streamlit run streamlit/app.py --browser.gatherUsageStats false \n"],"headingContent":"Use Milvus with SambaNova","anchorList":[{"label":"將 Milvus 與 SambaNova 搭配使用","href":"Use-Milvus-with-SambaNova","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"克隆儲存庫","href":"Clone-the-repository","type":2,"isActive":false},{"label":"變更向量儲存類型","href":"Change-the-vector-store-type","type":2,"isActive":false},{"label":"安裝相依性","href":"Install-dependencies","type":2,"isActive":false},{"label":"啟動應用程式","href":"Start-the-application","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.md b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.md new file mode 100644 index 000000000..5437c178a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/use_milvus_with_sambanova.md @@ -0,0 +1,133 @@ +--- +id: use_milvus_with_sambanova.md +summary: >- + 本教學利用 SambaNova AI Starter Kits 中的 Milvus 整合功能,建立企業知識檢索系統,類似於 + RAG(Retrieval-Augmented Generation),用於基於企業私有文件的檢索和回答。 +title: 將 Milvus 與 SambaNova 搭配使用 +--- +

    將 Milvus 與 SambaNova 搭配使用

    SambaNova是創新的 AI 技術平台,可加速部署先進的 AI 與深度學習功能。該平台專為企業使用而設計,可讓組織利用生成式 AI 來增強效能與效率。透過提供 SambaNova Suite 和 DataScale 等尖端解決方案,該平台可讓企業從資料中擷取有價值的洞察力,推動營運改善,並在 AI 領域中培育新的商機。

    +

    SambaNova AI Starter Kits是一系列開放原始碼資源,旨在協助開發人員和企業使用 SambaNova 部署 AI 驅動的應用程式。這些套件提供實用範例與指南,可協助實作各種 AI 用例,讓使用者更容易利用 SambaNova 的先進技術。

    +

    本教學利用 SambaNova AI Starter Kits 中的 Milvus 整合,建立企業知識檢索系統,類似 RAG (Retrieval-Augmented Generation),以企業私有文件為基礎進行檢索與回答。

    +
    +

    本教學主要參考SambaNova AI Starter Kits官方指南。如果您發現本教學有過時的部分,您可以優先遵循官方指南,並向我們提出問題。

    +
    +

    先決條件

    我們建議使用 Python >= 3.10 及 < 3.12。

    +

    造訪SambaNova Cloud取得 SambaNova API 金鑰。

    +

    克隆儲存庫

    $ git clone https://github.com/sambanova/ai-starter-kit.git
    +$ d ai-starter-kit/enterprise_knowledge_retriever
    +
    +

    變更向量儲存類型

    透過在create_vector_store()src/document_retrieval.pyload_vdb() 函式中設定db_type='milvus' 來變更向量儲存。

    +
    ...
    +vectorstore = self.vectordb.create_vector_store(
    +    ..., db_type='milvus'
    +)
    +...
    +vectorstore = self.vectordb.load_vdb(..., db_type='milvus', ...)
    +
    +

    安裝相依性

    執行下列指令安裝所需的相依性:

    +
    python3 -m venv enterprise_knowledge_env
    +source enterprise_knowledge_env/bin/activate
    +pip install -r requirements.txt
    +
    +

    啟動應用程式

    使用下列指令啟動應用程式:

    +
    $ streamlit run streamlit/app.py --browser.gatherUsageStats false 
    +
    +

    之後,您會在瀏覽器中看到使用者介面:http://localhost:8501/

    +

    + + + + +

    +

    在使用者介面中設定您的 SambaNova API 金鑰後,您就可以在使用者介面中玩遊戲,並提出有關文件的問題。

    +

    如需更多詳細資訊,請參閱SambaNova AI Starter Kits 的企業知識檢索官方文件。

    diff --git a/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.json b/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.json new file mode 100644 index 000000000..1500f2141 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.json @@ -0,0 +1 @@ +{"codeList":["mkdir video-search-tutorial\ncd video-search-tutorial\n","python -m venv venv\nsource venv/bin/activate # On Windows, use `venv\\Scripts\\activate`\n","pip install twelvelabs pymilvus\n","touch video_search.py\n","export TWELVE_LABS_API_KEY='your_api_key_here'\n","from pymilvus import MilvusClient\n\n# Initialize the Milvus client\nmilvus_client = MilvusClient(\"milvus_twelvelabs_demo.db\")\n\nprint(\"Successfully connected to Milvus\")\n","# Initialize the collection name\ncollection_name = \"twelvelabs_demo_collection\"\n\n# Check if the collection already exists and drop it if it does\nif milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n\n# Create the collection\nmilvus_client.create_collection(\n collection_name=collection_name,\n dimension=1024 # The dimension of the Twelve Labs embeddings\n)\n\nprint(f\"Collection '{collection_name}' created successfully\")\n","from twelvelabs import TwelveLabs\nfrom twelvelabs.models.embed import EmbeddingsTask\nimport os\n\n# Retrieve the API key from environment variables\nTWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')\n","twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)\n","def generate_embedding(video_url):\n \"\"\"\n Generate embeddings for a given video URL using the Twelve Labs API.\n\n This function creates an embedding task for the specified video URL using\n the Marengo-retrieval-2.6 engine. It monitors the task progress and waits\n for completion. Once done, it retrieves the task result and extracts the\n embeddings along with their associated metadata.\n\n Args:\n video_url (str): The URL of the video to generate embeddings for.\n\n Returns:\n tuple: A tuple containing two elements:\n 1. list: A list of dictionaries, where each dictionary contains:\n - 'embedding': The embedding vector as a list of floats.\n - 'start_offset_sec': The start time of the segment in seconds.\n - 'end_offset_sec': The end time of the segment in seconds.\n - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').\n 2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.\n\n Raises:\n Any exceptions raised by the Twelve Labs API during task creation,\n execution, or retrieval.\n \"\"\"\n\n # Create an embedding task\n task = twelvelabs_client.embed.task.create(\n engine_name=\"Marengo-retrieval-2.6\",\n video_url=video_url\n )\n print(f\"Created task: id={task.id} engine_name={task.engine_name} status={task.status}\")\n\n # Define a callback function to monitor task progress\n def on_task_update(task: EmbeddingsTask):\n print(f\" Status={task.status}\")\n\n # Wait for the task to complete\n status = task.wait_for_done(\n sleep_interval=2,\n callback=on_task_update\n )\n print(f\"Embedding done: {status}\")\n\n # Retrieve the task result\n task_result = twelvelabs_client.embed.task.retrieve(task.id)\n\n # Extract and return the embeddings\n embeddings = []\n for v in task_result.video_embeddings:\n embeddings.append({\n 'embedding': v.embedding.float,\n 'start_offset_sec': v.start_offset_sec,\n 'end_offset_sec': v.end_offset_sec,\n 'embedding_scope': v.embedding_scope\n })\n \n return embeddings, task_result\n","# Example usage\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Generate embeddings for the video\nembeddings, task_result = generate_embedding(video_url)\n\nprint(f\"Generated {len(embeddings)} embeddings for the video\")\nfor i, emb in enumerate(embeddings):\n print(f\"Embedding {i+1}:\")\n print(f\" Scope: {emb['embedding_scope']}\")\n print(f\" Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds\")\n print(f\" Embedding vector (first 5 values): {emb['embedding'][:5]}\")\n print()\n","def insert_embeddings(milvus_client, collection_name, task_result, video_url):\n \"\"\"\n Insert embeddings into the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to insert into.\n task_result (EmbeddingsTaskResult): The task result containing video embeddings.\n video_url (str): The URL of the video associated with the embeddings.\n\n Returns:\n MutationResult: The result of the insert operation.\n\n This function takes the video embeddings from the task result and inserts them\n into the specified Milvus collection. Each embedding is stored with additional\n metadata including its scope, start and end times, and the associated video URL.\n \"\"\"\n data = []\n\n for i, v in enumerate(task_result.video_embeddings):\n data.append({\n \"id\": i,\n \"vector\": v.embedding.float,\n \"embedding_scope\": v.embedding_scope,\n \"start_offset_sec\": v.start_offset_sec,\n \"end_offset_sec\": v.end_offset_sec,\n \"video_url\": video_url\n })\n\n insert_result = milvus_client.insert(collection_name=collection_name, data=data)\n print(f\"Inserted {len(data)} embeddings into Milvus\")\n return insert_result\n\n# Usage example\nvideo_url = \"https://example.com/your-video.mp4\"\n\n# Assuming this function exists from previous step\nembeddings, task_result = generate_embedding(video_url)\n\n# Insert embeddings into the Milvus collection\ninsert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)\nprint(insert_result)\n","def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):\n \"\"\"\n Perform a similarity search on the Milvus collection.\n\n Args:\n milvus_client: The Milvus client instance.\n collection_name (str): The name of the Milvus collection to search in.\n query_vector (list): The query vector to search for similar embeddings.\n limit (int, optional): The maximum number of results to return. Defaults to 5.\n\n Returns:\n list: A list of search results, where each result is a dictionary containing\n the matched entity's metadata and similarity score.\n\n This function searches the specified Milvus collection for embeddings similar to\n the given query vector. It returns the top matching results, including metadata\n such as the embedding scope, time range, and associated video URL for each match.\n \"\"\"\n search_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vector],\n limit=limit,\n output_fields=[\"embedding_scope\", \"start_offset_sec\", \"end_offset_sec\", \"video_url\"]\n )\n\n return search_results\n \n# define the query vector\n# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.\nquery_vector = task_result.video_embeddings[0].embedding.float\n\n# Perform a similarity search on the Milvus collection\nsearch_results = perform_similarity_search(milvus_client, collection_name, query_vector)\n\nprint(\"Search Results:\")\nfor i, result in enumerate(search_results[0]):\n print(f\"Result {i+1}:\")\n print(f\" Video URL: {result['entity']['video_url']}\")\n print(f\" Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds\")\n print(f\" Similarity Score: {result['distance']}\")\n print()\n"],"headingContent":"Advanced Video Search: Leveraging Twelve Labs and Milvus for Semantic Retrieval","anchorList":[{"label":"進階視訊搜尋:利用 Twelve Labs 和 Milvus 進行語意檢索","href":"Advanced-Video-Search-Leveraging-Twelve-Labs-and-Milvus-for-Semantic-Retrieval","type":1,"isActive":false},{"label":"簡介","href":"Introduction","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定開發環境","href":"Setting-Up-the-Development-Environment","type":2,"isActive":false},{"label":"連接至 Milvus","href":"Connecting-to-Milvus","type":2,"isActive":false},{"label":"建立視訊嵌入的 Milvus 套件","href":"Creating-a-Milvus-Collection-for-Video-Embeddings","type":2,"isActive":false},{"label":"使用 Twelve Labs Embed API 生成嵌入式内容","href":"Generating-Embeddings-with-Twelve-Labs-Embed-API","type":2,"isActive":false},{"label":"初始化 Twelve Labs 客戶端:","href":"Initialize-the-Twelve-Labs-client","type":2,"isActive":false},{"label":"將嵌入式資料插入 Milvus","href":"Inserting-Embeddings-into-Milvus","type":2,"isActive":false},{"label":"執行相似性搜尋","href":"Performing-Similarity-Search","type":2,"isActive":false},{"label":"優化效能","href":"Optimizing-Performance","type":2,"isActive":false},{"label":"進階功能","href":"Advanced-Features","type":2,"isActive":false},{"label":"錯誤處理和日誌","href":"Error-Handling-and-Logging","type":2,"isActive":false},{"label":"總結","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.md b/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.md new file mode 100644 index 000000000..db85081d7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/integrations/video_search_with_twelvelabs_and_milvus.md @@ -0,0 +1,457 @@ +--- +id: video_search_with_twelvelabs_and_milvus.md +summary: >- + 了解如何透過整合 Twelve Labs 用於產生多模態嵌入的 Embed API 與 + Milvus,來建立語意視訊搜尋應用程式。它涵蓋了從設定開發環境到實作混合搜尋和時間視訊分析等進階功能的整個過程,為建立複雜的視訊內容分析和檢索系統提供了全面的基礎。 +title: 進階視訊搜尋:利用 Twelve Labs 和 Milvus 進行語意檢索 +--- +

    進階視訊搜尋:利用 Twelve Labs 和 Milvus 進行語意檢索

    簡介

    歡迎來到這個使用Twelve Labs Embed API和 Milvus 實現語義視頻搜索的綜合教程。在本指南中,我們將探討如何利用Twelve Labs 先進的多模態嵌入(multimodal embeddings)和Milvus 高效的向量資料庫來創建一個強大的視訊搜尋解決方案。透過整合這些技術,開發人員能夠釋放視訊內容分析的新可能性,實現基於內容的視訊檢索、推薦系統以及瞭解視訊資料細微差異的精密搜尋引擎等應用程式。

    +

    本教程將引導您完成從設定開發環境到實作功能性語意視訊搜尋應用程式的整個過程。我們將介紹一些關鍵概念,例如從視訊產生多模態嵌入、將其有效地儲存於 Milvus,以及執行相似性搜尋以擷取相關內容。無論您是要建立視訊分析平台、內容發現工具,或是利用視訊搜尋功能強化您現有的應用程式,本指南都將為您提供相關知識與實務步驟,讓您在專案中充分利用 Twelve Labs 與 Milvus 的優勢。

    +

    先決條件

    在我們開始之前,請確保您具備以下條件:

    +

    Twelve Labs API 密鑰 (如果您沒有,請在 https://api.twelvelabs.io 註冊) 系統上已安裝 Python 3.7 或更新版本

    +

    設定開發環境

    為您的專案建立一個新目錄,並導航到該目錄:

    +
    mkdir video-search-tutorial
    +cd video-search-tutorial
    +
    +

    設定虛擬環境 (可選擇但建議使用):

    +
    python -m venv venv
    +source venv/bin/activate  # On Windows, use `venv\Scripts\activate`
    +
    +

    安裝所需的 Python 函式庫:

    +
    pip install twelvelabs pymilvus
    +
    +

    為專案建立新的 Python 檔案:

    +
    touch video_search.py
    +
    +

    這個 video_search.py 檔案將會是我們在教學中使用的主要腳本。接下來,將您的 Twelve Labs API key 設定為環境變數,以確保安全性:

    +
    export TWELVE_LABS_API_KEY='your_api_key_here'
    +
    +

    連接至 Milvus

    要與 Milvus 建立連線,我們會使用 MilvusClient 類別。這種方法簡化了連接過程,並允許我們使用基於本地文件的 Milvus 實例,非常適合我們的教程。

    +
    from pymilvus import MilvusClient
    +
    +# Initialize the Milvus client
    +milvus_client = MilvusClient("milvus_twelvelabs_demo.db")
    +
    +print("Successfully connected to Milvus")
    +
    +

    這段程式碼會建立一個新的 Milvus 用戶端實體,將所有資料儲存在一個名為 milvus_twelvelabs_demo.db 的檔案中。這種以檔案為基礎的方式非常適合開發和測試用途。

    +

    建立視訊嵌入的 Milvus 套件

    現在我們已連接到 Milvus,讓我們建立一個集合來儲存我們的視訊嵌入和相關的元資料。我們將定義集合模式,如果還不存在,就建立集合。

    +
    # Initialize the collection name
    +collection_name = "twelvelabs_demo_collection"
    +
    +# Check if the collection already exists and drop it if it does
    +if milvus_client.has_collection(collection_name=collection_name):
    +    milvus_client.drop_collection(collection_name=collection_name)
    +
    +# Create the collection
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=1024  # The dimension of the Twelve Labs embeddings
    +)
    +
    +print(f"Collection '{collection_name}' created successfully")
    +
    +

    在此程式碼中,我們會先檢查集合是否已經存在,如果已經存在,就將它刪除。這可確保我們從一片乾淨的石板開始。我們建立的集合維度為 1024,與 Twelve Labs 的嵌入式輸出維度相符。

    +

    使用 Twelve Labs Embed API 生成嵌入式内容

    要使用 Twelve Labs Embed API 為我們的影片產生嵌入式內容,我們會使用 Twelve Labs Python SDK。這個過程包括建立一個嵌入任務,等待其完成,並擷取結果。以下是實作方法:

    +

    首先,確保您已安裝 Twelve Labs SDK,並匯入必要的模組:

    +
    from twelvelabs import TwelveLabs
    +from twelvelabs.models.embed import EmbeddingsTask
    +import os
    +
    +# Retrieve the API key from environment variables
    +TWELVE_LABS_API_KEY = os.getenv('TWELVE_LABS_API_KEY')
    +
    +

    初始化 Twelve Labs 客戶端:

    twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
    +
    +

    建立一個函式,以產生指定視訊 URL 的 embeddings:

    +
    def generate_embedding(video_url):
    +    """
    +    Generate embeddings for a given video URL using the Twelve Labs API.
    +
    +    This function creates an embedding task for the specified video URL using
    +    the Marengo-retrieval-2.6 engine. It monitors the task progress and waits
    +    for completion. Once done, it retrieves the task result and extracts the
    +    embeddings along with their associated metadata.
    +
    +    Args:
    +        video_url (str): The URL of the video to generate embeddings for.
    +
    +    Returns:
    +        tuple: A tuple containing two elements:
    +            1. list: A list of dictionaries, where each dictionary contains:
    +                - 'embedding': The embedding vector as a list of floats.
    +                - 'start_offset_sec': The start time of the segment in seconds.
    +                - 'end_offset_sec': The end time of the segment in seconds.
    +                - 'embedding_scope': The scope of the embedding (e.g., 'shot', 'scene').
    +            2. EmbeddingsTaskResult: The complete task result object from Twelve Labs API.
    +
    +    Raises:
    +        Any exceptions raised by the Twelve Labs API during task creation,
    +        execution, or retrieval.
    +    """
    +
    +    # Create an embedding task
    +    task = twelvelabs_client.embed.task.create(
    +        engine_name="Marengo-retrieval-2.6",
    +        video_url=video_url
    +    )
    +    print(f"Created task: id={task.id} engine_name={task.engine_name} status={task.status}")
    +
    +    # Define a callback function to monitor task progress
    +    def on_task_update(task: EmbeddingsTask):
    +        print(f"  Status={task.status}")
    +
    +    # Wait for the task to complete
    +    status = task.wait_for_done(
    +        sleep_interval=2,
    +        callback=on_task_update
    +    )
    +    print(f"Embedding done: {status}")
    +
    +    # Retrieve the task result
    +    task_result = twelvelabs_client.embed.task.retrieve(task.id)
    +
    +    # Extract and return the embeddings
    +    embeddings = []
    +    for v in task_result.video_embeddings:
    +        embeddings.append({
    +            'embedding': v.embedding.float,
    +            'start_offset_sec': v.start_offset_sec,
    +            'end_offset_sec': v.end_offset_sec,
    +            'embedding_scope': v.embedding_scope
    +        })
    +    
    +    return embeddings, task_result
    +
    +

    使用該函數為您的視訊產生嵌入式內容:

    +
    # Example usage
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Generate embeddings for the video
    +embeddings, task_result = generate_embedding(video_url)
    +
    +print(f"Generated {len(embeddings)} embeddings for the video")
    +for i, emb in enumerate(embeddings):
    +    print(f"Embedding {i+1}:")
    +    print(f"  Scope: {emb['embedding_scope']}")
    +    print(f"  Time range: {emb['start_offset_sec']} - {emb['end_offset_sec']} seconds")
    +    print(f"  Embedding vector (first 5 values): {emb['embedding'][:5]}")
    +    print()
    +
    +

    此實作允許您使用 Twelve Labs Embed API 為任何視訊 URL 產生 embeddings。generate_embedding 函式會處理從建立任務到擷取結果的整個過程。它會返回一個字典清單,每個字典都包含一個嵌入向量及其元資料(時間範圍和範圍)。在生產環境中,請記住要處理潛在的錯誤,例如網路問題或 API 限制。根據您的特定使用情況,您可能還需要實作重試或更強大的錯誤處理。

    +

    將嵌入式資料插入 Milvus

    使用 Twelve Labs Embed API 產生嵌入式資料後,下一步就是將這些嵌入式資料連同其元資料插入 Milvus 套件。這個過程可讓我們儲存和索引視訊嵌入資料,以便日後進行有效的相似性搜尋。

    +

    以下是將嵌入資料插入 Milvus 的方法:

    +
    def insert_embeddings(milvus_client, collection_name, task_result, video_url):
    +    """
    +    Insert embeddings into the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to insert into.
    +        task_result (EmbeddingsTaskResult): The task result containing video embeddings.
    +        video_url (str): The URL of the video associated with the embeddings.
    +
    +    Returns:
    +        MutationResult: The result of the insert operation.
    +
    +    This function takes the video embeddings from the task result and inserts them
    +    into the specified Milvus collection. Each embedding is stored with additional
    +    metadata including its scope, start and end times, and the associated video URL.
    +    """
    +    data = []
    +
    +    for i, v in enumerate(task_result.video_embeddings):
    +        data.append({
    +            "id": i,
    +            "vector": v.embedding.float,
    +            "embedding_scope": v.embedding_scope,
    +            "start_offset_sec": v.start_offset_sec,
    +            "end_offset_sec": v.end_offset_sec,
    +            "video_url": video_url
    +        })
    +
    +    insert_result = milvus_client.insert(collection_name=collection_name, data=data)
    +    print(f"Inserted {len(data)} embeddings into Milvus")
    +    return insert_result
    +
    +# Usage example
    +video_url = "https://example.com/your-video.mp4"
    +
    +# Assuming this function exists from previous step
    +embeddings, task_result = generate_embedding(video_url)
    +
    +# Insert embeddings into the Milvus collection
    +insert_result = insert_embeddings(milvus_client, collection_name, task_result, video_url)
    +print(insert_result)
    +
    +

    此功能會準備要插入的資料,包括所有相關的元資料,例如嵌入向量、時間範圍和來源視訊 URL。然後使用 Milvus 客戶端將這些資料插入指定的集合。

    +

    將我們的嵌入向量儲存於 Milvus 後,我們就可以執行相似性搜尋,根據查詢向量找出最相關的視訊片段。以下是實現此功能的方法:

    +
    def perform_similarity_search(milvus_client, collection_name, query_vector, limit=5):
    +    """
    +    Perform a similarity search on the Milvus collection.
    +
    +    Args:
    +        milvus_client: The Milvus client instance.
    +        collection_name (str): The name of the Milvus collection to search in.
    +        query_vector (list): The query vector to search for similar embeddings.
    +        limit (int, optional): The maximum number of results to return. Defaults to 5.
    +
    +    Returns:
    +        list: A list of search results, where each result is a dictionary containing
    +              the matched entity's metadata and similarity score.
    +
    +    This function searches the specified Milvus collection for embeddings similar to
    +    the given query vector. It returns the top matching results, including metadata
    +    such as the embedding scope, time range, and associated video URL for each match.
    +    """
    +    search_results = milvus_client.search(
    +        collection_name=collection_name,
    +        data=[query_vector],
    +        limit=limit,
    +        output_fields=["embedding_scope", "start_offset_sec", "end_offset_sec", "video_url"]
    +    )
    +
    +    return search_results
    +    
    +# define the query vector
    +# We use the embedding inserted previously as an example. In practice, you can replace it with any video embedding you want to query.
    +query_vector = task_result.video_embeddings[0].embedding.float
    +
    +# Perform a similarity search on the Milvus collection
    +search_results = perform_similarity_search(milvus_client, collection_name, query_vector)
    +
    +print("Search Results:")
    +for i, result in enumerate(search_results[0]):
    +    print(f"Result {i+1}:")
    +    print(f"  Video URL: {result['entity']['video_url']}")
    +    print(f"  Time Range: {result['entity']['start_offset_sec']} - {result['entity']['end_offset_sec']} seconds")
    +    print(f"  Similarity Score: {result['distance']}")
    +    print()
    +
    +

    此實作如下:

    +
      +
    1. 定義一個函式 perform_similarity_search,接受查詢向量並在 Milvus 套件中搜尋相似的嵌入式元件。
    2. +
    3. 使用 Milvus 客戶端的搜尋方法找出最相似的向量。
    4. +
    5. 指定我們要擷取的輸出欄位,包括匹配視訊片段的元資料。
    6. +
    7. 提供一個範例,說明如何將此函式用於查詢視訊,首先產生其嵌入,然後用於搜尋。
    8. +
    9. 列印搜尋結果,包括相關的元資料和相似度得分。
    10. +
    +

    透過實作這些函式,您已建立了完整的工作流程,可在 Milvus 中儲存影片內嵌並執行相似性搜尋。此設定可根據 Twelve Labs 的 Embed API 所產生的多模態嵌入內容,有效率地檢索相似的視訊內容。

    +

    優化效能

    好了,讓我們將此應用程式提升到更高層次!在處理大規模的視訊集合時,效能是關鍵。為了最佳化,我們應該執行批次處理,以產生嵌入並插入 Milvus。這樣,我們就能同時處理多個視訊,大幅縮短整體處理時間。此外,我們還可以利用Milvus 的分割功能來更有效率地組織資料,例如依視訊類別或時間段來組織資料。這可讓我們只搜尋相關的分區,從而加快查詢速度。

    +

    另一個優化技巧是對經常存取的嵌入或搜尋結果使用快取機制。這可大幅改善常用查詢的回應時間。別忘了根據您的特定資料集和查詢模式來微調 Milvus 的索引參數- 稍作調整就能大大提升搜尋效能。

    +

    進階功能

    現在,讓我們加入一些很酷的功能,讓我們的應用程式脫穎而出!我們可以實作混合搜尋,結合文字與視訊查詢。事實上,Twelve Labs Embed API 也可以為您的文字查詢產生文字嵌入。試想一下,讓使用者同時輸入文字描述和範例視訊片段 - 我們會為兩者產生嵌入式內容,並在 Milvus 中執行加權搜尋。這將帶給我們超精確的結果。

    +

    另一個很棒的新增功能是在視訊中進行時間搜尋我們可以將長影片分割成較小的片段,每個片段都有自己的 embedding。如此一來,使用者就可以找到影片中的特定時刻,而不只是整個片段。而且,為什麼不加入一些基本的視訊分析呢?我們可以使用 embeddings 來聚類相似的視訊片段、偵測趨勢,甚至找出大型視訊集合中的異常值。

    +

    錯誤處理和日誌

    讓我們面對現實吧,事情可能會出錯,當出錯時,我們需要做好準備。實施強大的錯誤處理是非常重要的。我們應該在 try-except 區塊中包覆我們的 API 呼叫和資料庫作業,並在發生故障時向使用者提供資訊豐富的錯誤訊息。對於與網路相關的問題,使用指數遞減 (exponential backoff) 實作重試 (retries) 有助於從容處理暫時的故障。

    +

    至於日誌,它是我們調試和監控的好朋友。我們應該使用Python 的日誌模組來追蹤整個應用程式中的重要事件、錯誤和效能指標。讓我們設定不同的日誌層級 - DEBUG 用於開發,INFO 用於一般操作,ERROR 用於重要問題。別忘了實施日誌輪換以管理檔案大小。有了適當的日誌,我們就能快速找出並解決問題,確保我們的視訊搜尋應用程式即使在擴充時也能順暢運作。

    +

    總結

    恭喜您!您現在已經使用 Twelve Labs 的 Embed API 和 Milvus 建立了一個功能強大的語意視訊搜尋應用程式。此整合功能可讓您以前所未有的精確度和效率處理、儲存和擷取視訊內容。透過利用多模態嵌入,您建立了一個能夠理解視訊資料細微差異的系統,為內容發現、推薦系統和進階視訊分析開啟了令人振奮的可能性。

    +

    當您繼續開發和完善您的應用程式時,請記住 Twelve Labs 的進階嵌入生成與 Milvus 的可擴展向量儲存的結合,為應付更複雜的視訊理解挑戰提供了堅實的基礎。我們鼓勵您嘗試使用所討論的進階功能,並推動視訊搜尋與分析的可能性。

    diff --git a/localization/v2.5.x/site/zh-hant/menuStructure/zh-hant.json b/localization/v2.5.x/site/zh-hant/menuStructure/zh-hant.json new file mode 100644 index 000000000..0ccdfee58 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/menuStructure/zh-hant.json @@ -0,0 +1,2196 @@ +[ + { + "label": "關於 Milvus", + "id": "about", + "isMenu": true, + "order": 0, + "children": [ + { + "label": "什麼是 Milvus", + "id": "overview.md", + "order": 0, + "children": [] + }, + { + "label": "Milvus 採納者", + "id": "milvus_adopters.md", + "order": 1, + "children": [] + }, + { + "label": "Milvus 路線圖", + "id": "roadmap.md", + "order": 2, + "children": [] + }, + { + "label": "新聞稿", + "id": "release_notes.md", + "order": 3, + "children": [] + }, + { + "label": "基準", + "id": "benchmark.md", + "order": 4, + "children": [] + }, + { + "label": "比較", + "id": "comparison.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "開始使用", + "id": "getstarted", + "isMenu": true, + "order": 1, + "children": [ + { + "label": "快速入門", + "id": "quickstart.md", + "order": 0, + "children": [] + }, + { + "label": "安裝 Milvus", + "id": "install_milvus", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "install-overview.md", + "order": 0, + "children": [] + }, + { + "label": "運行 Milvus Lite", + "id": "milvus_lite.md", + "order": 1, + "children": [] + }, + { + "label": "單機執行 Milvus", + "id": "run_milvus_docker", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "要求", + "id": "prerequisite-docker.md", + "order": 0, + "children": [] + }, + { + "label": "Docker (Linux)", + "id": "install_standalone-docker.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose (Linux)", + "id": "install_standalone-docker-compose.md", + "order": 2, + "children": [] + }, + { + "label": "Docker 桌面 (Windows)", + "id": "install_standalone-windows.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "運行 Milvus Distributed", + "id": "run_milvus_k8s", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "要求", + "id": "prerequisite-helm.md", + "order": 0, + "children": [] + }, + { + "label": "Milvus 操作員", + "id": "install_cluster-milvusoperator.md", + "order": 1, + "children": [] + }, + { + "label": "舵手圖", + "id": "install_cluster-helm.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "使用 GPU 執行 Milvus", + "id": "run_milvus_gpu", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "要求", + "id": "prerequisite-gpu.md", + "order": 0, + "children": [] + }, + { + "label": "舵手圖", + "id": "install_cluster-helm-gpu.md", + "order": 1, + "children": [] + }, + { + "label": "Docker Compose", + "id": "install_standalone-docker-compose-gpu.md", + "order": 2, + "children": [] + } + ] + } + ] + }, + { + "label": "安裝 SDK", + "id": "install_sdks", + "order": 2, + "children": [ + { + "label": "PyMilvus", + "id": "install-pymilvus.md", + "order": 0, + "children": [] + }, + { + "label": "Java SDK", + "id": "install-java.md", + "order": 1, + "children": [] + }, + { + "label": "Go SDK", + "id": "install-go.md", + "order": 2, + "children": [] + }, + { + "label": "Node.js SDK", + "id": "install-node.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "概念", + "id": "concepts", + "isMenu": true, + "order": 2, + "children": [ + { + "label": "建築", + "id": "architecture", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "architecture_overview.md", + "order": 0, + "children": [] + }, + { + "label": "儲存/計算", + "id": "four_layers.md", + "order": 1, + "children": [] + }, + { + "label": "主要元件", + "id": "main_components.md", + "order": 2, + "children": [] + }, + { + "label": "資料處理", + "id": "data_processing.md", + "order": 3, + "children": [] + }, + { + "label": "知識領域", + "id": "knowhere.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "位元組", + "id": "bitset.md", + "order": 1, + "children": [] + }, + { + "label": "多租戶", + "id": "multi_tenancy.md", + "order": 3, + "children": [] + }, + { + "label": "時間戳記", + "id": "timestamp.md", + "order": 4, + "children": [] + }, + { + "label": "時間同步", + "id": "time_sync.md", + "order": 6, + "children": [] + }, + { + "label": "向量索引", + "id": "vector_index", + "order": 7, + "isMenu": true, + "children": [ + { + "label": "記憶體索引", + "id": "index.md", + "order": 0, + "children": [] + }, + { + "label": "磁碟索引", + "id": "disk_index.md", + "order": 1, + "children": [] + }, + { + "label": "GPU 索引", + "id": "gpu_index.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "標量指數", + "id": "scalar_index.md", + "order": 8, + "children": [] + }, + { + "label": "公制類型", + "id": "metric.md", + "order": 9, + "children": [] + }, + { + "label": "一致性等級", + "id": "consistency.md", + "order": 10, + "children": [] + }, + { + "label": "記憶體內複製", + "id": "replica.md", + "order": 11, + "children": [] + }, + { + "label": "術語", + "id": "glossary.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "使用者指南", + "id": "userguide", + "isMenu": true, + "order": 3, + "children": [ + { + "label": "資料庫", + "id": "manage_databases.md", + "order": 0, + "children": [] + }, + { + "label": "收藏集", + "id": "collections", + "order": 1, + "children": [ + { + "label": "收藏說明", + "id": "manage-collections.md", + "order": 0, + "children": [] + }, + { + "label": "建立收藏集", + "id": "create-collection.md", + "order": 1, + "children": [] + }, + { + "label": "立即建立收藏集", + "id": "create-collection-instantly.md", + "order": 2, + "children": [] + }, + { + "label": "檢視館藏", + "id": "view-collections.md", + "order": 3, + "children": [] + }, + { + "label": "修改收藏集", + "id": "modify-collection.md", + "order": 4, + "children": [] + }, + { + "label": "載入與釋放", + "id": "load-and-release.md", + "order": 5, + "children": [] + }, + { + "label": "管理磁碟分割", + "id": "manage-partitions.md", + "order": 6, + "children": [] + }, + { + "label": "管理別名", + "id": "manage-aliases.md", + "order": 7, + "children": [] + }, + { + "label": "掉落收集", + "id": "drop-collection.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "模式與資料欄位", + "id": "schema", + "order": 2, + "children": [ + { + "label": "模式說明", + "id": "schema.md", + "order": 0, + "children": [] + }, + { + "label": "主要欄位與自動識別", + "id": "primary-field.md", + "order": 1, + "children": [] + }, + { + "label": "密集向量", + "id": "dense-vector.md", + "order": 2, + "children": [] + }, + { + "label": "二進位向量", + "id": "binary-vector.md", + "order": 3, + "children": [] + }, + { + "label": "稀疏向量", + "id": "sparse_vector.md", + "order": 4, + "children": [] + }, + { + "label": "字串欄位", + "id": "string.md", + "order": 5, + "children": [] + }, + { + "label": "號碼欄位", + "id": "number.md", + "order": 6, + "children": [] + }, + { + "label": "JSON 欄位", + "id": "use-json-fields.md", + "order": 7, + "children": [] + }, + { + "label": "陣列欄位", + "id": "array_data_type.md", + "order": 8, + "children": [] + }, + { + "label": "動態領域", + "id": "enable-dynamic-field.md", + "order": 9, + "children": [] + }, + { + "label": "Nullable & Default", + "id": "nullable-and-default.md", + "order": 10, + "children": [] + }, + { + "label": "分析器", + "id": "analyzer", + "order": 11, + "children": [ + { + "label": "分析儀總覽", + "id": "analyzer-overview.md", + "order": 0, + "children": [] + }, + { + "label": "內建分析儀", + "id": "built-in-analyzers", + "order": 1, + "children": [ + { + "label": "標準", + "id": "standard-analyzer.md", + "order": 0, + "children": [] + }, + { + "label": "英語", + "id": "english-analyzer.md", + "order": 1, + "children": [] + }, + { + "label": "中文", + "id": "chinese-analyzer.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "計時器", + "id": "tokenizers", + "order": 2, + "children": [ + { + "label": "標準", + "id": "standard-tokenizer.md", + "order": 0, + "children": [] + }, + { + "label": "白色空間", + "id": "whitespace-tokenizer.md", + "order": 1, + "children": [] + }, + { + "label": "捷霸", + "id": "jieba-tokenizer.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "濾波器", + "id": "filters", + "order": 3, + "children": [ + { + "label": "小寫", + "id": "lowercase-filter.md", + "order": 0, + "children": [] + }, + { + "label": "ASCII 折疊", + "id": "ascii-folding-filter.md", + "order": 1, + "children": [] + }, + { + "label": "Alphanumonly", + "id": "alphanumonly-filter.md", + "order": 2, + "children": [] + }, + { + "label": "僅限 Cnalphanum", + "id": "cnalphanumonly-filter.md", + "order": 3, + "children": [] + }, + { + "label": "顏色", + "id": "cncharonly-filter.md", + "order": 4, + "children": [] + }, + { + "label": "長度", + "id": "length-filter.md", + "order": 5, + "children": [] + }, + { + "label": "停止", + "id": "stop-filter.md", + "order": 6, + "children": [] + }, + { + "label": "分解器", + "id": "decompounder-filter.md", + "order": 7, + "children": [] + }, + { + "label": "莖類", + "id": "stemmer-filter.md", + "order": 8, + "children": [] + } + ] + } + ] + }, + { + "label": "上手操作", + "id": "schema-hands-on.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "插入與刪除", + "id": "insert-and-delete", + "order": 3, + "children": [ + { + "label": "插入實體", + "id": "insert-update-delete.md", + "order": 0, + "children": [] + }, + { + "label": "Upsert 實體", + "id": "upsert-entities.md", + "order": 1, + "children": [] + }, + { + "label": "刪除實體", + "id": "delete-entities.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "索引", + "id": "manage_indexes", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "向量索引", + "id": "index-vector-fields.md", + "order": 0, + "children": [] + }, + { + "label": "標量索引", + "id": "scalar-index", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "索引標量欄位", + "id": "index-scalar-fields.md", + "order": 1, + "children": [] + }, + { + "label": "位圖索引", + "id": "bitmap.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "支援 GPU 的索引", + "id": "index-with-gpu.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "搜尋與重新排名", + "id": "search-rerank", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "基本 ANN 搜尋", + "id": "single-vector-search.md", + "order": 0, + "children": [] + }, + { + "label": "篩選搜尋", + "id": "filtered-search.md", + "order": 1, + "children": [] + }, + { + "label": "範圍搜尋", + "id": "range-search.md", + "order": 2, + "children": [] + }, + { + "label": "群組搜尋", + "id": "grouping-search.md", + "order": 3, + "children": [] + }, + { + "label": "混合搜尋", + "id": "multi-vector-search.md", + "order": 4, + "children": [] + }, + { + "label": "查詢", + "id": "get-and-scalar-query.md", + "order": 5, + "children": [] + }, + { + "label": "過濾", + "id": "filtering", + "order": 6, + "children": [ + { + "label": "篩選說明", + "id": "boolean.md", + "order": 0, + "children": [] + }, + { + "label": "基本操作員", + "id": "basic-operators.md", + "order": 1, + "children": [] + }, + { + "label": "過濾模板", + "id": "filtering-templating.md", + "order": 2, + "children": [] + }, + { + "label": "JSON 運算符號", + "id": "json-operators.md", + "order": 3, + "children": [] + }, + { + "label": "陣列運算元", + "id": "array-operators.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "全文檢索", + "id": "full-text-search.md", + "order": 7, + "children": [] + }, + { + "label": "文字匹配", + "id": "keyword-match.md", + "order": 8, + "children": [] + }, + { + "label": "搜尋迭代器", + "id": "with-iterators.md", + "order": 9, + "children": [] + }, + { + "label": "使用磁碟分割金鑰", + "id": "use-partition-key.md", + "order": 9, + "children": [] + }, + { + "label": "重新排名", + "id": "reranking.md", + "order": 10, + "children": [] + } + ] + } + ] + }, + { + "label": "機型", + "id": "models", + "isMenu": true, + "order": 4, + "children": [ + { + "label": "嵌入", + "id": "embeddings", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "embeddings.md", + "order": 0, + "children": [] + }, + { + "label": "OpenAI", + "id": "embed-with-openai.md", + "order": 1, + "children": [] + }, + { + "label": "句子變形", + "id": "embed-with-sentence-transform.md", + "order": 2, + "children": [] + }, + { + "label": "BGE M3", + "id": "embed-with-bgm-m3.md", + "order": 3, + "children": [] + }, + { + "label": "SPLADE", + "id": "embed-with-splade.md", + "order": 5, + "children": [] + }, + { + "label": "航程", + "id": "embed-with-voyage.md", + "order": 6, + "children": [] + }, + { + "label": "Jina AI", + "id": "embed-with-jina.md", + "order": 7, + "children": [] + }, + { + "label": "Cohere", + "id": "embed-with-cohere.md", + "order": 8, + "children": [] + }, + { + "label": "導師", + "id": "embed-with-instructor.md", + "order": 9, + "children": [] + }, + { + "label": "Mistral AI", + "id": "embed-with-mistral-ai.md", + "order": 10, + "children": [] + }, + { + "label": "Nomic", + "id": "embed-with-nomic.md", + "order": 11, + "children": [] + }, + { + "label": "mGTE", + "id": "embed-with-mgte.md", + "order": 12, + "children": [] + } + ] + }, + { + "label": "重新排名者", + "id": "rerankers", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "rerankers-overview.md", + "order": 0, + "children": [] + }, + { + "label": "BGE", + "id": "rerankers-bge.md", + "order": 1, + "children": [] + }, + { + "label": "Cohere", + "id": "rerankers-cohere.md", + "order": 2, + "children": [] + }, + { + "label": "交叉編碼器", + "id": "rerankers-cross-encoder.md", + "order": 3, + "children": [] + }, + { + "label": "航程", + "id": "rerankers-voyage.md", + "order": 4, + "children": [] + }, + { + "label": "Jina AI", + "id": "rerankers-jina.md", + "order": 5, + "children": [] + } + ] + } + ] + }, + { + "label": "資料匯入", + "id": "data_import", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "準備原始資料", + "id": "prepare-source-data.md", + "order": 0, + "children": [] + }, + { + "label": "匯入資料", + "id": "import-data.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "Milvus 移動", + "id": "milvus_migration", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "概述", + "id": "migrate_overview.md", + "order": 0, + "children": [] + }, + { + "label": "安裝遷移工具", + "id": "milvusdm_install.md", + "order": 1, + "children": [] + }, + { + "label": "從 Elasticsearch", + "id": "es2m.md", + "order": 2, + "children": [] + }, + { + "label": "來自 Faiss", + "id": "f2m.md", + "order": 3, + "children": [] + }, + { + "label": "從 Milvus 1.x", + "id": "m2m.md", + "order": 4, + "children": [] + }, + { + "label": "從 Milvus 2.3.x", + "id": "from-m2x.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "管理指南", + "id": "admin_guide", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "部署", + "id": "deployment", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "現場", + "id": "on_premises", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "使用 Docker", + "id": "configure-docker.md", + "order": 0, + "children": [] + }, + { + "label": "搭配舵手", + "id": "configure-helm.md", + "order": 1, + "children": [] + }, + { + "label": "與 Milvus 操作員", + "id": "configure_operator.md", + "order": 2, + "children": [] + }, + { + "label": "分配資源", + "id": "allocate.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "雲", + "id": "on_cloud", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "在 AWS 上部署", + "id": "eks.md", + "order": 1, + "children": [] + }, + { + "label": "在 GCP 上部署", + "id": "gcp.md", + "order": 2, + "children": [] + }, + { + "label": "在 Azure 上部署", + "id": "azure.md", + "order": 3, + "children": [] + }, + { + "label": "在 OpenShift 上部署", + "id": "openshift.md", + "order": 4, + "children": [] + }, + { + "label": "第 7 層負載平衡", + "id": "layer-7-lb", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "aws_layer7.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcp_layer7.md", + "order": 2, + "children": [] + }, + { + "label": "天藍", + "id": "ingress.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "雲端儲存", + "id": "cloud-storage", + "order": 6, + "isMenu": true, + "children": [ + { + "label": "AWS", + "id": "s3.md", + "order": 1, + "children": [] + }, + { + "label": "GCP", + "id": "gcs.md", + "order": 2, + "children": [] + }, + { + "label": "天藍", + "id": "abs.md", + "order": 3, + "children": [] + } + ] + } + ] + } + ] + }, + { + "label": "組態", + "id": "configuration", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "系統組態", + "id": "system_configuration.md", + "order": 0, + "children": [] + }, + { + "label": "飛行中", + "id": "dynamic_config.md", + "order": 1, + "children": [] + }, + { + "label": "限制收集計數", + "id": "limit_collection_counts.md", + "order": 2, + "children": [] + }, + { + "label": "設定 Chunk 快取", + "id": "chunk_cache.md", + "order": 3, + "children": [] + }, + { + "label": "協調員 HA", + "id": "coordinator_ha.md", + "order": 4, + "children": [] + }, + { + "label": "使用本機磁碟的 QueryNode", + "id": "configure-querynode-localdisk.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "管理相依性", + "id": "manage_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "使用 Docker 或 Helm", + "id": "docker_helm_dependencies", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "物件儲存", + "id": "deploy_s3.md", + "order": 0, + "children": [] + }, + { + "label": "Meta 儲存空間", + "id": "deploy_etcd.md", + "order": 1, + "children": [] + }, + { + "label": "訊息儲存", + "id": "deploy_pulsar.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "與 Milvus 操作員", + "id": "milvus_operator_dependencies", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "物件儲存", + "id": "object_storage_operator.md", + "order": 0, + "children": [] + }, + { + "label": "Meta 儲存空間", + "id": "meta_storage_operator.md", + "order": 1, + "children": [] + }, + { + "label": "訊息儲存", + "id": "message_storage_operator.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "將 Pulsa 與 Milvus 搭配使用", + "id": "pulsar_dependencies", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "升級至 Pulsar v3", + "id": "upgrade-pulsar-v3.md", + "order": 0, + "children": [] + }, + { + "label": "繼續使用 Pulsar v2", + "id": "use-pulsar-v2.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "縮放", + "id": "scaling", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "規模群組", + "id": "scaleout.md", + "order": 0, + "children": [] + }, + { + "label": "規模依賴性", + "id": "scale-dependencies.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "升級", + "id": "upgrade_milvus", + "order": 7, + "children": [ + { + "label": "升級 Milvus 集群", + "id": "upgrade_milvus_cluster-operator.md", + "order": 0, + "children": [] + }, + { + "label": "升級 Milvus 單機", + "id": "upgrade_milvus_standalone-operator.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "監控、警示與日誌", + "id": "monitor_alert_log", + "order": 8, + "isMenu": true, + "children": [ + { + "label": "監控", + "id": "monitoring", + "order": 0, + "isMenu": true, + "children": [ + { + "label": "建築", + "id": "monitor_overview.md", + "order": 0, + "children": [] + }, + { + "label": "部署監控服務", + "id": "monitor.md", + "order": 1, + "children": [] + }, + { + "label": "可視化指標", + "id": "visualize.md", + "order": 2, + "children": [] + }, + { + "label": "Milvus 指標儀表板", + "id": "metrics_dashboard.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "警報", + "id": "alerts", + "order": 1, + "isMenu": true, + "children": [ + { + "label": "建立警報", + "id": "alert.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "日誌", + "id": "logs", + "order": 2, + "isMenu": true, + "children": [ + { + "label": "設定 Grafana Loki", + "id": "configure_grafana_loki.md", + "order": 0, + "children": [] + }, + { + "label": "設定存取日誌", + "id": "configure_access_logs.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "追蹤", + "id": "trace", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "Jaeger 追蹤", + "id": "config_jaeger_tracing.md", + "order": 0, + "children": [] + } + ] + } + ] + }, + { + "label": "資源群組", + "id": "resource_groups", + "order": 9, + "children": [ + { + "label": "管理資源群組", + "id": "resource_group.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "儲存優化", + "id": "storage_optimization", + "order": 10, + "isMenu": true, + "children": [ + { + "label": "使用 mmap", + "id": "mmap.md", + "order": 0, + "children": [] + }, + { + "label": "聚類壓縮", + "id": "clustering-compaction.md", + "order": 1, + "children": [] + } + ] + }, + { + "label": "安全性", + "id": "security", + "order": 11, + "isMenu": true, + "children": [ + { + "label": "啟用驗證", + "id": "authenticate.md", + "order": 0, + "children": [] + }, + { + "label": "使用者、權限和角色", + "id": "users_and_roles.md", + "order": 10, + "children": [] + }, + { + "label": "啟用 RBAC", + "id": "rbac.md", + "order": 1, + "isMenu": true, + "children": [] + }, + { + "label": "傳輸中加密", + "id": "tls.md", + "order": 2, + "children": [] + }, + { + "label": "使用 SASL/SSL 連線至 Kafka", + "id": "connect_kafka_ssl.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus WebUI", + "id": "milvus-webui.md", + "order": "12", + "children": [] + } + ] + }, + { + "label": "工具", + "id": "tools", + "isMenu": true, + "order": 6, + "children": [ + { + "label": "Attu (Milvus GUI)", + "id": "milvus_attu", + "order": 0, + "externalLink": "https://github.com/zilliztech/attu", + "children": [] + }, + { + "label": "Milvus 備份", + "id": "milvus_backup", + "order": 1, + "children": [ + { + "label": "概述", + "id": "milvus_backup_overview.md", + "order": 0, + "children": [] + }, + { + "label": "指令", + "id": "milvus_backup_cli.md", + "order": 1, + "children": [] + }, + { + "label": "RESTful API", + "id": "milvus_backup_api.md", + "order": 2, + "children": [] + }, + { + "label": "常見案例", + "id": "common-cases", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "在單一儲存桶中的實體間遷移", + "id": "shared-bucket-backup-and-restore.md", + "order": 0, + "children": [] + }, + { + "label": "跨儲存桶在實體間遷移", + "id": "cross-bucket-backup-and-restore.md", + "order": 1, + "children": [] + }, + { + "label": "在跨 S3 環境的 Instances 之間遷移", + "id": "multi-storage-backup-and-restore.md", + "order": 2, + "children": [] + }, + { + "label": "在一個實例中備份和還原", + "id": "single-instance-backup-and-restore.md", + "order": 3, + "children": [] + } + ] + } + ] + }, + { + "label": "觀鳥者", + "id": "birdwatcher", + "order": 2, + "children": [ + { + "label": "概述", + "id": "birdwatcher_overview.md", + "order": 0, + "children": [] + }, + { + "label": "安裝指南", + "id": "birdwatcher_install_guides.md", + "order": 1, + "children": [] + }, + { + "label": "使用指南", + "id": "birdwatcher_usage_guides.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Milvus CDC", + "id": "milvus_cdc", + "order": 3, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "milvus-cdc-overview.md", + "order": 0, + "children": [] + }, + { + "label": "部署 CDC 伺服器", + "id": "deploy-cdc-server.md", + "order": 1, + "children": [] + }, + { + "label": "管理 CDC 任務", + "id": "manage-cdc-tasks.md", + "order": 2, + "children": [] + }, + { + "label": "監控", + "id": "cdc-monitoring.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "Milvus CLI", + "id": "cli", + "order": 4, + "isMenu": true, + "children": [ + { + "label": "概述", + "id": "cli_overview.md", + "order": 0, + "children": [] + }, + { + "label": "安裝", + "id": "install_cli.md", + "order": 1, + "children": [] + }, + { + "label": "指令", + "id": "cli_commands.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "Milvus 連接器", + "id": "milvus_connectors", + "order": 5, + "isMenu": true, + "children": [ + { + "label": "火花", + "id": "integrate_with_spark.md", + "order": 0, + "children": [] + } + ] + }, + { + "label": "Milvus 尺寸工具", + "id": "sizing", + "order": 6, + "externalLink": "https://milvus.io/tools/sizing/", + "children": [] + }, + { + "label": "Powershell Milvus 用戶端", + "id": "milvus_powershell", + "order": 8, + "externalLink": "https://github.com/rrg92/ps-milvus/blob/main/docs/integrate_powershell.md", + "children": [] + } + ] + }, + { + "label": "整合", + "id": "integrations", + "isMenu": true, + "order": 8, + "children": [ + { + "label": "概述", + "id": "integrations_overview.md", + "order": 0, + "children": [] + }, + { + "label": "嵌入模型", + "id": "integrate-embeddings-models", + "order": 1, + "children": [ + { + "label": "OpenAI", + "id": "integrate_with_openai.md", + "order": 0, + "children": [] + }, + { + "label": "Cohere", + "id": "integrate_with_cohere.md", + "order": 1, + "children": [] + }, + { + "label": "擁抱臉", + "id": "integrate_with_hugging-face.md", + "order": 2, + "children": [] + }, + { + "label": "PyTorch", + "id": "integrate_with_pytorch.md", + "order": 3, + "children": [] + }, + { + "label": "句子變形", + "id": "integrate_with_sentencetransformers.md", + "order": 4, + "children": [] + }, + { + "label": "VoyageAI", + "id": "integrate_with_voyageai.md", + "order": 8, + "children": [] + }, + { + "label": "Jina AI", + "id": "integrate_with_jina.md", + "order": 11, + "children": [] + }, + { + "label": "十二實驗室", + "id": "video_search_with_twelvelabs_and_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "BentoML", + "id": "integrate_with_bentoml.md", + "order": 5, + "children": [] + } + ] + }, + { + "label": "法學碩士", + "id": "integrate-llms", + "order": 2, + "children": [ + { + "label": "vLLM", + "id": "milvus_rag_with_vllm.md", + "order": 0, + "children": [] + }, + { + "label": "Mistral AI", + "id": "llama_agents_metadata.md", + "order": 1, + "children": [] + }, + { + "label": "煙花", + "id": "build_RAG_with_milvus_and_fireworks.md", + "order": 2, + "children": [] + }, + { + "label": "Lepton", + "id": "build_RAG_with_milvus_and_lepton.md", + "order": 3, + "children": [] + }, + { + "label": "SiliconFlow", + "id": "build_RAG_with_milvus_and_siliconflow.md", + "order": 4, + "children": [] + }, + { + "label": "SambaNova", + "id": "use_milvus_with_sambanova.md", + "order": 5, + "children": [] + }, + { + "label": "雙子座", + "id": "build_RAG_with_milvus_and_gemini.md", + "order": 6, + "children": [] + }, + { + "label": "Ollama", + "id": "build_RAG_with_milvus_and_ollama.md", + "order": 7, + "children": [] + }, + { + "label": "深度搜尋", + "id": "build_RAG_with_milvus_and_deepseek.md", + "order": 8, + "children": [] + } + ] + }, + { + "label": "編曲", + "id": "orchestrate-with-milvus", + "order": 3, + "children": [ + { + "label": "LangChain", + "id": "langchain", + "order": 0, + "children": [ + { + "label": "基本用法", + "id": "basic_usage_langchain.md", + "order": 1, + "children": [] + }, + { + "label": "RAG", + "id": "integrate_with_langchain.md", + "order": 2, + "children": [] + }, + { + "label": "混合搜尋", + "id": "milvus_hybrid_search_retriever.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "LlamaIndex", + "id": "llamaindex", + "order": 1, + "children": [ + { + "label": "RAG", + "id": "integrate_with_llamaindex.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "DSPy", + "id": "integrate_with_dspy.md", + "order": 2, + "children": [] + }, + { + "label": "FastGPT", + "id": "integrate_with_fastgpt.md", + "order": 3, + "children": [] + }, + { + "label": "乾草堆", + "id": "integrate_with_haystack.md", + "order": 4, + "children": [] + }, + { + "label": "Kotaemon", + "id": "kotaemon_with_milvus.md", + "order": 5, + "children": [] + }, + { + "label": "Dify", + "id": "dify_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "朗流", + "id": "rag_with_langflow.md", + "order": 7, + "children": [] + }, + { + "label": "DocsGPT", + "id": "use_milvus_in_docsgpt.md", + "order": 9, + "children": [] + }, + { + "label": "PrivateGPT", + "id": "use_milvus_in_private_gpt.md", + "order": 10, + "children": [] + }, + { + "label": "動態", + "id": "milvus_rag_with_dynamiq.md", + "order": 11, + "children": [] + } + ] + }, + { + "label": "代理商", + "id": "integrate-agents", + "order": 4, + "children": [ + { + "label": "MemGPT", + "id": "integrate_with_memgpt.md", + "order": 0, + "children": [] + }, + { + "label": "駱駝", + "id": "integrate_with_camel.md", + "order": 1, + "children": [] + }, + { + "label": "記憶體0", + "id": "quickstart_mem0_with_milvus.md", + "order": 2, + "children": [] + } + ] + }, + { + "label": "知識工程", + "id": "knowledge-engineering", + "order": 5, + "children": [ + { + "label": "為什麼", + "id": "integrate_with_whyhow.md", + "order": 0, + "children": [] + }, + { + "label": "萬娜", + "id": "integrate_with_vanna.md", + "order": 1, + "children": [] + }, + { + "label": "知識表", + "id": "knowledge_table_with_milvus.md", + "order": 2, + "children": [] + }, + { + "label": "Cognee", + "id": "build_RAG_with_milvus_and_cognee.md", + "order": 3, + "children": [] + } + ] + }, + { + "label": "評估與可觀察性", + "id": "evaluation-observability", + "order": 6, + "children": [ + { + "label": "拉格", + "id": "integrate_with_ragas.md", + "order": 0, + "children": [] + }, + { + "label": "LangFuse", + "id": "integrate_with_langfuse.md", + "order": 1, + "children": [] + }, + { + "label": "五十一", + "id": "integrate_with_voxel51.md", + "order": 2, + "children": [] + }, + { + "label": "Arize Pheonix", + "id": "evaluation_with_phoenix.md", + "order": 3, + "children": [] + }, + { + "label": "深度評估", + "id": "evaluation_with_deepeval.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "資料來源", + "id": "data-sources", + "order": 7, + "children": [ + { + "label": "Airbyte", + "id": "integrate_with_airbyte.md", + "order": 0, + "children": [] + }, + { + "label": "卡夫卡", + "id": "kafka-connect-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "Apify", + "id": "apify_milvus_rag.md", + "order": 2, + "children": [] + }, + { + "label": "非結構化", + "id": "rag_with_milvus_and_unstructured.md", + "order": 3, + "children": [] + }, + { + "label": "PII 遮罩器", + "id": "RAG_with_pii_and_milvus.md", + "order": 4, + "children": [] + } + ] + }, + { + "label": "其他", + "id": "other-integrations", + "order": 8, + "children": [ + { + "label": "雪花", + "id": "integrate_with_snowpark.md", + "order": 0, + "children": [] + }, + { + "label": "手臂", + "id": "build_rag_on_arm.md", + "order": 1, + "children": [] + } + ] + } + ] + }, + { + "label": "教學", + "id": "tutorials", + "isMenu": true, + "order": 7, + "children": [ + { + "label": "概述", + "id": "tutorials-overview.md", + "order": 0, + "children": [] + }, + { + "label": "使用 Milvus 建立 RAG", + "id": "build-rag-with-milvus.md", + "order": 1, + "children": [] + }, + { + "label": "進階 RAG", + "id": "how_to_enhance_your_rag.md", + "order": 2, + "children": [] + }, + { + "label": "使用 Milvus 進行全文檢索", + "id": "full_text_search_with_milvus.md", + "order": 3, + "children": [] + }, + { + "label": "使用 Milvus 進行混合搜尋", + "id": "hybrid_search_with_milvus.md", + "order": 4, + "children": [] + }, + { + "label": "使用 Milvus 搜尋圖片", + "id": "image_similarity_search.md", + "order": 5, + "children": [] + }, + { + "label": "多式聯運 RAG", + "id": "multimodal_rag_with_milvus.md", + "order": 6, + "children": [] + }, + { + "label": "使用 Milvus 顯示 RAG", + "id": "graph_rag_with_milvus.md", + "order": 7, + "children": [] + }, + { + "label": "情境擷取", + "id": "contextual_retrieval_with_milvus.md", + "order": 8, + "children": [] + }, + { + "label": "HDBSCAN 集群", + "id": "hdbscan_clustering_with_milvus.md", + "order": 9, + "children": [] + }, + { + "label": "使用 ColPali 進行多模式檢索", + "id": "use_ColPali_with_milvus.md", + "order": 10, + "children": [] + }, + { + "label": "向量可視化", + "id": "vector_visualization.md", + "order": 11, + "children": [] + }, + { + "label": "電影推薦", + "id": "movie_recommendation_with_milvus.md", + "order": 12, + "children": [] + }, + { + "label": "使用 Matryoshka 嵌入式進行漏斗搜尋", + "id": "funnel_search_with_matryoshka.md", + "order": 13, + "children": [] + }, + { + "label": "使用 Attu 快速入門", + "id": "quickstart_with_attu.md", + "order": 14, + "children": [] + }, + { + "label": "在 asyncio 中使用 AsyncMilvusClient", + "id": "use-async-milvus-client-with-asyncio.md", + "order": 15, + "children": [] + }, + { + "label": "探索更多", + "id": "explore-more", + "order": 99, + "children": [ + { + "label": "問題回答系統", + "id": "question_answering_system.md", + "order": 5, + "children": [] + }, + { + "label": "推薦系統", + "id": "recommendation_system.md", + "order": 6, + "children": [] + }, + { + "label": "視訊相似度搜尋", + "id": "video_similarity_search.md", + "order": 7, + "children": [] + }, + { + "label": "音訊相似度搜尋", + "id": "audio_similarity_search.md", + "order": 8, + "children": [] + }, + { + "label": "DNA 序列分類", + "id": "dna_sequence_classification.md", + "order": 9, + "children": [] + }, + { + "label": "文字搜尋引擎", + "id": "text_search_engine.md", + "order": 10, + "children": [] + }, + { + "label": "文字轉圖片搜尋引擎", + "id": "text_image_search.md", + "order": 11, + "children": [] + }, + { + "label": "影像重複刪除系統", + "id": "image_deduplication_system.md", + "order": 12, + "children": [] + } + ] + } + ] + }, + { + "label": "常見問題", + "id": "faq", + "isMenu": true, + "order": 9, + "children": [ + { + "label": "效能常見問題", + "id": "performance_faq.md", + "order": 0, + "children": [] + }, + { + "label": "產品常見問題", + "id": "product_faq.md", + "order": 1, + "children": [] + }, + { + "label": "營運常見問題", + "id": "operational_faq.md", + "order": 2, + "children": [] + }, + { + "label": "Milvus 限制", + "id": "limitations.md", + "order": 3, + "children": [] + }, + { + "label": "疑難排解", + "id": "troubleshooting.md", + "order": 4, + "children": [] + } + ] + } +] \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/es2m.json b/localization/v2.5.x/site/zh-hant/migrate/es2m.json new file mode 100644 index 000000000..16228295c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/es2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n workMode: \"elasticsearch\" # operational mode of the migration job.\n reader:\n bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.\nmeta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.\n mode: \"config\" # specifies the source for meta configs. currently, onlly `config` is supported.\n version: \"8.9.1\"\n index: \"qatest_index\" # identifies the Elasticsearch index to migrate data from.\n fields: # fields within the Elasticsearch index to be migrated.\n - name: \"my_vector\" # name of the Elasticsearch field.\n type: \"dense_vector\" # data type of the Elasticsearch field.\n dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.\n - name: \"id\"\n pk: true # specifies if the field serves as a primary key.\n type: \"long\"\n - name: \"num\"\n type: \"integer\"\n - name: \"double1\"\n type: \"double\"\n - name: \"text1\"\n maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.\n type: \"text\"\n - name: \"bl1\"\n type: \"boolean\"\n - name: \"float1\"\n type: \"float\"\n milvus: # configs specific to creating the collection in Milvus 2.x\n collection: \"Collection_01\" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.\n closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.\n shardNum: 2 # number of shards to be created in the collection.\n consistencyLevel: Strong # consistency level for Milvus collection.\nsource: # connection configs for the source Elasticsearch server\n es:\n urls:\n - \"http://10.15.1.***:9200\" # address of the source Elasticsearch server.\n username: \"\" # username for the Elasticsearch server.\n password: \"\" # password for the Elasticsearch server.\ntarget:\n mode: \"remote\" # storage location for dumped files. valid values: `remote` and `local`.\n remote: # configs for remote storage\n outputDir: \"migration/milvus/test\" # output directory path in the cloud storage bucket.\n cloud: \"aws\" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.\n region: \"us-west-2\" # region of the cloud storage; can be any value if using local Minio.\n bucket: \"zilliz-aws-us-****-*-********\" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.\n useIAM: true # whether to use an IAM Role for connection.\n checkBucket: false # checks if the specified bucket exists in the storage.\n milvus2x: # connection configs for the target Milvus 2.x server\n endpoint: \"http://10.102.*.**:19530\" # address of the target Milvus server.\n username: \"****\" # username for the Milvus 2.x server.\n password: \"******\" # password for the Milvus 2.x server.\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[task/load_base_task.go:94] [\"[LoadTasker] Dec Task Processing-------------->\"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[task/load_base_task.go:76] [\"[LoadTasker] Progress Task --------------->\"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]\n[dbclient/cus_field_milvus2x.go:86] [\"[Milvus2x] begin to ShowCollectionRows\"]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static: \"] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]\n[loader/cus_milvus2x_loader.go:66] [\"[Loader] Static Total\"] [\"Total Collections\"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]\n[migration/es_starter.go:25] [\"[Starter] migration ES to Milvus finish!!!\"] [Cost=80.009174459]\n[starter/starter.go:106] [\"[Starter] Migration Success!\"] [Cost=80.00928425]\n[cleaner/remote_cleaner.go:27] [\"[Remote Cleaner] Begin to clean files\"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]\n[cmd/start.go:32] [\"[Cleaner] clean file success!\"]\n"],"headingContent":"From Elasticsearch","anchorList":[{"label":"從 Elasticsearch","href":"From-Elasticsearch","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定轉移檔案","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"啟動遷移工作","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"驗證結果","href":"Verify-the-result","type":2,"isActive":false},{"label":"欄位對應參考","href":"Field-mapping-reference","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/es2m.md b/localization/v2.5.x/site/zh-hant/migrate/es2m.md new file mode 100644 index 000000000..fef6d6f71 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/es2m.md @@ -0,0 +1,265 @@ +--- +id: es2m.md +summary: 本指南提供從 Elasticsearch 遷移資料至 Milvus 2.x 的全面性、逐步式流程。 +title: 從 Elasticsearch +--- +

    從 Elasticsearch

    本指南提供了從 Elasticsearch 遷移資料到 Milvus 2.x 的全面、逐步的過程。按照本指南,您將能夠有效地傳輸資料,並利用 Milvus 2.x 的先進功能和改進的性能。

    +

    先決條件

      +
    • 軟體版本
    • +
    • 所需的工具
    • +
    • 支援遷移的資料類型:要從來源 Elasticsearch 索引遷移的欄位屬於下列類型 -dense_vector關鍵字文字整數雙數浮點 布林物件。此處未列出的資料類型目前不支援遷移。有關 Milvus 集合與 Elasticsearch 索引之間資料對應的詳細資訊,請參閱欄位對應參考
    • +
    • Elasticsearch 索引要求
        +
      • 來源 Elasticsearch 索引必須包含dense_vector 類型的向量欄位。沒有向量欄位就無法開始遷移。
      • +
    • +
    +

    設定轉移檔案

    將範例的轉移設定檔儲存為migration.yaml ,然後根據您的實際情況修改設定。您可以將配置檔案放在任何本機目錄中。

    +
    dumper: # configs for the migration job.
    +  worker:
    +    workMode: "elasticsearch" # operational mode of the migration job.
    +    reader:
    +      bufferSize: 2500 # buffer size to read from Elasticsearch in each batch. A value ranging from 2000 to 4000 is recommended.
    +meta: # meta configs for the source Elasticsearch index and target Milvus 2.x collection.
    +  mode: "config" # specifies the source for meta configs. currently, onlly `config` is supported.
    +  version: "8.9.1"
    +  index: "qatest_index" # identifies the Elasticsearch index to migrate data from.
    +  fields: # fields within the Elasticsearch index to be migrated.
    +  - name: "my_vector" # name of the Elasticsearch field.
    +    type: "dense_vector" # data type of the Elasticsearch field.
    +    dims: 128 # dimension of the vector field. required only when `type` is `dense_vector`.
    +  - name: "id"
    +    pk: true # specifies if the field serves as a primary key.
    +    type: "long"
    +  - name: "num"
    +    type: "integer"
    +  - name: "double1"
    +    type: "double"
    +  - name: "text1"
    +    maxLen: 1000 # max. length of data fields. required only for `keyword` and `text` data types.
    +    type: "text"
    +  - name: "bl1"
    +    type: "boolean"
    +  - name: "float1"
    +    type: "float"
    +  milvus: # configs specific to creating the collection in Milvus 2.x
    +    collection: "Collection_01" # name of the Milvus collection. defaults to the Elasticsearch index name if not specified.
    +    closeDynamicField: false # specifies whether to disable the dynamic field in the collection. defaults to `false`.
    +    shardNum: 2 # number of shards to be created in the collection.
    +    consistencyLevel: Strong # consistency level for Milvus collection.
    +source: # connection configs for the source Elasticsearch server
    +  es:
    +    urls:
    +    - "http://10.15.1.***:9200" # address of the source Elasticsearch server.
    +    username: "" # username for the Elasticsearch server.
    +    password: "" # password for the Elasticsearch server.
    +target:
    +  mode: "remote" # storage location for dumped files. valid values: `remote` and `local`.
    +  remote: # configs for remote storage
    +    outputDir: "migration/milvus/test" # output directory path in the cloud storage bucket.
    +    cloud: "aws" # cloud storage service provider. Examples: `aws`, `gcp`, `azure`, etc.
    +    region: "us-west-2" # region of the cloud storage; can be any value if using local Minio.
    +    bucket: "zilliz-aws-us-****-*-********" # bucket name for storing data; must align with configs in milvus.yaml for Milvus 2.x.
    +    useIAM: true # whether to use an IAM Role for connection.
    +    checkBucket: false # checks if the specified bucket exists in the storage.
    +  milvus2x: # connection configs for the target Milvus 2.x server
    +    endpoint: "http://10.102.*.**:19530" # address of the target Milvus server.
    +    username: "****" # username for the Milvus 2.x server.
    +    password: "******" # password for the Milvus 2.x server.
    +
    +

    下表描述了示例配置文件中的參數。如需完整的配置清單,請參考Milvus Migration:Elasticsearch 到 Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + +
      參數說明
      dumper.worker.workMode遷移工作的運作模式。從 Elasticsearch 索引遷移時設定為elasticsearch
      dumper.worker.reader.bufferSize每批從 Elasticsearch 讀取的緩衝區大小。單位:KB:KB。
      +
    • +
    • meta

      + + + + + + + + + + + + + + + + + + + +
      參數說明
      meta.mode指定元組態的來源。目前僅支援config
      meta.index指定要遷移資料的 Elasticsearch 索引。
      meta.fields要遷移的 Elasticsearch 索引中的欄位。
      meta.fields.nameElasticsearch 欄位的名稱。
      meta.fields.maxLen欄位的最大長度。此參數僅在meta.fields.typekeywordtext 時才需要。
      meta.fields.pk指定欄位是否作為主索引鍵。
      meta.fields.typeElasticsearch 欄位的資料類型。目前,Elasticsearch 支援下列資料類型:dense_vectorkeywordtextlongintegerdoublefloatbooleanobject
      meta.fields.dims向量欄位的尺寸。這個參數只有在meta.fields.typedense_vector 時才需要。
      meta.milvus在 Milvus 2.x 中建立集合的特定組態。
      meta.milvus.collectionMilvus 集合的名稱。如果未指定,則預設為 Elasticsearch 索引名稱。
      meta.milvus.closeDynamicField指定是否停用資料集中的動態欄位。預設為false 。如需關於動態欄位的詳細資訊,請參閱啟用動態欄位
      meta.milvus.shardNum要在集合中建立的分塊數量。有關分片的詳細資訊,請參閱名詞
      meta.milvus.consistencyLevel在 Milvus 中集合的一致性層級。如需更多資訊,請參閱一致性
      +
    • +
    • source

      + + + + + + + + + + +
      參數說明
      source.es來源 Elasticsearch 伺服器的連線設定。
      source.es.urls來源 Elasticsearch 伺服器的位址。
      source.es.usernameElasticsearch 伺服器的使用者名稱。
      source.es.passwordElasticsearch 伺服器的密碼。
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + +
      參數說明
      target.mode轉儲檔案的儲存位置。有效值:
      -local: 在本機磁碟上儲存轉儲檔案。
      -remote: 在物件儲存空間上儲存轉儲檔案。
      target.remote.outputDir雲端儲存桶中的輸出目錄路徑。
      target.remote.cloud雲端儲存服務提供商。範例值:aws,gcp,azure
      target.remote.region雲端儲存區域。如果使用本機 MinIO,則可以是任何值。
      target.remote.bucket儲存資料的 Bucket 名稱。該值必須與 Milvus 2.x 中的配置相同。如需詳細資訊,請參閱系統配置
      target.remote.useIAM是否使用 IAM 角色進行連接。
      target.remote.checkBucket是否檢查指定的資料桶是否存在於物件儲存空間。
      target.milvus2x目標 Milvus 2.x 伺服器的連線設定。
      target.milvus2x.endpoint目標 Milvus 伺服器的位址。
      target.milvus2x.usernameMilvus 2.x 伺服器的使用者名稱。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      target.milvus2x.passwordMilvus 2.x 伺服器的密碼。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需更多資訊,請參閱啟用驗證
      +
    • +
    +

    啟動遷移工作

    使用以下命令啟動遷移工作。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    以下是成功的遷移日誌輸出範例:

    +
    [task/load_base_task.go:94] ["[LoadTasker] Dec Task Processing-------------->"] [Count=0] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[task/load_base_task.go:76] ["[LoadTasker] Progress Task --------------->"] [fileName=testfiles/output/zwh/migration/test_mul_field4/data_1_1.json] [taskId=442665677354739304]
    +[dbclient/cus_field_milvus2x.go:86] ["[Milvus2x] begin to ShowCollectionRows"]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static: "] [collection=test_mul_field4_rename1] [beforeCount=50000] [afterCount=100000] [increase=50000]
    +[loader/cus_milvus2x_loader.go:66] ["[Loader] Static Total"] ["Total Collections"=1] [beforeTotalCount=50000] [afterTotalCount=100000] [totalIncrease=50000]
    +[migration/es_starter.go:25] ["[Starter] migration ES to Milvus finish!!!"] [Cost=80.009174459]
    +[starter/starter.go:106] ["[Starter] Migration Success!"] [Cost=80.00928425]
    +[cleaner/remote_cleaner.go:27] ["[Remote Cleaner] Begin to clean files"] [bucket=a-bucket] [rootPath=testfiles/output/zwh/migration]
    +[cmd/start.go:32] ["[Cleaner] clean file success!"]
    +
    +

    驗證結果

    執行遷移工作後,您可以進行 API 呼叫或使用 Attu 檢視已遷移實體的數量。如需詳細資訊,請參閱Attuget_collection_stats()

    +

    欄位對應參考

    檢視下表以瞭解 Elasticsearch 索引中的欄位類型如何對應至 Milvus 集合中的欄位類型。

    +

    有關 Milvus 支援的資料類型的詳細資訊,請參閱支援的資料類型

    + + + + + + + + + + + + + + + +
    Elasticsearch 欄位類型Milvus 欄位類型說明
    密集向量浮動向量向量尺寸在遷移時保持不變。
    關鍵字VarChar設定最大長度 (1 到 65,535).超過限制的字串會觸發遷移錯誤。
    文字VarChar設定最大長度(1 至 65,535)。超過限制的字串可能會觸發移轉錯誤。
    Int64-
    整數Int32-
    雙倍-
    浮點數浮動-
    布林整數-
    物件JSON-
    diff --git a/localization/v2.5.x/site/zh-hant/migrate/f2m.json b/localization/v2.5.x/site/zh-hant/migrate/f2m.json new file mode 100644 index 000000000..ec2ee9412 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/f2m.json @@ -0,0 +1 @@ +{"codeList":["dumper: # configs for the migration job.\n worker:\n limit: 2\n workMode: faiss # operational mode of the migration job.\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 2\nsource: # configs for the source Faiss index.\n mode: local\n local:\n faissFile: ./testfiles/faiss/faiss_ivf_flat.index\n\ntarget: # configs for the target Milvus collection.\n create:\n collection:\n name: test1w\n shardsNums: 2\n dim: 256\n metricType: L2\n\n mode: remote\n remote:\n outputDir: testfiles/output/\n cloud: aws\n endpoint: 0.0.0.0:9000\n region: ap-southeast-1\n bucket: a-bucket\n ak: minioadmin\n sk: minioadmin\n useIAM: false\n useSSL: false\n checkBucket: true\n milvus2x:\n endpoint: localhost:19530\n username: xxxxx\n password: xxxxx\n\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Faiss","anchorList":[{"label":"從 Faiss","href":"From-Faiss","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定遷移","href":"Configure-the-migration","type":2,"isActive":false},{"label":"啟動遷移工作","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"驗證結果","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/f2m.md b/localization/v2.5.x/site/zh-hant/migrate/f2m.md new file mode 100644 index 000000000..53536773e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/f2m.md @@ -0,0 +1,209 @@ +--- +id: f2m.md +title: 從 Faiss +related_key: 'Faiss, migrate, import' +summary: 了解如何將 Faiss 資料遷移至 Milvus。 +--- +

    從 Faiss

    本指南提供了從 Faiss 遷移數據到 Milvus 2.x 的全面、逐步的過程。按照本指南,您將能夠有效地傳輸您的數據,利用 Milvus 2.x 先進的功能和改進的性能。

    +

    先決條件

    +

    設定遷移

    將遷移配置範例檔保存為migration.yaml ,並根據實際情況修改配置。你可以自由地把配置文件放在本地的任何目錄下。

    +
    dumper: # configs for the migration job.
    +  worker:
    +    limit: 2
    +    workMode: faiss    # operational mode of the migration job.
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 2
    +source: # configs for the source Faiss index.
    +  mode: local
    +  local:
    +    faissFile: ./testfiles/faiss/faiss_ivf_flat.index
    +
    +target: # configs for the target Milvus collection.
    +  create:
    +    collection:
    +      name: test1w
    +      shardsNums: 2
    +      dim: 256
    +      metricType: L2
    +
    +  mode: remote
    +  remote:
    +    outputDir: testfiles/output/
    +    cloud: aws
    +    endpoint: 0.0.0.0:9000
    +    region: ap-southeast-1
    +    bucket: a-bucket
    +    ak: minioadmin
    +    sk: minioadmin
    +    useIAM: false
    +    useSSL: false
    +    checkBucket: true
    +  milvus2x:
    +    endpoint: localhost:19530
    +    username: xxxxx
    +    password: xxxxx
    +
    +
    +

    下表描述了示例配置文件中的参数。如需完整的配置清單,請參考Milvus Migration:Faiss 到 Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      參數說明
      dumper.worker.limit轉移線程數。
      dumper.worker.workMode遷移工作的運作模式。從 Faiss 索引遷移時設定為 faiss。
      dumper.worker.reader.bufferSize每批從 Faiss 讀取的緩衝區大小。單位:KB:單位:KB。
      dumper.worker.writer.bufferSize每批寫入 Milvus 的緩衝區大小。單位:KB:單位:KB。
      +
    • +
    • loader

      + + + + + + + +
      參數說明
      loader.worker.limit載入器線程數。
      +
    • +
    • source

      + + + + + + + + +
      參數說明
      source.mode指定讀取來源檔案的位置。有效值:
      -local: 從本機磁碟讀取檔案。
      -remote: 從遠端儲存讀取檔案。
      source.local.faissFile來源檔案所在的目錄路徑。例如,/db/faiss.index
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + + + + + + + +
      參數說明
      target.create.collection.nameMilvus 集合的名稱。
      target.create.collection.shardsNums要在集合中建立的分片數量。有關分片的詳細資訊,請參閱「術語」
      target.create.collection.dim向量領域的尺寸。
      target.create.collection.metricType用來衡量向量之間相似性的度量類型。如需詳細資訊,請參閱「術語」
      target.mode轉儲檔案的儲存位置。有效值:
      -local: 在本機磁碟上儲存轉儲檔案。
      -remote: 在物件儲存上儲存轉儲檔案。
      target.remote.outputDir雲端儲存桶中的輸出目錄路徑。
      target.remote.cloud雲端儲存服務提供商。範例值:aws,gcp,azure
      target.remote.endpointMilvus 2.x 儲存的端點。
      target.remote.region雲端儲存區域。如果您使用本機 MinIO,它可以是任何值。
      target.remote.bucket儲存資料的 Bucket 名稱。該值必須與 Milvus 2.x 中的 config 相同。如需詳細資訊,請參閱系統組態
      target.remote.akMilvus 2.x 儲存的存取金鑰。
      target.remote.skMilvus 2.x 儲存的保密金鑰。
      target.remote.useIAM是否使用 IAM 角色進行連接。
      target.remote.useSSL連線至 Milvus 2.x 時是否啟用 SSL。如需詳細資訊,請參閱傳輸中加密
      target.remote.checkBucket是否檢查指定的儲存桶是否存在於物件儲存空間。
      target.milvus2x.endpoint目標 Milvus 伺服器的位址。
      target.milvus2x.usernameMilvus 2.x 伺服器的使用者名稱。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      target.milvus2x.passwordMilvus 2.x 伺服器的密碼。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需更多資訊,請參閱啟用驗證
      +
    • +
    +

    啟動遷移工作

      +
    1. 使用以下命令啟動遷移工作。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      上述命令會將 Faiss 索引資料轉換成 NumPy 檔案,然後使用bulkInsert作業將資料寫入目標資料桶。

    2. +
    3. 生成 NumPy 檔案後,使用下列指令將這些檔案匯入 Milvus 2.x。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    驗證結果

    一旦執行轉移任務,您可以呼叫 API 或使用 Attu 檢視轉移的實體數量。如需詳細資訊,請參閱Attuget_collection_stats()

    diff --git a/localization/v2.5.x/site/zh-hant/migrate/from-m2x.json b/localization/v2.5.x/site/zh-hant/migrate/from-m2x.json new file mode 100644 index 000000000..280bf53c8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/from-m2x.json @@ -0,0 +1 @@ +{"codeList":["dumper:\n worker:\n workMode: milvus2x\n reader:\n bufferSize: 500\n\nmeta:\n mode: config\n version: 2.3.0\n collection: src_table_name\n\nsource:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n\ntarget:\n milvus2x:\n endpoint: {milvus2x_domain}:{milvus2x_port}\n username: xxxx\n password: xxxxx\n","./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml\n","[INFO] [migration/milvus2x_starter.go:79] [\"=================>JobProcess!\"] [Percent=100]\n[INFO] [migration/milvus2x_starter.go:27] [\"[Starter] migration Milvus2x to Milvus2x finish!!!\"] [Cost=94.877717375]\n[INFO] [starter/starter.go:109] [\"[Starter] Migration Success!\"] [Cost=94.878243583]\n","./milvus-migration server run -p 8080\n","curl -XPOST http://localhost:8080/api/v1/start\n","meta:\n fields:\n - name: id\n - name: title_vector\n - name: reading_time\n","meta:\n milvus:\n collection: target_collection_name\n shardNum: 2\n closeDynamicField: false\n consistencyLevel: Customized\n"],"headingContent":"From Milvus 2.3.x","anchorList":[{"label":"從 Milvus 2.3.x","href":"From-Milvus-23x","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"設定遷移檔案","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"開始遷移工作","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"驗證結果","href":"Verify-the-result","type":2,"isActive":false},{"label":"其他配置選項","href":"Additional-configuration-options","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/from-m2x.md b/localization/v2.5.x/site/zh-hant/migrate/from-m2x.md new file mode 100644 index 000000000..48b609b3c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/from-m2x.md @@ -0,0 +1,218 @@ +--- +id: from-m2x.md +summary: 本指南提供從 Milvus 2.3.x 遷移資料至 Milvus 2.3.x 或更高版本的全面、逐步過程。 +title: 從 Milvus 2.3.x +--- +

    從 Milvus 2.3.x

    本指南提供從 Milvus 2.3.x 遷移資料到 Milvus 2.3.x 或更高版本的全面、逐步過程。

    +

    先決條件

      +
    • 軟體版本
        +
      • 源 Milvus: 2.3.0+ (工具使用迭代器來取得源收集資料,要求源 Milvus 為 2.3.0 或以上版本。)
      • +
      • 目標 Milvus: 2.3.0+
      • +
    • +
    • 所需的工具
    • +
    • 資料準備
        +
      • 確保源 Milvus 套件已載入,並為資料匯出做好準備。
      • +
      • 如果目標 Milvus 沒有包含與源集合相對應的集合,milvus-migration工具會自動建立它。請注意,在遷移之後,目標資料集將不會被編制索引,您必須在之後手動編制資料集索引。
      • +
    • +
    +

    設定遷移檔案

    將範例的遷移設定檔儲存為migration.yaml ,並根據您的實際情況修改設定。您可以自由地將設定檔放在任何本機目錄中。

    +
    dumper:
    +  worker:
    +    workMode: milvus2x
    +    reader:
    +      bufferSize: 500
    +
    +meta:
    +  mode: config
    +  version: 2.3.0
    +  collection: src_table_name
    +
    +source:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +target:
    +  milvus2x:
    +    endpoint: {milvus2x_domain}:{milvus2x_port}
    +    username: xxxx
    +    password: xxxxx
    +
    +

    下表描述了示例配置文件中的參數。如需更多資訊,請參考Milvus Migration:Milvus2.x 到 Milvus2.x

    +
      +
    • dumper

      + + + + + + + + +
      參數說明
      dumper.worker.workMode遷移工作的作業模式。從 Milvus 2.x 遷移時設定為 milvus2x。
      dumper.worker.reader.bufferSize每批從 Milvus 2.x 讀取的緩衝區大小。
      +
    • +
    • meta

      + + + + + + + + + +
      參數說明
      meta.mode指定讀取元檔案的位置。設定為 config,表示可以從這個 migration.yaml 檔案取得 meta config。
      meta.version來源 Milvus 版本。設定為 2.3.0 或以上。
      meta.collection來源集合名稱。
      +
    • +
    • source

      + + + + + + + + + +
      參數說明
      source.milvus2x.endpoint來源 Milvus 伺服器的位址。
      source.milvus2x.username來源 Milvus 伺服器的使用者名稱。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      source.milvus2x.password來源 Milvus 伺服器的密碼。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      +
    • +
    • target

      + + + + + + + + + +
      參數說明
      target.milvus2x.endpoint目標 Milvus 伺服器的位址。
      target.milvus2x.username目標 Milvus 伺服器的使用者名稱。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      target.milvus2x.password目標 Milvus 伺服器的密碼。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需更多資訊,請參閱啟用驗證
      +
    • +
    +

    開始遷移工作

    您有兩個選項來啟動遷移工作 - 使用 CLI 或提出 API 請求。選擇最適合您需求的一個。

    +

    選項 1:使用 CLI

    使用下列指令啟動轉移工作。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

    +
    ./milvus-migration start --config=/{YourConfigFilePath}/migration.yaml
    +
    +

    監控日誌的進度更新。成功的遷移記錄應包括以下項目:

    +
    [INFO] [migration/milvus2x_starter.go:79] ["=================>JobProcess!"] [Percent=100]
    +[INFO] [migration/milvus2x_starter.go:27] ["[Starter] migration Milvus2x to Milvus2x finish!!!"] [Cost=94.877717375]
    +[INFO] [starter/starter.go:109] ["[Starter] Migration Success!"] [Cost=94.878243583]
    +
    +

    選項 2:提出 API 請求

    您也可以使用 Restful API 來執行遷移。啟動 API 伺服器:

    +
    ./milvus-migration server run -p 8080
    +
    +

    伺服器成功啟動後,將migration.yaml 檔案放置在專案的configs/ 目錄中,並使用: 開始遷移:

    +
    curl -XPOST http://localhost:8080/api/v1/start
    +
    +

    驗證結果

    遷移任務完成後,使用 Attu 檢視已遷移的實體數量。此外,您可以在 Attu 中建立索引和載入集合。如需詳細資訊,請參閱Attuget_collection_stats()

    +

    其他配置選項

    除了上述的基本設定外,您也可以根據您的特定需求,新增額外的設定。

    +
      +
    • 選擇性欄位遷移:如果您需要僅遷移集合中的特定欄位,而非所有欄位,請在migration.yaml 檔案的meta 部分指定要遷移的欄位。

      +
      meta:
      +  fields:
      +    - name: id
      +    - name: title_vector
      +    - name: reading_time
      +
    • +
    • 自訂目標集合:若要自訂目標集合的屬性,請在migration.yaml 檔案的meta 區段中加入相關設定。

      +
      meta:
      +  milvus:
      +    collection: target_collection_name
      +    shardNum: 2
      +    closeDynamicField: false
      +    consistencyLevel: Customized
      +
    • +
    +

    詳細資訊請參考Milvus Migration:Milvus2.x 至 Milvus2.x

    diff --git a/localization/v2.5.x/site/zh-hant/migrate/m2m.json b/localization/v2.5.x/site/zh-hant/migrate/m2m.json new file mode 100644 index 000000000..883083c64 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/m2m.json @@ -0,0 +1 @@ +{"codeList":["./milvus-migration export -m \"user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local\" -o outputDir\n","./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir\n","migration_data\n├── meta.json\n└── tables\n","dumper:\n worker:\n limit: 2\n workMode: milvus1x\n reader:\n bufferSize: 1024\n writer:\n bufferSize: 1024\nloader:\n worker:\n limit: 16\nmeta:\n mode: local\n localFile: /outputDir/test/meta.json\nsource:\n mode: local\n local:\n tablesDir: /db/tables/\ntarget:\n mode: remote\n remote:\n outputDir: \"migration/test/xx\"\n ak: xxxx\n sk: xxxx\n cloud: aws\n region: us-west-2\n bucket: xxxxx\n useIAM: true\n checkBucket: false\n milvus2x:\n endpoint: \"{yourMilvus2_xServerAddress}:{port}\"\n username: xxxx\n password: xxxx\n","./milvus-migration dump --config=/{YourConfigFilePath}/migration.yaml\n","./milvus-migration load --config=/{YourConfigFilePath}/migration.yaml\n"],"headingContent":"From Milvus 1.x","anchorList":[{"label":"從 Milvus 1.x","href":"From-Milvus-1x","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"匯出來源 Milvus 安裝的元資料","href":"Export-metadata-of-the-source-Milvus-installation","type":2,"isActive":false},{"label":"設定轉移檔案","href":"Configure-the-migration-file","type":2,"isActive":false},{"label":"啟動遷移工作","href":"Start-the-migration-task","type":2,"isActive":false},{"label":"驗證結果","href":"Verify-the-result","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/m2m.md b/localization/v2.5.x/site/zh-hant/migrate/m2m.md new file mode 100644 index 000000000..a94fc855f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/m2m.md @@ -0,0 +1,240 @@ +--- +id: m2m.md +summary: 本指南提供了從 Milvus 1.x(包括 0.9.x 及以上版本)遷移資料到 Milvus 2.x 的全面、逐步的過程。 +title: 從 Milvus 1.x +--- +

    從 Milvus 1.x

    本指南提供了從 Milvus 1.x (包括 0.9.x 及以上) 遷移數據到 Milvus 2.x 的全面的、逐步的過程。按照本指南,您將能夠有效地傳輸您的數據,利用 Milvus 2.x 先進的功能和改進的性能。

    +

    先決條件

    +

    匯出來源 Milvus 安裝的元資料

    為了準備Milvus 0.9.x到1.x的遷移數據,停止源Milvus或至少停止在源Milvus中執行任何DML操作。

    +
      +
    1. 匯出源 Milvus 安裝的 metadata 到meta.json

      +
        +
      • 對於使用 MySQL 作為後端的安裝,執行
      • +
      +
      ./milvus-migration export -m "user:password@tcp(adderss)/milvus?charset=utf8mb4&parseTime=True&loc=Local" -o outputDir
      +
      +
        +
      • 對於使用 SQLite 作為後端的安裝,執行
      • +
      +
      ./milvus-migration export -s /milvus/db/meta.sqlite -o outputDir
      +
    2. +
    3. 複製 Milvus 安裝的tables 資料夾,然後將meta.jsontables 資料夾移至一個空的資料夾。

      +

      這一步驟完成後,空資料夾的結構應該是這樣的:

      +
      migration_data
      +├── meta.json
      +└── tables
      +
    4. +
    5. 將前一步準備好的資料夾上傳到 S3 區塊儲存桶,或在下一節直接使用此本機資料夾。

    6. +
    +

    設定轉移檔案

    將範例移轉設定檔案儲存為migration.yaml ,並根據您的實際情況修改設定。您可以將配置檔案放在任何本機目錄中。

    +
    dumper:
    +  worker:
    +    limit: 2
    +    workMode: milvus1x
    +    reader:
    +      bufferSize: 1024
    +    writer:
    +      bufferSize: 1024
    +loader:
    +  worker:
    +    limit: 16
    +meta:
    +  mode: local
    +  localFile: /outputDir/test/meta.json
    +source:
    +  mode: local
    +  local:
    +    tablesDir: /db/tables/
    +target:
    +  mode: remote
    +  remote:
    +    outputDir: "migration/test/xx"
    +    ak: xxxx
    +    sk: xxxx
    +    cloud: aws
    +    region: us-west-2
    +    bucket: xxxxx
    +    useIAM: true
    +    checkBucket: false
    +  milvus2x:
    +    endpoint: "{yourMilvus2_xServerAddress}:{port}"
    +    username: xxxx
    +    password: xxxx
    +
    +

    下表描述了示例配置文件中的參數。如需完整的配置清單,請參考Milvus Migration:Milvus1.x 到 Milvus 2.x.

    +
      +
    • dumper

      + + + + + + + + + + +
      參數說明
      dumper.worker.limit轉移線程數。
      dumper.worker.workMode遷移工作的運作模式。從 Milvus 1.x 遷移時設定為milvus1x
      dumper.worker.reader.bufferSize每批從 Milvus 1.x 讀取的緩衝區大小。單位:KB:單位:KB。
      dumper.worker.writer.bufferSize每批寫入 Milvus 2.x 的緩衝區大小。單位:KB:單位:KB。
      +
    • +
    • loader

      + + + + + + + +
      參數說明
      loader.worker.limit載入器線程數。
      +
    • +
    • meta

      + + + + + + + + +
      參數說明
      meta.mode指定讀取 meta.json 元檔案的位置。有效值:local,remote,mysql,sqlite
      meta.localFilemeta.json 檔案所在的本機目錄路徑。此設定僅在meta.mode 設定為local 時使用。有關其他 meta 配置,請參閱README_1X
      +
    • +
    • source

      + + + + + + + + +
      參數說明
      source.mode指定讀取來源檔案的位置。有效值:
      -local: 從本機磁碟讀取檔案。
      -remote: 從遠端儲存讀取檔案。
      source.local.tablesDir來源檔案所在的目錄路徑。例如,/db/tables/
      +
    • +
    • target

      + + + + + + + + + + + + + + + + + + +
      參數說明
      target.mode轉儲檔案的儲存位置。有效值:
      -local: 在本機磁碟上儲存轉儲檔案。
      -remote: 在物件儲存空間上儲存轉儲檔案。
      target.remote.outputDir雲端儲存桶中的輸出目錄路徑。
      target.remote.akMilvus 2.x 儲存的存取金鑰。
      target.remote.skMilvus 2.x 儲存的密匙。
      target.remote.cloud雲端儲存服務供應商。範例值:aws,gcp,azure
      target.remote.region雲端儲存區域。如果您使用本機 MinIO,它可以是任何值。
      target.remote.bucket儲存資料的 Bucket 名稱。該值必須與 Milvus 2.x 中的配置相同。如需詳細資訊,請參閱系統配置
      target.remote.useIAM是否使用 IAM 角色進行連接。
      target.remote.checkBucket是否檢查指定的資料桶是否存在於物件儲存空間。
      target.milvus2x.endpoint目標 Milvus 伺服器的位址。
      target.milvus2x.usernameMilvus 2.x 伺服器的使用者名稱。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需詳細資訊,請參閱啟用驗證
      target.milvus2x.passwordMilvus 2.x 伺服器的密碼。如果您的 Milvus 伺服器啟用使用者驗證,則必須使用此參數。如需更多資訊,請參閱啟用驗證
      +
    • +
    +

    啟動遷移工作

      +
    1. 使用以下命令啟動遷移工作。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

      +
      ./milvus-migration  dump  --config=/{YourConfigFilePath}/migration.yaml
      +
      +

      上面的命令將 Milvus 1.x 中的源資料轉換成 NumPy 檔案,然後使用bulkInsert操作將資料寫入目標資料桶。

    2. +
    3. 生成 NumPy 檔案後,使用下列指令將這些檔案匯入 Milvus 2.x。將{YourConfigFilePath} 改為配置檔案migration.yaml 所在的本機目錄。

      +
      ./milvus-migration  load  --config=/{YourConfigFilePath}/migration.yaml
      +
    4. +
    +

    驗證結果

    一旦執行轉移任務,您可以呼叫 API 或使用 Attu 檢視轉移的實體數量。如需詳細資訊,請參閱Attuget_collection_stats()

    diff --git a/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.json b/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.json new file mode 100644 index 000000000..919db0c81 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Migration Overview","anchorList":[{"label":"Milvus 遷移概述","href":"Milvus-Migration-Overview","type":1,"isActive":false},{"label":"支援的遷移","href":"Supported-migrations","type":2,"isActive":false},{"label":"特點","href":"Features","type":2,"isActive":false},{"label":"架構","href":"Architecture","type":2,"isActive":false},{"label":"未來計劃","href":"Future-plans","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.md b/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.md new file mode 100644 index 000000000..0a44125b2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/migrate_overview.md @@ -0,0 +1,118 @@ +--- +id: migrate_overview.md +summary: 本文概述了 Milvus-migration 工具,包括支援的遷移、功能和架構。 +title: Milvus 遷移概述 +--- +

    Milvus 遷移概述

    Milvus意識到用戶群的多樣化需求,擴展了其遷移工具,不僅方便從早期的Milvus 1.x版本升級,還能無縫集成來自其他系統(如ElasticsearchFaiss)的數據。Milvus-migration專案旨在縮短這些不同資料環境與 Milvus 技術最新進展之間的差距,確保您能無縫利用改進的功能和效能。

    +

    支援的遷移

    Milvus-migration工具支援多種遷移路徑,以滿足不同使用者的需求:

    + +

    特點

    Milvus-migration 具備強大的功能,可處理各種不同的遷移情境:

    +
      +
    • 多種互動方式:您可以透過命令列介面或 Restful API 執行遷移,彈性處理遷移的執行方式。
    • +
    • 支援各種檔案格式與雲端儲存:Milvus-migration工具可處理儲存在本機檔案以及 S3、OSS 和 GCP 等雲端儲存解決方案中的資料,確保廣泛的相容性。
    • +
    • 資料類型處理:Milvus-migration既能處理向量資料,也能處理標量值欄位,是滿足不同資料遷移需求的多用途選擇。
    • +
    +

    架構

    Milvus-migration的架構是經過策略性的設計,以促進有效率的資料串流、解析和寫入過程,使其能夠在各種資料來源之間進行強大的遷移能力。

    +

    + + Milvus-migration architecture + Milvus-migration架構

    +

    在上圖中

    +
      +
    • 資料來源Milvus-migration支援多種資料來源,包括透過scroll API 的 Elasticsearch、本機或雲端儲存的資料檔案,以及 Milvus 1.x 資料庫。這些資料會以簡化的方式存取與讀取,以啟動遷移程序。
    • +
    • 流管道
        +
      • 解析流程:來自資料來源的資料會根據其格式進行解析。例如,對於來自 Elasticsearch 的資料來源,會使用 Elasticsearch 格式解析器,而其他格式則使用各自的解析器。這個步驟對於將原始資料轉換為可進一步處理的結構化格式非常重要。
      • +
      • 轉換流程:解析之後,資料會進行轉換,在轉換過程中,欄位會被篩選、資料類型會被轉換,而表名也會根據目標 Milvus 2.x 結構描述進行調整。這可確保資料符合 Milvus 的預期結構和類型。
      • +
    • +
    • 資料寫入與載入
        +
      • 寫入資料:將處理後的資料寫入中間的 JSON 或 NumPy 檔案,準備載入 Milvus 2.x。
      • +
      • 載入資料:資料最後使用BulkInsert作業載入 Milvus 2.x,此作業可有效率地將大量資料寫入 Milvus 儲存系統,無論是雲端或檔案儲存。
      • +
    • +
    +

    未來計劃

    開發團隊致力於增強Milvus-migration的功能,例如

    +
      +
    • 支援更多資料來源:計劃擴展對其他資料庫和檔案系統的支援,例如 Pinecone、Chroma、Qdrant。如果您需要特定資料來源的支援,請透過此GitHub issue 連結提交您的請求。
    • +
    • 指令簡化:努力簡化指令流程,讓執行更容易。
    • +
    • SPI 解析器/轉換器:本架構期望包含服務供應商介面 (SPI) 工具,以進行解析與轉換。這些工具允許自訂實作,使用者可將其插入遷移程序,以處理特定的資料格式或轉換規則。
    • +
    • 檢查點恢復:使遷移能從上一個檢查點恢復,以提高中斷時的可靠性和效率。會建立儲存點以確保資料完整性,並儲存於 SQLite 或 MySQL 等資料庫中,以追蹤遷移過程的進度。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.json b/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.json new file mode 100644 index 000000000..600abeb37 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.json @@ -0,0 +1 @@ +{"codeList":["# clone the source project\ngit clone https://github.com/zilliztech/milvus-migration.git\n","cd milvus-migration\n","# compile the project to obtain an executable file\ngo get & go build\n"],"headingContent":"Install Migration Tool","anchorList":[{"label":"安裝遷移工具","href":"Install-Migration-Tool","type":1,"isActive":false},{"label":"下載可執行的二進位檔","href":"Download-the-executable-binary","type":2,"isActive":false},{"label":"從原始碼編譯","href":"Compile-from-source","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.md b/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.md new file mode 100644 index 000000000..0f56a697f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/migrate/milvusdm_install.md @@ -0,0 +1,91 @@ +--- +id: milvusdm_install.md +summary: 了解如何安裝 Milvus-Migration 來遷移您的資料。 +title: 安裝遷移工具 +--- +

    安裝遷移工具

    我們支援下載可執行的二進位檔案或從原始碼編譯 Milvus-migration 工具。

    +

    下載可執行的二進位檔

      +
    1. Milvus-Migration GitHub 套件庫下載最新版本。
    2. +
    3. 解壓縮下載的檔案,以取得milvus-migration 可執行的二進位檔案。
    4. +
    +

    從原始碼編譯

    或者,下載並編譯原始碼,以獲得可執行的二進位檔案。

    +
      +
    1. 克隆Milvus-Migration資源庫:

      +
      # clone the source project
      +git clone https://github.com/zilliztech/milvus-migration.git
      +
    2. +
    3. 導覽到專案目錄:

      +
      cd milvus-migration
      +
    4. +
    5. 編譯專案以取得可執行檔案:

      +
      # compile the project to obtain an executable file
      +go get & go build
      +
      +

      這將在專案目錄中產生milvus-migration 可執行檔。

    6. +
    +

    下一步

    安裝了 Milvus-migration 工具之後,你可以從不同的來源遷移資料:

    + diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.json b/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.json new file mode 100644 index 000000000..4780661cc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Architecture Overview","anchorList":[{"label":"Milvus 架構概述","href":"Milvus-Architecture-Overview","type":1,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.md b/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.md new file mode 100644 index 000000000..a6346dd60 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/architecture_overview.md @@ -0,0 +1,52 @@ +--- +id: architecture_overview.md +summary: Milvus 提供快速、可靠、穩定的向量資料庫,專為相似性搜尋和人工智慧而建立。 +title: Milvus 架構概述 +--- +

    Milvus 架構概述

    Milvus 建立在流行的向量檢索函式庫之上,包括 Faiss、HNSW、DiskANN、SCANN 等,專為包含數百萬、數十億甚至數萬億向量的密集向量資料集的相似性檢索而設計。在繼續之前,請先熟悉嵌入檢索的基本原則

    +

    Milvus 還支援資料分片、串流資料擷取、動態模式、結合向量與標量資料的搜尋、多向量與混合搜尋、稀疏向量以及許多其他進階功能。此平台可依需求提供效能,並可進行最佳化,以符合任何嵌入式檢索情境。我們建議使用 Kubernetes 部署 Milvus,以獲得最佳可用性與彈性。

    +

    Milvus 採用共享儲存架構,其運算節點具備儲存與運算分解及水平擴充能力。依據資料平面與控制平面分離的原則,Milvus 包含四個層級:存取層、協調器服務、工作節點與儲存。這些層級在擴充或災難復原時是相互獨立的。

    +

    + + Architecture_diagram + 架構圖

    +

    根據此圖,介面可分為以下幾類:

    +
      +
    • DDL / DCL:createCollection / createPartition / dropCollection / dropPartition / hasCollection / hasPartition
    • +
    • DML / Produce:insert / delete / upsert
    • +
    • DQL:搜尋 / 查詢
    • +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.json b/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.json new file mode 100644 index 000000000..d7bec6089 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Data Processing","anchorList":[{"label":"資料處理","href":"Data-Processing","type":1,"isActive":false},{"label":"資料插入","href":"Data-insertion","type":2,"isActive":false},{"label":"索引建立","href":"Index-building","type":2,"isActive":false},{"label":"資料查詢","href":"Data-query","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.md b/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.md new file mode 100644 index 000000000..c4aa2bfd4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/data_processing.md @@ -0,0 +1,124 @@ +--- +id: data_processing.md +summary: 瞭解 Milvus 的資料處理程序。 +title: 資料處理 +--- +

    資料處理

    本文將詳細介紹 Milvus 中資料插入、索引建立和資料查詢的實作。

    +

    資料插入

    您可以在 Milvus 中為每個集合指定若干個分片,每個分片對應一個虛擬通道(vchannel)。如下圖所示,Milvus 會為記錄中介中的每個 vchannel 指定一個實體通道(pchannel)。任何傳入的插入/刪除請求都會根據主鍵的哈希值路由到分片。

    +

    由於 Milvus 沒有複雜的交易,因此 DML 請求的驗證會轉移到代理。Proxy 會向 TSO(Timestamp Oracle)請求每次插入/刪除請求的時間戳記,TSO 是與根協調器共置的計時模組。隨著較舊的時間戳被較新的時間戳覆蓋,時間戳就被用來決定資料請求的處理順序。Proxy 從資料協調器分批擷取資訊,包括實體的區段和主鍵,以增加整體吞吐量,避免中央節點負擔過重。

    +

    + + Channels 1 + 通道 1

    +

    DML (資料處理語言) 作業和 DDL (資料定義語言) 作業都會寫入記錄順序,但 DDL 作業因為發生頻率低,所以只分配一個通道。

    +

    + + Channels 2 + 通道 2

    +

    V 通道維護在底層的日誌中介節點中。每個通道在物理上是不可分割的,而且只供一個節點使用。當資料擷取率達到瓶頸時,請考慮兩件事:日誌中介節點是否負載過重而需要擴充,以及是否有足夠的分片來確保每個節點的負載平衡。

    +

    + + Write log sequence + 寫入日誌順序

    +

    上圖概括了寫入日誌順序過程中涉及的四個元件:代理、日誌經紀人、資料節點和物件儲存。此流程涉及四個任務:DML 請求的驗證、日誌順序的發佈-訂閱、從串流日誌轉換為日誌快照,以及日誌快照的持久化。這四項任務彼此解耦,以確保每項任務都由其對應的節點類型處理。相同類型的節點是平等的,可以彈性獨立擴充,以適應各種資料負載,尤其是大量且高度波動的串流資料。

    +

    索引建立

    索引建立由索引節點執行。為了避免因資料更新而頻繁建立索引,Milvus 會將資料集進一步分割成區段,每個區段都有自己的索引。

    +

    + + Index building + 索引建立

    +

    Milvus 支援為每個向量欄位、標量欄位和主要欄位建立索引。索引建立的輸入和輸出都與物件儲存有關:索引節點會將要建立索引的日誌快照從區段(位於物件儲存空間)載入記憶體,再將對應的資料和元資料反序列化以建立索引,當索引建立完成時,再將索引序列化,並將其寫回物件儲存空間。

    +

    索引建立主要涉及向量和矩陣操作,因此需要大量的運算和記憶體。向量因其高維度的特性,無法使用傳統的樹狀索引有效率地建立索引,但可以使用此領域較成熟的技術建立索引,例如群集或圖表索引。無論是哪種類型,建立索引都會涉及大規模向量的大量反覆計算,例如 Kmeans 或圖形遍歷。

    +

    與標量資料的索引不同,建立向量索引必須充分利用 SIMD (單指令、多資料) 加速。Milvus 天生就支援 SIMD 指令集,例如 SSE、AVX2 和 AVX512。鑑於向量索引建立的「打嗝」與資源密集性質,彈性對 Milvus 的經濟效益而言變得極為重要。未來的 Milvus 版本將進一步探索異質運算與無伺服器運算,以降低相關成本。

    +

    此外,Milvus 也支援標量篩選與主要欄位查詢。它有內建索引來提高查詢效率,例如 Bloom 過濾索引、hash 索引、樹狀索引和倒置索引,並計劃引入更多外部索引,例如位圖索引和粗略索引。

    +

    資料查詢

    資料查詢是指在指定的集合中搜尋與目標向量最接近的k 個向量或與向量在指定距離範圍內的所有向量的過程。向量會連同其對應的主索引鍵及欄位一起傳回。

    +

    + + Data query + 資料查詢

    +

    Milvus 中的一個集合被分割成多個區段,查詢節點按區段載入索引。當搜尋請求到達時,會廣播給所有查詢節點,以進行同步搜尋。然後,每個節點會修剪本機區段,搜尋符合條件的向量,並將搜尋結果還原和傳回。

    +

    在資料查詢中,查詢節點彼此獨立。每個節點只負責兩項任務:依照查詢協調器的指示載入或釋放區段;在本區段內進行搜尋。而代理則負責減少每個查詢節點的搜尋結果,並將最終結果傳回給用戶端。

    +

    + + Handoff + 遞送

    +

    區段有兩種類型,一種是成長中的區段 (用於增量資料),另一種是封存的區段 (用於歷史資料)。查詢節點訂閱 vchannel,以接收最近的更新 (增量資料) 作為成長中的區段。當成長區段達到預先定義的臨界值時,資料協調器就會封鎖該區段,並開始建立索引。然後由查詢協調器啟動交接作業,將遞增資料轉換為歷史資料。查詢協調器會根據記憶體使用量、CPU 開銷和區段數量,將封存的區段平均分配給所有查詢節點。

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.json b/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.json new file mode 100644 index 000000000..1662653ae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Storage/Computing Disaggregation","anchorList":[{"label":"儲存/計算分解","href":"StorageComputing-Disaggregation","type":1,"isActive":false},{"label":"存取層","href":"Access-layer","type":2,"isActive":false},{"label":"協調器服務","href":"Coordinator-service","type":2,"isActive":false},{"label":"工作節點","href":"Worker-nodes","type":2,"isActive":false},{"label":"儲存空間","href":"Storage","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.md b/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.md new file mode 100644 index 000000000..6eedd81c8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/four_layers.md @@ -0,0 +1,123 @@ +--- +id: four_layers.md +summary: Milvus 中的儲存/計算分解結構。 +title: 儲存/計算分解 +--- +

    儲存/計算分解

    依據資料平面與控制平面分解的原則,Milvus 包含四個層級,在可擴充性及災難復原方面相互獨立。

    +

    存取層

    存取層由一組無狀態代理所組成,是系統的前端層,也是使用者的終點。它驗證用戶端的請求,並減少返回的結果:

    +
      +
    • 代理本身是無狀態的。它使用負載平衡元件(如 Nginx、Kubernetes Ingress、NodePort 和 LVS)提供統一的服務位址。
    • +
    • 由於 Milvus 採用大規模平行處理 (MPP) 架構,因此 Proxy 會先彙集並後加工中間結果,再將最終結果傳回給用戶端。
    • +
    +

    協調器服務

    協調器服務會指派任務給工作節點,並扮演系統大腦的角色。它負責的任務包括群集拓樸管理、負載平衡、時間戳記產生、資料宣告和資料管理。

    +

    有三種協調器類型:根協調器 (root coordinator)、資料協調器 (data coordinator) 和查詢協調器 (query coordinator)。

    +

    根協調器 (root coordinator)

    根協調器處理資料定義語言 (DDL) 和資料控制語言 (DCL) 請求,例如建立或刪除集合、分割或索引,以及管理 TSO(時戳 Oracle)和時間記錄發行。

    +

    查詢協調員 (query coordinator)

    查詢協調員管理查詢節點的拓樸和負載平衡,以及從成長中的區段到封閉區段的交接。

    +

    資料協調器 (資料協調器)

    資料協調器管理資料節點和索引節點的拓樸結構、維護元資料、觸發刷新、壓縮和索引建立以及其他背景資料作業。

    +

    工作節點

    手臂和腿。工作節點是遵循協調器服務指示的啞巴執行器,並執行來自代理的資料處理語言 (DML) 指令。由於儲存與計算的分離,工作節點是無狀態的,當部署在 Kubernetes 上時,可促進系統擴充與災難復原。Worker 節點有三種類型:

    +

    查詢節點

    查詢節點擷取增量日誌資料,並透過訂閱日誌經紀人將其轉換為成長中的區段,從物件儲存載入歷史資料,並執行向量與標量資料之間的混合搜尋。

    +

    資料節點

    資料節點透過訂閱日誌中介擷取增量日誌資料、處理突變請求、將日誌資料打包成日誌快照並儲存在物件儲存空間。

    +

    索引節點

    索引節點建立索引。 索引節點不需要駐留記憶體,可以使用無伺服器框架實作。

    +

    儲存空間

    儲存是系統的骨骼,負責資料的持久化。它包括元儲存、日誌中介和物件儲存。

    +

    元儲存

    元存儲會儲存元資料的快照,例如集合模式和訊息消耗檢查點。儲存元資料需要極高的可用性、強大的一致性和交易支援,因此 Milvus 選擇 etcd 作為元儲存。Milvus 也使用 etcd 進行服務註冊和健康檢查。

    +

    物件儲存

    物件儲存存放日誌的快照檔案、標量與向量資料的索引檔案,以及中間查詢結果。Milvus 使用 MinIO 作為物件儲存,並可隨時部署在 AWS S3 和 Azure Blob 這兩種全球最流行、最具成本效益的儲存服務上。然而,物件儲存有很高的存取延遲,並且會依據查詢次數收費。為了改善效能並降低成本,Milvus 計劃在記憶體或 SSD 為基礎的快取記憶體池上實施冷熱資料分離。

    +

    日誌中介

    日誌經紀人是一個支援播放的 pub-sub 系統。它負責串流資料的持久化和事件通知。當工作節點從系統故障中復原時,它也會確保增量資料的完整性。Milvus 集群使用 Pulsar 作為日誌代理;Milvus 單機版使用 RocksDB 作為日誌代理。此外,日誌經紀人也可以隨時以 Kafka 等串流資料儲存平台取代。

    +

    Milvus 是以 log broker 為核心,並遵循「log as data」的原則,因此 Milvus 不會維護實體表,但會透過 logging persistence 與快照 log 來保證資料的可靠性。

    +

    + + Log_mechanism + 日誌機制

    +

    日誌代理是 Milvus 的骨幹。由於其天生的 pub-sub 機制,它負責資料的持久性和讀寫分解。上圖顯示了該機制的簡化描述,系統分為兩個角色,日誌經紀人(負責維護日誌順序)和日誌訂閱者。前者記錄所有改變收集狀態的作業;後者訂閱日誌序列以更新本機資料,並以唯讀副本的形式提供服務。pub-sub 機制也為系統在變更資料擷取 (CDC) 和全球分散部署方面的擴充能力預留了空間。

    +

    下一步

      +
    • 請閱讀「主要元件」以瞭解更多有關 Milvus 架構的詳細資訊。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.json b/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.json new file mode 100644 index 000000000..657d1220a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Main Components","anchorList":[{"label":"主要元件","href":"Main-Components","type":1,"isActive":false},{"label":"Milvus 單機版","href":"Milvus-standalone","type":2,"isActive":false},{"label":"Milvus 集群","href":"Milvus-cluster","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.md b/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.md new file mode 100644 index 000000000..feb4e4782 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/architecture/main_components.md @@ -0,0 +1,98 @@ +--- +id: main_components.md +summary: 了解 Milvus 單機版和群集版的主要元件。 +title: 主要元件 +--- +

    主要元件

    運行 Milvus 有兩種模式:單機模式和集群模式。這兩種模式具有相同的功能。您可以選擇最適合您的資料集大小、流量資料等的模式。目前,Milvus standalone 無法「線上」升級為 Milvus cluster。

    +

    Milvus 單機版

    Milvus standalone 包括三個元件:

    +
      +
    • Milvus:核心功能元件。

    • +
    • Meta Store:元資料引擎,存取並儲存 Milvus 內部元件的元資料,包括代理、索引節點等。

    • +
    • 物件儲存:儲存引擎,負責 Milvus 的資料持久化。

    • +
    +

    + + Standalone_architecture + 獨立架構

    +

    Milvus 集群

    Milvus 叢集包含七個微服務元件和三個第三方依賴。所有的微服務都可以獨立部署在 Kubernetes 上。

    +

    微服務元件

      +
    • 根協定
    • +
    • 代理
    • +
    • 查詢協定
    • +
    • 查詢節點
    • +
    • 資料節點
    • +
    • 索引節點
    • +
    • 資料節點
    • +
    +

    第三方依賴

      +
    • Meta Store:儲存群集中各種元件的元資料,例如 etcd。
    • +
    • 物件儲存: 負責群集中大型檔案的資料持久化,例如索引和二進位日誌檔案,例如 S3
    • +
    • 日誌中介 (Log Broker):管理最近突變作業的日誌,輸出串流日誌,並提供日誌發佈-訂閱服務,例如 Pulsar。
    • +
    +

    + + Distributed_architecture + 分散式架構

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/benchmark.json b/localization/v2.5.x/site/zh-hant/reference/benchmark.json new file mode 100644 index 000000000..5f4af640f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/benchmark.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus 2.2 Benchmark Test Report","anchorList":[{"label":"Milvus 2.2 基準測試報告","href":"Milvus-22-Benchmark-Test-Report","type":1,"isActive":false},{"label":"摘要","href":"Summary","type":2,"isActive":false},{"label":"術語","href":"Terminology","type":2,"isActive":false},{"label":"測試環境","href":"Test-environment","type":2,"isActive":false},{"label":"測試流程","href":"Test-pipeline","type":2,"isActive":false},{"label":"測試結果","href":"Test-results","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/benchmark.md b/localization/v2.5.x/site/zh-hant/reference/benchmark.md new file mode 100644 index 000000000..c0e7fee6b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/benchmark.md @@ -0,0 +1,279 @@ +--- +id: benchmark.md +summary: 瞭解 Milvus 的基準結果。 +title: Milvus 2.2 基準測試報告 +--- +

    Milvus 2.2 基準測試報告

    這份報告顯示了Milvus 2.2.0的主要測試結果,目的是提供Milvus 2.2.0的搜尋效能,特別是在擴充和縮小的能力。

    +
    +
    +
    + Milvus Performance Evaluation 2023 +
    +
    +
    +

    我們最近針對 Milvus 2.2.3 執行了一項基準測試,主要結果如下:

    +
      +
    • 搜尋延遲降低 2.5 倍
    • +
    • QPS 增加 4.5 倍
    • +
    • 十億規模的相似性搜尋,效能幾乎沒有降低
    • +
    • 使用多複本時的線性擴充能力
    • +
    +

    如需詳細資訊,歡迎參閱本白皮書及 相關基準測試程式碼

    +
    +
    +

    摘要

      +
    • 與 Milvus 2.1 相比,Milvus 2.2.0 的 QPS 在群集模式下增加超過 48%,在單機模式下增加超過 75%。
    • +
    • Milvus 2.2.0 具備令人印象深刻的擴充能力:
        +
      • 當 CPU 核心從 8 個擴充到 32 個時,QPS 會以線性方式增加。
      • +
      • 當 Querynode 複製本從 1 個擴充到 8 個時,QPS 會以線性方式增加。
      • +
    • +
    +

    術語

    +點擊查看測試中使用的術語詳情 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    術語說明
    nq一次搜尋請求中要搜尋的向量數量
    topk一個搜尋請求中,每個向量(以 nq 為單位)要擷取的最近向量數量
    efHNSW 索引的特定搜尋參數
    RT從傳送請求到接收回應的回應時間
    QPS每秒成功處理的搜尋要求數量
    +

    +

    測試環境

    所有測試都在下列環境下進行。

    +

    硬體環境

    + + + + + + + + +
    硬體環境規格
    中央處理器Intel® Xeon® Gold 6226R CPU @ 2.90GHz
    記憶體16*/32 GB RDIMM, 3200 MT/s
    固態硬碟SATA 6 Gbps
    +

    軟體環境

    + + + + + + + +
    軟體環境版本
    Milvusv2.2.0
    Milvus GO SDKv2.2.0
    +

    部署方案

      +
    • Milvus 實體(單機或叢集)是透過Helm部署在 Kubernetes 叢集上,以實體或虛擬機器為基礎。
    • +
    • 不同的測試僅在 CPU 核心數量、記憶體大小和副本 (Worker 節點) 數量上有所不同,這僅適用於 Milvus 叢集。
    • +
    • 未指定的配置與預設配置相同。
    • +
    • Milvus 依賴 (MinIO、Pulsar 和 Etcd) 將資料儲存在每個節點的本機 SSD 上。
    • +
    • 搜尋要求透過 MilvusGO SDK 傳送至 Milvus 實體。
    • +
    +

    資料集

    測試使用ANN-Benchmarks 的開放源碼資料集 SIFT (128 維度)。

    +

    測試流程

      +
    1. 使用 Helm 啟動 Milvus 實例,並根據各測試列出的伺服器配置。
    2. +
    3. 透過 Milvus GO SDK 連線至 Milvus 實例,並取得相對應的測試結果。
    4. +
    5. 建立一個集合。
    6. +
    7. 插入 100 萬個 SIFT 向量。建立 HNSW 索引,並透過設定M8efConstruction200 來設定索引參數。
    8. +
    9. 載入資料夾。
    10. +
    11. 使用不同的並發數進行搜尋,搜尋參數為nq=1, topk=1, ef=64 ,每個並發數的持續時間至少為 1 小時。
    12. +
    +

    測試結果

    Milvus 2.2.0 v.s. Milvus 2.1.0

    叢集

    +伺服器配置 (群集)yaml queryNode: replicas: 1 resources: limits: cpu: "12.0" memory: 8Gi requests: cpu: "12.0" memory: 8Gi

    +

    搜尋效能

    + + + + + + + + +
    MilvusQPSRT(TP99) / msRT(TP50) / ms故障/秒
    2.1.0690459280
    2.2.01024863240
    +

    + + Cluster search performance + 叢集搜尋效能

    +

    單機

    +伺服器配置(單機)yaml standalone: replicas: 1 resources: limits: cpu: "12.0" memory: 16Gi requests: cpu: "12.0" memory: 16Gi

    +

    搜尋效能

    + + + + + + + + +
    MilvusQPSRT(TP99) / msRT(TP50) / ms故障/秒
    2.1.04287104760
    2.2.07522127790
    +

    + + Standalone search performance + 獨立搜尋效能

    +

    Milvus 2.2.0 擴充能力

    擴充一個 Querynode 的 CPU 核心,以檢查擴充能力。

    +

    +伺服器配置 (群集)yaml queryNode: replicas: 1 resources: limits: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi requests: cpu: "8.0" /"12.0" /"16.0" /"32.0" memory: 8Gi

    +

    搜尋效能

    + + + + + + + + + + +
    CPU 核心並發數QPSRT(TP99) / msRT(TP50) / ms故障/秒
    85007153127830
    123001024863240
    166001413585420
    326002028163280
    +

    + + Search performance by Querynode CPU cores + 以 Querynode CPU 核心計算的搜尋效能

    +

    Milvus 2.2.0 擴充能力

    使用更多 Querynodes 擴充更多副本,以檢查擴充能力。

    +
    +

    注意:載入集合時,Querynodes 的數量等於replica_number

    +
    +

    +伺服器配置 (群集)yaml queryNode: replicas: 1 / 2 / 4 / 8 resources: limits: cpu: "8.0" memory: 8Gi requests: cpu: "8.0" memory: 8Gi

    + + + + + + + + + + +
    複製本並發數QPSRT(TP99) / msRT(TP50) / ms故障/秒
    15007153127830
    250015903105270
    480019281109400
    812003065593380
    +

    + + Search performance by Querynode replicas + 依據 Querynode 複製品的搜尋效能

    +

    下一步

      +
    • 參考本指南,嘗試自行執行 Milvus 2.2.0 基準測試,只是您應該改用本指南中的 Milvus 2.2 和 Pymilvus 2.2。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/reference/bitset.json b/localization/v2.5.x/site/zh-hant/reference/bitset.json new file mode 100644 index 000000000..61b68580c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/bitset.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Bitset","anchorList":[{"label":"比特集","href":"Bitset","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"實作","href":"Implementation","type":2,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/bitset.md b/localization/v2.5.x/site/zh-hant/reference/bitset.md new file mode 100644 index 000000000..c893bf50f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/bitset.md @@ -0,0 +1,130 @@ +--- +id: bitset.md +summary: 了解 Milvus 中的 bitsets。 +title: 比特集 +--- +

    比特集

    本主題介紹在 Milvus 中幫助實現屬性過濾和刪除操作等關鍵功能的 bitset 機制。

    +

    概述

    比特集是一組比特。比特是只有兩個可能值的元素,最典型的是01 ,或者是布林值truefalse 。在 Milvus 中,比特集是由比特數01 組成的陣列,相對於 ints、floats 或 chars,比特集可用來精簡、有效地表示某些資料。位元數預設為0 ,只有在符合特定要求時才會被設定為1

    +

    位元集的運算以布林邏輯進行,在布林邏輯下,輸出值為有效或無效,也分別以10 表示。例如,邏輯運算符 AND 可用於比較兩個位元集,比較的基礎是位於相同索引位置的項目,並將結果產生一個新的位元集。如果某個位置上的兩個項目相同,那麼在新的位元集中1 將被寫入該位置;如果兩個項目不同,則0

    +

    實作

    Bitset 是一個簡單但功能強大的機制,可以幫助 Milvus 執行屬性過濾、資料刪除,以及使用 Time Travel 進行查詢。

    +

    屬性過濾

    由於 bitset 只包含兩個可能的值,因此非常適合儲存屬性篩選的結果。符合特定屬性篩選條件的資料會以1 標示。

    +

    資料刪除

    比特集是儲存段中某一行是否被刪除資訊的簡潔方式。已刪除的實體在對應的位元集中會以1 標記,在搜尋或查詢時不會被計算

    +

    範例

    在這裡,我們提出三個範例來說明如何在 Milvus 中使用 bitset,並參考上面討論過的所有三種主要 bitset 實作。在所有三個案例中,都有一個包含 8 個實體的區段,接下來會發生一系列的資料處理語言 (DML) 事件,其順序如下所示。

    +
      +
    • 其中四個實體,其primary_keys 分別為 [1、2、3、4],會在時間戳ts 等於 100 時插入。
    • +
    • 其餘四個實體,其primary_keys 為 [5、6、7、8],會在時間戳ts 等於 200 時插入。
    • +
    • primary_keys 為 [7, 8] 的實體,會在時間戳記ts 等於 300 時刪除。
    • +
    • 只有primary_keys 為 [1, 3, 5, 7] 的實體才滿足屬性過濾的條件。
    • +
    +

    + + Order of DML events + DML 事件的順序

    +

    情況一

    在這種情況下,使用者設定time_travel 為 150,這表示使用者對滿足ts = 150 的資料進行查詢。比特集生成過程如圖 1 所示。

    +

    在初始篩選階段,filter_bitset 應該是[1, 0, 1, 0, 1, 0, 1, 0] ,其中實體 [1, 3, 5, 7] 因為是有效的篩選結果而被標記為1

    +

    然而,當ts 等於 150 時,實體 [4, 5, 6, 7] 並未插入向量資料庫。因此,不論篩選條件為何,這四個實體都應該標記為 0。現在比特集的結果應該是[1, 0, 1, 0, 0, 0, 0, 0]

    +

    正如在資料刪除中所討論的,在搜尋或查詢時,標記為1 的實體會被忽略。比特集結果現在需要翻轉,以便與刪除比特圖結合,這樣我們就可以得到[0, 1, 0, 1, 1, 1, 1, 1]

    +

    至於刪除位元集del_bitset ,初始值應該是[0, 0, 0, 0, 0, 0, 1, 1] 。但是,直到ts 為 300 時,才會刪除實體 7 和 8。因此,當ts 為 150 時,實體 7 和 8 仍然有效。因此,時間旅行之後的del_bitset 值是[0, 0, 0, 0, 0, 0, 0, 0]

    +

    現在,經過時間旅行和屬性篩選之後,我們有兩個位元集:filter_bitset [0, 1, 0, 1, 1, 1, 1, 1]del_bitset [0, 0, 0, 0, 0, 0, 0, 0] 。 使用OR 二元邏輯運算符結合這兩個位元集。result_bitset 的最終數值是[0, 1, 0, 1, 1, 1, 1, 1] ,這表示在接下來的搜尋或查詢階段中,只有實體 1 和 3 會被計算出來。

    +

    + + Figure 1. Search with Time Travel = 150. + 圖 1.時間旅行 = 150 的搜尋

    +

    案例二

    在這種情況下,使用者設定time_travel 為 250。比特集生成過程如圖 2 所示。

    +

    和情況一一樣,初始filter_bitset[1, 0, 1, 0, 1, 0, 1, 0]

    +

    ts = 250 時,所有實體都在向量資料庫中。因此,當我們將時間戳記納入因子時,filter_bitset 保持不變。同樣地,我們需要翻轉結果,得到[0, 1, 0, 1, 0, 1, 0, 1]

    +

    至於刪除位元集del_bitset ,初始值為[0, 0, 0, 0, 0, 0, 1, 1] 。然而,直到ts 為 300 時,實體 7 和 8 才被刪除。因此,當ts 為 250 時,實體 7 和 8 仍然有效。因此,時間旅行之後的del_bitset[0, 0, 0, 0, 0, 0, 0, 0]

    +

    現在我們有兩個經過時間旅行和屬性篩選後的位元集:filter_bitset [0, 1, 0, 1, 0, 1, 0, 1]del_bitset [0, 0, 0, 0, 0, 0, 0, 0] 。使用OR 二元邏輯運算符號合併這兩個位元集。結果_比特集是[0, 1, 0, 1, 0, 1, 0, 1] 。也就是說,在接下來的搜尋或查詢階段,只有 Entites [1, 3, 5, 7] 會被計算出來。

    +

    + + Figure 2. Search with Time Travel = 250. + 圖 2.時間旅行 = 250 的搜尋

    +

    情況三

    在這種情況下,使用者設定time_travel 為 350。比特集的產生過程如圖 3 所示。

    +

    與之前的情況一樣,初始filter_bitset[0, 1, 0, 1, 0, 1, 0, 1]

    +

    ts= 350 時,所有實體都在向量資料庫中。因此,最終翻轉的filter_bitset[0, 1, 0, 1, 0, 1, 0, 1] ,與案例二相同。

    +

    至於刪除位元集del_bitset ,由於實體 7 和 8 在ts = 350 時已經被刪除,因此del_bitset 的結果是[0, 0, 0, 0, 0, 0, 1, 1]

    +

    現在,經過時間旅行和屬性篩選之後,我們有兩個位元集:filter_bitset [0, 1, 0, 1, 0, 1, 0, 1]del_bitset [0, 0, 0, 0, 0, 0, 1, 1] 。 使用OR 二元邏輯算子結合這兩個位元集。最終的result_bitset[0, 1, 0, 1, 0, 1, 1, 1] 。也就是說,在接下來的搜尋或查詢階段,只有實體 [1, 3, 5] 會被計算出來。

    +

    + + Figure 3. Search with Time Travel = 350. + 圖 3.時間旅行 = 350 的搜尋

    +

    下一步

    現在您知道 bitsets 在 Milvus 中是如何運作的了,您也許還想

    + diff --git a/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.json b/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.json new file mode 100644 index 000000000..48c655998 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.json @@ -0,0 +1 @@ +{"codeList":["rootCoordinator:\n enabled: true\n # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.\n replicas: 2 # Otherwise, remove this configuration item.\n resources: {}\n nodeSelector: {}\n affinity: {}\n tolerations: []\n extraEnv: []\n heaptrack:\n enabled: false\n profiling:\n enabled: false # Enable live profiling\n activeStandby:\n enabled: true # Set this to true to have RootCoordinators work in active-standby mode.\n"," rootcoord:\n container_name: milvus-rootcoord\n image: milvusdb/milvus:v2.2.3\n command: [\"milvus\", \"run\", \"rootcoord\"]\n environment:\n ETCD_ENDPOINTS: etcd:2379\n MINIO_ADDRESS: minio:9000\n PULSAR_ADDRESS: pulsar://pulsar:6650\n ROOT_COORD_ADDRESS: rootcoord:53100\n # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n depends_on:\n - \"etcd\"\n - \"pulsar\"\n - \"minio\"\n\n# add the following to have RootCoords work in active-standby mode\n# rootcoord-1:\n# container_name: milvus-rootcoord-1\n# image: milvusdb/milvus:v2.2.3\n# command: [\"milvus\", \"run\", \"rootcoord\"]\n# environment:\n# ETCD_ENDPOINTS: etcd:2379\n# MINIO_ADDRESS: minio:9000\n# PULSAR_ADDRESS: pulsar://pulsar:6650\n# ROOT_COORD_ADDRESS: rootcoord-1:53100\n# # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby\n# ROOT_COORD_ENABLE_ACTIVE_STANDBY: true\n# depends_on:\n# - \"etcd\"\n# - \"pulsar\"\n# - \"minio\"\n","sudo ./scripts/start_cluster.sh\n","rootCoord:\n address: localhost\n port: 53100 # change to 53001\n","sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &\n","ps aux|grep milvus\n","> ps aux|grep milvus\nroot 12813 0.7 0.2 410709648 82432 ?? S 5:18PM 0:33.28 ./bin/milvus run rootcoord\nroot 12816 0.5 0.2 409487968 62352 ?? S 5:18PM 0:22.69 ./bin/milvus run proxy\nroot 17739 0.1 0.3 410289872 91792 s003 SN 6:01PM 0:00.30 ./bin/milvus run rootcoord\n...\n","[INFO] [sessionutil/session_util.go:649] [\"serverName: rootcoord is in STANDBY ...\"]\n","[2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] [\"watch the ACTIVE key\"] [DELETE=\"key:\\\"by-dev/meta/session/rootcoord-15\\\" mod_revision:167 \"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] [\"stop watching ACTIVE key\"]\n[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] [\"start retrying to register as ACTIVE service...\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] [\"register ACTIVE service successfully\"] [ServerID=19]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] [\"quit STANDBY mode, this node will become ACTIVE\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] [\"rootcoord switch from standby to active, activating\"]\n[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] [\"RootCoord Register Finished\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] [\"RootCoord start done ...\"]\n[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] [\"RootCoord successfully started\"]\n"],"headingContent":"Coordinator HA","anchorList":[{"label":"協調器 HA","href":"Coordinator-HA","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"啟用協調器 HA","href":"Enable-coordinator-HA","type":2,"isActive":false},{"label":"相關設定項目","href":"Related-configuration-items","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.md b/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.md new file mode 100644 index 000000000..909ca397f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/coordinator_ha.md @@ -0,0 +1,193 @@ +--- +id: coordinator_ha.md +summary: 了解 Milvus 協調員在主動待命工作的動機和程序。 +title: 協調器 HA +--- +

    協調器 HA

    Milvus 架構所示,Milvus 由許多元件組成,並以分散式方式運作。在所有元件中,Milvus 透過擴充和縮小節點來確保工作人員的高可用性,讓協調器成為整個鏈中唯一的薄弱環節。

    +

    概述

    在 2.2.3 版中,Milvus 為協調器實現了高可用性,使其在主動-備用模式下工作,減少可能導致服務不可用的單點故障 (SpoF)。

    +

    + + Coordinator HA + 協調器 HA

    +

    上圖說明了協調器如何在主動待命模式下工作。當一對協調器啟動時,它們會使用自己的伺服器 ID 向 etcd 註冊,並競爭主動角色。成功從 etcd 租用主動角色的協調器將開始提供服務,而這對協調器中的另一個協調器將維持待命,觀察主動角色,並準備在主動協調器死亡時提供服務。

    +

    啟用協調器 HA

    使用 Helm

    若要啟動多個協調器,並讓它們以主動待命模式運作,您應該對values.yaml 檔案做以下變更。

    +
      +
    • xxxCoordinator.replicas 設為2
    • +
    • xxxCoordinator.activeStandby.enabled 設為true
    • +
    +

    以下程式碼片段以 RootCoord 為例。您也可以對其他類型的協調器做同樣的動作。

    +
    rootCoordinator:
    +  enabled: true
    +  # You can set the number of replicas greater than 1 only if you also need to set activeStandby.enabled to true.
    +  replicas: 2  # Otherwise, remove this configuration item.
    +  resources: {}
    +  nodeSelector: {}
    +  affinity: {}
    +  tolerations: []
    +  extraEnv: []
    +  heaptrack:
    +    enabled: false
    +  profiling:
    +    enabled: false  # Enable live profiling
    +  activeStandby:
    +    enabled: true  # Set this to true to have RootCoordinators work in active-standby mode.
    +
    +

    使用 Docker

    要啟動多個協調器,並讓它們以主動待命模式運作,您可以在用來啟動 Milvus 叢集的docker-compose 檔案中加入一些定義。

    +

    以下的程式碼片段以 RootCoord 為例。您也可以對其他類型的協調器做同樣的操作。

    +
      rootcoord:
    +    container_name: milvus-rootcoord
    +    image: milvusdb/milvus:v2.2.3
    +    command: ["milvus", "run", "rootcoord"]
    +    environment:
    +      ETCD_ENDPOINTS: etcd:2379
    +      MINIO_ADDRESS: minio:9000
    +      PULSAR_ADDRESS: pulsar://pulsar:6650
    +      ROOT_COORD_ADDRESS: rootcoord:53100
    +      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +    depends_on:
    +      - "etcd"
    +      - "pulsar"
    +      - "minio"
    +
    +#   add the following to have RootCoords work in active-standby mode
    +#   rootcoord-1:
    +#    container_name: milvus-rootcoord-1
    +#    image: milvusdb/milvus:v2.2.3
    +#    command: ["milvus", "run", "rootcoord"]
    +#    environment:
    +#      ETCD_ENDPOINTS: etcd:2379
    +#      MINIO_ADDRESS: minio:9000
    +#      PULSAR_ADDRESS: pulsar://pulsar:6650
    +#      ROOT_COORD_ADDRESS: rootcoord-1:53100
    +#      # add ROOT_COORD_ENABLE_ACTIVE_STANDBY to enable active standby
    +#      ROOT_COORD_ENABLE_ACTIVE_STANDBY: true
    +#    depends_on:
    +#      - "etcd"
    +#      - "pulsar"
    +#      - "minio"
    +
    +

    使用 Mac/Linux shell

    要啟動多個協調器,並讓它們以主動待命模式工作,您可以

    +
      +
    1. 下載 Milvus 原始碼到您的本機磁碟機,並從原始碼啟動一個 Milvus 叢集,如下所示:

      +
      sudo ./scripts/start_cluster.sh
      +
      +

      在此步驟結束時,Milvus 只以每種類型的一個協調器執行。

    2. +
    3. 更新milvus.yaml ,變更每種類型的協調器的連接埠號。以下以rootCoord為例。

      +
      rootCoord:
      +  address: localhost
      +  port: 53100 # change to 53001
      +
    4. +
    5. 啟動備用協調器。

      +
      sudo nohup ./bin/milvus run rootcoord > /tmp/rootcoord2.log 2>&1 &
      +
      +

      在此步驟結束時,執行下列指令以驗證是否存在兩個協調器進程。

      +
      ps aux|grep milvus
      +
      +

      輸出應該類似於

      +
      > ps aux|grep milvus
      +root        12813   0.7 0.2 410709648   82432   ??  S   5:18PM  0:33.28 ./bin/milvus run rootcoord
      +root        12816   0.5 0.2 409487968   62352   ??  S   5:18PM  0:22.69 ./bin/milvus run proxy
      +root        17739   0.1 0.3 410289872   91792 s003  SN  6:01PM  0:00.30 ./bin/milvus run rootcoord
      +...
      +
      +

      而備用協調器每十秒輸出一個記錄項目,如下所示:

      +
      [INFO] [sessionutil/session_util.go:649] ["serverName: rootcoord is in STANDBY ..."]
      +
    6. +
    7. 關閉成對的主動協調器,並觀察備用協調器的行為。

      +

      您可以發現備用協調器接管主動角色需要 60 秒。

      +
      [2022/09/21 11:58:33.855 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [DEBUG] [sessionutil/session_util.go:677] ["watch the ACTIVE key"] [DELETE="key:\"by-dev/meta/session/rootcoord-15\" mod_revision:167 "]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:683] ["stop watching ACTIVE key"]
      +[2022/09/21 11:58:33.856 +08:00] [INFO] [sessionutil/session_util.go:655] ["start retrying to register as ACTIVE service..."]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:641] ["register ACTIVE service successfully"] [ServerID=19]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [sessionutil/session_util.go:690] ["quit STANDBY mode, this node will become ACTIVE"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:638] ["rootcoord switch from standby to active, activating"]
      +[2022/09/21 11:58:33.859 +08:00] [INFO] [rootcoord/root_coord.go:306] ["RootCoord Register Finished"]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [rootcoord/service.go:148] ["RootCoord start done ..."]
      +[2022/09/21 11:58:33.859 +08:00] [DEBUG] [components/root_coord.go:58] ["RootCoord successfully started"]
      +
    8. +
    +

    協調器 HA 預設為停用。您可以在 Milvus 設定檔中變更下列項目,手動啟用此功能。

    + +

    限制

    目前,主用與備用服務之間沒有強大的一致性保證。因此,備用協調器在接管主動角色時需要重新載入元資料。

    +

    Etcd 只會在目前的 session 超時後才釋放租約。會話超時預設為 60 秒。因此,從主動協調器死亡到備用協調器接管主動角色之間有 60 秒的間隔。

    diff --git a/localization/v2.5.x/site/zh-hant/reference/disk_index.json b/localization/v2.5.x/site/zh-hant/reference/disk_index.json new file mode 100644 index 000000000..2ea8530de --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/disk_index.json @@ -0,0 +1 @@ +{"codeList":["...\nDiskIndex:\n MaxDegree: 56\n SearchListSize: 100\n PQCodeBugetGBRatio: 0.125\n SearchCacheBudgetGBRatio: 0.125\n BeamWidthRatio: 4.0\n...\n"],"headingContent":"On-disk Index","anchorList":[{"label":"磁碟上索引","href":"On-disk-Index","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"索引和搜尋設定","href":"Index-and-search-settings","type":2,"isActive":false},{"label":"DiskANN 相關的 Milvus 配置","href":"DiskANN-related-Milvus-configurations","type":2,"isActive":false},{"label":"疑難排解","href":"Troubleshooting","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/disk_index.md b/localization/v2.5.x/site/zh-hant/reference/disk_index.md new file mode 100644 index 000000000..64f01f6ea --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/disk_index.md @@ -0,0 +1,159 @@ +--- +id: disk_index.md +related_key: disk_index +summary: Milvus 中的磁碟索引機制。 +title: 磁碟上索引 +--- +

    磁碟上索引

    本文介紹一種名為 DiskANN 的磁碟索引演算法。DiskANN 基於 Vamana 圖形,能夠在大型資料集中進行高效率的搜尋。

    +

    為了改善查詢效能,您可以為每個向量欄位指定索引類型

    +
    +目前,一個向量欄位只支援一種索引類型。切換索引類型時,Milvus 會自動刪除舊索引。
    +

    先決條件

    要使用 DiskANN,請注意

    +
      +
    • DiskANN 預設為停用。如果您偏好記憶體索引而非磁碟索引,建議您停用此功能以獲得更好的效能。
        +
      • 若要停用此功能,您可以在 milvus 配置文件中將queryNode.enableDisk 改為false
      • +
      • 若要再次啟用,您可以將queryNode.enableDisk 設為true
      • +
    • +
    • Milvus 實例在 Ubuntu 18.04.6 或更新版本上執行。
    • +
    • Milvus 資料路徑應掛載至 NVMe SSD,以獲得完整效能:
        +
      • 對於 Milvus 獨立實例,資料路徑應該是實例執行所在容器中的/var/lib/milvus/data
      • +
      • 對於 Milvus 叢集實例,資料路徑應該是 QueryNodes 和 IndexNodes 執行所在容器中的/var/lib/milvus/data
      • +
    • +
    +

    限制

    要使用 DiskANN,請確保您

    +
      +
    • 在資料中只使用至少 1 維的浮動向量。
    • +
    • 僅使用 Euclidean Distance (L2)、Inner Product (IP) 或 COSINE 來測量向量之間的距離。
    • +
    +

    索引和搜尋設定

      +
    • 索引建立參數

      +

      建立 DiskANN 索引時,請使用DISKANN 作為索引類型。不需要索引參數。

    • +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍預設值
      search_list候選名單的大小,較大的大小提供較高的召回率,但效能會降低。[topk, int32_max] (最大值)16
      +
    • +
    +

    DiskANN 是可調整的。您可以在${MILVUS_ROOT_PATH}/configs/milvus.yaml 中修改 DiskANN 相關的參數,以改善其效能。

    +
    ...
    +DiskIndex:
    +  MaxDegree: 56
    +  SearchListSize: 100
    +  PQCodeBugetGBRatio: 0.125
    +  SearchCacheBudgetGBRatio: 0.125
    +  BeamWidthRatio: 4.0
    +...
    +
    + + + + + + + + + + + +
    參數說明值範圍預設值
    MaxDegreeVamana 圖形的最大度數。
    值越大,召回率越高,但會增加索引的大小和建立索引的時間。
    [1, 512]56
    SearchListSize候選名單的大小。
    較大值會增加建立索引所花費的時間,但可提供較高的召回率。
    除非您需要減少建立索引的時間,否則請將它設定為小於MaxDegree 的值。
    [1, int32_max]100
    PQCodeBugetGBRatioPQ 代碼的大小限制。
    較大值可提供較高的召回率,但會增加記憶體使用量。
    (0.0, 0.25]0.125
    SearchCacheBudgetGBRatio快取節點數與原始資料的比率。
    較大值可改善索引建立效能,但會增加記憶體使用量。
    [0.0, 0.3)0.10
    BeamWidthRatio每次搜索迭代的最大 IO 請求數目與 CPU 數目之間的比率。[1,max(128 / CPU 數目,16)] 4.04.0
    +

    疑難排解

      +
    • 如何處理io_setup() failed; returned -11, errno=11:Resource temporarily unavailable 錯誤?

      +

      Linux 核心提供異步非阻塞 I/O (Asynchronous non-blocking I/O, AIO) 功能,允許一個進程同時啟動多個 I/O 作業,而不必等待任何一個完成。這有助於提升可重複處理和 I/O 的應用程式的效能。

      +

      可以使用 proc 檔案系統中的/proc/sys/fs/aio-max-nr 虛擬檔案調整效能。aio-max-nr 參數決定允許的最大並發要求數目。

      +

      aio-max-nr 預設為65535 ,您可以將其設定為10485760

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/reference/glossary.json b/localization/v2.5.x/site/zh-hant/reference/glossary.json new file mode 100644 index 000000000..15f6cd5f4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/glossary.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Terminology","anchorList":[{"label":"術語","href":"Terminology","type":1,"isActive":false},{"label":"自動增量","href":"AutoID","type":2,"isActive":false},{"label":"自動索引","href":"Auto-Index","type":2,"isActive":false},{"label":"Attu","href":"Attu","type":2,"isActive":false},{"label":"觀鳥者","href":"Birdwatcher","type":2,"isActive":false},{"label":"Bulk Writer","href":"Bulk-Writer","type":2,"isActive":false},{"label":"大量插入","href":"Bulk-Insert","type":2,"isActive":false},{"label":"卡迪納爾","href":"Cardinal","type":2,"isActive":false},{"label":"頻道","href":"Channel","type":2,"isActive":false},{"label":"集合","href":"Collection","type":2,"isActive":false},{"label":"依賴","href":"Dependency","type":2,"isActive":false},{"label":"動態模式","href":"Dynamic-schema","type":2,"isActive":false},{"label":"嵌入","href":"Embeddings","type":2,"isActive":false},{"label":"實體","href":"Entity","type":2,"isActive":false},{"label":"欄位","href":"Field","type":2,"isActive":false},{"label":"篩選","href":"Filter","type":2,"isActive":false},{"label":"篩選搜尋","href":"Filtered-search","type":2,"isActive":false},{"label":"混合搜尋","href":"Hybrid-search","type":2,"isActive":false},{"label":"索引","href":"Index","type":2,"isActive":false},{"label":"Kafka-Milvus Connector","href":"Kafka-Milvus-Connector","type":2,"isActive":false},{"label":"Knowhere","href":"Knowhere","type":2,"isActive":false},{"label":"日誌中介","href":"Log-broker","type":2,"isActive":false},{"label":"日誌快照","href":"Log-snapshot","type":2,"isActive":false},{"label":"日誌訂閱者","href":"Log-subscriber","type":2,"isActive":false},{"label":"訊息儲存","href":"Message-storage","type":2,"isActive":false},{"label":"度量類型","href":"Metric-type","type":2,"isActive":false},{"label":"記憶體映射","href":"Mmap","type":2,"isActive":false},{"label":"Milvus 備份","href":"Milvus-Backup","type":2,"isActive":false},{"label":"Milvus CDC","href":"Milvus-CDC","type":2,"isActive":false},{"label":"Milvus CLI","href":"Milvus-CLI","type":2,"isActive":false},{"label":"Milvus 遷移","href":"Milvus-Migration","type":2,"isActive":false},{"label":"Milvus 集群","href":"Milvus-cluster","type":2,"isActive":false},{"label":"Milvus 單機","href":"Milvus-standalone","type":2,"isActive":false},{"label":"多向量","href":"Multi-Vector","type":2,"isActive":false},{"label":"分區","href":"Partition","type":2,"isActive":false},{"label":"分區鍵","href":"Partition-key","type":2,"isActive":false},{"label":"PC 通道","href":"PChannel","type":2,"isActive":false},{"label":"PyMilvus","href":"PyMilvus","type":2,"isActive":false},{"label":"查詢","href":"Query","type":2,"isActive":false},{"label":"範圍搜尋","href":"Range-search","type":2,"isActive":false},{"label":"模式","href":"Schema","type":2,"isActive":false},{"label":"搜尋","href":"Search","type":2,"isActive":false},{"label":"區段","href":"Segment","type":2,"isActive":false},{"label":"Spark-Milvus Connector","href":"Spark-Milvus-Connector","type":2,"isActive":false},{"label":"碎片","href":"Shard","type":2,"isActive":false},{"label":"稀疏向量","href":"Sparse-vector","type":2,"isActive":false},{"label":"非結構化資料","href":"Unstructured-data","type":2,"isActive":false},{"label":"VChannel","href":"VChannel","type":2,"isActive":false},{"label":"向量","href":"Vector","type":2,"isActive":false},{"label":"Zilliz 雲端","href":"Zilliz-Cloud","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/glossary.md b/localization/v2.5.x/site/zh-hant/reference/glossary.md new file mode 100644 index 000000000..5e28936fe --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/glossary.md @@ -0,0 +1,806 @@ +--- +id: glossary.md +title: 術語 +--- +

    術語

    自動增量

    AutoID 是 primary 欄位的屬性,用來決定是否啟用 primary 欄位的 AutoIncrement。AutoID 的值根據時間戳定義。如需詳細資訊,請參閱create_schema

    +

    自動索引

    Milvus 根據經驗數據自動為特定欄位決定最適合的索引類型和參數。這非常適合不需要控制特定索引參數的情況。更多資訊請參考add_index

    +

    Attu

    Attu是 Milvus 的多合一管理工具,大大降低了管理系統的複雜性和成本。

    +

    觀鳥者

    Birdwatcher是 Milvus 的調試工具,可連接到 etcd,讓您即時監控 Milvus 伺服器的狀態,並作出調整。它也支援 etcd 檔案備份,協助開發人員排除故障。

    +

    Bulk Writer

    Bulk Writer是 Milvus SDK (例如 PyMilvus、Java SDK) 提供的資料處理工具,設計用來將原始資料集轉換成與 Milvus 相容的格式,以便有效率的匯入。

    +

    大量插入

    Bulk Insert是一個 API,透過允許在單一要求中匯入多個檔案來增強寫入效能,優化大型資料集的操作。

    +

    卡迪納爾

    Cardinal 由 Zilliz Cloud 開發,是一種尖端向量搜尋演算法,可提供無與倫比的搜尋品質與效能。憑藉其創新的設計和廣泛的優化,Cardinal 的性能優於 Knowhere 數倍到一個數量級,同時能夠自適應地處理各種不同的生產情境,例如不同的 K 大小、高過濾率、不同的資料分佈等。

    +

    頻道

    Milvus 使用兩種類型的通道:PC通道和V 通道。每個 PCchannel 對應一個日誌儲存的主題,而每個 VChannel 對應一個集合中的分片。

    +

    集合

    在 Milvus 中,集合等同於關聯式資料庫管理系統 (RDBMS) 中的資料表。集合是用來儲存和管理實體的主要邏輯物件。如需詳細資訊,請參閱管理集合

    +

    依賴

    依賴是另一個程式工作所依賴的程式。Milvus 的依賴程式包括 etcd (儲存元資料)、MinIO 或 S3 (物件儲存) 和 Pulsar (管理快照日誌)。如需詳細資訊,請參閱管理依賴

    +

    動態模式

    動態模式允許您在不修改現有模式的情況下,將具有新欄位的實體插入到集合中。這表示您可以在不知道集合的完整模式的情況下插入資料,並且可以包含尚未定義的欄位。您可以在建立資料集時啟用動態欄位,以啟用這項無模式功能。如需詳細資訊,請參閱啟用動態欄位

    +

    嵌入

    Milvus 提供內建嵌入功能,可與常用的嵌入提供者一起使用。在 Milvus 中建立資料集之前,您可以使用這些功能為您的資料集製作內嵌,簡化準備資料和向量搜尋的程序。要以實際操作建立嵌入,請參閱使用 PyMilvus 的模型來產生文字嵌入

    +

    實體

    實體由一組代表真實世界物件的欄位所組成。Milvus 中的每個實體都由一個唯一的主索引鍵來表示。

    +

    您可以自訂主索引鍵。如果您沒有手動設定,Milvus 會自動指定實體的主索引鍵。如果您選擇自訂主索引鍵,請注意 Milvus 目前不支援主索引鍵重複。因此,在同一個集合中可能有重複的主索引鍵。如需更多資訊,請參閱插入實體

    +

    欄位

    Milvus 集合中的欄位等同於 RDBMS 表中的欄位。欄位可以是結構化資料的標量欄位 (例如:數字、字串),或是嵌入向量的向量欄位。

    +

    篩選

    Milvus 支援標量篩選,透過謂語搜尋,允許您在查詢和搜尋中定義篩選條件,以精簡結果。

    +

    篩選搜尋將標量篩選應用於向量搜尋,允許您根據特定條件精煉搜尋結果。如需詳細資訊,請參閱篩選搜尋

    +

    Hybrid Search是自 Milvus 2.4.0 以來的混合搜尋 API。您可以搜尋多個向量字段並將它們融合。對於向量搜尋結合標量欄位篩選,稱為「篩選搜尋」。如需詳細資訊,請參閱混合搜尋

    +

    索引

    向量索引是由原始資料衍生出來的重組資料結構,可以大大加速向量相似性搜尋的過程。Milvus 支援向量字段和標量字段的多種索引類型。如需詳細資訊,請參閱向量索引類型

    +

    Kafka-Milvus Connector

    Kafka-Milvus Connector是指 Milvus 的 Kafka sink Connector。它允許您將向量資料從 Kafka 串流到 Milvus。

    +

    Knowhere

    Knowhere是 Milvus 的核心向量執行引擎,它整合了多個向量相似性搜尋程式庫,包括 Faiss、Hnswlib 和 Annoy。Knowhere 的設計也是為了支援異質運算。它可以控制在何種硬體(CPU 或 GPU)上執行索引建立和搜尋請求。這就是 Knowhere 名字的由來 - 知道在哪裡執行作業。

    +

    日誌中介

    日誌經紀人是一個支援播放的發佈-訂閱系統。它負責流數據的持久化、可靠的異步查詢的執行、事件通知以及查詢結果的返回。當工作節點從系統故障中復原時,它也會確保增量資料的完整性。

    +

    日誌快照

    日誌快照是二進位日誌,是段中較小的單位,記錄和處理 Milvus 中資料的更新和變更。一個區段的資料會持久化在多個 binlog 中。在 Milvus 中有三種 binlog:InsertBinlog、DeleteBinlog 和 DDLBinlog。如需詳細資訊,請參閱Meta 儲存

    +

    日誌訂閱者

    日誌訂閱者訂閱日誌序列,以更新本機資料,並以唯讀副本的形式提供服務。

    +

    訊息儲存

    訊息儲存是 Milvus 的日誌儲存引擎。Milvus 支援 Kafka 或 Pulsa 作為訊息儲存空間。如需詳細資訊,請參閱配置訊息儲存

    +

    度量類型

    類似度量類型用來量度向量之間的類似性。目前,Milvus 支援 Euclidean distance (L2)、Inner product (IP)、Cosine similarity (COSINE) 和二元公制類型。你可以根據你的情況選擇最合適的度量類型。如需更多資訊,請參閱相似度量

    +

    記憶體映射

    記憶體映射檔案可將檔案內容直接映射到記憶體中,從而實現高效的資料處理。當記憶體有限且無法載入所有資料時,此功能尤其有用。此技術可提升資料容量,並在某個程度上維持效能。但是,如果資料大大超出記憶體容量,搜尋和查詢速度可能會大幅降低。如需詳細資訊,請參閱MMap-enabled Data Storage

    +

    Milvus 備份

    Milvus 備份是一個建立資料複本的工具,在資料遺失事件發生後,可用來還原原始資料。

    +

    Milvus CDC

    Milvus CDC(變更資料擷取) 是一個人性化的工具,可以擷取和同步 Milvus 實體中的增量資料。它透過在源實體和目標實體之間無縫傳輸,確保業務資料的可靠性,讓增量備份和災難恢復變得簡單。

    +

    Milvus CLI

    Milvus Command-Line Interface(CLI) 是一個命令列工具,支援資料庫連線、資料操作及資料匯入匯出。以Milvus Python SDK 為基礎,它允許使用互動式命令列提示,透過終端機執行指令。

    +

    Milvus 遷移

    Milvus Migration是一個開放原始碼的工具,目的是方便將不同資料來源的資料遷移至 Milvus 2.x 中。

    +

    Milvus 集群

    在 Milvus 的叢集部署中,服務由一組節點提供,以實現高可用性和易擴展性。

    +

    Milvus 單機

    在 Milvus 的單機部署中,包括資料插入、索引建立、向量相似性搜尋等所有作業都在單一流程中完成。

    +

    多向量

    自 Milvus 2.4.0 起,Milvus 在一個集合中支援多向量字段。如需詳細資訊,請參閱混合搜尋

    +

    分區

    分區是一個集合的分割。Milvus 支援在實體儲存上,將集合資料分割成多個部分。這個過程稱為分割,每個分割區可以包含多個區段。如需詳細資訊,請參閱管理分割區

    +

    分區鍵

    欄位的分割區金鑰屬性可根據實體的分割區金鑰值,將實體分割成不同的分割區。這種分組方式可確保分享相同關鍵值的實體儲存在一起,這可讓系統在使用分區關鍵欄位篩選的查詢過程中,繞過不相關的分區,從而加快搜尋作業。如需詳細資訊,請參閱使用分割區金鑰

    +

    PC 通道

    PChannel 代表實體通道。每個 PC 通道對應一個用於日誌儲存的主題。預設情況下,當 Milvus 集群啟動時,會指派一組 16 個 PChannels 來儲存記錄資料插入、刪除和更新的日誌。如需詳細資訊,請參閱Message Channel-related Configurations

    +

    PyMilvus

    PyMilvus 是 Milvus 的 Python SDK。它的原始碼是開放源碼,並託管在GitHub 上。您可以彈性選擇 MilvusClient (新版 Python SDK) 或原始 ORM 模組來與 Milvus 對話。

    +

    查詢

    Query是一個 API,用指定的布林表達式作為過濾器來進行標量過濾。更多資訊請參考Get & Scalar Query

    +

    Range search(範圍搜尋)允許您尋找與搜尋向量在指定距離內的向量。如需詳細資訊,請參閱範圍搜尋

    +

    模式

    Schema 是定義資料類型和資料屬性的元資訊。每個集合都有自己的集合模式,定義集合的所有欄位、自動 ID (主索引鍵) 分配啟用和集合描述。欄位模式也包含在集合模式中,它定義了欄位的名稱、資料類型和其他屬性。如需詳細資訊,請參閱管理模式

    +

    Search是一種 API,用來執行向量相似性搜尋的作業,執行時需要向量資料。如需詳細資訊,請參閱單向量搜尋

    +

    區段

    片段是自動建立的資料檔案,用來儲存插入的資料。一個集合可能包含多個區段,每個區段可以容納許多實體。在向量相似性搜尋期間,Milvus 會檢查每個區段以編譯搜尋結果。

    +

    區段有兩種類型:成長型和封閉型。成長中的片段會持續收集新資料,直到達到特定的臨界值或時間限制,之後它就會被封鎖。一旦封鎖,區段就不再接受新資料,並轉移至物件儲存區。同時,傳入的資料會被路由到新的成長區段。達到預先定義的實體限制或超過成長狀態允許的最長時間,都會觸發從成長區段轉換到封閉區段。如需詳細資訊,請參閱設計細節

    +

    Spark-Milvus Connector

    Spark-Milvus Connector提供 Apache Spark 和 Milvus 的無縫整合,結合 Apache Spark 的資料處理和機器學習 (ML) 功能,以及 Milvus 的向量資料儲存和搜尋功能。

    +

    碎片

    Milvus 可透過使用分片 (Shard) 將寫入作業分散至多個節點,進而增強資料寫入效能。這可充分利用群集的平行運算能力。

    +

    分區可透過指定分區名稱來降低讀取負載,而分片則可將寫入負載分散到多台伺服器。

    +

    稀疏向量

    稀疏向量使用向量嵌入來表示單字或詞組,其中大部分元素為零,只有一個非零元素表示特定單字的存在。稀疏向量模型(例如 SPLADEv2)在域外知識搜尋、關鍵字感知和可解釋性上優於密集模型。如需詳細資訊,請參閱Sparse Vectors

    +

    非結構化資料

    非結構化資料,包括影像、視訊、音訊和自然語言,是不遵循預先定義的模型或組織方式的資訊。這種資料類型約佔全球資料的 80%,可使用各種人工智慧 (AI) 和 ML 模型轉換成向量。

    +

    VChannel

    VChannel代表邏輯通道。每個 VChannel 代表集合中的一個分片。每個集合都會被指派一組 VChannels,用來記錄資料的插入、刪除和更新。VChannels 在邏輯上是分開的,但在實體上卻共用資源。

    +

    向量

    嵌入向量是非結構化資料的特徵抽象,例如電子郵件、物聯網感測器資料、Instagram 照片、蛋白質結構等。從數學角度來看,嵌入向量是浮點數或二進位數陣列。現代嵌入技術可用於將非結構化資料轉換為嵌入向量。Milvus 自 2.4.0 起支援密集與稀疏向量。

    +

    Zilliz 雲端

    Zilliz Cloud 上全面管理 Milvus,擁有更多企業級功能和高度優化的效能。

    diff --git a/localization/v2.5.x/site/zh-hant/reference/gpu_index.json b/localization/v2.5.x/site/zh-hant/reference/gpu_index.json new file mode 100644 index 000000000..429943b36 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/gpu_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"GPU Index","anchorList":[{"label":"GPU 索引","href":"GPU-Index","type":1,"isActive":false},{"label":"GPU_CAGRA","href":"GPUCAGRA","type":2,"isActive":false},{"label":"GPU_IVF_FLAT","href":"GPUIVFFLAT","type":2,"isActive":false},{"label":"GPU_IVF_PQ","href":"GPUIVFPQ","type":2,"isActive":false},{"label":"GPU_BRUTE_FORCE","href":"GPUBRUTEFORCE","type":2,"isActive":false},{"label":"結論","href":"Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/gpu_index.md b/localization/v2.5.x/site/zh-hant/reference/gpu_index.md new file mode 100644 index 000000000..d3babb579 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/gpu_index.md @@ -0,0 +1,239 @@ +--- +id: gpu_index.md +related_key: gpu_index +summary: Milvus 中的 GPU 索引機制。 +title: GPU 索引 +--- +

    GPU 索引

    Milvus 支援多種 GPU 索引類型,以加速搜尋效能與效率,尤其是在高吞吐量與高回撥的情況下。本主題概述 Milvus 支援的 GPU 索引類型、適合的使用案例以及效能特性。有關使用 GPU 建立索引的資訊,請參閱Index with GPU

    +

    值得注意的是,與使用 CPU 索引相比,使用 GPU 索引不一定會減少延遲。如果您想要完全發揮吞吐量的最大效益,您需要極高的請求壓力或大量的查詢向量。

    +

    + + performance + 效能

    +

    Milvus 的 GPU 支援由 NvidiaRAPIDS團隊貢獻。以下是 Milvus 目前支援的 GPU 索引類型。

    +

    GPU_CAGRA

    GPU_CAGRA 是針對 GPU 最佳化的圖形索引,相較於使用昂貴的訓練級 GPU,使用推理級 GPU 來執行 Milvus GPU 版本可以更符合成本效益。

    +
      +
    • 索引建立參數

      + + + + + + + + + + + +
      參數說明預設值
      intermediate_graph_degree影響召回率和建立時間,方法是在剪枝之前先決定圖表的度。建議值為3264128
      graph_degree影響搜尋效能和召回率,方法是在剪枝後設定圖表的度。這兩個程度之間的差異越大,建立時間越長。其值必須小於intermediate_graph_degree 的值。64
      build_algo選擇剪枝前的圖形生成演算法。可能的值:
      IVF_PQ:提供更高的品質,但建立時間較慢。
      NN_DESCENT: 提供更快的建立速度,但召回率可能較低。
      IVF_PQ
      cache_dataset_on_device決定是否在 GPU 記憶體中快取原始資料集。可能的值:
      “true”:快取原始資料集,藉由精煉搜尋結果來提高召回率。
      “false”:不快取原始資料集以節省 GPU 記憶體。
      “false”
      adapt_for_cpu決定是否使用 GPU 建立索引,並使用 CPU 進行搜尋。
      將此參數設定為true 需要在搜尋請求中有ef 參數。
      “false”
      +
    • +
    • 搜尋參數

      + + + + + + + + + + + +
      參數說明預設值
      itopk_size決定搜尋期間保留的中間結果大小。較大的值可能會提高召回率,但會犧牲搜尋效能。它應該至少等於最終 top-k (限制) 值,而且通常是 2 的幂次 (例如 16、32、64、128)。
      search_width指定搜尋期間進入 CAGRA 圖形的入口點數量。增加此值可提高召回率,但可能會影響搜尋效能(例如:1、2、4、8、16、32)。
      min_iterations /max_iterations控制搜尋的迭代過程。預設值為0 ,CAGRA 會根據itopk_sizesearch_width 自動決定迭代次數。手動調整這些值有助於平衡效能與精確度。0
      team_size指定用於計算 GPU 公制距離的 CUDA 線程數。常見的值是 2 的幂次,最高為 32 (例如 2、4、8、16、32)。它對搜尋效能影響不大。預設值是0 ,Milvus 會根據向量維度自動選擇team_size0
      ef指定查詢時間/精確度的權衡。ef 值越高,搜尋準確度越高,但搜尋速度越慢。
      如果您在建立索引時將adapt_for_cpu 設定為true ,則必須使用此參數。
      [top_k, int_max]
      +
    • +
    +
      +
    • 搜尋限制

      + + + + + + + + +
      參數範圍
      limit (top-K)<= 1024
      limit (top-K)<=max((itopk_size + 31)// 32,search_width)* 32
      +
    • +
    +

    GPU_IVF_FLAT

    IVF_FLAT 相似,GPU_IVF_FLAT 也會將向量資料分割成nlist 叢集單位,然後比較目標輸入向量與每個叢集中心的距離。根據系統設定查詢的叢集數量 (nprobe),類似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。

    +

    透過調整nprobe ,可以在特定情況下找到精確度與速度之間的理想平衡。IVF_FLAT 效能測試的結果顯示,當目標輸入向量的數量 (nq) 和要搜尋的叢集數量 (nprobe) 增加時,查詢時間也會大幅增加。

    +

    GPU_IVF_FLAT 是最基本的 IVF 索引,每個單元儲存的編碼資料與原始資料一致。

    +

    在進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引的資料集,將任何搜尋的 top-K 設定為最高 256。

    +
      +
    • 索引建立參數

      + + + + + + + + +
      參數說明範圍預設值
      nlist群組單位數量[1, 65536]128
      cache_dataset_on_device決定是否在 GPU 記憶體中快取原始資料集。可能的值:
      “true”:快取原始資料集,藉由精煉搜尋結果來提高召回率。
      “false”: 不快取原始資料集,以節省 GPU 記憶體。
      "true" "flase""false"
      +
    • +
    • 搜尋參數

      +
        +
      • 一般搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
    • +
    • 搜尋限制

      + + + + + + + +
      參數範圍
      limit (top-K)<=2048
      +
    • +
    +

    GPU_IVF_PQ

    PQ (Product Quantization) 將原始的高維向量空間均勻地分解為 低維向量空間的笛卡兒乘積,然後將分解後的低維向量空間進行量化。乘積量化不需要計算目標向量與所有單元中心的距離,可以計算目標向量與每個低維空間的聚類中心的距離,大大降低了演算法的時間複雜度和空間複雜度。m

    +

    IVF_PQ 在量化向量的乘積之前先執行 IVF 索引聚類。其索引檔案比 IVF_SQ8 更小,但在搜尋向量時也會造成精確度的損失。

    +
    +

    索引建立參數和搜尋參數因 Milvus 分佈而異。請先選擇您的 Milvus 分佈。

    +

    進行搜尋時,請注意您可以針對 GPU_IVF_FLAT 索引集合的任何搜尋,將 top-K 設定為最高 8192。

    +
    +
      +
    • 索引建立參數

      + + + + + + + + + + +
      參數說明範圍預設值
      nlist群組單位數量[1, 65536]128
      m乘積量化的因子數、dim mod m or = 00
      nbits[Optional] 每個低維向量儲存的位元數。[1, 16]8
      cache_dataset_on_device決定是否在 GPU 記憶體中快取原始資料集。可能的值:
      “true”:快取原始資料集,藉由精煉搜尋結果來提高召回率。
      “false”: 不快取原始資料集,以節省 GPU 記憶體。
      "true" "false""false"
      +
    • +
    • 搜尋參數

      +
        +
      • 一般搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
    • +
    • 搜尋限制

      + + + + + + + +
      參數範圍
      limit (top-K)<=1024
      +
    • +
    +

    GPU_BRUTE_FORCE

    GPU_BRUTE_FORCE 適用於對召回率要求極高的情況,透過將每個查詢與資料集中的所有向量進行比較,保證召回率為 1。它只需要度量類型 (metric_type) 和 top-k (limit) 作為索引建立和搜尋參數。

    +

    對於 GPU_BRUTE_FORCE,不需要額外的索引建立參數或搜尋參數。

    +

    結論

    目前,Milvus 會將所有索引載入 GPU 記憶體,以進行有效率的搜尋作業。可載入的資料量取決於 GPU 記憶體的大小:

    +
      +
    • GPU_CAGRA:記憶體使用量約為原始向量資料的 1.8 倍。
    • +
    • GPU_IVF_FLATGPU_BRUTE_FORCE:需要相等於原始資料大小的記憶體。
    • +
    • GPU_IVF_PQ: 使用較小的記憶體佔用量,這取決於壓縮參數的設定。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/reference/index.json b/localization/v2.5.x/site/zh-hant/reference/index.json new file mode 100644 index 000000000..05f2b9be0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-memory Index","anchorList":[{"label":"記憶體索引","href":"In-memory-Index","type":1,"isActive":false},{"label":"ANNS 向量索引","href":"ANNS-vector-indexes","type":2,"isActive":false},{"label":"Milvus 支援的索引","href":"Indexes-supported-in-Milvus","type":2,"isActive":false},{"label":"常見問題","href":"FAQ","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/index.md b/localization/v2.5.x/site/zh-hant/reference/index.md new file mode 100644 index 000000000..12cb2dc62 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/index.md @@ -0,0 +1,679 @@ +--- +id: index.md +related_key: index +summary: Milvus 中的索引機制。 +title: 記憶體索引 +--- +

    記憶體索引

    本主題列出 Milvus 支援的各種類型的記憶體索引、每種索引最適合的情況,以及使用者可以設定的參數,以達到更好的搜尋效能。關於磁碟索引,請參閱磁碟索引

    +

    索引是有效組織資料的過程,它透過大幅加速大型資料集上耗時的查詢,在使相似性搜尋有用方面扮演重要角色。

    +

    為了改善查詢效能,您可以為每個向量欄位指定索引類型

    +
    +目前,一個向量欄位只支援一種索引類型。切換索引類型時,Milvus 會自動刪除舊索引。
    +

    ANNS 向量索引

    Milvus 支援的大部分向量索引類型都使用近似近鄰搜尋 (ANNS) 演算法。相較於精確檢索通常非常耗時,ANNS 的核心理念不再局限於傳回最精確的結果,而是只搜尋目標的近鄰。ANNS 在可接受的範圍內犧牲精確度,以提高檢索效率。

    +

    根據實作方法,ANNS 向量索引可分為四種類型:樹狀索引(Tree-based)、圖形索引(Graph-based)、哈希索引(Hash-based)和量化索引(Quantization-based)。

    +

    Milvus 支援的索引

    Milvus 支援多種索引類型,依其處理的向量嵌入類型分類:浮點嵌入(也稱為浮點向量或密集向量)、二進位嵌入 (也稱為二進位向量),以及稀疏嵌入(也稱為稀疏向量)。

    + +
    +

    浮點嵌入的索引

    對於 128 維浮點內嵌 (向量),它們所佔的儲存空間是 128 * float 的大小 = 512 位元組。而浮點內嵌使用的距離指標是 Euclidean distance (L2) 和 Inner product (IP)。

    +

    這些類型的索引包括FLAT,IVF_FLAT,IVF_PQ,IVF_SQ8,HNSW,HNSW_SQ,HNSW_PQ,HNSW_PRQ, 以及SCANN ,用於以 CPU 為基礎的 ANN 搜尋。

    +
    +
    +

    二元嵌入的索引

    對於 128 維的二進位嵌入,其所佔的儲存空間為 128 / 8 = 16 位元組。而用於二進位嵌入的距離指標是JACCARDHAMMING

    +

    這類索引包括BIN_FLATBIN_IVF_FLAT

    +
    +
    +

    稀疏內嵌索引

    稀疏內嵌的索引僅支援IPBM25 (用於全文檢索)度量。

    +

    這種類型的索引包括SPARSE_INVERTED_INDEXSPARSE_WAND

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    支援的索引分類情況
    平面不適用 +
      +
    • 資料集相對較小
    • +
    • 需要 100% 的召回率
    • +
    +
    IVF_FLAT不適用 +
      +
    • 高速查詢
    • +
    • 要求盡可能高的召回率
    • +
    +
    IVF_SQ8基於量化的索引 +
      +
    • 非常高速的查詢
    • +
    • 記憶體資源有限
    • +
    • 可接受召回率的輕微折衷
    • +
    +
    IVF_PQ基於量化的索引 +
      +
    • 高速查詢
    • +
    • 有限的記憶體資源
    • +
    • 接受召回率的輕微折衷
    • +
    +
    HNSW基於圖表的索引 +
      +
    • 非常高速的查詢
    • +
    • 要求盡可能高的召回率
    • +
    • 大量記憶體資源
    • +
    +
    HNSW_SQ基於量化的索引 +
      +
    • 非常高速的查詢
    • +
    • 有限的記憶體資源
    • +
    • 可接受召回率的輕微折衷
    • +
    +
    HNSW_PQ基於量化的索引 +
      +
    • 中速查詢
    • +
    • 非常有限的記憶體資源
    • +
    • 接受召回率的輕微折衷
    • +
    +
    HNSW_PRQ基於量化的索引 +
      +
    • 中速查詢
    • +
    • 非常有限的記憶體資源
    • +
    • 接受召回率的輕微折衷
    • +
    +
    SCANN基於量化的索引 +
      +
    • 非常高速的查詢
    • +
    • 要求盡可能高的召回率
    • +
    • 大量記憶體資源
    • +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    支援的索引分類情況
    BIN_FLAT基於量化的索引
      +
    • 取決於相對較小的資料集。
    • +
    • 要求完美的精確度。
    • +
    • 不適用壓縮。
    • +
    • 保證精確的搜尋結果。
    • +
    BIN_IVF_FLAT基於量化的索引
      +
    • 高速查詢
    • +
    • 要求盡可能高的召回率
    • +
    +
    +
    + + + + + + + + + + + + + + + + + + + + +
    支援的索引分類情況
    稀疏反向索引反向索引
      +
    • 取決於相對較小的資料集。
    • +
    • 需要 100% 的召回率。
    • +
    反向索引反向索引
      +
    • 弱 AND演算法加速
    • +
    • 可以獲得顯著的速度改善,而只犧牲少量的召回率。
    • +
    +
    +
    +

    平面

    對於需要完美精確度,並依賴相對較小(百萬量級)資料集的向量相似性搜尋應用,FLAT 索引是很好的選擇。FLAT 不會壓縮向量,而且是唯一能保證精確搜尋結果的索引。FLAT 的結果也可以用來比較其他召回率低於 100% 的索引所產生的結果。

    +

    FLAT 之所以精確,是因為它採用了窮盡方式進行搜尋,也就是說,對於每次查詢,目標輸入都會與資料集中的每一組向量進行比較。這使得 FLAT 成為我們清單上最慢的索引,而且不適合查詢大量向量資料。在 Milvus 中,FLAT 索引不需要任何參數,使用它也不需要資料訓練。

    +
      +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍
      metric_type[可選] 選擇的距離度量。請參閱支援的公制
      +
    • +
    +

    IVF_FLAT

    IVF_FLAT 將向量資料分割成nlist 叢集單位,然後比較目標輸入向量與每個叢集中心點之間的距離。根據系統設定查詢的叢集數量 (nprobe) ,相似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。

    +

    透過調整nprobe ,可以在特定情況下找到精確度與速度之間的理想平衡。IVF_FLAT 效能測試的結果顯示,當目標輸入向量的數量 (nq) 和要搜尋的叢集數量 (nprobe) 增加時,查詢時間也會急遽增加。

    +

    IVF_FLAT 是最基本的 IVF 索引,每個單元儲存的編碼資料與原始資料一致。

    +
      +
    • 索引建立參數

      + + + + + + + +
      參數說明範圍預設值
      nlist群組單位數量[1, 65536]128
      +
    • +
    • 搜尋參數

      +
        +
      • 共用搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
      • 範圍搜尋

        + + + + + + + +
        參數說明範圍預設值
        max_empty_result_buckets

        這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_SQ8

    IVF_FLAT 不會執行任何壓縮,因此它產生的索引檔案大小與原始、未編入索引的向量資料大致相同。例如,如果原始的 1B SIFT 資料集是 476 GB,則其 IVF_FLAT 索引檔案會稍微小一些 (~470 GB)。將所有索引檔案載入記憶體將會消耗 470 GB 的儲存空間。

    +

    當磁碟、CPU 或 GPU 記憶體資源有限時,IVF_SQ8 是比 IVF_FLAT 更好的選擇。此索引類型可透過執行 Scalar Quantization (SQ) 將每個 FLOAT (4 位元組) 轉換為 UINT8 (1 位元組)。這樣可以減少 70-75% 的磁碟、CPU 和 GPU 記憶體消耗。對於 1B SIFT 資料集,IVF_SQ8 索引檔案只需要 140 GB 的儲存空間。

    +
      +
    • 索引建立參數

      + + + + + + + +
      參數說明範圍
      nlist叢集單位數量[1, 65536]
      +
    • +
    • 搜尋參數

      +
        +
      • 共用搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
      • 範圍搜尋

        + + + + + + + +
        參數說明範圍預設值
        max_empty_result_buckets

        這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
        [1, 65535]2
        +
      • +
    • +
    +

    IVF_PQ

    PQ (Product Quantization) 將原始的高維向量空間均勻地分解成 低維向量空間的笛卡兒乘積,然後將分解後的低維向量空間量化。乘積量化不需要計算目標向量與所有單元中心的距離,可以計算目標向量與每個低維空間的聚類中心的距離,大大降低了演算法的時間複雜度和空間複雜度。m

    +

    IVF_PQ 在量化向量的乘積之前先執行 IVF 索引聚類。其索引檔案比 IVF_SQ8 更小,但在搜尋向量時也會造成精確度的損失。

    +
    +

    索引建立參數和搜尋參數因 Milvus 分佈而異。請先選擇您的 Milvus 分佈。

    +
    +
      +
    • 索引建立參數

      + + + + + + + + + +
      參數說明範圍
      nlist群集單位數量[1, 65536]
      m乘積量化的因子數dim mod m == 0
      nbits[Optional] 儲存每個低維向量的位元數。[1, 64] (預設為 8)
      +
    • +
    • 搜尋參數

      +
        +
      • 一般搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
      • 範圍搜尋

        + + + + + + + +
        參數說明範圍預設值
        max_empty_result_buckets

        這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
        [1, 65535]2
        +
      • +
    • +
    +

    SCANN

    ScaNN (Scalable Nearest Neighbors) 在向量聚類和乘積量化方面與 IVF_PQ 相似。它們的不同之處在於乘積量化的實作細節,以及使用 SIMD (Single-Instruction / Multi-data) 進行有效率的計算。

    +
      +
    • 索引建立參數

      + + + + + + + + +
      參數說明範圍
      nlist叢集單位數量[1, 65536]
      with_raw_data是否在索引中包含原始資料True 或 .預設為 。False True
      +
      +

      與 IVF_PQ 不同,預設值適用於mnbits ,以取得最佳效能。

      +
      +
    • +
    • 搜尋參數

      +
        +
      • 常見搜尋

        + + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]
        reorder_k要查詢的候選單位數量[top_k, ∞]top_k
        +
      • +
      • 範圍查詢

        + + + + + + + +
        參數說明範圍預設值
        max_empty_result_buckets

        這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
        [1, 65535]2
        +
      • +
    • +
    +

    HNSW

    HNSW (Hierarchical Navigable Small World Graph) 是一種以圖表為基礎的索引演算法。它根據特定規則為圖像建立多層導覽結構。在此結構中,上層較為稀疏,節點之間的距離較遠;下層較為密集,節點之間的距離較近。搜尋從最上層開始,在這一層中找到最接近目標的節點,然後進入下一層開始另一次搜尋。經過多次迭代後,可以快速接近目標位置。

    +

    為了改善效能,HNSW 將圖表每層上節點的最大度數限制為M 。此外,您可以使用efConstruction (建立索引時) 或ef (搜尋目標時) 來指定搜尋範圍。

    +
      +
    • 索引建立參數

      + + + + + + + + +
      參數說明範圍預設值
      MM 定義圖表中最大的出線連線數。在固定的 ef/efConstruction 下,M 越大,精確度/run_time 越高。[2, 2048]
      efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
      +
    • +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍預設值
      ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
      +
    • +
    +

    HNSW_SQ

    標量量化 (Scalar Quantization, SQ) 是一種技術,用來根據浮點資料的大小,將其離散成一組有限的數值。例如,SQ6表示量化為 (2^6 = 64) 個離散數值,其中每個浮點數使用 6 位元編碼。同樣地,SQ8將資料量化為 (2^8 = 256) 個離散值,其中每個浮點數使用 8 位元表示。這種量化方式可減少記憶體佔用量,同時保留資料的基本結構,以提高處理效率。

    +

    結合 SQ,HNSW_SQ 在索引大小與精確度之間提供了可控制的權衡,同時維持每秒高查詢 (QPS) 的效能。與標準的 HNSW 相比,它會導致索引建置時間的適度增加。

    +
      +
    • 索引建置參數

      + + + + + + + + + + + +
      參數說明範圍預設值
      MM 定義圖表中最大的出線連線數。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
      efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
      sq_type標量量化器類型。SQ6,SQ8,BF16FP16SQ8
      refine索引建立期間是否保留精煉資料。true,falsefalse
      refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
      +
    • +
    • 搜尋參數

      + + + + + + + + +
      參數說明範圍預設值
      ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
      refine_krefine 相對於k 的放大係數。[1,float_max)1
      +
    • +
    +

    HNSW_PQ

    PQ 的基本概念是將向量分割成m 個子向量,每個子向量會根據 kmeans 找到2^{nbits} 的 centroids,每個子向量會選擇最接近的 centroids 作為它的近似子向量。然後,我們記錄所有的中心點,因此每個子向量可編碼為nbits ,而長度為dim 的浮動向量可編碼為m ⋅ nbits位元。

    +

    結合 PQ,HNSW_PQ 在索引大小與精確度之間提供了可控制的折衷,但在相同的壓縮率下,它的 QPS 值比 HNSW_SQ 低,召回率也比 HNSW_SQ 高。與 HNSW_SQ 相比,它需要更長的時間來建立索引。

    +
      +
    • 索引建立參數

      + + + + + + + + + + + + +
      參數說明範圍預設值
      MM 定義圖表中出線連線的最大數目。在固定 ef/efConstruction 時,M 越大,精確度/run_time 越高。[2, 2048]
      efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提高索引品質,但也會延長索引建立時間。[1, int_max]
      m將向量分割成的子向量群組數。[1, 65536]32
      nbits每個子向量群量化成的位元數。[1, 24]8
      refine建立索引時是否保留精煉資料。true,falsefalse
      refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
      +
    • +
    • 搜尋參數

      + + + + + + + + +
      參數說明範圍預設值
      ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
      refine_krefine 相對於k 的放大係數。[1,float_max)1
      +
    • +
    +

    HNSW_PRQ

    PRQ 與 PQ 相似,也是將向量分成m 組。每個子向量將被編碼為nbits 。完成 pq 量化後,會計算向量與 pq 量化向量之間的殘差,並對殘差向量套用 pq 量化。總共會執行nrq 完整的 pq 量化,因此長度為dim 的浮動向量將被編碼為m ⋅ nbits ⋅ nrqbits。

    +

    結合了 Product Residual Quantizer (PRQ),HNSW_PRQ 在索引大小與精確度之間提供了更高的可控權衡。與 HNSW_PQ 相比,在相同的壓縮率下,HNSW_PRQ 的 QPS 值與 HNSW_PQ 的召回率幾乎相等。與 HNSW_PQ 相比,建立索引的時間可能會增加數倍。

    +
      +
    • 索引建立參數

      + + + + + + + + + + + + + +
      參數說明範圍預設值
      MM 定義圖表中最大的出線連線數。在固定的 ef/efConstruction 下,M 越大,精確度/run_time 越高。[2, 2048]
      efConstructionef_construction 控制索引搜尋速度/建立速度的取捨。增加 efConstruction 參數可能會提升索引品質,但也會延長索引建立時間。[1, int_max]
      m將向量分割成的子向量群組數。[1, 65536]32
      nbits每個子向量群量化成的位元數。[1, 24]8
      nrq殘餘子量化器的數量。[1, 16]2
      refine建立索引時是否保留精煉資料。true,falsefalse
      refine_type精煉索引的資料類型。SQ6,SQ8,BF16,FP16FP32
      +
    • +
    • 搜尋參數

      + + + + + + + + +
      參數說明範圍預設值
      ef控制查詢時間/精確度權衡的參數。ef 越高,搜尋越精確,但速度越慢。[top_k, int_max]
      refine_krefine 相對於k 的放大係數。[1,float_max)1
      +
    • +
    +
    +
    +

    BIN_FLAT

    除了只能用於二進位嵌入之外,這個索引與 FLAT 完全相同。

    +

    對於需要完美精確度,並依賴相對較小(百萬量級)資料集的向量相似性搜尋應用,BIN_FLAT 索引是一個不錯的選擇。BIN_FLAT 不會壓縮向量,而且是唯一能保證精確搜尋結果的索引。BIN_FLAT 的結果也可以用來比較其他召回率低於 100% 的索引所產生的結果。

    +

    BIN_FLAT 之所以準確,是因為它採用了窮盡搜尋的方式,也就是說,對於每個查詢,目標輸入都會與資料集中的向量進行比較。這使得 BIN_FLAT 成為我們清單上最慢的索引,而且不適合查詢大量向量資料。在 Milvus 中,BIN_FLAT 索引沒有任何參數,使用它不需要資料訓練或額外的儲存空間。

    +
      +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍
      metric_type[可選] 選擇的距離度量。請參閱支援的公制
      +
    • +
    +

    BIN_IVF_FLAT

    這個索引與 IVF_FLAT 完全相同,只是只能用於二進位嵌入。

    +

    BIN_IVF_FLAT 會將向量資料分割成nlist 叢集單位,然後比較目標輸入向量與每個叢集中心的距離。根據系統設定查詢的叢集數量 (nprobe),相似性搜尋結果只會根據目標輸入與最相似叢集中向量的比較結果傳回 - 大幅縮短查詢時間。

    +

    透過調整nprobe ,可以在特定情況下找到精確度與速度之間的理想平衡。查詢時間會隨著目標輸入向量的數量 (nq) 以及要搜尋的群集數量 (nprobe) 的增加而急遽增加。

    +

    BIN_IVF_FLAT 是最基本的 BIN_IVF 索引,每個單元儲存的編碼資料與原始資料一致。

    +
      +
    • 索引建立參數

      + + + + + + + +
      參數說明範圍
      nlist群集單元數[1, 65536]
      +
    • +
    • 搜尋參數

      +
        +
      • 共用搜尋

        + + + + + + + +
        參數說明範圍預設值
        nprobe要查詢的單位數量[1, nlist]8
        +
      • +
      • 範圍搜尋

        + + + + + + + +
        參數說明範圍預設值
        max_empty_result_buckets

        這是範圍搜尋參數,當連續空桶的數量達到指定值時,搜尋程序會終止。增加此值可以提高召回率,但代價是增加搜尋時間。
        [1, 65535]2
        +
      • +
    • +
    +
    +
    +

    sparse_inverted_index

    每個維度都會維護一個在該維度上有非零值的向量清單。在搜尋過程中,Milvus 會反覆搜尋查詢向量的每個維度,並計算在這些維度上有非零值的向量的分數。

    +
      +
    • 索引建立參數

      + + + + + + + +
      參數說明範圍
      drop_ratio_build在索引建立過程中排除小向量值的比例。此選項允許微調索引建立過程,透過在建立索引時忽略小值,在效率和精確度之間做出權衡。[0, 1]
      +
    • +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍
      drop_ratio_search搜尋過程中排除的小向量值比例。此選項允許微調搜尋過程,方法是指定忽略查詢向量中最小值的比例。它有助於平衡搜尋精確度與效能。drop_ratio_search 設定的值越小,這些小值對最終得分的貢獻就越小。藉由忽略一些小值,可以在對精確度影響最小的情況下提高搜尋效能。[0, 1]
      +
    • +
    +

    SPARSE_WAND

    此索引與SPARSE_INVERTED_INDEX 有相似之處,但它利用Weak-AND演算法來進一步減少搜尋過程中完整 IP 距離評估的次數。

    +

    根據我們的測試,SPARSE_WAND 在速度上普遍優於其他方法。然而,隨著向量密度的增加,其效能可能會快速衰退。為了解決這個問題,引入非零的drop_ratio_search 可以大幅提升效能,同時只會造成最小的精確度損失。如需詳細資訊,請參閱Sparse Vector

    +
      +
    • 索引建立參數

      + + + + + + + +
      參數說明範圍
      drop_ratio_build在索引建立過程中排除小向量值的比例。此選項允許微調索引建立過程,透過在建立索引時忽略小值,在效率和精確度之間做出權衡。[0, 1]
      +
    • +
    • 搜尋參數

      + + + + + + + +
      參數說明範圍
      drop_ratio_search搜尋過程中排除的小向量值比例。此選項允許微調搜尋過程,方法是指定忽略查詢向量中最小值的比例。它有助於平衡搜尋精確度與效能。drop_ratio_search 設定的值越小,這些小值對最終得分的貢獻就越小。藉由忽略一些小值,可以在對精確度影響最小的情況下提高搜尋效能。[0, 1]
      +
    • +
    +
    +

    常見問題

    +FLAT 索引與 IVF_FLAT 索引有何不同?

    +

    IVF_FLAT 索引將向量空間分為nlist 叢集。如果您保持nlist 的預設值為 16384,Milvus 會比較目標向量與所有 16384 叢集中心的距離,以得到nprobe 最近的叢集。接著,Milvus 會比較目標向量與選取的叢集中向量之間的距離,以得到最近的向量。與 IVF_FLAT 不同,FLAT 直接比較目標向量與每個向量之間的距離。

    +

    +因此,當向量的總數大約等於nlist 時,IVF_FLAT 與 FLAT 所需的計算方式與搜尋效能差異不大。但是當向量的數量增加到nlist 的 2 倍、3 倍或 n 倍時,IVF_FLAT 索引就開始顯示出越來越大的優勢。

    +

    +更多資訊請參閱如何在 Milvus 中選擇索引

    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/knowhere.json b/localization/v2.5.x/site/zh-hant/reference/knowhere.json new file mode 100644 index 000000000..59b464a92 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/knowhere.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Knowhere","anchorList":[{"label":"Knowhere","href":"Knowhere","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"Knowhere 在 Milvus 架構中的位置","href":"Knowhere-in-the-Milvus-architecture","type":2,"isActive":false},{"label":"Knowhere 的優勢","href":"Knowhere-advantages","type":2,"isActive":false},{"label":"Knowhere 代碼結構","href":"Knowhere-code-structure","type":2,"isActive":false},{"label":"向Knowhere添加索引","href":"Adding-indices-to-Knowhere","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/knowhere.md b/localization/v2.5.x/site/zh-hant/reference/knowhere.md new file mode 100644 index 000000000..3451761ed --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/knowhere.md @@ -0,0 +1,179 @@ +--- +id: knowhere.md +summary: 在 Milvus 瞭解 Knowhere。 +title: Knowhere +--- +

    Knowhere

    本主題介紹 Milvus 的核心向量執行引擎 Knowhere。

    +

    概述

    Knowhere 是 Milvus 的核心向量執行引擎,它整合了多個向量相似性搜尋程式庫,包括FaissHnswlibAnnoy。Knowhere 的設計也支援異質運算。它可以控制在何種硬體(CPU 或 GPU)上執行索引建立和搜尋請求。這就是 Knowhere 名字的由來 - 知道在哪裡執行作業。未來的版本將支援更多的硬體類型,包括 DPU 和 TPU。

    +

    Knowhere 在 Milvus 架構中的位置

    下圖說明了 Knowhere 在 Milvus 架構中的位置。

    +

    + + Knowhere + Knowhere

    +

    最底層是系統硬體。上面是第三方索引庫。在最上層,Knowhere 透過 CGO 與索引節點和查詢節點互動,CGO 允許 Go 套件呼叫 C 程式碼。

    +

    Knowhere 的優勢

    以下是 Knowhere 相對於 Faiss 的優勢。

    +

    支援 BitsetView

    Milvus 引入了一個 bitset 機制來實現 「軟刪除」。軟刪除的向量仍然存在於資料庫中,但不會在向量相似性搜索或查詢中被計算出來。

    +

    位元集中的每個位元對應一個索引向量。如果一個向量在 bitset 中被標記為 "1",就表示這個向量是軟刪除的,在向量搜尋時不會涉及。bitset 參數應用於 Knowhere 中所有外露的 Faiss 索引查詢 API,包括 CPU 和 GPU 索引。

    +

    關於 bitset 機制的更多資訊,請參閱bitset

    +

    索引二進位向量時支援多種相似度指標

    Knowhere 支援HammingJaccardTanimotoSuperstructureSubstructure。Jaccard 和 Tanimoto 可用於測量兩個樣本集之間的相似性,而 Superstructure 和 Substructure 則可用於測量化學結構的相似性。

    +

    支援 AVX512 指令集

    除了 Faiss 已經支援的AArch64SSE4.2AVX2 指令集之外,Knowhere 也支援AVX512 指令集,相較於 AVX2 指令集,AVX512 指令集可以提高索引建立和查詢的效能 20% 到 30%

    +

    自動選擇SIMD指令

    Knowhere 支援在任何 CPU 處理器上 (包括內部平台與雲端平台) 自動調用適合的 SIMD 指令 (例如 SIMD SSE、AVX、AVX2 與 AVX512),因此使用者不需要在編譯時手動指定 SIMD 標誌 (例如 "-msse4")。

    +

    Knowhere 是透過重構 Faiss 的程式碼來建立的。依賴 SIMD 加速的常見函數 (例如相似性運算) 會被分解出來。然後,每個函式都會有四個版本 (即 SSE、AVX、AVX2、AVX512) 來實作,並各自放入獨立的原始碼檔案。然後,這些原始碼檔案再以相對應的 SIMD 標誌單獨編譯。因此,在運行時,Knowhere 可以根據當前的 CPU 標誌自動選擇最適合的 SIMD 指令,然後使用掛鉤(hooking)連結正確的函式指針。

    +

    其他效能優化

    閱讀Milvus: A Purpose-Built Vector Data Management System了解更多關於 Knowhere 性能優化的資訊。

    +

    Knowhere 代碼結構

    Milvus中的計算主要涉及向量和標量操作。Knowhere 只處理向量索引的操作。

    +

    索引是獨立於原始向量資料的資料結構。一般而言,建立索引需要四個步驟:建立索引、訓練資料、插入資料和建立索引。在某些人工智能應用中,資料集訓練與向量搜尋是分開的。資料集的資料會先經過訓練,然後插進像 Milvus 之類的向量資料庫中進行相似性搜尋。例如,開放資料集 sift1M 和 sift1B 區分了用於訓練的資料和用於測試的資料。

    +

    然而,在 Knowhere 中,用於訓練的資料和用於搜尋的資料是相同的。Knowhere 訓練一個區段中的所有資料,然後將所有訓練過的資料插入,並為它們建立索引。

    +

    DataObj:基類

    DataObj 是 Knowhere 中所有數據結構的基類。 是 中唯一的虛方法。Index 類繼承自 ,並有一個欄位名為 "size_"。Index 類也有兩個虛擬方法 - 和 。從 派生的 類是所有向量索引的虛基類。 提供的方法包括 , , , 和 。Size() DataObj DataObj Serialize() Load() Index VecIndex VecIndex Train() Query() GetStatistics() ClearStatistics()

    +

    + + base class + 基類

    +

    上圖右側列出了一些其他的索引類型。

    +
      +
    • Faiss 索引有兩個基類:FaissBaseIndex 適用於所有浮點向量上的索引,而FaissBaseBinaryIndex 適用於所有二進位向量上的索引。

    • +
    • GPUIndex 是所有 Faiss GPU 索引的基類。

    • +
    • OffsetBaseIndex 是所有自行開發索引的基類。由於只有向量 ID 會儲存在索引檔案中,因此 128 維向量的檔案大小可以減少 2 個數量級。

    • +
    +

    + + IDMAP + IDMAP

    +

    嚴格來說,IDMAP 並非索引,而是用於強制搜尋。當向量插入資料庫時,既不需要資料訓練,也不需要建立索引。搜尋將直接在插入的向量資料上進行。

    +

    不過,為了保持程式碼的一致性,IDMAP 也繼承自VecIndex 類的所有虛擬介面。IDMAP 的用法與其他索引相同。

    +

    IVF 索引

    + + IVF + IVF

    +

    IVF (倒置檔案) 索引是最常使用的。IVF 類派生出VecIndexFaissBaseIndex ,並進一步延伸至IVFSQIVFPQGPUIVF 派生出GPUIndexIVF 。然後GPUIVF 進一步延伸至GPUIVFSQGPUIVFPQ

    +

    IVFSQHybrid 是一種自行開發的混合索引。粗量化器在 GPU 上執行,而桶中的搜尋則在 CPU 上執行。 的召回率與 相同,但性能更佳。IVFSQHybrid GPUIVFSQ

    +

    二元索引的基類結構相對較簡單。BinaryIDMAPBinaryIVF 是從FaissBaseBinaryIndexVecIndex 衍生出來的。

    +

    第三方索引

    + + third-party indices + 第三方指數

    +

    目前,除了 Faiss 之外,只支援兩種第三方索引:樹狀索引Annoy ,以及圖狀索引HNSW 。這兩種常用的第三方指數都來自VecIndex

    +

    向Knowhere添加索引

    如果你想添加新的索引到Knowhere,首先你可以參考現有的索引:

    +
      +
    • 要添加基於量化的指數,請參考IVF_FLAT

    • +
    • 要添加基於圖表的索引,請參考HNSW

    • +
    • 要添加基於樹的索引,請參考Annoy

    • +
    +

    參考現有索引後,您可以按照以下步驟在Knowhere中添加新索引。

    +
      +
    1. IndexEnum 中添加新索引的名稱。資料類型為字串。

    2. +
    3. 在文件ConfAdapter.cpp 中為新索引添加數據驗證檢查。驗證檢查主要是驗證數據訓練和查詢的參數。

    4. +
    5. 為新索引建立新檔案。新索引的基類應包括VecIndex ,以及VecIndex 的必要虛擬介面。

    6. +
    7. VecIndexFactory::CreateVecIndex() 中加入新索引的索引建立邏輯。

    8. +
    9. unittest 目錄下加入單元測試。

    10. +
    +

    下一步

    在學習了 Knowhere 如何在 Milvus 中運作之後,你可能還想

    + diff --git a/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.json b/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.json new file mode 100644 index 000000000..a3921fb16 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Multi-tenancy strategies","anchorList":[{"label":"多租户策略","href":"Multi-tenancy-strategies","type":1,"isActive":false},{"label":"面向資料庫的多租戶","href":"Database-oriented-multi-tenancy","type":2,"isActive":false},{"label":"面向集合的多租戶","href":"Collection-oriented-multi-tenancy","type":2,"isActive":false},{"label":"面向分區的多租戶","href":"Partition-oriented-multi-tenancy","type":2,"isActive":false},{"label":"下一步是什麼","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.md b/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.md new file mode 100644 index 000000000..0b1640931 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/multi_tenancy.md @@ -0,0 +1,106 @@ +--- +id: multi_tenancy.md +related_key: multi-tenancy +summary: Milvus 中的多租戶。 +title: 多租户策略 +--- +

    多租户策略

    在許多用例中,開發人員希望運行一個 Milvus 集群並為多個租戶提供服務,例如幾個產品團隊或數百萬最終用戶。本指南說明在 Milvus 上實現多租戶的幾種不同策略。

    +

    Milvus 的設計支援資料庫、集合或分割層級的多重租用。多租用的目的是將資料和資源彼此分開。在不同的層級實施多租用可以達到不同程度的隔離,但也涉及不同的開銷。在此,我們將解釋它們之間的權衡。

    +

    面向資料庫的多租戶

    自 Milvus 版本 2.2.9 起,您可以在單一 Milvus 集群中創建多個資料庫。此功能可實現面向資料庫的多租戶,為每個租戶分配一個資料庫,以便他們可以創建自己的集合。這種方法可為租戶提供最佳的資料和資源隔離,但一個叢集中最多只能有 64 個資料庫。

    +

    面向集合的多租戶

    有兩種可能的方式來實現面向集合的多租戶。

    +

    所有租戶使用一個集合

    使用單一集合來實現多租戶,方法是加入租戶欄位來區分租戶,這是一個簡單的選項。在針對特定租戶進行 ANN 搜尋時,可加入過濾表達式,過濾掉所有屬於其他租戶的實體。這是實現多租戶的最簡單方法。不過,請注意過濾器的效能可能會成為 ANN 搜尋的瓶頸。為了改善搜尋效能,您可以使用以下面向分割的多租戶方式進行最佳化。

    +

    每個租戶一個集合

    另一種方法是為每個租戶建立一個集合來儲存自己的資料,而不是將所有租戶的資料儲存在單一集合中。這可提供更好的資料隔離和查詢效能。不過,請記住這種方法在排程上需要較多資源,而且一個群集中最多只能有 10,000 個集合。

    +

    面向分區的多租戶

    有兩種方法可以實現面向分區的多租戶:

    +

    每個租戶一個分割區

    管理單一集合比管理多個集合容易得多。與其建立多個集合,不如考慮為每個租戶指派一個分割區,以達到彈性的資料隔離和記憶體管理。面向分区的多租户的搜索性能比面向集合的多租户要好得多。但請注意,集合的租戶數目不應超過集合所能容納的最大分割數目。

    +

    基於分區鑰匙的多重租用

    Milvus 2.2.9 引入了一個名為分區鑰匙的新功能。在建立集合時,指定一個租戶欄位,並使其成為分區關鍵欄位。Milvus 會根據分區 key 欄位的哈希值,將實體儲存於分區中。在進行 ANN 搜尋時,Milvus 只會搜尋包含分割區金鑰的分割區。這將大幅縮小搜尋的範圍,從而達到比沒有分割區金鑰更好的效能。

    +
    +

    此策略解除了 Milvus 集合可支援的最大租戶數限制,並大大簡化了資源管理,因為 Milvus 會自動為您管理磁碟分割。

    +

    總括而言,您可以使用上述任一種或多種多租戶策略來形成您自己的解決方案。下表對這些策略在資料隔離、搜尋效能和最大租戶數方面進行了比較。

    + + + + + + + + + + + +
    資料隔離搜尋效能最大租戶數推薦方案
    資料庫導向強大64適用於需要集合隨專案而異的情況,特別適合組織內各部門間的資料隔離。
    一個集合適用於所有中等不適用適用於資源有限且對資料隔離並不敏感的企業。
    每個租戶一個集合少於 10,000適用於每個群集只有少於 10,000 個租戶的情況。
    每個租戶一個分割區4,096適用於每個群集只有少於 4,096 位租用者的情況。
    基於分割區金鑰10,000,000+適用於預測租戶會快速增加到數百萬的情況。
    +

    下一步是什麼

    管理資料庫模式

    diff --git a/localization/v2.5.x/site/zh-hant/reference/replica.json b/localization/v2.5.x/site/zh-hant/reference/replica.json new file mode 100644 index 000000000..935856046 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/replica.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"In-Memory Replica","anchorList":[{"label":"記憶體內複製","href":"In-Memory-Replica","type":1,"isActive":false},{"label":"概觀","href":"Overview","type":2,"isActive":false},{"label":"關鍵概念","href":"Key-Concepts","type":2,"isActive":false},{"label":"設計細節","href":"Design-Details","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/replica.md b/localization/v2.5.x/site/zh-hant/reference/replica.md new file mode 100644 index 000000000..9840632fb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/replica.md @@ -0,0 +1,91 @@ +--- +id: replica.md +summary: 瞭解 Milvus 中的記憶體內複製。 +title: 記憶體內複製 +--- +

    記憶體內複製

    本主題介紹 Milvus 的記憶體內複製(複製)機制,可在工作記憶體中實現多段複製,以提高性能和可用性。

    +

    有關如何配置記憶體內複製的資訊,請參閱查詢節點相關配置

    +

    概觀

    + + Replica_Availiability + 複製可用性

    +

    使用記憶體內複製,Milvus 可以在多個查詢節點上載入相同的資料段。如果一個查詢節點失敗或忙於處理目前的搜尋請求,當另一個查詢節點到達時,系統可以將新的請求傳送到擁有相同網段複製的閒置查詢節點。

    +

    效能

    內存複製可讓您充分利用額外的 CPU 和記憶體資源。如果您的資料集相對較小,但希望利用額外的硬體資源增加讀取吞吐量,這將非常有用。整體 QPS(每秒查詢次 數)和吞吐量可大幅提升。

    +

    可用性

    如果查詢節點崩潰,記憶體內複製可幫助 Milvus 更快地恢復。當一個查詢節點失敗時,資料段不需要重新載入另一個查詢節點。相反地,搜尋要求可立即重新載入新的查詢節點,而無需再次重新載入資料。由於同時維護多個網段複本,系統在面臨故障轉移時會更有彈性。

    +

    關鍵概念

    記憶體複製以複製群組的方式組織。每個複製群組包含分片複製。每個 shard 複製本都有一個串流複製本和一個歷史複製本,這兩個複製本對應於 shard(即 DML 通道)中成長和封閉的區段

    +

    + + An illustration of how in-memory replica works + 記憶體內複製如何運作的說明

    +

    複製群組

    複製群組由負責處理歷史資料和複製的多個查詢節點組成。

    +

    分片複製

    一個分片複製本由一個串流複製本和一個歷史複製本組成,兩者都屬於同一個分片。複製群組中的分片複製品數量由指定集合中的分片數量決定。

    +

    串流複製本

    串流複製包含來自相同 DML 通道的所有成長區段。技術上來說,一個串流複製應該只由一個複製中的一個查詢節點提供服務。

    +

    歷史副本

    歷史副本包含來自相同 DML 通道的所有封存區段。一個歷史副本的封存區段可以分佈在同一個副本群組內的多個查詢節點上。

    +

    分片領導者

    分片領導者是為分片複製中的串流複製提供服務的查詢節點。

    +

    設計細節

    平衡

    需要載入的新區段將分配給多個不同的查詢節點。只要成功載入至少一個副本,就可以處理搜尋要求。

    +

    快取記憶體

    代理維護一個快取記憶體,將區段對應到查詢節點,並定期更新。當代理收到請求時,Milvus 會從快取記憶體取得所有需要搜尋的封存區段,並嘗試平均分配給查詢節點。

    +

    對於成長中的網段,proxy 也會維護通道到查詢節點的快取記憶體,並將要求傳送至對應的查詢節點。

    +

    故障轉換

    代理伺服器上的快取記憶體並非總是最新的。當請求傳入時,有些網段或頻道可能已移到其他查詢節點。在這種情況下,代理伺服器會收到錯誤回應,更新快取記憶體,並嘗試將其指派給其他查詢節點。

    +

    如果代理在更新快取記憶體後仍然找不到某個區段,該區段就會被忽略。如果網段已被壓縮,就可能發生這種情況。

    +

    如果快取記憶體不精確,代理可能會遺漏某些區段。具備 DML 通道 (成長中的區段) 的查詢節點會傳回搜尋回應以及可靠的區段清單,讓代理可以比較和更新快取記憶體。

    +

    增強

    代理無法完全平均分配搜尋要求給查詢節點,而且查詢節點可能有不同的資源來提供搜尋要求。為了避免資源的長尾分派,proxy 會將其他查詢節點上的有效網段分派給同樣擁有這些網段的閒置查詢節點。

    diff --git a/localization/v2.5.x/site/zh-hant/reference/scalar_index.json b/localization/v2.5.x/site/zh-hant/reference/scalar_index.json new file mode 100644 index 000000000..e67f572ce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/scalar_index.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Scalar Index","anchorList":[{"label":"標量索引","href":"Scalar-Index","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"標量欄位索引演算法","href":"Scalar-field-indexing-algorithms","type":2,"isActive":false},{"label":"效能建議","href":"Performance-recommandations","type":2,"isActive":false},{"label":"接下來","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/scalar_index.md b/localization/v2.5.x/site/zh-hant/reference/scalar_index.md new file mode 100644 index 000000000..cc4172f4e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/scalar_index.md @@ -0,0 +1,165 @@ +--- +id: scalar_index.md +related_key: scalar_index +summary: Milvus 中的標量指數。 +title: 標量索引 +--- +

    標量索引

    Milvus 支援結合標量值與向量值欄位的篩選搜尋。為了提高涉及標量字段的搜尋效率,Milvus 從版本 2.1.0 開始引入標量字段索引。這篇文章概述 Milvus 的標量欄位索引,幫助您了解其意義和實作。

    +

    概述

    在 Milvus 中執行向量相似性搜尋時,您可以使用邏輯運算符號將標量欄位組織成布林表達式。

    +

    當 Milvus 接收到具有這種布林表達式的搜尋請求,它會將布林表達式解析為抽象語法樹 (AST),以產生屬性篩選的實體計劃。Milvus 接著會在每個區段套用實體規劃,產生一個bitset作為篩選結果,並將結果包含在向量搜尋參數中,以縮窄搜尋範圍。在這種情況下,向量搜尋的速度在很大程度上依賴於屬性篩選的速度。

    +

    + + Attribute filtering in a segment + 分段中的屬性篩選

    +

    標量欄位索引是一種確保屬性過濾速度的方法,它以特定的方式將標量欄位值排序,以加快資訊檢索的速度。

    +

    標量欄位索引演算法

    Milvus 的標量欄位索引演算法旨在達到低記憶體使用率、高篩選效率和短載入時間的目標。這些演算法主要分為兩大類:自動索引反向索引

    +

    自動索引

    Milvus 提供AUTOINDEX 選項,讓您不必手動選擇索引類型。在呼叫create_index 方法時,如果沒有指定index_type ,Milvus 會根據資料類型自動選擇最適合的索引類型。

    +

    下表列出了 Milvus 支援的資料類型及其對應的自動索引演算法。

    + + + + + + + + + + + + + +
    資料類型自動索引演算法
    VARCHAR反向索引
    INT8反向索引
    INT16反向索引
    INT32反轉索引
    INT64反轉索引
    FLOAT反轉索引
    DOUBLE反轉索引
    +

    反向索引

    反向索引提供了一種靈活的方式,可透過手動指定索引參數為標量欄位建立索引。這種方法適用於各種情況,包括點查詢、模式匹配查詢、全文檢索、JSON 檢索、布林檢索,甚至前綴匹配查詢。

    +

    Milvus 中實作的倒置索引是由Tantivy(一個全文本搜尋引擎函式庫)所支援。Tantivy 可確保 Milvus 中的倒排索引既高效又快速。

    +

    倒排索引有兩個主要組成部分:詞彙字典和倒排清單。詞彙字典包含所有按字母順序排序的標記化詞彙,而倒序清單包含每個詞彙出現的文件清單。這種設定使點查詢和範圍查詢比暴力搜尋更快、更有效率。

    +

    + + Inverted index diagram + 倒置索引圖

    +

    使用倒置索引的優點在下列作業中特別明顯:

    +
      +
    • 點查詢:例如,在搜尋包含Milvus 這個詞的文件時,首先會檢查Milvus是否出現在詞彙字典中。如果沒有找到,就表示沒有文件包含這個詞。但是,如果找到了,則會擷取與Milvus相關的反向清單,指出包含該詞的文件。這個方法遠比在一百萬個文件中強行搜尋有效率,因為排序的詞彙字典大幅降低了尋找Milvus 這個詞的時間複雜度。
    • +
    • 範圍查詢:範圍查詢的效率,例如尋找字首字母大於very 的文件,也會因為排序的詞彙字典而提升。這種方法比暴力搜尋更有效率,能提供更快速、更精準的結果。
    • +
    +

    測試結果

    為了證明 Milvus 中標量索引所提供的效能改善,我們進行了一項實驗,比較在原始資料上使用倒轉索引和暴力搜尋的幾種表達方式的效能。

    +

    該實驗涉及在兩種條件下測試各種表達式:使用倒置索引和使用暴力搜尋。為了確保公平性,每次測試都使用相同的資料集,並維持相同的資料分佈。每次測試前,都會釋放資料集,並丟棄和重建索引。此外,每次測試前都會執行暖查詢,以盡量減少冷資料和熱資料的影響,而且每次查詢都會執行多次,以確保準確性。

    +

    對於100 萬筆記錄的資料集而言,使用反轉索引可為點查詢提供高達30 倍的效能提升。對於較大的資料集,效能提升可能更為顯著。

    +

    效能建議

    為了充分利用 Milvus 在標量字段索引方面的能力,以及發揮其在向量相似性搜尋方面的威力,您可能需要一個模型來根據您的資料估計所需的記憶體大小。

    +

    以下表格列出 Milvus 支援的所有資料類型的估算功能。

    +
      +
    • 數值欄位

      + + + + + + + + + + + + +
      資料類型記憶體估算函數 (MB)
      INT8numOfRows *12/ 1024 / 1024
      INT16numOfRows *12/ 1024 / 1024
      INT32行數 *12/ 1024 / 1024
      INT64numOfRows *24/ 1024 / 1024
      FLOAT32numOfRows *12/ 1024 / 1024
      DOUBLEnumOfRows *24/ 1024 / 1024
      +
    • +
    • 字串欄位

      + + + + + + + + + + + + +
      字串長度記憶體估算功能 (MB)
      (0, 8]行數 *128/ 1024 / 1024
      (8, 16]行數 *144/ 1024 / 1024
      (16, 32]行數 *160/ 1024 / 1024
      (32, 64]行數 *192/ 1024 / 1024
      (64, 128]行數 *256/ 1024 / 1024
      (128, 65535]numOfRows *strLen * 1.5/ 1024 / 1024
      +
    • +
    +

    接下來

    diff --git a/localization/v2.5.x/site/zh-hant/reference/schema.json b/localization/v2.5.x/site/zh-hant/reference/schema.json new file mode 100644 index 000000000..562acb303 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import DataType, FieldSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# The following creates a field and use it as the partition key\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n","from pymilvus import DataType, FieldSchema\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n # configure default value `25` for field `age`\n FieldSchema(name=\"age\", dtype=DataType.INT64, default_value=25, description=\"age\"),\n embedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n]\n","from pymilvus import DataType, FieldSchema, CollectionSchema\nid_field = FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, description=\"primary id\")\nage_field = FieldSchema(name=\"age\", dtype=DataType.INT64, description=\"age\")\nembedding_field = FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=128, description=\"vector\")\n\n# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field\nposition_field = FieldSchema(name=\"position\", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)\n\n# Set enable_dynamic_field to True if you need to use dynamic fields. \nschema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description=\"desc of a collection\")\n","from pymilvus import Collection, connections\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\ncollection_name1 = \"tutorial_1\"\ncollection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)\n","from pymilvus import Collection\nimport pandas as pd\ndf = pd.DataFrame({\n \"id\": [i for i in range(nb)],\n \"age\": [random.randint(20, 40) for i in range(nb)],\n \"embedding\": [[random.random() for _ in range(dim)] for _ in range(nb)],\n \"position\": \"test_pos\"\n})\n\ncollection, ins_res = Collection.construct_from_dataframe(\n 'my_collection',\n df,\n primary_field='id',\n auto_id=False\n )\n"],"headingContent":"Manage Schema","anchorList":[{"label":"管理模式","href":"Manage-Schema","type":1,"isActive":false},{"label":"欄位模式","href":"Field-schema","type":2,"isActive":false},{"label":"集合模式","href":"Collection-schema","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/schema.md b/localization/v2.5.x/site/zh-hant/reference/schema.md new file mode 100644 index 000000000..ac60042b1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/schema.md @@ -0,0 +1,252 @@ +--- +id: schema.md +summary: 學習如何在 Milvus 中定義模式。 +title: 管理模式 +--- +

    管理模式

    本主題介紹 Milvus 的模式。模式用於定義集合的屬性和其中的欄位。

    +

    欄位模式

    欄位模式是欄位的邏輯定義。在定義集合模式管理集合之前,首先需要定義它。

    +

    Milvus 在一個集合中只支援一個主鍵欄位。

    +

    欄位模式屬性

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    屬性說明註解
    name要建立的資料集中欄位的名稱資料類型:
    必填
    dtype欄位的資料類型必須填寫
    description欄位的描述資料類型:
    可選
    is_primary是否設定欄位為主索引欄位資料類型: 布林 ( 或 ):布林 (truefalse)。
    主鍵欄位必須填寫
    auto_id (主鍵欄位必須使用)開啟或關閉 ID(主鍵)自動分配的開關。TrueFalse
    max_length (對於 VARCHAR 欄位必須使用)允許插入字串的最大位元組長度。請注意,多位元組字元(例如 Unicode 字元)可能佔用超過一個位元組,因此請確保插入字串的位元組長度不超過指定的限制。[1, 65,535]
    dim向量的尺寸資料類型:
    密集向量欄位必須填寫。對於稀疏向量場,請省略。
    is_partition_key此欄位是否為分割鍵欄位。資料類型:Boolean (truefalse)。
    +

    建立欄位模式

    為了降低資料插入的複雜性,Milvus 允許您在建立欄位模式時,為每個標量欄位指定預設值,但不包括主鍵欄位。這表示,如果您在插入資料時讓欄位為空,您為這個欄位指定的預設值就會適用。

    +

    建立常規欄位模式:

    +
    from pymilvus import DataType, FieldSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# The following creates a field and use it as the partition key
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +

    建立具有預設欄位值的欄位模式:

    +
    from pymilvus import DataType, FieldSchema
    +
    +fields = [
    +  FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +  # configure default value `25` for field `age`
    +  FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
    +  embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +]
    +
    +

    支援的資料類型

    DataType 定義欄位包含的資料類型。不同的欄位支援不同的資料類型。

    +
      +
    • 主鍵欄位支援

      +
        +
      • INT64: numpy.int64
      • +
      • varchar: varchar
      • +
    • +
    • Scalar 欄位支援

      +
        +
      • BOOL: 布林 (truefalse)
      • +
      • INT8: numpy.int8
      • +
      • INT16: numpy.int16
      • +
      • INT32: numpy.int32
      • +
      • INT64: numpy.int64
      • +
      • FLOAT: numpy.float32
      • +
      • DOUBLE: numpy.double
      • +
      • varchar: varchar
      • +
      • JSON:JSON
      • +
      • Array: 陣列陣列
      • +
      +

      JSON 作為一種複合資料類型是可用的。JSON 欄位由鍵值對組成。每個 key 是字串,而值可以是數字、字串、布林值、陣列或列表。如需詳細資訊,請參閱JSON:一種新的資料類型

    • +
    • 向量欄位支援:

      +
        +
      • BINARY_VECTOR: 以 0 和 1 的序列儲存二進位資料,用於影像處理和資訊檢索中的精簡特徵表示。
      • +
      • FLOAT_VECTOR: 儲存 32 位元浮點數,常用於科學計算和機器學習中表示實數。
      • +
      • FLOAT16_VECTOR: 儲存 16 位元半精度浮點數,用於深度學習和 GPU 運算,以提高記憶體和頻寬效率。
      • +
      • BFLOAT16_VECTOR: 儲存 16 位元浮點數,精確度降低,但指數範圍與 Float32 相同,常用於深度學習,可降低記憶體和計算需求,但不會顯著影響精確度。
      • +
      • SPARSE_FLOAT_VECTOR: 儲存非零元素清單及其對應的索引,用於表示稀疏向量。如需詳細資訊,請參閱稀疏向量
      • +
      +

      Milvus 支援集合中的多重向量場。如需詳細資訊,請參閱混合搜尋

    • +
    +

    集合模式

    集合模式是集合的邏輯定義。通常在定義集合模式和管理集合之前,您需要先定義欄位模式。

    +

    集合模式屬性

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    屬性說明註解
    field要建立的集合中的欄位必須填寫
    description集合的描述資料類型:
    可選
    partition_key_field設計作為分割區金鑰的欄位名稱。資料類型:字串:
    可選
    enable_dynamic_field是否啟用動態模式資料類型:Boolean (truefalse)。
    可選,預設為False
    關於動態模式的詳細資訊,請參閱動態模式和管理集合的使用者指南。
    +

    建立集合模式

    + 在定義集合模式之前,先定義欄位模式。
    +
    from pymilvus import DataType, FieldSchema, CollectionSchema
    +id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
    +age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
    +embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
    +
    +# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
    +position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
    +
    +# Set enable_dynamic_field to True if you need to use dynamic fields. 
    +schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")
    +
    +

    使用指定的模式建立一個集合:

    +
    from pymilvus import Collection, connections
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +collection_name1 = "tutorial_1"
    +collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
    +
    +
    +
      +
    • 您可以使用shards_num 定義分片號碼。
    • +
    • 您可以在using 中指定別名,以定義要在其上建立集合的 Milvus 伺服器。
    • +
    • 如果您需要實作以分割鑰匙為基礎的多租戶,您可以透過在欄位上設定is_partition_keyTrue 來啟用欄位上的分割鑰匙功能。
    • +
    • 如果需要啟用動態欄位,您可以透過在集合模式中將enable_dynamic_field 設定為True 來啟用動態模式。
    • +
    +
    +


    +您也可以使用Collection.construct_from_dataframe, 自動從 DataFrame 產生集合模式並建立集合。

    +
    from pymilvus import Collection
    +import pandas as pd
    +df = pd.DataFrame({
    +    "id": [i for i in range(nb)],
    +    "age": [random.randint(20, 40) for i in range(nb)],
    +    "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
    +    "position": "test_pos"
    +})
    +
    +collection, ins_res = Collection.construct_from_dataframe(
    +    'my_collection',
    +    df,
    +    primary_field='id',
    +    auto_id=False
    +    )
    +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.json new file mode 100644 index 000000000..3267c3715 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"common-related Configurations","anchorList":[{"label":"共用相關組態","href":"common-related-Configurations","type":1,"isActive":false},{"label":"common.defaultPartitionName","href":"commondefaultPartitionName","type":2,"isActive":false},{"label":"common.defaultIndexName","href":"commondefaultIndexName","type":2,"isActive":false},{"label":"common.entityExpiration","href":"commonentityExpiration","type":2,"isActive":false},{"label":"common.indexSliceSize","href":"commonindexSliceSize","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.highPriority","href":"commonthreadCoreCoefficienthighPriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.middlePriority","href":"commonthreadCoreCoefficientmiddlePriority","type":2,"isActive":false},{"label":"common.threadCoreCoefficient.lowPriority","href":"commonthreadCoreCoefficientlowPriority","type":2,"isActive":false},{"label":"common.gracefulTime","href":"commongracefulTime","type":2,"isActive":false},{"label":"common.gracefulStopTimeout","href":"commongracefulStopTimeout","type":2,"isActive":false},{"label":"common.storageType","href":"commonstorageType","type":2,"isActive":false},{"label":"common.simdType","href":"commonsimdType","type":2,"isActive":false},{"label":"common.security.superUsers","href":"commonsecuritysuperUsers","type":2,"isActive":false},{"label":"common.security.defaultRootPassword","href":"commonsecuritydefaultRootPassword","type":2,"isActive":false},{"label":"common.session.ttl","href":"commonsessionttl","type":2,"isActive":false},{"label":"common.session.retryTimes","href":"commonsessionretryTimes","type":2,"isActive":false},{"label":"common.locks.metrics.enable","href":"commonlocksmetricsenable","type":2,"isActive":false},{"label":"common.locks.threshold.info","href":"commonlocksthresholdinfo","type":2,"isActive":false},{"label":"common.locks.threshold.warn","href":"commonlocksthresholdwarn","type":2,"isActive":false},{"label":"common.ttMsgEnabled","href":"commonttMsgEnabled","type":2,"isActive":false},{"label":"common.traceLogMode","href":"commontraceLogMode","type":2,"isActive":false},{"label":"common.bloomFilterSize","href":"commonbloomFilterSize","type":2,"isActive":false},{"label":"common.maxBloomFalsePositive","href":"commonmaxBloomFalsePositive","type":2,"isActive":false},{"label":"common.bloomFilterType","href":"commonbloomFilterType","type":2,"isActive":false},{"label":"common.bloomFilterApplyBatchSize","href":"commonbloomFilterApplyBatchSize","type":2,"isActive":false},{"label":"common.usePartitionKeyAsClusteringKey","href":"commonusePartitionKeyAsClusteringKey","type":2,"isActive":false},{"label":"common.useVectorAsClusteringKey","href":"commonuseVectorAsClusteringKey","type":2,"isActive":false},{"label":"common.enableVectorClusteringKey","href":"commonenableVectorClusteringKey","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.md new file mode 100644 index 000000000..6cf884c6c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_common.md @@ -0,0 +1,812 @@ +--- +id: configure_common.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定共用。 +--- +

    共用相關組態

    common.defaultPartitionName

    + + + + + + + + + + + + +
    說明預設值
    建立集合時的預設分割區名稱 _default
    +

    common.defaultIndexName

    + + + + + + + + + + + + +
    說明預設值
    索引名稱未指定時的名稱 _default_idx
    +

    common.entityExpiration

    + + + + + + + + + + + + +
    說明預設值
    實體過期時間,以秒為單位,注意 -1 表示永不過期 -1
    +

    common.indexSliceSize

    + + + + + + + + + + + + +
    說明預設值
    索引分割大小 (MB) 16
    +

    common.threadCoreCoefficient.highPriority

    + + + + + + + + + + + + +
    說明預設值
    此參數指定線程數是高優先級池核心數的幾倍 10
    +

    common.threadCoreCoefficient.middlePriority

    + + + + + + + + + + + + +
    說明預設值
    此參數指定線程數是中優先級池核心數的幾倍 5
    +

    common.threadCoreCoefficient.lowPriority

    + + + + + + + + + + + + +
    說明預設值
    此參數指定線程數是低優先級池核心數的幾倍 1
    +

    common.gracefulTime

    + + + + + + + + + + + + +
    說明預設值
    毫秒。它表示在 Bounded Consistency 的情況下,需要減去請求到達時間的間隔(以毫秒為單位)。 5000
    +

    common.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    秒。如果在這段時間內未完成優化停止程序,它會強制退出伺服器。 1800
    +

    common.storageType

    + + + + + + + + + + + + +
    說明預設值
    請在嵌入式 Milvus 中調整:local,可用值為 [local、remote、opendal],minio 值已被淘汰,請使用 remote 來取代 遠端
    +

    common.simdType

    + + + + + + + + + + + + +
    說明預設值
    +
  • 預設值:自動
  • +
  • 有效值:[自動、avx512、avx2、avx、sse4_2]
  • +
  • 此設定僅供 querynode 和 indexnode 使用,它選擇搜尋和建立索引的 CPU 指令集。
  • 自動
    +

    common.security.superUsers

    + + + + + + + + + + + + +
    說明預設值
    +
  • 超級使用者會忽略某些系統檢查程序、
  • +
  • 如更新認證時的舊密碼驗證。
  • +

    common.security.defaultRootPassword

    + + + + + + + + + + + + +
    說明預設值
    root 使用者的預設密碼 密碼
    +

    common.session.ttl

    + + + + + + + + + + + + +
    說明預設值
    會話授予註冊服務租約時的 ttl 值 30
    +

    common.session.retryTimes

    + + + + + + + + + + + + +
    說明預設值
    會話發送 etcd 請求時的重試次數 30
    +

    common.locks.metrics.enable

    + + + + + + + + + + + + +
    說明預設值
    是否收集度量鎖的統計資料
    +

    common.locks.threshold.info

    + + + + + + + + + + + + +
    說明預設值
    在資訊層級中列印持續時間的最小毫秒數 500
    +

    common.locks.threshold.warn

    + + + + + + + + + + + + +
    說明預設值
    警告層級中列印時間的最小毫秒數 1000
    +

    common.ttMsgEnabled

    + + + + + + + + + + + + +
    說明預設值
    +
  • 是否停用系統的內部時間訊息機制。
  • +
  • 如果停用(設為 false),系統將不允許 DML 操作,包括插入、刪除、查詢和搜尋。
  • +
  • 這有助於 Milvus-CDC 同步增量資料
  • +

    common.traceLogMode

    + + + + + + + + + + + + +
    說明預設值
    追蹤請求資訊 0
    +

    common.bloomFilterSize

    + + + + + + + + + + + + +
    說明預設值
    bloom filter 初始大小 100000
    +

    common.maxBloomFalsePositive

    + + + + + + + + + + + + +
    說明預設值
    bloom filter 的最大誤判率 0.001
    +

    common.bloomFilterType

    + + + + + + + + + + + + +
    說明預設值
    bloom 過濾器類型,支援 BasicBloomFilter 和 BlockedBloomFilter 基本 BloomFilter
    +

    common.bloomFilterApplyBatchSize

    + + + + + + + + + + + + +
    說明預設值
    將 pk 應用於 BloomFilter 時的批次大小 1000
    +

    common.usePartitionKeyAsClusteringKey

    + + + + + + + + + + + + +
    說明預設值
    如果為 true,則在分割區的關鍵字段上進行群集壓縮和分割修剪
    +

    common.useVectorAsClusteringKey

    + + + + + + + + + + + + +
    說明預設值
    如果為 true,會對向量欄位做聚類壓縮和分割修剪
    +

    common.enableVectorClusteringKey

    + + + + + + + + + + + + +
    說明預設值
    如果為 true,啟用向量聚類關鍵和向量聚類壓縮
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.json new file mode 100644 index 000000000..378a1aca4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataCoord-related Configurations","anchorList":[{"label":"資料室相關組態","href":"dataCoord-related-Configurations","type":1,"isActive":false},{"label":"dataCoord.channel.watchTimeoutInterval","href":"dataCoordchannelwatchTimeoutInterval","type":2,"isActive":false},{"label":"dataCoord.channel.balanceWithRpc","href":"dataCoordchannelbalanceWithRpc","type":2,"isActive":false},{"label":"dataCoord.channel.legacyVersionWithoutRPCWatch","href":"dataCoordchannellegacyVersionWithoutRPCWatch","type":2,"isActive":false},{"label":"dataCoord.channel.balanceSilentDuration","href":"dataCoordchannelbalanceSilentDuration","type":2,"isActive":false},{"label":"dataCoord.channel.balanceInterval","href":"dataCoordchannelbalanceInterval","type":2,"isActive":false},{"label":"dataCoord.channel.checkInterval","href":"dataCoordchannelcheckInterval","type":2,"isActive":false},{"label":"dataCoord.channel.notifyChannelOperationTimeout","href":"dataCoordchannelnotifyChannelOperationTimeout","type":2,"isActive":false},{"label":"dataCoord.segment.maxSize","href":"dataCoordsegmentmaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.diskSegmentMaxSize","href":"dataCoordsegmentdiskSegmentMaxSize","type":2,"isActive":false},{"label":"dataCoord.segment.sealProportion","href":"dataCoordsegmentsealProportion","type":2,"isActive":false},{"label":"dataCoord.segment.assignmentExpiration","href":"dataCoordsegmentassignmentExpiration","type":2,"isActive":false},{"label":"dataCoord.segment.allocLatestExpireAttempt","href":"dataCoordsegmentallocLatestExpireAttempt","type":2,"isActive":false},{"label":"dataCoord.segment.maxLife","href":"dataCoordsegmentmaxLife","type":2,"isActive":false},{"label":"dataCoord.segment.maxIdleTime","href":"dataCoordsegmentmaxIdleTime","type":2,"isActive":false},{"label":"dataCoord.segment.minSizeFromIdleToSealed","href":"dataCoordsegmentminSizeFromIdleToSealed","type":2,"isActive":false},{"label":"dataCoord.segment.maxBinlogFileNumber","href":"dataCoordsegmentmaxBinlogFileNumber","type":2,"isActive":false},{"label":"dataCoord.segment.smallProportion","href":"dataCoordsegmentsmallProportion","type":2,"isActive":false},{"label":"dataCoord.segment.compactableProportion","href":"dataCoordsegmentcompactableProportion","type":2,"isActive":false},{"label":"dataCoord.segment.expansionRate","href":"dataCoordsegmentexpansionRate","type":2,"isActive":false},{"label":"dataCoord.sealPolicy.channel.growingSegmentsMemSize","href":"dataCoordsealPolicychannelgrowingSegmentsMemSize","type":2,"isActive":false},{"label":"dataCoord.autoUpgradeSegmentIndex","href":"dataCoordautoUpgradeSegmentIndex","type":2,"isActive":false},{"label":"dataCoord.segmentFlushInterval","href":"dataCoordsegmentFlushInterval","type":2,"isActive":false},{"label":"dataCoord.enableCompaction","href":"dataCoordenableCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.enableAutoCompaction","href":"dataCoordcompactionenableAutoCompaction","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.enable","href":"dataCoordcompactionclusteringenable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.autoEnable","href":"dataCoordcompactionclusteringautoEnable","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.triggerInterval","href":"dataCoordcompactionclusteringtriggerInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minInterval","href":"dataCoordcompactionclusteringminInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxInterval","href":"dataCoordcompactionclusteringmaxInterval","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.newDataSizeThreshold","href":"dataCoordcompactionclusteringnewDataSizeThreshold","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxTrainSizeRatio","href":"dataCoordcompactionclusteringmaxTrainSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxCentroidsNum","href":"dataCoordcompactionclusteringmaxCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minCentroidsNum","href":"dataCoordcompactionclusteringminCentroidsNum","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.minClusterSizeRatio","href":"dataCoordcompactionclusteringminClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSizeRatio","href":"dataCoordcompactionclusteringmaxClusterSizeRatio","type":2,"isActive":false},{"label":"dataCoord.compaction.clustering.maxClusterSize","href":"dataCoordcompactionclusteringmaxClusterSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.minSize","href":"dataCoordcompactionlevelzeroforceTriggerminSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.maxSize","href":"dataCoordcompactionlevelzeroforceTriggermaxSize","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMinNum","type":2,"isActive":false},{"label":"dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum","href":"dataCoordcompactionlevelzeroforceTriggerdeltalogMaxNum","type":2,"isActive":false},{"label":"dataCoord.syncSegmentsInterval","href":"dataCoordsyncSegmentsInterval","type":2,"isActive":false},{"label":"dataCoord.enableGarbageCollection","href":"dataCoordenableGarbageCollection","type":2,"isActive":false},{"label":"dataCoord.gc.interval","href":"dataCoordgcinterval","type":2,"isActive":false},{"label":"dataCoord.gc.missingTolerance","href":"dataCoordgcmissingTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.dropTolerance","href":"dataCoordgcdropTolerance","type":2,"isActive":false},{"label":"dataCoord.gc.removeConcurrent","href":"dataCoordgcremoveConcurrent","type":2,"isActive":false},{"label":"dataCoord.gc.scanInterval","href":"dataCoordgcscanInterval","type":2,"isActive":false},{"label":"dataCoord.brokerTimeout","href":"dataCoordbrokerTimeout","type":2,"isActive":false},{"label":"dataCoord.autoBalance","href":"dataCoordautoBalance","type":2,"isActive":false},{"label":"dataCoord.checkAutoBalanceConfigInterval","href":"dataCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"dataCoord.import.filesPerPreImportTask","href":"dataCoordimportfilesPerPreImportTask","type":2,"isActive":false},{"label":"dataCoord.import.taskRetention","href":"dataCoordimporttaskRetention","type":2,"isActive":false},{"label":"dataCoord.import.maxSizeInMBPerImportTask","href":"dataCoordimportmaxSizeInMBPerImportTask","type":2,"isActive":false},{"label":"dataCoord.import.scheduleInterval","href":"dataCoordimportscheduleInterval","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalHigh","href":"dataCoordimportcheckIntervalHigh","type":2,"isActive":false},{"label":"dataCoord.import.checkIntervalLow","href":"dataCoordimportcheckIntervalLow","type":2,"isActive":false},{"label":"dataCoord.import.maxImportFileNumPerReq","href":"dataCoordimportmaxImportFileNumPerReq","type":2,"isActive":false},{"label":"dataCoord.import.waitForIndex","href":"dataCoordimportwaitForIndex","type":2,"isActive":false},{"label":"dataCoord.gracefulStopTimeout","href":"dataCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"dataCoord.slot.clusteringCompactionUsage","href":"dataCoordslotclusteringCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.mixCompactionUsage","href":"dataCoordslotmixCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.slot.l0DeleteCompactionUsage","href":"dataCoordslotl0DeleteCompactionUsage","type":2,"isActive":false},{"label":"dataCoord.ip","href":"dataCoordip","type":2,"isActive":false},{"label":"dataCoord.port","href":"dataCoordport","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxSendSize","href":"dataCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.serverMaxRecvSize","href":"dataCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxSendSize","href":"dataCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataCoord.grpc.clientMaxRecvSize","href":"dataCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.md new file mode 100644 index 000000000..ea17492ce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datacoord.md @@ -0,0 +1,2009 @@ +--- +id: configure_datacoord.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 dataCoord。 +--- +

    資料室相關組態

    dataCoord.channel.watchTimeoutInterval

    + + + + + + + + + + + + +
    說明預設值
    觀看頻道的逾時時間 (秒)。資料節點 tickler 更新觀看進度會重設逾時計時器。 300
    +

    dataCoord.channel.balanceWithRpc

    + + + + + + + + + + + + +
    說明預設值
    是否使用 RPC 啟用平衡,預設使用 etcd watch
    +

    dataCoord.channel.legacyVersionWithoutRPCWatch

    + + + + + + + + + + + + +
    說明預設值
    <= 此版本的資料節點被視為傳統節點,不具備基於 rpc 的 watch()。這只會在滾動升級時使用,因為舊節點不會獲得新通道。 2.4.1
    +

    dataCoord.channel.balanceSilentDuration

    + + + + + + + + + + + + +
    說明預設值
    頻道管理員開始背景頻道平衡的持續時間 300
    +

    dataCoord.channel.balanceInterval

    + + + + + + + + + + + + +
    說明預設值
    頻道管理員檢查 dml 頻道平衡狀態的時間間隔 360
    +

    dataCoord.channel.checkInterval

    + + + + + + + + + + + + +
    說明預設值
    頻道管理員更新頻道狀態的間隔 (秒) 1
    +

    dataCoord.channel.notifyChannelOperationTimeout

    + + + + + + + + + + + + +
    說明預設值
    通知通道操作的逾時時間(秒)。 5
    +

    dataCoord.segment.maxSize

    + + + + + + + + + + + + +
    說明預設值
    段的最大大小,單位:MB:datacoord.segment.maxSize 和 datacoord.segment.sealProportion 共同決定是否可以封裝區段。 1024
    +

    dataCoord.segment.diskSegmentMaxSize

    + + + + + + + + + + + + +
    說明預設值
    對於有 Disk 索引的資料集,段的最大大小 (MB) 2048
    +

    dataCoord.segment.sealProportion

    + + + + + + + + + + + + +
    說明預設值
    datacoord.segment.maxSize 與 datacoord.segment.sealProportion 的最小比例,用以封鎖區段。datacoord.segment.maxSize 與 datacoord.segment.sealProportion 共同決定是否可以封鎖區段。 0.12
    +

    dataCoord.segment.assignmentExpiration

    + + + + + + + + + + + + +
    說明預設值
    分段指派的到期時間,單位:ms 2000
    +

    dataCoord.segment.allocLatestExpireAttempt

    + + + + + + + + + + + + +
    說明預設值
    重新啟動後嘗試從 rootCoord 分配最新 lastExpire 的時間 200
    +

    dataCoord.segment.maxLife

    + + + + + + + + + + + + +
    說明預設值
    區段的最大使用期限,以秒為單位,24*60*60 86400
    +

    dataCoord.segment.maxIdleTime

    + + + + + + + + + + + + +
    說明預設值
    +
  • 如果網段在 maxIdleTime 沒有接受 dml 記錄,且網段大小大於
  • +
  • minSizeFromIdleToSealed 時,Milvus 會自動封鎖它。
  • +
  • 區段的最大閒置時間,以秒為單位,10*60。
  • 600
    +

    dataCoord.segment.minSizeFromIdleToSealed

    + + + + + + + + + + + + +
    說明預設值
    從封存到閒置的最小區段大小 (MB)。 16
    +

    dataCoord.segment.maxBinlogFileNumber

    + + + + + + + + + + + + +
    說明預設值
    +
  • 一個區段的最大 binlog 檔案數量,如果 binlog 檔案數量達到最大值,區段會被封鎖。
  • +
  • 段會被封鎖。
  • 32
    +

    dataCoord.segment.smallProportion

    + + + + + + + + + + + + +
    說明預設值
    當段的行數小於 0.5
    +

    dataCoord.segment.compactableProportion

    + + + + + + + + + + + + +
    說明預設值
    +
  • (smallProportion * segment max # of rows)。
  • +
  • 如果壓縮後的區段有
  • 0.85
    +

    dataCoord.segment.expansionRate

    + + + + + + + + + + + + +
    說明預設值
    +
  • 超過 (compactableProportion * segment max # of rows) 行數。
  • +
  • 必須大於或等於!!!
  • +
  • 在壓縮期間,區段行數 # 的大小能夠超過區段最大行數 # 的 (expansionRate-1) * 100%。
  • 1.25
    +

    dataCoord.sealPolicy.channel.growingSegmentsMemSize

    + + + + + + + + + + + + +
    說明預設值
    +
  • 以 MB 為單位的大小臨界值,如果每個分片的成長區段總大小
  • +
  • 超過此臨界值,則會封鎖最大的成長區段。
  • 4096
    +

    dataCoord.autoUpgradeSegmentIndex

    + + + + + + + + + + + + +
    說明預設值
    是否自動將區段索引升級為索引引擎的版本
    +

    dataCoord.segmentFlushInterval

    + + + + + + + + + + + + +
    說明預設值
    在相同網段上進行複製作業的最小間隔時間 (單位: 秒) 2
    +

    dataCoord.enableCompaction

    + + + + + + + + + + + + +
    說明預設值
    +
  • 控制是否啟用段壓縮的開關值。
  • +
  • 壓縮會將小區段合併為一個大區段,並清除超過 Time Travel 的保留時間的刪除實體。
  • +

    dataCoord.compaction.enableAutoCompaction

    + + + + + + + + + + + + +
    說明預設值
    +
  • 控制是否啟用自動區段壓縮的開關值,在此期間,data coord 會在背景中定位並合併可壓縮的區段。
  • +
  • 只有當 dataCoord.enableCompaction 設為 true 時,此設定才會生效。
  • +

    dataCoord.compaction.clustering.enable

    + + + + + + + + + + + + +
    說明預設值
    啟用聚類壓縮
    +

    dataCoord.compaction.clustering.autoEnable

    + + + + + + + + + + + + +
    說明預設值
    啟用自動群集壓縮
    +

    dataCoord.compaction.clustering.triggerInterval

    + + + + + + + + + + + + +
    說明預設值
    聚類壓縮觸發時間間隔 (秒) 600
    +

    dataCoord.compaction.clustering.minInterval

    + + + + + + + + + + + + +
    說明預設值
    一個集合的群集壓縮執行之間的最小間隔,以避免重複壓縮 3600
    +

    dataCoord.compaction.clustering.maxInterval

    + + + + + + + + + + + + +
    說明預設值
    如果一個集合的集群壓縮時間超過 maxInterval,則強制壓縮 259200
    +

    dataCoord.compaction.clustering.newDataSizeThreshold

    + + + + + + + + + + + + +
    說明預設值
    如果新資料大小大於 newDataSizeThreshold,執行聚類壓縮 512m
    +

    dataCoord.compaction.clustering.maxTrainSizeRatio

    + + + + + + + + + + + + +
    說明預設值
    Kmeans 訓練中的最大資料大小比率,若大於此比率,會向下採樣以符合此限制 0.8
    +

    dataCoord.compaction.clustering.maxCentroidsNum

    + + + + + + + + + + + + +
    說明預設值
    Kmeans 訓練中的最大中心點數 10240
    +

    dataCoord.compaction.clustering.minCentroidsNum

    + + + + + + + + + + + + +
    說明預設值
    Kmeans 訓練中的最小中心點數 16
    +

    dataCoord.compaction.clustering.minClusterSizeRatio

    + + + + + + + + + + + + +
    說明預設值
    Kmeans 訓練中的最小群集大小 / 平均大小 0.01
    +

    dataCoord.compaction.clustering.maxClusterSizeRatio

    + + + + + + + + + + + + +
    說明預設值
    最大聚類大小 / Kmeans 訓練的平均大小 10
    +

    dataCoord.compaction.clustering.maxClusterSize

    + + + + + + + + + + + + +
    說明預設值
    Kmeans 訓練中的最大聚類大小 5g
    +

    dataCoord.compaction.levelzero.forceTrigger.minSize

    + + + + + + + + + + + + +
    說明預設值
    強制觸發 LevelZero Compaction 的最小大小 (位元組),預設為 8MB 8388608
    +

    dataCoord.compaction.levelzero.forceTrigger.maxSize

    + + + + + + + + + + + + +
    說明預設值
    強制觸發 LevelZero Compaction 的最大大小 (位元組),預設為 64MB 67108864
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMinNum

    + + + + + + + + + + + + +
    說明預設值
    強制觸發 LevelZero Compaction 的最小 deltalog 檔案數量 10
    +

    dataCoord.compaction.levelzero.forceTrigger.deltalogMaxNum

    + + + + + + + + + + + + +
    說明預設值
    強制觸發 LevelZero Compaction 的最大 deltalog 檔案數量,預設為 30 30
    +

    dataCoord.syncSegmentsInterval

    + + + + + + + + + + + + +
    說明預設值
    定期同步分段的時間間隔 300
    +

    dataCoord.enableGarbageCollection

    + + + + + + + + + + + + +
    說明預設值
    控制是否啟用垃圾回收以清除 MinIO 或 S3 服務中丟棄資料的開關值。
    +

    dataCoord.gc.interval

    + + + + + + + + + + + + +
    說明預設值
    資料協調器執行垃圾回收的間隔,單位:秒。 3600
    +

    dataCoord.gc.missingTolerance

    + + + + + + + + + + + + +
    說明預設值
    未記錄的二進位記錄 (binlog) 檔案的保留時間。為此參數設定合理的大值,可避免錯誤刪除新建立但缺乏元資料的 binlog 檔案。單位:秒。 86400
    +

    dataCoord.gc.dropTolerance

    + + + + + + + + + + + + +
    說明預設值
    刪除區段的 binlog 檔案在清除前的保留時間,單位:秒。 10800
    +

    dataCoord.gc.removeConcurrent

    + + + + + + + + + + + + +
    說明預設值
    移除丟棄的 s3 物件的並發 goroutines 數量 32
    +

    dataCoord.gc.scanInterval

    + + + + + + + + + + + + +
    說明預設值
    物件儲存空間中的無主檔案 (檔案在 oss 上,但尚未在 meta 上註冊) 垃圾收集掃描間隔 (小時) 168
    +

    dataCoord.brokerTimeout

    + + + + + + + + + + + + +
    說明預設值
    5000ms, dataCoord 代理商 rpc 超時 5000
    +

    dataCoord.autoBalance

    + + + + + + + + + + + + +
    說明預設值
    啟用自動平衡
    +

    dataCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    說明預設值
    檢查自動平衡設定的間隔 10
    +

    dataCoord.import.filesPerPreImportTask

    + + + + + + + + + + + + +
    說明預設值
    每個預先匯入工作允許的最大檔案數量。 2
    +

    dataCoord.import.taskRetention

    + + + + + + + + + + + + +
    說明預設值
    處於完成或失敗狀態的工作的保留期限,以秒為單位。 10800
    +

    dataCoord.import.maxSizeInMBPerImportTask

    + + + + + + + + + + + + +
    說明預設值
    為防止產生小區段,我們會將匯入的檔案重新分組。此參數代表每個群組 (每個 ImportTask) 中的檔案大小總和。 6144
    +

    dataCoord.import.scheduleInterval

    + + + + + + + + + + + + +
    說明預設值
    排程匯入的間隔,以秒為單位。 2
    +

    dataCoord.import.checkIntervalHigh

    + + + + + + + + + + + + +
    說明預設值
    檢查匯入的間隔,以秒為單位,設定為匯入檢查器的高頻率。 2
    +

    dataCoord.import.checkIntervalLow

    + + + + + + + + + + + + +
    說明預設值
    檢查匯入的間隔,以秒為單位,設定為匯入檢查器的低頻率。 120
    +

    dataCoord.import.maxImportFileNumPerReq

    + + + + + + + + + + + + +
    說明預設值
    每個單一匯入要求允許的最大檔案數量。 1024
    +

    dataCoord.import.waitForIndex

    + + + + + + + + + + + + +
    說明預設值
    表示匯入作業是否等待索引建立完成。
    +

    dataCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    秒。強制停止節點而不優先停止 5
    +

    dataCoord.slot.clusteringCompactionUsage

    + + + + + + + + + + + + +
    說明預設值
    群集壓縮工作的插槽使用量。 16
    +

    dataCoord.slot.mixCompactionUsage

    + + + + + + + + + + + + +
    說明預設值
    混合壓縮工作的插槽使用量。 8
    +

    dataCoord.slot.l0DeleteCompactionUsage

    + + + + + + + + + + + + +
    說明預設值
    混合壓實作業的插槽使用量。 8
    +

    dataCoord.ip

    + + + + + + + + + + + + +
    說明預設值
    dataCoord 的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址。
    +

    dataCoord.port

    + + + + + + + + + + + + +
    說明預設值
    DataCoord 的 TCP 連接埠 13333
    +

    dataCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    dataCoord 可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    dataCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    dataCoord 可以接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    dataCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    dataCoord 上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    dataCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    dataCoord 用戶端可接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.json new file mode 100644 index 000000000..c63a1930c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"dataNode-related Configurations","anchorList":[{"label":"dataNode 相關組態","href":"dataNode-related-Configurations","type":1,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxQueueLength","href":"dataNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"dataNode.dataSync.flowGraph.maxParallelism","href":"dataNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"dataNode.dataSync.maxParallelSyncMgrTasks","href":"dataNodedataSyncmaxParallelSyncMgrTasks","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.enable","href":"dataNodedataSyncskipModeenable","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.skipNum","href":"dataNodedataSyncskipModeskipNum","type":2,"isActive":false},{"label":"dataNode.dataSync.skipMode.coldTime","href":"dataNodedataSyncskipModecoldTime","type":2,"isActive":false},{"label":"dataNode.segment.insertBufSize","href":"dataNodesegmentinsertBufSize","type":2,"isActive":false},{"label":"dataNode.segment.deleteBufBytes","href":"dataNodesegmentdeleteBufBytes","type":2,"isActive":false},{"label":"dataNode.segment.syncPeriod","href":"dataNodesegmentsyncPeriod","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncEnable","href":"dataNodememoryforceSyncEnable","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncSegmentNum","href":"dataNodememoryforceSyncSegmentNum","type":2,"isActive":false},{"label":"dataNode.memory.checkInterval","href":"dataNodememorycheckInterval","type":2,"isActive":false},{"label":"dataNode.memory.forceSyncWatermark","href":"dataNodememoryforceSyncWatermark","type":2,"isActive":false},{"label":"dataNode.channel.workPoolSize","href":"dataNodechannelworkPoolSize","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointMaxParallel","href":"dataNodechannelupdateChannelCheckpointMaxParallel","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointInterval","href":"dataNodechannelupdateChannelCheckpointInterval","type":2,"isActive":false},{"label":"dataNode.channel.updateChannelCheckpointRPCTimeout","href":"dataNodechannelupdateChannelCheckpointRPCTimeout","type":2,"isActive":false},{"label":"dataNode.channel.maxChannelCheckpointsPerPRC","href":"dataNodechannelmaxChannelCheckpointsPerPRC","type":2,"isActive":false},{"label":"dataNode.channel.channelCheckpointUpdateTickInSeconds","href":"dataNodechannelchannelCheckpointUpdateTickInSeconds","type":2,"isActive":false},{"label":"dataNode.import.maxConcurrentTaskNum","href":"dataNodeimportmaxConcurrentTaskNum","type":2,"isActive":false},{"label":"dataNode.import.maxImportFileSizeInGB","href":"dataNodeimportmaxImportFileSizeInGB","type":2,"isActive":false},{"label":"dataNode.import.readBufferSizeInMB","href":"dataNodeimportreadBufferSizeInMB","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroBatchMemoryRatio","href":"dataNodecompactionlevelZeroBatchMemoryRatio","type":2,"isActive":false},{"label":"dataNode.compaction.levelZeroMaxBatchSize","href":"dataNodecompactionlevelZeroMaxBatchSize","type":2,"isActive":false},{"label":"dataNode.gracefulStopTimeout","href":"dataNodegracefulStopTimeout","type":2,"isActive":false},{"label":"dataNode.slot.slotCap","href":"dataNodeslotslotCap","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.memoryBufferRatio","href":"dataNodeclusteringCompactionmemoryBufferRatio","type":2,"isActive":false},{"label":"dataNode.clusteringCompaction.workPoolSize","href":"dataNodeclusteringCompactionworkPoolSize","type":2,"isActive":false},{"label":"dataNode.ip","href":"dataNodeip","type":2,"isActive":false},{"label":"dataNode.port","href":"dataNodeport","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxSendSize","href":"dataNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.serverMaxRecvSize","href":"dataNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxSendSize","href":"dataNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"dataNode.grpc.clientMaxRecvSize","href":"dataNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.md new file mode 100644 index 000000000..384cd799c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_datanode.md @@ -0,0 +1,1015 @@ +--- +id: configure_datanode.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 設定 dataNode。 +--- +

    dataNode 相關組態

    dataNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    說明預設值
    流程圖中任務佇列的最大長度 16
    +

    dataNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    說明預設值
    流程圖中並行執行的最大任務數 1024
    +

    dataNode.dataSync.maxParallelSyncMgrTasks

    + + + + + + + + + + + + +
    說明預設值
    資料節點同步管理員的全球最大並發同步任務數 256
    +

    dataNode.dataSync.skipMode.enable

    + + + + + + + + + + + + +
    說明預設值
    支援跳過某些 Timetick 訊息以減少 CPU 使用量
    +

    dataNode.dataSync.skipMode.skipNum

    + + + + + + + + + + + + +
    說明預設值
    每跳過 n 個記錄消耗一個 4
    +

    dataNode.dataSync.skipMode.coldTime

    + + + + + + + + + + + + +
    說明預設值
    在 x 秒內只有 Timetick msg 後開啟跳過模式 60
    +

    dataNode.segment.insertBufSize

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每個 binlog 檔案在記憶體緩衝區段中的最大大小。大小超過此值的 binlog 檔案會被刷新到 MinIO 或 S3 服務。
  • +
  • 單位:位元組
  • +
  • 將此參數設定得太小,會導致系統過度頻繁地儲存少量資料。設定太大會增加系統對記憶體的需求。
  • 16777216
    +

    dataNode.segment.deleteBufBytes

    + + + + + + + + + + + + +
    說明預設值
    單一通道刷新 del 的最大緩衝區大小 (位元組),預設為 16 MB 16777216
    +

    dataNode.segment.syncPeriod

    + + + + + + + + + + + + +
    說明預設值
    緩衝區未清空時,同步處理區段的週期。 600
    +

    dataNode.memory.forceSyncEnable

    + + + + + + + + + + + + +
    說明預設值
    如果記憶體使用率過高,設定為 true 可強制同步 true
    +

    dataNode.memory.forceSyncSegmentNum

    + + + + + + + + + + + + +
    說明預設值
    要同步的區段數,緩衝區最大的區段會被同步。 1
    +

    dataNode.memory.checkInterval

    + + + + + + + + + + + + +
    說明預設值
    檢查資料節點記憶體使用情況的間隔時間,以毫秒為單位 3000
    +

    dataNode.memory.forceSyncWatermark

    + + + + + + + + + + + + +
    說明預設值
    獨立版的記憶體水印,達到此水印時,區段會被同步。 0.5
    +

    dataNode.channel.workPoolSize

    + + + + + + + + + + + + +
    說明預設值
    +
  • 指定所有通道的全局工作池大小
  • +
  • 如果此參數 <= 0,將設定為可執行的最大 CPU 數目
  • +
  • 建議在收集數量較多時,將其設定為較大,以避免阻塞
  • -1
    +

    dataNode.channel.updateChannelCheckpointMaxParallel

    + + + + + + + + + + + + +
    說明預設值
    +
  • 指定通道檢查點更新的全局工作池大小
  • +
  • 如果此參數 <= 0,將設定為 10
  • 10
    +

    dataNode.channel.updateChannelCheckpointInterval

    + + + + + + + + + + + + +
    說明預設值
    資料節點更新每個通道檢查點的間隔時間 (秒) 60
    +

    dataNode.channel.updateChannelCheckpointRPCTimeout

    + + + + + + + + + + + + +
    說明預設值
    UpdateChannelCheckpoint RPC 呼叫的逾時時間 (秒) 20
    +

    dataNode.channel.maxChannelCheckpointsPerPRC

    + + + + + + + + + + + + +
    說明預設值
    每次 UpdateChannelCheckpoint RPC 的最大通道檢查點數量。 128
    +

    dataNode.channel.channelCheckpointUpdateTickInSeconds

    + + + + + + + + + + + + +
    說明預設值
    通道檢查點更新器執行更新的頻率 (以秒為單位)。 10
    +

    dataNode.import.maxConcurrentTaskNum

    + + + + + + + + + + + + +
    說明預設值
    資料節點上允許同時執行的最大匯入/匯出前工作數量。 16
    +

    dataNode.import.maxImportFileSizeInGB

    + + + + + + + + + + + + +
    說明預設值
    匯入檔案的最大檔案大小 (以 GB 為單位),其中匯入檔案指的是以行為基礎的檔案或以列為基礎的檔案集。 16
    +

    dataNode.import.readBufferSizeInMB

    + + + + + + + + + + + + +
    說明預設值
    資料節點在匯入時從分塊管理器讀取的資料區大小(MB)。 16
    +

    dataNode.compaction.levelZeroBatchMemoryRatio

    + + + + + + + + + + + + +
    說明預設值
    以批次模式執行第零層壓縮的最小可用記憶體比率 0.05
    +

    dataNode.compaction.levelZeroMaxBatchSize

    + + + + + + + + + + + + +
    說明預設值
    最大批次大小指執行 L0 壓縮時,批次中 L1/L2 區段的最大數目。預設值為 -1,任何小於 1 的值表示沒有限制。有效範圍:>= 1. -1
    +

    dataNode.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    秒。強制停止節點而不優先停止 1800
    +

    dataNode.slot.slotCap

    + + + + + + + + + + + + +
    說明預設值
    資料節點上允許同時執行的最大任務 (例如壓縮、匯入) 數量 16
    +

    dataNode.clusteringCompaction.memoryBufferRatio

    + + + + + + + + + + + + +
    說明預設值
    叢集壓縮的記憶體緩衝區比率。大於臨界值的資料會被沖到儲存區。 0.1
    +

    dataNode.clusteringCompaction.workPoolSize

    + + + + + + + + + + + + +
    說明預設值
    一個群集壓縮工作的工作人員池大小。 8
    +

    dataNode.ip

    + + + + + + + + + + + + +
    說明預設值
    dataNode 的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址。
    +

    dataNode.port

    + + + + + + + + + + + + +
    說明預設值
    資料節點的 TCP 埠 21124
    +

    dataNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    dataNode 可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    dataNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    dataNode 可以接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    dataNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    dataNode 上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    dataNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    dataNode 用戶端可接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.json new file mode 100644 index 000000000..04c8c2b04 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"etcd-related Configurations","anchorList":[{"label":"etcd 相關組態","href":"etcd-related-Configurations","type":1,"isActive":false},{"label":"etcd.endpoints","href":"etcdendpoints","type":2,"isActive":false},{"label":"etcd.rootPath","href":"etcdrootPath","type":2,"isActive":false},{"label":"etcd.metaSubPath","href":"etcdmetaSubPath","type":2,"isActive":false},{"label":"etcd.kvSubPath","href":"etcdkvSubPath","type":2,"isActive":false},{"label":"etcd.log.level","href":"etcdloglevel","type":2,"isActive":false},{"label":"etcd.log.path","href":"etcdlogpath","type":2,"isActive":false},{"label":"etcd.ssl.enabled","href":"etcdsslenabled","type":2,"isActive":false},{"label":"etcd.ssl.tlsCert","href":"etcdssltlsCert","type":2,"isActive":false},{"label":"etcd.ssl.tlsKey","href":"etcdssltlsKey","type":2,"isActive":false},{"label":"etcd.ssl.tlsCACert","href":"etcdssltlsCACert","type":2,"isActive":false},{"label":"etcd.ssl.tlsMinVersion","href":"etcdssltlsMinVersion","type":2,"isActive":false},{"label":"etcd.requestTimeout","href":"etcdrequestTimeout","type":2,"isActive":false},{"label":"etcd.use.embed","href":"etcduseembed","type":2,"isActive":false},{"label":"etcd.data.dir","href":"etcddatadir","type":2,"isActive":false},{"label":"etcd.auth.enabled","href":"etcdauthenabled","type":2,"isActive":false},{"label":"etcd.auth.userName","href":"etcdauthuserName","type":2,"isActive":false},{"label":"etcd.auth.password","href":"etcdauthpassword","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.md new file mode 100644 index 000000000..9f1853073 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_etcd.md @@ -0,0 +1,538 @@ +--- +id: configure_etcd.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 配置 etcd。 +--- +

    etcd 相關組態

    etcd 的相關設定,用於儲存 Milvus 元資料與服務發現。

    +

    etcd.endpoints

    + + + + + + + + + + + + +
    說明預設值
    +
  • 用於存取 etcd 服務的端點。您可以將此參數變更為您自己的 etcd 叢集端點。
  • +
  • 環境變數:ETCD_ENDPOINTS
  • +
  • 當 Milvus 啟動時,etcd 會優先從環境變數 ETCD_ENDPOINTS 取得有效位址。
  • localhost:2379
    +

    etcd.rootPath

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 etcd 中儲存資料的 key 的根目錄前綴。
  • +
  • 建議在第一次啟動 Milvus 前變更這個參數。
  • +
  • 若要在多個 Milvus 實體之間共用一個 etcd 實體,請考慮在啟動每個 Milvus 實體之前,將此變更為不同的值。
  • +
  • 如果已存在 etcd 服務,請為 Milvus 設定容易辨識的根目錄。
  • +
  • 為已執行的 Milvus 實例變更此值可能會導致讀取舊資料失敗。
  • by-dev
    +

    etcd.metaSubPath

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 etcd 中存儲元資料相關資訊的關鍵字的子前綴。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • +

    etcd.kvSubPath

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 etcd 中儲存時間戳的關鍵的子前綴。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 如果沒有特殊原因,建議不要變更這個參數。
  • kv
    +

    etcd.log.level

    + + + + + + + + + + + + +
    說明預設值
    只支援 debug、info、warn、error、panic 或 fatal。預設值 'info'。 資訊
    +

    etcd.log.path

    + + + + + + + + + + + + +
    說明預設值
    +
  • 路徑是其中之一:
  • +
  • - "default" 為 os.Stderr、
  • +
  • - "stderr "為 os.Stderr、
  • +
  • - "stdout "為 os.Stdout、
  • +
  • - 附加伺服器日誌的檔案路徑。
  • +
  • 請在內嵌式 Milvus 中調整:/tmp/milvus/logs/etcd.log
  • stdout
    +

    etcd.ssl.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否支援 ETCD 安全連線模式 false
    +

    etcd.ssl.tlsCert

    + + + + + + + + + + + + +
    說明預設值
    證書檔案的路徑 /path/to/etcd-client.pem
    +

    etcd.ssl.tlsKey

    + + + + + + + + + + + + +
    說明預設值
    金鑰檔案的路徑 /path/to/etcd-client-key.pem
    +

    etcd.ssl.tlsCACert

    + + + + + + + + + + + + +
    說明預設值
    CACert 檔案的路徑 /path/to/ca.pem
    +

    etcd.ssl.tlsMinVersion

    + + + + + + + + + + + + +
    說明預設值
    +
  • TLS 最低版本
  • +
  • 可選值:1.0, 1.1, 1.2, 1.3。
  • +
  • 建議使用 1.2 以上版本。
  • 1.3
    +

    etcd.requestTimeout

    + + + + + + + + + + + + +
    說明預設值
    Etcd 操作超時(以毫秒為單位 10000
    +

    etcd.use.embed

    + + + + + + + + + + + + +
    說明預設值
    是否啟用嵌入式 Etcd (進程中的 EtcdServer)。
    +

    etcd.data.dir

    + + + + + + + + + + + + +
    說明預設值
    只啟用嵌入式 Etcd。請在嵌入式 Milvus 中調整:/tmp/milvus/etcdData/ default.etcd
    +

    etcd.auth.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用驗證
    +

    etcd.auth.userName

    + + + + + + + + + + + + +
    說明預設值
    用於 etcd 認證的使用者名稱
    +

    etcd.auth.password

    + + + + + + + + + + + + +
    說明預設值
    用於 etcd 身份驗證的密碼
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.json new file mode 100644 index 000000000..ca6c2855b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"gpu-related Configurations","anchorList":[{"label":"與 GPU 相關的設定","href":"gpu-related-Configurations","type":1,"isActive":false},{"label":"gpu.initMemSize","href":"gpuinitMemSize","type":2,"isActive":false},{"label":"gpu.maxMemSize","href":"gpumaxMemSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.md new file mode 100644 index 000000000..6665f81e2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_gpu.md @@ -0,0 +1,85 @@ +--- +id: configure_gpu.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 gpu。 +--- +

    與 GPU 相關的設定

    #當使用 GPU 索引時,Milvus 會使用記憶體池來避免頻繁的記憶體分配和取消分配。

    +

    #在這裡,您可以設定記憶體池所佔用的記憶體大小,單位為 MB。

    +

    #注意,當實際的記憶體需求超過 maxMemSize 設定的值時,Milvus 有可能會當機。

    +

    #if initMemSize 和 MaxMemSize 都設定為零、

    +

    #milvus 將自動初始化一半可用的 GPU 記憶體、

    +

    #maxMemSize則是整個可用的GPU記憶體。

    +

    gpu.initMemSize

    + + + + + + + + + + + + +
    說明預設值
    Gpu 記憶體池啟用大小
    +

    gpu.maxMemSize

    + + + + + + + + + + + + +
    說明預設值
    Gpu 記憶池最大值
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.json new file mode 100644 index 000000000..6c967e98d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"grpc-related Configurations","anchorList":[{"label":"grpc 相關組態","href":"grpc-related-Configurations","type":1,"isActive":false},{"label":"grpc.gracefulStopTimeout","href":"grpcgracefulStopTimeout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.md new file mode 100644 index 000000000..d0d130250 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_grpc.md @@ -0,0 +1,50 @@ +--- +id: configure_grpc.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 grpc。 +--- +

    grpc 相關組態

    grpc.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    秒,等待優化停止完成的時間 10
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.json new file mode 100644 index 000000000..8ff47dbd4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexCoord-related Configurations","anchorList":[{"label":"索引樓層相關設定","href":"indexCoord-related-Configurations","type":1,"isActive":false},{"label":"indexCoord.segment.minSegmentNumRowsToEnableIndex","href":"indexCoordsegmentminSegmentNumRowsToEnableIndex","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.md new file mode 100644 index 000000000..6df1675fb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexcoord.md @@ -0,0 +1,50 @@ +--- +id: configure_indexcoord.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 indexCoord。 +--- +

    索引樓層相關設定

    indexCoord.segment.minSegmentNumRowsToEnableIndex

    + + + + + + + + + + + + +
    說明預設值
    這是一個臨界值。當區段的行數小於此值時,區段將不會被索引。 1024
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.json new file mode 100644 index 000000000..ffd1e352e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"indexNode-related Configurations","anchorList":[{"label":"indexNode 相關設定","href":"indexNode-related-Configurations","type":1,"isActive":false},{"label":"indexNode.enableDisk","href":"indexNodeenableDisk","type":2,"isActive":false},{"label":"indexNode.ip","href":"indexNodeip","type":2,"isActive":false},{"label":"indexNode.port","href":"indexNodeport","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxSendSize","href":"indexNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.serverMaxRecvSize","href":"indexNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxSendSize","href":"indexNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"indexNode.grpc.clientMaxRecvSize","href":"indexNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.md new file mode 100644 index 000000000..6bdb5b3d9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_indexnode.md @@ -0,0 +1,224 @@ +--- +id: configure_indexnode.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 設定 indexNode。 +--- +

    indexNode 相關設定

    indexNode.enableDisk

    + + + + + + + + + + + + +
    說明預設值
    啟用索引節點建立磁碟向量索引
    +

    indexNode.ip

    + + + + + + + + + + + + +
    說明預設值
    indexNode 的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址
    +

    indexNode.port

    + + + + + + + + + + + + +
    說明預設值
    索引節點的 TCP 連接埠 21121
    +

    indexNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    indexNode 可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    indexNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    indexNode 可以接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    indexNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    indexNode 上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    indexNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    indexNode 用戶端可接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.json new file mode 100644 index 000000000..160d27628 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"localStorage-related Configurations","anchorList":[{"label":"localStorage 相關設定","href":"localStorage-related-Configurations","type":1,"isActive":false},{"label":"localStorage.path","href":"localStoragepath","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.md new file mode 100644 index 000000000..43a079575 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_localstorage.md @@ -0,0 +1,53 @@ +--- +id: configure_localstorage.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 localStorage。 +--- +

    localStorage 相關設定

    localStorage.path

    + + + + + + + + + + + + +
    說明預設值
    +
  • 搜尋或查詢時儲存向量資料的本機路徑,以避免重複存取 MinIO 或 S3 服務。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • /var/lib/milvus/data/
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.json new file mode 100644 index 000000000..adfe69138 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"log-related Configurations","anchorList":[{"label":"日誌相關組態","href":"log-related-Configurations","type":1,"isActive":false},{"label":"log.level","href":"loglevel","type":2,"isActive":false},{"label":"log.file.rootPath","href":"logfilerootPath","type":2,"isActive":false},{"label":"log.file.maxSize","href":"logfilemaxSize","type":2,"isActive":false},{"label":"log.file.maxAge","href":"logfilemaxAge","type":2,"isActive":false},{"label":"log.file.maxBackups","href":"logfilemaxBackups","type":2,"isActive":false},{"label":"log.format","href":"logformat","type":2,"isActive":false},{"label":"log.stdout","href":"logstdout","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.md new file mode 100644 index 000000000..9b6eacb2a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_log.md @@ -0,0 +1,231 @@ +--- +id: configure_log.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定日誌。 +--- +

    日誌相關組態

    設定系統日誌輸出。

    +

    log.level

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 日誌層級。選項:debug、info、warn、error、panic 及 fatal。
  • +
  • 建議在測試和開發環境中使用 debug 層級,在生產環境中使用 info 層級。
  • 資訊
    +

    log.file.rootPath

    + + + + + + + + + + + + +
    說明預設值
    +
  • 日誌檔案的根目錄。
  • +
  • 預設值為空,表示將日誌檔案輸出到標準輸出 (stdout) 和標準錯誤 (stderr)。
  • +
  • 如果此參數設定為有效的本機路徑,Milvus 會在此路徑寫入並儲存日誌檔案。
  • +
  • 將此參數設定為您有權限寫入的路徑。
  • +

    log.file.maxSize

    + + + + + + + + + + + + +
    說明預設值
    日誌檔案的最大大小,單位:MB。 300
    +

    log.file.maxAge

    + + + + + + + + + + + + +
    說明預設值
    日誌檔案自動清除前的最長保留時間,單位:天。最小值為 1。 10
    +

    log.file.maxBackups

    + + + + + + + + + + + + +
    說明預設值
    要備份的日誌檔案最大數量,單位:日。最小值為 1。 20
    +

    log.format

    + + + + + + + + + + + + +
    說明預設值
    Milvus 日誌格式。選項:文字和 JSON 文字
    +

    log.stdout

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 Stdout
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.json new file mode 100644 index 000000000..4d83a56f0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"metastore-related Configurations","anchorList":[{"label":"metastore 相關設定","href":"metastore-related-Configurations","type":1,"isActive":false},{"label":"metastore.type","href":"metastoretype","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.md new file mode 100644 index 000000000..611b9af0f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_metastore.md @@ -0,0 +1,50 @@ +--- +id: configure_metastore.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 metastore。 +--- +

    metastore 相關設定

    metastore.type

    + + + + + + + + + + + + +
    說明預設值
    預設值:etcd,有效值:[etcd, tikv] etcd
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.json new file mode 100644 index 000000000..96afb5bc3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"minio-related Configurations","anchorList":[{"label":"minio 相關組態","href":"minio-related-Configurations","type":1,"isActive":false},{"label":"minio.address","href":"minioaddress","type":2,"isActive":false},{"label":"minio.port","href":"minioport","type":2,"isActive":false},{"label":"minio.accessKeyID","href":"minioaccessKeyID","type":2,"isActive":false},{"label":"minio.secretAccessKey","href":"miniosecretAccessKey","type":2,"isActive":false},{"label":"minio.useSSL","href":"miniouseSSL","type":2,"isActive":false},{"label":"minio.ssl.tlsCACert","href":"miniossltlsCACert","type":2,"isActive":false},{"label":"minio.bucketName","href":"miniobucketName","type":2,"isActive":false},{"label":"minio.rootPath","href":"miniorootPath","type":2,"isActive":false},{"label":"minio.useIAM","href":"miniouseIAM","type":2,"isActive":false},{"label":"minio.cloudProvider","href":"miniocloudProvider","type":2,"isActive":false},{"label":"minio.iamEndpoint","href":"minioiamEndpoint","type":2,"isActive":false},{"label":"minio.logLevel","href":"miniologLevel","type":2,"isActive":false},{"label":"minio.region","href":"minioregion","type":2,"isActive":false},{"label":"minio.useVirtualHost","href":"miniouseVirtualHost","type":2,"isActive":false},{"label":"minio.requestTimeoutMs","href":"miniorequestTimeoutMs","type":2,"isActive":false},{"label":"minio.listObjectsMaxKeys","href":"miniolistObjectsMaxKeys","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.md new file mode 100644 index 000000000..c46a9ebd5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_minio.md @@ -0,0 +1,528 @@ +--- +id: configure_minio.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 設定 minio。 +--- +

    minio 相關組態

    MinIO/S3/GCS 或任何其他服務的相關配置支援 S3 API,S3 API 負責 Milvus 的資料持久化。

    +

    為了簡單起見,我們在以下說明中將儲存服務稱為「MinIO/S3」。

    +

    minio.address

    + + + + + + + + + + + + +
    說明預設值
    +
  • MinIO 或 S3 服務的 IP 位址。
  • +
  • 環境變數:MINIO_ADDRESS
  • +
  • minio.address 和 minio.port 一起產生對 MinIO 或 S3 服務的有效存取。
  • +
  • 當 Milvus 啟動時,MinIO 會優先從環境變數 MINIO_ADDRESS 取得有效的 IP 位址。
  • +
  • 預設值適用於 MinIO 或 S3 與 Milvus 執行於相同網路時。
  • localhost
    +

    minio.port

    + + + + + + + + + + + + +
    說明預設值
    MinIO 或 S3 服務的連接埠。 9000
    +

    minio.accessKeyID

    + + + + + + + + + + + + +
    說明預設值
    +
  • MinIO 或 S3 發給使用者授權存取的存取金鑰 ID。
  • +
  • 環境變數:MINIO_ACCESS_KEY_ID 或 minio.accessKeyID
  • +
  • minio.accessKeyID 和 minio.secretAccessKey 一起用於存取 MinIO 或 S3 服務的身分驗證。
  • +
  • 此設定必須與啟動 MinIO 或 S3 所需的環境變數 MINIO_ACCESS_KEY_ID 相同。
  • +
  • 預設值適用於使用預設 docker-compose.yml 檔啟動的 MinIO 或 S3 服務。
  • minioadmin
    +

    minio.secretAccessKey

    + + + + + + + + + + + + +
    說明預設值
    +
  • 用來加密簽章字串和在伺服器上驗證簽章字串的密匙。它必須嚴格保密,只有 MinIO 或 S3 伺服器和使用者可以存取。
  • +
  • 環境變數:MINIO_SECRET_ACCESS_KEY 或 minio.secretAccessKey
  • +
  • minio.accessKeyID 和 minio.secretAccessKey 一起用於存取 MinIO 或 S3 服務的身分驗證。
  • +
  • 此設定必須與啟動 MinIO 或 S3 所需的環境變數 MINIO_SECRET_ACCESS_KEY 相同。
  • +
  • 預設值適用於使用預設 docker-compose.yml 檔啟動的 MinIO 或 S3 服務。
  • minioadmin
    +

    minio.useSSL

    + + + + + + + + + + + + +
    說明預設值
    控制是否透過 SSL 存取 MinIO 或 S3 服務的開關值。
    +

    minio.ssl.tlsCACert

    + + + + + + + + + + + + +
    說明預設值
    CACert 檔案的路徑 /path/to/public.crt
    +

    minio.bucketName

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 MinIO 或 S3 儲存資料的資料桶名稱。
  • +
  • Milvus 2.0.0 不支援在多個儲存桶中儲存資料。
  • +
  • 如果不存在,則會建立具有此名稱的資料桶。如果資料桶已存在且可存取,則會直接使用。否則會產生錯誤。
  • +
  • 若要在多個 Milvus 實體之間共用一個 MinIO 實體,請考慮在啟動每個 Milvus 實體之前,將此變更為不同的值。詳情請參閱操作常見問題。
  • +
  • 如果使用 Docker 在本機啟動 MinIO 服務,資料會儲存在本機 Docker 中。確保有足夠的儲存空間。
  • +
  • 在一個 MinIO 或 S3 實例中,一個儲存桶的名稱是全局唯一的。
  • 儲存桶
    +

    minio.rootPath

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 MinIO 或 S3 中儲存資料的 key 的根目錄前綴。
  • +
  • 建議在第一次啟動 Milvus 前變更此參數。
  • +
  • 若要在多個 Milvus 實體之間共用 MinIO 實體,請考慮在啟動每個 Milvus 實體之前,將此變更為不同的值。詳情請參閱操作常見問題。
  • +
  • 如果 etcd 服務已經存在,為 Milvus 設定一個易於識別的根密鑰前綴。
  • +
  • 為已經執行的 Milvus 實例變更此值可能會導致讀取遺留資料失敗。
  • 檔案
    +

    minio.useIAM

    + + + + + + + + + + + + +
    說明預設值
    +
  • 是否使用 IAM 角色來存取 S3/GCS,而非存取/秘鑰
  • +
  • 如需詳細資訊,請參閱
  • +
  • aws: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html
  • +
  • gcp: https://cloud.google.com/storage/docs/access-control/iam
  • +
  • aliyun (ack): https://www.alibabacloud.com/help/en/container-service-for-kubernetes/latest/use-rrsa-to-enforce-access-control
  • +
  • aliyun (ecs): https://www.alibabacloud.com/help/en/elastic-compute-service/latest/attach-an-instance-ram-role
  • 錯誤
    +

    minio.cloudProvider

    + + + + + + + + + + + + +
    說明預設值
    +
  • S3 的雲供應商。支援:"aws"、"gcp"、"aliyun"。
  • +
  • 如果其他雲提供商支援簽章 v4 的 S3 API,您可以使用「aws」,例如:minio。
  • +
  • 如果其他雲提供商支援簽章 v2 的 S3 API,您可以使用「gcp」。
  • +
  • 如果其他雲提供商使用虛擬主機類型的資料桶,您可以使用 "aliyun"。
  • +
  • 啟用 useIAM 時,目前僅支援 "aws"、"gcp"、"aliyun"。
  • aws
    +

    minio.iamEndpoint

    + + + + + + + + + + + + +
    說明預設值
    +
  • 當 useIAM 為 true 且 cloudProvider 為 "aws" 時,用於取得 IAM 角色憑證的自訂端點。
  • +
  • 如果您要使用 AWS 預設端點,請留空。
  • +

    minio.logLevel

    + + + + + + + + + + + + +
    說明預設值
    aws sdk 日誌的日誌層級。支援的層級:關閉、致命、錯誤、警告、資訊、除錯、追蹤 致命
    +

    minio.region

    + + + + + + + + + + + + +
    說明預設值
    指定 minio 儲存系統位置區域
    +

    minio.useVirtualHost

    + + + + + + + + + + + + +
    說明預設值
    是否為儲存空間使用虛擬主機模式
    +

    minio.requestTimeoutMs

    + + + + + + + + + + + + +
    說明預設值
    請求時間的 minio 超時(毫秒 10000
    +

    minio.listObjectsMaxKeys

    + + + + + + + + + + + + +
    說明預設值
    +
  • minio ListObjects rpc 中每批請求的最大物件數量、
  • +
  • 0 表示預設使用 oss 用戶端,如果 ListObjects 超時,請減少這些配置。
  • 0
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.json new file mode 100644 index 000000000..a3e113543 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"mq-related Configurations","anchorList":[{"label":"mq 相關配置","href":"mq-related-Configurations","type":1,"isActive":false},{"label":"mq.type","href":"mqtype","type":2,"isActive":false},{"label":"mq.enablePursuitMode","href":"mqenablePursuitMode","type":2,"isActive":false},{"label":"mq.pursuitLag","href":"mqpursuitLag","type":2,"isActive":false},{"label":"mq.pursuitBufferSize","href":"mqpursuitBufferSize","type":2,"isActive":false},{"label":"mq.mqBufSize","href":"mqmqBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.mergeCheckInterval","href":"mqdispatchermergeCheckInterval","type":2,"isActive":false},{"label":"mq.dispatcher.targetBufSize","href":"mqdispatchertargetBufSize","type":2,"isActive":false},{"label":"mq.dispatcher.maxTolerantLag","href":"mqdispatchermaxTolerantLag","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.md new file mode 100644 index 000000000..45466aab9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_mq.md @@ -0,0 +1,262 @@ +--- +id: configure_mq.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 mq。 +--- +

    mq 相關配置

    Milvus 支援四種 MQ:rocksmq(基於 RockDB)、natsmq(嵌入式 nats-server)、Pulsar 和 Kafka。

    +

    您可以透過設定 mq.type 欄位來變更您的 MQ。

    +

    如果您不將 mq.type 欄位設定為預設值,如果我們在此檔案中設定多個 mq,則會有啟用優先順序的注意事項。

    +
      +
    1. 獨立(本機)模式:rocksmq(預設) > natsmq > Pulsar > Kafka

    2. +
    3. 群集模式: Pulsar (預設) > Kafka (群集模式不支援 rocksmq 和 natsmq)

    4. +
    +

    mq.type

    + + + + + + + + + + + + +
    說明預設值
    +
  • 預設值:"default" (預設值)
  • +
  • 有效值:[default, pulsar, kafka, rocksmq, natsmq] (預設值)
  • 預設值
    +

    mq.enablePursuitMode

    + + + + + + + + + + + + +
    說明預設值
    預設值:"true" true
    +

    mq.pursuitLag

    + + + + + + + + + + + + +
    說明預設值
    進入追擊模式的時間勾選滯後閾值,以秒為單位 10
    +

    mq.pursuitBufferSize

    + + + + + + + + + + + + +
    說明預設值
    追蹤模式緩衝區大小,位元組 8388608
    +

    mq.mqBufSize

    + + + + + + + + + + + + +
    說明預設值
    MQ 用戶端消費者緩衝區長度 16
    +

    mq.dispatcher.mergeCheckInterval

    + + + + + + + + + + + + +
    說明預設值
    調度員檢查是否合併的時間間隔 (秒) 1
    +

    mq.dispatcher.targetBufSize

    + + + + + + + + + + + + +
    說明預設值
    用於合併的通道緩衝區長度 16
    +

    mq.dispatcher.maxTolerantLag

    + + + + + + + + + + + + +
    說明預設值
    預設值:"3",目標傳送 msgPack 的逾時時間(秒)。 3
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.json new file mode 100644 index 000000000..7771fff91 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"msgChannel-related Configurations","anchorList":[{"label":"msgChannel 相關設定","href":"msgChannel-related-Configurations","type":1,"isActive":false},{"label":"msgChannel.chanNamePrefix.cluster","href":"msgChannelchanNamePrefixcluster","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordTimeTick","href":"msgChannelchanNamePrefixrootCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordStatistics","href":"msgChannelchanNamePrefixrootCoordStatistics","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.rootCoordDml","href":"msgChannelchanNamePrefixrootCoordDml","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.queryTimeTick","href":"msgChannelchanNamePrefixqueryTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordTimeTick","href":"msgChannelchanNamePrefixdataCoordTimeTick","type":2,"isActive":false},{"label":"msgChannel.chanNamePrefix.dataCoordSegmentInfo","href":"msgChannelchanNamePrefixdataCoordSegmentInfo","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataCoordSubNamePrefix","href":"msgChannelsubNamePrefixdataCoordSubNamePrefix","type":2,"isActive":false},{"label":"msgChannel.subNamePrefix.dataNodeSubNamePrefix","href":"msgChannelsubNamePrefixdataNodeSubNamePrefix","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.md new file mode 100644 index 000000000..996417ee2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_msgchannel.md @@ -0,0 +1,316 @@ +--- +id: configure_msgchannel.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 msgChannel。 +--- +

    msgChannel 相關設定

    本主題介紹 Milvus 的訊息通道相關設定。

    +

    msgChannel.chanNamePrefix.cluster

    + + + + + + + + + + + + +
    說明預設值
    +
  • 建立訊息通道時,通道的根名稱前綴。
  • +
  • 建議在第一次啟動 Milvus 前變更此參數。
  • +
  • 若要在多個 Milvus 實體中共用一個 Pulsar 實體,請考慮在啟動每個 Milvus 實體前,將此變更為一個名稱,而非預設名稱。
  • by-dev
    +

    msgChannel.chanNamePrefix.rootCoordTimeTick

    + + + + + + + + + + + + +
    說明預設值
    +
  • 消息通道的子名稱前綴,根協調器會在此通道中發佈時間刻度消息。
  • +
  • 完整的頻道名稱前綴是 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordTimeTick} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改這個參數。
  • rootcoord-timetick
    +

    msgChannel.chanNamePrefix.rootCoordStatistics

    + + + + + + + + + + + + +
    說明預設值
    +
  • 根目錄發布自己統計訊息的訊息通道的子名稱前綴。
  • +
  • 完整的頻道名稱前綴是 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordStatistics} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • rootcoord-statistics
    +

    msgChannel.chanNamePrefix.rootCoordDml

    + + + + + + + + + + + + +
    說明預設值
    +
  • 根目錄發佈資料處理語言 (DML) 訊息的訊息通道的子名稱前綴。
  • +
  • 完整的頻道名稱前綴是 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.rootCoordDml} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • rootcoord-dml
    +

    msgChannel.chanNamePrefix.queryTimeTick

    + + + + + + + + + + + + +
    說明預設值
    +
  • 查詢節點發佈時間勾選訊息的訊息通道的子名稱前綴。
  • +
  • 完整的通道名稱前綴為 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.queryTimeTick} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • queryTimeTick
    +

    msgChannel.chanNamePrefix.dataCoordTimeTick

    + + + + + + + + + + + + +
    說明預設值
    +
  • 資料協調器發布時間刻度訊息的訊息通道的子名稱前綴。
  • +
  • 完整的頻道名稱前綴為 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordTimeTick} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • datacoord-timetick-channel
    +

    msgChannel.chanNamePrefix.dataCoordSegmentInfo

    + + + + + + + + + + + + +
    說明預設值
    +
  • 資料協調器發布區段資訊訊息的訊息通道的子名稱前綴。
  • +
  • 完整的通道名稱前綴為 ${msgChannel.chanNamePrefix.cluster}-${msgChannel.chanNamePrefix.dataCoordSegmentInfo} 。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • 段落資訊頻道
    +

    msgChannel.subNamePrefix.dataCoordSubNamePrefix

    + + + + + + + + + + + + +
    說明預設值
    +
  • 資料坐標的訂閱名稱前綴。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改此參數。
  • 數據坐標
    +

    msgChannel.subNamePrefix.dataNodeSubNamePrefix

    + + + + + + + + + + + + +
    說明預設值
    +
  • 資料節點的訂閱名稱前綴。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數,會影響您存取舊資料。
  • +
  • 建議在第一次啟動 Milvus 前變更此參數。
  • 數據節點
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.json new file mode 100644 index 000000000..776b4a9ca --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"natsmq-related Configurations","anchorList":[{"label":"natsmq 相關組態","href":"natsmq-related-Configurations","type":1,"isActive":false},{"label":"natsmq.server.port","href":"natsmqserverport","type":2,"isActive":false},{"label":"natsmq.server.storeDir","href":"natsmqserverstoreDir","type":2,"isActive":false},{"label":"natsmq.server.maxFileStore","href":"natsmqservermaxFileStore","type":2,"isActive":false},{"label":"natsmq.server.maxPayload","href":"natsmqservermaxPayload","type":2,"isActive":false},{"label":"natsmq.server.maxPending","href":"natsmqservermaxPending","type":2,"isActive":false},{"label":"natsmq.server.initializeTimeout","href":"natsmqserverinitializeTimeout","type":2,"isActive":false},{"label":"natsmq.server.monitor.trace","href":"natsmqservermonitortrace","type":2,"isActive":false},{"label":"natsmq.server.monitor.debug","href":"natsmqservermonitordebug","type":2,"isActive":false},{"label":"natsmq.server.monitor.logTime","href":"natsmqservermonitorlogTime","type":2,"isActive":false},{"label":"natsmq.server.monitor.logFile","href":"natsmqservermonitorlogFile","type":2,"isActive":false},{"label":"natsmq.server.monitor.logSizeLimit","href":"natsmqservermonitorlogSizeLimit","type":2,"isActive":false},{"label":"natsmq.server.retention.maxAge","href":"natsmqserverretentionmaxAge","type":2,"isActive":false},{"label":"natsmq.server.retention.maxBytes","href":"natsmqserverretentionmaxBytes","type":2,"isActive":false},{"label":"natsmq.server.retention.maxMsgs","href":"natsmqserverretentionmaxMsgs","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.md new file mode 100644 index 000000000..b08ba2552 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_natsmq.md @@ -0,0 +1,429 @@ +--- +id: configure_natsmq.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 natsmq。 +--- +

    natsmq 相關組態

    natsmq 配置。

    +

    更多詳情:https://docs.nats.io/running-a-nats-service/configuration

    +

    natsmq.server.port

    + + + + + + + + + + + + +
    說明預設值
    NATS 伺服器的聆聽連接埠。 4222
    +

    natsmq.server.storeDir

    + + + + + + + + + + + + +
    說明預設值
    用於 JetStream 儲存 nats 的目錄 /var/lib/milvus/nats
    +

    natsmq.server.maxFileStore

    + + + + + + + + + + + + +
    說明預設值
    檔案」儲存的最大大小 17179869184
    +

    natsmq.server.maxPayload

    + + + + + + + + + + + + +
    說明預設值
    訊息有效負載的最大位元組數 8388608
    +

    natsmq.server.maxPending

    + + + + + + + + + + + + +
    說明預設值
    連線緩衝的最大位元組數 適用於用戶端連線 67108864
    +

    natsmq.server.initializeTimeout

    + + + + + + + + + + + + +
    說明預設值
    等待 natsmq 初始化完成 4000
    +

    natsmq.server.monitor.trace

    + + + + + + + + + + + + +
    說明預設值
    如果為 true,啟用通訊協定追蹤日誌訊息
    +

    natsmq.server.monitor.debug

    + + + + + + + + + + + + +
    說明預設值
    若為 true 啟用除錯紀錄資訊
    +

    natsmq.server.monitor.logTime

    + + + + + + + + + + + + +
    說明預設值
    如果設定為 false,則記錄不含時間戳記。
    +

    natsmq.server.monitor.logFile

    + + + + + + + + + + + + +
    說明預設值
    如果使用相對路徑,則日誌檔案路徑相對於 milvus 二進位的 ...。 /tmp/milvus/logs/nats.log
    +

    natsmq.server.monitor.logSizeLimit

    + + + + + + + + + + + + +
    說明預設值
    日誌檔案滾動到新檔案後的大小 (位元組) 536870912
    +

    natsmq.server.retention.maxAge

    + + + + + + + + + + + + +
    說明預設值
    P 通道中任何訊息的最大年齡 4320
    +

    natsmq.server.retention.maxBytes

    + + + + + + + + + + + + +
    說明預設值
    單一 P 信道可包含多少位元組。如果 P 頻道超過此大小,則移除最舊的訊息
    +

    natsmq.server.retention.maxMsgs

    + + + + + + + + + + + + +
    說明預設值
    單一 P 信道可包含多少訊息。如果 P 信道超過此限制,則移除最舊的訊息
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.json new file mode 100644 index 000000000..eaf8c51ce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"proxy-related Configurations","anchorList":[{"label":"代理相關組態","href":"proxy-related-Configurations","type":1,"isActive":false},{"label":"proxy.timeTickInterval","href":"proxytimeTickInterval","type":2,"isActive":false},{"label":"proxy.healthCheckTimeout","href":"proxyhealthCheckTimeout","type":2,"isActive":false},{"label":"proxy.msgStream.timeTick.bufSize","href":"proxymsgStreamtimeTickbufSize","type":2,"isActive":false},{"label":"proxy.maxNameLength","href":"proxymaxNameLength","type":2,"isActive":false},{"label":"proxy.maxFieldNum","href":"proxymaxFieldNum","type":2,"isActive":false},{"label":"proxy.maxVectorFieldNum","href":"proxymaxVectorFieldNum","type":2,"isActive":false},{"label":"proxy.maxShardNum","href":"proxymaxShardNum","type":2,"isActive":false},{"label":"proxy.maxDimension","href":"proxymaxDimension","type":2,"isActive":false},{"label":"proxy.ginLogging","href":"proxyginLogging","type":2,"isActive":false},{"label":"proxy.ginLogSkipPaths","href":"proxyginLogSkipPaths","type":2,"isActive":false},{"label":"proxy.maxTaskNum","href":"proxymaxTaskNum","type":2,"isActive":false},{"label":"proxy.mustUsePartitionKey","href":"proxymustUsePartitionKey","type":2,"isActive":false},{"label":"proxy.accessLog.enable","href":"proxyaccessLogenable","type":2,"isActive":false},{"label":"proxy.accessLog.minioEnable","href":"proxyaccessLogminioEnable","type":2,"isActive":false},{"label":"proxy.accessLog.localPath","href":"proxyaccessLoglocalPath","type":2,"isActive":false},{"label":"proxy.accessLog.filename","href":"proxyaccessLogfilename","type":2,"isActive":false},{"label":"proxy.accessLog.maxSize","href":"proxyaccessLogmaxSize","type":2,"isActive":false},{"label":"proxy.accessLog.rotatedTime","href":"proxyaccessLogrotatedTime","type":2,"isActive":false},{"label":"proxy.accessLog.remotePath","href":"proxyaccessLogremotePath","type":2,"isActive":false},{"label":"proxy.accessLog.remoteMaxTime","href":"proxyaccessLogremoteMaxTime","type":2,"isActive":false},{"label":"proxy.accessLog.cacheSize","href":"proxyaccessLogcacheSize","type":2,"isActive":false},{"label":"proxy.accessLog.cacheFlushInterval","href":"proxyaccessLogcacheFlushInterval","type":2,"isActive":false},{"label":"proxy.connectionCheckIntervalSeconds","href":"proxyconnectionCheckIntervalSeconds","type":2,"isActive":false},{"label":"proxy.connectionClientInfoTTLSeconds","href":"proxyconnectionClientInfoTTLSeconds","type":2,"isActive":false},{"label":"proxy.maxConnectionNum","href":"proxymaxConnectionNum","type":2,"isActive":false},{"label":"proxy.gracefulStopTimeout","href":"proxygracefulStopTimeout","type":2,"isActive":false},{"label":"proxy.slowQuerySpanInSeconds","href":"proxyslowQuerySpanInSeconds","type":2,"isActive":false},{"label":"proxy.queryNodePooling.size","href":"proxyqueryNodePoolingsize","type":2,"isActive":false},{"label":"proxy.http.enabled","href":"proxyhttpenabled","type":2,"isActive":false},{"label":"proxy.http.debug_mode","href":"proxyhttpdebugmode","type":2,"isActive":false},{"label":"proxy.http.port","href":"proxyhttpport","type":2,"isActive":false},{"label":"proxy.http.acceptTypeAllowInt64","href":"proxyhttpacceptTypeAllowInt64","type":2,"isActive":false},{"label":"proxy.http.enablePprof","href":"proxyhttpenablePprof","type":2,"isActive":false},{"label":"proxy.ip","href":"proxyip","type":2,"isActive":false},{"label":"proxy.port","href":"proxyport","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxSendSize","href":"proxygrpcserverMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.serverMaxRecvSize","href":"proxygrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxSendSize","href":"proxygrpcclientMaxSendSize","type":2,"isActive":false},{"label":"proxy.grpc.clientMaxRecvSize","href":"proxygrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.md new file mode 100644 index 000000000..68dbebf4f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_proxy.md @@ -0,0 +1,1155 @@ +--- +id: configure_proxy.md +related_key: configure +group: system_configuration.md +summary: 學習如何設定 Milvus 的代理。 +--- +

    代理相關組態

    proxy 的相關設定,用來驗證用戶端的請求,並減少傳回的結果。

    +

    proxy.timeTickInterval

    + + + + + + + + + + + + +
    說明預設值
    代理同步時間刻度的間隔,單位:毫秒。 200
    +

    proxy.healthCheckTimeout

    + + + + + + + + + + + + +
    說明預設值
    毫秒,進行元件健康檢查的間隔 3000
    +

    proxy.msgStream.timeTick.bufSize

    + + + + + + + + + + + + +
    說明預設值
    當產生訊息時,proxy 的 timeTick 訊息串流可以緩衝的最大訊息數。 512
    +

    proxy.maxNameLength

    + + + + + + + + + + + + +
    說明預設值
    可在 Milvus 中建立的名稱或別名的最大長度,包括集合名稱、集合別名、分割區名稱和欄位名稱。 255
    +

    proxy.maxFieldNum

    + + + + + + + + + + + + +
    說明預設值
    在集合中建立欄位時,可建立的最大欄位數。強烈建議設定 maxFieldNum >=64。 64
    +

    proxy.maxVectorFieldNum

    + + + + + + + + + + + + +
    說明預設值
    可在集合中指定的向量欄位最大數目。值範圍:[1, 10]. 4
    +

    proxy.maxShardNum

    + + + + + + + + + + + + +
    說明預設值
    在集合中建立分片時,可建立的最大分片數。 16
    +

    proxy.maxDimension

    + + + + + + + + + + + + +
    說明預設值
    在集合中建立時,向量的最大尺寸數。 32768
    +

    proxy.ginLogging

    + + + + + + + + + + + + +
    說明預設值
    +
  • 是否產生吟唱日誌。
  • +
  • 請在內嵌的 Milvus 中調整:false
  • +

    proxy.ginLogSkipPaths

    + + + + + + + + + + + + +
    說明預設值
    跳過 gin 日誌的 URL 路徑 /
    +

    proxy.maxTaskNum

    + + + + + + + + + + + + +
    說明預設值
    代理任務佇列中的最大任務數。 1024
    +

    proxy.mustUsePartitionKey

    + + + + + + + + + + + + +
    說明預設值
    代理是否必須使用收集的分割區金鑰的開關
    +

    proxy.accessLog.enable

    + + + + + + + + + + + + +
    說明預設值
    是否啟用存取記錄功能。 false
    +

    proxy.accessLog.minioEnable

    + + + + + + + + + + + + +
    說明預設值
    是否上傳本機存取日誌檔案到 MinIO。此參數可在 proxy.accessLog.filename 不為空時指定。
    +

    proxy.accessLog.localPath

    + + + + + + + + + + + + +
    說明預設值
    儲存存取記錄檔案的本機資料夾路徑。此參數可在 proxy.accessLog.filename 不為空時指定。 /tmp/milvus_access
    +

    proxy.accessLog.filename

    + + + + + + + + + + + + +
    說明預設值
    存取記錄檔案的名稱。如果將此參數留空,存取日誌會列印到 stdout。
    +

    proxy.accessLog.maxSize

    + + + + + + + + + + + + +
    說明預設值
    單一存取記錄檔允許的最大大小。如果日誌檔案大小達到此限制,就會啟動輪替程序。此程序會封鎖目前的存取記錄檔,建立新的記錄檔,並清除原始記錄檔的內容。單位:MB。 64
    +

    proxy.accessLog.rotatedTime

    + + + + + + + + + + + + +
    說明預設值
    允許輪換單一存取記錄檔的最大時間間隔。達到指定的時間間隔時,會觸發輪換程序,建立新的存取記錄檔,並封存先前的存取記錄檔。單位:秒 0
    +

    proxy.accessLog.remotePath

    + + + + + + + + + + + + +
    說明預設值
    上傳存取記錄檔案的物件儲存路徑。 access_log/
    +

    proxy.accessLog.remoteMaxTime

    + + + + + + + + + + + + +
    說明預設值
    允許上傳存取記錄檔的時間間隔。如果日誌檔案的上傳時間超過此時間間隔,檔案會被刪除。將值設定為 0 會停用此功能。 0
    +

    proxy.accessLog.cacheSize

    + + + + + + + + + + + + +
    說明預設值
    寫入快取記憶體的記錄大小,位元組。(如果大小為 0,則關閉寫快取記憶體) 0
    +

    proxy.accessLog.cacheFlushInterval

    + + + + + + + + + + + + +
    說明預設值
    自動沖洗寫入快取記憶體的時間間隔,以秒為單位。(若間隔為 0 則關閉自動刷新) 3
    +

    proxy.connectionCheckIntervalSeconds

    + + + + + + + + + + + + +
    說明預設值
    連線管理員掃描非動態用戶端資訊的時間間隔 (秒) 120
    +

    proxy.connectionClientInfoTTLSeconds

    + + + + + + + + + + + + +
    說明預設值
    非作用中用戶端資訊 TTL 持續時間 (秒) 86400
    +

    proxy.maxConnectionNum

    + + + + + + + + + + + + +
    說明預設值
    代理應管理的最大用戶端資訊數,避免用戶端資訊過多 10000
    +

    proxy.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    強制停止節點而不優先停止 30
    +

    proxy.slowQuerySpanInSeconds

    + + + + + + + + + + + + +
    說明預設值
    執行時間超過 `slowQuerySpanInSeconds` 的查詢會被視為慢速,以秒為單位。 5
    +

    proxy.queryNodePooling.size

    + + + + + + + + + + + + +
    說明預設值
    shardleader (querynode) 用戶端池的大小 10
    +

    proxy.http.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 http 伺服器
    +

    proxy.http.debug_mode

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 http 伺服器除錯模式
    +

    proxy.http.port

    + + + + + + + + + + + + +
    說明預設值
    高階穩定 api
    +

    proxy.http.acceptTypeAllowInt64

    + + + + + + + + + + + + +
    說明預設值
    高階穩定 api,http 用戶端是否可以處理 int64
    +

    proxy.http.enablePprof

    + + + + + + + + + + + + +
    說明預設值
    是否在 metrics 連接埠上啟用 pprof 中介軟體 true
    +

    proxy.ip

    + + + + + + + + + + + + +
    說明預設值
    代理的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址。
    +

    proxy.port

    + + + + + + + + + + + + +
    說明預設值
    代理的 TCP 埠 19530
    +

    proxy.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    代理可傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    proxy.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    代理可接收的每個 RPC 請求的最大大小,單位:位元組 67108864
    +

    proxy.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    代理上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    proxy.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    代理用戶端可以接收的每個 RPC 請求的最大大小,單位:位元組 67108864
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.json new file mode 100644 index 000000000..a52c9b7db --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"pulsar-related Configurations","anchorList":[{"label":"pulsar 相關設定","href":"pulsar-related-Configurations","type":1,"isActive":false},{"label":"pulsar.address","href":"pulsaraddress","type":2,"isActive":false},{"label":"pulsar.port","href":"pulsarport","type":2,"isActive":false},{"label":"pulsar.webport","href":"pulsarwebport","type":2,"isActive":false},{"label":"pulsar.maxMessageSize","href":"pulsarmaxMessageSize","type":2,"isActive":false},{"label":"pulsar.tenant","href":"pulsartenant","type":2,"isActive":false},{"label":"pulsar.namespace","href":"pulsarnamespace","type":2,"isActive":false},{"label":"pulsar.requestTimeout","href":"pulsarrequestTimeout","type":2,"isActive":false},{"label":"pulsar.enableClientMetrics","href":"pulsarenableClientMetrics","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.md new file mode 100644 index 000000000..de7957b48 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_pulsar.md @@ -0,0 +1,264 @@ +--- +id: configure_pulsar.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定脈動星。 +--- +

    pulsar 相關設定

    pulsar 的相關設定,用來管理 Milvus 最近突變操作的日誌、輸出串流日誌,並提供日誌發佈-訂閱服務。

    +

    pulsar.address

    + + + + + + + + + + + + +
    說明預設值
    +
  • Pulsar 服務的 IP 位址。
  • +
  • 環境變數:PULSAR_ADDRESS
  • +
  • pulsar.address 和 pulsar.port 一起產生對 Pulsar 的有效存取。
  • +
  • 當 Milvus 啟動時,Pulsar 會優先從環境變數 PULSAR_ADDRESS 取得有效的 IP 位址。
  • +
  • 預設值適用於 Pulsar 與 Milvus 執行在同一個網路時。
  • localhost
    +

    pulsar.port

    + + + + + + + + + + + + +
    說明預設值
    Pulsar 服務的連接埠。 6650
    +

    pulsar.webport

    + + + + + + + + + + + + +
    說明預設值
    Pulsar 服務的 Web 連接埠。如果不使用代理直接連線,應使用 8080。 80
    +

    pulsar.maxMessageSize

    + + + + + + + + + + + + +
    說明預設值
    +
  • Pulsar 中每條訊息的最大大小。單位:位元組。
  • +
  • 預設情況下,Pulsar 在單一訊息中最多可傳輸 5 MB 的資料。當插入資料的大小大於此值時,proxy 會將資料分割成多個訊息,以確保能正確傳輸。
  • +
  • 如果 Pulsar 中的相應參數保持不變,增加此配置會導致 Milvus 失敗,而減少它則不會產生任何優點。
  • 5242880
    +

    pulsar.tenant

    + + + + + + + + + + + + +
    說明預設值
    +
  • Pulsar 可以為特定租戶配置,並為租戶分配適當的容量。
  • +
  • 若要在多個 Milvus 實體之間共用一個 Pulsar 實體,您可以在啟動每個 Milvus 實體之前,將此設定變更為 Pulsar 租戶,而非預設的租戶。但是,如果您不想要 Pulsar 多重租戶,建議您將 msgChannel.chanNamePrefix.cluster 變更為不同的值。
  • 公開
    +

    pulsar.namespace

    + + + + + + + + + + + + +
    說明預設值
    Pulsar 命名空間是租戶內的管理單位命名法。 預設
    +

    pulsar.requestTimeout

    + + + + + + + + + + + + +
    說明預設值
    pulsar 用戶端全局請求逾時時間 (秒) 60
    +

    pulsar.enableClientMetrics

    + + + + + + + + + + + + +
    說明預設值
    是否將 pulsar 用戶端註冊到 milvus metrics 路徑。
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.json new file mode 100644 index 000000000..357aa3c7e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryCoord-related Configurations","anchorList":[{"label":"queryCoord 相關組態","href":"queryCoord-related-Configurations","type":1,"isActive":false},{"label":"queryCoord.autoHandoff","href":"queryCoordautoHandoff","type":2,"isActive":false},{"label":"queryCoord.autoBalance","href":"queryCoordautoBalance","type":2,"isActive":false},{"label":"queryCoord.autoBalanceChannel","href":"queryCoordautoBalanceChannel","type":2,"isActive":false},{"label":"queryCoord.balancer","href":"queryCoordbalancer","type":2,"isActive":false},{"label":"queryCoord.globalRowCountFactor","href":"queryCoordglobalRowCountFactor","type":2,"isActive":false},{"label":"queryCoord.scoreUnbalanceTolerationFactor","href":"queryCoordscoreUnbalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.reverseUnBalanceTolerationFactor","href":"queryCoordreverseUnBalanceTolerationFactor","type":2,"isActive":false},{"label":"queryCoord.overloadedMemoryThresholdPercentage","href":"queryCoordoverloadedMemoryThresholdPercentage","type":2,"isActive":false},{"label":"queryCoord.balanceIntervalSeconds","href":"queryCoordbalanceIntervalSeconds","type":2,"isActive":false},{"label":"queryCoord.memoryUsageMaxDifferencePercentage","href":"queryCoordmemoryUsageMaxDifferencePercentage","type":2,"isActive":false},{"label":"queryCoord.rowCountFactor","href":"queryCoordrowCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountFactor","href":"queryCoordsegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.globalSegmentCountFactor","href":"queryCoordglobalSegmentCountFactor","type":2,"isActive":false},{"label":"queryCoord.segmentCountMaxSteps","href":"queryCoordsegmentCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.rowCountMaxSteps","href":"queryCoordrowCountMaxSteps","type":2,"isActive":false},{"label":"queryCoord.randomMaxSteps","href":"queryCoordrandomMaxSteps","type":2,"isActive":false},{"label":"queryCoord.growingRowCountWeight","href":"queryCoordgrowingRowCountWeight","type":2,"isActive":false},{"label":"queryCoord.delegatorMemoryOverloadFactor","href":"queryCoorddelegatorMemoryOverloadFactor","type":2,"isActive":false},{"label":"queryCoord.balanceCostThreshold","href":"queryCoordbalanceCostThreshold","type":2,"isActive":false},{"label":"queryCoord.channelTaskTimeout","href":"queryCoordchannelTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.segmentTaskTimeout","href":"queryCoordsegmentTaskTimeout","type":2,"isActive":false},{"label":"queryCoord.heartbeatAvailableInterval","href":"queryCoordheartbeatAvailableInterval","type":2,"isActive":false},{"label":"queryCoord.distRequestTimeout","href":"queryCoorddistRequestTimeout","type":2,"isActive":false},{"label":"queryCoord.heatbeatWarningLag","href":"queryCoordheatbeatWarningLag","type":2,"isActive":false},{"label":"queryCoord.checkHealthInterval","href":"queryCoordcheckHealthInterval","type":2,"isActive":false},{"label":"queryCoord.checkHealthRPCTimeout","href":"queryCoordcheckHealthRPCTimeout","type":2,"isActive":false},{"label":"queryCoord.brokerTimeout","href":"queryCoordbrokerTimeout","type":2,"isActive":false},{"label":"queryCoord.collectionRecoverTimes","href":"queryCoordcollectionRecoverTimes","type":2,"isActive":false},{"label":"queryCoord.observerTaskParallel","href":"queryCoordobserverTaskParallel","type":2,"isActive":false},{"label":"queryCoord.checkAutoBalanceConfigInterval","href":"queryCoordcheckAutoBalanceConfigInterval","type":2,"isActive":false},{"label":"queryCoord.checkNodeSessionInterval","href":"queryCoordcheckNodeSessionInterval","type":2,"isActive":false},{"label":"queryCoord.gracefulStopTimeout","href":"queryCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"queryCoord.enableStoppingBalance","href":"queryCoordenableStoppingBalance","type":2,"isActive":false},{"label":"queryCoord.channelExclusiveNodeFactor","href":"queryCoordchannelExclusiveNodeFactor","type":2,"isActive":false},{"label":"queryCoord.collectionObserverInterval","href":"queryCoordcollectionObserverInterval","type":2,"isActive":false},{"label":"queryCoord.checkExecutedFlagInterval","href":"queryCoordcheckExecutedFlagInterval","type":2,"isActive":false},{"label":"queryCoord.updateCollectionLoadStatusInterval","href":"queryCoordupdateCollectionLoadStatusInterval","type":2,"isActive":false},{"label":"queryCoord.cleanExcludeSegmentInterval","href":"queryCoordcleanExcludeSegmentInterval","type":2,"isActive":false},{"label":"queryCoord.ip","href":"queryCoordip","type":2,"isActive":false},{"label":"queryCoord.port","href":"queryCoordport","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxSendSize","href":"queryCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.serverMaxRecvSize","href":"queryCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxSendSize","href":"queryCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryCoord.grpc.clientMaxRecvSize","href":"queryCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.md new file mode 100644 index 000000000..0814721d2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querycoord.md @@ -0,0 +1,1300 @@ +--- +id: configure_querycoord.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 queryCoord。 +--- +

    queryCoord 相關組態

    queryCoord 的相關設定,用於管理查詢節點的拓樸和負載平衡,以及從成長中的網段移交到封閉的網段。

    +

    queryCoord.autoHandoff

    + + + + + + + + + + + + +
    說明預設值
    +
  • 切換值,用來控制在成長中的網段達到封存臨界值時,是否自動以對應的索引封存網段取代成長中的網段。
  • +
  • 如果此參數設定為 false,Milvus 只會以蠻力搜尋成長區段。
  • +

    queryCoord.autoBalance

    + + + + + + + + + + + + +
    說明預設值
    切換值,用來控制是否自動平衡查詢節點之間的記憶體使用量,平均分配區段載入和釋放操作。 true
    +

    queryCoord.autoBalanceChannel

    + + + + + + + + + + + + +
    說明預設值
    啟用自動平衡通道
    +

    queryCoord.balancer

    + + + + + + + + + + + + +
    說明預設值
    自動平衡器用於查詢節點上的區段 ScoreBased Balancer
    +

    queryCoord.globalRowCountFactor

    + + + + + + + + + + + + +
    說明預設值
    在查詢節點間平衡分段時使用的權重 0.1
    +

    queryCoord.scoreUnbalanceTolerationFactor

    + + + + + + + + + + + + +
    說明預設值
    進行平衡時,from 節點和 to 節點間不平衡範圍的最小值 0.05
    +

    queryCoord.reverseUnBalanceTolerationFactor

    + + + + + + + + + + + + +
    說明預設值
    進行平衡後,從節點到節點間不平衡範圍的最大值 1.3
    +

    queryCoord.overloadedMemoryThresholdPercentage

    + + + + + + + + + + + + +
    說明預設值
    查詢節點中啟動封鎖區段平衡的記憶體使用量臨界值 (百分比)。 90
    +

    queryCoord.balanceIntervalSeconds

    + + + + + + + + + + + + +
    說明預設值
    查詢協調平衡查詢節點間記憶體使用量的間隔。 60
    +

    queryCoord.memoryUsageMaxDifferencePercentage

    + + + + + + + + + + + + +
    說明預設值
    任何兩個查詢節點之間的記憶體使用量差異臨界值 (百分比),以觸發封存區段平衡。 30
    +

    queryCoord.rowCountFactor

    + + + + + + + + + + + + +
    說明預設值
    在查詢節點間平衡區段時使用的行數權重 0.4
    +

    queryCoord.segmentCountFactor

    + + + + + + + + + + + + +
    說明預設值
    平衡查詢節點間的區段時使用的區段計數權重 0.4
    +

    queryCoord.globalSegmentCountFactor

    + + + + + + + + + + + + +
    說明預設值
    平衡查詢節點間的分段時使用的分段計數權重 0.1
    +

    queryCoord.segmentCountMaxSteps

    + + + + + + + + + + + + +
    說明預設值
    以區段計數為基礎的計劃產生器最大步數 50
    +

    queryCoord.rowCountMaxSteps

    + + + + + + + + + + + + +
    說明預設值
    基於區段計數的計劃產生器最大步數 50
    +

    queryCoord.randomMaxSteps

    + + + + + + + + + + + + +
    說明預設值
    基於區段計數的計劃產生器最大步數 10
    +

    queryCoord.growingRowCountWeight

    + + + + + + + + + + + + +
    說明預設值
    成長區段行數的記憶體權重 4
    +

    queryCoord.delegatorMemoryOverloadFactor

    + + + + + + + + + + + + +
    說明預設值
    委託人超載記憶體的因子 0.1
    +

    queryCoord.balanceCostThreshold

    + + + + + + + + + + + + +
    說明預設值
    平衡成本的臨界值,如果執行平衡計劃後群集的成本差異小於此值,則不會執行該計劃 0.001
    +

    queryCoord.channelTaskTimeout

    + + + + + + + + + + + + +
    說明預設值
    1 分鐘 60000
    +

    queryCoord.segmentTaskTimeout

    + + + + + + + + + + + + +
    說明預設值
    2 分鐘 120000
    +

    queryCoord.heartbeatAvailableInterval

    + + + + + + + + + + + + +
    說明預設值
    10s, 只有在這段時間內取得心跳的查詢節點可用 10000
    +

    queryCoord.distRequestTimeout

    + + + + + + + + + + + + +
    說明預設值
    querycoord 從 querynodes 取得資料分佈的請求超時,以毫秒為單位 5000
    +

    queryCoord.heatbeatWarningLag

    + + + + + + + + + + + + +
    說明預設值
    當上一次熱拍過久時,querycoord 報告警告的滯後值,以毫秒為單位 5000
    +

    queryCoord.checkHealthInterval

    + + + + + + + + + + + + +
    說明預設值
    3 秒,查詢協定嘗試檢查查詢節點健康狀況的時間間隔。 3000
    +

    queryCoord.checkHealthRPCTimeout

    + + + + + + + + + + + + +
    說明預設值
    100ms,查詢節點檢查健康 rpc 的超時時間。 2000
    +

    queryCoord.brokerTimeout

    + + + + + + + + + + + + +
    說明預設值
    5000ms, querycoord 代理商 rpc 超時 5000
    +

    queryCoord.collectionRecoverTimes

    + + + + + + + + + + + + +
    說明預設值
    如果在載入狀態中,收集恢復時間達到限制,釋放它 3
    +

    queryCoord.observerTaskParallel

    + + + + + + + + + + + + +
    說明預設值
    並行觀察者派遣器的任務編號 16
    +

    queryCoord.checkAutoBalanceConfigInterval

    + + + + + + + + + + + + +
    說明預設值
    檢查自動平衡設定的間隔 10
    +

    queryCoord.checkNodeSessionInterval

    + + + + + + + + + + + + +
    說明預設值
    檢查 querynode 群集階段的間隔 (秒) 60
    +

    queryCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    強制停止節點而不優先停止 5
    +

    queryCoord.enableStoppingBalance

    + + + + + + + + + + + + +
    說明預設值
    是否啟用停止平衡
    +

    queryCoord.channelExclusiveNodeFactor

    + + + + + + + + + + + + +
    說明預設值
    啟用通道專用模式的最小節點數 4
    +

    queryCoord.collectionObserverInterval

    + + + + + + + + + + + + +
    說明預設值
    收集觀察者的間隔 200
    +

    queryCoord.checkExecutedFlagInterval

    + + + + + + + + + + + + +
    說明預設值
    檢查執行旗號的間隔,以強制拉取區域 100
    +

    queryCoord.updateCollectionLoadStatusInterval

    + + + + + + + + + + + + +
    說明預設值
    5m,更新收集載入狀態的最大間隔 5
    +

    queryCoord.cleanExcludeSegmentInterval

    + + + + + + + + + + + + +
    說明預設值
    用於過濾無效資料的清除管道排除區段的時間長度,以秒為單位 60
    +

    queryCoord.ip

    + + + + + + + + + + + + +
    說明預設值
    queryCoord 的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址。
    +

    queryCoord.port

    + + + + + + + + + + + + +
    說明預設值
    查詢記錄的 TCP 連接埠 19531
    +

    queryCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    queryCoord 可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    queryCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    queryCoord 可以接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    queryCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    queryCoord 上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    queryCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    queryCoord 上的用戶端可以接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.json new file mode 100644 index 000000000..b8554f167 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"queryNode-related Configurations","anchorList":[{"label":"queryNode 相關組態","href":"queryNode-related-Configurations","type":1,"isActive":false},{"label":"queryNode.stats.publishInterval","href":"queryNodestatspublishInterval","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereThreadPoolNumRatio","href":"queryNodesegcoreknowhereThreadPoolNumRatio","type":2,"isActive":false},{"label":"queryNode.segcore.chunkRows","href":"queryNodesegcorechunkRows","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.enableIndex","href":"queryNodesegcoreinterimIndexenableIndex","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nlist","href":"queryNodesegcoreinterimIndexnlist","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.nprobe","href":"queryNodesegcoreinterimIndexnprobe","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.memExpansionRate","href":"queryNodesegcoreinterimIndexmemExpansionRate","type":2,"isActive":false},{"label":"queryNode.segcore.interimIndex.buildParallelRate","href":"queryNodesegcoreinterimIndexbuildParallelRate","type":2,"isActive":false},{"label":"queryNode.segcore.knowhereScoreConsistency","href":"queryNodesegcoreknowhereScoreConsistency","type":2,"isActive":false},{"label":"queryNode.loadMemoryUsageFactor","href":"queryNodeloadMemoryUsageFactor","type":2,"isActive":false},{"label":"queryNode.enableDisk","href":"queryNodeenableDisk","type":2,"isActive":false},{"label":"queryNode.cache.memoryLimit","href":"queryNodecachememoryLimit","type":2,"isActive":false},{"label":"queryNode.cache.readAheadPolicy","href":"queryNodecachereadAheadPolicy","type":2,"isActive":false},{"label":"queryNode.cache.warmup","href":"queryNodecachewarmup","type":2,"isActive":false},{"label":"queryNode.mmap.mmapEnabled","href":"queryNodemmapmmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.growingMmapEnabled","href":"queryNodemmapgrowingMmapEnabled","type":2,"isActive":false},{"label":"queryNode.mmap.fixedFileSizeForMmapAlloc","href":"queryNodemmapfixedFileSizeForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.mmap.maxDiskUsagePercentageForMmapAlloc","href":"queryNodemmapmaxDiskUsagePercentageForMmapAlloc","type":2,"isActive":false},{"label":"queryNode.lazyload.enabled","href":"queryNodelazyloadenabled","type":2,"isActive":false},{"label":"queryNode.lazyload.waitTimeout","href":"queryNodelazyloadwaitTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceTimeout","href":"queryNodelazyloadrequestResourceTimeout","type":2,"isActive":false},{"label":"queryNode.lazyload.requestResourceRetryInterval","href":"queryNodelazyloadrequestResourceRetryInterval","type":2,"isActive":false},{"label":"queryNode.lazyload.maxRetryTimes","href":"queryNodelazyloadmaxRetryTimes","type":2,"isActive":false},{"label":"queryNode.lazyload.maxEvictPerRetry","href":"queryNodelazyloadmaxEvictPerRetry","type":2,"isActive":false},{"label":"queryNode.scheduler.maxReadConcurrentRatio","href":"queryNodeschedulermaxReadConcurrentRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.cpuRatio","href":"queryNodeschedulercpuRatio","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.name","href":"queryNodeschedulerscheduleReadPolicyname","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.taskQueueExpire","href":"queryNodeschedulerscheduleReadPolicytaskQueueExpire","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping","href":"queryNodeschedulerscheduleReadPolicyenableCrossUserGrouping","type":2,"isActive":false},{"label":"queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser","href":"queryNodeschedulerscheduleReadPolicymaxPendingTaskPerUser","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxQueueLength","href":"queryNodedataSyncflowGraphmaxQueueLength","type":2,"isActive":false},{"label":"queryNode.dataSync.flowGraph.maxParallelism","href":"queryNodedataSyncflowGraphmaxParallelism","type":2,"isActive":false},{"label":"queryNode.enableSegmentPrune","href":"queryNodeenableSegmentPrune","type":2,"isActive":false},{"label":"queryNode.bloomFilterApplyParallelFactor","href":"queryNodebloomFilterApplyParallelFactor","type":2,"isActive":false},{"label":"queryNode.queryStreamBatchSize","href":"queryNodequeryStreamBatchSize","type":2,"isActive":false},{"label":"queryNode.workerPooling.size","href":"queryNodeworkerPoolingsize","type":2,"isActive":false},{"label":"queryNode.ip","href":"queryNodeip","type":2,"isActive":false},{"label":"queryNode.port","href":"queryNodeport","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxSendSize","href":"queryNodegrpcserverMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.serverMaxRecvSize","href":"queryNodegrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxSendSize","href":"queryNodegrpcclientMaxSendSize","type":2,"isActive":false},{"label":"queryNode.grpc.clientMaxRecvSize","href":"queryNodegrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.md new file mode 100644 index 000000000..99342b5e9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_querynode.md @@ -0,0 +1,1261 @@ +--- +id: configure_querynode.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 設定 queryNode。 +--- +

    queryNode 相關組態

    queryNode 的相關設定,用於執行向量與標量資料之間的混合搜尋。

    +

    queryNode.stats.publishInterval

    + + + + + + + + + + + + +
    說明預設值
    查詢節點公佈節點統計資訊的間隔,包括區段狀態、cpu 使用量、記憶體使用量、健康狀態等。單位:毫秒。 1000
    +

    queryNode.segcore.knowhereThreadPoolNumRatio

    + + + + + + + + + + + + +
    說明預設值
    knowhere線程池中的線程數。如果啟用磁碟,線程池數目會乘以knowhereThreadPoolNumRatio([1, 32])。 4
    +

    queryNode.segcore.chunkRows

    + + + + + + + + + + + + +
    說明預設值
    Segcore 將區段分割成小塊的行數。 128
    +

    queryNode.segcore.interimIndex.enableIndex

    + + + + + + + + + + + + +
    說明預設值
    +
  • 是否為成長中的區段和尚未建立索引的封存區段建立臨時索引,以改善搜尋效能。
  • +
  • Milvus 最終會封存所有區段並編製索引,但啟用此功能可優化資料插入後立即查詢的搜尋效能。
  • +
  • 預設為 true,表示 Milvus 會為成長中的區段和搜尋時尚未建立索引的封存區段建立暫存索引。
  • +

    queryNode.segcore.interimIndex.nlist

    + + + + + + + + + + + + +
    說明預設值
    臨時索引 nlist,建議設定 sqrt(chunkRows),必須小於 chunkRows/8 128
    +

    queryNode.segcore.interimIndex.nprobe

    + + + + + + + + + + + + +
    說明預設值
    nprobe 搜尋小索引,根據您的精確度要求,必須小於 nlist 16
    +

    queryNode.segcore.interimIndex.memExpansionRate

    + + + + + + + + + + + + +
    說明預設值
    建立臨時索引所需的額外記憶體 1.15
    +

    queryNode.segcore.interimIndex.buildParallelRate

    + + + + + + + + + + + + +
    說明預設值
    建立臨時索引與 CPU 數量並行匹配的比率 0.5
    +

    queryNode.segcore.knowhereScoreConsistency

    + + + + + + + + + + + + +
    說明預設值
    啟用 knowhere 強一致性分數計算邏輯
    +

    queryNode.loadMemoryUsageFactor

    + + + + + + + + + + + + +
    說明預設值
    計算載入區段時記憶體使用量的乘數因子 1
    +

    queryNode.enableDisk

    + + + + + + + + + + + + +
    說明預設值
    啟用 querynode 載入磁碟索引,並在磁碟索引上搜尋
    +

    queryNode.cache.memoryLimit

    + + + + + + + + + + + + +
    說明預設值
    2 GB、2 * 1024 *1024 *1024 2147483648
    +

    queryNode.cache.readAheadPolicy

    + + + + + + + + + + + + +
    說明預設值
    chunk cache 的讀取超前原則,選項:normal、random、sequential、willneed、dontneed 需要
    +

    queryNode.cache.warmup

    + + + + + + + + + + + + +
    說明預設值
    +
  • 選項:async、sync、disable。
  • +
  • 指定預熱 chunk 快取記憶體的必要性。
  • +
  • 1.如果設定為 "sync 「或 」async",原始向量資料會在載入過程中同步/非同步載入到
  • +
  • 在載入過程中,原始向量資料會同步/非同步載入到 chunk 快取記憶體中。此方法有可能大幅降低查詢/搜尋延遲。
  • +
  • 在載入後的特定時間內的查詢/搜尋延遲,但同時也會增加磁碟使用量;
  • +
  • 2.如果設定為「停用」,原始向量資料只會在搜尋/查詢期間載入到快取記憶體。
  • 停用
    +

    queryNode.mmap.mmapEnabled

    + + + + + + + + + + + + +
    說明預設值
    啟用 mmap 載入資料
    +

    queryNode.mmap.growingMmapEnabled

    + + + + + + + + + + + + +
    說明預設值
    啟用 mmap 用於成長原始資料
    +

    queryNode.mmap.fixedFileSizeForMmapAlloc

    + + + + + + + + + + + + +
    說明預設值
    mmap chunk manager 的 tmp 檔大小 1
    +

    queryNode.mmap.maxDiskUsagePercentageForMmapAlloc

    + + + + + + + + + + + + +
    說明預設值
    mmap chunk manager 使用的磁碟百分比 50
    +

    queryNode.lazyload.enabled

    + + + + + + + + + + + + +
    說明預設值
    啟用 lazyload 載入資料
    +

    queryNode.lazyload.waitTimeout

    + + + + + + + + + + + + +
    說明預設值
    開始執行 lazyload 搜尋與擷取之前的最大等待逾時長度 (毫秒) 30000
    +

    queryNode.lazyload.requestResourceTimeout

    + + + + + + + + + + + + +
    說明預設值
    等待懶惰載入請求資源的最大超時時間(以毫秒為單位),預設為 5 秒 5000
    +

    queryNode.lazyload.requestResourceRetryInterval

    + + + + + + + + + + + + +
    說明預設值
    等待延遲載入請求資源的重試間隔 (毫秒),預設為 2 秒 2000
    +

    queryNode.lazyload.maxRetryTimes

    + + + + + + + + + + + + +
    說明預設值
    懶惰載入的最大重試次數,預設為 1 1
    +

    queryNode.lazyload.maxEvictPerRetry

    + + + + + + + + + + + + +
    說明預設值
    偷懶載入的最大驅逐次數,預設為 1 1
    +

    queryNode.scheduler.maxReadConcurrentRatio

    + + + + + + + + + + + + +
    說明預設值
    +
  • maxReadConcurrentRatio 是讀取任務 (搜尋任務和查詢任務) 的併發比率。
  • +
  • 最大讀取並發率是 hardware.GetCPUNum * maxReadConcurrentRatio 的值。
  • +
  • 預設值為 2.0,這表示最大讀取並發度是 hardware.GetCPUNum * 2 的值。
  • +
  • 最大讀取並發度必須大於或等於 1,且小於或等於 hardware.GetCPUNum * 100。
  • +
  • (0, 100]
  • 1
    +

    queryNode.scheduler.cpuRatio

    + + + + + + + + + + + + +
    說明預設值
    用來估計讀取任務 CPU 使用量的比率。 10
    +

    queryNode.scheduler.scheduleReadPolicy.name

    + + + + + + + + + + + + +
    說明預設值
    +
  • fifo:支援排程的 FIFO 佇列。
  • +
  • user-task-polling:使用者任務輪詢:
  • +
  • 使用者的任務會逐一輪詢並排程。
  • +
  • 排程對任務粒度是公平的。
  • +
  • 政策基於用戶名進行驗證。
  • +
  • 而空的使用者名稱會被視為同一使用者。
  • +
  • 當沒有多使用者時,政策會衰減為 FIFO"
  • 先進先出
    +

    queryNode.scheduler.scheduleReadPolicy.taskQueueExpire

    + + + + + + + + + + + + +
    說明預設值
    控制佇列為空後會保留多久 (多少秒) 60
    +

    queryNode.scheduler.scheduleReadPolicy.enableCrossUserGrouping

    + + + + + + + + + + + + +
    說明預設值
    使用 user-task-polling 策略時,啟用交叉使用者群組。(如果使用者的任務不能彼此合併,請停用)
    +

    queryNode.scheduler.scheduleReadPolicy.maxPendingTaskPerUser

    + + + + + + + + + + + + +
    說明預設值
    排程器中每個使用者的最大待處理工作 1024
    +

    queryNode.dataSync.flowGraph.maxQueueLength

    + + + + + + + + + + + + +
    說明預設值
    查詢節點的流程圖中,任務佇列快取記憶體的最大大小。 16
    +

    queryNode.dataSync.flowGraph.maxParallelism

    + + + + + + + + + + + + +
    說明預設值
    流程圖中並行執行的最大任務數 1024
    +

    queryNode.enableSegmentPrune

    + + + + + + + + + + + + +
    說明預設值
    在分區委託人的搜尋/查詢中,使用分區統計資料修剪資料
    +

    queryNode.bloomFilterApplyParallelFactor

    + + + + + + + + + + + + +
    說明預設值
    將 pk 應用於 bloom filter 時的平行因子,預設為 4*CPU_CORE_NUM 4
    +

    queryNode.queryStreamBatchSize

    + + + + + + + + + + + + +
    說明預設值
    回傳串流查詢的批次大小 4194304
    +

    queryNode.workerPooling.size

    + + + + + + + + + + + + +
    說明預設值
    Worker querynode 客戶池的大小 10
    +

    queryNode.ip

    + + + + + + + + + + + + +
    說明預設值
    查詢節點的 TCP/IP 位址。若未指定,則使用第一個可單點傳送的位址。
    +

    queryNode.port

    + + + + + + + + + + + + +
    說明預設值
    查詢節點的 TCP 埠 21123
    +

    queryNode.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    查詢節點可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    queryNode.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    查詢節點可接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    queryNode.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    查詢節點上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    queryNode.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    查詢節點用戶端可接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.json new file mode 100644 index 000000000..95d56db44 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"quotaAndLimits-related Configurations","anchorList":[{"label":"配額和限制相關配置","href":"quotaAndLimits-related-Configurations","type":1,"isActive":false},{"label":"quotaAndLimits.enabled","href":"quotaAndLimitsenabled","type":2,"isActive":false},{"label":"quotaAndLimits.quotaCenterCollectInterval","href":"quotaAndLimitsquotaCenterCollectInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocRetryTimes","href":"quotaAndLimitslimitsallocRetryTimes","type":2,"isActive":false},{"label":"quotaAndLimits.limits.allocWaitInterval","href":"quotaAndLimitslimitsallocWaitInterval","type":2,"isActive":false},{"label":"quotaAndLimits.limits.complexDeleteLimitEnable","href":"quotaAndLimitslimitscomplexDeleteLimitEnable","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxCollectionNumPerDB","href":"quotaAndLimitslimitsmaxCollectionNumPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxInsertSize","href":"quotaAndLimitslimitsmaxInsertSize","type":2,"isActive":false},{"label":"quotaAndLimits.limits.maxResourceGroupNumOfQueryNode","href":"quotaAndLimitslimitsmaxResourceGroupNumOfQueryNode","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.enabled","href":"quotaAndLimitsddlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.collectionRate","href":"quotaAndLimitsddlcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.partitionRate","href":"quotaAndLimitsddlpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.collectionRate","href":"quotaAndLimitsddldbcollectionRate","type":2,"isActive":false},{"label":"quotaAndLimits.ddl.db.partitionRate","href":"quotaAndLimitsddldbpartitionRate","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.enabled","href":"quotaAndLimitsindexRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.max","href":"quotaAndLimitsindexRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.indexRate.db.max","href":"quotaAndLimitsindexRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.enabled","href":"quotaAndLimitsflushRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.max","href":"quotaAndLimitsflushRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.collection.max","href":"quotaAndLimitsflushRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.flushRate.db.max","href":"quotaAndLimitsflushRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.enabled","href":"quotaAndLimitscompactionRateenabled","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.max","href":"quotaAndLimitscompactionRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.compactionRate.db.max","href":"quotaAndLimitscompactionRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.enabled","href":"quotaAndLimitsdmlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.max","href":"quotaAndLimitsdmlinsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.db.max","href":"quotaAndLimitsdmlinsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.collection.max","href":"quotaAndLimitsdmlinsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.insertRate.partition.max","href":"quotaAndLimitsdmlinsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.max","href":"quotaAndLimitsdmlupsertRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.db.max","href":"quotaAndLimitsdmlupsertRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.collection.max","href":"quotaAndLimitsdmlupsertRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.upsertRate.partition.max","href":"quotaAndLimitsdmlupsertRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.max","href":"quotaAndLimitsdmldeleteRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.db.max","href":"quotaAndLimitsdmldeleteRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.collection.max","href":"quotaAndLimitsdmldeleteRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.deleteRate.partition.max","href":"quotaAndLimitsdmldeleteRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.max","href":"quotaAndLimitsdmlbulkLoadRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.db.max","href":"quotaAndLimitsdmlbulkLoadRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.collection.max","href":"quotaAndLimitsdmlbulkLoadRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dml.bulkLoadRate.partition.max","href":"quotaAndLimitsdmlbulkLoadRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.enabled","href":"quotaAndLimitsdqlenabled","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.max","href":"quotaAndLimitsdqlsearchRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.db.max","href":"quotaAndLimitsdqlsearchRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.collection.max","href":"quotaAndLimitsdqlsearchRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.searchRate.partition.max","href":"quotaAndLimitsdqlsearchRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.max","href":"quotaAndLimitsdqlqueryRatemax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.db.max","href":"quotaAndLimitsdqlqueryRatedbmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.collection.max","href":"quotaAndLimitsdqlqueryRatecollectionmax","type":2,"isActive":false},{"label":"quotaAndLimits.dql.queryRate.partition.max","href":"quotaAndLimitsdqlqueryRatepartitionmax","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.forceDeny","href":"quotaAndLimitslimitWritingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay","href":"quotaAndLimitslimitWritingttProtectionmaxTimeTickDelay","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.enabled","href":"quotaAndLimitslimitWritingmemProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectiondataNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryLowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel","href":"quotaAndLimitslimitWritingmemProtectionqueryNodeMemoryHighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled","href":"quotaAndLimitslimitWritinggrowingSegmentsSizeProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.enabled","href":"quotaAndLimitslimitWritingdiskProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuota","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuota","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerDB","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerCollection","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition","href":"quotaAndLimitslimitWritingdiskProtectiondiskQuotaPerPartition","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionenabled","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionlowWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel","href":"quotaAndLimitslimitWritingl0SegmentsRowCountProtectionhighWaterLevel","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.forceDeny","href":"quotaAndLimitslimitReadingforceDeny","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold","href":"quotaAndLimitslimitReadingqueueProtectionnqInQueueThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold","href":"quotaAndLimitslimitReadingqueueProtectionqueueLatencyThreshold","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.resultProtection.maxReadResultRate","href":"quotaAndLimitslimitReadingresultProtectionmaxReadResultRate","type":2,"isActive":false},{"label":"quotaAndLimits.limitReading.coolOffSpeed","href":"quotaAndLimitslimitReadingcoolOffSpeed","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.md new file mode 100644 index 000000000..58dc4d965 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_quotaandlimits.md @@ -0,0 +1,2137 @@ +--- +id: configure_quotaandlimits.md +related_key: configure +group: system_configuration.md +summary: 瞭解如何為 Milvus 設定 quotaAndLimits。 +--- +

    配額和限制相關配置

    QuotaConfig, Milvus 配額和限制的設定。

    +

    預設啟用

    +
      +
    1. TT 保護;

    2. +
    3. 記憶體保護。

    4. +
    5. 磁碟配額保護。

    6. +
    +

    您可以啟用

    +
      +
    1. DML 吞吐量限制;

    2. +
    3. DDL, DQL qps/rps 限制;

    4. +
    5. DQL 佇列長度/延遲保護;

    6. +
    7. DQL 結果率保護;

    8. +
    +

    必要時,您也可以手動強制拒絕 RW 請求。

    +

    quotaAndLimits.enabled

    + + + + + + + + + + + + +
    說明預設值
    `true` 表示啟用配額和限制,`false` 表示停用。
    +

    quotaAndLimits.quotaCenterCollectInterval

    + + + + + + + + + + + + +
    說明預設值
    +
  • quotaCenterCollectInterval 是 quotaCenter 從代理、查詢群集和資料群集收集度量的時間間隔。
  • +
  • 從代理、查詢群集和資料群集收集度量資訊的時間間隔。
  • +
  • 秒,(0 ~ 65536)
  • 3
    +

    quotaAndLimits.limits.allocRetryTimes

    + + + + + + + + + + + + +
    說明預設值
    從速率限制刪除分配轉送資料失敗時的重試次數 15
    +

    quotaAndLimits.limits.allocWaitInterval

    + + + + + + + + + + + + +
    說明預設值
    刪除速率限制中的分配轉送資料失敗時的重試等待時間,以毫秒為單位 1000
    +

    quotaAndLimits.limits.complexDeleteLimitEnable

    + + + + + + + + + + + + +
    說明預設值
    是否使用限制器複合刪除檢查前向資料
    +

    quotaAndLimits.limits.maxCollectionNumPerDB

    + + + + + + + + + + + + +
    說明預設值
    每個資料庫的最大集合數。 65536
    +

    quotaAndLimits.limits.maxInsertSize

    + + + + + + + + + + + + +
    說明預設值
    單次插入請求的最大大小,以位元組表示,-1 表示無限制 -1
    +

    quotaAndLimits.limits.maxResourceGroupNumOfQueryNode

    + + + + + + + + + + + + +
    說明預設值
    查詢節點資源群組的最大數目 1024
    +

    quotaAndLimits.ddl.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 DDL 請求節流。
    +

    quotaAndLimits.ddl.collectionRate

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒處理集合相關 DDL 請求的最大數目。
  • +
  • 將此項目設定為 10 表示 Milvus 每秒處理不超過 10 個與集合相關的 DDL 請求,包括集合建立請求、集合刪除請求、集合載入請求,以及集合釋放請求。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.ddl.enabled 為 true。
  • -1
    +

    quotaAndLimits.ddl.partitionRate

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒與分割區相關的 DDL 請求的最大數目。
  • +
  • 將此項目設定為 10 表示 Milvus 每秒處理的分割區相關請求不超過 10 個,包括分割區建立請求、分割區移除請求、分割區載入請求及分割區釋放請求。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.ddl.enabled 為 true。
  • -1
    +

    quotaAndLimits.ddl.db.collectionRate

    + + + + + + + + + + + + +
    說明預設值
    db 層級的 qps,預設無限制,用於 CreateCollection、DropCollection、LoadCollection、ReleaseCollection 的速率 -1
    +

    quotaAndLimits.ddl.db.partitionRate

    + + + + + + + + + + + + +
    說明預設值
    db 層級的 qps,預設無限制,CreatePartition、DropPartition、LoadPartition、ReleasePartition 的速率 -1
    +

    quotaAndLimits.indexRate.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用索引相關請求節流。
    +

    quotaAndLimits.indexRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒與索引相關的最大請求數。
  • +
  • 將此項目設定為 10 表示 Milvus 每秒處理不超過 10 個分割區相關的請求,包括索引建立請求和索引刪除請求。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.indexRate.enabled 為 true。
  • -1
    +

    quotaAndLimits.indexRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    db 層級的 qps,預設無限制,CreateIndex、DropIndex 的速率 -1
    +

    quotaAndLimits.flushRate.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用刷新請求節流。
    +

    quotaAndLimits.flushRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒刷新請求的最大數目。
  • +
  • 將此項目設定為 10 表示 Milvus 每秒處理的刷新請求不超過 10 個。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.flushRate.enabled 為 true。
  • -1
    +

    quotaAndLimits.flushRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    qps,預設無限制,在集合層級的刷新率。 0.1
    +

    quotaAndLimits.flushRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    db 層級的 qps,預設無限制,用於沖洗的速率 -1
    +

    quotaAndLimits.compactionRate.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用手動壓縮請求節流。
    +

    quotaAndLimits.compactionRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒手動壓縮請求的最大數目。
  • +
  • 將此項目設定為 10 表示 Milvus 每秒處理的手動壓縮請求不超過 10 個。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.compaction.enabled 為 true。
  • -1
    +

    quotaAndLimits.compactionRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    db 層級的 qps,預設無限制,手動壓縮的速率 -1
    +

    quotaAndLimits.dml.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 DML 請求節流。
    +

    quotaAndLimits.dml.insertRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒最高資料插入速率。
  • +
  • 將此項目設定為 5 表示 Milvus 只允許以每秒 5 MB 的速率插入資料。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dml.enabled 為 true。
  • -1
    +

    quotaAndLimits.dml.insertRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制 -1
    +

    quotaAndLimits.dml.insertRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒每個資料集的最高資料插入速率。
  • +
  • 將此項目設定為 5 表示 Milvus 只允許以每秒 5 MB 的速率插入資料到任何資料集中。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dml.enabled 為 true。
  • -1
    +

    quotaAndLimits.dml.insertRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制 -1
    +

    quotaAndLimits.dml.upsertRate.max

    + + + + + + + + + + + + +
    說明預設值
    MB/秒,預設無限制 -1
    +

    quotaAndLimits.dml.upsertRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    MB/秒,預設無限制 -1
    +

    quotaAndLimits.dml.upsertRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    MB/秒,預設無限制 -1
    +

    quotaAndLimits.dml.upsertRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    MB/秒,預設無限制 -1
    +

    quotaAndLimits.dml.deleteRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒最高資料刪除速率。
  • +
  • 將此項目設定為 0.1 表示 Milvus 只允許以每秒 0.1 MB 的速率刪除資料。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dml.enabled 為 true。
  • -1
    +

    quotaAndLimits.dml.deleteRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制 -1
    +

    quotaAndLimits.dml.deleteRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒最高資料刪除速率。
  • +
  • 將此項目設定為 0.1 表示 Milvus 只允許從任何資料集中以每秒 0.1 MB 的速率刪除資料。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dml.enabled 為 true。
  • -1
    +

    quotaAndLimits.dml.deleteRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制 -1
    +

    quotaAndLimits.dml.bulkLoadRate.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s,預設無限制,尚未支援。TODO: 限制 bulkLoad 速率 -1
    +

    quotaAndLimits.dml.bulkLoadRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制,尚未支援。TODO: limit db bulkLoad rate -1
    +

    quotaAndLimits.dml.bulkLoadRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制,尚未支援。TODO: 限制 collection bulkLoad rate -1
    +

    quotaAndLimits.dml.bulkLoadRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    MB/s, 預設無限制,尚未支援。TODO: 限制分割區的大量載入速率 -1
    +

    quotaAndLimits.dql.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否啟用 DQL 請求節流。
    +

    quotaAndLimits.dql.searchRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒搜尋向量的最大數量。
  • +
  • 將此項目設定為 100 表示 Milvus 每秒只允許搜尋 100 個向量,不論這 100 個向量是全部在一次搜尋中,或是分散在多次搜尋中。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dql.enabled 為 true。
  • -1
    +

    quotaAndLimits.dql.searchRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    vps(每秒向量數量),預設無限制 -1
    +

    quotaAndLimits.dql.searchRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒每個集合搜尋的向量數量上限。
  • +
  • 將此項目設定為 100 表示 Milvus 每秒只允許每個集合搜尋 100 個向量,不論這 100 個向量是全部在一次搜尋中,或是分散在多次搜尋中。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dql.enabled 為 true。
  • -1
    +

    quotaAndLimits.dql.searchRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    vps(每秒向量數量),預設無限制 -1
    +

    quotaAndLimits.dql.queryRate.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒最大查詢次數。
  • +
  • 將此項目設定為 100 表示 Milvus 每秒只允許 100 次查詢。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dql.enabled 為 true。
  • -1
    +

    quotaAndLimits.dql.queryRate.db.max

    + + + + + + + + + + + + +
    說明預設值
    qps,預設無限制 -1
    +

    quotaAndLimits.dql.queryRate.collection.max

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每秒每個集合的最大查詢次數。
  • +
  • 將此項目設定為 100 表示 Milvus 每秒只允許針對每個集合進行 100 次查詢。
  • +
  • 若要使用此設定,請同時設定 quotaAndLimits.dql.enabled 為 true。
  • -1
    +

    quotaAndLimits.dql.queryRate.partition.max

    + + + + + + + + + + + + +
    說明預設值
    qps,預設無限制 -1
    +

    quotaAndLimits.limitWriting.forceDeny

    + + + + + + + + + + + + +
    說明預設值
    +
  • forceDeny false 表示允許 dml 請求 (除了某些特定情況,例如記憶體節點到水標記)
  • +
  • 特定條件,例如記憶體節點到水標記),true 表示永遠拒絕所有 dml 請求。
  • false
    +

    quotaAndLimits.limitWriting.ttProtection.maxTimeTickDelay

    + + + + + + + + + + + + +
    說明預設值
    +
  • maxTimeTickDelay 表示 DML 作業的背壓。
  • +
  • DML 速率會根據 time tick delay 與 maxTimeTickDelay 的比率降低、
  • +
  • 如果 time tick delay 大於 maxTimeTickDelay,所有 DML 請求都會被拒絕。
  • +
  • 300
    +

    quotaAndLimits.limitWriting.memProtection.enabled

    + + + + + + + + + + + + +
    說明預設值
    +
  • 當記憶體使用量 > memoryHighWaterLevel 時,所有 DML 請求都會被拒絕;
  • +
  • 當 memoryLowWaterLevel < 記憶體使用量 < memoryHighWaterLevel 時,降低 dml 速率;
  • +
  • 當記憶體使用量 < memoryLowWaterLevel 時,不採取任何動作。
  • +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    (0,1],資料節點中的 memoryLowWaterLevel 0.85
    +

    quotaAndLimits.limitWriting.memProtection.dataNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    (0,1]、數據節點中的記憶體高水位值 0.95
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryLowWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    (0,1],查詢節點中的記憶體低水準 0.85
    +

    quotaAndLimits.limitWriting.memProtection.queryNodeMemoryHighWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    (0,1]、查詢節點中的記憶體高水位值 0.95
    +

    quotaAndLimits.limitWriting.growingSegmentsSizeProtection.enabled

    + + + + + + + + + + + + +
    說明預設值
    +
  • 如果成長中的區段大小小於低水準,則不會採取任何動作。
  • +
  • 如果成長中的區段大小超過低水準,dml 的速率會降低、
  • +
  • 但速率不會低於 minRateRatio * dmlRate。
  • +

    quotaAndLimits.limitWriting.diskProtection.enabled

    + + + + + + + + + + + + +
    說明預設值
    當物件儲存的檔案總大小大於 `diskQuota` 時,所有的 dml 請求都會被拒絕;
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuota

    + + + + + + + + + + + + +
    說明預設值
    MB,(0, +inf),預設無限制 -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerDB

    + + + + + + + + + + + + +
    說明預設值
    MB,(0,+inf),預設無限制 -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerCollection

    + + + + + + + + + + + + +
    說明預設值
    MB,(0,+inf),預設無限制 -1
    +

    quotaAndLimits.limitWriting.diskProtection.diskQuotaPerPartition

    + + + + + + + + + + + + +
    說明預設值
    MB,(0,+inf),預設無限制 -1
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.enabled

    + + + + + + + + + + + + +
    說明預設值
    切換啟用 l0 區段行數配額
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.lowWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    l0 區段行數配額,低水位 32768
    +

    quotaAndLimits.limitWriting.l0SegmentsRowCountProtection.highWaterLevel

    + + + + + + + + + + + + +
    說明預設值
    l0 區段行數配額,低水位 65536
    +

    quotaAndLimits.limitReading.forceDeny

    + + + + + + + + + + + + +
    說明預設值
    +
  • forceDeny false 表示允許 dql 請求 (除了某些特定情況,例如收集已被丟棄),true 表示永遠拒絕所有 dql 請求。
  • +
  • true表示永遠拒絕所有 dql 請求。
  • false
    +

    quotaAndLimits.limitReading.queueProtection.nqInQueueThreshold

    + + + + + + + + + + + + +
    說明預設值
    +
  • nqInQueueThreshold 表示系統受到 Search/Query 路徑的背壓。
  • +
  • 如果任何 QueryNode 佇列中的 NQ 大於 nqInQueueThreshold,搜尋與查詢率會逐漸降溫,直到佇列中的 NQ 不再大於 nqInQueueThreshold。
  • +
  • 直到佇列中的 NQ 不再超過 nqInQueueThreshold。我們將查詢請求的 NQ 視為 1。
  • +
  • int,預設無限制
  • -1
    +

    quotaAndLimits.limitReading.queueProtection.queueLatencyThreshold

    + + + + + + + + + + + + +
    說明預設值
    +
  • queueLatencyThreshold 表示系統受到搜尋/查詢路徑的反壓。
  • +
  • 如果 dql 的佇列延遲大於 queueLatencyThreshold,搜尋與查詢速率會逐漸降溫
  • +
  • 直到佇列的延遲不再超過 queueLatencyThreshold。
  • +
  • 這裡的延遲是指一段時間內的平均延遲。
  • +
  • 毫秒,預設無限制
  • -1
    +

    quotaAndLimits.limitReading.resultProtection.maxReadResultRate

    + + + + + + + + + + + + +
    說明預設值
    +
  • maxReadResultRate 表示系統受到搜尋/查詢路徑的反壓。
  • +
  • 如果 dql 結果率大於 maxReadResultRate,搜尋與查詢率會逐漸冷卻,直到讀取結果率不再超過 maxReadResultRate。
  • +
  • 直到讀取結果速率不再超過 maxReadResultRate。
  • +
  • MB/s,預設無限制
  • -1
    +

    quotaAndLimits.limitReading.coolOffSpeed

    + + + + + + + + + + + + +
    說明預設值
    +
  • colOffSpeed 為搜尋&查詢速率冷卻的速度。
  • +
  • (0, 1]
  • 0.9
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.json new file mode 100644 index 000000000..54d830822 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rocksmq-related Configurations","anchorList":[{"label":"rocksmq相關設定","href":"rocksmq-related-Configurations","type":1,"isActive":false},{"label":"rocksmq.path","href":"rocksmqpath","type":2,"isActive":false},{"label":"rocksmq.lrucacheratio","href":"rocksmqlrucacheratio","type":2,"isActive":false},{"label":"rocksmq.rocksmqPageSize","href":"rocksmqrocksmqPageSize","type":2,"isActive":false},{"label":"rocksmq.retentionTimeInMinutes","href":"rocksmqretentionTimeInMinutes","type":2,"isActive":false},{"label":"rocksmq.retentionSizeInMB","href":"rocksmqretentionSizeInMB","type":2,"isActive":false},{"label":"rocksmq.compactionInterval","href":"rocksmqcompactionInterval","type":2,"isActive":false},{"label":"rocksmq.compressionTypes","href":"rocksmqcompressionTypes","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.md new file mode 100644 index 000000000..3563b0d31 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rocksmq.md @@ -0,0 +1,247 @@ +--- +id: configure_rocksmq.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 配置 rocksmq。 +--- +

    rocksmq相關設定

    如果要啟用 kafka,需要註解 pulsar 配置

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout:10

    +

    rocksmq.path

    + + + + + + + + + + + + +
    說明預設值
    +
  • Milvus 在 RocksMQ 中儲存資料的 key 的前綴。
  • +
  • 注意:在使用 Milvus 一段時間後更改此參數會影響您對舊資料的存取。
  • +
  • 建議在第一次啟動 Milvus 之前更改這個參數。
  • +
  • 如果 etcd 服務已經存在,為 Milvus 設定一個容易識別的 root key 前綴。
  • /var/lib/milvus/rdb_data
    +

    rocksmq.lrucacheratio

    + + + + + + + + + + + + +
    說明預設值
    rocksdb 快取記憶體比率 0.06
    +

    rocksmq.rocksmqPageSize

    + + + + + + + + + + + + +
    說明預設值
    RocksMQ 每頁中訊息的最大大小。RocksMQ 中的訊息會根據這個參數進行批次檢查和清除(當過期時)。單位:Byte. 67108864
    +

    rocksmq.retentionTimeInMinutes

    + + + + + + + + + + + + +
    說明預設值
    RocksMQ 中已接收訊息的最長保留時間。在RocksMQ中被acked的訊息會保留指定的時間,然後被清除。單位:分鐘。 4320
    +

    rocksmq.retentionSizeInMB

    + + + + + + + + + + + + +
    說明預設值
    RocksMQ 中每個主題中已接收訊息的最大保留大小。如果每個主題的已接收訊息的大小超過此參數,則會被清除。單位:MB. 8192
    +

    rocksmq.compactionInterval

    + + + + + + + + + + + + +
    說明預設值
    觸發 rocksdb compaction 以移除刪除資料的時間間隔。單位:秒 86400
    +

    rocksmq.compressionTypes

    + + + + + + + + + + + + +
    說明預設值
    compaction 壓縮類型,僅支援使用 0、7。0 表示不壓縮,7 表示使用 zstd。類型的長度代表 rocksdb 層級的數目。 0,0,7,7,7
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.json new file mode 100644 index 000000000..24b106f46 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"rootCoord-related Configurations","anchorList":[{"label":"rootCoord 相關組態","href":"rootCoord-related-Configurations","type":1,"isActive":false},{"label":"rootCoord.dmlChannelNum","href":"rootCoorddmlChannelNum","type":2,"isActive":false},{"label":"rootCoord.maxPartitionNum","href":"rootCoordmaxPartitionNum","type":2,"isActive":false},{"label":"rootCoord.minSegmentSizeToEnableIndex","href":"rootCoordminSegmentSizeToEnableIndex","type":2,"isActive":false},{"label":"rootCoord.maxDatabaseNum","href":"rootCoordmaxDatabaseNum","type":2,"isActive":false},{"label":"rootCoord.maxGeneralCapacity","href":"rootCoordmaxGeneralCapacity","type":2,"isActive":false},{"label":"rootCoord.gracefulStopTimeout","href":"rootCoordgracefulStopTimeout","type":2,"isActive":false},{"label":"rootCoord.ip","href":"rootCoordip","type":2,"isActive":false},{"label":"rootCoord.port","href":"rootCoordport","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxSendSize","href":"rootCoordgrpcserverMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.serverMaxRecvSize","href":"rootCoordgrpcserverMaxRecvSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxSendSize","href":"rootCoordgrpcclientMaxSendSize","type":2,"isActive":false},{"label":"rootCoord.grpc.clientMaxRecvSize","href":"rootCoordgrpcclientMaxRecvSize","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.md new file mode 100644 index 000000000..ebe229c3e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_rootcoord.md @@ -0,0 +1,375 @@ +--- +id: configure_rootcoord.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定 rootCoord。 +--- +

    rootCoord 相關組態

    rootCoord 的相關配置,用於處理資料定義語言 (DDL) 和資料控制語言 (DCL) 請求

    +

    rootCoord.dmlChannelNum

    + + + + + + + + + + + + +
    說明預設值
    在 root coord 啟動時建立的 DML 通道數量。 16
    +

    rootCoord.maxPartitionNum

    + + + + + + + + + + + + +
    說明預設值
    +
  • 每個資料集中的最大分割區數量。
  • +
  • 如果此參數設定為 0 或 1,則無法建立新的分割區。
  • +
  • 範圍:[0、INT64MAX]
  • 1024
    +

    rootCoord.minSegmentSizeToEnableIndex

    + + + + + + + + + + + + +
    說明預設值
    +
  • 建立索引所需的最小區段行數。
  • +
  • 小於此參數的區段將不會建立索引,並會以暴力方式搜尋。
  • 1024
    +

    rootCoord.maxDatabaseNum

    + + + + + + + + + + + + +
    說明預設值
    最大資料庫數量 64
    +

    rootCoord.maxGeneralCapacity

    + + + + + + + + + + + + +
    說明預設值
    分區編號與分區編號乘積之和的上限 65536
    +

    rootCoord.gracefulStopTimeout

    + + + + + + + + + + + + +
    說明預設值
    強制停止節點而不優先停止 5
    +

    rootCoord.ip

    + + + + + + + + + + + + +
    說明預設值
    rootCoord 的 TCP/IP 位址。如果未指定,則使用第一個可單點傳送的位址。
    +

    rootCoord.port

    + + + + + + + + + + + + +
    說明預設值
    根目錄的 TCP 連接埠 53100
    +

    rootCoord.grpc.serverMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    rootCoord 可以傳送的每個 RPC 請求的最大大小,單位:位元組 536870912
    +

    rootCoord.grpc.serverMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    rootCoord 可以接收的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    rootCoord.grpc.clientMaxSendSize

    + + + + + + + + + + + + +
    說明預設值
    rootCoord 上的用戶端可以傳送的每個 RPC 請求的最大大小,單位:位元組 268435456
    +

    rootCoord.grpc.clientMaxRecvSize

    + + + + + + + + + + + + +
    說明預設值
    rootCoord 上的用戶端可以接收的每個 RPC 請求的最大大小,單位:位元組 536870912
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.json new file mode 100644 index 000000000..00e5fa40b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tikv-related Configurations","anchorList":[{"label":"tikv 相關組態","href":"tikv-related-Configurations","type":1,"isActive":false},{"label":"tikv.endpoints","href":"tikvendpoints","type":2,"isActive":false},{"label":"tikv.rootPath","href":"tikvrootPath","type":2,"isActive":false},{"label":"tikv.metaSubPath","href":"tikvmetaSubPath","type":2,"isActive":false},{"label":"tikv.kvSubPath","href":"tikvkvSubPath","type":2,"isActive":false},{"label":"tikv.requestTimeout","href":"tikvrequestTimeout","type":2,"isActive":false},{"label":"tikv.snapshotScanSize","href":"tikvsnapshotScanSize","type":2,"isActive":false},{"label":"tikv.ssl.enabled","href":"tikvsslenabled","type":2,"isActive":false},{"label":"tikv.ssl.tlsCert","href":"tikvssltlsCert","type":2,"isActive":false},{"label":"tikv.ssl.tlsKey","href":"tikvssltlsKey","type":2,"isActive":false},{"label":"tikv.ssl.tlsCACert","href":"tikvssltlsCACert","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.md new file mode 100644 index 000000000..fc87080e5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tikv.md @@ -0,0 +1,314 @@ +--- +id: configure_tikv.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 tikv。 +--- +

    tikv 相關組態

    tikv 的相關設定,用來儲存 Milvus 元資料。

    +

    請注意,當啟用 TiKV 作為 metastore 時,您仍需要使用 etcd 來進行服務發現。

    +

    當元資料大小需要更好的水平擴充性時,TiKV 是一個不錯的選擇。

    +

    tikv.endpoints

    + + + + + + + + + + + + +
    說明預設值
    請注意,tikv 的預設 pd 連接埠是 2379,這與 etcd 有衝突。 127.0.0.1:2389
    +

    tikv.rootPath

    + + + + + + + + + + + + +
    說明預設值
    tikv 中儲存資料的根目錄 by-dev
    +

    tikv.metaSubPath

    + + + + + + + + + + + + +
    說明預設值
    metaRootPath = rootPath + '/' + metaSubPath
    +

    tikv.kvSubPath

    + + + + + + + + + + + + +
    說明預設值
    kvRootPath = rootPath + '/' + kvSubPath kv
    +

    tikv.requestTimeout

    + + + + + + + + + + + + +
    說明預設值
    ms, tikv 請求超時 10000
    +

    tikv.snapshotScanSize

    + + + + + + + + + + + + +
    說明預設值
    tikv 快照掃描的批次大小 256
    +

    tikv.ssl.enabled

    + + + + + + + + + + + + +
    說明預設值
    是否支援 TiKV 安全連線模式
    +

    tikv.ssl.tlsCert

    + + + + + + + + + + + + +
    說明預設值
    您的憑證檔案路徑
    +

    tikv.ssl.tlsKey

    + + + + + + + + + + + + +
    說明預設值
    金鑰檔案路徑
    +

    tikv.ssl.tlsCACert

    + + + + + + + + + + + + +
    說明預設值
    CACert 檔案的路徑
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.json new file mode 100644 index 000000000..fca9903a1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"tls-related Configurations","anchorList":[{"label":"tls 相關組態","href":"tls-related-Configurations","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.md new file mode 100644 index 000000000..64483bd09 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_tls.md @@ -0,0 +1,22 @@ +--- +id: configure_tls.md +related_key: configure +group: system_configuration.md +summary: 學習如何為 Milvus 設定 tls。 +--- +

    tls 相關組態

    設定代理 tls 啟用。

    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.json new file mode 100644 index 000000000..926caef7b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"trace-related Configurations","anchorList":[{"label":"追蹤相關組態","href":"trace-related-Configurations","type":1,"isActive":false},{"label":"trace.exporter","href":"traceexporter","type":2,"isActive":false},{"label":"trace.sampleFraction","href":"tracesampleFraction","type":2,"isActive":false},{"label":"trace.jaeger.url","href":"tracejaegerurl","type":2,"isActive":false},{"label":"trace.otlp.endpoint","href":"traceotlpendpoint","type":2,"isActive":false},{"label":"trace.otlp.method","href":"traceotlpmethod","type":2,"isActive":false},{"label":"trace.initTimeoutSeconds","href":"traceinitTimeoutSeconds","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.md new file mode 100644 index 000000000..dd7b0bdf4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/configure_trace.md @@ -0,0 +1,200 @@ +--- +id: configure_trace.md +related_key: configure +group: system_configuration.md +summary: 了解如何為 Milvus 設定追蹤。 +--- +

    追蹤相關組態

    trace.exporter

    + + + + + + + + + + + + +
    說明預設值
    +
  • trace 出口商類型,預設為 stdout、
  • +
  • 可選值:['noop','stdout','jaeger','otlp']。
  • +

    trace.sampleFraction

    + + + + + + + + + + + + +
    說明預設值
    +
  • 以 traceID 為基礎的取樣器的分數、
  • +
  • 可選值:[0, 1]
  • +
  • >= 1 的分數會一直取樣。< 0 的分數會被視為零。
  • 0
    +

    trace.jaeger.url

    + + + + + + + + + + + + +
    說明預設值
    當出口商為 jaeger 時,應設定 jaeger 的 URL
    +

    trace.otlp.endpoint

    + + + + + + + + + + + + +
    說明預設值
    範例:"127.0.0.1:4317 「用於 grpc,」127.0.0.1:4318 "用於 http
    +

    trace.otlp.method

    + + + + + + + + + + + + +
    說明預設值
    otlp 匯出方法,可接受的值:["grpc"、"http"],預設使用「grpc
    +

    trace.initTimeoutSeconds

    + + + + + + + + + + + + +
    說明預設值
    segcore 初始化超時(秒),防止 otlp grpc 永遠擱置 10
    diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.json b/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.json new file mode 100644 index 000000000..872725f77 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus System Configurations Checklist","anchorList":[{"label":"Milvus 系統配置清單","href":"Milvus-System-Configurations-Checklist","type":1,"isActive":false},{"label":"章節","href":"Sections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.md b/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.md new file mode 100644 index 000000000..4660582e2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/sys_config/system_configuration.md @@ -0,0 +1,129 @@ +--- +id: system_configuration.md +related_key: configure +group: system_configuration.md +summary: 了解 Milvus 的系統設定。 +--- +

    Milvus 系統配置清單

    本主題介紹 Milvus 系統配置的一般部分。

    +

    Milvus 維護相當多的參數來設定系統。每個組態都有預設值,可以直接使用。您可以靈活地修改這些參數,使 Milvus 能更好地為您的應用程式服務。更多資訊請參閱配置 Milvus

    +
    +在目前的版本中,所有參數只有在啟動 Milvus 時設定後才會生效。
    +

    章節

    為了方便維護,Milvus 根據其元件、相依性和一般用法,將其配置分類為 %s 區段。

    +

    etcd

    etcd 相關設定,用來儲存 Milvus 元資料 & 服務發現。

    +

    請參閱etcd 相關組態,以取得本節下各參數的詳細說明。

    +

    metastore

    本節下各參數的詳細說明,請參閱metastore 相關組態

    +

    tikv

    tikv 的相關設定,用於儲存 Milvus 元資料。

    +

    請注意,當為 metastore 啟用 TiKV 時,您仍需要使用 etcd 來發現服務。

    +

    當元資料大小需要更好的水平擴充性時,TiKV 是一個不錯的選擇。

    +

    請參閱tikv 相關組態,以取得本節下各參數的詳細說明。

    +

    localStorage

    請參閱localStorage 相關組態,以取得本節下各參數的詳細說明。

    +

    minio

    MinIO/S3/GCS 或任何其他服務的相關設定支援 S3 API,S3 API 負責 Milvus 的資料持久化。

    +

    為了簡單起見,我們在以下說明中將儲存服務稱為「MinIO/S3」。

    +

    本節下各參數的詳細說明,請參閱minio 相關組態

    +

    mq

    Milvus 支援四種 MQ:rocksmq(基於 RockDB)、natsmq(內嵌 nats-server)、Pulsar 和 Kafka。

    +

    您可以透過設定 mq.type 欄位來變更您的 MQ。

    +

    如果您不將 mq.type 欄位設定為預設值,如果我們在此檔案中設定多個 mq,則會有啟用優先順序的注意事項。

    +
      +
    1. 獨立(本機)模式:rocksmq(預設) > natsmq > Pulsar > Kafka

    2. +
    3. 群集模式: Pulsar(default) > Kafka (群集模式不支援 rocksmq 和 natsmq)

    4. +
    +

    請參閱mq 相關組態,以取得本節下各參數的詳細說明。

    +

    pulsar

    pulsar 相關設定,用來管理 Milvus 最近突變作業的日誌、輸出串流日誌,並提供日誌發佈-訂閱服務。

    +

    請參閱pulsar 相關設定,以瞭解本節下每個參數的詳細說明。

    +

    rocksmq

    如果你想啟用 kafka,需要註解 pulsar configs

    +

    kafka:

    +

    brokerList:

    +

    saslUsername:

    +

    saslPassword:

    +

    saslMechanisms:

    +

    securityProtocol:

    +

    ssl:

    +
    enabled: false # whether to enable ssl mode
    +
    +tlsCert:  # path to client's public key (PEM) used for authentication
    +
    +tlsKey:  # path to client's private key (PEM) used for authentication
    +
    +tlsCaCert:  # file or directory path to CA certificate(s) for verifying the broker's key
    +
    +tlsKeyPassword:  # private key passphrase for use with ssl.key.location and set_ssl_cert(), if any
    +
    +

    readTimeout:10

    +

    請參閱rocksmq 相關組態,以取得本節下各參數的詳細說明。

    +

    natsmq

    natsmq 配置。

    +

    更多詳細資訊:https://docs.nats.io/running-a-nats-service/configuration

    +

    請參閱natsmq 相關組態,以取得本節下各參數的詳細說明。

    +

    rootCoord

    rootCoord 相關組態,用來處理資料定義語言 (DDL) 和資料控制語言 (DCL) 請求

    +

    請參閱rootCoord 相關組態,以取得本節下各參數的詳細說明。

    +

    proxy

    proxy 的相關組態,用於驗證用戶端請求並減少傳回的結果。

    +

    本節下各參數的詳細說明,請參閱proxy 相關組態

    +

    queryCoord

    queryCoord 相關組態用於管理查詢節點的拓樸和負載平衡,以及從成長中的網段移交到封閉的網段。

    +

    請參閱queryCoord 相關組態,以取得本節下各參數的詳細說明。

    +

    queryNode

    queryNode 的相關組態,用於執行向量與標量資料之間的混合搜尋。

    +

    請參閱queryNode 相關組態,以取得本節下各參數的詳細說明。

    +

    indexCoord

    請參閱indexCoord 相關組態,以取得本節下各參數的詳細說明。

    +

    indexNode

    請參閱indexNode 相關組態,以取得本節下各參數的詳細說明。

    +

    dataCoord

    請參閱dataCoord-related Configurations,取得本節下各參數的詳細說明。

    +

    dataNode

    本節下各參數的詳細說明,請參閱dataNode 相關Configurations

    +

    msgChannel

    本主題介紹 Milvus 的訊息通道相關設定。

    +

    請參閱msgChannel 相關組態,以取得本節下各參數的詳細說明。

    +

    log

    設定系統日誌輸出。

    +

    請參閱log-related Configurations以取得本節下各參數的詳細說明。

    +

    grpc

    本節下各參數的詳細說明,請參閱grpc 相關組態

    +

    tls

    設定代理 tls 啟用。

    +

    請參閱tls 相關組態,以取得本節下各參數的詳細說明。

    +

    common

    本節下各參數的詳細說明,請參閱共用相關組態。

    +

    quotaAndLimits

    QuotaConfig, Milvus 配額和限制的設定。

    +

    預設啟用:

    +
      +
    1. TT 保護;

    2. +
    3. 記憶體保護。

    4. +
    5. 磁碟配額保護。

    6. +
    +

    您可以啟用

    +
      +
    1. DML 吞吐量限制;

    2. +
    3. DDL, DQL qps/rps 限制;

    4. +
    5. DQL 佇列長度/延遲保護;

    6. +
    7. DQL 結果率保護;

    8. +
    +

    必要時,您也可以手動強制拒絕 RW 請求。

    +

    請參閱quotaAndLimits 相關組態,以取得本節下各參數的詳細說明。

    +

    trace

    本節下各參數的詳細說明,請參閱「追蹤相關設定」。

    +

    gpu

    #當使用 GPU 索引時,Milvus 會使用記憶體池來避免頻繁的記憶體分配和取消分配。

    +

    #在這裡,您可以設定記憶體池所佔用的記憶體大小,單位為 MB。

    +

    #注意,當實際的記憶體需求超過 maxMemSize 設定的值時,Milvus 有可能會當機。

    +

    #if initMemSize 和 MaxMemSize 都設定為零、

    +

    #milvus 將自動初始化一半可用的 GPU 記憶體、

    +

    #maxMemSize 將會是整個可用的 GPU 記憶體。

    +

    請參閱gpu 相關組態,以取得本節下各參數的詳細說明。

    diff --git a/localization/v2.5.x/site/zh-hant/reference/time_sync.json b/localization/v2.5.x/site/zh-hant/reference/time_sync.json new file mode 100644 index 000000000..8fc8dcb72 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/time_sync.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Time Synchronization","anchorList":[{"label":"時間同步","href":"Time-Synchronization","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"時間戳oracle (TSO)","href":"Timestamp-oracle-TSO","type":2,"isActive":false},{"label":"時間同步系統 (timetick)","href":"Time-synchronization-system-timetick","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/time_sync.md b/localization/v2.5.x/site/zh-hant/reference/time_sync.md new file mode 100644 index 000000000..093e075ae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/time_sync.md @@ -0,0 +1,161 @@ +--- +id: time_sync.md +title: 時間同步 +summary: 了解 Milvus 中的時間同步系統。 +--- +

    時間同步

    本主題介紹 Milvus 的時間同步機制。

    +

    概述

    Milvus 中的事件一般可分為兩種類型:

    +
      +
    • 資料定義語言 (DDL) 事件:建立/刪除集合、建立/刪除分割區等。

    • +
    • 資料操作語言 (DML) 事件:插入、搜尋等。

    • +
    +

    任何事件,不論是 DDL 或 DML 事件,都標有時間戳記,可以指出事件發生的時間。

    +

    假設有兩個使用者在 Milvus 發起一系列 DML 和 DDL 事件,時間順序如下表所示。

    + + + + + + + + + + + + + + +
    時間戳記使用者 1使用者 2
    t0建立了一個名為C0./
    t2/在資料集中進行搜尋C0.
    t5插入資料A1 到資料庫C0./
    t7/在資料集中進行搜尋C0.
    t10插入資料A2 到資料庫C0./
    t12/在資料集中進行搜尋C0
    t15從資料集中刪除資料A1 C0 ./
    t17/在資料集中進行搜尋C0
    +

    理想情況下,使用者 2 應該可以看到

    +
      +
    • 一個空的集合C0t2.

    • +
    • 資料A1t7.

    • +
    • 資料A1A2 均位於t12

    • +
    • 只有資料A2 att17 (因為資料A1 在此點之前已從集合中刪除)。

    • +
    +

    當只有一個單一節點時,這種理想的情況很容易實現。然而,Milvus 是分散式向量資料庫,為了確保不同節點的所有 DML 與 DDL 作業都能保持順序,Milvus 需要解決以下兩個問題:

    +
      +
    1. 如果上面例子中的兩個使用者在不同的節點上,他們的時間時鐘是不同的。例如,如果使用者 2 比使用者 1 晚 24 小時,那麼使用者 1 的所有作業要到隔天才會被使用者 2 看見。

    2. +
    3. 可能存在網路延遲。如果使用者 2 在t17 對資料集C0 進行搜尋,Milvus 應該可以保證t17 之前的所有作業都成功處理並完成。如果在t15 的刪除作業因為網路延遲而延遲,使用者 2 在t17 進行搜尋時,很有可能仍然可以看到應該被刪除的資料A1

    4. +
    +

    因此,Milvus 採用時間同步系統 (timetick) 來解決問題。

    +

    時間戳oracle (TSO)

    為了解決上一節提到的第一個問題,Milvus 和其他分散式系統一樣,提供時間戳oracle (TSO) 服務。這表示 Milvus 中的所有事件都必須從 TSO 而非本機時鐘分配時間戳。

    +

    TSO 服務由 Milvus 的根協調器提供。用戶端可以在單個時間戳分配請求中分配一個或多個時間戳。

    +

    TSO 時間戳是一種uint64 值,由物理部分和邏輯部分組成。下圖展示了時間戳的格式。

    +

    + + TSO_Timestamp + TSO_Timestamp.

    +

    如圖所示,開頭的 46 位元是實體部分,也就是以毫秒為單位的 UTC 時間。最後的 18 位元是邏輯部分。

    +

    時間同步系統 (timetick)

    本節以資料插入操作為例,說明 Milvus 的時間同步機制。

    +

    當 proxy 收到 SDK 的資料插入請求時,會依照主鍵的哈希值將插入訊息分成不同的訊息流 (MsgStream)。

    +

    每條插入訊息 (InsertMsg) 在傳送到MsgStream 之前,都會被指定一個時間戳。

    +
    + MsgStream 是訊息佇列的包裝,在 Milvus 2.0 預設是 Pulsar。
    +

    + + timesync_proxy_insert_msg + timesync_proxy_insert_msg

    +

    一個一般原則是,在MsgStream, 來自同一個 proxy 的InsertMsgs 的時間戳必須是遞增的。但是,對於來自不同代理的InsertMsgs ,則沒有這樣的規則。

    +

    下圖是InsertMsgsMsgStream 中的範例。該片段包含五個InsertMsgs ,其中三個來自Proxy1 ,其餘來自Proxy2

    +

    + + msgstream + msgstream

    +

    來自Proxy1 的三個InsertMsgs 的時間戳是遞增的,來自Proxy2 的兩個InsertMsgs 的時間戳也是遞增的。但是,Proxy1Proxy2 InsertMsgs 之間沒有特定的順序。

    +

    一種可能的情況是,當從Proxy2 讀取時間戳為110 的訊息時,Milvus 發現時間戳為80 的訊息仍在Proxy1MsgStream 中。因此,Milvus 引進了時間同步系統 timetick,以確保從MsgStream 讀取訊息時,必須消耗所有時間戳值較小的訊息。

    +

    + + time_synchronization + 時間同步

    +

    如上圖所示、

    +
      +
    • 每個代理定期 (預設為每 200 ms) 將MsgStream中最新InsertMsg 的最大時間戳值報告給根坐標。

    • +
    • 無論InsertMsgs 屬於哪個代理伺服器,Root Coord 都會找出這個Msgstream 的最小時間戳值。然後,root coord 將這個最小時間戳插入Msgstream 。這個時間戳也稱為 timetick。

    • +
    • 當消費者元件讀取由根坐標插入的 timetick 時,它們會了解所有時間戳值較小的插入訊息已被消耗。因此,可以在不中斷訂單的情況下安全地執行相關請求。

    • +
    +

    下圖是Msgstream 插入時間刻度的範例。

    +

    + + timetick + 時間標記

    +

    MsgStream 會根據時間刻度分批處理訊息,以確保輸出訊息符合時間戳記的要求。在上面的範例中,它會在 消耗除了 的 以外的所有記錄,因為它是在最新的 TimeTick 之後。Timestamp: 120 Proxy2 InsertMsgs

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/reference/timestamp.json b/localization/v2.5.x/site/zh-hant/reference/timestamp.json new file mode 100644 index 000000000..b799860bb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/timestamp.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Timestamp","anchorList":[{"label":"時間戳","href":"Timestamp","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"時間戳參數","href":"Timestamp-parameters","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/reference/timestamp.md b/localization/v2.5.x/site/zh-hant/reference/timestamp.md new file mode 100644 index 000000000..60efcc7de --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/reference/timestamp.md @@ -0,0 +1,107 @@ +--- +id: timestamp.md +title: 在 Milvus 的時間戳 +summary: 了解時間戳的概念以及 Milvus 向量資料庫中四個主要的時間戳相關參數。 +--- +

    時間戳

    本主題解釋時間戳的概念,並介紹 Milvus 向量資料庫中四個主要的時間戳相關參數。

    +

    概述

    Milvus 是一個向量資料庫,可以搜尋和查詢從非結構化資料轉換過來的向量。當進行資料處理語言 (DML) 作業時,包括資料插入和刪除,Milvus 會為作業所涉及的實體指定時間戳。因此,Milvus 中的所有實體都有時間戳屬性。而在同一 DML 操作中的實體批次共享相同的時間戳值。

    +

    時間戳參數

    在 Milvus 中進行向量相似性搜尋或查詢時,會涉及數個與時間戳相關的參數。

    +
      +
    • Guarantee_timestamp

    • +
    • Service_timestamp

    • +
    • Graceful_time

    • +
    • Travel_timestamp

    • +
    +

    Guarantee_timestamp

    Guarantee_timestamp 是一種時間戳,用來確保在進行向量相似性搜尋或查詢時,在 之前由 DML 作業更新的所有資料都是可見的。例如,如果您在下午 3 點插入一批資料,在下午 5 點插入另一批資料,而在向量相似性搜尋時, 的值設定為下午 6 點。這表示分別在下午 3 點和下午 5 點插入的兩批資料應參與搜尋。Guarantee_timestamp Guarantee_timestamp

    +

    如果沒有設定Guarantee_timestamp ,Milvus 會自動以提出搜尋請求的時間點。因此,搜尋是在資料檢視上進行,所有資料更新都是在搜尋之前透過 DML 作業進行。

    +

    為了省去您在 Milvus 內理解TSO的麻煩,作為用戶,您不需要直接配置Guarantee_timestamp 參數。您只需要選擇一致性等級,Milvus 會自動為您處理Guarantee_timestamp 參數。每個一致性等級對應某個Guarantee_timestamp 值。

    +

    + + Guarantee_Timestamp + Guarantee_Timestamp.

    +

    範例

    如上圖所示,Guarantee_timestamp 的值設定為2021-08-26T18:15:00 (為簡單起見,此範例中的時間戳以實體時間表示)。當您進行搜尋或查詢時,2021-08-26T18:15:00 之前的所有資料都會被搜尋或查詢。

    +

    Service_timestamp

    Service_timestamp 是由 Milvus 中的查詢節點自動產生和管理的時間戳類型。它用於指示查詢節點執行哪些 DML 作業。

    +

    查詢節點管理的資料可分為兩種類型:

    +
      +
    • 歷史資料 (或也稱為批次資料)

    • +
    • 增量資料(或稱為串流資料)。

    • +
    +

    在 Milvus 中,您需要在進行搜尋或查詢之前載入資料。因此,在進行搜尋或查詢請求之前,集合中的批次資料會由查詢節點載入。但是,流式資料是即時插入 Milvus 或從 Milvus 刪除的,這需要查詢節點保持 DML 作業和搜尋或查詢請求的時間線。因此,查詢節點使用Service_timestamp 來保持這樣的時間線。Service_timestamp 可以被視為某些資料可見的時間點,因為查詢節點可以確保Service_timestamp 之前的所有 DML 作業都已完成。

    +

    當有搜尋或查詢請求傳入時,查詢節點會比較Service_timestampGuarantee_timestamp 的值。主要有兩種情況。

    +

    + + Service_Timestamp + 服務_時間戳.

    +

    情況 1:Service_timestamp >=Guarantee_timestamp

    如圖 1 所示,Guarantee_timestamp 的值設定為2021-08-26T18:15:00 。當Service_timestamp 的值長大為2021-08-26T18:15:01 時,表示查詢節點執行並完成此時點之前的所有 DML 作業,包括Guarantee_timestamp 所指示時間之前的 DML 作業。因此,搜尋或查詢請求可以立即執行。

    +

    情況 2:Service_timestamp <Guarantee_timestamp

    如圖 2 所示,Guarantee_timestamp 的值設定為2021-08-26T18:15:00 ,而Service_timestamp 的目前值只有2021-08-26T18:14:55 。這表示只有在2021-08-26T18:14:55 之前的 DML 作業才會被執行並完成,剩下在這個時間點之後但在Guarantee_timestamp 之前的部分 DML 作業尚未完成。如果在這個時間點執行搜尋或查詢,有些所需的資料是不可見的,還無法取得,嚴重影響搜尋或查詢結果的準確性。因此,查詢節點需要推遲搜尋或查詢請求,直到guarantee_timestamp 之前的 DML 作業完成為止 (也就是當Service_timestamp >=Guarantee_timestamp)。

    +

    Graceful_time

    技術上來說,Graceful_time 並不是時間戳記,而是一個時間段(例如 100 毫秒)。不過,Graceful_time 值得一提,因為它與Guarantee_timestampService_timestamp 有密切關係。Graceful_time 是 Milvus 設定檔中一個可設定的參數。它用來指出在某些資料變得可見之前可以容忍的時間。簡而言之,在Graceful_time 期間未完成的 DML 作業是可以容忍的。

    +

    當有輸入的搜尋或查詢請求時,可能有兩種情況。

    +

    + + Graceful_Time + Graceful_Time.

    +

    情況 1:Service_timestamp +Graceful_time >=Guarantee_timestamp

    如圖 1 所示,Guarantee_timestamp 的值設定為2021-08-26T18:15:01Graceful_time 設定為2sService_timestamp 2021-08-26T18:15:00雖然Service_timestamp 的值仍小於Guarantee_timestamp 的值,且2021-08-26T18:15:01 之前的 DML 作業尚未全部完成,但如Graceful_time 的值所示,可容忍 2 秒的資料隱藏時間。因此,傳入的搜尋或查詢請求可立即執行。

    +

    情況 2:Service_timestamp +Graceful_time <Guarantee_timestamp

    如圖 2 所示,Guarantee_timestamp 的值設定為2021-08-26T18:15:01Graceful_time 設定為2sService_timestamp 目前的值只有2021-08-26T18:14:54 。這表示預期的 DML 作業尚未完成,即使有 2 秒的優化時間,資料隱藏仍然是無法忍受的。因此,查詢節點需要擱置搜尋或查詢請求,直到某些 DML 請求完成為止 (即當Service_timestamp +Graceful_time >=Guarantee_timestamp)。

    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/release_notes.json b/localization/v2.5.x/site/zh-hant/release_notes.json new file mode 100644 index 000000000..7bdf20e1f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/release_notes.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Release Notes","anchorList":[{"label":"發佈筆記","href":"Release-Notes","type":1,"isActive":false},{"label":"v2.5.3","href":"v253","type":2,"isActive":false},{"label":"v2.5.2","href":"v252","type":2,"isActive":false},{"label":"v2.5.1","href":"v251","type":2,"isActive":false},{"label":"v2.5.0","href":"v250","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/release_notes.md b/localization/v2.5.x/site/zh-hant/release_notes.md new file mode 100644 index 000000000..2ed1d45b9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/release_notes.md @@ -0,0 +1,210 @@ +--- +id: release_notes.md +summary: Milvus 發行紀錄 +title: 發佈筆記 +--- +

    發佈筆記

    瞭解 Milvus 的新功能!本頁總結了每個版本的新功能、改進、已知問題和錯誤修正。您可以在本節中找到 v2.5.0 以後每個版本的發行說明。我們建議您定期造訪此頁面以瞭解更新資訊。

    +

    v2.5.3

    發行日期:2025 年 1 月 13 日

    + + + + + + + +
    Milvus 版本Python SDK 版本Node.js SDK 版本Java SDK 版本
    2.5.32.5.32.5.32.5.4
    +

    Milvus 2.5.3 提供重要的錯誤修正與效能強化,以改善整體穩定性、可靠性與可用性。此版本改進了並發處理、加強了資料索引和擷取,並更新了幾個關鍵元件,以提供更強大的使用者體驗。

    +

    錯誤修正

      +
    • 修正了在VARCHAR 主索引鍵上使用IN 過濾器可能返回空結果的問題。(#39108)
    • +
    • 修正了查詢與刪除操作之間的並發問題,該問題可能會導致不正確的結果。(#39054)
    • +
    • 修正了查詢請求中expr 為空時,迭代過濾所導致的失敗。(#39034)
    • +
    • 修正了配置更新時磁碟錯誤導致使用預設配置設定的問題。(#39072)
    • +
    • 修正了聚類壓縮可能導致刪除資料遺失的問題。(#39133)
    • +
    • 修正了在成長中的資料片段中,文字匹配查詢出錯的問題。(#39113)
    • +
    • 修正了因索引不包含稀疏向量的原始數據而導致的檢索失敗。(#39146)
    • +
    • 修正了並行查詢和資料載入可能導致的列字段競賽情況。(#39152)
    • +
    • 修正了當資料中沒有包含 nullable 或 default_value 欄位時,大量插入的失敗問題。(#39111)
    • +
    +

    改進

      +
    • 為 RESTful 介面新增資源群組 API。(#39092)
    • +
    • 利用 bitset SIMD 方法優化了擷取效能。(#39041)
    • +
    • 指定時使用 MVCC 時間戳作為保證時間戳。(#39019)
    • +
    • 新增遺失的刪除指標。(#38747)
    • +
    • 更新 Etcd 至 v3.5.16 版。(#38969)
    • +
    • 建立新的 Go 套件來管理 protos。(#39128)
    • +
    +

    v2.5.2

    發行日期: 2025年1月3日

    + + + + + + + +
    Milvus 版本Python SDK 版本Node.js SDK 版本Java SDK 版本
    2.5.22.5.32.5.32.5.3
    +

    Milvus 2.5.2 支援修改 VARCHAR 欄位的最大長度,並解決了幾個關於並發、分割區丟失以及匯入時 BM25 統計處理的重要問題。我們強烈建議升級至此版本,以改善穩定性和效能。

    +

    改進

      +
    • 僅在指定路徑不存在時才產生磁碟使用記錄。(#38822)
    • +
    • 新增調整最大 VARCHAR 長度的參數,並將限制恢復為 65,535(#38883)
    • +
    • 支持表達式的參數類型轉換。(#38782)
    • +
    +

    錯誤修正

      +
    • 修正了並發情況下的潛在死鎖。(#38863)
    • +
    • 只為支援空值的欄位產生 index_null_offset 檔案。(#38834)
    • +
    • 修正了還原階段中 free 之後的 retrieve 計劃使用問題。(#38841)
    • +
    • 識別大寫 AND 和 OR 的表達式。(#38928)
    • +
    • 即使載入失敗,也允許成功丟棄分割區。(#38874)
    • +
    • 修正匯入時 BM25 統計檔註冊問題。(#38881)
    • +
    +

    v2.5.1

    發行日期:2024 年 12 月 26 日

    + + + + + + + +
    Milvus 版本Python SDK 版本Node.js SDK 版本Java SDK 版本
    2.5.12.5.22.5.22.5.2
    +

    Milvus 2.5.1 主要針對記憶體載入、RBAC 列表、查詢節點平衡和封存段索引等一系列錯誤進行修復,同時也改進了 Web UI 和截取器。我們強烈建議升級至 2.5.1,以增強穩定性和可靠性。

    +

    改進

      +
    • 更新 Web UI 收集和查詢頁面。(#38701)
    • +
    +

    錯誤修正

      +
    • 在載入估算中加入記憶體因素,修正了 OOM 問題。(#38722)
    • +
    • 在 RootCoord 中列出政策時,修正了特權群組擴充的問題。(#38760)
    • +
    • 修正列出特權群組與集合的問題。(#38738)
    • +
    • 修正了平衡器,以避免重複超載相同的查詢節點。(#38724)
    • +
    • 修正了在 QueryCoord 重新啟動後所觸發的意外平衡任務。(#38725)
    • +
    • 修正了載入配置更新不適用於載入集合的問題。(#38737)
    • +
    • 修正資料匯入時讀取計數為零的問題。(#38695)
    • +
    • 修正了表達式中 JSON 鍵的 Unicode 解碼問題。(#38653)
    • +
    • 修正了2.5版本中alterCollectionField的interceptor DB名稱。 (#38663)
    • +
    • 當使用 BM25 強力搜尋時,修正了封存區段的空索引參數。(#38752)
    • +
    +

    v2.5.0

    發行日期:2024 年 12 月 23 日

    + + + + + + + +
    Milvus 版本Python SDK 版本Node.js SDK 版本Java SDK 版本
    2.5.02.5.12.5.22.5.2
    +

    Milvus 2.5.0 為處理向量搜尋與大規模資料管理的使用者帶來重大進步,以提升可用性、可擴充性與效能。在此版本中,Milvus 整合了強大的新功能,例如:基於術語的搜尋、針對最佳化查詢的聚類壓縮,以及對稀疏與密集向量搜尋方法的多樣化支援。在群集管理、索引和資料處理方面的強化,將彈性和易用性提升到新的層級,使 Milvus 成為更強大、更易於使用的向量資料庫。

    +

    主要功能

    Milvus 2.5 支援以 Sparse-BM25 實作的全文檢索!此功能是 Milvus 強大語義搜尋功能的重要補充,尤其是在涉及罕見字詞或技術術語的情況下。在之前的版本中,Milvus 支援稀疏向量以協助關鍵字搜尋。這些稀疏向量是由 SPLADEv2/BGE-M3 等神經模型或 BM25 演算法等統計模型在 Milvus 外部產生的。

    +

    Tantivy 的支援下,Milvus 2.5 內建了分析器和稀疏向量萃取,將 API 從僅接收向量作為輸入擴展到直接接受文字。當資料插入時,BM25 統計資訊會即時更新,提升可用性與精確度。此外,以近似近鄰 (ANN) 演算法為基礎的稀疏向量,提供比標準關鍵字搜尋系統更強大的效能。

    +

    如需詳細資訊,請參閱Analyzer 概觀全文檢索。

    +

    叢集管理 WebUI (測試版)

    為了更好地支援海量資料和豐富的功能,Milvus 的精密設計包括各種依賴關係、眾多節點角色、複雜的資料結構等。這些方面都可能為使用和維護帶來挑戰。

    +

    Milvus 2.5 引入了內建的群集管理 WebUI,透過可視化 Milvus 複雜的運行環境資訊,降低系統維護的難度。這包括資料庫和資料集、網段、頻道、相依性、節點健康狀態、任務資訊、緩慢查詢等詳細資訊。

    +

    詳情請參閱Milvus WebUI

    +

    文字匹配

    Milvus 2.5 利用Tantivy的分析器和索引進行文字預處理和索引建立,支援根據特定詞彙對文字資料進行精確的自然語言匹配。此功能主要用於滿足特定條件的篩選搜尋,並可結合標量篩選來精細查詢結果,允許在符合標量條件的向量內進行相似性搜尋。

    +

    如需詳細資訊,請參閱Analyzer 概觀文字匹配

    +

    位圖索引

    Milvus 系列新增了標量資料索引。BitMap 索引使用長度等於行數的位元陣列來表示值的存在並加速搜尋。

    +

    Bitmap 索引傳統上對於低心數欄位非常有效,因為低心數欄位只有少量不同的值--例如,包含性別資訊的欄位只有兩個可能的值:男性和女性。

    +

    如需詳細資訊,請參閱位元圖索引

    +

    可空值與預設值

    Milvus 現在支援為除主索引鍵欄位以外的標量欄位設定 nullable 屬性和預設值。對於標記為nullable=True 的標量欄位,使用者可以在插入資料時省略該欄位;系統會將其視為空值或預設值(如果已設定),而不會產生錯誤。

    +

    預設值和可為空的屬性為 Milvus 提供了更大的靈活性。使用者在建立集合時,可以利用此功能來處理值不確定的欄位。它也簡化了從其他資料庫系統到 Milvus 的資料遷移,允許處理包含空值的資料集,同時保留原始的預設值設定。

    +

    詳情請參閱Nullable & Default Value

    +

    基於 Faiss 的 HNSW SQ/PQ/PRQ

    透過與 Faiss 社群的密切合作,Faiss 中的 HNSW 演算法在功能和效能上都有顯著的改善。基於穩定性和可維護性的考量,Milvus 2.5 正式將 HNSW 的支援從 hnswlib 移轉到 Faiss。

    +

    在 Faiss 的基礎上,Milvus 2.5 支援 HNSW 的多種量化方法,以滿足不同場景的需求:SQ (Scalar Quantizers)、PQ (Product Quantizer)、PRQ (Product Residual Quantizer)。SQ 和 PQ 比較常見;SQ 提供良好的查詢效能和建立速度,而 PQ 則在相同的壓縮比下提供較佳的召回率。許多向量資料庫普遍使用二進位量化,這是 SQ 量化的一種簡單形式。

    +

    PRQ 是 PQ 與 AQ (Additive Quantizer) 的融合。與 PQ 相比,它需要更長的建立時間,才能提供更好的召回率,尤其是在高壓縮率時,說二進位壓縮。

    +

    聚類壓縮 (測試版)

    Milvus 2.5 引入了聚類壓縮 (Clustering Compaction),以加速搜尋並降低大型資料庫的成本。透過指定標量欄位作為聚類關鍵,資料會依範圍重新分配,以最佳化儲存與擷取。此功能的作用類似全局索引,可讓 Milvus 在根據聚類元資料進行查詢時,有效地剪裁資料,並在套用標量篩選條件時,提升搜尋效能。

    +

    如需詳細資訊,請參閱聚類壓縮

    +

    其他功能

    串流節點 (測試版)

    Milvus 2.5 引入了一個稱為串流節點 (streaming node) 的新元件,提供先寫後記錄 (WAL) 服務。這可讓 Milvus 在讀寫通道前後達成共識,解鎖新特性、功能和最佳化。Milvus 2.5 預設停用此功能,並將於 3.0 版正式提供。

    +

    IPv6 支援

    Milvus 現在支援 IPv6,擴大網路連線性與相容性。

    +

    CSV 大量匯入

    除了 JSON 和 Parquet 格式外,Milvus 現在還支援直接大量匯入 CSV 格式的資料。

    +

    加速查詢的表達式範本

    Milvus 現在支援表達式範本,提高表達式解析效率,特別是在使用複雜表達式的情況下。

    +

    如需詳細資訊,請參閱篩選模板

    +

    GroupBy 增強功能

      +
    • 可自訂群組大小:新增支援指定每個群組返回的項目數量。
    • +
    • 混合 GroupBy 搜尋:支援基於多向量列的混合 GroupBy 搜尋。
    • +
    +

    迭代器增強功能

      +
    • MVCC 支援:使用者現在可以使用迭代器,而不會受到後續資料變更 (例如插入與刪除) 的影響,這都要歸功於多版本並發控制 (Multi-Version Concurrency Control, MVCC)。
    • +
    • 持久游標:Milvus 現在支援 QueryIterator 的持久游標,讓使用者可以在 Milvus 重新啟動後,從最後一個位置恢復迭代,而不需要重新啟動整個迭代過程。
    • +
    +

    改進

    刪除優化

    透過優化鎖的使用和記憶體管理,提高了大規模刪除的速度並降低了記憶體使用量。

    +

    相依性升級

    升級至 ETCD 3.5.16 及 Pulsar 3.0.7 LTS,修正現有 CVE 並加強安全性。注意:升級至 Pulsar 3.x 與之前的 2.x 版本不相容。

    +

    對於已經有一個正常運作的 Milvus 部署的使用者,您需要先升級 ETCD 和 Pulsar 元件,才能使用新的特性和功能。詳情請參考Pulsar 從 2.x 升級到 3.x

    +

    本機儲存 V2

    在 Milvus 2.5 中引入了新的本地文件格式,提高了標量資料的載入和查詢效率,減少了記憶體開銷,並為未來的優化奠定了基礎。

    +

    表達式解析最佳化

    透過對重複表達式實施快取、升級 ANTLR,以及優化NOT IN 子句的效能,改善表達式解析。

    +

    改善 DDL 並發效能

    優化了資料定義語言 (DDL) 作業的並發效能。

    +

    RESTful API 功能對齊

    將 RESTful API 的功能與其他 SDK 統一。

    +

    安全性與組態更新

    支援 TLS 以確保在較複雜或企業環境中的節點間通訊安全。如需詳細資訊,請參閱安全性設定

    +

    壓縮效能增強

    移除混合壓縮中的最大區段限制,現在會優先處理較小的區段,以提高效率並加快大型或分散資料集的查詢速度。

    +

    基於分數的通道平衡

    引進可動態平衡各通道負載的政策,在大規模部署中提高資源利用率和整體穩定性。

    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.json new file mode 100644 index 000000000..2b0b4680b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import BGERerankFunction\n\n# Define the rerank function\nbge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = bge_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.991162\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: 0.032697\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: 0.006515\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"BGE","anchorList":[{"label":"BGE","href":"BGE","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.md new file mode 100644 index 000000000..47d70da1a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-bge.md @@ -0,0 +1,76 @@ +--- +id: rerankers-bge.md +order: 2 +summary: Milvus 透過`BGERerankFunction`類支援 BGE ranker 模型。此功能可讓您有效地為查詢-文件對的相關性進行評分。 +title: BGE +--- +

    BGE

    Milvus 透過BGERerankFunction class 支援BGE reranker 模型。此功能可讓您有效地評分查詢與文件對的相關性。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化BGERerankFunction

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +# Define the rerank function
    +bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要使用的模型名稱。您可以指定任何可用的 BGE reranker 模型名稱,例如BAAI/bge-reranker-base,BAAI/bge-reranker-large 等。如果您不指定此參數,則會使用BAAI/bge-reranker-v2-m3 。如需可用模型的清單,請參閱模型清單

    • +
    • device (字串)

      +

      可選。用於執行模型的裝置。如果未指定,模型將在 CPU 上執行。您可以指定cpu 為 CPU,cuda:n 為第 n 個 GPU 裝置。

    • +
    +

    然後,使用下列程式碼根據查詢結果重新排序文件:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = bge_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    預期的輸出與以下相似:

    +
    Index: 1
    +Score: 0.991162
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: 0.032697
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: 0.006515
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.json new file mode 100644 index 000000000..711fccdf0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CohereRerankFunction\n\n# Define the rerank function\ncohere_rf = CohereRerankFunction(\n model_name=\"rerank-english-v3.0\", # Specify the model name. Defaults to `rerank-english-v2.0`.\n api_key=COHERE_API_KEY # Replace with your Cohere API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = cohere_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.99691266\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.8578872\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.3589146\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Cohere","anchorList":[{"label":"Cohere","href":"Cohere","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.md new file mode 100644 index 000000000..738faf2e2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cohere.md @@ -0,0 +1,78 @@ +--- +id: rerankers-cohere.md +order: 3 +summary: >- + Milvus 透過 `CohereRerankFunction` 類別支援 Cohere ranker + 模型。此功能可讓您有效地為查詢與文件對的相關性進行評分。 +title: Rerankers Cohere +--- +

    Cohere

    Milvus 透過CohereRerankFunction 類別支援Cohere reranker 模型。此功能可讓您有效地評分查詢與文件對的相關性。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化CohereRerankFunction

    +
    from pymilvus.model.reranker import CohereRerankFunction
    +
    +# Define the rerank function
    +cohere_rf = CohereRerankFunction(
    +    model_name="rerank-english-v3.0",  # Specify the model name. Defaults to `rerank-english-v2.0`.
    +    api_key=COHERE_API_KEY # Replace with your Cohere API key
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要使用的模型名稱。您可以指定任何可用的 Cohere reranker 模型名稱,例如rerank-english-v3.0,rerank-multilingual-v3.0 等。如果不指定此參數,則會使用rerank-english-v2.0 。如需可用模型的清單,請參閱Rerank

    • +
    • api_key (字串)

      +

      存取 Cohere API 的 API 金鑰。有關如何建立 API 金鑰的資訊,請參閱Cohere dashboard

    • +
    +

    然後,使用下列程式碼根據查詢結果對文件進行 rerank:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = cohere_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    預期的輸出與以下相似:

    +
    Index: 1
    +Score: 0.99691266
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.8578872
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.3589146
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.json new file mode 100644 index 000000000..1cd868714 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import CrossEncoderRerankFunction\n\n# Define the rerank function\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = ce_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 6.250533\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 0\nScore: -2.954602\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n\nIndex: 3\nScore: -4.771512\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Cross Encoder","anchorList":[{"label":"交叉編碼器","href":"Cross-Encoder","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.md new file mode 100644 index 000000000..ad934645b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-cross-encoder.md @@ -0,0 +1,78 @@ +--- +id: rerankers-cross-encoder.md +order: 4 +summary: >- + Milvus 透過 `CrossEncoderRerankFunction` 類別支援 Cross Encoder reranker + 模型。此功能可讓您有效地為查詢與文件對的相關性進行評分。 +title: 交叉編碼器 +--- +

    交叉編碼器

    Milvus 透過CrossEncoderRerankFunction 類別支援交叉編碼器。此功能可讓您有效地評分查詢與文件對的相關性。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化CrossEncoderRerankFunction

    +
    from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +# Define the rerank function
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要使用的模型名稱。您可以指定任何可用的 Cross-Encoder 模型名稱,例如cross-encoder/ms-marco-TinyBERT-L-2-v2,cross-encoder/ms-marco-MiniLM-L-2-v2 等。如果不指定此参数,将使用空字符串。如需可用模型的清單,請參閱Pretrained Cross-Encoders

    • +
    • device (字串)

      +

      用於執行模型的裝置。您可以指定cpu 為 CPU,cuda:n 為第 n 個 GPU 裝置。

    • +
    +

    然後,使用下列程式碼根據查詢來重新排序文件:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = ce_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    預期的輸出與以下相似:

    +
    Index: 1
    +Score: 6.250533
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 0
    +Score: -2.954602
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    +Index: 3
    +Score: -4.771512
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.json new file mode 100644 index 000000000..a7f7c04fe --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import JinaRerankFunction\n\njina_rf = JinaRerankFunction(\n model_name=\"jina-reranker-v2-base-multilingual\", # Defaults to `jina-reranker-v2-base-multilingual`\n api_key=JINAAI_API_KEY\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = jina_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.937096\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.354210\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.349866\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Jina AI","anchorList":[{"label":"Jina AI","href":"Jina-AI","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.md new file mode 100644 index 000000000..204f53ba3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-jina.md @@ -0,0 +1,75 @@ +--- +id: rerankers-jina.md +order: 6 +summary: Milvus 透過 `JinaRerankFunction` 類別支援 Jina reranker 模型。此功能可讓您有效地評分查詢與文件對的相關性。 +title: Jina AI - Rerankers +--- +

    Jina AI

    Milvus 透過JinaRerankFunction類別支援 JinaAI ranker 模型。此功能可讓您有效地為查詢與文件對的相關性進行評分。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化JinaRerankFunction

    +
    from pymilvus.model.reranker import JinaRerankFunction
    +
    +jina_rf = JinaRerankFunction(
    +    model_name="jina-reranker-v2-base-multilingual", # Defaults to `jina-reranker-v2-base-multilingual`
    +    api_key=JINAAI_API_KEY
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要用做編碼的 Jina AI reranker 模型名稱。如果未指定此參數,則會使用jina-reranker-v2-base-multilingual 。如需可用模型的清單,請參閱Jina AI Rerankers

    • +
    • api_key (字串)

      +

      存取 Jina AI API 的 API 金鑰。

    • +
    +

    然後,使用下列程式碼根據查詢對文件進行 rerank:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = jina_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    預期的輸出與以下相似:

    +
    Index: 1
    +Score: 0.937096
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.354210
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.349866
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.json new file mode 100644 index 000000000..a99644375 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.json @@ -0,0 +1 @@ +{"codeList":["pip install pymilvus[model]\n# or pip install \"pymilvus[model]\" for zsh.\n","from pymilvus.model.reranker import BGERerankFunction\n","bge_rf = BGERerankFunction(\n model_name=\"BAAI/bge-reranker-v2-m3\", # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nbge_rf(query, documents)\n","[RerankResult(text=\"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\", score=0.9911615761470803, index=1),\n RerankResult(text=\"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\", score=0.0326971950177779, index=0),\n RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),\n RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]\n","entities = [\n {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\"}, \n {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\"}, \n {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, \n {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}\n]\n","from pymilvus import MilvusClient, DataType\n\nclient = MilvusClient(\n uri=\"http://10.102.6.214:19530\" # replace with your own Milvus server address\n)\n\nclient.drop_collection('test_collection')\n\n# define schema\n\nschema = client.create_schema(auto_id=False, enabel_dynamic_field=True)\n\nschema.add_field(field_name=\"doc_id\", datatype=DataType.INT64, is_primary=True, description=\"document id\")\nschema.add_field(field_name=\"doc_vector\", datatype=DataType.FLOAT_VECTOR, dim=384, description=\"document vector\")\nschema.add_field(field_name=\"doc_text\", datatype=DataType.VARCHAR, max_length=65535, description=\"document text\")\n\n# define index params\n\nindex_params = client.prepare_index_params()\n\nindex_params.add_index(field_name=\"doc_vector\", index_type=\"IVF_FLAT\", metric_type=\"IP\", params={\"nlist\": 128})\n\n# create collection\n\nclient.create_collection(collection_name=\"test_collection\", schema=schema, index_params=index_params)\n\n# insert data into collection\n\nclient.insert(collection_name=\"test_collection\", data=entities)\n\n# Output:\n# {'insert_count': 4, 'ids': [0, 1, 2, 3]}\n","# search results based on our query\n\nres = client.search(\n collection_name=\"test_collection\",\n data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector\n limit=3,\n output_fields=[\"doc_id\", \"doc_text\"]\n)\n\nfor i in res[0]:\n print(f'distance: {i[\"distance\"]}')\n print(f'doc_text: {i[\"entity\"][\"doc_text\"]}')\n","distance: 0.7235960960388184\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\ndistance: 0.6269873976707458\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\ndistance: 0.5340118408203125\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n","# use reranker to rerank search results\n\nfrom pymilvus.model.reranker import CrossEncoderRerankFunction\n\nce_rf = CrossEncoderRerankFunction(\n model_name=\"cross-encoder/ms-marco-MiniLM-L-6-v2\", # Specify the model name.\n device=\"cpu\" # Specify the device to use, e.g., 'cpu' or 'cuda:0'\n)\n\nreranked_results = ce_rf(\n query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',\n documents=[\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n ],\n top_k=3\n)\n\n# print the reranked results\nfor result in reranked_results:\n print(f'score: {result.score}')\n print(f'doc_text: {result.text}')\n","score: 6.250532627105713\ndoc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\nscore: -2.9546022415161133\ndoc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\nscore: -4.771512031555176\ndoc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n"],"headingContent":"Rerankers Overview","anchorList":[{"label":"重排器概述","href":"Rerankers-Overview","type":1,"isActive":false},{"label":"範例 1:使用 BGE rerank 函式根據查詢對文件進行排序","href":"Example-1-Use-BGE-rerank-function-to-rerank-documents-according-to-a-query","type":2,"isActive":false},{"label":"範例 2:使用 reranker 來強化搜尋結果的相關性","href":"Example-2-Use-a-reranker-to-enhance-relevance-of-search-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.md new file mode 100644 index 000000000..b00a3c6ae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-overview.md @@ -0,0 +1,208 @@ +--- +id: rerankers-overview.md +order: 1 +summary: PyMilvus 模型函式庫整合了 rerank 函式,以最佳化初始搜尋返回結果的順序。 +title: 重排器概述 +--- +

    重排器概述

    在資訊檢索和生成式人工智慧領域中,Reranker 是優化初始搜尋結果順序的重要工具。Reranker 與傳統的嵌入模型不同,它將查詢和文件作為輸入,並直接返回相似性分數,而不是嵌入。此分數表示輸入查詢與文件之間的相關性。

    +

    Reranker 通常在第一階段的檢索之後使用,通常是透過向量近似近鄰 (ANN) 技術完成。雖然 ANN 搜尋能夠有效率地取得廣泛的潛在相關結果集,但它們不一定會依據與查詢的實際語意親近程度來排列結果的優先順序。在此,rerankers 使用更深入的上下文分析來優化結果順序,通常會利用先進的機器學習模型,例如 BERT 或其他以 Transformer 為基礎的模型。如此一來,rerankers 就能大幅提升呈現給使用者的最終結果的準確性與相關性。

    +

    PyMilvus 模型函式庫整合了 rerank 功能,以最佳化初始搜尋所返回結果的順序。當您從 Milvus 擷取最接近的 embedings 之後,您可以利用這些 reranking 工具來優化搜尋結果,以提高搜尋結果的精確度。

    + + + + + + + + + + + +
    重排功能API 或開放源碼
    BGE開放源碼
    交叉編碼器開放源碼
    航海API
    CohereAPI
    Jina AIAPI
    +
    +
      +
    • 使用開放原始碼的 reranker 之前,請確認已下載並安裝所有必要的相依性與模型。

    • +
    • 對於以 API 為基礎的 rerankers,請向提供者取得 API 金鑰,並將其設定在適當的環境變數或參數中。

    • +
    +
    +

    範例 1:使用 BGE rerank 函式根據查詢對文件進行排序

    在本範例中,我們將示範如何使用BGE reranker根據特定查詢將搜尋結果重新排序。

    +

    要在PyMilvus 模型庫中使用 reranker,首先要安裝 PyMilvus 模型庫以及包含所有必要 reranking 工具的模型子套件:

    +
    pip install pymilvus[model]
    +# or pip install "pymilvus[model]" for zsh.
    +
    +

    要使用 BGE reranker,首先匯入BGERerankFunction class:

    +
    from pymilvus.model.reranker import BGERerankFunction
    +
    +

    然後,建立一個BGERerankFunction 範例來進行 reranking:

    +
    bge_rf = BGERerankFunction(
    +    model_name="BAAI/bge-reranker-v2-m3",  # Specify the model name. Defaults to `BAAI/bge-reranker-v2-m3`.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +

    若要根據查詢對文件進行排序,請使用下列程式碼:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +bge_rf(query, documents)
    +
    +

    預期的輸出與以下相似:

    +
    [RerankResult(text="The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.", score=0.9911615761470803, index=1),
    + RerankResult(text="In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.", score=0.0326971950177779, index=0),
    + RerankResult(text='The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.', score=0.006514905766152258, index=3),
    + RerankResult(text='In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.', score=0.0042116724917325935, index=2)]
    +
    +

    範例 2:使用 reranker 來強化搜尋結果的相關性

    在本指南中,我們將探討如何利用 PyMilvus 中的search() 方法來進行相似性搜尋,以及如何使用 reranker 來增強搜尋結果的相關性。我們的示範將使用下列資料集:

    +
    entities = [
    +    {'doc_id': 0, 'doc_vector': [-0.0372721,0.0101959,...,-0.114994], 'doc_text': "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence."}, 
    +    {'doc_id': 1, 'doc_vector': [-0.00308882,-0.0219905,...,-0.00795811], 'doc_text': "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals."}, 
    +    {'doc_id': 2, 'doc_vector': [0.00945078,0.00397605,...,-0.0286199], 'doc_text': 'In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.'}, 
    +    {'doc_id': 3, 'doc_vector': [-0.0391119,-0.00880096,...,-0.0109257], 'doc_text': 'The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.'}
    +]
    +
    +

    資料集元件

    +
      +
    • doc_id:每個文件的唯一識別碼。
    • +
    • doc_vector:代表文件的向量嵌入。關於產生內嵌的指引,請參閱Embeddings
    • +
    • doc_text:文件的文字內容。
    • +
    +

    準備工作

    在啟動相似性搜尋之前,您需要與 Milvus 建立連線、建立資料集、準備資料並將資料插入該資料集中。下面的程式碼片段說明了這些初步步驟。

    +
    from pymilvus import MilvusClient, DataType
    +
    +client = MilvusClient(
    +    uri="http://10.102.6.214:19530" # replace with your own Milvus server address
    +)
    +
    +client.drop_collection('test_collection')
    +
    +# define schema
    +
    +schema = client.create_schema(auto_id=False, enabel_dynamic_field=True)
    +
    +schema.add_field(field_name="doc_id", datatype=DataType.INT64, is_primary=True, description="document id")
    +schema.add_field(field_name="doc_vector", datatype=DataType.FLOAT_VECTOR, dim=384, description="document vector")
    +schema.add_field(field_name="doc_text", datatype=DataType.VARCHAR, max_length=65535, description="document text")
    +
    +# define index params
    +
    +index_params = client.prepare_index_params()
    +
    +index_params.add_index(field_name="doc_vector", index_type="IVF_FLAT", metric_type="IP", params={"nlist": 128})
    +
    +# create collection
    +
    +client.create_collection(collection_name="test_collection", schema=schema, index_params=index_params)
    +
    +# insert data into collection
    +
    +client.insert(collection_name="test_collection", data=entities)
    +
    +# Output:
    +# {'insert_count': 4, 'ids': [0, 1, 2, 3]}
    +
    +

    插入資料後,使用search 方法執行相似性搜尋。

    +
    # search results based on our query
    +
    +res = client.search(
    +    collection_name="test_collection",
    +    data=[[-0.045217834, 0.035171617, ..., -0.025117004]], # replace with your query vector
    +    limit=3,
    +    output_fields=["doc_id", "doc_text"]
    +)
    +
    +for i in res[0]:
    +    print(f'distance: {i["distance"]}')
    +    print(f'doc_text: {i["entity"]["doc_text"]}')
    +
    +

    預期的輸出與下面相似:

    +
    distance: 0.7235960960388184
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +distance: 0.6269873976707458
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +distance: 0.5340118408203125
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +

    使用 reranker 來強化搜尋結果

    然後,使用 reranking 步驟改善搜尋結果的相關性。在這個範例中,我們使用 PyMilvus 內建的CrossEncoderRerankFunction 來重新排列結果,以提高精確度。

    +
    # use reranker to rerank search results
    +
    +from pymilvus.model.reranker import CrossEncoderRerankFunction
    +
    +ce_rf = CrossEncoderRerankFunction(
    +    model_name="cross-encoder/ms-marco-MiniLM-L-6-v2",  # Specify the model name.
    +    device="cpu" # Specify the device to use, e.g., 'cpu' or 'cuda:0'
    +)
    +
    +reranked_results = ce_rf(
    +    query='What event in 1956 marked the official birth of artificial intelligence as a discipline?',
    +    documents=[
    +        "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +        "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +        "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +        "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +    ],
    +    top_k=3
    +)
    +
    +# print the reranked results
    +for result in reranked_results:
    +    print(f'score: {result.score}')
    +    print(f'doc_text: {result.text}')
    +
    +

    預期的輸出與以下相似:

    +
    score: 6.250532627105713
    +doc_text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +score: -2.9546022415161133
    +doc_text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +score: -4.771512031555176
    +doc_text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.json b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.json new file mode 100644 index 000000000..b88fc6efa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.json @@ -0,0 +1 @@ +{"codeList":["pip install --upgrade pymilvus\npip install \"pymilvus[model]\"\n","from pymilvus.model.reranker import VoyageRerankFunction\n\n# Define the rerank function\nvoyage_rf = VoyageRerankFunction(\n model_name=\"rerank-lite-1\", # Specify the model name. Defaults to `rerank-lite-1`.\n api_key=VOYAGE_API_KEY # Replace with your Voyage API key\n)\n","query = \"What event in 1956 marked the official birth of artificial intelligence as a discipline?\"\n\ndocuments = [\n \"In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\",\n \"The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\",\n \"In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.\",\n \"The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\"\n]\n\nresults = voyage_rf(\n query=query,\n documents=documents,\n top_k=3,\n)\n\nfor result in results:\n print(f\"Index: {result.index}\")\n print(f\"Score: {result.score:.6f}\")\n print(f\"Text: {result.text}\\n\")\n","Index: 1\nScore: 0.898438\nText: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.\n\nIndex: 3\nScore: 0.718750\nText: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.\n\nIndex: 0\nScore: 0.679688\nText: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.\n"],"headingContent":"Voyage","anchorList":[{"label":"航海","href":"Voyage","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.md b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.md new file mode 100644 index 000000000..77f217201 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/rerankers/rerankers-voyage.md @@ -0,0 +1,78 @@ +--- +id: rerankers-voyage.md +order: 5 +summary: >- + Milvus 透過 `VoyageRerankFunction` 類別支援 Voyage reranker + 模型。此功能可讓您有效地評分查詢與文件對的相關性。 +title: Rerankers Voyage +--- +

    航海

    Milvus 透過VoyageRerankFunction class 支援Voyage reranker 模型。此功能可讓您有效地評分查詢與文件對的相關性。

    +

    要使用此功能,請安裝必要的相依性:

    +
    pip install --upgrade pymilvus
    +pip install "pymilvus[model]"
    +
    +

    然後,實體化VoyageRerankFunction

    +
    from pymilvus.model.reranker import VoyageRerankFunction
    +
    +# Define the rerank function
    +voyage_rf = VoyageRerankFunction(
    +    model_name="rerank-lite-1",  # Specify the model name. Defaults to `rerank-lite-1`.
    +    api_key=VOYAGE_API_KEY # Replace with your Voyage API key
    +)
    +
    +

    參數

    +
      +
    • model_name (字串)

      +

      要用做編碼的 Voyage 模型名稱。如果不指定此參數,則會使用rerank-lite-1 。如需可用模型的清單,請參閱Rerankers

    • +
    • api_key (字串)

      +

      存取 Voyage API 的 API 金鑰。有關如何建立 API 金鑰的資訊,請參閱API 金鑰與 Python Client

    • +
    +

    然後,使用下列程式碼根據查詢對文件進行 rerank:

    +
    query = "What event in 1956 marked the official birth of artificial intelligence as a discipline?"
    +
    +documents = [
    +    "In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.",
    +    "The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.",
    +    "In 1951, British mathematician and computer scientist Alan Turing also developed the first program designed to play chess, demonstrating an early example of AI in game strategy.",
    +    "The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems."
    +]
    +
    +results = voyage_rf(
    +    query=query,
    +    documents=documents,
    +    top_k=3,
    +)
    +
    +for result in results:
    +    print(f"Index: {result.index}")
    +    print(f"Score: {result.score:.6f}")
    +    print(f"Text: {result.text}\n")
    +
    +

    預期的輸出與以下相似:

    +
    Index: 1
    +Score: 0.898438
    +Text: The Dartmouth Conference in 1956 is considered the birthplace of artificial intelligence as a field; here, John McCarthy and others coined the term 'artificial intelligence' and laid out its basic goals.
    +
    +Index: 3
    +Score: 0.718750
    +Text: The invention of the Logic Theorist by Allen Newell, Herbert A. Simon, and Cliff Shaw in 1955 marked the creation of the first true AI program, which was capable of solving logic problems, akin to proving mathematical theorems.
    +
    +Index: 0
    +Score: 0.679688
    +Text: In 1950, Alan Turing published his seminal paper, 'Computing Machinery and Intelligence,' proposing the Turing Test as a criterion of intelligence, a foundational concept in the philosophy and development of artificial intelligence.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.json b/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.json new file mode 100644 index 000000000..74d04166e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Audio Similarity Search","anchorList":[{"label":"音訊相似性搜尋","href":"Audio-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.md b/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.md new file mode 100644 index 000000000..eeeb34d24 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/audio_similarity_search.md @@ -0,0 +1,36 @@ +--- +id: audio_similarity_search.md +summary: 使用 Milvus 建立音訊相似性搜尋系統。 +title: 音訊相似性搜尋 +--- +

    音訊相似性搜尋

    本教學示範如何使用開放原始碼向量資料庫 Milvus 來建立音頻相似性搜尋系統。

    +

    所使用的 ML 模型和第三方軟體包括

    +
      +
    • PANNs (大型預訓音訊神經網路)
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    語音、音樂、音效等類型的音訊搜尋,讓快速查詢海量音訊資料並浮現相似聲音成為可能。音訊相似性搜尋系統的應用包括識別相似的音效、將 IP 侵犯減至最低等。音訊檢索可用於即時搜尋與監控線上媒體,以打擊侵犯智慧財產權的行為。它也在音訊資料的分類和統計分析中擔當著重要的角色。

    +


    +

    在本教程中,您將學習如何建立一個能夠傳回相似聲音片段的音訊相似性搜尋系統。上傳的音訊片段會使用 PANNs 轉換成向量。這些向量會儲存在 Milvus 中,Milvus 會自動為每個向量產生唯一的 ID。然後,使用者可以在 Milvus 中進行向量相似性搜尋,並查詢與 Milvus 所傳回的唯一向量 ID 相對應的音訊素材資料路徑。

    +


    +

    + + Audio_search + Audio_search Audio_search_demoAudio_search_demo

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.json new file mode 100644 index 000000000..bcb3bb2cd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-small\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","question = \"How is data stored in milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=3, # Return top 3 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","context = \"\\n\".join(\n [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]\n)\n","SYSTEM_PROMPT = \"\"\"\nHuman: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.\n\"\"\"\nUSER_PROMPT = f\"\"\"\nUse the following pieces of information enclosed in tags to provide an answer to the question enclosed in tags.\n\n{context}\n\n\n{question}\n\n\"\"\"\n","response = openai_client.chat.completions.create(\n model=\"gpt-3.5-turbo\",\n messages=[\n {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n {\"role\": \"user\", \"content\": USER_PROMPT},\n ],\n)\nprint(response.choices[0].message.content)\n"],"headingContent":"Build RAG with Milvus","anchorList":[{"label":"使用 Milvus 建立 RAG","href":"Build-RAG-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"建立 RAG","href":"Build-RAG","type":2,"isActive":false},{"label":"快速部署","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.md new file mode 100644 index 000000000..2169dcea6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/build-rag-with-milvus.md @@ -0,0 +1,250 @@ +--- +id: build-rag-with-milvus.md +summary: 使用 milvus 建立抹布 +title: 使用 Milvus 建立 RAG +--- +

    使用 Milvus 建立 RAG

    Open In Colab +GitHub Repository

    +

    +

    在本教程中,我們將教您如何使用 Milvus 建立 RAG(Retrieval-Augmented Generation) 管道。

    +

    RAG 系統結合了一個檢索系統和一個生成模型,以根據給定的提示生成新的文字。該系統首先使用 Milvus 從語料庫中檢索相關文件,然後根據檢索到的文件使用生成模型生成新文本。

    +

    準備工作

    依賴與環境

    $ pip install --upgrade pymilvus openai requests tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的依賴項目,您可能需要重新啟動運行時間。(點選螢幕上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,這樣就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備嵌入模型

    我們初始化 OpenAI 用戶端以準備嵌入模型。

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    定義一個使用 OpenAI client 產生文字嵌入的函式。我們使用text-embedding-3-small模型作為範例。

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    1536
    +[0.00988506618887186, -0.005540902726352215, 0.0068014683201909065, -0.03810417652130127, -0.018254263326525688, -0.041231658309698105, -0.007651153020560741, 0.03220026567578316, 0.01892443746328354, 0.00010708322952268645]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數 :

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:27<00:00,  2.67it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72,
    + 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
    + 'cost': 0}
    +
    +

    建立 RAG

    為查詢擷取資料

    讓我們指定一個關於 Milvus 的常見問題。

    +
    question = "How is data stored in milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前三名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=3,  # Return top 3 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7883545756340027
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6757288575172424
    +    ],
    +    [
    +        "How much does Milvus cost?\n\nMilvus is a 100% free open-source project.\n\nPlease adhere to [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) when using Milvus for production or distribution purposes.\n\nZilliz, the company behind Milvus, also offers a fully managed cloud version of the platform for those that don't want to build and maintain their own distributed instance. [Zilliz Cloud](https://zilliz.com/cloud) automatically maintains data reliability and allows users to pay only for what they use.\n\n###",
    +        0.6421123147010803
    +    ]
    +]
    +
    +

    使用 LLM 獲得 RAG 回應

    將擷取的文件轉換成字串格式。

    +
    context = "\n".join(
    +    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
    +)
    +
    +

    定義 Lanage Model 的系統和使用者提示。此提示與從 Milvus 擷取的文件組合。

    +
    SYSTEM_PROMPT = """
    +Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
    +"""
    +USER_PROMPT = f"""
    +Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
    +<context>
    +{context}
    +</context>
    +<question>
    +{question}
    +</question>
    +"""
    +
    +

    使用 OpenAI ChatGPT 根據提示產生回應。

    +
    response = openai_client.chat.completions.create(
    +    model="gpt-3.5-turbo",
    +    messages=[
    +        {"role": "system", "content": SYSTEM_PROMPT},
    +        {"role": "user", "content": USER_PROMPT},
    +    ],
    +)
    +print(response.choices[0].message.content)
    +
    +
    Milvus stores data in persistent storage as incremental logs, including inserted data (vector data, scalar data, and collection-specific schema) and metadata. Inserted data is stored in various object storage backends like MinIO, AWS S3, Google Cloud Storage, Azure Blob Storage, Alibaba Cloud OSS, and Tencent Cloud Object Storage. Metadata generated within Milvus is stored in etcd.
    +
    +

    快速部署

    若要瞭解如何使用本教學開始線上示範,請參考範例應用程式

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.json new file mode 100644 index 000000000..783b97690 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install tqdm\n$ pip install anthropic\n","$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","from pymilvus.model.dense import VoyageEmbeddingFunction\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus.model.reranker import CohereRerankFunction\n\nfrom typing import List, Dict, Any\nfrom typing import Callable\nfrom pymilvus import (\n MilvusClient,\n DataType,\n AnnSearchRequest,\n RRFRanker,\n)\nfrom tqdm import tqdm\nimport json\nimport anthropic\n\n\nclass MilvusContextualRetriever:\n def __init__(\n self,\n uri=\"milvus.db\",\n collection_name=\"contexual_bgem3\",\n dense_embedding_function=None,\n use_sparse=False,\n sparse_embedding_function=None,\n use_contextualize_embedding=False,\n anthropic_client=None,\n use_reranker=False,\n rerank_function=None,\n ):\n self.collection_name = collection_name\n\n # For Milvus-lite, uri is a local path like \"./milvus.db\"\n # For Milvus standalone service, uri is like \"http://localhost:19530\"\n # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.\n self.client = MilvusClient(uri)\n\n self.embedding_function = dense_embedding_function\n\n self.use_sparse = use_sparse\n self.sparse_embedding_function = None\n\n self.use_contextualize_embedding = use_contextualize_embedding\n self.anthropic_client = anthropic_client\n\n self.use_reranker = use_reranker\n self.rerank_function = rerank_function\n\n if use_sparse is True and sparse_embedding_function:\n self.sparse_embedding_function = sparse_embedding_function\n elif sparse_embedding_function is False:\n raise ValueError(\n \"Sparse embedding function cannot be None if use_sparse is False\"\n )\n else:\n pass\n\n def build_collection(self):\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_field=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"dense_vector\",\n datatype=DataType.FLOAT_VECTOR,\n dim=self.embedding_function.dim,\n )\n if self.use_sparse is True:\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n if self.use_sparse is True:\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"IP\",\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n enable_dynamic_field=True,\n )\n\n def insert_data(self, chunk, metadata):\n dense_vec = self.embedding_function([chunk])[0]\n if self.use_sparse is True:\n sparse_result = self.sparse_embedding_function.encode_documents([chunk])\n if type(sparse_result) == dict:\n sparse_vec = sparse_result[\"sparse\"][[0]]\n else:\n sparse_vec = sparse_result[[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def insert_contextualized_data(self, doc, chunk, metadata):\n contextualized_text, usage = self.situate_context(doc, chunk)\n metadata[\"context\"] = contextualized_text\n text_to_embed = f\"{chunk}\\n\\n{contextualized_text}\"\n dense_vec = self.embedding_function([text_to_embed])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_documents(\n [text_to_embed]\n )[\"sparse\"][[0]]\n self.client.insert(\n collection_name=self.collection_name,\n data={\n \"dense_vector\": dense_vec,\n \"sparse_vector\": sparse_vec,\n **metadata,\n },\n )\n else:\n self.client.insert(\n collection_name=self.collection_name,\n data={\"dense_vector\": dense_vec, **metadata},\n )\n\n def situate_context(self, doc: str, chunk: str):\n DOCUMENT_CONTEXT_PROMPT = \"\"\"\n \n {doc_content}\n \n \"\"\"\n\n CHUNK_CONTEXT_PROMPT = \"\"\"\n Here is the chunk we want to situate within the whole document\n \n {chunk_content}\n \n\n Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.\n Answer only with the succinct context and nothing else.\n \"\"\"\n\n response = self.anthropic_client.beta.prompt_caching.messages.create(\n model=\"claude-3-haiku-20240307\",\n max_tokens=1000,\n temperature=0.0,\n messages=[\n {\n \"role\": \"user\",\n \"content\": [\n {\n \"type\": \"text\",\n \"text\": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),\n \"cache_control\": {\n \"type\": \"ephemeral\"\n }, # we will make use of prompt caching for the full documents\n },\n {\n \"type\": \"text\",\n \"text\": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),\n },\n ],\n },\n ],\n extra_headers={\"anthropic-beta\": \"prompt-caching-2024-07-31\"},\n )\n return response.content[0].text, response.usage\n\n def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:\n dense_vec = self.embedding_function([query])[0]\n if self.use_sparse is True:\n sparse_vec = self.sparse_embedding_function.encode_queries([query])[\n \"sparse\"\n ][[0]]\n\n req_list = []\n if self.use_reranker:\n k = k * 10\n if self.use_sparse is True:\n req_list = []\n dense_search_param = {\n \"data\": [dense_vec],\n \"anns_field\": \"dense_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n dense_req = AnnSearchRequest(**dense_search_param)\n req_list.append(dense_req)\n\n sparse_search_param = {\n \"data\": [sparse_vec],\n \"anns_field\": \"sparse_vector\",\n \"param\": {\"metric_type\": \"IP\"},\n \"limit\": k * 2,\n }\n sparse_req = AnnSearchRequest(**sparse_search_param)\n\n req_list.append(sparse_req)\n\n docs = self.client.hybrid_search(\n self.collection_name,\n req_list,\n RRFRanker(),\n k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n else:\n docs = self.client.search(\n self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=[\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n \"context\",\n ],\n )\n if self.use_reranker and self.use_contextualize_embedding:\n reranked_texts = []\n reranked_docs = []\n for i in range(k):\n if self.use_contextualize_embedding:\n reranked_texts.append(\n f\"{docs[0][i]['entity']['content']}\\n\\n{docs[0][i]['entity']['context']}\"\n )\n else:\n reranked_texts.append(f\"{docs[0][i]['entity']['content']}\")\n results = self.rerank_function(query, reranked_texts)\n for result in results:\n reranked_docs.append(docs[0][result.index])\n docs[0] = reranked_docs\n return docs\n\n\ndef evaluate_retrieval(\n queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20\n) -> Dict[str, float]:\n total_score = 0\n total_queries = len(queries)\n for query_item in tqdm(queries, desc=\"Evaluating retrieval\"):\n query = query_item[\"query\"]\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n # Find all golden chunk contents\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (\n doc\n for doc in query_item[\"golden_documents\"]\n if doc[\"uuid\"] == doc_uuid\n ),\n None,\n )\n if not golden_doc:\n print(f\"Warning: Golden document not found for UUID {doc_uuid}\")\n continue\n\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if not golden_chunk:\n print(\n f\"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}\"\n )\n continue\n\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n if not golden_contents:\n print(f\"Warning: No golden contents found for query: {query}\")\n continue\n\n retrieved_docs = retrieval_function(query, db, k=k)\n\n # Count how many golden chunks are in the top k retrieved documents\n chunks_found = 0\n for golden_content in golden_contents:\n for doc in retrieved_docs[0][:k]:\n retrieved_content = doc[\"entity\"][\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n total_score += query_score\n\n average_score = total_score / total_queries\n pass_at_n = average_score * 100\n return {\n \"pass_at_n\": pass_at_n,\n \"average_score\": average_score,\n \"total_queries\": total_queries,\n }\n\n\ndef retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:\n return db.search(query, k=k)\n\n\ndef load_jsonl(file_path: str) -> List[Dict[str, Any]]:\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndef evaluate_db(db, original_jsonl_path: str, k):\n # Load the original JSONL data for queries and ground truth\n original_data = load_jsonl(original_jsonl_path)\n\n # Evaluate retrieval\n results = evaluate_retrieval(original_data, retrieve_base, db, k)\n print(f\"Pass@{k}: {results['pass_at_n']:.2f}%\")\n print(f\"Total Score: {results['average_score']}\")\n print(f\"Total queries: {results['total_queries']}\")\n","dense_ef = VoyageEmbeddingFunction(api_key=\"your-voyage-api-key\", model_name=\"voyage-2\")\nsparse_ef = BGEM3EmbeddingFunction()\ncohere_rf = CohereRerankFunction(api_key=\"your-cohere-api-key\")\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n","standard_retriever = MilvusContextualRetriever(\n uri=\"standard.db\", collection_name=\"standard\", dense_embedding_function=dense_ef\n)\n\nstandard_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(standard_retriever, \"evaluation_set.jsonl\", 5)\n","hybrid_retriever = MilvusContextualRetriever(\n uri=\"hybrid.db\",\n collection_name=\"hybrid\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n)\n\nhybrid_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n hybrid_retriever.insert_data(chunk_content, metadata)\n","evaluate_db(hybrid_retriever, \"evaluation_set.jsonl\", 5)\n","anthropic_client = anthropic.Anthropic(\n api_key=\"your-anthropic-api-key\",\n)\n","contextual_retriever = MilvusContextualRetriever(\n uri=\"contextual.db\",\n collection_name=\"contextual\",\n dense_embedding_function=dense_ef,\n use_sparse=True,\n sparse_embedding_function=sparse_ef,\n use_contextualize_embedding=True,\n anthropic_client=anthropic_client,\n)\n\ncontextual_retriever.build_collection()\nfor doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n contextual_retriever.insert_contextualized_data(\n doc_content, chunk_content, metadata\n )\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n","contextual_retriever.use_reranker = True\ncontextual_retriever.rerank_function = cohere_rf\n","evaluate_db(contextual_retriever, \"evaluation_set.jsonl\", 5)\n"],"headingContent":"Contextual Retrieval with Milvus","anchorList":[{"label":"使用 Milvus 進行上下文檢索","href":"Contextual-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"下載資料","href":"Download-Data","type":2,"isActive":false},{"label":"定義 Retriever","href":"Define-Retriever","type":2,"isActive":false},{"label":"實驗一:標準檢索","href":"Experiment-I-Standard-Retrieval","type":2,"isActive":false},{"label":"實驗二:混合式檢索","href":"Experiment-II-Hybrid-Retrieval","type":2,"isActive":false},{"label":"實驗三:內容檢索","href":"Experiment-III-Contextual-Retrieval","type":2,"isActive":false},{"label":"實驗四:使用 Reranker 進行上下文檢索","href":"Experiment-IV-Contextual-Retrieval-with-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.md new file mode 100644 index 000000000..c0b4f1067 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/contextual_retrieval_with_milvus.md @@ -0,0 +1,617 @@ +--- +id: contextual_retrieval_with_milvus.md +summary: >- + 上下文檢索(Contextal Retrieval)是 Anthropic + 提出的一種先進檢索方法,用以解決目前的檢索增強世代(Retrieval-Augmented + Generation,RAG)解決方案中出現的文塊語意隔離(semantic isolation of chunks)問題。在目前實用的 RAG + 范例中,文件會被分割成幾個區塊,並使用向量資料庫來搜尋查詢,擷取最相關的區塊。之後,LLM + 會使用這些擷取的分塊來回應查詢。然而,這種分塊過程可能會導致上下文資訊的遺失,使得擷取器難以判斷相關性。 +title: 使用 Milvus 進行上下文檢索 +--- +

    使用 Milvus 進行上下文檢索

    Open In Colab +GitHub Repository

    +

    + + image + image Contextual Retrieval是 Anthropic 提出的進階檢索方法,用以解決目前的 Retrieval-Augmented Generation (RAG) 解決方案中出現的語意分離問題 (semantic isolation of chunks)。在目前實用的 RAG 范例中,文件會被分割成幾個區塊,並使用向量資料庫來搜尋查詢,擷取最相關的區塊。之後,LLM 會使用這些擷取的分塊來回應查詢。然而,這個分塊過程可能會造成上下文資訊的遺失,使得擷取者難以判斷相關性。

    +

    上下文檢索改善了傳統的檢索系統,在嵌入或編入索引之前,先將相關上下文加入每個文件塊,以提高準確性並減少檢索錯誤。結合混合檢索和重排等技術,它可以增強檢索-增強生成 (RAG) 系統,特別是針對大型知識庫。此外,如果搭配即時快取,它還能提供具成本效益的解決方案,大幅降低延遲時間和作業成本,每百萬個文件標記的上下文區塊成本約為 1.02 美元。這使其成為處理大型知識庫的可擴充且有效率的方法。Anthropic 的解決方案展現出兩項精闢之處:

    +
      +
    • Document Enhancement:查詢重寫(Query rewriting)是現代資訊檢索的重要技術,通常會使用輔助資訊來使查詢內容更豐富。同樣地,為了在 RAG 中達到更好的效能,在索引之前使用 LLM 對文件進行預處理(例如清理資料來源、補充遺失的資訊、總結等),可以大幅提高檢索到相關文件的機會。換句話說,這個預處理步驟有助於使文件在相關性方面更接近查詢。
    • +
    • Low-Cost Processing by Caching Long Context:使用 LLM 處理文件時,一個常見的顧慮是成本問題。KVCache 是一種流行的解決方案,它允許重覆使用相同前文的中間結果。雖然大多數主機 LLM 供應商會讓這項功能對使用者透明,但 Anthropic 卻讓使用者可以控制快取過程。當快取命中時,大部分的計算都可以被儲存(這在長上下文保持相同,但每個查詢的指令改變時很常見)。如需詳細資訊,請點選此處。
    • +
    +

    在本筆記簿中,我們將示範如何使用 Milvus 與 LLM 執行上下文檢索,結合密集-稀疏混合檢索與 reranker 來建立一個逐步強大的檢索系統。資料和實驗設定都是以上下文檢索為基礎。

    +

    準備工作

    安裝相依性

    $ pip install "pymilvus[model]"
    +$ pip install tqdm
    +$ pip install anthropic
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的依賴項目,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    您需要 Cohere、Voyage 和 Anthropic 的 API 金鑰才能執行程式碼。

    +

    下載資料

    以下指令將下載原始 Anthropic演示中使用的範例資料。

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    定義 Retriever

    這個類別的設計非常靈活,讓您可以根據需求選擇不同的擷取模式。透過在初始化方法中指定選項,您可以決定是否使用上下文擷取、混合搜尋(結合密集與稀疏的擷取方法),或是使用 reranker 來強化結果。

    +
    from pymilvus.model.dense import VoyageEmbeddingFunction
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus.model.reranker import CohereRerankFunction
    +
    +from typing import List, Dict, Any
    +from typing import Callable
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +from tqdm import tqdm
    +import json
    +import anthropic
    +
    +
    +class MilvusContextualRetriever:
    +    def __init__(
    +        self,
    +        uri="milvus.db",
    +        collection_name="contexual_bgem3",
    +        dense_embedding_function=None,
    +        use_sparse=False,
    +        sparse_embedding_function=None,
    +        use_contextualize_embedding=False,
    +        anthropic_client=None,
    +        use_reranker=False,
    +        rerank_function=None,
    +    ):
    +        self.collection_name = collection_name
    +
    +        # For Milvus-lite, uri is a local path like "./milvus.db"
    +        # For Milvus standalone service, uri is like "http://localhost:19530"
    +        # For Zilliz Clond, please set `uri` and `token`, which correspond to the [Public Endpoint and API key](https://docs.zilliz.com/docs/on-zilliz-cloud-console#cluster-details) in Zilliz Cloud.
    +        self.client = MilvusClient(uri)
    +
    +        self.embedding_function = dense_embedding_function
    +
    +        self.use_sparse = use_sparse
    +        self.sparse_embedding_function = None
    +
    +        self.use_contextualize_embedding = use_contextualize_embedding
    +        self.anthropic_client = anthropic_client
    +
    +        self.use_reranker = use_reranker
    +        self.rerank_function = rerank_function
    +
    +        if use_sparse is True and sparse_embedding_function:
    +            self.sparse_embedding_function = sparse_embedding_function
    +        elif sparse_embedding_function is False:
    +            raise ValueError(
    +                "Sparse embedding function cannot be None if use_sparse is False"
    +            )
    +        else:
    +            pass
    +
    +    def build_collection(self):
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_field=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="dense_vector",
    +            datatype=DataType.FLOAT_VECTOR,
    +            dim=self.embedding_function.dim,
    +        )
    +        if self.use_sparse is True:
    +            schema.add_field(
    +                field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +            )
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +        if self.use_sparse is True:
    +            index_params.add_index(
    +                field_name="sparse_vector",
    +                index_type="SPARSE_INVERTED_INDEX",
    +                metric_type="IP",
    +            )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +            enable_dynamic_field=True,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        dense_vec = self.embedding_function([chunk])[0]
    +        if self.use_sparse is True:
    +            sparse_result = self.sparse_embedding_function.encode_documents([chunk])
    +            if type(sparse_result) == dict:
    +                sparse_vec = sparse_result["sparse"][[0]]
    +            else:
    +                sparse_vec = sparse_result[[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def insert_contextualized_data(self, doc, chunk, metadata):
    +        contextualized_text, usage = self.situate_context(doc, chunk)
    +        metadata["context"] = contextualized_text
    +        text_to_embed = f"{chunk}\n\n{contextualized_text}"
    +        dense_vec = self.embedding_function([text_to_embed])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_documents(
    +                [text_to_embed]
    +            )["sparse"][[0]]
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={
    +                    "dense_vector": dense_vec,
    +                    "sparse_vector": sparse_vec,
    +                    **metadata,
    +                },
    +            )
    +        else:
    +            self.client.insert(
    +                collection_name=self.collection_name,
    +                data={"dense_vector": dense_vec, **metadata},
    +            )
    +
    +    def situate_context(self, doc: str, chunk: str):
    +        DOCUMENT_CONTEXT_PROMPT = """
    +        <document>
    +        {doc_content}
    +        </document>
    +        """
    +
    +        CHUNK_CONTEXT_PROMPT = """
    +        Here is the chunk we want to situate within the whole document
    +        <chunk>
    +        {chunk_content}
    +        </chunk>
    +
    +        Please give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk.
    +        Answer only with the succinct context and nothing else.
    +        """
    +
    +        response = self.anthropic_client.beta.prompt_caching.messages.create(
    +            model="claude-3-haiku-20240307",
    +            max_tokens=1000,
    +            temperature=0.0,
    +            messages=[
    +                {
    +                    "role": "user",
    +                    "content": [
    +                        {
    +                            "type": "text",
    +                            "text": DOCUMENT_CONTEXT_PROMPT.format(doc_content=doc),
    +                            "cache_control": {
    +                                "type": "ephemeral"
    +                            },  # we will make use of prompt caching for the full documents
    +                        },
    +                        {
    +                            "type": "text",
    +                            "text": CHUNK_CONTEXT_PROMPT.format(chunk_content=chunk),
    +                        },
    +                    ],
    +                },
    +            ],
    +            extra_headers={"anthropic-beta": "prompt-caching-2024-07-31"},
    +        )
    +        return response.content[0].text, response.usage
    +
    +    def search(self, query: str, k: int = 20) -> List[Dict[str, Any]]:
    +        dense_vec = self.embedding_function([query])[0]
    +        if self.use_sparse is True:
    +            sparse_vec = self.sparse_embedding_function.encode_queries([query])[
    +                "sparse"
    +            ][[0]]
    +
    +        req_list = []
    +        if self.use_reranker:
    +            k = k * 10
    +        if self.use_sparse is True:
    +            req_list = []
    +            dense_search_param = {
    +                "data": [dense_vec],
    +                "anns_field": "dense_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            dense_req = AnnSearchRequest(**dense_search_param)
    +            req_list.append(dense_req)
    +
    +            sparse_search_param = {
    +                "data": [sparse_vec],
    +                "anns_field": "sparse_vector",
    +                "param": {"metric_type": "IP"},
    +                "limit": k * 2,
    +            }
    +            sparse_req = AnnSearchRequest(**sparse_search_param)
    +
    +            req_list.append(sparse_req)
    +
    +            docs = self.client.hybrid_search(
    +                self.collection_name,
    +                req_list,
    +                RRFRanker(),
    +                k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        else:
    +            docs = self.client.search(
    +                self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=[
    +                    "content",
    +                    "original_uuid",
    +                    "doc_id",
    +                    "chunk_id",
    +                    "original_index",
    +                    "context",
    +                ],
    +            )
    +        if self.use_reranker and self.use_contextualize_embedding:
    +            reranked_texts = []
    +            reranked_docs = []
    +            for i in range(k):
    +                if self.use_contextualize_embedding:
    +                    reranked_texts.append(
    +                        f"{docs[0][i]['entity']['content']}\n\n{docs[0][i]['entity']['context']}"
    +                    )
    +                else:
    +                    reranked_texts.append(f"{docs[0][i]['entity']['content']}")
    +            results = self.rerank_function(query, reranked_texts)
    +            for result in results:
    +                reranked_docs.append(docs[0][result.index])
    +            docs[0] = reranked_docs
    +        return docs
    +
    +
    +def evaluate_retrieval(
    +    queries: List[Dict[str, Any]], retrieval_function: Callable, db, k: int = 20
    +) -> Dict[str, float]:
    +    total_score = 0
    +    total_queries = len(queries)
    +    for query_item in tqdm(queries, desc="Evaluating retrieval"):
    +        query = query_item["query"]
    +        golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +        # Find all golden chunk contents
    +        golden_contents = []
    +        for doc_uuid, chunk_index in golden_chunk_uuids:
    +            golden_doc = next(
    +                (
    +                    doc
    +                    for doc in query_item["golden_documents"]
    +                    if doc["uuid"] == doc_uuid
    +                ),
    +                None,
    +            )
    +            if not golden_doc:
    +                print(f"Warning: Golden document not found for UUID {doc_uuid}")
    +                continue
    +
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if not golden_chunk:
    +                print(
    +                    f"Warning: Golden chunk not found for index {chunk_index} in document {doc_uuid}"
    +                )
    +                continue
    +
    +            golden_contents.append(golden_chunk["content"].strip())
    +
    +        if not golden_contents:
    +            print(f"Warning: No golden contents found for query: {query}")
    +            continue
    +
    +        retrieved_docs = retrieval_function(query, db, k=k)
    +
    +        # Count how many golden chunks are in the top k retrieved documents
    +        chunks_found = 0
    +        for golden_content in golden_contents:
    +            for doc in retrieved_docs[0][:k]:
    +                retrieved_content = doc["entity"]["content"].strip()
    +                if retrieved_content == golden_content:
    +                    chunks_found += 1
    +                    break
    +
    +        query_score = chunks_found / len(golden_contents)
    +        total_score += query_score
    +
    +    average_score = total_score / total_queries
    +    pass_at_n = average_score * 100
    +    return {
    +        "pass_at_n": pass_at_n,
    +        "average_score": average_score,
    +        "total_queries": total_queries,
    +    }
    +
    +
    +def retrieve_base(query: str, db, k: int = 20) -> List[Dict[str, Any]]:
    +    return db.search(query, k=k)
    +
    +
    +def load_jsonl(file_path: str) -> List[Dict[str, Any]]:
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +def evaluate_db(db, original_jsonl_path: str, k):
    +    # Load the original JSONL data for queries and ground truth
    +    original_data = load_jsonl(original_jsonl_path)
    +
    +    # Evaluate retrieval
    +    results = evaluate_retrieval(original_data, retrieve_base, db, k)
    +    print(f"Pass@{k}: {results['pass_at_n']:.2f}%")
    +    print(f"Total Score: {results['average_score']}")
    +    print(f"Total queries: {results['total_queries']}")
    +
    +

    現在您需要為接下來的實驗初始化這些模型。您可以使用 PyMilvus 模型庫輕鬆切換到其他模型。

    +
    dense_ef = VoyageEmbeddingFunction(api_key="your-voyage-api-key", model_name="voyage-2")
    +sparse_ef = BGEM3EmbeddingFunction()
    +cohere_rf = CohereRerankFunction(api_key="your-cohere-api-key")
    +
    +
    Fetching 30 files:   0%|          | 0/30 [00:00<?, ?it/s]
    +
    +
    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +

    實驗一:標準檢索

    標準擷取只使用密集內嵌來擷取相關的文件。在這個實驗中,我們會使用 Pass@5 來重現原始 repo 的結果。

    +
    standard_retriever = MilvusContextualRetriever(
    +    uri="standard.db", collection_name="standard", dense_embedding_function=dense_ef
    +)
    +
    +standard_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(standard_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [01:29<00:00,  2.77it/s]
    +
    +Pass@5: 80.92%
    +Total Score: 0.8091877880184332
    +Total queries: 248
    +
    +

    實驗二:混合式檢索

    既然我們使用 Voyage embedding 已經獲得了令人滿意的結果,我們將繼續使用 BGE-M3 模型進行混合檢索,該模型會產生強大的稀疏嵌入。密集檢索與稀疏檢索的結果將使用 Reciprocal Rank Fusion (RRF) 方法結合,產生混合結果。

    +
    hybrid_retriever = MilvusContextualRetriever(
    +    uri="hybrid.db",
    +    collection_name="hybrid",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +)
    +
    +hybrid_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        hybrid_retriever.insert_data(chunk_content, metadata)
    +
    +
    evaluate_db(hybrid_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:09<00:00,  1.92it/s]
    +
    +Pass@5: 84.69%
    +Total Score: 0.8469182027649771
    +Total queries: 248
    +
    +

    實驗三:內容檢索

    混合式檢索顯示出了改進,但是應用上下文檢索方法可以進一步增強檢索結果。為了達到這個目的,我們會使用 Anthropic 的語言模型,為每個 chunk 預先加入整個文件的上下文。

    +
    anthropic_client = anthropic.Anthropic(
    +    api_key="your-anthropic-api-key",
    +)
    +
    +
    contextual_retriever = MilvusContextualRetriever(
    +    uri="contextual.db",
    +    collection_name="contextual",
    +    dense_embedding_function=dense_ef,
    +    use_sparse=True,
    +    sparse_embedding_function=sparse_ef,
    +    use_contextualize_embedding=True,
    +    anthropic_client=anthropic_client,
    +)
    +
    +contextual_retriever.build_collection()
    +for doc in dataset:
    +    doc_content = doc["content"]
    +    for chunk in doc["chunks"]:
    +        metadata = {
    +            "doc_id": doc["doc_id"],
    +            "original_uuid": doc["original_uuid"],
    +            "chunk_id": chunk["chunk_id"],
    +            "original_index": chunk["original_index"],
    +            "content": chunk["content"],
    +        }
    +        chunk_content = chunk["content"]
    +        contextual_retriever.insert_contextualized_data(
    +            doc_content, chunk_content, metadata
    +        )
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
     Evaluating retrieval: 100%|██████████| 248/248 [01:55<00:00,  2.15it/s]
    +Pass@5: 87.14%
    +Total Score: 0.8713517665130568
    +Total queries: 248 
    +
    +

    實驗四:使用 Reranker 進行上下文檢索

    加入 Cohere reranker 可以進一步改善結果。我們不需要另外初始化一個帶有 reranker 的新retriever,只要簡單地設定現有的 retriever 使用 reranker 就可以增強效能。

    +
    contextual_retriever.use_reranker = True
    +contextual_retriever.rerank_function = cohere_rf
    +
    +
    evaluate_db(contextual_retriever, "evaluation_set.jsonl", 5)
    +
    +
    Evaluating retrieval: 100%|██████████| 248/248 [02:02<00:00,  2.00it/s]
    +Pass@5: 90.91%
    +Total Score: 0.9090821812596005
    +Total queries: 248
    +
    +

    我們已經展示了幾種改善擷取效能的方法。透過更多針對情境的臨時設計,情境擷取顯示出以低成本預先處理文件的巨大潛力,進而產生更好的 RAG 系統。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.json b/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.json new file mode 100644 index 000000000..b443f3e80 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"DNA Sequence Classification","anchorList":[{"label":"DNA 序列分類","href":"DNA-Sequence-Classification","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.md b/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.md new file mode 100644 index 000000000..ab691d49e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/dna_sequence_classification.md @@ -0,0 +1,36 @@ +--- +id: dna_sequence_classification.md +summary: 使用 Milvus 建立 DNA 序列分類系統。 +title: DNA 序列分類 +--- +

    DNA 序列分類

    本教學示範如何使用開源向量資料庫 Milvus 建立 DNA 序列分類模型。

    +

    所使用的 ML 模型和第三方軟體包括

    +
      +
    • CountVectorizer
    • +
    • MySQL
    • +
    • 湯熙
    • +
    +


    +

    DNA 序列是基因溯源、物種鑑定、疾病診斷等眾多領域的流行概念。各行各業都在渴求更智慧、更有效率的研究方法,而人工智慧尤其在生物和醫學領域吸引了許多人的注意。越來越多的科學家和研究人員在生物資訊學領域的機器學習和深度學習方面做出了貢獻。為了讓實驗結果更具說服力,一個常見的選擇就是增加樣本量。基因組學中與大數據的合作,為現實中的應用帶來更多可能性。然而,傳統的序列比對有其限制,使其不適用於大型資料集。為了在現實中少做取捨,對於 DNA 序列的大型資料集,向量化是一個不錯的選擇。

    +


    +

    在本教程中,您將學習如何建立 DNA 序列分類模型。本教學使用 CountVectorizer 來擷取 DNA 序列的特徵,並將其轉換成向量。之後,這些向量會儲存在 Milvus 中,而其對應的 DNA 類別則會儲存在 MySQL 中。使用者可以在 Milvus 中進行向量相似性搜尋,並從 MySQL 中調出對應的 DNA 分類。

    +


    +

    + + dna + DNA

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.json new file mode 100644 index 000000000..a4f5638fa --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json\n$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl\n","pip install \"pymilvus[model]\" -U \n","import json\n\nfrom pymilvus import (\n MilvusClient,\n DataType,\n Function,\n FunctionType,\n AnnSearchRequest,\n RRFRanker,\n)\n\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\n\n\nclass HybridRetriever:\n def __init__(self, uri, collection_name=\"hybrid\", dense_embedding_function=None):\n self.uri = uri\n self.collection_name = collection_name\n self.embedding_function = dense_embedding_function\n self.use_reranker = True\n self.use_sparse = True\n self.client = MilvusClient(uri=uri)\n\n def build_collection(self):\n if isinstance(self.embedding_function.dim, dict):\n dense_dim = self.embedding_function.dim[\"dense\"]\n else:\n dense_dim = self.embedding_function.dim\n\n tokenizer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"length\",\n \"max\": 200,\n },\n {\"type\": \"stemmer\", \"language\": \"english\"},\n {\n \"type\": \"stop\",\n \"stop_words\": [\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"but\",\n \"by\",\n \"for\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"no\",\n \"not\",\n \"of\",\n \"on\",\n \"or\",\n \"such\",\n \"that\",\n \"the\",\n \"their\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"to\",\n \"was\",\n \"will\",\n \"with\",\n ],\n },\n ],\n }\n\n schema = MilvusClient.create_schema()\n schema.add_field(\n field_name=\"pk\",\n datatype=DataType.VARCHAR,\n is_primary=True,\n auto_id=True,\n max_length=100,\n )\n schema.add_field(\n field_name=\"content\",\n datatype=DataType.VARCHAR,\n max_length=65535,\n analyzer_params=tokenizer_params,\n enable_match=True,\n enable_analyzer=True,\n )\n schema.add_field(\n field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR\n )\n schema.add_field(\n field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=dense_dim\n )\n schema.add_field(\n field_name=\"original_uuid\", datatype=DataType.VARCHAR, max_length=128\n )\n schema.add_field(field_name=\"doc_id\", datatype=DataType.VARCHAR, max_length=64)\n schema.add_field(\n field_name=\"chunk_id\", datatype=DataType.VARCHAR, max_length=64\n ),\n schema.add_field(field_name=\"original_index\", datatype=DataType.INT32)\n\n functions = Function(\n name=\"bm25\",\n function_type=FunctionType.BM25,\n input_field_names=[\"content\"],\n output_field_names=\"sparse_vector\",\n )\n\n schema.add_function(functions)\n\n index_params = MilvusClient.prepare_index_params()\n index_params.add_index(\n field_name=\"sparse_vector\",\n index_type=\"SPARSE_INVERTED_INDEX\",\n metric_type=\"BM25\",\n )\n index_params.add_index(\n field_name=\"dense_vector\", index_type=\"FLAT\", metric_type=\"IP\"\n )\n\n self.client.create_collection(\n collection_name=self.collection_name,\n schema=schema,\n index_params=index_params,\n )\n\n def insert_data(self, chunk, metadata):\n embedding = self.embedding_function([chunk])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n self.client.insert(\n self.collection_name, {\"dense_vector\": dense_vec, **metadata}\n )\n\n def search(self, query: str, k: int = 20, mode=\"hybrid\"):\n\n output_fields = [\n \"content\",\n \"original_uuid\",\n \"doc_id\",\n \"chunk_id\",\n \"original_index\",\n ]\n if mode in [\"dense\", \"hybrid\"]:\n embedding = self.embedding_function([query])\n if isinstance(embedding, dict) and \"dense\" in embedding:\n dense_vec = embedding[\"dense\"][0]\n else:\n dense_vec = embedding[0]\n\n if mode == \"sparse\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[query],\n anns_field=\"sparse_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"dense\":\n results = self.client.search(\n collection_name=self.collection_name,\n data=[dense_vec],\n anns_field=\"dense_vector\",\n limit=k,\n output_fields=output_fields,\n )\n elif mode == \"hybrid\":\n full_text_search_params = {\"metric_type\": \"BM25\"}\n full_text_search_req = AnnSearchRequest(\n [query], \"sparse_vector\", full_text_search_params, limit=k\n )\n\n dense_search_params = {\"metric_type\": \"IP\"}\n dense_req = AnnSearchRequest(\n [dense_vec], \"dense_vector\", dense_search_params, limit=k\n )\n\n results = self.client.hybrid_search(\n self.collection_name,\n [full_text_search_req, dense_req],\n ranker=RRFRanker(),\n limit=k,\n output_fields=output_fields,\n )\n else:\n raise ValueError(\"Invalid mode\")\n return [\n {\n \"doc_id\": doc[\"entity\"][\"doc_id\"],\n \"chunk_id\": doc[\"entity\"][\"chunk_id\"],\n \"content\": doc[\"entity\"][\"content\"],\n \"score\": doc[\"distance\"],\n }\n for doc in results[0]\n ]\n","dense_ef = BGEM3EmbeddingFunction()\nstandard_retriever = HybridRetriever(\n uri=\"http://localhost:19530\",\n collection_name=\"milvus_hybrid\",\n dense_embedding_function=dense_ef,\n)\n","path = \"codebase_chunks.json\"\nwith open(path, \"r\") as f:\n dataset = json.load(f)\n\nis_insert = True\nif is_insert:\n standard_retriever.build_collection()\n for doc in dataset:\n doc_content = doc[\"content\"]\n for chunk in doc[\"chunks\"]:\n metadata = {\n \"doc_id\": doc[\"doc_id\"],\n \"original_uuid\": doc[\"original_uuid\"],\n \"chunk_id\": chunk[\"chunk_id\"],\n \"original_index\": chunk[\"original_index\"],\n \"content\": chunk[\"content\"],\n }\n chunk_content = chunk[\"content\"]\n standard_retriever.insert_data(chunk_content, metadata)\n","results = standard_retriever.search(\"create a logger?\", mode=\"sparse\", k=3)\nprint(results)\n","def load_jsonl(file_path: str):\n \"\"\"Load JSONL file and return a list of dictionaries.\"\"\"\n with open(file_path, \"r\") as file:\n return [json.loads(line) for line in file]\n\n\ndataset = load_jsonl(\"evaluation_set.jsonl\")\nk = 5\n\n# mode can be \"dense\", \"sparse\" or \"hybrid\".\nmode = \"hybrid\"\n\ntotal_query_score = 0\nnum_queries = 0\n\nfor query_item in dataset:\n\n query = query_item[\"query\"]\n\n golden_chunk_uuids = query_item[\"golden_chunk_uuids\"]\n\n chunks_found = 0\n golden_contents = []\n for doc_uuid, chunk_index in golden_chunk_uuids:\n golden_doc = next(\n (doc for doc in query_item[\"golden_documents\"] if doc[\"uuid\"] == doc_uuid),\n None,\n )\n if golden_doc:\n golden_chunk = next(\n (\n chunk\n for chunk in golden_doc[\"chunks\"]\n if chunk[\"index\"] == chunk_index\n ),\n None,\n )\n if golden_chunk:\n golden_contents.append(golden_chunk[\"content\"].strip())\n\n results = standard_retriever.search(query, mode=mode, k=5)\n\n for golden_content in golden_contents:\n for doc in results[:k]:\n retrieved_content = doc[\"content\"].strip()\n if retrieved_content == golden_content:\n chunks_found += 1\n break\n\n query_score = chunks_found / len(golden_contents)\n\n total_query_score += query_score\n num_queries += 1\n","print(\"Pass@5: \", total_query_score / num_queries)\n"],"headingContent":"Full Text Search with Milvus","anchorList":[{"label":"使用 Milvus 進行全文檢索","href":"Full-Text-Search-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"評估","href":"Evaluation","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.md new file mode 100644 index 000000000..29e8a4b55 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/full_text_search_with_milvus.md @@ -0,0 +1,368 @@ +--- +id: full_text_search_with_milvus.md +summary: >- + Milvus 2.5 發表後,Full Text Search + 可讓使用者有效率地根據關鍵字或短語搜尋文字,提供強大的文字檢索功能。此功能可提高搜尋準確性,並可與基於嵌入的檢索無縫結合,進行混合搜尋,在單一查詢中同時獲得語意和基於關鍵字的結果。在本筆記簿中,我們將展示 + Milvus 全文檢索的基本用法。 +title: 使用 Milvus 進行全文檢索 +--- +

    +Open In Colab + + +GitHub Repository +

    +

    使用 Milvus 進行全文檢索

    Milvus 2.5 發表後,Full Text Search 可讓使用者有效率地根據關鍵字或短語搜尋文字,提供強大的文字檢索功能。此功能可提高搜尋準確性,並可與基於嵌入的檢索無縫結合,以進行混合搜尋,從而在單一查詢中獲得語義和基於關鍵字的結果。在本筆記簿中,我們將介紹 Milvus 全文檢索的基本用法。

    +

    準備工作

    下載資料集

    以下指令將下載原始 Anthropic演示中使用的範例資料。

    +
    $ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/codebase_chunks.json
    +$ wget https://raw.githubusercontent.com/anthropics/anthropic-cookbook/refs/heads/main/skills/contextual-embeddings/data/evaluation_set.jsonl
    +
    +

    安裝 Milvus 2.5

    查看官方安裝指南以瞭解更多細節。

    +

    安裝 PyMilvus

    執行以下指令安裝 PyMilvus:

    +
    pip install "pymilvus[model]" -U 
    +
    +

    定義 Retriever

    import json
    +
    +from pymilvus import (
    +    MilvusClient,
    +    DataType,
    +    Function,
    +    FunctionType,
    +    AnnSearchRequest,
    +    RRFRanker,
    +)
    +
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +
    +
    +class HybridRetriever:
    +    def __init__(self, uri, collection_name="hybrid", dense_embedding_function=None):
    +        self.uri = uri
    +        self.collection_name = collection_name
    +        self.embedding_function = dense_embedding_function
    +        self.use_reranker = True
    +        self.use_sparse = True
    +        self.client = MilvusClient(uri=uri)
    +
    +    def build_collection(self):
    +        if isinstance(self.embedding_function.dim, dict):
    +            dense_dim = self.embedding_function.dim["dense"]
    +        else:
    +            dense_dim = self.embedding_function.dim
    +
    +        tokenizer_params = {
    +            "tokenizer": "standard",
    +            "filter": [
    +                "lowercase",
    +                {
    +                    "type": "length",
    +                    "max": 200,
    +                },
    +                {"type": "stemmer", "language": "english"},
    +                {
    +                    "type": "stop",
    +                    "stop_words": [
    +                        "a",
    +                        "an",
    +                        "and",
    +                        "are",
    +                        "as",
    +                        "at",
    +                        "be",
    +                        "but",
    +                        "by",
    +                        "for",
    +                        "if",
    +                        "in",
    +                        "into",
    +                        "is",
    +                        "it",
    +                        "no",
    +                        "not",
    +                        "of",
    +                        "on",
    +                        "or",
    +                        "such",
    +                        "that",
    +                        "the",
    +                        "their",
    +                        "then",
    +                        "there",
    +                        "these",
    +                        "they",
    +                        "this",
    +                        "to",
    +                        "was",
    +                        "will",
    +                        "with",
    +                    ],
    +                },
    +            ],
    +        }
    +
    +        schema = MilvusClient.create_schema()
    +        schema.add_field(
    +            field_name="pk",
    +            datatype=DataType.VARCHAR,
    +            is_primary=True,
    +            auto_id=True,
    +            max_length=100,
    +        )
    +        schema.add_field(
    +            field_name="content",
    +            datatype=DataType.VARCHAR,
    +            max_length=65535,
    +            analyzer_params=tokenizer_params,
    +            enable_match=True,
    +            enable_analyzer=True,
    +        )
    +        schema.add_field(
    +            field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR
    +        )
    +        schema.add_field(
    +            field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=dense_dim
    +        )
    +        schema.add_field(
    +            field_name="original_uuid", datatype=DataType.VARCHAR, max_length=128
    +        )
    +        schema.add_field(field_name="doc_id", datatype=DataType.VARCHAR, max_length=64)
    +        schema.add_field(
    +            field_name="chunk_id", datatype=DataType.VARCHAR, max_length=64
    +        ),
    +        schema.add_field(field_name="original_index", datatype=DataType.INT32)
    +
    +        functions = Function(
    +            name="bm25",
    +            function_type=FunctionType.BM25,
    +            input_field_names=["content"],
    +            output_field_names="sparse_vector",
    +        )
    +
    +        schema.add_function(functions)
    +
    +        index_params = MilvusClient.prepare_index_params()
    +        index_params.add_index(
    +            field_name="sparse_vector",
    +            index_type="SPARSE_INVERTED_INDEX",
    +            metric_type="BM25",
    +        )
    +        index_params.add_index(
    +            field_name="dense_vector", index_type="FLAT", metric_type="IP"
    +        )
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name,
    +            schema=schema,
    +            index_params=index_params,
    +        )
    +
    +    def insert_data(self, chunk, metadata):
    +        embedding = self.embedding_function([chunk])
    +        if isinstance(embedding, dict) and "dense" in embedding:
    +            dense_vec = embedding["dense"][0]
    +        else:
    +            dense_vec = embedding[0]
    +        self.client.insert(
    +            self.collection_name, {"dense_vector": dense_vec, **metadata}
    +        )
    +
    +    def search(self, query: str, k: int = 20, mode="hybrid"):
    +
    +        output_fields = [
    +            "content",
    +            "original_uuid",
    +            "doc_id",
    +            "chunk_id",
    +            "original_index",
    +        ]
    +        if mode in ["dense", "hybrid"]:
    +            embedding = self.embedding_function([query])
    +            if isinstance(embedding, dict) and "dense" in embedding:
    +                dense_vec = embedding["dense"][0]
    +            else:
    +                dense_vec = embedding[0]
    +
    +        if mode == "sparse":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[query],
    +                anns_field="sparse_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "dense":
    +            results = self.client.search(
    +                collection_name=self.collection_name,
    +                data=[dense_vec],
    +                anns_field="dense_vector",
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        elif mode == "hybrid":
    +            full_text_search_params = {"metric_type": "BM25"}
    +            full_text_search_req = AnnSearchRequest(
    +                [query], "sparse_vector", full_text_search_params, limit=k
    +            )
    +
    +            dense_search_params = {"metric_type": "IP"}
    +            dense_req = AnnSearchRequest(
    +                [dense_vec], "dense_vector", dense_search_params, limit=k
    +            )
    +
    +            results = self.client.hybrid_search(
    +                self.collection_name,
    +                [full_text_search_req, dense_req],
    +                ranker=RRFRanker(),
    +                limit=k,
    +                output_fields=output_fields,
    +            )
    +        else:
    +            raise ValueError("Invalid mode")
    +        return [
    +            {
    +                "doc_id": doc["entity"]["doc_id"],
    +                "chunk_id": doc["entity"]["chunk_id"],
    +                "content": doc["entity"]["content"],
    +                "score": doc["distance"],
    +            }
    +            for doc in results[0]
    +        ]
    +
    +
    dense_ef = BGEM3EmbeddingFunction()
    +standard_retriever = HybridRetriever(
    +    uri="http://localhost:19530",
    +    collection_name="milvus_hybrid",
    +    dense_embedding_function=dense_ef,
    +)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 108848.72it/s]
    +
    +

    插入資料

    path = "codebase_chunks.json"
    +with open(path, "r") as f:
    +    dataset = json.load(f)
    +
    +is_insert = True
    +if is_insert:
    +    standard_retriever.build_collection()
    +    for doc in dataset:
    +        doc_content = doc["content"]
    +        for chunk in doc["chunks"]:
    +            metadata = {
    +                "doc_id": doc["doc_id"],
    +                "original_uuid": doc["original_uuid"],
    +                "chunk_id": chunk["chunk_id"],
    +                "original_index": chunk["original_index"],
    +                "content": chunk["content"],
    +            }
    +            chunk_content = chunk["content"]
    +            standard_retriever.insert_data(chunk_content, metadata)
    +
    +
    results = standard_retriever.search("create a logger?", mode="sparse", k=3)
    +print(results)
    +
    +
    [{'doc_id': 'doc_10', 'chunk_id': 'doc_10_chunk_0', 'content': 'use {\n    crate::args::LogArgs,\n    anyhow::{anyhow, Result},\n    simplelog::{Config, LevelFilter, WriteLogger},\n    std::fs::File,\n};\n\npub struct Logger;\n\nimpl Logger {\n    pub fn init(args: &impl LogArgs) -> Result<()> {\n        let filter: LevelFilter = args.log_level().into();\n        if filter != LevelFilter::Off {\n            let logfile = File::create(args.log_file())\n                .map_err(|e| anyhow!("Failed to open log file: {e:}"))?;\n            WriteLogger::init(filter, Config::default(), logfile)\n                .map_err(|e| anyhow!("Failed to initalize logger: {e:}"))?;\n        }\n        Ok(())\n    }\n}\n', 'score': 9.12518310546875}, {'doc_id': 'doc_87', 'chunk_id': 'doc_87_chunk_3', 'content': '\t\tLoggerPtr INF = Logger::getLogger(LOG4CXX_TEST_STR("INF"));\n\t\tINF->setLevel(Level::getInfo());\n\n\t\tLoggerPtr INF_ERR = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR"));\n\t\tINF_ERR->setLevel(Level::getError());\n\n\t\tLoggerPtr DEB = Logger::getLogger(LOG4CXX_TEST_STR("DEB"));\n\t\tDEB->setLevel(Level::getDebug());\n\n\t\t// Note: categories with undefined level\n\t\tLoggerPtr INF_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.UNDEF"));\n\t\tLoggerPtr INF_ERR_UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("INF.ERR.UNDEF"));\n\t\tLoggerPtr UNDEF = Logger::getLogger(LOG4CXX_TEST_STR("UNDEF"));\n\n', 'score': 7.0077056884765625}, {'doc_id': 'doc_89', 'chunk_id': 'doc_89_chunk_3', 'content': 'using namespace log4cxx;\nusing namespace log4cxx::helpers;\n\nLOGUNIT_CLASS(FMTTestCase)\n{\n\tLOGUNIT_TEST_SUITE(FMTTestCase);\n\tLOGUNIT_TEST(test1);\n\tLOGUNIT_TEST(test1_expanded);\n\tLOGUNIT_TEST(test10);\n//\tLOGUNIT_TEST(test_date);\n\tLOGUNIT_TEST_SUITE_END();\n\n\tLoggerPtr root;\n\tLoggerPtr logger;\n\npublic:\n\tvoid setUp()\n\t{\n\t\troot = Logger::getRootLogger();\n\t\tMDC::clear();\n\t\tlogger = Logger::getLogger(LOG4CXX_TEST_STR("java.org.apache.log4j.PatternLayoutTest"));\n\t}\n\n', 'score': 6.750633716583252}]
    +
    +

    評估

    現在我們已經把資料集插入 Milvus,我們可以使用密集、稀疏或混合搜尋來擷取前 5 個結果。您可以變更mode ,並對每個結果進行評估。我們提出 Pass@5 的度量,包括擷取每個查詢的前 5 個結果,並計算 Recall。

    +
    def load_jsonl(file_path: str):
    +    """Load JSONL file and return a list of dictionaries."""
    +    with open(file_path, "r") as file:
    +        return [json.loads(line) for line in file]
    +
    +
    +dataset = load_jsonl("evaluation_set.jsonl")
    +k = 5
    +
    +# mode can be "dense", "sparse" or "hybrid".
    +mode = "hybrid"
    +
    +total_query_score = 0
    +num_queries = 0
    +
    +for query_item in dataset:
    +
    +    query = query_item["query"]
    +
    +    golden_chunk_uuids = query_item["golden_chunk_uuids"]
    +
    +    chunks_found = 0
    +    golden_contents = []
    +    for doc_uuid, chunk_index in golden_chunk_uuids:
    +        golden_doc = next(
    +            (doc for doc in query_item["golden_documents"] if doc["uuid"] == doc_uuid),
    +            None,
    +        )
    +        if golden_doc:
    +            golden_chunk = next(
    +                (
    +                    chunk
    +                    for chunk in golden_doc["chunks"]
    +                    if chunk["index"] == chunk_index
    +                ),
    +                None,
    +            )
    +            if golden_chunk:
    +                golden_contents.append(golden_chunk["content"].strip())
    +
    +    results = standard_retriever.search(query, mode=mode, k=5)
    +
    +    for golden_content in golden_contents:
    +        for doc in results[:k]:
    +            retrieved_content = doc["content"].strip()
    +            if retrieved_content == golden_content:
    +                chunks_found += 1
    +                break
    +
    +    query_score = chunks_found / len(golden_contents)
    +
    +    total_query_score += query_score
    +    num_queries += 1
    +
    +
    print("Pass@5: ", total_query_score / num_queries)
    +
    +
    Pass@5:  0.7911386328725037
    +
    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.json b/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.json new file mode 100644 index 000000000..7a1ee7467 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.json @@ -0,0 +1 @@ +{"codeList":["import functools\n\nfrom datasets import load_dataset\nimport numpy as np\nimport pandas as pd\nimport pymilvus\nfrom pymilvus import MilvusClient\nfrom pymilvus import FieldSchema, CollectionSchema, DataType\nfrom sentence_transformers import SentenceTransformer\nimport torch\nimport torch.nn.functional as F\nfrom tqdm import tqdm\n","model = SentenceTransformer(\n # Remove 'device='mps' if running on non-Mac device\n \"nomic-ai/nomic-embed-text-v1.5\",\n trust_remote_code=True,\n device=\"mps\",\n)\n","ds = load_dataset(\"vishnupriyavr/wiki-movie-plots-with-summaries\", split=\"train\")\nprint(ds)\n","embedding_dim = 768\nsearch_dim = 128\ncollection_name = \"movie_embeddings\"\n\nclient = MilvusClient(uri=\"./wiki-movie-plots-matryoshka.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n # First sixth of unnormalized embedding vector\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n # Entire unnormalized embedding vector\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n","index_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nindex_params.add_index(field_name=\"embedding\", index_type=\"FLAT\", metric_type=\"COSINE\")\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n # This particular model requires us to prefix 'search_document:' to stored entities\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Output of embedding model is unnormalized\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","queries = [\n \"An archaeologist searches for ancient artifacts while fighting Nazis.\",\n \"A teenager fakes illness to get off school and have adventures with two friends.\",\n \"A young couple with a kid look after a hotel during winter and the husband goes insane.\",\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\n# This particular model requires us to prefix 'search_query:' to queries\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries]\nsearch_data = embed_search(instruct_queries)\n\n# Normalize head embeddings\nhead_search = [x[:search_dim] for x in search_data]\n\n# Perform standard vector search on first sixth of embedding dimensions\nres = client.search(\n collection_name=collection_name,\n data=head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits][:5]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:\n \"\"\"\n Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.\n\n \"\"\"\n rows = [x[\"entity\"] for x in hits]\n rows_dict = [\n {\"title\": x[\"title\"], \"embedding\": torch.tensor(x[\"embedding\"])} for x in rows\n ]\n return pd.DataFrame.from_records(rows_dict)\n\n\ndfs = [hits_to_dataframe(hits) for hits in res]\n","# An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)\ndef calculate_score(row, query_emb=None, dims=768):\n emb = F.normalize(row[\"embedding\"][:dims], dim=-1)\n return (emb @ query_emb).item()\n\n\n# You could also add a top-K parameter as a termination condition\ndef funnel_search(\n df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5\n) -> pd.DataFrame:\n # Loop over increasing prefixes of the embeddings\n for dims in scales:\n # Query vector must be normalized for each new dimensionality\n emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))\n\n # Score\n scores = df.apply(\n functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1\n )\n df[\"scores\"] = scores\n\n # Re-rank\n df = df.sort_values(by=\"scores\", ascending=False)\n\n # Prune (in our case, remove half of candidates at each step)\n df = df.head(int(prune_ratio * len(df)))\n\n return df\n\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, search_data)\n]\n","for d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:5][\"title\"], \"\\n\")\n","# Search on entire embeddings\nres = client.search(\n collection_name=collection_name,\n data=search_data,\n anns_field=\"embedding\",\n limit=5,\n output_fields=[\"title\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", query)\n print(\"Results:\")\n for row in rows:\n print(row[\"title\"].strip())\n print()\n","queries2 = [\n \"A teenager fakes illness to get off school and have adventures with two friends.\"\n]\n\n\n# Search the database based on input text\ndef embed_search(data):\n embeds = model.encode(data)\n return [x for x in embeds]\n\n\ninstruct_queries = [\"search_query: \" + q.strip() for q in queries2]\nsearch_data2 = embed_search(instruct_queries)\nhead_search2 = [x[:search_dim] for x in search_data2]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=head_search2,\n anns_field=\"head_embedding\",\n limit=256,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","for query, hits in zip(queries, res):\n rows = [x[\"entity\"] for x in hits]\n\n print(\"Query:\", queries2[0])\n for idx, row in enumerate(rows):\n if row[\"title\"].strip() == \"Ferris Bueller's Day Off\":\n print(f\"Row {idx}: Ferris Bueller's Day Off\")\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries2, dfs, search_data2)\n]\n\nfor d in dfs_results:\n print(d[\"query\"], \"\\n\", d[\"results\"][:7][\"title\"].to_string(index=False), \"\\n\")\n","client = MilvusClient(uri=\"./wikiplots-matryoshka-flipped.db\")\n\nfields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True),\n FieldSchema(name=\"title\", dtype=DataType.VARCHAR, max_length=256),\n FieldSchema(name=\"head_embedding\", dtype=DataType.FLOAT_VECTOR, dim=search_dim),\n FieldSchema(name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),\n]\n\nschema = CollectionSchema(fields=fields, enable_dynamic_field=False)\nclient.create_collection(collection_name=collection_name, schema=schema)\n\nindex_params = client.prepare_index_params()\nindex_params.add_index(\n field_name=\"head_embedding\", index_type=\"FLAT\", metric_type=\"COSINE\"\n)\nclient.create_index(collection_name, index_params)\n","for batch in tqdm(ds.batch(batch_size=512)):\n plot_summary = [\"search_document: \" + x.strip() for x in batch[\"PlotSummary\"]]\n\n # Encode and flip embeddings\n embeddings = model.encode(plot_summary, convert_to_tensor=True)\n embeddings = torch.flip(embeddings, dims=[-1])\n head_embeddings = embeddings[:, :search_dim]\n\n data = [\n {\n \"title\": title,\n \"head_embedding\": head.cpu().numpy(),\n \"embedding\": embedding.cpu().numpy(),\n }\n for title, head, embedding in zip(batch[\"Title\"], head_embeddings, embeddings)\n ]\n res = client.insert(collection_name=collection_name, data=data)\n","# Normalize head embeddings\n\nflip_search_data = [\n torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data\n]\nflip_head_search = [x[:search_dim] for x in flip_search_data]\n\n# Perform standard vector search on subset of embeddings\nres = client.search(\n collection_name=collection_name,\n data=flip_head_search,\n anns_field=\"head_embedding\",\n limit=128,\n output_fields=[\"title\", \"head_embedding\", \"embedding\"],\n)\n","dfs = [hits_to_dataframe(hits) for hits in res]\n\ndfs_results = [\n {\"query\": query, \"results\": funnel_search(df, query_emb)}\n for query, df, query_emb in zip(queries, dfs, flip_search_data)\n]\n\nfor d in dfs_results:\n print(\n d[\"query\"],\n \"\\n\",\n d[\"results\"][:7][\"title\"].to_string(index=False, header=False),\n \"\\n\",\n )\n"],"headingContent":"Funnel Search with Matryoshka Embeddings","anchorList":[{"label":"使用 Matryoshka 嵌入式進行漏斗搜尋","href":"Funnel-Search-with-Matryoshka-Embeddings","type":1,"isActive":false},{"label":"載入 Matryoshka 嵌入模型","href":"Load-Matryoshka-Embedding-Model","type":2,"isActive":false},{"label":"載入資料集、嵌入項目和建立向量資料庫","href":"Loading-Dataset-Embedding-Items-and-Building-Vector-Database","type":2,"isActive":false},{"label":"執行漏斗搜尋","href":"Performing-Funnel-Search","type":2,"isActive":false},{"label":"比較漏斗搜尋與一般搜尋","href":"Comparing-Funnel-Search-to-Regular-Search","type":2,"isActive":false},{"label":"調查 Ferris Bueller's Day Off 的漏斗搜尋失敗原因","href":"Investigating-Funnel-Search-Recall-Failure-for-Ferris-Buellers-Day-Off","type":2,"isActive":false},{"label":"順序重要嗎?前綴與後綴嵌入。","href":"Does-the-order-matter-Prefix-vs-suffix-embeddings","type":2,"isActive":false},{"label":"總結","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.md b/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.md new file mode 100644 index 000000000..e006cbcd9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/funnel_search_with_matryoshka.md @@ -0,0 +1,568 @@ +--- +id: funnel_search_with_matryoshka.md +summary: >- + 在本筆記簿中,我們將探討如何使用 Matryoshka 嵌入與 Milvus 來進行語意搜尋。我們說明一種稱為「漏斗搜尋」(funnel + search)的演算法,它可以讓我們在嵌入維度的一小部分子集上執行相似性搜尋,而不會大幅降低召回率。 +title: 使用 Matryoshka 嵌入式進行漏斗搜尋 +--- +

    使用 Matryoshka 嵌入式進行漏斗搜尋

    在建立有效率的向量搜尋系統時,一個主要的挑戰是管理儲存成本,同時維持可接受的延遲和召回率。現代的嵌入模型會輸出成百上千維度的向量,為原始向量和索引帶來顯著的儲存和計算開銷。

    +

    傳統上,我們會在建立索引之前,先應用量化或降維方法來降低儲存需求。例如,我們可以使用積量化 (Product Quantization, PQ) 降低精確度,或使用主成分分析 (Principal Component Analysis, PCA) 降低維數,以節省儲存空間。這些方法會分析整個向量集,找出更精簡的向量集,以維持向量之間的語意關係。

    +

    這些標準方法雖然有效,但只減少一次精確度或維度,而且是在單一尺度上。但如果我們可以同時維持多層的細節,就像金字塔般越來越精確的表達方式,那又會如何呢?

    +

    進入 Matryoshka 嵌入式。以俄羅斯嵌套娃娃命名 (見插圖),這些聰明的結構將多層表徵嵌入單一向量中。與傳統的後處理方法不同,Matryoshka 內嵌會在初始訓練過程中學習這種多尺度結構。其結果非常顯著:完整的嵌入不僅能捕捉輸入的語意,而且每個嵌套的子集前綴(前半部分、前四分之一等)都能提供連貫的表達,即使不那麼詳細。

    +
    +

    在本筆記簿中,我們將探討如何使用 Matryoshka 內嵌與 Milvus 來進行語意搜尋。我們說明一種稱為「漏斗搜尋」(funnel search)的演算法,它可以讓我們在嵌入維度的一小部分子集上執行相似性搜尋,而不會大幅降低召回率。

    +
    import functools
    +
    +from datasets import load_dataset
    +import numpy as np
    +import pandas as pd
    +import pymilvus
    +from pymilvus import MilvusClient
    +from pymilvus import FieldSchema, CollectionSchema, DataType
    +from sentence_transformers import SentenceTransformer
    +import torch
    +import torch.nn.functional as F
    +from tqdm import tqdm
    +
    +

    載入 Matryoshka 嵌入模型

    我們不使用標準的嵌入模型,例如 sentence-transformers/all-MiniLM-L12-v2,我們使用Nomic特別為產生 Matryoshka 嵌入而訓練的模型

    +
    model = SentenceTransformer(
    +    # Remove 'device='mps' if running on non-Mac device
    +    "nomic-ai/nomic-embed-text-v1.5",
    +    trust_remote_code=True,
    +    device="mps",
    +)
    +
    +
    <All keys matched successfully>
    +
    +

    載入資料集、嵌入項目和建立向量資料庫

    以下的程式碼是修改自「Movie Search with Sentence Transformers and Milvus」文件頁面的程式碼首先,我們從 HuggingFace 載入資料集。它包含約 35k 個條目,每個條目對應一部有 Wikipedia 文章的電影。我們將在本範例中使用TitlePlotSummary 欄位。

    +
    ds = load_dataset("vishnupriyavr/wiki-movie-plots-with-summaries", split="train")
    +print(ds)
    +
    +
    Dataset({
    +    features: ['Release Year', 'Title', 'Origin/Ethnicity', 'Director', 'Cast', 'Genre', 'Wiki Page', 'Plot', 'PlotSummary'],
    +    num_rows: 34886
    +})
    +
    +

    接下來,我們連接到 Milvus Lite 資料庫,指定資料模式,並以此模式建立一個集合。我們會將未規範化的 embedding 和 embedding 的前六分之一分別儲存在不同的欄位中。這樣做的原因是,我們需要 Matryoshka 內嵌的前 1/6 來執行相似性搜尋,而其餘 5/6 的內嵌則用於重新排序和改善搜尋結果。

    +
    embedding_dim = 768
    +search_dim = 128
    +collection_name = "movie_embeddings"
    +
    +client = MilvusClient(uri="./wiki-movie-plots-matryoshka.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    # First sixth of unnormalized embedding vector
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    # Entire unnormalized embedding vector
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +

    Milvus 目前不支援對嵌入式子集進行搜尋,因此我們將嵌入式分成兩部分:頭部代表向量的初始子集,用於索引和搜尋,尾部則是其餘部分。模型是針對余弦距離相似性搜尋所訓練的,因此我們將頭部的內嵌歸一化。然而,為了稍後計算較大子集的相似性,我們需要儲存頭部內嵌的規範,因此我們可以在連接至尾部之前將其非規範化。

    +

    若要透過前 1/6 的嵌入執行搜尋,我們需要在head_embedding 領域上建立向量搜尋索引。稍後,我們將比較「漏斗搜尋」與一般向量搜尋的結果,因此也會在完整的內嵌上建立搜尋索引。

    +

    重要的是,我們使用的是COSINE 而不是IP 距離公制,因為否則我們就需要追蹤內嵌規範,這會使實作變得複雜 (這在介紹漏斗搜尋演算法後會更有意義)。

    +
    index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +index_params.add_index(field_name="embedding", index_type="FLAT", metric_type="COSINE")
    +client.create_index(collection_name, index_params)
    +
    +

    最後,我們對所有 35k 部電影的劇情摘要進行編碼,並將相對應的 embeddings 輸入資料庫。

    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    # This particular model requires us to prefix 'search_document:' to stored entities
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Output of embedding model is unnormalized
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:57<00:00,  5.18s/it]
    +
    +

    現在讓我們使用 Matryoshka 內嵌維度的前 1/6 執行「漏斗搜尋」。我心目中有三部電影可供檢索,並製作了自己的劇情摘要,以便查詢資料庫。我們嵌入查詢,然後在head_embedding 欄位上執行向量搜尋,擷取 128 個結果候選。

    +
    queries = [
    +    "An archaeologist searches for ancient artifacts while fighting Nazis.",
    +    "A teenager fakes illness to get off school and have adventures with two friends.",
    +    "A young couple with a kid look after a hotel during winter and the husband goes insane.",
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +# This particular model requires us to prefix 'search_query:' to queries
    +instruct_queries = ["search_query: " + q.strip() for q in queries]
    +search_data = embed_search(instruct_queries)
    +
    +# Normalize head embeddings
    +head_search = [x[:search_dim] for x in search_data]
    +
    +# Perform standard vector search on first sixth of embedding dimensions
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +

    此時,我們已在小得多的向量空間上執行搜尋,因此相對於在完整空間上的搜尋,可能降低了延遲,並減少了索引的儲存需求。讓我們檢查每個查詢的前 5 個匹配結果:

    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits][:5]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +The Passage
    +Counterblast
    +Dominion: Prequel to the Exorcist
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +How to Deal
    +Shorts
    +Blackbird
    +Valentine
    +Unfriended
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +Ghostkeeper
    +Our Vines Have Tender Grapes
    +The Ref
    +Impact
    +The House in Marsh Road
    +
    +

    我們可以看到,由於在搜尋過程中截斷了嵌入式,因此召回率受到了影響。Funnel search(漏斗搜尋)用一個巧妙的技巧解決了這個問題:我們可以使用嵌入維度的剩餘部分來重新排序和修剪我們的候選清單來恢復檢索效能,而不需要執行任何額外的昂貴向量搜尋。

    +

    為了方便說明漏斗搜尋演算法,我們將每項查詢的 Milvus 搜尋命中率轉換成 Pandas 資料框架。

    +
    def hits_to_dataframe(hits: pymilvus.client.abstract.Hits) -> pd.DataFrame:
    +    """
    +    Convert a Milvus search result to a Pandas dataframe. This function is specific to our data schema.
    +
    +    """
    +    rows = [x["entity"] for x in hits]
    +    rows_dict = [
    +        {"title": x["title"], "embedding": torch.tensor(x["embedding"])} for x in rows
    +    ]
    +    return pd.DataFrame.from_records(rows_dict)
    +
    +
    +dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +

    現在,為了執行漏斗搜尋,我們迭代越來越大的嵌入子集。每次迭代時,我們都會根據新的相似度重新排列候選項,並刪除排名最低的部分。

    +

    為了具體說明這一點,在上一步中,我們使用 1/6 的嵌入和查詢維度擷取了 128 個候選人。執行漏斗搜尋的第一步是使用前 1/3 的維度重新計算查詢與候選人之間的相似度。最下面的 64 個候選人會被剪枝。然後,我們使用前 2/3 的維度重複此過程,再使用所有的維度,連續剪枝到 32 和 16 個候選人。

    +
    # An optimized implementation would vectorize the calculation of similarity scores across rows (using a matrix)
    +def calculate_score(row, query_emb=None, dims=768):
    +    emb = F.normalize(row["embedding"][:dims], dim=-1)
    +    return (emb @ query_emb).item()
    +
    +
    +# You could also add a top-K parameter as a termination condition
    +def funnel_search(
    +    df: pd.DataFrame, query_emb, scales=[256, 512, 768], prune_ratio=0.5
    +) -> pd.DataFrame:
    +    # Loop over increasing prefixes of the embeddings
    +    for dims in scales:
    +        # Query vector must be normalized for each new dimensionality
    +        emb = torch.tensor(query_emb[:dims] / np.linalg.norm(query_emb[:dims]))
    +
    +        # Score
    +        scores = df.apply(
    +            functools.partial(calculate_score, query_emb=emb, dims=dims), axis=1
    +        )
    +        df["scores"] = scores
    +
    +        # Re-rank
    +        df = df.sort_values(by="scores", ascending=False)
    +
    +        # Prune (in our case, remove half of candidates at each step)
    +        df = df.head(int(prune_ratio * len(df)))
    +
    +    return df
    +
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, search_data)
    +]
    +
    +
    for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:5]["title"], "\n")
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    + 0           "Pimpernel" Smith
    +1               Black Hunters
    +29    Raiders of the Lost Ark
    +34             The Master Key
    +51            My Gun Is Quick
    +Name: title, dtype: object 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    + 21               How I Live Now
    +32     On the Edge of Innocence
    +77             Bratz: The Movie
    +4                    Unfriended
    +108                  Simon Says
    +Name: title, dtype: object 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    + 9         The Shining
    +0         Ghostkeeper
    +11     Fast and Loose
    +7      Killing Ground
    +12         Home Alone
    +Name: title, dtype: object 
    +
    +

    我們已經能夠在不執行任何額外向量搜尋的情況下恢復召回率!定性來看,這些結果對「Raiders of the Lost Ark」和「The Shining」的召回率似乎比教學「Movie Search using Milvus and Sentence Transformers」中的標準向量搜尋要高,後者使用了不同的嵌入模型。然而,它卻無法找到「Ferris Bueller's Day Off」,我們稍後會在筆記型電腦中再回到這個主題。(請參閱Matryoshka Representation Learning一文,以瞭解更多量化實驗和基準)。

    +

    讓我們在相同的嵌入模型下,在相同的資料集上,比較我們的漏斗搜尋與標準向量搜尋的結果。我們在完整的嵌入模型上執行搜尋。

    +
    # Search on entire embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=search_data,
    +    anns_field="embedding",
    +    limit=5,
    +    output_fields=["title", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", query)
    +    print("Results:")
    +    for row in rows:
    +        print(row["title"].strip())
    +    print()
    +
    +
    Query: An archaeologist searches for ancient artifacts while fighting Nazis.
    +Results:
    +"Pimpernel" Smith
    +Black Hunters
    +Raiders of the Lost Ark
    +The Master Key
    +My Gun Is Quick
    +
    +Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Results:
    +A Walk to Remember
    +Ferris Bueller's Day Off
    +How I Live Now
    +On the Edge of Innocence
    +Bratz: The Movie
    +
    +Query: A young couple with a kid look after a hotel during winter and the husband goes insane.
    +Results:
    +The Shining
    +Ghostkeeper
    +Fast and Loose
    +Killing Ground
    +Home Alone
    +
    +

    除了「A teenager fakes illness to get off school...」的搜尋結果之外,漏斗搜尋的結果與完整搜尋的結果幾乎完全相同,儘管漏斗搜尋是在 128 層的搜尋空間上執行,而一般搜尋空間為 768 層。

    +

    調查 Ferris Bueller's Day Off 的漏斗搜尋失敗原因

    為什麼漏斗搜尋沒有成功擷取到 Ferris Bueller's Day Off?讓我們檢視它是否在原始候選名單中,或是被錯誤地濾除。

    +
    queries2 = [
    +    "A teenager fakes illness to get off school and have adventures with two friends."
    +]
    +
    +
    +# Search the database based on input text
    +def embed_search(data):
    +    embeds = model.encode(data)
    +    return [x for x in embeds]
    +
    +
    +instruct_queries = ["search_query: " + q.strip() for q in queries2]
    +search_data2 = embed_search(instruct_queries)
    +head_search2 = [x[:search_dim] for x in search_data2]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=head_search2,
    +    anns_field="head_embedding",
    +    limit=256,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    for query, hits in zip(queries, res):
    +    rows = [x["entity"] for x in hits]
    +
    +    print("Query:", queries2[0])
    +    for idx, row in enumerate(rows):
    +        if row["title"].strip() == "Ferris Bueller's Day Off":
    +            print(f"Row {idx}: Ferris Bueller's Day Off")
    +
    +
    Query: A teenager fakes illness to get off school and have adventures with two friends.
    +Row 228: Ferris Bueller's Day Off
    +
    +

    我們看到問題出在初始候選清單不夠大,或者說,在最高粒度的層級上,想要的命中與查詢的相似度不夠高。將它從128 改為256 的結果是成功檢索。我們應該形成一個經驗規則來設定保留集上的候選人數,以經驗來評估召回率與延遲之間的權衡。

    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries2, dfs, search_data2)
    +]
    +
    +for d in dfs_results:
    +    print(d["query"], "\n", d["results"][:7]["title"].to_string(index=False), "\n")
    +
    +
    A teenager fakes illness to get off school and have adventures with two friends. 
    +       A Walk to Remember
    +Ferris Bueller's Day Off
    +          How I Live Now
    +On the Edge of Innocence
    +        Bratz: The Movie
    +              Unfriended
    +              Simon Says 
    +
    +

    順序重要嗎?前綴與後綴嵌入。

    模型經訓練後,可以很好地匹配遞歸較小的前綴嵌入。我們使用的維度順序重要嗎?例如,我們是否也可以使用後綴嵌入的子集?在這個實驗中,我們顛倒了 Matryoshka 內嵌中維度的順序,並執行漏斗搜尋。

    +
    client = MilvusClient(uri="./wikiplots-matryoshka-flipped.db")
    +
    +fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    +    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    +    FieldSchema(name="head_embedding", dtype=DataType.FLOAT_VECTOR, dim=search_dim),
    +    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=embedding_dim),
    +]
    +
    +schema = CollectionSchema(fields=fields, enable_dynamic_field=False)
    +client.create_collection(collection_name=collection_name, schema=schema)
    +
    +index_params = client.prepare_index_params()
    +index_params.add_index(
    +    field_name="head_embedding", index_type="FLAT", metric_type="COSINE"
    +)
    +client.create_index(collection_name, index_params)
    +
    +
    huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
    +To disable this warning, you can either:
    +    - Avoid using `tokenizers` before the fork if possible
    +    - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
    +
    +
    for batch in tqdm(ds.batch(batch_size=512)):
    +    plot_summary = ["search_document: " + x.strip() for x in batch["PlotSummary"]]
    +
    +    # Encode and flip embeddings
    +    embeddings = model.encode(plot_summary, convert_to_tensor=True)
    +    embeddings = torch.flip(embeddings, dims=[-1])
    +    head_embeddings = embeddings[:, :search_dim]
    +
    +    data = [
    +        {
    +            "title": title,
    +            "head_embedding": head.cpu().numpy(),
    +            "embedding": embedding.cpu().numpy(),
    +        }
    +        for title, head, embedding in zip(batch["Title"], head_embeddings, embeddings)
    +    ]
    +    res = client.insert(collection_name=collection_name, data=data)
    +
    +
    100%|██████████| 69/69 [05:50<00:00,  5.08s/it]
    +
    +
    # Normalize head embeddings
    +
    +flip_search_data = [
    +    torch.flip(torch.tensor(x), dims=[-1]).cpu().numpy() for x in search_data
    +]
    +flip_head_search = [x[:search_dim] for x in flip_search_data]
    +
    +# Perform standard vector search on subset of embeddings
    +res = client.search(
    +    collection_name=collection_name,
    +    data=flip_head_search,
    +    anns_field="head_embedding",
    +    limit=128,
    +    output_fields=["title", "head_embedding", "embedding"],
    +)
    +
    +
    dfs = [hits_to_dataframe(hits) for hits in res]
    +
    +dfs_results = [
    +    {"query": query, "results": funnel_search(df, query_emb)}
    +    for query, df, query_emb in zip(queries, dfs, flip_search_data)
    +]
    +
    +for d in dfs_results:
    +    print(
    +        d["query"],
    +        "\n",
    +        d["results"][:7]["title"].to_string(index=False, header=False),
    +        "\n",
    +    )
    +
    +
    An archaeologist searches for ancient artifacts while fighting Nazis. 
    +       "Pimpernel" Smith
    +          Black Hunters
    +Raiders of the Lost Ark
    +         The Master Key
    +        My Gun Is Quick
    +            The Passage
    +        The Mole People 
    +
    +A teenager fakes illness to get off school and have adventures with two friends. 
    +                       A Walk to Remember
    +                          How I Live Now
    +                              Unfriended
    +Cirque du Freak: The Vampire's Assistant
    +                             Last Summer
    +                                 Contest
    +                                 Day One 
    +
    +A young couple with a kid look after a hotel during winter and the husband goes insane. 
    +         Ghostkeeper
    +     Killing Ground
    +Leopard in the Snow
    +              Stone
    +          Afterglow
    +         Unfaithful
    +     Always a Bride 
    +
    +

    Recall 比預期中的漏斗搜尋或一般搜尋要差得多 (嵌入模型是透過嵌入維度的前綴而非後綴的對比學習來訓練的)。

    +

    總結

    以下是不同方法的搜尋結果比較:

    +
    +
    +
    +我們展示了如何使用 Matryoshka 嵌入與 Milvus 來執行更有效率的語意搜尋演算法,稱為「漏斗搜尋」。我們也探討了演算法中重排序 (reranking) 與剪枝 (pruning) 步驟的重要性,以及當初始候選名單過小時的失敗模式。最後,我們討論了在形成子嵌套時,維度的順序是如何重要的 - 它必須與模型被訓練的方式相同。或者說,正因為模型是以某種方式訓練出來的,嵌入的前綴才會有意義。現在您知道如何實作 Matryoshka 嵌入和漏斗搜尋,以降低語意搜尋的儲存成本,而不會犧牲太多的檢索效能! diff --git a/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.json new file mode 100644 index 000000000..fbb5d7642 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","import numpy as np\n\nfrom collections import defaultdict\nfrom scipy.sparse import csr_matrix\nfrom pymilvus import MilvusClient\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate\nfrom langchain_core.output_parsers import StrOutputParser, JsonOutputParser\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom tqdm import tqdm\n","milvus_client = MilvusClient(uri=\"./milvus.db\")\n\nllm = ChatOpenAI(\n model=\"gpt-4o\",\n temperature=0,\n)\nembedding_model = OpenAIEmbeddings(model=\"text-embedding-3-small\")\n","nano_dataset = [\n {\n \"passage\": \"Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.\",\n \"triplets\": [\n [\"Jakob Bernoulli\", \"made significant contributions to\", \"calculus\"],\n [\n \"Jakob Bernoulli\",\n \"made significant contributions to\",\n \"the theory of probability\",\n ],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli numbers\"],\n [\"Jakob Bernoulli\", \"is known for\", \"the Bernoulli theorem\"],\n [\"The Bernoulli theorem\", \"is a precursor to\", \"the law of large numbers\"],\n [\"Jakob Bernoulli\", \"was the older brother of\", \"Johann Bernoulli\"],\n ],\n },\n {\n \"passage\": \"Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.\",\n \"triplets\": [\n [\n \"Johann Bernoulli\",\n \"was a major figure of\",\n \"the development of calculus\",\n ],\n [\"Johann Bernoulli\", \"was\", \"Jakob's younger brother\"],\n [\"Johann Bernoulli\", \"worked on\", \"infinitesimal calculus\"],\n [\"Johann Bernoulli\", \"was instrumental in spreading\", \"Leibniz's ideas\"],\n [\"Johann Bernoulli\", \"contributed to\", \"the calculus of variations\"],\n [\"Johann Bernoulli\", \"was known for\", \"the brachistochrone problem\"],\n ],\n },\n {\n \"passage\": \"Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.\",\n \"triplets\": [\n [\"Daniel Bernoulli\", \"was the son of\", \"Johann Bernoulli\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"fluid dynamics\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"probability\"],\n [\"Daniel Bernoulli\", \"made major contributions to\", \"statistics\"],\n [\"Daniel Bernoulli\", \"is most famous for\", \"Bernoulli’s principle\"],\n [\n \"Bernoulli’s principle\",\n \"is fundamental to\",\n \"the understanding of aerodynamics\",\n ],\n ],\n },\n {\n \"passage\": \"Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.\",\n \"triplets\": [\n [\n \"Leonhard Euler\",\n \"had a significant relationship with\",\n \"the Bernoulli family\",\n ],\n [\"leonhard Euler\", \"was born in\", \"Basel\"],\n [\"Leonhard Euler\", \"was a student of\", \"Johann Bernoulli\"],\n [\"Johann Bernoulli's influence\", \"was profound on\", \"Euler\"],\n ],\n },\n]\n","entityid_2_relationids = defaultdict(list)\nrelationid_2_passageids = defaultdict(list)\n\nentities = []\nrelations = []\npassages = []\nfor passage_id, dataset_info in enumerate(nano_dataset):\n passage, triplets = dataset_info[\"passage\"], dataset_info[\"triplets\"]\n passages.append(passage)\n for triplet in triplets:\n if triplet[0] not in entities:\n entities.append(triplet[0])\n if triplet[2] not in entities:\n entities.append(triplet[2])\n relation = \" \".join(triplet)\n if relation not in relations:\n relations.append(relation)\n entityid_2_relationids[entities.index(triplet[0])].append(\n len(relations) - 1\n )\n entityid_2_relationids[entities.index(triplet[2])].append(\n len(relations) - 1\n )\n relationid_2_passageids[relations.index(relation)].append(passage_id)\n","embedding_dim = len(embedding_model.embed_query(\"foo\"))\n\n\ndef create_milvus_collection(collection_name: str):\n if milvus_client.has_collection(collection_name=collection_name):\n milvus_client.drop_collection(collection_name=collection_name)\n milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n consistency_level=\"Strong\",\n )\n\n\nentity_col_name = \"entity_collection\"\nrelation_col_name = \"relation_collection\"\npassage_col_name = \"passage_collection\"\ncreate_milvus_collection(entity_col_name)\ncreate_milvus_collection(relation_col_name)\ncreate_milvus_collection(passage_col_name)\n","def milvus_insert(\n collection_name: str,\n text_list: list[str],\n):\n batch_size = 512\n for row_id in tqdm(range(0, len(text_list), batch_size), desc=\"Inserting\"):\n batch_texts = text_list[row_id : row_id + batch_size]\n batch_embeddings = embedding_model.embed_documents(batch_texts)\n\n batch_ids = [row_id + j for j in range(len(batch_texts))]\n batch_data = [\n {\n \"id\": id_,\n \"text\": text,\n \"vector\": vector,\n }\n for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)\n ]\n milvus_client.insert(\n collection_name=collection_name,\n data=batch_data,\n )\n\n\nmilvus_insert(\n collection_name=relation_col_name,\n text_list=relations,\n)\n\nmilvus_insert(\n collection_name=entity_col_name,\n text_list=entities,\n)\n\nmilvus_insert(\n collection_name=passage_col_name,\n text_list=passages,\n)\n","query = \"What contribution did the son of Euler's teacher make?\"\n\nquery_ner_list = [\"Euler\"]\n# query_ner_list = ner(query) # In practice, replace it with your custom NER approach\n\nquery_ner_embeddings = [\n embedding_model.embed_query(query_ner) for query_ner in query_ner_list\n]\n\ntop_k = 3\n\nentity_search_res = milvus_client.search(\n collection_name=entity_col_name,\n data=query_ner_embeddings,\n limit=top_k,\n output_fields=[\"id\"],\n)\n\nquery_embedding = embedding_model.embed_query(query)\n\nrelation_search_res = milvus_client.search(\n collection_name=relation_col_name,\n data=[query_embedding],\n limit=top_k,\n output_fields=[\"id\"],\n)[0]\n","# Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.\nentity_relation_adj = np.zeros((len(entities), len(relations)))\nfor entity_id, entity in enumerate(entities):\n entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1\n\n# Convert the adjacency matrix to a sparse matrix for efficient computation.\nentity_relation_adj = csr_matrix(entity_relation_adj)\n\n# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.\nentity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T\nrelation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj\n\n# Specify the target degree of the subgraph to be expanded.\n# 1 or 2 is enough for most cases.\ntarget_degree = 1\n\n# Compute the target degree adjacency matrices using matrix multiplication.\nentity_adj_target_degree = entity_adj_1_degree\nfor _ in range(target_degree - 1):\n entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree\nrelation_adj_target_degree = relation_adj_1_degree\nfor _ in range(target_degree - 1):\n relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree\n\nentity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj\n","expanded_relations_from_relation = set()\nexpanded_relations_from_entity = set()\n# You can set the similarity threshold here to guarantee the quality of the retrieved ones.\n# entity_sim_filter_thresh = ...\n# relation_sim_filter_thresh = ...\n\nfiltered_hit_relation_ids = [\n relation_res[\"entity\"][\"id\"]\n for relation_res in relation_search_res\n # if relation_res['distance'] > relation_sim_filter_thresh\n]\nfor hit_relation_id in filtered_hit_relation_ids:\n expanded_relations_from_relation.update(\n relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()\n )\n\nfiltered_hit_entity_ids = [\n one_entity_res[\"entity\"][\"id\"]\n for one_entity_search_res in entity_search_res\n for one_entity_res in one_entity_search_res\n # if one_entity_res['distance'] > entity_sim_filter_thresh\n]\n\nfor filtered_hit_entity_id in filtered_hit_entity_ids:\n expanded_relations_from_entity.update(\n entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()\n )\n\n# Merge the expanded relations from the relation and entity retrieval ways.\nrelation_candidate_ids = list(\n expanded_relations_from_relation | expanded_relations_from_entity\n)\n\nrelation_candidate_texts = [\n relations[relation_id] for relation_id in relation_candidate_ids\n]\n","query_prompt_one_shot_input = \"\"\"I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.\n\nQuestion:\nWhen was the mother of the leader of the Third Crusade born?\n\nRelationship descriptions:\n[1] Eleanor was born in 1122.\n[2] Eleanor married King Louis VII of France.\n[3] Eleanor was the Duchess of Aquitaine.\n[4] Eleanor participated in the Second Crusade.\n[5] Eleanor had eight children.\n[6] Eleanor was married to Henry II of England.\n[7] Eleanor was the mother of Richard the Lionheart.\n[8] Richard the Lionheart was the King of England.\n[9] Henry II was the father of Richard the Lionheart.\n[10] Henry II was the King of England.\n[11] Richard the Lionheart led the Third Crusade.\n\n\"\"\"\nquery_prompt_one_shot_output = \"\"\"{\"thought_process\": \"To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.\", \"useful_relationships\": [\"[11] Richard the Lionheart led the Third Crusade\", \"[7] Eleanor was the mother of Richard the Lionheart\", \"[1] Eleanor was born in 1122\"]}\"\"\"\n\nquery_prompt_template = \"\"\"Question:\n{question}\n\nRelationship descriptions:\n{relation_des_str}\n\n\"\"\"\n\n\ndef rerank_relations(\n query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]\n) -> list[int]:\n relation_des_str = \"\\n\".join(\n map(\n lambda item: f\"[{item[0]}] {item[1]}\",\n zip(relation_candidate_ids, relation_candidate_texts),\n )\n ).strip()\n rerank_prompts = ChatPromptTemplate.from_messages(\n [\n HumanMessage(query_prompt_one_shot_input),\n AIMessage(query_prompt_one_shot_output),\n HumanMessagePromptTemplate.from_template(query_prompt_template),\n ]\n )\n rerank_chain = (\n rerank_prompts\n | llm.bind(response_format={\"type\": \"json_object\"})\n | JsonOutputParser()\n )\n rerank_res = rerank_chain.invoke(\n {\"question\": query, \"relation_des_str\": relation_des_str}\n )\n rerank_relation_ids = []\n rerank_relation_lines = rerank_res[\"useful_relationships\"]\n id_2_lines = {}\n for line in rerank_relation_lines:\n id_ = int(line[line.find(\"[\") + 1 : line.find(\"]\")])\n id_2_lines[id_] = line.strip()\n rerank_relation_ids.append(id_)\n return rerank_relation_ids\n\n\nrerank_relation_ids = rerank_relations(\n query,\n relation_candidate_texts=relation_candidate_texts,\n relation_candidate_ids=relation_candidate_ids,\n)\n","final_top_k = 2\n\nfinal_passages = []\nfinal_passage_ids = []\nfor relation_id in rerank_relation_ids:\n for passage_id in relationid_2_passageids[relation_id]:\n if passage_id not in final_passage_ids:\n final_passage_ids.append(passage_id)\n final_passages.append(passages[passage_id])\npassages_from_our_method = final_passages[:final_top_k]\n","naive_passage_res = milvus_client.search(\n collection_name=passage_col_name,\n data=[query_embedding],\n limit=final_top_k,\n output_fields=[\"text\"],\n)[0]\npassages_from_naive_rag = [res[\"entity\"][\"text\"] for res in naive_passage_res]\n\nprint(\n f\"Passages retrieved from naive RAG: \\n{passages_from_naive_rag}\\n\\n\"\n f\"Passages retrieved from our method: \\n{passages_from_our_method}\\n\\n\"\n)\n\n\nprompt = ChatPromptTemplate.from_messages(\n [\n (\n \"human\",\n \"\"\"Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.\nQuestion: {question}\nContext: {context}\nAnswer:\"\"\",\n )\n ]\n)\n\nrag_chain = prompt | llm | StrOutputParser()\n\nanswer_from_naive_rag = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_naive_rag)}\n)\nanswer_from_our_method = rag_chain.invoke(\n {\"question\": query, \"context\": \"\\n\".join(passages_from_our_method)}\n)\n\nprint(\n f\"Answer from naive RAG: {answer_from_naive_rag}\\n\\nAnswer from our method: {answer_from_our_method}\"\n)\n"],"headingContent":"Graph RAG with Milvus","anchorList":[{"label":"使用 Milvus 的圖形 RAG","href":"Graph-RAG-with-Milvus","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"離線資料載入","href":"Offline-Data-Loading","type":2,"isActive":false},{"label":"線上查詢","href":"Online-Querying","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.md new file mode 100644 index 000000000..5292ac0e4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/graph_rag_with_milvus.md @@ -0,0 +1,509 @@ +--- +id: graph_rag_with_milvus.md +summary: 使用 Milvus 顯示 RAG +title: 使用 Milvus 的圖形 RAG +--- +

    使用 Milvus 的圖形 RAG

    Open In Colab +GitHub Repository

    +

    大型語言模型的廣泛應用突顯了改善其回應準確性與相關性的重要性。檢索增強世代 (Retrieval-Augmented Generation,RAG) 利用外部知識庫增強模型,提供更多的上下文資訊,並減少幻覺和知識不足等問題。然而,僅依賴簡單的 RAG 模式有其限制,尤其是在處理複雜的實體關係和多跳問題時,模型往往難以提供準確的答案。

    +

    將知識圖形 (KG) 引進 RAG 系統提供了新的解決方案。KG 以結構化的方式呈現實體及其關係,提供更精確的檢索資訊,並協助 RAG 更好地處理複雜的問題解答任務。KG-RAG 仍處於早期階段,對於如何從 KG 中有效地檢索實體及其關係,以及如何整合向量相似性搜尋與圖形結構,目前尚未達成共識。

    +

    在本筆記中,我們將介紹一種簡單但功能強大的方法,以大幅改善此情況的效能。它是一個簡單的 RAG 范例,先進行多向擷取,然後再重新排序,但它在邏輯上實現了 Graph RAG,並在處理多跳問題時達到最先進的效能。讓我們看看它是如何實作的。

    +

    + + + + +

    +

    先決條件

    在執行本筆記本之前,請確認您已安裝下列依賴項目:

    +
    $ pip install --upgrade --quiet pymilvus numpy scipy langchain langchain-core langchain-openai tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    我們將使用 OpenAI 的模型。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    匯入必要的函式庫和相依性。

    +
    import numpy as np
    +
    +from collections import defaultdict
    +from scipy.sparse import csr_matrix
    +from pymilvus import MilvusClient
    +from langchain_core.messages import AIMessage, HumanMessage
    +from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
    +from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
    +from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    +from tqdm import tqdm
    +
    +

    初始化 Milvus 客戶端實例、LLM 及嵌入模型。

    +
    milvus_client = MilvusClient(uri="./milvus.db")
    +
    +llm = ChatOpenAI(
    +    model="gpt-4o",
    +    temperature=0,
    +)
    +embedding_model = OpenAIEmbeddings(model="text-embedding-3-small")
    +
    +
    +

    對於 MilvusClient 中的 args:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,對應 Zilliz Cloud 的Public Endpoint 和 Api key
    • +
    +
    +

    離線資料載入

    資料準備

    我們將以一個介紹 Bernoulli 家族與 Euler 關係的 nano 資料集為例進行說明。實際上,您可以使用任何方法從自訂的語料庫中抽取三元組。

    +
    nano_dataset = [
    +    {
    +        "passage": "Jakob Bernoulli (1654–1705): Jakob was one of the earliest members of the Bernoulli family to gain prominence in mathematics. He made significant contributions to calculus, particularly in the development of the theory of probability. He is known for the Bernoulli numbers and the Bernoulli theorem, a precursor to the law of large numbers. He was the older brother of Johann Bernoulli, another influential mathematician, and the two had a complex relationship that involved both collaboration and rivalry.",
    +        "triplets": [
    +            ["Jakob Bernoulli", "made significant contributions to", "calculus"],
    +            [
    +                "Jakob Bernoulli",
    +                "made significant contributions to",
    +                "the theory of probability",
    +            ],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli numbers"],
    +            ["Jakob Bernoulli", "is known for", "the Bernoulli theorem"],
    +            ["The Bernoulli theorem", "is a precursor to", "the law of large numbers"],
    +            ["Jakob Bernoulli", "was the older brother of", "Johann Bernoulli"],
    +        ],
    +    },
    +    {
    +        "passage": "Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.",
    +        "triplets": [
    +            [
    +                "Johann Bernoulli",
    +                "was a major figure of",
    +                "the development of calculus",
    +            ],
    +            ["Johann Bernoulli", "was", "Jakob's younger brother"],
    +            ["Johann Bernoulli", "worked on", "infinitesimal calculus"],
    +            ["Johann Bernoulli", "was instrumental in spreading", "Leibniz's ideas"],
    +            ["Johann Bernoulli", "contributed to", "the calculus of variations"],
    +            ["Johann Bernoulli", "was known for", "the brachistochrone problem"],
    +        ],
    +    },
    +    {
    +        "passage": "Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.",
    +        "triplets": [
    +            ["Daniel Bernoulli", "was the son of", "Johann Bernoulli"],
    +            ["Daniel Bernoulli", "made major contributions to", "fluid dynamics"],
    +            ["Daniel Bernoulli", "made major contributions to", "probability"],
    +            ["Daniel Bernoulli", "made major contributions to", "statistics"],
    +            ["Daniel Bernoulli", "is most famous for", "Bernoulli’s principle"],
    +            [
    +                "Bernoulli’s principle",
    +                "is fundamental to",
    +                "the understanding of aerodynamics",
    +            ],
    +        ],
    +    },
    +    {
    +        "passage": "Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.",
    +        "triplets": [
    +            [
    +                "Leonhard Euler",
    +                "had a significant relationship with",
    +                "the Bernoulli family",
    +            ],
    +            ["leonhard Euler", "was born in", "Basel"],
    +            ["Leonhard Euler", "was a student of", "Johann Bernoulli"],
    +            ["Johann Bernoulli's influence", "was profound on", "Euler"],
    +        ],
    +    },
    +]
    +
    +

    我們以下列方式建構實體與關係:

    +
      +
    • 實體是三元組中的主語或客語,因此我們直接從三元組中抽取它們。
    • +
    • 在這裡,我們透過直接串連主語、謂語和客語來建構關係的概念,並在中間加上空格。
    • +
    +

    我們也準備了一個 dict 來對應實體 id 到關係 id,以及另一個 dict 來對應關係 id 到通道 id,以備日後使用。

    +
    entityid_2_relationids = defaultdict(list)
    +relationid_2_passageids = defaultdict(list)
    +
    +entities = []
    +relations = []
    +passages = []
    +for passage_id, dataset_info in enumerate(nano_dataset):
    +    passage, triplets = dataset_info["passage"], dataset_info["triplets"]
    +    passages.append(passage)
    +    for triplet in triplets:
    +        if triplet[0] not in entities:
    +            entities.append(triplet[0])
    +        if triplet[2] not in entities:
    +            entities.append(triplet[2])
    +        relation = " ".join(triplet)
    +        if relation not in relations:
    +            relations.append(relation)
    +            entityid_2_relationids[entities.index(triplet[0])].append(
    +                len(relations) - 1
    +            )
    +            entityid_2_relationids[entities.index(triplet[2])].append(
    +                len(relations) - 1
    +            )
    +        relationid_2_passageids[relations.index(relation)].append(passage_id)
    +
    +

    資料插入

    為實體、關係和段落建立 Milvus 集合。在我們的方法中,實體集合和關係集合作為圖形建構的主要集合,而通道集合則作為幼稚 RAG 檢索比較或輔助用途。

    +
    embedding_dim = len(embedding_model.embed_query("foo"))
    +
    +
    +def create_milvus_collection(collection_name: str):
    +    if milvus_client.has_collection(collection_name=collection_name):
    +        milvus_client.drop_collection(collection_name=collection_name)
    +    milvus_client.create_collection(
    +        collection_name=collection_name,
    +        dimension=embedding_dim,
    +        consistency_level="Strong",
    +    )
    +
    +
    +entity_col_name = "entity_collection"
    +relation_col_name = "relation_collection"
    +passage_col_name = "passage_collection"
    +create_milvus_collection(entity_col_name)
    +create_milvus_collection(relation_col_name)
    +create_milvus_collection(passage_col_name)
    +
    +

    將資料連同其 metadata 資訊插入 Milvus 集合,包括實體集合、關係集合和段落集合。元資料資訊包括段落 id 和相鄰實體或關係 id。

    +
    def milvus_insert(
    +    collection_name: str,
    +    text_list: list[str],
    +):
    +    batch_size = 512
    +    for row_id in tqdm(range(0, len(text_list), batch_size), desc="Inserting"):
    +        batch_texts = text_list[row_id : row_id + batch_size]
    +        batch_embeddings = embedding_model.embed_documents(batch_texts)
    +
    +        batch_ids = [row_id + j for j in range(len(batch_texts))]
    +        batch_data = [
    +            {
    +                "id": id_,
    +                "text": text,
    +                "vector": vector,
    +            }
    +            for id_, text, vector in zip(batch_ids, batch_texts, batch_embeddings)
    +        ]
    +        milvus_client.insert(
    +            collection_name=collection_name,
    +            data=batch_data,
    +        )
    +
    +
    +milvus_insert(
    +    collection_name=relation_col_name,
    +    text_list=relations,
    +)
    +
    +milvus_insert(
    +    collection_name=entity_col_name,
    +    text_list=entities,
    +)
    +
    +milvus_insert(
    +    collection_name=passage_col_name,
    +    text_list=passages,
    +)
    +
    +
    Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.02it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  1.39it/s]
    +Inserting: 100%|███████████████████████████████████| 1/1 [00:00<00:00,  2.28it/s]
    +
    +

    線上查詢

    相似性擷取

    我們根據輸入的查詢,從 Milvus 擷取前 K 個相似的實體與關係。

    +

    在執行實體擷取時,我們必須先使用特定的方法,例如 NER(命名實體辨識),從查詢文字中萃取查詢實體。為了簡單起見,我們在此準備 NER 的結果。實際上,您可以使用任何其他模型或方法來從查詢中抽取實體。

    +
    query = "What contribution did the son of Euler's teacher make?"
    +
    +query_ner_list = ["Euler"]
    +# query_ner_list = ner(query) # In practice, replace it with your custom NER approach
    +
    +query_ner_embeddings = [
    +    embedding_model.embed_query(query_ner) for query_ner in query_ner_list
    +]
    +
    +top_k = 3
    +
    +entity_search_res = milvus_client.search(
    +    collection_name=entity_col_name,
    +    data=query_ner_embeddings,
    +    limit=top_k,
    +    output_fields=["id"],
    +)
    +
    +query_embedding = embedding_model.embed_query(query)
    +
    +relation_search_res = milvus_client.search(
    +    collection_name=relation_col_name,
    +    data=[query_embedding],
    +    limit=top_k,
    +    output_fields=["id"],
    +)[0]
    +
    +

    展開子圖

    我們使用擷取到的實體和關係來展開子圖,並取得候選關係,然後從兩種方式合併它們。以下是子圖擴展過程的流程圖: + + + +

    +

    在此我們建構一個相鄰矩陣,並使用矩陣乘法來計算幾度內的相鄰映射資訊。透過這種方式,我們可以快速取得任何擴充度的資訊。

    +
    # Construct the adjacency matrix of entities and relations where the value of the adjacency matrix is 1 if an entity is related to a relation, otherwise 0.
    +entity_relation_adj = np.zeros((len(entities), len(relations)))
    +for entity_id, entity in enumerate(entities):
    +    entity_relation_adj[entity_id, entityid_2_relationids[entity_id]] = 1
    +
    +# Convert the adjacency matrix to a sparse matrix for efficient computation.
    +entity_relation_adj = csr_matrix(entity_relation_adj)
    +
    +# Use the entity-relation adjacency matrix to construct 1 degree entity-entity and relation-relation adjacency matrices.
    +entity_adj_1_degree = entity_relation_adj @ entity_relation_adj.T
    +relation_adj_1_degree = entity_relation_adj.T @ entity_relation_adj
    +
    +# Specify the target degree of the subgraph to be expanded.
    +# 1 or 2 is enough for most cases.
    +target_degree = 1
    +
    +# Compute the target degree adjacency matrices using matrix multiplication.
    +entity_adj_target_degree = entity_adj_1_degree
    +for _ in range(target_degree - 1):
    +    entity_adj_target_degree = entity_adj_target_degree * entity_adj_1_degree
    +relation_adj_target_degree = relation_adj_1_degree
    +for _ in range(target_degree - 1):
    +    relation_adj_target_degree = relation_adj_target_degree * relation_adj_1_degree
    +
    +entity_relation_adj_target_degree = entity_adj_target_degree @ entity_relation_adj
    +
    +

    從目標程度擴充矩陣中取值,我們可以很容易地從擷取的實體與關係中擴充相對應的程度,從而得到子圖的所有關係。

    +
    expanded_relations_from_relation = set()
    +expanded_relations_from_entity = set()
    +# You can set the similarity threshold here to guarantee the quality of the retrieved ones.
    +# entity_sim_filter_thresh = ...
    +# relation_sim_filter_thresh = ...
    +
    +filtered_hit_relation_ids = [
    +    relation_res["entity"]["id"]
    +    for relation_res in relation_search_res
    +    # if relation_res['distance'] > relation_sim_filter_thresh
    +]
    +for hit_relation_id in filtered_hit_relation_ids:
    +    expanded_relations_from_relation.update(
    +        relation_adj_target_degree[hit_relation_id].nonzero()[1].tolist()
    +    )
    +
    +filtered_hit_entity_ids = [
    +    one_entity_res["entity"]["id"]
    +    for one_entity_search_res in entity_search_res
    +    for one_entity_res in one_entity_search_res
    +    # if one_entity_res['distance'] > entity_sim_filter_thresh
    +]
    +
    +for filtered_hit_entity_id in filtered_hit_entity_ids:
    +    expanded_relations_from_entity.update(
    +        entity_relation_adj_target_degree[filtered_hit_entity_id].nonzero()[1].tolist()
    +    )
    +
    +# Merge the expanded relations from the relation and entity retrieval ways.
    +relation_candidate_ids = list(
    +    expanded_relations_from_relation | expanded_relations_from_entity
    +)
    +
    +relation_candidate_texts = [
    +    relations[relation_id] for relation_id in relation_candidate_ids
    +]
    +
    +

    我們透過擴展子圖得到候選關係,下一步將使用 LLM 對這些候選關係重新排序。

    +

    LLM 重新排序

    在這個階段,我們使用 LLM 強大的自我注意機制來進一步篩選和提昇候選關係集。我們使用單次提示,將查詢和候選關係集納入提示中,並指示 LLM 挑選可能有助於回答查詢的潛在關係。鑑於某些查詢可能很複雜,我們採用 Chain-of-Thought 方法,允許 LLM 在回應中闡明其思考過程。我們規定 LLM 的回應是 json 格式,以方便解析。

    +
    query_prompt_one_shot_input = """I will provide you with a list of relationship descriptions. Your task is to select 3 relationships that may be useful to answer the given question. Please return a JSON object containing your thought process and a list of the selected relationships in order of their relevance.
    +
    +Question:
    +When was the mother of the leader of the Third Crusade born?
    +
    +Relationship descriptions:
    +[1] Eleanor was born in 1122.
    +[2] Eleanor married King Louis VII of France.
    +[3] Eleanor was the Duchess of Aquitaine.
    +[4] Eleanor participated in the Second Crusade.
    +[5] Eleanor had eight children.
    +[6] Eleanor was married to Henry II of England.
    +[7] Eleanor was the mother of Richard the Lionheart.
    +[8] Richard the Lionheart was the King of England.
    +[9] Henry II was the father of Richard the Lionheart.
    +[10] Henry II was the King of England.
    +[11] Richard the Lionheart led the Third Crusade.
    +
    +"""
    +query_prompt_one_shot_output = """{"thought_process": "To answer the question about the birth of the mother of the leader of the Third Crusade, I first need to identify who led the Third Crusade and then determine who his mother was. After identifying his mother, I can look for the relationship that mentions her birth.", "useful_relationships": ["[11] Richard the Lionheart led the Third Crusade", "[7] Eleanor was the mother of Richard the Lionheart", "[1] Eleanor was born in 1122"]}"""
    +
    +query_prompt_template = """Question:
    +{question}
    +
    +Relationship descriptions:
    +{relation_des_str}
    +
    +"""
    +
    +
    +def rerank_relations(
    +    query: str, relation_candidate_texts: list[str], relation_candidate_ids: list[str]
    +) -> list[int]:
    +    relation_des_str = "\n".join(
    +        map(
    +            lambda item: f"[{item[0]}] {item[1]}",
    +            zip(relation_candidate_ids, relation_candidate_texts),
    +        )
    +    ).strip()
    +    rerank_prompts = ChatPromptTemplate.from_messages(
    +        [
    +            HumanMessage(query_prompt_one_shot_input),
    +            AIMessage(query_prompt_one_shot_output),
    +            HumanMessagePromptTemplate.from_template(query_prompt_template),
    +        ]
    +    )
    +    rerank_chain = (
    +        rerank_prompts
    +        | llm.bind(response_format={"type": "json_object"})
    +        | JsonOutputParser()
    +    )
    +    rerank_res = rerank_chain.invoke(
    +        {"question": query, "relation_des_str": relation_des_str}
    +    )
    +    rerank_relation_ids = []
    +    rerank_relation_lines = rerank_res["useful_relationships"]
    +    id_2_lines = {}
    +    for line in rerank_relation_lines:
    +        id_ = int(line[line.find("[") + 1 : line.find("]")])
    +        id_2_lines[id_] = line.strip()
    +        rerank_relation_ids.append(id_)
    +    return rerank_relation_ids
    +
    +
    +rerank_relation_ids = rerank_relations(
    +    query,
    +    relation_candidate_texts=relation_candidate_texts,
    +    relation_candidate_ids=relation_candidate_ids,
    +)
    +
    +

    取得最終結果

    我們可以從重新排序的關係中取得最終擷取的段落。

    +
    final_top_k = 2
    +
    +final_passages = []
    +final_passage_ids = []
    +for relation_id in rerank_relation_ids:
    +    for passage_id in relationid_2_passageids[relation_id]:
    +        if passage_id not in final_passage_ids:
    +            final_passage_ids.append(passage_id)
    +            final_passages.append(passages[passage_id])
    +passages_from_our_method = final_passages[:final_top_k]
    +
    +

    我們可以將結果與幼稚的 RAG 方法進行比較,後者是直接從段落集合中根據查詢嵌入擷取 topK 段落。

    +
    naive_passage_res = milvus_client.search(
    +    collection_name=passage_col_name,
    +    data=[query_embedding],
    +    limit=final_top_k,
    +    output_fields=["text"],
    +)[0]
    +passages_from_naive_rag = [res["entity"]["text"] for res in naive_passage_res]
    +
    +print(
    +    f"Passages retrieved from naive RAG: \n{passages_from_naive_rag}\n\n"
    +    f"Passages retrieved from our method: \n{passages_from_our_method}\n\n"
    +)
    +
    +
    +prompt = ChatPromptTemplate.from_messages(
    +    [
    +        (
    +            "human",
    +            """Use the following pieces of retrieved context to answer the question. If there is not enough information in the retrieved context to answer the question, just say that you don't know.
    +Question: {question}
    +Context: {context}
    +Answer:""",
    +        )
    +    ]
    +)
    +
    +rag_chain = prompt | llm | StrOutputParser()
    +
    +answer_from_naive_rag = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_naive_rag)}
    +)
    +answer_from_our_method = rag_chain.invoke(
    +    {"question": query, "context": "\n".join(passages_from_our_method)}
    +)
    +
    +print(
    +    f"Answer from naive RAG: {answer_from_naive_rag}\n\nAnswer from our method: {answer_from_our_method}"
    +)
    +
    +
    Passages retrieved from naive RAG: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Johann Bernoulli (1667–1748): Johann, Jakob’s younger brother, was also a major figure in the development of calculus. He worked on infinitesimal calculus and was instrumental in spreading the ideas of Leibniz across Europe. Johann also contributed to the calculus of variations and was known for his work on the brachistochrone problem, which is the curve of fastest descent between two points.']
    +
    +Passages retrieved from our method: 
    +['Leonhard Euler (1707–1783) was one of the greatest mathematicians of all time, and his relationship with the Bernoulli family was significant. Euler was born in Basel and was a student of Johann Bernoulli, who recognized his exceptional talent and mentored him in mathematics. Johann Bernoulli’s influence on Euler was profound, and Euler later expanded upon many of the ideas and methods he learned from the Bernoullis.', 'Daniel Bernoulli (1700–1782): The son of Johann Bernoulli, Daniel made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.']
    +
    +
    +Answer from naive RAG: I don't know. The retrieved context does not provide information about the contributions made by the son of Euler's teacher.
    +
    +Answer from our method: The son of Euler's teacher, Daniel Bernoulli, made major contributions to fluid dynamics, probability, and statistics. He is most famous for Bernoulli’s principle, which describes the behavior of fluid flow and is fundamental to the understanding of aerodynamics.
    +
    +

    我們可以看到,從 naive RAG 擷取的段落遺漏了一個 ground-truth 段落,這導致了錯誤的答案;而從我們的方法擷取的段落是正確的,這有助於得到準確的問題答案。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.json new file mode 100644 index 000000000..f63d8bf09 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install \"pymilvus[model]\"\n$ pip install hdbscan\n$ pip install plotly\n$ pip install umap-learn\n","import pandas as pd\nfrom dotenv import load_dotenv\nfrom pymilvus.model.hybrid import BGEM3EmbeddingFunction\nfrom pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType\n\nload_dotenv()\n\ndf = pd.read_csv(\"news_data_dedup.csv\")\n\n\ndocs = [\n f\"{title}\\n{description}\" for title, description in zip(df.title, df.description)\n]\nef = BGEM3EmbeddingFunction()\n\nembeddings = ef(docs)[\"dense\"]\n\nconnections.connect(uri=\"milvus.db\")\n","fields = [\n FieldSchema(\n name=\"id\", dtype=DataType.INT64, is_primary=True, auto_id=True\n ), # Primary ID field\n FieldSchema(\n name=\"embedding\", dtype=DataType.FLOAT_VECTOR, dim=1024\n ), # Float vector field (embedding)\n FieldSchema(\n name=\"text\", dtype=DataType.VARCHAR, max_length=65535\n ), # Float vector field (embedding)\n]\n\nschema = CollectionSchema(fields=fields, description=\"Embedding collection\")\n\ncollection = Collection(name=\"news_data\", schema=schema)\n\nfor doc, embedding in zip(docs, embeddings):\n collection.insert({\"text\": doc, \"embedding\": embedding})\n print(doc)\n\nindex_params = {\"index_type\": \"FLAT\", \"metric_type\": \"L2\", \"params\": {}}\n\ncollection.create_index(field_name=\"embedding\", index_params=index_params)\n\ncollection.flush()\n","import hdbscan\nimport numpy as np\nimport pandas as pd\nimport plotly.express as px\nfrom umap import UMAP\nfrom pymilvus import Collection\n\ncollection = Collection(name=\"news_data\")\ncollection.load()\n\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"embedding\"]\n)\n\nsearch_params = {\n \"metric_type\": \"L2\",\n \"params\": {\"nprobe\": 10},\n} # L2 is Euclidean distance\n\nids = []\ndist = {}\n\nembeddings = []\n","while True:\n batch = iterator.next()\n batch_ids = [data[\"id\"] for data in batch]\n ids.extend(batch_ids)\n\n query_vectors = [data[\"embedding\"] for data in batch]\n embeddings.extend(query_vectors)\n\n results = collection.search(\n data=query_vectors,\n limit=50,\n anns_field=\"embedding\",\n param=search_params,\n output_fields=[\"id\"],\n )\n for i, batch_id in enumerate(batch_ids):\n dist[batch_id] = []\n for result in results[i]:\n dist[batch_id].append((result.id, result.distance))\n\n if len(batch) == 0:\n break\n\nids2index = {}\n\nfor id in dist:\n ids2index[id] = len(ids2index)\n\ndist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)\n\nfor id in dist:\n for result in dist[id]:\n dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]\n\nh = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric=\"precomputed\")\nhdb = h.fit(dist_metric)\n","import plotly.io as pio\n\npio.renderers.default = \"notebook\"\n\numap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)\n\ndf_umap = (\n pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=[\"x\", \"y\"])\n .assign(cluster=lambda df: hdb.labels_.astype(str))\n .query('cluster != \"-1\"')\n .sort_values(by=\"cluster\")\n)\niterator = collection.query_iterator(\n batch_size=10, expr=\"id > 0\", output_fields=[\"id\", \"text\"]\n)\n\nids = []\ntexts = []\n\nwhile True:\n batch = iterator.next()\n if len(batch) == 0:\n break\n batch_ids = [data[\"id\"] for data in batch]\n batch_texts = [data[\"text\"] for data in batch]\n ids.extend(batch_ids)\n texts.extend(batch_texts)\n\nshow_texts = [texts[i] for i in df_umap.index]\n\ndf_umap[\"hover_text\"] = show_texts\nfig = px.scatter(\n df_umap, x=\"x\", y=\"y\", color=\"cluster\", hover_data={\"hover_text\": True}\n)\nfig.show()\n"],"headingContent":"HDBSCAN Clustering with Milvus","anchorList":[{"label":"使用 Milvus 進行 HDBSCAN 聚類","href":"HDBSCAN-Clustering-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"下載資料","href":"Download-Data","type":2,"isActive":false},{"label":"萃取嵌入到 Milvus","href":"Extract-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"建構 HDBSCAN 的距離矩陣","href":"Construct-the-Distance-Matrix-for-HDBSCAN","type":2,"isActive":false},{"label":"使用 UMAP 進行聚類可視化","href":"Clusters-Visualization-using-UMAP","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.md new file mode 100644 index 000000000..f501a801f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/hdbscan_clustering_with_milvus.md @@ -0,0 +1,273 @@ +--- +id: hdbscan_clustering_with_milvus.md +summary: >- + 在本筆記簿中,我們將使用 BGE-M3 嵌入模型從新聞標題資料集中萃取嵌入資料,利用 Milvus 有效計算嵌入資料之間的距離,以協助 HDBSCAN + 進行聚類,然後將結果可視化,以便使用 UMAP 方法進行分析。本筆記本是 Dylan Castillo 文章的 Milvus 改編版本。 +title: 使用 Milvus 進行 HDBSCAN 聚類 +--- +

    使用 Milvus 進行 HDBSCAN 聚類

    +Open In Colab + + +GitHub Repository +

    +

    使用深度學習模型可以將資料轉換為嵌入,從而捕捉原始資料的有意義表示。透過應用無監督聚類演算法,我們可以根據類似資料點的固有模式將其歸類在一起。HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) 是一種廣泛使用的聚類演算法,可透過分析資料點的密度和距離,將資料點有效地分組。它對於發現不同形狀和大小的聚類特別有用。在本筆記簿中,我們將使用 HDBSCAN 搭配高效能向量資料庫 Milvus,根據資料點的內嵌,將資料點聚類為不同的群組。

    +

    HDBSCAN (Hierarchical Density-Based Spatial Clustering of Applications with Noise) 是一種聚類演算法,依靠計算資料點在嵌入空間中的距離。這些由深度學習模型建立的內嵌以高維形式表示資料。為了將相似的資料點歸類,HDBSCAN 會判斷它們的接近度和密度,但有效率地計算這些距離,特別是對於大型資料集而言,可能是一項挑戰。

    +

    Milvus 是一個高效能向量資料庫,透過儲存和索引嵌入來優化這個過程,讓相似向量的快速檢索成為可能。HDBSCAN 和 Milvus 一起使用時,可以在嵌入空間中對大規模資料集進行有效的聚類。

    +

    在本筆記簿中,我們將使用 BGE-M3 嵌入模型從新聞標題資料集中萃取嵌入資料,利用 Milvus 有效計算嵌入資料之間的距離,以協助 HDBSCAN 進行聚類,然後將結果可視化,以便使用 UMAP 方法進行分析。本筆記本是Dylan Castillo 文章的 Milvus 改編版本。

    +

    準備工作

    從 https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/ 下載新聞資料集

    +
    $ pip install "pymilvus[model]"
    +$ pip install hdbscan
    +$ pip install plotly
    +$ pip install umap-learn
    +
    +

    下載資料

    從 https://www.kaggle.com/datasets/dylanjcastillo/news-headlines-2024/ 下載新聞資料集,萃取news_data_dedup.csv 並放入目前目錄。

    +

    萃取嵌入到 Milvus

    我們將使用 Milvus 建立一個集合,並使用 BGE-M3 模型抽取密集嵌入。

    +
    import pandas as pd
    +from dotenv import load_dotenv
    +from pymilvus.model.hybrid import BGEM3EmbeddingFunction
    +from pymilvus import FieldSchema, Collection, connections, CollectionSchema, DataType
    +
    +load_dotenv()
    +
    +df = pd.read_csv("news_data_dedup.csv")
    +
    +
    +docs = [
    +    f"{title}\n{description}" for title, description in zip(df.title, df.description)
    +]
    +ef = BGEM3EmbeddingFunction()
    +
    +embeddings = ef(docs)["dense"]
    +
    +connections.connect(uri="milvus.db")
    +
    +
    +
      +
    • 如果你只需要一個本機向量資料庫來做小規模的資料或原型設計,將 uri 設定為一個本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您在 Milvus 上啟用認證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 API key
    • +
    +
    +
    fields = [
    +    FieldSchema(
    +        name="id", dtype=DataType.INT64, is_primary=True, auto_id=True
    +    ),  # Primary ID field
    +    FieldSchema(
    +        name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1024
    +    ),  # Float vector field (embedding)
    +    FieldSchema(
    +        name="text", dtype=DataType.VARCHAR, max_length=65535
    +    ),  # Float vector field (embedding)
    +]
    +
    +schema = CollectionSchema(fields=fields, description="Embedding collection")
    +
    +collection = Collection(name="news_data", schema=schema)
    +
    +for doc, embedding in zip(docs, embeddings):
    +    collection.insert({"text": doc, "embedding": embedding})
    +    print(doc)
    +
    +index_params = {"index_type": "FLAT", "metric_type": "L2", "params": {}}
    +
    +collection.create_index(field_name="embedding", index_params=index_params)
    +
    +collection.flush()
    +
    +

    建構 HDBSCAN 的距離矩陣

    HDBSCAN 需要計算點與點之間的距離,以進行聚類,而這可能是計算密集的工作。由於較遠的點對聚類分派的影響較小,我們可以透過計算前 k 個最近鄰居來提高效率。在這個範例中,我們使用 FLAT 索引,但對於大規模的資料集,Milvus 支援更進階的索引方法來加速搜尋過程。 首先,我們需要取得一個迭代器來迭代之前建立的 Milvus 集合。

    +
    import hdbscan
    +import numpy as np
    +import pandas as pd
    +import plotly.express as px
    +from umap import UMAP
    +from pymilvus import Collection
    +
    +collection = Collection(name="news_data")
    +collection.load()
    +
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "embedding"]
    +)
    +
    +search_params = {
    +    "metric_type": "L2",
    +    "params": {"nprobe": 10},
    +}  # L2 is Euclidean distance
    +
    +ids = []
    +dist = {}
    +
    +embeddings = []
    +
    +

    我們將遍历 Milvus 集合中的所有嵌入。對於每個嵌入,我們會搜尋它在同一集合中的前 k 個鄰居,並取得它們的 ID 和距離。之後,我們還要建立字典,將原始 ID 對應至距離矩陣中的連續索引。完成後,我們需要建立一個距離矩陣,初始化所有元素為無窮大,並填充我們搜尋到的元素。如此一來,遠距離的點之間的距離將會被忽略。最後,我們使用 HDBSCAN 函式庫,利用我們建立的距離矩陣對點進行聚類。我們需要設定 metric 為「precomputed」,以表示資料是距離矩陣,而不是原始的 embeddings。

    +
    while True:
    +    batch = iterator.next()
    +    batch_ids = [data["id"] for data in batch]
    +    ids.extend(batch_ids)
    +
    +    query_vectors = [data["embedding"] for data in batch]
    +    embeddings.extend(query_vectors)
    +
    +    results = collection.search(
    +        data=query_vectors,
    +        limit=50,
    +        anns_field="embedding",
    +        param=search_params,
    +        output_fields=["id"],
    +    )
    +    for i, batch_id in enumerate(batch_ids):
    +        dist[batch_id] = []
    +        for result in results[i]:
    +            dist[batch_id].append((result.id, result.distance))
    +
    +    if len(batch) == 0:
    +        break
    +
    +ids2index = {}
    +
    +for id in dist:
    +    ids2index[id] = len(ids2index)
    +
    +dist_metric = np.full((len(ids), len(ids)), np.inf, dtype=np.float64)
    +
    +for id in dist:
    +    for result in dist[id]:
    +        dist_metric[ids2index[id]][ids2index[result[0]]] = result[1]
    +
    +h = hdbscan.HDBSCAN(min_samples=3, min_cluster_size=3, metric="precomputed")
    +hdb = h.fit(dist_metric)
    +
    +

    之後,HDBSCAN 聚類就完成了。我們可以得到一些資料,並顯示其聚類。請注意,有些資料不會被分配到任何叢集,這表示它們是雜訊,因為它們位於一些稀疏的區域。

    +

    使用 UMAP 進行聚類可視化

    我們已經使用 HDBSCAN 對資料進行聚類,並取得每個資料點的標籤。然而,使用一些可視化技術,我們可以得到叢集的全貌,以便進行直觀的分析。現在我們要使用 UMAP 來視覺化聚類。UMAP 是一種用於降維的有效方法,在保留高維資料結構的同時,將其投影到低維空間以進行可視化或進一步分析。在這裡,我們再次遍歷資料點,並取得原始資料的 ID 和文字,然後我們使用 ploty 將資料點與這些 metainfo 繪製成圖形,並使用不同的顏色代表不同的叢集。

    +
    import plotly.io as pio
    +
    +pio.renderers.default = "notebook"
    +
    +umap = UMAP(n_components=2, random_state=42, n_neighbors=80, min_dist=0.1)
    +
    +df_umap = (
    +    pd.DataFrame(umap.fit_transform(np.array(embeddings)), columns=["x", "y"])
    +    .assign(cluster=lambda df: hdb.labels_.astype(str))
    +    .query('cluster != "-1"')
    +    .sort_values(by="cluster")
    +)
    +iterator = collection.query_iterator(
    +    batch_size=10, expr="id > 0", output_fields=["id", "text"]
    +)
    +
    +ids = []
    +texts = []
    +
    +while True:
    +    batch = iterator.next()
    +    if len(batch) == 0:
    +        break
    +    batch_ids = [data["id"] for data in batch]
    +    batch_texts = [data["text"] for data in batch]
    +    ids.extend(batch_ids)
    +    texts.extend(batch_texts)
    +
    +show_texts = [texts[i] for i in df_umap.index]
    +
    +df_umap["hover_text"] = show_texts
    +fig = px.scatter(
    +    df_umap, x="x", y="y", color="cluster", hover_data={"hover_text": True}
    +)
    +fig.show()
    +
    +

    + + image + 圖像

    +

    在這裡,我們展示了資料很好的聚類,您可以將滑鼠懸停在點上,查看它們所代表的文字。透過這本筆記,我們希望您能學習如何使用 HDBSCAN 對 Milvus 的嵌入式資料進行有效率的聚類,這也可以應用在其他類型的資料上。結合大型語言模型,這個方法可以讓您在大規模下對資料進行更深入的分析。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.json b/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.json new file mode 100644 index 000000000..671337727 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"How to Enhance the Performance of Your RAG Pipeline","anchorList":[{"label":"如何增強 RAG 管道的效能","href":"How-to-Enhance-the-Performance-of-Your-RAG-Pipeline","type":1,"isActive":false},{"label":"標準的 RAG 管線","href":"A-Standard-RAG-Pipeline","type":2,"isActive":false},{"label":"各種類型的 RAG 增強技術","href":"Various-Types-of-RAG-Enhancement-Techniques","type":2,"isActive":false},{"label":"查詢增強","href":"Query-Enhancement","type":2,"isActive":false},{"label":"強化索引","href":"Indexing-Enhancement","type":2,"isActive":false},{"label":"強化擷取器","href":"Retriever-Enhancement","type":2,"isActive":false},{"label":"生成器增強","href":"Generator-Enhancement","type":2,"isActive":false},{"label":"RAG Pipeline 強化","href":"RAG-Pipeline-Enhancement","type":2,"isActive":false},{"label":"總結","href":"Summary","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.md b/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.md new file mode 100644 index 000000000..b741af268 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/how_to_enhance_your_rag.md @@ -0,0 +1,293 @@ +--- +id: how_to_enhance_your_rag.md +summary: >- + 隨著 Retrieval Augmented Generation RAG 應用程式的日益普及,提升其效能的問題也愈來愈受到關注。本文將介紹優化 RAG + 管道的所有可能方式,並提供相應的圖解,協助您快速瞭解主流的 RAG 優化策略。 +title: 如何增強 RAG 管道的效能 +--- +

    如何增強 RAG 管道的效能

    隨著 Retrieval Augmented Generation(RAG) 應用程式的日益普及,提升其效能的問題也日益受到關注。本文將介紹優化 RAG 管道的所有可能方式,並提供相應的圖解,協助您快速瞭解主流的 RAG 優化策略。

    +

    需要注意的是,我們只會對這些策略和技術進行高層次的探討,著重於它們如何整合到 RAG 系統中。但是,我們不會深入探討複雜的細節,也不會引導您逐步實施。

    +

    標準的 RAG 管線

    下圖顯示了最直接的 RAG 流水線。首先,文件塊會載入向量儲存庫 (例如MilvusZilliz cloud)。接著,向量儲存庫擷取與查詢最相關的 Top-K 文檔區。這些相關的文件塊會被注入到LLM 的上下文提示中,最後由 LLM 傳回最終的答案。

    +

    + + + + +

    +

    各種類型的 RAG 增強技術

    我們可以根據 RAG 管道階段中的角色,將不同的 RAG 增強方法分類。

    +
      +
    • 查詢增強:修改和處理 RAG 輸入的查詢過程,以更好地表達或處理查詢意圖。
    • +
    • 索引增強:使用多重分塊(multi-chunking)、逐步索引(step-wise indexing)或多向索引(multi-way indexing)等技術優化分塊索引的建立。
    • +
    • Retriever 增強:在檢索過程中應用最佳化技術與策略。
    • +
    • 生成器增強:在為 LLM 組合提示時調整和優化提示,以提供更好的回應。
    • +
    • RAG Pipeline 增強功能:在整個 RAG 管道中動態切換流程,包括使用代理程式或工具來最佳化 RAG 管道中的關鍵步驟。
    • +
    +

    接下來,我們將介紹每個類別下的特定方法。

    +

    查詢增強

    讓我們探索四種有效的方法來增強您的查詢體驗:假設問題 (Hypothetical Questions)、假設文件嵌入 (Hypothetical Document Embeddings)、子查詢 (Sub-Queries) 和回溯提示 (Stepback Prompts)。

    +

    建立假設問題

    製作假設性問題是利用 LLM 來產生使用者可能針對每個文件區塊中的內容提出的多個問題。在使用者的實際查詢傳送至 LLM 之前,向量儲存器會擷取與實際查詢最相關的假設問題,以及其相對應的文件區塊,並將它們轉送至 LLM。

    +

    + + + + +

    +

    這種方法繞過向量搜尋過程中的跨領域不對稱問題,直接進行查詢對查詢的搜尋,減輕向量搜尋的負擔。然而,它會在產生假設問題時引入額外的開銷和不確定性。

    +

    HyDE (假設性文件嵌入)

    HyDE 是 Hypothetical Document Embeddings 的縮寫。它利用 LLM 來製作「假設文件」或虛假答案,以回應沒有上下文資訊的使用者查詢。此假答案隨後會轉換成向量嵌入,並用於查詢向量資料庫中最相關的文件塊。之後,向量資料庫會擷取 Top-K 最相關的文件塊,並將它們傳送給 LLM 和原始使用者查詢,以產生最終答案。

    +

    + + + + +

    +

    在解決向量搜尋中的跨領域不對稱問題時,此方法與假設問題技術相似。不過,它也有缺點,例如增加了計算成本和產生假答案的不確定性。

    +

    如需詳細資訊,請參閱HyDE論文。

    +

    建立子查詢

    當使用者的查詢太複雜時,我們可以使用 LLM 將它分解成較簡單的子查詢,然後再傳給向量資料庫和 LLM。讓我們來看看一個範例。

    +

    假設使用者詢問:「Milvus 和 Zilliz Cloud 的功能有何差異? 這個問題相當複雜,在我們的知識庫中可能沒有直接的答案。要解決這個問題,我們可以將它分割成兩個較簡單的子查詢:

    +
      +
    • 子查詢 1:「Milvus 有哪些功能?
    • +
    • 子查詢 2:「Zilliz Cloud 有哪些功能?
    • +
    +

    有了這些子查詢之後,我們將它們全部轉換成向量嵌入之後傳送給向量資料庫。向量資料庫會找出與每個子查詢最相關的 Top-K 文件塊。最後,LLM 會使用這些資訊來產生更好的答案。

    +

    + + + + +

    +

    透過將用戶查詢分解為子查詢,我們可以讓系統更容易找到相關資訊並提供準確的答案,即使是複雜的問題也不例外。

    +

    建立回溯提示

    另一種簡化複雜使用者查詢的方法是建立回溯提示。此技術包括使用 LLM 將複雜的使用者查詢抽象為回溯問題」**。然後,向量資料庫會使用這些回溯問題來擷取最相關的文件區塊。最後,LLM 會根據這些擷取的文件區塊產生更精確的答案。

    +

    讓我們用一個例子來說明這項技術。考慮以下的查詢,這個查詢相當複雜,而且無法直接回答:

    +

    原始使用者查詢:"我有一個有 100 億筆記錄的資料集,想要將它儲存在 Milvus 中進行查詢。可以嗎?"

    +

    為了簡化這個使用者查詢,我們可以使用 LLM 來產生一個更直接的回溯問題:

    +

    回溯問題:「Milvus 可以處理的資料集大小限制是多少?」

    +

    + + + + +

    +

    這個方法可以幫助我們對複雜的查詢得到更好、更準確的答案。它可以將原始問題分解成更簡單的形式,讓我們的系統更容易找到相關資訊,並提供準確的回應。

    +

    強化索引

    增強索引是增強 RAG 應用程式效能的另一項策略。讓我們探索三種索引增強技術。

    +

    自動合併文件塊

    在建立索引時,我們可以使用兩個粒度層級:子文件塊及其對應的父文件塊。一開始,我們以較細的細節層級搜尋子資料塊。接著,我們會使用合併策略:如果前k 個子資料塊中有特定數量(n)的子資料塊屬於相同的父資料塊,我們就會將此父資料塊提供給 LLM 作為上下文資訊。

    +

    + + + + +

    +

    這個方法已經在LlamaIndex 中實施。

    +

    建構分層索引

    為文件建立索引時,我們可以建立兩層索引:一層是文件摘要索引,另一層是文件片段索引。向量搜尋過程分為兩個階段:首先,我們根據摘要篩選相關的文件,接著,我們在這些相關文件中檢索相對應的文件塊。

    +

    + + + + +

    +

    這種方法在涉及大量資料或資料分層的情況下非常有用,例如圖書館館藏中的內容檢索。

    +

    混合擷取與重新排序

    混合檢索與重新排序技術將一種或多種輔助檢索方法與向量相似性檢索整合在一起。然後,重新排序器會根據檢索結果與使用者查詢的相關性重新排序。

    +

    常見的補充檢索演算法包括以詞彙頻率為基礎的方法 (如BM25)或利用稀疏嵌入 (sparse embeddings) 的大型模型 (如Splade)。重新排序演算法包括 RRF 或更複雜的模型,例如Cross-Encoder,類似 BERT 架構。

    +

    + + + + +

    +

    此方法利用不同的檢索方法來改善檢索品質,並處理向量召回中的潛在缺口。

    +

    強化擷取器

    完善 RAG 系統中的 Retriever 元件也能改善 RAG 應用。讓我們來探討一些強化檢索器的有效方法。

    +

    句子視窗檢索

    在基本的 RAG 系統中,提供給 LLM 的文件塊是一個包含擷取嵌入塊的較大視窗。這可確保提供給 LLM 的資訊包含更廣泛的上下文細節,以減少資訊遺失。句子視窗擷取技術將嵌入擷取所使用的文件區塊與提供給 LLM 的區塊分離。

    +

    + + + + +

    +

    然而,擴大視窗大小可能會引入額外的干擾資訊。我們可以根據具體的業務需求調整視窗擴展的大小。

    +

    元資料篩選

    為了確保更精確的答案,我們可以在將擷取的文件傳送給 LLM 之前,先過濾時間和類別等元資料,以精簡擷取的文件。舉例來說,如果要擷取跨越多年的財務報告,則根據所需年份進行篩選,即可精簡資訊以符合特定需求。這種方法在有大量資料和詳細元資料的情況下非常有效,例如圖書館館藏的內容檢索。

    +

    + + + + +

    +

    生成器增強

    讓我們透過改進 RAG 系統中的產生器,探索更多 RAG 優化技術。

    +

    壓縮 LLM 提示

    檢索到的文件塊中的雜訊資訊會對 RAG 最終答案的準確性造成重大影響。LLM 中有限的提示視窗也對更精確的答案造成障礙。為了解決這個難題,我們可以壓縮不相關的細節、強調關鍵段落,並減少擷取文件塊的整體上下文長度。

    +

    + + + + +

    +

    此方法類似於先前討論過的混合擷取與重新排序 (Reranking) 方法,利用重新排序器 (Reranker) 來篩選出不相關的文件區塊。

    +

    調整提示中的文塊順序

    在論文「Lost in the middle」中,研究人員觀察到 LLMs 在推理過程中經常忽略給定文件中間的資訊。相反,他們傾向於更依賴文件開頭和結尾的資訊。

    +

    基於這個觀察,我們可以調整擷取知識區塊的順序來改善答案品質:當擷取多個知識區塊時,置信度相對較低的知識區塊會被放在中間,而置信度相對較高的知識區塊會被放在兩端。

    +

    + + + + +

    +

    RAG Pipeline 強化

    我們也可以透過強化整個 RAG Pipeline 來提升您的 RAG 應用程式效能。

    +

    自我反省

    此方法將自我反省的概念納入 AI 代理內。那麼,這項技術是如何運作的呢?

    +

    有些最初擷取的 Top-K 文件塊是模棱兩可的,可能無法直接回答使用者的問題。在這種情況下,我們可以進行第二輪反思,以驗證這些文件塊是否能真正回答查詢。

    +

    我們可以使用有效率的反省方法來進行反省,例如自然語言推論 (NLI) 模型或其他工具,例如網際網路搜尋來進行驗證。

    +

    + + + + +

    +

    這個自我反省的概念已經在多篇論文或專案中被探討過,包括Self-RAGCorrective RAGLangGraph 等。

    +

    使用代理進行查詢路由

    有時候,我們不必使用 RAG 系統來回答簡單的問題,因為這可能會造成更多的誤解和誤導資訊的推論。在這種情況下,我們可以在查詢階段使用代理作為路由器。這個代理會評估查詢是否需要經過 RAG 管道。如果需要,則啟動後續的 RAG 管道;否則,LLM 直接處理查詢。

    +

    + + + + + + + + + + +

    +

    代理可以採取各種形式,包括 LLM、小型分類模型,甚至是一組規則。

    +

    透過根據使用者意圖來路由查詢,可以將部分查詢重新導向,從而大幅提升回應時間,並顯著減少不必要的雜訊。

    +

    我們可以將查詢路由技術擴展到 RAG 系統中的其他流程,例如決定何時使用網路搜尋等工具、進行子查詢或搜尋圖片。此方法可確保 RAG 系統中的每個步驟都能根據查詢的特定需求進行最佳化,從而提高資訊檢索的效率與精確度。

    +

    總結

    雖然一般的 RAG 管道看似簡單,但要達到最佳的業務效能,往往需要更複雜的最佳化技術。

    +

    本文總結了各種常用的方法,以增強 RAG 應用程式的效能。我們也提供了清晰的說明,以協助您快速瞭解這些概念和技術,並加速其實作和最佳化。

    +

    您可以從這個GitHub 連結取得本文所列主要方法的簡單實作。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.json new file mode 100644 index 000000000..f5931457b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus \"pymilvus[model]\"\n","# Run this cell to download the dataset\n$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv\n","import pandas as pd\n\nfile_path = \"quora_duplicate_questions.tsv\"\ndf = pd.read_csv(file_path, sep=\"\\t\")\nquestions = set()\nfor _, row in df.iterrows():\n obj = row.to_dict()\n questions.add(obj[\"question1\"][:512])\n questions.add(obj[\"question2\"][:512])\n if len(questions) > 500: # Skip this if you want to use the full dataset\n break\n\ndocs = list(questions)\n\n# example question\nprint(docs[0])\n","from milvus_model.hybrid import BGEM3EmbeddingFunction\n\nef = BGEM3EmbeddingFunction(use_fp16=False, device=\"cpu\")\ndense_dim = ef.dim[\"dense\"]\n\n# Generate embeddings using BGE-M3 model\ndocs_embeddings = ef(docs)\n","from pymilvus import (\n connections,\n utility,\n FieldSchema,\n CollectionSchema,\n DataType,\n Collection,\n)\n\n# Connect to Milvus given URI\nconnections.connect(uri=\"./milvus.db\")\n\n# Specify the data schema for the new Collection\nfields = [\n # Use auto generated id as primary key\n FieldSchema(\n name=\"pk\", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100\n ),\n # Store the original text to retrieve based on semantically distance\n FieldSchema(name=\"text\", dtype=DataType.VARCHAR, max_length=512),\n # Milvus now supports both sparse and dense vectors,\n # we can store each in a separate field to conduct hybrid search on both vectors\n FieldSchema(name=\"sparse_vector\", dtype=DataType.SPARSE_FLOAT_VECTOR),\n FieldSchema(name=\"dense_vector\", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),\n]\nschema = CollectionSchema(fields)\n\n# Create collection (drop the old one if exists)\ncol_name = \"hybrid_demo\"\nif utility.has_collection(col_name):\n Collection(col_name).drop()\ncol = Collection(col_name, schema, consistency_level=\"Strong\")\n\n# To make vector search efficient, we need to create indices for the vector fields\nsparse_index = {\"index_type\": \"SPARSE_INVERTED_INDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"sparse_vector\", sparse_index)\ndense_index = {\"index_type\": \"AUTOINDEX\", \"metric_type\": \"IP\"}\ncol.create_index(\"dense_vector\", dense_index)\ncol.load()\n","# For efficiency, we insert 50 records in each small batch\nfor i in range(0, len(docs), 50):\n batched_entities = [\n docs[i : i + 50],\n docs_embeddings[\"sparse\"][i : i + 50],\n docs_embeddings[\"dense\"][i : i + 50],\n ]\n col.insert(batched_entities)\nprint(\"Number of entities inserted:\", col.num_entities)\n","# Enter your search query\nquery = input(\"Enter your search query: \")\nprint(query)\n\n# Generate embeddings for the query\nquery_embeddings = ef([query])\n# print(query_embeddings)\n","from pymilvus import (\n AnnSearchRequest,\n WeightedRanker,\n)\n\n\ndef dense_search(col, query_dense_embedding, limit=10):\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n res = col.search(\n [query_dense_embedding],\n anns_field=\"dense_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef sparse_search(col, query_sparse_embedding, limit=10):\n search_params = {\n \"metric_type\": \"IP\",\n \"params\": {},\n }\n res = col.search(\n [query_sparse_embedding],\n anns_field=\"sparse_vector\",\n limit=limit,\n output_fields=[\"text\"],\n param=search_params,\n )[0]\n return [hit.get(\"text\") for hit in res]\n\n\ndef hybrid_search(\n col,\n query_dense_embedding,\n query_sparse_embedding,\n sparse_weight=1.0,\n dense_weight=1.0,\n limit=10,\n):\n dense_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n dense_req = AnnSearchRequest(\n [query_dense_embedding], \"dense_vector\", dense_search_params, limit=limit\n )\n sparse_search_params = {\"metric_type\": \"IP\", \"params\": {}}\n sparse_req = AnnSearchRequest(\n [query_sparse_embedding], \"sparse_vector\", sparse_search_params, limit=limit\n )\n rerank = WeightedRanker(sparse_weight, dense_weight)\n res = col.hybrid_search(\n [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=[\"text\"]\n )[0]\n return [hit.get(\"text\") for hit in res]\n","dense_results = dense_search(col, query_embeddings[\"dense\"][0])\nsparse_results = sparse_search(col, query_embeddings[\"sparse\"]._getrow(0))\nhybrid_results = hybrid_search(\n col,\n query_embeddings[\"dense\"][0],\n query_embeddings[\"sparse\"]._getrow(0),\n sparse_weight=0.7,\n dense_weight=1.0,\n)\n","def doc_text_formatting(ef, query, docs):\n tokenizer = ef.model.tokenizer\n query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)\n query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)\n formatted_texts = []\n\n for doc in docs:\n ldx = 0\n landmarks = []\n encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)\n tokens = tokenizer.convert_ids_to_tokens(encoding[\"input_ids\"])[1:-1]\n offsets = encoding[\"offset_mapping\"][1:-1]\n for token, (start, end) in zip(tokens, offsets):\n if token in query_tokens:\n if len(landmarks) != 0 and start == landmarks[-1]:\n landmarks[-1] = end\n else:\n landmarks.append(start)\n landmarks.append(end)\n close = False\n formatted_text = \"\"\n for i, c in enumerate(doc):\n if ldx == len(landmarks):\n pass\n elif i == landmarks[ldx]:\n if close:\n formatted_text += \"\"\n else:\n formatted_text += \"\"\n close = not close\n ldx = ldx + 1\n formatted_text += c\n if close is True:\n formatted_text += \"\"\n formatted_texts.append(formatted_text)\n return formatted_texts\n","from IPython.display import Markdown, display\n\n# Dense search results\ndisplay(Markdown(\"**Dense Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, dense_results)\nfor result in dense_results:\n display(Markdown(result))\n\n# Sparse search results\ndisplay(Markdown(\"\\n**Sparse Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, sparse_results)\nfor result in formatted_results:\n display(Markdown(result))\n\n# Hybrid search results\ndisplay(Markdown(\"\\n**Hybrid Search Results:**\"))\nformatted_results = doc_text_formatting(ef, query, hybrid_results)\nfor result in formatted_results:\n display(Markdown(result))\n"],"headingContent":"Hybrid Search with Milvus","anchorList":[{"label":"使用 Milvus 進行混合搜尋","href":"Hybrid-Search-with-Milvus","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.md new file mode 100644 index 000000000..5fcf259b7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/hybrid_search_with_milvus.md @@ -0,0 +1,313 @@ +--- +id: hybrid_search_with_milvus.md +summary: 使用 Milvus 進行混合搜尋 +title: 使用 Milvus 進行混合搜尋 +--- +

    使用 Milvus 進行混合搜尋

    Open In Colab +GitHub Repository

    +

    +

    在本教程中,我們將示範如何使用MilvusBGE-M3 模型進行混合搜尋。BGE-M3 模型可以將文字轉換為密集向量和稀疏向量。Milvus 支援在一個集合中同時儲存這兩種向量,允許混合搜尋以增強結果的相關性。

    +

    Milvus 支援密集、稀疏和混合檢索方法:

    +
      +
    • 密集檢索:利用語意上下文來瞭解查詢背後的意義。
    • +
    • 稀疏檢索:強調文字匹配,根據特定詞彙尋找結果,相當於全文檢索。
    • +
    • 混合式檢索:結合 Dense 與 Sparse 兩種方法,擷取完整的上下文與特定關鍵字,以獲得全面的搜尋結果。
    • +
    +

    透過整合這些方法,Milvus Hybrid Search 可平衡語義與詞彙的相似性,改善搜尋結果的整體相關性。本手冊將介紹設定和使用這些檢索策略的過程,並強調它們在各種搜尋情況下的有效性。

    +

    依賴與環境

    $ pip install --upgrade pymilvus "pymilvus[model]"
    +
    +

    下載資料集

    為了示範搜尋,我們需要一個文件語料庫。讓我們使用 Quora 重複問題資料集,並將其放置在本機目錄中。

    +

    資料集的來源:第一次 Quora 資料集發佈:問題對

    +
    # Run this cell to download the dataset
    +$ wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv
    +
    +

    載入並準備資料

    我們將載入資料集,並準備一個小型語料庫,以供搜尋。

    +
    import pandas as pd
    +
    +file_path = "quora_duplicate_questions.tsv"
    +df = pd.read_csv(file_path, sep="\t")
    +questions = set()
    +for _, row in df.iterrows():
    +    obj = row.to_dict()
    +    questions.add(obj["question1"][:512])
    +    questions.add(obj["question2"][:512])
    +    if len(questions) > 500:  # Skip this if you want to use the full dataset
    +        break
    +
    +docs = list(questions)
    +
    +# example question
    +print(docs[0])
    +
    +
    What is the strongest Kevlar cord?
    +
    +

    使用 BGE-M3 模型進行嵌入

    BGE-M3 模型可以將文字嵌入為密集向量和稀疏向量。

    +
    from milvus_model.hybrid import BGEM3EmbeddingFunction
    +
    +ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
    +dense_dim = ef.dim["dense"]
    +
    +# Generate embeddings using BGE-M3 model
    +docs_embeddings = ef(docs)
    +
    +
    Fetching 30 files: 100%|██████████| 30/30 [00:00<00:00, 302473.85it/s]
    +Inference Embeddings: 100%|██████████| 32/32 [01:59<00:00,  3.74s/it]
    +
    +

    設定 Milvus 收集與索引

    我們將設定 Milvus 套件,並為向量欄位建立索引。

    +
    +
      +
    • 將 uri 設定為本機檔案,例如 "./milvus.db" 是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如:http://localhost:19530。
    • +
    • 如果您想使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整 uri 和 token,對應 Zilliz Cloud 的Public Endpoint 和 API key
    • +
    +
    +
    from pymilvus import (
    +    connections,
    +    utility,
    +    FieldSchema,
    +    CollectionSchema,
    +    DataType,
    +    Collection,
    +)
    +
    +# Connect to Milvus given URI
    +connections.connect(uri="./milvus.db")
    +
    +# Specify the data schema for the new Collection
    +fields = [
    +    # Use auto generated id as primary key
    +    FieldSchema(
    +        name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100
    +    ),
    +    # Store the original text to retrieve based on semantically distance
    +    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),
    +    # Milvus now supports both sparse and dense vectors,
    +    # we can store each in a separate field to conduct hybrid search on both vectors
    +    FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),
    +    FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
    +]
    +schema = CollectionSchema(fields)
    +
    +# Create collection (drop the old one if exists)
    +col_name = "hybrid_demo"
    +if utility.has_collection(col_name):
    +    Collection(col_name).drop()
    +col = Collection(col_name, schema, consistency_level="Strong")
    +
    +# To make vector search efficient, we need to create indices for the vector fields
    +sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
    +col.create_index("sparse_vector", sparse_index)
    +dense_index = {"index_type": "AUTOINDEX", "metric_type": "IP"}
    +col.create_index("dense_vector", dense_index)
    +col.load()
    +
    +

    將資料插入 Milvus 套件

    插入文件及其嵌入到資料集中。

    +
    # For efficiency, we insert 50 records in each small batch
    +for i in range(0, len(docs), 50):
    +    batched_entities = [
    +        docs[i : i + 50],
    +        docs_embeddings["sparse"][i : i + 50],
    +        docs_embeddings["dense"][i : i + 50],
    +    ]
    +    col.insert(batched_entities)
    +print("Number of entities inserted:", col.num_entities)
    +
    +
    Number of entities inserted: 502
    +
    +

    輸入您的搜尋查詢

    # Enter your search query
    +query = input("Enter your search query: ")
    +print(query)
    +
    +# Generate embeddings for the query
    +query_embeddings = ef([query])
    +# print(query_embeddings)
    +
    +
    How to start learning programming?
    +
    +

    我們會先準備一些有用的函式來執行搜尋:

    +
      +
    • dense_search只在密集向量場中搜尋
    • +
    • sparse_search:僅在稀疏向量場中搜尋
    • +
    • hybrid_search:同時在密集向量場和向量場中使用加權重排器進行搜尋
    • +
    +
    from pymilvus import (
    +    AnnSearchRequest,
    +    WeightedRanker,
    +)
    +
    +
    +def dense_search(col, query_dense_embedding, limit=10):
    +    search_params = {"metric_type": "IP", "params": {}}
    +    res = col.search(
    +        [query_dense_embedding],
    +        anns_field="dense_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def sparse_search(col, query_sparse_embedding, limit=10):
    +    search_params = {
    +        "metric_type": "IP",
    +        "params": {},
    +    }
    +    res = col.search(
    +        [query_sparse_embedding],
    +        anns_field="sparse_vector",
    +        limit=limit,
    +        output_fields=["text"],
    +        param=search_params,
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +
    +def hybrid_search(
    +    col,
    +    query_dense_embedding,
    +    query_sparse_embedding,
    +    sparse_weight=1.0,
    +    dense_weight=1.0,
    +    limit=10,
    +):
    +    dense_search_params = {"metric_type": "IP", "params": {}}
    +    dense_req = AnnSearchRequest(
    +        [query_dense_embedding], "dense_vector", dense_search_params, limit=limit
    +    )
    +    sparse_search_params = {"metric_type": "IP", "params": {}}
    +    sparse_req = AnnSearchRequest(
    +        [query_sparse_embedding], "sparse_vector", sparse_search_params, limit=limit
    +    )
    +    rerank = WeightedRanker(sparse_weight, dense_weight)
    +    res = col.hybrid_search(
    +        [sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=["text"]
    +    )[0]
    +    return [hit.get("text") for hit in res]
    +
    +

    讓我們用定義的函式執行三種不同的搜尋:

    +
    dense_results = dense_search(col, query_embeddings["dense"][0])
    +sparse_results = sparse_search(col, query_embeddings["sparse"]._getrow(0))
    +hybrid_results = hybrid_search(
    +    col,
    +    query_embeddings["dense"][0],
    +    query_embeddings["sparse"]._getrow(0),
    +    sparse_weight=0.7,
    +    dense_weight=1.0,
    +)
    +
    +

    顯示搜尋結果

    要顯示密集、稀疏和混合搜尋的結果,我們需要一些工具來格式化結果。

    +
    def doc_text_formatting(ef, query, docs):
    +    tokenizer = ef.model.tokenizer
    +    query_tokens_ids = tokenizer.encode(query, return_offsets_mapping=True)
    +    query_tokens = tokenizer.convert_ids_to_tokens(query_tokens_ids)
    +    formatted_texts = []
    +
    +    for doc in docs:
    +        ldx = 0
    +        landmarks = []
    +        encoding = tokenizer.encode_plus(doc, return_offsets_mapping=True)
    +        tokens = tokenizer.convert_ids_to_tokens(encoding["input_ids"])[1:-1]
    +        offsets = encoding["offset_mapping"][1:-1]
    +        for token, (start, end) in zip(tokens, offsets):
    +            if token in query_tokens:
    +                if len(landmarks) != 0 and start == landmarks[-1]:
    +                    landmarks[-1] = end
    +                else:
    +                    landmarks.append(start)
    +                    landmarks.append(end)
    +        close = False
    +        formatted_text = ""
    +        for i, c in enumerate(doc):
    +            if ldx == len(landmarks):
    +                pass
    +            elif i == landmarks[ldx]:
    +                if close:
    +                    formatted_text += "</span>"
    +                else:
    +                    formatted_text += "<span style='color:red'>"
    +                close = not close
    +                ldx = ldx + 1
    +            formatted_text += c
    +        if close is True:
    +            formatted_text += "</span>"
    +        formatted_texts.append(formatted_text)
    +    return formatted_texts
    +
    +

    然後,我們就可以將搜尋結果顯示在有高亮點的文字中:

    +
    from IPython.display import Markdown, display
    +
    +# Dense search results
    +display(Markdown("**Dense Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, dense_results)
    +for result in dense_results:
    +    display(Markdown(result))
    +
    +# Sparse search results
    +display(Markdown("\n**Sparse Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, sparse_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +# Hybrid search results
    +display(Markdown("\n**Hybrid Search Results:**"))
    +formatted_results = doc_text_formatting(ef, query, hybrid_results)
    +for result in formatted_results:
    +    display(Markdown(result))
    +
    +

    密集搜尋結果:

    +

    開始學習機器人的最佳方法是什麼?

    +

    如何學習 java 等電腦語言?

    +

    如何開始學習資訊安全?

    +

    什麼是 Java 程式設計?如何學習 Java 程式語言 ?

    +

    如何學習電腦安全?

    +

    如何開始學習機器人?哪種開發板最適合我開始工作?

    +

    如何學習流利的英語?

    +

    學習法語的最佳方法是什麼?

    +

    如何讓物理變得容易學習?

    +

    如何準備 UPSC?

    +

    稀疏搜尋結果:

    +

    什麼是 Java 程式語言? 如何學習 Java 程式語言 ?

    +

    開始學習機器人的最佳方式是什麼

    +

    機器 學習的替代方法是什麼?

    +

    如何使用 C 程式語言在 Linux 中建立新終端和新 shell

    +

    如何使用 C 程式語言在新終端(Linux 終端)建立新 shell

    +

    在海德拉巴 開設哪家公司比較好?

    +

    在海得拉巴 開設哪家公司比較好?

    +

    開辦機器人的最佳方式是什麼哪種開發板最適合我 開始工作

    +

    一個完全的新手需要哪些 數學來理解電腦 程式設計的演算法哪些有關演算法的書籍適合完全的初學者

    +

    如何讓生活適合自己,讓生活不再虐待自己的精神和情緒

    +

    混合搜尋結果:

    +

    開始學習機器人的最佳方式是什麼哪種開發板最好,我可以 開始工作

    +

    什麼是 Java 程式設計?如何學習 Java 程式語言?

    +

    開始學習機器人的最佳方式是什麼

    +

    如何準備 UPSC

    +

    如何讓物理 變得容易學習

    +

    學習法語最佳方法是什麼

    +

    如何 才能學會說流利的英語

    +

    如何學習電腦安全

    +

    如何開始 學習資訊安全

    +

    如何學習 java 等電腦語言

    +

    機器 學習替代方法是什麼?

    +

    如何在 Linux 中使用 C 程式建立新的 Terminal 和新的 shell

    +

    如何使用 C 程式語言在新的終端(Linux 終端)建立新的 shell

    +

    在海德拉巴 開設哪家公司比較好?

    +

    在海得拉巴 開設哪家公司比較好?

    +

    一個完全的新手需要哪些數學知識 才能理解電腦 程式設計的演算法有哪些有關演算法的書籍適合初學者

    +

    如何讓生活適合您,並避免生活在精神上和情緒上虐待

    +

    快速部署

    若要瞭解如何利用本教學開始線上示範,請參考範例應用程式

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.json b/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.json new file mode 100644 index 000000000..b95b43d1b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Image Deduplication","anchorList":[{"label":"影像重複刪除","href":"Image-Deduplication","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.md b/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.md new file mode 100644 index 000000000..8fd1f9f4c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/image_deduplication_system.md @@ -0,0 +1,35 @@ +--- +id: image_deduplication_system.md +summary: 使用 Milvus 建立影像重複刪除系統。 +title: 影像重複刪除 +--- +

    影像重複刪除

    本教學示範如何使用開放原始碼向量資料庫 Milvus 建立影像重複刪除系統。

    + +

    使用的 ML 模型和第三方軟體包括

    + +

    近年來,使用者產生的內容呈指數級爆炸性成長。人們可以立即將拍攝的圖片上傳到社交媒體平台。然而,在如此豐富的圖片資料中,我們看到許多重複的內容。為了改善使用者體驗,這些重複的圖片必須被移除。重複影像刪除系統可讓我們省去逐一比較資料庫中影像以挑出重複影像的人工勞動。挑出完全相同的圖片根本不是一件複雜的工作。不過,有時圖片可能會被放大、裁切,或調整亮度或灰階。重複影像刪除系統需要識別這些相似的影像,並將它們一併剔除。

    +

    在本教程中,您將學習如何建立影像重複刪除系統。本教程使用 ResNet-50 模型來擷取影像的特徵,並將其轉換成向量。然後,這些影像向量會儲存在 Milvus 向量資料庫中,同時也會在 Milvus 中進行向量相似性搜尋。

    +

    + + Image_deduplication_workflow + 複製影像工作流程

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.json b/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.json new file mode 100644 index 000000000..30c25f2e6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.json @@ -0,0 +1 @@ +{"codeList":["!wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip\n!unzip -q -o reverse_image_search.zip\n","$ pip install pymilvus --upgrade\n$ pip install timm\n","import torch\nfrom PIL import Image\nimport timm\nfrom sklearn.preprocessing import normalize\nfrom timm.data import resolve_data_config\nfrom timm.data.transforms_factory import create_transform\n\n\nclass FeatureExtractor:\n def __init__(self, modelname):\n # Load the pre-trained model\n self.model = timm.create_model(\n modelname, pretrained=True, num_classes=0, global_pool=\"avg\"\n )\n self.model.eval()\n\n # Get the input size required by the model\n self.input_size = self.model.default_cfg[\"input_size\"]\n\n config = resolve_data_config({}, model=modelname)\n # Get the preprocessing function provided by TIMM for the model\n self.preprocess = create_transform(**config)\n\n def __call__(self, imagepath):\n # Preprocess the input image\n input_image = Image.open(imagepath).convert(\"RGB\") # Convert to RGB if needed\n input_image = self.preprocess(input_image)\n\n # Convert the image to a PyTorch tensor and add a batch dimension\n input_tensor = input_image.unsqueeze(0)\n\n # Perform inference\n with torch.no_grad():\n output = self.model(input_tensor)\n\n # Extract the feature vector\n feature_vector = output.squeeze().numpy()\n\n return normalize(feature_vector.reshape(1, -1), norm=\"l2\").flatten()\n","from pymilvus import MilvusClient\n\n# Set up a Milvus client\nclient = MilvusClient(uri=\"example.db\")\n# Create a collection in quick setup mode\nif client.has_collection(collection_name=\"image_embeddings\"):\n client.drop_collection(collection_name=\"image_embeddings\")\nclient.create_collection(\n collection_name=\"image_embeddings\",\n vector_field_name=\"vector\",\n dimension=512,\n auto_id=True,\n enable_dynamic_field=True,\n metric_type=\"COSINE\",\n)\n","import os\n\nextractor = FeatureExtractor(\"resnet34\")\n\nroot = \"./train\"\ninsert = True\nif insert is True:\n for dirpath, foldername, filenames in os.walk(root):\n for filename in filenames:\n if filename.endswith(\".JPEG\"):\n filepath = dirpath + \"/\" + filename\n image_embedding = extractor(filepath)\n client.insert(\n \"image_embeddings\",\n {\"vector\": image_embedding, \"filename\": filepath},\n )\n","from IPython.display import display\n\nquery_image = \"./test/Afghan_hound/n02088094_4261.JPEG\"\n\nresults = client.search(\n \"image_embeddings\",\n data=[extractor(query_image)],\n output_fields=[\"filename\"],\n search_params={\"metric_type\": \"COSINE\"},\n)\nimages = []\nfor result in results:\n for hit in result[:10]:\n filename = hit[\"entity\"][\"filename\"]\n img = Image.open(filename)\n img = img.resize((150, 150))\n images.append(img)\n\nwidth = 150 * 5\nheight = 150 * 2\nconcatenated_image = Image.new(\"RGB\", (width, height))\n\nfor idx, img in enumerate(images):\n x = idx % 5\n y = idx // 5\n concatenated_image.paste(img, (x * 150, y * 150))\ndisplay(\"query\")\ndisplay(Image.open(query_image).resize((150, 150)))\ndisplay(\"results\")\ndisplay(concatenated_image)\n"],"headingContent":"Image Search with Milvus","anchorList":[{"label":"使用 Milvus 搜尋圖像","href":"Image-Search-with-Milvus","type":1,"isActive":false},{"label":"資料集準備","href":"Dataset-Preparation","type":2,"isActive":false},{"label":"先決條件","href":"Prequisites","type":2,"isActive":false},{"label":"定義特徵擷取器","href":"Define-the-Feature-Extractor","type":2,"isActive":false},{"label":"建立 Milvus 集合","href":"Create-a-Milvus-Collection","type":2,"isActive":false},{"label":"將嵌入資料插入 Milvus","href":"Insert-the-Embeddings-to-Milvus","type":2,"isActive":false},{"label":"快速部署","href":"Quick-Deploy","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.md b/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.md new file mode 100644 index 000000000..7a1e9b851 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/image_similarity_search.md @@ -0,0 +1,263 @@ +--- +id: image_similarity_search.md +summary: 使用 Milvus 搜尋圖片 +title: 使用 Milvus 搜尋圖像 +--- +

    使用 Milvus 搜尋圖像

    Open In Colab +GitHub Repository

    +

    +

    在本筆記簿中,我們將教您如何使用 Milvus 在資料集中搜尋類似圖像。我們將使用ImageNet資料集的一個子集,然後搜尋一隻阿富汗獵犬的圖像來進行示範。

    +

    資料集準備

    首先,我們需要載入資料集並解壓縮以進行進一步處理。

    +
    !wget https://github.com/milvus-io/pymilvus-assets/releases/download/imagedata/reverse_image_search.zip
    +!unzip -q -o reverse_image_search.zip
    +
    +

    先決條件

    若要執行本筆記本,您需要安裝下列依賴項目:

    +
      +
    • pymilvus>=2.4.2
    • +
    • timm
    • +
    • 火炬
    • +
    • numpy
    • +
    • sklearn
    • +
    • 枕頭
    • +
    +

    為了執行 Colab,我們提供了安裝必要相依性的簡易指令。

    +
    $ pip install pymilvus --upgrade
    +$ pip install timm
    +
    +
    +

    如果您使用的是 Google Colab,要啟用剛安裝的相依性,您可能需要重新啟動運行時間。(點擊螢幕頂部的 "Runtime 「菜單,從下拉菜單中選擇 」Restart session")。

    +
    +

    定義特徵擷取器

    接下來,我們需要定義一個特徵萃取器,使用 timm 的 ResNet-34 模型從影像中萃取嵌入。

    +
    import torch
    +from PIL import Image
    +import timm
    +from sklearn.preprocessing import normalize
    +from timm.data import resolve_data_config
    +from timm.data.transforms_factory import create_transform
    +
    +
    +class FeatureExtractor:
    +    def __init__(self, modelname):
    +        # Load the pre-trained model
    +        self.model = timm.create_model(
    +            modelname, pretrained=True, num_classes=0, global_pool="avg"
    +        )
    +        self.model.eval()
    +
    +        # Get the input size required by the model
    +        self.input_size = self.model.default_cfg["input_size"]
    +
    +        config = resolve_data_config({}, model=modelname)
    +        # Get the preprocessing function provided by TIMM for the model
    +        self.preprocess = create_transform(**config)
    +
    +    def __call__(self, imagepath):
    +        # Preprocess the input image
    +        input_image = Image.open(imagepath).convert("RGB")  # Convert to RGB if needed
    +        input_image = self.preprocess(input_image)
    +
    +        # Convert the image to a PyTorch tensor and add a batch dimension
    +        input_tensor = input_image.unsqueeze(0)
    +
    +        # Perform inference
    +        with torch.no_grad():
    +            output = self.model(input_tensor)
    +
    +        # Extract the feature vector
    +        feature_vector = output.squeeze().numpy()
    +
    +        return normalize(feature_vector.reshape(1, -1), norm="l2").flatten()
    +
    +

    建立 Milvus 集合

    接下來,我們需要建立 Milvus 集合來儲存圖像的內嵌。

    +
    from pymilvus import MilvusClient
    +
    +# Set up a Milvus client
    +client = MilvusClient(uri="example.db")
    +# Create a collection in quick setup mode
    +if client.has_collection(collection_name="image_embeddings"):
    +    client.drop_collection(collection_name="image_embeddings")
    +client.create_collection(
    +    collection_name="image_embeddings",
    +    vector_field_name="vector",
    +    dimension=512,
    +    auto_id=True,
    +    enable_dynamic_field=True,
    +    metric_type="COSINE",
    +)
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite 將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +

    將嵌入資料插入 Milvus

    我們將使用 ResNet34 模型擷取每張圖片的嵌入資料,並將訓練集中的圖片插入 Milvus。

    +
    import os
    +
    +extractor = FeatureExtractor("resnet34")
    +
    +root = "./train"
    +insert = True
    +if insert is True:
    +    for dirpath, foldername, filenames in os.walk(root):
    +        for filename in filenames:
    +            if filename.endswith(".JPEG"):
    +                filepath = dirpath + "/" + filename
    +                image_embedding = extractor(filepath)
    +                client.insert(
    +                    "image_embeddings",
    +                    {"vector": image_embedding, "filename": filepath},
    +                )
    +
    +
    from IPython.display import display
    +
    +query_image = "./test/Afghan_hound/n02088094_4261.JPEG"
    +
    +results = client.search(
    +    "image_embeddings",
    +    data=[extractor(query_image)],
    +    output_fields=["filename"],
    +    search_params={"metric_type": "COSINE"},
    +)
    +images = []
    +for result in results:
    +    for hit in result[:10]:
    +        filename = hit["entity"]["filename"]
    +        img = Image.open(filename)
    +        img = img.resize((150, 150))
    +        images.append(img)
    +
    +width = 150 * 5
    +height = 150 * 2
    +concatenated_image = Image.new("RGB", (width, height))
    +
    +for idx, img in enumerate(images):
    +    x = idx % 5
    +    y = idx // 5
    +    concatenated_image.paste(img, (x * 150, y * 150))
    +display("query")
    +display(Image.open(query_image).resize((150, 150)))
    +display("results")
    +display(concatenated_image)
    +
    +
    'query'
    +
    +

    + + png + png

    +
    'results'
    +
    +

    + + Results + 結果

    +

    我們可以看到大部分的圖片都來自與搜尋圖片相同的類別,也就是阿富汗獵犬。這表示我們找到與搜尋圖像相似的圖像。

    +

    快速部署

    若要瞭解如何利用本教學開始線上演示,請參閱範例應用程式

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.json new file mode 100644 index 000000000..03e3213c4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install openai pymilvus datasets tqdm\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","COLLECTION_NAME = \"movie_search\"\nDIMENSION = 1536\n\nBATCH_SIZE = 1000\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Database\nclient = MilvusClient(\"./milvus_demo.db\")\n","# Remove collection if it already exists\nif client.has_collection(COLLECTION_NAME):\n client.drop_collection(COLLECTION_NAME)\n","from pymilvus import DataType\n\n# Create collection which includes the id, title, and embedding.\n\n# 1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=True,\n enable_dynamic_field=False,\n)\n\n# 2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"type\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"release_year\", datatype=DataType.INT64)\nschema.add_field(field_name=\"rating\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"description\", datatype=DataType.VARCHAR, max_length=64000)\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)\n\n# 3. Create collection with the schema\nclient.create_collection(collection_name=COLLECTION_NAME, schema=schema)\n","# Create the index on the collection and load it.\n\n# 1. Prepare index parameters\nindex_params = client.prepare_index_params()\n\n\n# 2. Add an index on the embedding field\nindex_params.add_index(\n field_name=\"embedding\", metric_type=\"IP\", index_type=\"AUTOINDEX\", params={}\n)\n\n\n# 3. Create index\nclient.create_index(collection_name=COLLECTION_NAME, index_params=index_params)\n\n\n# 4. Load collection\nclient.load_collection(collection_name=COLLECTION_NAME, replica_number=1)\n","from datasets import load_dataset\n\ndataset = load_dataset(\"hugginglearners/netflix-shows\", split=\"train\")\n","def emb_texts(texts):\n res = openai_client.embeddings.create(input=texts, model=\"text-embedding-3-small\")\n return [res_data.embedding for res_data in res.data]\n","from tqdm import tqdm\n\n# batch (data to be inserted) is a list of dictionaries\nbatch = []\n\n# Embed and insert in batches\nfor i in tqdm(range(0, len(dataset))):\n batch.append(\n {\n \"title\": dataset[i][\"title\"] or \"\",\n \"type\": dataset[i][\"type\"] or \"\",\n \"release_year\": dataset[i][\"release_year\"] or -1,\n \"rating\": dataset[i][\"rating\"] or \"\",\n \"description\": dataset[i][\"description\"] or \"\",\n }\n )\n\n if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:\n embeddings = emb_texts([item[\"description\"] for item in batch])\n\n for item, emb in zip(batch, embeddings):\n item[\"embedding\"] = emb\n\n client.insert(collection_name=COLLECTION_NAME, data=batch)\n batch = []\n","import textwrap\n\n\ndef query(query, top_k=5):\n text, expr = query\n\n res = client.search(\n collection_name=COLLECTION_NAME,\n data=emb_texts(text),\n filter=expr,\n limit=top_k,\n output_fields=[\"title\", \"type\", \"release_year\", \"rating\", \"description\"],\n search_params={\n \"metric_type\": \"IP\",\n \"params\": {},\n },\n )\n\n print(\"Description:\", text, \"Expression:\", expr)\n\n for hit_group in res:\n print(\"Results:\")\n for rank, hit in enumerate(hit_group, start=1):\n entity = hit[\"entity\"]\n\n print(\n f\"\\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}\"\n )\n print(\n f\"\\t\\tType: {entity.get('type', '')} \"\n f\"Release Year: {entity.get('release_year', '')} \"\n f\"Rating: {entity.get('rating', '')}\"\n )\n description = entity.get(\"description\", \"\")\n print(textwrap.fill(description, width=88))\n print()\n\n\nmy_query = (\"movie about a fluffly animal\", 'release_year < 2019 and rating like \"PG%\"')\n\nquery(my_query)\n"],"headingContent":"Movie Recommendation with Milvus","anchorList":[{"label":"使用 Milvus 推薦電影","href":"Movie-Recommendation-with-Milvus","type":1,"isActive":false},{"label":"相依性與環境","href":"Dependencies-and-Environment","type":2,"isActive":false},{"label":"初始化 OpenAI 用戶端和 Milvus","href":"Initialize-OpenAI-client-and-Milvus","type":2,"isActive":false},{"label":"資料集","href":"Dataset","type":2,"isActive":false},{"label":"插入資料","href":"Insert-the-Data","type":2,"isActive":false},{"label":"查詢資料庫","href":"Query-the-Database","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.md new file mode 100644 index 000000000..9dadea257 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/movie_recommendation_with_milvus.md @@ -0,0 +1,295 @@ +--- +id: movie_recommendation_with_milvus.md +summary: >- + 在本筆記簿中,我們將探討如何使用 OpenAI 來產生電影描述的嵌入,並在 Milvus + 中利用這些嵌入來推薦符合您喜好的電影。為了強化搜尋結果,我們將運用篩選功能來執行元資料搜尋。本範例中使用的資料集來自 HuggingFace + 資料集,包含超過 8,000 個電影條目,提供豐富的電影推薦選項。 +title: 使用 Milvus 推薦電影 +--- +

    使用 Milvus 推薦電影

    +Open In Colab + + +GitHub Repository +

    +

    在本筆記簿中,我們將探討如何使用 OpenAI 來產生電影描述的嵌入式資料,並在 Milvus 中利用這些嵌入式資料來推薦符合您喜好的電影。為了強化搜尋結果,我們將運用篩選功能來執行元資料搜尋。本範例所使用的資料集來自 HuggingFace 資料集,包含超過 8,000 個電影條目,提供豐富的電影推薦選擇。

    +

    相依性與環境

    您可以執行下列指令來安裝相依性:

    +
    $ pip install openai pymilvus datasets tqdm
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +

    在本範例中,我們將使用 OpenAI 作為 LLM。您應該準備api key OPENAI_API_KEY 作為環境變數。

    +
    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    初始化 OpenAI 用戶端和 Milvus

    初始化 OpenAI 用戶端。

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    為嵌入設定集合名稱和維度。

    +
    COLLECTION_NAME = "movie_search"
    +DIMENSION = 1536
    +
    +BATCH_SIZE = 1000
    +
    +

    連線至 Milvus。

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Database
    +client = MilvusClient("./milvus_demo.db")
    +
    +
    +

    至於urltoken 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 上的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您要使用Zilliz Cloud,Milvus 的完全管理雲端服務,請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 Api key
    • +
    +
    +
    # Remove collection if it already exists
    +if client.has_collection(COLLECTION_NAME):
    +    client.drop_collection(COLLECTION_NAME)
    +
    +

    定義資料集的欄位,包括 id、標題、類型、發行年份、評等和描述。

    +
    from pymilvus import DataType
    +
    +# Create collection which includes the id, title, and embedding.
    +
    +# 1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=True,
    +    enable_dynamic_field=False,
    +)
    +
    +# 2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="type", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="release_year", datatype=DataType.INT64)
    +schema.add_field(field_name="rating", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="description", datatype=DataType.VARCHAR, max_length=64000)
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=DIMENSION)
    +
    +# 3. Create collection with the schema
    +client.create_collection(collection_name=COLLECTION_NAME, schema=schema)
    +
    +

    在資料集中建立索引並載入。

    +
    # Create the index on the collection and load it.
    +
    +# 1. Prepare index parameters
    +index_params = client.prepare_index_params()
    +
    +
    +# 2. Add an index on the embedding field
    +index_params.add_index(
    +    field_name="embedding", metric_type="IP", index_type="AUTOINDEX", params={}
    +)
    +
    +
    +# 3. Create index
    +client.create_index(collection_name=COLLECTION_NAME, index_params=index_params)
    +
    +
    +# 4. Load collection
    +client.load_collection(collection_name=COLLECTION_NAME, replica_number=1)
    +
    +

    資料集

    隨著 Milvus 的啟動與執行,我們可以開始擷取資料。Hugging Face Datasets 是一個儲存許多不同使用者資料集的中樞,在這個範例中,我們使用 HuggingLearners 的 netflix-shows 資料集。這個資料集包含超過 8,000 部電影的電影及其元資料對。我們將內嵌每項描述,並將其與標題、類型、發行年份和評分一起儲存在 Milvus 中。

    +
    from datasets import load_dataset
    +
    +dataset = load_dataset("hugginglearners/netflix-shows", split="train")
    +
    +

    插入資料

    現在我們已經在機器上取得資料,可以開始嵌入並插入 Milvus。嵌入函數會接收文字,並以清單格式傳回嵌入資料。

    +
    def emb_texts(texts):
    +    res = openai_client.embeddings.create(input=texts, model="text-embedding-3-small")
    +    return [res_data.embedding for res_data in res.data]
    +
    +

    下一步是實際插入。我們會遍歷所有條目,並建立批次,一旦達到設定的批次大小,我們就會插入。迴圈結束後,我們會插入最後餘下的批次 (如果存在的話)。

    +
    from tqdm import tqdm
    +
    +# batch (data to be inserted) is a list of dictionaries
    +batch = []
    +
    +# Embed and insert in batches
    +for i in tqdm(range(0, len(dataset))):
    +    batch.append(
    +        {
    +            "title": dataset[i]["title"] or "",
    +            "type": dataset[i]["type"] or "",
    +            "release_year": dataset[i]["release_year"] or -1,
    +            "rating": dataset[i]["rating"] or "",
    +            "description": dataset[i]["description"] or "",
    +        }
    +    )
    +
    +    if len(batch) % BATCH_SIZE == 0 or i == len(dataset) - 1:
    +        embeddings = emb_texts([item["description"] for item in batch])
    +
    +        for item, emb in zip(batch, embeddings):
    +            item["embedding"] = emb
    +
    +        client.insert(collection_name=COLLECTION_NAME, data=batch)
    +        batch = []
    +
    +

    查詢資料庫

    將資料安全地插入 Milvus 後,我們現在可以執行查詢。查詢會接收一個元組資料,包括您要搜尋的電影描述,以及要使用的篩選條件。更多關於篩選器的資訊,請參閱這裡。搜尋首先會列印出您的描述和篩選表達式。之後,我們會為每個結果列印得分、標題、類型、發行年份、評分和結果電影的描述。

    +
    import textwrap
    +
    +
    +def query(query, top_k=5):
    +    text, expr = query
    +
    +    res = client.search(
    +        collection_name=COLLECTION_NAME,
    +        data=emb_texts(text),
    +        filter=expr,
    +        limit=top_k,
    +        output_fields=["title", "type", "release_year", "rating", "description"],
    +        search_params={
    +            "metric_type": "IP",
    +            "params": {},
    +        },
    +    )
    +
    +    print("Description:", text, "Expression:", expr)
    +
    +    for hit_group in res:
    +        print("Results:")
    +        for rank, hit in enumerate(hit_group, start=1):
    +            entity = hit["entity"]
    +
    +            print(
    +                f"\tRank: {rank} Score: {hit['distance']:} Title: {entity.get('title', '')}"
    +            )
    +            print(
    +                f"\t\tType: {entity.get('type', '')} "
    +                f"Release Year: {entity.get('release_year', '')} "
    +                f"Rating: {entity.get('rating', '')}"
    +            )
    +            description = entity.get("description", "")
    +            print(textwrap.fill(description, width=88))
    +            print()
    +
    +
    +my_query = ("movie about a fluffly animal", 'release_year < 2019 and rating like "PG%"')
    +
    +query(my_query)
    +
    +
    Description: movie about a fluffly animal Expression: release_year < 2019 and rating like "PG%"
    +Results:
    +    Rank: 1 Score: 0.42213767766952515 Title: The Adventures of Tintin
    +        Type: Movie Release Year: 2011 Rating: PG
    +This 3-D motion capture adapts Georges Remi's classic comic strip about the adventures
    +of fearless young journalist Tintin and his trusty dog, Snowy.
    +
    +    Rank: 2 Score: 0.4041026830673218 Title: Hedgehogs
    +        Type: Movie Release Year: 2016 Rating: PG
    +When a hedgehog suffering from memory loss forgets his identity, he ends up on a big
    +city journey with a pigeon to save his habitat from a human threat.
    +
    +    Rank: 3 Score: 0.3980264663696289 Title: Osmosis Jones
    +        Type: Movie Release Year: 2001 Rating: PG
    +Peter and Bobby Farrelly outdo themselves with this partially animated tale about an
    +out-of-shape 40-year-old man who's the host to various organisms.
    +
    +    Rank: 4 Score: 0.39479154348373413 Title: The Lamb
    +        Type: Movie Release Year: 2017 Rating: PG
    +A big-dreaming donkey escapes his menial existence and befriends some free-spirited
    +animal pals in this imaginative retelling of the Nativity Story.
    +
    +    Rank: 5 Score: 0.39370301365852356 Title: Open Season 2
    +        Type: Movie Release Year: 2008 Rating: PG
    +Elliot the buck and his forest-dwelling cohorts must rescue their dachshund pal from
    +some spoiled pets bent on returning him to domesticity.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.json new file mode 100644 index 000000000..26b61126f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm\n","$ git clone https://github.com/FlagOpen/FlagEmbedding.git\n$ pip install -e FlagEmbedding\n","$ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz\n$ tar -xzf amazon_reviews_2023_subset.tar.gz\n","$ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth\n","import torch\nfrom FlagEmbedding.visual.modeling import Visualized_BGE\n\n\nclass Encoder:\n def __init__(self, model_name: str, model_path: str):\n self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)\n self.model.eval()\n\n def encode_query(self, image_path: str, text: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path, text=text)\n return query_emb.tolist()[0]\n\n def encode_image(self, image_path: str) -> list[float]:\n with torch.no_grad():\n query_emb = self.model.encode(image=image_path)\n return query_emb.tolist()[0]\n\n\nmodel_name = \"BAAI/bge-base-en-v1.5\"\nmodel_path = \"./Visualized_base_en_v1.5.pth\" # Change to your own value if using a different model path\nencoder = Encoder(model_name, model_path)\n","import os\nfrom tqdm import tqdm\nfrom glob import glob\n\n\n# Generate embeddings for the image dataset\ndata_dir = (\n \"./images_folder\" # Change to your own value if using a different data directory\n)\nimage_list = glob(\n os.path.join(data_dir, \"images\", \"*.jpg\")\n) # We will only use images ending with \".jpg\"\nimage_dict = {}\nfor image_path in tqdm(image_list, desc=\"Generating image embeddings: \"):\n try:\n image_dict[image_path] = encoder.encode_image(image_path)\n except Exception as e:\n print(f\"Failed to generate embedding for {image_path}. Skipped.\")\n continue\nprint(\"Number of encoded images:\", len(image_dict))\n","from pymilvus import MilvusClient\n\n\ndim = len(list(image_dict.values())[0])\ncollection_name = \"multimodal_rag_demo\"\n\n# Connect to Milvus client given URI\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\n# Create Milvus Collection\n# By default, vector field name is \"vector\"\nmilvus_client.create_collection(\n collection_name=collection_name,\n auto_id=True,\n dimension=dim,\n enable_dynamic_field=True,\n)\n\n# Insert data into collection\nmilvus_client.insert(\n collection_name=collection_name,\n data=[{\"image_path\": k, \"vector\": v} for k, v in image_dict.items()],\n)\n","query_image = os.path.join(\n data_dir, \"leopard.jpg\"\n) # Change to your own query image path\nquery_text = \"phone case with this image theme\"\n\n# Generate query embedding given image and text instructions\nquery_vec = encoder.encode_query(image_path=query_image, text=query_text)\n\nsearch_results = milvus_client.search(\n collection_name=collection_name,\n data=[query_vec],\n output_fields=[\"image_path\"],\n limit=9, # Max number of search results to return\n search_params={\"metric_type\": \"COSINE\", \"params\": {}}, # Search parameters\n)[0]\n\nretrieved_images = [hit.get(\"entity\").get(\"image_path\") for hit in search_results]\nprint(retrieved_images)\n","import numpy as np\nimport cv2\n\nimg_height = 300\nimg_width = 300\nrow_count = 3\n\n\ndef create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:\n \"\"\"\n creates a 5x5 panoramic view image from a list of images\n\n args:\n images: list of images to be combined\n\n returns:\n np.ndarray: the panoramic view image\n \"\"\"\n panoramic_width = img_width * row_count\n panoramic_height = img_height * row_count\n panoramic_image = np.full(\n (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8\n )\n\n # create and resize the query image with a blue border\n query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)\n query_image = Image.open(query_image_path).convert(\"RGB\")\n query_array = np.array(query_image)[:, :, ::-1]\n resized_image = cv2.resize(query_array, (img_width, img_height))\n\n border_size = 10\n blue = (255, 0, 0) # blue color in BGR\n bordered_query_image = cv2.copyMakeBorder(\n resized_image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=blue,\n )\n\n query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(\n bordered_query_image, (img_width, img_height)\n )\n\n # add text \"query\" below the query image\n text = \"query\"\n font_scale = 1\n font_thickness = 2\n text_org = (10, img_height * 3 + 30)\n cv2.putText(\n query_image_null,\n text,\n text_org,\n cv2.FONT_HERSHEY_SIMPLEX,\n font_scale,\n blue,\n font_thickness,\n cv2.LINE_AA,\n )\n\n # combine the rest of the images into the panoramic view\n retrieved_imgs = [\n np.array(Image.open(img).convert(\"RGB\"))[:, :, ::-1] for img in retrieved_images\n ]\n for i, image in enumerate(retrieved_imgs):\n image = cv2.resize(image, (img_width - 4, img_height - 4))\n row = i // row_count\n col = i % row_count\n start_row = row * img_height\n start_col = col * img_width\n\n border_size = 2\n bordered_image = cv2.copyMakeBorder(\n image,\n border_size,\n border_size,\n border_size,\n border_size,\n cv2.BORDER_CONSTANT,\n value=(0, 0, 0),\n )\n panoramic_image[\n start_row : start_row + img_height, start_col : start_col + img_width\n ] = bordered_image\n\n # add red index numbers to each image\n text = str(i)\n org = (start_col + 50, start_row + 30)\n (font_width, font_height), baseline = cv2.getTextSize(\n text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2\n )\n\n top_left = (org[0] - 48, start_row + 2)\n bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)\n\n cv2.rectangle(\n panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED\n )\n cv2.putText(\n panoramic_image,\n text,\n (start_col + 10, start_row + 30),\n cv2.FONT_HERSHEY_SIMPLEX,\n 1,\n (0, 0, 255),\n 2,\n cv2.LINE_AA,\n )\n\n # combine the query image with the panoramic view\n panoramic_image = np.hstack([query_image_null, panoramic_image])\n return panoramic_image\n","from PIL import Image\n\ncombined_image_path = os.path.join(data_dir, \"combined_image.jpg\")\npanoramic_image = create_panoramic_view(query_image, retrieved_images)\ncv2.imwrite(combined_image_path, panoramic_image)\n\ncombined_image = Image.open(combined_image_path)\nshow_combined_image = combined_image.resize((300, 300))\nshow_combined_image.show()\n","import requests\nimport base64\n\nopenai_api_key = \"sk-***\" # Change to your OpenAI API Key\n\n\ndef generate_ranking_explanation(\n combined_image_path: str, caption: str, infos: dict = None\n) -> tuple[list[int], str]:\n with open(combined_image_path, \"rb\") as image_file:\n base64_image = base64.b64encode(image_file.read()).decode(\"utf-8\")\n\n information = (\n \"You are responsible for ranking results for a Composed Image Retrieval. \"\n \"The user retrieves an image with an 'instruction' indicating their retrieval intent. \"\n \"For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. \"\n \"Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. \"\n f\"User instruction: {caption} \\n\\n\"\n )\n\n # add additional information for each image\n if infos:\n for i, info in enumerate(infos[\"product\"]):\n information += f\"{i}. {info}\\n\"\n\n information += (\n \"Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. \"\n \"The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent.\"\n )\n\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\",\n }\n\n payload = {\n \"model\": \"gpt-4o\",\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": information},\n {\n \"type\": \"image_url\",\n \"image_url\": {\"url\": f\"data:image/jpeg;base64,{base64_image}\"},\n },\n ],\n }\n ],\n \"max_tokens\": 300,\n }\n\n response = requests.post(\n \"https://api.openai.com/v1/chat/completions\", headers=headers, json=payload\n )\n result = response.json()[\"choices\"][0][\"message\"][\"content\"]\n\n # parse the ranked indices from the response\n start_idx = result.find(\"[\")\n end_idx = result.find(\"]\")\n ranked_indices_str = result[start_idx + 1 : end_idx].split(\",\")\n ranked_indices = [int(index.strip()) for index in ranked_indices_str]\n\n # extract explanation\n explanation = result[end_idx + 1 :].strip()\n\n return ranked_indices, explanation\n","ranked_indices, explanation = generate_ranking_explanation(\n combined_image_path, query_text\n)\n","print(explanation)\n\nbest_index = ranked_indices[0]\nbest_img = Image.open(retrieved_images[best_index])\nbest_img = best_img.resize((150, 150))\nbest_img.show()\n"],"headingContent":"Multimodal RAG with Milvus","anchorList":[{"label":"使用 Milvus 的多模式 RAG","href":"Multimodal-RAG-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"載入資料","href":"Load-Data","type":2,"isActive":false},{"label":"使用生成式重排器進行多模態搜尋","href":"Multimodal-Search-with-Generative-Reranker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.md new file mode 100644 index 000000000..7ad18158a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/multimodal_rag_with_milvus.md @@ -0,0 +1,424 @@ +--- +id: multimodal_rag_with_milvus.md +summary: 使用 Milvus 的多模式 RAG +title: 使用 Milvus 的多模式 RAG +--- +

    使用 Milvus 的多模式 RAG

    Open In Colab +GitHub Repository

    +

    +

    本教學展示由 Milvus、可視化 BGE 模型GPT-4o 所提供的多模式 RAG。使用此系統,使用者可以上傳圖片並編輯文字說明,由 BGE 的組成檢索模型處理,以搜尋候選圖片。然後,GPT-4o 會扮演重新篩選者的角色,選出最適合的影像,並提供選擇背後的理由。這種強大的組合可實現無縫且直觀的圖像搜尋體驗,利用 Milvus 進行高效率的檢索,利用 BGE 模型進行精確的圖像處理和匹配,並利用 GPT-4o 進行先進的重新排序。

    +

    準備工作

    安裝相依性

    $ pip install --upgrade pymilvus openai datasets opencv-python timm einops ftfy peft tqdm
    +
    +
    $ git clone https://github.com/FlagOpen/FlagEmbedding.git
    +$ pip install -e FlagEmbedding
    +
    +
    +

    如果您使用的是 Google Colab,為了啟用剛安裝的相依性,您可能需要重新啟動執行時(點選畫面上方的「Runtime」功能表,並從下拉式功能表中選擇「Restart session」)。

    +
    +

    下載資料

    以下指令會下載範例資料,並解壓縮到本機資料夾「./images_folder」,包括

    +
      +
    • imagesAmazon Reviews 2023的子集,包含「Appliance」、「Cell_Phones_and_Accessories」和「Electronics」類別中約 900 張圖片。

    • +
    • leopard.jpg: 範例查詢影像。

    • +
    +
    $ wget https://github.com/milvus-io/bootcamp/releases/download/data/amazon_reviews_2023_subset.tar.gz
    +$ tar -xzf amazon_reviews_2023_subset.tar.gz
    +
    +

    載入嵌入模型

    我們將使用 Visualized BGE 模型「bge-visualized-base-en-v1.5」來產生圖像和文字的嵌入。

    +

    1.下載權重

    +
    $ wget https://huggingface.co/BAAI/bge-visualized/resolve/main/Visualized_base_en_v1.5.pth
    +
    +

    2.建立編碼器

    +
    import torch
    +from FlagEmbedding.visual.modeling import Visualized_BGE
    +
    +
    +class Encoder:
    +    def __init__(self, model_name: str, model_path: str):
    +        self.model = Visualized_BGE(model_name_bge=model_name, model_weight=model_path)
    +        self.model.eval()
    +
    +    def encode_query(self, image_path: str, text: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path, text=text)
    +        return query_emb.tolist()[0]
    +
    +    def encode_image(self, image_path: str) -> list[float]:
    +        with torch.no_grad():
    +            query_emb = self.model.encode(image=image_path)
    +        return query_emb.tolist()[0]
    +
    +
    +model_name = "BAAI/bge-base-en-v1.5"
    +model_path = "./Visualized_base_en_v1.5.pth"  # Change to your own value if using a different model path
    +encoder = Encoder(model_name, model_path)
    +
    +

    載入資料

    本節將把範例圖片載入資料庫,並載入相應的嵌入式資料。

    +

    生成嵌入式

    從資料目錄載入所有 jpeg 圖片,並應用編碼器將圖片轉換為嵌入資料。

    +
    import os
    +from tqdm import tqdm
    +from glob import glob
    +
    +
    +# Generate embeddings for the image dataset
    +data_dir = (
    +    "./images_folder"  # Change to your own value if using a different data directory
    +)
    +image_list = glob(
    +    os.path.join(data_dir, "images", "*.jpg")
    +)  # We will only use images ending with ".jpg"
    +image_dict = {}
    +for image_path in tqdm(image_list, desc="Generating image embeddings: "):
    +    try:
    +        image_dict[image_path] = encoder.encode_image(image_path)
    +    except Exception as e:
    +        print(f"Failed to generate embedding for {image_path}. Skipped.")
    +        continue
    +print("Number of encoded images:", len(image_dict))
    +
    +
    Generating image embeddings: 100%|██████████| 900/900 [00:20<00:00, 44.08it/s]
    +
    +Number of encoded images: 900
    +
    +

    插入到 Milvus

    將圖片連同相對應的路徑和嵌入資料插入 Milvus 資料庫。

    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus_demo.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 的Public Endpoint 和 Api key對應。
    • +
    +
    +
    from pymilvus import MilvusClient
    +
    +
    +dim = len(list(image_dict.values())[0])
    +collection_name = "multimodal_rag_demo"
    +
    +# Connect to Milvus client given URI
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +# Create Milvus Collection
    +# By default, vector field name is "vector"
    +milvus_client.create_collection(
    +    collection_name=collection_name,
    +    auto_id=True,
    +    dimension=dim,
    +    enable_dynamic_field=True,
    +)
    +
    +# Insert data into collection
    +milvus_client.insert(
    +    collection_name=collection_name,
    +    data=[{"image_path": k, "vector": v} for k, v in image_dict.items()],
    +)
    +
    +
    {'insert_count': 900,
    + 'ids': [451537887696781312, 451537887696781313, ..., 451537887696782211],
    + 'cost': 0}
    +
    +

    使用生成式重排器進行多模態搜尋

    在本節中,我們會先使用多模態查詢搜尋相關的圖片,然後再使用 LLM 服務將結果重新排序,找出最佳的圖片並解釋。

    +

    現在我們準備好以圖片和文字指令組成的查詢資料執行進階圖片搜尋。

    +
    query_image = os.path.join(
    +    data_dir, "leopard.jpg"
    +)  # Change to your own query image path
    +query_text = "phone case with this image theme"
    +
    +# Generate query embedding given image and text instructions
    +query_vec = encoder.encode_query(image_path=query_image, text=query_text)
    +
    +search_results = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[query_vec],
    +    output_fields=["image_path"],
    +    limit=9,  # Max number of search results to return
    +    search_params={"metric_type": "COSINE", "params": {}},  # Search parameters
    +)[0]
    +
    +retrieved_images = [hit.get("entity").get("image_path") for hit in search_results]
    +print(retrieved_images)
    +
    +
    ['./images_folder/images/518Gj1WQ-RL._AC_.jpg', './images_folder/images/41n00AOfWhL._AC_.jpg', './images_folder/images/51Wqge9HySL._AC_.jpg', './images_folder/images/51R2SZiywnL._AC_.jpg', './images_folder/images/516PebbMAcL._AC_.jpg', './images_folder/images/51RrgfYKUfL._AC_.jpg', './images_folder/images/515DzQVKKwL._AC_.jpg', './images_folder/images/51BsgVw6RhL._AC_.jpg', './images_folder/images/51INtcXu9FL._AC_.jpg']
    +
    +

    使用 GPT-4o 重新排序

    我們將根據使用者的查詢和擷取的結果,使用 LLM 對影像進行排序,並產生最佳結果的說明。

    +

    1.建立全景圖

    +
    import numpy as np
    +import cv2
    +
    +img_height = 300
    +img_width = 300
    +row_count = 3
    +
    +
    +def create_panoramic_view(query_image_path: str, retrieved_images: list) -> np.ndarray:
    +    """
    +    creates a 5x5 panoramic view image from a list of images
    +
    +    args:
    +        images: list of images to be combined
    +
    +    returns:
    +        np.ndarray: the panoramic view image
    +    """
    +    panoramic_width = img_width * row_count
    +    panoramic_height = img_height * row_count
    +    panoramic_image = np.full(
    +        (panoramic_height, panoramic_width, 3), 255, dtype=np.uint8
    +    )
    +
    +    # create and resize the query image with a blue border
    +    query_image_null = np.full((panoramic_height, img_width, 3), 255, dtype=np.uint8)
    +    query_image = Image.open(query_image_path).convert("RGB")
    +    query_array = np.array(query_image)[:, :, ::-1]
    +    resized_image = cv2.resize(query_array, (img_width, img_height))
    +
    +    border_size = 10
    +    blue = (255, 0, 0)  # blue color in BGR
    +    bordered_query_image = cv2.copyMakeBorder(
    +        resized_image,
    +        border_size,
    +        border_size,
    +        border_size,
    +        border_size,
    +        cv2.BORDER_CONSTANT,
    +        value=blue,
    +    )
    +
    +    query_image_null[img_height * 2 : img_height * 3, 0:img_width] = cv2.resize(
    +        bordered_query_image, (img_width, img_height)
    +    )
    +
    +    # add text "query" below the query image
    +    text = "query"
    +    font_scale = 1
    +    font_thickness = 2
    +    text_org = (10, img_height * 3 + 30)
    +    cv2.putText(
    +        query_image_null,
    +        text,
    +        text_org,
    +        cv2.FONT_HERSHEY_SIMPLEX,
    +        font_scale,
    +        blue,
    +        font_thickness,
    +        cv2.LINE_AA,
    +    )
    +
    +    # combine the rest of the images into the panoramic view
    +    retrieved_imgs = [
    +        np.array(Image.open(img).convert("RGB"))[:, :, ::-1] for img in retrieved_images
    +    ]
    +    for i, image in enumerate(retrieved_imgs):
    +        image = cv2.resize(image, (img_width - 4, img_height - 4))
    +        row = i // row_count
    +        col = i % row_count
    +        start_row = row * img_height
    +        start_col = col * img_width
    +
    +        border_size = 2
    +        bordered_image = cv2.copyMakeBorder(
    +            image,
    +            border_size,
    +            border_size,
    +            border_size,
    +            border_size,
    +            cv2.BORDER_CONSTANT,
    +            value=(0, 0, 0),
    +        )
    +        panoramic_image[
    +            start_row : start_row + img_height, start_col : start_col + img_width
    +        ] = bordered_image
    +
    +        # add red index numbers to each image
    +        text = str(i)
    +        org = (start_col + 50, start_row + 30)
    +        (font_width, font_height), baseline = cv2.getTextSize(
    +            text, cv2.FONT_HERSHEY_SIMPLEX, 1, 2
    +        )
    +
    +        top_left = (org[0] - 48, start_row + 2)
    +        bottom_right = (org[0] - 48 + font_width + 5, org[1] + baseline + 5)
    +
    +        cv2.rectangle(
    +            panoramic_image, top_left, bottom_right, (255, 255, 255), cv2.FILLED
    +        )
    +        cv2.putText(
    +            panoramic_image,
    +            text,
    +            (start_col + 10, start_row + 30),
    +            cv2.FONT_HERSHEY_SIMPLEX,
    +            1,
    +            (0, 0, 255),
    +            2,
    +            cv2.LINE_AA,
    +        )
    +
    +    # combine the query image with the panoramic view
    +    panoramic_image = np.hstack([query_image_null, panoramic_image])
    +    return panoramic_image
    +
    +

    將查詢的圖片和擷取的圖片與索引結合為全景檢視。

    +
    from PIL import Image
    +
    +combined_image_path = os.path.join(data_dir, "combined_image.jpg")
    +panoramic_image = create_panoramic_view(query_image, retrieved_images)
    +cv2.imwrite(combined_image_path, panoramic_image)
    +
    +combined_image = Image.open(combined_image_path)
    +show_combined_image = combined_image.resize((300, 300))
    +show_combined_image.show()
    +
    +

    + + Create a panoramic view + 建立全景檢視

    +

    2.重新排名與說明

    +

    我們會將合併後的影像傳送至多模態 LLM 服務,並附上適當的提示,以便對檢索結果進行重新排列與說明。若要啟用 GPT-4o 作為 LLM,您需要準備OpenAI API Key

    +
    import requests
    +import base64
    +
    +openai_api_key = "sk-***"  # Change to your OpenAI API Key
    +
    +
    +def generate_ranking_explanation(
    +    combined_image_path: str, caption: str, infos: dict = None
    +) -> tuple[list[int], str]:
    +    with open(combined_image_path, "rb") as image_file:
    +        base64_image = base64.b64encode(image_file.read()).decode("utf-8")
    +
    +    information = (
    +        "You are responsible for ranking results for a Composed Image Retrieval. "
    +        "The user retrieves an image with an 'instruction' indicating their retrieval intent. "
    +        "For example, if the user queries a red car with the instruction 'change this car to blue,' a similar type of car in blue would be ranked higher in the results. "
    +        "Now you would receive instruction and query image with blue border. Every item has its red index number in its top left. Do not misunderstand it. "
    +        f"User instruction: {caption} \n\n"
    +    )
    +
    +    # add additional information for each image
    +    if infos:
    +        for i, info in enumerate(infos["product"]):
    +            information += f"{i}. {info}\n"
    +
    +    information += (
    +        "Provide a new ranked list of indices from most suitable to least suitable, followed by an explanation for the top 1 most suitable item only. "
    +        "The format of the response has to be 'Ranked list: []' with the indices in brackets as integers, followed by 'Reasons:' plus the explanation why this most fit user's query intent."
    +    )
    +
    +    headers = {
    +        "Content-Type": "application/json",
    +        "Authorization": f"Bearer {openai_api_key}",
    +    }
    +
    +    payload = {
    +        "model": "gpt-4o",
    +        "messages": [
    +            {
    +                "role": "user",
    +                "content": [
    +                    {"type": "text", "text": information},
    +                    {
    +                        "type": "image_url",
    +                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
    +                    },
    +                ],
    +            }
    +        ],
    +        "max_tokens": 300,
    +    }
    +
    +    response = requests.post(
    +        "https://api.openai.com/v1/chat/completions", headers=headers, json=payload
    +    )
    +    result = response.json()["choices"][0]["message"]["content"]
    +
    +    # parse the ranked indices from the response
    +    start_idx = result.find("[")
    +    end_idx = result.find("]")
    +    ranked_indices_str = result[start_idx + 1 : end_idx].split(",")
    +    ranked_indices = [int(index.strip()) for index in ranked_indices_str]
    +
    +    # extract explanation
    +    explanation = result[end_idx + 1 :].strip()
    +
    +    return ranked_indices, explanation
    +
    +

    取得排序後的影像指數,以及最佳結果的原因:

    +
    ranked_indices, explanation = generate_ranking_explanation(
    +    combined_image_path, query_text
    +)
    +
    +

    3.顯示最佳結果並解釋

    +
    print(explanation)
    +
    +best_index = ranked_indices[0]
    +best_img = Image.open(retrieved_images[best_index])
    +best_img = best_img.resize((150, 150))
    +best_img.show()
    +
    +
    Reasons: The most suitable item for the user's query intent is index 6 because the instruction specifies a phone case with the theme of the image, which is a leopard. The phone case with index 6 has a thematic design resembling the leopard pattern, making it the closest match to the user's request for a phone case with the image theme.
    +
    +

    + + The best result + 最佳結果

    +

    快速部署

    若要瞭解如何利用本教學開始線上演示,請參閱範例應用程式

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.json b/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.json new file mode 100644 index 000000000..ee6aa2755 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Question Answering System","anchorList":[{"label":"問題回答系統","href":"Question-Answering-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.md b/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.md new file mode 100644 index 000000000..d4601888a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/question_answering_system.md @@ -0,0 +1,44 @@ +--- +id: question_answering_system.md +summary: 使用 Milvus 建立問題回答系統。 +title: 問題回答系統 +--- +

    問題回答系統

    本教學示範如何使用開放原始碼向量資料庫 Milvus 來建立問題回答 (QA) 系統。

    + +

    使用的 ML 模型和第三方軟體包括

    + +


    +

    問題解答系統是現實世界中常見的應用程式,屬於自然語言處理領域。典型的問答系統包括線上客服系統、問答聊天機器人等。大多數問題回答系統可分為: 產生式或檢索式、單輪或多輪、開放領域或特定問題回答系統。

    +


    +

    在本教程中,您將學習如何建立一個 QA 系統,它可以將使用者的新問題與先前儲存在向量資料庫中的大量答案連結起來。要建立這樣的聊天機器人,請準備您自己的問題和對應答案資料集。將問題和答案儲存在關係資料庫 MySQL 中。然後使用自然語言處理 (NLP) 的機器學習 (ML) 模型 BERT,將問題轉換成向量。這些問題向量會儲存在 Milvus 中並建立索引。 當使用者輸入一個新問題時,它也會被 BERT 模型轉換成向量,然後 Milvus 會搜尋與這個新向量最相似的問題向量。QA 系統會回傳最相似問題的對應答案。

    +


    +

    + + QA_Chatbot + QA_Chatbot

    +

    + + QA_chatbot_demo + QA_chatbot_demo

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.json b/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.json new file mode 100644 index 000000000..4f720bb12 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.json @@ -0,0 +1 @@ +{"codeList":["attu.app is damaged and cannot be opened.\n","sudo xattr -rd com.apple.quarantine /Applications/attu.app\n","wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\nunzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n text_lines += file_text.split(\"# \")\n","from pymilvus import model as milvus_model\n\nembedding_model = milvus_model.DefaultEmbeddingFunction()\n\n# Generate test embedding\ntest_embedding = embedding_model.encode_queries([\"This is a test\"])[0]\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","768\n[-0.04836066 0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448\n -0.03041712 -0.02269499 -0.02317863 -0.00426028]\n","from pymilvus import MilvusClient\n\n# Connect to Milvus Standalone\nclient = MilvusClient(uri=\"http://localhost:19530\")\n\ncollection_name = \"attu_tutorial\"\n\n# Drop collection if it exists\nif client.has_collection(collection_name):\n client.drop_collection(collection_name)\n\n# Create a new collection\nclient.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\"\n)\n","from tqdm import tqdm\n\ndata = []\ndoc_embeddings = embedding_model.encode_documents(text_lines)\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": doc_embeddings[i], \"text\": line})\n\nclient.insert(collection_name=collection_name, data=data)\n"],"headingContent":"Quick Start with Attu Desktop","anchorList":[{"label":"快速開始使用 Attu Desktop","href":"Quick-Start-with-Attu-Desktop","type":1,"isActive":false},{"label":"1.簡介","href":"1-Introduction","type":2,"isActive":false},{"label":"2.安裝桌面應用程式","href":"2-Install-Desktop-Application","type":2,"isActive":false},{"label":"3.連接至 Milvus","href":"3-Connect-to-Milvus","type":2,"isActive":false},{"label":"4.準備資料、建立集合和插入資料","href":"4-Prepare-Data-Create-Collection-and-Insert-Data","type":2,"isActive":false},{"label":"5.可視化搜尋結果及關係","href":"5-Visualizing-Search-Results-and-Relationships","type":2,"isActive":false},{"label":"6.結論","href":"6-Conclusion","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.md b/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.md new file mode 100644 index 000000000..66722cb93 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/quickstart_with_attu.md @@ -0,0 +1,239 @@ +--- +id: quickstart_with_attu.md +summary: >- + Attu 是 Milvus 的多合一、開放源碼管理工具。它具有直觀的圖形化使用者介面 + (GUI),讓您輕鬆與資料庫互動。只需幾下點擊,您就可以直觀查看群集狀態、管理元資料、執行資料查詢等。 +title: 問題回答系統 +--- +

    快速開始使用 Attu Desktop

    1.簡介

    Attu是 Milvus 的多合一、開放源碼管理工具。它具有直觀的圖形化使用者介面 (GUI),讓您輕鬆與資料庫互動。只需幾下點擊,您就可以視覺化您的集群狀態、管理元資料、執行資料查詢等。

    +
    +

    2.安裝桌面應用程式

    訪問 AttuGitHub 發佈頁面下載桌面版 Attu。選擇適合您作業系統的版本,並依照安裝步驟進行。

    +

    適用於 macOS (M 系列晶片) 的注意事項:

    如果遇到錯誤:

    +
    attu.app is damaged and cannot be opened.
    +
    +

    在終端機執行以下指令,以繞過此問題:

    +
    sudo xattr -rd com.apple.quarantine /Applications/attu.app
    +
    +
    +

    3.連接至 Milvus

    Attu 支援連線至Milvus StandaloneZilliz Cloud,提供使用本機或雲端託管資料庫的彈性。

    +

    要在本機使用 Milvus Standalone:

    +
      +
    1. 按照Milvus 安裝指南啟動 Milvus Standalone。
    2. +
    3. 開啟 Attu 並輸入連線資訊:
        +
      • Milvus 位址:您的 Milvus Standalone 伺服器 URI,例如 http://localhost:19530
      • +
      • 其他可選設定:您可以依據您的 Milvus 設定來設定,或保留為預設值。
      • +
    4. +
    5. 點擊 「連接 」訪問您的數據庫。
    6. +
    +
    +

    您也可以在Zilliz Cloud 上連接完全管理的 Milvus。只需將Milvus Addresstoken 設定為 Zilliz Cloud 實例的公共端點和 API 金鑰

    +
    +
      +
    1. 按一下以存取您的資料庫。
    2. +
    +

    + Attu Login Page +

    +
    +

    4.準備資料、建立集合和插入資料

    4.1 準備資料

    我們使用Milvus 文件 2.4.x中的常見問題頁面作為本範例的資料集。

    +

    下載並擷取資料:

    wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    處理 Markdown 檔案:

    from glob import glob
    +
    +text_lines = []
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +    text_lines += file_text.split("# ")
    +
    +
    +

    4.2 產生嵌入

    定義一個嵌入模型,使用milvus_model 產生文字嵌入。我們以DefaultEmbeddingFunction 模型為例,這是一個預先訓練好的輕量級嵌入模型。

    +
    from pymilvus import model as milvus_model
    +
    +embedding_model = milvus_model.DefaultEmbeddingFunction()
    +
    +# Generate test embedding
    +test_embedding = embedding_model.encode_queries(["This is a test"])[0]
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +

    輸出:

    768
    +[-0.04836066  0.07163023 -0.01130064 -0.03789345 -0.03320649 -0.01318448
    + -0.03041712 -0.02269499 -0.02317863 -0.00426028]
    +
    +
    +

    4.3 建立集合

    連接到 Milvus 並建立一個 Collection:

    +
    from pymilvus import MilvusClient
    +
    +# Connect to Milvus Standalone
    +client = MilvusClient(uri="http://localhost:19530")
    +
    +collection_name = "attu_tutorial"
    +
    +# Drop collection if it exists
    +if client.has_collection(collection_name):
    +    client.drop_collection(collection_name)
    +
    +# Create a new collection
    +client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong"
    +)
    +
    +
    +

    4.4 插入資料

    迭代文本行、建立嵌入模型,並將資料插入 Milvus:

    +
    from tqdm import tqdm
    +
    +data = []
    +doc_embeddings = embedding_model.encode_documents(text_lines)
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": doc_embeddings[i], "text": line})
    +
    +client.insert(collection_name=collection_name, data=data)
    +
    +
    +

    4.5 可視化資料和模式

    現在我們可以使用 Attu 的介面來視覺化資料模式和插入的實體。模式顯示已定義的欄位,包括id 欄位類型Int64vector 欄位類型FloatVector(768) ,以及Inner Product (IP) 公制。集合載入了72 個實體

    +

    此外,我們可以檢視插入的資料,包括 ID、向量嵌入以及儲存文字內容等元資料的動態欄位。介面支援根據指定條件或動態欄位進行篩選和查詢。

    +

    + Schema View + Data View +

    +

    5.可視化搜尋結果及關係

    Attu 提供強大的介面,可視化和探索資料關係。若要檢視插入的資料點及其相似性關係,請遵循下列步驟:

    +

    導覽到 Attu 的向量搜尋索引標籤。

    +
      +
    1. 按一下「產生隨機資料」按鈕以建立測試查詢。
    2. +
    3. 按一下「搜尋」,以根據產生的資料擷取結果。
    4. +
    +

    結果會顯示在表格中,顯示 ID、相似度得分,以及每個匹配實體的動態欄位。

    +

    + Search Results Table +

    +
    +

    5.2探索資料關係

    按一下結果面板中的 [探索] (Explore)按鈕,可以將查詢向量與搜尋結果之間的關係可視化為類似知識圖表的結構

    +
      +
    • 中央節點代表搜尋向量。
    • +
    • 連接的節點代表搜尋結果,按一下它們會顯示對應節點的詳細資訊。
    • +
    +

    + Knowledge Graph Visualization +

    +
    +

    5.3展開圖形

    按兩下任何結果節點可展開其連線。此動作會顯示選取節點與資料集中其他資料點之間的其他關係,從而建立一個更大、相互連結的知識圖形

    +

    透過此擴充檢視,可根據向量相似性深入探索資料點的關聯方式。

    +

    + Expanded Knowledge Graph +

    +
    +

    6.結論

    Attu 簡化了儲存於 Milvus 的向量資料的管理與可視化。從資料插入、查詢執行到互動探索,它提供了一個直觀的介面來處理複雜的向量搜尋任務。憑藉動態模式支援、圖形化搜尋視覺化和靈活的查詢篩選器等功能,Attu 讓使用者能夠有效地分析大型資料集。

    +

    利用 Attu 的視覺化探索工具,使用者可以更好地瞭解他們的資料,找出隱藏的關係,並做出以資料為導向的決策。現在就開始使用 Attu 和 Milvus 探索您自己的資料集!

    +
    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.json b/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.json new file mode 100644 index 000000000..64bbddbce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Recommender System","anchorList":[{"label":"推薦系統","href":"Recommender-System","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.md b/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.md new file mode 100644 index 000000000..b533014af --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/recommendation_system.md @@ -0,0 +1,36 @@ +--- +id: recommendation_system.md +summary: 使用 Milvus 建立個人化推薦系統。 +title: 推薦系統 +--- +

    推薦系統

    本教學示範如何使用開放原始碼向量資料庫 Milvus 來建立推薦系統。

    +

    所使用的 ML 模型和第三方軟體包括

    +
      +
    • PaddlePaddle
    • +
    • Redis 或 MySQL
    • +
    • Towhee
    • +
    +


    +

    推薦系統是資訊過濾系統的一個子集,可應用於各種情境,包括個人化電影、音樂、產品、Feed 流推薦等。與搜尋引擎不同,推薦系統不需要使用者準確描述自己的需求,而是透過分析使用者行為來發現使用者的需求和興趣。

    +


    +

    在本教程中,您將學習如何建立一個電影推薦系統,以推薦符合使用者興趣的電影。要建立這樣的推薦系統,首先要下載與電影相關的資料集。本教程使用 MovieLens 1M。或者,您也可以準備自己的資料集,其中應該包括使用者對電影的評價、使用者的人口特徵和電影描述等資訊。使用 PaddlePaddle 結合使用者 ID 和特徵,並將它們轉換成 256 維向量。以類似的方式將電影 ID 和特徵轉換為向量。將電影向量儲存於 Milvus,並使用使用者向量進行相似性搜尋。如果使用者向量與電影向量相似,Milvus 就會回傳電影向量及其 ID 作為推薦結果。然後使用儲存在 Redis 或 MySQL 中的電影向量 ID 來查詢電影資訊。

    +


    +

    + + recommender_system + 推薦系統

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.json b/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.json new file mode 100644 index 000000000..4990547b9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text to Image Search Engine","anchorList":[{"label":"文字轉圖像搜尋引擎","href":"Text-to-Image-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.md b/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.md new file mode 100644 index 000000000..757e458c4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/text_image_search.md @@ -0,0 +1,39 @@ +--- +id: text_image_search.md +summary: 使用 Milvus 建立從文字到圖片的搜尋引擎。 +title: 文字轉圖像搜尋引擎 +--- +

    文字轉圖像搜尋引擎

    本教學示範如何使用開放原始碼向量資料庫 Milvus 建立文字轉影像搜尋引擎。

    +

    您可以按照基本教學快速建立一個最低限度可行的文字轉圖像搜尋引擎。另外,您也可以閱讀深入教學,其中涵蓋了從模型選擇到服務部署的所有內容。您可以按照深入教學中的指示,建立更進階的文字到影像搜尋引擎,以滿足您自己的業務需求。

    + +

    使用的 ML 模型和第三方軟體包括

    + +

    如今,傳統的文字搜尋引擎已逐漸失去魅力,越來越多的人將 TikTok 視為他們最愛的搜尋引擎。在傳統的文字搜尋中,人們輸入關鍵字,就會顯示所有包含該關鍵字的文字。然而,人們抱怨在這樣的搜尋中總是找不到他們想要的東西。此外,搜尋結果也不夠直覺。人們說他們覺得圖片和視訊要比爬行文字來得更直覺和愉快。跨模式文字到圖像的搜尋引擎因此而出現。有了這種新型的搜尋引擎,人們只需輸入一些關鍵字的大段文字,就能找到相關的圖片。

    +

    在本教程中,您將學習如何建立文字到圖像的搜尋引擎。本教學使用 CLIP 模型來擷取影像的特徵,並將其轉換成向量。然後將這些影像向量儲存在 Milvus 向量資料庫中。當使用者輸入查詢文字時,這些文字也會使用相同的 ML 模型 CLIP 轉換成嵌入向量。之後,Milvus 會執行向量相似性搜尋,擷取與輸入文字向量最相似的影像向量。

    +

    + + Text_image_search + 文字圖像搜尋

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.json b/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.json new file mode 100644 index 000000000..87d53f9d6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Text Search Engine","anchorList":[{"label":"文字搜尋引擎","href":"Text-Search-Engine","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.md b/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.md new file mode 100644 index 000000000..6d5ebb0ff --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/text_search_engine.md @@ -0,0 +1,39 @@ +--- +id: text_search_engine.md +summary: 使用 Milvus 建立文字搜尋引擎。 +title: 文字搜尋引擎 +--- +

    文字搜尋引擎

    在本教程中,您將學習如何使用開放原始碼向量資料庫 Milvus 來建立文字搜尋引擎。

    + +

    使用的 ML 模型和第三方軟體包括

    + +


    +

    Milvus 在自然語言處理 (NLP) 領域的一個主要應用是文字搜尋引擎。它是一個很好的工具,可以幫助使用者找到他們正在尋找的資訊。它甚至可以浮現難以找到的資訊。文字搜尋引擎會將使用者輸入的關鍵字或語意與文字資料庫進行比較,然後傳回符合特定條件的結果。

    +


    +

    在本教程中,您將學習如何建立一個文字搜尋引擎。本教學使用 BERT 將文字轉換成定長向量。使用 Milvus 作為向量資料庫進行儲存和向量相似性搜尋。然後使用 MySQL 將 Milvus 產生的向量 ID 映射到文字資料。

    +


    +

    + + text_search_engine + text_search_engine text_search_enginetext_search_engine

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.json b/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.json new file mode 100644 index 000000000..2ad5c4171 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Tutorials Overview","anchorList":[{"label":"教學總覽","href":"Tutorials-Overview","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.md b/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.md new file mode 100644 index 000000000..edf302cce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/tutorials-overview.md @@ -0,0 +1,52 @@ +--- +id: tutorials-overview.md +summary: 本頁提供您與 Milvus 互動的教學清單。 +title: 教學總覽 +--- +

    教學總覽

    本頁提供一系列教學,讓您與 Milvus 互動。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    教學使用案例相關 Milvus 功能
    使用 Milvus 建立 RAGRAG向量搜尋
    進階 RAGRAG向量搜尋
    使用 Milvus 進行全文檢索快速入門全文檢索
    使用 Milvus 的混合搜尋混合搜尋混合搜尋、多向量、密集嵌入、稀疏嵌入
    使用 Milvus 的圖像搜尋語意搜尋向量搜尋、動態領域
    使用 Milvus 的多模態 RAGRAG向量搜尋、動態領域
    使用多向量的多模式搜尋語意搜尋多向量、混合搜尋
    使用 Milvus 的圖形 RAGRAG圖形搜尋
    使用 Milvus 進行上下文檢索快速啟動向量檢索
    使用 Milvus 進行 HDBSCAN 聚類快速啟動向量檢索
    使用 ColPali 與 Milvus 進行多模式檢索快速啟動向量搜尋
    向量可視化快速啟動向量搜尋
    使用 Milvus 推薦電影推薦系統向量搜尋
    使用 Matryoshka 嵌入式進行漏斗搜尋快速啟動向量搜尋
    問題回答系統問題回答向量搜尋
    推薦系統推薦系統向量搜尋
    視訊相似性搜尋語意搜尋向量搜尋
    音訊類似性搜尋語意搜尋向量搜尋
    DNA 分類分類向量搜尋
    文字搜尋引擎語意搜尋向量搜尋
    以文字搜尋圖像語意搜尋向量搜尋
    影像重複資料刪除重複資料刪除向量搜尋
    使用 Attu 快速入門快速啟動向量搜尋
    使用 AsyncMilvusClient 與 asyncioAsyncIOAsyncIO、向量搜尋
    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.json b/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.json new file mode 100644 index 000000000..6c3d79bb3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.json @@ -0,0 +1 @@ +{"codeList":["import asyncio​\nimport numpy as np​\nfrom scipy.sparse import csr_matrix​\nfrom pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​\n​\nloop = asyncio.get_event_loop()​\n\n","# Connect to Milvus server using AsyncMilvusClient​\nasync_client = AsyncMilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n\n","schema = async_client.create_schema(​\n auto_id=False,​\n description=\"This is a sample schema\",​\n)​\n​\nschema.add_field(\"id\", DataType.INT64, is_primary=True)​\nschema.add_field(\"dense_vector\", DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(\"sparse_vector\", DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(\"text\", DataType.VARCHAR, max_length=512)​\n\n","async def create_my_collection(collection_name, schema):​\n if (client.has_collection(collection_name)):​\n await async_client.drop_collection(collection_name)​\n​\n await async_client.create_collection(​\n collection_name=collection_name,​\n schema=schema​\n )​\n​\n if (client.has_collection(collection_name)):​\n print(\"Collection created successfully\")​\n else:​\n print(\"Failed to create collection\")​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_my_collection(\"my_collection\", schema))​\n​\n# Output​\n#​\n# Collection created successfully​\n\n","async def create_indexes(collection_name):​\n index_params = client.prepare_index_params()​\n​\n index_params.add_index(field_name=\"dense_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"sparse_vector\", index_type=\"AUTOINDEX\", metric_type=\"IP\")​\n index_params.add_index(field_name=\"text\", index_type=\"AUTOINDEX\")​\n​\n await async_client.create_index(collection_name, index_params)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(create_indexes(\"my_collection\"))​\n\n","async def load_my_collection(collection_name):​\n await async_client.load_collection(collection_name)​\n print(client.get_load_state(collection_name))​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(load_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# {'state': }​\n\n","async def insert_sample_data(collection_name):​\n # Randomly generated data will be used here​\n rng = np.random.default_rng(42)​\n​\n def generate_random_text(length):​\n seed = \"this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence.\"​\n words = seed.split()​\n return \" \".join(rng.choice(words, length))​\n ​\n data = [{​\n 'id': i, ​\n 'dense_vector': rng.random(5).tolist(), ​\n 'sparse_vector': csr_matrix(rng.random(5)), ​\n 'text': generate_random_text(10)​\n } for i in range(10000)]​\n​\n res = await async_client.insert(collection_name, data)​\n​\n print(res)​\n​\n# Call the above function asynchronously ​\nloop.run_until_complete(insert_sample_data(\"my_collection\"))​\n​\n# Output​\n#​\n# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​\n\n","async def query_my_collection(collection_name):​\n # Find the number of entities with the `text` fields starting with the word \"random\" in the `my_collection` collection.​\n​\n res = await async_client.query(​\n collection_name=\"my_collection\",​\n filter='text like \"%random%\"',​\n output_fields=[\"count(*)\"]​\n )​\n​\n print(res) ​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(query_my_collection(\"my_collection\"))​\n​\n# Output​\n#​\n# data: [\"{'count(*)': 6802}\"] ​\n\n","async def conduct_vector_search(collection_name, type, field):​\n # Generate a set of three random query vectors​\n query_vectors = []​\n if type == \"dense\":​\n query_vectors = [ rng.random(5) for _ in range(3) ]​\n ​\n if type == \"sparse\":​\n query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​\n​\n print(query_vectors)​\n​\n res = await async_client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n anns_field=field,​\n output_fields=[\"text\", field]​\n )​\n​\n print(res)​\n ​\n# To search against the dense vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"dense\", \"dense_vector\"))​\n​\n# To search against the sparse vector field asynchronously ​\nloop.run_until_complete(conduct_vector_search(\"my_collection\", \"sparse\", \"sparse_vector\"))​\n\n","async def conduct_hybrid_search(collection_name):​\n req_dense = AnnSearchRequest(​\n data=[ rng.random(5) for _ in range(3) ],​\n anns_field=\"dense_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n req_sparse = AnnSearchRequest(​\n data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​\n anns_field=\"sparse_vector\",​\n param={\"metric_type\": \"IP\"},​\n limit=10​\n )​\n​\n reqs = [req_dense, req_sparse]​\n​\n ranker = RRFRanker()​\n​\n res = await async_client.hybrid_search(​\n collection_name=\"my_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n output_fields=[\"text\", \"dense_vector\", \"sparse_vector\"]​\n )​\n​\n print(res)​\n ​\n# Call the above function asynchronously ​\nloop.run_until_complete(conduct_hybrid_search(\"my_collection\"))​\n\n"],"headingContent":"Tutorial: Use AsyncMilvusClient with asyncio​","anchorList":[{"label":"教學:在 asyncio 中使用 AsyncMilvusClient","href":"Tutorial-Use-AsyncMilvusClient-with-asyncio​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"建立事件循環","href":"Create-an-event-loop​","type":2,"isActive":false},{"label":"使用 AsyncMilvusClient 連線","href":"Connect-with-AsyncMilvusClient​","type":2,"isActive":false},{"label":"建立模式","href":"Create-schema​","type":2,"isActive":false},{"label":"建立集合","href":"Create-collection​","type":2,"isActive":false},{"label":"建立索引","href":"Create-index​","type":2,"isActive":false},{"label":"載入集合","href":"Load-collection​","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data​","type":2,"isActive":false},{"label":"查詢","href":"Query​","type":2,"isActive":false},{"label":"搜尋","href":"Search​","type":2,"isActive":false},{"label":"混合搜尋","href":"Hybrid-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.md b/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.md new file mode 100644 index 000000000..68348956b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/use-async-milvus-client-with-asyncio.md @@ -0,0 +1,414 @@ +--- +id: use-async-milvus-client-with-asyncio.md +summary: >- + AsyncMilvusClient 是異步的 MilvusClient,它提供了一個基於 coroutine 的 API,可透過 asyncio + 以非阻塞方式存取 Milvus。在這篇文章中,您將學習如何呼叫 AsyncMilvusClient 所提供的 API,以及需要注意的地方。 +title: 問題回答系統 +--- +

    教學:在 asyncio 中使用 AsyncMilvusClient

    AsyncMilvusClient是一個非同步的 MilvusClient,它提供了一個基於動態程式的 API,可透過asyncio 非阻塞地存取 Milvus。在這篇文章中,您將學習如何呼叫 AsyncMilvusClient 所提供的 API,以及需要注意的地方。

    +

    概述

    Asyncio 是一個使用async/await語法撰寫並發程式碼的函式庫,也是 Milvus 高效能異步用戶端的基礎,它將適合您在 asyncio 上執行的程式碼庫。

    +

    AsyncMilvusClient 提供的方法具有與 MilvusClient 相同的參數集與行為。唯一的差別在於您呼叫它們的方式。下表列出 AsyncMilvusClient 可用的方法。

    +

    **客戶端

    +

    `close()`

    +

    +

    +

    **集合與分割**

    +

    `create_collection()`

    +

    `drop_collection()`

    +

    `create_partition()`

    +

    `drop_partition()`

    +

    +

    +

    **索引**

    +

    `create_index()`

    +

    `drop_index()`

    +

    `load_collection()`

    +

    `release_collection()`

    +

    `load_partitions()`

    +

    `release_partitions()`

    +

    **向量**

    +

    `insert()`

    +

    `upsert()`

    +

    `delete()`

    +

    `search()`

    +

    `query()`

    +

    `hybrid_search()`

    +

    `get()`

    +

    +

    +
    +

    如果您仍然需要任何其他 MilvusClient 方法的異步版本,您可以在pymilvus套件中提交功能請求。我們也歡迎您提供程式碼。

    +

    建立事件循環

    使用 asyncio 的應用程式通常會使用事件循環作為管理異步任務和 I/O 作業的協調器。在本教程中,我們將從 asyncio 獲得一個事件迴圈,並將其用作協調器。

    +
    import asyncio​
    +import numpy as np​
    +from scipy.sparse import csr_matrix​
    +from pymilvus import MilvusClient, AsyncMilvusClient, DataType, RRFRanker, AnnSearchRequest​
    +​
    +loop = asyncio.get_event_loop()​
    +
    +
    +

    使用 AsyncMilvusClient 連線

    以下範例示範如何以異步方式連接 Milvus。

    +
    # Connect to Milvus server using AsyncMilvusClient​
    +async_client = AsyncMilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +
    +
    +

    建立模式

    目前,AsyncMilvusClient 無法提供create_schema() 。取而代之,我們將使用 MilvusClient 來建立集合的模式。

    +
    schema = async_client.create_schema(​
    +    auto_id=False,​
    +    description="This is a sample schema",​
    +)​
    +​
    +schema.add_field("id", DataType.INT64, is_primary=True)​
    +schema.add_field("dense_vector", DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field("sparse_vector", DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field("text", DataType.VARCHAR, max_length=512)​
    +
    +
    +
    +

    AsyncMilvusClient 會同步呼叫create_schema() 方法;因此,您不需要使用事件循環來協調呼叫。

    +
    +

    建立集合

    現在我們將使用模式建立一個集合。請注意,您需要在任何呼叫AsyncMilvusClient 方法前加上await 關鍵字,並將呼叫置於async 函式內,如下所示。

    +
    async def create_my_collection(collection_name, schema):​
    +    if (client.has_collection(collection_name)):​
    +        await async_client.drop_collection(collection_name)​
    +​
    +    await async_client.create_collection(​
    +        collection_name=collection_name,​
    +        schema=schema​
    +    )​
    +​
    +    if (client.has_collection(collection_name)):​
    +        print("Collection created successfully")​
    +    else:​
    +        print("Failed to create collection")​
    +        ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_my_collection("my_collection", schema))​
    +​
    +# Output​
    +#​
    +# Collection created successfully​
    +
    +
    +

    建立索引

    您也需要為所有向量欄位和可選的標量欄位建立索引。根據上面定義的模式,集合中有兩個向量欄位,您將為它們建立索引,如下所示。

    +
    async def create_indexes(collection_name):​
    +    index_params = client.prepare_index_params()​
    +​
    +    index_params.add_index(field_name="dense_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="sparse_vector", index_type="AUTOINDEX", metric_type="IP")​
    +    index_params.add_index(field_name="text", index_type="AUTOINDEX")​
    +​
    +    await async_client.create_index(collection_name, index_params)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(create_indexes("my_collection"))​
    +
    +
    +

    載入集合

    在為必要的欄位建立索引後,就可以載入集合。以下程式碼示範如何以異步方式載入集合。

    +
    async def load_my_collection(collection_name):​
    +    await async_client.load_collection(collection_name)​
    +    print(client.get_load_state(collection_name))​
    +    ​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(load_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'state': <LoadState: Loaded>}​
    +
    +
    +

    插入資料

    您可以使用 pymilvus 中可用的嵌入模型來為您的文字產生向量嵌入。詳情請參閱嵌入概述。在本節中,我們將插入隨機產生的資料到資料集中。

    +
    async def insert_sample_data(collection_name):​
    +    # Randomly generated data will be used here​
    +    rng = np.random.default_rng(42)​
    +​
    +    def generate_random_text(length):​
    +        seed = "this is a seed paragraph to generate random text, which is used for testing purposes. Specifically, a random text is generated by randomly selecting words from this sentence."​
    +        words = seed.split()​
    +        return " ".join(rng.choice(words, length))​
    +    ​
    +    data = [{​
    +        'id': i, ​
    +        'dense_vector': rng.random(5).tolist(), ​
    +        'sparse_vector': csr_matrix(rng.random(5)), ​
    +        'text': generate_random_text(10)​
    +    } for i in range(10000)]​
    +​
    +    res = await async_client.insert(collection_name, data)​
    +​
    +    print(res)​
    +​
    +# Call the above function asynchronously ​
    +loop.run_until_complete(insert_sample_data("my_collection"))​
    +​
    +# Output​
    +#​
    +# {'insert_count': 10000, 'ids': [0, 1, 2, 3, ..., 9999]}​
    +
    +
    +

    查詢

    當資料集載入並填滿資料後,您就可以在其中進行搜尋和查詢。在本節中,您將找出text 欄位中以random 開頭的實體數目,該實體的集合名為my_collection

    +
    async def query_my_collection(collection_name):​
    +    # Find the number of entities with the `text` fields starting with the word "random" in the `my_collection` collection.​
    +​
    +    res = await async_client.query(​
    +        collection_name="my_collection",​
    +        filter='text like "%random%"',​
    +        output_fields=["count(*)"]​
    +    )​
    +​
    +    print(res) ​
    +    ​
    +# Call the above function asynchronously   ​
    +loop.run_until_complete(query_my_collection("my_collection"))​
    +​
    +# Output​
    +#​
    +# data: ["{'count(*)': 6802}"] ​
    +
    +
    +

    搜尋

    在本節中,您將對目標集合的密集與稀疏向量欄位進行向量搜尋。

    +
    async def conduct_vector_search(collection_name, type, field):​
    +    # Generate a set of three random query vectors​
    +    query_vectors = []​
    +    if type == "dense":​
    +        query_vectors = [ rng.random(5) for _ in range(3) ]​
    +    ​
    +    if type == "sparse":​
    +        query_vectors = [ csr_matrix(rng.random(5)) for _ in range(3) ]​
    +​
    +    print(query_vectors)​
    +​
    +    res = await async_client.search(​
    +        collection_name="my_collection",​
    +        data=query_vectors,​
    +        anns_field=field,​
    +        output_fields=["text", field]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# To search against the dense vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "dense", "dense_vector"))​
    +​
    +# To search against the sparse vector field asynchronously ​
    +loop.run_until_complete(conduct_vector_search("my_collection", "sparse", "sparse_vector"))​
    +
    +
    +

    搜尋輸出應列出與指定查詢向量對應的三組結果。

    +

    混合搜尋

    混合搜尋會結合多次搜尋的結果,並重新排序,以獲得更好的召回率。在本節中,您將使用密集與稀疏向量場進行混合搜尋。

    +
    async def conduct_hybrid_search(collection_name):​
    +    req_dense = AnnSearchRequest(​
    +        data=[ rng.random(5) for _ in range(3) ],​
    +        anns_field="dense_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    req_sparse = AnnSearchRequest(​
    +        data=[ csr_matrix(rng.random(5)) for _ in range(3) ],​
    +        anns_field="sparse_vector",​
    +        param={"metric_type": "IP"},​
    +        limit=10​
    +    )​
    +​
    +    reqs = [req_dense, req_sparse]​
    +​
    +    ranker = RRFRanker()​
    +​
    +    res = await async_client.hybrid_search(​
    +        collection_name="my_collection",​
    +        reqs=reqs,​
    +        ranker=ranker,​
    +        output_fields=["text", "dense_vector", "sparse_vector"]​
    +    )​
    +​
    +    print(res)​
    +    ​
    +# Call the above function asynchronously  ​
    +loop.run_until_complete(conduct_hybrid_search("my_collection"))​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.json b/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.json new file mode 100644 index 000000000..419f6de5e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.json @@ -0,0 +1 @@ +{"codeList":["$ pip install pdf2image\n$ pip pymilvus\n$ pip install colpali_engine\n$ pip install tqdm\n$ pip instal pillow\n","from pdf2image import convert_from_path\n\npdf_path = \"pdfs/2004.12832v2.pdf\"\nimages = convert_from_path(pdf_path)\n\nfor i, image in enumerate(images):\n image.save(f\"pages/page_{i + 1}.png\", \"PNG\")\n","from pymilvus import MilvusClient, DataType\nimport numpy as np\nimport concurrent.futures\n\nclient = MilvusClient(uri=\"milvus.db\")\n","class MilvusColbertRetriever:\n def __init__(self, milvus_client, collection_name, dim=128):\n # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.\n # If the collection exists, load it.\n self.collection_name = collection_name\n self.client = milvus_client\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.load_collection(collection_name)\n self.dim = dim\n\n def create_collection(self):\n # Create a new collection in Milvus for storing embeddings.\n # Drop the existing collection if it already exists and define the schema for the collection.\n if self.client.has_collection(collection_name=self.collection_name):\n self.client.drop_collection(collection_name=self.collection_name)\n schema = self.client.create_schema(\n auto_id=True,\n enable_dynamic_fields=True,\n )\n schema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)\n schema.add_field(\n field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=self.dim\n )\n schema.add_field(field_name=\"seq_id\", datatype=DataType.INT16)\n schema.add_field(field_name=\"doc_id\", datatype=DataType.INT64)\n schema.add_field(field_name=\"doc\", datatype=DataType.VARCHAR, max_length=65535)\n\n self.client.create_collection(\n collection_name=self.collection_name, schema=schema\n )\n\n def create_index(self):\n # Create an index on the vector field to enable fast similarity search.\n # Releases and drops any existing index before creating a new one with specified parameters.\n self.client.release_collection(collection_name=self.collection_name)\n self.client.drop_index(\n collection_name=self.collection_name, index_name=\"vector\"\n )\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"vector\",\n index_name=\"vector_index\",\n index_type=\"HNSW\", # or any other index type you want\n metric_type=\"IP\", # or the appropriate metric type\n params={\n \"M\": 16,\n \"efConstruction\": 500,\n }, # adjust these parameters as needed\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def create_scalar_index(self):\n # Create a scalar index for the \"doc_id\" field to enable fast lookups by document ID.\n self.client.release_collection(collection_name=self.collection_name)\n\n index_params = self.client.prepare_index_params()\n index_params.add_index(\n field_name=\"doc_id\",\n index_name=\"int32_index\",\n index_type=\"INVERTED\", # or any other index type you want\n )\n\n self.client.create_index(\n collection_name=self.collection_name, index_params=index_params, sync=True\n )\n\n def search(self, data, topk):\n # Perform a vector search on the collection to find the top-k most similar documents.\n search_params = {\"metric_type\": \"IP\", \"params\": {}}\n results = self.client.search(\n self.collection_name,\n data,\n limit=int(50),\n output_fields=[\"vector\", \"seq_id\", \"doc_id\"],\n search_params=search_params,\n )\n doc_ids = set()\n for r_id in range(len(results)):\n for r in range(len(results[r_id])):\n doc_ids.add(results[r_id][r][\"entity\"][\"doc_id\"])\n\n scores = []\n\n def rerank_single_doc(doc_id, data, client, collection_name):\n # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.\n doc_colbert_vecs = client.query(\n collection_name=collection_name,\n filter=f\"doc_id in [{doc_id}]\",\n output_fields=[\"seq_id\", \"vector\", \"doc\"],\n limit=1000,\n )\n doc_vecs = np.vstack(\n [doc_colbert_vecs[i][\"vector\"] for i in range(len(doc_colbert_vecs))]\n )\n score = np.dot(data, doc_vecs.T).max(1).sum()\n return (score, doc_id)\n\n with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:\n futures = {\n executor.submit(\n rerank_single_doc, doc_id, data, client, self.collection_name\n ): doc_id\n for doc_id in doc_ids\n }\n for future in concurrent.futures.as_completed(futures):\n score, doc_id = future.result()\n scores.append((score, doc_id))\n\n scores.sort(key=lambda x: x[0], reverse=True)\n if len(scores) >= topk:\n return scores[:topk]\n else:\n return scores\n\n def insert(self, data):\n # Insert ColBERT embeddings and metadata for a document into the collection.\n colbert_vecs = [vec for vec in data[\"colbert_vecs\"]]\n seq_length = len(colbert_vecs)\n doc_ids = [data[\"doc_id\"] for i in range(seq_length)]\n seq_ids = list(range(seq_length))\n docs = [\"\"] * seq_length\n docs[0] = data[\"filepath\"]\n\n # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.\n self.client.insert(\n self.collection_name,\n [\n {\n \"vector\": colbert_vecs[i],\n \"seq_id\": seq_ids[i],\n \"doc_id\": doc_ids[i],\n \"doc\": docs[i],\n }\n for i in range(seq_length)\n ],\n )\n","from colpali_engine.models import ColPali\nfrom colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor\nfrom colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor\nfrom colpali_engine.utils.torch_utils import ListDataset, get_torch_device\nfrom torch.utils.data import DataLoader\nimport torch\nfrom typing import List, cast\n\ndevice = get_torch_device(\"cpu\")\nmodel_name = \"vidore/colpali-v1.2\"\n\nmodel = ColPali.from_pretrained(\n model_name,\n torch_dtype=torch.bfloat16,\n device_map=device,\n).eval()\n\nqueries = [\n \"How to end-to-end retrieval with ColBert?\",\n \"Where is ColBERT performance table?\",\n]\n\nprocessor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))\n\ndataloader = DataLoader(\n dataset=ListDataset[str](queries),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_queries(x),\n)\n\nqs: List[torch.Tensor] = []\nfor batch_query in dataloader:\n with torch.no_grad():\n batch_query = {k: v.to(model.device) for k, v in batch_query.items()}\n embeddings_query = model(**batch_query)\n qs.extend(list(torch.unbind(embeddings_query.to(\"cpu\"))))\n","from tqdm import tqdm\nfrom PIL import Image\nimport os\n\nimages = [Image.open(\"./pages/\" + name) for name in os.listdir(\"./pages\")]\n\ndataloader = DataLoader(\n dataset=ListDataset[str](images),\n batch_size=1,\n shuffle=False,\n collate_fn=lambda x: processor.process_images(x),\n)\n\nds: List[torch.Tensor] = []\nfor batch_doc in tqdm(dataloader):\n with torch.no_grad():\n batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}\n embeddings_doc = model(**batch_doc)\n ds.extend(list(torch.unbind(embeddings_doc.to(\"cpu\"))))\n\nprint(ds[0].shape)\n","retriever = MilvusColbertRetriever(collection_name=\"colpali\", milvus_client=client)\nretriever.create_collection()\nretriever.create_index()\n","filepaths = [\"./pages/\" + name for name in os.listdir(\"./pages\")]\nfor i in range(len(filepaths)):\n data = {\n \"colbert_vecs\": ds[i].float().numpy(),\n \"doc_id\": i,\n \"filepath\": filepaths[i],\n }\n retriever.insert(data)\n","for query in qs:\n query = query.float().numpy()\n result = retriever.search(query, topk=1)\n print(filepaths[result[0][1]])\n"],"headingContent":"Use ColPali for Multi-Modal Retrieval with Milvus","anchorList":[{"label":"使用 ColPali 與 Milvus 進行多模式檢索","href":"Use-ColPali-for-Multi-Modal-Retrieval-with-Milvus","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-the-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.md b/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.md new file mode 100644 index 000000000..59894af97 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/use_ColPali_with_milvus.md @@ -0,0 +1,332 @@ +--- +id: use_ColPali_with_milvus.md +summary: >- + 在本筆記簿中,為了一般性起見,我們將這種多向量表示法稱為「ColBERT 內嵌」。然而,實際使用的模型是 ColPali 模型。我們將示範如何使用 + Milvus 進行多向量檢索。在此基礎上,我們將介紹如何使用 ColPali 根據給定的查詢檢索頁面。 +title: 使用 ColPali 與 Milvus 進行多模式檢索 +--- +

    使用 ColPali 與 Milvus 進行多模式檢索

    +Open In Colab + + +GitHub Repository +

    +

    現代的檢索模型通常使用單一的嵌入來表示文字或影像。然而,ColBERT 是一種神經模型,它利用每個資料實例的嵌入清單,並採用「MaxSim」運算來計算兩個文字之間的相似度。除了文字資料之外,圖形、表格和圖表也包含豐富的資訊,這些資訊在以文字為基礎的資訊檢索中往往被忽略。

    +

    + + + + +

    +

    MaxSim 功能是透過查看查詢與文件 (您要搜尋的內容) 的代號嵌入 (token embeddings) 來比較它們。對於查詢中的每個單字,它會從文件中挑出最相似的單字 (使用余弦相似度或平方 L2 距離),然後將查詢中所有單字的最大相似度相加。

    +

    ColPali 是一種結合 ColBERT 的多向量表示法與 PaliGemma(多模態大語言模型)的方法,以利用其強大的理解能力。這種方法可以使用統一的多向量嵌入來表示包含文字和圖像的頁面。這個多向量表達中的嵌入可以捕捉到詳細的資訊,提高多模態資料的檢索增強生成 (RAG) 效能。

    +

    在本筆記簿中,為了一般性起見,我們將此種多向量表示法稱為「ColBERT 內嵌」。然而,實際使用的模型是ColPali 模型。我們將示範如何使用 Milvus 進行多向量檢索。在此基礎上,我們將介紹如何使用 ColPali 根據給定的查詢來檢索網頁。

    +

    準備工作

    $ pip install pdf2image
    +$ pip pymilvus
    +$ pip install colpali_engine
    +$ pip install tqdm
    +$ pip instal pillow
    +
    +

    準備資料

    我們將以 PDF RAG 為例。您可以下載ColBERTpaper 並將其放入./pdf 。ColPali 並不直接處理文字,而是將整個頁面光柵化為影像。ColPali 模型擅長理解這些圖像中包含的文字資訊。因此,我們會將每個 PDF 頁面轉換成影像來處理。

    +
    from pdf2image import convert_from_path
    +
    +pdf_path = "pdfs/2004.12832v2.pdf"
    +images = convert_from_path(pdf_path)
    +
    +for i, image in enumerate(images):
    +    image.save(f"pages/page_{i + 1}.png", "PNG")
    +
    +

    接下來,我們將使用 Milvus Lite 來初始化資料庫。您可以透過設定 uri 到您的 Milvus 服務託管的適當位址,輕鬆切換到完整的 Milvus 實例。

    +
    from pymilvus import MilvusClient, DataType
    +import numpy as np
    +import concurrent.futures
    +
    +client = MilvusClient(uri="milvus.db")
    +
    +
    +
      +
    • 如果您只需要一個本機向量資料庫來進行小規模的資料或原型設計,將 uri 設定為一個本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。
    • +
    • 如果您使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 API key
    • +
    +
    +

    我們將定義一個 MilvusColbertRetriever 類別,用來包圍 Milvus 用戶端進行多向量資料擷取。該實作會將 ColBERT embeddings 平面化,並將它們插入一個集合,其中每一行代表 ColBERT embedding 清單中的一個個別 embedding。它還記錄了 doc_id 和 seq_id,以便追蹤每個內嵌的來源。

    +

    使用 ColBERT 嵌入列表進行搜尋時,會進行多次搜尋,每次搜尋一個 ColBERT 嵌入。擷取的 doc_ids 將被重複。將執行重新排序過程,在此過程中,每個 doc_id 的完整內嵌被擷取,並計算 MaxSim 得分,以產生最終的排序結果。

    +
    class MilvusColbertRetriever:
    +    def __init__(self, milvus_client, collection_name, dim=128):
    +        # Initialize the retriever with a Milvus client, collection name, and dimensionality of the vector embeddings.
    +        # If the collection exists, load it.
    +        self.collection_name = collection_name
    +        self.client = milvus_client
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.load_collection(collection_name)
    +        self.dim = dim
    +
    +    def create_collection(self):
    +        # Create a new collection in Milvus for storing embeddings.
    +        # Drop the existing collection if it already exists and define the schema for the collection.
    +        if self.client.has_collection(collection_name=self.collection_name):
    +            self.client.drop_collection(collection_name=self.collection_name)
    +        schema = self.client.create_schema(
    +            auto_id=True,
    +            enable_dynamic_fields=True,
    +        )
    +        schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)
    +        schema.add_field(
    +            field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=self.dim
    +        )
    +        schema.add_field(field_name="seq_id", datatype=DataType.INT16)
    +        schema.add_field(field_name="doc_id", datatype=DataType.INT64)
    +        schema.add_field(field_name="doc", datatype=DataType.VARCHAR, max_length=65535)
    +
    +        self.client.create_collection(
    +            collection_name=self.collection_name, schema=schema
    +        )
    +
    +    def create_index(self):
    +        # Create an index on the vector field to enable fast similarity search.
    +        # Releases and drops any existing index before creating a new one with specified parameters.
    +        self.client.release_collection(collection_name=self.collection_name)
    +        self.client.drop_index(
    +            collection_name=self.collection_name, index_name="vector"
    +        )
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="vector",
    +            index_name="vector_index",
    +            index_type="HNSW",  # or any other index type you want
    +            metric_type="IP",  # or the appropriate metric type
    +            params={
    +                "M": 16,
    +                "efConstruction": 500,
    +            },  # adjust these parameters as needed
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def create_scalar_index(self):
    +        # Create a scalar index for the "doc_id" field to enable fast lookups by document ID.
    +        self.client.release_collection(collection_name=self.collection_name)
    +
    +        index_params = self.client.prepare_index_params()
    +        index_params.add_index(
    +            field_name="doc_id",
    +            index_name="int32_index",
    +            index_type="INVERTED",  # or any other index type you want
    +        )
    +
    +        self.client.create_index(
    +            collection_name=self.collection_name, index_params=index_params, sync=True
    +        )
    +
    +    def search(self, data, topk):
    +        # Perform a vector search on the collection to find the top-k most similar documents.
    +        search_params = {"metric_type": "IP", "params": {}}
    +        results = self.client.search(
    +            self.collection_name,
    +            data,
    +            limit=int(50),
    +            output_fields=["vector", "seq_id", "doc_id"],
    +            search_params=search_params,
    +        )
    +        doc_ids = set()
    +        for r_id in range(len(results)):
    +            for r in range(len(results[r_id])):
    +                doc_ids.add(results[r_id][r]["entity"]["doc_id"])
    +
    +        scores = []
    +
    +        def rerank_single_doc(doc_id, data, client, collection_name):
    +            # Rerank a single document by retrieving its embeddings and calculating the similarity with the query.
    +            doc_colbert_vecs = client.query(
    +                collection_name=collection_name,
    +                filter=f"doc_id in [{doc_id}]",
    +                output_fields=["seq_id", "vector", "doc"],
    +                limit=1000,
    +            )
    +            doc_vecs = np.vstack(
    +                [doc_colbert_vecs[i]["vector"] for i in range(len(doc_colbert_vecs))]
    +            )
    +            score = np.dot(data, doc_vecs.T).max(1).sum()
    +            return (score, doc_id)
    +
    +        with concurrent.futures.ThreadPoolExecutor(max_workers=300) as executor:
    +            futures = {
    +                executor.submit(
    +                    rerank_single_doc, doc_id, data, client, self.collection_name
    +                ): doc_id
    +                for doc_id in doc_ids
    +            }
    +            for future in concurrent.futures.as_completed(futures):
    +                score, doc_id = future.result()
    +                scores.append((score, doc_id))
    +
    +        scores.sort(key=lambda x: x[0], reverse=True)
    +        if len(scores) >= topk:
    +            return scores[:topk]
    +        else:
    +            return scores
    +
    +    def insert(self, data):
    +        # Insert ColBERT embeddings and metadata for a document into the collection.
    +        colbert_vecs = [vec for vec in data["colbert_vecs"]]
    +        seq_length = len(colbert_vecs)
    +        doc_ids = [data["doc_id"] for i in range(seq_length)]
    +        seq_ids = list(range(seq_length))
    +        docs = [""] * seq_length
    +        docs[0] = data["filepath"]
    +
    +        # Insert the data as multiple vectors (one for each sequence) along with the corresponding metadata.
    +        self.client.insert(
    +            self.collection_name,
    +            [
    +                {
    +                    "vector": colbert_vecs[i],
    +                    "seq_id": seq_ids[i],
    +                    "doc_id": doc_ids[i],
    +                    "doc": docs[i],
    +                }
    +                for i in range(seq_length)
    +            ],
    +        )
    +
    +

    我們將使用colpali_engine來提取兩個查詢的嵌入列表,並從 PDF 頁面中擷取相關資訊。

    +
    from colpali_engine.models import ColPali
    +from colpali_engine.models.paligemma.colpali.processing_colpali import ColPaliProcessor
    +from colpali_engine.utils.processing_utils import BaseVisualRetrieverProcessor
    +from colpali_engine.utils.torch_utils import ListDataset, get_torch_device
    +from torch.utils.data import DataLoader
    +import torch
    +from typing import List, cast
    +
    +device = get_torch_device("cpu")
    +model_name = "vidore/colpali-v1.2"
    +
    +model = ColPali.from_pretrained(
    +    model_name,
    +    torch_dtype=torch.bfloat16,
    +    device_map=device,
    +).eval()
    +
    +queries = [
    +    "How to end-to-end retrieval with ColBert?",
    +    "Where is ColBERT performance table?",
    +]
    +
    +processor = cast(ColPaliProcessor, ColPaliProcessor.from_pretrained(model_name))
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](queries),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_queries(x),
    +)
    +
    +qs: List[torch.Tensor] = []
    +for batch_query in dataloader:
    +    with torch.no_grad():
    +        batch_query = {k: v.to(model.device) for k, v in batch_query.items()}
    +        embeddings_query = model(**batch_query)
    +    qs.extend(list(torch.unbind(embeddings_query.to("cpu"))))
    +
    +

    此外,我們還要抽取每個頁面的嵌入列表,它顯示每個頁面有 1030 個 128 維嵌入。

    +
    from tqdm import tqdm
    +from PIL import Image
    +import os
    +
    +images = [Image.open("./pages/" + name) for name in os.listdir("./pages")]
    +
    +dataloader = DataLoader(
    +    dataset=ListDataset[str](images),
    +    batch_size=1,
    +    shuffle=False,
    +    collate_fn=lambda x: processor.process_images(x),
    +)
    +
    +ds: List[torch.Tensor] = []
    +for batch_doc in tqdm(dataloader):
    +    with torch.no_grad():
    +        batch_doc = {k: v.to(model.device) for k, v in batch_doc.items()}
    +        embeddings_doc = model(**batch_doc)
    +    ds.extend(list(torch.unbind(embeddings_doc.to("cpu"))))
    +
    +print(ds[0].shape)
    +
    +
      0%|          | 0/10 [00:00<?, ?it/s]
    +
    +100%|██████████| 10/10 [01:22<00:00,  8.24s/it]
    +
    +torch.Size([1030, 128])
    +
    +

    我們將使用 MilvusColbertRetriever 建立一個名為「colpali」的集合。

    +
    retriever = MilvusColbertRetriever(collection_name="colpali", milvus_client=client)
    +retriever.create_collection()
    +retriever.create_index()
    +
    +

    我們將插入嵌入清單到 Milvus 資料庫。

    +
    filepaths = ["./pages/" + name for name in os.listdir("./pages")]
    +for i in range(len(filepaths)):
    +    data = {
    +        "colbert_vecs": ds[i].float().numpy(),
    +        "doc_id": i,
    +        "filepath": filepaths[i],
    +    }
    +    retriever.insert(data)
    +
    +

    現在我們可以使用查詢嵌入清單搜尋最相關的頁面。

    +
    for query in qs:
    +    query = query.float().numpy()
    +    result = retriever.search(query, topk=1)
    +    print(filepaths[result[0][1]])
    +
    +
    ./pages/page_5.png
    +./pages/page_7.png
    +
    +

    最後,我們擷取原始的頁面名稱。透過 ColPali,我們可以擷取多模態文件,而不需要複雜的處理技術來擷取文件中的文字和影像。透過利用大型視覺模型,可以分析更多的資訊,例如表格和圖表,而不會造成重大的資訊損失。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.json b/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.json new file mode 100644 index 000000000..298fb3c2f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.json @@ -0,0 +1 @@ +{"codeList":["$ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn\n","import os\n\nos.environ[\"OPENAI_API_KEY\"] = \"sk-***********\"\n","$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip\n$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs\n","from glob import glob\n\ntext_lines = []\n\nfor file_path in glob(\"milvus_docs/en/faq/*.md\", recursive=True):\n with open(file_path, \"r\") as file:\n file_text = file.read()\n\n text_lines += file_text.split(\"# \")\n","from openai import OpenAI\n\nopenai_client = OpenAI()\n","def emb_text(text):\n return (\n openai_client.embeddings.create(input=text, model=\"text-embedding-3-large\")\n .data[0]\n .embedding\n )\n","test_embedding = emb_text(\"This is a test\")\nembedding_dim = len(test_embedding)\nprint(embedding_dim)\nprint(test_embedding[:10])\n","from pymilvus import MilvusClient\n\nmilvus_client = MilvusClient(uri=\"./milvus_demo.db\")\n\ncollection_name = \"my_rag_collection\"\n","if milvus_client.has_collection(collection_name):\n milvus_client.drop_collection(collection_name)\n","milvus_client.create_collection(\n collection_name=collection_name,\n dimension=embedding_dim,\n metric_type=\"IP\", # Inner product distance\n consistency_level=\"Strong\", # Strong consistency level\n)\n","from tqdm import tqdm\n\ndata = []\n\nfor i, line in enumerate(tqdm(text_lines, desc=\"Creating embeddings\")):\n data.append({\"id\": i, \"vector\": emb_text(line), \"text\": line})\n\nmilvus_client.insert(collection_name=collection_name, data=data)\n","# Modify the question to test it with your own query!\n\nquestion = \"How is data stored in Milvus?\"\n","search_res = milvus_client.search(\n collection_name=collection_name,\n data=[\n emb_text(question)\n ], # Use the `emb_text` function to convert the question to an embedding vector\n limit=10, # Return top 10 results\n search_params={\"metric_type\": \"IP\", \"params\": {}}, # Inner product distance\n output_fields=[\"text\"], # Return the text field\n)\n","import json\n\nretrieved_lines_with_distances = [\n (res[\"entity\"][\"text\"], res[\"distance\"]) for res in search_res[0]\n]\nprint(json.dumps(retrieved_lines_with_distances, indent=4))\n","import pandas as pd\nimport numpy as np\nfrom sklearn.manifold import TSNE\n\ndata.append({\"id\": len(data), \"vector\": emb_text(question), \"text\": question})\nembeddings = []\nfor gp in data:\n embeddings.append(gp[\"vector\"])\n\nX = np.array(embeddings, dtype=np.float32)\ntsne = TSNE(random_state=0, max_iter=1000)\ntsne_results = tsne.fit_transform(X)\n\ndf_tsne = pd.DataFrame(tsne_results, columns=[\"TSNE1\", \"TSNE2\"])\ndf_tsne\n","import matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Extract similar ids from search results\nsimilar_ids = [gp[\"id\"] for gp in search_res[0]]\n\ndf_norm = df_tsne[:-1]\n\ndf_query = pd.DataFrame(df_tsne.iloc[-1]).T\n\n# Filter points based on similar ids\nsimilar_points = df_tsne[df_tsne.index.isin(similar_ids)]\n\n# Create the plot\nfig, ax = plt.subplots(figsize=(8, 6)) # Set figsize\n\n# Set the style of the plot\nsns.set_style(\"darkgrid\", {\"grid.color\": \".6\", \"grid.linestyle\": \":\"})\n\n# Plot all points in blue\nsns.scatterplot(\n data=df_tsne, x=\"TSNE1\", y=\"TSNE2\", color=\"blue\", label=\"All knowledge\", ax=ax\n)\n\n# Overlay similar points in red\nsns.scatterplot(\n data=similar_points,\n x=\"TSNE1\",\n y=\"TSNE2\",\n color=\"red\",\n label=\"Similar knowledge\",\n ax=ax,\n)\n\nsns.scatterplot(\n data=df_query, x=\"TSNE1\", y=\"TSNE2\", color=\"green\", label=\"Query\", ax=ax\n)\n\n# Set plot titles and labels\nplt.title(\"Scatter plot of knowledge using t-SNE\")\nplt.xlabel(\"TSNE1\")\nplt.ylabel(\"TSNE2\")\n\n# Set axis to be equal\nplt.axis(\"equal\")\n\n# Display the legend\nplt.legend()\n\n# Show the plot\nplt.show()\n"],"headingContent":"Vector Visualization","anchorList":[{"label":"向量可視化","href":"Vector-Visualization","type":1,"isActive":false},{"label":"準備工作","href":"Preparation","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-the-data","type":2,"isActive":false},{"label":"準備嵌入模型","href":"Prepare-the-Embedding-Model","type":2,"isActive":false},{"label":"將資料載入 Milvus","href":"Load-data-into-Milvus","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data","type":2,"isActive":false},{"label":"矢量搜尋中的嵌入可視化","href":"Visualizing-Embeddings-in-Vector-Search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.md b/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.md new file mode 100644 index 000000000..0f771e401 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/vector_visualization.md @@ -0,0 +1,432 @@ +--- +id: vector_visualization.md +summary: 在這個範例中,我們將顯示如何使用 t-SN 將 Milvus 中的 embeddings(向量)可視化。 +title: 向量可視化 +--- +

    向量可視化

    +Open In Colab + + +GitHub Repository +

    +

    在這個範例中,我們將展示如何使用t-SNE 將 Milvus 中的嵌入(向量)可視化。

    +

    減維技術,例如 t-SNE,對於在二維或三維空間可視化複雜的高維資料,同時保留局部結構,是非常有價值的。這有助於模式識別、增強對特徵關係的理解,並方便解釋機器學習模型的結果。此外,t-SNE 還能透過視覺上的聚類結果比較來協助演算法評估,簡化對非專業觀眾的資料呈現,並透過低維表示來降低計算成本。透過這些應用,t-SNE 不僅有助於深入瞭解資料集,還能支援更明智的決策過程。

    +

    準備工作

    依賴與環境

    $ pip install --upgrade pymilvus openai requests tqdm matplotlib seaborn
    +
    +

    在本範例中,我們將使用 OpenAI 的嵌入模型。您應該準備 api key OPENAI_API_KEY 作為環境變數。

    +
    import os
    +
    +os.environ["OPENAI_API_KEY"] = "sk-***********"
    +
    +

    準備資料

    我們使用 MilvusDocumentation 2.4.x中的 FAQ 頁面作為 RAG 中的私有知識,對於簡單的 RAG 管道而言,這是一個很好的資料來源。

    +

    下載 zip 檔案並解壓縮文件到資料夾milvus_docs

    +
    $ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
    +$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
    +
    +

    我們從資料夾milvus_docs/en/faq 載入所有 markdown 檔案。對於每個文件,我們只需簡單地使用「#」來分隔文件中的內容,這樣就可以大致分隔出 markdown 檔案中每個主要部分的內容。

    +
    from glob import glob
    +
    +text_lines = []
    +
    +for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    +    with open(file_path, "r") as file:
    +        file_text = file.read()
    +
    +    text_lines += file_text.split("# ")
    +
    +

    準備嵌入模型

    我們初始化 OpenAI 用戶端以準備嵌入模型。

    +
    from openai import OpenAI
    +
    +openai_client = OpenAI()
    +
    +

    定義一個使用 OpenAI client 產生文字嵌入的函式。我們使用text-embedding-3-large模型作為範例。

    +
    def emb_text(text):
    +    return (
    +        openai_client.embeddings.create(input=text, model="text-embedding-3-large")
    +        .data[0]
    +        .embedding
    +    )
    +
    +

    產生測試嵌入,並列印其尺寸和前幾個元素。

    +
    test_embedding = emb_text("This is a test")
    +embedding_dim = len(test_embedding)
    +print(embedding_dim)
    +print(test_embedding[:10])
    +
    +
    3072
    +[-0.015370666049420834, 0.00234124343842268, -0.01011690590530634, 0.044725317507982254, -0.017235849052667618, -0.02880779094994068, -0.026678944006562233, 0.06816216558218002, -0.011376636102795601, 0.021659553050994873]
    +
    +

    將資料載入 Milvus

    建立集合

    from pymilvus import MilvusClient
    +
    +milvus_client = MilvusClient(uri="./milvus_demo.db")
    +
    +collection_name = "my_rag_collection"
    +
    +
    +

    至於MilvusClient 的參數:

    +
      +
    • uri 設定為本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。
    • +
    • 如果您有大規模的資料,您可以在docker 或 kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器的 uri,例如http://localhost:19530 ,作為您的uri
    • +
    • 如果您想使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,與 Zilliz Cloud 中的Public Endpoint 和 Api key對應。
    • +
    +
    +

    檢查集合是否已經存在,如果已經存在,請將其刪除。

    +
    if milvus_client.has_collection(collection_name):
    +    milvus_client.drop_collection(collection_name)
    +
    +

    使用指定的參數建立新的集合。

    +

    如果我們沒有指定任何欄位資訊,Milvus 會自動建立一個預設的id 欄位做為主索引鍵,以及一個vector 欄位來儲存向量資料。保留的 JSON 欄位用來儲存非結構描述定義的欄位及其值。

    +
    milvus_client.create_collection(
    +    collection_name=collection_name,
    +    dimension=embedding_dim,
    +    metric_type="IP",  # Inner product distance
    +    consistency_level="Strong",  # Strong consistency level
    +)
    +
    +

    插入資料

    遍歷文字行,建立嵌入,然後將資料插入 Milvus。

    +

    這裡有一個新欄位text ,它是集合模式中的非定義欄位。它會自動加入保留的 JSON 動態欄位,在高層次上可視為一般欄位。

    +
    from tqdm import tqdm
    +
    +data = []
    +
    +for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    +    data.append({"id": i, "vector": emb_text(line), "text": line})
    +
    +milvus_client.insert(collection_name=collection_name, data=data)
    +
    +
    Creating embeddings: 100%|██████████| 72/72 [00:20<00:00,  3.60it/s]
    +
    +
    +
    +
    +
    +{'insert_count': 72, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71], 'cost': 0}
    +
    +

    在本節中,我們會執行 milvus 搜尋,然後將查詢向量和擷取的向量一起以縮小的維度可視化。

    +

    擷取查詢資料

    讓我們為搜尋準備一個問題。

    +
    # Modify the question to test it with your own query!
    +
    +question = "How is data stored in Milvus?"
    +
    +

    在資料集中搜尋該問題,並擷取語義上前十名的符合資料。

    +
    search_res = milvus_client.search(
    +    collection_name=collection_name,
    +    data=[
    +        emb_text(question)
    +    ],  # Use the `emb_text` function to convert the question to an embedding vector
    +    limit=10,  # Return top 10 results
    +    search_params={"metric_type": "IP", "params": {}},  # Inner product distance
    +    output_fields=["text"],  # Return the text field
    +)
    +
    +

    讓我們來看看查詢的搜尋結果

    +
    import json
    +
    +retrieved_lines_with_distances = [
    +    (res["entity"]["text"], res["distance"]) for res in search_res[0]
    +]
    +print(json.dumps(retrieved_lines_with_distances, indent=4))
    +
    +
    [
    +    [
    +        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
    +        0.7675539255142212
    +    ],
    +    [
    +        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
    +        0.6210848689079285
    +    ],
    +    [
    +        "Does the query perform in memory? What are incremental data and historical data?\n\nYes. When a query request comes, Milvus searches both incremental data and historical data by loading them into memory. Incremental data are in the growing segments, which are buffered in memory before they reach the threshold to be persisted in storage engine, while historical data are from the sealed segments that are stored in the object storage. Incremental data and historical data together constitute the whole dataset to search.\n\n###",
    +        0.585393488407135
    +    ],
    +    [
    +        "Why is there no vector data in etcd?\n\netcd stores Milvus module metadata; MinIO stores entities.\n\n###",
    +        0.579704999923706
    +    ],
    +    [
    +        "How does Milvus flush data?\n\nMilvus returns success when inserted data are loaded to the message queue. However, the data are not yet flushed to the disk. Then Milvus' data node writes the data in the message queue to persistent storage as incremental logs. If `flush()` is called, the data node is forced to write all data in the message queue to persistent storage immediately.\n\n###",
    +        0.5777501463890076
    +    ],
    +    [
    +        "What is the maximum dataset size Milvus can handle?\n\n  \nTheoretically, the maximum dataset size Milvus can handle is determined by the hardware it is run on, specifically system memory and storage:\n\n- Milvus loads all specified collections and partitions into memory before running queries. Therefore, memory size determines the maximum amount of data Milvus can query.\n- When new entities and and collection-related schema (currently only MinIO is supported for data persistence) are added to Milvus, system storage determines the maximum allowable size of inserted data.\n\n###",
    +        0.5655910968780518
    +    ],
    +    [
    +        "Does Milvus support inserting and searching data simultaneously?\n\nYes. Insert operations and query operations are handled by two separate modules that are mutually independent. From the client\u2019s perspective, an insert operation is complete when the inserted data enters the message queue. However, inserted data are unsearchable until they are loaded to the query node. If the segment size does not reach the index-building threshold (512 MB by default), Milvus resorts to brute-force search and query performance may be diminished.\n\n###",
    +        0.5618637204170227
    +    ],
    +    [
    +        "What data types does Milvus support on the primary key field?\n\nIn current release, Milvus supports both INT64 and string.\n\n###",
    +        0.5561620593070984
    +    ],
    +    [
    +        "Is Milvus available for concurrent search?\n\nYes. For queries on the same collection, Milvus concurrently searches the incremental and historical data. However, queries on different collections are conducted in series. Whereas the historical data can be an extremely huge dataset, searches on the historical data are relatively more time-consuming and essentially performed in series.\n\n###",
    +        0.529681921005249
    +    ],
    +    [
    +        "Can vectors with duplicate primary keys be inserted into Milvus?\n\nYes. Milvus does not check if vector primary keys are duplicates.\n\n###",
    +        0.528809666633606
    +    ]
    +]
    +
    +

    透過 t-SNE 將維度降低為 2-d

    讓我們透過 t-SNE 將嵌入的維度降低為 2-d。我們將使用sklearn 函式庫來執行 t-SNE 轉換。

    +
    import pandas as pd
    +import numpy as np
    +from sklearn.manifold import TSNE
    +
    +data.append({"id": len(data), "vector": emb_text(question), "text": question})
    +embeddings = []
    +for gp in data:
    +    embeddings.append(gp["vector"])
    +
    +X = np.array(embeddings, dtype=np.float32)
    +tsne = TSNE(random_state=0, max_iter=1000)
    +tsne_results = tsne.fit_transform(X)
    +
    +df_tsne = pd.DataFrame(tsne_results, columns=["TSNE1", "TSNE2"])
    +df_tsne
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TSNE1TSNE2
    0-3.8773620.866726
    1-5.9230840.671701
    2-0.6459540.240083
    30.4445821.222875
    46.503896-4.984684
    .........
    696.3540551.264959
    706.0559611.266211
    71-1.5160031.328765
    723.971772-0.681780
    733.971772-0.681780
    +

    74 行 × 2 列

    +
    +

    在 2d 平面上可視化 Milvus 搜尋結果

    我們將以綠色繪製查詢向量,紅色繪製檢索向量,藍色繪製剩餘向量。

    +
    import matplotlib.pyplot as plt
    +import seaborn as sns
    +
    +# Extract similar ids from search results
    +similar_ids = [gp["id"] for gp in search_res[0]]
    +
    +df_norm = df_tsne[:-1]
    +
    +df_query = pd.DataFrame(df_tsne.iloc[-1]).T
    +
    +# Filter points based on similar ids
    +similar_points = df_tsne[df_tsne.index.isin(similar_ids)]
    +
    +# Create the plot
    +fig, ax = plt.subplots(figsize=(8, 6))  # Set figsize
    +
    +# Set the style of the plot
    +sns.set_style("darkgrid", {"grid.color": ".6", "grid.linestyle": ":"})
    +
    +# Plot all points in blue
    +sns.scatterplot(
    +    data=df_tsne, x="TSNE1", y="TSNE2", color="blue", label="All knowledge", ax=ax
    +)
    +
    +# Overlay similar points in red
    +sns.scatterplot(
    +    data=similar_points,
    +    x="TSNE1",
    +    y="TSNE2",
    +    color="red",
    +    label="Similar knowledge",
    +    ax=ax,
    +)
    +
    +sns.scatterplot(
    +    data=df_query, x="TSNE1", y="TSNE2", color="green", label="Query", ax=ax
    +)
    +
    +# Set plot titles and labels
    +plt.title("Scatter plot of knowledge using t-SNE")
    +plt.xlabel("TSNE1")
    +plt.ylabel("TSNE2")
    +
    +# Set axis to be equal
    +plt.axis("equal")
    +
    +# Display the legend
    +plt.legend()
    +
    +# Show the plot
    +plt.show()
    +
    +

    + + png +

    +

    我們可以看到,查詢向量與檢索向量很接近。雖然擷取的向量不在以查詢向量為中心、半徑固定的標準圓內,但我們可以看到它們在 2D 平面上仍然非常接近查詢向量。

    +

    使用降維技術可以促進對向量的理解和疑難排解。希望您能透過本教學對向量有更深入的了解。

    diff --git a/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.json b/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.json new file mode 100644 index 000000000..32886f494 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Video Similarity Search","anchorList":[{"label":"視訊相似性搜尋","href":"Video-Similarity-Search","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.md b/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.md new file mode 100644 index 000000000..a9403ab64 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/tutorials/video_similarity_search.md @@ -0,0 +1,40 @@ +--- +id: video_similarity_search.md +summary: 使用 Milvus 建立視訊相似性搜尋系統。 +title: 視訊相似性搜尋 +--- +

    視訊相似性搜尋

    本教學示範如何使用開源向量資料庫 Milvus 建立視訊相似性搜尋系統。

    + +

    使用的 ML 模型和第三方軟體包括

    +
      +
    • OpenCV
    • +
    • ResNet-50
    • +
    • MySQL
    • +
    • Towhee
    • +
    +


    +

    如今,人們在觀看自己喜歡的電影或影片後,可以輕鬆地截取螢幕畫面,並透過張貼在各種社群網路平台來分享自己的想法。當追隨者看到螢幕截圖時,如果影片名稱沒有在貼文中清楚說明,他們可能真的很難分辨出是哪一部電影。為了找出電影名稱,人們可以利用視訊相似性搜尋系統。透過使用該系統,使用者可以上傳一張圖片,然後獲得包含與上傳圖片相似的關鍵畫面的影片或電影。

    +


    +

    在本教程中,您將學習如何建立視訊相似性搜尋系統。本教學使用 Tumblr 上大約 100 個動畫 gif 來建立系統。不過,您也可以準備自己的視訊資料集。本系統首先使用 OpenCV 擷取影片中的關鍵畫面,然後再使用 ResNet-50 取得每個關鍵畫面的特徵向量。所有向量都會儲存在 Milvus 中並進行搜尋,Milvus 會返回相似向量的 ID。然後將 ID 對應到 MySQL 中儲存的對應視訊。

    +


    +

    + + video_search + videoo_search video_search_demovideo_search_demo

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.json new file mode 100644 index 000000000..df13da8d4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"quick_setup\",​\n dimension=5​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .dimension(5)​\n .build();​\n​\nclient.createCollection(quickSetupReq);​\n​\nGetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(quickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nimport { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"quick_setup\",​\n dimension: 5,​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"dimension\": 5​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","from pymilvus import MilvusClient, DataType​\n​\nCLUSTER_ENDPOINT = \"http://localhost:19530\"​\nTOKEN = \"root:Milvus\"​\n​\n# 1. Set up a Milvus client​\nclient = MilvusClient(​\n uri=CLUSTER_ENDPOINT,​\n token=TOKEN ​\n)​\n​\n# 2. Create a collection in quick setup mode​\nclient.create_collection(​\n collection_name=\"custom_quick_setup\",​\n dimension=5,​\n primary_field_name=\"my_id\",​\n id_type=\"string\",​\n vector_field_name=\"my_vector\",​\n metric_type=\"L2\",​\n auto_id=True,​\n max_length=512​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 2. Create a collection in quick setup mode​\nCreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .dimension(5)​\n .primaryFieldName(\"my_id\")​\n .idType(DataType.VarChar)​\n .maxLength(512)​\n .vectorFieldName(\"my_vector\")​\n .metricType(\"L2\")​\n .autoID(true)​\n .build();​\n​\nclient.createCollection(customQuickSetupReq);​\n​\nGetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nBoolean res = client.getLoadState(customQuickSetupLoadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","// 1. Set up a Milvus Client​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 2. Create a collection in quick setup mode​\nlet res = await client.createCollection({​\n collection_name: \"custom_quick_setup\",​\n dimension: 5,​\n primary_field_name: \"my_id\",​\n id_type: \"Varchar\",​\n max_length: 512,​\n vector_field_name: \"my_vector\",​\n metric_type: \"L2\",​\n auto_id: true​\n}); ​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\",​\n \"dimension\": 5,​\n \"primaryFieldName\": \"my_id\",​\n \"idType\": \"VarChar\",​\n \"vectorFieldName\": \"my_vector\",​\n \"metricType\": \"L2\",​\n \"autoId\": true,​\n \"params\": {​\n \"max_length\": \"512\"​\n }​\n}'​\n\n"],"headingContent":"Create Collection Instantly​","anchorList":[{"label":"立即建立集合","href":"Create-Collection-Instantly​","type":1,"isActive":false},{"label":"概觀","href":"Overview​","type":2,"isActive":false},{"label":"快速設定","href":"Quick-Setup​","type":2,"isActive":false},{"label":"使用自訂欄位快速設定","href":"Quick-Setup-with-Custom-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.md new file mode 100644 index 000000000..e6ca81322 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection-instantly.md @@ -0,0 +1,341 @@ +--- +id: create-collection-instantly.md +title: 立即建立收藏集 +--- +

    立即建立集合

    您可以透過設定名稱和向量場的維度,立即建立一個集合。Milvus 會自動索引向量欄位,並在建立時載入集合。本頁面示範如何使用預設值立即建立集合。

    +

    概觀

    集合是一個二維表,有固定的列和變異的行。每列代表一個欄位,每行代表一個實體。要實現這種結構性資料管理,需要一個模式。每個要插入的實體都必須符合模式中定義的約束。

    +

    AIGC 應用程式通常使用向量資料庫作為知識庫,以管理使用者與大型語言模型 (LLM) 互動期間所產生的資料。這樣的知識庫幾乎大同小異。為了加速 Milvus 叢集在這種情況下的使用,有一種即時方法可供您建立一個只有兩個參數的集合,即集合名稱和向量欄位維度。

    +

    當您使用預設值即時建立集合時,下列設定將會適用。

    +
      +
    • 主要欄位和向量欄位會新增至模式(id向量)。

    • +
    • 主要欄位接受整數並停用AutoId

    • +
    • 向量欄位接受浮動向量嵌入。

    • +
    • AUTOINDEX用於在向量欄位上建立索引。

    • +
    • COSINE用來測量向量嵌入之間的相似性。

    • +
    • 已啟用名為$meta的保留動態欄位,以鍵值對儲存非結構描述定義的欄位及其值。

    • +
    • 該集合會在建立時自動載入。

    • +
    +

    有關上述術語的詳細資訊,請參閱Collection Explained

    +

    值得注意的是,使用預設設定立即建立集合並不適用於所有情況。建議您熟悉常見的集合建立程序,以便更好地瞭解 Milvus 的功能。

    +

    快速設定

    透過這種方式,您只需輸入集合名稱和向量欄位的維度,就能立即建立集合。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="quick_setup",​
    +    dimension=5​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .dimension(5)​
    +        .build();​
    +​
    +client.createCollection(quickSetupReq);​
    +​
    +GetLoadStateReq quickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(quickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "quick_setup",​
    +    dimension: 5,​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "dimension": 5​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    使用自訂欄位快速設定

    如果預設的度量類型、欄位名稱和資料類型不符合您的需求,您可以調整這些設定,如下所示。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +CLUSTER_ENDPOINT = "http://localhost:19530"​
    +TOKEN = "root:Milvus"​
    +​
    +# 1. Set up a Milvus client​
    +client = MilvusClient(​
    +    uri=CLUSTER_ENDPOINT,​
    +    token=TOKEN ​
    +)​
    +​
    +# 2. Create a collection in quick setup mode​
    +client.create_collection(​
    +    collection_name="custom_quick_setup",​
    +    dimension=5,​
    +    primary_field_name="my_id",​
    +    id_type="string",​
    +    vector_field_name="my_vector",​
    +    metric_type="L2",​
    +    auto_id=True,​
    +    max_length=512​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 2. Create a collection in quick setup mode​
    +CreateCollectionReq customQuickSetupReq = CreateCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .dimension(5)​
    +        .primaryFieldName("my_id")​
    +        .idType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .vectorFieldName("my_vector")​
    +        .metricType("L2")​
    +        .autoID(true)​
    +        .build();​
    +​
    +client.createCollection(customQuickSetupReq);​
    +​
    +GetLoadStateReq customQuickSetupLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(customQuickSetupLoadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 1. Set up a Milvus Client​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 2. Create a collection in quick setup mode​
    +let res = await client.createCollection({​
    +    collection_name: "custom_quick_setup",​
    +    dimension: 5,​
    +    primary_field_name: "my_id",​
    +    id_type: "Varchar",​
    +    max_length: 512,​
    +    vector_field_name: "my_vector",​
    +    metric_type: "L2",​
    +    auto_id: true​
    +});  ​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup",​
    +    "dimension": 5,​
    +    "primaryFieldName": "my_id",​
    +    "idType": "VarChar",​
    +    "vectorFieldName": "my_vector",​
    +    "metricType": "L2",​
    +    "autoId": true,​
    +    "params": {​
    +        "max_length": "512"​
    +    }​
    +}'​
    +
    +
    +

    如果使用上述兩種方式建立的集合仍無法滿足您的需求,請考慮遵循「建立集合」中的程序。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.json new file mode 100644 index 000000000..d5afa2b40 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.json @@ -0,0 +1 @@ +{"codeList":["# 3. Create a collection in customized setup mode​\nfrom pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 3.1. Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n​\n# 3.2. Add fields to schema​\nschema.add_field(field_name=\"my_id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"my_vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"my_varchar\", datatype=DataType.VARCHAR, max_length=512)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 3. Create a collection in customized setup mode​\n​\n// 3.1 Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// 3.2 Add fields to schema​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n dim: 5​\n },​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512​\n }​\n]​\n\n","import \"github.com/milvus-io/milvus/client/v2/entity\"​\n​\nschema := entity.NewSchema().WithDynamicFieldEnabled(true).​\n WithField(entity.NewField().WithName(\"my_id\").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​\n WithField(entity.NewField().WithName(\"my_vector\").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​\n WithField(entity.NewField().WithName(\"my_varchar\").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","# 3.3. Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# 3.4. Add indexes​\nindex_params.add_index(​\n field_name=\"my_id\",​\n index_type=\"STL_SORT\"​\n)​\n​\nindex_params.add_index(​\n field_name=\"my_vector\", ​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\n// 3.3 Prepare index parameters​\nIndexParam indexParamForIdField = IndexParam.builder()​\n .fieldName(\"my_id\")​\n .indexType(IndexParam.IndexType.STL_SORT)​\n .build();​\n​\nIndexParam indexParamForVectorField = IndexParam.builder()​\n .fieldName(\"my_vector\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForIdField);​\nindexParams.add(indexParamForVectorField);​\n\n","// 3.2 Prepare index parameters​\nconst index_params = [{​\n field_name: \"my_id\",​\n index_type: \"STL_SORT\"​\n},{​\n field_name: \"my_vector\",​\n index_type: \"AUTOINDEX\",​\n metric_type: \"COSINE\"​\n}]​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n \"github.com/milvus-io/milvus/client/v2/index\"​\n)​\n​\nindexOptions := []client.CreateIndexOption{​\n client.NewCreateIndexOption(collectionName, \"my_vector\", index.NewAutoIndex(entity.COSINE)).WithIndexName(\"my_vector\"),​\n client.NewCreateIndexOption(collectionName, \"my_id\", index.NewSortedIndex()).WithIndexName(\"my_id\"),​\n}​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"my_vector\",​\n \"metricType\": \"COSINE\",​\n \"indexName\": \"my_vector\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"my_id\",​\n \"indexName\": \"my_id\",​\n \"indexType\": \"STL_SORT\"​\n }​\n ]'​\n\n","# 3.5. Create a collection with the index loaded simultaneously​\nclient.create_collection(​\n collection_name=\"customized_setup_1\",​\n schema=schema,​\n index_params=index_params​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n// 3.4 Create a collection with schema and index parameters​\nCreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\n​\nclient.createCollection(customizedSetupReq1);​\n​\n// 3.5 Get load state of the collection​\nGetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq1);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// true​\n\n","// 3.3 Create a collection with fields and index parameters​\nres = await client.createCollection({​\n collection_name: \"customized_setup_1\",​\n fields: fields,​\n index_params: index_params,​\n})​\n​\nconsole.log(res.error_code) ​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_1\", schema).​\n WithIndexOptions(indexOptions...),​\n)​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_1\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# 3.6. Create a collection and index it separately​\nclient.create_collection(​\n collection_name=\"customized_setup_2\",​\n schema=schema,​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 3.6 Create a collection and index it separately​\nCreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .collectionSchema(schema)​\n .build();​\n​\nclient.createCollection(customizedSetupReq2);​\n​\nGetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n ​\nBoolean loaded = client.getLoadState(customSetupLoadStateReq2);​\nSystem.out.println(loaded);​\n​\n// Output:​\n// false​\n\n","// 3.4 Create a collection and index it seperately​\nres = await client.createCollection({​\n collection_name: \"customized_setup_2\",​\n fields: fields,​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_2\", schema))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\",​\n \\\"schema\\\": $schema​\n}\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_2\\\"​\n}\"​\n\n","# With shard number​\nclient.create_collection(​\n collection_name=\"customized_setup_3\",​\n schema=schema,​\n # highlight-next-line​\n num_shards=1​\n)​\n\n","// With shard number​\nCreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_3\")​\n .collectionSchema(collectionSchema)​\n // highlight-next-line​\n .numShards(1)​\n .build();​\nclient.createCollection(customizedSetupReq3);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_3\",​\n schema: schema,​\n // highlight-next-line​\n shards_num: 1​\n}​\n\n","import \"github.com/milvus-io/milvus/client/v2\"​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_3\", schema).WithShardNum(1))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"shardsNum\": 1​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_3\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With mmap​\nclient.create_collection(​\n collection_name=\"customized_setup_4\",​\n schema=schema,​\n # highlight-next-line​\n enable_mmap=False​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With MMap​\nCreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_4\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.MMAP_ENABLED, \"false\")​\n .build();​\nclient.createCollection(customizedSetupReq4);​\n\n","client.create_collection({​\n collection_name: \"customized_setup_4\",​\n schema: schema,​\n properties: {​\n 'mmap.enabled': true,​\n },​\n})​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_4\", schema).WithProperty(common.MmapEnabledKey, true))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","# Currently not available for REST\n\n","# With TTL​\nclient.create_collection(​\n collection_name=\"customized_setup_5\",​\n schema=schema,​\n # highlight-start​\n properties={​\n \"collection.ttl.seconds\": 86400​\n }​\n # highlight-end​\n)​\n\n","import io.milvus.param.Constant;​\n​\n// With TTL​\nCreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_5\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .property(Constant.TTL_SECONDS, \"86400\")​\n .build();​\nclient.createCollection(customizedSetupReq5);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_5\",​\n schema: schema,​\n // highlight-start​\n properties: {​\n \"collection.ttl.seconds\": 86400​\n }​\n // highlight-end​\n}​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\nerr = cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_5\", schema).​\n WithProperty(common.CollectionTTLConfigKey, 86400)) // TTL in seconds​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"ttlSeconds\": 86400​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_5\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# With consistency level​\nclient.create_collection(​\n collection_name=\"customized_setup_6\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Bounded\",​\n)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\n​\n// With consistency level​\nCreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​\n .collectionName(\"customized_setup_6\")​\n .collectionSchema(schema)​\n // highlight-next-line​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nclient.createCollection(customizedSetupReq6);​\n\n","const createCollectionReq = {​\n collection_name: \"customized_setup_6\",​\n schema: schema,​\n // highlight-next​\n consistency_level: \"Bounded\",​\n // highlight-end​\n}​\n​\nclient.createCollection(createCollectionReq);​\n\n","import (​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nerr := cli.CreateCollection(ctx, client.NewCreateCollectionOption(\"customized_setup_6\", schema).​\n WithConsistencyLevel(entity.ClBounded))​\nif err != nil {​\n // handle error​\n}​\nfmt.Println(\"collection created\")​\n\n","export params='{​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"customized_setup_6\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n"],"headingContent":"Create Collection​","anchorList":[{"label":"建立資料集","href":"Create-Collection​","type":1,"isActive":false},{"label":"概觀","href":"Overview​","type":2,"isActive":false},{"label":"建立模式","href":"Create-Schema​","type":2,"isActive":false},{"label":"(可選)設定索引參數","href":"Optional-Set-Index-Parameters​","type":2,"isActive":false},{"label":"建立資料集","href":"Create-Collection​","type":2,"isActive":false},{"label":"設定集合屬性","href":"Set-Collection-Properties​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.md new file mode 100644 index 000000000..94f3944a2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/create-collection.md @@ -0,0 +1,760 @@ +--- +id: create-collection.md +title: 建立資料集 +--- +

    建立資料集

    您可以透過定義模式、索引參數、度量類型,以及是否在建立時載入,來建立集合。本頁面介紹如何從頭開始建立一個集合。

    +

    概觀

    集合是一個二維表,有固定的列和變異的行。每列代表一個欄位,每行代表一個實體。要實現這種結構性資料管理,需要一個模式。要插入的每個實體都必須符合模式中定義的約束。

    +

    您可以決定集合的各個方面,包括其模式、索引參數、度量類型,以及是否在建立時載入,以確保集合完全符合您的需求。

    +

    若要建立資料集,您需要

    + +

    建立模式

    模式定義集合的資料結構。建立資料集時,您需要根據需求設計模式。如需詳細資訊,請參閱Schema Explained

    +

    以下程式碼片段建立一個模式,其中包含啟用的動態欄位和三個必填欄位,分別命名為my_id,my_vector, 和my_varchar

    +
    +

    您可以為任何標量欄位設定預設值,並使其可為空。詳情請參閱Nullable & Default

    +
    + +
    # 3. Create a collection in customized setup mode​
    +from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 3.1. Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +​
    +# 3.2. Add fields to schema​
    +schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 3. Create a collection in customized setup mode​
    +​
    +// 3.1 Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// 3.2 Add fields to schema​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "my_vector",​
    +        data_type: DataType.FloatVector,​
    +        dim: 5​
    +    },​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512​
    +    }​
    +]​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2/entity"​
    +​
    +schema := entity.NewSchema().WithDynamicFieldEnabled(true).​
    +        WithField(entity.NewField().WithName("my_id").WithIsAutoID(true).WithDataType(entity.FieldTypeInt64).WithIsPrimaryKey(true)).​
    +        WithField(entity.NewField().WithName("my_vector").WithDataType(entity.FieldTypeFloatVector).WithDim(5)).​
    +        WithField(entity.NewField().WithName("my_varchar").WithDataType(entity.FieldTypeVarChar).WithMaxLength(512))thDim(5))​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    (可選)設定索引參數

    在特定欄位上建立索引可加速針對該欄位的搜尋。索引會記錄集合中實體的順序。如以下程式碼片段所示,您可以使用metric_typeindex_type 來選擇適當的方式,讓 Milvus 為欄位建立索引,並衡量向量嵌入之間的相似性。

    +

    在 Milvus 中,您可以使用AUTOINDEX 作為所有向量欄位的索引類型,並根據您的需求,使用COSINEL2IP 中的一種作為度量類型。

    +

    如上述程式碼片段所示,您需要同時設定向量欄位的索引類型和公制類型,而標量值欄位則只需設定索引類型。對於向量欄位,索引是必須的,建議您在篩選條件中常用的標量欄位上建立索引。

    +

    如需詳細資訊,請參閱索引

    + +
    # 3.3. Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# 3.4. Add indexes​
    +index_params.add_index(​
    +    field_name="my_id",​
    +    index_type="STL_SORT"​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="my_vector", ​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +// 3.3 Prepare index parameters​
    +IndexParam indexParamForIdField = IndexParam.builder()​
    +        .fieldName("my_id")​
    +        .indexType(IndexParam.IndexType.STL_SORT)​
    +        .build();​
    +​
    +IndexParam indexParamForVectorField = IndexParam.builder()​
    +        .fieldName("my_vector")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForIdField);​
    +indexParams.add(indexParamForVectorField);​
    +
    +
    +
    // 3.2 Prepare index parameters​
    +const index_params = [{​
    +    field_name: "my_id",​
    +    index_type: "STL_SORT"​
    +},{​
    +    field_name: "my_vector",​
    +    index_type: "AUTOINDEX",​
    +    metric_type: "COSINE"​
    +}]​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +    "github.com/milvus-io/milvus/client/v2/index"​
    +)​
    +​
    +indexOptions := []client.CreateIndexOption{​
    +    client.NewCreateIndexOption(collectionName, "my_vector", index.NewAutoIndex(entity.COSINE)).WithIndexName("my_vector"),​
    +    client.NewCreateIndexOption(collectionName, "my_id", index.NewSortedIndex()).WithIndexName("my_id"),​
    +}​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "my_vector",​
    +            "metricType": "COSINE",​
    +            "indexName": "my_vector",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "my_id",​
    +            "indexName": "my_id",​
    +            "indexType": "STL_SORT"​
    +        }​
    +    ]'​
    +
    +
    +

    建立集合

    如果您已經用索引參數建立了一個集合,Milvus 會在建立集合時自動載入。在這種情況下,索引參數中提到的所有欄位都會被索引。

    +

    以下程式碼片段示範如何以索引參數建立集合,並檢查其載入狀態。

    + +
    # 3.5. Create a collection with the index loaded simultaneously​
    +client.create_collection(​
    +    collection_name="customized_setup_1",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +// 3.4 Create a collection with schema and index parameters​
    +CreateCollectionReq customizedSetupReq1 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +​
    +client.createCollection(customizedSetupReq1);​
    +​
    +// 3.5 Get load state of the collection​
    +GetLoadStateReq customSetupLoadStateReq1 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq1);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    // 3.3 Create a collection with fields and index parameters​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_1",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +​
    +console.log(res.error_code)  ​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_1", schema).​
    +    WithIndexOptions(indexOptions...),​
    +)​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_1\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    您也可以先建立一個沒有索引參數的集合,然後再加入索引參數。在這種情況下,Milvus 在建立集合時不會載入。有關如何為現有的集合建立索引的詳細資訊,請參考Index Explained

    +

    以下程式碼片段示範如何在沒有索引的情況下建立集合,且集合的載入狀態在建立時仍保持未載入狀態。

    + +
    # 3.6. Create a collection and index it separately​
    +client.create_collection(​
    +    collection_name="customized_setup_2",​
    +    schema=schema,​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    // 3.6 Create a collection and index it separately​
    +CreateCollectionReq customizedSetupReq2 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .collectionSchema(schema)​
    +    .build();​
    +​
    +client.createCollection(customizedSetupReq2);​
    +​
    +GetLoadStateReq customSetupLoadStateReq2 = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +        ​
    +Boolean loaded = client.getLoadState(customSetupLoadStateReq2);​
    +System.out.println(loaded);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 3.4 Create a collection and index it seperately​
    +res = await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    fields: fields,​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_2", schema))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\",​
    +    \"schema\": $schema​
    +}"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_2\"​
    +}"​
    +
    +
    +

    Milvus 也提供了一個方法讓你立即建立一個集合。詳情請參閱立即建立集合

    +

    設定集合屬性

    你可以為要建立的集合設定屬性,使它適合你的服務。適用的屬性如下。

    +

    設定分片編號

    分片是集合的水平切片。每個分片對應一個資料輸入通道。每個集合預設都有一個分片。您可以在建立資料集時,根據預期的吞吐量和要插入資料集的資料量,設定適當的分片數量。

    +

    在一般情況下,每當預期吞吐量增加 500 MB/秒或要插入的資料量增加 100 GB 時,就考慮增加一個分片。此建議是基於我們自己的經驗,可能不完全符合您的應用程式情境。您可以調整此數字以符合自己的需求,或直接使用預設值。

    +

    以下程式碼片段示範如何在建立集合時設定 Shard 編號。

    + +
    # With shard number​
    +client.create_collection(​
    +    collection_name="customized_setup_3",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_shards=1​
    +)​
    +
    +
    +
    // With shard number​
    +CreateCollectionReq customizedSetupReq3 = CreateCollectionReq.builder()​
    +    .collectionName("customized_setup_3")​
    +    .collectionSchema(collectionSchema)​
    +    // highlight-next-line​
    +    .numShards(1)​
    +    .build();​
    +client.createCollection(customizedSetupReq3);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_3",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    shards_num: 1​
    +}​
    +
    +
    +
    import "github.com/milvus-io/milvus/client/v2"​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_3", schema).WithShardNum(1))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "shardsNum": 1​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_3\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    啟用 mmap

    Milvus 在所有集合上預設啟用 mmap,允許 Milvus 將原始欄位資料映射到記憶體,而不是完全載入它們。這可減少記憶體佔用量並增加集合容量。有關 mmap 的詳細資訊,請參閱使用 mmap

    + +
    # With mmap​
    +client.create_collection(​
    +    collection_name="customized_setup_4",​
    +    schema=schema,​
    +    # highlight-next-line​
    +    enable_mmap=False​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With MMap​
    +CreateCollectionReq customizedSetupReq4 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_4")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.MMAP_ENABLED, "false")​
    +        .build();​
    +client.createCollection(customizedSetupReq4);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "customized_setup_4",​
    +    schema: schema,​
    +     properties: {​
    +        'mmap.enabled': true,​
    +     },​
    +})​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_4", schema).WithProperty(common.MmapEnabledKey, true))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    # Currently not available for REST
    +
    +
    +

    設定集合 TTL

    如果一個資料集需要在一段特定時間內丟棄,請考慮設定它的 Time-To-Live (TTL),單位為秒。一旦 TTL 超時,Milvus 就會刪除集合中的實體,並丟棄集合。刪除是異步的,表示在刪除完成之前,仍可進行搜尋與查詢。

    +

    以下程式碼片段將 TTL 設定為一天 (86400 秒)。建議您至少將 TTL 設定為幾天。

    + +
    # With TTL​
    +client.create_collection(​
    +    collection_name="customized_setup_5",​
    +    schema=schema,​
    +    # highlight-start​
    +    properties={​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.param.Constant;​
    +​
    +// With TTL​
    +CreateCollectionReq customizedSetupReq5 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_5")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .property(Constant.TTL_SECONDS, "86400")​
    +        .build();​
    +client.createCollection(customizedSetupReq5);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_5",​
    +    schema: schema,​
    +    // highlight-start​
    +    properties: {​
    +        "collection.ttl.seconds": 86400​
    +    }​
    +    // highlight-end​
    +}​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +err = cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_5", schema).​
    +        WithProperty(common.CollectionTTLConfigKey, 86400)) //  TTL in seconds​
    +if err != nil {​
    +        // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "ttlSeconds": 86400​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_5\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    設定一致性等級

    建立資料集時,您可以設定資料集中搜尋與查詢的一致性等級。您也可以在特定搜尋或查詢時變更集合的一致性層級。

    + +
    # With consistency level​
    +client.create_collection(​
    +    collection_name="customized_setup_6",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Bounded",​
    +)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +​
    +// With consistency level​
    +CreateCollectionReq customizedSetupReq6 = CreateCollectionReq.builder()​
    +        .collectionName("customized_setup_6")​
    +        .collectionSchema(schema)​
    +        // highlight-next-line​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +client.createCollection(customizedSetupReq6);​
    +
    +
    +
    const createCollectionReq = {​
    +    collection_name: "customized_setup_6",​
    +    schema: schema,​
    +    // highlight-next​
    +    consistency_level: "Bounded",​
    +    // highlight-end​
    +}​
    +​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import (​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +err := cli.CreateCollection(ctx, client.NewCreateCollectionOption("customized_setup_6", schema).​
    +    WithConsistencyLevel(entity.ClBounded))​
    +if err != nil {​
    +    // handle error​
    +}​
    +fmt.Println("collection created")​
    +
    +
    +
    export params='{​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"customized_setup_6\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    有關一致性層級的更多資訊,請參閱一致性層級。

    +

    啟用動態欄位

    集合中的動態欄位是一個保留的 JavaScript Object Notation (JSON) 欄位,名為$meta。一旦啟用這個欄位,Milvus 會將每個實體中所有非模式定義的欄位及其值儲存為保留欄位中的鍵值對。

    +

    有關如何使用動態欄位的詳細資訊,請參閱動態欄位。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.json new file mode 100644 index 000000000..b5503399e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.drop_collection(​\n collection_name=\"customized_setup_2\"​\n)​\n\n","import io.milvus.v2.service.collection.request.DropCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nDropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nclient.dropCollection(dropQuickSetupParam);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 10. Drop the collection​\nres = await client.dropCollection({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.DropCollection(ctx, client.NewDropCollectionOption(\"customized_setup_2\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Drop Collection​","anchorList":[{"label":"刪除收藏","href":"Drop-Collection​","type":1,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.md new file mode 100644 index 000000000..a8dc123fe --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/drop-collection.md @@ -0,0 +1,138 @@ +--- +id: drop-collection.md +title: 刪除收藏 +--- +

    刪除收藏

    如果不再需要某個收藏集,您可以將其刪除。

    +

    範例

    以下程式碼片段假設您有一個名為customized_setup_2 的集合。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.drop_collection(​
    +    collection_name="customized_setup_2"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DropCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +DropCollectionReq dropQuickSetupParam = DropCollectionReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +client.dropCollection(dropQuickSetupParam);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 10. Drop the collection​
    +res = await client.dropCollection({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.DropCollection(ctx, client.NewDropCollectionOption("customized_setup_2"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.json new file mode 100644 index 000000000..e31921406 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 7. Load the collection​\nclient.load_collection(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.LoadCollectionReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// true​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Load the collection​\nres = await client.loadCollection({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\ndefer cli.Close(ctx)​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.load_collection(​\n collection_name=\"customized_setup_1\",​\n # highlight-next-line​\n load_fields=[\"my_id\", \"my_vector\"] # Load only the specified fields​\n skip_load_dynamic_field=True # Skip loading the dynamic field​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","// 6. Load the collection​\nLoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .loadFields(Arrays.asList(\"my_id\", \"my_vector\"))​\n .build();​\n​\nclient.loadCollection(loadCollectionReq);​\n​\n// 7. Get load state of the collection​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n\n","await client.load_collection({​\n collection_name: \"customized_setup_1\",​\n load_fields: [\"my_id\", \"my_vector\"], // Load only the specified fields​\n skip_load_dynamic_field: true //Skip loading the dynamic field​\n});​\n​\nconst loadState = client.getCollectionLoadState({​\n collection_name: \"customized_setup_1\",​\n})​\n​\nconsole.log(loadState);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nloadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption(\"customized_setup_1\").​\n WithLoadFields(\"my_id\", \"my_vector\"))​\nif err != nil {​\n // handle error​\n}​\n​\n// sync wait collection to be loaded​\nerr = loadTask.Await(ctx)​\nif err != nil {​\n // handle error​\n}​\n\n","# REST 缺失​\n\n","# 8. Release the collection​\nclient.release_collection(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"custom_quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​\n​\n​\n// 8. Release the collection​\nReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\n​\nclient.releaseCollection(releaseCollectionReq);​\n​\nGetLoadStateReq loadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"custom_quick_setup\")​\n .build();​\nBoolean res = client.getLoadState(loadStateReq);​\nSystem.out.println(res);​\n​\n// Output:​\n// false​\n\n","// 8. Release the collection​\nres = await client.releaseCollection({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.getLoadState({​\n collection_name: \"custom_quick_setup\"​\n})​\n​\nconsole.log(res.state)​\n​\n// Output​\n// ​\n// LoadStateNotLoad​\n// ​\n\n","import (​\n \"context\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nerr := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption(\"custom_quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"custom_quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n"],"headingContent":"Load & Release​","anchorList":[{"label":"載入與釋放","href":"Load--Release​","type":1,"isActive":false},{"label":"載入資料集","href":"Load-Collection​","type":2,"isActive":false},{"label":"載入特定欄位","href":"Load-Specific-Fields​","type":2,"isActive":false},{"label":"釋放集合","href":"Release-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.md new file mode 100644 index 000000000..7db31ccac --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/load-and-release.md @@ -0,0 +1,411 @@ +--- +id: load-and-release.md +title: 載入與釋放 +--- +

    載入與釋放

    載入資料集是在資料集中進行相似性檢索和查詢的先決條件。本頁重點介紹載入和釋放集合的程序。

    +

    載入資料集

    當你載入一個資料集時,Milvus 將索引檔案和所有欄位的原始資料載入記憶體,以便快速回應搜尋和查詢。在集合載入後插入的實體會被自動索引和載入。

    +

    以下程式碼片段示範如何載入集合。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 7. Load the collection​
    +client.load_collection(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.LoadCollectionReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Load the collection​
    +res = await client.loadCollection({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +defer cli.Close(ctx)​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    載入特定欄位

    Milvus 可以只載入搜尋和查詢所涉及的欄位,以減少記憶體使用量並改善搜尋效能。

    +

    下面的程式碼片段假設您建立了一個名為customized_setup_2 的集合,集合中有兩個名為my_idmy_vector的欄位。

    + +
    client.load_collection(​
    +    collection_name="customized_setup_1",​
    +    # highlight-next-line​
    +    load_fields=["my_id", "my_vector"] # Load only the specified fields​
    +    skip_load_dynamic_field=True # Skip loading the dynamic field​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    // 6. Load the collection​
    +LoadCollectionReq loadCollectionReq = LoadCollectionReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .loadFields(Arrays.asList("my_id", "my_vector"))​
    +        .build();​
    +​
    +client.loadCollection(loadCollectionReq);​
    +​
    +// 7. Get load state of the collection​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +
    +
    +
    await client.load_collection({​
    +  collection_name: "customized_setup_1",​
    +  load_fields: ["my_id", "my_vector"], // Load only the specified fields​
    +  skip_load_dynamic_field: true //Skip loading the dynamic field​
    +});​
    +​
    +const loadState = client.getCollectionLoadState({​
    +    collection_name: "customized_setup_1",​
    +})​
    +​
    +console.log(loadState);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +loadTask, err := cli.LoadCollection(ctx, client.NewLoadCollectionOption("customized_setup_1").​
    +    WithLoadFields("my_id", "my_vector"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +// sync wait collection to be loaded​
    +err = loadTask.Await(ctx)​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # REST 缺失​
    +
    +
    +

    如果您選擇載入特定欄位,值得注意的是,只有包含在load_fields 中的欄位才能在搜尋和查詢中作為篩選器和輸出欄位使用。您應該始終在load_fields 中包含主要欄位和至少一個向量欄位的名稱。

    +

    您也可以使用skip_load_dynamic_field 來決定是否載入動態欄位。動態欄位是一個保留的 JSON 欄位,名為$meta,並將所有非模式定義的欄位及其值儲存在鍵值對中。載入動態欄位時,欄位中的所有鍵都會載入,並可用於篩選和輸出。如果動態欄位中的所有鍵都不參與元資料篩選和輸出,請將skip_load_dynamic_field 設為True

    +

    若要在集合載入後載入更多欄位,需要先釋放集合,以避免因索引變更而提示可能的錯誤。

    +

    釋放集合

    搜尋和查詢是記憶體密集的作業。為了節省成本,建議您釋放目前不使用的集合。

    +

    以下程式碼片段示範如何釋放集合。

    + +
    # 8. Release the collection​
    +client.release_collection(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="custom_quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoad>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.collection.request.ReleaseCollectionReq;​
    +​
    +​
    +// 8. Release the collection​
    +ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +​
    +client.releaseCollection(releaseCollectionReq);​
    +​
    +GetLoadStateReq loadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("custom_quick_setup")​
    +        .build();​
    +Boolean res = client.getLoadState(loadStateReq);​
    +System.out.println(res);​
    +​
    +// Output:​
    +// false​
    +
    +
    +
    // 8. Release the collection​
    +res = await client.releaseCollection({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "custom_quick_setup"​
    +})​
    +​
    +console.log(res.state)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoad​
    +// ​
    +
    +
    +
    import (​
    +    "context"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +err := cli.ReleaseCollection(ctx, client.NewReleaseCollectionOption("custom_quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "custom_quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.json new file mode 100644 index 000000000..d6d041208 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 9. Manage aliases​\n# 9.1. Create aliases​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"bob\"​\n)​\n​\nclient.create_alias(​\n collection_name=\"customized_setup_2\",​\n alias=\"alice\"​\n)​\n\n","import io.milvus.v2.service.utility.request.CreateAliasReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\n// 9. Manage aliases​\n​\n// 9.1 Create alias​\nCreateAliasReq createAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"bob\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n​\ncreateAliasReq = CreateAliasReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.createAlias(createAliasReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 9. Manage aliases​\n// 9.1 Create aliases​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.createAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_2\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n\n","# 9.2. List aliases​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\",​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.ListAliasesReq;​\nimport io.milvus.v2.service.utility.response.ListAliasResp;​\n​\n// 9.2 List alises​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob, alice]​\n\n","// 9.2 List aliases​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob', 'alice' ]​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"bob\",​\n# \"alice\"​\n# ]​\n# }​\n\n","# 9.3. Describe aliases​\nres = client.describe_alias(​\n alias=\"bob\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"alias\": \"bob\",​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.DescribeAliasReq;​\nimport io.milvus.v2.service.utility.response.DescribeAliasResp;​\n​\n// 9.3 Describe alias​\nDescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​\n .alias(\"bob\")​\n .build();​\n​\nDescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​\n​\nSystem.out.println(describeAliasRes);​\n​\n// Output:​\n// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​\n\n","// 9.3 Describe aliases​\nres = await client.describeAlias({​\n collection_name: \"customized_setup_2\",​\n alias: \"bob\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// {​\n// status: {​\n// extra_info: {},​\n// error_code: 'Success',​\n// reason: '',​\n// code: 0,​\n// retriable: false,​\n// detail: ''​\n// },​\n// db_name: 'default',​\n// alias: 'bob',​\n// collection: 'customized_setup_2'​\n// }​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n","# 9.4 Reassign aliases to other collections​\nclient.alter_alias(​\n collection_name=\"customized_setup_1\",​\n alias=\"alice\"​\n)​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_1\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"alice\"​\n# ],​\n# \"collection_name\": \"customized_setup_1\",​\n# \"db_name\": \"default\"​\n# }​\n​\nres = client.list_aliases(​\n collection_name=\"customized_setup_2\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"aliases\": [​\n# \"bob\"​\n# ],​\n# \"collection_name\": \"customized_setup_2\",​\n# \"db_name\": \"default\"​\n# }​\n\n","import io.milvus.v2.service.utility.request.AlterAliasReq;​\n​\n// 9.4 Reassign alias to other collections​\nAlterAliasReq alterAliasReq = AlterAliasReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .alias(\"alice\")​\n .build();​\n​\nclient.alterAlias(alterAliasReq);​\n​\nListAliasesReq listAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_1\")​\n .build();​\n​\nListAliasResp listAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\nlistAliasesReq = ListAliasesReq.builder()​\n .collectionName(\"customized_setup_2\")​\n .build();​\n​\nlistAliasRes = client.listAliases(listAliasesReq);​\n​\nSystem.out.println(listAliasRes.getAlias());​\n​\n// Output:​\n// [bob]​\n\n","// 9.4 Reassign aliases to other collections​\nres = await client.alterAlias({​\n collection_name: \"customized_setup_1\",​\n alias: \"alice\"​\n})​\n​\nconsole.log(res.error_code)​\n​\n// Output​\n// ​\n// Success​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_1\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'alice' ]​\n// ​\n​\nres = await client.listAliases({​\n collection_name: \"customized_setup_2\"​\n})​\n​\nconsole.log(res.aliases)​\n​\n// Output​\n// ​\n// [ 'bob' ]​\n// ​\n​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\",​\n \"collectionName\": \"customized_setup_1\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"bob\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"bob\",​\n# \"collectionName\": \"customized_setup_2\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"aliasName\": \"alice\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"aliasName\": \"alice\",​\n# \"collectionName\": \"customized_setup_1\",​\n# \"dbName\": \"default\"​\n# }​\n# }​\n\n"],"headingContent":"Manage Aliases​","anchorList":[{"label":"管理別名","href":"Manage-Aliases​","type":1,"isActive":false},{"label":"總覽","href":"Overview​","type":2,"isActive":false},{"label":"建立別名","href":"Create-Alias​","type":2,"isActive":false},{"label":"列出別名","href":"List-Aliases​","type":2,"isActive":false},{"label":"描述別名","href":"Describe-Alias​","type":2,"isActive":false},{"label":"更改別名","href":"Alter-Alias​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.md new file mode 100644 index 000000000..138811176 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-aliases.md @@ -0,0 +1,542 @@ +--- +id: manage-aliases.md +title: 管理別名 +--- +

    管理別名

    Milvus 提供別名管理功能。本頁面展示了建立、列出、更改和刪除別名的步驟。

    +

    總覽

    您可以為您的集合建立別名。一個集合可以有多個別名,但集合不能共用一個別名。

    +

    當收到針對集合的請求時,Milvus 會根據提供的名稱找到集合。如果所提供名稱的集合不存在,Milvus 會繼續定位所提供名稱的別名。您可以使用集合別名來使您的程式碼適應不同的情況。

    +

    建立別名

    以下程式碼片段示範如何為集合建立別名。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 9. Manage aliases​
    +# 9.1. Create aliases​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="bob"​
    +)​
    +​
    +client.create_alias(​
    +    collection_name="customized_setup_2",​
    +    alias="alice"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.utility.request.CreateAliasReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +// 9. Manage aliases​
    +​
    +// 9.1 Create alias​
    +CreateAliasReq createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("bob")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +​
    +createAliasReq = CreateAliasReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.createAlias(createAliasReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 9. Manage aliases​
    +// 9.1 Create aliases​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.createAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_2"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    +

    列出別名

    以下程式碼片段示範如何列出分配給特定集合的別名。

    + +
    # 9.2. List aliases​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob",​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.ListAliasesReq;​
    +import io.milvus.v2.service.utility.response.ListAliasResp;​
    +​
    +// 9.2 List alises​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +    .collectionName("customized_setup_2")​
    +    .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob, alice]​
    +
    +
    +
    // 9.2 List aliases​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob', 'alice' ]​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "bob",​
    +#         "alice"​
    +#     ]​
    +# }​
    +
    +
    +

    描述別名

    以下程式碼片段詳細描述特定別名,包括已分配給該別名的集合名稱。

    + +
    # 9.3. Describe aliases​
    +res = client.describe_alias(​
    +    alias="bob"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "alias": "bob",​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.DescribeAliasReq;​
    +import io.milvus.v2.service.utility.response.DescribeAliasResp;​
    +​
    +// 9.3 Describe alias​
    +DescribeAliasReq describeAliasReq = DescribeAliasReq.builder()​
    +    .alias("bob")​
    +    .build();​
    +​
    +DescribeAliasResp describeAliasRes = client.describeAlias(describeAliasReq);​
    +​
    +System.out.println(describeAliasRes);​
    +​
    +// Output:​
    +// DescribeAliasResp(collectionName=customized_setup_2, alias=bob)​
    +
    +
    +
    // 9.3 Describe aliases​
    +res = await client.describeAlias({​
    +    collection_name: "customized_setup_2",​
    +    alias: "bob"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// {​
    +//   status: {​
    +//     extra_info: {},​
    +//     error_code: 'Success',​
    +//     reason: '',​
    +//     code: 0,​
    +//     retriable: false,​
    +//     detail: ''​
    +//   },​
    +//   db_name: 'default',​
    +//   alias: 'bob',​
    +//   collection: 'customized_setup_2'​
    +// }​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    +

    更改別名

    您可以將已分配給特定集合的別名重新分配給其他集合。

    + +
    # 9.4 Reassign aliases to other collections​
    +client.alter_alias(​
    +    collection_name="customized_setup_1",​
    +    alias="alice"​
    +)​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_1"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "alice"​
    +#     ],​
    +#     "collection_name": "customized_setup_1",​
    +#     "db_name": "default"​
    +# }​
    +​
    +res = client.list_aliases(​
    +    collection_name="customized_setup_2"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "aliases": [​
    +#         "bob"​
    +#     ],​
    +#     "collection_name": "customized_setup_2",​
    +#     "db_name": "default"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.utility.request.AlterAliasReq;​
    +​
    +// 9.4 Reassign alias to other collections​
    +AlterAliasReq alterAliasReq = AlterAliasReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .alias("alice")​
    +        .build();​
    +​
    +client.alterAlias(alterAliasReq);​
    +​
    +ListAliasesReq listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_1")​
    +        .build();​
    +​
    +ListAliasResp listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +listAliasesReq = ListAliasesReq.builder()​
    +        .collectionName("customized_setup_2")​
    +        .build();​
    +​
    +listAliasRes = client.listAliases(listAliasesReq);​
    +​
    +System.out.println(listAliasRes.getAlias());​
    +​
    +// Output:​
    +// [bob]​
    +
    +
    +
    // 9.4 Reassign aliases to other collections​
    +res = await client.alterAlias({​
    +    collection_name: "customized_setup_1",​
    +    alias: "alice"​
    +})​
    +​
    +console.log(res.error_code)​
    +​
    +// Output​
    +// ​
    +// Success​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_1"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'alice' ]​
    +// ​
    +​
    +res = await client.listAliases({​
    +    collection_name: "customized_setup_2"​
    +})​
    +​
    +console.log(res.aliases)​
    +​
    +// Output​
    +// ​
    +// [ 'bob' ]​
    +// ​
    +​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/alter" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice",​
    +    "collectionName": "customized_setup_1"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "bob"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "bob",​
    +#         "collectionName": "customized_setup_2",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/aliases/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "aliasName": "alice"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "aliasName": "alice",​
    +#         "collectionName": "customized_setup_1",​
    +#         "dbName": "default"​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.json new file mode 100644 index 000000000..9d25cde7b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Collection Explained​","anchorList":[{"label":"集合說明","href":"Collection-Explained​","type":1,"isActive":false},{"label":"集合","href":"Collection​","type":2,"isActive":false},{"label":"模式與欄位","href":"Schema-and-Fields​","type":2,"isActive":false},{"label":"主鍵和 AutoId","href":"Primary-key-and-AutoId​","type":2,"isActive":false},{"label":"索引","href":"Index​","type":2,"isActive":false},{"label":"實體","href":"Entity​","type":2,"isActive":false},{"label":"載入和釋放","href":"Load-and-Release​","type":2,"isActive":false},{"label":"搜尋和查詢","href":"Search-and-Query​","type":2,"isActive":false},{"label":"分區","href":"Partition​","type":2,"isActive":false},{"label":"分區","href":"Shard​","type":2,"isActive":false},{"label":"別名","href":"Alias​","type":2,"isActive":false},{"label":"函數","href":"Function​","type":2,"isActive":false},{"label":"一致性層級","href":"Consistency-Level​","type":2,"isActive":false},{"label":"限制","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.md new file mode 100644 index 000000000..9573e7365 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-collections.md @@ -0,0 +1,272 @@ +--- +id: manage-collections.md +title: 集合說明 +--- +

    集合說明

    在 Milvus 中,您可以創建多個集合來管理您的資料,並將您的資料作為實體插入到集合中。集合和實體類似於關係數據庫中的表格和記錄。本頁幫助你了解集合和相關概念。

    +

    集合

    集合是具有固定欄位和變異行的二維表。每列代表一個欄位,每行代表一個實體。

    +

    下圖顯示一個有八列和六個實體的集合。

    +

    + + Collection explained + 集合說明

    +

    模式與欄位

    描述物件時,我們通常會提到物件的屬性,例如大小、重量和位置。您可以在集合中使用這些屬性作為欄位。每個欄位都有各種限制屬性,例如向量欄位的資料類型和維度。您可以透過建立欄位和定義其順序來形成集合模式。有關可能適用的資料類型,請參閱Schema Explained

    +

    您應該在要插入的實體中包含所有模式定義的欄位。若要使其中一些欄位成為選項,請考慮

    +
      +
    • 使其為空或設定預設值

      +

      有關如何使欄位為空或設定預設值的詳細資訊,請參閱Nullable & Default

    • +
    • 啟用動態欄位

      +

      有關如何啟用和使用動態欄位的詳細資訊,請參閱動態欄位

    • +
    +

    主鍵和 AutoId

    類似於關聯式資料庫中的主欄位,一個集合有一個主欄位,用來區分一個實體與其他實體。主欄位中的每個值都是全局唯一的,並對應一個特定的實體。

    +

    如上圖所示,名為id的欄位為主要欄位,第一個 ID0對應一個名為The Mortality Rate of Coronavirus is Not Important 的實體。不會有任何其他實體的主要欄位為 0。

    +

    主欄位只接受整數或字串。插入實體時,預設應包含主要欄位值。但是,如果您在創建集合時啟用了AutoId,Milvus 會在插入資料時產生這些值。在這種情況下,從要插入的實體中排除主字段值。

    +

    如需更多資訊,請參閱Primary Field & AutoID

    +

    索引

    在特定欄位上建立索引可提高搜尋效率。建議您為服務所依賴的所有欄位建立索引,其中向量欄位的索引是強制性的。

    +

    實體

    實體是在集合中共用相同欄位集的資料記錄。同一行中所有欄位的值組成一個實體。

    +

    您可以根據需要在集合中插入任意數量的實體。但是,隨著實體數量的增加,其所佔用的記憶體大小也會增加,從而影響搜尋效能。

    +

    如需詳細資訊,請參閱Schema Explained

    +

    載入和釋放

    載入一個集合是在集合中進行相似性搜索和查詢的先決條件。當你載入一個資料集時,Milvus 會將所有索引檔案和每個欄位的原始資料載入記憶體,以便快速回應搜尋和查詢。

    +

    搜尋和查詢是需要大量記憶體的作業。為了節省成本,建議您釋放目前不使用的資料集。

    +

    如需詳細資訊,請參閱載入與釋放

    +

    搜尋和查詢

    建立索引並載入資料庫後,您可以輸入一個或多個查詢向量,開始相似性搜尋。舉例來說,當接收到搜尋要求中攜帶的查詢向量表達時,Milvus 會使用指定的度量類型來測量查詢向量與目標資料集中的相似度,然後再回傳那些與查詢語意相似的向量。

    +

    您也可以在搜尋與查詢中加入 metadata 過濾,以改善結果的相關性。請注意,元資料篩選條件在查詢中是強制性的,但在搜尋中是選擇性的。

    +

    如需適用公制類型的詳細資訊,請參閱公制類型

    +

    有關搜尋和查詢的詳細資訊,請參閱「搜尋與重新排名」章節中的文章,其中的基本功能如下。

    + +

    此外,Milvus 也提供增強功能來改善搜尋效能與效率。這些功能預設為停用,您可以根據服務需求啟用和使用它們。它們是

    + +

    分區

    分區是集合的子集,與其父集合共用相同的欄位集,每個分區包含一個實體子集。

    +

    透過將實體分配到不同的分區,您可以建立實體群組。您可以在特定分區中進行搜尋和查詢,讓 Milvus 忽略其他分區中的實體,並提高搜尋效率。

    +

    如需詳細資訊,請參閱管理分區

    +

    分區

    分片是一個集合的水平切片。每個分片對應一個資料輸入通道。每個集合預設都有一個分區。您可以根據預期的吞吐量和要插入到資料集中的資料量,在建立資料集中時設定適當的分片數量。

    +

    有關如何設定分片數量的詳細資訊,請參閱建立集合

    +

    別名

    您可以為集合建立別名。一個資料集可以有多個別名,但資料集不能共用一個別名。當收到針對集合的請求時,Milvus 會根據所提供的名稱找到集合。如果所提供名稱的集合不存在,Milvus 會繼續定位所提供名稱的別名。您可以使用集合別名來使您的程式碼適應不同的情況。

    +

    如需詳細資訊,請參閱管理別名

    +

    函數

    您可以為 Milvus 設定函式,以便在建立集合時衍生欄位。例如,全文檢索函式使用使用者定義的函式,從特定的 varchar 欄位推導出稀疏向量欄位。有關全文檢索的詳細資訊,請參閱全文檢索

    +

    一致性層級

    分散式資料庫系統通常使用一致性層級來定義資料節點和複製本之間的資料相同性。您可以在建立資料集或在資料集中進行相似性搜尋時,設定不同的一致性層級。適用的一致性層級包括有限制的僵化會話最終

    +

    有關這些一致性層級的詳細資訊,請參閱一致性層級。

    +

    限制

    有關集合的限制,請參閱限制

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.json new file mode 100644 index 000000000..f4e292023 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.ListPartitionsReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport java.util.*;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nlet res = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res);​\n​\n// Output​\n// [\"_default\"]​\n\n","import (​\n \"context\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvucclient\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n // handle error​\n}​\n​\ndefer cli.Close(ctx)​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n","client.create_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# [\"_default\", \"partitionA\"]​\n\n","import io.milvus.v2.service.partition.request.CreatePartitionReq;​\n​\nCreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.createPartition(createPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default, partitionA]​\n\n","await client.createPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","import (​\n \"fmt\"​\n ​\n client \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nerr = cli.CreatePartition(ctx, client.NewCreatePartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\npartitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(partitionNames)​\n// Output​\n// [\"_default\", \"partitionA\"]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\",​\n# \"partitionA\"​\n# ]​\n# }​\n\n","res = client.has_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# True​\n\n","import io.milvus.v2.service.partition.request.HasPartitionReq;​\n​\nHasPartitionReq hasPartitionReq = HasPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean hasPartitionRes = client.hasPartition(hasPartitionReq);​\nSystem.out.println(hasPartitionRes);​\n​\n// Output:​\n// true​\n\n","res = await client.hasPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.value)​\n​\n// Output​\n// true​\n\n","import (​\n \"fmt\"​\n ​\n \"github.com/milvus-io/milvus/client/v2/milvusclient\"​\n)​\n​\nresult, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption(\"quick_setup\", \"partitionA\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(result)​\n​\n// Output:​\n// true​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"has\": true​\n# }​\n# }​\n\n","client.load_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.LoadPartitionsReq;​\nimport io.milvus.v2.service.collection.request.GetLoadStateReq;​\n​\n​\nLoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.loadPartitions(loadPartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// True​\n\n","await client.loadPartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 100,​\n# \"loadState\": \"LoadStateLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nres = client.get_load_state(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n#​\n# {​\n# \"state\": \"\"​\n# }​\n\n","import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nGetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nBoolean getLoadStateRes = client.getLoadState(getLoadStateReq);​\nSystem.out.println(getLoadStateRes);​\n​\n// False​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nres = await client.getLoadState({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// ​\n// LoadStateNotLoaded​\n// ​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"loadProgress\": 0,​\n# \"loadState\": \"LoadStateNotLoaded\",​\n# \"message\": \"\"​\n# }​\n# }​\n\n","client.release_partitions(​\n collection_name=\"quick_setup\",​\n partition_names=[\"partitionA\"]​\n)​\n​\nclient.drop_partition(​\n collection_name=\"quick_setup\",​\n partition_name=\"partitionA\"​\n)​\n​\nres = client.list_partitions(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n​\n# [\"_default\"]​\n\n","import io.milvus.v2.service.partition.request.DropPartitionReq;​\nimport io.milvus.v2.service.partition.request.ReleasePartitionsReq;​\nimport io.milvus.v2.service.partition.request.ListPartitionsReq;​\n​\nReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .build();​\n​\nclient.releasePartitions(releasePartitionsReq);​\n​\nDropPartitionReq dropPartitionReq = DropPartitionReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .build();​\n​\nclient.dropPartition(dropPartitionReq);​\n​\nListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\n​\nList partitionNames = client.listPartitions(listPartitionsReq);​\nSystem.out.println(partitionNames);​\n​\n// Output:​\n// [_default]​\n\n","await client.releasePartitions({​\n collection_name: \"quick_setup\",​\n partition_names: [\"partitionA\"]​\n})​\n​\nawait client.dropPartition({​\n collection_name: \"quick_setup\",​\n partition_name: \"partitionA\"​\n})​\n​\nres = await client.listPartitions({​\n collection_name: \"quick_setup\"​\n})​\n​\nconsole.log(res)​\n​\n// Output​\n// [\"_default\"]​\n\n","// Go 缺失​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {}​\n# }​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# \"_default\"​\n# ]​\n# }​\n\n"],"headingContent":"Manage Partitions​","anchorList":[{"label":"管理分區","href":"Manage-Partitions​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"列出分區","href":"List-Partitions​","type":2,"isActive":false},{"label":"建立分區","href":"Create-Partition​","type":2,"isActive":false},{"label":"檢查特定的分區","href":"Check-for-a-Specific-Partition​","type":2,"isActive":false},{"label":"載入與釋放分割區","href":"Load-and-Release-Partitions​","type":2,"isActive":false},{"label":"分區內的資料作業","href":"Data-Operations-Within-Partitions​","type":2,"isActive":false},{"label":"刪除分割區","href":"Drop-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.md new file mode 100644 index 000000000..66e13b1ce --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/manage-partitions.md @@ -0,0 +1,764 @@ +--- +id: manage-partitions.md +title: 管理磁碟分割 +--- +

    管理分區

    分區是集合的子集。每個分區與其父集合共用相同的資料結構,但只包含集合中資料的子集。本頁可協助您瞭解如何管理分區。

    +

    概述

    當建立一個集合時,Milvus 也會在集合中建立一個名為_default的分割區。如果您不打算添加任何其他分区,所有插入到集合中的实体都会进入默认分区,所有搜索和查询也会在默认分区中进行。

    +

    您可以新增更多分區,並根據特定條件將實體插入其中。然後,您可以在特定的分割區內限制搜尋和查詢,以改善搜尋效能。

    +

    一個資料集最多可有 1,024 個分割區。

    +
    +

    分區鑰匙功能是基於分區的搜尋最佳化,並允許 Milvus 根據特定標量欄位中的值,將實體分配到不同的分區中。此功能有助於實現面向分區的多租戶,並改善搜尋效能。

    +

    本頁面不會討論此功能。要瞭解更多資訊,請參閱使用分區鑰匙

    +
    +

    列出分區

    當建立一個集合時,Milvus 也會在集合中建立一個名為_default 的分割區。您可以如下方式列出集合中的分區。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import java.util.*;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri(CLUSTER_ENDPOINT)​
    +        .token(TOKEN)​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +let res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res);​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    import (​
    +    "context"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvucclient"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    +

    建立分區

    您可以在集合中加入更多的分區,並根據特定條件在這些分區中插入實體。

    + +
    client.create_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# ["_default", "partitionA"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.CreatePartitionReq;​
    +​
    +CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.createPartition(createPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default, partitionA]​
    +
    +
    +
    await client.createPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    client "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +err = cli.CreatePartition(ctx, client.NewCreatePartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +partitionNames, err := cli.ListPartitions(ctx, client.NewListPartitionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(partitionNames)​
    +// Output​
    +// ["_default", "partitionA"]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default",​
    +#         "partitionA"​
    +#     ]​
    +# }​
    +
    +
    +

    檢查特定的分區

    以下程式碼片段示範如何檢查特定集合中是否存在磁碟分割。

    + +
    res = client.has_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# True​
    +
    +
    +
    import io.milvus.v2.service.partition.request.HasPartitionReq;​
    +​
    +HasPartitionReq hasPartitionReq = HasPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean hasPartitionRes = client.hasPartition(hasPartitionReq);​
    +System.out.println(hasPartitionRes);​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    res = await client.hasPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.value)​
    +​
    +// Output​
    +// true​
    +
    +
    +
    import (​
    +    "fmt"​
    +    ​
    +    "github.com/milvus-io/milvus/client/v2/milvusclient"​
    +)​
    +​
    +result, err := cli.HasPartition(ctx, milvusclient.NewHasPartitionOption("quick_setup", "partitionA"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(result)​
    +​
    +// Output:​
    +// true​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/has" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#        "has": true​
    +#     }​
    +# }​
    +
    +
    +

    載入與釋放分割區

    您可以分別載入或釋放一個或某些分割區。

    +

    載入分割區

    您可以在集合中分別載入特定的分割區。值得注意的是,如果集合中有未載入的分割區,該集合的載入狀態會保持為未載入。

    + +
    client.load_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: Loaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.LoadPartitionsReq;​
    +import io.milvus.v2.service.collection.request.GetLoadStateReq;​
    +​
    +​
    +LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.loadPartitions(loadPartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// True​
    +
    +
    +
    await client.loadPartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/load" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 100,​
    +#         "loadState": "LoadStateLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    釋放分割區

    您也可以釋放特定的分割區。

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +res = client.get_load_state(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +#​
    +# {​
    +#     "state": "<LoadState: NotLoaded>"​
    +# }​
    +
    +
    +
    import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +Boolean getLoadStateRes = client.getLoadState(getLoadStateReq);​
    +System.out.println(getLoadStateRes);​
    +​
    +// False​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +res = await client.getLoadState({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ​
    +// LoadStateNotLoaded​
    +// ​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/get_load_state" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "loadProgress": 0,​
    +#         "loadState": "LoadStateNotLoaded",​
    +#         "message": ""​
    +#     }​
    +# }​
    +
    +
    +

    分區內的資料作業

    插入與刪除實體

    您可以在特定的作業中執行插入、倒插和刪除作業。如需詳細資訊,請參閱

    +
      +
    • 將實體插入分割區

    • +
    • 將實體上載到磁碟分割

    • +
    • 從分區刪除實體

    • +
    +

    搜尋和查詢

    您可以在特定分区内进行搜索和查询。詳情請參閱

    +
      +
    • 在分區中進行 ANN 搜尋

    • +
    • 在分割區內進行元資料篩選

    • +
    +

    刪除分割區

    您可以丟棄不再需要的磁碟分割。在丟棄磁碟分割之前,請確認該磁碟分割已被釋放。

    + +
    client.release_partitions(​
    +    collection_name="quick_setup",​
    +    partition_names=["partitionA"]​
    +)​
    +​
    +client.drop_partition(​
    +    collection_name="quick_setup",​
    +    partition_name="partitionA"​
    +)​
    +​
    +res = client.list_partitions(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +​
    +# ["_default"]​
    +
    +
    +
    import io.milvus.v2.service.partition.request.DropPartitionReq;​
    +import io.milvus.v2.service.partition.request.ReleasePartitionsReq;​
    +import io.milvus.v2.service.partition.request.ListPartitionsReq;​
    +​
    +ReleasePartitionsReq releasePartitionsReq = ReleasePartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .build();​
    +​
    +client.releasePartitions(releasePartitionsReq);​
    +​
    +DropPartitionReq dropPartitionReq = DropPartitionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .build();​
    +​
    +client.dropPartition(dropPartitionReq);​
    +​
    +ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +​
    +List<String> partitionNames = client.listPartitions(listPartitionsReq);​
    +System.out.println(partitionNames);​
    +​
    +// Output:​
    +// [_default]​
    +
    +
    +
    await client.releasePartitions({​
    +    collection_name: "quick_setup",​
    +    partition_names: ["partitionA"]​
    +})​
    +​
    +await client.dropPartition({​
    +    collection_name: "quick_setup",​
    +    partition_name: "partitionA"​
    +})​
    +​
    +res = await client.listPartitions({​
    +    collection_name: "quick_setup"​
    +})​
    +​
    +console.log(res)​
    +​
    +// Output​
    +// ["_default"]​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/release" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/drop" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {}​
    +# }​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/partitions/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         "_default"​
    +#     ]​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.json new file mode 100644 index 000000000..5499d99ae --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nclient.rename_collection(​\n old_name=\"my_collection\",​\n new_name=\"my_new_collection\"​\n)​\n\n","import io.milvus.v2.service.collection.request.RenameCollectionReq;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";​\nString TOKEN = \"root:Milvus\";​\n​\n// 1. Connect to Milvus server​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(CLUSTER_ENDPOINT)​\n .token(TOKEN)​\n .build();​\n ​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nRenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .newCollectionName(\"my_new_collection\")​\n .build();​\n​\nclient.renameCollection(renameCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = await client.renameCollection({​\n oldName: \"my_collection\",​\n newName: \"my_new_collection\"​\n});​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.RenameCollection(ctx, client.NewRenameCollectionOption(\"my_collection\", \"my_new_collection\"))​\nif err != nil {​\n // handle error​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"newCollectionName\": \"my_new_collection\"​\n}'​\n\n","from pymilvus import MilvusClient\n\nclient.alter_collection_properties(\n collection_name=\"collection_name\",\n properties = {\"collection.ttl.seconds\": 500}\n)\n","import io.milvus.v2.service.collection.request.AlterCollectionReq;​\nimport java.util.HashMap;​\nimport java.util.Map;​\n​\nMap properties = new HashMap<>();​\nproperties.put(\"collection.ttl.seconds\", \"60\");​\n​\nAlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .properties(properties)​\n .build();​\n​\nclient.alterCollection(alterCollectionReq);​\n\n","res = await client.alterCollection({​\n collection_name: \"my_collection\",​\n properties: {​\n \"collection.ttl.seconds\": 60​\n }​\n})​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/pkg/common\"​\n)​\n​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\nerr = cli.AlterCollection(ctx, client.NewAlterCollectionOption(\"my_collection\").WithProperty(common.CollectionTTLConfigKey, 60))​\nif err != nil {​\n // handle error​\n}​\n\n","# Currently not available for REST\n\n"],"headingContent":"Modify Collection​","anchorList":[{"label":"修改收藏集","href":"Modify-Collection​","type":1,"isActive":false},{"label":"重新命名收藏集","href":"Rename-Collection​","type":2,"isActive":false},{"label":"設定集合 TTL","href":"Set-Collection-TTL​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.md new file mode 100644 index 000000000..d02c27126 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/modify-collection.md @@ -0,0 +1,213 @@ +--- +id: modify-collection.md +title: 修改收藏集 +--- +

    修改收藏集

    您可以重新命名一個收藏集或變更其設定。本頁主要介紹如何修改收藏集。

    +

    重新命名收藏集

    您可以重命名集合,如下所示。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +client.rename_collection(​
    +    old_name="my_collection",​
    +    new_name="my_new_collection"​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.RenameCollectionReq;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +String CLUSTER_ENDPOINT = "http://localhost:19530";​
    +String TOKEN = "root:Milvus";​
    +​
    +// 1. Connect to Milvus server​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +    .uri(CLUSTER_ENDPOINT)​
    +    .token(TOKEN)​
    +    .build();​
    +    ​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +RenameCollectionReq renameCollectionReq = RenameCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .newCollectionName("my_new_collection")​
    +        .build();​
    +​
    +client.renameCollection(renameCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = await client.renameCollection({​
    +    oldName: "my_collection",​
    +    newName: "my_new_collection"​
    +});​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.RenameCollection(ctx, client.NewRenameCollectionOption("my_collection", "my_new_collection"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/rename" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "newCollectionName": "my_new_collection"​
    +}'​
    +
    +
    +

    設定集合 TTL

    如果一個 collection 需要在特定時間內被刪除,可以考慮設定它的 Time-To-Live (TTL),單位是秒。一旦 TTL 超時,Milvus 就會刪除集合中的實體。刪除是異步的,表示在刪除完成之前,仍可進行搜尋與查詢。

    +

    以下程式碼片段示範如何變更集合的 TTL。

    + +
    from pymilvus import MilvusClient
    +
    +client.alter_collection_properties(
    +  collection_name="collection_name",
    +  properties = {"collection.ttl.seconds": 500}
    +)
    +
    +
    import io.milvus.v2.service.collection.request.AlterCollectionReq;​
    +import java.util.HashMap;​
    +import java.util.Map;​
    +​
    +Map<String, String> properties = new HashMap<>();​
    +properties.put("collection.ttl.seconds", "60");​
    +​
    +AlterCollectionReq alterCollectionReq = AlterCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .properties(properties)​
    +        .build();​
    +​
    +client.alterCollection(alterCollectionReq);​
    +
    +
    +
    res = await client.alterCollection({​
    +    collection_name: "my_collection",​
    +    properties: {​
    +        "collection.ttl.seconds": 60​
    +    }​
    +})​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/pkg/common"​
    +)​
    +​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +err = cli.AlterCollection(ctx, client.NewAlterCollectionOption("my_collection").WithProperty(common.CollectionTTLConfigKey, 60))​
    +if err != nil {​
    +    // handle error​
    +}​
    +
    +
    +
    # Currently not available for REST
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.json b/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.json new file mode 100644 index 000000000..f7b557f64 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.list_collections()​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.response.ListCollectionsResp;​\n​\nConnectConfig connectConfig = ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build();​\n​\nMilvusClientV2 client = new MilvusClientV2(connectConfig);​\n​\nListCollectionsResp resp = client.listCollections();​\nSystem.out.println(resp.getCollectionNames());​\n\n","import { MilvusClient } from '@zilliz/milvus2-sdk-node';​\n​\nconst client = new MilvusClient({​\n address: 'localhost:19530',​\n token: 'root:Milvus'​\n});​\n​\n​\nconst collections = await client.listCollections();​\nconsole.log(collections);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collectionNames)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/list\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{}​\n}'​\n\n","[\"quick_setup\"]​\n\n","res = client.describe_collection(​\n collection_name=\"quick_setup\"​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.service.collection.request.DescribeCollectionReq;​\nimport io.milvus.v2.service.collection.response.DescribeCollectionResp;​\n​\nDescribeCollectionReq request = DescribeCollectionReq.builder()​\n .collectionName(\"quick_setup\")​\n .build();​\nDescribeCollectionResp resp = client.describeCollection(request);​\nSystem.out.println(resp);​\n\n","const res = await client.describeCollection({​\n collection_name: \"quick_setup\"​\n});​\n​\nconsole.log(res);​\n\n","import (​\n \"context\"​\n \"fmt\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nctx, cancel := context.WithCancel(context.Background())​\ndefer cancel()​\n​\nmilvusAddr := \"127.0.0.1:19530\"​\ntoken := \"root:Milvus\"​\n​\ncli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n})​\nif err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n}​\n​\ndefer cli.Close(ctx)​\n​\ncollection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption(\"quick_setup\"))​\nif err != nil {​\n // handle error​\n}​\n​\nfmt.Println(collection)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\"​\n}'​\n\n"],"headingContent":"View Collections​","anchorList":[{"label":"檢視收藏集","href":"View-Collections​","type":1,"isActive":false},{"label":"列出收藏集","href":"List-Collections​","type":2,"isActive":false},{"label":"描述集合","href":"Describe-Collection​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.md b/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.md new file mode 100644 index 000000000..ccdf1418a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/collections/view-collections.md @@ -0,0 +1,202 @@ +--- +id: view-collections.md +title: 檢視收藏集 +--- +

    檢視收藏集

    您可以取得目前連線資料庫中所有收藏集的名稱清單,並檢查特定收藏集的詳細資訊。

    +

    列出收藏集

    以下範例示範如何取得目前連線資料庫中所有集合的名稱清單。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.list_collections()​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.response.ListCollectionsResp;​
    +​
    +ConnectConfig connectConfig = ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build();​
    +​
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);​
    +​
    +ListCollectionsResp resp = client.listCollections();​
    +System.out.println(resp.getCollectionNames());​
    +
    +
    +
    import { MilvusClient } from '@zilliz/milvus2-sdk-node';​
    +​
    +const client = new MilvusClient({​
    +    address: 'localhost:19530',​
    +    token: 'root:Milvus'​
    +});​
    +​
    +​
    +const collections = await client.listCollections();​
    +console.log(collections);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collectionNames, err := cli.ListCollections(ctx, client.NewListCollectionOption())​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collectionNames)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/list" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{}​
    +}'​
    +
    +
    +

    如果您已經建立了一個名為quick_setup 的集合,上面範例的結果應該與下面相似。

    +
    ["quick_setup"]​
    +
    +
    +

    描述集合

    您也可以取得特定集合的詳細資料。以下範例假設您已建立一個名為 quick_setup 的集合。

    + +
    res = client.describe_collection(​
    +    collection_name="quick_setup"​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.DescribeCollectionReq;​
    +import io.milvus.v2.service.collection.response.DescribeCollectionResp;​
    +​
    +DescribeCollectionReq request = DescribeCollectionReq.builder()​
    +        .collectionName("quick_setup")​
    +        .build();​
    +DescribeCollectionResp resp = client.describeCollection(request);​
    +System.out.println(resp);​
    +
    +
    +
    const res = await client.describeCollection({​
    +    collection_name: "quick_setup"​
    +});​
    +​
    +console.log(res);​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +ctx, cancel := context.WithCancel(context.Background())​
    +defer cancel()​
    +​
    +milvusAddr := "127.0.0.1:19530"​
    +token := "root:Milvus"​
    +​
    +cli, err := client.New(ctx, &client.ClientConfig{​
    +    Address: milvusAddr,​
    +    APIKey:  token,​
    +})​
    +if err != nil {​
    +    log.Fatal("failed to connect to milvus server: ", err.Error())​
    +}​
    +​
    +defer cli.Close(ctx)​
    +​
    +collection, err := cli.DescribeCollection(ctx, client.NewDescribeCollectionOption("quick_setup"))​
    +if err != nil {​
    +    // handle error​
    +}​
    +​
    +fmt.Println(collection)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/describe" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup"​
    +}'​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.json b/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.json new file mode 100644 index 000000000..848c4509d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus.bulk_writer import bulk_import\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Bulk-insert data from a set of JSON files already uploaded to the MinIO server\nresp = bulk_import(\n url=url,\n collection_name=\"quick_setup\",\n files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],\n ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],\n)\n\njob_id = resp.json()['data']['jobId']\nprint(job_id)\n","private static String bulkImport(List> batchFiles) throws InterruptedException {\n MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()\n .collectionName(\"quick_setup\")\n .files(batchFiles)\n .build();\n String bulkImportResult = BulkImport.bulkImport(\"http://localhost:19530\", milvusImportRequest);\n System.out.println(bulkImportResult);\n\n JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);\n String jobId = bulkImportObject.getAsJsonObject(\"data\").get(\"jobId\").getAsString();\n System.out.println(\"Create a bulkInert task, job id: \" + jobId);\n return jobId;\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/create\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"files\": [\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\"\n ],\n [\n \"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\"\n ]\n ],\n \"collectionName\": \"quick_setup\"\n}'\n","[\n \"/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json\"\n],\n","[\n \"/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet\"\n]\n\n","{\n \"code\": 200,\n \"data\": {\n \"jobId\": \"448707763884413158\"\n }\n}\n","import json\nfrom pymilvus.bulk_writer import get_import_progress\n\nurl = f\"http://127.0.0.1:19530\"\n\n# Get bulk-insert job progress\nresp = get_import_progress(\n url=url,\n job_id=\"453265736269038336\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void getImportProgress(String jobId) {\n while (true) {\n System.out.println(\"Wait 5 second to check bulkInsert job state...\");\n try {\n TimeUnit.SECONDS.sleep(5);\n } catch (InterruptedException e) {\n break;\n }\n\n MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()\n .jobId(jobId)\n .build();\n String getImportProgressResult = BulkImport.getImportProgress(\"http://localhost:19530\", request);\n\n JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);\n String state = getImportProgressObject.getAsJsonObject(\"data\").get(\"state\").getAsString();\n String progress = getImportProgressObject.getAsJsonObject(\"data\").get(\"progress\").getAsString();\n if (\"Failed\".equals(state)) {\n String reason = getImportProgressObject.getAsJsonObject(\"data\").get(\"reason\").getAsString();\n System.out.printf(\"The job %s failed, reason: %s%n\", jobId, reason);\n break;\n } else if (\"Completed\".equals(state)) {\n System.out.printf(\"The job %s completed%n\", jobId);\n break;\n } else {\n System.out.printf(\"The job %s is running, state:%s progress:%s%n\", jobId, state, progress);\n }\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n String jobId = bulkImport(batchFiles);\n getImportProgress(jobId);\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/describe\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"jobId\": \"449839014328146739\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"collectionName\": \"quick_setup\",\n \"completeTime\": \"2024-05-18T02:57:13Z\",\n \"details\": [\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146740 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\\\" \",\n \"fileSize\": 31567874,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 100000\n },\n {\n \"completeTime\": \"2024-05-18T02:57:11Z\",\n \"fileName\": \"id:449839014328146741 paths:\\\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\\\" \",\n \"fileSize\": 31517224,\n \"importedRows\": 100000,\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000 \n }\n ],\n \"fileSize\": 63085098,\n \"importedRows\": 200000,\n \"jobId\": \"449839014328146739\",\n \"progress\": 100,\n \"state\": \"Completed\",\n \"totalRows\": 200000\n }\n}\n","import json\nfrom pymilvus.bulk_writer import list_import_jobs\n\nurl = f\"http://127.0.0.1:19530\"\n\n# List bulk-insert jobs\nresp = list_import_jobs(\n url=url,\n collection_name=\"quick_setup\",\n)\n\nprint(json.dumps(resp.json(), indent=4))\n","private static void listImportJobs() {\n MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName(\"quick_setup\").build();\n String listImportJobsResult = BulkImport.listImportJobs(\"http://localhost:19530\", listImportJobsRequest);\n System.out.println(listImportJobsResult);\n}\n\npublic static void main(String[] args) throws Exception {\n listImportJobs();\n}\n","export MILVUS_URI=\"localhost:19530\"\n\ncurl --request POST \"http://${MILVUS_URI}/v2/vectordb/jobs/import/list\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"quick_setup\"\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"records\": [\n {\n \"collectionName\": \"quick_setup\",\n \"jobId\": \"448761313698322011\",\n \"progress\": 50,\n \"state\": \"Importing\"\n }\n ]\n }\n}\n"],"headingContent":"Import data","anchorList":[{"label":"匯入資料","href":"Import-data","type":1,"isActive":false},{"label":"在您開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"匯入資料","href":"Import-data","type":2,"isActive":false},{"label":"檢查匯入進度","href":"Check-import-progress","type":2,"isActive":false},{"label":"列出匯入工作","href":"List-Import-Jobs","type":2,"isActive":false},{"label":"限制","href":"Limitations","type":2,"isActive":false},{"label":"限制條件","href":"Constraints","type":2,"isActive":false},{"label":"建議","href":"Recommendations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.md b/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.md new file mode 100644 index 000000000..02a849d58 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/data-import/import-data.md @@ -0,0 +1,401 @@ +--- +id: import-data.md +order: 1 +title: 匯入資料 +summary: 本頁示範匯入準備資料的程序。 +--- +

    匯入資料

    本頁面示範匯入準備資料的步驟。

    +

    在您開始之前

      +
    • 您已經準備好您的資料並將其放入 Milvus 資料桶。

      +

      如果沒有,您應該先使用RemoteBulkWriter準備您的資料,並確保準備好的資料已經傳輸到與您的 Milvus 實例一起啟動的 MinIO 實例上的 Milvus 資料桶。如需詳細資訊,請參閱準備原始資料

    • +
    • 您已經使用您用來準備資料的模式建立了一個集合。如果沒有,請參閱管理集合

    • +
    +
    +

    下面的程式碼片段使用給定的模式建立一個簡單的集合。有關參數的詳細資訊,請參閱 create_schema()create_collection()SDK 參考資料。

    +
    +
    +

    以下程式碼片段使用給定的模式建立一個簡單的集合。有關參數的詳細資訊,請參閱 SDK 參考資料中的 createCollection()SDK 參考資料。

    +
    +

    匯入資料

    要匯入準備好的資料,您必須建立一個匯入工作,如下所示:

    + +
    from pymilvus.bulk_writer import bulk_import
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Bulk-insert data from a set of JSON files already uploaded to the MinIO server
    +resp = bulk_import(
    +    url=url,
    +    collection_name="quick_setup",
    +    files=[['a1e18323-a658-4d1b-95a7-9907a4391bcf/1.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/2.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/3.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/4.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/5.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/6.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/7.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/8.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/9.parquet'],
    +           ['a1e18323-a658-4d1b-95a7-9907a4391bcf/10.parquet']],
    +)
    +
    +job_id = resp.json()['data']['jobId']
    +print(job_id)
    +
    +
    private static String bulkImport(List<List<String>> batchFiles) throws InterruptedException {
    +    MilvusImportRequest milvusImportRequest = MilvusImportRequest.builder()
    +            .collectionName("quick_setup")
    +            .files(batchFiles)
    +            .build();
    +    String bulkImportResult = BulkImport.bulkImport("http://localhost:19530", milvusImportRequest);
    +    System.out.println(bulkImportResult);
    +
    +    JsonObject bulkImportObject = new Gson().fromJson(bulkImportResult, JsonObject.class);
    +    String jobId = bulkImportObject.getAsJsonObject("data").get("jobId").getAsString();
    +    System.out.println("Create a bulkInert task, job id: " + jobId);
    +    return jobId;
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/create" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "files": [
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet"
    +        ],
    +        [
    +            "/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet"
    +        ]
    +    ],
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    請求體包含兩個欄位:

    +
      +
    • collectionName

      +

      目標資料集的名稱。

    • +
    • files

      +

      一個檔案路徑清單,相對於與您的 Milvus 實例一起啟動的 MioIO 實例上 Milvus 資料桶的根路徑。可能的子清單如下:

      +
        +
      • JSON 檔案

        +

        如果準備的檔案是 JSON 格式,每個子清單應該包含單一準備的 JSON 檔案路徑

        +
        [
        +    "/d1782fa1-6b65-4ff3-b05a-43a436342445/1.json"
        +],
        +
      • +
      • Parquet 檔案

        +

        如果準備的檔案是 Parquet 格式,每個子清單都應包含單一準備的 Parquet 檔案的路徑

        +
        [
        +    "/a6fb2d1c-7b1b-427c-a8a3-178944e3b66d/1.parquet"
        +]
        +
        +
      • +
    • +
    +

    可能的回傳如下:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "jobId": "448707763884413158"
    +    }
    +}
    +
    +

    檢查匯入進度

    獲得匯入工作 ID 後,您可以檢查匯入進度,如下所示:

    + +
    import json
    +from pymilvus.bulk_writer import get_import_progress
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# Get bulk-insert job progress
    +resp = get_import_progress(
    +    url=url,
    +    job_id="453265736269038336",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void getImportProgress(String jobId) {
    +    while (true) {
    +        System.out.println("Wait 5 second to check bulkInsert job state...");
    +        try {
    +            TimeUnit.SECONDS.sleep(5);
    +        } catch (InterruptedException e) {
    +            break;
    +        }
    +
    +        MilvusDescribeImportRequest request = MilvusDescribeImportRequest.builder()
    +                .jobId(jobId)
    +                .build();
    +        String getImportProgressResult = BulkImport.getImportProgress("http://localhost:19530", request);
    +
    +        JsonObject getImportProgressObject = new Gson().fromJson(getImportProgressResult, JsonObject.class);
    +        String state = getImportProgressObject.getAsJsonObject("data").get("state").getAsString();
    +        String progress = getImportProgressObject.getAsJsonObject("data").get("progress").getAsString();
    +        if ("Failed".equals(state)) {
    +            String reason = getImportProgressObject.getAsJsonObject("data").get("reason").getAsString();
    +            System.out.printf("The job %s failed, reason: %s%n", jobId, reason);
    +            break;
    +        } else if ("Completed".equals(state)) {
    +            System.out.printf("The job %s completed%n", jobId);
    +            break;
    +        } else {
    +            System.out.printf("The job %s is running, state:%s progress:%s%n", jobId, state, progress);
    +        }
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +    String jobId = bulkImport(batchFiles);
    +    getImportProgress(jobId);
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/describe" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "jobId": "449839014328146739"
    +}'
    +
    +

    可能的回覆如下:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "collectionName": "quick_setup",
    +        "completeTime": "2024-05-18T02:57:13Z",
    +        "details": [
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146740 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/1.parquet\" ",
    +                "fileSize": 31567874,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 100000
    +            },
    +            {
    +                "completeTime": "2024-05-18T02:57:11Z",
    +                "fileName": "id:449839014328146741 paths:\"/8ca44f28-47f7-40ba-9604-98918afe26d1/2.parquet\" ",
    +                "fileSize": 31517224,
    +                "importedRows": 100000,
    +                "progress": 100,
    +                "state": "Completed",
    +                "totalRows": 200000            
    +            }
    +        ],
    +        "fileSize": 63085098,
    +        "importedRows": 200000,
    +        "jobId": "449839014328146739",
    +        "progress": 100,
    +        "state": "Completed",
    +        "totalRows": 200000
    +    }
    +}
    +
    +

    列出匯入工作

    您可以列出相對於特定集合的所有匯入工作,如下所示:

    + +
    import json
    +from pymilvus.bulk_writer import list_import_jobs
    +
    +url = f"http://127.0.0.1:19530"
    +
    +# List bulk-insert jobs
    +resp = list_import_jobs(
    +    url=url,
    +    collection_name="quick_setup",
    +)
    +
    +print(json.dumps(resp.json(), indent=4))
    +
    +
    private static void listImportJobs() {
    +    MilvusListImportJobsRequest listImportJobsRequest = MilvusListImportJobsRequest.builder().collectionName("quick_setup").build();
    +    String listImportJobsResult = BulkImport.listImportJobs("http://localhost:19530", listImportJobsRequest);
    +    System.out.println(listImportJobsResult);
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    listImportJobs();
    +}
    +
    +
    export MILVUS_URI="localhost:19530"
    +
    +curl --request POST "http://${MILVUS_URI}/v2/vectordb/jobs/import/list" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "quick_setup"
    +}'
    +
    +

    可能的值如下:

    +
    {
    +    "code": 200,
    +    "data": {
    +        "records": [
    +            {
    +                "collectionName": "quick_setup",
    +                "jobId": "448761313698322011",
    +                "progress": 50,
    +                "state": "Importing"
    +            }
    +        ]
    +    }
    +}
    +
    +

    限制

      +
    • 每個匯入檔案大小不得超過16 GB

    • +
    • 匯入請求的最大數目限制為1024

    • +
    • 每個匯入請求的最大檔案數量不得超過1024

    • +
    • 匯入請求中只能指定一個磁碟分割名稱。如果沒有指定磁碟分割名稱,資料會插入預設磁碟分割。此外,如果已在目標集合中設定了分割區金鑰,則無法在匯入請求中設定分割區名稱。

    • +
    +

    限制條件

    在匯入資料前,請確認已確認下列 Milvus 行為的限制:

    +
      +
    • 關於載入行為的限制:

      +
        +
      • 如果一個集合在匯入前已經被載入,您可以使用refresh_load 函式在匯入完成後載入新匯入的資料。
      • +
    • +
    • 有關查詢和搜尋行為的限制:

      +
        +
      • 在匯入工作狀態為完成之前,新匯入的資料保證對查詢和搜尋不可见。

      • +
      • 一旦工作狀態為完成

        +
          +
        • 如果資料集尚未載入,您可以使用load 函式載入新匯入的資料。

        • +
        • 如果資料集已經載入,您可以呼叫load(is_refresh=True) 來載入匯入的資料。

        • +
      • +
    • +
    • 有關刪除行為的限制:

      +
        +
      • 在匯入工作狀態為完成之前,刪除不保證會成功,也可能不會成功。

      • +
      • 工作狀態為Completed之後的刪除保證會成功。

      • +
    • +
    +

    建議

    我們強烈建議您使用多檔案匯入功能,它允許您在單一要求中上傳多個檔案。此方法不僅可簡化匯入程序,還可大幅提升匯入效能。同時,透過整合上傳,您可以減少花在資料管理上的時間,並使您的工作流程更有效率。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.json b/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.json new file mode 100644 index 000000000..1db44a1ed --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# You need to work out a collection schema out of your dataset.\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True\n)\n\nDIM = 512\n\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True),\nschema.add_field(field_name=\"bool\", datatype=DataType.BOOL),\nschema.add_field(field_name=\"int8\", datatype=DataType.INT8),\nschema.add_field(field_name=\"int16\", datatype=DataType.INT16),\nschema.add_field(field_name=\"int32\", datatype=DataType.INT32),\nschema.add_field(field_name=\"int64\", datatype=DataType.INT64),\nschema.add_field(field_name=\"float\", datatype=DataType.FLOAT),\nschema.add_field(field_name=\"double\", datatype=DataType.DOUBLE),\nschema.add_field(field_name=\"varchar\", datatype=DataType.VARCHAR, max_length=512),\nschema.add_field(field_name=\"json\", datatype=DataType.JSON),\nschema.add_field(field_name=\"array_str\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)\nschema.add_field(field_name=\"array_int\", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)\nschema.add_field(field_name=\"float_vector\", datatype=DataType.FLOAT_VECTOR, dim=DIM),\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=DIM),\nschema.add_field(field_name=\"float16_vector\", datatype=DataType.FLOAT16_VECTOR, dim=DIM),\n# schema.add_field(field_name=\"bfloat16_vector\", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)\n\nschema.verify()\n\nprint(schema)\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\nimport io.milvus.bulkwriter.BulkImport;\nimport io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\nimport io.milvus.bulkwriter.common.clientenum.CloudStorage;\nimport io.milvus.bulkwriter.connect.S3ConnectParam;\nimport io.milvus.bulkwriter.connect.StorageConnectParam;\nimport io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;\nimport io.milvus.bulkwriter.request.import_.MilvusImportRequest;\nimport io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;\nimport io.milvus.common.utils.Float16Utils;\nimport io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.*;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.util.*;\nimport java.util.concurrent.TimeUnit;\n\nprivate static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint(\"http://127.0.0.1:9000\");\nprivate static final String BUCKET_NAME = \"a-bucket\";\nprivate static final String ACCESS_KEY = \"minioadmin\";\nprivate static final String SECRET_KEY = \"minioadmin\";\n\nprivate static final Integer DIM = 512;\nprivate static final Gson GSON_INSTANCE = new Gson();\n\nprivate static CreateCollectionReq.CollectionSchema createSchema() {\n CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(true)\n .build();\n schema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(io.milvus.v2.common.DataType.Int64)\n .isPrimaryKey(Boolean.TRUE)\n .autoID(false)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"bool\")\n .dataType(DataType.Bool)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int8\")\n .dataType(DataType.Int8)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int16\")\n .dataType(DataType.Int16)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int32\")\n .dataType(DataType.Int32)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"int64\")\n .dataType(DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float\")\n .dataType(DataType.Float)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"double\")\n .dataType(DataType.Double)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"varchar\")\n .dataType(DataType.VarChar)\n .maxLength(512)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"json\")\n .dataType(io.milvus.v2.common.DataType.JSON)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_int\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.Int64)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"array_str\")\n .dataType(io.milvus.v2.common.DataType.Array)\n .maxCapacity(100)\n .elementType(io.milvus.v2.common.DataType.VarChar)\n .maxLength(128)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float_vector\")\n .dataType(io.milvus.v2.common.DataType.FloatVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"binary_vector\")\n .dataType(io.milvus.v2.common.DataType.BinaryVector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"float16_vector\")\n .dataType(io.milvus.v2.common.DataType.Float16Vector)\n .dimension(DIM)\n .build());\n schema.addField(AddFieldReq.builder()\n .fieldName(\"sparse_vector\")\n .dataType(io.milvus.v2.common.DataType.SparseFloatVector)\n .build());\n \n return schema;\n}\n","from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType\n# Use `from pymilvus import LocalBulkWriter, BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = LocalBulkWriter(\n schema=schema,\n local_path='.',\n segment_size=512 * 1024 * 1024, # Default value\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.LocalBulkWriter;\nimport io.milvus.bulkwriter.LocalBulkWriterParam;\nimport io.milvus.bulkwriter.common.clientenum.BulkFileType;\n\nLocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withLocalPath(\".\")\n .withChunkSize(512 * 1024 * 1024)\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nLocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);\n","from pymilvus.bulk_writer import RemoteBulkWriter\n# Use `from pymilvus import RemoteBulkWriter` \n# when you use pymilvus earlier than 2.4.2 \n\n# Third-party constants\nACCESS_KEY=\"minioadmin\"\nSECRET_KEY=\"minioadmin\"\nBUCKET_NAME=\"a-bucket\"\n\n# Connections parameters to access the remote bucket\nconn = RemoteBulkWriter.S3ConnectParam(\n endpoint=\"localhost:9000\", # the default MinIO service started along with Milvus\n access_key=ACCESS_KEY,\n secret_key=SECRET_KEY,\n bucket_name=BUCKET_NAME,\n secure=False\n)\n\nfrom pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n\nprint('bulk writer created.')\n","private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n","from pymilvus.bulk_writer import BulkFileType\n# Use `from pymilvus import BulkFileType` \n# when you use pymilvus earlier than 2.4.2 \n\nwriter = RemoteBulkWriter(\n schema=schema,\n remote_path=\"/\",\n connect_param=conn,\n file_type=BulkFileType.PARQUET\n)\n","import io.milvus.bulkwriter.RemoteBulkWriter;\nimport io.milvus.bulkwriter.RemoteBulkWriterParam;\n\nRemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(schema)\n .withConnectParam(storageConnectParam)\n .withChunkSize(512 * 1024 * 1024)\n .withRemotePath(\"/\")\n .withFileType(BulkFileType.PARQUET)\n .build();\n\nRemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);\n","import random, string, json\nimport numpy as np\nimport tensorflow as tf\n\ndef generate_random_str(length=5):\n letters = string.ascii_uppercase\n digits = string.digits\n \n return ''.join(random.choices(letters + digits, k=length))\n\n# optional input for binary vector:\n# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]\n# 2. numpy array of uint8\ndef gen_binary_vector(to_numpy_arr):\n raw_vector = [random.randint(0, 1) for i in range(DIM)]\n if to_numpy_arr:\n return np.packbits(raw_vector, axis=-1)\n return raw_vector\n\n# optional input for float vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float32\ndef gen_float_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=\"float32\")\n return raw_vector\n\n# # optional input for bfloat16 vector:\n# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# # 2. numpy array of bfloat16\n# def gen_bf16_vector(to_numpy_arr):\n# raw_vector = [random.random() for _ in range(DIM)]\n# if to_numpy_arr:\n# return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()\n# return raw_vector\n\n# optional input for float16 vector:\n# 1. list of float such as [0.56, 1.859, 6.55, 9.45]\n# 2. numpy array of float16\ndef gen_fp16_vector(to_numpy_arr):\n raw_vector = [random.random() for _ in range(DIM)]\n if to_numpy_arr:\n return np.array(raw_vector, dtype=np.float16)\n return raw_vector\n\n# optional input for sparse vector:\n# only accepts dict like {2: 13.23, 45: 0.54} or {\"indices\": [1, 2], \"values\": [0.1, 0.2]}\n# note: no need to sort the keys\ndef gen_sparse_vector(pair_dict: bool):\n raw_vector = {}\n dim = random.randint(2, 20)\n if pair_dict:\n raw_vector[\"indices\"] = [i for i in range(dim)]\n raw_vector[\"values\"] = [random.random() for _ in range(dim)]\n else:\n for i in range(dim):\n raw_vector[i] = random.random()\n return raw_vector\n\nfor i in range(10000):\n writer.append_row({\n \"id\": np.int64(i),\n \"bool\": True if i % 3 == 0 else False,\n \"int8\": np.int8(i%128),\n \"int16\": np.int16(i%1000),\n \"int32\": np.int32(i%100000),\n \"int64\": np.int64(i),\n \"float\": np.float32(i/3),\n \"double\": np.float64(i/7),\n \"varchar\": f\"varchar_{i}\",\n \"json\": json.dumps({\"dummy\": i, \"ok\": f\"name_{i}\"}),\n \"array_str\": np.array([f\"str_{k}\" for k in range(5)], np.dtype(\"str\")),\n \"array_int\": np.array([k for k in range(10)], np.dtype(\"int64\")),\n \"float_vector\": gen_float_vector(True),\n \"binary_vector\": gen_binary_vector(True),\n \"float16_vector\": gen_fp16_vector(True),\n # \"bfloat16_vector\": gen_bf16_vector(True),\n \"sparse_vector\": gen_sparse_vector(True),\n f\"dynamic_{i}\": i,\n })\n if (i+1)%1000 == 0:\n writer.commit()\n print('committed')\n\nprint(writer.batch_files)\n","private static byte[] genBinaryVector() {\n Random ran = new Random();\n int byteCount = DIM / 8;\n ByteBuffer vector = ByteBuffer.allocate(byteCount);\n for (int i = 0; i < byteCount; ++i) {\n vector.put((byte) ran.nextInt(Byte.MAX_VALUE));\n }\n return vector.array();\n}\n\nprivate static List genFloatVector() {\n Random ran = new Random();\n List vector = new ArrayList<>();\n for (int i = 0; i < DIM; ++i) {\n vector.add(ran.nextFloat());\n }\n return vector;\n}\n\nprivate static byte[] genFloat16Vector() {\n List originalVector = genFloatVector();\n return Float16Utils.f32VectorToFp16Buffer(originalVector).array();\n}\n\nprivate static SortedMap genSparseVector() {\n Random ran = new Random();\n SortedMap sparse = new TreeMap<>();\n int dim = ran.nextInt(18) + 2; // [2, 20)\n for (int i = 0; i < dim; ++i) {\n sparse.put((long)ran.nextInt(1000000), ran.nextFloat());\n }\n return sparse;\n}\n\nprivate static List genStringArray(int length) {\n List arr = new ArrayList<>();\n for (int i = 0; i < length; i++) {\n arr.add(\"str_\" + i);\n }\n return arr;\n}\n\nprivate static List genIntArray(int length) {\n List arr = new ArrayList<>();\n for (long i = 0; i < length; i++) {\n arr.add(i);\n }\n return arr;\n}\n\nprivate static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {\n StorageConnectParam connectParam = S3ConnectParam.newBuilder()\n .withEndpoint(MINIO_ENDPOINT)\n .withBucketName(BUCKET_NAME)\n .withAccessKey(ACCESS_KEY)\n .withSecretKey(SECRET_KEY)\n .build();\n RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()\n .withCollectionSchema(collectionSchema)\n .withRemotePath(\"/\")\n .withConnectParam(connectParam)\n .withFileType(BulkFileType.PARQUET)\n .build();\n return new RemoteBulkWriter(bulkWriterParam);\n}\n\nprivate static List> uploadData() throws Exception {\n CreateCollectionReq.CollectionSchema collectionSchema = createSchema();\n try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {\n for (int i = 0; i < 10000; ++i) {\n JsonObject rowObject = new JsonObject();\n\n rowObject.addProperty(\"id\", i);\n rowObject.addProperty(\"bool\", i % 3 == 0);\n rowObject.addProperty(\"int8\", i % 128);\n rowObject.addProperty(\"int16\", i % 1000);\n rowObject.addProperty(\"int32\", i % 100000);\n rowObject.addProperty(\"int64\", i);\n rowObject.addProperty(\"float\", i / 3);\n rowObject.addProperty(\"double\", i / 7);\n rowObject.addProperty(\"varchar\", \"varchar_\" + i);\n rowObject.addProperty(\"json\", String.format(\"{\\\"dummy\\\": %s, \\\"ok\\\": \\\"name_%s\\\"}\", i, i));\n rowObject.add(\"array_str\", GSON_INSTANCE.toJsonTree(genStringArray(5)));\n rowObject.add(\"array_int\", GSON_INSTANCE.toJsonTree(genIntArray(10)));\n rowObject.add(\"float_vector\", GSON_INSTANCE.toJsonTree(genFloatVector()));\n rowObject.add(\"binary_vector\", GSON_INSTANCE.toJsonTree(genBinaryVector()));\n rowObject.add(\"float16_vector\", GSON_INSTANCE.toJsonTree(genFloat16Vector()));\n rowObject.add(\"sparse_vector\", GSON_INSTANCE.toJsonTree(genSparseVector()));\n rowObject.addProperty(\"dynamic\", \"dynamic_\" + i);\n\n remoteBulkWriter.appendRow(rowObject);\n\n if ((i+1)%1000 == 0) {\n remoteBulkWriter.commit(false);\n }\n }\n\n List> batchFiles = remoteBulkWriter.getBatchFiles();\n System.out.println(batchFiles);\n return batchFiles;\n } catch (Exception e) {\n throw e;\n }\n}\n\npublic static void main(String[] args) throws Exception {\n List> batchFiles = uploadData();\n}\n","print(writer.batch_files)\n\n# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],\n# ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]\n","// localBulkWriter.getBatchFiles();\nremoteBulkWriter.getBatchFiles();\n\n// \n\n// Close the BulkWriter\ntry {\n localBulkWriter.close();\n remoteBulkWriter.close(); \n} catch (Exception e) {\n // TODO: handle exception\n e.printStackTrace();\n}\n","# JSON\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.json \n\n# Parquet\n├── folder\n│ └── 45ae1139-1d87-4aff-85f5-0039111f9e6b\n│ └── 1.parquet \n"],"headingContent":"Prepare Source Data","anchorList":[{"label":"準備原始資料","href":"Prepare-Source-Data","type":1,"isActive":false},{"label":"開始之前","href":"Before-you-start","type":2,"isActive":false},{"label":"設定 BulkWriter","href":"Set-up-BulkWriter","type":2,"isActive":false},{"label":"開始寫入","href":"Start-writing","type":2,"isActive":false},{"label":"驗證結果","href":"Verify-the-results","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.md b/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.md new file mode 100644 index 000000000..e109fe29a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/data-import/prepare-source-data.md @@ -0,0 +1,631 @@ +--- +id: prepare-source-data.md +order: 0 +title: 準備原始資料 +summary: 本頁討論您在開始大量插入資料到您的資料集中之前應該考慮的事項。 +--- +

    準備原始資料

    本頁討論您在開始大量插入資料到您的資料集中之前應該考慮的事項。

    +

    開始之前

    目標集合需要將源資料對應到其模式。下圖顯示可接受的來源資料如何映射到目標集合的模式。

    +

    + + Map data to schema + 將資料對應到模式

    +

    您應該仔細檢查您的資料,並據此設計目標資料集的模式。

    +

    以上圖中的 JSON 資料為例,行清單中有兩個實體,每一行有六個欄位。集合模式選擇性地包含四個:id向量標量_1標量_2

    +

    在設計模式時,還有兩件事情需要考慮:

    +
      +
    • 是否啟用 AutoID

      +

      id 欄位是集合的主要欄位。要使主欄位自動遞增,您可以在模式中啟用AutoID。在這種情況下,您應該從來源資料的每一行中排除id 欄位

    • +
    • 是否啟用動態欄位

      +

      如果模式啟用動態欄位,目標集合也可以儲存未包含在其預先定義的模式中的欄位。$meta欄位是保留的 JSON 欄位,用來保存動態欄位及其鍵值對中的值。在上圖中,欄位dynamic_field_1dynamic_field_2及其值將以鍵值對的方式儲存於$meta欄位中。

    • +
    +

    以下程式碼顯示如何為上圖所示的集合設定模式。

    +
    +

    若要取得更多資訊,請參考 create_schema()add_field()在 SDK 參考資料中。

    +
    +
    +

    要獲得更多資訊,請參考 CollectionSchema在 SDK 參考資料中。

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# You need to work out a collection schema out of your dataset.
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True
    +)
    +
    +DIM = 512
    +
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True),
    +schema.add_field(field_name="bool", datatype=DataType.BOOL),
    +schema.add_field(field_name="int8", datatype=DataType.INT8),
    +schema.add_field(field_name="int16", datatype=DataType.INT16),
    +schema.add_field(field_name="int32", datatype=DataType.INT32),
    +schema.add_field(field_name="int64", datatype=DataType.INT64),
    +schema.add_field(field_name="float", datatype=DataType.FLOAT),
    +schema.add_field(field_name="double", datatype=DataType.DOUBLE),
    +schema.add_field(field_name="varchar", datatype=DataType.VARCHAR, max_length=512),
    +schema.add_field(field_name="json", datatype=DataType.JSON),
    +schema.add_field(field_name="array_str", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.VARCHAR, max_length=128)
    +schema.add_field(field_name="array_int", datatype=DataType.ARRAY, max_capacity=100, element_type=DataType.INT64)
    +schema.add_field(field_name="float_vector", datatype=DataType.FLOAT_VECTOR, dim=DIM),
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=DIM),
    +schema.add_field(field_name="float16_vector", datatype=DataType.FLOAT16_VECTOR, dim=DIM),
    +# schema.add_field(field_name="bfloat16_vector", datatype=DataType.BFLOAT16_VECTOR, dim=DIM),
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
    +
    +schema.verify()
    +
    +print(schema)
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +import io.milvus.bulkwriter.BulkImport;
    +import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +import io.milvus.bulkwriter.common.clientenum.CloudStorage;
    +import io.milvus.bulkwriter.connect.S3ConnectParam;
    +import io.milvus.bulkwriter.connect.StorageConnectParam;
    +import io.milvus.bulkwriter.request.describe.MilvusDescribeImportRequest;
    +import io.milvus.bulkwriter.request.import_.MilvusImportRequest;
    +import io.milvus.bulkwriter.request.list.MilvusListImportJobsRequest;
    +import io.milvus.common.utils.Float16Utils;
    +import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.*;
    +
    +import java.io.IOException;
    +import java.nio.ByteBuffer;
    +import java.util.*;
    +import java.util.concurrent.TimeUnit;
    +
    +private static final String MINIO_ENDPOINT = CloudStorage.MINIO.getEndpoint("http://127.0.0.1:9000");
    +private static final String BUCKET_NAME = "a-bucket";
    +private static final String ACCESS_KEY = "minioadmin";
    +private static final String SECRET_KEY = "minioadmin";
    +
    +private static final Integer DIM = 512;
    +private static final Gson GSON_INSTANCE = new Gson();
    +
    +private static CreateCollectionReq.CollectionSchema createSchema() {
    +    CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(true)
    +        .build();
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("id")
    +            .dataType(io.milvus.v2.common.DataType.Int64)
    +            .isPrimaryKey(Boolean.TRUE)
    +            .autoID(false)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("bool")
    +            .dataType(DataType.Bool)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int8")
    +            .dataType(DataType.Int8)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int16")
    +            .dataType(DataType.Int16)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int32")
    +            .dataType(DataType.Int32)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("int64")
    +            .dataType(DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float")
    +            .dataType(DataType.Float)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("double")
    +            .dataType(DataType.Double)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("varchar")
    +            .dataType(DataType.VarChar)
    +            .maxLength(512)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("json")
    +            .dataType(io.milvus.v2.common.DataType.JSON)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_int")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.Int64)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("array_str")
    +            .dataType(io.milvus.v2.common.DataType.Array)
    +            .maxCapacity(100)
    +            .elementType(io.milvus.v2.common.DataType.VarChar)
    +            .maxLength(128)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float_vector")
    +            .dataType(io.milvus.v2.common.DataType.FloatVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("binary_vector")
    +            .dataType(io.milvus.v2.common.DataType.BinaryVector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("float16_vector")
    +            .dataType(io.milvus.v2.common.DataType.Float16Vector)
    +            .dimension(DIM)
    +            .build());
    +    schema.addField(AddFieldReq.builder()
    +            .fieldName("sparse_vector")
    +            .dataType(io.milvus.v2.common.DataType.SparseFloatVector)
    +            .build());
    +    
    +    return schema;
    +}
    +
    +

    設定 BulkWriter

    BulkWriter是用來將原始資料集轉換成適合透過 RESTful Import API 匯入的格式的工具。它提供兩種類型的寫入程式:

    +
      +
    • LocalBulkWriter:讀取指定的資料集,並將其轉換成容易使用的格式。
    • +
    • RemoteBulkWriter:執行與 LocalBulkWriter 相同的任務,但會額外將轉換後的資料檔案傳輸至指定的遠端物件儲存桶。
    • +
    +

    RemoteBulkWriterLocalBulkWriter的不同之處在於RemoteBulkWriter會將轉換後的資料檔案傳輸至目標物件儲存空間。

    +

    設定 LocalBulkWriter

    LocalBulkWriter會追加來源資料集的資料列,並將它們提交到指定格式的本機檔案中。

    + +
    from pymilvus.bulk_writer import LocalBulkWriter, BulkFileType
    +# Use `from pymilvus import LocalBulkWriter, BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = LocalBulkWriter(
    +    schema=schema,
    +    local_path='.',
    +    segment_size=512 * 1024 * 1024, # Default value
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.LocalBulkWriter;
    +import io.milvus.bulkwriter.LocalBulkWriterParam;
    +import io.milvus.bulkwriter.common.clientenum.BulkFileType;
    +
    +LocalBulkWriterParam localBulkWriterParam = LocalBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withLocalPath(".")
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +LocalBulkWriter localBulkWriter = new LocalBulkWriter(localBulkWriterParam);
    +
    +
    +

    在建立LocalBulkWriter 時,您應該

    +
      +
    • schema 中引用已建立的模式。
    • +
    • local_path 設為輸出目錄。
    • +
    • file_type 設為輸出檔案類型。
    • +
    • 如果您的資料集包含大量記錄,建議您將segment_size 設定為適當的值,以分割資料。
    • +
    +

    有關參數設定的詳細資訊,請參閱 SDK 參考資料中的LocalBulkWriter

    +
    +
    +

    建立LocalBulkWriter 時,您應該

    +
      +
    • CollectionSchema() 中參考已建立的模式。
    • +
    • withLocalPath() 中設定輸出目錄。
    • +
    • withFileType() 中設定輸出檔案類型。
    • +
    • 如果您的資料集包含大量記錄,建議您將withChunkSize() 設定為適當的值來分割資料。
    • +
    +

    有關參數設定的詳細資訊,請參閱 SDK 參考資料中的 LocalBulkWriter。

    +
    +

    設定 RemoteBulkWriter

    RemoteBulkWriter不會將附加的資料提交到本機檔案,而是提交到遠端資料桶。因此,您應該在建立RemoteBulkWriter 之前設定ConnectParam物件。

    + +
    from pymilvus.bulk_writer import RemoteBulkWriter
    +# Use `from pymilvus import RemoteBulkWriter` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +# Third-party constants
    +ACCESS_KEY="minioadmin"
    +SECRET_KEY="minioadmin"
    +BUCKET_NAME="a-bucket"
    +
    +# Connections parameters to access the remote bucket
    +conn = RemoteBulkWriter.S3ConnectParam(
    +    endpoint="localhost:9000", # the default MinIO service started along with Milvus
    +    access_key=ACCESS_KEY,
    +    secret_key=SECRET_KEY,
    +    bucket_name=BUCKET_NAME,
    +    secure=False
    +)
    +
    +from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +print('bulk writer created.')
    +
    +
    private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +

    一旦連線參數準備好了,您就可以在RemoteBulkWriter中引用它,如下所示:

    + +
    from pymilvus.bulk_writer import BulkFileType
    +# Use `from pymilvus import BulkFileType` 
    +# when you use pymilvus earlier than 2.4.2 
    +
    +writer = RemoteBulkWriter(
    +    schema=schema,
    +    remote_path="/",
    +    connect_param=conn,
    +    file_type=BulkFileType.PARQUET
    +)
    +
    +
    import io.milvus.bulkwriter.RemoteBulkWriter;
    +import io.milvus.bulkwriter.RemoteBulkWriterParam;
    +
    +RemoteBulkWriterParam remoteBulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +    .withCollectionSchema(schema)
    +    .withConnectParam(storageConnectParam)
    +    .withChunkSize(512 * 1024 * 1024)
    +    .withRemotePath("/")
    +    .withFileType(BulkFileType.PARQUET)
    +    .build();
    +
    +RemoteBulkWriter remoteBulkWriter = new RemoteBulkWriter(remoteBulkWriterParam);
    +
    +
    +

    除了connect_param 之外,建立RemoteBulkWriter的參數幾乎與LocalBulkWriter 的參數相同。有關參數設定的詳細資訊,請參閱 SDK 參考資料中的RemoteBulkWriterConnectParam

    +
    +
    +

    創建RemoteBulkWriter的參數與LocalBulkWriter 的參數幾乎相同,除了StorageConnectParam 。有關參數設定的詳細資訊,請參閱 SDK 參考資料中的 RemoteBulkWriter 和 StorageConnectParam。

    +
    +

    開始寫入

    +

    BulkWriter有兩個方法:append_row() 從來源資料集新增一條記錄,以及commit() 將新增的記錄提交到本機檔案或遠端資料桶。

    +
    +
    +

    BulkWriter有兩個方法:appendRow() 從原始資料集新增一條記錄,以及commit() 將新增的記錄提交到本機檔案或遠端資料桶。

    +
    +

    為了示範目的,以下程式碼會追加隨機產生的資料。

    + +
    import random, string, json
    +import numpy as np
    +import tensorflow as tf
    +
    +def generate_random_str(length=5):
    +    letters = string.ascii_uppercase
    +    digits = string.digits
    +    
    +    return ''.join(random.choices(letters + digits, k=length))
    +
    +# optional input for binary vector:
    +# 1. list of int such as [1, 0, 1, 1, 0, 0, 1, 0]
    +# 2. numpy array of uint8
    +def gen_binary_vector(to_numpy_arr):
    +    raw_vector = [random.randint(0, 1) for i in range(DIM)]
    +    if to_numpy_arr:
    +        return np.packbits(raw_vector, axis=-1)
    +    return raw_vector
    +
    +# optional input for float vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float32
    +def gen_float_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype="float32")
    +    return raw_vector
    +
    +# # optional input for bfloat16 vector:
    +# # 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# # 2. numpy array of bfloat16
    +# def gen_bf16_vector(to_numpy_arr):
    +#     raw_vector = [random.random() for _ in range(DIM)]
    +#     if to_numpy_arr:
    +#         return tf.cast(raw_vector, dtype=tf.bfloat16).numpy()
    +#     return raw_vector
    +
    +# optional input for float16 vector:
    +# 1. list of float such as [0.56, 1.859, 6.55, 9.45]
    +# 2. numpy array of float16
    +def gen_fp16_vector(to_numpy_arr):
    +    raw_vector = [random.random() for _ in range(DIM)]
    +    if to_numpy_arr:
    +        return np.array(raw_vector, dtype=np.float16)
    +    return raw_vector
    +
    +# optional input for sparse vector:
    +# only accepts dict like {2: 13.23, 45: 0.54} or {"indices": [1, 2], "values": [0.1, 0.2]}
    +# note: no need to sort the keys
    +def gen_sparse_vector(pair_dict: bool):
    +    raw_vector = {}
    +    dim = random.randint(2, 20)
    +    if pair_dict:
    +        raw_vector["indices"] = [i for i in range(dim)]
    +        raw_vector["values"] = [random.random() for _ in range(dim)]
    +    else:
    +        for i in range(dim):
    +            raw_vector[i] = random.random()
    +    return raw_vector
    +
    +for i in range(10000):
    +    writer.append_row({
    +        "id": np.int64(i),
    +        "bool": True if i % 3 == 0 else False,
    +        "int8": np.int8(i%128),
    +        "int16": np.int16(i%1000),
    +        "int32": np.int32(i%100000),
    +        "int64": np.int64(i),
    +        "float": np.float32(i/3),
    +        "double": np.float64(i/7),
    +        "varchar": f"varchar_{i}",
    +        "json": json.dumps({"dummy": i, "ok": f"name_{i}"}),
    +        "array_str": np.array([f"str_{k}" for k in range(5)], np.dtype("str")),
    +        "array_int": np.array([k for k in range(10)], np.dtype("int64")),
    +        "float_vector": gen_float_vector(True),
    +        "binary_vector": gen_binary_vector(True),
    +        "float16_vector": gen_fp16_vector(True),
    +        # "bfloat16_vector": gen_bf16_vector(True),
    +        "sparse_vector": gen_sparse_vector(True),
    +        f"dynamic_{i}": i,
    +    })
    +    if (i+1)%1000 == 0:
    +        writer.commit()
    +        print('committed')
    +
    +print(writer.batch_files)
    +
    +
    private static byte[] genBinaryVector() {
    +    Random ran = new Random();
    +    int byteCount = DIM / 8;
    +    ByteBuffer vector = ByteBuffer.allocate(byteCount);
    +    for (int i = 0; i < byteCount; ++i) {
    +        vector.put((byte) ran.nextInt(Byte.MAX_VALUE));
    +    }
    +    return vector.array();
    +}
    +
    +private static List<Float> genFloatVector() {
    +    Random ran = new Random();
    +    List<Float> vector = new ArrayList<>();
    +    for (int i = 0; i < DIM; ++i) {
    +        vector.add(ran.nextFloat());
    +    }
    +    return vector;
    +}
    +
    +private static byte[] genFloat16Vector() {
    +    List<Float> originalVector = genFloatVector();
    +    return Float16Utils.f32VectorToFp16Buffer(originalVector).array();
    +}
    +
    +private static SortedMap<Long, Float> genSparseVector() {
    +    Random ran = new Random();
    +    SortedMap<Long, Float> sparse = new TreeMap<>();
    +    int dim = ran.nextInt(18) + 2; // [2, 20)
    +    for (int i = 0; i < dim; ++i) {
    +        sparse.put((long)ran.nextInt(1000000), ran.nextFloat());
    +    }
    +    return sparse;
    +}
    +
    +private static List<String> genStringArray(int length) {
    +    List<String> arr = new ArrayList<>();
    +    for (int i = 0; i < length; i++) {
    +        arr.add("str_" + i);
    +    }
    +    return arr;
    +}
    +
    +private static List<Long> genIntArray(int length) {
    +    List<Long> arr = new ArrayList<>();
    +    for (long i = 0; i < length; i++) {
    +        arr.add(i);
    +    }
    +    return arr;
    +}
    +
    +private static RemoteBulkWriter createRemoteBulkWriter(CreateCollectionReq.CollectionSchema collectionSchema) throws IOException {
    +    StorageConnectParam connectParam = S3ConnectParam.newBuilder()
    +            .withEndpoint(MINIO_ENDPOINT)
    +            .withBucketName(BUCKET_NAME)
    +            .withAccessKey(ACCESS_KEY)
    +            .withSecretKey(SECRET_KEY)
    +            .build();
    +    RemoteBulkWriterParam bulkWriterParam = RemoteBulkWriterParam.newBuilder()
    +            .withCollectionSchema(collectionSchema)
    +            .withRemotePath("/")
    +            .withConnectParam(connectParam)
    +            .withFileType(BulkFileType.PARQUET)
    +            .build();
    +    return new RemoteBulkWriter(bulkWriterParam);
    +}
    +
    +private static List<List<String>> uploadData() throws Exception {
    +    CreateCollectionReq.CollectionSchema collectionSchema = createSchema();
    +    try (RemoteBulkWriter remoteBulkWriter = createRemoteBulkWriter(collectionSchema)) {
    +        for (int i = 0; i < 10000; ++i) {
    +            JsonObject rowObject = new JsonObject();
    +
    +            rowObject.addProperty("id", i);
    +            rowObject.addProperty("bool", i % 3 == 0);
    +            rowObject.addProperty("int8", i % 128);
    +            rowObject.addProperty("int16", i % 1000);
    +            rowObject.addProperty("int32", i % 100000);
    +            rowObject.addProperty("int64", i);
    +            rowObject.addProperty("float", i / 3);
    +            rowObject.addProperty("double", i / 7);
    +            rowObject.addProperty("varchar", "varchar_" + i);
    +            rowObject.addProperty("json", String.format("{\"dummy\": %s, \"ok\": \"name_%s\"}", i, i));
    +            rowObject.add("array_str", GSON_INSTANCE.toJsonTree(genStringArray(5)));
    +            rowObject.add("array_int", GSON_INSTANCE.toJsonTree(genIntArray(10)));
    +            rowObject.add("float_vector", GSON_INSTANCE.toJsonTree(genFloatVector()));
    +            rowObject.add("binary_vector", GSON_INSTANCE.toJsonTree(genBinaryVector()));
    +            rowObject.add("float16_vector", GSON_INSTANCE.toJsonTree(genFloat16Vector()));
    +            rowObject.add("sparse_vector", GSON_INSTANCE.toJsonTree(genSparseVector()));
    +            rowObject.addProperty("dynamic", "dynamic_" + i);
    +
    +            remoteBulkWriter.appendRow(rowObject);
    +
    +            if ((i+1)%1000 == 0) {
    +                remoteBulkWriter.commit(false);
    +            }
    +        }
    +
    +        List<List<String>> batchFiles = remoteBulkWriter.getBatchFiles();
    +        System.out.println(batchFiles);
    +        return batchFiles;
    +    } catch (Exception e) {
    +        throw e;
    +    }
    +}
    +
    +public static void main(String[] args) throws Exception {
    +    List<List<String>> batchFiles = uploadData();
    +}
    +
    +

    驗證結果

    +

    若要檢查結果,您可以透過列印寫入者的batch_files 屬性來取得實際的輸出路徑。

    +
    +
    +

    若要檢查結果,您可以透過列印寫入者的getBatchFiles() 方法來取得實際的輸出路徑。

    +
    + +
    print(writer.batch_files)
    +
    +# [['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/1.parquet'],
    +#  ['d4220a9e-45be-4ccb-8cb5-bf09304b9f23/2.parquet']]
    +
    +
    // localBulkWriter.getBatchFiles();
    +remoteBulkWriter.getBatchFiles();
    +
    +// 
    +
    +// Close the BulkWriter
    +try {
    +    localBulkWriter.close();
    +    remoteBulkWriter.close();            
    +} catch (Exception e) {
    +    // TODO: handle exception
    +    e.printStackTrace();
    +}
    +
    +

    BulkWriter會產生 UUID,在提供的輸出路徑中使用 UUID 建立子資料夾,並將所有產生的檔案放入子資料夾中。點選此處下載準備好的範例資料。

    +

    可能的資料夾結構如下:

    +
    # JSON
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.json 
    +
    +# Parquet
    +├── folder
    +│   └── 45ae1139-1d87-4aff-85f5-0039111f9e6b
    +│       └── 1.parquet 
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.json b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.json new file mode 100644 index 000000000..2a214d0d9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n filter=\"color in ['red_3314', 'purple_7392']\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .filter(\"color in ['red_3314', 'purple_7392']\")​\n .build());​\n​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 7. Delete entities​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n filter: \"color in ['red', 'green']\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 3​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color in [\\\"red_3314\\\", \\\"purple_7392\\\"]\"​\n}'​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n ids=[18, 19]​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19]​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":{}}​\n\n","res = client.delete(​\n collection_name=\"quick_setup\",​\n ids=[18, 19],​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'delete_count': 2}​\n\n","import io.milvus.v2.service.vector.request.DeleteReq;​\nimport io.milvus.v2.service.vector.response.DeleteResp;​\n​\nimport java.util.Arrays;​\n​\nDeleteResp deleteResp = client.delete(DeleteReq.builder()​\n .collectionName(\"quick_setup\")​\n .ids(Arrays.asList(18, 19))​\n .partitionName(\"partitionA\")​\n .build());​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.delete({​\n collection_name: \"quick_setup\",​\n ids: [18, 19],​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.delete_cnt)​\n​\n// Output​\n// ​\n// 2​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\",​\n \"filter\": \"id in [18, 19]\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"cost\": 0,​\n# \"data\": {}​\n# }​\n\n"],"headingContent":"Delete Entities​","anchorList":[{"label":"刪除實體","href":"Delete-Entities​","type":1,"isActive":false},{"label":"透過篩選條件刪除實體","href":"Delete-Entities-by-Filtering-Conditions​","type":2,"isActive":false},{"label":"依據主鍵刪除實體","href":"Delete-Entities-by-Primary-Keys​","type":2,"isActive":false},{"label":"從分區刪除實體","href":"Delete-Entities-from-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.md b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.md new file mode 100644 index 000000000..54cb35ad5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/delete-entities.md @@ -0,0 +1,257 @@ +--- +id: delete-entities.md +title: 刪除實體 +--- +

    刪除實體

    您可以透過篩選條件或其主鍵刪除不再需要的實體。

    +

    透過篩選條件刪除實體

    在批量刪除共享某些屬性的多個實體時,您可以使用篩選表達式。下面的示例代碼使用in運算符批量刪除所有顏色欄位設定為紅色綠色值的實體。您也可以使用其他運算符來建構符合您需求的篩選表達式。關於過濾表達式的更多資訊,請參閱Metadata 過濾

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    filter="color in ['red_3314', 'purple_7392']"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +ilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .filter("color in ['red_3314', 'purple_7392']")​
    +        .build());​
    +​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 7. Delete entities​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    filter: "color in ['red', 'green']"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 3​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color in [\"red_3314\", \"purple_7392\"]"​
    +}'​
    +
    +
    +

    依據主鍵刪除實體

    在大多數情況下,一個主鍵唯一地識別一個 Entity。您可以在刪除請求中設定 Entity 的 primary key 來刪除 Entity。下面的示例代碼演示了如何刪除兩個具有主鍵1819 的實體。

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    ids=[18, 19]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19]​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +## {"code":0,"cost":0,"data":{}}​
    +
    +
    +

    從分區刪除實體

    您也可以刪除儲存在特定分區中的實體。以下的程式碼片段假設您的集合中有一個名為PartitionA的分割區。

    + +
    res = client.delete(​
    +    collection_name="quick_setup",​
    +    ids=[18, 19],​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'delete_count': 2}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.DeleteReq;​
    +import io.milvus.v2.service.vector.response.DeleteResp;​
    +​
    +import java.util.Arrays;​
    +​
    +DeleteResp deleteResp = client.delete(DeleteReq.builder()​
    +        .collectionName("quick_setup")​
    +        .ids(Arrays.asList(18, 19))​
    +        .partitionName("partitionA")​
    +        .build());​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.delete({​
    +    collection_name: "quick_setup",​
    +    ids: [18, 19],​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.delete_cnt)​
    +​
    +// Output​
    +// ​
    +// 2​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/delete" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA",​
    +    "filter": "id in [18, 19]"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "cost": 0,​
    +#     "data": {}​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.json b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.json new file mode 100644 index 000000000..4dc3cf759 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"quick_setup\",​\n # highlight-next-line​\n partition_name=\"partitionA\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nimport java.util.*;​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_name: \"partitionA\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 11, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 12, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 13, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 14, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 15, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 16, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 17, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 18, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 19, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\",​\n \"partitionName\": \"partitionA\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 10,​\n# 11,​\n# 12,​\n# 13,​\n# 14,​\n# 15,​\n# 16,​\n# 17,​\n# 18,​\n# 19​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Insert Entities​","anchorList":[{"label":"插入實體","href":"Insert-Entities​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"插入實體到集合","href":"Insert-Entities-into-a-Collection​","type":2,"isActive":false},{"label":"將實體插入分區","href":"Insert-Entities-into-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.md b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.md new file mode 100644 index 000000000..e25e1a956 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/insert-update-delete.md @@ -0,0 +1,362 @@ +--- +id: insert-update-delete.md +summary: 集合中的實體是共用相同欄位集的資料記錄。每個資料記錄中的欄位值會形成一個實體。本頁面介紹如何在集合中插入實體。 +title: 插入實體 +--- +

    插入實體

    集合中的實體是共用相同欄位集的資料記錄。每個資料記錄中的欄位值會形成一個實體。本頁面介紹如何在集合中插入實體。

    +

    概述

    在 Milvus 中,實體指的是一個資料集中共享相同結構描述的資料記錄,每一行中每個欄位的資料構成一個實體。因此,同一 Collection 中的 Entity 具有相同的屬性(例如欄位名稱、資料類型和其他約束)。

    +

    當插入 Entity 到一個 Collection 時,要插入的 Entity 只有包含 Schema 中定義的所有欄位,才能成功地加入。插入的 Entity 將按照插入的順序進入一個名為_default的 Partition。只要某個 Partition 存在,您也可以在插入請求中指定 Partition 名稱,將 Entity 插入到該 Partition 中。

    +

    Milvus 也支援動態欄位,以維持 Collection 的可擴展性。當啟用動態欄位時,您可以插入 Schema 中未定義的欄位到 Collection 中。這些欄位和值會以 key-value 對的形式儲存在一個名為$meta 的保留欄位中。關於動態欄位的更多資訊,請參閱動態欄位。

    +

    插入實體到集合

    在插入資料之前,您需要依照 Schema 將資料組織成一列詞典,每個詞典代表一個 Entity,並包含 Schema 定義的所有欄位。如果 Collection 啟用了動態欄位,每個辭典也可以包含 Schema 中未定義的欄位。

    +

    在本節中,您將插入 Entities 到以快速設定方式建立的 Collection 中。以這種方式建立的集合只有兩個欄位,分別命名為idvector。此外,這個 Collection 啟用了動態欄位,因此範例程式碼中的 Entities 包含一個 Schema 中沒有定義的欄位 **color **。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    將實體插入分區

    您也可以將實體插入指定的分割區。以下的程式碼片段假設您的集合中有一個名為PartitionA的分割區。

    + +
    data=[​
    +    {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="quick_setup",​
    +    # highlight-next-line​
    +    partition_name="partitionA",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +import java.util.*;​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.19886812562848388f, 0.06023560599112088f, 0.6976963061752597f, 0.2614474506242501f, 0.838729485096104f], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [0.43742130801983836f, -0.5597502546264526f, 0.6457887650909682f, 0.7894058910881185f, 0.20785793220625592f], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3172005263489739f, 0.9719044792798428f, -0.36981146090600725f, -0.4860894583077995f, 0.95791889146345f], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.4452349528804562f, -0.8757026943054742f, 0.8220779437047674f, 0.46406290649483184f, 0.30337481143159106f], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [0.985825131989184f, -0.8144651566660419f, 0.6299267002202009f, 0.1206906911183383f, -0.1446277761879955f], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [0.8371977790571115f, -0.015764369584852833f, -0.31062937026679327f, -0.562666951622192f, -0.8984947637863987f], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.33445148015177995f, -0.2567135004164067f, 0.8987539745369246f, 0.9402995886420709f, 0.5378064918413052f], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [0.39524717779832685f, 0.4000257286739164f, -0.5890507376891594f, -0.8650502298996872f, -0.6140360785406336f], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.5718280481994695f, 0.24070317428066512f, -0.3737913482606834f, -0.06726932177492717f, -0.6980531615588608f], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[10, 11, 12, 13, 14, 15, 16, 17, 18, 19])​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 10, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 11, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 12, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 13, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 14, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 15, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 16, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 17, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 18, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 19, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_name: "partitionA",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 11, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 12, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 13, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 14, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 15, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 16, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 17, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 18, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 19, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup",​
    +    "partitionName": "partitionA"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             10,​
    +#             11,​
    +#             12,​
    +#             13,​
    +#             14,​
    +#             15,​
    +#             16,​
    +#             17,​
    +#             18,​
    +#             19​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.json b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.json new file mode 100644 index 000000000..7981f30f5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ndata=[​\n {\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"},​\n {\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"},​\n {\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"},​\n {\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"},​\n {\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"},​\n {\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"},​\n {\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"},​\n {\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"},​\n {\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"},​\n {\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}​\n]​\n​\nres = client.upsert(​\n collection_name='quick_setup',​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \\\"color\\\": \\\"black_9898\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \\\"color\\\": \\\"red_7319\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \\\"color\\\": \\\"white_6465\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \\\"color\\\": \\\"orange_7580\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \\\"color\\\": \\\"red_3314\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \\\"color\\\": \\\"black_9955\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \\\"color\\\": \\\"yellow_2461\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \\\"color\\\": \\\"white_5015\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \\\"color\\\": \\\"purple_6414\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \\\"color\\\": \\\"brown_7231\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\ndata = [​\n {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: \"black_9898\"},​\n {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: \"red_7319\"},​\n {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: \"white_6465\"},​\n {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: \"orange_7580\"},​\n {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: \"red_3314\"},​\n {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: \"black_9955\"},​\n {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: \"yellow_2461\"},​\n {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: \"white_5015\"},​\n {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: \"purple_6414\"},​\n {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: \"brown_7231\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","data=[​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n]​\n​\nres = client.upsert(​\n collection_name=\"quick_setup\",​\n data=data,​\n partition_name=\"partitionA\"​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'upsert_count': 10}​\n\n","import io.milvus.v2.service.vector.request.UpsertReq;​\nimport io.milvus.v2.service.vector.response.UpsertResp;​\n​\n​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 10, \\\"vector\\\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \\\"color\\\": \\\"black_3651\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 11, \\\"vector\\\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \\\"color\\\": \\\"grey_2049\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 12, \\\"vector\\\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \\\"color\\\": \\\"blue_6168\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 13, \\\"vector\\\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \\\"color\\\": \\\"blue_1672\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 14, \\\"vector\\\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \\\"color\\\": \\\"pink_1601\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 15, \\\"vector\\\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \\\"color\\\": \\\"yellow_9925\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 16, \\\"vector\\\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \\\"color\\\": \\\"orange_9872\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 17, \\\"vector\\\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \\\"color\\\": \\\"red_6450\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 18, \\\"vector\\\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \\\"color\\\": \\\"purple_7392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 19, \\\"vector\\\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \\\"color\\\": \\\"pink_4996\\\"}\", JsonObject.class)​\n);​\n​\nUpsertReq upsertReq = UpsertReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionName(\"partitionA\")​\n .data(data)​\n .build();​\n​\nUpsertResp upsertResp = client.upsert(upsertReq);​\nSystem.out.println(upsertResp);​\n​\n// Output:​\n//​\n// UpsertResp(upsertCnt=10)​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 6. Upsert data in partitions​\ndata = [​\n {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: \"black_3651\"},​\n {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: \"grey_2049\"},​\n {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: \"blue_6168\"},​\n {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: \"blue_1672\"},​\n {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: \"pink_1601\"},​\n {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: \"yellow_9925\"},​\n {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: \"orange_9872\"},​\n {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: \"red_6450\"},​\n {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: \"purple_7392\"},​\n {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: \"pink_4996\"}​\n]​\n​\nres = await client.upsert({​\n collection_name: \"quick_setup\",​\n data: data,​\n partition_name: \"partitionA\"​\n})​\n​\nconsole.log(res.upsert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"},​\n {\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"},​\n {\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"},​\n {\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"},​\n {\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"},​\n {\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"},​\n {\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"},​\n {\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"},​\n {\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"},​\n {\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}​\n ],​\n \"collectionName\": \"quick_setup\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"upsertCount\": 10,​\n# \"upsertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n"],"headingContent":"Upsert Entities​","anchorList":[{"label":"Upsert 實體","href":"Upsert-Entities​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"在集合中upsert實體","href":"Upsert-Entity-in-a-Collection​","type":2,"isActive":false},{"label":"在分區中倒插實體","href":"Upsert-Entities-in-a-Partition​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.md b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.md new file mode 100644 index 000000000..97266dfb9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/insert-and-delete/upsert-entities.md @@ -0,0 +1,360 @@ +--- +id: upsert-entities.md +title: Upsert 實體 +--- +

    Upsert 實體

    Upsert 操作結合了更新和插入資料的動作。Milvus 通過檢查主鍵是否存在來決定執行更新或插入操作。本節將介紹如何 Upsert 一個實體,以及在不同情況下 Upsert 操作的具體行為。

    +

    概述

    當你需要更新一個集合中的實體,或者不確定是更新還是插入,你可以嘗試使用 Upsert 操作。使用此操作時,必須確保 Upsert 請求中包含的 Entity 包含主索引鍵,否則會發生錯誤。接收到 Upsert 請求後,Milvus 將執行以下過程。

    +
      +
    1. 檢查集合的主字段是否啟用了 AutoId。

      +

      a. 如果是,Milvus 將以自動產生的主索引鍵取代 Entity 中的主索引鍵,並插入資料。

      +

      b.如果沒有,Milvus 會使用 Entity 帶來的主索引鍵插入資料。

    2. +
    3. 根據 Upsert 請求中包含的 Entity 的主鍵值執行刪除操作。

    4. +
    +

    + + Upsert Entities + psert實體

    +

    在集合中upsert實體

    在這一節中,你將把實體上載到以快速設置方式創建的集合中。以這種方式創建的集合只有兩個欄位,分別命名為idvector。此外,這個 Collection 啟用了動態欄位,因此範例程式碼中的 Entities 包含一個在 Schema 中沒有定義的欄位color

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +data=[​
    +    {"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_9898"},​
    +    {"id": 1, "vector": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], "color": "red_7319"},​
    +    {"id": 2, "vector": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], "color": "white_6465"},​
    +    {"id": 3, "vector": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], "color": "orange_7580"},​
    +    {"id": 4, "vector": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], "color": "red_3314"},​
    +    {"id": 5, "vector": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], "color": "black_9955"},​
    +    {"id": 6, "vector": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], "color": "yellow_2461"},​
    +    {"id": 7, "vector": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], "color": "white_5015"},​
    +    {"id": 8, "vector": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], "color": "purple_6414"},​
    +    {"id": 9, "vector": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], "color": "brown_7231"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name='quick_setup',​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], \"color\": \"black_9898\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], \"color\": \"red_7319\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], \"color\": \"white_6465\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], \"color\": \"orange_7580\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], \"color\": \"red_3314\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], \"color\": \"black_9955\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], \"color\": \"yellow_2461\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], \"color\": \"white_5015\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], \"color\": \"purple_6414\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], \"color\": \"brown_7231\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +data = [​
    +    {id: 0, vector: [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], color: "black_9898"},​
    +    {id: 1, vector: [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], color: "red_7319"},​
    +    {id: 2, vector: [-0.8864122635045097, 0.9260170474445351, 0.801326976181461, 0.6383943392381306, 0.7563037341572827], color: "white_6465"},​
    +    {id: 3, vector: [0.14594326235891586, -0.3775407299900644, -0.3765479013078812, 0.20612075380355122, 0.4902678929632145], color: "orange_7580"},​
    +    {id: 4, vector: [0.4548498669607359, -0.887610217681605, 0.5655081329910452, 0.19220509387904117, 0.016513983433433577], color: "red_3314"},​
    +    {id: 5, vector: [0.11755001847051827, -0.7295149788999611, 0.2608115847524266, -0.1719167007897875, 0.7417611743754855], color: "black_9955"},​
    +    {id: 6, vector: [0.9363032158314308, 0.030699901477745373, 0.8365910312319647, 0.7823840208444011, 0.2625222076909237], color: "yellow_2461"},​
    +    {id: 7, vector: [0.0754823906014721, -0.6390658668265143, 0.5610517334334937, -0.8986261118798251, 0.9372056764266794], color: "white_5015"},​
    +    {id: 8, vector: [-0.3038434006935904, 0.1279149203380523, 0.503958664270957, -0.2622661156746988, 0.7407627307791929], color: "purple_6414"},​
    +    {id: 9, vector: [-0.7125086947677588, -0.8050968321012257, -0.32608864121785786, 0.3255654958645424, 0.26227968923834233], color: "brown_7231"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    在分區中倒插實體

    您也可以將實體插入指定的分割區。以下的程式碼片段假設您的集合中有一個名為PartitionA的分割區。

    + +
    data=[​
    +    {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +    {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +    {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +    {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +    {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +    {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +    {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +    {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +    {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +    {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +]​
    +​
    +res = client.upsert(​
    +    collection_name="quick_setup",​
    +    data=data,​
    +    partition_name="partitionA"​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'upsert_count': 10}​
    +
    +
    +
    import io.milvus.v2.service.vector.request.UpsertReq;​
    +import io.milvus.v2.service.vector.response.UpsertResp;​
    +​
    +​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 10, \"vector\": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], \"color\": \"black_3651\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 11, \"vector\": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], \"color\": \"grey_2049\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 12, \"vector\": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], \"color\": \"blue_6168\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 13, \"vector\": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], \"color\": \"blue_1672\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 14, \"vector\": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], \"color\": \"pink_1601\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 15, \"vector\": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], \"color\": \"yellow_9925\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 16, \"vector\": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], \"color\": \"orange_9872\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 17, \"vector\": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], \"color\": \"red_6450\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 18, \"vector\": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], \"color\": \"purple_7392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 19, \"vector\": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], \"color\": \"pink_4996\"}", JsonObject.class)​
    +);​
    +​
    +UpsertReq upsertReq = UpsertReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionName("partitionA")​
    +        .data(data)​
    +        .build();​
    +​
    +UpsertResp upsertResp = client.upsert(upsertReq);​
    +System.out.println(upsertResp);​
    +​
    +// Output:​
    +//​
    +// UpsertResp(upsertCnt=10)​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 6. Upsert data in partitions​
    +data = [​
    +    {id: 10, vector: [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], color: "black_3651"},​
    +    {id: 11, vector: [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], color: "grey_2049"},​
    +    {id: 12, vector: [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], color: "blue_6168"},​
    +    {id: 13, vector: [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], color: "blue_1672"},​
    +    {id: 14, vector: [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], color: "pink_1601"},​
    +    {id: 15, vector: [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], color: "yellow_9925"},​
    +    {id: 16, vector: [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], color: "orange_9872"},​
    +    {id: 17, vector: [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], color: "red_6450"},​
    +    {id: 18, vector: [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], color: "purple_7392"},​
    +    {id: 19, vector: [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], color: "pink_4996"}​
    +]​
    +​
    +res = await client.upsert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +    partition_name: "partitionA"​
    +})​
    +​
    +console.log(res.upsert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/upsert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 10, "vector": [0.06998888224297328, 0.8582816610326578, -0.9657938677934292, 0.6527905683627726, -0.8668460657158576], "color": "black_3651"},​
    +        {"id": 11, "vector": [0.6060703043917468, -0.3765080534566074, -0.7710758854987239, 0.36993888322346136, 0.5507513364206531], "color": "grey_2049"},​
    +        {"id": 12, "vector": [-0.9041813104515337, -0.9610546012461163, 0.20033003106083358, 0.11842506351635174, 0.8327356724591011], "color": "blue_6168"},​
    +        {"id": 13, "vector": [0.3202914977909075, -0.7279137773695252, -0.04747830871620273, 0.8266053056909548, 0.8277957187455489], "color": "blue_1672"},​
    +        {"id": 14, "vector": [0.2975811497890859, 0.2946936202691086, 0.5399463833894609, 0.8385334966677529, -0.4450543984655133], "color": "pink_1601"},​
    +        {"id": 15, "vector": [-0.04697464305600074, -0.08509022265734134, 0.9067184632552001, -0.2281912685064822, -0.9747503428652762], "color": "yellow_9925"},​
    +        {"id": 16, "vector": [-0.9363075919673911, -0.8153981031085669, 0.7943039120490902, -0.2093886809842529, 0.0771191335807897], "color": "orange_9872"},​
    +        {"id": 17, "vector": [-0.050451522820639916, 0.18931572752321935, 0.7522886192190488, -0.9071793089474034, 0.6032647330692296], "color": "red_6450"},​
    +        {"id": 18, "vector": [-0.9181544231141592, 0.6700755998126806, -0.014174674636136642, 0.6325780463623432, -0.49662222164032976], "color": "purple_7392"},​
    +        {"id": 19, "vector": [0.11426945899602536, 0.6089190684002581, -0.5842735738352236, 0.057050610092692855, -0.035163433018196244], "color": "pink_4996"}​
    +    ],​
    +    "collectionName": "quick_setup"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "upsertCount": 10,​
    +#         "upsertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.json b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.json new file mode 100644 index 000000000..85ceec41e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nindex_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​\nindex_params.add_index(​\n field_name=\"category\", # Name of the scalar field to be indexed​\n index_type=\"BITMAP\", # Type of index to be created​\n index_name=\"category_bitmap_index\" # Name of the index to be created​\n)​\n​\nclient.create_index(​\n collection_name=\"my_collection\", # Specify the collection name​\n index_params=index_params​\n)​\n\n"],"headingContent":"BITMAP​","anchorList":[{"label":"位圖索引","href":"BITMAP​","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"建立位圖索引","href":"Create-a-bitmap-index","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.md b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.md new file mode 100644 index 000000000..4b80ff9b6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/bitmap.md @@ -0,0 +1,122 @@ +--- +id: bitmap.md +title: 位圖索引 +related_key: bitmap +summary: 位圖索引是一種有效率的索引技術,設計用來改善低心數標量欄位的查詢效能。 +--- +

    位圖索引

    位圖索引是一種有效率的索引技術,設計用來改善低卡片性標量欄位的查詢效能。Cardinality 指的是欄位中不同值的數量。具有較少不同元素的欄位被視為低卡片性。

    +

    此索引類型以精簡的二進位格式表示欄位值,並對其執行有效的位運算,有助於縮短標量值查詢的檢索時間。與其他類型的索引相比,位元圖索引在處理低心數欄位時,通常具有更高的空間效率和更快的查詢速度。

    +

    概述

    Bitmap 一詞由兩個字組合而成:BitMap。位元代表電腦中最小的資料單位,只能容納01 的值。在此上下文中,映射是指根據 0 和 1 應該被指定什麼值來轉換和組織資料的過程。

    +

    位圖索引由兩個主要部分組成:位圖和鍵。鍵代表索引欄位中的唯一值。每個唯一值都有一個對應的位元圖。這些位元圖的長度等於集合中記錄的數量。位圖中的每個位元對應集合中的一筆記錄。如果記錄中索引欄位的值與關鍵相符,對應的位就會被設定為1;否則就會被設為0

    +

    考慮一個具有CategoryPublic 欄位的文件集合。我們要擷取屬於Tech類別且開放給Public 的文件。在這種情況下,我們的位圖索引的鍵是TechPublic

    +

    + + Bitmap indexing + 位圖索引

    +

    如圖所示,CategoryPublic的位圖索引為

    +
      +
    • Tech:[1, 0, 1, 0, 0],這表示只有第 1 和第 3 個文件屬於Tech類別。

    • +
    • Public:[1, 0, 0, 1, 0],表示只有第 1 和第 4 個文件對公眾開放。

    • +
    +

    為了找出符合這兩個條件的文件,我們在這兩個位元圖上執行位相 AND 運算。

    +
      +
    • TechANDPublic:[1, 0, 0, 0, 0]
    • +
    +

    結果位圖 [1, 0, 0, 0, 0] 表示只有第一個文件(ID 1) 符合這兩個條件。透過使用位元圖索引和有效率的位元運算,我們可以快速縮小搜尋範圍,而不需要掃描整個資料集。

    +

    建立位圖索引

    要在 Milvus 中建立位圖索引,請使用create_index() 方法,並將index_type 參數設定為"BITMAP"

    +
    from pymilvus import MilvusClient​
    +​
    +index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​
    +index_params.add_index(​
    +    field_name="category", # Name of the scalar field to be indexed​
    +    index_type="BITMAP", # Type of index to be created​
    +    index_name="category_bitmap_index" # Name of the index to be created​
    +)​
    +​
    +client.create_index(​
    +    collection_name="my_collection", # Specify the collection name​
    +    index_params=index_params​
    +)​
    +
    +
    +

    在這個範例中,我們在my_collection 資料集中的category 欄位上建立位圖索引。add_index() 方法用來指定欄位名稱、索引類型和索引名稱。

    +

    一旦建立位圖索引,您就可以在查詢作業中使用filter 參數,根據索引欄位執行標量篩選。這可讓您使用位圖索引有效地縮窄搜尋結果的範圍。如需詳細資訊,請參閱元資料篩選

    +

    限制

      +
    • 位圖索引只支援非主鍵的標量欄位。

    • +
    • 欄位的資料類型必須是下列其中之一。

      +
        +
      • BOOL,INT8,INT16,INT32,INT64,VARCHAR

      • +
      • ARRAY (元素必須是下列其中之一: , , , , , )BOOL INT8 INT16 INT32 INT64 VARCHAR

      • +
    • +
    • 位圖索引不支援下列資料類型。

      +
        +
      • FLOAT,DOUBLE: 浮點類型與位圖索引的二進位性質不相容。

      • +
      • JSON:JSON 資料類型具有複雜的結構,無法使用位圖索引有效地表示。

      • +
    • +
    • 位圖索引不適用於高 cardinality 的欄位(即有大量不同值的欄位)。

      +
        +
      • 一般而言,當欄位的 cardinality 小於 500 時,位圖索引最為有效。

      • +
      • 當卡片性增加到超過這個臨界值時,位圖索引的效能優勢就會減弱,而且儲存開銷也會變得很大。

      • +
      • 對於高卡片數的欄位,請考慮使用其他索引技術,例如倒轉索引,這取決於您的特定使用個案和查詢需求。

      • +
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.json b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.json new file mode 100644 index 000000000..f8a10308b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.json @@ -0,0 +1 @@ +{"codeList":["# Auto indexing\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\nindex_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters\n\nindex_params.add_index(\n field_name=\"scalar_1\", # Name of the scalar field to be indexed\n index_type=\"\", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n index_name=\"default_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"default_index\") // Name of the index to be created\n .indexType(\"\") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"default_index\", // Name of the index to be created\n index_type: \"\" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.\n})\n","index_params = MilvusClient.prepare_index_params() # Prepare an IndexParams object\n\nindex_params.add_index(\n field_name=\"scalar_2\", # Name of the scalar field to be indexed\n index_type=\"INVERTED\", # Type of index to be created\n index_name=\"inverted_index\" # Name of the index to be created\n)\n\nclient.create_index(\n collection_name=\"test_scalar_index\", # Specify the collection name\n index_params=index_params\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\nIndexParam indexParamForScalarField = IndexParam.builder()\n .fieldName(\"scalar_1\") // Name of the scalar field to be indexed\n .indexName(\"inverted_index\") // Name of the index to be created\n .indexType(\"INVERTED\") // Type of index to be created\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","await client.createIndex({\n collection_name: \"test_scalar_index\", // Specify the collection name\n field_name: \"scalar_1\", // Name of the scalar field to be indexed\n index_name: \"inverted_index\", // Name of the index to be created\n index_type: \"INVERTED\" // Type of index to be created\n})\n","client.list_indexes(\n collection_name=\"test_scalar_index\" # Specify the collection name\n)\n\n# Output:\n# ['default_index','inverted_index']\n","import java.util.List;\nimport io.milvus.v2.service.index.request.ListIndexesReq;\n\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"test_scalar_index\") // Specify the collection name\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ]\n","res = await client.listIndexes({\n collection_name: 'test_scalar_index'\n})\n\nconsole.log(res.indexes)\n\n// Output:\n// [\n// \"default_index\",\n// \"inverted_index\"\n// ] \n"],"headingContent":"Index Scalar Fields","anchorList":[{"label":"索引標量欄位","href":"Index-Scalar-Fields","type":1,"isActive":false},{"label":"標量索引的類型","href":"Types-of-scalar-indexing","type":2,"isActive":false},{"label":"自動索引","href":"Auto-indexing","type":2,"isActive":false},{"label":"自訂索引","href":"Custom-indexing","type":2,"isActive":false},{"label":"驗證結果","href":"Verifying-the-result","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.md b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.md new file mode 100644 index 000000000..1418821ee --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-scalar-fields.md @@ -0,0 +1,324 @@ +--- +id: index-scalar-fields.md +order: 2 +summary: 本指南將引導您為整數、字串等欄位建立及設定標量索引。 +title: 索引標量欄位 +--- +

    索引標量欄位

    在 Milvus 中,標量索引用來加速以特定的非向量欄位值進行元篩選,類似於傳統的資料庫索引。本指南將教您如何為整數、字串等欄位建立及設定標量索引。

    +

    標量索引的類型

      +
    • 自動索引:Milvus 根據標量字段的資料類型自動決定索引類型。這適用於不需要控制特定索引類型的情況。

    • +
    • 自訂索引:您可以指定確切的索引類型,例如反向索引或位圖索引。這提供對索引類型選擇的更多控制。

    • +
    +

    自動索引

    +

    若要使用自動索引,請省略以下的index_type參數 add_index()中省略 index_type 參數,這樣 Milvus 可以根據標量值欄位類型推斷索引類型。

    +
    +
    +

    要使用自動索引,請省略在 IndexParam中省略 indexType 參數,這樣 Milvus 可以根據標量值欄位類型推斷索引類型。

    +
    +
    +

    若要使用自動索引,請省略...中的index_type參數。 createIndex()中省略 index_type 參數,這樣 Milvus 就可以根據標量值欄位類型推斷索引類型。

    +
    +

    標量資料類型與預設索引演算法之間的對應關係,請參考 標量欄位索引演算法

    + +
    # Auto indexing
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +index_params = MilvusClient.prepare_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters
    +
    +index_params.add_index(
    +    field_name="scalar_1", # Name of the scalar field to be indexed
    +    index_type="", # Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    index_name="default_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("default_index") // Name of the index to be created
    +    .indexType("") // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "default_index", // Name of the index to be created
    +    index_type: "" // Type of index to be created. For auto indexing, leave it empty or omit this parameter.
    +})
    +
    +

    自訂索引

    +

    若要使用自訂索引,請在 add_index().

    +
    +
    +

    若要使用自訂索引,請使用.NET 的indexType參數指定特定的索引類型。 IndexParam.

    +
    +
    +

    要使用自訂索引,請使用.NET Framework中的index_type參數指定特定的索引類型。 createIndex().

    +
    +

    下面的範例為標量欄位建立了一個倒轉索引scalar_2

    + +
    index_params = MilvusClient.prepare_index_params() #  Prepare an IndexParams object
    +
    +index_params.add_index(
    +    field_name="scalar_2", # Name of the scalar field to be indexed
    +    index_type="INVERTED", # Type of index to be created
    +    index_name="inverted_index" # Name of the index to be created
    +)
    +
    +client.create_index(
    +  collection_name="test_scalar_index", # Specify the collection name
    +  index_params=index_params
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +IndexParam indexParamForScalarField = IndexParam.builder()
    +    .fieldName("scalar_1") // Name of the scalar field to be indexed
    +    .indexName("inverted_index") // Name of the index to be created
    +    .indexType("INVERTED") // Type of index to be created
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("test_scalar_index") // Specify the collection name
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    await client.createIndex({
    +    collection_name: "test_scalar_index", // Specify the collection name
    +    field_name: "scalar_1", // Name of the scalar field to be indexed
    +    index_name: "inverted_index", // Name of the index to be created
    +    index_type: "INVERTED" // Type of index to be created
    +})
    +
    +
    +

    方法與參數

    +
      +
    • prepare_index_params()

      +

      準備一個IndexParams物件。

    • +
    • add_index()

      +

      新增索引配置到IndexParams物件。

      +
        +
      • field_name(string)

        +

        要建立索引的標量欄位名稱。

      • +
      • index_type(字串):

        +

        要建立的標量索引類型。對於隱含索引,請留空或省略此參數。

        +

        對於自訂索引,有效值為

        +
          +
        • INVERTED: (建議) 反向索引由包含所有按字母順序排序的標記化字詞的詞彙字典組成。如需詳細資訊,請參閱標量索引

        • +
        • STL_SORT:使用標準模板函式庫排序演算法對標量字段排序。僅支援數值欄位 (例如:INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。

        • +
        • Trie:樹狀資料結構,用於快速前綴搜尋和檢索。支援 VARCHAR 欄位。

        • +
      • +
      • index_name(字串)

        +

        要建立的標量索引名稱。每個標量欄位支援一個索引。

      • +
    • +
    • create_index()

      +

      在指定的集合中建立索引。

      +
        +
      • collection_name(字串)

        +

        要建立索引的集合名稱。

      • +
      • index_params

        +

        包含索引設定的IndexParams物件。

      • +
    • +
    +
    +
    +

    方法與參數

    +
      +
    • IndexParam準備一個 IndexParam 物件。
        +
      • fieldName(String) 要建立索引的標量欄位名稱。
      • +
      • indexName(字串) 要建立的標量索引名稱。每個標量欄位支援一個索引。
      • +
      • indexType(字串) 要建立的標量索引類型。對於隱含索引,請將它留空或省略此參數。 對於自訂索引,有效值為:
          +
        • INVERTED: (建議) 反向索引由包含按字母順序排序的所有標記化字詞的詞彙字典組成。如需詳細資訊,請參閱標量索引
        • +
        • STL_SORT:使用標準模板函式庫排序演算法對標量字段排序。支援布林欄位和數值欄位 (例如:INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。
        • +
        • Trie:一種樹狀資料結構,用於快速前綴搜尋和檢索。支援 VARCHAR 欄位。
        • +
      • +
    • +
    • CreateIndexReq在指定的集合中建立索引。
        +
      • collectionName(String) 建立索引的集合名稱。
      • +
      • indexParams(List) 包含索引配置的 IndexParam 物件清單。
      • +
    • +
    +
    +
    +

    方法和參數

    +
      +
    • 建立索引

      +

      在指定的集合中建立索引。

      +
        +
      • collection_name(string) 建立索引的集合名稱。
      • +
      • field_name(字串) 要建立索引的標量欄位名稱。
      • +
      • index_name(string) 要建立的標量索引的名稱。每個標量欄位支援一個索引。
      • +
      • index_type(string) 要建立的標量索引類型。對於隱含索引,請將它留空或省略此參數。 對於自訂索引,有效值為:
          +
        • INVERTED: (建議) 反向索引由包含所有按字母順序排序的標記化字詞的詞彙字典組成。如需詳細資訊,請參閱標量索引
        • +
        • STL_SORT:使用標準模板函式庫排序演算法對標量字段排序。支援布林欄位和數值欄位 (例如:INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。
        • +
        • Trie:一種樹狀資料結構,用於快速前綴搜尋和檢索。支援 VARCHAR 欄位。
        • +
      • +
    • +
    +
    +

    驗證結果

    +

    使用 list_indexes()方法驗證標量索引的建立:

    +
    +
    +

    使用listIndexes() 方法驗證標量索引的建立:

    +
    +
    +

    使用listIndexes() 方法驗證標量索引的建立:

    +
    + +
    client.list_indexes(
    +    collection_name="test_scalar_index"  # Specify the collection name
    +)
    +
    +# Output:
    +# ['default_index','inverted_index']
    +
    +
    import java.util.List;
    +import io.milvus.v2.service.index.request.ListIndexesReq;
    +
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("test_scalar_index")  // Specify the collection name
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]
    +
    +
    res = await client.listIndexes({
    +    collection_name: 'test_scalar_index'
    +})
    +
    +console.log(res.indexes)
    +
    +// Output:
    +// [
    +//     "default_index",
    +//     "inverted_index"
    +// ]   
    +
    +

    限制

      +
    • 目前,標量索引支援 INT8、INT16、INT32、INT64、FLOAT、DOUBLE、BOOL、VARCHAR 及 ARRAY 資料類型,但不支援 JSON 資料類型。
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.json b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.json new file mode 100644 index 000000000..44e344928 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType\n\n# 1. Set up a Milvus client\nclient = MilvusClient(\n uri=\"http://localhost:19530\"\n)\n\n# 2. Create schema\n# 2.1. Create schema\nschema = MilvusClient.create_schema(\n auto_id=False,\n enable_dynamic_field=True,\n)\n\n# 2.2. Add fields to schema\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)\n\n# 3. Create collection\nclient.create_collection(\n collection_name=\"customized_setup\", \n schema=schema, \n)\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nString CLUSTER_ENDPOINT = \"http://localhost:19530\";\n\n// 1. Connect to Milvus server\nConnectConfig connectConfig = ConnectConfig.builder()\n .uri(CLUSTER_ENDPOINT)\n .build();\n\nMilvusClientV2 client = new MilvusClientV2(connectConfig);\n\n// 2. Create a collection\n\n// 2.1 Create schema\nCreateCollectionReq.CollectionSchema schema = client.createSchema();\n\n// 2.2 Add fields to schema\nschema.addField(AddFieldReq.builder().fieldName(\"id\").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());\nschema.addField(AddFieldReq.builder().fieldName(\"vector\").dataType(DataType.FloatVector).dimension(5).build());\n\n// 3 Create a collection without schema and index parameters\nCreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()\n.collectionName(\"customized_setup\")\n.collectionSchema(schema)\n.build();\n\nclient.createCollection(customizedSetupReq);\n","// 1. Set up a Milvus Client\nclient = new MilvusClient({address, token});\n\n// 2. Define fields for the collection\nconst fields = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n autoID: false\n },\n {\n name: \"vector\",\n data_type: DataType.FloatVector,\n dim: 5\n },\n]\n\n// 3. Create a collection\nres = await client.createCollection({\n collection_name: \"customized_setup\",\n fields: fields,\n})\n\nconsole.log(res.error_code) \n\n// Output\n// \n// Success\n// \n","# 4.1. Set up the index parameters\nindex_params = MilvusClient.prepare_index_params()\n\n# 4.2. Add an index on the vector field.\nindex_params.add_index(\n field_name=\"vector\",\n metric_type=\"COSINE\",\n index_type=\"IVF_FLAT\",\n index_name=\"vector_index\",\n params={ \"nlist\": 128 }\n)\n\n# 4.3. Create an index file\nclient.create_index(\n collection_name=\"customized_setup\",\n index_params=index_params,\n sync=False # Whether to wait for index creation to complete before returning. Defaults to True.\n)\n","import io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.index.request.CreateIndexReq;\n\n// 4 Prepare index parameters\n\n// 4.2 Add an index for the vector field \"vector\"\nIndexParam indexParamForVectorField = IndexParam.builder()\n .fieldName(\"vector\")\n .indexName(\"vector_index\")\n .indexType(IndexParam.IndexType.IVF_FLAT)\n .metricType(IndexParam.MetricType.COSINE)\n .extraParams(Map.of(\"nlist\", 128))\n .build();\n\nList indexParams = new ArrayList<>();\nindexParams.add(indexParamForVectorField);\n\n// 4.3 Crate an index file\nCreateIndexReq createIndexReq = CreateIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexParams(indexParams)\n .build();\n\nclient.createIndex(createIndexReq);\n","// 4. Set up index for the collection\n// 4.1. Set up the index parameters\nres = await client.createIndex({\n collection_name: \"customized_setup\",\n field_name: \"vector\",\n index_type: \"AUTOINDEX\",\n metric_type: \"COSINE\", \n index_name: \"vector_index\",\n params: { \"nlist\": 128 }\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n","# 5. Describe index\nres = client.list_indexes(\n collection_name=\"customized_setup\"\n)\n\nprint(res)\n\n# Output\n#\n# [\n# \"vector_index\",\n# ]\n\nres = client.describe_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n\nprint(res)\n\n# Output\n#\n# {\n# \"index_type\": ,\n# \"metric_type\": \"COSINE\",\n# \"field_name\": \"vector\",\n# \"index_name\": \"vector_index\"\n# }\n","import io.milvus.v2.service.index.request.DescribeIndexReq;\nimport io.milvus.v2.service.index.response.DescribeIndexResp;\n\n// 5. Describe index\n// 5.1 List the index names\nListIndexesReq listIndexesReq = ListIndexesReq.builder()\n .collectionName(\"customized_setup\")\n .build();\n\nList indexNames = client.listIndexes(listIndexesReq);\n\nSystem.out.println(indexNames);\n\n// Output:\n// [\n// \"vector_index\"\n// ]\n\n// 5.2 Describe an index\nDescribeIndexReq describeIndexReq = DescribeIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nDescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);\n\nSystem.out.println(JSONObject.toJSON(describeIndexResp));\n\n// Output:\n// {\n// \"metricType\": \"COSINE\",\n// \"indexType\": \"AUTOINDEX\",\n// \"fieldName\": \"vector\",\n// \"indexName\": \"vector_index\"\n// }\n","// 5. Describe the index\nres = await client.describeIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(JSON.stringify(res.index_descriptions, null, 2))\n\n// Output\n// \n// [\n// {\n// \"params\": [\n// {\n// \"key\": \"index_type\",\n// \"value\": \"AUTOINDEX\"\n// },\n// {\n// \"key\": \"metric_type\",\n// \"value\": \"COSINE\"\n// }\n// ],\n// \"index_name\": \"vector_index\",\n// \"indexID\": \"449007919953063141\",\n// \"field_name\": \"vector\",\n// \"indexed_rows\": \"0\",\n// \"total_rows\": \"0\",\n// \"state\": \"Finished\",\n// \"index_state_fail_reason\": \"\",\n// \"pending_index_rows\": \"0\"\n// }\n// ]\n// \n","# 6. Drop index\nclient.drop_index(\n collection_name=\"customized_setup\",\n index_name=\"vector_index\"\n)\n","// 6. Drop index\n\nDropIndexReq dropIndexReq = DropIndexReq.builder()\n .collectionName(\"customized_setup\")\n .indexName(\"vector_index\")\n .build();\n\nclient.dropIndex(dropIndexReq);\n","// 6. Drop the index\nres = await client.dropIndex({\n collection_name: \"customized_setup\",\n index_name: \"vector_index\"\n})\n\nconsole.log(res.error_code)\n\n// Output\n// \n// Success\n// \n"],"headingContent":"Index Vector Fields","anchorList":[{"label":"索引向量欄位","href":"Index-Vector-Fields","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"準備工作","href":"Preparations","type":2,"isActive":false},{"label":"為資料集建立索引","href":"Index-a-Collection","type":2,"isActive":false},{"label":"檢查索引詳細資料","href":"Check-Index-Details","type":2,"isActive":false},{"label":"刪除索引","href":"Drop-an-Index","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.md b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.md new file mode 100644 index 000000000..a52008c8f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-vector-fields.md @@ -0,0 +1,591 @@ +--- +id: index-vector-fields.md +order: 1 +summary: 本指南將教您如何在集合中的向量欄位上建立和管理索引的基本操作。 +title: 索引向量欄位 +--- +

    索引向量欄位

    本指南將教您如何在集合中的向量欄位上建立和管理索引的基本操作。

    +

    概述

    利用索引檔案中儲存的元資料,Milvus 將資料組織成專門的結構,方便在搜尋或查詢時快速檢索所需的資訊。

    +

    Milvus 提供多種索引類型和度量來排序欄位值,以進行有效的相似性搜尋。下表列出了不同向量欄位類型所支援的索引類型和度量。目前,Milvus 支援各種類型的向量資料,包括浮點內嵌 (通常稱為浮點向量或密集向量)、二進位內嵌 (也稱為二進位向量),以及稀疏內嵌 (也稱為稀疏向量)。如需詳細資訊,請參閱「記憶體內索引相似度指標」。

    + +
    + + + + + + + + + + + + + +
    度量類型索引類型
    • 歐氏距離 (L2)
    • 內積 (IP)
    • 余弦相似度 (COSINE)
    • 平面
    • IVF_FLAT
    • IVF_SQ8
    • IVF_PQ
    • GPU_IVF_FLAT
    • GPU_IVF_PQ
    • HNSW
    • DISKANN
    +
    +
    + + + + + + + + + + + + + +
    公制類型索引類型
    • Jaccard (JACCARD)
    • 漢明 (HAMMING)
    • BIN_FLAT
    • BIN_IVF_FLAT
    +
    +
    + + + + + + + + + + + + + +
    公制類型索引類型
    IP
    • Sparse_inverted_index
    • SPARSE_WAND
    +
    +

    建議為向量欄位和經常被存取的標量欄位建立索引。

    +

    準備工作

    正如在管理集合中解釋的,如果在集合創建請求中指定了以下任何條件,Milvus 會在創建集合時自動生成索引並將其載入記憶體:

    +
      +
    • 向量欄位的維度和度量類型,或

    • +
    • 模式和索引參數。

    • +
    +

    下面的程式碼片段重新利用現有程式碼,建立與 Milvus 實例的連線,並在未指定索引參數的情況下建立集合。在這種情況下,該集合缺乏索引,並保持未載入狀態。

    +
    +

    要準備索引,請使用 MilvusClient連接至 Milvus 伺服器,並使用 create_schema(), add_field()create_collection().

    +
    +
    +

    要準備索引,使用 MilvusClientV2連接至 Milvus 伺服器,並使用 createSchema(), addField()createCollection().

    +
    +
    +

    要準備索引,使用 MilvusClient連接至 Milvus 伺服器,並使用 createCollection().

    +
    + +
    from pymilvus import MilvusClient, DataType
    +
    +# 1. Set up a Milvus client
    +client = MilvusClient(
    +    uri="http://localhost:19530"
    +)
    +
    +# 2. Create schema
    +# 2.1. Create schema
    +schema = MilvusClient.create_schema(
    +    auto_id=False,
    +    enable_dynamic_field=True,
    +)
    +
    +# 2.2. Add fields to schema
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
    +
    +# 3. Create collection
    +client.create_collection(
    +    collection_name="customized_setup", 
    +    schema=schema, 
    +)
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +String CLUSTER_ENDPOINT = "http://localhost:19530";
    +
    +// 1. Connect to Milvus server
    +ConnectConfig connectConfig = ConnectConfig.builder()
    +    .uri(CLUSTER_ENDPOINT)
    +    .build();
    +
    +MilvusClientV2 client = new MilvusClientV2(connectConfig);
    +
    +// 2. Create a collection
    +
    +// 2.1 Create schema
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();
    +
    +// 2.2 Add fields to schema
    +schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
    +schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());
    +
    +// 3 Create a collection without schema and index parameters
    +CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
    +.collectionName("customized_setup")
    +.collectionSchema(schema)
    +.build();
    +
    +client.createCollection(customizedSetupReq);
    +
    +
    // 1. Set up a Milvus Client
    +client = new MilvusClient({address, token});
    +
    +// 2. Define fields for the collection
    +const fields = [
    +    {
    +        name: "id",
    +        data_type: DataType.Int64,
    +        is_primary_key: true,
    +        autoID: false
    +    },
    +    {
    +        name: "vector",
    +        data_type: DataType.FloatVector,
    +        dim: 5
    +    },
    +]
    +
    +// 3. Create a collection
    +res = await client.createCollection({
    +    collection_name: "customized_setup",
    +    fields: fields,
    +})
    +
    +console.log(res.error_code)  
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    +

    為資料集建立索引

    +

    要為一個集合建立索引或為一個集合建立索引,使用 prepare_index_params()來準備索引參數,並使用 create_index()來建立索引。

    +
    +
    +

    若要為集合建立索引或為集合建立索引,請使用 IndexParam準備索引參數和 createIndex()來建立索引。

    +
    +
    +

    若要為集合建立索引或為集合建立索引,請使用 createIndex().

    +
    + +
    # 4.1. Set up the index parameters
    +index_params = MilvusClient.prepare_index_params()
    +
    +# 4.2. Add an index on the vector field.
    +index_params.add_index(
    +    field_name="vector",
    +    metric_type="COSINE",
    +    index_type="IVF_FLAT",
    +    index_name="vector_index",
    +    params={ "nlist": 128 }
    +)
    +
    +# 4.3. Create an index file
    +client.create_index(
    +    collection_name="customized_setup",
    +    index_params=index_params,
    +    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
    +)
    +
    +
    import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.index.request.CreateIndexReq;
    +
    +// 4 Prepare index parameters
    +
    +// 4.2 Add an index for the vector field "vector"
    +IndexParam indexParamForVectorField = IndexParam.builder()
    +    .fieldName("vector")
    +    .indexName("vector_index")
    +    .indexType(IndexParam.IndexType.IVF_FLAT)
    +    .metricType(IndexParam.MetricType.COSINE)
    +    .extraParams(Map.of("nlist", 128))
    +    .build();
    +
    +List<IndexParam> indexParams = new ArrayList<>();
    +indexParams.add(indexParamForVectorField);
    +
    +// 4.3 Crate an index file
    +CreateIndexReq createIndexReq = CreateIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexParams(indexParams)
    +    .build();
    +
    +client.createIndex(createIndexReq);
    +
    +
    // 4. Set up index for the collection
    +// 4.1. Set up the index parameters
    +res = await client.createIndex({
    +    collection_name: "customized_setup",
    +    field_name: "vector",
    +    index_type: "AUTOINDEX",
    +    metric_type: "COSINE",   
    +    index_name: "vector_index",
    +    params: { "nlist": 128 }
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    參數說明
    field_name應用此物件的目標檔案名稱。
    metric_type用來測量向量間相似性的演算法。可能的值有IPL2COSINEJACCARDHAMMING。只有指定欄位為向量欄位時,此項才可用。如需詳細資訊,請參閱Milvus 支援的索引
    index_type用來排列特定欄位資料的演算法名稱。有關適用的演算法,請參閱「記憶體內索引」和「磁碟上索引」。
    index_name應用此物件後產生的索引檔案名稱。
    params指定索引類型的微調參數。有關可能的關鍵和值範圍的詳細資訊,請參閱「In-memory Index」。
    collection_name現有集合的名稱。
    index_params包含IndexParam物件清單的IndexParams物件。
    sync控制索引的建立方式與用戶端的請求有關。有效值:
    • True (預設):客戶端會等到索引完全建立後才傳回。這表示在過程完成之前,您不會收到回應。
    • False:用戶端在收到請求後立即返回,索引正在背景中建立。若要瞭解索引建立是否已完成,請使用describe_index()方法。
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    參數說明
    fieldName應用此 IndexParam 物件的目標欄位名稱。
    indexName應用此物件後所產生的索引檔案名稱。
    indexType用於排列特定欄位資料的演算法名稱。有關適用的演算法,請參閱「記憶體內索引」和「磁碟上索引」。
    metricType索引要使用的距離公制。可能的值為IPL2COSINEJACCARDHAMMING
    extraParams額外索引參數。如需詳細資訊,請參閱「記憶體索引」和「磁碟上索引」。
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    參數說明
    collection_name現有資料集的名稱。
    field_name要建立索引的欄位名稱。
    index_type要建立索引的類型。
    metric_type用於量測向量距離的度量類型。
    index_name要建立的索引名稱。
    params其他特定於索引的參數。
    +
    +

    注意事項

    +

    目前,您只能為集合中的每個欄位建立一個索引檔案。

    +
    +

    檢查索引詳細資料

    建立索引後,您可以檢查其詳細資料。

    +
    +

    要檢查索引詳細資訊,請使用 list_indexes()列出索引名稱,並使用 describe_index()來取得索引詳細資料。

    +
    +
    +

    要檢查索引詳細資訊,請使用 describeIndex()來取得索引詳細資料。

    +
    +
    +

    要檢查索引詳細資訊,請使用 describeIndex()來取得索引詳細資料。

    +
    + +
    # 5. Describe index
    +res = client.list_indexes(
    +    collection_name="customized_setup"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# [
    +#     "vector_index",
    +# ]
    +
    +res = client.describe_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +print(res)
    +
    +# Output
    +#
    +# {
    +#     "index_type": ,
    +#     "metric_type": "COSINE",
    +#     "field_name": "vector",
    +#     "index_name": "vector_index"
    +# }
    +
    +
    import io.milvus.v2.service.index.request.DescribeIndexReq;
    +import io.milvus.v2.service.index.response.DescribeIndexResp;
    +
    +// 5. Describe index
    +// 5.1 List the index names
    +ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    +    .collectionName("customized_setup")
    +    .build();
    +
    +List<String> indexNames = client.listIndexes(listIndexesReq);
    +
    +System.out.println(indexNames);
    +
    +// Output:
    +// [
    +//     "vector_index"
    +// ]
    +
    +// 5.2 Describe an index
    +DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);
    +
    +System.out.println(JSONObject.toJSON(describeIndexResp));
    +
    +// Output:
    +// {
    +//     "metricType": "COSINE",
    +//     "indexType": "AUTOINDEX",
    +//     "fieldName": "vector",
    +//     "indexName": "vector_index"
    +// }
    +
    +
    // 5. Describe the index
    +res = await client.describeIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(JSON.stringify(res.index_descriptions, null, 2))
    +
    +// Output
    +// 
    +// [
    +//   {
    +//     "params": [
    +//       {
    +//         "key": "index_type",
    +//         "value": "AUTOINDEX"
    +//       },
    +//       {
    +//         "key": "metric_type",
    +//         "value": "COSINE"
    +//       }
    +//     ],
    +//     "index_name": "vector_index",
    +//     "indexID": "449007919953063141",
    +//     "field_name": "vector",
    +//     "indexed_rows": "0",
    +//     "total_rows": "0",
    +//     "state": "Finished",
    +//     "index_state_fail_reason": "",
    +//     "pending_index_rows": "0"
    +//   }
    +// ]
    +// 
    +
    +

    您可以檢查在特定欄位上建立的索引檔案,並收集使用此索引檔案索引的行數統計。

    +

    刪除索引

    如果不再需要索引,您可以直接將其刪除。

    +
    +

    在丟棄索引之前,請先確定它已被釋放。

    +
    +
    +

    要刪除索引,請使用 drop_index().

    +
    +
    +

    要丟棄索引,請使用 dropIndex().

    +
    +
    +

    要刪除索引,請使用 dropIndex().

    +
    + +
    # 6. Drop index
    +client.drop_index(
    +    collection_name="customized_setup",
    +    index_name="vector_index"
    +)
    +
    +
    // 6. Drop index
    +
    +DropIndexReq dropIndexReq = DropIndexReq.builder()
    +    .collectionName("customized_setup")
    +    .indexName("vector_index")
    +    .build();
    +
    +client.dropIndex(dropIndexReq);
    +
    +
    // 6. Drop the index
    +res = await client.dropIndex({
    +    collection_name: "customized_setup",
    +    index_name: "vector_index"
    +})
    +
    +console.log(res.error_code)
    +
    +// Output
    +// 
    +// Success
    +// 
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.json b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.json new file mode 100644 index 000000000..ff3908cc6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.json @@ -0,0 +1 @@ +{"codeList":["gpu:\n initMemSize: 0 #set the initial memory pool size.\n maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","gpu:\n initMemSize: 2048 #set the initial memory pool size.\n maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. \n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_CAGRA\",\n \"params\": {\n 'intermediate_graph_degree': 64,\n 'graph_degree': 32\n }\n}\n","index_params = {\n \"metric_type\": \"L2\",\n \"index_type\": \"GPU_IVF_FLAT\", # Or GPU_IVF_PQ\n \"params\": {\n \"nlist\": 1024\n }\n}\n","index_params = {\n 'index_type': 'GPU_BRUTE_FORCE',\n 'metric_type': 'L2',\n 'params': {}\n}\n","# Get an existing collection\ncollection = Collection(\"YOUR_COLLECTION_NAME\")\n\ncollection.create_index(\n field_name=\"vector\", # Name of the vector field on which an index is built\n index_params=index_params\n)\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {}\n}\n","search_params = {\n \"metric_type\": \"L2\",\n \"params\": {\n \"itopk_size\": 128,\n \"search_width\": 4,\n \"min_iterations\": 0,\n \"max_iterations\": 0,\n \"team_size\": 0\n }\n}\n","search_params = {\n \"metric_type\": \"L2\", \n \"params\": {\"nprobe\": 10}\n}\n","# Load data into memory\ncollection.load()\n\ncollection.search(\n data=[[query_vector]], # Your query vector\n anns_field=\"vector\", # Name of the vector field\n param=search_params,\n limit=100 # Number of the results to return\n)\n"],"headingContent":"Index with GPU","anchorList":[{"label":"使用 GPU 建立索引","href":"Index-with-GPU","type":1,"isActive":false},{"label":"為 GPU 記憶體控制配置 Milvus 設定","href":"Configure-Milvus-settings-for-GPU-memory-control","type":2,"isActive":false},{"label":"建立索引","href":"Build-an-index","type":2,"isActive":false},{"label":"搜尋","href":"Search","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"常見問題","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.md b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.md new file mode 100644 index 000000000..64d4181b8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage-indexes/index-with-gpu.md @@ -0,0 +1,231 @@ +--- +id: index-with-gpu.md +order: 3 +summary: 本指南說明如何在 Milvus 中建立支援 GPU 的索引,以提升搜尋效能。 +title: 使用 GPU 建立索引 +--- +

    使用 GPU 建立索引

    本指南概述了在 Milvus 中使用 GPU 支援建立索引的步驟,這可以顯著改善高吞吐量和高召回情境下的搜尋效能。有關 Milvus 支援的 GPU 索引類型的詳細資訊,請參閱GPU 索引

    +

    為 GPU 記憶體控制配置 Milvus 設定

    Milvus 使用全局繪圖記憶體池來分配 GPU 記憶體。

    +

    它在Milvus 配置檔中支援兩個參數initMemSizemaxMemSize 。記憶體池大 小初始設定為initMemSize ,超過此限制後會自動擴充至maxMemSize

    +

    當 Milvus 啟動時,預設的initMemSize 是可用 GPU 記憶體的 1/2,而預設的maxMemSize 是等於所有可用的 GPU 記憶體。

    +

    在 Milvus 2.4.1 之前(包括 2.4.1 版),Milvus 使用統一的 GPU 記憶池。對於 2.4.1 之前的版本 (包括 2.4.1 版),建議將這兩個值都設定為 0。

    +
    gpu:
    +  initMemSize: 0 #set the initial memory pool size.
    +  maxMemSize: 0 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    從 Milvus 2.4.1 起,GPU 記憶體池僅在搜尋時用於臨時 GPU 資料。因此,建議將其設定為 2048 和 4096。

    +
    gpu:
    +  initMemSize: 2048 #set the initial memory pool size.
    +  maxMemSize: 4096 #maxMemSize sets the maximum memory usage limit. When the memory usage exceed initMemSize, Milvus will attempt to expand the memory pool. 
    +
    +

    建立索引

    以下範例說明如何建立不同類型的 GPU 索引。

    +

    準備索引參數

    設定 GPU 索引參數時,請定義index_typemetric_typeparams

    +
      +
    • index_type(字串):用於加速向量搜尋的索引類型。有效的選項包括GPU_CAGRAGPU_IVF_FLATGPU_IVF_PQGPU_BRUTE_FORCE

    • +
    • metric_type(字串):用來衡量向量相似性的度量類型。有效的選項是IPL2

    • +
    • params(dict):特定於索引的建立參數。此參數的有效選項取決於索引類型。

    • +
    +

    以下是不同索引類型的配置範例:

    +
      +
    • GPU_CAGRA索引

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_CAGRA",
      +    "params": {
      +        'intermediate_graph_degree': 64,
      +        'graph_degree': 32
      +    }
      +}
      +
      +

      params的可能選項包括

      +
        +
      • intermediate_graph_degree(int):透過在剪枝之前確定圖形的程度來影響召回和建立時間。建議值為3264

      • +
      • graph_degree(int):透過設定剪枝後的圖形程度來影響搜尋效能和召回率。通常,它是intermediate_graph_degree 的一半。這兩個程度之間的差異越大,建立時間就越長。它的值必須小於intermediate_graph_degree 的值。

      • +
      • build_algo(字串):選擇剪枝前的圖形生成演算法。可能的選項:

        +
          +
        • IVF_PQ: 提供較高的品質,但建立時間較慢。

        • +
        • NN_DESCENT:提供較快的建立速度,但召回率可能較低。

        • +
      • +
      • cache_dataset_on_device(string,"true" | "false"):決定是否在 GPU 記憶體中快取原始資料集。將此設定為"true 「可以精煉搜尋結果,從而提高召回率,而設定為」false "則可節省 GPU 記憶體。

      • +
    • +
    • GPU_IVF_FLATGPU_IVF_PQ索引

      +
      index_params = {
      +    "metric_type": "L2",
      +    "index_type": "GPU_IVF_FLAT", # Or GPU_IVF_PQ
      +    "params": {
      +        "nlist": 1024
      +    }
      +}
      +
      +

      params選項與IVF_FLATIVF_PQ 所使用的相同。

    • +
    • GPU_BRUTE_FORCE索引

      +
      index_params = {
      +    'index_type': 'GPU_BRUTE_FORCE',
      +    'metric_type': 'L2',
      +    'params': {}
      +}
      +
      +

      不需要額外的params設定。

    • +
    +

    建立索引

    index_params 中設定索引參數後,呼叫 create_index()方法來建立索引。

    +
    # Get an existing collection
    +collection = Collection("YOUR_COLLECTION_NAME")
    +
    +collection.create_index(
    +    field_name="vector", # Name of the vector field on which an index is built
    +    index_params=index_params
    +)
    +
    +

    建立 GPU 索引後,下一步就是在進行搜尋前準備搜尋參數。

    +

    準備搜尋參數

    以下是不同索引類型的配置範例:

    +
      +
    • GPU_BRUTE_FORCE索引

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {}
      +}
      +
      +

      不需要額外的參數配置。

    • +
    • GPU_CAGRA索引

      +
      search_params = {
      +    "metric_type": "L2",
      +    "params": {
      +        "itopk_size": 128,
      +        "search_width": 4,
      +        "min_iterations": 0,
      +        "max_iterations": 0,
      +        "team_size": 0
      +    }
      +}
      +
      +

      主要搜尋參數包括

      +
        +
      • itopk_size:決定搜尋過程中保留的中間結果大小。較大的值可能會提高召回率,但卻會犧牲搜尋效能。它應該至少等於最終 top-k(限制) 值,通常是 2 的幂次 (例如 16、32、64、128)。

      • +
      • search_width:指定搜尋期間進入 CAGRA 圖形的入口點數量。增加此值可提高召回率,但可能會影響搜尋效能。

      • +
      • min_iterations/max_ iterations:這些參數控制搜尋的迭代程序。預設值為0,CAGRA 會根據itopk_sizesearch_width 自動決定迭代次數。手動調整這些值有助於平衡效能與精確度。

      • +
      • team_size:指定用於計算 GPU 公制距離的 CUDA 線程數目。常見的值是 2 的幂數,最高為 32 (例如 2、4、8、16、32)。它對搜尋效能影響不大。預設值是0,Milvus 會根據向量的維度自動選擇team_size

      • +
    • +
    • GPU_IVF_FLATGPU_IVF_PQ索引

      +
      search_params = {
      +    "metric_type": "L2", 
      +    "params": {"nprobe": 10}
      +}
      +
      +

      這兩種索引類型的搜尋參數與IVF_FLATIVF_PQ 所使用的相似。如需詳細資訊,請參閱進行向量相似性搜尋

    • +
    +

    使用 search()方法在 GPU 索引上執行向量相似性搜尋。

    +
    # Load data into memory
    +collection.load()
    +
    +collection.search(
    +    data=[[query_vector]], # Your query vector
    +    anns_field="vector", # Name of the vector field
    +    param=search_params,
    +    limit=100 # Number of the results to return
    +)
    +
    +

    限制

    使用 GPU 索引時,請注意某些限制:

    +
      +
    • 對於GPU_IVF_FLATlimit的最大值為 1024。

    • +
    • 對於GPU_IVF_PQGPU_CAGRAlimit的最大值為 1024。

    • +
    • 雖然GPU_BRUTE_FORCE 沒有設定限制,但建議不要超過 4096,以避免潛在的效能問題。

    • +
    • 目前,GPU 索引不支援 COSINE 距離。如果需要 COSINE 距離,應該先將資料規格化,然後再使用內積 (IP) 距離來替代。

    • +
    • 不完全支援 GPU 索引的載入 OOM 保護,太多資料可能會導致 QueryNode 當機。

    • +
    • GPU 索引不支援範圍搜尋及群組搜尋等搜尋功能。

    • +
    +

    常見問題

      +
    • 何時適合使用 GPU 索引?

      +

      GPU 索引特別適用於需要高吞吐量或高召回率的情況。例如,在處理大量批次時,GPU 索引的吞吐量可比 CPU 索引高出 100 倍之多。在批次較小的情況下,GPU 索引的效能仍遠遠超越 CPU 索引。此外,如果需要快速插入資料,整合 GPU 可大幅加快建立索引的過程。

    • +
    • GPU 索引(如 CAGRA、GPU_IVF_PQ、GPU_IVF_FLAT 和 GPU_BRUTE_FORCE)最適合哪些應用場合?

      +

      CAGRA 索引非常適合需要增強效能的應用環境,儘管其代價是消耗更多的記憶體。對於以節省記憶體為優先考量的環境,GPU_IVF_PQ索引可幫助將儲存需求降至最低,儘管這會帶來較高的精確度損失。GPU_IVF_FLAT索引是一個平衡的選擇,提供效能與記憶體使用量之間的折衷方案。最後,GPU_BRUTE_FORCE索引專為窮盡搜尋作業而設計,透過執行遍歷搜尋來保證召回率為 1。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.json b/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.json new file mode 100644 index 000000000..d9d5fbd5d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, db\n\nconn = connections.connect(host=\"127.0.0.1\", port=19530)\n\ndatabase = db.create_database(\"my_database\")\n","import io.milvus.client.MilvusServiceClient;\nimport io.milvus.param.ConnectParam;\nimport io.milvus.param.collection.CreateDatabaseParam;\n\n// 1. Connect to Milvus server\nConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n\n// 3. Create a new database\nCreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()\n .withDatabaseName(\"\")\n .build();\n\nR response = client.createDatabase(createDatabaseParam);\n","const address = \"http://localhost:19530\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address });\n\n// 3. Create a database\nres = await client.createDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n\n// {\n// error_code: 'Success',\n// reason: '',\n// code: 0,\n// retriable: false,\n// detail: ''\n// }\n","db.using_database(\"my_database\")\n","// No equivalent method is available.\n","// 4. Activate another database\nres = await client.useDatabase({\n db_name: \"my_database\",\n});\n\nconsole.log(res);\n","conn = connections.connect(\n host=\"127.0.0.1\",\n port=\"19530\",\n db_name=\"my_database\"\n)\n","ConnectParam connectParam = ConnectParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .withUri(CLUSTER_ENDPOINT)\n .withToken(TOKEN)\n .build();\n\nMilvusServiceClient client = new MilvusServiceClient(connectParam);\n","const address = \"http://localhost:19530\";\nconst db_name = \"my_database\";\n\n// 1. Set up a Milvus Client\nclient = new MilvusClient({ address, db_name });\n","db.list_database()\n\n# Output\n['default', 'my_database']\n","import io.milvus.grpc.ListDatabasesResponse;\nimport io.milvus.param.R;\n\n// 2. List all databases\nR listDatabasesResponse = client.listDatabases();\nSystem.out.println(listDatabasesResponse.getData());\n\n// status {\n// }\n// db_names: \"default\"\n// db_names: \"my_database\"\n// created_timestamp: 1716794498117757990\n// created_timestamp: 1716797196479639477\n","res = await client.listDatabases();\n\nconsole.log(res.db_names);\n\n// [ 'default', 'my_database' ]\n","db.drop_database(\"my_database\")\n\ndb.list_database()\n\n# Output\n['default']\n","import io.milvus.param.collection.DropDatabaseParam;\n\nDropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()\n .withDatabaseName(\"my_database\")\n .build();\n\nresponse = client.dropDatabase(dropDatabaseParam);\n","res = await client.dropDatabase({\n db_name: \"my_database\",\n});\n","from pymilvus import connections, Role\n\n_URI = \"http://localhost:19530\"\n_TOKEN = \"root:Milvus\"\n_DB_NAME = \"default\"\n\n\ndef connect_to_milvus(db_name=\"default\"):\n print(f\"connect to milvus\\n\")\n connections.connect(\n uri=_URI,\n token=_TOKEN,\n db_name=db_name\n )\n","String URI = \"http://localhost:19530\";\nString TOKEN = \"root:Milvus\";\n\npublic class ConnectToMilvus {\n private String _dbName = \"default\";\n\n public newBuilder() {}\n\n public MilvusServiceClient build() {\n ConnectParam connectParam = ConnectParam.newBuilder()\n .withUri(URI)\n .withToken(TOKEN)\n .withDatabaseName(_dbNAME)\n .build();\n\n return new MilvusServiceClient(connectParam);\n }\n\n public newBuilder withDbName(String dbName) {\n this._dbName = dbName;\n return this;\n }\n}\n","const address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\n\nfunction connectToMilvus(dbName = \"default\") {\n const client = new MilvusClient({\n address,\n token,\n dbName,\n });\n\n return client;\n}\n","_ROLE_NAME = \"test_role\"\n_PRIVILEGE_INSERT = \"Insert\"\n\nconnect_to_milvus()\nrole = Role(_ROLE_NAME)\nrole.create()\n\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","String ROLE_NAME = \"test_role\";\nString PRIVILEGE_INSERT = \"Insert\";\n\nMilvusServiceClient client = new ConnectToMilvus().build();\nR response = client.createRole(CreateRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const ROLE_NAME = \"test_role\";\nconst PRIVILEGE_INSERT = \"Insert\";\n\nconst client = connectToMilvus();\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\nconnect_to_milvus(db_name=\"foo\")\n\n# This role will have the insert permission of all collections under foo db,\n# excluding the insert permissions of collections under other dbs\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT)\nprint(role.list_grants())\nprint(role.list_grant(\"Collection\", \"*\"))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT)\n","// NOTE: please make sure the 'foo' db has been created\nMilvusServiceClient client = new ConnectToMilvus().withDbName(\"foo\").build();\n\n// This role will have the insert permission of all collections under foo db,\n// excluding the insert permissions of collections under other dbs\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","const client = connectToMilvus(\"foo\");\n\nasync function demo() {}\nawait client.createRole({\n roleName: ROLE_NAME,\n});\n\nconst grants = await client.listGrants({\n roleName: ROLE_NAME,\n});\n\nconsole.log(grants.grants);\n\nawait client.revokePrivilege({\n roleName: ROLE_NAME,\n object: \"Global\",\n objectName: \"*\",\n privilege: PRIVILEGE_INSERT,\n});\n","# NOTE: please make sure the 'foo' db has been created\n\ndb_name = \"foo\"\nconnect_to_milvus()\nrole.grant(\"Collection\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\nprint(role.list_grants(db_name=db_name))\nprint(role.list_grant(\"Collection\", \"*\", db_name=db_name))\nrole.revoke(\"Global\", \"*\", _PRIVILEGE_INSERT, db_name=db_name)\n","// NOTE: please make sure the 'foo' db has been created\n\nString dbName = \"foo\";\nMilvusServiceClient client = new ConnectToMilvus().build();\n\nR response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n\nR grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\ngrants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Collection\")\n .withObjectName(\"*\")\n .withDatabaseName(dbName)\n .build());\n\nif (grants.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(grants.getMessage());\n}\n\nSystem.out.println(grants.getData());\n\nresponse = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()\n .withRoleName(ROLE_NAME)\n .withObject(\"Global\")\n .withObjectName(\"*\")\n .withPrivilege(PRIVILEGE_INSERT)\n .withDatabaseName(dbName)\n .build());\n\nif (response.getStatus() != R.Status.Success.getCode()) {\n throw new RuntimeException(response.getMessage());\n}\n","// The Node.js SDK currently cannot support this case.\n"],"headingContent":"Manage Databases","anchorList":[{"label":"管理資料庫","href":"Manage-Databases","type":1,"isActive":false},{"label":"建立資料庫","href":"Create-database","type":2,"isActive":false},{"label":"使用資料庫","href":"Use-a-database","type":2,"isActive":false},{"label":"列出資料庫","href":"List-databases","type":2,"isActive":false},{"label":"刪除資料庫","href":"Drop-database","type":2,"isActive":false},{"label":"在資料庫中使用 RBAC","href":"Use-RBAC-with-database","type":2,"isActive":false},{"label":"下一步","href":"Whats-next","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.md b/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.md new file mode 100644 index 000000000..2134f3b98 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/manage_databases.md @@ -0,0 +1,597 @@ +--- +id: manage_databases.md +title: 管理資料庫 +--- +

    管理資料庫

    類似於傳統的資料庫引擎,您也可以在 Milvus 中建立資料庫,並分配權限給特定的使用者來管理資料庫。這樣,這些用戶就有權管理資料庫中的集合。一個 Milvus 集群最多支援 64 個資料庫。

    +
    +

    本頁的程式碼片段使用PyMilvus ORM 模組與 Milvus 互動。使用新的MilvusClient SDK的程式碼片段即將推出。

    +
    +

    建立資料庫

    +

    使用connect()連接到 Milvus 伺服器,並使用create_database()建立新資料庫:

    +
    +
    +

    使用MilvusClient連線至 Milvus 伺服器,並使用createDatabase()建立新資料庫:

    +
    +
    +

    使用MilvusClient連線到 Milvus 伺服器,並createDatabase()來建立新資料庫:

    +
    + +
    from pymilvus import connections, db
    +
    +conn = connections.connect(host="127.0.0.1", port=19530)
    +
    +database = db.create_database("my_database")
    +
    +
    import io.milvus.client.MilvusServiceClient;
    +import io.milvus.param.ConnectParam;
    +import io.milvus.param.collection.CreateDatabaseParam;
    +
    +// 1. Connect to Milvus server
    +ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +// 3. Create a new database
    +CreateDatabaseParam createDatabaseParam = CreateDatabaseParam.newBuilder()
    +    .withDatabaseName("")
    +    .build();
    +
    +R<RpcStatus> response = client.createDatabase(createDatabaseParam);
    +
    +
    const address = "http://localhost:19530";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address });
    +
    +// 3. Create a database
    +res = await client.createDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +// {
    +//   error_code: 'Success',
    +//   reason: '',
    +//   code: 0,
    +//   retriable: false,
    +//   detail: ''
    +// }
    +
    +

    上面的程式碼片段連接到預設資料庫,並建立一個名為my_database 的新資料庫。

    +

    使用資料庫

    Milvus 集群隨附一個預設資料庫,命名為 'default'。除非另有指定,否則會在預設資料庫中建立集合。

    +

    要變更預設資料庫,請執行下列步驟:

    + +
    db.using_database("my_database")
    +
    +
    // No equivalent method is available.
    +
    +
    // 4. Activate another database
    +res = await client.useDatabase({
    +    db_name: "my_database",
    +});
    +
    +console.log(res);
    +
    +

    您也可以設定在連線到 Milvus 叢集時使用的資料庫,如下所示:

    + +
    conn = connections.connect(
    +    host="127.0.0.1",
    +    port="19530",
    +    db_name="my_database"
    +)
    +
    +
    ConnectParam connectParam = ConnectParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .withUri(CLUSTER_ENDPOINT)
    +    .withToken(TOKEN)
    +    .build();
    +
    +MilvusServiceClient client = new MilvusServiceClient(connectParam);
    +
    +
    const address = "http://localhost:19530";
    +const db_name = "my_database";
    +
    +// 1. Set up a Milvus Client
    +client = new MilvusClient({ address, db_name });
    +
    +

    列出資料庫

    +

    要查找 Milvus 集群中所有現有的資料庫,請使用list_database()方法:

    +
    +
    +

    要找到 Milvus 集群中所有現有的資料庫,請使用listDatabases()方法:

    +
    +
    +

    要在您的 Milvus 集群中找到所有現有資料庫,請使用listDatabases()方法:

    +
    + +
    db.list_database()
    +
    +# Output
    +['default', 'my_database']
    +
    +
    import io.milvus.grpc.ListDatabasesResponse;
    +import io.milvus.param.R;
    +
    +// 2. List all databases
    +R<ListDatabasesResponse> listDatabasesResponse = client.listDatabases();
    +System.out.println(listDatabasesResponse.getData());
    +
    +// status {
    +// }
    +// db_names: "default"
    +// db_names: "my_database"
    +// created_timestamp: 1716794498117757990
    +// created_timestamp: 1716797196479639477
    +
    +
    res = await client.listDatabases();
    +
    +console.log(res.db_names);
    +
    +// [ 'default', 'my_database' ]
    +
    +

    刪除資料庫

    要丟棄資料庫,您必須先丟棄它的所有集合。否則,刪除會失敗。

    +
    +

    要丟棄資料庫,請使用drop_database()方法:

    +
    +
    +

    要丟棄資料庫,請使用dropDatabase()方法:

    +
    +
    +

    要丟棄資料庫,請使用dropDatabase()方法:

    +
    + +
    db.drop_database("my_database")
    +
    +db.list_database()
    +
    +# Output
    +['default']
    +
    +
    import io.milvus.param.collection.DropDatabaseParam;
    +
    +DropDatabaseParam dropDatabaseParam = DropDatabaseParam.newBuilder()
    +    .withDatabaseName("my_database")
    +    .build();
    +
    +response = client.dropDatabase(dropDatabaseParam);
    +
    +
    res = await client.dropDatabase({
    +    db_name: "my_database",
    +});
    +
    +

    在資料庫中使用 RBAC

    RBAC 也涵蓋資料庫操作,並確保向前相容。權限 API (Grant / Revoke / List Grant) 中的資料庫字元有以下含義:

    +
      +
    • 如果 Milvus 連線或權限 API 呼叫都沒有指定db_name資料庫就是指預設資料庫。
    • +
    • 如果 Milvus 連線指定了db_name ,但之後的許可 API 呼叫沒有指定,資料庫就指 Milvus 連線中指定的資料庫名稱。
    • +
    • 如果在 Milvus 連線時呼叫許可 API,不論是否指定db_name資料庫都是指在許可 API 呼叫中指定其名稱的資料庫。
    • +
    +

    下面的程式碼片段在以下列出的區塊中共用。

    + +
    from pymilvus import connections, Role
    +
    +_URI = "http://localhost:19530"
    +_TOKEN = "root:Milvus"
    +_DB_NAME = "default"
    +
    +
    +def connect_to_milvus(db_name="default"):
    +    print(f"connect to milvus\n")
    +    connections.connect(
    +        uri=_URI,
    +        token=_TOKEN,
    +        db_name=db_name
    +    )
    +
    +
    String URI = "http://localhost:19530";
    +String TOKEN = "root:Milvus";
    +
    +public class ConnectToMilvus {
    +    private String _dbName = "default";
    +
    +    public newBuilder() {}
    +
    +    public MilvusServiceClient build() {
    +        ConnectParam connectParam = ConnectParam.newBuilder()
    +            .withUri(URI)
    +            .withToken(TOKEN)
    +            .withDatabaseName(_dbNAME)
    +            .build();
    +
    +        return new MilvusServiceClient(connectParam);
    +    }
    +
    +    public newBuilder withDbName(String dbName) {
    +        this._dbName = dbName;
    +        return this;
    +    }
    +}
    +
    +
    const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +
    +function connectToMilvus(dbName = "default") {
    +    const client = new MilvusClient({
    +        address,
    +        token,
    +        dbName,
    +    });
    +
    +    return client;
    +}
    +
    +
      +
    • 如果 Milvus 連線或 Permission API 呼叫都沒有指定db_name資料庫會指向預設資料庫。

      +

      +
      _ROLE_NAME = "test_role"
      +_PRIVILEGE_INSERT = "Insert"
      +
      +connect_to_milvus()
      +role = Role(_ROLE_NAME)
      +role.create()
      +
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      String ROLE_NAME = "test_role";
      +String PRIVILEGE_INSERT = "Insert";
      +
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +R<RpcStatus> response = client.createRole(CreateRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const ROLE_NAME = "test_role";
      +const PRIVILEGE_INSERT = "Insert";
      +
      +const client = connectToMilvus();
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • 如果 Milvus 連線指定了db_name ,但之後的 Permission API 呼叫沒有指定,資料庫會指向 Milvus 連線中指定名稱的資料庫。

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +connect_to_milvus(db_name="foo")
      +
      +# This role will have the insert permission of all collections under foo db,
      +# excluding the insert permissions of collections under other dbs
      +role.grant("Collection", "*", _PRIVILEGE_INSERT)
      +print(role.list_grants())
      +print(role.list_grant("Collection", "*"))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +MilvusServiceClient client = new ConnectToMilvus().withDbName("foo").build();
      +
      +// This role will have the insert permission of all collections under foo db,
      +// excluding the insert permissions of collections under other dbs
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      const client = connectToMilvus("foo");
      +
      +async function demo() {}
      +await client.createRole({
      +  roleName: ROLE_NAME,
      +});
      +
      +const grants = await client.listGrants({
      +  roleName: ROLE_NAME,
      +});
      +
      +console.log(grants.grants);
      +
      +await client.revokePrivilege({
      +  roleName: ROLE_NAME,
      +  object: "Global",
      +  objectName: "*",
      +  privilege: PRIVILEGE_INSERT,
      +});
      +
    • +
    • 如果在 Milvus 連線時呼叫 Permission API,不論是否指定db_name資料庫都是指其名稱在 Permission API 呼叫中指定的資料庫。

      +

      +
      # NOTE: please make sure the 'foo' db has been created
      +
      +db_name = "foo"
      +connect_to_milvus()
      +role.grant("Collection", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +print(role.list_grants(db_name=db_name))
      +print(role.list_grant("Collection", "*", db_name=db_name))
      +role.revoke("Global", "*", _PRIVILEGE_INSERT, db_name=db_name)
      +
      +
      // NOTE: please make sure the 'foo' db has been created
      +
      +String dbName = "foo";
      +MilvusServiceClient client = new ConnectToMilvus().build();
      +
      +R<RpcStatus> response = client.grantRolePrivilege(GrantRolePriviledgeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +R<SelectGrantResponse> grants = client.selectGrantForRole(SelectGrantForRoleParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +grants = client.selectGrantForRoleAndObject(SelectGrantForRoleAndObjectParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Collection")
      +    .withObjectName("*")
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (grants.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(grants.getMessage());
      +}
      +
      +System.out.println(grants.getData());
      +
      +response = client.revokeRolePrivilege(RevokeRolePrivilegeParam.newBuilder()
      +    .withRoleName(ROLE_NAME)
      +    .withObject("Global")
      +    .withObjectName("*")
      +    .withPrivilege(PRIVILEGE_INSERT)
      +    .withDatabaseName(dbName)
      +    .build());
      +
      +if (response.getStatus() != R.Status.Success.getCode()) {
      +    throw new RuntimeException(response.getMessage());
      +}
      +
      +
      // The Node.js SDK currently cannot support this case.
      +
    • +
    +

    下一步

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.json new file mode 100644 index 000000000..9eb588472 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"type\": \"standard\", # Uses the standard built-in analyzer​\n \"stop_words\": [\"a\", \"an\", \"for\"] # Defines a list of common words (stop words) to exclude from tokenization​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"standard\");\nanalyzerParams.put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n","const analyzer_params = {\n \"type\": \"standard\", // Uses the standard built-in analyzer\n \"stop_words\": [\"a\", \"an\", \"for\"] // Defines a list of common words (stop words) to exclude from tokenization\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }'\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stop\",​\n \"stop_words\": [\"a\", \"an\", \"for\"]​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n \"lowercase\",\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","[\"Vector\", \"Database\", \"Built\", \"for\", \"Scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"whitespace\");\n","const analyzer_params = {\n \"tokenizer\": \"whitespace\",\n};\n","export analyzerParams='{\n \"type\": \"whitespace\"\n }'\n","[\"vector\", \"database\", \"built\", \"for\", \"scale\"]​\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [\"lowercase\"], # Optional: Built-in filter that converts text to lowercase​\n}​\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\", Collections.singletonList(\"lowercase\"));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\"lowercase\"], // Optional: Built-in filter that converts text to lowercase\n}\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\"lowercase\"]\n}'\n","analyzer_params = {​\n \"tokenizer\": \"standard\", # Mandatory: Specifies tokenizer​\n \"filter\": [​\n {​\n \"type\": \"stop\", # Specifies 'stop' as the filter type​\n \"stop_words\": [\"of\", \"to\"], # Customizes stop words for this filter type​\n }​\n ]​\n}​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Collections.singletonList(new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}));\n","const analyzer_params = {\n \"tokenizer\": \"standard\", // Mandatory: Specifies tokenizer\n \"filter\": [\n {\n \"type\": \"stop\", // Specifies 'stop' as the filter type\n \"stop_words\": [\"of\", \"to\"], // Customizes stop words for this filter type\n }\n ]\n};\n","export analyzerParams='{\n \"type\": \"standard\",\n \"filter\": [\n {\n \"type\": \"stop\",\n \"stop_words\": [\"a\", \"an\", \"for\"]\n }\n ]\n}'\n","from pymilvus import MilvusClient, DataType​\n​\n# Set up a Milvus client​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\"​\n)​\n​\n# Create schema​\nschema = client.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\n# Add fields to schema​\n​\n# Use a built-in analyzer​\nanalyzer_params_built_in = {​\n \"type\": \"english\"​\n}​\n​\n# Add VARCHAR field `title_en`​\nschema.add_field(​\n field_name='title_en', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_built_in,​\n enable_match=True, ​\n)​\n​\n# Configure a custom analyzer​\nanalyzer_params_custom = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\", # Built-in filter​\n {​\n \"type\": \"length\", # Custom filter​\n \"max\": 40​\n },​\n {​\n \"type\": \"stop\", # Custom filter​\n \"stop_words\": [\"of\", \"to\"]​\n }​\n ]​\n}​\n​\n# Add VARCHAR field `title`​\nschema.add_field(​\n field_name='title', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params_custom,​\n enable_match=True, ​\n)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n# Add primary field​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\n​\n# Set up index params for vector field​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"embedding\", metric_type=\"COSINE\", index_type=\"AUTOINDEX\")​\n​\n# Create collection with defined schema​\nclient.create_collection(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n schema=schema,​\n index_params=index_params​\n)​\n","import io.milvus.v2.client.ConnectConfig;\nimport io.milvus.v2.client.MilvusClientV2;\nimport io.milvus.v2.common.DataType;\nimport io.milvus.v2.common.IndexParam;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\n// Set up a Milvus client\nConnectConfig config = ConnectConfig.builder()\n .uri(\"http://localhost:19530\")\n .build();\nMilvusClientV2 client = new MilvusClientV2(config);\n\n// Create schema\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\n// Add fields to schema\n// Use a built-in analyzer\nMap analyzerParamsBuiltin = new HashMap<>();\nanalyzerParamsBuiltin.put(\"type\", \"english\");\n// Add VARCHAR field `title_en`\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title_en\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParamsBuiltin)\n .enableMatch(true)\n .build());\n\n// Configure a custom analyzer\nMap analyzerParams = new HashMap<>();\nanalyzerParams.put(\"tokenizer\", \"standard\");\nanalyzerParams.put(\"filter\",\n Arrays.asList(\"lowercase\",\n new HashMap() {{\n put(\"type\", \"length\");\n put(\"max\", 40);\n }},\n new HashMap() {{\n put(\"type\", \"stop\");\n put(\"stop_words\", Arrays.asList(\"a\", \"an\", \"for\"));\n }}\n )\n);\nschema.addField(AddFieldReq.builder()\n .fieldName(\"title\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true) // must enable this if you use TextMatch\n .build());\n\n// Add vector field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"embedding\")\n .dataType(DataType.FloatVector)\n .dimension(3)\n .build());\n// Add primary field\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\n\n// Set up index params for vector field\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"embedding\")\n .indexType(IndexParam.IndexType.AUTOINDEX)\n .metricType(IndexParam.MetricType.COSINE)\n .build());\n\n// Create collection with defined schema\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\n// Set up a Milvus client\nconst client = new MilvusClient(\"http://localhost:19530\");\n// Use a built-in analyzer for VARCHAR field `title_en`\nconst analyzerParamsBuiltIn = {\n type: \"english\",\n};\n\n// Configure a custom analyzer for VARCHAR field `title`\nconst analyzerParamsCustom = {\n tokenizer: \"standard\",\n filter: [\n \"lowercase\",\n {\n type: \"length\",\n max: 40,\n },\n {\n type: \"stop\",\n stop_words: [\"of\", \"to\"],\n },\n ],\n};\n\n// Create schema\nconst schema = {\n auto_id: true,\n fields: [\n {\n name: \"id\",\n type: DataType.INT64,\n is_primary: true,\n },\n {\n name: \"title_en\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsBuiltIn,\n enable_match: true,\n },\n {\n name: \"title\",\n data_type: DataType.VARCHAR,\n max_length: 1000,\n enable_analyzer: true,\n analyzer_params: analyzerParamsCustom,\n enable_match: true,\n },\n {\n name: \"embedding\",\n data_type: DataType.FLOAT_VECTOR,\n dim: 4,\n },\n ],\n};\n\n// Set up index params for vector field\nconst indexParams = [\n {\n name: \"embedding\",\n metric_type: \"COSINE\",\n index_type: \"AUTOINDEX\",\n },\n];\n\n// Create collection with defined schema\nawait client.createCollection({\n collection_name: \"YOUR_COLLECTION_NAME\",\n schema: schema,\n index_params: indexParams,\n});\n\nconsole.log(\"Collection created successfully!\");\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"title_en\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"title\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\n \"tokenizer\": \"standard\",\n \"filter\":[\n \"lowercase\",\n {\n \"type\":\"length\",\n \"max\":40\n },\n {\n \"type\":\"stop\",\n \"stop_words\":[\"of\",\"to\"]\n }\n ]\n }\n }\n },\n {\n \"fieldName\": \"embedding\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\":3\n }\n }\n ]\n }'\n \nexport indexParams='[\n {\n \"fieldName\": \"embedding\",\n \"metricType\": \"COSINE\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"YOUR_COLLECTION_NAME\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n"],"headingContent":"Analyzer Overview​","anchorList":[{"label":"分析器概述","href":"Analyzer-Overview​","type":1,"isActive":false},{"label":"分析器剖析","href":"Anatomy-of-an-analyzer​","type":2,"isActive":false},{"label":"分析器類型","href":"Analyzer-types​","type":2,"isActive":false},{"label":"使用範例","href":"Example-use​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.md new file mode 100644 index 000000000..f4cc0ca6a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer-overview.md @@ -0,0 +1,581 @@ +--- +id: analyzer-overview.md +title: 分析器概述 +summary: >- + 在文字處理中,分析器是將原始文字轉換成結構化、可搜尋格式的重要元件。每個分析器通常由兩個核心元件組成:標記器和過濾器。它們共同將輸入文字轉換為標記、精煉這些標記,並為有效的索引和檢索做好準備。 +--- +

    分析器概述

    在文字處理中,分析器是將原始文字轉換成結構化、可搜尋格式的重要元件。每個分析器通常包含兩個核心元件:標記器過濾 。它們共同將輸入文字轉換為標記,精煉這些標記,並為有效的索引和檢索做好準備。

    +

    Milvus 的分析器由Tantivy 提供,當您將VARCHAR 欄位新增至集合模式時,分析器會在集合建立時設定。分析器產生的標記可用於建立文字比對索引,或轉換成稀疏內嵌以進行全文檢索。如需詳細資訊,請參閱文字匹配全文搜尋

    +
    +

    使用分析器可能會影響效能。

    +
      +
    • 全文本搜尋:對於全文本搜尋,DataNode 和QueryNode通道消耗資料的速度較慢,因為它們必須等待標記化完成。因此,新擷取的資料需要較長時間才能可供搜尋。

    • +
    • 文字匹配:對於文字匹配,索引建立的速度也較慢,因為標記化需要在建立索引之前完成。

    • +
    +
    +

    分析器剖析

    Milvus 的分析器包含一個標記器零個或多個過濾器。

    +
      +
    • 標記器:標記器將輸入文字分割成稱為標記的獨立單位。這些標記可以是單字或短語,取決於標記器類型。

    • +
    • 篩選器:篩選器可套用至標記,以進一步精細標記,例如將標記改成小寫或移除常用字。

    • +
    +

    以下的工作流程顯示分析器如何處理文字。

    +

    analyzer-overview

    +

    分析器類型

    Milvus 提供兩種類型的分析器,以滿足不同的文字處理需求。

    +
      +
    • 內建分析器:這些是預先定義的配置,只需最少的設定即可涵蓋常見的文字處理工作。內建分析器不需要複雜的設定,是一般用途搜尋的理想選擇。

    • +
    • 自訂分析器:對於更進階的需求,自訂分析器可讓您透過指定標記器和零個或多個過濾器來定義您自己的組態。這種層級的自訂對於需要精確控制文字處理的專門用例特別有用。

    • +
    +
    +

    如果您在建立集合時省略了分析器設定,Milvus 預設會使用standard 分析器來處理所有文字。詳情請參閱標準

    +
    +

    內建分析器

    Milvus 的內建分析器預先設定了特定的 tokenizer 和過濾器,讓您可以立即使用,而不需要自己定義這些元件。每個內建分析器都是一個範本,包含預設的標記器和篩選器,以及可選的自訂參數。

    +

    例如,若要使用standard 內建分析器,只需指定其名稱standardtype ,並可選擇包含此分析器類型特有的額外配置,例如stop_words

    + +
    analyzer_params = {​
    +    "type": "standard", # Uses the standard built-in analyzer​
    +    "stop_words": ["a", "an", "for"] # Defines a list of common words (stop words) to exclude from tokenization​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "standard");
    +analyzerParams.put("stop_words", Arrays.asList("a", "an", "for"));
    +
    +
    const analyzer_params = {
    +    "type": "standard", // Uses the standard built-in analyzer
    +    "stop_words": ["a", "an", "for"] // Defines a list of common words (stop words) to exclude from tokenization
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "stop_words": ["a", "an", "for"]
    +    }'
    +
    +

    上述standard 內建分析器的配置等同於使用下列參數設定自訂分析器,其中tokenizerfilter 選項是明確定義,以達到相同的功能:

    + +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stop",​
    +            "stop_words": ["a", "an", "for"]​
    +        }​
    +    ]​
    +}​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}));
    +
    +
    const analyzer_params = {
    +    "tokenizer": "standard",
    +    "filter": [
    +        "lowercase",
    +        {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +        }
    +    ]
    +};
    +
    +
    export analyzerParams='{
    +       "type": "standard",
    +       "filter":  [
    +       "lowercase",
    +       {
    +            "type": "stop",
    +            "stop_words": ["a", "an", "for"]
    +       }
    +   ]
    +}'
    +
    +

    Milvus 提供下列內建分析器,每個分析器都可以直接使用,只要指定其名稱為type 參數即可。

    +
      +
    • standard:適用於一般用途的文字處理,應用標準的標記化和小寫過濾。

    • +
    • english:針對英文文字最佳化,支援英文停止詞。

    • +
    • chinese:專門處理中文文字,包括針對中文語言結構的標記化。

    • +
    +

    自訂分析器

    對於更進階的文字處理,Milvus 的自訂分析器可讓您透過指定標記器和過濾器,建立量身打造的文字處理管道。此設定非常適合需要精確控制的特殊使用個案。

    +

    標記器

    標記器是自訂分析器的必備元件,可將輸入文字分解為離散的單位或標記,從而啟動分析器管道。記號化遵循特定規則,例如依據記號化類型以空白或標點分割。此過程能更精確、獨立地處理每個字或詞組。

    +

    例如,令牌化器會將文字"Vector Database Built for Scale" 轉換成獨立的令牌。

    +
    ["Vector", "Database", "Built", "for", "Scale"]​
    +
    +

    指定 tokenizer 的範例

    + +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "whitespace");
    +
    +
    const analyzer_params = {
    +    "tokenizer": "whitespace",
    +};
    +
    +
    export analyzerParams='{
    +       "type": "whitespace"
    +    }'
    +
    +

    過濾器

    過濾器可選的元件,用來處理 tokenizer 產生的 token,並視需要轉換或精煉它們。例如,將lowercase 過濾器套用到標記化的詞彙["Vector", "Database", "Built", "for", "Scale"] 之後,結果可能是。

    +
    ["vector", "database", "built", "for", "scale"]​
    +
    +

    自訂分析器中的篩選器可以是內建自訂的,視配置需求而定。

    +
      +
    • 內建過濾器:由 Milvus 預先設定,只需最少的設定。您只要指定這些篩選器的名稱,就能立即使用這些篩選器。以下篩選器為內建篩選器,可直接使用。

      +
        +
      • lowercase:將文字轉換為小寫,確保大小寫不敏感的匹配。如需詳細資訊,請參閱小寫

      • +
      • asciifolding:將非 ASCII 字元轉換為 ASCII 對應字元,簡化多語言文字處理。詳情請參閱ASCII 折疊

      • +
      • alphanumonly:只保留字母數字字符,移除其他字符。詳情請參閱Alphanumonly

      • +
      • cnalphanumonly:移除包含任何非中文字元、英文字母或數位字元的標記。詳情請參閱Cnalphanumonly

      • +
      • cncharonly:移除包含任何非中文字元的標記。詳情請參閱Cncharonly

      • +
      +

      使用內建過濾器的範例

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": ["lowercase"], # Optional: Built-in filter that converts text to lowercase​
      +}​
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter", Collections.singletonList("lowercase"));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": ["lowercase"], // Optional: Built-in filter that converts text to lowercase
      +}
      +
      +
      export analyzerParams='{
      +   "type": "standard",
      +   "filter":  ["lowercase"]
      +}'
      +
    • +
    • 自訂篩選器:自訂篩選器允許專門的配置。您可以透過選擇有效的篩選器類型 (filter.type) 並為每個篩選器類型加入特定設定,來定義自訂篩選器。支援自訂的篩選器類型範例。

      +
        +
      • stop:透過設定停止詞清單 (例如"stop_words": ["of", "to"]),移除指定的常用字。詳情請參閱停止

      • +
      • length:根據長度標準排除標記,例如設定最大標記長度。詳情請參閱Length

      • +
      • stemmer:將字詞縮減為字根形式,以便進行更靈活的匹配。詳情請參閱Stemmer

      • +
      +

      設定自訂篩選器的範例

      +

      +
      analyzer_params = {​
      +    "tokenizer": "standard", # Mandatory: Specifies tokenizer​
      +    "filter": [​
      +        {​
      +            "type": "stop", # Specifies 'stop' as the filter type​
      +            "stop_words": ["of", "to"], # Customizes stop words for this filter type​
      +        }​
      +    ]​
      +}​
      +
      +
      +
      Map<String, Object> analyzerParams = new HashMap<>();
      +analyzerParams.put("tokenizer", "standard");
      +analyzerParams.put("filter",
      +    Collections.singletonList(new HashMap<String, Object>() {{
      +        put("type", "stop");
      +        put("stop_words", Arrays.asList("a", "an", "for"));
      +    }}));
      +
      +
      const analyzer_params = {
      +    "tokenizer": "standard", // Mandatory: Specifies tokenizer
      +    "filter": [
      +        {
      +            "type": "stop", // Specifies 'stop' as the filter type
      +            "stop_words": ["of", "to"], // Customizes stop words for this filter type
      +        }
      +    ]
      +};
      +
      +
      export analyzerParams='{
      +    "type": "standard",
      +    "filter":  [
      +    {
      +            "type": "stop",
      +            "stop_words": ["a", "an", "for"]
      +    }
      +    ]
      +}'
      +
    • +
    +

    使用範例

    在這個範例中,我們定義了一個集合模式,其中有一個向量欄位用於嵌入,兩個VARCHAR 欄位用於文字處理功能。每個VARCHAR 欄位都配置了自己的分析器設定,以處理不同的處理需求。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +# Set up a Milvus client​
    +client = MilvusClient(​
    +    uri="http://localhost:19530"​
    +)​
    +​
    +# Create schema​
    +schema = client.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +# Add fields to schema​
    +​
    +# Use a built-in analyzer​
    +analyzer_params_built_in = {​
    +    "type": "english"​
    +}​
    +​
    +# Add VARCHAR field `title_en`​
    +schema.add_field(​
    +    field_name='title_en', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_built_in,​
    +    enable_match=True, ​
    +)​
    +​
    +# Configure a custom analyzer​
    +analyzer_params_custom = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase", # Built-in filter​
    +        {​
    +            "type": "length", # Custom filter​
    +            "max": 40​
    +        },​
    +        {​
    +            "type": "stop", # Custom filter​
    +            "stop_words": ["of", "to"]​
    +        }​
    +    ]​
    +}​
    +​
    +# Add VARCHAR field `title`​
    +schema.add_field(​
    +    field_name='title', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params_custom,​
    +    enable_match=True, ​
    +)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +# Add primary field​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Set up index params for vector field​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="embedding", metric_type="COSINE", index_type="AUTOINDEX")​
    +​
    +# Create collection with defined schema​
    +client.create_collection(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    import io.milvus.v2.client.ConnectConfig;
    +import io.milvus.v2.client.MilvusClientV2;
    +import io.milvus.v2.common.DataType;
    +import io.milvus.v2.common.IndexParam;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +// Set up a Milvus client
    +ConnectConfig config = ConnectConfig.builder()
    +        .uri("http://localhost:19530")
    +        .build();
    +MilvusClientV2 client = new MilvusClientV2(config);
    +
    +// Create schema
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +// Add fields to schema
    +// Use a built-in analyzer
    +Map<String, Object> analyzerParamsBuiltin = new HashMap<>();
    +analyzerParamsBuiltin.put("type", "english");
    +// Add VARCHAR field `title_en`
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title_en")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParamsBuiltin)
    +        .enableMatch(true)
    +        .build());
    +
    +// Configure a custom analyzer
    +Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("tokenizer", "standard");
    +analyzerParams.put("filter",
    +        Arrays.asList("lowercase",
    +                new HashMap<String, Object>() {{
    +                    put("type", "length");
    +                    put("max", 40);
    +                }},
    +                new HashMap<String, Object>() {{
    +                    put("type", "stop");
    +                    put("stop_words", Arrays.asList("a", "an", "for"));
    +                }}
    +        )
    +);
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("title")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true) // must enable this if you use TextMatch
    +        .build());
    +
    +// Add vector field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("embedding")
    +        .dataType(DataType.FloatVector)
    +        .dimension(3)
    +        .build());
    +// Add primary field
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +
    +// Set up index params for vector field
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("embedding")
    +        .indexType(IndexParam.IndexType.AUTOINDEX)
    +        .metricType(IndexParam.MetricType.COSINE)
    +        .build());
    +
    +// Create collection with defined schema
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +// Set up a Milvus client
    +const client = new MilvusClient("http://localhost:19530");
    +// Use a built-in analyzer for VARCHAR field `title_en`
    +const analyzerParamsBuiltIn = {
    +  type: "english",
    +};
    +
    +// Configure a custom analyzer for VARCHAR field `title`
    +const analyzerParamsCustom = {
    +  tokenizer: "standard",
    +  filter: [
    +    "lowercase",
    +    {
    +      type: "length",
    +      max: 40,
    +    },
    +    {
    +      type: "stop",
    +      stop_words: ["of", "to"],
    +    },
    +  ],
    +};
    +
    +// Create schema
    +const schema = {
    +  auto_id: true,
    +  fields: [
    +    {
    +      name: "id",
    +      type: DataType.INT64,
    +      is_primary: true,
    +    },
    +    {
    +      name: "title_en",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsBuiltIn,
    +      enable_match: true,
    +    },
    +    {
    +      name: "title",
    +      data_type: DataType.VARCHAR,
    +      max_length: 1000,
    +      enable_analyzer: true,
    +      analyzer_params: analyzerParamsCustom,
    +      enable_match: true,
    +    },
    +    {
    +      name: "embedding",
    +      data_type: DataType.FLOAT_VECTOR,
    +      dim: 4,
    +    },
    +  ],
    +};
    +
    +// Set up index params for vector field
    +const indexParams = [
    +  {
    +    name: "embedding",
    +    metric_type: "COSINE",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +// Create collection with defined schema
    +await client.createCollection({
    +  collection_name: "YOUR_COLLECTION_NAME",
    +  schema: schema,
    +  index_params: indexParams,
    +});
    +
    +console.log("Collection created successfully!");
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "title_en",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "title",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {
    +                        "tokenizer": "standard",
    +                        "filter":[
    +                            "lowercase",
    +                            {
    +                                "type":"length",
    +                                "max":40
    +                            },
    +                            {
    +                                "type":"stop",
    +                                "stop_words":["of","to"]
    +                            }
    +                        ]
    +                    }
    +                }
    +            },
    +            {
    +                "fieldName": "embedding",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim":3
    +                }
    +            }
    +        ]
    +    }'
    +    
    +export indexParams='[
    +        {
    +            "fieldName": "embedding",
    +            "metricType": "COSINE",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"YOUR_COLLECTION_NAME\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.json new file mode 100644 index 000000000..7d781dc79 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n \"filter\": [\"cnalphanumonly\"]​\n}​\n","analyzer_params = {​\n \"type\": \"chinese\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\"]​\n"],"headingContent":"Chinese​","anchorList":[{"label":"中文","href":"Chinese​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.md new file mode 100644 index 000000000..912b89268 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/chinese-analyzer.md @@ -0,0 +1,48 @@ +--- +id: chinese-analyzer.md +title: 中文分析儀 +related_key: 'chinese, analyzer' +summary: 中文」分析器是專為處理中文文字而設計,提供有效的分割和標記化。 +--- +

    中文

    chinese 分析器專為處理中文文字而設計,提供有效的分割和標記化。

    +

    定義

    chinese 分析器包括

    +
      +
    • 標記器:使用jieba tokenizer 根據詞彙和上下文將中文文字分割成 token。如需更多資訊,請參考Jieba

    • +
    • 過濾器:使用cnalphanumonly 過濾器移除包含任何非中文字元的字元。如需詳細資訊,請參閱Cnalphanumonly

    • +
    +

    chinese 分析器的功能等同於下列自訂分析器配置。

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +    "filter": ["cnalphanumonly"]​
    +}​
    +
    +

    配置

    要將chinese 分析器套用到欄位,只要在analyzer_params 中將type 設為chinese 即可。

    +
    analyzer_params = {​
    +    "type": "chinese",​
    +}​
    +
    +
    +

    chinese 分析器不接受任何可選參數。

    +
    +

    輸出範例

    以下是chinese 分析器如何處理文字。

    +

    原始文字

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    預期輸出

    +
    ["Milvus", "是", "一个", "高性", "性能", "高性能", "可", "扩展", "的", "向量", "数据", "据库", "数据库"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.json new file mode 100644 index 000000000..50b956651 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [​\n \"lowercase\",​\n {​\n \"type\": \"stemmer\",​\n \"language\": \"english\"​\n },{​\n \"type\": \"stop\",​\n \"stop_words\": \"_english_\",​\n }​\n ]​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n}​\n","analyzer_params = {​\n \"type\": \"english\",​\n \"stop_words\": [\"a\", \"an\", \"the\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"milvus\", \"vector\", \"databas\", \"built\", \"scale\"]​\n"],"headingContent":"English​","anchorList":[{"label":"英文","href":"English​","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.md new file mode 100644 index 000000000..ca06bbded --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/english-analyzer.md @@ -0,0 +1,72 @@ +--- +id: english-analyzer.md +title: 英文分析器 +related_key: 'english, analyzer' +summary: Milvus 中的「english」分析器是設計用來處理英文文字,並應用特定語言的規則進行標記化和過濾。 +--- +

    英文

    Milvus 中的english 分析器專為處理英文文字而設計,並應用特定語言的符號化和過濾規則。

    +

    定義

    english 分析器使用下列元件。

    +
      +
    • 標記化器:使用 standard tokenizer將文字分割為離散的單字單位。

    • +
    • 篩選器:包含多種篩選器,可進行全面的文字處理。

      +
        +
      • lowercase:將所有字元轉換為小寫,以便進行不區分大小寫的搜尋。

      • +
      • stemmer:將字詞縮減為字根形式,以支援更廣泛的匹配 (例如,「running」變為「run」)。

      • +
      • stop_words:移除常見的英文停止詞,以聚焦於文字中的關鍵詞。

      • +
    • +
    +

    english 分析器的功能等同於下列自訂分析器設定。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": [​
    +        "lowercase",​
    +        {​
    +            "type": "stemmer",​
    +            "language": "english"​
    +        },{​
    +            "type": "stop",​
    +            "stop_words": "_english_",​
    +        }​
    +    ]​
    +}​
    +
    +

    配置

    要將english 分析器套用到欄位,只要在analyzer_params 中將type 設定為english ,並視需要加入可選參數即可。

    +
    analyzer_params = {​
    +    "type": "english",​
    +}​
    +
    +

    english 分析器接受下列可選參數:

    +

    參數

    +

    說明

    +

    stop_words

    +

    包含停止詞清單的陣列,這些停止詞將從標記化中移除。預設為_english_ ,內建的常見英文停止詞集。

    +
    +

    自訂停止詞配置範例。

    +
    analyzer_params = {​
    +    "type": "english",​
    +    "stop_words": ["a", "an", "the"]​
    +}​
    +
    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器處理該欄位中的文字,以進行有效的標記化和過濾。詳情請參閱使用範例

    +

    輸出範例

    以下是english 分析器如何處理文字。

    +

    原始文字

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    預期輸出

    +
    ["milvus", "vector", "databas", "built", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.json new file mode 100644 index 000000000..7a2d2520b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n}​\n","analyzer_params = {​\n \"type\": \"standard\", # Specifies the standard analyzer type​\n \"stop_words\", [\"of\"] # Optional: List of words to exclude from tokenization​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"the\", \"milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"標準","href":"Standard​","type":1,"isActive":false},{"label":"定義","href":"Definition​","type":2,"isActive":false},{"label":"配置","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.md new file mode 100644 index 000000000..68b236523 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/analyzer/standard-analyzer.md @@ -0,0 +1,103 @@ +--- +id: standard-analyzer.md +title: 標準分析儀 +related_key: 'standard, analyzer' +summary: 標準」分析器是 Milvus 的預設分析器,如果沒有指定分析器,它會自動套用到文字欄位。它使用基於語法的標記化,對大多數語言都很有效。 +--- +

    標準

    standard 分析器是 Milvus 的預設分析器,如果沒有指定分析器,它會自動套用到文字欄位。它使用基於文法的標記化,對大多數語言都很有效。

    +

    定義

    standard 分析器包括

    +
      +
    • 標記器:使用standard tokenizer,根據文法規則將文字分割成離散的單字單位。如需詳細資訊,請參閱標準

    • +
    • 過濾器:使用lowercase 過濾器,將所有字元轉換為小寫,使搜尋不區分大小寫。如需詳細資訊,請參閱lowercase filter.

    • +
    +

    standard 分析器的功能等同於下列自訂分析器組態。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    配置

    要將standard 分析器套用到欄位,只要在analyzer_params 中將type 設定為standard ,並根據需要加入可選參數即可。

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +}​
    +
    +

    standard 分析器接受下列可選參數:

    +

    參數

    +

    說明

    +

    stop_words

    +

    包含停止詞清單的陣列,這些停止詞將從標記化中移除。預設為_english_ ,這是一套內建的常見英文停止詞。_english_ 的詳細資訊可以在這裡找到。

    +
    +

    自訂停止詞配置範例。

    +
    analyzer_params = {​
    +    "type": "standard", # Specifies the standard analyzer type​
    +    "stop_words", ["of"] # Optional: List of words to exclude from tokenization​
    +}​
    +
    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器處理該欄位中的文字,以進行有效的標記化和過濾。如需詳細資訊,請參閱範例使用

    +

    輸出範例

    以下是standard 分析器如何處理文字。

    +

    原始文字

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    預期輸出

    +
    ["the", "milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.json new file mode 100644 index 000000000..d9d622480 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"alphanumonly\"],​\n}​\n","\"Milvus 2.0 @ Scale! #AI #Vector_Databasé\"​\n","[\"Milvus\", \"2\", \"0\", \"Scale\", \"AI\", \"Vector\"]​\n"],"headingContent":"Alphanumonly​","anchorList":[{"label":"僅字母","href":"Alphanumonly​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.md new file mode 100644 index 000000000..ae37600bc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/alphanumonly-filter.md @@ -0,0 +1,68 @@ +--- +id: alphanumonly-filter.md +title: Alphanumonly 過濾器 +summary: >- + `alphanumonly` 過濾器會移除包含非 ASCII + 字元的標記,只保留字母數字字元。此過濾器適用於處理只有基本字母和數字相關的文字,排除任何特殊字符或符號。 +--- +

    僅字母

    alphanumonly 過濾器會移除包含非 ASCII 字元的標記,只保留字母數字詞。此過濾器適用於處理只有基本字母和數字相關的文字,排除任何特殊字符或符號。

    +

    設定

    alphanumonly 過濾器內建於 Milvus。要使用它,只需在analyzer_params 中的filter 部分指定其名稱。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["alphanumonly"],​
    +}​
    +
    +

    alphanumonly 過濾器會對由 tokenizer 產生的詞彙進行操作,因此它必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是alphanumonly 過濾器處理文字的範例。

    +

    原始文字

    +
    "Milvus 2.0 @ Scale! #AI #Vector_Databasé"​
    +
    +

    預期輸出

    +
    ["Milvus", "2", "0", "Scale", "AI", "Vector"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.json new file mode 100644 index 000000000..eb50546a6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"asciifolding\"],​\n}​\n","\"Café Möller serves crème brûlée and piñatas.\"​\n","[\"Cafe\", \"Moller\", \"serves\", \"creme\", \"brulee\", \"and\", \"pinatas\"]​\n"],"headingContent":"ASCII folding​","anchorList":[{"label":"ASCII 摺疊","href":"ASCII-folding​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.md new file mode 100644 index 000000000..2f9709eb7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/ascii-folding-filter.md @@ -0,0 +1,68 @@ +--- +id: ascii-folding-filter.md +title: ASCII 摺疊 +summary: >- + `asciifolding`** **篩選器會將 Basic Latin Unicode 區塊 (前 127 個 ASCII 字元) 以外的字元轉換成其 + ASCII 對應字元。 +--- +

    ASCII 摺疊

    asciifolding** ** 篩選器會將Basic Latin Unicode 區塊(前 127 個 ASCII 字元) 以外的字元轉換成其 ASCII 對應字元。例如,它可將í 等字元轉換為i ,使文字處理更簡單、更一致,特別是對於多語言內容。

    +

    設定

    asciifolding 過濾器內建於 Milvus。要使用它,只需在analyzer_params 中的filter 部分指定其名稱即可。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["asciifolding"],​
    +}​
    +
    +

    asciifolding 過濾器會對由 tokenizer 產生的詞彙進行操作,因此必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是asciifolding 過濾器處理文字的範例。

    +

    原始文字

    +
    "Café Möller serves crème brûlée and piñatas."​
    +
    +

    預期輸出

    +
    ["Cafe", "Moller", "serves", "creme", "brulee", "and", "pinatas"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json new file mode 100644 index 000000000..507316a9b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cnalphanumonly\"],​\n}​\n\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"Milvus\", \"是\", \"LF\", \"AI\", \"Data\", \"Foundation\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"Apache\", \"2.0\", \"许可\", \"发布\"]​\n"],"headingContent":"Cnalphanumonly​","anchorList":[{"label":"Cnalphanumonly","href":"Cnalphanumonly​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md new file mode 100644 index 000000000..db096da6c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md @@ -0,0 +1,67 @@ +--- +id: cnalphanumonly-filter.md +title: Cnalphanumonly 過濾器 +summary: '`cnalphanumonly` 過濾器會移除包含任何非中文字元、英文字母或數字以外的字元。' +--- +

    Cnalphanumonly

    cnalphanumonly 過濾器會移除包含任何非中文字元、英文字母或數字以外的字元。

    +

    設定

    cnalphanumonly 過濾器內建於 Milvus。要使用它,只需在analyzer_params 中的filter 部分指定其名稱。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cnalphanumonly"],​
    +}​
    +
    +
    +

    cnalphanumonly 過濾器是在 tokenizer 產生的詞彙上運作,所以它必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是cnalphanumonly 過濾器如何處理文字的範例。

    +

    原始文字

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    預期輸出

    +
    ["Milvus", "是", "LF", "AI", "Data", "Foundation", "下", "的", "一个", "开源", "项目", "以", "Apache", "2.0", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.json new file mode 100644 index 000000000..c33b115d1 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"cncharonly\"],​\n}​\n","\"Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。\"​\n","[\"是\", \"下\", \"的\", \"一个\", \"开源\", \"项目\", \"以\", \"许可\", \"发布\"]​\n"],"headingContent":"Cncharonly​","anchorList":[{"label":"Cncharonly","href":"Cncharonly​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.md new file mode 100644 index 000000000..379d10838 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/cncharonly-filter.md @@ -0,0 +1,66 @@ +--- +id: cncharonly-filter.md +title: 濾波器 +summary: '`cnalphanumonly` 過濾器會移除包含任何非中文字元、英文字母或數字以外的字元。' +--- +

    Cncharonly

    cncharonly 過濾器會移除包含任何非中文字元的標記。當您只想專注於中文文字,濾除任何包含其他文字、數字或符號的標記時,此過濾器非常有用。

    +

    設定

    cncharonly 過濾器內建於 Milvus。要使用它,只需在analyzer_params 中的filter 部分指定其名稱。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["cncharonly"],​
    +}​
    +
    +

    cncharonly 過濾器會對由 tokenizer 產生的詞彙進行操作,因此它必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是cncharonly 過濾器處理文字的範例。

    +

    原始文字

    +
    "Milvus 是 LF AI & Data Foundation 下的一个开源项目,以 Apache 2.0 许可发布。"​
    +
    +

    預期輸出

    +
    ["是", "下", "的", "一个", "开源", "项目", "以", "许可", "发布"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.json new file mode 100644 index 000000000..8be4387b3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"decompounder\", # Specifies the filter type as decompounder​\n \"word_list\": [\"dampf\", \"schiff\", \"fahrt\", \"brot\", \"backen\", \"automat\"],​\n }],​\n}​\n","\"dampfschifffahrt brotbackautomat\"​\n","[\"dampf\", \"schiff\", \"fahrt\", \"brotbackautomat\"]​\n"],"headingContent":"Decompounder​","anchorList":[{"label":"分解詞","href":"Decompounder​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.md new file mode 100644 index 000000000..9940de05d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/decompounder-filter.md @@ -0,0 +1,76 @@ +--- +id: decompounder-filter.md +title: 分解濾波器 +summary: >- + decompompounder」篩選器會根據指定的字典將複合詞分割成單獨的組成部分,使複合詞的部分搜尋變得更容易。此過濾器對於經常使用複合詞的語言特別有用,例如德文。 +--- +

    分解詞

    decompounder 篩選器會根據指定的字典,將複合詞分割成個別元件,讓您更容易搜尋複合詞的部分內容。此過濾器對於經常使用複合詞的語言 (例如德文) 特別有用。

    +

    設定

    decompounder 篩選器是 Milvus 的自訂篩選器。要使用它,請在過濾器設定中指定"type": "decompounder" ,以及提供要識別的詞組字典的word_list 參數。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "decompounder", # Specifies the filter type as decompounder​
    +        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],​
    +    }],​
    +}​
    +
    +

    decompounder 過濾器接受下列可設定的參數。

    +

    參數

    +

    說明

    +

    word_list

    +

    用於分割複合詞的單字元件清單。此字典決定如何將複合詞分解為個別詞彙。

    +
    +

    decompounder 過濾器會對由 tokenizer 產生的詞彙進行操作,因此必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是decompounder 過濾器處理文字的範例。

    +

    原始文字

    +
    "dampfschifffahrt brotbackautomat"​
    +
    +

    預期輸出(含word_list: ["dampf", "schiff", "fahrt", "brot", "backen", "automat"])。

    +
    ["dampf", "schiff", "fahrt", "brotbackautomat"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.json new file mode 100644 index 000000000..4fff14f4e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"length\", # Specifies the filter type as length​\n \"max\": 10, # Sets the maximum token length to 10 characters​\n }],​\n}​\n","\"The length filter allows control over token length requirements for text processing.\"​\n","[\"length\", \"filter\", \"allows\", \"control\", \"over\", \"token\", \"length\", \"for\", \"text\"]​\n"],"headingContent":"Length​","anchorList":[{"label":"長度","href":"Length​","type":1,"isActive":false},{"label":"設定","href":"Configuration","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.md new file mode 100644 index 000000000..7370dc4cb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/length-filter.md @@ -0,0 +1,75 @@ +--- +id: length-filter.md +title: 長度篩選器 +summary: '`length` 過濾器會移除不符合指定長度要求的標記,讓您可以控制文字處理過程中保留的標記長度。' +--- +

    長度

    length 過濾器會移除不符合指定長度要求的字元,讓您可以控制文字處理過程中保留的字元長度。

    +

    設定

    length 篩選器是 Milvus 的自訂篩選器,透過在篩選器設定中設定"type": "length" 來指定。您可以在analyzer_params 內將其設定為字典,以定義長度限制。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "length", # Specifies the filter type as length​
    +        "max": 10, # Sets the maximum token length to 10 characters​
    +    }],​
    +}​
    +
    +

    length 過濾器接受下列可設定的參數。

    +

    參數

    +

    說明

    +

    max

    +

    設定最大符記長度。超過此長度的標記會被移除。

    +
    +

    length 過濾器會對 tokenizer 產生的詞彙進行操作,因此必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是length 過濾器如何處理文字的範例。

    +

    範例文字

    +
    "The length filter allows control over token length requirements for text processing."​
    +
    +

    預期輸出(含max: 10)。

    +
    ["length", "filter", "allows", "control", "over", "token", "length", "for", "text"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.json new file mode 100644 index 000000000..13d73b065 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"],​\n}​\n","\"The Lowercase Filter Ensures Uniformity In Text Processing.\"​\n","[\"the\", \"lowercase\", \"filter\", \"ensures\", \"uniformity\", \"in\", \"text\", \"processing\"]​\n"],"headingContent":"Lowercase​","anchorList":[{"label":"小寫","href":"Lowercase​","type":1,"isActive":false},{"label":"配置","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.md new file mode 100644 index 000000000..1acd885cd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/lowercase-filter.md @@ -0,0 +1,66 @@ +--- +id: lowercase-filter.md +title: 小寫篩選器 +summary: 小寫篩選器會將 tokenizer 產生的詞彙轉換為小寫,使搜尋不區分大小寫。 +--- +

    小寫

    lowercase 過濾器可將 tokenizer 產生的詞彙轉換為小寫,使搜尋不區分大小寫。例如,它可以將["High", "Performance", "Vector", "Database"] 轉換為["high", "performance", "vector", "database"]

    +

    配置

    lowercase 篩選器內建在 Milvus 中。要使用它,只需在analyzer_params 中的filter 部分指定其名稱。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"],​
    +}​
    +
    +

    lowercase 過濾器是在 tokenizer 產生的詞彙上運作,所以它必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是lowercase 過濾器如何處理文字的範例。

    +

    原始文字

    +
    "The Lowercase Filter Ensures Uniformity In Text Processing."​
    +
    +

    預期輸出

    +
    ["the", "lowercase", "filter", "ensures", "uniformity", "in", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.json new file mode 100644 index 000000000..8dbcd42bc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stemmer\", # Specifies the filter type as stemmer​\n \"language\": \"english\", # Sets the language for stemming to English​\n }],​\n}​\n","\"running runs looked ran runner\"​\n","[\"run\", \"run\", \"look\", \"ran\", \"runner\"]​\n"],"headingContent":"Stemmer​","anchorList":[{"label":"詞幹","href":"Stemmer​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.md new file mode 100644 index 000000000..0944e17dd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stemmer-filter.md @@ -0,0 +1,75 @@ +--- +id: stemmer-filter.md +title: 濾波器 +summary: 詞幹」篩選器可將詞彙還原為其基礎或字根形式 (稱為詞幹),使不同轉折中具有類似涵義的詞彙更容易匹配。 +--- +

    詞幹

    stemmer 篩選器可將字彙還原為其基本或字根形式 (稱為詞幹),使不同轉折中具有類似涵義的字彙更容易匹配。stemmer 過濾器支援多種語言,可在各種語言環境中進行有效的搜尋與索引。

    +

    設定

    stemmer 篩選器是 Milvus 的自訂篩選器。若要使用它,請在篩選器設定中指定"type": "stemmer" ,以及language 參數,以選擇所需的語言進行詞幹處理。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stemmer", # Specifies the filter type as stemmer​
    +        "language": "english", # Sets the language for stemming to English​
    +    }],​
    +}​
    +
    +

    stemmer 過濾器接受下列可設定的參數。

    +

    參數

    +

    說明

    +

    language

    +

    指定詞幹處理的語言。支援的語言包括"arabic","danish","dutch","english","finnish","french","german","greek","hungarian","italian","norwegian","portuguese","romanian","russian","spanish","swedish","tamil","turkish"

    +
    +

    stemmer 過濾器會對 tokenizer 產生的詞彙進行操作,因此必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是stemmer 過濾器處理文字的範例。

    +

    原始文字

    +
    "running runs looked ran runner"​
    +
    +

    預期輸出(含language: "english")。

    +
    ["run", "run", "look", "ran", "runner"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.json new file mode 100644 index 000000000..944671ee7 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\":[{​\n \"type\": \"stop\", # Specifies the filter type as stop​\n \"stop_words\": [\"of\", \"to\", \"_english_\"], # Defines custom stop words and includes the English stop word list​\n }],​\n}​\n","\"The stop filter allows control over common stop words for text processing.\"​\n","[\"The\", \"stop\", \"filter\", \"allows\", \"control\", \"common\", \"stop\", \"words\", \"text\", \"processing\"]​\n"],"headingContent":"Stop​","anchorList":[{"label":"停止詞","href":"Stop​","type":1,"isActive":false},{"label":"設定","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.md new file mode 100644 index 000000000..8bd8002a4 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/filter/stop-filter.md @@ -0,0 +1,75 @@ +--- +id: stop-filter.md +title: 停止過濾 +summary: '`stop` 過濾器會從標記化文字中移除指定的停止詞,有助於剔除常見、意義較小的字詞。您可以使用 `stop_words` 參數設定停止詞清單。' +--- +

    停止詞

    stop 篩選器會從標記化文字中移除指定的停止詞,有助於剔除常見、意義較小的字詞。您可以使用stop_words 參數設定停止詞清單。

    +

    設定

    length 篩選器是 Milvus 的自訂篩選器。要使用它,請在過濾器設定中指定"type": "stop" ,以及提供停用字清單的stop_words 參數。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter":[{​
    +        "type": "stop", # Specifies the filter type as stop​
    +        "stop_words": ["of", "to", "_english_"], # Defines custom stop words and includes the English stop word list​
    +    }],​
    +}​
    +
    +

    stop 過濾器接受下列可設定的參數。

    +

    參數

    +

    說明

    +

    stop_words

    +

    要從標記化中移除的詞彙清單。預設使用預先定義的_english_ 清單,包含常見的英文停止詞。_english_ 的詳細資訊可以在這裡找到。

    +
    +

    stop 過濾器會對 tokenizer 產生的詞彙進行操作,因此必須與 tokenizer 結合使用。

    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是stop 過濾器如何處理文字的範例。

    +

    原始文字

    +
    "The stop filter allows control over common stop words for text processing."​
    +
    +

    預期輸出(含stop_words: ["the", "over", "_english_"])。

    +
    ["The", "stop", "filter", "allows", "control", "common", "stop", "words", "text", "processing"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json new file mode 100644 index 000000000..b9eaa5f0f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"jieba\",​\n}​\n","\"Milvus 是一个高性能、可扩展的向量数据库!\"​\n","[\"Milvus\", \" \", \"是\", \"一个\", \"高性\", \"性能\", \"高性能\", \"、\", \"可\", \"扩展\", \"的\", \"向量\", \"数据\", \"据库\", \"数据库\", \"!\"]​\n"],"headingContent":"Jieba​","anchorList":[{"label":"詞霸","href":"Jieba​","type":1,"isActive":false},{"label":"配置","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md new file mode 100644 index 000000000..ab6340a8b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md @@ -0,0 +1,64 @@ +--- +id: jieba-tokenizer.md +title: 傑巴計時器 +summary: jieba」標記化器會將中文文字分解成字詞。 +--- +

    詞霸

    jieba tokenizer 可將中文文字拆解為字詞來處理。

    +

    配置

    要配置使用jieba tokenizer 的分析器,請在analyzer_params 中設定tokenizerjieba

    +
    analyzer_params = {​
    +    "tokenizer": "jieba",​
    +}​
    +
    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效率的符記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是jieba 標記化器如何處理文字的範例。

    +

    原始文字

    +
    "Milvus 是一个高性能、可扩展的向量数据库!"​
    +
    +

    預期輸出

    +
    ["Milvus", " ", "是", "一个", "高性", "性能", "高性能", "、", "可", "扩展", "的", "向量", "数据", "据库", "数据库", "!"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json new file mode 100644 index 000000000..0472b2b16 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"standard\",​\n}​\n\n","analyzer_params = {​\n \"tokenizer\": \"standard\",​\n \"filter\": [\"lowercase\"]​\n}​\n\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale\"]​\n"],"headingContent":"Standard​","anchorList":[{"label":"標準","href":"Standard​","type":1,"isActive":false},{"label":"配置","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md new file mode 100644 index 000000000..020b05aff --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md @@ -0,0 +1,75 @@ +--- +id: standard-tokenizer.md +title: 標準標記器 +summary: Milvus 中的「標準」標記化器會根據空格和標點符號分割文字,因此適用於大多數語言。 +--- +

    標準

    Milvus 中的standard tokenizer 會根據空格和標點符號分割文字,因此適用於大多數語言。

    +

    配置

    要配置使用standard tokenizer 的分析器,請在analyzer_params 中設定tokenizerstandard

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +}​
    +
    +
    +

    standard tokenizer 可以與一個或多個過濾器結合使用。例如,以下程式碼定義了一個使用standard tokenizer 和lowercase 過濾器的分析器。

    +
    analyzer_params = {​
    +    "tokenizer": "standard",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +
    +
    +

    若要簡化設定,您可以選擇使用 standard analyzer,它結合了standard tokenizer 與 lowercase filter.

    +
    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這允許 Milvus 使用指定的分析器來處理該欄位中的文字,以達到有效的標記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是standard 標記化器如何處理文字的範例。

    +

    原始文字

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    預期輸出

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json new file mode 100644 index 000000000..a6567897a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.json @@ -0,0 +1 @@ +{"codeList":["analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n}​\n","analyzer_params = {​\n \"tokenizer\": \"whitespace\",​\n \"filter\": [\"lowercase\"]​\n}​\n","\"The Milvus vector database is built for scale!\"​\n","[\"The\", \"Milvus\", \"vector\", \"database\", \"is\", \"built\", \"for\", \"scale!\"]​\n"],"headingContent":"Whitespace​","anchorList":[{"label":"空格","href":"Whitespace​","type":1,"isActive":false},{"label":"配置","href":"Configuration​","type":2,"isActive":false},{"label":"輸出範例","href":"Example-output​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md new file mode 100644 index 000000000..6b5fed2e9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md @@ -0,0 +1,70 @@ +--- +id: whitespace-tokenizer.md +title: 空白標記器 +summary: 每當字詞之間有空格時,`whitespace` tokenizer 都會將文字分割成詞彙。 +--- +

    空格

    只要字與字之間有空格,whitespace tokenizer 就會將文字分割成詞彙。

    +

    配置

    要設定使用whitespace 記號化器器的分析器,請在analyzer_params 中設定tokenizerwhitespace

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +}​
    +
    +

    空白符記器可與一個或多個過濾器結合使用。例如,以下代碼定義了一個使用whitespace 記號器和 lowercase filter:

    +
    analyzer_params = {​
    +    "tokenizer": "whitespace",​
    +    "filter": ["lowercase"]​
    +}​
    +
    +

    定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這可讓 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效的符記化和過濾。詳情請參閱範例使用

    +

    輸出範例

    以下是whitespace 標記化器如何處理文字的範例。

    +

    原始文字

    +
    "The Milvus vector database is built for scale!"​
    +
    +

    預期輸出

    +
    ["The", "Milvus", "vector", "database", "is", "built", "for", "scale!"]​
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.json new file mode 100644 index 000000000..f86abd379 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3]​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\n# Add an Array field with elements of type VARCHAR​\nschema.add_field(field_name=\"tags\", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​\n# Add an Array field with elements of type INT64​\nschema.add_field(field_name=\"ratings\", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​\n​\n# Add primary field​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\n​\n# Add vector field​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"tags\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(10)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"ratings\")​\n .dataType(DataType.Array)​\n .elementType(DataType.Int64)​\n .maxCapacity(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"tags\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 10,​\n max_length: 65535​\n },​\n {​\n name: \"rating\",​\n data_type: DataType.Array,​\n element_type: DataType.Int64,​\n max_capacity: 5,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export arrayField1='{​\n \"fieldName\": \"tags\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 10,​\n \"max_length\": 100​\n }​\n}'​\n​\nexport arrayField2='{​\n \"fieldName\": \"ratings\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"Int64\",​\n \"elementTypeParams\": {​\n \"max_capacity\": 5​\n }​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $arrayField1,​\n $arrayField2,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","# Prepare index parameters​\nindex_params = client.prepare_index_params() # Prepare IndexParams object​\n​\nindex_params.add_index(​\n field_name=\"tags\", # Name of the Array field to index​\n index_type=\"AUTOINDEX\", # Index type​\n index_name=\"inverted_index\" # Index name​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"tags\")​\n .indexName(\"inverted_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'inverted_index',​\n field_name: 'tags',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, such as L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n"," indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"tags\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_array_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_array_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_array_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_array_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n]​\n​\nclient.insert(​\n collection_name=\"my_array_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"pop\\\", \\\"rock\\\", \\\"classic\\\"], \\\"ratings\\\": [5, 4, 3], \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"jazz\\\", \\\"blues\\\"], \\\"ratings\\\": [4, 5], \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"tags\\\": [\\\"electronic\\\", \\\"dance\\\"], \\\"ratings\\\": [3, 3, 4], \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_array_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n }​\n];​\n​\nclient.insert({​\n collection_name: \"my_array_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"tags\": [\"pop\", \"rock\", \"classic\"],​\n \"ratings\": [5, 4, 3],​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"tags\": [\"jazz\", \"blues\"],​\n \"ratings\": [4, 5],​\n \"pk\": 2,​\n \"embedding\": [0.78, 0.91, 0.23]​\n },​\n {​\n \"tags\": [\"electronic\", \"dance\"],​\n \"ratings\": [3, 3, 4],​\n \"pk\": 3,​\n \"embedding\": [0.67, 0.45, 0.89]​\n } ​\n ],​\n \"collectionName\": \"my_array_collection\"​\n}'​\n\n","filter = 'ratings[0] < 4'​\n​\nres = client.query(​\n collection_name=\"my_array_collection\",​\n filter=filter,​\n output_fields=[\"tags\", \"ratings\", \"embedding\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"ratings[0] < 4\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_array_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​\n\n","client.query({​\n collection_name: 'my_array_collection',​\n filter: 'ratings[0] < 4',​\n output_fields: ['tags', 'ratings', 'embedding']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"filter\": \"ratings[0] < 4\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"embedding\":[0.67,0.45,0.89],\"pk\":3,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[3,3,4]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"electronic\",\"dance\"]}}}}]}​\n\n","filter = 'tags[0] == \"pop\"'​\n​\nres = client.search(​\n collection_name=\"my_array_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"tags\", \"ratings\", \"embedding\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"tags[0] == \\\"pop\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_array_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"tags\", \"ratings\", \"embedding\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_array_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['tags', 'ratings', 'embdding'],​\n filter: 'tags[0] == \"pop\"'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_array_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"filter\": \"tags[0] == \\\"pop\\\"\",​\n \"outputFields\": [\"tags\", \"ratings\", \"embedding\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"embedding\":[0.12,0.34,0.56],\"id\":1,\"ratings\":{\"Data\":{\"LongData\":{\"data\":[5,4,3]}}},\"tags\":{\"Data\":{\"StringData\":{\"data\":[\"pop\",\"rock\",\"classic\"]}}}}]}​\n\n"],"headingContent":"Array Field​","anchorList":[{"label":"陣列欄位","href":"Array-Field​","type":1,"isActive":false},{"label":"新增陣列欄位","href":"Add-Array-field​","type":2,"isActive":false},{"label":"設定索引參數","href":"Set-index-params​","type":2,"isActive":false},{"label":"建立集合","href":"Create-collection​","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data​","type":2,"isActive":false},{"label":"搜尋與查詢","href":"Search-and-query​","type":2,"isActive":false},{"label":"限制","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.md new file mode 100644 index 000000000..6413725df --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/array_data_type.md @@ -0,0 +1,627 @@ +--- +id: array_data_type.md +title: 陣列欄位 +summary: >- + 陣列類型用於儲存包含多個相同資料類型值的欄位。它提供了一種靈活的方式來儲存具有多個元素的屬性,因此在需要儲存一組相關資料的情況下特別有用。在 Milvus + 中,您可以將 Array 欄位與向量資料一起儲存,以實現更複雜的查詢和篩選需求。 +--- +

    陣列欄位

    陣列類型用於儲存包含多個相同資料類型值的欄位。它提供了一種靈活的方式來儲存具有多個元素的屬性,因此在需要儲存一組相關資料的情況下特別有用。在 Milvus 中,您可以將 Array 欄位與向量資料一起儲存,以實現更複雜的查詢和篩選需求。

    +

    例如,在音樂推薦系統中,Array 欄位可以儲存歌曲的標籤清單;在使用者行為分析中,它可以儲存使用者對歌曲的評分。以下是典型 Array 欄位的範例。

    +
    {​
    +  "tags": ["pop", "rock", "classic"],​
    +  "ratings": [5, 4, 3]​
    +}​
    +
    +
    +

    在這個範例中,tagsratings 都是 Array 欄位。tags 欄位是一個字串陣列,代表流行、搖滾和古典等歌曲類型,而ratings 欄位是一個整數陣列,代表使用者對歌曲的評分,從 1 到 5 不等。這些 Array 欄位提供儲存多值資料的彈性方式,讓您在查詢和篩選時更容易執行詳細分析。

    +

    新增陣列欄位

    要在 Milvus 中使用 Array 欄位,請在建立集合模式時定義相關的欄位類型。這個過程包括

    +
      +
    1. datatype 設定為支援的陣列資料類型ARRAY

    2. +
    3. 使用element_type 參數指定陣列中元素的資料類型。這可以是 Milvus 支援的任何標量資料類型,例如VARCHARINT64 。同一 Array 中的所有元素必須是相同的資料類型。

    4. +
    5. 使用max_capacity 參數定義陣列的最大容量,也就是它可以包含的最大元素數量。

    6. +
    +

    以下是如何定義包含 Array 欄位的集合模式。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +# Add an Array field with elements of type VARCHAR​
    +schema.add_field(field_name="tags", datatype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)​
    +# Add an Array field with elements of type INT64​
    +schema.add_field(field_name="ratings", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)​
    +​
    +# Add primary field​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +​
    +# Add vector field​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("tags")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(10)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("ratings")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.Int64)​
    +        .maxCapacity(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "tags",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 10,​
    +    max_length: 65535​
    +  },​
    +  {​
    +    name: "rating",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.Int64,​
    +    max_capacity: 5,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export arrayField1='{​
    +    "fieldName": "tags",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_capacity": 10,​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export arrayField2='{​
    +    "fieldName": "ratings",​
    +    "dataType": "Array",​
    +    "elementDataType": "Int64",​
    +    "elementTypeParams": {​
    +        "max_capacity": 5​
    +    }​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $arrayField1,​
    +        $arrayField2,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    在這個範例中

    +
      +
    • tags 是一個字串陣列, 設為 ,表示陣列中的元素必須是字串。 設為 10,表示陣列最多可包含 10 個元素。element_type VARCHAR max_capacity

    • +
    • ratings 是一個整數陣列, 設為 ,表示陣列中的元素必須是整數。 設為 5,允許最多 5 個評級。element_type INT64 max_capacity

    • +
    • 我們也加入一個主索引欄位pk 和一個向量欄位embedding

    • +
    +
    +

    當您建立集合時,主欄位和向量欄位是必須的。主欄位唯一識別每個實體,而向量欄位對相似性搜尋至關重要。如需詳細資訊,請參閱Primary Field & AutoIDDense VectorBinary VectorSparse Vector

    +
    +

    設定索引參數

    為 Array 欄位設定索引參數是可選的,但可以大幅提高檢索效率。

    +

    在以下範例中,我們為tags 欄位建立AUTOINDEX ,這表示 Milvus 會根據資料類型自動建立適當的標量索引。

    + +
    # Prepare index parameters​
    +index_params = client.prepare_index_params()  # Prepare IndexParams object​
    +​
    +index_params.add_index(​
    +    field_name="tags",  # Name of the Array field to index​
    +    index_type="AUTOINDEX",  # Index type​
    +    index_name="inverted_index"  # Index name​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("tags")​
    +        .indexName("inverted_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'inverted_index',​
    +    field_name: 'tags',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    除了AUTOINDEX 之外,您還可以指定其他標量索引類型,例如INVERTEDBITMAP 。有關支援的索引類型,請參閱標量索引。

    +

    此外,在建立集合之前,您必須先為向量欄位建立索引。在本範例中,我們使用AUTOINDEX 來簡化向量索引的設定。

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, such as L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
     indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "tags",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    建立集合

    使用定義的模式和索引參數建立集合。

    + +
    client.create_collection(​
    +    collection_name="my_array_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_array_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_array_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立資料集後,您可以插入包含 Array 欄位的資料。

    + +
    data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_array_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"tags\": [\"pop\", \"rock\", \"classic\"], \"ratings\": [5, 4, 3], \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"jazz\", \"blues\"], \"ratings\": [4, 5], \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"tags\": [\"electronic\", \"dance\"], \"ratings\": [3, 3, 4], \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_array_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +        "tags": ["pop", "rock", "classic"],​
    +        "ratings": [5, 4, 3],​
    +        "pk": 1,​
    +        "embedding": [0.12, 0.34, 0.56]​
    +    },​
    +    {​
    +        "tags": ["jazz", "blues"],​
    +        "ratings": [4, 5],​
    +        "pk": 2,​
    +        "embedding": [0.78, 0.91, 0.23]​
    +    },​
    +    {​
    +        "tags": ["electronic", "dance"],​
    +        "ratings": [3, 3, 4],​
    +        "pk": 3,​
    +        "embedding": [0.67, 0.45, 0.89]​
    +    }       ​
    +    ],​
    +    "collectionName": "my_array_collection"​
    +}'​
    +
    +
    +

    在這個範例中。

    +
      +
    • 每個資料項目包含一個主要欄位 (pk),而tagsratings 是用來儲存標籤和評分的 Array 欄位。

    • +
    • embedding 是三維向量欄位,用於向量相似性搜尋。

    • +
    +

    搜尋與查詢

    陣列欄位可以在搜尋時進行標量篩選,增強 Milvus 的向量搜尋功能。您可以在進行向量相似性搜尋的同時,根據 Array 欄位的屬性進行查詢。

    +

    篩選查詢

    您可以根據 Array 欄位的屬性篩選資料,例如存取特定元素或檢查陣列元素是否符合特定條件。

    + +
    filter = 'ratings[0] < 4'​
    +​
    +res = client.query(​
    +    collection_name="my_array_collection",​
    +    filter=filter,​
    +    output_fields=["tags", "ratings", "embedding"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'pk': 3, 'tags': ['electronic', 'dance'], 'ratings': [3, 3, 4], 'embedding': [np.float32(0.67), np.float32(0.45), np.float32(0.89)]}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "ratings[0] < 4";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={ratings=[3, 3, 4], pk=3, embedding=[0.7, 0.8, 0.9], tags=[electronic, dance]})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_array_collection',​
    +    filter: 'ratings[0] < 4',​
    +    output_fields: ['tags', 'ratings', 'embedding']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "filter": "ratings[0] < 4",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"embedding":[0.67,0.45,0.89],"pk":3,"ratings":{"Data":{"LongData":{"data":[3,3,4]}}},"tags":{"Data":{"StringData":{"data":["electronic","dance"]}}}}]}​
    +
    +
    +

    在這個查詢中,Milvus 篩選出ratings 陣列中第一個元素小於 4 的實體,並傳回符合條件的實體。

    +

    向量搜尋與陣列過濾

    將向量相似性與陣列篩選結合,就能確保擷取的資料不僅語意相似,也符合特定條件,讓搜尋結果更精確,更符合業務需求。

    + +
    filter = 'tags[0] == "pop"'​
    +​
    +res = client.search(​
    +    collection_name="my_array_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["tags", "ratings", "embedding"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 1.1276001930236816, 'entity': {'ratings': [5, 4, 3], 'embedding': [0.11999999731779099, 0.3400000035762787, 0.5600000023841858], 'tags': ['pop', 'rock', 'classic']}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "tags[0] == \"pop\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_array_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("tags", "ratings", "embedding"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={ratings=[5, 4, 3], embedding=[0.1, 0.2, 0.3], tags=[pop, rock, classic]}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_array_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['tags', 'ratings', 'embdding'],​
    +    filter: 'tags[0] == "pop"'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_array_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "filter": "tags[0] == \"pop\"",​
    +    "outputFields": ["tags", "ratings", "embedding"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"distance":-0.24793813,"embedding":[0.12,0.34,0.56],"id":1,"ratings":{"Data":{"LongData":{"data":[5,4,3]}}},"tags":{"Data":{"StringData":{"data":["pop","rock","classic"]}}}}]}​
    +
    +
    +

    在這個範例中,Milvus 返回與查詢向量最相似的前 5 個實體,tags 陣列的第一個元素是"pop"

    +

    此外,Milvus 支援進階的陣列過濾運算元,如ARRAY_CONTAINS,ARRAY_CONTAINS_ALL,ARRAY_CONTAINS_ANY, 和ARRAY_LENGTH ,以進一步增強查詢能力。如需詳細資訊,請參閱Metadata 過濾

    +

    限制

      +
    • 資料類型:陣列欄位中的所有元素必須具有相同的資料類型,如element_type 所指定。

    • +
    • 陣列容量:陣列欄位中元素的數量必須小於或等於建立陣列時所定義的最大容量,如max_capacity 所指定。

    • +
    • 字串處理:Array 欄位中的字串值會以原樣儲存,不會進行語意轉義或轉換。例如,'a"b',"a'b",'a\'b', 和"a\"b" 會以輸入的方式儲存,而'a'b'"a"b" 則視為無效值。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.json new file mode 100644 index 000000000..9e600f3cb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"binary_vector\", datatype=DataType.BINARY_VECTOR, dim=128)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"binary_vector\")​\n .dataType(DataType.BinaryVector)​\n .dimension(128)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"binary vector\",​\n data_type: DataType.BinaryVector,​\n dim: 128,​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"binary_vector\",​\n \"dataType\": \"BinaryVector\",​\n \"elementTypeParams\": {​\n \"dim\": 128​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ],​\n \\\"enableDynamicField\\\": true​\n}\"​\n​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"binary_vector\",​\n index_name=\"binary_vector_index\",​\n index_type=\"BIN_IVF_FLAT\",​\n metric_type=\"HAMMING\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexParams = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexParams.add(IndexParam.builder()​\n .fieldName(\"binary_vector\")​\n .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​\n .metricType(IndexParam.MetricType.HAMMING)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n indexName: \"binary_vector_index\",​\n field_name: \"binary_vector\",​\n metric_type: MetricType.HAMMING,​\n index_type: IndexType.BIN_IVF_FLAT,​\n params: {​\n nlist: 128,​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"binary_vector\",​\n \"metricType\": \"HAMMING\",​\n \"indexName\": \"binary_vector_index\",​\n \"indexType\": \"BIN_IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_binary_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","def convert_bool_list_to_bytes(bool_list):​\n if len(bool_list) % 8 != 0:​\n raise ValueError(\"The length of a boolean list must be a multiple of 8\")​\n​\n byte_array = bytearray(len(bool_list) // 8)​\n for i, bit in enumerate(bool_list):​\n if bit == 1:​\n index = i // 8​\n shift = i % 8​\n byte_array[index] |= (1 << shift)​\n return bytes(byte_array)​\n​\n​\nbool_vectors = [​\n [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​\n [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​\n]​\n​\ndata = [{\"binary_vector\": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​\n​\nclient.insert(​\n collection_name=\"my_binary_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nprivate static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​\n byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​\n for (int i = 0; i < booleanArray.length; i++) {​\n if (booleanArray[i]) {​\n int index = i / Byte.SIZE;​\n int shift = i % Byte.SIZE;​\n byteArray[index] |= (byte) (1 << shift);​\n }​\n }​\n​\n return byteArray;​\n}​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n{​\n boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​\n JsonObject row = new JsonObject();​\n row.add(\"binary_vector\", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_binary_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"data\\\": $data,​\n \\\"collectionName\\\": \\\"my_binary_collection\\\"​\n}\"​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​\nquery_vector = convert_bool_list_to_bytes(query_bool_list)​\n​\nres = client.search(​\n collection_name=\"my_binary_collection\",​\n data=[query_vector],​\n anns_field=\"binary_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.BinaryVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nboolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​\nBinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_binary_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"binary_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\n System.out.println(searchR.getSearchResults());​\n ​\n // Output​\n //​\n // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​\n\n","query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​\n​\nclient.search({​\n collection_name: 'my_binary_collection',​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","export searchParams='{​\n \"params\":{\"nprobe\":10}​\n }'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_binary_collection\\\",​\n \\\"data\\\": $data,​\n \\\"annsField\\\": \\\"binary_vector\\\",​\n \\\"limit\\\": 5,​\n \\\"searchParams\\\":$searchParams,​\n \\\"outputFields\\\": [\\\"pk\\\"]​\n}\"​\n\n"],"headingContent":"Binary Vector​","anchorList":[{"label":"二進位向量","href":"Binary-Vector​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"在 Milvus 中使用二進位向量","href":"Use-binary-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.md new file mode 100644 index 000000000..0aa7167dd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/binary-vector.md @@ -0,0 +1,440 @@ +--- +id: binary-vector.md +title: 二進位向量 +summary: >- + 二進位向量是一種特殊的資料表示形式,可將傳統的高維浮點向量轉換成只包含 0 和 1 + 的二進位向量。這種轉換不僅壓縮了向量的大小,還降低了儲存和計算成本,同時保留了語義資訊。當非關鍵特徵的精確度並非必要時,二進位向量可以有效地維持原始浮點向量的大部分完整性與效用。 +--- +

    二進位向量

    二進位向量是一種特殊的資料表示形式,可將傳統的高維浮點向量轉換成只包含 0 和 1 的二進位向量。這種轉換不僅壓縮了向量的大小,還降低了儲存和計算成本,同時保留了語義資訊。當非關鍵特徵的精確度不重要時,二進位向量可以有效地維持原始浮點向量的大部分完整性和效用。

    +

    二進位向量的應用範圍非常廣泛,尤其是在計算效率和儲存最佳化非常重要的情況下。在大型人工智能系統中,例如搜尋引擎或推薦系統,即時處理大量資料是關鍵。透過減少向量的大小,二進位向量有助於降低延遲和計算成本,而不會大幅犧牲精確度。此外,二進位向量適用於資源有限的環境,例如記憶體和處理能力有限的行動裝置和嵌入式系統。透過二進位向量的使用,複雜的人工智慧功能可以在這些受限的環境中實作,同時維持高效能。

    +

    概述

    二進位向量是一種將複雜物件(如影像、文字或音訊)編碼成固定長度二進位數值的方法。在 Milvus 中,二進位向量通常表示為位元陣列或位元組陣列。例如,一個 8 維的二進位向量可以表示為[1, 0, 1, 1, 0, 0, 1, 0]

    +

    下圖顯示二進位向量如何表示文字內容中關鍵字的存在。在這個例子中,一個 10 維的二進位向量用來表示兩個不同的文字(文字 1文字 2),其中每個維度對應詞彙中的一個字:1 表示文字中存在該字,0 表示不存在該字。

    +

    + + Binary vector representation of text content + 文字內容的二進位向量表示法

    +

    二進位向量具有以下特點。

    +
      +
    • 高效儲存:每個維度只需要 1 位元的儲存空間,大幅減少儲存空間。

    • +
    • 快速計算:向量之間的相似性可以使用 XOR 等位元運算快速計算。

    • +
    • 固定長度:不論原始文字的長度如何,向量的長度都保持不變,讓索引和檢索變得更容易。

    • +
    • 簡單直覺:直接反映關鍵字的存在,適合某些專門的檢索任務。

    • +
    +

    二進位向量可以透過各種方法產生。在文字處理中,可以使用預先定義的詞彙,根據字詞的存在設定相對應的位元。在影像處理中,感知散列演算法 (如pHash) 可以產生影像的二進位特徵。在機器學習應用程式中,模型輸出可進行二進位,以獲得二進位向量表示。

    +

    在二進位向量化之後,資料可以儲存在 Milvus 中進行管理和向量檢索。下圖顯示基本流程。

    +

    + + Use binary vectors in Milvus + 在 Milvus 中使用二進位向量

    +
    +

    雖然二進位向量在特定情境中表現優異,但其表達能力有其限制,難以捕捉複雜的語意關係。因此,在現實世界的情境中,二進位向量通常會與其他向量類型一起使用,以平衡效率與表達能力。如需詳細資訊,請參閱密集向量 (Dense Vector) 與稀疏向量 (Sparse Vector)。

    +
    +

    在 Milvus 中使用二進位向量

    新增向量領域

    要在 Milvus 中使用二進位向量,首先在建立集合時定義一個向量欄位來儲存二進位向量。這個過程包括

    +
      +
    1. datatype 設定為支援的二進位向量資料類型,即BINARY_VECTOR

    2. +
    3. 使用dim 參數指定向量的尺寸。請注意,dim 必須是 8 的倍數,因為二進位向量在插入時必須轉換成位元組。每 8 個布林值 (0 或 1) 會打包成 1 個位元組。例如,如果dim=128 ,插入時需要一個 16 位元組的陣列。

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="binary_vector", datatype=DataType.BINARY_VECTOR, dim=128)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("binary_vector")​
    +        .dataType(DataType.BinaryVector)​
    +        .dimension(128)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "binary vector",​
    +  data_type: DataType.BinaryVector,​
    +  dim: 128,​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "binary_vector",​
    +    "dataType": "BinaryVector",​
    +    "elementTypeParams": {​
    +        "dim": 128​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ],​
    +    \"enableDynamicField\": true​
    +}"​
    +​
    +
    +
    +

    在這個範例中,新增了一個向量欄位,名為binary_vector ,用來儲存二進位向量。這個欄位的資料類型是BINARY_VECTOR ,維數是 128。

    +

    為向量欄位設定索引參數

    為了加快搜尋速度,必須為二進位向量欄位建立索引。索引可大幅提升大型向量資料的檢索效率。

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="binary_vector",​
    +    index_name="binary_vector_index",​
    +    index_type="BIN_IVF_FLAT",​
    +    metric_type="HAMMING",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexParams.add(IndexParam.builder()​
    +        .fieldName("binary_vector")​
    +        .indexType(IndexParam.IndexType.BIN_IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.HAMMING)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +  indexName: "binary_vector_index",​
    +  field_name: "binary_vector",​
    +  metric_type: MetricType.HAMMING,​
    +  index_type: IndexType.BIN_IVF_FLAT,​
    +  params: {​
    +    nlist: 128,​
    +  },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "binary_vector",​
    +            "metricType": "HAMMING",​
    +            "indexName": "binary_vector_index",​
    +            "indexType": "BIN_IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    在上面的範例中,使用BIN_IVF_FLAT 索引類型,為binary_vector 欄位建立一個名為binary_vector_index 的索引。metric_type 設定為HAMMING ,表示使用漢明距離進行相似性測量。

    +

    除了BIN_IVF_FLAT 之外,Milvus 還支援二進位向量的其他索引類型。如需詳細資訊,請參閱進位向量索引。此外,Milvus 也支援二進位向量的其他相似度指標。如需詳細資訊,請參閱度量類型

    +

    建立集合

    二進位向量和索引設定完成後,建立一個包含二進位向量的集合。以下範例使用create_collection 方法建立一個名為my_binary_collection 的集合。

    + +
    client.create_collection(​
    +    collection_name="my_binary_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立集合後,使用insert 方法加入包含二進位向量的資料。請注意,二進位向量應以位元組陣列的形式提供,其中每個位元組代表 8 個布林值。

    +

    例如,對於 128 位元的二進位向量,需要一個 16 位元組的陣列 (因為 128 位元 ÷ 8 位元/位元組 = 16 位元組)。以下是插入資料的範例程式碼。

    + +
    def convert_bool_list_to_bytes(bool_list):​
    +    if len(bool_list) % 8 != 0:​
    +        raise ValueError("The length of a boolean list must be a multiple of 8")​
    +​
    +    byte_array = bytearray(len(bool_list) // 8)​
    +    for i, bit in enumerate(bool_list):​
    +        if bit == 1:​
    +            index = i // 8​
    +            shift = i % 8​
    +            byte_array[index] |= (1 << shift)​
    +    return bytes(byte_array)​
    +​
    +​
    +bool_vectors = [​
    +    [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112,​
    +    [0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1] + [0] * 112,​
    +]​
    +​
    +data = [{"binary_vector": convert_bool_list_to_bytes(bool_vector) for bool_vector in bool_vectors}]​
    +​
    +client.insert(​
    +    collection_name="my_binary_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +private static byte[] convertBoolArrayToBytes(boolean[] booleanArray) {​
    +    byte[] byteArray = new byte[booleanArray.length / Byte.SIZE];​
    +    for (int i = 0; i < booleanArray.length; i++) {​
    +        if (booleanArray[i]) {​
    +            int index = i / Byte.SIZE;​
    +            int shift = i % Byte.SIZE;​
    +            byteArray[index] |= (byte) (1 << shift);​
    +        }​
    +    }​
    +​
    +    return byteArray;​
    +}​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +{​
    +    boolean[] boolArray = {false, true, false, true, false, true, false, false, true, true, false, false, true, true, false, true};​
    +    JsonObject row = new JsonObject();​
    +    row.add("binary_vector", gson.toJsonTree(convertBoolArrayToBytes(boolArray)));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +  { binary_vector: [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_binary_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"data\": $data,​
    +    \"collectionName\": \"my_binary_collection\"​
    +}"​
    +
    +
    +

    執行相似性搜尋

    相似性搜尋是 Milvus 的核心功能之一,可讓您根據向量之間的距離,快速找到與查詢向量最相似的資料。若要使用二進位向量執行相似性搜尋,請準備查詢向量和搜尋參數,然後調用search 方法。

    +

    在搜尋作業期間,二進位向量也必須以位元組陣列的形式提供。確保查詢向量的維度與定義dim 時指定的維度相符,且每 8 個布林值會轉換成 1 個位元組。

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_bool_list = [1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0] + [0] * 112​
    +query_vector = convert_bool_list_to_bytes(query_bool_list)​
    +​
    +res = client.search(​
    +    collection_name="my_binary_collection",​
    +    data=[query_vector],​
    +    anns_field="binary_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172268', 'distance': 10.0, 'entity': {'pk': '453718927992172268'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.BinaryVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +boolean[] boolArray = {true, false, false, true, true, false, true, true, false, true, false, false, true, true, false, true};​
    +BinaryVec queryVector = new BinaryVec(convertBoolArrayToBytes(boolArray));​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_binary_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("binary_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    + System.out.println(searchR.getSearchResults());​
    + ​
    + // Output​
    + //​
    + // [[SearchResp.SearchResult(entity={pk=453444327741536775}, score=0.0, id=453444327741536775), SearchResp.SearchResult(entity={pk=453444327741536776}, score=7.0, id=453444327741536776)]]​
    +
    +
    +
    query_vector = [1,0,1,0,1,1,1,1,1,1,1,1];​
    +​
    +client.search({​
    +    collection_name: 'my_binary_collection',​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    export searchParams='{​
    +        "params":{"nprobe":10}​
    +    }'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_binary_collection\",​
    +    \"data\": $data,​
    +    \"annsField\": \"binary_vector\",​
    +    \"limit\": 5,​
    +    \"searchParams\":$searchParams,​
    +    \"outputFields\": [\"pk\"]​
    +}"​
    +
    +
    +

    有關相似性搜尋參數的詳細資訊,請參閱基本 ANN 搜尋

    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.json new file mode 100644 index 000000000..0deba3904 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.json @@ -0,0 +1 @@ +{"codeList":["[​\n -0.013052909,​\n 0.020387933,​\n -0.007869,​\n -0.11111383,​\n -0.030188112,​\n -0.0053388323,​\n 0.0010654867,​\n 0.072027855,​\n // ... more dimensions​\n]​\n​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=4)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense_vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(4)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nschema.push({​\n name: \"dense_vector\",​\n data_type: DataType.FloatVector,​\n dim: 128,​\n});​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"dense_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 4​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"dense_vector\",​\n index_name=\"dense_vector_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128}​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\",128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"dense_vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","import { MetricType, IndexType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst indexParams = {​\n index_name: 'dense_vector_index',​\n field_name: 'dense_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.IVF_FLAT,​\n params: {​\n nlist: 128​\n },​\n};​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_vector_index\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_dense_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_dense_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_dense_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.7]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.8]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_dense_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.1, 0.2, 0.3, 0.4]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"dense_vector\\\": [0.2, 0.3, 0.4, 0.5]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { dense_vector: [0.1, 0.2, 0.3, 0.7] },​\n { dense_vector: [0.2, 0.3, 0.4, 0.8] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_dense_collection\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"dense_vector\": [0.1, 0.2, 0.3, 0.4]},​\n {\"dense_vector\": [0.2, 0.3, 0.4, 0.5]} ​\n ],​\n \"collectionName\": \"my_dense_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572531\",\"453577185629572532\"]}}​\n\n","search_params = {​\n \"params\": {\"nprobe\": 10}​\n}​\n​\nquery_vector = [0.1, 0.2, 0.3, 0.7]​\n​\nres = client.search(​\n collection_name=\"my_dense_collection\",​\n data=[query_vector],​\n anns_field=\"dense_vector\",​\n search_params=search_params,​\n limit=5,​\n output_fields=[\"pk\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"nprobe\",10);​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_dense_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"dense_vector\")​\n .searchParams(searchParams)​\n .topK(5)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​\n\n","query_vector = [0.1, 0.2, 0.3, 0.7];​\n​\nclient.search({​\n collection_name: my_dense_collection,​\n data: query_vector,​\n limit: 5,​\n output_fields: ['pk'],​\n params: {​\n nprobe: 10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dense_collection\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.7]​\n ],​\n \"annsField\": \"dense_vector\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.55,\"id\":\"453577185629572532\",\"pk\":\"453577185629572532\"},{\"distance\":0.42,\"id\":\"453577185629572531\",\"pk\":\"453577185629572531\"}]}​\n\n"],"headingContent":"Dense Vector​","anchorList":[{"label":"密集向量","href":"Dense-Vector​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"在 Milvus 中使用密集向量","href":"Use-dense-vectors-in-Milvus​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.md new file mode 100644 index 000000000..4cbe8e164 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/dense-vector.md @@ -0,0 +1,425 @@ +--- +id: dense-vector.md +title: 密集向量 +summary: >- + 密集向量是機器學習和資料分析中廣泛使用的數值資料表示。它們由實數陣列組成,其中大多數或所有元素都是非零的。與稀疏向量相比,密集向量在相同的維度層級上包含更多的資訊,因為每個維度都持有有意義的值。這種表示方式可以有效捕捉複雜的模式和關係,讓資料更容易在高維空間中分析和處理。密集向量通常有固定的維數,從幾十到幾百甚至上千不等,視特定的應用程式和需求而定。 +--- +

    密集向量

    密集向量是廣泛用於機器學習和資料分析的數值資料表示。它們由實數陣列組成,其中大多數或所有元素都是非零的。與稀疏向量相比,密集向量在相同的維度層級中包含更多的資訊,因為每個維度都持有有意義的值。這種表示方式可以有效捕捉複雜的模式和關係,讓資料更容易在高維空間中分析和處理。密集向量通常有固定的維數,從幾十到幾百甚至上千不等,這取決於特定的應用程式和需求。

    +

    密集向量主要用於需要瞭解資料語意的情境,例如語意搜尋和推薦系統。在語意搜尋中,密集向量有助於捕捉查詢與文件之間的潛在關聯,從而改善搜尋結果的相關性。在推薦系統中,密集向量有助於識別使用者與項目之間的相似性,提供更個人化的建議。

    +

    概述

    密集向量通常以固定長度的浮點數陣列表示,例如[0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5] 。這些向量的維度通常從數百到數千不等,例如 128、256、768 或 1024。每個維度都能捕捉物件的特定語意特徵,透過相似性計算使其適用於各種場景。

    +

    + + Dense vectors in 2D space + 2D 空間中的密集向量

    +

    上圖說明密集向量在 2D 空間中的表示。雖然實際應用中的密集向量通常有更高的維度,但這個 2D 圖解有效地傳達了幾個關鍵概念。

    +
      +
    • 多維表示:每個點代表一個概念物件 (如Milvus向量資料庫檢索系統等),其位置由其維度值來決定。

    • +
    • 語意關係:點與點之間的距離反映了概念之間的語義相似性。較近的點則表示語義關係較密切的概念。

    • +
    • 聚類效應:相關的概念(例如Milvus向量資料庫檢索系統)在空間中的位置彼此接近,形成一個語意叢集。

    • +
    +

    以下是表示文字"Milvus is an efficient vector database" 的真實密集向量範例。

    +
    [​
    +    -0.013052909,​
    +    0.020387933,​
    +    -0.007869,​
    +    -0.11111383,​
    +    -0.030188112,​
    +    -0.0053388323,​
    +    0.0010654867,​
    +    0.072027855,​
    +    // ... more dimensions​
    +]​
    +​
    +
    +
    +

    稠密向量可以使用各種嵌入模型產生,例如針對影像的 CNN 模型 (如ResNetVGG),以及針對文字的語言模型 (如BERTWord2Vec)。這些模型可將原始資料轉換為高維空間中的點數,捕捉資料的語意特徵。此外,Milvus 還提供方便的方法,協助使用者產生和處理密集向量,詳情請參閱 Embeddings。

    +

    一旦資料被向量化,就可以儲存在 Milvus 中進行管理和向量檢索。下圖顯示基本流程。

    +

    + + Use dense vecctors in Milvus + 在 Milvus 中使用密集向量

    +
    +

    除了密集向量,Milvus 也支援稀疏向量和二進位向量。稀疏向量適用於基於特定詞彙的精確匹配,例如關鍵字搜尋和詞彙匹配,而二進位向量常用於有效處理二進位資料,例如圖像模式匹配和某些雜湊應用。如需詳細資訊,請參閱二進位向量稀疏向量

    +
    +

    在 Milvus 中使用密集向量

    新增向量領域

    要在 Milvus 中使用密集向量,首先在建立集合時定義一個向量欄位來儲存密集向量。這個過程包括

    +
      +
    1. datatype 設定為支援的密集向量資料類型。有關支援的密集向量資料類型,請參閱資料類型。

    2. +
    3. 使用dim 參數指定密集向量的尺寸。

    4. +
    +

    在下面的範例中,我們新增一個名為dense_vector 的向量欄位來儲存密集向量。欄位的資料類型是FLOAT_VECTOR ,維度是4

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense_vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(4)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +schema.push({​
    +  name: "dense_vector",​
    +  data_type: DataType.FloatVector,​
    +  dim: 128,​
    +});​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "dense_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 4​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    密集向量欄位支援的資料類型

    + + + + + + + + + +
    類型說明
    FLOAT_VECTOR儲存 32 位元浮點數,常用於表示科學計算和機器學習中的實數。適用於需要高精確度的情況,例如區分相似向量。
    FLOAT16_VECTOR儲存 16 位元半精確浮點數,用於深度學習和 GPU 運算。在精確度不太重要的情況下,例如推薦系統的低精確度召回階段,可節省儲存空間。
    BFLOAT16_VECTOR儲存 16 位元腦浮點 (bfloat16) 數字,提供與 Float32 相同的指數範圍,但精確度較低。適用於需要快速處理大量向量的情況,例如大規模的影像檢索。
    +

    為向量欄位設定索引參數

    為了加速語意搜尋,必須為向量欄位建立索引。索引可大幅提升大規模向量資料的檢索效率。

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="dense_vector",​
    +    index_name="dense_vector_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128}​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist",128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("dense_vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    import { MetricType, IndexType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const indexParams = {​
    +    index_name: 'dense_vector_index',​
    +    field_name: 'dense_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.IVF_FLAT,​
    +    params: {​
    +      nlist: 128​
    +    },​
    +};​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense_vector",​
    +            "metricType": "IP",​
    +            "indexName": "dense_vector_index",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +
    +
    +

    在上面的範例中,使用IVF_FLAT 索引類型為dense_vector 欄位建立了一個名為dense_vector_index 的索引。metric_type 設為IP ,表示將使用內積作為距離指標。

    +

    Milvus 也支援其他索引類型。如需詳細資訊,請參閱浮動向量索引。此外,Milvus 也支援其他公制類型。如需詳細資訊,請參閱公制類型

    +

    建立集合

    一旦密集向量和索引參數設定完成,您就可以建立一個包含密集向量的集合。以下範例使用create_collection 方法建立一個名為my_dense_collection 的集合。

    + +
    client.create_collection(​
    +    collection_name="my_dense_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_dense_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_dense_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立集合後,使用insert 方法加入包含密集向量的資料。確保插入的密集向量的維度與新增密集向量欄位時定義的dim 值相符。

    + +
    data = [​
    +    {"dense_vector": [0.1, 0.2, 0.3, 0.7]},​
    +    {"dense_vector": [0.2, 0.3, 0.4, 0.8]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_dense_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.1, 0.2, 0.3, 0.4]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"dense_vector\": [0.2, 0.3, 0.4, 0.5]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { dense_vector: [0.1, 0.2, 0.3, 0.7] },​
    +  { dense_vector: [0.2, 0.3, 0.4, 0.8] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_dense_collection",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"dense_vector": [0.1, 0.2, 0.3, 0.4]},​
    +        {"dense_vector": [0.2, 0.3, 0.4, 0.5]}        ​
    +    ],​
    +    "collectionName": "my_dense_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572531","453577185629572532"]}}​
    +
    +
    +

    執行相似性搜尋

    基於密集向量的語意搜尋是 Milvus 的核心功能之一,可讓您根據向量之間的距離,快速找到與查詢向量最相似的資料。若要執行相似性搜尋,請準備查詢向量和搜尋參數,然後調用search 方法。

    + +
    search_params = {​
    +    "params": {"nprobe": 10}​
    +}​
    +​
    +query_vector = [0.1, 0.2, 0.3, 0.7]​
    +​
    +res = client.search(​
    +    collection_name="my_dense_collection",​
    +    data=[query_vector],​
    +    anns_field="dense_vector",​
    +    search_params=search_params,​
    +    limit=5,​
    +    output_fields=["pk"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("nprobe",10);​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.1f, 0.3f, 0.3f, 0.4f});​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_dense_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("dense_vector")​
    +        .searchParams(searchParams)​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536779}, score=0.65, id=453444327741536779), SearchResp.SearchResult(entity={pk=453444327741536778}, score=0.65, id=453444327741536778)]]​
    +
    +
    +
    query_vector = [0.1, 0.2, 0.3, 0.7];​
    +​
    +client.search({​
    +    collection_name: my_dense_collection,​
    +    data: query_vector,​
    +    limit: 5,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        nprobe: 10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dense_collection",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.7]​
    +    ],​
    +    "annsField": "dense_vector",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.55,"id":"453577185629572532","pk":"453577185629572532"},{"distance":0.42,"id":"453577185629572531","pk":"453577185629572531"}]}​
    +
    +
    +

    有關相似性搜尋參數的詳細資訊,請參閱基本 ANN 搜尋

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.json new file mode 100644 index 000000000..b5c2ed477 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient= MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.create_collection(​\n collection_name=\"my_dynamic_collection\",​\n dimension=5,​\n # highlight-next-line​\n enable_dynamic_field=True​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .dimension(5)​\n // highlight-next-line​\n .enableDynamicField(true)​\n .build()​\nclient.createCollection(createCollectionReq);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new Client({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: \"customized_setup_2\",​\n schema: schema,​\n // highlight-next-line​\n enable_dynamic_field: true​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"dimension\": 5,​\n \"enableDynamicField\": true​\n}'​\n\n","[​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n\n","data=[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}​\n]​\n​\nres = client.insert(​\n collection_name=\"my_dynamic_collection\",​\n data=data​\n)​\n​\nprint(res)​\n​\n# Output​\n# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n ​\nGson gson = new Gson();​\nList data = Arrays.asList(​\n gson.fromJson(\"{\\\"id\\\": 0, \\\"vector\\\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \\\"color\\\": \\\"pink_8682\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \\\"color\\\": \\\"red_7025\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \\\"color\\\": \\\"orange_6781\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \\\"color\\\": \\\"pink_9298\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \\\"color\\\": \\\"red_4794\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 5, \\\"vector\\\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \\\"color\\\": \\\"yellow_4222\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 6, \\\"vector\\\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \\\"color\\\": \\\"red_9392\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 7, \\\"vector\\\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \\\"color\\\": \\\"grey_8510\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 8, \\\"vector\\\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \\\"color\\\": \\\"white_9381\\\"}\", JsonObject.class),​\n gson.fromJson(\"{\\\"id\\\": 9, \\\"vector\\\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \\\"color\\\": \\\"purple_4976\\\"}\", JsonObject.class)​\n);​\n​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\nSystem.out.println(insertResp);​\n​\n// Output:​\n//​\n// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​\n\n","const { DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\n// 3. Insert some data​\n​\nvar data = [​\n {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: \"pink_8682\"},​\n {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: \"red_7025\"},​\n {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: \"orange_6781\"},​\n {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: \"pink_9298\"},​\n {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: \"red_4794\"},​\n {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: \"yellow_4222\"},​\n {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: \"red_9392\"},​\n {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: \"grey_8510\"},​\n {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: \"white_9381\"},​\n {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: \"purple_4976\"} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"quick_setup\",​\n data: data,​\n})​\n​\nconsole.log(res.insert_cnt)​\n​\n// Output​\n// ​\n// 10​\n// ​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"} ​\n ],​\n \"collectionName\": \"my_dynamic_collection\"​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": {​\n# \"insertCount\": 10,​\n# \"insertIds\": [​\n# 0,​\n# 1,​\n# 2,​\n# 3,​\n# 4,​\n# 5,​\n# 6,​\n# 7,​\n# 8,​\n# 9​\n# ]​\n# }​\n# }​\n\n","query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_dynamic_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\"',​\n output_fields=[\"color\"]​\n # highlight-end​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_dynamic_collection\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(queryVector))​\n .outputFields(Collections.singletonList(\"color\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .topK(5)​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​\n​\n\n","const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: \"color like \\\"red%\\\"\",​\n output_fields: [\"color\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_dynamic_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"distance\":0.6290165,\"id\":1},{\"color\":\"red_4794\",\"distance\":0.5975797,\"id\":4},{\"color\":\"red_9392\",\"distance\":-0.24996185,\"id\":6}]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Dynamic Field​","anchorList":[{"label":"動態欄位","href":"Dynamic-Field​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"啟用動態欄位","href":"Enable-dynamic-field​","type":2,"isActive":false},{"label":"使用動態欄位","href":"Use-dynamic-field​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.md new file mode 100644 index 000000000..68ce6a190 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/enable-dynamic-field.md @@ -0,0 +1,378 @@ +--- +id: enable-dynamic-field.md +title: 啟用動態欄位 +summary: 在要插入的實體中,必須包含在集合的模式中定義的所有欄位。如果您希望某些欄位是可選的,請考慮啟用動態欄位。本主題描述如何啟用和使用動態欄位。 +--- +

    動態欄位

    在要插入的實體中,必須包含在集合的模式中定義的所有欄位。如果您希望某些欄位是可選的,請考慮啟用動態欄位。本主題描述如何啟用和使用動態欄位。

    +

    概述

    在 Milvus 中,您可以透過設定集合中每個欄位的名稱和資料類型來建立集合模式。當您在模式中加入欄位時,請確認此欄位包含在您要插入的實體中。如果您希望某些欄位是可選的,啟用動態欄位是一個選擇。

    +

    動態欄位是一個保留欄位,名為$meta ,屬於 JavaScript Object Notation (JSON) 類型。實體中任何未在模式中定義的欄位,都會以鍵值對的形式儲存在這個保留的 JSON 欄位中。

    +

    對於啟用動態欄位的集合,您可以使用動態欄位中的鍵進行標量篩選,就像使用模式中明確定義的欄位一樣。

    +

    啟用動態欄位

    使用「立即建立集合」中所述的方法建立的集合,預設會啟用動態欄位。您也可以在使用自訂設定建立集合時,手動啟用動態欄位。

    + +
    from pymilvus import MilvusClient​
    +​
    +client= MilvusClient(uri="http://localhost:19530")​
    +​
    +client.create_collection(​
    +    collection_name="my_dynamic_collection",​
    +    dimension=5,​
    +    # highlight-next-line​
    +    enable_dynamic_field=True​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +    .collectionName("my_dynamic_collection")​
    +    .dimension(5)​
    +    // highlight-next-line​
    +    .enableDynamicField(true)​
    +    .build()​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new Client({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: "customized_setup_2",​
    +    schema: schema,​
    +    // highlight-next-line​
    +    enable_dynamic_field: true​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "dimension": 5,​
    +    "enableDynamicField": true​
    +}'​
    +
    +
    +

    使用動態欄位

    當您的集合啟用動態欄位時,所有未在模式中定義的欄位及其值,都會以鍵值對的方式儲存在動態欄位中。

    +

    例如,假設您的集合模式只定義了兩個欄位,分別命名為idvector ,並啟用了動態欄位。現在,將下列資料集插入此集合。

    +
    [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +
    +
    +

    上面的資料集包含 10 個實體,每個實體都包括欄位id,vector, 和color 。這裡,模式中沒有定義color 欄位。由於集合已啟用動態欄位,因此欄位color 將以鍵值對的形式儲存在動態欄位中。

    +

    插入資料

    以下程式碼示範如何將此資料集插入集合。

    + +
    data=[​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}​
    +]​
    +​
    +res = client.insert(​
    +    collection_name="my_dynamic_collection",​
    +    data=data​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# {'insert_count': 10, 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +   ​
    +Gson gson = new Gson();​
    +List<JsonObject> data = Arrays.asList(​
    +        gson.fromJson("{\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"}", JsonObject.class),​
    +        gson.fromJson("{\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"}", JsonObject.class)​
    +);​
    +​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +System.out.println(insertResp);​
    +​
    +// Output:​
    +//​
    +// InsertResp(InsertCnt=10, primaryKeys=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])​
    +
    +
    +
    const { DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +// 3. Insert some data​
    +​
    +var data = [​
    +    {id: 0, vector: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], color: "pink_8682"},​
    +    {id: 1, vector: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], color: "red_7025"},​
    +    {id: 2, vector: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], color: "orange_6781"},​
    +    {id: 3, vector: [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], color: "pink_9298"},​
    +    {id: 4, vector: [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], color: "red_4794"},​
    +    {id: 5, vector: [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], color: "yellow_4222"},​
    +    {id: 6, vector: [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], color: "red_9392"},​
    +    {id: 7, vector: [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], color: "grey_8510"},​
    +    {id: 8, vector: [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], color: "white_9381"},​
    +    {id: 9, vector: [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], color: "purple_4976"}        ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "quick_setup",​
    +    data: data,​
    +})​
    +​
    +console.log(res.insert_cnt)​
    +​
    +// Output​
    +// ​
    +// 10​
    +// ​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"}        ​
    +    ],​
    +    "collectionName": "my_dynamic_collection"​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": {​
    +#         "insertCount": 10,​
    +#         "insertIds": [​
    +#             0,​
    +#             1,​
    +#             2,​
    +#             3,​
    +#             4,​
    +#             5,​
    +#             6,​
    +#             7,​
    +#             8,​
    +#             9​
    +#         ]​
    +#     }​
    +# }​
    +
    +
    +

    使用動態欄位查詢與搜尋

    Milvus 支援在查詢和搜尋過程中使用篩選表達式,讓您指定哪些欄位要包含在結果中。以下範例示範如何使用動態欄位來執行查詢和搜尋color 欄位,該欄位在模式中並未定義。

    + +
    query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_dynamic_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%"',​
    +    output_fields=["color"]​
    +    # highlight-end​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.6290165185928345, 'entity': {'color': 'red_7025'}}, {'id': 4, 'distance': 0.5975797176361084, 'entity': {'color': 'red_4794'}}, {'id': 6, 'distance': -0.24996188282966614, 'entity': {'color': 'red_9392'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_dynamic_collection")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(queryVector))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .filter("color like \"red%\"")​
    +        .topK(5)​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={color=red_7025}, score=0.6290165, id=1), SearchResp.SearchResult(entity={color=red_4794}, score=0.5975797, id=4), SearchResp.SearchResult(entity={color=red_9392}, score=-0.24996188, id=6)]]​
    +​
    +
    +
    +
    const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: "color like \"red%\"",​
    +    output_fields: ["color"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_dynamic_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +# {"code":0,"cost":0,"data":[{"color":"red_7025","distance":0.6290165,"id":1},{"color":"red_4794","distance":0.5975797,"id":4},{"color":"red_9392","distance":-0.24996185,"id":6}]}​
    +
    +
    +

    在上述程式碼範例中使用的篩選表達式color like "red%" and likes > 50 中,條件指定color 欄位的值必須以"red "開頭。在樣本資料中,只有兩個實體符合此條件。因此,當limit (topK) 設定為3 或更少時,這兩個實體都會被傳回。

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.json new file mode 100644 index 000000000..77fa39b52 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri='http://localhost:19530')​\n​\n# Define collection schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, nullable=True) # Nullable field​\n​\n# Set index params​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\n# Create collection​\nclient.create_collection(collection_name=\"user_profiles_null\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .isNullable(true)​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_null\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.Int64, dim: 5 },​\n​\n { name: \"age\", data_type: DataType.FloatVector, nullable: true },​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.AUTOINDEX,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport nullField='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"nullable\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $nullField​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_null\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": None},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}​\n]​\n​\nclient.insert(collection_name=\"user_profiles_null\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6], \\\"age\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​\n { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​\n { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_null\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]} ​\n ],​\n \"collectionName\": \"user_profiles_null\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_null\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n limit=2,​\n search_params={\"params\": {\"nprobe\": 16}},​\n output_fields=[\"id\", \"age\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .topK(2)​\n .searchParams(params)​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​\n\n","client.search({​\n collection_name: 'user_profiles_null',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id'],​\n filter: '25 <= age <= 35',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"data\": [​\n [0.1, -0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n#{\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"distance\":0.16000001,\"id\":1},{\"age\":null,\"distance\":0.28999996,\"id\":2},{\"age\":null,\"distance\":0.52000004,\"id\":3}]}​\n\n","# Reviewing previously inserted data:​\n# {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30}​\n# {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129], \"age\": None}​\n# {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": None} # Omitted age column is treated as None​\n​\nresults = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"age >= 0\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [​\n# {\"id\": 1, \"age\": 30}​\n# ]​\n# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"age >= 0\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=1, age=30})]​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"age >= 0\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"filter\": \"age >= 0\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1}]}​\n\n","null_results = client.query(​\n collection_name=\"user_profiles_null\",​\n filter=\"\",​\n output_fields=[\"id\", \"age\"]​\n)​\n​\n# Example output:​\n# [{\"id\": 2, \"age\": None}, {\"id\": 3, \"age\": None}]​\n\n","QueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_null\")​\n .filter(\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\"))​\n .limit(10)​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n\n","const results = await client.query(​\n collection_name: \"user_profiles_null\",​\n filter: \"\",​\n output_fields: [\"id\", \"age\"]​\n);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_null\",​\n \"expr\": \"\",​\n \"outputFields\": [\"id\", \"age\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"id\":1},{\"age\":null,\"id\":2},{\"age\":null,\"id\":3}]}​\n\n","schema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_schema=True,​\n)​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"vector\", datatype=DataType.FLOAT_VECTOR, dim=5)​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64, default_value=18)​\nschema.add_field(field_name=\"status\", datatype=DataType.VARCHAR, default_value=\"active\", max_length=10)​\n​\nindex_params = client.prepare_index_params()​\nindex_params.add_index(field_name=\"vector\", index_type=\"IVF_FLAT\", metric_type=\"L2\", params={ \"nlist\": 128 })​\n​\nclient.create_collection(collection_name=\"user_profiles_default\", schema=schema, index_params=index_params)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.common.IndexParam;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nimport java.util.*;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"vector\")​\n .dataType(DataType.FloatVector)​\n .dimension(5)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .defaultValue(18L)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"status\")​\n .dataType(DataType.VarChar)​\n .maxLength(10)​\n .defaultValue(\"active\")​\n .build());​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"nlist\", 128);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"vector\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.L2)​\n .extraParams(extraParams)​\n .build());​\n​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: \"http://localhost:19530\",​\n token: \"root:Milvus\",​\n});​\n​\nawait client.createCollection({​\n collection_name: \"user_profiles_default\",​\n schema: [​\n {​\n name: \"id\",​\n is_primary_key: true,​\n data_type: DataType.int64,​\n },​\n { name: \"vector\", data_type: DataType.FloatVector, dim: 5 },​\n { name: \"age\", data_type: DataType.Int64, default_value: 18 },​\n { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​\n ],​\n​\n index_params: [​\n {​\n index_name: \"vector_inde\",​\n field_name: \"vector\",​\n metric_type: MetricType.L2,​\n index_type: IndexType.IVF_FLAT,​\n },​\n ],​\n});​\n​\n\n","export pkField='{​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport defaultValueField1='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\",​\n \"defaultValue\": 18​\n}'​\n​\nexport defaultValueField2='{​\n \"fieldName\": \"status\",​\n \"dataType\": \"VarChar\",​\n \"defaultValue\": \"active\",​\n \"elementTypeParams\": {​\n \"max_length\": 10​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $pkField,​\n $vectorField,​\n $defaultValueField1,​\n $defaultValueField2​\n ]​\n}\"​\n​\nexport indexParams='[​\n {​\n \"fieldName\": \"vector\",​\n \"metricType\": \"L2\",​\n \"indexType\": \"IVF_FLAT\",​\n \"params\":{\"nlist\": 128}​\n }​\n ]'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"user_profiles_default\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, ..., 0.128], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, ..., 0.129]},\n {\"id\": 3, \"vector\": [0.3, 0.4, ..., 0.130], \"age\": 25, \"status\": None}, \n {\"id\": 4, \"vector\": [0.4, 0.5, ..., 0.131], \"age\": None, \"status\": \"inactive\"} \n]​\n​\nclient.insert(collection_name=\"user_profiles_default\", data=data)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"id\\\": 1, \\\"vector\\\": [0.1, 0.2, 0.3, 0.4, 0.5], \\\"age\\\": 30, \\\"status\\\": \\\"premium\\\"}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 2, \\\"vector\\\": [0.2, 0.3, 0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 3, \\\"vector\\\": [0.3, 0.4, 0.5, 0.6, 0.7], \\\"age\\\": 25, \\\"status\\\": null}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"id\\\": 4, \\\"vector\\\": [0.4, 0.5, 0.6, 0.7, 0.8], \\\"age\\\": null, \\\"status\\\": \\\"inactive\\\"}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n];​\n​\nclient.insert({​\n collection_name: \"user_profiles_default\",​\n data: data,​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"},​\n {\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]},​\n {\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}, ​\n {\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"} ​\n ],​\n \"collectionName\": \"user_profiles_default\"​\n}'​\n\n","res = client.search(​\n collection_name=\"user_profiles_default\",​\n data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​\n search_params={\"params\": {\"nprobe\": 16}},​\n filter=\"age == 18\", # 18 is the default value of the `age` field​\n limit=10,​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]\"] ​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap params = new HashMap<>();​\nparams.put(\"nprobe\", 16);​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .annsField(\"vector\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​\n .searchParams(params)​\n .filter(\"age == 18\")​\n .topK(10)​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​\n\n","client.search({​\n collection_name: 'user_profiles_default',​\n data: [0.3, -0.6, 0.1, 0.3, 0.5],​\n limit: 2,​\n output_fields: ['age', 'id', 'status'],​\n filter: 'age == 18',​\n params: {​\n nprobe: 16​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"data\": [​\n [0.1, 0.2, 0.3, 0.4, 0.5]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"distance\":0.050000004,\"id\":2,\"status\":\"active\"},{\"age\":18,\"distance\":0.45000002,\"id\":4,\"status\":\"inactive\"}]}​\n\n","# Query all entities where `age` equals the default value (18)​\ndefault_age_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter=\"age == 18\",​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n​\n# Query all entities where `status` equals the default value (\"active\")​\ndefault_status_results = client.query(​\n collection_name=\"user_profiles_default\",​\n filter='status == \"active\"',​\n output_fields=[\"id\", \"age\", \"status\"]​\n)​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nQueryResp ageResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"age == 18\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(ageResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​\n​\nQueryResp statusResp = client.query(QueryReq.builder()​\n .collectionName(\"user_profiles_default\")​\n .filter(\"status == \\\"active\\\"\")​\n .outputFields(Arrays.asList(\"id\", \"age\", \"status\"))​\n .build());​\n​\nSystem.out.println(statusResp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​\n\n","// Query all entities where `age` equals the default value (18)​\nconst default_age_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: \"age == 18\",​\n output_fields: [\"id\", \"age\", \"status\"]​\n);​\n// Query all entities where `status` equals the default value (\"active\")​\nconst default_status_results = await client.query(​\n collection_name: \"user_profiles_default\",​\n filter: 'status == \"active\"',​\n output_fields: [\"id\", \"age\", \"status\"]​\n)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"age == 18\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":18,\"id\":4,\"status\":\"inactive\"}]}​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"user_profiles_default\",​\n \"filter\": \"status == \\\"active\\\"\",​\n \"outputFields\": [\"id\", \"age\", \"status\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"age\":18,\"id\":2,\"status\":\"active\"},{\"age\":25,\"id\":3,\"status\":\"active\"}]}​\n\n"],"headingContent":"Nullable & Default​","anchorList":[{"label":"Nullable & 預設值","href":"Nullable--Default​","type":1,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"Nullable 屬性","href":"Nullable-attribute","type":2,"isActive":false},{"label":"預設值","href":"Default-values​","type":2,"isActive":false},{"label":"適用規則","href":"Applicable-rules","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.md new file mode 100644 index 000000000..0db5fc195 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/nullable-and-default.md @@ -0,0 +1,875 @@ +--- +id: nullable-and-default.md +title: Nullable & 預設值 +related_key: 'nullable, default' +summary: >- + Milvus 允許你為標量欄位設定 `nullable` 屬性和預設值,除了主欄位。對於標記為 nullable=True + 的欄位,您可以在插入資料時跳過該欄位,或直接將其設定為空值,系統會將其視為空值而不會造成錯誤。 +--- +

    Nullable & 預設值

    Milvus 允許你為標量欄位設定nullable 屬性和預設值,除了主欄位。對於標示為nullable=True 的欄位,您可以在插入資料時跳過該欄位,或直接將其設定為空值,系統會將其視為空值而不會造成錯誤。當一個欄位有預設值時,如果在插入時沒有為該欄位指定資料,系統會自動套用此值。

    +

    預設值和 nullable 屬性允許處理具有空值的資料集,並保留預設值設定,從而簡化了從其他資料庫系統向 Milvus 的資料遷移。在建立資料集時,您也可以啟用 nullable 或為值可能不確定的欄位設定預設值。

    +

    限制

      +
    • 只有標量欄位 (不包括主要欄位) 支援預設值和 nullable 屬性。

    • +
    • JSON 和陣列欄位不支援預設值。

    • +
    • 預設值或 nullable 屬性只能在建立集合時設定,之後就無法修改。

    • +
    • 啟用 nullable 屬性的標量欄位無法在群組搜尋中用作group_by_field 。有關群組搜尋的詳細資訊,請參閱群組搜尋

    • +
    • 標記為 nullable 的欄位不能用作分割區金鑰。有關分割區金鑰的詳細資訊,請參閱使用分割區金鑰。

    • +
    • 在啟用 nullable 屬性的標量欄位上建立索引時,索引將排除 null 值。

    • +
    +

    Nullable 屬性

    nullable 屬性可讓您在集合中儲存 null 值,在處理未知資料時提供彈性。

    +

    設定 nullable 屬性

    建立集合時,使用nullable=True 定義 nullable 欄位 (預設為False)。以下範例建立一個名為user_profiles_null 的集合,並將age 欄位設定為 nullable。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri='http://localhost:19530')​
    +​
    +# Define collection schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True) # Nullable field​
    +​
    +# Set index params​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +# Create collection​
    +client.create_collection(collection_name="user_profiles_null", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .isNullable(true)​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_null",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.Int64, dim: 5 },​
    +​
    +    { name: "age", data_type: DataType.FloatVector, nullable: true },​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.AUTOINDEX,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export nullField='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "nullable": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $nullField​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_null\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入實體

    當您插入資料到 nullable 欄位時,插入 null 或直接省略此欄位。

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": None},​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]}​
    +]​
    +​
    +client.insert(collection_name="user_profiles_null", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6], \"age\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { id: 1, vector: [0.1, 0.2, 0.3, 0.4, 0.5], age: 30 },​
    +  { id: 2, vector: [0.2, 0.3, 0.4, 0.5, 0.6], age: null },​
    +  { id: 3, vector: [0.3, 0.4, 0.5, 0.6, 0.7] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_null",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6], "age": null}, ​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7]} ​
    +    ],​
    +    "collectionName": "user_profiles_null"​
    +}'​
    +
    +
    +

    使用空值進行搜尋與查詢

    使用search 方法時,如果欄位包含null 值,搜尋結果會將該欄位回傳為 null。

    + +
    res = client.search(​
    +    collection_name="user_profiles_null",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    limit=2,​
    +    search_params={"params": {"nprobe": 16}},​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': 0.15838398039340973, 'entity': {'age': 30, 'id': 1}}, {'id': 2, 'distance': 0.28278401494026184, 'entity': {'age': None, 'id': 2}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .topK(2)​
    +        .searchParams(params)​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=1, age=30}, score=0.0, id=1), SearchResp.SearchResult(entity={id=2, age=null}, score=0.050000004, id=2)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_null',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id'],​
    +    filter: '25 <= age <= 35',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "data": [​
    +        [0.1, -0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +#{"code":0,"cost":0,"data":[{"age":30,"distance":0.16000001,"id":1},{"age":null,"distance":0.28999996,"id":2},{"age":null,"distance":0.52000004,"id":3}]}​
    +
    +
    +

    使用query 方法進行標量值篩選時,空值的篩選結果都是 false,表示不會選擇這些值。

    + +
    # Reviewing previously inserted data:​
    +# {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30}​
    +# {"id": 2, "vector": [0.2, 0.3, ..., 0.129], "age": None}​
    +# {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": None}  # Omitted age  column is treated as None​
    +​
    +results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="age >= 0",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [​
    +#     {"id": 1, "age": 30}​
    +# ]​
    +# Note: Entities with `age` as `null` (id 2 and 3) will not appear in the result.​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("age >= 0")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=1, age=30})]​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "age >= 0",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "filter": "age >= 0",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1}]}​
    +
    +
    +

    若要查詢null 值的實體,請使用空表達式""

    + +
    null_results = client.query(​
    +    collection_name="user_profiles_null",​
    +    filter="",​
    +    output_fields=["id", "age"]​
    +)​
    +​
    +# Example output:​
    +# [{"id": 2, "age": None}, {"id": 3, "age": None}]​
    +
    +
    +
    QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_null")​
    +        .filter("")​
    +        .outputFields(Arrays.asList("id", "age"))​
    +        .limit(10)​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +
    +
    +
    const results = await client.query(​
    +    collection_name: "user_profiles_null",​
    +    filter: "",​
    +    output_fields: ["id", "age"]​
    +);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_null",​
    +    "expr": "",​
    +    "outputFields": ["id", "age"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":30,"id":1},{"age":null,"id":2},{"age":null,"id":3}]}​
    +
    +
    +

    預設值

    預設值是指派給標量欄位的預設值。如果您在插入時沒有為有預設值的欄位提供值,系統會自動使用預設值。

    +

    設定預設值

    建立集合時,使用default_value 參數定義欄位的預設值。以下範例顯示如何將age 的預設值設定為18 ,將status 的預設值設定為"active"

    + +
    schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_schema=True,​
    +)​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)​
    +schema.add_field(field_name="status", datatype=DataType.VARCHAR, default_value="active", max_length=10)​
    +​
    +index_params = client.prepare_index_params()​
    +index_params.add_index(field_name="vector", index_type="IVF_FLAT", metric_type="L2", params={ "nlist": 128 })​
    +​
    +client.create_collection(collection_name="user_profiles_default", schema=schema, index_params=index_params)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.common.IndexParam;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +import java.util.*;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("vector")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(5)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .defaultValue(18L)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("status")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(10)​
    +        .defaultValue("active")​
    +        .build());​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("nlist", 128);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("vector")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.L2)​
    +        .extraParams(extraParams)​
    +        .build());​
    +​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +  address: "http://localhost:19530",​
    +  token: "root:Milvus",​
    +});​
    +​
    +await client.createCollection({​
    +  collection_name: "user_profiles_default",​
    +  schema: [​
    +    {​
    +      name: "id",​
    +      is_primary_key: true,​
    +      data_type: DataType.int64,​
    +    },​
    +    { name: "vector", data_type: DataType.FloatVector, dim: 5 },​
    +    { name: "age", data_type: DataType.Int64, default_value: 18 },​
    +    { name: 'status', data_type: DataType.VarChar, max_length: 30, default_value: 'active'},​
    +  ],​
    +​
    +  index_params: [​
    +    {​
    +      index_name: "vector_inde",​
    +      field_name: "vector",​
    +      metric_type: MetricType.L2,​
    +      index_type: IndexType.IVF_FLAT,​
    +    },​
    +  ],​
    +});​
    +​
    +
    +
    +
    export pkField='{​
    +    "fieldName": "id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export defaultValueField1='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64",​
    +    "defaultValue": 18​
    +}'​
    +​
    +export defaultValueField2='{​
    +    "fieldName": "status",​
    +    "dataType": "VarChar",​
    +    "defaultValue": "active",​
    +    "elementTypeParams": {​
    +        "max_length": 10​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $pkField,​
    +        $vectorField,​
    +        $defaultValueField1,​
    +        $defaultValueField2​
    +    ]​
    +}"​
    +​
    +export indexParams='[​
    +        {​
    +            "fieldName": "vector",​
    +            "metricType": "L2",​
    +            "indexType": "IVF_FLAT",​
    +            "params":{"nlist": 128}​
    +        }​
    +    ]'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"user_profiles_default\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入實體

    插入資料時,如果省略有預設值的欄位或將其值設定為空,系統會使用預設值。

    + +
    data = [​
    +    {"id": 1, "vector": [0.1, 0.2, ..., 0.128], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, ..., 0.129]},
    +    {"id": 3, "vector": [0.3, 0.4, ..., 0.130], "age": 25, "status": None}, 
    +    {"id": 4, "vector": [0.4, 0.5, ..., 0.131], "age": None, "status": "inactive"} 
    +]​
    +​
    +client.insert(collection_name="user_profiles_default", data=data)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"id\": 1, \"vector\": [0.1, 0.2, 0.3, 0.4, 0.5], \"age\": 30, \"status\": \"premium\"}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 2, \"vector\": [0.2, 0.3, 0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 3, \"vector\": [0.3, 0.4, 0.5, 0.6, 0.7], \"age\": 25, \"status\": null}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"id\": 4, \"vector\": [0.4, 0.5, 0.6, 0.7, 0.8], \"age\": null, \"status\": \"inactive\"}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]}, ​
    +    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +    {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}  ​
    +];​
    +​
    +client.insert({​
    +  collection_name: "user_profiles_default",​
    +  data: data,​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},​
    +        {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]},​
    +        {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": null}, ​
    +        {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": null, "status": "inactive"}      ​
    +    ],​
    +    "collectionName": "user_profiles_default"​
    +}'​
    +
    +
    +
    +

    有關 nullable 和預設值設定如何生效的詳細資訊,請參閱適用規則

    +
    +

    使用預設值進行搜尋和查詢

    在向量搜尋和標量篩選過程中,包含預設值的實體與任何其他實體的處理方式相同。您可以在searchquery 作業中包含預設值。

    +

    例如,在search 作業中,將age 設定為預設值18 的實體將包含在結果中。

    + +
    res = client.search(​
    +    collection_name="user_profiles_default",​
    +    data=[[0.1, 0.2, 0.4, 0.3, 0.128]],​
    +    search_params={"params": {"nprobe": 16}},​
    +    filter="age == 18",  # 18 is the default value of the `age` field​
    +    limit=10,​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 2, 'distance': 0.28278401494026184, 'entity': {'id': 2, 'age': 18, 'status': 'active'}}, {'id': 4, 'distance': 0.8315839767456055, 'entity': {'id': 4, 'age': 18, 'status': 'inactive'}}]"] ​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> params = new HashMap<>();​
    +params.put("nprobe", 16);​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .annsField("vector")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.1f, 0.2f, 0.3f, 0.4f, 0.5f})))​
    +        .searchParams(params)​
    +        .filter("age == 18")​
    +        .topK(10)​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={id=2, age=18, status=active}, score=0.050000004, id=2), SearchResp.SearchResult(entity={id=4, age=18, status=inactive}, score=0.45000002, id=4)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'user_profiles_default',​
    +    data: [0.3, -0.6, 0.1, 0.3, 0.5],​
    +    limit: 2,​
    +    output_fields: ['age', 'id', 'status'],​
    +    filter: 'age == 18',​
    +    params: {​
    +        nprobe: 16​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "data": [​
    +        [0.1, 0.2, 0.3, 0.4, 0.5]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"distance":0.050000004,"id":2,"status":"active"},{"age":18,"distance":0.45000002,"id":4,"status":"inactive"}]}​
    +
    +
    +

    query 操作中,您可以直接根據預設值進行匹配或過濾。

    + +
    # Query all entities where `age` equals the default value (18)​
    +default_age_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter="age == 18",​
    +    output_fields=["id", "age", "status"]​
    +)​
    +​
    +# Query all entities where `status` equals the default value ("active")​
    +default_status_results = client.query(​
    +    collection_name="user_profiles_default",​
    +    filter='status == "active"',​
    +    output_fields=["id", "age", "status"]​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +QueryResp ageResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("age == 18")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(ageResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=4, age=18, status=inactive})]​
    +​
    +QueryResp statusResp = client.query(QueryReq.builder()​
    +        .collectionName("user_profiles_default")​
    +        .filter("status == \"active\"")​
    +        .outputFields(Arrays.asList("id", "age", "status"))​
    +        .build());​
    +​
    +System.out.println(statusResp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={id=2, age=18, status=active}), QueryResp.QueryResult(entity={id=3, age=25, status=active})]​
    +
    +
    +
    // Query all entities where `age` equals the default value (18)​
    +const default_age_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: "age == 18",​
    +    output_fields: ["id", "age", "status"]​
    +);​
    +// Query all entities where `status` equals the default value ("active")​
    +const default_status_results = await client.query(​
    +    collection_name: "user_profiles_default",​
    +    filter: 'status == "active"',​
    +    output_fields: ["id", "age", "status"]​
    +)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "age == 18",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":18,"id":4,"status":"inactive"}]}​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "user_profiles_default",​
    +    "filter": "status == \"active\"",​
    +    "outputFields": ["id", "age", "status"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"age":18,"id":2,"status":"active"},{"age":25,"id":3,"status":"active"}]}​
    +
    +
    +

    適用規則

    下表總結了在不同組態組合下,可歸空列和預設值的行為。這些規則決定 Milvus 在嘗試插入空值或未提供欄位值時如何處理資料。

    + + + + + + + + + + + +
    可空值預設值預設值類型使用者輸入結果範例
    非空無/空使用預設值
    • 欄位:age
    • 預設值:18
    • 使用者輸入:空
    • 結果:儲存為18
    -無/空儲存為空
    • 欄位:middle_name
    • 預設值: -使用者
    • 輸入:空
    • 結果:儲存為空
    非空無/空使用預設值
    • 欄位:status
    • 預設值:"active"
    • 使用者輸入:空
    • 結果:儲存為"active"
    -無/空產生錯誤
    • 欄位:email
    • 預設值: -使用者
    • 輸入:空
    • 結果:拒絕操作,系統拋出錯誤
    無/空產生錯誤
    • 欄位:username
    • 預設值:null使用者
    • 輸入:null
    • 結果:拒絕操作,系統拋出錯誤
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/number.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/number.json new file mode 100644 index 000000000..6985ec712 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/number.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"age\", datatype=DataType.INT64)​\nschema.add_field(field_name=\"price\", datatype=DataType.FLOAT)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"age\")​\n .dataType(DataType.Int64)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"price\")​\n .dataType(DataType.Float)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"age\",​\n data_type: DataType.Int64,​\n },​\n {​\n name: \"price\",​\n data_type: DataType.Float,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n​\n\n","export int64Field='{​\n \"fieldName\": \"age\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport floatField='{​\n \"fieldName\": \"price\",​\n \"dataType\": \"Float\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $int64Field,​\n $floatField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"age\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"inverted_index\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"age\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n​\n\n","const indexParams = {​\n index_name: 'inverted_index',​\n field_name: 'age',​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","import { IndexType } from \"@zilliz/milvus2-sdk-node\";​\nconst indexParams = [​\n {​\n field_name: \"age\",​\n index_name: \"inverted_index\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n {​\n field_name: \"embedding\",​\n metric_type: \"COSINE\",​\n index_type: IndexType.AUTOINDEX,​\n },​\n];​\n​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"age\",​\n \"indexName\": \"inverted_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_scalar_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_scalar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","data = [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_scalar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"age\\\": 25, \\\"price\\\": 99.99, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 30, \\\"price\\\": 149.50, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"age\\\": 35, \\\"price\\\": 199.99, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​\n { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​\n { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​\n];​\n​\nclient.insert({​\n collection_name: \"my_scalar_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_scalar_collection\"​\n}'​\n\n","filter = \"30 <= age <= 40\"​\n​\nres = client.query(​\n collection_name=\"my_scalar_collection\",​\n filter=filter,​\n output_fields=[\"age\",\"price\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'age': 30, 'price': np.float32(149.5), 'pk': 2}\", \"{'age': 35, 'price': np.float32(199.99), 'pk': 3}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"30 <= age <= 40\";​\n​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .build());​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: '30 <= age <= 40',​\n output_fields: ['age', 'price']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"filter\": \"30 <= age <= 40\",​\n \"outputFields\": [\"age\",\"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":30,\"pk\":2,\"price\":149.5},{\"age\":35,\"pk\":3,\"price\":199.99}]}​\n\n","filter = \"25 <= age <= 35\"​\n​\nres = client.search(​\n collection_name=\"my_scalar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"age\",\"price\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"25 <= age <= 35\";​\n​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_scalar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"age\", \"price\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_scalar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['age', 'price'],​\n filter: '25 <= age <= 35'​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_scalar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"outputFields\": [\"age\", \"price\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"age\":35,\"distance\":-0.19054288,\"id\":3,\"price\":199.99},{\"age\":30,\"distance\":-0.20163085,\"id\":2,\"price\":149.5},{\"age\":25,\"distance\":-0.2364331,\"id\":1,\"price\":99.99}]}​\n\n"],"headingContent":"Number Field​","anchorList":[{"label":"數字欄位","href":"Number-Field​","type":1,"isActive":false},{"label":"支援的數字欄位類型","href":"Supported-number-field-types​","type":2,"isActive":false},{"label":"新增數字欄位","href":"Add-number-field​","type":2,"isActive":false},{"label":"設定索引參數","href":"Set-index-params​","type":2,"isActive":false},{"label":"建立集合","href":"Create-collection​","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data​","type":2,"isActive":false},{"label":"搜尋和查詢","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/number.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/number.md new file mode 100644 index 000000000..7e64dfe31 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/number.md @@ -0,0 +1,565 @@ +--- +id: number.md +title: 數字欄位 +related_key: 'number, integer, float, double' +summary: >- + 在 Milvus + 中,數字欄位用來儲存非向量數字資料。這些欄位通常用來描述與向量資料相關的附加資訊,例如年齡、價格等。透過使用這些資料,您可以更好地描述向量,並提高資料篩選和條件查詢的效率。 +--- +

    數字欄位

    在 Milvus 中,數字欄位用來儲存非向量數字資料。這些欄位通常用來描述與向量資料相關的附加資訊,例如年齡、價格等。透過使用這些資料,您可以更好地描述向量,並提高資料篩選和條件查詢的效率。

    +

    數字欄位在許多情況下都特別有用。例如,在電子商務推薦中,可以使用價格欄位進行篩選;在使用者資料分析中,年齡範圍可以幫助精細化結果。結合向量資料,數字欄位可以幫助系統提供相似性搜尋,同時更精確地滿足使用者的個人化需求。

    +

    支援的數字欄位類型

    Milvus 支援多種數字欄位類型,以滿足不同的資料儲存和查詢需求。

    +

    類型

    +

    說明

    +

    BOOL

    +

    布林類型,用於儲存truefalse ,適合描述二進制狀態。

    +

    INT8

    +

    8 位整數,適合儲存小範圍整數資料。

    +

    INT16

    +

    16 位元整數,適用於中範圍整數資料。

    +

    INT32

    +

    32 位元整數,適合儲存一般整數資料,例如產品數量或使用者 ID。

    +

    INT64

    +

    64 位元整數,適合儲存時間戳記或識別碼等大範圍資料。

    +

    FLOAT

    +

    32 位元浮點數,適用於需要一般精確度的資料,例如等級或溫度。

    +

    DOUBLE

    +

    64 位元雙精度浮點數,適用於高精度資料,例如財務資訊或科學計算。

    +
    +

    新增數字欄位

    要在 Milvus 中使用數字欄位,請在集合模式中定義相關欄位,將datatype 設定為支援的類型,如BOOLINT8 。如需支援的數字欄位類型的完整清單,請參閱支援的數字欄位類型

    +

    以下示例展示了如何定義包含數字欄位ageprice 的模式。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="age", datatype=DataType.INT64)​
    +schema.add_field(field_name="price", datatype=DataType.FLOAT)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("age")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("price")​
    +        .dataType(DataType.Float)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "age",​
    +    data_type: DataType.Int64,​
    +  },​
    +  {​
    +    name: "price",​
    +    data_type: DataType.Float,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "age",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export floatField='{​
    +    "fieldName": "price",​
    +    "dataType": "Float"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $int64Field,​
    +        $floatField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +
    +

    當您建立一個集合時,主欄位和向量欄位是必須的。Primary 欄位唯一識別每個實體,而向量欄位對相似性搜尋至關重要。如需詳細資訊,請參閱Primary Field & AutoIDDense VectorBinary VectorSparse Vector

    +
    +

    設定索引參數

    為數字欄位設定索引參數是可選的,但可以大幅提高檢索效率。

    +

    在下面的範例中,我們為age 數字欄位建立AUTOINDEX ,讓 Milvus 根據資料類型自動建立適當的索引。如需詳細資訊,請參閱AUTOINDEX

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="age",​
    +    index_type="AUTOINDEX",​
    +    index_name="inverted_index"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("age")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'inverted_index',​
    +    field_name: 'age',​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    除了AUTOINDEX 之外,您可以指定其他數字欄位索引類型。有關支援的索引類型,請參閱Scalar Indexes

    +

    此外,在建立集合之前,您必須為向量欄位建立索引。在本範例中,我們使用AUTOINDEX 來簡化向量索引的設定。

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    import { IndexType } from "@zilliz/milvus2-sdk-node";​
    +const indexParams = [​
    +  {​
    +    field_name: "age",​
    +    index_name: "inverted_index",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +  {​
    +    field_name: "embedding",​
    +    metric_type: "COSINE",​
    +    index_type: IndexType.AUTOINDEX,​
    +  },​
    +];​
    +​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "age",​
    +            "indexName": "inverted_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    建立集合

    定義模式和索引後,您就可以建立包含數字欄位的集合。

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_scalar_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_scalar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立資料集後,您可以插入包含數字欄位的資料。

    + +
    data = [​
    +    {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_scalar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"age\": 25, \"price\": 99.99, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 30, \"price\": 149.50, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"age\": 35, \"price\": 199.99, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { age: 25, price: 99.99, pk: 1, embedding: [0.1, 0.2, 0.3] },​
    +  { age: 30, price: 149.5, pk: 2, embedding: [0.4, 0.5, 0.6] },​
    +  { age: 35, price: 199.99, pk: 3, embedding: [0.7, 0.8, 0.9] },​
    +];​
    +​
    +client.insert({​
    +  collection_name: "my_scalar_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"age": 25, "price": 99.99, "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +        {"age": 30, "price": 149.50, "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +        {"age": 35, "price": 199.99, "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_scalar_collection"​
    +}'​
    +
    +
    +

    在這個範例中,我們插入的資料包含age,price,pk (主要欄位) 以及向量表示 (embedding)。為了確保插入的資料與模式中定義的欄位相符,建議事先檢查資料類型以避免錯誤。

    +

    如果您在定義模式時設定enable_dynamic_fields=True ,Milvus 允許您插入未事先定義的數字欄位。但是,請記住這可能會增加查詢和管理的複雜性,有可能影響性能。如需詳細資訊,請參閱動態欄位

    +

    搜尋和查詢

    新增數字欄位後,您可以在搜尋和查詢作業中使用它們進行篩選,以獲得更精確的搜尋結果。

    +

    篩選查詢

    新增數字欄位後,您可以在查詢中使用它們進行篩選。例如,您可以查詢age 介於 30 和 40 之間的所有實體。

    + +
    filter = "30 <= age <= 40"​
    +​
    +res = client.query(​
    +    collection_name="my_scalar_collection",​
    +    filter=filter,​
    +    output_fields=["age","price"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'age': 30, 'price': np.float32(149.5), 'pk': 2}", "{'age': 35, 'price': np.float32(199.99), 'pk': 3}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "30 <= age <= 40";​
    +​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .build());​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={price=149.5, pk=2, age=30}), QueryResp.QueryResult(entity={price=199.99, pk=3, age=35})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: '30 <= age <= 40',​
    +    output_fields: ['age', 'price']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "filter": "30 <= age <= 40",​
    +    "outputFields": ["age","price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":30,"pk":2,"price":149.5},{"age":35,"pk":3,"price":199.99}]}​
    +
    +
    +

    這個查詢表達式會返回所有匹配的實體,並輸出它們的ageprice 欄位。有關過濾查詢的詳細資訊,請參閱Metadata 過濾

    +

    使用數字篩選的向量搜尋

    除了基本的數字欄位篩選外,您也可以結合向量相似性搜尋與數字欄位篩選。例如,以下程式碼顯示如何在向量搜尋中加入數字欄位篩選器。

    + +
    filter = "25 <= age <= 35"​
    +​
    +res = client.search(​
    +    collection_name="my_scalar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["age","price"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'age': 25, 'price': 99.98999786376953}}, {'id': 2, 'distance': -0.12000000476837158, 'entity': {'age': 30, 'price': 149.5}}, {'id': 3, 'distance': -0.18000000715255737, 'entity': {'age': 35, 'price': 199.99000549316406}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "25 <= age <= 35";​
    +​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_scalar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("age", "price"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={price=199.99, age=35}, score=-0.19054288, id=3), SearchResp.SearchResult(entity={price=149.5, age=30}, score=-0.20163085, id=2), SearchResp.SearchResult(entity={price=99.99, age=25}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_scalar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['age', 'price'],​
    +    filter: '25 <= age <= 35'​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_scalar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "outputFields": ["age", "price"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"age":35,"distance":-0.19054288,"id":3,"price":199.99},{"age":30,"distance":-0.20163085,"id":2,"price":149.5},{"age":25,"distance":-0.2364331,"id":1,"price":99.99}]}​
    +
    +
    +

    在這個範例中,我們首先定義一個查詢向量,並在搜尋過程中加入篩選條件25 <= age <= 35 。這可確保搜尋結果不僅與查詢向量相似,也符合指定的年齡範圍。如需詳細資訊,請參閱Metadata 過濾

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.json new file mode 100644 index 000000000..8fe61f513 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n​\nschema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n // highlight-end​\n .build());​\n);​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"pk\",​\n description: \"ID field\",​\n data_type: DataType.VARCHAR,​\n is_primary_key: true,​\n max_length: 100,​\n },​\n];​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.VARCHAR,​\n # highlight-start​\n is_primary=True,​\n auto_id=True,​\n max_length=512,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.VarChar)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(512)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.VarChar,​\n // highlight-start​\n is_primary_key: true,​\n autoID: true,​\n maxLength: 512​\n // highlight-end​\n});​\n\n","// Go 缺失​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField​\n ],​\n \\\"params\\\": {​\n \\\"max_length\\\": 512​\n }​\n}\"​\n\n"],"headingContent":"Primary Field & AutoID​","anchorList":[{"label":"主要欄位與自動識別","href":"Primary-Field--AutoID​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"使用 Int64 主鍵","href":"Use-Int64-Primary-Keys​","type":2,"isActive":false},{"label":"使用 VarChar 主鍵","href":"Use-VarChar-Primary-Keys​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.md new file mode 100644 index 000000000..4d8a0ae4d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/primary-field.md @@ -0,0 +1,192 @@ +--- +id: primary-field.md +title: 主要欄位與自動識別 +summary: 主字段唯一識別一個實體。本頁介紹如何新增兩種不同資料類型的主字段,以及如何啟用 Milvus 自動分配主字段值。 +--- +

    主要欄位與自動識別

    主字段唯一識別一個實體。本頁面介紹如何添加兩種不同數據類型的主字段,以及如何啟用 Milvus 自動分配主字段值。

    +

    概述

    在一個集合中,每個實體的主鍵應該是全局唯一的。當新增主字段時,你需要明確地設定它的資料類型為VARCHARINT64。將其資料類型設定為INT64表示主索引鍵應該是類似12345 的整數;將其資料類型設定為VARCHAR表示主索引鍵應該是類似my_entity_1234 的字串。

    +

    你也可以啟用AutoID來使 Milvus 自動為傳入的實體分配主鍵。一旦你在你的集合中啟用了AutoID,在插入實體時不要包含主鍵。

    +

    集合中的主欄位沒有預設值,也不能為空。

    +

    使用 Int64 主鍵

    要使用 Int64 類型的主鍵,您需要設定datatypeDataType.INT64 ,並設定is_primarytrue 。如果您也需要 Milvus 為進入的實體分配主鍵,也請設定auto_idtrue

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +​
    +schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        // highlight-end​
    +        .build());​
    +);​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "pk",​
    +    description: "ID field",​
    +    data_type: DataType.VARCHAR,​
    +    is_primary_key: true,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}"​
    +
    +
    +

    使用 VarChar 主鍵

    要使用 VarChar 主鍵,除了將data_type 參數的值變更為DataType.VARCHAR 之外,還需要為欄位設定max_length 參數。

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=True,​
    +    max_length=512,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(512)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.VarChar,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: true,​
    +    maxLength: 512​
    +    // highlight-end​
    +});​
    +
    +
    +
    // Go 缺失​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField​
    +    ],​
    +    \"params\": {​
    +        \"max_length\": 512​
    +    }​
    +}"​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.json new file mode 100644 index 000000000..02cb995a8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\ncollection_name = \"my_collection\"​\n​\n# client = MilvusClient(uri=\"http://localhost:19530\")​\nclient = MilvusClient(uri=\"./milvus_demo.db\")​\n​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n)​\n​\nschema.add_field(field_name=\"article_id\", datatype=DataType.INT64, is_primary=True, description=\"article id\")​\nschema.add_field(field_name=\"title\", datatype=DataType.VARCHAR, max_length=200, description=\"article title\")​\nschema.add_field(field_name=\"author_info\", datatype=DataType.JSON, description=\"author information\")​\nschema.add_field(field_name=\"publish_ts\", datatype=DataType.INT32, description=\"publish timestamp\")​\nschema.add_field(field_name=\"image_url\", datatype=DataType.VARCHAR, max_length=500, description=\"image URL\")​\nschema.add_field(field_name=\"image_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"image vector\")​\nschema.add_field(field_name=\"summary\", datatype=DataType.VARCHAR, max_length=1000, description=\"article summary\")​\nschema.add_field(field_name=\"summary_dense_vector\", datatype=DataType.FLOAT_VECTOR, dim=768, description=\"summary dense vector\")​\nschema.add_field(field_name=\"summary_sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR, description=\"summary sparse vector\")​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"image_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_dense_vector\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"summary_sparse_vector\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n)​\nindex_params.add_index(​\n field_name=\"publish_ts\",​\n index_type=\"INVERTED\",​\n)​\n\n","client.create_collection(​\n collection_name=collection_name,​\n schema=schema,​\n index_params=index_params,​\n)​\n\n","collection_desc = client.describe_collection(​\n collection_name=collection_name​\n)​\nprint(collection_desc)​\n\n"],"headingContent":"Schema Design Hands-On​","anchorList":[{"label":"模式設計實作","href":"Schema-Design-Hands-On​","type":1,"isActive":false},{"label":"舉例說明:新聞搜尋","href":"An-Example-News-Search​","type":1,"isActive":false},{"label":"如何實作範例模式","href":"How-to-Implement-the-Example-Schema​","type":1,"isActive":false},{"label":"建立模式","href":"Create-Schema​","type":2,"isActive":false},{"label":"定義索引","href":"Define-Index​","type":2,"isActive":false},{"label":"建立資料庫","href":"Create-Collection​","type":2,"isActive":false},{"label":"其他注意事項","href":"Other-Considerations​","type":1,"isActive":false},{"label":"載入索引","href":"Loading-Index​","type":2,"isActive":false},{"label":"如何為多租戶定義資料模型","href":"How-to-Define-Data-Model-For-Multi-tenancy​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.md new file mode 100644 index 000000000..819c6e440 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema-hands-on.md @@ -0,0 +1,268 @@ +--- +id: schema-hands-on.md +title: 模式設計實作 +summary: >- + Milvus + 支援透過集合模式來定義資料模型。集合可組織文字和影像等非結構化資料,以及它們的向量表示,包括用於語意搜尋的各種精確度的密集向量和稀疏向量。此外,Milvus + 還支援儲存和過濾稱為「標量」的非向量資料類型。Scalar 類型包括 + BOOL、INT8/16/32/64、FLOAT/DOUBLE、VARCHAR、JSON 和 Array。 +--- +

    模式設計實作

    資訊檢索 (IR) 系統,也稱為搜尋,對於各種 AI 應用程式來說是不可或缺的,例如檢索增生 (RAG)、圖像搜尋和產品推薦。開發 IR 系統的第一步是設計資料模型,這包括分析業務需求、決定如何組織資訊,以及為資料編制索引,使其在語意上可被搜尋。

    +

    Milvus 支援透過集合模式來定義資料模型。集合可組織文本和圖像等非結構化資料,以及它們的向量表示,包括用於語義搜索的各種精確度的密集和稀疏向量。此外,Milvus 還支援儲存和過濾稱為「標量」的非向量資料類型。Scalar 類型包括 BOOL、INT8/16/32/64、FLOAT/DOUBLE、VARCHAR、JSON 和 Array。

    +

    + + Example data schema designed for searching news article + 為搜尋新聞文章而設計的資料模式範例

    +

    搜尋系統的資料模式設計包括分析業務需求,並將資訊抽象為模式表達的資料模式。舉例來說,若要搜尋一段文字,就必須透過「嵌入」(embedding)將字面上的字串轉換成向量,使向量搜尋成為「索引」。除了這個基本要求之外,可能還需要儲存其他屬性,例如出版時間戳和作者。這些元資料允許透過篩選來精細語意搜尋,僅傳回在特定日期之後或由特定作者出版的文字。它們也可能需要與主要文字一起檢索,以便在應用程式中呈現搜尋結果。為了組織這些文字片段,應該為每個片段指定一個唯一的識別碼,以整數或字串表示。這些元素對於達成複雜的搜尋邏輯非常重要。

    +

    設計良好的模式非常重要,因為它可以抽象出資料模型,並決定是否可以透過搜尋來達成業務目標。此外,由於插入到資料集中的每一行資料都需要遵循模式,因此對維持資料一致性和長期品質大有幫助。從技術角度來看,定義良好的模式可帶來組織良好的列資料儲存和更乾淨的索引結構,進而提升搜尋效能。

    +

    舉例說明:新聞搜尋

    假設我們想要為新聞網站建立搜尋功能,而且我們有一個包含文字、縮圖和其他元資料的新聞資料庫。首先,我們需要分析如何利用這些資料來支援搜尋的商業需求。假設需求是根據縮圖和內容摘要擷取新聞,並將作者資訊和發佈時間等元資料作為過濾搜尋結果的條件。這些需求可以進一步細分為

    +
      +
    • 若要透過文字搜尋圖片,我們可以透過多模態嵌入模型將圖片嵌入向量,該模型可以將文字和圖片資料映射到相同的潛在空間中。

    • +
    • 透過文字嵌入模型,將文章的摘要文字嵌入向量中。

    • +
    • 若要依據發表時間進行篩選,日期會儲存在標量欄位中,並且需要為標量欄位建立索引,以進行有效的篩選。其他更複雜的資料結構,例如 JSON,也可以儲存在標量中,並對其內容執行篩選搜尋 (JSON 索引是即將推出的功能)。

    • +
    • 為了擷取圖片縮圖的位元組,並將其呈現在搜尋結果頁面上,圖片的 url 也會被儲存。同樣地,摘要文字和標題也是如此。(如果需要,我們也可以將原始文字和圖片檔案資料儲存為標量欄位)。

    • +
    • 為了改善摘要文字的搜尋結果,我們設計了一種混合搜尋方法。對於其中一種檢索路徑,我們使用正規的嵌入模型來從文字產生密集向量,例如 OpenAI 的text-embedding-3-large 或開放原始碼的bge-large-en-v1.5 。這些模型善於表現文字的整體語意。另一種途徑是使用稀疏嵌入模型,例如 BM25 或 SPLADE 來產生稀疏向量,類似全文檢索,善於掌握文字中的細節和個別概念。由於 Milvus 的多向量功能,它支援在同一資料收集中使用兩者。對多個向量的搜尋可以在單一hybrid_search() 作業中完成。

    • +
    • 最後,我們還需要一個 ID 欄位來識別每個個別的新聞頁面,在 Milvus 的術語中正式稱為「實體」。這個欄位會被用來做為主索引鍵 (或簡稱 "pk")。

    • +
    +

    欄位名稱

    +

    article_id (主鍵)

    +

    標題

    +

    作者資訊

    +

    出版資訊

    +

    image_url

    +

    圖片向量

    +

    摘要

    +

    摘要密度向量

    +

    摘要稀疏向量

    +

    類型

    +

    INT64

    +

    VARCHAR

    +

    JSON

    +

    INT32

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    VARCHAR

    +

    FLOAT_VECTOR

    +

    稀疏浮點向量

    +

    需要索引

    +

    N

    +

    N

    +

    N (即將支援)

    +

    Y

    +

    N

    +

    Y

    +

    N

    +

    Y

    +

    Y

    +
    +

    如何實作範例模式

    建立模式

    首先,我們創建一個 Milvus 客戶端實例,用來連接 Milvus 伺服器並管理集合和資料。

    +

    要建立模式,我們使用 create_schema()來建立模式物件,並使用 add_field()來新增欄位到模式。

    +
    from pymilvus import MilvusClient, DataType​
    +​
    +collection_name = "my_collection"​
    +​
    +# client = MilvusClient(uri="http://localhost:19530")​
    +client = MilvusClient(uri="./milvus_demo.db")​
    +​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +)​
    +​
    +schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, description="article id")​
    +schema.add_field(field_name="title", datatype=DataType.VARCHAR, max_length=200, description="article title")​
    +schema.add_field(field_name="author_info", datatype=DataType.JSON, description="author information")​
    +schema.add_field(field_name="publish_ts", datatype=DataType.INT32, description="publish timestamp")​
    +schema.add_field(field_name="image_url", datatype=DataType.VARCHAR,  max_length=500, description="image URL")​
    +schema.add_field(field_name="image_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="image vector")​
    +schema.add_field(field_name="summary", datatype=DataType.VARCHAR, max_length=1000, description="article summary")​
    +schema.add_field(field_name="summary_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="summary dense vector")​
    +schema.add_field(field_name="summary_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="summary sparse vector")​
    +
    +
    +

    您可能會注意到MilvusClient 中的參數uri ,它是用來連線到 Milvus 伺服器的。您可以如下設定這些參數。

    +
      +
    • 如果您只需要一個本機向量資料庫來進行小規模的資料或原型製作,將 uri 設定為一個本機檔案,例如./milvus.db ,是最方便的方法,因為它會自動利用Milvus Lite將所有資料儲存在這個檔案中。

    • +
    • 如果您有大規模的資料,例如超過一百萬個向量,您可以在Docker 或 Kubernetes 上架設效能更高的 Milvus 伺服器。在此設定中,請使用伺服器位址和連接埠作為您的 uri,例如http://localhost:19530 。如果您啟用 Milvus 的驗證功能,請使用「<your_username>:<your_password>」作為令牌,否則請勿設定令牌。

    • +
    • 如果您使用Zilliz Cloud(Milvus 的完全管理雲端服務),請調整uritoken ,它們對應於 Zilliz Cloud 中的Public Endpoint 和 API key

    • +
    +

    至於auto_idMilvusClient.create_schema ,AutoID 是主要欄位的屬性,決定是否啟用主要欄位的自動遞增。 由於我們設定欄位article_id 為主索引鍵,並希望手動新增文章 id,因此我們設定auto_id False 來停用此功能。

    +

    將所有欄位加入模式物件後,我們的模式物件與上表中的項目一致。

    +

    定義索引

    使用各種欄位定義模式之後,包括圖片和摘要資料的元資料和向量欄位,下一步就是準備索引參數。索引對於最佳化向量的搜尋和擷取、確保有效率的查詢效能至關重要。在下一節中,我們將為集合中指定的向量和標量欄位定義索引參數。

    +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="image_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_dense_vector",​
    +    index_type="AUTOINDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="summary_sparse_vector",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +)​
    +index_params.add_index(​
    +    field_name="publish_ts",​
    +    index_type="INVERTED",​
    +)​
    +
    +
    +

    一旦設定並套用索引參數,Milvus 就能優化處理向量和標量資料的複雜查詢。此索引可增強資料集中類似性搜尋的效能與精確度,讓我們能根據影像向量與摘要向量有效率地檢索文章。透過利用 AUTOINDEX對於密集向量、 SPARSE_INVERTED_INDEX對稀疏向量和 INVERTED_INDEXfor 標量,Milvus 可以快速識別並傳回最相關的結果,大幅改善資料擷取過程的整體使用者經驗與效能。

    +

    索引和指標有許多種類。關於它們的更多資訊,您可以參考Milvus 索引類型Milvus 度量類型

    +

    建立資料庫

    定義模式和索引後,我們使用這些參數建立一個「集合」。對 Milvus 來說,集合就像關係資料庫的資料表。

    +
    client.create_collection(​
    +    collection_name=collection_name,​
    +    schema=schema,​
    +    index_params=index_params,​
    +)​
    +
    +
    +

    我們可以透過描述集合來驗證集合是否已成功建立。

    +
    collection_desc = client.describe_collection(​
    +    collection_name=collection_name​
    +)​
    +print(collection_desc)​
    +
    +
    +

    其他注意事項

    載入索引

    在 Milvus 中建立資料集時,您可以選擇立即載入索引,或是延遲到大量擷取某些資料之後。通常情況下,您不需要對此做出明確的選擇,因為上面的示例顯示,索引會在集合創建後立即自動為任何擷取的資料建立。這樣就可以立即搜尋擷取的資料。但是,如果您在建立資料集後有大量的大量插入,並且在某一點之前不需要搜尋任何資料,您可以在建立資料集時省略 index_params 來延遲索引建立,並且在擷取所有資料後,明確呼叫 load 來建立索引。此方法對於在大型集合上建立索引更有效率,但在呼叫 load() 之前無法進行任何搜尋。

    +

    如何為多租戶定義資料模型

    多租戶的概念常用於單一軟體應用程式或服務需要服務多個獨立使用者或組織的情況,每個使用者或組織都有自己獨立的環境。這種情況常見於雲端運算、SaaS (軟體即服務) 應用程式和資料庫系統。舉例來說,雲端儲存服務可能會利用多租用權,讓不同的公司在共用相同底層基礎架構的同時,分別儲存和管理他們的資料。此方法可最大化資源利用率和效率,同時確保每個租戶的資料安全性和隱私。

    +

    區分租戶的最簡單方法就是將他們的資料和資源彼此隔離。每個租戶可以獨佔存取特定資源,或與其他租戶共享資源,以管理 Milvus 實體,例如資料庫、集合和分割。有特定的方法與這些實體結盟,以實現 Milvus 多重租戶。您可以參考Milvus 多重租用頁面以獲得更多資訊。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.json new file mode 100644 index 000000000..9338ea6ea --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema()​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = []​\n\n","export schema='{​\n \"fields\": []​\n}'​\n\n","schema.add_field(​\n field_name=\"my_id\",​\n datatype=DataType.INT64,​\n # highlight-start​\n is_primary=True,​\n auto_id=False,​\n # highlight-end​\n)​\n\n","import io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq; ​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_id\")​\n .dataType(DataType.Int64)​\n // highlight-start​\n .isPrimaryKey(true)​\n .autoID(false)​\n // highlight-end​\n .build());​\n\n","schema.push({​\n name: \"my_id\",​\n data_type: DataType.Int64,​\n // highlight-start​\n is_primary_key: true,​\n autoID: false​\n // highlight-end​\n});​\n\n","export primaryField='{​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport schema='{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField​\n ]​\n}'​\n\n","schema.add_field(​\n field_name=\"my_vector\",​\n datatype=DataType.FLOAT_VECTOR,​\n # highlight-next-line​\n dim=5​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_vector\")​\n .dataType(DataType.FloatVector)​\n // highlight-next-line​\n .dimension(5)​\n .build());​\n\n","schema.push({​\n name: \"my_vector\",​\n data_type: DataType.FloatVector,​\n // highlight-next-line​\n dim: 5​\n});​\n\n","export vectorField='{​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 5​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_varchar\",​\n datatype=DataType.VARCHAR,​\n # highlight-next-line​\n max_length=512​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n // highlight-next-line​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n // highlight-next-line​\n max_length: 512​\n});​\n\n","export varCharField='{​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 256​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_int64\",​\n datatype=DataType.INT64,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_int64\")​\n .dataType(DataType.Int64)​\n .build());​\n\n","schema.push({​\n name: \"my_int64\",​\n data_type: DataType.Int64,​\n});​\n\n","export int64Field='{​\n \"fieldName\": \"my_int64\",​\n \"dataType\": \"Int64\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_bool\",​\n datatype=DataType.BOOL,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_bool\")​\n .dataType(DataType.Bool)​\n .build());​\n\n","schema.push({​\n name: \"my_bool\",​\n data_type: DataType.Boolean,​\n});​\n\n","export boolField='{​\n \"fieldName\": \"my_bool\",​\n \"dataType\": \"Boolean\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_json\",​\n datatype=DataType.JSON,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_json\")​\n .dataType(DataType.JSON)​\n .build());​\n\n","schema.push({​\n name: \"my_json\",​\n data_type: DataType.JSON,​\n});​\n\n","export jsonField='{​\n \"fieldName\": \"my_json\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField​\n ]​\n}\"​\n\n","schema.add_field(​\n field_name=\"my_array\",​\n datatype=DataType.ARRAY,​\n element_type=DataType.VARCHAR,​\n max_capacity=5,​\n max_length=512,​\n)​\n\n","schema.addField(AddFieldReq.builder()​\n .fieldName(\"my_array\")​\n .dataType(DataType.Array)​\n .elementType(DataType.VarChar)​\n .maxCapacity(5)​\n .maxLength(512)​\n .build());​\n\n","schema.push({​\n name: \"my_array\",​\n data_type: DataType.Array,​\n element_type: DataType.VarChar,​\n max_capacity: 5,​\n max_length: 512​\n});​\n\n","export arrayField='{​\n \"fieldName\": \"my_array\",​\n \"dataType\": \"Array\",​\n \"elementDataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField,​\n $varCharField,​\n $int64Field,​\n $boolField,​\n $jsonField,​\n $arrayField​\n ]​\n}\"​\n\n"],"headingContent":"Schema Explained​","anchorList":[{"label":"模式說明","href":"Schema-Explained​","type":1,"isActive":false},{"label":"概觀","href":"Overview​","type":2,"isActive":false},{"label":"建立模式","href":"Create-Schema​","type":2,"isActive":false},{"label":"新增主要欄位","href":"Add-Primary-Field​","type":2,"isActive":false},{"label":"新增向量欄位","href":"Add-Vector-Fields​","type":2,"isActive":false},{"label":"新增標量欄位","href":"Add-Scalar-Fields​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.md new file mode 100644 index 000000000..a7b3941de --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/schema.md @@ -0,0 +1,450 @@ +--- +id: schema.md +title: 模式說明 +summary: 模式定義了集合的資料結構。在建立一個集合之前,您需要先設計它的模式。本頁可協助您瞭解集合模式,並自行設計一個範例模式。 +--- +

    模式說明

    模式定義了集合的資料結構。在建立一個資料集之前,您需要設計一個模式。本頁可協助您瞭解集合模式,並自行設計一個範例模式。

    +

    概觀

    在 Milvus 中,集合模式是在關係數據庫中組合一個表,它定義了 Milvus 如何組織集合中的數據。

    +

    一個設計良好的模式是非常重要的,因為它抽象了資料模型,並決定您是否可以透過搜尋來達成業務目標。此外,由於插入到資料集中的每一行資料都必須遵循模式,因此它有助於保持資料的一致性和長期品質。從技術角度來看,定義良好的模式可帶來組織良好的列資料儲存和更乾淨的索引結構,從而提升搜尋效能。

    +

    集合模式有一個主索引鍵、最多四個向量欄位和幾個標量欄位。下圖說明如何將文章映射到模式欄位清單。

    +

    + + Schema design + 模式設計

    +

    搜尋系統的資料模式設計包括分析業務需求,並將資訊抽象為模式表達的資料模式。例如,搜尋一段文字時,必須透過「嵌入」將字面字串轉換為向量,並啟用向量搜尋來「建立索引」。除了這個基本要求之外,儲存其他屬性(例如出版時間戳和作者)可能也是必要的。這些元資料允許透過篩選來精細語意搜尋,僅傳回在特定日期之後或由特定作者出版的文字。您也可以擷取這些標量與主要文字,以便在應用程式中呈現搜尋結果。每個標量都應該指定一個唯一的識別碼,以整數或字串的形式來組織這些文字片段。這些元素對於達成精密的搜尋邏輯是不可或缺的。

    +

    請參閱模式設計實作,以瞭解如何製作設計良好的模式。

    +

    建立模式

    以下程式碼片段示範如何建立模式。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema()​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = []​
    +
    +
    +
    export schema='{​
    +    "fields": []​
    +}'​
    +
    +
    +

    新增主要欄位

    集合中的 primary 欄位唯一地識別一個實體。它只接受Int64VarChar值。以下程式碼片段示範如何新增主字段。

    + +
    schema.add_field(​
    +    field_name="my_id",​
    +    datatype=DataType.INT64,​
    +    # highlight-start​
    +    is_primary=True,​
    +    auto_id=False,​
    +    # highlight-end​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq; ​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_id")​
    +        .dataType(DataType.Int64)​
    +        // highlight-start​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        // highlight-end​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_id",​
    +    data_type: DataType.Int64,​
    +    // highlight-start​
    +    is_primary_key: true,​
    +    autoID: false​
    +    // highlight-end​
    +});​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "my_id",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export schema='{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField​
    +    ]​
    +}'​
    +
    +
    +

    新增欄位時,您可以透過設定其is_primary 屬性為True ,明確地將該欄位澄清為主要欄位。primary 欄位預設接受Int64值。在這種情況下,主字段值應該是類似12345 的整數。如果您選擇在主字段中使用VarChar值,則值應該是類似my_entity_1234 的字串。

    +

    您也可以設定autoId 屬性為True ,讓 Milvus 在插入資料時自動分配主字段值。

    +

    詳情請參考Primary Field & AutoID

    +

    新增向量欄位

    向量欄位接受各種稀疏和密集的向量嵌入。在 Milvus 中,您可以新增四個向量欄位到一個集合。以下程式碼片段示範如何新增向量欄位。

    + +
    schema.add_field(​
    +    field_name="my_vector",​
    +    datatype=DataType.FLOAT_VECTOR,​
    +    # highlight-next-line
    +    dim=5​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_vector")​
    +        .dataType(DataType.FloatVector)​
    +        // highlight-next-line​
    +        .dimension(5)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_vector",​
    +    data_type: DataType.FloatVector,​
    +    // highlight-next-line​
    +    dim: 5​
    +});​
    +
    +
    +
    export vectorField='{​
    +    "fieldName": "my_vector",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 5​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    上述程式碼片段中的dim 參數表示向量字段中要保存的向量內嵌的維度。FLOAT_VECTOR 的值表示向量欄位持有 32 位元浮動數的清單,通常用來表示反斜率。除此之外,Milvus 也支援下列類型的向量嵌入。

    +
      +
    • FLOAT16_VECTOR

      +

      此類型的向量欄位持有 16 位元半精度浮點數的清單,通常適用於記憶體或頻寬受限的深度學習或基於 GPU 的運算情境。

    • +
    • BFLOAT16_VECTOR

      +

      此類型的向量欄位會存放 16 位元浮點數的清單,這些浮點數的精確度降低,但指數範圍與 Float32 相同。這種類型的資料常用於深度學習的情境,因為它可以減少記憶體使用量,卻不會顯著影響精確度。

    • +
    • BINARY_VECTOR

      +

      此類型的向量欄位會存放 0 和 1 的清單。它們可作為影像處理和資訊檢索情境中表示資料的精簡功能。

    • +
    • SPARSE_FLOAT_VECTOR

      +

      此類型的向量欄位會存放非零數字清單及其序列號,以表示稀疏向量內嵌。

    • +
    +

    新增標量欄位

    在常見的情況下,您可以使用標量欄位來儲存 Milvus 所儲存的向量內嵌的元資料,並利用元資料篩選來進行 ANN 搜尋,以提高搜尋結果的正確性。Milvus 支援多種標量欄位類型,包括VarCharBooleanInt、Float、DoubleArray 和 JSON。

    +

    新增字串欄位

    在 Milvus 中,您可以使用 VarChar 欄位來儲存字串。關於 VarChar 欄位的更多資訊,請參考String Field

    + +
    schema.add_field(​
    +    field_name="my_varchar",​
    +    datatype=DataType.VARCHAR,​
    +    # highlight-next-line
    +    max_length=512​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        // highlight-next-line​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_varchar",​
    +    data_type: DataType.VarChar,​
    +    // highlight-next-line​
    +    max_length: 512​
    +});​
    +
    +
    +
    export varCharField='{​
    +    "fieldName": "my_varchar",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 256​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField​
    +    ]​
    +}"​
    +
    +
    +

    新增數字欄位

    Milvus 支援的數字類型有Int8,Int16,Int32,Int64,Float, 和Double 。有關數字欄位的詳細資訊,請參閱數字欄位。

    + +
    schema.add_field(​
    +    field_name="my_int64",​
    +    datatype=DataType.INT64,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_int64")​
    +        .dataType(DataType.Int64)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_int64",​
    +    data_type: DataType.Int64,​
    +});​
    +
    +
    +
    export int64Field='{​
    +    "fieldName": "my_int64",​
    +    "dataType": "Int64"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field​
    +    ]​
    +}"​
    +
    +
    +

    新增布林欄位

    Milvus 支援布林欄位。以下程式碼片段示範如何新增布林欄位。

    + +
    schema.add_field(​
    +    field_name="my_bool",​
    +    datatype=DataType.BOOL,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_bool")​
    +        .dataType(DataType.Bool)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_bool",​
    +    data_type: DataType.Boolean,​
    +});​
    +
    +
    +
    export boolField='{​
    +    "fieldName": "my_bool",​
    +    "dataType": "Boolean"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField​
    +    ]​
    +}"​
    +
    +
    +

    新增 JSON 欄位

    JSON 欄位通常儲存半結構化的 JSON 資料。有關 JSON 欄位的詳細資訊,請參閱JSON 欄位。

    + +
    schema.add_field(​
    +    field_name="my_json",​
    +    datatype=DataType.JSON,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_json")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_json",​
    +    data_type: DataType.JSON,​
    +});​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "my_json",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField​
    +    ]​
    +}"​
    +
    +
    +

    新增陣列欄位

    陣列欄位儲存元素清單。陣列欄位中所有元素的資料類型應該相同。有關陣列欄位的詳細資訊,請參閱陣列欄位。

    + +
    schema.add_field(​
    +    field_name="my_array",​
    +    datatype=DataType.ARRAY,​
    +    element_type=DataType.VARCHAR,​
    +    max_capacity=5,​
    +    max_length=512,​
    +)​
    +
    +
    +
    schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_array")​
    +        .dataType(DataType.Array)​
    +        .elementType(DataType.VarChar)​
    +        .maxCapacity(5)​
    +        .maxLength(512)​
    +        .build());​
    +
    +
    +
    schema.push({​
    +    name: "my_array",​
    +    data_type: DataType.Array,​
    +    element_type: DataType.VarChar,​
    +    max_capacity: 5,​
    +    max_length: 512​
    +});​
    +
    +
    +
    export arrayField='{​
    +    "fieldName": "my_array",​
    +    "dataType": "Array",​
    +    "elementDataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 512​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField,​
    +        $varCharField,​
    +        $int64Field,​
    +        $boolField,​
    +        $jsonField,​
    +        $arrayField​
    +    ]​
    +}"​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.json new file mode 100644 index 000000000..851cd3979 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.json @@ -0,0 +1 @@ +{"codeList":["from scipy.sparse import csr_matrix​\n​\n# Create a sparse matrix​\nrow = [0, 0, 1, 2, 2, 2]​\ncol = [0, 2, 2, 0, 1, 2]​\ndata = [1, 2, 3, 4, 5, 6]​\nsparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​\n​\n# Represent sparse vector using the sparse matrix​\nsparse_vector = sparse_matrix.getrow(0)​\n\n","# Represent sparse vector using a dictionary​\nsparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​\n\n","SortedMap sparseVector = new TreeMap<>();​\nsparseVector.put(1L, 0.5f);​\nsparseVector.put(100L, 0.3f);​\nsparseVector.put(500L, 0.8f);​\nsparseVector.put(1024L, 0.2f);​\nsparseVector.put(5000L, 0.6f);​\n\n","# Represent sparse vector using a list of tuples​\nsparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nclient.drop_collection(collection_name=\"my_sparse_collection\")​\n​\nschema = client.create_schema(​\n auto_id=True,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"pk\", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​\nschema.add_field(field_name=\"sparse_vector\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.VarChar)​\n .isPrimaryKey(true)​\n .autoID(true)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse_vector\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","import { DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"sparse_vector\",​\n data_type: DataType.SparseFloatVector,​\n }​\n];​\n​\n\n","export primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"VarChar\",​\n \"isPrimary\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"sparse_vector\",​\n \"dataType\": \"SparseFloatVector\"​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": true,​\n \\\"fields\\\": [​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse_vector\",​\n index_name=\"sparse_inverted_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\",​\n metric_type=\"IP\",​\n params={\"drop_ratio_build\": 0.2},​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"drop_ratio_build\", 0.2);​\nindexes.add(IndexParam.builder()​\n .fieldName(\"sparse_vector\")​\n .indexName(\"sparse_inverted_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(extraParams)​\n .build());​\n\n","const indexParams = await client.createIndex({​\n index_name: 'sparse_inverted_index',​\n field_name: 'sparse_vector',​\n metric_type: MetricType.IP,​\n index_type: IndexType.SPARSE_WAND,​\n params: {​\n drop_ratio_build: 0.2,​\n },​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"sparse_vector\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_inverted_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\",​\n \"params\":{\"drop_ratio_build\": 0.2}​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_sparse_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","import { MilvusClient } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst client = new MilvusClient({​\n address: 'http://localhost:19530'​\n});​\n​\nawait client.createCollection({​\n collection_name: 'my_sparse_collection',​\n schema: schema,​\n index_params: indexParams​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_sparse_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","sparse_vectors = [​\n {\"sparse_vector\": {1: 0.5, 100: 0.3, 500: 0.8}},​\n {\"sparse_vector\": {10: 0.1, 200: 0.7, 1000: 0.9}},​\n]​\n​\nclient.insert(​\n collection_name=\"my_sparse_collection\",​\n data=sparse_vectors​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(1L, 0.5f);​\n sparse.put(100L, 0.3f);​\n sparse.put(500L, 0.8f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n{​\n JsonObject row = new JsonObject();​\n SortedMap sparse = new TreeMap<>();​\n sparse.put(10L, 0.1f);​\n sparse.put(200L, 0.7f);​\n sparse.put(1000L, 0.9f);​\n row.add(\"sparse_vector\", gson.toJsonTree(sparse));​\n rows.add(row);​\n}​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n { sparse_vector: { \"1\": 0.5, \"100\": 0.3, \"500\": 0.8 } },​\n { sparse_vector: { \"10\": 0.1, \"200\": 0.7, \"1000\": 0.9 } },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"sparse_vector\": {\"1\": 0.5, \"100\": 0.3, \"500\": 0.8}},​\n {\"sparse_vector\": {\"10\": 0.1, \"200\": 0.7, \"1000\": 0.9}} ​\n ],​\n \"collectionName\": \"my_sparse_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":2,\"insertIds\":[\"453577185629572534\",\"453577185629572535\"]}}​\n\n","# Prepare search parameters​\nsearch_params = {​\n \"params\": {\"drop_ratio_search\": 0.2}, # Additional optional search parameters​\n}​\n​\n# Prepare the query vector​\nquery_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​\n\n","res = client.search(​\n collection_name=\"my_sparse_collection\",​\n data=query_vector,​\n limit=3,​\n output_fields=[\"pk\"],​\n search_params=search_params,​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]\"]​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nMap searchParams = new HashMap<>();​\nsearchParams.put(\"drop_ratio_search\", 0.2);​\n​\nSortedMap sparse = new TreeMap<>();​\nsparse.put(10L, 0.1f);​\nsparse.put(200L, 0.7f);​\nsparse.put(1000L, 0.9f);​\n​\nSparseFloatVec queryVector = new SparseFloatVec(sparse);​\n​\nSearchResp searchR = client.search(SearchReq.builder()​\n .collectionName(\"my_sparse_collection\")​\n .data(Collections.singletonList(queryVector))​\n .annsField(\"sparse_vector\")​\n .searchParams(searchParams)​\n .topK(3)​\n .outputFields(Collections.singletonList(\"pk\"))​\n .build());​\n ​\nSystem.out.println(searchR.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​\n\n","client.search({​\n collection_name: 'my_sparse_collection',​\n data: {1: 0.2, 50: 0.4, 1000: 0.7},​\n limit: 3,​\n output_fields: ['pk'],​\n params: {​\n drop_ratio_search: 0.2​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_sparse_collection\",​\n \"data\": [​\n {\"1\": 0.2, \"50\": 0.4, \"1000\": 0.7}​\n ],​\n \"annsField\": \"sparse_vector\",​\n \"limit\": 3,​\n \"searchParams\":{​\n \"params\":{\"drop_ratio_search\": 0.2}​\n },​\n \"outputFields\": [\"pk\"]​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":0.63,\"id\":\"453577185629572535\",\"pk\":\"453577185629572535\"},{\"distance\":0.1,\"id\":\"453577185629572534\",\"pk\":\"453577185629572534\"}]}​\n\n"],"headingContent":"Sparse Vector​","anchorList":[{"label":"稀疏向量","href":"Sparse-Vector​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"在 Milvus 中使用稀疏向量","href":"Use-sparse-vectors-in-Milvus​","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"常見問題","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.md new file mode 100644 index 000000000..473ca8fcc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/sparse_vector.md @@ -0,0 +1,533 @@ +--- +id: sparse_vector.md +title: 稀疏向量 +summary: >- + 稀疏向量是資訊檢索和自然語言處理中重要的資料表示方法。雖然密集向量因其優異的語意理解能力而廣受歡迎,但在需要精確匹配關鍵字或詞組的應用程式中,稀疏向量通常能提供更精確的結果。 +--- +

    稀疏向量

    稀疏向量是資訊檢索和自然語言處理中重要的資料表示方法。雖然密集向量因其優異的語意理解能力而廣受歡迎,但在需要精確匹配關鍵字或詞組的應用程式時,稀疏向量通常能提供更精確的結果。

    +

    概述

    稀疏向量是高維向量的一種特殊表示形式,其中大部分元素為零,只有少數維度有非零值。這個特性使得稀疏向量在處理大規模、高維但稀疏的資料時特別有效。常見的應用包括

    +
      +
    • 文字分析:將文件表示為字袋向量,其中每個維度對應一個字,只有在文件中出現的字才有非零值。

    • +
    • 推薦系統:使用者與物品互動矩陣,其中每個維度代表使用者對特定物品的評價,大多數使用者只與少數物品互動。

    • +
    • 影像處理:局部特徵表示法,只針對影像中的關鍵點,產生高維度的稀疏向量。

    • +
    +

    如下圖所示,密集向量通常表示為連續陣列,其中每個位置都有一個值 (例如[0.3, 0.8, 0.2, 0.3, 0.1])。相反地,稀疏向量只儲存非零元素及其索引,通常以鍵值對來表示 (例如:[{2: 0.2}, ..., {9997: 0.5}, {9999: 0.7}])。這種表示方式可大幅減少儲存空間並提昇計算效率,尤其是在處理極高維數據 (例如 10,000 維) 時。

    +

    + + Spare vector representation + 稀疏向量表示法

    +

    稀疏向量可以使用各種方法產生,例如文字處理中的TF-IDFTermFrequency-Inverse Document Frequency)和BM25。此外,Milvus 也提供方便的方法來協助產生和處理稀疏向量。詳情請參閱嵌入

    +

    對於文字資料,Milvus 也提供全文檢索功能,讓您可以直接在原始文字資料上執行向量檢索,而無需使用外部嵌入模型來產生稀疏向量。如需詳細資訊,請參閱全文檢索。

    +

    向量化之後,資料可以儲存在 Milvus 中進行管理和向量檢索。下圖說明基本流程。

    +

    + + Use sparse vector in Milvus + 在 Milvus 中使用稀疏向量

    +
    +

    除了稀疏向量,Milvus 也支援密集向量和二進位向量。密集向量是捕捉深層語意關係的理想選擇,而二進位向量則在快速相似性比較和內容重複刪除等情況下表現優異。如需詳細資訊,請參閱密集向量二進位向量

    +
    +

    在 Milvus 中使用稀疏向量

    Milvus 支援以下列任何一種格式來表示稀疏向量。

    +
      +
    • 稀疏矩陣 (使用scipy.sparse class)

      +

      +
      from scipy.sparse import csr_matrix​
      +​
      +# Create a sparse matrix​
      +row = [0, 0, 1, 2, 2, 2]​
      +col = [0, 2, 2, 0, 1, 2]​
      +data = [1, 2, 3, 4, 5, 6]​
      +sparse_matrix = csr_matrix((data, (row, col)), shape=(3, 3))​
      +​
      +# Represent sparse vector using the sparse matrix​
      +sparse_vector = sparse_matrix.getrow(0)​
      +
      +
    • +
    • 字典清單 (格式為{dimension_index: value, ...})

      +

      +
      # Represent sparse vector using a dictionary​
      +sparse_vector = [{1: 0.5, 100: 0.3, 500: 0.8, 1024: 0.2, 5000: 0.6}]​
      +
      +
      +
      SortedMap<Long, Float> sparseVector = new TreeMap<>();​
      +sparseVector.put(1L, 0.5f);​
      +sparseVector.put(100L, 0.3f);​
      +sparseVector.put(500L, 0.8f);​
      +sparseVector.put(1024L, 0.2f);​
      +sparseVector.put(5000L, 0.6f);​
      +
      +
    • +
    • 元組迭代器清單 (格式如[(dimension_index, value)])

      +

      +
      # Represent sparse vector using a list of tuples​
      +sparse_vector = [[(1, 0.5), (100, 0.3), (500, 0.8), (1024, 0.2), (5000, 0.6)]]​
      +
      +
    • +
    +

    新增向量領域

    要在 Milvus 中使用稀疏向量,請在建立集合時定義一個欄位來儲存稀疏向量。這個過程包括

    +
      +
    1. 設定datatype 為支援的稀疏向量資料類型,SPARSE_FLOAT_VECTOR

    2. +
    3. 不需要指定維度。

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +client.drop_collection(collection_name="my_sparse_collection")​
    +​
    +schema = client.create_schema(​
    +    auto_id=True,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)​
    +schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.VarChar)​
    +        .isPrimaryKey(true)​
    +        .autoID(true)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse_vector")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    import { DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "sparse_vector",​
    +    data_type: DataType.SparseFloatVector,​
    +  }​
    +];​
    +​
    +
    +
    +
    export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "VarChar",​
    +    "isPrimary": true,​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "sparse_vector",​
    +    "dataType": "SparseFloatVector"​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": true,​
    +    \"fields\": [​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    在這個範例中,新增了一個名為sparse_vector 的向量欄位,用來儲存稀疏向量。這個欄位的資料類型是SPARSE_FLOAT_VECTOR

    +

    為向量欄位設定索引參數

    為稀疏向量建立索引的過程與為密集向量建立索引的過程相似,但在指定的索引類型 (index_type) 、距離度量 (metric_type) 和索引參數 (params) 上有所不同。

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse_vector",​
    +    index_name="sparse_inverted_index",​
    +    index_type="SPARSE_INVERTED_INDEX",​
    +    metric_type="IP",​
    +    params={"drop_ratio_build": 0.2},​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("drop_ratio_build", 0.2);​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("sparse_vector")​
    +        .indexName("sparse_inverted_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(extraParams)​
    +        .build());​
    +
    +
    +
    const indexParams = await client.createIndex({​
    +    index_name: 'sparse_inverted_index',​
    +    field_name: 'sparse_vector',​
    +    metric_type: MetricType.IP,​
    +    index_type: IndexType.SPARSE_WAND,​
    +    params: {​
    +      drop_ratio_build: 0.2,​
    +    },​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "sparse_vector",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_inverted_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX",​
    +            "params":{"drop_ratio_build": 0.2}​
    +        }​
    +    ]'​
    +
    +
    +

    在上面的範例中。

    +
      +
    • 會為稀疏向量建立SPARSE_INVERTED_INDEX 類型的索引。對於稀疏向量,您可以指定SPARSE_INVERTED_INDEXSPARSE_WAND 。詳情請參閱稀疏向量索引

    • +
    • 對於稀疏向量,metric_type 只支援IP (Inner Product),用來衡量兩個稀疏向量之間的相似性。有關相似性的詳細資訊,請參閱公制類型

    • +
    • drop_ratio_build 是專門針對稀疏向量的可選索引參數。它控制在索引建立過程中排除小向量值的比例。例如,使用 時,最小 20% 的向量值會在建立索引時排除,以減少搜尋時的計算工作。{"drop_ratio_build": 0.2}

    • +
    +

    建立集合

    稀疏向量和索引設定完成後,就可以建立包含稀疏向量的集合。以下範例使用 create_collection方法來建立一個名為my_sparse_collection 的集合。

    + +
    client.create_collection(​
    +    collection_name="my_sparse_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    import { MilvusClient } from "@zilliz/milvus2-sdk-node";​
    +​
    +const client = new MilvusClient({​
    +    address: 'http://localhost:19530'​
    +});​
    +​
    +await client.createCollection({​
    +    collection_name: 'my_sparse_collection',​
    +    schema: schema,​
    +    index_params: indexParams​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_sparse_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立集合後,插入包含稀疏向量的資料。

    + +
    sparse_vectors = [​
    +    {"sparse_vector": {1: 0.5, 100: 0.3, 500: 0.8}},​
    +    {"sparse_vector": {10: 0.1, 200: 0.7, 1000: 0.9}},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_sparse_collection",​
    +    data=sparse_vectors​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(1L, 0.5f);​
    +    sparse.put(100L, 0.3f);​
    +    sparse.put(500L, 0.8f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +{​
    +    JsonObject row = new JsonObject();​
    +    SortedMap<Long, Float> sparse = new TreeMap<>();​
    +    sparse.put(10L, 0.1f);​
    +    sparse.put(200L, 0.7f);​
    +    sparse.put(1000L, 0.9f);​
    +    row.add("sparse_vector", gson.toJsonTree(sparse));​
    +    rows.add(row);​
    +}​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  { sparse_vector: { "1": 0.5, "100": 0.3, "500": 0.8 } },​
    +  { sparse_vector: { "10": 0.1, "200": 0.7, "1000": 0.9 } },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"sparse_vector": {"1": 0.5, "100": 0.3, "500": 0.8}},​
    +        {"sparse_vector": {"10": 0.1, "200": 0.7, "1000": 0.9}}        ​
    +    ],​
    +    "collectionName": "my_sparse_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":2,"insertIds":["453577185629572534","453577185629572535"]}}​
    +
    +
    +

    執行相似性搜尋

    若要使用稀疏向量執行相似性搜尋,請準備查詢向量和搜尋參數。

    + +
    # Prepare search parameters​
    +search_params = {​
    +    "params": {"drop_ratio_search": 0.2},  # Additional optional search parameters​
    +}​
    +​
    +# Prepare the query vector​
    +query_vector = [{1: 0.2, 50: 0.4, 1000: 0.7}]​
    +
    +
    +

    在本範例中,drop_ratio_search 是專門針對稀疏向量的可選參數,允許在搜尋過程中微調查詢向量中的小值。例如,使用{"drop_ratio_search": 0.2} 時,查詢向量中最小的 20% 值會在搜尋過程中被忽略。

    +

    然後,使用search 方法執行相似性搜尋。

    + +
    res = client.search(​
    +    collection_name="my_sparse_collection",​
    +    data=query_vector,​
    +    limit=3,​
    +    output_fields=["pk"],​
    +    search_params=search_params,​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': '453718927992172266', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172266'}}, {'id': '453718927992172265', 'distance': 0.10000000149011612, 'entity': {'pk': '453718927992172265'}}]"]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +Map<String,Object> searchParams = new HashMap<>();​
    +searchParams.put("drop_ratio_search", 0.2);​
    +​
    +SortedMap<Long, Float> sparse = new TreeMap<>();​
    +sparse.put(10L, 0.1f);​
    +sparse.put(200L, 0.7f);​
    +sparse.put(1000L, 0.9f);​
    +​
    +SparseFloatVec queryVector = new SparseFloatVec(sparse);​
    +​
    +SearchResp searchR = client.search(SearchReq.builder()​
    +        .collectionName("my_sparse_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .annsField("sparse_vector")​
    +        .searchParams(searchParams)​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("pk"))​
    +        .build());​
    +        ​
    +System.out.println(searchR.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={pk=453444327741536759}, score=1.31, id=453444327741536759), SearchResp.SearchResult(entity={pk=453444327741536756}, score=1.31, id=453444327741536756), SearchResp.SearchResult(entity={pk=453444327741536753}, score=1.31, id=453444327741536753)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_sparse_collection',​
    +    data: {1: 0.2, 50: 0.4, 1000: 0.7},​
    +    limit: 3,​
    +    output_fields: ['pk'],​
    +    params: {​
    +        drop_ratio_search: 0.2​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_sparse_collection",​
    +    "data": [​
    +        {"1": 0.2, "50": 0.4, "1000": 0.7}​
    +    ],​
    +    "annsField": "sparse_vector",​
    +    "limit": 3,​
    +    "searchParams":{​
    +        "params":{"drop_ratio_search": 0.2}​
    +    },​
    +    "outputFields": ["pk"]​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":0.63,"id":"453577185629572535","pk":"453577185629572535"},{"distance":0.1,"id":"453577185629572534","pk":"453577185629572534"}]}​
    +
    +
    +

    有關相似性搜尋參數的詳細資訊,請參閱基本 ANN 搜尋

    +

    限制

    在 Milvus 中使用稀疏向量時,請考慮下列限制:

    +
      +
    • 目前,稀疏向量只支援IPBM25(用於全文檢索)距離度量。稀疏向量的高維度使得 L2 和余弦距離不切實際。

    • +
    • 對於稀疏向量欄位,只支援SPARSE_INVERTED_INDEXSPARSE_WAND索引類型。

    • +
    • 稀疏向量支援的資料類型:

      +
        +
      • 維數部分必須是無符號的 32 位元整數;
      • +
      • 值部分可以是非負 32 位元浮點數。
      • +
    • +
    • 稀疏向量必須符合下列插入和搜尋的要求:

      +
        +
      • 向量中至少有一個值是非零的;
      • +
      • 向量索引是非負數。
      • +
    • +
    +

    常見問題

      +
    • 可否解釋 SPARSE_INVERTED_INDEX 與 SPARSE_WAND 的差異,以及如何選擇?

      +

      SPARSE_INVERTED_INDEX是一種傳統的倒轉索引,而SPARSE_WAND則是使用Weak-AND演算法來減少搜尋過程中完整 IP 距離評估的次數。SPARSE_WAND通常較快,但其效能會隨著向量密度的增加而下降。要在兩者之間做出選擇,請根據您的特定資料集和使用個案進行實驗和基準測試。

    • +
    • 我應該如何選擇 drop_ratio_build 和 drop_ratio_search 參數?

      +

      drop_ratio_builddrop_ratio_search的選擇取決於您資料的特性,以及您對搜尋延遲/吞吐量和精確度的要求。

    • +
    • 稀疏嵌入的維度可以是 uint32 空間內的任何離散值嗎?

      +

      可以,但有一個例外。稀疏嵌入的維度可以是[0, maximum of uint32) 範圍內的任何值。這表示您不能使用 uint32 的最大值。

    • +
    • 對成長中的區段進行搜尋時,是透過索引還是暴力搜尋?

      +

      對成長中區段的搜尋是透過與封存區段索引相同類型的索引進行。對於索引建立前的新成長區段,會使用暴力搜尋。

    • +
    • 是否可以在單一集合中同時擁有稀疏向量和密集向量?

      +

      可以,透過多重向量類型支援,您可以建立同時具有稀疏和密集向量列的集合,並對它們執行混合搜尋。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/string.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/string.json new file mode 100644 index 000000000..6c6f213ef --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/string.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\n# define schema​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"varchar_field1\", datatype=DataType.VARCHAR, max_length=100)​\nschema.add_field(field_name=\"varchar_field2\", datatype=DataType.VARCHAR, max_length=200)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field1\")​\n .dataType(DataType.VarChar)​\n .maxLength(100)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"varchar_field2\")​\n .dataType(DataType.VarChar)​\n .maxLength(200)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"varchar_field2\",​\n data_type: DataType.VarChar,​\n max_length: 200,​\n },​\n {​\n name: \"varchar_field1\",​\n data_type: DataType.VarChar,​\n max_length: 100,​\n },​\n];​\n\n","export varcharField1='{​\n \"fieldName\": \"varchar_field1\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 100​\n }​\n}'​\n​\nexport varcharField2='{​\n \"fieldName\": \"varchar_field2\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 200​\n }​\n}'​\n​\nexport primaryField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $varcharField1,​\n $varcharField2,​\n $primaryField,​\n $vectorField​\n ]​\n}\"​\n\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"varchar_field1\",​\n index_type=\"AUTOINDEX\",​\n index_name=\"varchar_index\"​\n)​\n\n","​\nimport io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"varchar_field1\")​\n .indexName(\"varchar_index\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .build());​\n\n","const indexParams = [{​\n index_name: 'varchar_index',​\n field_name: 'varchar_field1',​\n index_type: IndexType.AUTOINDEX,​\n)];​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Add vector index​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\", # Use automatic indexing to simplify complex index settings​\n metric_type=\"COSINE\" # Specify similarity metric type, options include L2, COSINE, or IP​\n)​\n\n","indexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","indexParams.push({​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metric_type: MetricType.COSINE,​\n index_type: IndexType.AUTOINDEX,​\n});​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"varchar_field1\",​\n \"indexName\": \"varchar_index\",​\n \"indexType\": \"AUTOINDEX\"​\n },​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","# Create Collection​\nclient.create_collection(​\n collection_name=\"your_collection_name\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_varchar_collection\",​\n schema: schema,​\n index_params: index_params​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_varchar_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n## {\"code\":0,\"data\":{}}​\n\n","data = [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]},​\n]​\n​\nclient.insert(​\n collection_name=\"my_varchar_collection\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product A\\\", \\\"varchar_field2\\\": \\\"High quality product\\\", \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product B\\\", \\\"varchar_field2\\\": \\\"Affordable price\\\", \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"varchar_field1\\\": \\\"Product C\\\", \\\"varchar_field2\\\": \\\"Best seller\\\", \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n varchar_field1: \"Product A\",​\n varchar_field2: \"High quality product\",​\n pk: 1,​\n embedding: [0.1, 0.2, 0.3],​\n },​\n {​\n varchar_field1: \"Product B\",​\n varchar_field2: \"Affordable price\",​\n pk: 2,​\n embedding: [0.4, 0.5, 0.6],​\n },​\n {​\n varchar_field1: \"Product C\",​\n varchar_field2: \"Best seller\",​\n pk: 3,​\n embedding: [0.7, 0.8, 0.9],​\n },​\n];​\nclient.insert({​\n collection_name: \"my_sparse_collection\",​\n data: data,​\n});​\n​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]},​\n {\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]},​\n {\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]} ​\n ],​\n \"collectionName\": \"my_varchar_collection\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":{\"insertCount\":3,\"insertIds\":[1,2,3]}}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.query(​\n collection_name=\"my_varchar_collection\",​\n filter=filter,​\n output_fields=[\"varchar_field1\", \"varchar_field2\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .filter(filter)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​\n\n","client.query({​\n collection_name: 'my_varchar_collection',​\n filter: 'varchar_field1 == \"Product A\"',​\n output_fields: ['varchar_field1', 'varchar_field2']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\",​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"]​\n}'​\n## {\"code\":0,\"cost\":0,\"data\":[{\"pk\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n","filter = 'varchar_field1 == \"Product A\"'​\n​\nres = client.search(​\n collection_name=\"my_varchar_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"varchar_field1\", \"varchar_field2\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"varchar_field1 == \\\"Product A\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_varchar_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Arrays.asList(\"varchar_field1\", \"varchar_field2\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_varchar_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['varchar_field1', 'varchar_field2'],​\n filter: 'varchar_field1 == \"Product A\"'​\n params: {​\n nprobe:10​\n }​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_varchar_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"varchar_field1\", \"varchar_field2\"],​\n \"filter\": \"varchar_field1 == \\\"Product A\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.2364331,\"id\":1,\"varchar_field1\":\"Product A\",\"varchar_field2\":\"High quality product\"}]}​\n\n"],"headingContent":"String Field​","anchorList":[{"label":"字串欄位","href":"String-Field​","type":1,"isActive":false},{"label":"新增 VARCHAR 欄位","href":"Add-VARCHAR-field​","type":2,"isActive":false},{"label":"設定索引參數","href":"Set-index-params​","type":2,"isActive":false},{"label":"建立集合","href":"Create-collection​","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data​","type":2,"isActive":false},{"label":"搜尋和查詢","href":"Search-and-query​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/string.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/string.md new file mode 100644 index 000000000..c77b780ef --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/string.md @@ -0,0 +1,556 @@ +--- +id: string.md +title: 字串欄位 +summary: >- + 在 Milvus 中,VARCHAR 是用來儲存字串類型資料的資料類型,適合儲存長度可變的字串。它可以儲存單字節和多字節字元的字串,最大長度可達 + 65,535 個字元。定義 VARCHAR 欄位時,必須同時指定最大長度參數 max_length。VARCHAR + 字串類型提供了一種有效且靈活的方式來儲存和管理文字資料,非常適合處理不同長度字串的應用程式。 +--- +

    字串欄位

    在 Milvus 中,VARCHAR 是用來儲存字串類型資料的資料類型,適合儲存長度可變的字串。它可以儲存單字節和多字節字元的字串,最大長度可達 65,535 個字元。定義VARCHAR 欄位時,必須同時指定最大長度參數max_lengthVARCHAR 字串類型提供了一種有效且靈活的方式來儲存和管理文字資料,非常適合處理不同長度字串的應用程式。

    +

    新增 VARCHAR 欄位

    要在 Milvus 中使用字串資料,請在建立集合時定義VARCHAR 欄位。這個過程包括

    +
      +
    1. datatype 設定為支援的字串資料類型,即VARCHAR

    2. +
    3. 使用max_length 參數指定字串類型的最大長度,不能超過 60,535 個字元。

    4. +
    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +# define schema​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="varchar_field1", datatype=DataType.VARCHAR, max_length=100)​
    +schema.add_field(field_name="varchar_field2", datatype=DataType.VARCHAR, max_length=200)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field1")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(100)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("varchar_field2")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(200)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "varchar_field2",​
    +    data_type: DataType.VarChar,​
    +    max_length: 200,​
    +  },​
    +  {​
    +    name: "varchar_field1",​
    +    data_type: DataType.VarChar,​
    +    max_length: 100,​
    +  },​
    +];​
    +
    +
    +
    export varcharField1='{​
    +    "fieldName": "varchar_field1",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 100​
    +    }​
    +}'​
    +​
    +export varcharField2='{​
    +    "fieldName": "varchar_field2",​
    +    "dataType": "VarChar",​
    +    "elementTypeParams": {​
    +        "max_length": 200​
    +    }​
    +}'​
    +​
    +export primaryField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $varcharField1,​
    +        $varcharField2,​
    +        $primaryField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    在本範例中,我們新增兩個VARCHAR 欄位:varchar_field1varchar_field2 ,最大長度分別設定為 100 和 200 個字元。建議根據您的資料特性設定max_length ,以確保它能容納最長的資料,同時避免過多的空間分配。此外,我們新增了一個主要欄位pk 和一個向量欄位embedding

    +
    +

    當您建立一個集合時,主欄位和向量欄位是必須的。Primary 欄位唯一識別每個實體,而向量欄位對相似性搜尋至關重要。如需詳細資訊,請參閱Primary Field & AutoIDDense VectorBinary VectorSparse Vector

    +
    +

    設定索引參數

    VARCHAR 欄位設定索引參數是可選的,但可以大幅提高檢索效率。

    +

    在下面的範例中,我們為varchar_field1 建立AUTOINDEX ,意思是 Milvus 會根據資料類型自動建立適當的索引。如需詳細資訊,請參閱AUTOINDEX

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="varchar_field1",​
    +    index_type="AUTOINDEX",​
    +    index_name="varchar_index"​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("varchar_field1")​
    +        .indexName("varchar_index")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .build());​
    +
    +
    +
    const indexParams = [{​
    +    index_name: 'varchar_index',​
    +    field_name: 'varchar_field1',​
    +    index_type: IndexType.AUTOINDEX,​
    +)];​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    除了AUTOINDEX 之外,您還可以指定其他標量索引類型,例如INVERTEDBITMAP 。有關支援的索引類型,請參閱標量索引

    +

    此外,在建立集合之前,您必須為向量欄位建立索引。在本範例中,我們使用AUTOINDEX 來簡化向量索引的設定。

    + +
    # Add vector index​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",  # Use automatic indexing to simplify complex index settings​
    +    metric_type="COSINE"  # Specify similarity metric type, options include L2, COSINE, or IP​
    +)​
    +
    +
    +
    indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    indexParams.push({​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metric_type: MetricType.COSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +});​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "varchar_field1",​
    +            "indexName": "varchar_index",​
    +            "indexType": "AUTOINDEX"​
    +        },​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    建立集合

    定義模式和索引後,您就可以建立包含字串欄位的集合。

    + +
    # Create Collection​
    +client.create_collection(​
    +    collection_name="your_collection_name",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_varchar_collection",​
    +    schema: schema,​
    +    index_params: index_params​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_varchar_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +## {"code":0,"data":{}}​
    +
    +
    +

    插入資料

    建立資料集後,您可以插入包含字串欄位的資料。

    + +
    data = [​
    +    {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]},​
    +]​
    +​
    +client.insert(​
    +    collection_name="my_varchar_collection",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product A\", \"varchar_field2\": \"High quality product\", \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product B\", \"varchar_field2\": \"Affordable price\", \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"varchar_field1\": \"Product C\", \"varchar_field2\": \"Best seller\", \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +    varchar_field1: "Product A",​
    +    varchar_field2: "High quality product",​
    +    pk: 1,​
    +    embedding: [0.1, 0.2, 0.3],​
    +  },​
    +  {​
    +    varchar_field1: "Product B",​
    +    varchar_field2: "Affordable price",​
    +    pk: 2,​
    +    embedding: [0.4, 0.5, 0.6],​
    +  },​
    +  {​
    +    varchar_field1: "Product C",​
    +    varchar_field2: "Best seller",​
    +    pk: 3,​
    +    embedding: [0.7, 0.8, 0.9],​
    +  },​
    +];​
    +client.insert({​
    +  collection_name: "my_sparse_collection",​
    +  data: data,​
    +});​
    +​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"varchar_field1": "Product A", "varchar_field2": "High quality product", "pk": 1, "embedding": [0.1, 0.2, 0.3]},​
    +    {"varchar_field1": "Product B", "varchar_field2": "Affordable price", "pk": 2, "embedding": [0.4, 0.5, 0.6]},​
    +    {"varchar_field1": "Product C", "varchar_field2": "Best seller", "pk": 3, "embedding": [0.7, 0.8, 0.9]}       ​
    +    ],​
    +    "collectionName": "my_varchar_collection"​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":{"insertCount":3,"insertIds":[1,2,3]}}​
    +
    +
    +

    在這個範例中,我們插入的資料包含VARCHAR 欄位 (varchar_field1varchar_field2)、主欄位 (pk) 和向量表示 (embedding)。為確保插入的資料與模式中定義的欄位相符,建議事先檢查資料類型,以避免插入錯誤。

    +

    如果您在定義模式時設定enable_dynamic_fields=True ,Milvus 允許您插入未事先定義的字串欄位。但是,請記住這可能會增加查詢和管理的複雜性,有可能影響性能。如需詳細資訊,請參閱動態欄位

    +

    搜尋和查詢

    新增字串欄位後,您可以在搜尋和查詢操作中使用它們進行篩選,達到更精確的搜尋結果。

    +

    篩選查詢

    新增字串欄位後,您可以在查詢中使用這些欄位篩選結果。例如,您可以查詢varchar_field1 等於"Product A" 的所有實體。

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.query(​
    +    collection_name="my_varchar_collection",​
    +    filter=filter,​
    +    output_fields=["varchar_field1", "varchar_field2"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'varchar_field1': 'Product A', 'varchar_field2': 'High quality product', 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .filter(filter)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={varchar_field1=Product A, varchar_field2=High quality product, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_varchar_collection',​
    +    filter: 'varchar_field1 == "Product A"',​
    +    output_fields: ['varchar_field1', 'varchar_field2']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "filter": "varchar_field1 == \"Product A\"",​
    +    "outputFields": ["varchar_field1", "varchar_field2"]​
    +}'​
    +## {"code":0,"cost":0,"data":[{"pk":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    這個查詢表達式會返回所有符合條件的實體,並輸出它們的varchar_field1varchar_field2 欄位。有關過濾查詢的詳細資訊,請參閱元資料過濾

    +

    使用字串篩選的向量搜尋

    除了基本的標量字段篩選外,您還可以結合向量相似性搜尋與標量字段篩選。例如,以下程式碼顯示如何在向量搜尋中加入標量欄位篩選器。

    + +
    filter = 'varchar_field1 == "Product A"'​
    +​
    +res = client.search(​
    +    collection_name="my_varchar_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["varchar_field1", "varchar_field2"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.06000000238418579, 'entity': {'varchar_field1': 'Product A', 'varchar_field2': 'High quality product'}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "varchar_field1 == \"Product A\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_varchar_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Arrays.asList("varchar_field1", "varchar_field2"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={varchar_field1=Product A, varchar_field2=High quality product}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_varchar_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['varchar_field1', 'varchar_field2'],​
    +    filter: 'varchar_field1 == "Product A"'​
    +    params: {​
    +       nprobe:10​
    +    }​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_varchar_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["varchar_field1", "varchar_field2"],​
    +    "filter": "varchar_field1 == \"Product A\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.2364331,"id":1,"varchar_field1":"Product A","varchar_field2":"High quality product"}]}​
    +
    +
    +

    在這個範例中,我們首先定義一個查詢向量,並在搜尋過程中加入篩選條件varchar_field1 == "Product A" 。這可確保搜尋結果不僅與查詢向量相似,也符合指定的字串篩選條件。如需詳細資訊,請參閱Metadata 過濾

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.json b/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.json new file mode 100644 index 000000000..b23f4b0bf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.json @@ -0,0 +1 @@ +{"codeList":["{​\n \"category\": \"electronics\",​\n \"price\": 99.99,​\n \"brand\": \"BrandA\"​\n}​\n\n","from pymilvus import MilvusClient, DataType​\n​\nclient = MilvusClient(uri=\"http://localhost:19530\")​\n​\nschema = client.create_schema(​\n auto_id=False,​\n enable_dynamic_fields=True,​\n)​\n​\nschema.add_field(field_name=\"metadata\", datatype=DataType.JSON)​\nschema.add_field(field_name=\"pk\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=3)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .build());​\n ​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.setEnableDynamicField(true);​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"metadata\")​\n .dataType(DataType.JSON)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"pk\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"embedding\")​\n .dataType(DataType.FloatVector)​\n .dimension(3)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\nconst schema = [​\n {​\n name: \"metadata\",​\n data_type: DataType.JSON,​\n },​\n {​\n name: \"pk\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n },​\n {​\n name: \"embedding\",​\n data_type: DataType.FloatVector,​\n dim: 3,​\n },​\n];​\n\n","export jsonField='{​\n \"fieldName\": \"metadata\",​\n \"dataType\": \"JSON\"​\n}'​\n​\nexport pkField='{​\n \"fieldName\": \"pk\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n}'​\n​\nexport vectorField='{​\n \"fieldName\": \"embedding\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": 3​\n }​\n}'​\n​\nexport schema=\"{​\n \\\"autoID\\\": false,​\n \\\"fields\\\": [​\n $jsonField,​\n $pkField,​\n $vectorField​\n ]​\n}\"​\n\n","​\nindex_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"embedding\",​\n index_type=\"AUTOINDEX\",​\n metric_type=\"COSINE\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nList indexes = new ArrayList<>();​\nindexes.add(IndexParam.builder()​\n .fieldName(\"embedding\")​\n .indexType(IndexParam.IndexType.AUTOINDEX)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","const indexParams = {​\n index_name: 'embedding_index',​\n field_name: 'embedding',​\n metricType: MetricType.CONSINE,​\n index_type: IndexType.AUTOINDEX,​\n);​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"embedding\",​\n \"metricType\": \"COSINE\",​\n \"indexType\": \"AUTOINDEX\"​\n }​\n ]'​\n\n","client.create_collection(​\n collection_name=\"my_json_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq requestCreate = CreateCollectionReq.builder()​\n .collectionName(\"my_json_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexes)​\n .build();​\nclient.createCollection(requestCreate);​\n\n","client.create_collection({​\n collection_name: \"my_json_collection\",​\n schema: schema,​\n index_params: indexParams​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_json_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","# Data to be inserted​\ndata = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\n# Insert data into the collection​\nclient.insert(​\n collection_name=\"your_collection_name\",​\n data=data​\n)​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\n​\nimport io.milvus.v2.service.vector.request.InsertReq;​\nimport io.milvus.v2.service.vector.response.InsertResp;​\n​\nList rows = new ArrayList<>();​\nGson gson = new Gson();​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}, \\\"pk\\\": 1, \\\"embedding\\\": [0.1, 0.2, 0.3]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"home_appliances\\\", \\\"price\\\": 249.99, \\\"brand\\\": \\\"BrandB\\\"}, \\\"pk\\\": 2, \\\"embedding\\\": [0.4, 0.5, 0.6]}\", JsonObject.class));​\nrows.add(gson.fromJson(\"{\\\"metadata\\\": {\\\"category\\\": \\\"furniture\\\", \\\"price\\\": 399.99, \\\"brand\\\": \\\"BrandC\\\"}, \\\"pk\\\": 3, \\\"embedding\\\": [0.7, 0.8, 0.9]}\", JsonObject.class));​\n​\nInsertResp insertR = client.insert(InsertReq.builder()​\n .collectionName(\"my_json_collection\")​\n .data(rows)​\n .build());​\n\n","const data = [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n }​\n]​\n​\nclient.insert({​\n collection_name: \"my_json_collection\",​\n data: data​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {​\n \"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"},​\n \"pk\": 1,​\n \"embedding\": [0.12, 0.34, 0.56]​\n },​\n {​\n \"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"},​\n \"pk\": 2,​\n \"embedding\": [0.56, 0.78, 0.90]​\n },​\n {​\n \"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"},​\n \"pk\": 3,​\n \"embedding\": [0.91, 0.18, 0.23]​\n } ​\n ],​\n \"collectionName\": \"my_json_collection\"​\n}'​\n\n","filter = 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150'​\n​\nres = client.query(​\n collection_name=\"my_json_collection\",​\n filter=filter,​\n output_fields=[\"metadata\"]​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}\"] ​\n\n","import io.milvus.v2.service.vector.request.QueryReq;​\nimport io.milvus.v2.service.vector.response.QueryResp;​\n​\nString filter = \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\";​\nQueryResp resp = client.query(QueryReq.builder()​\n .collectionName(\"my_json_collection\")​\n .filter(filter)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .build());​\n​\nSystem.out.println(resp.getQueryResults());​\n​\n// Output​\n//​\n// [QueryResp.QueryResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}, pk=1})]​\n\n","client.query({​\n collection_name: 'my_scalar_collection',​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n output_fields: ['metadata']​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"filter\": \"metadata[\\\"category\\\"] == \\\"electronics\\\" and metadata[\\\"price\\\"] < 150\",​\n \"outputFields\": [\"metadata\"]​\n}'​\n{\"code\":0,\"cost\":0,\"data\":[{\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\",\"pk\":1}]}​\n\n","filter = 'metadata[\"brand\"] == \"BrandA\"'​\n​\nres = client.search(​\n collection_name=\"my_json_collection\",​\n data=[[0.3, -0.6, 0.1]],​\n limit=5,​\n search_params={\"params\": {\"nprobe\": 10}},​\n output_fields=[\"metadata\"],​\n filter=filter​\n)​\n​\nprint(res)​\n​\n# Output​\n# data: [\"[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]\"] ​\n\n","import io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nString filter = \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\";​\nSearchResp resp = client.search(SearchReq.builder()​\n .collectionName(\"my_json_collection\")​\n .annsField(\"embedding\")​\n .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​\n .topK(5)​\n .outputFields(Collections.singletonList(\"metadata\"))​\n .filter(filter)​\n .build());​\n​\nSystem.out.println(resp.getSearchResults());​\n​\n// Output​\n//​\n// [[SearchResp.SearchResult(entity={metadata={\"category\":\"electronics\",\"price\":99.99,\"brand\":\"BrandA\"}}, score=-0.2364331, id=1)]]​\n\n","client.search({​\n collection_name: 'my_json_collection',​\n data: [0.3, -0.6, 0.1],​\n limit: 5,​\n output_fields: ['metadata'],​\n filter: 'metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150',​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_json_collection\",​\n \"data\": [​\n [0.3, -0.6, 0.1]​\n ],​\n \"annsField\": \"embedding\",​\n \"limit\": 5,​\n \"searchParams\":{​\n \"params\":{\"nprobe\":10}​\n },​\n \"outputFields\": [\"metadata\"],​\n \"filter\": \"metadata[\\\"brand\\\"] == \\\"BrandA\\\"\"​\n}'​\n​\n## {\"code\":0,\"cost\":0,\"data\":[{\"distance\":-0.24793813,\"id\":1,\"metadata\":\"{\\\"category\\\": \\\"electronics\\\", \\\"price\\\": 99.99, \\\"brand\\\": \\\"BrandA\\\"}\"}]}​\n\n"],"headingContent":"JSON Field​","anchorList":[{"label":"JSON 欄位","href":"JSON-Field​","type":1,"isActive":false},{"label":"新增 JSON 欄位","href":"Add-JSON-field​","type":2,"isActive":false},{"label":"建立集合","href":"Create-collection​","type":2,"isActive":false},{"label":"插入資料","href":"Insert-data​","type":2,"isActive":false},{"label":"搜尋與查詢","href":"Search-and-query​","type":2,"isActive":false},{"label":"限制","href":"Limits​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.md b/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.md new file mode 100644 index 000000000..1d81a89da --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/schema/use-json-fields.md @@ -0,0 +1,521 @@ +--- +id: use-json-fields.md +title: 使用 JSON 欄位 +summary: >- + JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式,可提供靈活的方式來儲存和查詢複雜的資料結構。在 Milvus + 中,您可以使用 JSON 欄位將額外的結構化資訊與向量資料一起儲存,以實現結合向量相似性與結構化過濾的進階搜尋與查詢。 +--- +

    JSON 欄位

    JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,可提供靈活的方式來儲存和查詢複雜的資料結構。在 Milvus 中,您可以使用 JSON 欄位將額外的結構化資訊與向量資料一起儲存,以實現結合向量相似性與結構化過濾的進階搜尋與查詢。

    +

    JSON 欄位是需要元資料來優化檢索結果的應用程式的理想選擇。例如,在電子商務中,產品向量可以透過類別、價格和品牌等屬性來增強。在推薦系統中,使用者向量可以結合偏好和人口統計資訊。以下是典型 JSON 欄位的範例。

    +
    {​
    +  "category": "electronics",​
    +  "price": 99.99,​
    +  "brand": "BrandA"​
    +}​
    +
    +
    +

    新增 JSON 欄位

    要在 Milvus 中使用 JSON 欄位,請在集合模式中定義相關的欄位類型,將datatype 設定為支援的 JSON 類型,即JSON

    +

    以下是如何定義包含 JSON 欄位的集合模式。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +client = MilvusClient(uri="http://localhost:19530")​
    +​
    +schema = client.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_fields=True,​
    +)​
    +​
    +schema.add_field(field_name="metadata", datatype=DataType.JSON)​
    +schema.add_field(field_name="pk", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=3)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .build());​
    +        ​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.setEnableDynamicField(true);​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("metadata")​
    +        .dataType(DataType.JSON)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("pk")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("embedding")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(3)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +const schema = [​
    +  {​
    +    name: "metadata",​
    +    data_type: DataType.JSON,​
    +  },​
    +  {​
    +    name: "pk",​
    +    data_type: DataType.Int64,​
    +    is_primary_key: true,​
    +  },​
    +  {​
    +    name: "embedding",​
    +    data_type: DataType.FloatVector,​
    +    dim: 3,​
    +  },​
    +];​
    +
    +
    +
    export jsonField='{​
    +    "fieldName": "metadata",​
    +    "dataType": "JSON"​
    +}'​
    +​
    +export pkField='{​
    +    "fieldName": "pk",​
    +    "dataType": "Int64",​
    +    "isPrimary": true​
    +}'​
    +​
    +export vectorField='{​
    +    "fieldName": "embedding",​
    +    "dataType": "FloatVector",​
    +    "elementTypeParams": {​
    +        "dim": 3​
    +    }​
    +}'​
    +​
    +export schema="{​
    +    \"autoID\": false,​
    +    \"fields\": [​
    +        $jsonField,​
    +        $pkField,​
    +        $vectorField​
    +    ]​
    +}"​
    +
    +
    +

    在這個範例中,我們新增一個名為metadata 的 JSON 欄位,以儲存與向量資料相關的附加元資料,例如產品類別、價格和品牌資訊。

    +
    +

    當您建立一個集合時,主欄位和向量欄位是必須的。Primary 欄位可唯一識別每個實體,而向量欄位對相似性搜尋至關重要。如需詳細資訊,請參閱Primary Field & AutoIDDense VectorBinary VectorSparse Vector

    +
    +

    建立集合

    建立集合時,您必須為向量欄位建立索引,以確保擷取效能。在本範例中,我們使用AUTOINDEX 來簡化索引設定。如需詳細資訊,請參閱AUTOINDEX

    + +
    ​
    +index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="embedding",​
    +    index_type="AUTOINDEX",​
    +    metric_type="COSINE"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +List<IndexParam> indexes = new ArrayList<>();​
    +indexes.add(IndexParam.builder()​
    +        .fieldName("embedding")​
    +        .indexType(IndexParam.IndexType.AUTOINDEX)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +
    const indexParams = {​
    +    index_name: 'embedding_index',​
    +    field_name: 'embedding',​
    +    metricType: MetricType.CONSINE,​
    +    index_type: IndexType.AUTOINDEX,​
    +);​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "embedding",​
    +            "metricType": "COSINE",​
    +            "indexType": "AUTOINDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    使用已定義的模式和索引參數建立集合。

    + +
    client.create_collection(​
    +    collection_name="my_json_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq requestCreate = CreateCollectionReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexes)​
    +        .build();​
    +client.createCollection(requestCreate);​
    +
    +
    +
    client.create_collection({​
    +    collection_name: "my_json_collection",​
    +    schema: schema,​
    +    index_params: indexParams​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_json_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    建立資料集後,您可以插入包含 JSON 欄位的資料。

    + +
    # Data to be inserted​
    +data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +# Insert data into the collection​
    +client.insert(​
    +    collection_name="your_collection_name",​
    +    data=data​
    +)​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +import io.milvus.v2.service.vector.response.InsertResp;​
    +​
    +List<JsonObject> rows = new ArrayList<>();​
    +Gson gson = new Gson();​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}, \"pk\": 1, \"embedding\": [0.1, 0.2, 0.3]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"home_appliances\", \"price\": 249.99, \"brand\": \"BrandB\"}, \"pk\": 2, \"embedding\": [0.4, 0.5, 0.6]}", JsonObject.class));​
    +rows.add(gson.fromJson("{\"metadata\": {\"category\": \"furniture\", \"price\": 399.99, \"brand\": \"BrandC\"}, \"pk\": 3, \"embedding\": [0.7, 0.8, 0.9]}", JsonObject.class));​
    +​
    +InsertResp insertR = client.insert(InsertReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .data(rows)​
    +        .build());​
    +
    +
    +
    const data = [​
    +  {​
    +      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +      "pk": 1,​
    +      "embedding": [0.12, 0.34, 0.56]​
    +  },​
    +  {​
    +      "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +      "pk": 2,​
    +      "embedding": [0.56, 0.78, 0.90]​
    +  },​
    +  {​
    +      "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +      "pk": 3,​
    +      "embedding": [0.91, 0.18, 0.23]​
    +  }​
    +]​
    +​
    +client.insert({​
    +    collection_name: "my_json_collection",​
    +    data: data​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {​
    +            "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},​
    +            "pk": 1,​
    +            "embedding": [0.12, 0.34, 0.56]​
    +        },​
    +        {​
    +            "metadata": {"category": "home_appliances", "price": 249.99, "brand": "BrandB"},​
    +            "pk": 2,​
    +            "embedding": [0.56, 0.78, 0.90]​
    +        },​
    +        {​
    +            "metadata": {"category": "furniture", "price": 399.99, "brand": "BrandC"},​
    +            "pk": 3,​
    +            "embedding": [0.91, 0.18, 0.23]​
    +        }       ​
    +    ],​
    +    "collectionName": "my_json_collection"​
    +}'​
    +
    +
    +

    在這個範例中。

    +
      +
    • 每個資料項目包含一個主要欄位 (pk),metadata 為 JSON 欄位,用來儲存產品類別、價格和品牌等資訊。

    • +
    • embedding 是三維向量欄位,用於向量相似性搜尋。

    • +
    +

    搜尋與查詢

    JSON 欄位允許在搜尋過程中進行標量篩選,增強了 Milvus 的向量搜尋功能。您可以根據 JSON 屬性與向量相似性進行查詢。

    +

    篩選查詢

    您可以根據 JSON 屬性篩選資料,例如匹配特定值或檢查數字是否在特定範圍內。

    + +
    filter = 'metadata["category"] == "electronics" and metadata["price"] < 150'​
    +​
    +res = client.query(​
    +    collection_name="my_json_collection",​
    +    filter=filter,​
    +    output_fields=["metadata"]​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.QueryReq;​
    +import io.milvus.v2.service.vector.response.QueryResp;​
    +​
    +String filter = "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150";​
    +QueryResp resp = client.query(QueryReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .filter(filter)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .build());​
    +​
    +System.out.println(resp.getQueryResults());​
    +​
    +// Output​
    +//​
    +// [QueryResp.QueryResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}, pk=1})]​
    +
    +
    +
    client.query({​
    +    collection_name: 'my_scalar_collection',​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +    output_fields: ['metadata']​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "filter": "metadata[\"category\"] == \"electronics\" and metadata[\"price\"] < 150",​
    +    "outputFields": ["metadata"]​
    +}'​
    +{"code":0,"cost":0,"data":[{"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}","pk":1}]}​
    +
    +
    +

    在上述查詢中,Milvus 篩選出metadata 欄位的類別為"electronics" 且價格低於 150 的實體,並傳回符合這些條件的實體。

    +

    向量搜尋與 JSON 過濾

    透過結合向量相似性與 JSON 過濾功能,您可以確保擷取的資料不僅在語意上相符,同時也符合特定的業務條件,讓搜尋結果更精確、更符合使用者需求。

    + +
    filter = 'metadata["brand"] == "BrandA"'​
    +​
    +res = client.search(​
    +    collection_name="my_json_collection",​
    +    data=[[0.3, -0.6, 0.1]],​
    +    limit=5,​
    +    search_params={"params": {"nprobe": 10}},​
    +    output_fields=["metadata"],​
    +    filter=filter​
    +)​
    +​
    +print(res)​
    +​
    +# Output​
    +# data: ["[{'id': 1, 'distance': -0.2479381263256073, 'entity': {'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}}}]"] ​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +String filter = "metadata[\"brand\"] == \"BrandA\"";​
    +SearchResp resp = client.search(SearchReq.builder()​
    +        .collectionName("my_json_collection")​
    +        .annsField("embedding")​
    +        .data(Collections.singletonList(new FloatVec(new float[]{0.3f, -0.6f, 0.1f})))​
    +        .topK(5)​
    +        .outputFields(Collections.singletonList("metadata"))​
    +        .filter(filter)​
    +        .build());​
    +​
    +System.out.println(resp.getSearchResults());​
    +​
    +// Output​
    +//​
    +// [[SearchResp.SearchResult(entity={metadata={"category":"electronics","price":99.99,"brand":"BrandA"}}, score=-0.2364331, id=1)]]​
    +
    +
    +
    client.search({​
    +    collection_name: 'my_json_collection',​
    +    data: [0.3, -0.6, 0.1],​
    +    limit: 5,​
    +    output_fields: ['metadata'],​
    +    filter: 'metadata["category"] == "electronics" and metadata["price"] < 150',​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_json_collection",​
    +    "data": [​
    +        [0.3, -0.6, 0.1]​
    +    ],​
    +    "annsField": "embedding",​
    +    "limit": 5,​
    +    "searchParams":{​
    +        "params":{"nprobe":10}​
    +    },​
    +    "outputFields": ["metadata"],​
    +    "filter": "metadata[\"brand\"] == \"BrandA\""​
    +}'​
    +​
    +## {"code":0,"cost":0,"data":[{"distance":-0.24793813,"id":1,"metadata":"{\"category\": \"electronics\", \"price\": 99.99, \"brand\": \"BrandA\"}"}]}​
    +
    +
    +

    在這個範例中,Milvus 返回與查詢向量最相似的前 5 個實體,其中metadata 欄位包含一個品牌"BrandA"

    +

    此外,Milvus 支援進階的 JSON 過濾運算元,例如JSON_CONTAINS,JSON_CONTAINS_ALL, 和JSON_CONTAINS_ANY ,可以進一步增強查詢能力。如需詳細資訊,請參閱元資料過濾

    +

    限制

      +
    • 索引限制:由於資料結構的複雜性,不支援 JSON 欄位的索引。

    • +
    • 資料類型比對:如果 JSON 欄位的關鍵值是整數或浮點,則只能與其他整數或浮點關鍵值或INT32/64FLOAT32/64 欄位進行比對。如果關鍵值是字串 (VARCHAR),則只能與另一個字串關鍵值比較。

    • +
    • 命名限制:命名 JSON 鍵時,建議只使用字母、數字字元和底線,因為其他字元可能會在過濾或搜尋時造成問題。

    • +
    • 處理字串值:對於字串值 (VARCHAR),Milvus 會以原樣儲存 JSON 字段字串,而不進行語意轉換。例如'a"b',"a'b",'a\\'b', 和"a\\"b" 會以輸入的方式儲存;但是,'a'b'"a"b" 會被視為無效。

    • +
    • 處理巢狀字典:JSON 欄位值內的任何巢狀字典都會視為字串。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.json new file mode 100644 index 000000000..cd89d4cf0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​\n\n","filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​\n\n","filter = 'ARRAY_LENGTH(history_temperatures) < 10'​\n\n"],"headingContent":"ARRAY Operators​","anchorList":[{"label":"陣列運算元","href":"ARRAY-Operators​","type":1,"isActive":false},{"label":"可用的 ARRAY 運算符","href":"Available-ARRAY-Operators​","type":2,"isActive":false},{"label":"ARRAY_CONTAINS","href":"ARRAYCONTAINS​","type":2,"isActive":false},{"label":"array_contains_all","href":"ARRAYCONTAINSALL​","type":2,"isActive":false},{"label":"array_contains_any","href":"ARRAYCONTAINSANY​","type":2,"isActive":false},{"label":"ARRAY_LENGTH","href":"ARRAYLENGTH​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.md new file mode 100644 index 000000000..7220ddd4d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/array-operators.md @@ -0,0 +1,134 @@ +--- +id: array-operators.md +summary: Milvus 提供強大的操作員來查詢陣列欄位,讓您可以根據陣列的內容來過濾和擷取實體。 +title: 陣列運算元 +--- +

    陣列運算元

    Milvus 提供強大的運算符號來查詢陣列欄位,允許您根據陣列的內容來過濾和擷取實體。

    +
    +

    陣列中的所有元素必須是相同的類型,陣列中的巢狀結構會被視為普通字串。因此,在處理 ARRAY 欄位時,建議避免過深的巢狀結構,並確保資料結構盡可能扁平化,以獲得最佳效能。

    +
    +

    可用的 ARRAY 運算符

    ARRAY 運算符允許在 Milvus 中細緻地查詢陣列欄位。這些運算符有

    + +

    ARRAY_CONTAINS

    ARRAY_CONTAINS 運算符號檢查陣列欄位中是否存在特定元素。當您要尋找陣列中存在指定元素的實體時,它非常有用。

    +

    範例

    +

    假設您有一個陣列欄位history_temperatures ,它包含不同年份的最低溫度記錄。若要尋找陣列包含值23 的所有實體,您可以使用下列篩選表達式。

    +
    filter = 'ARRAY_CONTAINS(history_temperatures, 23)'​
    +
    +
    +

    這將會返回history_temperatures 陣列包含23 值的所有實體。

    +

    array_contains_all

    ARRAY_CONTAINS_ALL 運算符確保指定清單的所有元素都存在於陣列欄位中。當您要匹配陣列中包含多個值的實體時,此運算符非常有用。

    +

    範例

    +

    如果要查找history_temperatures 陣列中同時包含2324 的所有實體,可以使用。

    +
    filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'​
    +
    +
    +

    這將會回傳history_temperatures 陣列中包含兩個指定值的所有實體。

    +

    array_contains_any

    ARRAY_CONTAINS_ANY 運算符檢查指定清單中的任何元素是否出現在陣列欄位中。當您要匹配陣列中至少包含一個指定值的實體時,此運算非常有用。

    +

    範例

    +

    要查找history_temperatures 陣列包含2324 的所有實體,您可以使用。

    +
    filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'​
    +
    +
    +

    這將會返回history_temperatures 陣列至少包含2324 其中一個值的所有實體。

    +

    ARRAY_LENGTH

    ARRAY_LENGTH 運算符允許您根據陣列欄位中元素的數量過濾實體。當您需要尋找具有特定長度陣列的實體時,此操作會非常有用。

    +

    範例

    +

    如果您要尋找history_temperatures 陣列元素少於 10 個的所有實體,您可以使用.

    +
    filter = 'ARRAY_LENGTH(history_temperatures) < 10'​
    +
    +
    +

    這將會返回history_temperatures 陣列元素少於 10 的所有實體。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.json new file mode 100644 index 000000000..16f4cf118 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.json @@ -0,0 +1 @@ +{"codeList":["filter = 'status == \"active\"'​\n\n","filter = 'status != \"inactive\"'​\n\n","filter = 'age > 30'​\n\n","filter = 'price < 100'​\n\n","filter = 'rating >= 4'​\n\n","filter = 'discount <= 10'​\n\n","filter = 'color in [\"red\", \"green\", \"blue\"]'​\n\n","filter = 'name LIKE \"Prod%\"'​\n\n","filter = 'name LIKE \"%XYZ\"'​\n\n","filter = 'name LIKE \"%Pro%\"'​\n\n","filter = 'total == base_price + tax'​\n\n","filter = 'quantity - quantity_sold > 50'​\n\n","filter = 'price * quantity > 1000'​\n\n","filter = 'total_price / quantity < 50'​\n\n","filter = 'id % 2 == 0'​\n\n","filter = 'price ** 2 > 1000'​\n\n","filter = 'price > 100 AND stock > 50'​\n\n","filter = 'color == \"red\" OR color == \"blue\"'​\n\n","filter = 'NOT color == \"green\"'​\n\n","filter = 'product[\"price\"] > 1000'​\n\n","filter = 'history_temperatures[0] > 30'​\n\n"],"headingContent":"Basic Operators​","anchorList":[{"label":"基本運算符號","href":"Basic-Operators​","type":1,"isActive":false},{"label":"比較運算符號","href":"Comparison-operators​","type":2,"isActive":false},{"label":"範圍運算符號","href":"Range-operators​","type":2,"isActive":false},{"label":"算術運算符號","href":"Arithmetic-Operators​","type":2,"isActive":false},{"label":"邏輯運算符號","href":"Logical-Operators​","type":2,"isActive":false},{"label":"在 JSON 和 ARRAY 字段中使用基本運算符的提示","href":"Tips-on-Using-Basic-Operators-with-JSON-and-ARRAY-Fields​","type":2,"isActive":false},{"label":"結論","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.md new file mode 100644 index 000000000..e11a3e5f9 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/basic-operators.md @@ -0,0 +1,233 @@ +--- +id: basic-operators.md +summary: >- + Milvus + 提供豐富的基本運算符號,幫助您有效地過濾和查詢資料。這些運算符允許您根據標量字段、數值計算、邏輯條件等細化搜尋條件。瞭解如何使用這些運算符號,對建立精確的查詢和最大化搜尋效率至關重要。 +title: 基本操作員 +--- +

    基本運算符號

    Milvus 提供豐富的基本運算符號,幫助您有效地過濾和查詢資料。這些運算符允許您根據標量字段、數字計算、邏輯條件等細化搜尋條件。了解如何使用這些運算符號,對建立精確的查詢和最大化搜尋效率至關重要。

    +

    比較運算符號

    比較運算符用於根據相等、不相等或大小篩選資料。它們適用於數值、文字和日期欄位。

    +

    支援的比較運算符。

      +
    • == (相等於)

    • +
    • != (不等於)

    • +
    • > (大於)

    • +
    • < (小於)

    • +
    • >= (大於或等於)

    • +
    • <= (小於或等於)

    • +
    +

    範例 1:使用 Equal To 過濾 (==)

    假設您有一個名為status 的欄位,而您想要找出status 為「活躍」的所有實體。您可以使用相等運算符==

    +
    filter = 'status == "active"'​
    +
    +
    +

    範例 2:使用 Not Equal To 過濾 (!=)

    尋找status 不是「非活躍」的實體。

    +
    filter = 'status != "inactive"'​
    +
    +
    +

    範例 3:使用「大於」篩選 (>)

    如果要尋找age 大於 30 的所有實體。

    +
    filter = 'age > 30'​
    +
    +
    +

    範例 4: 使用小於 (<) 過濾

    若要尋找price 小於 100 的實體。

    +
    filter = 'price < 100'​
    +
    +
    +

    範例 5: 過濾大於或等於 (>=)

    若要尋找rating 大於或等於 4 的所有實體。

    +
    filter = 'rating >= 4'​
    +
    +
    +

    範例 6:使用小於或等於 (<=) 過濾

    若要尋找discount 小於或等於 10% 的實體。

    +
    filter = 'discount <= 10'​
    +
    +
    +

    範圍運算符號

    範圍運算符有助於根據特定的值集或範圍篩選資料。

    +

    支援的範圍運算符。

      +
    • IN:用於匹配特定集合或範圍內的值。

    • +
    • LIKE:用於匹配模式 (主要用於文字欄位)。

    • +
    +

    範例 1:使用IN 來匹配多個值

    如果您要尋找color 為「紅」、「綠」或「藍」的所有實體。

    +
    filter = 'color in ["red", "green", "blue"]'​
    +
    +
    +

    當您要檢查一個值清單中的成員身分時,這就很有用。

    +

    範例 2:使用LIKE 進行模式匹配

    LIKE 運算符號用於字串欄位中的模式匹配。它可以匹配文本中不同位置的子串:前綴後綴後綴LIKE 運算符號使用% 符號作為通配符,可以匹配任何數量的字元(包括 0)。

    +

    前綴匹配(從開始

    若要執行前綴匹配,即字串以指定的模式開始,您可以將模式放在開頭,並使用% 來匹配其後的任何字元。例如,搜尋name 以「Prod」開頭的所有產品。

    +
    filter = 'name LIKE "Prod%"'​
    +
    +
    +

    這將匹配任何名稱以 "Prod 「開頭的產品,例如 」Product A"、"Product B "等。

    +

    後綴匹配 (結尾為)

    對於後綴匹配,如果字串以指定的樣式結束,請將% 符號放在樣式的開頭。例如,搜尋name 以「XYZ」結尾的所有產品。

    +
    filter = 'name LIKE "%XYZ"'​
    +
    +
    +

    這將匹配任何名稱以 "XYZ 「結尾的產品,例如 」ProductXYZ"、"SampleXYZ "等。

    +

    下位元匹配 (包含)

    若要執行中位元(infix)匹配,即模式可以出現在字串中的任何位置,您可以將% 符號放在模式的開頭和結尾。例如,要搜尋name 包含「Pro」的所有產品。

    +
    filter = 'name LIKE "%Pro%"'​
    +
    +
    +

    這將匹配任何名稱包含子串「Pro」的產品,例如「Product」、「ProLine」或「SuperPro」。

    +

    算術運算符號

    算術運算符允許您根據涉及數字欄位的計算建立條件。

    +

    支援的算術運算元。

      +
    • + (加法)

    • +
    • - (減法)

    • +
    • * (乘法)

    • +
    • / (除法)

    • +
    • % (模乘)

    • +
    • ** (幂级数)

    • +
    +

    範例 1:使用加法 (+)

    尋找total 價格是base_pricetax 之和的實體。

    +
    filter = 'total == base_price + tax'​
    +
    +
    +

    範例 2:使用減法 (-)

    尋找quantity 大於 50 且quantity_sold 小於 30 的實體。

    +
    filter = 'quantity - quantity_sold > 50'​
    +
    +
    +

    範例 3:使用乘法 (*)

    若要尋找price 大於 100 且quantity 大於 10 的實體,請使用乘法。

    +
    filter = 'price * quantity > 1000'​
    +
    +
    +

    範例 4:使用除法 (/)

    尋找total_price 除以quantity 小於 50 的乘積。

    +
    filter = 'total_price / quantity < 50'​
    +
    +
    +

    範例 5: 使用模數 (%)

    尋找id 是偶數 (即能被 2 整除) 的實體。

    +
    filter = 'id % 2 == 0'​
    +
    +
    +

    例六:使用幂 (**)

    尋找price 升為 2 的幂大於 1000 的實體。

    +
    filter = 'price ** 2 > 1000'​
    +
    +
    +

    邏輯運算符號

    邏輯運算符用來將多重條件結合為更複雜的篩選表達式。這些運算符包括AND,OR, 和NOT

    +

    支援的邏輯運算符。

      +
    • AND:結合必須全為真的多個條件。

    • +
    • OR:組合條件,其中至少有一個條件必須為真。

    • +
    • NOT:否定一個條件。

    • +
    +

    範例 1:使用AND 來合併條件

    查找price 大於 100 且stock 大於 50 的所有產品。

    +
    filter = 'price > 100 AND stock > 50'​
    +
    +
    +

    範例 2:使用OR 來合併條件

    查找color 為「紅色」或「藍色」的所有產品。

    +
    filter = 'color == "red" OR color == "blue"'​
    +
    +
    +

    範例 3:使用NOT 來排除條件

    找出color 不是「綠色」的所有產品。

    +
    filter = 'NOT color == "green"'​
    +
    +
    +

    在 JSON 和 ARRAY 字段中使用基本運算符的提示

    雖然 Milvus 中的基本運算符是多用途的,可以應用於標量欄位,但它們也可以有效地用於 JSON 和 ARRAY 欄位中的鍵和索引。

    +

    例如,如果您有一個product 欄位,其中包含多個鍵值,如price,model, 和tags ,總是直接引用鍵值。

    +
    filter = 'product["price"] > 1000'​
    +
    +
    +

    若要尋找記錄溫度陣列中第一個溫度超過特定值的記錄,請使用。

    +
    filter = 'history_temperatures[0] > 30'​
    +
    +
    +

    結論

    Milvus 提供了一系列基本運算符號,讓您可以靈活地過濾和查詢資料。透過結合比較、範圍、算術和邏輯運算符號,您可以建立強大的篩選表達式,縮小搜尋結果的範圍,並有效率地擷取所需的資料。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.json new file mode 100644 index 000000000..750db26da --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.json @@ -0,0 +1 @@ +{"codeList":["filter='color in [\"red\", \"green\", \"blue\"]'​\n\n","filter='product[\"model\"] == \"JSN-087\" and product[\"price\"] < 1850'​\n\n","filter='history_temperatures[10] > 23'​\n\n","filter = \"age > 25 and city in ['北京', '上海']\"​\n\n","filter = \"age > {age} and city in {city}\",​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter='json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter='json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n","filter=\"ARRAY_CONTAINS(history_temperatures, 23)\"​\n\n","filter=\"ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])\"​\n\n","filter=\"ARRAY_LENGTH(history_temperatures) < 10\"​\n\n"],"headingContent":"Filtering Explained​","anchorList":[{"label":"篩選說明","href":"Filtering-Explained​","type":1,"isActive":false},{"label":"基本運算符號","href":"Basic-operators​","type":2,"isActive":false},{"label":"篩選表達式範本","href":"Filter-expression-templates​","type":2,"isActive":false},{"label":"特定資料類型的運算符號","href":"Data-type-specific-operators​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.md new file mode 100644 index 000000000..58cb32b50 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/boolean.md @@ -0,0 +1,143 @@ +--- +id: boolean.md +summary: >- + Milvus 提供強大的篩選功能,可精確查詢資料。篩選表達式允許您針對特定的標量欄位,以不同的條件精細化搜尋結果。本指南將解釋如何在 Milvus + 中使用篩選表達式,並以查詢作業為重點範例。您也可以在搜尋和刪除請求中套用這些篩選表達式。 +title: 篩選說明 +--- +

    篩選說明

    Milvus 提供強大的篩選功能,使您能夠精確查詢資料。篩選表達式允許您針對特定的標量欄位,使用不同的條件精煉搜尋結果。本指南解釋如何在 Milvus 中使用篩選表達式,並以查詢操作為主。您也可以在搜尋和刪除請求中套用這些篩選條件。

    +

    基本運算符號

    Milvus 支援幾種基本運算符號來篩選資料。

    +
      +
    • 比較運算符==,!=,>,<,>=, 和<= 允許根據數值、文字或日期欄位進行篩選。

    • +
    • 範圍篩選器INLIKE 有助於匹配特定的值範圍或集合。

    • +
    • 算術運算符+,-,*,/,%, 和 `` ` 用於涉及數值欄位的計算。

    • +
    • 邏輯運算符AND,OR, 和NOT 或 '&&'、'||'、'~'、'!' 將多個條件結合成複雜的表達式。

    • +
    +

    範例:依顏色篩選

    若要在標量欄位color 中找出具有三原色(紅色、綠色或藍色)的實體,請使用下列篩選表達式。

    +
    filter='color in ["red", "green", "blue"]'​
    +
    +
    +

    範例:篩選 JSON 欄位

    Milvus 允許在 JSON 欄位中參考鍵。例如,如果您有一個 JSON 欄位product ,其鍵為pricemodel ,並希望找到具有特定型號和價格低於 1,850 的產品,請使用此過濾表達式。

    +
    filter='product["model"] == "JSN-087" and product["price"] < 1850'​
    +
    +
    +

    範例:篩選陣列欄位

    如果您有一個包含溫度記錄的陣列欄位history_temperatures ,並且想要找出第 10 個記錄溫度超過 23°C 的天文台,請使用此表達式。

    +
    filter='history_temperatures[10] > 23'​
    +
    +
    +

    有關這些基本運算符的詳細資訊,請參閱基本運算符

    +

    篩選表達式範本

    使用中日韓字符進行篩選時,由於其字符集較大且編碼存在差異,處理過程可能會更加複雜。這可能會導致效能變慢,尤其是使用IN 運算符時。

    +

    Milvus 引入了篩選表達式模板,以優化處理中日韓字符時的效能。透過將動態值從篩選表達式中分離出來,查詢引擎可以更有效率地處理參數插入。

    +

    範例

    要查找居住在 「北京」(Beijing)或 「上海」(Shanghai)的 25 歲以上的個人,請使用以下模板表達式。

    +
    filter = "age > 25 and city in ['北京', '上海']"​
    +
    +
    +

    為了提高效能,請使用這個帶參數的變體。

    +
    filter = "age > {age} and city in {city}",​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    此方法可減少解析開銷,並提高查詢速度。如需詳細資訊,請參閱篩選模板

    +

    特定資料類型的運算符號

    Milvus 為特定資料類型提供進階過濾運算子,例如 JSON、ARRAY 和 VARCHAR 欄位。

    +

    JSON 特定欄位運算符號

    Milvus 為查詢 JSON 欄位提供進階運算子,可在複雜的 JSON 結構中進行精確過濾。

    +

    JSON_CONTAINS(identifier, jsonExpr):檢查字段中是否存在 JSON 表達式。

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains(tags, "sale")'​
    +
    +
    +

    JSON_CONTAINS_ALL(identifier, jsonExpr):確保 JSON 表達式的所有元素都存在。

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter='json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    JSON_CONTAINS_ANY(identifier, jsonExpr):篩選 JSON 表達式中至少存在一個元素的實體。

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter='json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    有關 JSON 運算符的詳細資訊,請參閱JSON 運算符

    +

    ARRAY 特定欄位運算符號

    Milvus 為陣列欄位提供進階過濾運算符,例如ARRAY_CONTAINS,ARRAY_CONTAINS_ALL,ARRAY_CONTAINS_ANY, 和ARRAY_LENGTH ,可對陣列資料進行精細控制。

    +

    ARRAY_CONTAINS:過濾包含特定元素的實體。

    +
    filter="ARRAY_CONTAINS(history_temperatures, 23)"​
    +
    +
    +

    ARRAY_CONTAINS_ALL:篩選列表中所有元素都存在的實體。

    +
    filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_CONTAINS_ANY:篩選包含清單中任何元素的實體。

    +
    filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"​
    +
    +
    +

    ARRAY_LENGTH:根據陣列的長度進行篩選。

    +
    filter="ARRAY_LENGTH(history_temperatures) < 10"​
    +
    +
    +

    有關陣列運算元的詳細資訊,請參閱ARRAY 運算元

    +

    VARCHAR 特定欄位運算符號

    Text_Match 運算符允許根據特定查詢字詞進行精確的文件檢索。它對於結合標量篩選與向量相似性搜尋的篩選搜尋特別有用。與語意搜尋不同,Text Match 著重於精確的詞彙出現。

    +

    Milvus 使用 Tantivy 來支援倒置索引和基於詞彙的文字搜尋。過程包括

    +
      +
    1. 分析器:對輸入文字進行標記化和處理。

    2. +
    3. 建立索引:建立倒置索引,將唯一的標記對應到文件。

    4. +
    +

    如需詳細資訊,請參閱「文字匹配」。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.json new file mode 100644 index 000000000..a9f710427 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.json @@ -0,0 +1 @@ +{"codeList":["filter = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.search(​\n \"hello_milvus\",​\n vectors[:nq],​\n filter=expr,​\n limit=10,​\n output_fields=[\"age\", \"city\"],​\n search_params={\"metric_type\": \"COSINE\", \"params\": {\"search_list\": 100}},​\n filter_params=filter_params,​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.query(​\n \"hello_milvus\",​\n filter=expr,​\n output_fields=[\"age\", \"city\"],​\n filter_params=filter_params​\n)​\n\n","expr = \"age > {age} AND city IN {city}\"​\nfilter_params = {\"age\": 25, \"city\": [\"北京\", \"上海\"]}​\nres = client.delete(​\n \"hello_milvus\",​\n filter=expr,​\n filter_params=filter_params​\n)​\n\n"],"headingContent":"Filter Templating​","anchorList":[{"label":"篩選器模板","href":"Filter-Templating​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"搜尋作業","href":"Search-Operations​","type":2,"isActive":false},{"label":"查詢操作","href":"Query-Operations​","type":2,"isActive":false},{"label":"刪除操作","href":"Delete-Operations​","type":2,"isActive":false},{"label":"結論","href":"Conclusion​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.md new file mode 100644 index 000000000..3879e8a14 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/filtering-templating.md @@ -0,0 +1,151 @@ +--- +id: filtering-templating.md +summary: >- + 在 Milvus 中,具有眾多元素的複雜篩選表達式,尤其是那些涉及非 ASCII + 字元(如中日韓字符)的篩選表達式,會顯著影響查詢性能。為了解決這個問題,Milvus + 引入了篩選表達式模板化機制,旨在通過減少解析複雜表達式所花的時間來提高效率。本頁說明如何在搜尋、查詢和刪除作業中使用篩選表達式模板。 +title: 過濾模板 +--- +

    篩選器模板

    在 Milvus 中,包含大量元素的複雜篩選表達式,尤其是那些涉及非 ASCII 字符(如中日韓字符)的篩選表達式,會顯著影響查詢性能。為了解決這個問題,Milvus 引入了篩選表達式模板化機制,旨在通過減少解析複雜表達式所花的時間來提高效率。本頁說明在搜尋、查詢和刪除操作中使用篩選表達式模板。

    +

    概述

    篩選表達式範本化允許您使用占位符建立篩選表達式,這些占位符可以在查詢執行時動態地使用值取代。使用模板,您可以避免直接在篩選器中嵌入大型陣列或複雜的表達式,從而減少解析時間並提昇查詢效能。

    +

    假設您有一個篩選表達式,其中包含兩個欄位agecity ,而您想要找出所有年齡大於 25 歲,且居住在「北京」(Beijing)或「上海」(Shanghai)的人。您可以使用模板,而不是直接將值嵌入篩選表達式中。

    +
    filter = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +
    +
    +

    在此,{age}{city} 是占位符,在執行查詢時,它們將被filter_params 中的實際值取代。

    +

    在 Milvus 中使用篩選表達式模板有幾個主要優點。

    +
      +
    • 減少解析時間:透過使用占位符取代大型或複雜的篩選表達式,系統花在解析和處理篩選表達式的時間就會減少。

    • +
    • 改善查詢效能:隨著解析開銷的減少,查詢效能得以提升,進而達到更高的 QPS 和更快的回應時間。

    • +
    • 可擴充性:隨著資料集的成長,篩選表達式也變得更複雜,樣板化功能可確保效能維持在高效且可擴充的狀態。

    • +
    +

    搜尋作業

    對於 Milvus 中的搜尋作業,filter 表達式用於定義篩選條件,而filter_params 參數則用於指定佔位符的值。filter_params 字典包含 Milvus 用來代入篩選表達式的動態值。

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.search(​
    +    "hello_milvus",​
    +    vectors[:nq],​
    +    filter=expr,​
    +    limit=10,​
    +    output_fields=["age", "city"],​
    +    search_params={"metric_type": "COSINE", "params": {"search_list": 100}},​
    +    filter_params=filter_params,​
    +)​
    +
    +
    +

    在這個範例中,Milvus 在執行搜尋時,會以25 動態取代{age} ,以["北京", "上海"] 動態取代{city}

    +

    查詢操作

    同樣的模板機制也可以應用在 Milvus 的查詢操作上。在query 函式中,您定義篩選表達式,並使用filter_params 指定要取代的值。

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.query(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    output_fields=["age", "city"],​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    透過使用filter_params ,Milvus 可以有效率地處理值的動態插入,提高查詢的執行速度。

    +

    刪除操作

    您也可以在刪除作業中使用篩選表達式模板。與搜尋和查詢相似,filter 表達式定義條件,而filter_params 則提供佔位符的動態值。

    +
    expr = "age > {age} AND city IN {city}"​
    +filter_params = {"age": 25, "city": ["北京", "上海"]}​
    +res = client.delete(​
    +    "hello_milvus",​
    +    filter=expr,​
    +    filter_params=filter_params​
    +)​
    +
    +
    +

    這種方法可以改善刪除作業的效能,尤其是在處理複雜的篩選條件時。

    +

    結論

    篩選表達式模板化是 Milvus 優化查詢效能的重要工具。透過使用佔位符和filter_params 字典,您可以大幅減少解析複雜篩選表達式所花的時間。這可加快查詢執行速度,並提高整體效能。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.json new file mode 100644 index 000000000..dc69d35de --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.json @@ -0,0 +1 @@ +{"codeList":["# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains(tags, \"sale\")'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\", \"discount\"]}​\nfilter = 'json_contains_all(tags, [\"electronics\", \"sale\", \"new\"])'​\n\n","# JSON data: {\"tags\": [\"electronics\", \"sale\", \"new\"]}​\nfilter = 'json_contains_any(tags, [\"electronics\", \"new\", \"clearance\"])'​\n\n"],"headingContent":"JSON Operators​","anchorList":[{"label":"JSON 運算符號","href":"JSON-Operators​","type":1,"isActive":false},{"label":"可用的 JSON 運算符","href":"Available-JSON-Operators​","type":2,"isActive":false},{"label":"JSON_CONTAINS","href":"JSONCONTAINS​","type":2,"isActive":false},{"label":"json_contains_all","href":"JSONCONTAINSALL​","type":2,"isActive":false},{"label":"json_cotains_any","href":"JSONCOTAINSANY​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.md new file mode 100644 index 000000000..3f7dbea3e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/boolean/json-operators.md @@ -0,0 +1,117 @@ +--- +id: json-operators.md +summary: >- + Milvus 支援先進的運算符號來查詢和過濾 JSON 欄位,使其成為管理複雜、結構化資料的完美工具。這些運算符能夠高效地查詢 JSON 文件,允許您根據 + JSON 欄位中的特定元素、值或條件檢索實體。本節將引導您在 Milvus 中使用 JSON 特定的運算符,並提供實例來說明它們的功能。 +title: JSON 運算符號 +--- +

    JSON 運算符號

    Milvus 支援先進的運算符號,用於查詢和過濾 JSON 欄位,使其成為管理複雜、結構化數據的完美工具。這些運算符能夠高效地查詢 JSON 文檔,允許您根據 JSON 欄位中的特定元素、值或條件檢索實體。本節將引導您在 Milvus 中使用 JSON 特定的運算符號,並提供實例來說明它們的功能。

    +
    +

    JSON 欄位無法處理複雜的嵌套結構,並將所有嵌套結構視為純字串。因此,在使用 JSON 欄位時,建議避免過深的巢狀結構,並確保您的資料結構盡可能扁平,以獲得最佳效能。

    +
    +

    可用的 JSON 運算符

    Milvus 提供了幾個強大的 JSON 運算符,幫助過濾和查詢 JSON 資料,這些運算符有

    + +

    讓我們以範例來探討這些運算符號,看看它們如何應用在實際情況中。

    +

    JSON_CONTAINS

    json_contains 運算符檢查 JSON 欄位中是否存在特定元素或子陣列。當您想要確保 JSON 陣列或物件包含特定值時,這個運算符很有用。

    +

    範例

    +

    假設您有一個產品集合,每個產品都有一個tags 欄位,其中包含一個字串的 JSON 陣列,例如["electronics", "sale", "new"] 。您想要篩選具有標籤"sale" 的產品。

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains(tags, "sale")'​
    +
    +
    +

    在這個範例中,Milvus 會返回所有tags 欄位包含"sale" 元素的產品。

    +

    json_contains_all

    json_contains_all 運算子確保指定 JSON 表達式的所有元素都出現在目標欄位中。當您需要匹配 JSON 陣列中的多個值時,它特別有用。

    +

    範例

    +

    繼續使用產品標籤的情境,如果您想找出所有標籤為"electronics","sale", 和"new" 的產品,您可以使用json_contains_all 運算符號。

    +
    # JSON data: {"tags": ["electronics", "sale", "new", "discount"]}​
    +filter = 'json_contains_all(tags, ["electronics", "sale", "new"])'​
    +
    +
    +

    此查詢將返回tags 陣列包含所有三個指定元素的所有產品:"electronics","sale", 和"new"

    +

    json_cotains_any

    json_contains_any 運算符號會過濾至少有一個 JSON 表達式成員存在於欄位中的實體。當您要根據多個可能值中的任何一個來匹配實體時,這非常有用。

    +

    範例

    +

    假設您想要過濾至少有一個標記"electronics","sale", 或"new" 的產品。您可以使用json_contains_any 運算符號來達成這個目的。

    +
    # JSON data: {"tags": ["electronics", "sale", "new"]}​
    +filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])'​
    +
    +
    +

    在這種情況下,Milvus 會返回清單["electronics", "new", "clearance"] 中至少有一個標籤的所有產品。即使產品只有其中一個標籤,也會包含在結果中。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.json new file mode 100644 index 000000000..e83c9f7b0 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.json @@ -0,0 +1 @@ +{"codeList":["dataCoord:\n compaction:\n clustering:\n enable: true \n autoEnable: false \n triggerInterval: 600 \n minInterval: 3600 \n maxInterval: 259200 \n newDataSizeThreshold: 512m \n timeout: 7200\n \nqueryNode:\n enableSegmentPrune: true \n\ndatanode:\n clusteringCompaction:\n memoryBufferRatio: 0.1 \n workPoolSize: 8 \ncommon:\n usePartitionKeyAsClusteringKey: true \n","default_fields = [\n FieldSchema(name=\"id\", dtype=DataType.INT64, is_primary=True),\n FieldSchema(name=\"key\", dtype=DataType.INT64, is_clustering_key=True),\n FieldSchema(name=\"var\", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),\n FieldSchema(name=\"embeddings\", dtype=DataType.FLOAT_VECTOR, dim=dim)\n]\n\ndefault_schema = CollectionSchema(\n fields=default_fields, \n description=\"test clustering-key collection\"\n)\n\ncoll1 = Collection(name=\"clustering_test\", schema=default_schema)\n","coll1.compact(is_clustering=True)\ncoll1.get_compaction_state(is_clustering=True)\ncoll1.wait_for_compaction_completed(is_clustering=True)\n"],"headingContent":"Clustering Compaction","anchorList":[{"label":"聚類壓縮","href":"Clustering-Compaction","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"使用聚類壓縮","href":"Use-Clustering-Compaction","type":2,"isActive":false},{"label":"觸發聚類壓縮","href":"Trigger-Clustering-Compaction","type":2,"isActive":false},{"label":"最佳實務","href":"Best-practices","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.md new file mode 100644 index 000000000..2a41d1397 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/clustering-compaction.md @@ -0,0 +1,269 @@ +--- +id: clustering-compaction.md +title: 聚類壓縮 +related_key: 'clustering, compaction' +summary: 聚類壓縮的目的是在大型資料集中提高搜尋效能並降低成本。本指南將協助您瞭解聚類壓縮以及此功能如何改善搜尋效能。 +--- +

    聚類壓縮

    聚類壓縮的目的是在大型資料集中改善搜尋效能並降低成本。本指南將協助您瞭解聚類壓縮以及此功能如何改善搜尋效能。

    +

    概述

    Milvus 將傳入的實體儲存於集合中的區段,並在區段已滿時封閉該區段。如果發生這種情況,就會創建一個新的區段來容納額外的實體。因此,實體會任意地分佈在區段中。這種分佈方式需要 Milvus 搜尋多個區段,以找出與指定查詢向量最近的鄰居。

    +

    + + Without clustering Compaction + 無聚類壓縮

    +

    如果 Milvus 可以根據特定欄位中的值,將實體分佈在區段中,搜尋範圍就可以限制在一個區段內,進而改善搜尋效能。

    +

    聚類壓縮 (Clustering Compaction) 是 Milvus 的一項功能,可根據標量欄位中的值,在集合中的段之間重新分配實體。要啟用此功能,您首先需要選擇標量欄位作為聚類關鍵。這可讓 Milvus 在實體的聚類關鍵值在特定範圍內時,將實體重新分配到段中。當您觸發聚類壓縮時,Milvus 會產生/更新稱為PartitionStats 的全局索引,它會記錄段與聚類關鍵值之間的映射關係。

    +

    + + With Clustering Compaction + 使用聚類壓縮

    +

    使用PartitionStats作為參考,Milvus 可以在接收到帶有聚類關鍵值的搜尋/查詢請求時,修剪不相關的資料,並將搜尋範圍限制在與關鍵值對應的區段內,從而改善搜尋效能。有關效能改善的詳細資訊,請參閱基準測試。

    +

    使用聚類壓縮

    Milvus 的聚類壓縮功能是高度可配置的。您可以選擇手動觸發,或設定為由 Milvus 每隔一段時間自動觸發。要啟用叢集壓縮,請執行下列步驟:

    +

    全局設定

    您需要修改您的 Milvus 配置文件,如下所示。

    +
    dataCoord:
    +  compaction:
    +    clustering:
    +      enable: true 
    +      autoEnable: false 
    +      triggerInterval: 600 
    +      minInterval: 3600 
    +      maxInterval: 259200 
    +      newDataSizeThreshold: 512m 
    +      timeout: 7200
    +     
    +queryNode:
    +  enableSegmentPrune: true 
    +
    +datanode:
    +  clusteringCompaction:
    +    memoryBufferRatio: 0.1 
    +    workPoolSize: 8  
    +common:
    +  usePartitionKeyAsClusteringKey: true 
    +
    +
      +
    • dataCoord.compaction.clustering

      + + + + + + + + + + + + + +
      設定項目說明預設值
      enable指定是否啟用叢集壓縮。
      如果您需要為每個具有叢集鍵的集合啟用此功能,請將此設定為true
      false
      autoEnable指定是否啟用自動觸發壓縮。
      將此設定為true 表示 Milvus 會在指定的間隔壓縮具有叢集鍵的集合。
      false
      triggerInterval指定 Milvus 開始聚類壓縮的時間間隔,以毫秒為單位。
      此參數僅在autoEnable 設為true 時有效。
      -
      minInterval以秒為單位指定最小間隔。
      此參數僅在autoEnable 設為true 時有效。
      將此設定為大於 triggerInterval 的整數,有助於避免在短時間內重複壓縮。
      -
      maxInterval指定最大間隔 (以秒為單位)。
      此參數僅在autoEnable 設為true 時有效。
      一旦 Milvus 偵測到一個集合沒有被叢集壓縮的時間超過這個值,它就會強制叢集壓縮。
      -
      newDataSizeThreshold指定觸發聚類壓縮的上限臨界值。
      此參數僅在autoEnable 設為true 時有效。
      一旦 Milvus 偵測到資料集中的資料量超過此值,就會啟動聚類壓縮程序。
      -
      timeout指定叢集壓縮的逾時長度。
      如果集群壓縮的執行時間超過此值,則壓縮失敗。
      -
      +
    • +
    • queryNode

      + + + + + + + +
      設定項目設定項目預設值
      enableSegmentPrune指定 Milvus 是否在收到搜尋/查詢請求時,參考 PartitionStats 來修剪資料。
      將此設定為true 可讓 Milvus 在搜尋/查詢請求期間修剪區段中的不相關資料。
      false
      +
    • +
    • dataNode.clusteringCompaction

      + + + + + + + + +
      設定項目說明預設值
      memoryBufferRatio指定群集壓縮任務的記憶體緩衝比率。
      當資料大小超過使用此比率計算的已分配緩衝區大小時,Milvus 會清除資料。
      -
      workPoolSize指定叢集壓縮任務的工作人員池大小。-
      +
    • +
    • common

      + + + + + + + +
      設定項目設定項目預設值
      usePartitionKeyAsClusteringKey指定是否使用集合中的分割區金鑰作為群集金鑰。
      將此設定為true 表示將分割區金鑰用作叢集金鑰。
      您可以在集合中透過明確設定叢集索引鍵來覆寫此設定。
      false
      +
    • +
    +

    要將上述變更套用到您的 Milvus 叢集,請遵循「使用 Helm 設定 Milvus」和「使用 Milvus Operators 設定 Milvus」中的步驟。

    +

    叢集設定

    若要在特定的集合中進行群集壓縮,您應該從集合中選擇一個標量欄位作為群集鍵。

    +
    default_fields = [
    +    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    +    FieldSchema(name="key", dtype=DataType.INT64, is_clustering_key=True),
    +    FieldSchema(name="var", dtype=DataType.VARCHAR, max_length=1000, is_primary=False),
    +    FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
    +]
    +
    +default_schema = CollectionSchema(
    +    fields=default_fields, 
    +    description="test clustering-key collection"
    +)
    +
    +coll1 = Collection(name="clustering_test", schema=default_schema)
    +
    +
    +

    您可以使用下列資料類型的標量欄位作為聚類關鍵:Int8,Int16,Int32,Int64,Float,Double, 以及VarChar

    +
    +

    觸發聚類壓縮

    如果您啟用了自動聚類壓縮,Milvus 會在指定的間隔自動觸發壓縮。另外,您也可以手動觸發壓縮,如下所示:

    +
    coll1.compact(is_clustering=True)
    +coll1.get_compaction_state(is_clustering=True)
    +coll1.wait_for_compaction_completed(is_clustering=True)
    +
    +

    基準測試

    資料量與查詢模式的結合,決定了叢集壓縮所能帶來的效能改善。一項內部基準測試證明,叢集壓縮可將每秒查詢次數 (QPS) 提升 25 倍。

    +

    該基準測試是在一個集合上進行的,該集合包含來自 2,000 萬個 768 維 LAION 資料集中的實體,其中的關鍵字段被指定為聚類關鍵。在集合中觸發聚類壓縮之後,會發送並發搜尋,直到 CPU 使用量達到高水位為止。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    搜尋篩選剪除比率延遲 (ms)QPS (要求/秒)
    平均值最小值最大值中位數TP99
    0%168567222941710229117.75
    按鍵 > 200 且按鍵 < 80040.2%10454718281085161728.38
    鍵 > 200 且鍵 < 60059.8%829451483882130335.78
    關鍵 > 200 且關鍵 < 40079.5%55010098558489854.00
    key == 100099%6824127370246431.41
    +

    隨著搜尋篩選器中的搜尋範圍縮小,剪枝比率也會增加。這表示在搜尋過程中,會跳過更多的實體。比較第一行和最後一行的統計資料時,您可以看到沒有進行聚類壓縮的搜尋需要掃描整個集合。另一方面,使用特定關鍵進行聚類壓縮的搜尋,可以達到 25 倍的改善。

    +

    最佳實務

    以下是一些有效使用聚類壓縮的提示:

    +
      +
    • 在資料量較大的資料集中啟用此功能。 搜尋效能會隨著資料集中的資料量增加而提升。對於超過 100 萬個實體的資料集,啟用此功能是個不錯的選擇。

    • +
    • 選擇適當的聚類關鍵:您可以使用常被用來作為篩選條件的標量欄位作為聚類關鍵。對於包含來自多個租戶資料的集合,您可以使用區別一個租戶與另一個租戶的欄位作為簇集索引鍵。

    • +
    • 使用分割區金鑰作為叢集金鑰。如果您想對 Milvus 實例中的所有集合啟用此功能,或者在使用分割區金鑰的大型集合中仍然面臨性能問題,則可以將common.usePartitionKeyAsClusteringKey 設為 true。這樣做之後,當您選擇一個集合中的標量欄位作為分割鍵時,就會有一個群集鍵和一個分割鍵。

      +

      請注意,此設定不會阻止您選擇其他標量欄位作為叢集索引鍵。明確指定的簇集索引鍵總是優先。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.json new file mode 100644 index 000000000..1b71cc68e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.json @@ -0,0 +1 @@ +{"codeList":["client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next​\n consistency_level=\"Strong\",​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n // highlight-next​\n .consistencyLevel(ConsistencyLevel.STRONG)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isClusteringKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n​\nexport params='{​\n \"consistencyLevel\": \"Strong\"​\n}'​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"my_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","res = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-start​\n consistency_level=\"Bounded\",​\n # highlight-next​\n)​\n\n","SearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .searchParams(params)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"my_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"limit\": 3,​\n \"consistencyLevel\": \"Bounded\"​\n}'​\n\n","res = client.query(​\n collection_name=\"my_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3,​\n # highlight-start​\n consistency_level=\"Eventually\",​\n # highlight-next​\n)​\n\n","QueryReq queryReq = QueryReq.builder()​\n .collectionName(\"my_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .consistencyLevel(ConsistencyLevel.EVENTUALLY)​\n .build();​\n ​\n QueryResp getResp = client.query(queryReq);​\n\n"],"headingContent":"Consistency Level​","anchorList":[{"label":"一致性等級","href":"Consistency-Level​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"設定一致性等級","href":"Set-Consistency-Level​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.md new file mode 100644 index 000000000..dba024e2d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/consistency.md @@ -0,0 +1,211 @@ +--- +id: consistency.md +summary: 了解 Milvus 的四種一致性等級。 +title: 一致性 +--- +

    一致性等級

    作為一個分散式向量資料庫,Milvus 提供多種一致性等級,以確保每個節點或副本在讀寫作業時能存取相同的資料。目前,支援的一致性等級包括StrongBoundedEventuallySession,其中Bounded是預設使用的一致性等級。

    +

    概述

    Milvus 是一個將儲存和計算分開的系統。在這個系統中,資料節點 (DataNodes) 負責資料的持久化,並最終將資料儲存在分散式物件儲存空間 (例如 MinIO/S3)。QueryNodes負責處理搜尋等計算任務。這些任務涉及批次資料串流資料的處理。簡單來說,批次資料可以理解為已經儲存於物件儲存空間的資料,而串流資料則是指尚未儲存於物件儲存空間的資料。由於網路延遲的關係,QueryNodes 通常無法保存最新的串流資料。如果沒有額外的保障措施,直接在串流資料上執行 Search 可能會導致許多未承諾的資料點遺失,影響搜尋結果的準確性。

    +

    Milvus 是一個將儲存和計算分開的系統。在這個系統中,DataNodes 負責資料的持久化,並最終將資料儲存於分散式物件儲存空間,例如 MinIO/S3。QueryNodes 負責處理搜尋等計算任務。這些任務涉及批次資料和串流資料的處理。簡單來說,批次資料可理解為已儲存在物件儲存空間的資料,而串流資料則是指尚未儲存在物件儲存空間的資料。由於網路延遲的關係,QueryNodes 通常無法儲存最新的串流資料。如果沒有額外的保障措施,直接在串流資料上執行 Search 可能會導致遺失許多未承諾的資料點,影響搜尋結果的準確性。

    +

    + + Batch data and streaming data + 批次資料和串流資料

    +

    如上圖所示,QueryNodes 在收到 Search 請求後,可以同時接收串流資料和批次資料。然而,由於網路延遲,QueryNodes 取得的串流資料可能不完整。

    +

    為了解決這個問題,Milvus 會為資料佇列中的每條記錄加上時間戳,並持續在資料佇列中插入同步時間戳。每當收到同步時間戳 (syncTs) 時,QueryNodes 會將其設定為 ServiceTime,意即 QueryNodes 可以看到該 Service Time 之前的所有資料。在 ServiceTime 的基礎上,Milvus 可以提供保證時間戳 (GuaranteeTs) 來滿足使用者對一致性和可用性的不同要求。使用者可透過在其 Search 請求中指定 GuaranteeTs,告知 QueryNodes 在搜尋範圍中需要包含指定時間點之前的資料。

    +

    + + ServiceTime and GuaranteeTs + ServiceTime 與 GuaranteeTs

    +

    如上圖所示,如果 GuaranteeTs 小於 ServiceTime,表示指定時間點之前的所有資料已完全寫入磁碟,允許 QueryNodes 立即執行 Search 作業。當 GuaranteeTs 大於 ServiceTime 時,QueryNodes 必須等到 ServiceTime 大於 GuaranteeTs 時,才能執行 Search 作業。

    +

    使用者需要在查詢精確度與查詢延遲之間作出權衡。如果使用者對一致性要求很高,而且對查詢延遲不敏感,他們可以將 GuaranteeTs 設定為盡可能大的值;如果使用者希望快速收到搜尋結果,而且對查詢精確度的容忍度較高,那麼可以將 GuaranteeTs 設定為較小的值。

    +

    + + Consistency Levels Illustrated + 一致性等級說明

    +

    Milvus 提供四種不同 GuaranteeTs 的一致性等級。

    +
      +
    • +

      使用最新的時間戳作為 GuaranteeTs,查詢節點必須等到 ServiceTime 符合 GuaranteeTs 才執行 Search 請求。

    • +
    • 最終

      +

      GuaranteeTs 設定為極小的值,例如 1,以避免一致性檢查,這樣 QueryNodes 就可以在所有批次資料上立即執行 Search 請求。

    • +
    • 有限制的延遲

      +

      GuranteeTs 設定為早於最新時間戳記的時間點,使 QueryNodes 在執行搜尋時可容忍某些資料遺失。

    • +
    • 會話

      +

      用戶端插入資料的最新時間點作為 GuaranteeTs,使 QueryNodes 可以在用戶端插入的所有資料上執行搜尋。

    • +
    +

    Milvus 使用 Bounded Staleness 作為預設的一致性等級。如果未指定 GuaranteeTs,則使用最新的 ServiceTime 作為 GuaranteeTs。

    +

    設定一致性等級

    您可以在建立資料集、執行搜尋和查詢時設定不同的一致性層級。

    +

    建立集合時設定一致性層級

    當建立一個集合時,您可以為集合內的搜尋和查詢設定一致性層級。以下程式碼範例設定一致性等級為Strong

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next​
    +    consistency_level="Strong",​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("my_collection")​
    +        .collectionSchema(schema)​
    +        // highlight-next​
    +        .consistencyLevel(ConsistencyLevel.STRONG)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isClusteringKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +​
    +export params='{​
    +    "consistencyLevel": "Strong"​
    +}'​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"my_collection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    consistency_level 參數的可能值是Strong,Bounded,Eventually, 和Session

    +

    在搜尋中設定一致性等級

    您可以隨時變更特定搜尋的一致性等級。以下程式碼範例會將一致性層級設定回 Bounded。此變更只適用於目前的搜尋請求。

    + +
    res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-start​
    +    consistency_level="Bounded",​
    +    # highlight-next​
    +)​
    +
    +
    +
    SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .searchParams(params)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "my_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "limit": 3,​
    +    "consistencyLevel": "Bounded"​
    +}'​
    +
    +
    +

    此參數在混合搜尋和搜尋迭代器中也可用。consistency_level 參數的可能值是Strong,Bounded,Eventually, 和Session

    +

    在查詢中設定一致性層級

    您可以隨時變更特定搜尋的一致性層級。以下程式碼範例設定一致性層級為Eventually。此設定僅適用於目前的查詢請求。

    + +
    res = client.query(​
    +    collection_name="my_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3,​
    +    # highlight-start​
    +    consistency_level="Eventually",​
    +    # highlight-next​
    +)​
    +
    +
    +
    QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("my_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .consistencyLevel(ConsistencyLevel.EVENTUALLY)​
    +        .build();​
    +        ​
    + QueryResp getResp = client.query(queryReq);​
    +
    +
    +

    查詢迭代器中也可使用此參數。consistency_level 參數的可能值是Strong,Bounded,Eventually, 和Session

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.json new file mode 100644 index 000000000..ad179df1f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\", \"likes\": 165},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\", \"likes\": 25},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\", \"likes\": 764},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\", \"likes\": 234},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\", \"likes\": 122},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\", \"likes\": 12},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\", \"likes\": 58},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\", \"likes\": 775},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\", \"likes\": 876},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\", \"likes\": 765}​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=5,​\n # highlight-start​\n filter='color like \"red%\" and likes > 50',​\n output_fields=[\"color\", \"likes\"]​\n # highlight-end​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"filtered_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .filter(\"color like \\\"red%\\\" and likes > 50\")​\n .outputFields(Arrays.asList(\"color\", \"likes\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​\n\n","import (​\n \"context\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_filter() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"filtered_search_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithFilter(`color like \"red%\" and likes > 50`).WithOutputFields(\"color\", \"likes\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nconst res = await client.search({​\n collection_name: \"filtered_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n filters: 'color like \"red%\" and likes > 50',​\n output_fields: [\"color\", \"likes\"]​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\", \"likes\"]​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n","[​\n {​\n \"id\": 4, ​\n \"distance\": 0.3345786594834839,​\n \"entity\": {​\n \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​\n \"color\": \"red_4794\", ​\n \"likes\": 122​\n }​\n },​\n {​\n \"id\": 6, ​\n \"distance\": 0.6638239834383389,​\n \"entity\": {​\n \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​\n \"color\": \"red_9392\", ​\n \"likes\": 58​\n }​\n },​\n]​\n\n"],"headingContent":"Filtered Search​","anchorList":[{"label":"篩選搜尋","href":"Filtered-Search​","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"範例","href":"Examples","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.md new file mode 100644 index 000000000..a56f8c8eb --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/filtered-search.md @@ -0,0 +1,254 @@ +--- +id: filtered-search.md +title: 篩選搜尋 +related_key: 'ann search, filtered search' +summary: >- + ANN 搜尋會找出與指定向量嵌入最相似的向量嵌入。然而,搜尋結果不一定總是正確的。您可以在搜尋請求中加入篩選條件,讓 Milvus 在進行 ANN + 搜尋之前先進行元資料篩選,將搜尋範圍從整個集合縮小到只搜尋符合指定篩選條件的實體。 +--- +

    篩選搜尋

    ANN 搜尋會找出與指定向量嵌入最相似的向量嵌入。然而,搜尋結果不一定總是正確的。您可以在搜尋請求中加入篩選條件,讓 Milvus 在進行 ANN 搜尋之前先進行元資料篩選,將搜尋範圍從整個集合縮小到只有符合指定篩選條件的實體。

    +

    概述

    如果一個集合包含向量嵌入和它們的元資料,您可以在 ANN 搜尋之前篩選元資料,以改善搜尋結果的相關性。一旦 Milvus 接收到帶有過濾條件的搜尋請求,它就會將搜尋範圍限制在符合指定過濾條件的實體內。

    +

    + + Filtered search + 過濾搜尋

    +

    如上圖所示,搜尋請求包含chunk like % red % 作為篩選條件,表示 Milvus 應該在chunk 欄位中有red 字元的所有實體中進行 ANN 搜尋。具體而言,Milvus 會執行下列工作。

    +
      +
    • 篩選符合搜尋請求中篩選條件的實體。

    • +
    • 在篩選過的實體中進行 ANN 搜尋。

    • +
    • 返回前 K 個實體。

    • +
    +

    範例

    本節示範如何進行篩選搜尋。本節中的程式碼片段假設您的資料集中已有下列實體。每個實體有四個欄位,分別是id向量顏色喜好

    +
    [​
    +    {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},​
    +    {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025", "likes": 25},​
    +    {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781", "likes": 764},​
    +    {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298", "likes": 234},​
    +    {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794", "likes": 122},​
    +    {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222", "likes": 12},​
    +    {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392", "likes": 58},​
    +    {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510", "likes": 775},​
    +    {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381", "likes": 876},​
    +    {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976", "likes": 765}​
    +]​
    +
    +
    +

    以下程式碼片段中的搜尋請求包含一個篩選條件和數個輸出欄位。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=5,​
    +    # highlight-start​
    +    filter='color like "red%" and likes > 50',​
    +    output_fields=["color", "likes"]​
    +    # highlight-end​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("filtered_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .filter("color like \"red%\" and likes > 50")​
    +        .outputFields(Arrays.asList("color", "likes"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=red_4794, likes=122}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={color=red_9392, likes=58}, score=-0.24996188, id=6)​
    +
    +
    +
    import (​
    +    "context"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_filter() {​
    +        ctx, cancel := context.WithCancel(context.Background())​
    +        defer cancel()​
    +​
    +        milvusAddr := "127.0.0.1:19530"​
    +        token := "root:Milvus"​
    +​
    +        cli, err := client.New(ctx, &client.ClientConfig{​
    +                Address: milvusAddr,​
    +                APIKey:  token,​
    +        })​
    +        if err != nil {​
    +                log.Fatal("failed to connect to milvus server: ", err.Error())​
    +        }​
    +​
    +        defer cli.Close(ctx)​
    +​
    +        queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +        resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +                "filtered_search_collection", // collectionName​
    +                3,             // limit​
    +                []entity.Vector{entity.FloatVector(queryVector)},​
    +        ).WithFilter(`color like "red%" and likes > 50`).WithOutputFields("color", "likes"))​
    +        if err != nil {​
    +                log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +        }​
    +​
    +        for _, resultSet := range resultSets {​
    +                log.Println("IDs: ", resultSet.IDs)​
    +                log.Println("Scores: ", resultSet.Scores)​
    +        }​
    +        // Output:​
    +        // IDs:​
    +        // Scores:​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +const res = await client.search({​
    +    collection_name: "filtered_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    filters: 'color like "red%" and likes > 50',​
    +    output_fields: ["color", "likes"]​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "outputFields": ["color", "likes"]​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    搜尋請求中的過濾條件讀取color like "red%" and likes > 50 。它使用 and 運算符包含兩個條件:第一個條件要求在color 欄位中尋找值以red 開頭的實體,另一個條件要求在likes 欄位中尋找值大於50 的實體。只有兩個實體符合這些要求。當 top-K 設定為3 時,Milvus 會計算這兩個實體與查詢向量之間的距離,並將其作為搜尋結果傳回。

    +
    [​
    +    {​
    +        "id": 4, ​
    +        "distance": 0.3345786594834839,​
    +        "entity": {​
    +            "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], ​
    +            "color": "red_4794", ​
    +            "likes": 122​
    +        }​
    +    },​
    +    {​
    +        "id": 6, ​
    +        "distance": 0.6638239834383389,​
    +        "entity": {​
    +            "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], ​
    +            "color": "red_9392", ​
    +            "likes": 58​
    +        }​
    +    },​
    +]​
    +
    +
    +

    有關您可以在元資料篩選中使用的運算符號的更多資訊,請參閱元資料篩選

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.json new file mode 100644 index 000000000..7d691a26a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType, Function, FunctionType​\n\nclient = MilvusClient(uri=\"http://localhost:19530\")\n​\nschema = client.create_schema()​\n​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True, auto_id=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .build();\nschema.addField(AddFieldReq.builder()\n .fieldName(\"id\")\n .dataType(DataType.Int64)\n .isPrimaryKey(true)\n .autoID(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .build());\nschema.addField(AddFieldReq.builder()\n .fieldName(\"sparse\")\n .dataType(DataType.SparseFloatVector)\n .build());\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";\n\nconst address = \"http://localhost:19530\";\nconst token = \"root:Milvus\";\nconst client = new MilvusClient({address, token});\nconst schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n\nconsole.log(res.results)\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n","bm25_function = Function(​\n name=\"text_bm25_emb\", # Function name​\n input_field_names=[\"text\"], # Name of the VARCHAR field containing raw text data​\n output_field_names=[\"sparse\"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​\n function_type=FunctionType.BM25,​\n)​\n​\nschema.add_function(bm25_function)​\n\n","import io.milvus.common.clientenum.FunctionType;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq.Function;\n\nimport java.util.*;\n\nschema.addFunction(Function.builder()\n .functionType(FunctionType.BM25)\n .name(\"text_bm25_emb\")\n .inputFieldNames(Collections.singletonList(\"text\"))\n .outputFieldNames(Collections.singletonList(\"vector\"))\n .build());\n","const functions = [\n {\n name: 'text_bm25_emb',\n description: 'bm25 function',\n type: FunctionType.BM25,\n input_field_names: ['text'],\n output_field_names: ['vector'],\n params: {},\n },\n];\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ],\n \"functions\": [\n {\n \"name\": \"text_bm25_emb\",\n \"type\": \"BM25\",\n \"inputFieldNames\": [\"text\"],\n \"outputFieldNames\": [\"sparse\"],\n \"params\": {}\n }\n ]\n }'\n","index_params = client.prepare_index_params()​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_type=\"AUTOINDEX\", ​\n metric_type=\"BM25\"​\n)​\n\n","import io.milvus.v2.common.IndexParam;\n\nList indexes = new ArrayList<>();\nindexes.add(IndexParam.builder()\n .fieldName(\"sparse\")\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)\n .metricType(IndexParam.MetricType.BM25)\n .build());\n","const index_params = [\n {\n field_name: \"sparse\",\n metric_type: \"BM25\",\n index_type: \"AUTOINDEX\",\n },\n];\n","export indexParams='[\n {\n \"fieldName\": \"sparse\",\n \"metricType\": \"BM25\",\n \"indexType\": \"AUTOINDEX\"\n }\n ]'\n","client.create_collection(​\n collection_name='demo', ​\n schema=schema, ​\n index_params=index_params​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq requestCreate = CreateCollectionReq.builder()\n .collectionName(\"demo\")\n .collectionSchema(schema)\n .indexParams(indexes)\n .build();\nclient.createCollection(requestCreate);\n","await client.create_collection(\n collection_name: 'demo', \n schema: schema, \n index_params: index_params,\n functions: functions\n);\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d \"{\n \\\"collectionName\\\": \\\"demo\\\",\n \\\"schema\\\": $schema,\n \\\"indexParams\\\": $indexParams\n}\"\n","client.insert('demo', [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n])\n\n","import com.google.gson.Gson;\nimport com.google.gson.JsonObject;\n\nimport io.milvus.v2.service.vector.request.InsertReq;\n\nGson gson = new Gson();\nList rows = Arrays.asList(\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval is a field of study.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"information retrieval focuses on finding relevant information in large datasets.\\\"}\", JsonObject.class),\n gson.fromJson(\"{\\\"text\\\": \\\"data mining and information retrieval overlap in research.\\\"}\", JsonObject.class)\n);\n\nclient.insert(InsertReq.builder()\n .collectionName(\"demo\")\n .data(rows)\n .build());\n","await client.insert({\ncollection_name: 'demo', \ndata: [\n {'text': 'information retrieval is a field of study.'},\n {'text': 'information retrieval focuses on finding relevant information in large datasets.'},\n {'text': 'data mining and information retrieval overlap in research.'},\n]);\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"data\": [\n {\"text\": \"information retrieval is a field of study.\"},\n {\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"},\n {\"text\": \"data mining and information retrieval overlap in research.\"} \n ],\n \"collectionName\": \"demo\"\n}'\n","search_params = {​\n 'params': {'drop_ratio_search': 0.2},​\n}​\n​\nclient.search(​\n collection_name='demo', ​\n data=['whats the focus of information retrieval?'],​\n anns_field='sparse',​\n limit=3,​\n search_params=search_params​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq;\nimport io.milvus.v2.service.vector.request.data.EmbeddedText;\nimport io.milvus.v2.service.vector.response.SearchResp;\n\nMap searchParams = new HashMap<>();\nsearchParams.put(\"drop_ratio_search\", 0.2);\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"demo\")\n .data(Collections.singletonList(new EmbeddedText(\"whats the focus of information retrieval?\")))\n .annsField(\"sparse\")\n .topK(3)\n .searchParams(searchParams)\n .outputFields(Collections.singletonList(\"text\"))\n .build());\n","await client.search(\n collection_name: 'demo', \n data: ['whats the focus of information retrieval?'],\n anns_field: 'sparse',\n limit: 3,\n params: {'drop_ratio_search': 0.2},\n)\n","curl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n--data-raw '{\n \"collectionName\": \"demo\",\n \"data\": [\n \"whats the focus of information retrieval?\"\n ],\n \"annsField\": \"sparse\",\n \"limit\": 3,\n \"outputFields\": [\n \"text\"\n ],\n \"searchParams\":{\n \"params\":{\n \"drop_ratio_search\":0.2\n }\n }\n}'\n"],"headingContent":"Full Text Search​","anchorList":[{"label":"全文檢索","href":"Full-Text-Search​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"為全文本搜尋建立資料夾","href":"Create-a-collection-for-full-text-search​","type":2,"isActive":false},{"label":"插入文字資料","href":"Insert-text-data","type":2,"isActive":false},{"label":"執行全文檢索","href":"Perform-full-text-search","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.md new file mode 100644 index 000000000..69889061a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/full-text-search.md @@ -0,0 +1,498 @@ +--- +id: full-text-search.md +title: 全文檢索 +related_key: 'full, text, search' +summary: 全文檢索是一種在文字資料集中擷取包含特定詞彙或短語的文件,然後根據相關性對結果進行排序的功能。 +--- +

    全文檢索

    全文檢索是一種在文字資料集中擷取包含特定詞彙或短語的文件,然後根據相關性對結果進行排序的功能。此功能克服了語意搜尋可能會忽略精確詞彙的限制,確保您收到最精確且與上下文相關的結果。此外,它還可以接受原始文字輸入,自動將您的文字資料轉換為稀疏嵌入,而不需要手動產生向量嵌入,從而簡化向量搜尋。

    +

    使用 BM25 演算法進行相關性評分,此功能在檢索擴充生成 (RAG) 的情境中特別有價值,它會優先處理與特定搜尋詞彙密切相符的文件。

    +
    +
      +
    • 透過整合全文檢索與以語意為基礎的密集向量檢索,您可以提高檢索結果的準確性與相關性。如需詳細資訊,請參閱混合搜尋
    • +
    • 全文搜索在 Milvus Standalone 和 Milvus Distributed 中可用,但在 Milvus Lite 中不可用,儘管將其加入 Milvus Lite 在路線圖上。
    • +
    +
    +

    概述

    全文檢索簡化了以文字為基礎的檢索過程,省去了手動嵌入的需要。此功能透過下列工作流程運作。

    +
      +
    1. 文字輸入:您可插入原始文字文件或提供查詢文字,而無需手動嵌入。

    2. +
    3. 文字分析:關於分析器的更多資訊,請參閱分析器概述

    4. +
    5. 函式處理:內建函式接收標記化的詞彙,並將它們轉換成稀疏向量表示。

    6. +
    7. 集合儲存:Milvus 將這些稀疏嵌入資料儲存在一個集合中,以便進行有效的檢索。

    8. +
    9. BM25 評分:在搜尋過程中,Milvus 應用 BM25 演算法來計算儲存文件的分數,並根據其與查詢文字的相關性對匹配結果進行排序。

    10. +
    +

    + + Full text search + 全文檢索

    +

    要使用全文本搜尋,請遵循以下主要步驟。

    +
      +
    1. 建立一個集合:設定一個包含必要欄位的集合,並定義一個函數將原始文字轉換為稀疏嵌入。

    2. +
    3. 插入資料:將原始文字文件輸入到資料集中。

    4. +
    5. 執行搜尋:使用查詢文字在您的資料集中搜尋,並擷取相關結果。

    6. +
    +

    為全文本搜尋建立資料夾

    若要啟用全文本搜尋,請建立具有特定模式的資料夾。此模式必須包含三個必要欄位。

    +
      +
    • 唯一識別資料集中每一個實體的主要欄位。

    • +
    • 儲存原始文字文件的VARCHAR 欄位,其enable_analyzer 屬性設定為True 。這可讓 Milvus 將文字標記化為特定詞彙,以便進行功能處理。

    • +
    • 預留一個SPARSE_FLOAT_VECTOR 欄位,用來儲存 Milvus 會自動為VARCHAR 欄位產生的稀疏嵌入。

    • +
    +

    定義集合模式

    首先,建立模式並新增必要的欄位。

    + +
    from pymilvus import MilvusClient, DataType, Function, FunctionType​
    +
    +client = MilvusClient(uri="http://localhost:19530")
    +​
    +schema = client.create_schema()​
    +​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .build();
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("id")
    +        .dataType(DataType.Int64)
    +        .isPrimaryKey(true)
    +        .autoID(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .build());
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("sparse")
    +        .dataType(DataType.SparseFloatVector)
    +        .build());
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
    +
    +const address = "http://localhost:19530";
    +const token = "root:Milvus";
    +const client = new MilvusClient({address, token});
    +const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +console.log(res.results)
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +

    在此設定中。

    +
      +
    • id: 用作主索引鍵,並由auto_id=True 自動產生。

    • +
    • text: 儲存您的原始文字資料,用於全文檢索作業。資料類型必須是VARCHAR ,因為VARCHAR 是 Milvus 用來儲存文字的字串資料類型。設定enable_analyzer=True 以允許 Milvus 對文字進行 tokenize。預設情況下,Milvus 使用標準分析器進行文字分析。要設定不同的分析器,請參考概述

    • +
    • sparse資料類型:預留向量欄位,以儲存內部產生的稀疏嵌入,用於全文檢索作業。資料類型必須是SPARSE_FLOAT_VECTOR

    • +
    +

    現在,定義一個函式,將您的文字轉換為稀疏向量表示,然後將其加入模式。

    + +
    bm25_function = Function(​
    +    name="text_bm25_emb", # Function name​
    +    input_field_names=["text"], # Name of the VARCHAR field containing raw text data​
    +    output_field_names=["sparse"], # Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings​
    +    function_type=FunctionType.BM25,​
    +)​
    +​
    +schema.add_function(bm25_function)​
    +
    +
    +
    import io.milvus.common.clientenum.FunctionType;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq.Function;
    +
    +import java.util.*;
    +
    +schema.addFunction(Function.builder()
    +        .functionType(FunctionType.BM25)
    +        .name("text_bm25_emb")
    +        .inputFieldNames(Collections.singletonList("text"))
    +        .outputFieldNames(Collections.singletonList("vector"))
    +        .build());
    +
    +
    const functions = [
    +    {
    +      name: 'text_bm25_emb',
    +      description: 'bm25 function',
    +      type: FunctionType.BM25,
    +      input_field_names: ['text'],
    +      output_field_names: ['vector'],
    +      params: {},
    +    },
    +];
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ],
    +        "functions": [
    +            {
    +                "name": "text_bm25_emb",
    +                "type": "BM25",
    +                "inputFieldNames": ["text"],
    +                "outputFieldNames": ["sparse"],
    +                "params": {}
    +            }
    +        ]
    +    }'
    +
    +

    參數

    +

    說明

    +

    name

    +

    +

    函式名稱。這個函式會將text 欄位中的原始文字轉換成可搜尋的向量,並儲存在sparse 欄位中。

    +

    input_field_names

    +

    需要將文字轉換為稀疏向量的VARCHAR 欄位名稱。對於FunctionType.BM25 ,此參數只接受一個欄位名稱。

    +

    output_field_names

    +

    儲存內部產生的稀疏向量的欄位名稱。對於FunctionType.BM25 ,此參數只接受一個欄位名稱。

    +

    function_type

    +

    要使用的函數類型。設定值為FunctionType.BM25

    +
    +
    +

    對於具有多個VARCHAR 欄位、需要將文字轉換為稀疏向量的資料集,請在資料集模式中加入不同的函式,確保每個函式都有唯一的名稱和output_field_names 值。

    +
    +

    設定索引

    在定義包含必要欄位和內建函式的模式後,為您的集合設定索引。為了簡化這個過程,請使用AUTOINDEX 作為index_type ,這個選項允許 Milvus 根據您的資料結構選擇和設定最適合的索引類型。

    + +
    index_params = client.prepare_index_params()​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_type="AUTOINDEX", ​
    +    metric_type="BM25"​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;
    +
    +List<IndexParam> indexes = new ArrayList<>();
    +indexes.add(IndexParam.builder()
    +        .fieldName("sparse")
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)
    +        .metricType(IndexParam.MetricType.BM25)
    +        .build());
    +
    +
    const index_params = [
    +  {
    +    field_name: "sparse",
    +    metric_type: "BM25",
    +    index_type: "AUTOINDEX",
    +  },
    +];
    +
    +
    export indexParams='[
    +        {
    +            "fieldName": "sparse",
    +            "metricType": "BM25",
    +            "indexType": "AUTOINDEX"
    +        }
    +    ]'
    +
    +

    參數

    +

    說明

    +

    field_name

    +

    要索引的向量欄位名稱。對於全文檢索,這應該是儲存所產生的稀疏向量的欄位。在本範例中,設定值為sparse

    +

    index_type

    +

    要建立的索引類型。AUTOINDEX 允許 Milvus 自動最佳化索引設定。如果您需要對索引設定有更多控制,您可以從 Milvus 中各種可用於稀疏向量的索引類型中選擇。如需更多資訊,請參考Milvus 支援的索引

    +

    metric_type

    +

    此參數的值必須設定為BM25 ,特別是針對全文檢索功能。

    +
    +

    建立資料庫

    現在使用已定義的模式和索引參數建立集合。

    + +
    client.create_collection(​
    +    collection_name='demo', ​
    +    schema=schema, ​
    +    index_params=index_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq requestCreate = CreateCollectionReq.builder()
    +        .collectionName("demo")
    +        .collectionSchema(schema)
    +        .indexParams(indexes)
    +        .build();
    +client.createCollection(requestCreate);
    +
    +
    await client.create_collection(
    +    collection_name: 'demo', 
    +    schema: schema, 
    +    index_params: index_params,
    +    functions: functions
    +);
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d "{
    +    \"collectionName\": \"demo\",
    +    \"schema\": $schema,
    +    \"indexParams\": $indexParams
    +}"
    +
    +

    插入文字資料

    設定好集合和索引後,您就可以插入文字資料了。在這個過程中,您只需要提供原始文字。我們之前定義的內建函式會自動為每個文字項目產生相對應的稀疏向量。

    + +
    client.insert('demo', [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +])
    +
    +
    +
    import com.google.gson.Gson;
    +import com.google.gson.JsonObject;
    +
    +import io.milvus.v2.service.vector.request.InsertReq;
    +
    +Gson gson = new Gson();
    +List<JsonObject> rows = Arrays.asList(
    +        gson.fromJson("{\"text\": \"information retrieval is a field of study.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"information retrieval focuses on finding relevant information in large datasets.\"}", JsonObject.class),
    +        gson.fromJson("{\"text\": \"data mining and information retrieval overlap in research.\"}", JsonObject.class)
    +);
    +
    +client.insert(InsertReq.builder()
    +        .collectionName("demo")
    +        .data(rows)
    +        .build());
    +
    +
    await client.insert({
    +collection_name: 'demo', 
    +data: [
    +    {'text': 'information retrieval is a field of study.'},
    +    {'text': 'information retrieval focuses on finding relevant information in large datasets.'},
    +    {'text': 'data mining and information retrieval overlap in research.'},
    +]);
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "data": [
    +        {"text": "information retrieval is a field of study."},
    +        {"text": "information retrieval focuses on finding relevant information in large datasets."},
    +        {"text": "data mining and information retrieval overlap in research."}       
    +    ],
    +    "collectionName": "demo"
    +}'
    +
    +

    將資料插入資料庫後,您就可以使用原始文字查詢來執行全文檢索。Milvus 會自動將您的查詢轉換成稀疏向量,並使用 BM25 演算法對匹配的搜尋結果進行排序,然後傳回 topK (limit) 結果。

    + +
    search_params = {​
    +    'params': {'drop_ratio_search': 0.2},​
    +}​
    +​
    +client.search(​
    +    collection_name='demo', ​
    +    data=['whats the focus of information retrieval?'],​
    +    anns_field='sparse',​
    +    limit=3,​
    +    search_params=search_params​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq;
    +import io.milvus.v2.service.vector.request.data.EmbeddedText;
    +import io.milvus.v2.service.vector.response.SearchResp;
    +
    +Map<String,Object> searchParams = new HashMap<>();
    +searchParams.put("drop_ratio_search", 0.2);
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("demo")
    +        .data(Collections.singletonList(new EmbeddedText("whats the focus of information retrieval?")))
    +        .annsField("sparse")
    +        .topK(3)
    +        .searchParams(searchParams)
    +        .outputFields(Collections.singletonList("text"))
    +        .build());
    +
    +
    await client.search(
    +    collection_name: 'demo', 
    +    data: ['whats the focus of information retrieval?'],
    +    anns_field: 'sparse',
    +    limit: 3,
    +    params: {'drop_ratio_search': 0.2},
    +)
    +
    +
    curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +--data-raw '{
    +    "collectionName": "demo",
    +    "data": [
    +        "whats the focus of information retrieval?"
    +    ],
    +    "annsField": "sparse",
    +    "limit": 3,
    +    "outputFields": [
    +        "text"
    +    ],
    +    "searchParams":{
    +        "params":{
    +            "drop_ratio_search":0.2
    +        }
    +    }
    +}'
    +
    +

    參數

    +

    說明

    +

    search_params

    +

    包含搜尋參數的字典。

    +

    params.drop_ratio_search

    +

    搜尋時要忽略的低頻詞比例。如需詳細資訊,請參閱Sparse Vector

    +

    data

    +

    原始查詢文字。

    +

    anns_field

    +

    包含內部產生的稀疏向量的欄位名稱。

    +

    limit

    +

    要返回的最大頂端匹配數目。

    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.json new file mode 100644 index 000000000..b896cd10a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"color\": \"pink_8682\"},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"color\": \"red_7025\"},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"color\": \"orange_6781\"},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"color\": \"pink_9298\"},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"color\": \"red_4794\"},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"color\": \"yellow_4222\"},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"color\": \"red_9392\"},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"color\": \"grey_8510\"},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"color\": \"white_9381\"},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"color\": \"purple_4976\"},​\n]​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nprint(res)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.GetReq​\nimport io.milvus.v2.service.vector.request.GetResp​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nGetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .ids(Arrays.asList(0, 1, 2))​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\nList results = getResp.getGetResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.get({​\n collection_name=\"query_collection\",​\n ids=[0,1,2],​\n output_fields=[\"vector\", \"color\"]​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# {\"code\":0,\"cost\":0,\"data\":[{\"color\":\"pink_8682\",\"id\":0,\"vector\":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"orange_6781\",\"id\":2,\"vector\":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n\n","​\nimport io.milvus.v2.service.vector.request.QueryReq​\nimport io.milvus.v2.service.vector.request.QueryResp​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Arrays.asList(\"vector\", \"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\nList results = getResp.getQueryResults();​\nfor (QueryResp.QueryResult result : results) {​\n System.out.println(result.getEntity());​\n}​\n​\n// Output​\n// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​\n// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​\n// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n)​\n​\nfunc ExampleClient_Query_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n resultSet, err := cli.Query(ctx, client.NewQueryOption(\"query_collection\").​\n WithFilter(`color like \"red%\"`).​\n WithOutputFields(\"vector\", \"color\").​\n WithLimit(3))​\n​\n fmt.Println(resultSet.GetColumn(\"color\"))​\n}​\n​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nconst res = client.query({​\n collection_name=\"quick_setup\",​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n#{\"code\":0,\"cost\":0,\"data\":[{\"color\":\"red_7025\",\"id\":1,\"vector\":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{\"color\":\"red_4794\",\"id\":4,\"vector\":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{\"color\":\"red_9392\",\"id\":6,\"vector\":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​\n\n","from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","import io.milvus.orm.iterator.QueryIterator;​\nimport io.milvus.response.QueryResultsWrapper;​\nimport io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.QueryIteratorReq;​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n​\nwhile (true) {​\n List res = queryIterator.next();​\n if (res.isEmpty()) {​\n queryIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n​\n// Output​\n// [color:red_7025, id:1]​\n// [color:red_4794, id:4]​\n// [color:red_9392, id:6]​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","# Currently not available\n\n","from pymilvus import MilvusClient​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.get(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n ids=[0, 1, 2],​\n output_fields=[\"vector\", \"color\"]​\n)​\n​\nfrom pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nres = client.query(​\n collection_name=\"query_collection\",​\n # highlight-next-line​\n partitionNames=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit=3​\n)​\n​\n# 使用 QueryIterator​\nfrom pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\ncollection = Collection(\"query_collection\")​\n​\niterator = collection.query_iterator(​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n batch_size=10,​\n expr=\"color like \\\"red%\\\"\",​\n output_fields=[\"color\"]​\n)​\n​\nresults = []​\n​\nwhile True:​\n result = iterator.next()​\n if not result:​\n iterator.close()​\n break​\n​\n print(result)​\n results += result​\n\n","GetReq getReq = GetReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionName(\"partitionA\")​\n .ids(Arrays.asList(10, 11, 12))​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nGetResp getResp = client.get(getReq);​\n​\n​\nQueryReq queryReq = QueryReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .filter(\"color like \\\"red%\\\"\")​\n .outputFields(Collections.singletonList(\"color\"))​\n .limit(3)​\n .build();​\n​\nQueryResp getResp = client.query(queryReq);​\n​\n​\nQueryIteratorReq req = QueryIteratorReq.builder()​\n .collectionName(\"query_collection\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .expr(\"color like \\\"red%\\\"\")​\n .batchSize(50L)​\n .outputFields(Collections.singletonList(\"color\"))​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\nQueryIterator queryIterator = client.queryIterator(req);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 使用 Get 方法​\nvar res = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter='color like \"red%\"',​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 使用 Query 方法​\nres = client.query({​\n collection_name=\"query_collection\",​\n // highlight-next-line​\n partition_names=[\"partitionA\"],​\n filter=\"color like \\\"red%\\\"\",​\n output_fields=[\"vector\", \"color\"],​\n limit(3)​\n})​\n​\n// 暂不支持使用 QueryIterator​\nconst iterator = await milvusClient.queryIterator({​\n collection_name: 'query_collection',​\n partition_names: ['partitionA'],​\n batchSize: 10,​\n expr: 'color like \"red%\"',​\n output_fields: ['vector', 'color'],​\n});​\n​\nconst results = [];​\nfor await (const value of iterator) {​\n results.push(...value);​\n page += 1;​\n}​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\n# 使用 Get 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"id\": [0, 1, 2],​\n \"outputFields\": [\"vector\", \"color\"]​\n}'​\n​\n# 使用 Query 方法​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/get\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"query_collection\",​\n \"partitionNames\": [\"partitionA\"],​\n \"filter\": \"color like \\\"red%\\\"\",​\n \"limit\": 3,​\n \"outputFields\": [\"vector\", \"color\"],​\n \"id\": [0, 1, 2]​\n}'​\n\n"],"headingContent":"Query​","anchorList":[{"label":"查詢","href":"Query​","type":1,"isActive":false},{"label":"總覽","href":"Overview​","type":2,"isActive":false},{"label":"使用 Get","href":"Use-Get​","type":2,"isActive":false},{"label":"使用查詢","href":"Use-Query​","type":2,"isActive":false},{"label":"使用查詢迭代器","href":"Use-QueryIterator​","type":2,"isActive":false},{"label":"分區中的查詢","href":"Queries-in-Partitions​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.md new file mode 100644 index 000000000..2c097b747 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/get-and-scalar-query.md @@ -0,0 +1,584 @@ +--- +id: get-and-scalar-query.md +summary: 除了 ANN 搜尋,Milvus 也支援透過查詢來過濾元資料。本頁介紹如何使用 Query、Get 和 QueryIterators 來執行元資料篩選。 +title: 查詢 +--- +

    查詢

    除了 ANN 搜尋,Milvus 也支援透過查詢來過濾元資料。本頁介紹如何使用 Query、Get 和 QueryIterators 來執行元資料篩選。

    +

    總覽

    一個 Collection 可以儲存各種類型的標量欄位。你可以讓 Milvus 基於一個或多個標量欄位篩選 Entities。Milvus 提供三種類型的查詢:Query、Get 和 QueryIterator。下表比較了這三種查詢類型。

    +

    +

    獲取

    +

    查詢

    +

    查詢迭代器

    +

    適用場景

    +

    要尋找持有指定主鍵的實體。

    +

    +

    尋找符合自訂篩選條件的所有或指定數量的實體

    +

    在分頁查詢中尋找符合自訂篩選條件的所有實體。

    +

    篩選方法

    +

    透過主鍵

    +

    透過篩選表達式。

    +

    透過篩選表達式。

    +

    必須參數

    +
    • 集合名稱

    • +
    • 主鍵

    +

    +
    • 集合名稱

    • +
    • 篩選表達式

    +
    • 收藏集名稱

    • +
    • 篩選表達式

    • +
    • 每次查詢要返回的實體數量

    +

    可選參數

    +
    • 分區名稱

    • +
    • 輸出欄位

    +
    • 分區名稱

    • +
    • 要返回的實體數量

    • +
    • 輸出欄位

    +
    • 分區名稱

    • +
    • 要返回的實體總數

    • +
    • 輸出欄位

    +

    返回值

    +

    回傳指定集合或分割區中持有指定主索引鍵的實體。

    +

    傳回指定集合或分割區中符合自訂篩選條件的所有或指定數量的實體。

    +

    透過分頁查詢傳回指定集合或分割區中符合自訂篩選條件的所有實體。

    +
    +

    如需關於元資料篩選的更多資訊,請參閱元資料篩選

    +

    使用 Get

    當您需要根據主鍵尋找實體時,您可以使用Get方法。以下程式碼範例假設在您的集合中有三個欄位名為id,vector, 和color ,並傳回主索引鍵為1,2, 和3 的實體。

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "color": "orange_6781"},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "color": "pink_9298"},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "color": "red_4794"},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "color": "yellow_4222"},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "color": "red_9392"},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "color": "grey_8510"},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "color": "white_9381"},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "color": "purple_4976"},​
    +]​
    +
    +
    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +print(res)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.GetReq​
    +import io.milvus.v2.service.vector.request.GetResp​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +        ​
    +GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .ids(Arrays.asList(0, 1, 2))​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getGetResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=pink_8682, vector=[0.35803765, -0.6023496, 0.18414013, -0.26286206, 0.90294385], id=0}​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=orange_6781, vector=[0.43742132, -0.55975026, 0.6457888, 0.7894059, 0.20785794], id=2}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.get({​
    +    collection_name="query_collection",​
    +    ids=[0,1,2],​
    +    output_fields=["vector", "color"]​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# {"code":0,"cost":0,"data":[{"color":"pink_8682","id":0,"vector":[0.35803765,-0.6023496,0.18414013,-0.26286206,0.90294385]},{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"orange_6781","id":2,"vector":[0.43742132,-0.55975026,0.6457888,0.7894059,0.20785794]}]}​
    +
    +
    +

    使用查詢

    當您需要透過自訂篩選條件尋找實體時,請使用 Query 方法。下面的程式碼範例假設有三個欄位名為id,vector, 和color ,並傳回以red 開始持有color 值的指定數量的實體。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +
    +
    +
    ​
    +import io.milvus.v2.service.vector.request.QueryReq​
    +import io.milvus.v2.service.vector.request.QueryResp​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Arrays.asList("vector", "color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +List<QueryResp.QueryResult> results = getResp.getQueryResults();​
    +for (QueryResp.QueryResult result : results) {​
    +    System.out.println(result.getEntity());​
    +}​
    +​
    +// Output​
    +// {color=red_7025, vector=[0.19886813, 0.060235605, 0.6976963, 0.26144746, 0.8387295], id=1}​
    +// {color=red_4794, vector=[0.44523495, -0.8757027, 0.82207793, 0.4640629, 0.3033748], id=4}​
    +// {color=red_9392, vector=[0.8371978, -0.015764369, -0.31062937, -0.56266695, -0.8984948], id=6}​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +)​
    +​
    +func ExampleClient_Query_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    resultSet, err := cli.Query(ctx, client.NewQueryOption("query_collection").​
    +        WithFilter(`color like "red%"`).​
    +        WithOutputFields("vector", "color").​
    +        WithLimit(3))​
    +​
    +    fmt.Println(resultSet.GetColumn("color"))​
    +}​
    +​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +const res = client.query({​
    +    collection_name="quick_setup",​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +#{"code":0,"cost":0,"data":[{"color":"red_7025","id":1,"vector":[0.19886813,0.060235605,0.6976963,0.26144746,0.8387295]},{"color":"red_4794","id":4,"vector":[0.44523495,-0.8757027,0.82207793,0.4640629,0.3033748]},{"color":"red_9392","id":6,"vector":[0.8371978,-0.015764369,-0.31062937,-0.56266695,-0.8984948]}]}​
    +
    +
    +

    使用查詢迭代器

    當您需要透過分頁查詢以自訂過濾條件尋找實體時,請建立一個QueryIterator,並使用其next()方法遍歷所有實體,以找出符合過濾條件的實體。以下程式碼範例假設有三個欄位,分別命名為id,vector, 和color ,並返回所有持有color 值的實體,從red 開始。

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    import io.milvus.orm.iterator.QueryIterator;​
    +import io.milvus.response.QueryResultsWrapper;​
    +import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.QueryIteratorReq;​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = queryIterator.next();​
    +    if (res.isEmpty()) {​
    +        queryIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +​
    +// Output​
    +// [color:red_7025, id:1]​
    +// [color:red_4794, id:4]​
    +// [color:red_9392, id:6]​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    # Currently not available
    +
    +
    +

    分區中的查詢

    您也可以透過在 Get、Query 或 QueryIterator 請求中包含分區名稱,在一個或多個分區中執行查詢。以下程式碼範例假設集合中有一個名為PartitionA的分割區。

    + +
    from pymilvus import MilvusClient​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.get(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    ids=[0, 1, 2],​
    +    output_fields=["vector", "color"]​
    +)​
    +​
    +from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +res = client.query(​
    +    collection_name="query_collection",​
    +    # highlight-next-line​
    +    partitionNames=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit=3​
    +)​
    +​
    +# 使用 QueryIterator​
    +from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +collection = Collection("query_collection")​
    +​
    +iterator = collection.query_iterator(​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    batch_size=10,​
    +    expr="color like \"red%\"",​
    +    output_fields=["color"]​
    +)​
    +​
    +results = []​
    +​
    +while True:​
    +    result = iterator.next()​
    +    if not result:​
    +        iterator.close()​
    +        break​
    +​
    +    print(result)​
    +    results += result​
    +
    +
    +
    GetReq getReq = GetReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionName("partitionA")​
    +        .ids(Arrays.asList(10, 11, 12))​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +GetResp getResp = client.get(getReq);​
    +​
    +​
    +QueryReq queryReq = QueryReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .filter("color like \"red%\"")​
    +        .outputFields(Collections.singletonList("color"))​
    +        .limit(3)​
    +        .build();​
    +​
    +QueryResp getResp = client.query(queryReq);​
    +​
    +​
    +QueryIteratorReq req = QueryIteratorReq.builder()​
    +        .collectionName("query_collection")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .expr("color like \"red%\"")​
    +        .batchSize(50L)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +QueryIterator queryIterator = client.queryIterator(req);​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 使用 Get 方法​
    +var res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter='color like "red%"',​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 使用 Query 方法​
    +res = client.query({​
    +    collection_name="query_collection",​
    +    // highlight-next-line​
    +    partition_names=["partitionA"],​
    +    filter="color like \"red%\"",​
    +    output_fields=["vector", "color"],​
    +    limit(3)​
    +})​
    +​
    +// 暂不支持使用 QueryIterator​
    +const iterator = await milvusClient.queryIterator({​
    +  collection_name: 'query_collection',​
    +  partition_names: ['partitionA'],​
    +  batchSize: 10,​
    +  expr: 'color like "red%"',​
    +  output_fields: ['vector', 'color'],​
    +});​
    +​
    +const results = [];​
    +for await (const value of iterator) {​
    +  results.push(...value);​
    +  page += 1;​
    +}​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +# 使用 Get 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "id": [0, 1, 2],​
    +    "outputFields": ["vector", "color"]​
    +}'​
    +​
    +# 使用 Query 方法​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/get" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "query_collection",​
    +    "partitionNames": ["partitionA"],​
    +    "filter": "color like \"red%\"",​
    +    "limit": 3,​
    +    "outputFields": ["vector", "color"],​
    +    "id": [0, 1, 2]​
    +}'​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.json new file mode 100644 index 000000000..386a3698b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.json @@ -0,0 +1 @@ +{"codeList":["[​\n {\"id\": 0, \"vector\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], \"chunk\": \"pink_8682\", \"docId\": 1},​\n {\"id\": 1, \"vector\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], \"chunk\": \"red_7025\", \"docId\": 5},​\n {\"id\": 2, \"vector\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], \"chunk\": \"orange_6781\", \"docId\": 2},​\n {\"id\": 3, \"vector\": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], \"chunk\": \"pink_9298\", \"docId\": 3},​\n {\"id\": 4, \"vector\": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], \"chunk\": \"red_4794\", \"docId\": 3},​\n {\"id\": 5, \"vector\": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], \"chunk\": \"yellow_4222\", \"docId\": 4},​\n {\"id\": 6, \"vector\": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], \"chunk\": \"red_9392\", \"docId\": 1},​\n {\"id\": 7, \"vector\": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], \"chunk\": \"grey_8510\", \"docId\": 2},​\n {\"id\": 8, \"vector\": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], \"chunk\": \"white_9381\", \"docId\": 5},​\n {\"id\": 9, \"vector\": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], \"chunk\": \"purple_4976\", \"docId\": 3},​\n]​\n​\n\n","from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vectors = [​\n [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​\n​\n# Group search results​\nres = client.search(​\n collection_name=\"group_search_collection\",​\n data=query_vectors,​\n limit=3,​\n group_by_field=\"docId\",​\n output_fields=[\"docId\"]​\n)​\n​\n# Retrieve the values in the `docId` column​\ndoc_ids = [result['entity']['docId'] for result in res[0]]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .groupByFieldName(\"docId\")​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n\n","// nolint​\nfunc ExampleClient_Search_grouping() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ).WithGroupByField(\"docId\"))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n // highlight-start​\n group_by_field: \"docId\"​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"groupingField\": \"docId\",​\n \"outputFields\": [\"docId\"]​\n}'​\n\n","# Group search results​\n​\nres = client.search(​\n collection_name=\"group_search_collection\", ​\n data=query_vectors, # Query vector\n limit=5, # Top K results​ to return​\n group_by_field=\"docId\", # Group by docId​\n group_size=2, # Return 2 entities per group​\n strict_group_size=True, # Ensure each group has 2 entities​\n output_fields=[\"docId\"]​\n)​\n\n","FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"group_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .groupByFieldName(\"docId\")​\n .groupSize(2)​\n .strictGroupSize(true)​\n .outputFields(Collections.singletonList(\"docId\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​\n// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​\n// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​\n// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: [query_vector],​\n limit: 3,​\n group_by_field: \"docId\",​\n // highlight-start​\n group_size: 2,​\n strict_group_size: true​\n // highlight-end​\n})​\n​\n// Retrieve the values in the `docId` column​\nvar docIds = res.results.map(result => result.entity.docId)​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"group_search_collection\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 5,​\n \"groupingField\": \"docId\",​\n \"groupSize\":2,​\n \"strictGroupSize\":true,​\n \"outputFields\": [\"docId\"]​\n}'​\n\n"],"headingContent":"Grouping Search​","anchorList":[{"label":"分組搜尋","href":"Grouping-Search​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"執行群組搜尋","href":"Perform-Grouping-Search​","type":2,"isActive":false},{"label":"設定群組大小","href":"Configure-group-size​","type":2,"isActive":false},{"label":"注意事項","href":"Considerations​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.md new file mode 100644 index 000000000..51593a490 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/grouping-search.md @@ -0,0 +1,361 @@ +--- +id: grouping-search.md +summary: >- + 分組搜尋允許 Milvus 以指定欄位的值來對搜尋結果進行分組,從而在更高層次聚合資料。例如,您可以使用基本的 ANN + 搜尋來尋找與手邊這本書類似的書籍,但您可以使用分組搜尋來尋找可能涉及該書討論主題的書籍類別。本主題將說明如何使用群組搜尋以及主要注意事項。 +title: 群組搜尋 +--- +

    分組搜尋

    分組搜尋允許 Milvus 根據指定欄位的值來對搜尋結果進行分組,從而在更高層次聚合資料。例如,您可以使用基本的 ANN 搜尋來尋找與手邊的書籍相似的書籍,但您可以使用分組搜尋來尋找可能涉及該書籍所討論主題的書籍類別。本主題將說明如何使用群組搜尋以及主要注意事項。

    +

    概述

    當搜尋結果中的實體在標量欄位中具有相同值時,這表示它們在特定屬性上相似,這可能會對搜尋結果造成負面影響。

    +

    假設一個集合儲存了多個文件(以docId 表示)。在將文件轉換為向量時,為了盡可能保留語義資訊,每份文件都會被分割成較小的、可管理的段落 (或小塊),並儲存為獨立的實體。即使文件被分割成較小的段落,使用者通常仍有興趣找出哪些文件與他們的需求最相關。

    +

    + + ANN Search + ANN 搜尋

    +

    對這樣的文集執行近似最近鄰 (ANN) 搜尋時,搜尋結果可能會包含來自同一個文件的數個段落,有可能導致其他文件被忽略,這可能與預期的使用個案不符。

    +

    + + Grouping Search + 群組搜尋

    +

    為了改善搜尋結果的多樣性,您可以在搜尋請求中加入group_by_field 參數,以啟用群組搜尋。如圖所示,您可以將group_by_field 設為docId 。收到此請求後,Milvus 會

    +
      +
    • 根據提供的查詢向量執行 ANN 搜尋,找出與查詢最相似的所有實體。

    • +
    • 根據指定的group_by_field 對搜尋結果進行分組,例如docId

    • +
    • 根據limit 參數的定義,傳回每個群組最頂端的結果,並從每個群組中找出最相似的實體。

    • +
    +
    +

    預設情況下,「群組搜尋」只會回傳每個群組的一個實體。如果要增加每個群組返回的結果數量,可以使用group_sizestrict_group_size 參數來控制。

    +
    +

    執行群組搜尋

    本節提供範例程式碼來示範如何使用 Grouping Search。以下範例假設集合包含id,vector,chunk, 和docId 的欄位。

    +
    [​
    +        {"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "chunk": "pink_8682", "docId": 1},​
    +        {"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "chunk": "red_7025", "docId": 5},​
    +        {"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "chunk": "orange_6781", "docId": 2},​
    +        {"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "chunk": "pink_9298", "docId": 3},​
    +        {"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "chunk": "red_4794", "docId": 3},​
    +        {"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "chunk": "yellow_4222", "docId": 4},​
    +        {"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "chunk": "red_9392", "docId": 1},​
    +        {"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "chunk": "grey_8510", "docId": 2},​
    +        {"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "chunk": "white_9381", "docId": 5},​
    +        {"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "chunk": "purple_4976", "docId": 3},​
    +]​
    +​
    +
    +
    +

    在搜索請求中,將group_by_fieldoutput_fields 都設為docId 。Milvus 會依據指定欄位將結果分組,並從每個組中傳回最相似的實體,包括每個傳回實體的docId 值。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vectors = [​
    +    [0.14529211512077012, 0.9147257273453546, 0.7965055218724449, 0.7009258593102812, 0.5605206522382088]]​
    +​
    +# Group search results​
    +res = client.search(​
    +    collection_name="group_search_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +    group_by_field="docId",​
    +    output_fields=["docId"]​
    +)​
    +​
    +# Retrieve the values in the `docId` column​
    +doc_ids = [result['entity']['docId'] for result in res[0]]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .groupByFieldName("docId")​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +
    +
    +
    // nolint​
    +func ExampleClient_Search_grouping() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,               // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ).WithGroupByField("docId"))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    // highlight-start​
    +    group_by_field: "docId"​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "groupingField": "docId",​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    在上述請求中,limit=3 表示系統將從三個群組傳回搜尋結果,每個群組包含與查詢向量最相似的單一實體。

    +

    設定群組大小

    預設情況下,「群組搜尋」每個群組只會傳回一個實體。如果您想要每個群組有多個結果,請調整group_sizestrict_group_size 參數。

    + +
    # Group search results​
    +​
    +res = client.search(​
    +    collection_name="group_search_collection", ​
    +    data=query_vectors, # Query vector
    +    limit=5, # Top K results​ to return​
    +    group_by_field="docId", # Group by docId​
    +    group_size=2, # Return 2 entities per group​
    +    strict_group_size=True, # Ensure each group has 2 entities​
    +    output_fields=["docId"]​
    +)​
    +
    +
    +
    FloatVec queryVector = new FloatVec(new float[]{0.14529211512077012f, 0.9147257273453546f, 0.7965055218724449f, 0.7009258593102812f, 0.5605206522382088f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("group_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .groupByFieldName("docId")​
    +        .groupSize(2)​
    +        .strictGroupSize(true)​
    +        .outputFields(Collections.singletonList("docId"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={docId=5}, score=0.74767184, id=1)​
    +// SearchResp.SearchResult(entity={docId=5}, score=-0.49148706, id=8)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.6254269, id=7)​
    +// SearchResp.SearchResult(entity={docId=2}, score=0.38515577, id=2)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.3611898, id=3)​
    +// SearchResp.SearchResult(entity={docId=3}, score=0.19556211, id=4)​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: [query_vector],​
    +    limit: 3,​
    +    group_by_field: "docId",​
    +    // highlight-start​
    +    group_size: 2,​
    +    strict_group_size: true​
    +    // highlight-end​
    +})​
    +​
    +// Retrieve the values in the `docId` column​
    +var docIds = res.results.map(result => result.entity.docId)​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "group_search_collection",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 5,​
    +    "groupingField": "docId",​
    +    "groupSize":2,​
    +    "strictGroupSize":true,​
    +    "outputFields": ["docId"]​
    +}'​
    +
    +
    +

    在上面的範例中

    +
      +
    • group_size:指定每個群組想要傳回的實體數量。例如,設定group_size=2 表示每個群組 (或每個docId) 最好能傳回兩個最相似的段落 (或小塊)。如果group_size 未設定,系統預設為每組傳回一個結果。

    • +
    • strict_group_size:這個布林參數控制系統是否應該嚴格執行group_size 所設定的計數。當strict_group_size=True 時,系統會嘗試在每個群組中包含group_size 所指定的精確實體數目 (例如,兩個段落),除非該群組中沒有足夠的資料。根據預設 (strict_group_size=False),系統會優先滿足limit 參數所指定的群組數目,而不是確保每個群組都包含group_size 實體。在資料分佈不平均的情況下,此方法通常較有效率。

    • +
    +

    有關其他參數的詳細資訊,請參閱search()

    +

    注意事項

      +
    • 群組數量limit 參數控制返回搜尋結果的群組數目,而非每個群組內實體的特定數目。設定適當的limit 有助於控制搜尋多樣性和查詢效能。如果資料分佈密集或效能是個問題,減少limit 可以降低計算成本。

    • +
    • 每個群組的實體group_size 參數控制每個群組傳回的實體數量。根據您的使用情況調整group_size 可以增加搜尋結果的豐富性。但是,如果資料分佈不均勻,某些群組返回的實體可能少於group_size 指定的數目,尤其是在資料有限的情況下。

    • +
    • 嚴格的群組大小:當strict_group_size=True 時,系統會嘗試為每個群組傳回指定數量的實體 (group_size),除非該群組沒有足夠的資料。此設定可確保每個群組的實體數量一致,但在資料分佈不均或資源有限的情況下,可能會導致效能下降。如果不需要嚴格的實體數量,設定strict_group_size=False 可以提高查詢速度。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.json new file mode 100644 index 000000000..cadf07a8a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient, DataType​\n​\nschema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=1000, ​\n enable_analyzer=True, # Whether to enable text analysis for this field​\n enable_match=True # Whether to enable text match​\n)​\n\n","import io.milvus.v2.common.DataType;\nimport io.milvus.v2.service.collection.request.AddFieldReq;\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;\n\nCreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()\n .enableDynamicField(false)\n .build();\n\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(1000)\n .enableAnalyzer(true)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 1000,\n \"enable_analyzer\": true,\n \"enable_match\": true\n }\n },\n {\n \"fieldName\": \"sparse\",\n \"dataType\": \"SparseFloatVector\"\n }\n ]\n }'\n\n","analyzer_params={​\n \"type\": \"english\"​\n}​\n​\nschema.add_field(​\n field_name='text', ​\n datatype=DataType.VARCHAR, ​\n max_length=200, ​\n enable_analyzer=True,​\n analyzer_params=analyzer_params,​\n enable_match=True, ​\n)​\n\n","Map analyzerParams = new HashMap<>();\nanalyzerParams.put(\"type\", \"english\");\nschema.addField(AddFieldReq.builder()\n .fieldName(\"text\")\n .dataType(DataType.VarChar)\n .maxLength(200)\n .enableAnalyzer(true)\n .analyzerParams(analyzerParams)\n .enableMatch(true)\n .build());\n\n","const schema = [\n {\n name: \"id\",\n data_type: DataType.Int64,\n is_primary_key: true,\n },\n {\n name: \"text\",\n data_type: \"VarChar\",\n enable_analyzer: true,\n enable_match: true,\n max_length: 1000,\n analyzer_params: { type: 'english' },\n },\n {\n name: \"sparse\",\n data_type: DataType.SparseFloatVector,\n },\n];\n\n","export schema='{\n \"autoId\": true,\n \"enabledDynamicField\": false,\n \"fields\": [\n {\n \"fieldName\": \"id\",\n \"dataType\": \"Int64\",\n \"isPrimary\": true\n },\n {\n \"fieldName\": \"text\",\n \"dataType\": \"VarChar\",\n \"elementTypeParams\": {\n \"max_length\": 200,\n \"enable_analyzer\": true,\n \"enable_match\": true,\n \"analyzer_params\": {\"type\": \"english\"}\n }\n },\n {\n \"fieldName\": \"my_vector\",\n \"dataType\": \"FloatVector\",\n \"elementTypeParams\": {\n \"dim\": \"5\"\n }\n }\n ]\n }'\n\n","TEXT_MATCH(field_name, text)​\n\n","filter = \"TEXT_MATCH(text, 'machine deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine deep')\";\n","export filter=\"\\\"TEXT_MATCH(text, 'machine deep')\\\"\"\n","filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"​\n","String filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\";\n","const filter = \"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\"\n","export filter=\"\\\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\\\"\"\n","filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\"\n","String filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","const filter = \"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\";\n","export filter=\"\\\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\\\"\"\n","# Match entities with `keyword1` or `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1 keyword2')\"​\n​\n# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​\nresult = MilvusClient.search(​\n collection_name=\"YOUR_COLLECTION_NAME\", # Your collection name​\n anns_field=\"embeddings\", # Vector field name​\n data=[query_vector], # Query vector​\n filter=filter,​\n search_params={\"params\": {\"nprobe\": 10}},​\n limit=10, # Max. number of results to return​\n output_fields=[\"id\", \"text\"] # Fields to return​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\nSearchResp searchResp = client.search(SearchReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .annsField(\"embeddings\")\n .data(Collections.singletonList(queryVector)))\n .filter(filter)\n .topK(10)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build());\n","// Match entities with `keyword1` or `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1 keyword2')\";\n\n// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field\nconst result = await client.search(\n collection_name: \"YOUR_COLLECTION_NAME\", // Your collection name\n anns_field: \"embeddings\", // Vector field name\n data: [query_vector], // Query vector\n filter: filter,\n params: {\"nprobe\": 10},\n limit: 10, // Max. number of results to return\n output_fields: [\"id\", \"text\"] //Fields to return\n);\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1 keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"annsField\": \"my_vector\",\n \"data\": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],\n \"filter\": '\"$filter\"',\n \"searchParams\": {\n \"params\": {\n \"nprobe\": 10\n }\n },\n \"limit\": 3,\n \"outputFields\": [\"text\",\"id\"]\n}'\n","# Match entities with both `keyword1` and `keyword2`​\nfilter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\"​\n​\nresult = MilvusClient.query(​\n collection_name=\"YOUR_COLLECTION_NAME\",​\n filter=filter, ​\n output_fields=[\"id\", \"text\"]​\n)​\n\n","String filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nQueryResp queryResp = client.query(QueryReq.builder()\n .collectionName(\"YOUR_COLLECTION_NAME\")\n .filter(filter)\n .outputFields(Arrays.asList(\"id\", \"text\"))\n .build()\n);\n","// Match entities with both `keyword1` and `keyword2`\nconst filter = \"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\";\n\nconst result = await client.query(\n collection_name: \"YOUR_COLLECTION_NAME\",\n filter: filter, \n output_fields: [\"id\", \"text\"]\n)\n","export filter=\"\\\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\\\"\"\n\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"\nexport TOKEN=\"root:Milvus\"\n\ncurl --request POST \\\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/query\" \\\n--header \"Authorization: Bearer ${TOKEN}\" \\\n--header \"Content-Type: application/json\" \\\n-d '{\n \"collectionName\": \"demo2\",\n \"filter\": '\"$filter\"',\n \"outputFields\": [\"id\", \"text\"]\n}'\n"],"headingContent":"Text Match​","anchorList":[{"label":"文字匹配","href":"Text-Match​","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"啟用文字匹配","href":"Enable-text-match","type":2,"isActive":false},{"label":"使用文字匹配","href":"Use-text-match","type":2,"isActive":false},{"label":"注意事項","href":"Considerations","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.md new file mode 100644 index 000000000..464e2f807 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/keyword-match.md @@ -0,0 +1,428 @@ +--- +id: keyword-match.md +summary: >- + Milvus + 中的文字匹配功能可根據特定術語進行精確的文件檢索。此功能主要用於滿足特定條件的篩選搜尋,並可結合標量篩選來精細查詢結果,允許在符合標量條件的向量內進行相似性搜尋。 +title: 文字匹配 +--- +

    文字匹配

    Milvus 中的文字匹配可根據特定術語進行精確的文件檢索。此功能主要用於滿足特定條件的篩選搜尋,並可結合標量篩選來精細查詢結果,允許在符合標量條件的向量內進行相似性搜尋。

    +
    +

    文字匹配著重於尋找查詢字詞的精確出現,而不會對匹配文件的相關性進行評分。如果您想要根據查詢字詞的語意和重要性擷取最相關的文件,我們建議您使用全文檢索。

    +
    +

    概述

    Milvus 整合了Tantivy來提供底層的倒排索引和基於詞彙的文字搜尋。對於每一個文本條目,Milvus 都會按照以下程序建立索引。

    +
      +
    1. 分析器:分析器會將輸入的文字標記化為單獨的字詞或標記,然後根據需要套用篩選器。這可讓 Milvus 根據這些標記建立索引。

    2. +
    3. 建立索引:在文字分析之後,Milvus 會建立反向索引,將每個獨特的標記映射到包含該標記的文件。

    4. +
    +

    當使用者執行文字比對時,倒置索引會被用來快速擷取所有包含該詞彙的文件。這比逐一掃描每個文件要快得多。

    +

    + + Text Match + 文字匹配

    +

    啟用文字匹配

    文字匹配對VARCHAR 欄位類型有效,它基本上是 Milvus 中的字串資料類型。要啟用文字匹配,請將enable_analyzerenable_match 都設定為True ,然後在定義收集模式時,選擇性地設定文字分析的分析器。

    +

    設定enable_analyzerenable_match

    要啟用特定VARCHAR 欄位的文字匹配,在定義欄位模式時,將enable_analyzerenable_match 參數都設定為True 。這會指示 Milvus 將文字標記化,並為指定欄位建立反向索引,以進行快速有效的文字匹配。

    + +
    from pymilvus import MilvusClient, DataType​
    +​
    +schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=1000, ​
    +    enable_analyzer=True, # Whether to enable text analysis for this field​
    +    enable_match=True # Whether to enable text match​
    +)​
    +
    +
    +
    import io.milvus.v2.common.DataType;
    +import io.milvus.v2.service.collection.request.AddFieldReq;
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;
    +
    +CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
    +        .enableDynamicField(false)
    +        .build();
    +
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(1000)
    +        .enableAnalyzer(true)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 1000,
    +                    "enable_analyzer": true,
    +                    "enable_match": true
    +                }
    +            },
    +            {
    +                "fieldName": "sparse",
    +                "dataType": "SparseFloatVector"
    +            }
    +        ]
    +    }'
    +
    +
    +

    可選:設定分析器

    文字匹配的效能與精確度取決於所選擇的分析器。不同的分析器是針對各種語言和文字結構量身打造的,因此選擇正確的分析器可以顯著影響您特定使用個案的搜尋結果。

    +

    預設情況下,Milvus 使用standard 分析器,它會根據空白和標點符號來標記文字,移除長於 40 個字元的標記,並將文字轉換為小寫。應用此預設設定不需要額外參數。如需詳細資訊,請參閱標準

    +

    在需要不同分析器的情況下,您可以使用analyzer_params 參數設定一個分析器。例如,應用english 分析器來處理英文文字。

    + +
    analyzer_params={​
    +    "type": "english"​
    +}​
    +​
    +schema.add_field(​
    +    field_name='text', ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=200, ​
    +    enable_analyzer=True,​
    +    analyzer_params=analyzer_params,​
    +    enable_match=True, ​
    +)​
    +
    +
    +
    Map<String, Object> analyzerParams = new HashMap<>();
    +analyzerParams.put("type", "english");
    +schema.addField(AddFieldReq.builder()
    +        .fieldName("text")
    +        .dataType(DataType.VarChar)
    +        .maxLength(200)
    +        .enableAnalyzer(true)
    +        .analyzerParams(analyzerParams)
    +        .enableMatch(true)
    +        .build());
    +
    +
    +
    const schema = [
    +  {
    +    name: "id",
    +    data_type: DataType.Int64,
    +    is_primary_key: true,
    +  },
    +  {
    +    name: "text",
    +    data_type: "VarChar",
    +    enable_analyzer: true,
    +    enable_match: true,
    +    max_length: 1000,
    +    analyzer_params: { type: 'english' },
    +  },
    +  {
    +    name: "sparse",
    +    data_type: DataType.SparseFloatVector,
    +  },
    +];
    +
    +
    +
    export schema='{
    +        "autoId": true,
    +        "enabledDynamicField": false,
    +        "fields": [
    +            {
    +                "fieldName": "id",
    +                "dataType": "Int64",
    +                "isPrimary": true
    +            },
    +            {
    +                "fieldName": "text",
    +                "dataType": "VarChar",
    +                "elementTypeParams": {
    +                    "max_length": 200,
    +                    "enable_analyzer": true,
    +                    "enable_match": true,
    +                    "analyzer_params": {"type": "english"}
    +                }
    +            },
    +            {
    +                "fieldName": "my_vector",
    +                "dataType": "FloatVector",
    +                "elementTypeParams": {
    +                    "dim": "5"
    +                }
    +            }
    +        ]
    +    }'
    +
    +
    +

    Milvus 也提供其他各種適合不同語言和情境的分析器。如需詳細資訊,請參閱概述

    +

    使用文字匹配

    一旦您在收集模式中啟用了 VARCHAR 欄位的文字匹配,您可以使用TEXT_MATCH 表達式執行文字匹配。

    +

    TEXT_MATCH 表達式語法

    TEXT_MATCH 表達式用來指定欄位和要搜尋的詞彙。其語法如下。

    +
    TEXT_MATCH(field_name, text)​
    +
    +
    +
      +
    • field_name:要搜尋的 VARCHAR 欄位名稱。

    • +
    • text:要搜尋的詞彙。根據語言和設定的分析器,多個詞彙可以用空格或其他適當的分隔符分隔。

    • +
    +

    預設情況下,TEXT_MATCH 使用OR匹配邏輯,這表示它會返回包含任何指定詞彙的文件。例如,若要搜尋text 欄位中包含machinedeep 詞彙的文件,請使用下列表達式。

    + +
    filter = "TEXT_MATCH(text, 'machine deep')"​
    +
    +
    String filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    const filter = "TEXT_MATCH(text, 'machine deep')";
    +
    +
    export filter="\"TEXT_MATCH(text, 'machine deep')\""
    +
    +

    您也可以使用邏輯運算符結合多個TEXT_MATCH 表達式來執行AND匹配。

    +
      +
    • 若要搜尋text 欄位中同時包含machinedeep 的文件,請使用下列表達式。

      +

      +
      filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"​
      +
      +
      String filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')";
      +
      +
      const filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
      +
      +
      export filter="\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\""
      +
    • +
    • 若要搜尋text 欄位中同時包含machinelearning 但不包含deep 的文件,請使用下列表達式:

      +

      +
      filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')"
      +
      +
      String filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      const filter = "not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')";
      +
      +
      export filter="\"not TEXT_MATCH(text, 'deep') and TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'learning')\""
      +
    • +
    +

    使用文字匹配進行搜尋

    文字匹配可與向量相似性搜尋結合使用,以縮窄搜尋範圍並提昇搜尋效能。在向量類似性搜尋之前,先使用文字匹配篩選集合,就可以減少需要搜尋的文件數量,進而加快查詢時間。

    +

    在本範例中,filter 表達式過濾搜尋結果,使其只包含符合指定詞彙keyword1keyword2 的文件。然後,向量類似性搜尋就會在這個經過過濾的文件子集中執行。

    + +
    # Match entities with `keyword1` or `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1 keyword2')"​
    +​
    +# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field​
    +result = MilvusClient.search(​
    +    collection_name="YOUR_COLLECTION_NAME", # Your collection name​
    +    anns_field="embeddings", # Vector field name​
    +    data=[query_vector], # Query vector​
    +    filter=filter,​
    +    search_params={"params": {"nprobe": 10}},​
    +    limit=10, # Max. number of results to return​
    +    output_fields=["id", "text"] # Fields to return​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +SearchResp searchResp = client.search(SearchReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .annsField("embeddings")
    +        .data(Collections.singletonList(queryVector)))
    +        .filter(filter)
    +        .topK(10)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build());
    +
    +
    // Match entities with `keyword1` or `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1 keyword2')";
    +
    +// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
    +const result = await client.search(
    +    collection_name: "YOUR_COLLECTION_NAME", // Your collection name
    +    anns_field: "embeddings", // Vector field name
    +    data: [query_vector], // Query vector
    +    filter: filter,
    +    params: {"nprobe": 10},
    +    limit: 10, // Max. number of results to return
    +    output_fields: ["id", "text"] //Fields to return
    +);
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1 keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "annsField": "my_vector",
    +    "data": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],
    +    "filter": '"$filter"',
    +    "searchParams": {
    +        "params": {
    +            "nprobe": 10
    +        }
    +    },
    +    "limit": 3,
    +    "outputFields": ["text","id"]
    +}'
    +
    +

    使用文字匹配進行查詢

    文字匹配也可以用於查詢操作中的標量篩選。只要在query() 方法的expr 參數中指定TEXT_MATCH 表達式,就可以擷取與指定詞彙相符的文件。

    +

    下面的示例擷取text 欄位包含keyword1keyword2 兩個詞彙的文件。

    + +
    # Match entities with both `keyword1` and `keyword2`​
    +filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"​
    +​
    +result = MilvusClient.query(​
    +    collection_name="YOUR_COLLECTION_NAME",​
    +    filter=filter, ​
    +    output_fields=["id", "text"]​
    +)​
    +
    +
    +
    String filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +QueryResp queryResp = client.query(QueryReq.builder()
    +        .collectionName("YOUR_COLLECTION_NAME")
    +        .filter(filter)
    +        .outputFields(Arrays.asList("id", "text"))
    +        .build()
    +);
    +
    +
    // Match entities with both `keyword1` and `keyword2`
    +const filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";
    +
    +const result = await client.query(
    +    collection_name: "YOUR_COLLECTION_NAME",
    +    filter: filter, 
    +    output_fields: ["id", "text"]
    +)
    +
    +
    export filter="\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\""
    +
    +export CLUSTER_ENDPOINT="http://localhost:19530"
    +export TOKEN="root:Milvus"
    +
    +curl --request POST \
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
    +--header "Authorization: Bearer ${TOKEN}" \
    +--header "Content-Type: application/json" \
    +-d '{
    +    "collectionName": "demo2",
    +    "filter": '"$filter"',
    +    "outputFields": ["id", "text"]
    +}'
    +
    +

    注意事項

      +
    • 為欄位啟用文字匹配會觸發建立反向索引,這會消耗儲存資源。在決定啟用此功能時,請考慮對儲存的影響,因為它會因文字大小、獨特標記和使用的分析器而異。

    • +
    • 一旦您在模式中定義了分析器,其設定就會永久適用於該集合。如果您認為不同的分析器更符合您的需求,您可以考慮刪除現有的集合,然後以所需的分析器設定建立新的集合。

    • +
    • filter 表達式中的 Escape 規則:

      +
        +
      • 在表達式中以雙引號或單引號括住的字元會被解釋為字串常數。如果字串常數包含轉換字元,則必須使用轉換順序來表示轉換字元。例如,使用\\ 表示\ ,使用\\t 表示制表符\t ,使用\\n 表示換行符。
      • +
      • 如果字串常數由單引號括住,常數內的單引號應表示為\\' ,而雙引號可表示為"\\" 。 例如:'It\\'s milvus'
      • +
      • 如果字串常數由雙引號括住,常數中的雙引號應表示為\\" ,而單引號可表示為'\\' 。 例:"He said \\"Hi\\""
      • +
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.json new file mode 100644 index 000000000..c1b80bbca --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Metric Types​","anchorList":[{"label":"度量類型","href":"Metric-Types​","type":1,"isActive":false},{"label":"歐氏距離 (L2)","href":"Euclidean-distance-L2​","type":2,"isActive":false},{"label":"內積 (IP)","href":"Inner-product-IP​","type":2,"isActive":false},{"label":"余弦相似性","href":"Cosine-similarity-​","type":2,"isActive":false},{"label":"JACCARD 距離","href":"JACCARD-distance​","type":2,"isActive":false},{"label":"HAMMING 距離","href":"HAMMING-distance​","type":2,"isActive":false},{"label":"BM25 相似度","href":"BM25-similarity​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.md new file mode 100644 index 000000000..fed0ecb72 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/metric.md @@ -0,0 +1,249 @@ +--- +id: metric.md +summary: 相似度量用來衡量向量之間的相似性。選擇適當的距離指標有助於大幅改善分類和聚類效能。 +title: 公制類型 +--- +

    度量類型

    相似度量測向量之間的相似性。選擇適當的距離度量有助於大幅改善分類和聚類效能。

    +

    目前,Milvus 支援這些類似度量:Euclidean distance (L2), Inner Product (IP), Cosine Similarity (COSINE),JACCARD,HAMMING, 和BM25 (專為稀疏向量的全文檢索而設計)。

    +

    下表總結了不同欄位類型與相對應的度量類型之間的對應關係。

    +

    欄位類型

    +

    尺寸範圍

    +

    支援的公制類型

    +

    預設公制類型

    +

    FLOAT_VECTOR

    +

    2-32,768

    +

    COSINE,L2,IP

    +

    COSINE

    +

    FLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE,L2,IP

    +

    +

    COSINE

    +

    BFLOAT16_VECTOR

    +

    2-32,768

    +

    COSINE,L2,IP

    +

    COSINE

    +

    SPARSE_FLOAT_VECTOR

    +

    無需指定尺寸。

    +

    IP,BM25 (僅用於全文檢索)

    +

    IP

    +

    BINARY_VECTOR

    +

    8-32,768*8

    +

    +

    HAMMING,JACCARD

    +

    HAMMING

    +
    +
    +
      +
    • 對於SPARSE_FLOAT_VECTOR 類型的向量場,僅在執行全文檢索時使用BM25 公制類型。如需詳細資訊,請參閱全文檢索。

    • +
    • 對於BINARY_VECTOR 類型的向量欄位,尺寸值 (dim) 必須是 8 的倍數。

    • +
    +
    +

    下表總結了所有支援的度量類型的相似性距離值特性及其值範圍。

    +

    公制類型

    +

    相似性距離值的特性

    +

    相似性距離值範圍

    +

    L2

    +

    值越小表示相似度越高。

    +

    [0, ∞)

    +

    IP

    +

    值越大,表示相似度越高。

    +

    [-1, 1]

    +

    COSINE

    +

    值越大,表示相似度越高。

    +

    [-1, 1]

    +

    JACCARD

    +

    值越小,表示相似度越高。

    +

    [0, 1]

    +

    HAMMING

    +

    值越小,表示相似度越高。

    +

    [0,dim(向量)]

    +

    BM25

    +

    根據詞彙頻率、倒置的文件頻率和文件規範化來評分相關性。

    +

    [0, ∞)

    +

    +
    +

    歐氏距離 (L2)

    基本上,歐氏距離量度的是連接 2 點的一段長度。

    +

    歐氏距離的公式如下。

    +

    + + Euclidean distance formula + 歐氏距離公式

    +

    其中a = (a0,a1,...,an-1)b = (b0,b1,...,bn-1)是 n 維歐氏空間中的兩個點。

    +

    這是最常用的距離度量,在資料連續時非常有用。

    +
    +

    當選擇歐氏距離為距離公制時,Milvus 只會計算應用平方根之前的值。

    +
    +

    內積 (IP)

    兩個嵌入之間的 IP 距離定義如下。

    +

    + + Inner product formula + 內積公式

    +

    如果您需要比較非規範化的資料,或是關心幅度和角度時,IP 會比較有用。

    +
    +

    如果您使用 IP 來計算嵌入式之間的相似性,您必須將您的嵌入式歸一化。歸一化之後,內積等於余弦相似度。

    +
    +

    假設 X' 是由嵌入 X 規範化而成。

    +

    + + Normalized inner product formula + 規範化內積公式

    +

    兩個嵌入式之間的相關性如下。

    +

    + + Correlation between embeddings + 嵌入式之間的相關性

    +

    余弦相似性

    余弦相似度使用兩組向量之間角度的余弦來衡量它們的相似程度。您可以將兩組向量視為從相同點 (例如 [0,0,...])開始,但指向不同方向的線段。

    +

    要計算兩組向量A = (a0,a1,...,an-1)B = (b0,b1,...,bn-1) 的余弦相似度,請使用下列公式。

    +

    + + Cosine similarity formula + 余弦相似度公式

    +

    余弦相似度總是在區間[-1, 1]。舉例來說,兩個成正比的向量的余弦相似度為1,兩個正交的向量的相似度為0,兩個相反的向量的相似度為-1。余弦越大,兩個向量之間的角度越小,表示這兩個向量之間的相似度越高。

    +

    將它們的余弦相似度從 1 減去,就可以得到兩個向量之間的余弦距離。

    +

    JACCARD 距離

    JACCARD 相似度系數量度兩個樣本集之間的相似度,定義為定義集的交集的 cardinality 除以它們的結合的 cardinality。它只適用於有限樣本集。

    +

    + + JACCARD similarity coefficient formula + JACCARD 相似度系數公式

    +

    JACCARD 距離量度資料集間的不相似性,將 JACCARD 相似度系數從 1 減去即可得到。對於二元變數,JACCARD 距離等同於 Tanimoto 系數。

    +

    + + JACCARD distance formula + JACCARD 距離公式

    +

    HAMMING 距離

    HAMMING 距離量度二進位資料字串。長度相等的兩個字串之間的距離是位元位置不同的位元數。

    +

    例如,假設有兩個字串,1101 1001 和 1001 1101。

    +

    11011001 ⊕ 10011101 = 01000100.由於這包含兩個 1,所以 HAMMING 距離 d (11011001, 10011101) = 2。

    +

    BM25 相似度

    BM25 是一種廣泛使用的文字相關性測量方法,專門設計用於全文檢索。它結合了以下三個關鍵因素。

    +
      +
    • 詞彙頻率 (TF):測量詞彙在文件中出現的頻率。雖然較高的頻率通常表示較高的重要性,但 BM25 使用飽和參數 k1 來防止過度頻繁的詞彙主宰相關性得分。

    • +
    • 反向文件頻率 (IDF):反映詞彙在整個語料庫中的重要性。出現在較少文件中的詞彙會得到較高的 IDF 值,表示對相關性的貢獻較大。

    • +
    • 文件長度規範化較長的文件往往會因為包含較多的詞彙而得分較高。BM25 藉由將文件長度規範化來減緩這種偏差,而參數 b 則控制規範化的強度。

    • +
    +

    BM25 評分的計算方式如下。

    +

    + + BM25 similarity formula + BM25 相似度公式

    +

    參數說明。

    +
      +
    • ​Q:使用者提供的查詢文字。

    • +
    • ​D:被評估的文件。

    • +
    • ​TF(qi​,D):詞彙頻率,表示詞彙​qi 在文件​D 中出現的頻率。

    • +
    • ​IDF(qi​):反向文件頻率,計算方式為

      +

      + + IDF formula + IDF 公式

      +

      其中​N 是語料庫中的文檔總數,​n(qi​) 是包含術語 qi 的文檔數目。

    • +
    • ​∣D∣:文件​D 的長度 (詞彙總數)。

    • +
    • ​avgdl:語料庫中所有文件的平均長度。

    • +
    • ​k1​:控制詞彙頻率對分數的影響。較高的值會增加詞彙頻率的重要性。典型的範圍是 [1.2,2.0],而 Milvus 允許的範圍是 [0,3]。

    • +
    • ​b:控制長度規範化的程度,範圍從 0 到 1。當值為 0 時,不套用規範化;當值為 1 時,套用完全規範化。

    • +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.json new file mode 100644 index 000000000..4935e4dc5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.json @@ -0,0 +1 @@ +{"codeList":["# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n # Set memory mapping property for whole cluster\n mmapEnabled: false | true\n # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. \n mmapDirPath: any/valid/path \n....\n","# This parameter was set in configs/milvus.yaml\n...\nqueryNode:\n mmap:\n vectorField: false # Enable mmap for loading vector data\n vectorIndex: false # Enable mmap for loading vector index\n scalarField: false # Enable mmap for loading scalar data\n scalarIndex: false # Enable mmap for loading scalar index\n....\n","# Get existing collection\ncollection = Collection(\"test_collection\") # Replace with your collection name\n\n# Set memory mapping property to True or Flase\ncollection.set_properties({'mmap.enabled': True})\n","schema = MilvusClient.create_schema()\n\nschema.add_field(field_name=\"embedding\", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)\n","collection.alter_index(\n index_name=\"vector_index\", # Replace with your vector index name\n extra_params={\"mmap.enabled\": True} # Enable memory mapping for index\n)\n","# new-values.yaml\nextraConfigFiles:\n user.yaml: |+\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \nhelm upgrade --reuse-values -f new-values.yaml milvus/milvus\n","# patch.yaml\nspec:\n config:\n queryNode:\n mmap:\n mmapEnabled: true\n mmapDirPath: any/valid/path\n \n kubectl patch milvus --patch-file patch.yaml\n","# A new installation script is provided to enable mmap-related settings.\n"],"headingContent":"MMap-enabled Data Storage","anchorList":[{"label":"支援 MMap 的資料儲存","href":"MMap-enabled-Data-Storage","type":1,"isActive":false},{"label":"配置記憶體映射","href":"Configure-memory-mapping","type":2,"isActive":false},{"label":"在不同部署中自訂儲存路徑","href":"Customize-storage-path-in-different-deployments","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false},{"label":"常見問題","href":"FAQ","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.md new file mode 100644 index 000000000..d0d9458ff --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/mmap.md @@ -0,0 +1,190 @@ +--- +id: mmap.md +summary: MMap 可以在單一節點中提供更多資料。 +title: 支援 MMap 的資料儲存 +--- +

    支援 MMap 的資料儲存

    在 Milvus 中,記憶體映射檔案允許直接將檔案內容映射到記憶體中。此功能增強了記憶體效率,特別是在可用記憶體稀少但完整資料載入不可行的情況下。此最佳化機制可增加資料容量,同時在一定限度內確保效能;但當資料量超出記憶體太多時,搜尋和查詢效能可能會嚴重下降,因此請視情況選擇開啟或關閉此功能。

    +

    配置記憶體映射

    從 Milvus 2.4 開始,您可以靈活調整靜態配置檔,在部署前為整個集群配置預設的記憶體映射設定。此外,您也可以選擇動態變更參數,在群集和索引層級微調記憶體映射設定。展望未來,未來的更新將擴展記憶體對應功能,以包含欄位層級的設定。

    +

    群集部署前:全局配置

    在部署群集之前,群集層級設定會在整個群集套用記憶體對應。這可確保所有新物件都會自動遵循這些組態。值得注意的是,修改這些設定需要重新啟動群集才能生效。

    +

    若要調整群集的記憶體映射設定,請編輯configs/milvus.yaml 檔案。在此檔案中,您可以指定是否預設啟用記憶體映射,並決定儲存記憶體映射檔案的目錄路徑。如果未指定路徑 (mmapDirPath),系統預設會將記憶體映射檔案儲存於{localStorage.path}/mmap 。如需詳細資訊,請參閱本機儲存相關組態

    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    # Set memory mapping property for whole cluster
    +    mmapEnabled: false | true
    +    # Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default. 
    +    mmapDirPath: any/valid/path 
    +....
    +
    +

    2.4.10 之後,配置queryNode.mmap.mmapEnabled 分成下面四個獨立的欄位,所有預設值都是false

    +
      +
    • queryNode.mmap.vectorField, 控制向量資料是否為 mmap;
    • +
    • queryNode.mmap.vectorIndex, 控制向量索引是否為 mmap;
    • +
    • queryNode.mmap.scalarField控制標量資料是否為 mmap;
    • +
    • queryNode.mmap.scalarIndex控制標量索引是否為 mmap;
    • +
    +
    # This parameter was set in configs/milvus.yaml
    +...
    +queryNode:
    +  mmap:
    +    vectorField: false # Enable mmap for loading vector data
    +    vectorIndex: false # Enable mmap for loading vector index
    +    scalarField: false # Enable mmap for loading scalar data
    +    scalarIndex: false # Enable mmap for loading scalar index
    +....
    +
    +

    此外,只有向量索引和向量資料的 mmap 可以單獨為一個集合開啟或關閉,其他集合則無法開啟或關閉。

    +

    相容性:如果原始配置queryNode.mmap.mmapEnabled 設定為true ,此時新加入的配置將設定為true 。如果queryNode.mmap.mmapEnabled 設定為false ,如果新增的組態設定為true ,最終值將是true

    +

    群集運行期間:動態配置

    在群集運行期間,您可以在集合或索引層級動態調整記憶體映射設定。

    +

    集合層級,記憶體對應會套用至集合內所有未索引的原始資料,但不包括主索引鍵、時間戳記和行 ID。這種方法特別適用於大型資料集的全面管理。

    +

    若要動態調整資料集中的記憶體映射設定,請使用set_properties() 方法。在此,您可以根據需要在TrueFalse 之間切換mmap.enabled

    +
    # Get existing collection
    +collection = Collection("test_collection") # Replace with your collection name
    +
    +# Set memory mapping property to True or Flase
    +collection.set_properties({'mmap.enabled': True})
    +
    +

    2.4.10 之後,使用add_field 方法來調整資料集中的記憶體對應設定。在此,您可以根據需要在TrueFalse 之間切換mmap_enabled

    +
    schema = MilvusClient.create_schema()
    +
    +schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
    +
    +

    對於索引層級設定,記憶體映射可特別套用至向量索引,而不會影響其他資料類型。此功能對於需要優化向量搜尋效能的資料集來說非常寶貴。

    +

    若要啟用或停用集合內索引的記憶體映射,請呼叫alter_index() 方法,在index_name 中指定目標索引名稱,並將mmap.enabled 設為TrueFalse

    +
    collection.alter_index(
    +    index_name="vector_index", # Replace with your vector index name
    +    extra_params={"mmap.enabled": True} # Enable memory mapping for index
    +)
    +
    +

    在不同部署中自訂儲存路徑

    記憶體映射檔案預設為localStorage.path 內的/mmap 目錄。以下是如何在各種部署方法中自訂此設定:

    +
      +
    • 對於使用 Helm Chart 安裝的 Milvus:
    • +
    +
    # new-values.yaml
    +extraConfigFiles:
    +   user.yaml: |+
    +      queryNode:
    +         mmap:
    +           mmapEnabled: true
    +           mmapDirPath: any/valid/path
    +        
    +helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
    +
    +
      +
    • 使用 Milvus Operator 安裝的 Milvus:
    • +
    +
    # patch.yaml
    +spec:
    +  config:
    +    queryNode:
    +      mmap:
    +        mmapEnabled: true
    +        mmapDirPath: any/valid/path
    +      
    + kubectl patch milvus <milvus-name> --patch-file patch.yaml
    +
    +
      +
    • 適用於使用 Docker 安裝的 Milvus:
    • +
    +
    # A new installation script is provided to enable mmap-related settings.
    +
    +

    限制

      +
    • 記憶體映射無法針對已載入的集合啟用,請在啟用記憶體映射前確認該集合已釋放。

    • +
    • DiskANN 或 GPU 類索引不支援記憶體映射。

    • +
    +

    常見問題

      +
    • 建議在哪些情況下啟用記憶體映射?啟用此功能後會有哪些取捨?

      +

      當記憶體有限或效能需求適中時,建議啟用記憶體映射。啟用此功能可增加資料載入的容量。例如,在 2 個 CPU 和 8 GB 記憶體的組態下,啟用記憶體映射可讓載入的資料比未啟用多 4 倍。對效能的影響各有不同:

      +
        +
      • 在記憶體充足的情況下,預期效能與僅使用記憶體的效能相似。

      • +
      • 記憶體不足時,預期效能可能會降低。

      • +
    • +
    • 集合層級和索引層級配置之間的關係是什麼?

      +

      集合層級和索引層級不是包含的關係,集合層級控制原始資料是否啟用 mmap,而索引層級只適用於向量索引。

    • +
    • 有沒有任何適用於記憶體映射的推薦索引類型?

      +

      有,建議使用 HNSW 來啟用 mmap。我們之前測試過 HNSW、IVF_FLAT、IVF_PQ/SQ 系列索引,IVF 系列索引的效能下降很嚴重,而 HNSW 索引開啟 mmap 後效能下降仍在預期範圍內。

    • +
    • 記憶體映射需要什麼樣的本機儲存空間?

      +

      高品質的磁碟可提升效能,NVMe 硬碟是首選。

    • +
    • 標量資料可以進行記憶體映射嗎?

      +

      記憶體映射可應用於標量資料,但不適用於建立在標量欄位上的索引。

    • +
    • 不同層級的記憶體映射配置的優先順序如何決定?

      +

      在 Milvus 中,當記憶體映射配置在多個層級中明確定義時,索引層級和集合層級配置共享最高優先級,然後是群集層級配置。

    • +
    • 如果我從 Milvus 2.3 升級,並配置了記憶體映射目錄路徑,會發生什麼?

      +

      如果您從 Milvus 2.3 升級,並已配置記憶體映射目錄路徑 (mmapDirPath),您的配置將被保留,啟用記憶體映射的預設設定 (mmapEnabled) 將為true 。遷移元資料以同步您現有記憶體映射檔案的設定是很重要的。如需詳細資訊,請參閱遷移元資料

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.json new file mode 100644 index 000000000..88a3a2ec5 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.json @@ -0,0 +1 @@ +{"codeList":["# Create a collection in customized setup mode​\nfrom pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# Create schema​\nschema = MilvusClient.create_schema(​\n auto_id=False,​\n enable_dynamic_field=True,​\n)​\n# Add fields to schema​\nschema.add_field(field_name=\"id\", datatype=DataType.INT64, is_primary=True)​\nschema.add_field(field_name=\"text\", datatype=DataType.VARCHAR, max_length=1000)​\nschema.add_field(field_name=\"sparse\", datatype=DataType.SPARSE_FLOAT_VECTOR)​\nschema.add_field(field_name=\"dense\", datatype=DataType.FLOAT_VECTOR, dim=5)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"id\")​\n .dataType(DataType.Int64)​\n .isPrimaryKey(true)​\n .autoID(false)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"text\")​\n .dataType(DataType.VarChar)​\n .maxLength(1000)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"dense\")​\n .dataType(DataType.FloatVector)​\n .dimension(768)​\n .build());​\n​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"sparse\")​\n .dataType(DataType.SparseFloatVector)​\n .build());​\n\n","// WIP​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// Create a collection in customized setup mode​\n// Define fields​\nconst fields = [​\n {​\n name: \"id\",​\n data_type: DataType.Int64,​\n is_primary_key: true,​\n auto_id: false​\n },​\n {​\n name: \"text\",​\n data_type: DataType.VarChar,​\n max_length: 1000​\n },​\n {​\n name: \"sparse\",​\n data_type: DataType.SPARSE_FLOAT_VECTOR​\n },​\n {​\n name: \"dense\",​\n data_type: DataType.FloatVector,​\n dim: 768​\n }​\n]​\n\n","export schema='{​\n \"autoId\": false,​\n \"enabledDynamicField\": true,​\n \"fields\": [​\n {​\n \"fieldName\": \"id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"text\",​\n \"dataType\": \"VarChar\",​\n \"elementTypeParams\": {​\n \"max_length\": 1000​\n }​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"dataType\": \"SparseFloatVector\"​\n },​\n {​\n \"fieldName\": \"dense\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"768\"​\n }​\n }​\n ]​\n }'​\n\n","from pymilvus import MilvusClient​\n​\n# Prepare index parameters​\nindex_params = client.prepare_index_params()​\n​\n# Add indexes​\nindex_params.add_index(​\n field_name=\"dense\",​\n index_name=\"dense_index\",​\n index_type=\"IVF_FLAT\",​\n metric_type=\"IP\",​\n params={\"nlist\": 128},​\n)​\n​\nindex_params.add_index(​\n field_name=\"sparse\",​\n index_name=\"sparse_index\",​\n index_type=\"SPARSE_INVERTED_INDEX\", # Index type for sparse vectors​\n metric_type=\"IP\", # Currently, only IP (Inner Product) is supported for sparse vectors​\n params={\"drop_ratio_build\": 0.2}, # The ratio of small vector values to be dropped during indexing​\n)​\n\n","import io.milvus.v2.common.IndexParam;​\nimport java.util.*;​\n​\nMap denseParams = new HashMap<>();​\ndenseParams.put(\"nlist\", 128);​\nIndexParam indexParamForDenseField = IndexParam.builder()​\n .fieldName(\"dense\")​\n .indexName(\"dense_index\")​\n .indexType(IndexParam.IndexType.IVF_FLAT)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(denseParams)​\n .build();​\n​\nMap sparseParams = new HashMap<>();​\nsparseParams.put(\"drop_ratio_build\", 0.2);​\nIndexParam indexParamForSparseField = IndexParam.builder()​\n .fieldName(\"sparse\")​\n .indexName(\"sparse_index\")​\n .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​\n .metricType(IndexParam.MetricType.IP)​\n .extraParams(sparseParams)​\n .build();​\n​\nList indexParams = new ArrayList<>();​\nindexParams.add(indexParamForDenseField);​\nindexParams.add(indexParamForSparseField);​\n\n","const index_params = [{​\n field_name: \"dense\",​\n index_type: \"IVF_FLAT\",​\n metric_type: \"IP\"​\n},{​\n field_name: \"sparse\",​\n index_type: \"SPARSE_INVERTED_INDEX\",​\n metric_type: \"IP\"​\n}]​\n\n","export indexParams='[​\n {​\n \"fieldName\": \"dense\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"dense_index\",​\n \"indexType\":\"IVF_FLAT\",​\n \"params\":{\"nlist\":128}​\n },​\n {​\n \"fieldName\": \"sparse\",​\n \"metricType\": \"IP\",​\n \"indexName\": \"sparse_index\",​\n \"indexType\": \"SPARSE_INVERTED_INDEX\"​\n }​\n ]'​\n\n","from pymilvus import MilvusClient​\n​\nclient.create_collection(​\n collection_name=\"hybrid_search_collection\",​\n schema=schema,​\n index_params=index_params​\n)​\n\n","CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .collectionSchema(schema)​\n .indexParams(indexParams)​\n .build();​\nclient.createCollection(createCollectionReq);​\n\n","res = await client.createCollection({​\n collection_name: \"hybrid_search_collection\",​\n fields: fields,​\n index_params: index_params,​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"schema\\\": $schema,​\n \\\"indexParams\\\": $indexParams​\n}\"​\n\n","from pymilvus import MilvusClient​\n​\ndata=[​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n​\nres = client.insert(​\n collection_name=\"hybrid_search_collection\",​\n data=data​\n)​\n​\n\n","import com.google.gson.Gson;​\nimport com.google.gson.JsonObject;​\nimport io.milvus.v2.service.vector.request.InsertReq;​\n​\nGson gson = new Gson();​\nJsonObject row1 = new JsonObject();​\nrow1.addProperty(\"id\", 1);​\nrow1.addProperty(\"text\", \"Artificial intelligence was founded as an academic discipline in 1956.\");​\nrow1.add(\"dense\", gson.toJsonTree(dense1));​\nrow1.add(\"sparse\", gson.toJsonTree(sparse1));​\n​\nJsonObject row2 = new JsonObject();​\nrow2.addProperty(\"id\", 2);​\nrow2.addProperty(\"text\", \"Alan Turing was the first person to conduct substantial research in AI.\");​\nrow2.add(\"dense\", gson.toJsonTree(dense2));​\nrow2.add(\"sparse\", gson.toJsonTree(sparse2));​\n​\nJsonObject row3 = new JsonObject();​\nrow3.addProperty(\"id\", 3);​\nrow3.addProperty(\"text\", \"Born in Maida Vale, London, Turing was raised in southern England.\");​\nrow3.add(\"dense\", gson.toJsonTree(dense3));​\nrow3.add(\"sparse\", gson.toJsonTree(sparse3));​\n​\nList data = Arrays.asList(row1, row2, row3);​\nInsertReq insertReq = InsertReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .data(data)​\n .build();​\n​\nInsertResp insertResp = client.insert(insertReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nvar data = [​\n {id: 0, text: \"Artificial intelligence was founded as an academic discipline in 1956.\", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​\n {id: 1, text: \"Alan Turing was the first person to conduct substantial research in AI.\", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​\n {id: 2, text: \"Born in Maida Vale, London, Turing was raised in southern England.\" , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]} ​\n]​\n​\nvar res = await client.insert({​\n collection_name: \"hybrid_search_collection\",​\n data: data,​\n})​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"data\": [​\n {\"id\": 0, \"text\": \"Artificial intelligence was founded as an academic discipline in 1956.\", \"sparse\":{\"9637\": 0.30856525997853057, \"4399\": 0.19771651149001523}, \"dense\": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​\n {\"id\": 1, \"text\": \"Alan Turing was the first person to conduct substantial research in AI.\", \"sparse\":{\"6959\": 0.31025067641541815, \"1729\": 0.8265339135915016}, \"dense\": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​\n {\"id\": 2, \"text\": \"Born in Maida Vale, London, Turing was raised in southern England.\", \"sparse\":{\"1220\": 0.15303302147479103, \"7335\": 0.9436728846033107}, \"dense\": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​\n ],​\n \"collectionName\": \"hybrid_search_collection\"​\n}'​\n\n","from pymilvus import AnnSearchRequest​\n​\nquery_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nsearch_param_1 = {​\n \"data\": [query_dense_vector],​\n \"anns_field\": \"dense\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2​\n}​\nrequest_1 = AnnSearchRequest(**search_param_1)​\n​\nquery_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​\nsearch_param_2 = {​\n \"data\": [query_sparse_vector],​\n \"anns_field\": \"sparse\",​\n \"param\": {​\n \"metric_type\": \"IP\",​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2​\n}​\nrequest_2 = AnnSearchRequest(**search_param_2)​\n​\nreqs = [request_1, request_2]​\n​\n\n","import io.milvus.v2.service.vector.request.AnnSearchReq;​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.request.data.SparseFloatVec;​\n​\nfloat[] dense = new float[]{-0.0475336798f, 0.0521207601f, 0.0904406682f, ...};​\nSortedMap sparse = new TreeMap() {{​\n put(3573L, 0.34701499f);​\n put(5263L, 0.263937551f);​\n ...​\n}};​\n​\n​\nList queryDenseVectors = Collections.singletonList(new FloatVec(dense));​\nList querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​\n​\nList searchRequests = new ArrayList<>();​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"dense\")​\n .vectors(queryDenseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"nprobe\\\": 10}\")​\n .topK(2)​\n .build());​\nsearchRequests.add(AnnSearchReq.builder()​\n .vectorFieldName(\"sparse\")​\n .vectors(querySparseVectors)​\n .metricType(IndexParam.MetricType.IP)​\n .params(\"{\\\"drop_ratio_build\\\": 0.2}\")​\n .topK(2)​\n .build());​\n\n","const search_param_1 = {​\n \"data\": query_vector, ​\n \"anns_field\": \"dense\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"nprobe\": 10}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n​\nconst search_param_2 = {​\n \"data\": query_sparse_vector, ​\n \"anns_field\": \"sparse\", ​\n \"param\": {​\n \"metric_type\": \"IP\", // 参数值需要与 Collection Schema 中定义的保持一致​\n \"params\": {\"drop_ratio_build\": 0.2}​\n },​\n \"limit\": 2 // AnnSearchRequest 返还的搜索结果数量​\n}​\n\n","export req='[​\n {​\n \"data\": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​\n \"annsField\": \"dense\",​\n \"params\": {​\n \"params\": {​\n \"nprobe\": 10​\n }​\n },​\n \"limit\": 2​\n },​\n {​\n \"data\": [{\"3573\": 0.34701499565746674}, {\"5263\": 0.2639375518635271}],​\n \"annsField\": \"sparse\",​\n \"params\": {​\n \"params\": {​\n \"drop_ratio_build\": 0.2​\n }​\n },​\n \"limit\": 2​\n }​\n ]'​\n\n","from pymilvus import WeightedRanker​\n​\nrerank= WeightedRanker(0.8, 0.3) ​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.WeightedRanker;​\n​\nBaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = WeightedRanker(0.8, 0.3);​\n\n","export rerank='{​\n \"strategy\": \"ws\",​\n \"params\": {\"weights\": [0.8,0.3]}​\n }'​\n\n","from pymilvus import RRFRanker​\n​\nranker = RRFRanker(100)​\n\n","import io.milvus.v2.service.vector.request.ranker.BaseRanker;​\nimport io.milvus.v2.service.vector.request.ranker.RRFRanker;​\n​\nBaseRanker reranker = new RRFRanker(100);​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst rerank = RRFRanker(\"100\");​\n\n","export rerank='{​\n \"strategy\": \"rrf\",​\n \"params\": { \"k\": 100}​\n }'​\n\n","from pymilvus import MilvusClient​\n​\nres = client.hybrid_search(​\n collection_name=\"hybrid_search_collection\",​\n reqs=reqs,​\n ranker=ranker,​\n limit=2​\n)​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.common.ConsistencyLevel;​\nimport io.milvus.v2.service.vector.request.HybridSearchReq;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nHybridSearchReq hybridSearchReq = HybridSearchReq.builder()​\n .collectionName(\"hybrid_search_collection\")​\n .searchRequests(searchRequests)​\n .ranker(reranker)​\n .topK(2)​\n .consistencyLevel(ConsistencyLevel.BOUNDED)​\n .build();​\n​\nSearchResp searchResp = client.hybridSearch(hybridSearchReq);​\n\n","const { MilvusClient, DataType } = require(\"@zilliz/milvus2-sdk-node\")​\n​\nres = await client.loadCollection({​\n collection_name: \"hybrid_search_collection\"​\n})​\n​\nimport { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​\n​\nconst search = await client.search({​\n collection_name: \"hybrid_search_collection\",​\n data: [search_param_1, search_param_2],​\n limit: 2,​\n rerank: RRFRanker(100)​\n});​\n\n","curl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"hybrid_search_collection\\\",​\n \\\"search\\\": ${req},​\n \\\"rerank\\\": {​\n \\\"strategy\\\":\\\"rrf\\\",​\n \\\"params\\\": {​\n \\\"k\\\": 10​\n }​\n },​\n \\\"limit\\\": 3,​\n \\\"outputFields\\\": [​\n \\\"user_id\\\",​\n \\\"word_count\\\",​\n \\\"book_describe\\\"​\n ]​\n}\"​\n\n","[\"['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']\"]​\n\n"],"headingContent":"Hybrid Search​","anchorList":[{"label":"混合搜尋","href":"Hybrid-Search​","type":1,"isActive":false},{"label":"使用情境","href":"Scenarios​","type":2,"isActive":false},{"label":"工作流程","href":"Workflow​","type":2,"isActive":false},{"label":"範例","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.md new file mode 100644 index 000000000..f7c05ddd6 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/multi-vector-search.md @@ -0,0 +1,681 @@ +--- +id: multi-vector-search.md +order: 2 +summary: 本指南示範如何在 Milvus 中執行混合搜尋,並了解結果的重新排序。 +title: 混合搜尋 +--- +

    混合搜尋

    混合搜尋指的是一種同時進行多個 ANN 搜尋、從這些 ANN 搜尋中重新排序多組結果,並最終返回單一結果集的搜尋方法。使用 Hybrid Search 可以提高搜尋準確度。Zilliz 支援在具有多向量領域的集合上進行混合搜尋。

    +

    Hybrid Search 最常用於包括稀疏密集向量搜尋和多模式搜尋等情況。本指南將以特定範例說明如何在 Zilliz 中執行混合搜尋。

    +

    使用情境

    混合搜尋適用於下列兩種情況。

    +

    稀疏-密集向量搜尋

    不同類型的向量可以代表不同的資訊,使用不同的嵌入模型可以更全面地代表資料的不同特徵和面向。例如,對同一句子使用不同的嵌入模型,可以產生表示語義的密集向量和表示句子中詞彙頻率的稀疏向量。

    +
      +
    • 稀疏向量:稀疏向量的特點是向量維度高,而且只有很少的非零值存在。這種結構使它們特別適合傳統的資訊檢索應用。在大多數情況下,稀疏向量所使用的維數對應於一種或多種語言的不同詞彙。每個維度都會被指定一個值,表示該標記在文件中的相對重要性。對於涉及文字比對的任務而言,這種佈局很有優勢。

    • +
    • 密集向量:密集向量是來自於神經網路的嵌入。當排列成有序陣列時,這些向量可以捕捉輸入文字的語意精髓。請注意,密集向量並不限於文字處理;它們也被廣泛應用於電腦視覺,以表示視覺資料的語意。這些密集向量通常是由文字嵌入模型所產生,其特點是大部分或所有元素都非零。因此,密集向量對於語意搜尋應用特別有效,因為即使沒有精確的文字匹配,它們也能根據向量距離傳回最相似的結果。此功能可讓搜尋結果更細緻、更能感知上下文,通常可捕捉到基於關鍵字的方法可能遺漏的概念之間的關係。

    • +
    +

    如需詳細資訊,請參閱Sparse VectorDense Vector

    +

    多模式搜尋

    多模態搜尋是指跨多種模態(如圖像、視訊、音訊、文字等)的非結構化資料相似性搜尋。例如,可以使用指紋、聲紋和臉部特徵等多種模式的資料來表示一個人。混合搜尋支援同時進行多重搜尋。例如,使用相似的指紋和聲紋搜尋一個人。

    +

    工作流程

    進行混合搜尋的主要工作流程如下。

    +
      +
    1. 透過BERTTransformers 等嵌入模型產生密集向量。

    2. +
    3. 透過BM25BGE-M3SPLADE 等嵌入模型產生稀疏向量。

    4. +
    5. 在 Zilliz 中建立集合,並定義集合模式,其中包含密集與稀疏向量領域。

    6. +
    7. 將稀疏密集向量插入上一步中剛建立的集合中。

    8. +
    9. 進行混合搜尋:稠密向量上的 ANN Search 將會傳回一組 Top-K 最相似的結果,而稀疏向量上的文字匹配也會傳回一組 Top-K 結果。

    10. +
    11. 歸一化:將兩組 Top-K 結果的分數歸一化,將分數轉換為 [0,1] 之間的範圍。

    12. +
    13. 選擇合適的重排策略來合併兩組 Top-K 結果並重排,最後傳回一組 Top-K 結果。

    14. +
    +

    + + Hybrid Search Workflow + 混合搜尋工作流程

    +

    範例

    本節將使用一個特定範例來說明如何在稀疏密集向量上進行 Hybrid Search,以提高文字搜尋的精確度。

    +

    建立具有多向量欄位的集合

    建立集合的過程包括三個部分:定義集合模式、配置索引參數,以及建立集合。

    +

    定義模式

    在本範例中,需要在集合模式中定義多個向量欄位。目前,每個集合預設最多可包含 4 個向量欄位。但您也可以修改 proxy.maxVectorFieldNum 的值,以便根據需要在一個集合中最多包含 10 個向量欄位。

    +

    以下範例定義了一個集合模式,其中densesparse 是兩個向量欄位。

    +
      +
    • id:這個欄位是儲存文字 ID 的主索引鍵。這個欄位的資料類型是 INT64。

    • +
    • text:這個欄位用來儲存文字內容。這個欄位的資料類型是 VARCHAR,最大長度為 1000 個字元。

    • +
    • dense:這個欄位用來儲存文字的密集向量。這個欄位的資料類型是 FLOAT_VECTOR,向量尺寸為 768。

    • +
    • sparse:這個欄位用來儲存文字的稀疏向量。這個欄位的資料類型是 SPARSE_FLOAT_VECTOR。

    • +
    + +
    # Create a collection in customized setup mode​
    +from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# Create schema​
    +schema = MilvusClient.create_schema(​
    +    auto_id=False,​
    +    enable_dynamic_field=True,​
    +)​
    +# Add fields to schema​
    +schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)​
    +schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000)​
    +schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)​
    +schema.add_field(field_name="dense", datatype=DataType.FLOAT_VECTOR, dim=5)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("id")​
    +        .dataType(DataType.Int64)​
    +        .isPrimaryKey(true)​
    +        .autoID(false)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("text")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(1000)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("dense")​
    +        .dataType(DataType.FloatVector)​
    +        .dimension(768)​
    +        .build());​
    +​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("sparse")​
    +        .dataType(DataType.SparseFloatVector)​
    +        .build());​
    +
    +
    +
    // WIP​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// Create a collection in customized setup mode​
    +// Define fields​
    +const fields = [​
    +    {​
    +        name: "id",​
    +        data_type: DataType.Int64,​
    +        is_primary_key: true,​
    +        auto_id: false​
    +    },​
    +    {​
    +        name: "text",​
    +        data_type: DataType.VarChar,​
    +        max_length: 1000​
    +    },​
    +    {​
    +        name: "sparse",​
    +        data_type: DataType.SPARSE_FLOAT_VECTOR​
    +    },​
    +    {​
    +        name: "dense",​
    +        data_type: DataType.FloatVector,​
    +        dim: 768​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": false,​
    +        "enabledDynamicField": true,​
    +        "fields": [​
    +            {​
    +                "fieldName": "id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "text",​
    +                "dataType": "VarChar",​
    +                "elementTypeParams": {​
    +                    "max_length": 1000​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "sparse",​
    +                "dataType": "SparseFloatVector"​
    +            },​
    +            {​
    +                "fieldName": "dense",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "768"​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    在稀疏向量搜尋過程中,您可以利用全文檢索 (Full Text Search) 功能來簡化產生稀疏嵌入向量的過程。如需詳細資訊,請參閱Full Text Search

    +

    建立索引

    定義集合模式後,就必須設定向量索引和相似度指標。在本範例中,為密集向量欄位dense 建立 IVF_FLAT 索引,並為稀疏向量欄位sparse 建立 SPARSE_INVERTED_INDEX 索引。要瞭解支援的索引類型,請參閱Index Explained

    + +
    from pymilvus import MilvusClient​
    +​
    +# Prepare index parameters​
    +index_params = client.prepare_index_params()​
    +​
    +# Add indexes​
    +index_params.add_index(​
    +    field_name="dense",​
    +    index_name="dense_index",​
    +    index_type="IVF_FLAT",​
    +    metric_type="IP",​
    +    params={"nlist": 128},​
    +)​
    +​
    +index_params.add_index(​
    +    field_name="sparse",​
    +    index_name="sparse_index",​
    +    index_type="SPARSE_INVERTED_INDEX",  # Index type for sparse vectors​
    +    metric_type="IP",  # Currently, only IP (Inner Product) is supported for sparse vectors​
    +    params={"drop_ratio_build": 0.2},  # The ratio of small vector values to be dropped during indexing​
    +)​
    +
    +
    +
    import io.milvus.v2.common.IndexParam;​
    +import java.util.*;​
    +​
    +Map<String, Object> denseParams = new HashMap<>();​
    +denseParams.put("nlist", 128);​
    +IndexParam indexParamForDenseField = IndexParam.builder()​
    +        .fieldName("dense")​
    +        .indexName("dense_index")​
    +        .indexType(IndexParam.IndexType.IVF_FLAT)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(denseParams)​
    +        .build();​
    +​
    +Map<String, Object> sparseParams = new HashMap<>();​
    +sparseParams.put("drop_ratio_build", 0.2);​
    +IndexParam indexParamForSparseField = IndexParam.builder()​
    +        .fieldName("sparse")​
    +        .indexName("sparse_index")​
    +        .indexType(IndexParam.IndexType.SPARSE_INVERTED_INDEX)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .extraParams(sparseParams)​
    +        .build();​
    +​
    +List<IndexParam> indexParams = new ArrayList<>();​
    +indexParams.add(indexParamForDenseField);​
    +indexParams.add(indexParamForSparseField);​
    +
    +
    +
    const index_params = [{​
    +    field_name: "dense",​
    +    index_type: "IVF_FLAT",​
    +    metric_type: "IP"​
    +},{​
    +    field_name: "sparse",​
    +    index_type: "SPARSE_INVERTED_INDEX",​
    +    metric_type: "IP"​
    +}]​
    +
    +
    +
    export indexParams='[​
    +        {​
    +            "fieldName": "dense",​
    +            "metricType": "IP",​
    +            "indexName": "dense_index",​
    +            "indexType":"IVF_FLAT",​
    +            "params":{"nlist":128}​
    +        },​
    +        {​
    +            "fieldName": "sparse",​
    +            "metricType": "IP",​
    +            "indexName": "sparse_index",​
    +            "indexType": "SPARSE_INVERTED_INDEX"​
    +        }​
    +    ]'​
    +
    +
    +

    建立集合

    使用前兩個步驟中設定的集合模式和索引,建立一個名為demo 的集合。

    + +
    from pymilvus import MilvusClient​
    +​
    +client.create_collection(​
    +    collection_name="hybrid_search_collection",​
    +    schema=schema,​
    +    index_params=index_params​
    +)​
    +
    +
    +
    CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .collectionSchema(schema)​
    +        .indexParams(indexParams)​
    +        .build();​
    +client.createCollection(createCollectionReq);​
    +
    +
    +
    res = await client.createCollection({​
    +    collection_name: "hybrid_search_collection",​
    +    fields: fields,​
    +    index_params: index_params,​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"schema\": $schema,​
    +    \"indexParams\": $indexParams​
    +}"​
    +
    +
    +

    插入資料

    將稀疏密集向量插入集合demo

    + +
    from pymilvus import MilvusClient​
    +​
    +data=[​
    +    {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{9637: 0.30856525997853057, 4399: 0.19771651149001523, ...}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +    {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{6959: 0.31025067641541815, 1729: 0.8265339135915016, ...}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +    {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{1220: 0.15303302147479103, 7335: 0.9436728846033107, ...}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +​
    +res = client.insert(​
    +    collection_name="hybrid_search_collection",​
    +    data=data​
    +)​
    +​
    +
    +
    +
    import com.google.gson.Gson;​
    +import com.google.gson.JsonObject;​
    +import io.milvus.v2.service.vector.request.InsertReq;​
    +​
    +Gson gson = new Gson();​
    +JsonObject row1 = new JsonObject();​
    +row1.addProperty("id", 1);​
    +row1.addProperty("text", "Artificial intelligence was founded as an academic discipline in 1956.");​
    +row1.add("dense", gson.toJsonTree(dense1));​
    +row1.add("sparse", gson.toJsonTree(sparse1));​
    +​
    +JsonObject row2 = new JsonObject();​
    +row2.addProperty("id", 2);​
    +row2.addProperty("text", "Alan Turing was the first person to conduct substantial research in AI.");​
    +row2.add("dense", gson.toJsonTree(dense2));​
    +row2.add("sparse", gson.toJsonTree(sparse2));​
    +​
    +JsonObject row3 = new JsonObject();​
    +row3.addProperty("id", 3);​
    +row3.addProperty("text", "Born in Maida Vale, London, Turing was raised in southern England.");​
    +row3.add("dense", gson.toJsonTree(dense3));​
    +row3.add("sparse", gson.toJsonTree(sparse3));​
    +​
    +List<JsonObject> data = Arrays.asList(row1, row2, row3);​
    +InsertReq insertReq = InsertReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .data(data)​
    +        .build();​
    +​
    +InsertResp insertResp = client.insert(insertReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +var data = [​
    +    {id: 0, text: "Artificial intelligence was founded as an academic discipline in 1956.", sparse:[9637: 0.30856525997853057, 4399: 0.19771651149001523, ...] , dense: [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]},​
    +    {id: 1, text: "Alan Turing was the first person to conduct substantial research in AI.", sparse:[6959: 0.31025067641541815, 1729: 0.8265339135915016, ...] , dense: [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]},​
    +    {id: 2, text: "Born in Maida Vale, London, Turing was raised in southern England." , sparse:[1220: 0.15303302147479103, 7335: 0.9436728846033107, ...] , dense: [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592]}       ​
    +]​
    +​
    +var res = await client.insert({​
    +    collection_name: "hybrid_search_collection",​
    +    data: data,​
    +})​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/insert" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "data": [​
    +        {"id": 0, "text": "Artificial intelligence was founded as an academic discipline in 1956.", "sparse":{"9637": 0.30856525997853057, "4399": 0.19771651149001523}, "dense": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, ...]},​
    +        {"id": 1, "text": "Alan Turing was the first person to conduct substantial research in AI.", "sparse":{"6959": 0.31025067641541815, "1729": 0.8265339135915016}, "dense": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, ...]},​
    +        {"id": 2, "text": "Born in Maida Vale, London, Turing was raised in southern England.", "sparse":{"1220": 0.15303302147479103, "7335": 0.9436728846033107}, "dense": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, ...]}​
    +    ],​
    +    "collectionName": "hybrid_search_collection"​
    +}'​
    +
    +
    +

    建立多個 AnnSearchRequest 實體

    Hybrid Search 是透過在hybrid_search() 函式中建立多個AnnSearchRequest 來實作,其中每個AnnSearchRequest 代表特定向量領域的基本 ANN 搜尋請求。因此,在進行 Hybrid Search 之前,必須為每個向量欄位建立一個AnnSearchRequest

    +
    +

    在 Hybrid Search 中,每個AnnSearchRequest 只支援一個查詢向量。

    +
    +

    假設查詢文字「Who started AI research?」已經轉換成稀疏向量和密集向量。在此基礎上,分別針對sparsedense 向量字段建立兩個AnnSearchRequest 搜尋請求,如以下範例所示。

    + +
    from pymilvus import AnnSearchRequest​
    +​
    +query_dense_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +search_param_1 = {​
    +    "data": [query_dense_vector],​
    +    "anns_field": "dense",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2​
    +}​
    +request_1 = AnnSearchRequest(**search_param_1)​
    +​
    +query_sparse_vector = {3573: 0.34701499565746674}, {5263: 0.2639375518635271}​
    +search_param_2 = {​
    +    "data": [query_sparse_vector],​
    +    "anns_field": "sparse",​
    +    "param": {​
    +        "metric_type": "IP",​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2​
    +}​
    +request_2 = AnnSearchRequest(**search_param_2)​
    +​
    +reqs = [request_1, request_2]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.AnnSearchReq;​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.request.data.SparseFloatVec;​
    +​
    +float[] dense = new float[]{-0.0475336798f,  0.0521207601f,  0.0904406682f, ...};​
    +SortedMap<Long, Float> sparse = new TreeMap<Long, Float>() {{​
    +    put(3573L, 0.34701499f);​
    +    put(5263L, 0.263937551f);​
    +    ...​
    +}};​
    +​
    +​
    +List<BaseVector> queryDenseVectors = Collections.singletonList(new FloatVec(dense));​
    +List<BaseVector> querySparseVectors = Collections.singletonList(new SparseFloatVec(sparse));​
    +​
    +List<AnnSearchReq> searchRequests = new ArrayList<>();​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("dense")​
    +        .vectors(queryDenseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"nprobe\": 10}")​
    +        .topK(2)​
    +        .build());​
    +searchRequests.add(AnnSearchReq.builder()​
    +        .vectorFieldName("sparse")​
    +        .vectors(querySparseVectors)​
    +        .metricType(IndexParam.MetricType.IP)​
    +        .params("{\"drop_ratio_build\": 0.2}")​
    +        .topK(2)​
    +        .build());​
    +
    +
    +
    const search_param_1 = {​
    +    "data": query_vector, ​
    +    "anns_field": "dense", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"nprobe": 10}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +​
    +const search_param_2 = {​
    +    "data": query_sparse_vector, ​
    +    "anns_field": "sparse", ​
    +    "param": {​
    +        "metric_type": "IP", // 参数值需要与 Collection Schema 中定义的保持一致​
    +        "params": {"drop_ratio_build": 0.2}​
    +    },​
    +    "limit": 2 // AnnSearchRequest 返还的搜索结果数量​
    +}​
    +
    +
    +
    export req='[​
    +    {​
    +        "data": [[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592,....]],​
    +        "annsField": "dense",​
    +        "params": {​
    +            "params": {​
    +                "nprobe": 10​
    +             }​
    +        },​
    +        "limit": 2​
    +    },​
    +    {​
    +        "data": [{"3573": 0.34701499565746674}, {"5263": 0.2639375518635271}],​
    +        "annsField": "sparse",​
    +        "params": {​
    +            "params": {​
    +                "drop_ratio_build": 0.2​
    +             }​
    +        },​
    +        "limit": 2​
    +    }​
    + ]'​
    +
    +
    +

    由於參數limit 設定為 2,因此每個AnnSearchRequest 會返回 2 個搜尋結果。在本範例中,會建立 2 個AnnSearchRequest ,因此總共會傳回 4 個搜尋結果。

    +

    設定重新排序策略

    要合併兩組 ANN 搜尋結果並將其重新排序,必須選擇適當的重新排序策略。Zilliz 支援兩種 reranking 策略:WeightedRankerRRFRanker。在選擇重排策略時,需要考慮的一件事是,是否需要強調向量場上的一個或多個基本 ANN 搜尋。

    +
      +
    • WeightedRanker:如果您要求結果強調特定向量領域,建議使用此策略。WeightedRanker 允許您為某些向量領域指定較高的權重,使其更受重視。例如,在多模式搜尋中,圖片的文字描述可能會被認為比這張圖片的顏色更重要。

    • +
    • RRFRanker (Reciprocal Rank Fusion Ranker):當沒有特定的重點時,建議使用此策略。RRF 可以有效地平衡每個向量場的重要性。

    • +
    +

    有關這兩種重排策略機制的詳細資訊,請參閱Reranking

    +

    以下兩個範例示範如何使用 WeightedRanker 和 RRFRanker 重排策略。

    +
      +
    1. 範例 1:使用 WeightedRanker

      +

      使用 WeightedRanker 策略時,需要在WeightedRanker 函式中輸入權重值。混合搜尋中的基本 ANN 搜尋數量與需要輸入的值數量相對應。輸入的值應該在 [0,1] 的範圍內,值越接近 1 表示重要性越高。

      +

      +
      from pymilvus import WeightedRanker​
      +​
      +rerank= WeightedRanker(0.8, 0.3) ​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.WeightedRanker;​
      +​
      +BaseRanker reranker = new WeightedRanker(Arrays.asList(0.8f, 0.3f));​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = WeightedRanker(0.8, 0.3);​
      +
      +
      +
      export rerank='{​
      +        "strategy": "ws",​
      +        "params": {"weights": [0.8,0.3]}​
      +    }'​
      +
      +
    2. +
    3. 範例 2:使用 RRFRanker

      +

      使用 RRFRanker 策略時,您需要將參數值k 輸入 RRFRanker。k 的預設值是 60。此參數有助於決定如何結合來自不同 ANN 搜尋的排名,目的是平衡和混合所有搜尋的重要性。

      +

      +
      from pymilvus import RRFRanker​
      +​
      +ranker = RRFRanker(100)​
      +
      +
      +
      import io.milvus.v2.service.vector.request.ranker.BaseRanker;​
      +import io.milvus.v2.service.vector.request.ranker.RRFRanker;​
      +​
      +BaseRanker reranker = new RRFRanker(100);​
      +
      +
      +
      import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
      +​
      +const rerank = RRFRanker("100");​
      +
      +
      +
      export rerank='{​
      +        "strategy": "rrf",​
      +        "params": { "k": 100}​
      +    }'​
      +
      +
    4. +
    +

    執行混合搜尋

    在執行混合搜尋之前,必須先將集合載入記憶體。如果集合中的任何向量欄位沒有索引或未載入,在呼叫 Hybrid Search 方法時將會發生錯誤。

    + +
    from pymilvus import MilvusClient​
    +​
    +res = client.hybrid_search(​
    +    collection_name="hybrid_search_collection",​
    +    reqs=reqs,​
    +    ranker=ranker,​
    +    limit=2​
    +)​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.common.ConsistencyLevel;​
    +import io.milvus.v2.service.vector.request.HybridSearchReq;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +HybridSearchReq hybridSearchReq = HybridSearchReq.builder()​
    +        .collectionName("hybrid_search_collection")​
    +        .searchRequests(searchRequests)​
    +        .ranker(reranker)​
    +        .topK(2)​
    +        .consistencyLevel(ConsistencyLevel.BOUNDED)​
    +        .build();​
    +​
    +SearchResp searchResp = client.hybridSearch(hybridSearchReq);​
    +
    +
    +
    const { MilvusClient, DataType } = require("@zilliz/milvus2-sdk-node")​
    +​
    +res = await client.loadCollection({​
    +    collection_name: "hybrid_search_collection"​
    +})​
    +​
    +import { MilvusClient, RRFRanker, WeightedRanker } from '@zilliz/milvus2-sdk-node';​
    +​
    +const search = await client.search({​
    +  collection_name: "hybrid_search_collection",​
    +  data: [search_param_1, search_param_2],​
    +  limit: 2,​
    +  rerank: RRFRanker(100)​
    +});​
    +
    +
    +
    curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/advanced_search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"hybrid_search_collection\",​
    +    \"search\": ${req},​
    +    \"rerank\": {​
    +        \"strategy\":\"rrf\",​
    +        \"params\": {​
    +            \"k\": 10​
    +        }​
    +    },​
    +    \"limit\": 3,​
    +    \"outputFields\": [​
    +        \"user_id\",​
    +        \"word_count\",​
    +        \"book_describe\"​
    +    ]​
    +}"​
    +
    +
    +

    輸出如下。

    +
    ["['id: 844, distance: 0.006047376897186041, entity: {}', 'id: 876, distance: 0.006422005593776703, entity: {}']"]​
    +
    +
    +

    由於在 Hybrid Search 中指定了limit=2 ,Zilliz 會將步驟 3 中的四個搜尋結果重新排序,最終只會返回前兩個最相似的搜尋結果。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.json new file mode 100644 index 000000000..fc74bfe13 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=[query_vector],​\n limit=3,​\n search_params={​\n # highlight-start​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n # highlight-end​\n }​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\n io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nMap extraParams = new HashMap<>();​\nextraParams.put(\"radius\", 0.4);​\nextraParams.put(\"range_filter\", 0.6);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"range_search_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(5)​\n .searchParams(extraParams)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​\n// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​\n\n","// TODO ​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n​\nres = await client.search({​\n collection_name: \"range_search_collection\",​\n data: [query_vector],​\n limit: 5,​\n // highlight-start​\n params: {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n // highlight-end​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"filter\": \"color like \\\"red%\\\" and likes > 50\",​\n \"limit\": 3,​\n \"searchParams\": {​\n \"params\": {​\n \"radius\": 0.4,​\n \"range_filter\": 0.6​\n }​\n }​\n}'​\n# {\"code\":0,\"cost\":0,\"data\":[]}​\n\n"],"headingContent":"Range Search​","anchorList":[{"label":"範圍搜尋","href":"Range-Search​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"範例","href":"Examples​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.md new file mode 100644 index 000000000..42ed76068 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/range-search.md @@ -0,0 +1,210 @@ +--- +id: range-search.md +summary: 範圍搜尋可將返回實體的距離或分數限制在特定範圍內,從而改善搜尋結果的相關性。本頁可協助您瞭解何謂範圍搜尋,以及執行範圍搜尋的程序。 +title: 範圍搜尋 +--- +

    範圍搜尋

    範圍搜尋可將返回實體的距離或分數限制在特定範圍內,從而改善搜尋結果的相關性。本頁可協助您瞭解何謂範圍搜尋,以及執行範圍搜尋的程序。

    +

    概述

    當執行範圍搜尋請求時,Milvus 以 ANN 搜尋結果中與查詢向量最相似的向量為中心,以搜尋請求中指定的半徑為外圈半徑,以range_filter為內圈半徑,畫出兩個同心圓。所有相似度分數落在這兩個同心圓所形成的環狀區域內的向量都會被傳回。在這裡,range_filter可以設定為0,表示將傳送指定相似度得分(半徑)範圍內的所有實體。

    +

    + + Range search + 範圍搜尋

    +

    上圖顯示範圍搜尋請求包含兩個參數:半徑和range_filter。收到範圍搜尋請求後,Milvus 會執行下列動作。

    +
      +
    • 使用指定的度量類型(COSINE) 來尋找與查詢向量最相似的所有向量內嵌。

    • +
    • 篩選與查詢向量的距離分數半徑range_filter參數指定範圍內的向量內嵌。

    • +
    • 從篩選出的實體中傳回前 K個實體。

    • +
    +

    設定 radius 和range_filter的方式會因搜尋的度量類型而異。下表列出了在不同公制類型下設定這兩個參數的要求。

    +

    公制類型

    +

    符號

    +

    設定 radius 和 range_filter 的要求

    +

    L2

    +

    L2 距離越小,表示相似度越高。

    +

    若要忽略最相似的向量嵌入,請確保

    +

    range_filter <= 距離 <radius

    +

    IP

    +

    IP 距離越大,表示相似度越高。

    +

    若要忽略最相似的向量嵌入,請確保

    +

    radius < 距離 <=range_filter

    +

    COSINE

    +

    COSINE 距離越大,表示相似度越高。

    +

    若要忽略最相似的向量嵌入,請確保

    +

    radius < 距離 <=range_filter

    +

    JACCARD

    +

    較小的 Jaccard 距離表示相似度較高。

    +

    +

    若要忽略最相似的向量內嵌,請確保

    +

    range_filter <= 距離 <radius

    +

    HAMMING

    +

    Hamming 距離越小,表示相似度越高。

    +

    若要忽略最相似的向量內嵌,請確保

    +

    range_filter <= 距離 <radius

    +
    +

    範例

    本節示範如何進行範圍搜尋。以下程式碼片段中的搜尋請求並不包含度量類型,這表示預設的度量類型COSINE適用。在這種情況下,請確保半徑值小於range_filter值。

    +

    在下列程式碼片段中,請將radius 設定為0.4 ,並將range_filter 設定為0.6 ,以便 Milvus 會傳回所有與查詢向量的距離或分數在0.40.6 之間的實體。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={​
    +        # highlight-start​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +        # highlight-end​
    +    }​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    + io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +Map<String,Object> extraParams = new HashMap<>();​
    +extraParams.put("radius", 0.4);​
    +extraParams.put("range_filter", 0.6);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("range_search_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(5)​
    +        .searchParams(extraParams)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)​
    +// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)​
    +
    +
    +
    // TODO ​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +​
    +res = await client.search({​
    +    collection_name: "range_search_collection",​
    +    data: [query_vector],​
    +    limit: 5,​
    +    // highlight-start​
    +    params: {​
    +        "radius": 0.4,​
    +        "range_filter": 0.6​
    +    }​
    +    // highlight-end​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "filter": "color like \"red%\" and likes > 50",​
    +    "limit": 3,​
    +    "searchParams": {​
    +        "params": {​
    +            "radius": 0.4,​
    +            "range_filter": 0.6​
    +        }​
    +    }​
    +}'​
    +# {"code":0,"cost":0,"data":[]}​
    +
    +
    +

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.json new file mode 100644 index 000000000..223d18931 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import WeightedRanker\n\n# Use WeightedRanker to combine results with specified weights\nrerank = WeightedRanker(0.8, 0.8, 0.7) \n","from pymilvus import RRFRanker\n\n# Default k value is 60\nranker = RRFRanker()\n\n# Or specify k value\nranker = RRFRanker(k=100)\n"],"headingContent":"Reranking","anchorList":[{"label":"重排","href":"Reranking","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"加權評分 (WeightedRanker)","href":"Weighted-Scoring-WeightedRanker","type":2,"isActive":false},{"label":"對等排名融合 (RRFRanker)","href":"Reciprocal-Rank-Fusion-RRFRanker","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.md new file mode 100644 index 000000000..8f9fb642c --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/reranking.md @@ -0,0 +1,120 @@ +--- +id: reranking.md +summary: 本主題涵蓋重新排序流程,解釋其重要性以及兩種重新排序方法的實作。 +title: 重排 +--- +

    重排

    Milvus 使用hybrid_search()API 實現了混合搜尋功能,結合了精密的重排策略來精煉來自多個AnnSearchRequest 實例的搜尋結果。本主題涵蓋重排過程,解釋其重要性以及 Milvus 中不同重排策略的實作。

    +

    概述

    下圖說明了在 Milvus 中執行混合搜尋的過程,並強調了 reranking 在此過程中的作用。

    +

    reranking_process

    +

    混合搜尋中的重新排序是一個關鍵步驟,可整合來自多個向量領域的結果,確保最終輸出為相關且優先順序準確。目前,Milvus 提供這些重新排序策略:

    +
      +
    • WeightedRanker:這種方法是透過計算來自不同向量搜尋的分數(或向量距離)的加權平均值來合併結果。它根據每個向量領域的重要性來分配權重。

    • +
    • RRFRanker:此策略會根據不同向量列的排名來合併結果。

    • +
    +

    加權評分 (WeightedRanker)

    WeightedRanker 策略會根據每個向量欄位的重要性,為每個向量檢索路徑的結果指定不同的權重。當每個向量欄位的重要性不同時,就會採用此重新排序策略,讓您可以藉由賦予某些向量欄位較高的權重,來強調這些向量欄位而非其他向量欄位。例如,在多模式搜尋中,文字描述可能被認為比影像中的顏色分佈更重要。

    +

    WeightedRanker 的基本流程如下:

    +
      +
    • 在擷取過程中收集分數:收集來自不同向量擷取路徑的結果及其分數。

    • +
    • 分數規範化:將每個路徑的分數歸一化為 [0,1] 的範圍,其中值越接近 1 表示相關性越高。由於分數分佈會因不同的度量類型而異,因此此歸一化非常重要。例如,IP 的距離範圍為 [-∞,+∞],而 L2 的距離範圍為 [0,+∞]。Milvus 採用arctan 函數,將值轉換到 [0,1] 的範圍,為不同的度量類型提供標準化的基礎。

      +

      arctan-function

    • +
    • 權重分配:為每個向量擷取路徑分配一個權重w𝑖 。使用者指定的權重可反映資料來源的可靠性、準確性或其他相關指標。每個權重的範圍為 [0,1]。

    • +
    • 分數融合:計算標準化分數的加權平均值,得出最終分數。然後根據這些從高到低的分數對結果進行排序,以產生最終的排序結果。

    • +
    +

    + + weighted-reranker + 加權排序

    +

    若要使用此策略,請套用WeightedRanker 實例,並透過傳入可變數量的數值參數來設定權重值。

    +
    from pymilvus import WeightedRanker
    +
    +# Use WeightedRanker to combine results with specified weights
    +rerank = WeightedRanker(0.8, 0.8, 0.7) 
    +
    +

    請注意

    +
      +
    • 每個權重值的範圍從 0 (最不重要) 到 1 (最重要),影響最後的彙總分數。

    • +
    • WeightedRanker 中提供的權重值總數應該等於您之前建立的AnnSearchRequest 實體數量。

    • +
    • 值得注意的是,由於不同度量類型的測量方式不同,我們會將召回結果的距離規範化,使其位於區間 [0,1],其中 0 代表不同,1 代表相似。最終的分數將是權重值與距離的總和。

    • +
    +

    對等排名融合 (RRFRanker)

    RRF 是一種資料融合方法,它根據排名清單的倒數結合排名清單。它是一種平衡各向量領域影響力的有效方法,尤其是當重要程度沒有明顯的先後次序時。當您想要對所有向量領域給予同等的考量,或是不確定各領域的相對重要性時,通常會使用此策略。

    +

    RRF 的基本流程如下:

    +
      +
    • 在擷取過程中收集排名:跨多個向量欄位的擷取器擷取和排序結果。

    • +
    • 排名融合:RRF 演算法會對每個擷取器的排名進行權衡與合併。公式如下:

      +

      + + rrf-ranker + RRF-ranker

      +

      這裡,𝑁 代表不同擷取路徑的數量,rank𝑖(𝑑) 是𝑖th retriever 擷取文件𝑑 的排名位置,𝑘 是平滑參數,通常設定為 60。

    • +
    • 綜合排名:根據綜合評分對擷取的結果重新排序,以產生最終結果。

    • +
    +

    若要使用此策略,請套用RRFRanker 實例。

    +
    from pymilvus import RRFRanker
    +
    +# Default k value is 60
    +ranker = RRFRanker()
    +
    +# Or specify k value
    +ranker = RRFRanker(k=100)
    +
    +

    RRF 允許平衡各領域的影響力,而無需指定明確的權重。多個欄位同意的頂尖匹配項目將在最後排名中被優先排序。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.json new file mode 100644 index 000000000..b20470972 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import MilvusClient​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n anns_field=\"vector\",​\n data=[query_vector],​\n limit=3,​\n search_params={\"metric_type\": \"IP\"}​\n)​\n​\nfor hits in res:​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.service.vector.request.SearchReq;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n ​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"my_collection\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​\n\n","import (​\n \"context\"​\n \"fmt\"​\n \"log\"​\n​\n \"github.com/milvus-io/milvus/client/v2\"​\n \"github.com/milvus-io/milvus/client/v2/entity\"​\n)​\n​\nfunc ExampleClient_Search_basic() {​\n ctx, cancel := context.WithCancel(context.Background())​\n defer cancel()​\n​\n milvusAddr := \"127.0.0.1:19530\"​\n token := \"root:Milvus\"​\n​\n cli, err := client.New(ctx, &client.ClientConfig{​\n Address: milvusAddr,​\n APIKey: token,​\n })​\n if err != nil {​\n log.Fatal(\"failed to connect to milvus server: \", err.Error())​\n }​\n​\n defer cli.Close(ctx)​\n​\n queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​\n​\n resultSets, err := cli.Search(ctx, client.NewSearchOption(​\n \"my_collection\", // collectionName​\n 3, // limit​\n []entity.Vector{entity.FloatVector(queryVector)},​\n ))​\n if err != nil {​\n log.Fatal(\"failed to perform basic ANN search collection: \", err.Error())​\n }​\n​\n for _, resultSet := range resultSets {​\n log.Println(\"IDs: \", resultSet.IDs)​\n log.Println(\"Scores: \", resultSet.Scores)​\n }​\n // Output:​\n // IDs:​\n // Scores:​\n}​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"my_collection\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 7. Search with multiple vectors​\n# 7.1. Prepare query vectors​\nquery_vectors = [​\n [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​\n [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​\n]​\n​\n# 7.2. Start search​\nres = client.search(​\n collection_name=\"my_collection\",​\n data=query_vectors,​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# Output​\n#​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ],​\n# [​\n# {​\n# \"id\": 730,​\n# \"distance\": 0.04431751370429993,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 333,​\n# \"distance\": 0.04231833666563034,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 232,​\n# \"distance\": 0.04221535101532936,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.BaseVector;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nList queryVectors = Arrays.asList(​\n new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​\n new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​\n);​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(queryVectors)​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​\n// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​\n// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​\n// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​\n// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​\n\n","// 7. Search with multiple vectors​\nconst query_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n]​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n vectors: query_vectors,​\n limit: 5,​\n})​\n​\nconsole.log(res.results)​\n​\n// Output​\n// ​\n// [​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ],​\n// [​\n// { score: 0.04431751370429993, id: '730' },​\n// { score: 0.04231833666563034, id: '333' },​\n// { score: 0.04221535101532936, id: '232' },​\n// ]​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ],​\n# [​\n# {​\n# \"distance\": 0.04431751370429993,​\n# \"id\": 730​\n# },​\n# {​\n# \"distance\": 0.04231833666563034,​\n# \"id\": 333​\n# },​\n# {​\n# \"distance\": 0.04221535101532936,​\n# \"id\": 232​\n# }​\n# ]​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\nres = client.search(​\n collection_name=\"my_collection\",​\n # highlight-next-line​\n partition_names=[\"partitionA\"],​\n data=[query_vector],​\n limit=3,​\n)​\n​\nfor hits in res:​\n print(\"TopK results:\")​\n for hit in hits:​\n print(hit)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {}​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {}​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .partitionNames(Collections.singletonList(\"partitionA\"))​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​\n// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​\n// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n // highlight-next-line​\n partition_names: [\"partitionA\"],​\n data: query_vector,​\n limit: 3, // The number of results to return​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551' },​\n// { score: 0.0800950899720192, id: '296' },​\n// { score: 0.07794742286205292, id: '43' }​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"partitionNames\": [\"partitionA\"],​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={\"metric_type\": \"IP\"},​\n # highlight-next-line​\n output_fields=[\"color\"]​\n)​\n​\nprint(res)​\n​\n# [​\n# [​\n# {​\n# \"id\": 551,​\n# \"distance\": 0.08821295201778412,​\n# \"entity\": {​\n# \"color\": \"orange_6781\"​\n# }​\n# },​\n# {​\n# \"id\": 296,​\n# \"distance\": 0.0800950899720192,​\n# \"entity\": {​\n# \"color\": \"red_4794\"​\n# }​\n# },​\n# {​\n# \"id\": 43,​\n# \"distance\": 0.07794742286205292,​\n# \"entity\": {​\n# \"color\": \"grey_8510\"​\n# }​\n# }​\n# ]​\n# ]​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .outputFields(Collections.singletonList(\"color\"))​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​\n// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​\n// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return​\n // highlight-next-line​\n output_fields: [\"color\"]​\n})​\n​\nconsole.log(res.results)​\n​\n// [​\n// { score: 0.08821295201778412, id: '551', entity: {\"color\": \"orange_6781\"}},​\n// { score: 0.0800950899720192, id: '296' entity: {\"color\": \"red_4794\"}},​\n// { score: 0.07794742286205292, id: '43' entity: {\"color\": \"grey_8510\"}}​\n// ]​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"outputFields\": [\"color\"]​\n}'​\n​\n# {​\n# \"code\": 0,​\n# \"data\": [​\n# {​\n# \"distance\": 0.08821295201778412,​\n# \"id\": 551,​\n# \"color\": \"orange_6781\"​\n# },​\n# {​\n# \"distance\": 0.0800950899720192,​\n# \"id\": 296,​\n# \"color\": \"red_4794\"​\n# },​\n# {​\n# \"distance\": 0.07794742286205292,​\n# \"id\": 43​\n# \"color\": \"grey_8510\"​\n# }​\n# ]​\n# }​\n\n","# 4. Single vector search​\nquery_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = client.search(​\n collection_name=\"quick_setup\",​\n data=[query_vector],​\n limit=3, # The number of results to return​\n search_params={​\n \"metric_type\": \"IP\", ​\n # highlight-next-line​\n \"offset\": 10 # The records to skip​\n }​\n)​\n\n","import io.milvus.v2.service.vector.request.SearchReq​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\nimport io.milvus.v2.service.vector.response.SearchResp​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchReq searchReq = SearchReq.builder()​\n .collectionName(\"quick_setup\")​\n .data(Collections.singletonList(queryVector))​\n .topK(3)​\n .offset(10)​\n .build();​\n​\nSearchResp searchResp = client.search(searchReq);​\n​\nList> searchResults = searchResp.getSearchResults();​\nfor (List results : searchResults) {​\n System.out.println(\"TopK results:\");​\n for (SearchResp.SearchResult result : results) {​\n System.out.println(result);​\n }​\n}​\n​\n// Output​\n// TopK results:​\n// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​\n// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​\n// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​\n\n","// 4. Single vector search​\nvar query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​\n​\nres = await client.search({​\n collection_name: \"quick_setup\",​\n data: query_vector,​\n limit: 3, // The number of results to return,​\n // highlight-next-line​\n offset: 10 // The record to skip.​\n})​\n\n","export CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/entities/search\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d '{​\n \"collectionName\": \"quick_setup\",​\n \"data\": [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​\n ],​\n \"annsField\": \"vector\",​\n \"limit\": 3,​\n \"offset\": 10​\n}'​\n\n"],"headingContent":"Ba​sic ANN Search","anchorList":[{"label":"基本 ANN 搜尋","href":"Ba​sic-ANN-Search","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"單向量搜尋","href":"Single-Vector-Search​","type":2,"isActive":false},{"label":"大量向量搜尋","href":"Bulk-Vector-Search​","type":2,"isActive":false},{"label":"分區中的 ANN 搜尋","href":"ANN-Search-in-Partition​","type":2,"isActive":false},{"label":"使用輸出欄位","href":"Use-Output-Fields​","type":2,"isActive":false},{"label":"使用限制和偏移","href":"Use-Limit-and-Offset​","type":2,"isActive":false},{"label":"增強 ANN 搜尋","href":"Enhancing-ANN-Search​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.md new file mode 100644 index 000000000..2b00b888d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/single-vector-search.md @@ -0,0 +1,917 @@ +--- +id: single-vector-search.md +order: 1 +summary: 本文描述如何使用單一查詢向量在 Milvus 套件中搜尋向量。 +title: 基本 ANN 搜尋 +--- +

    基本 ANN 搜尋

    近似近鄰 (ANN) 搜尋是以記錄向量嵌入排序順序的索引檔案為基礎,根據接收到的搜尋請求中的查詢向量,找出向量嵌入的子集,將查詢向量與子集中的向量進行比較,並返回最相似的結果。透過 ANN 搜尋,Milvus 提供了高效率的搜尋體驗。本頁可協助您學習如何進行基本的 ANN 搜尋。

    +

    概述

    ANN 和 k-Nearest Neighbors (kNN) 搜索是向量相似性搜索的常用方法。在 kNN 搜尋中,您必須將向量空間中的所有向量與搜尋請求中的查詢向量進行比較,然後再找出最相似的向量,這既耗時又耗資。

    +

    與 kNN 搜尋不同,ANN 搜尋演算法要求一個索引檔案,記錄向量嵌入的排序順序。當收到搜尋要求時,您可以使用索引檔案作為參考,快速找出可能包含與查詢向量最相似的向量內嵌的子群。然後,您可以使用指定的度量類型來測量查詢向量與子群組中的向量之間的相似度,根據與查詢向量的相似度來排序群組成員,並找出前 K 個群組成員。

    +

    ANN 搜尋依賴預先建立的索引,搜尋的吞吐量、記憶體使用量和搜尋正確性可能會隨您選擇的索引類型而有所不同。您需要平衡搜尋效能與正確性。

    +

    為了降低學習曲線,Milvus 提供AUTOINDEX。有了AUTOINDEX,Milvus 可以在建立索引的同時,分析您的資料集中的資料分佈,並根據分析結果設定最優化的索引參數,在搜尋效能和正確性之間取得平衡。

    +

    有關 AUTOINDEX 和適用的度量類型的詳細資訊,請參閱AUTOINDEX度量類型。在本節中,您可以找到下列主題的詳細資訊。

    + +

    單向量搜尋

    在 ANN 搜尋中,單向量搜尋指的是只涉及一個查詢向量的搜尋。根據預先建立的索引和搜尋請求所帶的度量類型,Milvus 會找出與查詢向量最相似的前 K 個向量。

    +

    在本節中,您將學習如何進行單一向量搜尋。程式碼片段假設您已經以快速設定的方式建立了一個集合。搜尋請求帶有單一查詢向量,並要求 Milvus 使用 Inner Product (IP) 來計算查詢向量與集合中向量的相似度,並傳回三個最相似的向量。

    + +
    from pymilvus import MilvusClient​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    anns_field="vector",​
    +    data=[query_vector],​
    +    limit=3,​
    +    search_params={"metric_type": "IP"}​
    +)​
    +​
    +for hits in res:​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.service.vector.request.SearchReq;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +    ​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("my_collection")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.866088, id=7)​
    +
    +
    +
    import (​
    +    "context"​
    +    "fmt"​
    +    "log"​
    +​
    +    "github.com/milvus-io/milvus/client/v2"​
    +    "github.com/milvus-io/milvus/client/v2/entity"​
    +)​
    +​
    +func ExampleClient_Search_basic() {​
    +    ctx, cancel := context.WithCancel(context.Background())​
    +    defer cancel()​
    +​
    +    milvusAddr := "127.0.0.1:19530"​
    +    token := "root:Milvus"​
    +​
    +    cli, err := client.New(ctx, &client.ClientConfig{​
    +        Address: milvusAddr,​
    +        APIKey:  token,​
    +    })​
    +    if err != nil {​
    +        log.Fatal("failed to connect to milvus server: ", err.Error())​
    +    }​
    +​
    +    defer cli.Close(ctx)​
    +​
    +    queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}​
    +​
    +    resultSets, err := cli.Search(ctx, client.NewSearchOption(​
    +        "my_collection", // collectionName​
    +        3,             // limit​
    +        []entity.Vector{entity.FloatVector(queryVector)},​
    +    ))​
    +    if err != nil {​
    +        log.Fatal("failed to perform basic ANN search collection: ", err.Error())​
    +    }​
    +​
    +    for _, resultSet := range resultSets {​
    +        log.Println("IDs: ", resultSet.IDs)​
    +        log.Println("Scores: ", resultSet.Scores)​
    +    }​
    +    // Output:​
    +    // IDs:​
    +    // Scores:​
    +}​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "my_collection",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    Milvus 依據搜尋結果與查詢向量的相似度得分,以降序排列搜尋結果。相似性分數也稱為與查詢向量的距離,其值範圍會因使用的度量類型而異。

    +

    下表列出了適用的度量類型和相對應的距離範圍。

    +

    度量類型

    +

    特性

    +

    距離範圍

    +

    L2

    +

    值越小表示相似度越高。

    +

    [0, ∞)

    +

    IP

    +

    值越大,表示相似度越高。

    +

    [-1, 1]

    +

    COSINE

    +

    值越大,表示相似度越高。

    +

    [-1, 1]

    +

    JACCARD

    +

    值越小,表示相似度越高。

    +

    [0, 1]

    +

    HAMMING

    +

    較小的值表示較高的相似性。

    +

    [0,dim(向量)]

    +
    +

    大量向量搜尋

    同樣地,您可以在一個搜尋請求中包含多個查詢向量。Milvus 會平行地對查詢向量進行 ANN 搜尋,並傳回兩組結果。

    + +
    # 7. Search with multiple vectors​
    +# 7.1. Prepare query vectors​
    +query_vectors = [​
    +    [0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​
    +    [0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​
    +]​
    +​
    +# 7.2. Start search​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    data=query_vectors,​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# Output​
    +#​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ],​
    +#     [​
    +#         {​
    +#             "id": 730,​
    +#             "distance": 0.04431751370429993,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 333,​
    +#             "distance": 0.04231833666563034,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 232,​
    +#             "distance": 0.04221535101532936,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.BaseVector;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +List<BaseVector> queryVectors = Arrays.asList(​
    +        new FloatVec(new float[]{0.041732933f, 0.013779674f, -0.027564144f, -0.013061441f, 0.009748648f}),​
    +        new FloatVec(new float[]{0.0039737443f, 0.003020432f, -0.0006188639f, 0.03913546f, -0.00089768134f})​
    +);​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(queryVectors)​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.49548206, id=1)​
    +// SearchResp.SearchResult(entity={}, score=0.320147, id=3)​
    +// SearchResp.SearchResult(entity={}, score=0.107413776, id=6)​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.5678123, id=6)​
    +// SearchResp.SearchResult(entity={}, score=0.32368967, id=2)​
    +// SearchResp.SearchResult(entity={}, score=0.24108477, id=3)​
    +
    +
    +
    // 7. Search with multiple vectors​
    +const query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], ​
    +    [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +]​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    vectors: query_vectors,​
    +    limit: 5,​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// Output​
    +// ​
    +// [​
    +//   [​
    +//     { score: 0.08821295201778412, id: '551' },​
    +//     { score: 0.0800950899720192, id: '296' },​
    +//     { score: 0.07794742286205292, id: '43' }​
    +//   ],​
    +//   [​
    +//     { score: 0.04431751370429993, id: '730' },​
    +//     { score: 0.04231833666563034, id: '333' },​
    +//     { score: 0.04221535101532936, id: '232' },​
    +//   ]​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +        [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         [​
    +#           {​
    +#               "distance": 0.08821295201778412,​
    +#               "id": 551​
    +#           },​
    +#           {​
    +#               "distance": 0.0800950899720192,​
    +#               "id": 296​
    +#           },​
    +#           {​
    +#               "distance": 0.07794742286205292,​
    +#               "id": 43​
    +#           }​
    +#         ],​
    +#         [​
    +#           {​
    +#               "distance": 0.04431751370429993,​
    +#               "id": 730​
    +#           },​
    +#           {​
    +#               "distance": 0.04231833666563034,​
    +#               "id": 333​
    +#           },​
    +#           {​
    +#               "distance": 0.04221535101532936,​
    +#               "id": 232​
    +#           }​
    +#        ]​
    +#     ]​
    +# }​
    +
    +
    +

    分區中的 ANN 搜尋

    假設您在一個集合中建立了多個分割區,而您可以將搜尋範圍縮小到特定數量的分割區。在這種情況下,您可以在搜尋請求中包含目標磁碟分割名稱,以將搜尋範圍限制在指定的磁碟分割內。減少搜尋所涉及的磁碟分割數目可改善搜尋效能。

    +

    以下程式碼片段假設您的集合中有一個名為PartitionA的分割區。

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +res = client.search(​
    +    collection_name="my_collection",​
    +    # highlight-next-line​
    +    partition_names=["partitionA"],​
    +    data=[query_vector],​
    +    limit=3,​
    +)​
    +​
    +for hits in res:​
    +    print("TopK results:")​
    +    for hit in hits:​
    +        print(hit)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {}​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {}​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .partitionNames(Collections.singletonList("partitionA"))​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.6395302, id=13)​
    +// SearchResp.SearchResult(entity={}, score=0.5408028, id=12)​
    +// SearchResp.SearchResult(entity={}, score=0.49696884, id=17)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    // highlight-next-line​
    +    partition_names: ["partitionA"],​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551' },​
    +//   { score: 0.0800950899720192, id: '296' },​
    +//   { score: 0.07794742286205292, id: '43' }​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "partitionNames": ["partitionA"],​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    使用輸出欄位

    在搜尋結果中,Milvus 預設會包含包含 top-K 向量嵌入的實體的主要欄位值和相似性距離/分數。您可以在搜尋請求中包含目標欄位名稱作為輸出欄位,讓搜尋結果包含這些實體中其他欄位的值。

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={"metric_type": "IP"},​
    +    # highlight-next-line​
    +    output_fields=["color"]​
    +)​
    +​
    +print(res)​
    +​
    +# [​
    +#     [​
    +#         {​
    +#             "id": 551,​
    +#             "distance": 0.08821295201778412,​
    +#             "entity": {​
    +#                 "color": "orange_6781"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 296,​
    +#             "distance": 0.0800950899720192,​
    +#             "entity": {​
    +#                 "color": "red_4794"​
    +#             }​
    +#         },​
    +#         {​
    +#             "id": 43,​
    +#             "distance": 0.07794742286205292,​
    +#             "entity": {​
    +#                 "color": "grey_8510"​
    +#             }​
    +#         }​
    +#     ]​
    +# ]​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .outputFields(Collections.singletonList("color"))​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={color=black_9955}, score=0.95944905, id=5)​
    +// SearchResp.SearchResult(entity={color=red_7319}, score=0.8689616, id=1)​
    +// SearchResp.SearchResult(entity={color=white_5015}, score=0.866088, id=7)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return​
    +    // highlight-next-line​
    +    output_fields: ["color"]​
    +})​
    +​
    +console.log(res.results)​
    +​
    +// [​
    +//   { score: 0.08821295201778412, id: '551', entity: {"color": "orange_6781"}},​
    +//   { score: 0.0800950899720192, id: '296' entity: {"color": "red_4794"}},​
    +//   { score: 0.07794742286205292, id: '43' entity: {"color": "grey_8510"}}​
    +// ]​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "outputFields": ["color"]​
    +}'​
    +​
    +# {​
    +#     "code": 0,​
    +#     "data": [​
    +#         {​
    +#             "distance": 0.08821295201778412,​
    +#             "id": 551,​
    +#             "color": "orange_6781"​
    +#         },​
    +#         {​
    +#             "distance": 0.0800950899720192,​
    +#             "id": 296,​
    +#             "color": "red_4794"​
    +#         },​
    +#         {​
    +#             "distance": 0.07794742286205292,​
    +#             "id": 43​
    +#             "color": "grey_8510"​
    +#         }​
    +#     ]​
    +# }​
    +
    +
    +

    使用限制和偏移

    您可能會注意到,搜尋要求中攜帶的參數limit 會決定搜尋結果中包含的實體數目。此參數指定在單次搜尋中返回的最大實體數目,通常稱為top-K。

    +

    如果您希望執行分頁查詢,可以使用循環傳送多個 Search 請求,並在每個查詢請求中載入LimitOffset參數。具體來說,您可以將Limit參數設定為您想要包含在目前查詢結果中的 Entities 數量,並將Offset設定為已經返回的 Entities 總數。

    +

    下表概述了在一次返回 100 個實體時,如何為分頁查詢設定LimitOffset參數。

    +

    查詢

    +

    每次查詢要返回的實體

    +

    已返回的實體總數

    +

    第 1 次查詢

    +

    100

    +

    0

    +

    第二次查詢

    +

    100

    +

    100

    +

    第三次查詢

    +

    100

    +

    200

    +

    第 n 次查詢

    +

    100

    +

    100 x (n-1)

    +
    +

    請注意,在單一 ANN 搜尋中,limitoffset 的總和應該小於 16,384。

    + +
    # 4. Single vector search​
    +query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = client.search(​
    +    collection_name="quick_setup",​
    +    data=[query_vector],​
    +    limit=3, # The number of results to return​
    +    search_params={​
    +        "metric_type": "IP", ​
    +        # highlight-next-line​
    +        "offset": 10 # The records to skip​
    +    }​
    +)​
    +
    +
    +
    import io.milvus.v2.service.vector.request.SearchReq​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +import io.milvus.v2.service.vector.response.SearchResp​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchReq searchReq = SearchReq.builder()​
    +        .collectionName("quick_setup")​
    +        .data(Collections.singletonList(queryVector))​
    +        .topK(3)​
    +        .offset(10)​
    +        .build();​
    +​
    +SearchResp searchResp = client.search(searchReq);​
    +​
    +List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();​
    +for (List<SearchResp.SearchResult> results : searchResults) {​
    +    System.out.println("TopK results:");​
    +    for (SearchResp.SearchResult result : results) {​
    +        System.out.println(result);​
    +    }​
    +}​
    +​
    +// Output​
    +// TopK results:​
    +// SearchResp.SearchResult(entity={}, score=0.24120237, id=16)​
    +// SearchResp.SearchResult(entity={}, score=0.22559784, id=9)​
    +// SearchResp.SearchResult(entity={}, score=-0.09906838, id=2)​
    +
    +
    +
    // 4. Single vector search​
    +var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],​
    +​
    +res = await client.search({​
    +    collection_name: "quick_setup",​
    +    data: query_vector,​
    +    limit: 3, // The number of results to return,​
    +    // highlight-next-line​
    +    offset: 10 // The record to skip.​
    +})​
    +
    +
    +
    export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d '{​
    +    "collectionName": "quick_setup",​
    +    "data": [​
    +        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
    +    ],​
    +    "annsField": "vector",​
    +    "limit": 3,​
    +    "offset": 10​
    +}'​
    +
    +
    +

    增強 ANN 搜尋

    AUTOINDEX 可大幅拉平 ANN 搜尋的學習曲線。然而,隨著 top-K 的增加,搜尋結果不一定總是正確的。藉由縮小搜尋範圍、改善搜尋結果的相關性,以及使搜尋結果更多元化,Milvus 進行了以下的搜尋強化。

    +
      +
    • 過濾搜尋

      +

      您可以在搜尋請求中加入過濾條件,讓 Milvus 在進行 ANN 搜尋之前先進行元資料過濾,將搜尋範圍從整個集合縮小到只有符合指定過濾條件的實體。

      +

      更多關於元資料過濾和過濾條件,請參考過濾搜尋和元資料過濾

    • +
    • 範圍搜尋

      +

      您可以在特定範圍內限制返回實體的距離或分數,以改善搜尋結果的相關性。在 Milvus 中,範圍搜尋涉及以與查詢向量最相似的向量嵌入為中心,畫出兩個同心圓。搜尋請求指定兩個圓圈的半徑,Milvus 會傳回屬於外圈但不屬於內圈的所有向量嵌入。

      +

      更多關於範圍搜尋,請參考範圍搜尋

    • +
    • 群組搜尋

      +

      如果返回的實體在特定欄位中持有相同的值,搜尋結果可能無法代表向量空間中所有向量內嵌的分佈。若要分散搜尋結果,請考慮使用群組搜尋。

      +

      關於群組搜尋的更多資訊,請參閱群組搜尋

    • +
    • 混合搜尋

      +

      一個集合最多可包含四個向量場,以儲存使用不同嵌入模型產生的向量嵌入。如此一來,您就可以使用混合搜尋來重新排序這些向量欄位的搜尋結果,從而提高召回率。

      +

      有關混合搜尋的更多資訊,請參閱混合搜尋

    • +
    • 搜尋迭代器

      +

      單一 ANN 搜尋最多會返回 16,384 個實體。如果您需要在單一搜尋中返回更多實體,請考慮使用搜尋迭接器。

      +

      有關搜尋迭接器的詳細資訊,請參閱搜尋迭接器

    • +
    • 全文本搜尋

      +

      全文檢索是一種在文字資料集中擷取包含特定詞彙或短語的文件,然後根據相關性排列結果的功能。此功能克服了語意搜尋可能會忽略精確詞彙的限制,確保您收到最精確且與上下文最相關的結果。此外,它還可以透過接受原始文字輸入來簡化向量搜尋,自動將您的文字資料轉換為稀疏嵌入,而不需要手動產生向量嵌入。

      +

      有關全文檢索的詳細資訊,請參閱全文檢索

    • +
    • 文字匹配

      +

      Milvus 中的文字匹配可根據特定術語進行精確的文件檢索。此功能主要用於滿足特定條件的篩選搜尋,並可結合標量篩選來精細查詢結果,允許在符合標量條件的向量內進行相似性搜尋。

      +

      有關文字匹配的詳細資訊,請參閱文字匹配

    • +
    • 使用分割鍵

      +

      在元資料篩選中涉及多個標量欄位,並使用相當複雜的篩選條件,可能會影響搜尋效率。一旦將標量欄位設定為分割區金鑰,並在搜尋請求中使用涉及分割區金鑰的篩選條件,將有助於將搜尋範圍限制在與指定分割區金鑰值對應的分割區內。

      +

      有關分割區金鑰的詳細資訊,請參閱使用分割區金鑰。

    • +
    • 使用 mmap

      +

      在 Milvus 中,記憶體映射檔案允許直接將檔案內容映射到記憶體中。此功能可增強記憶體效率,尤其是在可用記憶體稀少但完整資料載入不可行的情況下。此最佳化機制可在增加資料容量的同時,在一定限度內確保效能;但當資料量超出記憶體太多時,搜尋和查詢效能可能會嚴重下降,因此請視情況選擇開啟或關閉此功能。

      +

      有關 mmap 設定的詳細資訊,請參閱使用 mmap

    • +
    • 叢集壓縮

      +

      叢集壓縮的目的是在大型資料集中改善搜尋效能並降低成本。本指南將協助您瞭解聚類壓縮以及此功能如何改善搜尋效能。

      +

      有關聚類壓縮的詳細資訊,請參閱聚類壓縮。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.json new file mode 100644 index 000000000..48faa9b6d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import (​\n MilvusClient, DataType​\n)​\n​\nclient = MilvusClient(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\nschema = client.create_schema()​\n​\n# Add the partition key​\nschema.add_field(​\n field_name=\"my_varchar\", ​\n datatype=DataType.VARCHAR, ​\n max_length=512,​\n # highlight-next-line​\n is_partition_key=True,​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.v2.common.DataType;​\nimport io.milvus.v2.service.collection.request.AddFieldReq;​\nimport io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\n// Create schema​\nCreateCollectionReq.CollectionSchema schema = client.createSchema();​\n​\n// Add the partition key​\nschema.addField(AddFieldReq.builder()​\n .fieldName(\"my_varchar\")​\n .dataType(DataType.VarChar)​\n .maxLength(512)​\n // highlight-next-line​\n .isPartitionKey(true)​\n .build());​\n\n","import { MilvusClient, DataType } from \"@zilliz/milvus2-sdk-node\";​\n​\nconst address = \"http://localhost:19530\";​\nconst token = \"root:Milvus\";​\nconst client = new MilvusClient({address, token});​\n​\n// 3. Create a collection in customized setup mode​\n// 3.1 Define fields​\nconst fields = [​\n {​\n name: \"my_varchar\",​\n data_type: DataType.VarChar,​\n max_length: 512,​\n // highlight-next-line​\n is_partition_key: true​\n }​\n]​\n\n","export schema='{​\n \"autoId\": true,​\n \"enabledDynamicField\": false,​\n \"fields\": [​\n {​\n \"fieldName\": \"my_id\",​\n \"dataType\": \"Int64\",​\n \"isPrimary\": true​\n },​\n {​\n \"fieldName\": \"my_vector\",​\n \"dataType\": \"FloatVector\",​\n \"elementTypeParams\": {​\n \"dim\": \"5\"​\n }​\n },​\n {​\n \"fieldName\": \"my_varchar\",​\n \"dataType\": \"VarChar\",​\n \"isPartitionKey\": true,​\n \"elementTypeParams\": {​\n \"max_length\": 512​\n }​\n }​\n ]​\n }'​\n\n","client.create_collection(​\n collection_name=\"my_collection\",​\n schema=schema,​\n # highlight-next-line​\n num_partitions=1024​\n)​\n\n","import io.milvus.v2.service.collection.request.CreateCollectionReq;​\n​\nCreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​\n .collectionName(\"my_collection\")​\n .collectionSchema(schema)​\n .numPartitions(1024)​\n .build();​\n client.createCollection(createCollectionReq);​\n\n","await client.create_collection({​\n collection_name: \"my_collection\",​\n schema: schema,​\n num_partitions: 1024​\n})​\n\n","export params='{​\n \"partitionsNum\": 1024​\n}'​\n​\nexport CLUSTER_ENDPOINT=\"http://localhost:19530\"​\nexport TOKEN=\"root:Milvus\"​\n​\ncurl --request POST \\​\n--url \"${CLUSTER_ENDPOINT}/v2/vectordb/collections/create\" \\​\n--header \"Authorization: Bearer ${TOKEN}\" \\​\n--header \"Content-Type: application/json\" \\​\n-d \"{​\n \\\"collectionName\\\": \\\"myCollection\\\",​\n \\\"schema\\\": $schema,​\n \\\"params\\\": $params​\n}\"​\n\n","# Filter based on a single partition key value, or​\nfilter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nfilter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","// Filter based on a single partition key value, or​\nString filter = \"partition_key == 'x' && \";​\n​\n// Filter based on multiple partition key values​\nString filter = \"partition_key in ['x', 'y', 'z'] && \";​\n\n","// Filter based on a single partition key value, or​\nconst filter = 'partition_key == \"x\" && '​\n​\n// Filter based on multiple partition key values​\nconst filter = 'partition_key in [\"x\", \"y\", \"z\"] && '​\n\n","# Filter based on a single partition key value, or​\nexport filter='partition_key == \"x\" && '​\n​\n# Filter based on multiple partition key values​\nexport filter='partition_key in [\"x\", \"y\", \"z\"] && '​\n\n"],"headingContent":"Use Partition Key​","anchorList":[{"label":"使用分區鑰匙","href":"Use-Partition-Key​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"使用分區鑰匙","href":"Use-Partition-Key​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.md new file mode 100644 index 000000000..7bc0eb88e --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/use-partition-key.md @@ -0,0 +1,245 @@ +--- +id: use-partition-key.md +title: 使用磁碟分割金鑰 +--- +

    使用分區鑰匙

    分區關鍵是基於分區的搜尋最佳化解決方案。透過指定特定的標量欄位為分區關鍵 (Partition Key),並在搜尋過程中根據分區關鍵指定篩選條件,可將搜尋範圍縮小為數個分區,進而提高搜尋效率。本文將介紹如何使用分區關鍵及相關注意事項。

    +

    概述

    在 Milvus 中,您可以使用磁碟分割來實現資料分隔,並透過限制搜尋範圍到特定磁碟分割來改善搜尋效能。如果您選擇手動管理分區,您可以在一個集合中建立最多 1,024 個分區,並根據特定規則插入實體到這些分區中,這樣您就可以通過限制在特定數量的分區中進行搜索來縮窄搜索範圍。

    +

    Milvus 引入了分區鑰匙,讓您在資料分隔中重複使用分區,以克服在集合中建立分區數量的限制。當建立一個資料集時,您可以使用一個標量欄位作為分割鍵。一旦集合準備就緒,Milvus 就會在集合內建立指定數量的分區,每個分區對應於分區鍵值的範圍。當接收到插入的實體時,Milvus 會根據它們的 Partition Key 值,將它們儲存在不同的分區中。

    +

    + + Partition v.s. Partition Key + 分區對分區鑰

    +

    下圖說明 Milvus 如何在有或沒有啟用「分區鍵」功能的情況下,處理資料集中的搜尋要求。

    +
      +
    • 如果關閉了分割區金鑰,Milvus 會在資料集中搜尋與查詢向量最相似的實體。如果您知道哪個分區包含最相關的結果,就可以縮小搜尋範圍。

    • +
    • 如果啟用了分割區金鑰,Milvus 會根據搜尋篩選器中指定的分割區金鑰值來決定搜尋範圍,並只掃描分割區內符合條件的實體。

    • +
    +

    + + With or Without Partition Key + 使用或不使用分割區金鑰

    +

    使用分割區金鑰

    要使用分區鍵值,您需要

    +
      +
    • 設定分割區金鑰。

    • +
    • 設定要建立的分割區數量 (選用),以及

    • +
    • 根據分割區金鑰建立篩選條件。

    • +
    +

    設定分割區金鑰

    若要指定標量欄位為分割區金鑰,您需要在新增標量欄位時,將其is_partition_key 屬性設定為true

    + +
    from pymilvus import (​
    +    MilvusClient, DataType​
    +)​
    +​
    +client = MilvusClient(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +schema = client.create_schema()​
    +​
    +# Add the partition key​
    +schema.add_field(​
    +    field_name="my_varchar", ​
    +    datatype=DataType.VARCHAR, ​
    +    max_length=512,​
    +    # highlight-next-line​
    +    is_partition_key=True,​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.v2.common.DataType;​
    +import io.milvus.v2.service.collection.request.AddFieldReq;​
    +import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +// Create schema​
    +CreateCollectionReq.CollectionSchema schema = client.createSchema();​
    +​
    +// Add the partition key​
    +schema.addField(AddFieldReq.builder()​
    +        .fieldName("my_varchar")​
    +        .dataType(DataType.VarChar)​
    +        .maxLength(512)​
    +        // highlight-next-line​
    +        .isPartitionKey(true)​
    +        .build());​
    +
    +
    +
    import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";​
    +​
    +const address = "http://localhost:19530";​
    +const token = "root:Milvus";​
    +const client = new MilvusClient({address, token});​
    +​
    +// 3. Create a collection in customized setup mode​
    +// 3.1 Define fields​
    +const fields = [​
    +    {​
    +        name: "my_varchar",​
    +        data_type: DataType.VarChar,​
    +        max_length: 512,​
    +        // highlight-next-line​
    +        is_partition_key: true​
    +    }​
    +]​
    +
    +
    +
    export schema='{​
    +        "autoId": true,​
    +        "enabledDynamicField": false,​
    +        "fields": [​
    +            {​
    +                "fieldName": "my_id",​
    +                "dataType": "Int64",​
    +                "isPrimary": true​
    +            },​
    +            {​
    +                "fieldName": "my_vector",​
    +                "dataType": "FloatVector",​
    +                "elementTypeParams": {​
    +                    "dim": "5"​
    +                }​
    +            },​
    +            {​
    +                "fieldName": "my_varchar",​
    +                "dataType": "VarChar",​
    +                "isPartitionKey": true,​
    +                "elementTypeParams": {​
    +                    "max_length": 512​
    +                }​
    +            }​
    +        ]​
    +    }'​
    +
    +
    +

    設定分割區號碼

    當你指定一個集合中的標量欄位作為分區鍵時,Milvus 會自動在集合中建立 16 個分區。當接收到一個實體時,Milvus 會根據該實體的 Partition Key 值選擇一個分區,並將該實體儲存於該分區中,導致某些或所有分區持有不同 Partition Key 值的實體。

    +

    您也可以決定要與集合一起建立的分割區數量。只有當您指定一個標量欄位作為 Partition Key 時,這才有效。

    + +
    client.create_collection(​
    +    collection_name="my_collection",​
    +    schema=schema,​
    +    # highlight-next-line
    +    num_partitions=1024​
    +)​
    +
    +
    +
    import io.milvus.v2.service.collection.request.CreateCollectionReq;​
    +​
    +CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()​
    +                .collectionName("my_collection")​
    +                .collectionSchema(schema)​
    +                .numPartitions(1024)​
    +                .build();​
    +        client.createCollection(createCollectionReq);​
    +
    +
    +
    await client.create_collection({​
    +    collection_name: "my_collection",​
    +    schema: schema,​
    +    num_partitions: 1024​
    +})​
    +
    +
    +
    export params='{​
    +    "partitionsNum": 1024​
    +}'​
    +​
    +export CLUSTER_ENDPOINT="http://localhost:19530"​
    +export TOKEN="root:Milvus"​
    +​
    +curl --request POST \​
    +--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \​
    +--header "Authorization: Bearer ${TOKEN}" \​
    +--header "Content-Type: application/json" \​
    +-d "{​
    +    \"collectionName\": \"myCollection\",​
    +    \"schema\": $schema,​
    +    \"params\": $params​
    +}"​
    +
    +
    +

    建立篩選條件

    在啟用了分割區金鑰功能的資料集中執行 ANN 搜尋時,您需要在搜尋請求中包含一個涉及分割區金鑰的篩選表達式。在篩選表達式中,您可以限制 Partition Key 的值在特定範圍內,這樣 Milvus 就會把搜尋範圍限制在相對應的分區內。

    +

    以下範例展示基於 Partition-Key 的篩選方式,以特定的 Partition Key 值和一組 Partition Key 值為基礎。

    + +
    # Filter based on a single partition key value, or​
    +filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +String filter = "partition_key == 'x' && <other conditions>";​
    +​
    +// Filter based on multiple partition key values​
    +String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";​
    +
    +
    +
    // Filter based on a single partition key value, or​
    +const filter = 'partition_key == "x" && <other conditions>'​
    +​
    +// Filter based on multiple partition key values​
    +const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    +
    # Filter based on a single partition key value, or​
    +export filter='partition_key == "x" && <other conditions>'​
    +​
    +# Filter based on multiple partition key values​
    +export filter='partition_key in ["x", "y", "z"] && <other conditions>'​
    +
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.json b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.json new file mode 100644 index 000000000..743ca1356 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.json @@ -0,0 +1 @@ +{"codeList":["from pymilvus import connections, Collection​\n​\nconnections.connect(​\n uri=\"http://localhost:19530\",​\n token=\"root:Milvus\"​\n)​\n​\n# create iterator​\nquery_vectors = [​\n [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​\n​\ncollection = Collection(\"iterator_collection\")​\n​\niterator = collection.search_iterator(​\n data=query_vectors,​\n anns_field=\"vector\",​\n param={\"metric_type\": \"L2\", \"params\": {\"nprobe\": 16}},​\n # highlight-next-line​\n batch_size=50,​\n output_fields=[\"color\"],​\n # highlight-next-line​\n limit=20000​\n)​\n\n","import io.milvus.v2.client.ConnectConfig;​\nimport io.milvus.v2.client.MilvusClientV2;​\nimport io.milvus.orm.iterator.SearchIterator;​\nimport io.milvus.v2.common.IndexParam.MetricType;​\nimport io.milvus.v2.service.vector.request.data.FloatVec;​\n​\nimport java.util.*;​\n​\nMilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​\n .uri(\"http://localhost:19530\")​\n .token(\"root:Milvus\")​\n .build());​\n​\nFloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​\nSearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​\n .collectionName(\"iterator_collection\")​\n .vectors(Collections.singletonList(queryVector))​\n .vectorFieldName(\"vector\")​\n .batchSize(500L)​\n .outputFields(Lists.newArrayList(\"color\"))​\n .topK(20000)​\n .metricType(IndexParam.MetricType.COSINE)​\n .build());​\n\n","results = []​\n​\nwhile True:​\n # highlight-next-line​\n result = iterator.next()​\n if not result:​\n # highlight-next-line​\n iterator.close()​\n break​\n ​\n for hit in result:​\n results.append(hit.to_dict())​\n\n","import io.milvus.response.QueryResultsWrapper;​\n​\nwhile (true) {​\n List res = searchIterator.next();​\n if (res.isEmpty()) {​\n searchIterator.close();​\n break;​\n }​\n​\n for (QueryResultsWrapper.RowRecord record : res) {​\n System.out.println(record);​\n }​\n}​\n\n"],"headingContent":"Search Iterator​","anchorList":[{"label":"搜尋迭代器","href":"Search-Iterator​","type":1,"isActive":false},{"label":"概述","href":"Overview​","type":2,"isActive":false},{"label":"建立 SearchIterator","href":"Create-SearchIterator​","type":2,"isActive":false},{"label":"使用 SearchIterator","href":"Use-SearchIterator​","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.md b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.md new file mode 100644 index 000000000..a950b6f73 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/search-query-get/with-iterators.md @@ -0,0 +1,161 @@ +--- +id: with-iterators.md +order: 4 +summary: Milvus 提供搜尋與查詢迭代器,用來迭代大量實體的結果。 +title: 使用迭代器 +--- +

    搜尋迭代器

    ANN Search 對於單一查詢可回收的實體數量有最大限制,單純使用基本 ANN Search 可能無法滿足大規模檢索的需求。對於 topK 超過 16,384 的 ANN Search 請求,建議考慮使用 SearchIterator。本節將介紹如何使用 SearchIterator 及相關注意事項。

    +

    概述

    Search 請求會返回搜尋結果,而 SearchIterator 會返回一個迭代器。您可以呼叫這個迭代器的next()方法來取得搜尋結果。

    +

    具體來說,您可以如下使用 SearchIterator。

    +
      +
    1. 建立一個 SearchIterator,並設定每個搜尋要求要傳回的實體數量,以及要傳回的實體總數

    2. +
    3. 在循環中呼叫 SearchIterator 的next()方法,以分頁方式取得搜尋結果。

    4. +
    5. 如果next()方法返回空結果,則呼叫迭代器的close()方法結束循環。

    6. +
    +

    建立 SearchIterator

    以下程式碼片段示範如何建立 SearchIterator。

    + +
    from pymilvus import connections, Collection​
    +​
    +connections.connect(​
    +    uri="http://localhost:19530",​
    +    token="root:Milvus"​
    +)​
    +​
    +# create iterator​
    +query_vectors = [​
    +    [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]​
    +​
    +collection = Collection("iterator_collection")​
    +​
    +iterator = collection.search_iterator(​
    +    data=query_vectors,​
    +    anns_field="vector",​
    +    param={"metric_type": "L2", "params": {"nprobe": 16}},​
    +    # highlight-next-line
    +    batch_size=50,​
    +    output_fields=["color"],​
    +    # highlight-next-line
    +    limit=20000​
    +)​
    +
    +
    +
    import io.milvus.v2.client.ConnectConfig;​
    +import io.milvus.v2.client.MilvusClientV2;​
    +import io.milvus.orm.iterator.SearchIterator;​
    +import io.milvus.v2.common.IndexParam.MetricType;​
    +import io.milvus.v2.service.vector.request.data.FloatVec;​
    +​
    +import java.util.*;​
    +​
    +MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()​
    +        .uri("http://localhost:19530")​
    +        .token("root:Milvus")​
    +        .build());​
    +​
    +FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});​
    +SearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()​
    +        .collectionName("iterator_collection")​
    +        .vectors(Collections.singletonList(queryVector))​
    +        .vectorFieldName("vector")​
    +        .batchSize(500L)​
    +        .outputFields(Lists.newArrayList("color"))​
    +        .topK(20000)​
    +        .metricType(IndexParam.MetricType.COSINE)​
    +        .build());​
    +
    +
    +

    在上述範例中,您將每次搜尋要返回的實體數量(batch_size/batchSize) 設定為 50,而要返回的實體總數(topK) 設定為 20,000。

    +

    使用 SearchIterator

    一旦 SearchIterator 準備就緒,您就可以呼叫它的 next() 方法,以分頁的方式取得搜尋結果。

    + +
    results = []​
    +​
    +while True:​
    +    # highlight-next-line​
    +    result = iterator.next()​
    +    if not result:​
    +        # highlight-next-line​
    +        iterator.close()​
    +        break​
    +    ​
    +    for hit in result:​
    +        results.append(hit.to_dict())​
    +
    +
    +
    import io.milvus.response.QueryResultsWrapper;​
    +​
    +while (true) {​
    +    List<QueryResultsWrapper.RowRecord> res = searchIterator.next();​
    +    if (res.isEmpty()) {​
    +        searchIterator.close();​
    +        break;​
    +    }​
    +​
    +    for (QueryResultsWrapper.RowRecord record : res) {​
    +        System.out.println(record);​
    +    }​
    +}​
    +
    +
    +

    在上面的程式碼範例中,您建立了一個無限循環,並在循環中呼叫next()方法,將搜尋結果儲存在變數中,並在next()沒有回傳任何結果時關閉迭代器。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.json new file mode 100644 index 000000000..9d9891d4a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo install github.com/milvus-io/birdwatcher\n","go run main.go\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ngo build -o birdwatcher main.go\n","./birdwatcher\n","wget -O birdwatcher.tar.gz \\\nhttps://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher__.tar.gz\n","tar -xvzf birdwatcher.tar.gz\n./birdwatcher\n","apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: birdwatcher\nspec:\n selector:\n matchLabels:\n app: birdwatcher\n template:\n metadata:\n labels:\n app: birdwatcher\n spec:\n containers:\n - name: birdwatcher\n image: milvusdb/birdwatcher\n resources:\n limits:\n memory: \"128Mi\"\n cpu: \"500m\"\n","git clone https://github.com/milvus-io/birdwatcher.git\ncd birdwatcher\ndocker build -t milvusdb/birdwatcher .\n","...\n - name: birdwatcher\n image: milvusdb/birdwatcher\n imagePullPolicy: Never\n...\n","kubectl apply -f deployment.yml\n"],"headingContent":"Install Birdwatcher","anchorList":[{"label":"安裝觀鳥者","href":"Install-Birdwatcher","type":1,"isActive":false},{"label":"本地安裝","href":"Local-install","type":2,"isActive":false},{"label":"安裝為 Kubernetes pod","href":"Install-as-a-Kubernetes-pod","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.md new file mode 100644 index 000000000..d064b7b6b --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_install_guides.md @@ -0,0 +1,118 @@ +--- +id: birdwatcher_install_guides.md +summary: 學習如何安裝 Birdwatch 來調試 Milvus。 +title: 安裝觀鳥者 +--- +

    安裝觀鳥者

    本頁說明如何安裝 Birdwatcher。

    +

    本地安裝

    如果您使用 docker 安裝了 Milvus Standalone,您最好下載並安裝已建立的二進位版本,將 Birdwatcher 安裝為一般 Go 模組,或從原始碼建立 Birdwatcher。

    +
      +
    • 將它安裝為一般 Go 模組。

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go install github.com/milvus-io/birdwatcher
      +
      +

      然後您就可以執行 Birdwatcher,步驟如下:

      +
      go run main.go
      +
    • +
    • 從原始碼建立。

      +
      git clone https://github.com/milvus-io/birdwatcher.git
      +cd birdwatcher
      +go build -o birdwatcher main.go
      +
      +

      然後按以下步驟執行 Birdwatcher:

      +
      ./birdwatcher
      +
    • +
    • 下載已建立的二進位版本

      +

      首先,打開最新版本頁面,找到準備好的二進位檔。

      +
      wget -O birdwatcher.tar.gz \
      +https://github.com/milvus-io/birdwatcher/releases/download/latest/birdwatcher_<os>_<arch>.tar.gz
      +
      +

      然後您可以解壓縮 tar 包,並按以下方式使用 Birdwatcher:

      +
      tar -xvzf birdwatcher.tar.gz
      +./birdwatcher
      +
    • +
    +

    安裝為 Kubernetes pod

    如果您已使用 Helm 圖表或 MilvusOperator安裝 Milvus Standalone,或使用 Helm 圖表或 MilvusOperator 安裝 Milvus Cluster,建議您將 Birdwatcher 安裝為 Kubernetes pod。

    +

    準備部署.yml

    apiVersion: apps/v1
    +kind: Deployment
    +metadata:
    +  name: birdwatcher
    +spec:
    +  selector:
    +    matchLabels:
    +      app: birdwatcher
    +  template:
    +    metadata:
    +      labels:
    +        app: birdwatcher
    +    spec:
    +      containers:
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        resources:
    +          limits:
    +            memory: "128Mi"
    +            cpu: "500m"
    +
    +
    +

    如果 DockerHub 上提供的映像不是最新的,您可以使用隨原始碼提供的 Dockerfile 建立 Birdwatcher 的映像,如下所示:

    +
    git clone https://github.com/milvus-io/birdwatcher.git
    +cd birdwatcher
    +docker build -t milvusdb/birdwatcher .
    +
    +

    若要部署本地建立的映像,您需要在上述規格中加入imagePullPolicy ,並設定為Never

    +
    ...
    +      - name: birdwatcher
    +        image: milvusdb/birdwatcher
    +        imagePullPolicy: Never
    +...
    +
    +
    +

    套用 deployment.yml

    將上述 YAML 儲存於檔案中,並將其命名為deployment.yml ,然後執行下列指令

    +
    kubectl apply -f deployment.yml
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.json new file mode 100644 index 000000000..799f27ba3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Birdwatcher","anchorList":[{"label":"觀鳥者","href":"Birdwatcher","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisite","type":2,"isActive":false},{"label":"架構","href":"Architecture","type":2,"isActive":false},{"label":"最新版本","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.md new file mode 100644 index 000000000..cf7166c53 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_overview.md @@ -0,0 +1,75 @@ +--- +id: birdwatcher_overview.md +summary: Birdwatcher 是 Milvus 2.x 的除錯工具。它連接到 etcd 並檢查 Milvus 系統的狀態。 +title: 觀鳥者 +--- +

    觀鳥者

    Milvus 是一個無狀態向量資料庫,它將讀取和寫入分開,並由 etcd 擔任單一狀態源的角色。所有協調員都必須先從 etcd 查詢狀態,才能對其進行任何變更。一旦使用者需要檢查或清理狀態,他們就需要一個工具來與 etcd 溝通。這就是 Birdwatcher 的用武之地。

    +

    Birdwatcher 是 Milvus 的調試工具。使用它連接 etcd,您可以檢查 Milvus 系統的狀態,或即時進行配置。

    +

    先決條件

    +

    架構

    + + Birdwatcher architecture + 觀鳥者架構

    +

    最新版本

    版本 v1.0.2

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.json new file mode 100644 index 000000000..421031ae8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.json @@ -0,0 +1 @@ +{"codeList":["./birdwatcher\n","Offline >\n","Offline > connect\nMilvus(by-dev) >\n","kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'\n","kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh\n","Offline > connect --etcd ${ETCD_IP_ADDR}:2379\nMilvus(by-dev)\n","Offline > connect --rootPath my-release\nMilvus(my-release) >\n","Offline > connect --dry\nusing dry mode, ignore rootPath and metaPath\nEtcd(127.0.0.1:2379) > find-milvus\n1 candidates found:\nmy-release\nEtcd(127.0.0.1:2379) > use my-release\nMilvus(my-release) >\n","Milvus(my-release) > show -h\nUsage:\n show [command]\n\nAvailable Commands:\n alias list alias meta info\n channel-watch display channel watching info from data coord meta store\n checkpoint list checkpoint collection vchannels\n collection-history display collection change history\n collection-loaded display information of loaded collection from querycoord\n collections list current available collection from RootCoord\n config-etcd list configuations set by etcd source\n configurations iterate all online components and inspect configuration\n current-version \n database display Database info from rootcoord meta\n index \n partition list partitions of provided collection\n querycoord-channel display querynode information from querycoord cluster\n querycoord-cluster display querynode information from querycoord cluster\n querycoord-task display task information from querycoord\n replica list current replica information from QueryCoord\n segment display segment information from data coord meta store\n segment-index display segment index information\n segment-loaded display segment information from querycoordv1 meta\n segment-loaded-grpc list segments loaded information\n session list online milvus components\n\nFlags:\n -h, --help help for show\n\nUse \" show [command] --help\" for more information about a command.\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n","Milvus(by-dev) > show database\n=============================\nID: 1 Name: default\nTenantID: State: DatabaseCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show collections\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n--- Total collections: 1 Matched collections: 1\n--- Total channel: 1 Healthy collections: 1\n================================================================================\n","Milvus(by-dev) > show collection-history --id 443407225551410746\n================================================================================\nDBID: 1\nCollection ID: 443407225551410746 Collection Name: medium_articles_2020\nCollection State: CollectionCreated Create Time: 2023-08-08 09:27:08\nFields:\n- Field ID: 0 Field Name: RowID Field Type: Int64\n- Field ID: 1 Field Name: Timestamp Field Type: Int64\n- Field ID: 100 Field Name: id Field Type: Int64\n - Primary Key: true, AutoID: false\n- Field ID: 101 Field Name: title Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 102 Field Name: title_vector Field Type: FloatVector\n - Type Param dim: 768\n- Field ID: 103 Field Name: link Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 104 Field Name: reading_time Field Type: Int64\n- Field ID: 105 Field Name: publication Field Type: VarChar\n - Type Param max_length: 512\n- Field ID: 106 Field Name: claps Field Type: Int64\n- Field ID: 107 Field Name: responses Field Type: Int64\nEnable Dynamic Schema: false\nConsistency Level: Bounded\nStart position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]\n","Milvus(by-dev) > show collection-loaded\nVersion: [>= 2.2.0] CollectionID: 443407225551410746\nReplicaNumber: 1 LoadStatus: Loaded\n--- Collections Loaded: 1\n","Milvus(by-dev) > show checkpoint --collection 443407225551410746\nvchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint\n","Milvus(by-dev) > show index\n*************2.1.x***************\n*************2.2.x***************\n==================================================================\nIndex ID: 443407225551410801 Index Name: _default_idx_102 CollectionID:443407225551410746\nCreate Time: 2023-08-08 09:27:19.139 +0000 Deleted: false\nIndex Type: HNSW Metric Type: L2\nIndex Params: \n==================================================================\n","Milvus(by-dev) > show partition --collection 443407225551410746\nParition ID: 443407225551410747 Name: _default State: PartitionCreated\n--- Total Database(s): 1\n","Milvus(by-dev) > show channel-watch\n=============================\nkey: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0\nChannel Name:by-dev-rootcoord-dml_0_443407225551410746v0 WatchState: WatchSuccess\nChannel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000\nStart Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000\nUnflushed segments: []\nFlushed segments: []\nDropped segments: []\n--- Total Channels: 1\n","Milvus(by-dev) > show replica\n================================================================================\nReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0\nAll Nodes:[2]\n","SegmentID: 443407225551610865 State: Flushed, Row Count:5979\n--- Growing: 0, Sealed: 0, Flushed: 1\n--- Total Segments: 1, row count: 5979\n","Milvus(by-dev) > show segment-loaded-grpc\n===========\nServerID 2\nChannel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937\nLeader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0\nGrowing segments number: 0 , ids: []\nSegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0\nSealed segments number: 1 \n","Milvus(by-dev) > show configurations\nclient nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nComponent rootcoord-1\nrootcoord.importtaskexpiration: 900\nrootcoord.enableactivestandby: false\nrootcoord.importtaskretention: 86400\nrootcoord.maxpartitionnum: 4096\nrootcoord.dmlchannelnum: 16\nrootcoord.minsegmentsizetoenableindex: 1024\nrootcoord.port: 53100\nrootcoord.address: localhost\nrootcoord.maxdatabasenum: 64\nComponent datacoord-3\n...\nquerynode.gracefulstoptimeout: 30\nquerynode.cache.enabled: true\nquerynode.cache.memorylimit: 2147483648\nquerynode.scheduler.maxreadconcurrentratio: 2\n","Milvus(by-dev) > show session\nSession:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333\nSession:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124\nSession:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000\nSession:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121\nSession:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529\nSession:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531\nSession:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123\nSession:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100\n\nMilvus(by-dev) > visit querycoord 7\nQueryCoord-7(10.244.0.8:19531) > configuration\nKey: querycoord.enableactivestandby, Value: false\nKey: querycoord.channeltasktimeout, Value: 60000\nKey: querycoord.overloadedmemorythresholdpercentage, Value: 90\nKey: querycoord.distpullinterval, Value: 500\nKey: querycoord.checkinterval, Value: 10000\nKey: querycoord.checkhandoffinterval, Value: 5000\nKey: querycoord.taskexecutioncap, Value: 256\nKey: querycoord.taskmergecap, Value: 8\nKey: querycoord.autohandoff, Value: true\nKey: querycoord.address, Value: localhost\nKey: querycoord.port, Value: 19531\nKey: querycoord.memoryusagemaxdifferencepercentage, Value: 30\nKey: querycoord.refreshtargetsintervalseconds, Value: 300\nKey: querycoord.balanceintervalseconds, Value: 60\nKey: querycoord.loadtimeoutseconds, Value: 1800\nKey: querycoord.globalrowcountfactor, Value: 0.1\nKey: querycoord.scoreunbalancetolerationfactor, Value: 0.05\nKey: querycoord.reverseunbalancetolerationfactor, Value: 1.3\nKey: querycoord.balancer, Value: ScoreBasedBalancer\nKey: querycoord.autobalance, Value: true\nKey: querycoord.segmenttasktimeout, Value: 120000\n","Milvus(my-release) > backup\nBacking up ... 100%(2452/2451)\nbackup etcd for prefix done\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nhttp://10.244.0.10:9091/metrics\nbackup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz\n","Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747\nPK 110 found on segment 442844725212299830\nField id, value: &{long_data: }\nField title, value: &{string_data: }\nField title_vector, value: &{dim:768 float_vector: }\nField article_meta, value: &{json_data: }\n","Milvus(by-dev) > probe query\nprobing collection 442682158191982314\nFound vector field vector(103) with dim[384], indexID: 442682158191990455\nfailed to generated mock request probing index type IVF_FLAT not supported yet\nprobing collection 442844725212086932\nFound vector field title_vector(102) with dim[768], indexID: 442844725212086936\nShard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.\nprobing collection 442844725212299747\nFound vector field title_vector(102) with dim[768], indexID: 442844725212299751\nShard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.\nprobing collection 443294505839900248\nFound vector field vector(101) with dim[256], indexID: 443294505839900251\nShard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.\n"],"headingContent":"Use Birdwatcher","anchorList":[{"label":"使用觀鳥者","href":"Use-Birdwatcher","type":1,"isActive":false},{"label":"啟動觀鳥者","href":"Start-Birdwatcher","type":2,"isActive":false},{"label":"連接至 etcd","href":"Connect-to-etcd","type":2,"isActive":false},{"label":"檢查 Milvus 狀態","href":"Check-Milvus-status","type":2,"isActive":false},{"label":"備份指標","href":"Backup-metrics","type":2,"isActive":false},{"label":"探查集合","href":"Probe-collections","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.md new file mode 100644 index 000000000..30d6712dd --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/birdwatcher_usage_guides.md @@ -0,0 +1,406 @@ +--- +id: birdwatcher_usage_guides.md +summary: 學習如何使用 Birdwatch 調試 Milvus。 +title: 使用觀鳥者 +--- +

    使用觀鳥者

    本指南將教您如何使用 Birdwatcher 檢查 Milvus 的狀態並進行配置。

    +

    啟動觀鳥者

    Birdwatcher 是一個命令列工具,您可以如下方式啟動它:

    +
    ./birdwatcher
    +
    +

    然後會出現以下提示:

    +
    Offline >
    +
    +

    連接至 etcd

    在進行其他操作之前,您需要使用 Birdwatcher 連線至 etcd。

    +
      +
    • 使用預設設定連接

      +
      Offline > connect
      +Milvus(by-dev) >
      +
    • +
    • 從 Pod 中的 Birdwatcher 連線

      +

      如果您選擇在 Kubernetes pod 中執行 Birdwatcher,您需要先取得 etcd 的 IP 位址,如下所示:

      +
      kubectl get pod my-release-etcd-0 -o 'jsonpath={.status.podIP}'
      +
      +

      然後存取 pod 的 shell。

      +
      kubectl exec --stdin --tty birdwatcher-7f48547ddc-zcbxj -- /bin/sh
      +
      +

      最後,使用傳回的 IP 位址連接 etcd,如下所示:

      +
      Offline > connect --etcd ${ETCD_IP_ADDR}:2379
      +Milvus(by-dev)
      +
    • +
    • 使用不同的根目錄進行連接

      +

      如果您的 Milvus 的根路徑與by-dev 不同,並且提示您報告錯誤的根路徑,您可以按以下方式連線到 etcd:

      +
      Offline > connect --rootPath my-release
      +Milvus(my-release) >
      +
      +

      如果您不知道您的 Milvus 的根目錄,請按以下方式連線到 etcd:

      +
      Offline > connect --dry
      +using dry mode, ignore rootPath and metaPath
      +Etcd(127.0.0.1:2379) > find-milvus
      +1 candidates found:
      +my-release
      +Etcd(127.0.0.1:2379) > use my-release
      +Milvus(my-release) >
      +
    • +
    +

    檢查 Milvus 狀態

    您可以使用show 命令檢查 Milvus 狀態。

    +
    Milvus(my-release) > show -h
    +Usage:
    +   show [command]
    +
    +Available Commands:
    +  alias               list alias meta info
    +  channel-watch       display channel watching info from data coord meta store
    +  checkpoint          list checkpoint collection vchannels
    +  collection-history  display collection change history
    +  collection-loaded   display information of loaded collection from querycoord
    +  collections         list current available collection from RootCoord
    +  config-etcd         list configuations set by etcd source
    +  configurations      iterate all online components and inspect configuration
    +  current-version     
    +  database            display Database info from rootcoord meta
    +  index               
    +  partition           list partitions of provided collection
    +  querycoord-channel  display querynode information from querycoord cluster
    +  querycoord-cluster  display querynode information from querycoord cluster
    +  querycoord-task     display task information from querycoord
    +  replica             list current replica information from QueryCoord
    +  segment             display segment information from data coord meta store
    +  segment-index       display segment index information
    +  segment-loaded      display segment information from querycoordv1 meta
    +  segment-loaded-grpc list segments loaded information
    +  session             list online milvus components
    +
    +Flags:
    +  -h, --help   help for show
    +
    +Use " show [command] --help" for more information about a command.
    +
    +

    列出會話

    列出與 Milvus 不同元件相關的 session:

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +

    在命令輸出中,由show session 列出的每個會話項目對應於目前活動並已在etcd 中註冊的節點或服務。

    +

    檢查資料庫和資料集

    您可以列出所有資料庫和集合。

    +
      +
    • 列出資料庫

      +

      在指令輸出中,您可以找到每個資料庫的相關資訊。

      +
      Milvus(by-dev) > show database
      +=============================
      +ID: 1   Name: default
      +TenantID:        State: DatabaseCreated
      +--- Total Database(s): 1
      +
    • +
    • 列出集合

      +

      在指令輸出中,您可以找到每個收藏集的詳細資訊。

      +
      Milvus(by-dev) > show collections
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +--- Total collections:  1        Matched collections:  1
      +--- Total channel: 1     Healthy collections: 1
      +================================================================================
      +
    • +
    • 檢視特定的收藏集

      +

      您可以透過指定 ID 檢視特定的收藏集。

      +
      Milvus(by-dev) > show collection-history --id 443407225551410746
      +================================================================================
      +DBID: 1
      +Collection ID: 443407225551410746       Collection Name: medium_articles_2020
      +Collection State: CollectionCreated     Create Time: 2023-08-08 09:27:08
      +Fields:
      +- Field ID: 0   Field Name: RowID       Field Type: Int64
      +- Field ID: 1   Field Name: Timestamp   Field Type: Int64
      +- Field ID: 100         Field Name: id          Field Type: Int64
      +        - Primary Key: true, AutoID: false
      +- Field ID: 101         Field Name: title       Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 102         Field Name: title_vector        Field Type: FloatVector
      +        - Type Param dim: 768
      +- Field ID: 103         Field Name: link        Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 104         Field Name: reading_time        Field Type: Int64
      +- Field ID: 105         Field Name: publication         Field Type: VarChar
      +        - Type Param max_length: 512
      +- Field ID: 106         Field Name: claps       Field Type: Int64
      +- Field ID: 107         Field Name: responses   Field Type: Int64
      +Enable Dynamic Schema: false
      +Consistency Level: Bounded
      +Start position for channel by-dev-rootcoord-dml_0(by-dev-rootcoord-dml_0_443407225551410746v0): [1 0 28 175 133 76 39 6]
      +
    • +
    • 檢視所有載入的收藏集

      +

      您可以讓 Birdwatcher 過濾所有已載入的收藏集。

      +
      Milvus(by-dev) > show collection-loaded
      +Version: [>= 2.2.0]     CollectionID: 443407225551410746
      +ReplicaNumber: 1        LoadStatus: Loaded
      +--- Collections Loaded: 1
      +
    • +
    • 列出集合的所有頻道檢查點

      +

      您可以讓 Birdwatcher 列出特定集合的所有檢查點。

      +
      Milvus(by-dev) > show checkpoint --collection 443407225551410746
      +vchannel by-dev-rootcoord-dml_0_443407225551410746v0 seek to 2023-08-08 09:36:09.54 +0000 UTC, cp channel: by-dev-rootcoord-dml_0_443407225551410746v0, Source: Channel Checkpoint
      +
    • +
    +

    檢查索引詳細資料

    執行以下指令,詳細列出所有索引檔案。

    +
    Milvus(by-dev) > show index
    +*************2.1.x***************
    +*************2.2.x***************
    +==================================================================
    +Index ID: 443407225551410801    Index Name: _default_idx_102    CollectionID:443407225551410746
    +Create Time: 2023-08-08 09:27:19.139 +0000      Deleted: false
    +Index Type: HNSW        Metric Type: L2
    +Index Params: 
    +==================================================================
    +
    +

    列出分區

    執行下列指令可列出特定資料集中的所有磁碟分割。

    +
    Milvus(by-dev) > show partition --collection 443407225551410746
    +Parition ID: 443407225551410747 Name: _default  State: PartitionCreated
    +--- Total Database(s): 1
    +
    +

    檢查通道狀態

    執行以下指令檢視通道狀態

    +
    Milvus(by-dev) > show channel-watch
    +=============================
    +key: by-dev/meta/channelwatch/6/by-dev-rootcoord-dml_0_443407225551410746v0
    +Channel Name:by-dev-rootcoord-dml_0_443407225551410746v0         WatchState: WatchSuccess
    +Channel Watch start from: 2023-08-08 09:27:09 +0000, timeout at: 1970-01-01 00:00:00 +0000
    +Start Position ID: [1 0 28 175 133 76 39 6], time: 1970-01-01 00:00:00 +0000
    +Unflushed segments: []
    +Flushed segments: []
    +Dropped segments: []
    +--- Total Channels: 1
    +
    +

    列出所有副本和區段

      +
    • 列出所有副本

      +

      執行下列指令以列出所有複製品及其對應的集合。

      +
      Milvus(by-dev) > show replica
      +================================================================================
      +ReplicaID: 443407225685278721 CollectionID: 443407225551410746 version:>=2.2.0
      +All Nodes:[2]
      +
    • +
    • 列出所有區段

      +

      執行下列指令,以列出所有區段及其狀態

      +
      SegmentID: 443407225551610865 State: Flushed, Row Count:5979
      +--- Growing: 0, Sealed: 0, Flushed: 1
      +--- Total Segments: 1, row count: 5979
      +
      +

      執行以下指令,詳細列出所有載入的區段。對於 Milvus 2.1.x,請使用show segment-loaded 代替。

      +
      Milvus(by-dev) > show segment-loaded-grpc
      +===========
      +ServerID 2
      +Channel by-dev-rootcoord-dml_0_443407225551410746v0, collection: 443407225551410746, version 1691486840680656937
      +Leader view for channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Growing segments number: 0 , ids: []
      +SegmentID: 443407225551610865 CollectionID: 443407225551410746 Channel: by-dev-rootcoord-dml_0_443407225551410746v0
      +Sealed segments number: 1    
      +
    • +
    +

    列出配置

    您可以讓 Birdwatcher 列出每個 Milvus 元件的目前配置。

    +
    Milvus(by-dev) > show configurations
    +client nil Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Component rootcoord-1
    +rootcoord.importtaskexpiration: 900
    +rootcoord.enableactivestandby: false
    +rootcoord.importtaskretention: 86400
    +rootcoord.maxpartitionnum: 4096
    +rootcoord.dmlchannelnum: 16
    +rootcoord.minsegmentsizetoenableindex: 1024
    +rootcoord.port: 53100
    +rootcoord.address: localhost
    +rootcoord.maxdatabasenum: 64
    +Component datacoord-3
    +...
    +querynode.gracefulstoptimeout: 30
    +querynode.cache.enabled: true
    +querynode.cache.memorylimit: 2147483648
    +querynode.scheduler.maxreadconcurrentratio: 2
    +
    +

    或者,您可以訪問每個 Milvus 元件來查找其配置。下面演示如何列出 ID 為 7 的 QueryCoord 的配置。

    +
    Milvus(by-dev) > show session
    +Session:datacoord, ServerID: 3, Version: 2.2.11, Address: 10.244.0.8:13333
    +Session:datanode, ServerID: 6, Version: 2.2.11, Address: 10.244.0.8:21124
    +Session:indexcoord, ServerID: 4, Version: 2.2.11, Address: 10.244.0.8:31000
    +Session:indexnode, ServerID: 5, Version: 2.2.11, Address: 10.244.0.8:21121
    +Session:proxy, ServerID: 8, Version: 2.2.11, Address: 10.244.0.8:19529
    +Session:querycoord, ServerID: 7, Version: 2.2.11, Address: 10.244.0.8:19531
    +Session:querynode, ServerID: 2, Version: 2.2.11, Address: 10.244.0.8:21123
    +Session:rootcoord, ServerID: 1, Version: 2.2.11, Address: 10.244.0.8:53100
    +
    +Milvus(by-dev) > visit querycoord 7
    +QueryCoord-7(10.244.0.8:19531) > configuration
    +Key: querycoord.enableactivestandby, Value: false
    +Key: querycoord.channeltasktimeout, Value: 60000
    +Key: querycoord.overloadedmemorythresholdpercentage, Value: 90
    +Key: querycoord.distpullinterval, Value: 500
    +Key: querycoord.checkinterval, Value: 10000
    +Key: querycoord.checkhandoffinterval, Value: 5000
    +Key: querycoord.taskexecutioncap, Value: 256
    +Key: querycoord.taskmergecap, Value: 8
    +Key: querycoord.autohandoff, Value: true
    +Key: querycoord.address, Value: localhost
    +Key: querycoord.port, Value: 19531
    +Key: querycoord.memoryusagemaxdifferencepercentage, Value: 30
    +Key: querycoord.refreshtargetsintervalseconds, Value: 300
    +Key: querycoord.balanceintervalseconds, Value: 60
    +Key: querycoord.loadtimeoutseconds, Value: 1800
    +Key: querycoord.globalrowcountfactor, Value: 0.1
    +Key: querycoord.scoreunbalancetolerationfactor, Value: 0.05
    +Key: querycoord.reverseunbalancetolerationfactor, Value: 1.3
    +Key: querycoord.balancer, Value: ScoreBasedBalancer
    +Key: querycoord.autobalance, Value: true
    +Key: querycoord.segmenttasktimeout, Value: 120000
    +
    +

    備份指標

    您可以讓 Birdwatcher 備份所有元件的度量值。

    +
    Milvus(my-release) > backup
    +Backing up ... 100%(2452/2451)
    +backup etcd for prefix  done
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +http://10.244.0.10:9091/metrics
    +backup for prefix done, stored in file: bw_etcd_ALL.230810-075211.bak.gz
    +
    +

    然後您可以在啟動 Birdwatcher 的目錄中檢查該檔案。

    +

    探查集合

    您可以讓 Birdwatcher 用指定的主索引鍵或模擬查詢探查已載入集合的狀態。

    +

    探查已知主鍵的集合

    probe 命令中,應使用pk 標誌指定主索引鍵,並使用collection 標誌指定集合 ID。

    +
    Milvus(by-dev) > probe pk --pk 110 --collection 442844725212299747
    +PK 110 found on segment 442844725212299830
    +Field id, value: &{long_data:<data:110 > }
    +Field title, value: &{string_data:<data:"Human Resources Datafication" > }
    +Field title_vector, value: &{dim:768 float_vector:<data:0.022454707 data:0.007861045 data:0.0063843643 data:0.024065714 data:0.013782166 data:0.018483251 data:-0.026526336 ... data:-0.06579628 data:0.00033906146 data:0.030992996 data:-0.028134001 data:-0.01311325 data:0.012471594 > }
    +Field article_meta, value: &{json_data:<data:"{\"link\":\"https:\\/\\/towardsdatascience.com\\/human-resources-datafication-d44c8f7cb365\",\"reading_time\":6,\"publication\":\"Towards Data Science\",\"claps\":256,\"responses\":0}" > }
    +
    +

    使用模擬查詢探查所有集合

    您也可以讓 Birdwatcher 使用模擬查詢探查所有集合。

    +
    Milvus(by-dev) > probe query
    +probing collection 442682158191982314
    +Found vector field vector(103) with dim[384], indexID: 442682158191990455
    +failed to generated mock request probing index type IVF_FLAT not supported yet
    +probing collection 442844725212086932
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212086936
    +Shard my-release-rootcoord-dml_1_442844725212086932v0 leader[298] probe with search success.
    +probing collection 442844725212299747
    +Found vector field title_vector(102) with dim[768], indexID: 442844725212299751
    +Shard my-release-rootcoord-dml_4_442844725212299747v0 leader[298] probe with search success.
    +probing collection 443294505839900248
    +Found vector field vector(101) with dim[256], indexID: 443294505839900251
    +Shard my-release-rootcoord-dml_5_443294505839900248v0 leader[298] probe with search success.
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.json new file mode 100644 index 000000000..708447f86 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.json @@ -0,0 +1 @@ +{"codeList":["clear\n","connect [-uri (text)] [-t (text)]\n","milvus_cli > connect -uri http://127.0.0.1:19530\n","create database -db (text)\n","milvus_cli > create database -db testdb\n","use database -db (text)\n","milvus_cli > use database -db testdb\n","list databases\n","milvus_cli > list databases\n","delete database -db (text)\n","milvus_cli > delete database -db testdb\n","create user -u (text) -p (text)\n","milvus_cli > create user -u zilliz -p zilliz\n","create role -r (text)\n","milvus_cli > create role -r role1\n","create alias -c (text) -a (text) [-A]\n","milvus_cli > create alias -c car -a carAlias1\n","milvus_cli > create alias -c car2 -A -a carAlias1\n","create collection -c (text) -f (text) -p (text) [-a] [-d (text)]\n","## For array field: --schema-field support :::(:if Varchar)\n\nmilvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'\n","create partition -c (text) -p (text) [-d (text)]\n","milvus_cli > create partition -c car -p new_partition -d test_add_partition\n","create index\n","milvus_cli > create index\n\nCollection name (car, car2): car2\n\nThe name of the field to create an index for (vector): vector\n\nIndex name: vectorIndex\n\n# Default is ''\nIndex type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT\n\n# Default is ''\nIndex metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:\n\nTimeout []:\n","delete user -u (text)\n","milvus_cli > delete user -u zilliz\n","delete role -r (text)\n","milvus_cli > delete role -r role1\n","delete alias -a (text)\n","delete collection -c (text)\n","milvus_cli > delete collection -c car\n","delete entities -c (text) -p (text)\n","milvus_cli > delete entities -c car\n\nThe expression to specify entities to be deleted, such as \"film_id in [ 0, 1 ]\": film_id in [ 0, 1 ]\n\nYou are trying to delete the entities of collection. This action cannot be undone!\n\nDo you want to continue? [y/N]: y\n","delete partition -c (text) -p (text)\n","milvus_cli > delete partition -c car -p new_partition\n","delete index -c (text) -in (text)\n","milvus_cli > delete index -c car -in indexName\n","grant role -r role1 -u user1\n","grant privilege\n","grant role -r role1 -u user1\n","revoke privilege\n","show collection -c (text)\n","milvus_cli > show collection -c test_collection_insert\n","show partition -c (text) -p (text)\n","milvus_cli > show partition -c test_collection_insert -p _default\n","show index -c (text) -in (text)\n","milvus_cli > show index -c test_collection -in index_name\n","exit\n","help \n","import -c (text)[-p (text)] \n","milvus_cli > import -c car 'examples/import_csv/vectors.csv'\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-\nio/milvus_cli/main/examples/import_csv/vectors.csv'\n\nReading file from remote URL.\n\nReading csv file... [####################################] 100%\n\nColumn names are ['vector', 'color', 'brand']\n\nProcessed 50001 lines.\n\nInserting ...\n\nInsert successfully.\n\n-------------------------- ------------------\nTotal insert entities: 50000\nTotal collection entities: 150000\nMilvus timestamp: 428849214449254403\n-------------------------- ------------------\n","list users\n","list roles\n","milvus_cli > list roles\n","milvus_cli > list grants -r role1 -o object1 -t Collection\n","list collections\n","list indexes -c (text)\n","list partitions -c (text)\n","load -c (text) [-p (text)]\n","query\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id in [ 428960801420883491, 428960801420883492,\n428960801420883493 ]\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: color, brand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","milvus_cli > query\n\nCollection name: car\n\nThe query expression: id > 428960801420883491\n\nName of partitions that contain entities(split by \",\" if multiple) []:\ndefault\n\nA list of fields to return(split by \",\" if multiple) []: id, color,\nbrand\n\ntimeout []:\n\nGuarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:\nGraceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:\n","release -c (text) [-p (text)]\n","search\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file\nout headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, test_collection): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):\n [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]\n\nThe vector field used to search of collection (vector): vector\n\nSearch parameter nprobe's value: 10\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []: id > 0\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []: _default\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","milvus_cli > search\n\nCollection name (car, car2): car\n\nThe vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv\n\nThe vector field used to search of collection (vector): vector\n\nThe specified number of decimal places of returned distance [-1]: 5\n\nThe max number of returned record, also known as topk: 2\n\nThe boolean expression used to filter attribute []:\n\nThe names of partitions to search (split by \",\" if multiple) ['_default'] []:\n\ntimeout []:\n\nGuarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:\n\n","list connections\n","show index_progress -c (text) [-i (text)]\n","show loading_progress -c (text) [-p (text)]\n","version\n","$ milvus_cli --version\nMilvus_CLI v0.4.0\n"],"headingContent":"Milvus_CLI Command Reference","anchorList":[{"label":"Milvus_CLI 指令參考","href":"MilvusCLI-Command-Reference","type":1,"isActive":false},{"label":"清除","href":"clear","type":2,"isActive":false},{"label":"連線","href":"connect","type":2,"isActive":false},{"label":"建立資料庫","href":"create-Database","type":2,"isActive":false},{"label":"使用資料庫","href":"use-Database","type":2,"isActive":false},{"label":"列出資料庫","href":"list-Databases","type":2,"isActive":false},{"label":"刪除資料庫","href":"delete-Database","type":2,"isActive":false},{"label":"建立使用者","href":"create-user","type":2,"isActive":false},{"label":"建立角色","href":"create-role","type":2,"isActive":false},{"label":"建立別名","href":"create-alias","type":2,"isActive":false},{"label":"建立集合","href":"create-collection","type":2,"isActive":false},{"label":"建立分割區","href":"create-partition","type":2,"isActive":false},{"label":"建立索引","href":"create-index","type":2,"isActive":false},{"label":"刪除使用者","href":"delete-user","type":2,"isActive":false},{"label":"刪除角色","href":"delete-role","type":2,"isActive":false},{"label":"刪除別名","href":"delete-alias","type":2,"isActive":false},{"label":"刪除集合","href":"delete-collection","type":2,"isActive":false},{"label":"刪除實體","href":"delete-entities","type":2,"isActive":false},{"label":"刪除分割區","href":"delete-partition","type":2,"isActive":false},{"label":"刪除索引","href":"delete-index","type":2,"isActive":false},{"label":"授予角色","href":"grant-role","type":2,"isActive":false},{"label":"授予特權","href":"grant-privilege","type":2,"isActive":false},{"label":"撤銷角色","href":"revoke-role","type":2,"isActive":false},{"label":"撤銷權限","href":"revoke-privilege","type":2,"isActive":false},{"label":"顯示集合","href":"show-collection","type":2,"isActive":false},{"label":"顯示分割區","href":"show-partition","type":2,"isActive":false},{"label":"顯示索引","href":"show-index","type":2,"isActive":false},{"label":"退出","href":"exit","type":2,"isActive":false},{"label":"幫助","href":"help","type":2,"isActive":false},{"label":"匯入","href":"import","type":2,"isActive":false},{"label":"列出使用者","href":"list-users","type":2,"isActive":false},{"label":"列出角色","href":"List-roles","type":2,"isActive":false},{"label":"列出撥款","href":"List-grants","type":2,"isActive":false},{"label":"列出收藏集","href":"list-collections","type":2,"isActive":false},{"label":"列出索引","href":"list-indexes","type":2,"isActive":false},{"label":"列出分區","href":"list-partitions","type":2,"isActive":false},{"label":"載入","href":"load","type":2,"isActive":false},{"label":"查詢","href":"query","type":2,"isActive":false},{"label":"釋放","href":"release","type":2,"isActive":false},{"label":"搜尋","href":"search","type":2,"isActive":false},{"label":"列出連線","href":"list-connection","type":2,"isActive":false},{"label":"顯示索引進度","href":"show-indexprogress","type":2,"isActive":false},{"label":"顯示載入進度","href":"show-loadingprogress","type":2,"isActive":false},{"label":"版本","href":"version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.md new file mode 100644 index 000000000..865c9d078 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_commands.md @@ -0,0 +1,1530 @@ +--- +id: cli_commands.md +summary: 使用指令與 Milvus 互動。 +title: Milvus_CLI 指令參考 +--- +

    Milvus_CLI 指令參考

    Milvus Command-Line Interface (CLI) 是一個命令列工具,支援資料庫連線、資料操作及資料匯入匯出。

    +

    本主題介紹所有支援的命令及相對應的選項。也包括一些範例供您參考。

    +

    清除

    清除螢幕。

    +

    語法

    +
    clear
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +

    連線

    連接至 Milvus。

    +

    語法

    +
    connect [-uri (text)] [-t (text)]
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -資料來源-uri(可選)uri 名稱。預設為 "http://127.0.0.1:19530"。
    -t-token(可選)zilliz 雲端 apikey 或username:password 。預設為無。
    -help顯示命令使用說明。
    +

    範例

    +
    milvus_cli > connect -uri http://127.0.0.1:19530
    +
    +

    建立資料庫

    在 Milvus 中建立資料庫

    +

    語法

    +
    create database -db (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -db-資料庫[Required] milvus 中的資料庫名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    範例一

    以下範例在 milvus 中建立資料庫testdb

    +
    milvus_cli > create database -db testdb
    +
    +

    使用資料庫

    在 Milvus 中使用資料庫

    +

    語法

    +
    use database -db (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -db-資料庫[Required] milvus 中的資料庫名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    範例一

    以下範例使用 milvus 中的資料庫testdb

    +
    milvus_cli > use database -db testdb
    +
    +

    列出資料庫

    列出 Milvus 中的資料庫

    +

    語法

    +
    list databases
    +
    +

    範例

    範例 1

    以下範例列出 Milvus 中的資料庫。

    +
    milvus_cli > list databases
    +
    +

    刪除資料庫

    刪除 Milvus 中的資料庫

    +

    語法

    +
    delete database -db (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -db-資料庫[Required] milvus 中的資料庫名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    範例一

    以下範例刪除 milvus 中的資料庫testdb

    +
    milvus_cli > delete database -db testdb
    +
    +

    建立使用者

    在 Milvus 中建立使用者

    +

    語法

    +
    create user -u (text) -p (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -p-密碼用 milvus 表示的使用者密碼。預設為 「無」。
    -u-使用者名稱milvus 中的使用者名稱。預設為 「無」。
    -help不適用顯示命令使用說明。
    +

    範例

    範例一

    以下範例在 milvus 中建立使用者zilliz 及密碼zilliz

    +
    milvus_cli > create user -u zilliz -p zilliz
    +
    +

    建立角色

    在 Milvus 中建立角色

    +

    語法

    +
    create role -r (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -r-角色名稱milvus 角色的角色名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    範例一

    以下範例在 milvus 中建立角色role1

    +
    milvus_cli > create role -r role1
    +
    +

    建立別名

    指定集合的唯一別名。

    +
    一個集合可以有多個別名。但是,一個別名最多對應一個集合。
    +

    語法

    +
    create alias -c (text) -a (text) [-A]
    +
    +

    選項

    + + + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -a-別名別名。
    -A-alter(可選)將別名轉移至指定集合的旗標。
    -help不適用顯示命令使用說明。
    +

    範例

    +

    範例一

    +

    以下範例為car 套件建立carAlias1carAlias2 別名。

    +
    milvus_cli > create alias -c car -a carAlias1
    +
    +

    範例 2

    +
    範例 2 以範例 1 為基礎。
    +

    下面的示例將carAlias1 別名從car 集合轉移到car2 集合。

    +
    milvus_cli > create alias -c car2 -A -a carAlias1
    +
    +

    建立集合

    建立一個集合。

    +

    語法

    +
    create collection -c (text) -f (text) -p (text) [-a] [-d (text)]
    +
    +

    選項

    + + + + + + + + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -f-字段模式(多重)<fieldName>:<dataType>:<dimOfVector/desc> 格式的欄位模式。
    -p-schema-主鍵欄位主鍵欄位的名稱。
    -a-schema-auto-id。(可選)自動產生 ID 的旗標。
    -desc-結構描述(可選)集合的描述。
    -等級-一致性等級(可選)一致性等級:Bounded,Session,Strong, Eventual .
    -d-是否動態(可選)集合模式是否支援動態欄位。
    -s-shards-num(可選擇) 碎片數量
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    ## For array field: --schema-field support <fieldName>:<dataType>:<maxCapacity>:<elementDataType>(:<maxLength>if Varchar)
    +
    +milvus_cli > create collection -c car -f id:INT64:primary_field -f vector:FLOAT_VECTOR:128 -f color:INT64:color -f brand:ARRAY:64:VARCHAR:128 -p id -A -d 'car_collection'
    +
    +

    建立分割區

    建立分割區。

    +

    語法

    +
    create partition -c (text) -p (text) [-d (text)]
    +
    +

    選項

    + + + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -p-分區分割區名稱。
    -d-描述(可選)磁碟分割的描述。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    milvus_cli > create partition -c car -p new_partition -d test_add_partition
    +
    +

    建立索引

    為欄位建立索引。

    +
    目前,一個集合最多支援一個索引。
    +

    語法

    +
    create index
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示命令使用說明。
    +

    範例

    +

    為欄位建立索引,並提示所需輸入的內容:

    +
    milvus_cli > create index
    +
    +Collection name (car, car2): car2
    +
    +The name of the field to create an index for (vector): vector
    +
    +Index name: vectorIndex
    +
    +# Default is ''
    +Index type FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, RNSG, HNSW, ANNOY, AUTOINDEX, DISKANN, GPU_IVF_FLAT, GPU_IVF_PQ, SPARSE_INVERTED_INDEX, SPARSE_WAND, SCANN, STL_SORT, Trie, INVERTED, ) []: IVF_FLAT
    +
    +# Default is ''
    +Index metric type (L2, IP, HAMMING, TANIMOTO, COSINE, ) []:
    +
    +Timeout []:
    +
    +

    刪除使用者

    刪除使用者

    +

    語法

    delete user -u (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -u-使用者名稱使用者名稱。
    -help不適用顯示命令使用說明。
    +

    範例

    milvus_cli > delete user -u zilliz
    +
    +

    刪除角色

    刪除 Milvus 中的角色

    +

    語法

    +
    delete role -r (text)
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -r-角色名稱milvus 角色的角色名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    以下範例刪除 milvus 中的角色role1

    +
    milvus_cli > delete role -r role1
    +
    +

    刪除別名

    刪除別名。

    +

    語法

    +
    delete alias -a (text)
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -a-別名別名。
    -help不適用顯示使用指令的說明。
    +

    刪除集合

    刪除一個集合。

    +

    語法

    +
    delete collection -c (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -c-收藏集名稱要刪除的集合名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    milvus_cli > delete collection -c car
    +
    +

    刪除實體

    刪除實體。

    +

    語法

    +
    delete entities -c (text) -p (text)
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱要刪除的實體所屬的集合名稱。
    -p-分區(可選)要刪除的分割區名稱。
    -help不適用顯示使用命令的說明。
    +

    範例

    +
    milvus_cli > delete entities -c car
    +
    +The expression to specify entities to be deleted, such as "film_id in [ 0, 1 ]": film_id in [ 0, 1 ]
    +
    +You are trying to delete the entities of collection. This action cannot be undone!
    +
    +Do you want to continue? [y/N]: y
    +
    +

    刪除分割區

    刪除磁碟分割。

    +

    語法

    +
    delete partition -c (text) -p (text)
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱要刪除的分割區所屬集合的名稱。
    -p-分區要刪除的分割區的名稱。
    -help不適用顯示使用命令的說明。
    +

    範例

    +
    milvus_cli > delete partition -c car -p new_partition
    +
    +

    刪除索引

    刪除索引及相對應的索引檔案。

    +
    目前,一個資料集最多支援一個索引。
    +

    語法

    +
    delete index -c (text) -in (text)
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -在-索引名稱索引名稱的名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    milvus_cli > delete index -c car -in indexName
    +
    +

    授予角色

    授予使用者角色

    +

    語法

    +

    選項

    + + + + + + + + + +
    選項全名說明
    -r-角色名稱milvus 角色的角色名稱。
    -u-使用者名稱milvus 使用者的使用者名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    grant role -r role1 -u user1
    +
    +

    授予特權

    為角色指定權限。

    +

    語法

    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示命令使用說明。
    +

    範例

    +
    grant privilege
    +
    +

    撤銷角色

    撤銷指定給使用者的角色。

    +

    語法

    +

    選項

    + + + + + + + + + +
    選項全名說明
    -r-角色名稱milvus 角色的角色名稱。
    -u-使用者名稱milvus 使用者的使用者名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    grant role -r role1 -u user1
    +
    +

    撤銷權限

    撤銷已指定給角色的特權。

    +

    語法

    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示命令使用說明。
    +

    範例

    +
    revoke privilege
    +
    +

    顯示集合

    顯示集合的詳細資訊。

    +

    語法

    +
    show collection -c (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    milvus_cli > show collection -c test_collection_insert
    +
    +

    顯示分割區

    顯示分割區的詳細資訊。

    +

    語法

    +
    show partition -c (text) -p (text)
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱磁碟分割所屬集合的名稱。
    -p-分區分割區的名稱。
    -help不適用顯示使用指令的說明。
    +

    範例

    +
    milvus_cli > show partition -c test_collection_insert -p _default
    +
    +

    顯示索引

    顯示索引的詳細資訊。

    +

    語法

    +
    show index -c (text) -in (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -在-索引名稱索引名稱。
    +

    | --help | n/a | 顯示使用指令的說明。|

    +

    範例

    +
    milvus_cli > show index -c test_collection -in index_name
    +
    +

    退出

    關閉命令列視窗。

    +

    語法

    +
    exit
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +

    幫助

    顯示使用命令的說明。

    +

    語法

    +
    help <command>
    +
    +

    命令

    + + + + + + + + + + + + + + + + + + + + + + + + +
    命令說明
    清除清除畫面。
    連線連線到 Milvus。
    建立建立資料集、資料庫、分割區、使用者、角色和索引。
    授予授予角色、權限。
    撤銷撤銷角色、權限。
    刪除刪除資料集、資料庫、分割區、別名、使用者、角色或索引。
    退出關閉命令列視窗。
    幫助顯示使用命令的說明。
    插入將資料匯入分割區。
    清單列出集合、資料庫、分割區、使用者、角色、授權或索引。
    載入載入集合或分割區。
    查詢顯示符合您輸入的所有條件的查詢結果。
    釋放釋放集合或分割區。
    搜尋執行向量相似性搜尋或混合搜尋。
    顯示顯示連線、資料庫、集合、載入進度或索引進度。
    重新命名重新命名集合
    使用使用資料庫
    版本顯示 Milvus_CLI 的版本。
    +

    匯入

    匯入本機或遠端資料到分割區。

    +

    語法

    +
    import -c (text)[-p (text)] <file_path>
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱插入資料的集合名稱。
    -p-分區(可選)資料要插入的分割區名稱。未傳入此分割區選項表示選擇「_default」分割區。
    -help不適用顯示命令使用說明。
    +

    範例一

    +以下範例匯入一個本機 CSV 檔案。

    +
    milvus_cli > import -c car 'examples/import_csv/vectors.csv'
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    範例 2

    +以下範例匯入遠端 CSV 檔案。

    +
    milvus_cli > import -c car 'https://raw.githubusercontent.com/milvus-
    +io/milvus_cli/main/examples/import_csv/vectors.csv'
    +
    +Reading file from remote URL.
    +
    +Reading csv file...  [####################################]  100%
    +
    +Column names are ['vector', 'color', 'brand']
    +
    +Processed 50001 lines.
    +
    +Inserting ...
    +
    +Insert successfully.
    +
    +--------------------------  ------------------
    +Total insert entities:                   50000
    +Total collection entities:              150000
    +Milvus timestamp:           428849214449254403
    +--------------------------  ------------------
    +
    +

    列出使用者

    列出所有使用者。

    +

    語法

    list users
    +
    +

    選項

    | 選項 | 全名 | 說明 | | --help | 不適用 | 顯示使用命令的說明。|

    +

    列出角色

    列出 Milvus 中的角色

    +

    語法

    +
    list roles
    +
    +

    選項

    + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +

    範例

    milvus_cli > list roles
    +
    +

    列出撥款

    列出 Milvus 中的授權

    +

    選項

    + + + + + + + + + +
    選項全名說明
    -r-角色名稱milvus 角色的角色名稱。
    -o-物件名稱milvus 物件的物件名稱。
    -t-物件類型全局、集合或使用者。
    -help不適用顯示使用指令的說明。
    +

    範例

    milvus_cli > list grants -r role1 -o object1 -t Collection
    +
    +

    列出收藏集

    列出所有收藏集。

    +

    語法

    +
    list collections
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +

    列出索引

    列出集合的所有索引。

    +
    目前,一個資料集最多支援一個索引。
    +

    語法

    +
    list indexes -c (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -help不適用顯示使用指令的說明。
    +

    列出分區

    列出集合的所有分區。

    +

    語法

    +
    list partitions -c (text)
    +
    +

    選項

    + + + + + + + + +
    選項全名說明
    -c-集合名稱集合的名稱。
    -help不適用顯示使用指令的說明。
    +

    載入

    將資料集或磁碟分割從硬碟空間載入 RAM。

    +

    語法

    +
    load -c (text) [-p (text)]
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱磁碟分割所屬集合的名稱。
    -p-分區(可選擇/多個)磁碟分割的名稱。
    -help不適用顯示使用指令的說明。
    +

    查詢

    顯示符合您輸入的所有條件的查詢結果。

    +

    語法

    +
    query
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示命令使用說明。
    +

    範例

    +

    範例一

    +

    執行查詢,並提示所需輸入的內容:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id in [ 428960801420883491, 428960801420883492,
    +428960801420883493 ]
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: color, brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    範例 2

    +

    執行查詢,並提示您輸入所需的內容:

    +
    milvus_cli > query
    +
    +Collection name: car
    +
    +The query expression: id > 428960801420883491
    +
    +Name of partitions that contain entities(split by "," if multiple) []:
    +default
    +
    +A list of fields to return(split by "," if multiple) []: id, color,
    +brand
    +
    +timeout []:
    +
    +Guarantee timestamp. This instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date. [0]:
    +Graceful time. Only used in bounded consistency level. If graceful_time is set, PyMilvus will use current timestamp minus the graceful_time as the guarantee_timestamp. This option is 5s by default if not set. [5]:
    +
    +

    釋放

    從 RAM 釋放資料集或分割區。

    +

    語法

    +
    release -c (text) [-p (text)]
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱磁碟分割所屬集合的名稱。
    -p-分區(可選擇/多個)磁碟分割的名稱。
    -help不適用顯示使用指令的說明。
    +

    執行向量相似性搜尋或混合搜尋。

    +

    +
    search
    +
    +

    + + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +

    +

    +

    在 csv 檔案上執行搜尋,並提示所需的輸入:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file
    +out headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    在已編入索引的資料集中執行搜尋,並提示所需輸入的資料:

    +
    milvus_cli > search
    +
    +Collection name (car, test_collection): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers):
    +    [[0.71, 0.76, 0.17, 0.13, 0.42, 0.07, 0.15, 0.67, 0.58, 0.02, 0.39, 0.47, 0.58, 0.88, 0.73, 0.31, 0.23, 0.57, 0.33, 0.2, 0.03, 0.43, 0.78, 0.49, 0.17, 0.56, 0.76, 0.54, 0.45, 0.46, 0.05, 0.1, 0.43, 0.63, 0.29, 0.44, 0.65, 0.01, 0.35, 0.46, 0.66, 0.7, 0.88, 0.07, 0.49, 0.92, 0.57, 0.5, 0.16, 0.77, 0.98, 0.1, 0.44, 0.88, 0.82, 0.16, 0.67, 0.63, 0.57, 0.55, 0.95, 0.13, 0.64, 0.43, 0.71, 0.81, 0.43, 0.65, 0.76, 0.7, 0.05, 0.24, 0.03, 0.9, 0.46, 0.28, 0.92, 0.25, 0.97, 0.79, 0.73, 0.97, 0.49, 0.28, 0.64, 0.19, 0.23, 0.51, 0.09, 0.1, 0.53, 0.03, 0.23, 0.94, 0.87, 0.14, 0.42, 0.82, 0.91, 0.11, 0.91, 0.37, 0.26, 0.6, 0.89, 0.6, 0.32, 0.11, 0.98, 0.67, 0.12, 0.66, 0.47, 0.02, 0.15, 0.6, 0.64, 0.57, 0.14, 0.81, 0.75, 0.11, 0.49, 0.78, 0.16, 0.63, 0.57, 0.18]]
    +
    +The vector field used to search of collection (vector): vector
    +
    +Search parameter nprobe's value: 10
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []: id > 0
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []: _default
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    +

    在非索引的資料集中執行搜尋,並提示所需的輸入:

    +
    milvus_cli > search
    +
    +Collection name (car, car2): car
    +
    +The vectors of search data(the length of data is number of query (nq), the dim of every vector in data must be equal to vector field’s of collection. You can also import a csv file without headers): examples/import_csv/search_vectors.csv
    +
    +The vector field used to search of collection (vector): vector
    +
    +The specified number of decimal places of returned distance [-1]: 5
    +
    +The max number of returned record, also known as topk: 2
    +
    +The boolean expression used to filter attribute []:
    +
    +The names of partitions to search (split by "," if multiple) ['_default'] []:
    +
    +timeout []:
    +
    +Guarantee Timestamp(It instructs Milvus to see all operations performed before a provided timestamp. If no such timestamp is provided, then Milvus will search all operations performed to date) [0]:
    +
    +
    +

    列出連線

    列出連線。

    +

    語法

    +
    list connections
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示命令使用說明。
    +

    顯示索引進度

    顯示實體索引的進度。

    +

    語法

    +
    show index_progress -c (text) [-i (text)]
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱實體所屬集合的名稱。
    -i-索引(可選)索引的名稱。
    -help不適用顯示使用指令的說明。
    +

    顯示載入進度

    顯示載入資料集的進度。

    +

    語法

    +
    show loading_progress -c (text) [-p (text)]
    +
    +

    選項

    + + + + + + + + + +
    選項全名說明
    -c-集合名稱實體所屬集合的名稱。
    -p-分區(可選擇/多個)載入分割區的名稱。
    -help不適用顯示使用指令的說明。
    +

    版本

    顯示 Milvus_CLI 的版本。

    +

    語法

    +
    version
    +
    +

    選項

    + + + + + + + +
    選項全名說明
    -help不適用顯示使用指令的說明。
    +
    您也可以在 shell 中檢查 Milvus_CLI 的版本,如下例所示。在這種情況下,milvus_cli --version 作為命令。
    +

    範例

    +
    $ milvus_cli --version
    +Milvus_CLI v0.4.0
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.json new file mode 100644 index 000000000..d531c7819 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Command-Line Interface","anchorList":[{"label":"Milvus 命令列介面","href":"Milvus-Command-Line-Interface","type":1,"isActive":false},{"label":"推薦版本","href":"Recommended-version","type":2,"isActive":false},{"label":"目前版本","href":"Current-version","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.md new file mode 100644 index 000000000..b5f6e92bf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/cli_overview.md @@ -0,0 +1,76 @@ +--- +id: cli_overview.md +summary: Milvus Command-Line Interface (CLI) 是一個命令列工具,支援資料庫連線、資料操作及資料匯入匯出。 +title: Milvus 命令列介面 +--- +

    Milvus 命令列介面

    Milvus Command-Line Interface (CLI) 是一個命令列工具,支援資料庫連線、資料操作、資料匯入與匯出。以Milvus Python SDK 為基礎,它允許使用互動式命令列提示,透過終端機執行指令。

    +

    在下表中,您可以根據所使用的 Milvus 版本,找到 PyMilvus 和 Milvus_CLI 的推薦版本。

    + + + + + + + + + + + + + + + + + + + + + +
    MilvusPyMilvusMilvus_CLI
    1.0.x1.0.1x
    1.1.x1.1.2x
    2.0.0-RC12.0.0rc1x
    2.0.0-RC22.0.0rc20.1.3
    2.0.0-RC42.0.0rc40.1.4
    2.0.0-RC52.0.0rc50.1.5
    2.0.0-RC62.0.0rc60.1.6
    2.0.0-RC72.0.0rc70.1.7
    2.0.0-RC82.0.0rc80.1.8
    2.0.0-RC92.0.0rc90.1.9
    2.1.02.1.00.3.0
    2.2.x2.2.x0.4.0
    2.3.x2.3.x0.4.2
    2.4.x2.4.x1.0.0
    2.4.x2.4.x1.0.1
    +
    由於儲存格式的改變,Milvus 2.0.0-RC7 及更新版本與 2.0.0-RC6 及更早版本不向後相容。
    +

    目前版本

    Milvus_CLI 目前的版本是 1.0.1。若要找出您已安裝的版本並查看是否需要更新,請執行milvus_cli --version

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.json new file mode 100644 index 000000000..be01d00a3 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.json @@ -0,0 +1 @@ +{"codeList":["pip install milvus-cli\n","$ docker run -it zilliz/milvus_cli:latest\n","git clone https://github.com/zilliztech/milvus_cli.git\n","cd milvus_cli\n","python -m pip install --editable .\n"],"headingContent":"Install Milvus_CLI","anchorList":[{"label":"安裝 Milvus_CLI","href":"Install-MilvusCLI","type":1,"isActive":false},{"label":"從 PyPI 安裝","href":"Install-from-PyPI","type":2,"isActive":false},{"label":"使用 Docker 安裝","href":"Install-with-Docker","type":2,"isActive":false},{"label":"從原始碼安裝","href":"Install-from-source-code","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.md new file mode 100644 index 000000000..b15e8267a --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/install_cli.md @@ -0,0 +1,100 @@ +--- +id: install_cli.md +summary: 學習如何安裝 Milvus_CLI。 +title: 安裝 Milvus_CLI +--- +

    安裝 Milvus_CLI

    本主題描述如何安裝 Milvus_CLI。

    +

    從 PyPI 安裝

    你可以從PyPI 安裝 Milvus_CLI。

    +

    先決條件

    +

    透過 pip 安裝

    執行下列指令來安裝 Milvus_CLI。

    +
    pip install milvus-cli
    +
    +

    使用 Docker 安裝

    您可以使用 docker 安裝 Milvus_CLI。

    +

    先決條件

    需要 Docker 19.03 或更新版本。

    +

    根據 Docker 映像檔安裝

    $ docker run -it zilliz/milvus_cli:latest
    +
    +

    從原始碼安裝

      +
    1. 執行下列指令下載milvus_cli 套件庫。
    2. +
    +
    git clone https://github.com/zilliztech/milvus_cli.git
    +
    +
      +
    1. 執行下列指令進入milvus_cli 資料夾。
    2. +
    +
    cd milvus_cli
    +
    +
      +
    1. 執行下列指令安裝 Milvus_CLI。
    2. +
    +
    python -m pip install --editable .
    +
    +

    另外,您也可以從壓縮的 tarball (.tar.gz 檔案) 安裝 Milvus_CLI。下載一個tar 包並執行python -m pip install milvus_cli-<version>.tar.gz

    +

    從 .exe 檔案安裝

    此安裝方法僅適用於 Windows。
    +

    GitHub下載 .exe 檔案並執行它來安裝 Milvus_CLI。如果安裝成功,milvus_cli-<version>.exe ,如下圖所示。

    +

    + + Milvus_CLI + Milvus_CLI

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json new file mode 100644 index 000000000..aaaf1b51f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across Buckets","anchorList":[{"label":"跨儲存桶在不同實體間遷移","href":"Migrate-Between-Instances-Across-Buckets","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件**","href":"Prerequisites","type":2,"isActive":false},{"label":"從 milvus_A 備份資料集","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"還原備份到 milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md new file mode 100644 index 000000000..06ef27303 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md @@ -0,0 +1,201 @@ +--- +id: cross-bucket-backup-and-restore.md +summary: 本主題詳述從一個 Milvus 實例備份資料集並還原到另一個實例的過程。 +title: 跨儲存桶在不同實體間遷移 +--- +

    跨儲存桶在不同實體間遷移

    本主題詳述從一個 Milvus 實例備份資料集,並將其還原到另一個實例的過程,每個實例在相同的物件儲存中使用不同的儲存桶。

    +

    概述

    下圖說明在同一個物件儲存空間中使用不同儲存桶的備份和還原程序。

    +

    + + cross-bucket-backup-and-restore.png + cross-bucket-backup-and-restore.png

    +

    假設我們有兩個 Milvus 實體,milvus_Amilvus_B ,兩者都使用預設的 MinIO 儲存引擎來儲存物件。這些實體在相同的物件儲存空間中使用不同的儲存桶 bucket_A 和bucket_B 。在這個範例中,我們的目標是完成下列任務:

    +
      +
    1. bucket_A 中為集合coll 建立備份 (my_backup) 並將備份儲存於bucket_B

    2. +
    3. bucket_B 中,從備份還原,並將還原的資料集命名為coll_bak

    4. +
    +

    先決條件**

      +
    • 確保已安裝milvus-backup工具。

    • +
    • 熟悉設定 Milvus 物件儲存設定。 詳細資訊請參閱物件儲存

    • +
    +

    從 milvus_A 備份資料集

    步驟 1:準備配置

    到 milvus-backup 專案的目錄,建立一個名為 configs 的目錄:

    +
    mkdir configs
    +cd configs
    +
    +

    下載備份組態檔案backup.yaml

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    檔案結構如下

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    步驟 2:編輯組態檔

    修改 backup.yaml 檔案,為milvus_A 設定適當的配置:

    +
      +
    • 連線 configs

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address:milvus_A 伺服器的 IP 位址或主機名稱。

      • +
      • milvus.port:Milvus 伺服器聆聽的 TCP 連接埠 (預設 19530)。

      • +
    • +
    • 儲存設定 (MinIO/S3 設定)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: localhost # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName:milvus_A 中用於資料儲存的儲存桶名稱。在本範例中,設定為bucket_A

    • +
    • minio.rootPath:儲存milvus_A 資料的儲存桶內的根目錄。在本範例中,設定為files

    • +
    • minio.backupBucketName:milvus_B 中用於備份儲存的儲存桶名稱。在本範例中,milvus_Amilvus_B 使用不同的儲存桶。因此,設定為bucket_B.

    • +
    • minio.backupRootPath:指定用於在milvus_B 中儲存備份檔案的儲存桶內的根目錄。在本範例中,設定為backup

    • +
    +

    步驟 3:建立備份

    儲存 backup.yaml 後,建立一個名為my_backup 的備份:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    此指令在物件儲存中為集合 coll 建立備份bucket_B/backup/my_backup

    +

    還原備份到 milvus_B

    步驟 1:設定還原設定

    重複步驟 2,修改還原至milvus_B 的設定,確保minio.bucketName 設定為bucket_B

    +

    以下是配置範例:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +...
    +
    +

    步驟 2:還原備份

    還原備份到milvus_B

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    此指令將備份還原到milvus_B 中名為coll_bak 的新集合,資料儲存在bucket_B/files/insert_log/[ID of new collection]

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json new file mode 100644 index 000000000..2471c3680 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","# configure a Minio host\nmc alias set my_minio https:// \n","# List the available buckets\nmc ls my_minio\n","# Download a bucket recursively\nmc cp --recursive my_minio/ \n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: minio_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_B\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_B\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances Across S3 Environments","anchorList":[{"label":"跨 S3 環境的實體間遷移","href":"Migrate-Between-Instances-Across-S3-Environments","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"從 milvus_A 備份資料集","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"手動傳輸備份到 milvus_B","href":"Manually-transfer-the-backup-to-milvusB","type":2,"isActive":false},{"label":"從備份還原到 milvus_B","href":"Restore-from-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md new file mode 100644 index 000000000..a261e3a02 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md @@ -0,0 +1,244 @@ +--- +id: multi-storage-backup-and-restore.md +summary: 本主題詳述從一個 Milvus 實例備份資料集並還原到另一個實例的過程。 +title: 跨 S3 環境的實體間遷移 +--- +

    跨 S3 環境的實體間遷移

    本主題詳述從一個 Milvus 實例備份資料集,並將其還原到另一個實例的過程,每個實例使用不同的物件儲存。

    +

    概述

    下圖說明使用不同物件儲存的備份和還原程序。

    +

    + + multi-storage-backup-and-restore.png + multistorage-backup-and-restore.png

    +

    假設我們有兩個使用不同物件儲存空間的 Milvus 實體milvus_Amilvus_B 。在這個範例中,我們的目標是完成下列任務:

    +
      +
    1. milvus_A 的物件儲存bucket_A 中的集合coll 建立備份 (my_backup)。

    2. +
    3. 將備份 my_backup 傳輸到milvus_Bbucket_B

    4. +
    +

    bucket_B 中,從備份還原,並將還原的集合命名為 coll_bak。

    +

    先決條件

      +
    • 確保已安裝milvus-backup工具。

    • +
    • 熟悉設定 Milvus 物件儲存的設定。 詳細資訊請參考物件儲存

    • +
    +

    從 milvus_A 備份資料集

    步驟 1:準備配置

    到 milvus-backup 專案的目錄,建立一個名為 configs 的目錄:

    +
    mkdir configs
    +cd configs
    +
    +

    下載備份組態檔案backup.yaml

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    檔案結構如下

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    步驟 2:編輯配置檔案

    修改backup.yaml 檔案,為 milvus_A 設定適當的配置:

    +
      +
    • 連接 configs

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address:milvus_A 伺服器的 IP 位址或主機名稱。

      • +
      • milvus.port:Milvus 伺服器聆聽的 TCP 連接埠 (預設 19530)。

      • +
    • +
    • 儲存設定 (MinIO/S3 設定)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: minio_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
    • +
    • minio.bucketName:在 milvus_A 中用於資料儲存的儲存桶名稱。在本範例中,設定為bucket_A

    • +
    • minio.rootPath:儲存 milvus_A 資料的儲存桶根目錄。在本範例中,設定為files

    • +
    • minio.backupBucketName:用於備份儲存的儲存桶名稱。在本範例中,設定為bucket_A

    • +
    • minio.backupRootPath:指定用於儲存備份檔案的儲存桶內的根目錄milvus_B 。 在此範例中,設定為backup

    • +
    +

    步驟 3:建立備份

    儲存 backup.yaml 後,建立一個名為my_backup 的備份:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    此指令會在milvus_A 的物件儲存空間中建立備份bucket_A/backup/my_backup

    +

    手動傳輸備份到 milvus_B

    由於milvus_Amilvus_B 使用不同的物件儲存空間,您需要手動從 milvus_A 的儲存空間下載備份,然後上傳到milvus_B 的儲存空間。

    +

    使用 MinIO 主控台

    +
      +
    1. 登入 MinIO 主控台。

    2. +
    3. 找到 minio.address 中為 milvus_A 指定的儲存桶。

    4. +
    5. 選取儲存桶中的備份檔案。

    6. +
    7. 按一下「下載」,將檔案下載到您的電腦。

    8. +
    +

    使用 mc 用戶端

    +

    您也可以使用mc 用戶端下載備份檔案:

    +
      +
    1. 設定 MinIO 主機:
    2. +
    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +
      +
    1. 列出可用的儲存桶:
    2. +
    +
    # List the available buckets
    +mc ls my_minio
    +
    +
      +
    1. 以遞迴方式下載儲存桶:
    2. +
    +
    # Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    下載備份檔案後,您可以將檔案上傳至milvus_B 使用的物件儲存空間,以便日後還原。或者,您也可以將備份上傳至Zilliz Cloud,以您的資料建立受管理的向量資料庫。詳情請參閱從 Milvus 遷移到 Zilliz Cloud

    +

    從備份還原到 milvus_B

    步驟 1:設定還原設定

    重複步驟 2,修改還原至milvus_B 的設定,確保minio.bucketName 設定為bucket_B

    +

    以下是配置範例:

    +
    # milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: minio_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_B" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_B" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    步驟 2:從備份還原

    還原備份到milvus_B

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    此命令將備份還原到milvus_B 中名為 coll_bak 的新集合中,資料儲存在milvus_B 的物件儲存空間內的bucket_B/files/insert_log/[ID of new collection] 中。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json new file mode 100644 index 000000000..f9b809605 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_A\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_A # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_A\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","...\n# milvus proxy address, compatible to milvus.yaml\nmilvus:\n address: milvus_B\n port: 19530\n authorizationEnabled: false\n # tls mode values [0, 1, 2]\n # 0 is close, 1 is one-way authentication, 2 is two-way authentication.\n tlsMode: 0\n user: \"root\"\n password: \"Milvus\"\n \n# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: milvus_B # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files_B\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n ...\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Migrate Between Instances in One Bucket (Different Root Paths)","anchorList":[{"label":"在一個儲存桶中的不同實體間遷移 (不同的根路徑)","href":"Migrate-Between-Instances-in-One-Bucket-Different-Root-Paths","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"備份集合從milvus_A","href":"Back-up-a-collection-from-milvusA","type":2,"isActive":false},{"label":"還原備份至milvus_B","href":"Restore-the-backup-to-milvusB","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md new file mode 100644 index 000000000..39cb6bccf --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md @@ -0,0 +1,196 @@ +--- +id: shared-bucket-backup-and-restore.md +summary: 本主題詳述從一個 Milvus 實例備份資料集,然後還原到另一個實例的過程,同時使用共用儲存桶來儲存物件。 +title: 在一個儲存桶中的不同實體間遷移 (不同的根路徑) +--- +

    在一個儲存桶中的不同實體間遷移 (不同的根路徑)

    本主題詳述從一個 Milvus 實例備份資料集,然後還原到另一個實例的過程,同時使用共用資料桶儲存物件,每個實例有不同的根路徑。

    +

    概述

    下圖說明使用共用資料桶備份和還原的過程。

    +

    + + shared-bucket-backup-and-restore.png + shared-bucket-backup-and-restore.png

    +

    假設我們有兩個 Milvus 實體,milvus_Amilvus_B ,兩者都使用預設的 MinIO 儲存引擎來儲存物件。這些實體共用相同的儲存桶bucket_A ,但將資料存放在不同的根路徑:files_A 存放在milvus_A ,files_B 存放在milvus_B 。在這個範例中,我們的目標是完成下列任務:

    +
      +
    1. 為集合 coll 建立備份 (my_backup),該集合儲存於files_A 路徑下的milvus_A

    2. +
    3. 從備份還原,並將其儲存到milvus_B 的 files_B 中。

    4. +
    +

    先決條件

      +
    • 確保已安裝milvus-backup工具。

    • +
    • 熟悉設定 Milvus 物件儲存設定,詳情請參閱物件儲存

    • +
    +

    備份集合從milvus_A

    步驟 1:準備配置

    到 milvus-backup 專案的目錄,建立一個名為 configs 的目錄:

    +
    mkdir configs
    +cd configs
    +
    +

    下載備份組態檔案 backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    檔案結構如下:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    步驟 2:編輯配置檔案

    修改 backup.yaml 檔案,為milvus_A 設定適當的配置:

    +
      +
    • 連線 configs

      +
      # milvus proxy address, compatible to milvus.yaml
      +milvus:
      +  address: milvus_A
      +  port: 19530
      +  authorizationEnabled: false
      +  # tls mode values [0, 1, 2]
      +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
      +  tlsMode: 0
      +  user: "root"
      +  password: "Milvus"
      +
      +
        +
      • milvus.address:milvus_A 伺服器的 IP 位址或主機名稱。

      • +
      • milvus.port:Milvus 伺服器聆聽的 TCP 連接埠 (預設 19530)。

      • +
    • +
    • 儲存設定 (MinIO/S3 設定)

      +
      # Related configuration of minio, which is responsible for data persistence for Milvus.
      +minio:
      +  # cloudProvider: "minio" # deprecated use storageType instead
      +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
      +  
      +  address: milvus_A # Address of MinIO/S3
      +  port: 9000   # Port of MinIO/S3
      +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  secretAccessKey: minioadmin # MinIO/S3 encryption string
      +  useSSL: false # Access to MinIO/S3 with SSL
      +  useIAM: false
      +  iamEndpoint: ""
      +  
      +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
      +  rootPath: "files_A" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
      +
      +  # only for azure
      +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
      +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
      +  
      +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
      +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
      +
      +
        +
      • minio.bucketName:用於milvus_A 儲存的儲存桶名稱。在此範例中,設定為bucket_A

      • +
      • minio.rootPath:儲存milvus_A 資料的儲存桶根目錄。在本範例中,設定為files_A

      • +
      • minio.backupBucketName:用於儲存的儲存桶名稱。在本範例中,milvus_Amilvus_B 共用一個資料桶。因此,設定為bucket_A.

      • +
      • minio.backupRootPath:指定用於儲存備份檔案的儲存桶內的根目錄milvus_B 。在本範例中,使用與milvus_A 不同的路徑。因此,設定為backup

      • +
    • +
    +

    步驟 3:建立備份

    保存backup.yaml 後,建立一個名為 my_backup 的備份:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    此指令會在物件儲存中為集合coll 建立備份bucket_A/backup/my_backup

    +

    還原備份至milvus_B

    步驟 1:設定還原設定

    重複步驟 2,修改還原至milvus_B 的設定,確保minio.bucketName 設定為bucket_Aminio.rootPath 設定為files_B ,以區別兩個實體的儲存位置。

    +

    以下是配置範例:

    +
    ...
    +# milvus proxy address, compatible to milvus.yaml
    +milvus:
    +  address: milvus_B
    +  port: 19530
    +  authorizationEnabled: false
    +  # tls mode values [0, 1, 2]
    +  # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
    +  tlsMode: 0
    +  user: "root"
    +  password: "Milvus"
    +  
    +# Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: milvus_B # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files_B" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +  ...
    +
    +

    步驟 2:還原備份

    還原備份到milvus_B

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    此命令將備份還原到milvus_B 中名為coll_bak 的新集合中,資料儲存在bucket_A/files_B/insert_log/[ID of new collection] 中。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json new file mode 100644 index 000000000..300cd791f --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.json @@ -0,0 +1 @@ +{"codeList":["mkdir configs\ncd configs\n","wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml\n","├── configs\n│ └── backup.yaml\n├── milvus-backup\n└── README.md\n","# Related configuration of minio, which is responsible for data persistence for Milvus.\nminio:\n # cloudProvider: \"minio\" # deprecated use storageType instead\n storageType: \"minio\" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)\n \n address: localhost # Address of MinIO/S3\n port: 9000 # Port of MinIO/S3\n accessKeyID: minioadmin # accessKeyID of MinIO/S3\n secretAccessKey: minioadmin # MinIO/S3 encryption string\n useSSL: false # Access to MinIO/S3 with SSL\n useIAM: false\n iamEndpoint: \"\"\n \n bucketName: \"bucket_A\" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance\n rootPath: \"files\" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance\n\n # only for azure\n backupAccessKeyID: minioadmin # accessKeyID of MinIO/S3\n backupSecretAccessKey: minioadmin # MinIO/S3 encryption string\n \n backupBucketName: \"bucket_A\" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath\n backupRootPath: \"backup\" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath\n","./milvus-backup create -c coll -n my_backup\n","./milvus-backup restore -c coll -n my_backup -s _bak\n"],"headingContent":"Backup and Restore in One Instance","anchorList":[{"label":"在同一個實例中備份和還原","href":"Backup-and-Restore-in-One-Instance","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"備份資料夾","href":"Back-up-the-collection","type":2,"isActive":false},{"label":"在 milvus_A 中從備份還原","href":"Restore-from-the-backup-within-milvusA","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md new file mode 100644 index 000000000..4a63fe90d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md @@ -0,0 +1,140 @@ +--- +id: single-instance-backup-and-restore.md +summary: 本主題將詳細介紹在同一個 Milvus 實例中備份資料集、並從備份中還原的過程。 +title: 在同一個實例中備份和還原 +--- +

    在同一個實例中備份和還原

    本主題詳細說明在同一個 Milvus 實例中備份資料集並從備份還原的過程。

    +

    概述

    下圖說明在單一 Milvus 實例中的備份和還原過程。

    +

    + + single-instance-backup-and-restore.png + single-instance-backup-and-restore.png

    +

    假設我們有一個 Milvus 實例,milvus_A ,使用名為bucket_A 的資料桶儲存資料。在這個範例中,我們的目標是完成下列任務:

    +
      +
    1. bucket_A 中的 collection coll 建立備份 (my_backup) 。

    2. +
    3. 從備份還原,並將還原的資料集命名為coll_bak

    4. +
    +

    先決條件

      +
    • 確保已安裝milvus-backup工具。

    • +
    • 熟悉設定 Milvus 物件儲存設定。 詳細資訊請參閱物件儲存

    • +
    +

    備份資料夾

    步驟 1:準備配置

    到 milvus-backup 專案的目錄,建立一個名為configs 的目錄:

    +
    mkdir configs
    +cd configs
    +
    +

    下載備份組態檔案 backup.yaml:

    +
    wget https://raw.githubusercontent.com/zilliztech/milvus-backup/main/configs/backup.yaml
    +
    +

    檔案結構如下:

    +
    ├── configs
    +│   └── backup.yaml
    +├── milvus-backup
    +└── README.md
    +
    +

    步驟 2:編輯配置檔案

    修改 backup.yaml 檔案,為milvus_A 設定適當的配置。以下是儲存配置範例:

    +
    # Related configuration of minio, which is responsible for data persistence for Milvus.
    +minio:
    +  # cloudProvider: "minio" # deprecated use storageType instead
    +  storageType: "minio" # support storage type: local, minio, s3, aws, gcp, ali(aliyun), azure, tc(tencent)
    +  
    +  address: localhost # Address of MinIO/S3
    +  port: 9000   # Port of MinIO/S3
    +  accessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  secretAccessKey: minioadmin # MinIO/S3 encryption string
    +  useSSL: false # Access to MinIO/S3 with SSL
    +  useIAM: false
    +  iamEndpoint: ""
    +  
    +  bucketName: "bucket_A" # Milvus Bucket name in MinIO/S3, make it the same as your milvus instance
    +  rootPath: "files" # Milvus storage root path in MinIO/S3, make it the same as your milvus instance
    +
    +  # only for azure
    +  backupAccessKeyID: minioadmin  # accessKeyID of MinIO/S3
    +  backupSecretAccessKey: minioadmin # MinIO/S3 encryption string
    +  
    +  backupBucketName: "bucket_A" # Bucket name to store backup data. Backup data will store to backupBucketName/backupRootPath
    +  backupRootPath: "backup" # Rootpath to store backup data. Backup data will store to backupBucketName/backupRootPath
    +
    +

    步驟 3:建立備份

    儲存 backup.yaml 後,建立一個名為my_backup 的備份:

    +
    ./milvus-backup create -c coll -n my_backup
    +
    +

    此指令在milvus_A 的物件儲存中建立備份bucket_A/backup/my_backup

    +

    在 milvus_A 中從備份還原

    建立備份後,您可以使用以下指令還原:

    +
    ./milvus-backup restore -c coll -n my_backup -s _bak
    +
    +

    此命令從備份還原,並在milvus_A 中建立一個名為 coll_bak 的新集合,資料儲存在bucket_A/files/insert_log/[ID of new collection] 中。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.json new file mode 100644 index 000000000..40a7f7303 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","./milvus-backup server\n","./milvus-backup server -p 443\n","python example/prepare_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/create' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"backup_name\": \"my_backup\",\n \"collection_names\": [\n \"hello_milvus\"\n ]\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/list' \\\n--header 'Content-Type: application/json'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=&backup_name=my_backup' \\\n--header 'Content-Type: application/json'\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"_recover\",\n \"backup_name\":\"my_backup\"\n}'\n","python example/clean_data.py\n","curl --location --request POST 'http://localhost:8080/api/v1/restore' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{\n \"async\": true,\n \"collection_names\": [\n \"hello_milvus\"\n ],\n \"collection_suffix\": \"\",\n \"backup_name\":\"my_backup\"\n}'\n","curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=' \\\n--header 'Content-Type: application/json'\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using APIs","anchorList":[{"label":"使用 API 備份和還原資料","href":"Back-up-and-Restore-Data-Using-APIs","type":1,"isActive":false},{"label":"取得 Milvus 備份","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"準備組態檔案","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"啟動 API 伺服器","href":"Start-up-the-API-server","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-data","type":2,"isActive":false},{"label":"備份資料","href":"Back-up-data","type":2,"isActive":false},{"label":"還原資料","href":"Restore-data","type":2,"isActive":false},{"label":"驗證還原的資料","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.md new file mode 100644 index 000000000..e5ed7edda --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_api.md @@ -0,0 +1,230 @@ +--- +id: milvus_backup_api.md +summary: 學習如何透過 API 使用 Milvus 備份 +title: 使用 API 備份和還原資料 +--- +

    使用 API 備份和還原資料

    Milvus Backup 提供資料備份和還原功能,以確保您的 Milvus 資料安全。

    +

    取得 Milvus 備份

    您可以下載已編譯的二進位檔或從原始碼建立。

    +

    要下載編譯後的二進位檔,請前往發行版頁面,在那裡您可以找到所有官方發行版。請記住,請務必使用標示為最新版本的二進位檔。

    +

    從原始碼編譯的步驟如下:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    準備組態檔案

    下載範例組態檔案,並依您的需求進行調整。

    +

    然後在已下載或已建立的 Milvus Backup 二進位檔旁邊建立一個資料夾,將資料夾名稱為configs ,並將設定檔放在configs 資料夾內。

    +

    您的資料夾結構應與以下相似:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    由於 Milvus Backup 無法將您的資料備份至本機路徑,因此在調整組態檔時,請確保 Minio 設定正確。

    +
    +

    預設 Minio 資料桶的名稱會因您安裝 Milvus 的方式而異。變更 Minio 設定時,請務必參考下表。

    + + + + + + + + +
    欄位Docker ComposeHelm / Milvus 操作員
    bucketNamea-bucketmilvus-bucket
    rootPath檔案檔案
    +
    +

    啟動 API 伺服器

    然後,您可以按以下步驟啟動 API 伺服器:

    +
    ./milvus-backup server
    +
    +

    API 伺服器預設在 8080 連接埠監聽。您可以使用-p 標誌執行來變更。要啟動以連接埠 443 聆聽的 API 伺服器,步驟如下:

    +
    ./milvus-backup server -p 443
    +
    +

    您可以使用 http://localhost 存取 Swagger UI:/api/v1/docs/index.html。

    +

    準備資料

    如果您運行一個空的本機 Milvus 實例,在預設的埠 19530 上監聽,請使用範例 Python 腳本在您的實例中產生一些資料。請隨意對腳本進行必要的修改,以滿足您的需求。

    +

    取得腳本。然後執行腳本來產生資料。確保已安裝官方的 Milvus Python SDKPyMilvus

    +
    python example/prepare_data.py
    +
    +

    此步驟是可選的。如果跳過此步驟,請確保您的 Milvus 實例中已經有一些資料。

    +

    備份資料

    +

    請注意,針對 Milvus 實例執行 Milvus Backup 通常不會影響實例的執行。在備份或還原時,您的 Milvus 實例是完全正常的。

    +

    執行以下指令建立備份。如有必要,請變更collection_namesbackup_name

    +
    curl --location --request POST 'http://localhost:8080/api/v1/create' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +  "async": true,
    +  "backup_name": "my_backup",
    +  "collection_names": [
    +    "hello_milvus"
    +  ]
    +}'
    +
    +

    命令執行後,您可以列出 Minio 設定中指定的資料桶中的備份,如下所示:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/list' \
    +--header 'Content-Type: application/json'
    +
    +

    並下載備份檔案,如下所示:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_backup?backup_id=<test_backup_id>&backup_name=my_backup' \
    +--header 'Content-Type: application/json'
    +
    +

    執行上述指令時,將backup_idbackup_name 變更為 list API 所傳回的內容。

    +

    現在,您可以將備份檔案儲存到安全的地方,以便將來還原,或是上傳到Zilliz Cloud,以您的資料建立一個受管理的向量資料庫。詳情請參閱從 Milvus 遷移到 Zilliz Cloud

    +

    還原資料

    +

    您可以使用collection_suffix 選項來呼叫 restore API 指令,從備份中還原資料來建立新的集合。如有必要,請變更collection_namesbackup_name

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "_recover",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    collection_suffix 選項可讓您為要建立的新集合設定後綴。上述命令將在您的Milvus實例中建立一個名為hello_milvus_recover的新集合。

    +

    如果您希望還原備份的資料集而不更改其名稱,請在從備份還原資料集之前丟棄該資料集。現在您可以執行以下指令,清理在準備資料中產生的資料。

    +
    python example/clean_data.py
    +
    +

    然後執行以下命令從備份還原資料。

    +
    curl --location --request POST 'http://localhost:8080/api/v1/restore' \
    +--header 'Content-Type: application/json' \
    +--data-raw '{
    +    "async": true,
    +    "collection_names": [
    +    "hello_milvus"
    +  ],
    +    "collection_suffix": "",
    +    "backup_name":"my_backup"
    +}'
    +
    +

    還原過程可能很費時,這取決於要還原的資料大小。因此,所有還原任務都是以非同步方式執行。您可以透過執行來檢查還原任務的狀態:

    +
    curl --location --request GET 'http://localhost:8080/api/v1/get_restore?id=<test_restore_id>' \
    +--header 'Content-Type: application/json'
    +
    +

    切記將test_restore_id 變更為還原 API 所還原的資料。

    +

    驗證還原的資料

    還原完成後,您可以按以下方式為還原的資料集編索引,以驗證還原的資料:

    +
    python example/verify_data.py
    +
    +

    請注意,上述腳本假設您已經以-s 標誌執行restore 指令,且後綴設定為-recover 。請隨意對腳本進行必要的變更,以符合您的需求。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.json new file mode 100644 index 000000000..1705f54a2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.json @@ -0,0 +1 @@ +{"codeList":["git clone git@github.com:zilliztech/milvus-backup.git\ngo get\ngo build\n","python example/prepare_data.py\n","./milvus-backup create -n \n","# configure a Minio host\nmc alias set my_minio https:// \n\n# List the available buckets\nmc ls my_minio\n\n# Download a bucket recursively\nmc cp --recursive my_minio/ \n","./milvus-backup restore -n my_backup -s _recover\n","python example/clean_data.py\n","./milvus-backup restore -n my_backup\n","python example/verify_data.py\n"],"headingContent":"Back up and Restore Data Using Commands","anchorList":[{"label":"使用命令備份和還原資料","href":"Back-up-and-Restore-Data-Using-Commands","type":1,"isActive":false},{"label":"取得 Milvus 備份","href":"Obtain-Milvus-Backup","type":2,"isActive":false},{"label":"準備組態檔案","href":"Prepare-configuration-file","type":2,"isActive":false},{"label":"準備資料","href":"Prepare-data","type":2,"isActive":false},{"label":"備份資料","href":"Back-up-data","type":2,"isActive":false},{"label":"還原資料","href":"Restore-data","type":2,"isActive":false},{"label":"驗證還原的資料","href":"Verify-restored-data","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.md new file mode 100644 index 000000000..a01ed3713 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_cli.md @@ -0,0 +1,180 @@ +--- +id: milvus_backup_cli.md +summary: 學習如何透過 CLI 使用 Milvus 備份 +title: 使用命令備份和還原資料 +--- +

    使用命令備份和還原資料

    Milvus Backup 提供資料備份和還原功能,以確保您的 Milvus 資料安全。

    +

    取得 Milvus 備份

    您可以下載已編譯的二進位檔或從原始碼建立。

    +

    要下載編譯後的二進位檔,請前往發行版頁面,在那裡您可以找到所有官方發行版。請記住,請務必使用標示為最新版本的二進位檔。

    +

    從原始碼編譯的步驟如下:

    +
    git clone git@github.com:zilliztech/milvus-backup.git
    +go get
    +go build
    +
    +

    準備組態檔案

    下載範例組態檔案,並依您的需求進行調整。

    +

    然後在已下載或已建立的 Milvus Backup 二進位檔旁邊建立一個資料夾,將資料夾名稱為configs ,並將設定檔放在configs 資料夾內。

    +

    您的資料夾結構應與以下相似:

    +
    +  
    +  workspace
    +  ├── milvus-backup
    +  └── configs
    +      └── backup.yaml
    +  
    +
    +

    由於 Milvus Backup 無法將您的資料備份至本機路徑,因此在調整組態檔時,請確保 Minio 設定正確。

    +
    +

    預設 Minio 資料桶的名稱會因您安裝 Milvus 的方式而異。變更 Minio 設定時,請務必參考下表。

    + + + + + + + + +
    欄位Docker ComposeHelm / Milvus 操作員
    bucketNamea-bucketmilvus-bucket
    rootPath檔案檔案
    +
    +

    準備資料

    如果您在預設的連接埠執行一個空的本機 Milvus 實例,請使用範例 Python 腳本在您的實例中產生一些資料。請隨意對腳本進行必要的修改,以符合您的需求。

    +

    獲取腳本。然後執行腳本來產生資料。確保已安裝官方的 Milvus Python SDKPyMilvus

    +
    python example/prepare_data.py
    +
    +

    此步驟是可選的。如果跳過此步驟,請確保您的 Milvus 實例中已經有一些資料。

    +

    備份資料

    請注意,針對 Milvus 實例執行 Milvus Backup 通常不會影響實例的執行。在備份或還原時,您的 Milvus 實例是完全正常的。

    +
    +

    執行以下命令來建立備份。

    +
    ./milvus-backup create -n <backup_name>
    +
    +

    命令執行後,您可以檢查 Minio 設定中指定的資料桶中的備份檔案。具體來說,您可以使用Minio 主控台mc用戶端下載它們。

    +

    若要從 Minio主控台下載,請登入 Minio 主控台,找到minio.address 中指定的資料桶,選擇資料桶中的檔案,然後按一下「下載」以下載它們。

    +

    如果您偏好mc 用戶端,請執行下列步驟:

    +
    # configure a Minio host
    +mc alias set my_minio https://<minio_endpoint> <accessKey> <secretKey>
    +
    +# List the available buckets
    +mc ls my_minio
    +
    +# Download a bucket recursively
    +mc cp --recursive my_minio/<your-bucket-path> <local_dir_path>
    +
    +

    現在,您可以將備份檔案儲存至安全的地方,以便將來還原,或上傳至Zilliz Cloud,以您的資料建立受管理的向量資料庫。詳情請參閱從 Milvus 遷移到 Zilliz Cloud

    +

    還原資料

    +

    您可以使用-s 標誌執行restore 指令,從備份中還原資料來建立新的集合:

    +
    ./milvus-backup restore -n my_backup -s _recover
    +
    +

    -s 標誌允許您為要建立的新集合設定後綴。上述命令將在您的Milvus實例中建立一個新的資料集,名稱為hello_milvus_recover

    +

    如果您希望還原已備份的資料集而不更改其名稱,請在從備份還原資料集之前刪除該資料集。現在您可以執行以下指令,清理在準備資料中產生的資料。

    +
    python example/clean_data.py
    +
    +

    然後執行以下命令從備份還原資料。

    +
    ./milvus-backup restore -n my_backup
    +
    +

    驗證還原的資料

    還原完成後,您可以按以下方式為還原的資料集編製索引,以驗證還原的資料:

    +
    python example/verify_data.py
    +
    +

    請注意,上述腳本假設您已執行restore 指令,並加上-s 標誌,且後綴設定為-recover 。請隨意對腳本進行必要的變更,以符合您的需求。

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.json new file mode 100644 index 000000000..1031e389d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Milvus Backup","anchorList":[{"label":"Milvus 備份","href":"Milvus-Backup","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"架構","href":"Architecture","type":2,"isActive":false},{"label":"最新版本","href":"Latest-release","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.md new file mode 100644 index 000000000..4f9ce2fed --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-backup/milvus_backup_overview.md @@ -0,0 +1,81 @@ +--- +id: milvus_backup_overview.md +summary: Milvus-Backup 是一個允許使用者備份和還原 Milvus 資料的工具。 +title: Milvus 備份 +--- +

    Milvus 備份

    Milvus Backup 是一個允許使用者備份和還原 Milvus 資料的工具。它提供 CLI 和 API,以配合不同的應用情境。

    +

    先決條件

    在開始使用 Milvus 備份之前,請確保

    +
      +
    • 作業系統是 CentOS 7.5+ 或 Ubuntu LTS 18.04+、
    • +
    • Go 版本為 1.20.2 或更新版本。
    • +
    +

    架構

    + + Milvus Backup architecture + Milvus 備份架構

    +

    Milvus Backup 有助於跨 Milvus 實體備份和還原 metadata、segment 和資料。它提供北向介面,例如 CLI、API 和基於 gRPC 的 Go 模組,以便彈性操作備份和還原流程。

    +

    Milvus Backup 從源 Milvus 實例讀取集合元資料和片段來建立備份。然後,它會從源 Milvus 實例的根目錄中複製收集資料,並將複製的資料儲存到備份根目錄中。

    +

    要從備份還原,Milvus Backup 會根據備份中的集合元資料和段資訊,在目標 Milvus 實例中建立新的集合。然後將備份資料從備份根目錄中複製到目標實例的根目錄中。

    +

    最新版本

    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.json new file mode 100644 index 000000000..1852b4930 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Monitoring","anchorList":[{"label":"監控","href":"Monitoring","type":1,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.md new file mode 100644 index 000000000..d062bca86 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/cdc-monitoring.md @@ -0,0 +1,42 @@ +--- +id: cdc-monitoring.md +order: 4 +summary: Milvus-CDC 透過 Grafana 面板提供全面的監控功能。 +title: 監控 +--- +

    監控

    Milvus-CDC 透過 Grafana 面板提供全面的監控功能,讓您可視化關鍵指標,並確保變更資料擷取 (CDC) 任務和伺服器健康的順暢運作。

    +

    CDC 任務的指標

    若要開始使用,請將cdc-grafana.json檔案匯入 Grafana。這將新增專為監控 CDC 任務狀態而設計的儀表板。

    +

    CDC Grafana 面板概述

    +

    + + milvus-cdc-dashboard + milvus-cdc-dashboard

    +

    關鍵指標說明:

    +
      +
    • 任務:不同狀態的 CDC 任務數量,包括InitialRunningPaused

    • +
    • 請求總數:Milvus-CDC 收到的請求總數。

    • +
    • 請求成功:Milvus-CDC 收到的成功請求數目。

    • +
    • 任務數:隨著時間的推移,處於InitialPausedRunning狀態的任務數量。

    • +
    • 任務狀態:個別任務的狀態。

    • +
    • 請求次數:成功的請求次數和總請求次數

    • +
    • 請求延遲:透過 p99 提出請求的延遲時間、平均值及其他統計資料。

    • +
    • 複製資料速率:讀/寫作業的複製資料速率

    • +
    • 複製時間滯後:讀/寫作業的複製時間滯後。

    • +
    • api 執行次數:執行不同 Milvus-CDC API 的次數。

    • +
    • center ts:讀/寫任務的時間戳記。

    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.json new file mode 100644 index 000000000..57df021e2 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.json @@ -0,0 +1 @@ +{"codeList":["git clone https://github.com/zilliztech/milvus-cdc.git\n\ncd milvus-cdc/server/configs\n","# cdc meta data config\nmetaStoreConfig:\n # the metastore type, available value: etcd, mysql\n storeType: etcd\n # etcd address\n etcdEndpoints:\n - localhost:2379\n # mysql connection address\n # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8\n # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy\n rootPath: cdc\n","# milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.\nsourceConfig:\n # etcd config\n etcdAddress:\n - localhost:2379\n etcdRootPath: by-dev\n etcdMetaSubPath: meta\n # default partition name\n defaultPartitionName: _default\n # read buffer length, mainly used for buffering if writing data to milvus-target is slow.\n readChanLen: 10\n replicateChan: by-dev-replicate-msg\n # milvus-source mq config, which is pulsar or kafka\n pulsar:\n address: pulsar://localhost:6650\n webAddress: localhost:80\n maxMessageSize: 5242880\n tenant: public\n namespace: default\n# authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken\n# authParams: token:xxx\n# kafka:\n# address: 127.0.0.1:9092\n","make build\n","bash build_image.sh\n","# dir tree\n.\n├── milvus-cdc # build from source code or download from release page\n├── configs\n│ └── cdc.yaml # config for cdc and source milvus\n\n# start milvus cdc\n./milvus-cdc server\n","docker compose up -d\n"],"headingContent":"Deploy CDC Server","anchorList":[{"label":"部署 CDC 伺服器","href":"Deploy-CDC-Server","type":1,"isActive":false},{"label":"先決條件","href":"Prerequisites","type":2,"isActive":false},{"label":"步驟","href":"Steps","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.md new file mode 100644 index 000000000..94f9ebb34 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/deploy-cdc-server.md @@ -0,0 +1,154 @@ +--- +id: deploy-cdc-server.md +order: 2 +summary: 本指南提供部署 Milvus-CDC 伺服器的逐步過程。 +title: 部署 CDC 伺服器 +--- +

    部署 CDC 伺服器

    本指南提供部署 Milvus-CDC 伺服器的逐步過程。

    +

    先決條件

    在部署 Milvus-CDC 伺服器之前,確保符合下列條件:

    +
      +
    • Milvus Instances:源 Milvus 和至少一個目標 Milvus 都應已部署並運作。

      +
        +
      • 源和目標 Milvus 版本都必須是 2.3.2 或更高,最好是 2.4.x。我們建議使用相同版本的源和目標 Milvus 以確保兼容性。

      • +
      • 將目標 Milvus 的common.ttMsgEnabled 設定為false

      • +
      • 使用不同的元和訊息儲存設定來設定來源和目標 Milvus,以防止衝突。例如,避免在多個 Milvus 實體中使用相同的 etcd 和 rootPath 設定,以及相同的 Pulsar 服務和chanNamePrefix

      • +
    • +
    • 元端儲存:為 Milvus-CDC 元資料庫準備好 etcd 或 MySQL 資料庫。

    • +
    +

    步驟

    取得 Milvus-CDC 的設定檔

    克隆Milvus-CDC 倉庫,並導航至milvus-cdc/server/configs 目錄,以存取cdc.yaml 配置檔案。

    +
    git clone https://github.com/zilliztech/milvus-cdc.git
    +
    +cd milvus-cdc/server/configs
    +
    +

    編輯設定檔

    milvus-cdc/server/configs 目錄中,修改cdc.yaml 檔案,以自訂與 Milvus-CDC 元端程式庫及來源 Milvus 連線細節相關的設定。

    +
      +
    • 元端儲存配置

      +
        +
      • metaStoreConfig.storeType:Milvus-CDC 的 metastore 類型。可能的值是etcdmysql

      • +
      • metaStoreConfig.etcdEndpoints:連線至 Milvus-CDC 的 etcd 位址。如果storeType 設為etcd 則必須。

      • +
      • metaStoreConfig.mysqlSourceUrl:Milvus-CDC 伺服器 MySQL 資料庫的連線位址。如果storeType 設為mysql 則需要。

      • +
      • metaStoreConfig.rootPath:Milvus-CDC 元庫的根目錄。此設定可實現多租戶功能,允許多個 CDC 服務使用相同的 etcd 或 MySQL 實例,同時透過不同的根目錄實現隔離。

      • +
      +

      配置範例:

      +
      # cdc meta data config
      +metaStoreConfig:
      +  # the metastore type, available value: etcd, mysql
      +  storeType: etcd
      +  # etcd address
      +  etcdEndpoints:
      +    - localhost:2379
      +  # mysql connection address
      +  # mysqlSourceUrl: root:root@tcp(127.0.0.1:3306)/milvus-cdc?charset=utf8
      +  # meta data prefix, if multiple cdc services use the same store service, you can set different rootPaths to achieve multi-tenancy
      +  rootPath: cdc
      +
    • +
    • 源 Milvus 配置:

      +

      指定來源 Milvus 的連線細節,包括 etcd 和訊息儲存,以建立 Milvus-CDC 伺服器與來源 Milvus 的連線。

      +
        +
      • sourceConfig.etcdAddress:連接來源 Milvus 的 etcd 位址。如需詳細資訊,請參閱etcd 相關的設定

      • +
      • sourceConfig.etcdRootPath:來源 Milvus 在 etcd 中儲存資料的 key 的 Root 前綴。根據 Milvus 實例的部署方法,其值可能會有所不同:

        +
          +
        • HelmDocker Compose:預設為by-dev

        • +
        • 操作員:Defaults to<release_name>.

        • +
      • +
      • replicateChan:milvus 複製通道名稱,在 milvus.yaml 檔案中為{msgChannel.chanNamePrefix.cluster}/{msgChannel.chanNamePrefix.replicateMsg}

      • +
      • sourceConfig.pulsar:源 Milvus 的 Pulsar 配置。如果來源 Milvus 使用 Kafka 儲存訊息,請移除所有與 Pulsar 相關的設定。如需詳細資訊,請參閱Pulsar 相關設定

      • +
      • sourceConfig.kafka.address:來源 Milvus 的 Kafka 位址。如果來源 Milvus 使用 Kafka 儲存訊息,請取消註解此組態。

      • +
    • +
    +

    配置範例:

    +
    # milvus-source config, these settings are basically the same as the corresponding configuration of milvus.yaml in milvus source.
    +sourceConfig:
    +  # etcd config
    +  etcdAddress:
    +    - localhost:2379
    +  etcdRootPath: by-dev
    +  etcdMetaSubPath: meta
    +  # default partition name
    +  defaultPartitionName: _default
    +  # read buffer length, mainly used for buffering if writing data to milvus-target is slow.
    +  readChanLen: 10
    +  replicateChan: by-dev-replicate-msg
    +  # milvus-source mq config, which is pulsar or kafka
    +  pulsar:
    +    address: pulsar://localhost:6650
    +    webAddress: localhost:80
    +    maxMessageSize: 5242880
    +    tenant: public
    +    namespace: default
    +#    authPlugin: org.apache.pulsar.client.impl.auth.AuthenticationToken
    +#    authParams: token:xxx
    +#  kafka:
    +#    address: 127.0.0.1:9092
    +
    +

    編譯 Milvus-CDC 伺服器

    儲存cdc.yaml 檔案後,導覽到milvus-cdc 目錄,並執行下列其中一個指令來編譯伺服器:

    +
      +
    • 對於二進位檔案

      +
      make build
      +
    • +
    • 對於 Docker 映像檔

      +
      bash build_image.sh
      +
      +

      對於 Docker 映像檔,將已編譯的檔案掛載到容器內的/app/server/configs/cdc.yaml

    • +
    +

    啟動伺服器

      +
    • 使用二進位檔案

      +

      導覽到包含milvus-cdc 二進位檔案的目錄,以及包含cdc.yaml 檔案的configs 目錄,然後啟動伺服器:

      +
      # dir tree
      +.
      +├── milvus-cdc # build from source code or download from release page
      +├── configs
      +│   └── cdc.yaml # config for cdc and source milvus
      +
      +# start milvus cdc
      +./milvus-cdc server
      +
    • +
    • 使用 Docker Compose:

      +
      docker compose up -d
      +
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.json new file mode 100644 index 000000000..4b3df61fc --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.json @@ -0,0 +1 @@ +{"codeList":["curl -X POST http:_//localhost:8444/cdc \\\n-H \"Content-Type: application/json\" \\\n-d '{\n \"request_type\": \"create\",\n \"request_data\": {\n \"milvus_connect_param\": {\n \"uri\": \"http://localhost:19530\",\n \"token\":\"root:Milvus\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ]\n }\n}'\n","{\n \"code\": 200,\n \"data\": {\n \"task_id\":\"xxxx\"\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\": \"list\"\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"tasks\": [\n {\n \"task_id\": \"xxxxx\",\n \"milvus_connect_param\": {\n \"uri\":\"http://localhost:19530\",\n \"connect_timeout\": 10\n },\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"state\": \"Running\"\n }\n ]\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"pause\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"resume\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"get\",\n \"request_data\": {\n \"task_id\": \"xxxx\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {\n \"Task\": {\n \"collection_infos\": [\n {\n \"name\": \"*\"\n }\n ],\n \"milvus_connect_param\": {\n \"connect_timeout\": 10,\n \"uri\":\"http://localhost:19530\"\n },\n \"state\": \"Running\",\n \"task_id\": \"xxxx\"\n }\n }\n}\n","curl -X POST -H \"Content-Type: application/json\" -d '{\n \"request_type\":\"delete\",\n \"request_data\": {\n \"task_id\": \"30d1e325df604ebb99e14c2a335a1421\"\n }\n}' http://localhost:8444/cdc\n","{\n \"code\": 200,\n \"data\": {}\n}\n"],"headingContent":"Manage CDC Tasks","anchorList":[{"label":"管理 CDC 任務","href":"Manage-CDC-Tasks","type":1,"isActive":false},{"label":"建立任務","href":"Create-a-task","type":2,"isActive":false},{"label":"列出任務","href":"List-tasks","type":2,"isActive":false},{"label":"暫停任務","href":"Pause-a-task","type":2,"isActive":false},{"label":"恢復任務","href":"Resume-a-task","type":2,"isActive":false},{"label":"擷取任務詳細資訊","href":"Retrieve-task-details","type":2,"isActive":false},{"label":"刪除任務","href":"Delete-a-task","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.md new file mode 100644 index 000000000..c774e5ec8 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/manage-cdc-tasks.md @@ -0,0 +1,273 @@ +--- +id: manage-cdc-tasks.md +order: 3 +summary: 擷取資料變更 (CDC) 任務可將資料從來源 Milvus 實例同步到目標 Milvus 實例。 +title: 管理 CDC 任務 +--- +

    管理 CDC 任務

    捕捉資料變更 (CDC) 任務可將資料從來源 Milvus 實例同步到目標 Milvus 實例。它監控來自來源的操作日誌,並即時複製資料變更,例如插入、刪除和索引操作到目標。這有助於實時災難復原或 Milvus 部署之間的主動負載平衡。

    +

    本指南涵蓋如何管理 CDC 任務,包括透過 HTTP 請求建立、暫停、恢復、擷取詳細資料、列出和刪除。

    +

    建立任務

    建立 CDC 任務可讓來源 Milvus 的資料變更作業同步到目標 Milvus。

    +

    要建立 CDC 任務

    +
    curl -X POST http:_//localhost:8444/cdc \
    +-H "Content-Type: application/json" \
    +-d '{
    +  "request_type": "create",
    +  "request_data": {
    +    "milvus_connect_param": {
    +      "uri": "http://localhost:19530",
    +      "token":"root:Milvus",
    +      "connect_timeout": 10
    +    },
    +    "collection_infos": [
    +      {
    +        "name": "*"
    +      }
    +    ]
    +  }
    +}'
    +
    +

    用目標 Milvus 伺服器的 IP 位址取代localhost

    +

    參數

    +
      +
    • milvus_connect_param: 目標 Milvus 的連線參數。

      +
        +
      • host: Milvus 伺服器的主機名稱或 IP 位址。

      • +
      • port:Milvus 伺服器所監聽的連接埠號。

      • +
      • username: 用於驗證 Milvus 伺服器的使用者名稱。

      • +
      • password: 用於驗證 Milvus 伺服器的密碼。

      • +
      • enable_tls:是否使用 TLS/SSL 加密連線。

      • +
      • connect_timeout:建立連線的逾時時間,以秒為單位。

      • +
    • +
    • collection_infos:要同步的集合。目前只支援星號(*),因為 Milvus-CDC 同步處理的是群集層級,而非個別的集合。

    • +
    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "task_id":"xxxx"
    +  }
    +}
    +
    +

    列出任務

    列出所有已建立的 CDC 任務:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type": "list"
    +}' http://localhost:8444/cdc
    +
    +

    localhost改為目標 Milvus 伺服器的 IP 位址。

    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "tasks": [
    +      {
    +        "task_id": "xxxxx",
    +        "milvus_connect_param": {
    +          "uri":"http://localhost:19530",
    +          "connect_timeout": 10
    +        },
    +        "collection_infos": [
    +          {
    +            "name": "*"
    +          }
    +        ],
    +        "state": "Running"
    +      }
    +    ]
    +  }
    +}
    +
    +

    暫停任務

    要暫停 CDC 任務:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"pause",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    用目標 Milvus 伺服器的 IP 位址取代localhost

    +

    參數

    +
      +
    • task_id:要暫停的 CDC 任務的 ID。
    • +
    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    恢復任務

    若要恢復暫停的 CDC 任務,請

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"resume",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    localhost改為目標 Milvus 伺服器的 IP 位址。

    +

    參數

    +
      +
    • task_id:要恢復的 CDC 任務的 ID。
    • +
    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    +

    擷取任務詳細資訊

    擷取特定 CDC 任務的詳細資訊:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"get",
    +  "request_data": {
    +    "task_id": "xxxx"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    localhost改為目標 Milvus 伺服器的 IP 位址。

    +

    參數

    +
      +
    • task_id:要查詢的 CDC 任務的 ID。
    • +
    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {
    +    "Task": {
    +      "collection_infos": [
    +        {
    +          "name": "*"
    +        }
    +      ],
    +      "milvus_connect_param": {
    +        "connect_timeout": 10,
    +        "uri":"http://localhost:19530"
    +      },
    +      "state": "Running",
    +      "task_id": "xxxx"
    +    }
    +  }
    +}
    +
    +

    刪除任務

    刪除 CDC 任務:

    +
    curl -X POST -H "Content-Type: application/json" -d '{
    +  "request_type":"delete",
    +  "request_data": {
    +    "task_id": "30d1e325df604ebb99e14c2a335a1421"
    +  }
    +}' http://localhost:8444/cdc
    +
    +

    localhost改為目標 Milvus 伺服器的 IP 位址。

    +

    參數

    +
      +
    • task_id:要刪除的 CDC 任務的 ID。
    • +
    +

    預期回應:

    +
    {
    +  "code": 200,
    +  "data": {}
    +}
    +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.json new file mode 100644 index 000000000..0ad38639d --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.json @@ -0,0 +1 @@ +{"codeList":[],"headingContent":"Overview","anchorList":[{"label":"概述","href":"Overview","type":1,"isActive":false},{"label":"主要功能","href":"Key-capabilities","type":2,"isActive":false},{"label":"架構","href":"Architecture","type":2,"isActive":false},{"label":"工作流程","href":"Workflow","type":2,"isActive":false},{"label":"限制","href":"Limits","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.md new file mode 100644 index 000000000..963fe1712 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-cdc/milvus-cdc-overview.md @@ -0,0 +1,123 @@ +--- +id: milvus-cdc-overview.md +order: 1 +summary: Milvus-CDC 是一個易於使用的工具,可以在 Milvus 實體中擷取和同步增量資料。 +title: CDC 總覽 +--- +

    概述

    Milvus-CDC 是一款用戶友好的工具,可捕捉和同步 Milvus 實例中的增量資料。它透過在來源與目標實體之間的無縫傳輸,確保業務資料的可靠性,讓增量備份和災難復原變得簡單。

    +

    主要功能

      +
    • 順序資料同步:透過在 Milvus 實體間依序同步資料變更,確保資料完整性與一致性。

    • +
    • 增量資料複製:從源 Milvus 複製增量資料(包括插入和刪除)到目標 Milvus,提供持久性儲存。

    • +
    • CDC 任務管理:允許透過 OpenAPI 請求管理 CDC 任務,包括建立、查詢狀態及刪除 CDC 任務。

    • +
    +

    此外,我們正計劃擴充我們的功能,以在未來支援與串流處理系統的整合。

    +

    架構

    Milvus-CDC 採用的架構包含兩個主要元件 - 管理任務與元資料的 HTTP 伺服器,以及同步任務執行的corelib,後者是從來源 Milvus 實體取得資料的閱讀器,而寫入器則是將處理後的資料傳送至目標 Milvus 實體。

    +

    + + milvus-cdc-architecture + milvus-cdc 架構

    +

    在上圖中

    +
      +
    • HTTP 伺服器:處理使用者請求、執行任務並維護元資料。它是 Milvus-CDC 系統內任務協調的控制平面。

    • +
    • Corelib:負責任務的實際同步。它包括一個從來源 Milvus 的 etcd 和訊息佇列 (MQ) 擷取資訊的讀取元件,以及一個將訊息從 MQ 轉換成 Milvus 系統 API 參數的寫入元件,並將這些要求傳送至目標 Milvus 以完成同步處理。

    • +
    +

    工作流程

    Milvus-CDC 資料處理流程包含下列步驟:

    +
      +
    1. 任務建立:使用者透過 HTTP 請求啟動 CDC 任務。

    2. +
    3. 元資料擷取:系統從源 Milvus 的 etcd 抓取特定於集合的元資料,包括集合的通道和檢查點資訊。

    4. +
    5. MQ 連線:有了元資料後,系統會連線至 MQ,開始訂閱資料串流。

    6. +
    7. 資料處理:從 MQ 讀取、解析資料,並使用 Go SDK 傳送資料或處理資料,以複製在源 Milvus 執行的作業。

    8. +
    +

    + + milvus-cdc-workflow + Milvus-cdc-workflow

    +

    限制

      +
    • 增量資料同步:到目前為止,Milvus-CDC 僅能同步增量資料。如果您的業務需要完整的資料備份,請聯絡我們尋求協助。

    • +
    • 同步範圍:目前,Milvus-CDC 可同步群集層級的資料。我們正努力在即將發佈的版本中增加對集合層級資料同步的支援。

    • +
    • 支援的 API 請求:Milvus-CDC 目前支援下列 API 請求。我們計劃在未來的版本中擴展對其他請求的支援:

      +
        +
      • 建立/刪除資料集

      • +
      • 插入/刪除/增加

      • +
      • 建立/刪除分割區

      • +
      • 建立/刪除索引

      • +
      • 載入/釋放/沖洗

      • +
      • 載入/釋放磁碟分割

      • +
      • 建立/刪除資料庫

      • +
    • +
    diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.json b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.json new file mode 100644 index 000000000..f8eeb4479 --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.json @@ -0,0 +1 @@ +{"codeList":["http://${MILVUS_PROXY_IP}:9091/webui\n"],"headingContent":"Milvus WebUI","anchorList":[{"label":"Milvus WebUI","href":"Milvus-WebUI","type":1,"isActive":false},{"label":"概述","href":"Overview","type":2,"isActive":false},{"label":"功能","href":"Features","type":2,"isActive":false},{"label":"首頁","href":"Home","type":2,"isActive":false},{"label":"收藏集","href":"Collections","type":2,"isActive":false},{"label":"查詢","href":"Query","type":2,"isActive":false},{"label":"資料","href":"Data","type":2,"isActive":false},{"label":"任務","href":"Tasks","type":2,"isActive":false},{"label":"緩慢請求","href":"Slow-requests","type":2,"isActive":false},{"label":"配置","href":"Configurations","type":2,"isActive":false},{"label":"工具","href":"Tools","type":2,"isActive":false}]} \ No newline at end of file diff --git a/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.md b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.md new file mode 100644 index 000000000..cee11dbea --- /dev/null +++ b/localization/v2.5.x/site/zh-hant/userGuide/tools/milvus-webui.md @@ -0,0 +1,287 @@ +--- +id: milvus-webui.md +summary: Milvus Web UI 是 Milvus 的圖形管理工具。它以簡單直觀的介面增強系統的可觀察性。您可以 +title: Milvus WebUI +--- +

    Milvus WebUI

    Milvus Web UI 是 Milvus 的圖形管理工具。它以簡單直觀的介面增強系統的可觀察性。您可以使用 Milvus Web UI 觀察 Milvus 元件和相依性的統計和指標、檢查資料庫和收集的詳細資料,以及列出詳細的 Milvus 設定。

    +

    概述

    Milvus Web UI 與 Birdwatcher 和 Attu 的不同之處在於它是一個內建工具,以簡單直觀的介面提供整體系統的可觀察性。

    +

    下表比較 Milvus Web UI 和 Birdwatcher/Attu 的功能:

    + + + + + + + + + + + + +
    功能Milvus Web UI觀鳥者鳥報
    操作形式GUICLIGUI
    目標使用者維護人員、開發人員維護人員開發人員
    安裝內建獨立工具獨立工具
    相依性MilvusMilvus / etcdMilvus
    主要功能運行環境、資料庫/資料集細節、區段、頻道、任務和慢速查詢請求元資料檢查和 Milvus API 執行資料庫管理與作業任務
    v2.5.0v2.0.0v0.1.8
    +

    自v2.5.0起,您可以在運行中的Milvus實例上使用以下URL訪問Milvus Web UI:

    +
    http://${MILVUS_PROXY_IP}:9091/webui
    +
    +

    功能

    Milvus Web UI 提供以下功能:

    +

    + + Milvus Web UI overview + Milvus Web UI 總覽

    +
      +
    • 首頁

      +

      您可以找到關於目前執行中的 Milvus 實例、其元件、連結的用戶端和相依性的資訊。

    • +
    • 資料庫

      +

      您可以檢視目前在 Milvus 中的資料庫和集合清單,並檢查其詳細資訊。

    • +
    • 查詢

      +

      您可以查看查詢節點和查詢協調器在區段、通道、複製和資源群組方面收集的統計資料。

    • +
    • 資料

      +

      您可以檢視收集到的資料節點在區段和通道方面的統計資料。

    • +
    • 任務

      +

      您可以檢視在 Milvus 中執行的任務清單,包括 Querycoord 排程任務、壓縮任務、索引建立任務、匯入任務和資料同步任務。

    • +
    • 緩慢請求

      +

      您可以檢視 Milvus 中的慢速請求清單,包括請求類型、請求持續時間和請求參數。

    • +
    • 配置

      +

      您可以檢視 Milvus 配置清單及其值。

    • +
    • 工具

      +

      您可以從 Web UI 存取兩個內建工具,pprof 和 Milvus 資料可視化工具。

    • +
    +

    首頁

    在首頁,您可以找到以下資訊:

    +

    + + Milvus Web UI Home + Milvus Web UI 首頁

    +
      +
    • 系統資訊:檢視系統資訊,包括部署模式、部署中使用的映像,以及相關資訊。

    • +
    • 元件資訊:檢視 Milvus 中元件的狀態和指標,包括查詢節點、資料節點、索引節點、協調器和代理的狀態和指標。

    • +
    • 已連接的用戶端:檢視已連線的用戶端及其資訊,包括 SDK 類型和版本、使用者名稱及其存取記錄。

    • +
    • 系統相依性:檢視 Milvus 依賴系統的狀態和指標,包括元儲存、訊息佇列和物件儲存的狀態和指標。

    • +
    +

    收藏集

    在集合頁面,您可以檢視 Milvus 目前的資料庫和集合清單,並檢查它們的詳細資料。

    +

    + + Milvus Web UI Collections + Milvus Web UI 收藏集

    +
      +
    • 資料庫:檢視目前在 Milvus 中的資料庫清單及其詳細資訊。

    • +
    • 收藏集:檢視每個資料庫的收藏集清單及其詳細資訊。

      +

      您可以點擊一個集合來查看其詳細資訊,包括欄位數量、分區、索引和其他詳細資訊。

      +

      + + Milvus Web UI Collection Details + Milvus Web UI 集合詳細資訊

    • +
    +

    查詢

    + + Milvus Web UI Query Page + Milvus Web UI 查詢頁面

    +
      +
    • 區段:檢視區段清單及其詳細資訊,包括區段 ID、對應的集合、狀態、大小等。

    • +
    • 頻道:檢視頻道清單及其詳細資訊,包括頻道名稱、對應的集合等。

    • +
    • 複製:檢視複製的清單及其詳細資訊,包括複製 ID、對應的集合等。

    • +
    • 資源群組:檢視資源群組清單及其詳細資訊,包括資源群組名稱、群組中的查詢節點數量及其配置等。

    • +
    +

    資料

    + + Milvus Web UI Data Page + Milvus Web UI 資料頁面

    +
      +
    • 區段:檢視資料節點/協調器的區段清單及其詳細資訊,包括區段 ID、對應的集合、狀態、大小等。

    • +
    • 通道:檢視資料節點/協調員的頻道清單及其詳細資訊,包括頻道名稱、對應的集合等。

    • +
    +

    任務

    + + Milvus Web UI Tasks Page + Milvus Web UI 任務頁面

    +
      +
    • 任務:檢視在 Milvus 中執行的任務清單,包括任務類型、狀態和動作。

      +
        +
      • QueryCoord 任務:檢視所有 QueryCoord 排程工作,包括過去 15 分鐘內的 balancer、index/segment/channel/leader 檢查工作。

      • +
      • 壓縮任務:檢視資料協調員在過去 15 分鐘內的所有壓縮任務。

      • +
      • 索引建立任務:檢視資料協調員在過去 30 分鐘內的所有索引建立工作。

      • +
      • 匯入任務:檢視資料協調員在過去 30 分鐘內的所有匯入工作。

      • +
      • 資料同步工作:檢視資料節點在過去 15 分鐘內的所有資料同步工作。

      • +
    • +
    +

    緩慢請求

    + + Milvus Web UI Slow Requests Page + Milvus Web UI 慢速請求頁面

    +
      +
    • 慢速請求:慢速請求是指延遲時間超過設定中指定的proxy.slowQuerySpanInSeconds 值的搜尋或查詢。慢速請求清單顯示最近 15 分鐘內的所有慢速請求。
    • +
    +

    配置

    + + Milvus Web UI Configurations Page + Milvus Web UI 配置頁面

    +
      +
    • 配置:檢視 Milvus 執行時設定清單及其值。
    • +
    +

    工具

      +
    • pprof: 存取 pprof 工具,用於剖析和除錯 Milvus。

    • +
    • Milvus 資料可視化工具:存取 Milvus 資料視覺化工具,以視覺化 Milvus 中的資料。

    • +
    diff --git a/tools/cache.json b/tools/cache.json index c70a8a9db..72f9c6e8f 100644 --- a/tools/cache.json +++ b/tools/cache.json @@ -953,322 +953,317 @@ "v2.0.x/site/en/userGuide/user_guide.md": "2024-08-28T10:40:49.720Z" }, "v2.5.x": { - "v2.5.x/site/en/about/comparison.md": "2024-11-27T07:19:32.249Z", - "v2.5.x/site/en/about/limitations.md": "2025-01-13T08:44:51.334Z", - "v2.5.x/site/en/about/milvus_adopters.md": "2024-11-27T07:19:34.500Z", - "v2.5.x/site/en/about/overview.md": "2024-12-09T08:38:04.093Z", - "v2.5.x/site/en/about/roadmap.md": "2024-11-27T07:19:37.460Z", - "v2.5.x/site/en/adminGuide/allocate.md": "2024-11-27T07:19:38.598Z", - "v2.5.x/site/en/adminGuide/authenticate.md": "2024-12-30T08:28:50.678Z", - "v2.5.x/site/en/adminGuide/chunk_cache.md": "2024-11-27T07:19:40.751Z", - "v2.5.x/site/en/adminGuide/clouds/aws/aws.md": "2024-11-27T07:19:42.061Z", - "v2.5.x/site/en/adminGuide/clouds/aws/aws_layer7.md": "2024-11-27T07:19:43.092Z", - "v2.5.x/site/en/adminGuide/clouds/aws/eks.md": "2024-11-27T07:19:44.734Z", - "v2.5.x/site/en/adminGuide/clouds/aws/s3.md": "2024-11-27T07:19:45.828Z", - "v2.5.x/site/en/adminGuide/clouds/azure/abs.md": "2024-11-27T07:19:46.756Z", - "v2.5.x/site/en/adminGuide/clouds/azure/azure.md": "2024-11-27T07:19:47.918Z", - "v2.5.x/site/en/adminGuide/clouds/azure/ingress.md": "2024-11-27T07:19:48.841Z", - "v2.5.x/site/en/adminGuide/clouds/gcp/gcp.md": "2024-11-27T07:19:49.962Z", - "v2.5.x/site/en/adminGuide/clouds/gcp/gcp_layer7.md": "2024-11-27T07:19:51.396Z", - "v2.5.x/site/en/adminGuide/clouds/gcp/gcs.md": "2024-11-27T07:19:52.521Z", - "v2.5.x/site/en/adminGuide/clouds/openshift/openshift.md": "2024-11-27T07:19:53.649Z", - "v2.5.x/site/en/adminGuide/config_jaeger_tracing.md": "2024-12-23T12:34:27.562Z", - "v2.5.x/site/en/adminGuide/configure-docker.md": "2025-01-06T02:36:56.419Z", - "v2.5.x/site/en/adminGuide/configure-helm.md": "2024-11-27T07:19:56.880Z", - "v2.5.x/site/en/adminGuide/configure-querynode-localdisk.md": "2024-11-27T07:19:58.215Z", - "v2.5.x/site/en/adminGuide/configure_access_logs.md": "2024-11-27T07:19:59.376Z", - "v2.5.x/site/en/adminGuide/configure_operator.md": "2024-11-27T07:20:00.917Z", - "v2.5.x/site/en/adminGuide/connect_kafka_ssl.md": "2024-12-06T07:01:01.832Z", - "v2.5.x/site/en/adminGuide/deploy_etcd.md": "2024-11-27T07:20:03.496Z", - "v2.5.x/site/en/adminGuide/deploy_pulsar.md": "2024-11-27T07:20:04.812Z", - "v2.5.x/site/en/adminGuide/deploy_s3.md": "2024-11-27T07:20:05.931Z", - "v2.5.x/site/en/adminGuide/dynamic_config.md": "2024-11-27T07:20:07.173Z", - "v2.5.x/site/en/adminGuide/limit_collection_counts.md": "2025-01-13T08:44:55.891Z", - "v2.5.x/site/en/adminGuide/message_storage_operator.md": "2024-11-27T07:20:09.631Z", - "v2.5.x/site/en/adminGuide/meta_storage_operator.md": "2024-11-27T07:20:10.651Z", - "v2.5.x/site/en/adminGuide/monitor/alert.md": "2024-11-27T07:20:11.783Z", - "v2.5.x/site/en/adminGuide/monitor/configure_grafana_loki.md": "2024-11-27T07:20:13.005Z", - "v2.5.x/site/en/adminGuide/monitor/metrics_dashboard.md": "2024-11-27T07:20:15.969Z", - "v2.5.x/site/en/adminGuide/monitor/monitor.md": "2024-11-27T07:20:17.297Z", - "v2.5.x/site/en/adminGuide/monitor/monitor_overview.md": "2024-11-27T07:20:18.633Z", - "v2.5.x/site/en/adminGuide/monitor/visualize.md": "2024-12-23T08:31:33.647Z", - "v2.5.x/site/en/adminGuide/object_storage_operator.md": "2024-11-27T07:20:21.093Z", - "v2.5.x/site/en/adminGuide/rbac.md": "2024-12-23T12:35:29.912Z", - "v2.5.x/site/en/adminGuide/resource_group.md": "2025-01-06T02:37:06.249Z", - "v2.5.x/site/en/adminGuide/scale-dependencies.md": "2024-11-27T07:20:24.930Z", - "v2.5.x/site/en/adminGuide/scaleout.md": "2024-11-27T07:20:26.060Z", - "v2.5.x/site/en/adminGuide/tls.md": "2024-12-06T07:01:08.720Z", - "v2.5.x/site/en/adminGuide/upgrade-pulsar-v3.md": "2024-12-12T07:25:53.073Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-docker.md": "2025-01-06T02:37:12.238Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-helm.md": "2025-01-06T02:37:23.293Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-operator.md": "2025-01-06T02:37:32.119Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-docker.md": "2025-01-06T02:37:38.674Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-helm.md": "2025-01-06T02:37:50.108Z", - "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-operator.md": "2025-01-06T02:37:58.130Z", - "v2.5.x/site/en/embeddings/embed-with-bgm-m3.md": "2024-11-27T07:20:37.834Z", - "v2.5.x/site/en/embeddings/embed-with-bm25.md": "2024-11-27T07:20:38.944Z", - "v2.5.x/site/en/embeddings/embed-with-cohere.md": "2024-11-27T07:20:39.962Z", - "v2.5.x/site/en/embeddings/embed-with-instructor.md": "2024-11-27T07:20:40.981Z", - "v2.5.x/site/en/embeddings/embed-with-jina.md": "2024-11-27T07:20:42.229Z", - "v2.5.x/site/en/embeddings/embed-with-mgte.md": "2024-11-27T07:20:43.359Z", - "v2.5.x/site/en/embeddings/embed-with-mistral-ai.md": "2024-11-27T07:20:44.409Z", - "v2.5.x/site/en/embeddings/embed-with-nomic.md": "2024-11-27T07:20:45.443Z", - "v2.5.x/site/en/embeddings/embed-with-openai.md": "2024-11-27T07:20:46.388Z", - "v2.5.x/site/en/embeddings/embed-with-sentence-transform.md": "2024-11-27T07:20:47.408Z", - "v2.5.x/site/en/embeddings/embed-with-splade.md": "2024-11-27T07:20:48.537Z", - "v2.5.x/site/en/embeddings/embed-with-voyage.md": "2024-11-27T07:20:49.525Z", - "v2.5.x/site/en/embeddings/embeddings.md": "2024-12-09T08:38:12.574Z", - "v2.5.x/site/en/faq/operational_faq.md": "2024-12-04T07:57:00.509Z", - "v2.5.x/site/en/faq/performance_faq.md": "2024-12-04T07:57:07.822Z", - "v2.5.x/site/en/faq/product_faq.md": "2024-12-04T07:57:20.827Z", - "v2.5.x/site/en/faq/troubleshooting.md": "2024-11-27T07:20:56.202Z", - "v2.5.x/site/en/getstarted/install-overview.md": "2024-11-27T07:20:57.551Z", - "v2.5.x/site/en/getstarted/install_SDKs/install-go.md": "2024-11-27T07:20:58.414Z", - "v2.5.x/site/en/getstarted/install_SDKs/install-java.md": "2025-01-06T02:38:03.006Z", - "v2.5.x/site/en/getstarted/install_SDKs/install-node.md": "2024-12-30T08:28:55.028Z", - "v2.5.x/site/en/getstarted/install_SDKs/install-pymilvus.md": "2025-01-06T02:38:09.086Z", - "v2.5.x/site/en/getstarted/milvus_lite.md": "2024-11-27T07:21:02.835Z", - "v2.5.x/site/en/getstarted/quickstart.md": "2024-11-27T07:21:04.185Z", - "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-docker-compose.md": "2025-01-06T02:38:15.767Z", - "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-docker.md": "2025-01-02T06:32:01.644Z", - "v2.5.x/site/en/getstarted/run-milvus-docker/prerequisite-docker.md": "2024-11-27T07:21:07.882Z", - "v2.5.x/site/en/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md": "2025-01-02T06:32:17.750Z", - "v2.5.x/site/en/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md": "2025-01-06T02:38:24.189Z", - "v2.5.x/site/en/getstarted/run-milvus-gpu/prerequisite-gpu.md": "2024-11-27T07:21:11.779Z", - "v2.5.x/site/en/getstarted/run-milvus-k8s/install_cluster-helm.md": "2025-01-02T06:32:33.830Z", - "v2.5.x/site/en/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md": "2025-01-02T06:32:43.118Z", - "v2.5.x/site/en/getstarted/run-milvus-k8s/prerequisite-helm.md": "2024-11-27T07:21:15.932Z", - "v2.5.x/site/en/home/home.md": "2024-12-27T10:49:45.031Z", - "v2.5.x/site/en/integrations/RAG_with_pii_and_milvus.md": "2024-11-27T07:21:17.720Z", - "v2.5.x/site/en/integrations/apify_milvus_rag.md": "2024-11-27T07:21:19.761Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_fireworks.md": "2024-11-27T07:21:21.144Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_lepton.md": "2024-11-27T07:21:22.606Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_siliconflow.md": "2024-11-27T07:21:23.843Z", - "v2.5.x/site/en/integrations/build_rag_on_arm.md": "2024-11-27T07:21:25.498Z", - "v2.5.x/site/en/integrations/dify_with_milvus.md": "2024-12-06T07:01:46.416Z", - "v2.5.x/site/en/integrations/evaluation_with_deepeval.md": "2024-11-27T07:21:28.170Z", - "v2.5.x/site/en/integrations/evaluation_with_phoenix.md": "2024-11-27T07:21:30.010Z", - "v2.5.x/site/en/integrations/integrate_with_airbyte.md": "2024-11-27T07:21:31.954Z", - "v2.5.x/site/en/integrations/integrate_with_bentoml.md": "2024-11-27T07:21:33.504Z", - "v2.5.x/site/en/integrations/integrate_with_camel.md": "2025-01-13T09:35:30.509Z", - "v2.5.x/site/en/integrations/integrate_with_cohere.md": "2024-11-27T07:21:36.528Z", - "v2.5.x/site/en/integrations/integrate_with_dspy.md": "2024-11-27T07:21:37.982Z", - "v2.5.x/site/en/integrations/integrate_with_fastgpt.md": "2024-12-06T07:01:52.081Z", - "v2.5.x/site/en/integrations/integrate_with_haystack.md": "2024-11-27T07:21:40.352Z", - "v2.5.x/site/en/integrations/integrate_with_hugging-face.md": "2024-11-27T07:21:41.591Z", - "v2.5.x/site/en/integrations/integrate_with_jina.md": "2024-11-27T07:21:42.956Z", - "v2.5.x/site/en/integrations/integrate_with_langfuse.md": "2025-01-13T09:35:37.898Z", - "v2.5.x/site/en/integrations/integrate_with_llamaindex.md": "2024-11-27T07:21:45.156Z", - "v2.5.x/site/en/integrations/integrate_with_memgpt.md": "2024-11-27T07:21:46.418Z", - "v2.5.x/site/en/integrations/integrate_with_openai.md": "2024-11-27T07:21:47.509Z", - "v2.5.x/site/en/integrations/integrate_with_pytorch.md": "2025-01-13T08:45:03.010Z", - "v2.5.x/site/en/integrations/integrate_with_ragas.md": "2024-11-27T07:21:50.056Z", - "v2.5.x/site/en/integrations/integrate_with_sentencetransformers.md": "2024-11-27T07:21:51.221Z", - "v2.5.x/site/en/integrations/integrate_with_snowpark.md": "2024-11-27T07:21:52.452Z", - "v2.5.x/site/en/integrations/integrate_with_spark.md": "2024-11-27T07:21:54.333Z", - "v2.5.x/site/en/integrations/integrate_with_vanna.md": "2024-11-27T07:21:55.476Z", - "v2.5.x/site/en/integrations/integrate_with_voxel51.md": "2024-11-27T07:21:56.838Z", - "v2.5.x/site/en/integrations/integrate_with_voyageai.md": "2024-11-27T07:21:58.072Z", - "v2.5.x/site/en/integrations/integrate_with_whyhow.md": "2024-11-27T07:21:59.328Z", - "v2.5.x/site/en/integrations/integrations_overview.md": "2025-01-13T09:35:47.617Z", - "v2.5.x/site/en/integrations/kafka-connect-milvus.md": "2024-11-27T07:22:01.345Z", - "v2.5.x/site/en/integrations/knowledge_table_with_milvus.md": "2024-12-06T07:02:03.766Z", - "v2.5.x/site/en/integrations/kotaemon_with_milvus.md": "2024-11-27T07:22:03.759Z", - "v2.5.x/site/en/integrations/langchain/basic_usage_langchain.md": "2024-11-27T07:22:04.994Z", - "v2.5.x/site/en/integrations/langchain/integrate_with_langchain.md": "2024-11-27T07:22:06.309Z", - "v2.5.x/site/en/integrations/langchain/milvus_hybrid_search_retriever.md": "2024-11-27T07:22:07.524Z", - "v2.5.x/site/en/integrations/llama_agents_metadata.md": "2024-11-27T07:22:09.811Z", - "v2.5.x/site/en/integrations/milvus_rag_with_vllm.md": "2024-11-27T07:22:11.584Z", - "v2.5.x/site/en/integrations/quickstart_mem0_with_milvus.md": "2024-11-27T07:22:12.926Z", - "v2.5.x/site/en/integrations/rag_with_langflow.md": "2024-11-27T07:22:14.348Z", - "v2.5.x/site/en/integrations/rag_with_milvus_and_unstructured.md": "2024-11-27T07:22:15.882Z", - "v2.5.x/site/en/integrations/use_milvus_in_docsgpt.md": "2024-12-06T07:02:17.948Z", - "v2.5.x/site/en/integrations/use_milvus_in_private_gpt.md": "2024-11-27T07:22:18.351Z", - "v2.5.x/site/en/integrations/use_milvus_with_sambanova.md": "2024-11-27T07:22:19.519Z", - "v2.5.x/site/en/integrations/video_search_with_twelvelabs_and_milvus.md": "2024-11-27T07:22:21.750Z", - "v2.5.x/site/en/migrate/es2m.md": "2024-11-27T07:22:23.099Z", - "v2.5.x/site/en/migrate/f2m.md": "2024-11-27T07:22:24.235Z", - "v2.5.x/site/en/migrate/from-m2x.md": "2024-11-27T07:22:25.380Z", - "v2.5.x/site/en/migrate/m2m.md": "2024-11-27T07:22:26.727Z", - "v2.5.x/site/en/migrate/migrate_overview.md": "2024-11-27T07:22:27.974Z", - "v2.5.x/site/en/migrate/milvusdm_install.md": "2024-11-27T07:22:28.936Z", - "v2.5.x/site/en/reference/architecture/architecture_overview.md": "2024-11-27T07:22:30.115Z", - "v2.5.x/site/en/reference/architecture/data_processing.md": "2024-11-27T07:22:31.355Z", - "v2.5.x/site/en/reference/architecture/four_layers.md": "2024-11-27T07:22:32.678Z", - "v2.5.x/site/en/reference/architecture/main_components.md": "2024-11-27T07:22:33.696Z", - "v2.5.x/site/en/reference/benchmark.md": "2024-11-27T07:22:35.023Z", - "v2.5.x/site/en/reference/bitset.md": "2024-11-27T07:22:36.431Z", - "v2.5.x/site/en/reference/coordinator_ha.md": "2024-11-27T07:22:37.695Z", - "v2.5.x/site/en/reference/disk_index.md": "2024-11-27T07:22:38.790Z", - "v2.5.x/site/en/reference/glossary.md": "2024-11-27T07:22:41.283Z", - "v2.5.x/site/en/reference/gpu_index.md": "2024-12-16T08:33:11.320Z", - "v2.5.x/site/en/reference/index.md": "2025-01-06T08:30:04.732Z", - "v2.5.x/site/en/reference/knowhere.md": "2024-11-27T07:22:46.477Z", - "v2.5.x/site/en/reference/multi_tenancy.md": "2024-12-30T08:29:34.589Z", - "v2.5.x/site/en/reference/replica.md": "2024-11-27T07:22:48.851Z", - "v2.5.x/site/en/reference/scalar_index.md": "2024-12-04T07:57:55.974Z", - "v2.5.x/site/en/reference/schema.md": "2024-12-04T07:58:05.230Z", - "v2.5.x/site/en/reference/sys_config/configure_common.md": "2024-11-27T07:22:52.950Z", - "v2.5.x/site/en/reference/sys_config/configure_datacoord.md": "2024-11-27T07:22:56.222Z", - "v2.5.x/site/en/reference/sys_config/configure_datanode.md": "2024-11-27T07:22:57.908Z", - "v2.5.x/site/en/reference/sys_config/configure_etcd.md": "2024-11-27T07:22:59.191Z", - "v2.5.x/site/en/reference/sys_config/configure_gpu.md": "2024-11-27T07:23:00.117Z", - "v2.5.x/site/en/reference/sys_config/configure_grpc.md": "2024-11-27T07:23:00.942Z", - "v2.5.x/site/en/reference/sys_config/configure_indexcoord.md": "2024-11-27T07:23:01.867Z", - "v2.5.x/site/en/reference/sys_config/configure_indexnode.md": "2024-11-27T07:23:02.786Z", - "v2.5.x/site/en/reference/sys_config/configure_localstorage.md": "2024-11-27T07:23:03.703Z", - "v2.5.x/site/en/reference/sys_config/configure_log.md": "2024-11-27T07:23:04.829Z", - "v2.5.x/site/en/reference/sys_config/configure_metastore.md": "2024-11-27T07:23:05.752Z", - "v2.5.x/site/en/reference/sys_config/configure_minio.md": "2024-11-27T07:23:07.287Z", - "v2.5.x/site/en/reference/sys_config/configure_mq.md": "2024-11-27T07:23:08.308Z", - "v2.5.x/site/en/reference/sys_config/configure_msgchannel.md": "2024-11-27T07:23:09.460Z", - "v2.5.x/site/en/reference/sys_config/configure_natsmq.md": "2024-11-27T07:23:10.497Z", - "v2.5.x/site/en/reference/sys_config/configure_proxy.md": "2024-11-27T07:23:12.335Z", - "v2.5.x/site/en/reference/sys_config/configure_pulsar.md": "2024-11-27T07:23:13.329Z", - "v2.5.x/site/en/reference/sys_config/configure_querycoord.md": "2024-11-27T07:23:15.485Z", - "v2.5.x/site/en/reference/sys_config/configure_querynode.md": "2024-11-27T07:23:17.531Z", - "v2.5.x/site/en/reference/sys_config/configure_quotaandlimits.md": "2024-11-27T07:23:21.423Z", - "v2.5.x/site/en/reference/sys_config/configure_rocksmq.md": "2024-11-27T07:23:22.448Z", - "v2.5.x/site/en/reference/sys_config/configure_rootcoord.md": "2024-11-27T07:23:23.574Z", - "v2.5.x/site/en/reference/sys_config/configure_tikv.md": "2024-11-27T07:23:24.603Z", - "v2.5.x/site/en/reference/sys_config/configure_tls.md": "2024-11-27T07:23:25.410Z", - "v2.5.x/site/en/reference/sys_config/configure_trace.md": "2024-11-27T07:23:26.743Z", - "v2.5.x/site/en/reference/sys_config/system_configuration.md": "2024-11-27T07:23:29.376Z", - "v2.5.x/site/en/reference/time_sync.md": "2024-12-30T08:29:55.705Z", - "v2.5.x/site/en/reference/timestamp.md": "2024-11-27T07:23:31.970Z", - "v2.5.x/site/en/reference/users_and_roles.md": "2024-11-27T07:23:33.399Z", - "v2.5.x/site/en/release_notes.md": "2025-01-06T02:38:37.844Z", - "v2.5.x/site/en/rerankers/rerankers-bge.md": "2024-11-27T07:23:35.658Z", - "v2.5.x/site/en/rerankers/rerankers-cohere.md": "2024-11-27T07:23:36.671Z", - "v2.5.x/site/en/rerankers/rerankers-cross-encoder.md": "2024-11-27T07:23:37.640Z", - "v2.5.x/site/en/rerankers/rerankers-jina.md": "2024-11-27T07:23:38.623Z", - "v2.5.x/site/en/rerankers/rerankers-overview.md": "2024-11-27T07:23:40.051Z", - "v2.5.x/site/en/rerankers/rerankers-voyage.md": "2024-11-27T07:23:41.084Z", - "v2.5.x/site/en/tutorials/audio_similarity_search.md": "2024-11-27T07:23:42.101Z", - "v2.5.x/site/en/tutorials/build-rag-with-milvus.md": "2024-11-27T07:23:43.219Z", - "v2.5.x/site/en/tutorials/contextual_retrieval_with_milvus.md": "2024-11-27T07:23:45.095Z", - "v2.5.x/site/en/tutorials/dna_sequence_classification.md": "2024-11-27T07:23:46.095Z", - "v2.5.x/site/en/tutorials/funnel_search_with_matryoshka.md": "2024-11-27T07:23:48.041Z", - "v2.5.x/site/en/tutorials/graph_rag_with_milvus.md": "2024-11-27T07:23:49.687Z", - "v2.5.x/site/en/tutorials/hdbscan_clustering_with_milvus.md": "2024-11-27T07:23:51.422Z", - "v2.5.x/site/en/tutorials/hybrid_search_with_milvus.md": "2024-11-28T09:47:02.587Z", - "v2.5.x/site/en/tutorials/image_deduplication_system.md": "2024-11-27T07:23:53.533Z", - "v2.5.x/site/en/tutorials/image_similarity_search.md": "2024-11-27T07:23:54.589Z", - "v2.5.x/site/en/tutorials/movie_recommendation_with_milvus.md": "2024-11-27T07:23:55.933Z", - "v2.5.x/site/en/tutorials/multimodal_rag_with_milvus.md": "2024-11-27T07:23:57.259Z", - "v2.5.x/site/en/tutorials/question_answering_system.md": "2024-11-27T07:23:58.253Z", - "v2.5.x/site/en/tutorials/recommendation_system.md": "2024-11-27T07:23:59.208Z", - "v2.5.x/site/en/tutorials/text_image_search.md": "2024-11-27T07:24:00.232Z", - "v2.5.x/site/en/tutorials/text_search_engine.md": "2024-11-27T07:24:01.460Z", - "v2.5.x/site/en/tutorials/tutorials-overview.md": "2025-01-13T09:36:02.994Z", - "v2.5.x/site/en/tutorials/use_ColPali_with_milvus.md": "2024-12-06T07:21:09.184Z", - "v2.5.x/site/en/tutorials/vector_visualization.md": "2024-11-27T07:24:05.450Z", - "v2.5.x/site/en/tutorials/video_similarity_search.md": "2024-11-27T07:24:06.574Z", - "v2.5.x/site/en/userGuide/collections/create-collection-instantly.md": "2024-11-27T07:24:07.802Z", - "v2.5.x/site/en/userGuide/collections/create-collection.md": "2024-12-27T10:50:47.225Z", - "v2.5.x/site/en/userGuide/collections/drop-collection.md": "2024-11-27T07:24:10.355Z", - "v2.5.x/site/en/userGuide/collections/load-and-release.md": "2024-11-27T07:24:11.497Z", - "v2.5.x/site/en/userGuide/collections/manage-aliases.md": "2024-11-27T07:24:12.727Z", - "v2.5.x/site/en/userGuide/collections/manage-collections.md": "2024-11-28T09:47:14.183Z", - "v2.5.x/site/en/userGuide/collections/manage-partitions.md": "2024-11-27T07:24:15.489Z", - "v2.5.x/site/en/userGuide/collections/modify-collection.md": "2024-12-23T12:37:27.068Z", - "v2.5.x/site/en/userGuide/collections/view-collections.md": "2024-11-27T07:24:17.532Z", - "v2.5.x/site/en/userGuide/data-import/import-data.md": "2024-11-27T07:24:18.744Z", - "v2.5.x/site/en/userGuide/data-import/prepare-source-data.md": "2024-11-27T07:24:20.511Z", - "v2.5.x/site/en/userGuide/insert-and-delete/delete-entities.md": "2024-11-27T07:24:21.731Z", - "v2.5.x/site/en/userGuide/insert-and-delete/insert-update-delete.md": "2024-11-27T07:24:23.062Z", - "v2.5.x/site/en/userGuide/insert-and-delete/upsert-entities.md": "2024-11-27T07:24:24.272Z", - "v2.5.x/site/en/userGuide/manage-indexes/bitmap.md": "2024-11-27T07:24:25.526Z", - "v2.5.x/site/en/userGuide/manage-indexes/index-scalar-fields.md": "2024-11-27T07:24:26.954Z", - "v2.5.x/site/en/userGuide/manage-indexes/index-vector-fields.md": "2024-11-27T07:24:28.595Z", - "v2.5.x/site/en/userGuide/manage-indexes/index-with-gpu.md": "2024-11-28T09:47:26.276Z", - "v2.5.x/site/en/userGuide/manage_databases.md": "2024-11-27T07:24:31.263Z", - "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/chinese-analyzer.md": "2024-11-27T07:24:32.248Z", - "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/english-analyzer.md": "2024-11-27T07:24:33.402Z", - "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/standard-analyzer.md": "2024-11-27T07:24:34.493Z", - "v2.5.x/site/en/userGuide/schema/analyzer/analyzer-overview.md": "2024-12-04T07:58:28.903Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/alphanumonly-filter.md": "2024-11-27T07:24:36.996Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/ascii-folding-filter.md": "2024-11-27T07:24:38.011Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md": "2024-11-27T07:24:39.038Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/cncharonly-filter.md": "2024-11-27T07:24:40.271Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/decompounder-filter.md": "2024-11-27T07:24:41.499Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/length-filter.md": "2024-11-27T07:24:42.452Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/lowercase-filter.md": "2024-11-27T07:24:43.543Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/stemmer-filter.md": "2024-11-27T07:24:44.644Z", - "v2.5.x/site/en/userGuide/schema/analyzer/filter/stop-filter.md": "2024-11-27T07:24:45.796Z", - "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md": "2024-11-27T07:24:46.815Z", - "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md": "2024-11-27T07:24:47.841Z", - "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md": "2024-11-27T07:24:48.748Z", - "v2.5.x/site/en/userGuide/schema/array_data_type.md": "2024-11-27T07:24:50.599Z", - "v2.5.x/site/en/userGuide/schema/binary-vector.md": "2024-11-27T07:24:52.052Z", - "v2.5.x/site/en/userGuide/schema/dense-vector.md": "2024-11-27T07:24:53.589Z", - "v2.5.x/site/en/userGuide/schema/enable-dynamic-field.md": "2024-11-27T07:24:55.064Z", - "v2.5.x/site/en/userGuide/schema/nullable-and-default.md": "2024-11-27T07:24:56.977Z", - "v2.5.x/site/en/userGuide/schema/number.md": "2024-11-27T07:24:58.499Z", - "v2.5.x/site/en/userGuide/schema/primary-field.md": "2024-11-27T07:24:59.639Z", - "v2.5.x/site/en/userGuide/schema/schema-hands-on.md": "2024-11-27T07:25:02.048Z", - "v2.5.x/site/en/userGuide/schema/schema.md": "2024-11-27T07:25:03.727Z", - "v2.5.x/site/en/userGuide/schema/sparse_vector.md": "2024-12-30T08:30:08.730Z", - "v2.5.x/site/en/userGuide/schema/string.md": "2024-12-23T12:37:43.267Z", - "v2.5.x/site/en/userGuide/schema/use-json-fields.md": "2024-11-27T07:25:08.435Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean.md": "2024-12-06T07:02:49.486Z", - "v2.5.x/site/en/userGuide/search-query-get/clustering-compaction.md": "2024-11-27T07:25:11.309Z", - "v2.5.x/site/en/userGuide/search-query-get/consistency.md": "2024-12-27T10:50:56.015Z", - "v2.5.x/site/en/userGuide/search-query-get/filtered-search.md": "2024-11-27T07:25:13.813Z", - "v2.5.x/site/en/userGuide/search-query-get/full-text-search.md": "2025-01-13T09:36:24.833Z", - "v2.5.x/site/en/userGuide/search-query-get/get-and-scalar-query.md": "2024-11-27T07:25:16.835Z", - "v2.5.x/site/en/userGuide/search-query-get/grouping-search.md": "2024-11-27T07:25:18.446Z", - "v2.5.x/site/en/userGuide/search-query-get/keyword-match.md": "2024-12-23T08:31:58.961Z", - "v2.5.x/site/en/userGuide/search-query-get/metric.md": "2024-12-04T07:58:53.063Z", - "v2.5.x/site/en/userGuide/search-query-get/mmap.md": "2024-11-27T07:25:22.770Z", - "v2.5.x/site/en/userGuide/search-query-get/multi-vector-search.md": "2024-11-28T09:48:45.103Z", - "v2.5.x/site/en/userGuide/search-query-get/range-search.md": "2024-11-27T07:25:25.809Z", - "v2.5.x/site/en/userGuide/search-query-get/reranking.md": "2024-11-27T07:25:27.331Z", - "v2.5.x/site/en/userGuide/search-query-get/single-vector-search.md": "2024-12-02T08:32:43.156Z", - "v2.5.x/site/en/userGuide/search-query-get/use-partition-key.md": "2024-11-27T07:25:30.235Z", - "v2.5.x/site/en/userGuide/search-query-get/with-iterators.md": "2024-11-27T07:25:31.386Z", - "v2.5.x/site/en/userGuide/tools/birdwatcher_install_guides.md": "2024-11-27T07:25:32.349Z", - "v2.5.x/site/en/userGuide/tools/birdwatcher_overview.md": "2024-11-27T07:25:33.412Z", - "v2.5.x/site/en/userGuide/tools/birdwatcher_usage_guides.md": "2024-11-27T07:25:34.652Z", - "v2.5.x/site/en/userGuide/tools/cli_commands.md": "2024-12-23T08:32:33.532Z", - "v2.5.x/site/en/userGuide/tools/cli_overview.md": "2024-12-23T08:32:40.082Z", - "v2.5.x/site/en/userGuide/tools/install_cli.md": "2024-11-27T07:25:40.079Z", - "v2.5.x/site/en/userGuide/tools/milvus-cdc/cdc-monitoring.md": "2024-11-27T07:25:41.195Z", - "v2.5.x/site/en/userGuide/tools/milvus-cdc/deploy-cdc-server.md": "2024-12-06T07:03:04.044Z", - "v2.5.x/site/en/userGuide/tools/milvus-cdc/manage-cdc-tasks.md": "2024-11-27T07:25:43.549Z", - "v2.5.x/site/en/userGuide/tools/milvus-cdc/milvus-cdc-overview.md": "2024-11-27T07:25:45.094Z", - "v2.5.x/site/en/userGuide/tools/milvus_backup_api.md": "2024-11-27T07:25:46.624Z", - "v2.5.x/site/en/userGuide/tools/milvus_backup_cli.md": "2024-11-27T07:25:47.846Z", - "v2.5.x/site/en/userGuide/tools/milvus_backup_overview.md": "2024-11-27T07:25:49.181Z", - "v2.5.x/site/en/menuStructure/en.json": "2025-01-13T09:45:14.748Z", - "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-windows.md": "2025-01-13T09:35:09.971Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_cognee.md": "2024-12-06T07:01:27.204Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_gemini.md": "2024-12-06T07:01:34.066Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_ollama.md": "2024-12-06T07:01:41.084Z", - "v2.5.x/site/en/integrations/milvus_rag_with_dynamiq.md": "2024-12-06T07:02:12.036Z", - "v2.5.x/site/en/tutorials/full_text_search_with_milvus.md": "2024-12-06T07:02:31.417Z", - "v2.5.x/site/en/adminGuide/use-pulsar-v2.md": "2024-12-16T08:33:00.666Z", - "v2.5.x/site/en/adminGuide/drop_users_roles.md": "2024-12-23T12:34:42.029Z", - "v2.5.x/site/en/adminGuide/grant_privileges.md": "2024-12-23T12:34:56.099Z", - "v2.5.x/site/en/adminGuide/grant_roles.md": "2024-12-23T12:35:05.664Z", - "v2.5.x/site/en/adminGuide/privilege_group.md": "2024-12-23T12:35:20.656Z", - "v2.5.x/site/en/adminGuide/users_and_roles.md": "2024-12-23T12:36:45.945Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean/array-operators.md": "2024-12-23T12:37:57.958Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean/basic-operators.md": "2024-12-23T12:38:11.965Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean/boolean.md": "2025-01-13T08:45:11.924Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean/filtering-templating.md": "2024-12-23T12:38:32.738Z", - "v2.5.x/site/en/userGuide/search-query-get/boolean/json-operators.md": "2024-12-23T12:38:40.070Z", - "v2.5.x/site/en/userGuide/tools/milvus-webui.md": "2025-01-02T06:32:58.819Z", - "v2.5.x/site/en/tutorials/how_to_enhance_your_rag.md": "2024-12-27T10:50:32.785Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md": "2025-01-06T02:38:45.720Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md": "2025-01-06T02:38:54.494Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md": "2025-01-06T02:39:02.764Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md": "2025-01-06T02:39:09.165Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_api.md": "2025-01-06T02:39:19.228Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_cli.md": "2025-01-06T02:39:27.044Z", - "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_overview.md": "2025-01-06T02:39:32.980Z", - "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_deepseek.md": "2025-01-13T09:35:20.598Z", - "v2.5.x/site/en/tutorials/quickstart_with_attu.md": "2025-01-13T09:35:57.170Z", - "v2.5.x/site/en/tutorials/use-async-milvus-client-with-asyncio.md": "2025-01-13T09:36:12.161Z" + "v2.5.x/site/en/about/comparison.md": "2025-01-14T08:40:18.574Z", + "v2.5.x/site/en/about/limitations.md": "2025-01-14T08:40:19.897Z", + "v2.5.x/site/en/about/milvus_adopters.md": "2025-01-14T08:40:20.649Z", + "v2.5.x/site/en/about/overview.md": "2025-01-14T08:40:22.520Z", + "v2.5.x/site/en/about/roadmap.md": "2025-01-14T08:40:23.851Z", + "v2.5.x/site/en/menuStructure/en.json": "2025-01-14T08:42:31.729Z", + "v2.5.x/site/en/adminGuide/allocate.md": "2025-01-14T08:43:02.166Z", + "v2.5.x/site/en/adminGuide/authenticate.md": "2025-01-14T08:43:03.251Z", + "v2.5.x/site/en/adminGuide/chunk_cache.md": "2025-01-14T08:43:04.262Z", + "v2.5.x/site/en/adminGuide/clouds/aws/aws.md": "2025-01-14T08:43:05.644Z", + "v2.5.x/site/en/adminGuide/clouds/aws/aws_layer7.md": "2025-01-14T08:43:06.810Z", + "v2.5.x/site/en/adminGuide/clouds/aws/eks.md": "2025-01-14T08:43:08.202Z", + "v2.5.x/site/en/adminGuide/clouds/aws/s3.md": "2025-01-14T08:43:09.329Z", + "v2.5.x/site/en/adminGuide/clouds/azure/abs.md": "2025-01-14T08:43:10.344Z", + "v2.5.x/site/en/adminGuide/clouds/azure/azure.md": "2025-01-14T08:43:11.538Z", + "v2.5.x/site/en/adminGuide/clouds/azure/ingress.md": "2025-01-14T08:43:12.489Z", + "v2.5.x/site/en/adminGuide/clouds/gcp/gcp.md": "2025-01-14T08:43:13.633Z", + "v2.5.x/site/en/adminGuide/clouds/gcp/gcp_layer7.md": "2025-01-14T08:43:14.764Z", + "v2.5.x/site/en/adminGuide/clouds/gcp/gcs.md": "2025-01-14T08:43:15.728Z", + "v2.5.x/site/en/adminGuide/clouds/openshift/openshift.md": "2025-01-14T08:43:16.802Z", + "v2.5.x/site/en/adminGuide/config_jaeger_tracing.md": "2025-01-14T08:43:17.934Z", + "v2.5.x/site/en/adminGuide/configure-docker.md": "2025-01-14T08:43:18.933Z", + "v2.5.x/site/en/adminGuide/configure-helm.md": "2025-01-14T08:43:19.952Z", + "v2.5.x/site/en/adminGuide/configure-querynode-localdisk.md": "2025-01-14T08:43:21.513Z", + "v2.5.x/site/en/adminGuide/configure_access_logs.md": "2025-01-14T08:43:23.157Z", + "v2.5.x/site/en/adminGuide/configure_operator.md": "2025-01-14T08:43:24.681Z", + "v2.5.x/site/en/adminGuide/connect_kafka_ssl.md": "2025-01-14T08:43:26.248Z", + "v2.5.x/site/en/adminGuide/deploy_etcd.md": "2025-01-14T08:43:27.450Z", + "v2.5.x/site/en/adminGuide/deploy_pulsar.md": "2025-01-14T08:43:28.996Z", + "v2.5.x/site/en/adminGuide/deploy_s3.md": "2025-01-14T08:43:30.243Z", + "v2.5.x/site/en/adminGuide/dynamic_config.md": "2025-01-14T08:43:31.853Z", + "v2.5.x/site/en/adminGuide/limit_collection_counts.md": "2025-01-14T08:43:32.888Z", + "v2.5.x/site/en/adminGuide/message_storage_operator.md": "2025-01-14T08:43:34.605Z", + "v2.5.x/site/en/adminGuide/meta_storage_operator.md": "2025-01-14T08:43:35.668Z", + "v2.5.x/site/en/adminGuide/monitor/alert.md": "2025-01-14T08:43:36.895Z", + "v2.5.x/site/en/adminGuide/monitor/configure_grafana_loki.md": "2025-01-14T08:43:38.279Z", + "v2.5.x/site/en/adminGuide/monitor/metrics_dashboard.md": "2025-01-14T08:43:42.025Z", + "v2.5.x/site/en/adminGuide/monitor/monitor.md": "2025-01-14T08:43:43.178Z", + "v2.5.x/site/en/adminGuide/monitor/monitor_overview.md": "2025-01-14T08:43:44.711Z", + "v2.5.x/site/en/adminGuide/monitor/visualize.md": "2025-01-14T08:43:45.880Z", + "v2.5.x/site/en/adminGuide/object_storage_operator.md": "2025-01-14T08:43:47.419Z", + "v2.5.x/site/en/adminGuide/rbac.md": "2025-01-14T08:43:48.751Z", + "v2.5.x/site/en/adminGuide/resource_group.md": "2025-01-14T08:43:50.700Z", + "v2.5.x/site/en/adminGuide/scale-dependencies.md": "2025-01-14T08:43:52.108Z", + "v2.5.x/site/en/adminGuide/scaleout.md": "2025-01-14T08:43:53.568Z", + "v2.5.x/site/en/adminGuide/tls.md": "2025-01-14T08:43:55.222Z", + "v2.5.x/site/en/adminGuide/upgrade-pulsar-v3.md": "2025-01-14T08:43:57.354Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-docker.md": "2025-01-14T08:43:58.554Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-helm.md": "2025-01-14T08:44:00.357Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_cluster-operator.md": "2025-01-14T08:44:01.864Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-docker.md": "2025-01-14T08:44:02.953Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-helm.md": "2025-01-14T08:44:04.486Z", + "v2.5.x/site/en/adminGuide/upgrade_milvus_standalone-operator.md": "2025-01-14T08:44:05.850Z", + "v2.5.x/site/en/embeddings/embed-with-bgm-m3.md": "2025-01-14T08:44:06.851Z", + "v2.5.x/site/en/embeddings/embed-with-bm25.md": "2025-01-14T08:44:08.008Z", + "v2.5.x/site/en/embeddings/embed-with-cohere.md": "2025-01-14T08:44:09.227Z", + "v2.5.x/site/en/embeddings/embed-with-instructor.md": "2025-01-14T08:44:10.358Z", + "v2.5.x/site/en/embeddings/embed-with-jina.md": "2025-01-14T08:44:11.476Z", + "v2.5.x/site/en/embeddings/embed-with-mgte.md": "2025-01-14T08:44:12.891Z", + "v2.5.x/site/en/embeddings/embed-with-mistral-ai.md": "2025-01-14T08:44:13.921Z", + "v2.5.x/site/en/embeddings/embed-with-nomic.md": "2025-01-14T08:44:14.969Z", + "v2.5.x/site/en/embeddings/embed-with-openai.md": "2025-01-14T08:44:16.017Z", + "v2.5.x/site/en/embeddings/embed-with-sentence-transform.md": "2025-01-14T08:44:16.958Z", + "v2.5.x/site/en/embeddings/embed-with-splade.md": "2025-01-14T08:44:18.124Z", + "v2.5.x/site/en/embeddings/embed-with-voyage.md": "2025-01-14T08:44:19.220Z", + "v2.5.x/site/en/embeddings/embeddings.md": "2025-01-14T08:44:20.606Z", + "v2.5.x/site/en/adminGuide/drop_users_roles.md": "2025-01-14T08:44:39.657Z", + "v2.5.x/site/en/adminGuide/grant_privileges.md": "2025-01-14T08:44:41.825Z", + "v2.5.x/site/en/adminGuide/grant_roles.md": "2025-01-14T08:44:42.762Z", + "v2.5.x/site/en/adminGuide/privilege_group.md": "2025-01-14T08:44:44.582Z", + "v2.5.x/site/en/adminGuide/use-pulsar-v2.md": "2025-01-14T08:44:45.713Z", + "v2.5.x/site/en/adminGuide/users_and_roles.md": "2025-01-14T08:44:46.842Z", + "v2.5.x/site/en/faq/operational_faq.md": "2025-01-14T08:44:48.201Z", + "v2.5.x/site/en/faq/performance_faq.md": "2025-01-14T08:44:49.281Z", + "v2.5.x/site/en/faq/product_faq.md": "2025-01-14T08:44:51.148Z", + "v2.5.x/site/en/faq/troubleshooting.md": "2025-01-14T08:44:52.197Z", + "v2.5.x/site/en/getstarted/install-overview.md": "2025-01-14T08:44:53.771Z", + "v2.5.x/site/en/getstarted/install_SDKs/install-go.md": "2025-01-14T08:44:54.674Z", + "v2.5.x/site/en/getstarted/install_SDKs/install-java.md": "2025-01-14T08:44:55.583Z", + "v2.5.x/site/en/getstarted/install_SDKs/install-node.md": "2025-01-14T08:44:56.626Z", + "v2.5.x/site/en/getstarted/install_SDKs/install-pymilvus.md": "2025-01-14T08:44:57.476Z", + "v2.5.x/site/en/getstarted/milvus_lite.md": "2025-01-14T08:44:59.181Z", + "v2.5.x/site/en/getstarted/quickstart.md": "2025-01-14T08:45:00.652Z", + "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-docker-compose.md": "2025-01-14T08:45:01.752Z", + "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-docker.md": "2025-01-14T08:45:02.710Z", + "v2.5.x/site/en/getstarted/run-milvus-docker/install_standalone-windows.md": "2025-01-14T08:45:04.319Z", + "v2.5.x/site/en/getstarted/run-milvus-docker/prerequisite-docker.md": "2025-01-14T08:45:05.858Z", + "v2.5.x/site/en/getstarted/run-milvus-gpu/install_cluster-helm-gpu.md": "2025-01-14T08:45:07.290Z", + "v2.5.x/site/en/getstarted/run-milvus-gpu/install_standalone-docker-compose-gpu.md": "2025-01-14T08:45:08.448Z", + "v2.5.x/site/en/getstarted/run-milvus-gpu/prerequisite-gpu.md": "2025-01-14T08:45:09.622Z", + "v2.5.x/site/en/getstarted/run-milvus-k8s/install_cluster-helm.md": "2025-01-14T08:45:11.070Z", + "v2.5.x/site/en/getstarted/run-milvus-k8s/install_cluster-milvusoperator.md": "2025-01-14T08:45:12.645Z", + "v2.5.x/site/en/getstarted/run-milvus-k8s/prerequisite-helm.md": "2025-01-14T08:45:13.763Z", + "v2.5.x/site/en/home/home.md": "2025-01-14T08:45:14.340Z", + "v2.5.x/site/en/integrations/RAG_with_pii_and_milvus.md": "2025-01-14T08:48:42.883Z", + "v2.5.x/site/en/integrations/apify_milvus_rag.md": "2025-01-14T08:48:44.593Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_cognee.md": "2025-01-14T08:48:46.028Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_deepseek.md": "2025-01-14T08:48:47.313Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_fireworks.md": "2025-01-14T08:48:48.706Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_gemini.md": "2025-01-14T08:48:50.222Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_lepton.md": "2025-01-14T08:48:51.594Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_ollama.md": "2025-01-14T08:48:52.983Z", + "v2.5.x/site/en/integrations/build_RAG_with_milvus_and_siliconflow.md": "2025-01-14T08:48:54.518Z", + "v2.5.x/site/en/integrations/build_rag_on_arm.md": "2025-01-14T08:48:56.117Z", + "v2.5.x/site/en/integrations/dify_with_milvus.md": "2025-01-14T08:48:57.330Z", + "v2.5.x/site/en/integrations/evaluation_with_deepeval.md": "2025-01-14T08:48:59.379Z", + "v2.5.x/site/en/integrations/evaluation_with_phoenix.md": "2025-01-14T08:49:01.558Z", + "v2.5.x/site/en/integrations/integrate_with_airbyte.md": "2025-01-14T08:49:04.090Z", + "v2.5.x/site/en/integrations/integrate_with_bentoml.md": "2025-01-14T08:49:06.033Z", + "v2.5.x/site/en/integrations/integrate_with_camel.md": "2025-01-14T08:49:07.823Z", + "v2.5.x/site/en/integrations/integrate_with_cohere.md": "2025-01-14T08:49:09.290Z", + "v2.5.x/site/en/integrations/integrate_with_dspy.md": "2025-01-14T08:49:11.275Z", + "v2.5.x/site/en/integrations/integrate_with_fastgpt.md": "2025-01-14T08:49:12.766Z", + "v2.5.x/site/en/integrations/integrate_with_haystack.md": "2025-01-14T08:49:14.335Z", + "v2.5.x/site/en/integrations/integrate_with_hugging-face.md": "2025-01-14T08:49:15.912Z", + "v2.5.x/site/en/integrations/integrate_with_jina.md": "2025-01-14T08:49:17.575Z", + "v2.5.x/site/en/integrations/integrate_with_langfuse.md": "2025-01-14T08:49:19.096Z", + "v2.5.x/site/en/integrations/integrate_with_llamaindex.md": "2025-01-14T08:49:20.627Z", + "v2.5.x/site/en/integrations/integrate_with_memgpt.md": "2025-01-14T08:49:21.968Z", + "v2.5.x/site/en/integrations/integrate_with_openai.md": "2025-01-14T08:49:23.251Z", + "v2.5.x/site/en/integrations/integrate_with_pytorch.md": "2025-01-14T08:49:24.826Z", + "v2.5.x/site/en/integrations/integrate_with_ragas.md": "2025-01-14T08:49:26.615Z", + "v2.5.x/site/en/integrations/integrate_with_sentencetransformers.md": "2025-01-14T08:49:28.029Z", + "v2.5.x/site/en/integrations/integrate_with_snowpark.md": "2025-01-14T08:49:29.949Z", + "v2.5.x/site/en/integrations/integrate_with_spark.md": "2025-01-14T08:49:32.712Z", + "v2.5.x/site/en/integrations/integrate_with_vanna.md": "2025-01-14T08:49:34.459Z", + "v2.5.x/site/en/integrations/integrate_with_voxel51.md": "2025-01-14T08:49:36.527Z", + "v2.5.x/site/en/integrations/integrate_with_voyageai.md": "2025-01-14T08:49:37.837Z", + "v2.5.x/site/en/integrations/integrate_with_whyhow.md": "2025-01-14T08:49:39.573Z", + "v2.5.x/site/en/integrations/integrations_overview.md": "2025-01-14T08:49:41.317Z", + "v2.5.x/site/en/integrations/kafka-connect-milvus.md": "2025-01-14T08:49:42.695Z", + "v2.5.x/site/en/integrations/knowledge_table_with_milvus.md": "2025-01-14T08:49:44.257Z", + "v2.5.x/site/en/integrations/kotaemon_with_milvus.md": "2025-01-14T08:49:45.699Z", + "v2.5.x/site/en/integrations/langchain/basic_usage_langchain.md": "2025-01-14T08:49:47.368Z", + "v2.5.x/site/en/integrations/langchain/integrate_with_langchain.md": "2025-01-14T08:49:48.955Z", + "v2.5.x/site/en/integrations/langchain/milvus_hybrid_search_retriever.md": "2025-01-14T08:49:50.423Z", + "v2.5.x/site/en/integrations/llama_agents_metadata.md": "2025-01-14T08:49:53.729Z", + "v2.5.x/site/en/integrations/milvus_rag_with_dynamiq.md": "2025-01-14T08:50:16.731Z", + "v2.5.x/site/en/integrations/milvus_rag_with_vllm.md": "2025-01-14T08:50:18.297Z", + "v2.5.x/site/en/integrations/quickstart_mem0_with_milvus.md": "2025-01-14T08:50:19.609Z", + "v2.5.x/site/en/integrations/rag_with_langflow.md": "2025-01-14T08:50:20.940Z", + "v2.5.x/site/en/integrations/rag_with_milvus_and_unstructured.md": "2025-01-14T08:50:22.036Z", + "v2.5.x/site/en/integrations/use_milvus_in_docsgpt.md": "2025-01-14T08:50:23.012Z", + "v2.5.x/site/en/integrations/use_milvus_in_private_gpt.md": "2025-01-14T08:50:24.428Z", + "v2.5.x/site/en/integrations/use_milvus_with_sambanova.md": "2025-01-14T08:50:25.757Z", + "v2.5.x/site/en/integrations/video_search_with_twelvelabs_and_milvus.md": "2025-01-14T08:50:27.310Z", + "v2.5.x/site/en/migrate/es2m.md": "2025-01-14T08:50:28.786Z", + "v2.5.x/site/en/migrate/f2m.md": "2025-01-14T08:50:29.932Z", + "v2.5.x/site/en/migrate/from-m2x.md": "2025-01-14T08:50:31.049Z", + "v2.5.x/site/en/migrate/m2m.md": "2025-01-14T08:50:32.455Z", + "v2.5.x/site/en/migrate/migrate_overview.md": "2025-01-14T08:50:33.597Z", + "v2.5.x/site/en/migrate/milvusdm_install.md": "2025-01-14T08:50:34.567Z", + "v2.5.x/site/en/reference/architecture/architecture_overview.md": "2025-01-14T08:50:35.664Z", + "v2.5.x/site/en/reference/architecture/data_processing.md": "2025-01-14T08:50:36.930Z", + "v2.5.x/site/en/reference/architecture/four_layers.md": "2025-01-14T08:50:38.223Z", + "v2.5.x/site/en/reference/architecture/main_components.md": "2025-01-14T08:50:39.271Z", + "v2.5.x/site/en/reference/benchmark.md": "2025-01-14T08:50:40.854Z", + "v2.5.x/site/en/reference/bitset.md": "2025-01-14T08:50:42.147Z", + "v2.5.x/site/en/reference/coordinator_ha.md": "2025-01-14T08:50:43.372Z", + "v2.5.x/site/en/reference/disk_index.md": "2025-01-14T08:50:44.550Z", + "v2.5.x/site/en/reference/glossary.md": "2025-01-14T08:50:47.141Z", + "v2.5.x/site/en/reference/gpu_index.md": "2025-01-14T08:50:48.808Z", + "v2.5.x/site/en/reference/index.md": "2025-01-14T08:50:52.239Z", + "v2.5.x/site/en/reference/knowhere.md": "2025-01-14T08:50:53.824Z", + "v2.5.x/site/en/reference/multi_tenancy.md": "2025-01-14T08:50:55.113Z", + "v2.5.x/site/en/reference/replica.md": "2025-01-14T08:50:56.412Z", + "v2.5.x/site/en/reference/scalar_index.md": "2025-01-14T08:50:57.830Z", + "v2.5.x/site/en/reference/schema.md": "2025-01-14T08:50:59.196Z", + "v2.5.x/site/en/reference/sys_config/configure_common.md": "2025-01-14T08:51:00.762Z", + "v2.5.x/site/en/reference/sys_config/configure_datacoord.md": "2025-01-14T08:51:04.671Z", + "v2.5.x/site/en/reference/sys_config/configure_datanode.md": "2025-01-14T08:51:06.613Z", + "v2.5.x/site/en/reference/sys_config/configure_etcd.md": "2025-01-14T08:51:08.105Z", + "v2.5.x/site/en/reference/sys_config/configure_gpu.md": "2025-01-14T08:51:09.154Z", + "v2.5.x/site/en/reference/sys_config/configure_grpc.md": "2025-01-14T08:51:09.935Z", + "v2.5.x/site/en/reference/sys_config/configure_indexcoord.md": "2025-01-14T08:51:10.733Z", + "v2.5.x/site/en/reference/sys_config/configure_indexnode.md": "2025-01-14T08:51:11.985Z", + "v2.5.x/site/en/reference/sys_config/configure_localstorage.md": "2025-01-14T08:51:12.845Z", + "v2.5.x/site/en/reference/sys_config/configure_log.md": "2025-01-14T08:51:14.022Z", + "v2.5.x/site/en/reference/sys_config/configure_metastore.md": "2025-01-14T08:51:14.823Z", + "v2.5.x/site/en/reference/sys_config/configure_minio.md": "2025-01-14T08:51:16.546Z", + "v2.5.x/site/en/reference/sys_config/configure_mq.md": "2025-01-14T08:51:17.672Z", + "v2.5.x/site/en/reference/sys_config/configure_msgchannel.md": "2025-01-14T08:51:19.122Z", + "v2.5.x/site/en/reference/sys_config/configure_natsmq.md": "2025-01-14T08:51:20.237Z", + "v2.5.x/site/en/reference/sys_config/configure_proxy.md": "2025-01-14T08:51:22.137Z", + "v2.5.x/site/en/reference/sys_config/configure_pulsar.md": "2025-01-14T08:51:23.308Z", + "v2.5.x/site/en/reference/sys_config/configure_querycoord.md": "2025-01-14T08:51:25.458Z", + "v2.5.x/site/en/reference/sys_config/configure_querynode.md": "2025-01-14T08:51:27.589Z", + "v2.5.x/site/en/reference/sys_config/configure_quotaandlimits.md": "2025-01-14T08:51:31.391Z", + "v2.5.x/site/en/reference/sys_config/configure_rocksmq.md": "2025-01-14T08:51:32.432Z", + "v2.5.x/site/en/reference/sys_config/configure_rootcoord.md": "2025-01-14T08:51:33.644Z", + "v2.5.x/site/en/reference/sys_config/configure_tikv.md": "2025-01-14T08:51:34.841Z", + "v2.5.x/site/en/reference/sys_config/configure_tls.md": "2025-01-14T08:51:35.692Z", + "v2.5.x/site/en/reference/sys_config/configure_trace.md": "2025-01-14T08:51:36.791Z", + "v2.5.x/site/en/reference/sys_config/system_configuration.md": "2025-01-14T08:51:38.150Z", + "v2.5.x/site/en/reference/time_sync.md": "2025-01-14T08:51:39.563Z", + "v2.5.x/site/en/reference/timestamp.md": "2025-01-14T08:51:41.016Z", + "v2.5.x/site/en/release_notes.md": "2025-01-14T08:51:43.061Z", + "v2.5.x/site/en/rerankers/rerankers-bge.md": "2025-01-14T08:51:44.030Z", + "v2.5.x/site/en/rerankers/rerankers-cohere.md": "2025-01-14T08:51:45.016Z", + "v2.5.x/site/en/rerankers/rerankers-cross-encoder.md": "2025-01-14T08:51:46.013Z", + "v2.5.x/site/en/rerankers/rerankers-jina.md": "2025-01-14T08:51:47.116Z", + "v2.5.x/site/en/rerankers/rerankers-overview.md": "2025-01-14T08:51:48.644Z", + "v2.5.x/site/en/rerankers/rerankers-voyage.md": "2025-01-14T08:51:49.642Z", + "v2.5.x/site/en/tutorials/audio_similarity_search.md": "2025-01-14T08:51:50.585Z", + "v2.5.x/site/en/tutorials/build-rag-with-milvus.md": "2025-01-14T08:51:52.039Z", + "v2.5.x/site/en/tutorials/contextual_retrieval_with_milvus.md": "2025-01-14T08:51:54.392Z", + "v2.5.x/site/en/tutorials/dna_sequence_classification.md": "2025-01-14T08:51:55.286Z", + "v2.5.x/site/en/tutorials/full_text_search_with_milvus.md": "2025-01-14T08:51:56.510Z", + "v2.5.x/site/en/tutorials/funnel_search_with_matryoshka.md": "2025-01-14T08:51:59.024Z", + "v2.5.x/site/en/tutorials/graph_rag_with_milvus.md": "2025-01-14T08:52:01.065Z", + "v2.5.x/site/en/tutorials/hdbscan_clustering_with_milvus.md": "2025-01-14T08:52:02.879Z", + "v2.5.x/site/en/tutorials/how_to_enhance_your_rag.md": "2025-01-14T08:52:05.298Z", + "v2.5.x/site/en/tutorials/hybrid_search_with_milvus.md": "2025-01-14T08:52:06.934Z", + "v2.5.x/site/en/tutorials/image_deduplication_system.md": "2025-01-14T08:52:07.922Z", + "v2.5.x/site/en/tutorials/image_similarity_search.md": "2025-01-14T08:52:09.484Z", + "v2.5.x/site/en/tutorials/movie_recommendation_with_milvus.md": "2025-01-14T08:52:11.024Z", + "v2.5.x/site/en/tutorials/multimodal_rag_with_milvus.md": "2025-01-14T08:52:12.487Z", + "v2.5.x/site/en/tutorials/question_answering_system.md": "2025-01-14T08:52:13.683Z", + "v2.5.x/site/en/tutorials/quickstart_with_attu.md": "2025-01-14T08:52:15.291Z", + "v2.5.x/site/en/tutorials/recommendation_system.md": "2025-01-14T08:52:16.268Z", + "v2.5.x/site/en/tutorials/text_image_search.md": "2025-01-14T08:52:17.321Z", + "v2.5.x/site/en/tutorials/text_search_engine.md": "2025-01-14T08:52:43.060Z", + "v2.5.x/site/en/tutorials/tutorials-overview.md": "2025-01-14T08:52:44.102Z", + "v2.5.x/site/en/tutorials/use-async-milvus-client-with-asyncio.md": "2025-01-14T08:52:45.726Z", + "v2.5.x/site/en/tutorials/use_ColPali_with_milvus.md": "2025-01-14T08:52:47.055Z", + "v2.5.x/site/en/tutorials/vector_visualization.md": "2025-01-14T08:52:48.450Z", + "v2.5.x/site/en/tutorials/video_similarity_search.md": "2025-01-14T08:52:49.310Z", + "v2.5.x/site/en/userGuide/collections/create-collection-instantly.md": "2025-01-14T08:52:50.346Z", + "v2.5.x/site/en/userGuide/collections/create-collection.md": "2025-01-14T08:52:51.714Z", + "v2.5.x/site/en/userGuide/collections/drop-collection.md": "2025-01-14T08:52:52.466Z", + "v2.5.x/site/en/userGuide/collections/load-and-release.md": "2025-01-14T08:52:53.495Z", + "v2.5.x/site/en/userGuide/collections/manage-aliases.md": "2025-01-14T08:52:54.537Z", + "v2.5.x/site/en/userGuide/collections/manage-collections.md": "2025-01-14T08:52:55.797Z", + "v2.5.x/site/en/userGuide/collections/manage-partitions.md": "2025-01-14T08:52:56.980Z", + "v2.5.x/site/en/userGuide/collections/modify-collection.md": "2025-01-14T08:52:57.856Z", + "v2.5.x/site/en/userGuide/collections/view-collections.md": "2025-01-14T08:52:58.732Z", + "v2.5.x/site/en/userGuide/data-import/import-data.md": "2025-01-14T08:53:00.073Z", + "v2.5.x/site/en/userGuide/data-import/prepare-source-data.md": "2025-01-14T08:53:01.712Z", + "v2.5.x/site/en/userGuide/insert-and-delete/delete-entities.md": "2025-01-14T08:53:02.638Z", + "v2.5.x/site/en/userGuide/insert-and-delete/insert-update-delete.md": "2025-01-14T08:53:03.860Z", + "v2.5.x/site/en/userGuide/insert-and-delete/upsert-entities.md": "2025-01-14T08:53:05.046Z", + "v2.5.x/site/en/userGuide/manage-indexes/bitmap.md": "2025-01-14T08:53:06.121Z", + "v2.5.x/site/en/userGuide/manage-indexes/index-scalar-fields.md": "2025-01-14T08:53:08.268Z", + "v2.5.x/site/en/userGuide/manage-indexes/index-vector-fields.md": "2025-01-14T08:53:10.318Z", + "v2.5.x/site/en/userGuide/manage-indexes/index-with-gpu.md": "2025-01-14T08:53:12.214Z", + "v2.5.x/site/en/userGuide/manage_databases.md": "2025-01-14T08:53:13.784Z", + "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/chinese-analyzer.md": "2025-01-14T08:53:14.699Z", + "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/english-analyzer.md": "2025-01-14T08:53:15.917Z", + "v2.5.x/site/en/userGuide/schema/analyzer/analyzer/standard-analyzer.md": "2025-01-14T08:53:16.979Z", + "v2.5.x/site/en/userGuide/schema/analyzer/analyzer-overview.md": "2025-01-14T08:53:19.183Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/alphanumonly-filter.md": "2025-01-14T08:53:20.221Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/ascii-folding-filter.md": "2025-01-14T08:53:21.268Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/cnalphanumonly-filter.md": "2025-01-14T08:53:22.579Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/cncharonly-filter.md": "2025-01-14T08:53:23.607Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/decompounder-filter.md": "2025-01-14T08:53:24.626Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/length-filter.md": "2025-01-14T08:53:25.664Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/lowercase-filter.md": "2025-01-14T08:53:26.609Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/stemmer-filter.md": "2025-01-14T08:53:27.723Z", + "v2.5.x/site/en/userGuide/schema/analyzer/filter/stop-filter.md": "2025-01-14T08:53:28.691Z", + "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/jieba-tokenizer.md": "2025-01-14T08:53:29.671Z", + "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/standard-tokenizer.md": "2025-01-14T08:53:30.708Z", + "v2.5.x/site/en/userGuide/schema/analyzer/tokenizer/whitespace-tokenizer.md": "2025-01-14T08:53:31.747Z", + "v2.5.x/site/en/userGuide/schema/array_data_type.md": "2025-01-14T08:53:33.541Z", + "v2.5.x/site/en/userGuide/schema/binary-vector.md": "2025-01-14T08:53:35.608Z", + "v2.5.x/site/en/userGuide/schema/dense-vector.md": "2025-01-14T08:53:37.580Z", + "v2.5.x/site/en/userGuide/schema/enable-dynamic-field.md": "2025-01-14T08:53:38.988Z", + "v2.5.x/site/en/userGuide/schema/nullable-and-default.md": "2025-01-14T08:53:41.205Z", + "v2.5.x/site/en/userGuide/schema/number.md": "2025-01-14T08:53:42.964Z", + "v2.5.x/site/en/userGuide/schema/primary-field.md": "2025-01-14T08:53:44.337Z", + "v2.5.x/site/en/userGuide/schema/schema-hands-on.md": "2025-01-14T08:53:46.868Z", + "v2.5.x/site/en/userGuide/schema/schema.md": "2025-01-14T08:53:48.616Z", + "v2.5.x/site/en/userGuide/schema/sparse_vector.md": "2025-01-14T08:53:50.922Z", + "v2.5.x/site/en/userGuide/schema/string.md": "2025-01-14T08:53:52.858Z", + "v2.5.x/site/en/userGuide/schema/use-json-fields.md": "2025-01-14T08:53:54.519Z", + "v2.5.x/site/en/userGuide/search-query-get/boolean/array-operators.md": "2025-01-14T08:53:55.876Z", + "v2.5.x/site/en/userGuide/search-query-get/boolean/basic-operators.md": "2025-01-14T08:53:57.641Z", + "v2.5.x/site/en/userGuide/search-query-get/boolean/boolean.md": "2025-01-14T08:53:59.571Z", + "v2.5.x/site/en/userGuide/search-query-get/boolean/filtering-templating.md": "2025-01-14T08:54:01.139Z", + "v2.5.x/site/en/userGuide/search-query-get/boolean/json-operators.md": "2025-01-14T08:54:02.844Z", + "v2.5.x/site/en/userGuide/search-query-get/clustering-compaction.md": "2025-01-14T08:54:04.792Z", + "v2.5.x/site/en/userGuide/search-query-get/consistency.md": "2025-01-14T08:54:06.361Z", + "v2.5.x/site/en/userGuide/search-query-get/filtered-search.md": "2025-01-14T08:54:07.931Z", + "v2.5.x/site/en/userGuide/search-query-get/full-text-search.md": "2025-01-14T08:54:10.431Z", + "v2.5.x/site/en/userGuide/search-query-get/get-and-scalar-query.md": "2025-01-14T08:54:12.163Z", + "v2.5.x/site/en/userGuide/search-query-get/grouping-search.md": "2025-01-14T08:54:13.855Z", + "v2.5.x/site/en/userGuide/search-query-get/keyword-match.md": "2025-01-14T08:54:15.921Z", + "v2.5.x/site/en/userGuide/search-query-get/metric.md": "2025-01-14T08:54:17.904Z", + "v2.5.x/site/en/userGuide/search-query-get/mmap.md": "2025-01-14T08:54:19.745Z", + "v2.5.x/site/en/userGuide/search-query-get/multi-vector-search.md": "2025-01-14T08:54:21.711Z", + "v2.5.x/site/en/userGuide/search-query-get/range-search.md": "2025-01-14T08:54:23.432Z", + "v2.5.x/site/en/userGuide/search-query-get/reranking.md": "2025-01-14T08:54:24.788Z", + "v2.5.x/site/en/userGuide/search-query-get/single-vector-search.md": "2025-01-14T08:54:27.118Z", + "v2.5.x/site/en/userGuide/search-query-get/use-partition-key.md": "2025-01-14T08:54:28.376Z", + "v2.5.x/site/en/userGuide/search-query-get/with-iterators.md": "2025-01-14T08:54:29.579Z", + "v2.5.x/site/en/userGuide/tools/birdwatcher_install_guides.md": "2025-01-14T08:54:30.585Z", + "v2.5.x/site/en/userGuide/tools/birdwatcher_overview.md": "2025-01-14T08:54:31.580Z", + "v2.5.x/site/en/userGuide/tools/birdwatcher_usage_guides.md": "2025-01-14T08:54:33.307Z", + "v2.5.x/site/en/userGuide/tools/cli_commands.md": "2025-01-14T08:54:38.185Z", + "v2.5.x/site/en/userGuide/tools/cli_overview.md": "2025-01-14T08:54:39.446Z", + "v2.5.x/site/en/userGuide/tools/install_cli.md": "2025-01-14T08:54:40.524Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/cross-bucket-backup-and-restore.md": "2025-01-14T08:54:41.847Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/multi-storage-backup-and-restore.md": "2025-01-14T08:54:43.332Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/shared-bucket-backup-and-restore.md": "2025-01-14T08:54:44.715Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/common-cases/single-instance-backup-and-restore.md": "2025-01-14T08:54:45.858Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_api.md": "2025-01-14T08:54:47.594Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_cli.md": "2025-01-14T08:54:48.905Z", + "v2.5.x/site/en/userGuide/tools/milvus-backup/milvus_backup_overview.md": "2025-01-14T08:54:50.038Z", + "v2.5.x/site/en/userGuide/tools/milvus-cdc/cdc-monitoring.md": "2025-01-14T08:54:51.157Z", + "v2.5.x/site/en/userGuide/tools/milvus-cdc/deploy-cdc-server.md": "2025-01-14T08:54:52.538Z", + "v2.5.x/site/en/userGuide/tools/milvus-cdc/manage-cdc-tasks.md": "2025-01-14T08:54:54.304Z", + "v2.5.x/site/en/userGuide/tools/milvus-cdc/milvus-cdc-overview.md": "2025-01-14T08:54:55.617Z", + "v2.5.x/site/en/userGuide/tools/milvus-webui.md": "2025-01-14T08:54:57.399Z" } } \ No newline at end of file diff --git a/tools/translate.js b/tools/translate.js index 6e683c4ab..c45dbac00 100644 --- a/tools/translate.js +++ b/tools/translate.js @@ -9,16 +9,16 @@ import fs from "fs"; import matter from "gray-matter"; import "dotenv/config"; import { - traverseDirectory, - translate, - mkdir, - remarkableToHtml, - extractText, - generateMenuStructureLocales, - CACHE_FILE, - getFileUpdatedTime, - splitAndExtractPreTags, - getTitleFromMarkdown, + traverseDirectory, + translate, + mkdir, + remarkableToHtml, + extractText, + generateMenuStructureLocales, + CACHE_FILE, + getFileUpdatedTime, + splitAndExtractPreTags, + getTitleFromMarkdown, } from "./utils.js"; import { remarkToHtml } from "./remark.js"; @@ -26,187 +26,207 @@ const MOCK_TRANSLATE = false; const VERSIONS = ["v2.5.x", "v2.4.x"]; const sourceFilePath = "site/en"; const sourceLang = "en"; -const targetLangs = ["zh", "ja", "ko", "fr", "de", "it", "pt", "es"]; +const targetLangs = [ + "zh", + "zh-hant", + "ja", + "ko", + "fr", + "de", + "it", + "pt", + "es", + "ru", + "id", + "ar", +]; const cacheFile = CACHE_FILE; let total = 0; const SPLIT_TRANSLATE_FILES = [ - "v2.5.x/site/en/userGuide/manage-collections.md", - "v2.5.x/site/en/userGuide/search-query-get/single-vector-search.md", - "v2.5.x/site/en/userGuide/use-json-fields.md", - "v2.5.x/site/en/reference/array_data_type.md", + "v2.5.x/site/en/userGuide/manage-collections.md", + "v2.5.x/site/en/userGuide/search-query-get/single-vector-search.md", + "v2.5.x/site/en/userGuide/use-json-fields.md", + "v2.5.x/site/en/reference/array_data_type.md", + "v2.4.x/site/en/userGuide/manage-collections.md", + "v2.4.x/site/en/userGuide/search-query-get/single-vector-search.md", + "v2.4.x/site/en/userGuide/use-json-fields.md", + "v2.4.x/site/en/reference/array_data_type.md", ]; async function bootstrap() { - console.log("Starting translation...", process.env.DEEPL_API_KEY); - /** - * step 1: read cache file - */ - const cache = fs.existsSync(cacheFile) - ? JSON.parse(fs.readFileSync(cacheFile, "utf8") || "{}") - : {}; - - for (let version of VERSIONS) { - /** - * step 2: get all md files by version - */ - const sourceDirectory = `${version}/${sourceFilePath}`; - const mdFiles = traverseDirectory(sourceDirectory); - - console.log(`--> Found ${mdFiles.length} files...`); - - /** - * step 3: filter out updated files - */ - let updatedFiles = []; - for (let index = 0; index < mdFiles.length; index++) { - const path = mdFiles[index]; - const modifiedTime = await getFileUpdatedTime(path); - - console.info(`--> cache check: ${index + 1}/${mdFiles.length}`); - - const markdown = fs.readFileSync(path, "utf8"); - const { data = {} } = matter(markdown); - const deprecated = data.deprecate; - const cacheOutdated = - !cache[version] || - !cache[version][path] || - new Date(cache[version][path]) < new Date(modifiedTime); - if (!deprecated && cacheOutdated) { - updatedFiles.push(path); - } - } - console.log(`--> ${updatedFiles.length} updated files`); - - for (let path of updatedFiles) { - /** - * step 4: read & handle file content - */ - const markdown = fs.readFileSync(path, "utf8"); - const { data = {}, content } = matter(markdown); - const isMdx = path.endsWith(".mdx"); - const h1Title = getTitleFromMarkdown(content); - const isSameTitle = h1Title === data.title; - - for (let targetLang of targetLangs) { - /** - * step 5: convert md or mdx to html - */ - const params = { content, lang: targetLang, version }; - const { - html: htmlContent, - codeList, - headingContent, - anchorList, - } = isMdx ? await remarkToHtml(params) : await remarkableToHtml(params); - - /** - * step 6.1: split and translate specific files - */ - const neededSplit = SPLIT_TRANSLATE_FILES.includes(path); - const { matches, htmlArray } = neededSplit - ? splitAndExtractPreTags(htmlContent) - : { matches: [], htmlArray: [] }; - - /** - * step 6.2: translate html content - */ - const translateRes = await translate({ - text: neededSplit ? htmlArray : htmlContent, - targetLang: targetLang.toUpperCase(), - mock: MOCK_TRANSLATE, - }); - - let translateContent = - typeof translateRes === "string" - ? translateRes - : translateRes.reduce((acc, cur, index) => { - const match = matches[index - 1]; - if (match) { - return acc + match + cur; - } - return acc + cur; - }, ""); - - /** - * step 6.3: replace anchor label - */ - if (anchorList.length > 0) { - const anchorIds = anchorList.map((anchor) => anchor.href); - anchorIds.forEach((id, index) => { - const text = extractText(id, translateContent); - anchorList[index].label = text; - }); - } - - /** - * step 6.4:translate title and summary - */ - const cloneData = { ...data }; - if (data.title || data.summary) { - const [title, summary] = await translate({ - text: [data.title || "", data.summary || ""], - targetLang: targetLang.toUpperCase(), - mock: MOCK_TRANSLATE, - }); - if (title) { - const translatedMdTitle = anchorList?.[0]?.label || title; - cloneData.title = !isSameTitle ? title : translatedMdTitle; - } - if (summary) { - cloneData.summary = summary; - } - } - - /** - * step 7: format content - */ - const cleanedHtmlContent = translateContent.replace(/{" "}/g, ""); // Remove {" "} - const wholeContent = matter.stringify(cleanedHtmlContent, cloneData); - - /** - * step 8: write to md file and json file - */ - const targetFilePath = - "localization/" + path.replace(sourceLang, `${targetLang}`); - mkdir(targetFilePath); - fs.writeFileSync(targetFilePath, wholeContent, "utf8"); - fs.writeFileSync( - targetFilePath.replace(".md", ".json"), - JSON.stringify({ codeList, headingContent, anchorList }), - "utf8" - ); - console.info( - `-> ${targetLang.toUpperCase()}: file translated successfully:`, - targetFilePath - ); - total++; - } - - if (!cache[version]) { - cache[version] = {}; - } - - /** - * step 9: update cache - */ - cache[version][path] = new Date().toISOString(); - } - } - - /** - * step 10: write cache file - */ - fs.writeFileSync(cacheFile, JSON.stringify(cache, null, 2), "utf8"); - console.log("--> Cache updated successfully"); - console.log("--> Total files:", total); - - /** - * step 11: translate menu structure - */ - generateMenuStructureLocales({ - versions: VERSIONS, - targetLangs, - }); + console.log("Starting translation...", process.env.DEEPL_API_KEY); + /** + * step 1: read cache file + */ + const cache = fs.existsSync(cacheFile) + ? JSON.parse(fs.readFileSync(cacheFile, "utf8") || "{}") + : {}; + + for (let version of VERSIONS) { + /** + * step 2: get all md files by version + */ + const sourceDirectory = `${version}/${sourceFilePath}`; + const mdFiles = traverseDirectory(sourceDirectory); + + console.log(`--> Found ${mdFiles.length} files...`); + + /** + * step 3: filter out updated files + */ + let updatedFiles = []; + for (let index = 0; index < mdFiles.length; index++) { + const path = mdFiles[index]; + const modifiedTime = await getFileUpdatedTime(path); + + console.info(`--> cache check: ${index + 1}/${mdFiles.length}`); + + const markdown = fs.readFileSync(path, "utf8"); + const { data = {} } = matter(markdown); + const deprecated = data.deprecate; + const cacheOutdated = + !cache[version] || + !cache[version][path] || + new Date(cache[version][path]) < new Date(modifiedTime); + if (!deprecated && cacheOutdated) { + updatedFiles.push(path); + } + } + console.log(`--> ${updatedFiles.length} updated files`); + + for (let path of updatedFiles) { + /** + * step 4: read & handle file content + */ + const markdown = fs.readFileSync(path, "utf8"); + const { data = {}, content } = matter(markdown); + const isMdx = path.endsWith(".mdx"); + const h1Title = getTitleFromMarkdown(content); + const isSameTitle = h1Title === data.title; + + for (let targetLang of targetLangs) { + /** + * step 5: convert md or mdx to html + */ + const params = { content, lang: targetLang, version }; + const { + html: htmlContent, + codeList, + headingContent, + anchorList, + } = isMdx ? await remarkToHtml(params) : await remarkableToHtml(params); + + /** + * step 6.1: split and translate specific files + */ + const neededSplit = SPLIT_TRANSLATE_FILES.includes(path); + const { matches, htmlArray } = neededSplit + ? splitAndExtractPreTags(htmlContent) + : { matches: [], htmlArray: [] }; + + /** + * step 6.2: translate html content + */ + const translateRes = await translate({ + text: neededSplit ? htmlArray : htmlContent, + targetLang: targetLang.toUpperCase(), + mock: MOCK_TRANSLATE, + }); + + let translateContent = + typeof translateRes === "string" + ? translateRes + : translateRes.reduce((acc, cur, index) => { + const match = matches[index - 1]; + if (match) { + return acc + match + cur; + } + return acc + cur; + }, ""); + + /** + * step 6.3: replace anchor label + */ + if (anchorList.length > 0) { + const anchorIds = anchorList.map((anchor) => anchor.href); + anchorIds.forEach((id, index) => { + const text = extractText(id, translateContent); + anchorList[index].label = text; + }); + } + + /** + * step 6.4:translate title and summary + */ + const cloneData = { ...data }; + if (data.title || data.summary) { + const [title, summary] = await translate({ + text: [data.title || "", data.summary || ""], + targetLang: targetLang.toUpperCase(), + mock: MOCK_TRANSLATE, + }); + if (title) { + const translatedMdTitle = anchorList?.[0]?.label || title; + cloneData.title = !isSameTitle ? title : translatedMdTitle; + } + if (summary) { + cloneData.summary = summary; + } + } + + /** + * step 7: format content + */ + const cleanedHtmlContent = translateContent.replace(/{" "}/g, ""); // Remove {" "} + const wholeContent = matter.stringify(cleanedHtmlContent, cloneData); + + /** + * step 8: write to md file and json file + */ + const targetFilePath = + "localization/" + path.replace(sourceLang, `${targetLang}`); + mkdir(targetFilePath); + fs.writeFileSync(targetFilePath, wholeContent, "utf8"); + fs.writeFileSync( + targetFilePath.replace(".md", ".json"), + JSON.stringify({ codeList, headingContent, anchorList }), + "utf8" + ); + + total++; + + console.info( + `-> ${targetLang.toUpperCase()}: file translated successfully:`, + targetFilePath, + ` (${total}/${updatedFiles.length})` + ); + } + + if (!cache[version]) { + cache[version] = {}; + } + + /** + * step 9: update cache + */ + cache[version][path] = new Date().toISOString(); + } + } + + /** + * step 10: write cache file + */ + fs.writeFileSync(cacheFile, JSON.stringify(cache, null, 2), "utf8"); + console.log("--> Cache updated successfully"); + console.log("--> Total files:", total); + + /** + * step 11: translate menu structure + */ + generateMenuStructureLocales({ + versions: VERSIONS, + targetLangs, + }); } bootstrap(); diff --git a/tools/utils.js b/tools/utils.js index 960131a37..9b2dc3d09 100644 --- a/tools/utils.js +++ b/tools/utils.js @@ -212,7 +212,7 @@ export const generateMenuStructureLocales = async (params) => { console.log("Translating menu structure..."); for (let version of versions) { const sourceMenuPath = `${version}/site/en/menuStructure/en.json`; - const stats = fs.statSync(sourceMenuPath); + const modifiedTime = await getFileUpdatedTime(sourceMenuPath); const cache = useCache && fs.existsSync(CACHE_FILE) @@ -221,10 +221,11 @@ export const generateMenuStructureLocales = async (params) => { const cacheOutdated = useCache ? !cache[version] || !cache[version][sourceMenuPath] || - new Date(cache[version][sourceMenuPath]) < stats.mtime + new Date(cache[version][sourceMenuPath]) < new Date(modifiedTime) : true; if (!cacheOutdated) { + console.info("-> Skip: menu structure is up-to-date.") continue; }